Hello TensorFlow

  • 启动Docker
$ docker-machine start default
$ eval "$(docker-machine env default)"
  • 下载TensorFlow容器
$ docker pull gcr.io/tensorflow/tensorflow
  • 启动TensorFlow容器并进入python
$ docker run --rm -it gcr.io/tensorflow/tensorflow python
  • Hello World
>>> 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

React开发栈

时隔半年多没发表新博客了,最近一直在“前端”开发,主要是以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样式处理,图片资源处理等。
  1. eslint 代码风格管理,统一团队代码风格很重要,使用eslint-config-airbnb。

  2. 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());
  • redux-saga 结合redux使用,通过监听Action处理任务,能够实现流程化,是一个很强大的库。

  • axios http请求库。

  • react-virtualized 解决列表太长的库,能够把列表项控制在一个数,提高效率。

android与mqtt双向SSL认证

Android与MQTT实现双向认证。

需要的工具:

  1. bcprov-ext-jdk14-1.54.jar
  2. portecle-1.9
  3. 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"));

参考:

  1. http://www.hivemq.com/blog/mqtt-client-library-enyclopedia-paho-android-service
  2. http://blog.csdn.net/hfeng101/article/details/10163627
  3. http://certificate.fyicenter.com/971PorteclePKCS12ExportErrorin_Portecle.html

ssl authentication

最近在搞一个MQTT的推送服务器,需要做客户端认证,双向认证。

首先是创建ca.crt文件, 再创建server.crtclient.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

something

规划一下怎么把家里的服务器利用起来。

现在是有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