OmniAICreator/Qiita-1.07M huggingface dataset:
OSMのデータをuMapで表示



## OSMで確認、足りない地物があれば追加

[OpenStreetMap](https://www.openstreetmap.org/#map=12/32.7212/130.2762)


## overpassでクエリ設定

[overpass turbo](https://overpass-turbo.eu/)

ウィザードを選択

shop=convenience　と入力し、
クエリを作成して実行

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/2b32ff72-a735-79eb-bd1e-f1731499a20c.png)

[URL 例](https://overpass-api.de/api/interpreter?data=%2F*%0AThis%20has%20been%20generated%20by%20the%20overpass-turbo%20wizard.%0AThe%20original%20search%20was%3A%0A%E2%80%9Cshop%3Dconvenience%E2%80%9D%0A*%2F%0A%5Bout%3Ajson%5D%5Btimeout%3A25%5D%3B%0A%2F%2F%20gather%20results%0A%28%0A%20%20%2F%2F%20query%20part%20for%3A%20%E2%80%9Cshop%3Dconvenience%E2%80%9D%0A%20%20node%5B%22shop%22%3D%22convenience%22%5D%2832.47848770270873%2C129.737548828125%2C33.00175347002964%2C130.53405761718747%29%3B%0A%20%20way%5B%22shop%22%3D%22convenience%22%5D%2832.47848770270873%2C129.737548828125%2C33.00175347002964%2C130.53405761718747%29%3B%0A%20%20relation%5B%22shop%22%3D%22convenience%22%5D%2832.47848770270873%2C129.737548828125%2C33.00175347002964%2C130.53405761718747%29%3B%0A%29%3B%0A%2F%2F%20print%20results%0Aout%20body%3B%0A%3E%3B%0Aout%20skel%20qt%3B)


### エクスポート

エクスポートを押下し、Overpass APIから抽出された生データをクリック

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/de6787e8-c46a-8589-d27c-4fc54f67df4c.png)

表示された画面のURLをコピーメモ


## Umap


![image](https://qiita-image-store.s3.amazonaws.com/0/49910/9730d893-7991-7da7-9b86-875070bbab34.png)

エクスポートで表示された画面のURLを入力する。
フォーマットはOSM



## 参考
[uMapとOverpass API(overpass turbo)を使ってOpenStreetMatsuyaマップを作る, Windows版のKobito(Markdownエディタ)を動かしてみた(失敗) - Days of Speed(2015-06-23)](http://www.nofuture.tv/diary/20150623.html)
EC-CUBE 4.x インストール

## php-intl を入れる
先ずは必要な拡張のphp-intlを入れる。
入っていないとインストール時にエラーになるのが、先ずほとんどは入っていない。
既に入っていればスキップ。なければルート権限でインストール。
### CentOS とか
```console
$ yum install php-intl
```
注意：php をバージョン指定で入れてると php71-intl とかになるので、それに合わせて指定する。
追加のリポジトリを使っている場合は以下の様に php インストール時のオプションを付けて実行する。

```console
$ yum install --enablerepo=remi,remi-php71 php-intl
```
### Mac(OS-X) とか
```console
$ brew search intl
$ you should be able to see php71-intl, then run
$ brew install homebrew/php/php71-intl
```
php71-intl がない場合は、デフォルトの php が使われているので brew:beer: でインストールしなおす。

```console
$ brew install php@7.2
```
パスとかも自動的に充て直してくれる。インストールしなおしたら php-intl もいっしょに入った。
## ec-cube 4.x を入れる。
公式サイトでは composer を使ったインストールとかも載っているけれど、
軒並み失敗するのでやめた方が良い。
確実なのは、[公式サイト](https://www.ec-cube.net/download/) から zip ファイルをダウンロードして
それをサーバ上に解凍してから、Webインストールする方法。
現バージョンは 4.0.3
## MySQL
MySQLを予めインストールしておく。（インストール方法は割愛）
その中に、eccube用のデータベースを作成しておく。
## Webインストール
ブラウザ経由でサイトにアクセスして、問い合わせに従い、DB名やサイト名を入力してインストールして行く。

参考：
[EC-CUBE開発ドキュメント インストール方法](http://doc3n.ec-cube.net/quickstart_install)
[Symfonyの機能を使ったカスタマイズ](http://doc4.ec-cube.net/customize_symfony)
PHP: テストでglob関数にfalseを返させるテクニック

PHPの[`glob`関数]は`false`を返す場合がある。

<img width="861" alt="PHP__glob_-_Manual.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/99e9b00a-4f2b-9cdf-2869-8dfbc56bb3eb.png">

[`glob`関数]: http://php.net/manual/ja/function.glob.php

PHPUnitなどで`glob`関数を含むコードをテストしているとき、このケースを満たすために`false`がどうしても欲しい場合がある。しかし、よっぽどのことがない限り`false`に出会うことはない。手元の環境で実行してみた限りでは、マッチするファイルが見つからなくても`false`が返ることはなかった。

PHPのソースコードを読んで、唯一手軽に`false`を返させる方法は、極端に長いパターンを与えることだとわかった。

```php
var_dump(glob(str_repeat('.', 1024)));
```

```
Warning: glob(): Pattern exceeds the maximum allowed length of 1024 characters in /../test.php on line 3
bool(false)
```

つまり、テストで意図的に`false`を返させるには、`glob`に長い文字列を渡すとよい。
mongoidとActiveRecord共存環境でransackを使う方法、undefined method `ransack' for Mongoid

# undefined method `ransack' for Mongoid
## エラー原因はransackのバージョンアップ
```
undefined method `ransack' for #<Mongoid::Criteria:0x0000001047d960>
```
### 本家からmongoid対応のコードが削除された
Rails5のためにransackをアップデートしたらエラーに
15日前（2018/06/26)頃にmongoidに対応したコードは別のGemに切り出そうという会話の流れがあり
mongoidに対応したコードが削除されている。

https://github.com/activerecord-hackery/ransack/pull/928


# こちらが新しいransack-mongoidリポジトリ
@znz さんにご指摘いただき、リポジトリを見つけられました。
今後はこちらを入れましょう。

https://github.com/activerecord-hackery/ransack-mongoid
Macのファンが動作しない！！問題を解消するファン制御アプリケーション

## トラブル

ある日からMac Book Air が頻繁にフリーズする現象が多発！！

しばらく原因がわからずに、買い替えも検討していたが、近頃ファンの「ぶぉーーー」音を聞いていないことに気がつく。

フリーズは夏（気温30度以上）になってから起き始めたので、どうやら熱暴走であろう。

ファンが動かないのではいつ動作不全になるかわからないのでやっぱ買い替えかなと思ったが、ダメ元でMacのファンを任意制御できるアプリないかなとググったところ、神アプリに遭遇！！

## Mac Fan Control 

https://book.mynavi.jp/macfan/detail_summary/id=88472

このURLで紹介されている Mac Fan Control をインストールすると、ファンを自由にOn/Offできます。

ファンを起動する温度設定も、CPUやGPUなどセンサーを任意に指定でき、指定温度に達するとファンが自動的に動きます。

このアプリのおかげで、Macがフリーズすることがなくなりました。感謝感謝...

Specを晒しておきます

![dfd1c79df5854d700cd3f90ae24acc38.png](https://qiita-image-store.s3.amazonaws.com/0/64861/6246ba1c-864d-79a0-54f7-eb09bda62f66.png)


## 自動にしても動くぞ！！なんか調子よくなった！

そのあと色々遊んでいると、自動設定にしても適切に「ブォーーー」っとファンが動き出すようになりました。

なんかのきっかけで設定がおかしくなっていたのかもしれません。調子が良くなって買い替えせずにすみました。


なんかこの頃フリーズするようになったmacでお困りでしたら、ファンの不調を疑って、このアプリケーションを試して見てください。
まだ知らない？Webクローラーのあれこれ

![qual-o-melhor-curso-de-marketing-digital-online.jpg](https://qiita-image-store.s3.amazonaws.com/0/262932/e00fef28-c88d-e709-11a2-73ac515aa18a.jpeg)

マーケティング、SEOを担当されている方ならWebクローラーやクローリングといった言葉をよく耳にするのではないでしょうか。今回はそんなWebクローラーに関する基礎知識について紹介します。

 

# Webクローラーとは？

Webクローラーとはインターネット上に公開されているテキスト・画像・動画などの情報を自動で収集し、データベースに保管するプログラムのことです。「ボット（Bot）」、「スパイダー」、「ロボット」などとも呼ばれます。

 

# Webクローラーの種類&機能

## １．検索エンジン用クローラ

サイトを巡回して、そのサイト内の文字や画像を収集して、検索用元データとして蓄積するためのクローラです。これはもっとも知れている利用方法です。

著名な検索エンジンのクローラーは以下の通りです。
Googlebot（Google）
Bingbot（マイクロソフトが運営するbing）
Yahoo Slurp（日本以外のYahoo!）
Baiduspider（百度）
Yetibot（Naver）

 

## ２．定点観測用クローラ

定点観測と言えば、決まったサイトの、決まったページのみを定期的に巡回して、サイトの新着情報、更新情報を取得するためのクローラです。例えば、複数の価格サイトから、商品ごとの価格データを取得ことで、毎週の価格変動を分析し、価格、価格増減等をまとめた販売戦略資料を自動作成できます。ここでは、「[Octoparse](https://www.octoparse.jp)」というWebクローラーツールがあります。Octoparseの有料版だと、スケジュールを設定でき、定期的にクローリングを実行できます。無料版だと、スゲージュルに制限がありますが、十分すぎるくらいの機能があります。無料版と有料版の違いについては、[料金表](https://www.octoparse.jp/Pricing)を参照してみてください。

 

## ３．SEO対策クローラ

SEOにおいて、クローラーはページをインデックスすることで、検索結果にページを表示させるという役割があります。なので、クローラーがサイト内のどのページを読み込んでいるかについては、SEO対策において改善策を練るための指針の１つになります。「Google Search Console」というGoogleが提供している無料ツールがあります。このツールを用いることで、クローラーの行動に関して詳細な情報を入手することが可能です。

 

# Webクローラーを活用する場合の注意点

「岡崎図書館事件」を聞いたことがありますか？岡崎市立中央図書館Webサイトから新着図書データを自動で取得するプログラムを実行し、同サイトの一部機能を利用できない状態にしたため、利用者の一人が逮捕された事件です。

「Webクローラー」を活用することで、事業、営業、マーケティングを効率的に進めることができるようになります。でも、Webクローラーを運用するには、注意すべき点があります。

複数のページから情報を抜き出す場合に、連続アクセスするとWebサーバーに負荷をかけてることになります。その場合クロールされる側の迷惑になったり、DoS攻撃（サーバーに過剰な負荷をかけてサービスを妨害する攻撃）とみなされることがあります。

ですから、サーバーにあまり大きな負荷をかけないこと、不必要なアクションをトリガーしないこと、またそのWebサイトを適切な間隔で繰り返しクロールできるようにすることが重要です。
英語の職務経歴書/CV/Resumeの作り方

2018年10月からスウェーデン、ストックホルムに転職予定のエンジニアのKeです。

英語でResumeを作成するのは、
最初はとても困難な作業かと思います。
私も何度も心くじけました。

そこで、私が何回もResumeを書き直しながら、
実践した内容をここにまとめておきます！

ちなみに、Resumeは日本で言うと職務経歴書に近いと思います。
履歴書も一部含みますが、名前、連絡先、最終学歴を書くくらいです。

# まとめ
- 希望している募集要項 / Job Description にマッチするように
- 経歴10年で1ページ
- 関連ある職歴から成果の大きい順番に具体的な数字と共に記述
- Improved Decreased Archived Created などの強調的な動詞を使う
- 具体的な数字を差し込む
- Native Speaker にレビューしてもらう
- LinkedInも更新して居住地を移住先に変更

# Job Descriptionを研究する
目指している国の行きたい会社を複数ピックアップし、
Job Description、いわゆる募集要項を見てみます。
__相手が何を求めているのか__を研究するのです！

募集要項には必ず相手が求めている、
具体的な経験やスキルが書かれているはずです。
まずは、その中の英語をしっかり読んで、
それに沿った形のResumeを作成するのが近道です。

ついでに、技術英語の勉強になるはずです。

# 具体的な数字を必ずつける
- Optimized xxx by 200%.
- Increased xxx by 150%.

企業に対してどんな貢献をしたのか、
採用担当者に伝わりやすいように、
具体的な数字と共に記述します。
もちろん、募集要項にマッチしていることも大事です。

# 構成
以下、私のResumeの構成です。参考になればと。

__Contact Information__
- 名前
- 電話番号
- メールアドレス
- 居住地

当時は、東京在住だったので、Tokyo Japanと記載。（詳細な住所は不要）
移住サポートをしていない企業の場合、
おそらく居住地をみて対象外になる可能性もありますが、仕方なしです。

__Work Summary__
3行くらいで経歴をまとめましょう。
採用担当者が読んだ後、
__「この応募者は、募集要項にすごくマッチしている！」
「Resumeをしっかり読もう！」__
と思わせられるかが肝です。

__Skills__
 言語、データベース、フレームワーク、ゲームエンジンなど、
募集要項に関連ある、経験ある具体的なスキルを箇条書きにしました。

__Work Experience__
- ポジション
- 会社名
- 期間
- 達成事項

募集要項に関係が深いもの順に記載。
達成事項は、
- __成果の大きい順に__
- __具体的な数字を入れる__
がポイントです。


__Education__
最終学歴。できれば、職種と関係あるComputer Scienceがよいはずですが、私の場合、理学部化学科の学部卒でもスウェーデンへ転職できました。
ただ、国によっては、労働許可取得に大きく関わるはずです。

# LinkedInも更新
SNS上で自分のResumeを更新し、
自分のキャリアが相手の需要にマッチすれば、
世界中のリクルーターが連絡してきてくれます。

コツとしては、__居住地を移住したい国にしてみる__ことです。
そうすることで、移住先の採用担当者から連絡が来る可能性があります。
私は、実際複数のリクルーターから連絡がきて、
そこから面接や面談がスタートしていきました。

# Resume作成で参考にした記事まとめ

[6 Universal Rules for Resume Writing](https://www.indeed.com/career-advice/resumes-cover-letters/6-universal-rules-for-resume-writing)


[139 Action Verbs to Make Your Resume Stand Out](https://indeedhi.re/2fwqRFv)

# 最後に
- Resume作成のTipsは、英語で検索しましょう
- 四半期に一回など、更新する癖をつける
- リクルーターと連絡するときは、ついでにResumeのレビューをしてもらう
PerlのAnikiでselectする時に使える便利なoption

# 概要
Anikiでselectするときの、便利でよく使うoption一覧。

http://search.cpan.org/~karupa/Aniki-1.06/lib/Aniki.pm#select($table_name,_\%where,_\%opt)
>There are the options of SELECT query. See also SQL::Maker.

と書いてある様にSQL::Makerのoptが使えたりもする。

# columns
指定したcolumnsだけselectしてくれるようになる。
1万件selectする時とかは、欲しいcolumnsだけちゃんと指定してあげると良い。

例: user_idだけselectする。

```perl
my rows = $db->select(user => +{}, +{
    columns => [qw/user_id/],
})->all;
```

# suppress_row_objects
返り値がrow objectではなくて hashrefで返ってくるようになる。
これをつけると、内部的にclassに加工する処理をする前に早期returnするから、処理が減るみたい。
1万件selectする時とかは、つけると良い。

```perl
my @rows = $db->select(user => +{}, +{
    suppress_row_objects => 1,
})->all;
```


# order_by
並び替えできる。

例: user_idで昇順に並び替える。

```perl
my @rows = $db->select(user => +{}, +{
    order_by => +{ user_id => 'ASC' },
})->all;
```

# prefix
SELECT statement の prefixを指定できる。
例えば重複削除をしてくれる 'SELECT DISTINCT 'などを指定できる。
defaultは 'SELECT ' になっている。
※ 文字列の一番うしろにspaceが必要

例: user_idの重複削除をするとき。

```perl
my @rows = $db->select(user => +{}, +{
    columns => [qw/user_id/],
    prefix  => 'SELECT DISTINCT ',
})->all;
```

# その他
他には、`prefetch` や `for_update` や `limit`とかをよく使うと思う。
【Python】Chrome headlessで動的サイトのスクレイピング on AWS Lambda 

# はじめに
 - [AWS Lambda上のheadless chromeをPythonで動かす](https://qiita.com/nabehide/items/754eb7b7e9fff9a1047d)
 - [AWS Lambda(Python3)でSelenium + Chrome Headless + でwebスクレイピングする](https://www.yamamanx.com/aws-lambdapython3-selenium-chrome-headless/)

ほとんど上記サイトのコピペ記事ですが、最低限動くものをまとめておきたかったので。。ほぼ作業ログです。

# 背景
 - 単なるスクレイピングをする場合、javascript で描画される html の取得ができない。要するに動的なサイトのスクレイピングができない。
 - そこで、headless なブラウザを動かすことにより、動的なサイトでもスクレイピングできるようにする。
 - Phantomjs を使うものをよくみかけるが、開発がストップし、selenium も deplicated と警告を出しているので、今回は Chrome headless を使う。

# 手順
## python インストール
詳細は省略。2.x でも 3.x でもいけると思います。

## フォルダ準備

```
$ mkdir headless_scraping
$ cd headless_scraping
```

## selenium のインストール
作成したフォルダに、selenium をインストールします。
mac や windows で実行すると、その OS 向けの selenium がダウンロードされるようなので、[Cloud9](https://console.aws.amazon.com/cloud9/home?region=us-east-1#) で以下のコマンドを実行してください。（AWS Linux 向けの selenium が欲しい）

```
$ pip install selenium -t .
```

あとは、作成されるフォルダごとダウンロードしましょう。

- selenium
- selenium-3.13.0.dist-info


<img width="369" alt="download.png" src="https://qiita-image-store.s3.amazonaws.com/0/65743/610931ca-ae45-2ecf-1d43-e0b86234e68f.png">


## serverless-chromiumのダウンロード
bin ディレクトリを作ってそこにダウンロードします。

> 最新版はPythonで動かない（2018年4月27日現在 [参照]）ため、v.0.0-37を入れます。
>
> 引用: https://qiita.com/nabehide/items/754eb7b7e9fff9a1047d

```
$ mkdir -p bin/
$ curl -SL https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-37/stable-headless-chromium-amazonlinux-2017-03.zip > headless-chromium.zip
$ unzip headless-chromium.zip -d bin/
$ rm headless-chromium.zip
```

## Chrome driver のダウンロード

```
$ curl -SL https://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip > chromedriver.zip
$ unzip chromedriver.zip -d bin/
$ rm chromedriver.zip
```

## lambda_function.py 作成

```py
from selenium import webdriver
 
def lambda_handler(event, contxt):
    options = webdriver.ChromeOptions()
    options.binary_location = "./bin/headless-chromium"
    options.add_argument("--headless")
    options.add_argument("--no-sandbox")
    options.add_argument("--single-process")
 
    driver = webdriver.Chrome(
        executable_path="./bin/chromedriver",
        chrome_options=options
    )
 
    driver.get("https://www.google.co.jp")

    return driver.title
```

## zip化
上記全て完了すると、構成は以下のようになります。

```
headless_scraping
│
├── bin
│   ├── chromedriver
│   └── headless-chromium
├── lambda_function.py
├── selenium
└── selenium-3.13.0.dist-info
```

`headless_scraping` ディレクトリで、Lambda にアップロードするファイルを zip化します。

```
$ zip -r upload.zip *
```

upload.zip というファイルができると思うので、あとはLambdaにアップロードします。

<img width="1002" alt="スクリーンショット 2018-07-11 10.54.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/65743/648fd580-b1dd-7fd9-5a65-1ef8ca379f14.png">

※ 10MB は超えてますが、アップロードはできます。

あとはテスト走らせてグリーンになること確認できればおっけーです。お疲れ様でした！
JSON.parse()で発生したエラーの対処法（Uncaught SyntaxError: Unexpected end of JSON input）

エラー内容

```
Uncaught SyntaxError: Unexpected end of JSON input
```

JSON.parse()で発生したエラー。
原因として多いのは（）などの閉じ忘れだが、今回はJSON.parse()の記述に問題があった。

修正前　`JSON.parse(data)`
修正後　`JSON.parse(data || "null")`

空文字があると上記のエラーが発生するらしい。
Ruby on Railsで〜秒前を実装する

# 「〜分前、〜時間前、〜日前」の実装
RailsのDateHelperのtime_ago_in_wordsで「〜分前、〜時間前、〜日前」と実装することができます。

参考
https://qiita.com/bellx2/items/30906a7832ef4ff4c886

# 「〜秒前」の実装
しかしながら、以下のように30秒前（1分未満）だと「1分前」と表示されてしまいます。

```ruby
time_ago_in_words(hogehoge.updated_at)+"前"
# =>1分前
```

「〜秒前」と表示したい場合は、「include_seconds: true」のオプションをつける必要があるようです。

```ruby
time_ago_in_words(hogehoge.updated_at, include_seconds: true)+"前"
# =>30秒前
```
参考
https://apidock.com/rails/ActionView/Helpers/DateHelper/time_ago_in_words
WIP > SSL証明書 > 証明書の選択画面にてインストールした証明書を選択できない

(WIP: Work in Progress)

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)
```

### 症状

- 某機関のクライアント証明書インストール方法に基づき、証明書をインストールした
- インターネットオプションの「証明書」においてインストールした証明書があることを確認
- https接続で該当サイトに接続時、「証明書の選択」画面においてインストールした証明書が表示されない

### 対処 (確認前)

- [SSLセキュリティ証明書のインストールが出来ない→出来た！Σ(ﾟロﾟ)oﾞ](https://popozure.info/20141018/5798) by ぽぽろんさん
    
情報感謝です。

上記によるMMCからの証明書インストールを試してみましたが、問題の解消にはなりませんでした。
centos7(1804)でscpが通ってcコンパイルできる環境を構築する

#はじめに
今のところ備忘レベルです…
気が向いたら書き直すかもしれません

##ネットワーク回り
Centos7 1804をインストールする

rootでログインする

ssh-keygen -t rsa
・ファイルの保存場所→デフォルト(/root/.ssh/id_rsa)
・パスフレーズ→デフォルト

ls /root/.ssh/
で、
id_rsa
id_rsa.pub
の生成を確認

mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
しておく

chmod 600  ~/.ssh/authorized_keys
コマンドで権限変更。
 
vi /etc/ssh/sshd_config

#Port 22
のコメントアウト削除

#PubkeyAuthentication yes
のコメントアウト削除

service sshd restart
機器設定反映

----------------------------------------
(必要か不明)
ネットワークアダプタがなぜかうまく動いてなかったので

※systemctl restart network.serviceや
　systemctl status network.serviceでエラーを吐く

nmtui　をつかってネットワークアダプタを消して再起動
→デフォルト設定で認識
----------------------------------------

ip addr show で確認


※多分この時点でscpつながる

##ifconfig使いたいのでnet-tools入れる
ここからローカルユーザで入りなおす

リストのアップデート
sudo yum -y update 

sudo install install net-tools

はいる

##gcc入れる
sudo yum -y install gcc
sudo yum -y install gcc-cpp


一旦ここまで。

##参考
https://ameblo.jp/k-freedom7/entry-12236174478.html
Docker for Windowsで急にボリュームのマウントができなくなったとき

昨日まで問題なくマウントできいたものが、ある日突然できなくなりました。
コンテナの中に入って確認してみてもまっさらです。
コンテナ作り直したり、イメージを作り直したりしましたが改善せず困りました。

## 対処法

結果的には`Shared Drives`を一度解除し、再度設定することで直りました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/97227/90057435-5559-172a-f30d-158c0c63a65f.png)

再度設定する際にWindowsログインアカウントのパスワードを問われ、数日前にWindowsのパスワードを変更したことを思い出しました。
(定期的にパスワードを変更しなければならない :unamused: )

パスワードの変更でマウントできなくなるのもどうかと思いますが、マウントできなくて困っているのであれば一度試してみてください。
MMDAgentについてまとめる プラグイン編

# この記事について
MMDAgentを利用する・開発する上でのあれこれをまとめた記事．前回記事からの続きになっているのでそちらも参照されたし．
前回：[MMDAgentについてまとめる FST編](https://qiita.com/m-masaki72/items/8695e7d13607007257c5)

# MMDAgentのプラグインについて
MMDAgentのプラグインはPlugin_***というフォルダで分けられており，ビルドされたものはDLL形式でRelease以下に格納される．以下のようなフォルダ編成になっている．

* MMDAgent本体
    * Plugin_*** (プラグインフォルダ)
    * Release
        * ***.dll (プラグインバイナリ)

MMDAgentが起動されるとDLL形式のプラグインバイナリが呼び出され，スレッドの形で起動される．本記事ではwindows開発視点で記述しているのでDLL形式であるが，各OSでビルドすると各OSのダイナミックリンクライブラリ形式で出力される．
例えば，起動時にプラグインをアンロードしたければ，DLLを削除することで行うことができる，また他のPCでビルドされたDLLをコピーして起動することも可能である．プラグインを独立した機能として実装することにより，拡張性や保守性の高い設計になっている．

# プラグインの作り方
参考になる記事があるのでそこで十分である．以下にリンクを貼る．
[プラグインの作成 - MMDAgent & Project-NAIP wiki](http://cube370.wiki.fc2.com/wiki/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90)
[【MMDAgent解説】MMDAgent1.6でのプラグインの作り方](https://heatconduction.hatenablog.com/entry/2016/03/27/235459)

以上の解説では，MMDAgent1.2時点でのプラグインの作り方と，1.6以降の対応関係の話がまとめてある．
MMDAgent1.7以降対応で，VisualStudio2017でのプラグインの雛形を作ったのでリンクを貼っておく．
[https://github.com/m-masaki72/MMDAgent_Plugin_Skeleton](https://github.com/m-masaki72/MMDAgent_Plugin_Skeleton)

# プラグインのソース
至極簡単なプラグインは以下のようになる．

```
#ifdef _WIN32
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT extern "C"
#endif /* _WIN32 */

#define PLUGINSKELETON_NAME "Skeleton"

/* headers */

#include "MMDAgent.h"
#include "BoneController.h"

/* variables */

static bool enable;

/* extAppStart: initialize controller */
EXPORT void extAppStart(MMDAgent *mmdagent)
{
	enable = true;

	mmdagent->sendMessage(MMDAGENT_EVENT_PLUGINENABLE, "%s", PLUGINLOGGER_NAME);

}

/* extProcMessage: process message */
EXPORT void extProcMessage(MMDAgent *mmdagent, const char *type, const char *args)
{

}

EXPORT void extAppEnd(MMDAgent *mmdagent)
{
   enable = false;
}
```

extAppStart部分ではプラグインがロードされた際の実行を記述する．プラグインのenableやsendMessageで起動したメッセージを送ることを行っている．

extProcMessage部分ではプラグインがメッセージを受信した際の動作を記述する．実際のプラグインがなにをやるかはこの部分に記述することが多い．雛形プラグインではまだなにも記述していない．

extAppEnd部分ではプラグインの終了記述を行う．デストラクタの代わりになるものなので，しっかりと記述しておくこと．これが終了しないとMMDAgent自体がフリーズするおそれがある．
The Art of Reradable Code（英語バージョン）チャプター１まとめる。

この前大学のグループワークで海外の人から「お前のコード読みたくない」と言われてすごい悔しいと思ったので、綺麗なわかりやすいコードを書く能力は必要だと思った。

このThe Art of Readable Code（英語バージョン） をダウンロードして読んでいます。

このブログはそのまとめもしくはメモをしたものです。

チャプター１　パート０

Code Should Be Easy to Understand

コードを書くときに一番大事なルールは

簡単に理解されるコードを書くこと。

The Fundamental Thorem of Readability

他の人が自分のコードを読んで理解するのにかかる時間をできるだけ最小化するべき。

この他の人が理解できると言う意味は

他の人が自分のコードを変えたり、バグを見つけたりできることをさす。

他の人とは未来の自分も入る。何年後かたって自分がそのコードを見たときにすぐ

理解できるかどうかが大事。

Is Smaller Always Better??

行が少ないコードはいつも長いコードよりもいいのか？

少ないコードはいつもいいとは限らない。

結果からして、少ないラインのコードは良いゴールであるが、
コードを理解するのにかかる時間を少なくする方がもっと良いゴールである。

この理解されやすいコードはテストのしやすさや、効率と利害が衝突すると思うだろうが、これらの他のゴールは被らない。

チャプター１　パート０はここまで。
ec2(amazon linux)に古いバージョンのnginxを導入（デフォルトページの表示まで）

仕事だと環境に合わせてバージョンを指定する事があるなと思い、
古いバージョンのnginxってどうやって入れるだっけと調べて試したのでメモ。

前提
　MACを使用
　EC2(amazon linux)インスタンスを立ち上げただけのものを使用
　セキュリティゾーンでsshとhttpを解放済み

ターミナルからsshでec2に入って下記コマンドを実行！

・お決まりのyumアップデート```
sudo yum -y update
```
・古いバージョンのRPMを取得```
sudo rpm -ivh  http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
```
・repoファイルの上書き？```
sudo sed -i -e "s/packages\/centos/packages\/mainline\/centos/" /etc/yum.repos.d/nginx.repo
```
・インストールできるnginxの確認```
sudo yum --showduplicates --disablerepo=amzn-main list nginx
```
・バージョンを指定してインストール```
sudo yum install -y --disablerepo=amzn-main nginx-1.9.15
```
・nginxを起動（これでデフォルトページは表示されるはず。）```
sudo service nginx start
```
・自動起動設定```
sudo chkconfig nginx on
```

※「・インストールできるnginxの確認」では下記画像みたいに表示される
　画像は長いので表示の一部。インストール後に撮ったら色がついた。
![スクリーンショット 2018-07-11 9.52.05.png](https://qiita-image-store.s3.amazonaws.com/0/42969/84beee3c-938e-e047-36e9-eaad177e4816.png)

さて、これをDockerで作れるように頑張るかな。。。
Immutable.jsを使ってReduxのReducerとComponent周りがスッキリした

## 最初に
実はもともとImmutable.jsは使っていて特にRecordsを使ってReduccerとStateの管理を分離していたんだけど、同じようにComponentもスッキリさせることができることを知ったのでまとめてみる。

## Reducer & Action周り
Reduxでアプリケーションを作っていると、どうしてもReducer周りかComponentがごにょごにょせざるをえなくなりかなり見辛いコードになってしまう。

Reducerは交通整理だけに専念するためにImmutable.jsを使う。このImmutable.jsはいろんなことできるようだけど、自分はRecords以外あまりうまく使えていない汗

自分がよくやるのはRecordsにStateを持たせるやり方。よくあるModel的な役割をさせる。

``` javascript
import Users from '../records/Users'

// ActionTypes
export const SUCCESS_USERS_GET = 'SUCCESS_USERS_GET'

// Action
export successUsers = (data) => {
return {
    type: SUCCESS_USERS_GET
    payload: data
  }
}

// Reducer
export const usersReducer = (state = new Users, action) => {
  const {type} = action
  switch (type) {
    case SUCCESS_USERS_GET:
      return state.succeeded(action.payload)
    default:
      return state
  }
}
```

## Records
Recordsでは色々操作できるようにメソッドを作る感じ。`succeeded`では取得したresponseをlistにsetしている。基本的な使い方としてはこれだけで済むんだけど、
Componentでごにょごにょするケースに対応できない。例えばlistの逆順が欲しいとか、userのidだけの配列が欲しいとか。これをcomponent側でやり始めるとコードが混沌としてくる。

そこで`getReverseList`みたいなメソッドを作っておくことで、componentでは`list`が逆順になったものをただ受け取って表示させるっていう仕事だけにすることができる。


``` javascript
import { Record } from 'immutable'

const UsersRecord = Record({
  list: []
})

export default class Users extends UsersRecord {
  succeeded(action) {
    return this.set('list', action.response)
  }

  getReverseList() {
    return this.list.slice().reverse()
  }
}

```

## component
componentで使う場合は`mapDispatchToProps`で呼び出すことができる。これで何も考えずにComponentでは逆順になった`list`を使うことができる。

``` javascript
import { bindActionCreators } from 'redux'
import React, { Component } from 'react'
import { connect } from 'react-redux'

class MyComponent extends Component {
  constructor(props) {
    super(props)
  }

  getUsers() {
    // ここでAPIを叩く
  }

  render() {
    const {list} = this.props
    return (
      <Component list={list}/>
    )
  }
}

function mapStateToProps(state, ownProps) {
  return {
    list: state.user.getReverseList()
  }
}

function mapDispatchToProps(dispatch) {
  return bindActionCreators(
    Object.assign({},{successUsers}),dispatch
  )
}

export default withRouter(
  connect(
    mapStateToProps,
    mapDispatchToProps
  )(MyComponent)
)
```

## 色々解決
Immutable.jsを使うことでこうゆうのとか

``` jsx
render() {
  const {list} = this.props
  const reverseList = list.slice().reverse()
  return <PageComponent list={reverseList} />
}
```
こうゆうのとかをやらなくてよくなった。

``` jsx
createReverseList() {
    const {list} = this.props
    return list.slice().reverse()
  }

  render() {
    return <PageComponent list={this.createReverseList()} />
  }
```

これを知ってからというものImmutable.jsが手放せなくなり、同時にComponent内がスッキリさせることができた。もっと早くに知っておけばと思う今日この頃。

## 反省点
Immutable.js使っちゃいるけど使いこなせていない・・・。もっと使いようがあると思うので、今後勉強していこうと思う。
LaravelのEloquentでオブザーバーを一時的に無効にしたい場合

Laravelのテストでobserverのテストを書いたとき、
observer設定前と設定後の値を比較するためにobserverを一時的に無効にする必要があったのですが、公式マニュアルを読んでもobserverの登録のやり方（`Model::observe(ModelObserver::class)`）はありますが無効にするやり方が記載されていなかったので調べました。

## 環境

|名前|バージョン|
|---| -------- |
|PHP | 7.2.6    |
|Laravel| 5.5.40 |

## やり方

```php
// オブザーバーを無効にする
Model::flushEventListeners();
```

これだけです。
なお、無効にしたあとに有効にするには

```php
Model::observe(ModelObserver::class)
```

です。

observer関連のメソッドは、`Illuminate\Database\Eloquent\Concerns\HasEvents`に定義されているので、observer関連で困ったらここを参照すると良さそうです。
bootstrapを使ったflash表示


##ヘルパーメソッドを使ってflashメッセージをパッケージ化する

まずはcase文を使ってsuccessの場合、errorの場合、alertの場合、noticeの場合、elseの場合の表示メッセージを作成

```application_helper.rb
  def bootstrap_class_for(flash_type)
    case flash_type
      when :success
        "alert-success"
      when :error
        "alert-danger"
      when :alert
        "alert-warning"
      when :notice
        "alert-info"
      else
        flash_type.to_s
    end
  end
```

これでパッケージ化完了

##viewファイルにエラー等発生した場合にflashが起動する様に命令

```application.html.erb
<body>
.
.

   <% flash.each do |key, value| %>
     <div class="alert <%= bootstrap_class_for(key) %>"><%= value %></div>
   <% end %>

   <%= yield %>   
</body>
```

これでsuccessの場合は、keyにsuccessが代入され、それに応じたvalueが返ってきて、errorの場合は、keyにerrorが代入され、指定したvalueが返ってくるようになる
AsciiDocで吹き出し付きブロック要素の下に別のリストを作るTips

AsciiDocで文書を書く際に、リストをセクション代わりに使ってソースの説明をすると……

```test.adoc
* intの例

[source,java]
----
public class Main{
  public static void main(String []args){ //<1>
    int i = 0; //<2>
    i++; //<3>
    System.out.println(i); //<4>
  }
}
----
<1> メインメソッドを作成します
<2> `int` 型の変数を初期値 `0` で定義します
<3> 2の変数の値を `1` 足します
<4> 2の変数の値をコンソール出力します

* doubleの例

[source,java]
----
public class Main{
  // 略
}
----
```

みたく書いていましたが、これを `html` にすると、↓のように「doubleの例」の部分が吹き出しの一部として表示されてしまいます。

![listUnderFukidashi.PNG](https://qiita-image-store.s3.amazonaws.com/0/162142/38c6d61f-8966-cf09-8f1a-146818f2e285.png)

これを防ぐには、吹き出しとリストの間にコメントを挿入します。

```test.adoc
<4> 2の変数の値をコンソール出力します

// こ↑こ↓

* doubleの例

[source,java]
----
public class Main{
  // 略
}
----
```

すると……

![listUnderFukidashi2.PNG](https://qiita-image-store.s3.amazonaws.com/0/162142/1a78ba2d-7448-ab37-1321-eb9b54fb71d1.png)

無事に吹き出しとリストを別に出来ました。
[Asciidoctor 文法クイックリファレンス(日本語訳)のリストのヒント](https://takumon.github.io/asciidoc-syntax-quick-reference-japanese-translation/#_%E3%83%AA%E3%82%B9%E3%83%88)を読んで思いつきました。

~~ただ、そもそもリストをセクション代わりに使うのが間違いでもある:sweat:~~
virtualenv-pyenv で pyenv shell した後に deactivate 出来ない

# 問題

`$ pyenv shell [virtualenv_name]` した後に `$ pyenv deactivate` が効かない。

# 解決

`$ pyenv shell system` で `deactivate` 状態にできた。


# 環境

- pyenv-virtualenv 1.1.3 (virtualenv unknown)
- pyenv 1.2.5








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Node.js(axios利用)でSlackにPOSTするサンプル


Node.js v10.6.0です。 自分がオーナーのSlackって実は持ってない気がするのであんまりSlackのBOTって試してなかったり...

```app.js
'use strcit';

const axios = require('axios');
const BASE_URL = `https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxx`; // トークンURL
let options = {
    method: 'post',
    baseURL: BASE_URL,
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    },
    data: `payload={
        "channel": "#general",
        "username": "webhookbot",
        "text": "test",
        "icon_emoji":":ghost:"
    }`
};

const main = async () =>{
    try {
        const res = await axios.request(options);
        console.log(res.data);
    } catch (error) {
       console.log(error);
    }
}
main();
```

実行してエラーがなければOKです。

```
$ node app.js
ok
```
Unity ビルドがpngファイルの「Hold on」で固まる時の対処

Unity でAndroid ビルドを実行すると「Hold on」メッセージのまま固まる。一度落としてUnity を再起動してもプロジェクトを開く時に「Hold on」で固まる。そんな時の対処をメモ。

## 環境
* Unity 2017.4.4f1
* Build Target はAndroid

## 現象
ビルドした時などに表示される「Hold on」メッセージボックスに、Assets 以下のpng ファイル名が表示されたままプログレスバーが進まない。

スクリーンショット撮り忘れたけど再現するのがしんどいので省略。

## 対処
拡張子png.meta のファイルを全部消してUnity 再起動。

以下の記事を見つけて助かった。ベストアンサーを参照。
[Unity 5 crash on asset import with android](https://answers.unity.com/questions/921076/unity-5-crash-on-asset-import-with-android.html?sort=oldest)

ひっかかったのはAsset Store からImport したファイルっぽい。meta ファイルの中を見ると、Compress まわりの設定が残っているのが問題なのかも。

ひとまず現象回避できたのでここまで。
OTP を使い Basic 認証をセキュリティを高める

# はじめに
数年前に触ったものを思い出しがてら触ってみよう。

# 目的
Web サイトにアクセスした際、Basic 認証のパスワードをワンタイムパスワード(OTP)にする。

# 導入方法
## mod_authn_otp の導入
その辺に転がっていた CentOS で試す。

```
# 必要なモジュールをインストール
yum install -y httpd httpd-devel openssl-devel automake gcc git

# GitHub から mod-authn-otp を落とす
git clone https://github.com/archiecobbs/mod-authn-otp.git

# make & make install
cd mod-authn-otp/
./autogen.sh -c
make && make install
```
## Apache httpd の設定変更
無事、モジュールの作成が完了したら、httpd に反映させる

```
# モジュールを追加
echo 'LoadModule authn_otp_module modules/mod_authn_otp.so' > /etc/httpd/conf.modules.d/99-authn.conf

# Syntax Check
httpd -t

# httpd の起動
systemctl start httpd
```

## 検証環境の準備
テキトーな VirtualHost を用意

```
cat /etc/httpd/conf.d/vhost.conf
<VirtualHost *:80>
  ServerName hoge.com
  DocumentRoot /var/www/html

  <Location />
    Satisfy any
    Order allow,deny
    Allow from 127.0.0.1
    AuthType Basic
    AuthName "OTP Authentication (Enter OTP as password)"
    AuthBasicProvider OTP
    Require valid-user
    OTPAuthUsersFile /var/www/otp/users
    OTPAuthMaxLinger 3600
    OTPAuthLogoutOnIPChange On
  </Location>

</VirtualHost>
```

## OTP用のUserファイルの作成

Userファイルを生成するスクリプト。
「your_company_name」は任意のものに変えて利用する。このスクリプトを実行する時は、引数にBasic認証用のユーザ名をつけて実行する。

```
#!/bin/bash -e
user=${1:?Usage: $0 username}
issuer=${2:-your_company_name}
secret=$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 15 | head -n 1)
secret_base16=$(python -c "import base64; print base64.b16encode('${secret}')")
secret_base32=$(python -c "import base64; print base64.b32encode('${secret}')")
otpauth_uri="otpauth://totp/${issuer}:${user}?secret=${secret_base32}&issuer=${issuer}"
otpauth_uri=$(python -c "import urllib; print urllib.quote('${otpauth_uri}')")
qrcode_url="https://chart.googleapis.com/chart?chs=300x300&cht=qr&chl=${otpauth_uri}"

file="/var/www/otp/users"
if [ ! -f "${file}" ]; then
  [ -d $(dirname "$file") ] || mkdir -p $(dirname "$file")
  touch ${file}
  chown -R apache:apache $(dirname "$file")
fi
[ -w "${file}" ] || (echo "${file}: Permission denied" && exit 1)

count=$(awk "\$2 ~ /^$user}\$/" ${file} | wc -l)
if [ $count -le 0 ]; then
  echo "HOTP/T30 $(printf '%-12s' $user) - ${secret_base16}" >> ${file}
  echo "$qrcode_url"
else
  echo "User '$user' already exists"
fi
```

実行後、標準出力にGoogle Authenticator 等で利用出来る登録用の QR コードが表示される URL が出力される。設定した Username と QR コードの URL は忘れないように。

```
# ↓の URL はダミーだよ
./authn.sh hoge
https://chart.googleapis.com/chart?chs=300x300&cht=qr&chl=otpauth%3A/~
```

## 利用するユーザ側の準備
スマホを用意し、Google Authenticator とか OTP 対応アプリをダウンロードしよう。アプリから↑で発行された QR コードを読み込む。

## サイトにアクセスする
該当サイトにアクセスすると簡易認証が表示されるので、スクリプト実行の際に指定したユーザ名と、OTP 対応アプリに表示されているパスワードを入力し、認証が通ればOK。

# 注意点
- QR コード発行の URL の取扱に注意(外部に漏れたら意味なし)
- URL の再発行は出来ない(作り直し)

## 仲間募集中
[弊社](https://www.nittsu-infosys.com/)ではエンジニアを募集中です。インフラからアプリ、ユーザサポートまで幅広く業務を行ってます。
https://www.nittsu-infosys.com/recruit/2019/index.html
[Ansible]  条件定義の基本

assert モジュールを使って条件定義のテストをしてみる。

# Playbookの例

例として `known` 変数が定義されており、 `unknown` 変数が定義されていない場合。
以下の検証は全てパスする

```yaml
- hosts: localhost
  tasks:
    - assert:
        that:
          # 肯定条件
          - known is defined

          # 否定条件
          - unknown is not defined
          - not unknown is defined

          # 否定の否定
          - not known is not defined

          # and 条件
          - known is defined and unknown is not defined

          # or 条件
          - known is defined or known is not defined

          # 複雑な条件はカッコでくくることが出来る
          - not (known is defined and known is not defined)
      vars:
        known: true
```

# 環境

- ansible 2.6.0

# 参考

- [Conditionals — Ansible Documentation](https://docs.ansible.com/ansible/2.6/user_guide/playbooks_conditionals.html)
- [assert - Asserts given expressions are true — Ansible Documentation](https://docs.ansible.com/ansible/2.6/modules/assert_module.html)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Dockerチュートリアルやってみた（第2章コンテナ）その１

[前回](https://qiita.com/kugyu10/items/08dc6fcd9a9a907c99ba) の続き。

Docker チュートリアル2章・・・に入る前に、

今朝やってみたら、```docker info```がうまく動かない

```
$ docker info
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```

コンテナが動くには、前提として、docker daemonが起動している必要がある。
Docker for macをまだ起動してなかっただけでした、てへぺろ。

# 第2章Container

どうやらDockerを最低限使いこなすにはこの３つの概念が必要なようだ。

- Stack
- Services
- Container（今ここ）


## Dockerfileを作る

Containerを```Dockerfile```なるもので定義する。

テキトーに作業フォルダに
```Dockerfile``` をつくる。
ついで```app.py```と
```requirements.txt```も。

中身は読んでもあんまり理解できず。でもコピペして進む。

```
$ docker build -t friendlyhello .
```

ファイル名を間違えてるとここで怒られる。
でうまくいくと

```
...
Successfully built 8543f6131f0c
...
```
とかなんとか出てくる。

## 実行

```
$ docker run -p 4000:80 friendlyhello
```

なんかエラーでた

```
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
172.17.0.1 - - [10/Jul/2018 23:16:35] "GET / HTTP/1.1" 200 -
172.17.0.1 - - [10/Jul/2018 23:16:36] "GET /favicon.ico HTTP/1.1" 404 -
```
エラーじゃなくて警告（WARNING）だった。

チュートリアルどおり ```http:localhost:4000```叩いたら
なんかhello worldでてきたよ！

<img width="416" alt="スクリーンショット 2018-07-11 8.19.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/158747/034614c5-43ba-572c-84f3-d9db46a6898f.png">

```
$ curl http://localhost:4000/
```
こっちは駄目でした。接続拒否される・・・と思ったら
同じターミナルでやろうとして、
docker-run-friendlyhelloをCtrl+Cで止めてたからでした。

別ターミナル開いてやるか、バックグラウンドで実行してからcurlすれば、、、

```
$ curl http://localhost:4000/
<h3>Hello World!</h3><b>Hostname:</b> 2b75bdad070c<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>[~]
```

見れました。
containerの終了の方法は

```
docker container ls
```

でcontainerIDを確認後、

```
docker container stop {さっきのID}
```

ってやるだけ。簡単ですね。

２章はまだ半分だけど今日はここまで。
おまえらいいからアウトプットしようぜ。自分ではなかなか手に入らない知識が手に入るから。

## TL;DR

システムエンジニアは学んだこと、考えたこと、作ったモノをどんどんアウトプットしようぜ
他人のためじゃなく、自分のためになるから
長期的ではなく、短期的にもメリットあるから

## はじめに

いろんな経緯があって、生産性改善の名の下に、
[Growi](https://qiita.com/yuki-takei/items/5df9601039ccfc1df01f)というWikiを導入して、みんなでノウハウ共有しようぜって絶賛失敗中なのが現在

仕方無いので、自分で一日一善方式でノウハウ共有をしてる
いつかみんな乗っかってくれるようになるといいなと思って

ちな、社外にも書けるようなものは、Qiitaにも投稿してる

## 自分の無知があらわになる

社内で文字コードに関する記事を書いたり、
QiitaでGMO社の被害の件を書いたりしたときに、
通称[マサカリ](https://qiita.com/kaityo256/items/d7d8f7a0e522895c8f5d)を担いだ人に[めちゃくちゃたたかれたり](http://b.hatena.ne.jp/entry/s/qiita.com/gakuri/items/f70cf6c10fbb846335d5)した

当初は、「そこは本筋じゃないだろ」とか「マウント乙」とか反発していたけど
時間が経って冷静になると、あれ？これめっちゃ勉強になるじゃん？ということに気づいた

## マサカリさんほんとウェルカム

アウトプットしなければ、文字集合と符号化文字集合と文字符号化方式に対する、
深い知識は得られなかっただろうし、
GMOの件を書かなければ、「被害を受けたのか、あたえたのか」という視点や
Struts と Struts 2 の違いも知らなかっただろうし、（どっちにしてもゴミ箱ポイーだけど）
Frameworkを取り巻く実態への関心も湧かなかった

それなりに勉強してきたつもりだったけれど、
どうしてもこれまでの勉強法では穴になりがちな場所を、
**マサカリさんが無料で埋めてくれる**ことに気づいてしまった

## そういえば、JAWS-UGのぱるるさんも同じ事言ってた

そういえば、去年かおととしかのコミュニティがテーマのデブサミで、
JAWS-UGのぱるること[金春さん](https://www.facebook.com/t.konparu)が、同じような事を言ってた
https://www.slideshare.net/tkonparu/20160312-jaws-days-2016-keynote

曰く、
「勉強会に出るよりも、登壇した方が勉強になる」
「終わった後、間違いは指摘してくれるし、聞いてもいないのにウチはこうやってるよと教えてくれる」
とか

## アウトプットの効果は長期的なポートフォリオ作りだけではない

エンジニアにとってのアウトプットって、
巷間、転職のときにつかうハッタリづくりだとか、
承認欲求だとかなんとか言われているけれど

それだけじゃなくてもっと短期的に、もっと即物的に、
自らの技術を磨くのに、従来の勉強法でどうしてもできてしまう穴を補うのにとっても有効だ

## 批判されたっていいじゃん

適当なこと書くと怒られる？批判される？修正すればいいじゃん
別に命まで取られるわけじゃないし
社会的な制裁が加えられるわけじゃないし([^1])
だれかをバカにしたり、機密を漏らしたりしなければ、
ちょっといらいらしたり、恥かいたりするだけだから
いやな思いもどうせ3日で忘れるから

そんなことよりももっと大きいモノが手に入るから

※この記事の2年後に受け止めきれない量の批判を受けましたが、
　それでもやっぱりアウトプットすべきと考えました。
※よろしければこちらの後日談もお読みください。
[それでもアウトプットにYESという。～マサカリを抱きしめて～](https://qiita.com/gakuri/items/4dc625a8dc089ac1cfbe)

## システムエンジニアはアウトプットネタに事欠かない

システムエンジニアは好むと好まざるとに関わらず日々勉強だ
勉強しているつもりがなくても毎日新しい学び、発見、気づきがあるはず
だからやろうとおもえばどんどんアウトプットできるんだ

若手の自分の学びなんて価値がない？
何言ってんの？
毎年のように何もしらない若手がこの業界に入ってきてるんだよ
ベテランのおっさんどもには、若手の気持ちや学びの感動はもうわからない
それこそ君にしか書けない内容だよ

おっさんだけどそんなにすごいことしてないから、書くことない？
何言ってんの？
世の中が英雄だけで構成されていると思ってる？そんなわけないないじゃん
凡人のほうが多いんだから、凡人の学びこそ君にしか書けない内容だよ
英雄な人たちのアウトプットはもうすでに世の中にあふれてるからね
凡人のアウトプットのほうが希少価値が高いからね

## いいからアウトプットしろ

ごちゃごちゃ言ったけど、御託はいいからアウトプットしようぜ
きっと素晴らしい世界が広がってるから

マサカリで切られて泣くこともあるだろうけど、
消費税みたいなもんだから

[^1]: 悪意はないのにアウトプットの結果思わぬ制裁を加えられることも、Yahoo女性エンジニア問題のようにゼロではないが極めてまれな事例
kopsで作ったクラスタでnode-exporterを動かす

node-exporterはコンテナで動かすこともできますが、うまく扱えないメトリクスもあるので直で動かしたいと思いました。

kopsにはhooksという機能があり、任意のsystemd unitを動かすことができます。fileAssetsでcluster spec経由でファイルを作成できるので、それらを組み合わせてnode-exporterを直に動かしました。

`kops update cluster`

```yaml
  fileAssets:
  - content: |
      curl -LO https://github.com/prometheus/node_exporter/releases/download/v0.16.0/node_exporter-0.16.0.linux-amd64.tar.gz &&
      tar xzf node_exporter-0.16.0.linux-amd64.tar.gz
      mv node_exporter-0.16.0.linux-amd64/node_exporter /usr/bin/node_exporter
    name: inst_node_exporter
    path: /usr/local/bin/inst_node_exporter
    roles:
    - Master
    - Node
  hooks:
  - manifest: |
      [Unit]
      After=network-online.target
      [Service]
      Type=oneshot
      ExecStart=/bin/bash /usr/local/bin/inst_node_exporter
      WorkingDirectory=/tmp
    name: inst_node_exporter.service
    roles:
    - Master
    - Node
  - manifest: |
      [Unit]
      After=inst_node_exporter.service
      [Service]
      Restart=always
      ExecStart=/usr/bin/node_exporter
    name: node_exporter.service
    roles:
    - Master
    - Node
```
[Ansible] assert の基本 ( 文字列を比較する )

# playbookの例

```yaml
- hosts: localhost
  vars:
    some_string: MY NAME IS ME
    assert_string: MY NAME IS ME

    # 変数同士を比較する
    - assert:
        that: some_string == assert_string

    # 変数とベタ書きの文字列を比較する
    - assert:
        that: some_string == 'MY NAME IS ME'

    # 変数と「ansible的な変数展開後の文字列」を比較する
    - assert:
        that: some_string == '{{ assert_string }}'

   # ベタ書きの文字列同士を比較する ( YAML文法的にダブルクオートで囲っているが、ansibleの処理ためではない )
    - assert:
        that: "'MY NAME IS ME' == 'MY NAME IS ME'"
```

# 実行結果

全ての assert にパスする。

```bash
TASK [assert] ************************************************************************************************************************************
ok: [localhost] => {
    "changed": false, 
    "msg": "All assertions passed"
}

TASK [assert] ************************************************************************************************************************************
ok: [localhost] => {
    "changed": false, 
    "msg": "All assertions passed"
}

TASK [assert] ************************************************************************************************************************************
ok: [localhost] => {
    "changed": false, 
    "msg": "All assertions passed"
}

TASK [assert] ************************************************************************************************************************************
ok: [localhost] => {
    "changed": false, 
    "msg": "All assertions passed"
}

TASK [assert] ************************************************************************************************************************************
ok: [localhost] => {
    "changed": false, 
    "msg": "All assertions passed"
}

TASK [assert] ************************************************************************************************************************************
ok: [localhost] => {
    "changed": false, 
    "msg": "All assertions passed"
}

PLAY RECAP ***************************************************************************************************************************************
localhost                  : ok=7    changed=0    unreachable=0    failed=0   

```

# 環境

- ansible 2.6.0

# 参考

- [assert - Asserts given expressions are true — Ansible Documentation](https://docs.ansible.com/ansible/2.6/modules/assert_module.html)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
mermaid.jsで簡単フローチャート

# 最初に
mermaid.jsが便利なのでおすすめしたかった
ほぼ
https://mermaidjs.github.io/flowchart.html
を写したもの
環境はATOM+atom-mermaid
(右クリック→Mermaid Preview→画像の上で右クリックで画像を保存できる)

# 方向
## 上→下のフローチャート

```
graph TD
    始まり --> 終わり
```
![mer1.png](https://qiita-image-store.s3.amazonaws.com/0/227582/6be3177a-2659-d724-c4af-c926cdf1a75c.png)

## 左→右のフローチャート
```
graph LR
    始まり --> 終わり
```
![mer2.png](https://qiita-image-store.s3.amazonaws.com/0/227582/4870a3d0-ebcb-a554-3b73-cf47877f5d9d.png)

# 形
## ちょっと丸く
```
graph LR
    id1(丸くする)
```
![mer3.png](https://qiita-image-store.s3.amazonaws.com/0/227582/2f14fef0-b514-b582-de86-59c6c5e437b8.png)
## 丸

```
graph LR
    id1((もっと丸))
```
![mer4.png](https://qiita-image-store.s3.amazonaws.com/0/227582/36a8f53c-1409-1350-06a4-0be41e925d43.png)

## ダイヤ
```
graph LR
    id1{ダイヤ}
```
![mer5.png](https://qiita-image-store.s3.amazonaws.com/0/227582/d8d9cc5b-a27d-b466-6f6c-20f14efb1294.png)

# 矢印
## 矢印を線にする
```
graph LR
    始まり --- 終わり
```
![mer6.png](https://qiita-image-store.s3.amazonaws.com/0/227582/8c0418dc-c27c-7001-dfbe-a53aa21eb6a8.png)

## 矢印を点線に
```
graph LR;
   ドットに-.->なるよ;
```
![mer7.png](https://qiita-image-store.s3.amazonaws.com/0/227582/5c62efd5-8258-3e7a-c564-20e21e5910a3.png)

## 太矢印

```
graph LR
   太い ==> 太いよ
```
![mer8.png](https://qiita-image-store.s3.amazonaws.com/0/227582/b172e023-f03f-308b-3d1f-54399001d397.png)

## 文字付き矢印
```
graph LR
    始まり-->|途中|終わり
```
![mer9.png](https://qiita-image-store.s3.amazonaws.com/0/227582/3f777874-49da-d680-a6ea-398617047faa.png)

# その他
## 文字中に記号を使いたいとき
```
graph LR
        A["！？！？"] -->B["……"]
```
[""]で囲む。
![mer10.png](https://qiita-image-store.s3.amazonaws.com/0/227582/aac31951-c39d-3d10-3bc0-2a46408ef30a.png)

# 最終的に…
こういうフローチャートができる。
![mer11.png](https://qiita-image-store.s3.amazonaws.com/0/227582/a188da9f-a847-716e-9efc-ae1b5c5a0fed.png)

```
graph LR
        A["ひき肉、<br>卵、玉ねぎ"] -->B(("パン粉"))
        A["ひき肉、<br>卵、玉ねぎ"] -->C(("豆腐"))
        B(("パン粉"))-->|焼く|D(ハンバーグ)
        C(("豆腐"))-->|焼く|E(豆腐ハンバーグ)
```
Pythonで世界地図-15(詳細地図付き)

参考
Basemap tutorial
http://basemaptutorial.readthedocs.io/en/latest/locator.html

![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/0ee23ca6-8094-9cf1-3ab8-311628c806f0.png)

```python:
#!/usr/bin/python3
# coding: UTF-8

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes
from mpl_toolkits.axes_grid1.inset_locator import mark_inset
import numpy as np
import japan_border2 as jb2 #都府県境界線

fig = plt.figure()
ax = plt.axes()

map = Basemap(projection='cyl', lat_0=0, lon_0=147)

map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='coral',lake_color='aqua', zorder=0.5) # zorder=0だと陸地と海が同じ色、zorder=1または指定しないとドットが地図の後ろに隠れる
map.drawcoastlines()
map.drawcountries() #国境線

lons = np.array([136.539017, 140.224618, -13.2, -96.8, -7.99, 7.5, -17.3, -3.7])
lats = np.array([34.845602, 36.531433, 8.5, 32.7, 12.5, 8.9, 14.7, 40.39])
cases = np.array([20, 20, 6073, 4, 6, 20, 1, 1])

x, y = map(lons, lats)

map.scatter(x, y, s=cases, c='r', alpha=0.9)

axins = zoomed_inset_axes(ax, 20, loc=1)#loc1 : 1(右上), 2(左上), 3(左下), 4(右下)
axins.set_xlim(135, 142)
axins.set_ylim(33, 37)

plt.xticks(visible=True) #visible=Falseと変わらない
plt.yticks(visible=False)

#詳細地図
map2 = Basemap(llcrnrlon=135,llcrnrlat=33,urcrnrlon=142,urcrnrlat=37, ax=axins, resolution = 'i')
map2.drawmapboundary(fill_color='aqua')
map2.fillcontinents(color='coral',lake_color='aqua', zorder=0.5)
map2.drawcoastlines()
map2.drawcountries()
jb2.prefectural_bound(map = map2) #都府県境界線を表示

mark_inset(ax, axins, loc1=2, loc2=4, fc="none", lw=2, ec="b") #詳細地図の設定
#loc1, loc2 : {1(右上), 2(左上), 3(左下), 4(右下)},facecolor(fc),edgecolor(ec) 

map2.scatter(x, y, s=cases/2., c='r', alpha=0.9)

plt.show()
```
1行で書く『「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了』

## **ズンドコキヨシ**

こちらの記事が面白かったので僕もチェレンジしてみました。

[ズンドコキヨシをLINQでゴリ押してみる](https://qiita.com/urahito_solution/items/4432a08c72e05bcbd414)

元ネタはこちらだそうです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Javaの講義、試験が「自作関数を作り記述しなさい」って問題だったから<br>「ズン」「ドコ」のいずれかをランダムで出力し続けて「ズン」「ズン」「ズン」「ズン」「ドコ」の配列が出たら「キ・ヨ・シ！」って出力した後終了って関数作ったら満点で単位貰ってた</p>&mdash; てくも (@kumiromilk) <a href="https://twitter.com/kumiromilk/status/707437861881180160?ref_src=twsrc%5Etfw">2016年3月9日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

C#でやってみることにします。
LINQを使ってワンライナーで書くことチャレンジしてみました。

## **実行結果**

![carbon (1).png](https://qiita-image-store.s3.amazonaws.com/0/195024/7e074db4-5feb-e2e4-c65a-fb1ab698d854.png)


成果物はこちらです。

```c#:1行ズンドコ
Console.WriteLine(Enumerable.Range(0, 1000).Select(x => new[] { "ZUN", "DOKO" }.OrderBy(_ => Guid.NewGuid()).First()).Aggregate((acc, cur) => acc.EndsWith("KI・YO・SHI!!") ? acc + "" : acc.EndsWith("ZUN ZUN ZUN ZUN DOKO") ? $"{acc} KI・YO・SHI!!" : $"{acc} {cur}"));
```

分かりやすく改行すると以下のようになります。

```c#
Console.WriteLine(Enumerable
    .Range(0, 1000)
    .Select(x => new[] { "ZUN", "DOKO" }
        .OrderBy(_ => Guid.NewGuid()).First())
    .Aggregate((acc, cur) =>
        acc.EndsWith("KI・YO・SHI!!")
            ? acc + ""
            : acc.EndsWith("ZUN ZUN ZUN ZUN DOKO")
                ? $"{acc} KI・YO・SHI!!"
                : $"{acc} {cur}"));
```

`Guid.NewGuid`で並び替え、最初の要素を取得することで、
ランダムに「ズン」「ドコ」を取得できるようにしました。

`Enumerable.Range(0, 1000)`モヤっとしますが、
「ズンズンズンズンドコ」が現れる確率が`2 x 2 x 2 x 2 x 2`の 32 分の 1 なので十分かなと...
Linq の`Any`とか使えば「キ・ヨ・シ」で処理中断できるから綺麗そう、、、？

`Aggregate`の畳み込みをする際に`Stringbuilder`を使わないと遅くならないかな？と考えましたが「ズンズンズンズンドコ」が現れる確率が高いので速度は気になりませんでした。
エピソードを使ったINTER-Mediatorのハンズオン - 機能拡張リスト

#はじめに
大勉強会のハンズオンのエピソードです。全員でエピソードに沿ってハンズオンを行います。マシンは各自持参したマシンかイベントで用意したマシンを1名1台使用します。

まず、『エピソードを使ったINTER-Mediatorのハンズオン1 - 基本機能』で作成し、そして、Webアプリの機能を拡張します。

![スクリーンショット 2018-07-10 15.39.26.png](https://qiita-image-store.s3.amazonaws.com/0/54439/7e857f92-fb92-1e6a-7c99-48752c76b3dd.png)

#学習のポイント
 - シナリオの開発者(一般企業の総務さん）
 - コピペと手打ち
 - ユーザとモック
 - 定義ファイルとページファイルの開発
 - Terminal.appの使用とコマンド入力
 - DBスキーマの作成とSQL


#機能拡張リスト
| タイトル |前提|
|:-:|:-:|
|[エピソードを使ったINTER-Mediatorのハンズオン 1 - 基本機能](https://qiita.com/motofumi/items/4aa15b519285e5a8fa55)||
|[エピソードを使ったINTER-Mediatorのハンズオン 2 - 機能拡張 (ポップアップメニュー)](https://qiita.com/motofumi/items/3ec56f76a93b60a9315a)|2|
|[エピソードを使ったINTER-Mediatorのハンズオン 3 - 機能拡張 (バリデーション)](https://qiita.com/motofumi/items/aa02ccd9a4697c0d1fab)|2|
|[エピソードを使ったINTER-Mediatorのハンズオン 4 - 機能拡張 (検索)](https://qiita.com/motofumi/items/e6ef7b18c89ef076ea2e)| 2|
|[エピソードを使ったINTER-Mediatorのハンズオン 5 - 機能拡張 (集計)](https://qiita.com/motofumi/items/dab356ce33427746ccc3)| 4|

#シナリオ
##背景
私は、社員10名の会社に勤める総務課の社員です。コンピュータが得意な為、コンピュータの購入や社員への配布にも携わっています。日頃から他の社員にコンピュータの使い方やトラブルシューティングの相談なども受けています。最近は、コンピュータサポートは私の業務の一部となってきました。

私がコンピュータが得意な理由の一つに、以前から、趣味のWebサイトをレンタルサーバで運用しています。その中で、参考書を見ながらではありますが、HTMLやCSSを書いて見栄えの良いWebページを作成したり、苦労しましたが、MySQLとPHPを使って、データベースの情報をWebページに反映させたりもしています。

弊社は、請求書と決算書の為に経理システムを導入しています。その他の業務は、それぞれの部署がExcelやWordを使って書類を作成しています。社長は日頃から、経理システム以外の業務もシステム化したいと考えていますが、費用の問題があり、外注できない状況にあります。業務は紙ベースですすめているので、どこからシステム化をすれば良いかもわからない状態です。

ある日、外回り営業マンの同僚が、交通費など、１日に使った『経費メモ』をとっていることを知りました。そのメモから経理に提出する『支払伝票』を作成しているそうです。使った当日に経費精算できる場合もあれば、数日たまる場合もあり、メモを無くしたり、いくら経費を精算したかわからなく場合もあるそうです。メモをExcelの表にしたこともありますが、手間が増えるでやめたと言っていました。そこで同僚は簡単にメモを残して、どこまで精算したかをシステム化できないか相談されました。

メモ
<img width="610" alt="スクリーンショット 2018-05-17 9.57.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/54439/1c363ced-06eb-c873-25eb-31c3ea136fb1.png">

支払伝票
<img width="691" alt="スクリーンショット 2018-05-17 10.20.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/54439/d6a99955-0024-c24c-68fc-996b223b5c78.png">

<img width="690" alt="スクリーンショット 2018-05-17 10.20.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/54439/b3e418e0-ada5-1e90-d87b-f21785f5a812.png">


##動機付け
この同僚の希望であれば、MySQL、HTML、PHPを使えば、Webベースの『経費メモ』のシステムをわたしのスキルでも作成できそうです。ただ、PHPを使ってスクラッチから開発するには、たとえ小さなシステムでもわたしにとっては大変です。開発を簡単にする為にWebアプリケーション開発フレームワークを使ってみようと思いました。

Webアプリケーション開発フレームワークには、『CakePHP』、『CodeIgniter』、『Ruby on Rails』などメジャーなものがありますが、学習コストが高そうです。そこで、最近知った『INTER-Mediator』というWebアプリケーション開発フレームワークを使ってみようと思いました。このフレームワークの大きな特徴の一つに、データベースをデータを『html』と『定義ファイル』を書くだけで、データの『追加, 更新, 削除』がWebページから簡単にできるようです。

初めて、Webアプリケーション開発フレームワークを使った開発に取り組むっていうのも楽しそうなので、同僚にも感謝されそうだし、いっちょやってみようと考えてみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/54439/2b4344f3-2adf-d81c-f28e-2b98918d0554.png)

#将来的に
今後、iPadのようなナビゲーションができる『マスター/ディテール』を切り替えながら使えるフロントエンドのビューを作ったり、認証、クライアント間の同期(PUSSER)やPDF出力にも興味があり、取り組みたいと考えています。
Angular cliでsass/scssを使う

# Angular cliでsass/scssを使う。

- project作成時
- 作成中のProject

[参考](https://stackoverflow.com/questions/36220256/angular-cli-sass-options)

## Project作成

Angular cliでプロジェクトの作成タイミングと一緒に使う

```terminal
$ ng new sass-sample --style=sass # sassのプロジェクト作成
$ ng new scss-sample --style=scss # scssのプロジェクト作成
$ ng new less-sample --style=less # lessのプロジェクト作成
```

## 作成中のProject

### Angular6以前

```terminal
$ ng set defaults.styleExt scss
```

### Angular6以降

#### cliで設定

```
$ ng config schematics.@schematics/angular:component.styleext scss
```

#### angular.json

```angular.json
"schematics": {
      "@schematics/angular:component": {
      "styleext": "scss"
    }
}
```