Category: 很軟的軟體

  • Ruby on Rails after_create_commit 重複執行

    在處理after_create_commit這個callback時,發現會有重複執行的問題,最初觀察到的現象是會執行兩次 經過多次修改嘗試後,確定問題是出在callback內更新,單純在裡面放logger丟訊息並不會重複 google後才發現這問題從Rails 4.0就有了(汗 後續也不斷有issue被提出來,不過都沒有去解決 要重現這個問題很簡單,只要弄一個像這樣的Model,然後對它create就能看到無限迴圈 目前我的解法是透過after_commit_everywhere這個套件,將程式碼直接掛在當下執行時的transaction上,由於不牽涉到rails本身的transaction運作,所以不會遇到重複的雷 還好最近終於有人去修這個問題了(ae028984),不過因為是剛弄上去的,要包進release可能還要些時間

  • Ruby Gem : MFRC522

    因緣際會下,有人來問我在Raspberry Pi上操作其他硬體的問題,剛好很久沒碰硬體就幫忙寫了lib,並包裝成套件 這個套件是Ruby Gem,名字叫做MFRC522,是設計在Raspberry Pi上面操作MFRC522晶片的lib 程式碼可以在github上找到:https://github.com/atitan/MFRC522_Ruby 專有名詞 在開始介紹細節之前先解釋一些常見的專有名詞 PICC(Proximity Integrated Circuit Card):非接觸積體電路卡片,就是RFID卡片 PCD(Proximity Coupling Device):非接觸耦合裝置,RFID讀卡機的意思 技術細節 MFRC522使用ISO 14443 type A作為基礎,這個標準分為4個層級的文件,1是硬體規格、2是無線電波能量和傳訊介面、3是初始化與衝突避免、4是傳輸協定 1和2都已經由MFRC522製造商實作完成,只需要處理3和4即可 首先介紹一下架構 MFRC522這個class負責處理與硬體模組之間的溝通,以及卡片標準的第三級(初始化與衝突避免) 再來介紹卡片生命週期的一些細節 卡片在進入感應區後通電,會進行power-on reset,並進入idle state 首先透過REQA或WUPA指令將卡片轉成ready state,這兩個指令的差別在WUPA可以將卡片從halt state喚醒,而REQA不行 在ready state下,進行卡片UID的詢問,卡片收到請求會回傳UID 若這個時候有多張卡片在感應區內,PCD會收到不齊全的UID,這不要緊,繼續將收到一半的UID放進請求裡然後再送一遍 感應區內的卡片都會收到這個請求,而UID開頭與我們送出資料相符的那張卡片會繼續回復剩下的UID,重複這兩個步驟就能得到完整的UID 有了完整的UID後,還要再進行一次請求並附上完整的UID,與UID完全符合的那張卡片會進行確認的回應 此時檢查是否還有下一層UID(有1~3層),若有就要重複上面的步驟去取得剩下的UID 進行初始化與衝突避免之後,卡片會進入active state,此時就可以跟卡片進行通訊 Mifare Classic和Ultralight使用Mifare私有協定進行傳輸,因此只需建構在第三級標準上即可 而Mifare DESFire或Plus SL3在衝突避免後會辨識為ISO標準卡片,必須實作第四級的傳輸協定才能溝通 在OSI模型下,ISO第三級算是硬體層,而第四級是資料鏈結層 Mifare私有協定與ISO傳輸協定最大的差別在錯誤處理,Mifare協定會丟個NAK回來並將卡片重設成idle state。而ISO協定因為僅處理傳輸上的錯誤,因此卡片必須透過資料傳輸在軟體層做錯誤訊息回報 在傳輸逾時的部份,Mifare協定在卡片datasheet中定義各種操作所需的時間長度。ISO協定則是在傳輸前會進行交涉,卡片會表明他預設的時間為多少。要是在某些操作中發生時間不夠用的狀況,卡片可以透過特殊的訊框向PCD請求延長時限 此外,ISO協定還支援資料切割,當傳輸的資料超過任一方的buffer size而無法一次接收時,可以將資料切割後傳輸。若有資料遺失的情形,也可透過NAK的方式要求對方重傳。 在操作結束之後,可利用HLTA指令讓卡片進入halt state,此時卡片只會對WUPA指令有反應,收到後會進入ready state

  • 使用 PAM 作為 Apache Basic 驗證

    Apache內建是沒有系統帳戶驗證的,要透過third-party模組和pam模組來進行驗證。 這篇文章我會使用到mod_authnz_external和pwauth這兩款程式/模組。 首先要安裝pwauth,紅帽系列可以用epel直接安裝,其他發行版就…不要問我XD 好了以後,下載合適的mod_authnz_external。繼續往下之前要先提醒,記得安裝apache開發套件(httpd-devel),和各種開發相關軟體(gcc, libtool之類的),不然沒辦法進行編譯。 解開封裝後,資料夾內會有mod_authnz_external.c,透過下面這個指令來做編譯 如果在apache 2.4環境編譯時遇到這種錯誤,不用擔心,只是API有更動,將c檔案內的「remote_ip」改成「client_ip」或「useragent_ip」,詳細的部分參閱官方API 編譯好之後,使用這段指令安裝模組 安裝完可以在apache module資料夾看到mod_authnz_external.so這個檔案。 如果是在開發環境編譯完手動拿到營運環境使用,搬移完記得修改擁有者root、權限755和selinux內文(system_u:object_r:httpd_modules_t:s0),如此才能正確載入。 載入只需要在httpd.conf使用LoadModule。 設定則是分為兩部分,一部分是定義外部驗證者,另一部分是定義驗證條件。 定義外部驗證只需一行,通常放在<VirtualHost>就好,這邊用pwauth示範,完整用法見官方wiki 最後剩下使用<directory>來設定要驗證的資料夾就完成了 資料來源: https://code.google.com/p/mod-auth-external/issues/detail?id=8 http://kishantha.blogspot.tw/2009/03/apache-library-permission-denied-in.html http://icephoenix.us/linuxunix/apache-and-http-authentication-with-pam/

  • Apache httpd 2.4.6 rpm spec 問題

    這次版本裡的httpd.spec漏掉mod_proxy_wstunnel.so,會造成rpmbuild發現未打包檔案而錯誤 檔案比較 Trunk: https://svn.apache.org/repos/asf/httpd/httpd/trunk/build/rpm/httpd.spec.in 2.4.6: https://svn.apache.org/repos/asf/httpd/httpd/tags/2.4.6/build/rpm/httpd.spec.in 2.4.6版本引進wstunnel,卻沒更新spec 只要先將tarball解開,在裡面的httpd.spec的Module列表添加這一行,儲存後重新打包就可以了 %{_libdir}/httpd/modules/mod_proxy_wstunnel.so

  • 設定IIS7使用256bit加密的SSL

    平常上網的時候都會特別注意SSL的部分,後來就發現用IIS作為網頁伺服器的網站都只能提供到128bit的加密,但是我最近發現,原來只要動點手腳,IIS一樣可以跑256bit~~

  • 使用IIS7.5架設經SSL加密的FTP

    剛剛kgame跑來問我這個問題,正好提供了我寫Blog的題材~XD 那就開始教學吧~

  • IIS 動態壓縮果然超好用!

    最近發現了新的加速方法,就是IIS的動態壓縮功能!! [more] IIS管理員通常會標註動態壓縮會導致系統負擔,不過我現在才發現原來只是說說阿(茶 先來看一下預設的IIS功能,而我們要裝的就是紅框標示的那個 裝完之後,可以到IIS管理員去設定是否要開啟~ 接下來,就進入到測試的階段本次利用ATiFans論壇來進行PHP的GZip和IIS的動態壓縮效能差異的測試 完全不開啟壓縮功能 開啟PHP的GZip 開啟IIS的動態壓縮 同時開啟兩種壓縮功能 由上面測試可以看出,只要開了IIS的動態壓縮,雖然會犧牲一些時間等待,但就可以快速回復要求,進而大幅增進頁面載入效能 如果你是IIS,卻又沒開這功能,趕快回去試試吧XD

  • Microsoft FTP 7.5 使用者隔離 操作教學

    這個問題困擾我很久了,到底要怎樣才能弄得像Linux一樣,一個使用者的FTP起點是一個根目錄… [more] 今天剛好看到IIS工程師steve schofield的回覆: 1) Create a dummy FTPRoot folder 2) Create a Master FTP site. (just an FTP site) No http. 3) Create a vdir called ‘LocalUser’. map the ‘localuser’ virtual directory to your dummy folder (grant authenticated users ‘list’ only permissions) 4) Under the LocalUser vdir, create your specific user accounts mapped to…

  • IIS 動態 IP 封鎖模組

    前言:當你的網站遭到流量襲擊時你該怎麼辦?   別擔心,交給「動態IP封鎖模組」就對了! [more] 首先介紹一下他的功能: ※ 暫時封鎖瞬間爆流量的HTTP用戶端IP※ 暫時封鎖一定時間內超過流量規定的HTTP用戶端IP※ HTTP用戶端允許IP列表※ 封鎖網頁伺服器回應HTTP用戶端錯誤代碼※ 支援在proxy後的網頁伺服器※ 完整支援IPv6協定   模組下載: 可以透過Web Platform Installer (Web PI)安裝或是手動下載安裝§ Dynamic IP Restrictions for IIS 7.0 Beta 2 – x86§ Dynamic IP Restrictions for IIS 7.0 Beta 2 – x64 設定教學: 1.打開IIS管理員2.從左邊樹狀列表選取欲使用模組的伺服器或站台3.雙點擊”Dynamic IP Restrictions” 4.在模組頁面當中,你可以照你想要的去設定,如果要設定允許IP,請按右邊的”Show Allowed Addresses” 5.接著,你可以按右邊的”Add Allow Entry”來新增允許的規則 封鎖用戶端時回應選項 ◎傳送403回應(被封鎖)到用戶端◎傳送404回應(找不到檔案)到用戶端◎直接關閉與用戶端之連線伺服器Proxy設定: 只要在”Dynamic IP Restrictions”設定頁面中,將Proxy Mode勾選為Enable即可! 以上即為動態IP封鎖模組的使用方法!

  • 架設 FTP 防火牆注意事項

    如果您架設FTP使用的防火牆是 Windows 進階安全性防火牆   請注意以下防火牆設定,以便讓資料通道經過   [more] FTP   一般無加密的FTP,請照下列步驟   1. 打開CMD 2. 先設定防火牆的Port 21,請輸入以下指令並按Enter   netsh advfirewall firewall add rule name=”FTP (non-SSL)” action=allow protocol=TCP dir=in localport=21   3. 再來設定防火牆使用狀態模式進行過濾,以便自動開啟資料通道   netsh advfirewall set global StatefulFtp enable     FTP over SSL   有使用SSL的FTP,請照這邊的步驟   1. 打開CMD 2. 設定防火牆接聽所有連接埠   netsh advfirewall firewall add rule name=”FTP for…