19 Dec 2016
$ docker-machine start default
$ eval "$(docker-machine env default)"
$ docker pull gcr.io/tensorflow/tensorflow
$ docker run --rm -it gcr.io/tensorflow/tensorflow python
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42
04 Dec 2016
时隔半年多没发表新博客了,最近一直在“前端”开发,主要是以JavaScript语言为主开发语言的前端开发,移动端使用Framework7 + React + Cordova实现iOS与Android的开发;最近移动端新版使用React Native“重构”,为啥是重构,得益于一开始选择使用React+Framework7开发,整个项目70%代码是可以直接在React Native上使用的。
下面就总结这半年多使用React用到的一些东西:
yarn
如果现在还在使用npm就有点”out”了,Facebook开发的node package管理工具。
$ yarn init # 代替npm init初始化项目
$ yarn add react # 代替npm install --save添加依赖
$ yarn add --dev babel-cli # 代替npm install --save-dev添加开发依赖
$ yarn # 代替npm install
babel
如果现在还在使用ES5语法开发就有点”out”了,能够把ES6、ES7转成ES5的工具;使用最新的JavaScript语言标准来开发,体验新标准带来的语法糖与便利。
export default class Api {
// 使用箭头函数
fetchList = () => this.api.get('posts');
}
// 使用import代替require
import Api from './api';
webpack
项目打包工具,可以结合babel实现ES6/7转码成ES5,还能实现代码热更新,SASS/LESS样式处理,图片资源处理等。
-
eslint
代码风格管理,统一团队代码风格很重要,使用eslint-config-airbnb。
-
react
当前最流行的WEB前端开发框架,由Facebook开源。
function TodoItem({ itemData }) {
return (
<div>
<p>{itemData.title}</p>
</div>
);
}
export default class TodoList extends Component {
render() {
return (
<div>
{this.props.todos.map(item => <TodoItem itemData={item} />)}
</div>
);
}
}
redux
结合react使用,通过Action改变Store,再由Store更新Component。
this.props.dispatch(fetchList());
04 Mar 2016
Android与MQTT实现双向认证。
需要的工具:
- bcprov-ext-jdk14-1.54.jar
- portecle-1.9
- UnlimitedJCEPolicyJDK8
生成ca.bks
完成对服务器的自签名单向认证
$ keytool -import \
-alias mqtt.broker \
-file ca.crt \
-keypass passw0rd \
-keystore ca.bks \
-storetype BKS \
-storepass passw0rd \
-providerClass org.bouncycastle.jce.provider.BouncyCastleProvider \
-providerpath bcprov-ext-jdk14-1.54.jar
MqttAndroidClient clint = ...
MqttConnectOptions options = new MqttConnectOptions();
InputStream input = this.getApplicationContext().getAssets().open("ca.bks");
options.setSocketFactory(client.getSSLSocketFactory(input, "passw0rd"));
生成client.bks
完成对客户端的认证,需要借portecle工具把pfx转成bks
$ openssl pkcs12 -export -inkey client.key -in client.crt -out client.pfx
$ java -jar portecle.jar
File -> New Keystore -> BKS-V1 -> Tools -> Import Key Pair -> choose -> client.pfx
如果提示错误就安装UnlimitedJCEPolicyJDK8
private SSLSocketFactory getSSLSocketFactory(Context context, String password) throws MqttSecurityException {
try {
InputStream keyStore = context.getResources().getAssets().open("client.bks");
KeyStore km = KeyStore.getInstance("BKS");
km.load(keyStore, password.toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
kmf.init(km, password.toCharArray());
InputStream trustStore = context.getResources().getAssets().open("ca.bks");
KeyStore ts = KeyStore.getInstance("BKS");
ts.load(trustStore, password.toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init(ts);
SSLContext ctx = SSLContext.getInstance("SSL");
ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
return ctx.getSocketFactory();
} catch (KeyStoreException | CertificateException | IOException | NoSuchAlgorithmException | KeyManagementException | UnrecoverableKeyException e) {
throw new MqttSecurityException(e);
}
}
options.setSocketFactory(getSSLSocketFactory(context, "passw0rd"));
参考:
- http://www.hivemq.com/blog/mqtt-client-library-enyclopedia-paho-android-service
- http://blog.csdn.net/hfeng101/article/details/10163627
- http://certificate.fyicenter.com/971_Portecle_PKCS_12_Export_Error_in_Portecle.html
04 Mar 2016
最近在搞一个MQTT的推送服务器,需要做客户端认证,双向认证。
首先是创建ca.crt
文件, 再创建server.crt
与client.crt
。
配置文件
listener 8883
cafile /mqtt/config/ca_certificates/ca.crt
certfile /mqtt/config/certs/server.crt
keyfile /mqtt/config/certs/server.key
require_certificate true
测试
$ mosquitto_sub -t \$SYS/broker/bytes/\# -v --cafile ca.crt -h localhost -p 8883 --cert client.crt --key client.key
下面讲讲在Nginx中怎么配置双向认证,平时我们用到的都是单向认证,配置也比较简单。
server {
# ...
ssl on;
ssl_certificate /etc/nginx/certs/server.crt;
ssl_certificate_key /etc/nginx/certs/server.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
# ...
}
server {
# ...
ssl_client_certificate /etc/nginx/certs/ca.crt;
ssl_verify_client on;
ssl_verify_depth 2;
location / {
if ($ssl_client_verify != SUCCESS) { return 403; }
proxy_pass http://blog.linguofeng.com;
}
}
$ http --verify=ca.crt --cert=client.pem HEAD https://localhost
参考:
http://rockingdlabs.dunmire.org/exercises-experiments/ssl-client-certs-to-secure-mqtt
https://gist.github.com/mtigas/952344
https://mosquitto.org/man/mosquitto-tls-7.html
21 Feb 2016
规划一下怎么把家里的服务器利用起来。
现在是有3台树莓派和一台HP Gen8服务器,首先要远程管理Gen8,最好的办法是先装一个Ubuntu系统,这样也方便家里的Chromebook连接管理。最后就通过该Ubuntu来管理家里所有的服务器了。
Gen8安装的是ESXi。
端口规划:
把80, 443, 2222端口转发至Ubuntu,22端口留作Git服务使用。
Ubuntu中安装Docker,创建HAProxy服务代理80与443端口的请求还有服务发现。
Ubuntu中安装Docker Machine管理ESXi上的boot2docker与raspberry pi。
最后的结构是
路由 -> 端口转发 -> Ubuntu -> HAProxy -> docker service