Spring Boot application always hang at the following point

problem

2014-12-22 23:26:58.957  INFO 1 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]

solution

apt-get install haveged -y
nohup java -Djava.security.egd=file:/dev/./urandom -jar *.jar > /dev/null &

交集

1. 哈希查找

时间 O(n) 空间 O(m+n)

int ComNum_Hash(int a[],int lenA,int b[],int lenB,int *comlst)
{
    int hashTb[MAX_INT] = {0},i,j,k=0;

    for(i = 0; i < lenA; i++)
        hashTb[a[i]] = 1;

    for(j = 0; j < lenB; j++)
    {
        if(hashTb[b[j]] == 1)
            comlst[k++] = b[j];
    }

    return k;
}

Java 直接调用

  List<String> list1 = new ArrayList<String>();
   List<String> list2 = new ArrayList<String>();
   list1.add("g");
   list1.add("s");
   list1.add("a");
   list1.add("f");
   list2.add("g");
   list2.add("c");
   list2.add("b");
   list2.add("a");
   list1.retainAll(list2);

2. 二路归并

时间O(nlog2n) 空间O(n)

int count()
{
total=i=j=0;
while(i<n && j<n)
{
if(a[i]<b[j]) i++;
else if(a[i]>b[j])j++
else
    total++;
}
    return total;
}

Nginx 反向代理前后端分离 Cookie 路径重写

1. 场景

luiliuliu为 Java 项目,打包成 war 放置在 tomcat 运行,端口 9090;

Web 前端为 Vue 工程,SPA 一次加载页面资源,数据通过 vue-resource 向后端取数据,后端路径在开发环境已经映射为http://localhost/web/

如果简单使用反向代理,会导致后端设置的 cookie 路径多了一条luiliuliu,由于 cookie 的安全设置,不同来源前端请求是取不到这样的 cookie

2. 解决

location /web/ {
            proxy_pass   http://127.0.0.1:9090/luiliuliu/;
            proxy_cookie_path /phonecook/ /; # 重写路径

            proxy_set_header   Host    $host;
            proxy_set_header   Remote_Addr    $remote_addr;
            proxy_set_header   X-Real-IP    $remote_addr;
            proxy_set_header   X-Forwarded-For    $proxy_add_x_forwarded_for;
        }

去掉cookie的路径

Set-Cookie:JSESSIONID=13C147CE3B1105465BC5CED280EF364C; Path=/luiliuliu/; HttpOnly

变成

Set-Cookie:JSESSIONID=5B247D5F4DDC0CE2BE8458D0F1C037CA; admin=adminadmin

ESP8266 实现 Http 服务器控制 IO

ESP8266是一块由乐鑫espressif设计的wifi芯片,虽然它的定位是个Wi-Fi网络解决方案,但它更像一个物联网解决方案。它不仅体积小——大概11*10毫米左右,而且造价便宜,一个ESP8266的集成板只需要十几块。

ESP8266的核心是一块Diamond Standard 106Micro控制器,一个低功耗的32位RISC控制器。它拥有GPIO、I2C、ADC、SPI、PWM等模块,你可以用它做一些微控制器能做的事。它还可以支持AP(Access Point)、STA(Station)、AP+STA共存模式,并且使用高效的AT指令。

如同官方所示,它还具有下面的一些特性:

  • SDIO 2.0、SPI、UART 接口
  • 32-pin QFN 封装
  • 集成 RF 开关、 balun、LNA、 24 dBm PA 、DCXO 和 电源管理单元(PMU)
  • 集成 RISC 处理器、片上存储器和外部存储器接口
  • 集成 MAC/基带处理器
  • 高品质的服务管理
  • 高保真音频应用所需的 I2S 接口
  • 所有内部供电均包含片上低压差线性稳压器
  • 专有的无杂散时钟生成架构
  • 集成 WEP、 TKIP、AES 和 WAPI 引擎
  • 工作温度范围:-40C ~ 125C

因此可以用它来实现一些很有趣的东西,包括但不限于这里的 http 服务

NodeMCU

NodeMCU 是一个嵌入式固件,可以在上面运行 Lua 脚本程序进行连接网络,控制IO

引线

esp8266_pinout_h-569x236.png
主要用到 GPIO0 GPIO1 去驱动外部电路

固件烧录

参考教程 http://www.bigiot.net/talk/9.html

Lua Script

wifi.setmode(wifi.STATION)
wifi.sta.config("YOUR_NETWORK_NAME","YOUR_NETWORK_PASSWORD")
print(wifi.sta.getip())
led1 = 3
led2 = 4
gpio.mode(led1, gpio.OUTPUT)
gpio.mode(led2, gpio.OUTPUT)
srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
    conn:on("receive", function(client,request)
        local buf = "";
        local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
        if(method == nil)then
            _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
        end
        local _GET = {}
        if (vars ~= nil)then
            for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
                _GET[k] = v
            end
        end
        buf = buf.."<h1> ESP8266 Web Server</h1>";
        buf = buf.."<p>GPIO0 <a href=\"?pin=ON1\"><button>ON</button></a>&nbsp;<a href=\"?pin=OFF1\"><button>OFF</button></a></p>";
        buf = buf.."<p>GPIO2 <a href=\"?pin=ON2\"><button>ON</button></a>&nbsp;<a href=\"?pin=OFF2\"><button>OFF</button></a></p>";
        local _on,_off = "",""
        if(_GET.pin == "ON1")then
              gpio.write(led1, gpio.HIGH);
        elseif(_GET.pin == "OFF1")then
              gpio.write(led1, gpio.LOW);
        elseif(_GET.pin == "ON2")then
              gpio.write(led2, gpio.HIGH);
        elseif(_GET.pin == "OFF2")then
              gpio.write(led2, gpio.LOW);
        end
        client:send(buf);
        client:close();
        collectgarbage();
    end)
end)

上传脚本参考 http://blog.csdn.net/leytton/article/details/51723221

访问运行

在路由器上找到你的设备地址,例如访问 http://192.168.1.232

esp8266server.png

点击按钮即可控制接口输出!
参考链接 http://randomnerdtutorials.com/esp8266-web-server/

Ngrok 快速编译配置

0. 域名解析

dev.applehater.cn 解析A记录到服务器

*.dev.applehater.cn 解析A记录到服务器

不使用泛域名就只能指定若干固定域名,以下配置将会使用到域名

以下步骤均使用 root 权限执行

1. 安装 Go 环境

wget https://storage.googleapis.com/golang/go1.7.4.linux-amd64.tar.gz \
&& tar -xvf go1.7.4.linux-amd64.tar.gz -C /usr/local \
&& export GOROOT=/usr/local/go \
&& export PATH=$GOROOT/bin:$PATH
go version

2. 安装 Ngrok

创建目录

mkdir /opt/ngrok
cd /opt/ngrok
git clone https://github.com/inconshreveable/ngrok.git

生成密钥

cd ngrok
export NGROK_DOMAIN="dev.applehater.cn" #设置你的域名

一行执行

openssl genrsa -out base.key 2048 \
&& openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=$NGROK_DOMAIN" -out base.pem \
&& openssl genrsa -out server.key 2048 \
&& openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr \
&& openssl x509 -req -in server.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out server.crt \
&& cp base.pem assets/client/tls/ngrokroot.crt

编译

GOOS=linux GOARCH=amd64 make release-server \
&& GOOS=linux GOARCH=amd64 make release-client \
&& GOOS=windows GOARCH=amd64 make release-client \
&& GOOS=darwin GOARCH=amd64 make release-client

运行

nohup ./bin/ngrokd -domain="dev.applehater.cn" -tlsKey=server.key -tlsCrt=keserver.crt -httpAddr=":9000" -httpsAddr=":9001" > out.log &

3. Nginx 配置

server {
    listen 80;
    root /usr/share/nginx/html;
    index index.html index.htm;
    server_name *.dev.applehater.cn;# 泛域名解析

    location / {
                proxy_pass http://localhost:9000;
                proxy_set_header    X-Real-IP $remote_addr;
                proxy_set_header    Host $http_host;
                proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;

    }
}

4. 客户端配置

创建文件夹 ngrok 放进ngrok进去

创建启动脚本 start.sh

./ngrok -config ngrok.cfg start localhost

创建配置文件 ngrok.cfg

server_addr: "dev.applehater.cn:4443"
tunnels:
  localhost:
   hostname: "zohar.dev.applehater.cn" #定义子子域名
   proto:
    http: 127.0.0.1:8081 #映射端口,不加ip默认本机
    https: 1127.0.0.1:443

赋予可执行权限

chmod a+x ngrok

运行

./start.sh

在开发调试基于 Oauth 的接口(微信,微博等)非常有用。