OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptでProtocol Buffersを使う (google-protobuf)

画面（`JavaScript`）から`Protocol Buffers`を使う機会があったので、メモしておきます。
[公式](https://developers.google.com/protocol-buffers/docs/reference/javascript-generated "公式")に記載の方法で実施していきます。
https://developers.google.com/protocol-buffers/docs/reference/javascript-generated

## 必要なもの

- [protoc](https://grpc.io/docs/protoc-installation/ "protoc")

https://grpc.io/docs/protoc-installation/

- [node.js](https://nodejs.org/ja/ "node.js")

https://nodejs.org/ja/

- [yarn](https://classic.yarnpkg.com/ja/ "yarn")

https://classic.yarnpkg.com/ja/

## demo
https://thirosue.github.io/protocol-buffers-javascript-sample/generated-code/

※ サンプルコード全量
https://github.com/Thirosue/protocol-buffers-javascript-sample/tree/master/generated-code

## インターフェイス定義

インターフェース定義は[公式](https://developers.google.com/protocol-buffers "公式")のサンプルを利用します。

```:person.proto
syntax = "proto3";
package person;

message Person {
  string name = 1;
  uint32 id = 2;
  string email = 3;
}
```

https://github.com/Thirosue/protocol-buffers-javascript-sample/blob/master/generated-code/person.proto

## 事前準備

### プロジェクト作成

既に作成済みの場合は、スキップしてください。

```bash
$ yarn init
yarn init v1.22.4
question name (generated-code):
question version (1.0.0):
question description:
question entry point (index.js):
node_modules/
question repository url:
question author:
question license (MIT):
question private:
success Saved package.json
✨  Done in 3.38s.
```

### モジュールバンドラ（`Browserify`)インストール

既に導入済みの場合は、スキップしてください。

```bash
yarn add --dev browserify
```

### ライブラリインストール

```bash
yarn add google-protobuf
```

### クライアントコード生成

```
## インターフェース定義ファイル（person.proto）がある場所に移動
$ cd /path/to/directory
$ pwd
$ /path/to/directory/protocol-buffers-javascript-sample/generated-code
## クライアントコード生成
$ protoc --proto_path=. --js_out=import_style=commonjs,binary:. person.proto
```

## サンプルコード

```javascript:index.js
// インターフェース定義を取得する
const person = require('./person_pb');

// インスタンス生成 && 値をセット
const origin = new person.Person();
origin.setName('john doe');
origin.setId(99);
origin.setEmail('test@example.com');

// メッセージを Uint8Array に変換する
const buffer = origin.serializeBinary();
console.log(new TextDecoder().decode(buffer)); // 文字列に変換する

// メッセージをデコードする
const decode = person.Person.deserializeBinary(buffer);
console.log(decode);

// メッセージをオブジェクトに変換する
const obj = origin.toObject();
```
SKSpriteNodeのAnchorPointとpositionについて

`anchorPoint`と`position`の関係について混乱したので整理する。

以下のような背景画像のノードを例にanchorPointプロパティとpositionプロパティについて考えてみる。`GameScene`と同じサイズの背景画像ノードである。


```swift:GameScene.swift
       let backgroundImageNode = SKSpriteNode(imageNamed: R.image.background.name)
        backgroundImageNode.size.width = size.width
        backgroundImageNode.size.height = size.height
```

### anchorPoint: (x: 0.0, y: 0.0), position: (x: size.width * 0.0, y: size.height * 0.0)

```swift:GameScene.swift
        backgroundImageNode.anchorPoint = CGPoint(x: 0.5, y: 0.5)
        backgroundImageNode.position = CGPoint(x: size.width * 0.5, y: size.height * 0.5)

        addChild(backgroundImageNode)
```

`anchorPoint`はノードの座標系の中で、どの地点をノードの中心として定義するかを表す。
もしノードを回転させる場合は、そこを中心として回転することになる。
また、`position`で設定した位置に`anchorPoint`の地点が置かれるようにノードが設置される。

上の例では、まず`backgroundImageNode`の中心地点をNodeの真ん中に定義する。
その後、この`backgroundImageNode`の`position`を`GameScene`の真ん中の地点として定義している。

すると、ちょうど`backgroundImageNode`は`GameScene`をぴったり覆うような形で描画される。

なお`anchorPoint` の初期値は元々`CGPoint(x: 0.5, y: 0.5)`なので、下のように書いても同じである。

```swift:GameScene.swift
        backgroundImageNode.position = CGPoint(x: size.width * 0.5, y: size.height * 0.5)

        addChild(backgroundImageNode)
```

### SKSpriteNodeの座標系

`position`に値をセットすると、そのノードの親の座標系上にノードが置かれる。子ノードが置かれる座標系の原点は、上で設定した親ノードの`anchorPoint`の地点となる。

### 参考

[Apple - Working with Sprites](https://developer.apple.com/library/archive/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Sprites/Sprites.html#//apple_ref/doc/uid/TP40013043-CH9-SW36)
[SpriteKitでゲーム　その１- SPACE SHOOTER②](https://tukumosanzou.hatenablog.com/entry/2018/07/05/035448)
[About SpriteKit Coordinate Systems](https://developer.apple.com/documentation/spritekit/sknode/about_spritekit_coordinate_systems)
rails6+tailwindcss+herokuでcssが効かなかった件

# 事象

- rails6
- tailwindcss
- heroku

でcssが効かなかった

# 対策

```ruby:config/webpacker.yml
production:
  <<: *default
extract_css: false
```

extract_cssがtrueだとheadタグ内にリンクが出る。ここをfalseにしたら解決。
Rails Tutorial　第11章　演習11.3.3.3 どんなテストをすべきか人によって違う


##演習11.3.3.3　
かなり苦労しました。
どんなテストをすべきかが問題には

>ここまでの演習課題で変更したコードをテストするために、/users と /users/:id の両方に対する統合テストを作成してみましょう。 
有効でないユーザーは表示する意味がありません

と詳細化されていないため、自分も含めネットの方の解答例がバラバラでした。

テストは2つと考えました。
１つ目は
>/usersのユーザーindexページを開くとすべてのユーザーが表示され、

2つ目は

>/users/:idのようにIDを指定すると個別のユーザーを表示できます。

です。

1つ目のテストは、既にあるindexページのテストを修正します。
検証項目は、indexの結果にacrivatedでないユーザーは表示されないことです。


準備として、テストデータにactivatedがfalseのユーザーを作ります。
users.ymlに既にあったlanaを修正します。

```yml:test/fixtures/users.yml
lana:
  name: Lana Kane
　..
  activated: false
　activated_at: <%= Time.zone.now %>
```

```ruby:test/integration/users_index_test.rb
  ..
    first_page_of_users.each do |user|
      if user.activated 
        assert_select 'a[href=?]', user_path(user), text: user.name
        unless user == @admin
          assert_select 'a[href=?]', user_path(user), text: 'delete'
        end
      else
        assert_select 'a[href=?]', user_path(user), text: user.name, count: 0
        #p user.name #debug only
      end
```

p user.nameはテストでelse以下が実行されたのか不安だったので、このテストが正しいかをデバッグするために入れました。

デバッグの実行結果は、

```bash
ubuntu:~/environment/sample_app (account-activation) $ rails test
Running via Spring preloader in process 8714
Started with run options --seed 55384

"Lana Kane"===============================================================                                   ] 65% Time: 00:00:01,  ETA: 00:00:01
  46/46: [==================================================================================================] 100% Time: 00:00:01, Time: 00:00:01

Finished in 1.67290s
46 tests, 202 assertions, 0 failures, 0 errors, 0 skips
```

とテストデータのlanaがelse以下を実行していることが分かりました。

## redirectのテスト方法
演習11.3.3.3の2つ目のテストは、showページのテストが見当たらなかったので、testを一つ追加します。

検証項目は、acrivatedでないユーザーで /users/:idを表示するとrootのページにリダイレクトすることです。

```ruby:test/integration/users_index_test.rb  
test "don't show user if not activated " do
      get user_path(@non_activated)
      follow_redirect!
      assert_template 'static_pages/home'
  end
```

ネットの他の方の解答では、redirectした結果を、assert_redirected で検証していました。

```ruby:test/integration/users_index_test.rb
    get user_path(@non_activated)
    assert_redirected_to root_url
```

なるほど、こちらの方が何をテストしたいのか、今回の場合でいうとredirectしたかが明確になると感じました。

この演習で感じたのですが、何をテストするのかを詳細化してどこかに書いておかないと、後でtestのプログラムだけを見ても分からなくなるなと感じました。書く場所はtestにコメントで書いておくのが一番よいと思います。
自動判定プログラムー状態遷移図を用いた判定アルゴリズム－午後

平成31年春期 午後問題3

ファイル：2019h31h_ap_pm_qs.pdf

１、状態遷移について、（１）、（２）に答えよ
（１）鮭定食、野菜サラダ、ゴマドレッシング、みそ汁の順番で注文が入った場合の状態遷移について、図２の状態番号を使って遷移する順を答えよ。

状態遷移番号順については、図２だけは不十分ですね、表１も参照するのは必要です。
１）、イベントコードを整理する：
０　→　鮭定食（１１０）→野菜サラダ（２１２）→ゴマドレッシング（４０２）→みそ汁（３１０）

２）、図２を参照して、
０　→　２　→　３　→　４　→　５　が答えですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/c2e71db0-4542-bfdb-b1ab-7cbaa9c3514b.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/d54d5f7e-2ced-7ba4-fd8b-2d232a2c215d.png)


２、表２中のア、イに入れる適切な字句を答えよ。
図２を参照するのも必要ですね。

アは、状態３では、発券可否とのことですね、
図２により、３は発券不可ので、falseです。

イは、状態４から、イベントコード２１２に遷移するの結果のことですね。
図２により、状態３に遷移するよね。サイド１とサイド２だけ割引が可能ので、「３：０」が答えですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/3745ae68-1c74-a5b9-4354-00034e756f6b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/c2e71db0-4542-bfdb-b1ab-7cbaa9c3514b.png)

３、プログラム

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/d414a128-8e92-b90a-d82d-95eda20e1167.png)

ウはorder[i].A　ですね。
エは、表３には、「N,S,O、Aが整数である」との説明があるので、
order[i].N ✖ 100　＋　order[i].S ✖ 10　＋　order[i].O ✖ 1　で計算されますね。

仮に、整数ではない場合、例え、文字列とすると、
order[i].N　＋　order[i].S　＋　order[i].O　になりますね。

オは、discountであるので、変数status_table[stat][ev]から取得しますね。
ただ、注意点は、evは関数get_event_index()で取得する値また固定値ACCEPT_INDEXので、
status_table[status][event_index].discountですね。

カは、オを参照して、
status_table[status][event_index].statusですね。

キは、acceptedがtrueに等しい　ですね。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/1982a896-d407-dbe1-f8a6-d19f8c13ec87.png)


４、図４の判定プログラムについて、プログラムに変更を加えず、表１，２の内容を変更するだけで対応できる要件を回答群の中から二つ選ぶ。
ここで、表１，２の内容について、業務運用中の変更は行わないものとする。

ポイントは、
・プログラムを変更しない
・表１，２の内容だけを変更
・二つを選ぶ
・表１，２の内容について、業務運用中の変更は行わない

つまり、業務外時間で設定して、そのまま運用で対応できる選択肢ですね。
アは、時間帯判定は、既存PGMはできないですね。✖

イは、表１に、つゆの量を追加する、オプションだから、分類名「４、オプション」に追加するだろう。表２に、カラム（イベントコード）を追加して、遷移状態を追加したらよいですね。PGM修正は発生しません。

ウは、値引きが食券の購入ごとに１回だけ適用されるので、複数個ずつ注文でも、値引きも１回だけ適用するよね。ルールはこういうルールだけど、内部でどうやるのは分からないです。PGMからみると、サイド１→サイド２順で注文すると、50値引き適用するよね。複数セットでサイト１，２を注文すると、もちろん、複数適用だろう。でもルール違反ですね。

オは、表１に普通に追加、表２は、特盛にE:0に設定すればよいですね。

なので、エ、オは正しいですね。
ウはちょっと謎です、まあ、試験中、こんなものを選ばない方が良いだろうね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/b3a1cfc3-c407-4841-4198-91793de0d460.png)
Rails Tutorial 第11章 @userとuserの違いに気が付かなかった

演習だけでなく、本文のコードを実行するときにもつまずきました。
リスト 11.32でエラーになり、自分のコードと本文のコードで@userとuser
が違っています。
過去の演習9.3.1.1で変更した点が、11章では変更されていないと気が付きました。

演習9.3.1.1
sessions_controller.rb　のcreateの中で変更しています。
変更前　user
変更後　@user

11章のリスト 11.32では
sessions_controller.rb　のcreateの中で、
user　と変更前に戻っています。

なので自分のコードに11章の変更部分だけを追記するとエラーになることが分かりました。

 ```ruby:sessions_controller.rb　エラー
    if user.activated?
        log_in user
        params[:session][:remember_me] == '1' ? remember(user) : forget(user)
        redirect_back_or user
 ```

 ```ruby:sessions_controller.rb　修正後
     if @user.activated?
        log_in @user
        params[:session][:remember_me] == "1" ? remember(@user) : forget(@user)
        redirect_back_or @user
 ```

ネットの他の方2名を調べたら、私の修正後と同様に、@userに変更していました。特にこの件は書いてなかったので、この点につまづく人は少ないのかもしれません。
CSSで数学の凹凸まで含めた増減表の矢印書いてみた．

初心者CSS使いです．

ネットではAKRという名前をよく使っていて，本業は予備校講師で，[おいしい数学](https://hiraocafe.com) という，月間10万PV程の高校数学のサイトを運営しています．

さて，web上で高校数学の内容について書くときに，数学Ⅲの凹凸まで含めた増減表を書くことがあるかもしれません．

Unicodeでこれらの矢印を探すと

&#x2934;

&#x2935;

&#x2937;

は見当たりますが，何故か単調増加かつ上に凸の矢印がありません！

しかもこれらは環境依存なので，あまりかっこよくない矢印に見える可能性があります．

そこでCSSで，これらの矢印を4つ，作ってみました．

```arrow.css

.arrow-pp::before, .arrow-pp::after, .arrow-pm::before, .arrow-pm::after, .arrow-mp::before, .arrow-mp::after, .arrow-mm::before, .arrow-mm::after {
    content: "";
    position: absolute;
    margin: auto;
}
.arrow-pp {
    left: 3px;
    box-sizing: border-box;
    border: 1px solid transparent;
    border-right: 1px solid #000;
    border-bottom: 1px solid #000;
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
    display: inline-block;
    width: 14px;
    height: 14px;
    border-radius: 0 0 100% 0;
    background: #fff;
}
.arrow-pp::after {
    left: 11px;
    top: -4px;
    width: 0;
    height: 0;
    border-style: solid;
    border-width: 0 2px 5px 2px;
    border-color: transparent transparent #000 transparent;
    transform: rotate(9deg);
}
.arrow-pm {
    left: 3px;
    box-sizing: border-box;
    border: 1px solid transparent;
    border-left: 1px solid #000;
    border-top: 1px solid #000;
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
    display: inline-block;
    width: 14px;
    height: 14px;
    border-radius: 100% 0 0 0;
    background: #fff;
}
.arrow-pm::after {
    left: 12px;
    top: -3px;
    width: 0;
    height: 0;
    border-style: solid;
    border-width: 0 2px 5px 2px;
    border-color: transparent transparent #000 transparent;
    transform: rotate(87deg);
}
.arrow-mp {
    left: 3px;
    box-sizing: border-box;
    border: 1px solid transparent;
    border-bottom: 1px solid #000;
    border-left: 1px solid #000;
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
    display: inline-block;
    width: 14px;
    height: 14px;
    border-radius: 0 0 0 100%;
    background: #fff;
}
.arrow-mp::after {
    left: 12px;
    top: 10px;
    width: 0;
    height: 0;
    border-style: solid;
    border-width: 0 2px 5px 2px;
    border-color: transparent transparent #000 transparent;
    transform: rotate(91deg);
}
.arrow-mm {
    left: 3px;
    box-sizing: border-box;
    border: 1px solid transparent;
    border-right: 1px solid #000;
    border-top: 1px solid #000;
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
    display: inline-block;
    width: 14px;
    height: 14px;
    border-radius: 0 100% 0 0;
    background: #fff;
}
.arrow-mm::after {
    left: 11px;
    top: 10px;
    width: 0;
    height: 0;
    border-style: solid;
    border-width: 0 2px 5px 2px;
    border-color: transparent transparent #000 transparent;
    transform: rotate(165deg);
}

```

基本的にはborder-radiusを丸めたい箇所を100%にして四分円を作ります．
borderで枠線を作り，backgroundで白くすれば，四分円の弧ができます．

後は擬似要素を駆使して，二等辺三角形を後で付け足してあげればそれで終わりです．

意外と簡単に終わりました．

完成した矢印は弊サイトの [凹凸まで含めた増減表とグラフの書き方](https://hiraocafe.com/note/outotsu-graph.html) をご覧くださいませ．
aptでlibssl1.0-devをインストールするとrosが削除された

##概要
もともとrosが入っていたubuntu18.04のPCにnodejsをインストールしたくて、libssl1.0-devが必要と言われたので、以下のコマンドをうったらros関連を大量にremoveされた。

```
apt install libssl1.0-dev

Start-Date: 2020-08-06  11:19:07
Commandline: apt install libssl1.0-dev
Requested-By: solitude_under_the_blue_sky (1000)
Install: libcurl4-gnutls-dev:amd64 (7.58.0-2ubuntu3.9, automatic),
 libssl1.0-dev:amd64 (1.0.2n-1ubuntu5.3)
Remove: ros-melodic-image-proc:amd64 (1.15.0-1bionic.20200530.124945),
 ros-melodic-rviz-visual-tools:amd64 (3.8.0-4bionic.20200624.182713),
 ros-melodic-qt-gui-cpp:amd64 (0.4.1-1bionic.20200613.044041),
 ros-melodic-turtlebot3-slam-dbgsym:amd64 (1.2.2-1bionic.20200530.121003),
 ros-melodic-moveit-planners-chomp:amd64 (1.0.4-1bionic.20200630.153721),
 ros-melodic-diff-drive-controller:amd64 (0.17.0-1bionic.20200530.114114),
 ros-melodic-common-tutorials:amd64 (0.1.11-0bionic.20200530.090435),
 ros-melodic-rosmsg:amd64 (1.14.6-1bionic.20200530.031608),
 etc....
```
nodejsで行う作業が一旦終わって、元の環境に戻したいので、手順のメモ。

##初期状態
aptの**history.log**から、上記のようにコマンドを打った際にremoveされたものの一覧を取得し、テキストエディタに貼り付ける。以下の通り。

```
Remove: ros-melodic-image-proc:amd64 (1.15.0-1bionic.20200530.124945), ros-melodic-rviz-visual-tools:amd64 (3.8.0-4bionic.20200624.182713), ros-melodic-qt-gui-cpp:amd64 (0.4.1-1bionic.20200613.044041), ros-melodic-turtlebot3-slam-dbgsym:amd64 (1.2.2-1bionic.20200530.121003),
```

あとで**apt install**する用にプログラムを整理する。
まず、コンマスペースを全て改行に置換。
スペースはLinuxでは**\s**。
ラインフィードは**\n**。

- [find]        ,\s
- [replace]      \n

するとこうなる

```
Remove: ros-melodic-image-proc:amd64 (1.15.0-1bionic.20200530.124945)
ros-melodic-rviz-visual-tools:amd64 (3.8.0-4bionic.20200624.182713)
ros-melodic-qt-gui-cpp:amd64 (0.4.1-1bionic.20200613.044041)
ros-melodic-turtlebot3-slam-dbgsym:amd64 (1.2.2-1bionic.20200530.121003)
```

カッコで囲まれた部分はaptで認識されないので、これも正規表現で消去
replaceに何も書かなければ消去される。

- [find]        \\(.*\\)
- [replace]

結果がこちら。

```
Remove: ros-melodic-image-proc:amd64 
ros-melodic-rviz-visual-tools:amd64 
ros-melodic-qt-gui-cpp:amd64 
ros-melodic-turtlebot3-slam-dbgsym:amd64 
```

あとは「Remove:」を消す。「:amd64」はあってもなくても良いが、一応以下のようにして消した。

- [find]     :amd64
- [replace]

最終的には以下のようになる。

```
ros-melodic-image-proc 
ros-melodic-rviz-visual-tools 
ros-melodic-qt-gui-cpp 
ros-melodic-turtlebot3-slam-dbgsym 
```

これを、**history_fix.log**として保存。

その後、history_fix.logが存在するディレクトリで
以下のように端末からapt installを実行。

```
cat history_fix.log | xargs sudo apt install -y
```

とりあえず、aptだけはこれでOK。しかしバージョンとかは元のやつが入らないので
コンパイルして動くやつは結局全部コンパイルし直し。

2020年８月15日　お盆のためか、交通量が少ない。
Rails Tutorial 第11章 activated?メソッドは自動で作ってくれる

##タイプミスでつまずく アンダースコアとピリオド

11.3で実行したところ、

```bash
undefined method `user_activated?' for #<AccountActivationsController:0x00007f1dba428b08> Did you mean? user_path
```

で単純なタイプミス、アンダースコアとピリオドを間違えました。
誤:user_activated?
正:user.activated?

そのときにactivated?というメソッドをどこで作ったのだろうかとしばらくあちこち探しました。

authenticated?というメソッドは作ったのでどこかで作ったのを忘れているのだろうと思っていました。

その答えは、modelに追加するときにactivatedをbooleanで作ったので、自動的に論地値を返すactivated?メソッドも使えるようになっていました。

チュートリアルの少し前を見返したら11.1.2にちゃんと書いてありました。
>続いて、activated属性を追加して論理値を取るようにします。これで、10.4.1で説明した自動生成の論理値メソッドと同じような感じで、ユーザーが有効であるかどうかをテストできるようになります。

##log_in_asメソッドがなぜか2個ある

デバッグしている途中で、log_in_asの定義が2個あることに気が付きました。
9章のリスト 9.24:で

>メソッド名は同じlog_in_asですが、今回は統合テストで扱うヘルパーなのでActionDispatch::IntegrationTestクラスの中で定義します。

とありました。
ところがActionDispatch::IntegrationTestの1行追加するのを忘れていたことに気が付きました。これまでなぜかうまく動いていました。



```ruby:test/test_helper.rb　正
class ActiveSupport::TestCase
..
  def log_in_as(user)
..
  end
..
end

class ActionDispatch::IntegrationTest

  def log_in_as(user, password: 'password', remember_me: '1')
  ...
  end
end
```

```ruby:test/test_helper.rb　誤
test/test_helper.rb
class ActiveSupport::TestCase
..
  def log_in_as(user)
..  end
  
  def log_in_as(user, password: 'password', remember_me: '1')
.. end
  
end
```
動きを付けました。個人アプリ

# メソッド
## hide
非表示にする事ができます。
## fadeIn(1000)
HTML要素をゆっくり時間をかけて表示させる事ができる
()には1000で１秒かけながら表示される、。
## hover
カーソルが乗った時に発火します
![スクリーンショット 2020-08-15 11.13.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/4859a8fc-afb6-f349-dcd8-a925f0b74b58.png)
pip install --user でインストールしたパッケージが見つからない？

Windows での Python の話。

私は Node.js のアプリを書いて AWS にデプロイしてる人なので、 Python はメインで使ってるわけではありません。が、 awscli やら node-gyp やら、裏で Python につながってる人たちとは深いお付き合いにならざるを得ないので、仕方なく Python とも付き合ってます(笑)。 CloudFormation テンプレートのチェックをしようと cfn-lint を pip install --user しようとしたら…あれ、認識しない。

どうもこれ、 Python 公式の [Windows で Python を使う](https://docs.python.org/ja/3/using/windows.html) の記述に従って普通に Python をインストールしただけだと、登録される PATH が1個足りないみたいです。それは

```
C:\Users\[username]\AppData\Roaming\Python\Python38\Scripts\
```

すでに [バグとして報告](https://bugs.python.org/issue39658) されてました。仕方ないので、自分で足しました。

余談) Udemy で Python の勉強でもしようかとつらつら見てますが、 Anaconda にはいろいろ環境壊されて痛い目に遭ったので(awscli が動かなくなるとか私にとっては死活問題)、できれば使いたくないなー。
[SwiftUI]actionやalertを２つ連続して使うときのハマりどころ

SwiftUIで`.action`や`.sheet`を使うときに、ハマってしまって時間を浪費してしまいました。その解決策のメモです。

## どのような問題か

下記のように`.alert`を２つつなげた場合、後のalertしか表示されませんでした。

```swift
struct ContentView: View {
    
    @State var presentAlert1: Bool = false
    @State var presentAlert2: Bool = false
    
    var body: some View {
        VStack(spacing: 32) {
            Button.init("アラート１") {
                self.presentAlert1.toggle()
            }
            Button.init("アラート２") {
                self.presentAlert2.toggle()
            }
        }
        .alert(isPresented: $presentAlert1) {
            Alert.init(title: Text("アラート１"))
        }
        .alert(isPresented: $presentAlert2) {
            Alert.init(title: Text("アラート２"))
        }
    }
}
```

また、下記の場合も１つ目のalertが表示されませんでした。

```swift
struct ContentView: View {
    
    @State var presentAlert1: Bool = false
    @State var presentAlert2: Bool = false
    
    var body: some View {
        VStack(spacing: 32) {
            Button.init("アラート１") {
                self.presentAlert1.toggle()
            }
            .alert(isPresented: $presentAlert1) {
                Alert.init(title: Text("アラート１"))
            }
            Button.init("アラート２") {
                self.presentAlert2.toggle()
            }
        }
        .alert(isPresented: $presentAlert2) {
            Alert.init(title: Text("アラート２"))
        }
    }
}
```

## 解決方法

以下のように、それぞれのButtonにalert（またはsheet）をつけます。

```swift
struct ContentView: View {
    
    @State var presentAlert1: Bool = false
    @State var presentAlert2: Bool = false
    
    var body: some View {
        VStack(spacing: 32) {
            Button.init("アラート１") {
                self.presentAlert1.toggle()
            }
            .alert(isPresented: $presentAlert1) {
                Alert.init(title: Text("アラート１"))
            }
            Button.init("アラート２") {
                self.presentAlert2.toggle()
            }
            .alert(isPresented: $presentAlert2) {
                Alert.init(title: Text("アラート２"))
            }
        }
    }
}
```

## まとめ

- 連続してalertを書くことはできない（sheetも同様）
- 親Viewにalertがある場合、子Viewにalert（もしくはsheet）を書くことができない
Nature RemoのAPI clientを作ってみた

#はじめに
最近、Nature Remoを使い始めて便利だなーと感じたので、Nature RemoのAPI Clientの[nature_remo_api](https://github.com/keita-hino/nature_remo_api)というgemを作ってみました。gemを作るのは初めてなので、こうした方がもっと使いやすくなるなどあれば、コメントいただけると嬉しいです。

#Nature Remoとは
公式から抜粋すると、
>エアコンやテレビなどの家電をスマホで操作できるスマートリモコン

とのこと。

これまでは家電ごとにリモコンを管理する必要がありましたが、Nature Remoを使うとスマホだけで完結出来るようになります。最近は家電自体がインターネットに繋がっているものも増えていますが、個人的にNature Remoは**既存の家電を擬似的にインターネットに接続できるようにアップデートできるガジェット**だと思っています。使い方などの詳細については、[公式サイト](https://nature.global/)を参照ください。

#今回作ったgem
rubygemsの方ではこちらになります！
（gemを作るのが初めてだったので、このページに載ったとき感動しました・・笑）
https://rubygems.org/gems/nature_remo_api

##nature_remo_apiの使い方
※実装途中なので、随時更新していきます！

###前準備
####アクセストークンを取得
まずは[こちらのページ](https://developer.nature.global/)からアクセストークンを取得してください。
（OAuth2の説明の中にアクセストークンを取得するページへのリンクがあります）

####アクセストークンを環境変数に設定
環境変数を設定

```bash
echo 'export NATURE_REMO_ACCESS_TOKEN="取得したトークンを設定"' >> ~/.bash_profile
```

環境変数を反映

```bash
source ~/.bash_profile
```

####初期化

```ruby
NatureRemoApi::Client.configure do | config |
  config.access_token = ENV['NATURE_REMO_ACCESS_TOKEN']
end

client = NatureRemoApi::Client.new
```

###ユーザー情報を取得
```ruby
client.user_me
```
[使用しているAPI](https://swagger.nature.global/#/default/get_1_users_me)

###ユーザー情報を更新
```ruby
client.update_user_me(nickname: <nickname>)
```
[使用しているAPI](https://swagger.nature.global/#/default/post_1_users_me)

###Nature Remo本体の一覧を取得
```ruby
client.devices
```
[使用しているAPI](https://swagger.nature.global/#/default/get_1_devices)

###Nature Remo本体の情報を更新
```ruby
client.update_device(device_id: <device_id>, name: <name>)
```
[使用しているAPI](https://swagger.nature.global/#/default/post_1_devices__device_)


###家電の一覧を取得
```ruby
client.appliances
```
[使用しているAPI](https://swagger.nature.global/#/default/get_1_appliances)

###家電に設定されている信号の一覧を取得
```ruby
client.signals(appliance_id: <appliance_id>)
```
[使用しているAPI](https://swagger.nature.global/#/default/get_1_appliances__appliance__signals)

###信号を送信
```ruby
client.send_signal(signal_id: <signal_id>)
```
[使用しているAPI](https://swagger.nature.global/#/default/post_1_signals__signal__send)

#終わりに
まだ開発途中なので、今後もサポートするAPIを増やしていきたいと思います！
【Blender】  2.82で雨を降らせる方法【簡易版】

# 動作環境
本記事の動作環境は以下の通りです。
 
| 項目             |               環境 |
|:-----------------|:------------------|
| OS               |         Windows 10 | 
| Blender          |               2.82 |

#できるもの
以下のような雨。マテリアル設定を変えたり、背景をつければもっと3Dっぽくなる。

![rain_simple.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/e5cab0a6-4b6a-fd5c-da23-573c0c14dda8.gif)


#ワークフロー

雨を降らすためにパーティクルシステムを使用する。
ワークフローは以下のとおり。

1. パーティクルを放出するメッシュオブジェクトを作成
1. パーティクルシステムを設定
1. パーティクルで放出するオブジェクトを作成
1. パーティクルシステムにオブジェクトを設定

# パーティクルシステムとは

メッシュオブジェクトからアイテムを放出してくれるシステム。

![particle.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/b63b05ee-f13c-cfbf-affe-b7d90c0ae3c1.gif)


# パーティクルを放出するメッシュオブジェクトを作成

shift + a でメッシュ>平面を追加

# パーティクルシステムを設定

追加したメッシュオブジェクトにパーティクルプロパティからパーティクルシステムを追加。
![rain_setting_0.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/53f638d9-8653-5479-90c5-73302105569b.png)


# パーティクルで放出するオブジェクトを作成

今回は以下の手順で雨粒を作成。

1. shift + a >メッシュ > ico球でいこｓぺれを追加
1. 雨粒型に整形(プロポーショナル編集を使用して一括編集)
    ![raindrop_0.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/ae9799d6-e8fe-4791-1190-5f6217fbca1f.png)



1. マテリアルを割り当て(プリンシプルBSDFで設定は以下の通り)
    - 粗さ：0
    - IOR：1.333 ※水の屈折率
    - 伝播：0.8
    - 放射：濃いめのグレー(任意)
    - アルファ：0.7(任意)
    - 設定：アルファハッシュ(任意)
  
 <img width="400" alt="raindrop_1.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/581c0c7d-2302-340c-b20c-59a3620f4cf6.png"> &emsp; &emsp; <img width="350" alt="raindrop_2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/a576d988-d4b7-0ab6-fc70-98c3b156d943.png">



   
背景が暗い場合に放射以下の設定をするとレンダリングしたときに雨粒が見やすい。
今回は採用。

# パーティクルシステムにオブジェクトを設定

以下の手順でパーティクルシステムにオブジェクトを設定。

1. パーティクルプロパティ>レンダー>レンダリング方法をオブジェクトに設定
1. インスタンスオブジェクトに作成したオブジェクトを設定
1. 適宜オブジェクトのサイズやランダム化を変更

![rain_setting_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/81563580-d452-dc12-acd2-f7be320684f7.png)


また、必要に応じて放射の項目を変更する。

![rain_setting_2 .PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/84d1d9cc-eee3-f73d-81fa-75cb9f953c3c.png)



完成！


# +αの設定項目

初速度とかの設定
![rain_setting_alpha.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/663d6401-599e-8f26-13de-ce52039c9c82.png)

重力とかの設定
![rain_setting_alpha2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682933/a894ad23-f83a-c6a3-f164-571ee9a226b1.png)




# 参考サイト

以下、パーティクルに関するBlender 2.8の公式サイト

[https://docs.blender.org/manual/ja/2.82/physics/particles/index.html](https://docs.blender.org/manual/ja/2.82/physics/particles/index.html)

# あとがき
雨の作り方の備忘録として。
Rails Tutorial　第11章 mailerのhostの設定でつまづきました

リスト11.16で

>ホスト名 'example.com' の部分は、各自のdevelopment環境に合わせて変更してください。例えば、筆者はクラウドIDEを使っているので、このような設定になります。

```ruby:config/environments/development.rb
host = 'rails-tutorial-mhartl.c9users.io'     # クラウドIDE
```

に何を入れるのかが分かりませんでした。
クラウドIDEの画面のURL欄は　c9users.io では終わらないです。
rails serverコマンドで立ち上げたテストできる画面のURLも同様です。

ネットの他の方が何を入れているのか調べました。書いていない方が多く、見つけられたのは

```ruby:config/environments/development.rb
 host = 'us-east-2.console.aws.amazon.com'
```

でした。私のクラウドIDEの画面も同じだったので、これでテストしてみます。

>指定のURLでアカウント有効化メールをプレビューできるようになります

を試しました。URL欄に手打ちで

```http
https://us-east-2.console.aws.amazon.com/rails/mailers/user_mailer/account_activation
```

を打ち込んだところ、エラーでした。

```http
The page you tried was not found.
```

ネットの先ほどの方は、URL欄に打ち込んだURLが違っていました。
rails serverコマンドで立ち上げたWeb画面のURLの後ろになっています。

```http
https://7eca7b943bｘｘｘｘｘｘｘd7ceb9db2.vfs.cloud9.us-east-2.amazonaws.com/rails/mailers/user_mailer/account_activation
```

試してみたところ、動きました。
テキストメール版を表示させてみたところ、クリックするURLのホスト部分が間違っています。

```http
https://us-east-2.console.aws.amazon.com//account_activations/v6zlCS9psVXoaLX4aK3l0A/edit?email=example%40railstutorial.org
```

先ほど設定したhostはどうもここに表示されているようです。なので修正します。

```ruby:config/environments/development.rb 
host = 'https://7eca7b943bｘｘｘｘｘｘｘd7ceb9db2.vfs.cloud9.us-east-2.amazonaws.com'
```

テキストメール版を表示させてみたところ、クリックするURLのホスト部分が直りました。

```bash
https://7eca7b943bｘｘｘｘｘｘｘd7ceb9db2.vfs.cloud9.us-east-2.amazonaws.com/account_activations/x9GffLXhIyGj9W0CQdCBRA/edit?email=example%40railstutorial.org
```
一からコンピュータを作る ~順序回路~


3章の備忘録です。
以下記事が参考になります。
[コンピュータシステムの理論と実装3](https://www.slideshare.net/YokoyamaShuhei/3-171351725)
[コンピュータサイエンス入門 第８回](https://z3.mugendai.do-johodai.ac.jp/support/hata/wp-content/uploads/2014/09/Con_2014-081.pdf)

## 順序回路
時間が経過してもデータを記憶させておく仕組みを実現する回路です。
2章で行なった組合わせ回路は、入力の組み合わせで値が確定するので、多くの処理が可能となります。
しかし、**値を保持することができません。**
そこで順序回路の出番ということになります。

### フリップフロップ(D型: DFF)
この実装により、「前に思い出したものを思い出す」、つまり記憶装置を作ることが可能になります。
**順序回路はこのDFFの組み合わせで構成されています。**

式としては、`out(t) = in(t-1)` を実現することができます。

### レジスタ
データを格納したり、呼び出したりすることが可能な記憶装置です。
loadが１の場合、読み込み、loadが0の場合、値の保持を行います。

式としては、`out(t) = out(t-1)` を実現することができます。


#### 1ビットレジスタ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148392/ad2bcff7-010b-b935-c8b6-e26fa74b72e6.png)

load は上書きの有無を表します。

```
CHIP Bit {
    IN in, load;
    OUT out;

    PARTS:
        Mux(a=fb, b=in, sel=load, out=w1);
        DFF(in=w1, out=out, out=fb);
}
```

#### w ビットレジスタ
1ビットレジスタを重ねていくことで構築することが可能です。
また**幅(width)**とは、保持すべきビットの数をさします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148392/1e7fbaf3-24ab-2798-e27a-c0092b61190d.png)

### RAM(Random Access Memory)
データ入力、アドレス入力、ロードビットの3つを入力として受け取ります。

```
CHIP RAM8 {
    IN in[16], load, address[3];
    OUT out[16];

    PARTS:
        DMux8Way(in=load, sel=address, a=a, b=b, c=c, d=d, e=e, f=f, g=g, h=h);
        Register(in=in, load=a, out=out1);
        Register(in=in, load=b, out=out2);
        Register(in=in, load=c, out=out3);
        Register(in=in, load=d, out=out4);
        Register(in=in, load=e, out=out5);
        Register(in=in, load=f, out=out6);
        Register(in=in, load=g, out=out7);
        Register(in=in, load=h, out=out8);
        Mux8Way16(a=out1, b=out2, c=out3, d=out4, e=out5, f=out6, g=out7, h=out8, sel=address, out=out);
}
```



#### RAM、ROM 違い
**RAM　→　Read, Write ができるメモリ
ROM　→　Readだけができるメモリ**


[RAMとROMの違い - 日本パソコンインストラクター養成協会](https://pc.jpita.jp/index.php?20170601#:~:text=%E9%96%93%E9%81%95%E3%81%84%E3%82%84%E3%81%99%E3%81%84%E3%81%AE%E3%81%8CRAM,%E3%81%A7%E3%81%8D%E3%82%8B%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%BC%E3%81%AE%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%80%82&text=ROM(%E3%83%AD%E3%83%A0)%E3%81%AF%E3%80%8CRead,%E3%82%AA%E3%83%B3%E3%83%AA%E3%83%BC%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%BC%E3%80%8D%E3%81%AE%E7%95%A5%E3%81%A7%E3%81%99%E3%80%82)
[知らないと恥ずかしい？　メモリの「RAM」と「ROM」の違い](https://www.gsic.titech.ac.jp/matsuda/l/CS/arch/index.htm)


#### 全体像
メモリの中にRAMが存在し、
RAMの中にw ビットレジスタが存在し、
w ビットレジスタの中に1ビットレジスタが存在し、
1ビットレジスタの中にDFFが存在するという構成だと理解しています。
**俯瞰的に見ると、メモリの中身を作っていることになると思います。**

メモリとRAMはほぼイコールなのかな？。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148392/3d910115-acb5-035b-1f21-e03d43700453.png)
tcpdump でどのポートを使おうとしてるのか調べるための自分用メモ

※あくまで自分用メモです。tcpdump の便利な使い方を記したページは Qiita 内外のいろんなところに転がってますので、そちらを見てください。

RHEL7 なサーバで、FW の向こう側にいるストレージに対して NFS マウントしたい。FW なので穴あけの申請をしかるべき部署にしないといけないけど、どのポート使おうとしてるんだかわからない(…なんでそんな状況になるんだ？なんて訊かないでください、私も困ってるんです(笑))。という時に、頼りになるのはやはり、tcpdump。

私のシチュエーションでは、これで十分でした。

```bash
sudo tcpdump -i (インタフェース名) -nn -X host (相手のIPアドレス)
```

- `-i (インタフェース名)` を付けないといけないのは、付けずに実行すると `tcpdump: NFLOG link-layer type filtering not implemented` とかなんとか言われて蹴られるから。NFLOG なんてインタフェースは知りませんけど、この環境ではそれがデフォルトのインタフェースということなので、使われるはずのインタフェースを明示的に指定してやらないといけない。どのインタフェースが使われるか？…それは `ifconfig` や `netstat -r` で調べましょう。
- `-nn` はホスト名やポート番号を(名前解決せずに)数字のまま表示させるオプション。変に名前解決されるとかえってわかりづらいので、数字は数字のままが一番。
- `-X` はパケットの内容を16進とASCIIで表示するオプション。 [あまり使わない](https://qiita.com/ngyuki/items/969d1efaddb68acb5313) とおっしゃる方もいますが、私はASCIIも表示されてるほうが落ち着きます。
- `host ～` 以下はフィルタするための式ですが、最初からむやみに絞ると欲しい情報を取りこぼすおそれも。私のシチュエーションでは、「相手のIPアドレスはわかっていて、どのポートに送信しようとしているかがわからない(もしくは、どのポートに送ったパケットへの応答が返ってこないかがわからない)」という状況だったので、 `host` だけ指定すればいいや…でした。

cf) [【備忘録】centOS7 で tcpdump する](http://nanshiki.hatenablog.com/entry/2018/02/01/090055) … NFLOG の謎エラーの悩みを、ここを見て解決できました。
jQueryでスクロール終了後に一度だけ処理を実行する

題名の通りです。

```js
let id = false;//初期値

$(window).on("scroll touchmove",function(){
  console.log("スクロール発生");//・・・①

  if(id) clearTimeout(id);//・・・②

　//2秒後に実行
  id = setTimeout(function(){//・・・③
  	console.log("2秒後経過したので実行");//・・・④
  },2000);

});
```

##処理の流れ
1. idの初期値をfalseに設定
2. スクロールを検知したら①を実行
3. idはまだfalseなので②は実行されない
4. ③が実行（2秒後に実行されるタイマーがセットされると同時に、idにNumber型の整数値が代入される）
5. 2秒経過しないうちにスクロールが発生した場合、①が実行→idはfalseではないので②が実行
6. ③が実行・・・2秒後に実行されるタイマーがセットされる→idにNumber型の整数値が代入される
7. 2秒経過するまでスクロールが発生しなければ、④が出力

##なぜclearTimeoutするのか？
###スクロールするたびにsetTimeoutのイベントが登録され、実行されてしまうから
clearTimeoutがない場合のコードは以下のようになります。

```js
let id = false;
$(window).on("scroll touchmove",function(){
 console.log("スクロール発生");
/*if(id) {
  console.log('aaa');
  clearTimeout(id);
  } */
  id = setTimeout(function(){
  	console.log("タイマー終了後");//・・・④
  },2000);
});
```
例えば、ちょっとスクロールしただけも以下のように④が6回も実行されてしまいます。
![スクリーンショット 2020-08-15 10.28.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692339/18e31a0b-3f51-f65e-e4dd-e000cf91d1a1.png)

これはあまりよくないので、clearTimeourでタイマーをリセットしてあげなければいけないということです。
iconファイルを作れない環境でNotifyiconを使いたいときの忘備録

Visual Studioもない、ネットにも繋がらない、windowsの標準アプリしかない、そんな環境でちょっとしたデスクトップアプリをC#で作りたいとき。

###デフォルトのwindows10だとiconファイルが作れない
ペイントだとiconファイルで保存できないので、Notifyiconを表示できない事象が発生。

[Windows10でアイコンファイルを作成する方法](https://toolmania.info/post-10389/ "Windows10でアイコンファイルを作成する方法")
上記を参考にiconファイル作成



1. ペイントで画像を作成し、32×32の24ビットマップ形式で保存
2. ファイルの拡張子をbmp⇒iconに変更
3. 以下のようにNotifyIconの作成


```form.cs
this.notifyIcon = new NotifyIcon()
{
    Icon = new Icon("作ったアイコン画像.icon"),
    Visible = true,
    Text = "sample"
};
```
エラー発生

```
System.ArgumentException: 'Argument 'picture' must be a picture that can be used as a Icon.'
```

###ビットマップファイルををコード内でiconファイルに変換

ひとまず、拡張子をbmp⇒iconに戻す。

```form.cs
var bitmap = new Bitmap("作ったアイコン画像.bmp");
this.notifyIcon = new NotifyIcon()
{
    Icon = Icon.FromHandle(bitMap.GetHicon()),
    Visible = true,
    Text = "sample"
};
```
タスクトレイに作成したアイコンが表示される。

###まとめ
iconファイルを作れない環境で、Notifyiconを表示することができた。
bmp⇒iconへ変換するツールを作ってもいいかもしれないけど
いちいち変換が面倒なのでbmpでもアイコン表示できるよう対応したほうが楽なのかも。
JavaScriptでProtocol Buffersを使う(protobuf.js)

画面（`JavaScript`）から`Protocol Buffers`を使う機会があったので、メモしておきます。
OSSは、[protobufjs/protobuf.js](https://github.com/protobufjs/protobuf.js "protobufjs/protobuf.js")を利用しました。
https://github.com/protobufjs/protobuf.js

## demo
https://thirosue.github.io/protocol-buffers-javascript-sample/

※ サンプルコード全量
https://github.com/Thirosue/protocol-buffers-javascript-sample

## インターフェイス定義

インターフェース定義は[公式](https://developers.google.com/protocol-buffers "公式")のサンプルを利用します。
この定義は、インターネットで取得できる場所に配置しておきます。

```:person.proto
syntax = "proto3";
package person;

message Person {
  string name = 1;
  uint32 id = 2;
  string email = 3;
}
```

https://github.com/Thirosue/protocol-buffers-javascript-sample/blob/master/person.proto

## CDN

以下から、スクリプトを取得します。
https://www.jsdelivr.com/package/npm/protobufjs

```html
<script src="https://cdn.jsdelivr.net/npm/protobufjs@6.10.1/dist/protobuf.min.js"></script>
```

## サンプルコード

```javascript
      protobuf.load("person.proto", function (err, root) {
        if (err) throw err;

        // インターフェース定義を取得する
        var Person = root.lookupType("person.Person");

        // 設定するデータを定義
        var payload = {
          name: "john doe",
          id: 99,
          email: "test@example.com",
        };

        // データを検証
        var errMsg = Person.verify(payload);
        if (errMsg) throw Error(errMsg);

        // 連携するメッセージを作成する
        var person = Person.create(payload);
        console.log(new TextDecoder().decode(buffer)); // 文字列に変換する
        console.log(btoa(String.fromCharCode(...buffer))); // base64エンコード

        // メッセージを Uint8Array に変換する
        var buffer = Person.encode(person).finish();

        // メッセージをデコードする
        var person = Person.decode(buffer);

        // メッセージをオブジェクトに変換する
        var object = Person.toObject(person, {
          longs: String,
          enums: String,
          bytes: String,
          // see ConversionOptions
        });
      });
```
Git 入門


Git 入門します。

![github_flow_overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/3cb19de6-47be-8b10-2264-61f5c917c408.png)



Dockerを集中特訓した後で、概念が似ていて助かります！


##Clone
リモートリポジトリを複製するには、クローン(Clone)という操作を行います。

```

$ cd ~/Desktop
$ git clone https://github.com/usdatascientist/my-first-repo

```



###branch と verison
Gitでは，それぞれの修正箇所や担当機能ごとにbranchというものを作ります．’枝’です


コードには段階に応じてVerisonがある。

開発途中Version
実際にユーザに使ってもらうVersion
Versionもありますゆる

ある開発者がAという機能を作る時に，今ユーザーが使っているVersionを直接変更したり，
テスト段階のものを変更したら大変なる！

Gitでは，それぞれのVersionをひとまずbranchとして管理する。

![git-branches-merge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/ca945122-78e1-3015-ec31-5d41a0e244fe.png)

基本的には、開発したい機能ごとにbranchを作っていきます．

開発者はbranchを切り替えて適切なbranchの上で作業をします．

このbranchを切り替えることをcheckoutすると言う


## Commit
ファイルやディレクトリの追加・変更を、リポジトリに記録するにはコミットという操作を行います。

（具体的手順）
ローカルリポで新しいbranchを作ってそこでコードを更新して，addしてcommitする

今なんのbranchがあるのか確認する

```
$ cd ~/Desktop/my-first-repo
$ git branch
> * master

```


Gitでは変更は全てコミット(commit)という単位で管理されます．いわゆるセーブポイントみたいなものです．

このcommitは複数の変更をまとめてcommitします．
この「次のcommit対象に入れる行為」をaddすると言いい，
commit対象の変更達をstaging areaとかstagingと言います

![git_staging.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/620ca929-a7f1-be5e-52e0-6dc5147b5064.png)


addする

```
$ git add README.md
$ git status
>On branch update-readme
 Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
```


commitする

```
$ git commit -m 'update read me'
> [update-readme 12bc06e] update read me
  1 file changed, 1 insertion(+), 1 deletion(-)
```

-m  でコミットメッセージを入れる。（このcommitがどういう変更だったのかがわかるようにするためです）


commitの履歴(log)を確認する

```
$ git log
```
VSCode 登録したキーワードを装飾(強調)する自作 Extension の紹介

# 作成したもの

DecorateKeyword

https://marketplace.visualstudio.com/items?itemName=BlueSilverCat.decorate-keyword

![undecorate](https://raw.githubusercontent.com/BlueSilverCat/decorate-keyword/image/image/undecorate.png)

![decorate](https://raw.githubusercontent.com/BlueSilverCat/decorate-keyword/image/image/decorate.png)

予め登録しておいたキーワードを装飾(decorate)するものです。
強調(highlight)と言った方が分かりやすいかもしれませんが、VSCodeの`SetDecorations`APIを使っているのでこの名前にしました。
装飾(decorate)というだけあって色々出来ます。
もっとも、APIに指定されたデータをそのまま渡しているだけです。


# なぜこんなものを作ったのか

テキストファイルではあるが、独自の文法で書かれているファイルを見る機会は皆さんにもあると思います。
例えば、受託開発で請け負ったシステムの入力ファイルや出力ファイルなどです。
このようなファイルを閲覧する場合、開発期間にもよりますが文法ファイルを定義して色付けするのは大変です。
そんな時に手軽に色を付けられるようにしたのがこの拡張機能です。

VSCodeは、柔軟に色を変更出来ます。
そのため、拡張機能など要らないと思うかもしれませんが、現在のバージョンでは、背景色を変更することが出来ません。
個人的には、背景色を変更する為だけにこの拡張機能を作った感じではあります。

# 使い方

まず最初に、`definitionFilePath`にファイルを指定します。
指定すべきファイルはJSONC形式のファイルで以下のようなものです。

```json
[
  {
    "name": "function",
    "regex": "\\bfunction\\b",
    "regexFlag": "g",
    "color": "#ff00ff",
    "backgroundColor": "#ffff00",
    "isWholeLine": true
  },
  {
    "name": "return",
    "regex": "\\breturn\\b",
    "regexFlag": "g",
    "color": "#ff0000",
    "backgroundColor": "#00ffff"
  },
  {
    "name": "blockComment",
    "regex": "/\\*[\\S\\s]+?\\*/",
    "regexFlag": "g",
    "color": "#00ff0055",
    "backgroundColor": "#ff000055"
  },
  {
    "name": "Japanese",
    "regex": "[\\p{scx=Hira}\\p{scx=Kana}\\p{scx=Han}]+",
    "regexFlag": "gu",
    "color": "black",
    "backgroundColor": "black",
    "border": "solid 1px red"
  }
]
```

これを設定した後、 `DecorateKeyword: decorate` コマンドを使うと装飾されます。

`definitionFilePath` を変更した場合(ファイルパスを変更した場合)は、自動検出されますので再度、`DecorateKeyword: decorate`を使えば新しい定義で装飾されます。
一方、ファイルの内容を変更した場合は、自動検出されませんので`DecorateKeyword: read` コマンドでファイルを読み込ませる必要があります。

あとの細かい説明は、怪しい英語ですがREADMEを見てもらうかREADMEのリンクを見ていただければと思います。

# 余談

VS Code の Extensionは、Atom のパッケージと検索・導入方法が違うためにマイナーパッケージは見向きもされないようですね。
そもそも、そんな機能要らんよって話かもしれませんが。
悲しい。
【Blender】中心点が大きくずれた場合の修正方法

# この記事でできること
- インポートした際に、中心点が大きくずれたオブジェクトを、オブジェクトの中心に設定することができます。
![スクリーンショット 2020-08-15 9.58.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/66ff489b-a1eb-1a6d-fd9d-a7746848530c.png)

## 今まで
- オブジェクトをインポートしてみたら原点が大きくずれてるやんけー!!
![スクリーンショット 2020-08-15 9.56.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/26c24d49-a79b-4533-b654-d02dc2259da2.png)

## やり方
- [オブジェクト]-[原点を設定]-**[原点を3Dカーソルへ移動]**を選択する。
![スクリーンショット 2020-08-15 9.57.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/1f4a6c22-3e00-e703-894c-1d6e50b4133d.png)
- みんなにっこり。
![スクリーンショット 2020-08-15 9.58.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/3e0db5c3-1258-386f-57f1-c2384cd8e8f9.png)

# Unityへtinkercadからインポートしたオブジェクトの中心がずれて、もうどうしようもなくなったら、Blenderでやっつけちゃいましょう。
【Rails6】$ rails s でRuntimeError

###概要

環境構築して初のRails sで毎回出るのでメモ
bundleを使ってのrailsの環境構築前提です。

`$ rails s`をすると下記エラーが、、、

```
$ bundle exec rails s
=> Booting Puma
=> Rails 6.0.3.2 application starting in development 
=> Run `rails server --help` for more startup options
Exiting
Traceback (most recent call last)

.....

.....

Webpacker configuration file not found /Users/hoge_app/config/webpacker.yml. 
Please run rails webpacker:install 
Error: No such file or directory @ rb_sysopen - /Users/hoge_app/config/webpacker.yml (RuntimeError)
```

###解決策

エラー文の中に`Please run rails webpacker:install`と書いておりますので、その通り実行するだけです！

```
$ bundle exec rails webpacker:install
```
これでOKです！
入力フォームの文字の色を変える方法

##完成版

![スクリーンショット 2020-08-15 9.54.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613591/c8e4ce5f-4aab-3453-4f21-0cca497b9a9b.png)

## 作成
使用環境：　HTML5 Bootstrap4

```html:index.html

　　　<!--文字変更ボタン-->
    <button onclick="document.execCommand('bold');">太字</button>
    <button onclick="document.execCommand('italic');">斜め文字</button>
    <button onclick="document.execCommand('formatBlock', false, '<h1>')">h1</button>
    <button onclick="document.execCommand('formatBlock',false, '<p>')">p</button>

    <!--色変更ボタン-->
    <button onclick="document.execCommand('foreColor', false, 'red');">赤</button>
    <button onclick="document.execCommand('foreColor', false, 'blue');">青</button>
    <button onclick="document.execCommand('foreColor', false, 'yellow');">黄色</button>
    <button onclick="document.execCommand('foreColor', false, 'green');">緑</button>
    <button onclick="document.execCommand('foreColor', false, 'black');">黒</button>

　<!--入力フォーム-->
  <div id="editor" contenteditable></div>
  
```

## 参考

https://codepen.io/fukaminmin/pen/JyzOLz
Visual StudioをPowerShellからインストール・更新する

# はじめに

開発環境の構築/更新は可能な限りCLIからコマンド一発で済ませたいところです。そのための一般的な手法はなんらかのパッケージマネージャーを利用することですが、Visual Studioの場合、インストールするコンポーネントを各自にあった状態でインストールする必要があり、単純にはいきません。

そこでここでは、Powershellからインストール・更新する方法を紹介します。

# 構成ファイルのエクスポート

詳細な設定は構成ファイルを利用する方法が間違いがありません。

ここではすでに構築されている環境から構成ファイルをエクスポートし、つぎの環境で（もしくは他人の環境で）同じ環境を作る方法を説明します。

まずVisual Studioのインストーラーを起動し「構成のエクスポート」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99262/569dcada-c1a3-fc22-b170-04c0af45d409.png)

つづいて保存先を選択したあと「詳細のレビュー」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99262/4c558a5d-f0d8-df71-5884-ca4682d2bc0d.png)

確認後「エクスポート」を選択することで、現在の状態のままの構成ファイルが保存されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99262/61262f39-9167-c971-c6ba-6410d8b02eae.png)

# PowerShellからインストール・更新する

つぎのような.ps1ファイルを構成ファイルと同じフォルダに作成、実行しましょう。

こちらはEnterprise版の前提になっていますので、適宜「vs_community.exe」なり「vs_professional.exe」に置き換えましょう。

```powershell
if (0 -eq ((vswhere -utf8 -format json | ConvertFrom-Json).Length))
{
  Invoke-WebRequest -UseBasicParsing -Uri http://aka.ms/vs/16/release/vs_enterprise.exe -OutFile vs_enterprise.exe
  Start-Process -FilePath vs_enterprise.exe -ArgumentList "--config `"${pwd}\.vsconfig`" --passive --norestart --wait" -Verb runas -Wait
} 
else
{
  Invoke-WebRequest -UseBasicParsing -Uri http://aka.ms/vs/16/release/vs_enterprise.exe -OutFile vs_enterprise.exe
  Start-Process -FilePath vs_enterprise.exe -ArgumentList "update --passive --norestart --wait" -Verb runas -Wait
}
```

ちなみにVSをひとつしかインストールしない前提になっているので、環境が異なる場合はif分のところを修正してください。

これで未インストールの場合は新しくインストールされ、インストール済みの場合は最新のバージョンに更新されます。

なお構成ファイルに基づき、構成を変更したい場合はつぎのように実行します。

```powershell
Invoke-WebRequest -UseBasicParsing -Uri http://aka.ms/vs/16/release/vs_enterprise.exe -OutFile vs_enterprise.exe
Start-Process -FilePath vs_enterprise.exe -ArgumentList "modify --config `"${pwd}\.vsconfig`" --passive --norestart --wait" -Verb runas -Wait
```

以上です。
【SQL】MySQL公式チュートリアルで検索してみる

場所はここ
https://dev.mysql.com/doc/refman/5.6/ja/tutorial.html

データをいちいち打ち込むのは大変なので、一括登録用
コピペで大丈夫です。

```sql:pet.sql
CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);

insert pet values( 'Fluffy','Harold','cat','f','1993-02-04',NULL);
insert pet values( 'Claws','Gwen','cat','m','1994-03-17',NULL);
insert pet values( 'Buffy','Harold','dog','f','1989-05-13',NULL);
insert pet values( 'Fang','Benny','dog','m','1990-08-27',NULL);
insert pet values( 'Bowser','Diane','dog','m','1979-08-31','1995-07-29');
insert pet values( 'Chirpy','Gwen','bird','f','1998-09-11',NULL);
insert pet values( 'Whistler','Gwen','bird',NULL,'1997-12-09',NULL);
insert pet values( 'Slim','Benny','snake','m','1996-04-29',NULL);
insert pet values( 'Puffball','Diane','hamster','f','1999-03-30',NULL);
```

データのみ
【Unity】ヒエラルキーウィンドウ内のソート

# この記事でできること
ヒエラルキーウィンドウ内のオブジェクトの並びを50音順にソートすることができます。

## 今までだと
- 同じようなオブジェクトをまとめてDeleteしたいのに、配置がバラバラ!!　めんどくさい!!(しかもミスる)
![スクリーンショット 2020-08-15 9.22.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/9fbe1fe5-4681-22a7-cf6f-19cd098af8cc.png)

## それがこうなる
- 便利!!!
![スクリーンショット 2020-08-15 9.24.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/295f4c95-45d8-8a92-bd3a-e9d8111ea076.png)

---

## やり方
- Unityメニューの[Preferences]を選択する。
![スクリーンショット 2020-08-15 9.23.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/dbcff2ea-ff10-0197-3af3-7ca5bb5954d4.png)
- [Preferences]内の[Enable Alpanumeric Sorting]にチェックを入れる。 
![スクリーンショット 2020-08-15 9.24.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/237e43db-326d-d6e7-6833-524e20ebf4ec.png)
- ヒエラルキーウィンドウの右上にあるアイコンを選択する。
![スクリーンショット 2020-08-15 9.24.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/48928e8c-4bd0-b501-0b00-a94e37f0ff42.png)
- [Alpabetical Sorting]を選択する。
![スクリーンショット 2020-08-15 9.24.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/5fa28d62-e8d5-727b-0a5a-ef769c7df0f2.png)
- 並び替えられた!!　便利!!
![スクリーンショット 2020-08-15 9.24.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/4f7ca209-bdc9-6090-35bd-b6b94b0e9ff5.png)
Pythonでおみくじを作る



##概要

プログラムを実行すると、運勢（凶〜大吉）とメッセージを表示するプログラムです。

##処理の流れ

1.おみくじの番号をランダムに決める
2.辞書fortunesから番号に対応する運勢を取得する
3.運勢に対応するメッセージが書かれたファイル名を作る
4.ファイルを読み込む
5.ファイルの内容をリストとして取得する
6.リストからランダムに要素を得る

##実装


```python.qiita.rb
import random

fortunes = {
    1: '凶'
    2: '末吉'
    3: '小吉'
    4: '中吉'
    5: '吉'
    6: '大吉'
}

# おみくじの番号(1~6)をランダムに決定
number = random.randint(1.6)

# 辞書fortunesから番号に対応する運勢を取得する
fortune = fortunes[number]

# 読み込みファイル名を作成
file_name = 'input/fortune_' + str(number) + '.txt'

# ファイルを読み込んで、その中からランダムな1行メッセージとして取得する
with open(file_name.encoding='utf-8') as f:
    messages = f.readline()
    message 0 random.choice(messages)

print('あなたの運勢は...')

# 運勢を表示
print(fortune)

#メッセージを表示
print(message)

```

##後ほど書いていく
ts-jest : テストファイルから他のテストファイルをimportするとカバレッジが取得できない


## はじめに

この記事は、表題の問題について、詳細と解決方法を共有するためのものです。

### 対象とする読者

この記事はjestおよびTypeScriptでの開発を行っている方を対象としています。それぞれのツールの環境構築などは取り扱いません。

### 動作環境

- node.js : v12.18.0
- TypeScript : v3.9.7
- ts-jest : v26.1.3

## 問題の詳細

特定の条件下で、ts-jestのカバレッジが取得できなくなります。

### 症状

- テストは成功し、エラーは発生しません。
- すべてのテスト対象ファイルのカバレッジが0%になります。

### 再現方法

まず、テストを含むファイル`test1.spec.ts`と`test2.spec.ts`を作成します。


*▼test1.spec.ts*

```ts
import { util } from "../src/util"

test("test1", () => {
  supportTest();
  ...
});

export function supportTest():void{
  ...
}
```

*▼test2.spec.ts*

```ts
import { util } from "../src/util";
import { supportTest } from "./test1.spec";

test("test2", () => {
  supportTest();
  ...
});
```

`test1.spec.ts`にはexportされた関数`supportTest`があります。`test2.spec.ts`では`supportTest`をimportしています。


## 解決方法

### テストを含むファイルを相互にimportしない

この状態では、`test1.spec.ts`にimportされている`util.ts`がJavaScriptにトランスパイルされ、カバレッジの取得に失敗します。

ts-jestで関数を共有したい場合は、[jest.config.js](https://jestjs.io/docs/ja/configuration)の[testMatch](https://jestjs.io/docs/ja/configuration#testmatch-arraystring)オプションの対象とならないファイルに関数を書きます。そして、テストを含むファイルからそれぞれimportします。

上記の再現方法を改善するなら、たとえば`common.ts`というファイルを作成し関数を移します。このファイルにはテストは含まれません。`test1.spec.ts`と`test2.spec.ts`は`common.ts`から関数をimportします。

*▼common.ts*

```ts
export function supportTest():void{
  ...
}
```

*▼test1.spec.ts*

```ts
import { util } from "../src/util"
import { supportTest } from "./common";

test("test1", () => {
  supportTest();
  ...
});
```

*▼test2.spec.ts*

```ts
import { util } from "../src/util";
import { supportTest } from "./common";

test("test2", () => {
  supportTest();
  ...
});
```

以上、ありがとうございました。