Skip to main content

Posts

Showing posts from May, 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+ 萬一老鼠生氣被咬爛錢包也不太痛 . 一張

[Youtube] 在網頁中嵌入重覆播放的youtube影片

我知道很多人發過這篇文章,不過自己整理的心得自己才最看得懂吧 囧rz 如何嵌入? 要把youtube內嵌到你的blog,直到2012年5月份為止( 我這樣說是因為Youtube經常改變內嵌的方式,不過不得不讚的是一次比一次簡單 )的方法如下: 首先進入到你想嵌入的Youtube頁面,往下拉一下影片的下方會有一顆叫分享(Share)的按鈕,按一下。 然後按一下內嵌(Embed) 然後把下圖這段 html 複製起來(滑鼠右鍵->複製 或 Ctrl+c) 轉回你正在寫blog的頁面(以下以blogger為例),跳到HTML模式(其他種類的blog的 HTML模式在那裡 小弟 就不知道了 ˊ_>ˋ  ) 把剛才複製的那段HTML貼在你的CODE的最底下。 你可能會好奇說,這段HTML究竟是啥咪啊?這段Code的意思就是說: "建立一框架(iframe),沒有規定是不是一定要全螢幕(allowfullscreen=""),框架沒有厚度(framework="0"),高315單位(height="315"),寬420單位(width="420"),來自以下這個地方(src="brabrabra") " 所以結果如下,內嵌就完成了。 如何加入其他功能? 如果有另外的需求,例如不停重播或者在那裡開始之類的,就要使用Youtube提供給我們的參數設定了。 這個網站 有列出所有Youtube提供給我們用的參數。以下用autoplay這個參數來當例子。跟據上面這個官方網站的說明,autoplay的描述如下: autoplay   (supported players: AS3, AS2, HTML5) Values:  0  or  1 . Default is  0 . Sets whether or not the initial video will autoplay when the player loads. 意思就是說1的話影片在網頁載入以後就會自動播放,0的話就不會,就這麼簡單! 那我們要怎麼加呢這個參數進去呢? 先回到HTML模式,然後找回剛貼到網頁上的HTML碼, 先找到 src="http://www.youtu

.net教學筆記整理 [組態檔案驅動設計架構例子]

前言: 公司經常會遇到一些不是給使用者用的程式,例如一些格式轉換程式,一些上傳到某些地方的程式,或者背景服務等等。這些服務具有一共通點: 參數設定很多,如SMTP Server, 資料庫IP。 要經常改變參數設定。 參數寫死在軟體程式裡面,第一個缺點當然是不好修改,而且不斷修改程式碼會引發不必要的錯誤。所以現在很多伺服器都是採用了以 XML組態檔案驅動驅動的設計架構 。意思就是說利用XML定義很多軟體參數,當系統運行的時候才去讀取相關設定,這樣軟體不需要經常重新修改,比較能確保穩定度。這種概念也就是所謂的 執行引擎了( Execute Engine ) 。 以下是小弟最近利上執行引擎的概念幫公司寫的小軟體,希望可以給各位大大分享一下,有錯誤的話請賜教。 目的: 把資料庫的某一資料表(table)轉成XML, 並自動上傳到指定FTP位置。這個小軟體要具有: 1. email功能: 上傳成功或失敗需要發email通知資訊部門某位同事。 2. 紀錄檔(log)功能: 運行時產生相關程序的記錄,包括exception。 3. 上傳到FTP伺服器前要先備份。 4. 產生的XML檔案名稱將來可能會有修改。 設計: 要表達一個系統的設計,至少要表明兩種關係 Class 之間的關係 觸發事件的先後次序 Class 之間的關係 由以上需求可知,如果我們在物件導向分析的類別圖(Class diagram)中開始設計類別,可以以功能區分最初版本的5個類別,分別是: Program.cs: 提供軟體核心作業流程。 xmlManager.cs: 提供轉換成XML的相關功能。 emailManager.cs: 提供傳送電子郵件的功能。 ftpManager.cs: 提供ftp上載的功能。 logManager.cs: 提供記錄檔相關功能。 它們這些物件與物件之間的關係,可以用UML中的 Class diagram 表達: 虛線指的是這一個class可以存取的檔案。 實心菱型在UML中解釋是Composition(組合), 意思相當於has a, 就是說被指向的Class(xmlManager跟logManager)是菱型端的Class(Program.cs)不可缺少的一部分, 當Program.cs被消滅的時候xm

.net教學筆記整理 [Windows Service篇]

如何建立Windows服務 根據Wiki的解釋, Windows服務(Windows Service) 是在Windows系統架構下長期運行去執行某一特定功能,而且不需要有人機互動的一種背景程式。具有不需使用者登入系統也可以自動開始結束的特性。 現在動手做做看吧! 開啟VS2012, 新增專案, 選擇 "Windows服務" 為專案類型。 在"屬性"頁中找到"ServiceName", 這是服務名稱, 要記得同一台伺服器服務名稱不能重覆喔。其他的參數用預設的就OK了。   開啟專案畫面後沒有Winform或ASP.net的interface Designer(廢話, 服務跟本就沒介面啊TAT), 在畫面點擊兩下跳到後面程式碼(cs檔案頁面), 看到OnStart及OnStop兩種方法。故名思義OnStart就是服務啟動時做的事,OnStop就是當關閉服務時要做的事。記得每次觸發OnStart跟OnStop的時候程式碼只會跑一次。即是說如果今天你要寫monitoring的東西,在OnStart中應該加入像 System.Timers.Timer 類別 ,不然跑一次就進入無限等待的狀態。現在用 把資料庫的數據生成XML 的例子放到這個服務: 要使用Timer類別, msdn很清楚的說明 Timer   元件是伺服器端之計時器,讓您可指定應用程式中引發  Elapsed  事件的週期間隔。所以我們一定要設定好 Elapsed事件 ,還有 計時器的時間間隔 。先新增一個Timer物件 在服務(Service)的OnStart中,設定Timer中Elapsed的ElapsedEventHandler  timer_Elapsed。 在服務(Service)的OnStart中, 設定timer的週期間隔 timer.Interval 為一小時 加用啟動timer程式碼。 timer.Start(); 接下來把存取資料庫轉成XML的程式碼放到 timer_Elapsed方法裡. /*讀取資料庫上的資料放到dataset, 再把讀取的資料存到xml檔案中*/ //先建立connection string connstr

.net教學筆記整理 [XML篇]

以下例子說明怎樣把SQL Server中的資料轉換成XML. 主要分成讀取資料庫跟輸出兩部分。 讀取資料庫部分 先建立SqlConnection 然後建立SqlDataAdapter把資料庫的資料先抓出來. 再把Adapter中的資料存到DataSet中叫"XXX"的資料表(Table). 轉成XML部分: 第28行,利用DataSet中WriteXml的方法, 標示好XML的生成路徑就行囉! 很簡單不難啦! =皿=

.net教學筆記整理 [資料庫篇]

連接資料庫的方法 視覺方式,使用設計階段工具。 程式設計方式。 基本概念: ADO.NET  ADO.NET 可讓您以一致的方式存取資料來源 (如 Microsoft SQL Server 與 XML),以及透過 OLE DB 和 ODBC 所公開的資料來源。資料共用的消費者應用程式可使用 ADO.NET 連接至這些資料來源並擷取、操作及更新其中所含的資料。 元件: .NET Framework 資料提供者 DataSet 架構 在.NET中, 我們使用System.Data這個namespace為存取資料的主要方法。 當存取任何形態的外部資料, 程式一定包含下列物件: Connection物件 Command物件 資料載體 資料載體包括 DataReader 能從資料庫擷取 順向 唯讀資料流資料。 好處是 提高應用程式的效能,方法是立即擷取可用的資料,及 (依預設) 一次只將一個資料列儲存到記憶體中,從而減少系統負荷。 DataAdapter 表示 SQL 命令集和資料庫連接,用來填入  DataSet  並更新資料來源。 是  DataSet  和資料來源之間的橋接器 (Bridge)   ,用來擷取和儲存資料。 DataSet 種離線運作的資料庫快取,存放在主機的記憶體裡面。DataSet是透過DataAdapter(資料配接器)來執行SQL指令,功能非常強大,幾乎就是資料庫的翻版(如:DataView、DataTable、Relationship等等都作得到)。可以把資料庫複製到主機的記憶體裡面,如此一來面對關係複雜的多重資料表,就能快速地處理。缺點是:使用DataSet比較消耗資源。[2] DataSet  由  DataTable  物件的集合所組成. 內部是用XML來描述數據的。 DataTable DataSet內的元素。一個 DataSet 可由一至多組 DataTable物件組成。 DataSet, DataReader比較如下[2] (資料來源,以 MS SQL Server 為例) ADO.NET 兩大物件的比較 DataSet DataReader 連接資料庫( Connection ) (不需要,因為 Sq

.net教學筆記整理 [資料工具篇]

如何在Winform修改資料庫資料 以下幾個例子說明怎樣利用winform修改資料庫. [例子1] 在不直接點選DataGridView修改的前題下修改資料庫中關於中文及葡萄牙文的資料 (利用VS Designer篇) 這個例子整個過程不需要任何的Coding, 不過對於理解DataGridview跟資料庫的關係很有幫助。^_^ 先把介面劃出來 為DataGridView加入資料來源 為介面下面兩個Textbox進行DataBindings 按一下 "中文名稱" 的TextBox, 在"屬性"列中展開"(DataBindings)", 在"Text"欄位中按下功能表, 選擇關於中文名稱的資料庫欄位, 注意Binding Source要跟DataGridView所用的一樣。 把葡萄牙文的那個TextBox用同樣方法弄好。 接下來為DataGridView的TableAdapter做Sql Statement的設置。基本上 TableAdapter = DataTable + DataAdapter. 令開發者進一步省點保貴時間。在這裡再提一下,Adapter主要負責Sql Statement的執行,在這個例子查詢&更新兩組SQL是必須的。 按一下位於畫面下面的TableAdapter, 選擇"在DataSet設計工具中編輯查詢" 按一下Adapter的標題, 在工具列中出現屬性頁 在屬性頁中, 展開UpdateCommand,在CommandText中輸入Update SQL Statement. 並在Paremeters中設定參數。 返回Designer頁面,為"更新"按鈕寫點程式碼。 上面程式碼意思是說用DataGridView現在的DataSet透過Adapter對Database進行更新。 完成。 [例子2] 在不直接點選DataGridView修改的前題下修改資料庫中關於中文及葡萄牙文的資料 (Coding篇) 看完上面的例子可以知道VS已經可以令開發一支程式不需要寫任何的程式碼 (我們飯碗不保了囧),不過面對一些比較複雜的情況(例如Update多個Table的時候),

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