OmniAICreator/Qiita-1.07M huggingface dataset:
220201 GFPGANで昔の母ちゃんが復活

これ記事にするかどうか疑問だが、とりあえずAIが初めて役に立つと思えた瞬間である。

https://photos.app.goo.gl/NgT1XuhBfE8TDA2E6

GFPGAN
　とりあえず香港の研究チームが作られた、AIの画像処理である。

リポジトリ
　https://github.com/TencentARC/GFPGAN

ついでに、３年前に亡くなった、じいちゃんも復活させた。

# 気づき
　こうやって、しみじみと写真を見ていると、いかに人生というものが繰り返しであるということを実感する。次に慰霊されるのは、もちろん自分であるが、その頃には３Ｄのアバターで復刻されているかもしれない。そう考えると、たくさん写真を撮っておくことも大切と言える。写真だけでなく、声や言葉なんかも、やはり大切なのかもしれない。

# 次のステップ
　しばらく、爺ちゃん祖母ちゃんをネタにするのは申し訳ないが、白黒写真も悲しいので、お次はカラー化も検討してみたいと思う。３Ｄアバターが踊りだすような、モーション加工もやってみたい。
才能を伸ばす方法

##前書き

昨日読んだ致知出版社[『1日1話、読めば心が熱くなる365人の仕事の教科書』][1]の一節で、日本水泳連盟理事の金子正子さんの指導者論を読んで思ったタイトルである。
金子さんが書いた記事のタイトルは **『才能があるのに伸びない選手』。**　
ということは、逆説的に考えると、才能を伸ばす方法が書いてあるはずである。
　
ちなみに、[私が所属する会社の仲間たちが書いたQiitaの記事の777番目を狙って][2]急ぎ投稿した次第である。
上手くいけば、この記事が記念すべき777番目の記事になると思って昨日読んだ記事の感想文を書いてみたという不純な動機であるが、ためになる話だと思う。
（日課の読書は今日はまだ読んでない）
だが、しかし。書き終わったところで確認したところ、778番目だったようだ。数え間違えをしていたらしい。

[1]:https://www.amazon.co.jp/1%E6%97%A51%E8%A9%B1%E3%80%81%E8%AA%AD%E3%82%81%E3%81%B0%E5%BF%83%E3%81%8C%E7%86%B1%E3%81%8F%E3%81%AA%E3%82%8B365%E4%BA%BA%E3%81%AE%E4%BB%95%E4%BA%8B%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E8%97%A4%E5%B0%BE%E7%A7%80%E6%98%AD/dp/4800912474

[2]:https://qiita.com/organizations/works-hi

##本題　【10月8日】 才能があるのに伸びない選手 金子正子 日本水泳連盟シンクロ委員長

金子正子。アースティックスイミングの指導者。井村雅代とともに、小谷実可子らの無敵のシンクロ日本代表選手たちを育てた。
1944年生まれ。御年、77歳。

金子が語るのはシンクロ指導者としての振り返り。小谷実可子らが育った頃というから、日本シンクロ界の絶頂期、今から30年前の1990年の頃だろう。
私は、「成長するための本質」が語られていると感じた。それは、「与えられた環境の中で考え抜いて行動すること」
この記事は2006年4月号の雑誌「致知」の対談記事。冒頭、金子は語り出す。

>『数年前から、東京の「国立スポーツ科学センター」という日本初のナショナルトレーニングセンターの中にシンクロ専用のプールができて、施設には恵まれるようになりましたが、
　それまで、特に小谷実可子の育つ頃は西武さんが持っている池袋のプールを、一般公開する前の早朝にお借りしてずっとやってきたんです。
　借りるにあたっては、早朝五時半頃から集まってプール掃除をしてから練習、終わったら自分たちでプールを磨いてお返しする。それこそ自動で動く機械の清掃道具なんてなかったですから、重い用具を押してプールの中を這いずり回って掃除していました。
　取材に来られた方は「五輪選手でもこういう掃除をされるのですか」と驚いていらっしゃいましたが、「五輪に行く選手だからするのです。下の子たちが磨いたプールで上の子たちが泳いでいるようではダメ。上の子がしていることを、下の子たちに見習わせています」といつも言ってきました。』

>『選手たちにも「こうしてプールを自由に使わせてもらって、ここの皆さんにどうやってお礼ができると思う？」と聞くと、「できません。お金もないし……」と言うから、じゃあ、「日本一になるしかないネ」「オリンピックでメダルを取るしかないわね」と言っていました。そして、どうしたら周りの人たちと気持ちが通うのか、迷惑をかけずに練習ができるのか、考えて行動するよう指導しました。
　感謝すること、挨拶や荷物の置き場所、いろいろ考えて実践してきました。自分たちがどう動いたら周りの人たちが気持ちよく応援してくれるかを。五輪なんか行くと、いろいろな方から「シンクロの選手たちは明るく気持ちのいい挨拶をしてくれる」と褒めていただきますが、貧しい中で育ったゆえ、挨拶をしないと次が始まらないと自然と分かっていたんでしょう』

>『昔、ライバルのクラブチームが、小さいけれど専用プールを持ったことがありました。「そんなに存分に練習できるチームにはもう勝てません」と選手たちは諦め気味でしたが、「明日も明後日も何時間でも練習できると思ったら、きょうくらいはと思って手を抜くと思わない？あなたたちは二時間しかないけど、工夫して懸命に泳いだ方がずっとプラスじゃない」と私は言い切ったんですね。（中略）我ながら貧しい中でよく考えてやっていると思いましたが、条件の悪い中で何とか工夫して、「やっている」という思いをいつも選手に持たせながらやり続けてきたことが、結果としては良かったのかもしれないと思います。』

すごいな。一流のシンクロの選手を育てているが、人間としても素晴らしい人材を育てているのではないか？　
ネットで当時の写真を見つけた。井村雅代とのツーショット。お二人ともお若い。
金子は最後に締めくくる。あくまでシンクロの指導者としての立場を超えない謙虚な発言であるが、冒頭に書いたように、人間が成長するための本質を語っていると思えてならない。

>『私は条件が悪い中で工夫するということは、選手についても同じことが言えると思います。素質や才能のある子は簡単にできてしまうから、あまりじっくり考えることがないんですね。
　才能があるのに伸びないという選手は、だいたい深く自分を考えることができない子が多い。』

（参考）
金子正子　－Wiki

https://ja.wikipedia.org/wiki/%E9%87%91%E5%AD%90%E6%AD%A3%E5%AD%90

【復刻】井村雅代ＨＣの壮絶半生　メダル請負人はこうして生まれた

https://www.nikkansports.com/olympic/tokyo2020/swimming/photonews/photonews_nsInc_202108030000408-1.html

国立スポーツ科学センター　ー公式サイト

https://www.jpnsport.go.jp/hpsc/facility/jiss/tabid/1381/Default.aspx


##後書き

この記事から導かれる、 **才能を伸ばす方法**
そう、それは**「与えられた環境の中で考え抜いて行動すること」** ですね。
周りより自分がちょっとデキるやつだからって、自惚れて何も考えないでいても成長しない。
自分が成長できないのは周りのせいだ、なんて他責にしていても成長しない。
与えられた環境の中で考え抜いて行動していくこと。それが、自分の才能を伸ばす方法。
そして、そういう人たちが自然と集まってくるもんなんだよね。成長する集団っていうのは。

とここまで書いてきて、778番目の記事でもいいやと思ってきた。キリ番ゲットできなかったことなんて小さいことだ。
成長にピンを止めて、自発的に記事を書いてくれる素敵な仲間たちの一員でいることに誇りを持ててきた。

以上、皆様のお役に立てば幸いです。
manimの備忘録シェルピンスキーのギャスケット

from manimlib.imports import *
import numpy as np


class Sierpinski(MovingCameraScene):

    def construct(self):
        def b_afin(Cx,Cy):
            b_afin = np.array([
                [1,0,-Cx],
                [0,1,-Cy],
                [0,0,1],
            ]) 
            return b_afin

        def a_afin(Cx,Cy):
            a_afin = np.array([
                [1,0,Cx],
                [0,1,Cy],
                [0,0,1]
            ])
            return a_afin
        
        def rotate_matrix(rad):
                r_matrix = np.array([
                    [np.cos(rad),-1*np.sin(rad),0],
                    [np.sin(rad),np.cos(rad),0],
                    [0,0,1],
                ]) 
                return r_matrix

        def create_tri(a,b,c):
            
            length = b[0]-a[0]
            c = [0,0,0]
            c[0] = a[0] + length / 2 
            c[1] = a[1] + np.sqrt(3)*length / 2 
            c = np.array([c[0],c[1],1])
            n1 = (a + c)/2
            n2 = (b + a)/2
            n3 = (c + b )/2

            line1 = Line(n1,n2,stroke_width =1).set_color(BLUE_A)
            line2 = Line(n2,n3,stroke_width =1).set_color(BLUE_A)
            line3 = Line(n3,n1,stroke_width =1).set_color(BLUE_A)
            
            length = np.linalg.norm(n2-a)
            length2 = np.linalg.norm(b-n2)
            length3 = np.linalg.norm(n3-n1)
            
            dots = [a,n2,n1,n2,b,n3,n1,n3,c]

            if length < 0.125/2:
                return
            else:
                lines = VGroup(line1,line2,line3)
                self.add(lines)
                self.wait(0.1)
                
                create_tri(a,n2,n1)
                create_tri(n2,b,n3)
                create_tri(n1,n3,c)
                return dots 


        a = np.array([-3,-2,1])
        Ax = a[0]
        Ay = a[1]
        b = [0,0,1]
        b[0] = a[0] + 6
        b[1] = a[1]
        b[2] = 1
        b = np.array([b[0],b[1],b[2]])
        c = a_afin(Ax,Ay)@(rotate_matrix(np.pi/3)@(b_afin(Ax,Ay)@b))
        tri = Polygon(a,b,c,stroke_width =1)
        self.play(ShowCreation(tri))
        create_tri(a,b,c)
        self.wait(1)
【備忘録】Codewar(JavaScript)勉強記録

# Codewar を使い始めたので自分用アウトプット記録。

JavaScript をもっと使えるようになりたいのと、就活中なので始めてみた。
Time Complexity とかも考えて効率的で良いコードが書けるようになりたい。

# 1. Even or Odd

パラメータの数字から偶数であれば、true。奇数であれば false を返す関数を作る。

### Time Complexity: O(1)

処理自体は一回

### Space Complexity: O(1)

```js
function even_or_odd(number) {
  // check parameter
  if (typeof number !== 'number') return;
  // if it can be devided by 2, return even
  if (number % 2 === 0) return 'Even';
  else return 'Odd';
}
```

### ベストプラクティス参考

Ternary Operator できれい。

```js
function even_or_odd(number) {
  return number % 2 ? 'Odd' : 'Even';
}
```

# 2. Isograms

パラメータに重複する文字があれば、false、全部ユニークであれば true を返す。

```js
// '' -> true
// 'dermatoglyphics' -> true
// 'aba' -> false
// 'moOse' -> false (ignore letter case)
```

## 2 - 1. Brute Force

### Time Complexity: O(N^2);

nested loop

### Space Complexity: O(1);

Check through each parameters and compare each letter with other letters using nested loop to check if the letter is the same

```js
// aba   : length 3
function isIsogram(str) {
  //check parameter
  if (str.length <= 1) return true;
  for (let i = 0; i < str.length; i++) {
    if (i === str.length - 1) {
      return true;
    } else {
      for (let j = i + 1; j < str.length; j++) {
        if (str[i].toLowerCase() === str[j].toLowerCase()) return false;
      }
    }
  }
  return true;
}
```

# 2 - 2. Hashmap

### Time Complexity: O(N)

1 loop

### Space Complexity: O(1)

Check through each parameters, and store it as key, if there is already value, return

```js
function isIsogram(str) {
  //create Hashmap
  let map = new Map();
  for (let i = 0; i < str.length; i++) {
    let s = str[i].toLowerCase();
    if (map.get(s) !== undefined) {
      return false;
    }
    map.set(s, s);
  }
  return true;
}
```

### ベストプラクティス参考

Set(キーなしの値の集合)
それぞれの値を Set に入れて、そのサイズがパラメータの数と同じであれば、重複がない！

```js
function isIsogram(str) {
  return new Set(str.toUpperCase()).size == str.length;
}
```
DNS/ドメインの学習メモ

自分用の学習メモです。

■ドメインとは？

・ドメインはIPアドレスと文字列の対応づけ
例：IPアドレス「102.32.42.234」より「yahoo.co.jp」の方がわかりやすい

・ドメイン＝URLではない
例：「https://qiita.com/・・・」のうちドメインは「qiita.com/」まで


■IPアドレスはインターネット上の住所

・インターネットとは全世界向けに公開されているネットワーク

・クローズドなネットワークをプライベートネットワークという

・ブラウザはhttpプロトコルを利用している。ポート番号は80番

・ネットワークはA~Eのクラス毎に分かれている。A>B>C>D>Eの順に台数の上限が大きい

・コマンド「ifconfig」で自分のPCのプライベートIPアドレスを調べられる（Mac限定）

・「ifconfig」を実行した際に表示される「lo」はループバックアドレスの略

・ループバックアドレスとは自分自身に返ってくるアドレス

・コンピュータでは自分自身へ通信することはよくある

・localhostとは自分自身のプライベートIPアドレス、つまり127.0.0.1


■ドメインとIPアドレスの関係

・「対応している」と聞いたら「何と何が対応しているのか？」、「何対何で対応しているのか？」を確認

・負荷分散のため、1つのドメインに対して複数のIPアドレスを対応させることもある
→ロードバランサーという。ポートフォリオ作成に組み込むと良い

・「http://www.kagoya.com/」というURLのうち「www」がホスト名（サブドメイン）、「kagoya.com」がドメイン名（独自ドメイン）

・ドメインは信頼性の証でもある

・中古ドメインの売買は遷移先のWebサイトが変わっていても気付けない点が問題


■DNSとは？

・Domain Name Systemの略

・ドメインからIPアドレスを探してくる仕組み

・IPアドレス「8.8.8.8」はGoogleのDNSサーバ

・DNSプロトコルを使ってドメインを探す

・IPアドレスは32ビット

■DNSと攻撃手法

・DNSキャッシュポイズニングとはサイトの乗っ取り
DNSキャッシュサーバに偽の情報を登録し、攻撃者が用意した偽のサーバにクライアントを誘導する攻撃手法
→DNSはUDPを用いているため、送信元IPアドレスの偽造が容易

・DNSリフレクション攻撃（DNS amp攻撃）はDoS攻撃（Denial of Service attack）の一種
攻撃者が送信元IPアドレスをクライアントのIPアドレスにすることで、レスポンスがクライアントに返ってしまう攻撃
R8125のネットワークドライバのDKMS無効化

## 現象
カーネルのバージョンを自動でアップデートしたらDKMSで自動的にネットワークドライバがインストールされるはずが接続できない状況であった。
## 構成
- Linux mint 20.2
- kernel version 5.4.0-97-generic
- マザーボード Asrock H470 steel legend
- NIC(マザーボードにオンボード) r8125 2.5G対応LAN


## 解決
DKMSをアンインストールして再起動すると問題なく認識した。
sudo dkms remove r8125/9.007.01 --all
## 経緯
DKMSのインストール記事を参考にしてカーネルの自動アップデートでも対応できるようにDKMSを導入した。
だが、kernel 5.4.0-97-generic
にアップデートするとネットワークにアクセスできない。手動でr8125のネットワークドライバーインストールしても駄目である。
どうやら標準でサポートされたのか、二重に呼び出されてしまい干渉しているような気がする。
以前利用していたrealtekの公式から引っ張ってきたr8125のドライバーで、バージョンは9.007.01である。
【postgres】オプティマイザで実行計画作成時に利用する統計情報を更新してみる

#目的
統計情報を更新しないと、データを大量追加した直後にEXPLAINで実行計画を見ると良いパフォーマンスをしているように見えたSQLが実は最悪なパフォーマンスをしているということがあると知った。

そこで本当に統計情報は手動で更新しないといけないのか気になったため、更新してみることにした。

#環境
PostgreSQL 14.1 (Ubuntu 14.1-1.pgdg18.04+1) on x86_64-pc-linux-gnu
# 前提
[この記事](https://qiita.com/yutoun/items/2033a62d62812da359ed)を参考にしてテーブルを作成、データの挿入を行う。

# 統計情報の更新
統計情報の更新は下記のようにして行う

```bash
ANALYZE <schema_name>.<table_name>
```

# 実際に統計情報の更新をしてみる
### 12020100件のデータに1件データを挿入してみる
```bash
# customerテーブルには12020100件あることがわかる
select count(*) from customer;
  count
----------
 12020100
(1 row)

# 一件追加
insert into customer values (100021, 'cent','dede', 100);
INSERT 0 1
```

### 実際のレコード数をSELECTで確認する
```bash
# 実際のレコード数は12020101に更新されている
select count(*) from customer;
  count
----------
 12020101
(1 row)
```
### EXPLAINで実行計画を見てみる
実行計画を見るとrows=12020100とINSERTされたレコードが反映されていない(統計情報が最新になっていない)のがわかる

```bash
explain analyze select * from customer;
                                                       QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
 Seq Scan on customer  (cost=0.00..859970.00 rows=12020100 width=38) (actual time=0.804..2393.096 rows=12020101 loops=1)
 Planning Time: 0.077 ms
 Execution Time: 2993.389 ms
(3 rows)
```
### 統計情報の更新
```bash
analyze customer;
ANALYZE
```

### もう一度実行計画を確認する
```bash
explain analyze select * from customer;
                                                       QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
 Seq Scan on customer  (cost=0.00..857629.00 rows=11786000 width=38) (actual time=0.017..2500.028 rows=12020101 loops=1)
 Planning Time: 1.893 ms
 Execution Time: 3106.495 ms
(3 rows)
```

# まとめ
オプティマイザで利用する統計情報は手動で更新しなければいけないことが確認できた。
ポートの状態について

nmapでポートスキャンするとopen, closed等の情報が返ってくる。これらの状態が何を意味するのかを調べた

## ポートの状態の一覧

- open
- closed
- filtered
- unfiltered
- open|filtered
- closed|filtered

### open

ポートにアクセス可能か？: yes
ポートがlistenされているか？: yes

### closed

ポートにアクセス可能か？: yes
ポートがlistenされているか？: no

### filtered

パケットフィルタによりポートまで到達できていない

### unfiltered 

nmapのプローブ？に応答するがポートが開いているか閉じているかが判別できない

### open|filtered や closed|filtered


どちらの状態かnmapが判別できない
開発文書部のお仕事 2022年2月版

## 2月やりたいこと

### 予定

- 開発ガイドの整頓
- オンボーディング基盤の整頓
- イベント
    - [DevRel Meetup in Tokyo #71 〜DevRelファーストステップ〜 - connpass](https://devrel.connpass.com/event/236298/)
    - [VS Code Meetup #18 - ドキュメント、ブログ、書籍執筆編 - connpass](https://vscode.connpass.com/event/236710/)
    - [第02回 Customer系エンジニア座談会 - connpass](https://customer-x-engineer.connpass.com/event/235967/)
    - デブサミ2022

https://event.shoeisha.jp/devsumi/20220217/timetable

- 部署を越えた社内勉強会
- 人事と採用協力


### 小さいこと
- 日次
    - times確認
    - twitter確認
    - はてブ定時確認
- 月次
    - ローカル開発環境セットアップ、起動確認
    - Wiki確認
    - 社内規定的な読みもの確認

## 1月の合格体験記(参考)
- [AWS認定試験 DevOps Engineer Professional (DOP) 合格記 〜学習期間2週間、模擬試験スコア56%でも合格できました〜 - Qiita](https://qiita.com/irongineer/items/8d113d5048b70929414c)
- [無償キャンペーンを使ってゼロ円で Oracle Cloud Infrastructure 2021 Architect Associate を取得した話 - Qiita](https://qiita.com/hitsumabushi845/items/2ecac49cd516e2248167)


## 1月やったこと

- 表彰
    - [子育てしながらGitHubに草を1年間生やし続けたら人生が豊かになった話 - Qiita](https://qiita.com/mizo_k/items/c2aba14e77f5fc6f7483)
- と、受賞
 
https://twitter.com/Qiita/status/1485810900359528449?s=20&t=LQEsQyMY5YOuSQUCh3vYdg


- 学習
    - 関連: [「日本語スタイルガイド 第3版」を読んでいるので、その技術要点と基礎 - Qiita](https://qiita.com/e99h2121/items/6ebbcd42f2ac713daeb3)
- 読書
    - [「LeanとDevOpsの科学 テクノロジーの戦略的活用が組織変革を加速する」を読んだので、その要点 - Qiita](https://qiita.com/e99h2121/items/c8a4b72a0ec699db24bd)
    - [「ライト、ついてますか」を読んだので、その要点 - Qiita](https://qiita.com/e99h2121/items/1d4c10000a9f81d664a2)
    - [「レガシーコード改善ガイド」を読んだので、その要点 - Qiita](https://qiita.com/e99h2121/items/506d20d02953d227a790)
    - [「わいたこら。――人生を超ポジティブに生きる僕の方法」新庄剛志 を読んで、自分の開発屋人生に活きると思ったヒントの要点](https://zenn.dev/e99h2121/articles/5a424b8d575be2)
    - [「逆転のメソッド 箱根駅伝もビジネスも一緒です」原晋 を読んで、ソフトウェア開発に活きると思ったヒントの要点](https://zenn.dev/e99h2121/articles/52c99b93cc841c)
- 情報収集
    - [色々な会社・エンジニアのまとめ of まとめ - Qiita](https://qiita.com/e99h2121/items/8773ef78613ab8214dfc)
    - [テック企業が情報を公開する理由 - Qiita](https://qiita.com/e99h2121/items/106243c307665641e421)
        - 関連: [No Brilliant Jerks - Netflixの「頭はいいけど嫌な奴、お断り」について調べた - Qiita](https://qiita.com/e99h2121/items/e0741f3dbf351942f3ca)
        - 関連: [リモートワークのいま学びたい、GitLab Handbook非同期コミュニケーションのススメ - Qiita](https://qiita.com/e99h2121/items/bd56ff759217fc8ec119)
    - [吉祥寺.pm28 をながら視聴したので、その感想 - Qiita](https://qiita.com/e99h2121/items/d794f5a006ea5853f912)
- タスク管理
    - [オンラインでプランニングポーカーができる、Plapoが楽しかったので紹介する - Qiita](https://qiita.com/e99h2121/items/2bc505415e1ccfd2ff95)
        - 関連: [アジャイル・スクラム、色々リファレンス - Qiita](https://qiita.com/e99h2121/items/1b7ac17c2e26d69d1f47)
    - [プロジェクトのタスク管理をどこでやるか、検討の記錄 22.01 - Qiita](https://qiita.com/e99h2121/items/25217220c8d2c80fa633)

## 以上

[開発文書部のお仕事 2022年1月版 - Qiita](https://qiita.com/e99h2121/items/b83423a07c975b349f3a#%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%BE%E3%81%A8%E3%82%81)

に続き 2月のお仕事掲示です。
どうぞ宜しくお願いいたします～
[初心者log]AtomicDesignについて

#本記事の目的
Reactを学んでいくにつれてAtomicDesignというデザインシステムがかなり有力だという情報を得たので、自分なりにまとめていきます。

##アトミックデザインとは
アトミックデザインとは、階層的にデザインを構築していくデザインシステムであり、
1.Atoms
2.Molecules
3.Organisms
4.Templates
5.Pages
といった階層に分けることができる。

###Atoms
- 画面表示された際の要素として最小単位
- 機能を絞った単一部品を定義する
- MUIならPickで使用できるPropsを絞る
- 例）Button, Icon, Text, Title …

###Molecules
- Atomsの組み合わせ
- 例）Card, Box, Form, Popup …

###Organisms
- 画面表示された際の機能としての単位
- Atoms, Moleculesを組み合わせる
- 例）Header, Calendar, Modal, CardList …

###templates
- ページのコンテナやサイドバーのwidthなど、中身のないデザイン
- Atoms,Molecules,Organismsを格納する
- 例）MainContents, MainContentsWithSideBar …

###pages
- ページそのもの
- 上記全てを用いて作成する。
- 例）UsersPage, HomePage …


##まとめ
こうした階層的にデザインを分けることで、後々のデザインの変更がかなり楽になるというメリットが大きいと考えられます。
個人的に、MoleculesとOrganismsをどのように分類していくかというのが大いに悩んだところです。
MoleculesなしでOrganismsのみで考えてもいいかなって感じです。
2022/2/1主にITとかセキュリティの記事

主要Linuxディストロに脆弱性「PwnKit」 - 実証コードも
https://www.security-next.com/133755

SMB向けのSonicWall製VPN製品、脆弱性未修正機器が多数稼働か
https://www.security-next.com/133750

日能研のウェブサーバに不正アクセス - SQLi攻撃でメルアド流出か
https://www.security-next.com/133759

「Apache Tomcat」にあらたな脆弱性 - 脆弱性の修正に起因
https://www.security-next.com/133771

脅威ランキング上位をランサムウエア関連が独占、IPA「セキュリティ10大脅威」の教え(1/31)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/06511/

日能研から中学受験生関連のメールアドレス28万件流出、SQLインジェクション攻撃で(1/31)
https://xtech.nikkei.com/atcl/nxt/news/18/12124/

サングラスをかけても虹彩認証は有効か(1/31)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/011800128/011900005/

無線LANの電波は壁越しにどこまで届くのか(1/31)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/011800128/011900004/

液体に浸した記憶媒体からデータを読み出せるか(1/31)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/011800128/011900003/

パスワード付きZIPファイルは解読できるか(1/31)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/011800128/011900002/

22年のインフラ技術　コンテナ運用に注目(1/31)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/012600108/

マスクを着けたままで顔認証が可能か(1/31)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/011800128/011900001/

NEWS pickup＆digest（2021/12/15～2022/1/11）(1/31)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800011/011800051/

DXの主流に、クラウドネーティブなデータ基盤設計とは何か(1/31)
https://xtech.nikkei.com/atcl/nxt/column/18/01924/012500001/

ユーザー主導で成長するメタバース、巨大IT企業でも統治できず
［メタバースへの期待と漂うリスク］KDDI 中馬和彦氏(1/31)
https://xtech.nikkei.com/atcl/nxt/column/18/00065/00541/

MLOps（Machine Learning Operations）(1/31)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/012600107/

政府の自治体システム標準化　DX推進でコストが膨らむ懸念(1/31)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/092400133/012700068/

サイバー犯罪摘発、過去最多　24.3％増で初の1万件超(1/28)
https://news.yahoo.co.jp/articles/e648a82f3335668aaa717152ebb5ec1c10e69698

タイ農業局のウェブサイト、ブランドコピー販売サイトにリダイレクト(1/29)
https://www.thaich.net/news/20220129ng.htm

パスワードで秘密のデータを保護できる「暗号化USBメモリ」を作成する方法(1/29)
https://gigazine.net/news/20220129-veracrypt-usb-memory/

続き① FlutterでAndroidとIOSアプリをリリース。Macなしでも出来た・・・(1/30)
https://note.com/papagaiojppt/n/n8d541065cfdf

KB5008353で復活するWindows 11のユーザー体験 - 阿久津良和のWindows Weekly Report(1/30)
https://news.infoseek.co.jp/article/mynavi_2361222/?tpgnr=it

「サポート詐欺」の手法を知るべき理由　モバプリの知っ得(1/30)
https://ryukyushimpo.jp/style/article/entry-1461944.html

放置してない？iPhoneに「このアカウントは危険」警告が出た時やるべきこと(1/28)
https://diamond.jp/articles/-/294603

Windows 10 / 11、月間アクティブデバイスが14億台突破(1/30)
https://www.zaikei.co.jp/article/20220130/658103.html

【ピクミン ブルーム】アップデート適用後、一部デバイスからアプリ起動が不可能に 原因調査中(1/28)
https://www.moguravr.com/pikmin-bloom-17/

仕事中に確認しがちな情報をまとめた画像が「めちゃくちゃ使える」と話題　「西暦・和暦変換」や「Excelの行と列」など(1/31)
https://www.google.com/amp/s/nlab.itmedia.co.jp/nl/amp/2201/31/news073.html
[laravel]php artisan migrate が通らないときの解決例

## エラー内容

```
$ php artisan migrate
Migrating: 2022_01_29_163203_create_projects_table

   Illuminate\Database\QueryException 

  SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'projects' already exists (SQL: create table `projects` (`id` bigint unsigned not null auto_increment primary key) default character set utf8mb4 collate 'utf8mb4_unicode_ci')

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:712
    708▕         // If an exception occurs when attempting to run a query, we'll format the error
    709▕         // message to include the bindings with SQL, which will make this exception a
    710▕         // lot more helpful to the developer instead of just the database's errors.
    711▕         catch (Exception $e) {
  ➜ 712▕             throw new QueryException(
    713▕                 $query, $this->prepareBindings($bindings), $e
    714▕             );
    715▕         }
    716▕     }

      +9 vendor frames 
  10  database/migrations/2022_01_29_163203_create_projects_table.php:32
      Illuminate\Support\Facades\Facade::__callStatic("create")

      +21 vendor frames 
  32  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
```

## まず結論（解決方法）
mysqlに既に他のlaravelプロジェクトでテーブル出来上がっているため、そのテーブルを消すことでmigrateが通るようになります。

## なぜ記事を書いたのか
久しぶりにdockerを使わないでlaravelの環境構築したところ、みたことのない種類のエラーに出会い躓きました。

そのためぱっと見どこにエラー文が書いてあるかわからず、解決まで時間がかかったので備忘録の意味も含めて記載しようと思いました。

## エラー文はどこにあるのか
筆者は最初は ` ➜ 712▕             throw new QueryException(` を見て、その文字で検索して結局解決できず、試行錯誤して偶然解決までたどり着きました。

解決後にエラーをよくよくみたところ `SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'projects' already exists ~` というエラー文があり、「既にテーブルが入っている」と言っていたことに気づきました。

結論ですが、エラー文は`SQLSTATE[42S01]:~`　の部分に書いてあります。

## まとめ
今回の記事でお伝えしたかったことは下記の2点です。

- エラー解決の具体例を探している場合：DBに他のプロジェクトのテーブルが入っていないか確認する

- エラー文が何を言っているかわからず困っている場合：`SQLSTATE[42S01]:~`の部分を読んでみる
サードパーティクッキーとは

## そもそもcookieとは

ブラウザがリクエスト送信時に自動的に付与するデータ
cookieはドメイン単位で管理されていて、他のドメインのcookieを参照することはできない

## サードパーティクッキーとは

iframeで表示されている別のドメインのコンテンツが発行、利用する別ドメインのcookie

アフィリエイト等のiframeがサイト横断でcookieをやり取りするのに使われている

## セキュリティ上のリスク

特になし

プライバシー面での問題はよく指摘されており、将来的にブラウザ側がサードパーティクッキーをブロックするようになる可能性がある
Strict Transport Security ヘッダーについて

## Strict Transport Securityヘッダーとは

サーバ側がレスポンスに指定するヘッダー
このヘッダはブラウザ側にhttps通信を行うように指示する意味合いがある。

## ディレクティブ

max-age: 有効期間。0を指定するとSTSを解除できる
includeSubDomains: サブドメインも含むか？省略可能
preload: 先読みに使用される。ブラウザごとの独自規格

## 使う場面

httpsでアクセスしてほしい場合

## 参考

https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Strict-Transport-Security
PixiJS でサロゲートペアの文字の改行による文字化けを解消する

## 前置き
フォームに入力された文字列を pixi.js で描画するものを作っているときに遭遇した事象です。
ちなみに僕自身、 pixi.js は reference 見ながらなんとなく実装できるくらいです。

## 何が起きた?

```ts
const style = {
  fill: "#fff",
  fontSize: 40,
  wordWrap: true,
  breakWords: true,
  wordWrapWidth: 100,
};
const message = new PIXI.Text("🤗🤗🤗🤗🤗", style);
container.addChild(message);
// output: 
// 🤗🤗�
// �🤗🤗
```

サロゲートペアの部分で分断されて出力されてしまいました。

## 対処
1. サロゲートペアの判定をする
1. TextMetrics を取得する
1. 文字列の長さを比較する (元の文字列・改行を考慮した文字列)
1. 長さが合わなかったら wordWrapWidth を調整する

```ts
// サロゲートペア判定
function stringToArray(str: string) {
  return str.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF]/g) || [];
}

const text = "🤗🤗🤗🤗🤗";
const style = {
  fill: "#fff",
  fontSize: 40,
  wordWrap: true,
  breakWords: true,
  wordWrapWidth: 100,
};

// TextMetrics 取得
const textMetrics = PIXI.TextMetrics.measureText(text, style);

// 文字列の長さ
const beforeTextLength = stringToArray(text).length;

// 行ごとの文字列の長さを足した数
let afterTextLength = textMetrics.lines.reduce((pv, v) => pv + stringToArray(v).length, 0);

// output: 5 6
console.log(beforeTextLength, afterTextLength);

// 文字サイズ分横幅を増やして試す
let retry = style.fontSize;
let wordWrapWidth = style.wordWrapWidth;
// retry上限回数 または 文字列の長さが同じ になるまで試す
while (retry > 0 && beforeTextLength !== afterTextLength) {
  retry -= 1;
  wordWrapWidth += 1;
  afterTextLength = PIXI.TextMetrics
    .measureText(text, { ...style, wordWrapWidth })
    .lines.reduce((pv, v) => pv + stringToArray(v).length, 0);
}

const message = new PIXI.Text(text, { ...style, wordWrapWidth });
container.addChild(message);
// output: 
// 🤗🤗🤗
// 🤗🤗
```

最初にこの事象に遭遇したときは、もっと複雑なことしないといけないのかなーと思ったんですが、意外となんとかなりました。
git コマンドラインオプション ヒント(noは付け外しできる、長いオプションは一意であるかぎり省略できる

- 短いオプション(ハイフン1つ(`-`)に続く)
- 長いオプション(ハイフン2つ(`--`)に続く)
 
# 短いオプションはおまとめできる(割と普通)

`-a -b` は `-ab` とできる。

できるけど、おまとめしないのを推奨。

# 長いオプションは、おまとめはできない(割と普通)

# 長いオプションは 前に no- が付けられる

`--hogehoge` とあったとき `--no-hogehoge` とできる。

マニュアルページに結構書いてあるけども、書いてないのでもぢつは指定できる。意味のある動作になるかどうかは実装依存である。

例えば `git add --patch --no-patch` とすると、--patchの機能を取り消す。

`git add -p --no-patch` はOKである。

`git add -p -no-p` はNG(短いオプションには no- 形式は無いのである)

no- とあるものは no- を外す事ができる。意味のある動作になるかどうかは実装依存である。

ブール値の長いオプションは、「no-」を前に付けることで「否定」(または「未設定」(unset))にできます。

また、ブール値以外の長いオプションは、no- を前に付けることで設定を解除(unset)できます(たとえば、文字列をNULLに設定し、整数を0に設定します)。




# 長いオプションは省略形を許す事

一意であるかぎり短くできる。例えば `--option` を `--opt` とかできる。

その場で使うにはこれでよいが、シェルスクリプト等で使う場合は、将来gitで一意にならないような似た名前のオプションが実装される可能性が常にあるのにそういうことは禁止である。まじめにちゃんと書け。

当該コマンドのソース(C言語)に PARSE_OPT_KEEP_UNKNOWN が指定してあるとできない。


# 注意
通常は parse-option API を使うのでこの通りなのだけども、フルカスタムとか parse-option API を使わないとかも可能なので、最終的にはコマンドごとの実装依存である。

# 詳しくは
## 解説

https://kuma35.github.io/git-docs-ja/docs-ja-4/htmldocs/gitcli.html

## 実装

https://kuma35.github.io/git-docs-ja/docs-ja-4/htmldocs/technical/api-parse-options.html

※Examplesの test-parse-options.c は t/helper/ フォルダ内にあります。
Conditional Types / infer 


<h2>Conditional Types</h2>
型の三項演算子

```typescript
type ConditionalTypes_1 = 'tomato' extends string ? number : boolean;
//現在の型
type ConditionalTypes_1 = number;

type ConditionalTypes_2 = string extends 'tomato' ? number : boolean;
//現在の型
type ConditionalTypes_2 = boolean;
```

ここまではわかる

LookUp 型と Mapped Types と合わせて使ってみる

```typescript
type props = {
  id: string;
  name: string;
  age: number;
};

type Filter<T, U> = {
  [K in keyof T]: T[K] extends U ? K : never;
}[keyof T];

type StringKeys = Filter<props, string>;
//"id" | "name"
type NumberKeys = Filter<props, number>;
//"age"
type BooleanKeys = Filter<props, boolean>;
//never
```

こうなるとわからない

部分部分で考えるしかないと思うのでまずは

```typescript
[K in keyof T]

```

これは type の key
つまり

```typescript
id;
name;
age;
```

が入るわけです

次にここ

```typescript
T[K];
```

LookUp 型であり

```typescript
string;
string;
number;
```

が入るわけです

つまりここまでの状態だと

```typescript
id: string;
name: string;
age: number;
```

こうなります。props の型と全く同じですね

この LookUp 型が三項演算子になっていて、

```typescript
T[K] extends string ? string : never;
//簡単のためUをstringにしています
```

つまり T[K]が string ならそのバリューの型を返し、それ以外なら never を返しています

```typescript
type FilterTypes<T> = {
  [K in keyof T]: T[K] extends string ? K : never;
};

type stringType = FilterTypes<props>;

//現在の型
id: 'id';
name: 'name';
age: never;
```

それでこのあとさらに LookUpTypes をしています
LookUpTtypes とはオブジェクトのバリューをとることができます
T[K]です

こいつを下に当てはめると

```typescript
type Filter<T, U> = {
  [K in keyof T]: T[K] extends U ? K : never;　<<<<<<< T
}[keyof T];                                    <<<<<<< [K]

```

になり

バリューの型を取るとこのような結果になるわけです

```typescript
type props = {
  id: string;
  name: string;
  age: number;
};

type Filter<T, U> = {
  [K in keyof T]: T[K] extends U ? K : never;
}[keyof T];

type StringKeys = Filter<props, string>;
//"id" | "name"
type NumberKeys = Filter<props, number>;
//"age"
type BooleanKeys = Filter<props, boolean>;
//never
```

わかりにく、、、！！！

<h2>infer </h2>
部分的な型注釈

わからんので書いてみる

```typescript
type Return<T> = T extends () => infer U ? U : never;
type Foo = Return<() => string>;

//Fooの型
string;
```

戻り値の型を抜き出すことに成功

もう少し具体的な例を見る

```typescript
const foo = () => {
  return 0;
};

type Return<T> = T extends () => infer U ? U : never;
type Foo = Return<typeof foo>;

//Fooの型
number;
```

ここがわかれば理解できそう

```typescript
 T extends () => infer U ?
```

の意味は T が「引数なしで戻り値のある関数であるか」という意味で、あればその戻り値の型になるという意味です

例を何個か見れば理解も深まると思うので
つぎは引数 ver を見ていこう

```typescript
const foo = (id: number) => {
  return 0;
};

type Return<T> = T extends (id: infer U) => number ? U : never;
type Foo = Return<typeof foo>;

//Fooの型
number;
```

今回もポイントはここ

```typescript
T extends (id:infer U) => number ?
```

T が「id という引数を持っていて、number 型の戻り値を返す」かどうか
であり「正であれば id の型を Foo に代入」

という意味になります

上に比べたら、まだわかる

ちなにみこれらのつかいどきがわからない
injectメソッド

rubyシルバーを勉強していくなかで、injectメソッドについてわかったなかったので、解説していこうとおもいます。

##injectメソッドとは
injectメソッドとは、たたみこみ演算を行うメソッドです。
詳細は、[公式ドキュメント](https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/inject.html)を参照してください。
言葉で説明するのは、むずかしいのですが、具体例で見てみると分かるとおもいます。

```
#合計を求める
1から6までをそれぞれ足していく。
p [1, 2, 3, 4, 5, 6].inject {|int, num| int + num }
=>21


#1から6までをそれぞれ掛けていく
p [1, 2, 3, 4, 5, 6].inject {|int, num| int * num }
=>720
```

また、初期値を入れることもできます。先ほどのコードでいえば、

```
p [2, 3, 4, 5].inject(0){|result, item| result + item } 
=> 14

p [2, 3, 4, 5].inject(10){|result, item| result + item } 
=> 24
```

##もうちょい分かりやすく書きたい
```
p [1, 2, 3, 4, 5, 6].inject(:+)
p [1, 2, 3, 4, 5, 6].inject(:*)
```
上の書き方で、書いても同じような結果がでてきます。
シンボルで書くとスッキリしますね！


##実際に問題を解いてみましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485775/aaf2aaa2-7fee-26f2-c24b-823d22214459.png)

###選択肢➀
この選択肢は、今回の記事を読んでいけば分かるとおもいます。
aとbの変数に格納されている配列の要素を、順次足していってるんです。
そうすると、この選択肢は、30以上にはならないので、この選択肢は不正解です。

###選択肢➁
「|」は集合の和演算を表しています。+までの左辺は、[-1, 2, 3, 4, 5, 6]に対して、順次「-」が適用されていき、それに絶対値を当てます。
「&」は共通した値を取得します。+以降は、[4, 5]に順次「+」が適用されていきます

この計算結果は、30になるのでこの選択肢が正解になります。

###選択肢➂
ここまで読んだ方でしたら、特別解説はいらないとおもいます。**3は3乗の意味ですね。この選択肢は不正解です。

###選択肢➃
||と&&の使い方は、以下の記事を参考にしてみてください。

https://pikawaka.com/ruby/logical-operators

succメソッドは、次の整数をとるメソッドです。
たとえば、

```
1.succ
=> 2
```
こういうふうに、次の整数をとれるメソッドです。

この選択肢では、29となるので、この選択肢は不正解です。

以上です。
何か間違いがございましたら、ご教示いただけますと幸いです。

【参考文献】

https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/inject.html

https://pikawaka.com/ruby/logical-operators
【git・GitHub 再入門】

git・githubに対する理解があまかったのであらためて再入門したら、理解していないところがわかってきたので改めて説明する。

##[ HEAD ]
現在使用しているブランチの先頭のこと。
コミットを指定するときに~(チルダ)をHEADの後ろにつけることでHEADからの相対位置を表せる。HEAD~1（HEADの一個手前）
^（キャレット）を使うと親が複数あったときにどの親かを選択できる。

##[ margeの種類 ]
**fast-forward(早送り)マージ**
masterから分岐したdevelopブランチに変更を加えて、masterには変化がない状態でマージをしたとき、masterはdevelopのブランチに移動するだけで完了する。
**両方に変更があった場合のマージ**
新しく両方の変更が取り込まれたコミットが作られ、masterブランチの先頭はこちらに移動する。

**☆ non fast-forwardマージを指定するとfast-forwardマージができる場合でも、新しくコミットを作ってマージできる。これによってブランチごとの変更の特定が容易になる。**

##[ rebase ]

分岐元のコミット履歴が最新の同一内容の新しいコミットが作成される。つまりコミット履歴が一直線になり、あとはfast-forwardマージを実行すれば変更は統合される。
rebaseを使用する場合、rebase後はcontinueでfast forward margeができる。

→ 同じブランチから切られた複数ブランチが同時並行で修正されている場合などに便利。

##[ pull ]
動作としてはmargeと同じだが、fast-forwardではない場合自動でマージコミットが作られる。
fetch+margeなので、pullしたときに新しくマージコミットが作られてしまう。
できるだけ、**fetch + rebase** で行ったほうがコミット履歴がきれいになる。

https://qiita.com/daijinload/items/00993075e0049c8131de#git%E3%81%A7%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E5%B7%AE%E5%88%86%E3%82%92%E5%8F%96%E3%81%A3%E3%81%A6%E3%81%8F%E3%82%8B

##[ tag ]
**軽量タグ**
ローカルで一時的に使用する使い捨て用だったりする。
**注釈付きタグ**
コメントや署名を追加できたりとできることが多く、リリースタグで使われる。

##[ コミット操作 ]
amend　直前のコミットを修正（以下のような操作ができる）
　・コミットメッセージの修正
　・コミット内容を後から追加
revert　過去のコミットを打ち消すコミットの作成
reset　コミットの状態を戻す
　・soft　コミットだけを戻す
　・mixed　インデックス内のコミットごと戻す
　・hard　ワークツリーでの変更までなかったことにする。
cherry-pick　別ブランチのコミットを抜き取る
rebase -i　コミットの整理（統合）・書き換え・入れ替え・削除ができる
squash　マージする際にコミットをすべてまとめてからマージする

##git・githubの運用の仕方に関すること

https://atmarkit.itmedia.co.jp/ait/articles/1708/01/news015.html

###【**git flow】**
・メインブランチ
**master**と**develop**の２つのブランチがある。
・サポートブランチ
タスクごとに「**feature**」「**release**」「**hotfixes**」のいずれかのブランチを作成し、作業を行う。

**feature （master、develop、release-*、hotfix-*以外）**
developから分岐したブランチ。developにマージされる。
機能開発やバグ修正などの作業に利用する。

**release（release-*）**
developから分岐したブランチ。masterとdevelopにマージされる。
リリース準備作業を行う

**hotfixes（hotfix-*）**
masterから分岐したブランチ。masterとdevelopにマージされる。
リリース後に緊急の修正作業が発生した場合は、masterブランチからホットフィックスブランチを作成し、修正作業を行う。

☆　git flowというツールをinstallすることで、git flowに沿ったブランチ構成で開発ができる。

git flow ~というコマンドを使えばより効率的な開発が可能。

###【**GitHub Frow】**

git frowに比べるとシンプルだが以下のルールが有る。一日に複数回デプロイするようなシステムで有効。

１，masterブランチは常にデプロイ可能である
２，作業用ブランチをmasterから作成する
３，作業用ブランチを定期的にプッシュする
４，プルリクエストを活用する
５，プルリクエストが承認されたらmasterへマージする
６，masterへのマージが完了したら直ちにデプロイを行う
[JS]HTML要素の取得や書き換えをする

HTML要素の取得や書き換えをすることで、イベント発火させると表示されている文字を変更することができるようになります。
#innerHTMLプロパティ
JavaScriptにて、HTML要素の取得や書き換えを行うことができるプロパティ。

例

```html:HTML
<div class="contents" id="hoge">HTML</div>
```

```javascript:javascript
const hoge = document.getElementById("hoge")

//HTML要素の取得
console.log(hoge.innerHTML)  // => HTML

//HTML要素の書き換え
hoge.innerHTML = "javascript"
console.log(hoge.innerHTML)  // => javascript
```

以上。
補足等ありましたらコメント頂けると幸いです。
【solidity】virtualとoverrideの使い方

##まずはコードを見てみる
百聞は一見に如かずということで、まずはopenzeppelinの`ERC721.sol`のコードを見てみましょう。
下は、balanseOf(略)という関数です。※途中省略してるので元のリンクを貼っておきます
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol

    pragma solidity ^0.8.0;

    //途中はところどころ省略してます
    import "./IERC721.sol";
    import "./IERC721Receiver.sol";
    import "./extensions/IERC721Metadata.sol";

    contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {

        mapping(address => uint256) private _balances;

        function balanceOf(address owner) public view virtual override returns (uint256) {
            require(owner != address(0), "ERC721: balance query for the zero address");
            return _balances[owner];
        }
    }

ご覧の通り、本題である`virtual`と`override`が入っています。
では、それぞれの意味と使い方を解説します。

##virtualとoverrideの意味と使い方
**virtual**："この関数は上書きしていいですよー"という意味
**override**："この関数は上書きした後の関数ですよー"という意味

使い方を確認するために実際にコードを書いてみます。
まずはERC721.solを継承したコードを適当に書いてください。継承後のファイルで、先ほどの関数`balanceOf()`を作成することで上書き=overrideします。
virtualとoverrideは消して作成します。関数の中身は適当に変えてもらってOKです。

    function balanceOf(address owner) public view returns (uint256) {
        require(owner != msg.sender);
        uint256 a =2;
        return a;
    }

すると、overrideが無いので、以下のようにエラーになります。
（「override忘れてない？」と言われます）
![vo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2236744/869261ec-4528-fff5-6359-02e27deace10.png)

overrideを追加します。

    function balanceOf(address owner) public view override　returns (uint256) {
        require(owner != msg.sender);
        uint256 a =2;
        return a;
    }

するとエラーが解消されます。このように関数が上書き後のものだと明示するのがoverrideです。
そして詳細は省きますが、継承元のERC721.solの`virtual`を削除するとこれまたエラーが発生します。（virtual忘れてない？と言われる）
気になる方は実際に試してみて下さい。

##おわりに
以上、備忘録を兼ねたメモです。もし間違い等見つけた場合はコメント等でご指摘お願いします。
M1 Macでde novoアセンブリを可能にしよう　〜インストール編〜

# M1 Macでde novoアセンブリがうまくいかない？
ついにMacにプロセッサーが搭載されました！
速い速いと巷で話題らしいので、早速研究活動に使ってみようと試みました。
ゲノムファイルのde novoアセンブリに使おうとしたのですが・・・
「Biopythonツール（spadesなど）がうまくcondaでインストールできない??」
「なんかspadesがうまく動かない・・・」
なんて事が起こったのです。

本記事では、その試行錯誤した後の解決策（応急処置的なものが多いですが）を紹介します。
今回はcondaによるインストールに関して説明します。
ご参考になれば幸いです。

# 目次
- Rossetaをインストールしよう
- Mac用conda（miniconda3）を導入しよう
- Biopythonツールをインストールしよう

## Rossetaをインストールしよう
condaでインストールするspadesは、intelプロセッサで動きます。
そのため、M1 Macでは本プログラムは動かせません。
そこで、Rossetaを使いましょう！
RossetaはM1チップ搭載Macでもintelプロセッサ搭載Mac用のアプリケーションを動かせる（変換できる）ようにするものです。まずはRossetaをインストールしましょう。
### Rossetaインストール
Rossetaのインストールは、intelプロセッサ用プログラムを実行しようとするとできます。
まずは、intel用アプリをインストールします。私は、アセンブリ評価プログラム[**bandage**](https://rrwick.github.io/Bandage/)を用いました。Intel用アプリをインストール後、アプリケーション上のアイコンをクリックすると、以下の表示が出ます。
<img width="400" alt="install.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519906/995db8e2-48dc-11cd-ed6e-0942f41da0e3.png">
ここで「インストール」をクリック
これで導入完了しました。
### ターミナルをRossetaで開けるようにする
「Finder」→「アプリケーション」→「ユーティリティ」→「ターミナルを右クリック」→「情報を見る」→「『Rossetaを使用して開く』にチェック」 
下の画像の様にすればOK
<img width="200" alt="Rosseta_on.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519906/e9b8bdda-97b0-727d-90de-2cbf0652890c.png">

## Mac用conda（miniconda3）を導入しよう
[公式サイト](https://docs.conda.io/en/latest/miniconda.html)で<font color="Red">**Miniconda3 macOS Intel x84 64-bit bash**</font>をダウンロードし、ターミナル上の`zsh`でminicondaをインストールします。

### なんでM1 Mac用のファイルじゃないの？
M1 Mac用のminiconda（以下M1minicondaとします）ではspadesなどがconda installできないためです。
conda installでは、condaが使用されたplatform内のプログラムが検索されます。M1ならosx-arm64、macならosx-64のplatfromです。
**しかし、spadesはosx-arm64には登録されていないのです**。パッケージ情報は[Anaconda.org](https://anaconda.org/)から確認できますが、spadesの検索結果をみると、osx-arm64にspadesがないことがわかります。
<img width="600" alt="package.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519906/4535a620-02fc-c4c0-8400-5e840c1e80f1.png">
そのため、Mac用のminiconda3が適切なのです。

### M1 Macに通常Mac用のminiconda3が使えるの？
ここで、Rossetaが活きてきます。
Mac用minicondaはIntel向けプログラムです。
Rossetaでターミナルを使用すれば、利用できます。

## Biopythonツールをインストールしよう
### spadesをインストールしてみよう
de novoアセンブリでは`spades`、ゲノムデータの編集・確認に`fastp`や`seqkit`がよく使われます。
実際にインストールしてきます。
まず、`conda create`で環境構築し、`conda activate`で環境に移動します。
そして、`conda install`でインストールします。`spades`・`fastp`・`seqkit`はチャネル「bioconda」に入ってます。インストールの流れは以下の通りになります。

```
#環境構築
conda create -n myenv
#環境に移動
conda activate myenv
#チャネル追加
conda config --add channels bioconda
#インストール
conda install spades fastp seqkit
```

### roary・prokkaをインストールしてみよう
de novoアセンブリ後に使うプログラムとして、アノテーションツールprokka、パンゲノム解析ツールroaryがあります。
なぜか、`conda install`ではインストールできないのです。
ただ、成功した例はあるので紹介します。
```
conda create --no-channel-priority -c conda-forge -c bioconda/label/cf201901 -n myenv prokka
```
`conda create`と同時にインストールする方法です。これによってprokkaとroary（上記コマンドのprokkaをroaryに変えれば）を導入できます。どのようなメカニズムであるのかはまだわかっていないので、判明次第更新します。

# 終わりに
既存のプログラムにはM1 Macと互換性を持たないものがあるはずです。
特にバイオインフォマティクス分野のものに顕著に見られる感じがします。

今後も対処策を紹介していきます。同じ悩みに直面した方々の力になれれば幸いです。
staticの使い方

staticの使い方について今日初めて知ったので忘備録としてまとめます。

#staticとは？
静的メンバーを作成する際に使用する。
staticをしようすることでインスタンス生成のたびにメモリ領域が確保されるのではなく、アプリでただ１つのメモリ領域が確保される。
変数とメソッド両方に使用可能。

####静的メンバー
変数やメソッドをインスタンス単位で生成するのではなく、アプリに一つだけ生成したい場合に使用する。

#使い方
クラスのインスタンスを生成するのではなく、クラス名にドットを付けて直接呼び出せる。



参考記事
[C#初心者のための基礎！staticスタティックの意味と使い方を解説#25](https://anderson02.com/cs/cskiso/cskisoniwari-25/ "C#初心者のための基礎！staticスタティックの意味と使い方を解説#25")
.ssh/configまでのパスを変えたかった

# やりたいこと・問題点

仕事用の.ssh/configで `*` を多用したことで、プライベートなホストを除外する記述が大変でやりたくない。
sshが参照する.ssh/configを用途別に分けられたらよさそう。

具体的にはHOME変数見て.ssh/configの読むパスが変わらないかなーみたいな。

結果、HOME変数で.ssh/configのパスを変えることはできなかったものの、満足する動作に至ったためここに公開。

(Mac+iTerm環境)

# 実現策：　`HOME`　変数の書き換え＋configの `Include`

単純に `HOME` 変数を書き換えてもsshコマンド使用時に参照するconfigまでのパスはユーザホームディレクトリ直下の.ssh/config固定。そういうもののようです。

ところが、.ssh/configで `Include` 文では `~` が `HOME` 変数で展開される。

以下のようなディレクトリ構成/`.ssh/config`の場合、`HOME` 変数の内容をもとにssh実行時に参照するconfigを切り替えることが可能。

```
/Users/taro/
├──.ssh
│   ├──config
│   └──conf.d
│       └──common.conf (例えばプライベートときだけ参照したいconfig)
└──work
    └──.ssh
        └──conf.d
            └──common.conf (例えば仕事のときだけ参照したいconfig)
```

```ssh:/Users/taro/.ssh/config
Include ~/.ssh/conf.d/common.conf
```

上記構成とすると、　`~` を展開したときに読み込まれるファイルが変わるため、sshの動作を切り替えることができるようになる。

* `HOME` 変数を書き換えていない場合 (デフォルト時)
    * ssh実行時に `/Users/taro/.ssh/config` から  
    `/Users/taro/.ssh/conf.d/common.conf　(プライベート用)` が読まれる
* `HOME` 変数を書き換えた場合 (`export HOME=/Users/$USER/work`)
    * ssh実行時に `/Users/taro/.ssh/config` から  
    `/Users/taro/work/.ssh/conf.d/common.conf　(仕事用)` が読まれる

※HOME変数を書き換えたときにどっかでエラー出るんじゃないかと不安 (そもそもsshが期待どおり動作していないわけで、似たようなことがありそう)

## iTermのプロファイルを使ったおまけ

iTermの設定で以下をそれぞれ用途別に設定するとプロファイルの切り替えで

* Profile→General→Command→Login ShellをCommandに変更して以下を入れる
    * `/usr/bin/env HOME=/Users/taro/work /bin/bash --login`
* Profile→General→Command→Working Directoryに以下を入れる
    * `/Users/taro/work`

# 試行錯誤してたやつ

## やってみて単純にダメだった `HOME` 変数の書き換え

だめだった

## やりたいことはできてるけど不都合も多い sshコマンドの `alias`

ターミナルアプリを判別して以下を叩くようにしておいた。動くといえば、動く。あんまり困らない人は、困らない。

`alias ssh='ssh -F ~/.ssh/config2'`

# 最後に

探したとき見つけられなかった内容をまとめてみましたが、もっとよくまとまっているページがあれば教えてください。
また、この方法の方が楽という話があれば教えてください。
【Windows】postgreSQL起動停止方法

#目的
Windows環境のpostgreSQLで起動停止を実行

OS：Windows10
PostgreSQL：13.3

# postgreSQLの起動停止
停止・起動・再起動コマンドは以下

停止
`C:\Users\shun>pg_ctl -D "G:\Program\PostgreSQL\13\data" stop`

起動
`C:\Users\shun>pg_ctl -D "G:\Program\PostgreSQL\13\data" start`

再起動
`C:\Users\shun>pg_ctl -D "G:\Program\PostgreSQL\13\data" restart`

一般ユーザで実行したところ以下エラー

```
pg_ctl: 停止シグナルを送信できませんでした。(PID: 5384): Operation not permitted
```

以下サイトを参考に管理者権限で実行

https://www.javadrive.jp/command/ini/index12.html


```
C:\WINDOWS\system32>pg_ctl -D "G:\Program\PostgreSQL\13\data" stop
サーバ停止処理の完了を待っています....完了
サーバは停止しました

C:\WINDOWS\system32>pg_ctl -D "G:\Program\PostgreSQL\13\data" start
サーバの起動完了を待っています....2022-01-31 23:29:44.965 JST [4360] LOG:  redirecting log output to logging collector process
2022-01-31 23:29:44.965 JST [4360] HINT:  Future log output will appear in directory "log".
完了
サーバ起動完了
```

停止・起動できました。
pnpmが`SKIP_PREFLIGHT_CHECK=true`を求めてくる場合の対処法

⚠️この情報は本記事の投稿時点で有効であったものです。各自エラーメッセージやissueを確認してください。⚠️

## エラーメッセージの例

```
❯ pnpm build

> (プロジェクト名)@0.1.0 build /home/matoruru/Code/(省略)
> craco build


There might be a problem with the project dependency tree.
It is likely not a bug in Create React App, but something you need to fix locally.

The react-scripts package provided by Create React App requires a dependency:

  "webpack": "4.44.2"

Don't try to install it manually: your package manager does it automatically.
However, a different version of webpack was detected higher up in the tree:

  /home/matoruru/Code/(省略)/node_modules/.pnpm/node_modules/webpack (version: 4.46.0) 

Manually installing incompatible versions is known to cause hard-to-debug issues.

If you would prefer to ignore this check, add SKIP_PREFLIGHT_CHECK=true to an .env file in your project.
That will permanently disable this message but you might encounter other issues.

To fix the dependency tree, try following the steps below in the exact order:

  1. Delete package-lock.json (not package.json!) and/or yarn.lock in your project folder.
  2. Delete node_modules in your project folder.
  3. Remove "webpack" from dependencies and/or devDependencies in the package.json file in your project folder.
  4. Run npm install or yarn, depending on the package manager you use.

In most cases, this should be enough to fix the problem.
If this has not helped, there are a few other things you can try:

  5. If you used npm, install yarn (http://yarnpkg.com/) and repeat the above steps with it instead.
     This may help because npm has known issues with package hoisting which may get resolved in future versions.

  6. Check if /home/matoruru/Code/(省略)/node_modules/.pnpm/node_modules/webpack is outside your project directory.
     For example, you might have accidentally installed something in your home folder.

  7. Try running npm ls webpack in your project folder.
     This will tell you which other package (apart from the expected react-scripts) installed webpack.

If nothing else helps, add SKIP_PREFLIGHT_CHECK=true to an .env file in your project.
That would permanently disable this preflight check in case you want to proceed anyway.

P.S. We know this message is long but please read the steps above :-) We hope you find them helpful!

 ELIFECYCLE  Command failed with exit code 1.
```

エラーメッセージが指示してくれている手順を踏んでも解決には至らず・・・。

## 解決策

`package.json`内に以下の記述を追加します。

```json
  "pnpm": {
    "overrides": {
      "webpack": "4.44.2"
    }
  },
```

## 参考にしたissue

- [react-scripts does not get the exact webpack version #4076](https://github.com/pnpm/pnpm/issues/4076)

私のpnpmプロジェクトでも`@react/storybook`を使っていたので、同じく[この部分](https://github.com/storybookjs/storybook/blob/320d2d131cb35f8bb7c09296540e8357b0e43812/package.json#L287)が問題になっていたようです。

# 筆者について

フォローしていただけると励みになります！

Twitter: https://twitter.com/_matoruru
GitHub: https://github.com/matoruru
Facebook で広告を出稿する

Facebook広告マネージャーが割と使い勝手が悪かったので、メモとして残しておきます。サイト自体が頻繁に更新されるので、デザインや設定の違いは適宜調べて下さい。



# Facebook 広告マネージャーの構造

Facebook広告マネージャーはFacebookとInstagramに出稿する広告をまとめて管理できるアプリケーションです。

* キャンペーン・・・コンバージョンやアプリのインストールなどの目的を設定する項目
* 広告セット・・・・オーディエンス(広告の対象者)や予算の決定を行う項目
* 広告・・・・・・・クリエイティブ（実際に表示される動画や画像）や説明文の設定をする項目

という３レイヤーの構造になっています。



# キャンペーンの作成

Facebook広告マネージャを開きます。その際、広告アカウントが個人ではなく、ビジネスアカウントであることを確認してください。

https://business.facebook.com

Facebook広告マネージャーの使い方は[前回の記事](https://qiita.com/1mono2/items/27334a0362aaa8149168)をご覧ください。



**作成＞キャンペーンの目的を選択＞アプリ広告**を選択します。この時、アプリ自動広告を選択すると、後にABテストが出来なくなりますので、注意してください。(1敗)

![スクリーンショット 2022-01-31 115544.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679785/a51ff68b-540e-f5bd-7503-74703035529f.png)

# 広告セットの作成

1. 広告セット名
    * 広告セットの名前を指定します。あとで判別しやすい名前が良いでしょう。
1. アプリ
    * iTunes(AppleStore)やGoogle Play Storeが選択できます。Meta for Developersにアプリを登録していれば、サジェストに出てきます
1. ダイナミッククリエイティブ
    * クリエイティブを複数登録した時に、オーディエンス(広告の対象者)によって広告を自動で使い分けます。縦と横のどちらものクリエイティブを用意しておくと、それに対応した広告を表示してくれるので、ONにしておきましょう。
1. 予算と掲載期間
    * 予算を策定します。一日の予算か通算の予算か選ぶことが出来ます。また、広告配信の開始日と終了日の設定も出来ます。その他オプションでは、広告の時間帯スケジュールを設定できます。
1. オーディエンス
    * オーディエンスとは、広告の配信対象者のことです。地域、年齢、性別、言語を設定できます。オーディエンスの保存をして、後に使いまわすことも出来ます。詳細ターゲット設定の拡大はFacebookが自動的にターゲットの再設定を行ってくれる機能です。ターゲッティングの精度が近年向上しているらしいので、ONがいいと思います。
1. 配置
    * 自動配置と手動配置が選択できます。手動配置では、FacebookやInstagramのリールなど、どんな媒体に広告を出稿するか詳細に決めることが出来ます。しかし、これもFacebookで最適化されるので、よっぽどのことがない限り自動配置でよいと思います。 
1. 最適化と配信

![business.facebook.com1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679785/a9fb4d58-f3c7-65c3-dca2-cdb14eb051e0.png)



# 広告の作成

1. 広告名
    * 広告の名前を入力します。あとで判別しやすい名前が良いでしょう。
1. 広告に表示する名前
    * Facebookの場合、登録しているFacebookアカウントを、Instagramの場合、登録しているInstagramアカウントを選択することが出来ます。そして、この広告はそのアカウントを用いて行われます。
1. 広告設定
    + **広告を作成or既存の広告を使用orクリエイティブハブのモックアップを使用**を選択することが出来ます。お好みで選んでください。
1. クリエイティブ
    * クリエイティブとは、実際に広告に使われる動画や画像、説明文のことを言います。動画や画像を作成してアップロードしましょう。
1. 言語
    * 言語別に説明文などを設定出来ます。
1. トラッキング
    * 自分は使っていないため、詳細は省きます。

![business.facebook3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679785/8da450c8-815f-3344-cf27-8a4d64b52c53.png)


## クリエイティブの作成

では、クリエイティブを作る時にどんなサイズの動画や画像を用意したら良いのでしょうか？
下記のリンクによると、

| 解像度 | 動画 | 画像 |
|:-:|:-:|:-:|
| 1.91:1（1,200×628）  | ✖  | 〇  |
|  16:9（1,920×1,080） |  〇 | 〇  |
|  1:1（1,080×1,080） | 〇  | 〇  |
| 4:5（1,080×1,350）  |  〇 |  ✖ |
|  9:16（1,080×1,920） |  〇 |〇   |


広告は縦画面と横画面のものがあるので、どちらの比率の広告も用意した方が効果は大きくなると思います。

https://digimarl.com/syllabus/facebok-ads-format/

# 参考にしたサイト

https://anagrams.jp/blog/facebook-mobile-app-ad-campaign/#i-4

# 自己紹介

ハイパーカジュアルゲームを個人製作してます！
フォローお願いします！
[@1mono2](https://twitter.com/1mono2)

以上です。情報漏れや意見などございましたら、気軽にコメントしてください。フィードバック待ってます！
「Everyday Rails - RSpecによるRailsテスト入門」のセットアップで詰まったことと対処法まとめ

[「Everyday Rails - RSpecによるRailsテスト入門」](https://leanpub.com/everydayrailsrspec-jp)
職場の先輩におすすめしていただいたので、買ってみました。
そこのセットアップでつまずいたことと対処法を自分なりにまとめてみました。

# [「Everyday Rails - RSpecによるRailsテスト入門」](https://leanpub.com/everydayrailsrspec-jp)のセットアップの手順

```
# ソースコードのダウンロード
git clone git@github.com:JunichiIto/everydayrails-rspec-jp-2022.git
# ディレクトリの移動
cd everydayrails-rspec-jp-2022
# 使用する Ruby バージョンを指定（本書では3.1.0を推奨。下記コマンドは rbenv を使用する場合）
rbenv local 3.1.0
# gem のインストール
bundle install
# データベースのセットアップ等
bin/setup
# JavaScript パッケージのインストール
yarn install
# foreman gem のインストール
gem install foreman
# サーバーの起動
bin/dev
```

[「Everyday Rails - RSpecによるRailsテスト入門」](https://leanpub.com/everydayrailsrspec-jp)

にこのようなパートがあると思います。27p目(2022/1/31時点)。

# git clone時のエラー

```
# ソースコードのダウンロード
git clone git@github.com:JunichiIto/everydayrails-rspec-jp-2022.git
```


で、

```
git@github.com: Permission denied (publickey)
```

のようなエラーが起こると思います。
以下の記事をまんまやったらできました。

https://qiita.com/shizuma/items/2b2f873a0034839e47ce

ssh等のよけいな設定がめんどくさければ下記のコマンドでもクローンできるかと思います。

```
git clone https://github.com/JunichiIto/everydayrails-rspec-jp-2022.git

```


# bin/setup時のエラー

```
bin/setup
```

を実行すると

```
 ActiveSupport::MessageEncryptor::InvalidMessage (ActiveSupport::MessageEncryptor::InvalidMessage)
```

というエラーがでるかもしれません。

このエラーはどんなエラーかという
詳しいことの説明は、通称「チェリー本」や「、Everyday Rails - RSpec」の著者である伊藤淳一さんの下記の記事におまかせしたいと思います。
https://qiita.com/jnchito/items/a73bc2838bfab5240675

# bin/setup時のエラーの解決


https://qiita.com/jnchito/items/a73bc2838bfab5240675

を試しても解決しない場合は、以下が原因かもしれません。

[伊藤さん本人に解決していただきました。](https://teratail.com/questions/8amfd7ui9u5t21)
誠にありがとうございます。

復習として、私のほうでも記事を書かせていただきます。

>Railsはcredentialファイルを暗号化するためのマスターキーにconfig/master.keyか環境変数ENV["RAILS_MASTER_KEY"]を使用します。

[Rails セキュリティガイド - Railsガイド](https://railsguides.jp/security.html#%E5%88%A9%E7%94%A8%E7%92%B0%E5%A2%83%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3)

とあります。Railsは環境変数を参照して暗号化をしようとしてしまいました。

私は以前、 `vim ~/.zshrc`とかで  RAILS_MASTER_KEYを設定してしまいました。
なので

```
unset RAILS_MASTER_KEY 
```


で、マシン全体で共通のマスターキーの設定を解除できます。






# 以下は以前の解決方法
削除するのが望ましいかもしれませんが、反面教師的な感じで一応載せておきます。

結論からいうと

>`sudo`はほとんどの環境変数をunsetするのでRAILS_MASTER_KEYも消してくれたのかもしれません。
と@zundaさんに教えていただきました。

- credentials.yml.encを削除
   - 万が一master.keyがあった場合それも削除



```
sudo EDITOR="vi" bin/rails credentials:edit
```

を実行、このときmaster.keyが作られたことを確認。

```
 sudo chmod 764 config/master.key
```

を実行。権限系のコマンドは自分もよくわかっていないので自己責任でお願いします。


```
sudo bin/setup
```

を実行したらデータベースが作られると思います。

ついでにいうと、

```
# サーバーの起動
bin/dev

```

も


```
# サーバーの起動
sudo bin/dev

```

とやると立ち上がりました。


いちいちsudoコマンドを実行しなくてもいい方法があるかもしれませんが、一応この方法でセットアップが完了しました。


# 環境


macOS Monterey 12.1
2022/1/31日にbrew updateを実行

ruby 3.1.0p0 

Rails 7.0.1
foliumを使って東京のコロプレスマップを作成する

## はじめに
今回は僕の記事では同じみになった`Leaflet`をPythonで使えるようにするためのライブラリ`folium`を使って、東京のコロプレスマップを作成してみたいと思います。

## foliumを使って東京のコロプレスマップを作成する
### 使用するデータ
以下のレポジトリに保存されているデータを利用させていただきます。

https://github.com/niiyz/JapanCityGeoJson/tree/master/geojson/

### 実際のコード
```python
# モジュールの読み込み
import folium
import geopandas as gpd

# 都道府県データの読み込み
geojson_path = "https://raw.githubusercontent.com/niiyz/JapanCityGeoJson/master/geojson/prefectures/13.json"
geojson = gpd.read_file(geojson_path)

# 元となる地図の作成
map = folium.Map(
    location=[36, 140],
    tiles='cartodbpositron',
    zoom_start=9
  )

# 都道府県のデータを描画
folium.Choropleth(
    geo_data=geojson,
    name='choropleth'
).add_to(map)

map
```

### 結果
![スクリーンショット 2022-01-31 23.44.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/01872b7c-8cfe-2f94-0441-c3c98fde3fb2.png)

このように東京のコロプレスマップをPythonで作成することができました。

## さいごに
今回はfoliumを使って東京のコロプレスマップを作成してみました。以下のレポジトリには各都道府県のGeoJsonがあるので、興味のある都道府県のデータを使って何か可視化してみるのもいいかもしれません。

https://github.com/niiyz/JapanCityGeoJson/tree/master/geojson/