2018-10-01

MySQL server has gone away 解法,無廢話


MySQL gone away 就是 MySQL 斷線了,最大的原因在於操作時間大於設定。記住,是「操作」時才應該有這種事發生,不應該出現在你的 "run time" application。例你需要批次匯入大量動態更新資料。

你可以在 mysql (or phpmyadmin) 執行以下命令查看你的 timeout 設定
show global variables like '%timeout%'





Variable_nameValue
connect_timeout60
delayed_insert_timeout300
innodb_flush_log_at_timeout1
innodb_lock_wait_timeout50
innodb_rollback_on_timeoutOFF
interactive_timeout60
lock_wait_timeout31536000
net_read_timeout30
net_write_timeout60
rpl_stop_slave_timeout31536000
slave_net_timeout3600
wait_timeout60

這裡我們發現 interactive_timeout, wait_timeout 都只有 60秒,也就是說60秒內都沒動作將會導致連線中斷

解決方法有
1. 直接修改my.cnf文件
2. my sql 在建立連線時傳入參數修改 interactive_timeout, wait_timeout
3. 只在某個連線,某個動作時直接改變 interactive_timeout, wait_timeout

第1種方式將會導致整個 mysql 都會延長連線時間,你可能有很多 database,有不同應用。這種設定在用戶端一多時(例如website)就會導致無法建立新連線的問題

第2種方式則是在某個應用啟動連接 mysql 時修改 timeout, 並第1種會少很多無法連線問題

第3種方式則是只在執行你知道的某個已知需要較長久功能時才修改interactive_timeout, wait_timeout。這個方式是最有效率的,不會影響其它功能。因為你修改的 timeout 只在該 child process 有效,每次重新 fork 一個新 process 都是重載的預設參數。而且你一定知道哪些功能會需要較長時間連線,若你不知道,那表示問題大了,且問題在你身上。

修改 timeout 指令如下:
set interactive_timeout=900
set wait_timeout=900

php 例子:

$sql = "set interactive_timeout=900; set wait_timeout=900";
$GLOBALS['db']->query($sql);
....
需要等長時間的程序




2018-09-14

Angular package.json 版本中 tilde(~) 跟 caret(^) 的意思

tilde(~) and caret(^) in package.json

我們在 Angular 的 package.json 會看到以下結構,結構中版本號碼前有 ^ 或 ~ 的符號,這兩個符號是什麼意思呢?


"dependencies": {
    "@angular/animations": "^5.2.11",
    "@angular/common": "~5.0.0",
    "@angular/compiler": "5.0.0",
    "@angular/compiler-cli": "5.0.0",
    "@angular/core": "5.0.0",
    "@angular/forms": "5.0.0",
    "@angular/http": "5.0.0",
    "@angular/platform-browser": "5.0.0",


不廢話,我簡單歸納其意思如下:

首先,我們在此定義版本的欄位格式: 1.2.3 三欄分別為 (major, minor, patch)
~:表示更新 patch 版本到最新,但止於 minor 版本,如 ~1.2.3 表示 1.2.x 等版本都會update,但 1.3.0 則不會更新

^:表示更新 minor 版本到最新,但 major 版本會忽略,如 ^1.2.3 表示 1.x.x  等版本都會update,包含 1.3.0, 終止於最大版本 2.0.0 ,不會更新。

【參考資料】
https://docs.npmjs.com/misc/semver#caret-ranges-123-025-004
https://stackoverflow.com/questions/22343224/whats-the-difference-between-tilde-and-caret-in-package-json...

2018-04-06

安裝 opencc 1.0.4 到 MAC 跟 CENTOS 平台下


[opencc 1.0.4 安裝]
1. 下載 opencc 1.0.4 => https://github.com/BYVoid/OpenCC
2. 解壓到你的程式下某目錄(自行依喜好安排)
3. 再來就是進到 opencc 的目錄執行
# cd opencc1.0.4
# mkdir build
# cd build
  產生 makefile, 以下分兩個平台, MAC 不能打開  GETTEXT
  CENTOS 執行以下命令
# cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release LE_GETTEXT:BOOL=ON  ..
  MAC 執行以下命令
# cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_BUILD_TYPE=Release -D ENABLE_GETTEXT:BOOL=OFF  -DCMAKE_OSX_ARCHITECTURES=x86_64  .. 
# make
# sudo make install

4. 最後,用 pip 安裝 OpenCC 即可
$ pip install OpenCC==0.2


5. 若遇到 libopencc.so.2: cannot open shared object file: No such file or directory
那是因為build 出來的 library 是 32bit, centos 64bit 是放在 /usr/lib64/ 故建個捷徑連到 /usr/lib 即可

#sudo ln -s /usr/lib/libopencc.so.2 /usr/lib64/libopencc.so.2


[測試]
$ opencc --version

Open Chinese Convert (OpenCC) Command Line Tool
Version: 1.0.4



[python 測試]
$ python
Python 3.4.3 (default, Jul 13 2015, 03:19:09)
[GCC 4.8.3 20140911 (Red Hat 4.8.3-9)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import opencc
>>> opencc.convert("开放中文转换", config='s2tw')
'開放中文轉換'
>>>




[內建可轉換檔有]
Conversions include 轉換包含:
'hk2s': Traditional Chinese (Hong Kong standard) to Simplified Chinese
's2hk': Simplified Chinese to Traditional Chinese (Hong Kong standard)
's2t': Simplified Chinese to Traditional Chinese
's2tw': Simplified Chinese to Traditional Chinese (Taiwan standard)
's2twp': Simplified Chinese to Traditional Chinese (Taiwan standard, with phrases)
't2hk': Traditional Chinese to Traditional Chinese (Hong Kong standard)
't2s': Traditional Chinese to Simplified Chinese
't2tw': Traditional Chinese to Traditional Chinese (Taiwan standard)
'tw2s': Traditional Chinese (Taiwan standard) to Simplified Chinese
'tw2sp': Traditional Chinese (Taiwan standard) to Simplified Chinese (with phrases)