Skip to main content

Posts

Showing posts from September, 2012

[Raspberry pi] 陽台的老鼠偵測器

前言: 話說前陣子爸爸家陽台不斷出現米奇老鼠,立刻清理陽台所有東西,然後又跟市政部門反映問題,可是情況還沒有好轉,米老鼠來完一隻又一隻,我爸陽台在老鼠界應該是網紅打卡聖地(誤),要不然就是米奇老鼠版米奇林三星餐廳(?) 雖然我們抓到了三隻,到上兩個禮拜為止還有至少一隻一直抓不到,每天淩晨還會來吃事後煙留下老鼠屎,真_北。 這隻老鼠對傳統攻擊有抗性,有IT9朋友前陣子用Raspberry pi自製了一台electric mouse trap ,用pi的超聲波雷達放在鞋盒裡,鞋盒裡有一堆食物,底部佈了鐵網,偵測到有老鼠進去以後立即關門通9V電,通個1分鐘再放牠離開,大推我自己也造一台 (Youtube片搜尋一大堆,人類真變態啊,朋友好變態啊)。可是我覺得這樣又好像有點太殘忍,不如先偵測牠們什麼時候來,嚇嚇牠們看看有沒有效果再說吧。 目的: 用Raspberry pi及手上有的感測器弄一隻放陽台用來偵測和嚇嚇老鼠的東西,並把紀錄圖像化到雲端給老爸使用。 邏輯及設計: 當老鼠進入偵測範圍,Motion Sensor偵測到生物活動Raspberry pi 處理來自Motion Sensor的訊號,如果夠強的話開始準備作出回應 Raspberry pi在Angry cats sounds中隨機選出叫聲,再經由Speaker輸出貓叫聲 Raspberry pi指示強光元件發出強光束照射目標 把偵測計數上傳到雲端圖表 材料: Sensor 在網路上看了一些Raspberry pi wild animal camera ,很多也是用Motion Sensor先偵測動物再來,我用的是PIR Motion Sensor被動式紅外線感測器,有低耗電成本便宜的好處。[1],而且可手動調整靈敏度及反應時間。  PIR Motion Sensor就是下面這個 圖片來源: learn.adafruit.com 可手動調整敏感度還有反應時間,這個有點不好調,要試好多遍才找到最佳位置。 可以在Raspbian中輸入pinout查詢GPIO避免插錯 圖片來源: learn.adafruit.com . 一台Raspberry pi 這次使用較舊的Raspberry pi model B+ 萬一老鼠生氣被咬爛錢包也不太痛 . 一張

[鐵人賽] [IT的奧義]專業型象

轉自自己發的文章  http://ithelp.ithome.com.tw/question/10099146 在資訊業呆久了,發現很多人有意無意的把資訊業人員跟"宅男"劃上等號。 他們覺得資訊工程師就是整天窩在電腦前面,穿上一件舊舊的T-shirt,短褲拖鞋不刮鬍子的從早到晚宅在電腦前面看著一堆有的沒的看不懂的符號。有時候更會聽到長輩說:"你穿那麼正式不像修電腦的耶"。雖然我極力嘗試用心的解釋系統工程師跟重灌電腦有什麼不一樣,不過看來成功光復的機率比中樂透還要少。 我們自信的認為自己是資訊工程師(事實上也是),跟建築工程師,律師,醫師,藥師,老師,斯斯(離題了)理論上應該同樣的是專業人仕,為什麼卻給很多人誤會成我們跟修理汽車的,修理冰箱的,修理電吹風的是同一類?(晚輩絕對沒有看不起這些職業,只是職能不同啦 ) 還有更傻眼的事,我們知道資訊業的工種很多,未必所有的人也會修或重灌電腦。可是當您跟其他人說你是系統分析師所以不會灌電腦(而實際上是會灌也不會刻意的講出來, 除非是流鼻血的正妹 )的時候,他們會用懷疑的眼神看你,臉容就好像暗示說自己跑去買賓士卻不會開車一樣的不可思議。 為什麼?為什麼?為什麼?為什麼我們就不當專業人仕??? 其實理由非常複雜,不過我覺得可能是因為以下幾點: 1. 我們設計的是無型的東西: 建築師可以建出一座很大很高的摩天大樓,大家會覺得很棒;醫師醫治了無數的病人,大家會覺得好棒;老師教了無數成績很好的學生,大家會覺得很棒;那我們呢?我們把非常龐大的系統寫成手機的一個icon,我們自己覺得很棒。 !!!等一下,是我們覺得自己很棒,其他人呢?老實說你拿一個apps去跟人家說很棒,其實未必會很懂....無型的東西很難很容易的令人家信服。 2. 我們賣的是服務: 我們幫我們的顧客寫系統,建網路,安裝軟體,目的就是提供服務支援他們的實際業務。而服務本身就是一種無型的東西,也沒有絕對簡單易懂的標準去測量,當老百姓無法簡單的了解我們做些什麼的時候,當然也不會覺得我們專業了。 3. 還有很多很多的理由.... 最後,我不會提供解決方法,因為以上只是晚輩的一些看法。如果硬要有解決方法(IT人的老毛病 ),以我的方法就是開會見客戶的時候盡量穿整齊一點,還要多跟其他人互動,不要老是只聽

[ASP.NET] 淺談SqlDataSource及Data access Layer

在ASP.NET的世界, 如果介面上的物件要連結到資料庫,大部分的參考書會教你使用SqlDataSource物件進行連結。看起來這個方法非常的不錯,既快速方便又簡單,是實上也是如此。不過......(雷聲) 當你開發的系統越變越複雜的時候,問題就出現了。一個畫面可能會出現幾個到十幾個SqlDataSource物件,而且使用者版面與版面之間由於無法共用SqlDataSource;然後你慢慢會發現越來越多重覆又重覆又重覆的SqlDataSource出現在不同的版面上,使得系統越來越笨重 你也越來越笨 ;而且自己辛辛苦苦寫好的Sql statement團隊中的其他 懶 人卻不能享用你的成果,也沒有一個集中的圖形化介面控制所有存取資料庫的Sql statement. 到最後你更會發現程式碼根本無法維護 然後也開始發求職信。 由於以上的缺點,因此就出現了Data Access Layer(DAL)這樣東西。嚴格來說它是一種概念,並不是ASP.NET提供的新功能。根據Microsoft的說法:" DAL for short, and is typically implemented as a separate Class Library project.   "。就是要解決上面SqlDataSource帶來的各種問題。當你使用Data Access Layer這個概念來存取資料庫的時候,系統不是像Sqldatasource一樣直接存取資料庫,而是使用其中的DataSet,再由DataSet對資料庫進行存取。 老實說這不是有點多餘?那就要看你系統的複雜性。畢竟在資訊產業,系統維護佔了一筆非常大的開支,而且大家心知肚明,對於實在爛透的程式碼,錢有些時候的確未必能夠解決所有問題。所以我是建議如果知道未來系統會變很大,最初的時候多花那一點點時間用DataSet建立Business Layer吧......XD 下篇文章會談一下如何實作。 參考資料 [1] Tutorial 1: Creating a Data Access Layer  http://msdn.microsoft.com/en-us/library/aa581778.aspx ----

[Winform] 兩個ComboBox怎樣連動?

今天同事問了小弟一個很基本又很常用的Winform問題: 如果表單中有兩個ComboBox,第一個ComboBox顯示帳號,第二個ComboBox顯示屬於這個帳號的子帳號,當使用者選擇帳號時子帳號的ComboBox要動態顯示選項,最簡單最不用寫Code的方法是怎樣??? 我自己試了一下幾個方法,感覺下面這個方法應該是最簡單方法中的其中一個: 首先設好DataSet中的DataTale並進行關連, ACCAO為帳號, SUBACCAO為子帳號. 接下來拉下畫面,上面的ComboBox是帳號,下面的ComboBox是子帳號。 把ComboBox對應在DataSet中ACCAO跟SUBACCAO兩個DataTable, 它們分別的設定如下: 最後在帳號的ComboBox中的SelectedIndexChanged事件加入下面一句程式碼: private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { sUBACCAOBindingSource.Filter = "ACCAO_NO = '" + comboBox1.SelectedValue.ToString() + "'" ; } 意思就是說在子帳號ComboBox所對應的BindingSource中加入篩選條件,條件就是依據上面帳號ComboBox中使用者所選擇的帳號號碼。 就那麼一句就搞定了! 我想應該找不到給一句程式碼更簡單的做法吧XD,不過有的話記得跟我說一下,天外有天人外有人,給小弟機會好好學習啊!!!

Popular posts from this blog

[SQL Server] 解決log檔(ldf file)過度膨脹的實戰經驗

背景: 公司最近把一套每天有相對大量交易 (之前公司更大很多很多倍) 的系統轉移到SQL Server去,不到一個月交易檔(ldf)已經貼近數據檔(mdf)的size,真的好可怕啊。 身為SQL Server的DBA當然  要替月行道,警惡懲奸  不能讓這種情況繼續下去。 解決方案選擇: 第一個我想到的方法是把Database的Recovery model設成Simple,簡單來說就是不需要交易記錄,對於Insert Delete Update 很少的系統勉強還說得過去,不過對於交易量大的系統來說就不行了,沒有交易記錄萬一資料庫突然往生,總不能用full backup還原然後要User重新輸入一天的交易吧。 第二個方法是定時進行備份。為什麼log大小跟備份有關係呢? 簡單來說,資料庫的ldf檔就是用來儲存Full Backup後所發生的所有交易。如果你從今天從來沒有為資料庫進行過備份, 理論上ldf檔會無限的膨脹下去 ,而且利用Shrink指令也無法把交易檔壓縮。因為沒備份的話就等於ldf檔裡面的東西統統有用,當然沒辦法壓縮了。所以要保持交易檔案的size就是要持續保持備份,在每次備份完了以後自動把交易檔Truncate成初始大小,這樣可以長期保持相對小的交易檔。 所以,最後我選擇了方案二。 實作流程考慮因素: SQL Server的backup model一定要一份full backup再塔配其他備份檔一起使用( SQL Server的備份model解釋在此 ),要達到控制ldf檔案大小的目的,備份可以每天只是Full Backup,也可以是Full->T-log,也可以是最複雜Full->Diff->T-log,我考慮使用那一種的因素主要有以下: 資料庫本身只是約55GB不是太大; 每天交易量不多,每分鐘約10筆交易; 使用者允許少量的data loss,一天Data loss肯定不行; 資料庫只是辦公時間才會用。 我個人認為Backup Plan越簡單越好,發生狀況的時候已經很緊張,複雜的Backup只會令事情更糟。反正今天硬碟實在是太便宜,天天備份幾次也無所謂,因此在儘量簡化備份流程的前題之下,小弟傾向 每天Full BackUp一次,每小時備份一次T-log ,就是Full->

[Windows7] 跨距磁碟區, 等量磁碟區, 鏡像磁碟區之區別

話說前兩天用來備份的USB硬碟無緣無故去領便當了. 大幸的是我一直有好好備份, 資料至少存在兩顆硬碟上, 所以備份硬碟掛了損失也不大(錢包除外). 所以昨天下班以後趕緊去買一顆seagate的2TB內置硬碟回家(感覺USB硬碟還是不太安全), 裝好以後突然想到一個問題: 現在我桌機總共有5顆硬碟, 首先是剛買回來的2TB, 1顆80G SSD, 1顆640G, 1顆320G, 1顆160G. (真多舊硬碟囧), 關於硬碟的部分Windows 7比XP多了一些選項, 應該選那個才對? 讓我自己先分析一下: 那麼零碎的硬碟應該選擇合拼方案為主 關於合拼的方案Windows7有三大選項, 分別是 跨距磁碟區 ;  等量磁碟區;  鏡像磁碟區三種, 應該怎樣選呢? 說穿了那三種其實就是軟體的RAID方案, 硬要改一些好像很簡單又不簡單的中文字 . 其實: 跨距磁碟區 = JOBD,  就是簡單把幾顆硬碟變成一顆大的邏輯硬碟,  資料的存放機制是由第一顆硬碟開始依序往後存放,即作業系統看到的是一個大硬碟(由許多小硬碟組成的)。但如果硬碟損毀,則該顆硬碟上的所有資料將無法救回。若第一顆硬碟損壞,通常無法作救援(因為大部分檔案系統將磁碟分割表(partition table)‎存在磁碟前端,即第一顆)[1] 等量磁碟區 = RAID 0 把資料分散在幾顆硬碟, 存取的速度比較快, 不過壞一顆又是全部壞掉. 鏡像磁碟區 = RAID 1 顧明思義有兩份data, 超安全, 不過由於write的時候也要write兩份, 所以速度會慢. 更詳細的解釋 這裡 [2] 魚仔大有好好的解釋說明三種功能, 小弟就再不說了. 總結: 那我要怎麼辦? 最後我選擇的是.... 什麼都不做 , 80G的SSD留給OS及程式專用, 640G的用來放照片/動畫/影片/影像檔, 320G的用來放文件還有裝一些不重要的應用程式(遊戲啦,遊戲啦,還有一些遊戲之類的), 160G的用來裝音樂還有.......你懂的. 至於2TB的那顆就是當成上面所有硬碟的mirror, 用sync工具即時備份. 為 什 麼 ? 因為JORB不是不好, 不過把那幾顆舊硬碟變一顆有很大的風險, 因為那幾顆碟使用的時間不同品牌也不同,

[SQL SERVER] 找出LOCK方法懶人包

話說休假回公司才不到兩天SQL SERVER就出狀況 Orz 昨天同事跟我說文件系統不能存取ID, 第一件事當然想到是存放ID的資料表LOCK住了. 要查出LOCK方法其實有很多, 以下是小弟歸納的網路資源, 希望幫到大家 什麼是LOCK? 德瑞克大的解釋很詳細:  http://sharedderrick.blogspot.com/2007/12/blocked-lock-connectoin.html sp_lock: 使你對系統中發生的LOCK有深入的了解。它會從master資料庫中的syslockinfo中截取與LOCK相關的大量訊息[1]. 不過我認為由於這個功能的資訊太多, 而且資料沒有好好的做sorting, 所以在危急關頭未必有閒去慢慢看. 在sp_lock會看到spid、dbid、objid、indid、type、resource、mode和status共八個欄位[2]. spid: 連線ID. 可配塔sp_who找出用那些用戶和該連線(spid)有關連. dbid: 資料庫的唯一編號 Objid: 資料表的唯一編號, 可用 select object_id('<table name>') 找到資料表相關Objid 其他的欄位可以在 這裡 找到相關意思. sp_who2 sp_who的加強版本. sp_who主要提供 Microsoft SQL Server Database Engine 執行個體中有關目前使用者、工作階段和處理序的資訊[3]。而sp_who2比較像是sp_who的view, 把sp_who的資料整理得比較好. 小弟經常用它來找出那台PC的發出的process產生了LOCK.  然後毆飛那個user 列出最初導致一連串其它處理序被鎖住的起始源頭(Blocking locks) 很多時候LOCK住的原因是其他的LOCK引發的, 要找出這種關係可以用下面網址的SQL 列出最初導致一連串其它處理序被鎖住的起始源頭 http://www.dotblogs.com.tw/karen0416/archive/2011/11/18/58623.aspx 或者是德瑞克大寫得好好用的SQL http://sharedderrick.blogspot.com