OmniAICreator/Qiita-1.07M huggingface dataset:
任意のチェックボックスをONにするブックマークレット

#概要
複数のチェックボックスがあるWebページで、特定のチェックボックスをONにするためのブックマークレット。

#想定ケース
例えば以下のようなWebページにて、項目002, 003, 005 のチェックボックスを一括でONにしたい場合を想定する。
各チェックボックスのname属性はすべて同じで、value属性が異なる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406860/a5fde4fe-81e2-5fe3-7c80-ebf0258a1813.png)

```html:chekbox.html
  <td><input type="checkbox" name="HOGE" value="HOGE001" checked> 項目001 </input></td>
  <td><input type="checkbox" name="HOGE" value="HOGE002"> 項目002 </input></td>
  <td><input type="checkbox" name="HOGE" value="HOGE003"> 項目003 </input></td>
```

#コード
以下のコードの"HOGE002"等の部分に、チェックしたい項目のvalue属性の値を入れる。これを一行にしてBookmarkletとして保存する。
[Closure Compiler Service](https://closure-compiler.appspot.com)など使うと便利。

```javascript:複数行で書いたコード
javascript:(
  function(){
    var arr = ["HOGE002","HOGE003","HOGE005"];
    var e = document.getElementsByTagName("input");
    for(i = 0; i < e.length; i++){
      var ei = e[i].value;
      if(arr.indexOf(ei) >= 0){
        e[i].checked = true;
      }
    }
  }
)();
```

```javascript:一行にしたコード
javascript:(function(){var arr=["HOGE002","HOGE003","HOGE005"];var e=document.getElementsByTagName("input");for(i=0;i<e.length;i++){var ei=e[i].value;if(arr.indexOf(ei)>=0)e[i].checked=true}})();
```

①オンにするチェックボックスのvalue属性の値を配列arrとして定義する。
②document.getElementsByTagName()で対象ページ上のチェックボックスを全て取得する。
③forループを回し、各チェックボックスのvalue値をひとつずつ ei に代入。
④最初に定義した配列arrの中にei の値があれば、そのチェックボックスはチェック対象。
　チェックボックスをオン(checked = true)にする。

#補足
①のようにわざわざ配列で定義しなくてもよい。
ただ、最初に対象を定義しておくと「対象のチェックボックスをちょっと変えたい」という場合に修正しやすいだろうし、対象が増えた場合でも書きやすいかと思う。
配列使わずif文でゴリ押しすると↓こんな感じ？

```javascript
javascript:(
  function(){
    var e = document.getElementsByTagName("input");
    for(i = 0; i < e.length; i++){
      var ei = e[i].value;
      if(ei == 'HOGE002' || ei == 'HOGE003'){
        e[i].checked = true;
      }
    }
  }
)();
```

②③は本当はvalue属性の値を指定して、対象のチェックボックスだけ取得したかった。
例えば document.getElementByValue("HOGE002") みたいに。
でもそんなメソッドは無いらしい。 仕方ないので、タグ名指定で全てのinputタグの要素を取得する。
チェックボックス以外のinputタグ(テキストボックス等)も取得されるはずだけど、特に困らなかったので気にしなかった。

④は配列arrの中に "HOGE002" があるか？という判定をするだけ。
"exists"とか"contains"とかのメソッドが無いらしいので、indexOf()で代用(*1 参考)。
配列内に見つからなければ負の値を返すので、戻り値が 0 以上なら存在すると判定。

#派生ケース
特定のチェックボックス "だけ" にチェックを入れたい場合。
すなわち、デフォルトでチェックが入っているが、不要なチェックは外したい場合。

```javascript
javascript:(
  function(){
    var arr = ["HOGE002","HOGE003","HOGE005"];
    var e = document.getElementsByTagName("input");
    for(i = 0; i < e.length; i++){
      e[i].checked = false;
      var ei = e[i].value;
      if(arr.indexOf(ei) >= 0){
        e[i].checked = true;
      }
    }
  }
)();
```

for文の最初に e[i].checked = false; を入れるだけ。
チェックしない対象を羅列した配列を用意して、それに合致したらfalseにする・・・というのを一瞬考えたけど、そんな必要はないね。

#背景
50個くらいのチェックボックスのうち特定の20個くらいをチェクして結果出力、という作業を業務で何十回もやる必要があった。どのチェックボックスをチェックすればよいか覚えられないし、チェックするのにめちゃくちゃ時間がかかるし、チェックも漏れがちだし、嫌いすぎて自動化したかった。調べてみたらブックマークレットというものを知り、適当に書いてみたら自動化できたので嬉しさのあまり投稿。
・・・たぶん普通に生きていたらこんなブックマークレット使う機会はないと思う。


#参考
(*1) Javascriptで配列にある値が存在するかどうかを確認する方法について - プログラミングを勉強するブログ
https://artgear.hatenablog.com/entry/20130124/javascript_array_contain_how_to
ユーザが「いいね！」をゲットした総数を表示させるのは、どうやるの？

どうも！Hiroyukiです＾＾

####前回、いいね！機能の実装方法について詳しく説明させて頂きました。

（興味ある方は、下記記事をご覧下さい〜）
####●「いいね！機能の実装方法」詳しく解説〜PHP/Laravelを使って
####https://qiita.com/Hiroyuki-Hiroyuki/items/e5cb3b6595a7e476b73d

今回は、そこから派生させて
####ユーザが「いいね！」をゲットした総数を表示させる方法！！
を解説させて頂きます〜

#やりたいこと

今回やりたいことを、ボクのオリジナルアプリの例でいうと、
以下の画像の各ユーザのチャンネルの右上に
####「 ○(数字) いいね！ 」
という、緑色のBootstrapのバッジがあると思いますが、
「この数を表示させたい」というシンプルな内容です。
<img width="993" alt="スクリーンショット 2019-09-22 16.35.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489124/45d13f6c-6d3a-0574-ed9b-b8f641697711.png">

前回は、各動画（コンテンツ）ごとに「いいね！」された数を表示させる方法を解説したのですが、
今回は
####「ボク（各ユーザ）は一体、合計で何ポイントの「いいね！」を貯めたのかなぁ〜〜〜？？」
ということが、一瞬で分かる表示を設けたい場合に、どうすればいいかを解説しますっ！

前回と同じく、前提として、下記の画像のような

####ユーザ：コンテンツで、「１対多」の関係
があるようなサービスが既に作られている前提で、話を進めて行きま〜す！
<img width="695" alt="スクリーンショット 2019-09-22 8.04.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489124/e715765b-e0d8-5f93-af4e-c6d78f95332e.png">


この「いいね！」機能では、各ユーザが各ムービー（コンテンツ）に「いいね！」をする形です。
僕が作っているのが、下記サイトの、動画を使ったSNSサービスみたいなものなので、
コンテンツは 「movies(動画)」 となっていますが、
####ツイッタークローンなど作成の場合も、実装方法は全く同じだと思いますので、
是非ぜひ参考にしてみてくださーい＾＾
####※Twitterクローンの場合は、
####コンテンツが「つぶやき（tweets,micropostsなど）」に変わるだけですね！


ボクのオリジナルサービス　【いいね！機能実装済み】
####●YouTubeまとめ × コミュニケーション
####http://youtubematome.herokuapp.com


#「いいね！」総数の表示方法を解説！
ユーザ（チャンネル）一覧を表示しているview

```php
@foreach ($users as $key => $user)

        @php

            $movies=$user->movies;

            $total=0;

            foreach ($movies as $key => $movie){
                $total += $movie->favorite_users()->count();
            }

        @endphp

        <div>{{ $user->name }}</div>

        //・・・（中略）・・・

@endforeach
```
もともとが、ユーザ（チャンネル）一覧で、各userを表示させる為に、
foreach文を利用していました。

####そのforeach文の中で、userが所有している全てのmovie(コンテンツ)を取り出さないといけないため、
####更にその先で、foreach文を利用している「入れ子構造」になっています。

本来、こういう処理はコントローラーの中に書くべきなんですが、
ユーザ（チャンネル）一覧表示のため、viewにforeach文を置いているので
必然的にviewの中にこのような処理を持ってきています。

####（※もっと綺麗な書き方・やり方があれば、ぜひ教えて下さい！😓）

そして、

```php
$movies=$user->movies;
```
####で、各ユーザの持っているコンテンツ（動画）を全て取り出します！
（もちろん、Userモデルにmovies(）関数を定義しておく必要があります）

その後、foreach文を使い、コンテンツ（movies）を１つ１つ抽出しますっ

####そしてそして、各コンテンツを「いいね！」しているユーザを数えるのが下記のコード！

```php
$total += $movie->favorite_users()->count();
```
このfavorite_users()関数は、コンテンツ（Movie）のモデルで定義しているものですね

Movie.php

```php
class Movie extends Model
{

    //・・・中略・・・

    public function user()
    {
            return $this->belongsTo(User::class);
    }

    public function favorite_users()
    {
            return $this->belongsToMany(User::class,'favorites','movie_id','user_id')->withTimestamps();
    }

}
```

####各movieの「いいね！」の数を数えたものを、$totalに足していき、
####下記のように表示させれば万事完了〜！

ユーザ（チャンネル）一覧を表示しているview

```php
@foreach ($users as $key => $user)

        @php

         //・・・（中略 上に同じ）・・・

        @endphp

        <div class="text-right">
           <span class="badge badge-pill badge-success">{{ $total }} いいね!</span>
        </div>

        <div>{{ $user->name }}</div>

        //・・・（中略）・・・

@endforeach
```

ボクも、「いいね！」ゲット数を表示させるのに、自分で考えて結構苦労したんですが
####（ググり方が下手なのか、同様の内容のドキュメントが出てこずで、てこずりましたね💦）
####コードを見るとシンプルですねぇ！

是非、参考にしてみて下さい。

Hiroyukiでした〜＾o＾
【超級初心者のための】ブループリントのイベントや関数などの内容【Unreal Engine 4】

ブループリント画面での操作方法については[こちら](
https://qiita.com/KINGREGION/items/26d2b7fe0da852979802#%E3%83%96%E3%83%AB%E3%83%BC%E3%83%97%E3%83%AA%E3%83%B3%E3%83%88%E7%94%BB%E9%9D%A2%E3%81%A7%E3%81%AE%E6%93%8D%E4%BD%9C%E6%96%B9%E6%B3%95 "ブループリント画面での操作方法")
バージョンは4.20.3（一部日本語と英語が混ざっているがあくまで画面に合わせています）
**※独自解釈でまとめているため誤りなどがある場合がありまぁす！**

# イベント（赤色）
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501431/91be3166-c008-0885-1f0f-96eb4a102213.png)

### AnyDamage
**何らかのダメージを受けたときに呼ばれるイベント**
Damage：受けたダメージ量
Damage Type：？？？
Instigated By：？？？
Damage Causer：？？？

### BeginPlay
**ゲームが始まった時のイベント（実行回数は1回のみ）**
ショートカット：Pキー＆マウス左クリック

### Tick
**毎フレーム呼ばれるイベント（何回も呼び出される）**
Delta Seconds：？？？

# 関数（青色）
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501431/d7c51b4f-13c9-bf89-81a9-09d0f02f364f.png)

### Delay
**遅延時間後に実行する**
Duration：遅延時間の長さ（秒）
ショートカット：Dキー＆マウス左クリック

### DestroyActor
**対象オブジェクトを削除する**
ターゲット：削除対象

### Print String
**一定時間、画面に文字を描画する（描画後、一定時間後に消滅する）**
In String：描画したい文字列

### Set Timer by Function Name
**一定時間後（ループの場合は毎）に関数を実行する**
Object：？？？
Function Name：関数名（string）
Time：実行までの時間（秒）
Looping：ループするかどうか

# 関数（緑色）
![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501431/d596e3b3-1d5e-bb20-2b3d-0435c4ef631e.png)

### GetWorldLocation
**オブジェクトのワールド座標を取得する**

### Get Scaled Box Extent
**Boxのサイズを取得する**

### Random Point in Bounding Box
**指定したBox内の座標をランダムに返す**
Origin：オブジェクトの座標（GetWorldLocationで取得した座標など）
Box Extent：オブジェクトのサイズ（Get Scaled Box Extentで取得したサイズなど）

# その他（黒色）
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501431/c7766d70-3c0c-b93e-5985-018ded7851f4.png)

### ブランチ
**分岐処理（Conditionの結果がTrueかFalseかで分岐させる。要はif文）**
ショートカット：Bキー＆マウス左クリック

### DoOnce
**処理の実行回数を1回だけにする（当たり判定など重複してしまう場合などに使用する）**
Reset：リセットするタイミング（オブジェクトが離れたときなど）
Start Closed：？？？

### Sequence
**並行処理（同じタイミングで実行する）**
Then 0：1つ目に行いたい処理
Then 1：2つ目に行いたい処理
Then n：nつ目に行いたい処理
Docker+nginx+phpfpm+CakePHP3でcssファイルが(404 not found)だった

# 概要
`docker-compose` を使って、nginx+phpfpm+CakePHP3でコンテナを立ち上げたが、CakePHP3のwelcome画面にてcssがすべて404になっていた。 (正確には `.php` 以外のファイルが404)

# 結論
`docker-compose.yml`の`nginx` 方にも`phpfpm` と同様に `volumes` を指定してあげると良い。

# 経緯
こちらの記事を参考にさせて頂いて、
https://qiita.com/mochizukikotaro/items/b398076cb57492980447
https://github.com/mochizukikotaro/docker-nginx-phpfpm/tree/simple

よし、俺も爆速でCakePHP3を動かしてみるかと~~業務時間中に~~遊んでいたのだけど、CakePHP3のwelcome画面でCSSが全く効いていない。 `.php` は問題ないので、nginxのdefault.confを見直すも、特に問題なさそう。落ち着いていくつかの記事を漁ったところ `結論` に書いた方法でうまくいきました。

こちらの記事にもちょっとそのような事が書いてありました。
https://oki2a24.com/2018/07/30/point-of-nginx-php-fpm-simple-doccker-compose/

あるいは、`nginx`コンテナのdefault.confを、↓のようにして、

`location ~\.(php|html|css)$ {`

`php-fpm` コンテナ側の `security.limit_extensions` に `.html`や`.css`を追加してやればそちらで処理することも可能なのかもしれないが、nginx+phpfpmでの正解をいまいち分かっていないため、こちらはとりあえずやってません。( `limit_extensions` を記載しない状態では、php以外は403 )

ベストプラクティス知ってる偉い人がいたらぜひ教えてほしい。
調査用コマンドが不足しているDockerコンテナに手軽に必要コマンドを導入する

コンテナ内の調査時に必要コマンドがインストールされていない場合、都度個別にコマンドインストールするのは骨が折れます。その場合は、BusyBoxを使うと便利だそうです。

こちらの記事に書いてある内容を抜粋して以下に記載しています。
https://kazuhira-r.hatenablog.com/entry/2019/04/28/022717

# BusyBoxとは？
>BusyBoxとは、Aboutページによると「多くの一般的なUnixユーティリティを小さな実行可能ファイルにまとめたもの」

Dockerイメージで提供されていたり、Alpine Linuxに利用されていたりするみたい。

# BusyBoxのコマンドを調査対象コンテナに導入する

BusyBoxの個別コマンドをそれぞれ入れることも可能みたいですが、
全コマンドを入れるやり方だけを共有。個別で入れる場合は、個別コマンドのみをダウンロード。  

ダウンロードしたモジュールを調査用コンテナのパスが通ったディレクトリにコピーすれば、コンテナ内でコマンド実行が可能となります。

```bash
$ wget https://busybox.net/downloads/binaries/1.30.0-i686/busybox
$ chmod a+x busybox
$ docker container cp busybox [コンテナ名]:/usr/local/bin
```

# BusyBoxのコマンドの使い方

あとは、使えるコマンドを確認して、使うだけ。

```bash
# busyboxで使えるコマンド一覧を表示
$ busybox

# psを使う場合は、busyboxのサブコマンドとして実行
$ busybox ps
PID   USER     TIME  COMMAND
    1 root      0:00 bash
   58 root      0:00 busybox ps
```
【Go】文字コード変換(UTF-8)

## 準備

必要なパッケージをダウンロード

```bash
$ go get -u github.com/saintfish/chardet
$ go get -u golang.org/x/net/html/charset
```

## サンプルコード

```go
package main

import (
	"bytes"
	"io/ioutil"

	"github.com/saintfish/chardet"
	"golang.org/x/net/html/charset"
)

func toUtf8(b []byte) []byte {
	// 文字コード判定
	det := chardet.NewTextDetector()
	detRslt, _ := det.DetectBest(b)

	// 文字コード変換
	bReader := bytes.NewReader(b)
	reader, _ := charset.NewReaderLabel(detRslt.Charset, bReader)

	u8, _ := ioutil.ReadAll(reader)

	return u8
}
```

## 参考

- [mongodb \- Convert any encoding to UTF 8 in Go \- Stack Overflow](https://stackoverflow.com/questions/27297328/convert-any-encoding-to-utf-8-in-go)
- [文字エンコーディングの検出 — プログラミング言語 Go \| text\.Baldanders\.info](https://text.baldanders.info/golang/detecting-character-encoding/)
初心者のわたしがArch Linuxインストールでハマったこと

## はじめに
初心者の私がArch Linuxをインストールする際にハマったことについてまとめます。

私は全くLinux触ったことのない状態でやりました！

## 対象読者
この記事は、次のような方を対象としています。

* はじめてArch Linuxをインストールする方
* Arch Linuxに興味ある方
* Arch Linuxのインストールに挫折したことがある方

## 準備した環境
1万5千円ぐらいで買った中古のデスクトップパソコンを使いました。

* 型番
    * HP Compaq Pro 4300 SF
* CPU
    * Intel Core i5-3470S
* メモリ
    * 8GB
* ディスク
    * SATA SSD 120GB

## インストール時の環境
* テキストエディタ
   * vi,vim
* ブートローダー
   * systemd-boot
*  キー配列
   * JIS配列

※私は、有線LANが認識されなかったため、USBのLANアダプターを用意して使用しました。

## ハマったこと
[インストールガイド - ArchWiki](https://wiki.archlinux.jp/index.php/インストールガイド)を参考にしながらインストールしました。その中で私がハマったところを紹介します。
    
### ESPにベースシステムをインストールしてしまった
パーティションエディタ`parted`を使って次のようにパーティショニングしました。

| ブロックデバイス名 | 役割                                      |
|------------------|-------------------------------------------|
| sda1 ※1          | `/` 用パーティション                       |
| sda2             | ESP(EFI System Partition)用パーティション  |

ベースシステムをインストールするとき、`/mnt`にマウントするブロックデバイスを `sda2`に間違えてしまい容量不足のエラーで失敗してみました。

マウントする前に、`lsblk`コマンドで確認すれば、この間違いは防げました。
インストールするブロックデバイスを間違えていても
途中までは、うまく行ってるように見えてしまうので事前確認が大事です。

※1 私の環境は、ディスクがSATAで接続されているため、ブロックデバイスのプレフィックスは、`sd*` ですが、
NVMEで接続される場合は、`nvme*`になります。

### キー配列の設定をちゃんと毎回する
これ結構重要で、キー配列の設定をしないと、やテキストエディタでの編集、コマンド打つときに苦労します。
やり直すたびに、リセットされるので、loadkeysコマンドで、毎回設定してください。


### ブートローダーの設定に困った
ブートローダーの設定をする際に、何種類かの中から、一つ選択してインストールします。
PCがUEFIかBIOSかによって使えるブートローダーが変わってくるので、またUEFIマザーボードでも設定によっては、レガシーBIOSモードになっている場合があるので気を。つけたほうが良いです。自分が使っているPCがUEFIかBIOSかしっかり事前に調べておきましょう。

### ファイル名がArchWikiと違うことに注意
ArchWikiに載っているコマンドを見たまんま、打つと自分の環境にあっている状態ではないので、その後の動作を行ったときにエラーが起きるので、自分の場合はファイル名がどうなるかなど、しっかり考えてから、打つことが大切です。私はブートローダーの設定の際に`esp`を`/boot`にしなければいけないところを、そのまま`esp`とずっと打っていました。
## 最後に
*  コマンドや設定ファイルはあくまでサンプルであるため、意味を理解して書こう！
*  確認方法が大事。
*  環境差異、好みに応じて使用するパッケージは変わる。
*  英語であったとしても、エラーメッセージをしっかり読むこと。
*  エラーメッセージが出ていない場合は、うまくいっている証拠！
*  [UNIX原則](https://www.geekpage.jp/blog/?id=2007/3/1)が大切。

ArchLinuxインストールしてみませんか？？
【Go】Webスクレイピングのやり方

## 関連

- [【TypeScript】Webスクレイピングのやり方 \- Qiita](https://qiita.com/kou_pg_0131/items/8d189f3221a2e71393de)

## はじめに

GoでWebスクレイピングをしたい時には`goquery`という便利なパッケージがある 
ただ、文字コードが`EUC-JP`のサイト等に使おうとすると文字化けするので、その辺りの文字コード変換を自前で実装する必要がある。
`goquery`の使い方については以下の記事を参照。  

- [goqueryでお手軽スクレイピング！ \- Qiita](https://qiita.com/yosuke_furukawa/items/5fd41f5bcf53d0a69ca6)

## 準備

必要なパッケージをダウンロードする。

```bash
$ go get -u github.com/PuerkitoBio/goquery
$ go get -u github.com/saintfish/chardet
$ go get -u golang.org/x/net/html/charset
```

## サンプルコード

```go
package main

import (
	"bytes"
	"fmt"
	"io/ioutil"
	"net/http"

	"github.com/PuerkitoBio/goquery"
	"github.com/saintfish/chardet"
	"golang.org/x/net/html/charset"
)

func main() {
	url := "https://fortune.yahoo.co.jp/12astro/20190922/scorpio.html"

	// Getリクエスト
	res, _ := http.Get(url)
	defer res.Body.Close()

	// 読み取り
	buf, _ := ioutil.ReadAll(res.Body)

	// 文字コード判定
	det := chardet.NewTextDetector()
    detRslt, _ := det.DetectBest(buf)
    fmt.Println(detRslt.Charset)
    // => EUC-JP

	// 文字コード変換
	bReader := bytes.NewReader(buf)
	reader, _ := charset.NewReaderLabel(detRslt.Charset, bReader)

	// HTMLパース
	doc, _ := goquery.NewDocumentFromReader(reader)

	// titleを抜き出し
	rslt := doc.Find("title").Text()
    fmt.Println(rslt)
    // => さそり座(蠍座) 今日の運勢 - Yahoo!占い
}
```

## 参考

- [Big Sky :: Go言語で jQuery ライクな操作が出来る goquery を試した。](https://mattn.kaoriya.net/software/lang/go/20120914184828.htm)
- [goqueryでお手軽スクレイピング！ \- Qiita](https://qiita.com/yosuke_furukawa/items/5fd41f5bcf53d0a69ca6)
- [mongodb \- Convert any encoding to UTF 8 in Go \- Stack Overflow](https://stackoverflow.com/questions/27297328/convert-any-encoding-to-utf-8-in-go)
- [Go net/httpパッケージの概要とHTTPクライアント実装例 \- Qiita](https://qiita.com/jpshadowapps/items/463b2623209479adcd88)
- [文字エンコーディングの検出 — プログラミング言語 Go \| text\.Baldanders\.info](https://text.baldanders.info/golang/detecting-character-encoding/)
- [【Go】文字コード変換\(UTF\-8\) \- Qiita](https://qiita.com/kou_pg_0131/items/69eac7ed3c4ac7524b18)
【SwiftUI】UIColorを使いたい

※Xcode11.0

UIKitには `UIColor.systemGroupedBackground`などのセマンティックカラーがstatic letでたくさん置いてあるのですが、SwiftUIのColor直下のには、赤・青・黄色などしかなく、セマンティックカラーが実装されていません。

ですが安心してください。`Color`のイニシャライザに `init(_ color: UIColor)` がいるので、ブリッジさせる事で利用可能です。

サンプルはこんな感じです。

```swift:
Text("Some")
    .background(Color(.systemGroupedBackground))
```

https://developer.apple.com/documentation/swiftui/color/3363504-init

#### 余談
(betaの時はこのイニシャライザがいなかったのでみんな自作していました。)
Arduino + Max8 (1) センサ情報の表示

## この記事について

ここまでArduino(Seeduino)を動かしたり、Max8を触ってきましたが
この章ではArduinoとMax8を連携し、Groveセンサの値をMaxパッチで活用していきます



#### Arduino(Seeduino)側の準備

ArduinoとMax8はシリアル通信を使って情報のやり取りをします。
[この記事](https://qiita.com/KNBK/items/250c155c5fa80b79b64e#ボリュームセンサでledの明るさコントロール)で使用していたコードを改変し、アナログ値をシリアル通信するスケッチを書いてみます
下記のコードをコピーして、ArduinoIDEの画面にペーストし、書き込んで下さい
※このコードは[VR基礎のもの](http://lecture.nakayasu.com/?p=2648)を参考に改変しています

```javascript
//serialCommunication for Max
//シリアル通信でA0 - A3までのセンサデータを送信するスケッチ

const int analogPin0 = A0; //センサ1
const int analogPin1 = A1; //センサ2
const int analogPin2 = A2; //センサ3
const int analogPin3 = A3; //センサ4

int sensorValue[4]; //センサの値を保持するための変数
int outValue[4];  //成形した値を保持するための変数

void setup() {  //ピンの設定をここに書く

  pinMode(analogPin0, INPUT); //analogPin0を入力モードに設定
  pinMode(analogPin1, INPUT); //analogPin1を入力モードに設定
  pinMode(analogPin2, INPUT); //analogPin2を入力モードに設定
  pinMode(analogPin3, INPUT); //analogPin3を入力モードに設定
  
  for(int i = 0; i < 4; i++){ //for文（カッコ内の終了条件を満たすまで、中カッコ内の処理を繰り返す）
    sensorValue[i] = 0; //センサの値を初期化（0を入れる）
    outValue[i] = 0;    //成形した値も初期化（0を入れる）
  }
  Serial.begin(9600); //コンピュータとのシリアル通信の開始
}

void loop() {

  sensorValue[0] = analogRead(analogPin0);  //A0ピンの値を取得しsensorValue[0]に保持
  delay(5);
  sensorValue[1] = analogRead(analogPin1);  //A1ピンの値を取得しsensorValue[1]に保持
  delay(5);
  sensorValue[2] = analogRead(analogPin2);  //A2ピンの値を取得しsensorValue[2]に保持
  delay(5);
  sensorValue[3] = analogRead(analogPin3);  //A3ピンの値を取得しsensorValue[3]に保持
  delay(5);
  
  outValue[0] = map(sensorValue[0], 0, 1023, 0, 255); //10bitのアナログ値を0-255までの値に変換
  outValue[1] = map(sensorValue[1], 0, 1023, 0, 255); //10bitのアナログ値を0-255までの値に変換
  outValue[2] = map(sensorValue[2], 0, 1023, 0, 255); //10bitのアナログ値を0-255までの値に変換
  outValue[3] = map(sensorValue[3], 0, 1023, 0, 255); //10bitのアナログ値を0-255までの値に変換

  Serial.print(outValue[0]);  //outValue[0]の値をシリアル送信
  Serial.print(" ");
  Serial.print(outValue[1]);  //outValue[0]の値をシリアル送信
  Serial.print(" ");
  Serial.print(outValue[2]);  //outValue[0]の値をシリアル送信
  Serial.print(" ");
  Serial.print(outValue[3]);  //outValue[0]の値をシリアル送信
  Serial.println();           //改行データを送る
  delay(1);
}

void establishContact() { // シリアル通信が確立されるまでAを送信し続ける
  while (Serial.available() <= 0) {
    Serial.print('A');
    delay(300);
  }
}
```



#### Max8側の準備

[こちら](https://www.dropbox.com/s/coo3j0zuz6whnhi/sensorDataVisualize.maxpat?dl=1)からMaxのパッチをダウンロードして開きます


※上記パッチは[VR基礎のもの](http://lecture.nakayasu.com/?p=2648)を参考に改変しています



![arduino2max](https://tva1.sinaimg.cn/large/006y8mN6gy1g78eu5qxcug30k60gygsb.gif)



・SeeduinoのA0ポートにボリュームセンサを接続します
・パッチをロックし、Seeduinoが接続されているポートを選択します
・左上のToggleをクリックするとSeeduinoとMax8の通信が始まり、ボリュームセンサの値がA0に表示されます（A1-A3の値も変化してしまいますが、気にしないで下さい）

![arduino2max_data](https://tva1.sinaimg.cn/large/006y8mN6gy1g78ffsendsg30yp0n47m6.gif)



------

ボリュームセンサの反応を確かめたら、下記のセンサーも繋いで振る舞いを確認してみましょう
・スライドセンサー
・CDS
・FSR
ALSAをつかって見る 導入編

みなさんはじめまして

Linuxを使って 音声を扱う事になりまして、
ALSAについて調べました。

少しサンプルを変えて、ALSAプログラミングを書いてみましたが
Ubuntuで書いたコードが、そのままDebianでも使えるという非常に
汎用性が高い事がわかりました。

Ubuntuで書いて、ラズパイでも試せるというのは、非常に大きいですね。
殆どコンパイル時のオプションも同じで良いというのは大きいでしょうか。

Linuxの凄さはこういうところでしょうか。

今日はここまでとして
ALSAプロジェクトのHPのリンクです。

https://www.alsa-project.org/wiki/Main_Page
Laravelでのbootstrap使い方　初心者メモ

##bootstrap サンプルを選ぶ
free downlord選択→ダウンロード終わったらファイル解凍
environmentディレクトリにフォルダ作成→fileからupload localでアップロード

##ディレクト移動させ方
![代替テキスト](https://i.gyazo.com/60fae3a975194cc76b0604471a11d863.png) 
mv 元ディレクトリ/移動させたいディレクトリ/ 移動先ディレクトリ
移動させ終わったら、gitでpushする
git init→git add .→git commit -m "first.comiit"
githubで新規リポジトリ作成
git remote→git push
mysqlでテーブルにカラムを追加する方法　初心者メモ

#mysqlでテーブルにカラムを追加する方法

##まずテーブルの確認
![3156f9c2f06fea6af08836bcaab540b4[1].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457880/a530180a-c76a-28e9-6443-f851f54a3899.png)

ここでカラムが足りない事に気づいたら





##migrateとrollback
php artisan migrate:rollback --step 3で3つ前にprofilesで使用したmigrateにrollbackする
![70e9e0e4f424c1270c6408f799d47f9b[1].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457880/148195ea-641e-0b8a-a61a-e37807bde301.png)





##migrationディレクトリに必要なカラムを追加する。
![a6e0f84b36cb07d90087afd0a1551549[1].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457880/ec02cfd3-8e0d-ed94-aa86-de9727ed86be.png)

##再度migrateする
![18b5dc1d15503a26b9c02335a0b36358[1].png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457880/0be65cb6-d2c1-aba6-9f94-e5e8377eb3ff.png)

これでカラムの追加完了
プログラミングパラダイムの2つの考え方

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている[箕牧和廣](https://qiita.com/mimaki_kazuhiro)です。
今回はプログラミングパラダイムについて書いていこうと思います。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

#プログラミングパラダイムとは
プログラミングパラダイムというのは、解決したい問題に対してどのように記述していけば解答を得ることができるか、その考え方の枠組みやスタイルを表すものです。プログラミングパラダイムにはいくつかの種類があり、今回はその中でもよく使われる2つの考え方を紹介します。

#関数型
これは解決したい問題の性質を関数の組み合わせで表現する手法です。関数型では同じ関数を用いても、式に代入する内容を変えることで、全く異なった解答を導くことがあります。プログラムがわかりやすく、副作用が少ない、というのが関数型のメリットです。

関数型についてもっと知りたい方は[コチラ](https://qiita.com/stkdev/items/5c021d4e5d54d56b927c
)。

#オブジェクト指向
オブジェクト指向とは、それぞれの「モノ」と、「モノができること（役割）」を決めるという考え方です。オブジェクト指向は、構造型と似ています。2つの違いは、構造型プログラミングは別々の型を作成するに対して、オブジェクト指向言語はクラスを作ってその中にメソッドなどを構築します。つまり、オブジェクト指向言語にはカプセル化という重要な働きを発揮するのです。カプセル化とは、関連するデータの集合体を操作する意味で、外部からの干渉から防止する役割を持っています。

オブジェクト指向と関数型の違いについてもっと詳しく知りたい方は[コチラ](https://qiita.com/shirogin/items/378919de18dcb5a26e32
)。

#まとめ
今回紹介したのは2つだけでしたが、プログラミングパラダイムには他にも様々なものがあります。興味があれば、ぜひ調べてみてください。
listの中から最小のPrefixのみ抽出したい

例えば以下のデータがあるとする。

```python

prefix_list = [
    'hogehoge',
    'foo',
    'foo1',
    'hoge',
    'ho'
]
```
抽出したい文字は、'ho'と'foo'である。hoはhoge, hogehogeのprefix、fooはfoo1のprefix。このように、最小のprefixをlistから抽出するアルゴリズムを考える。

## sortとlist内包表記を使ってみる
自分が書いたコードは以下である。

```python

def find_smallest_subset_prefix(prefix_list: List[str]) -> List[str]:
    result = []
    for prefix in sorted(prefix_list):
        if not [data for data in result if prefix.startswith(data)]:
            result.append(prefix)

    return result
```
list内包表記の部分が何とかならないかな、と思ったのでfilterも試してみたが速度がいまいちだった。
もっと効率が良いコードはないかと思い、webサイトを検索したところ他のコードも見つかった。(https://codereview.stackexchange.com/questions/150467/find-smallest-subset-prefixesから引用)

```python

def find_smallest_subset_prefix_2(prefix_list: List[str]) -> Set[str]:
    prefixes = set()

    for w in prefix_list:
        if any(p for p in prefixes if w.startswith(p)):
            # A prefix exists in the prefixes set.
            continue

        # Re-build the set with all elements not matching the set.
        prefixes = set(p for p in prefixes if not p.startswith(w))
        prefixes.add(w)

    return prefixes
```
正直このコードより自分が書いたコードの方が効率がいいと思ったのだが、実際はこちらの方が早い場合もあるようだ。ただ、コードの可読性は自分のコードの方がよいように思う。

## 実は・・・
一番最初に自分が書いたコードはもっと効率の悪いコードだった。pythonに詳しいおっちゃんに教えてもらい最初に比べるとかなり可読性、速度共に改善されたが、自分としては不甲斐ない結果となってしまった。

もっといいコードあるぜ！という方はコメントお待ちしております～。でわでわ。
SplunkでSHIFT-JISを扱うで！

まいど！SplunkでSHIFT-JISのログ・ファイルをソースとして読み込んだらUTF-8でEncodeされてしもて化けてもたー！なんてことあらへんか！？
Splunkは基本的にかしこやからcharsetは自動的に判別してくれるんやけどまー間違うこともあるわな！
今回はcharsetをSHIFT-JIS固定にする方法を教えるで！ウチはSHIFT-JISのログ・ファイルしか使わへんのやー！って場合に使えるで！

# 長いから読んでへん
・props.confをいじればええで！

# charsetの変更
まぁかんたんな話なんやけどprops.confっちゅう設定ファイルをいじったればええんや。
ふつーにインストールしてたらパスは↓ここにあるから見てみてや。

``` :ここやで
$SPLUNK_HOME/etc/system/local
```

localディレクトリが無い場合もあるらしいけど、その場合は作ったったらええねん。
で、いじったことなかったらこのディレクトリにprops.confは入っていないはずや。
お手本のprops.confを↓ここからぱくってコピってくるんや。

``` :ここやで
$SPLUNK_HOME/etc/system/default
```

ほしたらコピってきたprops.confの↓のcharsetをAUTOからSHIFT-JISに変えたるんや。

``` :こんな感じや
[default]
CHARSET = SHIFT-JIS
LINE_BREAKER_LOOKBEHIND = 100
TRUNCATE = 10000
：
```

splunkを再起動したら終わりや！

# ソースの読み込み直しもいるで
charsetの設定を変更しても残念ながら既に読み込み終わったログ・ファイルは化けたままなんや。
splunkはインデックスに読み込むときにencodeしてしまうみたいやな。新しく追加されたログはちゃんとSHIFT-JISで読み込まれるんやけど昔のログも日本語で読みたいやんな？
その時は「設定 > データ入力」から一回化けてもたデータソースを削除してもっかい新しくデータソースを追加するんや。
インデックス容量をつこてしまうけどこればっかりは仕方ないんや。仕様や。

# Program Filesにインストールしてる人は注意や
ワイはWindowsにSplunk入れたんやけど$SPLUNK_HOMEがデフォルトのProgram Filesになっとった。
ほんでここがややこしくてファイルの追加・削除はできるんやけど更新がでけへんのや。
更新ができるように設定変更するやり方はぐぐったらええんやけど、パパッとやりたいときは適当なところにprops.confを置いて修正してから/etc/system/localに入れたらええで。めんどいけどな。なんやこのWindowsの仕様。











ほな！
CygwinでHTTPSの自己署名証明書を信頼する

メモ。

ローカルに立てたサーバに対して `git push` しようとして `SSL certificate problem` になること有るよね。

```sh
$ git push --all testing
fatal: unable to access 'https://...': SSL certificate problem: self signed certificate
```

何故か世間では `git config http.sslVerify false` せよという表記が多いけど、別に自己署名証明書を信頼するのは超簡単なのでそちらを勧める。

# 自己署名証明書を信頼する

これは `trust` コマンド一発で完了する。

```
trust anchor certificate.cer
```

`certificate.cer` は公開鍵ファイルで、nginxであれば `ssl_certificate` オプションで指定しているファイルが相当する。中身は

```
-----BEGIN CERTIFICATE-----
MIIEqjCCApICCQDsBM+2LKS6/TANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxz
dHJpcGUubG9jYWwwHhcNMTgwOTIyMTAzOTQyWhcNMjgwOTE5MTAzOTQyWjAXMRUw
EwYDVQQDDAxzdHJpcGUubG9jYWwwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
AoICAQDpMYXQ83m4DC4Fvw11Uqnawhm160CFW91yFYwD1TX84dQQ0CUUxlUDF9vb
```

のような内容のテキストファイルとなる。つまり、sshの `authorized_keys` に足すくらい簡単にできる。

一度追加した自己署名証明書を削除するには:

```
trust anchor --remove certificate.cer
```

のように、オプション `--remove` を使う。

# `trust` って何

`trust` は Cygwinの `p11-kit-trust` パッケージに含まれるツールで、通常は `ca-certificate` (SSL証明書を含む) パッケージ経由でインストールされている。 https://cygwin.com/packages/summary/ca-certificates.html

```
$ cygcheck -f /usr/bin/trust
p11-kit-trust-0.23.15-1
```

この `p11-kit` はGitHubにプロジェクト( https://github.com/p11-glue/p11-kit )があり、ドキュメントもそこからアクセスできる。 https://p11-glue.github.io/p11-glue/p11-kit/manual/trust.html

伝統的には、RedHat系のディストリビューションでは `update-ca-trust` でこの手の処理を行っていたが、現在のCygwinではこの操作が p11-kit で行われるようになっている。
HTTP2

## 正規表現
https://regexr.com

## HTTP
https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest
https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/readyState
https://developer.mozilla.org/en-US/docs/Web/HTTP/status

## FETCH
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_api

## API
https://randomuser.me
https://randomuser.me/api
https://randomuser.me/api/?results=10
流行り？の”OODAループ”を”OKR”と一緒に取り入れる。ってどうかな

# OODAループについて
過去記事「[個人に向き合い自己改善を促す仕組みづくり](https://qiita.com/sol123vv/items/9db2ec709bdd10eedc50#ooda%E3%81%A7%E8%87%AA%E5%B7%B1%E6%94%B9%E5%96%84%E3%82%92%E4%BF%83%E3%81%99)」で書かせていただきましたが、自己成長を促すコーチングのためにOODAを取り入れていました。

そこで感じたことは、
方向性をしっかりと示してあげれば確かに自走できるようになって、あとは1on1で進んでいる道筋を調整してあげるだけ（とは言え、そんな簡単なことじゃないですが）なんだなと思いました。

あとは、これを自己成長の評価につなげてあげればいいな。
と思っていたところで、「ん？」と思ったんです。

だって、そのひとの成長は「チーム」のパフォーマンスのために必要なことで、結果はチームの結果に返ってきているはずじゃないですか。
こんなものを、できた・できないで評価していたら、結局は「やらされ感」が出てしまうんじゃないか？と。


そこで、ふと思ったのが「OKR」でした。

# OKRとは

「OKR」はご存じの方も多いと思いますが、
「Objectives and Key Results（目標と主要な結果）」の略で、インテルで誕生し、Google・facebookなどに波及していった目標管理の手法です。最近では、メルカリやSansanなど国内企業でも導入が進んでいますよね。

「OKR」は「人事評価制度に直接結び付けるべきではない」という特徴を持っています。
それは、守りに入った目標設定をしてしまったり、逆に高い目標を掲げて失敗すると他のメンバーより評価が下がってしまう。なんてことが起きるからです。

「組織OKR」＞「チームOKR」＞「個人OKR」と落とされた目標と結果は、かならずチームに、そして組織に返ってくるものであり、皆んなで達成すべき目標があるからこそ、協働もできる。という良さが「OKR」の特長だと思っています。

だからこそ、
個人の自己成長こそ、「OKR」でチームの目標と一致する方向性を示してあげて、「チームOKR」として評価すべきなんじゃないか？と思いました。

# 「OODA」と「OKR」の結合
「OODA」には「現場で瞬時に判断する」という特長があり、「OKR」には「目標が組織・チームにつながっている」という特長があり、どちらにも共通するのが「目標がハッキリと定まっている」ということにあります。

「OKR」で示された目標が、そのまま「OODA」の方向性となっていて、自走してくれれば、個人の成長がチームに、そして組織全体の目標に向かっていることになる。
そんな使い方が、すごく適しているんじゃないか？と考えました。

「OKR」は「個人OKR」まで落とさず「チームOKR」までにとどめても十分に活用できるんじゃないでしょうか。

# 「MBO」と「PDCA」
従来使われてきた「MBO」は人事評価制度と一致しているため、年一回の報奨評価に向かって毎月PDCAを回す。というやり方で、すごく親和性が高かったんじゃないかと思います。

しかし、昨今の市場環境や社内環境が目まぐるしく変わる状況において、そのスピード感では現場が柔軟に変化していけないし、変化の遅さが社員にストレスやモチベーション低下を招く結果も起こり得ます。


こんな、取り入れ方も１つの方法なんじゃないでしょうか。
SingularityをベースにAnaconda+PyMC3+Jupyter環境を構築する

# 0. 更新すべき点
+ 以下環境のインストールは通るのですが，PyMC3のバージョンが古くサンプリング計算がエラーとなることが後日わかりました．
+ 本稿では記載していないのですが，Singularity上にPython3を入れvenvを用いずにpipをインストールすることでPyMC3の動作も確認できました．
+ (Python3のDockerイメージとしては，[Docker://rackspacedot/python37](https://hub.docker.com/r/rackspacedot/python37)などを使わせて頂きました．)

# 1. 背景と目的
- モンテカルロ計算ライブラリである[PyMC3](https://docs.pymc.io/)の利用環境構築したい
- 最初はvenv + pipで着手したが，Theanoのインストール課題が解消できず断念
- Anacondaベースで構築するとTheanoインストールの課題を回避できた
- Anacondaの環境分離として，コンテナエンジンであるSingularityを適用してみた
- 可視化プラットフォームとしてJupyterもインストール


# 2. 手順
* Singularityをインストール([オフィシャルサイト](https://sylabs.io/guides/3.3/user-guide/installation.html)などを参考に)
+ 構成ファイル(aaaa.def)を作成
    + 以降で例を記載
+ 構成ファイルを使ってSingularityイメージ(bbbb.sif)をビルド   
    + `sudo singularity bbbb.sif aaaa.def` aaaa.defからbbbb.sifを生成
+ イメージの実行
    + `singularity run bbbb.sif` runscriptの実行
    + `singularity shell bbbb.sif` コンテナ環境内でのシェルの立ち上げ
    + --writableオプションでホスト側にファイル書き込み可能になる
    + コンテナが都度作成されるわけではない(Dockerとの違い)

# 3. 構成ファイル例
```singularity-definition:aaaa-sample.def
BootStrap: docker
From: continuumio/anaconda3:2019.07-alpine
# Bootstrap: ベースのコンテナ群を選択する e.g.) library, docker
# singularity hub以外にもDocker hubのイメージを適用できる
# From: 具体的なイメージ名の指定．今回はAnaconda3導入済みイメージをベースにする
# 最新版はビルドが失敗し(2019年9月時点)，2019.07-alpineをタグとして指定

# コメントアウトは#を文頭につける

# %files: ビルド時にファイル群をコピーできる
# 以下の例では，ホスト側で./dataのファイル群をコンテナ側で/tmp/dataにコピーする
%files
    # ./data /tmp/data

# %environment:  環境変数の設定
%environment
    export LC_ALL=C
    export PATH=/opt/conda/bin:$PATH

# %post: ビルド時に実行するコマンドを作成する
# 以下の例ではcondaによるパッケージのインストールを実行
%post
    export PATH=/opt/conda/bin:$PATH
    /opt/conda/bin/conda install pymc3 jupyter -y

# %runscript: singularity run bbbb.sif で実行されるコマンド
# 以下の例ではjupyter notebookを起動
# コンテナ側からホスト側にファイル書き込み許可するには--writableオプションを実行時につける
%runscript
    jupyter notebook --notebook-dir=$PWD/notebooks --ip='*'

%labels
    Author k0syam
```
# 4. まとめ
コンテナエンジンの勉強も兼ねて環境構築を行いました．タスクに対する最適な構成は難しい課題ですが，それを考えるのも楽しめればと．

# a1. 環境
* ホストPC: Ubuntu 18.04
* Singularity 3.3.0 

# a2. 参考サイト
- [Singularity: Quick Start](https://sylabs.io/guides/3.3/user-guide/quick_start.html#interact-with-images)
- [PyMC3](https://docs.pymc.io/)
【Python】ABC - 098 - Cut and Count

# 問題
与えられた英小文字で構成されている文字列を2つに分割して、それぞれに共通して含まれる英小文字の種類が最大となる分割を探して、
共通する英小文字の数を出力する問題。

# 方針
文字列の左から順番に分割するパターンを試していって、共通する英小文字の数がその時点での最大値となったら更新。

# 工夫
1. 漏れのないようにスライスで部分文字列に分割
2. それぞれの部分文字列をset型に変換して、共通する要素を求めるために積集合をとる

```python
N = int(input())
S = input()
# 共通する英小文字の種類の初期化
cnt = 0
for i in range(1, N):
    # スライスで部分文字列をつくって、set型に変換し、積集合で共通する英小文字を取得
    dup_cnt = set(S[:i]) & set(S[i:])
    # 共通する英小文字の数が現時点での最大値より大きいなら最大値を更新
    if cnt < len(dup_cnt):
        cnt = len(dup_cnt)
print(cnt)
```
ログインするとparty parrotが踊るだけのユーザを作る

皆さん [party parrot](https://cultofthepartyparrot.com) をご存じですか？こいつです。

![parrot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100408/3eac7e6e-45a5-f5ce-6294-6ffab8cf5236.gif)

より詳しくお知りになりたい方は https://cultofthepartyparrot.com をご覧下さい。

# PARTY OR DIE

さて、このクールな [party parrot](https://cultofthepartyparrot.com)、必要なときも必要でないときも、いつでもターミナルで表示したいですよね？

そこで、[parrot.live](https://github.com/hugomd/parrot.live)です。curlがあれば、どこでもparty parrotに出会えます。素晴らしいですね！

	$ curl parrot.live
	
では、これを活用して、「ログインしたら party parrotが表示されるUNIXユーザ」を作ってみます。ここでは Docker をつかってやってみます。

	$ docker run --rm -it debian:9
	# apt update && apt install -y curl sudo

	# cat >> /usr/bin/parrot << 'EOS'
	#!/bin/bash
	set -eu
	exec curl parrot.live
	EOS

	# chmod 755 /usr/bin/parrot
	# useradd -m -s /usr/bin/parrot parrot
	# sudo parrot

完璧ですね！
pygameでコントローラの簡易的なキーロガを作成する。

##はじめに
格ゲーをやる際に、アケコンの入力を記録したくなったので、簡易的なキーロガを作成した。ボタン　or レバーが何フレーム入力されているかをプロンプト画面に表示している。あくまで、簡易的なので、複数のボタンの同時押しやレバーとボタンの同時入力には対応していない。（この辺の処理をpygameだけで行うとすると並列処理も行わないと行けないのかな？）また、通常のキーロガでは切り捨てられる入力フレームの小数点の情報が欲しかったので、あえて入力フレームの出力の値を丸めていない。

##ソースコード
```ruby:keylogger.py
import pygame
from pygame.locals import *
import time
 
SCREEN_WIDTH = 640
SCREEN_HEIGHT = 480

joy_list =  [[0]*3]*3

pygame.joystick.init()
try:
    j = pygame.joystick.Joystick(0) # create a joystick instance
    j.init() # init instance
    print ('Joystickの名称: ' + j.get_name())
    print ('ボタン数 : ' + str(j.get_numbuttons()))
#キーが押されたフレーム時間を記録するリストを生成
    key_list =[0]*j.get_numbuttons()
except pygame.error:
    print ('Joystickが見つかりませんでした。')

def main():
    pygame.init()
    frametime = 0
    x,y =0,0
    while 1:
        
        for e in pygame.event.get(): # イベントチェック
           
            if e.type == QUIT: # 終了が押された？
                return
            if (e.type == KEYDOWN and
                e.key  == K_ESCAPE): # ESCが押された？
                return
            # Joystick関連のイベントチェック
         
            if e.type == pygame.locals.JOYAXISMOTION: 
                if(x,y!=j.get_hat(0)):
                    joy_list[x][y]  =   pygame.time.get_ticks() - joy_list[x][y]
                    print ('x and y : ' + str(x) +' , '+ str(y))
　　　　　　　　　　　#何フレームレバーが入力されているか表示する
                    print("frame : " + str(joy_list[x][y] /1000*60))
                    x,y = j.get_hat(0)

                joy_list[x][y]  =  pygame.time.get_ticks()
       
            elif e.type == pygame.locals.JOYHATMOTION: 
                print ('hat motion')
                
                if(x,y!=j.get_hat(0)):
                   joy_list[x][y]  =   pygame.time.get_ticks() - joy_list[x][y]
                   print ('x and y : ' + str(x) +' , '+ str(y))
　　　　　　　　　　#何フレームレバーが入力されているか表示する
                   print("frame : " + str(joy_list[x][y] /1000*60))
                x,y = j.get_hat(0)

                joy_list[x][y]  =  pygame.time.get_ticks()
                print ('x and y : ' + str(x) +' , '+ str(y))
 
            elif e.type == pygame.locals.JOYBUTTONDOWN: 
                print (str(e.button)+'番目のボタンが押された')
                key_list[e.button] = pygame.time.get_ticks()
         
            elif e.type == pygame.locals.JOYBUTTONUP: 
                key_list[e.button] = pygame.time.get_ticks() - key_list[e.button]
　　　　　　　　　#何フレームボタンが押されていたか表示する
                print("frame : " + str(key_list[e.button]/1000*60 ))
            
if __name__ == '__main__': 
    main()
```
##参考サイト
http://nakamura001.hatenablog.com/entry/20101212/1292163993
youtube-8MのデータセットをWindows環境にダウンロードする。

# はじめに
公式ページにWindows向けのダウンロード手順がなかったので書きます。

## 前提
python **2系**が使用できるコマンドプロンプト環境

# コマンド
必要な環境変数を一時的にSETし、pythonを実行します。
必要に応じてsetする環境変数は変更してください。

```
set partition=2/video/test
set mirror=asia
set shard=1,100

curl data.yt8m.org/download.py | python
```
Raspberry Pi で Full HD 動画を再生してみたメモ弐

#はじめに

昨年 [Raspberry Pi 3 Model B に Ubuntu 16.04 を入れて Full HD 動画を再生](https://qiita.com/teruo-oshida/items/6edbcbcb00791bba7f53)してみました。
Zero を触る機会があったので同じことをしてみた次第です。

滑らかに再生できましたよ〜。


#概略

##諸元あれこれ

|項目|内容|
|---|---|
|機種|Raspberry Pi Zero
|SD Card|8G ※刺さってたヤツ、転送速度不明さーせん|
|OS|Raspbian Buster (Lite)|
|プレーヤ|omxplayer|
|動画|MP4 H.264 30fps 3067kbps 音声なし|


##ざっくり手順

- OS イメージ書き込み
- 画面サイズ設定
- 再生


#手順詳細

##Raspbian Buster セットアップ

###イメージを SD Card 上に作成

普通に書き込みます。rootfs は ext4 サイズは 1832MiB でした。

```
Device         Boot   Start      End  Sectors  Size Id Type
/dev/mmcblk0p1         8192   532480   524289  256M  c W95 FAT32 (LBA)
/dev/mmcblk0p2       540672  4292607  3751936  1.8G 83 Linux
```

Raspbian も初回ブート時に自身で rootfs サイズを拡張する機能があります。いたれりつくせり。ただちょっと今回それは望む動作じゃなかったので、rootfs の直後に別のパーティーションを作って機能を無効化しました。

この機能 `/boot/cmdline.txt` の init パラメータで制御されています。初期値は `/usr/lib/raspi-config/init_resize.sh` です。つまりこのスクリプトがリサイズしているわけですね。

単に init パラメータを削除すれば初回ブート時でもリサイズされなくなると思います。


###画面モードを Full HD に

Full HD でドットバイドット表示されるように設定します。

```:/boot/config.txt
disable_overscan=1
hdmi_force_hotplug=1
hdmi_group=1
hdmi_mode=16
```

パラメータはドキュメントに掲載されています。
https://www.raspberrypi.org/documentation/configuration/config-txt/video.md


###リブート

再起動します。


##再生

一般ユーザーでログインして `omxplayer` で動画を再生します。
単一動画を無限ループ再生する場合は下記のようになります。

```
$ omxplayer --loop --no-osd filename.mp4
```

ループ再生時、先頭に戻る時にメッセージが表示されます。望む動作ではないので `--no-osd` で非表示にします。


#おわりに

Zero は ARMv6 なので Ubuntu MATE が動きません。残念。

でも特に Raspbian でも困らないかもしれません。というか困りませんでした。

１千円未満で FullHD プレーヤが用意できました。
PowershellのSSHクライアントの文字色や背景色を変更する

AWSの勉強の過程でPowershellのSSHクライアントの存在を知ったので，軽く使ってみましたというページ．

## 基礎的な用語の話
### Powershell
https://ja.wikipedia.org/wiki/PowerShell

雑に言えば，`cmd.exe`よりも多くの機能を備えた，Windows OS上のコマンドラインインタフェースのこと．極めれば，多くの自動処理をWindows上でも実行可能となる．スクリプトファイルの拡張子は`.ps1`である．

### SSH
https://ja.wikipedia.org/wiki/Secure_Shell

リモート端末にアクセスしてコマンド操作を行うためのプロトコル．通常は22番ポートが用いられる．SSH用のソフトウェアとしてはOpenSSHが有名であり，今回扱うクライアントもそれベースとのこと．

## SSHクライアントのインストール
### 経緯
これまでWindows上でSSHを行う場合は[Tera Term](https://ttssh2.osdn.jp/index.html.ja)などのクライアントをインストールするのが鉄板で，今回もそうしようと思ったのだが，なにやら「最近のWindowsではSSHクライアントが普通に入っているよ」という話だったので，試すことにした．

### 参照リファレンスと導入結果
https://mimimopu.com/powershell-ssh-client/

結論から言うと，俺の端末には標準で入っていた．ただ，これは通常のケースではないと思うので，上記リンクの手順に沿う必要が本来はあると思う．

早速，Powershellを立ち上げて，以下を実行．当たり前だが，EC2インスタンスの用意と鍵の生成は事前に実施している前提．

```
PS C:\Users\XXX> ssh
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
           [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
           [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
           [-i identity_file] [-J [user@]host[:port]] [-L address]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] destination [command]

PS C:\Users\XXX> ssh -i <鍵のパス> <アカウント名>@<EC2のパブリックDNS>
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-1044-aws x86_64)
（中略）

ubuntu@ip-10-0-0-145:~$
```

というわけで，ログインは問題なく実行できたが，問題はこの直後の操作結果．わかりやすくスクショを貼付．

![コンソール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494245/f89d2f29-c38a-665f-9b5b-6df82e3775e0.png)

実行したのはただの`ls`コマンドだが，青い背景に青文字という，絶望的な視認性の表示となった．

### 文字色のカスタマイズ
https://mimimopu.com/windows-powershell-color-font-change/

色々な対処法が世間で紹介されているが，一番手っ取り早い方法は，上記リファレンスの後半で語られている「**powershellのプロパティをイジる**」だと思う．

powershellを立ち上げた状態で右クリックのコンテキストメニューを開き，「プロパティ」を選択する．すると，配色やフォントを変更できるので，プレビューを参照しつつ変更し，「OK」ボタンを押下．これで永続的に変更が反映される．

変更後はこんな感じ．ちょっとまぶしいが，そこは後で調整する．
![コンソール2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494245/bdc24fd1-d549-28de-bf8e-1184ddb9bcb2.png)
Raspberry PiのKubernetesにmetrics-serverを入れる

# この記事について

下記の記事に書いたkubernetesにmetrics serverを入れたというだけの記事。
https://qiita.com/yyojiro/items/0cd7ec7e2a39610be53f


# 構築手順
端的に書くと、git clone、編集、デプロイ、以上！
まずはgit cloneする。

```
root@k8s01:~# git clone https://github.com/kubernetes-incubator/metrics-server.git  
```

次に、deployに使うyamlファイルを編集する。

```
root@k8s01:~# vi metrics-server/deploy/1.8+/metrics-server-deployment.yaml     
```

変更点は下記の通り。
いろいろググった結果、commandでいろいろオプション指定するのが大事っぽい。

```:変更前
      containers:
      - name: metrics-server
        image: k8s.gcr.io/metrics-server-amd64:v0.3.4
        imagePullPolicy: Always
```

↓

```:変更後
      containers:
      - name: metrics-server
        image: k8s.gcr.io/metrics-server-arm:v0.3.4
        imagePullPolicy: Always
        command:
        - /metrics-server
        - --metric-resolution=30s
        - --requestheader-allowed-names=aggregator
        - --kubelet-insecure-tls
        - --kubelet-preferred-address-types=InternalIP,InternalDNS,ExternalDNS,ExternalIP,Hostname
```

そしてデプロイ。

```
root@k8s01:~# kubectl apply -f metrics-server/deploy/1.8+/
```

# 確認

しばらくすると下記のようにメトリクスが取れるようになる（はず）。

```
root@k8s01:~# kubectl top node
NAME    CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
k8s01   504m         12%    603Mi           73%       
k8s02   266m         6%     342Mi           41%       
root@k8s01:~# 
root@k8s01:~# kubectl top pod --all-namespaces
NAMESPACE              NAME                                         CPU(cores)   MEMORY(bytes)   
kube-system            coredns-5644d7b6d9-4kl6n                     8m           6Mi             
kube-system            coredns-5644d7b6d9-665cp                     8m           13Mi            
kube-system            etcd-k8s01                                   53m          37Mi            
kube-system            kube-apiserver-k8s01                         118m         188Mi           
kube-system            kube-controller-manager-k8s01                30m          33Mi            
kube-system            kube-flannel-ds-arm-66xs4                    14m          8Mi             
kube-system            kube-flannel-ds-arm-mfjgp                    9m           11Mi            
kube-system            kube-proxy-55s9c                             3m           14Mi            
kube-system            kube-proxy-c9r6d                             2m           11Mi            
kube-system            kube-scheduler-k8s01                         6m           15Mi            
kube-system            metrics-server-585dd4dc5b-t67z9              5m           11Mi            
kubernetes-dashboard   dashboard-metrics-scraper-566cddb686-th5xc   2m           4Mi             
kubernetes-dashboard   kubernetes-dashboard-6ffd45c47d-fwnfv        5m           8Mi             
metallb-system         controller-6bcfdfd677-bqqwf                  1m           3Mi             
metallb-system         speaker-b2vwp                                3m           6Mi             
metallb-system         speaker-zrbzc                                3m           11Mi            
root@k8s01:~# 
```

最初うまく取れなかったが、よくわからんがOS再起動したらとれるようになった。
いろいろ謎がおおい。
WebsocketにHTTPみたいなheaderは付けられないから...

残念ながら付けられません（ほとんど）

## 事の発端

プロジェクトでwebsocketを使ったAPIを利用していると、仕様書に「HeaderにXXを付けてください」という指令がありました。調べてみてもwebsocketにそんな[機能はない](https://teratail.com/questions/109406)ですし...headerなしでは動かないし...


## コードをのぞいてみると

[faye](https://github.com/faye/faye)というフレームワークを使っていました。ここのフレームワークを使うとwebsocket以前にハンドシェイクを行い、その時にheaderを設定できるようです。他にも、有名な[socket.io](https://socket.io)でも同じことができるようです。

しかし、**[RFC6455](https://triple-underscore.github.io/RFC6455-ja.html)の規定では、websocket自体にheaderをつけることはできず、headerをつける機能はfayeやsocket.ioに依存している**ということを忘れないでください。もし、apiとして公開する場合は、headerの機能を利用しない、あるいは「websocketのAPI」ではなく「socket.io/fayeのAPI」と明言して公開するようにしましょう。

## じゃあ全くheaderを設定できないのか？

そんなことはありません。`Sec-WebSocket-Protocol`というheaderを設定することができます。これはその名の通り、websocketで通信するプロトコルを設定するために設定できます。[MDNの記事](https://developer.mozilla.org/ja/docs/WebSockets-840092-dup/Writing_WebSocket_servers)の言葉を借りれば、「カスタム XMLスキーマまたはdoctype宣言」と同じようなものです。ですが、やはり任意のheaderは設定できません
未経験エンジニアをプロジェクトに受け入れるにあたって

少し前まで未経験からエンジニアになる人が多かったのですが、自分は実際にそういった人たちを受け入れる側になり、その時(プロジェクト・未経験エンジニアに対して)感じたことや行って良かったこと/行うべきではなかったことをまとめたいと思います。
あくまでも個人的に考えたことなので自身の愚痴や未経験エンジニアに関係ないこともあり、
また、間違っている可能性があります。


# 前提
- プロジェクト
    - 自社サービスをマイクロサービスで開発(マイクロサービス経験者無し)
    - 開発チーム(社員)は8人(POが1人、開発経験者2人、開発未経験5人)
    - スクラム組んでアジャイル開発(アジャイル経験者なし)

- 自分(当時)
    - 1つの開発チームのエンジニアリーダー的な立場

- 自分のチームの状態
    - 自分、外部パートナー1人、未経験4人
    - 未経験は全員スクール上がり


# 感じたこと
## 未経験エンジニアに対して
- 基本的にスクール卒業したばかりの実務未経験に即戦力を求めるのは間違い
- ポートフォリオなんてほぼあてにならない
- テスト関係の知識(境界値やホワイトボックステストなど)も持っておいてほしい
- 多少のアルゴリズムに関する知識も持っておいてほしい
- SQLちゃんと理解しておいてほしい
- RESTAPIもちゃんと勉強しておいてほしい
- pushした後ちゃんとdiffを確認して、デバッグ用のログや変なdiffが出ていないか、typoがないか確認してほしい(要推敲)
- 基本的にPullRequestの説明はしっかり書いてほしい
- 成長の手助けはするが、自分から動いてくれないとこちらとしてはどうしようもない
- 結果が出てないならせめて姿勢だけでも見せてほしい
- やりたい事への希望は極力汲むが、それに対して実力や将来性が見合ってなければアサインするのは難しい

## プロジェクトに対して
- プロジェクトメンバーの大半がモノリシックでの開発すらまともにやったことがないのに、いきなりマイクロサービスに挑戦するのは無謀
- 未経験エンジニアが大半の状態でのスクラム開発は見積もりができないので開発がきつい


#行って良かった事
## コードレビュー
- 特に命名やテストコードについては時間をかけて考えさせる
- 相談されたなら答えまでは言わず、方向性だけを示す
- 未経験エンジニア同士でコードレビューさせると、1人に指摘した事を他のメンバーにも指摘してくれるので非常に楽

## チームの雰囲気
- 相談しやすい雰囲気にする
- リーダーは基本的に機嫌を良くしておくべき
- しかし指摘するべきことは自分(リーダー)が憎まれ役になったとしても指摘する
- 基本的にチームに決断を委ね、議論がまとまらなかった時のみ自分が決める(責任を自分が持つ)
- なのでチームで決めたことに後から異論は挟ませない
- 開発初期は自分が決めるようにして、後から少しずつチームに権限を移譲させていくとよい
- メンバー1人ずつに、やっているタスクがどれだけ重要かを分からせて当事者意識を持たせる

## リーダーとして
- 基本的に暇そうにする(暇そうにしてると、メンバーから相談されやすい)
- 自らメンバーに話しかけに行くと、ふとした話題からメンバーの価値観を知れたり、質問を受けやすくなる
- ちょっとしたことでもめちゃくちゃ褒める(「○○くんのおかげでめちゃくちゃ便利になりました！最高！！！！」みたいな感じで)
- 基本的に自分が悪者になる
- つまらない仕事はメンバーにやらせず自分が率先して片付ける
- 開発で必要なmodule等は予め自分が用意しておく and 常に全体を俯瞰してリファクタする
- よほどじゃない限り、任せたタスクは最後までやらせる
- こなしたタスク量は自分がチームで1番じゃないといけない
- 率先してリーダーが働かないとメンバーはついてこない
- パトレイバーの後藤隊長的な感じが良い

# 行うべきではなかったこと
- チーム間での人のやりとり
- 抽象度の高いタスクの見積もり(まずは抽象度を下げることに注力すべき)

# 未経験エンジニアを採る人へ
- そもそもあなたの組織には未経験エンジニアを教育するリソースはありますか？
    - ないなら採用するのはやめましょう
    - お互い不幸になります
- 未経験エンジニアの教育とプロジェクトの進捗、どちらを優先しますか？
    - 教育優先するなら、進捗について口うるさく言うのはやめましょう
        - かつ、教育を担当するエンジニアに「教育」と「開発」のどちらも課すのはやめましょう
        - 結局どっちも中途半端な状態になります
    - 進捗を優先するなら、そもそもプロジェクトの頭数に未経験エンジニアを含めないようにしましょう
        - 見積もりができないので、スクラムチームの一員とするのもおすすめしません
        - まずはバックログの「重要ではない」かつ「急ぎではない」タスクをやってもらうのがいいでしょう
【SwiftUI】VStackにcornerRadiusを設定する

Xcode11.0時点の情報です。

`Text`などは、普通に `.cornerRadius` で記述できるのですが、`VStack`などだと上手くradiusが付けられません。将来的には直るかもしれませんが、今はこのように記述する必要があります。

```swift:
.clipShape(RoundedRectangle(cornerRadius: 5))
```
Windowsコマンドメモ

最近のWindowsで必要な機能を開くとき、どこになにがあるかわからない。探すのに手間取る。そんなときは、cmd.exeからコマンドを叩くと機能に直行できるので便利です。

cmd.exe は Contaraでcmd.exeといれればすぐに開けます。

PowerShell から cmd.exe を開くには **start cmd.exe** で開始できます。

## よく使うコマンド

### シャットダウン

	shutdown -t 1 -s

### リブート
	
	shutdown -t 1 -r

### サスペンド

	%windir%\System32\rundll32.exe powrprof.dll,SetSuspendState

### ログオフ

	logoff

### IPアドレスの確認

	ipconfig /all
	
### DHCPの更新

	ipconfig /renew
	

## 各種設定項目を開く

* [@IT:コントロールパネルアイテム](http://www.atmarkit.co.jp/ait/articles/0507/02/news016.html)

#### ネットワーク接続

	ncpa.cpl
	
#### コンピュータの管理

	compmgmt.msc

#### セキュリティーが強化されたWindowsファイアーウォール

	WF.msc

#### コントロールパネル

	control

#### ユーザアカウントの設定

	control userpasswords2

#### フォルダーオプション

	control folders

#### デスクトップの背景

	control /name Microsoft.Personalization /page pageWallpaper

#### デスクトップとアイコン

	control desk.cpl,,5

#### 色とデザイン

	control /name Microsoft.Personalization /page pageColorization

#### サウンド

	control mmsys.cpl,,2

#### スクリーンセーバー

	control desk.cpl,,1

### スタートメニューをエクスプローラで開く

#### すべてのユーザ

	explorer "C:\ProgramData\Microsoft\Windows\Start Menu\Programs"

#### 現在のユーザ

	explorer "%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs"
ターミナルでPHPファイルを作成する場合

サーバーを起動している場合は、まず停止をする。

```
$ Ctrl + c
```

# 作成例
##extends controllerに作成

```
$ php artisan make:controller HelloController
```
PersonController.phpファイルが作成される。
格納先：app/Http/Controllers/PersonController.php

##extends modelに作成

```
$ php artisan make:model Person
```
Person.phpファイルが作成される。
格納先App/Person.php

Controller created successfully.が表示されたら、作成が成功している。
【GAS】明日の出張先で雨が振りそうなら通知する

#概要
Googleカレンダーの予定から明日の出張先の場所をとってきて、その場所の天気が雨ならGmailに通知メールを送ります。
LINEやSlackに送りたい方はAPI叩いてください。
### UI
- Googleカレンダーに予定とその場所の追加
- １日前に予定の場所が雨ならメールが来る
![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242971/0ad798ae-2115-6129-94e2-cac7428c63e5.png)

###フロー
- カレンダーから明日の予定を取得
- それらの場所を取り出す
- 参考資料2のURLを叩いてお天気情報を手に入れる
- 雨っぽいならメールを送る

#ソース
```javascript
function sendEmailForWeather() {
  const today = new Date();
  //dayLater が1なら明日、2なら明後日、3以降はお天気データが無いので無理です
  const dayLater = 1;
  //ミリ秒変換による次の日の取得 
  const date = new Date(today.getTime() + dayLater * 24 * 60 * 60 * 1000);
  //明日の予定の取得
  const events = getEventsByDate(date);

  events.map(function(e) {
    //CityIDの取得（細かくすると面倒臭かったのでその県の県庁所在地のCityIDを取得）
    const cityId = getCityIdByLocation(e.getLocation())
    if(cityId != null){
      const obj = JSON.parse(UrlFetchApp.fetch('http://weather.livedoor.com/forecast/webservice/json/v1?city=' + cityId));
      const weather = obj.forecasts[dayLater].image.title;
      if(weather.indexOf("雨") >= 0) {
        const body = "" + e.getTitle() + "\n" + date + "\n" + e.getLocation() + "\n" + weather;
        GmailApp.sendEmail('xxx@Eメール.アドレス', '予定の場所で天気が悪そうです', body);
      }
    } 
  })
 
  function getEventsByDate(date) {
    const calendarId = "カレンダーID";
    const calendar = CalendarApp.getCalendarById(calendarId);
    return calendar.getEventsForDay(date);
  }
  //CityIDの取得はいい方法ありそうだが、調べるのもっ面倒なので県の最初の2文字をkeyとして県庁所在地のCityIDをvalueとした
  function getCityIdByLocation(Location) {
    const cityId = {"北海":016010,"青森":020010,"岩手":030010,"宮城":040010,"秋田":050010,"山形":060010,"福島":070010,"東京":130010,"神奈":140010,"埼玉":110010,"千葉":120010,"茨城":080010,"栃木":090010,"群馬":100010,"山梨":190010,"新潟":150010,"長野":200010,"富山":160010,"石川":170010,"福井":180010,"愛知":230010,"岐阜":210010,"静岡":220010,"三重":240010,"大阪":270000,"兵庫":280010,"京都":260010,"滋賀":250010,"奈良":290010,"和歌":300010,"鳥取":310010,"島根":320010,"岡山":330010,"広島":340010,"山口":350020,"徳島":360010,"香川":370000,"愛媛":380010,"高知":390010,"福岡":400010,"大分":440010,"長崎":420010,"佐賀":410010,"熊本":430010,"宮崎":450010,"鹿児":460010,"沖縄":471010};
    return cityId[Location.slice(0,2)];
  }
}

```
#あとがき
2日後の天気しかライブドアでは取れないので1週間後の天気がほしい方はそれらしいサービス探してください。CityIDも県庁所在地の天気でごまかしてるので北海道とかだと当てになりません。

#参考資料
1. [【Google Apps Script】天気予報をWeb APIで取得する方法](https://tonari-it.com/gas-api-weather/)
2. [お天気Webサービス仕様 - Weather Hacks - livedoor 天気情報](http://weather.livedoor.com/weather_hacks/webservice)
3. [livedoor Weather Hacks APIで、お天気データのJSONを取得するための1次細分区（cityタグ）の地域id一覧まとめ](https://www.kaden1000.com/2013/04/livedoor-weather-hacks1%E6%AC%A1%E7%B4%B0%E5%88%86%E5%8C%BA%EF%BC%88city%E3%82%BF%E3%82%B0%EF%BC%89%E3%81%AE%E5%9C%B0%E5%9F%9Fid%E4%B8%80%E8%A6%A7%E3%81%BE%E3%81%A8%E3%82%81/)
4. [Class Calendar | Apps Script | Google Developers](https://developers.google.com/apps-script/reference/calendar/calendar)
5. [Date - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date)

#更新