2013年12月19日 星期四

ubuntu networking interface 設定


使用情境:
  • eth0固定網卡 / wlan0無線網卡 各一
  • 配置固定IP (eth0: 192.168.1.XX / wlan0: 192.168.1.YY)
  • private network : 192.168.1.XXX
  • gateway : 192.168.1.1

/etc/network/interfaces 設定檔內容:

auto lo
iface lo inet loopback
iface eth0 inet static
address 192.168.1.XX
netmask 255.255.255.0
gateway 192.168.1.1

allow-hotplug wlan0
iface wlan0 inet static
wpa 2
wpa-ssid <YOUR_SSID>
wpa-psk <YOUR_PASSWORD>
address 192.168.1.YY
netmask 255.255.255.0
gateway 192.168.1.1


*以上也適用 Raspberry Pi / Wheezy 環境

#

2013年11月29日 星期五

Mac OS X 安裝及使用  Homebrew

ubuntu apt 用習慣的朋友,應該也能很快適應 Homebrew for Mac OS X的。

安裝步驟參考官網及實際經驗筆記如下:
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"
> brew update

接著就能安裝自己想要的 UNIX Packages,如:wget, curl, lynx ...
> brew install wget
> brew install lynx

查詢經安裝的套件列表 
> brew list

或是想要移除已經安裝的套件
> brew uninstall wget

自動更新已經安裝的套件
> brew upgrade wget

其他功能可以藉由Help看指令參數及用法 
> brew help


延伸閱讀: 

#

2013年11月18日 星期一

Ubuntu precise amd64 安裝筆記


# apt-get update & 
sudo apt-get -y update
sudo apt-get dist-upgrade
sudo apt-get --no-install-recommends -y install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev libgdbm-dev ncurses-dev automake libtool bison subversion pkg-config libffi-dev vim

# install python
sudo apt-get install build-essential
sudo apt-get install libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev
cd /tmp
wget http://python.org/ftp/python/2.7.6/Python-2.7.6.tgz
tar -xvf Python-2.7.6.tgz
cd Python-2.7.6
./configure
make
sudo make altinstall

# install easy_install for python 2.7
cd ..
sudo apt-get install python-setuptools

# install Flask for python
sudo easy_install Flask

# prepare to install uwsgi, nginx
sudo useradd -r -g www-data -s /bin/false uwsgi
sudo mkdir -p /var/www/myapp
sudo chown uwsgi:www-data /var/www/myapp -R
sudo useradd -G www-data myuser
sudo usermod -a -G www-data myuser

# install uwsgi
sudo pip install uwsgi
sudo mkdir -p /var/log/uwsgi
sudo touch /var/log/uwsgi/myapp.log
cd /var/www/myapp
sudo vi uwsgi.xml
sudo /usr/local/bin/uwsgi -x uwsgi.xml

# install nginx
sudo apt-get install nginx
sudo service nginx start
cd /etc/nginx/
cd sites-enabled/
sudo vi default


uwsgi.xml

<?xml version="1.0"?>
<uwsgi id="myapp">
  <module>application:app</module>
  <socket>/tmp/uwsgi.sock</socket>
  <socket>127.0.0.1:8000</socket>
  <processes>4</processes>
  <chdir>/var/www/myapp</chdir>
  <pidfile>/tmp/myapp.pid</pidfile>
  <daemonize>/var/log/uwsgi/myapp.log</daemonize>
  <stats>/tmp/myapp.stats</stats>
  <log-format>``%(addr) - %(user) [%(ltime)] "%(method) %(uri) %(proto)" %(status) %(size) `` "%(referer)" "%(uagent)"</log-format>
  <uid>uwsgi</uid>
  <gid>www-data</gid>
  <chmod-socket>775</chmod-socket>
</uwsgi>

/etc/nginx/sites-enabled/default

server {
        listen 8080;
        root /var/www/myapp;
        server_name myapp;

        try_files $uri @uwsgi;
        location @uwsgi {
                include uwsgi_params;
                uwsgi_pass unix:/tmp/myapp.sock;
        }
}


2013年11月14日 星期四

安裝 elasticsearch 與 python client for elasticsearch

安裝 elasticsearch

官網下載 http://www.elasticsearch.org/download/

解開壓縮檔後,至bin目錄下即可執行啟動 elasticsearch

> elasticsearch.bat 或 > elasticsearch.sh


安裝 urllib3 package

> easy_install urllib3 或 > pip install urllib3

或至官網下載https://pypi.python.org/pypi/elasticsearch

接著利用下列程式測試一下...
# -*- coding: utf-8 -*-

import urllib3
http = urllib3.proxy_from_url('http://proxy.hinet.net/')
r = http.request('GET', 'http://tekibrain.blogspot.com/')

print r.status # 正常的話應該會印出 '200',網站傳回 HTTP Return code '200'
print r.data # 印出網頁原始碼資料



安裝 python client for elasticsearch package

> easy_install elasticsearch
或者
> pip install elasticsearch

或至官網下載 https://pypi.python.org/pypi/urllib3

接著利用下列程式 estest.py 測試一下...
# -*- coding: utf-8 -*-

from datetime import datetime
from elasticsearch import Elasticsearch

# 預設連線至 ElasticSearch Server Port 9200,  localhost:9200
es = Elasticsearch()

# 加入資料進行索引, 自己設定  id = 1
# http://localhost:9200/social/tweet/1
setdata = es.index(index="social", doc_type="tweet", id=1, body={"content": "大家好","user":{"name":"老王","id":670085},"tags":["demo","test"], "timestamp": datetime.now()})
print 'set data => ' 
print setdata
setdata = es.index(index="social", doc_type="tweet", id=2, body={"content": "大家好2","user":{"name":"小王","id":670086},"tags":["demo","test2"], "timestamp": datetime.now()})
print 'set data => ' 
print setdata


#  取得 id=1 資料
getdata = es.get(index="social", doc_type="tweet", id=1)['_source']
print '-------------------------'
print 'get data <= ' 

es.indices.refresh(index="social")
# Search:
qdoc = {
 "query": {
  "match" : {
   "tags" : "demo"
  }
 }
}
getdata = es.search(index="social", body=qdoc)
print 'get data <= '
#print type(getdata)
print("Got %d Hits:" % getdata['hits']['total'])
for hit in getdata['hits']['hits']:
    print("%(content)s %(user)s: %(tags)s" % hit["_source"])


測試成功結果 (timestamp依照系統時間而不同)
> python estest.py
set data =>
{u'_type': u'tweet', u'_id': u'1', u'ok': True, u'_version': 44, u'_index': u'social'}
set data =>
{u'_type': u'tweet', u'_id': u'2', u'ok': True, u'_version': 42, u'_index': u'social'}
-------------------------
get data <=
get data <=
Got 2 Hits:
大家好2 {u'name': u'\u5c0f\u738b', u'id': 670086}: [u'demo', u'test2']
大家好 {u'name': u'\u8001\u738b', u'id': 670085}: [u'demo', u'test']

#

2013年11月4日 星期一

Python 2.7 進行 datetime 加減(timedalta)及設定輸出格式(strftime)


  1. 設定 someday = datetime.date(2013,10,28)
  2. datetime.timedelta(days = 1) 用於計算 datetime 時間增減(本例:以1天為單位)
  3. 可利用 strftime("%Y%m%d) datetime 控制輸出格式

vi test.py
import time
import datetime

someday = datetime.date(2014,9,20)

while (someday <= datetime.date.today()) :
    # print out with date format : YYYYMMDD, example : 20140920
    print str(someday.strftime("%Y%m%d"))
    someday += datetime.timedelta(days = 1)

print "================="
    
someday = datetime.date.today()

while (someday >= datetime.date(2014,9,15)) :
    # print out with date format : YYYYMMDD, example : 2014-09-20
    print str(someday.strftime("%Y-%m-%d"))
    # minus, timedelta(days = 1)
    someday -= datetime.timedelta(days = 1)

print "================="

someday = datetime.date.today()

while (someday >= datetime.date(2014,9,15)) :
    # print out with date format : YYYYMMDD, example : 2014/09/20
    print str(someday.strftime("%Y/%m/%d"))
    # add, timedelta(days = -1)
    someday += datetime.timedelta(days = -1)

執行結果:
$ python test.py
20140920
20140921
20140922
=================
2014-09-22
2014-09-21
2014-09-20
2014-09-19
2014-09-18
2014-09-17
2014-09-16
2014-09-15
=================
2014/09/22
2014/09/21
2014/09/20
2014/09/19
2014/09/18
2014/09/17
2014/09/16
2014/09/15

延伸閱讀:datetime - Basic date and time types (python.org)

#

2013年10月27日 星期日

Mac OS X USB裝置樹(裝置列表) : alias lsusb="system_profiler SPUSBDataType"

Linux 環境下 lsusb 指令可以快速提供電腦上 USB 裝置的清單列表。

Mac OS X 上雖無 lsusb 指令,但其實有對應的功能可以使用。

點選 螢幕左上角的蘋果icon > 關於這台Mac > 更多資訊... > 系統報告 > USB

就能顯示出目前系統的USB裝置樹。

USB 裝置樹
USB 裝置樹

喜歡在終端機 (Terminal)手動下指令的話,可以執行 > system_profiler SPUSBDataType 指令。也能看到所有USB裝置列表。

執行 system_profiler SPUSBDataType
如果您真的執意想要執行 lsusb 指令的話,不妨就在 ~/.bash_profile  中利用alias指令將 system_profiler SPUSBDataType 指令 alias 成 lsusb 


alias lsusb="system_profiler SPUSBDataType"

  • 開啟編輯 ~/.bash_profile 設定檔加上上面 alias 指令存檔後。
  • 執行 > source ~/.bash_profile


接著就能在終端機下文字指令 > lsusb 來看 USB 裝置清單囉。

#




2013年10月19日 星期六

Apple TV 3 Remote (IR codes) 遙控器紅外線編碼

Apple TV 3 Remote (IR codes)
紅外線訊號編碼

  • UP 0x77E1D05F
  • LEFT 0x77E1105F
  • DOWN 0x77E1B05F
  • MENU 0x77E1405F
  • ENTER 0x77E1BA5F
  • RIGHT 0x77E1E05F
  • PLAY 0x77E17A5F
有了上述的紅外線訊號編碼,就可以利用Arduino接上紅外線發射LED模擬原廠紅外線遙控器,來遙控 Apple TV 3 囉~
參考:babelman's Blog
#

2013年10月6日 星期日

SONY Xperia Z1 與 外掛鏡頭 SONY QX10 ~ SONY的創新魂又回來了?

前陣子Sony Z1 與外掛鏡頭QX10、QX100發表,身邊不少朋友都對分離鏡頭與感光元件的設計頗感興趣。對於已有輕便隨身相機如SONY RX100或RX100 II的朋友來說,QX10、QX100便利性和成像品質或許不一定具吸引力,但可以分離拍攝卻依然讓使用者有了諸多不同使用情境的想像。

總覺得似乎有很多有趣的應用會因應而生。

Sony以前一直是大家頗為讚賞的創新品牌代表,然而這幾年在Apple、Google、Nintendo、Samsung...各種產品強大競爭對手環伺下,似乎讓品牌粉絲覺得失去了以前那種能帶給人驚豔感受,當然這也可能是因鎂光燈焦點都被其他競爭品牌所搶去所致。

不過這幾年依然可以看到Sony不斷持續的進行各種產品創新,或許不見得成為市場第一龍,但各產品線的持續創新,卻慢慢在進行異質整合時看到激盪出來的火花。

QX10與QX100何嘗不是Sony持續在行動電話與數位影像、攝影類產品努力下,激盪出來的異質火花。

相較於其他品牌,Sony在視覺影像、視聽家電、消費3C的產品線更完整,未來在跨螢整合服務的優勢相信也會逐漸展露。

當然,這也是Apple、Samsung等品牌極力想要切入與競爭的領域。

#

2013年9月22日 星期日

Raspberry Pi 安裝USB無線網卡 (Buffalo WLI-UC-GNM)

安裝USB無線網卡


執行lsub確認Raspberry Pi已經抓到USB無線網路卡。範例為Buffalo WLI-UC-GNM無線網卡

> lsusb

執行結果:
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 0411:01a2 BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM Wireless LAN Adapter [Ralink RT8070]
確實抓到網卡(Ralink RT8070相容驅動程式)。

編輯網路介面設定檔案


> vi /etc/network/interfaces
auto lo
iface lo inet loopback

# 設定Ethernet網卡以DHCP取得IP
iface eth0 inet dhcp

# 設定Ethernet網卡以DHCP取得IP
allow-hotplug wlan0
iface wlan0 inet dhcp

# 強制網卡以WPA2方式與Wi-Fi AP連線
wpa 2

# 設定Wi-Fi AP 之SSID與密碼
wpa-ssid <<YOUR_SSID>>
wpa-psk <<YOUR_WPA2_PSK_PASSWORD>>

重新啟動networking

> service networking restart


確認網卡已配置IP

> ifconfig -a

wlan0     Link encap:Ethernet  HWaddr 10:6f:00:00:00:00
          inet addr:192.168.1.7  Bcast:192.168.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3458 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2583 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:602575 (588.4 KiB)  TX bytes:1077331 (1.0 MiB)

已經配置 192.168.1.7 給 wlan0 無線網卡介面

#

重新開啟Apple TV 3 影片封印 (DNS設定)

之前的文章「開啟Apple TV 3 影片封印 (DNS設定)」在Apple更改預告片服務連結為SSL(Port443)連線後,必須再重新動些手腳才能恢復。

請按下列步驟執行,就能再重新開啟Apple TV 3影片封印。

材料
  • Apple TV 3 x 1
  • MicroUSB連接線 x 1
  • MAC或Windows個人電腦 x 1

軟體工具
  • Apple iPhone 設定工具程式 (MAC版Windows版)
  • Apple TV設定描述檔壓縮檔 (下載點,內有.mobileconfig檔)

步驟
  1. 安裝Apple iPhone設定工具程式,並開啟執行程式。
  2. 解壓縮Apple TV設定描述檔壓縮檔後,內有appletv-fix.mobileconfig檔案。
  3. 點選 iPhone設定工具程式左邊列表「設定描述檔」選項,將解壓縮後取得的appletv-fix.mobileconfig拖拉至右邊的視窗中。

  4. iPhone設定工具程式
  5. 接上Apple TV 3電源,先等待電源指示燈從間隔閃爍狀態轉變為恆亮(長亮)狀態
  6. 將MicroUSB連接線接上Apple TV 3 與個人電腦。
  7. 當iPhone設定工具程式左邊出現Apple TV裝置後,點選 appletv-fix設定描述檔旁的「安裝」按鈕,將描述檔安裝到Apple TV中。
  8. 移除 USB 連接線、關閉Apple TV電源。重新將Apple TV接上電視。
  9. Apple TV開機後,再設定檢查DNS設定。(設定>一般>網路>設定Wi-Fi>手動設定TCP/IP將DNS改為210.129.145.150)
  10. 重新回到Apple TV的預告片選單中,應該就會出現不少新增選項囉~

注意事項

  • 千萬確認Apple TV 3電源燈轉變為恆亮(長亮)狀態後,再插上USB連接線。
  • 若想復原,可執行iPhone設定工具程式,接上Apple TV後將appletv-fix設定描述檔自Apple TV上移除。


參考資料


#

2013年8月25日 星期日

ubuntu 安裝 easy_install 和 MySQL Connector/Python


  1. 安裝 easy_install
  2. > sudo wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | python
  3. 安裝 Mysql Connector/Python
  4. > sudo easy_install mysql-connector-python

範例程式
import mysql.connector
from mysql.connector import errorcode

try:
  cnx = mysql.connector.connect(user='userid', password='******',
                              host='127.0.0.1',
                              database='dbname', charset='utf8')
except mysql.connector.Error as err:
  if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
    print("Something is wrong with your user name or password")
  elif err.errno == errorcode.ER_BAD_DB_ERROR:
    print("Database does not exists")
  else:
    print(err)
else:
  cursor = cnx.cursor()
  query = ("SELECT * FROM tablename ORDER BY id DESC LIMIT 10;")
  cursor.execute(query)
  for i in cursor:
    print i
  cursor.close()
  cnx.close() 


延伸閱讀:MySQL Connector/Python 官網

#

2013年8月23日 星期五

Windows 7 安裝 Python 2.7 與 easy_install


  1. Python.org官網下載Windows 7安裝檔 python-2.7.5.msi (以32bits為例)
  2. 安裝完成後,設定新增系統變數PYTHON_HOME與修改PATH:

    • PYTHON_HOME = D:\Python27 (以硬碟D為安裝範例)
    • PATH = ~;%PYTHON_HOME%;%PYTHON_HOME%\Scripts\; (加在原來變數值後)



  3. 至官網下載 easy_install 並完成安裝
  4. 開啟cmd.ext 執行 python --version 確認安裝完成,顯示版本號為Python 2.7.5

#

2013年8月9日 星期五

快速產生螢幕截圖的真實場景範例

PlaceIt by Breezi
只要將您的數位影像檔案上傳到 PlaceIt by Breezi 選擇好的套圖版型裡,就能線上快速產生螢幕截圖的3C產品真實場景使用範例產品照。

豆腐腦部落格

拿來廣告、網頁製作、寫部落格、做投影片...真是實用工具!

ps. 如果您像我一樣無聊,想要製作重複套疊的圖片效果,記得每次上傳(upload)的檔案可能要改一下,同名檔案系統好像無動作。

重複上傳圖檔,製作套疊效果... XD
#




2013年8月6日 星期二

手寫的自動計算器 MyScript Calculator

手機和平板的手寫對使用者而言還是直覺。有時候臨時想要寫個算式算一下數字,臨時還找不到紙筆。手機上的計算器功能雖然方便,但按錯數字還要清除,也不見得真方便到哪兒去。

這時候手寫再加上辨識後自動計算功能的 MyScript Calculator 就可派上用場。試試看吧! 會想讓您和朋友分享的有趣免費實用小軟體。

MyScript Calculator (from iTunes)

#

2013 AirPort Time Capsule 不負責任測試


2013 AirPort Time Capsule (2TB, 日版) 作為 Time Capsule Server 及 Samba Server 使用,分為下列兩種網路接線模式。

Type A的個人電腦則經由 Fast Ethernet 接至 2013 AirPort Time Capsule(簡稱APTC) 的LAN埠,再以2013 APTC WAN埠接上 ADSL ATUR至Internet。
 Type B的個人電腦和 2013 APTC(WAN埠)則個別經 Fast Ethernet 接上 ADSL ATUR至Internet。
2013 APTC 除了作為Time Capsule備份伺服器之外,也當作Samba (SMB) Server使用儲存照片和影片電子檔。

不負責任測試將一超過1GB大小之影像檔案自2013 APTC複製到PC上,Type A約莫花費4分半鐘時間,而Type B則約花費1分半鐘。

Type A :直接利用影音撥放軟體撥放2013 APTC Samba Server上約700MB之MP4影音檔,只要放大全螢幕時偶有些延遲。Type B:放大至全螢幕時也依然順暢。

感覺上2013 APTC的CPU處理能力或者網路Throughput或許沒想像中夠力,所以不負責推論Type A接法可能會浪費不少APTC額外資源,導致傳輸效能不如想像。但也或許PC及APTC皆以ADSL ATUR 擔任 DHCP Server 取得IP,造成Type A接法TCP/IP封包進出APTC In/Out各一影響傳輸效能所致。

總之不負責地建議有興趣的朋友,可能避免Type A網路接法,或者再更進一步更嚴謹測試比較幾種網路接法,找到能滿足需求、效能又較好的網路架構。

ps. 另外測試 D-Link DWA-171 USB 無線網卡 (USB 2.0 / 802.11ac draft)和2013 APTC可配對相連。不過,DWA-171 理論上只有支援5GHz , 433Mbps所以感覺上傳輸還沒到令人驚豔的地步。如果電腦或筆電有支援USB 3.0的朋友,建議試試其他有支援802.11ac 867Mbps以上網卡試試。

#

2013年7月28日 星期日

Canon EOS M + EF-S 18-200mm 旅遊經驗談

這次出遊經驗約莫是一週旅遊天數,每日幾乎都是超過8小時戶外行程。這次在出發前刻意捨17-40mm + 70-200mm鏡頭組合,帶著Canon EOS M + EF-S 18-200mm 旅遊鏡出發~

購入EOS M之後馬上就更新韌體,不過與先前Canon EOS 40D經驗比較,老實說還是覺得EOS M有時要搶拍某些畫面和存檔時,會令人覺得心急,除此之外EOS M的觸控對焦功能還算實用,但對於習慣了半按快門對焦再構圖老EOS使用經驗,開啟觸控對焦後一不小心就拍上一張的發生機率還頗高 (好像有相關設定可以調整避免?)。

EOS M + EF-S 18-200mm縮光圈到F11~F22之後,成像解析度還算「利」(sharp),ISO 6400在弱光環境下的表現,比起放棄不拍也是來得好些。錄影功能表現得還算不錯,對於某些旅遊過程或場景紀錄算具有中上表現,當然偶爾對焦還是差強人意。

EOS M Kit 的 18-55mm, 22mm 兩顆鏡頭都是非常輕巧和機身平衡的鏡頭,但對於使用EOS EF/EF-S 轉接環後再接上EF-S 18-200mm之後,就真的會覺得有些頭重腳輕,手持攝影時間較長的話,其實平衡上會比較吃虧,尤其是加上EOS轉接環和18-200mm旅遊鏡重量,或許Canon 100D + 18-55mm 反而會是更佳的旅遊攝影選項。只是目前100D (Kiss X7)的價格相對稍高。

EOS M的高ISO對於手持夜景攝影來講十分方便,許多情況其實不用三腳架,只靠牆壁、柱子、欄杆等依託、依靠就能有不錯的成品,不用三腳架大概可以應付7成左右的場景,對於旅遊時行李重量斤斤計較的遊客來講,可以少帶一支三腳架也是省力不少。

整體而言 EOS M + 18-200mm 算是還OK的旅遊組合,但應該也不算是最完美的組合。

#

2013年7月15日 星期一

亞洲移動通信博覽會 / 工信部推動中國ICT轉型發展方向

在日前召開的亞洲移動通信博覽會上,工信部副部長尚冰表示,新一代移動通信技術、移動網際網路、雲計算、物聯網等新興技術和業務的發展,正推動著全球信息通信業加速轉型,大發展、大融合、大變革正在成為行業發展的主旋律。作為行業主管部門,工信部將從五方面促進中國信息通信業轉型升級。

新技術發展重點摘要:
  1. 4G / NGN
  2. Mobile Internet
  3. Cloud Computing
  4. Internet Of Things, IOT (物聯網)

工信部推動中國ICT轉型升級發展方向:

  1. 推動寬帶中國
  2. 鼓勵新一代移動通信網路技術、業務、商業模式創新
  3. 推動移動網際網路各產業應用
  4. 加強法規制度建設
  5. 積極推動國際合作


#


2013年5月29日 星期三

Google Data Python Library + 寫入Event至Calendar

先確定已經安裝好python及Google Data Python Library(可參考):

import datetime
import atom
import gdata.calendar.service
from gdata.calendar import Who, Where, When
from gdata.calendar import SendEventNotifications


start = datetime.datetime.now().isoformat()

entry = gdata.calendar.CalendarEventEntry()
entry.send_event_notifications = SendEventNotifications(value='true')

titleText = 'event' + start
entry.title = atom.Title(text = titleText)

contextText = 'some event etc...\n' + start
entry.content = atom.Content(text = contextText)

entry.send_event_notifications = atom.Entry(text = 'true') #<<<<<<<<<<<<<<<<<
entry.when.append(When(start_time=start))
entry.where.append(Where(value_string='somewhere'))
entry.who.append(Who(email = 'INVENTEE@gmail.com'))

client = gdata.calendar.service.CalendarService(email='INVENTER@gmail.com', password='YOURPW')

client.ProgrammaticLogin()
event = client.InsertEvent(entry,'http://www.google.com/calendar/feeds/default/private/full')

#

補記:將這個python程式稍加修改後,即可應用在前兩篇 Raspberry Pi + PIR Sensor (紅外線動作感測器)的範例中。其實就能達成紅外線感應偵測到人或動物時,即能在Google Calendar紀錄事件,並且還可以利用Google Calendar簡訊通知至手機。

##

2013年5月24日 星期五

Raspberry Pi + PIR Sensor (紅外線動作感測器) + mpg321 = 您好歡迎光臨

這範例確實是大材小用,有點拿牛刀殺雞。不過卻也是很實用又能引人注意的應用。

參考前一篇「Raspberry Pi + PIR Sensor (紅外線動作感測器) + Webcam」,只要將

dt = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
dt_filename = dt+".jpg"
fs_command = "fswebcam --background -d /dev/video0 "+dt_filename
print " ",fs_command
os.system(fs_command)

改成

fs_command = "mpg321 welcome.mp3"
print " ",fs_command
os.system(fs_command)

就能利用mpg321指令來播放歡迎光臨音效的mp3。

找不到音效檔案時,其實只要拿手邊的手機錄下語音備忘錄,就能利用家人的聲音來當作招呼聲囉。以ios錄製下的m4a格式聲音檔為例:

> ffmpeg -i welcome.m4a welcome.mp3

就能將m4a格式再轉成mp3格式來使用。


需要安裝命令列 mpg321 mp3播放器軟體的話,可以另外參考「ubuntu 文字模式下的 mp3 播放軟體」進行安裝。

#

2013年5月13日 星期一

Raspberry Pi + PIR Sensor (紅外線動作感測器) + Webcam

基本上參考 Raspberry Pi Spy的這篇文章 - Cheap PIR Sensors and the Raspberry Pi

紅外線動作感測器(PIR Sensor)可以視為是一個輸出 (out) 為 1 或 0的開關。PIR SensorGND接到Raspberry PiPin 6(GND)POWER接到Pin 2 (+5V)OUT則接到Pin 26 (GPIO7)(Raspberry Pi腳位可參考這裡)

當紅外線動作感測器偵測到有物體(人體)移動時,GPIO7的值可能就會由0轉變成為1,我們可以藉此狀態改變來達成其他應用,例如這次我們就利用紅外線偵測狀態改變,利用fswebcam來擷取一張照片。

1. 修改Raspberry Pi Spy所提供的pir_1.py如下,並記得存檔。
..
import time (新增下列兩行)
import os
import datetime
...
Previous_State=1 (新增下列五行)
dt = datetime.datetime.now().strftime("%Y%m%d-%H%M%S") dt_filename = dt+".jpg" fs_command = "fswebcam --background -d /dev/video0 "+dt_filename
print " ",fs_command os.system(fs_command)
..


2. 修改執行 pir_1.py
> sudo python pir_1.py
PIR Module Test (CTRL-C to exit)
Waiting for PIR to settle ...
  Ready
  Motion detected!
   fswebcam --background -d /dev/video0 20130513-000412.jpg
  Ready
  Motion detected!
   fswebcam --background -d /dev/video0 20130513-000418.jpg
  Ready
  ..

因為紅外線偵測到物體移動之後,才進行fswebcam來進行拍攝,所以時間差延遲可能會拍不到真正想要拍攝的移動物體。應該是不斷進行拍攝或錄影,然後在偵測物體移動發生的第 t 秒時,回頭去存下第 t-1 或 t-2 秒到第 t+1 或 t+2秒的影像,可能較能切合需要。

不過這只是拋磚引玉,一個結合紅外線動作感應器的小應用而已,更多有趣或有用的應用就有勞各位自己再去嘗試囉。

如果真對motion detection應用有興趣的話,其實可以直接參考這篇-Raspberry Pi安裝Webcam和Motion Webcam Server 就能得到不錯的效果囉。

#



2013年5月12日 星期日

自行車踏板拆卸


[自行車踏板拆卸]
工具:15mm開口板手、梅開板手、工作手套、抹布
方式:左右兩面踏板皆是向車後轉鬆、向車前鎖緊
其他:萬一真的鎖得很緊或生鏽,可以利用橡皮木槌敲板手或WD-40協助卸下



#

2013年5月11日 星期六

Raspberry Pi 安裝 Webcam 和 Motion Webcam Server

Raspberry Pi 已支援不少 Webcam 裝置,如果您手邊的 Webcam 恰在支援名單中,那就先恭喜您。如果不在支援名單中也不用放棄,先嘗試看看再說亦不遲。

本來想要買一部Logitech C310來試看看,一個不小心在住家附近10元商店買了號稱台灣設計的V-Cool YW1210 Webcam , 還有麥克風功能 (賣場價NT$299)來試試。運氣不錯,不但插上Raspberry Pi就抓到Webcam之外,也不用再外接電源。

執行 lsusb 指令,發現了Aveo Technology Corp. 新裝置

> lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 007: ID 1871:0142 Aveo Technology Corp.

再看看 /dev/ 下是否有video0裝置
> ls /dev/video0
/dev/video0

安裝 fswebcam 後,試著抓一張圖 test.jpg
> sudo apt-get update
> sudo apt-get upgrade
> sudo apt-get install fswebcam

> fswebcam -d /dev/video0 test.jpg
--- Opening /dev/video0...
Trying source module v4l2...
/dev/video0 opened.
No input was specified, using the first.
Adjusting resolution from 384x288 to 352x288.
--- Capturing frame...
Captured frame in 0.00 seconds.
--- Processing captured image...
Writing JPEG image to 'test.jpg'.


test.jpg
fswebcam擷存test.jpg 












安裝 motion
> sudo apt-get install motion
> mkdir /tmp/motion
> sudo chmod -R 777 /tmp/motion
> sudo chmod -R 777 /etc/motion/motion.conf

安裝成功後,開始修改 motion 相關設定檔案:
將 /etc/default/motion 檔案中的start_motion_daemon參數值改為yes
> vi /etc/default/motion

  # set to 'yes' to enable the motion daemon
  start_motion_daemon=yes

依照需求修改 /etc/motion/motion.conf 檔案內相關參數值
> vi /etc/motion/motion.conf
  ..
  daemon on (預設off, 設定為on時 raspberry pi 啟動自動執行motion servicedaemon)
  ..
  webcam_port 8081 (觀看webcam之listen port)
  webcam_localhost off (預設on, off取消只能從localhost觀看webcam畫面之限制)
  ..
  control_port 8080 (控制設定motion之listen port)
  control_localhost off  (預設on, off取消只能從localhost控制設定motion參數之限制)
  ..

完成相關設定後,就可以準備啟動 motion service 囉
> sudo service motion restart

開啟電腦上的瀏覽器,輸入 http://<IP>:8081/ 看到畫面就算成功囉。

另外還記得先前建立了一個 /tmp/motion 目錄嗎?目錄中儲存 .jpg或.swf就是執行 motion 時,偵測到畫面內有東西移動或光線變化時的,所擷取下來的畫面記錄檔就存在 /tmp/motion 目錄下。



* 備註:Linux UVC driver & tools (可以發現Linux其實支援幾款Aveo Webcam)

#

2013年5月8日 星期三

線上影像編輯軟體服務 Adobe Creative Cloud 與 Sumopaint

Adobe已經發佈將不會再有Adobe Creative Suite CS7系列新版軟體的聲明,取而代之的是Creative Cloud系列的雲端服務。這意味著軟體使用授權從產品一次買斷邁向租約服務的日子已真正來臨。未來使用者只要每月付月租費用,即可依約享用單套或全套Creative Cloud 軟體服務。

Adobe Creative Cloud
Adobe Creative Cloud

其實除了Adobe Creative Cloud雲服務採用月租服務之外,也有其他線上影像編輯軟體採用付費享用Pro功能或甚至能進一步使用離線桌機版的服務模式。Sumopaint 就是此種線上服務,透過瀏覽器即可操作使用,個人試用免費版後,覺得已足夠一般影像應用,效能也還不差。當然,您也能進一步購買Pro版本以使用更多影像濾鏡(Filters)或離線功能。

Sumopaint操作介面
Sumopaint 操作介面

隨著寬頻網路普及和線上服務蓬勃發展,相信這類服務將會有更多選擇。Thin Clients 和  Cloud Computing 趨勢也越來越接近終端使用者囉。

#

Raspberry Pi 安裝 USB Bluetooth Dongle

1. 安裝藍芽相關程式

> sudo apt-get update
sudo apt-get upgrade
sudo apt-get autoremove
sudo atp-get install bluetooth bluez-utils blueman


2. 確認藍芽是否正常運作

lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 0a5c:200a Broadcom Corp. BCM2035 Bluetooth dongle

/etc/init.d/bluetooth status
[ ok ] bluetooth is running.


3. 掃描其他藍芽裝置

hcitool scan

Scanning ...
        78:A3:*:*:*:22       iphone4  (找到開啟藍芽的iPhone4, 您掃描到的裝置MAC Address 78:A3:*:*:*:22應該不同)


4. Ping一下其他藍芽裝置 (本例為iPhone4)

sudo l2ping -c 3  78:A3:*:*:*:22 
(輸入掃描到的裝置MAC Address 78:A3:*:*:*:22) 

Ping: 78:A3:B4:97:A0:22 from 00:02:*:*:*:D4 (data size 44) ...
44 bytes from 78:A3:*:*:*:22 id 0 time 204.29ms
44 bytes from 78:A3:*:*:*:22 id 1 time 89.52ms
44 bytes from 78:A3:*:*:*:22 id 2 time 80.71ms
3 sent, 3 received, 0% loss

#



2013年4月30日 星期二

眼見真的為真?

眼見為真?人類眼睛其實偶爾會欺騙自己的腦。

光從嘴型判斷對方的發音其實有時會出錯。尤其是ga, ba, fa這些音。


(可開啟英文字幕)
(24分24秒開始)影片中拍攝女子發音的部分,第二段拍攝開始,因為影片的影、音被分開後製處理過。閉上我們的眼和睜眼看影片,我們耳朵聽到的聲音就是不同。

真是奇妙。

#

2013年4月13日 星期六

vi 在行首、行尾加上字元或字串

vi 是"小巧而強美"的編輯器軟體,缺點是學習門檻稍高,畢竟以WYSIWYG、GUI等角度來評論 vi editor時,恐怕其得分並不高。但稍加學習之後,vi 實在是非常實用的軟體。

假設想在文字檔案的每一行行首或行尾加上特定字元字串時,vi簡單指令就能協助我們達成。

舉例:

在每一行行首加上 "mystring
:%s/^/"/g
:%s/^/mystring/g

在每一行行尾加上 "mystring
:%s/$/"/g
:%s/$/mystring/g

從第5行開始,每行行首加上 "mystring
:5, $s/^/"/
:5, $s/^/mystring/

#

2013年4月1日 星期一

愚人節的藏寶圖 (by Google Maps)

愚人節台灣藏寶地圖 (by Google Maps)

各位航海王準備出發尋找寶藏了嗎?

望遠鏡模式
讓我們透過望遠鏡來找寶藏吧!

#

2013年3月12日 星期二

組合的力量 - 再檢查一次 shell script 的第一行

近來發生了一件怪事,某一 shell script 在 console 環境下執行正常,但設定 cron job執行卻一直無法正常執行。

耐下性子,一步步、一行行找到底哪個指令出現問題:才發現執行到某一 for loop 就中斷了。把執行結果轉向某一記錄檔,內容卻也空空如也。

怪的是 console 環境下卻可以執行... ?!

忽然靈光一現! 難道 cron job 不是以bash shell環境來執行?

檢查shell script的第一行。賓果! 果然 #!/bin/bash 消失不見了!

加上 #!/bin/bash 之後。cron job執行也就正常。

提醒大家,務必養成良好習慣時時確認 shell script 的第一行是否指定了正確的shell環境來執行您的script喔~

#

2013年3月8日 星期五

組合的力量 - 計算文章中每個字的出現次數


sed "s/'s//g" filename |sed 's/[0-9]*//g' |sed 's/\W/ /g' | sed 's/ /\n/g' | tr '[:upper:]' '[:lower:]' | sort | uniq -c | sort -r


主要利用 sed 搜尋/取代、tr 大寫轉小寫、sort 排序 及 uniq 功能達成

#

2013年2月27日 星期三

組合的力量 - 擷取檔案名稱和延伸檔名


目錄底下一堆各式各樣檔案,只想要擷取檔案名稱或延伸檔案名稱方便進行後續處理的話,可以利用bash內建功能來取得:

檔名 = ${檔案名稱變數%.*};
延伸檔名 = ${檔案名稱變數##*.};

for file in `ls *.*`
do
  filename=${file%.*};
  echo $filename;
  extname=${file##*.};
  echo $extname;
done


如果想要取得目錄名稱:

目錄名稱 = ${完整檔案目錄名稱%/*};


fullname=/root/pathname/filename.extname
pathname=${fullname%/*};

#

2013年2月8日 星期五