OmniAICreator/Qiita-1.07M huggingface dataset:
line bot

# 名言bot
自分の好きな偉人の言葉をランダムで返信してくれるbotを作りました。

![スクリーンショット 2020-08-27 11.01.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/3ce5be87-4fed-1a5b-00b1-3e010c818cc6.png)
cv::CascadeClassifier::detectMultiScaleの解決方法

#はじめに
　OpenCVで顔検知をしたときに出たエラーと解決方法を紹介します。

#問題

　以下のようなコードでエラーが出ました。

```:python
# カスケード型識別器の読み込み
cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

# 顔領域の探索
face = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30))

```

　エラー内容

```:
cv2.error: OpenCV(3.4.2) C:\projects\opencv-python\opencv\modules\objdetect\src\cascadedetect.cpp:1698: error: (-215:Assertion failed) !empty() in function 'cv::CascadeClassifier::detectMultiScale'
```

#原因
　分類器のXMLファイルのパス指定が間違っているようです。

#解決方法
 まずOpenCVが入っているパスを調べます。

```:python
user>python
Python 3.7.9 (tags/v3.7.9:13c94747c7, Aug 17 2020, 16:30:00) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>import cv2
>>>cv2.__file__

'C:\\Users\\user\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python37\\site-packages\\cv2\\cv2.cp37-win_amd64.pyd'
```

　次にXMLファイルの場所を調べます。
![path.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537831/22801e22-a0bc-3675-2c16-c97f8a56d0d9.jpeg)

　私の場合は/dataに入っていました。

　そのため、コードを以下のように修正しました。

```:python
# カスケード型識別器の読み込み
cascade = cv2.CascadeClassifier("C:/Users/user/AppData/Local/Packages/PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0/LocalCache/local-packages/Python37/site-packages/cv2/data/haarcascade_frontalface_default.xml")

# 顔領域の探索
face = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30))
```

#おわりに
　![result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537831/b1dc0113-76c8-4046-f402-408688a3c942.jpeg)

　無事に検知できました。

#参考
　https://qiita.com/K_M95/items/f1a3e7c47800adb94095
leafletを鍛える。その30

#概要

leafletを鍛えてみた。
自宅の高解像度な衛星写真が欲しい。

#写真

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/887f8735-5027-bdfc-cc42-a040d10e2449.jpeg)

#サンプルコード


```

var map = L.map('map').setView([37.9748331, 140.057], 18);
L.tileLayer('https://cyberjapandata.gsi.go.jp/xyz/seamlessphoto/{z}/{x}/{y}.jpg', {
    attribution: "<a href='https://maps.gsi.go.jp/development/ichiran.html' target='_blank'>地理院タイル</a>"
}).addTo(map);

```

#成果物

https://embed.plnkr.co/plunk/UhG4SVr15Qp4g0BY


以上。
OODAとPDCAの違い

最近アジャイル関連の本読んでるとよく目にする「OODAループ」という言葉、PDCAとどういう違いがあるか簡単にまとめました。

# OODAループとは
- https://ja.wikipedia.org/wiki/OODA%E3%83%AB%E3%83%BC%E3%83%97
- Observe(観察), Orient(方向づけ), Decision(判断), Act(行動) の頭文字
- 第二次大戦で活躍したジョン・ボイド大佐が考案した
- 軍事活動から着想を得ているが、「人間の行動原理」を表現しているのであらゆる問題に適用可能とされている
  - 例えば人が歩く場合
     - 前方に障害物などがないか確認する (観察)
     - 誰かが歩いてきたので右に避けた方がいいかもと考える (方向づけ)
     - 他に障害物がないので右に避けることに決定(判断)
     - 右に避けて歩く (行動)
  - 実際振り返ってみると、確かに人間はこういうループに基づいて行動している
    - 例外的に、O->Aみたいなこともある
        - 熱湯に触れてしまった時などはいちいち考えて行動しないとか

### 第二次世界大戦 - ドイツ電撃戦で起こったこと
- ドイツ軍は、敵(=フランス軍)が最初のO(観察)の時点で誤った情報をえるように、撹乱するような行動を先にとる
- 敵が次のO(方向づけ) をしている間に、こっちは先に A(行動)を起こして、敵が得た最初のO(観察)が意味を失うよう仕向ける
- 以後、このループを繰り返すことによって、敵を行動不能に追い込む
  - 敵のOODAループを破壊する(攻撃的OODAループ)
- 要するに敵より早くOODAループを回すということ

#### 両者の組織文化の違いが大きく作用していた
- ドイツ軍は予め自分たちがどのように行動すべきかをパターンで定義していた(OODAのストックを持っていた)ので、戦局に応じて素早く対応できた
  - また、想定外の場合にも上官にいちいち確認せず自己責任で行動するという文化があった
- 対して、フランス軍は上位下達の組織
  - 何か起こったら上官に報告->指示を仰ぐという流れ
      - OODAを回すのが遅くなってしまう
  - 見てる間にどんどん戦局が変わって対応できなくなって逃げ出した

# PDCAとは
- https://ja.wikipedia.org/wiki/PDCA%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB
- Plan(計画), Do(実行), Check(評価), Action(改善)
- 製造業で生まれた考え方らしいが、近年はIT業界でもよく使われる
  - 品質管理システム、ISOとかもある

# 両者を見比べると何が違うか
- 企業活動として考えてみると
  - OODAは市場の観察からスタートする
  - PDCAは自社の計画からスタートする
     - 個人的にこの差は非常に大きいと思っている
     - 例えば、売り上げがどのくらい取れそうか？という話の時
        - OODAは市場の規模から考える
        - PDCAは市場の規模に対して「自社がどうしたいか」というコンテキストが混入する
          - それが合理的な考えに基づけば良いが、往々にして風呂敷広げがち
          - 目的の達成ではなく、計画の実行が優先されてしまう
            - ダメな作戦を延々と続けてしまう
        - OODAにしろPDCAにしろ、小さいサイクルを素早く回していくのが肝要
          - のんびりやっている間に市場は変化する
            - まさかTikTokがアメリカから消されるとは...数ヶ月前に予測できた方はいましたか？

# 原理原則を知ると面白い
- OODAループだけでなく、原理原則と言われるものを学んでいくと、「あっこれはあの本で見たパターンだ」みたいなのがあって面白い
- コンウェイの法則
- パーキンソンの法則
- トヨタ生産方式
- ゴールデンサークル
などなど


# 参考書籍
More Effective Agile
- https://www.amazon.co.jp/dp/B089KFKB5H/

OODAループ超入門
- https://www.amazon.co.jp/dp/B079VM46PG

チーム・ジャーニー
- https://www.amazon.co.jp/dp/B0836CF21D/

Find your why
- https://www.amazon.co.jp/dp/B07N79GTTQ/


# AfterTalk
#### ドイツ軍について
- 同じ山に登るけど、登り方は任せるっていう考え方っぽい
    - 違う山に登っちゃうと困るよねっていう
    - これは設計と実装を分けるという意味で現場にも適用していきたい

#### Unlearn
- https://www.navigate-inc.co.jp/term/term_unlearning.html
- 同じ環境に適応し続けると、逆にそこから抜け出せなくなってしまう
    - 例えば、VBをずっと学習し続けてもこの先未来はなさそう的な
GitHubでコミットの差分のPullRequestを作成する方法

## やりたい事
Githubでmasterブランチの一番最初（一番古い）のコミットと最新のコミットの差分のPullRequestを作成する。

## 手順
##### 1. 一番最初のコミットのコミットIDを確認します。

##### 2. ローカルのmasterブランチ上で下記コマンドを実行します。
```terminal
$ git checkout 一番最初のコミットID 

Note: switching to 'xxxxxxxxxxxxxxxxxxxxxx'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at xxxxxxx first commit
```

##### 3. メッセージにしたがって下記コマンドを実行して下さい。first-commitのところは自分の好きな名前に変えて大丈夫です。
```
$ git switch -c first-commit
```

##### 4. 現在いるブランチがfirst-commitである事を確認します。
```
$ git branch
* first-commit
  master
```

##### 5. GitHubにpushします。
```terminal
$ git push origin first-commit
```

##### 6.  GitHubでPRを作成します。baseのブランチを今プッシュしたfirst-commitにして、compareはmasterブランチを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469768/97b9d910-4e19-35cb-85b4-d769af591dba.png)

以上で完了です✨

## 参考
[git \- How to get certain commit from GitHub project \- Stack Overflow](https://stackoverflow.com/questions/7832770/how-to-get-certain-commit-from-github-project)
【アウトプット】やりたいことからRubyを最速で学ぶ・その１「作りたいものを考える」

# はじめに
Qiitaをご覧になっているエンジニアのみなさん、アウトプットはしていますか？
アウトプットすることで学習効率が確実に上がります！

「ドキッ！ぼく、問題練習ばっかりしている・・・」

というそちらの方。大丈夫さぁ〜！それでこの記事を書きました。あなたのために！

効果的な学習法は、アウトプットです。自分でオリジナルプログラムを作ることです。
オリジナルプログラムを作る流れを説明していますので、最後まで読めばきっとRubyの基礎を理解できるはずです！

# 対象となる読者
本記事は次の方々へ向けて書かれています。

- プログラミング初心者でRubyを学びたい
- Rubyは少し触れたけど、まだイマイチ分からない
- とりあえず何か作ってみたい！

といった人たちにわかりやすく伝えるつもりです。

# この記事で学ぶこと
本記事は、わたしがプログラミング学習2ヶ月目で作成したオリジナルプログラム「あっち、むいて、ホイっ！ゲーム」を通じて、Rubyの基礎に関する以下のような知識を学びます。

- メソッド
- クラス
- 様々な処理  

なお、「あっち、むいて、ホイっ！ゲーム」はいくつかの回に分けて説明する予定です。

1. 作りたいのものを考える
2. 機能を分解する
3. 簡単なコードをベタ書きする
4. コードを改善する

これを読めば、下記のようなプログラムが作れるようになっているはずです！もちろん手を動かすことも忘れずに！

### 作ったもの
![DEMO.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628330/6ba8dcbc-7cd0-ba2a-fa17-d1bfa7e63fa9.gif)

それでは、以下が本編です！

# 動作環境
- Ruby 2.6.6

# 作りたいものを考える

「アウトプットと言われても、、、何を作ればいいねん！」という声が聞こえてきます。

結論、何でもいいと思います！

わたしの場合は、4才の子供と「あっち、むいて、ホイっ」で遊んだことがキッカケでこのゲームを作成することにしました。
また、自身の、友人の、家族の、職場同僚の

- 趣味
- あったらいいなと思うもの
- 悩み／困ったこと

などから形にするのもアリだと思います。日常生活の中に何らかのヒントがあると思います。

「あっち、むいて、ホイっ」を作成すると決めたあとは、そのゲーム処理の流れを以下のフローチャート（みたいな図）を書き起こしました。

### フローチャート

![あっち向いてホイっ！でおこずかいゲット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628330/cdbe907c-a7d4-27bf-eeb8-9aceb8a05b77.png)

### まとめ
本記事では、作りたいものを考えるヒントと決まったものをフローチャート（みたいな図）に書き起こすことを説明しました。

次回の記事では、書き起こしたフローチャートを元に機能分解の説明をする予定です。

### 参考本
- キタミ式イラストIT塾　基本情報技術者
ラズパイで熱帯夜を乗り切ろう！２０２０

昨年からQiitaを初めて、その初投稿がこいつでした！
[ラズパイで熱帯夜を乗り切ろう！](https://qiita.com/Fell/items/e3237e3983c1191fdca5)

自宅が細長く高断熱の一軒家という仕様。
昨年、ラズパイリモコンを２台製作したのですが、もう１台つくって全館一定温度にします！

現状：両端の部屋をリモコンで温度コントロール。
完成：真ん中の部屋を新たにコントロールする。-> ドアも全部開け放して家のどこにいても快適にしよう！

前提として家が超高断熱でないと割にあわないかもしれません。
うちは窓をとってもペアガラス＋２重サッシという鬼仕様！！
逆にあったまると局所的に外より暑いという悩みがありました。

昨年はBME280で温度によってエアコンをオンオフしていたのですが、仕様を変更。

時間帯によって２０分間運転。１０分間運転。６分間運転。
単純に間欠運転するようにしました！

間欠運転の理由はエアコンを時々切ったほうがクーラー病なりにくいからです笑
クーラー病とかならない人は着けっぱなしでいいでしょう！いいのか！？

```python:/aircon/auto_pirot.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time, datetime
import sys
import os

#リモコンファイル
on_files = ['daikin_27.txt']
off_files = ['daikin_off.txt']

#リモコンアドバンスへ送信
def ir_cmd(code_files):
    for code_file in code_files:
        _cmd = "bto_advanced_USBIR_cmd -d $(cat " + code_file + ")"
        while not 0 == os.system(_cmd):
                time.sleep(1)
        print(_cmd + ' -> ' + 'done')
        time.sleep(1)

ir_cmd(off_files)

while True:
    now_time = datetime.datetime.now().time()

    #時間帯によりモード切り替え
    is_morning_time = datetime.time(3, 00) <= now_time and now_time < datetime.time(9, 00)
    is_day_time = datetime.time(9, 00) <= now_time and now_time < datetime.time(17, 00)
    is_night_time = datetime.time(17, 00) <= now_time and now_time < datetime.time(3, 00)

    now_minite = int('{0:%M}'.format(now_time))
    #詳細設定：時刻の分をトリガーに
　　if is_morning_time:
        if (0 == now_minite):
            ir_cmd(on_files)
        elif (6 == now_minite):
            ir_cmd(off_files)
    elif is_day_time:
        if (0 == now_minite or 30 == now_minite):
            ir_cmd(on_files)
        elif (20 == now_minite or 50 == now_minite):
            ir_cmd(off_files)
    elif is_night_time:
        if (0 == now_minite or 30 == now_minite):
            ir_cmd(on_files)
        elif (10 == now_minite or 40 == now_minite):
            ir_cmd(off_files)
    else:
        if (0 == now_minite or 30 == now_minite):
            ir_cmd(on_files)
        elif (10 == now_minite or 40 == now_minite):
            ir_cmd(off_files)

    now = datetime.datetime.fromtimestamp(time.time())

    time.sleep(60)
```

めちゃくちゃ単純で、下記を切り替えているだけ。
午前モード：n時00分にon、n時06分にoff。
午後モード：n時00分にon、n時20分にoff & n時30分にon、n時50分にoff
夜間モード：n時00分にon、n時10分にoff & n時30分にon、n時40分にoff

たまに寒かったら手動で消すし、暑かったらつけます笑

今回苦労したのはリモコンアドバンスでダイキンのリモコン信号を全然記憶してくれなかったこと！！

ものすごく参考になった記事
[RaspberryPiでスマートホーム 〜赤外線リモコンでエアコン操作 その2〜](https://my-scribble.net/raspberrypi%E3%81%A7%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E3%83%9B%E3%83%BC%E3%83%A0-%E3%80%9C%E8%B5%A4%E5%A4%96%E7%B7%9A%E3%83%AA%E3%83%A2%E3%82%B3%E3%83%B3%E3%81%A7%E3%82%A8%E3%82%A2%E3%82%B3-2/)

ダイキンのリモコン信号をリモコンアドバンス用に合成してくれるプログラムを公開してくれています！！
うちの全然記憶できなかったリモコン信号が一発で起動できました！！！
大大大だい感謝！！です！！

来年もまた進化したいと思います！！！

__追記__
久しぶりに起動したら無線での`SSH操作`ができないぐらい重い
調べたら`パワーマネジメントを無効にする`記事を見つけたんで試したら良くなった気がします！
[Raspberry PiでSSHの反応が悪いときに実施すること](https://qiita.com/yujimny/items/4008be640c043a3478b4)

LGTMお願いします！
モチベーションが上がります！！
私がアロー関数を一部でしか使わない理由

ES6から導入されたアロー関数、便利ですよね。
簡潔だし理解しやすいので、通常の関数よりも好んで使っている、という人は多いように感じます。

一方で、それじゃあ通常の関数の方はもうお役御免なのかというと、個人的にはそうは思っていません。
むしろ、**アロー関数でも通常の関数でもどちらでも選べる場合に関しては、基本的に通常の方を使うのが好ましいと考えています。**

## 通常の関数を使いたい理由

アロー関数と通常の関数、両者どちらも使える状況 (注*) では、あえてどちらかを選ぶべきかを考える際、通常の関数に関して、私は下記の点を意識するようにしています。

1. 呼び出し元よりも下の行で宣言できる
2. `function` という記述が先頭にある分、パッと見だと通常の関数の方が関数だと理解しやすい

まずひとつ目に関してですが、通常の関数はこのように書くことが出来ます。

```js
sayThanksTo("Mike");

function sayThanksTo(name) {
  return `Thanks ${name}`;
}
```

一方で、アロー関数で同じことは出来ません。

```js
sayThanksTo("Mike"); // 👈 エラーになる

const sayThanksTo = (name) => `Thanks ${name}`;
```

場合によっては、例えば可読性のために関数をファイルの下部にまとめて宣言しておきたいといった事が起こりえますので、その際は通常の関数を使うことになります。

また2つ目に関してですが、プログラムの記述は横文字で左から右に読んで行きますので、一番左に位置するところに `function` と書いてあると、より関数だと認識しやすくなると個人的には思っています。
アロー関数と変数が混ざるような状況だと、`const ~` だったり、`let ~` まで読んだだけでは関数なのか変数なのか判断出来ないので、パッと全体を見渡した時の視認性の高さで言うと、通常の関数の方がより高いのかなと考えています。

## アロー関数を使いたい場合

基本的には通常の関数を使用しつつ、合わせて以下の場合にアロー関数を使うようにするとより可読性が上がると考えています。

#### 高階関数を使用する時

```js
// ⭕️
function add(a) {
  return (b) => a + b;
}

// ❌
function add(a) {
  return function (b){
    return a + b;
  }
}
```

#### 無名関数を変数に代入する時

```js
// ⭕️
const sayThanksTo = (name) => `Thanks ${name}`;

// ❌
const sayThanksTo = function(name){ return `Thanks ${name}`; };
```

#### promise や filter、map、reduce と共に使用する時

```js
// ⭕️
const japaneseCuisine = foods.filter((food) => food.name !== "California roll");

// ❌
const japaneseCuisine = foods.filter(function(food){
  return food.name !== "California roll";
});
```

是非お試しを。

## 注釈
*... あるケースによっては、そもそもどちらかしか使えなかったりします。また、上記以外の仕様の違いもありますので、合わせてこれらの知識も頭に入れておくとより良いコードが書けるようになるかと思います: https://qiita.com/suin/items/a44825d253d023e31e4d
RazorPageでAjax(axios)を利用する場合

#概要
　今回はASP.NET CoreのRazorPageを利用した際のAjaxの利用についてです。

#複数POSTのページモデルのハンドリング
　RazorPageでは複数のPOSTを実行する場合、submitボタンに「asp-page-handler="Send"」という属性を付けて利用します。その際、モデルページ側では「public IActionResult OnPostSend()」(非同期の場合は「public async Task<IActionResult> OnPostSendAsync()」)という風に「OnPost」にハンドラー名を追加して受けます。

``` html:hoge.cshtml
<button type="submit" asp-page-handler="Send">送信</button>
```

``` cs:hoge.cs
        public IActionResult OnPostSend()
        {
            ここに処理を記述して、結果を返す
        }
```

　Ajaxの場合も、上記と同じハンドラーをページモデルに記述します。

#JavaScript
　上記の「OnPostSend」をAjaxで呼び出す場合、URLパラメータとして「?handler=Send」を追加します。ここではaxiosを利用した例を示します。
　この時、XSRF対策の為にページに埋め込まれているトークンをヘッダに設定して渡す必要があります。（これが無いとstatus:400のBadRequestが返ってきます。）　

``` js:hoge.js
    axios.post('/Hoge?handler=Send' , {
        hoge: 'hoge',
    }, {
        headers: {
            "RequestVerificationToken": $('input:hidden[name="__RequestVerificationToken"]').val(),
        }
    })
    .then(() => {
        // 成功の処理
        alert("送れたよ")
    })
    .catch(err => {
        // エラーの処理
        if (err.response) {
            alert('えらー');
        }
    });
```

ちょっとしたメモとして記述しておきます。
sam buildのエラー解消【EventInvokeConfig】

Lambdaの再試行回数を制御するために、SAMテンプレートに`EventInvokeConfig`の定義を追加した際に、`sam build`でエラーを吐くようになりました。

samのテンプレートは以下のような感じです。

```template.yaml
Resources:
  Function:
    Type: AWS::Serverless::Function
    Properties:
      EventInvokeConfig: # 追加
        MaximumRetryAttempts: 0  # 追加
```
ビルドすると**「EventInvokeConfigはAWS::Serverless::Functionにて定義されていません」**という旨のエラーが、、、

```terminal
$ sam build

Traceback (most recent call last):
  File "/usr/local/Cellar/aws-sam-cli/0.39.0/libexec/lib/python3.7/site-packages/samcli/lib/samlib/wrapper.py", line 71, in run_plugins
    parser.parse(template_copy, all_plugins)  # parse() will run all configured plugins
  File "/usr/local/Cellar/aws-sam-cli/0.39.0/libexec/lib/python3.7/site-packages/samcli/lib/samlib/wrapper.py", line 140, in parse
    raise InvalidDocumentException(document_errors)
samtranslator.model.exceptions.InvalidDocumentException: [InvalidResourceException('Function', 'property EventInvokeConfig not defined for resource of type AWS::Serverless::Function')]

〜略〜

```

当事象についてGitHubにIssueがありました。
[Property EventInvokeConfig not defined for resource of type AWS::Serverless::Function #1747](https://github.com/aws/aws-sam-cli/issues/1747)
aws-sam-cli 0.40.0までのバージョンでは、うまく動作しないみたいです。

ということなのでaws-sam-cliをバージョンアップしましょう。

```terminal
$ sam --version
SAM CLI, version 0.39.0

$ brew upgrade aws-sam-cli
Updating Homebrew..
 略

$ sam --version
SAM CLI, version 1.1.0
```

これで`sam build`でエラーが発生せず、ビルドできるようになりました。
適度にアップデート内容を確認して、必要に応じてバージョンアップすることが大切ですね。
【初心者向け】プログラミングの勉強法　私的メモ

SE->ディベロッパーな私が転職前にプログラミングの勉強をしたときのメモ。随時更新。

# ソースコードを読む
ある程度プログラミングできるようになったら、他人のコードを読む勉強も重要。
仕事でも他人のコードを読んでる時間が長いわけだし、優秀なエンジニアの作ったコードを読むことで「良いコードとはなにか？」の理解が深まる。


##　ソースコードの読み方

- ソースコードを読みながら、実際に動かす。
    - プログラムの動きがわからないままソースコードを見ても1つ1つの処理が理解しにくい
    - まずはプログラムを実際に動かして機能を理解する
- メイン関数があればそこから読む。
    - 全体像がつかめる。また動作とコードの繋がりが理解しやすい。
- モジュール→クラス・メソッド→ブロック→ステップの順で段階的に読む。



### 参考
- [Reading Great Code](https://docs.python-guide.org/writing/reading/)（Pythonの美しいコード一覧）
    - 特に[howdoi](https://github.com/gleitz/howdoi)は読みやすいので初心者向け
- [依存モジュールが少ないソースコードを読む - スペシャリスト岡野真也に聞くPythonの読み方と使い方](https://employment.en-japan.com/engineerhub/entry/2020/01/30/103000)
- [【入門者向け】Pythonソースコードの読み方 - みやびのどっとぴーわい](https://miyabikno-jobs.com/python-reading/)
VSCODE上でCygwinターミナル使う

# VSCODE上でCygwinターミナル使う

```xml:settings.json
    "terminal.integrated.shell.windows": "c:\\cygwin\\bin\\bash.exe",
    "terminal.integrated.shellArgs.windows": ["--login"]
```
ってする。

[関連：Cygwinインストール](https://qiita.com/fujisystem/items/64c33f9cf33fdd71555c)
tkinterとマウス操作で仕事をする件 

#経緯
　・会社でtemasを使っている。PC操作が15分以上ないとステータスが退席中になってしまう。それは困る。
　・たまには休憩したい時だってあるよね。
　・とりあえず画面でマウス操作はできたけど、色々バグあるかも。
　・プログラミング初心者なので色々うまくいかない。助けて偉い人。

　ちなみにスクリプトでマウスを動かしてもteamsのステータスは退席中になってました。無念・・・。

##実物
　開始ボタンを押したら、
　　１．指定時間分だけマウスがランダムに移動します。
　　２．メモ帳を開いて適当な文字列をキーボード入力します。(キーボード監視対策。メンテ中)
　　３．最新ニュースを取得します。(通信量監視対策。メンテ中)
　　　![画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469918/2c4f88aa-e46b-90f0-d52c-fc4dd018c7fa.png)

##コード
```working.py
import tkinter as tk
import pyautogui as pgui
import random
import datetime
import time
import subprocess
import string
import requests

class Application(tk.Frame):
    def __init__(self, master):
        super().__init__(master)

        master.geometry("230x130")
        master.title("Working!")

        self.create_widgets()

    def create_widgets(self):
        self.grid(column=0, row=0, sticky=tk.NSEW, padx=5, pady=5)
        self.time_label = tk.Label(self, text="時間指定(分)").grid(column=0, row=0, pady=10)
        self.time_box = tk.Entry(self)
        self.time_box.insert(0, '60')
        self.time_box.grid(column=1, row=0, sticky=tk.EW, padx=3)
        self.work_label = tk.Label(self, text="今日の仕事").grid(column=0, row=1, pady=10)
        self.status = tk.Label(self, text="今から本気出す")
        self.status.grid(column=1, row=1, sticky=tk.EW, padx=3)
        self.start_btn = tk.Button(self, text="開始", command=self.we_love_work).grid(column=1, row=2)

    #ボタンアクション
    def we_love_work(self):
        #action_flg = random.randint(1, 3)
        action_flg = 1
        self.status.config(text="マウスいじいじ") #更新してくれない

        time_box_value = self.time_box.get()
        end_time = datetime.datetime.now() + datetime.timedelta(minutes=int(time_box_value))
        while True:
            if datetime.datetime.now() >= end_time:
               break

            if action_flg == 1:
                self.do_mouse()
            elif action_flg == 2:
                self.do_keyboard()
            elif action_flg == 3:
                self.do_news()

    def do_mouse(self):
        window_x = 1366
        window_y = 768
        for i in range(50):
            point_x = random.randrange(0, window_x)
            point_y = random.randrange(0, window_y)
            pgui.moveTo(point_x, point_y, duration=1)
            time.sleep(3)

    def do_keyboard(self):
        #キーボード操作はできるがメモにうまく書けない
        process = subprocess.Popen(r'C:\Windows\System32\notepad.exe')
        pgui.click(50, 50)
        for i in range(10):
            pgui.typewrite(self.random_string(100))
            pgui.typewrite('\r\n')
            time.sleep(3)
        process.kill()

    def do_news(self):
        keyword = "最新"
        url = 'https://news.google.com/search'
        params = {'hl': 'ja', 'gl': 'JP', 'ceid': 'JP:ja', 'q': keyword}
        res = requests.get(url, params=params)
        print(res.text)
        time.sleep(60 * 3) #適度に間隔あけた方がいいかも？

    def random_string(n):
        return ''.join(random.choices(string.ascii_letters + string.digits, k=n))

def main():
    win = tk.Tk()
    app = Application(master=win)
    app.mainloop()

if __name__ == "__main__":
    main()
```
R: Kaggle Titanic

R で Kaggle に Submit してみました。
ほぼ、次の記事と同じです。
[【初心者用】kaggleのタイタニック号乗客の生存予測モデルをRでサクッと作る](https://hato.yokohama/kaggle_titanic/)
ただし、Score は違いました。0.70334 でした。
![titanic_aug27_aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/f3d1bcf3-0a65-31db-b7d1-36c864ed693e.png)

In [1]:

```R
library('randomForest') 

list.files(path = "../input/titanic")

train_path <- '../input/titanic/train.csv'
test_path <- '../input/titanic/test.csv'
train <- read.csv(train_path, stringsAsFactors = F )
test  <- read.csv(test_path, stringsAsFactors = F )
#
```

In [2]:

```R
# 乱数種を設定することで、毎回、同じモデルが生成される
set.seed(754)

# Survivedが目的変数（知りたい結果）で、~以降が説明変数
# 与えられた全ての変数を利用するわけではない
rf_model <- randomForest(factor(Survived) ~　Pclass + SibSp + Parch + Parch,　data = train)

# OOB estimate of  error rateが30.75%、これは
print(rf_model)
```

In [3]:

```R
# 作成したモデルを利用して、testファイルのPclass + SibSp + Parch + ParchからSurvivedを計算する
prediction <- predict(rf_model, test)

# 提出用にPassengerIdと予想したpredictionの列を持つdata.frameを作成する
solution <- data.frame(PassengerID = test$PassengerId, Survived = prediction)

# testの結果をcsvファイルに書き込む
write.csv(solution, file = 'r_titanic_aug2701.csv', row.names = F)
```
[備忘録] クライアントサーバとピアツーピアについて軽く勉強してみた

## はじめに
当記事はあくまでも勉強したことをまとめた備忘録です。笑笑

クライアントサーバシステムとピアツーピアシステムを比較しての、それぞれのメリット・デメリットをまとめた。

## クライアントサーバシステム

![クライアントサーバ-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685853/61dc5cf0-8df8-822e-41b5-f0dcb58f5339.jpeg)


### メリット
データがどこにあるのかが明確。

### デメリット
アクセスが多くなると負荷が集中するため、処理が重くなる。

### 主な活用例
世の中の大体のWebシステムはクライアントサーバシステムを採用している。

## ピアツーピアシステム (P2Pシステム)

![p2p-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685853/1aff6312-1047-a47d-ceda-28d7289a7ad8.jpeg)


### メリット
アクセスが多くなっても負荷を分散出来ているため、処理が軽い。
匿名性が確保しやすい。

### デメリット
接続している端末が増えれば増えるほど、データがどこにあるのかが不明確。

### 主なピアツーピアシステム

#### ピュアP2P
スタンダードなP2P。
クライアント同士でデータをやり取りする。

#### ハイブリッドP2P
クライアント同士でやり取りしつつ、重要なデータ等はサーバに保管するP2P。

#### スーパーノード型P2P
数多く存在する端末から選ばれた何台かの端末が、その他の端末の情報を分担して管理するP2P。
ノードとは、端末のことを意味している。

###主な活用例
Skype、LINE、ビットコイン等々...
VisualStudioCodeのスクロールバー横のミニマップを消す方法

VisualStudioCodeで作業していると、スクロールバー横のミニマップを消したくなることがあります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/fa5dace9-e15f-0f11-9e75-96860ca0a587.png" width=250 />

一行のコードが長くなると、変に折り返されてしまって見通しが悪くなるためです。

また個人的にこのミニマップの有効な使い方が分からないというのもあります。

## SettingsからMinimapを非アクティブにする

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328771/f79f6f36-84e6-577e-652b-c2b3154a4a33.png" width=450 />

`⌘`+`.`でSettingsを開き、**Minimapの項目のEnabledのチェックを外します**。これでミニマップは非表示になり、コードが表示される領域が広がります。

## 環境

- VisualStudioCode 1.48.1
【ふくだ学習録】インフラエンジニア教本-ネットワーク構築技術解説- part12【62日目】

# ふくだ学習録とは？
ふくだが学習したことの備忘録。
目に見える形で残すことによってやる気を出す個人的な作戦です。
他人に見せるように書いているわけではないので、すごく読みにくいです。

### 今読んでいる本
[インフラエンジニア教本 ~ネットワーク構築技術解説](https://www.amazon.co.jp/dp/4774170348)

# 第3章 スイッチングハブの教科書

### フェイルセーフとは
「操作方法を間違ったり、部品が壊れたり、誤作動したりした場合に、危ない方向ではなく、安全な方向へ向かう」ように設計すること
[フールプルーフ[foolproof]とフェイルセーフ[fail-safe]](https://www.i-learning.jp/topics/column/useful/foolproof.html)

### TRILL
TRansparent Interconnection of Lots of Linksの略。
イーサネットを冗長化させるにあたって、STPに変わる可能性があるもの。
STPではルータがそれぞれ木構造になるように管理するが、TRILLではグラフに置き換える事で、レイヤ2にもルーティングの概念を持ち込めるようになる。（現在、標準化の最中）

# ケーブリングの教科書

### パラレル通信,シリアル通信
ネットワークの通信形式のこと。
[シリアル、パラレル伝送方式](https://www.lineeye.co.jp/html/term_serialpara.html)

### バス型
全ての機器を一筆書きできるような構成の接続形態。
[ネットワークトポロジーとは？スター型、バス型、リング型を図解](https://lab.fujiele.co.jp/articles/7294/)

### バスアービトレーション
ある瞬間にバスの使用権を持つことが許されるのは、1つのマスタだけである。複数のマスタが同時にバスを使用することはできない。 そのため、バスに複数のマスタが存在する場合には、何らかの方法で、それぞれのマスタに使用権をうまく割り当てていかなければならない。 これをバスアービトレーション（arbitration:調停）という。
[バスアービトレーション](https://japan.zdnet.com/glossary/exp/%E3%83%90%E3%82%B9%E3%82%A2%E3%83%BC%E3%83%93%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3/)

### 調歩同期式,クロック同期式
シリアル通信を利用する場合、送られてくるどの部分がデータの先頭なのか、データの末尾はどこなのかを識別する必要がある。その方法として「調歩同期式（非同期式）」と「クロック同期式」の2つがある。
[SHマイコンでシリアル通信をしよう!! (1/3)](https://monoist.atmarkit.co.jp/mn/articles/1105/18/news001.html#:~:text=%EF%BC%882%EF%BC%89%E8%AA%BF%E6%AD%A9%E5%90%8C%E6%9C%9F%E5%BC%8F%E3%81%A8%E3%82%AF%E3%83%AD%E3%83%83%E3%82%AF%E5%90%8C%E6%9C%9F%E5%BC%8F&text=%E8%AA%BF%E6%AD%A9%E5%90%8C%E6%9C%9F%E5%BC%8F%E3%81%AF%E3%80%81%E9%80%81%E4%BF%A1,%E3%81%A6%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%A7%E3%81%99%E3%80%82&text=%E4%B8%80%E6%96%B9%E3%80%81%E3%82%AF%E3%83%AD%E3%83%83%E3%82%AF%E5%90%8C%E6%9C%9F%E5%BC%8F%E3%81%AF,%E5%90%8C%E6%9C%9F%E3%82%92%E5%8F%96%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%A7%E3%81%99%E3%80%82)

# 今日の一言
ここ最近モチベーション低下がえぐい、、
きばろ
Microsoft MAK/KMSキーの認証上限を拡張する申請手順

#目的
MicrosoftボリュームライセンスのMAK/KMS認証上限はほとんどの場合デフォルトで50ですが、それでは不足する場合が多々あると思います。
上限を拡張する場合、Microsoft社のページの申請フォームから申請を行う必要がある為手順をまとめました。

#手順
以下のページにアクセスし、申請フォームへ記入。
https://support.microsoft.com/ja-jp/supportrequestform/2afa6f15-b710-db46-909a-8346017c802f

記載したメールアドレスにsupport@mail.support.microsoft.comから以下確認のメールが届く。
記載して返信

・会社名（漢字）
・契約番号
　※ Open License 契約の場合は
　　　　ライセンス認証番号（英数字 15 桁）/ ライセンス番号（数字 8 桁）
・製品名 および エディション ・ バージョン
　※1回の申請につき1製品
・MAK または KMSキー (下 5 桁)
・MAK または KMS どちらかご選択ください
・引き上げ希望数
　※100と記載した場合は現在の上限数+100

#終わりに
上限数拡張が反映するのは3営業日後とのこと。
記事にしてみると意外と大したことない手順でした。
オムニチャネルを通じて割り当てられたレコードは、ワークフロールール、エスカレーションルール、トリガーなどの自動化をトリガーしません


#オムニチャネルを通じて割り当てられたレコードは、ワークフロールール、エスカレーションルール、トリガーなどの自動化をトリガーしません
Records assigned through Omni-Channel don't trigger any automation like Workflow Rules, Escalation Rules or Triggers

https://help.salesforce.com/articleView?id=000337822&type=1&mode=1


逆にどうやったら、トリガー等ができるのか？という質問。
https://trailblazers.salesforce.com/answers?id=9064S000000CuXnQAK

アイデアが挙がっています。
https://trailblazer.salesforce.com/ideaView?id=0873A000000PU6rQAG

ここの書き込みで

Hi Guys, No need of this idea. I could achieve it very simply. It did not trigger case automation processes. But it will trigger Agent Work workflows, triggers flows and process builders

I have created a process builder for Agent Work record  creation and set the Status to In Progress. Here you can easily add an email notification.

ケース自動化プロセスはトリガーされませんでした。しかし、それはエージェントワークワークフローをトリガーし、フローとプロセスビルダーをトリガーします

とありますね、
https://help.salesforce.com/articleView?id=omnichannel_agent_work_fields.htm&type=0
オブジェクトがオムニチャネル経由でエージェントに転送されるたびに、割り当て作業に関する情報や転送方法を記録するエージェント作業レコードが Salesforce で作成されます。エージェント作業レコードには、エージェントが操作している割り当て作業に関する情報の追跡に役立つ項目が含まれています。同じ作業項目が複数回転送されると、その作業項目が複数のエージェント作業レコードに関連付けられます。
goでターミナルから簡単に目的のウェブページに飛ぶツール作った

### 成果物

<a href="https://github.com/YumaFuu/bookmark-go"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/YumaFuu/bookmark-go.png" width="460px"></a>

[![Image from Gyazo](https://i.gyazo.com/4fe94e15c423e6ffa6ec50f9ffa36b2b.gif)](https://gyazo.com/4fe94e15c423e6ffa6ec50f9ffa36b2b)

gifのようにするには以下のコマンド(alias貼らないと実用的じゃない)

```shell
$ bookmark-go show | fzf | bookmark-go open
```

### 課題感
- アクセスしたいウェブページへのアクセス方法がバラバラ(slackの履歴からやscrapboxのwikiページからなど)でブラウザで表示するまでに時間がかかる
- chromeの履歴に残ってたりするけどヒットできなかったりする
- chromeのブックマークも良いけどgui操作がちょっと萎える

### 要件
- [fzf](https://github.com/junegunn/fzf)や[peco](https://github.com/peco/peco)を使って登録済みのurlを開ける
- 登録，削除できる
- 登録しているurlの一覧をみれる

### 実装
簡単に実装を紹介します
[cobra](https://github.com/spf13/cobra)というcliアプリ向けのパッケージを使いました
k8sやgithub cliにも使われているみたいです

基本的にcobraのチューリアルに沿って実装しました



mainは極薄でcmd以下にコマンドを追加していく実装です

```main.go
package main

import "bookmark-go/cmd"

func main() {
	cmd.Execute()
}

```

以下のようにroot cmdを宣言してmainから呼んでいます
rootCmd.AddCommandでコマンドを追加できる

```cmd/root.go
package cmd

// 省略

func Execute() {
	all := []*cobra.Command{
		addCmd,
		indexCmd,
		deleteCmd,
		openCmd,
	}

	for _, c := range all {
		rootCmd.AddCommand(c)
	}

	if err := rootCmd.Execute(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}
```

各cmdは以下にあるような感じ
urlを開くcmdは受け取ったidでdbから検索してexec.Commandで開いているだけ

```open.go
package cmd

//省略

var openCmd = &cobra.Command{
	Use:   "open",
	Short: "open url",
	Long:  `open url`,
	Run:   open,
}

func open(cmd *cobra.Command, args []string) {
	db := db.NewDB()
	defer db.Close()

	var u models.URL
	var s string

	if id == "" {
		cli.GetInput("id", &s)
		items := strings.Fields(s)
		if len(items) == 0 {
			return
		}
		id = items[0]
	}

	err := db.Where("id = ?", id).First(&u).Error
	if err != nil {
		log.Fatal(err)
	}

	fmt.Printf("open %v¥n", u.Url)
	exec.Command("open", u.Url).Run()

	u.LastVisitAt = time.Now()
	err = db.Save(&u).Error
	if err != nil {
		log.Fatal(err)
	}
}


```
   
### 学んだこと
- 標準入出力はパイプを使うとめちゃくちゃ可能性を秘めていると感じた
    - シェル極めたい
- Goとsqliteで簡単にcliツール作れるから良い感じ
    - もっと色々cliツール作りたいと思った

### TODO
- テスト書く
個人メモ] pipenvで環境構築 2020年



pipenvのドキュメントから毎回見つけるのが結構手間なのでメモ.

```shell

# プロジェクト直下にvenvを作る
export PIPENV_VENV_IN_PROJECT=1

# 環境を作成
pipenv install --python 3.6

# Pipfileから環境構築
pipenv install

# Pipfile.lockから環境構築
pipenv sync

# requirements.txtからパッケージをインストール
$ pipenv install -r path/to/requirements.txt


# Pipfile.lock を作成
$ pipenv lock

# requirements.txtを作る
$ pipenv lock -r

# requirements.txt devを作る
$ pipenv lock -r --dev


```


ドキュメント
- [Pipenv: 人間のためのPython開発ワークフロー — pipenv 2018.11.27.dev0 ドキュメント](https://pipenv-ja.readthedocs.io/ja/translate-ja/index.html)
- [Pipenvの基本的な使い方 — pipenv 2018.11.27.dev0 ドキュメント](https://pipenv-ja.readthedocs.io/ja/translate-ja/basics.html)
Invalid Bundle. The bundle xxxxxx.app/Frameworks/App.framework does not support the minimum OS Version specified in the Info.plist.の対処方法

## FlutterアプリをApp Store Connectにアップロードするときにエラーが出た。

Xcode(バージョン`Version 11.6 (11E708)`)でビルド後、`Product`→`Archive`→`Validate App`で下記のエラーが出たときの対応方法。

## 【エラー】 Invalid Bundle. The bundle yourapp.app/Frameworks/App.framework does not support the minimum OS Version specified in the Info.plist.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107119/b8d0e5f7-11a1-802f-71c7-f7cf1acf6083.png)



`ios/Flutter/AppFrameworkInfo.plist`の`MinimumOSVersion`を13に変更する。

```ios/Flutter/AppFrameworkInfo.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>CFBundleDevelopmentRegion</key>
  <string>$(DEVELOPMENT_LANGUAGE)</string>
  <key>CFBundleExecutable</key>
  <string>App</string>
  <key>CFBundleIdentifier</key>
  <string>io.flutter.flutter.app</string>
  <key>CFBundleInfoDictionaryVersion</key>
  <string>6.0</string>
  <key>CFBundleName</key>
  <string>App</string>
  <key>CFBundlePackageType</key>
  <string>FMWK</string>
  <key>CFBundleShortVersionString</key>
  <string>1.0</string>
  <key>CFBundleSignature</key>
  <string>????</string>
  <key>CFBundleVersion</key>
  <string>1.0</string>
  <key>MinimumOSVersion</key>
  <string>13.0</string> ## ここを8から13に変更した。
</dict>
</plist>

```

## 終わりに

iOSもandroidの開発もやったことない人がFlutterやるときに一番困るのがアプリの申請だと思う。
エラーが出ても何言ってるか分からない。同じようなファイルたくさんあるし。

なるべく遭遇したエラーは書いていこうと思う。
SwiftでJSONを読む

今更感ありますが……

# DecodableとJSONDecodeでJSONを読む

今回はこういうJSONを用意しました
[JSONの元ネタ](https://www.google.com/search?client=safari&rls=en&q=currency+code&ie=UTF-8&oe=UTF-8)

```currency.json
[
  {
    "alphabeticCode": "AED",
    "numericCode": 784
  },
  {
    "alphabeticCode": "AFN",
    "numericCode": 971
  },
  {
    "alphabeticCode": "ALL",
    "numericCode": 8
  }
]
```

Decodableプロトコルを継承した構造体を作ります
今回はJSONのキーとメンバ変数の名前を揃えます

``` Swift
struct Currency: Decodable{
    let alphabeticCode: String
    let numericCode: Int
}
```

JSONをData型で開きます
（ここではplaygroundのResourceフォルダに置いています）

```Swift
let path = Bundle.main.path(forResource: "currency", ofType: "json")
let url = URL(fileURLWithPath: path!)
let currencyJson = try Data(contentsOf: url)
```


``` JSONDecoder ```で読みます
この時、```[Currency]```ではなく```Currency```で読みに行くとエラーになります（元のJSONもそういう構造になっていますね）

```Swift
let result = try JSONDecoder().decode([Currency].self, from: currencyJson)
result.forEach { currency in
// ...
}
```

コード全文

```Swift
import Foundation

struct Currency: Decodable{
    let alphabeticCode: String
    let numericCode: Int
}

let path = Bundle.main.path(forResource: "currency", ofType: "json")
let url = URL(fileURLWithPath: path!)
let currencyJson = try Data(contentsOf: url)
let result = try JSONDecoder().decode([Currency].self, from: currencyJson)
result.forEach { currency in
// ...
}
```

ありがとうございました
[Python] locals() の使い所

Python向けのテンプレートエンジン`Jinja`のコードリーディングをしていたところ、`locals()`という見慣れない関数が使われていて、調べてみたのでメモしておきます。

- [GitHub - pallets/jinja](https://github.com/pallets/jinja)

# `locals()`とは？

[リファレンス](https://docs.python.org/ja/3/library/functions.html#locals)から抜粋すると、

> 現在のローカルシンボルテーブルを表す辞書を更新して返します。 関数ブロックで locals() を呼び出したときは自由変数が返されますが、クラスブロックでは返されません。 モジュールレベルでは、 locals() と globals() は同じ辞書であることに注意してください。

と、`locals()`が実行された時点で定義されているローカル変数が返ってくると解釈しました。

試しにインタプリタを起動して、`locals()`の挙動を確認してみます。

```py
>>> a = 1
>>> def sample(b="2", c=True):
...     d = 4
...     l = locals()
...     print(l)
...     print(type(l))
... 
>>> sample()
{'b': '2', 'c': True, 'd': 4}
<class 'dict'>
```

スコープ外である`a`は取得されず、`sample`メソッド内で定義された変数が取得できたことから、リファレンスを読んだ解釈は齟齬なさそうに思います。

# `jinja`での`locals()`使用箇所

`jinja`にはインスタンスの設定情報を上書きする`overlay`メソッドが提供されています。

- [jinja 2.11.x - API - overlay](https://jinja.palletsprojects.com/en/2.11.x/api/#jinja2.Environment.overlay)

`overlay`のメソッドを読んでいたところ、`locals()`が以下のように使用されていました。

```python:jinja/src/jinja2/environment.py 
# https://github.com/pallets/jinja/blob/737a4cd41d09878e7e6c584a2062f5853dc30150/src/jinja2/environment.py#L385-L428
    def overlay(
        self,
        block_start_string=missing,
        # ... 省略 ...
        bytecode_cache=missing,
    ):
        # ... 省略 ...
        args = dict(locals())
        # ... 省略 ...
        for key, value in iteritems(args):
            if value is not missing:
                setattr(rv, key, value)
```

`overlay`の引数は多いのだが、`locals()`を使って`args`にまとめ、呼び出し側が指定した値のみを更新するよう、スマートな処理で実装されています。

上記から、`locals()`は大量の引数を一つの`dict`にまとめ、次の処理や`jinja`のように呼び出し側から指定された値のみを取り出すような処理に向いていると感じました。

# まとめ

以下、自分なりのまとめです。

- `locals()`は、`locals()`実行時点までに定義されたローカル変数を`dict`で取得できる
- 大量の引数を`dict`にまとめて処理したいときに使える

以上になります。
書いた内容や解釈に間違い、他の使い道やバットノウハウ等ありましたら、コメントいただけると助かります。 :pray:
Windows10でエクスプローラーの挙動を統一させたい

こんにちは、ほなふくです。

Windowsを使ってて、エクスプローラーでの表示はすべて詳細表示で良いのに、と思ったことはありませんか？
これでサクッと解決できます。

#方法

エクスプローラーで任意のウィンドウを起動し、表示を詳細表示にします。~~詳細表示じゃなくてもなんでもいいです~~

左上の"表示"から"オプション"を選択します。すると以下のような画面が表示されるので、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593714/0e4eec29-3268-48ac-cccf-9f144271a0a9.png" width="300px">
"表示"タブを選択して、"フォルダーに適用"を選択します。

おわり！

これでもうエクスプローラーにイライラする事がなくなるね、やったね！

#雑談

私はエクスプローラーでの表示が場合によってバラバラになることに納得できません。

こうなってることもあれば、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593714/34118221-9656-3a01-c715-dc905ade8310.png" width="700px">

こうなったりもします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593714/2ecf1460-9aa6-0f24-21b7-003a33cc70dc.png" width="700px">

基本的に私はすべて1枚目のように詳細表示でいいと思っています。

これの設定方法をググって見たところ似たような記事はあったのですが、
([answers.microsoft.com](https://answers.microsoft.com/ja-jp/windows/forum/windows_7-files/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE/69bea055-8ee4-4ee5-a8fa-003f7a408536 "answers.microsoft.com"))
微妙にわかりにくかったんですね。

こんどこそおわり。
AWSのセキュリティ


##AWSの責任共有モデル  

-  AWSはクラウド本体のセキュリティ部分を担当する。
-  ユーザーはクラウド内のセキュリティを担当する。
-  AWSが用意するセキュリティサービスを適切に活用して、ユーザーはクラウド内のセキュリティを管理できる。

##AWSクラウドのセキュリティ

-  AWSのデータセンターのセキュリティはAWSの担当。
-  ハイパーバイザーのセキュリティはAWSの担当。
-  ルートアカウントのAPIキーは作成しない。
-  マネージドでないサービスのセキュリティの責任については、ユーザーが操作できる部分は全てユーザーの責任。
-  サービスのプラットフォーム部分はAWSの責任。
-  転送中データを保護するには、適切なプロトコルおよび暗号化アルゴリズムを選択する。

##IAM

-  各IAMユーザー、IAMグループには、必要最低限の権限を付与する。
-  IAMポリシーが相反するときには、拒否が優先される。
-  IAMユーザーには、最大２つのAPIキーが発行できる。


##セキュリティグループ

-  認可ルールの指定が可能
-  拒否ルールは指定は不可能
-  インバウンドトラフィックとアウトバウンドトラフィックのルールを個別に指定可能。

##AWS　ShieldとAWS WAF

-  AWS Shieldはマネージド型のDDoS攻撃に対する保護サービス。
-  AWS Shield　Standardは一般的なDDoS攻撃からAWS上のシステムを保護する。
-  AWS　WAFはマネージド型のWebアプリケーションファイアウォールサービス。
-  AWS　WAFの基本利用料は無料。Webセキュリティルールに基づき課金される。


##Inspector

-  Amazon Inspectorは脆弱性診断を自動で行うことができるサービス。
-  EC2上にデプロイされたアプリケーションに対応。
-  各種ルールパッケージはAWSが最新のものにアップデート。
-  スケジューリング設定により、完全に自動でチェック可能。

<br/>
<br/>
<br/>


_引用元：AWS認定クラウドプラクティショナー   トレノケート株式会社　山下光洋、海老原寛之_
【JavaScript】オブジェクトについて

#1.配列要素の挿入、削除
配列に要素を挿入したり、要素を削除する方法を見ていきます。

```js

const alphabet = [a, b, c, d, e];

// 先頭に要素を追加したい場合 => unshift
alphabet.unshift(追加したい要素);

// 先頭の要素を削除したい場合 => shift
alphabet.shift(); // 削除は１つずつしかできないので（）の中は空白

// 末尾に要素を追加したい場合 => push
alphabet.push(追加したい要素);

// 末尾の要素を削除したい場合 => pop
alphabet.pop(削除したい要素); // 削除は１つずつしかできないので（）の中は空白

// 追加と削除を同時に行う場合 => splice
alphabet.splice(変化が開始する位置[index], 削除数, 追加したい要素); 

alphabet.splice(１, ２, f, g); 
出力結果は　[a, f, g, d, e] になる
// b,cを削除してf,gが挿入された
```

#2.スプレット構文

スプレット構文は配列の中に配列を展開したいときに便利です。

```js

const alphabet = [a, b, c, d, e];
const others = [f, g, h, i];

const alphabet = [a, b, c, d, e, ...others]とすることで配列の中に配列を展開できる
```

#3.分割代入

分割代入とは、配列の要素を変数に代入したいときに使用します。

```js

const scores = [10, 20, 30, 40, 50];

const [a, b, c, d, e] = scores;　
上記記述により、
a = 10,
b = 20,
c = 30,
d = 40,
e = 50,
となり、別々の変数を割り当ててくれる
```

#4.forEach();
forEachをしようすることで、配列の要素を１つずつ出力することできます。

```js

const scores = [10, 20, 30, 40, 50];

scores.forEach((score, index) => {
  console.log(`- ${index + 1} 番目の点数は ${score} 点です`)；
});

// 出力結果
- 1番目の点数は10点です
- 2番目の点数は20点です
- 3番目の点数は30点です
- 4番目の点数は40点です
- 5番目の点数は50点です

```

#5.map();
mapは配列の要素に何らかの処理を加え、別の配列として新しく生成することができます。

```js

const scores = [10, 20, 30, 40, 50];
// 別の定数として、新しく配列をつくる
const scoreChange = scores.map((score) => {
  return score + 100;
});
console.log(scoreChange);
// 出力結果
[110, 120, 130, 140, 150]

```

#6.filter();
filterは条件に合う要素のみを抽出して別の配列として取得することができます。

```js

const numbers = [1, 4, 7, 8, 10];
// 2で割り切れた要素のみ抽出
const evenNumbers = numbers.filter(number => {
  return number % 2 === 0;
});
console.log(evenNumbers);
// 出力結果
[4, 8, 10]

```

#7.join();　split();

joinは配列要素を文字列として結合するときに使用します。

```js

const day = [2020, 07, 09];
day,join("/");
// 結果
2020/07/09
```

splitはjoinとは逆で文字列を配列要素として取得します。

```js

const day = "2020/07/09";
day,split(":");
// 結果
[2020, 07, 09]
```

#8.数値の操作

```js
Math.floor(); 小数点以下切り捨て
Math.ciel(); 小数点以下切り上げ
Math.round(); 四捨五入
Math.変数.toFixed(桁数指定); 桁数を指定
Math.random(); ０以上1未満の数値をランダムに生成
```

以上
Android Jetpack Compose α版 を試す

昨日 2020/08/26 に Jetpack Compose の 1.0.0-alpha がリリースされていました。

公式のサンプルアプリをサクッと試す方法を書いていきます。

最新の情報や公式チュートリアルは以下のページを参考にしてください。英語版で見たほうが情報の更新が早いのでおすすめです。

[Recent Release Notes  \|  Android Developers](https://developer.android.com/jetpack/androidx/versions/all-channel)

[Jetpack Compose  \|  Android Developers](https://developer.android.com/jetpack/compose)

## 準備

現時点（2020/08/27時点）では Android Studio の Canary build が必要です。

1. [Android Studio Preview  \|  Android Developers](https://developer.android.com/studio/preview) からCanary build のダウンロードリンクをクリック
2. ダウンロードしたzipファイルを展開
3. `android-studio/bin/studio64.exe` を実行
4. Setupウィザードの指示にしたがってセットアップ


## Jetpack Composeアプリの実行

### サンプルアプリの取得

公式のサンプルアプリ集が [android/compose\-samples](https://github.com/android/compose-samples) から取得できます。

```sh
git clone https://github.com/android/compose-samples.git
```

### サンプルアプリの種類
README に書いてあるとおり8個のサンプルアプリを利用できます。

- Jetnews - ブログビューア
- Jetchat - チャットアプリ
- Jetsurvey - アンケートアプリ
- Jetsnack - e-コマースアプリ
- Jetcaster - ポッドキャスト
- Rally -  [Rally \- Material Design](https://material.io/design/material-studies/rally.html) のCompose実装
- Crane - [Crane \- Material Design](https://material.io/design/material-studies/crane.html) のCompose実装
- Owl - [Owl \- Material Design](https://material.io/design/material-studies/owl.html) のCompose実装

### サンプルアプリの実行

試しに Jetchat を実行してみましょう。

GitHubから取得したサンプル集の中から `compose-samples/Jetchat` を開いて実行してみます。

手元にある Pixel 3 (Android 10) で実行してみました↓

![device-2020-08-27-054906.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698583/a9d1f90a-2f5d-87c0-23b4-fe07a5ab09e0.gif)

![device-2020-08-27-055821.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698583/01dc17db-be45-80e9-77be-2074cc05a57e.gif)


問題なく動いてるみたいです。

### プレビュー機能

Android Studio で `profile/Previews.kt` や `conversation/Conversation.kt` を開くと、エディタ上でUIプレビューを同時に見ることができます。

ダークテーマや、画面サイズが異なる場合、UIへの入力が異なる場合などのプレビューを同時に見られるのが強力ですね。

![2020-08-27 073610.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698583/54f65144-26ba-139e-e49c-de34dba9aa6b.png)


## 注意点

最後に公式ページにある注意点をおいておきます。

> Note: Jetpack Compose is currently in alpha. The API surface is not yet finalized, and changes are planned and expected. See the Jetpack release notes for the latest updates.

## まとめ
- Jetpack Compose のα版がリリースされました
- Jetpack Compose を試すには Android Studio Canary Build が必要です
- [android/compose\-samples](https://github.com/android/compose-samples) から公式のサンプルアプリが取得できます

## 参考

英語情報ですが YouTube の Android Developers チャンネル に Compose の情報が配信されています。もっと知りたい方はこちらもご参照ください。

[Compose for existing apps \- YouTube](https://www.youtube.com/watch?v=PjQdFmiDgwk)

[Thinking in Compose \- YouTube](https://www.youtube.com/watch?v=SMOhl9RK0BA)

[Compose by example \- YouTube](https://www.youtube.com/watch?v=DDd6IOlH3io)
Swiftで学ぶFactory Methodパターン【Swift Design Pattern】

![500px-Factory_Method_UML_class_diagram.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276894/ac4e82d2-198c-3ad8-652c-c9fbd527d234.png)
(図:  [wikipedia](https://ja.wikipedia.org/wiki/Factory_Method_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3))


## 特徴
- **「生成」**に関するパターン
- Factory Methodはクラスのイニシャライザの代わりに使用する。
**オブジェクト生成のプロセスを抽象化し、実行時にインスタンス化したオブジェクトの型を生成**する。
- ファクトリーは「工場」、**インスタンスを生成する工場**がFactory Methodパターン。
- 単体のみ生成のケースだと**Template Method**パターンになる。
- Javaでいうと抽象クラスにあたる。

## ソースコード

```swift:example
// 通貨の説明
protocol CurrencyDescribing {
    var symbol: String { get }
    var code: String { get }
}

final class Euro: CurrencyDescribing {
    var symbol: String {
        return "€"
    }
    var code: String {
        return "EUR"
    }
}

final class UnitedStatesDolar: CurrencyDescribing {
    var symbol: String {
        return "$"
    }
    var code: String {
        return "USD"
    }
}

enum Country {
    case unitedStates
    case spain
    case uk
    case greece
}

struct CurrencyFactory {
    static func currency(for country: Country) -> CurrencyDescribing? {
        switch country {
        case .spain, .greece:
            return Euro()
        case .unitedStates:
            return UnitedStatesDolar()
        default:
            return nil
        }
    }
}

```

```swift:usage
import UIKit

class ViewController: UIViewController {

    let noCurrencyCode = "No Currency Code Available"

    override func viewDidLoad() {
        super.viewDidLoad()
        let greece = CurrencyFactory.currency(for: .greece)?.code ?? noCurrencyCode // "EUR"
        let spain = CurrencyFactory.currency(for: .spain)?.code ?? noCurrencyCode "EUR"
        let unitedStates = CurrencyFactory.currency(for: .unitedStates)?.code ?? noCurrencyCode // "USD"
        let uk = CurrencyFactory.currency(for: .uk)?.code ?? noCurrencyCode // "No Currency Code Available"
    }
}
```
[サンプルコード](https://github.com/snt-nbzw/FactoryMethodDesignPatternSample
)

## 関連パターン
- Template Method
    - Factory Methodパターンは**Template Method**パターンの応用。
- Singleton
    - CurrencyFactoryを務める構造体は、**Singleton**パターンとしても作ることができる。
    - インスタンスが複数存在する必要がないため。
- Composite
    - CurrencyDescribingを務めるprotocolにCompositeが当てはまる場合がある。
- Iterator
    - Iteratorのインスタンスを作成する際に、Factory Methodパターンが使われる場合がある。

## まとめ
- 1つのクラスを見るだけでは、どのパターンかを判断することができない。
    - クラスやプロトコルの**相互関係**を目を向けて見定める。

## 参考
- [[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン ～Factory Method～ - Qiita](https://qiita.com/y-some/items/308966bdea99ceb27db9)
- [Swiftで書くデザインパターンまとめ - Qiita](https://qiita.com/susieyy/items/de43bd0a3ceec5c597b9)
- [ochococo/Design-Patterns-In-Swift: 📖 Design Patterns implemented in Swift 5.0](https://github.com/ochococo/Design-Patterns-In-Swift)
- [増補改訂版Java言語で学ぶデザインパターン入門 | 結城 浩 |本 | 通販 | Amazon](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797327030)
命日から五十回忌までの日付を取得

かなりマニアックな内容ですが、命日から中陰（七日ごと四十九日まで）、年忌（一周忌〜五十回忌）までの日付を取得する関数を作りました。

##開発環境
MAMP

##コード

```
<?php

function calcTyuin($day)
{
    $tyuin_days = [];
    for ($i = 0; $i < 7; $i++) {
        if ($i === 0) {
            $date = date_create($day);
        }
        date_add($date, date_interval_create_from_date_string('7 days'));
        $tyuin_days[] = date_format($date, 'Y-m-d');
    }

    return $tyuin_days;
}

function calcNenki($day)
{
    $nenki_days = [];
    $add_years = [1, 2, 6, 12, 16, 24, 32, 49];

    foreach ($add_years as $add_year) {
        $date = date_create($day);
        date_add($date, date_interval_create_from_date_string($add_year . 'year'));
        $nenki_days[] = date_format($date, 'Y-m-d');
    }

    return $nenki_days;
}

$day = '2020-01-01';
$tyuin = [];
$nenki = [];

$tyuin = calcTyuin($day);
$nenki = calcNenki($day);

//中陰
foreach ($tyuin as $tyuin_day) {
    echo $tyuin_day . "\n";
}

//年忌
foreach ($nenki as $nenki_day) {
    echo $nenki_day . "\n";
}
```

##解説
中陰を計算する関数と、年忌を計算する関数を用意しました。
計算するといっても日を足したり年を足したりするだけですが。

中陰を計算する関数では、for文を用いて基準となる日に七日*6回足していき配列に格納しました。
年忌を計算する関数では、あらかじめ加算用の配列を用意しておき、foreach文を用いて基準となる日に加算用配列の年を足していき配列に格納しました。

次は再帰関数を用いてチャレンジしてみたいと思います。
v-forの中で要素毎に真偽値を適用させて表示のオンオフを切り替える方法

[前回](https://qiita.com/sukeo-sukeo/items/92db381816589d7eb9d9)axiosでQiitaの自分の投稿記事を取得できました。今回はその取得した記事の中で３日以内に投稿された記事に対してのみ「New!」を付ける方法を書いてみます。
## 付けたい要素
v-forで渡ってくるitem.newBadgeの真偽値で表示を切り替える。
今回Bootstrapのバッジクラスの付いたDOMを適用させたいと思います。

```html
<span v-show="item.newBadge" class="badge badge-danger">New!</span>
```

## ３日前を判定する  
axiosで取得したデータのupdate_atプロパティに更新日が入ってますので、それをDateオブジェクトに変換し、今日の日付と引き算して３日前の記事を割り出します。
methods:に処理を記述していきます。

```js
qiitaContentsProcessing: function() {
      const today = new Date()
      this.infoAll.forEach((info, i) => {
        const updateday = new Date(this.infoAll[i].updated_at);
        const day = (today - updateday) / 1000 / 60 / 60 / 24
        if (day < 3) {
          this.infoAll[i].newBadge = true
        } else {
          this.infoAll[i].newBadge = false
        }
      })
    }
```
todayからupdatedayを引いた数値が3未満(2.9999...)＝3日以内だったらnewBadge:trueというプロパティを新たに追加します。
3以上だったらnewBadge:falseを追加します。
## 要素を追加
v-forの中でspan要素毎にnewBadgeの真偽値に応じて表示、非表示が切り替わります。

```html
<ul>
    <li v-for="item in infoAll" :key="item.id">
        {{ item.updated_at }}
        <span v-show="item.newBadge" class="badge badge-danger">New!</span><br>
        <a :href="item.url" target="_blank">
        {{ item.title }}
        </a>
    </li>
</ul>
```

## まとめ
いろいろ試行錯誤した結果この方法に辿り着きました。今回の方法が正しいかどうかわかりませんが、オブジェクトに真偽値のプロパティを追加することでDOMへの対応の幅が広がりそうです。

## おまけ
別の方法として文字列のNew!を追加するだけであれば  

```js
this.infoAll[i].updated_at = this.infoAll[i].updated_at  + 'New!'
```
if判定のtrueのブロック内に上記の記述で、プロパティやspan要素を記述することなくいけます。ただstyaleを当てれないので少し味気ない印象にはなりますね...
私も最初はこの方法でしたが、少し表示をリッチにしたいと思い、試行錯誤が始まった経緯です。
TypeScript 4.0で推したい追加機能ピックアップ

## はじめに
先日（8/20）TypeScript 4.0 がリリースされました。
メジャーアップデートとしては<b>約2年ぶり</b>となります。
https://devblogs.microsoft.com/typescript/announcing-typescript-4-0/
個人的に推したい機能がいくつかあったので紹介します。🍣

※ちなみに、TypeScript3.0のリリースは2018/7/30です。
https://devblogs.microsoft.com/typescript/announcing-typescript-3-0/

## TypeScript 4.0で追加された機能

### Labeled Tuple Elements
配列内の要素に<b>ラベル付け</b>をすることができるようになりました。
今までは配列を引数とする関数を定義する場合は、

```typescript
function foo(...args: [string, number]): void {
    // something
}
```

のように型定義しかできなかったため各パラメータが何を意味しているのかわかりづらいですね。

それか、配列の使用を諦めることを余儀なくされていました。

```typescript
function foo(arg0: string, arg1: number): void {
    // something
}
```

TypeScript 4.0では、配列内の要素にラベル付けができるようになります。💡

```typescript
type Range = [start: number, end: number];
```

つまり、以下のような関数定義が可能になります。

```typescript
function foo(x: [first: string, second: number]) {    
    // something
}
```

<b>座標情報</b>など、用途が固まっていて配列で扱いたい場合は可読性がグッと上昇しますね。
おまけですが、<b>サポートされているエディターではラベルをオーバーロードして表示</b>してくれるらしいです。

![signatureHelpLabeledTuples.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246580/606bd733-2d47-5a34-d4a4-c6049d1da5f5.gif)

### Short-Circuiting Assignment Operators
新しく代入演算子が追加されました。
JavaScriptにはありましたが、TypeScriptにはなかった次の演算子が追加となります。

- &&=
- ||=
- ??=

これにより、以下のように <b>if ブロックを削減</b>することができます。

```typescript
// before
if (!a) {
    a = b;
}

// after
a ||= b

```
一目でめちゃくちゃ便利なことがわかりますね。

### unknown on catch Clause Bindings
catch句の変数に<b>unknown型</b>を適用できるようになりました。
今まで catch句の変数には <b>any型</b> が適用されていたので、変数に対してやりたい放題実装できるようになっていました。

```typescript
try {
    // ...
}
catch (x) {
    // xがany型なので未定義の操作も実行できてしまう
    console.log(x.message);
    console.log(x.toUpperCase());
    x++;
    x.yadda.yadda.yadda();
}

```
これだとセーフティな実装とは程遠くなってしまいますね。

unknown型を適用することで、<b>事前の型チェックを強制</b>できます。

```typescript
try {
    // ...
}
catch (e: unknown) {
    // エラー
    console.log(e.toUpperCase());

    if (typeof e === "string") {
        // 型チェックを行うことで実行できる
        console.log(e.toUpperCase());
    }
}

```

静的解析と組み合わせることで、更にTypeScriptの強みを生かした実装ができそうです。

### /** @&#xFFF0;deprecated */ Support
JSDocで/** @&#xFFF0;deprecated */を記載すると対象の関数に<b>打ち消し線</b>が表示されるようになりました。

 ![deprecated_4-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246580/3ad522fb-6334-ceb9-3087-8c6abf8438e5.png)

他の言語やエディターだと結構メジャーな機能だと思うので地味に嬉しいです。
ライブラリを自作している場合や大規模リファクタリングを実施している際に大きな力になってくれそうです。

## 終わりに
今回のメジャーアップデートは安全性や利便性を高める比較的安定した機能追加が多かったです。
ドラスティックな変更が無い分、新規にTypeScriptを導入する際もバージョンの差異を気にすることなく最新版を導入してもいいと思います！

個人的にとても好きな言語なのでこれからも随時追いかけて発信していきたいと思います！