あゝお腹いっぱい、次なに食べよ

機械学習とかAWSとかiPadProとかGalaxynote8とか

Apple Pencile の電池残量が知りたい

お疲れ様ですししなみです。

Apple pencile いいですよね ししなみも毎日使っています

さて、このApple Pencile たまーに電池が切れていることありまして まぁ iPadに刺して 3分待ってやる って言うだけなんですが(実際は30秒で十分です)

これ残量がみれないのかなーって思ってたんですよね だってBluetoothヘッドフォンも残量が出てるんだから、

同じBluetoothで接続されている Apple pencileだって出せてもよくね? って思っていたら。ありました Apple Pencileの残量表示

なんと、ウィジットにありました。 Ios11 出たら別の方法になりそうですが、こんな手順で表示できたので 共有しておきます。

ウィジットを編集する

バッテリーを追加する

できた! QED!!

以上、拍子抜けするほど簡単でしたが よろしくお願いします。

Pythonista で作ったプログラムを簡単に実行できるようにする

お疲れ様です、ししなみです。

Pythonista、面白いですよね。

今回は、Pythonで組んだプログラムを 簡単に実行できるようにする手順です

pythonista 上から簡単に起動する方法

まずは Pythonista 上でワンタッチで起動できるようにする方法です

起動したいプログラムを開いてから

1、右上の🔧をクリック 2、Editをクリック 3、+ をクリック

4, Custom Title に 任意文字列を登録

すると、どの画面からでも この🔧マークをクリックすると 起動できるアイコンができあがります

ホーム画面に追加する

右上の🔧マークをクリックした時 気がついた人もいるかもしれませんが

ここにホーム画面へ追加するための ボタンがあります。

これ、Safariへの ブックマークレットになっていて 押すと

Safariを経由して

こんな感じで登録ができます。

クリックすると Safariを経由しているので

WEBから起動 の確認がでますが

起動をおせば

問題なく起動しました!やった!

iPhone 電池交換 バッテリー劣化とパフォーマンス劣化について

お疲れ様です、ししなみ です。

去年末、Appleが認めちゃった 古いiPhoneのパフォーマンスが劣化する件について

https://www.apple.com/jp/iphone-battery-and-performance/

電池交換が通常8800円のところ iPhone6以上なら 3200円で交換してくれるやつ

早速やってきました

ジーニアスバーに予約してAppleStore銀座へ

結論から書きますと

  1. iPhoneSE は即日 2時間でやってくれました
  2. iPhone6 Plus はバッテリーの在庫がありませんでした

さて、では当日の状況ですが

あ、行く前にiPhoneはバックアップとっておいてください。 あとiPhoneを探すを オフにしておくそうですよ。 ま、バックアップは自己責任でやらないで行ってもいいですけど 自分は、特になにも変わらず返却されました。

なお、予約していったんですが、並ばされました 並んでる時間もあわせて全部で30分くらいかかります。

これあれですね、ディズニーランドのファストパスなんですね あっちのほうが断然早いけど。

さて、自分の番になりまして、 お姉さんが電池の解析して お客様のバッテリーは合格範囲内ですけど、本当にかえるんですね? YES/NO みたいの聞いてきます

YES って答えても今度は

開けて水が入っていた場合は、本体全部取り替えになります、その場合 3200円以上かかります。 また、水が入っていてて、開けた途端水が中の基盤かかって壊れる可能性もあります それでもやるんですね? YES/NO

みたいなのも聞いてきます イラッとしながら

YESって答えると、

「じゃぁバッテリーの在庫みてきますー」

今から見るのかよ!先にいっとけよな!!!

さて iPhone6 Plus の方は、バッテリー在庫ないので 取り寄せ後、きたらメールしますね とのことでした。

6用はもう在庫ないんですね、 まあ次の年末までやっている予定なので 急いでやらなくても、年末くらいにやるのも手だと思います

以上、AppleStore銀座の状況報告でした 宜しくお願い致します。

はてぶpro独自ドメイン設定 on iPad pro

あけましておめでとうございます sysopjpです。

今日は独自ドメイン設定の話です。

はい、こちら どん

sysop.jp が取れました 過去履歴調べたけどキャッシュないし ずっと空いてたんですかね?

せっかくなので、はてぶに独自ドメイン設定します

いつもどおり、iPad pro 縛りで。

お名前ドットコムも当然iPadからやりましたが 面白いことも、詰まる所もないので省略。

さくっと、はてぶ proボタンを押します

さて、独自ドメイン設定は 詳細設定にあるこれですね

CNAMEで設定する場合は やっぱサブドメインなしはできない、のかな? もしできる人いたら教えてください とりあえず www で設定。

お名前ドットコムに戻りまして。

お名前ドットコムはログイン直後は ドメイン更新ページに飛ばされますが 落ちついて、ヘッダメニューのドメインをクリック > ネームサーバー 初期設定 を クリック

深すぎぃ!

https://www.onamae.com/domain/navi/dns_controll/input

このリンクで飛べないの? 飛べたわ。 面倒な人はリンク押してください。

お名前ドットコム以外の人は とりあえずDNS設定関連を探してください。

はい、遠かったですが、ここに CNAMEでVALUE には hatenablog.com. を設定、おっと、末尾の . 入れたら怒られました。 末尾は . なしで登録するようです。

VALUE hatenablog.com

でお願いします。

確認を押すとしばらく時間がかかるので、コーヒーか紅茶でもいれてきましょう この後30分とか平気でかかります

お名前ドットコムの、設定が終わったら 今度は、はてぶに戻りまして。

ドメイン設定をチェック!! 押下!!!

はい、まだこないですね。

ここで結構時間食います。 気長にアマゾンプライムでも見てるのがおすすめ。

というわけで、アニメ一本見終わったところで

有効になりましたね! ガルパンはいいぞ。

でも、表示上有効になったのに、まだ www.sysop.jp へ繋ぐと 元のsysop.hatenablog.com へ リダイレクトされます。

仕方ないので一晩寝たら解決していましたが

DNSからhatenablog.com へ行った後は はてな内の設定値の話だし、終わってから 表示を有効にしてほしいですね。

まあ、ここらへんで詰まるとは思っていなかったので 消化試合ですね。

本年から www.sysop.jp

を、よろしくお願いします。

LINEBOTonAWSLambda+Rekognitionで画像認識

お疲れ様です、ししなみです。

掲題のLINEから画像を送ると、AWSの画像認識サービス Rekognitionで なんの画像か判定して返却する、を実装します。

f:id:sysop:20170208201737p:plain

性能まだわかりませんが、和風なのか洋風なのか、だけでも欲しいところですね。

構成

f:id:sysop:20170207195858p:plain

必要資材

  • AWS アカウント
  • LINEアカウント
  • Python2.7( の pip )

S3に画像をUPする場所を用意

f:id:sysop:20170208194817p:plain

Rekognition が 東京リージョンだと使えないので S3のリージョンをオレゴンで作成します。

ソースをダウンロード

 $ mkdir linebot
 $ cd !*
 $ wget https://raw.githubusercontent.com/sishinami/LINEBOTonAWSandRekognition/master/lambda_function.py
 $ pip install requests -t .
 $ zip -r reko *

ししなみのGitHubに平文で書いたサンプルソースをUPしているので
ダウンロードして、requestと一緒にzipで固めておいてください。 後で LambdaにUPします。

ロールの作成

S3と Rekognitionを使うので、権限を付与したロールを作成しておきます

f:id:sysop:20170208195053p:plain

また、CloudWatchへのアクセスも許可しておかないと、Logが吐き出されないので、同じく追加します。

f:id:sysop:20170208195129p:plain

なお、FullAccessとか本来的には不要です、本番運用を想定するのであれば、権限はもっと絞ってください。

LambdaFunctionの作成

LINEからのコールバックを受け取るためにAPIGatewayとLambdaを連携させます。 よくわからん人は 初期画面の Blueprintから microservice-http を選択しましょう。勝手にAPIGatewayが設定されます。

f:id:sysop:20170208195513p:plain

セキュリティは OPENを選択します。
LINEのWebHook から API Keyを送る方法わかる人いたら教えてください。

ソースのUP

f:id:sysop:20170208195604p:plain name はロググループの名前になるのでわかりやすいものをつけてください。

Code entry type は 先ほど固めた zipファイルを 選択します。

環境変数に設定

f:id:sysop:20170208195925p:plain

S3_BUCKET に先ほど作った バケット名を設定してください。 ACCESS_TOKEN は LINE Developer から取得できる
Channel Access Token です f:id:sysop:20170208200023p:plain

ロール設定

ロールには、先ほど作ったロールを設定します

f:id:sysop:20170208200117p:plain

それ以外はデフォルトでいいので、Save > Create functionをします

LINE に設定

f:id:sysop:20170208201600p:plain 表示された URL を LINE の Webhook にそのままコピーすれば設定は完了です。

f:id:sysop:20170208201636p:plain

API Refarence

ソースについて

元になっているソースは Lmabda blue print から
Rekognition で検索するとでてくるソースです。
もともとあった、lambda_handler を
59: getRekognitaion
に修正 、LINEから取得したデータを S3にUPする
89 def getContent(id,output):
を追加しています。

さて、ここで注意点ですが /tmp/ 以下を利用しています。
Lambda では /tmp 以下が利用できるのですが
ファイル名が他の誰かの functionが作ったファイル名と被る事がありえます。(多分)
また、自分のLambda 内で同一名で /tmp/ 以下にファイルを作っているとたまに失敗します。(なんでですかね?)
本番運用時は、ここが 一つの発火点になるので注意しましょう。

また、/tmp以下はファイルを消していますが
S3はUPするだけして、消していないので、定期的に消すか、使い終わったら消す処理が本番運用時は必要です。

次に getRekognitionの responseは

{u'Labels': [{u'Confidence': 97.0301742553711, u'Name': u'Crest'}, {u'Confidence': 97.0301742553711, u'Name': u'Mountain'}, {u'Confidence': 97.0301742553711, u'Name': u'Mountain Range'}, {u'Confidence': 97.0301742553711, u'Name': u'Outdoors'}, {u'Confidence': 97.0301742553711, u'Name': u'Peak'}, {u'Confidence': 50.661468505859375, u'Name': u'Landscape'}, {u'Confidence': 50.661468505859375, u'Name': u'Nature'}, {u'Confidence': 50.661468505859375, u'Name': u'Scenery'}], 'ResponseMetadata': {'RetryAttempts': 0, 'HTTPStatusCode': 200, 'RequestId': '0bb6a7d4-edcc-11a6-1b78-3d6b98765b13', 'HTTPHeaders': {'date': 'Wed, 08 Feb 2017 00:00:00 GMT', 'x-amzn-requestid': '0bb6a7d4-edcc-11e6-8b78-4d6b0982oa7654’, 'content-length': ‘256’, 'content-type': 'application/x-amz-json-1.1', 'connection': 'keep-alive'}}}

こんな感じのデータです。

name がラベル、その後ろの数字は、確率ですね。
上の API Refalenceを見てもらうとわかりますが
ここで使っている detect_label 以外にも、 detect_face http://docs.aws.amazon.com/rekognition/latest/dg/API_DetectFaces.html とかありますので色々試して見てください。

以上、ししなみでした。 どうぞ、よろしくお願いいたします。

■LINE BOT on AWS

お疲れ様です、ししなみです 掲題の件についての解説になります。 本当は本当にiPad でやりたいところですが、pythonistaで python のソースをzipで固めてS3にUPする方法が現状わかっていないので、涙を飲んでmacでやります。

必要資材

  • AWSのアカウント

あるよね?

  • LINE のアカウント

まずPCからログインできるようにするためにはスマホが必要です、iPadだけではできません
スマホから事前にPCからログインできるようにして
LINE Developer > Messenger API からアカウントを作っておいてください。
https://developers.line.me の Messenger API のところにドキュメントがあるので(動画でもあります) みておくと吉。 なお ビジネスセンターのアカウントと Developerのアカウントが両方が必要です。

python と pipのインストール

$ brew install python
$ python --version
Python 2.7.10
$ which python
/usr/local/bin/python

デフォルトでは mac に pip が入っていないので、brew install python で pipを入れます。
which して /usr/local/bin になってれば成功

また、Lambdaは 2.7で動作するので、python2.7 であることを確認します。

pip がエラーを吐くので修正

http://sysop.hatenablog.com/entry/2017/02/05/231821

上記URLにある通り、pipコマンドが変なエラーを出してとまっちゃうので、.pydistutils.cfg を HOMEディレクトリに置きます。

$ touch ~/.pydistutils.cfg 
$ vi ~/.pydistutils.cfg 

[install]
prefix=

requests とソース の インストール

$ mkdir linebot
$ cd !*
$ wget https://raw.githubusercontent.com/sishinami/LINEBOTonAWSLambda/master/lambda_function.py
$ pip install requests -t .
$ zip -r linebot *

ししなみの GitHubから デフォルトソースを落としてください。 平文で書いているので、180秒ほどで中読んでください。

Lambda function の作成

f:id:sysop:20170207113443p:plain

microservice-http-endpoint-python
を選択(余談ですが、別にどれ選んでも最後はソース上書きするのでなんでもいいです)

f:id:sysop:20170207113539p:plain

APINameは任意で適当にどうぞ Secrity は LINE DeveloperからAPI KEYを入れる方法わかんないので Openで。 もし誰か、API Key入れる方法わかったら教えてください。

ソースのUP

namaは Cloudwatchlog で表示される名前になります。

Description は任意なので好き勝手つけましょう。

Code entry type を Upload a zip にして 先ほど作った zip を選択。

環境変数に ChannelAccessTokenの設定

環境変数に LINE の Channel Access Tokenが必要なので f:id:sysop:20170207162415p:plain

LINE Developer 画面から Channel Access Token をコピーして

Lambda Function のEnvironment variables に ACCESS_TOKENを設定してください。

f:id:sysop:20170207163514p:plain

他に、role 設定を求められますが、デフォルトで
lambda_basic_execution が存在しているはずなのでそれを使います。

それ以外はデフォルトでいいので Save > Create function

次の画面で表示される URLを今度は LINE Developer の WebHookに設定します

f:id:sysop:20170207163640p:plain f:id:sysop:20170207170253p:plain

以上、お疲れ様でした。

動かない時とかデバッグとか

CloudWatchLog に ログが出ますが、表示まで2分くらいかかります、のんびり待ちましょう。
あとストリームなので、AWSの機嫌次第で 複数まとめて出力されたり しなかったりします。

  • LINE Developer 画面で Verify しても 502 Bad Gateway が出る

ソースの 最後で response を print していますが、これを print(respose.text) に直してください
もし、Cloudwatch に表示されるエラーが invalid replay token なら 無視して実機確認しましょう、多分動いてます。

■pip install must supply either home or prefix/exec-prefix -- not both"

pip install must supply either home or prefix/exec-prefix – not both"

DistutilsOptionError: must supply either home or prefix/exec-prefix – not both

お疲れ様です、ししなみです。 Mac で pip install しようとしたら、件名のようなエラーが出た件、解決しましたので報告します。

結論から書くと

vi ~/.pydistutils.cfg

[install]
prefix=

http://stackoverflow.com/questions/24257803/distutilsoptionerror-must-supply-either-home-or-prefix-exec-prefix-not-both/24357384

上のURLにある通り、ファイル[~/.pydistutils.cfg]を作成し 中に prefix を 書くことで 2017年2月現在の MacOSX El Captitan では正常にpipができるようになりました。

もし、これでは動作しなかった場合、上のURLを見れば、他にも対処方法いろいろ書いてあるので、試してみてください。

一応、エラー全文も添付します。

Exception:
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/usr/local/lib/python2.7/site-packages/pip/commands/install.py", line 342, in run
    prefix=options.prefix_path,
  File "/usr/local/lib/python2.7/site-packages/pip/req/req_set.py", line 784, in install
    **kwargs
  File "/usr/local/lib/python2.7/site-packages/pip/req/req_install.py", line 851, in install
    self.move_wheel_files(self.source_dir, root=root, prefix=prefix)
  File "/usr/local/lib/python2.7/site-packages/pip/req/req_install.py", line 1064, in move_wheel_files
    isolated=self.isolated,
  File "/usr/local/lib/python2.7/site-packages/pip/wheel.py", line 247, in move_wheel_files
    prefix=prefix,
  File "/usr/local/lib/python2.7/site-packages/pip/locations.py", line 153, in distutils_scheme
    i.finalize_options()
  File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/command/install.py", line 264, in finalize_options
    "must supply either home or prefix/exec-prefix -- not both"
DistutilsOptionError: must supply either home or prefix/exec-prefix -- not both