OmniAICreator/Qiita-1.07M huggingface dataset:
find・grepコマンド（初心者の個人メモ）

入社1week目でわからなかったポイントを調べたもの。個人的メモ。

# findコマンド
*引用元：https://www.atmarkit.co.jp/ait/articles/1607/12/news021.html*

ファイルを名前で検索する
出力内容を変更する（lsコマンドを実行する）

基本文法
**`find [オプション] [検索パス] [検索式]`**

「find」だけを実行するとカレントディレクトリ以下の全ファイルが表示される。
「find /etc」では「/etc」ディレクトリにある全てのファイルが表示される。


#### 検索したいファイル名を指定

検索したいファイル名を指定する場合は、**`「-name」オプション`**を使う。
（ディレクトリも検索対象。）

ホームディレクトリ上**`~`**で、ファイル名に「bash」を含むファイルを検索する場合は以下。
ワイルドカード**`*`**をbashの前後に付けると、●●_bash.js や .bash●●といったファイルも検索対象に含むことができる。
ワイルドカードを指定しない場合はダブルクオート**`"`**をつけなくてもOK。

ワイルドカードを使った場合

```
find ~ -name "*bash*"
```

ワイルドカードを使わずファイル名決め打ちの場合

```
find ~ -name .bash_profile
```

※ この場合、ファイル名は**完全一致**にする必要あり。
例えば .bash_profile の . を入れ忘れていたり、拡張子がなかったりすると検索に引っかからない。


### オプション

ディレクトリは含まず、ファイルだけを検索する
**`-type f`オプション**
例）hogeディレクトリ内の「profile.txt」を検索したい場合

```
find /hoge -name profile.txt -type f
```

ディレクトリを検索対象としたい場合は
**`-type d`オプション**

シンボリックリンクを対象とする場合は
**`-type l`**オプション


## "Operation not permitted" のエラーメッセージを表示させないようにする
findを実行したところ、こんな感じの実行結果がたくさん出て実行結果が非常にわかりにくい。
sudo find ~ で実行しても同じだった。
`find: /Users/ユーザー名/Library/Caches/CloudKit/com.apple.Safari: Operation not permitted`

これは、検索場所に「/」を指定すると、権限のない場所も検索されて大量のエラーメッセージが表示されるので、「**`2>/dev/null`**」でエラーメッセージを“捨てる”（ヌルデバイスにリダイレクト）とよいでしょう。とのこと。

**`2>/dev/null`** でエラーメッセージを捨てる例

```
find /hoge -name profile.txt -type f 2>/dev/null
```

これで、権限のない場所の検索エラーメッセージは破棄され、純粋な検索結果のみが表示される。


## 出力内容を変更する（lsコマンドを実行する）

検索式の他に「アクション」を指定して実行できる。

**`-print`アクション**（デフォルト）
ファイル名を表示する

**`-ls`アクション**
ファイルの詳しい情報が表示される。
「ls -dils」コマンド相当で表示される情報で、ファイルサイズなどが含まれるためにかなり長くなる。

例)

```
 find ~ -name .bash_profile -type f -ls 2>/dev/null
```
実行結果

```
12902229406        8 -rw-r--r--    1 ユーザー名     staff                 629 Nov 24 17:56 /Users/ユーザー名/.bash_profile
```

「ls -dF」くらいの情報量でよい場合は「-exec」アクションを使い、「-exec ls -dF {} ;」のように指定します。
..とのこと。詳しくは引用元参照。


# grepコマンド

*引用元：
https://www.atmarkit.co.jp/ait/articles/1604/07/news018.html
https://eng-entrance.com/linux-command-grep*


実行結果から必要な箇所だけを抽出する
単語単位で検索する
前後の行も検索する
行番号付きで表示する

基本文法
**`grep [オプション] 検索パターン ファイル`**
もしくは
**`コマンド | grep [オプション] 検索パターン`**
※[ ]は省略可能な引数

##### 例） 「work」ディレクトリ内のファイルすべての中から「a」という文字を検索する場合

```
grep a work/*
```


##### grepでand（なおかつ）検索する

```
grep 検索文字列 ファイル名 | grep 検索文字列2
```


## 行番号付きで表示する

grepコマンドの検索結果に行番号を付けて表示したい場合は**`-nオプション`**を使用する。
**`grep -n 検索文字列 テキストファイル`**

例）「~/.ssh/hoge.txt」ファイルから「EA」という文字列を含む文字列を検索し、存在したらその行番号を表示する

```
grep -n EA ~/.ssh/hoge.txt
```

実行結果

```
2:asfasdfasdasdfasEAasdasdfasf
```
Google Apps ScriptでカレンダーとToDo(タスク)を連携する

#Googleカレンダーの予定を自動的にToDoへ登録したい
##ToDoには2種類あると思う。

1. 通知が来たら即実行するもの。会議や打ち合わせを知らせるもの
2. 通知が来ても当日か翌日中に実行できればよいもの。定期的な振り込みや買い物

1の通知は、そのことを知ればスマホの通知を消してしまっても良い。即時実行型の通知は、通知内容を知ったら消したくなるのが心情である。
しかし2の通知は違う。うかつに消してしまうとヤバい状況になる可能性がある。この類の通知は通知内容を実行後に消すものである。
つまり2の通知はToDoやタスクリストみたいな扱いにしたいのだ。

#何をしたいの
**『毎月25日に◯◯の料金を振り込む』とカレンダーへ定期的な予定として設定すると、その1日前にカレンダーからToDoへその内容をコピーしたい。**
がやりたいことである。

#どうやってやるの

- ToDoへ登録したい予定の通知方法をメールへ変更する
- カレンダーから飛ばされたメールへ特定のラベル`CreateToDo`を付けるフィルタを設定する
- 一定間隔でラベル`CreateToDo`のメールをチェックしToDoへコピー後に削除する

3番目の動作をGoogle Apps Script（以前は違う名称だったような）で自動化し、10年近く運用して便利なので情報共有する。

#Google Apps Scriptのコード
```js:createTodo
function createTodo() {
  'use strict';
  var threads = GmailApp.search('label:' + 'CreateToDo');
  var tasklist = Tasks.Tasklists.list().getItems();
  var tasklistid = tasklist[0].id;
  var subject;
  var tasks;
  var notes;
  for (var i = 0; i < threads.length; i++) {
    subject = threads[i].getFirstMessageSubject();
    notes = threads[i].getMessages();
    tasks = Tasks.newTask();
    if (subject.indexOf('通知:') == 0) {
      tasks.title = subject.replace('通知: ', '') + '[!]';
    }
    else {
      tasks.title = subject;
    }
    tasks.notes = notes[0].getBody();
    Tasks.Tasks.insert(tasks, tasklistid);
    threads[i].moveToTrash();
  }
}
```
まったくコメントが無くて申し訳ない。しかし、読めば理解できるコードである。短いし。
カレンダーから飛ばされるメールのサブジェクトには必ず`通知: `と書いてあるので、その`通知: `を除去している。`[!]`を付加しているのは、このキーワードがToDoのタイトルに付いていると優先度高の項目になるためだ。予定にメモがあったらそれもToDo側へコピーしている。
このスクリプトを6時間おきに実行するように設定してある。

#おまけ
`for`文中の`if`文の`else`にいつ入るのか？
Gmailはメールアドレスへ`+任意の文字列`を付けて、別のメールアドレスでメールを送れる（これはGmailだけの機能なのか分からない）。
例えば、`hoge@gmail.com`は`hoge+hoge@gmail.com`と書いて送っても届くのだ。
`else`でやってることは、`hoge+createTodo@gmail.com`宛のメールもラベル`CreateToDo`を付け、そのメールからToDoを作る処理である。
[随時更新] 統計検定準1級取得を目指すｽｯﾄﾞﾚ

#背景
何も統計のことわからん・・・詳しくなりたい！あと、機械学習も詳しくなりたい！
統計検定の勉強をするのがええんやろか・・・
統計検定2級は学部レベルらしいし取っても価値低いやろ・・・けど1級はガチすぎる・・・
　　　　↓
せや、統計検定準1級や！！
せっかくやからQiita上で情報整理したろ！(受験するとは言っていない)


#情報整理
##公式のもの
[・公式サイト](http://www.toukei-kentei.jp/about/grade1semi/)
　特に重要なもの
　[- 出題範囲表](http://www.toukei-kentei.jp/wp-content/uploads/grade1semi_hani_190628.pdf)
　- その時点での最新の試験問題と簡易解答がダウンロード可能。
　 　解説が無いので扱いにくいが、外部の解説サイトを利用するのであれば。

・公式テキスト
　準1級には存在しない。1級、2級はある。
　そのため、最低限の知識を集めるだけでも、色々な情報ソース(書籍など)を当たらないといけない。
　日本統計学会さん、作ってｸﾚﾒﾝｽ。
　~~公式テキスト自体の評判は良くないが。~~

・推薦図書
　私見だが、準1級にマッチした書籍はないと考えるので省略。
　書籍一覧は公式サイトを参照。

・過去問・解説(公式問題集)
　準1級は2015年から開始した試験なので、多くは無い(特に2015年のものは入手しにくい)。
　2019年までの受験者は大変だったと思われるが、2018-2019年の過去問が発売されれば
　傾向を掴んだり演習を積むことは、だいぶ容易になるか。
　[　2015年](https://www.amazon.co.jp/dp/4788925273)
　[　2016-2017年](https://www.amazon.co.jp/dp/4788925486)
　[　2018-2019年(2020年3月発売)](https://www.amazon.co.jp/dp/4788925516)


##一般書籍
　今後追加予定

##Qiita記事
[・統計検定 1 級に合格する方法](https://qiita.com/drken/items/089b8443305df047b44e)
[・専門力0から３カ月で統計検定準一級を目指した話](https://qiita.com/takuya66520126/items/baeae1c529af009b9e25)

##一般ブログ記事
[・統計検定準1級を取るための勉強法](https://id.fnshr.info/2016/07/19/stat-cerf-j1q/)
[・統計検定準１級の試験対策について](http://www.ie110704.net/2017/09/27/%E7%B5%B1%E8%A8%88%E6%A4%9C%E5%AE%9A%E6%BA%96%EF%BC%91%E7%B4%9A%E3%81%AE%E8%A9%A6%E9%A8%93%E5%AF%BE%E7%AD%96%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/)
[・統計検定準1級に合格したので合格するまでにやったことを書く](https://rion778.hatenablog.com/entry/2019/07/24/075528)
[・統計検定 準1級に受かったので勉強法を](https://ds.machijun.net/%e7%b5%b1%e8%a8%88%e6%a4%9c%e5%ae%9a-%e6%ba%961%e7%b4%9a%e3%81%ab%e5%8f%97%e3%81%8b%e3%81%a3%e3%81%9f%e3%81%ae%e3%81%a7%e5%8b%89%e5%bc%b7%e6%b3%95%e3%82%92/)
[・統計検定準一級合格への道筋](https://su-butsu-kikaigakusyuu.hatenablog.com/entry/2018/07/11/123053)
[・統計検定準１級の勉強法](https://plaza.rakuten.co.jp/takumitools/diary/201904010000/)

##対策サイトなど
[・DataArts](http://www.data-arts.jp/)
[・統計検定1級・準1級対策ブログ](https://ameblo.jp/dataarts/)

##対策講座
　いくつかあるみたいだけど宣伝みたいになるので割愛。
ECDSA署名からの公開鍵の復元

Ethereumの署名の$\,v\,$を作っていたら$\,recid\,$というのが出てきたので調べたら、署名からの公開鍵の復元に使われる値だった。

### 記号の説明

| 記号 | 意味 |
|---|---|
| $ m $ | メッセージ |
| $ H $ | ハッシュ関数 |
| $ k $ | 一時的な秘密鍵 |
| $ x $ | 秘密鍵 |
| $ G $ | ジェネレーター |
| $ n $ | $G$の位数 |

### kGがわかった前提での署名からの公開鍵の復元

署名から直接にはその値はわからないが、署名作成時に作った一時的な公開鍵$\,kG\,$がわかれば、署名$\,(r,s)\,$から、$\,r^{−1}(skG−H(m)G)\,$を使って、公開鍵$\,xG\,$を復元できる。

$s = k^{-1}(H(m) + rx) \bmod n$なので、

```math
r^{−1}(skG−H(m)G)\\
= r^{−1}(k^{-1}(H(m) + rx)\cdot kG-H(m)G)\\
= r^{−1}((H(m) + rx)\cdot G-H(m)G)\\
= r^{−1}G(H(m) + rx -H(m))\\
= r^{−1}Grx\\
= xG
```

### kGになり得る点

$\,kG\,$を署名から導き出してみる。

$secp256k1\,$曲線の式は

```math
y^2 = (x^3 + 7) \bmod p
```

で、曲線上の点の座標には$0$から$p-1$の数値が使われている。

一方、カーブオーダー(曲線上の点の数)は$\,n\,$で、$\,p\,$よりもかなり小さい。
$p \approx \,2^{256} - 2^{32}\,$
$n \approx \,2^{256} - 2^{128}\,$


署名の$\,r\,$は$\,kG\,$の$\,x\,$座標を$\bmod n\,$したものなので、$kG\,$の$\,x\,$座標は、$\,n\,$以上$\,p\,$未満である可能性もある。$\,n\,$の大きさを考えると、$\,r\,$は、$\,kG.x\,$か、$kG.x-n$のどちらかになる。

更に、曲線の式は$\,y^2=...\,$で、それぞれの$x$の候補で$\,y\,$について解くと、$+$と$-$の２通りの解が存在する。結果として、$\,kG\,$はその４通りのうちのいずれかの点になる。

$\,r\,$が$\,kG.x-n\,$になる可能性はとても小さくて、$0.000000000000000000000000000000000000373$%ということらしい。

$\,kG.y\,$は、奇数か偶数かというところで、$+$と$-$と紐づくらしい。
どちらがどちらなのかは未確認。

$\,s\,$が$\,\frac{n}{2}\,$を超えた場合には、$\,recid\,$の最下位ビットを反転させる必要があるという書き込みもあった。曲線がうねっていった結果、$\,y\,$座標の正負がそこで逆転するのだろうか。こちらも未確認。


### recidの作成
４つケースそれぞれについて、以下のように$\,recid\,$が割り当てられる。

| kG.x | kG.y | recid |
|---|---|----|
|$r$と一致| 偶数 | 0 |
|$r$と一致| 奇数 | 1 |
|$r$と不一致| 偶数 | 2 |
|$r$と不一致| 奇数 | 3 |

### 参考資料
https://bitcoin.stackexchange.com/questions/38351/ecdsa-v-r-s-what-is-v/38909#38909
https://crypto.stackexchange.com/questions/60218/recovery-public-key-from-secp256k1-signature-and-message
https://ethereum.stackexchange.com/questions/42455/during-ecdsa-signing-how-do-i-generate-the-recovery-id
scikit-learnのimputerでエラーが出た件

備忘録です。

Python3や機会学習周りのライブラリの進化に追いついてないせいか、古いままの状態の記述での記事があったためここに残しておきます。

```hoge.py
from sklearn.preproceccing import Imputer

imp = Imputer(strategy="mean",axis=0)
```

上記は、欠損値の平均値を算出する際に使われる記述だが、どうやらバージョンによってすでに廃止されているらしい。
なので、バージョンによってはエラーが出ます。（ちょっと詰まりました・・・）
色々と調べてたら、下記の記事を見つけたのでその辺を詳しく知りたい場合は、こちらの記事を見るのが一番良いです。

>写経中に遭遇したscikit-learnのワーニングに対応してみた
>https://qiita.com/y_nishimura/items/6d022a25beb21a186d60

じゃあ、どうすればエラーが出ないのかというと。

```hoge.py
from sklearn.impute import SimpleImputer

imp = SimpleImputer(strategy='mean')
```

SimpleImputerを使うことで算出できるそうです。
本とか使って勉強するのは良いのですが、こういうエラーがあったりして意外と落とし穴だったりしますね・・・
Openssh ソースコンパイル

# 経緯
Centos6系で稼働してるOpensshをバージョンアップする必要があり
手順について調べた時のメモ。

# 環境
+ OSバージョン：Centos6.2
+ Openssh（変更前）：openssh-5.6以前

# openssh ソースコンパイル手順
~~~
▼ openssh-8.1p1.tar.gzをダウンロード
# cd /opt
# curl -O http://ftp.jaist.ac.jp/pub/OpenBSD/OpenSSH/portable/openssh-8.1p1.tar.gz

▼ openssh-8.1p1をコンパイル
# tar zxvf openssh-8.1p1.tar.gz
# cd openssh-8.1p1
./configure \
--with-ssl-dir=/etc/ssl \
--with-ssl-engine \
--with-pam \
--with-md5-passwords \
--bindir=/usr/local/bin \
--sbindir=/usr/local/sbin \
--libexecdir=/usr/libexec \
--sysconfdir=/etc/ssh 

# make
# make install
~~~
Node.jsでGoogle Slides内のテキストの書き換え


Google Slides APIをNode.jsから触ってみてます。

* [Node.jsでGoogle Slides APIを触ってみる](https://qiita.com/n0bisuke/items/8a343ca4d8fe2f1bac55)
* [Node.jsでGoogle Slides内のテキストを取得してみる](https://qiita.com/n0bisuke/items/325fbe56a48e7d83e8dc)
* [Node.jsでGoogle Slidesの新規スライド作成](https://qiita.com/n0bisuke/items/1160bb5c524cdaff3342)

の記事の続きです。

## batchUpdate()で更新

[presentations.batchUpdate](https://developers.google.com/slides/reference/rest/v1/presentations/batchUpdate)でどうやら更新ができそうです。

## presentations.batchUpdate()の

`presentations.batchUpdate()`の使い方がいまいち分からなかったけど、[stackoverflowの投稿](https://stackoverflow.com/questions/55939586/how-to-google-docs-api-batchupdate-in-javascript-code-required)を参考に

```js
presentationId: プレゼンテーションIDを指定, 
resource: {
   requests: {
      //ここにリクエストする内容を入れる
   }
}
```

みたいな使い方というのが分かりました。

```app.js
省略

function listSlides(auth) {
  const slides = google.slides({version: 'v1', auth});

  slides.presentations.batchUpdate({
    presentationId: presentationId,
    resource: {
      requests: {
        replaceAllText: {
          containsText: {
            text: "Node.js" //置き換え前のテキスト
          },
          replaceText: "Hoge" //置き換え後のテキスト
        }
      }
    }
  }, (err, res) => {
      if (err) return console.log('The API returned an error: ' + err);
      console.log(res.data);
  });
}
```

Node.jsというテキストをHogeに書き換えます。

## 実行

![](https://i.gyazo.com/f1ebe7a6322e8c4a6654b12d48ade634.gif)


こんな感じで書き換えができました。

## 所感

今回は`replaceAllText`というリクエストをしましたが、他のリクエスト方法もあるので試していきたいです。

> [/v1/presentations/request](https://developers.google.com/slides/reference/rest/v1/presentations/request)
REST APIでQiitaの記事を作成してみる【環境準備編】


設定の覚書です。

##背景
PythonでQiitaのRESTAPIを叩いて記事を作成します。

##環境
Windows10
Python 3.8.1
外部ライブラリ：requests
Visual Studio Code 1.42.0

##環境準備編
「Pythonのインストール」に時間がかかって
なんだかんだで半日かかりました。
サクサクすすめば、1時間以内に終わると思います。

###１. Pythonのインストール
一応2系と3系両方インストールしました。
実際にコードを実行するのは、最新版の3系を使います。
（2系はPythonの参考書が2系を使っていたためです。）

参考記事：
[WindowsにPython2.7とPython3.8が共存できるようにChocolateyでインストールする
](https://qiita.com/segur/items/953abf91071632fdae4c)

※Pythonインストール時に以下のエラーメッセージが表示されました。pyコマンドでコマンドが実行できませんでしたが、Chocolatey出力メッセージ通りコマンドプロンプトを再起動することにより、この事象が解消しました。

>2020-02-09 12:00:03,908 7028 [WARN ] - Environment Vars (like PATH) have changed. Close/reopen your shell to
 see the changes (or in powershell/cmd.exe just type `refreshenv`).

###２. Visual Stadio Codeをインストール

参考記事：
[VisualStudioCodeのインストールと日本語化](https://breezegroup.co.jp/201904/visualstudiocode/)

拡張機能も併せてインストールします。
・[Python for VSCode](https://marketplace.visualstudio.com/items?itemName=tht13.python)
　　構文の間違いを指摘してくれる拡張機能
・[Python Extended](https://marketplace.visualstudio.com/items?itemName=tushortz.python-extended-snippets)
　　コードを補完してくれる拡張機能
・[Python Indent](https://marketplace.visualstudio.com/items?itemName=KevinRose.vsc-python-indent)
　　インデントを整形してくれる拡張機能

###３. 2系と3系のPythonを切り替えるための設定
Visual Studio Codeの設定ファイルをフォルダごとに配置します。
・2系の実行環境のフォルダ
・3系の実行環境のフォルダ


参考記事：
[VS CodeでWorkspace毎に使用するPython実行環境を切り替える](https://logixsquare.com/techblog/visual-studio-code-python-version-settings/)

3.requestsライブラリを3系のPythonにインストール

C:\WINDOWS\system32>py -3 -m pip install requests

参考記事：
[Pythonのパッケージ管理システムpipの使い方](https://note.nkmk.me/python-pip-usage/)
Postmanでjsonの配列とファイルを同時に送りたい


Postmanでファイルとjsonの配列を同時に送りたいときに詰まったので…
特にjsonの配列の書き方…

## jsonだけの場合

jsonだけだったら、Bodyのrawを選択し、形式をJSONに設定して

```json

{
    "image": "foo.png",
    "people": [
        {
            "name": "tom",
            "email": "foo@foo.com"
        },
        {
            "name": "john",
            "email": "bar@bar.com"
        }
    ]
}

```

こんな感じで入力するだけ！

分かりやすい！


## 画像やPDF、CSVなどのファイルを送る場合

Bodyからform-dataを選択して、KEY入力欄のプルダウンから、Text → Fileに変更。
Select Filesをクリックして、送りたいファイルを選択すればOK！


## JSONの配列とファイルを同時に送りたい

Fileは上記と同様に設定して、

|KEY|VALUE|
|---|---|
|people[][name]|tom|
|people[][email]|foo@foo.com|
|people[][name]|john|
|people[][email]|bar@bar.com|

JSONはこんな感じで入力。

<img width="729" alt="postman-body-screenshot" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466880/b5e5dab0-b785-9008-9d3d-5ba09d1a896c.png">


## 順番に注意

|KEY|VALUE|
|---|---|
|people[][name]|tom|
|people[][name]|john|
|people[][email]|foo@foo.com|
|people[][email]|bar@bar.com|

順番がこんな感じになると、最後に読み込んだ方の値で上書きされるので注意。


配列の場合の書き方に苦戦したので投稿。
もっとスマートな書き方あれば教えて欲しいです！
今回はProgateでPythonのIとIIを学びました。

今回学んだことはpythonの初期的なことです。
主には変数の使い方や条件分岐、リストや辞書型です。
変数は 変数名　＝　入れたい処理　のように書きます。
それを元に商品を購入するシステムを作りました。
cloud9でbundle installで再構築出来ず、gemfile.lockを削除とMysqlなのにPostgresqlインストールしたら解決した話。



EC2のインスタンスを、停止すべきところを間違って終了押してしまい、後の祭り。。
cloud9で再構築使用とgit cloneしたが、再構築しようとしたらいろいろハマったので忘備録として。


```
You must use Bundler 2 or greater with this lockfile.
```
gemfile.lockを削除して、Bundler2系をインストール出来るようにします。

```
bundle install
```

```
Your Ruby version is 2.6.3, but your Gemfile specified 2.5.3
```
またもエラー分が、今度はインストールするrubyバージョンが、君が使用しているバージョンとは違うよーとの事なので、直接修正。

```
bundle install
```


またエラー。。

```
An error occurred while installing pg (1.2.2), and Bundler cannot continue.
Make sure that `gem install pg -v '1.2.2' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  pg
```
エラー分にある通り、

```
$gem install pg -v '1.2.2'
```
しましたが、エラーは変わらず。。

Mysqlを使ってましたが、どうやらPostgresqlがインストールされていないことが原因とのことらしく、
こちらの記事を参考にPostgresqlがインストールしました。
https://qiita.com/oke-py/items/75333cf564480d062006

```
sudo yum install postgresql postgresql-server postgresql-devel postgresql-contrib
```
インストールが終わり、無事budle出来ました。
AtomでPython3.7.4を動かすときにTkinterのcanvas（ウィンドウ）が立ち上がらない 

AtomでPython3.7.4を動かす環境を作りましたが、Tkinterライブラリを使ってcanvasを表示するプログラムを実行しても、canvas（ウィンドウ）が立ち上がりません。
原因おわかりの方、解決方法をご教示いただけないでしょうか？

■やったこと
①Python3.7.4のデフォルトの開発環境（IDLE）で、Tkinterライブラリを使ったcanvasを表示するプログラムを実行すると、添付写真のようにcanvasのウィンドウが表示されます。（エイリアンの画像）
②Atom1.4の環境を用意して、後述する「atom-runnter」というパッケージをインストールして、Atom内でPythonが実行できる環境を構築しました。
③しかし、Atomで同プログラムを実行をすると、実行結果を表示するウィンドウはAtomの右下に表示されるものの（print文はないため実際は何も表示されません）、①のウィンドウが立ち上がりません。※試しにプログラムにprint("hello")を追加してみたところ、実行結果には正しく表示されましたが、依然としてウィンドウは出ません。

■Atom導入パッケージ（関係なさそうなものも含めて列挙）
atom-runner
busy-signal
indent-guide-improved
intentions
japanese-menu
linter
linter-php
linter-ui-default
script
show-ideographic-space

<img width="499" alt="2020-02-09_17h35_03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582686/5830783b-e7f9-990c-edc1-b7184c4c4237.png">
メモ：gcloud app deploy でLegacy health checks are no longer supported が出た時

以前作って放置してたGCPプロジェクトやアプリケーションをデプロイしようとして、

```
gcloud app deploy 
```
を実行した時に、以下のエラーが出てしまった

ERROR: (gcloud.app.deploy) INVALID_ARGUMENT: Legacy health checks are no longer supported for the App Engine Flexible environment. This app's feature setting is configured to use legacy health checks by default. For instructions on migrating to split health checks see https://cloud.google.com/appengine/docs/flexible/java/migrating-to-split-health-checks

このURLを開くと、2019 年 9 月 15 日以降、レガシー ヘルスチェックを使っている場合、デプロイできなくなってしまった、とございます。
※自分はpythonとGoでこうなりました。

その説明に従って、

```
gcloud app describe
```

にて、アプリケーションで使用しているヘルスチェックを調べても、とくにレガシーヘルスチェックを使っているとも、スプリットヘルスチェックを使っているとも表示されない。app.yamlにもヘルスチェックについては何も書かなかったしなぁ。

そういう時は、ページの中のしたーのほうに書いてあるこれ↓を実行してから、再度デプロイすれば良い。

```
gcloud app update --split-health-checks --project [YOUR_PROJECT_ID]
```

以上、GCPのマニュアルは見やすいのだけどわかりやすいとは限らないので備忘録として。
Xcode 11.4アップデートまとめ！

## Xcode11.4が3/24に公開された
<img width="990" alt="スクリーンショット 2020-03-26 23.04.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/470777/7d67c13f-2106-776f-bb71-cfbeea9eee61.png">


### [Relese Note](https://developer.apple.com/documentation/xcode_release_notes/xcode_11_4_release_notes)

## 対応バージョン
- macOS Catalina 10.15.2以降を実行しているMacが必要。
- iOS 13.4, iPadOS 13.4, tvOS 13.4, watchOS 6.2, macOS Catalina 10.15.4に対応したバージョン。

## 変更点

### Interface Builder
- IBで制約をつける際に0を入力して「Standard」になるバグを修正
    - Xcode11.3.1でずっと困ってた...
- IB（インターフェースビルダー）にシステムグレーが追加

### Swift 5.2にアップデート
- [Swift 5.2の新機能](https://qiita.com/koher/items/50baade1eda4940c279c)
    - めちゃくちゃわかりやすく書いてくれてます。

- `callAsFunction`が追加

adder.callAsFunction(10)をadder(10)と省略してかけるようになった。

```swift
struct Adder {
    var base: Int

    func callAsFunction(_ x: Int) -> Int {
      return x + base
    }
}

var adder = Adder(base: 3)
adder(10) // returns 13, same as adder.callAsFunction(10)
```

### iOSシミュレータがプッシュ通知のシミュレーション可能に
- [iOSシミュレータにプッシュ通知を送ってみる](https://qiita.com/koogawa/items/85c0dd0abd2f1970c5fc)

- SSLの証明書をシミュレーターにたいして`ドラッグ&ドロップ`でインストール可能に

- simctlキーチェーンサブコマンドをサポート

```bash
xcrun simctl keychain <device> add-root-cert my-selfsigned.cer
```

- simctlプライバシー権限の変更をサポート

```bash
# アクセスできるようにする
xcrun simctl privacy <device> grant photos com.example.app
# 権限をデフォルトにリセットする
xcrun simctl privacy <device> reset all com.example.app
```

### コマンドでシミュレーターをダークモードに変更することができる

```
xcrun simctl ui <device> appearance dark
```

### プレビュー
- プレビューキャンバス内でコピー、切り取り、貼り付けができるようになった

### XCTest
- `XCTSkipIf`が追加
    - 一部のテストをスキップできるらしい。
    - 外部通信するテストの場合は事前に正常に通信できるか確認し、通信できない場合はテスト自体をスキップできる。
    - まだ公式ドキュメントの説明は`No overview available.`

```swift
func test_canAuthenticate() throws {
    XCTSkipIf(AuthManager.canAccessServer == false, "Can't access server")

    // Perform test…
}
```


## 参考記事
- https://developerinsider.co/whats-new-in-xcode-11/#whatsnewinxcode114

## 最後に
- ベータ版ではなく正式版が出た際にもう一度更新します。
【jQuery】slick slideをメインビジュアル部分にwidth:100%で組み込む

#

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>slick_slide_project</title>
  <link rel="stylesheet" href="js/slick-theme.css">
  <link rel="stylesheet" href="js/slick.css">
  <link rel="stylesheet" href="css/style.css">
</head>
<body>
  <header class="header">
    <h1 class="h1_title">
      <img src="img/cat01.jpg" alt="">
    </h1>
    <div class="single">
      <!--任意のスライド用画像のパス-->
    </div>
    <nav>
      <ul>
        <li>
          <a href="">Home</a>  
        </li>
        <li>
          <a href="#about">About</a>
        </li>
        <li>
          <a href="#skills">Skills</a>
        </li>
        <li>
          <a href="#portfolio">Portfolio</a>
        </li>
      </ul>
    </nav>
  </header>
  <main></main>
  <footer></footer>
  <script src="js/jquery.min.js"></script>
  <script src="js/slick.min.js"></script>
  <script type="text/javascript">
    $(document).ready(function(){
      $('.single').slick({
        autoplay:true,
        dots:false,
      });
    });
  </script>
</body>
</html>
```
```css:style.css
nav {
  background-color: #20b2aa;
}

nav ul {
  width: 1000px;
  margin: 0 auto;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
}

nav ul li {
  border-left: 1px solid white;
  width: 100%;
  margin: 0 auto;
  text-align: center;
}

nav ul li:last-child {
  border-right: 1px solid white;
}

nav ul li a {
  display: block;
  padding: 20px 0;
}

nav ul li a:hover {
  background-color: aquamarine;
  -webkit-transition: all 0.5s;
  transition: all 0.5s;
}

.header {
  position: relative;
}

.h1_title {
  position: absolute;
  text-align: center;
  top: 0;
  right: 0;
  left: 0;
  margin: 0 auto;
  z-index: 1000;
}

.h1_title img {
  width: 500px;
}

.single {
  margin: 0 auto;
  width: 100%;
}

.single img {
  height: auto;
  width: 100%;
}

/*slick setting*/
.slick-prev:before,
.slick-next:before {
  color: #000;
}

.slick-prev {
  left: 25px;
  z-index: 1;
}

.slick-next {
  right: 25px;
}

.slick-prev:before, .slick-next:before {
  color: white;
  font-size: 40px;
}

* {
  margin: 0;
  padding: 0;
  -webkit-box-sizing: border-box;
          box-sizing: border-box;
}

ol, ul {
  list-style: none;
}

a {
  text-decoration: none;
  color: black;
}
```
FirestoreでCollectionを削除する

Firestoreではコレクションを完全に削除するにはその下に紐づいているドキュメントを一個一個全部削除してからそのあと、コレクションを削除しないと、完全に削除できません。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Firestoreのコレクションは削除できない。<br>削除できないので、全てのドキュメントを取得して一個一個削除していくしかない。<br><br>また、ドキュメントを削除してもそのドキュメントの下のサブコレクションは削除できない。<br><br>これはめんどくさい😭 <a href="https://t.co/M3sHypt0w0">pic.twitter.com/M3sHypt0w0</a></p>&mdash; shogo.yamada (@yshogo87) <a href="https://twitter.com/yshogo87/status/1226418211064696832?ref_src=twsrc%5Etfw">February 9, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


公式ドキュメント↓
https://firebase.google.com/docs/firestore/manage-data/delete-data?hl=ja


また、FirestoreのBatchでは一度に５００個までしかできないので、５００以上まとめて削除する場合はそれぞれを５００個ずつ分割して削除する必要があります。

公式ドキュメント↓
https://firebase.google.com/docs/firestore/manage-data/transactions?hl=ja


なので、それを考慮して削除するコードを記載します。

## 実装

```node
const batchArray: admin.firestore.WriteBatch[] = [];
    batchArray.push(db.batch());
    let operationCounter = 0;
    let batchIndex = 0;

    const roomId = chatQuery.docs[0].id;
    const deleteDoc = await db
      .collection("test")
      .doc(testId)
      .collection("docs")
      .get();
    deleteDoc.forEach(doc => {
      batchArray[batchIndex].delete;
      operationCounter++;

      if (operationCounter === 499) {
        batchArray.push(db.batch());
        batchIndex++;
        operationCounter = 0;
      }
    });

    batchArray.forEach(async batch => await batch.commit());

    await db
      .collection("chat_room")
      .doc(roomId)
      .delete();
  }
```
Webサイト制作で役立つカラーコードサイト5選

# 1. FLAT UI COLORS 2
[FLAT UI COLORS 2](https://flatuicolors.com/)
<img width="1280" alt="color1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400431/2ce2a556-3908-07c5-794b-c37fc7308ad7.png">

# 2. Color
[Color](http://www.netyasun.com/home/color.html)
<img width="1280" alt="color2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400431/f9473c53-b8e7-686c-5424-79f904f807ad.png">

# 3. Color Hunt
[Color Hunt](https://colorhunt.co/)
<img width="1280" alt="color3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400431/c75872a1-399f-9307-04ef-c245eaf380e9.png">

# 4. Color Palettes Color Schemes
[Color Palettes Color Schemes](https://www.color-hex.com/color-palettes/)
<img width="1280" alt="color4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400431/c4fa45a2-62f4-4c6e-b4dc-38328ca7ae19.png">

# 5. HTML Color Picker
[HTML Color Picker](https://www.w3schools.com/colors/colors_picker.asp)
<img width="1280" alt="color5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400431/ab5e3479-217c-0c39-b950-7dc4f8f42d68.png">
シェルスクリプトでよく忘れること

私は時々シェルスクリプトを書くのですが、よく構文などを忘れて何度も調べることになるので、ここにまとめておきます。

#1. 基本文法編
##1.1 条件式について
シェルスクリプトでは文字列型と数値型の区別が存在しない（全て文字列型である）ために条件式は
・文字列型として扱う条件式
・数値型として扱う条件式
があり、例えば "1"と1はどちらの条件式に入力しても同じ振る舞いをします。

```shell
#文字列型の条件式
[ -z 変数 ] #変数の長さが0の時（何も入力されていない時） 
[ -n 変数 ] #変数の長さが0出ない時
[ 変数１ = 変数２ ] #変数１と変数２の文字列が等しい時(str1 == str2)
[ 変数１ != 変数２ ] #変数１と変数２の文字列が等しくない時(str1 != str2)

#数値型の条件式
[ 変数１ -eq 変数２ ] #(int1 == int2)
[ 変数１ -ne 変数２ ] #(int1 != int2)
[ 変数１ -lt 変数２ ] #(int1 < int2) int1 "Littler Than" int2
[ 変数１ -le 変数２ ] #(int1 <= int2) int1 "Littler than or Equal" int2
[ 変数１ -gt 変数２ ] #(int1 > int2) int1 "Grater Than" int2
[ 変数１ -ge 変数２ ] #(int1 >= int2) int1 "Grater than or Equal" int2
```

##1.2 if文

```shell
if ["条件式"];then
  処理１
elif ["条件式"];then
  処理２
else
  処理３
fi
```

##1.3 while文

```shell
while ["条件式"]
do
処理
done
```

##1.4 for文

```shell
for "仮変数" in "配列"
do
処理
done
```

##1.5 数値計算
シェルでは基本文字列型なので数値計算をする際は別に数値として計算するための処置が必要です
###1.5.1 リテラルの計算

```shell
パターン１：$(())を使う場合

$ echo $((1+1))
=> 2
$ echo $((1 + 1))
=> 2
$ echo $(( 1 + 1 ))
=> 2

$(())を使う場合は空白をどのようにおいても計算できます。

#######################################

パターン２：exprを使う場合

$ echo `expr 1 + 1`
=> 2
$ echo `expr 1+1`
=> 1+1

exprを使う場合は数値と記号の間に空白を入れる必要があります
```

###1.5.2 変数の計算

```shell
$ var=1

パターン１：$(())を使う場合

$ echo $((${var}+1))
=> 2
$ echo $((var+1))
=> 2
カッコ内で変数を評価するようなので変数に$がなくても計算されるようです

############################################

パターン２：exprを使う場合
$ echo `expr $var + 1`
=> 2
$ echo `expr var + 1`
=> expr: not a decimal number: 'fuga'
変数に$がないとエラーが発生します

############################################

パターン３：letを使う場合

$ let $var=$var+1 && echo $var
=> 2
$ let var=var+1 && echo $var
=> 2

letは変数への入力を行うので、計算結果は出力はされないことに注意しておく必要があります

############################################

パターン４：declareを使う場合
$ declare -i x
$ x=1+1
$ echo $x
=> 2
$ x=1 + 1
=> bash: +: command not found
$ x="1 + 1"
$ echo $x
=> 2

declare -i は整数として定義するコマンドで、定義した変数に対する代入処理に対して計算処理を行うようです
```
arduinoで並列処理(ノンプリエンプティブ)

# 概要
Arduino Unoに使用されているAVRはシングルスレッドのため、x86 CPUのようなマルチスレッド処理はできませんが、代わりに[プロトスレッド](https://en.wikipedia.org/wiki/Protothread)処理を組み込むライブラリがあります。
https://playground.arduino.cc/Code/TimedAction/

プロトスレッドとは簡易的なマルチスレッドであり、各スレッドはノンプリエンプティブ(あるタスクがCPUを専有している間は他の処理を開始できない)です。
今回はこのライブラリを用いて、Arduinoにマルチスレッド的な動作を組み込みます。

# 環境
* Arduino UNO
* Sparkfun Wireless Motor Driver Shield
* サーボ：SG90

# ライブラリ導入
1. [このページ](https://playground.arduino.cc/Code/TimedAction/)の"Download here: Attach:TimedAction-1_6.zip"からzipをダウンロード&解凍。中身をarduinoIDEのライブラリディレクトリに入れてください。
2. このままですとコンパイル時にエラーが出る場合があるので、1で配置した中身のTimedAction.hの`#include "WProgram.h"`を`#include "Arduino.h"`に変更してください。

# コード
サーボは2秒毎に反転動作、LEDは3秒毎にLチカさせてます。

```c
#include <TimedAction.h>
#include <Servo.h> 

Servo swivel;

#define ledPin 13
boolean ledState = false;
boolean servoState = false;

void blink();
void toggle_servo();

TimedAction ledAction = TimedAction(3000,blink);
TimedAction servoAction = TimedAction(2000,toggle_servo);

void setup(){
  delay(5000);
  pinMode(ledPin,OUTPUT);
  digitalWrite(ledPin,ledState);

  swivel.attach(11); // Attach servo to pin 11
  swivel.write(90); 
}
 
void loop(){
  ledAction.check();
  servoAction.check();
}

void blink(){
  ledState ? ledState=false : ledState=true;
  digitalWrite(ledPin,ledState);
}

void toggle_servo(){
  servoState ? servoState=false : servoState=true;
  if (servoState){
    swivel.write(90); 
  }else{
    swivel.write(100); 
  }
}
```

# 動作検証
サーボは2秒毎、LEDは3秒毎に動作をしています。

https://youtu.be/4L-wklxXh14

# 今後
[ここ](https://create.arduino.cc/projecthub/AkashKollipara/preemptive-multitasking-scheduler-for-avr-e985fd)でプリエンプティブな実装を行っているので、試したいです。

# Haskellによる実装
以下にてHaskellのAtomライブラリを使用した並列処理を掲載しています。
https://zenn.dev/4ergfbv547uezdf/scraps/2fe2002b0ebfb0
コード載せていないですがArduinoでも利用可能でした。ただしこのライブラリの難易度は超高いです。

# 参考サイト
https://playground.arduino.cc/Code/TimedAction/
https://learn.sparkfun.com/tutorials/wireless-motor-driver-shield-hookup-guide/all
Use of undefined constant 〇〇 - assumed '〇〇' (this will throw an Error in a future version of PHP)のエラー

# 問題
```
Use of undefined constant 〇〇 - assumed '〇〇' (this will throw an Error in a future version of PHP)
```
というエラーに遭遇した。

# 解決法
英語で書いてあるとおり
上記の〇〇の部分を '' や ”” で囲っていないことが原因なので確認をする
Pythonの主な使い方

今回はPythonの汎用性について僕が認識したことを紹介します。
Pythonとはwebアプリケーションからデスクトップアプリ、データ解析、機械学習などさまざまな分野で使われているプログラミング言語です。
とても便利だと思ったのが、webサイトなどを作るだけでなく手動でやっていたことを自動でできることです。
PyythonはAIを扱えるため、面倒な作業を自動化させることができ、マーケティングなどにも役立ち、ビジネスに非常に活かせそうだと感じました。
ggplot2でメタアナリシス~図の記載~

# 目的
初投稿、かつRビギナーです。Rでggplot2を使うことが多いのですが、グラフが多くなるほどやり方を忘れてしまう。。そんな自分の備忘録のために記載しております。（基本的すぎる、、、のはご了承ください）

# 今回作りたいグラフ
メタアナリシスでよく見られる、薬剤効果比較の図です。意外と忘れてしまうのです。。medianと90%信頼区間について記載することとする。

## ライブラリの読み込みと作業ディレクトリの設定 ##
ggplot2を内包しているtidyverseを読み込み、作業ディレクトリを設定。

```R
library(tidyverse)
dir.work = "~/Desktop"
setwd(dir.work)
```

## データセット
まず仮にデータセットを以下とする。minは5%、maxは95%値とする。ggplot用のデータとして、データフレーム化して、各要素をas.numericで数値型に戻すだけでは数値変更が起こるっぽいから、文字系で固定した後に数値に直す。

```R
drugname <- c("Drug1","Drug2","Drug3","Control")
median <- c("5","10","2","0.2")
min <- c("2","6","0.5","0.1")
max <- c("7","14","3.5","0.3")
df <- cbind(drugname, median, min, max)
df <- as.data.frame(df)
df$median = as.numeric(as.character(df$median))
df$min = as.numeric(as.character(df$min))
df$max = as.numeric(as.character(df$max))
df$y = as.numeric(as.character(df$y))
df <- df[order(df$median,decreasing=T),]
```





## ggplot2で書いてみる 
基本線はx軸展開するように、geom_point, geom_errorbarhで記載。y軸は消去、x=0のラインを強調するため、geom_vlineを使用する。y軸はelement.blank()で消去。

```R
ggplot()+
  xlab("drug effect")+
  ggtitle("test") +
  theme(plot.title = element_text(hjust = 0.5),axis.title.y = element_blank(),legend.position = "right") +
  scale_y_discrete(breaks=NULL) +
  scale_x_continuous(breaks = seq(0,15,by=3), limits=c(0,15)) +
geom_errorbarh(data=df,aes(y=y,xmin=min,xmax=max,group=drugname),size=0.2,height=.2)+
  geom_point(data=df,aes(x=median,y=y,colour=drugname),size=4) +
  geom_vline(aes(xintercept=0), lty=2)+
  ggsave("test.png",dpi = 100, width = 6.4, height = 4.8)
```

## 結果
メタアナリシスの薬剤比較的なテンプレが描けた。
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/582342/62a0076e-6745-5c82-d62d-9ad20b77e3d7.png)



## 備考
1. ggplotの部分で名前を書いたりするのは面倒。やはり最初にデータ名称などは定義したほうがいい。図を修正するときがめんどっちい。
2. ggplotをそのまま使うとdrugnameで昇順になるが、medianで昇順にしないと見にくい。aes部分にreorderを使う必要あり。

# 最後に 
初投稿なので記載がよくわからず書いておりました。もう少しうまくかけるように努力します。。でもQiitaいいですね、自分の整理のためにも活用して見ます。
【Python】リスト(配列)内要素の操作【追加・削除】

#はじめに
リストを扱う上で重要な**追加と削除**の方法をまとめました。
基本的に以下のようなコードでコードと出力結果を記載します。

```ex.py
code = 'コード'
print(code)
# code(出力結果)
```



#リスト（配列）に要素を追加するappend, extend, insert
Pythonでlist型のリスト（配列）に要素を追加したり別のリストを結合したりするには、リストのメソッド`append()`, `extend()`, `insert()`を使う。そのほか、+演算子やスライスで位置を指定して代入する方法もある。

・末尾に要素を追加: append()
・末尾に別のリストやタプルを結合（連結）: extend(), +演算子
・指定位置に要素を追加（挿入）: insert()
・指定位置に別のリストやタプルを追加（挿入）: スライスを使う


###・append()・・・末尾（最後）に要素を追加できる。

```append().py
l = [0, 1, 2]
print(l)
# [0, 1, 2]

l.append(100)
print(l)
# [0, 1, 2, 100]

l.append('new')
print(l)
# [0, 1, 2, 100, 'new']

l.append([3, 4, 5])
print(l)
# [0, 1, 2, 100, 'new', [3, 4, 5]]
```

###・extend()・・・末尾（最後）に別のリストやタプルを結合できる。
 
```extend().py
l = [0, 1, 2]

l.extend([100, 101, 102])
print(l)
# [0, 1, 2, 100, 101, 102]

l.extend((-1, -2, -3))
print(l)
# [0, 1, 2, 100, 101, 102, -1, -2, -3]

#append()と違って一文字ずつ格納される
l.extend('new')
print(l)
# [0, 1, 2, 100, 101, 102, -1, -2, -3, 'n', 'e', 'w']

#extend()メソッドではなく+=でも可。
l += [5, 6, 7]
print(l)
# [0, 1, 2, 100, 101, 102, -1, -2, -3, 'n', 'e', 'w', 5, 6, 7]

```


###・insert()・・・指定した位置に要素を追加（挿入）できる。第一引数に位置、第二引数に挿入する要素を指定する。先頭（最初）は0。負の値の場合、-1が末尾（最後）の一つ前となる。

```insert().py
l = [0, 1, 2]

l.insert(0, 100)
print(l)
# [100, 0, 1, 2]

l.insert(-1, 200)
print(l)
# [100, 0, 1, 200, 2]

l.insert(0, [-1, -2, -3])
print(l)
# [[-1, -2, -3], 100, 0, 1, 200, 2]
```

###・スライスで範囲を指定して別のリストやタプルを代入すると、すべての要素が追加（挿入）される。

```insert().py
l = [0, 1, 2]

l[1:1] = [100, 200, 300]
print(l)
# [0, 100, 200, 300, 1, 2]

l[1:2] = [100, 200, 300]
print(l)
# [0, 100, 200, 300, 2]
```

#リスト（配列）の要素を削除するclear, pop, remove, del
Pythonでlist型のリスト（配列）の要素を削除するには、リストのメソッド`claer()`, `pop()`, `remove()`を使う。そのほか、インデックスやスライスで位置・範囲を指定して`del`文で削除する方法もある。

・すべての要素を削除: clear()
・指定した位置の要素を削除し、値を取得: pop()
・指定した値と同じ要素を検索し、最初の要素を削除: remove()
・インデックス・スライスで位置・範囲を指定して削除: del

###・clear()・・・全ての要素を削除する

```clear().py
l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

l.clear()
print(l)
# []
```

###・pop()・・・リストのメソッドpop()で、指定した位置の要素を削除し、その要素の値を取得できる。

```pop().py
l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print(l.pop(3))
# 4

print(l.pop(-2))
# 8

#引数を省略して位置を指定しない場合は、末尾（最後）の要素を削除する
print(l.pop())
# 9
```

###・remove()・・・リストのメソッドremove()で、指定した値と同じ要素を検索し、最初の要素を削除できる。

```remove().py
l = ['Alice', 'Bob', 'Charlie', 'Bob', 'Dave']

l.remove('Alice')
print(l)
# ['Bob', 'Charlie', 'Bob', 'Dave']
```

###・del・・・削除したい要素をインデックスで指定する。先頭（最初）は0で、末尾（最後）は-1。

```del.py
l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

del l[6]
print(l)
# [1, 2, 3, 4, 5, 6, 8]

del l[-1]
print(l)
# [1, 2, 3, 4, 5, 6, 7, 8]

#スライスで範囲を指定すると、複数の要素を一括で削除できる
del l[2:5]
print(l)
# [0, 1, 5, 6, 7, 8, 9]
```

#最後に
他にも何か方法が解法があれば教えてもらえると嬉しいです。
ディレクトリ構成を出力するtreeコマンドをMacOSで実行してみた

`tree`コマンドを導入することで、以下のようにディレクトリ構成を一目で確認することが可能です。

```zsh
% tree
.
├── sample1-1.txt
├── sample1-2.txt
└── sampleDir2
    ├── sample2-1.txt
    ├── sample2-2.txt
    ├── sample2-3.txt
    └── sampleDir3
        └── sample3-1.txt
```

# Homebrew導入
[Homebrew](https://brew.sh/index_ja) が入っていない人は、最初に [Homebrew](https://brew.sh/index_ja) をインストールしましょう。

### Homebrewのインストール

```zsh
% /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

### Homebrewバージョン確認

```zsh
% brew -v
Homebrew 2.2.5
Homebrew/homebrew-core (git revision 1252; last commit 2020-02-08)
Homebrew/homebrew-cask (git revision d266c; last commit 2020-02-09)
```

### 最新バージョンをインストール

```zsh
% brew update
```

# treeコマンド導入
以下のコマンドを実行して`tree`コマンドをインストールします。

### treeコマンドインストール

```zsh
% brew install tree
```

これで導入は完了。

# treeコマンドの使用方法
構成を確認したいフォルダに`cd`コマンドで移動したあと、`tree`コマンドを実行します。

```zsh
% tree [オプション] [ディレクトリ...]
```

## 使用例
ディレクトリ **sampleDir1** の構造を`tree`コマンドで見てみます。
以下の`.`は **sampleDir1** を表しています。

```zsh
% tree
.
├── sample1-1.txt
├── sample1-2.txt
└── sampleDir2
    ├── sample2-1.txt
    ├── sample2-2.txt
    ├── sample2-3.txt
    └── sampleDir3
        └── sample3-1.txt
```

### -dオプション（ディレクトリのみ表示）
```zsh
% tree -d
.
└── sampleDir2
    └── sampleDir3
```

### -Lオプション（表示する深さを指定）
```zsh
% tree -L 1
.
├── sample1-1.txt
├── sample1-2.txt
└── sampleDir2

1 directory, 2 files
```

### -Pオプション（条件に一致したファイルを表示）
```zsh
% tree -P "sample2*"
.
└── sampleDir2
    ├── sample2-1.txt
    ├── sample2-2.txt
    ├── sample2-3.txt
    └── sampleDir3
```

### -uオプション（ファイルの所有者を含めて表示）
```zsh
% tree -u
.
├── [username ]  sample1-1.txt
├── [username ]  sample1-2.txt
└── [username ]  sampleDir2
    ├── [username ]  sample2-1.txt
    ├── [username ]  sample2-2.txt
    ├── [username ]  sample2-3.txt
    └── [username ]  sampleDir3
        └── [username ]  sample3-1.txt

2 directories, 6 files
```

### -gオプション（ファイルの所有グループを含めて表示）
```zsh
% tree -g
.
├── [staff   ]  sample1-1.txt
├── [staff   ]  sample1-2.txt
└── [staff   ]  sampleDir2
    ├── [staff   ]  sample2-1.txt
    ├── [staff   ]  sample2-2.txt
    ├── [staff   ]  sample2-3.txt
    └── [staff   ]  sampleDir3
        └── [staff   ]  sample3-1.txt
```

### -sオプション（ファイルのサイズ（バイト数）を含めて表示）
```zsh
% tree -s
.
├── [          0]  sample1-1.txt
├── [          0]  sample1-2.txt
└── [        192]  sampleDir2
    ├── [          0]  sample2-1.txt
    ├── [          0]  sample2-2.txt
    ├── [          0]  sample2-3.txt
    └── [         96]  sampleDir3
        └── [          0]  sample3-1.txt
```

### -Dオプション（ファイルの更新時刻を含めて表示）
```zsh
% tree -D
.
├── [Feb  9 16:48]  sample1-1.txt
├── [Feb  9 16:48]  sample1-2.txt
└── [Feb  9 16:49]  sampleDir2
    ├── [Feb  9 16:49]  sample2-1.txt
    ├── [Feb  9 16:49]  sample2-2.txt
    ├── [Feb  9 16:49]  sample2-3.txt
    └── [Feb  9 16:49]  sampleDir3
        └── [Feb  9 16:49]  sample3-1.txt
```

# 参考
[【 tree 】コマンド――ディレクトリをツリー状に表示する](https://www.atmarkit.co.jp/ait/articles/1802/01/news025.html)
Safariで別ページからのページ内リンクの位置がずれる問題はJSの影響だった

スマートフォンのコーディングをしていた時、
別ページからのページ内リンクを実装していたら、
一部リンクのみ勝手に1000pxくらい下にスクロールされて、位置がずれてしまった。

すでに実装してあったJSを全て削除してから試してみると、ちゃんと動いたので、
JSの機能を一つずつコメントアウトしてクリックを試してみたところ、
bxSlider部分が影響していることがわかった。

※bxSlider（スライダープラグイン）
https://bxslider.com/

## 原因
PCのChromeのエミュレーターは、bxSliderが整形し終わった後の高さを見込んでページ内リンクの位置を割り出すのに、
SafariはbxSliderが**整形する前**の高さを元にページ内リンクの移動をするようで...。

![bxSlider 整形前](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40940/19fbe76f-af0c-39c6-d183-2141b260a4dc.png)
![bxSlider 整形後](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40940/a9f040e9-c6d1-34c8-9119-ba85dfacd7ad.png)


## どう対処したか
bxSlider部分を囲んでいるタグに、整形後を見込んだ`height`と`overflow: hidden;`を前もってかけておくと、
bxSliderの整形での高さのずれが出にくく、解決しました！


```css
.section-member-list-wrap { /* スライダーするリストを囲うタグのclass */
    height: 235px;
    overflow: hidden;
}
```

### その他の抜粋ソースコード

```html
<nav>
    <ul>
        <li><a href="/index.html">Top</a></li>
        <li><a href="/index.html#vision">Vision</a></li>
        <li><a href="/service.html">Service</a></li>
        <li><a href="/index.html#company">Company</a></li> <!-- ←問題のリンク -->
    </ul>
</nav>

<section>
// コンテンツ内容は略
</section>

<section id="vision"> <!-- ←ここへはちゃんとたどり着く -->
// コンテンツ内容は略
</section>

<section>
    <div id="js-list-member" class="section-member-list-wrap">
        <ul class="list-member">
            <li>
                <figure><img></figure>
                <h3>名前1</h3>
            </li>
            <li>
                <figure><img></figure>
                <h3>名前2</h3>
            </li>
            <li>
                <figure><img></figure>
                <h3>名前3</h3>
            </li>
</section>

<section id="company"> <!-- ←ここはずれる -->
// コンテンツ内容は略
</section>

```

```javascript
jQuery(function () {
    'use strict';

    // bxSlider
    jQuery('#js-list-member .list-member').bxSlider({
        mode: 'horizontal',
        moveSlides: 1,
        slideMargin: 12,
        infiniteLoop: true,
        slideWidth: 154,
        minSlides: 3,
        maxSlides: 3,
        speed: 300,
        pager: false,
        controls: false,
    });
});
```


### 動作確認環境
iOS 13.3 Safari
sympyでグラフを重ねる

# sympyでグラフを重ねる
sympyで数式をプロットするとき、重ねて表示する方法

```python
import sympy as sym
sym.init_printing()
```
## その１
```python
sym.var("x")
expr = 1/(1+ sym.exp(-x))

ax1 = sym.plot(expr, line_color="blue", show=False)
ax2 = sym.plot(expr.diff(x), line_color="red", show=False)
ax1.extend(ax2)
ax1.show()
```
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117425/7e5f4eb9-aa03-6924-95d0-e49c5fa7dc56.png)

## その２
```python
sym.var("x")
expr = 1/(1+ sym.exp(-x))

ax1 = sym.plot(expr, expr.diff(x), legend=True, show=False)
ax1[1].line_color="red"
ax1.show()

```
`legend=True`で凡例が表示される。

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117425/f7a86762-5012-8d98-96ca-096efe07f63e.png)
ルーティングは設定しているのにLaravelで404NotFound


##1.現象

ルーティングの記述はlaravelの/routes/web.phpに確かに存在しているのに
404 Not Found nginx/1.17.8になってしまう。

![スクリーンショット 2020-02-09 16.51.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244070/c1be02a5-6a56-75c1-8e84-e072645d9631.png)

ルーティングはこちら

```routes/web.php
Route::get('/index', 'HelloController@index');
```


php artisan route:list
でみてもあるんだよなあ

![スクリーンショット 2020-02-09 16.57.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244070/de05d676-c935-ac94-3494-e34d7aa3391b.png)


##2.バージョン
PHP7.2
laravel5.8
docker使用


##3.解決方法

どうやらdefault.confのnginxの設定がうまく行ってなさそう

```default.conf
server {
  listen 80;
    index index.php index.html;
    root /var/www/public;

  location / {
    root /var/www/public;
    index  index.html index.php;
    }

  location ~ \.php$ {

    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
  }
}
```


試したところ、以下ではルートディレクトリ"/"しか表示できなかった。
この以下のlocation部分を変更してみる

```
  location / {
    root /var/www/public;
    index  index.html index.php;
    }

```

以下のように変更してファイルやディレクトリを探して、なければ、
/index.php$query_stringで内部リダイレクトさせてみる


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


こうしました。

```default.conf
server {
  listen 80;
    index index.php index.html;
    root /var/www/public;

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

  location ~ \.php$ {

    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
  }
}

```


変更後再度、docker-compose up -dを実行
表示できました〜

###4.参考

他の方が詳しい記事を書いていました。
https://qiita.com/k_hoso/items/33ccb5e02e73a244ed31
https://teratail.com/questions/182086
[Amazon Workspaces]mysqlclientのインストール

# 環境

Amazon WorkSpaces
Amazon Linux release 2 (Karoo)

# 注意事項

Amazon WorkSpacesの環境は、最初からMariaDB 5.5が入っています。
削除しようとすると途中で落ちて接続できなくなり、Workspacesの
再構築が必要なります。

# インストール


```
# Python3のインストール
sudo yum install python3
cd
python3 -m venv ~/myvenv/

# mariadb.repo追加
$ sudo tee /etc/yum.repos.d/MariaDB.repo <<EOF
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF

# python3-devel MariaDB-devel MariaDB-sharedのインストール
# Python2を使う場合は、python3-develではなくpython-develをインストール
$ sudo yum install -y python3-devel MariaDB-devel MariaDB-shared

$ yum list installed | grep mariadb

MariaDB-common.x86_64                 10.4.12-1.el7.centos           @mariadb   
MariaDB-compat.x86_64                 10.4.12-1.el7.centos           @mariadb   
MariaDB-devel.x86_64                  10.4.12-1.el7.centos           @mariadb   
MariaDB-shared.x86_64                 10.4.12-1.el7.centos           @mariadb   

# 仮想環境に切り替え
source ~/myvenv/bin/activate

# mysqlclient
pip install mysqlclient
```

# 参考URL

[mysqlclient](https://pypi.org/project/mysqlclient/)
[Python3でMariaDB(MySQL)に接続する方法](https://kagasu.hatenablog.com/entry/2018/02/05/200403)
[jessieからstretchへのアップデートでlibmysqlclient-devはdefault-libmysqlclient-devへと生まれ変わったのだ...](https://jumpyoshim.hatenablog.com/entry/the-solution-that-libmysqlclient-dev-has-no-installation-candidate)
[CentOS環境でMariaDB利用するのためにmysqlclientでインストールする方法](https://shimi-dai.com/python-install-mysqlclient-on-centos/)
[Django: macOSでのpip install mysqlclient エラーの解決法](https://yukun.info/pip-install-mysqlclient-error/)
[CentOS7でmysqlclientがインストールできない](https://teratail.com/questions/182153)
[【Python】mysqlclientをpipでインストールしようとしたら躓いた話](https://gametech.vatchlog.com/2019/05/07/python-mysqlclient-install/)
[Ubuntuでmysqlclientのインストールに失敗する。](https://ja.stackoverflow.com/questions/54881/ubuntu%E3%81%A7mysqlclient%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%AB%E5%A4%B1%E6%95%97%E3%81%99%E3%82%8B)
[pip install mysqlclientのエラーerror: command ‘gcc’ failed with exit status 1の直し方](https://knym.net/pip-install-mysqlclient-error/)
no sdk specified error in rubymine の 解決

Macを再起動すると
no sdk specified error in rubymine というエラー。

解決していく

## 原因

初めてディレクトリを作成(開く)際、`.idea` ファイルが作成される。
階層が違うところで開き直すと、 `.idea` ファイルの参照元がおかしくなり、結果的にバグる？

原因を追求するのに時間がかかり、何度もリモートからcloneする羽目になった。
毎回同じタイミングでエラーが発生せず、再起動した後などでたまにおきていた。

例えば、

`User/bob/Rails/project/` という階層があったとする。
その際 `project`ではなく `Rails`から、気づかずに開いてしまった。
普段はprojectから使っているつもりで、ある日再起動すると、.ideaの整合性が取れなくなる。

という仮説。詳しい原因は調査中だが、下記の方法3つで数回治った。


## 方法① [No SDK selected] を変更する

詳細は下記記事参照

[[RubyMine]No Rails found in SDK というエラーが出た](https://qiita.com/minami1389227/items/f0cdbdd724798ef6c69d)

## 方法② キャッシュを消してリスタート

詳細は下記記事参照

[IntelliJ Ideaのキャッシュを消す方法](https://qiita.com/kmdsbng/items/705b8637b9b367040b01)

## 方法③ .idea を消す

詳細は下記記事参照

[RubymineでRailwaysが表示されなくなった時の対処法](https://qiita.com/knxrvb/items/83b51e080da347f20cc6)

最終手段で消すのは自己責任でお願いします。
fast.aiのopen_imageで読み取った画像をplt.imshow()で表示する

環境:colab

```python
!curl https://course-v3.fast.ai/setup/colab | bash
%reload_ext autoreload
%autoreload 2
%matplotlib inline

from fastai.vision import *
from fastai.metrics import error_rate
from torchsummary import summary
import numpy as np

img = open_image('a.JPG')
a = image2np(img.data)
plt.imshow(a)
```

参考
https://docs.fast.ai/vision.image.html#open_image
https://qiita.com/lilacs/items/abac45188daf8277489a
UTIを調べるCLIツールをSwiftで作ったメモ書き

## UTIって何？
> Uniform Type Identifier（UTI）はデータ（エンティティ）のタイプ（種類、型）を一意に識別する文字列である。  [Wikipedia](https://ja.wikipedia.org/wiki/Uniform_Type_Identifier)

UTI調べて`public.jpeg`であれば、a.jpegファイルでb.jpgであろうとJPEGファイルということがわかる。

## UTI調べて何するの?
作ろうとしていたツールで、NSOpenPanelから拡張子が特定ものだけしか選択できないようにしたかった結果、UTIを指定する必要があった。

Apple独自の拡張子とかは特にUTIがわからないので、困りがち。
`movie.mov`はUTIが`com.apple.quicktime-movie`だったりするし…。

## なんでCLI作ったん?
プログラムでUTIを調べることは簡単にできたものの、UTI必要になったタイミングでそのプログム毎回buildするの？って思ったら面倒じゃん。何回も調べるかと言われたらわからないけど、terminalでファイルを引数に渡してすぐ調べられた方が楽じゃん。と思って、CLI作った。

## CLIの作り方(Swift製)
* [Swift Package Manager (SwiftPM) で作るコマンドラインツール](https://qiita.com/mono0926/items/e8fdd97115780204f797)
* [Swiftでコマンドラインツール作成の誘い](https://qiita.com/gibachan03/items/bd78fff12977fbce29d1)

この2つでほぼ問題なく出来る。

install方法は、`make install`でやりたかったので、以前お世話になった[Simulators](https://github.com/fromkk/Simulators/blob/master/Makefile)を参考に必要部分だけ変更して作成。

上記内容を参考に作っていたけど、release buildしたものを実行しようとすると次のerrorが出て上手くいかなかった(`suti`は今回作ったCLIのbin名)

```shell
dyld: Library not loaded: @rpath/libswiftCore.dylib
  Referenced from: /usr/local/bin/suti
  Reason: image not found
```

調べた結果、buildの仕方が変わって

```sh:❌before
swift build -c release -Xswiftc -static-stdlib
```

```sh:⭕️after
swift build -c release
```

となる。

Swift Forumの[How to \`Always Embed Swift Standard Libraries\`?](https://forums.swift.org/t/how-to-always-embed-swift-standard-libraries/29937)に書いてあった。

## SUTI
そして出来上がったのが、[`SUTI`(Search Uniform Type Identifierの略)](https://github.com/sho-ito-1027/SUTI)

```sh:example
$ suti ~/Desktop/sample.jpg
UTI is public.jpeg
```

#### 注意点
* 10行レベルのコードなのでテストコード書いてない
* UTI調べていて、1点問題があって、**拡張子の偽装は見抜けない。**

元が`a.jpeg`のファイルの拡張子を変えて`a.png`としてsutiに渡したところ

```sh:
UTI is public.png
```

と表示されてしまった。あくまで、拡張子からUTIを判別することしか出来ない。

ただ、これでApple独自の拡張子からUTIを調べられるようになった。