OmniAICreator/Qiita-1.07M huggingface dataset:
<メモ> ServiceNow ATF フィールド値の設定(Set Field Values)で、フィールドを選択しようとしたらリストに無い

# 1. 前提
ServiceNow
バージョンKingston
ATFでのテスト作成時

# 2. 起きていること
フィールド値の設定(Set Field Values)で、フィールドを選択しようとしたらリストに無い

。。。という事象が発生したことがある。

テーブルそのものは諸事情で持ち出せないので、どんなときに起きるのか調べる。

# 3. 調べる

## 3.1. まずはdoc

[こちら](https://docs.servicenow.com/bundle/kingston-application-development/page/administer/auto-test-framework/reference/atf-set-value.html)

特に言及なし

## 3.2. 次にCommunity

[ちょっと古いけど似たような投稿があった](https://community.servicenow.com/community?id=community_question&sys_id=f314cfe5dbd8dbc01dcaf3231f9619f7)

どうやら必須のフィールドが選択できなくて困っている→save_as_template操作に対するACLのせいでは？ということらしい。

>You can check 'save_as_template' ACLs for incident table to see if you are restricting some/all fields from being saved in templates:




つづく
Rubyのgsub!で置換した部分だけ別ファイルに出力する方法

# 前提
　Rubyのgsub!でガンガン文章を置換していく、というか削除していくことってあると思います。
　でも、その削除した部分、本当に削除したかった部分？って思うこともあるはず。正規表現に自信がないほど確認したいのが人情です。gsub!のブロック記法を使っていちいち出力していけばいいですが、それも面倒だよね……。
　というわけで、メタプログラミングを使って、``filename``を読み込ませてgsub!で置換した部分だけ抜き出し、``filename_deleted``という名前で出力するようにしてみました。
　このサンプルコードには銀河鉄道の夜の第1章、午后の授業を読み込ませてあげてください。使い方は、``ruby black_magic.rb filename``です。

# サンプルコード
```ruby:black_magic.rb
# gsub!のフック用のオープンクラス
# ここでは、gsub!が呼ばれる度に置換した部分を
# 別ファイルに書き込むための下処理を行なっている
class String
  alias_method :org_gsub!, :gsub!
  def gsub!(arg1, arg2)
    org_gsub!(arg1){|str|
        $i << arg1.to_s << "\n" << str << "\n"
        arg2
    }
  end
end

# 各種変数の宣言
f = ""
h = ""
$i = ""

file_path = ARGV[0]

IO.foreach(file_path) do |line|
  line.gsub!(/天の川/, "Milky Way")
  line.gsub!(/星/, "Star")
  h << line
end

IO.write(file_path + "_processed", h)

IO.write(file_path + "_deleted", $i)
```

# 解説
　これはRubyの「オープンクラス」という機能を使っています。
　この機能、この名前では公式の日本語リファレンスには載っていません。名前は出ていなくても機能自体の紹介はあるのですが、以下の通りです。

> クラスが既に定義されているとき、さらに同じクラス名でクラス定義を書くとク ラスの定義の追加になります。 ただし、元のクラスと異なるスーパークラスを指定すると TypeError が発生します。
> https://docs.ruby-lang.org/ja/2.5.0/doc/spec=2fdef.html

　これだけ聞いてもなんだかピンときません。
　英語の方のリファレンスにはもう少し詳しい解説があります。

> Due to Ruby's open classes you can redefine or add functionality to existing classes. This is called a “monkey patch”. Unfortunately the scope of such changes is global. All users of the monkey-patched class see the same changes. This can cause unintended side-effects or breakage of programs.
> https://docs.ruby-lang.org/en/2.5.0/syntax/refinements_rdoc.html

軽く訳すと以下のような感じです。

> Rubyのオープンクラスにより、既存のクラスを再定義したり関数を追加したりできます。これはモンキーパッチと呼ばれています。残念なことに、これらの変更のスコープはグローバルです。モンキーパッチで変更されたクラスのすべてのユーザーが同じ変更の影響を受けます。これは意図していない副作用やプログラムの破壊を起こすことがあります。

　というわけで、サンプルコードで書いたのはモンキーパッチです。黒魔術です。この英語のリファレンスではそれでもこのモンキーパッチを少しでも安全に使うための工夫を解説してますが、私のコードにはそれはありません。
　書き捨てコードなのでいいかな、みたいな判断ですが、ちゃんとしたプロダクトでオープンクラスを使う必要に迫られた時は上記英語リファレンスに載っているモジュールを使う方法で少しでも影響範囲を狭めてください。

## 関数の再定義
　サンプルコードではStringクラスのgsub!メソッドを再定義しています。順に説明します。
　まず、普通にクラス定義をする方法と同じ文法で、クラス名を書くところに``String``を書きます。これでStringクラスの定義を追加しますという意味になります。
　次に、``gsub!``のエイリアスとして``org_gsub!``というメソッドを定義します。この``org_gsub!``というメソッドが本来の``gsub!``メソッドと同じ挙動をします。
　今度は、``gsub!``メソッドを再定義します。``def gsub!(arg1, arg2)``の部分です。
　``org_gsub!``が本来の``gsub!``メソッドですので、これを使って``gsub!``との差分を書いていきます。
　``arg1``には正規表現が入っています。それで取り出せた文字列が``str``に入ります。そして、グローバル変数``$i``に正規表現とそれによって取り出せた文字列を詰めています。こうすることで、どの文字列がどの正規表現に引っかかったのかがわかりやすくなります。最後に、置換したい文字列の``arg2``を評価させて、gsub!の再定義は終わりです。
　そして$iをファイルに書き込んで、やりたいことは完了です。

### 注意点
　ここで再定義したgsub!は、ブロック形式では使えません。そのように再定義してはいないからです。

# まとめ
　というわけで、黒魔術入門記事でした。偉そうに言えた身分ではありませんが、黒魔術は基本非推奨です。メリットとデメリットを冷静に比べてメリットを取るべきだと判断できた時にだけ使うようにしましょう。
JavaScriptでブラウザ判定を行う

既に、関連書籍や各種サイト/記事で多く紹介されている内容ですが、自分の備忘録を目的に投稿します

#ブラウザ毎に判定してみる
## Chrome
###ユーザーエージェントの確認

```js
var agent = window.navigator.userAgent;
console.log(agent);
// 実行結果
// VM126:1 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36
```
###判定方法

```js
var agent = window.navigator.userAgent.toLowerCase();
var chrome = (agent.indexOf('chrome') !== -1) && (agent.indexOf('edge') === -1)  && (agent.indexOf('opr') === -1);
console.log(chrome); 
// 実行結果：true
```
ユーザーエージェントに「chrome」という文字列が入っていて、かつ、「edge/opr」が入っていないことで確認可能。「chrome」という文字列はEdgeやOperaのユーザーエージェントにも含まれているため、これらを除去が必要。

## Edge
###ユーザーエージェントの確認

```js
var agent = window.navigator.userAgent;
console.log(agent);
// 実行結果
// Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134
```
###判定方法

```js
var agent = window.navigator.userAgent.toLowerCase();
var edge = (agent.indexOf('edge') !== -1);  
console.log(edge); 
// 実行結果：true
```
ユーザーエージェントに「edge」という文字列が入っている

## IE9
###ユーザーエージェントの確認

```js
var agent = window.navigator.userAgent;
console.log(agent);
// 実行結果
// Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0;
```
###判定方法

```js
var agent = window.navigator.userAgent.toLowerCase();
var ie9 = (agent.indexOf('msie 9.') !== -1);
console.log(ie9); 
// 実行結果：true
```
ユーザーエージェントに「msie 9」という文字列が入っている

## IE11
###ユーザーエージェントの確認

```js
var agent = window.navigator.userAgent;
console.log(agent);
// 実行結果
// Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; Tablet PC 2.0; rv:11.0) like Gecko;
```
###判定方法

```js
var agent = window.navigator.userAgent.toLowerCase();
var ie11 = (agent.indexOf('trident/7') !== -1);
console.log(ie11); 
// 実行結果：true
```
ユーザーエージェントに「trident/7」という文字列が入っている
**IE11から「msie」という文字列が削除されているため注意が必要**

##FireFox
###ユーザーエージェントの確認

```js
var agent = window.navigator.userAgent;
console.log(agent);
// 実行結果
// Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0
```
###判定方法

```js
var agent = window.navigator.userAgent.toLowerCase();
var firefox = (agent.indexOf('firefox') !== -1);
console.log(firefox);
// 実行結果：true
```
ユーザーエージェントに「firefox」という文字列が入っている

#最後に
SafariやOperaなど足りていないブラウザは、こちらの記事に載ってたので、参考にしてください
・[使用してるブラウザを判定したい](https://qiita.com/sakuraya/items/33f93e19438d0694a91d)
Eclipse設定・ショートカットメモ

某勉強会でひさしぶりにEcilpse(Pleiades)を使ってるけど、設定もショートカットもほとんど覚えていないので思い出しながらメモ。

でもバージョンが変わったせいか、Pleiadesのせいか、最初から設定済みの項目が多かった。。

# ショートカット

※ Eclipse3.6時代のメモです

|機能|キー|例|補足|
|---|---|---|---|
|今使えるキーアサイン一覧|Ctrl-Shift-l|||
|直前のエディタ|Ctrl-F6|||
|エディタ切替(タブの右)|Ctrl-PgDn|||
|エディタ切替(タブの左)	|Ctrl-PgUp|||
|カーソル位置も含めた履歴(戻る)|Alt-Left|||
|カーソル位置も含めた履歴(進む)|Alt-Right|||
|open中エディタの選択|Ctrl-e|emacsの^x b||
|open中エディタの一覧|Ctrl-Shift-e|emacsの^x^b||
|エディターをアクティブ|F12|||
|次のパースペクティブ|Ctrl-F8|||
|前のパースペクティブ|Ctrl-Shift-F8|||
|次のビュー|Ctrl-F7|||
|前のビュー|Ctrl-Shift-F7|||
|全部閉じる|Ctrl-Shift-w|||
|指定行へジャンプ|Ctrl-l|emacsの^x^g||
|次のメンバーへジャンプ|Ctrl-Shift-Down|||
|前のメンバーへジャンプ|Ctrl-Shift-Up|||
|インデント|Ctrl-i|emacsと同じ(^c^qはない?)|||
|キャレットの単語を選択|Alt-Shift-Up||Alt-Upだと1行上と行入れ替えなので注意|
|インクリメンタルサーチ|Ctrl-j|emacsの^s|||
|importの整理|Ctrl-Shift-o||便利|
|コードフォーマット|Ctrl-Shift-f||便利|
|キャレットのワードのハイライトon/off|Alt-Shift-o||フィールド変数やメソッドの参照箇所をハイライトする|
|問題点の即時修正|Ctrl+1||便利|
|ローカル変数の定義|Ctrl+2 l||右辺値を書いた後にタイプするとローカル変数として定義できる|
|フィールド変数の定義|Ctrl+2 f||右辺値を書いた後にタイプするとフィールド変数として定義できる|
|リネーム|Alt-Shift-r|||
|Javadocコメント|Alt-Shift-j|||
|Javaコメント|Ctrl-/|VCのCtrl-k Ctrl-c(コメント) Ctrl-k Ctrl-u(アンコメント)||
|Java/xmlコメント|Ctrl-Shift-c|||
|エラー箇所へジャンプ/差分箇所へジャンプ|Ctrl-.(次へ) Ctrl-,(前へ)||便利|
|ワークスペース内の参照を検索|Ctrl-Shift-g||便利|
|定義を開く|F3||基本|
|ブックマークの追加|Alt-e k|||
|単語補完|Alt-/|||

F3をすぐに使えるか否かで操作性がうんぬん


# 設定

以下、Pleiades 4.6.3 Neon Java Full Editionの個人設定
メニューの[ウィンドウ(W)]->[設定(P)]から。

- 一般
    - 「ヒープステータスを表示(W)」をチェック
        
        画面下部にヒープ(メモリ)使用量が表示される
        ![image.png](https://qiita-image-store.s3.amazonaws.com/0/256859/0bb88cf9-5fec-3adb-298c-e15b9cb37f40.png)

- 一般 | エディター | テキスト・エディター
    - 「タブでスペースを挿入」をチェック
        - ※ これでタブでなくスペースになるけど、JavaとかXMLとかHTMLなどファイル形式によってそれぞれ設定が必要。(textファイルならこの設定でスペースになる)
    - 「行番号の表示」をチェック(デフォルトでチェックされてる)
    - 「空白文字を表示」をチェック(デフォルトでチェックされてる)
        - 横の[可視性の構成]リンク押下して、空白の「末尾」をチェック
- 一般 | ワークスペース
    - 「テキスト・ファイル・エンコード」をその他の「UTF-8」に設定 (デフォルトで選択されてる)
- 一般 | 比較/パッチ
    - 「空白を無視」にチェック(デフォルトでチェックされてる)
- Java | コード・スタイル | フォーマッター
    - [新規(W)]からプロファイル名を適当に入力し、次のプロファイルで設定を初期化で「Pleiades[カスタム]」を選択して[OK]
        - 設定ダイアログ上部の「プロファイル名」を適当に変更
        - [インデント]タブ
            - タブポリシーを「スペースのみ」に設定
        - [制御ステートメント]タブ
            - 一般: 「'if'ステートメント内の'else'ステートメントの前に改行を挿入」をチェック
            - if else: 「'then'ステートメントを同じ行に保持」をチェック
            - if else: 「'else'ステートメントを同じ行に保持」をチェック
            - if else: 「'else if'を1行に保持」をチェック (デフォルトでチェックされてる)
        - [コメント]タブ
            - 一般設定
                - 「Javadocコメント・フォーマットを使用可能にする」をチェック
                - 「ブロック・コメント・フォーマットを使用可能にする」をチェック
                - 「ヘッダー・コメント・フォーマットを使用可能にする」をチェック
                - 「コードと行コメントの間に空白を保持」をチェック
                - 「行を結合しない」をチェック
            - Javadocコメント設定
                - 「ブランク行を除去」をチェック
            - ブロック・コメント設定
                - 「ブランク行を除去」をチェック
- Web | CSSファイル | エディター
    - 「スペースを使用したインデント」をチェック
- Web | HTMLファイル | エディター
    - 「スペースを使用したインデント」をチェック
- XML | XMLファイル | エディター
    - 「複数の属性をそれぞれ新規行に分割」をチェック
    - 「複数行要素タグに最終括弧を位置合わせ」をチェック
    - 「スペースを使用したインデント」をチェック

あと起動時のメモリ設定量とか昔はやってたけど、、、最初から`eclipse.ini`に`-Xms256m -Xmx1g`は設定されていた
Ubuntuが素晴らしい理由

Ubuntuを使うようになったきっかけ
---
プログラミングをしていると画像解析をしたいとおもいました。そしたら画像解析はMacのほうがいいという話を聞いたのですが僕が持っているパソコンはWindwsのみでした。わざわざ画像解析のためにMacを買うのは嫌なので同じUnix系であるLinux使えばいいじゃんとおもいました。そしてLinuxをデュアルブートしたらめちゃくちゃ使いやすかったので今はLinuxをメインで使っています。

Ubuntuが素晴らしい理由
---
- 安定性が高い
- 動作が軽い
- カスタマイズ性が高い
- CUIとの距離が近い
- GUIでも操作が完結するので初心者でもとっつきやすい
- デフォルトのアプリが良い

安定性が高い
---
これはWindowsから移行した人なら真っ先に感じると思います。WindowsだったらフリーズしまくっていたのがUbuntuになるとほんとに安定して動くようになります。バグも少ないです。これがUbuntuをやめられない一番の理由です。また、Windowsではほぼ強制的にアップデートさせられるのに対し、Ubuntuではアップデートをしないこともできるので大事なときにアップデートが入って大変な目に合うことが無いです。

動作が軽い
---
フリーズしないのと似ているかもしれません。Windowsよりも動作が軽いです。WindowsではファンがうるさかったのがUbuntuでとても静かになりました。特に僕のパソコンだとファンの音がとても気になるので助かります。

カスタマイズ性が高い
---
カスタマイズ大好きな人が多いプログラマーならこれは嬉しいとおもいます。パソコンを使っているとああしたいこうしたいとカスタマイズしたくなります。そこでWindowsではできなかったカスタマイズがUbuntuでできるようになりました。

CUIとの距離が近い
---
やっぱりLinuxといったらCUI。ファイル操作系のコマンドは覚えています。コマンドだと複数のファイルを簡単に処理できるなどGUI操作よりも優れていることもあります。GUIとうまく使い分けられるようになったらとても良いです。
![CUIの画面.png](https://qiita-image-store.s3.amazonaws.com/0/278637/07f5fd7f-8812-f47a-7ab3-e9175148914d.png)

GUIでも操作が完結するので初心者でもとっつきやすい
---
CUIで操作できるか心配な人でも大丈夫です。UbuntuはGUI操作だけでも十分使えます。なので基本はGUIで操作していて、少しずつコマンドを勉強するという使い方ができます。

デフォルトのアプリが良い
---
ファイルマネージャーなど、Windowsではサードパーティ製のソフトで使い易くしていたソフトもUbuntuなら十分デフォルトで使えます。例えば、ファイルマネージャーにデフォルトでタブの機能があります。僕はウィンドウが増えるとややこしくなるので、タブを愛用しています。これがデフォルトであるのはとてもうれしいです。
![filemag_tab.png](https://qiita-image-store.s3.amazonaws.com/0/278637/50274c3c-8857-2eb2-d268-b17ac7d616f6.png)

まとめ
---
Ubuntuはユーザーのことを考えて作られているというのを実感しました。やっぱりオープンソースはすごいです。今後のアップデートでどのような機能が追加されるかとても楽しみです。
git pushしたら403が返ってきた

## 状況

- GitHubのアカウントがいくつかある
- デフォルトで使っているものと違うアカウントのリポジトリなので `git config` でユーザー名とメールアドレスを変えた
- 初プッシュ
- `remote: Permission to jigen098/hoge.git denied to fuga.`

## 解決策

`git remote -v` で出てくるURLにユーザー名つける

```
origin	https://github.com/jigen098/hoge.git (fetch)
origin	https://github.com/jigen098/hoge.git (push)
```

このURLのgithub.comの前に下の例みたいにユーザー名つける

`git remote set-url origin https://jigen098@github.com/jigen098/hoge.git`
PHPで実行時間を同時に何箇所も計測する

PHPのプログラムのどこが遅いのかデバッグするときに何箇所にも計測地点を設定したいことがあります。
PEARのBenchmarkというライブラリがあるようなのでそれを使ってもいいのですが、クラスや関数を跨いでいたりすると面倒なのでグローバルスコープの変数を使って、以下の様なパフォーマンス計測の関数を作ってみました。

##コード

```php:
function setBenchMarker() {
    if ( !is_array($GLOBALS["benchmark"]) ) {
        $GLOBALS["benchmark"] = array();
    }
    $trace = debug_backtrace();
    $line = $trace[0]["line"];
    $file = $trace[0]["file"];
    array_push($GLOBALS["benchmark"], array("point"=>$file.":".$line, "time"=>microtime(true)));
}
function getBenchMarkResult($delim="\n") {
    $lasttime = 0;
    $lastpoint = 0;
    $retbuf = "";
    $records = $GLOBALS["benchmark"];
    foreach ( $records as $record ) {
        $point = $record["point"];
        $time  = $record["time"];
        if ( $lasttime != 0 ) {
            $retbuf .= "[".$lastpoint."]--[".$point."]  = ".sprintf('%0.5f', $time-$lasttime).$delim;
        }
        $lastpoint = $point;
        $lasttime = $time;
    }
    return $retbuf;
}
```

##使い方

処理の計測を始めたいところと、終わりに
setBenchMarker();
を書く。（複数の箇所に書いてもOK）
getBenchMarkResult();
で、計測結果を文字列として取得する。
echo や error_log などで結果を出力する。

```php:
class Hoge {
    public function __construct( ){}
    public function moge() {
        setBenchMarker();
    }
}
function foo() {
    setBenchMarker();
}

setBenchMarker();
foo();
$hoge = new Hoge();
$hoge->moge();
setBenchMarker();

$bench = getBenchMarkResult();
echo $bench;
```

##結果

[開始のプログラムのパス:行数]--[終了のプログラムのパス:行数]  = 実行時間

```
$ ./test.php
[/home/ec2-user/test.php:4]--[/home/ec2-user/test.php:21]  = 0.087116003
[/home/ec2-user/test.php:21]--[/home/ec2-user/test.php:30]  = 0.010456085
[/home/ec2-user/test.php:30]--[/home/ec2-user/test.php:9]  = 0.000001907
```
Minecraft Pi　基本操作からチートまで

#はじめに
　Raspberry Piで無料でプレイできるマイクラ、「Minecraft Pi Edition」。基本操作からサバイバルモードの導入、Pythonによるプログラミングまで書いていく。
#Minecraft Pi Editionとは？
　Raspberry Pi用に無料公開されているマイクラ。
#サバイバルモードの導入
　Pi Editionにはサバイバルモードがない。サバイバル民には衝撃発言かもしれないが、「無料」という凄さと引き換えにアイテム数はたったの103、クラフトモードなし、レッドストーンもなし、Mobは何一つない。バージョン名は、「v0.1.1 alpha」。
　しかし世の中には「泣かぬなら作ってみようホトトギス」みたいなヒトがいる。Pi Editionでサバイバルモードが使えるようになるパッチがあるのだ。
　というわけで、ありがたく導入させていただく(方法は[こちら](https://www.fabshop.jp/mincraft%E3%80%80%E7%AC%AC%EF%BC%93%E5%9B%9E%E3%80%80pi-edition%E3%81%AE%E3%82%B5%E3%83%90%E3%82%A4%E3%83%90%E3%83%AB%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AF%E3%82%A2%E3%83%AA%EF%BC%9F/)を参考にさせていただいた)。
　まず、バイナリ差分プログラムbsdiffをインストール。

```console:
$ sudo apt-get install bsdiff
```
　移動して、

```console:
$ cd /opt/minecraft-pi
```
　パッチファイルをダウンロード。

```console:
$ sudo wget https://www.dropbox.com/s/iutdy9yrtg3cgic/survival.bsdiff
```
　で、適用。

```console:
sudo bspatch minecraft-pi mcpipatched survival.bsdiff
```
　最後に実行権限を付与して終わり。

```console:
sudo chmod +x mcpipatched
```
　これで

```console:
sudo ./mcpipatched
```
　を打てば実行できる。

###基本操作
PC版と変わらない。一応記載しておく。

|                  |         　　　　   | 
|:----------------:|:-----------------:|
| W                |　      前進        |
| A                |        右進        |
| S                |        後退        |
| D                |        左進        |
| E                |     インベントリ     |
| shift            |      スニーク      |
| space            |      浮遊・着陸　   |

###Pythonでのプログラミング
　Minecraft Piでは、ScratchやPythonなどによるプログラミングができる。今回はPythonを使用する。環境は以下の通り。

　PC:Raspberry Pi 3 Model B+
　OS:Raspbian GNU/Linux 9.4 (stretch)
　Minecraft Pi Edition v.0.1.1 alpha
　Python3.5.3

　Minecraft Piを起動してワールドを開いたら、以下のコマンドでPythonを起動する。

```console
$ python3
```
　以下のプログラムを入力する。

```python3:
>>> from mcpi import minecraft
>>> mc = minecraft.Minecraft.create()
```

　メッセージを表示するには、postToChat()を使う。

```python3
>>> mc.postToChat("Hello world!")
# =>Minecraft Piの画面にHello world!と表示される。
```
 任意の座標に移動するには、player.setPos()を使う。

```python3
>>> mc.player.setPos(0, 1000, 0) #=>x=0, y=1000, z=0まで移動する。
```
　また、今の座標を取得するplayer.getPos()と合わせて以下のように使うこともできる。

```python3
>>> x, y, z = mc.player.getPos() #=>プレイヤーがいる座標を、xとyとzに代入する。
>>> mc.player.setPos(x, y+100, z) #=>その場で高度100まで上昇する。
```
　一つのブロックを置くには、mc.setBlock()を使う。

```python3
>>> x, y, z = mc.player.getPos()
>>> mc.setBlock(x+1, y, z, 1)
```
　４番目の引数はブロックのIDを表すのだが、その一覧は[ここ](https://www.stuffaboutcode.com/p/minecraft-api-reference.html)で確認できる。
　
#終わりに
　・マイクラは楽しい。
　・ラズパイはすごい。
　以上です。Raspberry Pi4が発売されたので、近いうちに買ってスペックの高さを実感してみたい……！
<メモ> ServiceNow ATF でテストステップを自作する

#テストステップを自作する

## 1. 前提
最近ServiceNowをやりはじめた初心者

ServiceNow Kingstonバージョン

Automated Test Frameworkでのテスト作成時
ステップ「フィールド値の設定」


## 2. やりたいこと

以下のようなフィールドがある。

- String型
- 選択肢が設定されている
- 選択肢がクライアントスクリプトなどで動的に設定されている

このフィールドに値を設定したいが、値の入力欄がリストによる選択形式になっている。当然、動的に追加される選択肢は表示されない。こまった。なんとかして値を設定したい。

## 3. やってみる

_[こちら]
(https://docs.servicenow.com/bundle/kingston-application-development/page/administer/auto-test-framework/concept/atf-custom-step-types.html)_をみる

>You can only create configurations for steps that run on the Server. You cannot create configurations for steps that run on the browser.

ブラウザでスクリプトを実行するテストステップは自作できない、とある。たしかに sys_atf_step_config の新規作成フォームの Step environment フィールドでは「UI」が選べない。

## 4. UIのテストは諦めた
### 4.1. 標準機能でのレコード作成or更新ではできないのか

できない

Record Insert や Record Update なるテストステップがあるが、同じように値の入力欄がリストによる選択形式で表示されてしまう。

Input Variables （入力変数） である field_values が、それぞれのフィールドの設定をよみといて、値の入力欄をテキストボックスやリストによる選択形式にしてくれているようにみえる。

field_valuesの定義を見ると、ServiceNowの利用者には参照できない
element_mapping_provider=com.glide.automated_testing_framework.ATFVariableElementMapper

### 4.2. じゃあ自分で作れないのか 

サーバーでスクリプトを実行することができるなら、GlideRecord-APIが使える。

以下のようにしてレコードを作成することができた。

```
(function executeStep(inputs, outputs, stepResult, timeout) {
	var nr = new GlideRecord(inputs.u_table);
	nr.initialize();
	nr.samplecol = inputs.u_samplecol;
	var nrid = nr.insert();
	if (nrid) {
		stepResult.setSuccess();
		stepResult.setOutputMessage("あなたはレコードの作成に成功した。samplecolの値は「" + nr.samplecol +"」だ。");
		
		outputs.u_samplecol_reference = nrid;
	} else {
		stepResult.setFailed();
		stepResult.setOutputMessage("あなたはレコードの作成に失敗した。");
	}
	
	
}(inputs, outputs, stepResult, timeout));
```

UIのテストステップも自作できるようにしてほしい。。。

おしまい
No static method getFontエラー

#No static method getFont　エラーについて
上記のエラーが出たので解決策を示します。

[環境]
Android OS version 7.0


## devendencyを合わせる
build.gradleの下記を揃えることで直ります。

1. compileSdkVersion
2. targetSdkVersion
3. support Library verseion

##修正前

```build.gradle
compileSdkVersion 27
targetSdkVersion 27
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support.constraint:constraint-layout:1.1.0'
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support:recyclerview-v7:26.1.0'
    implementation 'com.android.support:design:26.1.0'
    implementation 'com.android.support:cardview-v7:26.1.0'
    implementation 'com.android.support:leanback-v17:26.1.0'
}

```


##修正後

```build.gradle
compileSdkVersion 27
targetSdkVersion 27
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support.constraint:constraint-layout:1.1.0'
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support:recyclerview-v7:27.1.1
    implementation 'com.android.support:design:27.1.1'
    implementation 'com.android.support:cardview-v7:27.1.1
    implementation 'com.android.support:leanback-v17:27.1.1'
}

```

26.1.0となっていたところをcompileSdkVersion に合わせて27.1.1に変えました。
バージョンを合わせる必要がありました。
Alexa開発メモ

Windows10環境でpython3を使用しalexaのskill開発を行うメモ

#開発環境

#リンク
alexa道場
https://developer.amazon.com/ja/alexa-skills-kit/webinars

#ASK CLI
リファレンス
https://developer.amazon.com/ja/docs/smapi/ask-cli-command-reference.html
## 準備
1.Node.jsをインストール

## 使い方
###スキルの新規作成
リファレンス
https://developer.amazon.com/ja/docs/smapi/ask-cli-command-reference.html#new-command

```sh
ask new
ask new --template
```

###デプロイ
```sh
ask deploy
```
注意事項として、「.ask/config」ファイルの
[deploy_settings]-[endpoint]-[uri]にスキル名が入るので、全角や記号がある場合は英字のみにすること。

###クローン
```sh
ask clone -s <スキルID> 
```

#python
リファレンス
https://developer.amazon.com/ja/docs/sdk/alexa-skills-kit-sdk-for-python.html

SDKのセットアップ
https://alexa-skills-kit-python-sdk.readthedocs.io/ja/latest/GETTING_STARTED.html

##python仮想環境
SDKのセットアップにある「オプション1： SDKを仮想環境にセットアップする」の仮想環境を構築する。
仮想環境
https://www.python.jp/install/windows/virtualenv.html

上記ページを参考にインストールし、仮想環境を構築する。

```sh
py -m pip install virtualenv
py -m virtualenv skill
```

仮想環境に移動し、SDKをインストールする

```sh
skill\Scripts\activate
pip install ask-sdk
```

##pythonテンプレート

```sh
ask new --template CloneMe --url https://s3.amazonaws.com/jk-ask/templates.json --skill-name "my skill"
```
skill.jsonの"en-US"を"ja-JP"に変更
modules/en-US.jsonのファイル名をja-JP.jsonに変更

# わからないこと
・自分のスキルをクローンし、一部を変更して新規スキルとする方法
Db2のHADR構成構築メモ（SSL編）

[ネイティブ暗号化で暗号化したDBを作成](https://qiita.com/ch7821/items/7f53340032a4d639a146)し、[HADR構成を組んだ](https://qiita.com/ch7821/items/274b36460f89ec61b90f)ら、お次はHADR通信の暗号化。

Db2における暗号化と暗号鍵保持の仕組みは、[Db2ネイティブ暗号化](https://qiita.com/ch7821/items/7f53340032a4d639a146)に記載した。HADRのSSL通信においても基本的には同じ。
ネイティブ暗号化用キーストアとは別にできるが、今回はネイティブ暗号化用と同じキーストアに自己署名証明書を追加し、さらにこれをスタンバイ側にも同期することにする（プライマリとスタンバイとでそれぞれ自己署名証明書を作成するなら、公開鍵証明書をお互いにインポート要）。

ほとんど文末の参考資料にあるマニュアル通りの手順となる。

# 前提環境
+ RHEL 7.3
+ Db2 v11.1
+ Database HADRDB

# HADRのSSL通信用自己署名証明書の作成
```bash
# -cert -createで自己署名証明書作成
./sqllib/gskit/bin/gsk8capicmd_64 -cert -create -db ./keystore/keystore.p12 -stashed\
-label "hadrcert" -dn "CN=db1.mognet.net.local,OU=mognet.net.local,C=JP"
# -cert -listで確認
./sqllib/gskit/bin/gsk8capicmd_64 -cert -list -db ./keystore/keystore.p12 -stashed

# （今回は不要だが証明書を出力するには-cert -extract）
./sqllib/gskit/bin/gsk8capicmd_64 -cert -extract -db ./keystore/keystore.p12 -stashed \
 label hadrcert -target "/tmp/standby.arm" -format ascii -fips

# STANDBY側へキーストアごと転送
scp ./keystore/keystore.p12 ${standbyHostname}:./keystore
```

# DBM CFG変更（PRIMARY/STANDBYとも）
```bash
# キーストア登録
db2 "UPDATE DBM CFG USING 
SSL_SVR_KEYDB /db/dbinst/keystore/keystore.p12
SSL_SVR_STASH /db/dbinst/keystore/keystore.p12 
"

# 設定有効化のため再起動
db2 "DEACTIVATE DB HADRDB"
db2stop
db2start
```

# HADR通信のSSL有効化（PRIMARY/STANDBYとも）
```bash
# DB CFG更新
db2 "UPDATE DB CFG FOR HADRDB USING HADR_SSL_LABEL hadrcert"

# STANDBY→PRIMARYの順にDBをACTIVATE
db2 "ACTIVATE DB HADRDB"
```

つけたラベル名さえ間違えなければ、`db2pd -hadr -db hadrdb`でSSLが有効になっていることを確認できる。

```text:db2pd
 HADR_FLAGS = SSL_PROTOCOL
```

HTTPの世界では、証明書のCNとURLホスト部が一致していないと、ユーザエージェント（つまりクライアントであるブラウザ）に対し警告を出力したりするが、製品同士の内部通信なので特にそのようなチェックはしていないようだ。
というわけで、同じ鍵と証明書を使ったHADRピアも技術的に可能だった。

# 参考資料
+ [公式マニュアル](https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.admin.sec.doc/doc/t0070228.html)
vimiumで情報収集力を高めよう！！[vimiumチートシート]

# はじめに
ウェブブラウザをもっと便利に使えないかなということで見つけたアドオンであるvimiumについて紹介します。

# vimium(vimium-FF)とは
webブラウザをvimライクに使えるようにするアドオン（FFはFirefox版）。
手をキーボードのホームポジションから動かすことなく多くの動作ができるため、非常に使い勝手がよく、マウスへ手を動かさないため、慣れてくると爽快にブラウジングができる。

google-chrome : [vimium](https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb)
vivaldi : [vimium（chromeと同じ）](https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb)
firefox       : [vimium-FF](https://addons.mozilla.org/ja/firefox/addon/vimium-ff/)

以上のページからアドオンを入手できる。

# 動作方法
以下が普段使用するキーマッピングのチートシートです大文字のキー入力は`Shift`と同時押しという意味です。これ以外にもありますので、知りたい方はvimiumを追加した状態で`?`を入力してください。`help`が表示されます。

|キー入力|動作|
|---|---|
|j|下スクロール|
|k|上スクロール|
|h|左スクロール|
|l|右スクロール|
|d|下へ半ページ移動|
|u|上へ半ページ移動|
|gg|ページ最上部へ移動|
|G|ページ最下部へ移動|
|f|ページ内のリンクをマッピング(そのキーを入力するとジャンプ)|
|F|ページ内のリンクをマッピング(そのキーを入力すると新タブで開く)|
|t|新タブを開く|
|gi|一番上の入力ウィンドウに入力|
|o|新しいタブで検索|
|J|タブを左へ移動|
|K|タブを右へ移動|
|H|戻る(back)|
|L|進む(forward)|
|x|タブを閉じる|
|X|消したタブをもとに戻す|
|yy|現在のURLをコピー|
|p|コピーしてあるURLをカレントタブで開く|
|P|コピーしてあるURLを新タブで開く|
|ｒ|ページの再読込|
|/|ページ内検索|
|n|検索結果次へ|
|N|検索結果前へ|
|i|インサートモード|

# あまりvimium自体にこだわりすぎないほうが良い？？
使ってみたら思うのですが、たまにおかしくなることがあります。その際は取り敢えず`Esc`を押してみます。それでもダメならwebブラウザ自体のショートカットもしくはマウスを使用しています。便利にするためのアドオンに拘りすぎて逆に不便にしちゃわないように注意してください。
普段よく使うwebブラウザ自体のショートカットも軽く紹介しておきます。

|キー入力|動作|
|---|---|
|Ctrl+tab|タブ移動（右）|
|Ctrl+Shift+tab|タブ移動（左）|
|Ctrl+w|タブ消去|
|Ctrl+r|タブの再読込|
|F5|タブの再読込|
|Ctrl+t|新タブを開く|
|Alt+←|戻る(back)|
|Alt＋→|進む(forward)|
|Space|１ページ下へ|
|Shift+Space|１ページ上へ|

# 最後に
とても便利だし、アドオンなのでインストールがなく楽に使い始められて好きにやめられるので、是非試しに使ってみてほしいです。

また、こんな便利なのもあったよというものがあれば教えていただけると幸いです！
NodejsでBashのsplitコマンドっぽい処理を書く

## はじめに
Node.jsで重たいファイルを扱う際に、bashの<code>split</code>コマンドっぽく、
ファイルを行ごとに分割したかったので作ったものを備忘録として残す。
Bashのコマンドとオプションを合わせたので、Bashっぽく使えるのがポイント。

## コード

### bashのsplitコマンド

```bash:split.sh
$ split [OPTION]... [FILE [PREFIX]]
```

#### オプション（一部）

* -l, --lines=NUMBER
    - 分割するファイルの行単位
* -d, --numeric-suffixes
    - 指定あり: [PREFIX000, PREFIX001, PREFIX002...]
    - 指定なし: [PREFIXaaa, PREFIXaab, PREFIXaac...]
* -a, --suffix-length=N
    - 出力ファイルに付加する文字列の長さ

### Nodejs版

```javascript:split.js
const fs = require('fs');
const readline = require('readline');

function createAlphabetSuffix(num, length) {

    let i = num;
    let str = '';

    while (i > 0) {
        str = String.fromCharCode(97 + (i % 26)) + str;
        i = Math.floor(i / 26);
    }

    return str.padStart(length, 'a');

}

function createNumericSuffix(num, length) {
    return String(num).padStart(length, '0');
}

module.exports = function split(file, options = {}) {

    return new Promise((resolve) => {

        let {
            prefix = 'x',
            lines = 100,
            suffixLength = 3,
            numericSuffixes = false
        } = options;

        const rs = fs.createReadStream(file);
        const rl = readline.createInterface(rs);

        let index = 0;
        let ws;

        rl.on('line', (line) => {

            let i = index++;

            if (i % lines === 0) {

                ws && ws.close();

                const suffixIndex = Math.floor(i / lines);
                const suffix = numericSuffixes
                    ? createNumericSuffix(suffixIndex, suffixLength)
                    : createAlphabetSuffix(suffixIndex, suffixLength);

                ws = fs.createWriteStream(`${prefix}${suffix}`);

            }

            ws.write(line + '\n');

        });

        rl.on('close', () => {
            ws && ws.close();
            resolve();
        });

    });

};
```

#### オプション
|オプション|初期値|説明|
|:---|:---|:---|
|prefix|x|出力するファイルのベース名|
|lines|100|出力するファイルの行数|
|suffixLength|3|出力ファイルに付与する文字列の長さ|
|numericSuffixes|false|出力ファイルに付与する文字列を数値にするか|

#### サンプル
```javascript:useSplit.js
const split = require('./split');

(async () => {

    await split('./largeFile.txt', {
        prefix: 'smallFile',
        lines: 10,
        suffixLength: 4,
        numericSuffixes: true
    });

})();
```

```bash:result
$ node useSplit.js
$ ls | grep smallFile
# smallFile0000
# smallFile0001
# smallFile0002
# ...
```

## 最後に
意外に探しても見つからなかったので作ってみました。
他に良い方法があればご指摘ください。
elseを使わない条件分岐

##はじめに
returnの概念で沼にハマったので記載

##以下は同じ
```js

var number = "1"
  if( number == "1"){
    return true;
  }else{
    return false;
  }
//true

var number = "1"
  if( number == "1"){
    return true;
  }
  return false;
//true
```

##理由
上はifを使った単純な条件分岐です。
今までしっくり来ていなかったのは下なのですが、
return が来るとその時点でScriptが終わってしまうためです。

下の場合でいうと、
数字が1なのでそのまま進みreturn　trueを発火させて終わりですが、
数字が1以外の場合は、return　trueをスキップするため、Scriptが終わらず
return　false　で終わることになります。

##検証用
```js

function demo() {
  
  var number = "2"
  
  if( number == "1"){
    return true;
  }
  return false;
  
}

Logger.log(demo());//上のfunction demoという関数の結果をログ出力する
```
jQueryのValidateに体力を削られた話

C#のViewModelにDataAnnotaionを付けて
入力チェックをしていた。

しかし、日付の範囲チェックが既存にないため、
非常に困ったことになった。

View側は、

````
<div>
<select></select>年
<select></select>月
<select></select>日
</div>
```
という形式になっており、
各プルダウンに入力チェックをつけれなければならない。
しかも、日付の範囲は可変ときた。

クライアント側とサーバ側両方に入力チェックが必要なのだが、
サーバ側の実装はControllerで何とかなる。
問題はクライアント側である。

入力チェックをした後、
確認ダイアログをjQueryで表示するソースになっているため、
jQueryのValidateを自前で拵えることになった。

```
$("#year").rules("add", {
            min: @(Model.MinYear),
            max: @(Model.MaxYear),
            messages:{
               min : "Year is min",
               max : "Year is max"
            }
});
```

同様に月、日の分まで作って解決。
めでたしめでたし。
docker-composeでDatadog Agentを使う

続き：[docker-composeのPHPでDatadogAPMを試してみる](https://qiita.com/hiroelza/items/7b800f3d0b87cd660b33)

ついにDatadogAPMのPHPのβ版がリリースされました！
というわけでDatadogAPMを動かす為にdocker-composeでDatadog Agentを動かるようにする準備のメモになります。
## doker-composeの準備
```doker-compose.yml
  hogehoge:
    image: hogehoge
    container_name: hogehoge
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./httpd/vhosts.conf:/etc/httpd/conf.d/vhosts.conf
      - ./admin/:/var/www/
    links:
      - dd-agent:dd-agent
    depends_on:
      - dd-agent

  dd-agent:
    container_name: dd-agent
    image: datadog/docker-dd-agent
    environment:
      - API_KEY=[API_KEY]
      - DD_APM_ENABLED=true
    volumes:
     - /var/run/docker.sock:/var/run/docker.sock
     - /proc/mounts:/host/proc/mounts:ro
     - /sys/fs/cgroup:/host/sys/fs/cgroup:ro
    ports:
      - "8126:8126/tcp"
```

基本的に下のDatadog Agentを追加すれば動くと思います。
上を追加して

```
docker-compose up -d
```

とかその辺のコマンドで起動すると
![dashboard.png](https://qiita-image-store.s3.amazonaws.com/0/145107/3b92bc06-139a-740d-7eaf-f8b6fd633f4d.png)
ダッシュボードで見てるようになっていると思います。
PHPのAPM編に続きます。

参考：[Dockerで始めるDatadog](http://engineer.crowdworks.jp/entry/2017/03/03/174731)
Rails Generatorのtemplateで変数を利用する

## やりたいこと

こんなtemplateがあったとします

```erb
<%= mtd %>
<%= @varialbe %>
```

この変数をgeneratorで定義したいのだけど、どうやればいいのかわからない

## 結果

Thor::Action#templateで`Erb.new().result(binding)`を呼んでいました。
そのため、generatorのオブジェクトで定義をするだけで良さそうです

## やり方

publicメソッドはジェネレータを実行時に呼び出されてしまうのでprivateにします

```
class HogehogeGenerator < Rails::Generators::NamedBase
  source_root File.expand_path('templates', __dir__)

  def add
    @variable = "変数だよ"
    template("src.erb", "dest")
  end

  private

  def mtd
    "methodだよ"
  end
end
```

結果

```
$ bundle exec rails g hogehoge hoge
Running via Spring preloader in process 49225
      create  dest
$ cat dest
methodだよ
変数だよ
```
the safety EC2 hack

俺です。

紀元前から稼働する古のEC2を調査して一体何がどうなってるのか調べることがたまにあると思います。
事故らないように調査する方法を書き残します。

シェルコマンドはRHEL系を例として載せてますです。

# 調査しよう

今動いてる奴らを記録しよう

```
# netstat -an > /root/unko.txt
# ps -ef > /root/unkounko.txt
# chkconfig --list > /root/unkounkounko.txt
などなど
```

# AMIを作ろう

- やばそーなのはchkconfig offする
- sync;sync;syncしたあとno rebootでcreate-imageします
- create-imageが終わったらchkconfig onします

# AMIを起動しようでもちょっとまって

EC2の中で何が仕込まれているかわかったもんじゃありません。

- cronでDB更新して事故るかもしれない
- mailが飛んでいって事故るかもしれない
- 謎の力で外部api kickされて事故るかもしれない

# AMI調査専用のVPCとSecurity Groupを作る

- AMIを叩き上げるだけの専用VPCを作ります
- 以下のルールでコミュ障SG作り、インターネットの深淵から出てこれないようにします
- inbound: 俺のグローバルIPとメンテナンス経路のポート(例えば3389 or 22)
- outbound: ルールなし(deny)


# EC2を起動する

- IAM Role(Instance Profile)はナシで起動する
- コミュ障SGだけ当てる
- 何もおきないことを祈る

# lets調査

- 今こそ謎を解き明かすのだ藤岡弘、探検隊


# 調査が終わったら..

- 何が動いていたのかドキュメントを書きます
- terminateします


おわり
Ruby on Rails 5 + MySQLで中間テーブルをつくる

Ruby on Railsで中間テーブルを作ろうと思います。


例としてBlogというプロジェクトにArticleとTagモデルを作り、
Article_tagsモデルを作ります。
（多対多の関係です。
複数の記事に複数のタグをつけることができる、タグは複数の記事をもつことができる。）

scaffoldと、migrationを使用して作成します。

###実装すること
タグの詳細ページ（localhost:3000/tags/{tagのid}/）
にそのタグが関連づいている記事(article)を表示するようにします。




###手順
scaffoldコマンドでArticle,Tagを作成します。
id(pkey),updated_at,created_atは特にしていなくてもDBのカラムとして作られます。

``` 
rails generate scaffold Article title:string body:string
rails generate scaffold Tag name:string
```

マイグレーションを実行します。

```
bundle exec rake db:migrate
```


中間テーブル用のモデルを作成します。

```
 rails generate model ArticleTags article:references tag:references
```

もういちどマイグレーションを実行します。

完成したマイグレーションファイルを以下のように変更します。

```
class CreateArticleTags < ActiveRecord::Migration[5.2]                           
  def change                                                                     
    create_table :article_tags do |t|                                            
      t.references :article, foreign_key: true                                   
      t.references :tag, foreign_key: true                                       
                                                                                  
      t.timestamps                                                                                             
    end                                                                          
  end                                                                            
end                                                                                                                                                                                            
```


マイグレーションを実行します。

```
bundle exec rake db:migrate
```



####モデルの編集
app/models/article_tag.rb 
に

```
belongs_to :article
belongs_to :tag
```
app/models/article.rb 
app/models/tag.rb 
それぞれに

```
has_many :article_tags
```
を追記します。

####ビューの編集
app/views/tags/show.html.erb 
を編集することにします。

```
<% @tag.article_tags.each do |article_tag| %>                                                                         
    <%= article_tag.article.title %>
    <%= article_tag.article.body%>
<% end %>
```

これで中間テーブルを設定して、異なるモデルの情報を取得することができました。
(レポート)N-Agile(仮) #1 価値観ババ抜き大会

# はじめに
2018/11/02に立ち上げた社内アジャイルコミュニティ「N-Agile(仮)」の第1回目企画として、[N-Agile(仮) #1 価値観ババ抜き大会](https://n-agile-community1.peatix.com/view)を実施しました。
今回はそのレポートです。

![IMG_1744.JPG](https://qiita-image-store.s3.amazonaws.com/0/221788/c60cea34-270f-803b-1750-2d3e4ce7988a.jpeg)

# N-Agile(仮)とは
NRI社内でのアジャイルを実践する／したい人たちが集まり、とにかく色んなことを「やってみよう」という趣旨のコミュニティです。先週発足し、KICKOFFをしたばかりのコミュニティです。
名前はまだない。

# 価値観ババ抜きとは
チームビルディングとして活用できるゲームの１つです。60枚の価値観が記載されたカードを使って、自分自身の価値観に向き合うとともに、相手の価値観にも深く迫っていくことができます。
本家は[コチラ](http://myvaluecard.com/)

# イベントレポート
初回でドキドキしていましたが、参加者はなんと14名。同じ部の方はほぼなし。色んな部署の方が参加していただけました。
今回は、5分のアイスブレイクのあと、30分間価値観ババ抜きを行いました。

![IMG_1743.JPG](https://qiita-image-store.s3.amazonaws.com/0/221788/1cb50700-dfb6-f77b-e3e6-fa5a02e1599c.jpeg)
![IMG_1745.JPG](https://qiita-image-store.s3.amazonaws.com/0/221788/497eeaaf-5765-1b16-116d-89365c14fff6.jpeg)

ほとんどの方が、初めて会った人同士でしたが、ゲームを進めていくにつれ、笑いも増え、相手がどんな人なのかも理解が深まり、打ち解けていきました。

短い時間でも、ゲームを通じて価値観が共有でき、コミュニケーションがとりやすくなる。そんな効力を皆さんが感じ取っていただけたようです。
![IMG_1750.JPG](https://qiita-image-store.s3.amazonaws.com/0/221788/0f9e7812-4d9e-1da4-bc91-b1f7a0635aa0.jpeg)

# 今後の予定
しばらくは社内での実施が続きます。
[N-Agile（仮） #2 ツール四方山話～あなたの好きな／使いたいツールは何～？](https://n-agile-community2.peatix.com/view)
[N-Agile（仮） #3 ゴールを共有するインセプションデッキ～われわれはなぜここにいるのか～](https://nri-agile-community3.peatix.com/view)
興味のある方は、ぜひご参加ください！
また、社外の方も、生暖かく応援のほどよろしくお願いいたします。

![IMG_1752.JPG](https://qiita-image-store.s3.amazonaws.com/0/221788/aa9bba64-a87c-847b-e272-814dd3eaf64f.jpeg)
IEventArgsConverterインターフェイス（MVVM Light Toolkit リファレンス）

# IEventArgsConverter
## 概要

```csharp
public interface IEventArgsConverter
```

- `EventToCommand`クラスが使う、`EventArgs`を変換するコンバーターのクラス。

##### 名前空間
- `GalaSoft.MvvmLight.Command`

#### アセンブリ
- GalaSoft.MvvmLight


## メソッド
### Convert
<details><summary>Convert</summary><div>

```csharp
object Convert(object value, object parameter)
```

##### 概要
- `EventArgs`である`value`を、コマンドで利用する値に変換するメソッド。
- `value`は、`EventToCommand`を添付したコントロールのイベントに渡される引数。
- `parameter`は、`EventToCommand.EventArgsConverterParameter`で指定した値。

##### 戻り値
- `EventArgs`である`value`を、変換した値。この値が、コマンドに渡される。
</div></details>


## 参照
- [目次](https://qiita.com/h084/items/c5355fa734936c56ca50/)
- [EventToCommand](https://qiita.com/h084/items/9667077286111ab546ee)
youtube-dlでファイル名にトラック番号を付与する

プレイリストの番号通りに整理したいって時に便利なやつ

## やり方
- ``` -o ``` オプションで出力ファイル名の設定できる
    - 各属性の名前については公式のドキュメント参照
 
``` youtube-dl -o '%(playlist_index)s %(title)s' [URL]```

- ↑で[プレイリストの番号][動画タイトル]の形で出力される
BashからZshへ変更する方法（Macユーザー向け）

まず基本的にMacではBashが使われています。

これをZshというものに変更する方法を紹介します。

ではなぜわざわざBashからZshに変更する必要があるかというと、
Zshは他のShell（Bash含め）の良い機能を備えた万能なShellであるからです。

主なZshのメリットとして、
-充実した補完機能
-スペルミスが自動修正される
-とにかくカスタマイズ性に優れている

が挙げられます。
多少操作が必要ですが、そこまで難しくありませんので、順をおってコマンドを入力していくと良いでしょう。
##Zshのインストール

```
$ brew install zsh
```
###一応バージョンも確認
ちゃんと表示されていればOKです

```
$ zsh --version
zsh 5.6.2 (x86_64-apple-darwin17.7.0)
```
##シェルに登録
/etc/shellsは複数のシェルが入っているファイル。
ここにインストールしたZshも入れましょう。
viコマンドでファイルを操作します。この際`sudo`でないと操作できません。

```
$ sudo vi /etc/shells
```
すると下のような文章が出るので、末尾に`/usr/local/bin/zsh`を加えます

```
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/zsh
```

ちなみに、viはコマンドモードと入力モードに分かれています。
最初はコマンドモードになっているので、`i`を押して入力モードにしましょう。
そして方向キーで末尾まで行って`/usr/local/bin/zsh`をペースト。
そのあと`esc`キーで再びコマンドモードにし、`:wq`で編集を保存できます。

##シェルのデフォルトをZshに

```
$ chsh -s /usr/local/bin/zsh
```
とにかくこのコマンドでZshがデフォルトになります。
一旦ターミナルを閉じて、再度開いた時にZshになっていれば成功です。

##Zshを設定する
ここからZshの設定をカスタマイズして使いやすいものにしていきます。


-手段１:oh-my-zshをインストールする
   oh-my-zshはzsh用の設定フレームワークです。

-手段２:Preztoをインストール

-手段３:zgenをインストール

しかしoh-my-zshは古くて、起動が遅いなどデメリットがあるらしい。
だから選ぶとしたら、Preztoやzgenをおすすめします。
zgenの場合、https://github.com/tarjoilija/zgen
にしたがって操作すれば簡単に、設定ができます。
ちなみに完成した画面が下になります。
![alt](https://qiita-image-store.s3.amazonaws.com/0/304501/40d2431a-da9f-88df-0ba8-710a162d112a.png)
)
今までのターミナルとは違い、色付きの矢印が表示されました。
また下図のようにコマンドに応じて色も変わります。
![alt](https://qiita-image-store.s3.amazonaws.com/0/304501/a4332efe-0cc6-869c-96a7-1d8633dee2ef.png)

zshにすることでよりターミナルの操作が快適になりますのでぜひインストールしてみてはいかがでしょうか？
create-react-app 2.xで作ったReactアプリでFlowが動かない

**正しくは[こいつ](https://flow.org/en/docs/install/)の通りにやっても動かねえってことなんですけど。**

create-react-app 2.xからBabelが7になったっぽいので、[Flowの公式チュートリアル](https://flow.org/en/docs/install/)通りには動かねえってことですね。

じゃあどうするかっつうと

```bash
yarn add -D @babel/preset-flow flow-bin
```

キモは**@babel/preset-flow**。7用のBabelプリセットを突っ込んでるところです。babel-cliも古いので多分いらないです

あとはbabelのpresetsに

```text
@babel/preset-flow
```

を投げ込むだけですね。

**[Tellable](https://tellable.tinykitten.me)というツイのオタクと割と簡単に喋れるサービス作ってます。誰か使って。**

🍣食いたい。誰か奢って。
Pythonではじめる機械学習　レポート①

# 1章　はじめに
## 訓練データとテストデータ
　機械学習において、膨大なデータを収集して予測モデルを訓練する際、
訓練に使うデータと、性能を評価するデータを分けておく必要がある。

　訓練に使ったデータをそのまま評価データに使ってしまうと、
常に正確な結果しか返さないため、
新しいデータを使った時に予想した性能を発揮しない。

　逆に、新しいデータに対して常に正しい予測を返せる状態になることを
**汎化(generalize)**という。

## k-最近傍法(k-Nearest Neighbors)
　クラス分類アルゴリズムの1種であるk-最近傍法は、
訓練データとk個の近傍点を指定するだけで使える教師なし学習アルゴリズムである。

　新しいデータを使って予測する際に、
データに対して一番近い点を訓練データから探して
分類付けするアルゴリズムである。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/314381/046c5bd9-b0e1-b0ab-94e9-60779056d17c.png)

　ちなみに、入力データはExcel形式のような
n次元配列となる。

## まとめ
　scikit-learnでk-最近傍法を使うには、
KNeighborsClassifierを使う。

```
knn = KNeighborsClassifier(n_neighbors=1)
knn.fit(X_train, y_train)
```
Macでwaifu2x-converter-glslを導入するときに躓いたこと

#環境確認

環境：
 MacOSX Mojave10.14.1
 Xcode 10.1
 Homebrew 1.8.2

>参考サイト
>http://yuukiar.co/blog/2015/06/15/setup-waifu2x-on-mac/#waifu2x-converter-cpp-(wl-amigo)

とりあえず必要なOpenCV3.4.3とGLFW3.2.1をHomebrewでインストール。
`$ brew install opencv glfw`

#Waifu2x-converter-glsl
次にgitでwaifu2x-converter-glsl取ってくる。

`$ git clone https://github.com/ueshita/waifu2x-converter-glsl
$ cd waifu2x-converter-glsl
$ open build/waifu2x-converter-glsl.xcodeproj`


#ビルド
Xcode開いてプロジェクトを立ち上げる

`$ xcodebuild -project build/waifu2x-converter-glsl.xcodeproj -scheme waifu2x-converter-glsl -configuration Release -derivedDataPath DerivedData`

と実行するとエラー発生。

`User defaults from command line:
    IDEDerivedDataPathOverride = /Users/hoge/waifu2x-converter-glsl/DerivedData
note: Using new build system
note: Planning build
note: Constructing build description
(中略)
** BUILD FAILED **
The following build commands failed:
	Ld /Users/hoge/waifu2x-converter-glsl/DerivedData/Build/Products/Release/waifu2x-converter-glsl normal x86_64
(1 failure)
`

どうやらXcodeのビルドが失敗しているらしい。

#原因：GLFWまわり
ターミナルの代わりにXcode上でBuildしてみる。
やはりBuild Failed…
Xcode上のエラーを右クリック→Reveal in Logで見ると-lglfw3でエラーを吐いているらしい。
`clang: error: linker command failed with exit code 1 (use -v to see invocation)
ld: library not found for -lglfw3`

>参考サイト
>http://dmoviex.hatenablog.com/entry/2016/12/24/131917

Xcodeが当時とUIが違っているので迷うが、
infoやBuildSettingsのタブと並んでいるwaifu2x-converter-glslを開いてProjectのwaifu2x-converter-glslからTargetのwaifu2x-converter-glslに切り替えて、
BuildPhasesのタブ→Link Binary with Libraryを開く。

`glfw3.a`を削除して、`/usr/local/Cellar/glfw/3.2.1/libglfw.3.2.dylib`をドラッグドロップで読み込ませて再実行。

#原因；OpenCVまわり
再びエラー。
今度は`libopencv_imgproc.3.0.0.dylib`が原因らしい。
削除して`/usr/local/Cellar/opencv/3.4.3/libopencv_imgproc.3.4.3.dylib`をドラッグドロップで読み込ませて再実行。

再び、`libopencv_imgcodecs.3.0.0.dylib`が原因でエラー。
削除して`/usr/local/Cellar/opencv/3.4.3/libopencv_imgcodecs.3.4.3.dylib`を読み込ませて再実行。

なんとかエラーが起きずにBuild Succeeded。


`$ xcodebuild -project build/waifu2x-converter-glsl.xcodeproj -scheme waifu2x-converter-glsl -configuration Release -derivedDataPath DerivedData
$ cp DerivedData/Build/Products/Release/waifu2x-converter-glsl .
`

`$ waifu2x-converter-glsl`

で無事実行できました。
使い方は配布元の本家様や`--help`を参照
>本家様
>https://github.com/ueshita/waifu2x-converter-glsl
factorybotでデータを継承したい

## TL;DR

factorybotであるデータを継承して一部だけ書き換えたいなケースがあって、どうしたらいいのか？と思ったらTwitterで教えてもらったのでメモ。

## 例:

ユーザを作成するFactoryBotのテストデータを定義

```ruby
FactoryBot.define do
  factory :user do
    name { Faker::FunnyName.name }
    email { Faker::Internet.safe_email }
  end
end
```

今まではこれでよかった。
上記の例くらいの数なら呼び出し元で最悪作成するテストデータを指定すればよい。

んだけど、それだとちょっと面倒くさいことが発生するようになった。
たくさんのパラメータを持つモデルで同じ記述を何度もコピペするのか？と疑問に思っていたところこうすればいいよ！と教えてもらえた。

こういうときTwitterは便利。

```ruby
FactoryBot.define do
  factory :user do
    name { Faker::FunnyName.name }
    email { Faker::Internet.safe_email }
  end
  factory :other, parent: :user do
    status { 'active' }
  end
end
```

とするとちゃんと `:user` で設定されたテストデータを継承してくれます、便利。

## まとめ:

最初はクラス名=テストケース名なテストデータがあれば自動的に他のテストデータも継承されるものだと思っていたのですが、実際使うときにそれだと書き方や順序を意識しないといけないのでそんなわけないのですよね…ということに実行したあとで気づきました。

FactoryBotに限らないのですがRspecなどもなんとなく雰囲気で使っている感を自覚していたので今度コールドリーディングして知識の深掘りをしないといけないなと言う感じの反省をしています。
AWS fargate での signal について

## せっかちな人向けの結論

停止命令があった時 SIGTERM が送られ、それから30秒起動し続けたら SIGKILL が送られる。

## AWS fargate とは

AWS fargate (以下、fargate) は、AWS のマネージドな docker 実行環境です。
最近、[東京リージョンでも使うことができるように](https://aws.amazon.com/jp/blogs/news/aws-fargate-tokyo/)なりました。

## docker における signal

docker は、そのコンテナ内で自由にプロセスが立ち上がります。
外部からストップを送る場合、基本的には docker コンテナ内の PID 1 のプロセスに SIGTERM が送られます。
その後、起動が続いた場合、 SIGKILL が送られます。

## fargate における signal

fargate においてはどうなのかを調べたところ、公式にかのように書いていました。

~~記事書くためにもう一度探したら、日本語で書いてあった。~~
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/update-service.html
>更新中にサービススケジューラがタスクを置き換えるとき、ロードバランサーがサービスによって使用されている場合、サービスはまずロードバランサーからタスクを削除し、接続のドレインが完了するのを待ちます。その後、タスクで実行されているコンテナに docker stop と同等のコマンドが発行されます。この結果、SIGTERM 信号と 30 秒のタイムアウトが発生し、その後に SIGKILL が送信され、コンテナが強制的に停止されます。コンテナが SIGTERM 信号を正常に処理し、その受信時から 30 秒以内に終了する場合、SIGKILL 信号は送信されません。サービススケジューラは、最小ヘルス率と最大ヘルス率の設定で定義されているとおりに、タスクを開始および停止します。


つまり、「停止命令があった時 SIGTERM が送られ、それから30秒起動し続けたら SIGKILL が送られる。」になります。

## 最後に

そもそもこれをなぜ調べたかというと、 fargate で 途中で止まる可能性のあるタスクを行う必要があったためです。
調べた結果、猶予時間30秒ではどうしよもないので、他の方法を考えることにします。
LambdaからDAX（DynamoDB Accelerator）にアクセスしたときの備忘録


DynamoDBにめっちゃ書き込んで、めっちゃ読み込むサービスの設計のためにDAXの調査をしていました。

LambdaとDAXを連携させるメリットは[ここ](https://aws.amazon.com/jp/blogs/database/how-to-increase-performance-while-reducing-costs-by-using-amazon-dynamodb-accelerator-dax-and-aws-lambda/)にもある通り、

```
For serverless applications, DAX provides an additional benefit: Lower latency results in shorter Lambda execution times, which means lower costs.
```

そう、Lambdaの実行時間が減ればやすくなるよね！ということ。
早速試してみました

環境
---

* AWS Lambda(node.js8.1)


【困ったこと】LambdaではデフォでDAXを扱うライブラリが入っていない。
---

[ここ](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DAX.client.run-application-nodejs.html)にあるとおりDAXの利用はnodejsでは下記のライブラリを使います。

```
amazon-dax-client
```

これは、Lambdaにデフォで入っていません。
なので、`amazon-dax-client`が入ったものをzip化してアップロードするしかありません。

【苦戦】DAXにつながらない
---

結論からいうとLambdaの実行ロールであるIAMポリシーに下記のポリシーが足りていませんでした。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "dax:*"
            ],
            "Effect": "Allow",
            "Resource": [
                "*"
            ]
        },
        {
            "Action": [
                "dynamodb:*"
            ],
            "Effect": "Allow",
            "Resource": [
                "*"
            ]
        }
    ]
}
```

これは、`AmazonDynamoDBFullAccess` を紐付けることで解決します。

### なぜ四苦八苦したのか。
それは自分のエラーメッセージ理解力が問題でした。

表示されていたメッセージたち

```
UnhandledPromiseRejectionWarning: Error: NoRouteException: No endpoints available
```

```
{ Error: NoRouteException: not able to resolve address: [{"host":"***************","port":8111}]
```

```
Failed to pull from ********.dax.apne1.cache.amazonaws.com (10.0.1.47): { Error: Client does not have permission to invoke Endpoints
```

これをSecurityGroupまわりの設定ミスなのか？ :tired_face: いや合っているはずなんだけどな :tired_face: とドツボにハマってました。

SecurityGroupはTCP、ポート8111、許可するもの（IP、セキュリティグループID）でオッケーです。
Chromeの画像認識API

# はじめに

この記事は社内LT向けの資料です。


---

# Shape Detection API

Chrome 70で試験実装。フラグONで使える。
→ chrome://flags/#enable-experimental-web-platform-features を Enabled に変更

<img width="804" alt="chrome_flags.png" src="https://qiita-image-store.s3.amazonaws.com/0/19403/58dcee6a-b7eb-8348-f408-09cdcf7ceaa5.png">


---

# 顔検出、バーコード認識、テキスト認識

- [Accelerated Shape Detection in Images](https://wicg.github.io/shape-detection-api/)
    - FaceDetector ... Android, MacOS 10.13+, Windows 10
    - BarcodeDetector ... Android, MacOS 10.13+
- [Accelerated Text Detection in Images](https://wicg.github.io/shape-detection-api/text.html)
    - TextDetector ... Android, macOS 10.11+, Windows 10
    - Google Play Services, Apple’s CIDetector (bounding box only, no OCR) or Windows 10 OCR API. 
    - detection in images of Latin-1 text as defined in [iso8859-1]

---

# デモ

https://filin-g.appspot.com/_direct_/tool/chrome/detection.html

---

# FaceDetector の使い方

※なぜかWindows 10, Macとも顔のパーツ(landmark)が検出できない

```js
let faceDetector = new FaceDetector();
faceDetector.detect(src) // src = <img>, <video>, <canvas>
.then(faces => {
  if (faces.length > 0) {
    let face = faces[0]; // 1個以上見つかるケースもある。ここでは最初のものだけ

    // 矩形
    const top = face.boundingBox.y;
    const left = face.boundingBox.x;
    const width = face.boundingBox.width;
    const height = face.boundingBox.height;

    const landmarks = face.landmarks;
    // なぜか検出できていない
    // landmark = landmarks[0];
    // landmark.locations[0].x , landmark.locations[0].y
    // lanrmark.type; // mouth, eye, nose
  }
  else {
    // --- 顔が見つからない場合 ---
  }
})
.catch(e => {
  console.error("Face Detection failed: " + e);
});
```

---

# BarcodeDetector の使い方

※Windows 10では使えない

```js

let barcodeDetector = new BarcodeDetector();
barcodeDetector.detect(src) // src = <img>, <video>, <canvas>
.then(barcodes => {
  if (barcodes.length > 0) {
    let barcode = barcodes[0]; // 1個以上見つかることもある
    const top = barcode.boundingBox.y;
    const left = barcode.boundingBox.x;
    const width = barcode.boundingBox.width;
    const height = barcode.boundingBox.height;

    // --- format , string --
    const format = barcode.format;
    const str = barcode.rawValue;
  }
  else {
    // --- 見つからない場合 ---
  }
})
.catch(e => {
  console.error("Barcode Detection failed: " + e);
});
```

---

# TextDetector の使い方

※なぜかWindows 10 では使えない。Macでは制約としてテキストの中身は取れない

```js

let textDetector = new TextDetector();
textDetector.detect(src) // src = <img>, <video>, <canvas>
.then(textBlocks  => {
  if (textBlocks.length > 0) {
    let text = textBlocks[0];
    const top = text.boundingBox.y;
    const left = text.boundingBox.x;
    const width = text.boundingBox.width;
    const height = text.boundingBox.height;

    // --- string --
    const str = text.rawValue;
  }
  else {
    // --- 見つからない場合 ---
  }
})
.catch(e => {
  console.error("Text Detection failed: " + e);
});
```

---

# まとめ

- 画像識別はクラウドAPIだけでなく、デバイスでもできるようにになってきている
- Chromeでは試験的実装が始まっている、いずれ標準になるかも
    - 中身はOpenCVを使っていると予想（未確認）

以上、ご質問は？
xargs で function を呼び出す話。[shell xargs function]

問題：
bashで使おうと書いた関数をxargs経由で使おうと思ったらできなかった。（BSD系)

```shell
<cmd> | xargs <My関数>
```

```shell:一旦すぐ思いつく事試す
#　ダメ
<cmd> | xargs -n 1 <My関数>
#　ダメ
<cmd> | xargs -I% <My関数> %
```

だめだったので、ググって解決したのだ。
http://wrist.hatenablog.com/entry/20120603/1338691396

```shell 
export -f <My関数>
<cmd> | xargs -I% bash -c '<My関数> %'
```

`export`して`sh -c`というのは納得です、こう言うことをググらないで考えられるようになりたい！
でもググっちゃう＞＜

---

追記

以前1行で書こうとして失敗していたが、疑問は氷解したので追記。

以前の失敗事例↓

```sh:失敗例
# 1行にしたら失敗した。そう言うものなんでしょうか...。
export -f <My関数> | <cmd> | xargs -I% bash -c '<My関数> %'
```
内容としては、パイプラインとサブシェルのよくある話だった。
https://fumiyas.github.io/2013/12/10/lastpipe.sh-advent-calendar.html
失敗理由としては、
メインシェルとサブシェルがあって、パイプラインはサブシェルで実行される事。
そして`bash -c`は新しいプロセスで実行するという事。
ということはつまり、一つ目の`export -f <function>`がサブシェルで行われるとすれば、サブシェルの中でexportされるが、しかし`bash -c`で実行される新しいプロセスでは余所のサブシェルがexportした物は当然ながら見れないので、失敗します。
 ではどうするかというと、メインシェルの方でexportしておけばよいわけで上述の通りexportしてからパイプラインを実行するという形になるわけですね。
敢えて1行にするのであれば、メインでexportしてからパイプラインを実行すればよいだろうと。
例↓

```sh:例
export -f <My関数> ; <cmd> | xargs -I% bash -c '<My関数> %'
```
ちなみにこういう時にはプロセス置換も使えるという事が結びついて分かってきたので嬉しい。



~~＜以下、混乱中のこと＞
`export`はビルトインで、環境変数設定したりするときに使う。
　　`-f`オプションは指定のシェル関数を参照するようにexportする。
　ここで、しかし現在のプロセスでシェル関数を呼び出せてるのに、なぜパイプで渡すときにここでexportしないといけないのかわからない。　
そうだ、パイプの先はサブシェルになるからか・・・、例えば.bashrcに関数定義をしていた場合はそれはサブシェルには読み込まれないから、事前に環境変数にexportしておけばよいと・・・。
と思って試してみたけど、パイプの先からもシェル関数を呼び出すことができた・・・。サブシェルは元プロセスの変数を参照できるのだから当然と言う感じだ。（xargsを使うとやっぱりできないわけで。）
サブシェルは関係ないのだろうか？
ということは、xargsを使うことの問題だろうか、でも、xargsもサブシェルを起ち上げてるらしいのだが、、、。そんなに特別なサブシェルなのか、なんなのか
ふむ、気になる。~~

参考
http://171rr.blog.fc2.com/blog-entry-14.html
https://code.i-harness.com/ja/q/a7e61a