2016年1月28日 星期四

透過NFS共用session

首先要架設NFS server,可參考[連結]

程式
www與sub分別是兩台不同機器,透過下列程式可獲得session相同
www.mydomain.com
<?php
ini_set("session.cookie_domain",'. mydomain.com');
session_start();

$_SESSION['test'] = 'testtttt------';

if ( !empty($_SESSION['test']) ) {
        echo 'not empty - '.$_SESSION['test'];
} else {
        echo 'empty';
}
?>


sub.mydomain.com
<?php
ini_set("session.cookie_domain",'. mydomain.com');
session_id($_COOKIE['PHPSESSID']);

session_start();
echo $_SESSION['test'];
?>


相關連結

  1. php.ini設定http://www.cnblogs.com/wangtao_20/archive/2011/02/16/1955659.html
  2. session共享http://www.cnblogs.com/wangtao_20/p/3395518.html
  3. 什麼是sticky sessionhttp://book.azure-recipes.tw/chapterX/01_Scalable_Web/03_disabling_arr_instnace_affinity.html

2016年1月27日 星期三

ubuntu 14.04架設NFS(Network Filesystem)

Service IP:110.1.1.1
Client IP:123.1.1.1

Server 

//更新系統及安裝相關package
$ sudo apt-get update
$ sudo apt-get install nfs-kernel-server

//建立提供的NFS資料夾
$ sudo mkdir /var/nfs

//修改資料夾擁有者
$ sudo chown nobody:nogroup /var/nfs

//修改開放可mount資料夾
$ sudo vi /etc/exports
//規則 [NFS server folder]       [client ip or hostname]([權限等設定])
//開放資料夾權限等資訊可參考說明(http://linux.vbird.org/linux_server/0330nfs.php#nfsclient_mount)
/home       110.1.1.1(rw,sync,no_root_squash,no_subtree_check)
/var/nfs    110.1.1.1(rw,sync,no_subtree_check)

//重新執行相關服務
$ sudo exportfs -a
$ sudo service nfs-kernel-server start

//檢查是否成功開放
$ sudo showmount -e localhost


NFS每次重新restart時都會導致port隨機產生,為了讓port可以固定,以下為設定方式。

$ vim /etc/default/nfs-common
STATDOPTS="--port 32765 --outgoing-port 32766"

$ vim /etc/default/nfs-kernel-server
RPCMOUNTDOPTS="-p 32767"

//網路上教學需要修改此檔案,但是本人操作後未修改仍然可以固定相關port
$ vim /etc/default/quota
RPCRQUOTADOPTS="-p 32769"

$ vim /etc/services
rpc.nfsd        2049/tcp                        # RPC nfsd
rpc.nfsd        2049/udp                        # RPC nfsd
rpc.nfs-cb      32764/tcp                       # RPC nfs callback
rpc.nfs-cb      32764/udp                       # RPC nfs callback
rpc.statd-bc    32765/tcp                       # RPC statd broadcast
rpc.statd-bc    32765/udp                       # RPC statd broadcast
rpc.statd       32766/tcp                       # RPC statd listen
rpc.statd       32766/udp                       # RPC statd listen
rpc.mountd      32767/tcp                       # RPC mountd
rpc.mountd      32767/udp                       # RPC mountd
rpc.lockd       32768/tcp                       # RPC lockd/nlockmgr
rpc.lockd       32768/udp                       # RPC lockd/nlockmgr
rpc.quotad      32769/tcp                       # RPC quotad
rpc.quotad      32769/udp                       # RPC quotad

$ vim /etc/modprobe.d/local.conf
options lockd nlm_udpport=32768 nlm_tcpport=32768
options nfs callback_tcpport=32764

//重新執行相關服務
$ sudo service nfs-kernel-server start

//查看修改結果
$ rpcinfo -p

依照以上設定port成功後,必須將防火牆開啟(AWS、GCE需去預設相關安全性地方開啟port)
TCP、UDP都得開啟以上範例的相關port
$ vim /etc/rc.local
iptables -A INPUT -i eth1 -p tcp -s 192.168.66.0/24 -m state --state NEW -m multiport --dport 111,2049,32764:32769 -j ACCEPT
iptables -A INPUT -i eth1 -p udp -s 192.168.66.0/24 -m state --state NEW -m multiport --dport 111,2049,32764:32769 -j ACCEPT

//restart iptables
$ service rc.local start

//並沒特別開啟
$ vim /etc/hosts.deny
ALL: ALL

//並沒特別開啟
$ vim /etc/hosts.allow 
portmap: ALL 




Client


//更新系統及安裝相關package
$ sudo apt-get update
$ sudo apt-get install nfs-common

//建立clinet放置NFS位置資料夾
$ sudo mkdir -p /mnt/nfs/home
$ sudo mkdir -p /mnt/nfs/var/nfs

//mount NFS路徑
//mount e.g mount -t nfs [NFS IP]:[client folder] [remote folder]
$ sudo mount -t nfs 123.1.1.1:/home /mnt/nfs/home
$ sudo mount -t nfs 123.1.1.1:/var/nfs /mnt/nfs/var/nfs

//可查詢cline目前mount哪些資料夾
$ mount -t nfs

//取消remote mount
//e.g umount [client folder]
$ umount /mnt/nfs/home
$ umount /mnt/nfs/var/nfs


client重新開機後掛載會取消,如需讓client自動掛載有以下兩種方式
//方法一
$ vim /etc/fstab
//規則說明
123.1.1.1:/home /mnt/nfs/home nfs defaults 1 1
123.1.1.1:/var/nfs /mnt/nfs/var/nfs nfs defaults 1 1

//方法二
$ vim /etc/rc.d/rc.local
//規則說明
mount -t nfs -o nosuid,noexec,nodev,rw,bg,soft,rsize=32768,wsize=32768 \123.1.1.1:/home /mnt/nfs/home
mount -t nfs -o nosuid,noexec,nodev,rw,bg,soft,rsize=32768,wsize=32768 \123.1.1.1:/var/nfs /mnt/nfs/var/nfs


參考網址:

修改主機名稱、network

相關網址:

  1. http://blog.faq-book.com/?p=2890

2016年1月22日 星期五

物件導向

物件導向專業術語說明

`Overload`
利用class建構式進行處理。簡單說在類別中定義與「類別相同」名稱,但是帶入「引數個數不同」
如:
public function Man() {}
public function Man($age) {}
public function Man($age, $company) {}

`Override`
「子類別」繼承「父類別」,同時必須「引數個數相同」、「method相同」、「傳回資料型態相同」等條件

`Overload`與`Override`參考說明網址
http://yensrule.blogspot.tw/2010/10/overloading-vs-overriding.html

============================================================

物件導向原則
系統抽象程度看interface,重用程度看abstract

SOLID 六項原則

單一職責原則SRP(Single Responsibility Principle)
  • 一個類別處理一個職責的內容,
  • 一個class如果要負責多個職責,其內容應該只是組合多個class,而每個被組合的class只負責單一職責,且通常這樣的組合都是透過接口(interface/abstract)。
  • 好處:
    class複雜性降低,因為實現什麼職責都有很清楚的定義
    可讀性提高
    可維護性提高
    變更引起的風險降低,變更範圍降低,擴展性提高
  • 參考網址:https://dotblogs.com.tw/hatelove/2010/10/16/single-responsibility-principle

開放封閉原則OCP(Open Closed Principle)



里氏替換原則LSP(Liskov Substitution Principle)


介面隔離原則ISP(Interface Segregation Principle)


依賴反轉原則DIP(Dependency Inversion Principle)


============================================================

Design Patterns
  • 三大特性:封裝、繼承、多型
  • 兩種抽象:interfact, abstract
  • 目的:高內聚、低耦合(http://ppt.cc/314ot、https://dotblogs.com.tw/hatelove/2010/10/16/oo-loosely-coupling)
  • SOLID 原則:單一職責原則、開放封閉原則、里氏替換原則、最小知識原則、介面隔離原則、依賴反轉原則
  • 基本設計原則:DRY, KISS, YAGNI
  • 基本設計方式:interface-driven, intention-driven, 生成物件與使用物件分開

意圖導向設計intention-driven design


參考網址:
  1. http://ppt.cc/U9j6
  2. http://ppt.cc/RJq8l
  3. http://irw.ncut.edu.tw/peterju/se.html

2016年1月19日 星期二

2016年1月14日 星期四

Multiple SSH Keys settings for different github account

本文引用文章:https://gist.github.com/jexchan/2351996

產生ssh key
$ ssh-keygen -t rsa

將ssh key,複製到~/.ssh
$ ~/.ssh/id_rsa_activehacker

改變ssh key權限
$ chmod 400 id_rsa_activehacker

$ cd ~/.ssh/

$ touch config
#activehacker account
Host github.com-activehacker
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa_activehacker

OpenSSH client 漏洞 - 影響的 OpenSSH 版本為 5.4 – 7.1

本文引用文章:https://blog.wu-boy.com/2016/01/openssh-security-cve-2016-0777-and-cve-2016-0778/


影響的 OpenSSH 版本為 5.4 – 7.1


暫時修補漏洞方式如下
FreeBSD
$ echo 'UseRoaming no' | sudo tee -a /etc/ssh/ssh_config

MacOS
$ echo "UseRoaming no" >> ~/.ssh/config


重新產生您的 Key Pairs
# 產生 key
$ ssh-keygen -t rsa
$ ssh-copy-id user@123.45.56.78
# 或者是
$ cat ~/.ssh/id_rsa.pub | ssh user@ip "mkdir -p ~/.ssh && cat >>  ~/.ssh/authorized_keys"

2016年1月11日 星期一

演算法相關文章


相關連結
  1. 目前認為最詳細簡單的演算法介紹http://program-lover.blogspot.tw/2008/08/algorithm.html
  2. http://saturn.im.tku.edu.tw/course14/st/arrayex.txt

node.js常駐程式[nodemon]

參考網址:http://nodejust.com/nodejs-nodemon-installation/
Github:https://github.com/remy/nodemon

node.js常駐程式[forever]

本文內容引用此文章:http://u1413745095-blog.logdown.com/posts/241538-nodejs-program-permanently-carry-out


一般執行方式
但是當終端機關閉時此程式也會跟著終止,對於一個需要常駐的Web Service來說並不好
但透過forever這個module就能讓程式常駐囉!
$ node myapp.js

將forever module安裝在全域
$ sudo npm install forever -g

在porject目錄中安裝forever module
$ sudo npm install forever

使用forever啟動app
$ forever start myapp.js

若是使用express框架並且想將app啟動為production mode
$ export NODE_ENV=production; export PORT=9000;
$ forever start myapp.js

2016年1月7日 星期四

Configuring the AWS Command Line Interface

參考網址:http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html


$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: ENTER

$ aws ec2 create-security-group --group-name my-sg --description "My security group"
{
    "GroupId": "sg-903004f8"
}



Installing the AWS Command Line Interface

參考網址:http://docs.aws.amazon.com/cli/latest/userguide/installing.html#install-bundle-other-os

ubuntu
$ sudo apt-get update
$ sudo apt-get install python2.7
$ curl -O https://bootstrap.pypa.io/get-pip.py
$ sudo python27 get-pip.py
$ sudo pip install awscli

Note
sudo: pip: command not found

$ which pip
/usr/local/bin/pip
$ sudo /usr/local/bin/pip install awscli
$ sudo pip install --upgrade awscli