OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonで毎日AtCoder #50

### はじめに
[前回](https://qiita.com/taxfree_python/items/a6e6c027bd2107919cbb)
今日で#50。はやい。ABC164-Dを書く予定でしたが疑問が解決できてないので保留

### #50
[問題](https://atcoder.jp/contests/abc145/tasks/abc145_d)

**考えたこと**
一回の移動で(x,y)座標の合計は3増えるので(x+y)の合計が3の倍数でないなら到着できません。(i+1,j+2)の移動をs回、(i+2,j+1)の移動をt回とします。$s+2t=x,2s+t=y$の連立方程式を解くと、$s+t=x+y$となります。$s,t$が計算できたら、あとは$s$をどこで行うかを計算するだけです。しかし、愚直に$_{s+t} C _s$を計算すると数が大きすぎて計算できません。そこで、逆元を用いた計算を使います。[詳しい計算の記事](https://drken1215.hatenablog.com/entry/2018/06/08/210000)

```python
x, y = map(int,input().split())

def comb(n,k,mod,fac,ifac):
    k = min(k,n-k)
    return fac[n] * ifac[k] * ifac[n-k] % mod

def make_tables(mod,n):
    fac = [1,1]
    ifac = [1,1]
    inverse = [0,1]

    for i in range(2,n+1):
        fac.append((fac[-1]*i)%mod)
        inverse.append((-inverse[mod%i]* (mod//i)) % mod)
        ifac.append((ifac[-1]* inverse[-1])%mod)
    return fac, ifac

if x > y:
    x, y = y, x
d = x+y
if d % 3 != 0:
    print(0)
else:
    s = (x+y)//3
    t = x - s

    if y > 2 * x: #yが2xよりも大きいと到着できません
        print(0)
    else:
        mod = 10**9+7

        fac, ifac = make_tables(mod,s)
        ans = comb(s,t,mod,fac,ifac)
        print(ans)
```

### まとめ
難しい。ではまた、おやすみなさい。
Railsのフォームのセレクト項目に、テーブルから検索した値を表示する

# はじめに
Railsのフォームのセレクト項目に、テーブルから検索した値を表示してみる。

# 環境
- Vagrant + Ubuntu 16.04.5 LTS
- PostgreSQL
- Rails 5.2.4.2
- slim
- Bootstrap4

# やり方

Jichitaisテーブルに下記のデータが入っていて、セレクト項目のプルダウンに表示させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/b4e8b020-0269-62dd-b280-b1eb74d3d969.png)

**select**メソッドを使う方法と、**collection_select**メソッドを使う方法とがあるが、基本的にどっちを使ってもOKだろう。しかし、セレクト項目に複数項目を表示させたい場合は、**select**メソッドしか使えない事になる。

## selectメソッドを使う
```_form.html.slim
.form-group
    = f.label :jichitai_id, "都道府県１", class: 'control-label'
    = f.select :jichitai_id, 
                    Jichitai.where('enduser_cd < 500').map{ |i| "#{i.id}  #{i.enduser_cd}  #{i.sikutyou}" },
                    {include_blank: true}, 
                    class: 'selectpicker form-control',
                    id: 'jichitai_1'
```
見た目はこうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/81a89b3c-579c-be39-72f0-719e060653ff.png)

## collection_selectメソッドを使う
```_form.html.slim
.form-group
    = f.label :jichitai_id, "都道府県２", class: 'control-label'
    = f.collection_select :jichitai_id, 
                    Jichitai.where('enduser_cd >= 500'), :enduser_cd, :sikutyou, 
                    {include_blank: true}, 
                    class: 'selectpicker form-control',
                    id: 'jichitai_2'
```
見た目はこうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/6c1443e2-e829-150b-327d-7b4b3cbc2e35.png)

# 参考
http://rails.hatenadiary.jp/entry/2013/03/15/122116
SourceTree ⇔ Github SSH設定

# SourceTree ⇔ github SSH設定

## 目的
* Macを使う事自体初めてだったため、とりあえずなにかキーボードで打ちたかったため、練習も兼ねて設定の備忘録を残したかった。
* WindowsではTortoiseGitを使っていて特殊な設定無しで利用できていたが、SourceTreeではプライベートリポジトリが表示されず、ハマったため、同じようにハマってる人もいるかも？と思ったため残しておく。
    * 結局プライベートリポジトリは表示はされず、URLを直接指定しないとクローンできなかったが。。。

### 環境
* Macbook Air 2020
* OS
    * MacOS Catalina 10.15.3
* SourceTree 4.0 

### 手順

`ssh-keygen`コマンドを使ってSSHのキーを生成する。  
デフォルトではRSAで暗号化される。

```
% ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/ozkknnt/.ssh/id_rsa): 
Created directory '/Users/ozkknnt/.ssh'.
```

パスフレーズを入力する

```
Enter passphrase (empty for no passphrase):{ここに適当なパスフレーズ}
Enter same passphrase again: {ここに適当なパスフレーズ}
```

`id_rsa`という名前のキーが作成される。

```
Your identification has been saved in /Users/ozkknnt/.ssh/id_rsa.
Your public key has been saved in /Users/ozkknnt/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxx ozkknnt@ozkknnt-macbook-air.local
The key's randomart image is:
+---[RSA 2048]----+
| 省略             |
+----[SHA256]-----+
```

この鍵をsshエージェントに保存する。  
`ssh-add`を使うことで、先ほど作った鍵を登録する。

```
% ssh-add ~/.ssh/id_rsa
Enter passphrase for /Users/ozkknnt/.ssh/id_rsa: {ここに上記のパスフレーズ}
Identity added: /Users/ozkknnt/.ssh/id_rsa (ozkknnt@ozkknnt-macbook-air.local)
```

生成した鍵の内容をコピーする。

```
% pbcopy < ~/.ssh/id_rsa.pub
```

## Github上での作業（SSHキー登録）
Githubにログインし、`setting`から`SSH and GPG keys`を選択する。

![Screenshot 2020-04-27 21.44.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171559/1717d50f-0cb3-2865-5667-d04cdb7526dd.png)

Titleは適当なものにして、さきほどコピーした鍵の内容を`Key`に貼り付け、`Add SSH key`を押下して登録する。

![Screenshot 2020-04-27 21.44.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171559/7898cfa9-9dcb-7a2f-1b12-b52b73279a71.png)

GithubにSSH Keyが登録されたのがわかる。（Titleはmacbook airにした）
![Screenshot 2020-04-27 21.44.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171559/7e257085-0970-6c91-17db-fe961182a211.png)

## 確認作業
`ssh -T git@github`コマンドで下記のメッセージが表示されればkey登録は完了。

```
% ssh -T git@github.com
Hi ozkknnt! You've successfully authenticated, but GitHub does not provide shell access.
```

## SourceTreeの設定

Top画面の歯車マーク→アカウントを選択する。

<img width="474" alt="スクリーンショット 2020-04-27 21.41.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171559/dd7a36e8-dbb6-6ac2-cb54-6ba34d972e9b.png">

<img width="179" alt="Screenshot 2020-04-28 21.21.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171559/1fc1209b-7092-2cb1-d47e-961d88e387ab.png">

プロトコルをSSHにして、保存して完了。
SSHキーは自動で選択されている。

<img width="789" alt="Screenshot 2020-04-27 21.43.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171559/b6d80e71-d72d-d1e2-16c5-31d3706c0b07.png">
Elastic BeanstalkでT3インスタンスのUnlimitedモードを無効にして起動するようにする

# やりたいこと
（ほぼタイトルのまんまですが、、、）
今回の目標は、**Elastic Beanstalk環境で`ebextensions`を使って、EC2のT3インスタンスをUnlimitedモードを無効にして起動するようにすること**です。

# T3インスタンスのUnlimitedモードはデフォルトで有効になっている
[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/burstable-performance-instances-unlimited-mode.html)にも以下のように記載があります。

>T3 インスタンスは、デフォルトで unlimited として起動します。T3スポットインスタンスを unlimited として起動し、CPU クレジットを計上するためのアイドル時間なしに、すぐに短期間使用する場合は、余剰クレジットの料金が発生します。24 時間の平均 CPU 使用率がベースラインを超えた場合は、余剰クレジットに対しても課金されます。T3スポットインスタンスは標準モードで起動して、コストが高くならないようにすることをお勧めします。

余剰クレジットこわぁ。。。／(^o^)＼

# Unlimitedモードを無効にしてT3インスタンスを起動するようにする
今回は、AutoScalingで自動で起動されるEC2インスタンスでもUnlimitedモードを無効にしておいてほしいので、`ebextensions`を使って対応します。

以下のファイルを作成して、`.ebextensions`フォルダ内に置いてデプロイします。

```disable-t3-unlimited.config
files:
  "/tmp/disable-t3-unlimited.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/bash
      instance=`curl -s http://169.254.169.254/latest/meta-data/instance-id`
      region=ap-northeast-1
      aws ec2 modify-instance-credit-specification --region $region --instance-credit-specification "InstanceId=$instance,CpuCredits=standard"

commands:
  disable-t3-unlimited:
    command: |
      /tmp/disable-t3-unlimited.sh
      rm -f /tmp/disable-t3-unlimited.sh
```

# 補足

##1. EC2インスタンスメタデータの取得
実行中のEC2インスタンスのメタデータは

```
http://169.254.169.254/latest/meta-data/
```

で取得できます。
今回は`instance-id`が欲しいので、そいつだけ取得しています。

## 2. リージョンの指定
今回はリージョンを`ap-northeast-1`に設定してありますが、EC2を置いているリージョンを指定する必要があります。

```
region=ap-northeast-1
```

## 3. `aws ec2`コマンドを叩く際の注意点
記事の中で下のコマンドを普通に叩いていますが、`aws ec2`コマンドを叩くためには先に[IAMユーザーの認証情報を設定しておく](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-files.html)必要があります。

```
aws ec2 modify-instance-credit-specification --region $region --instance-credit-specification "InstanceId=$instance,CpuCredits=standard"
```

今回は主題とズレるため割愛させていただきますが、AWSの認証情報を設定するための`ebextensions`を別に作ることをおすすめします。

# 確認してみる

EC2インスタンスのコンソール画面から反映されているか確認してみます。
<img width="1678" alt="t3-unlimited.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128154/a04b0884-24cc-b52e-063c-73288f15b6f4.png">

できてた\‪( ´ ‿｀)‬/
<img width="1682" alt="t3-unlimited-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128154/017dbe56-7471-cda8-0db8-c0292af86128.png">

# 参考
- [バーストパフォーマンスインスタンスの無制限モード - Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/burstable-performance-instances-unlimited-mode.html)
- [EC2のT3インスタンスは安いがT3 Unlimitedで死なないように注意 - 動かざることバグの如し](https://thr3a.hatenablog.com/entry/20180831/1535674868)
- [【AWS】T3インスタンスのUnlimitedな罠【EC2】](https://qiita.com/joe_hirata/items/ed510c15d04a09a2f305)
【サクラエディタ】選択中のテキストの半角数字に1足すマクロ

```javascript:plus1.js
function plus1(match, offset, string){
  var inp = match;
  var len = inp.length;
  var i;
  if ( len == 1 && inp >= "A" ) {
    i = inp.charCodeAt(0) + 1;
    inp = String.fromCharCode(i); 
  }
  else {
    inp = String(Number(inp)+1);
  }
  return inp;
}

var str = Editor.GetSelectedString(0);
str = str.replace(/(\d+)/g, plus1);
Editor.InsText(str);
```

# 使用例
2行目から4行目までのテキストに含まれる数字のみをプラス1したいとき、
その行を選択して、当マクロを実行する。

### 実行前

```
test1XXX
test2XXX
test3XXX
test4XXX
test5XXX
```

### 実行後

```
test1XXX
test3XXX
test4XXX
test5XXX
test5XXX
```
PostgreSQLインデックスの作成日時と更新日時の取得について

# はじめに
以前、「[【PostgreSQL】テーブルのインデックスが壊れた話](https://qiita.com/yaju/items/3f2ed8e41851158885d3)」の記事を書きました、そして数日前に1ヶ月振りにインデックスが壊れました。今回で7度目になります。

>再度発生した時にはバックアップ後にREINDEXコマンドを仕掛けるように検討しようと思います。

対応策として、1日1回実行しているバックアップの際にインデックスの再構築をすることにしました。これを仕掛けて数ヶ月発生しないか様子を見ることにします。

# インデックスの再構築
インデックスの再構築するには、REINDEXコマンドがあります。

```
psql -U test -c "reindex INDEX pk_replicate_que;"
```

# インデックスの更新確認
インデックスの再構築の確認ってPostgreSQLのログには何も残らないので、どうすればいいんだろうと考えた時に以前書いた記事「[PostgreSQLテーブルの作成日時と更新日時の取得について](https://qiita.com/yaju/items/014f0279fb2114d6c22a)」を思い出しました。

この時はテーブルに限定していましたが、インデックスでも同様に出来ると考えました。

※schemaname = 'public' は任意のスキーマに変更してください。
※全てのインデックス結果が出力されるので、対象のインデックスのみにしたい場合は抽出条件を追加してください。

```sql
SELECT
   indexname
   ,(SELECT modification FROM pg_stat_file('./base/' || folder || '/PG_VERSION')) AS creation
   ,(SELECT modification FROM pg_stat_file('./base/' || folder || '/' || filenode)) AS modification
FROM (
    SELECT
        indexname
       ,(SELECT MAX(pg_ls_dir::int)::text
         FROM pg_ls_dir('./base')
         WHERE pg_ls_dir <> 'pgsql_tmp'
           AND pg_ls_dir::int  <= 
        (SELECT relfilenode FROM pg_class cls
         INNER JOIN pg_namespace nsp ON cls.relnamespace = nsp.oid
         WHERE nsp.nspname = schemaname AND relname ILIKE indexname)) AS folder 
       ,(SELECT relfilenode FROM pg_class cls
         INNER JOIN pg_namespace nsp ON cls.relnamespace = nsp.oid
         WHERE nsp.nspname = schemaname AND relname ILIKE indexname) AS filenode
    FROM pg_indexes
    WHERE schemaname = 'public'
) CTE

```

## 結果

|indexname|creation|modification|
|:--|:--|:--|
|pk_replicate_que|2019-08-08 10:26:14+09|2020-04-28 09:31:47+09|

※ファイル作成時刻(creation)は変更される可能性が最も低いPG_VERSIONの最終更新時刻です。
※更新日時(modification)は、元のテーブルに登録、更新、削除があった場合にも更新されます。

テーブルの更新が無い時に、REINDEXコマンドを実行して更新日時が更新されていれば実行されたんだなと考えます。
注意として、オートバキュームでも更新日時が変更されてしまいますので直後に確認しないと意味がないです。

# 最後に
今回、1日1回実行しているバックアップの際にインデックスの再構築を仕掛けました。これでインデックスが壊れる現象が発生しなくなることを祈るのみです。
vtk(CAD系)Writerまとめ

# CAD系のWriter

`.stl` `.ply` `.vtk`形式のデータをvtkで出力する方法をまとめていきます

読みこむデータは以下から取得してください

``` terminal:terminal
$ git clone https://github.com/matsubaraDaisuke/vtk-data-set.git
$ cd vtk-data-set
$ cd geometry && ls
```


# 基本となるコード

``` python
import vtk

# reader
filename = "flange.stl"
reader = vtk.vtkSTLReader()
reader.SetFileName(filename)
reader.Update()

# filter
filter = vtk.vtkGeometryFilter()
filter.SetInputConnection(reader.GetOutputPort())
filter.Update()

# mapper
mapper = vtk.vtkCompositePolyDataMapper2()
mapper.SetInputConnection(filter.GetOutputPort()) #mapperにfilterを設定
mapper.SetScalarModeToUseCellFieldData() #scalarデータ用に設定

# actor
actor = vtk.vtkActor()
actor.SetMapper(mapper)             #actorにmapperを設定
actor.GetProperty().EdgeVisibilityOn()

# renderer
renderer = vtk.vtkRenderer()
renderer.AddActor(actor)            #rendererにactorを設定

##背景色の設定
renderer.GradientBackgroundOn()      #グラデーション背景を設定
renderer.SetBackground2(0.2,0.4,0.6) #上面の色
renderer.SetBackground(1,1,1)        #下面の色

#Window
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(renderer)         #Windowにrendererを設定
iren = vtk.vtkRenderWindowInteractor();
iren.SetRenderWindow(renWin);
renWin.SetSize(850, 850)
renWin.Render()
iren.Start();
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132299/87ae2f7e-259e-550b-5f65-143e9df690f1.png)

CAD系のデータを出力する場合は、`mapper`から`iren`までは不要なので、コメントアウトしてください

# vtkSTLWriter

`.stl`を出力する場合

classリファレンス
https://vtk.org/doc/nightly/html/classvtkSTLWriter.html

``` python
writer = vtk.vtkSTLWriter()
writer.SetFileName("output.stl")
writer.SetInputConnection(filter.GetOutputPort())
writer.Write()
```

# vtkPolyDataWriter

`.vtk`を出力する場合 


classリファレンス
https://vtk.org/doc/nightly/html/classvtkPolyDataWriter.html

``` python
writer = vtk.vtkPolyDataWriter()
writer.SetFileName("output.vtk")
writer.SetInputConnection(filter.GetOutputPort())
writer.Write()
```

# vtkPLYWriter


`.ply`を出力する場合 

classリファレンス
https://vtk.org/doc/nightly/html/classvtkPLYWriter.html

``` python
writer = vtk.vtkPLYWriter()
writer.SetFileName("output.ply")
writer.SetInputConnection(filter.GetOutputPort())
writer.Write()
```
【Docker】Dockerコンテナに環境変数を設定完了するまでの流れについて


#設定の必要性に気づいた経緯
開発を行う中で、ターミナルにエラーが表示された。
>SocketError - getaddrinfo: Name or service not known:
  app/models/api_suggest.rb:19:in `suggest'
  app/controllers/suggests_controller.rb:6:in `search'

SocketError...??
まずソケットがわからない、、
[こちら](https://wa3.i-3-i.info/word168.htmlhttps://wa3.i-3-i.info/word168.html)を参考にさせて頂いてなんとなく理解、、
>######ソケット（英：socket）とは
>プログラムとネットワークをつなげる接続口のこと

「SocketError - getaddrinfo: Name or service not known」
「ネットワーク接続口のネームかサービスを知らないです。」
と言われている、、？

ここで、ローカルで設定した外部APIのキーとURIの環境変数をDockerには登録していないことに気づく。

#登録までの流れ

```shell
$ open ~/.bash_profile
```
で、その環境変数を確認

```vim
export API_KEY='〇〇'
export API_URI='https://〇〇〜〜〜.herokuapp.com/api/suggests'
```



##env_file.envを作成
```env_file.env
API_KEY
API_URI
```
プロジェクトルートディレクトリの直下に作成し、環境変数名を書く。



##docker-compose.ymlにenv_fileを読み込ませる記述を追加
```yml:docker-compose.yml
services:
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
    networks:
      - default
   #≀≀≀
　アプリ名:
    build:
      context: .
      dockerfile: Dockerfile.dev
    ports:
      - '3000:3000'
  　#≀≀≀
 env_file: env_file.env #←ここ
```

####環境変数が登録、読み込みされているかの確認。
ターミナルで

```shell
$ docker-compose run --rm アプリ名 env
```
とすると登録のある環境変数がずらっと表示される。


###終わりに。
転職の為、未経験の状態からRailsを学習しております。正しい知識を着実に身に着け、実力のあるエンジニアになりたいと考えています。継続して投稿していく中で、その為のインプットも必然的に増え、成長に繋がるかと考えています。
今現在、初心者だからといって言い訳はできないですが、投稿の内容に間違っているところや、付け加えるべきところが多々あるかと思いますので、ご指摘頂けると幸いです。この記事を読んで下さりありがとうございます。
【Comment】　rails コメント機能実装　

![スクリーンショット 2020-04-28 23.00.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620689/90da92b6-4d8c-553f-115c-86c9baedd1a4.png)

#【ゴール】
コメント機能の実装
　→　コメントの表示
　→　コメント件数の表示

参考：https://qiita.com/__kotaro_/items/8a6bda99dab61d2a72a5

#【メリット】
■　アプリケーションの完成度が増す
■　UX向上

#【開発環境】
■ Mac OS catalina
■ Ruby on Rails (5.2.4.2)
■ Virtual Box:6.1
■ Vagrant: 2.2.7

#【実装】


まず、[アプリケーション作成](https://qiita.com/tanaka-yu3/items/3fe1ed2852c6513d3583)

1.commentモデル作成
 ※DBに記録するので必須

```mac.terminal
$ rails g model Comment 
```

2.modelへアソシエーション　追記
　※　user : comment = 1 : X （１対多）
　※　post : comment = 1 : X （１対多）
 

```models/post.rb
has_many :comments ,dependent: :destroy
```

```models/user.rb
has_many :comments , dependent: :destroy
```

```modles/comment.rb
belongs_to :user
belongs_to :post , optional: true
``` 

2.comments controller 作成
　※　今回は作成のみ、createアクションも同時に作成　①
　※　"build"メソッドで紐付いたものも難なく作成　②
　※　"user"を認識させてあげる　③

```mac.terminal
$ rails g controller Commnets create 　#①
```

```posts_controller.rb
 class CommentsController < ApplicationController
	before_action :authenticate_user!

	def create
		@post = Post.find(params[:post_id])
		@comment = @post.comments.build(comment_params) 　#②
		@comment.user_id = current_user.id　　#③
		if @comment.save
			flash[:success] = "コメントを投稿しました"
		    redirect_back(fallback_location: root_path)
		else
			flash[:unsuccess] = "コメントを投稿できませんでした"
			redirect_back(fallback_location: root_path)
		end
	end

    private
	def comment_params
		params.require(:comment).permit(:text)
	end
```
※今回は"post/show"で記述しているので、追加で記述要

```posts_controller.rb
    def show
		@post =Post.find(params[:id])
		@comment = Comment.new
		@comments = @post.comments.all
```



3.view 記述
　※"form_for"の際には"@post","@comment"両方に情報を!!

```views/posts/show.html.erb
<%= form_for [@post , @comment] do |f| %> #コメント送信フォーム
  <%= f.text_area :text %>
  <%= f.submit "Comment"%>
<% end %>

        　　(中略)

<% @comments.each do |c| %>　#コメント表示
  <%= c.text %>
  <%= c.user.name %>
  <%= c.created_at %>
<% end %>
```

![スクリーンショット 2020-04-28 23.00.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620689/93e21f6f-e7c0-0ad3-f2d1-99ab33c375c4.png)



以上
サーバーレス VPC アクセスのコネクタ作成時にINVALID_ARGUMENTエラーが出た際の対処法

サーバレスvpcアクセスのコネクタを作ろうとしたら `INVALID_ARGUMENT` のエラーが出た

```
CONNECTOR_NAME="test1-hogehoge-hogehoge-hogehoge"
VPC_NETWORK="default"
REGION="asia-northeast1"
IP_RANGE="10.125.0.0/28"

gcloud compute networks vpc-access connectors create ${CONNECTOR_NAME} --region=${REGION} --network=${VPC_NETWORK} --range=${IP_RANGE}

ERROR: (gcloud.compute.networks.vpc-access.connectors.create) INVALID_ARGUMENT: Request contains an invalid argument.
```

色々原因を探った結果、コネクタ名の上限は25byteぽく、コネクタ名が長すぎたのが原因だった

ちなみにIP_RANGEに `/28` をつけ忘れても同じエラーが出た
Vuexのactions/mutationsに2つ以上の引数を渡す

Nuxt.js を触り始めて、疑問に思った事をちゃんとまとめておこうシリーズ。

# Question 

store の commit / dispatch を呼び出す時に複数の引数を渡したい。
ので、`commit('mutation-name', value1, value2);` のように引数を複数渡したが、`value2` が常に undefined になる。


# Answer

挙動から１つしか引数を取らないことは推測できますが、確証を得たかったのでドキュメントを当たったところ、

> mutations
型: { [type: string]: Function }
> 
> ストアにミューテーションを登録します。ハンドラ関数は第一引数に state を常に受け取り(モジュール内で定義されていれば、モジュールのローカルステートを受け取り)、指定されていれば第二引数に payload を受け取ります。
> https://vuex.vuejs.org/ja/api/

との通り、有効なのは第二引数まで。 actions も同様。
そのため、以下のように１つのオブジェクトにした後、ES2015のキー名省略と分割代入を使って以下のように書ける。

```javascript:store/index.js
export const actions = {
  async updateUser({ commit }, user) {
    // Firebase Auth の user を想定。
    const token = await user.getIdToken(true);
    // { user: user, token: token } と等価
    commit('setUser', { user, token });
  }
}

export const mutations = {
  // 分割代入を使って、キー user と token の値をそれぞれ変数 user, token に代入して使う
  setUser(state, { user, token }) {
    console.log(`commit: ${state}, ${user}, ${token}`);
  }
}
```
Nuxt.jsのデータの永続化には Store を使うと書かれているが、結局これは何が嬉しいのか

Nuxt.js を触り始めて、疑問に思った事をちゃんとまとめておこうシリーズ。

# Question

ログイン機構として、Firebase Authentication を使おうとする。
もちろん、ありふれたパターンなので Nuxt.js + Firebase Auth とかで調べると多くの記事が出てくる。
この時、おもむろに `Store` を使う ( Nuxt.js で作られる `store` ディレクトリの中に.jsファイルを作る）のは何故なのかが分からなかったので、その理由を調べた。

# Answer

この文脈でのStoreはNuxt.jsが標準で提供しているVuexのストアを指す。
で、Vuexが何をするものかというと、噛み砕いて言うならば **グローバル変数を管理するための仕組み** と言って差し支えないと思う。

プログラミングを始めると、「グローバル変数は使わない方がいい」と言われてるが、これは「非同期処理に対応できない（＝変更を追うことができない）」「どこから参照・更新されているのかが分からない」といった問題を簡単に解決できないから避けられるのであって、どこからでも参照のみが可能なグローバル定数（システム定数）という概念は、例えばシステムの稼働モードを指したり、データベース接続のための情報をアプリケーションに知らせるためによく利用される。

ここで挙げたグローバル変数の欠点を「値の参照はどこからでも (getterなどを通して) 可能」「値の変更はライブラリが指定する特定の方法のみで可能」というライブラリ利用者への制約でもって補っているライブラリである、という認識。
もちろん、全てをグローバル変数にするなどといったことは行うべきではないが、「システムの全体、あるいは大半で共有したいデータ」についてはこういった仕組みを使って管理することでより簡潔にシステム全体を記述することが可能になりそうである。

Nuxt.js の場合、`store/index.js` がルートモジュール。 それ以外の名前を付けた場合は名前空間付きモジュールとして利用することができる。 つまり、用途ごとにファイルを分けておけば、異なる種別のグローバル変数を管理するために利用できる。

https://ja.nuxtjs.org/guide/vuex-store/


元の話題に戻すと、ログインした情報、というものはウェブアプリの多くの場所で参照される可能性が高い。 ログインユーザーのみに表示可能なページや、ログインしている情報を元にサイトのコンテンツが変わるページなど、ログイン情報の利用は非常に多岐に及ぶ。 そのため、ユーザーがログインしているかいないかといった情報をグローバル変数として管理するのは理にかなっている。 そして、クライアントローカルに保存した情報（CookieやLocalStorage）にはアプリのどこからでも参照できるであろうから、データの参照・更新を行う際にストアを経由する、というのは納得がいく構造である。

では、他にはどのようなものを Store を通して管理すればよいのだろうか？ 

基本は「グローバル変数」を管理することになるため、

- Cookieに書き込むべき情報
- LocalStorage に書き込む情報
- データベースの情報を登録・更新し、その内容をビューと同期する場合
    - データベースも見方を変えれば構造化された（変更可能な）グローバル変数であるため、そのブリッジとしてStoreを使う選択肢もある
    - それを考えると DAO (Data Access Object) っぽさも出てくるなぁ…

といった情報を管理するときに Store を使う、といった理解で問題はない気がする。
ただ、強力ではあるが複雑な仕組みである事には変わりがなく、変数のスコープは小さくできるならば小さい方が理解が簡単で間違いも少なくなる。

 **可能であれば利用しない** 方がもちろん良いだろう。
Ruby と Perl と Java と Python で解く AtCoder ABC 131 D 配列のソート

# はじめに
*[AtCoder Problems](https://kenkoooo.com/atcoder/#/)* の Recommendation を利用して、過去の問題を解いています。
AtCoder さん、AtCoder Problems さん、ありがとうございます。
# 今回のお題
*[AtCoder Beginner Contest 131 D - Megalomania](https://atcoder.jp/contests/abc131/tasks/abc131_d)*
<font color="brown">Difficulty: 594</font>

今回のテーマ、配列のソート
# Ruby
配列のソートですので、実装も簡単だと思います。~~初Pythonなので軽めの問題を選択しました。~~

```ruby.rb
n = gets.to_i
a = Array.new(n){gets.split.map(&:to_i)}
a.sort_by!{|x| x[1]}
ans = 0
n.times do |i|
  ans += a[i][0]
  if ans > a[i][1]
    puts "No"
    exit
  end
end
puts "Yes"
```
```sort.rb
a.sort_by!{|x| x[1]}
```
~~複数条件でソートしていますが学習のためで、解法としては一つだけソートで行けます。~~
**追記**
頂いたコメントより一部修正しました。
# Python
初めて ***Python*** で解きますので、ほぼ写経です。

```python.py
n = int(input())
a = list(list(map(int, input().split())) for _ in range(n))
a.sort(key=lambda x: x[1])
ans = 0
for i in range(0, n):
    ans += a[i][0]
    if ans > a[i][1]:
        print("No")
        exit()
print("Yes")
```
VSCode の拡張機能が効いていますので、コーディングは楽です。

```range.py
for i in range(0, n):
for i in range(0, n - 1):
```
for のところで i で回すようにしましたが、n - 1 と書いて`WA`をもらいました。

次回は、複数条件のソートに挑戦しようと思います。
# Perl
```perl.pl
chomp (my $n = <STDIN>);
my @a;
for my $i (0..$n-1) {
  my @in = split / /, <STDIN>;
  ($a[$i][0], $a[$i][1]) = @in;
}
@a = sort {$$a[1]<=>$$b[1] || $$b[0]<=>$$a[0]} @a;

my $ans = 0;
for my $i (0..$n-1) {
  $ans += $a[$i][0];
  if ($ans>$a[$i][1]) {
    print "No\n";
    exit;
  }
}
print "Yes\n";
```
```sort.pl
@a = sort {$$a[1]<=>$$b[1] || $$b[0]<=>$$a[0]} @a;
```
*Perl* は複数条件のソートです。
# Java
```java.java
import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = Integer.parseInt(sc.next());
        List<Work> work = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            int time = Integer.parseInt(sc.next());
            int limit = Integer.parseInt(sc.next());
            work.add(new Work(time, limit));
        }
        sc.close();
        work.sort(Comparator.comparingInt(x -> x.limit));
        int ans = 0;
        for (int i = 0; i < n; i++) {
            ans += work.get(i).time;
            if (ans > work.get(i).limit) {
                System.out.println("No");
                return;
            }
        }
        System.out.println("Yes");
    }

    static class Work {
        int time;
        int limit;

        Work(int time, int limit) {
            this.time = time;
            this.limit = limit;
        }
    }
}
```
```sort.java
        work.sort(Comparator.comparingInt(x -> x.limit));
```
*Java* は単数条件のソートです。

**追記**
コメントで教えてもらいましたので、ソートの比較部分を java8 で導入された Comparator を使用するコードに変更しました。安全かつ若干速くなりました。

||Ruby|Python|Perl|Java|
|:--:|:--:|:--:|:--:|:--:|
|コード長|189 Byte|231 Byte|315 Byte|972 Byte|
|実行時間|484 ms|995 ms|1237 ms|883 ms|
|メモリ|22520 KB|53728 KB|66788 KB|72900 KB|
# まとめ
+ ABC 131 D を解いた
+ Ruby に詳しくなった
+ Python に詳しくなった
+ Perl に詳しくなった
+ Java に詳しくなった
スコープで見るRubyとPythonの違い

#スコープとは
ある変数を利用できる範囲のこと。
スコープの範囲を超えた変数を使おうとするとエラーが起こります。

実際にRubyとPythonでスコープが異なる例を見ていきましょう。

##Rubyの場合
```ruby
name = 'Mike'
def greeting()
  puts ('Hello ' + name)
end
greeting() #=> error (undefined local variable)
```
Rubyではメソッド内ではメソッド内で定義された変数しか使えません。そのため今回、greetingメソッドではスコープ外の変数であるnameを使おうとしているのでエラーが起こるのです。

##Pythonの場合
```python
name = 'Mike'
def greeting():
  print('Hello ' + name)
  x = 2

greeting() #=> Hello Mike
print(x) #=> error
```
Pythonではnameという変数はgreetingメソッド内まで影響を与えるため、エラーなく実行することができます。

ところがメソッド内で定義されたxという変数はメソッド外では使えないため、エラーが起きます。
【Day64】積み上げ日記

##予定
■Udemy（セクション２０、２１）
－FirebaseとFacebookの連携を理解する
ー広告を実装する

##完了
セクション２０
－FirebaseとFacebookの連携を理解する

##学習時間
６h

##学習ポイント
■UserDefaults

##気になったことメモ
■デリゲートメソッドの宣言方法を確認する
■UserDefaultsの意味

##参考記事
■ UserDefaultsの概要と操作方法
https://qiita.com/uhooi/items/429cac9b798b9c0937ae
nuxt.jsでimportに使う時に@や~から始まるパスでファイルを指定する理由

Nuxt.js を触り始めて、疑問に思った事をちゃんとまとめておこうシリーズ。

# Question

importをする時、ネットでコードを調べていると `@/` 始まりでファイルを指定しているものがある（例えば、 `@/components/...` のように)。
かと思えば `~` で指定しているものもあり、これは「プロジェクトやソースコードのルートディレクトリ」のようなものだと推測はつくのだが、前者も同じような時に用いられている。 
結局これらは何が違うのかが分からない。


# Answer

**初期設定では `~` も `@` も同じ。**

> エイリアス	ディレクトリ
~ or @	srcDir
~~ or @@	rootDir
デフォルトでは srcDir は rootDir と同じです。
https://ja.nuxtjs.org/guide/directory-structure

その他に調べた限り、ビルドに利用するWebpackのエイリアスとして特定のディレクトリを指定する時に `@` 始まりを指定する、という文化があるっぽい？

- https://stackoverflow.com/questions/42749973/es6-import-using-at-sign-in-path-in-a-vue-js-project-using-webpack
- https://webpack.js.org/configuration/resolve/#resolvealias
PMP試験にでる三角分布とベータ分布による3点見積もりを計算してみよう！

# 3点見積もりとは
P(悲観), O(楽観), ML(期待)の3点より工数を見積もる手法！

## P,O,MLとは
- P = Pesimistic(悲観的工数)
- O = Optimistic(楽観的工数)
- ML = Most Likely(期待工数)

## 三角分布を使った3点見積もり
- Triangular Distribution: (P + O + ML ) / 3

## ベータ分布を使った3点見積もり
- Beta Distribution (PERT): (P + O + 4ML ) / 6

## 実際にやってみよう
- 3点の値
  - P = $200,000
  - O = $50,000
  - ML = $120,000
- 3点見積もり結果
  - 三角分布の場合 : $123,333
  - ベータ分布の場合 : $121,666

```python3
$ python3
Python 3.7.3 (default, Mar  6 2020, 22:34:30) 
[Clang 11.0.3 (clang-1103.0.32.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> P=200000
>>> O=50000
>>> ML=120000
>>> (P+O+ML)/3
123333.33333333333
>>> (P+O+4*ML)/6
121666.66666666667
```

----
よかったよかった
busybox-w32

# 概要

[BusyBox](https://www.busybox.net/)は単一バイナリでUNIX系の複数の基本コマンドを提供するソフトウェアです。
[busybox-w32](https://frippery.org/busybox/)はそのWindows版です。
この記事では[MinGW-w64クロスコンパイラ](https://qiita.com/bamboo23/items/6a4bf96a9f4e946aebc3)を使ってbusybox-w32をビルドする方法を説明します。

# 必要なソースコード

以下は2020年4月時点の最新のソースコードです。

- GitHubの[busybox-w32プロジェクトサイト](https://github.com/rmyorston/busybox-w32/releases)から
    - FRP-3445-g10e14d5eb

# ビルド手順

MinGW-w64クロスコンパイラは`${MINGW64DIR}`にインストールされているとします。

1. ソースコードを展開します。
    ソースコードを展開して、`Makefile`のあるディレクトリを`${SRCDIR}`とします。

2. ソースコードとは別のディレクトリで以下を実行します。

    ```
    for act in mingw64_defconfig all; do
        make -f "${SRCDIR}/Makefile" \
            "KBUILD_SRC=${SRCDIR}" \
            "CROSS_COMPILE=${MINGW64DIR}/bin/x86_64-w64-mingw32-" \
            CONFIG_EXTRA_LDLIBS=pthread "${act}"
    done
    ```

    細かくカスタマイズしたい場合はmingw64_defconfigの後にmenuconfigを実行します。

# 実行例

![busybox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628049/f7854c17-bd3e-90b1-5a84-27781629d156.png)
Nuxt.js (Vue.js)でComponents を指定する時のタグ名の書き方について

Nuxt.js を触り始めて、疑問に思った事をちゃんとまとめておこうシリーズ。

# Question 

以下のように components には (ES2015のキー名を省略できる書き方によって) `{LogoTest: LogoTest}` として定義されているはず。
しかし、template に書くときは `<logo-test></logo-test>` とキーと一致しないケバブケースで記載しても有効と認識されるのはなぜか？

```vue:index.vue
<template>
  <logo-test></logo-test>
  <!-- ちなみに LogoTest とキーをそのまま書いても通る -->
</templage>
<script>
import LogoTest from '~/components/LogoTest.vue';

export default {
  components: {
    LogoTest
  }
};
</script>
```

# Answer

**Vue.js の仕様**。 具体的には以下で説明されている。

> パスカルケースでコンポーネントを定義する場合、そのカスタム要素の参照には、どちらのケースも用いることができます。これは、 <my-component-name> と <MyComponentName> のどちらも許容されることを意味します。ただし、DOM 内 (すなわち、文字列でないテンプレート) に直接使用する場合には、ケバブケースの名前のみが有効なので注意してください。
> https://jp.vuejs.org/v2/guide/components-registration.html

Vue.js では「JavaScriptではキャメルケース」「HTMLはケバブケース」として書くことが推奨されており、基本はこのルールを覚えていて開発を行うのが良さそう。 以下、参考。

- https://stackoverflow.com/questions/52085622/vue-component-name-must-be-lowercase
- https://github.com/vuejs/vue/issues/2308
docker-composeのコマンドとオプション

**はじめに参考記事**
http://docs.docker.jp/compose/reference/overview.html
https://docs.docker.com/compose/reference/

こちらに書いてあるものを参考にしています。より正確なものが見たい方は上記リンクから飛んでください。

また、英語に抵抗がない方はこちらから確認しても良いでしょう

``$ docker-compose -h``

## 基本的な使い方
```terminal
docker-compose [-f=<引数>...] [オプション] [コマンド] [引数...]
```
このようにオプション、コマンド、引数の順番でdocker-composeの後ろにつけます。

## オプション
``-f, --file ファイル名``
ファイル指定をするオプションです。デフォルトでは現在いるディレクトリの``docker-compose.yml``がファイルに指定されます。

``-p, --project--name プロジェクト名``
プロジェクト名は現在いるディレクトリがデフォルトになりますが、明示的に指定することもできます。

``H, --host ホスト`` 
接続先のデーモンやソケットを指定することができます。

他にもいくつかあるので気になる人は調べてみてください。

## コマンド

何を扱うコマンドなのかが曖昧になりがちだと思ったので、何を扱うかは太字にしました。


## build
**サービス**の構築、または再構築を行なう
``--compress`` ビルドコンテキストを圧縮します
``--no-cache`` キャッシュを利用しません
``--pull `` 最新のイメージをpullします
``--parallel`` 並行してイメージをbuildします
## create
**サービス**の作成 
※このコマンドは廃止されました
## down
**コンテナ**や**イメージ**、**ボリューム**を停止させ、削除します
``--rmi type`` イメージを削除します。typeにはall,localを指定します
``-v, --volumes`` volumesで宣言した名前付きvolumeを移動します
``--remove-orphans`` サービスで定義されていないコンテナを削除します
``--timeout`` タイムアウトする秒数を指定することができます
## events
**コンテナ**からのイベントを表示することができます。
``--json``をつけることでjsonオブジェクトを出力します
## kill
**コンテナ**を強制終了します
## log
**サービス**からのログを出力します
``--no-color``　モノクロで出力します
``-f, --follow`` 最新のログを追います
``-t, --timestamps`` タイムスタンプを表示します
## pause
**サービス**を一時停止します
## port
ポートに割り当てる公開用ポートを表示します
## ps
**コンテナ**の一覧を表示します。--aで停止したコンテナを表示します
``-q, --quiet`` idのみを表示します
``--services`` サービスを表示します
``-a`` 停止した全てのコンテナを表示します
## pull
**サービス**で使われているイメージを取得します
``--ignore-pull-failures`` pullが可能なものはpullし失敗したものは無視します
``--no-parallel`` 並行したpullを無効にします
``-q, --quiet`` プロセスを出力しない
``--include-deps`` 依存関係を持つイメージもpullします
## restart
**サービス**を再起動します
## rm
停止している**コンテナ**を削除します
``-f, --force`` 確認しません
``-s, --stop`` コンテナが止まっていない場合止めてから削除します
``-v`` 匿名のvolumeを削除します
## run
一度だけコマンドを実行します
``-d, --detach``　コンテナをバックグラウンドで実行する
``--name`` コンテナに名前を振り分ける
``--entrypoint`` イメージのエントリポイントを上書きします
``-e`` 環境変数を設定します
``-u, --user``　指定したuserとして実行します
``--no-deps`` 開始しないサービスを指定します
``--rm`` 実行後コンテナを削除します
``-v, --volume`` ボリュームをバインドマウントします
## scale
サービス用の**コンテナ**の数を指定します　※このコマンドは廃止されました
## start
**サービス**を開始します
## stop
**サービス**を停止します
## unpause
**サービス**を再開させます
## up
**コンテナ**を作成し、開始します
``-d, --detach`` バックグランドで実行します
``--quiet-pull`` 進行状況を出力しない
``--no-deps`` 開始しないサービスを指定します
``--always-recreate-deps`` 依存コンテナを再作成します
``--no-recreate`` 既にコンテナがない場合は作成しません
``--build`` コンテナを起動する前にイメージをビルドします
``--abort-on-container-exit`` コンテナを全て停止します
``-V、-renew-anon-volumes`` 匿名volumeを再作成します
``--remove-orphans`` 定義されていないサービスのコンテナを削除します


# 最後に
オプションの量により、コマンドの重要度がわかりますね。
また、この記事は全てを網羅したわけではありません
https://docs.docker.com/compose/reference/
こちらがより正確ですので、ここにはない記述はここからお探しください。

少しでも何かの参考にしていただけたら嬉しいです。また、駆け出しdockerマンですので、間違った点や、直した方が良い表現などがありましたら教えていただけると嬉しいです。




<!--
目的と優先すること
より完結に書いて、自分がわからないところはとりあえず一度調べる、そしてそれでわからなかったらとにかくそれもおけい
速さを重視して、とにかく今日中に終わらせることを目的とする。
-->
mbedでSTM32のFLASHROM領域を書換えする。

#mbedでSTM32のFLASHROM領域を書換えする。

今回使用するのはSTM32F303

#①INCLCUDEファイルの追加
```
#include "stm32f3xx_hal_flash.h"　/* mbedでもhalは使える */
```
を追加
#②Page ERACE(消去)
```
bool Flash_clear(void)
{
uint32_t PAGEError;
    HAL_FLASH_Unlock();

    FLASH_EraseInitTypeDef EraseInitStruct;
    EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
    EraseInitStruct.PageAddress = 0x0800e000;  /*　消したいアドレス */
    EraseInitStruct.NbPages     = 1; /*　消したいページ数 */
 
	 
		
		if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) == HAL_OK)
		{
			 HAL_FLASH_Lock();
				 pc.printf("Page Erace Ok\n");
				return	true;
		}
		else
		{
			  HAL_FLASH_Lock();
				pc.printf("Page Erace Errork\n");
				return false;
		}
}
```

#②32BIT 書込み

```
void FlashWrite(void)
{
    HAL_FLASH_Unlock();

    HAL_StatusTypeDef result;
    uint32_t WriteAdr   = (uint32_t *)0x0800e000;
 
    HAL_FLASH_Program(
               FLASH_TYPEPROGRAM_WORD,
                (uint32_t)WriteAdr,　/* 書込みアドレス*/
                (uint64_t)0X12345678 /* 書込データ*/

                );
    HAL_FLASH_Lock();

}
```
以上
Windows10のサンドボックス起動時に自動でIEを立ち上げる

# 概要

Windowsサンドボックスで毎日のようにIEで同じURLを開く必要があって

1. タスクバーに登録しても消えるので毎回スタートメニューからIEを開く
2. 履歴にURLが残ってないので毎日コピペか手打ちする

という状況に耐えられなくなって何か方法がないか探したところ
```WSB ファイル (.wsb)```の存在を知ったのでメモ。

# 環境

* Windows10 Pro（1903以降） ※HOMEではSandBoxが使えません

# 書いてないこと

* SandBoxの有効化方法

# WSBファイルとは

Windowsサンドボックスの設定ファイルです。
リモートデスクトップにもrdpという設定ファイルがありますよね？
似たようなもんです（適当）

# どう利用したか

以下のXMLを記述を記述したテキストファイルの拡張子をWSBに変更します。
ここでは```ie_example.wsb```というファイル名にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617842/b6c5d3bd-9b50-5a86-cbfe-777f474f5b01.png)


```xml:ie_example.wsb
<Configuration>
    <LogonCommand>
        <Command>iexplore http://example.com/</Command>
    </LogonCommand>
</Configuration>
```

出来上がったファイルをダブルクリックすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617842/06ab4318-992f-d980-7e85-7fc05b2394b6.png)
サンドボックスで、指定したURLを開いた状態でIEが立ち上がります！
（ちょっとだけ時間がかかります）

サンドボックスのアイコンをタスクバーにピン止めしておけば、
ジャンプリスト（右クリックで出てくるアレ）からも呼び出せるので便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617842/175000d3-6569-fb17-0cfa-51741798ef56.png)



# おわりに

```<Command>～</Command>``` の間には任意のコマンド、引数を指定することができます。
ほかにもいろいろとできるようですが、わたしにはこれ以外必要ないかな。

# 参考

* [Windows サンドボックスの構成](https://docs.microsoft.com/ja-jp/windows/security/threat-protection/windows-sandbox/windows-sandbox-configure-using-wsb-file)
READMEファイルにGif動画を載せる方法

# 概要
動画をGithubリポジトリのREADMEファイルにアップロードする方法を解説します。
![Animated GIF-downsized (10).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/d93a09a6-435f-a4c2-369f-19978a9b1a49.gif)

# 動画をGifに変換する
動画はそのままREADMEファイルに載せることは出来ないので、まずは動画をGifに変換していきます。
[GIPHY](https://giphy.com/)というサイトでGifを作ることができます。
GIPHYにアクセスしアカウント登録後、画面右上の **Create**ボタンを押します。
![スクリーンショット 2020-04-27 12.10.49.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/03f30cf4-f51e-a83e-e146-439ce63ca678.jpeg)

**Choose Video**をクリックし動画を選択します。
![スクリーンショット 2020-04-27 12.11.00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/4245a5df-65d8-d150-3c77-098a380ab6ad.jpeg)

再生時間や再生開始時間を調整します。
調整ができたら**Continue to Decorate**をクリック。
その他カスタマイズもお好みで選択し**Continue to Upload**、**Upload to GIPHY**をクリックしGifを作成。
![スクリーンショット 2020-04-27 12.11.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/9a8f071c-8707-d338-7cda-fc2cf398f91d.png)

作成できたら、**Media**をクリック。
![スクリーンショット 2020-04-27 12.09.46.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/824be3f1-d62f-8188-03c2-e17c5d193317.jpeg)

**Small**のところのダウンロードをクリックしGifをダウンロード。
※容量が大きいとGitHubにアップロード出来ないため、Smallを選択。
![スクリーンショット 2020-04-27 12.10.23.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/d9d60c8c-7cab-6ba0-ba2d-48f87b0d7600.jpeg)

# READMEファイルにGifを載せる
Gif動画をそのまま添付しただけでは反映されないので、
GitHubリポジトリの**Issues**にGifをアップロードし、そこのURLを取得していきます。

まずはGitHubリポジトリのIssuesにて**New issue**をクリック。
![スクリーンショット 2020-04-27 14.02.27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/5c007ada-0052-ce4e-d9b1-28fba4db3c6e.jpeg)

テキストフィールド下の「**Attach files by dragging & dropping, selecting or pasting them.**」をクリックし、先ほど作成したGif動画を選択。
![スクリーンショット 2020-04-27 14.03.26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/fd03df3d-6957-5f61-a0e4-fdd06e683458.jpeg)

すると数秒してからテキストフィールドにURLが発行されますので全選択してコピーします。
また**Title**も記入し、右下の**Submit new issue**をクリック。
![スクリーンショット 2020-04-27 14.04.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/5637967e-1617-775a-aaec-b843919d8106.png)

そうしたらソースコードのREADMEファイルに先ほどコピーしたURLをペーストして保存し、再度GitHubにpushします。
するとGitHub上のREADMEファイルでGifが反映されているのが確認できると思います。
![Animated GIF-downsized (10).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578233/6919f7c9-32e3-2e64-99c9-47e1bb93055f.gif)

以上です。最後までご覧くださりありがとうございました。
ポケットwi-fiがmacだけインターネットに繋いでくれない状況の原因と解決方法

#状況
混雑の時間帯になると、ポケットwi-fiがスマホ（iphone）は繋がるのにmacはつながらないという事態で１ヶ月ほど苦しんでいました。

さらに詳細にいうと遅くなるのではなく、全くつながらなくなっていました。


#原因

wi-fiの周波数を2.4GHzにしていたことで、他の家の人の電波（詳細は不明）を受けてしまい、自宅の電波を読み取ることができなくなってしまっていました。

おそらくiphoneよりmacの方が受け取ることのできる電波が多いか、または旧式ゆえに選別できていなかったのだろうなと推測しています。

#解決策
wi-fiの周波数を5.0GHzにすることで解決しました。

何やら調べてみると周波数を5.0GHzは基本的にwi-fiしかないらしく、影響を受けにくいとのことでした。

似たような状況でお困りの方は一度試してみてはいかがでしょうか。
wolframalphaで、変数に値を与えて計算する。電卓の変数メモリーより便利かもしれない。

入力:
x=1,y=2,z=3,x+y+z
入力解釈:
x = 1, y = 2, z = 3のとき x + y + z
結果:
6

https://ja.wolframalpha.com/input/?i=x%3D1%2Cy%3D2%2Cz%3D3%2Cx%2By%2Bz

# 長所
ブラウザなのでお気に入りに、気軽に登録できます。
# 短所
お気に入りが増えてくると、削除するのが、たいへんです。
コールバック関数を理解する

CALLBACKと言われても、その名前から一体何なのかも想像がつかない。

これはハッキリ言うと、CALLBACKでは無くて、CALLBYNAMEの方がしっくりくると思っている。

どんな時に使うのか、その例を考えてみる。

#一般的な場合

コンピュータに命令する場合、まず常識的には人間の言葉が通じないので、
間接的に指示することが一般的になる。

例えばであるが、番号の書いたボタンか何かがあった場合は、

１（話をする）
２（動く）
３（止まる）

という風なものを介在させて、Actionという指示を伝えることになる。

Action（番号）

IF　番号＝１　THEN　話をする
IF　番号＝２　THEN　動く
IF　番号＝３　THEN　止まる

Function　話をする：
Function　動く：
Function　止まる：


#コールバイネームの場合

コールバイネームの場合は、指示自体を直接的に実行させるイメージ

ACTION(　命令　)

Function　話をする：
Function　動く：
Function　止まる：

この命令の部分に、直接的に「話をする」、「動く」、「止まる」
などというものが入る。


そもそも関数の名前を、そのまま引数に与えてしまうところが、
このコールバック関数の概念が理解しにくのだと思う。

引数には、関数の名前をそのまま直接入れるのである。
TensorFlow2.0系でCIFAR-10データを学習して予測するまで（１）

#概要（TL;DR）

tensorflow2系でCIFAR-10の分類テストをしてみた。（個人的な覚書程度）
まずは、CIFAR-10の中身を確認する



下記の作業はすべて、[Google Colab](https://colab.research.google.com/notebooks/intro.ipynb?hl=ja)で実施しています。★GPUも使ってます。（ランタイム-> ランタイムのタイプを変更 -> ハードウェアアクセラレータでGPUを選択）

自前のMacBook Air(1.6 GHz DualCore Intel Core i5,16GB 2133MHz LPDDR3では、学習時間がかかり過ぎて待てない・・・。話には聞いていましたが、GPUの凄さを改めて感じました。


#cifar-10

## そもそもCIFAR-10とは
[CIFAR-10](https://www.cs.toronto.edu/~kriz/cifar.html)

32x32サイズのカラー画像を10クラス（分類）で各6,000枚（全60,000枚）が含まれている学習用セットだそうな。

クラスは{airplane,automobile,bird,cat,dog,frog,horse,ship,truck}の10種類。SUVはAutomobileに入るし、TruckにはBigTrucksしか入らないなど、重複が無いような工夫がほどかされているとのことでした。

## それぞれのクラスのサンプルを見てみる
```python
from tensorflow.python.keras.datasets import cifar10
from tensorflow.python.keras.preprocessing.image import array_to_img

# x_train,y_trainは学習用のデータセット
# x_test,y_testは学習結果の検証用データセット
# (x_は入力データ,　y_は出力データ）
(x_train,y_train),(x_test,y_test) = cifar10.load_data()

# CIFAR-10のクラス
cifar10_labels = [
        'airplane',
        'automobile',
        'bird',
        'cat',
        'deer',
        'dog',
        'frog',
        'horse',
        'ship',
        'truck']

index = 1
print (f"この画像は{ cifar10_labels[int(y_train[index])] }です.")
array_to_img(x_train[index])
```

![スクリーンショット 2020-04-28 9.29.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44112/63a0448b-215b-b3da-74ed-3bf1004b984f.png)


indexを変更すれば次々と新しい画像が見れることに気づくと同時に、後々も確認したい時に使えるので、下記のようにCIFAR-10のデータを確認できる関数を作りまし。

```python
def show_sample_image(index,x_data,y_data):
  '''指定されたindexの画像データとラベルを表示する

    Args:
      index(int):指定インデックス
      x_data(numpy.ndarray):インプットデータ
      y_data(numpy.ndarray):アウトプットデータ
    Returns:
      
  '''
  CIFAR10_LABELS = ['airplane','automobile','bird','cat','deer','dog','frog','horse','ship','truck'] 

  print (f"index{index}：この画像は{ CIFAR10_LABELS[int(y_data[index])] }です.")
  display(array_to_img(x_data[index]))
```

もちろん、Google Colabを使っているので、CIFAR10_LABELSや引数にあるx_data,y_dataは不要ですが、今後Google Colabだけでなく、プログラムに落とし込む時のために依存しない関数にしています。
![スクリーンショット 2020-04-28 9.44.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44112/e8fcee75-2046-be73-253d-5f240122a013.png)

結構人間の目でも厳しいデータもあるし、対象のものだけでなくて背景画像もしっかり写ってるデータもあって、こんなデータでも学習できるのだろうか？っというイメージ。
Mbed Os2のSTM32ターゲットをMDK-ARMでビルドする。

#参照ページ
##環境設定
①Mbed OS 2のサポートがいつ終わっても良いようにローカル環境を構築する方法【改訂版】
https://qiita.com/toyowata/items/86a312158187cafe3f7d
##uvison projectの作成
Mbed 2のターゲットをMDK-ARMでビルドする
https://qiita.com/toyowata/items/6361aea538740c0eb860

#方法
##①SPIを使わない場合 
 MBEDのページからUVISIONへEXPORTをすればそのまま動く。

##②SPIを使う場合
###2-1.環境設定
bed OS 2のサポートがいつ終わっても良いようにローカル環境を構築する方法【改訂版】
で環境を設定する。
超簡略版
①.目標フォルダーでmbed delpoyを実行

```mbed delpoy```

②.git/mercuiralをインストール（source tree入れればokだと思う)

③.https://www.dropbox.com/s/p3pygps0uqfc5hq/mbed-e95d10626187.zip?dl=0のzipを解凍

###2-2.main.cppの作成というかコピー
main.cppをmbedのページからコピーする。
###2-3.とりあえずgccコンパイルする。

```mbed compile -m nucleo_f303k8 -t gcc_arm```

###2-4.stm32のu-visionのprojectを作成

```mbed export -m nucleo_f303k8 -i uvision5```

ちなみにここでnotify.infoの行がエラーになるのでコメント化
再度かける。

上記で完成するはず。
Rails + jQueryでフォームのチェックボックスで項目の表示/非表示を制御する

# はじめに

jQueryを使って、フォーム上に配置したチェックボックスで、フォーム上の項目（メソッド）の表示、非表示の切り替えを行えるようにする。

# 環境
- Vagrant + Ubuntu 16.04.5 LTS
- Rails 5.2.4.2
- slim
- jQuery
- Bootstrap4

# やり方

Viewに、このように記述する。
チェックボックス、ラジオボタンの類は、form-groupでも囲んでもエラーにはならないが、基本、checkboxで囲む。横並びにしたい場合は**row**を付ける。

```index.html.slim
.checkbox.row
        .col-sm-2
            = f.label :motouke, '区分', class: 'control-label'
        .col-sm-1
            = f.label :motouke, '自治体', class: 'control-label'
            = f.radio_button :motouke, 1, checked: true, id: 'motouke_kbn_1'
        .col-sm-1
            = f.label :motouke, '民間', class: 'control-label'
            = f.radio_button :motouke, 2, id: 'motouke_kbn_2'
```

セレクト項目で空白選択を許す場合は、**{include_blank: true}**をつけます。

```index.html.slim
.form-group.row
    .col-sm-2
        = f.label '都道府県', class: 'control-label'
    .col-sm-8
        = f.select 'j', options_for_select(['北海道','青森県','岩手県','宮城県','秋田県','山形県','福島県']), 
            		{include_blank: true}, 
                     class: 'selectpicker form-control', id: 'task_idx_j_sel'
    .col-sm-2
        = link_to '自治体検索', class: 'btn btn-outline-primary', id: 'task_idx_j_lnk'
```

jsファイルを作って、このように記述する。ラジオボタンが押されたイベントは、changeで拾う。項目を非表示にする場合は、**prop('disabled', false)**、表示にする場合は、**prop('disabled', true)**となる。**fadeIn()**にすると、フェードインのように、徐々に表れてくる。また、**fadeOut()**にすると、フェードアウトのように、徐々に消えていくようになる。少し見栄えをお洒落にしたい場合は使える。
因みに、**$("#task_idx_j_sel").attr('readonly', true);**を採用すると、項目が灰色にはなるが、カーソル移動できてしまうため、これはちと使えません。あしからず。

```app/javascripts/taskas_index.js
// 団体で自治体が選択された時
$(function() {
    $('input[id="motouke_kbn_1"]').change(function() {

        //選択したvalue値を変数に格納
        var val = $(this).val();
        if (val == 1) {
            // 入力可にする
            $("#task_idx_j_sel").prop('disabled', false);
            $("#task_idx_j_lnk").fadeIn();
        }
    });
});
```
見た目の動きはこんな感じ。自治体にチェックを付けると、セレクト項目が入力可で、ボタンも押下可です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/3864e3c1-f2f9-5f1a-d7d1-2372dd96402d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/67351d57-bb50-4522-1d9c-08c19ae9e636.png)

```app/javascripts/taskas_index.js
// 団体で民間が選択された時
$(function(){
    $('input[id="motouke_kbn_2"]').change(function() {

        var val = $(this).val();
        if (val == 2) {
            // 入力不可にする
            $("#task_idx_j_sel").prop('disabled', true);
            $("#task_idx_j_lnk").fadeOut();
        }
    })
})
```

見た目の動きはこんな感じ。民間にチェックを付けると、セレクト項目が入力不可になり、ボタンが非表示になります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/4127c454-d705-18c9-08bc-508076ad629f.png)
pigpioでリモートLチカ

# これは何？

raspberry piのGPIOをリモートから制御するためのテストプログラムです。
諸事情によりリモートでGPIOを制御する必要があり、急遽設定してみました。

# もろもろの設定から

詳しくは、[こちら](https://gpiozero.readthedocs.io/en/stable/remote_gpio.html)をどうぞ。


```sh:shell
$ cat /etc/systemd/system/multi-user.target.wants/pigpiod.service

[Unit]
Description=Daemon required to control GPIO pins via pigpio
[Service]
ExecStart=/usr/bin/pigpiod -l
ExecStop=/bin/systemctl kill pigpiod
Type=forking
[Install]
WantedBy=multi-user.target
```

起動します。

```sh:shell
$ sudo systemctl enable pigpiod
$ sudo systemctl start pigpiod
$ sudo systemctl status pigpiod

● pigpiod.service - Daemon required to control GPIO pins via pigpio
   Loaded: loaded (/lib/systemd/system/pigpiod.service; enabled; vendor preset: enabled)
  Drop-In: /etc/systemd/system/pigpiod.service.d
           └─public.conf
   Active: active (running) since Tue 2020-04-28 20:59:18 JST; 1h 16min ago
  Process: 3643 ExecStart=/usr/bin/pigpiod (code=exited, status=0/SUCCESS)
 Main PID: 3644 (pigpiod)
    Tasks: 4 (limit: 4915)
   Memory: 568.0K
   CGroup: /system.slice/pigpiod.service
           └─3644 /usr/bin/pigpiod

 4月 28 20:59:18 raspi4 systemd[1]: Starting Daemon required to control GPIO pins via pigpio...
 4月 28 20:59:18 raspi4 systemd[1]: Started Daemon required to control GPIO pins via pigpio. 
```

リモートPCにも、必要なモノをインストール。
私の場合は、Raspberry Pi 3なのでpigpioをインストール。


# LEDチカ

テスト用のプログラムです。

```py:python
import time
import pigpio

PI = pigpio.pi("リモート側のip address", 8888)

PI.set_mode(23, pigpio.OUTPUT)
PI.set_mode(24, pigpio.OUTPUT)
PI.set_mode(25, pigpio.OUTPUT)

try:
    while True:
        PI.write(23, 1)
        time.sleep(0.1)
        PI.write(23, 0)
        PI.write(24, 1)
        time.sleep(0.1)
        PI.write(24, 0)
        PI.write(25, 1)
        time.sleep(0.1)
        PI.write(25, 0)
except KeyboardInterrupt:
    pass
PI.set_mode(23, pigpio.INPUT)
PI.set_mode(24, pigpio.INPUT)
PI.set_mode(25, pigpio.INPUT)
PI.stop()
```

GPIO23,24,25にLEDを３つつないでいます。
ローカルホストから実行した場合は気になりませんが、リモートからの実行だと回線速度の影響と思われますが、動きがたどたどしくなります。

今回は100V電源のON/OFFのためのリレーの制御で、高速で切り替える必要はないため問題はありません。


![IMG_1171.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191337/17f78aa2-5110-aaa5-5a2d-6fd8d28ad954.jpeg)
画像の貼り付け方とサイズ変更　Rails　イメージタグ 


##Rubyでイメージタグを使い画像を表示する方法

```.rb

image_tag(画像ファイルへのパス, [, オプション or HTML属性 or イベント属性])

image_tag "icon.png", size: "16x16", alt: "アイコン"

```



例１　クラス名を指定してCSSで大きさを変更する場合。

```html.erb　例１

<%= image_tag 'icon.png', class:'icon' %>

```

```application.css
.icon{
  width: 80px;
  height: 80px;
}
```





例２　

```html.erb　例２
<%= image_tag 'dog.JPG', :size =>'320x480'　%>

```

'320x480'のxは小文字のエックスであることに注意！
Railsのルーティング(route)

##1.Railsルーター
Railsのルーターは受け取ったURLから、適切なコントローラ内アクションを行う。
ルーターは、「ビューで直接ソースコードの中に固定値をそのまま書き込んでしまう」ことを避けるためにパスやURLを生成することができる。


###URLを実際のコードに割り振る
Railsアプリケーションが「 GET /patients/17 」というHTTPリクエストを受け取ると、
リクエストは、特定のコントローラ内アクションにマッチさせるようルーターに要求しており、最初にマッチしたのが、
get '/patients/:id', to: 'patients#show'
だとすると、このリクエストはpatientsコントローラのshowアクション（def show）に割り当てられ、paramsには{ id: '17' }ハッシュが含まれているということである。

###コードからパスやURLを生成する
パスやURLを生成することもできる。

```ruby:ruby
#config/route.rb(ルーティング(viewなどでルーティングヘルパーを使用することが出来る as:))
get '/patients/:id', to: 'patients#show', as: 'patient'

#controllers/application_controller.rb(アプリケーションのコントローラ)
def show
  @patient = Patient.find(params[:id])
end

#views/tasks/show.html.erb(上記に対応するビュー)
<%= link_to 'Patient Record', patient_path(@patient) %>
```
これで、ルーターによって/patients/17というパスが生成される。これを利用することでビューが改修しやすくなり、コードも読みやすくなる。このルーティングヘルパーではidを指定する必要がない。

###rootを使う
rootメソッドを使うことで、Railsがルート'/'とすべき場所を指定できる。

```
root to: 'pages#main'
root 'pages#main' # 上の省略形
```
rootルーティングは、ルーティングファイルの先頭に記述する。rootは最もよく使用されるルーティングであり、最初にマッチする必要がある。また、rootルーティングがアクションに渡せるのはGETリクエストのみ。
<br><br>

##2.リソースベースのルーティング: Railsのデフォルト

```
resource :users
```
をroute,rbに定義すれば、上記一つを定義するだけで、Userコントローラー内に以下の7つのアクションroutesが自動的に作成される。

```
get '/users', to: 'users#index'
get '/users/new', to: 'users#new'
post '/users', to: 'users#create'
get '/users/:id', to: 'users#show'
get '/users/:id/edit', to: 'users#edit'
patch/put '/users/:id', to: 'users#update'
DELETE '/users/:id', to: 'users#destroy'
```
<br>
また、:onlyや:exceptオプションを使うと、特定のアクションのルートだけ作成できます。

```
#indexのルートのみ作成
resouces :tasks, only: [:index]

#editとupdateアクション以外の5つのルートを作成
resouces :tasks, except: [:edit, :update]
```

<br><br>
##3.RESTful
RESTfulはREST(REpresentational State Transfer)という設計原則に従うシステムのことを指し、どのようなインターフェイスが良いインターフェイスなのかということの指針です。

RESTの設計原則は、

1.HTTPリクエストはそのリクエストで必要な情報を全てもち、前のリクエストからの状態が保存されている必要がない。
2.個々の情報（リソース）への操作の表現がHTTPメソッドとして統一されている。
3.個々の情報（リソース）がそれぞれ一意なURIで表されている。
4.ある情報（リソース）から別の情報を参照したいときは、リンクを利用する。

Railsでは一般的なブラウザのサポートするGET/POSTだけでなく、PATCH,PUT,DELETEといったHTTPメソッドをサポートし、RESTfulなシステムでは、操作はHTTPメソッドで表現するものであり、URLで表現するものではありません。つまり、URLはなるべく情報（リソース）の名前を表す形にするという考えで作られています。

##4.ルーティングの確認方法
###$ rails routesコマンドを使って確認する
１つめの方法は、ターミナル上でrails routesと打つこと。
config/routes.rbに記載に記載された内容が反映された結果がターミナル上に表示される。

###localhost:3000/rails/infoにアクセスして確認する
rails serverでローカルにサーバをたてている状況であるならば、localhost:3000/rails/infoにアクセスすることでroutingについて表示することができる。GETやPOST、またxxx_pathのような表記もあるので実装中でも確認すると便利。

###config/routes.rbを直接読んで確認する
railsでは、config/route.rbにルーティングについての情報を書くため、こちらのファイルを直接見ることでルーティングについて知ることができる。github上で他の人が開発しているアプリのルーティングを確認したい時などはこの方法が有効で、scopeやname_spaceを活用すると良い。エディターを開いてコーディングしている途中であるならこちらを参照するのが早い。
<br><br><br>

参照
Railsガイド：https://railsguides.jp/routing.html