【お題】
iPhoneで、同一ネットワークにある家電を音声(Siri)を使って操作することはできる。
例:
Raspberry Pi + HomeKit + IRKit = Siriで家電を音声操作できるようにする
https://datahotel.io/archives/725
こんな感じでしょうか
では、Androidで別ネットワークにある家電を音声操作するには?どうする?
・ここで、Androidのネットワークから家電のネットワークは、見えないものとする
というか、Androidは3G/LTE回線にあるものとする
・上記URLのシステムは出来ているものとして、それに何を追加(代替)するか
を考える。
【こんなの考えた】
こんなかんじ。
(1)iPhoneの代わりにAndroid+自作アプリ
自作アプリは以下の機能をもつ
・音声で話しかけると、
Docomo 音声認識API
https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=speech_recognition&p_name=sdk
等を使って、文字にする
・その文字の内容をTwitterでつぶやく
(2)RaspberryPiのHomebridgeの代わりに自作サーバー
サーバーの機能は、以下の通り
・一定時間おきにTwitterにアクセス
家電操作指示があったら、IR KitのREST APIにアクセス
(3)あとIR Kitの動きは、iPhoneの場合と同じ
※Twitterの代わりに、どこか外部にサーバーをおき、
そこにAndroid,Raspbery piからアクセスするようにしてもよい、
というか、そっちのほうが普通だと思う。
iPhoneで、同一ネットワークにある家電を音声(Siri)を使って操作することはできる。
例:
Raspberry Pi + HomeKit + IRKit = Siriで家電を音声操作できるようにする
https://datahotel.io/archives/725
こんな感じでしょうか
では、Androidで別ネットワークにある家電を音声操作するには?どうする?
・ここで、Androidのネットワークから家電のネットワークは、見えないものとする
というか、Androidは3G/LTE回線にあるものとする
・上記URLのシステムは出来ているものとして、それに何を追加(代替)するか
を考える。
【こんなの考えた】
こんなかんじ。
(1)iPhoneの代わりにAndroid+自作アプリ
自作アプリは以下の機能をもつ
・音声で話しかけると、
Docomo 音声認識API
https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=speech_recognition&p_name=sdk
等を使って、文字にする
・その文字の内容をTwitterでつぶやく
(2)RaspberryPiのHomebridgeの代わりに自作サーバー
サーバーの機能は、以下の通り
・一定時間おきにTwitterにアクセス
家電操作指示があったら、IR KitのREST APIにアクセス
(3)あとIR Kitの動きは、iPhoneの場合と同じ
※Twitterの代わりに、どこか外部にサーバーをおき、
そこにAndroid,Raspbery piからアクセスするようにしてもよい、
というか、そっちのほうが普通だと思う。
6月28日
JJUG ナイト・セミナー 「Java エンジニアのためのJava(再)入門
に行ってきた!ので、メモメモ
■from old Java to modern Java
- Java初心者から次のステップへ
あるいは35歳からのJava再入門
・今のJavaって、こうなっているっていう話
・自己紹介
・書籍を書きました:Java本格入門
・アンケート
Java:どのバージョン
7 3分の1、4分の1
6 結構いる
5,1.4
8 一番多い
・古いバージョンのJavaを最新のJavaに変える
・イントロダクション
今回のお題;CSVファイルの読み書き
リソースはfinallyでクローズする
→今見せたコードはJava1.4で動きます
<<From 1.4 to 5.0>>
JavaSE 5.0
今のJava文法の基礎
・文字配列の結合
StringBuilder:性能を上げた
foreach文(拡張for文)
・ファイルの読み込み
Genericsで型を明確にする→castしなくてよくなった
アノテーション @override →ミスを防ぐ
<<form 5.0 to 7>>
Java SE 7
・try-with-resources
・ダイアモンドオペレーター
→このへんからあやしくなる・・
・ファイルへの追記
try-with-resourcesで()で宣言したリソースがクローズされる
finallyでcloseするのは古い定石
catchしなくてもクローズできる
charsetを文字列で書いていたが、規定済みのものが使えるようになった
ダイアモンド演算子<>
複数の例外をまとめてcatchできる
→try-with-resourcesはとにかく非常に大切な機能
<<to 8>>
ストリームAPI
Lambda
:
・StreamAPIとlambda式で一気に文法が変わった
・ファイルの追記
String.join
Files のnewBufferedWriter(Paths.get()・・・
→オプションを渡せる。作成・書き込みルール
リストを渡して書き込みFiles.write
ArraysAsList,Collection.singleton
→Filesのwriteには改行コードが入る
日付:新しいクラス LocalDateで日付のみを扱う(時間は扱わない)
→LocalDateTime,offsetDateTime,Zone
ハイフン区切りのISO8601形式の日付ならフォーマッタなしでパース可能
LocalDate.ofで年月日指定。月は1から始まる
→有用なAPIが増えている
・で肝心なストリームAPIとLambda式は
→後半に続く
■数値計算をきわめるたしなむ
・自己紹介
・Java本格入門たくさんの反響、ありがとうございます!!
→ご要望いただいた数値計算、やります
・これどうやって保持します?
商品の単価、購入数 int
主キー int
日付 int
売り上げ int
にすると・・・
テーブルの主キー
1秒に100件データが登録されると、249日にIDがオーバーフロー
売り上げ
21億円超えたら使えない
だったらlongを使えば・・・整数はこれでしのげる
・話変わって小数
int price = 100 * 1.08
エラー発生。doubleを使うと・・
・期待した通りの計算ができない
小数○位で四捨五入
数値を正しく表現できない→2進小数の限界
0.1→循環小数になる:どこかで打ち切られる
1円単位の
BigDecimal
「期待した」計算
基本的には、この2つ
new BigDecimal(String val)
BigDecimal.valueof
new BigDecimal("0.7")→0.7
new BigDecimal(0.7)→0.699999999
→ご利用は計画的に
BigDecimal BigInteger と スケール
BigDecimalはいみゅーたぶる
たしざん
BigDecimal#add
ひきざんはsubtract
割り算は、利用方法に注意
スケール:足し算、引き算は大きい方
掛け算の場合;スケールの値が足しあわされる
丸めモードを使って、端数処理しよう
MathContext
BigDecimalで割り算をするときは、必ずスケールと丸めモードを指定
→計算結果が無限小数になると、ArithmeticExceptionが発生
比較0.7+0.3
BigDecimal#equals()を使った場合
BigDecimal#compareTo()を使った場合
BigDecimal#equals()を使った場合
→スケールも同じかどうかを判定します
・話が変わって
Money and Currency APIが採用される予定
→採用される予定
参照実装Monetaでは利用できる
デフォルトの丸め
通貨変換
→日本円だけならtoo much
■StreamAPI入門
・なぜStreamAPIを学ぶべきなのか?
新しいから?
性能がいいから?
簡潔に書けるから?
→物事のとらえかたが今後数年のコーディングに必要だから
まずは、「簡潔に書けるから」
・StreamAPIとは
Stream:流れ
大量データを逐次処理する→コレクションの操作も簡単に書ける
手続きを書くのではなく、目的をかく
コレクションの絞り込みなど・・
とはいえ
無理してStreamAPIで書く必要はないです
・Lambda式
StreamAPIを簡潔に書くために欠かせないもの
実装すべきメソッドが1つしかないインターフェースを簡潔に書く
例:Comparator
無名クラスにもできる
実装すべきメソッドが1つしかない:関数型インターフェース
→StreamAPIの引数は基本的に関数型インターフェース
・Lambda式の文法
()→{}
引数の型は省略できる
処理が1行だったら returnと{}も省略できる
引数が1つなら()も省略できる
メソッド呼び出し1つなら ::
・StreamAPIの書き方
作る
操作する
まとめる
Stream()で作り
map()で加工し
filter()で絞り込み
collect()でまとめる
操作:絶対に覚えてほしいmapとfilter
そのほか limit,distinct,
mapなどの変換処理では要素の数は変わらない
filterで分岐することもできない
flatmap
終端操作:まとめる
一番使うのがcollectとCollectorsの組み合わせ
終端処理は1回だけ
・さっきのto 8
try with resouecesにする
・なぜ重要なのか
Collectionを簡潔に扱えるようになるかわりに
結構、覚えることが多い
対して融通も聞かない
StreamAPIの目的はStreamを扱うこと
Collectionはすでに内容が決まっているデータ
cold stream
本来のStreamは内容や上限が決まっていない
hot stream
Java8はcold stream
主戦場はHot Stream
→ウィンドウ関数が必要 Java9で少し入る
RxJava
→マイクロサービス
ノンブロッキングな非同期API
・hotStreamを扱うためにColdStreamで練習する
JJUG ナイト・セミナー 「Java エンジニアのためのJava(再)入門
に行ってきた!ので、メモメモ
■from old Java to modern Java
- Java初心者から次のステップへ
あるいは35歳からのJava再入門
・今のJavaって、こうなっているっていう話
・自己紹介
・書籍を書きました:Java本格入門
・アンケート
Java:どのバージョン
7 3分の1、4分の1
6 結構いる
5,1.4
8 一番多い
・古いバージョンのJavaを最新のJavaに変える
・イントロダクション
今回のお題;CSVファイルの読み書き
リソースはfinallyでクローズする
→今見せたコードはJava1.4で動きます
<<From 1.4 to 5.0>>
JavaSE 5.0
今のJava文法の基礎
・文字配列の結合
StringBuilder:性能を上げた
foreach文(拡張for文)
・ファイルの読み込み
Genericsで型を明確にする→castしなくてよくなった
アノテーション @override →ミスを防ぐ
<<form 5.0 to 7>>
Java SE 7
・try-with-resources
・ダイアモンドオペレーター
→このへんからあやしくなる・・
・ファイルへの追記
try-with-resourcesで()で宣言したリソースがクローズされる
finallyでcloseするのは古い定石
catchしなくてもクローズできる
charsetを文字列で書いていたが、規定済みのものが使えるようになった
ダイアモンド演算子<>
複数の例外をまとめてcatchできる
→try-with-resourcesはとにかく非常に大切な機能
<<to 8>>
ストリームAPI
Lambda
:
・StreamAPIとlambda式で一気に文法が変わった
・ファイルの追記
String.join
Files のnewBufferedWriter(Paths.get()・・・
→オプションを渡せる。作成・書き込みルール
リストを渡して書き込みFiles.write
ArraysAsList,Collection.singleton
→Filesのwriteには改行コードが入る
日付:新しいクラス LocalDateで日付のみを扱う(時間は扱わない)
→LocalDateTime,offsetDateTime,Zone
ハイフン区切りのISO8601形式の日付ならフォーマッタなしでパース可能
LocalDate.ofで年月日指定。月は1から始まる
→有用なAPIが増えている
・で肝心なストリームAPIとLambda式は
→後半に続く
■数値計算をきわめるたしなむ
・自己紹介
・Java本格入門たくさんの反響、ありがとうございます!!
→ご要望いただいた数値計算、やります
・これどうやって保持します?
商品の単価、購入数 int
主キー int
日付 int
売り上げ int
にすると・・・
テーブルの主キー
1秒に100件データが登録されると、249日にIDがオーバーフロー
売り上げ
21億円超えたら使えない
だったらlongを使えば・・・整数はこれでしのげる
・話変わって小数
int price = 100 * 1.08
エラー発生。doubleを使うと・・
・期待した通りの計算ができない
小数○位で四捨五入
数値を正しく表現できない→2進小数の限界
0.1→循環小数になる:どこかで打ち切られる
1円単位の
BigDecimal
「期待した」計算
基本的には、この2つ
new BigDecimal(String val)
BigDecimal.valueof
new BigDecimal("0.7")→0.7
new BigDecimal(0.7)→0.699999999
→ご利用は計画的に
BigDecimal BigInteger と スケール
BigDecimalはいみゅーたぶる
たしざん
BigDecimal#add
ひきざんはsubtract
割り算は、利用方法に注意
スケール:足し算、引き算は大きい方
掛け算の場合;スケールの値が足しあわされる
丸めモードを使って、端数処理しよう
MathContext
BigDecimalで割り算をするときは、必ずスケールと丸めモードを指定
→計算結果が無限小数になると、ArithmeticExceptionが発生
比較0.7+0.3
BigDecimal#equals()を使った場合
BigDecimal#compareTo()を使った場合
BigDecimal#equals()を使った場合
→スケールも同じかどうかを判定します
・話が変わって
Money and Currency APIが採用される予定
→採用される予定
参照実装Monetaでは利用できる
デフォルトの丸め
通貨変換
→日本円だけならtoo much
■StreamAPI入門
・なぜStreamAPIを学ぶべきなのか?
新しいから?
性能がいいから?
簡潔に書けるから?
→物事のとらえかたが今後数年のコーディングに必要だから
まずは、「簡潔に書けるから」
・StreamAPIとは
Stream:流れ
大量データを逐次処理する→コレクションの操作も簡単に書ける
手続きを書くのではなく、目的をかく
コレクションの絞り込みなど・・
とはいえ
無理してStreamAPIで書く必要はないです
・Lambda式
StreamAPIを簡潔に書くために欠かせないもの
実装すべきメソッドが1つしかないインターフェースを簡潔に書く
例:Comparator
無名クラスにもできる
実装すべきメソッドが1つしかない:関数型インターフェース
→StreamAPIの引数は基本的に関数型インターフェース
・Lambda式の文法
()→{}
引数の型は省略できる
処理が1行だったら returnと{}も省略できる
引数が1つなら()も省略できる
メソッド呼び出し1つなら ::
・StreamAPIの書き方
作る
操作する
まとめる
Stream()で作り
map()で加工し
filter()で絞り込み
collect()でまとめる
操作:絶対に覚えてほしいmapとfilter
そのほか limit,distinct,
mapなどの変換処理では要素の数は変わらない
filterで分岐することもできない
flatmap
終端操作:まとめる
一番使うのがcollectとCollectorsの組み合わせ
終端処理は1回だけ
・さっきのto 8
try with resouecesにする
・なぜ重要なのか
Collectionを簡潔に扱えるようになるかわりに
結構、覚えることが多い
対して融通も聞かない
StreamAPIの目的はStreamを扱うこと
Collectionはすでに内容が決まっているデータ
cold stream
本来のStreamは内容や上限が決まっていない
hot stream
Java8はcold stream
主戦場はHot Stream
→ウィンドウ関数が必要 Java9で少し入る
RxJava
→マイクロサービス
ノンブロッキングな非同期API
・hotStreamを扱うためにColdStreamで練習する