2016年10月25日 星期二

stored-function and stored-prcedure

註解
範例(黑字,青藍底):procedure and function的命名
範例(黑字,橘底):帶入參數
範例(紅字,白底):內部使用變數
範例(白字,黑底):如何執行範例



補充說明 - 常用方式解釋:

#宣告變數方式:
DECLARE 變數名稱 資料型態;
ex: DECLARE var1 INT;

#判斷式:
IF 判斷條件1 THEN
ELSEIF 判斷條件2 THEN
ELSE
END IF;
ex:
IF var1=1 THEN
  SET result=1
ELSEIF var1=2 THEN
  SET result=2
ELSE
  SET result=3
END IF;

#while:
WHILE 條件1 DO
END WHILE;
ex:
SET result = 'NO';
WHILE 1 < 2 DO
  SET result = 'YES';
END WHILE;



Stored-procedure

#取得BonusGame每日登入-開始時間

DROP PROCEDURE IF EXISTS  `stored-procedure-example`;
DELIMITER ;;
CREATE PROCEDURE `stored-procedure-example`(
IN id INT,
OUT outResult INT)
BEGIN

SET outResult= id;

END;;
DELIMITER ;

call spGetBonusGame_DailyLogin_User(411, @result);
select @result;



Stored-function

DROP FUNCTION IF EXISTS `stored-function-exmaple`;
DELIMITER $$
CREATE FUNCTION `stored-function-exmaple`
(
    id INT,
    created_at DATETIME
)
RETURNS DATETIME

BEGIN
    DECLARE outDatetime DATETIME;

    SELECT DATE_ADD(created_at,INTERVAL id MINUTE) INTO outDatetime;
    RETURN outDatetime;

END;
$$

DELIMITER ;


SELECT *, stored-function-exmaple(id, created_at) FROM TEST-TABLE;





相關連結:

  1. http://forum.slime.com.tw/thread222603.html
  2. http://www.codedata.com.tw/database/mysql-tutorial-13-stored-routines/

2016年7月12日 星期二

How to build Server Flask(Framework) Applications, uWsgi and nginx on CentOS 7

首先可參考此連結步驟
https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-uwsgi-and-nginx-on-centos-7

you might meet some problems.
connect() to unix:myproject.sock failed (13: Permission denied) while connecting to upstream

you can using below command.
$ sudo ~/
$ sudo grep nginx /var/log/audit/audit.log | audit2allow -M nginx
$ sudo semodule -i nginx.pp

$ setenforce 1 //開啟
$ setenforce 0 //關閉

2016年6月14日 星期二

How to install mono on ubuntu(it can using C# and asp on ubuntu)

ubuntu 14.04

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install -y mono-complete
$ sudo apt-get install -y monodevelop
$ sudo apt-get install -y mono-xsp4



影片教學:


  1. https://www.youtube.com/watch?v=5akYkyo0g3s
  2. https://www.youtube.com/watch?v=yV5itt-G66o

2016年6月1日 星期三

bash shell keyboard-shortcuts


本文參考網址:
  1. https://blog.longwin.com.tw/2006/09/bash_hot_key_2006/
  2. http://blog.codylab.com/bash-shell-shortcut/

  • Alt-F: 到此行的後一個字
  • Alt-B: 到此行的前一個字
  • Ctrl-A: 回到此行最前面
  • Ctrl-E: 到此行的最後面
  • Ctrl-U: 清除一行中游標之前的所有文字
  • Ctrl-K: 清除一行字游標之後的所有文字
  • Ctrl-Z: 將該工作放到背景中暫停, 使用jobs看工作號碼(job number), fg 取回

2016年5月26日 星期四

SQL Command Line Interface(CLI)

//show tables index, unique
SHOW INDEX FROM [table];

//show table sehema
SHOW COLUMNS FROM [table];


// show foreign
 SELECT
  ke.referenced_table_name parent,
  ke.table_name child,
  ke.constraint_name
FROM
  information_schema.KEY_COLUMN_USAGE ke
WHERE
  ke.referenced_table_name IS NOT NULL;

2016年5月23日 星期一

2016年5月9日 星期一

[FB][分享]javascript sdk

參考網址:

  1. https://dotblogs.com.tw/suehilary/2012/02/08/68441
  2. [登入] https://developers.facebook.com/docs/javascript/examples#login
  3. [javascript sdk] https://developers.facebook.com/docs/javascript/examples

javascript範例:


//判斷是否登入中
function checkLoginState() {
FB.getLoginStatus(function(response) {
statusChangeCallback3(response);
});
}

// 判斷登入狀態
function statusChangeCallback3(response) {
console.log('statusChangeCallback');
// The response object is returned with a status field that lets the
// app know the current login status of the person.
// Full docs on the response object can be found in the documentation
// for FB.getLoginStatus().
if (response.status === 'connected') {
// Logged into your app and Facebook.
api_me(response);
// console.log(response);
} else if (response.status === 'not_authorized') {
// The person is logged into Facebook, but not your app.
console.log('not_authorized');
// document.getElementById('status').innerHTML = 'Please log ' + 'into this app.';
} else {
// The person is not logged into Facebook, so we're not sure if
// they are logged into this app or not.
console.log('else');
// document.getElementById('status').innerHTML = 'Please log ' + 'into Facebook.';
}
}

// 登入中取得資訊後,像後端傳送資料
function api_me(login_status) {
var access_token = login_status.authResponse.accessToken;
FB.ui({
method: 'feed',
name: '分享標題',
link: 'https://google.com',//分享連結
picture: 'https://google.com',//分享圖片
caption: '分享資訊',
description: '分享資訊'
}, function(response) {
if (response && response.post_id) {
var post_id = response.post_id;
FB.api('/me?fields=email,name,first_name,last_name', function(response) {
email = response.email || "";
$.ajax({
url: "", //後台api
dataType: 'json',
method: 'POST',
data: {
'post_id' : post_id,
'name' : response.name,
'account' : response.id,
'email': email,
},
success: function(result) {
console.log(result);
if (result.status=='ok') {
alert('已完成');
} else {
alert('請與客服聯絡');
}
},
error: function(err) {
console.log(err);
alert('發生錯誤');
}
});
});
} else {
alert('Post was not published.');
}
});
}

nginx和centos php設定

nginx file:

fastcgi_pass unix:/var/run/php5-fpm.sock;

change to

fastcgi_pass 127.0.0.1:9000;

2016年4月27日 星期三

Multiple SSH Keys settings for different key with same host

由於連線位置都是155.100.xxx.xxx,但是key不同會產生,第二個相同git無法抓取到資料問題。
所以需要在~/.ssh/config動手腳。

原先:

$ vi ~/.ssh/config
Host 155.100.xxx.xxx
        Hostname 155.100.xxx.xxx
        User ex1_user
        IdentityFile ~/.ssh/ex1.pem

Host 155.100.xxx.xxx
        Hostname 155.100.xxx.xxx
        User ex1_user
        IdentityFile ~/.ssh/ex2.pem


$ git clone ex1@155.100.xxx.xxx:proj_1
success

$ git clone ex1@155.100.xxx.xxx:proj_2
Cloning into 'fs/server/warinode'...
FATAL: R any fs/server/warinode fttwsmt DENIED by fallthru
(or you mis-spelled the reponame)
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

會發現第二個無法正常clone




修改後:

下方紅色字體為增加內容。

$ sudo chmod 400 ~/.ssh/ex1.pem
$ sudo chmod 400 ~/.ssh/ex2.pem

$ vi ~/.ssh/config
Host ex1 155.100.xxx.xxx
        Hostname 155.100.xxx.xxx
        User ex1_user
        IdentityFile ~/.ssh/ex1.pem

Host ex2 155.100.xxx.xxx
        Hostname 155.100.xxx.xxx
        User ex1_user
        IdentityFile ~/.ssh/ex2.pem


$ git clone ex1@ex1:proj_1
success

$ git clone ex1@ex2:proj_2
success

2016年4月13日 星期三

linux port - make sock


error:
Starting httpd: (13)Permission denied: make_sock: could not bind to address [::]:port
 (13)Permission denied: make_sock: could not bind to address 0.0.0.0:port
no listening sockets available, shutting down
Unable to open logs


解決方法:
$ sudo setenforce 0

2016年3月24日 星期四

redis type 型態對照

reids type

set :
create -> SADD
get -> SMEMBERS


string :
create -> MSET, SET
get -> MGET, GET

zset :
create -> ZSET
get -> ZRANGE

hash :
create -> HMSET
get -> HGET



2016年2月18日 星期四

[GCE] google compute engine指令


//設定project名稱
$ gcloud config set project [project name]

//ssh登入
$ gcloud compute ssh [vm name]

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