OmniAICreator/Qiita-1.07M huggingface dataset:
いきなりGit/GitHub(当方バージョン管理初心者でいきなりGit/GitHub！)

## はじめに
孤独にアプリ開発をしてきたこの8年、ようやくチーム開発をすることになり、Gitを急遽勉強する必要が出てきたため、記事にしようと思いました。殴り書きベースになると思いますが、長い目で更新し、Gitチートシートにしていきたいと思ってます。


## 主なコマンド一覧

|コマンド名|説明|
|---|---|
|status| 現在のファイル更新状況を表示　　　　　　　　　　　　　　　　|
|commit| インデックスされたファイルをローカルリポジトリにコミットする|
|branch| 現在のローカルブランチ一覧を表示する|
|checkout| ファイルをチェックアウト、指定したブランチに移動|
|-b| ブランチを作成|
|-1| ローカル/リモート ブランチ一覧を表示|
|--oneline| リモートブランチ一覧を表示|
|diff| ワーキングツリーとインデックスの差分を表示|
|--cached| インデックスとHEADの差分を表示|
|fetch| リモートリポジトリからデータを取得|
|--prune| リモートリポジトリのブランチの差分を整理する|
|log| ローカル履歴を表示|
|--oneline| リモートリポジトリのアクション履歴一覧を表示|
|-p| logの詳細|
|--graph --decorate --pretty=oneline --abbrev-commit| 自分ツリー&リモートオリジンツリーを表示 |
|--graph --decorate --pretty=oneline --abbrev-commit --all| 自分ツリー&他人のツリー&リモートオリジンツリーを表示|
|ls-files|git リポジトリのルートからのパスで表示|
|blame| blame ファイル名 でファイルの変更履歴を表示。 --abbrev=数値 で文字数を指定できる|

## show
status + diff といったところか。

## rebase

rebaseというコマンドは、様々な状況において使われるコマンドです。実践パターンが発生するごとに、随時追加していきたいと思います。

## mv
Linuxのmv同様リネーム出来る、そのあとコミットは必要
逆に言えば、

>手動でファイルを移動
 > git status
　> git add

を短縮できるってことでもあるような。

## rm

```
#ファイルも一緒に削除したいとき
$ git rm [削除したいファイル]

#ディレクトリごと削除
$ git rm -r [削除したいディレクトリ]

#ファイルを残したいとき(.gitignoreにも追記する)
$ git rm --cached [削除したいファイル]
```
コマンド後、リポジトリに反映するためにコミット。


## ローカルファイルを削除してしまった、やり直したい場合
最新のコミット(HEAD)からチェックアウトする

```
$ git checkout HEAD ファイル名
```

## HEAD

### HEADの種類
- HEAD：現在チェックアウトされているブランチの最新コミット
- FEACH_HEAD：　最後に取得したリモートブランチの最新コミット
- ORIG_HEAD：元の状態を復元するためHEAD
- MERGE_HEAD：マージ中のコミットが記録されるHEAD

## リポジトリ名変更

```
$ git br -m 元ブランチのパス 新ブランチのパス  
```

//package.jsonに変更があった場合には
$ yarn

でライブラリをインストール

//git staで以前のバージョンに戻したい

```
$ git checkout ファイルパス
```

## 直前のコミットを上書きする

```
//push後、さらにソースを修正
$ git add 修正したソース
$ git ci --amend
$ git push --force origin ブランチ名
```


## 現在のリポジトリを、masterでリベースする

```
$ git fep
$ git checkout 書き換えたいブランチ
$ git rebase origin/master
```

//確認ができたら 強制プッシュ

```
$git push -f origin features/add-circle-ci-#18
```

## コンフリクト系


(1)gitでブランチ切り替えようとしたらコンフリクト

```
$ git checkout [自分のbranch名]
```

エラー：
error: you need to resolve your current index first

```
$ git merge --abort
```

(2) git rebase 後に、元に戻す

エラー：

```
fatal: There is no merge to abort (MERGE_HEAD missing).
```

### 対応
```
$ git reflog
$ git reset --hard HEAD@{39}
$ git lola
```

### 無駄なコミットを削除する場合
```
$ git log --oneline (ハッシュ1) (コメント1)
(ハッシュ2) (コメント2)
(ハッシュ3) (コメント3) (省略)

//コメント1、2の履歴を削除する場合
$ git rebase -i (ハッシュ3)

pick (ハッシュ1) (コメント1) pick (ハッシュ2) (コメント2)

↓変更
drop (ハッシュ1) (コメント1) drop (ハッシュ2) (コメント2) :wq

//プッシュでリモートリポジトリを書き換え
$ git push --force origin features/
```


### 現在のブランチを最新マスタでリベースする

```
$ git fep
$ git co features/add-circle-ci-#18
$ git rebase origin/master

```


### rebase直前に戻る場合
```
$ git reset --hard ORIG_HEAD

```




## cherry-pick

調査中

##その他

###オプション
### commit
- a：git statusの追跡されてるコマンドを一括コミット。addを短縮できる




### log
- p：ログの詳細

### diff
HEAD：通常ワーキングツリーとインデックスの差分を出すdiffだが、これは、最新のコミットとツリーとの差分をだす



### .gitignore

``` 
*~
*.swp
```
などんp記述も可能
TeraTermのマクロをためしてみる

# まえがき
どの現場にもあるTeraTermですが、マクロを実行することが可能です。
https://ttssh2.osdn.jp/manual/ja/macro/

TTLファイルにマクロを記述して、TeraTermのインストールディレクトリにあるttpmacro.exeから実行することでマクロが動作します。

# 実行例
## 特定のファイルを監視する
tailコマンドで特定のファイルを監視するサンプルです。
基本的に接続したり、コマンドを送信したらプロンプトの文字列の受信を待つことになります。

コマンドの成否は「echo $?」を実行してエラーコードを読むことになると思いますが、waitだと「1」と「130」の区別がつかなかったのでwaitregexで行頭と単語の区切りを明確にしてチェックすることにしています。

```
user = "username"

prompt = "["
strconcat prompt user
strconcat prompt "@centos7"

constr = '192.168.80.131:22 /ssh /auth=password /passwd=pass /user="
strconcat constr user
connect constr

; プロンプトが表示されるまで待機
wait prompt

logopen "C:\dev\teraterm\test.log" 0 1
logwrite 'Log start'#13#10

; コマンド実行
; https://ttssh2.osdn.jp/manual/ja/macro/command/index.html
sendln 'tail -f /home/username/test/test.txt'

; プロンプトが表示されるまで待機
wait  prompt

; 直前に終了された終了ステータス
; https://www.gnu.org/software/bash/manual/html_node/Special-Parameters.html#Special-Parameters
sendln "echo $?"

; waitだと1に必ず引っかかってしまう
; https://ttssh2.osdn.jp/manual/ja/reference/RE.txt
waitregex  "^130\b" "^1\b"
if result = 2 then
    messagebox "not found" "error"
endif

logclose

; 確認せずに閉じる
disconnect 0
```

## ファイルの送受信
[scpsend](https://ttssh2.osdn.jp/manual/ja/macro/command/scpsend.html)でファイルの送信、[scprecv](https://ttssh2.osdn.jp/manual/ja/macro/command/scprecv.html)でファイルの受信を行います。
あくまで単一ファイルの送受信なのでフォルダを選択しても無駄です。

```text
user = "username"

prompt = "["
strconcat prompt user
strconcat prompt "@centos7"

constr = '192.168.80.131:22 /ssh /auth=password /passwd=pass /user="
strconcat constr user
connect constr

; プロンプトが表示されるまで待機
wait prompt

; ファイル送信完了を確認する
SOURFILE = 'C:\dev\teraterm\send\test.txt'
DESTFILE = '~/test/test.txt'

sendln "rm ~/test/test.txt"
;; ファイル送信
scpsend SOURFILE DESTFILE
;; ファイル送信プロセス確認
do
  mpause 5000
  sprintf2 str 'ps -ef |grep -v grep |grep -c scp'
  sendln str
  waitln '0' '1'
loop while result != 1
;; ファイル送信が完了すると次のマクロを実行
sendln 'echo SCP finish'


scprecv '/home/username/squash-tm.war.back' "C:\dev\teraterm\rcv\tmp"

;; マクロ終了
end
```

受信時は以下のダイアログが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47856/9fb9dd55-c095-cc0d-1ceb-eb681cb909fe.png)



# あとがき
単純なコマンド実行するだけならともかく、エラー処理等が面倒です。
やるなら、シェルスクリプトを転送して、難しい処理はそこで実行して、結果を受信するとかの方が楽そうです。
また、大量のファイルを送受信する場合はWinSCPの方が簡単そうです。
プロジェクト参画にあたり伝えたいこと

![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281353/51f202bc-4eaa-1c57-ad9e-0916dfd25594.png)
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281353/92deb062-d867-bc12-cb75-81a59c6fb6e6.png)
# SEの仕事にも色々
## 事業・サービス
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281353/6c261083-e4b7-d13a-89b8-c3f45a17b6ca.png)
## 要素
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281353/40972030-a86a-2702-0ebf-2ec26f270d9b.png)
## 分野
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281353/a367ff8d-0f23-c54e-1676-4c65fa3f03ba.png)
# 同じプロジェクトは存在しない
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281353/a9e501ff-a0e0-847d-b383-c228d85322d8.png)
# ステークホルダーと環境
## 環境
![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281353/a0e1d8d6-2c2e-4712-0731-8af00ecc5fb7.png)
## 案件
![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281353/85727c7b-f393-edf3-42bf-4417dd92f9ae.png)
# 開発手法
![9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281353/9a0b33d0-cd08-34bd-a50e-70091bc25dd8.png)
# 開発を遂行する
![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281353/387dcc8c-69e6-efa2-bb80-b4bb4b924419.png)
![11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281353/0a5ad714-ba66-e2a9-853c-ee9a66d0092a.png)
![12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281353/89f7cf5c-32ba-d551-e6aa-767f1dc25b34.png)
![13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281353/c8815224-acae-ae05-3fa4-37d9dcfb269f.png)
# 最後に
![14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281353/ed31b03c-7e38-c7e9-6046-70e99fc3d059.png)
# おまけ
## 開発環境を確認する
![15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281353/05582dbf-b575-6957-8fd0-bbb78ede7412.png)
## 予実をつけて、精度を上げる
![16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281353/7668f900-5cc1-5fe5-08f0-a5c0afb025a5.png)
dockerでelasticsearch、kibanaを使える環境を構築してみる

### 全文検索機能を利用する
業務で使うことがあったので、elasticsearchを勉強しようと思す。今回はdockerで簡単に構築してみました。dockerの使い方などは端折ります。
elasticsearchに投入するデータはwebサービスでランダムで作成したデータですので適宜用意してください。
今回は対象外ですが、前段にelasticsearchにアクセスするAPサーバーを用意し、elasticからデータを取得するようなアプリケーションも公開できたらなーと思ってます。

### 構成図
![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401463/cdda7ae1-e403-e848-5eae-f3f99b348bf2.png)

### 周辺のツール
- postgres
 - elasticsearchに流すデータソース
- logstash
 - postgresのデータを抽出しelasticsearchにデータを流し込むアプリケーション
- kibana
 - elasticsearchにモニタリングするアプリケーション

### 資材
下記からcloneしてください。
[github](https://github.com/funawo/elasticsearch.sample)


```docker-compose.yml
version: '2'
services:
  postgres:
    # 配下のinit_dataが初期データ。適宜用意してください。
    build: ./postgres
    ports:
      - 5432:5432
    environment:
      - POSTGRES_USER=postgres
    volumes:
      - ./postgres/data:/var/lib/postgresql/data
      - ./postgres/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
    container_name: postgres
  elasticsearch:
    build: ./elasticsearch
    ports:
      - "9200:9200"
      - "9300:9300"
    container_name: elasticsearch
    hostname: elasticsearch
    environment:
      - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
      - "http.host=0.0.0.0"
      - "transport.host=127.0.0.1"
      - "xpack.security.enabled=false"
  kibana:
    # image: docker.elastic.co/kibana/kibana:7.0.1
    build: ./kibana
    ports:
      - "5601:5601"
    container_name: kibana
    links: 
      - elasticsearch
  logstash:
    image: logstash:7.0.1 
    volumes:
      - ./logstash:/usr/share/logstash/pipeline
      - ./jdbc/postgresql-42.2.2.jar:/usr/share/java/postgresql-42.2.2.jar
    links:
      - elasticsearch
      - postgres
    ports:
      - '5044:5044'
      - '43448:43448/udp'
      - '9600:9600'
```
### kibanaの起動確認
docker-composeで起動後ブラウザで下記にアクセスするとkibanaが開く
http://<ホスト名>:5601
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401463/d7551431-ccf2-4703-d7de-ead9f70e8f64.png)
その後、左側のメニューの「Dev Tools」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401463/6a47c314-43a8-c467-bfdf-e9ad76e79e75.png)
この画面でクエリの確認ができます。
おそらくあなたのプログラミングには直接役立たないであろう言語仕様に関する自己満足記事のリスト

# なんこれ
This is a 自分用メモ。

はてなブログ「[yohhoyの日記](https://yohhoy.hatenadiary.jp/)」に書きためた7年8ヵ月分の記事（2019年9月現在）から厳選した、「ほとんどの人には役には立たないだろうけど結構頑張って調べて書いた記事」の一覧です。寸評付き。

## C++
- [same_asコンセプトとSymmetric Subsumption Idiom](https://yohhoy.hatenadiary.jp/entry/20190925/p1)
  - コンセプト設計のイディオム。使うは簡単、作るは大変。
- [コンセプト制約式の包摂関係とオーバーロード解決](https://yohhoy.hatenadiary.jp/entry/20190903/p1)
  - 新機能C++20コンセプトにまつわる深淵のほんの一端。C++まるでわからん。
- [ストリーム入出力と評価順規定の厳格化](https://yohhoy.hatenadiary.jp/entry/20180204/p1)
  - C++17で改善された言語仕様のお話。詳説は難解だが結論は単純。
- [std::launder関数](https://yohhoy.hatenadiary.jp/entry/20170817/p1)
  - C++17ライブラリに追加された謎の関数。C++ムツカシネー。
- [i = i++ + 1;の評価順規定](https://yohhoy.hatenadiary.jp/entry/20170104/p1)
  - C++17で調整された言語仕様のお話。マニアック度高め。
- [shared_ptr参照カウントとデータ競合](https://yohhoy.hatenadiary.jp/entry/20161217/p1)
  - C++17ライブラリの妙な変更が発端。マルチスレッドは人類には早すぎた。


## C

- [nan("is Not-a-Number")](https://yohhoy.hatenadiary.jp/entry/20190728/p1)
  - Cライブラリ関数nanとIEEE浮動小数点数NANの細かい話。にゃーん。
- [可変引数リストと文字列とヌルポインタの特別な関係](https://yohhoy.hatenadiary.jp/entry/20160224/p1)
  - printf的な関数引数でのNULLの取り扱い。こんなの知らんがな。


## Java
- [型推論と無限型(infinite type)](https://yohhoy.hatenadiary.jp/entry/20160913/p1)
  - Javaコンパイラえらい。型推論は人間のやる仕事ではない。


## Rust
- [危険な型変換:&T→&mut T](https://yohhoy.hatenadiary.jp/entry/20170317/p1)
  - Rustコンパイラの言うことはちゃんと聞きましょう。unsafeまじunsafe。


## Objective-C
- [Objective-C atomic属性プロパティとスレッド間同期](https://yohhoy.hatenadiary.jp/entry/20170304/p1)
  - 言語仕様とコンパイラ最適化とメモリモデルの三重闇。なんでこんな記事書いたんだ？
Microsoft.VisualC.CppCodeProvider()の謎

# お題

C#でC++コンパイルできないかなと思って
`Microsoft.VisualC.CppCodeProvider`
を使おうとしたが、噂通りやっぱり使えない話。

```

ハンドルされていない例外: System.NotImplementedException: メソッドまたは操作は実装されていません。
   場所 Microsoft.VisualC.CppCodeProvider.CreateCompiler()
   場所 System.CodeDom.Compiler.CodeDomProvider.CreateCompilerHelper()
   場所 System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource(CompilerParameters options, String[] sources)
   場所 CPPCodeProviderTest.Program.Main(String[] args)
```

# ILSpyで確認してみた
ILSpy.exeで見てみたら、下記の通り。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/40b6ce29-1776-66e2-560d-490647f8a1fc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/34c97b6e-0479-898c-4e53-48af16160c50.png)

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438183/8a28ce49-01a1-513a-4b1d-5da28e092754.png)


なんでこんな思わせぶりなものがあるのか・・・？
環境によるのか？
受け取った内容をファイルに吐くだけのスクリプト

## APIリクエストで意図通りにPOSTできてるか知りたい
開発しているとほぼ必ずAPIを叩く必要性が出てきますが、たまに「１アカウントにつき１回しか叩けない」APIの場合もあります。
[Mockoon](https://mockoon.com)というはちゃめちゃに便利そうなツールの存在を情弱ゆえ今さっき知ったのですが、到達確認ぐらいならこれでほぼほぼ事足りるでしょう。
しかし慣れてるフレームワーク等使っていればそんなに心配しないのですが、理解がいまいちの環境や言語だったりの時のAPI通信処理を書く時は自分は結構どきどきします。
POSTとかでBodyが意図通りに積めているのか確認したい、でもAPI自体はほいほい叩けないし…という時用に、積まれたBodyをファイルに吐くだけのPHPスクリプト用意しました。
ほぼ自分用備忘録です。

## スクリプト
`uploads`というディレクトリを事前に作っておき、受け取った内容を`result-JST-T-m-d:H-i-s.txt`形式のファイルに書き出すだけです。
ドキュメントルートとかにおいてローカルサーバー立ち上げて使ってます。

```sample_api.php
<?php
header("Access-Control-Allow-Origin: *");
header('Access-Control-Allow-Headers: Origin, Authorization, X-Requested-With, Content-Type, Accept');

date_default_timezone_set('Asia/Tokyo');
$file_path = "uploads/result-" . date('T-m-d:H-i-s') . '.txt';

$json_string = file_get_contents('php://input'); 
$result = file_put_contents($file_path, $json_string);
echo($json_string);

if ($result) { 
    echo json_encode([ 
        'success' => true,
        'message' => ''
    ]);
} else {
    echo json_encode([ 
        'success' => false,
        'message' => 'error'
    ]);
} 
```

### 構成例
```
$ tree
.
├── sample_api.php
└── uploads
    ├── result-JST-09-08:18-24-37.txt
    └── result-JST-09-08:19-17-29.txt
```

## 感想
適当にStub用のAPIプロジェクト作ってRunさせておけば万事解決だと思うんです。
それを面倒くさがった結果余計めんどくさそうなことをしていました。
自覚はあります。学ぼうと思います。
[バッチ] for と 「/f "tokens=〇"」 を使って、スペース区切りの文字列の必要列だけ取り出す

# 関連記事

https://tera1707.com/entry/2022/02/06/144447

# やりたいこと
各種コマンドを使って取ってきた情報から、1行丸ごとではなく、必要な情報というか要素だけ取り出したい。

例えば、[以前](https://qiita.com/tera1707/items/e1a73f09ebc14fd2b5f8)試した`dir`で一覧として出るファイル・フォルダから`find`でいるものだけ絞ったあと、そのファイル・フォルダの更新時間を取り出したい、などの場合。(下記のイメージ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/99425c34-6bd2-8402-eeac-93c0eaeb5bc9.png)

# やり方
`for`文を使う。

# forの原型

```
for [オプション] %%アルファベット１文字 in (ループの対象) do (
    処理
)
```

この中の「ループの対象」には、例えばdirなどのコマンドを入れることができる。
そのコマンドの結果が「%%アルファベット１文字」に入るイメージ。
**(forといえばループだが、ループのためではなく「コマンドの戻り値を採る」ために使う)**

# 具体的な例
今回は、dirで取得したファイル・フォルダ一覧から「target.txt」の行を取り出し、その中から時間の文字列を取り出す、ということをする。下記のバッチで取り出せる。

```
@echo off
FOR /F "tokens=2" %%A IN ('dir ^| find "target.txt"') DO (
    ECHO update time is %%A
)
pause
```

```output.txt
update time is 22:09
```

# 説明

### トークン

`for`のオプション`/f`には、「トークン」というものを指定できる。
トークンには、下記のようなものがある。[参考](https://qiita.com/sawa_tsuka/items/67be34bab1fdf3fb87f9#6for%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E6%A7%8B%E6%96%87-f%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E4%BB%A3%E5%85%A5%E3%81%99%E3%82%8B-)

- tokens= 何番目のトークンを指定するか？
- delims= トークンの区切り文字を指定
- eol= この文字から始まる行を無視
- skip= 先頭から指定された行数、スキップする。
- usebackq コマンドの出力を対象にする

その中の`tokens`を使用する。

### tokens
`tokens`に2を指定すると、「スペースで区切られた文字列の2番目のものをとって、%%Aに入れる」という意味になる。

上の例だと、`dir ^| find "target.txt"`でとってきた1行の文字列の、スペース区切りの2番目を採ることになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/d3a530af-f723-7d52-0dae-e7215b61adba.png)

### ループの対象(＝コマンド)
下記のかっこの中には、戻り値を取得したいコマンドを書く。

```
FOR /F "tokens=2" %%A IN ('dir ^| find "target.txt"') DO (
```

**※注意**
forの中で、パイプを使って`dir`→`find`とデータを渡したいときには、「|」の横に「^」をつけないと動かなかった。(普通は「｜」だけでよく、^はいらない)

### 処理
コマンドの結果が`%%A`に入ってくるので、それを使った処理を書く。
この場合は、%%Aに時間の文字列が入ってくる。

```
ECHO update time is %%A
```

# 実際にこれを使ったとき
実際には、下記のような場面でこの方法を使った。

- diskpartで、ボリュームの一覧を取得
- その中で「MYVOLUME」というラベル名のボリュームを探す。
- そのボリュームに「T]というドライブ？レターを付与する
- そのドライブ(Tドライブ)に移動(cd)する

```
@echo off

ECHO list volume  > %~dp0listvolume.txt
diskpart /s %~dp0listvolume.txt


FOR /F "tokens=2" %%A IN ('diskpart /s %~dp0listvolume.txt ^| find "MYVOLUME"') DO (
    ECHO select volume=%%A > %~dp0selectvolume.txt
)

ECHO assign letter=T > %~dp0selectvolume.txt
del %~dp0selectvolume.txt
del %~dp0listvolume.txt

cd /d T:

pause
```

※各コマンド(diskpartなど)については割愛。

※diskpartでラベル名とそのボリューム番号は取れてるのに、ボリューム番号だけ取得できるような便利機能がなかったため、この方法で取得した。

※diskpartでは下記のようなデータが取れるので、その中の「Volume 0」の「0」だけ取りたかったイメージ。(図は上のサンプルと別環境なので「MYVOLUME」はない)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/8b527a9a-fd3e-27bb-6b17-ad29a32c95db.png)



# 参考
.bat（バッチファイル）のforコマンド解説。
https://qiita.com/sawa_tsuka/items/67be34bab1fdf3fb87f9
→この記事さえ見ればすべてわかる感じです。
プログラミング初心者によるPHP配列、連想配列まとめ

PHPで用いる配列の概念を忘れてしまってたので復習の為に再度アウトプットする。


①配列...一つの変数に複数のデータを管理する。箱を中にデータを保管するイメージ。PHPではarrayを使って記述する。
配列のデータは先頭から0,1,2...と割り振られておりこの番号を”インデックス番号”と呼ぶ。
複数のデータを纏めて管理できる為、大量のデータを扱うときに使う事が多い。

例

```
$names = array('Hahakigi','Ai','You');
```
配列のデータの取り出し方

```
echo $name[0]; //結果:Hahakigi
```
[]内にインデックス番号を指定してechoで出力した結果、配列のデータのHahakigi要素を取得。



値の上書き

```
$names[0] = 'Nitta'; 
echo $names[0]; //結果: Nitta
```
既に存在してるインデックス番号を指定して要素を代入すると上書きされる。



値の追加

```
$name[] = 'Momo';
echo $name[3]; //結果:Momo
```

配列に新たに追加したい値を代入して、echoでインデックス番号を振ると無事追加。


②連想配列...配列で記述した箱と同じイメージだけど、連想配列ではデータを入れた後の扱いがわかりやすくする為に配列で言うインデックス番号ではなく、名前を付けてその名前ごとデータを取り出すことが出来る。通常の配列より使い勝手がいいので汎用性が高いと個人的には思う。

下記のコードで'Hahakigi'の部分をキーと呼び、"100点"を値と呼ぶ

例

```
$names =array(
  'Hahakigi' ='100点',
  'Ai' => '80点',
  'You =>'90点',
);
```
キーと値を結びつけるのは "=>"と書く。
 
値の取り出し方

```
echo $names['Hahakigi']; //結果:100点
```

値の追加

```
$name['Momo'] ='80点';
```
配列名の[]に追加したいキーを書いて"="で追加の値を書く。



③PHP5.4以降からは短縮して構文を書けるようになった

配列の場合

```
$names =['Hahakigi','Ai','You'];
```

連想配列の場合

```
$names = [
         'Hahakigi' =>'100点',
         'Ai' => '80点',
         'You' => '90点'
      ];
```

この配列の内容をforeach文を使ってループで取り出すことが出来るけどそれはまた後日まとめる。
個人的に思うことは構文を覚えるのではなくその概念を覚えてた方が楽だし、学習も効率的に学べそう。構文はネットでググればいくらでも出てくるし、本当概念は大切だと思うからしっかり脳に定着させていきたい。
【R】MeCabで形態素解析

# 形態素解析とは

* 文法的な情報の注記の無い自然言語のテキストデータ（文）から、対象言語の文法や、辞書と呼ばれる単語の品詞等の情報にもとづき、形態素（Morpheme, おおまかにいえば、言語で意味を持つ最小単位）の列に分割し、それぞれの形態素の品詞等を判別する作業である。（※Wikipediaより）

# 実行環境

* Windows環境（Windows10, 64bit）で以下の処理を実行しました。

# 下準備

以下の通り、2019/02/25時点で最新版のソフトウェアを利用しました。

1. [R](https://cran.r-project.org/bin/windows/base/)のインストール
 * R-3.5.2を利用しました。
2. [MeCab](http://taku910.github.io/mecab/)のインストール
 * 「Binary package for MS-Windows」のmecab-0.996.exeを使ってインストールしました。
 * このWindows版にはコンパイル済みのIPA辞書が含まれているため、この辞書をそのまま活用して解析に使いました。
3. RMeCabパッケージのインストール。
 * Rを起動した後、以下のコマンドを実行してインストールしました。
4. パッケージの読み込み
 * ツールバーの［パッケージ］から［パッケージの読み込み］へ進み、開いたウィンドウ（※ウィンドウ名は"Select one"）からRMeCabを選択します。

```r:Rのコンソール
# RMeCabのインストール
> install.packages("RMeCab", repos = "http://rmecab.jp/R", dependencies = TRUE) 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/312166/3e620ec0-6d05-5cb4-c4ca-9ced7202a907.png)

# 解析するテキスト

* [Qiitaとは](https://qiita.com/about)のページから、以下の文言を拝借しました。

```text:qiita.txt
Qiitaは、プログラミングに関する知識を記録・共有するためのサービスです。
絵文字やシンタックスハイライトなど、豊富な機能を備えたMarkdown記法を使って、簡単に記事を投稿できます。
記事に付けたタグや、投稿したユーザ、ストック数、投稿日時の指定など、強力な検索機能で記事を探し出せます。
プログラミングに関する様々な分野のユーザ達と、知識を共有し、意見を交わすことで、より多くの知識を生み出しましょう。
```

# 解析処理

* RMeCabFreq関数を使って、qiita.txtを形態素解析した上で、形態素ごとの出現回数をカウントします。
 * [こちらのサイト](http://www.ic.daito.ac.jp/~mizutani/mining/rmecabfreq.html)によると、RMeCabFreqは「関数 RMeCabFreq( ) は指定されたテキストファイルを形態素解析して、その活用形を原形に変換した上で、その頻度を数えて、結果をデータフレームとして返す関数である。」と定義されています。
* 次にRMeCabFreq関数の結果として得られたデータフレームを、「品詞が名詞」に絞り込んだ上で、出現回数の降順にしています。

```r:Rのコンソール
# 解析処理
> res <- RMeCabFreq("D:/qiita.txt")
> res <- res[res$Info1=="名詞",]
> res <- res[order(res$Freq, decreasing=T),]
```

# 解析結果

* 「投稿」「記事」「プログラミング」「共有」など、Qiitaらしい語句が並んでいます。

```r:Rのコンソール
# 解析結果
> res
             Term Info1        Info2 Freq
38           投稿  名詞     サ変接続    3
45           記事  名詞         一般    3
47           知識  名詞         一般    3
31 プログラミング  名詞     サ変接続    2
33           機能  名詞     サ変接続    2
35           共有  名詞     サ変接続    2
43         ユーザ  名詞         一般    2
29       サービス  名詞     サ変接続    1
30       ストック  名詞     サ変接続    1
32           意見  名詞     サ変接続    1
34           記録  名詞     サ変接続    1
36           検索  名詞     サ変接続    1
37           指定  名詞     サ変接続    1
39       Markdown  名詞         一般    1
40   シンタックス  名詞         一般    1
41           タグ  名詞         一般    1
42     ハイライト  名詞         一般    1
44         絵文字  名詞         一般    1
46           記法  名詞         一般    1
48           日時  名詞         一般    1
49           分野  名詞         一般    1
50           簡単  名詞 形容動詞語幹    1
51           強力  名詞 形容動詞語幹    1
52           豊富  名詞 形容動詞語幹    1
53           様々  名詞 形容動詞語幹    1
54          Qiita  名詞     固有名詞    1
55             数  名詞         接尾    1
56             達  名詞         接尾    1
57           こと  名詞       非自立    1
58           ため  名詞       非自立    1
59           多く  名詞     副詞可能    1
```

# おわりに

* ずっと書きかけのままストックしていた記事だったので、記事の投稿時点では環境などがやや古くなっていると思います。
可変長引数のビット幅を間違った際の挙動

## 背景

libcurlには可変長引数のAPIがあるが、整数の渡し方で、64bitマシンでは動くが32bitマシンでは動かず、えらい目にあった。

## 検証プログラム

gcc -O2 -m32 va.c
clang -O2 -m32 va.c

※%llxを使っているので、WindowsはWindows7以降のみ有効です

```c:va.c
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

void va(int x, ...){
    va_list arg;
    va_start(arg, x);
    printf("%016llx\n",va_arg(arg,int));
    printf("%016llx\n",va_arg(arg,int));
    printf("%016llx\n",va_arg(arg,long));
    printf("%016llx\n",va_arg(arg,long long));
    printf("%016llx\n",va_arg(arg,long));
    va_end(arg);
    
}
int main(){va(1,(long long)2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0);}
```

## 結果

### Linux/FreeBSD/Darwin gcc/clang m64

- long longをintで受けるなど無茶苦茶なことをやったにもかかわらず、すべてきれいに出力された。long longに昇格されているのだろうか。
- FreeBSD(さくらのレンタルサーバー)でも同様であった。

```
0000000000000002
0000000000000003
0000000000000004
0000000000000005
0000000000000006
```

### Linux/FreeBSD gcc/clang Darwin gcc m32

- intで受けた場合、上位8バイトは初期化されない。加えて、long longで送った2の上位8バイトが次のint受け取りにフレームシフトした。
- なお、clangや、mingw-w64/wineの組み合わせでも同様の結果が得られた。

```
f77b292000000002
f77b292000000000
f77b292000000003
0000000500000004
0000000500000006
```

### Darwin clang m32

- ごみが0x0cになっているが原因は不明である。

```
0000000c00000002
0000000c00000000
0000000c00000003
0000000500000004
0000000500000006
```

### Win64 MSVC100

- ほとんどLinuxと同じでしたが、long longを引っ張ったところでごみが出てしまった。intを8bytes境界に載せているだけなのかもしれない。
- long longにキャストして送るようにしたらゴミは出なかった。
- MSVC140ではどうなんだろう。試してませんが。。

```
0000000000000002
0000000000000003
0000000000000004
00007ff600000005
0000000000000006
```

### Win32 MSVC100

- long longで受け取らないとかならずゴミが出るが、ゴミのパターンはLinuxと異なる。
- なお最初の1は引数に依存しないようだ。

```
0000000100000002
00ea20c800000000
00ea20c800000003
0000000500000004
00ea20c800000006
```

## 結論

可変長引数のAPIを使う場合は普段以上に型に気をつけましょう…。
GitHubでリポジトリを先に作ってローカルのプロジェクトをコミットできるようにする

## はじめに
いつもうろ覚えでやってなんかうまくいかなくて結局ググってしまうので、そうならないための覚書きです。
スマートなやり方ではないかもしれませんが板についてしまっているのでそこはお好みで対応してください。

## 必要なもの
#### GitHubアカウント
作ってください。
#### Git
入れてください。
[ここから飛んで、どうぞ。](https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
#### コミットしたいプロジェクト
作ってください。

## GitHubでローカルリポジトリの作成
順番が逆かもしれませんが自分はいつもこうしてます。

GitHubの右上にある「＋」のプルダウンを開いて`New repository`をクリックしましょう。

名前はなんでもいいですが、プロジェクト名にしておくといいです。

決まっていないなら「portfolio」とかでいいと思います。あとで変更できますし。

特段、詰まるところもないのでサクサク進めましょう。

## プロジェクト側の準備
次はプロジェクトをコミットできるようにしましょう。

ここら辺は調べたらすぐ出てきますので理由なくコマンドだけ連ねます。
コマンドの意味が知りたい人は勝手に調べてください。

```
$ cd プロジェクトディレクトリ
$ git init
$ git add . #git add -A でも可
$ git commit -m "最初のコミットだよ"
$ git status #なんか出ます
```

とりあえずここまで。
端末はそのままにしておいてください。


## GitHub(リモートリポジトリ)とローカルを紐づける
ここで、GitHubの自分のプロジェクトのページに戻ってみてください。

グリーンのボタンで`Clone or download`というものがあるはずです。

そこをクリックして`https://`から始まるURLを丸々コピーしてください。

横のボタンで勝手にクリップボードにコピーされます。

コピーしたら端末に戻って

```
$ git remote add origin コピーしたURL
```

としてください。

これで

- Gitへのステージング
- GitHub(リモートリポジトリ)とローカルの紐付け

が完了しました。
基本、この流れでなんとかなります。
clone するときはもう少し簡単です。

## GitHubにpushする
全人類待望の瞬間です。

決意を持って以下のコマンドを叩きましょう。

```
$ git push -u origin master
```

...どうでしたか？
うまくいっていればいいのですが。

## pushできないなら

もしかしてこんなエラーが出ましたか？

```
To https://github.com/アカウント名/プロジェクト名.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/アカウント名/プロジェクト名.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

rejected...拒否されていますね。
ですが、落ち着いてください。

他にも色々書いてありますね。

「git pull してからまたpushしてね」

この通りにすればよさそうですが…
すべては額縁通りとは限りません。

覚悟を持って以下のコマンドを打ち込みましょう。

```
$ git fetch && git merge --allow-unrelated-histories origin/master
```

何をしているかは此処では語りませんが、要はリモートとローカルでちょっとした食い違いがあるのでそれを解消しているだけです。

さあ、今度こそ。

```
$ git push -u origin master
```

...決意で満たされましたか？
赤や黄色の文字が出なければ貴方の勝利です。

GitHubに戻ってリロードしてみましょう。

Codeの「X commits」タブにプロジェクトのファイル等があれば成功です。

## これ以降は
これが終わればもう何も気にすることはありません。

そのプロジェクトが個人開発であれば、の話ですが。

これ以降は
1. addする
2. commitする
3. pushする

で終わりです。日々、草を生やしましょう。vvv

```
$ git add ファイル名
$ git commit -m "コメント"
$ git push
```

## おわり
一時間ぐらいでばーっと書いたので抜け漏れあるかもしれません。

力になれれば嬉しいです。

よければTwitterフォローしてください。
ngrokで複数ポート開いてWebSocketで通信する

# これまでのあらすじ
スマホのブラウザ上で加速度データを取得してWebSocketでサーバに送りたい！
↓
センサーデータを取得するためにはhttpsじゃないと動かない…
↓
ngrokを使ってhttpsで立てちゃお
↓
クライアント用と通信(wss)用とで2つhttpsが必要になったぞ

# ngrokで複数ポートhttpsで立てる
ngrokのサイトにログイン
[ngrok \- secure introspectable tunnels to localhost](https://ngrok.com/)
Setup & Installation > 3 Connect your accountをコピペしてターミナルで実行→設定ファイルに認証情報が追記される

さらに手動で設定ファイルを書き換える
各OSにおける設定ファイルの場所はこちら
[Default configuration file location _ ngrok – documentation](https://ngrok.com/docs#config-default-location)

```yml

authtoken: xxxxxxx

tunnels:
  client:
    addr: 8000
    proto: http
  wss:
    addr: 3000
    proto: http
```
ターミナルから名前を指定してngrokを起動
この場合はclientとwss

```
ngrok start client wss
```
8000番ポートと3000番ポートが同時にhttpsで利用できる！やったー

# WebSocketでのopen
```javascript
var sock = new WebSocket('wss://xxxxx.ngrok.io'); // 3000番ポートを利用

// 接続
sock.addEventListener('open', function (e) {
    console.log('Socket 接続成功');
});
```

クライアントは8000番ポートで立ち上げればOK

# 参考リンク
* [5分で動かせるwebsocketのサンプル3つ \- Qiita](https://qiita.com/okumurakengo/items/a8ccea065f5659d1a1de)
* [ルーターを超えてリモートホストに接続できる ngrok（無料）を使って Raspberry Pi を IoT ハブにする方法](http://netbuffalo.doorblog.jp/archives/4974284.html)
Githubでマージしたら自動でブランチを削除する設定ができる

今まで、マージをしたら毎回ブランチ削除をぽちぽち押していたのですが、マージをしたタイミングで削除をしてくれる設定があるようです。
リポジトリのsettingからできるようなので、これはやっておいたほうが良さそうです。

参考
[ブランチの自動的削除を管理する](https://help.github.com/ja/articles/managing-the-automatic-deletion-of-branches)
[Rails]params[:id]に値を渡す


簡易ブログアプリ作成中に起きたエラーで詰まったので記録。

#詳細、編集、削除画面に遷移しない

ブログの投稿機能も作成し、いざ詳細画面を作ろうと
viewファイルを作成して、link_toでリンク先も作成し、コントローラーで
アクションも定義したのに、エラーになりました。

エラー内容は「Couldn’t find Blog with ‘id’ = :id」

<img width="996" alt="スクリーンショット 2019-09-11 22.20.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455858/a264a1f6-1752-c9e7-32f5-4c82360d26e0.png">

```
app/views/blogs/index.html.erb
  <%= link_to "詳細", "/blogs/:id", method: :get %>
```
```
qpp/controllers/blogs_controller.rb
  def show
    @blog = Blog.find(params[:id])
  end
```
idが見つからない？
findメソッドを使ってparams[:id]を取得するように定義しているのに？

rake routesを確認したら、ルートパスも合っているし
何が原因なのかさっぱり検討がつきません。
findメソッドでの記述の仕方を変えてみたり、find_byメソッドに変えてみたり
whereメソッドにしてみたり。
試しても結果は変わらなかったので、次はviewファイルのパスが間違えていると考えてルートパスを色々変更してみるも結果は変わりませんでした。

ここあたりで ~~変数~~ paramsにid(値)が入っているのか？と思い始めるようになり（遅い）
binding.pryを使って確認しました。

結果は下記の通りになりました。

id = ":id"
idがidのままになっていて値になっていませんでした。

viewからコントローラにidを渡す時に値を指定しないといけないようでしたので
viewファイルに以下の指定をしました。

```
app/views/blogs/index.html.erb
<%= link_to "詳細", blog_path(blog.id), method: :get %>
<%= link_to "リンク名", アクション名_コントローラ名_path(渡したい変数名) %>
```

これで解決しました。
idを指定してあげないと値として受け取れなかったんですね。
今までは:idと書けば値として取得してくれていたので良い勉強になりました。

参考
https://poyopoyo0.hatenablog.com/entry/2016/02/29/100431
githubでユーザ名を変えてローカルですること

githubのユーザ名を変えたいと思って、難しそう・面倒そうと思ってやってこなかったのですが、意外にも簡単だったのでメモ。

githubの画面右上からsetting=>account=>change nameで変更するだけ。

もっと、いろいろ画面上でリポジトリ毎に、操作しなくてはいけないと思っていた。

git pull や git push しようとするときにエラーになるので次のコマンドでローカルの設定をgithub上で変更したユーザ名に変えておく。

```bash
git config --global user.name 'NEW_NAME'

// これで今の設定を確認できる
git config --global -l
```

大変参考にさせていただきました。
[GitHubのユーザー名を変更してみた \- 一から勉強させてください\(￣ω￣;\)](https://dangerous-animal141.hatenablog.com/entry/2014/05/05/000000)
Windows10移行

「Windows10移行」について、Qiita内で盛り上がっていると思っていました。
完全に乗り遅れを、実感しています。リンクを集めました。
アップグレードは、わからないし,
動かすのも面倒だし、一度にwindows7を全部捨てる訳にいかないので、
「置き場所」からです。
#情報が古い可能性がありますのでご注意ください。
(参考)RICOH＞Windows 10 移行支援サービス＞Windows移行の工程を、14のステップ/4分類化したサービス
https://www.ricoh.co.jp/service/migration/ 
(参考)Windows10への移行時にやっておくといい事
https://qiita.com/Ingward/items/003c2c28b9ad20802fff 
(参考)Windows 10にアップグレードしたら無効化しておきたい7つの設定
https://ottan.xyz/windows-10-disable-4559/ 
(参考)[windows7]転送ツールを使ってデータ移行する方法(memo)
https://qiita.com/ai-2723/items/afaac7e7ccd186ddd8ed 
(参考)「Windows 10 20H1」新テストビルド、新しい「Cortana」など強化
https://japan.zdnet.com/article/35142357/
ExcelVBA と GoogleSpreadSheet で「3×5=15」をマクロ記録で作成してみた。

#ExcelVBA
```
Sub s3kakeru5()
    Range("B3").Select
    ActiveCell.FormulaR1C1 = "3"
    Range("B4").Select
    ActiveCell.FormulaR1C1 = "5"
    Range("B5").Select
    ActiveCell.FormulaR1C1 = "=R[-2]C*R[-1]C"
    Range("B6").Select
End Sub
```
#GoogleSpreadSheet
```
function _3kakeru5() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('B3').activate();
  spreadsheet.getCurrentCell().setValue('3');
  spreadsheet.getRange('B4').activate();
  spreadsheet.getCurrentCell().setValue('5');
  spreadsheet.getRange('B5').activate();
  spreadsheet.getCurrentCell().setFormula('=B3*B4');
  spreadsheet.getRange('B6').activate();
};
```

初回GASのエラーがでます。
「
承認が必要
このドキュメントに添付されたスクリプトを実行するには、あなたの許可が必要です。
続行 キャンセル
」
(参考)Google Apps Scriptの初回実行に必要となる承認手順
https://www.virment.com/step-allow-google-apps-script/
vmstatコマンドまとめ

#できること
メモリ,スワップ,CPU,IO(ブロック数)のシステム全体の確認
vmstat（virtual memory statisticsの略）

#実行結果
使い方：　`vmstat [表示間隔秒] [更新回数]`

最初の行：システムが起動してからの平均値が記載される。
２回目以降の行：各測定時の値が表示される
一般ユーザーで実行可能
memoryとcpuの項目はtopコマンドでも確認可能

```
$ vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0   5896 137316      0 231524    0    0    23     8  260  450  1  1 98  0  0
 0  0   5896 137332      0 231524    0    0     0     4   33   73  0  0 100  0  0
 0  0   5896 137332      0 231524    0    0     0     0   29   51  0  0 100  0  0
```

表示項目|説明
----|----- 
r  |実行待ちプロセス数
b   |スリープ（割り込み可能）のプロセス数
swpd   |スワップサイズ（KB）
free   |空きメモリ（KB）
buff  |バッファメモリサイズ（KB）
cache   |キャッシュメモリサイズ（KB）
si   |ディスクからスワップインされているメモリサイズ（KB/秒）
so    |ディスクへスワップアウトされているメモリサイズ（KB/秒）
bi    |ブロックデバイスから受け取ったブロック数（ブロック/秒）
bo   |ブロックデバイスに送られたブロック数（ブロック/秒）
in   |割り込み回数/秒
cs |コンテキストスイッチ回数/秒
us |ユーザプロセスのCPU使用時間割合
sy |カーネルの　　〃
id |CPUがアイドル状態の時間割合
wa |CPUがI/O待ちの〃
st |ゲストOSがCPUを割り当てられなかった時間の割合

#参考
Vmstat の出力結果はどのように解釈すれば良いですか?（Redhat HP）
https://access.redhat.com/ja/solutions/3054501
【AWS】AdminのIAMユーザ作ってみる

# IAMユーザ作成

### 前提
- 無料利用枠使用

## 1.  AWSコンソールからIAMメニューを開く。
![NoName_2019-9-11_21-58-36_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/c13d7615-ed38-ca97-e749-5d95e5ea75a6.png)

## 2. 以下作業を実施。
- ユーザ名を設定。
- アクセスの種類を"AWSマネジメントコンソールへのアクセス"を設定。
- コンソールのパスワードをカスタムパスワードを設定。(ログイン時のパスワード更新をOFFに。)
![NoName_2019-9-11_22-0-33_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/0b8f8a2a-5387-d000-d8e4-6ae758f69d01.png)

## 3. ユーザをグループに追加のまま、"グループの作成"を選択。
![NoName_2019-9-11_22-1-8_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/11a2c54e-e667-ce4d-d9a3-31bc42453554.png)

## 4. グループ名を設定し、ポリシーのフィルタを"AWSのジョブ機能"を選択。
![NoName_2019-9-11_22-6-19_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/d2085993-1fdc-dfab-139f-08caf8d492fc.png)

## 5. "AdministratorAccess"にチェックをつけ、"グループの作成"を選択。
![NoName_2019-9-11_22-6-51_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/0adca69b-74cd-6dbb-5a32-70d0d2396b38.png)

## 6. 作成したグループがアタッチされていることを確認し、"次のステップ:タグ"を選択。
![NoName_2019-9-11_22-8-7_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/61df6b70-2d53-0acc-7c0a-b181d0e1baca.png)

## 7. "次のステップ:確認"を選択。
![NoName_2019-9-11_22-8-32_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/b327f85d-c477-5b36-10fe-6a01663ffd62.png)

## 8. "ユーザの作成"を選択。作成したIAMユーザでログインできることを確認する。
![NoName_2019-9-11_22-8-58_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/e550e21d-8035-41ef-a655-185190826796.png)
9/11 Tech Expert (事前学習) day 12　/　eachメソッド

【学習アウトプット】

今日の目標(やること)
Ruby!!!

#今日のまとめ
##配列オブジェクトから指定した順番の要素を取得

```rb
配列オブジェクト[順番(数値)]
```
```rb:例
animals = ["いぬ", "ねこ", "ねずみ"]
puts animals[0]                    # => "いぬ"
```

配列オブジェクトの順番は0から始まる
(一番最初の要素を取得するには配列オブジェクト[0])

配列で要素数より大きい順番の要素を取得しようとするとエラーになる
（要素数が３つしかないのに対し、「５番目！！」と処理をしようとしても、存在自体していないから、エラーとなる。）



##eachメソッド
配列に含まれる要素を1つずつ取り出して繰り返し処理が実行される。（インデックス番号0から順番に。）
＝配列の要素の数だけ処理が行われる。
配列オブジェクトに。

```rb
配列オブジェクト.each do |変数|
    # 処理
end
```

```rb:例
animals = ["いぬ", "ねこ", "ねずみ"]
animals.each do |animal|
  puts animal
end
```



要素の数だけ繰り返されているかも、以下のプログラムで確認。
繰り返しの処理が実行される度に、変数numberに1を足していく。

 ```rb:例
animals = ["いぬ", "ねこ", "ねずみ"]
number = 0
animals.each do |animal|
  puts animal
  number = number + 1
end
  puts "#{number}回繰り返しました"
```

要素数は3つなので、処理は3回実行され、numberの値は3になる。


##〜独り言(まとめやら感想やら)〜

Ruby全ては出来なかったけどキリのいいところまで出来てよかったぁｗ
明日総復習してクーリングオフ！
Techさんお世話になりました！！
サブスクリプションについて(Swift)

#サブスクリクションとは
サブスクリクションは配列や辞書などのコレクションの要素へのアクセスを統一的に表すための文法です。

##定義方法
以下が定義文になっています。
subscriptキーワードに続けて引数と戻り値の型を指定し、{}内にgetとsetでゲッタとセットを定義すればサブスクリクションの雛形の完成です。
アクセス修飾子で制限された値を参照するときのように、getで参照してsetで更新するような感じです。

```
subscipt(引数) -> 戻り値の値 {
　//ゲッタ
  get {
    return文によって値を返す処理
  }
　//セッタ
  set {
    値を更新する処理
  }
}
```

##サンプルコード
###引数一つ

```
//構造体定義
struct Progression {
//変数定義
  var numbers: [Int]

  subscript(index: Int) -> Int {
    get {
         return numbers[index]
    }
    set {
         numbers[index] = newValue
    }
  }
}

//インスタンス化(初期化)
var progression = Progression(numbers: [1,2,3])
let element1 = progression[1] 
print(element1)
//結果
2

progression[1] = 4
let element2 = progression[1]
print(element2)
//結果
4
```
上記のコードを見ると、構造体内で定義した変数numbersがインスタンス化時に引数を指定することで値が代入されています。
次にインスタンスprogressionに[1]を指定することで、それをsubscriptionの引数で参照し、返り値でnumbers[1]という形で返しています。その結果progressionの2番目の値の2が出力されました。その下のコードもprogression[1]に４を代入しただけで、やっていることは変わりません。
しかしまだこれでは普通に配列を参照しても簡単にできますし、必要性があまり感じられないと思います。
そこで次のコードをみてください。

###引数複数

```
//構造体定義
struct Matrix {
　//変数定義
  var row: [[Int]]

　//subscription定義（二つの引数を持っている)
  subscript(row: Int, column: Int) -> Int {
    get {
        return rows[row][column]
    }
    set {
        rows[row][column] = newValue
    }
  }
}

let matrix = Matrix(row: [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
])

let element = matrix[1, 1]
print(element)

//結果
5
```
上記のコードを見ると、先ほどと違いインスタンス化時に複数の配列を引数に指定して、変数rowに計3つの配列が代入されています。
次にインスタンスmatrixに[1, 1]という二つの引数を指定して代入しています。これは最初の値が先ほど代入した3つの配列の番号を表しており、次の値が配列内の値を表しています。そのため[1] == 二つ目の配列の[1]　== 二つ目の値ということで、結果として5が出力されました。
つまりこのサブスクリクションを使用すると、100ある配列でも一つのインスタンスで管理ができ、とてもすっきりとしたコードが書けるということです。

###セッタの省略
下記のようにサブスクリプションではセッタの省略が可能で、その場合はgetを書く必要もなく、subscription内に直接引数で参照してきた値を返す処理を書けばOKです。

```
struct Progression {
  var numbers: [Int]

  subscription(index: Int) -> Int {
    return numbers[index]
  }
}

var progression = Progression(numbers: [1, 2, 3])
progression[0]

//結果
1
```

###サブスクリプションのオーバーロード
同じ値の変数（上記だとnumbers)に対して複数のサブスクリクションを指定して、引数に指定する型で区別して、一つの引数を多用的に利用することも可能です。
[バッチ] findで、取得した情報を絞る

**もくじ**
→https://qiita.com/tera1707/items/4fda73d86eded283ec4f

# やりたいこと
バッチのコマンドで拾ってきたデータから、必要なものを抜き出したい。

# やり方
`find`を使う。

# サンプル
ためしに、カレントパスに存在するファイルとフォルダを列挙するコマンド`dir`で出るデータから、必要なファイル/フォルダに絞って表示するようにする。

今回はdirで取れた情報から「target」フォルダの情報のみを最終的に表示しようと思う。

### 実験のためのファイル・フォルダ構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/8e36d873-ed96-e230-1113-3c78b7e079a7.png)

### dirだけ

```dirだけ.bat
@echo off
dir > output.txt
pause
```

```出力(output.txt)
 Volume in drive C is MYSYSTEM
 Volume Serial Number is 3EDB-0C5F

 Directory of C:\Users\masa\Desktop\test

2019/09/11  22:19    <DIR>          .
2019/09/11  22:19    <DIR>          ..
2019/09/11  22:09                30 ABCDE.txt
2019/09/11  22:09                30 FGHIJ.txt
2019/09/11  22:19                 0 output.txt
2019/09/11  22:19                36 sample.bat
2019/09/11  22:17    <DIR>          target
2019/09/11  22:09                30 target.txt
2019/09/11  22:09                30 target2.txt
               6 File(s)            156 bytes
               3 Dir(s)  14,898,491,392 bytes free
```


### dir＋findその１

```dir＋findその１.bat
@echo off
dir | find "target" > output.txt
pause
```

```出力(output.txt)
2019/09/11  22:17    <DIR>          target
2019/09/11  22:09                30 target.txt
2019/09/11  22:09                30 target2.txt
```

絞れたが、フォルダ、ファイルの両方が出てしまっている。
ファイルについては、「target」を含めば拾ってしまうので、後ろに「2」がついてるファイルも出てきてしまう。


### dir＋findその２

```dir＋findその２.bat
@echo off
dir | find "target" | find "<DIR>" > output.txt
pause
```

```出力(output.txt)
2019/09/11  22:17    <DIR>          target
```

ディレクトリ(フォルダ)には`<DIR>`というのがつくので、それでさらに絞る。
これで、今回ほしい情報は取れた。
Arduino-ESP32でBluetooth LEの送受信アプリケーションをサクっと作ってみた

# 概要
Arduino-ESP32でBLEのエコーバック（受信したデータをそのまま送信して返す）をするシンプルなアプリケーションを作りました。

ArduinoIDEに入っているサンプルアプリケーションをちょい変するだけでサクっと作れました。

# 使用したもの
* M5Stick-C　※Arduino-ESP32対応デバイスであれば何でもよいと思います
* Arduino IDE（バージョン1.8.5を使用）
* Nexus 7 (2013)　※nRF UART 2.0を使用できるBLE対応のAndroid 端末であれば何でもよいと思います
* [nRF UART 2.0](https://play.google.com/store/apps/details?id=com.nordicsemi.nrfUARTv2&hl=ja)(Androidアプリ)

# 作成＆動作手順

1. スケッチ[(githubに置きました)](https://github.com/bigw00d/esp32_arduino_ble/blob/master/examples/simple_ble_echo_back/simple_ble_echo_back.ino)をM5Stick-Cに書き込みます
※Arduinoの設定に注意が必要です！（下記の[「ポイント２」](#ポイント２)参照）

1. Androidアプリ([nRF UART 2.0](https://play.google.com/store/apps/details?id=com.nordicsemi.nrfUARTv2&hl=ja))をAndroid端末にインストールして起動します

1. インストールしたAndroidアプリにて、M5Stick-CにBluetoothの接続をします
![STEP0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155449/ee8f8d4d-3ee8-a4b0-bd59-33ba6d2dbde3.png)


1. アプリにて、M5Stick-CにBLEのUARTデータを送信します
![STEP1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155449/00d6ccae-57c0-d1a7-21b8-1b6ee507ac64.png)


1. 送信したデータと同じデータがM5Stick-Cから返ってきます  
![STEP2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155449/f6e0d872-a853-44b1-e99d-91a8c2db8a31.png)


# Arduinoのスケッチ

Arduinoのスケッチは[githubに置いたコード](https://github.com/bigw00d/esp32_arduino_ble/blob/master/examples/simple_ble_echo_back/simple_ble_echo_back.ino)の通りです。Arduino IDEの「スケッチの例」に入っている「BLE_uart」をベースにして変更しました。

ポイントは以下の２つです。

### ポイント１
最初のポイントは、Mutexを使ったということです。

BLEの受信処理（コールバック）で取得したデータを送信処理（メインループ）にて使用します。その2つの処理で共通して使用するデータ(bleDataIsReceived, storedValue)をMutex（storeDataMux）を使用して排他制御をすることで、データ利用のバッティングを防ぎます（[参考記事](https://www.esp32.com/viewtopic.php?t=7427)）

```simple_ble_echo_back.ino（一部抜粋）
boolean bleDataIsReceived;
std::string storedValue;
portMUX_TYPE storeDataMux = portMUX_INITIALIZER_UNLOCKED;
```
### ポイント２
ポイント２は、プログラム領域のパーティション設定をOTAを使わないものに変えたことです。

デフォルトのパーティション設定のままコンパイルすると、「スケッチが大きすぎます。・・・・」とエラーになってしまいます。そのため、Partition Schemeの設定値としてOTAを使用しないようにしました（下図の「Arduinoの設定」参照）。

Arduino-ESP32では、デフォルトでOTA領域（無線のプログラム書き込み用領域）を確保しています。しかし、BLEのライブラリを利用するようなプログラムサイズが大きいものでは納まりきらないようです。今回はOTAを行うアプリケーションではないので、この対処方法で問題ないと判断しました。

図：Arduinoの設定
![設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155449/185c29f5-e7e9-d06f-610b-dbe21eed35fd.png)


# 終わりに

これまでESP32でBluetoothをあまり使用したことがありませんでしたが、サンプルのスケッチを使用して送受信が思いのほか簡単にできました。

これはArduinoのサンプルスケッチと使用したAndroidアプリの親和性が大きいことが一番大きな要因だと思います。Androidアプリを作ったNordicさんに感謝です。

それと、「ポイント１」にも関連するのですが、実はデータを受信する処理とそれを利用する処理がシーケンシャルではないため、受信データを利用する前に次の受信データを取得してしまうと前のデータを利用できなくなったりします。

これについては、受信データの格納先をキューにしたりリングバッファにしたりして、複数のデータを保持できるような仕組みが必要となります。（今後対応するかもしれませんが、必要に駆られないとやらない可能性が大きいです・・・）

見ていただいてありがとうございました。
тнайк чoμ_〆(・ω・｡)			
			
			
# 参考記事

 + ［電子工作］ESP32の使い方
  + http://galaxystar.image.coocan.jp/esp32.htm

			
# 更新履歴
* 2019-09-11：新規作成
Ruby on Rail 投稿系アプリ で 文字数 制限 をする 方法

# 目的

- Ruby on RailsでTwitterのような投稿ができるアプリケーションを作成した際、「空欄で投稿できないようにする」や「投稿文字数制限」を行う方法を知る

# 押さえるポイント

- バリデーション処理を記載することで対応する。
- バリデーション処理はモデルファイルに記載する。

# 書き方の例

- 本記載は検証を行いたいカラムが存在するテーブルのモデルファイルに記載する。
- 下記にバリデーションによりカラムのデータ検証を行う方法を記載する。

```
validates :検証するカラム名, {検証内容}
```

- 同じカラムに対する検証なら、まとめて記載することができる。
- 下記にバリデーションによりカラムのデータを複数の検証項目で検証するときの方法を記載する。

```
validates :検証するカラム名, {検証内容1, 検証内容2}
```

# より具体的な例

- 投稿内容がcontentカラムに格納される際に空の投稿は行えないように検証する。
- 下記に前述の内容の処理を記載する。

```
validates :content, {presence: true}
```

- 投稿内容が140文字以下である場合のみ投稿を行えるようにする。
- 下記に前述の内容の処理を記載する。

```
validates :content, {lengh: {maximum: 140}}
```

- 前述の二つのバリデーションの検証内容を一つにまとめて記載する。
- 下記に前述の内容の処理を記載する。

```
validates :content, {presence: true, lengh: {maximum: 140}}
```
[バッチ] バッチのあるフォルダのパスを取得する

**もくじ**
→https://qiita.com/tera1707/items/4fda73d86eded283ec4f

# やりたいこと
バッチの中で、バッチ自身が置かれているフォルダのパスを取得したい。

# やり方
`%~dp0`を使う。

# サンプル

```sample.bat
@echo off
set SELFPATH=%~dp0
echo %SELFPATH% > target.txt
pause
```

今バッチがあるフォルダパスが出る。

```target.txt
C:\Users\masa\Desktop\test\ 
```

# 備考

**`@echo off`**
通常はバッチに書いた1行1行の処理がコマンドプロンプトに表示されるが、これを書くと、そこから先は処理が画面にでなくなる。ただし、自分でechoを書いたり、何かのコマンドが出力するものは画面にでる。

**`set SELFPATH=%~dp0`**
「SELFPATH」という変数を作って、そこに自分のパスを入れている。
変数を使う際は、その変数名を%と%で挟む。
topコマンドまとめ

#できること
CPU,メモリ,スワップなどのシステム全体や各プロセスの実行状態の監視

#実行結果

使い方： `top [オプション]`

オプション|説明
-------|----
-b     | バッチモードでの実行
-d 秒  | 表示の更新間隔指定
-n 回　 | 指定した回数だけ更新して終了
-u UIDかユーザ名| 指定したユーザのプロセスのみ監視
-p PID | 指定したプロセスのみ監視

```top
[vagrant@bench ~]$ top

top - 10:14:43 up  5:12,  1 user,  load average: 0.08, 0.03, 0.05
Tasks:  83 total,   1 running,  82 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   498888 total,   133244 free,   134280 used,   231364 buff/cache
KiB Swap:  2097148 total,  2091252 free,     5896 used.   313268 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
    1 root      20   0  128096   5712   3904 S  0.0  1.1   0:12.75 systemd
    2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd
 ```

1行目`top - 10:14:43 up  5:12,  1 user,  load average: 0.08, 0.03, 0.05`

表示内容|説明
--------|----
10:14:43|現在日時
up 5:12|起動してからの経過時間
1 user|ログイン中のユーザ数
load average 0.08, 0.03, 0.05|直近1分、5分、15分の平均負荷（実行待ちとなっている平均プロセス数）

2行目`Tasks:  83 total,   1 running,  82 sleeping,   0 stopped,   0 zombie`

それぞれ総プロセス数、実行中、スリープ状態、停止中、ゾンビ状態のプロセス数を示す。
※ゾンビプロセス：処理は終了したが、プロセステーブルから情報が削除されないプロセス

3行目`%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st`

表示内容|説明|備考(何の略か)
--------|----|----
0.0 us|ユーザプロセスのCPU使用時間（割合）|user
0.0 sy|カーネルの　　　　〃|system
0.0 ni|優先度が変更されたプロセスの　　　　〃|nice
100.0 id|CPUがアイドル状態の時間割合|idle
0.0 wa|ディスクI/O待ちの　　　　〃|io wait
0.0 hi|ハードウェア割り込み要求の　　〃|hardware irq
0.0 si|ソフトウェア割り込み要求の　　〃|software irq(周辺機器の処理の終了など)
0.0 st|ゲストOSがCPUを割り当てられなかった　　〃|steal

4行目, 5行目
`KiB Mem :   498888 total,   133244 free,   134280 used,   231364 buff/cache
KiB Swap:  2097148 total,  2091252 free,     5896 used.   313268 avail Mem`

それぞれメモリとスワップの、全容量、空き量、使用中の容量、バッファ/キャッシュ,利用可能なメモリ量

#####プロセス毎の情報
```
  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
    1 root      20   0  128096   5712   3904 S  0.0  1.1   0:12.75 systemd
    2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd
```

表示内容|説明|
--------|----
PID|プロセスID|
USER|実行ユーザ名
PR|実行優先度
NI|nice値
VIRT|使用中の仮想メモリ（KB）
RES|使用中の実メモリ（KB）
SHR|共有メモリ（KB）
S|プロセスの状態|
%CPU|CPU使用率
%MEM|物理メモリ使用率
TIME+|プロセス開始からの合計CPU使用時間
COMMAND|実行コマンド

（補足）プロセスの状態「S」について

状態|説明|備考
----|----|----
S|スリープ（割り込み可,イベント完了待ち）|Interruptible sleep (waiting for an event to complete)
T|停止中|Stopped, either by a job control signal or because it is being traced.
D|スリープ（割り込み不可,IO完了待ち）|Uninterruptible sleep (usually IO)
R| 実行中or実行可能 |Running or runnable (on run queue)
Z | ゾンビ状態 |Zombie state: Process terminated and parent not waiting
W | スワップアウト状態 |paging (not valid since the 2.6.xx kernel)

####topコマンドの画面内での操作
キー|説明
-------|----
Enter     | 表示の更新
q|終了する
k|プロセスにシグナルを送信
l|平均負荷（１行目）の表示・非表示
t|プロセス数、CPU利用率（２、３行目）の表示・非表示
m|メモリ・スワップ領域の表示・非表示・グラフ化
P|ソート（CPU使用率順）
M|ソート（メモリ使用率順）
N|ソート（PID順）
T|ソート（起動時間順）
#AWS  でルートアクセスキーを削除する

# I AM

![image](https://user-images.githubusercontent.com/13635059/64691518-cd582180-d4cd-11e9-983a-a262ae305c99.png)

# セキュリティ警告が表示されている
![image](https://user-images.githubusercontent.com/13635059/64691458-a7cb1800-d4cd-11e9-8183-9f7c19097277.png)
# セキュリティ認証情報へ進む
![image](https://user-images.githubusercontent.com/13635059/64691492-b87b8e00-d4cd-11e9-8418-a37069bea2ad.png)
# 削除する
![image](https://user-images.githubusercontent.com/13635059/64691506-c3ceb980-d4cd-11e9-8f14-2e96273c50da.png)
# セキュリティ警告が解除される
![image](https://user-images.githubusercontent.com/13635059/64691535-d648f300-d4cd-11e9-85b9-15078291b4e1.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2410








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[バッチ] ファイルに書き込み

# もくじ

https://tera1707.com/entry/2022/02/06/144447

# やりたいこと
バッチファイルを使って、ファイルに文字列を書き込みたい。

# やり方
`echo`を使う。

# サンプル(上書き書き込み)

```sample.bat
echo AAA> target.txt 
echo BBB> target.txt 
```

出力

```target.txt
BBB

```

「AAA」は消えて、BBBで上書きされる。

### 注意
`echo AAA> target.txt `とすると、AAAの後ろにスペースが一つ入るので注意。


# サンプル(追加書き込み)

```sample.bat
echo AAA>> target.txt 
echo BBB>> target.txt 
```

出力

```target.txt
AAA
BBB

```

「AAA」は消えず、BBBが後ろに書き込まれる。
Flutter 1.9でFlutter for Webが統合されたので再び軽く触ってみた

## Flutterをmaster channelに変更する
master channelでないと動かないようなので、master channelに変更する。

```console
$ flutter channel master
```

## Flutterを1.9以上に上げる
flutterを1.9以上にする必要があるので、`flutter upgrade`で使っているflutterのバージョンを上げる。

```console
$ flutter upgrade
```

## Webサポートを有効にする

```console
$ flutter config --enable-web
```

`flutter config --enable-web`の実行により下記のファイルに`"enable-web": true`が追加されます。ファイルが存在しない場合には、ファイルが作成されて追記されます。

```json:~/.flutter_settings
{
  "enable-web": true
}
```

## プロジェクトを作成する
`flutter create`でも、Android Studio等からのGUI生成でも好きなやり方でプロジェクトを作成。

```console
$ flutter create integrated_flutter_web
```

初めからwebディレクトリが追加されるようになります。
![スクリーンショット 2019-09-11 21.49.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117867/b2bb558b-4ea8-dac0-0c54-ee28ee30f1a4.png)

deviceにchromeが追加されます。
![スクリーンショット 2019-09-11 21.50.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117867/83c87148-375c-286c-6ecc-282edcd02eb9.png)

## Web版を実行して表示する
```console
$ flutter run -d chrome
```

![スクリーンショット 2019-09-11 21.54.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117867/1299054f-1816-363f-4053-4b8912d0146d.png)

## リリースビルドを実行する
```console
$ flutter build web
```

## 注意点等
* リポジトリが統合されただけでテクニカルプレビューである点は変わらないです。
* flutter_webからのマイグレーションは[こちら](https://github.com/flutter/flutter/wiki/Upgrading-from-package:flutter_web-to-the-Flutter-SDK)
* ホットリロードは対応してない模様

## 参考
[Flutter Web FAQ](https://flutter.dev/docs/development/platform-integration/web)
[Building a web application with Flutter](https://flutter.dev/docs/get-started/web)

## 関連
### 最近試したもの
* [Cloud FunctionsでDartを使う](https://qiita.com/hiko1129/items/d0907ba7a63c01075e98)
* [今更ながらFlutter Desktopのexampleを動かす](https://qiita.com/hiko1129/items/5269e20366b5ea0df717)


### 昔試したもの
統合されたのでwebdevコマンド使っている箇所はすべて読み替える必要があります。
諸々更新されているので、今も正しいやりかたか（当時も実験としてやっていたので正しかったか）はわかりません。

* [Flutter Webでクエリパラメータやパスパラメータを使う方法](https://qiita.com/hiko1129/items/096e46eec88cd25fe90b)
* [[Flutter] Flutter WebでURLが遷移時に変わるようにする方法](https://qiita.com/hiko1129/items/6ad84273590ebccc4906)
* [flutter webのアプリをfirebase hostingで公開する](https://qiita.com/hiko1129/items/b55835968820d6e37d27)
* [Flutter Web で Firestore を使う](https://qiita.com/hiko1129/items/73ea988df0c537657b10)