2015年11月25日 星期三

樹莓派 /etc/network/interface 直接進行WiFi設定

auto lo

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
auto wlan0


iface wlan0 inet dhcp
        wpa-ssid "ssid"
        wpa-psk "password"


參考
  Setting up Wifi with the Command Line

Mac 使用ssh連限至遠端電腦時中文變亂碼

環境:

  本地端作業系統:  OS X Yosemite ~ Sierra
  終端機程式:          iTerm2
  遠端作業系統:      Ubuntu 14.04
  (update @2016/11/07, 最近更新Mac OS X同樣的問題又出現了,不過同樣用同樣的方法一樣能解決)

狀況:

  使用ssh連線至遠端電腦後輸入中文變成亂碼, 下圖為亂碼的例子

  1. 輸入「中文」

  2. 結果卻變成下圖

解決方案:

  修改/etc/ssh/ssh_config檔案,將SendEnv LANG LC_*註解掉即可

PHP 二進位處理 pack and unpack

幾個月前留下的PHP二進位處理方式,加減做個筆記一下

pack和unpack用來處理二進位資料
範例如下

<?php
// 使用pack將ascii的1~13放到$txData變數中
for($i=1;$i<14;$i++) {
  $txData .= pack("C", $i);
}

// 透過rs232模組寫出去,其中rs232的tx/rx短路,因此寫出去的資料可以在$rxData中收到
$rxData = $this->rs232_model->writeAndRead($txData);

// 使用unpack將$rxData中的二進位資料轉回來
$res = unpack("C*", $rxData);
?>

2015年11月24日 星期二

Nexus 7 二代 (2013版) 觸控失靈DIY維修

由於筆者的Nexus 7(2013板,以下簡稱N7)的觸控螢幕狀況每況愈下,滑動螢幕時常常沒反應或卡住,因此在網路上尋找是否有修正方法

網路上查到的可能原因方法如下:
    1. 螢幕排線鬆掉

    2. 濕氣太重

    3. 螢幕太髒

    4. Android軟韌體問題

首先先用刪去法
    3. 螢幕太髒
        筆者近期常常拿拭淨布擦,但擦完後也只有一小段時間不會觸控失靈

    4. Android問題
        許多人說的4.4.2已經改善,但是筆者的已經是Android 6.......

因此筆者針對螢幕排線和濕氣太重試著處理看看,處理流程如下
    1. 沒事就丟防潮箱,不然至少丟防潮箱一晚
      (註: 防潮箱通常只是控制濕度而已,不是專門拿來除濕用)

    2. 拆了N7的排線! 此動作可能造成保固失效或機器整台gg,請找認識的好人幫忙處理,筆者是擅長魔改硬體的強者我學長幫忙拆機
        Step 0: 拍照留個紀念
Fig 1. Nexus 7 (2013) 背面

Fig 2. Nexus 7 (2013)正面


        Step 1: 先找拆機教學影片
            影片連結: Nexus 7 (2013) Screen Repair & Disassemble

        Step 2: 關機
            避免出狀況,一定要關機後再開工。因為很重要,所以要說三次: 「要關機!」、「要關機!」、「要關機!」

        Step 3: 拆惹它!!!
            大致上如影片中採用吉他撥片拆開,但是強者我學長用指甲就拆開了XDDDDDDD
Fig 3. 拆解結果圖,上方為N7本體,下方為N7的外殼

        Step 4: 接著將下圖中紅色框框的地方如影片中的方式拆開再重插回去即可
Fig 4. 電源與排線拆解圖

            紅框1: 為安全起見,先拆除電源線
            紅框2: 
                i. 拆開剛好壓在右下紅框最下面的線,估計是聲音相關的線,但是會卡到螢幕排線
                ii. 拆解排線,此處是照影片結果推估這紅框2的兩端應該都是觸控螢幕的排線,因此把他拆開再裝回去
            最後再將聲音線和電源線裝回去

        Step 5: 把N7外殼裝回去,接著開機測試即完工

結果
    經過施工後至今N7的觸控已經回復正常(灑花)

    不過3C產品會出問題的原因百百種,此狀況雖然適用於筆者,但適不適用其他人就不得而知了,因此請各位要拆解前先思考一下以下問題
        1. 投資一定有風險,基金申購前應詳閱公開說明書。DIY的代價就是有機會整台gg,動手之前請三思
        2. 找得到專家幫忙拆或自己是能拆的專家嗎?
        3. 由於拆解了,因此保固可能失效,未來送回原廠也不能怪原廠不受理


2015年9月27日 星期日

樹莓派(Linux通用) QR code掃描機

由於最近的研究需要用到固定式QR code掃描機,但網路上找到的都要3k~10k不等,礙於荷包太過瘦弱,筆者自己用樹莓派加web cam架設QR code掃描機

前置作業
1. 準備好安裝完raspbian的Pi 2代
2. 準備支援V4L2的web cam
  不知道啥叫V4L2沒關係,反正就把web cam的USB插上Pi以後看/dev/video[N]有沒有出現
  例如筆者使用的Logitech, Inc. Webcam C310的就是出現下圖:

圖1. 查詢video裝置

架設說明如下
1. 先更新apt的資料庫
pi@raspberrypi ~ $ sudo apt-get update

2. 安裝zbar-tools
pi@raspberrypi ~ $ sudo apt-get install zbar-tools

3. 執行zbarcam,並調整解析度為320x240
  注意: 解析度千萬別設太高,否則Pi會很lag.......
pi@raspberrypi ~ $ zbarcam ---prescale=320x240
圖2. 開啟web cam後會先看到左圖的zbar logo,接著就會顯示web cam拍攝到的內容

4. 找張QR code入鏡並拍出結果吧~
圖3. 透過web cam掃描左側QR  code,再由zbarcam顯示掃描結果

=======================================================
若沒GUI的話跑zbarcam是會失敗的,此時可以改用以下指令
pi@raspberrypi ~ $ zbarcam --nodisplay ---prescale=320x240
圖4. 由ssh連上pi在純終端機頁面下指令

參考資料

2015年8月11日 星期二

Linux Default route remove and add

說明:
  由於筆者管理中的某台機器裝上雙網卡後怪怪的, 第一個網卡對外掛掉後不會切到第二張網卡, 因此筆者簡單筆記怎麼重設default route
顯示系統的routing table
shiun@test:~$ route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default 192.168.0.253 0.0.0.0 UG 0 0 0 eth0 192.168.0.0 * 255.255.255.0 U 0 0 0 eth0 192.168.1.0 * 255.255.255.0 U 0 0 0 eth1

將第二張網卡(eth1)改為default
# 刪除對應到eth0的default shiun@test:~$ sudo route del default # 將192.168.1.1(eth1)改為新的default shiun@test:~$ sudo add default gw 192.168.1.1
這樣就OK了

2015年8月5日 星期三

樹莓派 Raspberry Pi2 John the ripper (開膛手約翰XD?)

應觀眾要求測試Pi2跑John的效能, 結果如下列資料所示


pi@ShiunPi /etc/john $ john -te Benchmarking: Traditional DES [32/32 BS]... DONE Many salts: 82043 c/s real, 82171 c/s virtual Only one salt: 78717 c/s real, 78835 c/s virtual Benchmarking: BSDI DES (x725) [32/32 BS]... DONE Many salts: 2575 c/s real, 2575 c/s virtual Only one salt: 2551 c/s real, 2551 c/s virtual Benchmarking: FreeBSD MD5 [32/32]... DONE Raw: 1511 c/s real, 1511 c/s virtual Benchmarking: OpenBSD Blowfish (x32) [32/32]... DONE Raw: 80.5 c/s real, 80.5 c/s virtual Benchmarking: Kerberos AFS DES [24/32 4K]... DONE Short: 37305 c/s real, 37305 c/s virtual Long: 100006 c/s real, 100006 c/s virtual Benchmarking: LM DES [32/32 BS]... DONE Raw: 1161K c/s real, 1161K c/s virtual Benchmarking: dummy [N/A]... DONE Raw: 11211K c/s real, 11211K c/s virtual 

由於筆者對john沒有研究, 分析的工作只好無限延期XDDDD

2015年6月18日 星期四

Android 內建字型

Android 3.0




Android 4.0新增


2015年4月22日 星期三

Windows禁用檔案名稱

前幾個月前寫程式遇到Windows 7寫入檔案錯誤, 原因很單純的就是Windows 7禁止使用某些檔名,但是今天某G開頭的朋友(請看本網誌右下的咩田認證)也犯了一樣的錯, 還是筆記一下好了..........

禁止使用的檔名如下

  1. CON
  2. PRN
  3. AUX
  4. NUL
  5. COM系列, 從COM1~COM9
  6. LPT系列, 從LPT1~LPT9

在Windows 7上出現的畫面如下
將一個檔案改名為COM1(不管副檔名)

改名後發生錯誤


詳細資料可參考Naming Files, Paths, and Namespaces網站並以reserved為關鍵字進行搜尋, 可以找到一段話
  Do not use the following reserved names for the name of a file: CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9

參考文章
1. Naming Files, Paths, and Namespaces

2015年4月14日 星期二

樹莓派 Raspberry Pi 使用iPhone連線上網 & 橋接至IP分享器當作緊急備用WAN使用

先來說明為啥筆者會想把手機的4G網路橋接到AP上的WAN吧

動機

  1. 筆者租屋處的網路gg.........QAQ

  2. 筆者的網路設備(NAS Pi、AirPlay Pi、...之類的)沒辦法用無線網路去連手機的熱點.......(至於為啥設備名字後面都有個Pi呢.... 就是沒錢只好自己DIY..........)

  3. 手機的熱點有連線數上限,印象中連5個裝置就極限了

租屋處原始架構圖:
所有網路設備透過AP連上modem

目標架構圖:
刪除右邊的modem

改由Pi橋接AP和手機以3G/LTE連接上網



關鍵字說明:

  Tethering: 意指通過智慧型手機或平板電腦等行動裝置,將它的上網功能分享給其他裝置使用的功能。(節錄自wikipedia: Tethering),在iPhone統一使用個人熱點控制

  AP: Access Point 也就是一般家用的Wi-Fi無線基地台

建立Pi與iPhone個人熱點連線:

  1. 安裝套件讓Pi可以使用USB連結iPhone的個人熱點

#以下步驟全部要使用root權限, 直接切換權限為root pi@ShiunPi ~ $ sudo su - #安裝以下的套件讓Pi可以使用iPhone的Tethering(網路共享功能) root@ShiunPi ~ # apt-get install ipheth-utils root@ShiunPi ~ # apt-get install libimobiledevice-utils root@ShiunPi ~ # aptitude install ifuse #ifuse是使用掛載的方式讓iPhone的Tethering能正常工作 #因此先建立等會兒要用來連線的掛載點 root@ShiunPi ~ # mkdir /media/iphone

  2. 連接iPhone到Pi上並開啟iPhone的個人熱點確定Pi有偵測到iPhone,iPhone若顯示是否信任此裝置請點選信任(參考網站說不用點選信任但筆者這邊選不信任會一直出現錯誤)
#使用ifconfig -s檢查是否出現新的網路介面(通常是eth1) root@ShiunPi ~ # ifconfig -s

  3. 編輯/etc/network/interface讓NetworkManager會自動由eth1取得IP
root@ShiunPi ~ # vi /etc/network/interface #加入以下設定 allow-hotplug eth1 iface eth1 inet dhcp


  4. 重開機

  5. 使用ifuse指令建立Pi與個人熱點的連線
#以下步驟全部要使用root權限, 直接切換權限為root pi@ShiunPi ~ $ sudo su - #使用ifuse掛載/media/iPhone目錄 root@ShiunPi ~ # ifuse /media/iPhone 
  6. 編輯自動建立連線的script iphoneconnect方便下次iPhone接上Pi後自動建立連線
root@ShiunPi ~ # vi /lib/udev/iphoneconnect #!/bin/bash #避免上一次ifuse掛載後沒有解除掛載,掛載錢先嘗試umount umount /media/iPhone ifuse /media/iPhone ipheth_pair
#編輯結束後記得將script權限設定為755 root@ShiunPi ~ # chmod 755 /lib/udev/iphoneconnect

  7. 設定udev偵測到iPhone個人熱點插上Pi時自動執行上一步的script
root@ShiunPi ~ # vi /lib/udev/rules.d/90-iphone-tether.rules #修改原本的第五行的 "RUN+=" 為以下內容 ACTION=="add", SUBSYSTEM=="net", ENV{ID_USB_DRIVER}=="ipheth", SYMLINK+="iphone", RUN+="iphoneconnect"  

  8. 重開機驗證是否可正常執行,到這一步就已經完成iPhone與Pi的連線了



橋接Pi的eth0和iPhone的eth1

  1. 安裝橋接用套件
#安裝bridge-utils即可 root@ShiunPi ~ # apt-get install bridge-utils
  2. 設定eth0與eth1橋接在一起
#編輯/etc/network/interface檔案 root@ShiunPi ~ # vi /etc/network/interface 記得一定要註解掉這兩行,否則會發生同一個IP會出現在兩個interface的奇怪問題 #allow-hotplug eth1 #iface eth1 inet dhcp auto br0 iface br0 inet dhcp bridge_ports eth0 eth1   

  3. 重開機並將筆電 or PC接到Pi的網路孔上(eth0)

  到此步驟後橋接就完成了,此時即可從筆電直接透過iPhone連上internet,接著就直接從筆電上ping外網看看吧


橋接iPhone與AP


接著直接將Pi的網路孔(eth0)接上AP,iPhone開啟個人熱點並接上Pi的USB孔即完成所有工作,現在就不用再害怕租屋處網路又gg了!!!


參考資料


1. Raspberry Pi How To: Tether to iPhone 5 (之前更新網誌的時候不小心弄掉參考資料惹QQ)

2015年4月3日 星期五

Java interface中定義變數是合法的?!

最近被朋友聊天的時候聊到一個問題: "Interface中定義變數(field)是合法的?!"

描述

為啥要討論這問題呢? 請各位看官看看以下的描述 from Wikipedia: Interface (Java)
==================================================
介面通常以interface來宣告,它僅能包含方法簽名(Method Signature)以及常數宣告(變數宣告包含了 static 及 final),一個介面不會包含方法的實作(僅有定義)。
==================================================

接著來看個範例吧
interface ControllStatus {
       String QAQ = "qaq";
}

public class Test {
    public static void main (String[] args){
        System.out.println(ControllStatus.QAQ);
    }
}

執行結果如下:


討論

在上述的範例中interface定義了QAQ字串竟然能正常執行!!!
但是Wikipedia的描述中卻說介面只宣告不包含定義,除非用static及final來宣告

根據其他OO的語言,直覺上Java應該是將上述的程式碼偷偷加入public static final的修飾
  1. public: 公開
  2. static:   程式一開始時就被配置記憶體且擁有"唯一"的特性
  3. final:     不可修改

由此可以猜測Java是不是偷偷地把interface中定義的變數弄成public, static and final,接著來看以下兩個Stack Overflow的討論吧
  Why are interface variables static and final by default?
  Is “public static final” redundant for a constant in a Java interface?

這兩個討論都提到Java隱含式的轉換變數為public, static and final
但是Stack Overflow終究是個討論區,接下來我們直接看Java的技術文件吧:
  Chapter 9. Interfaces
      -- 9.3. Field (Constant) Declarations
  Every field declaration in the body of an interface is implicitly public, static, and final. It is permitted to redundantly specify any or all of these modifiers for such fields.

顯然的Java真的做了隱含式轉換,所有interface內的filed會被轉換成public static final,因此上述的程式碼不僅正確,該filed還是唯一且不可變的物件!

參考資料

1. Wikipedia: 介面 (Java)
2. Stack Overflow: Why are interface variables static and final by default?
3. Stack Overflow: Is “public static final” redundant for a constant in a Java interface?
4. Oracle Java Language Specification Chapter 9. Interfaces: 9.3. Field (Constant) Declarations

樹莓派Raspberry Pi B+ and Pi2 USB供電不足問題處理

狀況

  前一段時間測試在Pi B+和Pi2上接以下兩種裝置
    4G USB dongle
    USB外接硬碟 
  結果發現Pi B+和Pi2 USB供電不足推不動USB dongle和外接硬碟........

推不動時上圖的紅燈會熄滅或不規則閃爍

解決方案

  經過一番Google後發現有兩個問題要解決
  1. adapter的供電要到2A
  2. 取消Pi B+和Pi2預設的供電限制,只要在config.txt(註)中加入以下的參數即可解除USB供電限制
max_usb_current=1
  註: 將micro SD card插入讀卡機並接上電腦後即可在根目錄下看到config.txt

其他問題

  雖然加入以上參數可以解除USB供電限制,但還是可能不夠電去推USB外接硬碟,建議讀者還是買個有供電的USB hub會比較有效

參考資料

  1. http://dumbpcs.blogspot.tw/2014/07/getting-external-hdd-to-work-with.html
  2. https://projects.drogon.net/testing-setting-the-usb-current-limiter-on-the-raspberry-pi-b/

2015年2月25日 星期三

Raspberry Pi 各版本耗電量測試

目前Raspberry Pi在市面上的版本就有Model A, A+, B+, Generation 2 Model B(Pi2),筆者根據手上有的以及能借到的測試一下各版本的耗電狀況

筆者使用下圖的電流電壓測試器,由於此電流電壓測試器的準確度有限,就要各位看官不要太計較了XD


檢測結果如下
Model
Busy
Idle
Power Off
A+
0.11
0.08
0.02
B
0.44
0.39
0.1
B+
0.25
0.21
0.04
Pi2
0.31
0.24
0.06
表上的Busy, Idle及Power Off的單位為安培(ampere)

Busy: 故意跑無窮迴圈程式讓CPU維持在100%左右的使用率,由於Pi2有4顆CPU所以故意跑多個無窮迴圈程式使其總CPU loading同樣維持在100%左右

Idel: 開機後不額外執行任何指令或程式只維持開機後靜止不動的狀態

Power Off: 下sudo poweroff並等到所有燈號熄滅只剩電源指示燈有亮的狀況下測量

結論
  由上表的結果未來筆者若要再購買會以Pi2為主(畢竟4顆心臟太強大了),且耗電只有0.31A拿來掛網、FTP server、HTTP server、DLNA server非常方便

  而A+在特殊需求下,例如DLNA server配合一般NAS使用也是非常適合

  B板的話則是會慢慢的退至第二線或是送人吧

Update 2015/3/3
  國外另有大大專業的量測,有興趣的人可以閱讀此篇文章http://raspi.tv/2014/how-much-less-power-does-the-raspberry-pi-b-use-than-the-old-model-b

Raspberry Pi 2 入手

過年前訂的Raspberry Pi 2(簡稱Pi2)終於到貨了~

安裝前請各位看官重新燒最新的Raspbian到另一張micro SD card,目前的Raspbian是無法在B+和Pi2上替換著用的

以下為Pi2的簡單測試

1. 外觀: 除了畫面正上方的小字能看出這是Pi2外,其他長的跟B+幾乎一模一樣 不過各pin腳的對應還需要再確認是不是和B+一模一樣

2. 效能: 從下圖左上方可以看到Pi2從一顆樹梅成長為四顆樹梅當然變強的不像話(被毆


  簡單測試以下項目
    i. 安裝iceweasel瀏覽網頁: Google, Yahoo等網頁跟普通桌機感覺差不多(感動到痛哭流涕!比起過去的Pi光開瀏覽器就lag到昏倒好太多了!!!

    ii. 播放YouTube影片: 開啟YouTube網頁速度悲劇,播放時也有lag的狀況大概是繪圖和解碼能力仍舊不足

    iii. 開啟vim編輯不會lag!

    iv. ssh連線穩定且不會lag!

    v. JDownloader安裝速度快許多,安裝完畢後開啟JDownloader幾乎不用等待

    vi. 耗電量: 經由測試發現把B+多0.06A

剩下的等有空再測試吧~

[機械式鍵盤] Cherry 無刻鍵盤清潔與鍵帽清洗

最近由於手滑把nano SIM卡掉在鍵盤中,拔起鍵帽後發現卡超多灰塵,連鍵盤外部也髒掉不少.............來花點時間來清潔吧


1. 拆掉全部鍵帽,由於筆者的鍵盤是Cherry的無刻鍵盤,所以在拆之前就要有心理準備裝回去有機會裝錯位置XD
  拆完以後如下圖所示



2. 接著拿吹球將卡在縫隙裡的灰塵和髒東西清掉,如果能借到輪胎打氣的機器也是個方法,不然像筆者用吹球就吹到手痠個半死

3. 清洗鍵帽,傳說中鍵帽洗衣袋 + 洗衣機就能把鍵帽洗得亮晶晶,但為了環保省水筆者還是決定乖乖用手一個一個拿起來搓洗然後再曬乾

4. 接著就是重點放回鍵帽,把鍵帽反過來看可以發現鍵帽後面會有I, II, III, IV等字樣,從上到下就是I, II, III, IV,至於長得比較奇怪的鍵帽當然就不用特別去記了~

  不過根據筆者的經驗,拆鍵帽的時候還是要順手記一下鍵帽和他所在的排列的號碼對不對,不然像筆者裝到一半就沒把握會很糗XD....

從上到下為I, II, III和IV

對應到上圖的從左到右的I, II, III, IV