2016年8月16日 星期二

MySQL SSH Tunnel

聽Jethro和Ike討論 Naticat的強大,如:SSH Tunnel、structure sync 

因為我常用的是phpmyadmin,所以找一下SSH Tunnel + phpmyadmin的解決方法

我有一台VPS機器,ssh需要私鑰登入,MySQL port沒有對外,如何使用phpmyadmin連線?

打開ssh通道
$ ssh -N <username>@<Bastian server IP> -L 3307:<internal ip of mysql server>:3306
-N 你不執行任何命令,僅端口轉發( port forward )
3307 本地要轉發的port
Bastian server IP 必須能連到MySQL 伺服器
3306 遠端機器的MySQL端口

因為我電腦使用Windows 7 ,所以這道命令在虛擬機上下的
ex. 
$ ssh -i vps.key -N user@vps.ip -L 3307:localhost:3306
3307:localhost:3306 是指虛擬機的3307端口 轉發到 vps.ip上的localhost 3306端口

檢測
$ telnet localhost 3307
...
5.6.28-76.1-log ... mysql_native_password
VPS上的mysql版本是5.6.28 沒錯

連線
$ mysql -u root -p  -h localhost -P 3307
經過幾次測試後, -P 是無效的,因為虛擬機和VPS的MySQL密碼和版本不一樣,但是都要輸入虛擬機的密碼,只能連到虛擬機的MySQL
原因:
當使用 localhost 參數時, MySQL使用sockets。請改用127.0.0.1
$ mysql -u root -p  -h 127.0.0.1 -P 3307

後記,因為虛擬機上沒裝phpmyadmin,所以Windows 7 在 config.inc.php 設不了 127.0.0.1:3307,只能設 192.168.x.x:3307 (虛擬機IP) ,去連VPS的MySQL。但是VPS的MySQL只允許 localhost或127.0.0.1登入

結論,使用Naticat的SSH Tunnel功能在此場景會比較方便,不過私鑰記得轉成ppk去連線





2016年7月29日 星期五

小心AdBlock

標題不知道怎麼下比較好,這是昨天遇到的問題
是這樣的,我的chrome有安裝AdBlock ,要訪問我放在linode上的項目時,發現網頁上有一張 ad_medium_01.jpg 的圖沒有顯示,但是單獨打開那張圖又可以,檢查chrome的console發現報錯
net::ERR_BLOCKED_BY_CLIENT

查了這一篇
原來是AdBlock把那張圖認為是廣告圖擋掉了

解法:
點AdBlock圖示 => 點擊 不要在這個頁面使用







2016年7月27日 星期三

正規表示式的 lookahead 和 lookbehind

起因:
要將email除了前三和後三字元屏蔽
ex.
TestEmail@google.com => Tes**************com

打開sublime,把 TestEmail@google.com 貼上去,用Find功能開始嘗試正則去匹配,只要用正則選取到除了前三和後三中間的字後,再用 preg_replace( '/regex/u', '*', $email )  去取代掉

先選取第三個字以後的字串
先說結論:
(?<=\S{3}).
如何實現的?
http://stackoverflow.com/questions/2973436/regex-lookahead-lookbehind-and-atomic-groups
使用了 positive lookbehind
Look ahead positive (?=)
Find expression A where expression B follows:
找有B接在後面的A
A(?=B)
ex.
TestEmail@google.com  // 正則搜尋 g(?=o)

Look ahead negative (?!)
Find expression A where expression B does not follow:
找沒有B接在後面的A
A(?!B)
ex.
TestEmail@google.com // 正則搜尋 g(?!o)

Look behind positive (?<=)
Find expression A where expression B precedes:
找有B接在前面的A
(?<=B)A
ex.
TestEmail@google.com // 正則搜尋 (?<=g)o

Look behind negative (?<!)
Find expression A where expression B precedes:
找沒有B接在前面的A
(?<=B)A
ex.
TestEmail@google.com // 正則搜尋 (?<!g)o

所以 (?<=\S{3}). 是 找三個( {3} )非空字元( \S )接在前面的任意字元( . ),就會選到
TestEmail@google.com

選取倒數地三個字以前的字串
先說結論:
.(?=.*\S{3})

使用了 Look ahead positive 
.(?=.*\S{3}) 是 找有 三個( {3} )非空字元( \S ) 接在後面的任意字元

把兩個合起來
(?<=\S{3}).(?=.*\S{3})

所以PHP 這樣寫
preg_replace('/(?<=\S{3}).(?=.*\S{3})/u','*','TestEmail@Google.com')  // Tes**************com

/u 是什麼意思?
http://stackoverflow.com/questions/12896985/regex-modifier-u-in-javascript
The /u modifier in PHP is for unicode support. This modifier is not supported in JavaScript.
/u 修飾符( modifier )是PHP的 unicode支持,javascript不支持

vim搜尋時如何做到 Look ahead negative

找沒有B接在後面的A
A(?!B)
在vim中是不作用的
https://stackoverflow.com/questions/21148467/is-there-a-way-to-do-negative-lookahead-in-vim-regex
https://stackoverflow.com/questions/34548988/match-a-pattern-not-followed-by-a-sub-pattern-in-vim
/\vA(B)@!
\v -  啟動very magic 解析模式
@! -  inverts the atom (B), so that the pattern matches when B is absent
@! -  倒轉原子(B),所以將會匹配沒有B的情況

:h \@! 可直接看vim解釋








2016年7月14日 星期四

xz壓縮

亞馬遜機器上有一個12G的純文字檔,現在因為亞馬遜的流出是按量收費的
所以把它壓縮後再下載,以節省流量

推薦使用 xz,壓縮比例很高(tar 不壓縮)
$ mysqldump -Aa -u root -pxxx   | xz > xxx.sql.xz

https://blog.gtwang.org/linux/linux-why-are-tar-archive-formats-switching-to-xz-compression-to-replace-bzip2-and-what-about-gzip/
$ tar -J => xz壓縮,tar 要新版才有 -J
$ tar -j => bz2壓縮
$ tar -z => gz壓縮
壓縮單檔直接用 xz

# time xz xxx.txt -T 4 --lzma2
--lzma2 => lzma2的算法
-T => muti threads,用top看 有幾棵CPU,想加快壓縮時間吃滿的話就指定線程數量
real    35m0.091s
user    134m59.372s
sys     0m6.908s
花了35分, 12G-> 746MB


解壓縮,速度比壓縮快很多,不能指定-T,只有單線程
$ time xz -d xxx.txt.xz
real    2m40.746s
user    1m12.542s
sys     0m9.335s







2016年6月30日 星期四

Linux tarball使用心得


壓縮時忽略.git資料夾和.gitignore檔案
http://stackoverflow.com/questions/984204/shell-command-to-tar-directory-excluding-certain-files-folders
$ tar zcvf project.tar.gz project/ --exclude='.git' --exclude='.gitignore'
注意:
--exclude='xxx' 要放到最後



2016年6月2日 星期四

使用sysbench 對MySQL進行壓力測試



安裝


https://launchpad.net/sysbench
trunk的版本是 0.4

虛擬機為ubuntu 14.04,檢查apt-get可以安裝的sysbench版本
# apt-cache madison sysbench
  sysbench | 0.4.12-1.1 | http://tw.archive.ubuntu.com/ubuntu/ trusty/universe amd64 Packages
或由 http://tw.archive.ubuntu.com/ubuntu/pool/universe/s/sysbench/ 得知我設的倉庫只提供到sysbench 0.4.12
Universe - Community-maintained, i.e. not officially supported software.
universe是社群維護的套件. 如:非官方支援的軟體
註:CentOS 7 用yum裝的可以直接裝0.5
# yum info sysbench
...
Version     : 0.5

在網上的一些範例中,sysbench的 --test會設為 /usr/share/doc/sysbench/tests/db/select.lua ,但是我的  /usr/share/doc/sysbench/ 下沒有tests/db/select.lua
原因,我用apt-get安裝了 0.4.12版,在 github上
https://github.com/akopytov/sysbench/tree/0.4/sysbench/tests
0.4版本沒有db 資料夾
https://github.com/akopytov/sysbench/tree/0.5/sysbench/tests/db
0.5版本有db資料夾


安裝 0.4.12 版
# apt-get install sysbench
移除 0.4.12 版
# aptitude purge sysbench

安裝 0.5版

# cd ~
# git clone https://github.com/akopytov/sysbench.git
# cd sysbench/
這時候如果想直接安裝,通常會失敗
# ./autogen.sh
automake 1.10.x (aclocal) wasn't found, exiting
1. 先安裝一些相依套件
# apt-get install -y gcc autoconf automake make libtool libssl-dev libcrypto++9

2. 安裝mysql_config(在 Percona repository 中可用)

安裝 Percona apt repository

# wget https://repo.percona.com/apt/percona-release_0.1-3.$(lsb_release -sc)_all.deb
安裝percona庫
# dpkg -i percona-release_0.1-3.$(lsb_release -sc)_all.deb
檢查 /etc/apt/sources.list.d/percona-release.list ,有多這隻檔案代表安裝成功
記得更新本地緩存
# apt-get update

最後安裝mysql_config
# apt-get install -y libperconaserverclient18-dev
3. 編譯和安裝sysbench
# ./autogen.sh
# ./configure
# make
安裝
# make install
4. 產生LUA資料夾(當初就是因為0.4版本沒有這個,直接拿0.5的LUA跑0.4的sysbench怕有問題,才手動編譯安裝)
# mkdir /usr/share/sysbench/tests/db -p
# cp sysbench/tests/db/* /usr/share/sysbench/tests/db
5. 檢查sysbench 0.5是否安裝成功
# sysbench --version
sysbench 0.5
移除sysbench
先看  Makefile 怎麼寫的,有看到 uninstall: uninstall-recursive ,所以嘗試移除sysbench
# make uninstall
檢查... 移除成功
# sysbench --version
-su: /usr/local/bin/sysbench: No such file or directory

 vim /usr/local/bin/sysbench 是二進位檔,應該是c寫的,或用 file  /usr/local/bin/sysbench去看,有些會告訴你那是什麼檔案。ex. python, shell... etc.

Benchmark

測試的benchmark是:你每次調試my.cnf後,重啟mysql,然後用sysbench測,看qps


參考資料:
http://askubuntu.com/questions/447/how-can-i-see-all-versions-of-a-package-that-are-available-in-the-archive  How can I see all versions of a package that are available in the archive?
http://blog.secaserver.com/2014/07/sysbench-0-5-ubuntu-14-04-trusty-percona-server-xtradb-cluster/  SYSBENCH 0.5 + UBUNTU 14.04 (TRUSTY) + PERCONA SERVER OR XTRADB CLUSTER
https://www.percona.com/doc/percona-server/5.5/installation/apt_repo.html  Installing Percona Server on Debian and Ubuntu
Rellik



2016年5月20日 星期五

CentOS 7 安裝 proxychains

因為yum沒有proxychains 可以直接安裝,然後又需要透過server去連ss代理

安裝 proxychains
# cd ~
# git clone https://github.com/rofl0r/proxychains-ng.git 
# cd proxychains-ng 
# ./configure && make && make install  
# make install-config

配置
# vim /usr/local/etc/proxychains.conf
更改
socks4 127.0.0.1 9050

socks5 127.0.0.1 xxxx
xxxx為你shadowsocks本地代理的port

開啟shadowsocks
$ sslocal -s <server_ip> -p <server_port> -l <local_port> -k <password> -m <method>
配合nohup和&可以使之后台运行,关闭终端也不影响:
#nohup sslocal -s 服务器地址 -p 服务器端口 -l 本地端端口 -k 密码 -m 加密方法 &

檢查是否代理成功
# proxychains4 curl https://api.ipify.org/?format=json

參考資料:
https://www.netroby.com/view/3653  Install proxychains on centos 6
https://wiki.archlinux.org/index.php/Shadowsocks_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)  Shadowsocks (简体中文)