OmniAICreator/Qiita-1.07M huggingface dataset:
Cannot create container for 〇〇: create .: volume name is too short, names should be at least two alphanumeric characters


# エラー文

```shell
$ docker-compose up -d
中略
Cannot create container for service webserver: create .: volume name is too short, names should be at least two alphanumeric characters
```

`.`というパス名が短すぎるぞ、と怒られてます。

# 原因

```yaml:docker-compose.yml

version: "3.7"
services:
  webserver:
    volumes:
      - ./bar/:/foo/bar/
      - ${HOGE_CFG}:/foo/hoge.ctg
```

`docker-compose.yml`を確認しましたが、`.`だけをパス名に指定したvolumeは無さそうです。
そこでちょっと閃いて、6行目の`$HOGE_CFG`の中身を覗いてみることにしました。

```shell
$ echo $HOGE_CFG

```

シェル変数`$HOGE_CFG`の中身が空でした。
`$HOGE_CFG`に何も入ってなかったから、`docker-compose.yml`の6行目が`- .:/foo/hoge.ctg`と同じ扱いになってしまったみたいです。

`$HOGE_CFG`の定義場所を探し、`$HOGE_CFG`が定義されていなかった問題を解消したら、この問題も解決しました。

# 余談

[Ubuntu Desktopで『rm -rf /』を実行](https://news.mynavi.jp/article/dont_run_on_linux-2/)

> 例えば、a=/var/tmp/log2といったな変数を指定してrm -rf $a/*のような処理をしていたとする。スクリプトの書き換えやロジックのミスなどで変数aが空だと、rm -rf /*というコマンドが実行されてしまうことになる。rm -rf /*はrmコマンドからの警告なしにそのまま実行されてしまうため、ここに示したようにやっぱりシステムは壊れてしまう。

これと同種の問題だと思いました。
もし自分でスクリプトを書くときには、シェル変数でパスを指定するときは、シェル変数に何も入っていなかったときにどのパスになってしまうのか？は注意しなくてはいけないなと思いました。

# 参考記事

[Volume相対パス指定でもdocker runがしたい！](https://qiita.com/KentoDodo/items/24117025924d64998110)
Haskell競技プログラミング用メモ

# 文字列
Data.ByteString.Chan8

#Data.Vector.Unboxed
create, unfoldrN, fusion

# Data.Vector.Unboxed.Mutable
new, read, modify, write, freeze, thaw

# データ構造
priority queue →　Data.Set
グラフの構築やdfs →　Data.Graph

# 再帰
foldl',foldr(早期リターン)

# Prelude
https://qiita.com/mnozawa/items/cc2e8a068e37b0330038

# IO
``` haskell:a1-an読み込み

import qualified Data.Vector.Unboxed as VU
import qualified Data.ByteString.Char8 as B

main = do
  let readInt = fmap (second B.tail) . B.readInt
 
  as <- VU.unfoldrN n readInt <$> B.getLine
```

``` haskell:ABを読み取り

import qualified Data.Vector.Unboxed as VU
import qualified Data.ByteString.Char8 as B

main = do
  let readInt = fmap (second B.tail) . B.readInt
 
  (a,b) <- (\vec -> (vec VU.! 0, vec VU.! 1)) . VU.unfoldrN 2 readInt <$> B.getLine
```

``` haskell:A1B1A2B2...AnBn

import qualified Data.Vector.Unboxed as VU
import qualified Data.ByteString.Char8 as B

main = do
  let readInt = fmap (second B.tail) . B.readInt
 
  abs <-
    VU.replicateM n $ (\vec -> (vec VU.! 0, vec VU.! 1)) . VU.unfoldrN 2 readInt <$> B.getLine
```

```haskell:IOまとめ
readInt = fst . fromJust . BS.readInt
readIntList = map readInt . BS.words
getInt = readInt <$> BS.getLine
getIntList = readIntList <$> BS.getLine
```

# パフォーマンスの目安
実行時間はC++の５倍以内を目指す
スプレッドシートにフォームの回答があったタイミングで、別のフォームのプルダウンを更新する

# 前提
  フォームの0番目に登録されている質問はプルダウンである必要があります。
  トリガーは、スプレッドシート＞フォーム送信時 とします。
  ここで宣言したフォームとは別に、プルダウン参照元となる情報をインサートするフォームがあり、それがManagementSheetの1行目（配列のインデックスでいうと0番目）に反映される必要があります。

```
const updateForm = () =>{
  const form_id = 'YOUR_FORM_ID';
  const formObject = FormApp.openById(form_id);
  const formItems = formObject.getItems();
  const updateItem = formItems[0];

  const spread_id = 'YOUR_SPREAD_ID';
  const sheet_name = 'REFERENCE_SHEET_NAME';
  const ManagementSheet = SpreadsheetApp.openById(spread_id).getSheetByName(sheet_name);
  const data_range = ManagementSheet.getRange(1,1)getDataRegion().getValues();
  data_range.shift();
  const filter = data_range.filter((record) => record[1] === '');
  const reference_items = filter.map((data) => data[0]);
  const set_values = reference_items.length !== 0 ? reference_items : ['none_item'];
  updateItem.asListItem().setChoiceValues(set_values).setRequired(true);
}
```
バリュードメインとNetlifyの設定(Hugoの場合)

## 前提条件
下記以外の設定(config.toml等)が終わっている場合です。
netlify.tomlは未使用です。

## Advanced build settingsに注意
Netlifyログイン後、
1. Connect to Git provider
2. Pick a repository
3. Build options, and deploy!　

上記3番目ビルドオプションのページで **Advanced build settings** の **"New variable"**をクリック。
Keyを **HUGO_VERSION**
Valueは **0.74.3**　(使用中のHugoのバージョン)
と追加して **"Depoly Site"** をクリックします。
Valueは最新のバージョンではなく、現在使っているバージョンです。

## config.tomlの編集
Deploy後、そのままではテーマが未反映の状態なので

```config.toml
baseURL = "https://hogehoge.netlify.app/"
# hogehoge部分はOverviewの上部に記載されています
```

2020年8月15日現在、上記設定のみで無事にDepoyされました。

## 独自ドメインの設定もする場合
Netlifyログイン後、Settings >> Domain management >>Domains と進み、Custom domains内の Add domain alias で設定したいドメイン(例. example.com)を追加します。

設定したドメインの右側に表示された**Check DNS configuration**をクリックするとIPアドレスが表示されているのでメモります。

バリュードメインにログイン後、ドメインのDNS設定ページで

```bash
a @ 000.000.00.00 (メモったIPアドレス)
# example.com(サブドメイン無し)のIPはこれだよっていう設定

a www 000.000.00.00 (同上)
# www.example.comのIPはこれだよっていう設定
```

それから

```config.toml
baseURL = "https://example.com/"
# ここも同じように変更します。
```


これでしばらく待つと、HTTPSも含めアクセスできるようになります。
www無しは Primary domain に、www有りは Redirects automatically to primary domain という設定になります。
ちなみに、今回はバリュードメインのネームサーバーを使用しています。
掃除当番をスプレッドシートから読み取り、WEBHOOKを使ってgoogle chat へ通知するロジック


```
  const notification = () => {
    const spreadsheet_id = 'YOUR_SPREADSHEET_ID';
    const SpreadSheetObject = SpreadsheetApp.openById(spreadsheet_id);
    const ResponsibleSheet = SpreadSheetObject.getSheetByName('SHEET_NAME');
    const data = new Date();
    const day_of_the_week = date.getDay();
    const tomorrow_day_of_the_week = day_of_the_week + 1;
    const convert_japanese_week = ['日曜日','月曜日曜','火曜日','水曜日','木曜日','金曜日','土曜日'][tomorrow_day_of_the_week];

    if(convert_japanese_week !== '日曜日'|| convert_japanese_week !== '土曜日'){
      const data_set = ResponsibleSheet.getDataRange().getValues();
      const members = data_set.filter(data => data[0] === tomorrow_day_of_the_week);
      const member_list = members.map((member) => member[1]);
      const message = member_list[0];
      const payload = {'text' : 'tomorrow cleaning member is' + message}
      const converted_json = JSON.stringify(payload);
      const url 'WEBHOOK_URL';
      const options = {'method' : 'POST', 'contentType' : 'application/json; charset=utf-8', 'payload : converted_json}
      UrlFetchApp.fetch(url, options);
   }
}
```
何故コンピュータサイエンスが大切なのか？

# はじめに

こんにちはばーんです！

- 基礎は大切
- 自分の性格的にも内部構造を理解しないまま進めない
(進みたくない)

といった理由でコンピュータサイエンスの学習をしていたのですが、今回もっと具体的に「何故必要か？」がわかった出来事があったので、つらつら書いていきます。

## よく見る風景 その1

初学者がエラーを遭遇した時に

- 上部の事象で判断してエラーを読まない
- エラーをgoogle先生に打ち込んで直接解決策を調べる
- 自身の少ない経験から仮説を立ててtry!(おまじない)

この辺りをよくやると思うんですよね(実体験)

で、なんでこれやっちゃうのかな？と考えました。

- 論理的に物事を考えられないから？
- 基礎の重要性を学んでいないから？

色々考えましたが答えが出ないので、
「本業(パチンコ屋さん)なら上手くエラー対応できるのになぁ…」と自分自身に置き換えて考えていました。

で、何故本業は適切に対応できて、エンジニアリングになると途端にできなくなるのか？を自身の経験を元に深掘りしてました。

> **※補足**
僕は現在パチンコ業界で働いています。約8年間。この後パチンコでの例えもでてきます。
あまりご存じない方は専門的な部分は飛ばすか読み替えて頂けると幸いですm_ _m

## (ばーんが)よく見る風景 その2

実はパチンコ台って結構壊れます。よくエラーがでます。
そして、自分は8年間働いている + 知的好奇心からパチンコ台の仕組みを殆ど理解できています。
なので、エラーが出た際も「原因が何か？」を見つけて早く＆適切に対応できます。

しかし、入社したばかりの方に多いのが、エラーに遭遇すると

- 「とりあえずこれやれば直ること多いよ！」と言われたことを原因も分からずtry!
- 上部の事象のみで判断(ユーザーと同じ視点)

といった対応が多いです。自分も入社直後はやったことあります。
これもう少し具体的な例をあげてみます。

>下記文章はパチンコをあまりご存じない場合は、専門的な部分は飛ばすか読み替えて頂けると幸いですm_ _m

### 具体例

エラーケース「パチンコで玉が飛ばない場合」
1. パチンコを打っていたお客様から「玉が飛ばない」とクレームが入る
2. 駆けつけた新人が「玉が飛ばない時はこれ」を試す
3. 直らない
4. 助けを求める
そして、この時の助けを求める内容(報告)は、「玉が飛びません」みたいな内容が多いです。
(適切な報告ではない。ユーザーと同じ視点)

で、この事例の正しい対応はまず原因を特定することです。
というよりエラーへの対応方法の99%はこの(↑)手順が正しいです。

そもそも玉が飛ぶ仕組みは、

1. 設備からパチンコ台に玉が供給される
2. パチンコ台がユーザーの操作を受けて「玉を払い出す」という信号を上げる
3. 玉が実際に払い出される
4. 玉が上皿からレールを伝い整流器(カセット)にセットされる
5. ハンドルが一定以上の角度で回される & 静電気を感知した時に信号を送る
6. 信号を受け取った基盤がハンマーと整流器に一定のリズムの信号を送る
7. [6]が連動して発射台に玉がセットされる
8. ハンマーがセットされた玉に当たり、発射される
9. ハンドルの角度によりハンマーの強さが変わるので、狙った場所に玉が飛ぶ

とユーザーからすると
1. 玉をセットする
2. ハンドルを回す
と2つの動作で動いているように見えますが、中ではこれほど細かく動いています。
(もう少し細分化できますが逸れるので省略します)

#### 正しい対応方法

今回の「玉が飛ばない」エラーの正しい対応方法は、**原因を特定しその原因を取り除くことです。**

- 玉がカセットまで届いているか？
- カセットは正常に動いているか？
- ハンドルが回っているか？
- ハンマーは動いているか？
- 静電気を感知しているか？　etc...

といったことを確認していかなければいけません。
そして、原因を特定するには**仕組みを把握していないとまずできません。**

## 改めて考えてみる

僕自身あまりよろしくないとされる、いわゆる「おまじない」をしてしまいます。

では、基礎の重要性を知らないのか？というと、新しく入社した方に
**「仕組みを理解してください」**と口酸っぱく言い続けてます。

応急処置としてその場その場のエラーを教えることもありますが、後で必ず仕組みの説明をします。

- エラーの数や種類は星の数ほどあるので、個別のエラー対応を覚えなくても根本的な仕組みを理解できれば対応できる
- 正しく対応できる(上記の例であれば静電気を感知していないのに、玉が届いていない時の対応をしていても一生エラーは直せない)
- 結果として早くエラー対応ができる
- 基礎を知ることで例外的な頻度の少ないエラーにも対応できる

こういった理由で仕組みについて説明しています。

## 何が言いたかったのかというと…

**大抵の人は新しいパラダイムに挑戦するとおまじないをしてしまう**

これは別に本人に悪気があるわけでもなく、論理的に考えられないわけでもなく、基礎の重要性を理解していないわけでもない。

僕自身の体験談でもそうですし、新入社員を30名ほど見てきた中でも同じような傾向があるなと感じます。

## まとめ

- まず、仕組みを理解する
  - 仕組みを理解して初めて原因を追求できます。
  - ただし、仕組みの理解は机上だけでは理解し難いもの。実務を絡めて進めるのが良いと思います。

- 仕組みを理解すると、様々なメリットが得られる(↓)
  - エラーの数や種類は星の数ほどあるので、個別のエラー対応を覚えなくても根本的な仕組みを理解できれば対応できる
  - 正しく対応できる
  - 結果として早くエラー対応ができる
  - 基礎を知ることで例外的な頻度の少ないエラーにも対応できる

**そして、エンジニアリングではこの仕組みの部分がコンピュータサイエンスに当たるので、理解を深めていく必要がある**

## さいごに

こうやって振り返ると僕自身「まずは動くものを作ろう」のフェーズが長すぎたように感じます。

最初は「まず動くもの」で良いと思います。ただ、時間配分などのバランスは考えないといけないし、明らかに基礎を疎かにしていたなと反省してますorz

なので今後は Git / SQL / Linux / C言語 辺りを学んでいく予定です＾＾

最後まで見ていただいてありがとうございましたm_ _m
プログラミング学習記録 Day1

今日から[デイトラ](https://www.daily-trial.com/)というオンラインスクールでWeb制作を勉強していきます。
それに伴い学習した内容をQiitaに記録していきます。

#今日の学習時間
1.5h (トータル1.5h)

#今日の学習内容
##デイトラWeb制作初級編 DAY1 はじめに

**上手に質問するためのテンプレート**
1.詰まっている箇所（〇〇編DAY〇〇）
2.聞きたいことの一行まとめ
3.起きている問題（起きている現象の詳細/エラーメッセージ/スクリーンショット）
4.ソースコード（関連するソースコード/全ソースコード）
5.問題解決するために試したこと（コードもあれば追記） 
6.問題について自分なりに考えたこと（デバッグ結果/検索結果/自分なりの原因予想）

質問力が重要な理由
* 質問力を磨くことで問題解決能力が向上する
* 質問がちゃんとできないとエンジニアとして評価されない
　（下手な質問は回答者の時間を奪う＝嫌われる！）

##DAY2 HTMLのタグを書いてみよう
ドットインストールで学習した内容だったので流し読み
##DAY3 CSSを書いてみよう
同上
ちなみに完全に初学者の場合、DAY2、DAY3のレッスンはドットインストールやプロゲートで下地を作ってから臨んだ方が良さそうだと思いました。

##DAY4 環境構築をしよう！
VScodeおすすめプラグインをインストールしました。
とりあえずインストールしといた方がミスを減らせるようです。

Emmetはまだ全然使いこなせていないので積極的に使っていきたい…！
[「はじめて」でも簡単！Emmetの使い方とよく使うパターン集](https://haniwaman.com/emmet/)

##DAY5 ゼロからサイトを作ってみよう①
いよいよサイト制作のレッスンが始まりました！わくわく！

**reset.cssの必要性**

```HTML:
<link rel="stylesheet" href="./css/reset.css">
<link rel="stylesheet" href="./css/style.css">
```
ブラウザにデフォルトで設定されているuser agent stylesheetはブラウザによって表示が異なる場合がある。
そこでreset.cssを当てることでuser agent stylesheetのスタイルを打ち消す。
これによってブラウザ間での表示差異をなくすことができる。
※必ずのstyle.cssの前にrest.cssを書くこと！

**画像をページいっぱいに表示させる**

```CSS:
img {
  width: 100%;
  height: auto;
}
```


とりあえず今日はここまで。

![スクリーンショット 2020-08-16 8.23.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692520/e56171f0-e6bb-98aa-d30f-5c2ab3a9fedd.png)
手近な CPU の TLS 処理性能を計測してみた

# はじめに

唐突に CPU の TLS 処理性能を計測してみたくなりまして。


# 経緯

なんとなく Intel 離れがトレンドですが、Intel の IA32 CPU は高機能（多機能）な CPU であり、ディープラーニングで有用な VNNI だったり TLS 通信（https 通信）での複雑な演算処理を支援する AES-NI だったり、最終的に性能に影響する機能を多く備えています。

今やスパコンにも利用されていて日本の富嶽では世界一も記録した ARM ですが、常に Intel IA32 より高性能ってわけでもないだろうと思って、ちょっと見てみた次第です。


# 結果

## 計測環境

計測した環境は下記です。

- Raspberry Pi Zero / Rasbian Buster
- AWS a1 / Amazon Linux 2 + openssl-1.1.1c-15.el8.src.rpm
- AWS t3 / Amazon Linux 2 + openssl-1.1.1c-15.el8.src.rpm
- AWS t3a / Amazon Linux 2 + openssl-1.1.1c-15.el8.src.rpm
- Core i7-8665U / Ubuntu 20.04
- Ryzen 5 1600 / Ubuntu 18.04.4

計測コマンドは `openssl speed` です。少し昔の話になりますが、[こんな取り組み](https://medium.com/@voluntas/cpu-%E3%81%AE-aes-%E9%AB%98%E9%80%9F%E5%8C%96-21459540ed8)を見つけまして、計測方法を真似してみました。
１０回実行して平均をとりました。

Pi Zero のみ AES 支援機能が載っていません。


## 数値

数値１つ目は 1024bytes の値、２つ目は a1 との比率です。


### aes-128-gcm

|PiZero|a1|t3|t3a|Core i7|Ryzen 5|
|--:|--:|--:|--:|--:|--:|
|12115|1301742|3578293|2599327|4401704|3737455|
|0.01|1.00|2.75|2.00|3.38|2.87|


### chacha20-poly1305

|PiZero|a1|t3|t3a|Core i7|Ryzen 5|
|--:|--:|--:|--:|--:|--:|
|36304|398826|1839649|772989|2077522|1076447|
|0.09|1.00|4.61|1.94|5.21|2.70|


## つたない所感ｗ

- Intel は AES 支援機能の効果が２倍前後
- AMD と ARM は AES 支援機能の効果が３倍強

クロック数とか消費電力とか分母が無いところで恐縮ですが、AES に関して言えば ARM は Intel IA32 に負けない性能と言って良さそうです。


# おわりに

chacha20 は AES 以外の選択肢としてどうしても必要とのことですが、いまのところパソコンやスマホで利用すると性能低下を招きますね。困った困った。
blender 2.8, python立体着色

さて数日間Blenderと格闘して立方体の着色で一歩前進。
hecomi氏の2012年記事 [「Blender 2.63 での Python の使い方に...」](http://tips.hecomi.com/entry/20120818/1345307205)
を元にしてあれこれblender 2.8向けに書き換えてみました。今回は静止画面。

```python3
import bpy
# nh03  立方体、着色に成功（マテリアル割り当てに成功）
# 既存要素削除（この2行は借り物）
for item in bpy.data.meshes:
    bpy.data.meshes.remove(item)
#立方体 ---original script  ---- http://tips.hecomi.com/entry/20120818/1345307205

START = 0
END   = 100
N     = 3

# Add color cubes
for x in range(0, N):
    for y in range(0, N):
        for z in range(0, N):
            # Add a color cube
            bpy.ops.mesh.primitive_cube_add( location=(x*3, y*3, z*3) )
            #obj = bpy.context.scene.objects.active #(old blender2.7script)
            obj = bpy.context.view_layer.objects.active
            #mat.diffuse_color = (x/N, y/N, z/N)#(old blender2.7script)
            mat = bpy.data.materials.new('Cube')
            mat.diffuse_color = (x/N, y/N, z/N, 0)
            #mat.use_transparency = True #(この行は2.8で試していない)
            #mat.alpha = 0.6 #(この行は2.8で試していない)
            obj.data.materials.append(mat)

# new camera
bpy.ops.object.add(radius=1.0, type='CAMERA', enter_editmode=False, align='WORLD', location=(20.0, -6.0, 7.0), rotation=(1.4, 0.0, 1.2))

# new lamps （出典 stack overflow Can you add a light source in blender using python)
# create light datablock, set attributes
light_data = bpy.data.lights.new(name="light_2.80", type='POINT')
light_data.energy = 3000
# create new object with our light datablock
light_object = bpy.data.objects.new(name="light_2.80", object_data=light_data)
# link light object
bpy.context.collection.objects.link(light_object)
# make it active 
bpy.context.view_layer.objects.active = light_object
#change location
light_object.location = (5, -4, 10)
# update scene, if needed
dg = bpy.context.evaluated_depsgraph_get() 
dg.update()

# 背景 world - surface - background
bpy.data.worlds["World"].node_tree.nodes["Background"].inputs[0].default_value = (0.01, 0.15, 0.25, 1)
bpy.data.worlds["World"].node_tree.nodes["Background"].inputs[1].default_value = 0.7            
#=====
```

![bpy_nh03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690216/189b744e-fdd4-345a-2721-b3f895033bf7.png)
自然言語処理入門　（RNN）

自然言語処理に入門します


自然言語（Natural　Language)・・普段使っている言葉 柔らかい,曖昧
マシン（機械）語・・0110111001　　　　　　　　　　　　　 硬い、厳格
自然言語処理目的
「コンピューターに人間の言葉を理解させる」
つまり、コンピューターが言語を　１ 理解し    ２話す（出力する）    までの過程を作る

#自然言語処理の概要

言葉は「単語」によって構成される。
「単語の意味」をうまく捉えた表現方法について考える。

<b>３つの表現方法<b>

DeepLearing 登場以前
1 シソーラス(thesaurus)
2 カウントベース

DeepLearing 登場後　　　※今回は記載しない
（3 推論ベース(word2vec)）




####1 シーソラス


・辞書的に単語の意味を定義する。
・類語辞書　　'car' = 'auto'  'automobile'    'machine'　'motor-vehicle'

上位と下位の関係性によって階層的に分別される


![image03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/34c36216-8014-96f0-769e-2f61f6203a84.png)


最有力シソーラス　　<font color="DeepPink">WorldNet </font>

課題　
言葉は変化する、柔軟なもの
→辞書作りを人の手でやると大変、エンドレス・・・。




####2 カウントベース

コーパス　（目的を持って集められた）大量のテキストデータ

＜カウントベースとは＞
周囲の単語をカウントし、文脈から意味を判断する手法。

＜カウントベースの目的＞
コーパスから自動的に、効率よくエッセンスを抽出する。
（コーパスを使って単語の意味を抽出する）
カウントベースを使う→単語をベクトルで表すことができる

Qなぜベクトル表現するのか？
A　数値化することで、コンピューターが理解できる厳密な定義をできるから

＜ex 色の表現　＞

１　コバルトブルー、シンクレッド、ダークブラウン・・・・　　
色の数だけ異なる名前を定義する

２　RGB　　色を３次元のベクトルとして表す　【色のベクトル表現】
　　　　　　色をより正確・厳密に定義できる　


・・・同様のことを、単語にも適応する

単語の意味をベクトルで表現する　
自然言語処理において、<font color="LimeGreen">分散表現</font>と呼ばれる。







<font color="Red">「単語の意味は周囲の単語によって構成される」</font>→分布仮説という

つまり、文脈（コンテキスト）により単語の意味は定められる。

コンテキストのサイズ「ウィンドサイズ」という

![https___qiita-image-store.s3.amazonaws.com_0_77079_a86bed6d-df90-5274-e905-5041ef465b10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/1a7db1e4-f70e-7d67-8329-d73f8885233a.png)

＜流れ　単語をベクトル化→　ベクトルの類似度を計測→　次に来る言葉を統計的に選ぶ＞

ベクトルの類似度は、<font color="MediumVioletRed">コサインの類似度</font>を計測することで求める

”コサイン類似度”・・・「２つのベクトルがどれだけ同じ方向を向いているか」を表す。
２つの直線が逆向き　コサイン類似度　−１　
２つの直線が同じ向き　コサイン類似度　１

ノルム・・「ベクトルの大きさ」＝”２点間の距離”を表す。

L1　ノルム　・・マンハッタン距離　横＋縦でしか表せない距離
L2　ノルム　・・斜め（最短）で表した場合の距離

![https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_386487_76f274f8-c8b0-0443-a872-16b79f5fa87e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/486d6a7f-49e9-7e76-f139-2dc043cc4c40.png)




####形態素解析
形態素とは、  言葉が意味を持つまとまりの単語の最小単位のことです。

形態素解析とは、私たちが普段生活の中で一般的に使っている言葉、つまり「自然言語」を形態素にまで分割する技術のことです。

![f67805417f5968f3f2b5d07bc01f42c0-large.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/228edd84-16b6-22e2-53f0-70b1f5a72e5a.jpeg)



## word2vec

word2vecは、大量のテキストデータを解析し、各単語の意味をベクトル表現化する手法
単語をベクトル化することで、
・単語同士の意味の近さを計算
・単語同士の意味を足したり引いたり

例えば、word2vecにより『タコ』、『イカ』、『赤い』、『白い』という言葉を以下のようにベクトル化できたりします。

・タコ　（0.4,0.1,0.9,0.4）
・イカ  （0.5,0.2,0.3,0.4）
・赤い （0.1,0.0,0.8,0.2）
・白い （0.4,0.1,0.2,0.3）

『タコ』、『イカ』の距離を計算すると、結構近いところにありそうだ。意味も近いのでは？
『タコ』 - 『赤い』 + 『白い』 ≒ 『イカ』 になる。のようなイメージ
PHP printfの使い方や小数点切り上げなど

printfで５桁の数字として表示する

```php

<?php
 
// 表示する数字
$int = 315;
 
// 5桁の数字(00315)として表示
printf('%05d', $int);
 
?>
```

小数点を切り上げたり切り捨てたりする

```php
<?php
// $valueの値を定義
$value = 55.5555;
 
// 小数切り捨て値の処理を記述
 $floor = floor($value);
 
// 小数切り上げの処理を記述
 $ceil = ceil($value);
 
// 小数四捨五入の処理を記述
 $round = round($value);
 
// 小数第二位で四捨五入の処理を記述
 $round2 = round($value,2);
 
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>課題</title>
</head>
<body>
    <p>元の値: <?php echo $value; ?></p>
    <p>小数切り捨て:  <?php echo $floor; ?></p>
    <p>小数切り上げ: <?php echo $ceil; ?></p>
    <p>小数四捨五入:<?php echo $round; ?> </p>
    <p>小数第二位で四捨五入: <?php echo $round2; ?></p>
</body>
</html>

```
[Python] ABC175D

#[ABC175D](https://atcoder.jp/contests/abc175/tasks/abc175_d)

Pi != i および P1, P2,・・・,PNは全て異なるという条件より, どこからスタートしてもスタート地点に必ず帰ってくるループとなる.
N≤5000より, すべてのスタート地点についてループ経路を求めても最悪O(N^2)となり, なんとか間に合いそう.
よって, 以下スタート地点sとして考える. 各sについて以下のStepを回す.

###Step1
 1番目の点 → 2番目の点 →・・・→ s(最後の点) のループについて, 得点の累積和Sを求める.
###Step2
 Kとlen(S)の大小で場合分けして, 得点の最大値を求める. 場合分けは以下の通り.
####Step2 - ケースA: K≤len(S)のとき:
ループを1週しないため, 到達可能な点でのSの最大値が答えとなる.
####Step2 - ケースB: K>len(S)のとき:
S[-1]≤0のときは1週以上するメリットがないため, 1週するまでの最大値、つまりSの最大値が答えとなる.
S[-1]>0のときは回れるだけ回りたいところだが, 実は1周少なく回った方が得点が高くなることがあるため, 両方の場合での得点を算出して比較する.

参考：[【Python】ABC175 解説](https://marco-note.net/abc-175-work-log/)

```python:サンプルコード
N, K = map(int, input().split())
P = list(map(int, input().split()))
C = list(map(int, input().split()))

ans = -float('inf')
for s in range(N):
    ### Step1
    S = []  # ループ内累積和リストS. ただし, 初項は0ではなく1回目の移動後の得点とする.
    # 1回目の移動
    i = P[s] - 1
    S.append(C[i])
    # 2回目以降の移動. スタート地点に戻ってくるまで繰り返し.
    while i != s:
        i = P[i] - 1
        S.append(S[-1] + C[i])

    ### Step2: KとSの長に応じて場合分けして, 得点の最大値を求める.
    # 1周未満しか移動できない場合:
    if K <= len(S):
        score = max(S[:K])
    # 1周以上回ることができるが, ループを1周したときに得点が減る場合:
    elif S[-1] <= 0:
        score = max(S)
    # 1週以上回ることができ, かつループを1週するごとに得点が増える場合:
    else:
        # ループを (K // len(S) - 1)回 廻る場合:
        score1 = S[-1] * (K // len(S) - 1)
        score1 += max(S)
        # ループを (K // len(S))回 廻る場合:
        score2 = S[-1] * (K // len(S))
        r = K % len(S)
        if r != 0:
            score2 += max(0, max(S[:r]))
        # score1 と score2 の大きい方がこの場合の得点の最大値
        score = max(score1, score2)

    ans = max(ans, score)

print(ans)
```
Gradle でプロジェクトファイル一式を ZIP アーカイブするタスクを定義する

## 概要

- Gradle でプロジェクトファイル一式を ZIP アーカイブするタスクを定義する
- 動作確認環境: Gradle 6.6 + Java 14 (AdoptOpenJDK 14.0.2)

## build.gradle

```groovy
plugins {
  id 'java'
}

repositories {
  mavenCentral()
}

version = '1.2.3'

dependencies {
  // 使うライブラリなどを指定
  implementation 'com.google.guava:guava:29.0-jre'
  testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.2'
  testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.2'
}

// プロジェクトファイル一式を ZIP アーカイブするタスクを定義
task myZip(type: Zip) {

  // ZIP ファイルを出力するディレクトリ
  destinationDirectory = file('..') // 一つ上の階層にしておく

  // アーカイブするファイル名
  archiveFileName =
    'myapp-' +
    archiveVersion.get() + '-' +
    new Date().format('yyyyMMdd_HHmmss_SSS') + '.zip'

  // プロジェクトディレクトリ
  from '.' // カレントディレクトリ

  // Gradle による生成ファイル置き場 (build ディレクトリ) や
  // .gradle などの隠しディレクトリを ZIP ファイルに含めない
  excludes = ['build', '.*']
}
```

## 動作確認

ソースコードだけでなくテキストファイルや画像ファイルなどもプロジェクト一式に含まれていることを想定。

```
$ find .
.
./foodir
./foodir/foo.jpg
./foodir/foo.png
./foo.txt
./build.gradle
./src
./src/test
./src/test/resources
./src/test/resources/mytest.properties
./src/test/java
./src/test/java/myapp
./src/test/java/myapp/AppTest.java
./src/main
./src/main/resources
./src/main/resources/myapp.properties
./src/main/java
./src/main/java/myapp
./src/main/java/myapp/App.java
```

定義したタスク myZip を実行。

```
$ gradle myZip

BUILD SUCCESSFUL in 651ms
1 actionable task: 1 executed
```

ZIP ファイルの中身を確認。

```
$ unzip -l ../myapp-1.2.3-20200816_091726_068.zip 
Archive:  ../myapp-1.2.3-20200816_091726_068.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  08-16-2020 07:45   foodir/
    14526  08-16-2020 09:16   foodir/foo.jpg
    18136  10-18-2019 18:50   foodir/foo.png
       84  08-16-2020 09:14   foo.txt
      998  08-16-2020 08:51   build.gradle
        0  08-16-2020 06:59   src/
        0  08-16-2020 06:59   src/test/
        0  08-16-2020 09:16   src/test/resources/
        9  08-16-2020 09:17   src/test/resources/mytest.properties
        0  08-16-2020 06:59   src/test/java/
        0  08-16-2020 06:59   src/test/java/myapp/
      357  08-16-2020 06:59   src/test/java/myapp/AppTest.java
        0  08-16-2020 06:59   src/main/
        0  08-16-2020 09:16   src/main/resources/
        9  08-16-2020 09:16   src/main/resources/myapp.properties
        0  08-16-2020 06:59   src/main/java/
        0  08-16-2020 06:59   src/main/java/myapp/
      286  08-16-2020 06:59   src/main/java/myapp/App.java
---------                     -------
    34405                     18 files
```

## 参考資料

- [Zip \- Gradle DSL Version 6\.6](https://docs.gradle.org/6.6/dsl/org.gradle.api.tasks.bundling.Zip.html)
- [Working With Files](https://docs.gradle.org/6.6/userguide/working_with_files.html)
AWS CLI で使用するプロファイルの追加方法

AWS CLIではconfigファイルとcredentialsファイルに保存された複数の名前付きプロファイルを使い分けることができます。

複数のAWS案件に同時に参画したり、異なる権限のIAMとユーザーを使い分けたり何かと便利なので、今回はその設定方法と確認方法についてまとめます。

※本記事はすでにAWS CLIを導入済みという前提に立って書かれています。


## プロファイルの認証情報の確認方法

プロファイルの認証情報は下記に保存されています。

- ~/.aws/credentials(Linux系OS と Mac)
- %USERPROFILE%\.aws\credentials(Windows OS)

Macだと下記のコマンドをiTermなりTerminalなりに打ち込めばプロファイル情報が出力されます。
伏せ字にしていますが、実際にはランダムな文字列が表示されます。

```
$ cat ~/.aws/credentials

[default]
aws_access_key_id = **********************
aws_secret_access_key = **********************
```

※アクセスキーとシークレットキーは重要な認証情報です。ソースコードにハードコードしたり、リモートリポジトリにPushしたりすることがないようにしてください。

AWS CLIの処理設定をした状態だと出力されるプロファイルはdefaultのみになります。

## プロファイルの設定情報の確認方法

各プロファイルは異なるIAMとユーザーの認証情報を使用し、AWSの別リージョンを設定したり、出力形式を指定したりすることもできます。

各プロファイルの設定情報は下記に保存されています。

- ~/.aws/config (Linux系OS と Mac)
- %USERPROFILE%\.aws\config (Windows OS)

Macの場合、下記コマンドを打ち込めば設定情報を出力することが出来ます。

```
$ cat ~/.aws/config

[default]
output = json
region = ap-northeast-1
```

## 名前付きプロファイルの追加

### アクセスキーを作成する
プロファイルの追加にはIAMユーザーの認証情報が必要です。

AWSマネジメントコンソールからIAMを選択し、下記のスクショの順序でアクセスキーを払い出します。

![iam.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200260/31396c93-e9f2-a686-a5c4-8d7097e63663.png)


アクセスキーの作成時の1回限り、アクセスキーとシークレットアクセスキーの認証情報をダウンロードすることができます。

このタイミングで忘れずにダウンロードし、セキュアな方法で安全に保管しておいてください。

### AWS CLIからプロファイルを追加する

認証情報を作成したら、次にAWS CLIから下記コマンドを入力して名前付きプロファイルを追加します。

```
$ aws configure --profile {{PROFILE NAME}}

$ aws configure --profile hazui  // たとえばこのように入力
```

この後、下記4つの情報を入力していきます

- 認証に使用するアクセスキー
- 認証に使用するシークレットアクセスキー
- リージョン
- 出力形式(textやjson)

なお、 `{{PROFILE NAME}}` に作成済みの名前付きプロファイルを指定すると、既存の情報を上書きしてプロファイルを更新することができます。

### 再びプロファイルを確認する

前述のプロファイル追加作業が終わったら、きちんと名前付きプロファイルが作成されているか確認しましょう。

さきほどと同じく下記コマンドで確認可能です。


```
// 認証情報
$ cat ~/.aws/credentials 
[default]
aws_access_key_id = **********************
aws_secret_access_key = **********************
[hazui]
aws_access_key_id = **********************
aws_secret_access_key = **********************

// 設定情報
$ cat ~/.aws/config
[default]
output = json
region = ap-northeast-1
[profile hazui]
output = json
region = ap-northeast-1
```

作業前はdefaultしかなかったプロファイルですが、 `hazui` という名前付きプロファイルが新たに追加されていることが確認できます。

「2回もコマンド叩くの面倒くさいよ」って方はこちら。

```
$ aws configure list --profile hazui
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                    hazui           manual    --profile
access_key     ******************** shared-credentials-file
secret_key     ******************** shared-credentials-file
    region           ap-northeast-1      config-file    ~/.aws/config
```

## 名前付きプロファイルの使い方

名前付きプロファイルを追加しましたが、単にawsコマンドを叩くだけだとdefaultのプロファイルが使用されます。

新たに追加した名前付きプロファイルを使用するには、下記のようなオプションを追加してコマンドを叩いてください。

```
$ aws lambda create-function --profile hazui
```


以上です。
Jetson Nano

# ファン制御

<details><summary>fan control</summary><div>

```cpp
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int32_t getTemparature()
{
    static const char* thermal_cpu = "/sys/devices/virtual/thermal/thermal_zone1/temp";
    char buffer[32];
    FILE* file = fopen(thermal_cpu, "rb");
    if(nullptr == file){
        return -1;
    }
    int32_t temp = -1;
    size_t size = fread(buffer, 1, 31, file);

    if(0<size){
        buffer[size] = '\0';
        temp = atoi(buffer);
    }
    fclose(file);
    return temp;
}

void controlFan(bool on)
{
    static const char* target_pwm = "/sys/devices/pwm-fan/target_pwm";
    FILE* file = fopen(target_pwm, "wb");
    if(nullptr == file){
        return;
    }
    static const char* str_on = "255";
    static const char* str_off = "0";
    const char* str = (on)? str_on : str_off;
    fputs(str, file);
    fclose(file);
}

int main(void)
{
    static const uint32_t wait = 3;
    static const int32_t upper = 50000;
    static const int32_t lower = 40000;

    bool fan = false;
    controlFan(false);
    for(;;){
        int32_t temp = getTemparature();
        if(0<=temp){
            if(fan){
                if(temp<=lower){
                    fan = false;
                    controlFan(fan);
                }
            }else{
                if(upper<=temp){
                    fan = true;
                    controlFan(fan);
                }
            }
        }
        sleep(wait);
    }
    return 0;
}
```
</div></details>

`/etc/rc.local`

```
#!/bin/sh -e
/bin/fan_control &
```

`/etc/systemd/system/rc-local.service`

```
[Unit]
Description=exec /etc/rc.local
[Service]
Type=oneshot
ExecStart=/etc/rc.local
TimeoutSec=0
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target
```

# TensorFlow

`https://docs.nvidia.com/deeplearning/frameworks/install-tf-jetson-platform/index.html`

# Swap
swap領域を拡張する. 元々設定してあるzramのswap領域が足りなくなったら使用される.
変えたい場合は, swaponのオプションで優先順位を変更する.

```
$ sudo fallocate -l 4G /swapfile
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
$ sudo swapon /swapfile
$ swapon -s
```

`/etc/fstab`に追加する.

```
/swapfile  swap  swap  defaults 0 0
```
windowsでiverilog その65

#概要　

windowsでiverilogやってみた。
遅いモジュールと同期する方法を考察してみた。

#遅いクロック
動く


```
module agent(input clk, input rst, input busy, output reg start = 0, output reg [7:0] char);
	reg [4:0] nn = 0;
	reg [3:0] state = 0;
	reg [23:0] cnt = 0;
	wire clk2 = cnt[13];
	always @(posedge clk)
	begin
		cnt <= cnt + 1'b1;
	end
	always @(posedge clk2 or negedge rst)
	begin
		if (!rst)
		begin
			state <= 0;
			nn <= 0;
		end
		else
		begin
			case (state)
			0:
			begin
				if (busy == 1'b1)
				begin
					if (nn != 5'd10)
					begin
						char <= 8'h55 + nn;
						start <= 1'b1;
						nn <= nn + 5'b1;
					end
					state <= 1;
				end
			end
			1:
			begin
				start <= 0;
				state <= 0;
			end
			endcase
		end
	end
endmodule

```

#waitする。
動く


```
module agent(input clk, input rst, input busy, output reg start = 0, output reg [7:0] char);
	reg [3:0] n = 0;
	reg [3:0] state;
	reg [23:0] wait_time = 16'd20000;
	always @(posedge clk or negedge rst)
	begin
		if (!rst)
		begin
			state <= 0;
			n <= 0;
		end
		else
		begin
			case (state)
			0:
			begin
				if (n != 10)
				begin
					char <= 8'h55 + n;
					start <= 1;
					n <= n + 1;
					state <= 1;
				end
			end
			1:
			begin
				wait_time <= 16'd4000;
				state <= 2;
			end
			2:
			begin
				wait_time <= wait_time - 1;
				if (wait_time == 0)
				begin
					state <= 3;
				end
			end
			3:
			begin
				start <= 0;
				state <= 4;
				wait_time <= 16'd60000;
			end
			4:
			begin
				wait_time <= wait_time - 1;
				if (wait_time == 0)
				begin
					state <= 5;
				end
			end
			5:
			begin
				state <= 0;
			end
			endcase
		end
	end
endmodule

```


#start/busyで待つ
動かん


```
module longshot(input clk, input rst, input start, input [7:0] data, input busy, output reg start2 = 0, output reg [7:0] data2, output reg busy2 = 0);
	reg [14:0] cnt = 0;
	always @(posedge clk or negedge rst)
	begin
		if (rst == 0)
		begin
			start2 <= 0;
			data2 <= 0;
			busy2 <= 0;
		end
		else if (start == 1)
		begin
			start2 <= 1;
			data2 <= data;
			busy2 <= 1;
		end
		else if (busy == 0 && start2 == 0)
		begin
			busy2 <= 0;
		end
		else if (busy2 == 1)
		begin
			cnt <= cnt + 1;
			if (cnt == 15'd22000)
			begin
				start2 <= 0;
				cnt <= 0;
			end
		end
	end
endmodule

module agent(input clk, input rst, input busy, output reg start = 0, output reg [7:0] char);
	reg [3:0] n = 0;
	reg [3:0] state;
	always @(posedge clk or negedge rst)
	begin
		if (!rst)
		begin
			state <= 0;
			n <= 0;
		end
		else
		begin
			case (state)
			0:
			begin
				if (busy == 0)
				begin
					if (n != 10)
					begin
						char <= 8'h55 + n;
						start <= 1;
						n <= n + 1;
					end
					state <= 1;
				end
			end
			1:
			begin
				state <= 2;
			end
			2:
			begin
				state <= 3;
			end
			3:
			begin
				state <= 4;
			end
			4:
			begin
				state <= 5;
			end
			5:
			begin
				state <= 6;
			end
			6:
			begin
				state <= 7;
			end
			7:
			begin
				start <= 0;
				state <= 0;
			end
			endcase
		end
	end
endmodule

```

以上。
AWSリソースをTerraform管理下から外す方法

私はAWSの構成管理にTerraformを日常利用しています。



AWSリソースをTerraformでコード化し、ある程度の期間管理していくとこんな思いを抱く時があります。



「作成済みのリソースは残したまま、Terraformの管理下からは外したい」



というわけで、今回は上記の手順を記録しておきます。



## 作成済みリソースをTerraform管理下から外す



下記コマンドを実行すればOKです。


```
$ terraform state rm <リソースタイプ>.<リソース名>
```

以上です。


上記コマンドを実行すると、destroy を実行したり、Terraformコードから該当リソースの定義を削除した状態で apply を実行しても、該当するリソースはAWS環境上に残り続けます。



## Terraformで管理しているリソースの一覧と状態を確認


`state rm` コマンドの実行しに指定するリソースタイプとリソース名は、terraform.tfstate というファイルに記録されています。



上記ファイルの管理方法には2種類(terraform.tfstate自体をVCSに含める or S3に保存する)あり、いずれの場合も下記コマンドで確認可能です。


```
# 一覧表示
$ terraform state list

data.aws_acm_certificate.sample
aws_ecs_cluster.sample
aws_ecs_service.sample
aws_ecs_task_definition.sample
・
・
・
aws_vpc.sample

# 状態確認
$ terraform state show aws_ecs_cluster.stg
# aws_ecs_cluster.sample:
resource "aws_ecs_cluster" "sample" {
    arn                = "arn:aws:ecs:ap-northeast-1:************:cluster/sample-cluster"
    capacity_providers = []
    id                 = "arn:aws:ecs:ap-northeast-1:************:cluster/sample-cluster"
    name               = "sample-cluster"
    tags               = {}

    setting {
        name  = "containerInsights"
        value = "disabled"
    }
}
```

`terraform state rm` コマンドで指定する値は、`terraform state list` コマンドの出力結果にあるリソース名を指定すればOKです。



ちなみに一覧表示の中で `data.~` から始まるリソースがあります。これは `「Terraformコードで参照しているけれども、作成自体はTerraform管理外で行われたリソースである」`ということを意味しています。
[swift] CVPixelBufferからCGImage、UIImageへ変換する

iOSでカメラを扱うとき、ところどころにcvPixelBufferが出てきますが、表示させたりフィルターをかけようとしたらCGImageやUIImage等に変換する必要があります。
そこで本記事ではCVPixelBufferからCGImageやUIImageに変換する方法をまとめておきます。

# CVPixelBuffer→CGImage

`VideoToolbox`ライブラリの`VTCreateCGImageFromCVPixelBuffer`という関数を使用します。

```
import VideoToolbox

var cgImage: CGImage?
VTCreateCGImageFromCVPixelBuffer(pixelBuffer, options: nil, imageOut: &cgImage)

```

ちなみにswift4.2では`options:`の引数名は省略可能です。

# CVPixelBuffer→UIImage

CVPixelBufferからCGImageに変換し、CGImageからUIImageを生成するExtensionです。
これは結構使える場面が多いので便利です。

```
extension UIImage {
    public convenience init?(pixelBuffer: CVPixelBuffer) {
        var cgImage: CGImage?
        VTCreateCGImageFromCVPixelBuffer(pixelBuffer, options: nil, imageOut: &cgImage)

        guard let cgImage = cgImage else {
            return nil
        } 
        self.init(cgImage: cgImage)
    }
}
```

# [補足1] CVPixelBuffer→CIImage

ちなみにCVPixelBufferからCIImageへの変換は簡単です。CIImageをinitializerで生成できます。

```
let ciImage = CIImage(cvPixelBuffer: imageBuffer)
```

# [補足2] CVPixelBuffer→CIImage→CGImage

一度CIImageに変換すれば、CIContextを使用してCGImageに変換することも可能です。

```
let ciImage = CIImage(cvPixelBuffer: imageBuffer)
let w = CGFloat(CVPixelBufferGetWidth(imageBuffer))
let h = CGFloat(CVPixelBufferGetHeight(imageBuffer))
let rect:CGRect = CGRect.init(x: 0, y: 0, width: w, height: h)
let context = CIContext.init()
guard let cgImage = context.createCGImage(ciImage, from: rect) else { return }
```

# 参考
[How to turn a CVPixelBuffer into a UIImage?](https://stackoverflow.com/questions/8072208/how-to-turn-a-cvpixelbuffer-into-a-uiimage)
MySQL

# ０
MySQL サーバーが動いているかどうかは、管理者コマンドを使って調べることができる。
[vagrant@localhost mysql_lessons]$ sudo service mysqld status

####MySQLサーバーに接続 mysql -u ユーザー名
mysql の root ユーザーがパスワードなしで、すでに設定されていれば mysql -u root としてあげると接続できる。
[vagrant@localhost mysql_lessons]$ mysql -u root

####使えるコマンドが表示されました
mysql> help;

####現在のユーザーを表示する
mysql> select user();

入力（；）が足りないと
    -> ;

###### ; を忘れたときに、今のコマンドをキャンセルして次のコマンドを打ちたい場合には \c としてあげれば OK です。
mysql> select user()
    -> \c

####MySQL サーバーへの接続を終了するには quit; とするか、もしくは単に \q 
mysql> \q

####画面をクリアするには
Control + L



#データベースを作る
####ログイン
[vagrant@localhost mysql_lessons]$ mysql -u root

####データベースの一覧を表示
mysql> show databases;

####データベースを作る　create database データベース名
mysql> create database mydb01;

####データベースを削除する　drop database データベース名
mysql> drop database mydb03;

####操作対象になっているデータベースを確認する　select database();
mysql> select database();

####操作対象を設定する　use データベース名;
実際にデータベースの中のデータを扱っていくには、操作対象として選択する
mysql> use mydb02;

#権限が限られた作業用ユーザーを作る
####作業用ユーザーを作る　create user ユーザー名@サーバー名 identified by 'パスワード';
作業用ユーザーを作るには、 root ユーザーで作業する
dbuser01 という名前で localhost からアクセスしてくるユーザーを設定する。

mysql> create user dbuser01@localhost identified by '6AVAkig2';

####権限を通す。grant
dbuser01 に対して mydb01 の全てのテーブルに関する全ての権限を与える、という意味。

mysql> grant all on mydb01.* to dbuser01@localhost;

####MySQL サーバーへの接続を終了するには quit; とするか、もしくは単に \q 
mysql> quit;

####ユーザー名とデータベース名を指定して接続　mysql -u ユーザー名 -p データベース名
-p はパスワードを入力する時。
[vagrant@localhost mysql_lessons]$ mysql -u dbuser01 -p mydb01

####作業用ユーザーを削除する。 drop user ユーザー名@サーバー名;
root ユーザーで作業する

mysql> drop user dbuser01@localhost;
JS 配列の指定の範囲を別の要素に置き換える

## lodashのfillメゾッドを作ってみた

[▶︎lodath fill](https://lodash.com/docs/4.17.15#fill)

~~~javascript
const fill = (array = [], value, start = 0, end = array.length) => {
  const fillArray = []
  for (let i = 0; i < array.length; i++) {
    if (start <= i && i < end) {
      fillArray.push(value)
    } else {
      fillArray.push(array[i])
    }
  }
  return fillArray
}

console.log(fill([1, 2, 3], "a"))
// => [ 'a', 'a', 'a' ]

console.log(fill(Array(3), 2))
// => [ 2, 2, 2 ]

console.log(fill([4, 6, 8, 10], "*", 1, 3))
// => [ 4, '*', '*', 10 ]
~~~

### もう少し省略できた
~~~javascript
const fill = (array = [], value, start = 0, end = array.length) => {
  for (let i = 0; i < array.length; i++) {
    if (start <= i && i < end) {
      array[i] = value
    } 
  return array
}
~~~
Dockerコマンド覚書

自分が使ってて出てきたDockerコマンドを列記。
適宜追記や記事にしていったりすると思います。

```
docker login // dockerhubにログイン
docker pull <image> // <image>をHostへpullしてくる
docker run -it <image> bash // コンテナを生成してコンテナへ入る
exit //　コンテナから出る
docker ps -a // Hostにあるコンテナの一覧を表示する（ステータスを把握する）
docker images // Hostにあるイメージの一覧を表示する
docker restart // exited状態のコンテナを再起動する
docker exec -it <container> bash // コンテナに対し指定したプログラムを実行する
docker commit <container> <image> // 生成したコンテナから新たにイメージを作る
docker tag <source> <target> // dockerhubにあるリポジトリと同じ名前をつける
docker push <image> // dockerhubへpushする
docker rmi <image> // Hostにあるイメージを削除する
```

ps = process status

exec = execute

rmi = remove image
JS 配列内の最初の配列のみ展開する

## lodathのflattenメゾッドを作ってみた

[▶︎ lodath flatten](https://lodash.com/docs/4.17.15#flatten)

~~~javascript
const flatten = (array) => {
  const flattenArray = []
  for (let i = 0; i < array.length; i++) {
    const object = array[i]
　　//Array.isArray => 配列か判定
    const isArray = Array.isArray(object)
    if (isArray) {
      flattenArray.push(...object)
    } else {
      flattenArray.push(object)
    }
  }
  return flattenArray
}

console.log(flatten([0, [2, 2, [3, [4]], 5], 1]))
// => [ 0, 2, 2, [ 3, [ 4 ] ], 5, 1 ]
~~~


###flatMapを使えばすごくシンプルにかけた
こんな使い方できるとは・・！
自分が無知すぎて知らなかった。。ご教授頂き@YutaUraさんありがとうございます！


~~~javascript
const arr = [0, [2, 2, [3, [4]], 5], 1]
console.log(arr.flatMap((v) => v))

// => [ 0, 2, 2, [ 3, [ 4 ] ], 5, 1 ]
~~~
【Flutter】【iOS】SimulatorでTextFieldを操作した時の画面フリーズを解消する方法【xcode】

#この記事を読んで習得できること
Xcode、FlutterでiOSアプリの開発をしている際に生じる、
TextFieldを操作すると画面がフリーズする問題を解消することが出来る
（つまずくとマジできついので備忘録として）

#結論

1.シミュレータの「ペーストボードの自動同期」のチェックをはずす 
（Simulator -> Edit -> Automatically Sync Pasteboardをクリック)

![スクリーンショット 2020-08-16 7.02.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389553/43addc88-cc85-3bde-9442-9968cd3de1ac.png)


2.シミュレータアプリ自体を再起動
（command + qで簡単に消せるよ）

#どういうこと？
Flutterでいつものように、アプリの開発をしていた。
ログイン画面作らなきゃなーと思い、
「ユーザーID」と「パスワード」のTextFieldを作成。

デザイン的にもいい感じだし、とりあえず何かキーボードで入れてみるか、と思ったところ…

![スクリーンショット 2020-08-16 6.56.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389553/0ce49f7e-2e8b-d5e7-56d1-999aa56c3163.png)


**にゅ、入力出来ない…**

見事なまでに画面がフリーズしてしまった。
何度も何度もsimulatorを再起動したり、`flutter clean`したけれど、状況は変わらない。

これは、困ったぞ…

#解決に至るまで
Androidのemulatorで、同じように試したところ、こっちだと問題なく動いた。
と、いうことは、記載したコードが問題ってことはなさそう。

なので、Flutterだから、という可能性は少なそうってことで、
`ios simulator freezes textfield`で調べてみることにした。

すると、以下の記事が出てきたので、同じような操作をして、直った。

https://kiotera-tech.com/xcode11_ios_simulator_freeze_when_keyboard_show

ありがとうございます！🙇‍♂️
C#で消せない警告

C#を使っていて消せない警告の一覧です。
気付いた時に随時追加していくつもりです。

# 概要
8月16日の++C++;管理人の岩永さんの放送で話題になったので記事を建ててみました。
https://youtu.be/-_QGGvT5FEw?t=6485

もちろん``#pragma warning disable``で消せますが、それは無視します。

# 一覧
## CS0067:イベント 'event' は使用されません
[Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/misc/cs0067)

これは説明通り、イベントを作ったけど使ってない時に出る警告です。
もちろん消せるなら消せば良いんですが、イベントを含むinterfaceを継承した場合は消せませんね。
実は消せるんですかね？

```C#
    public class ShowMessageCommand : ICommand
    {
        public event EventHandler CanExecuteChanged;

        public bool CanExecute(object parameter) => true;

        public void Execute(object parameter)
        {
            Application.ShowMessage(parameter?.ToString());
        }
    }
```

## CS0612: 'member'は古い形式です
[Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/misc/cs0612)

これは``[Obsolete]``をマークしたメンバーを参照した時に出る警告です。
当然避けるべきですが、互換性維持や移行目的で旧コードにアクセスしなければいけない場合どれか一つ警告が残さないといけなかったりします。

## CS1998: この非同期メソッドには「await」演算子がなく、同期して実行されます。

> この非同期メソッドには 'await' 演算子がないため、同期的に実行されます。'await' 演算子を使用して非ブロッキング API 呼び出しを待機するか、'await Task.Run(...)' を使用してバックグラウンドのスレッドに対して CPU 主体の処理を実行することを検討してください。

``async``を使う人はこれに困っている人が多いんじゃないでしょうか。
言っておきますが、ほとんどの場合これは消せます。というか一応全て消せるはずです。
具体的には``Task.CompletedTask;``や``Task.FromResult();``を使います。

```C#
Func<Task> a = async () => { DoSomething(); };
Func<Task<bool>> b = async () => true;
```

これらは以下に書き換えられます。その内リファクタリング機能が対応するでしょう。

```C#
Func<Task> a = () => { 
    DoSomething();
    return Task.CompletedTask;
};
Func<Task<bool>> b = () => Task.FromResult(true);
```

でもちょっと冗長ですよね。
例えばこれ

```C#
DoSomething(async (_)=>(null,null));
```

とこれ

```C#
DoSomething(_ => Task.FromResult<(Func<bool> FirstResult, Func<bool> SecondResult)>((null, null)));
```

だと前者を使いたくなりますよね。
これは[タプル](https://ufcpp.net/study/csharp/datatype/tuples/)にデリゲートが絡んだ例で、型推論が効かないケースです。単なるタプルなら利いてくれたりするんですけど。
[個人的に最近あった例](https://github.com/kurema/BookViewerApp3/commit/46a619bb36f40d0b15dea2cab9c4ba3761ca6adb)で、その時は全部``(null,null)``だったので一か所にまとめましたが、そうじゃなかったら警告を残してました(別にタプルを返す関数を作れば良いけど)。

2021年10月30日追記：
現時点でもやはり型推論は効いてません。[Sharplab](https://sharplab.io/#v2:D4AQTAjAsAUCAMACEECsBuWsAiB7AyrgLYCmALgBYCWAdgOYAUIAHIgwJQC8AfAzQK4AbQQBoBw9u0wwA9DLyFSlWow48QANgB0AMQBOxAEokAzkLIM+Q0eMGSpOAsXLV6lrt026DRY2cFkADxMqIEARri4gtyIOlR6JmR+5iLIoRFRMfgkAMa4NAAmyQHsvFbCYtb20rAgACyICs7KbiChmsFt4ZHRsfGJxWSpXRm92XmFg6UxAGb8NDnsAN6wiGuIcwtaAJI0AG64ANYkHNIAvkA==)。

## 参照コンポーネント 'Microsoft.VCLibs' が見つかりませんでした。
最近しばらく出てる警告。謎です。
参照を消せば動きませんし、ほっとけば問題が出ないんで放置してます。
一応の対策としては「Nugetパッケージの復元」「ソリューションのクリーン」「.vsフォルダの削除」あたりが標準的だと思います。

最近気になってるので載せましたがこの記事の性質とはちょっと離れてますね。
[Xamarin Formsでの記事](https://itblogdsi.blog.fc2.com/blog-entry-429.html)。
でもこの手の謎警告で消せない場合ってたまにあります。
ABC175やってみた（個人的備忘録）

最近競プロを始めて、せっかくだからコンテスト参加しようと思ってたのに忘れてたのでついさっきやりました。
Cまではできました。

#A Rainy Season
こういうことですよね？

```python
s=input()
if s=="RRR":
    print(3)
elif "RR" in s:
    print(2)
elif "R" in s:
    print(1)
else:
    print(0)
```

#B Making Triangle
ソートして全探索で間に合うと思ったのでそうしてみました。
3つずつ切り抜いてからソートとどっちが早いんでしょう。私はよくわかってません。

```python
n=int(input())
l=sorted([int(i)for i in input().split()])
ans=0
for i in range(n-2):
    for j in range(i,n-1):
        for k in range(j,n):
            if (l[i]!=l[j]and l[j]!=l[k])and l[k]-l[i]<l[j]:
                ans+=1
print(ans)
```

#C Walking Takahashi
こういう数学的問題は個人的に苦手です。
良い感じに切り分けると良さそうだったのでそうしました。
X<0なXから正の方向へD移動するのと|X|から負の方向へD移動するのは座標の絶対値を求めるうえでは同じことなので、とりあえず最初にXを|X|に変換。
まず、k*DがXより小さいならX-k*Dが最小の座標なのは明らか。
次に、k*DがXより大きい場合はX%D（原点を超えない回数移動した際の座標）からk-X/D回移動することになるので、kとX/Dの偶奇が一致するか否かで場合分けします。
同じ場合はX%Dが、違う場合は|X%D-D|が答えになります。

```python
X,k,D=map(int,input().split())
X=abs(X)
ans=0
if X>k*D:
    ans=X-(k*D)
else:
    if k%2==(X//D)%2:
        ans=X%D
    else:
        ans=abs(X%D-D)
print(ans)
```

#D　Moving Piece
ここまで書いたけど単純な全列挙だとTLEだよなあと思いました。
D問題からはぐっと競プロっぽくなるというかぱっと見で何言ってるのかわからなくなるというか……。
人とは……宇宙とは……。

```python
n,k=map(int,input().split())
p=[int(i)for i in input().split()]
c=[int(i)for i in input().split()]
score=[0 for i in range(n)]
```
【SwiftUI】ListでForEachを回すときの注意点

#はじめに
SwiftUI のListで削除メソッドを作るときにアイテムを削除すると、ForEachで回していたUIコンポーネンツがIndex out of range のエラーを吐き出したので治し方を共有しておきます

##問題のコード
```swift
struct someView: View {
    @State var animals: [String] = ["🐶", "🐱", "🐊"]
    var body: some View {
        List {
            ForEach(0..<animals.count) { i in
                HStack {
                    Text(self.animals[i])
                        .padding(.all)
                    Spacer()
                }
            }
            .onDelete(perform: delete)
        }
    }

    func delete(at offsets: IndexSet) {
        animals.remove(atOffsets: offsets)
    }
}
```

この時、左スワイプで列を削除すると、必ずanimals[i]が範囲外になってしまうんです…
これは`0..<animals.count`が読み込まれた段階で判定されており、Binding要素ではないからだそうで。
[参考](https://yutailang0119.hatenablog.com/entry/delatable-table-with-textfield-on-swiftui)

##解決法
ダイナミックに変更するにはidを指定すると良いとのこと

```swift
struct someView: View {
    @State var animals: [String] = ["🐶", "🐱", "🐊"]
    var body: some View {
        List {
            // id:\.self を指定する
            ForEach(animals, id: \.self) { animal in
                HStack {
                    Text(animal)
                        .padding(.all)
                    Spacer()
                }
            }
            .onDelete(perform: delete)
        }
    }

    func delete(at offsets: IndexSet) {
        animals.remove(atOffsets: offsets)
    }
}
```
std::ops::Range に binary_search_by メソッドを追加する

# モチベーション

Rust で二分探索を行う場合 Vec や slice であれば [binary_search_by](https://doc.rust-lang.org/std/vec/struct.Vec.html#method.binary_search_by) が存在します。

しかし「なんらかの条件を満たす最小の整数」などを求める場合などは
配列などを作ってしまうとメモリを無駄に使うことになります。

# 実装

```rust
trait BinarySearch<T> {
  fn binary_search_by<F>(&self, f: F) -> Result<T, T>
  where
    F: FnMut(&T) -> std::cmp::Ordering;
}

impl<
    T: PartialOrd
      + std::ops::Add<Output = T>
      + std::ops::Sub<Output = T>
      + std::ops::Div<Output = T>
      + Copy
      + From<u8>,
  > BinarySearch<T> for std::ops::Range<T>
{
  fn binary_search_by<F>(&self, mut f: F) -> Result<T, T>
  where
    F: FnMut(&T) -> std::cmp::Ordering,
  {
    use std::cmp::Ordering::*;
    if self.end <= self.start {
      return Err(self.start);
    }
    let mut base = self.start;
    let mut size = self.end - base;
    loop {
      let half = size / T::from(2);
      let mid = base + half;
      let cmp = f(&mid);
      match cmp {
        Less => base = mid,
        Equal => return Ok(mid),
        _ => {}
      }
      if T::from(0) == half {
        return Err(base + T::from((cmp == Less) as u8));
      }
      size = size - half;
    }
  }
}
```

# 使用例

https://atcoder.jp/contests/abc174/submissions/15971483
【Python】配列内の要素を全て結合

Pythonでスクレイピングを勉強しています。１ページごとの値を取得したかったのですが、class名などが被りいらない値まで取ってきやがりました。そこで今回は、「１ページ毎の配列をとりあえず全部結合させて、正規表現でいる部分だけ略奪作戦」をやっていきたいと思います。

## 工程

1. 配列内の要素を全て結合させる
1. 結合させたやつに、正規表現をかける
1. 正規表現にmatchした部分だけ採取


この**Japan**だけが欲しい

```py3
list = ['非表示', '非表示', '非表示', '非表示', '非表示', 'Japan', '非表示']
```

## 配列内の要素を全て結合させる

```py3
list_join = (''.join(list))
print(list_join)
# 非表示非表示非表示非表示非表示Japan非表示
```

## 正規表現をかけ、いる部分だけ採取

```py3
list_join = (''.join(list))
compile = re.compile('[a-zA-Z]+')
print(''.join(compile.findall(list_join)))
# Japan
```

参考
https://murashun.jp/blog/20200113-20.html
https://note.nkmk.me/python-re-regex-character-type/
【WPF】ViewModelからWindowを閉じる方法の１つ

# この記事は何か
WPFでアプリを作っている。
**ViewModelからWindowを閉じる方法**を探したが、どれもピンと来なかった。
いろいろな記事から良いとこ取りをした、自分なりの結論（方法）を書く。


（想定）

* Window1.xamlにボタンが1つ配置されている。
* そのボタンをクリックすると、Windowが閉じる。

# View
ボタンの親Windowを探して、それを引数に<code>CloseWindow</code>を実行する。
<code>CloseWindow</code>は後述のViewModelに実装する。

```xml:Window1.xaml
<Button Command="{Binding CloseWindow}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Content="Close" />
```
#ViewModel
<code>ReactiveProperty</code>でコマンドを宣言し、コンストラクタ内に処理の内容を書く。

<code>System.Windows.Window</code>で安直にキャストして<code>.Close()</code>しているけど、
本当はちゃんと<code>null</code>チェックとかした方がいい。


```cs:Window1ViewModel.cs
// プロパティ宣言
public ReactiveCommand CloseWindow { get; } = new ReactiveCommand();

// コンストラクタ内
CloseWindow.Subscribe(x => ((System.Windows.Window)x).Close());
```
#使い道
ウィンドウ内の　OK/キャンセル　ボタンを押して
**すぐにウィンドウを閉じる**のではなく
**確認ダイヤログを表示してからウィンドウを閉じたい**場合。

```xml:Window1.xaml
<Button Command="{Binding OK}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" Content="OKボタン" />
```
```cs:Window1ViewModel.cs
// コンストラクタ内
OK.Subscribe(x => {
    result = MessageBox.Show("ウィンドウを閉じてもよろしいですか？", "確認メッセージ", MessageBoxButtons.OKCancel);
    if (result == DialogResult.Cancel)
        return;
    else
        CloseWindow.Execute(x);
});
```


#最後に

きっと、もっといい方法があると信じている

#参考
[xamlだけでウィンドウを閉じる処理を実装 (www.neko3cs.net 様)](https://www.neko3cs.net/entry/2019/08/29/225255)

#追記2020.08.17
コメントいただき、TriggerActionでググったら、あっという間に正解にたどり着きました。
[MVVMでウインドウを閉じる - Qiita](https://qiita.com/flasksrw/items/f9dc8e80a094c02d00f3)

もっとちゃんと検索してから記事を書きます。
ありがとうございました。

#追記2020.08.27
コメントで関連動画を紹介いただきました。ありがとうございます。
[YouTubeの動画 (イントロを飛ばして開始120秒から再生)](https://www.youtube.com/embed/U7Qclpe2joo?start=120)