Quantcast
Channel: もやし工房
Viewing all 72 articles
Browse latest View live

はじめてのGoogle Homeアプリ開発(WebAPI連携/2018年春編)

$
0
0

WebAPI(webhook)を使ったシンプルなGoogle Home(Google Assistant)アプリの作り方。Qiitaなどで見ている感じでは頻繁に画面が変わっているので、この情報はすぐに風化しそうなのですが、すぐに忘れてしまうので基本の部分を自分用メモも兼ねて残しておきます。2018年4月時点の情報です。

用語の意味

Google Homeアプリをはじめて作ろうとした時にここが良く分からなかったので、最初に書いておきます。

  • Googleアシスタント
    声を認識してテキストに変えたり、音声合成をしたり、デバイスからのユーザ情報を取得してくれる機能のこと。
  • Actions on Google
    Googleアシスタントを拡張する仕組み。範囲は音声認識~処理~合成までの一連の流れ全体。
  • Dialogflow
    プログラムを書かなくても、送られてきた言葉(テキスト)をいい感じにあれこれしてくれるサービス。
  • Intent(Dialogflow内で出てくる)
    中心的な役割をして、聞いた言葉を中継したり、加工したり、外に投げたり、返信を作ったりします。
  • Entity(Dialogflow内で出てくる)
    個人的にはLinuxで言う所のaliasみたいなイメージを持ってる。一つの動作の別名なんかを沢山登録しておいていい感じに使うところです。
    例)終わり、終了、バイバイ、さようなら→終了(実体)と結びつけておく
  • Fulfillment(Dialogflow内で出てくる)
    外部サーバとの橋渡しの部分。

図でまとめるとこんな感じ。「いや間違えてるよ」と言う所があったら是非教えて下さい。

google home / dialogflow

開発の大きな流れ

たくさん書いてあり 慣れるまで若干迷いますが、一つ一つの作業は小さいです。ブラウザでテストできるのでGoogle Homeの実機が無くても作れます。

  1. Actions on Googleでプロジェクトを作る
  2. Dialogflowでプロジェクトを作る
  3. Intentの作成(メイン)
  4. End Entityの作成
  5. End Intentの作成
  6. Default Fallback Intentの設定
  7. WebAPIの作成/設置
  8. Fulfillmentの設定
  9. Dialogflow内でテスト
  10. IntegrationsでGoogle Assistantで使用するIntentの選択
  11. Actions on Googleのシミュレーターでテスト
  12. 公開準備(画像、プライバシーポリシー)
  13. 公開

Actions on Googleでプロジェクトを作る

Actions on Google
https://console.actions.google.com/

上記ページでAdd/import projet→CREATE PROJECTを押します。

Actions on Google with dialogflow(公式ドキュメント)
https://developers.google.com/actions/dialogflow/

Dialogflowでプロジェクトを作る

BUILDを押して、Dialogflowのプロジェクトを作ります。

日本語にしておく(後から英語などを追加することもできます)。Dialogflow APIはOFFのままV1で。

Intentの作成(メイン)

Intentは複数作れますが、このサンプルではとりあえずメインの一つだけにしておきます。

Training phrases

Google Homeから送られてくる声をどんな風に分解するか的なことを設定します。

まず最上部に名前をつけます(ここでは「メイン」とつけました)。

次にTraining phrasesの”Add user expression”にyear年month月と入れ、言葉(この例ではyear)をマウスで選択して、この言葉がどんな種類なのかを選択します(今回は数字なので@sys.numberを選択)。

@sys以下で何を選べば良いかは下記を参照。@sys.number(数字)、@sys.any(とにかく言葉)などが選択できます。

monthも同様に設定します

 

Action and parameters

Training phraseで分解されたものを、どんな風に外部のシステムに伝えるか的な事を設定します。

名前はWebAPIに通知される名前。基本はphraseにあわせる。後述のEntitiyも入ります。

Responses 

今回はWebAPIの中身を喋らせるので、何も入れません。

Set this intent as end of conversationをONにすると、受け答えしたら自動切断します。受け答え後も続けて聞く場合は、OFFのまま。今回は、続けて聞くのでそのままにしておきます。

ここをONにすると、答えたら自動切断します。

Fulfillment

外部APIに投げるのでEnable webhook call for this intentをON。最後にSAVEで保存します。

 

End Entityの作成

「終了のおまじない辞書」を作ります。

名前をendにし、ユーザが終了時に喋りそうな言葉を沢山書きます。

End Intentの作成

終了のおまじない辞書を使う設定をします。

Intentを新規作成し終了などと名前をつけ、Training phrasesで適当にキーワードを入力し、ENTITYに@end(上記で作成したもの)を入れます。

キーワードをマウスで選択し@endを選択。このIntentが使われたら終了するように、Set this intent as~にチェックを入れます。

Default Fallback Intentの設定

メインIntentで解釈できない時に、聞き返す文言を修正します(修正は必須ではありません)。
「分からないので○○と言って下さい」的なのを追加すると親切ではないかと思います。

最終的にこんな感じになりました

WebAPIの作成/テスト/設置

別途最下部サンプルソースコード参照。httpsが使える場所が必要で、JSONで返すものを作ります。httpsが返せる環境を言うのは若干面倒ですが、レンタルサーバーなどでもLet’s Encryptを使った無料のSSLサービスなどがあるので、そういうのを使ってみるのも良い気がします。

 

Fulfillmentの設定

WebAPIができたら、左側からメニューからFulfillmentを押し、ENABLEDを選択。上記のWebAPIを設置したURLを指定します。

httpsではなく、httpだとエラーになりSAVEが押せません。

Dialogflow内でテスト

Dialogflowの右側(Try it now)に文字を入力し、思っているように動いているかテストします。

IntegrationsでGoogle Assistantで使用するIntentの選択

Integrationsを押し、作ったIntentのどれをGoogle Assistantで使うかを選択します。

下記の例ではWelcome、終了、メイン(Fallbackは勝手に使われるみたい)。

Actions on Googleのシミュレーターでテスト

ブラウザから動かせるシミュレータでテストします。

いい感じにシミュレーターで最終バージョンを使ってくれる設定。ONで(初回のみ出る)。

上図では動かなかったが、Actions on Google側からTESTを押すと動くときもあった。タイミングなのか、なんなのか…

上手く行くと、下図のようにSimulatorでもちゃんと動きます。

ただ、Dialogflowでは上手くいくのに、シミュレーターでは駄目な場合とかもありました。原因は正直良くわからない。上図のようにActions on GoogleのTESTを押すと上手く行ったりもしました。間違っていないはずだ!と言うことであれば、新しく作り直してみるのも吉。

ちなみに私の場合、G Suiteに所属してるアカウントでどうしてもうまくいきませんでした。

作成時のTips

来た言葉を全部WebAPIにわたす

適当な言葉を登録して@sys.anyを付けると、認識した言葉全体をWebAPIに投げられます。前後の言葉が無い、全体を取得したい時に便利です。

初回つながった時(Welcome)にWebAPIの結果を話す

Default Welcome Intentを下図のようにすると、つながった時にgetWelcome(名前は任意)をWebAPIへ取りに来ます。

JSON形式のWebAPIをテストをする

Chromeの機能拡張を使うと、簡単にJSON形式でアクセスできます。他のブラウザでも良く似た拡張機能があると思われます。

Advanced REST client
https://chrome.google.com/webstore/detail/advanced-rest-client/

headerをjsonにする

返信にテキストでは無く、音ファイルを渡す

最下部のサンプルで言うことろの、speechにspeakタグを入れるとmp3等の音声ファイルが流せます(タグの前後にテキストを入れると鳴りませんでした)。


$soundfile  = "https://url/xxx.mp3";
$speech_txt = "<speak><audio src='".$soundfile."'></audio></speak>";

Dialogflow(無料版)の料金と制限

無料(Standard Edition)の場合、リクエスト数に制限があるのですが「Actions on Googleを使用するGoogle アシスタントアプリには適用されません」とのことで、今回のようなActions on Googleから呼ばれるGoogle Home向けアプリの場合、制限は現在の所 無いようです。。

公開する

画像、アイコン、プライバシーポリシーが必要です。

画像は規定サイズよりも小さいとSAVEが押せないので、下図と同一若しくは、大きいサイズが必要です。プライバシーポリシーは今の所、google documentのワード文章(URL)とかでもOKぽいです。もちろん静的なhtmlも可。個人情報は取ってないですよ。とか書いておけば通ります。

リジェクト

Androidアプリを出す時はそういうのがなかったのである意味新鮮でしたが、審査ぽいものがあります。下記の理由などでリジェクトされます。日本人の方が見てるのか結構細かく見られますが、対応方法も分かりやすい日本語で書かれているので直しやすいです。

  • アプリ名が一般的な言葉のみ(私の場合はこれで落とされました)
  • 答えを言って終わり
    ユーザが何をして良いかわからないので「続けてしゃべるか、終了するなら終了って言ってね」を追加する
  • アプリが終われない
  • プライバシーポリシーが適当、接続できない

リジェクト理由。「分別さん」は作れなかった。

参考URL

おまけ

今アプリを出すと、Google Assistant developer community programとして、黒くてどこに来ていけば良いかわからないTシャツと、Google Cloud credit $200/月×1年分が貰えます。

作ったアプリ

小物でアプリリストを汚してごめんなさい…。いつか暇を見つけてちゃんとしたものを作ってみたいです。

サンプルソースコード (php)

下記の動きをするサンプルです。事前に上記の設定(Intentの作成(メイン))を済ませておいて下さい。

  1. ユーザーが「○年○月」と言ったら、「○年○月って言いましたか?」と返す
  2. 接続時にAPI中のいらっしゃいませを返す
    (上記Tipsの「初回つながった時(Welcome)にWebAPIの結果を話す」の設定をした場合)

最後に

私の公開したアプリを含め全体的にまだ「声ならではの便利さ」みたいなのが低い印象を受けますが、現在でもちょっとしたメモを取ったり、両手が離せない時などに何かやらせるのは声のほうが便利だなぁと思うこともいくつかあったりします。

大規模なものよりも「ちょっと生活を便利する」くらいの物が良く使われる気がしますが、まだまだ登録されたアプリの数も少ないです。スマートフォンのアプリを作るよりはずっとお手軽に始められるので、良いアイデア思いついたら、ちょっと挑戦してみると楽しいかもしれませんよ。


生理ちゃんボタンとうんこボタンを作った話(Amazon Dash Button)

$
0
0

はじめに

我が家では、

  • 子供が便秘気味で油断すると出ない→しばらく出ないと痛みが怖く できない→ますます出ない→最終的に泣きながらするの悪循環で、ほんとかわいそう。
  • 妻が(夫から見ると)不定期に機嫌が悪くなったり、急に生理ちゃんがやってきて予定があれこれ大変になることがある。

などの問題がありました。

このあたりの家族の健康を「Amazon Dashボタンを使ったら少しましになったよ」と言う話です(家族の許可はとってから書いています)。

Amazon Dash Button ?

Amazon商品の注文をワンボタンでできる便利なボタンで、押した時にしか通信しないので電池も凄く持ちます。常時500円で販売されており、初回注文時に商品が500円値引きされるのでボタンそのものは実質無料。Prime Dayなどでは100~250円で販売されていました。

  • Amazon Dash Button 公式 (食品から日用品まで いつの間にか130種類以上あった)
    https://amzn.to/2qjS1B1

そのままボタンを押すとラベルに書かれた商品が届くのですが、これをハックすると(反応速度が少し遅い)Wifiリモコン的に使えます。dashボタンのハックはボタンが出た当初から色んな方がされていて、この手の記事も何度も見たよ(何を今更…)という方も多いかもしれません。

セールの時に100円で買ったボタン達

で、健康管理です。この手のジャンルはスマホのアプリも多数出ていますし、最近ではamazon echoやgoogle homeなどのスマートスピーカーにやらせている方も多いと思いますが、今でも「押せば良いだけ」と言うUIは1週間に1、2回や1ヶ月に1回だけしかしないタスクには単純で使いやすいです。

メリット

  • 単純で誰にでも使え、誤認識、キーワードを忘れるなどのイライラがない(対スマートスピーカー)
  • スマホを探す→電源ON→アプリ選択→機能選択などの手間がかからない(対アプリ)

デメリット

  • 探す手間がかかる(場所を固定しておかないと無くす)
  • 自分で作らないと使えない

生理ちゃんボタン?

月に1度押すと、夫婦で共有しているGoogleカレンダー(閲覧はジョルテ)に開始日、排卵予定日、次回予定日が登録され、家庭内のSlackに通知されます。

このジャンルはスマホの専用アプリが多数出ており、妻も試しに使っていたようですが、

  • カレンダーアプリが2個(普段使いと健康管理用)になる
  • 専用アプリは やたらと通知が来て面倒
  • しかし、単にgoogleカレンダーに登録するだけでは次回予定日などが出ない
  • 夫婦間で情報がライトに共有できない

と言う問題がありました。今回のものは、普段使っているGoogleカレンダーなのでそのあたりが解消されています。

周期計算はそれまでの周期の平均値、排卵予定日は次回予定日の14日前(オギノ式)から計算しているため、それなりに周期が安定してる方でないと使えませんが、我が家では半年ほど非常に良い感じで使用できています。

こんな感じで、経過日数、排卵予定日、次回生理予定日がカレンダーに登録され、夫婦でライトに共有できる

周期がそれなりに安定している場合はパートナーに排卵予定日が共有されているため、”ゆるい妊活”とかにも使えるのかなぁとも思います。

また、なんか今日は(特に原因が思いつかないのに)妻の機嫌が悪い/ネガティブ発言が多いなぁと感じたときもカレンダーを見て「ココは事を荒らげずにやり過ごそう」と無用な争いを避けることができます。

生理ちゃんボタンは生理用品入れに入れっぱなしになっています

当初は単にカレンダーに登録するだけのボタンだったのですが、妻がオモコロで連載してる小山 健さんの「ツキイチ!生理ちゃん」が大好きなので、Slackの通知には生理ちゃんがランダムでやってくるようにしました。

月替りでランダムな生理ちゃんがやって来てくれることで、「単に嫌だった生理」が「生理ちゃん来ちゃったなら仕方ないか」と若干心安らかに生理を受け入れるようになったとの事です。コンテンツの力は素晴らしい。

家庭内Slackに月1度届く 生理ちゃんの様子

うんこボタン

やっていることは上記と同じです。ボタンを押すと前回からの経過日数をGoogleカレンダーに登録し、家庭内Slackに通知します。また、毎朝チェックし4日以上出ていなかったらRaspberryPiで朝の予定をしゃべる時に「出ていないよ」と話すようになっています。

こんな感じでトイレに固定しています。

朝の予定を喋らせたり、家庭内Slackへ通知したりする方法は下記の記事をご参照下さい。

もちろんこちらは「ボタンを押したら便秘が改善される」と言うわけではないのですが、しばらく出ていない場合 意識的に食事を変えたり、朝「そろそろ怪しいので帰ったらゆっくり時間をかけてしてねー」と伝えることができます。

こんな感じで、前回からの経過日数がカレンダーに記録される。

当初は便秘解消用に食物繊維粉やヨーグルト飲料を続けて飲むなど、朝ごはんを定期的に変えていた時期があったのですが、どれが子供に効果があったかが定量的に分かり 良かったです(結局「グラノーラを食べる」が一番良い感じだった)。

このボタンは1年近く使っているのですが、電池交換(できませんが)も無く非常に安定して使えています。そして現在では、便秘問題はほぼ解消されました(嬉しい!)。

先日ESP-WROOM-02を使ったLINEグループやウェブアプリに記録する同様のボタンがクラウドファンディングで達成されたと言うニュースを見ましたが、「単機能のボタンを押して何か記録する」と言うのは、スマホの電源入れるのが面倒な方や、IT的なものが得意でないお年寄りや字が読めない子供などに有効で、アイデア次第で色んな使い方もでき良い感じです。

技術的な話

ちょっと自分で作ってみようかなぁと思った方向けの話。nodejsとか出ていますが、そんなの触ったこと無い方でも頑張れば何とかなるのでは無いかなと思います。

まず、LAN側にdashボタンの通知を受けるサーバーが必要になります。RaspberryPiにやらせてる方が多く、私もそうしてます。nodejs+node-dash-buttonと言うモジュールでやっていますが、多くの情報があるのでここではリンクと、使用しているソースを載せておきます(画像データなどは入っていないのでご自分で用意してください)。

今なら100均のBluetoothボタンや、上記のようにESP8266やESP32などの安価なマイコンでも同様のことができる気がします。

slackへ通知したり、RaspberryPiに喋らせたりはこちらの記事。

ちなみに平均を求めるための過去データはgoogleカレンダーの内容欄にシリアライズして入れてあります。月に1データなのでまぁ大丈夫でしょう…

生理・予定日、うんこ日をgoogleカレンダーに追加するソースコード

この記事で使ってる、Googleカレンダーにあれこれするソースコード(php)を共有しておきます。

最後に

1日に何度も記録する系は(周囲の雑音が無ければ)今なら両手がふさがっていても使え、物理的な何かを探さなくても良いスマートスピーカーの方が便利(google homeはホント良い子に日本語を聞いてくれ、私も1日一度の「薬飲んだ?」の記録はこちらでやっています)ですが、「シンプルなワイアレス物理ボタン」はこれはこれで使いやすいです。

リモコンのように無くさなければ、小さくて発声すらしなくても良く「ボタンを押すだけで記録」は他のことにも応用が効きそうです。

健康問題は各個人のプライバシー的なあれもありますが、家庭内でそのあたりがオープンな関係であれば、試してみるとあなたの技術が家庭に還元され みんなハッピーになれるのでは無いかなぁと感じました。

発酵しにくい簡単な梅シロップ・梅ジュースの作り方

$
0
0

梅ジュースって美味しいですよね。梅酒は漬けてから飲めるまでが長いせいで、漬けることに満足して放置してしまう事もありますが、シロップは直ぐにでき子供も大好きです。焼酎で割れば梅酒っぽく飲むこともできますし、作り方自体も簡単。ただ、梅酒と比べ発酵しやすく失敗する可能性があるのが難点です。

この方法であれば、発酵しにくく、短時間(2週間程度)で梅シロップを作ることができます。

対象

こんな方が対象です。

  • 失敗しない梅シロップを作りたい(若干風味が落ちてでも)
  • 面倒なことは極力少なくしたい
  • さっさと飲みたい

発酵怖い

梅シロップを何度か作った方、発酵大丈夫でしたか?

わざと発酵させて酵素ジュースとして飲むのであれば問題ないのですが、発酵してしまった梅シロップの独特の香りはどうしても好きにはなれません。発酵にいち早く気づき 加熱で発酵を止めても、発酵臭を完全に取り除くことは難しいです。

過去、梅シロップは何度も作って来たのですが、いつも発酵だけはしないで欲しいと祈りながら作っていました。

発酵の原因は砂糖が溶けなかった(ゆすり足りなかった)、梅の時期(青いほうがしにくい)、無農薬梅で表面についていた酵母が多かったなどがあるようです。

対策

発酵の原因となる事を避ければ、良くなるはずです。

具体的には、

  • 砂糖を早く溶かすために白砂糖を使用し少し酢を混ぜる&こまめにゆする
  • 梅から早くエキスを出してしまうために梅を冷凍する
  • 傷がついたり熟したものをできるだけ避ける

などが良さそうです。

インターネットを見ていると「冷凍すると青梅の独特の爽やかな風味が劣る」と言うのを見かけますが、個人的には発酵してしまうリスクよりは はるかに良いです。横に置いて飲み比べると風味が違う事は認めますが、冷凍梅を使っても十分に美味しく感じています。

梅シロップの材料

  • 青梅 1kg(黄色いのは香りは良いのですが 発酵しやすいです)
  • 上白糖 1kg
  • 酢(今回は米酢を使用) 50 cc程度
  • 竹串 2,3本
  • 3リットル以上の保存びん(オーソドックスな口が広い瓶の方が何かと楽です)
  • 焼酎 or エタノール or 熱湯(消毒用)

砂糖について

梅酒の場合はお酒との浸透圧の関係でじっくりと時間をかけて”溶けなければならない”ため氷砂糖を使用するのですが、梅シロップの場合はゆっくり溶けていると発酵する可能性が高くなるため上白糖を使います。グラニュー糖を使っても良いかと思います。

ただ、氷砂糖は粒(塊)が大きいため沈殿してしまうことは無く、時間をかけて綺麗に全部溶けるのですが、白砂糖の場合は沈殿してしまいますので、後述の対策は必要になります。

今回は近所で採らせてもらった梅(無農薬)を使用しました

作り方

水につけてアク抜きする

水をたっぷり入れた容器に2~3時間程度 梅を入れ、アク抜きをします。

写真では水入れ中ですが、実際にはナミナミと入れます。水の中でツヤツヤになるのが綺麗です。

梅を水でゴロゴロと洗う

表面を洗い、ザルに入れ水をきったのち、新聞紙の上にざっくり広げ乾かします。

ヘタを取る

手をよく洗い、できれば軽く消毒した後、一つ一つキッチンペーパーで軽く拭きつつ、ヘタを竹串などでペロッと取ります。綺麗に取れると嬉しいですが、取れにくいとイライラします。

ヘタが多く残るとエグみが出るとのことですが、実際の所ホントなのかは分かりません。梅干しの場合はヘタが残ると食べづらくなるので取るのは必須ですが、時間がなかったらとらなくても問題ないかと思います(最後に一度濾す必要がありますが、取ってない方も見かけます)。

この時、大きく傷があるもの、割れているものなどはごめんなさいしてしまいましょう。エキスを出しやすくする為、穴を開けるレシピもありますが、経験的に痛むと発酵の原因になる気がするので穴はあけません。

大きく傷があるものはごめんなさいする

冷凍庫に入れる

ビニール袋に入れ冷凍庫に入れます。丸一日以上冷凍すれば中まで凍ると思いますが、ここまで来たらしばらく放置しても問題ないため、後の作業は時間のある時にします。

瓶の滅菌

シロップを作る当日に瓶を洗い、沸騰した熱湯でグルグルとすすぐか、焼酎、消毒用エタノール(薬局で購入)で拭きます。内蓋も忘れずに滅菌して下さい。

蓋はキッチンペーパーに染み込ましたエタノールで。これで瓶を拭いてもOKです。手も綺麗にして下さい。

冷凍庫から梅を取り出す

きちんと中まで凍っていそうかを、なんとなく見ておいて下さい。

冷凍梅と砂糖を入れる

容器に砂糖→梅→砂糖→梅→砂糖の順→以下続く で入れます。そこまで厳密にやる必要はありませんが、できるだけ最後は砂糖で終わるようにすると良いかと思います。

今回は2種類作った。最後なるべく砂糖でかぶるように調整して下さい。

酢を入れる

少量の水分があると砂糖が早く溶ける(一度溶けるとその砂糖水で更に砂糖が溶けます)&発酵防止の為に、酢を少量 回し入れます。50cc程度であれば特に味の差は感じませんが、さっぱりした後味が欲しい方は倍量程度入れても良いかと思います(倍量入れる場合は酢の種類によって味が変わります)。

一旦の作業はここでおしまいです冷暗所においておいて下さい。

シーズン外にもよく飲む、大好きな「梅よろし」には黒酢が入ってるぽい。

梅よろし 350ml×24本 梅よろし 350ml×24本

瓶をゴロゴロ転がす

あとは気づいたら1日に1回以上瓶をゆっくりとゴロゴロと転がします(あんまり液中にガバガバと空気が入らない程度に)。内蓋がきっちりしまってないと液が漏れてしまうので注意して下さい。砂糖はさっさと溶かしてしまって下さい。

また、白砂糖の場合は瓶の底に砂糖が沈殿してしまうと思います。沈殿して固まってしまった砂糖はなかなか溶けませんので、裏返しにしてトントンと叩いてから少し放置しておくと流れ落ちると思います。

瓶を転がす写真を撮っていませんでしたが、横にしてゆっくりと5周程度転がします。これは底に沈殿した砂糖を落下させているの図。15分程度で落ちます。

毎日転がす&完成

砂糖が全部溶けても2、3日に1度はコロコロをくり返し、つけ始めから10日程度は漬けておきます。2/3程度の梅がシワシワになったら飲み始められます。

シワシワ梅が多く、発酵していない(ごく少量の泡は表面に出ます)ようであればしばらく放置しても大丈夫ですが、(この方法であれば発酵はしにくいはずですが)シワシワ梅が少なく梅の周りに泡が付き始めていたら発酵が怖いので液のみ取り出して15分程度火にかけてしまいましょう(こうなってしまった後は再度梅漬け込むことはできません)。ちなみに1ヶ月程度放置してもシワシワにならない梅は、それ以上つけていてもシワシワにはなりません。

4日後の姿。少しシワシワになっている。

10日後の姿。もう飲めます。もちろん発酵していません。

出来上がった後のシロップは梅を取り出します。冷蔵庫に保存+1ヶ月程度で飲み切る場合は火にかけなくても良いかと思います。

経験的にはシワシワ梅が多い状態であれば、そのままずっと放置(梅につけたままにしておく)しておいてもいきなり発酵することは無いように感じます。

約1年放置した梅シロップ

約1年放置した梅シロップ。爽やかさは無いけどカドが取れ匂いも濃く、これはこれで好き。

シワシワになった梅はジャム等に再利用するのが難しい(果肉が固く剥がすのがめんどくさい)ですが、ならなかった梅は果肉を剥ぎ取り、そのまま煮詰めてジャムにしたり、梅シロップの中に入れて崩して飲んでも美味しいです。

最後に

梅の香りと酸っぱさの混じったシロップ。ほんと美味しいですよね。皆さんのシロップも発酵しませんように!

梅シロップ

google analyticsのgtag.jsで複数のカスタムディメンジョンをpvと同時に送る

$
0
0

google analyticsのトラッキングコードをga.jsからanalytics.jsへ移行した時のことは何となく覚えています。WordPressのプラグインを使うようになってからは「トラッキング用のIDを入れれば良いだけ」に慣れてあまり意識していなかったのですが、2017年秋くらいからgtag.jsに移行が始まっていたのですね。

今回、WordPressで作った会員限定サイトで「どの会員種別のユーザーのPVなのか」を調べる為に、内部的にanalyticsに会員種別を送る必要があったのですが、「gtag.jsで複数のカスタムディメンジョンをpvと同時に送る方法」に関する情報がなかなか見つからなかったので、残しておきます(gtag.jsでこんなすごいことができるようになった!は他のページを見てください)。

ちなみにWordPressの登録ユーザーか否かを送るだけであれば、Google Analytics Dashboard for WPと言うプラグインで可能です。

gtag.jsは下記’config’の時点でpvが送られるので、そのタイミングで一緒に送るぽいです。

コード

<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-XXXXXXXXX-X"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  //複数のディメンジョンを送信
  gtag('config', 'UA-XXXXXXXXX-X', {
    'custom_map': {
       'dimension1': 'member_type',
       'dimension2': 'post_category'
    },
    'member_type':   'value_hoge',
    'post_category': 'value_fuga'
  });

</script>


予め、google analyticsでカスタムディメンジョンの設定をしておくのはanalytics.jsのときと同じです。

参考

塩だけでつくる昔ながらのシンプルな梅干しの作り方

$
0
0

梅干し 好きですか?梅干しの事を考えるだけでよだれが出てきますよね。近頃の市販の梅干しは、はちみつが入ったり、まろやかな味わいだったりと 酸っぱみを抑える傾向にありますが、塩だけでつくるシンプルな梅干しも シャキッと酸っぱくて、これはこれで美味しいです。

このレシピの材料はシソは入らず塩と梅だけ。ちゃんと天日に干せば、綺麗な梅干し色になり、常温で長期保存が可能です。今年はくせになる酸っぱい梅干しに挑戦してみませんか?

出来上がった酸っぱい手作り梅干

対象の方

今回のレシピは こんな方が対象です。

  • 一粒一粒愛着の持てる梅干しを作りたい方
  • 少々塩っぱくても良いので、カビのリスクは避けたい方
  • 常温で長期保存したい方
  • 昔ながらのすっぱい、塩っぱい梅干しを食べたい方
  • 食べられるまでに時間がかかっても大丈夫な方
    できた直後は塩のカドがたって塩っぱいですが、2年くらい放置すると美味しくなります。

市販の減塩梅干しの塩分濃度は3~10%。このレシピの場合、塩っぱい梅干しになりますが、減塩はカビ等失敗する可能性も高く、長期保存にも向きません。

梅干し作り の材料

  • 梅(黄色くて良い匂いのしだしたもの。緑のものであれば追熟を) 今回は2.5kg
  • あら塩 梅重量18~20%の重さ 今回は450g(下記の計算機で計算してください)
    サラサラの塩は梅にひっつかないので使わないほうが良いです
  • 竹串 or 硬い爪楊枝
  • ホワイトリカー・焼酎 少量(無くても大丈夫)
  • 梅を漬ける用の容器(口が広いほうが漬けやすいです。あれば)
  • 長期保存時の保存瓶(ガラス製。漬けるようの容器を兼用してもよい)
  • 消毒用エタノール(容器の消毒用。無くても大丈夫)
  • ゴミ袋(大) 数枚(頑丈なもの) or 重石(梅重量の1.5~2倍程度)
  • 干し網・干しざる・網戸など(干す用)

塩はしっとり固まる粗塩を使いましょう

梅干し作り塩分濃度計算機

今回のレシピでは、梅の重量の18~20%の塩で漬けます。下記へ梅の重量を入れ、塩分濃度を選んでください。塩分濃度の下に塩の重さが出ます。


(kg)



作り方

梅の状態

梅がまだ緑色であればダンボール等に入れ、黄色くなるまで追熟させます。

少々固くても大半が黄色くなり、いい香りがして来たら大丈夫。かなり柔らかくなるまで追熟させる方もいらっしゃいますが、初めてであれば 外側が破れると塩水も濁り少々ややこしいことになるので、心配なら 緑が少々混じっても、大部分が黄色い(ちょっと硬め)で作ると良い気がします。初回に失敗したら次からやる気なくなるじゃないですか。

個人的にはせっかく作るのであれば小粒よりも大粒の梅の方が満足度が高くなるのでおすすめです。

黄色い梅。いい香り。

近所で採らせてもらった梅。凄く良い匂いなのに、このままでは全く食べられない。

前準備

梅を漬ける容器を消毒します。沸騰した水をぐるりと回し入れ滅菌するか(熱い)、エタノールをキッチンペーパーに付け、中を拭いておきましょう。また、塩を計っておきます。

梅を洗う

買ってきたものであれば、水に入れ、軽く ぐるぐるします。梅シロップのようにアク抜きのために長時間水に入れる必要はありません。梅干用の黄色い梅は、あんまり一所懸命洗うと傷がついて茶色くなってしまいますので注意してください。

家で採ったものであれば汚れが落ちる程度に指でキュッキュと軽くこすり洗います。

梅を洗います

黄色い梅は、アク抜きをする必要はありません

梅を乾かす

新聞紙にでも広くひろげて乾かします。乾かしつつ、ヘタを取ります。軽くフキンで拭いてからヘタを取りましょう。

新聞紙にひいて乾かします

新聞紙は綺麗なのかって?まぁ細かいことは気にしない方向で…

梅のヘタを取る

漬けても硬いヘタは取ってしまいます。手を綺麗にしてから、竹串でなるべく梅に傷がつかないようにピッっと飛ばします。この時に大きく傷が付いているもの、変色しているもの、カビが生えているものはサヨウナラします。まだ乾いていなければ、ヘタを取ったあとにまた乾かしておきましょう。

竹串で梅のヘタを取ります

百均の竹串だと柔らかいのか、すぐに先っぽがボロボロになります

梅をホワイトリカー(ある場合)にさっと浸して 塩をつけ、瓶に入れていく

漬ける用容器の内側にゴミ袋を被しておきます。

ヘタを取った梅をホワイトリカーにくぐらしてから、塩を付け、瓶に入れ、さらに少し塩を振ります。この為にホワイトリカー買うのが勿体なければ付けなくても大丈夫です。ホワイトリカーを使うと梅の表面が消毒され、塩も付きやすくなります。

梅をホワイトリカーにくぐらせます

ホワイトリカーに軽く くぐらせる

そして、塩を表面に付ける

ホワイトリカーを使わない場合は、底に塩を軽く敷いたあと、漬ける用容器に梅を並び入れ、塩を上にまんべんなくふりかけます。

どちらの場合も、塩水は下に溜まっていくので、分量わからなければ最初の方の塩は気持ち少なめで良いかと思います。

梅を塩で漬けます

一番下の段はこの程度の塩で大丈夫です。容器には写真のようにビニールを被しておきます。

同じように、梅→塩→梅→塩としていきます。最上部等で塩が足りなくなってしまったら、塩を気持ち足す感じで。

最上部はこんな感じで

重しをする

全部の梅を入れ終わったら、ビニールの口を小さくし、中の空気をなるべく抜き(梅と塩が密着しやすくなります)、口を塞いだあと、上から重しをします。重しの重量は梅の重量の1.5~2倍程度。初めてで心配なら気持ち重めで。

重しは必須です。重しがない場合は、厚手のビニール袋を2、3重にし、水を入れてなんとか重くします。2日位すると梅酢(梅エキス+塩水みたいなもの)が出て、4・5日すると全体が浸かるくらいになるかと思います。4・5日しても上部まで浸かっていなければ少し塩を増やすか、20%程度の塩水を加えます。

梅に重しをのせます

重しを持っていなければ、ゴミ袋を3重以上にし、水を入れてのせる

全体まで浸かったら、最上部が沈む程度まで重しは軽くしてしまって or 無くしてしまってかまいません。

梅酢が出た様子

4日後の状態。梅酢が出てだいたい全体が浸かっています。この状態になったら重しは軽くするか、取ってしまって構いません。

1ヶ月程度漬け、晴れの日を待つ

最上部まで塩水で浸かる状態にし1ヶ月以上漬けたら、週間天気予報を気にしながら、3日は晴れそうな日を待ちます。「土用干し」という言葉を聞かれた方も多いと思いますが、土用の丑の日を待つ必要はありませんし、過ぎてしまっても大丈夫です。

一ヶ月後の状態(重しはしていません)

天日干し(1日目)

個人的にはここからが楽しい「梅の塩漬け」が「梅干し」に変わる作業。レシピによっては天日干しをしないものもありますが、干すと 皮が固く中が柔らかくなり、色も梅干し色になります。

干網(私の場合は網戸で自作)、干しざるなど、直射日光がそのまま当たる状態のものを用意し、お日様に当てます。

梅干しを天日干しする

この作業が凄く楽しい! 梅の塩漬けから梅干しに変わっていきます

なるべく午前中から一つづつ梅を出し、干網に並べ、天日干しをします。太陽の出方にもよりますが、午後にひっくり返します。

干すと、どんどん 梅干し色になっていきます

梅酢も容器と一緒に天日干します。

梅酢も容器と一緒に干しておきます(どれくらい意味があるのかは不明)

夕方前に梅酢に戻し、再度漬けます。

夕方に、再度 梅酢に漬けます。

天日干し(2日目)

梅酢に漬けた梅干しを再度天日干します。天気が怪しければ連続した日でなくても大丈夫。大きめの粒の場合、午後にひっくり返す際、梅を軽く揉むと中が柔らかく、実離れが良いものができます。ほわほわの赤ちゃんみたいな手触りで柔らかくて気持ちが良いです(&かわいい!)。

1日めに引き続き、梅酢も外に干しておきます。

2日目夕方の状態

どっから見ても、梅干しです。塩ふいて美味しそう。

綺麗に洗った消毒した保存瓶に梅酢を入れ、一粒づつ詰めていきます。梅酢に入れると塩っけがきつくなるため、梅酢には入れずそのまま保存される方もいらっしゃいます。

しばらく放置する

上記の直後から食べることはできるのですが、正直「酸っぱい」と言うよりは「塩っぱい」です。個人的には、たまーーに食べつつ1年位放置すると塩の角が取れ、風味豊かな、昔ながらの酸っぱい梅干しになる気がします。

塩分濃度も高いため、かなりの長期保存ができ、我が家では3年ほど放置したものも食べています。

最後に

最初は市販の梅干しに比べると塩っけがきつく、まろやかさや化学調味料独特の旨味も無く、少し違和感を感じたのですが、慣れてくると、この梅干しじゃないと物足りなくなります。

あなた味の梅干し。ぜひ作ってみてください。

はじめの一歩!無料で始めるAWS その1(登録、請求アラート、用語編)

$
0
0

Amazon Web Serviceの無料枠を使ってEC2,ELB,RDS,CloudFrontを使って色々頑張ってみる話。お勉強、1年限定お試しの為などなど、一度試してみたい方の参考になれば幸いです。日本語版コンソールでの説明です。

  1. 登録、請求アラート、用語編
  2. EC2、EBS編
  3. ELB、CloudFront編
  4. RDS、CloudWatch、退会編

に別れています。

AWS無料利用枠?

Amazonのクラウドサービス、Amazon web serviceアカウントを作成したユーザーが1年間の間、AWSリソースのある一定の使用枠を無料で利用できるプログラムです。

2015/6月現在、無料で利用できる主要なサービスはざっくりこんな感じ(月間使用量)。24×30日=720時間なので、それぞれ1つだけ起動するなら1ヶ月間はちゃんと使える計算です。

  • EC2 / 仮想サーバー / 750 時間 / t2.micro
  • RDS / リレーショナルデータベース / 750 時間 / 20 GB / db.t2.micro
  • CloudFront / CDN / 50 GB データ転送(アウト)
  • EBS / EC2につけるストレージ / 30 GB (SSD)
  • ELB / ロードバランサ / 750 時間 1 か月あたり / 15 GB
  • S3 / ストレージ / 5 GB
  • CloudWatch / 監視 / 10個の監視項目
  • DynamoDB / NoSQL DB / 25 GB
  • 他多数

無料枠で何ができるの?

現在、見ていただいているブログ(WordPress)や、それほどCPUパワーを食わないWebシステム、他 最悪遅くなっても誰も死なないLinuxベースで動く何か、外からつながる開発環境などを動かす事ができます。無料枠内でもデータベースは別サーバにできるので、思っていたよりは色んなものに使えます。

今回は、上記の無料枠の内、

  • EC2 / 仮想サーバー / 750 時間 / t2.micro
  • EBS / EC2につけるストレージ / 30 GB (SSD)
  • RDS / リレーショナルデータベース / 750 時間 / 20 GB / db.t2.micro
  • ELB / ロードバランサ / 750 時間 1 か月あたり / 15 GB
  • CloudFront / CDN / 50 GB データ転送(アウト)

を使ってみたので、使い方と注意点を書いていきます。

あらかじめ用意するもの

  • クレジットカード
    無料枠利用でもクレジットカードが必要なので、予め用意しておきましょう。ネットを見ているとデビットカード(審査無し、即引き落としカード)でも登録可能との事なので、学生やカードを持ってない方は事前に手に入れておきましょう。

サインアップ

まずは登録しないと始まりません。

へ行き、右上の「まずは無料で始める」のボタンを押し、ユーザ登録をします。日本のお買い物で使うamazon.co.jpのアカウントは使えず、amazon.comのアカウントを取得します。

名前、住所等は「半角英数」で入力し、クレジットカード番号を入力します。言語を日本語に変え、上記ヘルプページを見ながらやれば特に難しくはありません。最終ページのサポートプランは「ベーシック(無料)」を選びましょう。

2015-06-23_15h35_57

このページだけ英語

2015-06-23_15h35_25

日本語が出てきても半角アルファベットで入力

 登録が終わったら、下記URL等からログインします。

利用料金通知の設定

ログインすると何やら聞いたことのある色んなサービス一覧が並んでおり、どれどれとクリックしたくなるとは思うのですが、いったん我慢します。

AWSは「いつの間にか料金かかって怖い」みたいな話は聞いたこと無いでしょうか?今後色々試すうえでも、「無料枠と思って使ってたら、思ってもいない金額の請求来た」とかは怖いので、まずは「利用料金が$○を越えたらメールを送る」設定をしましょう。

  1. ログイン後の右上のアカウント名→請求とコスト管理をクリック。
    BillingAlarm001
  2. アラートおよび通知→初回請求アラームの設定
    BillingAlarm02
  3. 請求アラーム→アラームの作成
    BillingAlarm03
  4. 1欄にアラートを出したい金額(今回は5ドルでアラートが飛ぶように設定)
    2欄に通知したいメールアドレス
    3アラームの作成
    BillingAlarm04
  5. 2の関係でメール認証のメール?が来るのでリンクをクリックして認証。
  6. 作成した直後はデータ不足とかなっていますが、しばらくほっておくとOKに変わっています。
    BillingAlarm05
    BillingAlarm06

ただ、このアラームって6時間につきって書いてあるんですよね。6時間以内に閾値に達したときメールって来るのでしょうかね。ただまぁ「しでかした」としても6時間で気づけるというのは安心につながります。

その他(エラーメッセージについて)

設定していてエラーが出てどうにも分からないと言う場合は、検索して探したりすると思いますが、現在の所は日本語のエラーメッセージで探してもあまり情報が出てきません。最下部の言語を日本語→Englishに変更してから探すとより多くの情報が出てきます。ご参考まで。

2015-06-23_15h56_00

エラー原因を探すときは英語に切り替えて

用語解説

設定に際し 今までAWSを使ったことの無い方には聞き慣れない言葉がいくつかある(少なくとも僕は分からなかった)のでざっくりと書いておきます。Elastic IPの部分などは無料枠を無料として使いたい場合は気にしておく必要があります。

  • インスタンス
    (EC2上で実行される)仮想マシンのこと。EC2に限らず起動してくる何かはインスタンスって言ったりしてるみたい。
  • Amazonマシンイメージ(AMI)
    OSのディスクイメージ。OSがインストールされた状態のハードディスクの内容を丸ごと写しとったもの。
  • Elastic Block Store(EBS)
    EC2で使うディスク。無料枠のt2.microにはストレージが付いてないので、これを借りる必要がある。
  • Elastic IP アドレス
    EC2に割り当てるグローバル固定IPアドレス。(構成にもよるけど)EC2起動時にはグローバルIPが一つ割り当てられるけど、再起動したら変わってしまう。これで固定IPを割り当てられる。
    起動しているEC2に割り当てていると料金が発生しないが、割り当てずに固定IPだけ取っていると料金が発生するので注意(割り当て後EC2と停めていても料金が発生する)。
  • Virtual Private Cloud(VPC)
    仮想的なプライベートネットワーク空間。無料枠のt2.microはVPC内に設置する必要がある。

その他 ($25クーポンが貰えるよ)

2015/06/30までは「日本語版コンソールリリース記念 AWS クラウド無料体験キャンペーン」とやらで下記に申し込むと25ドル分のクーポンが貰えます。

無料外のちょっとした機能を体験したいとか、複数のインスタンスを起動実験をしたい時などの為に貰っておきましょう

 

と言うことで、次回はEC2を起動してみます。

 

・はじめの一歩!無料で始めるAWS

  1. 登録、請求アラート、用語編
  2. EC2、EBS編
  3. ELB、CloudFront編
  4. RDS、CloudWatch、退会編

薬飲み忘れ装置を作った話

$
0
0

皆さんは毎日の薬って飲んでいますか? 今は飲んでいなくても、年取ってくると生きてるだけで何だか色々なところが調子悪くなって薬が必要になってきたりもします。私は尿酸値が高く、もうかれこれ15年ほど朝に薬を飲んでいます。で、この薬なのですが、ホント飲み忘れる。また、飲んだにも関わらず、びっくりするほど飲んだかどうかを覚えていません(私だけ??)。

今回は この飲み忘れを防止する機械をArduinoで作った話です。かれこれ1年近く使用していますが、これにしてから殆ど飲み忘れがありません。

薬の飲み忘れ防止の選択

服薬管理アプリ(スマートフォンアプリ)

まず直ぐに思いつくのが投薬管理のスマートフォンアプリ。無料のものも多く、私も最初はこれを使用しました。薬の残り個数管理や、リマインダー、スヌーズなど色々な機能があるのですが、

  • スマホを探す→スマホの電源を入れる→ロック解除→飲んだボタンを押すのが面倒
  • スマホが手元にあっても、朝食中など、まだ薬を飲まない時に微妙な操作性
  • 飲んだかどうかが自分しか分からない&アプリを起動しないと分からない。
  • (無料のものは)広告などの通知などが邪魔。個人情報もできれば取られたくない。
  • クラウド連携等、多機能なのは正直設定などが面倒

→1週間程度で使わなくなりました。

飲み忘れも含め、薬管理関連は沢山出てる

スマートスピーカ

上記の記事を読み「スマホを探さなくて済む!」と参考にしながら同じようなシステムを作りました。googleスプレッドシートに記録がない場合は定期的にSlackとgoogle homeの音声で通知を繰り返し、「飲んだよ」って言うと通知が止まる的なもの。ただこれの問題点は…

  • 通知が来た瞬間には飲めないが、もうちょっと後で…と思ってると忘れる
  • 飲んだ時に「ok google 薬飲んだよ」って言わなければならない→面倒
  • 飲んだかどうかパッと確認できない(確認にgoogle homeに聞く or スマホを見なければならない)

→結構飲みやすれが多い状態で2ヶ月ほど続けた。

google homeは良い子

という事で…

  1. 視覚的に飲んだ / 飲んでいないが直ぐにわかる
  2. 飲んだ場合、飲んだ記録を直ぐに、簡単に付けられる
  3. できれば、見た目にも少し気を使いたい…

そんな商品は無かったので、作ってみました。

できたのがこれ

  • 指定の時刻になると光る
  • 頭をポチッと押すと光が消える
  • 6時間、頭のボタンを押されなければ自動的に消える
  • ちょっとかわいい

仕組みはすごく単純で、ハード系の一番最初に試す”Lチカ”とほぼ同じです。
でもこれ作ってからはホント飲み忘れなし! レガシーな物理スイッチの威力を感じます。

作り方

材料

Arduinoがおうちに転がっているような方であれば、既に持っているものばかりだと思われます。

筐体のデータ

3Dプリンタのデータを置いておきます。

https://www.tinkercad.com/things/dQp2mWPZLOf-kusuribox

接続方法

スイッチはINPUT_PULLUPを使うのでプルアップ抵抗は使いません。電源は、余ってたスマホ用の5V USB充電器をArduinoのUSBポートに刺して使います。

実際はこんな感じで接続し、抜けそうなところはホットボンドで固定しました。

プログラム(スケッチ)

このプログラムでは時刻がハードコードしてありますが、もう一つスイッチを作って、それを押したら設定できるようにしたり、電源コネクタをつなげた時の時刻などにすると汎用性が上がるのかなぁとも思いました。また、Arduinoのsleep機能を使えば電池でも動くのかなとも思いますが、面倒なのでやっていません。


#include &lt;DS3232RTC.h&gt;
#include &lt;MsTimer2.h&gt;
#include &lt;Streaming.h&gt;
#define BUTTON_PIN 2
#define LED_PIN1 5
#define LED_PIN2 6
int buttonState = 0;

void setup()
{
  Serial.begin(115200);

  // ボタンを入力に
  pinMode(BUTTON_PIN, INPUT_PULLUP);

  // 割り込み(LED点滅用)
  MsTimer2::set(500, flashLED);

  // PCから時刻を持って来て、RTCに設定(初回のみ使用。2度めはコメントアウトして書き込む)
  //RTC.set(compileTime());

  //アラーム自動開始。7:15(秒, 分, 時, 曜日)
  RTC.setAlarm(ALM1_MATCH_HOURS, 0, 15, 7, 0);
  RTC.alarm(ALARM_1);
  RTC.alarmInterrupt(ALARM_1, false);

  //アラーム自動停止。13:00(秒, 分, 時, 曜日)
  RTC.setAlarm(ALM2_MATCH_HOURS, 0, 0, 13, 0);
  RTC.alarm(ALARM_2);
  RTC.alarmInterrupt(ALARM_2, false);
}

void loop()
{
  //アラーム開始
  if ( RTC.alarm(ALARM_1) )
  {
    Serial.print("アラーム開始");
    MsTimer2::start();
  }

  //アラーム自動停止
  if ( RTC.alarm(ALARM_2) )
  {
    Serial.print("アラーム停止");
    //LED停止
    MsTimer2::stop();
    analogWrite(LED_PIN1, 0);
    analogWrite(LED_PIN2, 0);
  }

  buttonState = digitalRead(BUTTON_PIN);
  if (buttonState == LOW) { // ボタンが押されていたら、ピンの値はLOW
    Serial.print("アラーム停止");
    //LED停止
    MsTimer2::stop();
    analogWrite(LED_PIN1, 0);
    analogWrite(LED_PIN2, 0);
  }

  //デバッグ用(現在の時刻を表示)
  printDateTime();

  //ストップボタンの効きが甘いと思ったら短くする
  delay(1000);
}

// LEDを点滅させる
void flashLED()
{
  static boolean output = true;
  output = !output;
  if (output){
    analogWrite(LED_PIN1, 5);
    analogWrite(LED_PIN2, 0);
  } else {
    analogWrite(LED_PIN1, 0);
    analogWrite(LED_PIN2, 5);
  }
}

// 時刻表示(デバッグ用)
void printDateTime()
{
  tmElements_t tm;
  RTC.read(tm);
  Serial.print(tm.Year + 1970, DEC); //年は1970年からの年数で記録されるので1970を足して表示
  Serial.print("/");
  Serial.print(tm.Month, DEC);//月を表示
  Serial.print("/");
  Serial.print(tm.Day, DEC);//日を表示
  Serial.print(" ");
  Serial.print(tm.Hour, DEC);//時を表示
  Serial.print(":");
  Serial.print(tm.Minute, DEC);//分を表示
  Serial.print(":");
  Serial.println(tm.Second, DEC);//秒を表示して改行
}

// コンパイルしたPCの時刻を返す
// https://github.com/JChristensen/DS3232RTC/blob/master/examples/alarm_ex1/alarm_ex1.ino
time_t compileTime()
{
  const time_t FUDGE(10); //fudge factor to allow for upload time, etc. (seconds, YMMV)
  const char *compDate = __DATE__, *compTime = __TIME__, *months = "JanFebMarAprMayJunJulAugSepOctNovDec";
  char compMon[3], *m;

  strncpy(compMon, compDate, 3);
  compMon[3] = '\0';
  m = strstr(months, compMon);

  tmElements_t tm;
  tm.Month = ((m - months) / 3 + 1);
  tm.Day = atoi(compDate + 4);
  tm.Year = atoi(compDate + 7) - 1970;
  tm.Hour = atoi(compTime);
  tm.Minute = atoi(compTime + 3);
  tm.Second = atoi(compTime + 6);

  time_t t = makeTime(tm);
  return t + FUDGE; //add fudge factor to allow for compile time
}

最後に

薬が1種類×1日1回なので これでちょうど良いのですが、増えてきたら 結局昔からある↓が一番一番有効なのかもしれません。シンプル、一覧性、保存場所など悔しいけどかなりわかりやすいです。ただ、もう少しシュッとした見た目のがあればいいのになぁ。

薬飲まないのが一番ですが、飲むことになったら思い出してもらえればと思います。あとは、作ってご両親にプレゼントとかでも楽しいかも。

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

ナカバヤシ お薬カレンダー 1週間分 壁掛タイプ グレー IF-3010GY【送料無料】
価格:1180円(税込、送料無料) (2019/8/16時点)

 

古い筆まめの住所録データを無料で変換する方法(fwa→csv) 2018~19年用

$
0
0

もうすぐ年末。

年末といえば年賀状印刷… と言う事でそろそろ準備をしだす方も多いのではないかと思います。裏側は写真やらなんやら色々頑張るとして、宛名に関してはパソコンで印刷したほうがミスも無く楽ですよね。

で、年賀状ソフトの登場ですが、今年 Windows10やMacに変え、新しいPCに入ってた宛名書きソフトは「筆まめ形式も読み込めます」とか書いてあるけど、よくよく見ると対応外。住所録のファイルだけはしっかり保存済みだけど、もちろん古いPCは捨ててる。そんな方への内容です。

こんな方向け

  • 筆まめ ver 20以前を使っていた(Windows7以上では動かない)。→筆まめWindows対応表
  • 他社 宛名書きソフトの「筆まめ形式も読めます」にだまされた。
  • 宛名印刷だけなので、新しい筆まめを買う気は無い。
  • 住所録ファイル(fwa)は残してある。
  • 住所録ファイルは何とかして使いたい。
  • 古いPCはもう無い。

ちょっとその前に

古いPCが動き、筆まめが動くのであれば、筆まめ起動→下の方法でcsvに変換可能です。

変換方法

結論から言えば、最新の体験版をダウンロードし、csvにコンバートするだけです。コンバート機能は体験版でも問題なく動きます。

  1. 筆まめ ver30の体験版(2019年末最新バージョン)をダウンロード→インストール
    https://fudemame.net/products/hagaki/fudemame/free/

    おすすめツールはチェックを外させてもらう

    おすすめツールのチェックは外した方が良いかと思います。

  2. 以前作った住所録ファイル(fwaファイル)を開く
    2015-11-27_16h43_39
  3. ファイル→他の住所録形式で保存

    画面はver.22ですが29でも全く同じ

  4. csv形式を選択
  5. 基本「次へ」を押し、最後に「すべてのカード」を選択し開始
  6. おしまい
    あとは表計算ソフトなどで開いて、お好みの形式に並び替え、新しいソフトで開きます。新しいソフトでは微妙に並びが違ったり(姓名を別けないとダメとか)します。体験版を十分に体験した方は、アプリケーションの追加と削除から削除します。

最後に(格安のダウンロード版)

あーでも表計算ソフトやらなんやら色々めんどくさいって方は、最新版を下記からポチッと。¥2,000を切る価格(安いselect版は年末~年始のみの販売) で面倒な手間が省ける(古いデータがそのまま開けます)のであれば悪くない選択だと思います。

Amazon/楽天では楽天のダウンロード版の方がセールしている事が多いです。ダウンロード版なら今すぐ使えて、メディアも無くならない。時間を金で買う。それもまた良い方法だと思います!

楽天

アマゾン

筆まめVer.29 オールシーズン (最新)|win対応|ダウンロード版 筆まめVer.29 オールシーズン (最新)|win対応|ダウンロード版 筆まめ Ver29 アップグレード・乗り換え版 筆まめ Ver29 アップグレード・乗り換え版

オランダのドーナツ オリーボーレンの作り方

$
0
0

外はカリカリで中はモチモチ。オランダのドーナツ オリボーレンのレシピです。

オリーボーレン ?

オリーボーレン(オリボーレン・オリボルン・oliebollen)はオランダでは大晦日や年末に食べる昔からのドーナッツ。今の穴開きドーナッツの起源となったと言われています。私自身は残念ながらオランダで食べたことは無いのですが、ショッピングセンター系に入っているジャック イン ザ ドーナッツで食べ、見た目からは想像してなかった、外のカリカリと中のモチモチ感に驚きました。

ネットで調べてみると「年末 オランダ屋台で食べる”作りたて”はすごく美味しい!」との事だったので、作ってみることにしました。

オリーボーレンを割った写真

写真では伝わりにくいのですが、外はカリカリ、中はしっとりモチモチしてます

材料

出来上がり量:子供のげんこつ位の大きさ 12個くらい

  • 小麦粉 250g
  • バター 40g
  • 砂糖 30g
  • 塩 少々(2つまみ程度)
  • 温めた牛乳 150ml
  • ドライイースト 14g
  • 卵 2個
  • 揚げ油(植物性)
  • ドライフルーツ(レーズン、ラムレーズン、スグリなど。プレーン味の場合は入れない) 100g程度
  • 無農薬のレモンや オレンジの皮のスライス 細長く切る 大さじ1強(あれば。プレーン味の場合は入れない。今回は無かったので入れていません)
  • 粉砂糖(最後のふりかける用)

その他

  • 大きめの金属製スプーン×2
  • 大きめのボール
  • 揚げるための容器

今回はこんな感じで。高い方の小麦粉(バイオレット)を使ってみました。

作り方

  1. ラムレーズンを作る(作っておく)
  2. 牛乳をあたためて、ドライイースト入れる
  3. 小麦粉、砂糖を混ぜる
  4. 小麦粉に穴を作って、2の牛乳をかき混ぜる
  5. 小麦粉に溶かしバター、卵、塩を入れる
  6. 1のレーズンを入れかき混ぜる
  7. ラップをし、1時間程度 発酵させる
  8. 発酵後、一度軽くかき混ぜ、さらに10分発酵させる
  9. 低めの温度(170~190℃)の油で揚げる
  10. 粉砂糖をふりかける

ラムレーズンを作る(作っておく)

前夜からドライフルーツをラム酒に浸しておきます。今回は直ぐに作りたかったので、レーズンがひたひたになるくらいのラム酒を入れラップをし、電子レンジ 600Wで1分間温め、その後 適当に冷やしました。

ラムレーズンではなく普通のレーズンを使う場合は、この工程は抜かします。

ラム酒を入れ、電子レンジ600Wで1分

適当に冷まします

牛乳をあたため、ドライイーストを入れる

電子レンジで牛乳を温め、人肌より少し暖かいくらいの温度に冷まし(50℃以上の場合 イーストが死滅する事があります)、ドライイーストを入れ、かき混ぜ溶かします。

牛乳は温めすぎないように。50℃以下くらいになったらドライイーストを入れます。

小麦粉、砂糖を混ぜる

小麦粉(250g)と砂糖(30g)を合わせ、ぐるぐるかき混ぜます。

小麦粉に穴を作って、牛乳をかき混ぜる

上記の小麦粉+砂糖の真ん中に穴を作って、上記の温めた牛乳+ドライイースト液を入れ、混ぜ合わせます。

穴を作って入れる意味は… こうすると混ざりやすいのですかね。パン等とは違い、少し水分が多いので手で混ぜるのはベタベタになって厳しいです。ヘラ等で混ぜて下さい。

※今回は間違って牛乳・ドライイースト・卵・バター・塩を全部混ぜてから小麦に入れました(これでもできましたが、本来は別けるようです)

小麦粉に穴を作って牛乳液を入れる。写真では液が黄色いですが気にしないでください(卵入れる順番を間違えた)。

ベタつくのでヘラ等で混ぜましょう

溶かしバター・卵・塩を入れる

続いて、バターを電子レンジで軽く溶かし 粉に混ぜ、その後 卵(溶いてから)と塩を 粉に入れ、良くかき混ぜます。

溶かしバター、卵(溶いたもの)、塩を入れます(写真では容器に入れていますが、実際には粉側に入れます)

レーズンを入れかき混ぜる

水気を適当に切ったドライフルーツを入れ、混ぜ合わせます(オレンジ・レモンの皮はこの段階では入れません)。生地はトロトロですが、問題ありません。

ラップをし、1時間程度 発酵させる

ラップをして、2倍程度にふくらむまで発酵させます。

冬場に作ったので 外だと少し寒いため、こたつに入れました。電子レンジの発酵機能などを使っても良いかと思います。

外は寒いのでこたつに入れました

発酵後、一度軽くかき混ぜ、10分発酵させる

約1時間後、2倍程度に膨らんでいることを確認し、ラップを外し 軽くかき混ぜ空気を抜きます。空気が抜けてぺしゃんこになりますが、気にしないで下さい。再びラップをして10分程度発酵させます。

オレンジ・レモンの皮を入れる場合は、”軽くかき混ぜの段階”で入れます。

1時間後 2倍に膨らんだ生地

一度軽く混ぜ、空気を抜いてしまいます。柑橘皮はこの段階で入れます。

再び10分程度 発酵させたあとの様子。初回発酵後よりは少しカサが減っています。

低めの温度(170~190℃)の油で揚げる

この温度がなんとも微妙に難しいのですが、ちょっと大きめの物を作るので、温度が高いと外が真っ黒だけど中は生焼け、低すぎると表面がべしゃっとしたものになってしまいます。まぁ少々生焼けでもお腹は壊さないので、適当に。

油を火にかける前に、大きめのスプーンを油につけ、スプーンに生地がひっつきにくくしておきます。

生地がスプーンに付かないように、軽く油に入れます

一つのスプーンで生地をすくい、垂れた生地をもう一つのスプーンですくい上げ、スプーンの上で生地を山盛りにします。

2つのスプーンを使って、”良い感じ” に生地を盛って下さい

油が適温になったら、2つのスプーンを使いながら、生地を油に落とします。

アイスクリームディッシャーを使っても良いらしいです(持っていない)

表面がきつね色になるまで何度かひっくり返し、中まで火を通し、引き上げ、キッチンペーパー等で油を切ります。

オリーボーレンを揚げる

なんだか美味しそうな感じになってきました

“フルーツの近くが生焼け” の様子。油の温度がなかなか難しいです。

粉砂糖をふりかける

出来上がったものが 少しだけ温度が下がったら、裏表に粉砂糖をふりかけます。大量にふるとそれっぽい感じになるかと思います。

出来上がり

中身のモチモチ感とジューシー(と言うと言い過ぎだけど)感は写真では伝わりにくいのですが、こんな感じで外はカリカリ、中はもっちり。温かいうちにお召し上がり下さい。苦いコーヒーとも良く合います。

ちなみに冷えてしまったら電子レンジで45秒程度チンして下さい(温めてから粉砂糖を振ります)。

外はカリカリ、中はしっとり モチモチ

最後に

揚げたてのコロッケや揚げパンが、冷えたり、チンしたものとは別物のように、揚げたて美味しさと言うのは格別です。日本では揚げたてのオリーボーレンを食べられる場所は少ないと思いますので、是非お家で作ってみて下さい。

寒い外で食べるオランダの屋台の温かいものも、いつか食べてみたいですね。

オリーボーレンの完成

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

旅するパティシエの世界のおやつ [ 鈴木文 ]
価格:2035円(税込、送料無料) (2019/11/27時点)

Chia Networkをdocker(Linux/CLI)を使ってマイニングする方法

$
0
0

HDDやSSDで始めるマイング。Chia NetworkをLinux (docker/docker-compose)で使ってみた記録。CLIを使った操作の記事があまり無かったので、すぐに風化しそうですがメモ書きで残しておきます(バージョンはv1.1.2)。

GUI環境がやや不安定&バックグラウンドでどうなっているか分からないのが嫌、CLIだけのクラウド環境等で掘りたい方への情報です。どう考えても間違ってること書いてたらコメント欄で突っ込んでもらえると嬉しいです。

Chiaのdocker環境でのインストール方法

最新の情報

このブログの情報はすぐに風化しそうなので、一次情報とユーザコミュニティの場所を書いておきます。困ったらこちらをご覧ください。

公式ページ

最新の情報はこちらで。英語が苦手でもgoogle翻訳かけたらある程度は把握できるかと。

その他

よく分からないエラーが出る、みんなの設定を見てみたいなどはこちら。

とりあえず起動

とりあえず起動してコンテナの中に入る。コンテナを起動するとfarmer, harvester, full node, walletのサービスが自動起動しています。

// dockerホスト側でディレクトリ作成
mkdir -p ./chia/homedir
mkdir -p ./chia/plots

// コンテナ起動
docker run --name chia -v ./chia/homedir:/root -v ./chia/plots:/plots -d ghcr.io/chia-network/chia:latest 

// アレコレするのは一旦中に入ってしまったのほうが楽なので
docker exec -it chia /bin/bash

既存の鍵の削除

コンテナを起動するといきなりキーが作られるが、作成時に表示されるmnemonic(24個の単語)が分からないので、一旦鍵は削除して作り直します。

venv/bin/chia keys delete_all

鍵の作成

既存の鍵を持っていない場合は新規作成し、fingerprintの番号とmnemonicの単語をコピペして残しておきます。持っている場合は下部の”鍵の追加”をします。

venv/bin/chia keys generate

例)
root@chia:/chia-blockchain# venv/bin/chia keys generate
Generating private key
Added private key with public key fingerprint 00000000000 and mnemonic
apple orange .... ここに24個の単語が出てくるのでコピペしておく(mnemonic)

鍵の追加

既に他の場所で作っていれば下記のコマンドを入力し、mnemonicを入力します。

venv/bin/chia keys add

鍵の確認

鍵が1個であることを確認。複数ある場合は下部の削除で消します。

venv/bin/chia keys show

walletの確認

自分の財布の確認(後述のnodeにつながっていないと結果が出なかった気もする)。初回はキーボード入力が発生するので、コンテナにexec /bin/bashで接続してから実行するか、コンテナ外から直接実行する場合は -it等でttyを開かないとだめ。

venv/bin/chia wallet show

例)
root@chia:/chia-blockchain# venv/bin/chia wallet show
No online backup file found,
 Press S to skip restore from backup
 Press F to use your own backup file: S
Wallet height: 0
Balances, fingerprint: 000000000
Wallet ID 1 type STANDARD_WALLET
   -Confirmed: 0 mojo (0.0 xch)
   -Unconfirmed: 0 mojo (0.0 xch)
   -Spendable: 0 mojo (0.0 xch)
   -Pending change: 0 mojo (0.0 xch)

ファーム(畑)の確認

Farming statusがいつまで経ってもSyncingから変わらない場合は下部の”同期されない”を参照してください。

venv/bin/chia farm summary

例)
root@chia:/chia-blockchain# venv/bin/chia farm summary
Farming status: Farming
Total chia farmed: 0.0
User transaction fees: 0.0
Block rewards: 0.0
Last height farmed: 0
Plot count: 3
Total size of plots: 304.001 GiB
Estimated network space: 779.706 PiB
Expected time to win: 1 year and 3 months
Note: log into your key using 'chia wallet show' to see rewards for each key

nodeの確認

Current Blockchain StatusがFull Node Syncedになるまで若干の時間がかかる場合があります。いつまで経ってもFull Node Syncedにならない場合は、下部の”同期されない”を参照してください。

venv/bin/chia show -s -c

例)
root@chia:/chia-blockchain# venv/bin/chia show -s -c
Current Blockchain Status: Full Node Synced

色々出てくる

コンテナの停止&再起動

一度コンテナを停止して再度起動して正常に動くかを試してみます。-e keys=””を付けないと新たな鍵が自動的に作られてややこしいことになるのでつけます。

docker stop
docker rm chia

docker run --name chia -v ./chia/homedir:/root -v ./chia/plots:/plots -e keys="" -d ghcr.io/chia-network/chia:latest 

docker exec -it chia /bin/bash

venv/bin/chia keys show
//身に覚えの無いキーがあったら、起動時にキーが作られてるので設定間違ってる。

キーの削除

身に覚えの無いキーがあったら削除します。起動時にキーが作られてるので設定間違ってるかも。

venv/bin/chia keys delete -f {fingerprintid}

//1つだけキーが出てくることを確認
venv/bin/chia keys show

plots(耕地)の作成

バックグラウンドで実行するためにnohup ~ & を付けて実行しました。

後述の方法でfarmerをstopさせて、plotsの作成のみをさせるコンテナとかも作ることができるぽい。他の場所でplotsだけを作る場合も鍵の情報は合わせて作る必要があります。-kはv.1.1.2ではデフォルト32。

コンテナ内で
mkdir -p /plots/plots
mkdir -p /plots/tmp
mkdir -p /plots/logs

-d 出来上がりのディレクトリ(HDDで良い)
-t テンポラリのディレクトリ(SSDが推奨されていたが今回はHDD)
nohup venv/bin/chia plots create -d /plots/plots -t /plots/tmp >> /plots/logs/plots_`date "+%Y%m%d_%H%M"`.log 2>&1 &

-n キュー追加個数(キューに何個入れるか/plotsを連続何個作るか(一つ終わったら次を作る))
nohup venv/bin/chia plots create -n 2 -d /plots/plots -t /plots/tmp >> /plots/logs/plots_`date "+%Y%m%d_%H%M"`.log 2>&1 &

-r CPUスレッド数(作成にCPUを何スレッド使うか。公式では2が推奨されていたが、CPUが暇なら増やすとフェーズ1(Forward Propagation?)で早くなるらしい。もちろん-nと組み合わせても使える)
nohup venv/bin/chia plots create -r 2 -d /plots/plots -t /plots/tmp >> /plots/logs/plots_`date "+%Y%m%d_%H%M"`.log 2>&1 &

並列で何個も作る(CPUも余裕があり、SSD等を使用して並列で何個も作りたい場合は同時にバックグラウンドで複数起動させる。下記の場合2並列で10個づつ作る。)
nohup venv/bin/chia plots create -n 10 -d /plots/plots -t /plots/tmp >> /plots/logs/plots_`date "+%Y%m%d_%H%M"`_1.log 2>&1 &
nohup venv/bin/chia plots create -n 10 -d /plots/plots -t /plots/tmp >> /plots/logs/plots_`date "+%Y%m%d_%H%M"`_2.log 2>&1 &

docker-compose化

基本の形

version: '3.6'

# chia
  chia.local:
    hostname: chia
    image: ghcr.io/chia-network/chia:latest
    volumes:
      - "./chia:/root"
      - "/etc/localtime:/etc/localtime:ro"
    environment:
       keys: ""
    restart: always
    logging:
      driver: syslog

今回は共用サーバ内で動かしており、あんまりCPU使ってもらうと困るので、CPUにリミットをかけました(deploy ~ limits)。

また、バカでかいplotsは速度は遅いけど既存環境に影響出るのが嫌なので、dockerホストでnfsマウントした別HDDにしました(exportの部分)。スピードは思った通り遅くて 14, 5時間/1plotsかかっています。そもそもdockerのボリュームマウントってそんなに早くないので、スピードを重視する場合は向いてない気もします。

version: '3.6'

# chia
  cia.local:
    hostname: chia
    image: ghcr.io/chia-network/chia:latest
    volumes:
      - "./chia:/root"
      - "/export/plots:/plots"
      - "/etc/localtime:/etc/localtime:ro"
    environment:
       keys: ""
    restart: always
    deploy:
      resources:
        limits:
          cpus: '2'
    logging:
      driver: syslog

起動

docker-compose up -d chia.local

ファームやnodeのステータスが同期されない場合

Windows版は知りませんが、Farming status: Syncingでずっと止まっている場合(30~1時間位)は、ルーターでこのコンテナIPのポート 8444へ穴を開けたほうが良さそうです(ポートフォワード)。IPv6環境だと色々めんどくさそう。

あとdockerホスト側の時刻もntp等でちゃんと合わせます。コンテナ内をJSTにする必要は無くUTCでも大丈夫です。

ポートフォワード: 8444

https://github.com/Chia-Network/chia-blockchain/wiki/FAQ#why-does-my-node-have-no-connections-how-can-i-get-more-connections

当初はずっとこの状態で止まっていました。

Farming status: Syncing
Total chia farmed: 0.0
User transaction fees: 0.0
Block rewards: 0.0
Last height farmed: 0
Plot count: 1
Total size of plots: 101.304 GiB
Estimated network space: 250.611 PiB
Expected time to win: 1 year and 4 months
Note: log into your key using 'chia wallet show' to see rewards for each key

ポート開放後2日ほど放置したら60近くFULL_NODEで接続されていました。

root@chia:/chia-blockchain# venv/bin/chia show -s -c | grep FULL_NODE | wc -l
58

その他

plotsファイルのチェック

plotsが有効なものかどうか、ちゃんと-k 32で作られているが見られます。他の場所で作ったplotsを使うときなどはやってみても良いかもしれません。無効と判断されるものは-n(デフォルトは-n 30)を上げて再度チェックするようですが、詳しくはわかりません。

venv/bin/chia plots check

例)
2021-04-29T15:43:57.211  chia.plotting.check_plots        : INFO     Loading plots in config.yaml using plot_tools loading code
2021-04-29T15:44:01.549  chia.plotting.plot_tools         : INFO     Searching directories ['/plots', '/chia-blockchain', '/plots/plots']
...
2021-04-29T15:44:03.441 chia.plotting.check_plots : INFO Testing plot /plots/plots/plot-xxxxxxxxxxxxxxxx.plot k=32 (k=32で作られてる)
...
2021-04-29T15:47:10.092  chia.plotting.check_plots        : INFO        Proofs 42 / 30, 1.4  (1.4の部分が極端に低い場合は-n 100等でチェックするぽい?。詳しくは不明)
....
2021-04-29T15:50:54.192  chia.plotting.check_plots        : INFO     Summary
2021-04-29T15:50:54.192  chia.plotting.check_plots        : INFO     Found 8 valid plots, total size 0.79177 TiB  (有効なplotsの数)
2021-04-29T15:50:54.192  chia.plotting.check_plots        : INFO     8 plots of size 32

plotsファイルを認識させる

新しく作られた耕地をちゃんと認識してくれるか? plots create -dで指定したディレクトリにxxxx.plotを入れたら、harvesterが定期的に見ててくれるらしいです。しばらくしたら、Plot countがちゃんと増えていました。鍵が同じ別の環境で作ったplotsもちゃんと認識してくれました。

plotsファイルが入っているディレクトリは、.chia/mainnet/config/config.yaml のplot_directories:に書かれています。chia plots create -d したときの情報が自動的に書かれているぽいです。

plots作成の中断

plots createのプロセスをkillします。途中で中断したtempのplostsは再利用できないので、create時のログを見てちゃんとplotsが完成してからkillしたほうが無駄が無いかと思います。

root@chia:/chia-blockchain# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Apr26 ? 00:00:03 bash ./entrypoint.sh
root 234 1 0 Apr26 ? 00:01:19 chia_daemon
...
root 897 451 1 Apr26 ? 00:47:03 chia_full_node
root 1139 0 87 Apr26 ? 16:55:13 /chia-blockchain/venv/bin/python3.8 venv/bin/chia plots create -n 75 -d /plots/plots -t /plots/tmp ←これがplots createなのでpidをメモする
...
root@chia:/chia-blockchain# kill -9 1139    //plots createしてる pidをkillする

プロセスの再起動、停止

farmer, harvester, full node, wallet のセットで再起動

venv/bin/chia start -r farmer

full nodeだけ再起動

venv/bin/chia start -r node

停止は stop。plots作成のみさせるコンテナを作りたい時は多分farmerを止めてしまう(未検証)。

ホームディレクトリをホスト側にマウント

volumes:"./chia:/root"の部分。公式マニュアルにはホスト側にマウントしましょうとは書いてありません。

ただ、

  • .chia/mainnet/db/や、.chia/mainnet/wallet/db/とかでsqliteファイルが頻繁に読み書きされてる感じ。コンテナ再作成のたびにコレが消えるのは何だかあれな感じがした。
  • コンテナ再作成のたびにadd keyするのが面倒だった。説明書にある -e keys=”/path/in/container” の使い方が分からない。
  • plotsの位置が .chia/mainnet/config/config.yamlに書かれている。

のでマウントしてコンテナを破棄しても残るようにしました。Chiaのバージョンアップ等で不具合などが起こったら、ホスト側の.chiaは消してしまえば良いかなと思っています。

監視とグラフ

v.1.1.2の場合まだWebインタフェース等は無い。いちいちCLIで情報を見に行くのが面倒&監視とグラフが好きなので、plotの個数、nodeの数、walletの状態をzabbixに投げてグラフにしました。plotとwalletに関してはzabbixの機能で数値が変わったら(= plotが完成した、walletに入った)slackに通知するようにしてあります。

dockerホストで下記のスクリプトを定期実行

#!/bin/bash
cd /home/homedir
PLOT=`docker-compose exec -T chia.local venv/bin/chia farm summary | grep "Plot count" | awk {'print $3'}`
WALLET=`docker-compose exec -T chia.local venv/bin/chia wallet show | grep Confirmed | awk {'print $2'}`
NODE=`docker-compose exec -T chia.local venv/bin/chia show -s -c | grep FULL_NODE | wc -l`
echo "WALLET:"${WALLET} "NODE:"${NODE} "PLOT:"${PLOT}

plotsとwalletに関しては変更があったらZabbixの機能でSlackに通知している

よく分からない

  • Full-nodeの数。ポート8444を開けると外部からも結構つなげられ、それなりに転送量も食ってるぽい。支えてるnodeの数が自分にとっても有利に働けば嬉しいけど、そうで無いのなら ある程度 数を制限したいけどよくわからない。

儲かりそうか?

見るたびにExpected time to winが凄い数で増えてて、この速度でplotを作っていては、どう考えても厳しそうです。ただ、GPUを使うタイプとは違い機材費は要らないので手軽に始められるのは何だか楽しいです。

アナログ電話のナンバーディスプレイを安価にIT化する話

$
0
0

アナログ電話の電話番号通知を安価にシステム化しSlack通知する話。結論から言うとちょっと古いYAMAHAルータ(中古)を使用します。

やりたいこと

事業用の電話があるのですが、営業の電話も多く 基本電話は嫌いなので携帯転送にはしていません。今まではAUの番号通知サービス(かかってきた電話番号がSMSで通知されるサービス。KDDI電話 auで着信確認)を使っていたのですが、需要が少ないのか、残念ながら2021/11にサービス終了してしまいました。

やりたいこと

やりたいことは下記の2つ。

  1. 事務所外に居ても誰から着信があったかを知りたい
  2. 着信があった顧客をいい感じに管理したい

こんな感じの事がしたい。

着信電話番号知る(ナンバーディスプレイ)

IP電話(050)や携帯電話の場合 着信番号は はじめから通知されますし、IP電話の場合はIT化するサービスも色々あるのですが、固定電話番号をいろんな人に配ってしまっているので、できるだけこの番号を使いたいです。固定電話で番号を知るのはナンバーディスプレイ(はNTTのサービス名だけど、どの電話会社も同じ機能の有料オプションがある)。ここに通知される番号をなんとかしてシステム化できないか…というのが今回の話です。

ちなみにNTTひかり電話だと、設置さられた電話ルーター(ホームゲートウェイ)にログインできるので、そのまま良い感じにIT化できる(この情報は検索してよく出てきます)らしいのですが、住んでいる場所ではNTT光は提供範囲外で、現在使用しているケーブルテレビのIP電話ルーターは、ルータ中に入れません。

電話番号を いい感じにシステム化する方法

専用の機械(ナンバーディスプレイアダプタ)を接続

ひかり電話ルータの次に検索で良く出てくる方法がこれです。専用の機器をPCに接続し良い感じにします。今回はSlackに通知したかった&専用のPCをずっと起動しているのもイマイチなので、

電話線→アダプタ→(RS-232C)→ESP32(Arduino/Wifi)→サーバ

を作ろうと購入したのですが、この機械(アロハPC1)でナンバーディスプレイを受け取ると、電話側のナンバーディスプレイが動きませんでした(説明書に書いてあった…)。新しいUSB版は可能らしいのですが、USB版だとArduinoへのつなぎ方がややこしそう&値段が高い。電話側で非通知着信拒否したり、事務所に居るときに電話機側に名前が出ないのは不便なので、これでは使えません。

ナンバーディスプレーアダプタ「アロハND6」

ナンバーディスプレーアダプタ「アロハND6」

19,500円(01/20 11:41時点)
Amazonの情報を掲載しています

張り切ってESP32とシリアル変換買ったのに使えなかったの図

電話機のナンバーディスプレイをWebカメラで画像認識→数値化

次に考えたのが電話機に表示される番号をWebカメラで画像認識して良い感じにする方法です。

これ系の学習的にも面白そうだったのですが、夜だったり昼だったりも認識させようとするとやや時間がかかりそうだったので、一旦保留にしました。

上記を作るにあたり、コロナの関係でラズパイが手に入らないので色々検索していたところ、自分も使用しているATOM Cam2のカスタムファームウェアを作っている方がいらっしゃって興味深かったです。また、近くのものをWebカメラで写す時はカメラに老眼鏡をかけると言う知見もどこかで使ってみたいです。

IP電話をアナログ電話機で受ける機械(海外製)

GrandStram社製の一部の機種はNTTナンバーディスプレイにも対応しており、アナログ回線も入れる事ができる(FXO)らしいのですが、レビューをみると結構不安定&現在出てるファームウェアではナンバーディスプレイが実質使えない(ナンバーディスプレイを使用すると着信できない)的な書き込みを見ました。上記の専用機器で痛い目にあっているせいもあり、できれば購入後ハマりたくないのでやめました。不具合が修正されたらこれを使うのはありな気はします。

YAMAHAのアナログ回線を収容できるルーター

今回のような使用方法で実際に動かしている情報は検索上では見当たらなかったのですが、ナンバーディスプレイに対応しており、着信番号がSYSLOGに出るような事が説明書に書いてあります。安心・安定のYAMAHA。今回はこれの話になります。

アナログ回線を収容できるYAMAHAルーター

最新ルーターでは除かれているのですが、ちょっと前の機種までISDN・アナログ電話・インターネット回線がいい感じに入れられます。その中でもISDN回線をアナログ入力に変更にできる機種がいくつか出ていました。

今回の設定ができる機種:RT57i、RT58i、NVR500

定価は結構高い(上記中一番新しいNVR500の場合 \55,000。現在も購入可)のですが、メルカリとかでいい感じに安く(\2~5,000程度)なっているので、これを購入しました。

ヤマハ ブロードバンド VoIP ルーター NetVolante NVR500

ヤマハ ブロードバンド VoIP ルーター NetVolante NVR500

57,800円(01/20 11:47時点)
Amazonの情報を掲載しています
YAMAHA NVR500

中古では安くなってて素敵なYAMAHA NVR500

接続

こんな感じに接続します。

ルーターとしては使用しないのでWANは使わない

設定

ナンバーディスプレイにチェックを入れ外部から着信すると、SYSLOGに下記のような感じで出ます。電話機の方も問題なく電話番号が出ました(※後述のデメリットあり)。

> show log
2022/01/07 18:48:53: TEL[**/*] InComing Call from 090XXXXXXXX

SYSLOGからシステムにつなげる(Luaスクリプト)

他所にsyslogサーバ(syslogd)を起動してルータのsyslogを転送し、そちら側で良い感じにする方法もあるのですが、YAMAHAルータはルータ内でLua言語のスクリプトを動かすことができます。新しいファームウェアでは直接Slackへ通知する事も可能(HTTPS POST。NVR500は非対応)ですが、今回は間に電話番号→名前変換のシステムをはさみたいので、Syslog内の電話番号部分だけHTTPで外部へPOST(NVR500も対応)するLuaスクリプトを書きました。

telpost.lua

-- ルーターへの転送
-- copy usb1:/telpost.lua /telpost.lua
-- show status lua
-- terminate lua 1
-- lua /telpost.lua
-- schedule at 1 startup * lua /telpost.lua
-- save
-- スクリプトが落ちると終了するので注意

-- Setting
url = "http://example.com/post/"
ptn = string.regexp("TEL.* InComing Call from .*")

-- POST
function post_tel(url, postdata)
  local req_t = {
    url = url,
    method = "POST",
    content_type = "application/x-www-form-urlencoded",
    post_text = string.format("tel= %s\n", postdata)
  }
  local rsp_t = rt.httprequest(req_t)

  -- error
  if (rsp_t.code ~= 200) then
    rt.syslog("info", "[Lua] failed to send TEL data.")
  end
end

-- MAIN
local rtn, str
while (true) do
  rtn, str = rt.syslogwatch(ptn, 1)
  if (rtn > 0) then
    post_tel(url, str[1])
  end
end

顧客管理システム(CRM)と連携

上記でPOST→Slack通知(外出先から番号を知る)まではすぐにできましたが、このままだと電話番号が出るだけです。やりたいことの2番目「着信があった顧客をいい感じに管理したい」を何とかするなら専用サービスを使うのが将来性もあるのかなと、無料プランでもWebAPIに対応しているZohoCRMを使用することにしてみましたが、APIが自分としてはあまりにも癖が強く、ちょっとした事が(慣れて無いせいもあり)非常にややこしかったので、挫折。結局自作しました。

自作した機能(着信→Slackに下記内容を通知)

  • 名前
  • 前回着信日
  • 着信メモを保存
  • 0120だったり050の場合は「怪しい」として表示
  • 上記の編集機能

POSTされた番号をSlackに通知するまでのプログラム例

<?php

if (isset($_POST['tel'])) {

    // 電話番号を取得
    if (isset($_POST['tel'])) {
        $telno = getTelno($_POST['tel']);
    }

    // DBから検索して名前に変換したり色々と
    // 

    // Slackに送る
    sendSlack($telno);
}


// 電話番号の取得
function getTelno($post_data)
{
    preg_match("/TEL.* InComing Call from (.*)/", $post_data, $matches);
    $tel = $matches[1];
    return $tel;
}


// Slackに送る
function sendSlack($telno)
{
    $url = "https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXX";

    $message = [
        'attachments' => [
            [
                'text' => '着信です',
                "mrkdwn_in" => ["fields", "text"],
                'fields' => [
                    [
                        'title' => 'TEL',
                        'value' => $telno,
                        'short' => True,
                    ],
                ],
            ]
        ]
    ];

    $ch = curl_init();
    $options = [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => http_build_query([
            'payload' => json_encode($message)
        ])
    ];
    curl_setopt_array($ch, $options);
    curl_exec($ch);
    curl_close($ch);
}

 

Slackへの通知画面

情報編集画面

2ヶ月ほど使用していますが、やりたかったことは大体できています。

今回のシステムのデメリット

今回のシステムにしてから、電話機が鳴るまで3・4コールさせないと駄目(おそらくルータと電話機の2つで番号表示機能を使っているので、電話機で呼び出し音がなるまでに時間がかかる)になってしまいました。

番号通知させつつ、早くさせる方法があれば知りたいです。

暇になったらやってみたい

  • このルーターはIP電話を収容できるらしく、SIPサーバ(FreePBX,Asterisk)をLAN内に立てて色々やると、アナログ電話をIP化したり、着信をあれこれ(留守電をネット経由であれこれとか、プッシュ番号によって分岐させてあれこれとか)したりと楽しいらしい。
    https://www.freepbx.org/
  • 0120、050の時は外部の電話番号口コミサービスから情報取得。
    https://www.jpnumber.com/

まとめ

電話系は知らない言葉だらけ。電話番号のICT化は専用システムも沢山あるのですが、結構高めです。小規模な感じで、安価にやるなら悪くないような気がします。

Netflixで日本語字幕のない動画を無料で日本語字幕を付けて視聴する方法

$
0
0

Netflixでややマイナーな国の動画は日本語字幕が付いていません。私の場合、日本未公開のインド映画が見たかったのですが英語字幕しかなく、私の英語力では1/3位しか意味が分かりません。下記の方法は少々意味が分からないところがあっても、無料でとりあえず自動的に日本語字幕へ変換された動画を見たい方への情報です。

インターネットで探しても有料(サブスク)だったり、英語字幕を毎回クリックして日本語に..と言う方法しか探せなかったので、記録として残しておきます。下記の例ではインド映画ですが、タイ映画、韓国ドラマ(日本語字幕が付いている場合が多いですが)等、他の言語でも同様の方法です。

完成図

これが、

自動的にこうなります(※ただし直訳)

前提条件

  • Netflixに入っている必要があります(有料)
  • PC&Google Chromeブラウザでしかこの方法は使えません(スマホやテレビのアプリ等では動作しません)
  • 機械翻訳(Google翻訳)の直訳になります。映画専門の翻訳者が作った翻訳とは違うため、”映画を見る”と言う体験としてはややイマイチです。
  • 翻訳エンジンはGoogle翻訳しか使えません。
  • 2023/5時点では動きますが、Netflixの仕様変更等で動かなくなる可能性があります。

自動日本語翻訳の設定方法

Dual Subtitles for Netflixと言うオープンソースの機能拡張 × ChromeのGoogle翻訳を使ってリアルタイム翻訳します。

Dual Subtitles for Netflix (GitHub)
https://github.com/DeeFrancois/netflix-dual-subs

1. Google ChromeにDual Subtitles for Netflix(機能拡張)を入れる

Google Chromeで下記URLを開き、Chromeに追加ボタンを押し、拡張機能をインストールします。
https://chrome.google.com/webstore/detail/dual-subtitles-for-netfli/ljnmedkgcgidbbjhbkdonempgcgdhjfl

2. 機能拡張の設定をします

設定なしでも使用できますが、そのままだとオリジナル字幕が結構目立ちます。オリジナル字幕の透明度を変えたり、色を変えたり、非表示にできます。

Chromeの右上の拡張機能ボタンを押し①、Dual Subtitlesをピン止め②し、出てきたSUBSアイコンを押します③。

設定は好みに合わせておこないます。元翻訳(英語)を表示させたくない場合は”Original Text Opacity”を0に設定します。

3. プロフィール設定で英語表記にする

英語表記にすることによって、日本語表記では出てこなかった多数の映画が検索で表示されます。英語表記にしないと「マイリスト」入れた非日本語字幕動画も出てこなくなります。

右上の自分のアイコンを押し、プロフィールの管理→言語→Englishにし、下部の「保存」を押し反映します。

英語に変えて、最後に一番下の保存を押す

4. 動画を視聴し、右クリック→日本語に翻訳を選ぶ

何もしないと、英語字幕が2つ並びます。右クリックして「日本語に翻訳」を選ぶと一方が日本語になります。これは動画を視聴するたびにおこなう必要があります。

※字幕が出た瞬間、一瞬だけ英語が出ますが仕様です。

他の方法

法的にやや怪しげなのかもと思い試してはいませんが、下記のような方法であれば、もう少しましな翻訳になりそうな気はします。うまく行ったらコメントで教えてください。

  1. Netflixの翻訳ファイル(英語)をダウンロードする機能拡張を入れて、英語字幕をダウンロード(SRT or DFXPファイル)
    https://www.google.com/search?q=netflix+subtitles+download
  2. 1の英語字幕をChatGPTやDeepL等で翻訳、もしくは翻訳ファイルダウンロードサイトで日本語字幕をダウンロード
    https://www.google.com/search?q=moivie+subtitles+download
  3. 2の翻訳ファイルで視聴する機能拡張で日本語字幕で視聴
    https://chrome.google.com/webstore/detail/subtitles-for-netflix/oddfihdjoneffhjjlpgdjaefeklefmdi?hl=ja

Netflix外で見たい動画を探す

Netflixの検索ページで探しても良いのですが、googleで「netflix indian movies 2023」等で検索すると、上部に専用のコンテンツが表示され、最近のものやジャンルを絞っての簡易検索ができます(恐らくは上記の方法で視聴も可能)。Netflixで探すよりも年度やジャンルでさくっと絞り込めます(ただ、全量出てこない)。

もっと現地の動画がみたい

上記ではプロフィールの言語を英語にして、日本語検索では出てこない動画を出しましたが、VPN(有料)を使い 出口を現地にすると、現在の契約のまま、より多くの現地映画を見られるようです。

https://www.google.com/search?q=netflix+vpn

最後に

でもまぁNetflix公式でもう少しましな機械翻訳を付けてくれたら、それでも良いのになぁと感じました。

Viewing all 72 articles
Browse latest View live