OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonに日々の服装（ジャージ）を選択させる

# 概要
私は、年中ジャージを愛用しています。その組み合わせは大きく4通りほどです。そこでもっと楽しいジャージライフが送れるよう、Pythonに天気予報を取得してもらい、ジャージのスタイルを選択してもらうことにしました。
ちなみに、結果は自分専用のSlackにrequestsを使い投げてもらうことにしていますが、今回はジャージ選択の部分だけを書きます。

# 環境
windows10
Python3.6.5
Anaconda3

livedoor Weather Hacks

# 実装
## 必要なインポート

```python:Choice_jersey.py
import json
```

## 天気予報を取得する
天気予報JSONデータを取得します。
今回は、livedoor Weather Hacksを使用しています。
コードは以下の通りです。

```python:Choice_jersey.py
def get_weather():
    url = 'http://weather.livedoor.com/forecast/webservice/json/v1'
    city = {'city': '130010'} #東京
    weatherdata = requests.get(url, params = city).json()
   
    return weatherdata
```
取得できる情報や都市コードなどは[こちら](http://weather.livedoor.com/weather_hacks/webservice)を参考にしました。

## 服装の選択
取得した天気予報データを使って、その日のジャージスタイルを選択してもらいます。
今回はサンプルとして、判断は最高気温のみをもとにしています。
コードは以下の通りです。

```python:Choice_jersey.py
def choice_jersey(weatherdata):
    jerseyplan = 'naked'
    plandate = weatherdata['forecasts'][0]['date']#当日の日付
    temperature = weatherdata['forecasts'][0]['temperature']['max']['celsius']#最高気温の取得
    
    if temperature > '31':
        jerseyplan = '夏スタイルです。'
    elif '20'< temperature <= '31':
        jerseyplan = '中の上スタイルです。'
    elif '15' <= temperature <= '20':
        jerseyplan = '中の下スタイルです。'
    else:
        jerseyplan = '冬スタイルです。'

    posttext = plandate + 'のジャージプランは' + jerseyplan

    return posttext
```

## 悪天候の日は…
悪天候日は傘を持っていくことを促すようにしてもらいます。今回は雨と雪のときのみです。
コードは以下の通りです。

```python:Choice_jersey.py
    telop = weatherdata['forecasts'][0]['telop']
    if telop == '雨' or '雪':
        option =  '傘を持っていきましょう。'
```


---------------------------------------------------------------
あとは出来たテキストをLINEなりSlackなりに投げてあげるようにすれば、ジャージマイスターの完成です。タスクスケジューラなんかに入れて、自動化するのも良いと思います。


# まとめ
これで楽しいジャージライフが送れます。
[macOS] 消えない日本語変換のウィンドウをコマンド一発で消す

こういうやつが画面に残っちゃって何しても消えない時ありますよね。

![スクリーンショット 2018-06-27 22.09.22.png](https://qiita-image-store.s3.amazonaws.com/0/59853/25b47c78-f424-d9bb-211e-3e04fa74ddb2.png)

これはシステムの日本語変換プロセスを殺せば消えますよね。
アクティビティモニタで日本語変換プログラムを探して終了ボタンを押すだけです。

![アクティビティモニタ__自分のプロセス_.png](https://qiita-image-store.s3.amazonaws.com/0/59853/80430ae7-1247-f24d-dbd7-8af30b013ff4.png)

ただこれ、たまになら我慢できますが、自分の環境だとだいたい毎日なります。
マシンが古くてグラフィックが弱いからか、ひどい時は２〜３回なります。
アクティビティモニタ起動してプロセス探して…っていう手順が面倒すぎる・・・(><)

**・・・プロセス探すならコマンドでできるな**

```shell
% ps x | grep Japanese
86502   ??  Ss    13:47.36 /System/Library/Input Methods/JapaneseIM.app/Contents/PlugIns/JapaneseIM.appex/Contents/MacOS/JapaneseIM
```

要はこいつ↑を殺せばいいのか！

```shell
kill `ps x | grep JapaneseIM.appex | grep System | awk '{ print $1 }'`
```

消えましたー！

![スクリーンショット 2018-06-27 22.40.22.png](https://qiita-image-store.s3.amazonaws.com/0/59853/71fc63ec-542a-14e3-c518-b32f49352739.png)

エリアスにするときはこんな感じでエスケープさせつつ登録しましょう。

```shell:.bashrc
alias jfix='kill `ps x | grep JapaneseIM.appex | grep System | awk '\''{ print $1 }'\''`'
```

もっと早くやっとけばよかった〜
nginxとLet's Encryptで稼働中にどのようにすればSSLが更新できるか

今回はつまらない記事です。

nginx稼働中にSSLを更新するには、.well-knownが対象ドメインのドキュメントルートに設置されるようにすればいいと。腑に落ちなかったので、、。

```
letsencrypt certonly --webroot -w /var/www/html -d example.com
```

すると、/var/www/html/.well-known/acme-challenge/ に何か生成される。Let`s Encrypt側のサーバー？がhttpアクセスしてきて確認されるわけですね。
python webアプリ入門(1)


##目的

業務では主に組込み開発をずっと行っていますが、
いつもと違った開発もしたいと思い、webアプリ開発を始めました。
温かい目で見守っていただけると嬉しいです。

また、pythonは日ごろの業務でスクリプトを多少作成しているので、pythonを使ってwebアプリを作ろうと思います。

##開発環境

調べたところ、Flaskが簡単に開発環境をつくれそうなのでこれを使います。
http://flask.pocoo.org/

ちなみにPC環境は
OS : windows10 Home
python : ver 3.6.4
を使っています。

まず、Flaskのインストールをします。

~~~

>pip install flask

~~~


## 本題

インストールできたようなので、以下のような簡単なコード(server.py)を作成します。

~~~server.py
# server.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "Hello python flask world!!"

if __name__ == "__name__":
    app.run()
~~~

コードが作成できたので、実行します。

~~~
C:\Users\tomohiko\Desktop\python\web>python server.py

C:\Users\tomohiko\Desktop\python\web>
~~~

できませんでした・・・。windowsでは以下のようにしないといけないのですね・・・。

~~~

C:\Users\tomohiko\Desktop\python\web>set FLASK_APP=server.py

C:\Users\tomohiko\Desktop\python\web>flask run
 * Serving Flask app "server.py "
 * 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://127.0.0.1:5000/ (Press CTRL+C to quit)

~~~

google chromeでhttp://127.0.0.1:5000 にアクセスしたところ、無事動作確認できました。これからも定期的に更新していこうかと思います。

## 参考文献
[発作的にFlask入門（Windows） - Qiita](https://qiita.com/akiraabe/items/48045d00cc4ea28ca4e9)

# 次回

https://qiita.com/tom_sakaguchi/items/2ea407eda4bec3e720ef
en-dashがpreg_matchにひっかからなくてハマった


```php
$text ='2007. p.149–170.';
```

こんなテキストがあって、ここから "149"と"170"をぬきだしたくて下記の正規表現をかいたんですが、これが全くマッチしない。

```php
$text ='2007. p.149–170.';
if (preg_match('/(\d+)-(\d+)\./', $text, $match)) {
	var_dump($match);
}
```

で、ふと思いだしたのがハイフンって見た目同じでも違う文字コードの文字がいっぱいあったなってこと。（イヤですよねえ）

でググってみたらすぐわかったんですが、"149–170"の間にあるハイフンのような文字は __”en-dash”__ という文字のようです。

http://www.keyton-co.jp/blog/article/2017-2-14-unicode によるとMacではOption+"-"で入力できるようです。

どうやらen-dashは "149–170" のように範囲を表すときに使うみたいです。
文字コードはU+2013のようなのでハイフンの他にこのen-dashにもマッチするように正規表現を変更。

UTF-8として処理されるように　u修飾子もつけて次のようになりました。

```php
$text ='2007. p.149–170.';
if (preg_match('/(\d+)[-\x{2013}](\d+)\./u', $text, $match)) {
	var_dump($match);
}
```

なかなか気が付かないよなぁ。こいうの^^;
【Proxy】JavaScriptでRubyのtimesを使う

どうやらRubyでは`10.times`と書くと0~10で反復可能なコードが書けるそうです。
jsでもやってみます。

```js
const hello5 = 5 . times.map(() => 'hello')
console.log(hello5)
// => [ 'hello', 'hello', 'hello', 'hello', 'hello' ]

const list = 6 . times.map(v => v * 2)
console.log(list)
// => [ 0, 2, 4, 6, 8, 10 ]
```

これはProxyを使えば簡単です。

```js
const handler = {
  get(target, propKey, receiver) {
    if (propKey === 'times') {
      return [...Array(Number(receiver)).keys()]
    }
    return Reflect.get(target, propKey, receiver)
  }
}

const proxy = new Proxy(Object.prototype, handler)
Object.setPrototypeOf(Number.prototype, proxy)
```

Proxyについては以下の資料でも読めばいいと思いますが、一度動かせばなんとなくわかるので読まなくてもいいと思います。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Proxy


もちろん配列のようにアクセスしても動きます。

```js
for (let i of 10['times']) {
  console.log(i + 1)
}
// => 1
// => 2
// => 3
// => 4
// => 5
// => 6
// => 7
// => 8
// => 9
// => 10
```

キモいですね。

以下のコードをChrome Devtoolを開いて貼り付ければ動作確認できます。

```js
const handler = {
  get(target, propKey, receiver) {
    if (propKey === 'times') {
      const first = Number(receiver)
      return [...Array(first).keys()]
    }
    return Reflect.get(target, propKey, receiver)
  }
}

const proxy = new Proxy(Object.prototype, handler)
Object.setPrototypeOf(Number.prototype, proxy)

const hello5 = 5 . times.map(() => 'hello')
console.log(hello5)

const list = 6 . times.map(v => v * 2)
console.log(list)

for (let i of 10['times']) {
  console.log(i + 1)
}
```

しかしまあ`Object.setPrototypeOf`の乱用は避けた方が無難でしょう。


<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="und" dir="ltr">🤔 <a href="https://t.co/dkVOr9twEb">pic.twitter.com/dkVOr9twEb</a></p>&mdash; あかめ@🍆.js (@akameco) <a href="https://twitter.com/akameco/status/1011963037475991554?ref_src=twsrc%5Etfw">June 27, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

色々`Proxy`でキモいことをやってみると楽しいと思います。
SRTを使ってWebcamの映像を送ってみる

** 追記2022/05/22 新しい記事を書いたのでこちらを参照してください。
[jetson nanoでWebcamの映像をH.265で録画しつつSRTで小規模配信する](https://zenn.dev/tetsu_koba/articles/8c22466ce57498)
** 追記ここまで

SRTを使ってWebcamの映像を送ってみました。

# 全体図

![srt_exp.png](https://qiita-image-store.s3.amazonaws.com/0/13271/56c49267-be85-4478-2469-143a4eea4333.png)

server はクラウドの仮想マシンです。グローバルIPアドレスでアクセス可能です。
このserverのホスト名は"i3"です。
SRTで使用するUDPのポートは通過できるようにFirewallを設定しておきます。

送信側のPCは屋外から配信することを想定してモバイルルータでインターネットにつながっています。
これにつながっているWebcamの映像をSRTでserverに送信します。

受信側のPCは複数台あります。(今回は2台)
router経由でインターネットにつながっています。

# 送信側からserverへのRTTを調べる

RTT(Round Trip Time) はping コマンドで調べられます。

```
# ping i3 -c 10
PING i3 (35.201.190.159): 56 data bytes
64 bytes from 35.201.190.159: seq=0 ttl=52 time=113.861 ms
64 bytes from 35.201.190.159: seq=1 ttl=52 time=111.728 ms
64 bytes from 35.201.190.159: seq=2 ttl=52 time=110.851 ms
64 bytes from 35.201.190.159: seq=3 ttl=52 time=109.872 ms
64 bytes from 35.201.190.159: seq=4 ttl=52 time=108.992 ms
64 bytes from 35.201.190.159: seq=5 ttl=52 time=106.613 ms
64 bytes from 35.201.190.159: seq=6 ttl=52 time=107.109 ms
64 bytes from 35.201.190.159: seq=7 ttl=52 time=106.352 ms
64 bytes from 35.201.190.159: seq=8 ttl=52 time=105.231 ms
64 bytes from 35.201.190.159: seq=9 ttl=52 time=122.603 ms

--- i3 ping statistics ---
10 packets transmitted, 10 packets received, 0% packet loss
round-trip min/avg/max = 105.231/110.321/122.603 ms
```
だいたい120msec くらいです。

同様に受信側PCとserverとのRTTも調べます。
こちらは有線接続なので 50msec くらいでした。


# Server で動かすスクリプト

gstreamerを使用します。
port 7001 で受け取ったものをport 7002 に送ります。
どちらもlistener modeで待ちます。
latency はRTTの2.5倍が推奨値です。
受信側のlatencyは 120 x 2.5 = 300 (ms) にします。
送信側はデフォルトの120 (ms)のままで。

```sh
#!/bin/sh

RECVLATENCY=300

gst-launch-1.0 -v \
  srtserversrc uri="srt://:7001" latency=$RECVLATENCY \
  ! srtserversink uri="srt://:7002"
```

# 送信側PCで動かすスクリプト

ffmpegを使用します。

```sh
#!/bin/sh -x

HOST=i3
PORT=7001
BITRATE=2M

ffmpeg -f v4l2 -s 640x360 -i /dev/video0 -pix_fmt nv12 -c:v libopenh264 \
 -b:v $BITRATE \
 -f mpegts srt://$HOST:$PORT
```

# 受信側PCで動かすコマンド

```
ffplay -probesize 32 srt://i3:7002
```
`-probesize 32` をつけることでffplayの中でのバッファリングによる遅延を減少させることができます。

または VLCで `srt://i3:7002` を開きます。

# コマンドを実行する順序

先にserver側のスクリプトを動かします。
後は、送信側PCと受信側PCの順番はどの順でも大丈夫です。

# 最後に

とりあえず映像が送れるこをが確認できました。遅延時間を減らすなどのチューニングはまだです。
また、受信側のPCの台数をもっと増やす場合は、server側でHLSに変換するのがよいと思います。
GLPKで整数計画問題を解く（目次）

GLPK関係の記事が溜まってきましたので目次を作ってみました

## 最初に

[インストールと簡単な使い方](https://qiita.com/ki073/items/60ea8a84faabca9d6219)
[結果が得られないときには](https://qiita.com/ki073/items/7a76f74b1e072e1cfc3f)


## 基礎編
[GLPKプログラミングの基礎(1)](https://qiita.com/ki073/items/9a91299d514d9132d354) 　京都駅ビル大階段駈け上がり大会のチーム分け
[Set statementの書き方](https://qiita.com/ki073/items/30d05ecea5bbc6cb8732)
[データセクションの書き方](https://qiita.com/ki073/items/4fc1bc3ea89e46fa885c)
[整数計画法での定式化](https://qiita.com/ki073/items/601067bf2daefdc6746a)

## 応用編
[試合スケジュールの作成](https://qiita.com/ki073/items/a9e2fbace304e7b89af9)
[試合スケジュールの作成(2)](https://qiita.com/ki073/items/7b3f1dbfb0a450346c74)
[生産現場で役に立つかもしれない最適化手法1](https://qiita.com/ki073/items/f681c26956a8d0ab13b1)
[生産現場で役に立つかもしれない最適化手法2](https://qiita.com/ki073/items/1df64833ec6d04f6ac1b) 工数の平準化1
[生産現場で役に立つかもしれない最適化手法3](https://qiita.com/ki073/items/671fdf63eb8d1d393a4f) 表計算ソフトのソルバーで
[生産現場で役に立つかもしれない最適化手法4](https://qiita.com/ki073/items/7e015e948e66daa56037) 工数の平準化2
[生産現場で役に立つかもしれない最適化手法5](https://qiita.com/ki073/items/52a0f31750d1a7ffd02f) 工数の平準化3 <- (2024.5.7 投稿)
[合計が一致する組み合わせを探す1](https://qiita.com/ki073/items/bd42cf1726130bd62caa)

[勤務シフト表の作成 基礎(1)](https://qiita.com/ki073/items/92e968bbea21d5184302)表計算ソルバー
[勤務シフト表の作成 基礎(2)](https://qiita.com/ki073/items/1abbfa66ff7d44841b3c)
[勤務シフト表の作成 基礎(3)](https://qiita.com/ki073/items/f321a5ad33b8d385a2ea)
[勤務シフト表の作成 基礎(4)](https://qiita.com/ki073/items/035e38d72f9014a48fe0)
[勤務シフト表の作成1(1)](https://qiita.com/ki073/items/a8b26883e931e4bf6584) [(2)](https://qiita.com/ki073/items/1a7b92e2e764ee8a4355) [(3)](https://qiita.com/ki073/items/119edcc7fab2491892d2) [(4)](https://qiita.com/ki073/items/28abdfc5733997538dc8)
[勤務シフト表の作成2](https://qiita.com/ki073/items/d45cd648e0625c488ee6)
[勤務シフト表の作成3(1)](https://qiita.com/ki073/items/3f1e2d76ccc86afcca25) 多店舗の勤務シフト表
勤務シフト表の作成3(2) ←予定
[GLPKのプログラムをMiniSatで動かす](https://qiita.com/ki073/items/b920a4fe490be790df01)
Laravelをherokuにデプロイする

# 前提

以下のサイトで`heroku`コマンドをインストールして`heroku login`でログインを行い、使えるようにしておきましょう。
https://devcenter.heroku.com/articles/heroku-cli#download-and-install

DBはPostgreSQLを使います。

# Procfileを作る

Procfileはheroku上にデプロイされたときに実行するコマンドを指定するものです。
これを使っておかないとデプロイしてもエラーになってアプリを起動できません。

    # Procfile
    web: vendor/bin/heroku-php-apache2 public/
# アプリを登録
## herokuコマンドから

まずは`heroku`コマンドでアプリを登録する必要があるので、Laravelのプロジェクトディレクトリに移動して

    $ heroku create <アプリの名前>

を実行して作りましょう。
`git init`からremoteの登録までやってくれます。

## Webから

Webのダッシュボードから登録することもできますが、gitの設定を自分でやらないといけません。
Laravelのプロジェクトディレクトリから

    $ git init
    $ heroku git:remote -a <アプリの名前>

を実行します。
もしすでにgitを使っているなら最後のコマンドだけで十分です。

# PostgreSQLを設定

herokuでPostgreSQLやMySQLなどを使うにはaddonとして追加する必要があります。ほかにもいろいろ便利なアドオンがあるそうなのですが、今回はPostgreSQLのみを追加します。

    $ heroku addons:create heroku-postgresql:hobby-dev

Web上のアプリ管理画面にいくとAddonが追加されています。

次はLaravelでPostgreSQLを使うように設定します。
開発時には`.env`を書き換えてDBを変えていたかもしれませんが、このファイルは`.gitignore`に載っていてpushされませんので、herokuのサーバーに環境変数を設定します。

上記の画面のHeroku Postgresをクリックして以下の画面を開き、`Settings`  → `View Credentials` を開いてDBの設定情報を表示しましょう。


![](https://d2mxuefqeaa7sj.cloudfront.net/s_76B38BB7F01D58DEEAFB302A5EFEB5ACD0F38F6113786E76A8D460B05B8F35C7_1530102887087_heroku-ss1.png)


また、Laravelプロジェクトでは`APP_KEY`を環境変数として登録する必要があるのでそれも追加。

それぞれの情報を`heroku`コマンドから登録します。

    $ heroku config:set DB_CONNECTION=pgsql \
                        DB_HOST=<Host> \
                        DB_PORT=<Port> \
                        DB_DATABASE=<Database> \
                        DB_USERNAME=<User> \
                        DB_PASSWORD=<Password> \
                        APP_KEY=$(php artisan key:generate --show)
# デプロイする

herokuへのデプロイの方法はgitでpushするだけです。

    $ git add .
    $ git commit -m "update"
    $ git push heroku master

するといつものgitのログとは違いずらずらと出てくるので終わるまで見つめましょう。
見つめ終わったらデプロイ完了です。

herokuアプリの管理画面から`Open App`を開けばLaravelアプリが迎えてくれるでしょう、簡単。

# マイグレート、その他初期設定

herokuアプリは生成されてばかり、まっしろの状態です。
もちろんDBも空っぽなので`migrate`を実行しましょう。
初期設定が必要なライブラリを使っている場合もコマンドを実行しておいてください。

    $ heroku run "php artisan migrate"

# 確認

`heroku`の管理画面から`Open app`をクリックしてみましょう。
以下の画面が出たら成功です。


![](https://d2mxuefqeaa7sj.cloudfront.net/s_76B38BB7F01D58DEEAFB302A5EFEB5ACD0F38F6113786E76A8D460B05B8F35C7_1530103132796_heroku-ss2.png)
GitHub 特定のcommit間の差分を表示

### commitAとcommitBの差分をGitHub上で見たい時・・・

https://github.com/レポジトリ名/compare/commitAのハッシュ…commitBのハッシュ
のURLをブラウザで打てば差分を見れる。

(例)
https://github.com/hogehoge/compare/1234567890abcdefghijklmnopqustuvwxyz123457…abcdefghijklmnopqustuvwxyz123457890abcdefgh
Elixirで一千万行のJSONデータで遊んでみた #2


この記事は「[fukuoka.ex x ザキ研 Advent Calendar 2017](https://adventar.org/calendars/2873)」10日目です。

昨日は @Takeshi-Kogu さんの[「Elixirでファイルの入出力をしてみた」](https://qiita.com/Takeshi-Kogu/items/1e75e27bf906a54bce23)でした。

## はじめに
前回，[「Elixirで一千万行のJSONデータで遊んでみた」](https://qiita.com/zumin/items/d27cdcf66807f57a6cec) という記事を書きました。
そこで，@twinbee さんにこんなコメントを頂きました。

```
q2_2なんですが、Reduceを挟まないこの処理だとFlow.partitionは必用ないと思います。
GenStageが多段になってるので、本来の性能よりかなり遅い結果になると思います。

ちなみに私のPCだと、partitionを外した場合42.717秒 ⇒ 36.409秒になりました。
```

並列処理初心者かつElixir初心者の私は，つまりどういうことだ・・・？となったので，せっかくなので自分なりにまとめておこうと思って記事を書きます。

## Flow.partitionについて
`Flow.partition` を実行すると，新しくStageが追加されます。
新しく追加されるStageは，Hash関数によって，同じデータは同じStageに配布されるようになります。
これによって，データが重複すると困る集計処理であっても問題なく処理することができます。

## 前回の記事で利用したサンプルコードの問題の部分
```Elixir
defmodule Basic do
  def q2_2 do
    "data.json"
    |> File.stream!
    |> Flow.from_enumerable
    |> Flow.map(fn d -> Poison.decode!(d) end)
    |> Flow.partition
    |> Flow.filter(fn d -> d["age"] <= 20 end)
    |> Enum.count
  end
end
```

`Flow.from_enumerable` でStageに並列展開されていて，その後並列展開されたデータそれぞれで， `JSONデータのDecode -> Filter` と処理を行っています。
つまり，並列展開されたデータが重複するような処理は存在せず，並列展開されたデータを最後に集めて `Enum.count` しただけなので， `Partitioning` は不要だったというわけです。

また， `Partitioning` を行う際にHash関数による処理が走るので無駄に時間がかかる結果となりました。

## 修正後のコードと結果
```Elixir:lib/basic.ex
defmodule Basic do
  def q2_2 do
    "data.json"
    |> File.stream!
    |> Flow.from_enumerable(stages: 2)
    |> Flow.map(fn d -> Poison.decode!(d) end)
    |> Flow.filter(fn d -> d["age"] <= 20 end)
    |> Enum.count
  end
end
```

```
$ /usr/bin/time mix run -e "Basic.q2_2"
```

||real|user|sys
|---|---|---|---
|q2_2(前回)|45.60 s|116.39 s|6.49 s
|q2-2(今回)|37.16 s|90.33 s|3.07 s

`Partitioning` で結構時間をロスしてたことが分かりますね。

## 終わりに
今回は， `Flow.partition` について書いていきました。
記事の内容では，前回の記事に対応した程度のことしか書いていないのでほんの一部の内容だと思います。
記事を書く中で，より知見が深まっていき，楽しみながら学ぶことができているので，とてもいいですね。


@twinbee さんの [Elixir並列処理「Flow」の2段ステージ構造を理解する](https://qiita.com/twinbee/items/43b767520da666ee960d) を参考にさせていただきました。ありがとうございます。

---

明日は， @zacky1972 さんの記事になります。お楽しみに！
【Qiita】コメントの日時がおかしい

Qiitaにログインした状態で投稿に対するコメントを見てみると、日時が『投稿を表示した日時』になってる。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/26088/3f4219da-2251-0ff1-8186-289b5563a0c0.png)

ログアウトしてる状態だと(おそらく)コメントが投稿された正しい日時が表示される。
謎。
dSPACEで "ds**** is not registerd"を解決する手順

dSPACEでsimulinkモデルをコンパイルしたときに以下のエラーが発生しました。

```
platform ds1104 is not registerd.
```
（ごめん，他にもなんか言ってたけどメモしてないので忘れました。）



いやいや以前ビルドできたんだからなんでや！と思ったらなにやら接続の再設定をする必要があるそうで，以下のメモを参照しました。

http://www.ece.utah.edu/~bodson/5671/Labs/checklist.html


## 解決手順
1. ControlDeskを起動し，PlatformのところからInitializationを選択し，Configを初期化します。
2. その後再起動

以上です。1.の時点では上手くいかずやむなく再起動したら解決しました。
めでたしめでたし。

## 独り言
こういうのはHPのFAQや研究室のdocumentに置けばいい気もするんですがQiita等のほうが検索性が高いと思われるのでインターネットの海に放流しておきます。組織へのノウハウの蓄積という意味でこの行為がいいのかはわかりませんが。
Mac OSX の基本操作体系を Windows と同じにする

# 基本操作
Mac OSX の short cut で、Copy, Cut, Paste, Select All を Windows と同じにする。外付けKeyboardを利用する場合、こうしておくとWindowsと同じ操作体系となり都合がよい。

具体的には、Copy は、command + c だが、Ctrl + c でも動作するようにする。

Preference　>　Keyboard >　App Shortcuts で新たに定義する。Menuに出てくるTextと同じ名前にしないといけない。

![Screen Shot 2018-07-01 at 13.06.30.png](https://qiita-image-store.s3.amazonaws.com/0/162341/b5c82c4b-0f71-4670-ce1b-4d419639883e.png)


# 日本語と英語の切替
Windows では、ATOK を利用しているが、日本語入力のOn/Offには、Ctrl + Space を割り当てている。頻繁にいわゆる半角英数を利用するためである。入力を半角英数でずっとATOKのままという方法もあるのだが、変換中は大きなひらがなで日本語が見えた方が見やすいのでそうしている。

Windowsでは、ATOKの環境設定から設定する。詳細は省く。

Macでは、
Setting -> Keyboard -> Input Sources
で、ATOKの入力モードを「ひらがな」のみとすると、U.S.とATOKの切り替えが Ctrl + Space で一発でできるようになる。Mac と Windows と同じにできた。超便利。

![Screen Shot 2018-07-01 at 13.07.04.png](https://qiita-image-store.s3.amazonaws.com/0/162341/b66fb18e-9a21-a931-712b-7bccc778aab9.png)
![Screen Shot 2018-07-01 at 13.07.25.png](https://qiita-image-store.s3.amazonaws.com/0/162341/153cdd41-52fa-c002-98a7-5e99622d1903.png)



ポイントは
Select the previous input source の方は、切り替えのGUIが表示されるが、
Select next source in input menu の方は、GUIなしなの、でトグルで切り替えができるという動作のため、こちらを使うことにする。どちらのモードかは一番上のバーのIconを見ればよい。

![Screen Shot 2018-07-01 at 13.06.37.png](https://qiita-image-store.s3.amazonaws.com/0/162341/f2d72f99-c434-b659-0eff-ae3eb8e486f5.png)
エンベデッドシステムスペシャリスト試験に受かるまでに行った勉強

# はじめに
H30年度の試験で以下点数で無事ESに合格しました．(午後2滅茶苦茶ギリギリですが．．．)
午前Ⅱ：76点
午後Ⅰ：71点
午後Ⅱ：61点
本記事でははじめての高度区分試験でどのような勉強を行ったかをの記録として残します．
※午前1免除のため，その分が無いという前提付きです．
# 勉強期間
1月B～4月Mの3.5ヶ月
平日約0.5時間
休日0.5～5時間
※ 休日は単に参考書を読んでいたときと，過去問を解いていたときがあるので，時間の幅大きめ．
# 使用した参考書
①：[情報処理教科書 エンベデッドシステムスペシャリスト 2017～2018年版](https://www.shoeisha.co.jp/book/detail/9784798148861)
②：[2016 徹底解説 エンベデッドシステムスペシャリスト 本試験問題](https://www.itec.co.jp/store/products/detail.php?product_id=3511)

②の参考書のリンクが2018年版ですが，使用したのは2016年版です．
①にも過去問が掲載されているため，その年度と被らないようにするために少し古い年のものを使用しました．
# 勉強方法
## 平日
* 1月B～4月M(自宅)  
参考書①を1日10ページ程度のペースで進める(～8章まで)．  
このとき，余程中途半端な箇所で無い限り，規定ページ数以上進めない．  
規定以上読み進めると，きちんと理解できないままやった気になってしまう．  
また，前日10+nページやったからと思い，少しページを減らしてしまうことで1日のうちに覚えようとしている量にブレが大きく生じる．   
* 1月B～4月M(外)  
スマホで午前2の過去問を解く．(使用したサイト：[過去問WEB問題集 情報処理技術者試験　合格への道](http://www.qeq.jp/jouhou/kakomon/ES/index.html)

## 休日
基本的に自宅のみ

* 1月B～3月M  
参考書①を一通り読み終えるまでは，平日と同様に読み進める．
参考書①の8章まで読み終えられて以降は，その続きの午後問題，参考書②の午後問題を大問1つ解く．
* 3月M～4月M  
IPAのHPにある[過去問](https://www.jitec.ipa.go.jp/1_04hanni_sukiru/_index_mondai.html)を印刷し，1試験分時間を計りながら解く．
ここでは午後の解答にて、必要以上に書かないようにすることと、時間内に問題を理解し、解ききる練習のつもりで問題を解いていました．

# 所感等
午前2は毎日少しでも過去問を解いていると，ほとんど覚えてしまって，6割取る程度だったら余裕だと思えるほどであったため，そこまで時間を割かなくてもよかったかなと思いました．
午後に関しては，前提知識よりもその場でシステムを理解し，問題で問われている通りの内容をいかに導き出せるかだと思いました．つまり専門知識よりも文章読解能力がわりと重要なのではないかと．また，午後の記述の解答は無理に過程を書こうとせず，文字数に収まる程度の結論のみを書くようにするほうがいいと過去問を解いたり解説を読んでいて感じました．
完全に私個人の勉強法のメモとなりますが，もし何かの参考になれば幸いです．
自分自身から__callStaticを呼び出したい

[PHPのオブジェクトから、自身のアクセス不能メソッドを静的コンテキストで呼び出せない件](https://qiita.com/yamadar/items/f15805a28252699e423e)という記事がありますが、簡単に言うとインスタンス中から自分自身の[__callStatic](http://php.net/manual/ja/language.oop5.overloading.php#object.callstatic)を呼び出せないというものです。

```php
class A{
	public function __construct(){
		static::hoge(); // call
		self::hoge();   // call
		A::hoge();      // call
	}
	
	public static function __callStatic($a, $b){ echo 'callStatic'; }
	public function __call($a, $b){ echo 'call'; }
}

new A();
```

いずれも一見`__callStatic`が呼び出されそうに見えますが、実際は[__callが3回呼ばれます](https://3v4l.org/n1Qib)。

さて何故このような実装になっているかというと、いわゆる[歴史的な理由](http://php.net/manual/ja/function.implode.php)というやつだと思われます。

まず2009年の[PHP5.3.0](http://php.net/ChangeLog-5.php#5.3.0)で`__callStatic`が実装されました。
この時点で既に上記プログラムの出力は[callcallcall](https://3v4l.org/n1Qib#v530)でした。
何故このような実装になったのかははっきりとはわかりませんが、おそらく[単にcallを先にチェックしてる](https://github.com/php/php-src/blob/PHP-5.3/Zend/zend_object_handlers.c#L1003)からというだけな気がしてなりません。

ちなみに実装者の[Sara Golemon](https://github.com/sgolemon)はPHP4の時代から2018年の今まで活躍してるすごい人です。

その後PHP5.3.2が出たあたりで[バグチケットが提出](https://bugs.php.net/bug.php?id=51176)されました。
ここで`__call`が呼ばれるのはおかしいよね、`__callStatic`だよね、という内容です。
これはおかしいから修正しよう、ということになって[修正がマージされ](http://svn.php.net/viewvc/?view=revision&amp;revision=305043)、PHP5.3.3としてリリースされました。

さてPHP5.3.3のリリース後、新たなバグチケットが出されました。
前は__callが呼ばれてたのに[PHP5.3.3で__callStaticが呼ばれるようになった](https://bugs.php.net/bug.php?id=52713)んだがどういうことだ、という主張です。
さきほどのバグチケットとは全く反対の内容ですね。

ということで話は[PHP-DEVメーリングリスト](http://www.serverphorums.com/read.php?7,220473,220473#msg-220473)に持ち込まれ、これは元に戻すべきだということになって5.3.4でRevertされました。
実際に動作を見てみると、[PHP5.3.3のみcallStatic](https://3v4l.org/uc9cb)になります。

ここで仕様が完全に確定され、この動作が正と判断されることになりました。
その後も[同じような](https://bugs.php.net/bug.php?id=55311)[バグチケットが](https://bugs.php.net/bug.php?id=62330)[幾度となく](https://bugs.php.net/bug.php?id=63602)[提出されて](https://bugs.php.net/bug.php?id=64059)[いますが](https://bugs.php.net/bug.php?id=65466)[全て却下されています](https://bugs.php.net/bug.php?id=70554)。
まあ確かに直感的な動作とは言いがたいですから、何度もチケットが出される理由もわからないでもないですね。


# まとめ

・[PHP5.3.0](http://php.net/ChangeLog-5.php#5.3.0)で__callStaticが実装された。動作は現在と同じ。
・[PHP5.3.3](http://php.net/ChangeLog-5.php#5.3.3)でself::やstatic::が[__callStaticを呼び出すように変更](http://svn.php.net/viewvc/?view=revision&amp;revision=305043)された。
・[PHP5.3.4](http://php.net/ChangeLog-5.php#5.3.4)でRevertされて元に戻った。


# 感想

そもそもstaticなメソッドなので、self::やstatic::からは参照できなくても仕方ない気はしますね。
ただ`A::hoge()`で呼び出せないのはとても良くないのではなかろうか。


# その他

親クラスにprivateメソッドがあると動作が変わります。なんでだよ。

```php
class A{
	public static function __callStatic($a, $b){ echo 'callStatic'; }
	public function __call($a, $b){ echo 'call'; }
	private function hoge(){}
}

class B extends A{
	public function __construct(){
		static::hoge(); // callStatic
		self::hoge();   // callStatic
		A::hoge();      // callStatic
		static::fuga(); // call
		self::fuga();   // call
		A::fuga();      // call
	}
}

new B();
```

親クラスにprivateの`hoge()`が存在すると、子クラスから`hoge()`を使うと全てのバージョンで[callStatic](https://3v4l.org/VENoi)になります。
このバグ[2011年に提出されている](https://bugs.php.net/bug.php?id=53826)のですが、何故か完全にスルーされてます。

つまり、どうしても__callStaticを呼びたければprivateメソッドを置いておけばいいということだね(錯乱)
Rails Devise で DB カラムに依存しない項目を追加する acceptance

# やりたいこと

![image.png](https://qiita-image-store.s3.amazonaws.com/0/31862/6354a987-1d2e-c3ff-32e7-d22e128b7bbb.png)

ユーザー登録時に **利用規約に同意する** を実現したいが，わざわざそれ用のカラムをつくるほどでもない．

> このメソッドは、フォームが送信されたときにユーザーインターフェイス上のチェックボックスがオンになっているかどうかを検証します。ユーザーにサービス利用条項への同意、何らかの文書に目を通すことなどを義務付けるのに使用するのが典型的な利用法です。[Rails Guide > acceptance](https://railsguides.jp/active_record_validations.html#acceptance)

このヘルパーを用いる

# 確認環境

- devise (4.3.0)
- rails (5.1.6)

# Model 更新

モデルにチェックしたかどうかのフラグを持たせる．
登録時のみバリデーションしたいので `on: :create` でスコープを絞る．

```ruby:app/models/user.rb
class User < ApplicationRecord
    validates :registration_check, acceptance: true, on: :create
end
```

`attr_accessor` などでアクセサを生やしているサンプルもあるが，この `validates` を記述するだけでよい．

> 'acceptance'はデータベースに保存する必要はありません。保存用のフィールドを作成しなかった場合、ヘルパーは単に仮想の属性を作成します。[Rails Guide > acceptance](https://railsguides.jp/active_record_validations.html#acceptance)

なお当然だが，この記述をしないと View でエラーになる．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/31862/d024300b-2ae2-f548-4919-d7d81c5d0078.png)

**若干ハマったのだが，次項の Strong Parameter の設定をしないと，このバリデーションは正常に動作せず，チェックを入れなくても登録ができてしまうので注意．**

# Strong Parameter / Controller 更新

Devise Controller を Override してカスタマイズする．

他にも [Application Controller で `before_action` などでやるやり方](https://github.com/plataformatec/devise#strong-parameters)もあるみたいだが，ApplicationController には書きたくなかったので採用しなかった．

Controller の雛形を生成し，該当箇所をコメントアウトして有効化する．

```bash
$ bundle exec rails g devise:controllers users
```

```app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
   before_action :configure_sign_up_params, only: [:create]

   •••

   protected

   # If you have extra params to permit, append them to the sanitizer.
   def configure_sign_up_params
     devise_parameter_sanitizer.permit(:sign_up, keys: [:registration_check])
   end
end
```

# View 更新

View の雛形を生成し， `registration_check` を追加．

```bash
$ rails g devise:views users
```

```slim:app/views/devise/registrations/new.html.slim
.field
    = f.check_box :registration_check
    = f.label :registration_check
```

# 参考
- [Devise > Strong Parameters](https://github.com/plataformatec/devise#strong-parameters)
- [Rails Guide > acceptance](https://railsguides.jp/active_record_validations.html#acceptance)
【β版】みんなで時間を共有できるタイマーアプリ【足立区の黒タイマー】

Shinjuku.LTの開発合宿で作成した「タイマーアプリ」についてお話します！

# 作ったもの！

『足立区の黒タイマー』というタイマーアプリを作りました。
http://www.thisissynchro.tk/

* webで簡単にタイマーを共有できます
* 発表者リストも管理できます

# 〜開発の軌跡〜

## （まず）Shinjuku.LT #とは

Shinjuku.LTは世界で一番LTのハードルが低い勉強会を目的に開催している勉強会です。
「勉強会で一番勉強になるのは、発表者」と言われることがあります。
ということは、発表する機会をつくることで勉強になる人が増えるのではないかという理念を元に開催しています。
2016年09月に発足し、そこから毎月一回のペースで開催しています。

[Shinjuku.LT](https://www.shinjukult.tk/#/aboutus)

## タイマーアプリを作ることになった背景

Shinjuku.LTでは半年単位で振り返りを行なっています。
前回開催した振り返りの中で、**宣言した時間よりも発表時間が長くなってしまう**といった問題が挙がりました。

* 全員が時間を意識できるように
* 時間が測れるように
* タイマーが作りたい（？）

こういった具体的な課題を解決するために、**タイマーアプリ**を作ることになりました。

## 既存のタイマーサービスの調査

- [Buildersconのセッションタイマーを作った | WEB EGG](https://blog.leko.jp/post/create-session-timer-of-builderscon/)
- [Online Timer](https://www.timeanddate.com/timer/)
- [The Pomodoro Tracker — A useful tool for time management based on Pomodoro Technique.](https://pomodoro-tracker.com/)

## どんなタイマーが良いか

ざっとあげていくと

- ライブ感
- 時間を同期できる
- 発表内容を書き込めるように
- 時間の経過を感じるように
- 動画を使う
    - 動画は時間の経過を感じれるかも
- このサイトみたいにしたかった
    - [UTC is Enough for Everyone, Right?](https://zachholman.com/talk/utc-is-enough-for-everyone-right)

タイマーのサービスはたくさんありますが、我々は、**経過時間の共有**がしたいと思いました。
これが実現できるように頑張りました。

## やりたいことリスト

- イベントの登録機能
- 発表の登録を同期する
- 時間を同期する

## 合宿でガーッと

### 1. チームでイメージを共有
ペーパープロトタイプでざっとした作りたいものをイメージ

![IMG_20180616_173020.jpg](https://qiita-image-store.s3.amazonaws.com/0/79577/11c7ef04-5bfd-f9b5-38cc-fc6f3b7b83e3.jpeg)

Adobe XDで細かいニュアンスを調整

![Web 1920 – 2.png](https://qiita-image-store.s3.amazonaws.com/0/79577/8d2b63aa-d267-8bb4-31d6-ee7fb3a3e62e.png)

### 2. とりあえず動きをつける

丸山 => 共有されたデザインをゴリゴリHTMLに書き起こす
黒ピエロ => 技術調査&ゴリゴリ実装

## 使ってる技術

- ホスト ・・・Netlify
- DNS ・・・freenom
- アプリケーション ・・・ Vue.js
- データベース ・・・Cloud Firestore

### Firebase

- データベース
  - Realtime Database
  - Cloud Firestore
- 認証 
  - firebase authentication
- Hosting
  - firebase hosting   

### Cloud Firestore

- スキーマレス
- リアルタイム
- リアルタイムじゃなくてもいい
- js SDKを利用出来る

## やりたいことリスト（現時点での進捗）

- イベントの登録機能 ◯
- 発表の登録を同期する ◯
- 時間を同期する △

## 技術的な課題

- [Cloud Firestore でのデータの並べ替えと制限  |  Firebase](https://firebase.google.com/docs/firestore/query-data/order-limit-data)
- [Redirects | Netlify](https://www.netlify.com/docs/redirects/#history-pushstate-and-single-page-apps)

## 今後

- 時間の同期は厳密には結構難しそうだった
- リロードすると再カウントダウンするから合わなくなるのなんとかしたい

## まとめ

- リアルタイムアプリが簡単に作れるのすごい
Microsoft Remote Desktop UWPアプリの設定移行方法（Windows10 v10.1）

# 何がしたかったか
Microsoft Remote Desktop UWPアプリの設定をどうやって移行したらいいか分かったのでメモ

# 解決方法
この通りにやればOK
https://social.technet.microsoft.com/Forums/windows/en-US/d1fd0a07-9934-4143-aa38-10a2dc011bc2/migrating-desktops-from-microsoft-remote-desktop-app-to-another-machine?forum=winserverTS

デスクトップグループが重複する場合は、groups フォルダ内の新しい方のUUIDのファイルを消せば消えてくれる
UbuntuOS 16.04 に Ansible を流す時にハマったこと (python3指定)

# はじめに
久しぶりに Anshible を触った時にハマってしまったので、またハマってしまわないように、備忘録として記録しておきます。

# ハマったこと
前に使っていた Anshible を 久しぶりに EC2 の UbuntuOS 16.04 に流そうとした時の出来事なのですが、前まで正常に通っていたはずの Anshible が下記エラーで動かずにハマってしまいました。

```
/usr/bin/python: No such file or directory
```

# 原因
Ansible はデフォルトで ```/usr/bin/python ``` を見にいくのですが、UbuntuOS 16.04 では python3 がデフォルトになっており、エラーの通り``` /usr/bin/python ```が存在していなかったのです。

```bash
$ which python
# 存在しない
$ which python3
/usr/bin/python3
````
前回は UbuntuOS 14.04 を使用していたため、問題がおきなかったようです。

# 解決法
Ansible の ``` ansible_python_interpreter ``` 変数に python3 の path を指定して解決しました。
```ansible_python_interpreter``` は Ansible version 2.2 からサポートされた機能で、今回のように python3 を指定する場合や、```/usr/bin/python``` 以外を使いたい場合に使用できます。

この ```ansible_python_interpreter``` を下記のように インベントリファイルに記述することで、python3 を参照するようにします。

```
[all:vars]
ansible_python_interpreter=/usr/bin/python3

[web]
ec2-host
```
これで無事解決できました。

## 参考資料
[公式ドキュメント](https://docs.ansible.com/ansible/2.4/python_3_support.html)
Xcodeの8系を利用しているとbrew installできない問題

#### Xcodeの8系（8.2）だけを入れた状態でbrew installをしようとすると失敗する

```plaintext
$ brew install readline
Error: Your Xcode (8.2) is too outdated.
Please update to Xcode 9.4 (or delete it).
Xcode can be updated from the App Store.
```

->Xcodeのバージョンを9系にアップデートしないといけないよう。とはいえ、現状使っている8系のバージョンも引き続き利用したい。そこで、複数バージョン利用できるようにする。

#### Xcodeの9系をインストールする。（9.2をインストールした。）

- Xcode 9.2.xipなどをダウンロード
https://developer.apple.com/download/more/

- 解凍して、「Xcode.app」 -> 「Xcode9.2.app」に名前変更して、アプリケーション配下に移動

- 「$ sudo xcode-select --switch /Applications/Xcode9.2.app」でパスを通す

```plaintext
$ sudo xcode-select --switch /Applications/Xcode9.2.app
```

＊`Xcode9.2.app`は自分の環境にあるXcodeの名前

#### 再度brew installしてみる

```plaintext
$ brew install readline
Error: You have not agreed to the Xcode license. Please resolve this by running:
  sudo xcodebuild -license accept
```
->ライセンスが許可されていないよう

#### 指示された通りにコマンド打ち、再度brew install
```plaintext
$ sudo xcodebuild -license accept
$ brew install readline
...
==> Summary
🍺  /usr/local/Cellar/readline/7.0.3_1: 46 files, 1.5MB
```
->成功した！
moto を使って boto3 と Amazon SES を利用したスクリプトのテストコードを書く方法

moto という AWS サービス向けのモックツールがあり、SES を利用したスクリプトのテストも行えたので、その手順を共有します。

手元の環境は以下になります。

* Ubuntu 16.04 LTS
* Python 3.6.5 :: Anaconda, Inc.
* boto3==1.7.42 、moto==1.3.3

注意点としては、SES のクライアントを生成した後に verify_email_identity する必要があったことです。

```py3:
import unittest

import boto3

from moto import mock_ses

from send_email_to_me import aws_util

class TestAwsUtil(unittest.TestCase):
    @mock_ses
    def test_send_mail(self):
        ses = boto3.client('ses', region_name='us-east-1')
        ses.verify_email_identity(EmailAddress='test@example.com')
        data = open('tests/test.jpg', 'rb')
        attach_file = data.read()
        attach_file_name = 'test.jpg'
        data.close()
        msg = aws_util.make_mime('test@example.com',
                                 'test_subject',
                                 'test_body',
                                 attach_file,
                                 attach_file_name)
        responses = aws_util.send_email(ses,
                                        'test@example.com',
                                        'test_to@example.com',
                                        msg)
        self.assertEqual(responses[0]['ResponseMetadata']['HTTPStatusCode'], 200)
```
PHPでマルチスレッド

PHPでマルチスレッドは、あまり需要が無いかもしれませんが。

親プロセスでは、6つの子プロセスを立てる事をしてます。
それぞれの子プロセス内では1から10の乱数を発生させ、
その数値が10だった場合自身のプロセスを終了させるという簡単なものです。

```php
<?php
define("MAX_PROCESS",6);
define("TIMEOUT",10);

$oControl = new main();
class main
{
    private $_MAX_PROCESS = MAX_PROCESS;
    private $_TIMEOUT = TIMEOUT;

    function main()
    {
        for( $i = 1; $i<= $this->_MAX_PROCESS; $i++ ) {
            $pid = pcntl_fork();
            if ( $pid == -1 ) {
                die( "fork できません\n" );
            } else if ( $pid ) {
                $pids[ $pid ] = TRUE;
                if ( count( $pids ) >= $this->_MAX_PROCESS ) {
                    unset( $pids[ pcntl_waitpid( -1, $status, WUNTRACED ) ] );
                }
            } else {
                $this->childProcess($i);
            }
        }
        while ( count( $pids ) > 0 ) {
            unset( $pids[ pcntl_waitpid( -1, $status, WUNTRACED ) ] );
        }
    }

    function childProcess($my_number)
    {
        while(1){
            // 強制終了時間を指定
            pcntl_alarm( $this->_TIMEOUT );
            $rand = mt_rand(1,10);
            $message = "number=$my_number rand=$rand";
            if( $rand == $this->_TIMEOUT ) {
                $message .= " end";
            }
            $message .= PHP_EOL;
            echo $message;
            sleep( $rand );
        }
        return true;
    }
}
```
はじめてのchef

この記事がなければなんもできなかった

> https://qiita.com/enzen/items/704c236489873ac4dc9a

まあハマるしエラー出るしansibleが素晴らしいことがよくわかった。

ゲスト側はだいたい言われるままに行った。

こけたのはリモートから操作されるときにrsyncが必要だったことかな。

chef-soloやってるときのhistoryロストしてしまった。。

```py:ゲスト側
[root@kickstart ~]# history
    4  chef-solo -v
    5  yum install wget -y vim
    6  mkdir ~/chef-solo/cookbooks-1
    7  cd ~/chef-solo/
    8  ll
    9  yum install -y rsync
   11  mkdir /knife/cookbooks -p
   15  yum remove -y dstat
   16  mysql -uroot -p
```

適当にハマったところ端折ってるけどホスト側

nodes/host名.json になることがわからなくてしばしハマった。project作る、project名を `nodes/host名.json` の **run_list** に入れて `bundle exec knife solo cook host名` する。

```py:ホスト側から操作する

curl -L https://www.opscode.com/chef/install.sh | sudo bash
mkdir /knife
cd /knife/
bundle init
gem install bundler
bundle init
ll
vim Gemfile 
bundle install --path vendor/bundle
ll

# ruby 2.0古すぎ
 yum install gcc-c++ patch readline readline-devel zlib zlib-devel -y
 yum install libyaml-devel libffi-devel openssl-devel make -y
 yum install bzip2 autoconf automake libtool bison iconv-devel sqlite-devel -y
curl -L get.rvm.io | bash -s stable
gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
command curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
curl -L get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh

# ruby 2.4なら動いた
rv install 2.4
rvm use 2.4.1 --default
ruby --version
gem install bundler

bundle install --path vendor/bundle
bundle exec knife solo init .
ll

rpm -Uvh https://packages.chef.io/files/stable/2.4.17-1.el7.x86_64.rpm

# 遠隔操作してみる
chef generate cookbook site-cookbooks/dstat dstat
vim site-cookbooks/dstat/recipes/default.rb 

bundle exec knife solo cook kickstart
knife bootstrap 192.168.1.100 -N kickstart
bundle update
bundle exec knife solo cook kickstart

vim nodes/kickstart.json 

nodes/
└── kickstart.json


# cat nodes/kickstart.json 
{
  "run_list": [
    "recipe[dstat]"
    "recipe[mysql]"
  ],
  "automatic": {
    "ipaddress": "kickstart"
  }

bundle exec knife solo cook kickstart
chef generate cookbook site-cookbooks/mysql mysql
vim site-cookbooks/mysql/recipes/default.rb 

vim nodes/kickstart.json 
bundle exec knife solo cook kickstart
chef generate cookbook site-cookbooks/nginx nginx
cat site-cookbooks/mysql/recipes/default.rb 
bundle exec knife solo cook kickstart

vim site-cookbooks/mysql/recipes/default.rb 
vim nodes/kickstart.json 
bundle exec knife solo cook kickstart
```

いやーansibleのほうがよさそうだな・・・

とりあえずserver-clientまでやっておくか・・・


> https://qiita.com/jabba/items/d8f623b5a25ea1953b33



インフラ勉強会でみた chef-DK とはなんぞや

https://hackmd.io/AmntTejkSLO8U9-65IcNFg?both
案件の切替タイミングだし、普段使っていたツールを洗い出してみた

どうも、Laravelエンジニアです。  
6月末にこれまで携わっていた案件が終了になるので、
今後の仕事のためにも普段使っていたツールをまとめてみることにした。
粒度など気にせず、思いのたけを綴りましょうねぇー

おススメなど、あったら誰か教えてください。


# チャットツール
## slack
知人への技術相談から、飲みの予定管理まで色々役に立ってくれている  
次の職場でもPCに入れる

## line
案件紹介などでも使ってるが、仕事中に見なくても困らない

# エディター
## PHPStorm
Laravel開発でいつもお世話になっています。  
下記プラグインは今回入れてみて良かったので今後も使いたい  
・ .ignore  
・ IdeaVim  
・ Laravel Plugin  
・ YAML/Ansible support  

## VSCode
MarkDownファイル作成や簡単なメモなどお世話になってます。  
MdのPdf出力とか今後も使っていきたい  
Markdown PDF

## サクラエディタ
文字列の一括変換やマクロなどお世話になってます。  
取り敢えず、プラグインとかは使わないけど入れておきたい  

# 検証環境
## vagrant ansible
Docker使ってみたいけど、WindowsのHomeなので手が出ず、いつも通りVagrant使ってます。  
次回は、一旦vagrant + ansibleでスタートして、余裕できたらDocker触ってみようかな・・・

## node server
Express使って、API検証用のMockサーバーを作成  
json-serverとかも使ってみたけど、設計書の仕様を再現しようとすると、Expressの方が楽かも  

# Git関連
## Git bush
Gitの為というより、WindowsなのでメインのBashとして使用してます。  
次回もよろしくお願いいたします。  

## Git Kraken
Git管理は基本、PHPStormを使っていますが、  
ツリー確認で力を発揮してくれました。  
次回も取り敢えず使っていきたいと思います  

# ブラウザ
## chrome
言わずと知れた、choromeたん  
cVimとマウスジェスチャーを入れて次回もよろしくお願いいたします。  

## opera
キャプチャー機能が便利になってるので、サブブラウザとして使っていきたいと思います。  

# SQL関連
## Mysql Workbench
次回も、mysqlっぽいのでよろしくお願いいたします。  
（ダークテーマ欲しい・・・・）

# ターミナル
## Tera term
Poderosaを使ってみたのですが、何故か文字化けしててイマイチだったので、  
結局Tera Term使ってました。  
bushからssh叩く機会多いから、案外使わないかも・・・・？

# 検証ツール
## Postman
API検証のために使用  
データの共有から、Env化、シナリオまで色々調べたので有効活用していきたい。  
chromeとのcookie共有は中々使い道がありそう  

# 思考ツール
## Xmind
今回は、あまり使わなかったけれども、もうちょっと有効活用していきたい  

## draw io
構成図書くのに使用、Google図形描画で代替できないか検討  

## office
今回は支給されず、Googleのアプリ使っていた。  
正直、Googleのアプリでも十分かもしれない。  

## おわりに
ずらずら書いてみて、色々使ってるけど、取り敢えずPHPStormだけは無いと困るなって思いました！
XDとかも今後使ってみたいなぁー
WSL で start コマンド

## <i class="fa fa-paw fa-fw"></i>小ネタ
`WSL` でコマンドプロンプトの `start` を使いたくてシェルスクリプトを作成．
ここでは，`winstart` にしていますが，好きな名前で `PATH` の通った場所に作成後，`chmod +x winstart` のように実行権限を与える．


```bash:winstart
#!/bin/bash

if [ -n "$1" ]; then
    args=$(wslpath -w $1)
    cmd.exe /c start ${args}
else
   echo "No such file or directory"
fi
```
asciidoctor-pdfで日本語を含むSVG画像を扱う

# asciidoctor-pdfで日本語を含むSVGを扱うには
asciidoctor-pdfでSVGを含む画像を出力する際、SVGに日本語が含まれていると"¬"になってしまう問題の対策となります。
原因はPDF出力する際にPrawnがWin1252のCharsetに対応したフォントを使用しないことになります。
asciidoctor-pdfのGithubに対策は書いてあったのですが備忘録としてまとめておきます。

ここではasciidoctor, asciidoctor-pdfは既に導入済みとします。

# asciidocotor-pdf-cjk-kai_gen_gothicをインストールする
[インストール手順はGithub参照](https://github.com/chloerei/asciidoctor-pdf-cjk-kai_gen_gothic)

# Prawn-SVGに日本語フォントを指定するコードを追加する
[asciidoctor-pdfのGithub](https://github.com/asciidoctor/asciidoctor-pdf/issues/82)でCJK環境の問題点として議論されていた中に解決策として提示されていました。
フォント指定を追加するコードを別途作成して、実行時にロードする形となります。

```ruby:config.rb
Prawn::Svg::Font::GENERIC_CSS_FONT_MAPPING.merge!(
  'sans-serif' => 'KaiGen Gothic JP'
)
```  

# asciidoctor-pdf実行時に上記コードを記述したファイルを指定する
ここでは変換元ファイルと同じ階層にconfig.rbを配置した形としてあります。

```  
$ asciidoctor-pdf -r asciidoctor-diagram -r ./config.rb -r asciidoctor-pdf-cjk-kai_gen_gothic -a pdf-style=KaiGenGothicJP test.adoc
```  
# 動作確認環境
- ruby 2.4.4p296 (2018-03-28 revision 63013) [x64-mingw32]  
- Asciidoctor 1.5.7.1 [https://asciidoctor.org]  
- Asciidoctor PDF 1.5.0.alpha.16 using Asciidoctor 1.5.7.1 [https://asciidoctor.org]
C++ Builder XE4 > Excel > セルC5に"3.141592"を代入する > 3.14となる

```txt:動作環境
- 実装
    - C++ Builder XE4
- 確認
    - Windows 8.1 Pro
    - Office 2016
```

### 関連

- [C++ Builder XE4 > Excel > 1行挿入して、別ファイル保存 | DisplayAlertsのオフ](https://qiita.com/7of9/items/455ed13e1c6b96331a63)


### 処理概要

- セルC5にString文字列"3.141592"を代入する

### code v0.1

[C++ Builder XE4 > Excel > 1行挿入して、別ファイル保存 | DisplayAlertsのオフ](https://qiita.com/7of9/items/455ed13e1c6b96331a63)
のcode v0.2に対して、下記の変更をする。

```変更前.cpp
xls_asheet.OlePropertyGet("Rows", 1).OleProcedure("Insert");
```

```変更後.cpp
xls_asheet.OlePropertyGet("Cells", 5, 3).OlePropertySet("Value", String("3.141592").c_str());
```

Valueプロパティに対して、c_str()変換結果を代入する。

上記の例ではStringはUnicodeStringのため、c_str()の結果はWideStringになる。

#### 結果

セルC5には"3.14"の値が入る。
少数第3桁以下がカットされる。

書式をNumberFormatLocalにて"0.00000"とした場合でも"3.14000"となる。
Sandboxテスター追加時、Unknown Errorsが出てテスターを追加できない

## 概要

Sandboxテスターを追加しようとしたら以下のようなエラーが発生して、追加出来なかった。

![エラーイミフ-2018.06.25-19-41-22.png](https://qiita-image-store.s3.amazonaws.com/0/8105/dec2c58e-a839-0c8f-ff9a-003e37cb9c00.png)

原因は、以下フォーラムにあるようにパスワードに容易な文字を使っているからでした。エラーメッセージなんとかしてください。。

## 参考

https://forums.developer.apple.com/thread/103032
VSCodeでSCSSのビルド環境を作る

なんども環境作ることになってめんどくさいので自分用メモ。
この記事はVSCode公式の方法に従って、拡張機能を使わずにビルド環境を作るメモです。

## 環境
- OS X (11.0.1)
- VSCode (1.63.2)
- gulp (3.9.1)

## 公式
~~https://vscode-doc-jp.github.io/docs/languages/css.html~~
https://code.visualstudio.com/docs/languages/css

以下は上記公式の手順から、cssへビルドする部分だけを抜粋したものです。（URLが変わっていたので変更しました）

## 1. gulpのインストール
``` 
npm install -g gulp
npm install gulp gulp-sass gulp-less
```
インストールしたら ``` gulp -v ```で確認


## 2. Gulpタスクを作成

VSCodeを開いてシンプルなscssを含むプロジェクトを作ります。

tasks.jsonを追加します。


```
Project/
 ├ .vscode/
 │    └ tasks.json
 │
 ├ styles/
 │    └ scss/
 │       └ main.scss
 │
 ├ index.html
 └ main.js

```


tasks.jsonの中身はこんなかんじ。最低限です。

```json
{
    "version": "2.0.0",
    "command": "gulp",  // ここにgulpを指定
    "isShellCommand": true,
    "tasks": [
        {
            "label": "Sass Compile",
            "type": "shell",
            "command": "node-sass styles.scss styles.css",
            "group": "build"
        }
    ]
}

```

これでscssを保存したときに自動でcssを出力してくれる環境ができました。

## タスクが動くか確認する
まずはscssファイルを用意します。この時点でプロジェクトのフォルダ構成はこんな風になってます。



hoge.scssの中身はサンプルとしてこんなものにしました。

```scss
/*このコメントは出力される*/
body{
    font-family: Arial, Helvetica, sans-serif;
    font-size: 2em;
}

// 変数
$bk-color: darkblue;
$font-color: white;

// こっちのコメントは出力されない
#content{
    background-color: $bk-color;
    div {
        width: auto;
        height: 20px;
        color: $font-color;
        margin: 0 auto;
    }
}
```

### タスクを動かす
command + shift + B　を押すとタスクが起動します。複数のタスクがある場合は選択肢が出てきますが、「gulp: scss:watch [プロジェクト名]」を選択します。  

うまく行けばTERMINALウィンドウにログが出るはず。エラーが出たら焦らずログを見て手順を確認しましょう。たいてい何かがインストールされてなかったり、jsonの書き方が間違っているのが原因です。

Finishedのログが出たら、hoge.scssファイルを保存します。gulpfile.jsで出力先として指定したパスにhoge.cssが作成されたら成功です。やったね！

cssフォルダは作っておかなくても自動で作成されます。ビルド後はこんなフォルダ構成になりました。

```
Project/
 ├ .vscode/
 │    └ tasks.json
 │
 ├ styles/
 │    ├ css/
 │    │  └ hoge.css
 │    │
 │    └ scss/
 │       └ hoge.scss
 │
 ├ index.html
 └ main.js

```

出力されたcssはこうなってます。

```css
@charset "UTF-8";
/*このコメントは出力される*/
body {
  font-family: Arial, Helvetica, sans-serif;
  font-size: 2em;
}

#content {
  background-color: darkblue;
}

#content div {
  width: auto;
  height: 20px;
  color: white;
  margin: 0 auto;
}

```
階層も変数もちゃんとビルドされてますね。outputStyleに指定した形式に応じて出力結果はかわりますが、とにかく.cssが作成されれば成功です。あとはゴリゴリscssを書くだけです。

ただし、scssにエラーがあるとタスクが止まってしまうので、こまめにターミナルウィンドウをチェックして正常にビルドされているか確認する必要があります。再度 command + shift + B　で動かせばOK。タスクを止めたいときは command + shift + PからTask:Terminate Taskを選択すると停止できます。

以上、最低限のscssをVSCodeで自動ビルドする方法でした。
Let's Encrypt でDNS認証で証明書を発行してdokkuに設定する


最近使っているdokku環境にてSSLが必要になったので、Let's Encryptで証明書を発行して
設定してみました

dokkuについては以下の記事にわかりやすく紹介されています
[個人開発ならHerokuよりDokkuを使おう](https://qiita.com/gn_spawn/items/712349b5b0ebaf4b0203) 



1. certbot-auto をインストール

    ```
curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
chmod +x /usr/bin/certbot-auto
```

2. certbot-autoでDNS証明書を発行

    ```
certbot-auto certonly --manual --email <email@address> --agree-tos --preferred-challenges dns --domain <FDQN>
```

    途中でDNSのTXTレコードに指定の文字列を登録しろって言われるので指示に従ってDNSにTXTレコードを登録する。

    問題なく認証できると以下のファイルが生成されます

    ```
$ ls -1 /etc/letsencrypt/hogehoge
cert.pem
chain.pem
fullchain.pem
privkey.pem
```

3. 鍵と証明書を tarに固める

    ```
$ cp /etc/letsencrypt/hogehoge/fullchain.pem server.crt
$ cp /etc/letsencrypt/hogehoge/privkey.pem server.key
$ tar cvf cert-key.tar server.crt server.key
```

4. dokkuに鍵ファイルをインポート

    ```
 $ dokku certs:add <appname> < cert-key.tar
```

----

参考

http://dokku.viewdocs.io/dokku/configuration/ssl/
http://sig9.hatenablog.com/entry/2017/10/27/000000
k8s Pullpolicyの勘違いでspark-submitでどハマりした話

Azure k8sを使ったSpark-submitを実行するのにハマったので同じ人が出ないよう共有です

## 実行環境

- kubernetes: Azure K8s Service(AKS) version 1.10.3
- dockerイメージレジストリ: Azure Container Registry
- spark: spakr2.3をgithubからDLし、-Pkubernetesオプションをつけて、jar化

## 実行手順
[AKS での Apache Spark ジョブの実行](https://docs.microsoft.com/ja-jp/azure/aks/spark-job)というAzureのマニュアルに沿って実行

## やりたかったこと

Spark-Pi example Jarをコンテナ内にADDした状態でspark-submitしたかった
↓のコマンドのようにlocal://をつけてspark-submitしたかったということ

```terminal:spark-submit
./bin/spark-submit   
--master k8s://http://0.0.0.1:8001   
--deploy-mode cluster   
--name spark-pi   
--class org.apache.spark.examples.SparkPi   
--conf spark.executor.instances=1  
--conf spark.kubernetes.container.image=hoge
local:///opt/spark/work-dir/SparkPi.jar
```

## 起きた現象
↓のようにSparkPiをAzure Blob Storageに置いて実行する場合は正常終了する

```terminal:成功コマンド例
jarUrl=$(az storage blob url --container-name $CONTAINER_NAME --name $BLOB_NAME | tr -d '"')

./bin/spark-submit \
  --master k8s://http://127.0.0.1:8001 \
  --deploy-mode cluster \
  --name spark-pi \
  --class org.apache.spark.examples.SparkPi \
  --conf spark.executor.instances=3 \
  --conf spark.kubernetes.container.image=$REGISTRY_NAME/spark:$REGISTRY_TAG \
  $jarUrl
```

しかしJarをContainerにいれ、local Jarを見るようにすると失敗する.
なおコンテナ内にJarが格納されていることはdocker runした上で確認済み.

```terminal:失敗コマンド例
# マニュアル内[コンテナー イメージを使用して jar をパッケージ化する]箇所
./bin/spark-submit \
    --master k8s://https://<k8s-apiserver-host>:<k8s-apiserver-port> \
    --deploy-mode cluster \
    --name spark-pi \
    --class org.apache.spark.examples.SparkPi \
    --conf spark.executor.instances=3 \
    --conf spark.kubernetes.container.image=<spark-image> \
    local:///opt/spark/work-dir/<your-jar-name>.jar
```

```terminal:エラーメッセージ
Error: Could not find or load main class org.apache.spark.examples.SparkPi
```

## 原因

k8s経由のspark-submit時にはimageをPullするPolicyが設定されている

| Property Name | Default | Meaning |
|:--|:--|:--|
| spark.kubernetes.container.image.pullPolicy | IfNotPresent | Container image pull policy used when pulling images within Kubernetes. |

([Spark 2.3.0マニュアル](https://spark.apache.org/docs/2.3.0/running-on-kubernetes.html)より抜粋)

DefaultはIfNotPresent、つまり変更があればImageをPullするPolicyであると思っていた.
にもかかわらずDocker Imageを更新してもPullされず、古いものが使われ続けていた.

そのためJarをADDしたイメージでRegistryを更新したにも関わらず、　k8s内ではADDしていない時に登録したイメージがずっと使われため、Jarが存在せずエラーで落ちていた.
またAzure Container Registryから該当イメージをPullしてdocker runした場合には、最新イメージが使われていたためJarが存在しており、トラブルシュートをややこやしくしていた.

## 解決策

1. Regsitryのtagを毎回変えた上でPushする
2. latestタグを使う
3. 以下のオプションをspark-submitに加えてk8sでも毎回強制Pullさせる

```terminal:追加オプション
--conf spark.kubernetes.container.image.pullPolicy=Always
```

詳しくは↓の[Updating Images]項を参考
https://kubernetes.io/docs/concepts/containers/images/
CircleCI2.0ではenvironmentで変数展開ができない

こういうことができない。

```yml
version: 2
jobs:
  build:
    docker:
      - image: circleci/ruby
    environment:
      - PATH: /path/to/dir:$PATH
```

こうする

```yml
    steps:
      - run:
          command: echo 'export PATH=/path/to/dir:$PATH' >> $BASH_ENV
```
障害対応で一番最初にやるべきことは全体への周知じゃね?

結構｢障害対応ハウツー｣みたいなのはググればいくらでも記事が出てくるけどここに言及してる記事が案外少ないなあと思ってどうしても書きたくなりました.
新人でもすぐできるからぜひ覚えてもらいたくて｢新人プログラマ応援｣のタグも付けました.

# 一番最初にやるべきことは全体への周知

監視ツールの通知によってとか, 誰かに｢このページ見れなくなってるよ｣って教えてもらうとか, 
何らかの手段によってエンジニアが障害の発生に気づいたとき, **一番始めにやることは全体への周知**だと思っています.

## ｢一番始めに｣
**一番始めに**というのは, まさに**何を差し置いても一番始めに**ということです.

障害に気づいたエンジニアはつい
｢どこのページだ｣
｢レスポンスタイム10秒って出てるけどホントかよ試しに俺もアクセスしてみよう｣
｢さっきのデプロイが原因じゃねえか?｣
などと口走りがちですが, これらの気持ちをグッと堪えてまずは周知に意識を向けるべきです.

## ｢全体への｣

｢できるだけ全体への｣と言い換えてもいいかもしれません.
小さい会社なら社員全員宛のメーリングリストとかSlackチャンネルへ投稿していいと思います.
多少規模が大きいなら部署全員宛のメーリングリストかSlackチャンネルへ投稿するという判断になるでしょう.
この辺は会社の規模とか組織･チームの事情によっても違いそうです.

ただ, ここで大事だと思っているのは, **あらゆる関係者全員に周知しようとしない**ということです.
あらゆる関係者全員への周知となると, 部署外や社外の人も含まれてしまい, 
気軽に素早く連絡できる手段がまとまっていなかったり, そもそも存在しなかったりするため, 関係者を網羅しようとすると時間がかかりすぎます.

例えば, ｢取引先への連絡などは担当の営業さんから連絡してくれればいい｣とか, エンジニアが連絡しなくても連絡を任せられる人はいるはずなので, 
エンジニアが連絡に努力を要するような関係者への連絡は誰かに任せてしまいましょう.

逆に, 上記のように連絡を任せたりしたいという事情があるので, 
**間違ってもエンジニアだけが入っているチャンネルへの周知にとどめてはいけません.**
できるだけ多くの人に素早く障害がおきていることを伝えましょう.

## ｢周知｣

このタイミングでは速報なので, 
｢障害がおきているかもしれない｣
｢今から対応を開始する｣
ということだけ伝えるようにしましょう.

上のほうでも書きましたが, 具体的にどこの障害かとか, 原因がどうとか, 
なんなら**本当に障害が発生しているかどうか**すらもこのタイミングでは伝える必要は無いと思います.

自分は普段はSlackの部署全員が入っているチャンネルで
`@channel 障害がおきているようです. 今から対応します.`
とだけ投稿するようにしています.

# これを徹底すると何がうれしいのか

* 誰も障害気づいてないんじゃね?という不安を払拭できる
* 誰も対応開始してないんじゃね?という不安を払拭できる
* カスタマーサポートとか営業とかが｢障害発生しててすいません｣って謝る身構えができる
* その他諸々

# まとめ

基本的にはよく言う｢悪いことは早めに, 良いことは遅れて報告する｣というのをちゃんとやるだけだと思います.
すごく普通のことを言った記事になってしまいましたが, 障害は頻繁に発生するものでもないですし, 
いざ障害発生となったら案外ここに書いたことをちゃんと素早くやる人は少ないんじゃないか?と思っています.

障害自体つらいものなのに, この記事に書いたようなことを怠ったおかげで障害の被害が拡大するようなことがあったら目も当てられません.
緊急事態だからこそ細かいことに気をつけられるのが良い対応なんじゃないかなーと思っています.
AndroidStudioでkotlin書いてる時に改行を維持したいときの設定

Editor > CodeStyle > Kotlin > Wrapping and Braces > Keep when reformattingのLineBreaksでチェック

なぜか私の手元だとイコール先頭だと前の行に強制的に改行される……なぜ……
それ以外は改行を維持してくれます

このCodeStyle、右にちゃんと例があってわかりやすくていいですね

いつか設定項目についてまとめたい…。。。