OmniAICreator/Qiita-1.07M huggingface dataset:
【D3.js】折れ線グラフ&棒グラフ


## ざっと触ってみる

http://ja.d3js.info/alignedleft/tutorials/d3/
https://github.com/d3/d3/blob/master/API.md

## 折れ線グラフと棒グラフをいろいろ工夫する

- 個人と全体の2つのグラフを重ね合わせる
- Y軸左が個人、Y軸右が全体
- X軸を60セクションに分割し、40セクションまで進んでいるデータを取得
- 折れ線グラフはマスクをかけてアニメーション
- 棒グラフはattrTween()でアニメーション
- アニメーション終了後に最大値を表示

↓以下順番につくってみた

D3.js リアルタイム棒グラフ
https://codepen.io/mo4_9/pen/RZxoBb

D3.js リアルタイム折れ線グラフ&棒グラフ
https://codepen.io/mo4_9/pen/yovLjx

D3.js アニメーション折れ線グラフ&棒グラフ
https://codepen.io/mo4_9/pen/BdYLZP

D3.js マスクアニメーション折れ線グラフ&棒グラフ
（演出・テクニックもりもり）
https://codepen.io/mo4_9/pen/BdYEvq

![スクリーンショット 2017-08-20 13.07.02.png](https://qiita-image-store.s3.amazonaws.com/0/136286/1fa88e72-00e8-7bf4-c3cc-2f7449a2ec53.png "スクリーンショット 2017-08-20 13.07.02.png")

## 参考

折れ線グラフ
https://bl.ocks.org/pstuffa/26363646c478b2028d36e7274cedefa6

折れ線グラフアニメーション
http://blog.aagata.ciao.jp/?eid=129

グラデーション
http://bl.ocks.org/pnavarrc/20950640812489f13246
SVG Gradients
https://developer.mozilla.org/ja/docs/Web/SVG/Tutorial/Gradients

マスク（clipPath）
http://jsdo.it/mr.hoot/x6y2

グラデーションにstop-opacityを使う
（ios,safariなどでalpha設定していたら透過しなかったため）
https://stackoverflow.com/questions/31729206/svg-transparent-radial-gradient-in-safari-not-working

clip-pathのバグ関連
・defsで囲む
https://kadoppe.com/archives/2012/07/svg-clippath-def.html
・cssでなくattrでかく
http://www.d3noob.org/2015/07/clipped-paths-in-d3js-aka-clippath.html
.idにcurrentTimeを当てて毎回リフレッシュする
データベースのテーブルにカラムを追加する（Rails）

# 対象
- Ruby on Railsのデータベースをいじりたい
- RailsでDBを操作するコマンドを忘れた


# 既存のテーブルに**カラムを追加する**場合、migrationスクリプトを作成する


### マイグレーションスクリプトを作成
```
rails generate migration Add(カラム名)To(テーブル名) (カラム名):(型名)
```

```
ex)rails generate migration AddAuthor_idToBlogposts author_id:string
```

### マイグレーションの実行
```
rake db:migrate
```
python2とpython3でjson.dumpsのインデントの挙動が違う

python2.7とpython3.6でindentオプションを指定した時のjson.dumpsの挙動が違う。python2だと改行コードの前にスペースが一つはいっているが、python3だとはいっていない。

# 実験
## コード

```python
import json
json.dumps({"name": 'aaa', "age": 21}, sort_keys=True, indent=2)
```

## 結果
### python2.7.8
```
'{\n  "age": 21, \n  "name": "aaa"\n}'
```
### python3.6.0
```
> '{\n  "age": 21,\n  "name": "aaa"\n}'
```

# 原因と対応
## 原因
[Issue 16333: Trailing whitespace in json dump when using indent - Python tracker
](https://bugs.python.org/issue16333)

## 対策
`separators=(',',': ')`をjson.dumpsのオプションに追加する。

```python
import json
json.dumps({"name": 'aaa', "age": 21}, sort_keys=True, indent=2, separators=(',', ': '))
```
状態遷移図作成 > 比較 > draw.io | FSM designer

onlineTool > 状態遷移図作成 > FSM designer
http://qiita.com/7of9/items/35d2861de6ec8207b1c5


FSM designerは状態遷移図作成をしやすいとは思い、よく使ってきた。しかしながら、ブラウザのキャッシュを使用のため、複数の図を管理できない。

draw.ioではGoogle Driveに保存でき、複数の図を作成したり管理したりできる。
編集はまだ慣れていないためか、FSM designerほど短時間で作成はできない。

- FSM designer
    - 長所
        - 編集がしやすい
            - 状態同士の結合
            - 結合線の湾曲が可能
    - 短所
        - １つの図のみ作成 (ブラウザキャッシュ利用のため)
        - Google DriveやDropboxなどに保持できない
        - 結合線上の文字の位置はユーザが変更できない
- draw.io
    - 長所
        - Google Driveに保存できる
        - 図をコピペできる
            - 一部の変更をした複数の図を短時間で作成できる
        - 結合線上のテキスト位置を移動できる
        - グリッド上に配置できる
    - 短所
        - FSM designerほど短時間で作図できない
            - 例: FSM designer:5分, draw.io:15分
            - 使い方に不慣れなのかもしれない
        - 状態同士の結合線を湾曲できない
            - UML: Dependenceyを使用の場合
            - 湾曲でなく、直線の折り曲げは可能
        - ネットワーク不調からの回復時、Google Drive上のファイルに30分程度接続できなくなる
- 手書き
    - 長所
        - 配置を気にしないなら、手っ取り早く作成可能
    - 短所
        - 追加編集に向かない
 
将来、再利用（編集を含む）したい図に関しては、draw.ioが良さそう。

### 補足：レイアウト自動調整の描画ツール

フォーマット情報付加テキストを用意して、状態遷移図を自動生成するサービスもある。その場合、レイアウト自動調整になり、以下の点で自分の希望しているようにはならない。

- ノード位置
    - 似たような図が似たようなノード配置にならない
    - 状態の始点が複数の図で異なる (例: 図1.左上始点、図2. 右下始点)
        - 結果:可読性の低下
- 結合線上のテキストの位置
    - テキストが読みやすい位置に来ない
    
配置を厳密には気にしない図に関しては、こういうツールでもいいだろう。
Xcodeで「Profile doesn't match any valid certificate/private key pair in your keychains.」と言われた場合（かつ、証明書を紛失している場合）

証明書をお引っ越しするための記事はいくつもあるんですが、再発行するための方法がどこにも書いていなかったので。
引っ越しの記事は例えば[これ](http://kronus9.sblo.jp/article/85304109.html)。

## 1. 認証局に証明書を要求
キーチェーンアクセスを起動して、[キーチェーンアクセス]>[証明書アシスタント]>[認証局に証明書を要求...]
<img width="705" alt="スクリーンショット 2017-08-20 12.14.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/44356/e63b8ab4-03cb-4efd-ba3c-44be297a6602.png">

メールアドレスと通称を入力。（この文字列が何のためにあるのかは不明。ログイン情報と同じである必要とかはない。。。一応連絡の取れるメールアドレスにしてる。)
ディスクに保存にチェック。
<img width="728" alt="スクリーンショット 2017-08-20 12.14.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/44356/2da28b64-8ee0-669c-ab7c-8d2e43b45e22.png">

そして適当な場所に保存。

## 2. Generate your certificate
https://developer.apple.com/account/ios/certificate/create
ここから、[iOS App Development]にチェックを付けて、[Continue]を押していく。
Upload CSR file.でさっき作った証明書を選択。そして[Continue]。

**このタイミングでしか秘密鍵付きの証明書はダウンロードできない。**
確実にダウンロード。

## 3. 登録
ダウンロードしたファイルを開くと、自動的にキーチェーンアクセスに登録される。
登録した証明書が左の▶で開けることを確認。
開けないのであれば、秘密鍵がついていない。

## 補足
ProvisioningProfileは全部新しい証明書を選択して作り直さないと、新しい証明書が登録されているPCでビルドが出来ません。
CVE-2017-1000117 とその修正について

# 説明したいこと

* git の脆弱性 CVE-2017-1000117 とその修正内容を説明
* 目標：プログラマ以外の人にも何か持ち帰ってもらう

---
# 脆弱性とは

* もろくて弱い性質
* セキュリティーホール
* 悪意のある第三者によりシステムを不正利用され得る

---
# 今回問題があったソフトウェア: git

* ソースコード（など）を管理するツール
* ローカルで履歴を管理
* 履歴のリモートへの送受信

---
# 開発者がgitを使う流れ

1. ソースコードの履歴をサーバからダウンロード
2. ソースコードを変更してリポジトリに格納
3. ソースコードの履歴をサーバにアップロード

---
# 開発者がgitを使う流れ(1)

ソースコードの履歴をサーバからダウンロード

![git-clone.png](https://qiita-image-store.s3.amazonaws.com/0/64323/2e7c3783-8ad5-ec7b-bb62-0de16b1f4c49.png)


---
# 開発者がgitを使う流れ(2)

ソースコードを変更してリポジトリに格納

![git-commit.png](https://qiita-image-store.s3.amazonaws.com/0/64323/e62fdf46-ebae-61ee-f6c3-209ad7fcc44b.png)

---
# 開発者がgitを使う流れ(3)

ソースコードの履歴をサーバにアップロード

![git-push.png](https://qiita-image-store.s3.amazonaws.com/0/64323/1bfa52f4-cf72-c371-59e9-8d86f0397d91.png)

---
# ソースコードのありかは URL で表わす

clone するとき明示、push は保存された値を使う

* スキーム://ユーザ@ホスト/リソースパス
  * `https://github.com/user/repo.git`
  * `ssh://git@github.com/user/repo.git`
* スキームが ssh の場合、ssh プロトコルで通信

---
# sshプロトコルで通信

* git は内部で ssh コマンドを実行している
* 実際何をしているのか見てみよう
  * デモ: GIT_SSH 環境変数で次のコードを指定
  * ssh コマンドの代わりに実行される
  * どのように実行されているのかを表示

```
#!/usr/bin/env python
import sys

for i, v in enumerate(sys.argv):
    sys.stderr.write('argv[{}]="{}"\n'.format(i, v))
```

---
# 通常の用法

```
$ GIT_SSH=/tmp/ssh_vulnerability/git-ssh.py git clone ssh://git@github.com/yoichi/sandbox.git
Cloning into 'sandbox'...
argv[0]=“/tmp/ssh_vulnerability/git-ssh.py"
argv[1]="git@github.com"
argv[2]="git-upload-pack '/yoichi/sandbox.git'"
fatal: Could not read from remote repository.
```

* ssh を別プログラムに置き換えてどういう引数が渡るか確認した
* 引数に "ユーザ@ホスト” と "ごにょごにょする指示” が渡ってる


---
# 悪意のある用法

```
$ GIT_SSH=/tmp/ssh_vulnerability/git-ssh.py git clone ssh://-oProxyCommand=hoge/yoichi/sandbox.git
Cloning into 'sandbox'...
argv[0]=“/tmp/ssh_vulnerability/git-ssh.py"
argv[1]="-oProxyCommand=hoge"
argv[2]="git-upload-pack '/yoichi/sandbox.git'"
fatal: Could not read from remote repository.
```

* ユーザ@ホスト” のところに妙な文字列を指定
* 本物の ssh の場合、接続には失敗するが、hoge は実行されてしまう

---
# 利用された機能

sshのproxy対応

* 外部への直接接続を制限している環境のため
* 中継サーバを経由して外部サーバに接続
* 中継サーバへの接続のため外部コマンドを実行

![proxy.png](https://qiita-image-store.s3.amazonaws.com/0/64323/9c427e0c-59a2-ac2b-3219-4c69df29babc.png)

---
# 今回の問題

* git の URL パース処理に問題があった
* "ユーザ@ホスト” が妥当か気にせず ssh を実行
* ProxyCommand と解釈されたものが実行される
* 任意のコマンドが実行されてしまう可能性

---
# おかしなURLなら気づくのでは？

知らずに踏んでしまう可能性

* git には submodule という機能がある
* https://github.com/greymd/CVE-2017-1000117
* cf. HTML文書中の `<img src=“https://host/resource.png" />` に対するブラウザの動作
  * 書かれているURLからリソースを取得

---
# 修正内容

* "ユーザ@ホスト” の部分が “-“ で始まっているなら弾くように
* https://github.com/git/git/commit/4274c698f46a9bc45834c4904e7e113450c042fb
  * 追加されたテストにも注目

---
# コードによるテスト

* 修正内容が期待したとおりに動くこと
  * 不正なホスト名が弾かれる
* 副作用で意図せず動かなくなるものがないこと
  * - で始まるリポジトリがcloneできる
* 以上が、今後の別の変更で壊されないこと

をコードで担保する

---
# まとめ

* CVE-2017-1000117 とその修正を解説
* 伝わるといいな：
  * 開発者が使っている git とは何者か
  * 外部コマンド実行する処理の注意点　
  * 修正では副作用出さないように注意
heroku のCLIをOracleLinuxにインストールする

# 公式サイトを見てみる
https://devcenter.heroku.com/articles/heroku-cli
それらしきスクリプトを実行するもエラー。。
# ググる
http://blog.tokoyax.com/entry/heroku/command-install
これに沿ってやってみる。
-1.wgetで取得

    $ sudo wget -qO- https://toolbelt.heroku.com/install.sh --no-check-certificate | sh
    This script requires superuser access to install software.
    You will be prompted for your password by sudo.
    Add the Heroku CLI to your PATH using:
    $ echo 'PATH="/usr/local/heroku/bin:$PATH"' >> ~/.profile
-2.コマンドへパスを通す

    $ vi ~/.bash_profile
    # .bash_profile
    # Get the aliases and functions
    if [ -f ~/.bashrc ]; then
            . ~/.bashrc
    fi
    # User specific environment and startup programs
    PATH=$PATH:$HOME/bin
# heroku のパスを追加

    PATH=/usr/local/heroku/bin:$PATH
    export PATH
-3.profileをリロード

    $ source ~/.bash_profile
-4.バージョンの確認

    $ heroku -version
最新じゃないのでとってきてくれるっぽい。

    $ heroku --version
    WARNING: This is the legacy Heroku CLI with limited functionality. Please install the latest CLI.
    WARNING: Installation instructions are at https://cli.heroku.com
    heroku-cli: Installing CLI... 25.58MB/25.58MB
    heroku-cli/5.12.0-0ab8352 (linux-amd64) go1.7.5

#それでもやっぱり最新じゃないっていうエラーなので初心に戻って以下を実行
    $ wget https://cli-assets.heroku.com/heroku-cli/channels/stable/heroku-cli-linux-x64.tar.gz -O 
    heroku.tar.gz
    $ tar -xvzf heroku.tar.gz
    $ mkdir -p /usr/local/lib /usr/local/bin
    $ mv heroku-cli-v6.13.18-a444c52-linux-x64 /usr/local/lib/heroku
    $ ln -s /usr/local/lib/heroku/bin/heroku /usr/local/bin/heroku

#heokuはどこにあるか確認。
    $ which heroku
    /usr/local/bin/heroku
#heroku　バージョン確認
    $ heroku --version
    heroku-cli/6.13.18-a444c52 (linux-x64) node-v8.3.0
元ネタがありそうな提案文書タイトル

[C++ Standards Committee Papers](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/) より[^1]：

[^1]: 抽出基準は個人の主観によります。あらかじめご了承ください。

|文書番号|タイトル|元ネタ|
|:-----:|:-----|:----|
|[N3174](https://wg21.link/n3174)|To move or not to move|[To be, or not to be][tobe]|
|[N3981](https://wg21.link/n3981)|Removing trigraphs??!|(自己言及型; Trigraphは`??`+1文字)|
|[P0307R0](https://wg21.link/p0307r0)|Making Optional Greater Equal Again|[Make America Great Again](https://en.wikipedia.org/wiki/Make_America_Great_Again)|
|[P0308R0](https://wg21.link/p0308r0)|Valueless Variants Considered Harmful|[Go To Statement Considered Harmful][harmful]|
|[P0394R4](https://wg21.link/p0394r4)|Hotel Parallelifornia: terminate() for Parallel Algorithms Exception Handling|[Hotel California (曲名)](https://en.wikipedia.org/wiki/Hotel_California)|
|[P0404R0](https://wg21.link/p0404r0)|Matching Types: 404 Syntax Not found|[HTTP 404 Not Found](https://en.wikipedia.org/wiki/HTTP_404)|
|[P0418R1](https://wg21.link/p0418r1)|Fail or succeed: there is no atomic lattice|[To be, or not to be, that is the question][tobe]|
|[P0481R0](https://wg21.link/p0481r0)|Bravely Default|[Bravely Default (ゲーム)](https://en.wikipedia.org/wiki/Bravely_Default)|
|[P0551R0](https://wg21.link/p0551r0)|Thou Shalt Not Specialize std Function Templates!|[King James Version (聖書)](https://en.wikipedia.org/wiki/King_James_Version)<br/>["Thou shalt not ..."](https://www.biblegateway.com/quicksearch/?quicksearch=%22Thou+shalt+not%22&version=KJV)[^thou-shalt-not]|
|[P0701R0](https://wg21.link/p0701r0)|Back to the std2::future|[Back to the Future (映画)](https://en.wikipedia.org/wiki/Back_to_the_Future)|
|[P0701R2](https://wg21.link/p0701r2)|Back to the std2::future Part II|[Back to the Future Part II(映画)](https://en.wikipedia.org/wiki/Back_to_the_Future_Part_II)|
|[P0738R0](https://wg21.link/p0738r0)|I Stream, You Stream, We All Stream for `istream_iterator`|[I Scream, You Scream, We All Scream for Ice Cream (曲名)](https://en.wikipedia.org/wiki/Ice_Cream_(I_Scream,_You_Scream,_We_All_Scream_for_Ice_Cream))|
|[P0977R0](https://wg21.link/p0977r0)|Remember the Vasa!|[Vasa (戦艦)](https://en.wikipedia.org/wiki/Vasa_(ship))|
|[P1039R0](https://wg21.link/p1039r0)|I got you, FAM: Flexible Array Members for C++|"I got you, Fam(ily)" (スラング)|
|[P1282R0](https://wg21.link/p1282r0)|Ceci N'est Pas Une Pipe: Adding a workflow operator to C++|[The Treachery of Images (絵画)](https://en.wikipedia.org/wiki/The_Treachery_of_Images)<br/>Ceci n'est pas une pipe[仏]＝これはパイプではない[日]|
|[P1301R1](https://wg21.link/p1301r1)|[[nodiscard("should have a reason")]]|(自己言及型)|
|[P1873R0](https://wg21.link/p1873r0)|remove.dots.in.module.names|(自己言及型)|
|[P1934R0](https://wg21.link/p1934r0)|boolean Considered Harmful|[Go To Statement Considered Harmful][harmful]|
|[P2134R0](https://wg21.link/p2134r0)|Kaizen*: keep improving together!|トヨタ式 ["カイゼン"](https://en.wikipedia.org/wiki/Kaizen)|

[tobe]: https://en.wikipedia.org/wiki/To_be,_or_not_to_be
[harmful]: https://en.wikipedia.org/wiki/Considered_harmful

[^thou-shalt-not]: 日本語版では「汝(なんじ)、○○するなかれ」と訳出されるケースが多い。
CommonLispのformat関数と*query-io*

## はじめに
* 実践CommonLispを読んでいていて、？？？となったところをアウトプットしてみる 
* 頑張って英語ドキュメントでも読めるようになりたい
* (処理系は**SBCL**で書いています）

## 問題のコード（関数）

```lisp
(defun prompt-read (prompt)
    (format *query-io* "~a: " prompt)
    (force-output *query-io*)
    (read-line *query-io*))
```

* 実践CommonLispを読んだことがある人なら見覚えがあるかもしれない
* この関数の使い方

```lisp
(prompt-read "何か入力してください")
> 何か入力してください: hello, world!

"hello, world!"
NIL
```

* prompt-read関数の引数の文言が出力される
* ユーザーが入力した文字列を読み込む

## \*query-io*
* このグローバル変数は端末に接続した入力ストリームを保持している
* ここで定義したグローバル変数ではなく処理系の方で定義されている変数

#### 端末に接続した入力ストリーム？？
* 端末に入力された入力値はこの\*query-io*変数に保持されていく

```lisp
; 例
(read-line *query-io*)
> こんにちは！

"こんにちは！"
NIL
```

* こんにちは！ -> \*query-io* -> read-lineで読み込み
* read-lineはデフォルトではstandard inputが指定されているらしい
* \*query-io*もデフォルトでは端末が指定されているので、

```lisp
; これらはだいたい同じものと思われる
(read-line)
(read-line *standard-input*)
(read-line *query-io*)
```

## format
* 書籍では最初からしょっちゅう使われる関数
* ここで突然\*query-io*が引数に指定されてたもんだから困惑

```lisp
; フォーマットして出力
(format t "hello, world")
hello
NIL
```

* format関数は引数の文字列をフォーマットする関数
* 第１引数の`t`は`*standard-output`と同じ
* 第１引数指定のストリームにフォーマット結果を出力している
* \*standartd-output*に渡されると出力ストリームなので画面に表示される

```lisp
(format *query-io* "hello")
```

* \*query-io*は入力ストリームなので、フォーマット結果は入力ストリームにわたされる
* 画面には表示されないよ(゜∀。)！

## force-output
* ~~これ調べたけどよくわかんなかった~~
* ~~実際に動かしてみた挙動としては、ストリームを出力する感じ？~~

> コメント欄にて教えていただいので反映させていただきます
* 待機状態のバッファーを強制的に出力する
* バッファを空にする処理を開始したさい、完了や確認の応答が帰ってくるのを待つことはない
* つまるところ、出力とは非同期に関数を返す
* 処理の長い出力があった際には、出力の完了を待たずに関数を返すということ
* finish-outputの方は同期的にバッファを空にするようです

```lisp
(format *query-io* "~a: " prompt)
(force-output *query-io*)
```

* formatでフォーマットした文字列は\*query-io*に出力されるが、改行コードを含んでいないためバッファは待機状態のまま
* force-output関数で強制的にバッファを空にする（出力する）
* またひとつ学んでしまった

## まとめ

```lisp
(defun prompt-read (prompt)
    ; prompt文字列を prompt: の形式にフォーマットして入力ストリームに渡している
    (format *query-io* "~a: " prompt)
    ; 待機状態のバッファを出力
    (force-output *query-io*)
    ; 新たな入力ストリームを読み込む！
    (read-line *query-io*))
```

* ちなみに。。。

```lisp
(defun prompt-read2 (prompt)
    (format t "~a: " prompt)
    (read-line))
```

* sbclやCLISPであれば上記でもいけた
* ただ、書籍には「画面出力を保証する」ためにforce-output関数を使っているとあったので、他の処理系では動かないケースがあるのだと思う
* \*query-io*を使ってストリームを操作したほうが万能に動くということだと思う
004-Googleグループアカウントを送信元としてメールを送信したい

#結論
sendEmailのoptionに「送信元としたいメールアドレス」を指定します。

```js:sample-code1.gs

function sendFromAliases() {
  var to     = "";              //送信先を指定します
  var option = {};
  option.from = "jimukyoku@aha.com";

  GmailApp.sendEmail(to, "テストメール", "このメールはテストです。",option);
}
```
#解説
「自分ではないアドレスを送信元としてメール作成したい」というリクエストは多く、またご自身で解決される方も多いのですが、なぜかnameパラメータで指定される方が多い印象です。
nameで指定すると（字のごとく）「名前」欄は変更されるのですが、「アドレス」欄は自分のGmailアカウントになってしまいます。
例えば「もげ(moge@aha.com)」さんがnameパラメータを「事務局担当」とかに変えても、受信者には

・事務局担当(moge@aha.com)

と表示され、「あ、もげさんに連絡すればいいのね」となり、あまり効果がありません。

通常のGmail操作として、別のアドレスを送信元としてメールを作成するためには[Gmail側であらかじめ設定しておく](https://support.google.com/mail/answer/22370 "別のアドレスやエイリアスからメールを送信する")[^1]必要がありますが、スクリプトで行う場合も同様の事前作業が必要[^2]になります。

[^1]: エイリアスにするかしないか、という部分については割愛します。[ヘルプ](https://support.google.com/a/answer/1710338 "[エイリアスとして扱います] の設定を使用して [名前] アカウントの動作を管理する")を読んで実際に動作を確認頂くことをお勧めします
[^2]: Google Apps Scriptは「（実行者の）Gmailアカウントを利用して、人の手でやれることを自動的に行う」スクリプトなので、手作業としてできるような環境を作っておかないと動きません。


なお上記サンプルでは変数optionを利用していますが、単純にsendEmailの第４引数に`{'from': "jimukyoku@aha.com"}`と書くのもアリです。
私個人としては実務上オプションを指定することが多い為、なんとなく手グセで変数に保存してます。
RaspberryPiでWiFiのRSSIを取得してMackerelに送信する

# はじめに

RaspberryPiを自宅サーバとして運用していますが、構造上の都合で無線LANでインターネットに接続しています。
そのため、WiFiの電波強度をMackerelに送信するプラグインを作りました。

# コード

私はNode.jsが好きなので、Nodeで作りました。
ソースはgithubにあります。
[mackerel-rssi-notifier github](https://github.com/Kadoshita/mackerel-rssi-notifier)

```js:main.js
const fs = require('fs');
const readline = require('readline');
const rs = fs.createReadStream('/proc/net/wireless');
const rl = readline.createInterface(rs, {});

let lineNo = 0;
rl.on('line', (line) => {
	lineNo++;
	if (lineNo === 3) {
		let data = line.split('.');
		let rssi = data[1].trim();

		const epoch = new Date();

		console.log('wifi.rssi\t' + rssi + '\t' + epoch.getTime());
	}
});
```

`/proc/net/wireless` にWiFi関係の情報が含まれているので、これを読み込んで、文字列解析しています。
あとは、Mackerelの設定ファイルにプラグインの情報を記述します。

```text:mackerel-agent.conf
# 略
[plugin.metrics.wifi]
command = ["node","/hoge/mackerel-rssi-notifier/main.js"]
```

最後に、Mackerelを再起動すれば完了です。
Mackerelでは以下のように表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/153517/5b5a069f-e3e9-a95b-bc6d-5048d7260177.png)

# 参考サイト

以下のサイトを参考にしました。ありがとうございました。
[信号強度の取得 - 汁ごはん](http://d.hatena.ne.jp/silphire/20090109/1231471764)
[ストリームを行ごとに処理~readline編~ - Qiita](http://qiita.com/kaz2ngt/items/dabbfa2d20a328722ca2)
angular-cliでappフォルダ直下にコンポーネントを作成したい

angular-cliの`ng generate component`で`app`フォルダ直下にコンポーネントを作成したい場合は、`--flat`オプションを付けるか、`.angular-cli.json`で設定を変更します。

## 環境
確認を行った環境

```
@angular/cli: 1.3.0
node: 8.1.3
os: darwin x64
```

## 設定前

`ng generate component`でコンポーネントを作成

```
ng g component test
```

`/src/app`以下は次のようなディレクトリ構成になる

```
src
├── src/app
│   ├── src/app/app.component.css
│   ├── src/app/app.component.html
│   ├── src/app/app.component.spec.ts
│   ├── src/app/app.component.ts
│   ├── src/app/app.module.ts
│   └── src/app/test
│       ├── src/app/test/test.component.css
│       ├── src/app/test/test.component.html
│       ├── src/app/test/test.component.spec.ts
│       └── src/app/test/test.component.ts
...略...
```

## 設定する
設定ファイルを変更して常にflatオプションを有効にする場合  

defaults->component->flatをtrueに設定します。  

```json:.angular-cli.json
{
// ...略...
  "defaults": {
    "styleExt": "css",
    "component": {
      "flat": true
    }
  }
}
```


## 確認する

`ng generate component`でコンポーネントを作成

### オプションを使用

```
ng g component --flat test
```

### 設定ファイルを変更済みの場合

```
ng g component test
```

`app`以下には他のファイルと同列にコンポーネントが配置されている

```
src
├── src/app
│   ├── src/app/app.component.css
│   ├── src/app/app.component.html
│   ├── src/app/app.component.spec.ts
│   ├── src/app/app.component.ts
│   ├── src/app/app.module.ts
│   ├── src/app/test.component.css
│   ├── src/app/test.component.html
│   ├── src/app/test.component.spec.ts
│   └── src/app/test.component.ts
...略...
```

## 参考

angular-cli -wiki
https://github.com/angular/angular-cli/wiki/generate-component
Macでmongodbを使う最低限のメモ


## インストール

何でも楽したいタイプなのでbrewで。

```bash
brew tap mongodb/brew
brew install mongodb-community
```

## 起動と終了

手動起動もできますが、楽したいので自動で起動させておきます。

```bash
brew services start mongodb-community
```

>なお、自動起動させた場合のデータパスは/usr/local/var/mongodbに設定されるようです。

起動しているかの確認は、

```bash
brew services list
```

停止は

```bash
brew services stop mongodb-community
```

## 概念

mongodbはいわゆるドキュメントDBと呼ばれる部類のデータベースなですが、登場する用語はおおよそRDBと下記のように対応しています。
とは言え、スキーマレスなので、カラムを設定するような行為はありません。

|RDB|mongo|
|---|---|
|database|database|
|table|collection|
|row|document|

## 基本操作

### コンソールの起動


```bash
mongo

>
```

>コンソールを抜けるのはexitとします。

### 各種確認

とりあえずdbを確認。初期でlocalというdbが存在しています。

```bash
show dbs;
```

### database作成

明示的に作成しなくてもdb usernameとすることで、dbが作成されます（但し、実際に作成されるのはcollection作成時）。

```bash
use mydb;
db.createCollection("members");
```

コレクションができたかどうかはshow collectionsで確認できます。

>なお、collectionは明示的に作成しなくてもinsert時に自動生成することができます。

```bash
show collections;
```

### databaseの削除

削除対象のdbをuseしている状態でdropします。

```bash
db.dropDatabase();
```

自分がどこにいるかはdb.stats()で確認できます。

```bash
db.stats();
```

### 挿入

挿入します。同じ構造である必要がありません。
collectionを事前に作っていなくても、自動生成されます。

```bash
db.members.insert({name: "hoge",age: 30});
db.members.insert({name: "foo",age: 40});
```

### 全件検索

とりあえず全件検索。

```bash
db.members.find();
```

### 条件検索

#### 完全一致

```bash
db.members.find({name: "hoge"});
```

#### 正規表現

いわゆるlike的な検索は正規表現で。

```bash
db.members.find({name: /ho/});
```

#### AND 検索

ANDは,で繋げます。

````bash
db.members.find({name:/ho/,age:{$gt:20}});
````

#### OR 検索

ORは少々めんどい。

````bash
db.members.find({$or: [{name:/h/},{age:{$gt:20}}]});
````

同じカラムの複数条件はINを使う。

#### distinct

いちおうDISTINCTも。

```bash
db.members.distinct("name");
```

#### あるKeyが存在するか

あるKeyが存在するかどうかで検索。

```bash
db.members.find({age: {$exists: true}});
```

### 削除

#### 全件削除

とりあえず全件削除。

```bash
db.members.remove({});
```
ORA-27125

#環境
- OS RHEL7 3.10.0-514.26.2.el7.x86_64
- Oracle Grid Infrastructure 12.1.0.2.0
- Oracle Database 12c 12.1.0.2.0

#エラー内容
ORA-27125: unable to create shared memory segment
Linux-x86_64 Error: 28: No space left on device

#解決方法
SHMALLの値を修正する

以下はメモリ20Gの例
$ cat /proc/sys/kernel/shmmax
26843545600
What wrong with my kernel tuning... So, I checked metalink (301830.1) and some recommend from RHEL
They told; set SHMALL to the total amount of physical RAM divided by page size.
SHMALL =>Total amount of shared memory available (bytes or pages)
then:
Check Page Size:
$ getconf PAGE_SIZE
4096
Determine the system wide maximum number of shared memory pages:
$ cat /proc/sys/kernel/shmall
2097152
My system 64bits with memory 32GB, then 1024 * 1024 * 1024 * 32 / 4096 = 8388608
※適宜メモリの容量にて値を修正すること
So, change kernel.shmall = 8388608
$ su - root
\# echo 8388608 > /proc/sys/kernel/shmall
Or modify /etc/sysctl.conf file:
kernel.shmall=8388608
and
\# sysctl -p
After changed... check and startup database again:
$ cat proc/sys/kernel/shmall
8388608


以下参考URL
http://it.toolbox.com/blogs/surachart/shared-memory-startup-database-ora27102-out-of-memory-linuxx86_64-error-28-no-space-left-on-device-34958
Android-x86の6.0を試すならUbuntu+QEMUが楽！

Android-x86 6.0（Marshmallow）を試したくてPCへのインストールにチャレンジしてみたのですが、いくつのかのPCで試してみてもPCが古いのかAndroid-x86の制約が厳しいのか、なかか動いてくれません。

そこで実機で動かす事をあきらめてエミュレーターでと思い、VirtualBoxやAndroid Studioのエミュレーターを試してみたのですが、やっぱり動いてくれません。

無理なのかと諦めかけていた時、ふとQEMUを使ってみたら驚くほど簡単に動いたので、その時のメモです。

※ちなみに今回はウェブページの閲覧とユーザ補助、開発者向けオプションあたりが試したかっただけなので、それ以外のところは試していません。

##動作環境
ホストPCのOSはLubuntu16.04（64bit）、メモリ4Gです。

##事前準備
事前に必要となるのはQEMUのインストールとAndroid-x86のISOファイルのダウンロードの２つとなります。

まずはQEMUのインストールです。QEMUは標準パッケージのものを使いますので、以下のコマンドでインストールすることができます。

```console:QEMUのインストール
$ sudo apt-get install qemu-system-x86 qemu-kvm
```

つづけてAndroid-x86のISOファイルのダウンロードです。Android-x86のISOファイルは http://www.android-x86.org/ のDownloadからダウンロードすることができます。今回は6.0のMarshmallowを試したいので一覧の中から「android-x86-6.0-r3.iso」をダウンロードしました。

##LiveCDからの起動

###Android-x86を起動
以下のコマンドでAndroid-x86を起動します。`-m 1G`は起動時に割り当てるメモリサイズになります。QEMUにはいろんなパラメーターオプションがありますので指定することで速度UPするかもしれません。

```console:Android-x86の起動
$ qemu-system-i386 -m 1G -enable-kvm -net nic -net user -cdrom android-x86-6.0-r3.iso
```

最初のメニューで「Live CD - Run Android-x86 without installation」を選択します。今までの苦労は何だったんだろうと思うほど簡単に起動してくれました。

##インストール
Live CDからの起動では起動するたびに設定画面が表示されますので、何回も試すならHDDにインストールした方が楽です。以下はHDD（イメージディスク）にAndroid-x86をインストールする方法です。

###イメージディスクの作成
インストールするためのイメージディスクを作成します。今回は10Gのディスクを作成しています。

```console:10Gのイメージディスクを作成
$ qemu-img create -f qcow2 android.img 10G
```

実際に作成されたファイルを見てみると196Kのようです。10Gを指定しても作成時に10G確保されるわけではないようですので大きめに指定しても問題はなさそうな感じです。

```console
$ du -hs android.img 
196K	android.img
```

###Android-x86を起動
以下のコマンドでAndroid-x86を起動します。Live CDの時と違うのは`-hda android.img`でイメージディスクファイルを指定しているところです。また`-boot order=d`で明示的にCDROMからの起動を指定しなくてもイメージディスクが空っぽでブートできないためCDROMから起動してくれます。

```console:Android-x86の起動
$ qemu-system-i386 -m 1G -enable-kvm -net nic -net user -hda android.img -cdrom android-x86-6.0-r3.iso
```

###Android-x86をインストール
最初のメニューで「Installation - Install Android-x86 to harddisk」を選びます。以降のインストールの仕方は他のサイトとかで紹介されていますので参考にしながら行ってください。

ただ以下のメッセージの箇所で`< Yes >`を選択するよう紹介されている記事が多いですが、試す程度の話ならデフォルトの`< No >`で良いんじゃないかと思っています。

> Do you want to install /system directory as read-write？
Let /system be read-write make it easier to debug,
but it needs more disk space and longer installation time.
> < Yes > < No >

###HDDから起動
インストールが完了したら次からは以下のコマンドで起動することができます。

```console:HDDから起動
$ qemu-system-i386 -m 1G -enable-kvm -net nic -net user -hda android.img
```

おしまい
numpy > np.exp(1010) : overflow encountered in exp > exp( 709.782712893 超過 )

```txt:動作環境
ideone (Python3)
```

@ゼロから作るDeep Learning
p68
3.5.2 ソフトマックス関数の実装上の注意

ソフトマックス関数の指数計算での注意が記載されている。
掲示されたコード(インタラクティブシェル実行)をscriptに変更してideoneで実行してみた。
(np.exp()を出力する処理も追加した)

http://ideone.com/zzQpag

```py
import numpy as np

a = np.array([1010, 1000, 990])

res = np.exp(a)
print(res)

res = np.exp(a) / np.sum(np.exp(a))
print(res)
```

```txt:run
[ inf  inf  inf]
[ nan  nan  nan]
```

exp()の計算でoverflowのためinfになる。

どのくらいの値でoverflowになるのか？
以下を見つけた。

- [ロジスティック回帰＋確率的勾配降下法](http://d.hatena.ne.jp/n_shuyo/20110710)
    - > 具体的には exp の中身が 700 を超えるあたりから Inf になってしまうので、ちょっと大きめの特徴量があるだけで結構簡単に発生する。
- [[c][数値計算]exp関数の (実装の) 限界を体感Add Star](http://d.hatena.ne.jp/sleepy_yoshi/20110730/p1)
    - > おぉ，やはり709と710の間でオーバーフローしてしまった!

https://msdn.microsoft.com/ja-jp/library/cc410227.aspx
> 引数 number の値が 709.782712893 を超えると、オーバーフロー エラーが発生します。定数 e の値は約 2.718282 です。

709.782712893 という数値は何で決まっているのか?

http://www.openreference.org/articles/view/303
>  なお、値に 709.782712893 以上の数値を指定した場合は、倍精度浮動小数点数型（Double）の範囲を超える為、オーバーフローエラーが発生します。


google検索で「log2(exp(709.782712893))」にて

> 1024


[浮動小数点数型と誤差](http://www.cc.kyoto-su.ac.jp/~yamada/programming/float.html)

指数部は11ビットである。しかしながら、以下のため、[0, 2047]は[-1023, 1024]の範囲になる。

> double型
> ...
> 指数部-1023 が指数の値となる．

指数部が1024を超過するという点でexp ( 709.782712893 超過)がオーバーフローになると理解した。
激安USB-Serial アダプタを使って、Macと Raspberry Pi 3 をシリアル接続する 


#### お買い物
Amazon で [Raspberry Pi ラズベリーパイ用の USB-TTLシリアルコンソールのUSB変換COMケーブルモジュールのケーブル Amazon](https://www.amazon.co.jp/dp/B00K7YYFNM) を購入。安い…。届いたものは値段相応に安っぽい。

#### 物理接続

下記写真参照。Amazon レビューに書かれているとおりの結線でOKでした。

![IMG_7872.JPG](https://qiita-image-store.s3.amazonaws.com/0/68614/02f0156f-afab-6b91-4282-26cf52aae5e9.jpeg)

#### Raspberry Pi3 の設定変更
`/boot/config.txt` に `core_freq=250` を追記するだけ。もちろん `enable_uart=1` も必要。

#### Mac へのドライバ導入
2017年8月に買った時点でも、製造元が[チュートリアル](https://learn.adafruit.com/adafruits-raspberry-pi-lesson-5-using-a-console-cable/software-installation-mac)で言うところの古いチップを使っているらしく、"Prolific Chipset" 向けのドライバを入れたら `/dev/tty.usbserial` として認識してくれた。

#### 接続手順
1. ケーブルを接続する
2. `screen /dev/tty.usbserial 115200` でシリアル通信開始
3. Pi3 の電源投入。5秒くらいで起動メッセージが出てくる

#### 終了手順（けっこう重要）
1. `sudo shutdown -h now` で Pi3 の電源を落とす
2. screen の window を Control-a k で kill する（自分はscreenのキーバインドをカスタマイズしているので Control-t k で落とした）
3. **ケーブルを抜く** （この手順を忘れると、Macのシャットダウンができなくなったり、Pi3 への再接続ができなくなったりする！）

### 参考

- [Raspberry Pi ラズベリーパイ用の USB-TTLシリアルコンソールのUSB変換COMケーブルモジュールのケーブル Amazon](https://www.amazon.co.jp/dp/B00K7YYFNM)
    - [上記デバイスの開発元のページ](https://www.adafruit.com/product/954)
    - [同、わかりやすいチュートリアル](https://learn.adafruit.com/adafruits-raspberry-pi-lesson-5-using-a-console-cable/software-installation-mac)
- [Raspberry Pi 3でシリアル通信で接続してコンソールにログインする方法](http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_3_uart_tips/)
TensorFlow(LSTM)でBitcoinの価格予想 

# Bitcoin(ビットコイン)とは？
ビットコインは仮想通貨の一種です。仮想通貨の定義は様々ですが、日本のビットコイン取引所"bitFlyer"によれば
下記です。

>仮想通貨としてイメージしやすいのは、オンラインゲーム内の通貨です。円やドルを支払って、ゲーム内で使われている通貨を手に入れれば、そのゲーム内で使われている通貨が「使える」ゲーム内のお店で、アイテムを買うことができます。ゲーム内でのみ使える、仮想の通貨です。
出典*1:[ビットコイン（Bitcoin）とは？](https://bitflyer.jp/ja/bitcoindigitalcurrency)

ビットコインは仮想通貨の中でも単価価格が高額であり取引高も多いため、投資家達は競って投資しています。

# TensorFlow(LSTM)とは？
Bitcoinの価格予想は下記記事を下書きとしています。TensorFlowおよびLSTMの詳細については下記記事を参照して下さい。

>出典*2:[TensorFlow(LSTM)で株価予想 〜 株予想その１ 〜](http://qiita.com/tsunaki/items/a5f3f975a31dc45fc9c9#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)

出典*2の記事によるとニューラルネットワークはＮステップ前の情報を参照して連鎖的に次のステップの情報を算出できるとのことです。この原理を使えば、簡単に時系列データの次ステップのデータを予測することができますね。

# 取扱うデータについて
ビットコイン価格の時系列データを過去数ヶ月に渡って提供しているＨＰを探したところ下記のブログにたどり着きました。

>Bitcoinchartsが所有するすべてのデータを一度に取得する方法もあります。以下のURLにアクセスすると、様々な取引所と通貨の取引履歴がリストアップされており、データを選択して保存、ローカルで解凍することで簡単にデータを手に入れることができます。
　　　　　　　　　　　
●[_Bitcoincharts_](http://api.bitcoincharts.com/v1/csv/)
　　　　
出典*3:[Bitcoinchartsでbitcoinの過去の取引履歴を取得し可視化する](http://wolfin.hatenablog.com/entry/2016/09/04/194104)


# 結果
サクッと出典*2のコードにビットコイン価格データを喰わせてみます。
'predict'が予測価格、'actual'が実際の価格です。
![Figure_3.png](https://qiita-image-store.s3.amazonaws.com/0/35087/37176829-6090-9677-7351-998d33e6ac13.png)


まあまあ予測出来てる気がします。
【GAS@SpreadSheet】Google スプレッドシートを開く時に、Active セルを自動的にデータテーブルの底へ移動

時系列の方式でレコードを記録する Google スプレッドシートには、一番新しい記録は通常データテーブルの一番下にあります。レコードを追加する時に、画面を下までスクロールする必要があります。データ量が多いほど、手間がかかります。当該のスプレッドシートを開く時に、Active セルを自動的に下まで移動する機能があれば便利だと思います。

#### Step 1：下記の GAS 関数を作成

```gas
function arrive_insertPoint() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sname = "sheet1";
  var sheet = ss.getSheetByName(sname);
  
  var lastRow = sheet.getLastRow();　//コンテンツを含む最後の行の行番号
  var activeRow = lastRow+1;
  var range = sheet.getRange("A"+activeRow.toString());
  range.activate();
}
```

####Step 2：トリガーを設定

1. スクリプトエディタ＞編集＞すべてのトリガー＞新しいトリガーを追加
2. [実行]に上記の関数名を選択
3. [イベント]に [スプレッドシートから]＞[起動時]を選択し＞保存
Laravel5.4 で TinyMCE を使ってみたメモ

## TinyMCE をインストール

```
yarn add tinymce –dev
```

## Vueコンポーネント作成

- とりあえず basic example のまま
  - https://www.tinymce.com/docs/demo/basic-example/
- SPAはやっていないのでformで使える形にしています

```./resources/assets/js/components/TinyMCE.vue
<template>
    <textarea :id="name" :name="name">{{body}}</textarea>
</template>

<script>
    export default {
        props: ['name', 'body'],
        mounted: function() {
            tinymce.init({
                selector: 'textarea#' + this.name,
                height: 500,
                menubar: false,
                plugins: [
                    'advlist autolink lists link image charmap print preview anchor',
                    'searchreplace visualblocks code fullscreen',
                    'insertdatetime media table contextmenu paste code'
                ],
                toolbar: 'undo redo | insert | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image',
                content_css: [
                    '//fonts.googleapis.com/css?family=Lato:300,300i,400,400i',
                    '//www.tinymce.com/css/codepen.min.css'
                ]
            });
        }
    }
</script>

```

```./resources/assets/js/app.js
...
Vue.component('tinymce', require('./components/TinyMCE.vue'));
...
```

```./resources/views/sample.blade.php
...
<tinymce name="description" body="デフォルト値" />
...
```

## js/cssの参照設定

- 参考
  - https://www.tinymce.com/docs/advanced/usage-with-module-loaders/#commonjsmodules
- js

```./resources/assets/js/bootstrap.js
window.tinymce = require('tinymce/tinymce');
// A theme is also required
require('tinymce/themes/modern/theme');

// Any plugins you want to use has to be imported
require('tinymce/plugins/advlist');
require('tinymce/plugins/autolink');
require('tinymce/plugins/lists');
require('tinymce/plugins/link');
require('tinymce/plugins/image');
require('tinymce/plugins/charmap');
require('tinymce/plugins/print');
require('tinymce/plugins/preview');
require('tinymce/plugins/anchor');
require('tinymce/plugins/searchreplace');
require('tinymce/plugins/visualblocks');
require('tinymce/plugins/code');
require('tinymce/plugins/fullscreen');
require('tinymce/plugins/insertdatetime');
require('tinymce/plugins/media');
require('tinymce/plugins/table');
require('tinymce/plugins/contextmenu');
require('tinymce/plugins/paste');
require('tinymce/plugins/code');
```

- TinyMCE CSS配置

```
cp -r node_modules/tinymce/skins public/js/skins
```

## compile

- 開発中は

```
yarn run watch
```

## 画像アップロード対応

- tinymce.init にオプション追加

```
images_upload_url: 'postAcceptor.php',
```

- postAcceptor.php をサーバに配置
    - https://www.tinymce.com/docs/advanced/php-upload-handler/
- postAcceptor.php を参考にLaravelのコントローラを作成
    - これできたら記事アップデートします
【Python@shelve】shelve にて辞書上の要素の変更について

**shelve** で保存した辞書の要素をそのまま変更すると、当該の要素が更新されない可能性があります。
下記のコード：

```python
with shelve.open("db_name") as db:
	record = db[key]
	record["term"] = new_value
```

しかしながら、引数のオプション **writeback** パラメータを *True* に設定すれば、事象が改善できます。
下記のコード：

```python
with shelve.open('db_name', writeback=True) as db:
	record = db[key]
	record["term"] = new_value
```

尚、Python 3.6.1 ドキュメントにも記載されていますが、
> この機能は永続的な辞書上の可変の要素に対する変更を容易にしますが、多数のエントリがアクセスされた場合、膨大な量のメモリがキャッシュのために消費され、アクセスされた全てのエントリを書き戻す (アクセスされたエントリが可変であるか、あるいは実際に変更されたかを決定する方法は存在しないのです) ために、ファイルを閉じる操作が非常に低速になります。

即ち、使う時に要注意とのことです。

[＜参考＞ 12.3. shelve — Python オブジェクトの永続化](https://docs.python.jp/3/library/shelve.html)
Objective-Cでヒープ上にないオブジェクトについて

Objective-C(2.0)において、オブジェクトは必ずしもヒープ上にないらしいので、少し調べた。

## ブロックオブジェクト

ブロックはヒープ上にあるときとないときがある。
ブロックを作ると、その情報はブロックオブジェクトが保持する。
ブロックオブジェクトのクラスには、

* 何もキャプチャしない ``__NSGlobalBlock__`` (``_NSConcreteGlobalBlock``)
* 情報をスタック上に持つ ``__NSStackBlock__`` (``_NSConcreteStackBlock``)
* 情報をヒープに持つ ``__NSMallocBlock__`` (``_NSConcreteMallocBlock``)

の3種類がある。ブロックオブジェクトもObjective-Cのオブジェクトであり、[Block_private.h](https://llvm.org/svn/llvm-project/compiler-rt/trunk/lib/BlocksRuntime/Block_private.h)にレイアウト ``Block_layout`` の定義がある。

### ``__NSGlobalBlock__``

キャプチャする情報がないブロックは、プログラムの一部としてコンパイルされ、動的なメモリを消費しない。このときブロックオブジェクトはオブジェクトではあるが(メッセージを受け取ることはできる)、実体は一つである。
globalスコープに置いた場合だけでなく、ブロックを関数内で宣言しても、キャプチャする情報がなければこの型になる。

### ``__NSStackBlock__``

キャプチャする情報があるとき、ブロックオブジェクトは ``__NSStackBlock__`` として作られるようである。
その場でブロックを定義して呼び出すだけのときは、ブロックオブジェクトのライフサイクルは関数のスコープで終了し、解放される。
コールバック関数のようなケースでは、ブロックをretainしておく必要がある(普通はブロックを受け取る側が行う。ARC環境下では強参照で保持)。 ``__NSStackBlock__`` クラスのオブジェクトをretainしようとすると、 ``__NSMallocBlock__`` クラスに変換(コピー)されてからretainされるようになっている。

### ``__NSMallocBlock__``

ヒープ上に置かれたブロックオブジェクトである。
retainされることがわかっているなら、呼び出す時に最初から ``__NSMallocBlock__`` で作る手段があってもよいような気がするが、試した限りでは常に ``__NSStackBlock__`` として作られるようである。

## tagged pointer

``id`` に中身も入っている場合がある。このときオブジェクトの実体は ``id`` なので、 ``id`` がスタックにあればオブジェクトはスタック上にあることになる。

## 参考情報

* ブロック
  * [A look inside blocks: Episode 1](http://www.galloway.me.uk/2012/10/a-look-inside-blocks-episode-1/)
  * [A look inside blocks: Episode 2](http://www.galloway.me.uk/2012/10/a-look-inside-blocks-episode-2/)
  * [A look inside blocks: Episode 3 (Block_copy)](http://www.galloway.me.uk/2013/05/a-look-inside-blocks-episode-3-block-copy/)

* tagged pointer
  * [64bit環境におけるObjective-Cのポインタ](http://labs.gree.jp/blog/2015/01/13437/)

* オブジェクト
  * [Objective-Cのivarについて](http://qiita.com/hotpepsi/items/0c74582fe77320ad63b3)
Raspbian の起動時の仕掛け

# はじめに

Raspbian の最近のバージョンにはいくつか起動スクリプトで細工がしてあって、特にWindowsしかない環境でも色々融通が利くようになっています。この記事ではそのうちの私が知ってる範囲を、どうやって実現してるかまで含めて記事にします。

「最近の」というのは大体2016年あたりの変更に入っているのですが、いつのバージョンで入ったかまでは調べていられないので、今回の記事では2017-08-16（stretch の最初のバージョン）を元に確認しています。

# 仕掛け① SDカード容量にあわせてパーティション拡大

配布されているイメージファイルはできるだけ小さく済ませるようにパーティションを小さめに取ってあります。初回に起動したとき、そのSD/Micro SDカードの容量いっぱいになるように拡大するようになっています。

## 実現方法

配布イメージの/boot/cmdline.txtを開くと、`init=/usr/lib/raspi-config/init_resize.sh` というオプションが付いています。これにより、カーネル起動後に実行する init プロセスとしてリサイズ用のシェルスクリプトを実行するようになっているわけです。

パスに `raspi-config` とついてることから分かるかもしれませんが、`sudo raspi-config` の中にあった `Expand FileSystem` （だっけ？）を自動で呼ぶようにしたみたいですね。

# 仕掛け② sshdの自動起動

セキュリティ上の理由で、sshd の自動起動がオフにされました。これを元のように起動時に sshd が自動起動するようにするには boot パーティションの中に `ssh` という名前のファイルを作ればよい、ということは結構知られていると思います。ここではその実現方法も見てみましょう。

## 実現方法

端的に言うと、systemd 設定の中に書いてあって実現されています。`/lib/systemd/system/sshswitch.service` というファイルに以下のように書かれています。

```
[Unit]
Description=Turn on SSH if /boot/ssh is present
ConditionPathExistsGlob=/boot/ssh{,.txt}
After=regenerate_ssh_host_keys.service

[Service]
Type=oneshot
ExecStart=/bin/sh -c "update-rc.d ssh enable && invoke-rc.d ssh start && rm -f /boot/ssh ; rm -f /boot/ssh.txt"

[Install]
WantedBy=multi-user.target
```

`ConditionPathExistsGlob` で条件設定しているのですね。ファイルを見て知ったのですが、`ssh` というファイルだけでなく、`ssh.txt` というファイルでも大丈夫のようです。条件を満たすと実行されて、sshd の自動起動設定をした後、対象のファイルを削除しておくようです。時々、フォルダで作っても良いという説明を見たりもしますが、それだと`rm -f /boot/ssh` で消えなくて微妙かもしれませんね。まあ、起動時に毎回呼び出されたところで別に困らないかもしれませんが。

# 仕掛け③ 無線LAN設定

どこで見つけたのかも忘れたくらいにあまり分かりやすいところに書いてないのですが、無線LANの設定ファイルである、`wpa_supplicant.conf` も boot パーティションにおいておくと、起動時に本来の場所に移してくれるので、いきなり無線LANを使うことが可能です。

## 実現方法

これも同じく Systemd で設定されています。/lib/systemd/system/raspberrypi-net-mods.service` ですね。

```
[Unit]
Description=Copy user wpa_supplicant.conf
ConditionPathExists=/boot/wpa_supplicant.conf
Before=dhcpcd.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/mv /boot/wpa_supplicant.conf /etc/wpa_supplicant/wpa_supplicant.conf
ExecStartPost=/bin/chmod 600 /etc/wpa_supplicant/wpa_supplicant.conf

[Install]
WantedBy=multi-user.target
```

単純に mv して chmod してくれるようになっています。

# おわりに

②も③も systemd ということで、 同じような仕掛けがほかに入ってないかと思ったのですが、/bootを見るようなファイルはほかにありませんでした。①については仕掛けを知っていれば、あえて`init=/sbin/init`に戻して拡大しないようにして、小さいままで初期設定をしてバックアップを取る、などの工夫ができますね。バックアップを取るときにリサイズスクリプトに戻しておけば、容量の違うSDカードになっても大丈夫だし、そもそもイメージファイルが小さくて済む、などのメリットがあります。
ちょっとずつ読むドメイン駆動設計 第一部 ドメインモデルを機能させる 序章1

# モデルとは何か? 
> - モデルとは簡素化である。(第一部序章 より)
> - モデルとは、選び抜かれてシンプルにされ、意図的に組み立てられた知識の表現形式である。(同上)
> - モデルとは、蒸留された知識である(同上)
> - モデルとは、プロジェクトに携わる人々の頭のなかで構築された概念の集まりであり、ドメインについての洞察を反映した、用語と概念間の関係性からできている。(第一部第二章 コミュニケーションと言語の使い方 より)
> - モデルとは、知識が蒸留されたものである。(第四部 第１５章　蒸留 より)


本書では繰り返し、モデルの定義を説明しています。

表現はそれぞれ異なるものの、ニュアンスは伝わるでしょうか？

さらに第一部序章の最初の方でさらに説明されています。
> つまり、当面の問題を解決する上で関連する側面を抽象化し、それ以外の詳細を無視することによって行われた、現実における１つの解釈なのだ。

難しいですね。これをドメイン、ドメインモデルと組み合わせて考えると、現実のソフトウェア開発と関連づいてもう少しわかりやすくなると思います。が、それはまた後日。

序章最初の昔の中国の地図の例がわかりやすいですね。
忠実に現実の地図を写実的に表現するのではなく、中央に大きく中国を描き、周りに小さく他の国々を描く。「国内に意識を向ける」という問題を解決するために、抽象化され、それ以外の詳細を無視する。
この地図は、現実における１つの解釈と言えると思います。

これ逆に言えば、『ある問題を解決』するためには、ものごと(ソフトウェア開発では、ドメインの知識)を抽象化し、シンプルに整理することが有効であるということではないでしょうか。

ソフトウェアの複雑な問題にどう立ち向かっていくか。まずはここにヒントがありそうです。

モデルを使ってソフトウェアの複雑さに立ち向かう。
rails generate annotate:install でエラーが出た


# はじめに

Rails の gem [`annotate`](https://github.com/ctran/annotate_models) は，モデルなどのファイルに，対応するテーブルの構造をコメントの形式で書き込んでくれるもの。`config/routes.rb` にもルーティングの情報を書いてくれる。

annotate の紹介はもう何年も前からいくつも記事があるので，省略。

今回，初めて使ってみたところ，エラーが出たので報告する。調べた限りでは，Qiita の過去記事に見当たらなかった。

# エラーが出るまで

最新版の [README](https://github.com/ctran/annotate_models/blob/develop/README.rdoc) では，Gemfile に

```rb
gem 'annotate', require: false
```

と書くことになっている。
つまり，`require` はしない，と。


次に，`bundle install` する。

次に，アノテーションの設定ファイルを生成させたいので，

```
rails generate annotate:install
```

とした。ところが，以下のようなエラーが出た。

```
[パス途中省略]/annotate-2.7.2/lib/generators/annotate/templates/auto_annotate_models.rake:37:in `template': uninitialized constant AnnotateModels (NameError)
```

# 原因と対策

`AnnotateModels` はこのライブラリーの中核的なモジュールぽい。

こいつが `uninitialized constant` ってことはつまり，だ。

ライブラリーが `require` されていないんである。（そりゃそうだ）

そこで，Gemfile の記述を

```rb
gem 'annotate'
```

に変えたら解決した。

要するに，`annotate` コマンドを使うだけなら `require` しなくてよいが，`generate annotate:install` させるんなら `require` が必要，ということらしい。

# おまけ

```rb
gem 'annotate'
```

は

```rb
group :development do

end
```

の中に入れておけばよいようだ。
CSSでボーダーのグラデーションを実現

見出しの装飾として要素の左側だけ太めのボーダーをつけて、かつグラデーションをかけたかったのですが、border属性には直接グラデーションをかけられなかったので調べました。

結論としては、
以下のHTMLで言うと、```h1```要素の背景にグラデーションをかけ、```span```要素の背景は白に設定。
その状態で```h1```要素の左側にpadding(5pxくらい)を設定すれば、paddingの分だけ```h1```の背景が見えることになる。
見えている部分が```h1```要素になるので背景にはグラデーションがかかっていることになる。
これがボーダーのように見える。

```html
<h1 class="heading">
    <span>見出し①</span>
</h1>
```

詳細は以下のページ参照。

<参考>
https://withstyle-web.com/archives/1101
ubuntuでポートを使用してるプロセスを１コマンドでkillする(他OSでできたら教えてください)

#1コマンドでkill
とりあえず、適当に3000番を使用するサーバーを立てる
※2個のbashを建てている場合``&``はいりません

```
nc -kvl 3000 & #3000番ポートをlistenモードで受け取る
```

###１コマンドで消す時は

```
$ fuser -kvn tcp 3000
                     USER        PID ACCESS COMMAND
3000/tcp:            user       6639 F....  nc
Kill process 6639 ? (y/N)
```

###消していいプロセスか確認したい時は
確認が欲しい時は、オプションを変更
yでプロセスを停止

```
$ fuser -ikvn tcp 3000
                     USER        PID ACCESS COMMAND
3000/tcp:            user       6639 F....  nc
Kill process 6639 ? (y/N)
```

###それでも消えない時は
それでも消えない時は、今まで通り。
3000番ポートを使用しているプロセスのPIDを取得してkill

```
$ lsof -i:3000
COMMAND PID  USER    FD  TYPE  DEVICE     SIZE/OFF NODE NAME
nc      6639 user    3u  IPv4  42013      0t0      TCP *:3000 (LISTEN)
$ kill 6639
```

###他のOS
MacOSだとオプションが悪いのか使えませんでした。
Ubuntu16.04のみ確認してます。
[Perl]どうせ新しいモジュール書くならMoose使いましょ？

#要旨
CGIの全盛時代に培ったPerlの技術を、安全かつモダンに使える方法を私なりの方法で提供したいので、自作のモジュールの紹介とその作成方法について共有します。

##こんなモジュールを作りました
[Text::Password::AutoMigration - generate and verify Password with any contexts](https://github.com/worthmine/Text-Password-AutoMigration)

##日本語で要約すると
Text::Password::AutoMigrationは怠惰な管理者のためのモジュールです。
パスワードのハッシュを新規作成する分にはSHA-512[^1]を用いる一方、
認証においては`CORE::crypt`,`MD5`,`SHA-1 by hex`,`SHA-256`及び `SHA-512`を自動的に識別します。
したがって、

- このモジュールを使い
- DBに保存している認証用ハッシュを定期的に置き換えるだけ

で、暗号化強度の低いハッシュから強固なハッシュへの移行が可能になる[^2]というものです。

#作り方ダイジェスト
核となるモジュールは低級です。いやむしろ低級であるべき[^3]です。
[以前、こちらで記事にした](http://qiita.com/worthmine/items/519fb4fd1d7f5117a255)際にも全く誰にも見向きもされなかった[^4]モジュールが原本です。（正確には、`CORE::crypt`から`MD5`への、今思えば[執筆時点でさえほぼ無意味](https://ja.wikipedia.org/wiki/MD5#.E5.AE.89.E5.85.A8.E6.80.A7)の駄作でした。）

これをあえて[CORE::crypt用](https://github.com/worthmine/Text-Password-AutoMigration/blob/master/lib/Text/Password/CoreCrypt.pm)と[MD5用](https://github.com/worthmine/Text-Password-AutoMigration/blob/master/lib/Text/Password/MD5.pm)に分離し、Mooseによる継承をして差分を書くということを徹底します。
そして、それらを継承する形で、本来目指す[SHA内での移行を行うモジュール](https://github.com/worthmine/Text-Password-AutoMigration/blob/master/lib/Text/Password/SHA.pm)を書きます。
最後に、[全てを包括し、自動的に認証を行うモジュール](https://github.com/worthmine/Text-Password-AutoMigration/blob/master/lib/Text/Password/AutoMigration.pm)に仕上げます。

#メリットの話

- まず何より継承とその管理が楽チン
対`@ISA`で考えてみよう。Perl5の暗黒面に再び触れる度胸があるのかい？

- 機能別に`package`を切り分けた方が保守が楽
テクニカルな話になりますけど、どこかを直そうと思った時に、ファイル名で検索できるのすごい大事。

- [テスト](https://github.com/worthmine/Text-Password-AutoMigration/tree/master/t)を書く時に機能別に分割されてた方が楽
これ実際にやってみると全然違います。

- 上記の前提だとエンバグしにくい（バグの発見が容易い）
機能とテストが正しく分別されていれば、当然そうなりますね。

- [coercion](http://perldoc.jp/docs/modules/Moose/Manual/Types.pod#pod22411-22793-25563)が強力
ま、今回これには使ってないけどな

- 強制的にオブジェクト指向化
もともとこのモジュールは
>継続してblessすべき適当なデータが見つからない

という理由でコンストラクタを持っていませんでした。でもパッケージ変数とかに変に値持たせる（エンバグ要因）より、初めから継承される前提で`has`しちゃった方が健全だという結論にたどり着きました。

#デメリットの話とか

- 遅いとか言われてるけど、それ本番に関係あるの？
PSGIなりMojoなり使う時って`plackup`や`morbo`でコンパイルしますよね？

- ちょうど良いドキュメントがない
Mooseやって見ました程度の[記事は見つかる](https://www.google.co.jp/search?q=moose+perl++%E5%85%A5%E9%96%80)けど、なんかこうそのちょっと先の記事はないかもわかんないです、ってかそれがこの記事書いた動機です。

---

[^1]: [SHA-2のうちの一つ](https://ja.wikipedia.org/wiki/SHA-2)
[^2]: 認証完了直後ハッシュが古ければ置き換える、というロジックを実装するコストは別途かかるでしょうけど
[^3]: 可読性及び保守の観点から
[^4]: この記事を執筆した時点で0いいね0ストック4764view
pip install が "OSError: [Errno 28] No space left on device" を起こした

形態素解析器 [janome](https://github.com/mocobeta/janome)がついに[NElogd辞書に対応](https://medium.com/@mocobeta/neologd-%E8%BE%9E%E6%9B%B8%E5%86%85%E5%8C%85%E3%81%AE-janome-%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-%E4%B8%8D%E5%AE%9A%E6%9C%9F%E6%9B%B4%E6%96%B0-71611ab66415)と聞いて、試してみたところ、`pip install` で軽くはまりました。

OSは Lubuntu14.04 で、Anacondaのpython3.5を使っています。


[こちら（google drive）](https://drive.google.com/drive/folders/0BynvpNc_r0kSd2NOLU01TG5MWnc?usp=sharing) からファイルを落とし、READMEにあるように

```bash
$ pip install Janome-0.3.5.neologd20170814.tar.gz --no-compile
```
としたところ、下記のエラーが出てしまいました。

```bash
OSError: [Errno 28] No space left on device
```

調べてみると、このエラーはさまざまな理由で起こりえるようです。ディスクの容量の問題のこともあれば、ファイルの個数のせいであることもあるらしい。今回の場合は容量のせいだったようです。

```bash
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
... （略）
/dev/zram1      1.5G  1.4G  4.0K 100% /tmp
... （略）
```

というように、tmpディレクトリがいっぱいになっています。今回のjanomeは大きな辞書ファイルを扱うので制限を越えてしまったものと想像しています。

対処法としては、一時的にtmpディレクトリを指定してからインストールするのが簡単なようです。

```bash
$ mkdir $HOME/tmp
$ export TMPDIR=$HOME/tmp
$ pip install Janome-0.3.5.neologd20170814.tar.gz --no-compile
```

`export TMPDIR=$HOME/tmp` コマンドによって、tmpディレクトリを指定しています。この指定は、一時的なものなので、セッションを閉じると破棄されます。


このあと、

```python
>>> from janome.tokenizer import Tokenizer
>>> t = Tokenizer(mmap=True)
>>> for x in t.tokenize("メロンパンを食べる安倍総理"): print(x)
#メロンパン	名詞,固有名詞,一般,*,*,*,メロンパン,メロンパン,メロンパン
#を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
#食べる	動詞,自立,*,*,一段,基本形,食べる,タベル,タベル
#安倍総理	名詞,固有名詞,一般,*,*,*,安倍総理,アベソウリ,アベソーリ
```

※ 普通のjanomeの場合、「メロンパン」は「メロン」+「パン」に、「安倍総理」は「安倍」+「総理」に分割されます。
【Swift4】（国際化対応） Int型の数値を各国のフォーマットで文字列に変換する


[VASILYさんのブログ](https://vasily.jp)に素敵な記事が掲載されていましたので、少し自己流にアレンジした実装を紹介したいと思います。
参考にさせていただいたのは、
[モダンなSwiftのExtensionについて - Targeted Extensions](http://tech.vasily.jp/entry/swift_modern_extensions)
と
[新しいアプリを作るときによく使うSwift Extension集](http://tech.vasily.jp/entry/swift_extensions)
です。ありがとうございます。
自分の経験値では結構難解な実装でした^^;

この二つのブログを読んでいて、こんな実装もありかな、と考えました。

こんな感じで使用します。

```Swift
        let value: Int = 1_000_000
        
        print("ja.currency = "+value.ja.currency) // ja.currency = ¥1,000,000
        print("en.currency = "+value.en.currency) // en.currency = $1,000,000.00
        print("ja.decimal = "+value.ja.decimal) // ja.decimal = 1,000,000
        print("en.decimal = "+value.en.decimal) // en.decimal = 1,000,000
```
この手法を用いることでRxSwiftなどで採用された記述方法（.rx.xxxx)を取り入れることができます。
このメリットはブログにもしっかり書いてありますので気になる方はリンクを辿ってください。

あえてOSの設定に反して貨幣単位などを切り替えることは少ないかもしれませんが、このような書き方もできるということで・・・

ちなみにOS設定の貨幣単位を使う場合は

```Swift
        let value: Int = 1_000_000
        print("current.currency = "+value.cur.currency)
```
となります。

実装ですが、
前述のブログにある手法をほぼそのまま用いてます。

下記のプロトコル定義でcur、ja、enなどが定義されていきます。

```Swift
// プロトコル
protocol LanguageProtocol
{
    associatedtype LanguageType
    
    var ja: LanguageType { get }
    var en: LanguageType { get }
}

// プロトコル・エクステンション
extension LanguageProtocol
{
    var cur: Language<Self>
    {
        // static let identifier = (Locale.current as NSLocale).object(forKey: .identifier) as? String
        return Language(self, CommonUtil.identifier!)
    }

    var ja: Language<Self>
    {
        return Language(self, "ja_JP")
    }

    var en: Language<Self>
    {
        return Language(self, "en_US")
    }
}

// 言語別のクラス
final class Language<Base>
{
    let base: Base
    let identifier: String
    init(_ base: Base, _ identifier: String)
    {
        self.base = base
        self.identifier = identifier
    }
}
```

CommonUtil.identifierはコメントにあるように

```Swift
static let identifier = (Locale.current as NSLocale).object(forKey: .identifier) as? String
```
を実装しておきます。


詳細はここでは書きませんが、Base型に対してLanguage型のcur、ja、enの変数をもたせています。Base型をInt型にすると、Int型にcur、ja、enを持たせることができます。

Int型に上記のプロトコルを適用します。

```Swift
extension Int: LanguageProtocol { }
```

関数を実装します。

```Swift
private let formatter: NumberFormatter = NumberFormatter()

extension Int
{
    func formattedString(style: NumberFormatter.Style, localeIdentifier: String) -> String
    {
        formatter.numberStyle = style
        formatter.locale = Locale(identifier: localeIdentifier)
        return formatter.string(from: self as NSNumber) ?? ""
    }
}

// 関数の実装
extension Language where Base == Int
{
    // 通貨表示
    var currency: String
    {
        return self.base.formattedString(style: .currency, localeIdentifier: identifier)
    }

    // カンマ区切り表示
    var decimal: String
    {
        return self.base.formattedString(style: .decimal, localeIdentifier: identifier)
    }
}
```

ほぼパクりです^_^;