太平洋战争

太平洋战争

第二次世界大战中以大日本帝国为首的轴心国 和 以美国为首的同盟国于1941年12月7日-1945年9月2日期间发生的战争,范围遍及太平洋、印度洋、东亚及东南亚地区。

太平洋战争

珍珠港


战争起因

1937年,日本为应付对中国的战争的需求,战略物资持续消耗,战况却陷入胶着,加上日本与一战协约国国家的关系已疏远,美、英等国为了调停中日战争,对日本实行经济制裁,断绝其重要战略物资的输入,前者提出恢复贸易的条件为自中国撤军。日本在发动全面战争与撤兵间选择了前者,并计划夺取东南亚的殖民地。

日军在侵华战争前两年战斗伤亡500000人,却未见胜利在望,日益消耗国家经济,抗日战争转入胶灼期。

抗日战争几个重要时间节点
  • 1931年9月18 九一八事变,东北沦陷,扶持伪满洲国
  • 1936年12月12 西安事变
  • 1937年7月7日 卢沟桥事变,中国抗日战争全面爆发
  • 1937年南京沦陷
  • 1941年12月7日 珍珠港事件
  • 1945年9月2日 日本宣布投降,二战结束
太平洋战争前英美的态度

1931年日本引起918事变之初,美英对日本出兵中国不加反对,一般认为美英是在指望日本北上进攻苏联。美国在不违反其中立政策下容许日本与中国在美国采购各类战略物资。英国则一再偏向日本,如,英法操纵国际联盟,拒绝对日经济制裁。

大东亚共荣圈


太平洋战争标志

1941年12月7日大日本帝国海军向美国太平洋上的海军基地珍珠港不宣而战,同时在西太平洋对马来西亚、新加坡、印尼、缅甸和菲律宾等地发动攻击。美国、英国和中华民国向日本宣战,而与日本同盟的欧洲轴心国纳粹德国与意大利亦向美国宣战,太平洋战争爆发,欧亚两大战场合流。
珍珠港事件-0
珍珠港事件-1
珍珠港事件-2
珍珠港事件-3


北进&南进

在对中国的战争中持续消耗物资的日本,为了打破僵局与获得战略资源,军部内分做两种派系:一派主张往满洲国北部的西伯利亚扩张,另一派则主张南下夺取东南亚的殖民地。

由于但在1939年日本与苏联在诺门罕一带发生哈拉欣河战役,日军被苏联军队所击溃,使得北进政策就此打住。1941年4月13日日本与苏联签订苏日中立条约。

南进政策的目标指向印度支那半岛、泰国、马来亚和印尼,这些地方有石油、橡胶、锡、镍、铝矿砂和米,开采设备也极为完整。同时军方也认为可借由反殖民宣传,令东南亚人民与日本合作。

随后日本势力一直在向东南亚扩张,激怒了当时已经在战火中的英国以及流亡的荷兰政府。为抑制日本扩张,美国于7月25日冻结日本在美资产,8月1日对“所有侵略国”实施石油禁运与经济制裁,英国与荷兰同时跟进。对于石油、钢铁、工具母机有70%从美国进口的日本来说,这政策极为致命,除非日本将军队撤出中南半岛与中国,否则日本国内储存的石油资源将会耗尽。日本不接受此条件,并称这三国和中国(America Britain China Dutch)为ABCD包围网。日本决定与英美荷等欧美国家开战,进攻东南亚争夺该地资源以维持国家自给自足的经济,并持续对中国的战争。


战争历程

  • 1941年12月8日,日本发动马来亚战役, 日军以较小代价迅速占领整个马来半岛以及新加坡
    日军占领吉隆坡

  • 1941年12月7日(美国时间),日本偷袭珍珠港
    原计划:相继攻下英美殖民地后,建立“绝对国防圈”,将美国前来救援的舰队以战舰一举消灭
    山本五十六:认为战舰的实用性已成过去,战场决胜武力应是航空母舰。且美国工业能力远胜日本,若持续消耗战日本必败。同时为了保证顺利取得南进资源,日本必须要在开战之初主动消灭盟国在远东的主力海军舰队
    山本五十六

日军攻势
  • 彻底瘫痪了美国太平洋舰队,以极小代价获得极大成功,短期内美国海军无法干涉日本在太平洋的行动
  • 攻占战略性岛屿
  • 空袭印度洋,将英国皇家海军彻底逐出太平洋
  • 袭撃美国西海岸

标志性战役

  • 杜立特空袭(空袭东京),作为对日军突袭珍珠港的报复。美国经由这次轰炸任务,证明盟军有能力对日本本土进行空中攻击
    B-25米切尔型轰炸机从大黄蜂号起飞
    B-25从大黄蜂号航母起飞
    杜立特

对日本造成的损失并不大,直接军事作用很小,但是战略意义却很大。它一方面振奋了美国人的士气,一方面促使日本海军将主要注意力从南方战线转移到威胁日本的中太平洋地区,在没有充分准备下仓促发动中途岛海战。空袭东京同时也造成了25万中国人死亡

  • 中途岛战役
    日本在1942年4月18日的杜立特空袭后,为了防范美军持续由侧翼直接攻击日本本土,日本海军大将山本五十六便积极策划对中途岛的攻占作战计划。由于日方的密码被美军破译成功,美军在日军进攻中途岛前就已作好准备。
    南云舰队损失4艘航空母舰,空中攻击力量完全丧失。此战役以美军胜利而告终,也因为日军损失过于巨大(四艘航空母舰、200架以上的舰载机以及训练有素的飞行员),让日军在短期内无法再发动大型的战役,美军得以获得宝贵的喘息时间,故中途岛战役在太平洋战争中具有极重要的地位。
    中途岛
    日军三隈号被击沉

  • 瓜岛争夺战
    美国海军陆战队在瓜达尔卡纳尔战役期间在野外休息

  • 东所罗门海战
    企业号
    于1942年8月24日的东所罗门战役中严重倾斜。其船尾右舷防空炮座遭到日军一枚炸弹击中,造成35人死亡

  • 塔拉瓦战役
    塔拉瓦战役

  • 东南亚战局
    中国远征军入缅作战
    中国的生命线——滇缅公路

麦克阿瑟领军的美菲军于1944年12月31日占领莱特岛,并随即展开吕宋岛的攻略作战,于1945年3月3日光复菲律宾首都马尼拉

  • 东京大轰炸和轰炸吴市
    1945年战争接近尾声,美国海军提出通过全面海上封锁和空袭以迫使日本投降
  • 中国反击,湘西会战和桂柳战役

  • 广岛、长崎原爆
    美国于8月6日在日本的广岛市和8月9日长崎市投放了两颗原子弹,而苏联随即在8月9日对日宣战,日本终于在8月15日宣布投降
    长崎核爆蘑菇云

日本最终于1945年8月15日投降,同年9月2日举行投降仪式,正式签定投降书,第二次世界大战结束
麦克阿瑟 & 裕仁天皇
李光辉-最后一名士兵
一直潜伏至1974年才向菲律宾警方投降。


国力对比

日本&美国 国力对比


推荐电影

  • 珍珠港
  • 风语者
  • 血战钢锯岭
  • 东京上空30秒
  • 硫磺岛血战

1.3以太坊智能合约

以太坊智能合约

比特币代表区块链1.0, 它构建了一个全新的数字货币发行及支付系统。以太坊则代表区块链2.0,基于以太坊的智能合约,几乎可以让所有数字化资产在链上流动起来。相较于比特币以太坊支持一个更强大的(图灵完备)脚本语言,允许开发者在上面开发任意去中心化应用,实现任意智能合约,这也是以太坊的最强大之处。作为平台,以太坊可以类比于苹果的应用商店,任何开发者都可以在上面开发应用,并出售给用户。

开发语言

开发以太坊智能合约的语言主要有以下几种

  • Serpent 语法类似于Python
  • Solidity 语法类似于JavaScript
  • Mutan 语法类似于Go
  • LLL 语法类似于Lisp

其中Solidity是开发以太坊智能合约的首选语言,也是官方支持力度最大更新最快的合约开发语言,本书讲解的也都是基于Solidity语言。Solidity目前还在持续开发中,最新版本为0.4.17。

运行机制

如果说普通交易是按照指定的模板来修改账本,例如账户A给账户B转账5 ether,那么对于账本的修改就是增加这条交易记录并更新交易双方的资产,这个变化是比较单一化、模式化的。而合约则更加灵活,可以按照指定的“套路”来修改账本,这里的“套路”即合约的代码逻辑,而代码逻辑是根据实际需求来灵活定制的。
当一条合约交易被广播后,矿工会在evm里执行这笔合约交易data字段的字节码。如果一切顺利矿工会将这笔交易添加到当前区块中, 最终成功打包该区块的矿工会将这个区块广播到全网,其它节点验证无误后将该区块添加到自身所维护的账本中。

搭建开发环境

工欲善其事,必先利其器。所以在学习合约开发之前,先把合约开的环境搭建好是非常必要的。普通记事本即可完成合约编写的工作,但是编译和部署相对比较麻烦,还是要选择一个工具,以下介绍几个常见的合约开发工具,读者可根据喜好来选择

编辑器

3、访问,访问的方式也可以有多种
a)本地资源访问,在浏览器中访问file:///home/xuhuan/browser-solidity-master/index.html(根据代码实际路径修改访问url)
b)执行 npm run serve 启动服务,再访问 http://localhost:8080/
c)添加浏览器扩展(推荐), chrome下打开chrome://extensions/, 勾选上 Developer Mode, 然后点击 Load unpacked extension, 再选择 browser-solidity-master 目录,点击应用图标即可快速启动IDE
remix_extension

4、vimer推荐安装vim-solidity插件 https://github.com/tomlion/vim-solidity
vim-solidity

交易

在解释智能合约的运行机制之前,先来了解下以太坊的交易。以太坊中所有的资产流动都是以一笔交易的形式来完成的,而交易的本质是对于账本的修改。从交易的形式来讲,可分为普通交易和合约交易, 其中合约交易可以再细分为 部署合约交易 和 调用合约方法交易。

以下是发起一笔交易所需要的几个参数
  • from, 交易的发起方
  • to, 交易的接收方
  • gas, 交易的gas数
  • gasPrice, gas的价格
  • value, 交易金额
  • data, 普通交易的附加数据,或者合约交易的字节码
  • nonce, 随机数,对于每个地址的交易nonce是递增的,可以使用相同的nonce覆盖交易池(tx pool)中相同nonce的交易
下面来具体探讨一下这几种交易
  • 普通交易,这是最为常见的交易,例如A账户给B账户转发5 ether。from即发起方地址,这个地址需要支付这5eth和该笔交易所需要的gas; to接收方地址,普通交易中不可省略; data 普通交易中,它是一个附加数据,可缺省,如果data不为空,那么随着这笔交易被打包,它将成为账本数据的一部分;

  • 部署合约交易,当开发完一个合约应用之后,接下来就需要对它进行编译、部署。部署的过程是将合约编译后的字节码写入区块链同时创建合约账户的过程, 所以它也是一笔交易。部署合约交易中,from是交易的发起地址,它需要支付这笔交易所需要的gas; to可缺省; value 待探索;data 合约编译之后的字节码。部署合约交易会新建一个合约账户,它会返回合约账户地址

  • 调用合约方法交易,并不是所有的调用合约方法的过程都是一笔交易,只有当它需要修改账本数据的时候才是一笔交易,关于调用合约方法的几种方式及区别在后面会有更详细的解释。

参数差异
交易类型 from to value data
普通交易 交易发起方,需要支付转账金额及交易所需要的gas 交易接收地址 交易金额,单位是wei 附加数据,可缺省
部署合约交易 交易发起方,需要支付交易所需要的gas 可缺省 ==待查证== 合约编译后的字节码 + 编码后的构造函数参数值,如无构造函数则只需编译后的字节码
调用合约方法交易 交易发起方,需要支付交易所需要的gas及可能的value 合约账户地址 如果方法有payable关键字,value为接受资产的数量,如无可缺省 方法选择器 + 方法参数 经编码后的字节码
小结

由上可见,普通交易和合约交易的参数是一样的,但是不同的交易参数值是不完全同的。其中gas、gasPrice、nonce以及合约交易中data字段的编码规范,我们将在后面的章节中更加深入的探讨

整理心情再出发

封闭开发总算是结束了,工作强度并未见少,回想起在火币的时候每天居然还能打两场乒乓球,简直是奢侈…不过这些都是选择到创业公司前就已经做好的准备,希望若干年后回想现在的忙碌都是有意义的!
我的球拍已经好久不见天日了

Read More

提交大文件导致.git/objects/pack目录很大解决办法

之前有同学不小心把编译后的二进制文件提交了,后面虽然已经删除,并把这些文件永久加入.gitignore文件,但是发现项目目录还是很大,du 之后发现,主要是 .git/objects/pack/目录比较大,记录下原因及解决办法

原因

提交大文件到git仓库后,它会被一直跟踪,虽然后续做了删除操作,但是历史记录仍然在,所以即使删除了(并提交)文件,.git目录下历史记录仍然会占有很大的空间

解决办法

感谢以下两篇文章作者

简要记下解决步骤

1、准备工作

  • 先clone一份,作为代码备份
  • 把远端分支都拉到本地(默认在master上),如果分支比较多可用如下脚本来完成
    1
    2
    3
    4
    #!/bin/bash
    for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
    git branch --track ${branch#remotes/origin/} $branch
    done

2、查找大文件列表,并把它写入到文件,可通过改 tail -5 查找前n大的文件,一般来说比较大的都是些编译后的可执行文件,或者log什么的

1
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}'" > large-files.txt

输出的文件里会有n行,格式类似如下

1
2
f846f156d16f74243b67e3dabec58a3128744352 build/bin/cli
……

3、处理一下,只取文件

1
cat large-files.txt| awk '{print $2}' | tr '\n' ' ' > large-files-inline.txt

4、删除所有大文件

1
git filter-branch -f --prune-empty --index-filter "git rm -rf --cached --ignore-unmatch `cat large-files-inline.txt`" --tag-name-filter cat -- --all

5、推到远端

1
git push origin --force --all

6、依次切到所有分支,然后执行上述 3、4 步骤,如果分支比较多,可以考虑写个脚本来自动处理

修改提交历史是个很危险的动作,所以尽量避免提交无用大文件

centos上gcc升级

centos 6.8上yum install安装gcc默认版本为4.4.7,太低

准备升级

  • 下载高点版本,我这里下载 4.9.2
  • 解压tar -xvf gcc-4.9.2.tar.gz
  • 加载依赖项 ./contrib/download_prerequisites
坑来了,天坑

终端上一直卡在下面这步

1
2
3
4
5
6
7
8
9
10
[root@localhost gcc-4.9.2]# ./contrib/download_prerequisites
--2016-11-22 00:50:42-- ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.12.2.tar.bz2
=> “isl-0.12.2.tar.bz2”
Resolving gcc.gnu.org... 209.132.180.131
Connecting to gcc.gnu.org|209.132.180.131|:21... connected.
Logging in as anonymous ... Logged in!
==> SYST ... done. ==> PWD ... done.
==> TYPE I ... done. ==> CWD (1) /pub/gcc/infrastructure ... done.
==> SIZE isl-0.12.2.tar.bz2 ... 1319434
==> PASV ...

这是因为ftp连接不上,需要的那些依赖项都下载不下来,vim ./contrib/download_prerequisites,文件部分内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Necessary to build GCC.
MPFR=mpfr-2.4.2
GMP=gmp-4.3.2
MPC=mpc-0.8.1
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/$MPFR.tar.bz2 || exit 1
tar xjf $MPFR.tar.bz2 || exit 1
ln -sf $MPFR mpfr || exit 1
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/$GMP.tar.bz2 || exit 1
tar xjf $GMP.tar.bz2 || exit 1
ln -sf $GMP gmp || exit 1
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/$MPC.tar.gz || exit 1
tar xzf $MPC.tar.gz || exit 1
ln -sf $MPC mpc || exit 1
# Necessary to build GCC with the Graphite loop optimizations.
if [ "$GRAPHITE_LOOP_OPT" = "yes" ] ; then
ISL=isl-0.12.2
CLOOG=cloog-0.18.1
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/$ISL.tar.bz2 || exit 1
tar xjf $ISL.tar.bz2 || exit 1
ln -sf $ISL isl || exit 1
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/$CLOOG.tar.gz || exit 1
tar xzf $CLOOG.tar.gz || exit 1
ln -sf $CLOOG cloog || exit 1
fi

  • 还好浏览器可以翻墙,笨办法,先用浏览器把需要下载的依赖项下载下来
    下载的时候注意变量替换,比如:
    ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-2.4.2.tar.bz2
  • 其它类似,都下载下来然后放到gcc-4.9.2目录下
  • 再把上述文件里面所有的wget命令都注释掉
  • 重新执行 ./contrib/download_prerequisites,问题解决了
  • 再执行 make(make的过程会很慢,等着吧), make install

打完收工