發表文章

簡單的android MediaPlayer 使用

紅定字體為需要自已修改的地方 R.raw.voice_189是要播放的檔案。先在Res中建一個raw的資料匣,把聲音檔放進去,這裡音檔為voice_189 public static MediaPlayer mediaPlayer; if (mediaPlayer == null) {         mediaPlayer = new MediaPlayer();       } mediaPlayer = MediaPlayer.create( this.context .getApplicationContext(), R.raw.voice_189 ); mediaPlayer.setLooping( true ); // Set looping mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); final AudioManager mAudioManager = (AudioManager) this.context.getSystemService(AUDIO_SERVICE); final int originalVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0); 想要關掉如下 確是是否在播放中  isPlaying, 然後先STOP,再RESET。最後真得不要再RELEASE if (mediaPlayer.isPlaying()){         mediaPlayer.stop();         mediaPlayer.reset();         mediaPlayer.release();       }

Python Multi thread

一個簡單的MULTI THREAD from threading import Thread def add_100(): tmp = 0 for i in range(0,100): tmp += i print tmp def add_2000(): tmp = 0 for i in range(0,2000): tmp += i print tmp threads = [] for func in [add_100, add_2000]: threads.append(Thread(target=func)) threads[-1].start() for thread in threads: thread.join() 試一下LOCK 之 無LOCK from threading import Lock, Thread import random, time lock = Lock() g = 0 def add_1000(): global g #lock.acquire() for i in range(0,5): time.sleep(random.randrange(2, 5)) g += 1 print str(g) + "\n" #lock.release() def add_2000(): global g #lock.acquire() for i in range(0,5): time.sleep(random.randrange(2, 5)) g += 10 print str(g) + "\n" #lock.release() threads = [] for func in [add_1000, add_2000]: threads.append(Thread(target=func)) threads[-1].start() for thread in threads: thread.join() 結果 1 11 21 22 32 33 43 44 54 55 g 這個參數被兩個thread 同時更動。 試一

MQTT android studio

先在APP的build.gradle中的dependencies加入以下紅字 dependencies { compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0' compile 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1' } 然後在 AndroidManifest.xml中加入 <uses-permission android:name="android.permission.INTERNET"> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"> <uses-permission android:name="android.permission.WAKE_LOCK"> 在 AndroidManifest.xml <application 加入 <service android:name="org.eclipse.paho.android.service.MqttService" /> 讓我們做一個MqttHelper import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; import org.eclipse.paho.client.mqttv3.MqttCallback; import org.eclipse.paho.client.mqttv3.MqttClient; import org.eclipse.paho.client.mqttv3.MqttConnectOptions; import org.eclipse.paho.client.mqttv3.MqttException; import org.ec

MQTT 簡介與使用

目前物聯網(IoT)有許多的服務開發,想要萬物皆連網,一張簡單的無線網卡與一個可以做中介溝通的服務器就變成是必要條件。MQTT是乎是目前蠻多人用的一個方案。這個簡介一下。 https://test.mosquitto.org/ 這是一個免費的MQTT服務站。大家可以多多使用。 https://mosquitto.org/download/ 下載頁中有許多作業系統可選,也有程式碼可看。 安裝完後,會有三個可用的程式 mosquitto -> MQTT server,執行後,電腦就有MQTT服務的功能。記得到mosquitto.config中更改一下設定。也要把防火牆設定好。讓MQTT的通訊可以通過。 mosquitto_pub ->發佈 使用方法 mosquitto_pub -h test.mosquitto.org -t  JurassicPark  -m "Hello World" -P password -u username mosquitto_sub ->訂閱 使用方法 mosquitto_sub -h test.mosquitto.org -t  JurassicPark  -P password -u username 如果沒有使用者的設定,-P password -u username是可以省略的。指令上也頗好記。 -h 就是指host,也就是伺服器的IP或是域名。 -t 就是Topic。Topic就是一個要溝通的主題。如果我們訂閱了(如上例) JurassicPark這個主題。也就只能收到針對這個主題發佈的訊息。 -m 就是指要發佈的訊息。 補充幾個名詞 Clean session  指client斷線時,server是否要 保留 client沒有收到的訊息,等client再次連線,再發佈給client。 設為1,不保留。  設為0,保留。 QoS (Quality of Service)  每個 發佈者 或是 訂閱者 都可以設自己的QoS。 有三個level,0,1,2 以下以發佈者跟MQTT代理人(Server)來說明。 設為0 代表發佈者送給MQTT代理人,就不管了。 設為1代表 發佈者送給 MQTT代理人 , MQT

python import 指定路徑

假設有一個python檔案為a.py,存在資料匣 KK 中。如要把a.py import進來。如何import 方法一 要先在KK中建立一個__init__.py檔。此檔裡面沒有內容也沒關係。然後 import KK.a 如果a中有一個叫s的參數要印出 print KK.a.s 方法二 將KK加入系統尋找的路徑中。 import sys sys.path.append("./KK") import a print a.s

python datetime 的幾個用法

import time import datetime day1 = datetime.date(2017,5,5) day2 = datetime.date(2017,12,12) print day2 - day1 結果 221 days, 0:00:00 res=day2-day1 print res 結果 datetime.timedelta(221) res.days 結果 221 type(res.days) 結果  <type 'int'> day1 + datetime.timedelta(20) 結果 datetime.date(2017, 5, 25)

類神經網路 倒傳遞法 back propagation

圖片
倒傳遞法是一個很舊的東西,但講的類神經網路訓練,就非得提到他。我們也來理解倒傳遞原理。 如上圖,是一個兩個隱藏層的網路。我們的標示法是字母右上角代表第幾層。字母右下角是連線的索引。每個神經原包含 g 跟 a。a是g經過activation function的結果。 如果activation function是sigmoid表示如下, 因為不同網路會選擇不同的activation function因問題與網路會有所不同,我們都以 來表示。 最右邊的神經元是輸出神經原。w為連線的權重。到這裡,我們可以了解當我們在這個網路上輸入X與Y,就會得到一個輸出, 每一次輸出,我們都會想要得到一個差異值,這個差異值代表輸出離我們的目標有多遠。假設我們的目標值為A。那差異就是 我們取平方值可以不用理會差異的正負,1/2是為了微分時方便。有人說不要1/2可以嗎?當然也可以,只是之後推導不方便。我們總要輕鬆的去想一些事情,常數項只要不影響結果,可以想辨法拿掉就拿掉,這是一個技巧。 我們訓練網路,無非就是想要得到各連線的w,用數值的方法,我們可以每次只變化一個權重,觀察輸出往大或小移動。就可以了解這個權重如何影響輸出。把每個權重對輸出的影響都畫成圖,就可以找到讓輸出最接近理想值的權重了。但這樣其實很耗時間。這是今天為什麼需要演算法的原因之一。我們可以寫一個沒有效率的廻圈來算1加到100,也可以像高斯觀察到把數列反序寫,跟原本數列一個一個相加,全都是101,近而產生梯形公式。當然,只要運算能力夠強大,就都不是問題。偏偏人們思考的問題,以目前的科技,運算能力總是不夠強大。 所以我們想了解每一個連線權重對Err的影響,就要用微分。如果我們想知道第二個隱藏層第一個神經原的第一條連線與Err的關係如下  如果我們想知道輸入x的神經原的第一條連線與Err的關係如下 微分也就是斜率,斜率為正,就代表權重變大,會讓Err變大。斜率為負,就代表權重變大Err會變小。所以只要知道每一條連線相對Err的微分,就可以有效率的調整權重的方向了。這樣是不是比數值方法快許多! 接下來我們推導一下 使用 Chain Rule 這樣