OmniAICreator/Qiita-1.07M huggingface dataset:
PyTorchでRuntimeError: error executing torch_shm_managerが出た時の対象方法

[Pytorch example](https://github.com/pytorch/examples.git)のsuper resolutionのサンプルを動かそうとしたらエラーがでた。

```bash
$ pip install torch torchvision
$  python main.py --upscale_factor 3 --batchSize 4 --testBatchSize 100 --nEpochs 30 --lr 0.001
```

エラー内容

```bash
Traceback (most recent call last):
  File "main.py", line 81, in <module>
    train(epoch)
  File "main.py", line 48, in train
    for iteration, batch in enumerate(training_data_loader, 1):
  File "/Users/xxx/.pyenv/versions/3.7.4/lib/python3.7/site-packages/torch/utils/data/dataloader.py", line 819, in __next__
    return self._process_data(data)
  File "/Users/xxx/.pyenv/versions/3.7.4/lib/python3.7/site-packages/torch/utils/data/dataloader.py", line 846, in _process_data
    data.reraise()
  File "/Users/xxx/.pyenv/versions/3.7.4/lib/python3.7/site-packages/torch/_utils.py", line 385, in reraise
    raise self.exc_type(msg)
RuntimeError: Caught RuntimeError in DataLoader worker process 0.
Original Traceback (most recent call last):
  File "/Users/xxx/.pyenv/versions/3.7.4/lib/python3.7/site-packages/torch/utils/data/_utils/worker.py", line 178, in _worker_loop
    data = fetcher.fetch(index)
  File "/Users/xxx/.pyenv/versions/3.7.4/lib/python3.7/site-packages/torch/utils/data/_utils/fetch.py", line 47, in fetch
    return self.collate_fn(data)
  File "/Users/xxx/.pyenv/versions/3.7.4/lib/python3.7/site-packages/torch/utils/data/_utils/collate.py", line 79, in default_collate
    return [default_collate(samples) for samples in transposed]
  File "/Users/xxx/.pyenv/versions/3.7.4/lib/python3.7/site-packages/torch/utils/data/_utils/collate.py", line 79, in <listcomp>
    return [default_collate(samples) for samples in transposed]
  File "/Users/xxx/.pyenv/versions/3.7.4/lib/python3.7/site-packages/torch/utils/data/_utils/collate.py", line 53, in default_collate
    storage = elem.storage()._new_shared(numel)
  File "/Users/xxx/.pyenv/versions/3.7.4/lib/python3.7/site-packages/torch/storage.py", line 128, in _new_shared
    return cls._new_using_filename(size)
RuntimeError: error executing torch_shm_manager at "/Users/xxx/.pyenv/versions/3.7.4/lib/python3.7/site-packages/torch/bin/torch_shm_manager" at ../torch/lib/libshm/core.cpp:99

```

`/Users/xxx/.pyenv/versions/3.7.4/lib/python3.7/site-packages/torch/bin/torch_shm_manager`に実行権限がなかったので、以下のコマンドで実行権限を付与するとよい。

```bash
$  chmod +x /Users/xxx/.pyenv/versions/3.7.4/lib/python3.7/site-packages/torch/bin/torch_shm_manager
```
JavaScript / Node.js の変数スコープ


# 変数のスコープ
* 定義なし・・・グローバル
* var・・・関数レベル
* let・・・ブロックレベル

[Node.jsのプレイグラウンド](https://www.katacoda.com/courses/nodejs/playground)で実行してみてください。

```javascript
food = 'banana';  //グローバル

supermarket();

function supermarket() {
   var food = 'apple';  //関数レベル
   {
      let food = 'berry' //ブロックレベル
      console.log(`ブロックレベル: ${food}`);  //berry
   }
   console.log(`関数レベル: ${food}`);  //apple
}
console.log(`グローバル: ${food}`);  //banana
```

出力結果

```javascript
ブロックレベル: berry
関数レベル: apple
グローバル: banana
```
最近学習したrailsコマンド（Progateにて）

##Progateにて最近学習した内容をまとめてみた

###1.アプリ作成
*rails new アプリ名_app*
**例） rails new tweeeet_app**

###2.機能追加（コントローラ作成）
*rails g controller コントローラ名(s) アクション名*
**例） rails g controllers image index**

*ホームページ作成*
**例） rails g controllers home top**


###3. データベースの追加（テーブル作成）
*rails g model  テーブル名 カラム名:データ型*
**例） rails g model User name:string**
　　※複数カラムを作成したい場合⬇︎
*rails g model  テーブル名 カラム名:データ型 カラム名:データ型*
**例） rails g model User name:string number:integer**
*rails db:migrate*
**例） rails db:migrate**

*※テーブル名は作成後、複数形に勝手に変換されることに注意！*

###4. データベースに情報追加（カラム追加）
*rails g migration データ名(add_カラム名_to _追加先のテーブル名)*
**例） rails g migration add_nickname_to_users**
*add_column :テーブル名, :カラム名, :データ型* (migrationファイルの”データ名”の中に記入)
**例） add_column :users, :name, :string**
*rails db:migrate*
**例） rails db:migrate**

####〜追記〜

- データ型は知る限り３種類あり
    - string : 文字列（短い）
    - text : 複数行にわたる場合
    - integer : 数値

- データの値の変換
    - .to_s ••• 文字列へ
    - .to_i ••• 数値へ
Anacondaの仮想環境下でSpyderを使えるようにするまで (2019/10/20)

なんだかんだSpyderでの開発が捗るので、Anacondaの仮想環境でSpyderが使えるようにするまでのメモ。

## 環境
- Windows 10 Home 64bit
- anaconda 2019.10
- python 3.7

## 手順
#### 1. Anacondaをインストール
https://www.anaconda.com/distribution/
から最新版をインストール。
自分専用のPCにはAll Users向けにインストールするので
以降は`C:\ProgramData\Anaconda3`にインストールしたものとします。

#### 2. Pathを通す
別にAnaconda Promptを使うならいらないが、たまーにターミナル上でpythonやpipをしたくなるため追加しておく。
Windowsの「システム環境変数の編集」→「環境変数」→「（システム環境変数の）PATH」を開いて以下２つを追加。

- `C:\ProgramData\Anaconda3`
- `C:\ProgramData\Anaconda3\Scripts`

#### 3. Anaconda Prompt上で仮想環境を作成
windowsで「Anaconda Prompt (Anaconda3)」を開いて以下のコマンドを実行し仮想環境を作成する。

```terminal:AnacondaPrompt
$ conda create -n <仮想環境名> python=3.7 anaconda
```

仮想環境が作れられたか確認する。

```terminal:AnacondaPrompt
$ conda info -e
```


指定した仮想環境が作成されていたら

```terminal:AnacondaPrompt
$ conda activate <仮想環境名>
```
で切り替え。

#### 4. Spyderの起動
起動した仮想環境下で

```terminal:AnacondaPrompt
$ spyder
```
とすれば起動する。
一度起動すれば、タスクバーにピン留めしておいてもいいし、Spyderと検索すれば「Spyder（仮想環境名）」と出てくるのでそれをクリックするだけで起動できるので、ターミナル上から指定しなくてよい。
gulpでReferenceError: 〇〇 is not definedがでた

nodeのバージョン12とgulp3の相性が悪く、エラーを起こしてしまうらしい。
参考：[How to fix ReferenceError: primordials is not defined in node
](https://stackoverflow.com/questions/55921442/how-to-fix-referenceerror-primordials-is-not-defined-in-node)

## 環境
mac

## 解決法
gulpのバージョンを上げる👆 or nodeのバージョンを下げる👇
私の場合はgulp3を使いたかったので、nodeのバージョンを下げました。

## nを使ってnodeのバージョンを下げる
バージョンの下げ方はhomebrewを使う方法もあったのですが
nを使ったのが一番わかりやすかったです。
参考：[Node.jsのバージョンを管理するライブラリ「n」](https://co.bsnws.net/article/139)

npmを使ってnのインストール

>```
># npm を使う方法 *環境によってはsudoを使って下さい
>npm install -g n
>```


nを使って切り替えたいnodeのバージョンを指定する

```
$ sudo n [切り替えたいバージョン]　
```
※macの場合はsudoが必要です。
私はnode v10.15.0をダンロードしました。


なんとかエラー解決できましたとさ…。
[Rust] 標準出力に色をつける - 3bit/8bit/24bit color

本記事では標準出力で色つきの文字を使う方法を述べます.

# 本論

shell スクリプトなどでは [ESC](https://www.mm2d.net/main/prog/c/console-02.html) を表現するのに `\e`, `\033`, `\x1b` が利用できますが, Rust の文字列リテラルでは 16 進数表示である `\x1b` しか使えません. その点を除くと普通の ANSI カラーと同じです.

- [ANSIエスケープシーケンス チートシート](https://qiita.com/PruneMazui/items/8a023347772620025ad6)
- [ターミナルで使える色一覧（8色ANSIエスケープシーケンス）](https://qiita.com/hidai@github/items/1704bf2926ab8b157a4f)

用途によっては適当なクレートの利用も考慮すべきかもしれません. [参考文献 1](https://users.rust-lang.org/t/colored-terminal-output/24604/3)では [termion](https://lib.rs/crates/termion) (Windows では動作しない模様), [ansi_term](https://crates.io/crates/ansi_term), [termcolor](https://crates.io/crates/termcolor) が挙げられていましたが, どれも試してはいません.


# コード例

## 3bit color

```rust
fn main() {
    {
        let color = 0;
        print!("\x1b[{}m\x1b[47mColor{}\x1b[m ", 30+color, color);
    }
    for color in 1..8 {
        print!("\x1b[{}mColor{}\x1b[m ", 30+color, color);
    }
    println!("");
}
```

![2019-10-20 165248.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466807/9f83be8f-0404-bd77-90b0-90361abb004c.jpeg)


Color0 (黒) のみ黒背景だと見えないので背景を白にしています.

## 8bit color (256-color)

```rust
fn main() {
    for color in 0..256 {
        print!("\x1b[38;5;{0}mColor{0:03}\x1b[m ", color);
        if color%8 == 7 {
            println!("");
        }
    }
}
```

![2019-10-20 165214.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466807/71679b32-a79d-46d5-ca5b-1422dca2c034.jpeg)


## 24bit color (true color)

true color は 2<sup>24</sup> = 1.67e7 色を表示できるので, 全部表示するのは大変すぎます. なのでここではお手軽三色混合を試してみます. なお `\u{2588}` は `█` という文字です ([en.wikipedia](https://en.wikipedia.org/wiki/Box-drawing_character)).

```rust
fn main() {
    for y in 0i32..32 {
        let mut line = String::new();

        for _ in 0..31-y {
            line.push_str(" ");
        }

        for x in -y..1+y {
            let r = 8 * ( x + y);
            let g = 8 * ( y - x );
            let b = 248 - 8*y;
            
            let s = format!("\x1b[38;2;{};{};{}m\u{2588}\x1b[m", r, g, b);
            line = line + &s;
        }

        println!("{}", line);
    }
}

```

![2019-10-20 164814.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466807/714984bf-3b10-9404-95ed-d9c931c7cfc7.jpeg)


# 参考文献

- [Colored Terminal output - Rust Forum](https://users.rust-lang.org/t/colored-terminal-output/24604/3)
- [ターミナル用 UTF-8 テキストエディタを Rust でスクラッチからつくった](https://rhysd.hatenablog.com/entry/2019/08/29/091753#extend)
ロードセルを使って重さを測ってDBに格納したり、slackに通知したり。

# 1. 概要

ロードセルという重さをはかるセンサーを使って、
重さを図り、測った値をDBに格納し、必要だったらslackに通知する。

# 2. どうして作ったのか

日々、個数を数えたり、残量を見て発注しているものがある業種は多いと思います。
個数や残量ではなく、対象の重さを測って 発注する/しない を
判定できると楽でいいなと想像したのでプロトタイプを作りました。

# 3. 準備物

- Raspberry Pi(ここではmodelB rev2とします。古い。。。) * 1個  
python3が使えるようにRapbianがセットアップ済みとします。
- ロードセル　シングルポイント（ビーム型）　１０ｋｇ * 1個  
秋月電子のサイトで買えます。
P-13042で検索すると出てきます。
- ＨＸ７１１使用　ロードセル用ＡＤコンバータ　モジュール基板 * 1個  
前述のRaspberry Pi と ロードセルとを接続するために使います。  
秋月電子のサイトで買えます。  
K-12370で検索すると出てきます。  
前提として、購入後に必要なはんだ付けは終わっているものとします。
- ジャンパワイヤー(メスtoメス) * 3本  
前述のロードセル用ADコンバータとロードセルを接続するために使います。   
ぼくはスイッチサイエンスで買いました。

# 4. 作っていく

## 4.1. ロードセル と ロードセル用ADコンバータ を接続する。

ロードセルから出ている線を下記の画像のように接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/bb46de1d-1a20-51d2-e802-3615633f81a2.png)

## 4.2. ロードセル用ADコンバータ と RaspberyPi を接続する

準備していたジャンパワイヤーを使って、ロードセル用ADコンバータと
RaspberryPi の GPIOピンに接続します。

- ロードセル側の接続
![IMG_20190921_225103.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/56c50901-2cfa-d0b7-2dfb-bbc99cfd6b15.jpeg)

- RaspberryPi側の接続
よく分かる画像を撮ってなかった。。。
以下の画像のように接続します。
絶対にここってわけではなくて、赤の電源と黒のGRD以外は、
GPIOのピンアサインをみて他のところに刺してもOKです。

![GPIO_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/41675e99-230c-c91f-0ea4-86d4dbc4adab.png)
![GPIO_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/8895b549-fb62-96fe-c2e6-8df0be853586.png)

## 4.3. ロードセルで計測した値を取得するスクリプトを git cloneする
https://github.com/bogde/HX711

## 4.4. スクリプトを実行する

スクリプトを実行すると値が取れる。

---
あとは、pythonのスクリプトなので、psycopg2 とか使ったりして、
DBに格納したり、requestsとか使ったりしてslackに通知したりすればよいよい。

# 5. 完成形サンプル
![sensor1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/cf4e32e9-0139-5467-bc02-645dfd3aa021.jpeg)
![sensor2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/6dfe6d55-f8ca-4d75-3c7a-6be635f0517b.jpeg)

# 6. TIPS

- 正確なグラム数を取得するにはキャリブレーションが必要

# 7. その他

しきい値を作っても通知しても、実際発注するかどうかは暗黙知が必要だったりする。
なので、発注したかどうかを記録し目的変数とし、天候や販促キャンペーン、
店舗なら近隣のイベントの有無とか、重量以外の情報も説明変数として集積して、
発注するかどうかを重回帰とかで予測するのはどうだろうか。
【Swift】TelloとUDP通信②- Telloからメッセージを受信する -


#概要
[前回](https://qiita.com/eito_2/items/0d9e2c92b0be0ea16e77)、Telloに対しUDP通信でコマンドを送信しましたが、今回はコマンドに対しての応答について説明していきます。
各コマンドに対し、Telloから応答メッセージが送信されるため、端末側で受信処理を行うことでメッセージを取得できます。

#受信処理

Telloにコマンドを送信した時、Telloから応答メッセージが送信されます。
NWConnection の receive を使用することで、受信処理を行えます。

````
let connection = NWConnection(host: "192.168.10.1", port: 8889, using: .udp)

//送信処理
connection.send(content: message, contentContext: .defaultMessage, isComplete: true, completion: .contentProcessed( error in ))

//受信処理
connection.receive(minimumIncompleteLength: 0, maximumLength: Int(Int32.max)) { (data: Data?, contentContext: NWConnection.ContentContext?, aBool: Bool, error: NWError?) in
         //処理内容           
}
```

取得したdataは文字に変換することで内容を確認できます。

```
if let data = data, let message = String(data: data, encoding: .utf8) {
         //応答メッセージ
         print("message: \(message)")
}
```


#応答メッセージ

Tello SDKのコマンドでは、離陸、着陸等の操作に対しての応答と、バッテリー等のステータス情報に対しての応答があります。

操作コマンドは以下になります。応答としてはokかerrorを送信します。

| コマンド|          説明|
|:-----------|:---------------------|
| command |        SDKモード開始 |
| takeoff |        離陸 |
| land |        着地 |
| streamon |        ビデオストリーム開始 |
| streamoff |        ビデオストリーム停止 |
| emergency |        緊急停止 |
| up x |        上にxcm進む<br />x:20-500 |
| down x |        下にxcm進む<br />x:20-500 |
| left x |        左にxcm進む<br />x:20-500 |
| right x |        右にxcm進む<br />x:20-500 |
| forward x |        前にxcm進む<br />x:20-500 |
| back x |        後ろにxcm進む<br />x:20-500 |
| cw x |        時計回りにx度回転<br /> x: 1-3600|
| ccw x |        反時計回りにx度回転<br />x: 1-3600 |
| flip x |        xにひっくり返す<br /> X:l (左) r (右) f (前) b (後ろ)|
| go x y z speed |        x y zにspeed(cm/s)で進む<br />x: 20-500 y: 20-500 z: 20-500 speed: 10-100 |
| curve x1 y1 z1 x2 y2 z2 speed  |        現在の座標と2つの与えられた座標で定義された曲線をspeed(cm/s)で飛行<br />x1, x2: 20-500<br />y1, y2: 20-500<br />z1, z2: 20-500<br />speed: 10-60|


Telloのステータス情報は以下のコマンドで確認できます。

| コマンド | 説明 |応答|
|:-----------|:------------|:------------|
| speed?  |        速度|x:1-100 (cm/s)|
| battery? |        バッテリー |x:0-100|
| time? |        飛行時間 |x (s)|
| height? |        高さ |x:0-3000 (cm)|
| temp? |        温度 |x:0-90 (℃)|
| attitude? |        IMU姿勢データ |pitch roll yaw|
| baro? |       気圧 |x (m)|
| acceleration? |        IMU角加速度データ |x y z (0.001g)|
| tof? |        TOFから距離値 |x:30-1000 (cm)|
| wifi? |        Wi-Fi SNR | SNR |

#動画情報の取得

Telloのカメラからの情報は stremon のコマンドで動画情報を受信できるようになります。
取得する場合、PORT:8889からは取得できないため、IP:0.0.0.0 PORT:11111 のUDPサーバを作り受信させる必要があります。

#参考
[receive](https://developer.apple.com/documentation/network/nwconnection/2998572-receive)
[Tello SDK](https://terra-1-g.djicdn.com/2d4dce68897a46b19fc717f3576b7c6a/Tello%20编程相关/For%20Tello/Tello%20SDK%20Documentation%20EN_1.3_1122.pdf)
Cypressテストレポート出力でハマった件

# Cypressとは
E2Eテストフレームワークです
https://www.cypress.io/

# 導入とレポート出力
cypressを導入をしてみてついでにレポート出力しようとしたところハマったためメモしておきます。

# 環境
Windows10
node v12.2.0
Nuxt.js 2.10.1
VSCode
PowerShell

# ハマった内容

```
PS > npx mochawesome-merge > mochawesome.json
PS > npx marge mochawesome.json

✘ Some files could not be processed:
mochawesome.json
  Unexpected token � in JSON at position 0

```

# やったこと
1.cypressインストール

```powershell
 npm install cypress --save-dev
```

2.環境周りの設定

```cypress.json
{
  "baseUrl": "http://localhost:3000",
  "fixturesFolder": "test/e2e/fixtures",
  "integrationFolder": "test/e2e/integration",
  "pluginsFile": "test/e2e/plugins/index.js",
  "supportFile": "test/e2e/support/index.js"
}
```

3.sample.jsの作成
- sample2.jsも同じファイルで作成


```test/e2e/integration/sample.js

/// <reference types="Cypress" />

describe('Sample tests', () => {
  it('Visits index page', () => {
    cy.visit('/');
    cy.contains('h2', 'Nuxt');
  });
});

```


4.scripts設定

```package.json
  "scripts": {
    "e2e": "cypress run",
    "e2e:open": "cypress open"
  }
```

5.動作確認

```powershell
npm run e2e
```

6.レポート関連インストール

```powershell
npm install --save-dev mocha@5 mochawesome mochawesome-merge mochawesome-report-generator
```

7.cyperss設定更新

```cypress.json
{
  "baseUrl": "http://localhost:3000",
  "fixturesFolder": "test/e2e/fixtures",
  "integrationFolder": "test/e2e/integration",
  "pluginsFile": "test/e2e/plugins/index.js",
  "supportFile": "test/e2e/support/index.js",
  "reporter": "mochawesome",
  "reporterOptions": {
    "overwrite": false,
    "html": false,
    "json": true
  }
}

```

8.e2e実行
 * mochawesome-reportフォルダにjsonが出力される

```powershell
npm run e2e
```

9.出力された結果のマージ

```powershell
npx mochawesome-merge > mochawesome.json
npx marge mochawesome.json
```

###ここでハマる

# 解決方法

```powershell
npx mochawesome-merge | Out-File -Encoding Default mochawesome.json
npx marge mochawesome.json
```

###なぜハマったか

- 「mochawesome-merge」で出力された「mochawesome.json」がUTF-16LEとなっていた(VScode上で) *バイナリで先頭FFFE
- PowerShellでやるとNG、コマンドプロンプトだとOK
　⇒  PowerShellのリダイレクトの仕様にハマっていた

ということでPowerShellでUTF8で出力する方法を探したところ上記の解決方法となりました。
*ちなみにEncodingがUTF8指定だとBOM付になりNGでした。
Reactのdebounceとthrottleのhooksをそれぞれ試してみた

Reactのdebounceとthrottleをhooksがないかとそれぞれググってみて検索の上の方に出てきたのをただ試してみただけの投稿です、よろしくお願いします :bow:

私が試したコードはこちらです

https://github.com/okumurakengo/react_debounce_throttle

# debounce

debounceはこちらを試しました

[xnimorz/use-debounce - github](https://github.com/xnimorz/use-debounce)

```bash
yarn add use-debounce
```

```jsx
import React, { useState } from "react";
import { useDebounce } from "use-debounce";

const App = () => {
  const [text, setText] = useState("");
  const [value] = useDebounce(text, 1000);

  return (
    <>
      <input onChange={e => setText(e.target.value)} />
      <p>Actual value: {text}</p>
      <p>Debounce value: {value}</p>
    </>
  );
};

export default App;
```

![PrLe77StJV.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142910/0998a29f-da91-0441-d247-8d03899c0bbb.gif)

debounceが簡単に試せました :grinning:

# throttle

throttleはこちらを試しました

[bhaskarGyan/use-throttle - github](https://github.com/bhaskarGyan/use-throttle)

```bash
yarn add use-throttle
```

```jsx
import React, { useState } from "react";
import { useThrottle } from "use-throttle";

const App = () => {
  const [text, setText] = useState("");
  const value = useThrottle(text, 1000);

  return (
    <>
      <input onChange={e => setText(e.target.value)} />
      <p>Actual value: {text}</p>
      <p>Throttle value: {value}</p>
    </>
  );
};

export default App;
```

![QQNGWIB61F.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142910/ed964584-bd52-77b1-5f78-50655bd33b3b.gif)

throttleが簡単に試せました :grinning:

---

以上です。みていただいてありがとうございました。m(_ _)m
M式によるLisp1.5

![ArcSoft_画像299.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/4266c72f-0345-f81e-5399-2109769ca26b.png)

#はじめに
なんとなく思い立ち、ElixirでLisp1.5相当のインタプリタを作りました。

#M式
はじめにLispに触れたのが中西正和先生の本だったことから、M式に愛着があります。Lisp1.5ユーザーズマニュアルのM式表現を受け付ける処理系にしてあります。

#コンパイラ
時間がとれたらElixirに変換するタイプのコンパイラも考えています。

#起動
GitHubに置いてあるコードのクローンを作ったら、mix elxlisp とすれば起動します。

```
mix elxlisp
Lisp 1.5 in Elixir
? cons[A;B]
(A . B)
? length[(1 2 3)]
3
? quit[]
"goodbye"

```


#コード例
test.metaファイルに簡単なM式コードを収録してあります。

```
fact[n] = [eq[n;0]->1;
          T->times[n;fact[sub1[n]]]]

member[a;x] = [null[x]->F;
               eq[a;car[x]]->T;
               T->member[a;cdr[x]]]

union[x;y] = [null[x]->y;
              member[car[x];y]->union[cdr[x];y];
              T->cons[car[x];union[cdr[x];y]]]

intersection[x;y] = [null[x]->NIL;
                     member[car[x];y]->cons[car[x];intersection[cdr[x];y]];
                     T->intersection[cdr[x];y]]

maplist[x;fn] = [null[x]->NIL;
                 T->cons[fn[car[x]];maplist[cdr[x];fn]]]

? load["test.meta"]
T
? fact[10]
3628800
? intersection[(A B C);(D C A)]
(A C)
?
```


#環境
オリジナルのLisp1.5では環境は連想リストになっています。しかし、Elixirの機能を活かすためにキーワードリストとしています。


```

Lisp 1.5 in Elixir
? eval[cons[x;y];({x 1}{y 2})]
(1 . 2)
?

```

#K先生、ごめんなさい。
思い出しました。K先生はM式が嫌いなのでした。
お遊びプログラミングです。許して、先生。

#コード
Githubにおいてあります。気が向いたときにでも改良します。
https://github.com/sasagawa888/Elxlisp
SECCON 2019Online CTF Writeup coffee_break

2日目の朝8時に起きて「SECCON予選そういえば今日までじゃん」となったので解きました。
個人チームfelviで参加して229位/799位、266ptsでした。

coffee_break以外にもBeeeeeeeeeerなども解きましたが解説がしんどいので他のつよつよの方に譲ります……

https://score-quals.seccon.jp/challenges

# coffee_break (crypto)

```encrypt.py

import sys
from Crypto.Cipher import AES
import base64


def encrypt(key, text):
    s = ''
    for i in range(len(text)):
        s += chr((((ord(text[i]) - 0x20) + (ord(key[i % len(key)]) - 0x20)) % (0x7e - 0x20 + 1)) + 0x20)
    return s


key1 = "SECCON"
key2 = "seccon2019"
text = sys.argv[1]

enc1 = encrypt(key1, text)
cipher = AES.new(key2 + chr(0x00) * (16 - (len(key2) % 16)), AES.MODE_ECB)
p = 16 - (len(enc1) % 16)
enc2 = cipher.encrypt(enc1 + chr(p) * p)
print(base64.b64encode(enc2).decode('ascii'))

# ここまで元のコード

# 元のコードの下に追記

def decrypt(key, s):
    text = ""
    for i in range(len(s)):
        temp = ord(s[i]) - ord(key[i % len(key)]) + 0x20
        while(temp < 0x20):
            temp += 95
        text += chr(temp)
    return text

enctext = "FyRyZNBO2MG6ncd3hEkC/yeYKUseI/CxYoZiIeV2fe/Jmtwx+WbWmU1gtMX9m905"
enc2 = cipher.decrypt(base64.b64decode(enctext)).decode("ascii")
print(decrypt(key1, enc2))
```
encrypt.pyは二段階で暗号化していて、
enc1の1段階目でを文字をずらし、
enc2の2段階目でAES暗号化をしているだけです。

それを逆順にたどっていけば元の文字列が出てきます。
後ろに余計な文字がくっついていますが、これはAES暗号化する平文が16バイトの倍数でなければならず適当な文字でパディングをしているためです。

``` encrypt.py
enc2 = cipher.encrypt(enc1 + chr(p) * p)
```

なので}以降は無視して送信しましょう。

``` flag.txt
SECCON{Success_Decryption_Yeah_Yeah_SECCON}?AA56
```
rubyで英語翻訳ごっこ！：正規表現で語順の違いを解決してみた

#gsubメソッドで翻訳ごっこして遊んでみた#
Rubyという言語には、文字列をお手軽に変換する「gsub」というメソッドがあります。

``` fruits.rb
input = "apple"
input.gsub("apple","banana")   #=>"banana"
```
こんな感じで"apple"を"banana"に変えられます。
gsubメソッドを知ったとき、「これで翻訳できるんとちゃう…？」と思ったのでやってみました。
"I love you" を日本語に翻訳するコードを書いてみます。

``` love.rb
input = "I love you"
input_1 = input.gsub("I","私は")               #=>"私は love you"
input_2 = input_1.gsub("love","愛してる")    #=>"私は 愛してる you"
input_3 = input_2.gsub("you","あなたを")    #=>"私は 愛してる あなたを"
```
"I love you"　⇒　「私は　愛してる　あなたを」
**語順に違和感**がありますが、すべての英語を日本語に変えることができました。
ちなみに、もっとコードを短くしたい場合は

``` love.rb
input = "I love you"
input.gsub(/I|love|you/, "I"=>"私は","love"=>"愛してる","you"=>"あなたを")
#=>"私は 愛してる あなたを"
``` 
と書くこともできます。

さて、ここからが本題です。
違和感があるのは、日本語と英語では語順が違うため。
"I love you"で問題になるのは**"love"と"you"の順番が逆**
という点です。
汎用性も高めたいですね。"I tell you"や"I beg you"にも同じように対応したい。
つまり、

**「何らかの単語」（空白）"you"   ⇒　"you" （空白）「何らかの単語」**

に置き換えたい。

そこで、
<img width="748" alt="正規表現.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/992af596-38b7-2ba2-cc6f-0626135ae385.png">

「**youの前にある単語を、youの後ろにもってくる**」コードを書いてみることにしました。

#正規表現のキャプチャを使って語順を入れ替える
結論からいくと、こんなコードで出来ました。（実行環境はirb）

``` love.rb（追加部分）
input = "I love you"

if input =~ /([A-Za-z]+\s)you/
input.gsub(($1)+"you" , "you\s"+($1))
end                                     

#=>"I you love"
```
正規表現っていきなり見ると少しびっくりする方もいると思うので（まさに私がそう）、ゆっくり説明しようと思います。

まずinputの文字列のなかから、「何らかの単語があって、そのあとに空白があって、そのあとにyouと書いてある」部分を探します。
そういう部分のことを正規表現で表すと
　**/([A-Za-z]+\s)you/**　になるのです。
<img width="669" alt="正規表現.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/a362e1ae-f80c-c885-1238-a6d99cb5339f.png">

そして、「()」で括られた部分、**([A-Za-z]+\s)** は今後、**($1)**という名前でコード上で取り扱えるようになりました。

さて、if input =~ /([A-Za-z]+\s)you/　という処理によって、"I love you"のなかの"love you"というところが抜き出され、**"love(空白)"**　の部分が**($1)**として扱えるようになりました。
<img width="669" alt="正規表現.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/0b2e9c3e-eed1-10bb-5c2a-974be0c16384.png">

あとは、"**($1)+you**" をgsubメソッドで変換して、 "**you+ \s (空白) +($1)**"　に変形しました。

このコードで　**love you**　を　**you love**に。

``` love.rb（追加部分）
input.gsub(($1)+"you" , "you\s"+($1))
                                     
```

空白を入れないと "youlove" になってしまい、あとで日本語に変換できなくなってしまいます。**空白は"\s"で表現できます。**

引っかかった点としては、**($1)を「""」で囲むと出力がうまくいかない**ということです。なので「+」を使って文字列を結合させています。

それでは、「"I love you"を正しい日本語の語順で翻訳する」作業をしてみます。

``` love.rb（追加部分）
input = "I love you"
 
if input =~ /([A-Za-z]+\s)you/
input =  input.gsub(($1)+"you" , "you\s"+($1))
end
#=> "I you love "

input.gsub(/I|love|you/, "I"=>"私は","love"=>"愛してる","you"=>"あなたを")
#=> "私は あなたを 愛してる "
```
語順が正しくなりました！

私は正規表現がとても苦手なのですが、こういう風に遊んでみた結果ちょっとだけ親しめたよ、という話でした。
正規表現ってテキストやってるだけではとっつきにくいことこの上ないので、手を動かしてみると「意外と簡単じゃん」と思えるかもしれません。

最後まで読んでくださった方、ありがとうございました。
間違っているところがあればご指摘ください。
正規表現



# 正規表現

## 正規表現基本概念


```
 
1 正規表現オブジェクト生成// 
2 matchメソッド使える
3 /w[aiueo]rd/.match("word")

```
# /ここの文字/

## 式展開

place = "東京都"

p /#{place}/.match("Go to 東京都")

p $&
p $`

## メタ文字

```

\を入れる事で、特殊な文字列として理解してくれる
例）\n           改行   

```

puts meta

## 文字クラス

```

[] これは何か一つに該当するという意味

 /W[aeiou]rd/

```


## 文字クラスの省略文字

```

これらは毎回 [a-zA-Z0-9_]などを打ち込むのはめんど臭いから省略文字がある

. 任意の1文字
\w 単語構成文字 [a-zA-Z0-9_]
\W 非単語構成文字 [^a-zA-Z0-9_]
\s 空白文字 [ \t\r\n\f\v]
\S 非空白文字 [^ \t\r\n\f\v]
\d 10進数字 [0-9]
\D 非10進数字 [^0-9]
\h 16進数字 [0-9a-fA-F]
\H 非16進数字 [^0-9a-fA-F]

```

## 繰り返し


```

* 0回以上
+ 1回以上

? 0回もしくは1回
{n} ちょうどn回(nは数字)
{n,} n回以上(nは数字)
{,m} m回以下(mは数字)
{n,m} n回以上m回以下(n,mは数字)


```


## マッチした文字を出力

```
string = "hello all over the word "

p /over/.match(string)
p $`
p $&
p $'
```


```
string = "hello all over the word "

p /over/.match(string)
p $` 前
p $& マッチ文字
p $' 後ろ

```
rails4 -> rails5 にアップデートしようとしたら、ActionController::InvalidCrossOriginRequest: Security warning: an embedded <script> tag on another site requested protected JavaScript.  のエラーが出るようになった

## 何が起きたのか
rails4 -> 5 へのアップグレードガイドに、 rails5 からは [protect_from_forgeryは今後デフォルトでprepend: falseに設定される](https://railsguides.jp/upgrading_ruby_on_rails.html#protect-from-forgery%E3%81%AF%E4%BB%8A%E5%BE%8C%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%A7prepend-false%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%95%E3%82%8C%E3%82%8B) と書かれているので、今までの挙動を変えたくないということで、

```diff
- protect_from_forgery
+ protect_from_forgery prepend: true, with: :exception`
``` 

に変更。 `with: :exception` オプションは `prepend: true` を設定したときに RuboCop だかに指摘されたので設定。

そうすると、 ajax で部分テンプレートを返す実装をしている `ajax/hogehoge` というエンドポイントで下記のエラーが発生しているよ、というエラー通知が飛んでくるようになった。

```
ActionController::InvalidCrossOriginRequest: Security warning: an embedded <script> tag on another site requested protected JavaScript. If you know what you're doing, go ahead and disable forgery protection on this action to permit cross-origin JavaScript
```

## TL;DR
`routes.rb` 内のエラーが起きているエンドポイントを設定しているルーティングで constraints オプションを設定し、 `XMLHttpRequest` だけを受け付けるようにしてあげればいい。  `ajax/hogehoge` みたいなエンドポイントだったら下のような感じ。

```ruby
namespace 'ajax' do
  get 'hogehoge', constraints: lambda { |req| req.xhr? }
end
```

## 問題の再現方法
エラーが起きていた、 `ajax/hogehoge` にブラウザから直接 `ajax/hogehoge.js` といった感じでアクセスしてあげると発生。

## 起こった問題の原因
- `ajax/hogehoge` はとあるページからの ajax 通信でアクセスされることを想定したエンドポイントだった。
- そのエンドポイントに対し、ブラウザから直接アクセスしたことにより発生。
- rails5 移行の実装を入れる前は、 `protect_from_forgery with: :exception` のオプションが設定されていなかったため、エラーは起きているものの例外が投げられずスルーされていた。(ということは [ここのコメントを見て予想](https://github.com/rails/rails/blob/c60be72c5243c21303b067c9c5cc398111cf48c8/actionpack/lib/action_controller/metal/request_forgery_protection.rb#L87))

## 対応方針
一番簡単なのは、 rails4 の時と同じ挙動になるように、 

```ruby
protect_from_forgery prepend: true, with: :null_session
``` 
に設定してあげる方法。(未検証ですが多分ちゃんと動く)
ただ、 rails5 の推奨は `with: :exception` らしいので、 このオプションを設定した上でどうにかしたい。

また、今回の問題は ajax 通信を期待しているエンドポイントに対して、非 ajax 通信が来たことにより発生しているので、コントローラレイヤとかではなくルーティングのレイヤでどうにかしたい。

## 対応内容
`routes.rb` 内のエラーが起きているエンドポイントを設定しているルーティングで constraints オプションを設定してあげる。  `ajax/hogehoge` みたいなエンドポイントだったら下のような感じ。

```ruby
namespace 'ajax' do
  get 'hogehoge', constraints: lambda { |req| req.xhr? }
end
```

constraints オプションに関しては、 [railsガイドに詳細](https://railsguides.jp/routing.html#リクエスト内容に応じて制限を加える)が乗っているのでそちらを参考にしてください。

`constraints` オプションでは、 受け付けるリクエストに制限を課すことができるので、 `lambda` を用いて、リクエストが `XMLHttpRequest` (ajaxのリクエスト)であるかどうかを検証している感じです。

この設定により、 `ajax/hogehoge` に ajax でリクエストをする場合は、 `Ajax#Hogehoge` コントローラーが呼び出され正常にレスポンスが返されるが、 ブラウザから ``ajax/hogehoge.js` などでアクセスした場合は 404 エラーを返すようになる。

## 終わりに
rails6も出ていることですし、あんまり今回のような問題で詰まることもないかと思いますが、せっかくだったので記事にしてみました。個人的には、 rails のコードを読んだりするいい機会になったので結構楽しかったです。
Windows+VagrantでDockerを動かすまで

## 概要
- Windowsで開発環境を構築したい。
- Dockerさえ動けばあらかたの環境は作れるはずなので、Dockerを動かすまでをメモ。

## Vagrant

### 1. インストール
ダウンロードしてインストールするだけ。
https://vagrantup.com

### 2. セットアップ

適当なディレクトリで `vagnrant init` すると、Vagrantfileが作成されるので以下の通り編集。

- `config.vm.box = "ubuntu/trusty64"`
（他のものにしたいときは https://app.vagrantup.com/boxes/search から選ぶ）

- `config.vm.synced_folter "../data", "vagrant_data"`
該当ディレクトリがないと起動時にエラーになるので作る。

### 3. 起動
Vagrantfileのあるディレクトリでやること。

- `vagrant up` でVMを起動。
- `vagrant ssh` でVMにssh接続する。


## Docker
### インストール
Docker公式のインストールガイドがあるので、基本的にはこれのとおりやる。
https://docs.docker.com/install/linux/docker-ce/ubuntu/

ただ、ハマりポイントがいくつかあったので解説。

### `4. Use the following command to set up the stable repository ...` どれを使えばいいのよ

`uname -a` コマンドで調べられる。 

```
vagrant@vagrant-ubuntu-trusty-64 ~> uname -a
Linux vagrant-ubuntu-trusty-64 3.13.0-170-generic #220-Ubuntu SMP Thu May 9 12:40:49 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
```

trusty64の場合は`x86_64` とあるので、`x86_64 / amd64`を使えば良い。


### インストール時のコマンド
ガイドでは下記になっているが、

```
sudo apt-get install docker-ce docker-ce-cli containerd.io
```

こっちのほうがよさそう。

```
apt install docker-ce=18.06.1~ce~3-0~ubuntu
```

理由は下記。
- `docker-ce-cli`、`containerd.io` がインストールできない（`docker-ce`に統合された？）
- 最新の`18.06.3~ce~3-0~ubuntu`だと、コンテナの起動時に`OCI runtime create failed`になる

#### ユーザー `Vagrant` にdockerの実行権限を付与する  
Vagrantでsshすると`vagrant`ユーザーが使用されるが、このユーザーにはdockerの実行権限がない。
（`Warning: failed to get default registry endpoint from daemon ...` となって失敗する）
`sudo docker ...` とすれば実行できるが、いちいち`sudo`つけるのめんどいので実行権限を付与する。

```
vagrant@vagrant-ubuntu-trusty-64 /vagrant_data> sudo groupadd docker
vagrant@vagrant-ubuntu-trusty-64 /vagrant_data> sudo usermod -g docker vagrant
vagrant@vagrant-ubuntu-trusty-64 /vagrant_data> sudo service docker restart
```

dockerが再起動したらsshし直す。

#### 起動確認

```
vagrant@vagrant-ubuntu-trusty-64 ~> docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

### 

## 備考
WSL2正式リリースはよう。
初心者がfirebaseを使ってReactのアプリを公開してみました。

###前提条件
firebaseを全く取り扱ったことのない初心者が、Reactを使った簡単なアプリケーションを公開するまでをメモします。

###参考サイト集
第2回】 Firebase の基本操作を理解しよう！【はじめてみよう Firebase】
https://www.topgate.co.jp/firebase02-how-to-use-firebase

Firebaseでcreate-react-appアプリを公開する基本の手順（個人的にはこのサイトが一番見やすかったです。）
https://qiita.com/one-kelvin/items/958c9c1351d0d02c9c9f

Facebook公式のcreate-react-appコマンドを使ってReact.jsアプリを爆速で作成する
https://qiita.com/chibicode/items/8533dd72f1ebaeb4b614

Reddit風掲示板をFirebaseとReactを組み合わせてモダンに作る方法
https://www.webprofessional.jp/reddit-clone-react-firebase/

###つまづいたところ
- buildコマンドを打つとエラーが起こった。単純にカレントディレクトリが違うっていう単純なエラーでした。
- package.jsonファイルに正しい記述をしていなかったこと。どうやらpackage.jsonが「設定」を記述するためのファイルらしいです。


###簡単な用語集
- コンパイル：コンパイルとは英語で翻訳という意味であり、ソースコードを人間が読んで分かりやすいプログラミング言語から機械が読んで分かりやすい機械語に翻訳を行うことを指します。
- ビルド：ビルドとは、おおまかに言うと「ソースコードに問題（バグ）がないか解析を行い、問題がなければ実行できる形のファイルに変換し、組み立てること」です。単にソースコード翻訳しただけでは複雑なプログラムは動かないため、必要な付帯ファイルのセットなどをビルドで行う必要があるのです。
- デプロイ：ビルドしてできた実行ファイルを、実行する環境に合わせて、実際に実行できるようにすること。


###次回の課題
- それぞれの用語の深い理解。（ビルド、デプロイ、コンパイルのそれぞれの違いとか、firebaseのhosting以外の様々な使い道とか）
- 今回はテストとして上記の参考サイトの手順に沿って進めていったが、次は自分で作成したアプリケーションの公開を一から始めてみる。


###終わりに
株式会社popteamは未だ謎めいているSNSを科学しようとしている会社です！
React.js , Typescript , Rustなど新技術を使った開発を行っております。
ぜひ興味ある方は一度ご連絡ください。
会社
https://pop-team.com
サービス
http://digi-panda.com （編集済み）
【エディタ】vim コマンド一覧

#記事作成のきっかけ
Linuxサーバーの作業をCLIで行えるVimは最強なので、コマンドを備忘用に記録する。(2019年10月)

#主要なモード
以下の３モードとなる。
1.ノーマルモード
Vim立ち上げ直後、または[ESC]を押した直後のモード。

2.インサートモード
開いたファイルの内容を実際に編集するモード。
ノーマルモード時に[i]を押すことで切り替わる。

3.ビジュアルモード
行などを移動するときに使うモード。
ノーマルモード時に[v]を押すことで切り替わる。

以下に詳細を示す。

##1.ノーマルモード
| コマンド|動作|
| :-- | :-- |
| :w | 保存 |
| :q | 終了 |
| :wq |保存して終了
| :q! | 保存せず終了 |
| [x] | 1文字削除 |
| [d][d] |１行削除 |

##2.インサートモード
いわゆる編集モード。
[i]を押すことで切り替わる。

| コマンド|動作|
| :-- | :-- |
| [i] | 現在のカーソル部から文字を入力する |
| [a] | 現在のカーソル部の次の位置から文字を入力する |
| [o] | (アルファベットのオー)現在のカーソル部の次の行から文字を入力する |
| [O] | (アルファベットのオー。Shift-[o])現在のカーソル部の前の行から文字を入力する |

##3.ビジュアルモード
[ESC]->[v]とキーを押すと、カーソルで範囲を選択できる。
範囲選択後、以下のコマンドで作業ができる。

| コマンド | 動作 |
| :-- | :-- |
| y | 選択範囲をヤンク（＝コピー） |
| p | カーソル直後に、ヤンクされたものが貼り付けられる（ペースト） |


#まとめ
vimは奥が深い。
慣れれば、十字キーも使わずテキストを編集できるので、
使いこなせるようになると、Unixシステム（Linux, Mac）上で、Command Line Interfaceでの仕事が捗る。
引き続き、本記事も更新していきたい。
yarn upgrade は間接依存のバージョンを上げない

## 起こったこと

Vue.js のプロジェクトに Storybook を導入していて、そのために `vue-cli-plugin-storybook` をインストールしていた (詳細を書くが、以降の本筋に具体的な npm パッケージ名は関係ない)。
それをインストールした当時は Storybook **5.1** が最新としてインストールされ、`yarn.lock` ファイルにもそれが記録された。

その後、Storybook **5.2** がリリースされたので利用しようと `yarn upgrade-interactive` コマンドでアップグレード作業を実施したが、`vue-cli-plugin-storybook` が依存する `@storybook/vue` は **5.1** のままで、アップグレードできなかった。`yarn upgrade`, `yarn outdated` などのコマンドも同様。

## 原因

Yarn の設計によるもの (参考: [Upgrading sub-dependencies (`upgrade --deep`) · Issue #2394 · yarnpkg/yarn · GitHub](https://github.com/yarnpkg/yarn/issues/2394))。
`yarn upgrade` は package.json に書かれた依存のみ更新し、依存の依存などは更新しない。

## 対策

バージョンをコントロールしたい、つまり直接依存するものは package.json に書くようにする。

または `yarn upgrade --deep` を利用する。`--deep` オプションはドキュメントに書かれていないようだし、`yarn upgrade-interactive` や `yarn outdated` で使えなかったので非公式かもしれない。
個別ではなく yarn.lock 全体がアップグレードされるような挙動をしていた。正直あまりよくわかっていない。

または `yarn remove` から `yarn add` をする。
Gitコマンドの入力で突然 'xcrun: error: invalid active developer path〜'のエラーになった時の対処法

##はじめに
GitHubでソースコードを管理しようと、ワークツリーからインデックスへ移行しようと`git add`を行った際に次のエラーが生じました。ちなみに、他のGitコマンドを入力しても同様のエラーが表示されました。

```
$ git add .
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), 
missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

##原因
エラーメッセージは、コマンドラインツールがない、という意味っぽいのですが、昨日まで問題なく通っていたコマンドでしたので少し戸惑いました。
調べてみるとmacOSのアップデートが原因で、そういえば前日の夜にPCのアップデートが行われていたことを忘れていました。



##対処法
`xcode`のインストールを行えば解決されるので次のコマンドを入力します。

```
$ xcode-select --install
```
次の画面が表示されるので`インストール`をクリック
<img width="462" alt="スクリーンショット 2019-10-12 7.39.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/4c576e88-b73c-fa8f-cf9c-96d7536999f7.png">
使用許諾契約に同意します。
<img width="640" alt="スクリーンショット 2019-10-12 7.40.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/4650bc11-5996-9228-7786-e0999b893db5.png">
後は、インストールが完了するのを待つだけです。
<img width="503" alt="スクリーンショット 2019-10-12 7.41.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438093/793618c3-e087-078c-e552-8cad841c4d03.png">

インストール完了後、無事に`git add`のコマンドが通りました。

##参考
https://apple.stackexchange.com/questions/254380/why-am-i-getting-an-invalid-active-developer-path-when-attempting-to-use-git-a
なぜVisual Studio CodeはPowerShellで右辺に$nullを置くと怒り出すのか

# Visual Studio Code(以下VSCode)はPowerShell開発に最適！

PowerShellで開発するのであれば
・テキストエディタ
・PowerShellISE
・VSCode
あたりが候補となるかと思う。

個人的には、インテリセンスが効き呼び出し元メソッドをたどるのも楽なのでVSCodeが最適だと思っている

# VSCodeは比較の際に\$nullを左に置くことを推奨している
```PowerShell:test.ps1
if($a -eq $null){
    DoSomething
}
```
こういう書き方をすると、以下の警告メッセージが発生する(動かないわけではない)
![左辺null.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501968/aef49dfa-996d-4fe3-eac3-ecdf677603af.png)

## なぜ$null左辺が推奨されるのか
https://stackoverflow.com/questions/58217913/should-null-be-on-the-left-side-of-the-equality-comparison-eq-with-arrays

理由は、PowerShellの-eqは左辺にArrayが来た場合にフィルターとして働くため
例えば

```PowerShell:test.ps1
1,2,3 -eq 2
```

という式は、左辺の中で2に等しい値を返却する(なので、この式は2を返す)
左辺に配列が来る場合その内容により意図せぬ動作をする可能性があるため、左辺\$nullが推奨されている

# リーダブルコードにおいては
右辺は不動のもの、左辺は変動するものという運用が推奨されている(PowerShellの話ではなく、比較の全般的な話として)

コードを書く際に必ず左辺に配列が来ない箇所であれば右辺\$nullも許容されそうだが
・そもそも動的型付け言語なので左辺に配列が来ないことを保証しにくい
・左辺に配列が来る場合と来ない場合で書き方が混在してしまう
といったところから、やはり左辺\$nullに統一するのがベストかと思う
初心者のためのGo言語基礎〜基本文法①〜

# 初心者のためのGo言語基礎〜基本文法〜   
[初心者のためのGo言語基礎〜Goの特徴とインストール〜](https://qiita.com/lelouch99v/items/e0cf4c3c6d6173d0f7c5)
上記に続いて基本文法を簡単にまとめます。


## 1. パッケージ
ソースコードはパッケージの記述から始まります。

```go:hello.go
package main

〜
```

Goでは、**mainパッケージのmain()関数が最初に実行**されます。

## 2. インポート
別のパッケージをインポートします。

下記では「fmtパッケージ」を取り込んでいます。

```go:hello.go
package main

import "fmt"

〜
```

複数パッケージを取り込む時は、以下のような書き方もできます。

```go:hello.go
package main

import (
    "fmt"
    "strings"
)

〜
```

#### メソッドのpublicとprivate
パッケージ名 + ドット + 関数名　で取り込んだパッケージの関数を使用できます。

Goではpublicメソッド（他のパッケージからも見える関数）は頭文字が大文字になります。
privateメソッドは頭文字が小文字になります。

```go
fmt.Println("Hello World!")
```

#### オプション
importにはオプションも指定できます。

- ドット
    - パッケージ名を省略して関数名だけで使える
- 文字列
    - 指定のパッケージ名で取り込める
- アンダースコア
    - そのパッケージが未使用でもエラーにならない
    - 通常Goでは未使用のパッケージが１つでもあるとコンパイルエラーとなる

```go
import (
    . "fmt"    // 関数名だけで使える
    str "strings"   // パッケージ名strで取り込む
    _ "math"    // 未使用でもOK
)

func main() {
    Println("Hello World!")
    Println(str.Contains("Hello World!", "Hello"))
}
```

## 関数
##### 引数
- 引数の後ろに型を記述する。
- 複数同じ型ならカンマ区切りでまとめられる


```go
func hoge(a,b int) {

}
```

##### 戻り値

- 戻り値の方は引数の次に記述する
- 関数は複数の戻り値を返せる
- returnする順番で返す値の順番が決まる
- アンダースコアで戻り値を無視できる

```go
func hoge() (int, int) {
    return 1, 2
}

func main() {
    x,y := hoge()    // xに1、yに2が代入
    x,_ := hoge()    // 第二戻り値を無視する。 xに1が代入

    fmt.Println(x)    // x=1
    fmt.Println(y)    // y=2
}
```


##### 名前付きの戻り値
- goでは戻り値に名前を付けられる
- 関数内ではゼロ値で初期化された変数の扱い
- return明示が必要なく、その時点での値が返される

```go
func main() (a int, b int, err error) {
    a = 1

    return    // a=1,b=0,err=nil が返される
}
```

##### 関数リテラル
- 無名関数を作成可能

```go
func main() {
    func(x,y int) int {
        return x+y    // 3が返される
    }(1, 2)    // 引数
}
```

- 変数に関数を代入することもできる

```go 
var sum := func(x,y int) int {
    return x+y
}

func main() {
    fmt.Println( sum(1, 2) )    // 3が表示される
}

```
【Rails6】generateコマンドでyarnエラー

# 内容
- Rails6でgenerateコマンドを打ったらyarnエラーが発生したのでその対処法
- 対処法と言ってもエラー内容に従って解決しただけです(もし原因ご存じの方がいたらご教示ください)


# 環境
- macOS Mojave 10.14.6
- VirtualBox 6.0.10
- Vagrant 2.2.5
- centos/7 (virtualbox, 1905.1)
- rbenv 1.1.2-4-g577f046
- ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux]
- Rails 6.0.0


# エラー内容

```sh
# エラーを発生させたコマンド
bin/rails generate controller {samples}



# エラー内容
/usr/share/yarn/lib/cli.js:46099
  let {
      ^

SyntaxError: Unexpected token {
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:373:25)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Module.require (module.js:353:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (/usr/share/yarn/bin/yarn.js:24:13)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)


========================================
  Your Yarn packages are out of date!
  Please run `yarn install --check-files` to update.
========================================


To disable this check, please change `check_yarn_integrity`
to `false` in your webpacker config file (config/webpacker.yml).
```


# やったこと

`Please run 'yarn install --check-files' to update. `とあったので次のコマンドを実行

```sh
$ yarn install --check-files


# 結果
/usr/share/yarn/lib/cli.js:46099
  let {
      ^

SyntaxError: Unexpected token {
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:373:25)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Module.require (module.js:353:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (/usr/share/yarn/bin/yarn.js:24:13)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)
```

そもそも`yarn -v`などのyarnコマンド全てで同じ結果でした。


# 解決
`please change 'check_yarn_integrity'
to 'false' in your webpacker config file (config/webpacker.yml)`
とあったので、`config/webpacker.yml`を編集して該当項目をtrue->falseへ変更

```yml:config/webpacker.yml
# Note: You must restart bin/webpack-dev-server for changes to take effect
...略

development:
  <<: *default
  compile: true

  # Verifies that correct packages and versions are installed by inspecting package.json, yarn.lock, and node_modules
-  check_yarn_integrity: true
+  check_yarn_integrity: false

...略
```

やってみる

```sh
$ bin/rails generate controller samples
Running via Spring preloader in process 25275
      create  app/controllers/samples_controller.rb
      invoke  erb
      create    app/views/samples
      invoke  test_unit
      create    test/controllers/samples_controller_test.rb
      invoke  helper
      create    app/helpers/samples_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    scss
      create      app/assets/stylesheets/samples.scss
```

generateコマンドは無事通りましたがyarnコマンドは使えないままです。
原因ご存じの方はご教示ください。
CometD 4.0.4でネットワーク・エラーのメッセージが変わっていた 

[CometD](https://cometd.org/)を使った情報配信Webアプリケーションの開発プロジェクトにて、結合テストで不具合が発生したので備忘録として書き留めておきます。

私はフロントエンド機能の開発を担当していたのですが、ネットワーク・エラー発生時にアプリのリカバリー処理を実行するために、Bayeuxレスポンスのerrorフィールドに設定される（はずだった）下記メッセージを検知するようにリスナー(JavaScript)を実装していました。

```
402::Unknown client
```
上記メッセージを検知したら、アプリのリカバリー処理がコールされるはずだったのですが．．．
サーバー・サイド機能との結合テストを実施してみるとリカバリー処理がコールされず、実際にサーバー・サイドから受信したエラー・メッセージを確認してみると以下のとおりでした。

```
402::unknown_session
```
最新の[CometD 4.0.4 リファレンス・マニュアル 8.5.2. Long Network Failures or Server Failures](https://docs.cometd.org/current/reference/#_long_network_failures_or_server_failures)には確かに`402::unknown_session`と記載されています。

「おやっ？」と思い、`CometD 4.0.3`以前のリファレンス・マニュアルの同じ箇所を確認したところ、`402::Unknown client`と記載されており、`CometD 4.0.4`からメッセージ文言が変わっていることが判りました。
単体テストで使っていたのは`CometD 4.0.2`、結合テストでは`CometD 4.0.4`が使用されていたことにより、メッセージ文字列がマッチしなくなり、結合テストでエラーが検知できなくなってしまったようです。

メッセージ先頭の`402::`で検知するように修正して解決。


以上。
データベース設計の基礎知識・手順をまとめてみた

### まずはデータベース設計の基礎知識から学ぶ
# データベースを構成する要素
データベースを構成する要素は以下の3つがある。

+ サービスで扱う概念(エンティティ)
+ エンティティの属性
+ エンティティ同士の関係性(リレーション)

### サービスで扱う概念(エンティティ)
サービスで扱うデータを定義する。データベース設計ではこのデータを```エンティティ```と言う。

● __エンティティ__
サービスの中で管理する必要のある概念(情報)指す。
例にあげるとSNSなどのサービスでは「ユーザー」や「投稿内容」、「コメント」などの情報を管理する必要があるが、これらの情報がエンティティにあたる。

### エンティティの属性
エンティティは属性を持つ。映画というエンティティであれば、タイトルや説明、公開日、監督などが属性である。

● __エンティティの属性__
エンティティが個別に持つ情報のこと。ユーザーというエンティティでは、「名前」　「アドレス」　「パスワード」　「プロフィール写真」が属性にあたる。

※ エンティティと属性の例

|__エンティティ__|__属性__|
|:----------:|:------:|
|投稿内容(ツイートなど|投稿したテキスト、投稿した写真、 いいね数 etc|

### エンティティ同士の関係性(リレーション)
エンティティとエンティティの間に関係性がある場合があり、これを__リレーション__をいう。Twitterではツイートをツイートを投稿したユーザーの間には関連性がある。

● __リレーション__
エンティティとエンティティとの間に存在する関係性のことであり、例にあげると、映画には、その映画を撮った監督がいる。こういった場合映画を監督の２つのエンティティには関係性がある。
(Twitterだとどのユーザーが投稿したツイートであるか分かるように設定する。)

# データベース設計の手順
ほとんどの場合で必須となる手順は以下の４つ。

1. データベースで管理するデータ（エンティティ)を決める
2. それぞれのデータを持つ属性を決める
3. エンティティ同士の関係性を決める(リレーション)
4. データを実際にデータベースのテーブルとして定義

### 1. データベースで管理するデータ(エンティティ)を決める
まずは、作成するサービスで管理するデータを決める。この作業はエンティティを決定することと同義。
Twitterの例にしてみると、大きく分けて__ユーザーと投稿したツイートと２つのエンティティが必要__であることが分かる。

### 2. それぞれのデータの持つ属性を決める
エンティティが決定すれば次に属性を考える。
__ユーザーに持たせる属性は名前、アドレス、パスワード__などがあげられる。__ツイートに持たせる属性は、本文、いいね数、投稿時間__など。。。

### 3. エンティティ同士の関係性を決める(リレーション)
エンティティ同士の関連性を決定する。ツイートには必ず投稿したユーザーが存在し、そこで__ユーザーをツイートとの間にリレーションを設定する__ことで２つのエンティティ同士に関係性を持たせる。また、他のエンティティと関係のない独立したエンティティも存在する。

### 4. データを実際にデータベースのテーブルとして定義
最後に1〜3の手順を元に実際にテーブルを作成することになる。__エンティティはテーブルに相当し、属性はテーブルが持つカラムに相当する。__

# まとめ
以上の手順がデータベース設計の基本であり、何かアプリを作成する前に考えないことには始まらない。
まずは分かる部分から紙でも良いので書いていき適宜修正も行う。
モニタ非接続環境でVNCデフォルト解像度を変更する方法(Jetson TX1/Ubuntu)

Jetson(Ubuntu)にモニタを接続していない状態でDesktop Sharing/Remmina等でVNC接続すると、画面解像度が640x480とかなり小さい。モニタを接続すると大きくなるのだが、モニタを接続しない状態でデフォルト解像度を変える。

# 手順

Jetsonで`/etc/X11/xorg.conf`を編集する。

```bash
sudo vim /etc/X11/xorg.conf
```

`Screen`セクションを追加する。

```vim
Section "Screen"
   Identifier    "Default Screen"
   Monitor        "Configured Monitor"
   Device        "Default Device"
   SubSection "Display"
       Depth    24
       Virtual 1280 800
   EndSubSection
EndSection
```

再起動後、設定が有効になる。

# 参考

https://devtalk.nvidia.com/default/topic/995621/jetson-tx1/jetson-tx1-desktop-sharing-resolution-problem-without-real-monitor/post/5159559/#5159559
vscode + golangでgo getをする際のメモ(自分用)

## 完全に私用のメモ
##以下のツールを一括で取得するコマンド
- gocode
- gopkgs
- go-outline
- go-symbols
- guru
- gorename
- gotests
- gomodifytags
- impl
- fillstruct
- goplay
- godoctor
- dlv
- gocode-gomod
- godef
- goreturns
- golint

```
go get -u -v github.com/mdempsky/gocode github.com/uudashr/gopkgs/cmd/gopkgs github.com/ramya-rao-a/go-outline github.com/acroca/go-symbols golang.org/x/tools/cmd/guru golang.org/x/tools/cmd/gorename github.com/cweill/gotests/... github.com/fatih/gomodifytags github.com/josharian/impl github.com/davidrjenni/reftools/cmd/fillstruct github.com/haya14busa/goplay/cmd/goplay github.com/godoctor/godoctor github.com/go-delve/delve/cmd/dlv github.com/stamblerre/gocode github.com/rogpeppe/godef github.com/sqs/goreturns
```
JavaScriptにおける関数の基礎を勉強した

JavaScriptを勉強してる時に最初につまずいたのが関数。
最初はなんとなく読めたけど「え、人によって書き方が違う・・？」「アロー関数・・・？矢？え、矢？」ってなったのでちゃんとお勉強した


## 関数ってなに
function(関数)は**色んな処理を一つにまとめて名前をつけた**もの
例えばよく使う処理を関数にしておくことで、コードの再利用性が上がってスッキリする

##基本の関数
関数はいろいろな形があるがまずは基本の形
###基本的な書き方
関数を定義して、プログラム内で呼び出すことができる

```javascript

function hoge() {
  console.log("hello");
}

hoge();
```


### 引数を利用した書き方
定義した関数に引数を渡すこともできる

```javascript

function hoge(fruit,Number) {
  console.log('私は' + fruit + 'を' + Number + '個買った') ;
}

hoge('リンゴ',5);
```

### コールバック
引数に関数を指定することもできる

```javascript

function hoge2 (){
  console.log('hoge2が実行されました');  
}

function hoge1() {

  console.log('hoge1が実行されました');
  hoge2();
 
}

hoge1(hoge2);
```
この時、hoge1()にはhoge2の関数式が渡される

```javascript

function hoge2 (){
  console.log('hoge2が実行されました');
  testだよ
}

function hoge1(result) {

  console.log('hoge1が実行されました');
  console.log(result);
  hoge2();

}

hoge1(hoge2);
```

```:console
hoge1が実行されました

ƒ hoge2 (){
  console.log('hoge2が実行されました');
  testだよ
}

hoge2が実行されました
```



###return(戻り値)
returnを利用することで、関数から戻り値を取得できる

```javascript

function hoge1(num1,num2) {
  var answer;
  answer = num1 * num2 ;
  return answer;
}

console.log(hoge1(4,6));
```

##無名関数
無名関数は名前を定義しない関数(そのまんま)
関数名をつける手間が省かれるのがメリット

###無名関数の書き方
無名関数は変数に関数を代入して使用する

```javascript

var result = function() {
  console.log("hello");
}

result();
```

###引数を利用した書き方
無名関数にも引数を渡すことができる

```javascript

var hoge = function (fruit,Number) {
  return(('私は' + fruit + 'を' + Number + '個買った')) ;
}

var my = hoge('リンゴ',5);
console.log(my);
```

##即時関数
関数を定義すると同時に実行するための構文。
即時関数はスコープを汚染しないため、再利用しないような処理に使われる。


### 即時関数の書き方
無名関数をさらに()で覆うような書き方をする

```javascript

var hoge = (function () {
  console.log("hello") ;
}());
```

###引数を利用した書き方
即時関数も引数を使用できる

```javascript

var hoge = (function (fruit,Number) {
  return(('私は' + fruit + 'を' + Number + '個買った')) ;
}('リンゴ',5));

console.log(hoge);
```

## アロー関数
ES2015から導入された書き方。
「=>」この矢みたいな書き方をすることで「function」を省略することができる

### アロー関数の書き方
まずは普通の関数の書き方

```javascript

var result = function() {
  console.log("hello");
}

result();
```
アロー関数を使うことでfunctionを省略できる

```javascript

var result = () => {
  console.log("hello");
}

result();
```
さらに処理が１行の場合は{}を省略することができる

```javascript

var result = () => console.log("hello");

result();
```

###引数を利用した書き方
アロー関数も当然引数を指定できる

```javascript

var result = (idle) => console.log(idle);

result('坂道');
```

さらに引数がある場合のみ、()を省略することもできる

```javascript

var result = idle => console.log(idle);

result('坂道');
```
Unity玉転がしチュートリアル 3-1.収集するオブジェクトの作成

# この記事の対象者
* Unity入門したい人
* 最初の一歩が踏み出せない人

# OSとか環境とか

* Windows 10 Pro
* macOS Mojave
* Unity 2019.2.8f1
* Rider 2019.2.2

# 補足
* 公式動画にて利用しているのはMacなので、Windowsユーザーはある程度脳内変換して見る事
* 筆者はWindows、Macの両方の環境で確認。Ubuntuとかでは検証してない。
* 基本Unityは英語メニューで利用
* 間違いがあったらツッコミ大歓迎

## 公式
https://learn.unity.com/tutorial/collecting-scoring-and-building-the-game#5c7f8529edbc2a002053b788

## オブジェクトを作成


プレイヤーが獲得するアイテムを作成
GameObject > 3D Object > Cubeで追加→座標リセットを行う

追加すると既存のプレイヤーのオブジェクトが操作に邪魔なので、非アクティブにする
非表示にする方法はInspectorにて名前の左側にあるチェックボックのON/OFFで切り替わる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/e8d06c34-c940-bbef-c0a3-16a05d3504f3.png)

追加したCubeが埋まっているので、PositionのYを0.5上に移動してあげる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/36c0a2b6-bcd5-0d62-c310-274d1abd5835.png)



メラミンスポンジみたいな形なったら成功

## オブジェクトの外観変化

アイテムっぽくないので見た目を変更する

追加したアイテムの
・ScaleをXYZ全て0.5に
・TransformのRotationのXYZを全て45に
にして、小さく地面から浮いた状態に変更する

これだけでもアイテム感は確かにあるが、アイテムが動いていれば更にアイテムとわからせることが出来るので動きを追加

Cubeを回転させるスクリプトを追加

Pick Upオブジェクトを選択してInspectorからAdd ComponentでNewScriptを選択してスクリプト追加
出来上がったスクリプトはこちら

```Rotator.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Rotator : MonoBehaviour
{

    // Update is called once per frame
    void Update()
    {
        transform.Rotate(new Vector3(15,30,45) * Time.deltaTime);   
    }
}
```

これでPlayを押すと、アイテムがしっかり回転していることがわかる


## Pick Up オブジェクトのプレハブ化

プレハブ＝GameObjectの設計図
プレハブを更新すると全てのオブジェクトが更新される

プレハブを格納するフォルダを作成する
フォルダ名は「Prefabs」とする
HierarchyのPick UpからProjectのPrefabsの中にドラッグする

## ゲームオブジェクトの整理

整理用のオブジェクト（Pick Ups）を作って、その中を整理します。
Pick UPオブジェクトをPick Upsの子に設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/5ada4a31-0928-c9ee-287c-e59f88ad7cee.png)



このままPick Upオブジェクトを移動すると、斜め（今の角度準拠）に動いてしまう
行いたいことは地面にオブジェクトを動かす事なので、エディタのモードを変更する

Local→Globalに変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/b8d47436-b31b-4b46-8025-47abd4902d6d.png)



そしてPick Upオブジェクトを移動すると、グローバルな座標での移動が可能になる

アイテムが1個だと寂しいので、コピーします
Edit > Duplicateからも出来るが、Ctrl＋D（Macは⌘＋D）のショートカットで複製可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/fe2ed248-e5a6-797a-4af7-0466c089f4b1.png)

今回は12個配置

## アイテムの色変更

Materialを複製して紐付ける
マテリアルの色を黄色に変更してプレハブにセット
プレハブにセットするので、画面内のPickUpの色が全て変更される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324639/07705241-8443-b9c0-8d3e-3526f2ed901e.png)