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/