OmniAICreator/Qiita-1.07M huggingface dataset:
SearchConsoleのサイトエラーを巡回してステータスを確認する

日々サイトの運用やってて気になるのがSearchConsoleのサイトエラーです。
1件2件なら目視で確認できるけど、何故か大量に出ることがあるのでチェックができなくて困ってしまいます。それならPython使って巡回してステータスだけでも確認したほうが良さげです。
SearchConsoleはGoogleのクローラーが読みに来たタイミングでステータスを計測しているので、今チェックしたらエラーじゃないパターンは結構あります。なので絶対鵜呑みにしてはいけません。

SearchConsoleのクロールエラーの欄には直近発生したエラーが表示されており、1000件までDLできるようになっています。以下のような感じです。

```
URL,レスポンス コード,ニュースのエラー,最終検出,カテゴリ,プラットフォーム,前回のクロール
https://vegewel.com/ja/area/153,404,,18/06/03,見つかりませんでした,PC,18/08/11
https://vegewel.com/ja/area/162,404,,18/06/22,見つかりませんでした,PC,18/08/05
https://vegewel.com/ja/area/122,404,,18/06/03,見つかりませんでした,PC,18/08/05
https://vegewel.com/ja/area/37,404,,18/06/14,見つかりませんでした,PC,18/07/23
https://vegewel.com/ja/area/69,404,,18/06/02,見つかりませんでした,PC,18/07/28
https://vegewel.com/ja/restaurant/73,404,,16/12/14,見つかりませんでした,PC,18/08/16
https://vegewel.com/en/area/162,404,,18/06/03,見つかりませんでした,PC,18/07/31
https://vegewel.com/ja/restaurant/267,404,,17/02/22,見つかりませんでした,PC,18/08/16
https://vegewel.com/ja/restaurant/635,404,,17/02/25,見つかりませんでした,PC,18/07/04
https://vegewel.com/en/restaurant/129,404,,18/04/26,見つかりませんでした,PC,18/08/05
https://vegewel.com/ja/restaurant/931,404,,18/05/15,見つかりませんでした,PC,18/08/11
https://vegewel.com/ja/restaurant/34,404,,17/02/23,見つかりませんでした,PC,18/08/03
```

これを全部1ページずつ開いて確認するのは厳しいという話です。

ということで自分のPCがMacという前提で話を進めます。まずはPython3のインストールから。
MacのパッケージインストールではおなじみのBrewを使います。

``` sh
$ mkdir crawl_checker #巡回プログラム専用のディレクトリ作成
$ cd crawl_checker/
$ which python3 # Pythonの最新版の存在確認
$ brew install python3 # なかったのでインストール
Error: python 2.7.14_3 is already installed
To upgrade to 3.7.0, run `brew upgrade python`
$ brew upgrade python # インストール途中で怒られたのでupgradeで再インストール
$ which python3 # インストールを確認
/usr/local/bin/python3
$ python3 --version # Pythonの詳細バージョンの確認
Python 3.7.0
$ pip3 install requests
```

ここまで出来たら次はURLを簡単に扱えるRequestsモジュールをインストールします。

``` sh
$ pip3 install requests
```

そこまで出来たら以下は巡回用プログラムです。ちなみに現在のcrawl_checkerディレクトリにSearchConsoleのサイトエラーの一覧をCSVダウンロードしたもの（vegewel-com_20180805T003433Z_CrawlErrors.csv）を置いています。

```python
import requests
import csv

csv_file = open("./vegewel-com_20180805T003433Z_CrawlErrors.csv", "r", encoding="utf-8", errors="", newline="" )

f = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n")
header = next(f)
print(header)
for row in f:
    resp = requests.get(row[0])
    print ('Code = {0} URL = {1}'.format(resp.status_code, row[0]))
```

そして実行。

``` sh
$ python3 access_test.py
Code = 200 URL = https://vegewel.com/en/knowledge_sprouts/31/
Code = 404 URL = https://vegewel.com/en/station/5248/
Code = 404 URL = https://vegewel.com/en/menu/826
Code = 404 URL = https://vegewel.com/ja/product/17
```

バッチで定期的に回すもよし。いろいろ応用範囲も多いかと思います。是非ご活用ください。
社外秘を誤ってクライアントにメール送信！Outlook で誤送信対策

社内で原価情報をよりによってクライアントに送信する事案が発生。
コストには「Customer price」と「working cost」がある。
前者はお客さんに提示する価格で後者は実際にかかる費用。なぜ差分があるかというと、スタッフ部門、光熱費、宣伝費、事務所のレンタル、来年度の投資などさまさまな費用がかかるから。

WCに1.3倍くらいしたのがCPになる。

たとえばプログラム開発を１００万で行う場合、請求額は１３０万となる。

この計算式でWCが書かれたエクセルをクライアントに送付。

精神論で気をつけるのには限界があり、機械的に実現することとした。しかし市販の誤送信対策であるソフト（GuardianwallやActiveZoneがとても有名）は高すぎる。

まずは Outlook のVBA マクロで実現することとした。
・重要なメールはメール本文に「社外秘」と記載する。「社外秘」と記載されたメールはメール送信時に警告する。
・社外メールはzip暗号化を必須。zip以外の添付ファイルは送信を無効化。
・メール送信時に最終確認。面倒だが、深呼吸して最終確認。
・メール宛先が社内か社外か。社外なら警告する。


こちらを参考にしました。

http://tooljp.com/qa/recommended-VBA-samples-Outlook-prevent-mail-incorrect-sending-B42C.html
Unity：C#で生成したScriptableObjectのデータがPlayすると消える

CSVからScriptableObjectに変換するプログラムを書いていたら、
Play後にScriptableObject内のデータが消えてしまう状況が発生。

どうやら、プログラムで生成した後に

```
EditorUtility.SetDirty
```
を呼び出さないと、値が保存されないみたい。
（これしないと、インスペクターでデータが入っているように見えるだけという罠...orz）

↓あと、このブログにも書かれているように
http://trapezoid.hatenablog.com/entry/2016/11/07/142059

```
EditorApplication.LockReloadAssemblies
EditorApplication.UnlockReloadAssemblies
AssetDatabase.StartAssetEditing
AssetDatabase.StopAssetEditing
```
の記述も編集前・編集後に入れておいたほうが安全そう。
SMSを導入や運用する際気をつけたいこと

SMSを導入しようとしてもどれが良いかわからない、導入しても運用がうまくいかないといった課題をうまくのりこえられず、導入が頓挫したり導入後に徐々に運用されない場合が多くあります。導入した経験から幾つかのキーポイントを列挙したいです。（2分で読めます）


☆要点
1：安い価格を選ぶ
2：セグメントを行う
3：送信者名仕様に惑わされない
4：ルートをたくさん保有している会社を選ぶ
5：APIがしっかりしている会社を選ぶ
6：偽SMSをブロックしてくれる会社を選ぶ


☆詳細
1：安い価格を選ぶ
ビジネスツールですので、お金が絡んできます。郵送費用より安く、Emailよりコンバージョンが良いということで、15円や10円で導入される企業が多いと思います。導入時はそれでも良いのですが、導入後まで考えると高いです。導入後はお客がどれだけ獲得したか、どれだけアクセスしたかなど導入前と基準が異なります。ある人材紹介会社では送った金額に見合う反応がなかった、契約したけど使用しなかったなどの声が散見されます。またある通販会社では高くて採算が見合わない、資金があるIT企業でも「う～ん、毎年のコスト削減で。。。」と声が聞かれます。海外では一方通行のSMSは1通数円で初期月額がないのが普通です。また安い価格を提示できるのは、採算がとれていて、取り扱い通数が多く、設備もしっかりしている証でもあります。価格（単価）はプロジェクト損益に直結する要素ですので、安い価格（単価）をできるだけ選ぶことが良いと考えられます。
マーケット的には、プラスメッセージ（RCS）でLineと同じようなことを行う方向に目が向いていますので、今後ますますこの傾向が顕著になるのではと個人的には考えています。


2：セグメントを行う
日本ではバルク（一斉）的に送る傾向が多いです。Webマーケティングや通常のマーケティングではよくこういう層でこういう条件を兼ね備えた顧客をターゲットとしてやっていこうと決めますが、現在の日本のSMS送信者ではそうではなさそうです。海外ではセグメントを行うことでコンバージョン率を上げている例が多くあります。このセグメントはエクセル上でもよいですし、CRMやプラットフォーム上で行う方法もあります。是非このセグメントを行うことをおすすめします。SMSは、ハードウェアーや家電とは異なり導入しただけでは、効果は限定的です。セグメントなどを行うことで本来の効果が出始めてきます。あるSMS会社では、プラットフォーム上でセグメントを行える機能を備えていたりしますので、是非このセグメントを行って見てください。


3：送信者名仕様に惑わされない
日本は長く国内通信（電信電話公社）と国際通信（国際電信電話）に棲み分けられていた経緯があり、国内向けと国際向けではその仕様に違いがあり今もその制度上なごりを残しています。
日本では03などで始まる国内電話番号表示されますが、海外から日本に入ってくる国際通信ではアルファベットや乱数で表示されます。日本の法令ではこの仕様から送信者名をこのようにしてくださいという制限はなく、携帯通信会社と日本のSMS会社間でこのような仕様で送信してくださいと民間レベルでの取り決めがある程度です。ですので、乱数表示されていてもなんら問題がないのです。
ここをはき違えると「1．安い価格を選ぶ」に影響を与え本末転倒になってしまいます。
また、SMS送信後に受信者からのCallBackを期待するあまり電話番号表示を選択する顧客もいらっしゃいますが、現実の世界では異なるようです。送信者名よりも、セグメントやタイミング、文面がキーになります。電話番号表示に依存すると当初の予想期待と異なり、思わぬ落とし穴にはまるケースが多くあるようですのでご注意ください。


4：ルートをたくさん保有している会社を選ぶ
通信の世界ではITシステムの不具合から通信がストップすることはつきものです。特にパスワード、PINコードやReminderを送る場合は送信がその時点でストップすると消費者の購入機会を失うばかりでなくビジネスが継続されないので、気をつけるべきです。昔は国際SMSはゲートウェイでブロックされるなどと言われたものですが、現在ではそのようなことはなくなりました。寧ろ国際SMSの方がバックアップがしっかりしている場合が多いです。それはSMSはヨーロッパで生まれたメッセージ形式で様々な自体を想定して運営しているからです。
次に携帯通信会社へ回線を直接収納すると高いと言われますが、取り扱い通数が多いと高くはならない為、「直収だから高い」という文言を聞いたら通数取り扱いが少ないと思った方が良いと個人的に考えます。
3点目として、着信率をよく比較項目に上がりますが、内外比べてもあまり意味がないレベルになっているようです。


5：APIがしっかりしている会社を選ぶ
それぞれの会社がAPIを保有しています。APIはその会社の技術レベルを判断する一つの材料で、どれくらい簡単に接続でき、将来どれくらい拡張できるかを示していると思われます。なぜなら、SMSはあくまでメッセージングの機能の一つでしかなく、SMSで反応がない人は他の方法で連絡するしかないからです。現在のところ接続は1日で行えるのが通常です。


6：偽SMSをブロックしてくれる会社を選ぶ
有名企業の名前を語り、現金やプリペイドカードをだまし取る犯罪が一時より減りましたがまだ後を絶ちません。お化けのように「出た！」では済まされず、折角高い価格で物やサービスを売れるようにブランド化した努力が水の泡になったり、SMSで顧客に連絡する手段を奪われるなどの実害に発展します。SMSが進んでいる海外では、詐欺文句などが入ったり、同じ送信者名を使わせないようにブロックする会社があり、安心感からかその会社がシェアーを伸ばしています。私が調べた限り日本では外資系2社で自主的にブロックしています。お化けのように夏だけ出てくれれば良いのですが、実際は季節を選ばずに出てきますので対策されると良いです。


以上6点ですが、SMSをご検討や運用される方の参考になればと思います。
TOPPERSコンテストで統合仕様書をリッチテキストに取り組んだ話

# モチベーション
（ITRON系）TOPPERSカーネルがμITRON仕様書から拡張したために、TOPPERS統合仕様書が作られたのだが、テキストファイルをPDFにしてリリースされているために、検索しづらい状況にあった。またリンクや見出し機能も無いため、仕様書の利用としては必要な時だけに利用することになっていた。

## これまでの取り組み
Meika氏が[統合仕様書をリッチテキスト化](http://dev.toppers.jp/svn/contrib/ngki_spec_rtf/branches)する取り組みが行われていて、1.4、1.5、3.0系の仕様書をリッチテキスト化する作業を行なっている。（頭が下がります）
私自身は[DITA](http://dita-jp.org/)を使ったマルチドキュメント化を開発者会議などで提案してきたが、なかなか受け入れられない状況にあった。

## 「ドキュメント作成システム構築ガイド」との出会い
なかなかうまく進まないなと思う中、漠然とこんなことをしたいと思っていました。
- リッチテキスト・マルチドキュメントできるファイルフォーマットによる記述
- 仕様書のベースフォーマットが変えられないのなら、リライトする手間をなるべく削減する方法を考える
- 変換（リライト）したフォーマットはテキストベース（ワードは要らない子）
- PDFでは目次、リンク機能が欲しい
- htmlフォーマットも出力できるようにしたい
そんな中でたまたま出会ったのが「[ドキュメント作成システム構築ガイド](https://www.amazon.co.jp/%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E4%BD%9C%E6%88%90%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%A7%8B%E7%AF%89%E3%82%AC%E3%82%A4%E3%83%89-GitHub%E3%80%81RedPen%E3%80%81Asciidoctor%E3%80%81CI%E3%81%AB%E3%82%88%E3%82%8B-%E3%83%A2%E3%83%80%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0-%E4%BC%8A%E8%97%A4%E6%95%AC%E5%BD%A6-ebook/dp/B01DB3G1VO/ref=sr_1_1?ie=UTF8&qid=1533426470&sr=8-1&keywords=asciidoc)」でした。
AsciidocとreStructuredTextでどちらを選ぼうか悩んだのですが、最終的にはDITAで記述するのではという思いがあって、よりライトウェイトな感じのAsciidocを選びました。
本書ではGithubとTravis-CIを使ってドキュメントをGithub Pagesに出力する仕組みが書かれています。
この仕組みを採用させてもらいリッチテキスト化を[取り組みました](https://github.com/mitsut/toppers_kernel_spec)。

# 実際の作業
統合仕様書はPDFになっているので、そこからテキスト文字だけを抜き出すのは時間だけの問題です。
あとは見出し、API、表、などをタグ付けしてコミットしていくだけです。
とりあえず手元のマシンでAsciidoc-pdfを使って出力しながらタグをどんどん入れ込みます
出力品質は時間をかけるればどんどん上がってきますので集中して作業できました。

# TOPPERS活用アイデア・アプリケーション開発コンテストへの応募
こんな作業をしていたのが、ちょうど[TOPPERS活用アイデア・アプリケーション開発コンテスト](https://www.toppers.jp/contest.html)の締め切り間際でした。
応募をためらわれる内容・品質ではありましたが、敷居の低い応募もあるんだよ的な意味合いもこめて[初応募してみました](https://www.toppers.jp/docs/contest/2016/TOPPERS%E7%B5%B1%E5%90%88%E4%BB%95%E6%A7%98%E6%9B%B8%E3%81%AE%E3%83%AA%E3%83%83%E3%83%81%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E5%8C%96.pdf)。
結果、銀賞をいただけました。それなりに需要があるテーマであると思っていただけたのかなと感じています。

# その後の効果
Githubは応募して力尽きた感があるのですが、いくつかasciidocを使った効果がでてきたと感じています。
## 仕事のドキュメントをAsciidocベースに変更した
いままで納品ドキュメントをDITAで書いていたのですが、複数人プロジェクトのPM担当になったのでAsciidocでの作業に移行してもらいました。
最初はMarkdownでやっていたのですが、PDFするツールがWindowsとMacで微妙にかわったり、CSSの有無で簡単なものが見つからなかったので、Asciidocに移行しました。
また同じ時期にTracからGitlabへプロジェクト管理ツールも変えたので、議事録などもAsciidocで書くようにしました。
これでワードファイルを追い出すことに成功しました。パワポやエクセルはそのままですがまあ今の所は良いかなと思っています。

## 本家からリッチテキスト版がでるようになった
開発者会議でasciidocの話をしたところ、同様にTeXでの統合仕様書作成をされているという話があり、であれば、統合仕様書のテキストデータをAsciidocやTeXに変換するスクリプトを作成するハッカソンを高田先生と行いました。スクリプトは高田先生が書いて私の方が仕様書で必要なタグ情報をフィードバックしながらpdfとhtmlで確認するという作業で進めました。ハッカソンの枠では時間が足りませんでしたがその後、先生がスクリプトを作成されて、ベータ版という形でTOPPERSサイトに上がっています。
私ももう少しお手伝いして正式版として品質を上げていきたいです。

## 小さく回す　もしくは　射撃しつつ前進
何度も聞いた（使い古された）言葉ですが、あらためて実感したということで。
とりあえず、手を動かしてコンテストに応募してみよう！という話でした
サウンド取込デバイス

サウンド取込用のデバイスを考えてみました。

* マイコンとコンデンサーマイクを使う
* マイコンとI2Sマイクを使う
* FreeBSDが動くMIPS SOCでUSBオーディオデバイスとマイクを使う

マイコンはATSAM,LPC,STMのARMとかESPを検討して、調べてみたところいくつかの例がありましたが、メモリが小さいため制約が多いようです。おそらく頑張れば録音しながらSDカードに書くとかできるのでしょうが、結構大変そうです。

[FreeBSDでサウンド機能](https://qiita.com/yamori813/items/5e1652b276395b306975)を試したところ、当初ノイズに悩まされましたが、USBデバイスや、[マイクのゲイン](https://qiita.com/yamori813/items/ceb552558937b01bfb63)などを調整したところ、実用になりそうなレベルになりました。こちらはマイコンに比べれば規模や消費電力が大きくなりますが、PCを使うよりはずっと消費電力は小さいです。またネットワークも使えるので、こちらが良さそうです。

普通の人はLinuxなラズパイ使うんでしょうが。ちょっと変わったことが好きなのです。

後日追記：

HardOffのジャンクで324円で購入したAtherosのMIPS SOC AR7161を使ったルーターにFreeBSDを焼き、USBオーディオモジュールとUSBハードディスクを使い作ってみました。当初monoで録音していたところカーネルが落ちていたのですが、ステレオで録音して片チャンだけ使うようにしたところ安定して動くようになりました。44.1kHzモノの1時間の録音でもおおよそ300MByteの容量になり、USBハードディスクなどの外部記憶装置が必要になります。

FreeBSDでUSB Audioモジュールを使うためにはsoundとsnd_uaduioというデバイスが必要になります。soundはカーネルに組み込んでsnd_uaudioはモジュールで利用しています。

使ったUSB Audioモジュールは10年くらい前に買ったPlantronics Plantronics Headsetという製品で中身は、MICRONASというドイツの会社のUAC3556Bというチップを使っていました。マイクは[Macの古いマイク(PlainTalk)](https://qiita.com/yamori813/items/737f54bbcc584df8791e)に電源を付けて使っています。

USB Audioモジュールは中華製のものもいくつかあるのですが、上のモジュールが一番良いような気がしました。
(備忘録)npm auditについて

#発生事例
npm install をしたらエラーが大量発生してハマった。
#エラー内容
エラー文の一番最後にこんなんでました。
`
added 1122 packages from 731 contributors and audited 11127 packages in 54.148s
found 365 vulnerabilities (317 low, 34 moderate, 13 high, 1 critical)
`

#参照記事
npm audit について良記事があったのでメモ。

>[【node.js】npm@6にしたらnpm auditでpackageの脆弱性をチェックできるようになったメモ(tweeeetyのぶろぐ的めも)](http://tweeeety.hateblo.jp/entry/2018/06/15/191121)
[自分用]AtomにパッケージをインストールするAtomコマンドパレット

# ATOMには様々なパッケージ (機能)を追加可能
だけどどうやって? 時間がたてば忘れてしまうので記録として残しておきます。今回はATOMに印刷パッケージをインストールします。
(↑ ATOMには印刷機能が標準装備されていないことを今回初めて知るw)
## 今回採用したパッケージ
- [nobuhitoさんが作ったexport-html package for Atom](https://qiita.com/nobuhito/items/b062a8b423d8117c9c0d)

**インストールから使用方法**
1. Ctrl + [,] でSettingsを開く 
2. [Install] タブをクリックし、検索窓に「export-html」と入力して検索し、Installをクリック。
3. しばらく待つとインストール完了
4. Atom のコマンドパレット(Ctrl + Shift + P) を出してexport html: export と入力して実行すれば、印刷ウィンドウが表示される。

# 今回一番学んだこと?
[nobuhitoさんのexport-html package for Atomの説明で](https://qiita.com/nobuhito/items/b062a8b423d8117c9c0d)
> インストールした後に export-html:export を実行する

...「どこで実行するんだろう?」と思ったらAtom にはコマンドパレット(Ctrl + Shift + Pで出てくる) があり、そこでコマンドが実行できるのだ、というのが今回のハイライト:sparkles:
[THINKBOX](https://www.think-box.co.jp/2017/01/11/column/atom_package_2017_01/)さん、ありがとうございます:heart_eyes:
ssltest で評価結果をBからAにする

[SSL Server Test](https://www.ssllabs.com/ssltest/) での次のメッセージに対する対策です。

```text
This server does not support Forward Secrecy with the reference browsers. Grade capped to B.  MORE INFO »
```

設定変更前
![ssl_aug0501.png](https://qiita-image-store.s3.amazonaws.com/0/179446/09f837c2-975e-5b9e-5a0c-c4f033872e74.png)

設定変更後
![ssl_aug0502.png](https://qiita-image-store.s3.amazonaws.com/0/179446/10df98ed-921e-9cdf-274e-dda17c0d4ee4.png)

サーバーの環境

```text
$ uname -a
Linux ***.co.jp 4.17.11-arch1 #1 SMP PREEMPT Sun Jul 29 10:11:16 UTC 2018 x86_64 GNU/Linux
$ nginx -v
nginx version: nginx/1.14.0
```

/etc/nginx/nginx.conf に次を追加しました。

```text
server {
# 略
       ssl_prefer_server_ciphers  on;
       ssl_ciphers  'ECDH !aNULL !eNULL !SSLv2 !SSLv3';
}
AWSでWordPressをSSL化した際にリダイレクトループを回避する方法

AWSでWordPressをSSL化したらアクセスできなくなった場合の対処法。


```sh:chrome
このページは動作していません
mercari.meta-think.net でリダイレクトが繰り返し行われました。
Cookie を消去してみてください.
ERR_TOO_MANY_REDIRECTS
```

<img width="500" alt="180805_12.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/278045/32b2816d-8709-5c56-884f-47c9010ab436.jpeg">

原因は、ロードバランサーまでの通信がSSLで、EC2までの通信が80番なため、http → https への302リダイレクトループが発生してしまうため。
wp-config.php に以下を追記すればOK。

```php:DocumentRoot/wp-config.php
if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) {
       $_SERVER['HTTPS']='on';
}
```
matplotlib ginputについて

# matplotlibで座標を取得（ミドルクリックで終了）
matplotlibで作成したグラフから、任意の場所をクリックして座標を取得したい。

以下のコードを用いて行った。
やったことは、
・ginputで取得する座標の回数をあらかじめ決めないようにした。
・取得した座標に印をつける。
・印をつけたグラフを保存する。
の3つ。

## サンプルコード
```python
import matplotlib.pyplot as plt
import math

# sin波の作成
x = [i for i in range(1, 100)]
y = [math.sin(0.1*i) for i in x]

def main():
    plt.plot(x, y)

    a = plt.ginput(n=-1, mouse_add=1, mouse_pop=3, mouse_stop=2)
    # n=-1でインプットが終わるまで座標を取得
    # mouse_addで座標を取得（左クリック）
    # mouse_popでUndo（右クリック）
    # mouse_stopでインプットを終了する（ミドルクリック）

    for c, d in a:
        print(c, d)
        plt.plot(c, d, "ro") # グラフ上に座標をマークする

    plt.savefig('fig_test.png')
    plt.show()

if __name__ == '__main__':
    main()

```
## 実行結果
```
C:\Users\devel\Anaconda3\lib\site-packages\matplotlib\backend_bases.py:2453: MatplotlibDeprecationWarning: Using default event loop until function specific to this GUI is implemented
  warnings.warn(str, mplDeprecation)
3.27217741935 0.359258536967
6.74959677419 0.579441226974
9.14032258065 0.835329218063
15.4431451613 0.996003072933
21.0939516129 0.823427451036
24.7887096774 0.561588576433
```
## 画像
![fig_test.png](https://qiita-image-store.s3.amazonaws.com/0/134513/dbbb67a5-56ee-e244-4a94-a85c68332b02.png)

# 参考文献
[Python-matplotlibで画像の座標を読取る](https://qiita.com/damyarou/items/1a054e42f6c7f1488b63#参考サイト)
[matplotlib.pyplot.ginput](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.ginput.html)
Bedelli Askerlik Kredisi Veren Bankalar

![bedelli-askerlik.JPG](https://qiita-image-store.s3.amazonaws.com/0/278447/9c9ea0c4-9d29-2087-361f-5c8bc7ceb999.jpeg)





<a href="https://www.hayatinkalbine.com/ekonomi/en-uygun-bedelli-askerlik-kredisi-veren-bankalar-gunde-16-tl-ye-h133.html">Bedelli Askerlik Kredisi Veren Bankalar </a>

En Uygun Bedelli Askerlik Kredisi Veren Bankalar | Günde 16 TL'ye 15.000 TL Kredi‎ En Uygun Bedelli askerlik kredisi veren bankalar hangileridir, bankaların şartları nelerdir? tüm detayları bu yazımızda bulacaksınız.
nginxに.htaccessを移行する。

nginxでは.htaccessを利用できないが、完全ではないもののコンバータを使うことで簡略化できる。この記事では、コンバータを効率的に行うスクリプトを紹介する。デレクトリィ構成は、debian strechを念頭に置くが、どの環境でも大筋では変わらないと思う。

#コンバータ
Webサービス http://winginx.com/ja/htaccess を使う。

##コンバータの限界

次のような例ではうまくいかない。

```
order allow,deny
allow from 192.168.0.2
allow from 192.168.0.1
```

192.168.0.2のみ反映される。

```
# nginx configuration
deny all;
allow 192.168.0.2;
```

#Webサービスのデレクトリィ構成

##コンテンツ
debianのWebサービスのデレクトリィ構成は、apache nginx共に変わりがなく次の形。virtual domainを使う場合は、document rootが複数ある形になる。userdirを使わない場合はユーザーデレクトリィはない。

|デレクトリィ|摘要|
|:--|:--|
|/var/www/html |ドキュメントルート|
|/home/*/public_html|ユーザーデレクトリィ|

##.htaccess
.htaccessをapacheではコンテツ用のデレクトリィに直接配置するが、nginxでは設定ファイル内に全て記述する必要がある。

|ファイル|摘要|
|:--|:--|
|/etc/nginx/sites-available/* |defalutが規定値として設定されている。また、現在有効なサイトは sites-enabled以下にリンクされている|


#curlによるコンバータの利用

自分用に設定を移行するための簡単なシェルスクリプトを書いた。このシェルスクリプトは、webDir=/var/www/html以下のデレクトリィを走査し全ての.htaccessをコンバータに通す。出力された結果はniginx.confに出力されるので、内容をnginxのサイト毎の設定ファイルのserver{以下に書き足す。実際に適応する場合は、内容に十分注意してほしい。また**スクリプトでのアクセスは、サーバー過負荷にならないように配慮する必要がある。**

```bash
webDir=/var/www/html
config=nginx.config.`date "+%Y%m%d-%H%M%S"`

files=`find $webDir -name .htaccess`
for file in $files; do     
  data=`cat $file`
  echo "## $file" >>$config
  url=`echo $file | sed -e "s|^${webDir}\(.*\)/.htaccess$|\1|"`
  echo location $url { >>$config
  curl http://winginx.com/ja/htaccess/ajax \
    -F "htaccess=$data" -H 'X-Requested-With: XMLHttpRequest'\
    >> $config
  echo   >> $config
  echo  } >> $config
  echo   >> $config
done
```
#nginxの操作

よく使うコマンドを簡単にまとめる。

|コマンド|摘要|
|---|---|
|nginx -t|設定テスト|
|nginx -s reload|設定再読込|
|service nginx start|起動|
|service nginx stop|停止|
E2Eテスト(インテグレーションテスト)の利点と不利点

開発におけるテストの重要さが問われている今、E2Eテストをどのように扱うべきかまとめてみようと思います。

# E2Eテストとは？
E2E(End to End)Testと呼ばれるテストとは、単体テストとは違いシステム全体を実稼働時に近い状況で動かしつつテストする手法です。

例えばwebアプリでE2Eテストをする場合、実際にサーバー、ブラウザを立ち上げた状態でブラウザの操作をしながらテストをします。
Railsのようなwebフレームワークを使用している場合、テストの裏側で自動的にサーバーなどを起動してテストをしています。


# 利点
- 実際の稼働に近い動きをテストできるため、単機能だけの途切れ途切れのテストではない
- 表示されているボタンをクリックすると言った細かい挙動まで再現できる
- ブラウザに表示されている文言などもチェックすることができる


# 不利点
- 実際にサーバーやブラウザを起動するため、単機能のテストとは比べ物にならない時間がかかる
- 細かいUIのテストを実装すると、ちょっとした文言の変更で異常なほど落ちる
- テストに時間がかかるため、テスト駆動開発などをするときにまともな開発ができない
- テストが通るのを長い時間待った後に、テストが落ちた後のやる気の削がれ方が凄い


# E2Eの使い所
面倒だ！ 重い！ 壊れた！
とは言ってもどんなサービスにも、往々にして絶対に落ちて欲しくないシステム箇所は存在すると思います。

例えば重要な登録作業やそのサービスの根幹をなす、これが落ちてはこのサービスに意味は無い！ 危ない！といったような部分にはE2Eの導入を検討しましょう。

そして導入の仕方にも様々なパターンがあります。
ボタンをクリックして正常に登録ができることを確かめるだけであったり。
正常にある値が表示されていることを確かめるであったり。

多くの検知パターンのテストがありますが、重要な部分はちゃんと検査でき、なおかつ無駄に検査しすぎて変更に弱いテストにしないことを気をつけましょう。

# まとめ
結局テストは使い所です。
皆さんが良いテストライフをおくれることを願っております......。

[Webアプリケーションのテストについて大まかに全体をまとめた記事](https://nakka-k.hatenablog.com/entry/2019/06/25/000752)を書きましたのでそちらもご覧ください。


# 他に参考になりそうな記事
- https://qiita.com/mt0m/items/7e18d8802843d9f60d28
herokuでルートドメインを最速で設定する

##サブドメインではできたというあなたへ

herokuでの独自ドメインの公開に関する詳細な記事は以前書かせていただきました。
<a href="https://qiita.com/kenjikatooo/items/07c3d911210a4ca96781" target="_blank">初めてHerokuで独自ドメインを公開するあなたへ</a>という記事です。

ここでは `www.` のつく、いわゆるサブドメインを公開する手順を詳細に書きました。

##でもやっぱり `www.` はなくしたいあなたへ

でもやっぱりポリシー的にも？サブドメインじゃなくて `www.` のないドメインを使ってみたい！
という方もおられるかもしれないと思い今回追加で書いてみることにしました。
（ぼくがそうだったんですが、、、）

##今回のプロダクション環境

今回は<a href="https://qiita.com/kenjikatooo/items/07c3d911210a4ca96781" target='_blank'>前回</a>の続きということもあり、

 - herokuを使用し
 - Point DNSをアドオンとして使う

という状況でのルートドメインの公開の仕方を書いてみたいと思います。
また前提として、サブドメインでの公開はすでにできているものとします。

##必要なこと

実際に必要なことは

 - herokuにドメインを追加する
 - DNSに `ALIAS` レコードを追加する


の2つのみです！（サブドメインができていれば本当に驚くほど早い！）

##herokuにドメインを追加する

まずはherokuにドメインを追加してみましょう。
以前は `www.` ありでやったと思いますが、今回は、

```
heroku domains:add [取得したドメイン]
```

という風に `www.` を記載せずにherokuにドメインを追加します。

##ALIASレコードを追加する

次に `Point DNS` の画面に飛び、 **herokuのダッシュボードに記載してある、DNSターゲット** をコピーしてきて、 **ALIASレコードを追加します**

```
Record Type : ALIAS
Name : 何もいれない
Target : [取得したドメイン].herokudns.com
TTL : 60
```

という風に入力します。


はい、
以上で完了です！
めちゃめちゃ簡単ですよね！しばらく経てばアクセスできるようになると思います。
【ExcelVBA】爆速カラーリングの戦術メモ

#はじめに
　エクセルVBAで予実管理表なんか作るときの大量セルのカラーリングって時間かかりますよね。それを爆速化します。

#ソース
https://github.com/duri0214/VBA/blob/master/ChangeColor

#SPECIAL THANKS
コメントで提案事項をいただきました。
コメントが活発になるのはいいことですね！ありがとうございます。

```vb:提案①：ForEachじゃなくて、ネストが深くなっても二重ループしたほうがいい
    'nukie_53 さん
    Dim rcOffset(0 To 1) As Long
    rcOffset(0) = chunk.Row - 1
    rcOffset(1) = chunk.Column - 1

    Dim c As Long, r As Long
    For c = 1 To chunk.Columns.Count
        For r = 1 To chunk.Rows.Count
            '★色を塗る条件
            If InStr(1, CStr(data(r, c)), instrText) > 0 Then 'CStr() = for error value

                y = rcOffset(0) + r
                x = rcOffset(1) + c

                'セルアドレスの位置情報をR1C1参照として組み立て
                addr = "R" & y & "C" & x
                '...

            End If
        Next r
    Next c
```
```vb:提案②：255文字超えの判定ではJoinよりもLenで数字に取って判定したほうがいい
            'jinoji さん
            Dim addrLen, sumLen
            addrLen = Len(addr)
            'Rangeオブジェクトに指定できるのは255文字まで
            If sumLen + addrLen > 255 Then
                '蓄積した位置情報をA1形式に変換してまとめてエフェクトする
                chunk.Parent.Range(ConvertRC2A(Join(q.ret, ","))).Interior.ColorIndex = color
                '蓄積した位置情報を破棄
                q.Reset
                sumLen = 0
            End If

            'セルアドレスの位置情報を蓄積
            q.Push addr
            sumLen = sumLen + 1 + addrLen
```

##１．色を塗るマスに値がある場合
ChangeColor
ある値を探して大量に色を塗る標準的な場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/ed4dd84f-464e-3987-3443-0e4d97767b91.png)

##２．色を塗るマスに値がなく、別のシートにdbで引っ張ってきた色塗りリストしかない場合
ChangeColor2
業務プログラムだと意外にこういうパターンってあるのよね～

実行前
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/08e996ef-1b64-26c5-a226-995b19631f5e.png)
色を塗るリスト
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/b7ce7efd-e2fc-962d-f115-14a199afd3a0.png)

実行後
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/988699e3-484e-cb57-488d-d8d323d7eda6.png)




#根元の参考ソース
　[ここ](http://excel.syogyoumujou.com/vba/speed_up.html) のTest6ですが、速さ検証のグラフなどはここを見てください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/d6733ad5-a770-3d9b-25fd-0ec011af09a4.png)
そこの管理人が、「可読性は悪いです。」というものをリファクタリングしました。読解に意外に時間かかったけど結構おもしろかったな。スクラップアンドビルドのゼロベース書き起こしなのでソースは僕のものだと思いましたまる:innocent:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/e9959e4a-f5bf-02f5-1c42-9df69ba93228.png)


#処理のポイント
　該当セルのアドレスをR1C1参照形式で書き貯め、それをまとめてApplication.ConvertFormulaメソッドでA1形式に変換してセルを塗りつぶす。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94562/959b8e75-4b34-cb0b-d435-2a99c901bc90.png)


#注意点
１．単一セルのケースはエラーがおきます。しかし、単一セルを指定することはまずない（直接塗りつぶしてよ！:head_bandage:）ので、そこ対処してもいいんだけどやらない。
２．Application.ConvertFormulaメソッドに指定できるのは255文字までのようなので、255文字を超える直前に変換と色を塗る処理を行う。
３．★部分は色を塗るトリガーなので必要に応じて改造してください。
.envrcに環境変数を設定する


direnvをインストールする

```terminal:
$ brew install direnv
```

```terminal:
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> New Formulae
gptfdisk                                 pijul
==> Updated Formulae
abcde                      grpc                       puzzles
angle-grinder              gtk-vnc                    quicktype
angular-cli                gutenberg                  rabbitmq
awscli                     harfbuzz                   redis
cargo-completion           hashcat                    ripgrep
cassandra                  kerl                       rust
chronograf                 knot-resolver              sceptre
composer                   kotlin                     shfmt
cryptol                    libpst                     shibboleth-sp
csvprintf                  libxkbcommon               skaffold
cython                     liquigraph                 snakemake
dartsim                    logtalk                    taskell
dbus                       macvim                     teleport
dcos-cli                   mariadb@10.0               tmux-xpanes
django-completion          mercurial                  todolist
dxpy                       mkdocs                     tox
emscripten                 node                       trafficserver
erlang@20                  node-build                 uhd
faas-cli                   ocrmypdf                   vcftools
firebase-cli               openshift-cli              webpack
flow                       paket                      wireguard-tools
fluent-bit                 passenger                  wxmac
gammaray                   percona-server-mongodb     xml-security-c
git-lfs                    phpunit                    xtensor
go-jira                    pilosa                     yarn
go-statik                  presto                     youtube-dl
goenv                      proselint                  zebra

Error: Could not link:
/usr/local/share/man/man1/brew.1

Please delete these paths and run `brew update`.
Error: Could not link:
/usr/local/share/doc/homebrew

Please delete these paths and run `brew update`.
==> Downloading https://homebrew.bintray.com/bottles/direnv-2.17.0.sierra.bottle
######################################################################## 100.0%
==> Pouring direnv-2.17.0.sierra.bottle.tar.gz
🍺  /usr/local/Cellar/direnv/2.17.0: 9 files, 5.4MB
```



.bashrcをエディタで開く

```terminal
open ~/.bashrc
```

以下を追記する

```text
eval "$(direnv hook bash)"
```

.envrcに環境変数を設定する

```text:.envrc
export APIKEY=<APIKEY>
export AUTHDOMAIN=<AUTHDOMAIN>
export DATABASEURL=<DATABASEURL>
export PROJECTID=<PROJECTID>
export STORAGEBUCKET=<STORAGEBUCKET>
export MESSAGINGSENDERID=<MESSAGINGSENDERID>
```



```terminal
direnv: loading .envrc
direnv: export +APIKEY +AUTHDOMAIN +DATABASEURL +MESSAGINGSENDERID +PROJECTID +STORAGEBUCKET
```

```terminal
direnv: unloading
```

```terminal
direnv: error .envrc is blocked. Run `direnv allow` to approve its content.
```

```terminal
$ direnv allow
```
M5StackをMacのArduino IDEで使うための環境構築

# M5StackをMacのArduino IDEで使うための環境構築

1. 使うもの
2. 環境構築
3. まとめ

# 1. 使うもの
- M5Stack
- 開発をするためのMac

# 2. 環境構築
まず、[ここ](https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers)からMac用のドライバをダウンロードします。
ダウンロードしたものを解凍すると、以下のようなファイルが出てきます。
この中の、__Silicon Labs VCP Driver.pkg__を選択します。

<img width="734" alt="m5stack-driver.png" src="https://qiita-image-store.s3.amazonaws.com/0/143395/be4ddeb3-bed9-c415-cd80-9125630c1653.png">

インストール手順にしたがって進んでいきます。
この時、途中でMacのセキュリティがドライバのインストールをブロックするので、 `システム環境設定 > セキュリティとプライバシーでダウンロードしたアプリケーションの実行許可` の許可ボタンをクリックします。

<img width="624" alt="m5stack-driver2.png" src="https://qiita-image-store.s3.amazonaws.com/0/143395/2e5c0099-0b0e-8b63-8262-c4a51982cfbd.png">

それが完了したら、ドライバのインストールは完了です。

次にArduinoでM5Stackを使えるようにします。

ターミナルを開き、下のコマンドをコピペしEnterを押します。

```
mkdir -p ~/Documents/Arduino/hardware/espressif && \
cd ~/Documents/Arduino/hardware/espressif && \
git clone https://github.com/espressif/arduino-esp32.git esp32 && \
cd esp32 && \
git submodule update --init --recursive && \
cd tools && \
python get.py
```

完了したら、Arduino IDEを起動します。

起動したら、 `スケッチ > ライブラリをインクルード > ライブラリ` を管理を選択します。
検索ボックスにm5stackと打ち込みます。

<img width="791" alt="m5stack-arduino-ide.png" src="https://qiita-image-store.s3.amazonaws.com/0/143395/dcd7d76a-8c0f-27da-0903-11104badaad2.png">

そうすると、いくつか検索結果がでえてくるので画像の真ん中にあるものを選択します。

<img width="758" alt="m5stack-library-install.png" src="https://qiita-image-store.s3.amazonaws.com/0/143395/f67e0064-3932-a8e7-acfe-a2ed6385e440.png">

選択したらインストールボタンをクリックします。

インストールが終わったら、環境構築が完了です。

一度Arduino IDEを再起動します。

再起動すると、 `Arduino　IDEのファイル > スケッチ例 > M5Stack` が追加されています。
M5Stackで動くかHello Worldを試してみましょう。

`ファイル > スケッチ例 > M5Stack > Basics > HelloWorld` を選択します。
新規ウィンドウでHello Worldのプログラムが出てくるので、これを書き込みます。
手順は、 `ツール > ボード：hoge > M5Stack-Core-ESP32` を選択します。
次に、 ` ツール > シリアルポート` で/dev/cu.SLAB_USBtoUART を選択します。

これで書き込み準備は終わりです。
あとは、Arduino IDEの左上にあるマイコンボードに書き込むボタンをクリックするとM5StackにHello Worldのプログラムが書き込まれます。
ディスプレイにHelloWorldが表示されたら完了です。

# 3. まとめ
これでArduinoと同じように開発することができるようになりました。
今回は、Arduino IDEで開発するための環境構築をしましたが、M5StackはM5Cloudなどでも開発することができます。
これから、M5Stackの記事を書いていきます。
Railsをmiddleman的に使う方法（静的htmlファイルを出力させる）

# はじめに

Rails 5.1で動的に生成しているページを静的ファイルとして保存しておきたい。
ググってみてもスタンダードなやり方が見つからなかったので、少しハックな感じもするけど独自の方法を考えてみた。

# やり方

下記2個のファイルを作成する。

```lib/tasks/docs.rake
desc "ページを静的化する"
task "docs:generate" => :environment do
  DocsGenerator.new.generate_all
end
```

```app/models/docs_generator.rb
# 静的ドキュメントファイルを生成するクラス
class DocsGenerator
  # 出力先ディレクトリ
  SAVE_DIR = Rails.root.join('static_docs')

  def initialize
    # 静的化したいページのURLと保存先パスをここに書く
    @urls = [
      {
        url_path: "/",
        save_path: "/index.html",
      },
      {
        url_path: "/hello",
        save_path: "/hello.html",
      },
    ]
  end

  def generate_all
    # Rails consoleで使えるのと同様のappオブジェクトを作成する
    # https://stackoverflow.com/a/20022165/5209556
    app = ActionDispatch::Integration::Session.new(Rails.application)

    @urls.each do |url|
      generate_one(app, url)
    end
  end

  private

  def generate_one(app, url)
    # リクエスト発行
    app.get(url[:url_path])

    # レスポンスをファイルに保存
    save_path = SAVE_DIR.join(url[:save_path].sub(%r{^/}, ''))
    FileUtils.mkdir_p(File.dirname(save_path))
    File.write(save_path, app.response.body)

    if !File.exist?(save_path)
      puts "Error: #{save_path} を作成できませんでした。"
    elsif File.size(save_path) == 0
      puts "Warning: #{save_path} のファイルサイズが 0 です。"
    else
      puts "Wrote: #{save_path}"
    end
  end
end
```

`@urls` のところに静的化したいページのURLと保存先パスを書いておくことに注意。
もともとドキュメントを生成するために使っていたのでクラス名が`DocsGenerator`になっているけど、その辺は適宜変更してほしい。

あとはコマンドラインから

```
bin/rake docs:generate
```

を実行するだけ。`./static_docs` ディレクトリ内に静的htmlファイルが生成されているはずだ。

# 解説

Railsにもともとある機能として、`bin/rails c`のコンソールの中で

```
[1] pry(main)> app.get "/"
```

のようにすると `/` へリクエストを発行することができる。
この `app` オブジェクトを普通のモデルの中で使えないかと思って調べてみたところ、[Stack Overflowによると](https://stackoverflow.com/questions/20021988/rails-app-object-in-console-versus-in-scripts/20022165#20022165)

```rb
app = ActionDispatch::Integration::Session.new(Rails.application)
```

でできると書いてあったので、これを使っている。
ここは将来のRailsでも動くかどうか確信が持てないところ。

もっといいやり方があったら教えてください。
初心者がdockerのubuntuイメージでSparkをインストールしてみる

#はじめに
Apache Sparkの勉強と、ついでにdockerの勉強もしようと思い、dockerのubuntuイメージでSparkをインストールしたのでまとめておきます。
もっと簡単に使うために[SequenceIQのDockerイメージ](https://github.com/sequenceiq/docker-spark)っていうのもあるみたいです。

#環境
・macOS 10.12.16

macOSはVMを立ててDockerデーモンを起動しないといけないみたいなので最初に
[MacでDockerをインストールした後に必要な作業](https://qiita.com/butada/items/4044c5efd03341c8afef)をやります。

#Dockerコンテナ作成・起動
##1. ubuntuのdockerイメージの取得
今回はubuntu16.04を指定してますが、欲しいバージョンを指定してください。

```
$ docker pull ubuntu:16.04
```

・取得したイメージ一覧の表示

```
$ docker images
```

##2. コンテナの起動

コンテナに名前をつけて起動します。

```
$ docker run -it -d --name ubuntu1604 ubuntu:16.04
```

・起動中のコンテナ一覧の表示

```
$ docker ps
```

##3. コンテナの中に入る
コンテナの中でbashを新規に動かす感じだと思います。
これでubuntuのrootにログインすることができました。

```
$ docker exec -it ubuntu1604 /bin/bash
```

#Sparkのインストール
もろもろのインストールを行います。
最初に`apt-get update`で更新しないとうまくいかず、少しハマりました。

```
$ apt-get update
$ apt-get install -y openjdk-8-jdk
$ apt install maven
$ apt-get install wget
```

`wget`でsparkのバージョンを選んでダウンロードします。
http://ftp.riken.jp/net/apache/spark/
その後/usr/local/sparkをSPARK_HOMEとして、シンボリックリンクを貼ります。

```
$ wget http://ftp.riken.jp/net/apache/spark/spark-2.3.1/spark-2.3.1-bin-hadoop2.7.tgz
$ tar zxvf spark-2.3.1-bin-hadoop2.7.tgz
$ mv spark-2.3.1-bin-hadoop2.7 /usr/local/
$ ln -s /usr/local/spark-2.3.1-bin-hadoop2.7 /usr/local/spark
```

.bashrcに下記を追記してパスを通します。

```
export SPARK_HOME=/usr/local/spark
export PATH=$PATH:$SPARK_HOME/bin
```
`source`コマンドで反映させます。

```
$ source .bashrc
```

#spark-shell
ちゃんと実行できました。

```
$ spark-shell --master local[*]

(中略)

Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.3.1
      /_/

Using Scala version 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_171)
Type in expressions to have them evaluated.
Type :help for more information.

scala>
```

#コンテナの停止
`spark-shell`を実行した後`Ctrl+C`で抜けた後、ubuntuから`exit`します。
ubuntu1604のコンテナを停止したいときは下記のコマンドを実行します。

```
$ docker stop ubuntu1604
```

また起動したいときは下記のコマンドで起動できます。

```
$ docker start ubuntu1604
```

#おわりに
Dockerfileを使えばSparkのインストールをもっと楽にできるみたいなのでこれから勉強します。

#参考
https://qiita.com/kooohei/items/0e788a2ce8c30f9dba53
https://weblabo.oscasierra.net/docker-ubuntu1604/
https://qiita.com/rockhopper/items/0680a537838233fce323
Vue.js + Jest でnpm run unit をするとSecurityError: localStorage is not available for opaque originsが発生する

Vue.jsのテストをやろうかと思って、とりあえず **vue-cli** で自動生成される `HelloWorld.vue` のテスト(`npm run unit`)を実行したら以下のエラーが発生したので、その対処法を残す。

![1____w_v_t_tdd-sample__fish__と_connpass-event-search-app.png](https://qiita-image-store.s3.amazonaws.com/0/170140/40c84de9-e923-1635-4e84-12a143b44bfa.png)

見てみると、 `SecurityError: localStorage is not available for opaque origins` が発生している。

[ググって](https://github.com/coreui/coreui-free-vue-admin-template/issues/115)みると、`jest.config.js`に以下のパラメータを追加すれば良いとのこと。

```js:jest.config.js
module.exports = {
  ...
  verbose: true,
  testURL: "http://localhost/",
}
```

これで再度実行する。

![1____w_v_t_tdd-sample__fish_.png](https://qiita-image-store.s3.amazonaws.com/0/170140/e965fca6-5a6e-0332-323b-bb0dcff8e1a5.png)

めでたしめでたし👏

`jest.config.js`でtestURLを設定していない場合は、　URLが`about:blank`となり、妥当なoriginでないと判断され、 **SecurityError** が発生した感じですね。

だとすると、必要なパラメータは`testURL`だけなので、`verbose`はお好みで設定してください。
あと、`testURL`に指定する値はoriginの妥当性が判断できれば良いので、`http://hogehoge`とかでも大丈夫です(HelloWorld.vueで実行済み)。

以上です👍
[自分用] DockerでCentOSテスト環境作り[覚書]

# Dockerfile
    FROM centos:7
    MAINTAINER name <email@example.com>

    # yum update
    RUN yum clean all
    RUN yum -y update
    RUN yum -y install epel-release
    RUN yum -y install python-pip python-django git sqlite
    RUN yum -y install jwhois
    RUN yum -y install net-tools
    RUN yum -y install iproute
    RUN yum -y install wget tar make gcc autoconf bison re2c
    RUN yum -y groupinstall "Development tools"
    # ssh install
    RUN yum -y install openssh-server openssh-clients

※適当です。


# ビルド
    docker build -t my_server:latest .

## ビルド 警告
    SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.


# コンテナ起動とログイン

## slave1起動
    docker run --privileged -d -it --name slave1 my_server /sbin/init

## slave2起動
    docker run --privileged -d -it --name slave2 my_server /sbin/init

## slave1ログイン
    docker exec -it slave1 bash

## slave2ログイン
    docker exec -it slave2 bash

### slave1,2のrootパスワード設定
    passwd

## master起動
    docker run --privileged -d -it --name master --link slave1:s1 --link slave2:s2 my_server /sbin/init

## masterログイン
    docker exec -it master bash

## masterで鍵作成
    ssh-keygen -t rsa

## masterからslaveに鍵の配布
    ssh-copy-id root@s1
    ssh-copy-id root@s2

# masterからslaveへノンパスでログインできることを確認
    ssh s1
    ssh s2

# masterにansibleインストール
    yum -y install ansible

# /etc/ansible/hosts編集
    [slave]
    s1
    s2

# ansibleテスト
    ansible slave -m command -a "uptime"

## 成功
    [root@47d0fd52f9ed ansible]# ansible slave -m command -a "uptime"
    s1 | SUCCESS | rc=0 >>
    16:58:18 up  3:26,  1 user,  load average: 0.31, 0.26, 0.27

    s2 | SUCCESS | rc=0 >>
    16:58:18 up  3:26,  1 user,  load average: 0.31, 0.26, 0.27


簡単な確認用の環境はこんな感じで作れそう。


# masterでhttpd,ssh開けるとき
    docker run --privileged -d -it -p 8080:80 -p 2222:22 --name master --link slave1:s1 --link slave2:s2 my_server /sbin/init

# imageの保存
ある程度masterの環境が整ったらimageにする

## stop
    docker stop master

## commit
    docker commit master master:0001
自分はタグの数字増やすようにしてる。

## run
    docker run --privileged -d -it -p 8080:80 -p 2222:22 --name master --link slave1:s1 --link slave2:s2 master:0001 /sbin/init


# docker-composeで管理する
imageができたら、docker-composeで管理すればよい。
hostnameを書けばログイン後も名前で見やすくなる。

```docker-compose.yml
version: '2'
services:
  slave1:
    container_name: slave1
    hostname: slave1
    image: slave1:0001
    privileged: true
    ports:
      - "8081:80"
      - "2223:22"

  slave2:
    container_name: slave2
    hostname: slave2
    image: slave2:0001
    privileged: true
    ports:
      - "8082:80"
      - "2224:22"

  slave3:
    container_name: slave3
    hostname: slave3
    image: slave3:0001
    privileged: true
    ports:
      - "8083:80"
      - "2225:22"

  master:
    container_name: master
    hostname: master
    image: master:0001
    privileged: true
    ports:
      - "8080:80"
      - "2222:22"
```
第1回Dockerハンズオン初心者・中級者編で学んだことをまとめてみた

## はじめに

この記事は、2018年8月4日に新宿で行われた、第1回Dockerハンズオン初心者・中級者編で学んだことを自分なりにまとめた記事になります。

## Docker Image

簡単にいうと、Docker Imageはディスクイメージに該当する。インストールされたソフトウェアが入っているような感じ。

`docker run`(実行)することで、`docker container`(実行状態となっているもの)が生成される。

## Dockerfileとは?

```dockerfile
FROM ruby:alpine

RUN apk add --no-cache bash tzdata libxml2-dev libxslt-dev sqlite sqlite-dev nodejs postgresql-dev

WORKDIR /temple

COPY Gemfile .

RUN set -ex \
 && apk add --no-cache --virtual .build-dep build-base \
 && gem install nokogiri \
   -- --use-system-libraries \
   --with-xml2-config=/usr/bin/xml2-config \
   --with-xslt-config=/usr/bin/xslt-config \
 && bundle install \
 && apk del .build-dep
```

その名の通りDockerのファイル。

ルールとして、各行の先頭は必ず大文字で命令するコマンドを記述する。

|コマンド| 意味|
|:-:|:-:
|FROM | Docker Imageをどこから引っ張ってくるか|
|RUN| 引数に指定したコマンドを実行する
|WORKDIR| ディレクトリの指定
|COPY| コピーの実行|

Dockerfileは`docker run`ではなく、`docker buid`を実行することで、`Docker Image`を作成する。

ビルドする際のコマンドとしては、次の通り。

```bash
docker build -t ディレクトリ名 コンテキスト(実行するファイルパスなど)

#example
docker build -t hogehoge .
```

ビルドがちゃんとできているかどうかは、`docker images`コマンドを実行することで確認可能。

```bash
$ docker images
    REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
    temple                              latest              dcb037e1d29b        38 seconds ago      9.5MB
    alpine                                latest              11cd0b38bc3c        3 weeks ago         4.41MB
```

ビルドによって生成したdocker imageを使って、docker runすることで実行します。

なお、`docker run`は実行させるごとに新しいコンテナを作成します。

```bash
$ docker run --rm ディレクトリ名 uname -a
```

Dockerfileに記述したコマンドが実行されるごとに、Dockerというコンテナにディスクが積み木のようにどんどん積み重なっていくイメージをすれば感覚が掴みやすいかも。


### `--rm`オプションについて

`--rm`オプションはdocker runによって実行したコマンドが終了した後に、docker container自体も消去してくれるもの。

ここでちょっと思い出して欲しいのが、docker containerは、実行後に停止する性質を持っているということ。

ただし、停止されるのはプロセス(実行されたプログラム)だけで、docker container自体が停止する訳ではない。

そのため、そのままにしておくと、停止されたdocker containerは`docker rm`などをしない限り、どんどんたまっていってしまう。

`--rm`オプションをつけることで、後から不要なdocker containerを削除する手間が省けるのがメリットと言えるかな。

## dockerfileにrubyをインストールするコマンドを記述する

```dockerfile
RUN apk add --no-cache bash ruby
```
RUNは`docker build`した時に、実行する処理を記述するもの。

ここでは、apkというパッケージ管理ツール(yumやaptみたいなもの)を使って、bashとrubyをインストールする処理を書いている。

ただ、ここで使っているalpineには、ruby用にフォーマットされた`docker image`である`ruby:alpine`がすでにあるので、それを使うのもあり。

```dockerfile
FROM ruby:alpine
```

### docker runでコマンドラインからrubyを実行する

次のようにdocker runの引数にrubyコマンドを渡せば、引数に渡した処理を実行する。

```bash
docker run --rm -it temple ruby -e '(0..100).each{|i| print ("\r%3d%% "%i+"|"*i); sleep 0.1}'
```

## ハンズオンで使用した参考サイト

http://youchan.org/docker-handson/#20

https://scrapbox.io/llminatoll/MT_D_handson
.emacs.dをGitLabのprivate repositoryで管理

# はじめに
ライトなEmacsユーザーなので、ほとんど`init.el`に何も書いてないんだけど、GitLabでプライベートリポジトリ作れるようになったし、gitで管理することにした。

# Git
## GitLabでリポジトリを作る
.から始まるprojectは作れなかった。
## .gitignoreを作る
gitignore.ioってとこでEmacsって入力してコピペした。別に何もしなくても良い気もするけど。elpaフォルダは管理してなさそう。新しい環境ではpackage使ってinstallしたやつは入れ直したらいいんかな？

[gitignore.io - Create Useful .gitignore Files For Your Project](https://www.gitignore.io/)
## gitでaddしてcommitしてpushする
こんな感じ。

```
git init
git remote add origin git@gitlab.com:xxx/emacs.d.git
git add .
git commit -m "Initial commit"
git push origin master
```

# 他のPCからgit clone

```
git clone git@gitlab.com:xxx/emacs.d.git .emacs.d
```

# init.el
ほぼからっぽ。
`C-h`だけでもいいくらい。

```emacs-lisp:init.el
(require 'package)
(let* ((no-ssl (and (memq system-type '(windows-nt ms-dos))
                    (not (gnutls-available-p))))
       (proto (if no-ssl "http" "https")))
  ;; Comment/uncomment these two lines to enable/disable MELPA and MELPA Stable as des\
ired                                                                                   
  (add-to-list 'package-archives (cons "melpa" (concat proto "://melpa.org/packages/")\
) t)
  ;;(add-to-list 'package-archives (cons "melpa-stable" (concat proto "://stable.melpa\
.org/packages/")) t)                                                                   
  (when (< emacs-major-version 24)
    ;; For important compatibility libraries like cl-lib                               
    (add-to-list 'package-archives '("gnu" . (concat proto "://elpa.gnu.org/packages/"\
)))))
(package-initialize)
; https://melpa.org/#/getting-started                                                  


(require 'yaml-mode)
(add-to-list 'auto-mode-alist '("\\.yml\\'" . yaml-mode))
; https://dev.classmethod.jp/devenv/emacs-edit-yaml-cloudformation/                    

(define-key key-translation-map (kbd "C-h") (kbd "<DEL>"))
; https://qiita.com/takc923/items/e279f223dbb4040b1157                                 

;;; *.~ とかのバックアップファイルを作らない                                           
(setq make-backup-files nil)
;;; .#* とかのバックアップファイルを作らない                                           
(setq auto-save-default nil)
; https://qiita.com/emahiro/items/da60c24913998d857140  
```

# おわりに
会社のメインPCのEmacsにはhelmとかmigemoとか入れてるけど、結局PC変わるとめんどくさい。普段開発で使ってるPCがラズパイ入れると5台以上あるからめんどくさい。しかも、仕事内容の関係上、ネットにつながってないPCで開発したりもする。入れなおすのもめんどくさいし、入れないとPC変わったときの違和感も大きくて、結局できるだけカスタマイズしない方がいいかもってなってる。gitで管理するようになって、また変わるかもしれんけど。でもやっぱ、会社やと情報管理の話とかproxyとかあるから、シンプルに行くのが楽かなぁ。

# 参考
[Githubに.emacs.dを置く - Qiita](https://qiita.com/h12o/items/1545964eef2de1490286)
Raspberry Piで水温測定→IoT可視化サービスに送信

忘備録

今後センサーの繋ぎ方とか追記予定

1-wireをラズパイ側で許可
↓
Raspberry piで水温計測
↓
IoT可視化サービスThingspeakに送信

下記を参考にした。thingspeakデータ送信部分を追加した。

参考
https://thepihut.com/blogs/raspberry-pi-tutorials/18095732-sensors-temperature-with-the-1-wire-interface-and-the-ds18b20


使用水温計はDS18B20。amazonで購入。そのままだとラズパイに繋げない。被覆を剥がして、半田ごて使ってラズパイにつなぐためのジャンパワイヤと接続。

```python
import os
import glob
import requests
import time
import sys
 
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
 
base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'
 
url = 'https://api.thingspeak.com/update'
api = '●●●●'

def read_temp_raw():
    f = open(device_file, 'r')
    lines = f.readlines()
    f.close()
    return lines
 
def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != 'YES':
        time.sleep(0.2)
        lines = read_temp_raw()
    equals_pos = lines[1].find('t=')
    if equals_pos != -1:
        temp_string = lines[1][equals_pos+2:]
        temp_c = float(temp_string) / 1000.0
        return temp_c

try:
    
    while True:
        param = {'api_key':api,
                 'field3':read_temp()}  #field●はthingspeakの個人の設定
        requests.get(url, params = param)
        time.sleep(600)   #10分おきに計測。
except:
    sys.exit()
```
RでLocal Moran's I 求めた話

R で　Moran's I を求める際につまづいたので、メモ。
shpファイルからじゃなくて、csvから直接位置情報を読み取った。

## Global
まず、Global Moran's I に関して、以下のサイトを参考にして、shpファイルからじゃなくてcsvファイルから緯度、経度を読み込んで求めた。

http://www.gi.ce.t.kyoto-u.ac.jp/user/susaki/rsgis/qgis_R_geostatistics.html

以下では適当に、「空き巣ねらい」の空間的自己相関を求めた

```r:
# Moran's I
crime<-read.table("crime.csv",sep=",",header = TRUE)
coords <- matrix(0, nrow=nrow(crime), ncol=2)
coords[,1] <- crime$Latitude
coords[,2] <- crime$Longitude
crime.tri.nb <- tri2nb(coords)
moran.test(crime$あき巣ねらい,nb2listw(crime.tri.nb,style="W"))

```
こんなかんじでやったらできた。

## Local
適当に、

```r:
localmoran(crime$あき巣ねらい,nb2listw(crime.tri.nb,style="W"))
```
って書いたら、結果がでてきた。関数の中身は、Globalの場合と同じで良い。

結果が煩雑で見にくいので、この値を元に地図にプロットするのが良さげ。
ストレスフリーなWindowsネイティブプラグイン開発

# おしながき
Windows向けのUnityネイティブプラグインを書くときのTipsです。

* ネイティブプラグインをF5でデバッグする方法
* Unityの中でクラッシュしたときのデバッグ方法
* ビルド時にネイティブプラグインをAssets以下に配置する方法

# ネイティブプラグインをF5でデバッグする方法
ネイティブプラグインをデバッグするときに「いちいちアタッチするのがめんどくさい」と思う人が多いと思います。
実は、Visual Studioの「デバッグ実行(F5キー)」でUnityを起動するように設定すれば、自動的にネイティブプラグインをデバッグできます。アタッチしたときと同じように、ブレークポイントを張ったり、例外発生時に止めることもできます。

ネイティブプラグインのデバッグ実行時にUnityを立ち上げて自動的にアタッチするには、プロジェクトのプロパティで以下のように設定します。

* コマンド: Unityエディターへのパス
* コマンド引数: `-projectPath [Unityプロジェクトへの絶対パス]`

![Debugger Configuration.png](https://qiita-image-store.s3.amazonaws.com/0/97681/b619cd54-4e3e-3d53-d1b8-efd41c39a651.png)

あとはF5キーを押してデバッグ実行するだけで、自動的にUnityが起動してアタッチされます。

# Unityの中でクラッシュしたときのデバッグ方法
ネイティブプラグインを開発していると、たまにUnityの中でクラッシュしてしまい、スタックトレースが追えないときがあります。
そんなときは、Unityが提供しているデバッグシンボルサーバーに接続して、せめてでも関数名を見れるようにしましょう。

Unityのデバッグシンボルサーバーについては、Unityの[マニュアル](https://docs.unity3d.com/ja/current/Manual/WindowsDebugging.html)に詳細があります。

設定方法は以下の手順のとおりです。

1. メニューバーの[デバッグ > オプション]を開く
2. 右のペインで[デバッグ > シンボル]ページを開く
3. シンボルサーバー`http://symbolserver.unity3d.com`を追加する

![Debug Symbol Server.png](https://qiita-image-store.s3.amazonaws.com/0/97681/6c85c57e-c886-7acb-3d4d-d3128b5e247b.png)

最初のデバッグ実行時には長いロード時間がかかりますが、２回目からはキャッシュに保存されるようで早くなります。
これで、UnityのDLLやexe内でブレークした場合でも、スタックトレースで関数名がわかるようになります。

# ビルド時にネイティブプラグインをAssets以下に配置する方法
ビルド時にプラグインをAssetsフォルダ以下に配置することができます。
Visual Studioのプロジェクトのプロパティで、ビルド後のイベントを以下のように設定します。
`xcopy /Y $(TargetPath) [配置するフォルダへの相対パス]`
配置するフォルダへの相対パスは、バックスラッシュで終わっている必要があります。

![Post Build Event.png](https://qiita-image-store.s3.amazonaws.com/0/97681/417b132e-0748-d914-6da5-ea72b7869cfd.png)


# おわりに
ほかにもネイティブプラグインのTipsがあれば追記なり別ページなりで紹介していくかもしれません。
たとえば…

* 日本語もOKなプラグイン側からのDebug.Log
* 例外発生時に自動でブレーク
* Oculus Goでのストレスフリーなネイティブプラグイン開発

とか書けるとよさそうですね。
【エクセル的に】条件に応じて、複数列の値を引数に計算→新しい列に結果代入

忘備録

+ エクセルっぽく、条件に応じて、列の値を使って掛け算などの計算をして新たな列に代入する。
+ if関数・AND関数的に、●●列の値が■■以上かつ、　云々をpandasで。

まずデータフレームに空の列作成。
↓
引数に列を取るような関数を作る。
↓
データフレームにaxis=1方向にapply。

```python
import pandas as pd
import numpy as np

#サンプルデータ作成
data = {"name":["高橋","鈴木","田中","松本"],
        "score": [80, 90, 70, 75],
        "number":[1,2,1,3],
        "sex":["m", "f", "f", "m"]}

df = pd.DataFrame(data,columns=["name","sex","number","score"])
print(df)

  name sex  number  score
0   高橋   m       1     80
1   鈴木   f       2     90
2   田中   f       1     70
3   松本   m       3     75
```
例として、関数は、性別がfかつscoreが80以上なら、number × scoreが1.5倍になるものを作る。

```python
#1列は性別、3列はスコア、2列はnumber
#性別がf、スコアが80以上なら、n*sが1.5倍
def bonus(x):
    if (x.iloc[1] =="f") &(x.iloc[3]>=80):
        result = x.iloc[2]*x.iloc[3]*1.5
    else:
        result = x.iloc[2]*x.iloc[3]
    return result


df["result"]=df.apply(bonus, axis=1)
df= df.astype({'result': int}) #float　→ int型
print(df)

name sex  number  score  result
0   高橋   m       1     80      80
1   鈴木   f       2     90     270
2   田中   f       1     70      70
3   松本   m       3     75     225
```

ちなみに、関数の中ではなく、普通にdf.iloc[●]とすると、●「行」のデータが出力されます。なぜ関数の中だと、●「列」を指定できるのでしょうか。。。
Fortran90を使ったポケモンUSUMの実数値計算

#ポケモンUSUMの実数値計算のシュミレーション

## ソースコード

```Fortran:Syuzokuti.f90
PROGRAM Syuzokuti
    IMPLICIT NONE
    
    INTEGER :: a, b, c, d
    REAL(8) :: x, y, z, seikaku

    PRINT *, '種族値を入力してください'
    READ * ,a
    PRINT *, '個体値を入力してください'
    READ * ,b
    PRINT *, '努力値を入力してください'
    READ * ,c
    PRINT *, '性格補正 ↑:0 ↓:1 →:2'
    READ * ,d
!性格補正
    IF (d == 0) THEN 
        seikaku = 1.1
    ELSE IF (d == 1) THEN 
        seikaku = 0.9
    ELSE 
        seikaku = 1
    END IF

!Lv.50時のHP計算
    x = (a + b / 2.0 + c / 8.0) + 60

!HP以外の能力値
    y = (a + b / 2.0 + c / 8.0 + 5.0) * ( seikaku )

    PRINT *, 'HP =',x , 'HP以外 =', y

END PROGRAM
```

今回は対戦レート用にLv.50で計算します


##実行してみよう

コンパイラーを使って .exeファイルを作成
```$ gfortran -o Syuzokuti.exe Syuzokuti.f90 ```
ディレクトリで実行
```$ ./Syuzokuti.exe```

###実行結果
今回用意したポケモン 素早さ計算
ミミッキュ 種族値96　ようき(性格補正↑)　S252(極振り)　V=31

```./Syuzokuti.exe
 種族値を入力してください
96
 個体値を入力してください
31 
 努力値を入力してください
252
 性格補正 ↑:0 ↓:1 →:2
0
 HP =   203.00000000000000      HP以外 =   162.80000352859497　
```
HP以外 = 162.80...なので
種族値は計算後に小数点以下は切り捨てるので、
162である(今後修正しようと思う)

##確認画面
<img width="768" alt="IMG_1455.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/276359/094076fc-96ce-0aa9-f5ef-77cb1b005589.jpeg">
To create a tiny DataFrame(spark) from a nested List

### Test post
###### To create a Spark DataFrame from a nested List,
```scala
import org.apache.spark.sql._
val spark = SparkSession.builder().master("local").getOrCreate()
import spark.implicits._

val values = List(List("A", "3", "3", "4", "3", "3"),
                  List("B", "2", null, "4", "3", "2"),
                  List("B", "1", "3", "5", "1", "5"),
                  List("C", "2", "4", null, "3", "3"),
                  List("C", "3", null, "4", null, "1")).
                  map(x => (x(0), x(1), x(2), x(3), x(4), x(5)))

val df = values.toDF("name", "v1", "v2", "v3", "v4", "v5")
df.show
```
|name| v1|  v2|  v3|  v4| v5|
|:-:|:-:|:-:|:-:|:-:|:-:|
|   A|  3|   3|   4|   3|  3|
|   B|  2|null|   4|   3|  2|
|   B|  1|   3|   5|   1|  5|
|   C|  2|   4|null|   3|  3|
|   C|  3|null|   4|null|  1|

###### But for example the following fails
```scala
val values = List(List("A", "3", "3", "4", "3", 3),
                  List("B", "2", null, "4", "3", 2),
                  List("B", "1", "3", "5", "1", 5),
                  List("C", "2", "4", null, "3", 3),
                  List("C", "3", null, "4", null, 1)).
                  map(x => (x(0), x(1), x(2), x(3), x(4), x(5)))
val df = values.toDF("name", "v1", "v2", "v3", "v4", "v5")
```