2015年8月12日 星期三

You've been added as a contact on Cotap

Cotap

Cotap is a secure texting app for teams.

View the Blogger directory.

Get Started

Are you using WhatsApp, GroupMe, or iMessage to text your coworkers? See why Cotap is better for work.

2015年5月4日 星期一

CloudFlare改頭換面!

最近流行換新裝?! Cloudflare改頭換面啦 :D



2015年4月10日 星期五

docker mysql image encoding change to utf8

最近在使用docker的mysql image掛載mysql db時候
發現server的語系都是在latin1的狀態
而mysql image又不允許直接把my.cnf換掉...
但是可以overwrite /etc/mysql/conf.d這個資料匣
來重寫mysqld的語系設定...

這是原始資料庫啟動後透過"\s"來查看server狀態

# mysql -h123.123.123.123 -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.5.42 MySQL Community Server (GPL)
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.5.41, for debian-linux-gnu (x86_64) using readline 6.2
Connection id: 3
Current database:
Current user: root@123.123.123.123
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.5.42 MySQL Community Server (GPL)
Protocol version: 10
Connection: 211.78.245.67 via TCP/IP
Server characterset: latin1
Db     characterset: latin1
Client characterset: latin1
Conn.  characterset: latin1
TCP port: 3306
Uptime: 49 sec
Threads: 3  Questions: 25  Slow queries: 0  Opens: 33  Flush tables: 1  Open tables: 26  Queries per second avg: 0.510
--------------
mysql>

我們建立一個docker.cnf檔案如下

# cat docker.cnf
[mysqld]
user = mysql
datadir = /var/lib/mysql
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

我的啟動command:

docker run --name mydb -p 3306:3306 -v /root/mysql-data:/var/lib/mysql \ 
  -v /root/mysql-config:/etc/mysql/conf.d \ 
  -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.5

接著應該就可以在登入mysql後透過"\s"看到語系部分已經是utf8

Server characterset: utf8
Db     characterset: utf8
Client characterset: utf8
Conn.  characterset: utf8

PS: 關於client部分,需要在[client]部分使用,也就是連線的那端要改my.cnf來使用utf8連線...

2015年3月27日 星期五

簡單的SSHFS mount...

前陣子看到nixCcraft所PO的SSHFS文章,一直想找機會試試看
今天有機會來玩一下 :D

Debian上還滿簡單,只要直接安裝即可:

sudo apt-get install sshfs -y

CentOS上,如果安裝時找不到套件,可以先安裝epel-release後再進行安裝

sudo yum install epel-release -y
sudo yum install fuse-sshfs -y

接著,就可以操作mount的動作




實際測試一下速度 - sshfs建立100M檔案:








與自己本身建立100M檔案:










與iscsi比較一下









上述測試是在Google Cloud上主機上進行
100M的檔案在2s左右完成傳輸,實際上效能還不錯
但跟local比契還來是慢了近20倍
以方便性而言sshfs的確方便
但是考慮效能的應用程式,還是需要好好考慮一下唷~

補充一下大家最常用的NFS





2015年3月24日 星期二

Logstash mutate filter

最近在研究Logstash,透過Logstash的input, filter, output可以產生出許多不同的變化... 下面是我前陣子遇到的問題,後來找到解決方案....

例如我在抓CentO6.6的rsyslog時候,我把/var/log/message中的一些syslog重倒到logstash中

$ vi /etc/rsyslog.conf

*.info;mail.none;authpriv.none;cron.none                @@10.240.58.95:514

另外,logstash server部分,透過input syslog module開啟514 port接聽syslog input...

input {
  syslog {
    port => 514
    type => syslog
  }
}

此時收到的syslog在rubydebug模式下,會類似:

{
           "message" => "Installed: mysql-5.1.73-3.el6_5.x86_64",
          "@version" => "1",
        "@timestamp" => "2015-03-25T03:50:01.000Z",
              "type" => "syslog",
              "host" => "10.240.219.254",,
        "timestamp" => "Mar 25 03:50:01"
          "priority" => 14,
         "logsource" => "simon-centos6",
           "program" => "yum",
               "pid" => "645",
          "severity" => 6,
          "facility" => 1,
    "facility_label" => "user-level",
    "severity_label" => "Informational"
}

其中,會明顯地發現有兩個timestamp的欄位... 雖然有個前面加上"@"
而這個重複的timestamp欄位會造成其他的output module錯誤,導致一些其他問題...

在找了很久,後來發現mutate這個filter module.... 透過mutate可以讓欄位改名稱、改內容、刪除欄位、增加欄位... 這樣在input與output之間的銜接,就少掉很多問題...
下面範例是透過mutate的rename function來置換我所遇到的重複key...

input {
  syslog {
    port => 514
    type => syslog
  }
}
filter {
  mutate {
    rename => [ "timestamp", "timestamp1" ]
  }
}
output {
  stdout { codec => rubydebug }
}

如果一切沒有問題,再重新執行logstash之後,可以看到新的output,其中可以看到timestamp1會被排到最後面

{
           "message" => "Installed: mysql-5.1.73-3.el6_5.x86_64",
          "@version" => "1",
        "@timestamp" => "2015-03-25T03:50:01.000Z",
              "type" => "syslog",
              "host" => "10.240.219.254",
          "priority" => 14,
         "logsource" => "simon-centos6",
           "program" => "yum",
               "pid" => "645",
          "severity" => 6,
          "facility" => 1,
    "facility_label" => "user-level",
    "severity_label" => "Informational",
        "timestamp1" => "Mar 25 03:50:01"
}


這樣傳給output的值就沒有問題了ㄛ :D

2015年3月12日 星期四

Docker in Mac will more easy!!!

Kitermatic是Docker新出的一個本地端套件管理工具,讓您可以用視覺化的方式來管理Container服務,未來要在Mac上使用Docker就更方便了!!


2015年1月31日 星期六

發想自 node-schedule 的 node-schedule-server

node-schedule

node-schedule是一個time base的排程器,透過給定簡單的時間物件或是給與cron job的時間格式字串,就可以指定時間觸發所給定的task。 這在Java的世界,與一套叫Quartz的服務相像...

Github repository

https://github.com/mattpat/node-schedule

Installation

npm install node-schedule  

Sample Usage

下面範例展示一個簡單的排程作業,其中date指定為現在時間過30秒,而date2指定為一個未來的時間... 程式起動時候,會先列印現在時間,並開始設定兩個(j, j2) Job分別在指定的date, date2時間啟動...

var schedule = require('node-schedule');  var date = new Date(new Date().getTime() + 1*1000*30);  var date2 = new Date('2015/1/31 21:28:00');  console.log(new Date());    console.log('j will start at:', date);  var j = schedule.scheduleJob(date, function(){          console.log('The job j is going to end...');  });    console.log('j2 will start at:',date2);  var j2 = schedule.scheduleJob(date2, function(){          console.log('The job j2 is going to end...');  });  

上面程式起動後,會執行列印現在時間,並且開始將Job置入排程時間,等候執行...

$ node examples/node-schedule/sample01.js  Sun Feb 01 2015 14:40:34 GMT+0800 (CST)  j will start at: Sun Feb 01 2015 14:41:03 GMT+0800 (CST)  j2 will start at: Sat Feb 2 2015 21:28:00 GMT+0800 (CST)  The job j2 is going to end...  (waitting...)  

等到執行的時間到了,系統就會執行定義於j, j2中callback function中的內容... 等到所有Job執行完成,程式就會關閉...

Sample Project

因為Schedule服務非常實用,筆者花了一些時間把這些動作建置成一個RESTful操控的服務器,透過簡單的動作,就可以提供RESTful的Endpoint來操控排程...

安裝服務

目前服務release在github上,有興趣使用的朋友可以直接git clone下來或是fork回去改...

$ git clone git@github.com:peihsinsu/node-schedule-server.git $project_home  $ cd $project_home && npm install  

啟動服務

因為使用express 4來實作,因此可以透過npm start來啟動... 真正的啟動程式定義在package.json,位置為bin/www。

$ cd $project_home  $ npm start  

撰寫服務執行者(Worker)

預設我只提供了一個RESTful Client來在排程時間到之後透過Url的方式來執行服務,這個RESTful Client(workers/restclient.js)的目的在使用前端傳入的opts參數內容來使用request模組來達到呼叫的目的。

每個Worker的必要條件如下:

  • 必須放置在$project_home/workers下面
  • 名稱必須與呼叫時候給定的"catg"參數值相同
  • 可參考restclient.js實作Worker:
    • 必須具備exec這個function
    • 這個 exec function 必須有一個opts的json字串輸入,這個值是由呼叫時候給訂opts參數傳入。
var request = require('request');  var log = require('nodeutil').simplelog;    exports.exec = function(opts) {      if(typeof(opts) == 'string')          opts = JSON.parse(opts);    //Here you can do the job...      request(opts, function(e, r, d) {          if(e) log.error('Job[%s] execute error:', e);          log.info('Job[%s] execute result:', d);      });  }  

新增加一筆服務

一切準備就緒後,在服務啟動完成,就可以透過下面方式呼叫新增一筆排程工作...

curl -X POST -sS http://127.0.0.1:3000/schedule/testjob \    -d "jobtime=2015/2/1 1:59:00" \    -d catg=restclient \    -d 'opts={"url":"http://localhost:3000","method":"GET"}'


以上內容,收錄於Node.js in Example!