OmniAICreator/Qiita-1.07M huggingface dataset:
法人番号のチェックディジットに関する財務省令が誤っている件

# 法人番号とは
日本の「法人番号」は俗にマインナンバーの企業版とも言われる13桁の番号で，既存の「会社法人等番号」12桁に対して左側にチェックディジット（検査用数字）をつけたものである．マインナンバー法で導入された．

「[平成二十六年財務省令第七十号 法人番号の指定等に関する省令](
https://elaws.e-gov.go.jp/document?lawid=426M60000040070)  (E-Gov)」でチェックディジット定義されているが，会社法人等番号から法人番号を算出しようとして失敗し，この定義に誤りがあることを見つけた．2018年に確認したが2022年3月現在の今に至るまで修正されていない．

# 誤 （現行）
（検査用数字を算出する算式）
第二条　令第三十五条第一項に規定する財務省令で定める算式は、次に掲げる算式とする。
算式

```math
9 - \left( \sum_{n=1}^{12} P_n \times Q_n を9で除した余り \right)
```
算式の符号
Ｐｎ　令第三十五条第一項に規定する基礎番号の最下位の桁を１桁目としたときのｎ桁目の数字
Ｑｎ　ｎが奇数のとき　１、ｎが偶数のとき　２

# 正
（検査用数字を算出する算式）
第二条　令第三十五条第一項に規定する財務省令で定める算式は、次に掲げる算式とする。
算式

```math
9 - \left( \left( \sum_{n=1}^{12} P_n \times Q_n \right) を9で除した余り \right)
```
算式の符号
Ｐｎ　令第三十五条第一項に規定する基礎番号の最下位の桁を１桁目としたときのｎ桁目の数字
Ｑｎ　ｎが奇数のとき　１、ｎが偶数のとき　２

# 解説
正誤の違いは算式の中の括弧がどうかかるか．
現行の財務省令の算式ではシグマの中身に

```math
P_n \times Q_n を9で除した余り
```

が入っているとしか読めない．とりわけシグマの前後につけられた括弧は強くそのような解釈を誘導する．しかしこれによって計算するとチェックディジットが一桁におさまらず，[上位の政令](http://elaws.e-gov.go.jp/search/elawsSearch/elaws_search/lsg0500/detail?lawId=426CO0000000155)で定義されている「一桁」という情報と矛盾する．
実際には，国税庁の説明資料 [チェックデジットの計算](http://www.houjin-bangou.nta.go.jp/documents/checkdigit.pdf) (PDF) などの補足資料からすると，シグマの中身はPn × Qn であって，それをシグマした後に「9で除した余り」を算出するという定義をしたかったのだと考えられる．

# 関係法令
- 法律（国会）[行政手続における特定の個人を識別するための番号の利用等に関する法律](
https://elaws.e-gov.go.jp/document?lawid=425AC0000000027) （マイナンバー法）
- 政令（内閣）[行政手続における特定の個人を識別するための番号の利用等に関する法律施行令](
https://elaws.e-gov.go.jp/document?lawid=426CO0000000155)
- 省令（財務省）[法人番号の指定等に関する省令](
https://elaws.e-gov.go.jp/document?lawid=426M60000040070)
Objective-CでUITestを利用してスクリーンショットを撮る方法


## 概要
SwiftでUITestを利用してスクリーンショットを撮るサンプルは見つけられたが、Objective-Cの例が見つからなかったので、自分用に残しておく。  

## コードを書かずに自動でスクリーンショットを撮る方法
Objective-C関係なく、Xcodeの設定のみで可能。

![Xcode-Scheme-Test-Setting.png](https://qiita-image-store.s3.amazonaws.com/0/81221/5fe04114-f289-2d98-1c69-6e15e38c9158.png "Xcode-Scheme-Test-Setting.png")

スキーマのTestの設定を開いて、チェックボックスを下記のようにする。

* UI TestingのCapture screenshots automaticallyにチェックを入れる
	* 遷移した画面すべてを撮影してくれるようになる
* UI TestingのDelete when eath test succeedsのチェックを外す
	* テスト成功時にスクリーンショットを削除しないようになる
* AttachmentsのDelete when eath test succeedsのチェックを外す
	* テスト成功時にスクリーンショットを削除しないようになる

注意点としてものすごい量のスクリーンショットが作成されるので、必要のないもので必要なものが埋もれる可能性大。
管理が面倒臭い人は、任意の箇所で撮影する方法がいいかもしれない。

## 任意の箇所でスクリーンショットを撮る方法
2つの方法をあげているが、テスト完了後にレポートを見た際の見やすさが変わるだけなので、スクリーンショットを撮るコード自体は同じ。
用途に応じて選択すると吉。  

### シンプルにスクリーンショットを撮る方法

```objc:サンプル
- (void)testTakeScreenShot {
    XCUIApplication *app = [[XCUIApplication alloc] init];
    [app.buttons[@"ボタン"] tap];
    XCUIScreen *screen = [XCUIScreen mainScreen];
    // スクリーンショットを撮影
    XCUIScreenshot *screenShot = [screen screenshot];
    // アタッチメントを生成
    XCTAttachment *attachment = [XCTAttachment attachmentWithScreenshot:screenShot];
    // テスト実行後に削除しない
    attachment.lifetime = XCTAttachmentLifetimeKeepAlways;
    // スクリーンショットのファイル名のprefixに付加されるので設定しておくと楽
    attachment.name = @"tapped-button";
    [self addAttachment:attachment];
}
```

### アクテビティを使ってログをグループ化する方法

```objc:サンプル
- (void)testTakeScreenShot {
    XCUIApplication *app = [[XCUIApplication alloc] init];
    [app.buttons[@"ボタン"] tap];
    [XCTContext runActivityNamed:@"ボタンをタップ" block:^(id<XCTActivity>  _Nonnull activity) {
        XCUIScreen *screen = [XCUIScreen mainScreen];
        XCUIScreenshot *screenShot = [screen screenshot];
        XCTAttachment *attachment = [XCTAttachment attachmentWithScreenshot:screenShot];
        attachment.lifetime = XCTAttachmentLifetimeKeepAlways;
        attachment.name = @"tapped-button";
        [activity addAttachment:attachment];
    }];
}
```

## 撮影後のスクリーンショットの保存場所
下記ディレクトリ内に保存される。

```
/Users/(UserName)/Library/Developer/Xcode/DerivedData/(Project)/Logs/Test/Attachments/
```

## （2018/03/16 追記）スクリーンショットのファイル名をXcodeから指定したものにリネームする方法
保存されたスクリーンショットのファイル名は `screen-shot-sample_1_7E21D0FF-5AAB-4318-81DA-034BABF95B01.png` という感じになっている。
このファイル名を `screen-shot-sample.png` にリネームするコマンドがこちら。

```bash:コマンド
# スクリーンショットを格納したディレクトリの一つ上の階層で実行するコマンド
# イメージとしては、端末ごとに仕分けされたディレクトリ群を一気にリネームするときに使うもの
$ find ./ -type d | find ./ -type f | sed -E 'p;s/(.+)_[0-9]_.+\.png/\1.png/g' | xargs -n2 mv

# スクリーンショットを格納したディレクトリで実行するコマンド
$ find ./ -type f | sed -E 'p;s/(.+)_[0-9]_.+\.png/\1.png/g' | xargs -n2 mv
```

十数年ぶりにsedを使った…。

## 参考
[Xcode 9からテストが大幅に進化します！ - Timers Tech Blog](http://techblog.timers-inc.com/entry/2017/06/09/084541)
[Hands-on XCUITest Features with Xcode 9](http://shashikantjagtap.net/hands-xcuitest-features-xcode-9/)
[iOS 11 Programming](https://peaks.cc/iOS11)
仮想通貨とブロックチェーン

今更ながら勉強してみました。
まったくの前提知識がなかったので、技術書ではなくビジネス視点からの内容を多く含む書籍です。

[仮想通貨とブロックチェーン](https://www.amazon.co.jp/%E4%BB%AE%E6%83%B3%E9%80%9A%E8%B2%A8%E3%81%A8%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3-%E6%97%A5%E7%B5%8C%E6%96%87%E5%BA%AB-%E6%9C%A8%E3%83%8E%E5%86%85-%E6%95%8F%E4%B9%85/dp/453211375X)
著者　木ノ内　敏久
出版　日経文庫

## 電子マネーとビットコインの違い
### ビットコイン

インターネット上の対応なコンピュータ同士でデータを送受信する。→分散型

### 電子マネー
発行会社（銀行等）の中央サーバが残高を管理→中央集権型

## ビットコインの特徴
- 国家や中央銀行は発行しない
- 電子マネーとは異なり、預金・現金の裏付けがない
- 供給量に限りがある
- 世界３０以上の通過と交換可能
- 匿名で取引可能
- 秘密鍵を紛失すると永久に使えない
- 2140年で発行停止
- 総額は2100万BTC
- マイニングの報酬は４年ごとに半額になる
- マイニングの難易度は４年ごとに上がる

## ビットコインと持つとはどういうことか
特定のアドレスに紐づいたビットコインを誰かに送ることができる状態である

## ブロックチェーン
１０分ごとの取引（トランザクション）をまとめたものを**ブロック**という。
n個目のブロックは、n-1個目のブロックのハッシュ値を元に生成される。
このブロックが連なっているため、**ブロックチェーン**と呼ばれる。


## ブロックチェーンをビットコイン以外に使用する
金銭以外の取引、資産管理にブロックチェーンを利用できる
例）不動産、知財、デジタルコンテンツ、契約、所有権...
ここに注目されているのが**Ethereum**


以上。
続編は[ブロックチェーン技術入門](https://www.amazon.co.jp/%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80-%E5%B2%B8%E4%B8%8A-%E9%A0%86%E4%B8%80/dp/4627871716/ref=sr_1_2?s=books&ie=UTF8&qid=1516245141&sr=1-2&keywords=%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E6%8A%80%E8%A1%93%E5%85%A5%E9%96%80)にて勉強中。
Codepenが埋めこめると聞いたので例の統計力学の問題を貼り付けてみる

# 例の統計力学の問題

- http://www.scc.kyushu-u.ac.jp/BioChemPhys/ko-gi/statminbcv08.pdf


# やってみた結果

<p data-height="265" data-theme-id="dark" data-slug-hash="QaZMLb" data-default-tab="html,result" data-user="kjunichi" data-embed-version="2" data-pen-title="QaZMLb" class="codepen">See the Pen <a href="https://codepen.io/kjunichi/pen/QaZMLb/">QaZMLb</a> by Junichi Kajiwara (<a href="https://codepen.io/kjunichi">@kjunichi</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

# 学べたこと

久しぶりに[Epoch](http://epochjs.github.io/epoch/)使ったら、相変わらずJQuery使うし、最新版の
JQueryだと駄目で、3系のモノが必要だった。D3.jsは最新版で行けた。

# 関連投稿

- [Epochでリアルタイムなグラフを描画してみた](https://qiita.com/kjunichi/items/a5d047852d8c489ded09)
 
# 関連記事

- [BlenderでPython使って最速降下曲線を描いてみる](http://abrakatabura.hatenablog.com/entry/2016/05/26/070858)
- [1/7がつくる楕円をJulia言語でプロットする](http://abrakatabura.hatenablog.com/entry/2016/10/29/075535)
【フォーム改善】スマホのブラウザ表示時にキーボード「改行」を「検索」にする：メモ

# 問い合わせフォームなどでスマホのキーボード「改行」を「検索」にしたいとき
HTML5により<input type="">のバリエーションが増えた
※以下に一部抜粋

|Type|効果|
|:-----------------:|:------------------:|
|tel|電話番号用|
|email|メール用|
|search|検索用|

iOSではsearchを指定しても「改行」が「検索」にならないことがある(バージョン未確認)
formタグで囲い、actionを指定することでiOSでも「改行」が「検索」になる
※ここで"iOS"としているのは、iOS11でsafari、chromeを使用した場合に事象の確認ができたから
※formをつけなくてもandroid(chrome)での動作の確認ができた

以下、参照記事。(上記は参考の説明にメモをつけただけ)
https://qiita.com/usagi-f/items/99c58670ab125dd32cc3
Gitディレクトリ外からgitコマンドを実行する

スクリプトなどでgitコマンドを実行する際、わざわざリポジトリルートにcdするのが野暮ったいので辞めたい。

## 方法
### 1. コマンドラインオプションを利用する
```
Git 1.8.5以降ならこっち
$ git -C /path/to/repo [command]

Git 1.8.5未満ならこっち
$ git --git-dir=/path/to/repo/.git --work-tree=/path/to/repo [command]
```

Git 1.8.5以降であれば-Cオプション一発、1.8.5未満ならgit-dir, work-treeのオプション指定でいけるらしい
参考：[work tree の外から git pull する](http://this.aereal.org/entry/2014/05/19/192043)

### 2. 環境変数を利用する
```
$ GIT_DIR=/path/to/repo/.git GIT_WORK_TREE=/path/to/repo git [command]
```
参考：[Gitの内側 - 環境変数](https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0)
> GIT_DIR は .git フォルダの場所です。 指定されていない場合、Gitはディレクトリツリーを ~ または / にたどり着くまで上っていき、各ディレクトリで .git ディレクトリを探します。

> GIT_WORK_TREE は、ベアリポジトリ以外のリポジトリで、ワーキングディレクトリのルートとなる場所です。 指定されていない場合、 $GIT_DIR の親ディレクトリが代わりに使用されます。

## どっちがいいの？
正直どっちでもいいと思う。
単純にコマンド1発叩くだけならオプションの方がスマートに感じる。
複数のスクリプトを組み合わせる場合や、スクリプト外部からGitディレクトリを制御する場合は環境変数が良いのだろうなー。
arduinoでlcdkeypad

#概要
オークションで買った、lcdkeypadを使ってみた。
嵌りポイントは、ポテンショメータを回さないと表示がでない。

#写真
![CIMG2524.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/42fb0a68-1a40-dc0e-3867-d6571a238e74.jpeg)

#ピン配置


| uno      |    shield    |
|:-----------------|:-----------|
| A0          |  button        |
| D10 | backlight|
| D9 |  enble|
|D8|RS|
|D7|DB7|
|D6|DB6|
|D5|DB5|
|D4|DB4|


#サンプルコード

```
#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup()
{
 	lcd.begin(16, 2);
 	lcd.setCursor(0, 0);
 	lcd.print("Hello World!");
}
void loop()
{
}

```

```
#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
#define btRIGHT			0
#define btUP		 	1
#define btDOWN	 		2
#define btLEFT	 		3
#define btSELECT 		4
#define btNONE	 		5
#define err				6

int read(int adc_key_in)
{
 	if (adc_key_in > 1000) return btNONE;
 	if (adc_key_in < 50) return btRIGHT;
 	if (adc_key_in < 250) return btUP;
 	if (adc_key_in < 450) return btDOWN;
 	if (adc_key_in < 650) return btLEFT;
 	if (adc_key_in < 850) return btSELECT;
 	return err;
}
void volt(int adc_key_in)
{
 	lcd.setCursor(11, 1);
 	lcd.print((float) adc_key_in * 5 / 1024);
}
void state(int lcd_key)
{
	lcd.setCursor(0, 1);
	switch (lcd_key)
 	{
	case btRIGHT:
	{
		lcd.print("RIGHT ");
		break;
	}
	case btLEFT:
	{
		lcd.print("LEFT  ");
		break;
	}
	case btUP:
	{
		lcd.print("UP    ");
		break;
	}
	case btDOWN:
	{
		lcd.print("DOWN  ");
		break;
	}
	case btSELECT:
	{
		lcd.print("SELECT");
		break;
	}
	case btNONE:
	{
		lcd.print("      ");
		break;
	}
	case err:
	{
		lcd.print("ERROR ");
		break;
	}
 	}
}
void setup()
{
 	lcd.begin(16, 2);
 	lcd.setCursor(0, 0);
 	lcd.print("Push the buttons");
 	lcd.setCursor(8, 1);
 	lcd.print("A0     V");
}
void loop()
{
 	int lcd_key = 0;
 	lcd_key = read(analogRead(0));
 	state(lcd_key);
 	volt(analogRead(0));
}



```

以上。
JavaScriptで画像処理 - モザイク処理

#イメージ
左がモザイク前、右がモザイク後です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163605/546656a7-240b-1133-b42d-7f8dd49154a7.png)

#サンプル
画像ファイル選択後に、mosaicボタンを押してください。
<p data-height="600" data-theme-id="0" data-slug-hash="eyPeeJ" data-default-tab="js,result" data-user="olj611" data-embed-version="2" data-pen-title="mosaic" class="codepen">See the Pen <a href="https://codepen.io/olj611/pen/eyPeeJ/">mosaic</a> by Shinichiro Maki (<a href="https://codepen.io/olj611">@olj611</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
#モザイク処理のロジック
![mosaic.png](https://qiita-image-store.s3.amazonaws.com/0/163605/c8284f33-d06e-af74-e40a-7c9aa2676edd.png)
上図は幅9、高さ5の画像の画像をモザイク幅2,モザイク高さ2で処理する時のイメージ図です。
モザイク矩形のピクセルの平均色で塗りつぶすだけです。
#ImageDataオブジェクト
サンプルプログラムではImageDataオブジェクトを使用しています。
画像処理ではバッファを直接いじることになるので、ImageDataの利用は必須です。
ご存知でない方は<a href="http://www.html5.jp/canvas/ref/method/getImageData.html">こちら</a>を参照してください。</a>
Atomでソース全体にauto indentを適用する

#概要
Atomのauto indentは「いちいち全選択」しないとソース全体へ適用してくれない．
一方で，Atomにはinit.coffeeやkeymap.csonが用意されている．これを編集することで，以下のような恩恵がある．

- init.coffeeでソース全体をauto indentするためのプログラムを作れる
- keymap.csonでプログラムに対してショートカットキーを割り当てられる
- つまりショートカット1発で全行auto indentさせる自動化が可能

1行書く度に調整を強いられることがつらいから作った．

# init.coffee: 全行auto indent用プログラム
"File"タブ > "Init Script..."で開く．
~~Atom's APIに無いから~~ 大人の事情で，「カーソルを先頭行に吹っ飛ばして1行ずつ下がりながら全行にauto indentを適用し，再び元の位置にカーソルを戻す」という頭悪そうな処理構成になった．

全行とか言いながら先頭行には効いてないかも．

以下のソースをinit.coffeeに追記．
処理名はとりあえず「all-text-indent」とした（2行目：'custom:all-text-indent'）．

```coffee-script:init.coffee
# 全行auto indentプログラム
atom.commands.add 'atom-text-editor','custom:all-text-indent',->
  editor=atom.workspace.getActiveTextEditor()
  lastRow=editor.getLastBufferRow()
  pos=editor.getCursorBufferPosition()  # 現在のカーソル位置
  editor.moveToTop()
  for i in [1..lastRow]
    editor.moveDown(1)
    editor.autoIndentSelectedRows()  # auto indent処理
  editor.setCursorBufferPosition(pos)  # カーソル位置を戻す
```

CoffeeScriptは初めて触ったが，Atom公式リファレンスは初心者に厳しかった（[Atom's API Essential Classes - TextEditor](https://atom.io/docs/api/v1.23.3/TextEditor#instance-selectAll)）．

# keymap.cson: ショートカットキー割り当て
"File"タブ > "Keymap..."で開く．
構成が単純で理解しやすい．参考：[1つのキーバインドで、同時に複数のコマンドを実行する](https://qiita.com/74th/items/160b011bbfcac77d4e3c)

ついでに「init.coffeeの編集はAtomを再起動しないと有効にならない」ことまで教えてくれた．

以下のソースをkeymap.csonに追記．先ほど作った処理"all-text-indent"にショートカットキーを割り当てる．PyCharmの自動インデントがCtrl+Alt+Lなのでこっちも同様にしてみた．

```:keymap.cson
# 全行auto indent用ショートカットキー
'atom-text-editor':
  'ctrl-alt-l':'custom:all-text-indent'
```

エディタ上での動作なのでatom-text-editorで適用している．どうやら上手く使うとファイル操作とか色々できるらしい．

# 実行例と問題点
PHPファイルで試したが，概ね狙い通り．
PyCharmに慣れていたので同水準に持ってこれて満足．

![auto_indent.gif](https://qiita-image-store.s3.amazonaws.com/0/201962/14dda52b-0243-a4d5-9364-50255e9f853d.gif)
※実際のコーディングでこんな崩れ方は多分しない．全行にauto indentが適用されているのを見やすくするため意図的に崩している．

困ったことといえば，1行ずつの処理なので「元に戻す(Ctrl+Z)」を半ば諦めざるを得ないことくらい．
変なところで適用すると結構悲惨な目に遭う．

# 文句（ポエム）
- そもそも全行auto indentしてくれないのは如何なものか（無料だから仕方ない）
- CoffeeScript[公式リファレンス](http://coffeescript.org/)がわかりにくい．そのへんの日本語解説サイトにはお世話になった
- 目的とは関係なくなったが，Atom's APIのPointオブジェクト参照で詰まされた．最初の要素で行数と列数を全部返してきたり，2番目の要素には何もなかったり(undefined)，自分が今何と戦っているのかわからなくなる．
- ↑配列のはずなのに要素番号が通じない=もしかして：連想配列？
- ↑Atom公式リファレンスを良く読むと，辞書名っぽい"row", "column"の文字が（[Atom's API Essential Classes - Point](https://atom.io/docs/api/v1.23.3/Point)）
- ↑辞書型は確かに超便利だが，「名前がわからないと要素番号でいい感じに誤魔化すこともできず詰む」という闇を抱えているので解説も気をつけて欲しいところ（調べる側もどこに注目すべきか勉強になった）
動画の最後のフレームが black frame になる問題

ハマりメモ

# 問題
ACCaptureSession と AVAssetWriter の組み合わせで動画を書き出した際、動画の最後のフレームが black frame になる。

# 原因
音声バッファとイメージバッファの長さが揃っていない。

# 対応
`AVAssetWriter` `func endSession(atSourceTime: CMTime)` に最後のイメージバッファのタイムスタンプを指定する
MemoryCacheの使いかた

# C# MemoryCache の使いかた

```
using System;
using System.Runtime.Caching;

namespace MemoryCacheTest_2
{
  class Program
  {
    static void Main(string[] args)
    {
      MemoryCache cache = MemoryCache.Default;

      // 上書き
      var policy = new CacheItemPolicy();
      policy.SlidingExpiration = new TimeSpan(0, 0, 2);
      cache.Add(new CacheItem("AAA", "aaa"), policy);
      Console.WriteLine(cache["AAA"]);
      System.Threading.Thread.Sleep(1000);
      cache.Set("AAA", "bbb", policy);
      Console.WriteLine(cache["AAA"]);

      // 存在確認
      if (cache["AAA"] == null)
        Console.WriteLine("NULL!!");
      else
        Console.WriteLine("Not NULL!!");
      System.Threading.Thread.Sleep(3000);
      Console.WriteLine(cache["AAA"]);
      Console.WriteLine("------------");

      if (cache["AAA"] == null)
        Console.WriteLine("NULL!!");
      Console.ReadKey();

      // 比較～キャストする必要がある
      cache.Add(new CacheItem("FFF", 0.123), policy);
      if((double)cache["FFF"] == 0.123)
        Console.WriteLine(cache["FFF"]);
      Console.ReadKey();
      return;

      // キャッシュ登録
      cache["BBB"] = new Tuple<int, int>(100, 200);
      Console.WriteLine(((Tuple<int, int>)cache["BBB"]).Item1);
      Console.WriteLine("------------");
      Console.ReadKey();

      //　3秒以上参照されなかったらキャッシュ削除
      cache.Add("CCC", 300, new CacheItemPolicy()
      {
        SlidingExpiration = new TimeSpan(0, 0, 3),
      });
      Console.WriteLine(cache["CCC"]);
      System.Threading.Thread.Sleep(3000);
      Console.WriteLine(cache["CCC"]);
      Console.WriteLine("------------");
      Console.ReadKey();

      // 3秒たったら強制的に削除
      cache.Add("DDD", 500, new CacheItemPolicy()
      {
        AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(3.0),
      });
      Console.WriteLine(cache["DDD"]);
      System.Threading.Thread.Sleep(3000);
      Console.WriteLine(cache["DDD"]);
      Console.WriteLine("------------");
      Console.ReadKey();

      // 
      cache.Add("EEE", 700, new CacheItemPolicy()
      {
        RemovedCallback = arg =>
        {
          Console.WriteLine("キー {0} が削除されました", arg.CacheItem.Key);
          Console.WriteLine("------------");
          Console.ReadKey();
        }
      });
      cache.Remove("EEE");
    }
  }
}
```
組込み > Link > RAMがなぜROMよりも速いのか(技術的なtransistor-levelの記述のみ) > 未解決

### 質問と回答

[Why is RAM faster than ROM (technical transistor-level description only please)?](https://www.quora.com/Why-is-RAM-faster-than-ROM-technical-transistor-level-description-only-please)

いくつか回答があり、その意訳を記載してみると

- ROMは不揮発で...RAMは揮発で...
- ROMは...に使われ、RAMは...を保存できる
- ROMの例は...RAMの例は...
- RAMはROMよりずっと速いんだよ
- ...の理由からROMの内容はRAMにコピーされるんだ
- ROMは15MB/sでRAMは20GB/sとか
- RAMが勝者だ
- ROMはRAMより速かったり、その反対もあるよ

疑問:上記の質問「**何故RAMはROMより速いのか(技術的なtransistor-levelの記述のみ)?**」に回答している文章はあるのだろうか。。。

- 新人応援
    - 聞かれた質問にきちんと答えよう
    - 付随情報は適度な量に抑えよう
        - ノイズになる

RAMがどういう理由でROMより速いのかは未消化。

### Writingの違い

https://electronics.stackexchange.com/questions/151812/fundamental-reason-why-ram-is-faster-then-second-storage-device

回答の意訳

- NAND flashはブロック単位で消してから書くことになる
- DRAMはそういう制限がない
    - 電荷を[与える|取り除く]
    - 書く前に消すということをしない
    - ...

他の違いについては未消化。
    
### Readingの違い

これについては未消化。

http://smithsonianchips.si.edu/ice/cd/MEMORY97/SEC11.PDF
の資料ではDRAMの項目のFigure 11-4のMemory Bandwidthの比較例はある。
selenium-webdriver(node版)でclosest要素を取得する

## 何がしたいか。

`Element.closest`的なことをseleniumでやりたい時の対応

```haml
ul.books
  li
    .book
      .name
        a href="http://path/to/buy" 罪と罰
      .outline
        p ほげほげほげほげ
        p ほげほげほげ
        a href="http://path/to/more" もっと読む
  li
    .book
      .name
        a href="http://path/to/buy" ダヴィンチ・コード
      .outline
        p ほげほげほげほげ
        p ほげほげほげ
        a href="http://path/to/more" もっと読む
  li
    .book
      .name
        a href="http://path/to/buy" 白鯨
      .outline
        p ほげほげほげほげ
        p ほげほげほげ
        a href="http://path/to/more" もっと読む
      
```

みたいな要素があってダヴィンチ・コードの[もっと読む]をクリックしたい時とかに

```js
let anchor = await driver.findElement(By.partialLinkText('ダヴィンチ・コード'));
await anchor.closest('.book').findElement(By.partialLinkText('もっと読む')).click();
```
みたいなことをしたいけど`WebElement.prototype.closest`なんてものはないのでできない

## 方法

selenium-webdriverのNode版のLocatorには`By.js`とかいうのがある。
これを使うと、与えたscriptを`executeScript`でブラウザ側で実行して、取得したDOMをWebElementとして扱える。
なので、`executeScript`で与えるscript内でネイティブの`Element.closest`すればよい。

## 実装例

By.jsの第一引数はクライアント側で実行するscript, 第二引数以降はscriptに渡す引数となる。
第二引数でダヴィンチ・コードのリンクを渡して、それをscriptが拾ってclosestで要素をとればclosest要素がとれる。

```js
let bookAnchor = await driver.findElement({partialLinkText: 'ダヴィンチ・コード'});
let book = await driver.findElement(
  By.js(
    el => el.closest('.book'),
    bookAnchor
  )
);
await book.findElement({partialLinkText: 'もっと読む'}).click();
```

もし実行対象のブラウザがElement.closestに対応してない場合はscript内でparentNodeをたどって対象のdomになるまで探せば良い。

```js
do {
  if (el.matches && el.matches(selector)) {
    return el;
  }
} while (el = el.parentNode)
// なければ例外
throw new Error('closest target element is not found');
```


## おまけ By.jsについて

あんまりドキュメントに詳しく使い方書かれてないけど実装みると`By.js`はこんな感じの実装になってる

```js:selenium-webdriver/lib/by.js
static js(script, var_args) {
  let args = Array.prototype.slice.call(arguments, 0);
  return function(driver) {
    return driver.executeScript.apply(driver, args);
  };
}
```

locator実行時に第一引数を`driver`として受け取って、`executeScript`してる。
ちなみに`executeScript`は`WebDriver.prototype`にはあるけど`WebElement.prototype`にはない。
`findElement`系では現在のcontextをlocatorに渡すので`By.js`を与えるのは`WebElement.prototype.findElement`ではなくて`WebDriver.prototype.findElement`でなければいけないのでその点は注意が必要。
【PUN】全クライアントでカウントダウンを共有する



[PhotonNetwork.time](https://doc-api.photonengine.com/ja-jp/pun/current/class_photon_network.html)
ルームが作成されてからのサーバーの時間で、
ルーム内の全クライアントに同じ値を返す。

最初に入室した人（ここではマスタークライアントという前提）の時間を`StartTime `という名前でルームのプロパティに設定。プレイヤーがルームに入室したら`Countdown.cs`をアタッチしたカウントダウン用のゲームオブジェクトを有効にする。

```csharp:PlayerManager.cs（一部抜粋）
public GameObject countdown;

public override void OnJoinedRoom() {
    if (PhotonNetwork.isMasterClient) {
        // 全体カウントダウンのスタート時間をセット
        var properties = new ExitGames.Client.Photon.Hashtable();
        properties.Add ("StartTime", PhotonNetwork.time);
        PhotonNetwork.room.SetCustomProperties (properties);
    }
    countdown.SetActive (true);
}
```

ルーム作成からの経過時間を計算して、`maxCount `から残りの時間を計算する。

```csharp:Countdown.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Countdown : MonoBehaviour {

	[SerializeField] float maxCount;

	double startTime;
	float leftTime;

	void Start () {
		startTime = (double)PhotonNetwork.room.CustomProperties ["StartTime"];
	}

	void Update () {
		double elapsedTime = PhotonNetwork.time - startTime;
		leftTime = maxCount - (float)elapsedTime;
	}
}
```
Feedlyのバージョンが変わりAPI version not found。各自サイト確認と修正を

# FeedlyのRSS購読ボタンがAPI version not foundを吐くようになった。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/69647/bc8cfb12-1fcc-31c0-d9ba-110e8871ea2a.png)

```url:こんなURLで購読ボタンを作っていました。
https://feedly.com/subscription/feed/https://hoge.example.com/.rss
```
※ https://hoge.example.com/  の部分は各自のURLにご変更ください。

```json:こんなエラー
{"errorCode":404, "errorId":"ap2int-sv2.2018011718.1749249", "errorMessage":"API version not found"}
```

## 修正方法：APIバージョンが上がり、GETリクエストを投げるURLが変わった


```url:このURLに変更してください。
https://feedly.com/i/subscription/feed/https://hoge.example.com/.rss
```
※ https://hoge.example.com/  の部分は各自のURLにご変更ください。



## Feedlyのボタン生成ツールを早速作っている方もおります。
<a href="https://twitter.com/monochr/status/952912899038564353">
![image.png](https://qiita-image-store.s3.amazonaws.com/0/69647/de874f4f-ad42-e0eb-dfb6-6679acdd71e8.png)
</a>


## コラム
```slim:RailsのSlimで書くならこんな感じ
= link_to "//cloud.feedly.com/#subscription/feed/#{Settings.site_url}#{root_path(format: :rss)}", target: '_blank',
```
Mobx で管理されたステートを FlatList に渡す時は .slice() する

# 背景

Mobx で管理されたローカルなステートを React Native の FlatList に渡す時に、下記のWarningが出て困った


```
[mobx.array]
Attempt to read an array index(2) that is out of bounds (2).
Please check length first. Out of bound indices will not be tracked by MobX
```

この原因は、MobXの `@observable` デコレーターで定義された配列は、JSの `Array` ではなく、 MobXの `ObservableArray` になるため、 `ListView`, `FlatList`, `SectionList` などが解釈できない形になっているらしい。

なので、 `ObservableArray` の `.toJS` あるいは `.slice()` メソッドでJSの `Array` に変換してあげれば良い。


```js
// @flow

import React from 'react'
import { observable } from 'mobx'
import { FlatList, Text } from 'react-native'
import { userApi } from 'app/api'

type User = {
  id: number,
  name: string
}

class SomeComponent extends React.Component {
  @observable users: Array<User>

  componentDidMount() {
    userApi.get().then(users => { this.users = users })
  }

  render() {
    <FlatList
      keyExtractor={(user) => String(user.id)}
      renderItem={({ item }) => <Text>{item.name}</Text> }
      // ここで data={this.users} とするとエラーを吐く
      data={this.users.slice()}
    />
  }
}
```

追記

Warningが出ない場合でも、再描画されない場合があるので、 `.slice()` した方が良さげ。
特に、空の配列に要素を追加した時や、オブジェクトの配列でそのオブジェクトの一部を変更した、みたいな場合に再描画されない。

https://stackoverflow.com/questions/44278526/react-native-flatlist-not-rerendering-row-when-props-change

`.slice()` しなくて良い場合もある。逆に常に `.slice()` していると、パフォーマンスに影響がありそう。
個人的には、リアクティブに再描画されない問題が起こると原因追求が難しいので、多少のパフォーマンスを犠牲にしても `.slice()` してしまっている。
Storeのユニットテストだけは書いておいた。

どんな場合に再描画されないのか、ちゃんと調べたい。

参考

- https://github.com/facebook/react-native/issues/15167
- https://mobx.js.org/best/pitfalls.html
SourceTreeのターミナルが開かない場合

Windows10でSourceTreeを使用しているが、下記エラーが出てターミナルが開かない。

```bash
Error: Could not fork child process: Resource temporarily unavailable (-1).
DLL rebasing may be required; see 'rebaseall / rebase --help'.
```

DLLの関連付けがどうたらの問題の模様。(内蔵Gitを使用している場合に起こる。)
`post-install.bat`というバッチを手動で実行すれば直るようだ。

```bat
cd C:\Users\{ユーザー名}\AppData\Local\Atlassian\SourceTree\git_local

post-install.bat
```

例はコマンドプロンプトだが、ファイルを直接実行しても構わない。

post-install.bat、要は中でrebaseallをやってくれている。
なお、このバッチファイルは実行すると、もはや無用とばかりに消えてしまう。お勤めありがとう。。
ImageMagick コマンドまとめ

ImageMagickを使って変換・結合等を行うときのコマンドメモ

# 2枚の画像(img_1, img_2)を余白(透明:30px)を空けて横方向に結合
`convert img_1.png +append -background none -gravity east -splice 30x0 img_2.png +append output.png`

# n枚の画像(n≥3)を余白(透明:30px)を空けて結合
`convert img_1.png +append -background none -gravity east -splice 30x0 img_2.png +append -splice 30x0 img_3.png ... +append -splice 30x0 img_n.png +append output.png`

#縦方向に結合
`-append`

# タイル張り
`montage -background none -tile 5x2 -geometry +30+30 *.png result.png`

# リサイズ
`convert -resize 1024x src.tif dst.tif`

# オフセットを指定して切り抜き
`convert -crop 1845x1022+30+30 result.png output.png`
[Django]ログローテートの設定方法

Djangoのログローテートの設定方法。

今回は日付単位でローテートしたいと思う。
ログの種類は以下を用意している。

* access
* debug
* info
* warn
* error

handlersの項目に以下を設定する。

* 'class': 'logging.handlers.TimedRotatingFileHandler'
* 'when': 'D'
* 'interval': 1

※他にも設定できる項目などはある。
　[Pythonドキュメント - TimedRotatingFileHandler](https://docs.python.jp/3/library/logging.handlers.html#timedrotatingfilehandler)

```python
project_name = "hoge"

LOGGING = {
    ...（省略）,
    'formatters': {
        'default': {
            'format': ...（省略）
        }
    },
    'handlers': {
        'debug': {
            'level': 'DEBUG',
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'filename': '/var/log/wsgi/{}/debug.log'.format(project_name),
            'when': 'D',
            'interval': 1, 
            'formatter': 'default',
        },
        'info': {
            'level': 'INFO',
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'filename': '/var/log/wsgi/{}/info.log'.format(project_name),
            'when': 'D',
            'interval': 1, 
            'formatter': 'default',
        },
        'access': {
            'level': 'INFO',
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'filename': '/var/log/wsgi/{}/access.log'.format(project_name),
            'when': 'D',
            'interval': 1, 
            'formatter': 'default',
        },
        'warn': {
            'level': 'WARNING',
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'filename': '/var/log/wsgi/{}/warn.log'.format(project_name),
            'when': 'D',
            'interval': 1, 
            'formatter': 'default',
        },
        'error': {
            'level': 'ERROR',
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'filename': '/var/log/wsgi/{}/error.log'.format(project_name),
            'when': 'D',
            'interval': 1, 
            'formatter': 'default',
        },
    },
    'loggers': {
        'app.debug': {
            'handlers': ['debug'],
            'level': 'DEBUG',
            'propagate': True,
        },
        'app.info': {
            'handlers': ['info'],
            'level': 'INFO',
            'propagate': True,
        },
        'app.access': {
            'handlers': ['access'],
            'level': 'INFO',
            'propagate': True,
        },
        'app.warn': {
            'handlers': ['warn'],
            'level': 'WARNING',
            'propagate': True,
        },
        'app.error': {
            'handlers': ['error'],
            'level': 'ERROR',
            'propagate': True,
        },
    },
}
```

また、uWSGIの起動などを記録するログはiniファイルなどに以下の項目を追加してログローテート対応できる。

```ini
logto=/var/log/wsgi/default.log.@(exec://date +%%Y-%%m-%%d)
log-reopen=true
```
ファイル選択時画像をモーダル表示とトリミング

まずはよくあるbootstrapのmodalと画像ファイルをアップするボタンを用意。

```form.html
<form enctype="multipart/form-data" method="post">
	<input 	class="img btn btn-primary btn-lg"
			type="file"
			accept="image/*" >
</form>
```

```modal.html
<div class="modal fade" id="modal-img" tabindex="-1">
	<div class="modal-dialog">
		<div class="modal-content">
			<div class="modal-header">
				<button type="button" class="close" data-dismiss="modal"><span>×</span></button>
				<h4 class="modal-title">タイトル</h4>
			</div>
			<div class="modal-body">

			</div>
			<div class="modal-footer">
				<button id="get-button" type="button" class="btn btn-default" data-dismiss="modal">OK</button>
				<button id="not-button" type="button" class="btn btn-default" data-dismiss="modal">閉じる</button>
			</div>
		</div>
	</div>
</div>
```

今回はjQueryの使用。
そして、cropperでトリミング内容を取得を行うので下記を追加を行う。

```
<!-- CSS -->
<link href="https://cdnjs.cloudflare.com/ajax/libs/cropper/1.0.0/cropper.min.css" rel="stylesheet" type="text/css" media="all"/>

<!-- JS -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/cropper/1.0.0/cropper.min.js"></script>
```

まずはファイルを選択したときにmodalを表示を行い、画像のトリミング加工を行うものを表示。

```jQuery.html
<script type="text/javascript">
	$('input[type=file]').change(function() {
        // ファイルの取得
		var file = $(this).prop('files')[0];

        // modal表示
		$('#modal-img').modal();

	    // 画像表示
	    var reader = new FileReader();
	    reader.onload = function() {
			var img_src = $('<img id="cropper">').attr('src', reader.result);
			$('.modal-body').html(img_src);
			$('.modal-body img').cropper({aspectRatio: 4 / 4});
            // ワイド画面 ⇒ 16 / 9
	    }

	    reader.readAsDataURL(file);
	});
</script>
```

元画像とトリミング内容を送る

```jQuery.html
<script type="text/javascript">
    $('#get-button').on('click', function() {
        var img_file = $('#cropper').attr('src');

        var data = $('.modal-body img').cropper('getData');
        var image = {
            width: Math.round(data.width),
            height: Math.round(data.height),
            x: Math.round(data.x),
            y: Math.round(data.y),
        };

        $.ajax({
            type: "POST",
            url: "URL",
            data: { img_file, image },
            success:function(res) {
            	console.log(res);
            }
        });
    });
</script>
```

画像加工はまだ作ってないのでできたら追記します。
bashシェル芸

# bash

- 随時追加予定

## 配列

```bash
# 宣言
array1=("r_7_&_O r_10_&_N" "r_8_&_O r_11_&_N" "r_7_&_NZ r_10_&_OE1_OE2" "r_15_&_O r_18_&_N" "r_16_&_O r_19_&_N" "r_18_&_OE1_OE2 r_20_&_NZ" "r_8_&_NZ r_18_&_OE1_OE2")

echo ${array1[@]}  # 全要素の参照
echo ${array1[0]}  # 1番目の要素の参照
echo the number of pairs ${#array1[@]}  # 全要素数の参照

for (( i=0; i < ${#array1[@]}; i++ ))  # 全要素に対するループ処理
do
  echo $i  ${array1[$i]}
done
```

## ヒアドキュメントの中にインデントを含めたい


- `<<-` ハイフンを付ける
- `tab` のみ有効（スペースだとうまくいかない）

>Appending a minus sign to the << has the effect that leading tabs are ignored. This allows indenting here documents in shell scripts (primarily for alignment with existing indentation) without changing their value:[a]


```bash
$ tr a-z A-Z <<- END_TEXT
>       one two three
>       four five six
>       END_TEXT

ONE TWO THREE
FOUR FIVE SIX
```

>This yields the same output, notably not indented.

https://en.wikipedia.org/wiki/Here_document#Unix_shells

## bashスクリプトの中にgnuplotのスクリプトを埋め込みたい

https://askubuntu.com/questions/701986/how-to-execute-commands-in-gnuplot-using-shell-script

https://qiita.com/hnishi/items/3ab5a3c12322026bdc71

```bash
gnuplot -e "plot sin(x); pause -1"
```

```bash
#!/bin/bash
minval=0    # the result of some (omitted) calculation
maxval=4219   # ditto
gnuplot -persist <<-EOFMarker
    set title "Walt pedometer" font ",14" textcolor rgbcolor "royalblue"
    set timefmt "%y/%m/%d"
    set yrange $minval:$maxval
    set xdata time
    set pointsize 1
    set terminal wxt  enhanced title "Walt's steps " persist raise
    plot "/home/walt/var/Pedometer" using 1:2 with linespoints
EOFMarker
# rest of script, after gnuplot exits
```

```bash
#!/bin/bash

rm xxx.dat

for i in {1..100}
do
  echo $i >> xxx.dat
done

gnuplot -persist << EOF
  p "xxx.dat" w l
  pause -1
EOF
```

## 変数をawkに渡したい

awkの-vオプションを使う

```bash
awk -v fn_out1="$outputfile" -v var2="variant 2" '{print $0,fn_out1, var2}' hoge.txt
```

https://qiita.com/yamao2253/items/cf69b68447214036e914

## bashスクリプトの中にawkのコードを埋め込みたい[^1]

https://qiita.com/hnishi/items/4ee60ed515470e796f41

```bash
#!/bin/bash -eu

inputfile=hoge.txt

################################
# AWK scripts                  #
################################
read -d '' scriptVariable << 'EOF'
BEGIN {
    print "start"
}
{
    print $0
}
END {
    print "hello"
}
EOF
################################
# End of AWK Scripts           #
################################

awk "$scriptVariable" ${inputfile}
```

- `read`:入力行を単語に分離してシェル変数に格納する[^2]
    - `-d`:セパレータの指定→ここでは文字列を区切らないように設定しているため，EOFまでのすべての文字列が，シェル変数の$scriptVariableに格納される。

### 参考

[^1]: https://stackoverflow.com/questions/15020000/embedding-awk-in-a-shell-script
[^2]: http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230866/?rt=nocnt
【VRTK】コントローラーのイベントに処理を追加する



## 方法1

`VRTK_ControllerEvents`のアクションメソッドに、イベントハンドラーを追加する。

```csharp
GetComponent<VRTK_ControllerEvents>().TriggerPressed += new ControllerInteractionEventHandler(DoTriggerPressed);

private void DoTriggerPressed(object sender, ControllerInteractionEventArgs e) {
	// 処理
}
```

## 方法2

`VRTK_Controller_Events`コンポーネントがアタッチされているオブジェクトに、`VRTK_Controller_Events_Unity_Events`コンポーネントを追加。インスペクタ上からメソッドを登録していく。

> 参考
[[Basics] Controller Events](https://www.youtube.com/watch?v=e2YSTb-Of0M)
[[VRTK解説] 「VRTK_ControllerEvents」の概要(VR空間でコントローラーを扱う) [Unity][VRTK3.0][Vive]]
(http://negi-lab.blog.jp/archives/vrtk_controllerevents.html)
【CodePen】JavaScriptとcanvasで誘導弾パーティクル

CodePenが埋め込めるようになった記念に、誘導弾風のアルゴリズムでパーティクルがマウスに集まってくるという先日作ったサンプルを埋めてみます。

<p data-height="480" data-theme-id="0" data-slug-hash="wpewwm" data-default-tab="result" data-user="akicho8" data-embed-version="2" data-pen-title="Homing Particles" class="codepen">See the Pen <a href="https://codepen.io/akicho8/pen/wpewwm/">Homing Particles</a> by Akira Ikeda (<a href="https://codepen.io/akicho8">@akicho8</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

技術的におもしろいところは描画領域の消去方法です。他の方のコードを読みまくって知ったのですが、clearRect で全消去するのではなく次のように描画方法を **destination-out** かつ半透明で描画すると徐々に消えていく効果が得られることがわかりました。

```js
ctx.globalCompositeOperation = "destination-out"
ctx.fillStyle = "rgba(0, 0, 0, 0.2)"
ctx.fillRect(0, 0, w, h)
```

またパーティクルのオブジェクトの方は **lighter** で描画することで重なった部分が光っているような効果になります。

```js
ctx.globalCompositeOperation = "lighter"
```

# 参照

globalCompositeOperation プロパティ - Canvasリファレンス - HTML5.JP
http://www.html5.jp/canvas/ref/property/globalCompositeOperation.html
[Windows]UnityをアンインストールするにはUninstall.exe

複数バージョンのUnityをインストールしていた場合、[Windows]－[設定]－[アプリと機能]からアンインストールされるのは最新バージョンだけみたい。
[アプリと機能]からUnityを選んでアンインストールすると、もう[アプリと機能]のリストにはUnityが出てこないけど、旧バージョンのUnityはそのまま残っている。。。

そんな場合は、Unity.exeと同じフォルダにあるUninstall.exeを実行すればよいっぽい。（例：C:\Program Files\Unity\Editor）

あとは、[Unity公式の再インストール手順](https://docs.unity3d.com/jp/540/Manual/TroubleShootingEditor.html)にもある通り、データファイルが残っていたら消した方がいいかも。（私はUnity公式サイト見て先にこっちを消してしまったので、Uninstall.exeでこのデータファイルも一緒に消えてくれるのかは不明。）
> 次のファイルがある場合は削除します。
>
Windows
%AllUsersProfile%\Unity\ (typically C:\ProgramData\Unity)
MacOS:
/Library/Application Support/Unity/

>コンピューターを再起動します。
Post Processing Stackと輪郭シェーダー併用で輪郭を光らせる(2)

[前回](https://qiita.com/ELIXIR/items/94735e9f9336caf773f9)はスクリーン全体に対して輪郭を適用していましたが、今回はモデル単体に適用してみます。

![スクリーンショット 2018-01-18 10.03.15.png](https://qiita-image-store.s3.amazonaws.com/0/59911/19439ce1-d9ae-0c4b-478d-e4c17de3c802.png)

```
Shader "Custom/ModelEdgeEmitShader" {
	Properties {
		[HDR] _Color ("Emission Color", Color) = (2,2,2)
        _EdgeWidth ("Edge Width", Range(0, 10)) = 1
    	_Sensitivity ("Depth Sensitivity", Range(0, 100)) = 1
	}

    SubShader
    {
		Tags { "RenderType"="Transparent" "Queue"="Transparent+100"}
		LOD 200
		ZTest LEqual Cull Back ZWrite Off

		CGPROGRAM
		#include "UnityCG.cginc"
		#pragma surface surf Standard fullforwardshadows alpha
		#pragma target 3.0

		struct Input {
			float4 screenPos;
		};

//    	sampler2D_float _CameraDepthTexture;
	sampler2D_float _LastCameraDepthTexture;
		float4 _Color;
    	float _EdgeWidth;
    	float _Sensitivity;

		UNITY_INSTANCING_BUFFER_START(Props)
		// put more per-instance properties here
		UNITY_INSTANCING_BUFFER_END(Props)

    	float edgeCheck(float2 i_uv){
    		float2 txSize = 1/_ScreenParams.xy*_EdgeWidth;
    		float2 base_uv = i_uv - txSize*0.5;
		    float2 uv0 = base_uv;
		    float2 uv1 = base_uv + txSize.xy;
		    float2 uv2 = base_uv + float2(txSize.x, 0);
		    float2 uv3 = base_uv + float2(0, txSize.y);

        	// Convert to linear depth values.
        	float z0 = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_LastCameraDepthTexture, uv0));
        	float z1 = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_LastCameraDepthTexture, uv1));
        	float z2 = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_LastCameraDepthTexture, uv2));
        	float z3 = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_LastCameraDepthTexture, uv3));

        	// Roberts cross operator
        	float zg1 = z1 - z0;
        	float zg2 = z3 - z2;
			return saturate(sqrt(zg1 * zg1 + zg2 * zg2)*_Sensitivity);
		}

		void surf (Input IN, inout SurfaceOutputStandard o) {
        	float2 uv0 = IN.screenPos.xy / IN.screenPos.w;
        	uv0.x *= _ScreenParams.w;
        	float z0 = edgeCheck(uv0);
			o.Emission = _Color.rgb*z0;
			o.Alpha = z0*_Color.a;
		}
    	ENDCG
    }

	Fallback Off
}

```

上記シェーダーをつかたMaterialを用意し、モデルの２つ目のシェーダーに指定します

![スクリーンショット 2018-01-18 10.33.28.png](https://qiita-image-store.s3.amazonaws.com/0/59911/a9146f0d-c4b4-b266-5224-362072ba3064.png)

前回同様Unlit系のシェーダーには効果がありません。
またこの方法は複数マテリアルを使用しているモデルには使用できません。

モデル内で完結するシェーダーでエッジを出す場合、エッジはモデル内側に出すことになるので、細い部分が多いモデルにはあまり向いていません。その場合は[viewDirとworldNormal](https://docs.unity3d.com/jp/540/Manual/SL-SurfaceShaders.html)を使った[リムライティング](https://docs.unity3d.com/jp/540/Manual/SL-SurfaceShaderExamples.html)を併用しても良いかもしれません。
半音sage : CodePenテスト


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">普通の人「ファーwwwwwwwwwwwwwwwみそしる売り切れwwwwwwwwww」<br><br>半音低い人「ミーwwwwwwwwwwwwwwwみ♭そ♭し♭る売り切ど♯wwwwwwwwwww」</p>&mdash; Rubikun (@Rubikun_aaa) <a href="https://twitter.com/Rubikun_aaa/status/899632704630554625?ref_src=twsrc%5Etfw">2017年8月21日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

に感銘をうけたので作ったけど面白くない

<p data-height="265" data-theme-id="0" data-slug-hash="Mrzeyd" data-default-tab="js,result" data-user="ys951357" data-embed-version="2" data-pen-title="半音sage" class="codepen">See the Pen <a href="https://codepen.io/ys951357/pen/Mrzeyd/">半音sage</a> by ys951357 (<a href="https://codepen.io/ys951357">@ys951357</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

という、CodePenのテストでした
インフラエンジニアが初めて会社でAPIを書いて学んだことメモ

# これは何
普段主にインフラエンジニアとして働いている私が、会社で初めてAPIを一つ書いたので、そこで得た学びや考えたことを記録しておこうと思います。

# 何を学んだこと・考えたこと

### 仕様書を書こう
どのようなAPIなのか、目的やリクエストパラメーターやレスポンスフォーマットについて定義する。
特にAPIの場合はレスポンスフォーマットが変わるとクライアント側でパースするのに困ってしまうのではっきり定義しなければならない。
APIは使う側ありき。

### レスポンスフォーマットの統一性
他のAPIとできるだけ揃えた方が良い。統一性がないと使う時に大変。
ドメイン全体でJSONのうちのMeta情報やDataオブジェクトをどのようなフォーマットにするのかというのを決めておき、各種APIはそれに従うのが良い。何も決めずに走り出すとメチャメチャになってしまうのでまず共通ルール。共通ルールはフレームワークへ落とし込んでおいて、そのフォーマットから外れなければ簡単にレスポンスを作れるようにしておく。
共通ルールをしっかり作っておくと大枠は固定されるので、後から細かいところをちょっと変えるにしても混乱が少ない。


### DBで保持しているデータとAPIのJSONのキー名は必ずしも合わせる必要がない
裏で使っている名前に引きずられがち。利用者にとって使いやすい名前にする。
例えばDBで公開状態を`public_status`という名前で持っており、0,1の値を取るとする。どちらの値がpublicなのかちょっと分かりづらいと感じたとする。その場合、`public_status`にこだわらなくても、APIレスポンスとしてはデータ要素が削除されているかというのが重要であるなら `is_deleted`という名前で返してあげるのが親切。

### 時間はUnixTimeで返そう
JSTやUTCで帰っていると使いづらい。DBでJSTで保持していても変換してUnixTimeで返すと良い。

### エラー応答についても定義しておこう
主なエラー応答やステータスは共通ルールとして定義しておこう。
各APIの仕様書においては、特殊な条件やちょっと迷いそうな場合についてエラー応答について記述しておこう。

### 仕様書はコードからすぐに参照できるように書いておこう
@see などで参照リンクとしておいておこう。
簡単な説明はコードにコメントしてしまった方が良いが、長くなるなら仕様書に切り出してリンクを貼っておくのを忘れずに。1セットで管理していく。

### コードフォーマットはエディタに任せよう
エディタに微妙にフォーマット設定が入っていなくて細々としたPRコメントを沢山もらっしまった。
フォーマットについてはプロジェクトのREADMEにすべて明記して新しく入った人が迷わないようにする。可能であればエディタ設定ファイルなども共有しよう。
人間がやることではない。機械に任せられるのは機械に任せよう。

### テストを書こう
PRコメントに長々と手動の動作確認の結果を書くのはよくない。TDDの考え方を取り入れて仕様が決まったら先にテストを書いてしまうのが良い。

コメント： とはいえ今回のケースでいうと、それなりにテスト書くのに苦労したので先に書くのは難しかったかも。Seleniumでテストを書いたのだが、他の開発者がMacだったが私だけWindowsでテストを回したので無駄に苦労した。開発環境は可能なかぎり教えてくれる人と合わせた方が良い。

### 同じような応答を返すWebFrontページがあるなら仕様を合わせよう
WebFrontページとソート順や件数などの仕様が異なると混乱を招く。仕様がくいちがうならその旨を理由と合わせて明記しよう。
WebはHTML/CSSから学びはじめるべきか｜HTMLも知らない人にIonic本をしてもらった知見

10年以上前からWebの勉強は「まずHTMLを覚えて、フォントサイズをかえて『すごーい』」という学習がメジャーですが、それって本当に正しいのかなという記事です。

## 前置き ー Ionic Frameworkとは

[「Ionicで作る モバイルアプリ制作入門〈Web/iPhone/Android対応〉」](http://amzn.to/2DoFiWi)が発売されます。

IonicはHTML5でモバイルアプリをつくるためのプラットフォームです。
1ソースでWeb/iOS/Androidアプリがつくれることから、ドワンゴ、pixiv、Exciteといった有名企業も採用しており、「Webアプリをつくって人気がでたら、そのままiOSアプリもリリース！」ができることから、Webの価値を押し上げると言われています。モバイルネイティブなUIデザインすてきですよ。

[<img width="939" alt="スクリーンショット 2018-01-18 9.20.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/100460/10ddd870-64f3-8982-18c6-6d78c9362551.png" border="1px">](http://amzn.to/2DoFiWi)

## 本題

で、本書を執筆した動機は「HTML書けたらアプリつくることができるのに、それを知らない方が多くてもったいない」だったわけですが、ふと頭をよぎったわけです。

__HTMLも知らない人が、Ionicを使ったらどうなるのかと。__

「まずHTML/CSSを学ばせてあげようよ」という指摘は不要です。わかってる、わかってます。でも興味を持ってしまったのです。そこで、友人（30歳/女性/事務職）にIonic本を渡してチュートリアルも含めて進めてもらいました。

### 観察経過

#### 1. 明記してても、コマンドラインとエディタの違いがわからない
まずつまづくのは、開発するのにコマンドライン（ターミナル）とエディタ（VSCode）の二種類を使いわけるところでした。つまりは `ionic start`コマンドをエディタで入力し、HTMLをコマンドラインに書く。まぁすぐ覚えました。

#### 2. VSCodeの開き方がわからない
さすがにすぐ覚えた。

#### 3. 意外とできる
コマンドラインとエディタの違い、VSCodeの開き方を覚えたら意外と進めることができました。 ~~すっかりすぐ心折れると思ってた。~~

`ionic serve`コマンドで、デフォルトテンプレートから立ち上げてモニタに表示できた時は歓声あげてました。

<img width="1255" alt="スクリーンショット 2018-01-18 9.48.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/100460/fb474a60-8873-6992-5517-88a222e42620.png">

#### 4. 躓きはtypo
チュートリアルを進めていくに当たって、「どうしても動かないー！！」ということが度々あったのですが、ほぼ90%はtypoでした。例えば、 `title` と入力したはずのものが `tittle` になってたとか。
`<ion-input type="text">`と入力する時に `<ion-inputtype="text">`（空白忘れ）になってたとか。あと、`(tap)`はよく`(top)`になってる。

#### 5. 進めることができてた
ちょいちょい質問されたのですが、大枠ではHTMLの知識がなくてもIonic本は進めることができてました。先入観がない真っ白な状態なので「タスクランナーを使う」みたいなことも当たり前として捉えてるのはよかったなぁという気持ちです。

#### 6. スマホのネイティブ開発は難関
HTMLが、というよりもPC自体が苦手な方だったので、`Xcode`や`Android Studio`の設定についてはめちゃくちゃ戸惑ってました。デバイスエミュレーターを使うためにデバイスデータをDLするとか、よくわからないよね（書籍情報ちょっと足りないので、後日、加筆記事ネットで公開します）

#### 7. スマホのネイティブ開発が一番感動してた
つくったものが、自分のスマホで起動するところは再び歓声があがってました。「そうかこれがスマホ世代か」という気持ち。

#### 追記： `serve` の意味がわからなかった
`ionic serve`コマンドを何といったらいいかわからずに「開けゴマコマンド」といってた。いや、間違ってはないけどさ・・・。

## 思ったこと
Ionic本を進める様子をみていたのですが（大体3人日ぐらいかかってました）、ふと思ったのは「これってUXめちゃくちゃ高いよな」ということでした。

Webの勉強は「まずHTMLを覚えて、フォントサイズをかえて『すごーい』」というところからはじめるのが一般的ですし、それが教えやすいのもよくわかります。よくいう「小さな成功体験を積み重ねる」教え方ですよね。
けれど、Webの勉強意欲が一番高いのは、当然ながら学びはじめる前なわけです。そのステージにいる人に提供する課題は、果たしてフォントサイズを変えることなのかなと。少なくても歓声をあげるようなUXは提供できないように思います。

それよりは、Ionicのような「タスクランナー入り、UIコンポーネント入り、モバイルでも動かせる」を体験させた方がUXは高いのではないでしょうか。少なくても`<Font size="3">`を教えたり、簡単にネットにアップロードしよう！FTPだ！！のような、現場で使わない知識を「教えやすいから」と学ばすのは何か違うなーとIonic本を進めてる様子をみて思いました。

10年前と違って、ページネーションつけてたら「Twitterみたいにスクロールしたらコンテンツでてこないの？」とか言われる世の中ですので、「今のWebの教え方」って再考する余地はあるのではないでしょうか。

それでは、また。

## 追記
HTMLも知らない彼女がチャレンジした書籍はこちらです。「いやいや、こちらの書籍の方が初心者に相応しい」「もっと高度なところからはじめた方がいいのでは」という意見ありましたらぜひコメントくださいませー。
[<img width="939" alt="スクリーンショット 2018-01-18 9.20.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/100460/10ddd870-64f3-8982-18c6-6d78c9362551.png" border="1px">](http://amzn.to/2DoFiWi)
Google Test を Mac OS X El Capitan にインストールしてC言語のテストに使う


https://github.com/google/googletest/tree/master/googletest


## ビルド

```
$ git clone git@github.com:google/googletest.git

$ mkdir mybuild       # Create a directory to hold the build output.
$ cd mybuild
$ cmake ../googletest/googletest/  # Generate native build scripts.
$ make
```

- libgtest.a
- libgtest_main.a

がこれでビルドされる。

## テスト作成

`func.c` `func.h` に実装した `some_func()` をテストする。

```c:func.c
#include <stdio.h>

int some_func(int a) {
  return a + 10;
}
```

```c:func.h
#ifndef GTEST_TRIAL_FUNC_H
#define GTEST_TRIAL_FUNC_H

int some_func(int a);

#endif //GTEST_TRIAL_FUNC_H

```

オブジェクト作成コンパイル

```
$ gcc -c func.c
```

テストケース実装。

```cpp:test.cpp
#include "gtest/gtest.h"
extern "C" {
  #include "func.h"
}

class fixtureName : public ::testing::Test {
protected:
  virtual void SetUp(){
  }
  virtual void TearDown(){
  }
};

TEST_F(fixtureName, testOk)
{
    EXPECT_EQ(10, some_func(0));
    EXPECT_EQ(11, some_func(1));
}
```

コンパイル

```
$ g++ -pthread -isystem ../googletest/googletest/include test.cpp func.o libgtest_main.a  libgtest.a
```

## テスト実行

```
$ ./a.out
Running main() from gtest_main.cc
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from fixtureName
[ RUN      ] fixtureName.testOk
[       OK ] fixtureName.testOk (0 ms)
[----------] 1 test from fixtureName (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (0 ms total)
[  PASSED  ] 1 test.

```
Wikipedia からランダムなキーワードを取得するモジュール


Wikipedia からランダムな単語を取る API があるのを知りました。


URL はこれです。
ランダム記事: https://en.wikipedia.org/wiki/Special:Random
日本語のみ: https://ja.wikipedia.org/wiki/Special:Random


遊びに使えそうだったのでモジュール化しました。



# 作ったもの
GitHub: https://github.com/elzup/random-word-wikipedia

## CLI で使う

```shell-session
npm -g random-word-wikipedia
```

```shell-session
$ random-word-wikipedia ja -n 4
バダインジャラン砂漠
ディミトリ・ペータース
内野 (印西市)
PAC-MAN 256
```


## モジュールとして使う

```shell-session
npm i -S random-word-wikipedia
```

```js
const randomWordWikipedia = require('random-word-wikipedia');

randomWordWikipedia().then(console.log);
//=> [ 'Saxifraga spathularis' ]

randomWordWikipedia('ja', 2).then(console.log);
//=> [ 'ジョン・イサーク・ブリケ', '月は闇夜に隠るが如く' ]
```

# 実装について
mediawiki の API を少しラップしただけです
https://www.mediawiki.org/wiki/API:Random/ja


# 実用について
Special:Random の細かい仕様については調べていません。
https://en.wikipedia.org/wiki/Wikipedia:Random

Wikipedia にあるカテゴリの偏りも調べていません。
カテゴリ一覧: https://ja.wikipedia.org/wiki/Category:%E4%B8%BB%E8%A6%81%E3%82%AB%E3%83%86%E3%82%B4%E3%83%AA

何回か叩いてみた結果遊びには充分使えそうという感じです。

mediawiki の API をもっとガッツリ使いたい場合は client がいくつかあるのでそちらがおすすめです。
https://qiita.com/kn1cht/items/72155e8c8fcd6595aab9


リポジトリ: https://github.com/elzup/random-word-wikipedia
Administrate で enumフィールドを多言語化して表示する

Administrateを使っていて、enumのプロパティをselectボックスで選ばせたかったので実装してみました。

## 実行環境
- Rails 5
- Administrate 0.8.1

## 方針
- Selectフィールドをベースにカスタマイズする
    - https://administrate-prototype.herokuapp.com/adding_custom_field_types
- 標準フィールドのように使いたい
    - ``Field::Enum``
- 日本語訳したい
    - ``I18n``を使う

## 実装
### ビューを追加する
```
$ rails generate administrate:field enum
```

```app/views/fields/enum/_form.html.erb
<div class="field-unit__label">
  <%= f.label field.attribute %>
</div>
<div class="field-unit__field">
  <%= f.select(
    field.attribute,
    options_from_collection_for_select(
      field.selectable_options,
      :last,
      :first,
      field.data.presence,
    )
  ) %>
</div>
```

```app/views/fields/enum/_index.html.erb
<%= field.data %>
```

```app/views/fields/enum/_show.html.erb
<%= field.data %>
```

### フィールドを追加する
```lib/administrate/field/enum.rb
require "administrate/field/base"

module Administrate
  module Field
    class Enum < Field::Select
      def self.searchable?
        true
      end

      def selectable_options
        collection
      end

      private

      def collection
        if options.key?(:collection)
          options.fetch(:collection, [])
        else
          if resource_class.respond_to?(collection_method)
            resource_class.send(collection_method).map do |label, value|
              [I18n.t("enums.#{resource_class.name.underscore}.#{collection_method}.#{label}"), value]
            end
          else
            []
          end
        end
      end

      def resource_class
        @resource.class
      end

      def collection_method
        if options.key?(:collection_method)
          options.fetch(:collection_method)
        else
          @attribute.to_s.downcase.pluralize
        end
      end
    end
  end
end
```

## 実行例
プロフィールに性別を登録できるアプリを想定します。

```app/models/profile.rb
class Profile < ApplicationRecord
  enum sex: %i(male female)
end
```

```config/locales/ja.yml
ja:
  enums:
    sexes:
      male: 男性
      female: 女性
```

```app/dashboards/profile_dashboard.rb
require "administrate/base_dashboard"

class ProfileDashboard < Administrate::BaseDashboard
  ATTRIBUTE_TYPES = {
    sex: Field::Enum,
  }.freeze

  COLLECTION_ATTRIBUTES = [
    sex: Field::Enum,
  ].freeze

  SHOW_PAGE_ATTRIBUTES = [
    sex: Field::Enum,
  ].freeze

  FORM_ATTRIBUTES = [
    sex: Field::Enum,
  ].freeze
end
```

## 実行結果
![スクリーンショット 2018-01-18 9.54.07.png](https://qiita-image-store.s3.amazonaws.com/0/37501/a1294b82-c78c-5a90-049f-210d2e92294d.png)

## 参考
https://github.com/guillaumemaka/administrate-field-enum