OmniAICreator/Qiita-1.07M huggingface dataset:
実行計画を改善する時のプチメモ

本記事は東京学芸大学 櫨山研究室 Advent Calendar 2020の十二日目の記事になります．
初めて記事を書きます。暖かい目でご覧ください。

## はじめに
開発中、処理スピードや効率について考えずに「動いたらヨシ！」とすることが多かったのですが
mapper（SQL文）の修正を大幅にする機会があり、SQL文の良し悪しについて先輩に教えていただきました。
その際の教わったことや感じたことをメモに残します。
ただただSQL文を書いて、動いた〜となっている人に向けた記事です。

## 概要

前述した通り、SQL文はただ動けばいいと思ってたのですが、
・扱うデータ量が増える
・アクセス数が増える
などでSQL文の良し悪しは運用に大きく影響するとわかりました。
逆に言えば、SQL文を改善することで処理スピードが上がったり効率がよくなったりします。

この記事では、
・SQL文の実行計画を見る方法
・そのSQL文は改善余地があるか
・改善余地がある場合どう改善すべきか
を述べていきます。

## SQL文の実行計画

MySQLには実行計画というものがあります。
この実行計画は、自身が今作成しているSQL文の先頭に "EXPLAIN" とつけて実行するだけで見れます。
例えば

```sql
SELECT * FROM user_table JOIN book_table ON user_table.id = book_table.user_id WHERE book_table.status = 1;
```

というSQL文を調査するときは

```sql
EXPLAIN SELECT * FROM user_table JOIN purchase_table ON user_table.id = purchase_table.user_id WHERE user_table.purchase_count > 0;
```

これをMySQL上で実行するとMySQLが以下のような表を出してくれます。


![スクリーンショット 2020-12-12 22.31.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249753/7f5703b6-c1f1-f5c1-d63a-fe919949f6a0.png)

これが実行計画です。
それぞれの項目には意味があるのですが、詳しくは以下の記事を参考にしてください。
https://qiita.com/kzbandai/items/ea02727f4bb539fcedb5

## 改善可能か？

SQL文はやりたいことが複雑になればなるほど長くなり改善ポイントも多くなります。
ただ、長くてもそのSQL文が最善である可能性もあります。
そこで、自分のSQL文が改善する余地があるのか？を知るためのポイントを紹介します。

### 項目ごとにチェックする
type - ALLと表示されてるとよくない（全文検索になっている）
key - NULLじゃないほうがいい（クエリが絞れていない）
Extra - using file sortがでているとよくない（diskに書き込んだ後データをソートしている）

単純すぎるSQLだと、クエリの指定をする必要がなかったり
複雑すぎるSQLだと、using file sortがどうしても消せなかったりなどがありますが
基本的には、この項目に当てはまるものがあれば改善は可能です。

## 改善の仕方
### indexの作成
既存の２つのテーブルの中間にもう１個テーブルを作るような感覚です。
例えば、全文検索をするにしても、indexの中で値が降順に並べられていると検索効率が良くなります。
ですが、indexはSQL文を実行するたびに見るので、作りすぎは注意です。
(indexの作成の仕方は検索してください)

### クエリの指定
単純に検索対象が減ります。
SQLの実行順序のなるべく先の方で指定すると、その後の処理も楽になります。


これらを試し、SQL文を修正するたびにEXPLAINで実行計画を見てMySQLの負荷を減らしていきます。

## 終わりに

改善ポイントについても私の知らない部分があるかもしれませんが、
手始めにここをチェックすればいいのかぐらいの気持ちで捉えていただけるとありがたいです。

SQL文は書きっぱなしにせず、実行計画を見てよりいいSQL文に修正していきましょう。（私も気をつけます）
拙い記事ですが、読んでいただきありがとうございました。
【UiPath】Advent of UiPath 2020 #3（ファイルをダウンロードしてメール送信）

この記事は、UiPath Forum で行われている [**Advent of UiPath 2020**](https://forum.uipath.com/t/advent-of-uipath-2020/273299) の [Advent Challenge #3](https://forum.uipath.com/t/advent-challenge-3/274335) の紹介記事です。

:christmas_tree: 過去の投稿

- [Advent of UiPath 2020 #1（APIからデータを取得）](https://qiita.com/miya_g/items/4021ba90aab84984cb3c)
- [Advent of UiPath 2020 #2（正規表現で文字列を抽出）](https://qiita.com/miya_g/items/087a9d5d29145ae3e33e)

# “Advent of UiPath 2020” とは何か？

- 英語版のフォーラムで投稿されています。
- RPA challenge です（＝お題を出て、みんなでRPA化してみる）
- 誰でも回答できます（フォーラムのアカウントがあれば）
- 3日おきに出題され、計8回（xmasイブまで）あります
- 回答して上位に選ばれれば、フォーラム上でスターがもらえます。
- フォーラムのスタッフが開催しているっぽいです。

# チャレンジ3：ネットからファイルをダウンロード

バンコクへの旅を終え、サンタはコペンハーゲンで素敵な滞在をしました。
翌日、サンタは寝坊し、ホテルをチェックアウトするために急いでいました。
その時に、サンタはは私たちの「願い」を書いた本を忘れてきてしまいました！
幸運にも、彼はいつもクラウドにバックアップを取るようにしていました。
彼は今、クラウドからバックアップを取り出そうとしていますが、助けがを必要です。
「願い」はすべてパスワードで保護されていますが、アクセスし、ファイルを取得するだけでOKです。
（サンタはロックを解除できますが、人々の願いを公開することでGDPRルールに違反するリスクを冒したくありません。） 
サンタがすべてのファイルを集めるのに手助けを求めています！彼を助けてくれませんか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/de25e765-0e2a-60b1-bc3a-68a1c9186477.png)

### 初心者用チャレンジ

サンタは、モバイルにバックアップファイルのリストを持っていました。
リストのファイルをダウンロードして、サンタのEメールアドレスに送信してください。

### 上級者向けチャレンジ

リストのファイルをダウンロードして、1つのアーカイブファイルにしてサンタのEメールアドレスに送信してください。

# 感想

今回は「ファイルダウンロード＆メールに添付して送信」というお題でした。
これも、業務で稀にあります。
リストファイルのCSVを読み取り、ループしながらURLにアクセスしてファイルをダウンロードし、結果をメールに添付して送信する感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/3e3d61af-2828-e76a-9c2a-8c89e579dfb6.png)

大量のファイルをダウンロードする場合や、ファイルサイズが大きい場合は、HTTPリクエストを並列処理にすると、トータルの処理時間が劇的に減ります。（空き／待ち時間を有効活用してくれるイメージ）

これと言って、ユニークな回答はなかったですが、ドラえもんを出している人がいました。
ドラえもんも「ロボット」ですもんね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/1d725ceb-af05-0dc9-2d42-392b8830e008.png)
【Nuxt.js】axiosでURLを共通化する

何かしらのapiを叩く時
共通している`'https://example.com/api/`の部分を毎回書くのは面倒

```javascript:


this.$axios.$get('https://example.com/api/posts')

...

this.$axios.$get('https://example.com/api/users')

```

# baseURLを設定する

`nuxt.config.js`でbaseURLを設定する

```javascript:nuxt.config.js  

...省略

  axios: {
    baseURL: 'https://example.com/api'
  },

...省略
```

#共通化できる

```javascript:

this.$axios.$get('/posts')

...

this.$axios.$get('/users')
Dronyを使いProxy下のAndroid端末でLINEを使う

## Dronyとは
HTTP, Socks ProxyをVPNとして接続するアプリです。
https://play.google.com/store/apps/details?id=org.sandrob.drony&hl=ja&gl=US

## 環境
- 認証付きProxy必須環境
- 22番ポートはProxyなしで通信可能
- AzureにSquidでHTTP proxyを構築済み

## 叩くコマンド
```
# 外のProxyサーバで行う
/etc/ssh/sshd_configの
GatewayPorts
をyesにする

# APにするPCで行う
ssh -gNfL 0.0.0.0:8888:localhost:8080 username@ipadress
sudo create_ap [無線LANデバイス名] [共有元デバイス名] --no-dnsmasq -d --ieee80211n --redirect-to-localhost [SSID] [パスワード] &
ip a (ap0のIPアドレスを確認する)
```
## 主な流れ
1. ` ssh -gNfL 0.0.0.0:8888:localhost:8080 username@ipadress`で0.0.0.0へAzureのHTTP proxyを持ってくる
2. ` create_ap`を活用して無線APを建てる
3. スマホでWi-Fiに接続する　　このとき，Proxyにはスマホ側のデフォルトゲートウェイをアドレスに設定します。
4. Deoniで先程と同様にProxyの設定をする

## create_apについて
実行してできる仮想ネットワークデバイスのIPアドレスは固定になります。
それがスマホ側のデフォルトゲートウェイになります。

## Dronyの設定
google, ブラウザ, Twitterなど元からHTTP proxyに対応しているアプリは`Direct`設定にすると正常に通信可能です。
LINE, Discord, InstagramなどHTTP proxyに非対応のアプリはVPN経由で通信しようとし，結果的にProxyを通せます。

## 犠牲にしたもの
VPNに繋がってしまう関係でKDE Connectが死にました。
Ruby のハッシュには 3 種類の記法がある，わけじゃない

Ruby の初心者向けの記事によく以下のような記述がありますが，間違いです。

> ハッシュには以下のように 3 種類の記法があります。
> {"foo" => 3, "bar" => 4}
> {:foo => 3, :bar => 4}
> {foo: 3, bar: 4}

二つ目と三つ目は同じハッシュを別の記法で書いていますが，一つ目はキーが文字列なので，記法が違っているのではなく，表しているモノが違います。

Ruby のハッシュは，キーとして文字列，シンボル，数値などさまざまなものが使えます。
そして，キーがシンボルの場合に限り，ハッシュ式においてキーと値のペアを指定する方法に二通りの記法がある，ということなのです。
なお，「ハッシュ式」というのは，上の例にあるような，`{ }` の中にキーと値のペアを列挙して Hash オブジェクトを表す式のことです。
Notionでデータベースのプロパティを非表示にする

アルプ株式会社でエンジニアをしています、集約のエンティティ@pictinyです。
これは[Notion Advent Calendar 2020](https://qiita.com/advent-calendar/2020/notion) 12日目のエントリです。
11日目は[Notionでインラインデータベースの表示件数を設定する](https://qiita.com/pictiny/items/a546656b59aa44a46696)でした。

# プロパティ
Notionのデータベースでデータが持つ項目のことを[プロパティ](https://qiita.com/pictiny/items/dba21dd5d226ac5b6849#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3)といいます。

## プロパティの表示設定
データベースのコンテンツをページ表示したとき、一部のプロパティを非表示にしたいことがあります。
プロパティを非表示にするには、プロパティ左のメニューから `Hide property` を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/7ee14614-205a-e0c8-3375-61128ccaafb5.png)

プロパティごとに、以下の3つから選択できます。

- 常に表示する `Always show`
- 空の場合に非表示にする `Hide when empty`
- 常に非表示にする `Always hide`

## ページのカスタマイズ
プロパティ左のメニューで `Customize page` を選択すると各プロパティの表示設定を一覧で表示できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/5cc0965a-95be-3527-0fe2-19ec9187661f.png)

このメニューでは表示設定の変更だけでなく、ドラッグアンドドロップで表示順を入れ替えることもできます。

# まとめ
公式ドキュメントは[Customize database pages](https://www.notion.so/Intro-to-databases-fd8cd2d212f74c50954c11086d85997e#da1fbdec66cf495ca5ee3327287c2009)にありますので、そちらもご覧ください。
「IE嫌いな方必見！！」IEからEdgeに強制リダイレクト。これでIE非対応でも大丈夫！

# どうも7noteです。IEに悩まされる日々はもう終わりにしましょう。

 

IEのことを考慮してプロパティを変えたり、使えないプロパティが存在したり、
そもそものタグ構造を変えなければいけない場面は多々ありました。

 

しかし、そんなIE主体のコーディングはもうおさらばできる時代になりました。

 

## IE11からEdgeに強制リダイレクトさせる方法

 

↓↓↓↓↓その方法はこちら！↓↓↓↓↓↓

 

### Microsoftに「変更してね」ってメールするだけ！！！

 

*え、そんな簡単なことでいいんですか？*



## IE11からEdgeにリダイレクトさせる手順

 

■ 以下の内容を「ietoedge@microsoft.com」宛てにメールする

 

- オーナー名
- 役職
- 電子メールアドレス
- 会社名
- 住所
- ウェブサイトアドレス

 


**以上。**

![mail_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/e40fb2e9-7e74-0f94-621c-92d85c191c69.png)

 

私も実際にまだやっていないので、以降の手順はわかりませんがマイクロソフトの公式サイトには以上の手順のみが掲載されています。

 

Microsoftのページ（英語）：https://docs.microsoft.com/en-us/microsoft-edge/web-platform/ie-to-microsoft-edge-redirection#request-an-update-to-the-ie-compatibility-list

メールを送ると、IE互換性リストに掲載されるようです。このリストに掲載されることで、リダイレクトの恩恵を受けることができるようです。
掲載されているWEBページは以下のURLから確認できます。

 

https://edge.microsoft.com/neededge/v1


## 注意点

windows10以降のOSであれば、Edgeが標準装備されているので気にする必要はありません。
問題があるとすれば、windows8.1以前で、かつIEしか入っていないユーザーには対応できないという点です。

➡windous7以降はEdgeをダウンロードできるので、どうしても見たい人は基本的にEdgeをダウンロードしてくれるはず。


**非検証の内容**
・IEしか入っていないPCでの挙動
・反映までの時間がどれくらいかかるか
 

## そもそもIE非対応に切り換える理由等について

 

ここについてはとても綺麗にまとめているサイトがあったので紹介したいと思います。

 

一部引用させていただくとWEB制作者としては、

 

>”そりゃサポートするしないで言えばした方がいい”というのは前提としてありまして。ただ、「IE11をサポートすることによって割に合わないコストが発生しかねないこと」「技術的制約のせいで、要望の実現が頓挫する可能性があること」「IE11自体が将来性のないブラウザであること」あたりを考慮すると、やらん方がいいのでは
引用元：https://ideacase.jp/please-kill-ie/#outline__4_1_2
 
全くもってこの通りかなと思います。
実際1%未満の利用者のために、開発の幅が狭まったり、開発コストがかかってしまうのであれば、残りの99%の人がより気持ちよく新しい体験ができるように開発を進めるほうが良いと考えます。

あくまで個人的な感想ですし、パブリックなサイトなどだれもが使えなければ困るようなサイトではよろしくないと思っています。
でも2025年まで待つ必要性はあるのでしょうか？私はそれよりも90%以上のユーザーがより気持ちよくサイトを利用していただけることを優先したいなと思います。

*「だって、appleやyoutubeもやってますから。やる理由なんてそれくらいでいいのかなと思ってます。」* 


>参考URL
https://webty.jp/staffblog/production/post-3436/
https://docs.microsoft.com/en-us/microsoft-edge/web-platform/ie-to-microsoft-edge-redirection#request-an-update-to-the-ie-compatibility-list
https://ideacase.jp/please-kill-ie/#outline__4_1_2


#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】HTML・CSSのちょいテク詰め合わせ](https://qiita.com/7note)
なでしこv1で音を扱う

いつもの通り、自分が悩んだ末にたどり着いた記録を残したいと思います。

この記事は、なでしこの**Windows版v1**で実行できるようにしています。今回はv3ブラウザ版では動きません。

# プログラムで音を扱う
「なでしこv1(Windows版)」では、音を扱う方法がいくつかあります。主に「音声ファイルを再生する」方法と、「プログラムで音を発生させる」方法に分かれます。

## (v1のみ) 音声ファイルを再生する
音声ファイルがある場合は`再生`という命令を使います。

```saisei.nako
「pinpon.wav」を再生。
```

相対パスの場合は、ソースファイル`saisei.nako`を保存したフォルダ内に、その音声ファイルを置きます。デスクトップにある音声ファイルを開く場合は、次のように`｛デスクトップ｝`を使います。

```saisei2.nako
「｛デスクトップ｝pinpon.wav」を再生。
```

## (v1のみ) BEEP
懐かしの？ビープ音もあります。

```
ＢＥＥＰ。
```

Windowsの警告音が鳴ると思います。

## (v1のみ) MMLを使う

もう一つの方法はMMLです。MMLの詳細は[別に譲ります](https://sakuramml.com/)が、なでしこv1では`MML再生`という命令を使うと、手軽に演奏できます。音階はアルファベット(CDE…)ではなく，カタカナで指定します。

```mml.nako
「ドレミファソラシ↑ド」をＭＭＬ演奏。
```

「　」の中で`音色`を使うと，音の種類を変えることができます。`ファ＃`(シャープ)や`シ♭`(フラット)で半音を指定します。伸ばす記号`ー`で音符を長くします。

```mml2.nako
「音色７４　ソソ↑ドレ　ミ♭レドー↓
　ラ♭ラ♭ソファ　ソーー」をＭＭＬ演奏。
```

子どもたちに「なでしこ」でプログラミング教室とか授業とかをやる場合は，このＭＭＬ演奏で「着信音（着信メロディ）」をつくってみよう！」と投げかけると，思いがけず盛り上がります。私たちガラケー世代は自分で着信音を入力しました（懐かしい！）が，現代っ子はスマホにダウンロード。だから，自分で音を作るのは面白いみたいです。

## (v1のみ) 数当てゲームに音を入れる

[前回](https://qiita.com/oza-jv/items/442f4a2c99880d0ba34a)の数当てゲームに，正解すると「ピンポン」，間違えると「ブー」という音が鳴ると，よりゲームっぽくなると思い，付け加えてみました（下の**#1**，**#2**，**#3**）。
ちなみにWindwos版v1限定です。Webブラウザ版v3ではできません。

```kazuate5-1.nako　(v1のみ)
サイコロ＝（６の乱数）＋１。
正解済＝０。

５回
　　もし、正解済＝０ならば
　　　　答え＝「｛回数｝回目　サイコロの目はいくつ？」と尋ねる。
　　
　　　　もし、答え＝サイコロならば
　　　　　　「正解！」と表示。
　　　　　　「シ８ソ」をＭＭＬ演奏。       // #1
　　　　　　正解済＝１。
　　　　違えば
　　　　　　もし、答え＞サイコロならば
　　　　　　　　「ド８ミ８」をＭＭＬ演奏。  // #2
　　　　　　　　「もっと小さいよ」と言う。
　　　　　　違えば
　　　　　　　　「ミ８ソ８」をＭＭＬ演奏。  // #3
　　　　　　　　「もっと大きいよ」と言う。
　　　　　　ここまで。
　　　　ここまで。
　　ここまで。
ここまで。
「正解は｛サイコロ｝でした。」と表示。
```

ここを音声ファイルでの演奏に変えることもできます。ここではpinpon.wavとbubu.wavという2つのファイルを用意したものとして作っています（下の*#4*と*#5*の部分）。

```kazuate5-2.nako　(v1のみ)
サイコロ＝（６の乱数）＋１。
正解済＝０。

５回
　　もし、正解済＝０ならば
　　　　答え＝「｛回数｝回目　サイコロの目はいくつ？」と尋ねる。
　　
　　　　もし、答え＝サイコロならば
　　　　　　「正解！」と表示。
　　　　　　「pinpon.wav」を再生。       // #4
　　　　　　正解済＝１。
　　　　違えば
　　　　　　「bubu.wav」を再生。         // #5
　　　　　　もし、答え＞サイコロならば
　　　　　　　　「もっと小さいよ」と言う。
　　　　　　違えば
　　　　　　　　「もっと大きいよ」と言う。
　　　　　　ここまで。
　　　　ここまで。
　　ここまで。
ここまで。
「正解は｛サイコロ｝でした。」と表示。
```

## 最後に
音が出ると，プログラミングをやっていて楽しくなってきます（私だけ？）。画像を扱うときはなんだか色々なことを考えなくてはいけないのですが，音はそこまで複雑ではないので，メディアの複合を学習する方にとっても，まずは音から始めるとよいのではないかと思いました。

じゃあ，ブラウザ版のv3では音は出ないのかということだったので，色々と試していますが，それはまた別の機会に書きたいと思います。

今回も、こんな記事が誰かの役に立つのだろうか…と思いながら、１人でもお役に立てばいいなと思います。

## 参考
- v1マニュアル(なでしこエディタ内蔵版) ※Web版のマニュアルからは削除されています。
[Swift] 関数　外部引数の省略

#はじめに
関数内の_について良く分からないままスルーして勉強していたので、まとめてみます。
短いですが、、、

#書き方
省略には外部引数に_を使用します。
関数を使う時も`関数（外部引数：　仮引数）`が`関数（実引数）`になります。

```swift
func sum(_ int1: Int, _ int2: Int) -> Int {
    return int1 + int2
}
let result = sum(1, 2)   //3
```
#参考文献
石川洋資・西川勇世、『[増補改訂第３版] Swift実践入門　直感的な文法と安全性を兼ね備えた言語』、技術評論社、２０２０年４月２８日、４５３ページ
Vueでフォームを表示せずに画像の更新を行う方法

## 結論

こんな感じ。色と配置は適当なので参考にしないでください。
[![Image from Gyazo](https://i.gyazo.com/4541461c8e23b1bf7b9589bd9d1e64df.gif)](https://gyazo.com/4541461c8e23b1bf7b9589bd9d1e64df)


<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="html,result" data-user="msickpaler" data-slug-hash="yLagYyb" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="image submit with vue">
  <span>See the Pen <a href="https://codepen.io/msickpaler/pen/yLagYyb">
  image submit with vue</a> by msickpaler (<a href="https://codepen.io/msickpaler">@msickpaler</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

```javascript
clearImage() {
  this.image = "https://i.gyazo.com/459b578735367db587a1193f9afe84da.png"
  document.getElementById('input_image').value = '' //忘れやすい
}
```
inputの値を初期化しないと、
画像選択→クリア→同じ画像選択
したときに2回目の画像選択でinputの値が変わらず@changeで発火しないのでちゃんと初期化しましょう。
nginx try_filesディレクティブ

nginx try_filesディレクティブ調べる。

try_filesディレクティブにはファイルを指定する。複数ファイルを指定することも可能。
左から指定されたファイルを探し、ファイルが存在した場合はそのファイルをレスポンスとして返す。
最後のパラメータはファイルではなくuriとして扱い、全てのファイルが存在しなかった場合はuriを使って内部リダイレクトを行う。

```
シンタックス
try_files file ... uri;
try_files file ... =code;
```

↓こうするとどのpathがきても/hoge/hoge.txtが返される。
index /hoge/hoge.txtのおかげ?でpathが/で終わる場合に/hoge/hoge.txtで内部リダイレクトする。
locationは/しか定義していないので再度/のlocationの処理が行われる。
try_filesでは$uriが指定されているので/hoge/hoge.txtのファイルを探しレスポンスとして返す。

```
        location / {
                add_header uri $uri;
                index /hoge/hoge.txt;
                try_files $uri /hoge/hoge.txt;
        }
```


```/var/log/nginx/error.log
2020/12/12 13:42:30 
[error] 1010#0: *164 rewrite or internal redirection cycle while internally redirecting to "////////////", 
client: 127.0.0.1, server: _, request: "HEAD / HTTP/1.1", host: "localhost"
```


公式
http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files
Ruby は 1 行ずつ読み込んで実行していく，わけじゃない

Ruby の初心者向け記事によく

> Ruby は C のようなコンパイラーではなくインタープリターです。プログラムを 1 行ずつ読み込んで実行していきます。

というような記述があります（記述のバリエーションはかなりある）。
間違いです。

正直なところ，この問題に関して私も完全に理解してるわけではありませんが，分かる範囲で誤解を解きたいと思います。

Ruby の処理系[^sh]がプログラムを実行する方式は，Ruby 1.9 以降とそれまでとで大きく違っています。

[^sh]: Ruby の処理系はいくつかありますが，ここでは最も普及している CRuby を前提とします。

どちらも，Ruby の処理系は，プログラムを読み込むと構文解析を行って，「抽象構文木」（AST: Abstract Syntax Tree）というものを構築します。

Ruby 1.9 未満では，出来上がった抽象構文木のノードを辿りながら処理を実行していきます（知らんけど）。

Ruby 1.9 以降は，抽象構文木を RubyVM という仮想機械の命令列（バイトコードと呼ぶ）に変換し，それを実行していきます。バイトコードへの変換は一種のコンパイルですね。

ですから，昔も今も，Ruby の処理系は「スクリプトを 1 行読み込んでは解釈して実行し，次の行を読み込んでは解釈して実行し，を繰り返す」などということはやっていませんし，Ruby 1.9 以降は一種のコンパイルも行っています。

さらに，Ruby 2.6 になると，JIT コンパイルという技術も導入されました[^jit]。
これは，RubyVM バイトコードの，頻繁に実行される箇所を実行中に C 言語に変換してコンパイルし，機械語にして実行する，という仕組みです（知らんけど）。

[^jit]: JIT は just-in-time の頭字語。

何だか難しいですね。私も分かりません。
ただ，「1 行ずつ読み込んで実行していく」が間違っていることだけ分かってもらえれば記事の目的は果たせました。
ついでに，近年，処理系の技術がものすごく向上・複雑化していて，何がインタープリターで何がコンパイラーか，素人には分からなくなっている，ということも言えそうです。

識者のツッコミ・助言を歓迎します。
[Swift] 関数の外部引数と内部引数

#定義
外部引数とは関数呼び出し時に使用する引数。
内部引数とは関数内で使用される引数。
#書き方
以下のコードは、外部引数をheightとwidthで内部引数をhとwにしています。
外部引数と内部引数の間は半角スペースを１つ開けます。
外部引数は関数を利用する側から見てわかりやすい名前を書き、
内部引数はプログラムが冗長にならない無駄のない名前を書くそうです。

```swift
func menseki(height h: Double,width w: Double) -> Double {
    return h * w / 2
}
let kekka = menseki(height: 6, width: 3)   //9
```
#メリット
関数を使う側には分かりやすく書けて、関数内では短かく書く事ができるので手間が省けるのかなと思います。
#参考文献
石川洋資・西川勇世、『[増補改訂第３版] Swift実践入門　直感的な文法と安全性を兼ね備えた言語』、技術評論社、２０２０年４月２８日、４５３ページ
Raspberry Piの共有フォルダにWindowsから接続(samba install)

# Raspberry PiのPublicフォルダを共有にする

### sambaをインストール

```
pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get install samba
```

### samba設定

```
pi@raspberrypi:~ $ sudo vi /etc/samba/smb.conf
```

ファイルの最後に以下を追記

```conf:/etc/samba/smb.conf
[raspberrypi]
   comment = Raspberry Pi
   path = /home/pi/Public
   public = yes
   guest ok = yes
   read only = no
   browsable = yes
   force user = pi
   strict sync = yes
```

### samba 再起動

```console
pi@raspberrypi:~ $ sudo service smbd restart
```

### IPアドレス確認

```console
pi@raspberrypi:~ $ ifconfig
(省略)
inet 192.168.1.74  netmask 255.255.255.0  broadcast 192.168.1.255
(省略)
```

# Windowsから接続

IPアドレスでアクセス。

Raspberry Piのデフォルト設定なら

* User name : pi
* Password : raspberry


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/8d5e7d29-8be3-8a02-f485-d3f612a6a694.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/664b7c92-f68e-e847-715d-bc909c35a671.png)
テキストエリアの文字列を置換して、欲しい形に処理する

#背景
本業で広告運用をしながら、勉強でプログラミングをしています。
indeedで運用する際に一部の手作業が面倒だと感じていた為、
アウトプットも兼ねて自動化してみました。

#問題点
indeedで広告運用すると、どの求人をアカウントに紐付けるかの設定が必要になります。
何も設定しなければ、公開してる求人全てが対象となります。
ただ、ほとんどの企業から要望があります。
その時に、依頼される求人数が多ければ、手作業が増えます。
（除外の設定のみで済むときもあります。）

###デフォルトで用意されてる機能
![スクリーンショット 2020-12-12 22.23.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213734/379cae68-5ee4-e7de-c03f-e608fd5fe772.png)

###直書きもできる
![スクリーンショット 2020-12-12 22.23.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213734/4ba2eced-8774-cca9-8ded-7fa7279d9873.png)

依頼求人が２０件なら、まだ手作業でも頑張れるけど、
それ以上になるとポチポチ入れるのが面倒でしかないです。

必要な形を一瞬で作成して、直書きの欄にコピペするのを作成しました。

#ソースコード
https://kwateru.github.io/indeed_job_ID_replace/
##HTML
```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="style.css" type="text/css">
    <title>indeed 求人紐付け</title>
</head>
<body>
        <textarea name="kyujin" class="input" cols="30" rows="10" placeholder="12345&#13;54321&#13;98765"></textarea>
        <button type="submit" value="送信" class="btn">送信&コピー</button>
        <textarea name="seikei" class="seikei" cols="30" rows="10"></textarea>
</body>

    <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
    <script src="main.js" type="text/javascript"></script>
</html>
```
簡単に入力する①テキストエリアと②ボタンと③出力先のテキストエリアを作成しました。
`placeholder`で例を提示してみたけど、デバイス？によっては改行してくれないことに気付きました。

##CSS
```css:style.css
.kyujin, .btn, .seikei{
    display: block;
}
```
最低限のみです。苦手すぎて・・・。今は、使えれば良いかなってことで。
後々、修正する予定です。

##js
```javascript:main.js
$(function(){

    var input = $('.input');
    var button = $('.btn');
    var result = $('.seikei');

    button.on('click', function(){

        var inputVal = input.val();

        // textareaの内容を改行で分割して配列に格納
        var inputValArray = inputVal.split('\n');

        // 各行に対して処理する
        var display = "";
        for(i = 0; i < inputValArray.length; i++){
            display += '"' + inputValArray[i] + '"' + "\n";
        }

        // 改行を「 OR 」に置換する
        var str = display.replace(/\r?\n/g, ' OR ')
        result.val('refnum:(' + str + ')');

        // copyする
        result.select();
    })

});
```

#不明なところ
###末尾に余分なORが出る
1234
4321
↑テキストエリアに入力して、処理すると、
refnum:("43141" OR "41241" OR "41412" OR )

###for文の理解
①display += '"' + inputValArray[i] + '"' + "\n";
②display = '"' + inputValArray[i] + '"' + "\n";
２だと１行目しか処理されないこと。

他にも色々あるが、上手く言語化出来ないので、
アウトプットを重ねていくしかない。
PAY.JPのAPIを用いたクレジット決済機能を実装（導入編）

前提として2018年6月からは、APIが提供する安全な処理を利用して、クライアントサイド側でカード情報を決済サービス側に送りトークン化し、そのトークン情報をサーバーサイドに送信して決済処理を行うことが義務付けられています。
つまり、アプリケーションのサーバーサイドにおいて、クレジットカード情報を保持しないようにすることが義務付けられました（※）。

※ 経済産業省. [改正割賦販売法について](https://www.caa.go.jp/policies/policy/local_cooperation/local_consumer_administration/meeting_001/pdf/meeting_001_180419_0017.pdf) （参照 2020/9/18）
↓クレジット決済の流れです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730703/6fa7e224-1559-3ae1-9019-1d9dba825a6d.png)

## トークン
セキュリティーを担保するために用いられる、一度だけ使用可能なパスワードのことです。トークンは、クレジットカード情報を暗号化したものです。同じカード情報で複数回決済をしたとしても、毎回異なるトークンが発行されます。

1.クライアントサイド側で、PAY.JPのAPIが提供する安全な処理を用いてクレジットカード情報のトークン化を行います。
2.そのトークンをサーバーサイドに送信し、クレジットカード決済が行われます。

※このトークンは一度だけ有効となるものなので、同じトークンで別の決済を行うことはできません。したがって、仮に漏えいしたとしても問題ありません。また、PAY.JPのシステム以外は、トークンからクレジットカード情報を復号することもできません！！

##Gemの導入
```ruby:Gemfile
gem 'payjp'
```
記述後bundle installを実行し、導入。

## ①ビューファイルにクレジットカード情報の入力欄追加
```ruby:index.html.erb
 <%= form_with  model: @order, id: 'charge-form', class: 'card-form',local: true do |f| %>
  <%= render 'layouts/error_messages', model: @order %>
  <div class='form-wrap'>
    <%= f.label :price, "金額" %>
    <%= f.text_field :price, class:"price", placeholder:"例)2000" %>
  </div>
  <div class='form-wrap'>
    <%= f.label :number,  "カード番号" %>
    <%= f.text_field :number, class:"number", placeholder:"カード番号(半角英数字)", maxlength:"16" %>
  </div>
  <div class='form-wrap'>
    <%= f.label :cvc ,"ＣＶＣ" %>
    <%= f.text_field :cvc, class:"cvc", placeholder:"カード背面4桁もしくは3桁の番号", maxlength:"4" %>
  </div>
  <div class='form-wrap'>
    <p>有効期限</p>
    <div class='input-expiration-date-wrap'>
      <%= f.text_field :exp_month, class:"exp_month", placeholder:"例)3" %>
      <p>月</p>
      <%= f.text_field :exp_year, class:"exp_year", placeholder:"例)24" %>
      <p>年</p>
    </div>
  </div>
  <%= f.submit "購入" ,class:"button" %>
<% end %>
```
## ②JavaScriptの処理を無効にする機能を取り除く
手作業でJavaScriptを記述してフォーム送信処理などを実装する場合は、このturbolinksがその処理を無効にしてしまうことがあります。
以下の2つのファイルを編集し、turbolinksを使用しないようにします。

```ruby:application.html.erb
<%# 省略 %>
    <%= stylesheet_link_tag 'application', media: 'all'  %>
    <%= javascript_pack_tag 'application' %>
<%# 省略 %>
```
```js:app/javascript/packs/application.js
// 省略
require("@rails/ujs").start()
// require("turbolinks").start() // コメントアウトする
require("@rails/activestorage").start()
require("channels")
// 省略
```

## ③payjp.jsを読み込みさせる
ブラウザでアプリケーションを開いたときに、payjp.jsが読み込まれます

```ruby:app/views/layouts/application.html.erb
<%# 省略 %>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>
    <script type="text/javascript" src="https://js.pay.jp/v1/"></script>
    <%= stylesheet_link_tag 'application', media: 'all' %>
    <%= javascript_pack_tag 'application' %>
<%# 省略 %>
```

## ④card.jsを作成
app/javascript/card.jsを作成
application.jsにcard.jsを読み込むための記述をしましょう。以下のように編集

```js:app/javascript/packs/application.js
// 省略
require("@rails/ujs").start()
// require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
require("../card")
// 省略
```

以上導入編備忘録
イラストが簡単に変えられるカレンダー作った


お疲れ様です。
この前某カレンダーアプリを見ていたら、簡単にスタンプが押せる機能があったんですね。
これ結構使いやすくて、概要とか入力しなくて、とりあえずイラストだけ変わればいいってことあるじゃないですか。
（イメージとしては、バイトとかのシフトが近いですかね・・・）

とりあえず使ってるアプリに不満はなかったんですが、その予定を共有したくなった時に不便が生じました。
結局アプリでローカルに持ってるだけなので、それを共有するってのがなかなか難しかったのです。。。

というわけで、今ないものは作ってしまえというのが今回のテーマです。

# 初めに


## レギュレーション

分解して考えてみると、以下の2点がレギュレーションになるかなと

 - カレンダーでボタンを押すだけでイラストが変えられること。
 - 誰でも状態を確認できること。（→必然的にWebアプリ？？）

## 使った技術

さくっと作りたかったので、いったんReactを使ってやってみることにしました。

 - React：フロントエンドフレームワーク。ベースです。
 - React-Calendar：今回の肝。カレンダーのライブラリーはこれ
 - Material-ui：別になくてもいいんですけど、Webアプリケーションとしての体裁を・・・

# 作ったもの

## コードとデモ

とりあえず以下Gitで管理してます。

最初に断っときますが、動けば十分で作ってますので品質はご容赦ください・・・

https://github.com/aion0721/sharecale

デモは以下です。

https://aion0721.github.io/sharecale/

## ポイント

苦労した点は以下です。

### カレンダー表記

基本的には、tileContentにて、各日付の値を設定できます。dateの変数の中に日付情報が入っていますので、
これをよしなに変数に渡して何とか値を取得するようにします。

```react
<Calendar
      tileContent={({date}) =><p><img height="100" width="100" src={`${process.env.PUBLIC_URL}/` + showTypeValue(date) + `.png`}/>{showContent(date)}</p>}
/>
```

ただし、ソースを読んでいただくとわかるように、毎回undefinedチェックをしているので、
これはこれで相当非効率だなと思います・・・いい方法ないですかねぇ・・・


### データの持ち方

ReactはFunctionで行くようになったので、HooksであるuseStateを使ってます。
ポイントは、配列を利用していることです。
react-calendarで、日付が一致するときに判定を行いたいため、例えば、2020/12/11の定義を行いたい場合に、
20201211の値として、typeValueを持つことによって、今どのアイコンを表示するか、を保持するようにしています。

```react
  const [ item, setItem ] = useState({20201211:{holiday:true,txt:'aiueo',typeValue:1}});
```

### アイコン変更方法

typeValueがアイコンナンバーを示しているので、ボタンが押されたときに数字を変更しています。
Switchでやってますが、個人的には最高に頭悪いのでなんかいい方法ありますかね・・・

```react
    switch(item[getFormatDate(e)].typeValue){
      case 1: {
        tmpTypeValue = 2;
        break
      }
      case 2:{
        tmpTypeValue = 3
        break;
      }
      case 3:{
        tmpTypeValue = 1
        break;
      }
      default: {
        tmpTypeValue = 0
        break;
      }
    }
 ```

# 終わりに

reactを本当にさわりだけやってない人間がやると本当に非効率な書き方しかできてなくて嫌になりますね。。。

## 今後の展望

### バックエンドAPI

とりあえず当初の目的である”共有”ができていないので、ServerlessFrameworkとかでバックエンドのAPI作って、
そこと同期できるようにしたいなとは思います。

### 認証

今はURL知ってればだれでも閲覧できてしまうため、認証を入れたいです。

## 逆に

今回のレギュレーションを達成しているアプリとかもう既にあったりしたら是非教えてください。もれなく私が喜びます。
Linuxとは

##Linuxとは
Linuxは、Mac OS、Windowsなどと同じOSの一種です。
リーナス・トーバルズ氏によって開発され、1991年に最初のバージョンが公開されました。

1.`OS(オペレーティングシステム)`
コンピューターのすべての`ハードウェア`を管理している`ソフトウェア`で、`コンピュータを使う際の土台になるもの。`
`ハードウェア`：目に見えるもの全般（ディスプレイ、キーボード、マウス、プリンターなど）で、物理的なものであるもの。
`ソフトウェア`：目に見えないもの（Windows、アプリなど）。

###主な特徴
・`フリー(無料)かつオープンソース`

・`Linuxカーネル`以外に様々な`ディストリビューション(頒布携帯)`が存在する

1.`Linuxカーネル`
リーナス・トーバルズ氏によって開発され、`無料で誰でも自由に配布できる`ことから、様々な企業・団体が`Linuxカーネルを基本に`して、`独自のLinuxディストリビューションを再配布している。`

2.`Linuxディストリビューション`
`Linuxのアプリケーションやライブラリをひとまとめにして、PCにインストールすれば使える状態にした配布物。`
(`ライブラリ`：汎用性の高い複数のプログラムを再利用可能な形でひとまとまりにしたもので、他のプログラムに何らかの機能を提供するコードの集まり。)

・`リポジトリを提供`
ソフトウェアパッケージの集合体をインターネット上に提供する。

1.`リポジトリ`
仕様、デザイン、ソースコード、テスト情報、インシデント情報など、システム開発プロジェクトに関連するデータの一元的な貯蔵庫。

・`セキュリティーが強くメンテナンスしやすい`
`コマンド`で簡単にカーネル（OSの中核部分に位置するソフトウェア）の操作が可能なため、OSやネットワークの設定がしやすくなっています。
その為、比較的大規模な開発などでLinuxはよく使われます。

参考元はこちら
（https://www.sejuku.net/blog/4948）
（https://eng-entrance.com/you_can_do_linux）
Ruby のローカル変数名は小文字で始めなければならない，はウソ

Ruby の初心者向け記事によく

> 変数名は小文字で始めなければならない

ということが書かれています。
ここでいう「変数名」は「ローカル変数の名前」のことでしょうね。変数にはグローバル変数やインスタンス変数もあるので，ローカル変数なら「ローカル変数」と書いたほうがいいと思います。

それはさておき，「小文字で始めなければならない」は誤りです。
まず，アンダースコア（`_`）で始めることが可能です。
それから，やろうと思えば非 ASCII 文字を使うことも可能です。

```rb
年齢 = 108
나이 = 108
aĝo = 108
වයස = 108
```

この四つの行はすべてローカル変数への代入です。
全角スペースなんかも使えます。まあやめといたほうがいいでしょうけど。

ただし，非 ASCII 文字であっても，大文字で始まっていたら定数です。

```rb
# ギリシャ文字の例
ηλικία = 108
Ηλικία = 108

# 全角英字の例
Ａｇｅ = 108

p defined?(ηλικία) #=> "local-variable"
p defined?(Ηλικία) # => "constant"
p defined?(Ａｇｅ) # => "constant"
```
【FileMaker】リレーションシップグラフの闇に勝つために

闇の魔術に対する防衛術というネタがあったので、ちょっと投稿してみました。
仕事で[FileMaker](https://www.claris.com/ja/)を使ったシステム開発をしていますが、お客さま自身や昔から動いているFileMakerシステムをメンテナンスする際に目にする、

巨大な巨大な蜘蛛の巣

。。。

FileMakerを仕事にしている人はわかると思います。
あの、リレーションシップグラフの蜘蛛の巣です。
これが闇ですが、うまくシステムが動いていることが多いので、まさに「闇の魔術」で動いていると思ってます。。。

（本当は画面いっぱいに出してもまだまだ続くすっごい蜘蛛の巣の魚拓を載せたいのですが、コンプラ的に難しいので[それっぽい画像を検索](https://www.google.com/search?q=filemaker+%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B7%E3%83%83%E3%83%97+%E8%9C%98%E8%9B%9B%E3%81%AE%E5%B7%A3&sxsrf=ALeKk02xykDB8oEhW-Vjg80OgCakZt-m4Q:1607777702486&source=lnms&tbm=isch&sa=X&ved=2ahUKEwjHjNbWvsjtAhWSLqYKHRvAADAQ_AUoAXoECAoQAw&biw=1860&bih=1192)してみてください）

# 何が闇の原因なのか

FileMakerではRDBでいうところのviewみたいなものをリレーションシップグラフとして構築して開発していきます。
これが命と言っても過言ではありません。

なので、画面数や画面内で使っているテーブル数が増えるとリレーションシップグラフも増加するわけです。

これをほぐすのは至難の技で、兎にも角にも「```闇```」の一言に着きます。
闇具合は、作成した時期が古ければ古いほど深まります。
「なんとか波」を何発も投入しても克服できずにHPを削られて蓋をしてしまうこともあります。
まさに闇に葬られるのです。

[「アンカーブイ」方式](https://support.claris.com/s/article/%E6%94%B9%E3%82%81%E3%81%A6%E8%80%83%E3%81%88%E3%82%8B%E3%82%A2%E3%83%B3%E3%82%AB%E3%83%BC%E3%83%96%E3%82%A4%E3%81%AE%E6%93%8D%E4%BD%9C%E6%96%B9%E6%B3%95%E3%81%A8%E5%AE%9F%E8%B7%B5?language=ja)で表現されている場合はまだ救いがありますが、数が多ければやられてしまいます。

# 魔術に対抗する防御策
一撃で倒せる白魔術はありません！
しかし、防御術はあります。
可読性や今後の追加案件に対応するために、蝶の羽のように広がったリレーションシップグラフには、とにかく画面やスクリプトを解析してコメントを入れまくるのです。
時間も手間もかかりますが、とにかくあとの人の道を作るためにもやり続けるのです。

私の場合は、以下のようなルールでリレーションシップグラフを書いています。

コメント：
・黄色：機能や画面レイアウトごとの区切りや画面・機能の仕様を書く
・赤：残さなければならない重要な引継ぎ事項
・青：お客さまに確認して「これでいい」となった仕様

TO(テーブルオカレンス）：
・赤：マスタテーブルのTO
・青：トランザクション系テーブルのTO
・緑：作業テーブルや一時的に使うテーブルのTO

![スクリーンショット 2020-12-12 22.35.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60538/23b70558-572e-3b1a-0509-ba15d7bd0bea.png)

まさに、リレーションシップグラフを要件定義と詳細仕様、引継書として機能させるのです。

闇の魔術に対する防御は地道な作業ですが、巻いた種の功績は大きいことを祈って、今日も戦います。
EELを使ってかんたんなPythonGUIアプリを作った話

これは、SFCアドベントカレンダー13日目の記事です。

環境
Python 3.8
Windows10/MacOS Catalina

---

##PythonでもElectronみたいにWEBフロントでGUI実装をしたい。
ということを朝起きて思ったことはありませんか?

tkinterもいいけど、私はHTMLでアプリケーションのレイアウトを構築したい!
そんなあなたにEELというライブラリーがあります。

### 作れるもの
![スクリーンショット 2020-12-12 214757.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163357/1792c30f-f58f-d974-c3ae-bdfec836f796.png)

※こちらは作成途中の画面です。

マークダウンと下にツイッターくらいの文字数を想定したミニメモがかけるようなアプリをつくりました。
出力すると、指定したところに日付のディレクトリーを作成しその中にブログ記事のMDファイルが書かれると行った構成です。

### EELの使い方

ライブラリーをインストールするコマンドは以下のようになってます。

```
$pip install eel
```
ディレクトリー構成は以下のような形で書きました。
![スクリーンショット 2020-12-12 221606.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163357/c5397022-2a51-040d-7040-71029c578796.png)

app.pyには、

```
import eel

@eel.expose
def hoge():
   ここにプログラムを書く

eel.start('html/index.html')

```


index.htmlにはウェブサイトのようにほしい要素を書いていきます。このとき 

```
<script type="text/javascript" src="/eel.js"></script>

```
上のようにHTML側でEELを読み込むことで、EELが扱えるようになります。

次に、Python側にHTML側から橋渡しをするような

```
async function run(){
 let hoge = await eel.hoge()();
}

```
ここで気をつけなければいけないのはPython側にプログラムを送るとき(特に、帰り値が欲しいとき)には末尾の()を2つ付けないといけない部分です。
付けない場合上記コードの`hoge`は、Promise節になり、値が取り出せない状態になってしまいます。

## 終わりに
おそらくこのライブラリーを使用することで、Electronライクな感じでWEBアプリケーションをロジック部分Pythonという形で書けるのではないでしょうか?デザインセンスが皆無なので今後上記のアプリケーションデザインを考え、更新していく形にしたいと思っています。
Big Surにしたら、ArduinoでESP32が動かなくなったので対応した（ValueError: dlsym(RTLD_DEFAULT, kIOMasterPortDefault): symbol not found Failed to execute script esptool）

# はじめに
Big Surにしたら、ArduinoでESP32が動かなくなった。ぐぬぬ。

# 環境
MacOS: Big Sur
Arduino: 1.8.13
ESP32: M5StickC

# エラー
こんなエラーがでる。

```
Traceback (most recent call last):
  File "esptool.py", line 57, in <module>
  File "/Library/Python/2.7/site-packages/PyInstaller/loader/pyimod03_importers.py", line 389, in load_module
  File "serial/tools/list_ports.py", line 29, in <module>
  File "/Library/Python/2.7/site-packages/PyInstaller/loader/pyimod03_importers.py", line 389, in load_module
  File "serial/tools/list_ports_posix.py", line 31, in <module>
  File "/Library/Python/2.7/site-packages/PyInstaller/loader/pyimod03_importers.py", line 389, in load_module
  File "serial/tools/list_ports_osx.py", line 32, in <module>
ValueError: dlsym(RTLD_DEFAULT, kIOMasterPortDefault): symbol not found
Failed to execute script esptool
exit status 255
/Applications/Arduino.app/Contents/Java/arduino-builder returned 255
Error compiling for board M5Stick-C.
```


![Screen Shot 2020-12-12 at 21.17.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184221/1b40e855-3217-8baa-c039-e813653bcb30.png)

# 調査
ここ２つがこのissueについて議論してるところっぽい。
すでに解決してそう。

[MacOS Big Sur dlsym(RTLD_DEFAULT, kIOMasterPortDefault): symbol not found (ESPTOOL-82) · Issue #540 · espressif/esptool](https://github.com/espressif/esptool/issues/540)

[esptool fails on MacOS Big Sur preview: Failure to import serial.tools.list_ports · Issue #509 · pyserial/pyserial](https://github.com/pyserial/pyserial/issues/509)

# 解決策

ここに、それっぽい解決方法が書かれてるのでためしてみる。

https://github.com/pyserial/pyserial/issues/509#issuecomment-726966076

ここらのコマンドを実行した。
Pythonを入れ直して、esptool.pyを最新のとってきてるだけかな。

```
~ ❯❯❯ sudo rm -rf /Library/Developer/CommandLineTools                      ✘ 1 
~ ❯❯❯ sudo xcode-select --install
~/L/A/p/e/tools ❯❯❯ brew install --build-from-source python            
~/L/A/p/e/tools ❯❯❯ cd ~/Library/Arduino15/packages/esp32/tools/esptool_py
~/L/A/p/e/tools ❯❯❯ mv esptool esptool.old                                
~/L/A/p/e/tools ❯❯❯ mv ~/Downloads/esptool.py ./                          
~/L/A/p/e/tools ❯❯❯ chmod + esptool                           

```

pythonはここにインストールされたっぽい。シンボリックリンクみたいやけど。

```
~/L/A/p/e/t/e/2.6.1 ❯❯❯ which python3
/usr/local/bin/python3
~/L/A/p/e/t/e/2.6.1 ❯❯❯ python3 --version
Python 3.9.0
```

esptoolの最初の一行を以下のように変更する。

```
#!/usr/local/bin/python3                                                        
```

# 確認
それでも、なぜかうまくいかなかったりした。
Arduinoを再起動したり、Boardを選び直したりして、コンパイルを何度かしたらいけた。
再現性があるか謎。

いけたときのログはこんな感じ。

```
Sketch uses 214433 bytes (16%) of program storage space. Maximum is 1310720 bytes.
Global variables use 15436 bytes (4%) of dynamic memory, leaving 312244 bytes for local variables. Maximum is 327680 bytes.
```

Exampleを書き込んで動くことを確認した。
よかったよかった。

# おわりに
Big Surにして、しばらく大丈夫やったけど、トラップがあった。
まあ、解決してそうでよかった。


# 追記
先人がいた。
python入れ直さなくてよかった疑惑・・・。

[macOS Big SurでArduino IDEからESP32の書き込みができない件 - Qiita](https://qiita.com/ashe1098/items/585d6474bd5d4833d39d)
nginx indexディレクティブ

nginx indexディレクティブを調べた。

indexディレクティブはpathが/の時に、pathにファイル名を付与して内部リダイレクトしてくれる。
デフォルトは`index index.html`

```nginx.conf
        location / {
                index hoge.txt;
        }
```

上記confの場合、
hoge.txt(aaa)を用意して`/`にアクセスするとhoge.txtが返却される。

```
$ curl localhost
aaa

$ curl localhost/
aaa

$ curl localhost/hoge.txt
aaa

$ curl localhost/dummy
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.14.1</center>
</body>
</html>
```

hoge.txtがない場合は↓になる。404はわかるけどなぜ403になるのだろう？

```
$ curl localhost
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.14.1</center>
</body>
</html>

$ curl localhost/
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.14.1</center>
</body>
</html>

$ curl localhost/hoge.txt
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.14.1</center>
</body>
</html>

$ curl localhost/dummy
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.14.1</center>
</body>
</html>
```
コンソール作業にお疲れの皆様へ贈るオセロ

## 仕事にお疲れの皆様へ
皆さん、コンソールを使って作業されることが多いですよね？
作業していてちょっと疲れた時に、気分転換にコーヒーを飲みながらコンソール上で軽く**オセロ**がしたい、なんて思うことがありますよね。

でも、

* 背景が白黒じゃ気分転換にならない。
* f5ってタイプして打つのはめんどくさい。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451049/9e3ec68a-2a53-7445-542a-6d9e9a0c8f5b.png)

そんな方へ、コンソール上でGUI風なオセロが出来る、CBOARDを贈ります！

## CBOARD
早速お披露目。
ちゃんと盤に色が付いていて、マウスを操作して石をひっくり返ることができます。
ソースコードはこちら => [cboard](https://gitlab.com/iyama_yuki/cboard/-/tree/master)

![CBOARD_SHORT.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451049/6ff7a492-32b5-27d6-c976-2106db32e4e2.gif)

## マウスで操作にするために
コンソール上でマウスを使って操作するために、[NCURSES library](https://invisible-island.net/ncurses/announce.html)を使用しました。
まずは、コンソールの設定をします。

```c:src/cboard.c
#include <ncurses.h>

void ui_init_cboard(UI *ui) {
  initscr();     // 端末の初期化
  noecho();      // キーボードの入力をコンソールに表示しない
  curs_set(0);   // カーソルを非表示に
  keypad(stdscr, TRUE); //マウスの入力を、キーコード（KEY_MOUSE）として受け取る
  mousemask(ALL_MOUSE_EVENTS, NULL); //マウスのイベントを有効にする
}

// スクリーンをリセット
void ui_free_cboard(UI *ui) { endwin(); }
```

## マウスイベントの受け取り
`getch`でイベントを受け取り、`getmouse`で座標を取得します。

```c:src/cboard.c
void control_keyinput(int *x) {
  int ch = getch();
  MEVENT e;
  switch (ch) {
  case KEY_MOUSE:
    if (getmouse(&e) == OK) {
      // マウスイベントを受け取った時の処理。e.xとe.yにマウスの座標が入ります。
    }
    break;
  }
}
```

## 盤面に色をつける
背景色と文字色のペアを用意します。

```c:src/cboard.c
void ui_init_cboard(UI *ui) {
  initscr();
  start_color();
  init_pair(1, COLOR_WHITE, COLOR_BLACK);  // 背景：黒、文字:白
  init_pair(2, COLOR_BLACK, COLOR_GREEN);  // 背景：緑、文字:黒
  init_pair(3, COLOR_WHITE, COLOR_GREEN);  // 背景：緑、文字:白
}
```

あとは、設定したカラーペアをセットし、コンソールに出力するだけ。

```c:src/cboard.c
void print_board(Play *play) {
  attron(COLOR_PAIR(2));
  mvprintw(2, 0, COLUMN_LABEL);
}
```

## オセロの機能部分を実装
機能部分は[edax](https://github.com/abulmo/edax-reversi)から必要な部分を取ってきました。既に実装されてるから、簡単に実装できるっていうのが一つの理由ですが、もう一つはedaxのUIとして組み込めたらいいな、なんて思ったからです。edaxの学習がボタン操作で全部できたり、定石の研究、盤面検討までコンソール上でできたりするかも？

もう少しちゃんとedaxとのインタフェース部分を作り込めば、組み込めるはずです。

## 最後に
あの有名なslコマンドをみて、コンソール上で動く物を何か作ってみたいなと思い、cboardを考えました。slコマンドみたいにオプションを付けてみたり、もっといろんな動きを付けても面白いかなって思います。

ncursesは、シンプルな実装で、簡単に動くものが作れました。初めてアプリを作ろうと思っている人にぴったりな気がしました。

Advent Calendarも残りわずかですが、楽しみましょう！
ちなみに、オセロは角を取ったら強いので、５日と２０日に投稿させていただきました。w
キカガク流から学ぶ中学数学から始める機械学習ーUdemy紹介記事ー

今回は**数学偏差値の30文系**の私でもデータ分析を行えるようにしてくれたとあるUdemyの「【キカガク流】人工知能・脱ブラックスボックス講座」について説明させて頂きます。
#はじめに
「プログラミングやってみたいけど、何から始めれば良いのか分からない」
「データ分析ができるとカッコ良さそうだけど、数式見るだけでいやいやの嫌」

というように思ったことはありませんか？
この記事は、私のようにデータ分析を始めたいけど数学の知識がなくてプログラミングの本を買ったのに読めてないといった人向けに是非受けて欲しい講座をご紹介したいと思います。
Udemy講座選びの参考にもどうぞ〜

[【キカガク流】人工知能・機械学習 脱ブラックボックス講座 - 初級編 - ](https://www.udemy.com/course/kikagaku_blackbox_1/)
[【キカガク流】人工知能・機械学習 脱ブラックボックス講座 - 中級編 - ](https://www.udemy.com/course/kikagaku_blackbox_2/)

#データ分析を始めるならまずはこれから！
このキカガク流の講座は、中学生レベルの数学から最終的に単回帰分析や重回帰分析といった大学の研究やビジネスまで幅広く使えるデータ分析手法を学ぶことができます！もちろんデータ分析だけでなく、データ分析に必要なプログラミング（言語はPython）の知識を同時並行で手を動かしながら教えてくれるのでプログラミング初心者でも大丈夫です！
この講座のすばらしい点は、誰しも一度は思った

「微分は現実世界でいつ使うの？」
「ベクトルって学ぶ必要ないんじゃない？」

といった問いにデータ分析の実例を交えながら丁寧に答えてくれます！特に文系の方が最初に学ぶにあたって、うってつけではないでしょうか？
#どんなことが学べるの？
主にデータ分析に必要な**数学**と**プログラミング**知識について学ぶことができます。
詳しくは以下のようになっています。

初級（総時間：4時間17分）評価4.4
ー数学ー
・微分（中学レベルからスタート）
・偏微分
・単回帰分析
ーPythonー
・変数
・基本構文（演算やprint等の基礎的な扱い）
・制御構文
・関数（基礎レベル）
・numpy
・pandas
・matplotlib
・実践（実データを扱った単回帰分析）

中級（総時間：4時間22分）評価4.4
ー数学ー
・スカラー：ベクトル：行列
・重回帰分析
・統計（基礎レベル）
ーPythonー
・重回帰分析をPython実装（Scikit-Learn）
1：実データで演習
2：外れ値・スケーリングを考慮した重回帰分析

初級に関しては難易度的にも比較的易しい内容になっています。（初級って書いてある通り）
![スクリーンショット 2020-12-12 14.10.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/793640/d11c087b-2449-5546-b40b-0deb572f5ec5.png)
数学のレベルは本当に上の画像のような中学生レベル式から始めるので安心してオッケーです！

```python:research_test.py
from sklearn.externals import joblib
joblib.dump(model,'test.pkl')
model_new = joblib.load('test.pkl')
```
また、プログラミング知識に関しては、一番簡単な四則演算から上のようなScikit-Learnを扱った予測まで順序よく教えてくれます。一気にレベルが跳ね上がるなんてこともありません。

#おわりに
今回は初めてデータ分析をPythonで行う人におすすめのキカガク講座を紹介しました。私はこの講座を通して、データ分析の勉強を再会し、現在はTwitterのAPIから得たデータを分析しています。
大切なのはコードや方法を覚えるのではなく、理解することだと私は考えています。ぶっちゃけ分析の書き方や機械学習の書き方はぐぐればいっぱいでてくるので。ただ、自分が行いたい分析についてしっかり理解していないと作りたいものも作れません。
是非この講座を通して、データ分析のいろはについて学んでみてください！

この記事が新しくデータ分析を始める人のきっかけになってくれたら幸いです、、、
【オートインデックス】autoindexとは一体何なのか。

# オートインデックス（自動インデックス）とは？

[わかりやすいサイトリンクENG]("https://www.netsparker.com/blog/web-security/disable-directory-listing-web-servers/")

+ **Nginxのパラメーター**の一つ
+ **ディレクトリ リスティング（directory listing)を制御**する

### オートインデックスを設定するには

Nginxのコンフィギュレーションファイルに設定を書き足す
`location`以下にディレクトリを指定しない場合（下記のような場合）は、全てのディレクトリに設定が反映される。

```
server {
        listen   80;
        
        ...

        location / {
               autoindex on;
        }
 }
```
無効にする場合は`autoindex off;`に書き換える


### ディレクトリ リスティングって何？

**Webサーバーがディレクトリの中身をレスポンスとして返すこと**
`dir`とか`ls`と似たような出力をする

#### ディレクトリ リスティングがONの時

1. Webサーバーは`https://127.0.0.1/directory/`のようにアクセスされた時に、`index.php`　`index.html`などのファイルをリスポンスとして返す。
2. それらの**ファイルがない場合**にはWebサーバーは**ディレクトリの中身一覧**をレスポンスとして返す

#### ディレクトリ リスティングがOFFの時

1. Webサーバーは`https://127.0.0.1/directory/`のようにアクセスされた時に、`index.php`　`index.html`などのファイルをリスポンスとして返す。
2. それらの**ファイルがない場合**にはWebサーバーは**403エラー**（権限が無効です）をレスポンスとして返す


### ディレクトリ リスティングの危険性

SSLプロトコルを使用していても、ディレクトリ リスティングがONになっていると、公開したくない情報を含むファイルの存在が表示されてしまう…！
[詳しく書いてあるサイトリンクJAP](https://securitynavi.jp/1501)
Ruby の真／偽と true/false は違う

Qiita の Ruby の初心者向け記事で，`true`/`false` に関して，誤ったもしくは誤解を招く表現を非常によく目にします。
たとえば

> if は条件が true のときに・・・を実行し，false のときは実行しません

とか

> Ruby では nil と false だけが false で，それ以外のオブジェクトは true です。

といったような。
明らかに 真／偽 と `true`/`false` を混同しています。

「えっ？　日本語と英語だけの違いじゃないの？」って？
ハイ，確かに単語の一般的意味として，真＝true，偽＝false という対応はあります。
しかし，Ruby について日本語で書かれた文章に「true」「false」とあったら，それは「真」「偽」という意味ではなく，次に述べるある特定のオブジェクトを指しています[^eng]。

[^eng]: 当然「英語ではどうなんだよ」という疑問が涌きますが，この記事でいう真／偽に当たる言葉として，いちおう truthy/falsy があります。JavaScript 方面ではそこそこ使われているようです。

Ruby の `true` は，`TrueClass` というクラスのインスタンスです[^so]。
同様に `false` は `FalseClass` というクラスのインスタンスです。

えっと，厳密にいえば，`true` という識別子は「擬似変数」と呼ばれるものであって，この擬似変数が指しているオブジェクトが `TrueClass` のインスタンスです。
これを「`true` は `TrueClass` のインスタンス」と縮めてもとくに誤解の余地はないので，しばしばそう表現されます。

[^so]: `TrueClass` はインスタンスをただ一つしか持てないことが保証されています。それが `true` です。`FalseClass` と `false` の関係も同様。

一方，Ruby ではどんなオブジェクトも真偽値として使うことができます。
そのルールは極めて単純で，`nil` と `false` だけが偽であり，他のどんなオブジェクトも真である，というものです。
ですから，

```rb
if "hoge"
  puts "いえーい"
end
```

は `いえーい` を表示します。

ではどうして `true` や `false` があるかというと，これらはそれぞれ「真の代表値」「偽の代表値」であると考えればいいでしょう。

なお，さきほど「真偽値」という言葉を使いました。
この記事では，真偽性を利用する値という意味で使っています。平たく言うと，条件式の値のことですね。
しかし，人によっては「真偽値」を「`true` または `false`」という意味で使っていることもあるので気をつけてください。
あなたのXMLはどの（どんな）XMLですか？

JAVA, Python, JavaScript, C# あなたはXML処理ソフトをどの言語で書きますか？
https://qiita.com/kaizen_nagoya/items/08cc37b64d0995774fb1

は、あるXMLファイル処理プログラムを書こうと思っ他時に、PythonにするかC#にするか迷って書いた記事。

結果として、まずC#に着手することにした。

でも、XML系の処理ソフトってどんなものがあるかよくわかっていないことに気が付いた。
すでに存在しているソフトウェアと同じようなものを書いても仕方がない。

そこで、ソフトウェアを聞く前に、どんなXMLが世の中で幅をきかせていて、その道具にどんなものがあるかを調べようと思った。

自分では、OOXMLをC#で書く事業に従事していたり、いなかったりしたのだが。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">あなたのXMLはどの（どんな）XMLですか？ <a href="https://t.co/eOaw7PlZ40">https://t.co/eOaw7PlZ40</a> <a href="https://twitter.com/hashtag/Qiita?src=hash&amp;ref_src=twsrc%5Etfw">#Qiita</a> 以下の４つ以外はコメントでお願いします。使っているツール、言語も教えていただけると嬉しいかも。</p>&mdash; ogawa kiyoshi (@kaizen_nagoya) <a href="https://twitter.com/kaizen_nagoya/status/1337751008072495104?ref_src=twsrc%5Etfw">December 12, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

XMLでよく困っているのは、次の事項

1. 編集した区切りごとに整合性確認を行い処理時間がかかる。
2. 整合性確認が、保存時だけで行うため、無駄な入力が増える。
3. 同じタグが入れ子構造に存在していて、整合性が取りづらい。
4. 不必要になったタグをうまく除去してくれない。

これまでに使ったことがあるのは、

Office Open XML(OOXML)
ISO/IEC TR 30114-1:2016 Information technology — Extensions of Office Open XML file formats — Part 1: Guidelines
https://www.iso.org/standard/62481.html

ISO/IEC 26300-1:2015
Information technology — Open Document Format for Office Applications (OpenDocument) v1.2 — Part 1: OpenDocument Schema
https://www.iso.org/standard/66363.html

MathML
https://www.w3.org/Math/

MusicXML
https://www.w3.org/2017/12/musicxml31/

RSS (RDF Site Summary or Really Simple Syndication)
https://www.xul.fr/en-xml-rss.html

Extensible HyperText Markup Language (XHTML) 
https://www.w3.org/MarkUp/

XML Metadata Interchange (XMI) 
https://www.omg.org/spec/XMI/

ARXML 
https://www.autosar.org/fileadmin/user_upload/standards/classic/4-3/AUTOSAR_TPS_ARXMLSerializationRules.pdf

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
VNCでRaspberry Piにリモートデスクトップ

# Raspberry Pi側

###「Raspberry Pi Configuration」でVNCを有効にする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/142f63a1-a763-19cf-791c-b3c38c9eef43.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/a1f397d0-5674-f7b5-b211-0800f7ea2ad0.png)

### IPアドレスを確認

```console
pi@raspberrypi:~ $ ifconfig
(省略)
inet 192.168.1.74  netmask 255.255.255.0  broadcast 192.168.1.255
(省略)
```

# PC側

### chromeのVNCビュアーを選択

https://www.realvnc.com/en/connect/download/viewer/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/e75a2dd2-bb08-22c5-1bee-e3044dbd11de.png)

### VNCを起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/c5d3ba07-9aa8-a68b-fb2f-181e28836b15.png)

### Raspberry Pi に接続

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/162b8cc4-fc5e-4d6b-4493-e4d70149b8ab.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/e526c335-de8e-f5e8-66a8-d43349b2b23c.png)

Raspberry Piのデフォルト設定なら

* User name : pi
* Password : raspberry

### 接続成功

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224453/d3b1b0fc-bbc9-2b0b-a125-273f37bfceda.png)
今すぐにgit-secretを導入しよう！これを読めば1分でgitのオペミスをなくせます！

### はじめに

GitHubに間違えてAWSのSecret Keyなどを誤って公開してしまって〇〇万円請求されたという話はよく聞きます。

リポジトリをプライベートにしておけばいいだろ！という方も、そのリポジトリをパブリックしたり、Forkしたりしたら危険であることがわかると思います。

そんなとき、意図せずリポジトリにシークレット情報を残さないようにgit-secretをローカルに導入しましょう。

簡単にセッティングできます。

 

### 手順

まずはgit-secretをインストールします。

```
$ brew update && brew install git-secrets
```

対象ディレクトリで

```
$ git init 
```

```
$ git secrets --install
```

これでgit-secretを利用できるようになりました。

AWS credentialのチェックはデフォルトで用意されているので、そちらを用います。

```
$ git secrets --register-aws --global
```

設定は.gitconfigに記載されています。

セキュリティチェックを追加する際には、.gitconfigに正規表現で記述します。

設定一覧を見るには

```
$ git secrets --list
```
 
◆指定のディレクトリをクロールする場合

```
$ git secrets --scan -r < directory name > 
```

これでディレクトリ全体のチェックができます。
 

◆コミットに含まれていないかのチェック

```
$ git  add .
```

```
$ git commit -m "secret check"

$git secrets --scan
secrets//test.txt:6:AWSSecretKey=wJaXXXXXXXXXX/XXXXXXX/bPxRfiCYEXAMPLEKEYsecrets//test.txt:7:AWSAccessKeyId=AKIAXXXXXXXXXXXAMPLEsecrets//test.txt:9:private_key

[ERROR] Matched one or more prohibited patterns

Possible mitigations:

Mark false positives as allowed using: git config --add secrets.allowed ...

Mark false positives as allowed by adding regular expressions to .gitallowed at repository's root directory

List your configured patterns: git config --get-all secrets.patterns

List your configured allowed patterns: git config --get-all secrets.allowed

List your configured allowed patterns in .gitallowed at repository's root directory

Use --no-verify if this is a one-time false positive
```

以上です。


### まとめ
本当に初歩てきな導入だけを書きました。

上記のことは一瞬でできて、重大なミスを防ぐことができるので、すぐに導入することをおすすめします。

筆者のこちらのブログもぜひ見てみてください👇
[ヘヴィメタル・エンジニアリング](https://xkenshirou.hatenablog.com "ヘヴィメタル・エンジニアリング")
django-rest-frameworkで現在時刻を過ぎたものを表示しないようにする方法

# 過去のものを表示したくないとき
誰にだってそういったものはありますよね。僕も過去はあんまり見たくないです。

かといっていちいちモデルから消してしまうのも手間となってしまうので非表示してしまおうというのが今回やりたいこと。

今回も簡単なのでサクッと

```python:view.py
from datetime import datetime

class EventViewset(viewsets.ModelViewSet):
    queryset = Event.objects.order_by('event_schedule')
    serializer_class = EventSerializer
    # 現在時刻を過ぎたイベントについては表示しない
    # Eventの部分は使用するモデル名
    # event_scheduleの部分はフィルタリングしたいフィールド
    def get_queryset(self):
        return Event.objects.all().filter(event_schedule__gt=datetime.now())
```

これだけでできます
cyberduckでのドラックアンドドロップでファイルをアップロードするときの備忘録

## この記事で書くこと

cyberduckというFTPクライアントツールを久しぶりに使う機会があり、使ったらアップロードの挙動に戸惑う部分があったのでその記録を行う。同じように使用する必要が出た時の未来の自分に記録を残す。

使用しているcyberduckのバージョン
`バージョン7.6.2 (33520)`

## アップロードの挙動
アップロードについてのcyberduckの使い方については以下を確認してください。 :bow: 

[Cyberduck ヘルプ / 使い方 / アップロード](https://trac.cyberduck.io/wiki/help/ja/howto/upload)


### どこに反映されるか？起きたこと
この挙動を自分は掴めず、他の場所にアップロードしてしまった。
ドラックアンドドロップでファイルをアップロードするときに、cyberduck上では、ここに入れて欲しいという
フォルダを選択している状態で、アップロードする為、Finderから移動した。

でも、これだと、正しい場所にアップロードされない。

では、どこにアップロードされるのか？

cyberduck上で今どこにいるのかについて表示されているこの `/` (添付した画像の状態では、という意味)にアップロードされる。自分がどのファイルを選択しているかというのはドラックアンドドロップで入れる際には全く関係ない。 
![スクリーンショット 2020-12-12 22.05.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71266/3eb9b5e1-6cc1-e86d-2d0b-5b354611974f.png)


例えば、 `/test/` の中に入れたいのであれば、
**`test` のディレクトリをダブルクリックして、 `/test/` に移動した状態で、ドラックアンドドロップで入れる。**

この /test/ に移動した後であっても、ドラックアンドドロップで入れる際は

`/test/` 直下に入れたかったのに、 `/test/images` 内にアップロードされてしまっていたこともあったので、

どこに入れるのかは慎重に確認しつつ行うか、「アップロード」をドラックアンドドロップではなく、選択して入れるように気を付ける。
Django Rest Frameworkでモデルを日付順に並び替える

# 日付順にソートしたい！

皆さん、モデルの一覧を観たいときにそう思いますよね、はい。
なのでそれをdrfで実装したいと思います。めちゃ簡単なのでサクッと行きましょう


```python:view.py
class EventViewset(viewsets.ModelViewSet):
    # 開催時期が近い順に並び替える
    # Eventのところは使用するモデル名、event_scheduleのところはソートしたいフィールド
　　# また、"-event_schedule"にすることで並び順を逆にできる
    queryset = Event.objects.order_by('event_schedule')
    serializer_class = EventSerializer
```

簡単ですね！！！
[Swift] 関数について初歩的なことをまとめる

#関数とは
「関数は、入力として引数、出力として戻り値を持つ、名前を持ったひとまとまりの処理」
（石川洋資・西川勇世、『[増補改訂第３版] Swift実践入門　直感的な文法と安全性を兼ね備えた言語』、技術評論社、２０２０年４月２８日　１２８p）と定義されています。
同じ処理をいろんな箇所で書く時に関数としてまとめて使用します。
#書き方
実際の関数の例が以下になります。
doubleが関数名、_が外部引数の省略、xが内部引数、：の後が引数の型、->の後が戻り値の型、{}内が実行される処理になります。
戻り値を返すにはreturn文を{}内で使用します。


```swift
func double(_ x:Int) -> Int {
    return x * 2
}
```

#実行してみた
double(2)を実行すると、
内部引数のxに２が入る→{}内の式のxに２が渡される→結果がInt型の戻り値に渡される→４という結果が得られる→定数kekkaに代入
という流れです！


```swift
func double(_ x:Int) -> Int {
    return x * 2
}
let kekka = double(2)   //4
```

#引数について
関数の定義時に宣言するもの（上記の例でいうとx）を仮引数
関数の呼び出し時に指定するもの（２）を実引数
#参考文献
石川洋資・西川勇世、『[増補改訂第３版] Swift実践入門　直感的な文法と安全性を兼ね備えた言語』、技術評論社、２０２０年４月２８日、４５３ページ
[Rails] カラムの書き方

```20xxxxxxxxxxxx_devise_create_user.rb
t.string :email, null: false

t. 型　カラム名　オプション
```

上記は「emailが空の場合 登録・ログインできない」といったような意味です。

db/migrate/ディレクトリ内にある
マイグレーションファイルに設定しましょう。
Udemyの海外コースおすすめ(iOSアプリ開発)

#コースについて
勉強するコースはこれです:point_down:
https://www.udemy.com/course/ios-13-app-development-bootcamp/
英語ですが、なんとかなるかなという軽い気持ちで選びました。
あと、セールで安かったのでついつい買ってしまった（お得という言葉の響きに弱い）
そして、先生の笑顔がとってもキュート:sunglasses:
日本語のコースより英語のコースのほうが内容が充実しているという話もあるし、アプリ開発するついでに英語も学べてラッキーですよ。

＜Udemyのコースについて＞
- 本当に手取り足取り教えてくれるので、知識ゼロからでも学べそうなレベル
- 英語のレベルは、アメリカの小学校高学年～中学校くらいのレベルな気がする（小難しい単語は出ない）
- 先生（Dr. Angela Yu）の英語は、少しイギリス英語アクセントっぽいが非常に聞き取りやすい（アジア人にとって分かりやすい英語だと思う）
- やや説明するスピードが速いが、英語字幕があるので大丈夫そう
- 先生の英語はとても勉強になるし、ちゃんとした授業形式になっているので学びにつながる
- これやっとけばセブ島留学とか行く必要ないんじゃないかとすら思う。。

提出期限とかないしコース視聴いつでもできるし、Angela（先生）の優しさに甘えてしまうので注意です（オンラインコースあるある）
やはり絶対にこの曜日のこの時間にやるとか決まり事をつくって習慣化していかないとオンラインコースは続かない（戒め）

コース内の小ネタが盛り込まれていて飽きにくくなっています。
たとえば、スマホアプリ黎明期に「I AM rich.という画面を表示させるだけのアプリで高額課金させて儲けるという詐欺同然の方法で稼いだ人がいた」という話が実に興味深かった。
そのアプリ持っているだけで金持ちの象徴のようなことだしアプリの内容は間違っていない（？）
開発について説明中にちょくちょく小ボケがあったり興味深い話をしたりします。

#英語のUdemyコースの受講について
今まで自分がしてきた学習は日本語での本や授業の内容だったので、英語で学ぶとまた新鮮な部分がありますね。
「英語だとこう言うのか！」とか「英語だったらこういう風に解説すればいいのか！」とか目から鱗な内容もありました。
すでにswiftに詳しい人でも受講すると英語の勉強になっていいかも。
また、英単語や英語での表現に詳しければ英語で内容を調べやすいので、開発中に分からないところでつまづいたときにこの学習経験が役に立ちそうな気がする。