OmniAICreator/Qiita-1.07M huggingface dataset:
【テクニカルトピック】9月13日号

■ シンメトリック、Web改善に必要な分析データを1画面にまとめる「Anatomy」をリリース
http://web-tan.forum.impressrd.jp/n/2016/09/08/23791
Googleアナリティクスと連携して、分析データをビジュアライズするサービスです。
GAの持つ大量の情報を簡潔なビジュアルデータに変換し、1画面で確認できるようにしてくれます。
リンク構造やページデザイン等のコンテンツデータは週1の頻度で収集され、後で比較することも可能とのこと。
利用料金は月額5万円から（期間限定）。全機能を1か月間試せる無料トライアルも受け付けているそうです。
このサービスはさておき、我々も関わっているサイトをクロールして蓄積しておくと色々使えるんじゃないかと思いました。

■ 大和ハウス、沖縄の暮らしを疑似体験できるVRサービスを導入
http://www.moguravr.com/daiwa-house-vr-okinawa/
VRを用いた住宅プレゼンテーションです。
沖縄のマンションのモデルルームが東京にあるパターンで、東京にいながら沖縄の暮らしを疑似体験できることがポイントとのこと。
体験はVRを語る上での大きなキーワードです。採用活動などにも使えるかもしれません。

■ テキストにCSS3のアニメーションエフェクトを付与するスクリプト・「txt.wav」
http://kachibito.net/useful-resource/txt-wav
CSS3を使って、テキストにアニメーションエフェクトを付与できます。
ちょっとした演出などに使えそう。

■ MSI、VR用バックパックPC「VR One」発表 TGSで出展
http://www.moguravr.com/msi-vr-one/
なかなか凄い商品が発売になるということでトピック追加しました。
高性能VRゴーグルの難点であるケーブル問題の一つの解決策ではあります。
イベントなどでの可能性は広がりますね。VRに夢中になっている隙に背後から襲われても安心。

■JavaScriptの設計について考える - 機能ごとに分類する
http://tech.leihauoli.com/post/2014/11/10/program-design-1.html
フロントエンドコーダー向けの記事です。
ついつい複雑になりがちなjQueryを体系立ててかなり細かく解説しています。ページ下の関連記事も合わせて読んで理解できれば、数段上のレベルのjQueryを書くことができるようになると思います。

■Google、2017年1月提供予定の「Chrome 56」で、一部のHTTPサイトに警告を表示へ
http://internet.watch.impress.co.jp/docs/news/1019304.html
アカウント、ディレクター向けの記事です。
Google Chromeが、お問い合わせやログインページなどをSSL化していないサイトには「not secure」という警告をブラウザバーに出す予定だそうです。今後はサイトのSSL化がさらに検索のランキングに影響がでることが考えられます。
SSLに関して概要や常時SSL化けのメリットなどは「技術トピック：SSLの概要とこれから」も合わせて読むといいかと思います

■ロジテック、3台のデバイスを切り替えて使えるBluetoothマウスを発表
http://jp.techcrunch.com/2016/08/31/20160831see-how-they-run/
この商品を使えば、複数端末をよく操作する技術者やデザイナーの作業効率が良くなると思います。

■Googleの遠隔地無線インターネットプロジェクト「Project Loon」、インドネシアで試験準備が整う
http://thebridge.jp/2015/11/indonesia-internet-google-alphabet-project-loon
インドネシアで、インターネットにアクセスできない人がまだたくさんいます。特に、アクセスが非常に難しい田舎や島に住んでいる人たちです。そのため、インドネシアの三大通信会社とGoogleは遠隔無線インターネットプロジェクトを立ち上げ、より多くのインドネシア人がインターネットにアクセスできることを目的とします。
より多くのインドネシア人がインターネットにアクセスできるのであれば、インドネシアのインターネットビジネスがさらに発展する見込みです。

■落合陽一×Psychic VR Lab×chloma懇談
http://www.sensors.jp/post/fashioncodeweek-fashion-vr.html
各界の第一線で活躍するゲストを招いた『ファッション×VR』セッション
落合陽一が言っていた話の中で、これからの服の買い方は第三者目線で買うようになる。これは絶対。
今までは鏡でしか自分をみることができなかった。
これからはバーチャルで自分の後ろ姿や猫背、立ち方、髪型がみれるんだなーとすごく納得できる話でした。ファッション業界ではVRが必須になりますね！
【テクニカルトピック】9月7日号

■空中に自動で橋がたつ
http://mx3d.com/projects/bridge/
3Dモデリングを行ったデータをもとに、3Dプリンターが金属製の橋を建ててくれます。
プラスチック制の3Dプリンターだけでなく、金属製の素材を用いた3Dプリンターができたことによって、ものづくりがさらに楽かつ早くなります。

■iphoneにも装着360カメラが発売
http://www.insta360.com/about
この商品を使えば、簡単かつ即座に360の写真や動画が撮れます。

■AMP導入でアクセス数は上昇!?
https://ics.media/entry/13197/2
AMP（Accelerated Mobile Pages）はオープンソース仕様に沿って作成されたウェブページです。検証された AMP ページは Google の AMP キャッシュに保存されます。キャッシュに保存することでページをこれまで以上にすばやく表示できるようになります。
どのくらい早くなるのか体感しないといけないですね

■深層学習でドット絵のような荒い写真を高画質化できるプログラムがGitHubに公開
http://pc.watch.impress.co.jp/docs/news/1017571.html
非常に荒い解像度の写真を深層学習(ディープラーニング)を用いて高画質化するプログラムがGitHubで公開されています。
精度にはまだ課題があるようですが、興味深いです。

■全73サービス！「AIサービスマップ 2016 Summer」~活用したいAIがすぐに見つかる~
http://ainow.ai/aimap01/
業界別・プラットフォーム別にサービス名と会社名がまとめられています。
それぞれどういうAIサービスなのかといった情報は無いですが、AIについて調べる際に参考になりそうです。

■［ウェブサービスレビュー］「サーバ落ちてる？」を手軽に判定--「Down For Everyone Or Just Me」
http://japan.cnet.com/news/society/35087293/
　タイトル通りです。URLを入力して、対象のサイトが落ちているかどうか「Yes or No」を返してくれるサービスです。これを使うと、自分の環境だけが見えないのか、サーバーが落ちていて閲覧できないのか、原因の切り分けに役立ちます。

■AWS、さくらのVPS、実サーバで、費用ベースのconcrete5のベンチマークをしてみました。
https://concrete5.co.jp/blog/aws_vs_vps_vs_real-server_on_concrete5
　結論からいいますと、実サーバーが最も良いパフォーマンスを発揮しました。
　実験したCMSはconcrete5ですが、他のCMSについても同じことが言えると思います。最も高いパフォーマンスを発揮した実サーバーですが、クラウドやVPSなどと比べて、運用やメンテナンスが大変なため要件によっては結局運用コストで高くなることがあるので、一概には言えないと結論付けています。あくまで参考までに。
【テクニカルトピック】8月30日号

■グーグル、VRプラットフォーム「Daydream」を数週間後にリリースか
http://m.japan.cnet.com/amp/story/35087902/
VR対応の「Android 7.0 Nougat」がリリースされ、それに合わせてプラットフォーム「Daydream」をリリースするのでは？という記事です。
ついにGoogleもVRプラットフォームに参入します。YouTubeとどう連携するのか楽しみです。

■Android 7.0 Nougat(ヌガー)の新機能/変更点/アップデート情報まとめ
http://androidlover.net/android-os/android-m/android-m-surely-releases-2015.html#Android_70
Android 7.0 Nougatの新機能のまとめです。
一度目を通しておくと良いと思います。

■月4800円で40GB使える「上り専用SIM」が発売。ドコモ/au回線利用、IoT/M2Mへ訴求
http://japanese.engadget.com/2016/08/22/4800-40gb-sim-au-iot-m2m/
映像伝送、IoTやM2Mなどの通信ネットワークを介した機器通信に適したアップロード専用SIM「Starcom mobile」を発表しました。
IoTデバイス用に使えそうです。

◼Mac BookラップトップでVRが可能に。Thunderbolt向けGTX970搭載外付けGPU「The Wolfe」が登場
http://shiropen.com/2016/08/23/19327
Macを外付けGPUにつなぐ場合、TitanX（15万〜20万）など高価なプロダクトを使うか、もしくは配線を自作する必要がありました。しかし、このThe Wolfeは、MacBookProを5万〜6万でVR機として利用実現できます。

■IFTTT
https://ifttt.com/recipes
http://tipstour.net/website/9203
　iftttとは、自動で好みのウェブサービスと連動できるサービスです。
例えば、以下の連動が可能になります。

twitterでいいねをすると自動的にEvernoteに保存する
youtubeに動画を投稿すると
Facebookでシェアすると自動的にtwitterでもシェアする
雨が降りそうだったら、Gmailを飛ばす

など、あらかじめ用意された条件とアクションを設定することで各サービスの連携が簡単にできます。

■CEDEC 2016
http://cedec.cesa.or.jp/2016/index.html
CEDECとは、Computer Entertainment Developers Conferenceと呼ばれる、コンピューターエンタメに関する世界的なカンファレンスです。VR、グラフィクスからAWSをはじめとしたインフラ、AIといったバックエンド、ゲーム/UI/UXデザインまで幅広い分野が取り扱われています。
CeDil（セッション資料）：https://cedil.cesa.or.jp/
※セッションの資料は会員登録（無料）すれば、閲覧できます。

■GoogleのUXデザイナーがサイトをチャットボット化して学んだ9つのこと | UX MILK
http://uxmilk.jp/47134
GoogleのUXデザイナーがチャットボットを運用してみて、そこで得た気づきをまとめたものです。
チャットボットについて、「対話体験をデザインする」という視点から分析しています。
分析内容自体もそうですが、UXデザイナーという人がどんなことを考えるのかという点も参考になりました。
Googleのデザイナーであっても、結局、やってみてはじめて分かることが多いのだという点にも気付かされます。

■Senses | 次世代の営業支援ツール
http://product-senses.mazrica.com/
人工知能によって「営業ナレッジの共有」を行おうというツールです。
顧客へのコミュニケーションをデータとして蓄積し、膨大な行動データとその結果を分析した上で、
「こういうタイミングでこういう行動したら成果出る可能性高いよ」と教えてくれる。
メールを書いて送ろうとしたら、「こういう資料も添付したほうがいいよ」などと言ってくるというような話です。
誰もが普段やってることにAIを応用されている例として。

■feedbacktools.org - Tools for UI / Customer / Bug feedback and more
http://feedbacktools.org/
「フィードバックを集める」をテーマに色々なツールやサイトを集めたコレクションサイト。
「顧客から」「ユーザーから」「バグ」「UI/UX」「デザイン」など、カテゴリ別に紹介されています。
英語ですが、アンケートシステムなどを構築する際には参考になりそう。
結局やっていることは、昔からあるサービス比較サイトなのですが、表現の仕方で印象が変わるものです。

■情報会議
http://johokaigi.org/
情報共有ツールを導入する他社での悩みを皆で話し合います。例えば新しいツールを導入したが中々浸透しない、記事すら読んでくれないなどよくある悩みを他社ではどうなのか解決していきます。
実際参加した人たちの感想ブログもあり面白いです。個人的にささった言葉は「忙しいのにごめんね～と言われても仕事量は減らないので、やったことに対してもっと褒めてほしい！」でした。エンジニアは褒めてほしいものです

■『ブレア・ウィッチ』の恐怖を再現した公式VRホラー体験公開
http://www.moguravr.com/blair-witch-vr/
低予算ホラー映画『ブレア・ウィッチ・プロジェクト』の続編『ザ・ウッズ』が9月米国で公開されることに先立って、同作の世界を楽しめるVRコンテンツが公開されました。
映画の世界観が体験できて楽しそう～WEBサイトもこわくてずっとはみれませんね

■Google、消すのが困難なポップアップ広告を表示するサイトを制裁へ
http://jp.techcrunch.com/2016/08/24/20160823good-riddance/
Googleは煩わしい広告のモバイルサイトの検索順位を引き下げました。
この情報を知ると、ウェブサイトに煩わしい広告を載せない方がいいというのをクライアントに提案できます。

■GoogleはWindows, Mac, Linux用のChromeアプリを徐々に廃止へ、Webへの移行ツールを提供
http://jp.techcrunch.com/2016/08/20/20160819chrome-apps/
今後Chromeアプリをクライアントさんに提案しないほうがいいです
【テクニカルトピック】8月23日号

■日本の行政機関が公開中のAPIについてのまとめ（2016年8月17日暫定版）
http://qiita.com/kimuraya/items/3cc6c84bf6eac30851f1
アイディアを考えるネタになりえるかもです。

■IoTを手軽に体験！Web開発者におすすめのチュートリアルまとめ
http://ascii.jp/elem/000/001/213/1213795/
IoT開発のとっかかりにはよさそうです。

■「PHP 7」正式版が登場。PHPにとって10年ぶりのメジャーバージョンアップ。実行速度は旧バージョンの2倍以上
http://www.publickey1.jp/blog/15/php_7php102.html
ローカル環境にてPHP7×WordPressを試して見たのですが、PHP5.6と比較して表示が早かったです。
また、ラソナのオウンドメディアはPHP7で構築されています。現在では、PHPのサポートは5.6までで、それ以下は非推奨とされています。

■【保存版ボット・ランドスケープ】170社以上で調達額は40億ドルを超える、ボット世界の俯瞰図
現在世にあるBotサービスとそれを取り巻く技術を俯瞰してみたものです。
http://thebridge.jp/2016/08/introducing-the-bots-landscape-170-companies-4-billion-in-funding-thousands-of-bots-pickupnews?utm_content=buffer28a75&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer
これを読めば、この人工知能やボットを取り巻く各サービス位置づけが見えてくると思います。

■Windows 10 にアップグレードするメリット・デメリット
http://tarelife.com/windows10-upgrade-merit/
http://tarelife.com/windows10-upgrade-demerit/
windows7 & 8 の使い方に慣れている方は、Windowsフォトビューアーが使えない、Windows Updateが制御できない Windows10は不便に感じています。現在使っているWindows8は不満点があまり感じないため、Windows10にわざわざ更新しようと思っていません。しかし、セキュリティを気にし、最新機能を利用したい方は、無料期間中に、Windows10に更新することをお勧めします。（※無料期間7月29日で終了ですが、一度でもアップデートした人は再度アップデート可能だそうです！）

■日本国内でプリウスは他のプリウスと会話できる。
目的は安全面でお互いの車の情報を共有しあう。
例えば、走るスピードなど
http://www.pcworld.com/article/3013820/car-tech/toyotas-new-prius-is-one-of-first-that-can-talk-to-other-cars.html

■自分のIot端末をbotnetから守る方法。
最近防犯カメラのようなiot端末はセキュリティ対策が一般的に取られていません。
そのため、これらの機材は簡単に乗っ取られ、DDOS攻撃に使われやすいそうです。
これを防ぐため、定期的にパスワード変更がオススメらしいです。
https://techcrunch.com/2016/08/16/how-to-prevent-your-iot-devices-from-being-forced-into-botnet-slavery/

■iosのofficeアプリは手書きによる入力が可能
http://jp.techcrunch.com/2016/08/16/20160815office-fingertips/

■無くしたいくないもの（車、携帯、財布、など）の居場所を常に把握できるハードウエア
https://www.thetrackr.com/

■日本の行政機関が公開中のAPIについてのまとめ（2016年8月17日暫定版）
http://qiita.com/kimuraya/items/3cc6c84bf6eac30851f1
行政機関が公開している、「公式」APIの情報をまとめたものです。
行政は情報の民間活用を進めており、この動きは積極的に進んでいくはずです。
気象防災情報、標高情報、自治体の観光情報などは使い勝手がよさそう。
他にもざっと眺めておくと使えることがありそうです。

■インテル、全部入りVRヘッドセットProject Alloy発表。RealSenseで外部センサやコントローラ不要の「融合現実」端末、来年オープン化
http://japanese.engadget.com/2016/08/16/vr-project-alloy-realsense/
インテルから、VRヘッドセット端末が発表されました。
「外部コンピュータとの接続不要」「3Dセンサを内蔵しており、ユーザーの手、壁や人など、外部の物体を認識可能」「オープンプラットフォーム化され、サードパーティが互換端末を発売可能となる予定」という特徴があります。
マイクロソフトとも協力し、WindowsのVR/ARプラットフォームに最適化される予定。
デファクトスタンダード取る可能性を秘めた端末だと思います。

■製品紹介ページのWebページのデザインのみを収集しているWebギャラリー・「Product Pages」
http://kachibito.net/useful-resource/product-pages
企業サイトやメーカーサイトの製品紹介ページ、プロダクトページのみのデザインを収集しているギャラリーサイト。
このようなジャンル限定のギャラリーサイトを集めておくと、情報収集に役立ちそうです。

■訪問者のビューポートサイズをGoogleアナリティクスが計測してくれていた！
http://web-tan.forum.impressrd.jp/e/2016/08/09/23541
いつからか不明だが、Google Analyticsがビューポート（ブラウザのサイズ）を取得するようになっているという情報。
セカンダリディメンションからチェックできるそうです。
ファーストビューの実サイズ、ブレイクポイントの検討、サイズとコンバージョン率や直帰率との相関など、分析できることがありそう。
【テクニカルトピック】8月16日号

■オンラインで病院の予約から診察、薬の処方まで行える遠隔医療サービス。CLINICS（クリニクス）
https://clinics.medley.life/
予約から診療、会計、アフターフォローまでオンラインで実現できるそうです。

■3歳児から小学生まで。プログラミングを学べるおもちゃまとめ
http://www.gizmodo.jp/2016/08/kids-programming-toy.html
子どもがプログラミングを学ぶためのおもちゃがいろいろ発売されています。
今どんなものが出ているのかを年齢順にまとめた記事です。

■暗闇に立体で浮かび上がるR2-D2！香港ディズニーランド、スターウォーズのホログラムをスマホで再現。
ユーザーが手軽に試せるホログラムのアイデア、いいですよね。
http://markezine.jp/article/detail/24836

■リアルタイムの交通量によって変わる広告。ラソナでも実現できそう
http://markezine.jp/article/detail/24837

■ヴィデオゲームを扱ったアート作品
　多摩美術大学で教鞭をとられている谷口昭彦氏によるUnity講義のレジュメ
http://okikata.org/gameart/artworks.html

■.htaccessに2000行書くとApacheの処理が何秒遅くなるか測ってみた
http://web-tan.forum.impressrd.jp/e/2016/08/02/23489
　.htaccessは、リクエストがあるたびにファイルを読み込むので、ページの表示速度が遅くなるそうです。筆者の環境では、以下のような結果がでたとのことです。htaccessの案件が多いので、周辺知識として、読まれてはいかがでしょうか。

引用
.htaccessファイルに2200行ほどの設定を書いた場合、同じアクセス制御をhttpd.confに書いた場合と比べて、中央値で1リクエストあたり12ミリ秒ほど遅くなりました。
【テクニカルトピック】8月9日号

テクニカルなトピックをシェア致します。

■Web DesigningやMdNや＋DESIGNINGなどもあるぞ！Web制作者やデザイナー向けKindle Unlimited読み放題の対象本のまとめ
http://coliss.com/articles/build-websites/operation/work/kindle-unlimited-for-web-designers.html
日本でも定額制読み放題の Kindle Unlimited が始まりました。
対象は限られており、まだ全ての本が読めるわけではないため、利用を迷っている人も多いと思います。
Web制作者向けの雑誌や書籍についてまとめられている記事があったので参考に。
Web Designingやブレーンが対象なので、毎月読んでる人はそれだけでもお得になりますね。

■映像から顔を見つけ出す！ JavaScriptでお手軽フェイストラッキングに挑戦
https://ics.media/entry/13038
Web GLを利用して、ブラウザ上のJavascirptで動作する顔認識ライブラリの紹介です。
静止画、動画ともにリアルタイムで顔を検出することができます。
現時点でIE, Safariが未対応なことには注意。

■これで撮り損じゼロ! 人工知能搭載カメラアプリ「Microsoft Pix」 iPhone版が登場
http://techwave.jp/archives/microsoft-pix-for-ios-22665.html

■ちょっと新しい見せ方、CSSなどで実現する今っぽいエフェクトまとめ
http://commte.net/blog/archives/5714

■Googleが野心的AIプロジェクト、タンゴを発表―3Dカメラとセンサーでスマートフォンが空間を認識する
http://jp.techcrunch.com/2014/02/21/20140220google-launches-project-tango/

■Let's Encrypt
サイトをSSL化しようという、サービス（サービスというよりサイトのHTTPS化を推奨する運動に近いかもしれません）。
無料でSSL証明書を取得できるようでGoogleやfaebookなどがスポンサーにいます
https://letsencrypt.org/

■今どきの入力フォームはこう書く
注意ポイントだけみておくといいと思います！
https://ics.media/entry/11221

■罵倒少女　期間限定
ソニー・ミュージックエンタテイメントと言語理解研究所、共同開発した対話型人工知能「PROJECT Samantha」
「PROJECT Samantha」は人格データをAI化することにより、様々なサービスシステム内で、コミック、アニメ、ノベルズなどに登場する架空のキャラクターたちとの会話コミュニケーションを実現するもの。今回のβサービスでは期間限定で無料で試せます（8/4〜8/15 12時終了）
http://www.pixiv.net/special/batoshojo/
SVGに対してclickイベントが反応しない

SVGをobjectタグで読み込んで、jqueryでclickイベントを設定したものの、反応しない…

```index.html
<div id="hoge">
<object id="moge" type="image/svg+xml" data="hoge.svg">
</div>
```

```index.js
$(function(){

  $("#hoge").on('click', function(){
    console.log("反応しない");
  });

});
```

### 解決策

window loadで、svgをjavascriptで取得し、jqueryオブジェクトに変換することで解決した

```index.html
<div id="hoge">
<object id="moge" type="image/svg+xml" data="hoge.svg">
</div>
```

```index.js
$(window).on('load', function(){
  var moge = document.getElementById('moge').contentDocument;
  var $moge = $(moge);
  $moge.on('click', function(){
    console.log('反応した');
  });
});
```

### 追記
SVGをobjectで読み込み、クリックでページ遷移させようとしたけどできない…
objectを囲う要素をアンカータグにして、hrefを入れても反応しない…
調べた結果：http://subtech.g.hatena.ne.jp/mayuki/20120212/1329046476
CSSで、object要素に

```style.css
pointer-events: none;
```
を設定することで解決した。こっちの方が簡単だった。。
素直にobjectではなくimgでsvgを読み込んだ方がいいのかもしれない
Yarnファーストインプレッション

## Yarn とは

https://github.com/yarnpkg/yarn

名前から yet another ... な雰囲気を漂わせてますが、 **npm互換** です。(追記: 正確にはnpmの生成するpackage.jsonと互換とのことだった)。各所から node連中はまたツール増やしやがって！という雰囲気を感じるので、ここは明確にした方がいい。(techcrunchの記事とかそういう印象を与える書き方になってる)

- npm install 時のディレクトリ配置への介入
- npm install 時のより賢いローカルキャッシュ
- yarn.lock ファイルでバージョン固定

yarn 環境下で yarn add, yarn install などを行った場合、 yarn.lock と package.json に同時に書き込み、 その環境で生成されたファイルは yarn なしでも動きます。つまり、yarn はより厳密に npm のバージョンを固定したい人向け。

## 基本的な使い方

https://yarnpkg.com/en/docs/usage をみて

## バージョンコンフリクト時の挙動

yarn.lock を手元で意図的にコンフリクトさせた場合、**package.jsonの側**に自動的に修正されました。ここはオプションで止めたり警告出したり出来たほうがよいと思う。

## オプション

yarn -h みたら一発

```
  Usage: yarn install [flags]

  Options:

    -h, --help                  output usage information
    -V, --version               output the version number
    --offline                   
    --prefer-offline            
    --strict-semver             
    --json                      
    --global-folder [path]      
    --modules-folder [path]     rather than installing modules into the node_modules folder relative to the cwd, output them here
    --packages-root [path]      rather than storing modules into a global packages root, store them here
    --mutex [type][:specifier]  use a mutex to ensure only one yarn instance is executing
    --har                       save HAR output of network traffic
    --ignore-engines            ignore engines check
    --ignore-scripts            
    --ignore-optional           
    --force                     
    --flat                      only allow one version of a package
    --prod, --production        
    --no-lockfile               don't read or generate a lockfile 
```

`--flat` で複数 jQuery のimport を弾いたりするのに良さそう。 

`--ignore-optional` はまさに自分が欲しかったものという感じ。Qiitaでもつい最近まで npm-shrinkwrap を使っていたのですが、docker環境に移行した際、環境ごとに変わる optional dependencies をshrinkwrap に含んで異なるOSでnpm install に失敗し爆死するということを npm がしでかして、まったく使えなくなり、破棄しました。yarn ならうまくいきそう。

## --prefer-offline が速い！

npm install はサーバーへの整合性確認とかで毎回サーバーにリクエストしてたけど、プロジェクトの起動の前に `yarn install --prefer-offline` とか書いとくと便利そうだった。

## で、使うの

現時点でとくに問題点は感じず、わかりやすいメリットもあるが、もうちょい様子見してから考える
Alamofire4 + swift3 のサンプル

この組み合わせの例がまだ少なかったので

## 環境

- swift 3.0
- Almofire 4.0.1
- xcode 8.0

## 汎用的に利用するためのサンプル

```swift:ApiManager.swift

import Alamofire

private let host = "https://example.com"

struct ApiManager {
    let url: String
    let method: HTTPMethod
    let parameters: Parameters

    init(path: String, method: HTTPMethod = .get, parameters: Parameters = [:]) {
        url = host + path
        self.method = method
        self.parameters = parameters
    }

    func request(success: @escaping (_ data: Dictionary<String, Any>)-> Void, fail: @escaping (_ error: Error?)-> Void) {
        Alamofire.request(url, method: method, parameters: parameters).responseJSON { response in
            if response.result.isSuccess {
                success(response.result.value as! Dictionary)
            }else{
                fail(response.result.error)
            }
        }
    }
}
```

使う側

```swift
  let api = ApiManager(path: "/users.json")
  api.request(success: { (data: Dictionary) in debugPrint(data) }, fail: { (error: Error?) in print(error) })
```

swift初めて書くので指摘あれば編集リクエスト下さい。
CentOS7.2にPostgresql9.6をインストールする

## RPMのインストールから初回ログインまで
```shell-session:Postgresql96_Install
$wget https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm
$sudo rpm -ivh pgdg-centos96-9.6-3.noarch.rpm
$sudo yum install -y postgresql96*
$sudo /usr/pgsql-9.6/bin/postgresql96-setup initdb
$sudo systemctl enable postgresql-9.6
$sudo systemctl start postgresql-9.6
$sudo -u postgres psql postgres
```

initdbとか初回ログインで詰まる事が多いのではないだろうか。
`yum install -y postgresql96*`にしてるけど、必要なものだけインストールしてください。
※メンドッチイカラッテアスタリスクニスルワタシノワルイクセ

## 参考
https://wiki.postgresql.org/wiki/YUM_Installation
http://suite.opengeo.org/docs/latest/dataadmin/pgGettingStarted/firstconnect.html
aws kinesis streamを試す

ブラウザ経由でkinesisにデータを送りたかったので試した。


参考
[Edisonを使ってセンサデータをAmazon Kinesisにあげてみる【前編】](http://qiita.com/KenTamagawa/items/3f2e2bd3bb36a27dc439)
[Edisonを使ってセンサデータをAmazon Kinesisにあげてみる【後編】](http://qiita.com/KenTamagawa/items/b5bc103ab84761281112)

参考URLを元に環境を作成
cognito認証とkinesisにデータ送信まで確認出来た。

node cognito.js 
Cognito Identity Id: ap-northeast-1:ff95d7fc-d3ac-466b-bfd9-c4ce77bed06a

{ ShardId: 'shardId-000000000000',
  SequenceNumber: '49566570005103446623920873979827322113944749638904971266' }
{ ShardId: 'shardId-000000000000',
  SequenceNumber: '49566570005103446623920873979828531039764364268079677442' }
Sketchの画面を手っ取り早く共有する

早く直してほしいから、今すぐ指示を出したい。というときに。

<img width="1034" alt="Screen_Shot_0028-10-12_at_10_24_46.png" src="https://qiita-image-store.s3.amazonaws.com/0/42349/3928c7d0-696f-961b-9cf0-eb9e5edbd088.png">

SketchでアートワークのタイトルをクリックしてCmd+Cでコピー。

<img width="732" alt="Screen Shot 0028-10-12 at 10.25.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/42349/e7ee815d-910a-c7b2-00fe-fef8388a089b.png">

GitHubのコメント欄でCmd+Vでペースト。

<img width="723" alt="Screen Shot 0028-10-12 at 10.26.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/42349/debb74cb-6404-3d38-1178-eb125a97d0fd.png">
[Ruby] class === インスタンス


これがTrueになる。

```rb
String === 'foo'
#=> true
```

逆にするとFalse。

```rb
'foo' === String
#=> false
```

`===`は正規表現として使われるが(僕は)、どうやら他のクラスにも実装されているよう。

```rb
[12] pry(main)> String.===
ArgumentError: wrong number of arguments (0 for 1)
from (pry):12:in `==='
```

どうやら引数を一つ取るクラスメソッドとして定義されている模様。

```rb
String === 'foo'
#=> true
```


### ちなみに
`case .. when`の比較には`===`が使われているらしいので、

```rb
case 'foo'
when /foo/
...
when 'bar', 'baz' #(,で区切るとorが使える。)
...
else
...
end
```

これは、`caseの値 === whenの値`と思いがちだが、逆で、
以下の結果から、

```rb
'foo' === /foo/
#=> false
/foo/ === 'foo'
#=> true
```

`whenの値 === caseの値`の模様。


つまり、こんなのもあり。

```rb
a = 'foo'
case a
when String
  puts 'String!'
when Integer
  puts 'Integer!'
end
```


### 追記

scivolaさんにコメント頂き、教えていただきました。


===は同値の時にTrueではなく、**各クラスでcaseで使った時に嬉しいように再定義されている**らしいです。

(Object#===の時はObject#==のaliasとして定義されており、同値の時にTrueを返すらしい)
【 Swift】AVPlayerで動画を指定時間まで進める方法

AVFoundationのAVPlayerで動画を指定時間まで進めたいことがありましたので、
備忘の為投稿します!!よければご参考にしてください。

#以下はNG
        videoPlayer.seekToTime(CMTimeMakeWithSeconds(Float64(seekBar.value), Int32(NSEC_PER_SEC)))

#以下を使いましょう
        videoPlayer.seekToTime(CMTimeMakeWithSeconds(Float64(seekBar.value), Int32(NSEC_PER_SEC)), toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero)

理由は、UISliderなどでシークで早送りする際に上の方法だと、滑らかに動画が早送りされない。（飛び飛びに早送りされてしまう）
Plugin is too old, please update to a more recent version

# 問題
ある日の朝、AndridStudioで製作中のアプリプロジェクトをビルドすると以下のエラーが発生した。

```
Error:Plugin is too old, please update to a more recent version, or set ANDROID_DAILY_OVERRIDE environment variable to "b6t599geqdrxnxpm6ce5g93xvj3afaerunr4idjb"
Fix plugin version and sync project
```

おいおいおいおい、こっちは急いでるんだよ！
何勝手にアップデートしろとか言ってるんだよ！ビルドさせてくれよ！
と滝汗。

# 解決策
maxOSの場合
1 . ターミナルを起動し、以下のコマンドを実行して環境変数を登録する
(AndroidStudioの再起動後から設定が反映される)

```
$ launchctl setenv ANDROID_DAILY_OVERRIDE b6t599geqdrxnxpm6ce5g93xvj3afaerunr4idjb
```
2 . AndroidStudioを起動して、アプリをビルドする

解決しました。
AWS IoT Device SDK for Ruby を使ってみた #5 - Influx DB構築

// 当記事は, 以下親記事の Setup Flowの一部です.
// [AWS IoT Device SDK for Ruby を使ってみた](http://qiita.com/Satoshi_Numasawa/items/2b89799a92e5a4edefcd)

以下, 参考とさせて頂きました. 有難うございます.
http://qiita.com/akito1986/items/9c1c14a36654646db456


# 環境
- ubuntu on AWS ec2
- InfluxDB and Chronograph


# Influxdb
## Install
https://docs.influxdata.com/influxdb/v1.0/introduction/installation/

```bash:console
sudo apt-get update
sudo apt-get upgrade
```

```bash:console
curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
source /etc/lsb-release
echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
```

```bash:console
sudo apt-get update && sudo apt-get install influxdb
sudo service influxdb start
```




## Create database
https://docs.influxdata.com/influxdb/v1.0/introduction/getting_started/


```bash:console
// DB nameは任意

$ influx
CREATE DATABASE sensorMeasure_sendai_test
CREATE DATABASE my_db
```




## Create user
```
// user name, passwordは任意

$ influx
CREATE USER admin WITH PASSWORD 'admin' WITH ALL PRIVILEGES
```




## Edit config
```bash:console
sudo vim /etc/influxdb/influxdb.conf
```

```bash:/etc/influxdb/influxdb.conf
[http]
-  auth-enabled = false
+  auth-enabled = true
```

```bash:console
sudo /etc/init.d/influxdb restart

// login comannd sample (以降は, user認証が必要となる)
influx -username admin -password admin
```




## Test write and show Data
https://docs.influxdata.com/influxdb/v1.0/guides/writing_data/
https://docs.influxdata.com/influxdb/v1.0/tools/api/

- post data

    ```bash:console
    $ curl -i -X POST http://52.197.142.78:8086/write?db=my_db -u admin:admin --data-binary  'cpu_load_short,host=server01,region=us-west value=0.75'
us-west value=0.75'

    HTTP/1.1 204 No Content
    Content-Type: application/json
    Request-Id: 7015c2a7-900a-11e6-8009-000000000000
    X-Influxdb-Version: 1.0.2
    Date: Tue, 11 Oct 2016 23:28:38 GMT
    ```

- show data

    ```bash:console
    $ curl -X GET 'http://52.197.142.78:8086/query?q=select+*+from+cpu_load_short%3B&db=my_db' -u admin:admin

    {"results":[{"series":[{"name":"cpu_load_short","columns":["time","host","region","value"],"values":[["2016-10-11T23:22:16.50324883Z","server01"]}]}]}
```


# Data取得状況を確認
既に, Raspberry pi | AWS IoT | AWS Lambda | Influx と流れ, DBへ値が保存されているはずです.


## 認証
- [x] http://[Host or IP]:8083 を開く
- [x] DB user name, pass を入力
- [x] [Save] を選択
![スクリーンショット 2016-10-12 9.50.51.png](https://qiita-image-store.s3.amazonaws.com/0/118627/2eaf8fd4-2a5d-b166-a219-637731b7dcf8.png)





## 温度/湿度 取得
- [x] 右上の pull down から, 使用する DB名を選択 (ここでは, sensorMeasure_sendai_test)
![スクリーンショット 2016-10-12 9.52.58.png](https://qiita-image-store.s3.amazonaws.com/0/118627/44221acc-9f10-4ee1-686b-e7c6e3f40215.png)
<br><br>

- [x] [select * from DHT11Measure;] を入力.
- [x] 温度/湿度値が表示されます.
![スクリーンショット 2016-10-12 9.59.13.png](https://qiita-image-store.s3.amazonaws.com/0/118627/8ed1ac2f-410b-d9f6-47f4-9d427718ebeb.png)
<br><br>


以上.
次に最終工程の,  [#6 - Chronograph にて可視化](http://qiita.com/Satoshi_Numasawa/items/a4452cce3010af9570f3) へ.
gradle-deploygate-pluginでアップする時に自動的にブランチ名とハッシュ値をメッセージに入れる

## 問題点
gradle-deploygate-pluginを使うと、コマンド一発でDeployGateにアップ出来て非常に便利。

しかし、DeployGateにapkをアップした時に、あれ、これmasterでビルドしたっけか？master最新にしてたっけか？という不安に駆られる事があると思う。

## 解決方法
コマンド実行する時にmessageにブランチ名、ハッシュ値を含めるようにする。以下のような感じ、そしてちょっと一工夫して、releaseビルドのときには`[production]`という文字が入るようにしている。

```
deploygate {
    userName = "XXXX"

    apks {
        def branch = 'git rev-parse --abbrev-ref HEAD'.execute([], project.rootDir).in.text.trim()
        def hash = 'git rev-parse --short HEAD'.execute([], project.rootDir).in.text.trim()
        def commonMessage = System.getenv('MESSAGE') + " ${branch} ${hash}"
        debug {
            message = commonMessage
        }
        release {
            message = "[production]" + commonMessage
        }
    }
}
```

これで以下のように実行すると、

```
MESSAGE="ほげほげ" ./gradlew uploadDeployGateDebug
```

DeployGateのメッセージのところには、

```
ほげほげ master 1856bca
```

という感じに入ってくれる。地味に便利。
TensorFlow > mnist_with_summaries.py > parser = argparse.ArgumentParser()の使用例

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
```

TensorFlowというDeep Learning関連コードを学習中。
https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#tensorflow-mechanics-101

mnist_with_summaries.pyにおいて

```py
if __name__ == '__main__':
  parser = argparse.ArgumentParser()
  parser.add_argument('--fake_data', nargs='?', const=True, type=bool,
                      default=False,
                      help='If true, uses fake data for unit testing.')
  parser.add_argument('--max_steps', type=int, default=1000,
                      help='Number of steps to run trainer.')
  parser.add_argument('--learning_rate', type=float, default=0.001,
                      help='Initial learning rate')
  parser.add_argument('--dropout', type=float, default=0.9,
                      help='Keep probability for training dropout.')
  parser.add_argument('--data_dir', type=str, default='/tmp/data',
                      help='Directory for storing data')
  parser.add_argument('--summaries_dir', type=str, default='/tmp/mnist_logs',
                      help='Summaries directory')
  FLAGS = parser.parse_args()
```

FLAGSの使用例

```py
    if train or FLAGS.fake_data:
```

argparse.ArgumentParser()の使用については以下に詳しい。
http://qiita.com/dodo5522/items/6ec2b6d83287add6c185

mnist_with_summaries.pyの例では名前の前に`--`をつけていて、使用時には`--`をはずした名前で指定している。
このあたりは未消化。
【Swift】UITableViewの空セルのseparatorを消す方法

# デモ
これを
![スクリーンショット 2016-10-12 8.34.03.png](https://qiita-image-store.s3.amazonaws.com/0/135478/f4fdd96c-49b8-4bf6-5cfa-622637334b4f.png)
こうする方法
![スクリーンショット 2016-10-12 8.34.31.png](https://qiita-image-store.s3.amazonaws.com/0/135478/19aea286-465c-ea80-3d90-1f7989cad947.png)

# コード
これだけ

```
tableView.tableFooterView = UIView(frame: .zero)
```
TensorFlow > link > tf.argmax( , 0) > you will get the argmax of each individual column

TensorFlowというDeep Learning関連コードを学習中。
https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#tensorflow-mechanics-101

```py
  with tf.name_scope('accuracy'):
    with tf.name_scope('correct_prediction'):
      correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
```

tf.argmax()で検索していて以下を見つけた。

http://stackoverflow.com/questions/38094217/tensorflow-argmax-min

> answered Jun 29 at 8:53
> lballes
> Think of the dimension argument of tf.argmax as the axis across which you reduce. tf.argmax(arr, 0) reduces across dimension 0, i.e. the rows. Reducing across rows means that you will get the argmax of each individual column.

`tf.argmax( ,0)`を使う日が来るか不明だが使いたい時ようのメモとして残しておく。
TensorFlow > def nn_layer(input_tensor, input_dim, output_dim, layer_name, act=tf.nn.relu): > 活性化関数を切替えしやすくしている

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
```

TensorFlowというDeep Learning関連コードを学習中。
https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#tensorflow-mechanics-101

mnist_with_summary.pyについて

```py
  def nn_layer(input_tensor, input_dim, output_dim, layer_name, act=tf.nn.relu):
    """Reusable code for making a simple neural net layer.

    It does a matrix multiply, bias add, and then uses relu to nonlinearize.
    It also sets up name scoping so that the resultant graph is easy to read,
    and adds a number of summary ops.
    """
    # Adding a name scope ensures logical grouping of the layers in the graph.
    with tf.name_scope(layer_name):
      # This Variable will hold the state of the weights for the layer
      with tf.name_scope('weights'):
        weights = weight_variable([input_dim, output_dim])
        variable_summaries(weights, layer_name + '/weights')
      with tf.name_scope('biases'):
        biases = bias_variable([output_dim])
        variable_summaries(biases, layer_name + '/biases')
      with tf.name_scope('Wx_plus_b'):
        preactivate = tf.matmul(input_tensor, weights) + biases
        tf.histogram_summary(layer_name + '/pre_activations', preactivate)
      activations = act(preactivate, name='activation')
      tf.histogram_summary(layer_name + '/activations', activations)
      return activations
```

上記の

```
  def nn_layer(input_tensor, input_dim, output_dim, layer_name, act=tf.nn.relu):
```
と以下にて活性化関数をReLU以外に切替えしやすくしている。

```
      activations = act(preactivate, name='activation')
```

関連
深層学習 by 岡谷貴之さん 2.2 活性化関数
TensorFlow > with tf.name_scope('summaries'): > Scopeの分割

TensorFlowというDeep Learning関連コードを学習中。
https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#tensorflow-mechanics-101

mnist_with_summary.pyについて

```py
  def variable_summaries(var, name):
    """Attach a lot of summaries to a Tensor."""
    with tf.name_scope('summaries'):
      mean = tf.reduce_mean(var)
      tf.scalar_summary('mean/' + name, mean)
      with tf.name_scope('stddev'):
        stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
      tf.scalar_summary('stddev/' + name, stddev)
      tf.scalar_summary('max/' + name, tf.reduce_max(var))
      tf.scalar_summary('min/' + name, tf.reduce_min(var))
      tf.histogram_summary(name, var)
```

`with tf.name_scope('summaries'):`という構文を未消化だった。


http://qiita.com/sergeant-wizard/items/c98597b8add04b8eea0b
> このままではデータ量が多くやや複雑なので、with tf.name_scope('hoge') as scope:を使ってScopeを分割してみます。

リンク先の例がわかりやすい。

mnist_with_summary.pyのコードで上記のようにScope分割しているが、分割したもの(summariesのScopeなど)を他で使っている感じがしない。このあたりは未消化。


### 試しに変更

```py
  def variable_summaries(var, name):
    """Attach a lot of summaries to a Tensor."""
    with tf.name_scope('summaries'):
      mean = tf.reduce_mean(var)
      tf.scalar_summary('mean/' + name, mean)
      with tf.name_scope('stddev'):
        stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
      tf.scalar_summary('stddev/' + name, stddev)
      tf.scalar_summary('max/' + name, tf.reduce_max(var))
      tf.scalar_summary('min/' + name, tf.reduce_min(var))
      tf.histogram_summary(name, var)
```

を

```py
  def variable_summaries(var, name):
    """Attach a lot of summaries to a Tensor."""
#    with tf.name_scope('summaries'):
    mean = tf.reduce_mean(var)
    tf.scalar_summary('mean/' + name, mean)
    with tf.name_scope('stddev'):
      stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
    tf.scalar_summary('stddev/' + name, stddev)
    tf.scalar_summary('max/' + name, tf.reduce_max(var))
    tf.scalar_summary('min/' + name, tf.reduce_min(var))
    tf.histogram_summary(name, var)
```

としてみたが、TensorBoard上の表示は変化ないように見える。

コードにおいてScopeを識別して使う時があるのだろうか。


http://www.mwsoft.jp/programming/tensor/tutorial_tensorboad.html
を見るとTensorBoardのGraph表示で違いが出てくるようだ。

あらためてTensorBoardのGraphを見ても'summaries'や'stddev'の表記は見つかっていない。
他の例をこなすうちにわかるだろう。

### 見つけた

layer1の下にweightsがあり、weightsの下にsummariesがある。summariesの中にstddevがある。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/48b6795e-9a21-01c0-5348-aaff4e63f5b7.png)

TensorBoardのGraphを見やすくできるようだ。
python > os.path.join('data', 'checkpoint') > 'data/checkpoint'となる on linux

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
```

TensorFlowというDeep Learning関連のもので、pythonコードを学習中。
https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#tensorflow-mechanics-101

```py
flags.DEFINE_string('train_dir', 'data', 'Directory to put the training data.')
...
        
checkpoint_file = os.path.join(FLAGS.train_dir, 'checkpoint')
```

上記をideoneで実装してみた。

http://ideone.com/v9DXUH

```py
# your code goes here
import os.path

train_dir = 'data'
print train_dir

train_file = 'checkpoint'
print train_file

train_path = os.path.join(train_dir, train_file)
print train_path
```

```txt:結果
Success	time: 0.01 memory: 9024 signal:0
data
checkpoint
data/checkpoint
```

`/`が自動的に付加されるようだ。
Androidで、アプリ(apk)の署名が、SHA256とSHA1のどちらか確認したい時

あくまで確認用の手順です。
#apk(zip圧縮されたファイル)から、署名を取り出す
ファイルは、(展開したapk\) META-INF\cert.rsa など。

#keytoolで確認する
keytool -printcert -file cert.rsa
※keytoolは、(jdk\) bin\keytool などにあるはず。

(結果の例)
・・・
署名アルゴリズム名: SHA256withRSA
・・・

#参考　(確認方法)
[Stackoverflow - How do I find out which keystore was used to sign an app?]
http://stackoverflow.com/questions/11331469/how-do-i-find-out-which-keystore-was-used-to-sign-an-app

#参考　(SHA256サポート状況)
Android 2.3以降 とする例が多い。(サイトによる)
端末ごとの利用可否は、必要に応じて検索して下さい。

中間証明書の問題もあるので、参考程度に。

[digicert] 2.3+
https://www.digicert.com/sha-2-compatibility.htm

[globalsign] 1.0+ (1.6 / 2.2)
https://support.globalsign.com/customer/portal/articles/1499561-sha-256-compatibility

[symantec] 2.3+
https://knowledge.symantec.com/support/ssl-certificates-support/index?page=content&id=SO25586

#蛇足1　なぜ確認したかったか
・SHA1からSHA256への移行時期がせまっている。
(完全移行した場合は、動作対象から一部の端末を切り捨てることになる)
※SHA256のサポートは、(最低レベルはあるが)APIレベル依存ではなく、端末依存です。

・(古い端末では、)Playストアやアプリが、「安全性の低いアプリの許可」を有効にしないと利用できない場合があるので、気になった。
※実際はInApp-Billingなどの通信の問題(データの署名などがSHA1)だと思いますので、アプリの署名自体は直接影響なさそうですが・・
逆に、InApp-Billingを使っていれば、新しい端末でも影響を受けそうです。

ということで、Playストアについては、要調査。
(通常のエミュレータ(AVD)では調査できないような気もしますが。)

アプリ(アイテムの購入処理など)については、回避手段・・を探すところから。


#蛇足2(というより、メモ)
さらっと書いてある制限。
(有効期間25年などにしてあれば、大丈夫。短くする場合は要注意。)
https://developer.android.com/guide/publishing/app-signing.html?hl=ja#cert
アプリケーションを Android マーケットに公開する予定の場合、2033 年 10 月 22 日までの有効期間が必要です。有効期間がこの日付以前に期限切れになるキーで署名されたアプリケーションは、アップロードできません。
TensorFlow > tf.train.SummaryWriter() > add_summary()したらflush()

TensorFlowというDeep Learning関連のコードを学習中。
https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#tensorflow-mechanics-101

以下の記載が気になった。

```py
        summary_str = sess.run(summary, feed_dict=feed_dict)
        summary_writer.add_summary(summary_str, step)
        summary_writer.flush()
```

flush()を使っている。

http://stackoverflow.com/questions/34427209/save-tensorflow-graph-for-viewing-in-tensorboard-without-summary-operations
においてもadd_summary()したらflush()しますという回答がある。summary書込みは非同期書込とのこと。

flush()しない場合は、すぐに書込みされず、TensorFlowのシステムにより「あるタイミング」で書込みされるのだろう。そして、停止のタイミングによってはサマリがまだ書き込まれない状況が発生する (stackoverflowの質問者の状況)。
python > link > range() / xrange()

TensorFlowというDeep Learning関連のもので、pythonコードを学習中。
https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#tensorflow-mechanics-101


http://qiita.com/7of9/items/e184bde61545da9267c5
において気になったrange()とxrange()について。


http://nonbiri-tereka.hatenablog.com/entry/2014/10/24/102639
> xrangeの方が早いですね。必要に応じて値を取り出しているからなのでしょうか。
但し、メモリは間違いなくxrangeが少ないので、メモリを大量消費する場面ではxrangeを使っていきましょう。

メモリ使用効率が違うということらしい。

xrangeを使います。
python > from six.moves import xrange > Six: Python 2 と 3 の互換性ライブラリ > python2: xrange() / python3: range()

TensorFlowというDeep Learning関連のもので、pythonコードを学習中。
https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#tensorflow-mechanics-101

その fully_connected_feed.py にある以下の記述について

```py
from six.moves import xrange  # pylint: disable=redefined-builtin
```

http://hhsprings.bitbucket.org/docs/translations/python/six-doc-ja/
> Sixは、Python 2 と Python 3 の間の違いを吸収するためのシンプルなユーティリティを提供します。

同じページの下の方に対応表がある。

| Six名 | Python2名 | Python3名 |
|:-:|:-:|:-:|
| ... | ... | ... |
| range | xrange()  | range |
| ... | ... | ... |

Six名にすることでPython3対応しやすくするのだろう。

しかしながら fully_connected_feed.py においては以下のように Python2名で記載しているので、Python3対応するときに結局書き直さないといけない。

```py
    # Start the training loop.
    for step in xrange(FLAGS.max_steps):
```

ためしに以下のようにしても実行でき、Precisionも同様になった。

```py
    # Start the training loop.
    for step in range(FLAGS.max_steps):
```

元々の fully_connected_feed.py において、以下をコメントアウトしても動作に問題ないので、結局Sixは使われていないような気がする。

```
from six.moves import xrange  # pylint: disable=redefined-builtin
```
技術英語 > Most of the information in this chapter is detailed and [pragmatic].

@ Code Complete (No. 14132 / 36077)

> Most of the information in this chapter is detailed and <font color=red>pragmatic</font>.

http://ejje.weblio.jp/content/pragmatic
> 実用本位の、実際的な

<hr>
practicalとどう違うかというと

https://hinative.com/ja/questions/168660
> Pragmatic and practical are very similar, but practical is used much more often than pragmatic is.

...
> The only difference I can think of is that pragmatic also serves as the opposite of dogmatic,
Androidでplayストアにログインできない(パスワード入力でエラーになる)場合

#**未公開アイテムを購入しようとした場合も、エラーになります。要注意。**
公開アイテムが購入できる場合は、本ページの現象とは別件です。

アイテム自体を登録していない(skuが一致しない)場合：アイテムの情報が取得できません。
公開していないアイテムの場合：「認証が必要です。Googleアカウントにログインして下さい」などが表示されます。
この場合は、エラー内容と現象が一致しないので、分かりにくいです・・

#現象 Androidでplayストアにログインできない(パスワード入力でエラーになる)
(例)
・アプリ内での購入処理時に、「パスワードの確認」ダイアログで、「入力したパスワードが正しくありません。」というメッセージが表示されます。
・Playストアで「購入時に認証が必要」で「30分毎」等を選択した場合に、赤い「！」と吹き出しが表示されます。
・Webブラウザからであれば、Googleアカウントにログインできます。

#対処法
##一般的な解決法を試します。
###多くの人が書いているので、詳細は、検索で。
検索用キーワードの例：「google playストア パスワードエラー」
出てこない場合は、「パスワードエラー」を「ログインエラー」に変えてみます。

###(探すのが面倒な方用に)
一般的な解決法の例：
※試す前に、ブロック通知のメールが来ていないか確認した方が良いかと思います。
※この解決法は、ログイン画面自体が開かない場合(Playストアに接続できないなど)の解決法も含みます。
※Playストアに接続できない(≒アプリをダウンロードできない)場合は、その事を忘れずに。
　特に、アップデートの削除などを試す時など。

・少し待ってから試してみます。(この手順を書いていない場合が多い)
　※Playストアは、かなり気まぐれ。
　(蛇足：他のGoogle Play開発者サービスでも、タイムアウトが発生しやすいものがある)
・時間を修正します。
・スマートフォンを再起動します。(この手順を書いていない場合が多い)
　※この時点でつながる可能性があります。(必要なサービスが止まっているetcが原因の場合)
・Playストアのキャッシュ削除
・Playストアのデータ削除
　※データ削除後は、Playストアの設定を見直しましょう。(特に自動更新関連)
・Playストアのアップデートの削除
　※古い環境では、マーケットアプリのみが残ります。
　(マーケットアプリを起動すると、Playストアにアップデートされます)
・Google Play開発者サービスのキャッシュ削除
・Google Play開発者サービスのデータ削除

####　補足：Google Play開発者サービスは、英語だとGoogle Play Services。
パッケージ名はcom.google.android.gms　(Playストアのアドレスを参照)

###ブロック通知のメールが来ている場合は、一般的な解決法の手順を省略します。
(例)
ブロックされたログインについてご確認ください
安全性の低いアプリからの Google アカウント　～～　へのアクセスをブロックしました。

##一般的な解決法を試しても解決しない場合は、「安全性の低いアプリの許可」の設定を見直します。
WebブラウザでGoogleアカウントを開き、
アカウント情報/ ログインとセキュリティ/ 接続済みのアプリとサイト から、
「安全性の低いアプリの許可」を有効に設定する。
※当然、セキュリティリスクは上昇しますので、適宜対策を。
※他アプリがブロックされて、巻き込まれているだけの場合もあります・・

---
めも1。
Playストアに繋がらない場合は、「アカウントと同期」の設定にエラーなどが表示されている事が多い(？)

例：
・同期エラー　(時計がずれすぎた時などに発生？)
　「現在同期で問題が発生しています。」などのメッセージが表示される。

・同期項目のリストの中身が少ない　(ファクトリーリセット時など)
　表示されている同期項目が3個程度(「ユーザーの詳細を同期」など)しかない。
　「アプリデータを同期」が表示されていない。

---
めも2。
Googleサービスフレームワークのキャッシュ、データ削除が必要という説もありますが、少しリスキー。(ファクトリーリセットで直る場合は、これと同件？)
Google Talkが～という話題で出てくるのが、これ。

参考(2次ソース)：
[Googleサービスフレームワークのデータ削除とは何をしているのか？]
http://chimtty.blogspot.jp/2012/12/google-androidjp.html

[Googleサービスフレームワークのデータ削除に伴うリスクについて]
http://chimtty.blogspot.jp/2013/11/google-androidjp.html

> this invalidates the tokens used by any app that uses GCM (which is nearly all the Google apps, and a ton of third-party apps.)

(Googleサービスフレームワークのデータを削除すると)
GCMを使う全てのアプリのトークンを無効化します。(ほぼ全てのGoogleアプリ、そして、多くのサードパーティアプリが該当します。)

---
めも3.　Playストアアプリの状態を確認した方がよい場合もあります。
アプリからPlayストアの状態を取得できない場合、
Playストアアプリを開いてみると、
「アプリとゲーム」画面や、「マイアプリ&ゲーム」画面などで、
ネットワークが有効な場合でも、
「接続を試してお試しください。」と表示される場合があります。
同画面の「再試行」ボタンをタップしても、表示が変わらない場合があります。
※通常は、画面左の「設定」などのメニューが表示された状態になります。
　この現象が発生した場合は、メニューが非表示で、他画面を操作できるようになっています。
(実験した時のバージョン：6.2.02.A-all [0] 2730934)
(おそらく、キャッシュの有効期限が切れると発生。
再現した時は、前回起動から約1日後など。
ただし、100%再現するとは限りません。)

また、Playストアアプリを開いた後に、(「接続を試して・・」が起きた場合は？)
ネットワークが切断されている事もあります。
(これが原因とも言えますが・・)

注：
Playストアアプリで正しく表示できない場合も、
他のアプリからPlayストアの状態を取得できる場合があります。

ここで確認するのは、
他のアプリで表示できない => Playストアアプリでも表示できなくなっている
という現象です。
Google Cloud Platform で Ubuntu python 開発環境を構築する

#はじめに

[Google Cloud Platform](https://cloud.google.com/?hl=ja)


#新規作成

まず下記のサイトにアクセスします。
[Google Cloud Platform](https://cloud.google.com/?hl=ja)

[コンソールへ移動をクリック](https://console.cloud.google.com/iam-admin/projects?hl=ja)

![gcp.PNG](https://qiita-image-store.s3.amazonaws.com/0/142847/9e48f0b3-8114-2a78-4f1d-6ffa02e5b517.png)

プロジェクトを作成をクリック

![gcp2.PNG](https://qiita-image-store.s3.amazonaws.com/0/142847/0ce4c197-2790-dfd3-4679-c9af036a6e19.png)

プロジェクト名を入力して作成ボタンをクリック

![gcp3.PNG](https://qiita-image-store.s3.amazonaws.com/0/142847/0b439e4e-6064-0a8f-cc0b-0c9c67048dec.png)

左のメニューからCompute Engine をクリック

![gcp7.PNG](https://qiita-image-store.s3.amazonaws.com/0/142847/8b78bf7a-74cc-7098-e65c-c90d08c336c4.png)

Compute Engine が初期化されるまで待機

#仮想マシン インスタンスを作成する

1.[インスタンスを作成] ボタンをクリックする

![gcp8.PNG](https://qiita-image-store.s3.amazonaws.com/0/142847/d416e048-d633-ecaf-af6c-cb81fef89240.png)

2.ブートディスク イメージを選択する
ブートディスク セクションで [変更] をクリックし、ブートディスクの設定を開始します。 

[OS イメージ] タブで Ubuntu 16.04 LTS を選択し、[選択] をクリックします。

3.HTTP トラフィックを許可する
ファイアウォール セクションで [HTTP トラフィックを許可する] を選択します。

4.[作成] ボタンをクリックする
[作成] ボタンをクリックして、インスタンスを作成します。

![gcp9.PNG](https://qiita-image-store.s3.amazonaws.com/0/142847/6c73f050-228f-a501-5bf1-e170cbf763a3.png)

```text
インスタンスが作成されたら、GCE 価格設定に従って請求先アカウントへの課金が開始します。
余分に課金されることがないよう、後でインスタンスを削除します。
```

#インスタンスに接続する

VM インスタンスが作成されている場合は、右側の [SSH] ボタンをクリックし、ブラウザウィンドウで開くをクリック

![gcp11.PNG](https://qiita-image-store.s3.amazonaws.com/0/142847/cf446284-3f83-e4f7-1632-4c45e447f902.png)

VM インスタンスへの SSH [接続]をクリック

![gcp12.PNG](https://qiita-image-store.s3.amazonaws.com/0/142847/8a67802f-951d-ba95-7e0f-519f8c4f31ab.png)

ubuntu のコンソールが起動します

![gcp13.PNG](https://qiita-image-store.s3.amazonaws.com/0/142847/edc3a962-5ddc-632f-1e6d-281c3a23225d.png)

#python を動かしてみる

はじめに私のソースコードをダウンロードしてみます。
下記のコマンドを入力
`$ git clone https://github.com/sasaco/tf-dqn-reversi.git`

![ubuntu1.PNG](https://qiita-image-store.s3.amazonaws.com/0/142847/1bf62078-8474-9cdd-b0b2-d964d384164a.png)

下記のコマンドを入力
`$ cd tf-dqn-reversi`

下記のコマンドを入力
`$ python train.py`

どうでしょう
私のソースコードでは、`日本語使えません` みたいなエラーが出ました
python コード またはコメント行 に 日本語は使えないみたいですね
簡単なシェルコマンドの備忘録

### 下記のtest.txtのabで始まるレコード数をカウントする

```text:test.txt
abc
bcd
efg
abc
abcd
ab
1abc
1ab
```

```shell-session
cat test.txt|grep '^ab'|wc -l

#=>   4
```
### 上記のtest.txtのabで始まるレコードを、レコード内容でまとめて出現数をカウントする

```shell-session
cat test.txt |grep '^ab'|uniq -c

#=>   2 abc
#=>   1 abcd
#=>   1 ab
```

### カレントディレクトリ以下のファイルをgrepしてabで始まるレコードを検索する(通常のgrepでファイル検索するよりも高速)
```shell-session
find . -type f -print0|xargs -0 grep '^ab'

#=> ./test.txt:abc
#=> ./test.txt:abc
#=> ./test.txt:abcd
#=> ./test.txt:ab
```

### 特定のプロセスをまとめて停止させる
```shell-session
ps ax|grep -i xxxx|grep -v grep|awk '{print $1}'|xargs kill -9
```

### カレントディレクトリ以下のファイルを条件検索して、該当ファイルを50ファイルづつまとめて消去する

```shell-session
#9日前のファイルを消す
find . -type f  -mtime 9 | xargs -n50 rm -f

#9日前を範囲指定する場合は9ではなく -10 と +8 で指定する
find . -type f  -mtime -10 -mtime +8 | xargs -n50 rm -f

# 上記条件に ファイル名がtestで始まるものという条件を追加する
find . -type f  -mtime -10 -mtime +8 -name "test*" | xargs -n50 rm -f
```

### xargsで標準入力を操作するコマンドでないコマンドを使用する

xargsに -I オプションを使い、置換用の文字を指定する

```shell-session
# カレントディレクトリ以下のファイル名がtで始まるtxtファイルを .tmpという拡張子をつける
find . -type f -name "t*.txt" -print0 | xargs -0 -I% mv % %.tmp

```

### xargsで実行するコマンドを複数続ける

コマンドを直接渡すのではなく、sh -c にスクリプトとして記載するとよい

```shell-session
# カレントディレクトリ以下のファイル名がtで始まるtxtファイルの内容をoutというファイルにバックアップして ファイル名に.tmpという拡張子をつける
find . -type f -name "t*.txt"  -print0 | xargs -0 -I% sh -c "cat % >>out;  mv % %.tmp"
```


### ssh 公開鍵/秘密鍵の作成
セキュリティが高いed25519形式で作る

```shell-session
# 作成
ssh-keygen -t ed25519 -C "コメント" -f "ファイル名"

＃ 公開鍵/秘密鍵の形式確認
ssh-keygen -l -f "ファイル名"
#=> 256 xxxxxxxxxxxx (ED25519)
```

## SSL関連

### key/csrファイルの発行
[Symantecのcsr発行手順を参照](https://knowledge.symantec.com/jp/support/ssl-certificates-support/index?page=content&actp=CROSSLINK&id=SO23384)

- keyの作成
  

```shell-session
# ssl private keyの作成
openssl genrsa -des3 -out server1.key 2048

# keyよりパスフレーズを解除する
openssl rsa -in server1.key -out server1.key 
```

 - csrの作成
シマンテックの説明ページでは、CAにsha-2署名crt証明書発行依頼でも、csrはsha-1署名のままでOKとなっているが、二つの署名のアルゴリズムが異なっているのは気持ち悪いのでここの説明ではsha−2(sha256)で作成する

```shell-session
# csr
openssl req -sha256 -new -key server1.key -out server1.csr

```

### ここの説明用に自己署名証明書を発行する

```shell-session
# 自己署名証明書
openssl x509 -sha256 -days 365 -req -signkey server1.key  < server1.csr >server1.crt
```

### 各ファイルの確認コマンド

- keyファイル

```shell-session
# text 形式での確認
openssl rsa -noout -text -in server1.key

```
- csrファイル

```shell-session
# text 形式での確認
openssl req -noout -text -in server1.csr
```

- crtファイル

```shell-session
# text 形式での確認
 openssl x509 -noout -text -in server1.crt
```

- csrファイルがそのkeyファイルを使用しているのかを確認する

```shell-session
# diffで確認、出力がない場合には、該当keyを使用している
diff <(openssl req -noout -modulus -in server1.csr) <(openssl rsa -noout -modulus -in server1.key)
```

- crtファイルがそのkeyファイルを使用しているのかを確認する

```shell-session
# diffで確認、出力がない場合には、該当keyを使用している
diff <(openssl x509 -noout -modulus -in server1.crt) <(openssl rsa -noout -modulus -in server1.key)
```
run-sequenceでgulp-eslintを実行した時にエラーでもタスクを続行する方法

Gulpでタスクの直列/並列処理をする場合にお世話になる[run-sequence](https://www.npmjs.com/package/run-sequence)。

Browserifyタスクを実行する直前にESLintを実行したいな〜、と思ってタスクを書いたんですが、上手く動きませんでした。
ESLint実行時にLintに引っかかってしまった場合、エラーが出てその場でrun-sequenceのタスクが終了してしまいます(本来は正しいのかも知れないけど)。

## うまく動かない書き方
`path`は各種ファイルのパスをまとめて書いているJSです。

```js:esLint.js
import gulp from 'gulp';
import path from '../path';
import plumber from 'gulp-plumber';
import esLint from 'gulp-eslint';

gulp.task('esLint', () => {
  return gulp
    .src([
      path.source.javascripts + '**/*.{js,jsx,vue}',
      '!' + path.source.javascripts + 'lib/**/*'
    ])
    .pipe(plumber())
    .pipe(esLint({
      useEslintrc: true
    }))
    .pipe(esLint.format())
    .pipe(esLint.failAfterError());
});
```

```js:default.js
import gulp from 'gulp';
import runSequence from 'run-sequence';

gulp.task('default', () => {
  runSequence('esLint', 'browserify', 'watch');
});
```

エラーが出てもタスクを続行できる[gulp-plumber](https://www.npmjs.com/package/gulp-plumber)を使ってるのに、なんでか止まっちゃう。


## 参考になった記事
[gulp-sass, gulp-plumberを使うときの注意 - Qiita](http://qiita.com/Quramy/items/5491d8da29d1fe047464)

まさにこれで、解決しました。ありがとうございます。


## うまく動く書き方
```js:esLint.js
import gulp from 'gulp';
import path from '../path';
import plumber from 'gulp-plumber';
import esLint from 'gulp-eslint';

gulp.task('esLint', () => {
  return gulp
    .src([
      path.source.javascripts + '**/*.{js,jsx,vue}',
      '!' + path.source.javascripts + 'lib/**/*'
    ])
    .pipe(plumber({
      errorHandler(err) {
        console.log(err.message);
        this.emit('end');
      }
    }))
    .pipe(esLint({
      useEslintrc: true
    }))
    .pipe(esLint.format())
    .pipe(esLint.failAfterError());
});
```

`default.js`は上と同じ。
これで、esLintでエラーが出ても、run-sequenceが最後まで動くようになりました。


### 余談: `this.emit()`の`this`について
ここの`this.emit()`の`this`なんですが、その外側の`errorHandler`関数の書き方がちょっと変わっている。
`plumber`関数の引数にオブジェクトが入っており、そこで`errorHandler`関数を定義しています。
ES2015の関数の書き方だと、パッと見、以下のようになりそうな気がしませんか。

```js
plumber({
  errorHandler: (err) => {
    this.emit('end');
  }
});
```

でも、これだと`this`は`undefined`になってしまうんですよね。正解は以下です。

```js
plumber({
  errorHandler(err) {
    this.emit('end');
  }
});
```

こう書くことで、`this`がちゃんとこのオブジェクト(`pipe`に入っている`Transform`オブジェクト)を指すようになります。


## まとめ
無事にESLintできるようになって良かったです。
とはいえ、エラーが出てもそのままタスクを続行できるのは、開発時はいいけど、本番用にファイルをビルドするときはダメですよね。
なので、その場合は環境変数などで条件分岐して、デフォルト通りエラーが出たらタスクを途中で終了するようにすればいいと思います。

Browserify/WatchifyでJSをコンパイルする時に、関数の中でESLintを動かしていたんですが、タスクを切り出したことで、汎用性が高くなったので良かったです。
MIDIの演奏楽器を変更する

# はじめに
TensorFlow製の音楽生成プロジェクト「[Magenta](https://github.com/tensorflow/magenta)」をいじっています。

参考：[サカナクションさんをTensorFlow製アート・音楽生成プロジェクト「Magenta」に学習させてみる。]
(http://qiita.com/tackey/items/1295a0347a8b4cc30d46)

その過程で、MIDIファイルの演奏楽器を変換したいと思い、[pretty_midi](https://github.com/craffel/pretty-midi)を用いて変更してみます。
なお、環境はPython2.7、MIDIファイルはlogic Xでみたりしています。


# コード例
```sample.py
import pretty_midi

# 変更したいファイルの読み込み
midi_data = pretty_midi.PrettyMIDI('piano.mid')

# 楽器の確認
midi_data.instruments[0].program

# 結果
# [Instrument(program=0, is_drum=False, name="hoge")]


# program(楽器番号)を変更
midi_data.instruments[0].program = 30

# 楽器の確認
midi_data.instruments

# 結果
# [Instrument(program=30, is_drum=False, name="hoge")]

# ファイルの書き出し
midi_data.write('guitar.mid')

```

# おわりに

簡単に楽器の変更ができました。
ありがとうございました。