2018年1月1日 星期一

電腦是Private IP設定遠端連線

Data source : https://support.microsoft.com/en-us/help/4028379/windows-10-how-to-use-remote-desktop
Use Remote Desktop on your Windows 10 PC or on your Windows, Android, or iOS device to connect to a PC from afar.
  • First, you'll need to set up the remote PC to allow remote connections. On the remote PC, open Settings  and select System > About. Note the PC name. You'll need this later. Then, under Related settings, select System info.
  • In the left pane of the System window, select Advanced system settings
  • On the Remote tab of the System Properties dialog box, under Remote Desktop, select Allow remote connections to this computer, and then selectOK.
  • Next, in Settings , select System > Power & sleep and check to make sure Sleep is set to Never.
  • Do one of the following:
    • On your local Windows 10 PC: In the search box on the taskbar, type Remote Desktop Connection, and then select Remote Desktop Connection. In Remote Desktop Connection, type the full name of the remote PC, and select Connect.
    • On your Windows, Android, or iOS device: Open the Remote Desktop app (available for free from Microsoft Store, Google Play, or the Mac App Store), and add your remote PC.  Select the remote PC, and then wait for the connection to complete.

2017年9月18日 星期一

[Unity 3D] Vuforia鏡頭自動對焦

選擇vuforia資料夾 > Scripts > DefaultTrackableEventHandler

加入黃框內的程式碼

2017年6月8日 星期四

[Android] 讓畫面支援不同螢幕大小的手機

在AndroidManifest.xml裡加入以下語法︰

<supports-screens android:resizeable=["true"| "false"]

                  android:smallScreens=["true" | "false"]
                  android:normalScreens=["true" | "false"]
                  android:largeScreens=["true" | "false"]
                  android:xlargeScreens=["true" | "false"]
                  android:anyDensity=["true" | "false"]
                  android:requiresSmallestWidthDp="integer"
                  android:compatibleWidthLimitDp="integer"
                  android:largestWidthLimitDp="integer"/>


data source: https://developer.android.com/guide/topics/manifest/supports-screens-element.html

2017年1月14日 星期六

[WPF] 抓取網頁資料

Step 1: 工具 > NuGet封裝管理員 > 管理方案的NuGet套件

Step 2: 瀏覽 > 搜尋HtmlAgilityPack > 安裝HtmlAgilityPack

*xpath是使用HAPXPathFinder v0.9軟體來尋找出來的,範例檔有提供

Step 3: Coding
using HtmlAgilityPack;
using System.Net;
using System.IO;

string url = "http://www.just-the-word.com/main.pl?word=hello";
string xpath = "/html[1]/body[1]/div[1]/div[3]/div[1]";  //xpath是使用HAPXPathFinder v0.9軟體來尋找出來的

HttpWebRequest httpWebRequest = WebRequest.Create(url) as HttpWebRequest;
try
{
    HttpWebResponse httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse;

     Stream stream = httpWebResponse.GetResponseStream();
     StreamReader reader = new StreamReader(stream, Encoding.UTF8);
     string s = reader.ReadToEnd();
     reader.Close();
     stream.Close();
     httpWebResponse.Close();

     HtmlDocument htmlDoc = new HtmlDocument();

     htmlDoc.LoadHtml(s);
     //16GB 32GB 64GB 的運送時間XPATH
     HtmlNode anchors = htmlDoc.DocumentNode.SelectSingleNode(xpath);
     //HtmlNode anchors32 = htmlDoc.DocumentNode.SelectSingleNode("/html/body/div[2]/div[3]/div/div[2]/div[2]/div[3]/ul/li[2]/label/span/span[3]/span");
     //HtmlNode anchors64 = htmlDoc.DocumentNode.SelectSingleNode("/html/body/div[2]/div[3]/div/div[2]/div[2]/div[3]/ul/li[3]/label/span/span[3]/span");

     //output
     //set RichTextBox
     richTextBox.Document.Blocks.Add(new Paragraph(new Run(anchors.InnerText)));
     //get RichTextBox
     //string richText = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd).Text;
}
catch (WebException web)
{
     //error message
}

完成

參考資料:
http://www.just-the-word.com/main.pl?word=walk&mode=combinations#N N*

範例檔下載

2017年1月9日 星期一

[Unity 3D] Text放大不失焦和調整AR拍攝距離

Text放大不失焦

調整AR拍攝距離
AR Camera > Camera > 調整屬性Field of View的數值

[Unity 3D] Image元件和Toggle按鈕(複選題)

從屬性欄位設定Image Source,顯示圖片
Step 1:

Step 2:

Toggle按鈕(複選題)
Step 1:
Step 2:
Step 3:

[Unity 3D] Keeping the object on the screen even when the target is lost


讓AR Camera 偵測到目標物後,產生的虛擬物件不會消失的方法有兩種:

The first one : 設定屬性
Step 1 : 要把ImageTarget 放到 ARCamera階層下.
Step 2 : Enable Extended Tracking 的選項打勾.

The Second one : 修改腳本
The script that handles what happens when tracking is lost is called DefaultTrackableEventHandler.cs and is found in Assets > Vuforia > Scripts. 
In that file you will find a function OnTrackingLost() This function disables all the renderComponents and colliderComponents for each of the children of the ImageTarget. If you want your object to stay visible comment out the following foreach loops like so:
private void OnTrackingLost()  //當目標物遺失就執行這方法
{
    Renderer[] rendererComponents = GetComponentsInChildren(true);
    Collider[] colliderComponents = GetComponentsInChildren(true);
    /*
    // Disable rendering:
    foreach (Renderer component in rendererComponents)
    {
        component.enabled = false;  //把false改成true,當目標物遺失虛擬物件不會跟著消失
    }

    // Disable colliders:
    foreach (Collider component in colliderComponents)
    {
        component.enabled = false;   //把false改成true,當目標物遺失虛擬物件不會跟著消失

    }
    */
    Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");
}

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載入函式庫方法