2019/7/2

由string反序列化Json物件的方法

1. 透過http://json2csharp.com/ 直接貼上json語法,會產生對應的C#物件。

2. using Newtonsoft.Json;

3. 以 JsonConvert.DeserializeObject 將 string反序列化Json物件成為C#內的物件
    在整理成DataTable 後,轉成html

private void parseJson(string json)
        {
            //ReadFromFile();           
            RootObject rootObject = JsonConvert.DeserializeObject(json);
            int days = rootObject.days;
            //MessageBox.Show("共" + days + "筆資料");

            DataTable newDt = new DataTable();
            newDt.Columns.Add("column1", typeof(string));
            newDt.Columns.Add("column2", typeof(string));           
            newDt.Columns.Add("column3", typeof(string));
            newDt.Columns.Add("column4", typeof(string));
            newDt.Columns.Add("column5", typeof(string));
           

            int i = 0;
            while (++i <= days)
            {
                newDt.Columns.Add(i.ToString(), typeof(string));
            }

            //rootObject.aaData.Sort(CompareFloat);   
           
            foreach (DataRow row in rootObject.aaData.Rows)
            {
                //MessageBox.Show(row["id"] + " - " + row["item"]);               
                if ( !row["score_0"].Equals("100.0000"))
                {
                    DataRow workRow;

                    workRow = newDt.NewRow();
                    workRow[0] = row["eDeskId"];
                    workRow[1] = row["systemName"];
                    workRow[2] = "";
                    workRow[3] = row["keySystem"];

                    for (i = 0; i <= days; i++)
                    {
                        string score = row["score_" + i].ToString();

                        if( score.Equals("100.0000") )
                        {
                            workRow[i + 4] = "100";;
                        }
                        else
                        {
                            redCount++;
                            workRow[i + 3] = "" + row["score_" + i] + "";
                        }                       
                    }

                    newDt.Rows.Add(workRow);
                }
            }
                       
            stringHtml = ExportHtml(newDt);

            textBox2.Text = stringHtml;

            htmlFileName = "qos_" + DateTime.Now.Month + "_" + DateTime.Now.Day + ".html";
            StreamWriter sw = new StreamWriter(workDir + @"\" + htmlFileName, true, Encoding.Default);           
            sw.Write(stringHtml);
            sw.Close();

            StreamWriter sw2 = new StreamWriter(workDir + @"\redCount.txt", true, Encoding.Default);
            sw2.Write(Convert.ToString(redCount));
            sw2.Close();
        }

C#.net 用webbrowser類別自動抓取網頁程式


用webbrowser類別自動抓取網頁程式

        protected void button1_Click(object sender, EventArgs e)
        {

            if (textBox1.Text == "" || textBox1.Text == "https://")
            {
                textBox1.Text = "https://qos.cht.com.tw";
            }

            webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);

            Navigate(textBox1.Text);



/// 確認網頁是否讀取完畢的方法

private bool checkComplete(string keyword)
        {
            bool b = false;

            while (!b)
            {
                if (webBrowser1.Document != null)
                {
                    foreach (HtmlElement he in webBrowser1.Document.All)
                    {
                        //if(he.Id.Contains(keyword) )
                        if (he.Id == keyword)
                        //if (he.OuterText == keyword)
                        {
                            b = true;
                        }
                    }
                }
                Application.DoEvents();
            }

            return b;
        }



       private bool checkComplete2(string keyword)
        {
            bool b = false;

            while (!b)
            {
                if (webBrowser1.Document != null)
                {
                    foreach (HtmlElement he in webBrowser1.Document.All)
                    {
                        //MessageBox.Show("]" + he.OuterHtml + "[");
                        if(he.OuterHtml.Contains(keyword) )
                        //if (he.OuterHtml == keyword)
                        //if (he.OuterText == keyword)
                        {
                            b = true;
                        }
                    }
                }
                Application.DoEvents();
            }

            return b;
        }

如何在C#.net中加入元件


/// 在類別內加入一個data member,並馬上new物件,呼叫建構子。
partial class Form1 : Form
    {

        private Button button1 = new Button();


///建構子中設定物件屬性
public Form1()
        {
            button1.Location = new Point(10, 10);
            button1.TabIndex = 0;
            button1.Text = "Navigate Qos";
            button1.AutoSize = true;
            button1.Click += new EventHandler(button1_Click);

            ///最後加入Control中
            this.Controls.Add(button1);


2019/6/12

首篇 KZ AS10 五單動鐵高解析度入耳式耳機 開箱評測

首篇 KZ AS10 五單動鐵高解析度入耳式耳機 開箱評測


[前言]


動鐵又稱「平衡電樞」(Balanced Armature),也是助聽器中的必要元件,所以也有助聽器廠商轉作動鐵耳機的。由於其極高的驅動效率,故瞬態響應能力極強,聲音密度也大,加上體積極小,成為入耳式耳塞的微型腔體的優異選項之一,故現在越來越多的入耳式耳機採用了動鐵做為發聲單元。

此番入手一支KZ AS10 五單動鐵高解析度入耳式耳機,上網搜尋一下機體資料,發現居然沒有繁體中文的評測,我想這大概是繁中的第一篇評測文吧?規格也只有英文。




[產品開箱]


▲ KZ AS10 五單動鐵高解析度入耳式耳機外盒正面。

▲ KZ AS10 五單動鐵高解析度入耳式耳機的包裝採夾層式設計,第一個夾層有海綿隔層,簡單展現左右聲道耳機與金屬銘片。
▲ 內部夾層則放置所有配件與文件。



▲ KZ AS10 五單動鐵高解析度入耳式耳機具備5平衡電樞驅動器與0.75mm雙PIN。

▲ KZ AS10 五單動鐵高解析度入耳式耳機所有配備一覽,除了出廠掛上的中型耳塞之外,另外還附上大型與小型耳塞。


▲ KZ AS10 五單動鐵高解析度入耳式耳機也具備有線控器。


▲ KZ AS10 五單動鐵高解析度入耳式耳機既然有線控器,插頭部分想當然爾也是三級式設計,線材採高質感編織設計。


[耳機試聽]

▲ 遊戲BMG測試標的同樣來自傳說對決,評測耳機不想花時間玩遊戲的人可以直接打開音訊檔案測試。

FANTECH HG11 CAPTAIN 7.1耳罩式電競耳機評測傳說對決
▲ 音樂測試標的物同樣來自筆者的YOUTUBE歌單。


[使用心得]


KZ AS10 五單動鐵高解析度入耳式耳機在價格上還沒破2K NTD,ALI上賣66 USD,淘寶則賣¥399,在此價位帶上的耳機,能夠買到五單動鐵高解析度入耳式耳機實在讓人感動,AS 10在外型上找到KZ自己的一套設計風格,藍色半透明的腔體,可以清楚看到背部結構,具備了滿滿的科技感。

動鐵式耳機所需具備的特點,如:高靈敏度、瞬態能力強、高聲音密度在KZ AS10 五單動鐵高解析度入耳式耳機都可以發現。動鐵本身體積小,但用上五單動鐵的KZ AS10卻因為大數量的動鐵使得腔體變大。

瞬態能力強可以再電子音樂中測試得到,我用月風魔傳來測試可以感受到音量急遽由低往上拉的氣勢,泛音上也有所表現。完整的低頻下潛可由頻率測試視頻中得到驗證,幾乎可以完整聽到最低頻率,強烈的重低音同樣可以從Gundam Banshee的前奏中得到體現,如果是其他太差勁的耳機喇吧式聽不大見這段鼓聲的,這首音樂同時也能測試KZ AS10的分離度與高解析度空間感則較偏於腦門後方。求佛中可以聽到有別一般PC喇叭的樂器泛音尾韻與左右音場。

進行傳說對決遊戲時可以感受到有別於手機喇叭的震撼力與空間臨場感,入耳式耳機的體積更適合通勤時配戴,在捷運上網玩幾場傳說對決就靠它了。。

以上小小的使用心得,初步使用覺得KZ AS10 五單動鐵高解析度入耳式耳機的音質完全是筆者的菜,會馬上上位成正宮,成為目前主力耳機,建議不滿意目前手頭耳機與手機喇叭的消費者可以入手。

2019/6/8

【首發開箱文】Philo PV308 飛樂HD 720P前後鏡頭行車紀錄器實測


 ★ 前言 ★


瞻前不顧後是不行,危機可能埋伏在角落,筆者第一台行車紀錄器是千元等級的一體式產品,拍出來的畫質只能說有拍等於沒拍,而且沒有後鏡頭,後來到在Pchome 24小時購物中購買了飛樂Philo的前後鏡頭汽車行車紀錄器,在一次與後車的行車糾紛中,就大大的派上用場,經過這次教訓之後,想說上下班使用機車的頻率更高,所以也想在機車上也安裝上一組行車紀錄器。 因為之前飛樂Philo汽車行車紀錄器的效果覺得不錯,這次也鎖定飛樂Philo,看過產品簡介,並經過一番研究之後,在飛樂官方網站選購了PV308,這台是飛樂在八月分推出的新品,筆者搜尋一下google前幾頁都沒有開箱文章,我想這應該也是第一篇開箱文章吧?!


▲ Philozo PV308 飛樂HD 720P前後鏡頭行車紀錄器產品簡介。

產品型號:
PV308
主晶片:
ARM AORTEX-A7 1.2GHz
記憶體:
2G
FLASH: 
8M
玻璃鏡片: 
鋼化玻璃
前鏡頭解析度: 
720P 30fps
後鏡頭解析度: 
720P 25fps
視頻格式: 
MP4
螢幕LCD: 
2.7英寸
光圈: 
F2.2
主鏡頭廣角: 
140度
後鏡頭廣角: 
140度
感光元件:
H42
鏡頭規格: 
6G+IR濾光
記憶卡: 
C6以上(含)TF卡
後鏡頭線組長度:
2.5M
EV值調整:
支持
循環錄影: 
1/3/5分鐘
一鍵鎖定: 
支持
自動屏保: 
支援
語言: 
繁體中文/英文/簡體中文
麥克風開關: 
支持
記憶卡最大支援: 
支援128.64.32g記憶卡class 10(廣穎/金士頓)
電池容量: 
420mAh
適用溫度: 
0℃~60℃
主機尺寸: 
92*53.5*15mm
重量: 
51g


 ★ 產品開箱 ★


▲ 2018年全新推出的Philozo PV308 飛樂行車紀錄器彩盒外觀,特點為HD 720P與前後鏡頭,再彩盒上一目瞭然。

 
▲ Philozo PV308 飛樂行車紀錄器彩盒背面記載著更詳盡的產品特點,因擁有WDR高動態優化與F2.2超大光圈,使得畫面清晰度更上一層樓。

 
▲ 打開Philozo PV308 飛樂行車紀錄器的彩盒,本體映入眼簾。

 
▲ 四條纜線連接頭具備良好的辨識度,黑色包含前鏡頭、後鏡頭,藍色是鎖檔快捷線,紅色是電源輸入。

 
▲ 兩顆F2.2的防水鏡頭,支援HD 720P。

 
▲ 鎖檔用的快捷線,可以在行車糾紛發生時,立即按下按鈕進行存檔,避免證據被循環覆蓋。

 
▲ 主機下方有四個功能按鍵與TF卡槽,最大支援到128G記憶卡,官方規格上規定採用Class 6記憶卡,筆者建議直接採購Class 10產品,除了容易購買之外,價差也不大,更能保證錄影時不會受限於記憶卡的寫入速度。

 
▲ 主機側面則是產品標示,驗明正身為型號PV308,輸入電壓為5V,內建450mAh電池,主機整體重量51g,算是小巧輕盈的機種。

 
▲ 背面為加大面積的強力磁鐵,吸力強大讓車輛行進間不會掉落,在取下時也更方便。

  
▲ 全體大合照一張。

 
▲ 底層則附上完整配件,包括304不鏽鋼固定腳架*2,主機保護套,鏡頭延長線,12V輸入轉5V輸出的電源變壓連接線,以及接頭套管*6。 


 ★ 產品安裝 ★


▲ Sym GT125為噴射車款,若為化油器車款,原廠建議更換為R級火星塞以維持穩定供應行車紀錄器電源。

 
▲ 由於Sym GT125的電池與電源走線位於右側側板內部。

 
▲ 故選擇就為單純的左側來走線。開啟電門後,12V經降壓電路後,可以供給5V給行車紀錄主機使用。

 
▲ 預計整體走線是長這樣子的,紅色是供電,藍色是鎖檔線,灰色是前後鏡頭,橘色是主機,標示上與實際接頭顏色一樣,必要時要在置物箱內側打孔。

  
▲ 至於如何與機車的電源連通與搭鐵點,其連接原理與USB充電座的接法異曲同工,所以可依據各車型的不同google關鍵字,比如筆者用「GT125 USB充電座」搜尋到一篇同車系的改裝文章,便可以得知正確的接線位置,其他車型可以如法炮製,DIY省錢又樂趣多多,但若沒有基本的電子裝配能力,建議還是牽去給專業車行裝配會比較適當。

 
▲ 前鏡頭的安裝可以依需求與美觀,自行黏貼或者鎖在任何位置。

 
▲ 也能花點巧思,將後鏡頭固定在車牌或者後方手扶手把下方。

 
▲ 依據車種的不同,選擇適當的位置擺放鎖檔按鈕。

 
▲ 主機擺放在置物箱內,然後筆者剛剛好有一塊橡膠磁片,剛剛好可以吸附住主機。


 ★ 實際拍攝 ★

分別取材Philozo PV308 飛樂前後鏡頭行車紀錄器四份影像檔,共有白天拍攝的前後鏡頭與晚間的前後鏡頭影像。
▲ 錄製的紀錄位於記憶卡的video目錄內,VIDA子目錄存放前鏡頭影像,VIDB子目錄存放後鏡頭影像,還有一個SOS子目錄。


▲ 高雄鐵路地下化即將於2018/10/14通車,往後民族路橋的機車道即將被拆除,在此傍晚時分,以前鏡頭HD 720P影像拍攝他最後的身影,而前方右側正是高雄第二高樓 - 世貿聯合國。



▲ 接著沒多久便在更前方路口巧遇他車的事故,本來以為鏡頭沒有抓好角度,沒想到後鏡頭在此刻派上用場,屁股正對的機車碰撞轎車的角度,這個故事告訴我們機車要有一台行車紀錄器,雙鏡頭更有保障。

 
▲ 回家後發現時間沒有調整正確,便立即校正時間,因為時間不正確的行車紀錄,其證據力會大打折扣。飛樂PV308可以在畫面左上角顯示時間!


▲ 晚上的影像則節錄一段經過美麗島站的行車紀錄,前鏡頭裝置在龍頭時,停車時還可以控制拍攝方向。


▲ 由後鏡頭觀看美麗島站,別有一番趣味,然後被後車的大燈打到在所難免,整體而言夜間影像清晰,辨識度極高。


 ★ 心得結與 ★

相對於一體式的行車紀錄器,飛樂Philozo PV308較為低調,主機放置在置物箱中,可以得到比較多的保護,前後鏡頭採用六角螺絲比較不容易隨手拆解,安裝上也不難,只是需要一點點耐心。 

機體啟動速度相當快速,一送電便馬上可以錄影,雖然官方規格標示使用支援廣穎/金士頓的記憶卡,但是筆者使用宇瞻Class 10的32G記憶卡也沒有問題。檔案大小可以選擇一分鐘、兩分鐘跟三分鐘,也可以設定曝光補償。

飛樂Philozo PV308具備140度廣角與雙鏡頭,可以收納更大範圍,避免沒有拍到死角,瞻前不顧後是不行,危機可能埋伏在後方,飛樂Philozo PV308多一顆後鏡頭就是多了一份保障。 
機車行車紀錄器與汽車用的最大不同在於防水性能,飛樂Philozo PV308的所有連結頭都有加長,塞入時還要費點力,算是非常的扎實,如果纏上電火布會讓防水性能更好。 

攝影圈常有一句名言,就是「豔陽無爛鏡」,所以行車紀錄器最大的決戰點在夜間,飛樂Philozo PV308提供WDR高動態優化與F2.2超大光圈,讓夜間的影像也變成實際上的強力佐證,而不是有拍等於沒拍,更巧的是第一次上路就看到剛發生的機車事故,有一台行車紀錄器保障自我權利真的很重要。