OmniAICreator/Qiita-1.07M huggingface dataset:
PHP の Rest で Cloud Firestore のデータを更新 (Update)

```php:firestore_update_rest.php
#! /usr/bin/php
<?php
//
//	firestore_update_rest.php
//
//					Feb/16/2020
//
// ------------------------------------------------------------------
include('Requests/library/Requests.php');
include("get_token.php");
//
// ------------------------------------------------------------------
fputs (STDERR,"*** 開始 ***\n");
Requests::register_autoloader();
//
$key_in = $argv[1];
$population_in = intval ($argv[2]);
print($key_in . "\n");
print($population_in . "\n");

$token = get_token_proc();
//
$project = 'project-jan25-2020';
$headers = array('Authorization' => 'Bearer ' . $token,
	'Content-Type' => 'application/json');
$options = array();
$url_base = "https://firestore.googleapis.com/v1/projects/" . $project . "/databases/(default)/documents/cities";
$url = $url_base . "/" . $key_in;
$url .= "?updateMask.fieldPaths=population&updateMask.fieldPaths=date_mod";

date_default_timezone_set('Asia/Tokyo');
$today = date ("c");
print($today . "\n");

$update01 = array ();
$update01["fields"] = array ();
$update01["fields"]["population"] = ["integerValue"=> $population_in];
$update01["fields"]["date_mod"] = [ "timestampValue"=> $today];

$str_json = json_encode ($update01);
print($str_json . "\n");

$request = Requests::patch($url, $headers, $str_json);
var_dump($request->status_code);

$rvalue = $request->body;

print($rvalue);

fputs (STDERR,"*** 終了 ***\n");
// ------------------------------------------------------------------
?>
```

get_token.php はこちら
[PHP の Rest で Cloud Firestore のデータを作成 (Create)](https://qiita.com/ekzemplaro/items/ec8de444aadc8ca5d68d)

実行コマンド

```bash
export GOOGLE_APPLICATION_CREDENTIALS="***.json"
./firestore_update_rest.pho t0923 91476200
```
PHP の Rest で Cloud Firestore のデータを読む (Read)

```php:firestore_read_rest.php
#! /usr/bin/php
<?php
//
//	firestore_read_rest.php
//
//					Feb/03/2020
//
// ------------------------------------------------------------------
include('Requests/library/Requests.php');
include("get_token.php");
//
// ------------------------------------------------------------------

// ------------------------------------------------------------------
fputs (STDERR,"*** 開始 ***\n");
Requests::register_autoloader();
//
$token = get_token_proc();
// print( $token );
//
$project = 'project-jan25-2020';
$headers = array('Authorization' => 'Bearer ' . $token);
$options = array();
$url = "https://firestore.googleapis.com/v1/projects/" . $project . "/databases/(default)/documents/cities";

$request = Requests::get($url, $headers);
var_dump($request->status_code);
// var_dump($request->body);

$json_string = $request->body;
$dict_aa = json_decode ($json_string,true);
// var_dump($dict_aa["documents"]);

$array_aa = $dict_aa["documents"];
foreach ($array_aa as $unit_aa)
	{
	$str_aa = $unit_aa["name"];
	$tt = explode("/",$str_aa);
	$length = count($tt);
	$key = $tt[$length - 1];
	$name = $unit_aa["fields"]["name"]["stringValue"];
	$population = $unit_aa["fields"]["population"]["integerValue"];
	$date_mod = $unit_aa["fields"]["date_mod"]["timestampValue"];
//
	$str_out = $key . "\t" . $name . "\t" . $population . "\t" . $date_mod;
	print($str_out . "\n");
	}

fputs (STDERR,"*** 終了 ***\n");
// ------------------------------------------------------------------
?>
```

get_token.php はこちら
[PHP の Rest で Cloud Firestore のデータを作成 (Create)](https://qiita.com/ekzemplaro/items/ec8de444aadc8ca5d68d)

実行コマンド

```bash
export GOOGLE_APPLICATION_CREDENTIALS="***.json"
./firestore_read_rest.php
```
サイト制作のコツ　（超初心者向け）

今回はサイトを作るにあたってこうやって制作していけばスムーズにできるのでは・・・？と思い共有していきたいと思います！

https://qiita.com/takepon_it/items/58c2bf30ef15395ff551
↑FlexBoxを使って簡単にレイアウトを作る記事を書きましたのでこちらも併せてお願い致します！

#1.レイアウトを作っていこう！

サイトの構成を作るためにレイアウトを作っていきましょう！
ペイントでも何でもいいのでなんとなくで作れたら多分ok！
（入れ忘れで#top_panelの中に#panelが入っています。）

![2maime.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579434/c5019d43-2abd-c17d-b3f5-82816f34d451.png)

こんな感じで細かく要素を設定したりしてレイアウトを本格的に作っていきます！
色やheight,wight等も本来は書くべきだと思うのですが今回はなんとなくで進みます

#2.レイアウトを元にコーティングしていこう！

まずはレイアウトを元にhtmlの方を書いていきます・・・


```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>タイトル</title>
<link rel="stylesheet" type="text/css" href="qiita.css">
</head>
<body>

<div id="header"></div>

<div id="top_panel">
<div id="panel"></div>
</div>

<div id="container">
<div id="main_1"></div>
<div id="main_2"></div>
<div id="main_3"></div>
<div id="main_4">
    <div id="main_5"></div>
    <div id="main_6"></div>
    <div id="main_7"></div>
</div>
</div>

<div id="footer">
 </div>

</body>
</html>
```

こんな感じですね！

次にCSSも書いていきましょう！


```style.css
@charset "utf-8";
body {
    margin: 0;
}

#header {
    position: fixed;
    width: 100%;
    height: 70px;
    background-color: black;
    margin: 0;
}

#top_panel {
    height: auto;
    margin: 0 auto;
}

#panel {
    float: center;
    width: 100%;
    height: 500px;
    background-color: red;
}

#container {
    width: 1800;
    height: 450px;
    float: center;
}

#main_1 {
    width: 25%;
    float: left;
    height: 450px;
    background-color: green;
}

#main_2 {
    width: 25%;
    height: 450px;
    background-color: blue;
    float: left;
}

#main_3 {
    float: left;
    width: 25%;
    height: 450px;
    background-color: yellow;
}

#main_4 {
    float: left;
    width: 25%;
    height: 450px;
    background-color: rgb(255, 0, 221);
}

#main_5 {
    float: left;
    width: 50%;
    height: 50%;
    background-color: rgb(70, 34, 65);
}

#main_6 {
    float: left;
    width: 50%;
    height: 50%;
    background-color: rgb(48, 11, 43);
}

#main_7 {
    float: left;
    width: 50%;
    height: 50%;
    background-color: rgb(143, 43, 224);
}


#footer {
    width: 100%;
    height: 40px;
    background-color: black;
    margin: 0;
}
```


こんな感じですね！
そしたら完成品を見ていきましょう～～

#3.完成！

![a21cb57b5690a0bcad026b4344b912c6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579434/dc66374b-61d0-41b7-ef27-2fd904f1ec89.png)

はい！レイアウト通りにできてるのではないでしょうか？

このようにレイアウトを作ってからサイトの制作に取り掛かると凄く捗ると思うので、初学者の方は是非参考にしてみてください！
Finder上に絶対パスを表示させる

Finerでファイル操作をするとき、表示している階層がわからないのが非常に不便だと感じたので、以下のような感じでFinderのメニューの欄に常に絶対パスを表示させる設定をした。

<img width="438" padding-left="100px" alt="スクリーンショット 2020-02-16 16.24.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/382190/a48f8e75-6b28-c165-223f-3ac5eeee6537.png">

#####1.ターミナルを開く

#####2.ターミナル上で以下のコマンドを叩く

```
$ defaults write com.apple.finder _FXShowPosixPathInTitle -boolean true
```

#####3.Finder再起動

```
$ killall Finder
```

これデフォルトではディレクトリ名のみが表示されていたのが、フルパス表示されるようになりました。



####元の状態に戻したい時(おまけ)
やっぱり元の状態に戻したい!ってなったときも以下の手順で簡単に元の状態に戻せます。

以下のコマンド叩く。

```
$ defaults write com.apple.finder _FXShowPosixPathInTitle -boolean false
```

同じようにFinder再起動

```
$ killall Finder
```

###参考
https://pc-karuma.net/mac-finder-fullpath/
Pythonのf-stringの基本的な使い方

f-stringはpython3.6から追加された文字列リテラルです。
文字列の外に最初にfもしくはFをつけるのが特徴です。

###値の挿入：

```python
>>> name = 'GAO'
>>> age = 24
>>> f'こんにちは{name}です、{age}才です。'
'こんにちはGAOです、24才です。'
```

###式の挿入：

```python
>>> years_later = 10
>>> f'{years_later}年後は{age + years_later}才です。'
'10年後は34才です。'
```

###関数を呼ぶ：

```python
>>> def one_year_later(current_age):
...     return current_age + 1
...
>>> f'来年は{one_year_later(age)}才です。'
'来年は25才です。'
```

###メソッドを呼ぶ：

```python
>>> f'{name}を小文字にすると{name.lower()}です。'
'GAOを小文字にするとgaoです。'
```

###マルチライン：

```python
>>> jikoshoukai = f'こんにちは{name}です、{age}才です。' \
...               f'{years_later}年後は{age + years_later}才です。' \
...               f'来年は{one_year_later(age)}才です。' \
...               f'{name}を小文字にすると{name.lower()}です。'
>>> jikoshoukai
'こんにちはGAOです、24才です。10年後は34才です。来年は25才です。GAOを小文字にするとgaoです。'
```

###ゼロ埋め：

```python
>>> a = 123
>>> f'ゼロ埋め8桁: {a:08}'
'ゼロ埋め: 00000123'
```

###ネスト（ゼロ埋め）：

```python
>>> for i in range(4,8):
...     f'ゼロ埋め{i}桁: {a:0{i}}'
...
'ゼロ埋め4桁: 0123'
'ゼロ埋め5桁: 00123'
'ゼロ埋め6桁: 000123'
'ゼロ埋め7桁: 0000123'
```

###小数点桁数、有効桁数：

```python
>>> a = 123.456789
>>> f'小数点以下4桁: {a:.4f}'
'小数点以下桁: 123.4568'
>>> f'有効桁4桁: {a:.4g}'
'有効桁: 123.5'
```
区間スケジューリング　学習メモ　～by python～

#はじめに
貪欲法　区間スケジューリング問題についての学習メモ

#問題
[キーエンス　プログラミングコンテスト2020](https://atcoder.jp/contests/keyence2020)の"[B問題　Robot Arms](https://atcoder.jp/contests/keyence2020/tasks/keyence2020_b)" 
<img width="829" alt="無題.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500055/dd991c40-c7e8-80c5-4363-052a68b45a66.png">


始点、終点が決まっているものについて、できる限り多く選択していく問題（区間スケジューリング問題）
貪欲法で解いていく
基本方針は選べるロボットの中で終点が最小のものを選んでいくこと

#回答
```python

N=int(input())
XL=[list(map(int,input().split())) for i in range(N)]
 
R=[]
for i in range(N):
    a=max(0,XL[i][0]-XL[i][1])
    b=XL[i][1]+XL[i][0]
    R.append([b,a])
R.sort()
 
ans=0
con_l=0
for i in range(N):
    if con_l <= R[i][1]:
        ans += 1
        con_l = R[i][0]
print(ans)
```

#解説
###①入力

```python

N=int(input())
XL=[list(map(int,input().split())) for i in range(N)]
```
Nはロボットの個数
XLは座標Xと腕の長さLのリスト



###②リストの編集
ロボットの腕の始点(a)と終点(b)を保存するリスト(R)を作成する

```python

R=[]
for i in range(N):
    a=max(0,XL[i][0]-XL[i][1])
    b=XL[i][1]+XL[i][0]
    R.append([b,a])
R.sort()
```
リストRは終点昇順でソートしておく

###③区間スケジューリング＆出力

```python

ans=0
con_l=0
for i in range(N):
    if con_l <= R[i][1]:
        ans += 1
        con_l = R[i][0]
print(ans)
```
ansは選んだロボットの個数
con_lは最後に選んだロボットの腕の終点

forループ内の処理は最後に選んだロボットの終点(con_l)より大きい始点(R[i][1])を持つロボットを貪欲的に探索するようになっている
Rは終点昇順でソートしてあるため、探索していく中で最小の終点のものを常に選択するようになっている
見つかるたびにansに+1してcon_lを更新する
出力して終了

#まとめ
典型的な区間スケジューリング問題であった
イチロー引退会見の冒頭挨拶をAmazonTranscribeで文字起こしして精度を確かめてみた

## はじめに
日本語に対応した自動音声認識サービスAmazonTranscribeが果たしてどの程度の精度なのか確かめてみました

## 文字起こしした音声
大好きなイチローさんの引退会見です。

- [【全編】イチロー選手が引退会見「後悔などあろうはずがない」（2019年3月21日）](https://www.youtube.com/watch?v=MoschCm4-XE
)

全部で1時間半ほどあるので、その中から冒頭の挨拶部分を文字起こししてみました。

## 検証結果

自分が文字起こししたテキスト.txt
>こんなにいるの！びっくりするわ！！そうですか。この遅い時間にお集まりいただいてありがとうございます。今日のゲームを最後に日本で９年、アメリカでは19年目に突入したところだったんですけれども、現役生活に終止符を打ち引退することとなりました。最後にこのユニフォームを着て、この日を迎えられたことを大変幸せに感じています。この28年を振り返るにはあまりにも長い時間だったので、ここで一つ一つ振り返ることが難しいということもあって、ここではこれまで応援いただいた方々への感謝の思い、そして球団関係者、チームメートに感謝を申し上げて皆様からのご質問があればできる限りお答えしたいという風に思っています。

AmazonTranscribeで文字起こししたテキスト.txt
>こんなにいるのびっくりするわそうですかいやこのそ遅い時間にお集まりいただいてありがとうございますま今日のゲームを最後に日本で九年アメリカでは十九年目に突入ましたところだったんですけれども原因生活に終止符を打ち引退することとなりましたうんま最後にこのユニフォームを着て、この日を迎えられたことをま大変幸せに感じていますまこの十二十八年を振り返るにはまああまりにもま長い時間だったのでここでま!一つ一つ振り返ることが難しいということもあってまここではこれまでええ公園そしていただいた片方への感謝の思いえそして球団関係者チームメートに感謝を申し上げて皆様からの御質問があればできる限りお答えし、たいという風に思っています

##結論
- 多少の間違えもあるが、かなり高い精度で文字起こしされている。
- ライターがインタビューした内容の文字起こしや動画編集者が動画内容を文字起こしする等の用途ではかなり活用できそう。


## 参考
- [Amazon Transcribe - AWSドキュメント](https://aws.amazon.com/jp/transcribe/)
PHP の Rest で Cloud Firestore のデータを作成 (Create)

```php:firestore_create_rest.php
#! /usr/bin/php
<?php
//
//	firestore_create_rest.php
//
//					Feb/16/2020
//
// ------------------------------------------------------------------
include('Requests/library/Requests.php');
include("get_token.php");
//
// ------------------------------------------------------------------
function add_data_proc($url_base,$headers,$key,$name,$population,$date_mod)
{
$url = $url_base . "?documentId=" . $key;

$update01 = array ();
$update01["fields"] = array ();
$update01["fields"]["name"] = ["stringValue"=> $name];
$update01["fields"]["population"] = ["integerValue"=> $population];
$update01["fields"]["date_mod"] = [ "timestampValue"=> $date_mod];

$str_json = json_encode ($update01);
print($str_json . "\n");
$request = Requests::post($url, $headers, $str_json);
var_dump($request->status_code);

$rvalue = $request->body;

print($rvalue);
}

// ------------------------------------------------------------------
fputs (STDERR,"*** 開始 ***\n");
Requests::register_autoloader();
//

$token = get_token_proc();
//
$project = 'project-jan25-2020';
$headers = array('Authorization' => 'Bearer ' . $token,
	'Content-Type' => 'application/json');
$options = array();
$url_base = "https://firestore.googleapis.com/v1/projects/" . $project . "/databases/(default)/documents/cities";


add_data_proc($url_base,$headers,'t0921','宇都宮',38921,"2010-10-5T00:15:00Z");
add_data_proc($url_base,$headers,'t0922','小山',45921,"2010-10-9T00:14:00Z");
add_data_proc($url_base,$headers,'t0923','佐野',76921,"2010-11-7T00:16:00Z");
add_data_proc($url_base,$headers,'t0924','足利',94921,"2010-12-15T00:12:00Z");
add_data_proc($url_base,$headers,'t0925','日光',27921,"2010-8-2T00:11:00Z");

fputs (STDERR,"*** 終了 ***\n");
// ------------------------------------------------------------------
?>
```

```php:get_token.php
<?php
//
//	get_token.php
//
//					Feb/03/2020
//
// ------------------------------------------------------------------
function get_token_proc ()
{
	$token = '';
	$command = 'gcloud auth application-default print-access-token';

	try
		{
		exec($command, $out, $ret);
		$token = $out[0];
		}
	catch (Exception $ee)
		{
		print("*** error *** exec ***\n");
		print('Error:'.$ee->getMessage());
		}

	return	$token;
}

// ------------------------------------------------------------------
?>
```

実行コマンド

```bash
export GOOGLE_APPLICATION_CREDENTIALS="***.json"
./firestore_create_rest.php
```
Keras の imdb.load_data で ValueError が起きた際の解決法

# 発端
以下の様なコードで読み込みを行おうとした。

```python
from keras.datasets import imdb

(X_train,y_train),(X_test,y_test) = imdb.load_data(num_words=10000)
```

すると、以下のエラーが発生

```
ValueError                                Traceback (most recent call last)
<ipython-input-203-2fc6b409cd07> in <module>
      5 #np_load_old = np.load
      6 #np.load = lambda *a,**k: np_load_old(*a, allow_pickle=True, **k)
----> 7 (X_train,y_train),(X_test,y_test) = imdb.load_data(num_words=10000)
      8 #np.load = np_load_old
      9 
/opt/anaconda3/lib/python3.7/site-packages/keras/datasets/imdb.py in load_data(path, num_words, skip_top, maxlen, seed, start_char, oov_char, index_from, **kwargs)
     57                     file_hash='599dadb1135973df5b59232a0e9a887c')
     58     with np.load(path) as f:
---> 59         x_train, labels_train = f['x_train'], f['y_train']
     60         x_test, labels_test = f['x_test'], f['y_test']
     61 
/opt/anaconda3/lib/python3.7/site-packages/numpy/lib/npyio.py in __getitem__(self, key)
    260                 return format.read_array(bytes,
    261                                          allow_pickle=self.allow_pickle,
--> 262                                          pickle_kwargs=self.pickle_kwargs)
    263             else:
    264                 return self.zip.read(key)
/opt/anaconda3/lib/python3.7/site-packages/numpy/lib/format.py in read_array(fp, allow_pickle, pickle_kwargs)
    720         # The array contained Python objects. We need to unpickle the data.
    721         if not allow_pickle:
--> 722             raise ValueError("Object arrays cannot be loaded when "
    723                              "allow_pickle=False")
    724         if pickle_kwargs is None:
ValueError: Object arrays cannot be loaded when allow_pickle=False
```

# 原因
numpyバージョンアップ の際に `allow_pickle=False` がデフォルトになってしまったことが原因の模様。


# 解消法
numpyのバージョンを下げることでも対応可能だが、面倒なのでコード上で解決を図る。

具体的には、以下のコードに置き換えることで解消。

``` python
# 頻度順位10000語までを指定
from keras.datasets import imdb
​
np_load_old = np.load
np.load = lambda *a,**k: np_load_old(*a, allow_pickle=True, **k)
(X_train,y_train),(X_test,y_test) = imdb.load_data(num_words=10000)
np.load = np_load_old
```
`np.load` にて、 `allow_pickle=True` を指定する様に一時的に上書きしている。 `imdb.load_data` が完了したら、 `np.load`の定義を元に戻すことで、元通り。


### 参考
* https://teratail.com/questions/186503
* https://stackoverflow.com/questions/55890813/how-to-fix-object-arrays-cannot-be-loaded-when-allow-pickle-false-for-imdb-loa
ProgeteのPython学習コースⅠを受講してみた

■プログラム

Pythonに触れてみよう
1. 目標物を確認しよう

Pythonの基礎を学ぼう
2. 文字列
3. 数値
4. 計算してみよう

・文字列を出力してみよう
　（例）print('hello Python')
　（ポイント）シングルorダブルクォーテーションで囲む
　
・数値
　（例）print(3)
　（ポイント）数字はクォ－テンションで囲まない

変数を使ってみよう
5. 変数
6. 変数を使ってみよう
7. 変数の値を更新してみよう
8. 文字列の連結
9. データ型

・変数
　（例）name = 'soarer'
　　　　number = 48　

・変数名の付け方
　良い例
　（例）date 英単語を用いる
　　　　user_name 2語以上の場合はアンダーバーで区切る

　悪い例
　（例）1name 数字開始
　　　　namae ローマ字を用いる
　　　　名前  日本語

・文字列の連結
　（例）print('Hallo' + 'Python')

・変数の値を更新する
　（例）x = 48
       print(x)
       x = 46 変数の値を上書き

・データ型
　（例）'Hello Python' 文字列型
　　　　3 数値型

　（例）print(4 + 8)　数値の計算　結果12
　　　　print('4' + '8')　文字の連結　結果48

・型変換 str
　（例）price = 100
　　　　print('りんごの価格は' + price + '円です')
print('りんごの価格は' + str(price) + '円です')←strで文字列型に変換

・型変換　int
　（例）count = '48'
　　　　price = 100
       total_price = price * int(count)←数値型に変換

真偽値と条件分岐
10. if文
11. 真偽値
12. else
13. elif
14. 条件式を組み合わせよう

・if文の条件式
　（例）x == y 左右の値が等しい時成り立つ
　　　　x != y 左右の値が等しくない時成り立つ　

・if文の条件式が成立した時の処理を書くときはインデント（字下げ）をします。

・真偽値

score = 100
if score == 100:←コロン

score = 100
print(score == 100)

True
False

print(3 == 3) True
print(3 == 5) False

score = 100
if score == 100: Trueが成立する

score = 50
if score == 100: Trueが成立しない

・else
　（例）score = 50
      　if score == 100:←コロン
            print('よくできました')←インデント
　　　　 else:←コロン
　　　　     print('頑張りましょう')

・elif
　（例）score = 70
      　if score == 100:←コロン
            print('よくできました')←インデント
　　　　 elif score >= 60:←コロン
　　　　     print('まずまずです')←インデント
　　　　 else:←コロン
　　　　     print('頑張りましょう')
　elifはいくつでも入れることができる
　最後はelseで終わる

お買い物代金を計算しよう
15. 代金を計算しよう
16. 入力を受け取ろう
17. 条件分岐をしよう

PythonⅠは初心者でも分かりやすいのでお勧めです。
GitにpushしたファイルをGit管理下から外す方法

# はじめに
Gitにすでにpushしてしまったファイルを管理下から外す方法を備忘録としてまとめました。

# ローカルにファイルを残してGit管理下から削除したい
```
$ git rm --cached [削除したいファイル名]
```
これでファイルを残したまま管理から外せます。
最後に問題がなければコミットをして終了です。

# ファイルごとGit管理下から削除したい

```
$ git rm [削除したいファイル名]
```
こちらはファイルを残さずGit管理下から削除できます。


# fatalエラーが出る
fatal: pathspec did not match any filesが出る場合。
これはGitに登録していないファイルがあると出るそうです。

```
$ git rm --ignore-unmatch [削除したいファイル名]
```
これで削除できました。

--ignore-unmatchは、Gitに登録していないファイルを無視して
git rmを実行できるようにするものらしいです。



# 参考記事

参考にさせていただいた記事です。
http://qiita.com/ytkt/items/a2afd6be8e4f06c1ea25
https://qiita.com/pugiemonn/items/2f6af4467b33ed3f41b5

# 最後に
最後まで読んでいただきありがとうございました。間違いがありましたらご指摘ください。
仮想CAN通信でHello, world!

# 概要
車載組み込み用途に利用されるCAN通信をPC内にてシミュレーションしてみます。
CANについては以下記事に詳細が書かれています。
https://qiita.com/fattolys/items/e8f8081d3cb42d7da0f6

以下は今回作成するシステムのネットワークの構成です。
Nord2からNord1にCANパケットを投げます。
![vcan.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485117/60214e58-38c5-92c1-6b3e-e52567d824ba.jpeg)


# 環境
* Python 3.7
* Ubuntu 18.04

# 仮想インターフェイス作成
以下コマンドにより、仮想CANインターフェイスを作ります。

```
 $ modprobe vcan
 $ sudo ip link add dev vcan0 type vcan
 $ sudo ip link set up vcan0
```

ifconfigを打つと以下のようにvcan0が追加されていることがわかります。

```
$ ifconfig
vcan0: flags=193<UP,RUNNING,NOARP>  mtu 72
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 1000  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

```

# Nord 1コード作成
Nord 1はvcan0に流れるて来たパケットを逐次表示するようにします。

```python:vcan_nord_1.py
# ref: https://elinux.org/Python_Can
import socket
import struct

# CAN frame packing/unpacking (see `struct can_frame` in <linux/can.h>)
can_frame_fmt = "=IB3x8s"

def build_can_frame(can_id, data):
    can_dlc = len(data)
    data = data.ljust(8, b'\x00')
    return struct.pack(can_frame_fmt, can_id, can_dlc, data)

def dissect_can_frame(frame):
    can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)
    return (can_id, can_dlc, data[:can_dlc])

# create a raw socket and bind it to the given CAN interface
s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
s.bind(("vcan0",))

while True:
    cf, addr = s.recvfrom(16)
    print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))

```

# Nord 2コード作成
Nord2はvcan0に対し、"hellowld"のパケットを投げます。

```python:vcan_nord_2.py
# ref: https://elinux.org/Python_Can
import socket
import struct

# CAN frame packing/unpacking (see `struct can_frame` in <linux/can.h>)
can_frame_fmt = "=IB3x8s"

def build_can_frame(can_id, data):
    can_dlc = len(data)
    data = data.ljust(8, b'\x00')
    return struct.pack(can_frame_fmt, can_id, can_dlc, data)

# create a raw socket and bind it to the given CAN interface
s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
s.bind(("vcan0",))

try:
    s.send(build_can_frame(0x01, b'hellowld'))
except socket.error:
    print('Error sending CAN frame')
```

# 動作確認
vcan_nord_1.pyをターミナルで起動しておき、別ターミナルでvcan_nord_2.pyを実行してください。
以下のように、vcan_nord_1.py側のターミナルに、パケットが届いたことが表示されます。
![Peek 2020-02-16 16-35.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485117/231f95cd-78aa-58ea-ee94-8bd3e3812566.gif)

# 今後
Unityなどの3DCGプラットフォーム内で動く車をvcan通信で作ってみると面白いかもですね。


# 参考サイト
https://elinux.org/Bringing_CAN_interface_up
https://elinux.org/Python_Can
ASP 例題１ コイン問題（制約充足問題）

# 問題
1円硬貨，5円硬貨，10円硬貨を合計で15枚，それぞれを1枚以上持っている． 金額の合計は90円である． それぞれの硬貨を何枚持っているか?

# 回答
```Prolog:example1.lp
{coin_1yen(1..15)}=1.
{coin_5yen(1..15)}=1.
{coin_10yen(1..15)}=1.

:- not 15 = X + Y + Z, coin_1yen(X), coin_5yen(Y), coin_10yen(Z). 
:- not 90 = X + 5*Y + 10*Z, coin_1yen(X), coin_5yen(Y), coin_10yen(Z).
```
## 解説
`{coin_1yen(1..15)}=1.`は、「`coin_1yen`は1～15のいずれか一つが真」という意味

`:-`が先頭にくる場合は、制約であり、
`:- not 15 = X + Y + Z, ...`の場合、`15 = X + Y + Z`が必須条件になる。


# 参考
[Coprisによる制約プログラミング入門](http://bach.istc.kobe-u.ac.jp/copris/docs/intro-ja.html)
https://potassco.org/
https://qiita.com/yutaro-t/items/3a361aef5f9610ae4b8e

# 他の問題
[ASP個人的ポータル](https://qiita.com/Ganesha/items/b443046a26826fc97dae)
テンプレート

```py:1
import string

s = '''\
Hi $name.
$contents
Have a good day
'''

t = string.Template(s)
contents = t.substitute(name='Mike', contents='How are you?')
print(contents)
```

```:1の実行結果
Hi Mike.
How are you?
Have a good day
```

これの
Hi $name.
$contents
Have a good day
を別のテキストファイルに入れて操作する様にすれば、
テンプレートを誤って編集してしまう事を避ける事ができる。

例えば、
designというディレクトリにmail_template.txtという
テキストファイルをつくって、
そのテキストファイルの中身を
Hi $name.
$contents
Have a good day
にして、
以下の様に書けばよい。

```py:2
import string

with open('design\mail_template.txt') as f:
    t = string.Template(f.read())
contents = t.substitute(name='Mike', contents='How are you?')

print(contents)
```

```:2の実行結果
Hi Mike.
How are you?
Have a good day
```
【Windows(WSL)】PostgreSQLでRailsアプリを作成しよう

WSL環境でPostgreSQLをインストールしてRails6アプリを起動するところまでの手順を記録しておきます。
なお、Rails標準のデータベース（以下DB）であるSQLite3での環境構築はできる前提で書いていきますね。
※WSL環境におけるRails6の環境構築は[こちら](https://qiita.com/milkybear/items/68b1979cc9c77691c9b8)でまとめております。

# PostgreSQLのインストール
```
$ sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list
$ sudo apt-get install curl ca-certificates gnupg
$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
$ sudo apt install postgresql-11
```

インストールが完了できているか、バージョンを表示して確認しましょう。

```
$ psql -V
psql (PostgreSQL) 11.6 (Ubuntu 11.6-1.pgdg18.04+1)
```

パッケージもインストールしておきます。

```
$ sudo apt install libpq-dev
```

# postgreSQLのユーザー名を作成
```
$ sudo su postgres -c 'createuser -s Ubuntuのログインユーザー名'
```

次のコマンドで以下のようになれば正常に動作しています。

```
$ psql postgres
psql (11.6 (Ubuntu 11.6-1.pgdg18.04+1))
Type "help" for help.

postgres=#
```

# Railsアプリの作成
DBにPostgreSQLを指定してアプリを作成します。

```
$ rails new sample_app -d postgresql
```

作成したアプリのディレクトリに移動して、DBを作成します。

```
$ bin/rails db:create
```

Railsサーバーを起動します。

```
$ bin/rails s
```

 [http://localhost:3000/](http://localhost:3000/) にアクセスしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271390/c9349576-113e-9012-f564-08a7bc5c2c3c.png)

できましたー:sunny:
製薬企業で使えるRパッケージのインストール方法

# はじめに

[製薬企業研究者のためのRインストール方法](https://qiita.com/yukiya285/items/d7d605e25e148093d35b)で紹介したようにRをインストールした後は、データサイエンスで使われるRのパッケージをインストールします。

# パッケージのインストール

パッケージをインストールするには、Rを起動し、以下のように入力します。

```r
install.packages(パッケージ名)
```


# パッケージのロード

パッケージはインストールしただけでは使えません。実際に使うときは、以下のように入力します。

```r
library(パッケージ名)
```


# インストールするパッケージ

## tidyverse

`tidyverse`は、`ggplot2`や`tidyr`など、データサイエンスで使われるパッケージ一式を含んでいます。

```r
install.packages("tidyverse")
library("tidyverse")
```


# まとめ

ここでは、Rをインストールした後に追加でインストールするパッケージのインストール、およびロード方法について解説しました。
今後、適宜追記していきます。


# 参考資料・リンク

[プログラミング言語Rとは？統計分析に強い？](https://pharma-engineer.com/basic-programming/r-summary/)
Raspberry Pi 4でkernelを更新してD435iを動かす

## 概要
D435iを使うために、kernelに含まれていないモジュールが必要になり、kernelの更新作業をしたので作業ログを書いておく。

ほとんど以下のissueに書かれていた手順を利用した。

### 参考
[IntelRealSense/librealsense, "Announcement: Raspberry Pi 4 Model B with two USB 3 ports now available" #4272](https://github.com/IntelRealSense/librealsense/issues/4272)

### 環境

- Raspberry Pi 4 model B 4GB
- Raspbian Buster
- kernelのバージョン： 4.19.97-v7l+（更新前）→4.19.102-v7l+（更新後）

### kernelの更新が必要な条件
D435iを抜き差ししたとき、`dmesg`で確認すると、hid-sensor-hubではなく、hid-generalが使用されている。

## 作業ログ

### /bootのバックアップ

```
sudo cp -r /boot /boot.backup
```

### kernelの更新

```
sudo apt-get install build-essential bison flex bc git libncurses-dev libssl-dev libprotobuf-dev cmake libusb-1.0-0-dev
git clone -b rpi-4.19.y https://github.com/raspberrypi/linux.git --depth 1 rpi-4.19.y
cd rpi-4.19.y
wget https://raw.githubusercontent.com/Delicode/librealsense/master/scripts/realsense_raspberry4.patch
patch -p1 < realsense_raspberry4.patch
make bcm2711_defconfig
make menuconfig # set HID_SENSOR_HUB, HID_SENSOR_ACCEL_3D, HID_SENSOR_GYRO_3D, USB_VIDEO_CLASS, VIDEO_V4L2
make ARCH=arm -j4 zImage modules dtbs
sudo make ARCH=arm modules_install
sudo cp arch/arm/boot/dts/*.dtb /boot/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm/boot/zImage /boot/kernel7l.img
```

一度再起動して、

```
sudo modprobe videodev
sudo modprobe uvcvideo
sudo modprobe hid_sensor_accel_3d
sudo modprobe hid_sensor_gyro_3d
```

### librealsenseのビルド・インストール
```
sudo apt install pkg-config freeglut3-dev libgtk-3-dev libglfw3-dev
git clone https://github.com/intelrealsense/librealsense
mkdir -p librealsense/build
cd librealsense/build
cmake ..
make -j4
sudo make install
```

### udevの設定

```
sudo cp librealsense/config/99-realsense-libusb.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
sudo udevadm trigger
```

### 動作確認

`dmesg`でhid-generalではなく、hid-sensor-hubが使用されていることを確認した。
`rs-enumerate-devices`や`realsense-viewer`で動作を確認した。
Flaskチュートリアル#2 ~POST, PUT, DELETEリクエスト編~

# 今回やること

前回はGETリクエストに対する処理を主に実装していきました([チュートリアル#1](https://qiita.com/channel-techtok/items/468505d524041e6bcabe))。今回はFlaskでPOSTリクエスト、PUTリクエスト、DELETEリクエストに対する処理をそれぞれ書いていきます。なお、DB連携は次の記事で紹介するので今回はグローバル変数に定義した配列に対して変更を加えていきたいと思います。

詳しくは[こちら](https://youtu.be/hLgzPDjYDII)で紹介しています

# POSTリクエスト
まずはPOSTリクエストに対する処理を書いていきます。POSTは主にデータの追加に使われます。
今回はリクエスト側はテストを簡単にするために`curl`コマンドを使っていきます。

```terminal
$ curl -X POST -H "Content-Type: application/json" -d '{"title":"新規投稿", "body":"新規投稿です"}' localhost:5000/post/add
```
`-X`はリクエストのメソッド、`-H`はリクエストヘッダ、`-d`はリクエストボディをそれぞれ指定しています。これはjson形式で`localhost:5000/post/add`にPOSTリクエストを送るという意味の文になります。


flask側はこんな感じになります

```python:app.py
@app.route('/post/add', methods=['POST'])
def create_post():
    post = request.json
    db_data.append(post)
    return jsonify(db_data)
```

json形式でリクエストされたボディはrequest.jsonで受け取ることができます。受け取った記事を配列にappendして記事追加処理の完成です。今回はテストとして全てのレスポンス処理で変更された記事一覧(`db_data`)を返却しています。

# PUTリクエスト
次にPUTリクエストに対する処理を書いていきます。これは主にデータの修正に使われます。

```terminal:terminal
$ curl -X PUT -H "Content-Type: application/json" -d '{"title":"投稿修正", "body":"修正済み投稿です"}' localhost:5000/post/update/0
```
`localhost:5000/post/update/0`にPUTリクエストを送るという意味の文になります。ここでは`/update`のあとに記事のidとして配列のインデックスを指定しています。

flask側のコードはこんな感じです

```python:app.py
@app.route('/post/update/<id>', methods=['PUT'])
def update_post(id):
    post = request.json
    db_data[int(id)] = post
    return jsonify(db_data)
```

flaskではrouteに`/<パラメータ>`という風に指定することで関数にパラメータを渡すことができます。配列のid番目の記事をリクエストから受け取った記事内容で置き換えています。

# DELETEリクエスト

最後にDELETEリクエストに対する処理です。これは主にデータを削除する場合に使われます。

```terminal:terminal
$ curl -X DELETE localhost:5000/post/delete/1
```

updateの時と一緒で最後にパラメータとして消したい記事の配列のインデックスを渡しています。

flaskの方はこんな感じです。

```python:app.py
@app.route('/post/delete/<id>', methods=['DELETE'])
def delete_post(id):
    db_data.pop(int(id))
    return jsonify(db_data)
```

updateの時とほとんど変わりません。

# まとめ
いかがだったでしょうか？今回はFlaskでPOST, PUT, DELETEリクエストに対する処理を実装しました。[#3](https://qiita.com/channel-techtok/items/6204705cffbf46e3a5d2)ではrouteはそのままでDB連携をしていきたいと思います。
COTOHA API「コーンフレークちゃうがな」

#はじめに
「どうもミルクボーイですー。お願いします。」
「今、バレンタインで売れ残ったチョコをいただきましたけどもね。こんなんなんぼあってもいいですからね。」
「ゆうとりますけれどね。」

##ミルクボーイとは
M-1グランプリ2019で優勝した、吉本興業所属のお笑いコンビです。
マイナビニュースさんに***コーンフレーク***ネタの動画が上がっているので、ぜひ見てください。
https://www.youtube.com/watch?v=VjBQtr4lH0k

##COTOHA APIとは
>NTTグループの40年以上の研究成果を活かした自然言語処理技術や音声認識・合成技術を、
>APIでお手軽に利用できるよう提供しているサービスです。

https://api.ce-cotoha.com/contents/index.html
無料プランと有料プランがありますが、無料プランでも十分遊べます！
あと、Qiitaの[COTOHAタグ](https://qiita.com/tags/cotoha)を見ると、たくさんのネタ記事が上がっています。
こんなんなんぼあってもいいですからね。

##この記事は何？
M-1グランプリ2019決勝のファーストステージで披露されたコーンフレークネタを、
自然言語処理サービス[COTOHA API](https://api.ce-cotoha.com/contents/index.html)を使い要約します。

#本題
##やったこと
***・コーンフレークネタを文字に書き起こす***
　よく考えたら、COTOHAの有料プランに申し込んで音声認識使えば良かったのでは・・・？
***・Pythonに初挑戦***
　触ってみたいと思っていたのと、サンプルコードもたくさんあるようだったので。
　開発環境ですが、一応ローカルにも環境を作りましたが、
　今回は***Colaboratory***を使用してみました。
　[Colaboratory へようこそ - Colaboratory]
(https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja#scrollTo=2fhs6GZ4qFMx)
　Web上でソースコードを書いて実行もできるの、便利！！！

***・ソースコード***
***　[「メントスと囲碁の思い出」をCOTOHAさんに要約してもらった結果。COTOHA最速チュートリアル付き]
(https://qiita.com/youwht/items/16e67f4ada666e679875)***
　こちらのサンプルコードをほぼコピペさせていただきました。
　マジでコピペで動きますし、全体的にわかりやすく、Pythonを初めて触った人にも優しいソースコードで有難いです。
　記事の内容も面白くて好きです。

　ネタは著作権の関係上公開するのはマズいかなと思ったので中略。
　変更した部分だけ抜き出しています。

```Cornflakes.py
print("■ 要約")
  sentence='''うちのおかんがね、好きな朝ごはんがあるらしいんやけど。
そうなんや。
その名前を忘れたらしいねん。
朝ごはんの名前忘れてまうってどうなってんねん。
---------
（中略）
---------
もうええわ。どうもありがとうございました。
'''
  api_result  = cotoha_api.callSummaryApi(sentence, 1) # 1を指定すると、1文に要約する。
  print('結果 ＝ {}'.format(api_result['result']) )
```

[最速チュートリアル](https://qiita.com/youwht/items/16e67f4ada666e679875)を使わせていただいたからとはいえ、
ネタをテキストに起こすのが一番時間かかった気がする・・・。
音声処理について学ぼうかな・・・。

#結果
```
■ 要約
結果 ＝ コーンフレークちゃうがな。
```
***コーンフレークちゃうがな。***

すごい！！！！！
そう！！！結果的にコーンフレークではない話やからねこれは！！！！！
キレのある回答が出てきて笑ってしまった。

#COTOHAは関西弁が達者？
結果を見て思ったのは、テキスト中に「コーンフレークちゃうがな。」が大量に出てきたのかな？ということでした。
そこで、書き起こしたコーンフレークテキストを見てみたところ、
***「コーンフレークちゃう」までなら大量に出てくるのですが***（「ちゃうか。」とか「ちゃうやないか。」とか）
***「コーンフレークちゃうがな。」は３回***しか出てきませんでした。

ただ多く出てきた言葉を抜き出しているわけではないっぽい・・・？

よく考えると、「コーンフレークちゃう」で止めてしまうと、
***「コーンフレークちゃう。（コーンフレークではない）」***
***「コーンフレークちゃう？（コーンフレークなのでは？）」***
と、同じ言葉で全く別の意味を受け取れてしまいます。
しかし、***「コーンフレークちゃうがな。」まで言うと「コーンフレークではない」という意味になる***ので、
「コーンフレークちゃうがな。」が正解だと納得できます。

そもそも、コーンフレークかコーンフレークじゃないかを見極められているだけでもすごいのに、
関西弁で回答してきたのがすごい。
これでいてこの要約機能、まだβ版なんですよね・・・。
COTOHA、恐るべし。ほかの機能も触ってみよう。

#おまけ
キーワード抽出してみたら、「コーンフレーク」の次に「おかん」が抽出されていました。
やっぱ関西弁も達者なんですね。

```
■ キーワード抽出
{'form': 'コーンフレーク', 'score': 220.0}
{'form': 'おかん', 'score': 110.0}
{'form': '俺', 'score': 67.61265}
{'form': '好き', 'score': 56.08416}
{'form': 'フルーチェ', 'score': 26.9968}
```
「JavaScript の this を理解する多分一番分かりやすい説明」を読んで手を動かして理解した

[JavaScript の this を理解する多分一番分かりやすい説明](https://qiita.com/takkyun/items/c6e2f2cf25327299cf03)を読んで手を動かしてみた。

## サンプルコード

```js
function test() {
    console.log(this)
}
var obj = {}
obj.test = test
    
console.log(test) //1
console.log(obj)  //2
test() //3
obj.test() //4
```

####1

関数そのものを出力。

```
ƒ test() {
    console.log(this)
    }
```

#### 2

関数そのものが入っているオブジェクトを出力。

```
{test: ƒ}
```

#### 3

``this``はグローバルオブジェクト、ブラウザでは[Windowオブジェクト](https://qiita.com/tsukishimaao/items/39d22fd9178546d6cdeb)をさす。

```
Window {parent: Window, opener: null, top: Window, length: 0, frames: Window, …}
```

#### 4

``this``はobj(関数そのものが入っているオブジェクト)をさす。

```
{test: ƒ}
```

## メソッドチェーン

```js

var obj = {
    test: function() { return this },
    alert: function(msg) { console.log(msg) }
    }
var test = obj.test

console.log(test) // 1
console.log(obj.test()) // 2
console.log(test()) // 3
test() // 4
obj.test().alert("hello") // 5
test().alert("hello") // 6
```

#### 1

オブジェクトの中身のtestそのものを出力。

```
ƒ () { return this }
```

#### 2

``this``はobjをさすことを出力。

```
{test: ƒ, alert: ƒ}
```

#### 3

thisはグローバルオブジェクト、ブラウザでは[Windowオブジェクト](https://qiita.com/tsukishimaao/items/39d22fd9178546d6cdeb)をさすことを出力。

```
Window {parent: Window, opener: null, top: Window, length: 0, frames: Window, …}
```

#### 4

関数名ではないため呼び出せない。

```
```

#### 5

オブジェクトの中身のalertを発動

```
hello
```

#### 6

Windowオブジェクトに対してalertを発動

```
helloというアラートを表示
```
  
  


理解が深まる記事

[JavaScript中級者への道【2. 4種類のthis】](https://qiita.com/matsuby/items/36ac4743d5eed2391116)
[Go] ゴブレットゴブラーズの通信ゲームを作ってみた

## はじめに
ガキ使でゴブレットゴブラーズというボードゲームを紹介していてとても面白そうだったので、Goで作ってみることにしました。

ゴブレットゴブラーズについては以下の記事がわかりやすかったです！
https://kyoheiomi.com/board-game/recommendation/gobblet-gobblers

## 完成品
[![画像がないです。](http://img.youtube.com/vi/E2-LyUVmcj8/0.jpg)](http://www.youtube.com/watch?v=E2-LyUVmcj8)

## 機能
- ルーム作成
- 通信対戦
- 閲覧機能


## 構成
server-client型で作りました。
serverに対して、clientがポーリングを行いゲームを更新していきます。
インターフェースはjsonを用いています。
以下はパッケージ構成です。

```
├── cli // ゲームを実行するcliツール群です。
│   ├── cli.go
│   └── util
│       ├── app.go
│       ├── client.go
│       ├── control.go
│       ├── display.go
│       ├── display_util.go
│       ├── model.go
│       ├── screen.go
│       └── util.go
├── go.mod
├── go.sum
├── logic //ゲームのロジックをまとめたところです。
│   ├── board.go
│   ├── game.go
│   ├── piece.go
│   ├── player.go
│   ├── square.go
│   └── type.go
├── server　// logicを使って、サーバを立てています
│   ├── handler.go
│   ├── model.go
│   └── server.go
└── web //clientがWebの場合も作る:未実装
```
### logicとserverを分けた理由
- 今後、インターフェースを変更する場合があると、インターフェースとゲームロジックをすぐに切り分けできるようにするためです。
- logicで用いているモデルをcliでも利用できるためです。

## 実装説明
少し実装を説明します。

```go
const P1 P = 1
const P2 P = -1
 
type Piece struct {
	id   uint
	size Size
	user P
}
type Square struct {
	top    int
	pieces [3]*Piece
}  
type Board [BOARD_MAX][BOARD_MAX]*Square

```

Pieceには、大きさとユーザ情報を持たせています。
Squareはマスのことで、マスにはコマを最大3つまで置くことができるため、マスの状態を順番ありで保持しておく必要があります。
Boardは、このマスが指定した個数あります。
スライスでなく、配列を用いることで、想定外の処理はpanicになるようにしています。
これらにメソッドを生やしゲームロジックを作成します。
細かいコードは、以下をご覧ください。
<a href="https://github.com/ryomak/gobblet-gobblers-go"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/ryomak/gobblet-gobblers-go.png" width="460px"></a>


## ゲームの使い方
1. serverを立ち上げる  
 ```$ go run server/*.go```
2. ユーザ1が部屋を作成する  
 ``` $ go run cli/cli.go -me tida -op yuna ```
meオプションが自分の名前,opオプションが相手の名前を入力します。
すると、ルームIDが払い出されます。(ex a48dec12-2a25-4b61-ad60-95134fd93b24)

3. ユーザ2が部屋に参加する  
``` $ go run cli/cli.go -me yuna -room a48dec12-2a25-4b61-ad60-95134fd93b24 ```
ユーザ1が作成した部屋のルームIDと自分のユーザネームを入力します。
すると、ゲームが始まります。
ちなみに、meオプションで設定した名前と部屋が作成された時に登録された名前が一致しない場合、閲覧者としてゲームをみることができます。

4. ゲーム
ターン毎にターミナルにコマの配置をしていきます。
``` a,A,2(a,Aマスに大きさ2のコマを置く)
## 未実装
### WEB版
今回はtermboxを使いたく、cliを使いましたが、見た目が拙いです。
ブラウザでもできるようにしたいです。WebAssemblyを使うと、logicのモデルを再利用できるので、便利かもしれないです。
[【Go】WebAssemblyでtrend表示してみた](https://qiita.com/Ryoma0413/items/86c67766dcefad5f2c5b)
### エラーハンドリング
cliのエラーハンドリングが甘いです。
### メモリ管理
ゲームが終了した後、ゲーム情報を削除していないので、常に残り続けます。
### その他もろもろ
サービスとして提供するには、例外も含め考慮する点がまだまだアリそうです。

## 最後に
ゲーム作成は、例外が多く存在するため、考慮すべき点が多くて大変でした。
既存実装の追加改修してくれる人は、ぜひプルリクお願いいたしますmm
<a href="https://github.com/ryomak/gobblet-gobblers-go"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/ryomak/gobblet-gobblers-go.png" width="460px"></a>
WEBサイト制作者用のチートシート一覧



##Htmlチートシート

https://www.atmarkit.co.jp/fdotnet/chushin/cheatsheet_02/cheatsheet_02.pdf

##CSSセレクタチートシート

https://webliker.info/css-selector-cheat-sheet/


##Bootstrapチートシート

https://hackerthemes.com/bootstrap-cheatsheet/#nav-pills


##Flexboxのチートシート

https://www.webcreatorbox.com/tech/css-flexbox-cheat-sheet

##ショートカットのチートシート

https://matsumuro-wh-project.com/wp-content/uploads/2013/09/2560.png


参考
https://hikopro.com/boostrap-cheet-sheet/
https://jypg.net/works/6379

他にもオススメのチートシートあったら教えてください！
Minecraft Forge の API リファレンスを javadoc コマンドで生成する

## 今回の実行環境

macOS Catalina + Java 8

```
$ sw_vers 
ProductName:	Mac OS X
ProductVersion:	10.15.3
BuildVersion:	19D76

$ java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.242-b08, mixed mode)
```

## javadoc コマンドで API リファレンスを生成

Minecraft Forge のソースコードをダウロードして展開する。
今回はバージョン 1.15 系をダウンロードする。

```
$ wget https://github.com/MinecraftForge/MinecraftForge/archive/1.15.x.zip
$ unzip 1.15.x.zip
```

javadoc コマンドで API リファレンスの HTML ページを生成する。

```
$ javadoc -d docs -sourcepath MinecraftForge-1.15.x/src/main/java -subpackages net.minecraftforge
```

-d オプションで指定したディレクトリに HTML ファイル等が生成されているのが確認できる。

```
$ find docs | head
docs
docs/constant-values.html
docs/overview-tree.html
docs/net
docs/net/minecraftforge
docs/net/minecraftforge/registries
docs/net/minecraftforge/registries/IRegistryDelegate.html
docs/net/minecraftforge/registries/IForgeRegistry.CreateCallback.html
docs/net/minecraftforge/registries/ForgeRegistry.Snapshot.html
docs/net/minecraftforge/registries/ObjectHolderRef.html
```

## 参考資料

- [GitHub \- MinecraftForge/MinecraftForge: Modifications to the Minecraft base files to assist in compatibility between mods\.](https://github.com/MinecraftForge/MinecraftForge)
- [javadoc (Java Platform, Standard Editionツール・リファレンス)](https://docs.oracle.com/javase/jp/8/docs/technotes/tools/unix/javadoc.html)
anyenv&nodenvの環境で、Node.jsのバージョンアップする

Node.jsのバージョンを複数保持し、コマンドひとつでバージョンを切り替えるanyenvを現場で使用しています。
厳密には、`anyenv`の中で`nodenv`というソフトウェアを動かすことで、`Node.js`のバージョンを切り替えているのですが、今回初めての案件で新規作成を手掛けたので、忘れないようにメモとして残しておこうと思います。

ついでに、gulpを使用できるようになるところまで、解説します。

#開発環境
・anyenvとnodenvでNode.jsのバージョン管理をしている。
・`gulp`を使うためにNode.jsを使用。
・既にanyenvとnodenvは導入済み。

#新規作成のおおまかな手順
・anyenvやnodenvを使用して、Node.jsのバージョンを最新にする
・npmのバージョンを最新にする
・gulpってコマンドを使用できるようにする
↓ 確認
・npm init -y
・npm install -D gulp(ここでnpm auit fixが出なかったら素敵)
・gulp -v

#やってみる
実際にファイルを新規作成して作ってみます。

###Node.jsのバージョンを最新にする

nodenvのバージョンは自動的にアップデートされないので、anyenvを使用して、アップデートが可能なファイルがあるかを確認します。
(node.jsに最新のバージョンがあったとしても、nodenvに反映されない)

以下のコマンドで、nodenvを最新のバージョンにします。

```
anyenv update
```

nodenvを最新にすることで、新しいバージョンのNode.jsも使用することができるようになっているかと思います。
以下のコマンドで、使用できるNode.jsのバージョンを確認してみましょう。

```
nodenv install -list
```

Node.jsの公式サイトをみたら、最新のバージョン・推奨バージョンを確認できます。

```
nodenv install {バージョン}

例）nodenv install 12.14.1
```

これで、anyenvとnodenvによる、Node.jsのバージョンアップが終わりました。


###Node.jsをアップデートした時に出るエラー

```
nodenv: default-packages file not found
```

こんなのが出る時があります。

```
touch $(nodenv root)/default-packages
```

そしたら、default-packagesってファイルを作ればOK！
エラーは解決できてるかと思います。

お疲れ様です！

あとはnpmのアップデートして。

```
npm install -g npm
```

このままでは、gulpのコマンドが使用できない(以下のようなエラーが出てしまう)ので、gulpのコマンドを使用できるように設定します。

```
nodenv: gulp: command not found
The `gulp' command exists in these Node versions:
  8.10.0
  9.2.0
  10.9.0
```

↓

```
npm i -g gulp-cli
```

このコマンドを打ち込めば、gulpコマンドが使えるようになります◎

あとは、確認のために、package.jsonファイルの作成

```
npm init -y
```

gulpをインストールして

```
npm install -D gulp
```
 
gulpのバージョンを確認すれば終了です！

```
gulp -v
```

ここ以降は、自分で好きなgulpの設定をして、サクサク動かしていきましょう！




###おまけ


```
nodenv local
```
現在のプロジェクトのnodenvのバージョンがわかる。

```
nodenv local {バージョン}
```
これで、node.jsのバージョンの指定が出来ます◎


###おまけ2

ちなみに、デフォルトでNode.jsのバージョンを指定したい時は、

```
nodenv global {デフォルトで使用したいバージョン}
```


#まとめ
Qiitaの記事を参考にしました！と連絡してくれた方がいて、とてもうれしかったです。この記事も誰かのお役に立てたら嬉しいです。

#参考サイト
anyenvとnodenvの導入方法：https://www.to-r.net/media/anyenv/
nuxt 日付フォーマット

## moment install

```
npm i moment @nuxtjs/moment
```

## 追加
plugins/my-filter.js

```
import Vue from 'vue'
import moment from 'moment'

Vue.filter('format-date', function (value) {
  const date = moment(value);
  return date.format("YYYY.MM.DD(ddd)");
})

```


## nuxt.config.js

```
  plugins: [
    // 追記
    '~/plugins/my-filter.js',
  ],

  ....

  modules: [
    ...
    ['@nuxtjs/moment', ['ja']],
  ],
```

## 使い方

```
<td>{{ some_date | format-date }}</td>
```
【Python】relativedeltaの月マタギをテストする

relativedeltaのメモ書きです(・ω・)ノシ

3/31 - 1ヶ月でどうなるの？とかいろいろ気になったので試しました。

## ソースコード(Python)
```python
from datetime import datetime
from dateutil.relativedelta import relativedelta

dt_test1 = datetime(2020,3,31)
dt_test2 = dt_test1 - relativedelta(months=1)
dt_test3 = dt_test2 - relativedelta(months=1)
dt_test4 = dt_test3.replace(day=31)
dt_test5 = dt_test4 + relativedelta(months=1)

print("dt_test1={}, dt_test2={}, dt_test3={}, dt_test4={}, dt_test5={}"
.format(dt_test1, dt_test2, dt_test3, dt_test4, dt_test5))
```

## 出力結果

```
dt_test1=2020-03-31 00:00:00, dt_test2=2020-02-29 00:00:00, dt_test3=2020-01-29 00:00:00, dt_test4=2020-01-31 00:00:00, dt_test5=2020-02-29 00:00:00
```

## 解説

| 変数 | 試したかったこと＆結果 |
| --- | --- |
| dt_test1 | 最初の時間(うるう年の3/31) |
| dt_test2 | 3/31-1ヶ月=2/29 (2/31は存在しないので丸められる) |
| dt_test3 | 2/29-1ヶ月=1/29 (末日にはならない) |
| dt_test4 | 1/29 → 1/31 にしたかっただけ |
| dt_test5 | 1/31+1ヶ月=2/29 (3月にはならない) |

## 感想
私が使いたい用途には直感的な動作をしていて便利だな、と思いました(・ω・)
30日足したいだけのときにはrelativedelta(days=30)使えばいいしね
Marxico において、mono spaceが有効な記号

MarxicoはEvernoteに特化したChromeアプリ．いいアプリだが全角の対応がいまひとつ．mono spaceフォントでも，全角と半角を間違えることがある．どのフォントがそうなのかといえば，漢字とかなは大丈夫だが，記号が怪しい．以下に有効な記号を試してみた．

```plain
、 。 ， ・ ： ； ？ ！ ゛ ゜
｀ ＾ ￣ ＿ ヽ ヾ ゝ ゞ 〃 仝
々 〆 〇 ー ／ ＼ ～ ｜ （ ）
〔 〕 ［ ］ ｛ ｝ 〈 〉 《 》
「 」 『 』 【 】 ＋ － ＝ ＜ ＞
￥ ＄ ￠ ￡ ％ ＃ ＆ ＊ ＠ 〒 〓 ￢
㍉ ㌔ ㌢ ㍍ ㌘ ㌧ ㌃ ㌶ ㍑ ㍗
㌍ ㌦ ㌣ ㌫ ㍊ ㌻ ㎜ ㎝ ㎞ ㎎
㎏ ㏄ ㎡ ㍻ 〝 〟 ㏍ ㊤ ㊥ ㊦
㊧ ㊨ ㈱ ㈲ ㈹ ㍾ ㍽ ㍼ 
```
たったこれだけ。しかも後半は今はめったに使わない機種依存文字だし。
見出し記号として使えそうなのは

> 〇 ー ～ ￥ ＄ ％ ＃ ＆ ＊ ＠
> 〓 ＋ － ＝ ＜ ＞ ・ ：

こんな感じ。

# カーソルの動きがおかしくなる記号
全角なのに半角と勘違いするおかげで，文字の挿入がやりにくくなる．

よく使う□や◆，◎，などが並んでいる．

```plain
¨ ‐ ． ´ ― ∥ … ‥ ‘ ’
“ ” ± × ÷ ≠ ≦ ≧ ∞ ∴
♂ ♀ ° ′ ″ ℃ § ☆ ★ ○
● ◎ ◇ ◆ □ ■ △ ▲ ▽ ▼
※ → ← ↑ ↓ ∈ ∋ ⊆ ⊇ ⊂
⊃ ∪ ∩ ∧ ∨ ⇒ ⇔ ∀ ∃ ∠
⊥ ⌒ ∂ ∇ ≡ ≒ ≪ ≫ √ ∽
∝ ∵ ∫ ∬ Å ‰ ♯ ♭ ♪А Б
В Г Д Е Ё Ж З И Й К
Л М Н О П Р С Т У Ф
Х Ц Ч Ш Щ Ъ Ы Ь Э Ю
Я а б в г д е ё ж з
и й к л м н о п р с
т у ф х ц ч ш щ ъ ы
ь э ю я ─ │ ┌ ┐ ┘ └
├ ┬ ┤ ┴ ┼ ━ ┃ ┏ ┓ ┛
┗ ┣ ┳ ┫ ┻ ╋ ┠ ┯ ┨ ┷
┿ ┝ ┰ ┥ ┸ ╂ ① ② ③ ④
⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭
⑮ ⑯ ⑰ ⑱ ⑲ ⑳ Ⅰ Ⅱ Ⅲ Ⅳ
Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ № ℡ ≒ ≡∫
∮ ∑ √ ⊥ ∠ ∟ ⊿ ∵ ∩ ∪　
```

Marxicoは類まれにおいら向きの書物つーるだが，こればっかりは頂けない．
javascriptタブの切り替え　ザッと復習

#JavaScript
カリキュラムの復習。タブの切り替えです。
これから使いそうなのでまとめてみました。
[![Image from Gyazo](https://i.gyazo.com/443a5d56481a8313e3a73efbf6b9a31c.gif)](https://gyazo.com/443a5d56481a8313e3a73efbf6b9a31c)

###タブ切り替え
今回メニュー三つはmenu_itemクラス、クリックされた時にactiveクラスを付与
メニュー下の内容はcontentクラスに、クリックされた時にshowクラスを付与して切り替えます。

####まずノードを取得し、配列に変換する
```main.js
let tabs = document.getElementsByClassName("menu_item");
  // tabsを配列に変換する
  tabsAry = Array.prototype.slice.call(tabs);
```
```
Array.prototype.slice.call()
```
これで引数にとったオブジェクトを配列に変換してくれます。
menu_item三つがtabsAryに入ります。

####activeクラスの切り替え
関数を作ります（今回はtabSwitch）

```main.js
// クラスの切り替えをtabSwitch関数で定義
  function tabSwitch() {
    // 全てのactiveクラスのうち、最初の要素を削除（"[0]は、最初の要素の意味"）
    document.getElementsByClassName("active")[0].classList.remove("active");

    // クリックしたタブにactiveクラスを追加
    this.classList.add("active");
```
ノード取得しclassList.removeでactiveクラスの削除
this.classList.addでクリックした所にactiveクラスの追加

####showクラスの切り替え
menu_itemと違いclickされずに変更するためactiveクラスとは違う方法が必要

```main.js
// コンテンツの全てのshowクラスのうち、最初の要素を削除
    document.getElementsByClassName("show")[0].classList.remove("show");

 // 何番目の要素がクリックされたかを、配列tabsから要素番号を取得
    const index = tabsAry.indexOf(this);

    // クリックしたcontentクラスにshowクラスを追加する
    document.getElementsByClassName("content")[index].classList.add("show");
  }
```

```
indexOf()
```
inexOf()は配列に対してだけ使い、DOMを引数にとって一致した要素番号を戻します。
これでクリックされて付与するactiveクラスと同じ番号を取得できます。
その番号にclassList.addでshowクラスを追加します。

####tabSwitchの呼び出し
これでtabsAryに入ったmain_item（value）がクリックされた時にtabswitch関数を呼び出せます。

```main.js
 // タブメニューの中でクリックイベントが発生した場所を探し、下で定義したtabSwitch関数を呼び出す
  tabsAry.forEach(function(value) {
    value.addEventListener("click", tabSwitch);
  });
```

以上復習になりました。
forEach文については多くの使い方があるので、わかりやすかったsamuraiblogさんの参考サイト載せておきます。
https://www.sejuku.net/blog/20257

間違えているところあったら申し訳ございません。
ありがとうございました！！
MYSQL　全テーブル、データベース(schema)から特定のカラム名を検索




このカラムを持つテーブルって何だっけ？？って時に使える
information_schemaから取得する方法


```sql
SELECT  TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME FROM information_schema.columns WHERE column_name = '特定のカラム名' ;
```

見やすく複数行で

```sql
SELECT
    TABLE_SCHEMA
    ,TABLE_NAME
    ,COLUMN_NAME
FROM
    information_schema.columns
WHERE
    column_name = '特定のカラム名'
;

```

*補足　WHERE句にスキーマ名(TABLE_SCHEMA)を指定しても良いかも


参照
[21.22 INFORMATION_SCHEMA TABLES テーブル](https://dev.mysql.com/doc/refman/5.6/ja/tables-table.html)
Unity ビルドした後xcodeのシュミレーターでアプリが落ちる現象

unity で開発していよいよリリース一歩手前
ビルドも成功していよいよアプリを開いたら。。。
真っ黒な画面ですぐにアプリが終了してしまってどうにもなりませんでした。

エラーを見ると何やらグラフィックのとろこがまずいようでいろいろ悩んでみましたが
結果単純なことでした。グラフィックのmetalと言うのがios10.x以上じゃないと
サポートされてないとのこと。

そこでios11にして再ビルド したところきちんとしたアプリで成功しました。

file → build setting → playersettingで後は以下の写真の部分を
確認してください
![Unitysimulatersuccess.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560721/4bfe7067-4165-d1de-6290-ca44a49cc47c.png)
メソッド設計を考える

## まえおき

最近クラス設計に関して書いていたので、ついでにメソッド設計も軽く書こうかなと思います。

## メソッドの構成要素

ざっくり以下に分けてグダグダ述べます。

- 引数
- 返り値
- フィールド
- 例外
- 大域変数

## 引数

関数にもある要素。
一般的に入力情報が渡ってくる場所。
ざっくりわけて以下の３種類がある。

- 値渡し
- 参照渡し
- ポインタ渡し

これらの種別は読み取りの場合にあまり気にする必要がないが、書き込みの際に気をつけないといけない。
参照渡し／ポインタ渡しの場合はメソッド内の変更が呼び出し元に反映される。
意図しない場合は読み取り専用として扱ったほうが無難。

### 値渡し

呼び出し元の値をコピーしたものが渡ってくる。
書き換えても元の値とメモリ空間が別なので影響しない。

巨大なデータを値渡ししてしまうとデータのコピーコストがハンパないので注意。
定数などのネイティブ型情報の受け渡しに使用される。

C++の場合オブジェクトをこの方法で渡すことができる。
その場合コピーコンストラクタという専用のコンストラクタ起動してオブジェクトがコピーされる。

### 参照渡し

呼び出し元変数への参照が渡ってくる。
参照なので書き換えれば元も書き換わる。

参照渡しやポインタ渡しの場合元、呼び出し元の値を書き換えることができる。
オブジェクトの受け渡しはだいたいこれ。
受け取ったオブジェクトのメソッド呼び出していい感じに変更する。
好き勝手変更しまくるとカオスになるのでクラス設計がカオスだと悲劇が生まれる。

### ポインタ渡し

C/C++言語用。
ポインタが渡ってくる。
用途としては参照渡しと同様。
C言語でよくあるのが、確保したメモリのポインタ渡して、関数内で値をセットしてもらうとか。

## 返り値

関数にもある要素。
値を呼び出し元に返す。
複数の値を返せる言語もある。

こちらも引数と同様３種類ある。
返り値を返した後はローカル変数は消滅するのでうっかりローカル変数の参照やポインタを返すと悲劇が起きる。

## フィールド

そのメソッドが関数ではなくメソッドであるからには、何かしらのフィールドアクセスが有って然るべきき。
メソッドの種類分けの際にはそのメソッドがフィールドに何をするのかで考えるといい。
getter/setterはシンプルな例。
いろんなフィールドにアクセスする場合は分割したほうがいい。

## 例外

例外オブジェクトを呼び出し元に返す。
返り値と違うのは受け取られないと、更に元の呼び出し元に帰って行くところ。
だからといって空catchなどで握りつぶしてはいけない。

一般的に異常系と言われる処理で使われるべきであり、正常系で投げてはいけない。
catchした側はそのtryスコープの責任範囲の処理（コネクション切断など）を行ってもう一度投げ直すか、例外事象を解決して正常系に復帰するかのどちらかをする必要がある、

誰にもcatchされないとシステム側でcatchされることになるが、これは例外中の例外であるべし。
せめてエラーログ吐き出してエラーステートで終了すべき。

ついでにいうと例外はコストが重い。
組み込み系でC++を使っていたが無効化オプションで無効化できるようになっていた。

## 大域変数

グローバル変数とか環境変数とか、その他の変数。
直接アクセスするのは極力避けたい。
読み取るには引数から渡せばなんとかなる。
書き込みは専用のクラス作ってそいつに専任させるのがベストか。
【Rails】ユーザーに紐づかない投稿によるエラーの解消法

## エラーが発生
下記のようなエラーが発生。
NoMethodError in Boards#index undefined method decorate
![スクリーンショット 2021-04-18 14.44.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/c197769f-814c-f0ba-68c6-86d2fcf2ffa7.png)

デコレータはすでに設定済みなのになぜ？となる。


## 原因
そもそもデコレータの原因ではなく、ユーザがnilだったのが原因だった。ユーザが存在しないので、名前を取りに行こうとしてもできないためこのようなエラーが発生した。

## 解決法
rails cでBoard.all.destroy_allを行い、ユーザが紐づかない投稿が消えた。その後新規作成を行うと、エラーが発生せずに、表示された。
速攻でOperaキャッシュを削除する方法

2020 2/16 ver.

## ALT+P

## 右上に "キャッシュ"　入力して　"閲覧データを消去" をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76087/59797467-34be-ed95-6fb5-dd2297c77cb3.png)

## データを消去　クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76087/a92fd844-4eee-988d-835e-f1b23d9eb19a.png)
一応、消去したいのだけチェックしたほうがいいかもしれない

じぶんはそのままでクリックしているが、いままで問題は無かった。

youtubeppでたまにDLができなくなる時があるが、上記操作でキャッシュをクリアするとできるようになる。

##自己責任でお願いします。

忘れても、ブログの右側目次を見るだけですぐできる親切設計！
type comment 形式の変数アノテーションでは ignore 型が記述できない

とてもどうでもいいことに気づきました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">今気づいたけど、type_comment では ignore って型を記述できないのだろうか</p>&mdash; tk0miya (@tk0miya) <a href="https://twitter.com/tk0miya/status/1228923732397182976?ref_src=twsrc%5Etfw">February 16, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 実際に試してみた

### これが

```
class ignore:
    pass


class Ignore:
    pass


foo = 1  # type: ignore
bar = 1  # type: Ignore
```

### こうじゃ

```
$ mypy test.py
test.py:10: error: Incompatible types in assignment (expression has type "int", variable has type "Ignore")
Found 1 error in 1 file (checked 1 source file)
```

`foo` はエラーになりません。

## 変数アノテーションとして書くとうまく動く

```
class ignore:
    pass


class Ignore:
    pass


foo: ignore = 1
bar: Ignore = 1
```
```
$ mypy test.py
test.py:9: error: Incompatible types in assignment (expression has type "int", variable has type "ignore")
test.py:10: error: Incompatible types in assignment (expression has type "int", variable has type "Ignore")
Found 2 errors in 1 file (checked 1 source file)
```

## まとめ

type_comment 形式の型アノテーションはもう使うのをやめましょう。