happasukeの覚書

私がググらなくてもいいよう記事にします。またそのほかにも感じたことも書き綴りたいと思います。

androidで一定時間後にTTSで何かをしゃべらせる

 手順はこうです

  1. ActivityからAlarmManagerでreceiverをセットする
  2. 指定時間後にreceiverからserviceを呼び出す
  3. serviceのなかからTTSを呼び出す

 順を追って説明します。その前にManifestで以下のように追記します

this is used in newsgetter and for explain code

 

 application内にreciverとserviceを使うことと、パーミッションにSET_ALARMを追加します。指定のしかたは書いてあるような感じです。

 

 次にActivity内でのAlarmManagerのセットのしかたです。これはすでにネットにたくさんありますね。ざっくりいきます。

gist8f2ede46abd9154109d8

 こんな関数をActivity内から呼び出すことでアラームをセットします。10秒後にRTC_WAKEUPでよびだすAlarmManagerです。

 次にAlarmManagerで使われているレシーバです。

gist13001483bec606e79f40

 16行目のcontext.startServiceが重要です。TTSクラスを入れて呼び出します。ここで直接TTSを呼び出そうとすると事故ります。それでserviceがこちらです。

gist26bdcb5964e837597ca6

 

萌ゆるTTSで朝は起きれるのか

サーバ(AzureWebsite)でフィードをとってアプリでTTS(TextToSpeech)させようとしている.

こやつに朝、目覚まし代わりにニュースを読ませて起こしてもらおうと思っている.うむ、すばらしい.ついでにいい感じのキャラがいると映えるぞお^~

 

最初はゆっくり(AquesTalk)を検討したのだがサーバ側で走らせようとしたらutf-8に対応した関数の挙動がおかしかったりできた実行ファイルをkuduで走らせたら走らなかったりした.サーバがだめならクライアントで動けばいいだろと思ってAquesTalkのAndroid版の開発をしたのだが、AndroidStudioのエラーログを見てもrunningだけはいて死んでいたので断念した.

 

で、そもそもAndroidにはTTSの開発環境があったのでそれを使うことにした.

ついでにKDDIのN2の声がいい感じだったのでPlayStoreからそれも入れた.

早速TTSさせようとアンドロイドで日本語音声出力:音声読み上げを参考に書いたら動いた.うむ、未来は明るい.ちなみに私のスマホはXperiaZ3compact Android5.0.2です.

 

あとはサーバ側をAPI化すればよさそう.

 

kakasiを使おうとした

Azureのwebsiteで漢字をひらがなにしようとkakasiを使おうとしたら辞書のディレクトリはc:\kakasi\share\kakasiしかだめだとは...

Azureでは基本的に操作できるディレクトリはD:\home\以下なのでこれではkakasiが使えない.

そもそもC:\直下に置くという前提の設計はどうなのか.

 

f:id:happasuke:20160119210934j:plain

解決策としてはソースから作り直せばよさそうだがここはyahoo apiを使おう.

 

simplexml_load_fileでrssが拡張子のRSSを取得できない

ちょっとこまったので覚書

phpにはsimplexml_load_fileという便利なxmlをいい感じに分解してくれる関数がありますが、これを使ってはてなrssを取得しようとしたときにこけました.

 

はてなrssは以下のURLで提供されています.

http://b.hatena.ne.jp/hotentry/it.rss

一見サイトを訪れただけではどこにrssがあるのかわかりませんでしたが、ggったっらurlに.rssとつければそれがrss扱いになるということ.素晴らしい、感動した.

 

まず、これをphpから取得してみます.

...何も起こらない.

 

よくよく他のsimpleなんたらの使い方を見てみるとすべて拡張子xmlになっているではないか.hmm

 

そこでfeedburnerなるものを使ってみました.

feedburner.google.com

 

これを使うと登録したフィードのurlがfeedburner.google.com/nantokaになります.

このurlをsimplexml_load_fileを実行するとあら不思議、フィードがとれるんですね.

 

XMLの構造はwgetかなんかでみてやればわかります.

 

 

windows10のバグ

windows10でバグを発見したという話はよく聞くし、既出しているかもしれないがなんとなく投稿

 

snipping toolでキャプチャし、英語の小文字、JPGで保存。

そのあとにエクスプローラからファイル名を大文字に書き換えるとエクスプローラ上には小文字のままで表示されてしまう。しかし、プロパティやプロンプトでみてみると変更されている。エクスプローラのバグなのだろう。

【Android stuidioでアプリ開発】 タイトルバーを非表示にする

Androidアプリ開発に手を出してみました。

 

タイトルバーを非表示にする方法はいろいろあるようですが、今回はプロジェクトを新規に作成したときに選ぶことができるActivityのうち、Blanck Activityを選択した場合のタイトルバーを非表示にする方法を載せます。

 

まずこういう画面のBlanck Activityを選択します。

f:id:happasuke:20150504120428p:plain

 

そしてプロンプトに従って設定を進め、プロジェクトの作成を完了させます。

次にプロジェクトのapp → res → values → styles.xmlを編集します。

f:id:happasuke:20150504120948p:plain

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

</resources>

 ここの<style>タグのparent="Theme.AppCompat.Light.DarkActionBar"を"Theme.AppCompat.NoActionBar"に変更します。

 これで実行するとタイトルバーは消えます。

 

 また、直接マニフェストファイルから操作すると事故ります。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.ribaasi" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".top_page"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

 

 

lcpxpresso1769で3色LEDチカチカ

 先日製作してもらった基盤にはLEDがなく、なんとなく寂しかったので久しぶりのはんだ付けで3色LEDを取り付けることにし

ました。パーツはマルツから買ってきました。

 さて使用するピンは余っていた0[16]、0[15]、0[17]です。このピンだとMbedのコードを使うこともできますが、気分でレジスタを打ちます。

f:id:happasuke:20150313220512p:plain

 データシートによると、どうやら0[15]と0[16],0[17]ではピン設定で使用するレジスタが違うようです。

 

 まずはピンにどのような働きをさせるかを設定します。

f:id:happasuke:20150313222812p:plain

0[15]はPINSEL0の30,31ビット目を00とすることでGPIO出力できます。

なので、その部分だけを00にするために以下のようにレジスタを打ちます。

    LPC_PINCON->PINSEL0 &= ~(3<<30);

また他のピンは以下の表より

f:id:happasuke:20150313222819p:plain

同様に

    LPC_PINCON->PINSEL1 &= ~(3<<0);
    LPC_PINCON->PINSEL1 &= ~(3<<2);

とします。

 次にGPIOを入力として使用するのか、出力として使用するのかを設定します。そのためには以下の項目をみます。 

f:id:happasuke:20150313225127p:plain

 該当のピンを1とすることで出力になるようです。使用するのは0[15]~0[16]なので

LPC_GPIO0->FIODIR |= 1<<15;

LPC_GPIO0->FIODIR |= 1<<16;

LPC_GPIO0->FIODIR |= 1<<17;

  と設定します。これで初期化は完了です。ほかにも書き込み制限のマスクなどがあるのですが、ここでは初期設定で十分使用できるのでそのままにします。

 それで、ピンに信号を出力したいときは

LPC_GPIO0->FIOSET |= 1<<15;

で信号がHIGHになり、出力を消したいときには

LPC_GPIO0->FIOCLR |= 1<<15;

で信号がLOWになります。