2018-01-22

mac安裝composer & php-cs-fixer

安裝 php 7.2
brew update
brew tap homebrew/dupes
brew tap homebrew/php
brew install php72 (需php >= 7)
mv /usr/bin/php /usr/bin/php55
sudo ln -s /usr/local/bin/php /usr/bin/php

which php
# mac原本php
/usr/bin/php
# Homebrew的php
/usr/local/bin/php

# 重新安裝 PHP 7.2
brew reinstall php@7.2
# 測試重建鏈
brew link --overwrite --force --dry-run php@7.2
# 重建鏈結
brew link --overwrite --force php@7.2

安裝composer (php >= 7)
brew install composer

安裝xdebug
pecl install xdebug

安裝 php-cs-fixer
composer global require friendsofphp/php-cs-fixer
修改~/.profile
加入
export PATH="$PATH:$HOME/.composer/vendor/bin"
source ~/.profile
(或用brew: brew install homebrew/php/php-cs-fixer)

Bitnami Nginx Stack 取消 php opache

Bitnami Nginx Stack 預設是有PHP Opcache的,
因此修改php時無法即時看到修改結果,
當開發機使用時,讓人覺得很鬧。

修改
/Applications/nginxstack-1.10.1-2/php/etc/php.ini

opcache.enable=0

若安裝的是LAMP,需再修改
/Applications/nginxstack-1.10.1-2/apache2/conf/httpd.conf

#Include conf/pagespeed.conf
#Include conf/pagespeed_libraries.conf
給註解起來


ref:
https://docs.bitnami.com/general/infrastructure/lamp/#how-to-disable-the-cache-in-the-server

2018-01-17

WAMP使用PHP7

依WAMP的需求安裝Visual C++ Redistributable 2015
https://www.microsoft.com/en-us/download/details.aspx?id=48145

下載PHP 7
http://windows.php.net/download/
選擇x86或x64(依WAMP版本決定)Thread Safe版本

建立 wamp\bin\php\php7.2 資料夾
從 wamp\bin\php\php5.x 複製 php.ini 及 wampserver.conf 到 wamp\bin\php\php7.2

修改 php.ini
將 extension_dir 修改成 php7.2路徑
將 track_errors = On 註解掉
將 extension=php_mysql.dll 註解掉
複製 php_xdebug-2.6.0beta1-7.2-vc15-x86_64.dll(TS)到 wamp\bin\php\php7.2\zend_ext
在[xdebug]新增 xdebug.remote_enable = on
在[xdebug]新增 xdebug.remote_autostart = on
複製一份 php.ini,改名為 phpForApache.ini (wamp\bin\apache\apache2.4.9\bin\php.ini會link到此檔,而且apache會載入apapche/bin/php.ini!)

※注意:執行wamp時,看一下phpinfo()中的php.ini路徑是否正確,以及xdebug模組是否順利載入。
若是跑php CLI要載入xdebug,跑一下php --ini,看一下載入的php.ini路徑是否正確,
或執行php -S localhost:80,看一下phpinfo()看載入的php.ini路徑是否正確

修改 wampserver.conf
phpConf['apache']['2.4']['LoadModuleName'] = 'php7_module';
$phpConf['apache']['2.4']['LoadModuleFile'] = 'php7apache2_4.dll';

啟動WAMP並選擇PHP版本
Start Wamp > PHP > Version > 7
(Apache 需 >=2.4 )

2017-12-21

MAC上安裝node.js + jshint

在MAC上的sublime text 3需要裝sublimeLinter + jshint,因此需要裝nvm + node.js + jshint

1.安裝nvm (Node Version Manager)

先修改~/.bash_profile,加入下面二行(load nvm.sh才能找到nvm):
export NVM_DIR="$HOME/.nvm"
. "/usr/local/opt/nvm/nvm.sh"

建立.nvm目錄 (nvm會將node.js安裝在此)
mkdir ~/.nvm

brew install nvm

重載shell環境變數
source ~/.bash_profile

2.安裝node.js
nvm ls-remote #列出node所有版本,找LTS stable版
nvm install v8.9.3
nvm ls #列出預設使用版本
nvm use v8.9.3 #若nvm末正確設定預設版本,使用nvm use {version}

3.安裝jshint
修改~/.bash_profile,加入下面一行:
export PATH="$PATH:~/.nvm/versions/node/v8.9.3/bin"

重載shell環境變數
source ~/.bash_profile

npm install -g jshint



2017-11-08

Java中處理HTML Entity (HTML Special Char)

幫同事處理資料庫中有HTML Entity的字元,將其轉為對應的unicode字元,
(猜測是舊系統的網頁編碼為UTF-8,但送出表單時的charset為BIG5,因無法找到對應字元所造成的)

String name = "王蘐老蘑先蘒生蘓王蘔老蘕先蘖生蘗王蘘老蘐先蘙生蘚";
        Pattern regex = Pattern.compile("&#(\\d{5});");
        StringBuffer sb = new StringBuffer();
        
        long time1 = System.currentTimeMillis();
        
        //使用HTMLDocument及HTMLEditorKit
        HTMLDocument doc = new HTMLDocument();
        new HTMLEditorKit().read(new StringReader(name), doc, 0);
        System.out.println(doc.getText(0, doc.getLength()));
        
        long time2 = System.currentTimeMillis();
        System.out.println(time2 - time1); //60毫秒
        
        //使用正則表示式
        Matcher match = regex.matcher(name);
        while(match.find()){
            match.appendReplacement(sb, new String(Character.toChars(Integer.parseInt(match.group(1)))));
        }
        match.appendTail(sb);
        System.out.println(sb);
        
        long time3 = System.currentTimeMillis();
        System.out.println(time3 - time2);//1毫秒

2017-10-24

MAC上更新 RUBY 、安裝JDK8+JDK9並指定JRE 版本

MAC內的ruby目前還停留在2.0.0版,以下是使用homebrew的方法來更新 ruby & gem:

brew install ruby

vi ~/.profile
加入
export PATH=/usr/local/bin:$PATH

source ~/.bash_profile
brew link --overwrite ruby
gem install bundler

JAVA也是差不多,不過由於目前正是要過渡到JDK 9,系統又想保留JDK 8,且預設JRE要指定為8,可以這麼做:

brew cask reinstall java8 //jdk8
brew cask install java //jdk9

#查看一下目前裝了哪些JVM版本
/usr/libexec/java_home -V

#指定JRE 1.8
vi ~/.profile
加入
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`

source ~/.bash_profile

#檢查一下
java -version

但如果是.app的程式,可能就比較麻煩點了,如NetBeans.app,需要去修改netbeans.conf,直接指定jdk 8的路徑:
netbeans_jdkhome="/Library/Java/JavaVirtualMachines/jdk1.8.0_152.jdk/Contents/Home/"
若有修改~/.profile加入JAVA_HOME的話,可直接改為
netbeans_jdkhome="${JAVA_HOME}"

如果使用NetBeans的話,千萬不要傻傻移除Java 8啊,畢竟NetBeans 8.1以後的版本還是基於JDK 8使用的,安裝JDK 9之後再從NetBeans新增Platform選項就可以了。

ref:
https://docs.oracle.com/javase/8/docs/technotes/guides/install/mac_jdk.html#A1096903
https://www.java.com/en/download/help/mac_uninstall_java.xml
http://wiki.netbeans.org/JDK9Support#jdk9_runtime
https://stackoverflow.com/questions/21964709/how-to-set-or-change-the-default-java-jdk-version-on-os-x
https://stackoverflow.com/questions/38194032/how-to-update-ruby-version-2-0-0-to-the-latest-version-in-mac-osx-yosemite/42286604#42286604

2017-10-23

讓TOMCAT 8.5, TOMCAT 9 支援 SSL over HTTP/2

TOMCAT 8.5以上可支援HTTP/2,而HTTP/2+ALPN為目前瀏覽器支援的主流,
需要openssl的支援,而舊版本openssl只支援NPN,
若要支援ALPN,那麼openssl版本需 >= 1.0.2,
若未滿足上述條件,瀏覽器會自動降級為使用HTTP/1.1協定,
或瀏覽器本來就不支援HTTP/2,伺服器會改使用HTTP/1.1協定。

TOMCAT 8.5要支援HTTP/2需要使用APR(Tomcat Native library)
TOMCAT9.X要支援HTTP/2,可以使用APR,或使用Java >=9版本(建議)。

(UPDATE: TOMCAT 8.5 +JDK8使用APR有不太穩定的現象,建議升級為TOMCAT 9)
(UPDATE: TOMCAT 9 +JDK8使用APR運行了幾天後突然噴掉,查了 /tmp/hs_err_pid22617.log
,stack trace顯示錯誤為:
Stack: [0x00007f2eb16f8000,0x00007f2eb17f9000], sp=0x00007f2eb17f74a0, free space=1021k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C [libc.so.6+0x7c418] _int_free+0x2f8

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
J 7361 org.apache.tomcat.jni.Socket.destroy(J)V (0 bytes) @ 0x00007f2ec140ba81 [0x00007f2ec140ba40+0x41]

看起來是底層系統做記憶體回收時噴掉,網路上一查似乎很多人都有不定時噴掉的情形,
看來APR似乎是不太可靠…或者是libc.so要去更新才行,因此為了暫時解決此問題,
在tomcat.service加了crash後自動restart的機制:
[Service]
...
Restart=on-failure
RestartSec=5
TimeoutStartSec=60
TimeoutStopSec=60

1.先確定OPENSSL >= 1.0.2,若不是請先升級
openssl version
==> OpenSSL 1.0.2k-fips  26 Jan 2017

2.安裝gcc、OpenSSL libraries及APR library,等下編譯 tc-native需用到
apt-get install gcc libapr1.0-dev libssl-dev

yum install apr-devel openssl-devel
/usr/bin/apr-1-config --version
==> 1.4.8


注意最後訊息所顯示的apr安裝位置,譬如CentOS用yum是安裝在/usr/bin/apr-1-config

3.下載Apache Tomcat Native Library,解壓縮,./configure,make,make install
(可直接使用tomcat/bin/tomcat-native.tar.gz)
(新版下載位置:http://tomcat.apache.org/download-native.cgi)
cd path/to/tomcat/bin/
tar zxvf ttomcat-native.tar.gz
cd tomcat-native-1.2.16-src/native

自動安裝到tomcat/lib:
./configure --prefix=$CATALINA_HOME
make
make install

或不make install,手動搬移library(建議):
./configure && make
mkdir -p path/to/tomcat/lib_tc
cp .libs/* path/to/tomcat/lib_tc
chown -R tomcat.tomcat path/to/tomcat/lib_tc
cd path/to/tomcat/lib_tc
ln -f -s libtcnative-1.so libtcnative-1.so.0.2.16
ln -f -s libtcnative-1.so.0 libtcnative-1.so.0.2.16

4.make install後,會在tomcat/lib多了
libtcnative-1.a
libtcnative-1.la
libtcnative-1.lai
libtcnative-1.so (link)
libtcnative-1.so.0 (link)
libtcnative-1.so.0.2.16
這些函式庫檔案跟目錄,記得檢查並chmod及chown一下。

5.之後我們需要把這些lib路徑加到環境變數LD_LIBRARY_PATH,
可以用編輯tomcat/bin/setenv.sh的方法(無此檔案請自行新增),加入:

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CATALINA_HOME/lib_tc
export LD_LIBRARY_PATH

記得chmod +x setenv.sh

6.修改tomcat/conf/server.xml

檢查一下AprLifecycleListener是否有加入此行啟動監聽:
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

修改Connector,注意憑證需轉換為PEM格式
<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
            maxThreads="150" SSLEnabled="true" >
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
    <SSLHostConfig>
      <Certificate certificateKeyFile="conf/private_key.pkcs8"
                        certificateChainFile="conf/ca_chain.cer"
                        certificateFile="conf/ca.cer"/>
    </SSLHostConfig>
</Connector>

若無申請正式憑證,可先自行生成自簽憑證使用:
openssl genrsa -out private_key.pkcs8 2048
openssl rsa -in private_key.pkcs8 -out private_key.pkcs8
openssl req -new -x509 -key private_key.pkcs8 -out ca.crt -days 3650


7.重啟TOMCAT,
檢查catalina logs是否成功載入APR
INFO: Loaded APR based Apache Tomcat Native library [1.x.y]
["https-openssl-apr-8443"]
如有以上訊息代表成功。


上述做法我在tomcat 9是成功的,但tomcat 8.5.4似乎有掉資料的現象,所以建議升級至TOMCAT 9。

TOMCAT9的HTTP/2若不使用APR,需使用JDK >= 9,這樣Connector就直接使用NIO2就好而不需要用到APR。

ref:
http://tomcat.apache.org/whichversion.html
https://tomcat.apache.org/tomcat-9.0-doc/config/http2.html
https://linux.cn/article-7934-1.html
https://dzone.com/articles/configure-tomcat-9-forhttp2
https://stackoverflow.com/questions/30855281/tomcat-support-for-http-2-0/37889873#37889873
https://readlearncode.com/configure-tomcat-9-for-http2/
http://tomcat.apache.org/native-doc/
https://tomcat.apache.org/tomcat-8.5-doc/apr.html
http://jmchung.github.io/blog/2013/09/06/centos-installing-apache-portable-runtime-apr-for-tomcat/