2018年11月15日 星期四

初捲-我的捲菸趣聞

在閱讀本文前先強調聲明!!!
抽菸!!!!!!!
有害健康!!!!!!!!!!!!
抽菸量不大也是會有傷害!!!!!!!
沒抽菸的朋友們別因為好奇而抽菸!!!!!趕快按上一頁離開!!!


本文:

我工作的地方有一位義大利留學回來的大哥,每次看他抽菸都是自己手捲的,感覺很有趣,我本來不抽菸的,結果調度到開發第一線後我檔不住開發壓力染上了煙癮,雖然抽的量不大但是還是明顯的有副作用,所以再度呼籲不要抽煙歐~~
既然菸都抽了,當然要想想這生活上一個月會多支出的100多元要怎麼用到最精進,我本來去研究了菸品的各種口味,當然也實際跟人要了幾支來抽,可惜都沒有我想要的好,其中只有卡五還可以接受。
之後我想到,疑?那捲菸呢?會不會比較好,畢竟每次那位大哥抽都聞到滿香的味道,我就Google了一下,這一Google不得了,原來捲菸這麼有趣,而且一包200~300不等可以捲大概100支(自己是還沒捲到這麼多),濾嘴加紙也很便宜。
事不宜遲,馬上調查有菸草跟相關物品的店,發現高雄地區網上討論最多的是位於舊崛江的恆昌商行(地址: 803高雄市鹽埕區803台灣高雄市鹽埕區五福四路七賢三路)。
反正也沒去過舊崛江所以就出發前往啦!!
舊崛江的道路規劃充滿舊時代市集的風味,人潮不多所以滿好停車的。
來到崛江三街
走到底就可以看到恆昌商行
老闆人很親切,對我這種新人也很熱心地介紹各種菸草、菸紙跟濾嘴的差異。
最後買一買也才375而已,真的很便宜。
我沒有買捲菸器,因為我請向用手捲,這影片教學還不錯,可以看看。

2018年10月14日 星期日

C# 流程控制-for的用法

今天要來介紹for的用法,for在程式的流程控制中十分重要,所以熟悉語法是必修的一課歐。
首先先看看他的架構:
for (initializer"初始設定式"; condition"條件"; iterator"變化方式")
{    
body(迴圈主體)
}
或
for (initializer"初始設定式"; condition"條件"; iterator"變化方式")
    body(迴圈主體)
"初始設定式、條件、變化方式"三個區段都是選擇性的,可以依照需求去設定。body(迴圈主體)是陳述式或陳述式區塊,簡單來說就是我們要他執行的動作。
那我們現在建立一個Console環境來測試
我想要讓他從0數到5,程式碼如下:
for (int A = 0; A < 6; A++)
{
    Console.WriteLine(A);
}
Console.ReadLine();
"初始設定式"我設定一個int資料型別A等於0、給予他"條件"為小於6、"變化方式"的A++意思其實就是A+1的意思,最後在迴圈主體我設計每次進入迴圈就要傳出A當下的值
這解說可能不是很懂,所以我們可以運用"流程圖"來解釋,流程圖如下:
上面這就是很基礎的for迴圈,下面介紹"巢狀迴圈"。

巢狀迴圈

有時在程式設計時,遇到需要複雜運算的時候,可在迴圈中再加另一迴圈,就會形成巢狀迴圈,但記住不同層次的迴圈不得使用相同變數歐。
            for (int a = 1; a <= 9; a++)
            {
                for (int b = 1; b <= a; b++)

                    Console.Write(a + " ");

                Console.WriteLine();
            }
            Console.ReadLine();
執行完會長這樣

第一個迴圈:
首先"初始設定式"我設定一個int資料型別a等於1、給予他"條件"為小等於9、"變化方式"的a+1,最後在迴圈主體我設計每次進入迴圈就到第二個迴圈。
第二個迴圈:
"初始設定式"我設定一個int資料型別b等於1、給予他"條件"為小等於第一個迴圈的a、"變化方式"的b+1,最後在迴圈主體我設計每次進入迴圈就傳出當下的a值並空一格再跳一行。
流程圖如下:
最後我將介紹"無窮迴圈"

無窮迴圈

所謂無窮迴圈就是程式的控制流程一直在重複執行某一段程式碼,形成無法結束的情形,其原因可能是程式中的迴圈沒有設結束迴圈條件或是結束迴圈的條件不可能成立等等因素。
例一,沒有設結束迴圈條件
在"條件"中忘了指定所以造成無窮迴圈
            for (int a = 2;; a++)
            {
                    Console.Write(a);
            }
            Console.ReadLine();
例二,結束迴圈的條件不可能成立:
在"條件"指定a要小於等於5,但卻設定"變化方式"是減數,造成變數永遠不會達到值
            for (int a = 1; a <=5; a--)
            {
                Console.Write(a);
            }
            Console.ReadLine();
以上就是簡單的for介紹。
有任何問題或是我的資訊有錯歡迎在下方留言告訴我歐。
其他參考資料:
https://docs.microsoft.com/zh-tw/dotnet/csharp/language-reference/keywords/for


By:Ender
Day:2018/10/14
Time:10:54pm
Revision :REV 1.33

2018年10月11日 星期四

C# 攝氏華氏溫度轉換服務系統

今天主題是教大家如何使用C#來設計"攝氏華氏溫度轉換服務系統"
在開始前先致謝高雄科技大學陳茂盛老師教導C#程式設計這門藝術。

本次使用的程式編譯器為Microsoft Visual Studio

那~~讓我們開始吧!!

首先先了解攝氏華氏換算公式:

再來我們在建立一個類別庫(.NET Framework)來讓我們建立一個類別庫。

類別庫程式碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//以上都是自動生成

namespace TPService
{
    public class TPClass
    {
        public double DC { set; get; }
        public double DF { set; get; }
        //設定DC與DF接收值

        public double CtoF(double _inputc)
        //建立一個公用(public)的double命名為CtoF(CtoF可自行更改)後()內設定_inputc為double型別
        {
            DF = (_inputc * 9.0 / 5.0) + 32.0;//DF值等於_inputc乘9除5再加32
            return DF;//記得 return
        }
        public double FtoC(double _inputf)
        {
            DC = (_inputf - 32.0) * 5.0 / 9.0;
            return DC;
        }
    //FtoC也是同道理
    }
}
再來在專案中新增一個WindowsFormsApp

之後我們先將WindowsForm設成起始專案
再將我們的類別庫(.NET Framework)參考進來
做完後我們需要2個TextBox、2個Label與4個Button
點選物件後可以利用右下角來更改相關名字或數值
下圖是我目前的相關命名,記住命名以利後續的程式撰寫。
雙擊每個物件
自動生成大概是長這樣:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void BTN1_Click(object sender, EventArgs e)
        {
        }
        private void BTN2_Click(object sender, EventArgs e)
        {
        }
        private void BTN3_Click(object sender, EventArgs e)
        {
        }
        private void BTN4_Click(object sender, EventArgs e)
        {
        }
        private void TB1_TextChanged(object sender, EventArgs e)
        {
        }
    }
}
首先先加入我們的類別庫
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using TPService;//使用TPService(就是您的類別庫)

再來我們先編輯BTN1的部分,程式碼如下:
        private void BTN1_Click(object sender, EventArgs e)
        {
            TPClass changetp = new TPClass(); //使用TPClass並命名為changetp
            if (string.IsNullOrEmpty(TB2.Text))
            //如果TB2是不存在或是不允許的值就執行{}中的行為
            //這部分是為了怕有人打錯數值或沒輸入就轉換而做的防呆機制
            {
                MessageBox.Show("請輸入數值");
                return;
            }
            else //不然
            {
                changetp.DC = changetp.FtoC(double.Parse(TB2.Text));//changetp中的DC等於changetp中的自訂式FtoC(接收TB2的值並使用double資料型態)
                TB1.Text = changetp.DC.ToString("##.00");//TB1顯示changetp的DC的值格式取小數後2位
                TB2.Text = double.Parse(TB2.Text).ToString("##.00");//TB2顯示原TB2的值,格式也取小數後2位
            }
        }
BTN2也是一樣作法歐,稍微改變下而已
private void BTN2_Click(object sender, EventArgs e)
        {
            TPClass changetp = new TPClass();
            if (string.IsNullOrEmpty(TB1.Text))
            {
                MessageBox.Show("請輸入數值");
                return;
            }
            else
            {
            changetp.DF = changetp.CtoF(double.Parse(TB1.Text));
            TB2.Text = changetp.DF.ToString("##.00");
            TB1.Text = double.Parse(TB1.Text).ToString("##.00");
            }
        }
再來是BTN3
這部分是清理TB1與TB2的值,我們可以運用Clear()的功能。
        private void BTN3_Click(object sender, EventArgs e)
        {
            TB1.Clear();
            TB2.Clear();
        }
最後是離開的按鈕設定
我們要做到這個效果

        private void BTN4_Click(object sender, EventArgs e)
        {
            if(MessageBox.Show("確定離開?","TPService",MessageBoxButtons.OKCancel,MessageBoxIcon.Question,MessageBoxDefaultButton.Button1)==DialogResult.OK)
            Application.Exit();
        }

基本上相關對照如下:
這樣就完成了。
下方整理了完整的程式碼:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using TPService;

/*
 代號參考表:
 BTN2=轉換紐
 BTN3=清除資料紐
 BTN4=EXIT紐
 TB1=攝氏TEXTBOX輸入欄
 TB2=華氏TEXTBOX輸入欄
*/

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

 

        private void BTN2_Click(object sender, EventArgs e)
        {
            {
                TPClass changetp = new TPClass();
                if (string.IsNullOrEmpty(TB1.Text) && string.IsNullOrEmpty(TB2.Text))
                {
                    MessageBox.Show("請輸入數值");
                    return;
                }
                else if (string.IsNullOrEmpty(TB2.Text))
                {
                    changetp.DC = changetp.CtoF(double.Parse(TB1.Text));
                    TB2.Text = changetp.DF.ToString("##.00");
                    TB1.Text = double.Parse(TB1.Text).ToString("##.00");
                }
                else
                {
                    changetp.DF = changetp.FtoC(double.Parse(TB2.Text));
                    TB1.Text = changetp.DC.ToString("##.00");
                    TB2.Text = double.Parse(TB2.Text).ToString("##.00");
                }
            }
        }

        private void BTN3_Click(object sender, EventArgs e)
        {
            TB1.Clear();
            TB2.Clear();
        }

        private void BTN4_Click(object sender, EventArgs e)
        {
            if(MessageBox.Show("確定離開?","TPService",MessageBoxButtons.OKCancel,MessageBoxIcon.Question,MessageBoxDefaultButton.Button1)==DialogResult.OK)
            Application.Exit();
        }
    }
}
By:Ender
Day:2018/10/11
Time:06:16am
Revision :REV 1.33

2018年10月7日 星期日

啟用Raspberry PI 3

第一次使用Raspberry需要一些前置作業,在使用前先了解一下這塊悄悄推動創客文化的可愛單晶片電腦的歷史吧。

2006年,早期的樹莓派的概念來源於Atmel的ATmega644單片機。其原理圖和PCB布局可供公眾下載。

基金會受託人埃·厄普頓(Eben Upton)彙集了一批教師學者和電腦愛好者,製作一套啟發孩子的電腦。這種電腦是受到了1981年的艾康電腦公司的BBC Micro電腦的啟發。第一台ARM電腦的原型被裝在與一個隨身碟的大小相同的一個「盒子」中。它一端有一個USB埠,而另一端有一個HDMI埠。
詳細的內容可以查看:https://goo.gl/COuxot

在開始前我們需要準備一些東西:


Raspberry PI樹莓板:

電源供應器:
提供穩定電力,規格為5V Micro-USB接頭,若是Raspberry PI 2建議使用2A(至少1.5A)而Raspberry PI 3則建議使用2.5A(至少2A)。

鍵盤及滑鼠:
在首次設定必須是有線鍵盤及滑鼠才能為無線或是遠端進行設定。

Micro-SD記憶卡:
提供樹莓派的資料儲存裝置。

Micro-SD記憶卡讀卡機:
用來燒錄系統至Micro-SD記憶卡。

電視或電腦螢幕:
樹莓無法直接使用VGA介面,如果有DVI介面需使用HDMI-DVI轉接線。

螢幕連接線與轉接頭:
樹梅派端為HDMI接頭,正常螢幕線接頭無HDMI端會需加轉接頭。

區域網路線:
連接網路(這不是廢話嗎?哈哈)。

區域網路集線器:
未來需要多個相連必備,若沒有就可以先不用。

區域網路WI-FI器:
Raspberry PI 2無自建Wi-Fi接收功能需加購Wi-Fi相關套件,Raspberry PI 3有內建可直接連線。



下載與安裝Raspberry PI:

樹莓派單板電腦並沒有硬碟,我們是使用Micro-SD卡安裝作業系統,雖然樹莓派支援多種作業系統,對於初學者來說,建議使用官方Raspbian作業系統,這是入門樹莓派的最佳選擇。

雖然樹莓派基金會提供NOOBS套件幫助我們安裝Raspbian作業系統。

不過,因為很多樹莓派應用都需自行下載與寫入映像檔,所以我們選用自行下載與寫入Raspbian映像檔至Micro-SD卡,其基本大致步驟如下所示:
1.下載Raspbian映像檔
2.格式化Micro-SD卡
3.將Raspbian映像檔寫入Micro-SD卡
4.將Micro-SD卡插入樹莓派

好讓我們開始吧!!
下載Raspbian映像檔:
 Raspbian映像檔可於樹莓派基金會官方網站直接下載。

下載網址:https://www.raspberrypi.org/downloads/raspbian/


上圖為樹莓派基金會官方網站下載頁面,左邊為NOOBS,為方便未來實驗請選擇右邊的RASPBIAN,然後會進入選擇下載版本的頁面,請下載左邊的完整版(包含PIXEL桌面系統);右邊則為精簡版LITE。


上述左右2個版本各有2個按鈕可供下載,以完整版來說,右邊按鈕為直接下載zip格式檔案,因檔案約為1.4GB左右,有些龐大,很遺憾樹莓派基金會官方網站的下載速度不慎理想,如果下載許久可改以左邊按鈕下載Torrent檔。

(附註:Torrent檔需使用μTorren工具來下載,此軟體運用方法因本次尚未運用到且暫停服務中故不在此介紹。)。

格式化Micro-SD卡:
在將Raspbian映像檔寫入Micro-SD卡前,不論是新Micro-SD卡或舊Micro-SD卡,都有可能殘留一些檔案,為避免影響Raspbian映像檔寫入或佔有空間,需使用SDFormatter工具來格式化Micro-SD卡(不建議使用Windows內建格式化功能)。

SDFormatter是一套免費軟體,可以直接於官方網站下載。

下載網址:https://www.sdcard.org/downloads/formatter_4/eula_windows/













進入網頁後捲動視窗至最下方,點選Accept下載ZIP格式檔案,解壓縮後安裝。






成功安裝完SDFormatter工具後,開啟工具,我們就可以開始格式化Micro-SD卡了,操作介面說明如下圖。





Step 1:將Micro-SD卡插入讀卡機後再插入PC電腦的USB插槽。
Step 2:在Select card欄選擇欲格式化的Micro-SD卡名,確認Card information欄中片資訊正確。
Step 3:在Formatter options欄中選擇Quick format之後點選Format進行格式化。

將Raspbian映像檔寫入Micro-SD卡:
在Windows作業系統中並沒有映像檔寫入工具,我們需要安裝Win32DiskImager工具來將Raspbian映像檔寫入Micro-SD卡。

Win32DiskImager是一套免費軟體,可以直接於官方網站下載。
下載網址:
https://sourceforge.net/projects/win32diskimager/files/latest/download


進入官方網站下載頁面數秒後會自動下載,下載完後進行安裝作業。

成功安裝完Win32DiskImager工具後,開啟工具,我們就可以開始將Raspbian映像檔寫入Micro-SD卡了,操作介面說明如下圖。




Step 1:將Micro-SD卡插入讀卡機後再插入PC電腦的USB插槽。
Step 2:於映像檔欄右側捲動欄選擇欲寫入的Micro-SD卡名,於捲動欄左邊選擇映像檔名稱,按下”寫入資料到[裝置]中”開始寫入裝置。

將Micro-SD卡插入樹莓派:
全部作業完成後將Micro-SD卡插入樹莓派,本實驗所用的raspberry pi 3中SD卡插槽於板身背後,如圖所示。







開始架設Raspberry PI3周邊設備:

Note!:請特別注意,樹梅派雖支援藍芽滑鼠用鍵盤,但在初次設定時仍需要使用USB有線鍵盤與滑鼠來進行藍芽配對,另外請注意Raspberry PI 3自己具備WI-FI接收之功能但Raspberry PI 2並不自備,需額外使用WI-FI模組來擴充WI-FI能力。

先參考我們的架設圖:

很簡單就是插線而已,跟一般電腦一樣。
線接完我們可愛的樹莓派就可以通電了歐!!

啟動與設定Raspbian:
完成Raspbian的下載、安裝與連接樹莓派周邊裝置後,就可以開始使用樹莓派了。

在這裡要先了解,啟動與關機樹莓派就是啟動和結束Raspbian作業系統,目前版本的Raspbian作業系統啟動進入的是PIXEL桌面環境(對比Windows視窗系統),而不是終端機的命令模式。

啟動樹莓派:
因為樹梅派並沒有電源開關,當我們將5V電源插入時就會馬上啟動Raspbian作業系統,稍等後就會進入預設的PIXEL桌面環境。

桌面環境類似Windows系統,相關圖示說明如下圖:














正確的關機樹莓派:

會開機當然要會關機拉,樹莓派十分敏感,所以關機時務必照著SOP執行歐~~

在桌面環境執行「Menu →Shutdown」,如圖,可以看到shutdown Options對話方塊。

按shutdown鈕關機,稍等一下,就可以移除電源。
按Reboot鈕是重新啟動Raspbian作業系統。
按Logout鈕是登出使用者。













那啟用Raspberry PI 3的部分就介紹到這拉~~下一篇會介紹一些Raspberry PI的基本設置。

敬請期待吧!!

By:Ender
Day:2018/10/07
Time:09:19pm
 Revision :REV 2.03

2018年10月6日 星期六

Azure Machine Learning簡單操作介紹

今天聽了一場講座,主題是關於"AI機器學習"的相關應用",不論是相關的基礎知識或是目前市場上的應用都精闢解說,在短短的3小時內也實機操作了目前免費的"Microsoft Azure Machine Learning Studio"這套雲端AI training平台,這下參與費用500也算值得拉,不同以往用過的Azure服務,這次更人性化、更簡單,有興趣的人可以趁免費測試時間多玩玩,既然學習了,就在此記錄下相關技法供需要者使用:


Step 1:
進入Microsoft Azure Machine Learning Studio網址如下,只要是Azure的帳號都可以登入使用,沒有的就申請一個,程序簡單打打信箱收收信而已,所以不再此多做介紹。
網址:https://studio.azureml.net/











Step 2:
進入平台後會看到他大概的配置如下圖。












Step 3:
我們先匯入一個資料Sample供機器學習(也就是日後演算的框架)。
點選左下角的New,左側工具列選擇DATASET,從FROM LOCAL FILE匯入資料,我整理了一份由政府提供的環境監測資料,就用它來做為範例練習練習吧。
範例網址:https://goo.gl/sWRnQj











Step 4:
再來點選左下角的New,選擇EXPERIMENT,然後點選Blank experiment建立空白實驗。











Step 5:
建立好新實驗,會進入流程編輯頁面。











Step 6:
先從左側Module工具列中的My Datasets中拉取我們的檔案。











Step 7:
在Module搜尋列中打上select columns搜尋Select Columns in Dataset的Module,將它拖曳到編輯流程中,並把我們的資料Module與select columns連結起來。











Step 8:
此時會看到Select Columns in Dataset旁有個紅色驚嘆號,那是因為我們還沒讓他選擇所需的列,所以點選Select Columns in Dataset右側出現的工作欄中點選Launch column selector
我們選擇我們想預測的"PM2.5",再來選擇我們覺得可能會影響的數值:
AMB_TEMP(溫度)、WIND_SPEED(風速)WS_HR(小時風速值)
選完後使用兩欄位中間的箭頭將其移至參考值。



Step 9:
找到 Split Data ,拖曳至編輯流程中,將它與Select Columns in Dataset連起來,在右側跳出的工作欄中修改Fraction of rows的參數,修改為0.8
(0.8代表以資料的80%為訓練材料,因為我們資料量不多,所以%越多越好,剩下20%做為資料驗證的模型材料)
完成調整後先SAVE,再來點選RUN讓系統產生資料。





Step 10:
我們選用"線性回歸演算法",搜尋Linear Regression,拖曳至編輯流程中。











Step 11:
我們要開始訓練AI了,搜尋Train Model拖曳至編輯流程中,並把Linear Regression與 Split Data 連上Train Model。

Note!:若沒先RUN過,Train Model會產生紅色驚嘆號,先刪除Train Model,RUN過後再將Train Model拖曳回來即可。












Step 12:
點選Train Model右側跳出的工作欄中點選Launch column selector,進行設定。
我們想預測的"PM2.5",選擇"PM2.5"使用中間箭頭將其移至預測欄。

Step 13:
找到Score Model拖曳至編輯流程中,並將它與Train ModelSplit Data連結起來。











Step 14:
完成連線後先SAVE,再來點選RUN讓系統產生資料。





Step 15:
Score Model右鍵選擇Score Dataset裡的Visualize來觀看預測數據。
最右邊的Scored Labels是預測出來的值,當然~~因為我們資料量不足且比較種類太少所以有的準確有的不準確。














Step 16:
現在我們將流程轉成實驗服務並將其發布上網,點選下方功能列的Predictive Web Service
等待流程轉換完後,先點選RUN,之後點選DEPLOY WEB SERVICE來發行我們的預測模組。







發布後就能看到你的預測模組相關的訊息,到這裡簡單展示一下"Microsoft Azure Machine Learning Studio"這套雲端AI training平台的功能,其實這只是冰山一角拉,若有興趣的朋友們可以Google一下有許多文章與功能介紹。

By:Ender
Day:2018/10/07
Time:01:53am
 Revision :REV 2.01