OmniAICreator/Qiita-1.07M huggingface dataset:
try-with-resourseが便利

##リソースを自動で閉じる
ファイル開いて、try-catchして、閉じるみたいな
よくやると思うんですけれど
finallyとか使おうとすると

```長い.java
	// try
		// ファイルを開く
	
	// catch
		// 例外処理
	
	// finally
		// ファイルを閉じる
	
	public static void main(String[] args) {
		
		String filePath = "C:\\Windows\\System32";
		BufferedReader bufferedReader = null;
		
		try {
			// ファイルを開く
			File file = new File(filePath);
			
			// 読み込み
			FileReader fileReader = new FileReader(file);
			bufferedReader = new BufferedReader(fileReader);
			
			// 出力
			String data;
			while ((data = bufferedReader.readLine()) != null) {
				System.out.println(data);
			}
			
		} catch (IOException e) {
			System.out.println("ひらけん");
			
		} finally {
			if (bufferedReader != null) {
				try {
					bufferedReader.close();
				} catch (IOException e) {
					System.out.println("とじれん");
				}
			}
		}
	}
```

これを、try-with-resource文を使うと...

```すまーと.java
	// try
		// ファイルを開く、勝手に閉じる
	
	// catch
		// 例外処理
	
	public static void main(String[] args) {
		
		String filePath = "C:\\Windows\\System32";
		
		try (FileReader fileReader = new FileReader(new File(filePath));
				BufferedReader bufferedReader = new BufferedReader(fileReader);) {
			
			// 出力
			String data;
			while ((data = bufferedReader.readLine()) != null) {
				System.out.println(data);
			}
			
		} catch (IOException e) {
			System.out.println("ひらけん");
		}
	}
```

tryの次の括弧()内部で宣言した変数は
勝手に閉じられる対象となります(`java.lang.AutoCloseable`)

try句の中までのスコープで、まぁtry句の中で宣言するのと使い勝手は変わりません

勝手に閉じてくれるとか気が利きすぎてて便利すぎでは
protobufのenumをgolangの型(int32)に変換する

protobuf で定義した enum を golang handler 内で int32型 に変換したかった時
「protobuf enum int 変換」みたいなワードでササっとググって出てこなかったのでメモとして残しておきます。

結論としては、単純に変換したい型で囲ってあげればよい。
`type(enum type)`

```protobuf
[protobuf]

service User {
  rpc PostUser(PostUserRequest) returns (User) {}
}

enum SexType {
  OTHER  = 0;
  MALE   = 1;
  FEMALE = 2;
}

message User {
  int64 id = 1;
  string name = 2;
  SexType sex = 3;
}

message PostUserRequest{
  string name = 1;
  SexType sex = 2;
}
```

```go
[golang handler]
func GetUser(ctx context.Context, req *user.PostUserRequest) (*user.User, error) {
    var sex int32
    sex = int32(req.SexType)
    ... something ...
}
```
【Rails】routes collectionとmemberについて

###colletionとmemberを使う目的

どちらもroutingで使うとき、resourcesでは自動で生成されないactionへの設定を使用

```ruby:route.rb
resources :users do
  member do
    get :follow
      #follow_user GET    /users/:id/follow(.:format)            users#follow
      get :like
        #like_user GET    /users/:id/like(.:format)                users#like
    end
end
```

### 違い
生成する
routingに、:idがつくかつくのか
member つく
collection つかない

#### member
```ruby:
resouces :users do
  member do
    get :follow
  end
end
```
```
  follow_user GET /users/:id/follow(.:format)  users#follow
```

#### collection
```ruby
resource :users do
  collection do
    get :slide
  end
end
```

```
slide_user GET /users/slide(.:format)  users#slide
```
google-home-notifierを使ってGoogleHomeに喋らせる

GoogleHomeは基本的にこちらから「OK!Google」と話しかけることをトリガーに何かしらの処理を行ってくれますが、こちらからの指示がなければただの置物です。
今回は「google-home-notifier」というnpmパッケージを使って、Slackで投稿した内容をGoogleHomeが発言してくれるようにします。

#### google-home-notifier
https://github.com/noelportugal/google-home-notifier

#### インストール
```
npm install google-home-notifier
```

#### 実装
「google-home-notifier」READMEのサンプルを参考に、通知用のjsを作成
とりあえず喋る言葉を固定にする

``` js
const googlehome = require('google-home-notifier');
const language = 'ja';

googlehome.device('Google Homeの名前', language);

googlehome.notify('しゃべったあああああああ', function(res) {
  console.log(res);
});
```

```
node notice.js
```
GoogleHomeと実行環境が同じネットワークに繋がっていれば、GoogleHomeから喋るようになります。

※現在`node_modules/google-home-notifier/package.json`の「google-tts-api」を「0.0.4」に指定して、npm updateかけないとエラーで止まります。  

#### nodeでwebサーバーを作成する
http://localhost:3000/ にリクエストするとGoogleHomeが喋るようにします。

``` js
const http = require('http');

const googlehome = require('google-home-notifier');
googlehome.device('Google Homeの名前', 'ja');
googlehome.ip('Google HomeのIP');

http.createServer(function (req, res) {
    req.on("end", function() {
        googlehome.notify('しゃべったあああああああ', function(res) {
            console.log(res);
        });
    });

    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end();

}).listen(3000, '127.0.0.1');
```

#### localhostを外部公開
ngrokを使って外部公開してSlackから叩けるようにします

```
$ngrok http 3000

Session Status                online
Session Expires               7 hours, 58 minutes 
Version                       2.3.35
Region                        United States (us) 
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://c4c72050.ngrok.io -> http://localhost:3000
Forwarding                    https://c4c72050.ngrok.io -> http://localhost:3000  
```

#### Slackとの連携
SlackAPIのOutgoing Webhookを使って、「https://c4c72050.ngrok.io」 をエンドポイントに指定

SlackからPOSTされてきたテキストを喋らせるように変更

``` js
const http = require('http');

const googlehome = require('google-home-notifier');
googlehome.device('Google Homeの名前', 'ja');
googlehome.ip('Google HomeのIP');

http.createServer(function (req, res) {
    let data = '';
    req.on('data', function(chunk){
        data += chunk;
    });

    req.on("end", function() {
        const qs = require('querystring');
        const post = qs.parse(data);

        const text = post['user_name'] + post['text'];
        googlehome.notify(text, function(res) {
            console.log(res);
        });
    });

    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end();

}).listen(3000, '127.0.0.1');
```
今回は動くところまでを目標にしているのでやってませんが、tokenも送られてくるのでチェックすることもできます  
これでSlackの投稿をトリガーに、GoogleHomeに喋らせることができます。

#### 参考文献
https://qiita.com/ktetsuo/items/21f4f85a98145772be3d
Japan WG全体会合について

##はじめに
本日は[OpenChain Japan Workgroup](https://wiki.linuxfoundation.org/openchain/openchain-japanese-working-group)で開催している全体会合について紹介します。私は、Planning subgroupのリーダーを担当している福地と申します。Planning subgroupは毎回全体会合を企画しています。


##全体会合

###開催状況
OpenChain Japan workgroupでは、2、3か月に1回の割合で全体会合を開催し続けています。誰でも参加できるオープンな会合です。workgroupに参加されている企業が自発的にホストを申し出て下さり、2017年12月のworkgroup開始時から2019年9月までに11回の会合を開催することができました。この間には、小規模のAd Hoc会合も3回開催しています。

全体会合では、OpenChainプロジェクトおよびJapan workgroupの紹介、サブグループ活動の紹介、ゲストスピーカーによる講演、ライトニングトークを中心にした全員参加の議論などを行なっています。各回およそ50~60名の方が参加され、フレンドリーな雰囲気の中で熱のこもった議論が行われています。


!<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422364/f3140028-3a8d-669f-6e9e-d991e2240bfc.jpeg" width=50% >
!<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422364/c37a1e86-08b2-3e7c-5c99-ac035525dd92.jpeg" width = 50%>


###ボランティア企業がホスト
各参加企業がオフィスを会場として提供して下さり、開催場所は品川、新宿、蒲田、八王子、川崎、大阪、名古屋、神戸と全国に広がっています。

多くの企業にホストしていただくのは重要なことだと私は考えています。企業としてホストすることで、担当者個人の活動から企業の活動に相変化が起きることが多くあります。実際に準備作業に参加したり、他企業の活動や担当者の熱心さを自分自身で感じることで、改めて自分たちの活動を振り返る良い機会になります。これを起点として組織の活動を再検討されるようです。更に、オープンソースに対する企業の姿勢を社内外へ発信する良い機会でもあります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422364/8148680d-1100-649a-ea59-91e8e2f32f68.png" width=70%>


###グローバルに発信
Japan workgroupはオープンソースの活動ですから、日本に閉じて孤立したものにならないように、英語でグローバルに情報発信することを心がけています。全体会合は日本語で行われますが、使われた資料は英語に翻訳して[wiki](https://wiki.linuxfoundation.org/openchain/jwg_meeting_page)や[GitHub](https://github.com/OpenChain-Project/Onboarding-JWG)に掲載されます。


##全体会合の意味


###信頼関係
全体会合は、活力あるコミュニティを形成し維持していくために非常に重要な活動です。特にメンバー間の信頼関係を作るのに重要です。というのも、信頼関係は、オープンソースと言えども、直接会うことで構築されていくと考えているからです。自分の考えをお互いに共有し合い、議論をし、新しいアイディアを生み出していくことができます。この過程を通して相手への信頼が生まれます。

サプライチェーンは信頼関係の上にこそ成り立つ仕組みです。信頼できるサプライチェーンの実現を目指すOpenChainプロジェクトにとって、信頼関係を作る仕組みは根幹であると思います。同じ考えを持つ他社の方々と語り合うのは楽しく有意義な時間です。この時間を共有することで信頼関係は深められていくと思います。割と短い間隔で全体会合を開催しているのも、強い信頼関係を維持するのに必要だと考えているからです。

###海外との交流
サプライチェーンは海外にも広がっているのですから、信頼関係の構築は国内だけに限りません。私たちは、海外のゲストを全体会合に招待して講演してもらいますし、Japan workgroupのメンバーが中国、台湾で開催されるWorkshopに参加して自分たちの経験を発表することもあります。こうして、海外とも相互の関係が深まっています。

###継続は活力
継続することで、活動に活力と慣性が生まれます。活力と慣性が、活動を広げるエネルギーとなり、新しい人を呼び込み、更に新しい交流が生まれていくと私は考えています。

##参加募集
全体会合に参加してJapan workgroup活動の雰囲気を自分自身で体験し、活動の輪に加わって頂ければ幸いです。新しく参加された方が会合での発言をきっかけに活動に深く関わられることも多いです。OpenChain Japan workgroupの活動を通じて、信頼できるサプライチェーンが実現されていくことを願っています。

ご興味のある方はこちらから是非ご参加ください：
　[OpenChain Japan WG wiki](https://wiki.linuxfoundation.org/openchain/openchain-japanese-working-group)
　[OpenChain Japan WG ML](https://lists.openchainproject.org/g/japan-wg)
　[OpenChain Japan WG slack](https://openchain-japanwg.slack.com)

##明日のテーマ
明日は富士通コンピュータテクノロジーズの芦塚さんから、Yocto環境にmeta-spdxscannerを適用しSPDX出力環境を構築する手順を紹介してもらいます。
412. FizzBuzz

#Submission
```submission.py
class Solution:
    def fizzBuzz(self, n: int) -> List[str]:
        ans = []
        for nums in range(1, n + 1):
            if nums % 15 == 0:
                ans.append("FizzBuzz")
            elif nums % 5 == 0:
                ans.append("Buzz")
            elif nums % 3 == 0:
                ans.append("Fizz")
            else:
                ans.append(str(nums))
        return ans
```
gitでコミット時間を変更する

コミット時間を変更したいことって意外とけっこうありますよね。  

## やりかた
HEAD~数字のところは変えたいコミットの数を入力してください。  

```
$ git rebase -i HEAD~数字
pick を edit に変更
````

以下を実行するとCommitDate と AuthorDateの両方が現在時刻に変更されます。  

```
$ git commit --amend --date=now
$ git rebase --continue
```

以上です。
【laravel】 migrationでindexの削除

## 削除出来ない

usersテーブルのtextカラムにindexを以下のように貼った時、

```php=
 $table->index('text');
```
削除を以下のようにして `php artisan migrate:rollback` を実行すると。

```php=
$table->dropIndex('text');
```

```bash

PDOException::("SQLSTATE[42000]: Syntax error or access violation: 1091 Can't DROP 'text'; check that column/key exists")
``` 

怒られる。

## なぜ
laravelはindex名は命名規則に基づいて定められる。

```php=:例
'users_id_primary' // 主キー
'users_email_unique' // ユニークキー
'users_name_index' // 基本インデックス
'users_location_spatialindex' // 空間インデックス
```

なので、今回の場合はindex名は `users_text_index` となっている。

そういうindexは無いので怒られる。

## 解決

消したいindexが貼ってあるカラム名を配列にして入れることで、命名規則に従ったindexが削除される。

```php=
$table->dropIndex(['text']);
```
Pythonプログラム用のショートカットをつくる（Windows10）

## きっかけ

ｱｶﾈﾁｬﾝｶﾜｲｲﾔｯﾀｰがしたくて，単純なタイマーをpythonで作った．

 <blockquote class="twitter-tweet"><p lang="ja" dir="ltr">たまに茜ちゃんが応援してくれるタイマーできたー<br>声はデフォルトのままやけど<br><br>ドット絵：マイラさん <a href="https://t.co/2cLZYNZZoj">pic.twitter.com/2cLZYNZZoj</a></p>&mdash; o_danny (@dannyso16) <a href="https://twitter.com/dannyso16/status/1195539315784179712?ref_src=twsrc%5Etfw">November 16, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

しかし実行するのに，いちいちコマンドから`cd working/directory`みたいに移動して実行するのもだるいので，デスクトップにショートカットを作りたくなった．

最終的にこういうのができた．ダブルクリックで起動できる．

![akaneChanShortCut.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305855/74dd6947-8351-c938-50f6-b45720a7dd81.png)


## やったことたち

### コマンドでやっている流れをそのまま.batファイルに書く

まず`AkaneTimer.txt`のようにテキストファイルを作成して，コマンドでの操作をそのまま書く．

```bash
cd your/repository
python ./main.py
pause
```

最後に`pause`を入れとくといいらしい

**2019/11/26 追記：**
以下のようにも書けます(@nukie_53さんコメントより)

```bash
START /D "your/repository" python ./main.py
```

`/D`スイッチで開始ディレクトリを指定してプログラムを起動できる．
`/MAX`スイッチをつけると最大化して起動できる．(`/MIN`で最小化)
その他の記法は[コマンドとオプションの簡易解説 一覧表](https://jj-blues.com/cms/command_and_option_list/)が参考になる．(膨大すぎる…)

### 拡張子.batに変える

今回だと`AkaneTimer.bat`に変える

ダブルクリックしてみると…

![no_need_cmd.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305855/0d464dbe-6df1-96eb-3742-39860fcf6e8d.png)

起動した！

けどコマンドプロンプトも一緒に立ち上がる．邪魔だし，間違えてコマンドプロンプトを消すと当然プログラムも落ちてしまう．やだ

### 黒画面をバックグラウンドで起動

これにはVBScriptを使った．

やることは簡単で，`no_cmd.txt`をbatファイルと同じ階層に作って以下のように書く．

```ba
Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c AkaneTimer.bat", vbhide
```

`vbhide`で隠している．これを`.vbs`に変えて，ダブルクリックで実行すると，

![akaneNoCmd.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305855/749ffa73-7647-3145-9da9-2242dc4543c4.png)


黒画面消えた！！


### ショートカットをデスクトップに置く

毎回二つもファイルいらないので，こいつらは`main.py`と同じファイルにでも入れておいて，`.vbs`ファイルのショートカットだけデスクトップに置いた．

### アイコンがださい

![dasai.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305855/ed69bf16-55a6-60a6-1e5d-d28d99cf885a.png)


変えよう．

[Windows10でアイコンファイルを作成する方法]( https://toolmania.info/post-10389/ )を参考にした．簡単にまとめると

1. ペイントで絵を描くか持ってくる(正方形で描こう)
2. 32x32のbmpファイルで保存
3. 拡張子を`.ico`に変える
4. ショートカットのプロパティからアイコンを選択する

![akaneChanShortCut.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305855/6d34ca02-1df4-68e4-622d-6514c0142deb.png)


これで上のショートカットができた．やったね！

## 最後に

とりあえず目標は達成したけど，もっといいやり方あったら教えてください…
【図解】【3分解説】UnicodeとUTF-8の違い！【今さら聞けない】

# 【図解】【3分解説】UnicodeとUTF-8の違い！【今さら聞けない】

## はじめに
UnicodeとUTF-8の違いについて理解が曖昧だったので、調べました。コード書いててたまに巡り会いますよね。
調べたら説明が長いサイトが多く、予想以上に時間がかかってしまったのでここでは直感的に説明。

読んで分かりやすかったり少しでも何か学べたと思えたら **いいね** や **コメント** をもらえるとこれからの励みになります！よろしくお願いします！

~流れ~
1. さっそくざっくり説明
2. まとめ
3. もう少し時間がある方へ
4. 雑談
5. 参考

## さっそくざっくり説明
あくまで私がしっくりくる説明です。UnicodeとUTF-8の私のイメージを図で表すと下図。

![UnicodeとUTF-8の概念図](https://imgur.com/nDl2Yvf.png)

**【説明】**
パソコンが文字を理解するまでには **文字→[Unicodeを参照]→コードポイント→[UTF-8による変換]→符号→[パソコン理解]** という流れ。

* **Unicode**: 世界中のあらゆる文字たちにとりあえず16進数の数字(**コードポイント**)を割り振った表。つまり、**「文字 → コードポイント」に変換する表**のようなもの。
>Ex.) 「あ」のコードポイントは「3042」

* **UTF-8**: Unicodeで割り振ったコードポイントをパソコンがわかるように別の16進数の数字(**符号**)に変換する方法の1つ。変換方法の違いでUTF-16とかUTF-32とかの仲間がいます。つまり、**「コードポイント → 符号」に変換する方法** の1つ。
>Ex.) コードポイント「3042」をUTF-8で符号に変換すると「E38182」(16進数)

これでざっくりと

* **Unicodeが文字からコードポイントに変換するための表**のようなもの。
* **UTF-8がコードポイントから符号に変換する方式**

ということがわかって頂けたかと思います。以上です。
(Unicodeのコードポイントをそのままパソコンに理解させるよりもUTF-8などによる符号を使う方がバイト削減できるため、UTF-8で符号化している。詳細は後述の[雑談](#雑談))

## まとめ

|言葉|説明|
|:---:|---|
|コードポイント|Unicodeがあらゆる文字につけた数字|
|符号|パソコンが理解してくれる数字|
|**Unicode**|**文字→コードポイントしてくれる表**みたいなもの|
|**UTF-8**|**コードポイント→符号してくれる方式**の1つ|

***UTF-16のことをUnicodeと記しているソフトウェア(Windowsのメモ帳など)もありますのでUnicodeとあったらそれはUTF-16を使って変換したものなのだな、というふうに理解してください。*** そうなってしまっている理由は[こちら](http://yanok.net/2016/03/utf-16-unicode.html)で解説されていました。

これでUnicodeとUTF-8の違いはバッチリですね！おわり。

読んで分かりやすかったり少しでも何か学べたと思えたら **いいね** や **コメント** をもらえるとこれからの励みになります！

## もう少し時間がある方へ
手計算で文字をUTF-8での符号まで計算してみましょう。
理解が一気に深まります。手順は以下。

1. **文字のコードポイントをUnicodeから見つけてくる。**
2. **コードポイントをUTF-8の方式で変換してみる。**

**Omiitaの「お」**をUTF-8による符号まで変換してみます。

1. **文字「お」のコードポイントをUnicodeから見つけてくる。**
  > **「お」のコードポイント:304A**


2. **コードポイント「304A」をUTF-8の方式で変換してみる。**
  2.1 まず「304A」を2進数に変えます。
  2.2 (コードポイントが0800 … FFFFの間にある今回の場合)、先頭から4, 6, 6ビットに分けます。
  2.3 分けたものにそれぞれ先頭からE0,80,80を足せば、終了です。
  > [2.1] 304A => 0011000001001010
[2.2] 0011000001001010 => 0011 / 000001 / 001010 => 03 / 01 / 0A (16進数)
[2.3] 03010A + E08080 = **E3818A**

これで「お」はUTF-8で「E3818A」であると計算できました。
あとは[こちらのサイト](http://ash.jp/code/unitbl21.htm)でCtrl+Fで「E3818A」を検索すると「お」であることがわかります。
(10進数で示すなら「お」=> 「E3 81 8A」 => 「227 129 138」となります。)

## 雑談

* 厳密にはUnicodeは「符号化文字集合体」、UTF-8などは「文字符号化方式」と日本語で言われています。
* UTF-8ではアルファベットは1バイトでひらがなは3バイトです。
* **コードポイントをそのまま符号として使う方式はUTF-32** と呼ばれています。
* UTF-32のようにコードポイントをそのまま使おうとすると世の中の文字は大量にあるので、あらかじめコードポイントを4バイト長にしなくてはならないので**符号が全て4バイトになってしまい非効率です**。
* 符号化文字集合体(Unicode)を文字符号化方式(UTF-8など)で符号化する意義については[こちらの質問](https://teratail.com/questions/205670)でまさに議論されています。

読んで分かりやすかったり少しでも何か学べたと思えたら **いいね** や **コメント** をもらえるとこれからの励みになります！よろしくお願いします！

## 参考

* [Unicode一覧 3000-3FFF](https://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_3000-3FFF)
ひらがなが入っているUnicodeの箇所(Wikipedia)

* [新人さんに知ってほしい「文字コードのお話」](https://qiita.com/yuji38kwmt/items/b3a7820b4d3b544da4ff)
文字コードをしっかりと知りたい方へのQiita記事

* [UTF-8](https://ja.wikipedia.org/wiki/UTF-8)
UTF-8の説明(Wikipedia)
kaminariでページネーション作ったる ❏Rails❏

#ページネーションとは
今何ページ目にいるかがわかるやつです。
よく画面の下にあります↓
![7355fe4673cc916f3090de3d6f313ad7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529651/8915b9b2-4719-53ab-acb3-9304bc2a0da4.png)

kaminariというgemを使うことで簡単に実装できます。

#【その1】gemを追加する
```ruby:Gemfile
gem 'kaminari'
```

```terminal
bundle install
```

<br>
サーバーを再起動します。

```terminal
rails s
```
なぜなら、サーバーを起動した際にgemが反映されるからです。

#【その2】コントローラーを編集する
```ruby:tweets_controller.rb
def index
  @tweets = Tweet.all.page(params[:page]).per(5)
end
```

ページ数がpageというキーになって、パラメータとして送られます。
1ページあたりに表示する件数をper(5)のように記述します。
この場合は5件表示されます。

#【その3】ビューファイルを編集する
```erb:index.html.erb
<%= paginate(@tweets) %>
```
好きなところに置いてください。
これでページネーションが完成します。

pagenateではなくpaginateなので注意！！

<br>
ではまた！
Rubyコーディング規約 ❏Ruby❏

#コーディング規約
ルールではなくマナー
僕が気をつけているポイントを紹介するよ！

#インデントは2つ
```ruby
if num > 0
●●if num < 100
●●●●puts "100より小さい正の数"
●●end
end
```

#クラス内の各構成要素の区切りに空行を入れる
ただし、最初と最後は空けない。

```ruby:tweets_controller.rb
class TweetsController < ApplicationController   #最初は空けない
  before_action :move_to_index, except: :index
#---ここ---
  def index
    @tweets = Tweet.all
  end
#---ここ---
  def new
    @tweet = Tweet.new
  end
#---ここ---
  def create
    Tweet.create(tweet_params)
  end
#---ここ---
  private
    def tweet_params
      params.require(:tweet).permit(:text, :image)
    end
#---ここ---
    def move_to_index
      redirect_to root_path unless user_signed_in?
    end
end   #最後も空けない

```

#if文のthen<br>while文のdoは省略する

```ruby
if num < 100
  puts "100より小さい"
end

while num < 100
  puts num
  num += 1
end
```

#文字列リテラルはダブルクォーテーション
```ruby
puts "ダブル！！"
```
もちろん例外もあるよ！

#三項演算子は簡単な条件の時のみ
```ruby
puts score > 60 ? "合格":"不合格"
```
少しでも複雑ならif文！

#変数・メソッド名は小文字＆スネークケース
```ruby
#変数
num = 15
add_color = "yellow"

#メソッド
def index
end

def add_something
end
```
2単語繋げる場合は_を使う！

<br>
参考
>https://shugo.net/ruby-codeconv/codeconv.html

<br>
ではまた！
【随時更新】参考になったGitの神記事まとめ

## はじめに
タイトルのとおり、Gitに関する操作でトラブルになった際にお世話になった記事や役に立った記事をまとめたリンク集です。

もちろん、新たにお世話になった記事があれば、随時更新していきます。

## XXを取り消す
[gitでのヤバイ！を取り消す方法](https://qiita.com/ritukiii/items/74ee3274c3f218511a0c)
↑の記事のcase3の状況に対応したくて、検索していた際に出会いました。Gitでのヤバイ状況に対する対応が3つ書かれています。

[【git】マージしたけどやっぱりやめたい時のやり方4種類](https://qiita.com/chihiro/items/5dd671aa6f1c332986a7)
↑の記事のその2の状況に対応したくて、検索していた際に出会いました。タイトルのとおり、マージを止めたいときに非常に参考になる記事です。

## エイリアス
[gitで便利なエイリアス達](https://qiita.com/peccul/items/90dd469e2f72babbc106)
エイリアスを導入する際に参考にした記事です。
方法および豊富な具体例がとても勉強になりました。


## おわりに
@ritukiii さん、
@chihiro さん、
おかげさまで、トラブルを解決できました。

@peccul さん
おかげさまで、エイリアスを導入することができました。

本当にありがとうございました。
Perl new mod メモ的なもの

Perlのモジュールを作成したり、遊んだりするときの参考的なメモです。
書きかけです。

# 対象読者 or 前提条件 or 環境

* Perlでモジュールを書く方など

# perlnewmod
http://perldoc.jp/docs/perl/5.10.0/perlnewmod.pod

## 事前に読んでおくドキュメント
- http://perldoc.jp/docs/perl/5.26.1/perlmod.pod
- http://perldoc.jp/docs/perl/5.10.1/perlmodlib.pod

## 何を作るかを決める

何を作るかを決める。すでに作られていないか調べる。

## 既存のモジュールを参考にする

- https://metacpan.org/pod/Text::Tabs
- https://metacpan.org/pod/release/ASHER/File-Copy-1.5/Copy.pm
- https://perldoc.jp/docs/modules/WWW-Mechanize-1.02/Mechanize.pod

# 名前を決める

- http://perldoc.jp/docs/perl/5.10.1/perlmodlib.pod
- http://pause.perl.org/pause/query?ACTION=pause_namingmodules
- https://bayashi.net/wiki/perl/cpan_modules/call_web_api

# ツール

- http://gihyo.jp/dev/serial/01/perl-hackers-hub/005001
- http://gihyo.jp/dev/serial/01/modern-perl/0026

---

# 参考

- https://metacpan.org/pod/WebService::Rakuten#Documentation
- http://gihyo.jp/dev/serial/01/perl-hackers-hub/005002
- https://metacpan.org/release/WebService-Simple
- https://bayashi.net/wiki/perl/cpan_modules/call_web_api
- https://metacpan.org/search?p=2&q=rest
- https://github.com/yusukebe/WebService-Simple/blob/master/t/01_api_get.t
- http://gihyo.jp/dev/serial/01/modern-perl/0026
- http://gihyo.jp/dev/serial/01/modern-perl/0026
- https://github.com/gnustavo/jira-rest


# 次にやること

作業用に使うコードをまとめてモジュール化する。

# あとがき
【Rails】RSpecで`visit`が`undefined method`と怒られたときの解決法

## はじめに
Rails+RSpec+Capybaraで書いたテストを実行しようとしたらタイトルのようなエラーが出た方に向けて解決法を残しておきます。

## この記事が役に立つ方
- タイトルのようなエラーで困っている方

## この記事のメリット
- エラー解決！

## 環境
- macOS Catalina 10.15.1
- zsh: 5.7.1
- Ruby: 2.6.5
- Rails: 5.2.3
- RSpec: 3.9.0
- Capybara: 3.29.0

## エラー内容

```zsh
NoMethodError:
       undefined method `visit' for #<RSpec::ExampleGroups::UsersIndex::IndexHtmlErb:...>
```

なぜか`visit`が定義されていないことになっている。

## 原因
`Capybara`が読み込まれていないことが原因です。

`visit`は`Capybara`内で定義されているため読み込む必要があります。

## 解決法　その１
以下を追記します。

```ruby:spec/spec_helper.rb
...略

require 'capybara/rspec' # 追記

RSpec.configure do |config|

...略
```
## 解決法　その２（１で解決しなかった場合）

もういっちょ追記します。

```ruby:spec/spec_helper.rb
...略

require 'capybara/rspec'

RSpec.configure do |config|
  config.include Capybara::DSL # 追記

...略
```

## なぜ解決したのか？

公式のREADMEに答えが書いています。(※以下はバージョン3.29対応版)
[capybara/README.md at 3.29_stable · teamcapybara/capybara · GitHub](https://github.com/teamcapybara/capybara/blob/3.29_stable/README.md)

> Load RSpec 3.5+ support by adding the following line (typically to your spec_helper.rb file):

RSpec3.5以上を使っているなら、`spec_helper.rb`に以下を追記してねと書いてあります。

```
require 'capybara/rspec'
```

これで`Capybara`が読み込まれることになります。
ここまでが解決策１の範囲です。

ただ、これで解決しない方はREADMEの次の文章に答えが書いてあります。

> If you are using Rails, put your Capybara specs in spec/features or spec/system (only works if you have it configured in RSpec) and if you have your Capybara specs in a different directory, then tag the example groups with type: :feature or type: :system depending on which type of test you're writing.

書いたテストが以下ディレクトリにあるか、
`spec/features`
`spec/system`

タグが以下でないと`Capybara`が読み込まれません。
`type: :feature`
`type: :system`

そのため、それ以外のパターンに該当してしまう場合は
**解決法　その２**
で追記したように強制的に`Capybara::DSL`を読み込んでしまうことで解決出来ます。

## おわりに
自分は結構ここでハマってしまったので、同じような方の役に立てればと思います。

日本語の記事で楽をせず、困ったら公式を見ないといけませんね:sweat_smile:

## 参考にさせて頂いたサイト（いつもありがとうございます）
[capybara/README.md at 3.29_stable · teamcapybara/capybara · GitHub](https://github.com/teamcapybara/capybara/blob/3.29_stable/README.md)
leafletを鍛える。その22

#概要

leafletを鍛えてみた。
geocodingしてみた。

#成果物


https://embed.plnkr.co/DTywLR3CC6Ffboxyeh4Y/

d3.js
https://embed.plnkr.co/NNkUEkZ5UjBcKi3Kvoo3/


以上。
プルリクテンプレート -バグ系-

## 現象

* どういった現象が起きているのか

## 再現手順

* 分かっていれば再現手順の記載

## 原因
・ ○○が原因。

## 修正内容
・　○○を修正
・　○○を修正

## 動作検証

- [ ] ○○を確認
 
```
・ 前提条件
○○している

・ リクエストメソッド
POST, PUT, GET, DELETE

・ リクエストURL

・ jsonデータ差分
{
  "hoge" : 0,
  "fuga_date": "2019-01-01",
}

```
DB確認


- [ ] ○○を確認

```
・ 前提条件
○○している

・ リクエストメソッド
POST, PUT, GET, DELETE

・ リクエストURL

・ jsonデータ差分
{
  "hoge" : 0,
  "fuga_date": "2019-01-01",
}

```
DB確認
[C#] テストのためにプライベートメンバ変数を追加するのは悪か？

現在、結合テスト用兼可視化ツールを作成しているが、例えば以下のようなクラスについてテストする場合について少し疑問が出てきた。

``` C#
class A
{
  public string Str { get; }
  string Temp_Str { get; }
}
```
上のクラスをテストする際に、最終出力であるStrの中間出力であるTemp_Strをテストもしくは可視化したい場合、Temp_Strをprivateとしてではあるがメンバ変数とするのはどうなのだろうか。当然、外からprivateにはアクセスできないので、実際にはこのクラスに対してリフレクション経由で取得しているのだが、本来不要であるはずの中間出力をメンバ変数にするのはいささかどうなのだろうか。

もちろん、実際は単純なstring型ではなく、情報を格納しているclassである。
テストという意味では、中間出力をまとめたクラスを別途作成してそれに対してテストを行なうか、中間出力しているクラスに対してテストを行なうなど方法はいくつかあるが、あえてメンバ変数にしてテストするのもまた選択肢の一つではあるのかなぁとも思いつつも、テストのためにコードを汚すのもいかがなものかと思う。

テストという意味では、最終出力のみをテストすればいいわけで、中間出力なんて別に必要ないはず。ただ、可視化という意味では、中間出力があった方が便利だとも思うわけで、少し堂々巡り気味。外から見た時に、privateでは何も変化がないわけだし…。

テスト難しい。テストの為の設計と可読性は両立できるものなのだろうか。
Tensorflow Dockerでjupyter notebookを使う

# docker runで起動

[公式サイト](https://www.tensorflow.org/install/docker?hl=ja#gpu_support)にあるように、jupyterのタグが付いたイメージをpullして、下記のようにrunすれば、jupyter notebookが起動する。

```
$ docker run -it -p 8888:8888 tensorflow/tensorflow:nightly-py3-jupyter
```

ホストのウェブブラウザで`http://127.0.0.1:8888/?token=...`を開く。
`/tf`がルートとして開く。

# コンテナ内で bash シェル セッションを開始後に起動

コンテナ内で bash シェル セッションを開始する。

```
$ docker run -it -p 8888:8888 tensorflow/tensorflow:nightly-py3-jupyter bash
```

コンテナ内で下記のコマンドを実行して、jupyter notebookが起動する。

```
# jupyter notebook --port 8888 --ip=0.0.0.0 --allow-root
```

ホストのウェブブラウザで`http://127.0.0.1:8888/?token=...`を開く。
コンテナ内の任意のディレクトリをルートとして、jupyter notebookが起動することができる。

(上の例では、jupyter付きのイメージを使っているが、jupyterなしのイメージを起動後にpipで入れた場合でも可能。)

# 参考
https://qiita.com/tand826/items/0c478bf63ead75427782
https://qiita.com/ciela/items/0e0392f600c92b93d7c6
php.iniの場所・パスを調べる方法

php.iniを変更したいけど、場所がわからない時、ありますよね。
そんな時はこれ↓

```common-lisp

$ php -i | grep php.ini
Configuration File (php.ini) Path => /Applications/MAMP/bin/php/php7.1.31/conf
Loaded Configuration File => /Applications/MAMP/bin/php/php7.1.31/conf/php.ini
```


###### 参考
https://qiita.com/tmsanrinsha/items/2fda05db29b62090e3de
RailsでぐるなびAPIを使って店舗検索する。

#アクセスキーの取得
https://api.gnavi.co.jp/api/ でアクセスキーを取得します。

#実装する
shops_controllerを作成し、indexでぐるなびapiで店舗データ取得します。
今回は、先ほど取得したアクセスキーをcredentialsで管理しています。

```ruby:shops_controller
    api_key= Rails.application.credentials.dig(:grunavi, :api_key)
    url='https://api.gnavi.co.jp/RestSearchAPI/v3/?keyid='
    url << api_key  

    if params[:search]
    word=params[:search]
    url << "&name=" << word #名前で検索
    end
    url=URI.encode(url) #エスケープ
    uri = URI.parse(url)
    json = Net::HTTP.get(uri)
    result = JSON.parse(json)
    @rests=result["rest"]
```

次に、検索フォームと検索結果を表示する画面を作成します。
 レイアウトはBootstrapを使っています。

```ruby:index.html.slim
= form_tag(shops_index_path,:method => 'get') do
  = text_field_tag :search
  = submit_tag 'Search'

- if @rests
  - @rests.each do |rest|
    .card.mb-3 style=("max-width: 1000px;")
      .row.no-gutters
        .col-lg-6
          = image_tag(rest["image_url"]["shop_image1"])
        .col-lg-6
          .card-body
            p = "名前: #{rest["name"]}"
            p = "カテゴリー: #{rest["category"]}"
            p = "住所: #{rest["address"]}"
          
```

では、検索フォームにカレーと打ってみてください。
店名にカレーが入っている店が表示されます。
<img width="1020" alt="スクリーンショット 2019-11-25 4.05.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537630/95b7feb6-2562-840b-5d0a-83d543811e0d.png">
Git操作まとめ 〜Gitのバージョン管理が必要ないファイルやディレクトリを除外する(.gitignore)

この記事では、Ubuntu18.04LTSにインストールしたGit(version 2.17.1)を使用しています。

## .gitignore

Gitは、git initしたディレクトリの全てを履歴管理していきます。
そのディレクトリの中でも、履歴を追う必要のないファイルやディレクトリが出てくることがあります。

そうした場合、Git管理下のディレクトリで、.gitignoreというファイルを作成し、そこにGitの管理対象外にしたいファイルやディレクトリを記載することで、Gitの管理対象のから除外することができます。

```shell
touch .gitignore
```

.gitignoreファイルをエディタで開いてGitの管理対象外にするファイルを記述すればOKです。

この.gitignoreファイルは<strong>Gitの管理対象にしておかなければならない(コミットする)</strong>ので、注意が必要です。

---

### 本記事目次ページ
[Git操作まとめ](https://qiita.com/tsweblabo/items/6aec9d022c08954f5024)
Kubernetes（EKS）でIngressをデプロイした時に443ポートのリスナーも作成して証明書も組み込むための方法

## `annotations`へ色々追加する
```
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: "ingress"
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-east-1:xxx:certificate/xx
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
    alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
```

## 各項目の細かい説明
https://kubernetes-sigs.github.io/aws-alb-ingress-controller/guide/ingress/annotation/
Mac上のUbuntu16.04 with VirtualBoxでIntel RealSense D435を動かす（補足）

#  背景
MacでIntel RealSense D435のサンプルコードを動かしたいけど， D435のGetStartedページにはWindows/Linuxの記載しかない．
解決策1. ソースコードからビルドしMac上で動作させる（下記記事参照） → cmakeのところで挫折 （そもそも自分の環境だとXcodeのDL, インストールに時間がかかりすぎた）
https://qiita.com/OTL/items/ce49410580730d6dd499
解決策2. VirtualBox上でUbuntuを動かし， そこで動作させる（下記記事参照） →　最終的にOSX Mojave上のUbuntu16.04でうまくいったが， USB認識のところでつまづいたため， 本記事で補足する．
https://qiita.com/nataly510/items/034f946362e7a8ecb6a8

#  補足内容
上記解決策２の記事をそのままやると， "RuntimeError: No device connected" エラーが出る．
VirtualBox上のUbuntuにおけるUSBデバイス認識について， 下記を参考にしたところ， うまくいった．
https://qiita.com/ntkgcj/items/350863bf933fefe9c5b1

VirtualBox（ホスト側）においてUSBフィルタを追加する際のポイントは以下の通り．
・ ベンダーID、プロダクトID、リビジョンをそのまま残し、メーカー、製品名、シリアルNoを消すこと
・ USB3.0（<font color="Red">USB2.0ではない</font>...自分はここでつまづいた）を有効化すること

# 補足の補足
上記だが， VirtualBox5.xで動かしていたところ， realsense-viewer（※）を動かすところで
"opengl 3.0 or arb_vertex_array_object extension required"
と出てつまづいた． 結局はOpenGL 3.0がインストールされていないことが原因っぽい． "VBoxはOpenGL 3.0以降に対応していません"的な記事（ https://askubuntu.com/questions/858407/how-to-update-to-latest-opengl-version-on-virtualbox-ubuntu-linux-machine ）をStackOverflowで見かけるかもしれないが， 絶望してはいけない． VBox6.0.14にインストールしたら普通に動いた．
※https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_linux.md
Eclipse Che 7 を minishift で動かしてみる

## はじめに

Eclipse Che のバージョンが７になって、色々と変わったというので、一年ぶりに minishift（OpenShift 3.x の minikube版）を立ち上げて、Eclipse Che を動かしてみました。[Eclipse Che の Quick Start](https://www.eclipse.org/che/docs/che-7/running-che-locally/) のままでは動かなかったので、備忘録として残しておきます。

ちなみに、minishift だとメモリも必要だし、ベースとなっている kubernetes がちょっと古いので、目的にもよりますが、個人的には minikube で十分かなと思っています。

## 準備

検証環境は macOS Mojave 10.14.6 (18G2016) です。以下の準備をしておきます。

+ VirtualBox （もしくは、Docker Desktop for Mac と docker-machine-driver-hyperkit）
+ minishift（1.34.1）
+ chectl

chectl 以外のインストールは Homebrew でも、オリジナルなパッケージを使っても、お好みの手段で。なお、minishift は Docker Desktop に同梱の hyperkit を使うだけなので、minishift を動かすために Docker Desktop を起動しておく必要はありません。chectl については以下の通りです。

``` 
$ bash <(curl -sL https://www.eclipse.org/che/chectl/)
```

## minishift の準備と起動

``` 
$ minishift config set memory 8192
$ minishift config set vm-driver virtualbox # もしくは、hyperkit
$ minishift start
$ minishift addons install --defaults
$ minishift addons enable admin-user
```

## Che: インストールと起動（方法１）

``` 
$ oc login -u system:admin
$ chectl server:start -p minishift -a operator
```

このあと、http://che-che.xxx.xxx.xxx.xxx.xxx.nip.io をブラウザでアクセスすれば、Eclipse Che が使えます（xxx.xxx.xxx.xxx はインストールのメッセージの最後の部分に表示されています）。しかし、この方法ですと、OpenShift のDashboard からは見えないので、minishift で動かす意味が薄いと感じます。

## Che: インストールと起動（方法２）

``` 
$ oc login -u system:admin
$ chectl server:start -p minishift -a minishift-addon
```

成功したら、`minishift console` とするとデフォルトブラウザで OpenShift のコンソールが立ち上がりますので、Username: developer, Password:（適当に何か打ち込む）でログインし、http://che-che.xxx.xxx.xxx.xxx.nip.io を開くと、Che が立ち上がります。

なお、環境によっては

```
    ✖ Apply Che addon
      → error: E_TIMEOUT
```

というエラーの後、たくさんのエラーメッセージが出て起動に失敗することがあります。これは、`chectl` のタイムアウトが短く、タイムアウト値がハードコーディングされていて、外から変更できないためです。`~/.local/share/chectl/client/7.3.2/lib/tasks/installers` にある `minishift-addon.js` に以下のパッチをあてることでうまくようになります。

```
--- minishift-addon.js-bak	2019-11-24 11:14:19.000000000 +0900
+++ minishift-addon.js	2019-11-24 11:15:15.000000000 +0900
@@ -139,7 +139,7 @@
             yield this.installAddon(addonDir);
         });
     }
-    applyAddon(flags, execTimeout = 120000) {
+    applyAddon(flags, execTimeout = 600000) {
         return tslib_1.__awaiter(this, void 0, void 0, function* () {
             let args = ['addon', 'apply'];
             const imageRepo = this.getImageRepository(flags.cheimage);
```

では、試しに、C/C++ の workspace を作って、デモプログラムをビルドしてみましょう。

<img width="1171" alt="ScreenShot.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318080/55b69f3f-bcb8-01a2-943a-4552dc9d10c0.png">

なるほど、ブラウザで Visual Studio Code が動くんですね。でも、これだったら、ネイティブの Visual Studio Code でプログラムして、OpenShift にデプロイする方がいいかなっていう気もしたりします。

## Che: 停止と削除
```
$ chectl server:stop # ← access-token が必要と怒られることがある！
$ chectl server:delete
$ minishift stop
```

access-token が必要と怒られた時の対処法は、よくわかりません。

## おわりに

minishift は OpenShift 3.11 までにしか対応していないのが寂しいです。[Redhat Developer](https://developers.redhat.com/) に登録すれば、[Red Hat CodeReady Container](https://cloud.redhat.com/openshift/install/crc/installer-provisioned) として OpenShift 4.x を利用することができます。無償とはいえ、要登録（ライセンスへのアグリーメントが必要）なところが、ちょっとハードルがありますね。
ひとこまアニメをJavaScriptで実装

#ひとこまアニメとは
- 世の中には「ひとこまアニメーション」（ひとこまアニメ）という表現メディア？のジャンルが存在するらしい。

（ひとこまアニメを アニメGIFに変換した例　↓　）
![色即是空.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216556/af69a8eb-ba52-c357-a073-467e0506cd41.gif)

- 要は、アプリ（ソフト）上で１枚の絵を描いた過程が記録され、再生できるというもの。
- そのメリットや可能性について、参考記事（[注１](#注１)）で詳しく述べられている。
- また、その記事によると、ひとこまアニメを実現するための無料ソフト（PEAS motch! / 9VAe）も配布されている。

#ソフト（アプリ）方式の問題点
- 無料ソフトとはいえ、当然ながらインストールが必要で、これがかなりのハードルとなる。
- インストールは手間でもあるし、スマホ等では容量の余裕も少ないことがある。
- 怪しいソフトはセキュリティの心配もある。
（最近のOSでは、怪しいソフトを入れたり実行したりすると警告が表示され、躊躇される。）

#動機・やってみたこと
- 「ひとこまアニメ」だけの機能であれば、数十ステップのプログラムで実装できるかも？  というわけで、
- HTML 内の JavaScript で「なんちゃってひとこまアニメ」を実装してみた。 
  
http://www.kinet-tv.ne.jp/~minor/onepager.html  

- JavaScript は、当然ながらサーバから端末側のブラウザに送信し、処理をおこなう。
- 参考ソース [注２](#注２) を絶大に参考にさせていただきました！　ほぼ fork ?
- Android 9 で動作確認。iOS でも動くかな？  →後述のバグあり。

#JavaScript による実装のメリット
- 対応ブラウザがあればインストール不要。
- 機器や OS の違いを吸収できる。
- セキュリティも、アプリよりは、まぁ安心。

#苦労したこと
- スマホのタッチスクリーンに対応したこと。  
　（マウスとはイベントが異なるので、専用の実装が必要。PCだけではデバッグしにくい。）
- JavaScript には、sleep 関数が組み込まれていないため、タイマーで二重ループを遅延させてゆっくり回すという、ややこしい処理を実装した。

#できてないこと（できたらいいこと）
- 動画データの保存が未実装。（対応するならサーバへの保存、またはサーバ経由でローカルに保存、となるか？）
- GIF や mpeg などへのフォーマット変換･出力ができていない
　（静止画ダウンロードのみ対応。）
- 線の表現効果は色と太さのみ対応。濃さとかビヨビヨ線とか未対応。
- ２コマ以上のアニメ制作ができない。（できなくていいけど）
- スマホのマルチフィンガーで誤動作する。
- [絵をほぞん] 機能にブラウザ依存？のバグあり。
- iPhone でバグあり？らしい。
(太さが変更できない、Undoができない。)
- 描画時間はサンプル点の数にほぼ比例する。すなわち、高速なマシンではサンプル点が多く取れるので、逆に遅くなる。描画時間を線の長さに比例するように実装することもできるが、そうすると速度変化の記録が難しくなる。
(現在は点サンプル点の密度により描画速度の相対的な変化を記録できている。サンプル点の記録時刻を持っておいて再現するのも可能だが、気持ちよく再生できるか不詳。)

#参考資料
###注１
参考記事：ひとこまアニメーション（書き順アニメ）の作り方
https://qiita.com/danjiro/items/8dd0d7c7263f62189437
###注２
参考ソース：canvasでのお絵かきソフトの作り方と実例
https://pasonyu.com/how-to-make-drawing-software-with-canvas/
Jupyter Notebook マジックコマンド自分的まとめ

### 前提条件
- macOS Catalina 10.15.1
- anaconda 4.17.12
- jupyter-notebook 5.0.0
- Python 3.6.9

### マジックコマンドとは

マジックコマンド（Magic Commands）は、IPythonのカーネルから提供される仕組み。Notebookの動作に関連した機能のほか、ディレクトリ移動やファイル一覧を表示するなどのユーティリティ的な機能を提供する。

### マジックコマンドの基本

先頭に``%``を入力して続けてコマンドを入力する。現在のディレクトリを出力するコマンドは次のようになる。

```
%pwd
```

マジックコマンドの``%pwd``は、シェルを利用した``!pwd``と違いがないようにも見えるが、``!``を利用したコマンド実行はOSのシェルに依存するのに対し、マジックコマンドはIPythonカーネルから提供される機能に依存。

マジックコマンドが何らかの値を変える場合、Pythonの関数を呼び出した場合と同様、戻り値を変数に代入できる。

```python
curr_dir = %pwd
curr_dir
```

### 使いがちなマジックコマンド

- ``%time``

  Pythonの実行時間を計測するマジックコマンド。

  ```python
  %time sum(range(10000))
  CPU times: user 226 μs, sys: 0 ns, total: 226 μs
  Wall time: 230 μs
  ```


|出力 |説明 |
|---|---|
| Wall time       | プログラムの開始から終了までにかかった時間      |
| CPU times: user | user CPU time。プログラム自体の実行に要した時間 |
| sys             | system CPU time。OSのシステムコールに要した時間 |


- ``%timeit``

  複数回試行した結果の計測値を要約して返すマジックコマンド。以下の場合、1000回の繰り返し処理を7回試行した場合の時間が出力されている。

  ```python
  %timeit sum(range(10000))
  224 µs ± 21.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
  ```

  ループ回数と試行回数はオプションで指定可能。

  ```python
  # ループ回数2000回、試行回数5回
  %timeit -n 2000 -r 5 sum(range(10000))
  215 µs ± 17.9 µs per loop (mean ± std. dev. of 5 runs, 2000 loops each)
  ```

  複数行のPythonコードに対して%timeitによる計測を行う場合、以下のように先頭の``%``を2つ続け、``%%``にする。（Cell magics）

  ```python
  %%timeit -n 1000 -r 3
  
  for i in range(1000):
    i * 2
  
  75.2 µs ± 9.58 µs per loop (mean ± std. dev. of 3 runs, 1000 loops each)
  ```

- ``%history``

  コードセルの実行履歴を一覧で取得するマジックコマンド。

  ```python
  # 直近5つの履歴を取得
  %history -l 5
  ```

- ``%ls``

  UNIXコマンドの``ls``と同様の動作をするマジックコマンド。``!ls``とは違い、``%ls``はOSの種別を判断して、内部で実行するコマンドを使い分ける。（macOSの場合は``ls``コマンド、Windowsの場合は``dir``コマンド）

- ``%autosave``

  Auto Saveの頻度を変更できる。（default120秒）

  ```python
  # Auto Saveを60秒に1回実行する。
  %autosave 60
  ```

- ``%matplotlib``

  Matplotlibに関する設定を行うマジックコマンド。

  

   - - ``%matplotlib inline``

    inlineを指定した場合、コードセル直下にグラフが描画される。

    ![image-20191125010847446.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241748/7b6bc4c8-4a42-9b22-6438-000b0a7d3217.png)

    

  -  ``%matplotlib tk``

    tkを指定した場合、別ウィンドウにインタラクティブなグラフが出力される。

    ![image-20191125011247935.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241748/e060a535-020b-3de0-5ff3-0abf0b0cec13.png)


    

   - - ``%matplotlib notebook``

    notebookを指定した場合、コードセルの直下にインタラクティブなグラフが出力される。

    ![image-20191125011753694.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241748/a60a72c3-12cb-b970-08cb-d7ac8d5837b4.png)


  

  -  一度指定した出力方法を変更するには、カーネルのリスタートを行う。
よく使うSQL文 チートシート | SQLite編

# インストール
```
brew install sqlite3
```

# データベースの作成と接続
```
sqlite3 データベースファイル名
sqlite3 test.db
sqlite3 test.sqlite3
```

# テーブルを作成する
```
CREATE TABLE テーブル名(カラム名1 データ型, カラム名2 データ型);
create table personal2(id integer, title text);
```

# テーブルのデータを取得
```
select * from テーブル名;
```

# テーブルにカラムを追加する
```
ALTER TABLE テーブル名 ADD COLUMN カラム名[ データ型];
```

# テーブルを削除
```
DROP TABLE テーブル名;
```

# テーブルにデータを追加する
```
INSERT INTO テーブル名 VALUES(値1, 値2);
```

# テーブルのデータを更新
```
UPDATE テーブル名 SET カラム名1 = 値1, カラム名2 = 値2 WHERE 条件式;
```

# テーブルのデータを削除
```
DELETE FROM テーブル名 WHERE 条件式;
```

### 参考
https://www.dbonline.jp/sqlite/insert/index6.html
【Flutter】単語帳アプリ開発 〜スマホアプリデザイン作成〜(スプリント1)

# 使用ツール
adobe XD

# 本日の消化スプリントバックログ
見積時間: 3h
対応時間: 2h

# 対応内容詳細
XDで以下を作成
<img width="844" alt="Screen Shot 2019-11-24 at 11.36.04 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/27448b00-03e2-3be7-e23d-5de62fc6215a.png">

作成予定画面
- 単語帳リスト画面(トップ画面)
- 単語カード画面
- 単語カード一覧画面
- 単語カード編集画面

# スプリント状況
![screencapture-trello-b-A1ld6WKQ-pj-2019-11-24-23_42_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/a814ee9f-6286-dab3-38e8-ff3ed4ea8eb6.png)


# その他
デザインって業務だとデザイナー任せなので、、どこをこだわったら良いのかわからない、、

誰か、ちょろっと手直ししていただけたり、どういう部分にこだわればいいとか、教えていただきたいです。
Tensorflow(GPU) Docker環境構築

Tensorflow(GPU)のDocker環境構築に関する備忘録。

# 環境

Ubuntu 18.04
CPU: Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz
GPU: GeForce GTX 1080

# Tensorflow Dockerの要件を確認

https://www.tensorflow.org/install/docker?hl=ja#tensorflow_docker_requirements

# Docker 19.03のインストール

https://docs.docker.com/install/linux/docker-ce/debian/

# NVIDIA Container Toolkitのインストール
https://github.com/NVIDIA/nvidia-docker#ubuntu-16041804-debian-jessiestretchbuster

> Note that with the release of Docker 19.03, usage of nvidia-docker2 packages are deprecated since NVIDIA GPUs are now natively supported as devices in the Docker runtime.

(Docker 19.03のリリースでは、NVIDIA GPUがDockerランタイムのデバイスとしてネイティブにサポートされるようになったため、nvidia-docker2パッケージの使用は推奨されないことに注意してください。)

nvidia-docker2をインストールせずに、「Quickstart」の説明に従って、nvidia-container-toolkitをインストールする。

# NVIDIA Container Runtimeのインストール

[Installation](https://github.com/nvidia/nvidia-container-runtime#installation)と[Docker Engine setup](https://github.com/nvidia/nvidia-container-runtime#docker-engine-setup)を実施。

## 補足

NVIDIA Container Runtimeをインストールしないと、

```
$ sudo docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
```

のようにruntimeを指定して実行すると、

```
docker: Error response from daemon: Unknown runtime specified nvidia.
See 'docker run --help'.
```

とエラーが表示される。

[Why do I get the error Unknown runtime specified nvidia?](https://github.com/NVIDIA/nvidia-docker/wiki/Frequently-Asked-Questions#why-do-i-get-the-error-unknown-runtime-specified-nvidia)

# TensorFlow の Docker イメージをダウンロード
最新リリース版Tensorflow(GPU)、python3、jupyter付きのイメージをpullする例。
(py3を指定しないと、python2となるので注意。)

```
$ docker pull tensorflow/tensorflow:latest-gpu-py3-jupyter
```

# Tensorflow(GPU) Dockerの動作確認

tensorflow < 2.0のイメージの場合。
([公式ページ](https://www.tensorflow.org/install/docker?hl=ja#gpu_support)には、こちらが載っている。2019.11.25)

```
docker run --runtime=nvidia -it --rm tensorflow/tensorflow:latest-gpu-py3-jupyter \
       python -c "import tensorflow as tf; tf.enable_eager_execution(); print(tf.reduce_sum(tf.random_normal([1000, 1000])))"
```

tensorflow2.0<=のイメージの場合。

```
docker run --runtime=nvidia -it --rm tensorflow/tensorflow:latest-gpu-py3-jupyter \
       python -c "import tensorflow as tf; print(tf.reduce_sum(tf.random.normal([1000, 1000])))"
```
BloomRPCでgRPCをGUIデバッグ

というわけで今日は昨日実装したgRPCをデバッグしていきます。

使うのは [uw-labs/bloomrpc](https://github.com/uw-labs/bloomrpc) という、GUIアプリケーションです。
実はこのツール弊社謹製のオープンソースツールなんですねー。すごい。

## ダウンロード

早速ダウンロードしてみましょう。
READMEページの指示に従っていけば大丈夫です。
Macの場合はHomebrewでもインストールできます。

```sh
$ brew cask install bloomrpc
```

<img width="1680" alt="Screenshot 2019-11-24 at 11.48.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84014/368e609d-ab43-78a8-3b5e-56c04116f82c.png">

## protoファイルのインポート

ダウンロードしたら、protoファイルをインポートします。
grpcurlでもそうですが、gRPCはバイナリなのでprotoファイルを与えることでツールにフォーマットを理解させる必要があります。

画面左上の`+`ボタンから使用するprotoファイルを選択します。

<img width="1680" alt="Screenshot 2019-11-24 at 11.48.50 2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84014/4879cdd3-1235-ceda-2796-dbf71bd2ac37.png">

<img width="1680" alt="Screenshot 2019-11-24 at 11.50.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84014/89389658-51a9-0db5-6f31-205658733fde.png">

左側のパネルにAPIが読み込まれれば成功です。

<img width="1680" alt="Screenshot 2019-11-24 at 11.53.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84014/decd00f3-6128-be53-3d66-35847aa1c04e.png">

## リクエストの送信

準備は完了です。リクエストを送信してみましょう。
minikubeをスタートさせ（minikubeへのデプロイは[二日目の記事](https://qiita.com/KentaKudo/private/b0a824d23b47f3779ec5)を参照）、ポートフォワードでアプリの8090ポートを繋ぎます。

```sh
$ minikube start
$ kubectl -n qiita port-forward qiita-advent-calendar-2019-7c885c5698-hwkts 8090:8090
Forwarding from 127.0.0.1:8090 -> 8090
Forwarding from [::1]:8090 -> 8090
```

では前回ダミーで実装したGetTodoエンドポイントを叩いてみます。
ポート番号を`8090`に設定して画面中央の再生ボタンを押すだけです。
(`id`パラメータは今のところ用無しです。)

<img width="1680" alt="Screenshot 2019-11-24 at 12.08.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84014/175f6497-866c-f5a7-11ff-5d9e05b9a62a.png">

リクエスト結果は右側のパネルに表示されます。

<img width="1680" alt="Screenshot 2019-11-24 at 16.31.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84014/24c8cd8a-9b41-27ed-65fd-d69be1415567.png">

## protoファイルの更新

時にはprotoファイルを更新する必要がでてくることもあるでしょう。
そんなときは左上にある`Reload`ボタンを押します。protoファイルを読み込みなおし、新たなインターフェイスでリクエストを送信することができます。

<img width="1680" alt="Screenshot 2019-11-24 at 12.14.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84014/ea78dab8-7e26-8d6c-39b0-1e357106f9bf.png">

なお右上の`View Proto`ボタンを押すと読み込んでいるprotoファイルをプレビューすることができるので便利です。

<img width="1680" alt="Screenshot 2019-11-24 at 12.12.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84014/a15b5d83-4778-4f4c-c0ba-25e287bc94e4.png">

<img width="1680" alt="Screenshot 2019-11-24 at 12.14.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84014/4d3e0b65-c696-d8ff-cee8-2f62cb460a97.png">

---

いかがでしたでしょうか、BloomRPC。
今回はUnaryのAPIのみでしたが、ストリームAPIのデバッグもできます。
gRPCをGUIでデバッグしたいときにとても便利なツールなのでぜひ触ってみてください。

明日からは...データの保存をしていこうかなと思います:)
よく使うSQL文 チートシート | MySQL編


# mysqlのインストール
mac OSでhomebrewが入っている場合

```
brew install mysql
```
window OSの場合
こちらをご覧ください
https://webkaru.net/mysql/install-windows/


# ログイン

パスワードがない場合

```
mysql -u root
```

パスワードがある場合

```
mysql -u root -p
```

# データベースの一覧を表示

```
SHOW DATABASES;
```

# データベースへの作成

```
CREATE DATABASE DB名;
```

# データベースの削除

```
DROP DATABASE DB名;
```

# データベースの選択
```
USE DB名;
```

# テーブル一覧を表示
```
SHOW TABLES;
```

# テーブルを作成
```
CREATE TABLE テーブル名;
```

# テーブルを削除
```
DROP TABLE テーブル名;
```

# テーブルへデータを追加
```
INSERT INTO テーブル名 (カラム名, カラム名) VALUES ("データ"、"データ");
```

# テーブルのデータの変更

SETの後のカラム名には、変更したいデータを入れます。
WHEREの後のカラム名には、どのデータを変更したいか入れます。

```
UPDATE テーブル名 SET カラム名="データ",カラム名="データ" WHERE カラム名="データ";
```

# テーブルのデータを取得
```
SELECT * FROM テーブル名;
```

# テーブルのデータを削除
```
DELETE FROM meta_data;
```


# 大文字と小文字はどっちでもいいの?
どっちでもいいです。


### 参考
https://qiita.com/knife0125/items/bb095a85d1a5d3c8f706
https://dev.mysql.com/doc/refman/5.6/ja/select.html
Outsystemsで、いろいろなループの処理時間を計測してみた

# やったこと・背景

[以前の投稿](https://qiita.com/oyuchan/items/1820f6db40be6a297b61)で、if文を使ってループを回す方法と、C#の```Range()```のようなアクションを自作し、それを使ってForEachでループを回す方法の2種類を試してみました。
しかし、自作したRangeアクションだとループを2つまわすことになり、性能に問題があるような気がしたので、それぞれの方法（+α）の処理時間を計測しました。
ついでにForEachの時間も計りました。
また、ExtensionでFor文を実行するのと、ServiceStudioで作ったアクションでループを回すのとで、処理時間にどれほど差が出るのか気になったので試してみました。

処理時間は、Forgeで提供されている[Ticks](https://www.outsystems.com/forge/component-overview/2891/ticks)というComponentを使って計測しました。



# 環境
* Outsystems11 (Personal Environment)
* Traditional Web


# 計測方法・計測結果
100万回ループを回しました。
10回ずつ計測を行い、平均値を結果としています。
また、それぞれループの回数分1を足すという処理を行っています。

### if文でループを回す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/d82b132d-6efe-94b5-9e6d-8fa4e93964ae.png)

計測結果：1.600秒（100万回）

### Rangeアクションを使ってループを回す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/8dd6a53a-bb00-5ab8-c3bb-3ff80a87ce33.png)
RangeアクションをServiceStudioで作った場合と、Extensionで作った場合で実行速度が結構違いました。
##### RangeアクションをServiceStudioで作った場合
Ragneアクションは以下のように実装しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/4e88567a-31a0-c4ab-fec4-16268fe2decb.png)

計測結果：3.924秒（100万回）

##### RangeアクションをExtensionで作った場合
Rangeアクションは以下のように実装しました。
OutputParameterは、Integer型の項目のみを持つStructureのリストです。

```C#:Range.cs
public void MssRange(int ssStart, int ssLength, out RLIntegerRecordList ssIntegerList) {
	ssIntegerList = new RLIntegerRecordList();
    // TODO: Write implementation for action

    var tmpRecord = new RCIntegerRecord();

    for (int i = 1; i <= ssLength; i++) {
        tmpRecord.ssSTInteger.ssInteger = ssStart;
        ssIntegerList.Add(tmpRecord);
        ssStart += 1;
    }
 } // MssRange
```

計測結果：2.792秒（100万回）

(追記)
[こちらの記事](https://qiita.com/shoji9x9/items/1e4653ba2d2bae02ef21#_reference-7f67f3ff5fca607e27b5) で、より良い実装を紹介していただきました！
この方法だと、1.457秒（100万回）でした。


##### ForEachだけの実行時間
Rangeアクションを実行した後～ForEachが終わるまでの時間も計ってみました。
計測結果：1.515秒


### Extensionの中でfor文を実行
100万回だと値が小さすぎてうまく計測できなかったので、このパターンだけ10憶回ループを回しました。（ちなみにこれ以外のループでは、10憶回回すと余裕でタイムアウトしてしまいます。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471875/510b7f46-54e6-325c-bea8-1498db282cc4.png)

```C#:ForExtension.cs
public void MssForExtension(int ssLength, out int ssSum)
{
    // TODO: Write implementation for action
    ssSum = 0;
    for (int i = 0; i < ssLength; i++)
    {
        ssSum += 1;
    };
} // MssForExtension
```

計測結果：2.230秒（10憶回）



# やりたかったこと
最初、C#の```Range()```をラッピングしたExtensionを作れば今回自作したRangeアクションよりも早そうだと思ったのですが、ExtensionのOutputParameterに純粋なInt型のリストを設定できないので（やり方を知らないだけかも）結局、```Range()```で生成したシーケンスをRecordListの型にキャストしなきゃいけないということがわかりました。が、（For文を使わずに）RecordListの型にキャストするのは難しそうだったので断念しました…。



# まとめ

| if文 | Range (ServiceStudio) | Range (Extension) | ForEach | Extension |
|:-:|:-:|:-:|:-:|:-:|
| 1.600秒(100万回)  | 3.924秒(100万回)  | 2.792秒(100万回)  | 1.515秒(100万回) | 2.230秒(10憶回)  |


100万回のループで1秒以上かかるのはちょっと遅いなあと思いました。C#だけで実装した場合と全然速さが違いますね。
配列の要素をフィルタリング（array_filter, array_reduce）

# 配列の要素をフィルタリングする（array_filter, array_reduce）
次のような連想配列から`value`が偶数の要素のみを取り出します。

```php:index.php
$array = [
    [ 'number' => 1 ],
    [ 'number' => 2 ],
    [ 'number' => 3 ],
    [ 'number' => 4 ],
    [ 'number' => 5 ],
    [ 'number' => 6 ],
    [ 'number' => 7 ],
    ];
```

こちらを一旦`var_dump()`しておきます。

```php:index.php
array(7) {
  [0]=>
  array(1) {
    ["number"]=>
    int(1)
  }
  [1]=>
  array(1) {
    ["number"]=>
    int(2)
  }
  [2]=>
  array(1) {
    ["number"]=>
    int(3)
  }
  [3]=>
  array(1) {
    ["number"]=>
    int(4)
  }
  [4]=>
  array(1) {
    ["number"]=>
    int(5)
  }
  [5]=>
  array(1) {
    ["number"]=>
    int(6)
  }
  [6]=>
  array(1) {
    ["number"]=>
    int(7)
  }
}
```

このような構造の配列になっております(***添字に注目***)

まずは`array_filter()`を使って`value`が偶数の物を取り出していきましょう。
## array_filter()

```php:index.php
$array_even = array_filter($array, function ($int) {
    return $int['number'] % 2 === 0;
});
```

こちらを`var_dump()`してみます。

```php:index.php
array(3) {
  [1]=>
  array(1) {
    ["number"]=>
    int(2)
  }
  [3]=>
  array(1) {
    ["number"]=>
    int(4)
  }
  [5]=>
  array(1) {
    ["number"]=>
    int(6)
  }
}
```
うまく取り出せました。
添字を見てみると、***`$array`の添字がそのまま使われています。***
こちらが`array_filter()`の挙動です。

続いて`array_reduce()`を使って同様の処理を行っていきます。
## array_reduce()

```php:index.php
$array_even = array_reduce($array, function ($number, $int) {
    if ($int['number'] % 2 === 0) {
        $number[] = $int;
    }
    return $number;
});
```

こちらを`var_dump()`してみると

```php:index.php
array(3) {
  [0]=>
  array(1) {
    ["number"]=>
    int(2)
  }
  [1]=>
  array(1) {
    ["number"]=>
    int(4)
  }
  [2]=>
  array(1) {
    ["number"]=>
    int(6)
  }
}
```

`array_filter()`と同様に`value`に偶数を持つ要素を取り出すことができました。
添字を見てみると、***添字がリセットされ`0-based`な配列になっています***。

***単に配列をフィルタリングする際には、`array_filter()`を、添字も使用する処理ならば`array_reduce()`を使用すると良いでしょう***。

追記：`array_filter()`して`array_values()`しても`o-based`な配列にすることができます。

以上が配列をフィルタリングする際の`array_filter()` と`array_reduce()`の挙動の違いでした。
ご閲覧ありがとうございました。