2016/12/27

Apple 企業版開發者帳號Apple In House(Apple Developer Enterprise Program License) 申請心得


最近因為工作需要申請了 Apple In House(Apple Developer Enterprise Program License) 的帳號,過程瑣碎繁雜。特此紀錄。

基本流程:

A. 從這個網址開始
 (Apple Enterprise enroll URL)
https://developer.apple.com/programs/enterprise/enroll/

中國請使用
https://developer.apple.com/programs/enterprise/cn/

1. 企業帳號(In House)目的是應用程序APP只是給內部員工分享開發使用的,才可以註冊這個年費 US$299/year
如果給外面的人用的要申請正常平時的 apple developer US$99/year (APP須經過審查上架 Apple Store ).

2. 先得有個法律上合法的公司,且有公司登記的資訊可以查的到的。且還要有個公司網站,及公司網域結尾的 email address 申請 apple ID 並用來申請 in house 帳號。

3. 公司的負責人要同意,並且能約束員工使用這個帳號。

4. 用上面這個公司資訊,去申請鄧白式編碼(DUNS),這個碼主要用在商務資訊的驗證。
可以直接上 apple 網站申請,不會收取任何的費用,但是 apple in house 帳號要付費。
申請過後 1~2 天內 ,會收到台灣鄧白式公司的驗證電話,主要是驗證你的公司資訊。

Apple Developer Enterprise Program 註冊你的組織




B. 申請 DUNS
Apple的 DUNS 資訊申請網址:  https://developer.apple.com/support/ios/D-U-N-S.html 

申請後,幾天內會有當地鄧白式公司的人員電話聯繫確認你公司,通過以後會收到類似這樣的信件

寄件者: dsmmssqladmin@dnb.com
寄件日期: 2016年(馬賽克)
收件者: (馬賽克)
主旨: D-U-N-S Number Request/Update Completed
your D-U-N-S Number request/update submitted on (馬賽克) with ID Number (馬賽克) has been completed. You may start using your number in 14 days.
D-U-N-S Number: (馬賽克)
Resolution Description: New Record Created
The following information was submitted as part of your request:Business Name: (馬賽克) Co., Ltd. City: (馬賽克)
Thank you for using D&B's Mini Investigation Service.
Country: TAIWAN



公司驗證完成後,才是開始申請。




C. 申請 Apple Enterprose 註冊
請到 https://developer.apple.com/enroll/error/apple-id/ 
Apple Enterprise 的註冊,需要你的 Email 是你公司 Domain Name 的結尾網域,且需要有個公司網站,來提供 apple 的審查。

所以他會提示你記得切換成為你公司的 Apple Id ,這讓我困擾了好一陣子,因為之前沒注意到申請到個人帳號。



登入時候會要提供公司的資訊包含網站資訊。

電話資訊很重要,要注意他會以電話資訊當成發話地點打電話驗證。所以一定要填一個要你接的到電話的地方。

申請過後,約一週內會有中文(應該是中國的客服)講話語速的很快的人跟你聯繫,過程如有中斷會給你一個類似。Issue Tracker 的編號,只要跟他講這個編號就可以繼續驗證程序了。
並請記得確認強調,這個程式是用來提供內部員工開發使用的 APP 服務。

蘋果客服:0800-022-237




D. 繳費及驗證是否正確
通過後,你的信箱會收到一封繳費的信件應該是付款 US $299/1年 ,上 Apple 網站,刷卡就可以開通了。

開通後請登入 Apple Developer 帳號,觀看你的授權是否為 Apple Developer Enterprise Program 帳號。  https://developer.apple.com/account/#/membership 

Apple Developer Enterprise Program 授權確認 



申請到這樣後,就算成功了。接下來就是 apple 開發者的問題了。
整個過程,如果積極點應該 1~2 周就可以申請完成。




2016/11/26

STOMP/MQTT 通訊協定的測試心得(client/server)

STOMP 通訊協定的測試心得(client/server)

STOMP 是啥東西? 
STOMP 是 Simple (or Streaming) Text Oriented Message Protocol 的縮寫
主要提供一個可以操作的通訊界面,可以支援不同平台的的客戶端交換文字訊息。它屬於一個訊息導向的中介軟體。這個服務類似 HTTP ,並且架構於 TCP 上面。
ref: https://segmentfault.com/a/1190000004906137 功能示意圖


用來搭建 IM (即時通訊服務) 是很簡單好用的中介工具
https://segmentfault.com/a/1190000004906137 

這裡有目前常見的訊息中介軟體的比較介紹 amqp mqtt or stomp
http://blogs.vmware.com/vfabric/2013/02/choosing-your-messaging-protocol-amqp-mqtt-or-stomp.html

建議和 html5 websocket 一起看,比較容易理解它到底再做啥? P66 頁開始。
http://www.slideshare.net/peterlubbers/html5-real-time-and-websocket/94-Learn_More_HTML5_User_Groups

這裡有 function 功能規格說明
https://mq.java.net/4.4-content/stomp-funcspec.html

這個大概就是目前的官方網站了
https://github.com/stomp-php/stomp-php/wiki

這個服務主要構過 broker 來提供服務,目前 broker 的軟體有很多種可以提供。

broker -- STOMP Servers
broker -- STOMP Servers 的列表,常用的。
https://stomp.github.io/implementations.html
我裡以 apache apollo 這套 activemq 的子專案,來做說明。

Apollo 1.7.1 版本,下載我是以 Linux 版來說明
http://activemq.apache.org/apollo/download.html

提供有 4 種存取的方式
WS  --  TCP + Websocket
WSS -- TCP + TLS + Websocket
HTTP -- TCP + HTTP
HTTPS -- TCP + TLS + HTTP
ref: http://www.slideshare.net/peterlubbers/html5-real-time-and-websocket/78-ws_and_wss_schemes_78


// 安裝說明文件
http://activemq.apache.org/apollo/documentation/getting-started.html

解開檔案後,我把它放在 /opt 上面 , 並使用這個程式建立一個 broker 名稱為 jangmtbroker 放在 /var/lib/ 上面
# /opt/apache-apollo-1.7.1/bin/apollo create jangmtbroker
Creating apollo instance at: jangmtbroker
Generating ssl keystore...

You can now start the broker by executing:

   "/var/lib/jangmtbroker/bin/apollo-broker" run

Or you can setup the broker as system service and run it in the background:

   sudo ln -s "/var/lib/jangmtbroker/bin/apollo-broker-service" /etc/init.d/
   /etc/init.d/apollo-broker-service start
 
* 設定為啟動的服務
# sudo ln -s "/var/lib/jangmtbroker/bin/apollo-broker-service" /etc/init.d/
* 接下來,就可以透過底下指令啟動它
# /etc/init.d/apollo-broker-service start


* 啟動後會有一個管理界面 Web Administration 預設只開放 127.0.0.1 可以改的
* 如果要修改可以參考 etc 下面的 xml 設定檔。
http://127.0.0.1:61680/ or https://127.0.0.1:61681/
* 預設帳密 admin and password.

# 在系統會看到 appolo 的 port
# netstat -antlp | grep apollo
tcp6       0      0 :::61613                :::*                    LISTEN      11471/apollo      
tcp6       0      0 :::61614                :::*                    LISTEN      11471/apollo      
tcp6       0      0 127.0.0.1:61680         :::*                    LISTEN      11471/apollo      
tcp6       0      0 127.0.0.1:61681         :::*                    LISTEN      11471/apollo      
tcp6       0      0 :::61623                :::*                    LISTEN      11471/apollo      
tcp6       0      0 :::61624                :::*                    LISTEN      11471/apollo      
tcp6       0      0 :::32777                :::*                    LISTEN      11471/apollo      
tcp6       0      0 127.0.0.1:61680         127.0.0.1:53532         ESTABLISHED 11471/apollo      
tcp6       0      0 127.0.0.1:61680         127.0.0.1:53536         ESTABLISHED 11471/apollo

* 防火牆記得要開這幾個 port


* 當然,預設密碼很危險,可以參考下列文件修改預設帳密
https://activemq.apache.org/apollo/documentation/user-manual.html#Using_Custom_Login_Modules

* apollo.xml 為系統主要設定檔, 可以針對 access_rule 設定權限
ex: 允許群組 admins 可以操作所有的動作
access_rule action="*" allow="admins"ex: 允許群組 monotors  可以操作連線及觀看系統狀態的功能
access_rule action="connect monitor" allow="monitors"
ex: 允許群組 appusers 可以操作連線、建立、送出、接收訊息
access_rule action="connect create send receive consume" allow="appusers"
ex: 允許群組 appusers 可以操作連線、建立、接收訊息
access_rule action="connect create  receive consume" allow="users"
透過這樣的區隔,可以仔細的分別設定不同的權限群組。

# 設定個別使用者的密碼,也可以用加密 ENC 方式設定
[root@dev etc]# grep -v '#' users.properties
# 帳號=密碼
mtchang=密碼
demo=密碼
app1=密碼

# 將使用者,分配到不同的群組,一個群組如果需要很多人可以使用 | 符號連接。
[root@dev etc]# grep -v '#' groups.properties
admins=mtchang
monitors=admin
users=demo
appusers=app1


# 以上,這樣 server 端就好了。
// --------------------------------------------------

* 客戶端工具有很多選擇, 我找了一個 STOMP Over WebSocket 的專案,使用 browser 就可以用了。
http://jmesnil.net/stomp-websocket/doc/
這個有說明如何使用 websocket api 來操作


* 主要我想要做一個線上即時聊天的界面,從 github 上找到 jmesnil 的 source code
https://github.com/jmesnil/stomp-websocket/tree/master/example
然後,小小修改一下。

我的個人小小聊天室,就出現了。你只要開兩個 browser 就可以自己和自己聊天了。

http://jangmt.com/stompchat/chat/  (純接收訊息)
http://jangmt.com/stompchat/chat/send.php  (送出訊息測試)


// 發送訊息到指定的 STOMP broker
// ----
$user = "app1";
$password = "密碼";
$host = "主機.jangmt.com";
$port = 61613;
$destination  = '/topic/chat.general.demo';
$message_body1 = '5秒消失_'.date(DATE_RFC2822);
$message_body2 = 'sticky:黏住桌面'.date(DATE_RFC2822);
try {
  $url = 'tcp://'.$host.":".$port;
  $stomp = new Stomp($url, $user, $password);
  $stomp->send($destination, $message_body1);
  $stomp->send($destination, $message_body2);
  //$stomp->send($destination, "SHUTDOWN");
} catch(StompException $e) {
  echo $e->getMessage();
}
?>





這個中介軟體 Apache  Apollo 伺服器端的界面長成這樣,可以看到線上使用者的資源使用狀況。





// --------------------------------------------------
// 如果你的需求是在 php 上面,要撈一些 data 訊息,可以參考下面的資訊
// PHP 官方網站都有說明了
http://php.net/manual/en/book.stomp.php

// 在 PHP 上面執行,可以參考 wiki 上面的說明
http://nrodwiki.rockshore.net/index.php/PHP_Examples

// client 端 , 也可以用 php 記得裝 stomp 套件。
# yum install php71-php-pecl-stomp
// 驗證
# php71 -i | grep stomp
/etc/opt/remi/php71/php.d/40-stomp.ini,
stomp.default_broker => tcp://localhost:61613 => tcp://localhost:61613
stomp.default_connection_timeout_sec => 2 => 2
stomp.default_connection_timeout_usec => 0 => 0
stomp.default_password => no value => no value
stomp.default_read_timeout_sec => 2 => 2
stomp.default_read_timeout_usec => 0 => 0
stomp.default_username => no value => no value

以上經驗分享,打完收工。使用比較有經驗後再來分享使用心得。
該繼續寫程式了。....XDXD

2016/11/24

Enom DNS 服務的動態 dns 更新


Enom DNS 服務的動態 dns 更新

圖跟內文無關


最近因為工作關係,租了一台韓國的 aws 主機來當 vpn 服務,想說 ip 也不想固定,弄個動態 ip 更新好了。我的 dns 主機商是 enom 他在網路上有很多的自動更新的 script。

先提供一個有趣的網站,這網站可以用命令列反查所在的對外 public ip 很適合用來寫程式。
https://ifconfig.co/ 命令列及 API 版本的 myip address

另外有一個網站 https://www.ipip.net/ 可以查詢每個 ip 的所在地,是一個很好用的服務。
另外也提供 api 接入的功能,可以很方便的接程式。

官方網站提供的程式,右方有各種平台用的。
http://www.enom.com/help/faq_dynamicdns.asp 

下面是在 github 找到的,其實重點在 enom api server 提供的服務,每個程式只是包裝了一些個人化的需求。
Enom api server
ENOMURL="http://dynamic.name-services.com"

python version:
https://gist.github.com/stef-levesque/11229362

shell version:
https://gist.github.com/h0tw1r3/11405624

php version:
https://github.com/mrubinsk/phpEnomUpdate/blob/master/phpEnomUpdate.php

php 最簡單版本的 update.
https://gist.github.com/agarzon/2431219

// --------------------------------------------
# php 版本的更新程式
[root@ip-172-31-12-22 enom]# cat /root/enom/ip-update.php
#!/usr/bin/php

/* Run this script every 5 minutes (or 1 hour, is up to you) using a cron task */
// ref: https://gist.github.com/agarzon/2431219
/* Edit this data*/
$domain = "網域名稱 example.com ";  
$pass = "密碼";
$host = "A紀錄名稱"; // Optional, for additional hosts names like: ftp., mail. or any sub-domains.

// 底下三行僅供參考
//file_get_contents("http://dynamic.name-services.com/interface.asp?command=SetDNSHost&Zone=@.$domain&DomainPassword=$pass");
//file_get_contents("http://dynamic.name-services.com/interface.asp?command=SetDNSHost&Zone=www.$domain&DomainPassword=$pass");
//file_get_contents("http://dynamic.name-services.com/interface.asp?command=SetDNSHost&Zone=*.$domain&DomainPassword=$pass");
// 寫入 api service ,執行完後去查查看是否有這個 A 紀錄,或是 ip 更新了
file_get_contents("http://dynamic.name-services.com/interface.asp?command=SetDNSHost&Zone=$host.$domain&DomainPassword=$pass");
?>

寫入排程
[root@ip-172-31-12-22 enom]# crontab -l
*/30 * * * * /root/enom/ip-update.php


2016/10/09

PHP session_write_close()


PHP函式 php session_write_close()
End the current session and store session data.
session 的資料需要在 script 結束時才會儲存,所以當有2 個 script 同時執行時,後面的 script 會等前面的 script 執行完成再來跑,如果設定了  session_write_close() 就可以立即告訴程式,我後面的程序不會寫入 session 了,其他程式可以讀取 session 的內容來處理。

好處就是:程序不會被前一個 session 卡住,但是寫入 session 的行為就要很小心的處理。


範例:
http://konrness.com/php5/how-to-prevent-blocking-php-requests/

說明: http://php.net/manual/en/function.session-write-close.php
Session data is usually stored after your script terminated without the need to call session_write_close(), but as session data is locked to prevent concurrent writes only one script may operate on a session at any time. When using framesets together with sessions you will experience the frames loading one by one due to this locking. You can reduce the time needed to load all the frames by ending the session as soon as all changes to session variables are done.

ref:
http://xyz.cinc.biz/2012/01/php-session-lock.html 

2016/10/06

RabbitMQ 實作 AMQP 的開放原始碼訊息代理軟體


RabbitMQ 是一個訊息中介軟體 (broker) 可以接受並轉發訊息,他是 AMQP 的實作。
功能類似郵局機制,類似 unix Email system。
主要處理的存儲、轉發 binary blobs of data (二進制資料)

那 AMQP 它和傳統的 SMTP 差異在哪裡??  重點在可以非同步,並且可靠
ref: http://blogs.mulesoft.com/dev/news-dev/amqp-and-the-future-of-web-messaging/ 

系統中的角色:
訊息發布者 publisher = 訊息消費者 consumer
訊息代理 brokers
訊息生產者 producers

訊息交換模型 (ref: http://rabbitmq.mr-ping.com/AMQP/AMQP_0-9-1_Model_Explained.html )





使用 RabbitMQ 的顧客 https://blog.pivotal.io/channels/data-science-pivotal
Pivotal Labs 原來不只玩 big data 它是一間很有趣的公司呀!!(MADlib 是它開發中的產品..)

因為還不是很熟悉,所以放了很多參考連結:
官方網站 http://www.rabbitmq.com   in github https://github.com/rabbitmq
官方教學 http://www.rabbitmq.com/getstarted.html 
中文教學 http://rabbitmq.mr-ping.com/
WIKI 介紹 https://zh.wikipedia.org/wiki/RabbitMQ
PHP 函式 http://php.net/manual/fa/book.amqp.php 
PHP amqplib in GITHUB https://github.com/php-amqplib/php-amqplib 
Python 函式 https://barryp.org/software/py-amqplib/
使用經驗心得 http://pjack1981.blogspot.tw/2012/08/rabbitmq.html 
介紹 http://lab.howie.tw/2012/07/whats-different-between-amqp-and-jms.html 
AMQP future of web messageing  http://blogs.mulesoft.com/dev/news-dev/amqp-and-the-future-of-web-messaging/

2016/09/20

直接把 html table 轉成可以 search , sort , 翻頁的表格


一個很好用的 Jquery 套件,可以直接把 html table 轉成可以 search , sort , 翻頁的表格,
不用自己寫太多的前端網頁工作。

DataTable  https://www.datatables.net 

Example:
https://www.datatables.net/examples/basic_init/zero_configuration.html


刪減多餘 code 後的簡單範例:
https://mtchang.github.io/test/datatables_example.html

2016/09/19

CentOS7 Linux 安裝給 pokemon bot 使用的 proxy server

CentOS7 Linux 安裝給 pokemon 使用的 proxy server 

Porxy 服務早期是因為網路頻寬小,通常在區網內把重複的流量用 proxy 來取代。
現在則變成一種可以欺騙 web server 客戶端來源 IP 的一個小技巧,有人用於當 bot 爬網站,有人用於分散流量抓迷片。而今天,我把它用來服務 pokemon bot client ,因為一個 bot 抓太慢拉!!! XDXD

* 安裝及設定 Linux 的 Proxy 服務

# 安裝 squid
yum install squid -y

# 編輯設定檔 /etc/squid/squid.conf

nano /etc/squid/squid.conf
# 在這段之後
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
# 放入下面三行規格, ip 請自行更動
acl mynet src 111.32.141.0/24
acl mynet src 111.32.141.0/24
http_access allow mynet

# 啟動
systemctl restart squid 

# 開機預設啟動
systemctl enable squid 

# 確定 port 3128 是否工作
netstat -antlp | grep squid
tcp6       0      0 :::3128        :::*         LISTEN      29062/(squid-1)  

* 設定 pokemon bot , 這裡是以 Ar1i 開發的 PokemonGo-Bot 來當範例。
https://github.com/Ar1i/PokemonGo-Bot/tree/master/Builds-Only 
Ar1i 幾乎每天都在發新的版本,也修正很多 bug ,目前用過感覺最好的 bot 。


Proxy 設定



可以單機開四個 BOT



作者不斷修改更新版本,目前可以線上直接做很多手機的工作了。





PostgreSQL 使用的 timestamp 變更 timezone 很簡單



PostgreSQL 使用的 timestamp 變更顯示的 timezone 很簡單

只要把 select 欄位後方加上  AT TIME ZONE 'EST'  就可以
這裡的  'EST' 指的是美東時間,縮寫可以參考官方說明。
https://www.postgresql.org/docs/8.1/static/datetime-keywords.html 

範例SQL:
SELECT id, transaction_time,to_char((transaction_time AT TIME ZONE 'CCT')  , 'YYYY-MM-DD  HH24:MI:SS' )  as cct_transaction_time,
 to_char((transaction_time AT TIME ZONE 'EST')  , 'YYYY-MM-DD  HH24:MI:SS' )  as est_transaction_time 
 FROM root_memberdepositpassbook WHERE member_id = '45'  ORDER BY est_transaction_time DESC LIMIT 10;


https://www.postgresql.org/docs/9.5/static/functions-formatting.html 
關於欄位的輸出格式官方網站也有說明,可以讓你以你想的方式輸出。直接再 SQL 敘述指定就可以。








-- 北京時間
SELECT enrollmentdate, to_char((enrollmentdate AT TIME ZONE 'posix/Etc/GMT-8'),'YYYY-MM-DD HH24:MI:SS') as enrollmentdate_tz FROM root_member WHERE id = '45';
-- 美東時間
SELECT enrollmentdate, to_char((enrollmentdate AT TIME ZONE 'posix/Etc/GMT+5'),'YYYY-MM-DD HH24:MI:SS') as enrollmentdate_tz FROM root_member WHERE id = '45';
-- 東京時間
SELECT enrollmentdate, to_char((enrollmentdate AT TIME ZONE 'posix/Etc/GMT-9'),'YYYY-MM-DD HH24:MI:SS') as enrollmentdate_tz FROM root_member WHERE id = '45';
-- 列出目前系統的時區列表 ,指列出標準 postfix 的資訊。
select * from pg_timezone_names where name like '%posix/Etc/GMT%'

在 time with timezone 格式中,如果這樣表示時區 +08 的紀錄
2016-07-23 04:24:33.503622+08
* 如果要分別生成屬於美東時間 UTC-05 
* 以及中原標準時間 UTC +08 
* 東京時間 UTC +09
那使用的 timezone addrev 對照的欄位,帶入前面的 參數。
* 中原標準時間 UTC +08 對應  posix/Etc/GMT-8
* 美東時間 UTC-05 對應 posix/Etc/GMT+5
* 東京時間 UTC +09 對應 posix/Etc/GMT-9

則取出後的時間,就是當地的時間了。



2016/08/26

Pokemon GO 有很完整的社群開發論壇及完整的 API code

pokemon go 有很完整的社群開發論壇及完整的 API code,真是令人驚豔..
https://www.reddit.com/r/pokemongodev/ 不論原生公司喜不喜歡,在 github 上面一堆延伸開發的專案,且目前更新都很頻繁,大概三天就出一個版本了...

一開始是想要參考別人 API 怎麼寫的!!!
沒想到先看到 pokemon api , 各種版本都有, 少說有 6 種以上語言支持。
PoMG API by python 2.7
https://github.com/PokeAPI/pokeapi
https://pokeapi.co/docsv2/

然後就研究了一些 bot 在作啥麼....XDXD


-------
pokemon go 預測雷達, 很準.
有神獸出現時只要看 Found By Trainer: (Poke Radar Prediction) 才抓,其餘都是玩家來亂的。
https://www.pokemonradargo.com/

上面這個可能樹大招風,所以有時後會關閉服務或不正常。可以使用。

https://pkget.com/  大家找寶貝

-------
PokeMon GO 進化計算機, 及 pokemon 介紹. 哪些是神獸也可以參考這裡。
https://pokemon.gameinfo.io/tools/evolution-calculator?hl=zh_TW

-------
pokemon go 官方的 PTC 帳號註冊(Pokemon Trainer Club)
https://club.pokemon.com/us/pokemon-trainer-club/sign-up/
可以註冊一個免洗帳號,避免 google account 外流的風險。
因為他的 google  登入需要填入你的 gmaill 帳密,這很有外流的風險。

-------
很紅的 bot NecroBot , C# console for win
-------
最初的的 NecroBot 版本, 被自殺了。 https://github.com/NecronomiconCoding

but 他有被 fork ..XDXD  --> NecroBot Forked v0.9.6
https://github.com/NoxxDev/NecroBot/releases XDXD it goodjob


關於 necrobot 的設定可以參考這一篇:
http://apk.tw/thread-799962-1-1.html

北投公園座標
"DefaultLatitude": 25.136524,
"DefaultLongitude": 121.506284,
"MaxTravelDistanceInMeters": 250

新竹南寮漁港座標
"DefaultLatitude": 24.849289,
"DefaultLongitude": 120.926836,
"MaxTravelDistanceInMeters": 800


-------
necrobotvisualizer 需要搭配 Necrobot 的 GUI  for win
-------
Necrobot / MobBot Visualizer  圖形界面, 吃 NecroBot 的 websocket, 需要搭配 necrobot 跑
https://github.com/nicoschmitt/necrobotvisualizer
圖形界面,用 openstreet 當圖資。可以讓使用者指定走的方向(但不太容易操控),路過 pokestop 及 pokemon 會自動抓

再 windows 下執行,一開始要設定,設定完後如果把 config.json 改一下
把 config.json 的 "UseWebsocket": 改為 true 就可以支援 necrobotvisualizer
  "WebsocketsConfig": {
    "UseWebsocket": true,
    "WebSocketPort": 14251
  },

------------------
基於 Necrobot 的 gui BOT  for win
------------------
necrobot GUI 界面 , 結合 GUI 及 Necrobot 在一起。很詳細的工具。
但是 config.json 及 auth.json  需要自己設定。這會有點難度。
https://github.com/vandernorth/NecroBot.GUI/releases
設定值預設會把你的重複神奇寶貝交換光光....

-------
優先推薦的 bot,這個比較簡單. 可以快速上手.
-------
https://github.com/Ar1i/PokemonGo-Bot/tree/master/Builds-Only
C# 寫的,需要安裝 .net 4.6 以上才可以跑
執行 PokemonGo.RocketAPI.Console.exe 就可以跑.
走路的方法為決定時速(建議4~6)及方圓幾公尺,的範圍為自動搜尋範圍。以地圖方式指定。
帳號建議到 PTC 申請,不要使用預設的 google account 避免被盜帳號。

如果有 google map API key ,可以走道路不會亂走,
裡面有很多細項的參數,例如隨機速度 max and min ,間隔休息,
還有很多 pokemon 的管理、升級、進化等功能都可以操作, IV 值也可以線上直接看。
google map key 可以到 https://console.developers.google.com 申請一個, server key 就可以用了, 如不申請也是可以用的。各位可以試試看巴。

Console 視窗為顯示 log , 圖形界面為 pokemon 管理
延伸:使用 Proxy Server 掛多個 bot 


--------
PokemonGo-DesktopMap for win
--------
PokemonGo-DesktopMap , 需要申請一個 browser map api 給它用
可以顯示 pokestop 及 道館 , 還有沒有撒花都看得出來。但就是只有看而已。
https://github.com/mchristopher/PokemonGo-DesktopMap/releases



--------
Catchem-PoGo for win
--------
這個大概是目前做的最好的 bot ,可以支援多組設定檔,及更多的設定細節。
可以自動走路的路徑,人性化的參數。且支援多個圖資  API ,還可以透過  Telegram bot 來控制 bot .....天呀!太強大了!!!!!
官方網站: https://github.com/Lunat1q/Catchem-PoGo/releases



TIP:
-------
1. 在高雄的話,美術館,是個很棒的起點。 GPS地標: 22.655, 120.284
2. 等級練到 20 後,觀看 IV 值再來決定升 powerup 及 進化 evolvable 的順序。
3. 使用 bot 很容易被鎖帳號,所以還是出去走走巴,鍵盤訓練師是無法道館對戰的。
4. 容易被 ban 的行為: 在同一個 IP 執行超過一個程序,會被 banned 。但是換個 IP 就可以,過段時間也就會放這個 ip 出來,可以透過 proxy 服務來避開。不要很快時間的切換帳號在同一個  IP 上面,否則也是被 banned 。
5. 飛人的行為,我感覺沒那麼好抓。我猜可以是資料量太大,官方對於太小移動,或是頻率不高的飛人不好判斷,所以不會那樣快抓到。
6. 不要連續使用 bot 超過 24HR 那一定會出問題,另外不要用 google account 掛 bot ,可能讓你的 google account 被盜帳號。然後不要長時間移動太快, 例如平均 50KM/HR 的行走不間斷。




Pokemon GO in Linux
---------------------------------
至於 Linux 勒,請自行參考....
https://github.com/mchristopher/PokemonGo-DesktopMap
http://blog.pokemongofun.com/resolved-encrypt-so-is-not-found-please-place-it-in-the-bots-root-directory/



2016.9.4  last update

2016/08/24

pgadmin install in Linux Mint 17.3 ROSA

pgadmin install in Linux Mint 17.3 ROSA



bash <(cat /etc/os-release; echo 'echo ${VERSION/*, /}') | head -n1 | awk '{print "deb http://apt.postgresql.org/pub/repos/apt/",tolower($1)"-pgdg main";}' > /etc/apt/sources.list.d/pgdg.list
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

sudo apt-get update

sudo apt-get install pgadmin3

三行就搞定了,去選單找找看 pgadmin 就升級為 1.21 了。


REF:
http://technobytz.com/how-to-install-postgresql-9-4-in-ubuntu-linux-mint.html

2016/08/20

How disable the touchpad in Linux MINT (暫時關掉觸控板的功能)

用了 NB 最麻煩的就是手滑,不小心摸到觸控板。
找了一下,暫時關閉的方式。



使用 root 權限 , 執行 xinput lst 觀看目前系統上的輸入裝置 id 值

BarkleyMT ~ # xinput list
⎡ Virtual core pointer                     id=2 [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer               id=4 [slave  pointer  (2)]
⎜   ↳ PixArt USB Optical Mouse                 id=11 [slave  pointer  (2)]
⎜   ↳ ETPS/2 Elantech Touchpad                 id=14 [slave  pointer  (2)]
⎣ Virtual core keyboard                   id=3 [master keyboard (2)]
    ↳ Virtual core XTEST keyboard             id=5 [slave  keyboard (3)]
    ↳ Power Button                             id=6 [slave  keyboard (3)]
    ↳ Video Bus                               id=7 [slave  keyboard (3)]
    ↳ Video Bus                               id=8 [slave  keyboard (3)]
    ↳ Power Button                             id=9 [slave  keyboard (3)]
    ↳ Sleep Button                             id=10 [slave  keyboard (3)]
    ↳ Integrated_Webcam_HD                     id=12 [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard             id=13 [slave  keyboard (3)]
    ↳ Dell WMI hotkeys                         id=15 [slave  keyboard (3)]
    ↳ DELL Wireless hotkeys                   id=16 [slave  keyboard (3)]


# 關閉觸控版, ID=14
BarkleyMT ~ # xinput set-prop 14 "Device Enabled" 1

# 打開觸控版 ID=14
BarkleyMT ~ # xinput set-prop 14 "Device Enabled" 0

比 Windows 簡單多了!!!




REF:
https://ask.fedoraproject.org/en/question/7485/how-disable-the-touchpad/  Fedora 的關法
http://www.dell.com/support/article/us/en/19/SLN128938/en#Issue4 DELL上面的 Windows 版本關掉方式

2016/08/03

Linux ubuntu 的 soft raid 1 及 LVM 磁區的資料救援

圖不相關於此文


這幾天停電,發生剛好有一台老 server power 卦掉了。
想說就順便把資料轉移到新的機器上面, 他在還沒死掉前使用的是 ubuntu linux 系統
硬碟使用 soft raid 1 的架構。

硬碟我使用 usb 硬碟外接座,把裝置接到系統上面。可以使用 blkid 看看裝置代號。

epost mnt # blkid 
/dev/sda1: UUID="96d81952-2c1b-4963-98e7-b203f0197686" TYPE="ext4" 
/dev/sda5: UUID="8987b099-e672-4486-ae9c-7ccb12264b7f" TYPE="swap" 
/dev/sdb1: UUID="08cd466a-fdd1-43ea-9f4d-97d12fbed8ae" TYPE="ext4" 
/dev/sde1: UUID="6f575859-37a1-ff61-530b-09d8a1b789b6" UUID_SUB="c601821d-4bf7-0728-83ae-682c29864775" LABEL="bm:0" TYPE="linux_raid_member" 

* 可以看到 type 為 linux_raid_member 的 type 型態,可以使用 mdadm 指令,把這裝置賦予到一個 raid 裝置。

mdadm --assemble --run /dev/md3 /dev/sde1

* 然後再用 mount 將它掛載到目錄就可以存取。
* 但是發現檔案系統竟然是 LVM2_member 的檔案架構, 所以需要用 LVM 的方式操作它。

epost mnt # mount /dev/md3 /mnt/sde
mount: unknown filesystem type 'LVM2_member'

* 看看這個系統的分割區, 是不是有其他裝置。結果竟然全部都沒有合法的分割表。
epost mnt # fdisk /dev/md3 -l

Disk /dev/md3: 1000.2 GB, 1000201904128 bytes
2 heads, 4 sectors/track, 244189918 cylinders, total 1953519344 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/md3 doesn't contain a valid partition table

* 使用  lvmdiskscan 掃描一下系統的裝置
epost mnt # lvmdiskscan 
  /dev/ram0         [      64.00 MiB] 
  /dev/vg-root/root [     931.51 GiB] 
  /dev/ram1         [      64.00 MiB] 
  /dev/sda1         [     461.87 GiB] 
  /dev/ram2         [      64.00 MiB] 
  /dev/ram3         [      64.00 MiB] 
  /dev/md3          [     931.51 GiB] LVM physical volume
  /dev/ram4         [      64.00 MiB] 
  /dev/ram5         [      64.00 MiB] 
  /dev/sda5         [       3.89 GiB] 
  /dev/ram6         [      64.00 MiB] 
  /dev/ram7         [      64.00 MiB] 
  /dev/ram8         [      64.00 MiB] 
  /dev/ram9         [      64.00 MiB] 
  /dev/ram10        [      64.00 MiB] 
  /dev/ram11        [      64.00 MiB] 
  /dev/ram12        [      64.00 MiB] 
  /dev/ram13        [      64.00 MiB] 
  /dev/ram14        [      64.00 MiB] 
  /dev/ram15        [      64.00 MiB] 
  /dev/sdb1         [     465.76 GiB] 
  1 disk
  19 partitions
  0 LVM physical volume whole disks
  1 LVM physical volume

* 用 lvdisplay 觀看系統內的 logical volume 分割表
  epost mnt # lvdisplay 
  --- Logical volume ---
  LV Path                /dev/vg-root/root
  LV Name                root
  VG Name                vg-root
  LV UUID                WWG1Yp-qoIs-HjVd-nJlE-v8H0-PVz1-YvG151
  LV Write Access        read/write
  LV Creation host, time , 
  LV Status              available
  # open                 0
  LV Size                931.51 GiB
  Current LE             238466
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:0


* 掃描一下 , lvm 到底掛載那個表上。 看來 /dev/vg-root/root 是可以使用的裝置代碼
epost mnt # lvscan 
  ACTIVE            '/dev/vg-root/root' [931.51 GiB] inherit

* 所以把這個裝置,掛載到目錄 /mnt/sde/ 使用。就可以把資料挖回來了
mount /dev/vg-root/root /mnt/sde


ref: http://cms.35g.tw/coding/synology-unknown-filesystem-type-linux_raid_member/
ref: http://pissedoffadmins.com/os/mount-unknown-filesystem-type-lvm2_member.html

2016/07/10

PostgreSQL的數值資料型態(Numeric Data Types)

PostgreSQL的數值資料型態(Numeric Data Types)

今天仔細看數值資料型態時,才仔細看到 postgresql 的數值型態其中一種為 numeric 的型態,中文翻譯為「任意精度數值」,一直間無法理解他的意思,後來才發現它可以讓用戶自行定義十進位的位數及小數點後面的位數。難怪科學運算都喜歡用 postgresql DB 來操作,一般生活中的應用實在太少運用到麼大的需求。

在最新的 9.5 版它的範圍描述是這樣寫的

up to 131072 digits before the decimal point; up to 16383 digits after the decimal point

如果我解讀沒錯的話,在小數點前可以 131072 位數,在小數點後為 16383 位數。大概以後只有十兆換一塊的通膨才有可能有機會用到了(誤)。



例如:

數字 23.5141精度(precision)為 6 而比例(scale)為 4

宣告格式為:
NUMERIC(precision, scale)
NUMERIC(6, 4)



在 pgadmin 工具中的設定範例如下:


程式語言上運算的問題:

但其實宣告了這個欄位型態後,匯衍生出另一個問題。就是 DB 可以操作這個數字運算操作,但是程式語言有困難呀!!!找了一下,好像 PHP 的 BCMATH 好像可以解決任意精確度運算的這個問題,下次有遇到再來研究巴。


2016/07/09

Linux command 測試網路速度

Linux command 測試網路速度

原始碼 in https://github.com/sivel/speedtest-cli

# 安裝及執行
wget -O speedtest-cli https://raw.github.com/sivel/speedtest-cli/master/speedtest_cli.py
chmod +x speedtest-cli
./speedtest-cli

# 執行範例
[root@dev dl]# ./speedtest-cli
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from TANet (111.111.11.111)...
Selecting best server based on latency...
Hosted by Chief Telecom (Changhua) [67.67 km]: 19.85 ms
Testing download speed........................................
Download: 798.55 Mbit/s
Testing upload speed..................................................
Upload: 185.07 Mbit/s



2016/07/03

將 github 的 code 分享到 blog 使用

(1) 首先要有個 github 的帳號

 (2) 登入 https://gist.github.com/

 (3) 貼上程式碼, 選取左上角的 Embed code



(4) 然後就長的像是下面一樣



2016/06/26

Redis-Server with PHP 的使用 in CentOS7

Redis-Server with PHP 的使用 in CentOS7

* Redis DB server 的用途
Redis 是一個 key-value 架構的 database , 且因為它工作在記憶體上面,所以速度非常的快。
可以用來當 DB cache 加速的功能或是需要快速反應的 DB

* CentOS 7 的 Redis-server 安裝方式
# yum install redis -y 
* 安裝參考
http://sharadchhetri.com/2014/10/04/install-redis-server-centos-7-rhel-7/

* 通常會搭配 php 等 client 端工具一起安裝, 這裡我是以 php56w 的版本安裝, 因為有比較多 lib 支援
# yum install php56w-pecl-redis
* php56w 可以參考 webtatic 釋出的 yum repo 安裝參考 https://webtatic.com/packages/php56/ RHEL7 OR EPEL7  官方網站跑的版本有點慢,可以先參考這個版本。

* 啟動
# systemctl start redis.service
* 預設開機啟動
# systemctl enable redis.service
* 看狀態
# systemctl status redis.service

* 測試 , 剛裝好的 redis-server 是沒有密碼的, 且只能 127.0.0.1 執行。 可以用 redis-cli client 端工具測試 PONG 是正確的回應。
[root@c7 ~]# redis-cli ping
PONG

* 所以我都會設定個密碼, 並且把 bind 打開讓所有人都可以連上來。
* 請找到下面兩行, 修改為你要的密碼及主機 ip
# vim /etc/redis.conf
bind 111.111.22.22
requirepass 123456

* 重新啟動
# systemctl restart redis.service

* 驗證看看 port , 應該是 6379
# netstat -antlp | grep redis
tcp        0      0 111.111.22.22:6379     0.0.0.0:*               LISTEN      22326/redis-server

* 加了密碼的測試
# redis-cli -a '123456' -h 111.111.22.22 ping
PONG

* man page 內的 Examples , 不帶密碼的測試, 可以試試看
  cat /etc/passwd | redis-cli -x set mypasswd
  redis-cli get mypasswd
  redis-cli -r 100 lpush mylist x
  redis-cli -r 100 -i 1 info | grep used_memory_human:
  redis-cli --eval myscript.lua key1 key2 , arg1 arg2 arg3
  redis-cli --scan --pattern '*:12345*'

* 專案網站 http://redis.io/
* 文件網站:http://redis.io/documentation
* 中文翻譯的教學文件(redis-cli) http://www.runoob.com/redis/redis-tutorial.html
* Redis 中文文件 https://www.gitbook.com/book/wizardforcel/redis-doc/details

* 通常會裝個 REDIS 桌面管理工具來觀看, 否則看不到東西怪怪的 http://redisdesktop.com/download











----------------------------------------
* PHP 在 REDIS 上面的操作
----------------------------------------

* 在 php 上面有個 phpredis/phpredis 的函式庫, 可以讓你利用他來寫 redis 上面的程式
* https://github.com/phpredis/phpredis github 上面的 readme 就是使用的方式, 幾乎可以很完整的操作了

使用 php + redis server 模擬 session 的動作
https://github.com/mtchang/code/blob/master/redis_session.php



* 可以使用 phpRedisAdmin 工具, 從網頁觀看 redis 的使用狀況
https://github.com/erikdubbelboer/phpRedisAdmin 原始碼位置,此工具可以用 composer 安裝。

PHPRedisAdmin 網頁界面看 redis session 程式


* 可以 把 PHP 的 session handler 改用 redis server 紀錄
方法如這裡 https://github.com/phpredis/phpredis#php-session-handler

* 直接修改 php.ini 檔案,找到 session 這段, 設定完成後 restart httpd or php-fpm 就可以
# vim /etc/php.ini
[Session]
; 支持 redis db 的 php session
session.save_handler = redis
session.save_path = "tcp://111.111.22.22:6379?auth=123456"

* 也可以寫成類似這樣, 當多台主機同時用時可以分散負載.
;session.save_path="tcp://127.0.0.1:11211?persistent=1&weight=1&timeout=1&retry_interval=15″
* 在 centos7 實際執行時發現, 因為 php.ini 有很多地方都有放, 要注意不同的設定檔蓋掉這個設定。

PHPSESSION 再 redis 上的顯示

# 當網頁可以執行 phpinfo(); 會有有安全性風險 , 有可能洩漏你的認證密碼, 建議多設定防火牆防外賊。
[root@c7 etc]# php -i | grep session
.... skip ....
session.save_path => tcp://111.111.22.22:6379?auth=123456 => tcp://111.111.22.22:6379?auth=123456
.... skip ....

* 建議設定 iptalbes 範例
# 擋掉特定 ip , 允許特定 ip, 開啟 port
EXTIF="enp2s0f0" # 系統對外網卡
iptables -A INPUT -p TCP -s 111.111.69.0/24 --dport  6379 --sport 1024:65534 -j ACCEPT # redis accept
iptables -A INPUT -p TCP -i $EXIT  --dport  6379 --sport 1024:65534 -j REJECT # redis reject

# 效能測試
# redis-benchmark -a '123456' -h 111.111.22.22 -c 1000 -n 100 -q
PING_INLINE: 3703.70 requests per second
PING_BULK: 7692.31 requests per second
SET: 4347.83 requests per second
GET: 8333.33 requests per second
INCR: 11111.11 requests per second
LPUSH: 8333.33 requests per second
LPOP: 3703.70 requests per second
SADD: 9090.91 requests per second
SPOP: 8333.33 requests per second
LPUSH (needed to benchmark LRANGE): 4347.83 requests per second
LRANGE_100 (first 100 elements): 3448.28 requests per second
LRANGE_300 (first 300 elements): 9090.91 requests per second
LRANGE_500 (first 450 elements): 8333.33 requests per second
LRANGE_600 (first 600 elements): 7142.86 requests per second
MSET (10 keys): 8333.33 requests per second

* 使用 redis 來當成 php session handler in Ubuntu
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-redis-server-as-a-session-handler-for-php-on-ubuntu-14-04

* 可以用來做統計的 
piwik http://demo.piwik.org/

* redis 統計工具
https://github.com/junegunn/redis-stat

* 程式開發參考
http://www.cnblogs.com/ikodota/archive/2012/03/05/php_redis_cn.html
https://github.com/phpredis/phpredis
https://scotch.io/tutorials/getting-started-with-redis-in-php
http://www.runoob.com/redis/redis-hashes.html

2016/06/04

53 分鐘

今天看到一個數字, 53 分鐘. 就想到 Amazon Route 53 (http://aws.amazon.com/tw/route53/)

小小的算了一下
一年的時間 60*24*365.25=525,960 分鐘
可用性指標 = (1-故障時間/整年分鐘)*100%
99.99=(1- X/525960)*100%
X = 53分鐘

所以  Route53 應該是Amazon很委婉的表達他是 99.99% 的網站可用性...

好巴,算你有囂張的本錢。

2016/04/18

建立一個 postgresql 帳號 with MADLIB 的範例:


以 http://ooxx.db.com.tw/phpPgAdmin/  phpPgAdmin 當範例
 建立一個 postgresql 帳號 with MADLIB 的範例



(1) 因為系統內已經有個 hadoop 帳號建立 MADLIB 的函數
以這個當範本就可以. 否則重新匯入需要 super user 帳號會很不方便。
如果需要重新建立,請參考  http://blog.jangmt.com/2016/04/madlib-postgresql-94-in-linux.html 文章設定。


(2) 建立的 SQL 範例 , 需要一行一行填入. 預設不允許多行一起進入 sql
-- 建立使用者
CREATE USER 帳號 WITH PASSWORD '密碼';
-- 建立資料庫
CREATE DATABASE 帳號(同DB) WITH OWNER 帳號 ENCODING 'UTF8' TEMPLATE hadoop;
-- 註解 DB , 方便找人
COMMENT ON DATABASE 帳號 IS '使用者資訊註解';
-- 授權
GRANT ALL PRIVILEGES ON DATABASE 帳號 to 帳號(同DB);

(3) sql 範例如下:
CREATE USER b004021234 WITH PASSWORD '1234atl1234';
CREATE DATABASE b004021234 WITH OWNER b004021234 ENCODING 'UTF8' TEMPLATE hadoop;
COMMENT ON DATABASE b004021234 IS '蔡ooxx 0926123456';
GRANT ALL PRIVILEGES ON DATABASE b004021234 to b004021234;

(4) 如果要一次建立很多人,那就以此範本寫成批次處理就可以。


REF:
http://blog.jangmt.com/2016/04/madlib-postgresql-94-in-linux.html 
http://madlib.incubator.apache.org/

2016/04/16

更換家用抽水馬達紀錄

更換家用抽水馬達紀錄(以加壓馬達替代) ,身為一個專業的 IT 人員,更換一下設備也是很正常的。

昨晚洗澡到一半,突然發現水量變小了。感覺好像有點不妙,上樓檢查了一下。發現三年前安裝的那台 AQ200 馬達的電子LED沒有亮燈,但是電力 110V 有進入馬達。猜想說該不會電路板燒了巴!!!  因為水龍頭還有水只是水量沒有加壓,且已經很晚了就先這樣隔天早上在處理。到了更晚的時候發現不是水量變小,是整個沒水了。一時間無法找到原因,只能上網找找看答案。



根據官方網站的判斷,我先懷疑機器故障,隔天早上直接就去買台新的大井 HQ200 ($3000)1/4HP準備更換機器,但要換的時候才發現竟然是水塔沒水,檢查液位開關發現都沒有反應,手動開關還是無法出水。

開始懷疑是樓下抽水馬達的問題,馬上再去換了台大井 HQ400 ($3500)1/2HP的機器。原本這台 木川KQ400 前幾天聽他的馬達生,就感覺怪怪的要轉不轉的。

抽水馬達 木川KQ400 ,左方開關為連接到水塔的液位開關。

先確認電力有進入,但馬達不能動作。google查了很多人的狀況,都說可能是壓力感應開關有問題,所以我先依據網路上的教學,拔除開關 Q 這條線,以一字起直接將兩個 pin 測試短路,但還是無法啟動,所以就懷疑應該是馬達真的掛了,用了快 10 年掛掉應該也合理啦。

測試是否為KQ400 的壓力感應開關故障

新品 大井 HQ400
很重要:更換前,請先把抽水馬達的電源開關,從開關箱處關閉。

直接拆掉舊有的 KQ400 ,管口、固定位位置幾乎都一樣。

現在的電壓選擇變得更方便了,直接一個開關就決定 110V or 220V 了。

再把110V電力接上去就可以,安裝前記得先打開自來水公司的來源水閘,上方水管是往水塔打水。左方開關是接到頂樓水塔的液位開關,頂樓液位開關滿水位關閉,馬達沒電也就不會啟動了。
注水塞


後記:
1. 下方水管閘閥為自來水公司的水,直接打開就有水了更換前記得要關閉。

2. 送電前先把機器上面的注水塞打開,注滿水。也可以打開下方水管閘閥注水,這樣比較快。

3. 送電後,試著旋開 1/4 注水塞,看有沒有水噴出來,有噴出來表示抽水正常運作。

4. 因為是水塔整個沒水,所以需要等個 30 ~ 90 分鐘,等水塔裝滿後並送水到水管內。一開始水管內因為之前水都流光了,所以剛開水會有些空氣或是濁水(水塔沒洗),水量很小。

5. 當水塔打滿水,水管注滿水後,原本加在頂樓的 AQ200 加壓馬達就回復工作了,我想這可能是它之前水壓不足自動保護休息了!!!!

6. 還好這次沒有爆水管,只是找問題花了一些時間。換完馬達後等待一段時間就正常了。

7. 如果仔細看大井的說明,發現這次的抽水馬達型號還是加壓馬達用途,我猜測應該是大家為了安全,寧可使用這種有自動保護裝置的加壓馬達,避免自來水公司停水,然後馬達還傻傻的轉到燒掉巴。



延伸閱讀:
第二次更換加壓馬達AQ200 http://blog.jangmt.com/2013/03/2.html
第一次更換加壓馬達及爆水管更換 http://blog.jangmt.com/2010/02/diy.html




2016/04/01

Postgresql 上面的「尿布、啤酒、星期五」,不用寫程式下行 SQL 就搞定


MADlib + postgresql 9.4 in Linux CentOS 7
MADlib®: Big Data Machine Learning in SQL for Data Scientists

啤酒、尿布、星期五


MADlib 在 postgresql 上面以是以 postgres 函式的型態來實現對於數據資料的操作,你可以透過這個以 plpython 語言寫的函式,直接操作原始數據轉存到新的資料庫當中,這個函式庫支援很多機器學習的演算法,可以很方便的分析數據. 目前提供的有底下這些,看起來應該有陸續發展的可能,因為已經被放到 Apache 基金會的子項目計畫內了...XDXD

功能:
Classification 分類
Regression 回歸
Clustering 集群
Topic Modeling 主題模型
Association Rule Mining 關聯性規則
Descriptive Statistics 描述性統計
Validation 驗證

more... http://madlib.net/product/


官方網站 http://madlib.net/

我使用來安裝的版本是 CentOS Linux 7 ,但是安裝這個 LIB 前請先選擇一套支援的資料庫系統,這裡我用的是 Postgresql 9.4 的版本,安裝請參考這一篇:
http://blog.jangmt.com/2016/03/postgresql-94-in-centos-linux-7.html

下載 http://madlib.net/download/

安裝
[root@c7 ~]#  yum install madlib-1.8-Linux.rpm  -y

檢查是否裝了,安裝好後他的路徑放在 /usr/local/madlib/
[root@c7 ~]# rpm -qa | grep madlib
madlib-1.8-1.x86_64


我使用 Single Node 的模式,系統需求:( HAWQ >= 1.2, Greenplum >= 4.2 or PostgreSQL >= 9.2 )

在安裝後,這特 MADlib 必須搭配資料庫才可以使用,所以必須做一個匯入函式到資料庫的動作。

madlib 是 PostgreSQL 的自訂函數  ,它會透過 plpython2 在 postgresql 內產生自訂的函式。

centos7 預設安裝沒裝 plpython2 ,補安裝
[root@c7 ~]# yum install postgresql94-plpython -y
# 安裝好後,透過 madpack 將建立好的個人資料庫,匯入成為 postgresql 的函式。
# 由於此 lib 支援兩種的資料庫(postgres or Pivotal Greenplum) ,但這裡以 postgres 為主
# 安裝語法: madpack install -s madlib -p 資料庫種類 -c 帳號@主機:5432/資料庫
# 建議使用者,一人一個帳號,一個資料庫彼此的獨立,這樣才不會相互干擾。底下這個範例,我已經建立了一個個人的帳號及資料庫了。
# 帳號:  mtchang
# 主機:  127.0.0.1
# 資料庫:  mtchang

[mtchang@c7 ~]$ /usr/local/madlib/bin/madpack install -s madlib -p postgres -c mtchang@127.0.0.1:5432/mtchang
Password for user mtchang:  ooxx
madpack.py : INFO : Detected PostgreSQL version 9.4.
madpack.py : INFO : *** Installing MADlib ***
madpack.py : INFO : MADlib tools version    = 1.8 (/usr/local/madlib/Versions/1.8/bin/../madpack/madpack.py)
madpack.py : INFO : MADlib database version = None (host=127.0.0.1:5432, db=mtchang, schema=madlib)
madpack.py : INFO : Testing PL/Python environment...
madpack.py : INFO : > Creating language PL/Python...
madpack.py : INFO : > PL/Python environment OK (version: 2.7.5)
madpack.py : INFO : Installing MADlib into MADLIB schema...
madpack.py : INFO : > Creating MADLIB schema
madpack.py : INFO : > Creating MADLIB.MigrationHistory table
madpack.py : INFO : > Writing version info in MigrationHistory table
madpack.py : INFO : > Creating objects for modules:
madpack.py : INFO : > - array_ops
madpack.py : INFO : > - bayes
madpack.py : INFO : > - crf
madpack.py : INFO : > - elastic_net
madpack.py : INFO : > - linalg
madpack.py : INFO : > - pmml
madpack.py : INFO : > - prob
madpack.py : INFO : > - quantile
madpack.py : INFO : > - sketch
madpack.py : INFO : > - svd_mf
madpack.py : INFO : > - svec
madpack.py : INFO : > - tsa
madpack.py : INFO : > - conjugate_gradient
madpack.py : INFO : > - data_profile
madpack.py : INFO : > - lda
madpack.py : INFO : > - stats
madpack.py : INFO : > - svec_util
madpack.py : INFO : > - utilities
madpack.py : INFO : > - assoc_rules
madpack.py : INFO : > - cart
madpack.py : INFO : > - convex
madpack.py : INFO : > - glm
madpack.py : INFO : > - kernel_machines
madpack.py : INFO : > - linear_systems
madpack.py : INFO : > - recursive_partitioning
madpack.py : INFO : > - regress
madpack.py : INFO : > - sample
madpack.py : INFO : > - summary
madpack.py : INFO : > - kmeans
madpack.py : INFO : > - pca
madpack.py : INFO : > - validation
madpack.py : INFO : MADlib 1.8 installed successfully in MADLIB schema.

# 這樣就完成了!!!!

# 來個範例試試看 ,我找了一下看到了 Association rules ,這個比較熟悉所以使用這個當練習。
參考:http://doc.madlib.net/latest/group__grp__assoc__rules.html#examples

(1) 先由 SQL 匯入一些資料看看

DROP TABLE IF EXISTS test_data;
CREATE TABLE test_data (
    trans_id INT,
    product TEXT
);
INSERT INTO test_data VALUES (1, 'beer');
INSERT INTO test_data VALUES (1, 'diapers');
INSERT INTO test_data VALUES (1, 'chips');
INSERT INTO test_data VALUES (2, 'beer');
INSERT INTO test_data VALUES (2, 'diapers');
INSERT INTO test_data VALUES (3, 'beer');
INSERT INTO test_data VALUES (3, 'diapers');
INSERT INTO test_data VALUES (4, 'beer');
INSERT INTO test_data VALUES (4, 'chips');
INSERT INTO test_data VALUES (5, 'beer');
INSERT INTO test_data VALUES (6, 'beer');
INSERT INTO test_data VALUES (6, 'diapers');
INSERT INTO test_data VALUES (6, 'chips');
INSERT INTO test_data VALUES (7, 'beer');
INSERT INTO test_data VALUES (7, 'diapers');


(2) 先建立一個 myschema 的 schemas(模式),再來執行下面的指令。



(3) 使用 Association rules 函式庫
# 關聯性規格則請參考這一篇: http://blog.jangmt.com/2015/10/fpgrowth-algorithm.html
# 函式用法:
assoc_rules_results assoc_rules (
float8 support, (支持度)
float8 confidence, (信心)
text tid_col, 欄位 tid
text item_col, 欄位 item
text input_table, (來源資料表格)
text output_schema, (運算後輸出的 schema)
boolean verbose 有沒有 comments
)
# 範例:
SELECT * FROM madlib.assoc_rules( .25,.5,'trans_id','product','test_data','myschema',TRUE);



(4) Association rules 針對 test_data 產生的結果
# 產生的結果,會放在 myschema 內,也可以用這個 sql 來觀看
# sql 觀看結果
SELECT * FROM myschema.assoc_rules ORDER BY support DESC;



更多閱讀:
官方的安裝手冊 https://github.com/madlib/madlib/wiki/Installation-Guide
Association rules 函式庫 http://doc.madlib.net/latest/assoc__rules_8sql__in.html

2016/03/29

將 CSV 檔案加上 UTF BOM 讓它可以在 Windows 被 EXCEL 正確的開啟沒有亂碼的問題


將 CSV 檔案加上 UTF BOM 讓它可以在 Windows 被 EXCEL 正確的開啟沒有亂碼的問題

在 UTF-8 文件中放置 BOM 主要是微軟系統的習慣。但是真的沒有必要帶拉!!!!

http://stackoverflow.com/questions/2223882/whats-different-between-utf-8-and-utf-8-without-bom
According to the Unicode standard, the BOM for UTF-8 files is not recommended:

圖片和內文不太相關



下面提供一種在 windows 上面,政治正確的解法。 XDXD

// ========================================================
// 產生現在的秒數
$time_string = date("YmdHis");

// 寫入 utf8 with BOM
function writeUTF8File($filename,$content)
{
    $f = fopen($filename, 'w');
    fwrite($f, pack("CCC", 0xef,0xbb,0xbf));
    fwrite($f,$content);
    fclose($f);
}

$f = 'uploads/private/'.$time_string.'.csv';
$fdir = 'uploads/private/';

// 檔案不存在就先建立檔案
if (!file_exists($fdir)) {
    mkdir($fdir);
}

writeUTF8File($f,$csv);

echo 'CSV 輸出完成,請點選連結下載。
';
// ========================================================

2016/03/28

取得 mysql 資料表中的「欄位名稱」以及「欄位註解」

取得 mysql 資料表中的「欄位名稱」以及「欄位註解」

在 MySQL 資料庫中,宣告資料表的過程,可以一併把欄位名稱寫在 COMMENT 選項中,如果在程式可以把這個 COMMENT 也抓出來配合欄位的名稱,可以產生自動把整個表 DUMP 出來成為一個 CSV 不就很方便。

圖片和內文不太相關


// -----------------------------------------------
$table='表格名稱';

// 資料庫中表的欄位抬頭資訊
$col_sql = "SELECT COLUMN_NAME,COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '$table';";
$col = runSQL($col_sql);
// var_dump($col);

// 資料欄位
$sql = "SELECT * FROM `$table` WHERE 1;";
$row = runSQL($sql);
// var_dump($row);

$csv = '';

// 欄位名註解
//echo "

";
for($i=1;$i<$col[0];$i++){
//echo $col[$i]->COLUMN_COMMENT.", "; 
$csv = $csv.$col[$i]->COLUMN_COMMENT.", ";
}
$csv = $csv."\n";

// 欄位名稱
//echo "

";
for($i=1;$i<$col[0];$i++){
//echo $col[$i]->COLUMN_NAME.", "; 
$csv = $csv.$col[$i]->COLUMN_NAME.", ";
}
$csv = $csv."\n";

// 資料列取得欄位
//echo "

";
for($j=1;$j<$row[0];$j++){
for($i=1;$i<$col[0];$i++){
$k = $col[$i]->COLUMN_NAME;
//echo $row[$j]->$k.', ';
$csv = $csv.$row[$j]->$k.', ';
}
$csv = $csv."\n";
//echo "
";

}

//echo "

";
//echo " 共有 $i 欄  $j 列
";

$csv = $csv."\n 共有 $i 欄  $j 列 \n";

echo nl2br($csv);
// -----------------------------------------------

* 同時放在 github https://github.com/mtchang/ITCNotes/blob/master/mysql_get_tableinfo2csv
* runSQL() 函式請參考這一篇 http://blog.jangmt.com/2016/03/mysql-php-mysql-pdo.html