OmniAICreator/Qiita-1.07M huggingface dataset:
docker コマンドリファレンス

# 概要

docker,docker-composeに関するコマンドのまとめです。
新しいコマンド体系で書き直しました。

# docker container

* 実行中のコンテナにアタッチ

``` bash
$ docker container attach
```

* コンテナに対する変更から新しいイメージを作成

``` bash
$ docker container commit
```

* コンテナとローカル間でファイルとディレクトリのコピー

``` bash 
$ docker container cp
```

* 新しいコンテナの作成

``` bash
$ docker container create
```

* イメージとコンテナの変更情報を調べる

``` bash
$ docker container diff
```

* 実行中のコンテナ内でコマンド実行

``` bash
$ docker container exec
```

* コンテナのファイルシステムをtarアーカイブ化

```
$ docker container export
```

* コンテナの詳細情報を表示

```
$ docker container inspect
```

* コンテナのプロセスを停止(kill)

```
$ docker container kill
```

* コンテナのログを表示

```
$ docker container logs
```

* コンテナ一覧の表示

```
$ docker container ls
```

* コンテナのプロセスを一時停止(pause)

```
$ docker container pause
```

* コンテナが使用しているポート情報の表示

```
$ docker container port
```

* 停止中の全コンテナを削除

```
$ docker container prune
```

* コンテナの名称を変更

```
$ docker container rename
```

* コンテナを再起動

```
$ docker container restart
```

* コンテナの削除

```
$ docker container rm
```

* 新しいコンテナを実行

```
$ docker container run
```

* 停止中のコンテナを起動

```
$ docker container start
```

* コンテナのリソース使用状況を表示

```
$ docker container stats
```

* 実行中のコンテナを停止

```
$ docker container stop
```

* コンテナが実行しているプロセスを表示

```
$ docker container top
```

* 一時停止中のコンテナを再開

```
$ docker container unpause
```

* コンテナの（リソース）設定を変更

```
$ docker container update
```

* コンテナが停止するまで待機

```
$ docker container wait
```

# docker image

* Dockerfile からイメージを構築（ビルド）

```
$ docker image build
```

* イメージの履歴を表示

```
$ docker image history
```

* tar 形式のファイルを読み込み、イメージを作成

```
$ docker image import
```

* イメージの詳細情報を表示

```
$ docker image inspect
```

* tar 形式または標準入力からイメージを読み込む

```
$ docker image load
```

* イメージ一覧表示

```
$ docker image ls
```

* 使用していないイメージを削除

```
$ docker image prune
```

* イメージをレジストリから取得

```
$ docker image pull
```

* イメージをレジストリに送信

```
$ docker image push
```

* イメージを削除

```
$ docker image rm
```

* イメージを tar 形式または標準出力にストリーム

```
$ docker image save
```

* イメージを参照する新しいタグを付ける

```
$ docker image tag
```
vs2010でmanaged directx その17

#概要
c#で、3Dやりたかった。
レイトレやってみた。

#写真

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/a54bd30b-9ffc-3280-9b4b-fd795ff61663.png)



#サンプルコード

```
struct VS_IN {
	float4 Pos: POSITION;
	float4 color: COLOR;
};
struct VS_OUT {
	float4 Pos: POSITION;
	float4 color: COLOR;
	float2 coord: TEXCOORD;
};
VS_OUT VSmain(VS_IN In)
{
	VS_OUT output = (VS_OUT) 0;
	output.Pos = In.Pos;
	output.color = In.color;
	output.coord = In.Pos.xy;
	return output;
}
float4 PSmain(VS_OUT In): COLOR
{
	float4 color = float4(0.0, 0.0, 0.0, 0.0);
	float2 coord = In.coord;
	float2 center = float2(0.0, 0.0);
	float dist = distance(coord, center);
	if (dist < 0.5)
	{
		center = float2(0.1, 0.1);
		dist = 1.0 - distance(coord, center) * 2.0;
		color = float4(1.0, dist, 0.0, 1.0);
	}
	return color;
}

technique MyTechnique
{
	pass MyPass
	{
		VertexShader = compile vs_2_0 VSmain();
		PixelShader = compile ps_2_0 PSmain();
	}
}


```

以上。
Navigator による画面遷移

## 任意の画面にいきなり遷移

`WidgetBuilder` とともに `MaterialPageRoute` という router を `Navigator.push` すれば良い。

```dart
Navigator.push(context, MaterialPageRoute(builder: (context) {
  return MyScreen(foo: "bar");
}));
```

これでどこからでも好きな画面に遷移できる。

## 通常の画面遷移

ちなみにきちんと名前をつけてある route はこのように遷移する。

```dart
Navigator.pushNamed(context, '/settings')
```

このとき `Navigator` は自身に登録されているルーティング情報から適切に Route を作り遷移する。

## onUnknownRoute

`Navigator` を初期化するときに `onUnknownRoute` というのを指定することができる。`MaterialApp` からでも指定することができる。名前から推測できるとおり指定された名前に対応する Route が存在しなかったときに使われる。

## 続く

`/pages/1` みたいなルーティングは既存の `Navigator` では実現できないように見えるけどどうなんだろ？🤔

↑`context` から `Navigation` を取得して現在の path かなんかを取得できるだろうから、それを使えばできそうやな。
Navigator.pop の第2引数で戻り値を返せる

画面遷移し、戻ってきた時に戻り値を受け取る:

```dart
final result = await Navigator.of(context).push(
  MyRoute<dynamic>(...)
);
print(result); // => "done!"
```

結果とともに前の画面に戻る:

```dart
Navigator.pop(context, "done!");
```

Dropdown Menu なんかもこの仕組みで値を返している。
excelのmatch関数で驚いた話

# 2019/08/27 追記
この記事は、正しくない前提で動かした挙動について語っていた事がコメントによりわかりました。
なので、読む意味はほぼないと思います。

# 見つけた経緯
たまたまexcelで関数使っていろいろやっていたら偶然見つけた

# そもそもMATCH関数とは
Microsoftさんいわく、
>MATCH 関数は、範囲 のセルの範囲で指定した項目を検索し、その範囲内の項目の相対的な位置を返します。たとえば、範囲 A1:A3 に値 5、25、38 が含まれている場合、数式「=MATCH(25,A1:A3,0)」を入力すると、範囲内では 25 が 2 番目の項目であるため、数字 2 が返されます。

(MATCH関数 https://support.office.com/ja-jp/article/match-%E9%96%A2%E6%95%B0-e8dffd45-c762-47d6-bf89-533f4a37673a より引用)

つまり、**ある範囲の中で、どこに探したい値があるかを調べる**関数。

## MATCH関数の使い方
MATCH関数は、
```MATCH(検索したい値,検索したい範囲,照合の型)```
というふうに記述し、

|引数|説明|
|:--:|:-:|
|検索したい値|そのまんま。数字とか文字列とか|
|検索したい範囲|これもそのまんま。ただし、行や列を指定する場合は、一行または一列まで。(帰ってくる値がその行とか列の何番目かを示すから、二次元だと困ってしまう)|
|照合の型|これだけ別枠で説明|

### 照合の型とは
Microsoftさんいわく、
>省略可能です。-1、0、1 の数値のいずれかを指定します。照合の型には、検査範囲の中で検査値を探す方法を指定します。この引数の既定値は 1 です。

(引用元は先程示したリンクと同じです)  
これが書かれているページのすぐ下にそれぞれの値の詳しい話が載っているので詳しくはそこを見てもらって、
重要な点を抜き出すと、

|引数|説明|
|:--:|:-:|
|-1|検索したい値より小さい、最大の値|
|0|完全一致|
|1|検索したい値より大きい、最小の値|

こんな感じ。

### 真実 (2019/08/27 追記)
コメントの方で、自分の理解に間違いがあることがわかりました。

|引数|説明|
|:--:|:-:|
|-1|検索したい値以下の最大の値を探す。**昇順前提**|
|0|完全一致|
|1|検索したい値以上の最小の値を探す。**降順前提**|

#今回見つけたケース
ここまでは長いけど、前置き。
本題はここからで、

例えば、下のような表があったとする

| |B|
|:--:|:--:|
|1|ID|
|2|15|
|3|12|
|4|13|
|5|14|
|6|14|
|7|15|
|8|18|
|9|15|
|10|15|

このとき、
`MATCH(12,$B$2:$B$10,-1)`
`MATCH(12,$B$2:$B$10,0)`
`MATCH(12,$B$2:$B$10,1)`
は、それぞれ「2、2、2」を返す。[^1]

[^1]: わかっていると思うが、「`$B$2:$B$10`」は絶対参照の記号

この挙動は正しく[^2]、とくに問題はない。

[^2]: ~~こちらに勘違いがなければ...~~ やはり自分の理解に間違いがあったんだなって。

では、次の動作はどうなるか
`MATCH(15,$B$2:$B$10,-1)`
`MATCH(15,$B$2:$B$10,0)`
`MATCH(15,$B$2:$B$10,1)`

自分が予想していたものは、上から「1、1、1」もしくは「1、6、9」を返すというもの。
実際は、上から「1、1、6」を返すというものだった。

**どういうことなの...**

結果だけ見ると、それぞれ「一番始め、一番始め、二番目の場所」を示している。

**なんでそうなった???**

~~ということで、誰か詳しい方いたら教えてください。。。~~
@Keisuke0 さんのコメントで解決しました。ありがとうございました。

# 余談、というか続き

これを一桁のみの値、つまり、

| |B|
|:--:|:--:|
|1|ID|
|2|1|
|3|2|
|4|3|
|5|4|
|6|1|
|7|5|
|8|1|

みたいな感じでやって、
`MATCH(1,$B$2:$B$10,-1)`
`MATCH(1,$B$2:$B$10,0)`
`MATCH(1,$B$2:$B$10,1)`
これを見てみたら、上から「1、1、1」だった...
これもうわかんねぇな...
google appengine standard environment 2nd generation for php72 でサービスを使う

2nd generation になってから使えなくなった機能が多いので、service は使えるのかな？と思って確認してみた。
結論から言うと、 1st generation と違いがないので、特に読む必要はない。

 # ドメイン名の設定に関して特に説明してませんが、想像できると思います。

# アプリのファイル構造

* dispatch.yaml
* backend/
 * app.yaml
 * index.php
* frontend/
 * app.yaml
 * index.php

# ファイルの内容

```yaml:dispatch.yaml
dispatch:
  - url: "frontend.example.com/*"
    service: default
  - url: "backend.example.com/*"
    service: backend
```

```yaml:backend/app.yaml
runtime: php72
service: backend
```

```php:backend/index.php
I'm backend
```

```php:frontend/app.yaml
runtime: php72
service: default # frontend を default にしている
```

```php:frontend/index.php
I'm frontend
```

# deploy

```shell:console
$ gcloud app deploy dispatch.yaml backend/app.yml fronend/app.yaml

~~ 省略 ~~

Custom routings have been updated.

You can stream logs from the command line by running:
  $ gcloud app logs tail -s <service>

To view your application in the web browser run:
  $ gcloud app browse -s <service>
```

# 動作確認

```html:backend.example.com/
I'm backend
```

```html:frontend.example.com/
I'm frontend
```

```html:example.com/
I'm frontend
```

# 最後に

frontend の service 名が default なのでホスト名がない (サービス名を指定しない場合や、存在しないサービス名を指定した場合) 場合は、 frontend が表示されています。
GoogleのBigQueryで「イーサリアム」のブロックチェーンのデータを解析してみました！

米Googleは8月30日に企業向けビッグデータ解析クラウドサービス「BigQuery」で分散アプリプラットフォーム「Ethereum（イーサリアム）」のブロックチェーンデータを解析できるようにしたと発表しました！
<a href="https://cloud.google.com/blog/products/data-analytics/ethereum-bigquery-public-dataset-smart-contract-analytics">https://cloud.google.com/blog/products/data-analytics/ethereum-bigquery-public-dataset-smart-contract-analytics</a>

いままではイーサリアムのブロックチェーン上に保存されていたすべての情報にアクセスすることができなかったので、ブロックチェーン全体で一番トランザクションが行われているものなどを調べることは難しかったです。
しかし、それができるようになったのが今回のBigQueryです！
<h4><span style="text-decoration: underline;">BigQueryとは？</span></h4>
もともとBigQueryとは、ビッグデータ解析サービスとして有名です。
BigQueryは数TB(テラバイト)あるいはPB(ペタバイト)に及ぶデータに対して、SQLと似たクエリを実行し、数秒あるいは数十秒で結果を返してくれます。

参照: <a href="https://www.buildinsider.net/web/bigquery/01" target="_blank" rel="noopener">誰でも簡単に超高速なクエリができるBigQueryとは？</a>
<h4><span style="text-decoration: underline;">実際にイーサリアムの情報にアクセスしてみました！</span></h4>
では、今回は実際にBigQueryを使用してイーサリアムのブロックチェーンでもっとも頻繁に使用されているsmart contractを調べてみましょう

まずBigQueryに登録しましょう
登録の手順は下記のgoogleのドキュメントを参照してみてください
<a href="https://cloud.google.com/bigquery/sign-up?hl=ja" target="_blank" rel="noopener">BigQuery に申し込む</a>

&nbsp;

登録終了後、BigQueryで作成したprojectに入ってください。
(僕の場合、BlockChain Investigationです。)
そして、下記の画像の<span style="color: #ff0000;">「compose query」</span>を押してQueryを作成する画面に移動してください。

<img class="alignnone wp-image-101 size-full" src="https://harukiyasui.com/wp-content/uploads/2018/09/Screen-Shot-0030-09-06-at-5.46.55-PM.png" alt="" width="1292" height="866" />

&nbsp;

すると以下のような画面になると思います。
<img class="alignnone wp-image-102 size-full" src="https://harukiyasui.com/wp-content/uploads/2018/09/Screen-Shot-0030-09-06-at-5.48.04-PM.png" alt="" width="1701" height="854" />

ここのNew Queryに下記をコピー&amp;ペーストしてください。
```SELECT contracts.address, COUNT(1) AS tx_count
FROM `bigquery-public-data.ethereum_blockchain.contracts` AS contracts
JOIN `bigquery-public-data.ethereum_blockchain.transactions` AS transactions ON (transactions.to_address = contracts.address)
WHERE contracts.is_erc721 = TRUE
GROUP BY contracts.address
ORDER BY tx_count DESC
LIMIT 10```

このQueryは、イーサリアムのブロックチェーン上でもっとも使用されているスマートコントラクトを上からランキング形式で10個出力するというものです。
では、赤色のボタンの<span style="color: #ff0000;">「RUN QUERY」</span>を実行してみましょう！
すると下記のような結果が出てくると思います。(下記は2018年9月5日のものです。)

<img class="alignnone wp-image-74 size-full" src="https://harukiyasui.com/wp-content/uploads/2018/09/Screen-Shot-0030-09-06-at-7.05.01-AM.png" alt="" width="960" height="808" />
tx_countはトランザクションの回数です。1位だけ飛び抜けてますねw
ちなみに1位のスマートコントラクトは、<a href="https://www.cryptokitties.co/" target="_blank" rel="noopener">CryptoKitties</a>で主に使用されているスマートコントラクトでした。

BigQueryを使用することで、ゲームを使っているユーザーがどれぐらいいるかのデータ収集も可能になります。
例えば、以下はCryptoKittiesで「最低10個のキティ(子ネコ)を所有するアカウントの状態を視覚化」したものです。
色は所有者を表し、サイズは各キティのランクを表しています。

<img class="alignnone wp-image-75 size-full" src="https://harukiyasui.com/wp-content/uploads/2018/09/cryptoKitties.png" alt="" width="679" height="700" />

BigQueryを利用することで、トランザクションやウォレット残高などの情報へ簡単にアクセスできるようになりました。
これらの機能を利用して、今後ブロックチェーンの懸念点の発見や改善における意思決定などにBigQueryが使われていきそうですね。
KotlinのObjectのインスタンスを書き換える

# まえがき
　この記事ではKotlinのObjectのインスタンスを書き換える方法を紹介しますが、本来そのようなことはしない方が良いです。書き換える必要が発生した時点で設計を見直した方が良いです。この事を念頭に置いて読んでください。

[ブログ](https://5hyn3.github.io/posts/change-kotlin-object-instance/)にもまとめました。

# 方法

以下のような関数を使います。

```kotlin
fun changeObjectInstance(target: Any, mock: Any) {
    val kClass = Class.forName(target::class.qualifiedName).kotlin
    val field = kClass.java.fields.first()
    val modifiersField = Field::class.java!!.getDeclaredField("modifiers")
    modifiersField.isAccessible = true
    modifiersField.setInt(field, field.modifiers and Modifier.FINAL.inv())
    field.isAccessible = true
    field.set(null, mock)
}
```

　Objectのインスタンスを書き換えられるようにするために、リフレクションを活用して`INSTANCE`のfinalを外したりして無理やり書き換えてしまいます。


# 使用例

　これは関数の引数名に`mock`とあるように、テスト時にObjectのインスタンスをmockに差し替えるために使うことができます。例えば以下のようなFooオブジェクトとそれを利用するHogeクラスがあります。

```kotlin
object Foo {
    fun bar() = 1
}

class Hoge {
    fun huga() = Foo.bar()
}
```

この時、

`Hoge::huga()を実行した時、Foo.bar()が1度だけ呼ばれている事`

という事を確認できるテストをしたいと考えたとします。プロパティとして定義されている変数であれば、Mockitoでfiled injectionしてやれば良いのですが、Objectを使ってしまっているとそうもいきません。そこで上記の`changeObjectInstance`を使います。Objectのmockを作成して、以下のようにします。

```kotlin
changeObjectInstance(Foo, mockFoo)
```

こうする事で、Objectのインスタンスがmockに書き換えられました。あとはMockitoであれば、

```kotlin
val hoge = Hoge()
hoge.huga()
Mockito.verify(mockFoo,times(1)).bar()
```

としてやる事で、所望のテストを書くことができます。テスト実行後は他のテストに影響しないように、書き換えたインスタンスを元に戻しておきましょう。

# おわりに

リフレクションを使いすぎるとコードの可読性が悪化するなど、デメリットが多数存在します。くれぐれも、用法用量を守って使ってください。冒頭にも書いたように、可能であれば設計を見直すなど、使わない方向での解決策を模索する事をお勧めします。

# 参考
https://stackoverflow.com/questions/3301635/change-private-static-final-field-using-java-reflection
BPMBOXES  プロセスメーカー日本語バージョン　音声画像認識　ロボット解析でのＢＰＭＳ

#ＢＰＭＳ　プロセスメーカーとＬＩＮＥを連携させて　プログラムはＧＡＳでできるように設定

全体像　少しずつ説明をいれていく BPMSをやる人がふえればなーと
GOOGLE APPS SCRIPT で　業務間の拡張操作はできるようにしたので
いろんな意味で　フロー　ＧＡＳ　ＬＩＮＥ　での連携業務をつくるには面白いと思う

機能　ＧＯＯＧＬＥＣＬＯＵＤの大体の機能

まーこれだけあれば　あとはいろいろと　話せて面白いと思う

なんとかく　技術だけというより　総合して全体を作れる基盤があって
それには　フローシステム　機械学習　フロントのチャット

それぞれをプラグインとして統合できるものがあれば
フローの各部分のタスク処理は　機械解析やいろんな部分で補っていく
#MINDMAP 構想
https://www.mindmeister.com/167899908/bpm
![mindmap.JPG](https://qiita-image-store.s3.amazonaws.com/0/37985/6c95dd9e-48b2-9e50-e527-acf138b93928.jpeg)

#フロント　音声　画像認識　機械解析　とＢＰＭＳの連携
![frontimage.JPG](https://qiita-image-store.s3.amazonaws.com/0/37985/bf4c6c67-0722-0b8b-7f7a-7101dcdb81dc.jpeg)

画像認識
音声認識
文章解析
翻訳機能
音声よみあげ
音声もじおこし
ライン　チャットワーク　ＳＬＡＣＫ
ＣＭＳ　ＷＯＲＤＰＲＥＳＳ　ＢＬＯＧＧＥＲ　ＥＣサイト
連携操作

#processmaker 情報
https://www.processmaker.com/
#processmaker 音声認識で業務分岐（ルーティング）
業務の分岐は　音声認識　機械解析の結果で分岐　登録画面はＧＡＳで作成（ＢＰＭＳはルーティング方法が重要なのでまとめていく）
この部分に各種ＲＰＡをいれ　各種登録情報の内容で　査定条件など分岐
![voice.JPG](https://qiita-image-store.s3.amazonaws.com/0/37985/1f708f88-ec6f-bfc7-9f6a-3c2ec8b89c72.jpeg)
#processmaker 連携画面　日本語版
![image1.JPG](https://qiita-image-store.s3.amazonaws.com/0/37985/11e0e5dd-ab9f-4222-b5df-90498e52993a.jpeg)

#processmaker 検索プラグイン
業務で検索系は特に重要な為そこは　Laravelなど組み合わせて専用の業務検索システムを作成
![image2.JPG](https://qiita-image-store.s3.amazonaws.com/0/37985/a1d01649-1169-7aa3-a26c-5c266f6cd6e5.jpeg)

#processmaker LINE業務フロー
![image3.JPG](https://qiita-image-store.s3.amazonaws.com/0/37985/0954640d-6526-2dd6-5bbe-a32f2c4302cb.jpeg)

#作業進行状況の確認　プロセスマップ
![作業状況.JPG](https://qiita-image-store.s3.amazonaws.com/0/37985/01451a74-39b9-c638-69a2-4dcd7d9f09b7.jpeg)

#processmaker ＧＡＳプラグイン設定（フロー制御は全てＧＡＳで作成）
![plugin.JPG](https://qiita-image-store.s3.amazonaws.com/0/37985/fd3e8e5d-9eb0-15ab-fd03-e066d456fb04.jpeg)

#processmaker 画面作成（ＤＲＡＧ＆ＤＲＯＰ）
![displaymake.JPG](https://qiita-image-store.s3.amazonaws.com/0/37985/b0e98692-752a-cefd-4cc2-269de8f8b684.jpeg)

#processmaker データベース作成（画面から作成）
ＢＰＭＳの場合　画面を作成して画面項目から　データベースを作成する　
プログラマーでない業務の方も作成できるのがメリット

![database.JPG](https://qiita-image-store.s3.amazonaws.com/0/37985/0082da72-6336-7a0d-2bf2-6a08c16d2e7e.jpeg)
データサイエンス初心者のメモ[1日目]

#概要
共同研究のアルバイトでデータサイエンス~~っぽいこと~~をすることになったので，忘れないようメモとして残すことにします．
企業さんから（詳しくは書けませんが）あるデータログを頂きました．それに対して処理を行っていきます．
##jupyter-notebook
[Jupyter-notebook](http://jupyter.org/)を使おうと思います．
自分はanaconda環境を使用しているので，
`conda install jupyter`
でJupyter-notebookをインストール．使用したいディレクトリに移動して
`jupyter notebook`
でWebブラウザからPythonのプログラムを実行できるツールが立ち上がる．
画面右上にある[New]のボタンから[Python3]を選択して準備完了．
あとはセルにコードを書いて，[Shift]+[Enter]で実行可能．
##パッケージ
Pythonを使ったデータ解析，操作でよく使用される（らしい）ライブラリは
[pandas](https://pandas.pydata.org/), [matplotlib](https://matplotlib.org/), [seaborn](https://seaborn.pydata.org/)です．（他にももっとあると思う．．．）
それぞれデータ解析支援，グラフ描画，（おしゃれな？）グラフ描画を目的としています．
これらをインストールして望みます．

```python
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
```
ちなみにseabornをなぜsnsと略すのか調べたら，テレビ番組The West Wingの[Samuel Norman Seaborn](https://en.wikipedia.org/wiki/Sam_Seaborn)というキャラクターからきているそう．（どうでもいい）(参考:[Stack Overflow](https://stackoverflow.com/questions/41499857/seaborn-why-import-as-sns?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa))
##やってみた
とりあえずいただいたデータがどんな内容か知りたいので適当に触っていきます．

- まずはデータの読み込みから，データはcsvファイルである程度整形（1行目にそれぞれのラベルがあったり．．．）されていたので，

```python
data = pd.read_csv('hogehoge.csv')
```
で読み込みました．pandasを使えばpandasのDataFrame（2次元のデータ構造）として読み込めるそう．

- 次に

```python
data.describe()
```
これで各行に対する個数，平均，偏差，min，25%値，50%値（中央値），75%値，maxが出力できます．
この場合，欠損値（NaN）は除外されて計算されます．
詳しくは[こちら](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.describe.html)を参照．

- データの中身をちょっと知りたい場合は

```python
data.head()
```
デフォルトでは先頭5件が表示されます．

- 各行に対するヒストグラムは.histで見ることができます．

```python
data.hist(bins=30)
plt.show()
```

- 自分のデータには欠損値（NaN）があったため，

```python
droped_data = data.dropna()
droped_data.describe()
```
これで個数が変わりました．.dropna()では1つでもNaNを含んでいるとその列毎落としてくれます．

- NaNを落としたデータで相関性を見ようと思います．

```python
droped_data.corr()
```

```python
sns.heatmap(droped_data.corr().values)
plt.show()
```
上ではそれぞれの行に対する相関性を見ることができます．+1に近ければ正の相関，-1に近ければ負の相関，0に近ければ無相関となります．
下では相関性をヒートマップにして表示しています．
自分のデータではこのようなヒートマップを得ることができました．
![heatmap.png](https://qiita-image-store.s3.amazonaws.com/0/227625/e858cae2-8912-dbc7-95c3-b4d710accffd.png)
デフォルトの場合，色が白に近いほど正の相関，黒に近いほど負の相関となります．

#まとめ
それぞれの特徴に対する相関を調べました．次回は必要な特徴の選択や欠損値の処理に対して考えていこうと思います．

##環境
- Python 3.6
- pandas 0.20.3
- matplotlib 2.1.0
- seaborn 0.8.0
GitHubに二段階認証を設定した後にGit操作できない時の解決策

この記事では非公開のOrganizationを使った例を載せていますが、個人のリポジトリでもほとんどやることは同じです。（おそらくステップ5が不要なくらい）

## 問題
GitHubに二段階認証を設定した後、普通にgit clone等のgit操作をしようとするとauthエラーで何もできない。

```bash
$ git clone https://github.com/private-organization/repository.git
Cloning into 'repository'...
Username for 'https://github.com': kitoko552
Password for 'https://kitoko552@github.com':
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/private-organization/repository.git/'
```

httpsでなくsshに切り替えてもできない。

```bash
$ git clone git@github.com:private-organization/repository.git
Cloning into 'repository'...
Enter passphrase for key '/path/to/.ssh/id_rsa':
ERROR: The `private-organization' organization has enabled or enforced SAML SSO. To access
this repository, you must use the HTTPS remote with a personal access token
or SSH with an SSH key and passphrase
that has been whitelisted for this organization. Visit
https://help.github.com/articles/authenticating-to-a-github-organization-with-saml-single-sign-on/ for more information.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

## 解決策
### 1. GitHubの自分のメニューからSettings>Developer settings>Personal access tokens
|Settings|Developer settings|Personal access tokens|
|---|---|---|
|<img width="175" alt="settings.png" src="https://qiita-image-store.s3.amazonaws.com/0/42132/70485956-8f2f-1708-eced-b2c7ed2e57c8.png">|<img width="225" alt="developer_settings.png" src="https://qiita-image-store.s3.amazonaws.com/0/42132/03006e16-e68e-6739-29f1-dc0fa4ac4d19.png">|<img width="214" alt="personal_access_token.png" src="https://qiita-image-store.s3.amazonaws.com/0/42132/94f4ade0-22ef-e3cc-c501-af6736e0cb8a.png">
|

### 2. Generate new token
<img width="902" alt="genereta_new_token.png" src="https://qiita-image-store.s3.amazonaws.com/0/42132/1aa51192-edd5-e041-b734-4b01cf9a5e18.png">

###  3. repoからgistまでを全てチェックしてGenerate token
<img width="898" alt="new_personal_access_token.png" src="https://qiita-image-store.s3.amazonaws.com/0/42132/5bdab63f-3447-7a0b-849d-630b3e41db5c.png">

###  4. tokenをコピーしてどっかに保存（1回しか教えてくれないから注意）

###  5. 作ったtokenのSSOボタンをタップ -> ポップアップ内のprivate-organizationのAuthorize
SSOボタンをタップして...
<img width="675" alt="sso.png" src="https://qiita-image-store.s3.amazonaws.com/0/42132/dbc81dff-1eba-3119-f516-7ea2110d27e0.png">

Authorize
<img width="364" alt="authorize.png" src="https://qiita-image-store.s3.amazonaws.com/0/42132/fe857637-5bf5-f9bb-b30a-5319c167c8a2.png">


###  6. httpsでgit clone

```bash
$ git clone https://github.com/private-organization/repository.git
Cloning into 'repository'...
Username for 'https://github.com': kitoko552
Password for 'https://kitoko552@github.com': {ここでGitHubのパスワードでなくtokenを入力する}
```
php-master-changes 2018-09-07

# 2018-09-07
## devnexen: Support fixed address mmap without replacement
- https://github.com/php/php-src/commit/f7b573b4e96f3cf421dc92063b11121da2370e46
- [先日のメモリアロケータの修正](https://qiita.com/sj-i/items/934ba9ce871a926e6850#devnexen-support-fixed-address-mmap-without-replacement)は一旦 [revert された](https://qiita.com/sj-i/items/b75bec1ef1cf29b7a707#remicollet-revert-dont-report-mmap-failure-if-it-is-expected)が、FreeBSD ならダイジョブだよ、という話があったので FreeBSD のみ復活

## nikic: Fixed bug [#76796](https://bugs.php.net/bug.php?id=76796)
- https://github.com/php/php-src/commit/cfdd828163bc03b63e41d92adc5b127f567e4c46
- ext/opcache で disable_functions に指定された関数がコンパイル時評価で SEGV を起こす問題の修正、7.2.2 〜 7.2.9 で起きるそうな
Nuxt.jsにBootstrapVueのコンポーネントを追加する

Vue.js+BootstrapVueで作成したサイトをNuxt.jsで書き直したら `Unexpected token import` のエラーが出て動かなくなりました。

## エラー

```json:package.json
{
  "name": "nuxt-bootstrap",
  "scripts": {
    "dev": "nuxt"
  },
  "dependencies": {
    "bootstrap-vue": "^2.0.0-rc.11",
    "nuxt": "^1.4.2"
  }
}
```

```js:plugins/bootstrap.js
import Vue from 'vue';

import bAlert from 'bootstrap-vue/es/components/alert/alert';
Vue.component('b-alert', bAlert);
```

```vue:pages/index.vue
<template>
  <div>
    <b-alert show>Ciao!</b-alert>
  </div>
</template>
```

```js:nuxt.config.js
module.exports = {
  css: [
    'bootstrap/dist/css/bootstrap.css',
    'bootstrap-vue/dist/bootstrap-vue.css',
  ],
  plugins: [
    '@/plugins/bootstrap',
  ],
};
```

<img width="666" alt="スクリーンショット 2018-09-08 0.29.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/69513/2a12e9a1-8fcd-1c6f-b6b9-1e2e6e3899a8.png">

## 解決法

[webpack-node-externalsを使え](https://github.com/Justineo/vue-awesome/issues/7#issuecomment-322034039) とのこと。

```sh
yarn add -D webpack-node-externals
```

```js:nuxt.config.js
const nodeExternals = require('webpack-node-externals');

module.exports = {
  build: {
    extend(config, { isServer }) {
      if (isServer) {
        config.externals = [
          nodeExternals({
            whitelist: [/\.(?!(?:js|json)$).{1,5}$/i, /^bootstrap-vue/],
          }),
        ];
      }
    },
  },
  css: [
    'bootstrap/dist/css/bootstrap.css',
    'bootstrap-vue/dist/bootstrap-vue.css',
  ],
  plugins: [
    '@/plugins/bootstrap',
  ],
};
```

<img width="960" alt="スクリーンショット 2018-09-08 0.30.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/69513/65a76b66-1926-cfdf-c31a-80e395ad3550.png">

直りました。

なんでこうしなきゃならないのか分かっていないので、教えていただけると大変ありがたいです。

## 余談

`build.babel.babelrc` は [v1.4.2では常にfalseになる](https://github.com/nuxt/nuxt.js/blob/v1.4.2/lib/builder/builder.js#L179) ため `extend()` で書き換える必要があります [^1]。

```js:nuxt.config.js/build
extend(config, { isClient, isServer }) {
  config.module.rules
    .filter(rule => rule.loader === 'babel-loader')
    .map(rule => {
      rule.options.babelrc = true;
    });
},
// babel: {
//   babelrc: true, // falseで上書きされてしまう
// },
```

## 追記

Nuxt2で動かなくなりました。 `build.transpile` オプションを使用しても同様です。

[^1]: [3月に修正されて](https://github.com/nuxt/nuxt.js/commit/4b4605899451a6f8ae685f74f8029f1dc654d915#diff-f0272d7117ea8e9aba2b98d41e66e1a9) リファクタリングされたりしていますが、リリースされません。nuxt-edgeがメインなんでしょうか。
GoLand（IntelliJ）のGOROOTを絶対パスを選択せず直接入力したいとき

# 概要

GoLandでGOROOTを絶対パスを直接入力するにはフォルダ選択ダイアログで ```⌘ + ⇧ + G```


# 詳細

Goをgoenv/anyenvでダウンロードしたとき（？）など、GoLand（IntelliJ）でGOROOTを指定したいときに候補が選択できなくて困ったことはありませんか？

僕は3回くらい困り、その度に調べて忘れたので備忘として…

<img width="1008" alt="スクリーンショット 2018-09-08 0.12.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/51b88b36-8c0e-d9ae-01ed-047440be34a6.png">

`GoLand` > `Preferences` > `Go` > `GOROOT` とたどり、

右上の ```...``` ボタンをクリックして、次のダイアログを表示した状態で

<img width="1011" alt="スクリーンショット 2018-09-08 0.27.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/4840eaae-bc00-5475-b2c8-f27db4acbacc.png">

```⌘ + ⇧ + G``` を押すと絶対パスを指定するためのダイアログが表示されます。

<img width="1009" alt="スクリーンショット 2018-09-08 0.28.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/6392af5e-539f-5b92-778a-26726d657a14.png">

あとは絶対パスを指定するだけです。

<img width="1009" alt="スクリーンショット 2018-09-08 0.32.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/46547/9407181e-4d8b-82a1-0038-92141e0875a9.png">
google appengine standard environment 2nd generation for php7 でデプロイする

Google AppEngine standard environment 2nd generation for PHP7.2 を使ってみよう。

とりあえずデプロイして動くことを確認する。
`Cloud SDK (gcloud command)` は [インストール](https://cloud.google.com/sdk/docs/quickstarts) して `gcloud init` しておく。

# アプリのファイル構造

* /
 * app.yaml
 * index.php

# ファイルの内容

```yaml:app.yaml
runtime: php72
```

```php:index.php
<?php
  
phpinfo();
```

# deploy

`app.yaml` のあるディレクトリで実行する

```shell:console
$ gcloud --project="project-name" app deploy

~~ 省略 ~~

You can stream logs from the command line by running:
  $ gcloud app logs tail -s default

To view your application in the web browser run:
  $ gcloud app browse
```

# 動作確認

ブラウザで開く

```shell:consle
$ gcloud app browse
```

<img width="943" alt="php72.png" src="https://qiita-image-store.s3.amazonaws.com/0/153329/c4689ad8-44a6-6fe5-e634-82a20e4f3aa2.png">

# 最後に

動いてますね。

エントリポイントの作り方がわかったので、これで一応PHPでできることは何でもできる状態になりました。
Spring Boot(Jackson)でJsonの空文字をNULLで受け取る方法

# 概要
Spring Bootで従来までのControllerをRestContorllerに変更した際に、これまでInitBinderで設定していたStringTrimmerEditorの設定が効かなくなってしまいました。
これは入力データを処理する仕組みがRestController(@RequestBody)ではJacksonで処理されるためです。

サンプルはKotlinで記述していますが、Javaでも基本的に同じです。

## 設定ファイル(application.yml)で設定を試みる
application.ymlにてそれっぽい設定項目を発見し、試してみました。

```application.yml
  jackson:
    deserialization:
      ACCEPT_EMPTY_STRING_AS_NULL_OBJECT: true
```
が、、、いろいろ試しましたが、うまくいきませんでした。
変換先がPOJOじゃないとだめみたいです。

[参考]
https://stackoverflow.com/questions/22688713/jackson-objectmapper-deserializationconfig-feature-accept-empty-string-as-null-o

https://stackoverflow.com/questions/30841981/how-to-deserialize-a-blank-json-string-value-to-null-for-java-lang-string

## 解決方法
結局設定ファイルではうまくいかず、Stringを変換する独自Deserializerを作成しObjectMapperに設定することにしました。

### 1. Deserializerクラスの作成
JsonDeserializerを継承してクラスを作成しても良かったのですが、標準で設定されているStringDeserializerの中身を見てみるとそれなりに処理が書かれていたので、StringDeserializerを継承してクラスを作成することにしました。

```EmptyToNullStringDeserializer.kt

package ...

import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.databind.DeserializationContext
import com.fasterxml.jackson.databind.deser.std.StringDeserializer

class EmptyToNullStringDeserializer : StringDeserializer() {
    override fun deserialize(p: JsonParser, ctxt: DeserializationContext): String? {
        val result = super.deserialize(p, ctxt)
        return if(result.isNotEmpty()) result else null
    }
}

```
スーパークラスの返した値を最終行で空文字かチェックしているだけの処理となります。

### 2. ObjectMapperへの登録
適当なConfigクラスを生成(すでにあるものに追加してもOK)しObjectMapperのBeanを定義します。

```JacksonConfig.kt
package ...

import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder

@Configuration
class JacksonConfig {
    @Bean
    fun jacksonBuilder(): Jackson2ObjectMapperBuilder {
        return Jackson2ObjectMapperBuilder()
                .deserializerByType(String::class.java, EmptyToNullStringDeserializer())
    }
}

```

以上です。

## まとめ
簡単な設定に見えて結構はまってしまいました。
普段は何も考えずにJacksonを使っているのですが、もう少し勉強が必要な気がします。
forを使った繰り返し処理の中での分割で数字が取得できない

7 3
4
7 1
7 4
5 3
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
というエラーが出ます。
原因がわからないので教えていただけないでしょうか?

import java.util.Scanner;

public class Cardgame {

	public static void main(String[] args) {


        Scanner sc = new Scanner(System.in);
        String inputStr1 = sc.nextLine();
		String[] dataSet1 = inputStr1.split(" ");
		int suziHennkann1 = Integer.parseInt(dataSet1[0]);
		int suziHennkann2 = Integer.parseInt(dataSet1[1]);
		
		
		String inputStr2 = sc.nextLine();
		int num = Integer.parseInt(inputStr2);
		int[] dataSet3 = new int[num];
		
		for(int i = 0; i < num; i++) {
			String inputStr3 = sc.nextLine();
			String[] dataSet2 = inputStr3.split(" ");
			dataSet3[i] = Integer.parseInt(dataSet2[i]);
rails console 内でエラーを起こすとconsole自体が落ちる時の対処法

通常、rails console内でエラーを起こしてもconsole自体が終了してしまうようなことはない。
しかし、下記のようなメッセージを出力して落ちることがある。

```
Traceback (most recent call last):bin/rails: undefined method `[]' for nil:NilClass (NoMethodError)
```

`binding_of_caller`gemを更新することで直る可能性が高い。

下記コマンドを実行することで、表題の不具合を修正可能。

```shell
bundle update binding_of_caller
```

## 参考
https://stackoverflow.com/questions/48123534/spring-stopping-rails-console-from-running

https://github.com/BetterErrors/better_errors/issues/411

詳しい理由については後日追記できればと思う。
【元号改正】和暦日付から日付オブジェクトへの変換仕様変更

## 元号改正？ 新しい元号の情報が増えるだけじゃん？
ここ最近エンジニア界隈を賑わせている改元問題ですが、

    1. レジストリに新しい元号の情報が追加される
    2. Unicode文字に新しい元号記号が追加される

環境自体の変更はこの程度だろうと思っていた、そんな時期が私にもありました。

## はじめに
私は現在データエントリー用のAP開発に携わっています。
紙に書かれた情報をデータ化する際に、タイプミスなどのヒューマンエラーは付き物です。
そのため、不正な入力が行われていないかチェックする機能が備わっています。

その機能の一つが「日付の実在チェック」であり、

- 2016/2/29 : 実在するのでOK
- 2018/2/29 : 実在しないのでNG
- 昭和60年4月1日 : 実在するのでOK
- 昭和99年4月1日 : 実在しないのでNG

このような挙動となるよう実装されています。
西暦、和暦両方に対応しており、和暦で記述された場合は内部処理で西暦に変換しています。
西暦変換部だけを抜き出して記述すると、次のようになります。

```C#:sample.cs
string strDate = "昭和60年4月1日";
CultureInfo ci = CultureInfo.CreateSpecificCulture("ja-JP"); 
DateTime dt = DateTime.Parse(strDate, ci, DateTimeStyles.None);
Console.WriteLine(dt.ToString("yyyy/MM/dd"));
// 1985/04/01
```

「昭和99年4月1日」などの実在しない和暦の日付を西暦に変換すると「DateTime.Parse」処理で例外が発生するため、例外発生時は一律チェック結果をNGとして処理しています。

```C#:sample.cs
try
{
    string strDate = "昭和99年4月1日";
    CultureInfo ci = CultureInfo.CreateSpecificCulture("ja-JP"); 
    DateTime dt = DateTime.Parse(strDate, ci, DateTimeStyles.None);
    // 例外発生
    Console.WriteLine(dt.ToString("yyyy/MM/dd"));
    :
}
catch
{
    // 例外発生時はチェックNG
}
```

## 問題となる挙動
上記の処理を実行した時、突然西暦変換が成功するようになりました。

```C#:sample.cs
string strDate = "昭和99年4月1日";
CultureInfo ci = CultureInfo.CreateSpecificCulture("ja-JP"); 
DateTime dt = DateTime.Parse(strDate, ci, DateTimeStyles.None);
Console.WriteLine(dt.ToString("yyyy/MM/dd"));
// 2024/04/01
```

この不具合によって例外処理が想定通りに行われず、チェック機能が正しく動作しなくなってしまいました。
（下記の対処法が分かるまでは、AP改修が入ると思って本気で焦りました…）

## 原因と対処法
最近の.NET Frameworkのアップデートにより、和暦日付の文字列から日付オブジェクトへの変換仕様が変わったことが原因のようです。
昭和だけでなく、「大正50年」「平成80年」なども例外が発生することなく日付オブジェクトへ変換できます。
（元号がギリギリのタイミングで公開されることから、当面の間「平成32年」のような表記を許容する、という国の方針を踏まえた改修と思われます）

アップデート自体はWindows10を対象に、米国時間7/10（火）にリリースされています。
他バージョンについては名言されていませんが、順次リリースされているものと思われます。
（ちなみに、自分のPCはWindows7 Enterprise 64bitです）

また対処方法についてですが、

- .NET Framework 4.6以降ではAP構成ファイル（*.exe.config）の編集
- .NET Framework 4.5.2以前ではレジストリの変更

を行うことで従来の挙動に戻すことができるようです。
詳しくは[こちらの記事](https://blogs.technet.microsoft.com/jperablog/2018/06/25/netframework/)をご覧ください。

## おわりに
システムを新元号に対応させるだけでなく、従来の元号に対して正しく処理が行えるかも併せて確認する必要があると感じました。

しかし、元号周知が改元の1ヶ月前って本当なんなんですかね。得してる人いるんですかね。
対応に追われるエンジニアの皆様、お互い頑張ってまいりましょう。
【丸パクリできる】GASで日報テンプレをSlackに自動投稿するコード

###簡単な自己紹介
エンジニア歴　６時間３２分

### きっかけ
一日の振り返りシートを毎日記入したいと思った。
### 目的
Slackにスプレッドシートを投稿してその日の日報テンプレを準備する

------------------------------------------


ついでに目標も毎日投稿しちゃいたい！
グーグルドキュメントとかも使えます！！

```

/** 
 * 振り返りシートをSlackに自動で毎日投稿。 
 */ 

/*===========================================================================
     TODO: ここだけ編集する 
===========================================================================*/

// 取得方法はこちら。 => 「https://qiita.com/ik-fib/items/b4a502d173a22b3947a0」 
var postUrl = 'https://hooks.slack.com/services/1234567890; 
// Slackの投稿者の名前 
var username = '振り返りシート'; 
// 「https://www.webfx.com/tools/emoji-cheat-sheet/」
var icon = ':stuck_out_tongue_winking_eye:'; 
// 追加するフォルダ
var targetFolderId = '1ReNsEj-vk2ydOPhHNdz34aXRp9W3n-_j' 
// テンプレとして使うファイル
var fileId = '1r5mObHmDgE8GatxVpFEjAaNJFh-V9qtQH0RZtHu3DxM'

var taskMsg = "０時００分が期限です。２３時までには書いておきましょう\n"; 
var line = "\n=============================\n"; 
/*========================================================== 
     目標 
==========================================================*/
var s1 = "■目標\n\n■２０１８年１１月（cc歳）\n";
var s2 = " →AAA\n";
var s3 = "■２０１９年３月（cc歳）\n";
var s4 = " →BBB\n";
var s5 = "■２０１９年８月（cc歳）\n";
var s6 = " →CCC\n";
var s7 = "■２０２０年８月（cc歳）\n";
var s8 = " →DDD\n";
var s9 = "■２０２１年８月（cc）歳\n";
var s10 = " →EEE\n";
var schedule = line + s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10;
/*==========================================================
     END. 目標 
==========================================================*/

/*===========================================================================
     TODO: END. ここだけ編集する 
=============================================================================*/

function copyTempleteFile() { 
  var files = DriveApp.getFolderById(targetFolderId).getFiles(); 
  if(files.hasNext()){ 
    var file = files.next(); 
    fileId = file.getId() 
  } 
  var date = new Date(); 
  var formattedDate = Utilities.formatDate(date, "JST", "yyyyMMdd"); 
  var file = DriveApp.getFileById(fileId); 
  var newFile = file.makeCopy(formattedDate); 
  return newFile; 
} 

function postMessage(message) { 
  var jsonData = 
      { 
        "username" : username, 
        "icon_emoji" : icon, 
        "text" : message 
      }; 
  var payload = JSON.stringify(jsonData); 
  var options = 
      { 
        "method" : "post", 
        "contentType" : "application/json", 
        "payload" : payload 
      }; 
  UrlFetchApp.fetch(postUrl, options); 
} 

function createDocBot() {
  var objDoc = copyTempleteFile();
  var docFile = DriveApp.getFileById(objDoc.getId());
  var targetFolder = DriveApp.getFolderById(targetFolderId);
  targetFolder.addFile(docFile);
  DriveApp.getRootFolder().removeFile(docFile);
  var url = docFile.getUrl();
  // slackへのメッセージ内容
  var message  =  taskMsg + url+  schedule;
  postMessage(message) 
}
```
結果としてはこんな感じでとうこうされます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/287988/31adefb0-7c8d-37b1-b0f7-5d1f63810794.png)

短いコードですが今回コードを書いてみてエンジニアの方の凄さがわかりました。
僕みたいなプログラミング初心者でも使えるように簡単にまとめみたので使ってみてください。
Play Framework(Scala)で、POSTされたデータを直接requestから取得する

## 概要
以前に私の方で投稿した[Play Framework 2.6(Scala)でFormの処理を作ってみた](https://qiita.com/someone7140/items/62d11e4d6924f100c287)では、Formオブジェクトを使ってPOSTのデータを取得していましたが、reuqestから直接POSTされたデータを取得する方法を紹介します。

## 対応方法
[How to get payload from a POST in Play 2.0](https://stackoverflow.com/questions/8620076/how-to-get-payload-from-a-post-in-play-2-0)で紹介されている通り、requestのbodyから「asFormUrlEncoded」を使うことで取得できます。JavaでのサンプルはHyuさんの[PlayFrameworkでのリクエストパラメーターの受け取り方](https://qiita.com/Hyu/items/cd8c825ef933e0fd8aec)でも紹介されています。

## サンプルコード
Formオブジェクトを使わない方法で、POSTされたデータを取得するScalaのサンプルソースを記載します。

```sample.scala.html
@import helper._
@main("サンプル"){
    <font size=5>■サンプル画面</font><br/>
    @helper.form( action = helper.CSRF(routes.SampleController.sampleAction) ){
                          <input type = "hidden" name = "idParam" value="test" />
                          <input type = "submit" value="送信する">
                       }
}
```

```SampleController.scala
package controllers

import javax.inject._
import play.api._
import play.api.mvc._
import play.api.data._
import play.api.i18n.I18nSupport
import play.api.i18n._

@Singleton
class SampleController @Inject()(cc: ControllerComponents ) extends AbstractController(cc) with I18nSupport {

  def sampleAction() = Action { implicit request: Request[AnyContent] =>
    // リクエストから直接POSTされたデータ取得
    val idParam = request.body.asFormUrlEncoded.get("idParam")(0)
    Redirect("./test")
  }  
}
```
jqGrid：行データ取得

# JQGRID使用方法
Jqgridバージョン：v5.3.0

## Grid内の項目を取得する方法
Grid内の項目値を取得するには、「getRowData」「getLocalRow」のどちらかのメソッドを使用するのが一般的だと思います。
次のソースをもとに値を取得します。

```js
$(document).ready(function () {
    "use strict";
    var mydata = [
            {rowId: "10",  pref: "大阪府",  city: "大阪市"},
            {rowId: "20",  pref: "兵庫県", city: "加古川市"},
            {rowId: "30",  pref: "山梨県", city: "甲府市"},
            {rowId: "40",  pref: "北海道", city: "札幌市"},
            {rowId: "50",  pref: "沖縄県", city: "那覇市"},
        ];
    var $grid = $("#list");
    $grid.jqGrid({
        datatype: "local",
        data: mydata,
        colNames: ["ID", "都道府県名", "都市名", "住所"],
        colModel: [
            {name: "rowId", width: 70},
            {name: "pref", width: 70},
            {name: "city", width: 70},
            {
                name: "addres",
                width: 140,
                formatter: function(cellval, opts, rwdat) {
                    // cellval：セル値
                    // opts：補足情報
                    // rwdat：行データ
                    let ret = "";
                    if (rwdat.pref && rwdat.city) {
                        ret =  rwdat.pref + rwdat.city;
                    } else if (rwdat.pref) {
                        ret = rwdat.pref;
                    } else if (rwdat.city) {
                        ret = rwdat.city;
                    }
                    return ret;
                },
            },
        ],
        height: "auto",
    });
});
```
![行取得.JPG](https://qiita-image-store.s3.amazonaws.com/0/159893/ac436e6c-b13b-d5ce-425a-f2b29a08bc9b.jpeg)


### getRowDataで取得できる値
下記ソースの場合、このように値が取得できます。

```js
// 引数を指定しない場合、全行取得できます。
$("#list").jqGrid("getRowData");
// > [
//    0:{rowId: "10", pref: "大阪府", city: "大阪市", addres: "大阪府大阪市"}
//    1:{rowId: "20", pref: "兵庫県", city: "加古川市", addres: "兵庫県加古川市"}
//    2:{rowId: "30", pref: "山梨県", city: "甲府市", addres: "山梨県甲府市"}
//    3:{rowId: "40", pref: "北海道", city: "札幌市", addres: "北海道札幌市"}
//    4:{rowId: "50", pref: "沖縄県", city: "那覇市", addres: "沖縄県那覇市"}
// ]

// 行IDを指定した場合、その行の値のみ取得できます。
$("#list").jqGrid("getRowData", "1");
// > {rowId: "10", pref: "大阪府", city: "大阪市", addres: "大阪府大阪市"}

// また、元のformatterで編集されていないデータを取得したい場合、次のようにすると取得できます。
$("#list").jqGrid("getRowData", "1", true);
// > {rowId: "10", pref: "大阪府", city: "大阪市"}
```

注意しないといけない点として次の２点があげられます。
第二引数に何も設定していない場合、自身で設定したformatterで編集された値がそのまま取得できる点。
そのためformatterでhtmlを返却するように設定している場合、htmlがそのまま返却されます。
※formatterに"select", "checkbox"等設定している場合、変換された値ではなくunformatされた値が取得できます。
数値型のデータも文字列として取得できてしまう点。

### getLocalRowで取得できる値
下記ソースの場合、このように値が取得できます。

```js
// 行IDを指定して対象のデータを取得します。
$("#list").jqGrid("getLocalRow", "1");
// > {rowId: "10", pref: "大阪府", city: "大阪市"}
```

getRowData関数の第二引数に何も設定していない場合と同じ値を取得することができます。
ノマドなパソコン紳士、HTTPプロキシと戦う

問題
----
- インターネットアクセスにHTTP(S)プロキシが必要な環境(社内)と、外の環境(ノマド)を行ったり来たりする。
- `curl`、`git`、`scp`、`ssh`、`rsync`、`wget`あたりのコマンドのプロキシ設定の切り替えが非常に面倒くさい。どうにか簡単に切り替えたい。諦めるな、戦え。

解決策
------

シェルスクリプトでラップしてプロキシ設定を変えてやる。

```bash:proxied
#!/bin/bash
set -eu

PROXY=http://proxy.xxx.yyy.zzz:8080
PROXY_HOST=proxy.xxx.yyy.zzz
PROXY_PORT=8080
SSH_CONFIG_FILE=~/.ssh/config_proxied

ssh() {
  command ssh -F $SSH_CONFIG_FILE "$@"
}
scp() {
  command scp -F $SSH_CONFIG_FILE "$@"
}
export GIT_SSH_COMMAND="ssh -F $SSH_CONFIG_FILE"
export RSYNC_RSH="ssh -F $SSH_CONFIG_FILE"
export http_proxy=$PROXY
export https_proxy=$PROXY
export no_proxy=localhost
export JAVA_OPTS="${JAVA_OPTS:-} -DproxyHost=$PROXY_HOST -DproxyPort=$PROXY_PORT"
"$@"
```
```~/.ssh/config_proxied
Host                github.com
  HostName          ssh.github.com
  Port              443
  ProxyCommand      connect -H proxy.xxx.yyy.zzz:8080 %h %p

Host                gist.github.com
  HostName          ssh.github.com
  Port              443
  ProxyCommand      connect -H proxy.xxx.yyy.zzz:8080 %h %p

Host                bitbucket.org
  HostName          altssh.bitbucket.org
  Port              443
  ProxyCommand      connect -H proxy.xxx.yyy.zzz:8080 %h %p

Host                gitlab.com
  HostName          altssh.gitlab.com
  Port              443
  ProxyCommand      connect -H proxy.xxx.yyy.zzz:8080 %h %p

# そのほかプロキシを介した踏み台サーバー経由的な多段SSHな設定群....
```
ここで使っている[connect](https://bitbucket.org/gotoh/connect/wiki/Home)は[^1]、Ubuntuなら`apt install connect-proxy`、Homebrewなら`brew install connect`でインストールできる。CentOS 7だと`yum install connect-proxy`でインストールできるが、バイナリ名が`connect`ではなく本当に`connect-proxy`であるので`ProxyCommand`を変える必要があることに注意。

これで`proxied ssh ...`のように頭に`proxied`を付けると、プロキシ経由で外部へ出るコマンドとなる。

コマンド補完
-----------
そのままではBash-Completionが働かない。なので次のコマンドを`.bashrc`に追加しておくとよい。

```bash:.bashrc
complete -F _command proxied
```

[^1]: もちろん[corkscrew](https://github.com/bryanpkc/corkscrew)を使っても良い。その場合は`ProxyCommand corkscrew proxy.xxx.yyy.zzz 8080 %h %p`のような記述になるだろう。
(補足)乱択化フーリエ特徴を用いたリッジ回帰

#1.目的
前稿では、学習データ数が少なく計算時間の観点から乱択化フーリエ特徴を用いた場合の利得が見られませんでした。本稿では、教師データ数をパラメータとし、カーネル法及び乱択化フーリエ特徴を用いた場合の計算時間について確認します。また、多次元入力に対応した乱択化フーリエ特徴を用いたリッジ回帰の実装を示します。

前回投稿
https://qiita.com//hiroponX/items/448daec79fac2ffd82a0

#2.計算時間
最初に、リッジ回帰にカーネル法及び乱択化フーリエ特徴を用いた場合の計算時間について、前回実装したクラスを用いて確認してみます。教師データは前稿と同様、$g(x)=xsin(x)+ε$に基づき生成します（$ε$は平均0、分散0.2の正規分布）。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/276143/ae96d517-7379-fa8a-6077-3fcaa5bacdfb.png)



*Rff : 乱択化フーリエ特徴(Random Fourier Features)、mfは$u$のサンプリング数を示す。
注目すべきは、乱択化フーリエ特徴を用いた場合、通常のリッジ回帰と同様に計算時間が$O(N)$であることです。参考のためscikit-learnのカーネルリッジ回帰(sklearn.kernel_ridge.KernelRidge)での計算時間も示しました。やはり、カーネル法は計算時間が$O(N^2)$となることから、大規模データへの適用は難しそうですね。

#3.多次元化
次に、入力値が多次元の場合の実装を示します。多次元化に伴う変更点は、三角関数の中身がスカラー量$u$と$x$の積から、ベクトル量$u^T$と$x$の内積に変更されている点のみです。1次元の時と同様、$u$は$p(u)$に従いランダムに$M$個サンプリングします。ただし、1次元の場合と異なり、$u$は入力次元数$D$と同じ次元数のベクトルとなります。

```math
\begin{align}
k(x, x_n)&=\int_{R}\exp(iu^T(x-x_n))dp(u)=\int_{R}\cos(u^T(x-x_n))dp(u)\\
&\approx\sum_{m=1}^M\cos(u_m^T(x-x_n))\\
&=\sum_{m=1}^M\cos(u_m^Tx)\cos(u_m^Tx)+\sin(u_m^Tx)\sin(u_m^Tx)
\end{align}
```
カーネルは下式に示すような基底関数に分解できます。

$$k(x, x_n)=\sum_{m=1}^{2M}\phi_m(x)\phi_m(x_n)$$

```math
\begin{align}
&\phi_m(x)=\cos(u_m^Tx)\quad (m=1,2,3\dots,M)\\
&\phi_m(x)=\sin(u_{m-M}^Tx)\quad (m=M+1,M+2,M+3\dots,2M)\\
\end{align}
```


変更点は僅かであり、1次元から多次元への拡張は容易です。

```python:rff.py
import numpy as np
class RffRegression(object):
    def __init__(self, lamda=0.1, sigma=1, mf=100):
        self.lamda = lamda
        self.sigma = sigma
        self.mf = mf
        
    def fit(self, X, t):
        self.X = X
        self.N = len(t)
        self.D = X.shape[1]
        self.u = np.random.normal(0, self.sigma*self.sigma, (self.mf, self.D))
        Phi = np.zeros((self.N, 2*self.mf))
        for n in range(self.N):
            Phi[n, :] = self.func(X[n,:])
        A = np.dot(Phi.T, Phi) + np.identity(2*self.mf) * self.lamda
        b = np.dot(Phi.T, t)
        self.w = np.linalg.solve(A, b)
        
    def predict(self, x):
        return np.dot(self.w, self.func(x))
    
    def func(self, x1):
        cosf = np.cos(np.dot(self.u, x1))
        sinf = np.sin(np.dot(self.u, x1))
        return np.hstack((cosf, sinf))
```

ここで、実装した回帰モデルを用いて$f(x,y)=\sin(x\cos(y))$から生成される2500点の教師データを基に、$f(x,y)$を再現可能であるかを確認してみます。なお、ここではサンプリング数は1000としました。
下図が結果になります。それぞれ、左上が2500点の教師データ、左下が$f(x,y)$、右下が回帰モデルにより再現された$f(x,y)$、右上が真の$f(x,y)$と回帰モデルにより再現された$f(x,y)$の差の絶対値です。回帰モデルにより$f(x,y)$が概ね良好に再現されています。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/276143/5edeb4ce-9680-adb0-a6ea-5562b7f82758.png)


#4.まとめ
前稿の補足として、リッジ回帰にカーネル法及び乱択化フーリエ特徴を用いた場合の計算時間の確認、及び乱択化フーリエ特徴を用いたリッジ回帰の多次元入力対応実装を示しましたした。
[個人的メモ]Springを起動する方法

# Spring（Bootではない）を起動したい
普段.NETしかやってなく、Javaについての知識はほとんどなし。
Springを勉強するため、Spring BootではなくSpringをちょっと使ってみた。
[STS](https://spring.io/tools/sts)でSpring Legacy Projectでプロジェクトを作成。このときテンプレートはSimple Spring Mavenを選択。作成後プロジェクトをみると一切クラスがない。
Spring のなかで起動方法が用意されているのかと思い、探してみたがみつからず。結局Javaのstatic void mainを起動すればいいことがわかった。
Javaの基本を知っていればわかっていればどうやって起動するすれば、わかるのだろうが全然わからなかった。いい勉強になった。
優秀なSEとは優秀なPGと対極なのかもしれない

# はじめに
私は新卒からSIerに務めて5年目のSEです。
業務の中で感じた(弊社での)優秀なSEの定義と一般的に優秀だとされるPGが真逆だと感じましたので記事を書きたくなりました。
完全に個人的な意見です。会社としてそういった人を求めているというわけではなないと思います。

# 優秀なPGとは？
定義は様々にあると思いますが、私はラリー・ウォールのプログラマの三大美徳を持っている人だと考えています。
三大美徳とは、下記の3つです。それぞれの解説は[このサイト](https://freelance.levtech.jp/guide/detail/232/ "レバテック")から引用しています。

1.怠慢

>同じ作業を繰り返すことが面倒ではないという人もいれば、面倒だという人もいます。そこで、面倒だと思う人はその状況をどうにか打開できないかと考えることでしょう。
>
>その面倒なことを打開したいというキッカケとなる「怠惰」が、プログラムを組む上で大切になってくるのです。制作したプログラムが無事に作動して活躍することになれば、多くの人たちの作業負担をグッと抑えられる可能性が見えてきます。
>
>また、制作したプログラムを使用する顧客から都度都度質問が挙がらないように、あらゆる質問を想定して予め丁寧な顧客用のマニュアルを作成する工夫などを行う傾向も高いようです。

2.短気
>せっかく制作したプログラムでも、後々挙動がおかしくなったり、処理速度が遅くなったりしては苛立ちを覚えてしまうでしょう。そこで、「短気」である人は事前にそのような問題を想定して、時間が経過しても苛立つことのないプログラムを組むことを心掛けるようです。
>
>さらに、後々の仕様変更や要望などに対しても、根本的な部分から大きく変更を行う必要性が出てこないよう、そういったことを予見した余裕のあるプログラムの組む努力をします。

3.傲慢
>「傲慢」である場合、誰にも指摘されないような問題のない完璧なプログラムを組むことを目指すケースが多いようです。そのため、プログラムは人に見られても恥ずかしくない、簡潔でキレイなものとなるでしょう。故に、万が一何か問題が起きた場合でも修正がしやすく、顧客も快適にそのプログラムを使用できます。

# 優秀なSEとは？
社内で評価されているSEを観察してみるとこのような特徴があると感じました。

1.勤勉
たとえ無駄だと感じる作業も根気強く続け完遂できる忍耐力、勤勉さが必須です。
Unitテストは手作業で実行しエビデンスをExcelに記録します。テストコードって何ですか？
ビルド/リリース作業ももちろん愛情込めて職人の手作業により行います。継続的インテグレーション？Jenkins?って何ですか？

2.気長
お客様の要望を忠実に実現するためなら多少の性能が遅くても気にしません。だってすべてお客様が望んでいることですから。。。（というよりも要望を聞いても性能劣化の懸念があるか全くわかりません。）
また、後々の仕様変更や要望があり大きな変更が必要になったとしても、必要工数はお客様にすべて請求するためじっくり変更要望の検討/実装をします。

3.謙虚
SEとしての仕事は、顧客の言うことを何でも謙虚に受け止め（御用聞き）、それらをPGに伝えてマネジメントすることだと思っています。
従って、技術的なことについてはずぶの素人で専門家の言うことには謙虚に聞き入れます。
（エンジニアとしての自覚はありません。）

# さいごに
改めて整理してみると会社辞めたくなりました。。。(´；ω；｀)ﾌﾞﾜｯ.
GoogleCloudStorageにアップロードしたファイルをGUIからpublicに公開する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235100/6ce7ab1e-848e-42f4-c73b-7de7806b83a2.png)

昔はここに公開するボタンがあったような気がしたんだけれども……あれ？

# 手順！

右の「:」みたいなのから「権限を編集」をクリックしてallUsersを追加！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235100/4d17a892-8479-cc4c-a754-f61d6d0ab569.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235100/95f7b6f1-a8e9-952e-26b9-234cd1606302.png)

publicになりました！

確認用のURL
https://storage.googleapis.com/neko-tech-test-storage/neko.jpeg
Eclipse で自作の注釈処理を動かそうとして詰まったところ

自作の注釈処理を作って Eclipse で動かせるようにしようとしたらいろいろ詰まったのでメモ。

# 環境
**Java**

`openjdk 10.0.2`

**Eclipse**

`Photon (4.8.0)` ※[Pleiades All in One](http://mergedoc.osdn.jp/)

**OS**

`Windows 10`

# 前提
注釈処理自体の話や Eclipse で動かす方法についての説明は [Pluggable Annotation Processing API 使い方メモ - Qiita](https://qiita.com/opengl-8080/items/beda51fe4f23750c33e9) を参照。

# ロードに失敗する
## 症状
![apt.jpg](https://qiita-image-store.s3.amazonaws.com/0/28302/96cf5048-4d86-059e-e12d-7c9e628d444e.jpeg)

注釈処理を設定した方のプロジェクトで「注釈プロセッサー・ファクトリー ... をロードできませんでした」というエラーがでる。
詳細な情報がないため、何が起こっているのかわからず途方にくれた。

## 原因
- Eclipse を動かしている JVM のバージョンが注釈処理を書いたコードよりも古い
    - いろいろ試しているなかで、古いバージョンの Eclipse でも注釈処理が動かない状態になった
    - その Eclipse では詳細なエラーメッセージが表示されて、「Unsupported major.minor version xxx」のエラーが発生していた
    - プロジェクトで使用する Java のバージョンは統一していたので、注釈処理を動かしているプログラム = Eclipse の JVM のバージョンが古いことが原因っぽいことに気づいた

### Eclipse を動かしている JVM のバージョンを確認する
- Eclipse が動いているマシン上でコマンドラインを立ち上げて、 `jcmd` を実行する

```
> jcmd
6184 sun.tools.jcmd.JCmd
18860
```

- プロセスID しか出力されていないのが Eclipse の Java プロセス
- このプロセスID を引数にして `VM.version` を出力する

```
> jcmd 18860 VM.version
18860:
Java HotSpot(TM) 64-Bit Server VM version 25.162-b12
JDK 8.0_162
```

- 8 で動いているのがわかる。

## 対応方法
- Eclipse を、注釈処理のコードのバージョンと互換性のあるバージョンの Java で動かす


# NoClassDefFoundError が発生する
## 状況
- 注釈処理の中で [JavaPoet](https://github.com/square/javapoet) を使ってソースコードを自動生成しようとした


## 症状
![apt.jpg](https://qiita-image-store.s3.amazonaws.com/0/28302/27640218-f9f6-638e-719a-57ec80115d5a.jpeg)

![apt.jpg](https://qiita-image-store.s3.amazonaws.com/0/28302/45d42c63-af54-041a-9b10-b53719cdc2b9.jpeg)

- 注釈処理のなかで使っている JavaPoet のクラスが見つからずに `NoClassDefFoundError` になる

## 原因
- Eclipse の注釈処理の設定で、ファクトリー・パスに依存するライブラリが追加されていない

## 対応方法
- 注釈処理中で使用しているライブラリ（この場合 JavaPoet）もファクトリー・パスに追加する

![apt.jpg](https://qiita-image-store.s3.amazonaws.com/0/28302/e60ee907-94ca-f06d-7383-b1cddb2186c4.jpeg)
Visual Studio Codeのbashでnpmが使えなかった問題



Visual Studio Codeのターミナルをcmdからbashに変更した際にnpmコマンドが使えなくなってしまっていた問題の原因とその解決方法のメモです。

## 問題
    $ npm
を実行すると

    : not foundram Files/nodejs/npm: 3: /mnt/c/Program Files/nodejs/npm:
    : not foundram Files/nodejs/npm: 5: /mnt/c/Program Files/nodejs/npm:
    /mnt/c/Program Files/nodejs/npm: 6: /mnt/c/Program Files/nodejs/npm: Syntax error: word unexpected (expecting "in")
    
のようなエラーが出る。

npm command not found みたいなメッセージが出ないのでちょっと悩んだ。

## 原因

原因自体はスゴイ単純で、自分の思いすごしに起因したものでした。

というのも、Windowsに既にnodeもnpmも入ってるんだからbashにしたところで関係ないっしょ、と思っていたのです。

実際はbash(が動いている仮想Ubuntu?)に一から環境構築してやらなきゃいけないようです。

## 解決方法

bash上で以下を行う

    # パッケージのアップデート
    $ sudo apt-get -y update
    $ sudo apt-get -y upgrade
    $ sudo apt-get -y dist-upgrade
    $ sudo apt-get autoremove

    # nodejsをインストール
    $ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -  //もしかするとURLは適宜選択しなければならないかも
    $ sudo apt-get install -y nodejs

    #パスを変更
    $ vi ~/.profile
    # 最後尾にPATH="$HOME/bin:$HOME/.local/bin:$PATH" を追記
    $ source ~/.profile