2016年10月29日 星期六

[Unity 3D] Vuforia結合Unity實作AR

完成結果 : 沉思的骷顱頭

範例檔提供AR開發步驟與實作會使用到的模型

[Unity 3D] 透過php檔案存取MySql資料庫

網頁部分
安裝架站伺服器XAMPP (https://www.apachefriends.org/zh_tw/index.html)
安裝完成後,找到在此路徑下C:\xampp\htdocs放要執行SQL語法的網頁,如下:此範例圖示.php的檔案內容,內容是新增一筆資料到MySQL資料庫,完成後將檔案儲存在C:\xampp\htdocs底下



Unity 部分
讀取資料
using UnityEngine;
using System.Collections;
using System.IO;
using System.Net;
using UnityEngine.UI;

public class rankingboard : MonoBehaviour
{
    public string url;  //url是指要連結的php檔案位置,此範例為127.0.0.1/select.php
    HttpWebRequest request;

    void Update()
    { 
 StartCoroutine (reflashboard ());
    }

    IEnumerator reflashboard()
    {
 yield return new WaitForSeconds (2f);
 request = (HttpWebRequest)WebRequest.Create(url);
 //request.Method = "POST";
 request.ContentType = "application/x-www-form-urlencoded";
 
 WebResponse response = request.GetResponse();
 Stream stream = response.GetResponseStream();

 StreamReader sr = new StreamReader(stream);

 rankinginfo = sr.ReadToEnd();
 string[] word = rankinginfo.Trim().Split(',');

 //word[0]就是讀到的第一筆資料 
    }
}
新增,刪除,修改資料(要執行那一個功能,是根據連結到的php檔案是執行刪除的sql語法還是刪除或修改的sql語法)
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using System.Net;

public class ButtonClick : MonoBehaviour {
{
    public string url;  //url是指要連結的php檔案位置,此範例為127.0.0.1/insert.php

    void Update()
    { 
 WWWForm form = new WWWForm ();
 form.AddField ("score", score.ToString ());    //score是php檔案內的$_POST['score'],單引號內的變數
 form.AddField ("groups", team_name);           //groups是$_POST['groups'],單引號內的變數
        for (int i = 0; i < DBcolumn.Length; i++)
 {
     form.AddField (DBcolumn[i], inputfield[i].text);
 }
 WWW www = new WWW (url, form);
 StartCoroutine (updatesco (www));
    }

    IEnumerator (updatesco (WWW www){
 yield return www;
    }
}
沒有範例

[Unity 3D] 白板功能(切換筆色,清除和恢復筆畫)和擷取螢幕畫面

結果呈現如下:

SCREEN SHOT : Unity 3D目前螢幕擷取方式有兩種
第一種 : 
使用Unity 3D現成的Application.CaptureScreenshot("pic.png")函式來完成螢幕畫面的擷取,圖片儲存路徑預設為Application.persistentDataPath

第二種 :
使用ReadPixel的方式來完成螢幕畫面的擷取,程式碼如下:
public Camera mainCamera;
IEnumerator ScreenCapture() {
     //在擷取畫面之前請等到所有的Camera都Render完
     yield return new WaitForEndOfFrame();
     Texture2D texture = new Texture2D((int)mainCamera.pixelWidth, (int)mainCamera.pixelHeight);
     //擷取全部畫面的資訊
     texture.ReadPixels(new Rect(0, 0, (int)mainCamera.pixelWidth, (int)mainCamera.pixelHeight),0,0, false);
     texture.Apply();
}
螢幕擷取後,儲存圖片:
void SaveTextureToFile(Texture2D texture, string fileName) {
     byte[] bytes = texture.EncodeToPNG();
     string filePath = Application.dataPath + "/" + fileName + ".png";
     using (FileStream fs = File.Open(filePath, FileMode.Create)) {
          BinaryWriter binary = new BinaryWriter(fs);
          binary.Write(bytes);
     }
}
程式碼參考自 -> http://www.iverv.com/2014/04/unityscreenshot.html

螢幕畫面擷取後儲存的路徑分類:
Application.dataPath
建議視窗開發中用的路徑:
windows:  /Assets
IPone: Application/???/Name.app/Data
Android: /data/app/Name.apk

Application.persistentDataPath
Contains the path to a persistent data directory (Read Only).
平台中的公開目錄,文件持久性的保存不會因為應用程式更新或升級而刪除
windows:  C:/Users/xxxx/AppData/LocalLow/CompanyName/ProductName
IPone: Application/???/Documents
Android: /data/data/Name/files

Application.streamingAssetsPath
專案目錄下面的 Assets/StreamingAssets
windows:   /Assets/StreamingAssets
IPone: Application/???/Name.app/Data/Raw
Android: jar:file:///data/app/Name.apk/!/assets

Application.temporaryCachePath
Contains the path to a temporary data / cache directory (Read Only).
平台的快取儲存路徑
windows: C:/Users/xxxx/AppData/Local/Temp/CompanyName/ProductName
IPone: Application/???/Library/Caches
Android:  /data/data/Name/cache

[Android] 偵測聲音分貝

呈現畫面如下圖


2016年9月12日 星期一

青檸檬酊餐具洗潔精DIY

作者: 
總會環保小組
近年大眾的環保意識大大提升,而坊間也有出售不少標榜含「天然配方」、橘子精華的清潔劑。但其實我們在家也可以很輕鬆、簡單做出天然、環保的清潔劑。尤其在盛產柚子、檸檬和橘子的季節,這些水果不旦取得方便,且價格便宜,而且還是在地生產,更能符合低碳的環保目標。我們一同來看看環保小組的媽媽如何善用這些果皮來做洗潔精吧!
材料:
500ml的玻璃瓶1個、洗淨擦乾的柑橘類果皮30克 (柚子、柳丁、檸檬…等芸香科果實都可製作) 、75%酒精150ml及刨刀1把。
做法:
1.     以刨刀刨下柚子、橘子、柳丁或檸檬的最外層(含油囊),儘量避開白色的那一層。
2.     先把酒精倒入玻璃瓶中,然後再把刨下來的果皮泡於酒精中,蓋好瓶蓋後搖晃均勻,放於陰涼處浸泡3~7天後過濾取液即成青檸檬酊(讀音:ㄉ一ㄥˇ)。
適用範圍:
洗碗、洗廚房、洗衛浴等。製作好的青檸檬酊可加水稀釋後,分裝到小瓶子以方便日常使用。稀釋比例約1:50~100(青檸檬酊:水),可依要清理的油污情況而作調整。
注意事項:
1.     為避免酒精腐蝕塑膠,故建議選擇玻璃容器製作。
2.     平常吃完水果的果皮若量不夠多,可先將果皮儲存在冰箱,等收集較多時再製作洗潔精。
3.    若要清理較髒、較油的地方,可先用稀釋的青檸檬酊浸泡餐具20-30分鐘後再作清潔。廚房牆壁的油污可將已使用過但仍乾淨的廚房紙/廢碎布覆蓋在其表面,然後把已稀釋的青檸檬酊噴灑在廚房紙或碎布上,30分鐘後再進行清潔。
4.    柚子皮剩下來的白色部份,曬乾後可作天然蚊香使用。

轉貼自主婦聯盟http://www.huf.org.tw/essay/content/2928

環保酵素DIY

作者: 
文:胡雅美 / 總會環保小組志工講師;圖:波力
    
台灣的傳統料理方式,最容易產生油膩膩、湯湯水水的廚餘,讓收拾者處理上倍感困擾!近二十年來,在我們有心的環保主婦們積極奔走下,終於讓廚餘垃圾開始走向「資源化」。就連大家家裡不要的廚餘果皮,只要經過簡單處理便可變成有去汙效果的「環保廚餘酵素」。其道理很簡單,就是利用好的微生物,去壓制壞的微生物(即拮抗作用)。而且環保廚餘酵素可以將油脂分解成小分子,使物品表面的污垢更容易被帶走,減少清潔時的用水量,真的是既經濟又實惠。

同時,它也可催化、加成清潔功效,取代一般家用的化學合成清潔用品,讓使用者的身體和環境免受環境荷爾蒙的威脅;還有一個大家想不到的好處,當廚餘酵素倒入排水系統,如:下水道、糞池、水溝等,可防止水管堵塞、分解污水污泥、淨化河流和海洋,達到潔淨水質的效果。

    另外稀釋的環保廚餘酵素也可以提供作物的營養、抑制病蟲害發生;而且它更可以中和土壤酸鹼值,活化土壤,替代傳統化肥與農藥支出,既省成本也能兼顧環保,環保廚餘酵素真可算是維護環境的大功臣。
    其實製作環保廚餘酵素一點都不難,它真的好做又好用,更重要的是它的確是全方位的環境保護網!心動不如趕快行動,大家一起動手DIY吧!

環保酵素製作方式
材料:有蓋的塑膠瓶、新鮮果皮或菜葉殘渣、黑糖、自來水。

比例:1(黑糖):3(新鮮果皮、菜渣):10(自來水) 

製作過程:
1. 先放入60%自來水到容器內(如1,000cc的塑膠瓶便須放入600cc的水);
2. 將黑糖(600cc冷開水÷10=60克黑糖)放進塑膠瓶拌勻;
3. 新鮮果皮、菜渣(宜先沖洗、陰乾)切小塊後加入塑膠瓶拌均(60克黑糖×3=180克新鮮果皮、菜渣)
4. 寫上製作的日期及內容物;
5. 關緊瓶口,拴緊瓶蓋後,每天上下搖動瓶子10下,以加速發酵,搖動後蓋子不要拴緊。
6. 連續3週搖動瓶子後,便可把蓋子拴緊並置於陰涼處。再把瓶子靜置兩個月不動後環保廚餘酵素便完成了。
使用方法:酵素需稀釋使用,效果會較佳
用途酵素:水用法
居家清潔劑1:10洗衣服、洗碗、洗地板、洗爐灶、洗廚房、洗髮沐浴等等均可使用。也可以1:1方式與一般家用的化學合成清潔用品一同使用,可減少清潔劑使用量。
除臭劑1:50消除家裡臭味或鞋子裡的異味。
清洗蔬果農藥1:50浸泡蔬果45分鐘,剩下的水可作洗廁所或澆花。
栽種植物1:50-100澆花木。
保濕1:100可噴臉保濕,但不宜日曬。
注意事項:
1. 必須用塑膠容器,因金屬或玻璃容器不利酵素膨脹;
2. 容器宜保留10-20%的發酵空間,否則酵素沒有足夠的空間活動,瓶子會容易爆開哦!
3. 製作好的環保酵素須放在空氣流通的陰涼處,避免陽光直射。
4. 請勿用魚肉或有油脂的、骨頭類的食物,會容易出現臭味。
5. 如果無法一次收集到所需的果皮量,可先放冰箱先冷藏,待數量足夠時再製作環保廚餘酵素;又或者先在瓶內裝好已拌勻黑糖的水,再逐次加入果皮或菜渣。待數量足夠時,再以那天為基準日算3個月。
6. 成功酵素呈現棕黃色,顏色變黑並發出臭氣味即知失敗了,須重新加入等量的糖再重新發酵3個月即可。

轉貼自主婦聯盟(http://www.huf.org.tw/essay/content/2993)

2016年8月26日 星期五

[記事] 參加六龜內觀中心的禪修10日課程 2016.8.10

第二次參加六龜法邁內觀禪修中心的10日禪修課程,由於第一次的參加後的經驗讓我的身心有著不同以往的好感受,所以在這邊簡單介紹內觀中心與自身的體驗,關於內觀禪修的介紹可以連結官網

首先對於內觀中心與內觀禪修,這邊先讓大家有正確的認知:
1.  該中心不屬於任何宗派組織,只是一個教授內觀禪修方法來調伏心的中心,就像是一個瑜珈教室,教授瑜珈動作來鍛鍊身心,不管是基督教、道教、印度教等都可以參加

2. 課程完全免費,中心的維護與學員的食膳都是由過去的舊學員隨喜捐贈來維護,不捐款也不會有人理你

3.  此禪修不是鍛鍊讓人有什麼神通或超能力,而是自自然然的覺知在自己身上所經驗到的感受來培養平等心

課程結束後所體驗到自身的改變(獲益匪淺)
1.  即使禪修須讓專注力持續不斷地在身體的感受上,不會因頭腦一直運作,而感到疲累,反而體力與精神變得更好

2.  利用覺知來發展平等心,使遇到過去喜歡與不喜歡的事物以平靜的心接受它

以上兩點只是個人較深刻的體驗,不足以代表該禪修方式所帶來的所有益處,其他身心的正向變化可以閱讀作者楊定一和楊元寧所著作的靜坐一書中,以科學的方式獲得解釋

此篇文章最大的目的是希望讓更多人的知道這個禪修方法然後參加嘗試這個方法,進而了解生活的藝術,並能夠永遠的安詳、和諧和快樂。以下圖片是在六龜的法邁內觀中心男眾區域所拍攝的中心環境












2016年8月25日 星期四

Visual Studio的proerties階層下的Settings.settings功能

Settings.settings的功能可以記錄程式上一次的設定值,當程式重新執行時會恢復上一次的設定,不須重新設定

執行Visual Studio點選Properties階層底下的Settings.settings會看到如下畫面:
Name自己取名的變數名稱在程式執行時期可被用來存取該變數的值
Type資料型態MicIndex變數的資料型態為int所以只能放整數數值的資料
Scope:存取權限的設定,設定User表示可讀寫,設定Application表示只可以讀
Value:設定變數的值

取得Settings.settings的變數值(C#語法)
int SelectedIndex = Properties.Settings.Default.MicIndex;

儲存Settings.settings的變數值(C#語法)
Properties.Settings.Default.MicIndex = 1;
Properties.Settings.Default.Save();

以上存取Settings.settings的變數值,可以達到紀錄之前設定值的功能。

P.S.,
Application.Exit();     //先停止線程,再停止進程。
Environment.Exit(0);   //直接停止進程。

進程是一個應用程式在處理機上的一次執行過程,它是一個動態的概念,而線程是進程中的一部分,進程包含多個線程在遠行。原文網址:https://read01.com/5M5ENQ.html

2016年8月5日 星期五

[WPF] GroupBox裡面放多個控制項

WPF的GroupBox只能放一個控制項(例如:只能放一個Button或TextBox等)進去,所以要用另一個容器來當中介,這邊使用的是StackPanel,結果如下圖利用StackPanel當中介把三個CheckBox放到GroupBox裡面

2016年7月31日 星期日

[Android] 實作IBM Bluemix雲端平台的Speech To Text功能


這邊開發在android平台上使用IBM Bluemix的Speech To Text (STT)功能,此篇文章簡單介紹IBM STT的申請流程,程式請看文章底部的範例

使用心得 :  英文的語音辨識個人覺得蠻準的,但中文(辨識結果是回傳簡體中文)的語音辨識還可以在改善

申請流程如下 :
  • IBMBluemix雲端平台註冊後,提供免費使用1個月的天數,看到下圖提供很多認知運算的功能,這裡要申請使用Speech To Text的功能

  • 選擇Speech To Text後,顯示如下畫面,確認右邊的資料後點建立

*IBM能辨識的語言有8種,且提供前1千分鐘免費
  • 建立成功後會看到下圖,點畫面左邊的服務認證會看到urlpasswordusername的資料,這些資料會再寫程式時用到

2016年7月30日 星期六

Android與mBot機器人藍芽連線並透過藍芽傳送訊息

此範例檔的藍芽連線,需事先在手機做好與藍芽裝置的配對,android再指定對方藍芽裝置的MAC位置進行連線
*此範例是與mBot的藍芽裝置連線,若是藍芽裝置接麵包板可能要設定pin腳,不適用本範例,但可參考android藍芽連線


Android部分
AndroidManifest.xml
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission
android:name="android.permission.BLUETOOTH_ADMIN" />

建立一個類別檔叫AsClientConnectBT
public class AsClientConnectBT {
    BluetoothAdapter mBtAdapter = BluetoothAdapter.getDefaultAdapter();
    BluetoothSocket socket;
    BluetoothDevice device;
    InputStream inStream;
    OutputStream outStream;
    UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb")//固定的字串
    byte[] msgBuffer;

    public AsClientConnectBT(){
        device = mBtAdapter.getRemoteDevice("00:0D:19:03:17:D5")//對方藍芽裝置MAC位置
        try {
            socket = device.createRfcommSocketToServiceRecord(MY_UUID);
            inStream = socket.getInputStream();     //接收傳來的資料
            outStream = socket.getOutputStream();   //傳送資料給arduino
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void run(){
        try {
            socket.connect();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void cancel(){
        try {
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public void SendMsg(){
        try {
            outStream = socket.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }

        msgBuffer = "0".getBytes()//傳送0

        try {
            outStream.write(msgBuffer);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

MainActivity檔案
public class MainActivity extends AppCompatActivity {
    AsClientConnectBT clientCon = new AsClientConnectBT();
    TextView tv;
    Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView)findViewById(R.id.textview);
        btn = (Button)findViewById(R.id.button);
        btn.setOnClickListener(btnClick);
        clientCon.run();
    }

    public Button.OnClickListener btnClick = new Button.OnClickListener(){
        @Override
        public void onClick(View v) {
            clientCon.SendMsg();
        }
    };
}

Arduino部分


範例檔案

紀錄Arduino IDE載入函式庫方法

& 0xFF的意思

只取後面8bit的意思

int 的長度是 4Bytes & and 運算子,就是將
每個位元拿來進行 and 運算,根據 and 運算的規則
只有兩者皆為 true (1) 的結果才為 1

舉例: 
假設這個 i 12345 => 0x3039 (Hex)
i & 0xFF

0x3039=>0011000000111001(Bin)
0xFF  =>0000000011111111
____________________________
結果:0000000000111001

由於前面的 bits 都是 0 ,所以實際上有用的只有後面的 8 bits

此紀錄是因為在實作用android透過藍芽傳資料給Arduino時,在Arduino收到資料後用&0xFF將資料還原,因為android須將資料轉成byte(十進制),才可以送給Arduino

資料來源 : http://morred.blogspot.tw/2014/03/0xff.html

[Android] 透過PHP網頁存取MySQL資料庫的資料

網頁部分
安裝架站伺服器XAMPP (https://www.apachefriends.org/zh_tw/index.html)
安裝完成後,找到在此路徑下C:\xampp\htdocs放要執行SQL語法的網頁,如下:此範例圖示.php的檔案內容,內容是新增一筆資料到MySQL資料庫,完成後將檔案儲存在C:\xampp\htdocs底下

Android部分
Step 1: 開啟AndroidManifest.xml檔案加入
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
允許android裝置透過網路存取資料
Step 2: 將附件的org.apache.http.legacy.jar檔案放到./自己的android專案名稱/app/libs底下
Step 3: 開啟附件裡的原始碼專案將JSONAlterMysqlJSONDeleteMysqlJSONInsertMysql檔案複製(如下圖)貼到自己的專案
注意JSONAlterMysqlJSONDeleteMysqlJSONInsertMysql檔案裡的values.add()函數的參數部分,下圖紅色框起來的字串要跟.php檔案裡的$_POST[‘string’],單引號內的字串一樣如此才可以將兩邊的變數相連
Step 4: 在自己的專案輸入如下圖紅色框起來的程式碼,即完成資料庫的操作
程式範例

[WPF] Microsoft Translator - Text Translation

使用Text Translation之前,先到Microsoft Azure Marketplace註冊Text Translation,取得Text Translation使用權限
連結到Microsoft Azure Marketplace網站,申請一個帳號,申請完成後登入
Step 1:  登入後,點選資料標籤,然後再點選要使用的功能,會進入到Step 2的頁面
Step 2: 右邊選擇想要的付費方案,然後點註冊(已註冊過會顯示取消)
Step 3: 註冊完想使用的功能後,點我的帳戶,左邊點選開發人員,會看到Step 4頁面
Step 4: 點選註冊
Step 5: 在註冊應用程式的頁面,除了用戶端密碼會自動填好,其餘欄位要自己填,填完後按建立。之後在開發應用程式會用到用戶端識別碼用戶端密碼的資料
Step 6: 完成應用程式的註冊頁面
支援翻譯的語言
範例下載 (Text Translation的功能參考範例裡的TextTranslation.cs檔案)

2016年7月8日 星期五

[WPF] 錄音,麥克風音量條, Google Speech To Text

此篇文章主要紀錄如何錄製音檔,然後將錄製好的音檔傳到google的雲端伺服器做語音轉文字的功能,下圖是將錄製音檔的程式邏輯以流程圖的方式呈現

錄製音檔步驟


範例檔程式包含Speech To Text、Text To Speech、錄音功能