androidの音声読み上げ機能でkindle本がガンガン読める
読書は眠くなる
今年度は職場のミッションが変化した影響で今までやったことない仕事をたくさんしています。
未経験の仕事を闇雲にやるのは非効率なので、先人の知恵を学ぶべく、読書をたくさんするようにしています。
読書をする場所はいつも通勤の電車の中です。
電車に乗ったらとりあえずandroidのkindleアプリを起動して本を読み始めます。
...が...
読み始めて10分くらいたつと急に眠くなってくる。。
本の内容は面白いのに...目が勝手に閉じていく。。
こんなことを毎日繰り返しているので1冊読み終えるのに2週間くらいかかってしまう。。
もっと早く読めるようにしたいなぁと思いつつ、youtubeを見ていたらこんな動画を見つけました。
勝間さんのyoutube動画「勝間和代の、Androidのトークバック機能で、Kindle本を耳で聞こう!!」
勝間和代の、Androidのトークバック機能で、Kindle本を耳で聞こう!!
勝間和代さんは、効率的に料理をする方法や年収UPの秘訣などを毎日10分程度の動画でアップしている評論家です。
上に載せた動画では、androidに標準搭載のtalkbackというテキストの音声読み上げ機能を使ってkindle本の内容を読ませて、それを聞くと読書が効率的にできるという話です。
勝間さん曰く「最近のandroidは音声がとても聞き取りやすく、機能的にも使いやすい。iPhone等にも同等の機能があるが総合的にはandroidが良い」とのことです。
これは試さないわけにはいかないと思い、早速やってみました。
読んだ本はコレ。
私は文章作成が苦手なので、この本は苦手分野の本です。
つまり間違いなく眠くなる本です。
これを音声読み上げを使って読書(?)してみました。
そしたら...
なんと...
たった2日で読めた!マジ革命!
音声読み上げ読書がすごい
眠くならない
目で読む読書は、目が少しでも疲れてるとすぐ眠くなってきます。
特に帰宅時は仕事終わりで疲れてるので読書がきついです。
けど音声を聞くだけなら疲れていても問題なし。
ラジオを聞いてる気分でサクサク読めます(聞けます)
歩いてる時も読める
私は通勤時に一駅分歩くようにしています。
混雑した電車が苦手なのと、気分転換のためです。
音声読み上げだと、この歩いてる時間でも読書が可能です。
本をたった2日で読めた理由はコレです。
通勤時間のすべてを読書に当てれるため、電車の中だけの読書と比べて読書の時間を絶対的に増やせます。
無料
こんな素晴らしい機能が無料で使える。
androidすごい。googleありがとう。
ただしtalkbackの操作はツライ
基本的にいいこと尽くしですが、悪いこともあります。
それはtalkback機能の操作性の悪さです。
talkbackがそもそもユーザ補助の機能でkindleを読み上げるための機能ではないので仕方がないけど。。
慣れるまでは試練です。
まとめ
androidの音声読み上げ機能を使ってkindle本を読むと眠くならずにガンガン読めて最高。
kindle unlimitedの本を全部読めそうな勢いだ。
スタンディングデスクのLevit8を紙で作ってみた
スタンディングデスクがほしいと思ってググったら、折りたたみ式の折り紙みたいなやつが出てきました。
How to: Fold/Unfold the Levit8
良さそうだけど、強度とか気になる。
てか自分で作れば良くね? と思ってとりあえず紙で作ってみた。
台の作り方
適当なカードを4枚用意する
カードをくっつける
セロテープでエイ!
対角線に線を引く
線の方向は全部同じでOK
裏返して折り目をつける
対角線は全部谷折りでOK
両端をくっつける
ここで少し注意。
両端をぴったりくっつけてしまうと、折りたたんで収納する時に紙の厚さでうまく折りたためない。なので写真のようにちょっと隙間を開けてくっつける。
完成
折りたたんだ状態から台にするまでの工程はこちら。
できたーーー!
思ったより簡単だった。
紙の縦横比はなんでもOK
家にあった適当な紙でうまくいったので、たぶん縦横比はなんでもいいと思う。
強度はまぁまぁ
強度を試すためにいろんなものを置いてみた。 chromebookがギリギリ置けた。
chromebookの重量に必死で耐える台
ただ最終的に台の角の部分から崩壊した。
弱点は角。
本気で台を作るときは角の強度を上げる工夫が必要そう。
とりあえず次回はダンボールバージョンを作って運用してみようかな。
【スプレッドシート】おじさん専用!予算管理用日付関数
こんにちは。
Googleスプレッドシートで予算管理をしようと企むオジサンです。
予算管理では様々な日付でグルーピンが必要になります。
たとえば年度ごとに集計とか、四半期ごとに集計とか...
そのために「2019/01/01」のような日付を「FY2018」みたいな値に変換したいです。
具体的には↓これくらいのケースに変換したい。
2019/01/01に対しての変換
ケース | 値 |
---|---|
年度 | FY2018 |
半期 | FY2018下期 |
四半期 | FY2018_4Q |
年月 | 201901 |
で、これができるカスタム関数作った。
その名もcomDate()
。なんとなく会社の日付だから。
もっと良い名前あったら教えてください。
利用例
使い方について細かい話をしてもしょうがないので具体的な利用例で説明します。
まずこんな感じの家計簿があったとします。
支出日と支出額が書いてあるテーブルです。
これに対してC1
のセルにこんな風に記述します。
=comDate(A:A,"年度,半期,四半期,年月")
第1引数は支出日の列、第2引数は変換タイプです。
これを実行するとこうなる!
日付がいろんな値に変換されてる!
この表を使って、年度別に集計してみる。
こうゆうときはquery関数が便利。
=query(B:C,"select C, sum(B) where C != '' group by C")
これを実行すると
キターーー!
オジサンの効率化完了。
ソース
ソースはここに置いておきます。
まだまだ改良の余地があるので参考までに。
ではまた。
GASのDateコノヤロー!
GASのDateに腹が立ったのでメモ。
var date = new Date('2020-01-01')
これは想定通り2020年1月1日になります。
これに時刻を追加したこれは?
var date = new Date('2020-01-01 09:00')
なぜか1970年になります。
一方、同じgoogle製のchromeで同じコードを動かすと2020年になります。
GASめ...
ちなみに日付をハイフン区切りではなくスラッシュ区切りにするとちゃんと2020年になります。
var date = new Date('2020/01/01 09:00')
GASめ...
同じgoogleだろ...
まとめ
入力 | GAS出力 |
---|---|
new Date('2020-01-01') |
Wed Jan 01 09:00:00 GMT+09:00 2020 |
new Date('2020-01-01 09:00') |
Thu Jan 01 09:00:00 GMT+09:00 1970 |
new Date('2020/01/01') |
Wed Jan 01 00:00:00 GMT+09:00 2020 |
new Date('2020/01/01 09:00') |
Wed Jan 01 09:00:00 GMT+09:00 2020 |
※chromeでは全て2020年
になります。
GASめ...
2DゲームエンジンDEFOLDの紹介
2DゲームエンジンのDEFOLDを使いはじめました。
調べた内容を少しずつまとめます。
今日は紹介だけ。
完全無料
「完全」の意味はよくわからないけど、やったぜ!
言語はlua
javascriptに似たゆるい言語。プログラミング初心者でも手を出しやすいと思います。
Lua - Wikipediaより
Hello World
print("Hello World")
挿入ソート
local a = {5, 3, 1, 4, 2} -- `{´と`}´はテーブルコンストラクタ for i = 2, #a do -- `#´は長さ演算子であり、`#a´はテーブルaのサイズ(ここでは5)を返す for j = i, 2, -1 do if a[j - 1] <= a[j] then break end a[j], a[j - 1] = a[j - 1], a[j] end end
特に癖もなく普通の言語です。
マルチプラットフォーム対応
対応プラットフォームいっぱい。 - HTML5 - Android - iOS - Steam - FB Instant Games - Windows - macOS - Linux
セットアップ不要
エディタをダウンロードしてインストールするだけで環境構築完了です。 編集画面のUIもシンプルでよさそう。
Message Passingが良い
ちょっと細かい話ですが、DEFOLDでは
メソッド呼び出しなどのオブジェクト同士のコミュニケーション時に、オブジェクトのメソッドを直接呼ぶことができません。
その代わりMessage Passingを使い、間接的にメッセージを送る方式を使います。
こんなイメージ
これによりオブジェクト同士の依存が強制的になくなります。
依存がないとオブジェクトの再利用などの最適化ができるようになります。
そこらへんの最適化はDEFOLD側で全部いい感じにやってくれます。
なので開発者はゲームのことだけ考えれば良い。
ありがたやー。
とりあえずシューティングゲームでも作ってみます。
ツリー構造の問題
プログラミングの問題です。
親子関係のあるツリー構造の問題です。
親が子を持つか、子が親を持つか、相互に持つか、考え始めるといつも悶々としてしまうんですよねー。特に答えはないですが悶々としてみてください。
以下はjavascriptで書いてますが言語はなんでも良いと思います。
問題
図のようなツリー構造を作るTreeFactoryを作成したい。
下記の問題テンプレの// 実装してください
の部分を埋めて、全体がエラーなく実行される状態にしてください。
// 実装してください
以外の場所にメソッド等を実装しても良いです。
ツリー構造の説明
要素
- 要素はIDと値を持っている
- 要素にはノードとリーフの種類がある
リーフ
- 子供の要素を持たない
- idはツリー全体でユニークであれば良い
- 値は1(固定)
ノード
- 子供の要素を1つ以上持つ
- idはツリー全体でユニークであれば良い
- 値は配下にあるリーフの総数
問題テンプレ
<!DOCTYPE html> <script> class TreeFactory { add(id, parentOption) { // 実装してください } find(id) { // 実装してください return {id: '-1', value: -1} } update(id, parent) { // 実装してください } } // 期待する挙動 // (1) ツリー構造の構築 const treeFactory = new TreeFactory(); treeFactory.add('A') treeFactory.add('E', 'B') treeFactory.add('B', 'A') treeFactory.add('C', 'A') treeFactory.add('D', 'B') const a = treeFactory.find('A') assert('(1)-1', `id:${a.id}, value:${a.value}`, 'id:A, value:3') const b = treeFactory.find('B') assert('(1)-2', `id:${b.id}, value:${b.value}`, 'id:B, value:2') // -- ここまでで図と同じ状態 // (2) ツリーへの追加 treeFactory.add('F', 'B') treeFactory.add('G', 'C') const a2 = treeFactory.find('A') assert('(2)-1', `id:${a2.id}, value:${a2.value}`, 'id:A, value:4') // (3)ツリーの変更 treeFactory.update('D', 'A')// DをA直下にぶら下げる const a3 = treeFactory.find('A') assert('(3)-1', `id:${a3.id}, value:${a3.value}`, 'id:A, value:4') const b3 = treeFactory.find('B') assert('(3)-2', `id:${b3.id}, value:${b3.value}`, 'id:B, value:2') // 確認用 function assert(message, actual, expect) { if(actual !== expect) { console.error(message, 'エラー', `${actual} != ${expect}`) return; } console.log(message, 'OK'); } </script>