OmniAICreator/Qiita-1.07M huggingface dataset:
デブサミ2021 参加レポート「18-A-1 エンジニアから都庁へ～中の人が語る街のDX、都庁のDX～」

# Developers Summit 2021

この記事は、2021/02/18-19に開催された[Developers Summit 2021](https://event.shoeisha.jp/devsumi/20210218/)のレポートです。

# チーム参加してきました
 
[aslead Agile](https://aslead.nri.co.jp/solution/aslead_agile.html) のチーム「[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu?slide=3)」にて参加してきました。
チーム5人中、4人で参加して、その場で実況しつつ、記事も作っています。

# 登壇者

平井則輔さん

- 東京都戦略政策情報推進本部 デジタルシフト推進担当課長
- JANOG Committee 会長（元）

# 世界をつなげる

全世界中の人が繋がるようにしたい。
安価で、広く、あまねく、世界を覆う。

第一歩として、**日本をアジア太平洋のインターネット 真のハブ**に。

北米からアジアへの海底ケーブルの最短経路は東京！
アジアの通信の玄関である日本を、アジア太平洋のハブにしたい。これが私の夢。

# 挑戦者、求む

東京都のICT人材募集／任期2年。

- 「民間復帰の時にきっと引く手あまたなはず！」
- 「3年前なら私も応募してたかも！」

という周りの声を聴いて、興味を持って申し込んだ。
東京都がスマートシティ化して世界の都市間競争に勝っていくことは、自分のビジョンと合っていると感じた。

# 変化のスピード

時価総額ランキングでは…
平成元年では、NTT、日本興業銀行、住友銀行など、日本が世界を席巻していた。
平成30年では、もうその影もない。

都市全体のデジタル化では、ランク外。
他の都市と比べても、デジタル化が遅れている。

他都市よりもスピード感を持って、デジタル化を進めないといけない。

# デジタル化の流れ

『我々が登るべき山は、未踏峰の山』
『長い職業人生の中の2年。自らの知識やスキルを次世代や公共のために使ってみたい、そんな人をお待ちしています。』

# COVID-19への対応

デジタル空間は**密**に、リアル空間は**疎**に。

そんな中、東京都は『東京都新型コロナウイルス感染症対策サイト』を立ち上げ。
非常に短期間でのサイト開設。
サイトを立ち上げる特別広報チームが2月の下旬に発足。
そして、3月3日の深夜にサイトオープン。

**1週間という短期間。異例の出来事だった。**

# オープンデータ、オープンソース

サイトはオープンソース／GitHubの活用。
累計訪問者数は 16,605,444人（7/13時点）
公式・非公式あわせ、全国47都道府県約70サイトへ波及している。

『新型コロナは状況が日々変わる。それならば、アジャイルに情報発信していくのがいいだろう』
そういう意図で、アジャイルに情報発信をしていった。

完成していないけれど必要な情報は、β版でのサイト公開をしていく。
フィードバックをいただきながら、修正していく。

# 2040年の東京の姿『スマート東京』

**『電波の未知』で、いつでも、だれでも、どこでも「つながる東京」を実現する**
都市全体がスマート化され、すべてのものがIoTでつながる。
世界のデータが集まる「データセンター」になる。

## スマートポール

全部をスマートシティ化するのは難しいので、重点設備エリアを決める。
西新宿では、『スマートポール』を設置して、街の見える化や、サイネージを活用した情報発信等を実現していっている。

『スマートポール』では、コロナ化でもあるため、マスクの装着率も分かるような仕組みを導入。

## 他にも

- 西新宿のあるべき姿と改善点と課題解決の取組
- noteでの発信

# スマート東京の実現を阻む課題

他の目がシティと比較して、**桁違いにICT人材が少ない**。

東京都：職員32,000人中、ICT人材100人（0.3%）。
ニューヨーク市：職員125,200人中、ICT人材1,500人（1.2%）。
シンガポール：職員37,300人中、ICT人材2,600人（7.0%）。

**世界水準を見据えた制度の整備**が急務となっている。
現実的な都民サービスをしようとすると、制度の壁にぶつかってしまう。
デジタル社会の到来を見据えた動きをしていく必要がある。

# シン・トセイ

- オープンガバメント。使いやすいデータを提供していく。
- シビックテックやスタートアップと協業し、官民で取り組んでいく。

# 行政は世の中の課題が凝縮されている

解決を待つ魅力的な問題でいっぱいだ。
**エンジニアが興奮するフィールド**。

…といってもやっぱりとっつきづらい、という人には
**noteで発信しているから、見てね！**

皆さんからの声もお待ちしております。

# 感想

都庁がどのような取り組みをしているのか、生々しさや熱量が伝わってくるセッションでした。
中で頑張っている人たちが、どういう想いで取り組んでいるのか。
また、世界とのギャップに悩んでいる姿や、2040年という未来の姿など、興味深く聞くことが出来ました。
ICT人材、もっと増えてほしいですし、興味を持つ人が広がってほしいですね。
FulePHP使い方 超入門

#ローカル環境
・VirtualBox
・Vagrant

```
下記の場所でローカルサーバー起動
cd /home/vagrant/fuel/public

$ php -S 192.168.33.10:8000
```

#controllerの使い方
controllerは主にviewとmodelの橋渡しをするファイルを扱う

```
controllerファイルの置き場所
/home/vagrant/fuel/fuel/app/classes/controller/ここにcontrollerのファイルを置く
```

```
Class名は{Controller_+任意のクラス名(頭文字は大文字)}

class Controller_Greeting extends Controller
{
	public function action_hello()
	{
　　　　　//実行したいコードを記載
		echo 'hello';
	}
}

```

###メソットの呼び出し方
192.168.33.10:8000/クラス名/アクション名
192.168.33.10:8000/greeting/hello

![スクリーンショット 2021-02-18 10.31.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1061654/4429112e-9efa-34e4-db1c-5370d95df955.png)

###引数の使い方

```
public function action_your_response($response)
	{
		echo $response;
	}
```

192.168.33.10:8000/クラス名/アクション名/ここに引数に渡す文字を入れる
192.168.33.10:8000/greeting/your_response/Hi

![スクリーンショット 2021-02-18 10.37.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1061654/3cf82b68-a12c-cd7f-575c-5e4ea6fd78d8.png)

#viewの使い方
#####Viewは画面の表示を行うファイルを扱う
viewファイルの置き場所
/home/vagrant/fuel/fuel/app/views/ここにviewのファイルを置く

```
hoge.php

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>hoge</title>
</head>
<body>
    <h1>タイトル</h1>
    <p>本文</p>
</body>
</html>
```

controllerでhoge.phpを操作

```
greeting.php

public function action_hoge()
	{
		return View::forge('hoge');//viewに置いてあるhoge.phpを表示する
	}
```

192.168.33.10:8000/クラス名/アクション名
192.168.33.10:8000/greeting/hoge
![スクリーンショット 2021-02-18 11.07.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1061654/56955b2a-92ad-b8d4-5043-b0638ea4cbc4.png)

#配列の渡し方
greeting.php → hoge.php

```
greeting.php

public function action_hoge()
	{
		$data = array();
		$data['name'] = 'micheal';
		$data['date'] = date('Y年n月j日 h:i:s');
		return View::forge('hoge', $data); //引数にhoge.phpに渡す変数を入れる
	}

```

```
hoge.php

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>hoge</title>
</head>
<body>
    <h1>タイトル</h1>
    <p>本文</p>
    <p><?= $name ?></p>　//greeting.phpで渡した変数（$data）の要素（$data['name']）を変数で出力
    <p>今日は<?= $date ?></p>
</body>
</html>
```





#modelの使い方
#####modelは主にDBの操作をするファイルを扱う

```
modelファイルの置き場所
/home/vagrant/fuel/fuel/app/classes/model/ここにmodelのファイルを置く
```
ビルドは成功するものの、ランタイムで何故かライブラリを見つけられないC++のエラーに出くわしたときの備忘録

## 概要
記事にするのもおこがましいほどのビギナーエラーかもしれないですが、備忘録として残しておきます。

g++, cmake などでヘッダーのインクルード、ライブラリへのリンク
などはうまくいき、ビルドはでき、ほっと一安心したものの、
ランタイムでライブラリへのリンクが見つからないというエラー。


## 解決方法
(私の場合はこれを見逃しており少し時間を無駄にしてしまいました。)

```
env | grep LD
```

により

```
LD_LIBRARY_PATH=:/usr/local/lib
```

もしくは見つけたいライブラリへのパスが指定されていることを確認してください。
もしこの環境変数がないのであれば、`export LD_LIBRARY_PATY= ` 
で指定してみること。

おそらくいつもの開発環境では問題なくここへのパスが通っていると思いますが、
一時的にインスタンスを立ててそこでビルド、実行するときなど、意外と見落としてしまうことがあるので注意。
交差検証 CombinatorialPurgedCV Python [備忘録]

## 背景
[Kaggle [Jane Street Market Prediction]](https://www.kaggle.com/c/jane-street-market-prediction) にてfinanceでよく利用される交差検証を試した．

ノイズの影響が大きく、LBも信用できないので交差検証が非常に大切だった．


## 概要
- 赤：train
- 青：validation

図は全体の1/4を検証データとし、trainとvalidationの間に10dayのギャップを設定している．

![cpkf-image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258709/d064881d-5ee9-5aa8-b649-abd55ccf623d.png)


## 実装
簡単のためN_COMB=2で固定．


```python
import numpy as np
import pandas as pd
import itertools
```

```python
class CombinatorialPurgedKFold:
    N_COMB = 2

    def __init__(self, data: pd.DataFrame, date_col_nm: str, n_block: int, n_gap_day: int = 5):
        self.n_block = n_block
        self.n_gap_day = n_gap_day

        self.uni_date = np.unique(data[date_col_nm].values)
        self.date_blocks = np.array_split(self.uni_date, self.N_COMB * n_block)
        self.valid_comb = list(itertools.combinations(list(range(self.N_COMB * n_block)), self.N_COMB))

        if np.min([len(db) for db in self.date_blocks]) < self.n_gap_day * 2:
            raise ValueError()

        self.__i = -1
        self.__data = data
        self.__date_col_nm = date_col_nm
    
    def __iter__(self):
        self.__i = -1
        return self

    def __next__(self):
        self.__i += 1
        if self.__i < 0 or len(self.valid_comb) <= self.__i:
            raise StopIteration()
        return self.splits()

    def splits(self):
        val_idx1, val_idx2 = self.valid_comb[self.__i]

        val_dates = list()
        s1 = 0 if val_idx1 == 0 else self.n_gap_day
        e2 = len(self.date_blocks[val_idx2]) if val_idx2 == (len(self.date_blocks) - 1) else -self.n_gap_day
        s2, e1 = (0, len(self.date_blocks[val_idx1])) if (val_idx1 + 1) == val_idx2 else (self.n_gap_day, -self.n_gap_day)

        val_dates += self.date_blocks[val_idx1][s1:e1].tolist()
        val_dates += self.date_blocks[val_idx2][s2:e2].tolist()     
        tra_dates = [d for d in self.uni_date if d not in (self.date_blocks[val_idx1].tolist() + self.date_blocks[val_idx2].tolist())]

        tra_df, val_df = self.__data.query(f'{self.__date_col_nm} in {tra_dates}'), self.__data.query(f'{self.__date_col_nm} in {val_dates}')
        return tra_df, val_df
```

使用例

```python
cpkf = CombinatorialPurgedKFold(data=train, date_col_nm='date', n_block=4, n_gap_day=10)

for tr_df, va_df in cpkf:
    print(tr_df, va_df)
```

## 参考
- https://quantoisseur.com/2019/11/05/combinatorial-purged-cross-validation-explained/
- https://blog.quantinsti.com/cross-validation-embargo-purging-combinatorial/
Windows Server 2019 でプロキシ設定をして Windows Update を実行する

## 概要
Windows Server 2019 で外部への通信をFWで遮断しつつ Windows Update だけ
プロキシサーバを使って実行したい時に少し迷ったのでメモ

## 設定
[1] IEでプロキシ設定
ツール → インターネットオプション → 接続 → LANの設定
・「LANにプロキシサーバーを使用する」にチェックつける
・アドレス：プロキシサーバのホスト名orIPアドレス
・ポート：プロキシサーバを使うためのポート番号を指定

[2] PowerShellで WinHTTP プロキシを設定
[1]だけ実施してもうまくいかない場合、[2]も実施する必要がある。
システムが自動実行する Windows Update はWinHTTPプロキシの設定を使うらしい？

PowerShell を起動して以下を実施

```
netsh winhttp show proxy
netsh winhttp import proxy source=ie

現在の WinHTTP プロキシ設定:

    プロキシ サーバー:  プロキシサーバ名:ポート番号
    バイパス一覧     : (なし)
```
Windows Update が終わったらWinHTTPプロキシ設定を消す。

```
netsh winhttp reset proxy

現在の WinHTTP プロキシ設定:

    直接アクセス (プロキシ サーバーなし)。
```

## 参考
[IEのプロキシとWinHTTP Proxy](https://win2012r2.com/2019/02/12/post-498/)
docker image の保存先パスを変更する備忘録

## 概要
`azure instance` などを用い、そこに `docker` をインストール、
その環境に `image` を `pull` するなどしてテスト環境を作っていたときのこと。

docker pull でかなり大きめのイメージを引っ張り、
さらにそのバージョンがいくつか存在するとき、イメージ容量が `/` パスを
圧迫していました。
そこで、　`/`　ではなく、アタッチされている　`/mnt` ディレクトリにイメージを保存したかった。

https://stackoverflow.com/a/50726177
このポストを実行することで実現できました。

## 環境

`Docker version 20.10.3`

及びubuntu18.04 のインスタンスを使用しています。

## やり方

```
sudo systemctl stop docker
```
でdocker を一度落とします。

```
sudo vim /etc/docker/daemon.json
```
でこのファイルを編集します。（ない場合もあるのでこれで作ります。）

```
{
 "data-root":"/mnt/myvolume/docker"

}
```

などとし、マウントされており容量が潤沢にあるパスを指定します。
フォルダは`mkdir -p /mnt/muvolume/docker`
などで作っておきます。


この状態で、

```
sudo systemctl start docker
```

を実行する。
ここで、stop からstart までの間隔が短いとエラーが起きる（起きた）ので、一定時間待ちます。


きちんとスタートできているのを確認したら、
ためしに `docker pull` などをしてみて、


`df -h`

などできちんと　`/mnt` 以下の容量に反映されていることを確認。
presence:trueとNot Null制約について

#本記事について
本記事は、筆者自身の備忘録を形にして残すことで後の復習に役立てることと、同じ様なプログラミング初学者の方のお役に立てれば、という思いで作成するものであります。
誤り等ある場合には、お手数ですがご連絡いただけますと幸いです。
#本記事の内容
本記事では、Ruby on Railsを使用して開発をしていく中で筆者自身がはっきりと定義づけられなかった`presence:true`と`Not Null`制約について記しておきます。
#presence:true
こちらはモデルに記述するもの。
バリデーションと呼び、他にも様々な正規表現を使ったバリデーションを設けることができる。
(以下参照元URL）
https://gist.github.com/nashirox/38323d5b51063ede1d41
お世話になってます🙇‍♂️

#Not Null制約
マイグレーションファイルに記述するもの。

    t. string :name, null:false
この様に記述する。

#presence:true と　Not Null制約の違い
データが空の時にエラーが出るようにするんじゃないの?役割ちょっと被ってない？という浅はかな考えでした。
前者は、`空文字を許可しない`
後者は、`空文字を許可する`
という違いがあるそうです。

#引用元

https://techtechmedia.com/notnull-validation-
Qiita
https://qiita.com/jkr_2255/items/e1ca683c6fbdb02c2ec3
プログラムの書き方

**概要**
この記事は全くプログラムというものを知らない方を想定して書いています。なので、少しでもプログラムをやったことある方には当然の事ばかりだと思われますので、ご了承を

**プログラムとは**
早速ですが、プログラムとはそもそも何なのか？自分はこれをしっかり理解することが大切だと思っています
プログラムという言葉は近年様々なところで耳にしますが、元を突き詰めていくとスマホが出るずっと前からあるものなんですよね
一般的な認識だと機会に命令するための物。だと思いますし、実際その通りです。プログラムを動かした時になにが起こるのか簡単ですが図にしてみました![Slide2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1116752/c0338bae-b1d3-4de5-1019-ca6fc3e72288.jpeg)
ざっくりこんな感じで皆さんの生活に役立っています。色々な処理の部分なのですがデバイスによって変わったりするのでこの画像ではプログラムは、PCから始まり様々な形に変わりの身近にあることが伝わっていただけたらと思います。
そしてもう一つ、プログラムにも言語があります。皆さんが日本語や英語を使い分けるように、プログラムにもWebに特化したものや、AI(人工知能)に特化したものなどがあります。今回はこの後にWebを使ったプログラムを組みたいので、「HTML」と「JavaScript」いう言語を使って解説を進めていきます。(HTMLはマークアップ言語と言ってプログラミングの言語ではありません。)

**本題**
早速プログラムを組んでいきましょう！と言いたいところですが、まずは準備が必要です。
基本PCがあれば備わっているメモ帳などでプログラムを組むことができますが、それでは不便なことが多々起きるのです。そこで先人の方々がプログラムが組みやすいように。と作ってくれたアプリがあります。今回はVisual Studio Codeというアプリを使います。https://azure.microsoft.com/ja-jp/products/visual-studio-code/
ここからダウンロードできるはずです。

インストールが終わりアプリを立ち上げると次のような画面が出てくると思います。![Desktop Screenshot 2021.02.18 - 10.01.34.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1116752/f239da0e-b1f3-6420-9ff5-7c7508abfbb9.png)
一部モザイクですが、同じような画面になっていると思います。
今回は日本語に設定するところまでやっていきます。設定するには画面左側の四角が四つ並んでいるところをクリックします(赤い四角の部分)。![Desktop Screenshot 2021.02.18 - 10.01.34.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1116752/06e3e1b3-d182-70dc-32e1-04154d2c6282.png)
クリックして左に色々出てきたら成功です。![Desktop Screenshot 2021.02.18 - 10.06.51.93.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1116752/fb67d7a9-2110-8ca3-0413-cd9a0e08ca45.png)
ここには本当に多くのものが並んでいますが、今回必要なものはぱっと見では分からないので検索機能を使いましょう。一番上の検索欄に「Japanes」と打ち込んでみてください![Desktop Screenshot 2021.02.18 - 10.11.19.62.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1116752/b7e5bc84-f552-dc1b-edb4-482a67c78035.png)
左の枠の中身が変わり一番上に日本語と書かれたものがあればOKです。一番上になくても下の方にスクロールすれば必ずありますので探してください。
最後にその日本語と書かれたところをクリックしてインストールすれば完了です。![Desktop Screenshot 2021.02.18 - 10.13.57.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1116752/67e06348-c3c3-7183-d067-fcf0abb36685.png)
クリックすると右下の方に通知が来ます。青いボタンが付いているので、それをクリックしてください。![Desktop Screenshot 2021.02.18 - 09.58.31.70.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1116752/98674b61-ea8d-0178-db4d-9bd76c853fda.png)
このように日本語化されていたら成功です。お疲れさまでした！

**まとめ**
今回はプログラムの大体の説明とプログラムを組む環境作りまでやりました。
プログラムとは形を変えられることが結構大事です。皆さんが使っているスマホ、ゲーム機などほぼ全てがPCで作られたプログラムで動いています。
正直アプリの日本語化はやらなくてもよかったのですが、今回は初心者さんに向けた記事なので、日本語化することにしました。
Visual Studio Cordも含めた多くのアプリが海外製なので出来れば英語で使えた方がよかったりもします。
次からはプログラムを組んでいくつもりです。初心者さんにプログラムの楽しさが伝われば光栄です。
Apache RewriteRuleのパターン

## 概要
Apache RewriteRuleのパターンについてメモ

### フロントエンドとバックエンドを同一サーバーで管理する場合
フロントエンドは通常のURLで、バックエンドはURLが`api`で始まる場合です。

#### 想定URL
|アプリ |URL  |例|
|---|---|---|
|フロント | http://{ドメイン}/ |http://hoge.com/users |
|バックエンド | http://{ドメイン}/api/ |http://hoge.com/api/users|

#### 想定ディレクトリ構成
ドキュメントルート直下に`.htaccess`、フロントエンドアプリケーション、バックエンドアプリケーションを配置する。

```
DocumentRoot
└ .htaccess
└ front
└ back
```

#### .htaccess
`.htaccess`で記載していますが、root権限を持っているのであれば`.conf`側でも問題ないと思います。

```apache:.htaccess
RewriteEngine on
RewriteBase /

RewriteRule ^$ front/ [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !/api/
RewriteRule ^(.+)$ front/$1 [L]

RewriteCond %{REQUEST_URI} /api/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^api/(.+)$ back/api/$1 [L]
```
macのdotnet用環境変数設定

# macでhttpreplが使えない

macにhomebrewでdotnetをインストールして使っていましたが、httpreplを使うと下記エラーが発生。

```
A fatal error occurred. The required library libhostfxr.dylib could not be found.
If this is a self-contained application, that library should exist in [/Users/XXXXXXX/.dotnet/tools/.store/microsoft.dotnet-httprepl/5.0.2/microsoft.dotnet-httprepl/5.0.2/tools/netcoreapp3.1/any/].
If this is a framework-dependent application, install the runtime in the global location [/usr/local/share/dotnet] or use the DOTNET_ROOT environment variable to specify the runtime location or register the runtime location in [/etc/dotnet/install_location].
```

ライブラリが見つからないらしい & /usr/local/share/dotnetは存在しない、のでDOTNET_ROOTを設定することで対応したい。ライブラリ自体は存在しているのは確認済み。

# 環境変数
というわけで、下記の1行目のように DOTNET_ROOTにdotnetのlibexecディレクトリを設定して無事に動作。

```zsh:.zprofile
# .NET Core SDK tools
export DOTNET_ROOT=/usr/local/opt/dotnet/
export PATH="$PATH:$HOME/.dotnet/tools
```
ESP32でMicroPythonを使った際の備忘録

# ESP32でMicroPythonを使った際の備忘録
意外に簡単に使えたので残しておきます。

ただ、MicroPythonではPIL(Pillow)が使えるように出来無さそうだったので、
しばらくは使わないと思います・・・

## 起動処理作成
boot.py だけの場合は起動処理だけが実行されるっぽい。

```Python:boot.py
print('■□■□■□ 起動処理 ■□■□■□')
```

## メイン処理作成
main.py だけの場合はメイン処理だけが実行されるっぽい。

```Python:main.py
import time
print('■□■□■□ メイン処理 ■□■□■□')
while True:
    print('■□■□■□ ループ処理(一秒間隔) ■□■□■□')
    time.sleep(1)
```

## ampy インストール

```Bash
$ pip3 install --user adafruit-ampy
```
https://github.com/scientifichackers/ampy

## ampy ヘルプ

```Bash
$ ampy
```

## ファイルアップロード

```Bash
$ ampy -p /dev/tty.SLAB_USBtoUART put boot.py
$ ampy -p /dev/tty.SLAB_USBtoUART put main.py
```

## ファイル所在確認

```Bash
$ ampy -p /dev/tty.SLAB_USBtoUART ls
/boot.py
/main.py
```

## ファイル内容表示

```Bash
$ ampy -p /dev/tty.SLAB_USBtoUART get boot.py
print('■□■□■□ 起動処理 ■□■□■□')
```

## ファイル削除

```Bash
$ ampy -p /dev/tty.SLAB_USBtoUART rm boot.py
$ ampy -p /dev/tty.SLAB_USBtoUART rm main.py
```

## シリアルプロンプト

```Bash
screen /dev/tty.SLAB_USBtoUART 115200
```

## Soft Reboot
Ctrl + C
起動処理が実行された後、メイン処理が実行されループ処理が繰り返される。

```
■□■□■□ 起動処理 ■□■□■□
■□■□■□ メイン処理 ■□■□■□
■□■□■□ ループ処理(一秒間隔) ■□■□■□
■□■□■□ ループ処理(一秒間隔) ■□■□■□
■□■□■□ ループ処理(一秒間隔) ■□■□■□
```

Ctrl + a k y で終了。
DataTableが表に適用されない問題

##概要
jQueryの処理でHTMLのTableを綺麗に表示したり、ソート、ページングなどの機能を手っ取り早く提供してくれる
DataTableがなぜか適用されない問題を解決

##原因
テーブルのデータをPHP(Laravel）からJSONで渡して、Ajaxで動的に生成する流れでテーブルを生成していた。
DataTableの処理部をAjaxメソッドの外側で書いていたのでAjax動作時に同時に処理が行われず
適用されていなかった。

##解決法
jsのAjaxメソッドの内側にDataTableを入れる
ssh接続時のパスワード入力を回避する

# 目的

- ssh公開鍵を使用してssh接続先時のパスワード入力を回避する方法をメモ的にまとめる

# 条件

- ssh鍵が作成されていること。
- ssh接続先に接続する事ができること。

# 情報

- `~/.ssh`にある公開鍵「id_rsa.pub」と秘密鍵「id_rsa」を使って接続を試みるものとする。

# 方法

1. 下記コマンドを実行してssh接続先に公開鍵をコピーする。

    ```terminal
    $ scp .ssh/id_rsa.pub ssh接続先のユーザー名@ssh接続先のIPアドレス:~
    ```

1. 下記コマンドを実行してssh接続先に接続する。

    ```terminal
    $ ssh -i ~/.ssh/id_rsa 接続先のユーザー名@接続先のIPアドレス
    ```

1. 下記コマンドを実行して公開鍵の情報を記載する。

    ```terminal
    $ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
    ```

1. 一旦ssh接続先から出る。
1. 下記コマンドを実行してssh接続を行いパスワードの入力を求められなければ作業完了

    ```terminal
    $ ssh -i ~/.ssh/id_rsa 接続先のユーザー名@接続先のIPアドレス
    ```
Qiita Daily Survey memo 2021.02.18

# Qiita Daily Survey memo 2021.02.18
Qiita の記事を可能な限り毎日読むために、読んだmemoを公開することでモチベーションを維持しようという試み。
10年くらい survey のスペル間違ってました…ご指摘いただいた方ありがとうございます！

## [TSUTAYAでアルバイトしていた学生エンジニアが退職するので置き土産に業務効率アプリを開発した話](https://qiita.com/apple-yagi/items/59b626a371ea80cdee6e)
apple-yagi さんの記事。
タイトルの通り、就職にあたり退職するバイト先のために、アプリを開発したという記事。
技術者として、人間として、尊敬に値します。すごい。
アプリとしてはTSUTAYAさんで食品を扱うため、賞味期限を紙の管理からWebの管理へという内容です。
"もっと効率的にできそうなのは、なんとなく分かるけど、技術的に手が出ない" を見事に解消していて、素晴らしいと思いました。


## [LINEでお風呂入れる装置つくってみた](https://qiita.com/wimps/items/1140a62279800d876b81)
wimps さんの記事。
ブレッドボード基盤とLine chat bot を合わせて、LINEからお風呂のお湯を張るという記事。
実際の動作が動画で貼られていて、我が家にも欲しい！と思いました。
WebアプリはWebアプリの良さがありますが、リアルのものが動くのも良いですよね！
奥様も大満足の仕上がりなのでは…！

## [【初心者向け】P2Pを知らない１ヶ月前の自分にWebRTCを説明してみる](https://qiita.com/rie_uchida500/items/749dbe578c5ea5fac1c3)
rie_uchida500 さんの記事。
WebRTC(Web Real-Time Communication) で、複数端末がサーバーレスの通信をする技術の解説記事になります。
Skypeの技術すごいよ、という話を聞いたことがありましたが、その理由がわかりました。
stepごとに図込みで解説されているのと、課題と、それに対する解決策が図で示されていてすごい分かりやすいです。


## [WEBエンジニアになりたい理由と現在している努力](https://qiita.com/ymym4432/items/8a4ac1b30ad15dd66dab)
ymym4432 さんの記事。
昨日読ませていただいていて、今日もあったら書きたいなーと思っていました！
プログラミング勉強中の方で、勉強を始めた背景と、今実施していることを書かれています。
連日書いていますが、アウトプットに向けてアクション出来ている方々は本当にすごいと思っています。
自分が勉強を始めたころに比べて、Qiitaを始め勉強しやすい環境になっていると思うので、応援してます！


## [それなりに多い(数万件単位の)位置情報を、簡単に無料で地図上にプロットして確認する方法3選](https://qiita.com/terukizm/items/07bea0cdd25e9b83fc11)
terukizm さんの記事。
geo 系の可視化 UI の一覧と比較をしてくださっている記事。
地図へのマップは Tableau しか経験がありませんでしたが、紹介されている3つの UI すべて使いやすそうです。
また、件数ごとの処理感や操作感、メリット/デメリットもコメントされていて参考になりました。
実際のコードも書かれているので、手元のデータで少し試してみたいと思います。
お仕事でGEO系のマッピングについて相談されることがあるので、紹介したいと思います。
【blender2.83】面がひっくりかえっているとき(法線の表示と面の反転)

![SS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/7a5af319-0b58-3894-a16d-d5595842e065.png)

# この記事でできること
- オブジェクトの一部が反転しているとき、法線を表示して確認をして、反転することができる。

# 法線とは
- 「メッシュ」(面や頂点のこと)には、垂直に伸びる「法線」というベクトルがあります。
- これがオブジェクトで一致していないと、表示がおかしくなるわけです。

# 法線の表示の仕方
- 下図のように、「編集モード」にしてから、「ビューポートオーバーレイ」のアイコンを選択して、「法線を表示」アイコンを選択します。
- わかりやすいように、法線の長さは任意で調整します。
![a01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/cfe6b387-3be6-0b5e-3a72-f76d19ab6f55.png)

## 事例
- たとえば、下図のcubeは、上面だけ法線が内向きになっています。(つまり外側へ向いていない)
![a02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/ab1e1da1-3cf6-d631-2ecf-7dc65d2e8e0f.png)

- この場合、下図のように、「面選択」をしたあと、「メッシュ」を選択して、「ノーマル」から「反転」を選択します。
![a03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/bdcea8e8-fdf9-e7f5-a013-d5eb6d189ac1.png)

- 下図のように、上面が反転されて、法線が表示されました。
![a04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/501dcb24-6464-c3de-8994-ddc65f00751b.png)
string.join()を用いてリストから文字列や整数に変換する方法

以下のような標準入力に対して、文字列や整数に変換する方法です。

```text
1 3 2
```

### 実装
```python
n = input().split()           # => ['1', '3', '2']
string_n = ''.join(n)         # => '132'
int_n = int(''.join(n))       # => 132
```

### 参考文献
- 入門 Python3
IntelliJ Kotlinビルド出来なくなった時の対処方法

# 発生したエラー
資産を全くいじっていないプロジェクトを実行しようとしたら
ビルドでエラーになってしまった。

```error
Caught an exception trying to connect to Kotlin Daemon:
java.lang.NoSuchMethodError: 'void org.jetbrains.kotlin.cli.common.messages.MessageCollector$DefaultImpls.report$default(org.jetbrains.kotlin.cli.common.messages.MessageCollector, org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity, java.lang.String, org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation, int, java.lang.Object)'
(中略)

Could not perform incremental compilation: Could not connect to Kotlin compile daemon
Could not connect to kotlin daemon. Using fallback strategy.


```

エラーを見るとKotlinのファイルが見当たらないっていっているような気がする。
そういえばKotlinのプラグインアップデートが来ていたから、何も考えずにアップデートしてしまったな…。

# 対応方法
## 適用されているkotlinのバージョンを確認。

設定＞プラグインから確認。どうやら現在適用されているのは、1.4.3バージョン。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174609/52adbd4b-6105-9880-4312-7f25ef1d8451.png)

## build.gradleを確認
build.gradleのkotlinバージョンは1.3.72。どうやらここが怪しそうです。


```build.gradle
buildscript {
    ext {
        kotlinVersion = '1.3.72'
        springBootVersion = '2.3.1.RELEASE'
    }
```

## build.gradleを修正
とりあえず戻せるように修正しました。

```build.gradle
buildscript {
    ext {
        //kotlinVersion = '1.3.72'
        kotlinVersion = '1.4.3'
        springBootVersion = '2.3.1.RELEASE'
    }
```

# 結果
無事にビルドランできるようになりました～！！よかった～。
プラグインは無暗に更新してはいけないんでした。うっかりです。
さっきまで動いていたのに動かなくなってしまった！という事があったら
一度プラグインのバージョン確認した方が良いかもです。
Linux上でのPS1（PSX）のISOイメージの吸い出し方（作り方）

# はじめに
PS1のCDはかなり古くなっており、今後未来に向けて貴重なソフトウェアを保護する観点からデータのバックアップする方法を考えます。この度、Linuxの通常のCDバックアップ方法（最強の方法）であるddを使ってやってみたら、何故だか何度やってもエラーが出てバックアップが取れませんでした。

Windowsで吸い出す方法は見つかるのですが、Linux上でのやり方はなかなか見つかりませんでしたので、Qiita上に記事を乗せ同じ課題に直面した方への支援をしたい所存であります。

# 出来なかった方法（ddを使った方法で起きるエラー）

通常のDDをつかったCDのバックアップ手順を行ってみます。

```
sudo dd if=/dev/sr0 of=CD.iso conv=noerror,sync
```
noerrorとsyncはそれぞれ読み取りエラーを無視してゼロで埋めるオプションです。無しで行うとエラーが出てすぐに止まるので、試してみました。しかしながらこの方法は不可能でした。

下記のようなエラーが連続で出力され、あるところで進まなくなります。

```
43373568 bytes (43 MB, 41 MiB) copied, 47.0817 s, 921 kB/s
dd: error reading '/dev/sr0': Input/output error
83736+979 records in
84715+0 records out
43374080 bytes (43 MB, 41 MiB) copied, 47.1179 s, 921 kB/s
dd: error reading '/dev/sr0': Input/output error
83736+980 records in
84716+0 records out
```


# 成功した方法(cdrdaoを使った方法)

この方法は下記のURLに書かれてあった方法です。

https://bbs.archlinux.org/viewtopic.php?id=33059

## cdrdaoのインストール

まずcdrdaoというソフトウェアをインストールします。Ubuntu20.04ですとapt経由で導入できました。

```
sudo apt install cdrdao
```

これで準備完了です。

## バックアップ

下記の方法で出来ました。

```
cdrdao read-cd --device /dev/sr0 --driver generic-mmc-raw -v 2 --datafile CD.bin --read-raw CD.toc
```

実行するとカレントディレクトリにCD.binとCD.tocというファイルが作成されます。このCD.binはePSXeやPCSXRなどのエミュレータから利用できることを確認しました。この方法ですべてのPS1のCDがバックアップ可能であるかについては不明です。

# 過去の遺産が消えていく現在

フロッピーやCDいろんなメディアがドンドン無くなっていく中で、過去の貴重な情報を保護する観点も重要になってくるかと考えています。いつWindowsやLinuxが違うものに変わってしまうかもしれません。気づいたときには過去の遺産を誰も読み出せなくなっているかもしれないのです。このような過去の遺産の置き去りは、急激な電子化の弊害でもあると思います。そのため、過去のデーターのバックアップ方法の確立は人類の命題と言っても過言ではないでしょう。実際に現在フロッピーがヤバイ状況に陥っています。*５インチ、８インチ、その他各種3.5インチ規格があり当時の読み方を再現できなければ読めない状況です。*

# 終わりに

今回はLinux上でPS1のCDのバックアップ操作が可能であることがわかりました。Linuxのソースコードは公開されていますから、これで近い将来はバックアップおよび電子化はどうにか可能でしょう。しかしながらこの方法もいつまで可能であるか不明です。cdrdaoが最新のドライブで使えなくなればやり方を修正しなければならないかもしれません。そういった問題は明日にでもすぐに起きることであり、かなり根深い問題であると思います。

この記事がうまく行かなかった人への助けになれば幸いです。
Ajax通信を実装しようとしたら、Uncaught ReferenceError: $ is not definedが出た

ご覧いただきありがとうございます。
この記事は[こちら](https://hnnsk.hatenablog.com/entry/2021/06/26/114031)へ移動致しました。
お手数おかけしますが、よろしくお願いいたします。
[WordPress][Nginx] サブディレクトリにサブディレクトリ型のマルチサイトWordPressを設置する際の Nginx 設定

```
set $proxy_https '';
if ($http_x_forwarded_proto = 'https') { set $proxy_https 'on'; }
if ($http_cloudfront_forwarded_proto = 'https') { set $proxy_https 'on'; }
if ($scheme = 'https') { set $proxy_https 'on'; }

rewrite ^(/[^/]+)/files/$ $1/index.php last;
rewrite ^(/[^/]+)/[_0-9a-zA-Z-]+/files/$ $1/index.php last;

if (!-e $request_filename) {
    rewrite ^(/[^/]+)/[_0-9a-zA-Z-]+/wp-json/.*$ $1/index.php$is_args$args last;
    rewrite ^(/[^/]+)/[_0-9a-zA-Z-]+(/wp-.*)$ $1$2 last;
    rewrite ^(/[^/]+)/[_0-9a-zA-Z-]+(/wp-admin/.*\.php)$ $1$2 last;
    rewrite ^(/[^/]+)/[_0-9a-zA-Z-]+(/.*\.php)$ $1$2 last;
    rewrite ^(/[^/]+)/[_0-9a-zA-Z-]+/?.*$ $1/index.php$is_args$args last;
}

location ~ ^(/[^/]+)/.*$ { try_files $uri $uri/ $1/index.php$is_args$args; }
location / { try_files $uri $uri/ /index.php$is_args$args; }

location ~ \.php$ {
    expires        off;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass   phpfpm;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_param  HTTPS            $proxy_https  if_not_empty;
    fastcgi_param  HTTP_PROXY       "";
    include        fastcgi_params;
    fastcgi_intercept_errors on;
    fastcgi_connect_timeout  60;
    fastcgi_send_timeout     180;
    fastcgi_read_timeout     180;
    fastcgi_buffers          16 16k;
    fastcgi_buffer_size      32k;
    fastcgi_busy_buffers_size 32k;
    fastcgi_temp_file_write_size 256k;
}
```
[pandas]featherファイルが読み込めなくなったとき

## エラー
```python
import pandas as pd

data = pd.read_feather('path/to/data.feather')

## ArrowInvalid: Not a feather file
```

## 解決策
```python
import pyarrow.feather as feather

data = feather.read_feather('path/to/data.feather')
feather.write_feather(data, 'path/to/data_v1.feather', version=1)
```

## 参考

https://github.com/ICB-DCM/pyABC/issues/315
Netlifyで新旧の独自ドメインでリダイレクトする設定5行

この投稿ではNetlifyで独自ドメインをリダイレクトする設定方法を説明します。

例えば、old.example.comをnew.example.comにリダイレクトする設定をする場合、netlify.tomlに次の`[[redirect]]`セクションを追加するだけです。

```netlify.toml
[[redirects]]
  from = "https://old.example.com/*"
  to = "https://new.example.com/:splat"
  status = 301
  force = true
```

この設定にすると、old.example.comのトップページはもちろん、old.example.com/posts/1のようなパスもリダイレクトされます。

- `https://old.example.com/` → `https://new.example.com/`
- `https://old.example.com/posts/1` → `https://new.example.com/posts/1`

`force`はfalseにすると、ファイルがある場合はリダイレクトしない設定になります。例えば、ファイル/aboutme.htmlが有るとき、**old**.example.com/aboutme.htmlへのアクセスはnew.example.com/aboutme.htmlへのリダイレクトされず、普通にそのファイルの中身が200ステータスで帰ってきます。ドメインのリダイレクト設定はなんのためにやるかというと、ドメイン名を変更するケースで行うものが大半だと思うので、ファイルが有るときだけはリダイレクトしないといった使い方はあまり考えられません。なので、`force`はtrueにしておきます。

上の設定では、httpsにしか触れてませんが、httpsではなくhttpでアクセスした場合はどうなるかというと、

```
http://old.example.com/page
↓
https://old.example.com/page
↓
https://new.example.com/page
```

という間に`http://old`から`https://old`へのリダイレクトをはさむ流れで最終的に新ドメインにリダイレクトされます。

これは無駄だな、`http://old`から`https://new`に直接リダイレクトしたいなという場合は、httpとhttpsの両方の設定をしてあげると、リダイレクトは1回だけで済むようにもできます:


```netlify.toml
[[redirects]]
  from = "http://old.example.com/*"
  to = "https://new.example.com/:splat"
  status = 301
  force = true

[[redirects]]
  from = "https://old.example.com/*"
  to = "https://new.example.com/:splat"
  status = 301
  force = true
```
【おさえておくべき！】プログラミング用語

#はじめに
####用語の壁
プログラミングを始める上で、慣れない専門用語に苦労します。。。
そこで、この記事では、プログラミングを始める上で押さえておいて欲しい用語を解説します。

全てを覚える必要はありません。見覚えのある用語に遭遇した時、この記事を再確認してもらう程度で大丈夫です。
なお、この記事は随時更新していきます。

##おさえておくべきこと

####1. フォルダとファイル
プログラムを書いていく上で、フォルダとファイルの違いをちゃんと認識しておくことが大切です。
ファイルとは、単体のデータのことを指します。例えば`pdfファイル`なら`hello.pdf`です。`wordファイル`なら`hello.docx`などですよね。基本的に拡張子がついているのは、ファイルです。

フォルダとは、ファイルをまとめた`箱`のようなものです。
`新規フォルダ作成`を押して、その中にさまざまなファイルを入れますよね。あの収納ボックスがフォルダなんです。

####2. パス
パスとは、ファイルやフォルダの場所をあらわすものです。つまりコンピューター内での住所です。
パスには、`相対パス`と`絶対パス`があります。難しそうな用語ですが、プログラムを書いていくうちに理解できていくと思います。

まず、`相対パス`とは、自分の現在地から見た、ファイルの住所です。
![スクリーンショット 2021-02-18 8.48.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689410/73c8f665-eab4-780a-0a16-15f24899e01d.png)

例えば、上の`meeting.png`のパスを考えます。

`meeting.png`は、`1週目`というフォルダの中に収納されてますよね。
次に、`1週目`というフォルダは、`3月`というフォルダの中に収納されています。
さらに`3月`というフォルダは`1.会議`というフォルダの中に収納されています。

このようにフォルダが段状に構成されてる仕組みを**`階層構造`**と言います。

<br>
それでは、コンピューターがわかるように`meeting.png`の住所を記述しましょう！
プログラムの中では、この住所を下のように記述します。
Mac:*`1.会議/3月/1週目/meeting.png`*
Windows: *`1.会議¥3月¥1週目¥meeting.png`*

<br>
フォルダの境を`/`で区切ります。ちなみに、`スラッシュ`で区切るのは**Mac**や**Linux**といったOSの場合で、
**Windows**の場合は**`¥`**で区切ると覚えておいてください。



さて、**1.会議/3月/1週目/meeting.png**というパスは、**1.会議**というフォルダから始まっています。
しかし、私のPCでは**1.会議**というフォルダ自体はデスクトップに保存しています。ここで、絶対パスの出番です。
絶対パスを使用することで、コンピューターの中での住所がより明確になります。

Macの場合の絶対パス→  *`/Users/hello/Desktop/1.会議/3月/1週目/meeting.png`*

この絶対パスがあれば、`meeting.png`は`Desktop`の中にあるフォルダに収納されていることがわかります。
このように、コンピューター全体からみた`絶対的な`住所のことを`絶対パス`と言います。

実際の住所も`市内〇〇町3-18`などと省略しますよね。相対パスのイメージはこんな感じです。
一方、絶対パスなら、`/地球/アジア/日本/〇〇県/〇〇市/〇〇町/3-18`と書くイメージです笑


####3. ディレクトリ
ディレクトリとは、簡単に言うと`フォルダ`のことです。
youtube-dl でファイル名を IDで保存する方法

youtube-dl でファイル名を IDで保存する方法です。

まずは youtube-dl のインストール方法

````bash
sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl ;
sudo chmod a+rx /usr/local/bin/youtube-dl ;
````

コマンドラインからファイル名を IDで保存

````bash
youtube-dl -o "~/%(id)s.%(ext)s" "https://www.youtube.com/watch?v=XayoaxJQ_hA"
````

ちなみに php と apache で web から叩く場合は

````php:youtube_dl_id.php
<?php

set_time_limit( 0 );

$url = 'https://www.youtube.com/watch?v=XayoaxJQ_hA';
$cmd = 'youtube-dl -o "/home/myusername/work/%(id)s.%(ext)s" ' . escapeshellarg($url);
exec($cmd, $output, $ret);

echo 'output: ';
var_export($output);
echo "\nret: ";
var_export($ret);
````

もしくは chdir で作業フォルダを移動して実行

````php:youtube_dl_id.php
<?php

set_time_limit( 0 );

echo getcwd() . "\n";
chdir("/home/myusername/work/");
echo getcwd() . "\n";

$url = 'https://www.youtube.com/watch?v=XayoaxJQ_hA';
$cmd = 'youtube-dl -o "%(id)s.%(ext)s" ' . escapeshellarg($url);
exec($cmd, $output, $ret);

echo 'output: ';
var_export($output);
echo "\nret: ";
var_export($ret);
````

####参考リンク
- [ytdl-org/youtube-dl: Command-line program to download videos from YouTube.com and other video sites ](https://github.com/ytdl-org/youtube-dl/)
- [Use youtube-dl in a PhP script. · Issue #711 · ytdl-org/youtube-dl ](https://github.com/ytdl-org/youtube-dl/issues/711)
- [現在のディレクトリを変更 - chdir関数 - PHP入門 - Webkaru ](https://webkaru.net/php/chdir/)
変数名で指定したクラスのインスタンスを作る。

# 変数名で指定したクラスのインスタンスを作る

## ソースコード
```php5
<?php
class Cat {
    public function say() {
        echo "Nya".PHP_EOL;
    }
}

$cat1 = new Cat();
$cat1->say();

$className = 'Cat';
$cat2 = new $className;
$cat2->say();
```

## 実行すると

```bash
php new_instance_useing_value.php
Nya
Nya

```

## 説明

```php5
$className = 'Cat';
$cat2 = new $className;
$cat2->say();
```

変数 $className に格納された Cat クラスを生成する。


## 参考記事
https://qiita.com/gorogoroyasu/items/d8a6e032eb4debb147ca
Nginx で Laravel と phpMyAdmin を使う

Nginx で Laravel と phpMyAdmin を使う時の設定ファイルです。

Ubuntu 20.10 で確認しました。

```text:/etc/nginx/sites-available/defalt
server {
        listen 80 default_server;
        listen [::]:80 default_server;
        #
        root /var/www/html;
        server_name _;

        location / {
               try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
        #
               fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        }

        location  ^~ /phpmyadmin {
                root /usr/share;
                index index.html index.htm index.php;

                location ~ \.php$ {
                        include snippets/fastcgi-php.conf;
                        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
                }
        }

}
```

設定ファイルが正しいか確認

```text
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```

Nginx の再起動

```
sudo systemctl restart nginx
```
【UnrealEngine4:metahuman】2015年式MacBookAirでmetahuman挑戦してみた

##結論
開発を断念しました。
その経過にご興味がある方は読んでみてください。続きは20秒程度です。

##PCスペック
2021年2月現在、こんな感じです。
![スクリーンショット 2021-02-17 9.58.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/2c58fa7a-67cc-daed-b64a-13b9f273013e.png)



##手順

###(1)公式サイトのダウンロードページからダウンロードする。
https://www.unrealengine.com/ja/download
結構時間がかかりました。
途中、CPUパフォーマンス警告も出てきました。
![スクリーンショット 2021-02-17 9.55.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/9a57fad1-1ff3-d475-b0f0-c268492445a9.png)
いけたっぽいです。
![スクリーンショット 2021-02-17 10.02.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/36507e99-f425-e60c-eb1b-f886efcdace4.png)
これは無視して、やりたいことをやります。
一度、ローンチャーに戻ってマーケットプレイスからお目当てのものを探します。

###(2)今回やってみたいこと
MetaHumansを作ってみたい（軽く）
▼こちらからダウンロードできるみたいです
https://www.unrealengine.com/marketplace/ja/learn/metahumans#
![スクリーンショット 2021-02-17 10.04.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/c6fdecb9-01c9-65e6-f4e7-927eb15bce78.png)

▼こんな感じで立ち上がります
![スクリーンショット 2021-02-17 15.31.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/e199cfb9-1c1a-1282-00a4-576fa56397b8.png)
ようやく立ち上がった、、、、。
と思ったけど、なんかイメージと違う、、、、。
シェーダーをコンパイル中、、、、。
やはりMac Book Airではだめか、、、、。
このあと、いくら待ってもシェーダーをコンパイルしているためこのPCでの開発を諦め、、、、、
![スクリーンショット 2021-02-17 16.29.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/6766750c-d0cf-33b1-11c2-f426cff0dc44.png)

###(3)M1 mac 買う。
気付いたらm1 のMacを買っていました。
いまのairよりは、性能がいいだろうということで。
カスタマイズしたせいで届くのが3月中旬になるのですが、楽しみです。
Windows のコンソール関係でよく見る情報のメモ

# WSL
- [Windows Subsystem for Linux に関するドキュメント](https://docs.microsoft.com/ja-jp/windows/wsl/)
- [wsl.exe](https://docs.microsoft.com/ja-jp/windows/wsl/reference)
- [wsl.conf](https://docs.microsoft.com/ja-jp/windows/wsl/wsl-config#configure-per-distro-launch-settings-with-wslconf)
- [.wslconfig](https://docs.microsoft.com/ja-jp/windows/wsl/wsl-config#configure-per-distro-launch-settings-with-wslconf)

## 参考情報
- [WSL2の初歩メモ](https://qiita.com/rubytomato@github/items/a290ecef2ea86ea8350f#%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%8B%E3%82%89windows)

# Terminal
## 公式ドキュメント
- [Windows ターミナルとは](https://docs.microsoft.com/ja-jp/windows/terminal/)
- [Welcome to the Windows Terminal, Console and Command-Line repo](https://github.com/microsoft/terminal)
    - [ColorTool](https://github.com/microsoft/terminal/tree/main/src/tools/ColorTool)
- [settings.json スキーマ](https://aka.ms/terminal-profiles-schema)


## 参考情報
- [Windows Terminal Tips](https://qiita.com/whim0321/items/6a6b11dea54642bd6724)

# Visual Studio Code
- [Visual Studio Codeで日本語入力時に文字が左にずれる・カーソルが二重になる](https://qiita.com/seixyasun/items/86446ebbac9fa939e141)

# PowerShell
- [PowerShell 101](https://docs.microsoft.com/ja-jp/powershell/scripting/learn/ps101/00-introduction?view=powershell-7.1)
デバックの仕方

プログラム実行結果が想定通りではないときのデバック方法を記載
##基本の動き
####1. ブレークポイントを置く
想定通りか確認したい行で`F5`を押すと、行数の左側に赤いポイントが付く。`解除もF5`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037774/eee5650d-562a-c1c5-5e35-98c555c6dccf.png)
####2. コンパイルして実行
`F9`でコンパイルしてアプリケーションを動かしてみる
####3. ブレークポイントで止まっていることを確認
以下のようにブレークポイントに`→`があればそこで処理が止まっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037774/0b93a5b3-f87d-32d3-71dc-6f9785acd25e.png)
####4. ステップイン
`F8`を押すと一行ずつ処理を進めるので、変数に想定通りの値が格納されているかなどを確認していく。
メソッドの中まで一行ずつ確認したい場合は`F7`を押すとメソッドの中に入る
##Tips
####ブレークポイント一覧
`Ctrl + Alt + B`を押すとブレークポイントの一覧が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037774/02bf0b18-f7d1-4480-3c22-49149e66d664.png)
####評価/変更
`ctrl+F7`を押すと以下が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037774/94631d19-c585-eb75-0e61-204b28a82568.png)
「評価する式」に変数や式を入れると、結果が表示される
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1013247/f4e80011-9162-01a2-cabb-3defead78819.png)
実用的な使い方：「ブレークポイント」で停止した後、「ソースコードを選択」し、`ctrl+F7`で中身を確認
####監視式
`Ctrl+Alt+W`で監視式を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037774/ee33a21d-2765-a5a9-1991-7c56efadba37.png)
監視式に変数をコピーすると、変数に格納されている値を監視できる
####変数やクラスの定義箇所に移動
`Ctrl`を押しながら変数やクラスをクリックすると、
変数を定義した行数に移動する。

移動先から元の場所へ戻りたいときは`Alt＋←`
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1013247/591d404e-a782-1827-9b66-8ab7c9183d34.png)
又は、DelphiのIED上部にあるボタンでも移動が可能。
####ブックマーク
`Ctrl＋Shift＋[1－9]`を押すと、行数の左側に押した数字が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1037774/1055453e-711e-d451-f2e6-b77a7871d560.png)
`Ctrl＋[1－9]`を押すと、押した数字の場所に移動する
Azure DevOps Server 導入に関する情報

**Chapters**

📘 **Chapter #1**
　📗 **Chapter #1-1**　[継続的インテグレーション（CI）構築](https://qiita.com/tfukumori/items/ef8314857ecb545c4b15)
　📗 **Chapter #1-2**　[継続的インテグレーション（CI）手順](https://qiita.com/tfukumori/items/11d24a5eee8d77a17a80)
📘 **Chapter #2**
　📗 **Chapter #2-1**　[VB6で使用する 環境設定](https://qiita.com/tfukumori/items/37f035694751dc098fcd)
　📗 **Chapter #2-2**　[VB6で使用する プロジェクトの追加](https://qiita.com/tfukumori/items/68aca8cdc04fe76d6eee)
📘 **Chapter #A**
　📗 **Chapter #A-1**　[バージョンアップ TFS 2018 Update 1 → Update 3、検索サービスの分割](https://qiita.com/tfukumori/items/778bb2e3d913106beba9)
　📗 **Chapter #A-2**　[バージョンアップ 2019→2019 Update1](https://qiita.com/tfukumori/items/7f149928a6e413afe755)
　📗 **Chapter #A-3**　[バージョンアップ 2019 Update1→2020.0.1 + Patch 1](https://qiita.com/tfukumori/private/8d7a9617924f42cbe04f)
　📗 **Chapter #A-4**　[バージョンアップ 2020.0.1 + Patch 1→2022 Update 1 + Patch 2](https://qiita.com/tfukumori/private/e65aa7aa1e058e50a47e)
📘 **Chapter #B**
　📗 **Chapter #B-1**　[Azure DevOps Server 導入に関する情報](https://qiita.com/tfukumori/items/13233d01b133ea824fb6)

---

# 概要

- Azure DevOps Server 導入関連情報
- 2024年6月5日時点の情報


# リリースノート

https://docs.microsoft.com/en-us/azure/devops/server/release-notes/azuredevops2022

# ロードマップ、リリースされた機能

:::note
ロードマップでServerの列を確認することで、Azure DevOps Serverへのリリース状況を確認することができます
:::

https://learn.microsoft.com/ja-jp/azure/devops/release-notes/features-timeline?WT.mc_id=DT-MVP-4039781

:::note
新機能でServerの列に`将来`と記載がある場合は、将来的にAzure DevOps Serverにリリース予定の機能となります
:::

https://learn.microsoft.com/ja-jp/azure/devops/release-notes/features-timeline-released

# 事前調査

💡 [Administration - Azure DevOps | Microsoft Docs](https://docs.microsoft.com/en-us/azure/devops/server/server/)より抜粋

- [必要なスペック](https://docs.microsoft.com/en-us/azure/devops/server/requirements?view=azure-devops-2022&viewFallbackFrom=azure-devops)
    - 検索、自動ビルド、テスト、レポートなどを使用する場合は複数サーバーの利用を推奨
        - 💡 検索、自動ビルドの有無で開発効率はかなり変わりますので、最初から複数サーバーでの構築を考慮したほうが良いかもしれません。
- [クライアントの互換性](https://docs.microsoft.com/en-us/azure/devops/server/compatibility?view=azure-devops)
    - Visual Studio 2005以上（フルサポートはVisual Studio 2017以上）
    - ⚡ 個人での確認: VB6 も MSSCCI Provieder 経由での[動作は確認済み](https://qiita.com/tfukumori/items/37f035694751dc098fcd)

# インストール

- [インストール](https://docs.microsoft.com/en-us/azure/devops/server/install/get-started?view=azure-devops-2022)
- [検索サーバーを別サーバーに](https://docs.microsoft.com/en-us/azure/devops/project/search/administration?view=azure-devops-2022)
    - Oracle JRE からの移行方法も記載されている

# 管理

- [プロジェクトの開始方法](https://docs.microsoft.com/en-us/azure/devops/user-guide/project-admin-tutorial?view=azure-devops)
- [必要な作業](https://docs.microsoft.com/en-us/azure/devops/server/admin/admin-quick-ref?view=azure-devops-2022)
- [バックアップ](https://docs.microsoft.com/en-us/azure/devops/server/admin/backup/backup-db-architecture?view=azure-devops-2022)
- 💡　次のアドレスで管理ログにアクセスできる
    - `<http or https>://<hostname>:<port>/<web-application-name>/_oi/_diagnostics/activityLog`
js関数をプラグイン化して、別のjsファイルで使用できるようにする

```javascript
// common.js
(function($) {
  var namespace;                  // 任意な名前

  namespace = {                   // オブジェクトの定義
      hoge : function () {
        // 何かしらの処理
      },

      fuga : function () {
        // 何かしらの処理
      }
  };

  window.ns = namespace;  // windowオブジェクトに"ns"名としてバインディング

})(jQuery);

```

```javascript

// foo.js
$(function () {
 ns.hoge() // プラグイン化したhogeメソッドを呼び出す。
 ns.fuga() // プラグイン化したhogeメソッドを呼び出す。
}

```

上記のような形でjs関数を再利用可能な関数として使うことができます。
Amazon API GatewayのLambda Authorizerのレスポンスに注意

API GatewayのLambda Authorizerでハマったので、原因調査の覚書。

## 症状
Lambda Authorizerで認証すると、アクセス許可しているはずなのに、認証失敗する。
サーバーからは500番のステータスコードが返される。
サーバー側のログを見る限り、リクエストはLambda AuthorizerのLambdaまでしか到達できていない。

AuthorizerのLambda関数から返しているポリシーは下記のとおりであった。

```json:Authorizerのレスポンス
{
    "principalId": "52e60f29-a7c8-4665-99ea-1ec8f7fecb81",
    "policyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "execute-api:Invoke",
                "Effect": "Allow",
                "Resource": "arn:aws:execute-api:ap-northeast-1:012345678901:hogehoge/prod/$connect"
            }
        ]
    },
    "context": {
        "userId": "52e60f29-a7c8-4665-99ea-1ec8f7fecb81",
        "group": [ "student" ]
    }
}
```

## 原因
`context` で渡す値にはArrayを入れることが禁止されていた。
下記のようにポリシーを修正すると、無事リクエストが通った。

> Notice that you cannot set a JSON object or array as a valid value of any key in the context map.
https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-lambda-authorizer-output.html


```json:Authorizerのレスポンス(修正版)
{
    "principalId": "52e60f29-a7c8-4665-99ea-1ec8f7fecb81",
    "policyDocument": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Action": "execute-api:Invoke",
                "Effect": "Allow",
                "Resource": "arn:aws:execute-api:ap-northeast-1:012345678901:hogehoge/prod/$connect"
            }
        ]
    },
    "context": {
        "userId": "52e60f29-a7c8-4665-99ea-1ec8f7fecb81",
        "group": "student"
    }
}
```

## ちなみに
下記の可能性も探ったが、いずれも関係なかった。

* Node.js で `async/await` 使っているからまずい？

[Lambda Authorizerのサンプルコード](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-websocket-api-lambda-auth.html) ではCallbackを使っていたので、疑った。
結論としては、async/awaitで問題なく動作する。
[2018年頃は本当に動作しなかったらしい。](https://stackoverflow.com/questions/50688624/serverless-authorizer-async-await-not-working/51139440)

* `principalId` がなにかおかしい？

いつもArnやAWSサービスのドメイン名を入れているイメージなので、疑った。
しかし、Lambda Authorizerで返すポリシーについては、このPrincipalIdは何を入れても良いらしい。
ただそのままバックエンドに context 経由で渡されるだけ。ユーザーIDとか入れておけば便利そう。

* ポリシーの返し方がまずい？

AuthorizerのLambdaは、下記のようなコードでポリシーを返していた。
JSONに変換しないとだめなのかと疑ったが、そのままで良かった。
逆に `JSON.stringify` で文字列に変換して返すと、500エラーが出るようになる。
型定義を信じよう。

```ts:コード例.ts
export const lambdaHandler: APIGatewayRequestAuthorizerHandler = async (event, context) => {
    ... // トークンverifyなどの処理
    return {
        principalId: idToken.sub,
        policyDocument: {
            Version: "2012-10-17",
            Statement: [
                {
                    Action: "execute-api:Invoke",
                    Effect: "Allow",
                    Resource: event.methodArn,
                }
            ]
        },
        context: {
            userId: idToken.sub,
            group: idToken['cognito:groups']?.shift(),
        }
    };
}
```

以上。
FlutterでのSVGの使い方とエラー対策

#そもそもSVGファイルとは？

SVG = Scalable Vector Graphicsのこと
簡単に言えば画像をベクトル形式で保存しており、拡大や縮小などでも劣化しにくい画像保存形式でロゴとかに使われる

デザインのサイトでもSVGファイルのダウンロードをすることが多くて、FlutterでもSVGファイルを扱えないか調べてみた。
unDrawというめっちゃいい感じのデザインサイトでもSVGファイルで画像を保存できる
https://undraw.co/illustrations

Flutter_svgというpackageを使えば良さそう
https://pub.dev/packages/flutter_svg

ドキュメントを読めることができるなら上のパッケージの説明文を読んでいただければ十分だと思います！
パッケージのインストー
ルの方法は通常と同様にpubspec.yaml file に

````
dependencies:
  flutter_svg: ^0.19.2+1
`````

を追加したのち（バージョンは最新版を参照してください）

````
$ flutter pub get
````
でインストールする。
その後使いたいDartfileに

````
import 'package:flutter_svg/flutter_svg.dart';
````

パッケージをimportして使えるように！

ここで注意するのがflutter_svgの最新バージョンだとAndroidのsdkの古いバージョンに対応していない場合がありsdkのバージョンエラーが発生する。
例えば下の感じ

Because sampleapp depends on flutter_svg >=0.19.2 which requires Flutter SDK version >=1.24.0-6.0.pre, version solving failed.
pub get failed (1; Because sampleapp depends on flutter_svg >=0.19.2 which requires Flutter SDK version >=1.24.0-6.0.pre, version solving failed.)

このような場合はFlutterSDKのバージョンをアップすれば良い、がただFlutter upgradeをターミナルに打ち込んでもうまくいかないことが

この時はFlutter channelsを変更してアップグレードするか、flutter_svgのバージョンを少し古いのにして対応する。
基本的には古いversionを使うのがおすすめ
下のURLにバージョン一覧があるからちょっと前のやつを選ぶと使えるようになる
https://pub.dev/packages/flutter_svg/versions

あとはassetsというフォルダを作成し、そこに画像を入れpubspeck.ymlも更新する（これは普通のimgaを追加する時と同じ

````
flutter:
  assets:
   - assets/
````


assetsに追加した直後はattribute data-name is not allowed hereというエラーが生じる場合がある。このような時はFile -> Invalidate Cache / RestartでAndroid Studioを更新するとエラーがなくなる。
ここまできたら実際にアプリを作るときにコードを書いていけばいける！

````
final String assetName = 'assets/image_that_does_not_exist.svg';
final Widget svg = SvgPicture.asset(
  assetName,
);
````
こんな感じで普通のimageと同じような感じで扱えるようになる

参考文献

https://pub.dev/packages/flutter_svg

https://qiita.com/ikemura23/items/5671bba76136d940b618

https://ferret-plus.com/8445

https://qiita.com/unsoluble_sugar/items/5356646b1a7d9b9fecd2

https://www.quora.com/How-do-I-solve-the-following-error-attribute-is-not-allowed-here-in-Android-Studio
S3 Transfer Acceleration とは？

## 勉強前イメージ

名前からして、s3のデータを早く転送しそう

## 調査

### S3 Transfer Acceleration とは？

海外リージョンなど、送信元から遠く離れたS3へのデータ転送を
AWSのエッジロケーションとネットワークプロトコルの最適で高速化するサービスです。

### S3 Transfer Acceleration のユースケース

- 世界中からアップロードが行われるケース
- 大陸間で定期的にGBからTBのデータを転送するケース

### S3 Transfer Acceleration を有効にする方法

- バケットのプロパティを確認

以下の様に `Transfer Acceleration` の設定があります

![s3 にあるS3 Management Console - Google Chrome 2021-02-17 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/51866fa6-10d5-3a8e-b58c-0fce0909a03d.png)

- 有効にします

![s3S3 Management Console - Google Chrome 2021-02-17 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/439dcab8-2293-3ad5-b702-912cdeb4ba74.png)

- 有効になりました

![s3s3S3 Management Console - Google Chrome 2021-02-17 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/633aaa79-2923-1088-9966-190f904ac552.png)

### S3 Transfer Acceleration の費用

1GBアップロードあたり、$0.04 が上乗せされます

![料金 - Amazon S3 ｜AWS - Google Chrome 2021-02-17 18..png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/3f928e19-9e57-7437-dc46-4a6400d7b92e.png)

## 勉強後イメージ

アップロードを早くするためかー
そんなのあるとはわかったけど、あんまりユースケースがわからないなぁ。。
cloudfront使う時とかかな？

## 参考

- [Amazon S3 Transfer Acceleration](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/transfer-acceleration.html)
- [Amazon S3 の料金](https://aws.amazon.com/jp/s3/pricing/)
- [S3 Transfer AccelerationをAWS CLIを使って試してみた](https://dev.classmethod.jp/articles/s3-transfer-acceleration-with-aws-cli/)
[javascript] const, let, varについて調べてみた（今更）

# 調べてみました

ES2015(ES6)javascriptの変数宣言で使うconst, let, varについて今更調べてみました。

それぞれの違いは以下で分類できます。

- 再代入
- 再定義
- スコープ
- ホイスティング（巻き上げ）

それぞれについてどんなものか見ていきましょう。

## 再代入

- var, letで可。
- constでは不可。

``` js:var,letで可
var a = 1;
let b = 1;
a = 10;
b = 100;
console.log(a);
console.log(b);
```

> 10
> 100

``` js:constでは不可
const a = 1;
a = 10;
console.log(a);
```

> Uncaught TypeError: Assignment to constant variable.

## 再定義

- varのみ可。
- let, constでは不可。

``` js:varのみ可
var a = 1;
var a = 100;
console.log(a);
```

> 100

！？再代入なんて出来ちゃうんだ・・・エラーにしてくれないと絶対ソース分かりづらくなりそう・・・
<br>

``` js:let,constでは不可
let a = 1;
let a = 100;
console.log(a);
```

> Uncaught SyntaxError: Identifier 'a' has already been declared

こっちが普通だよね・・・

<br>


``` js:let,constでは不可
const a = 1;
const a = 100;
console.log(a);
```

> Uncaught SyntaxError: Identifier 'a' has already been declared

## スコープ

- varは関数。
- let, constはブロック（`{・・・}`）。

``` js:varは関数
if (true) {
  var aisatsu = "Hello!";
  console.log(aisatsu);
}

console.log(aisatsu);
```
> Hello!
> Hello!

ifの中で宣言したのにその下でも使える・・・！？

<br>

``` js:let,constはブロック（`{・・・}`）
if (true) {
  let aisatsu = "Hello!";
  console.log(aisatsu);
}

console.log(aisatsu);
```
> Hello!
> Uncaught ReferenceError: aisatsu is not defined

こっちの方がわかりやすいなぁ・・・

<br>

## ホイスティング（巻き上げ）

- varはされる。
- let, constはされない。

``` js:varはされる
console.log(aisatsu);

var aisatsu = "Hello!";
```
> undefined

``` js:let,constはされない。
console.log(aisatsu);

let aisatsu = "Hello!";
```
> Uncaught ReferenceError: Cannot access 'aisatsu' before initialization


ちなみにホイスティングについて補足・・・
以下のソースは、aisatsuという変数を宣言、初期化する前に呼んでいますが、`ReferenceError`にはなっていません。
変数の宣言が関数の一番上に「巻き上げ」られています。

``` js
console.log(aisatsu);

var aisatsu = "Hello!";
```

内部ではこのソースのように動いている、ということですね。

``` js
var aisatsu;
console.log(aisatsu);

aisatsu = "Hello!";
```

こんな問題(?)があるので、jsでは（let,constが出てくるまでは）変数の宣言は関数の最初にやろうねという思想が生まれています。他のプログラミング言語を知ってても知らなくてもあまり直感的ではなさそうです・・・。


# 結論
varはあまり直感的でないので、むやみに使用するとどこかでバグらせそう。また、letやconstは他の言語での変数と同様に動いてくれそうなので、こちらを使用した方が良さそうです。
変数定義はほとんどconstで良さそう。const使いまくろうっと。
数え上げする変数とかはlet。varはもう使わない。以上！