OmniAICreator/Qiita-1.07M huggingface dataset:
arduino nanoで内気外気をタイマーリレーで切り替え制御 -3

##リードリレーSS1A05を制御する
初回作成のタイマーリレーから３年くらいがたちディスプレイもSSD1331を使用したカラーにしたり改修を重ねてきてここへきて新しく同じものを２代目を作成しようと奮闘中
コイルのリレーからリードリレーの安価なものに部品を入れ替えDC-DCコンバーター（12V→5V）も安価な部品にして作成。
arduinoのプログラムは変更せずに配線をまとまりのあるものにしようとしている
![IMG_20200310_221614_382.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200517/556b43f5-a11c-2939-97d5-7ecbd6734267.jpeg)
（車側のボタン操作に相当するリレー駆動時は緑のLEDが点灯する。電源コネクタを設置したのは今回から）
##リードリレーのドライブのためのトランジスタではまる
今まで回路図など作成しなかったので記憶で部品を半田付けしていって動作しないので考え込む
今回トランジスタのエミッタをアースせずにエミッタからリードリレー駆動部に配線してしまった。そのためarduino nano D2の電圧が HIGHになって確かにコレクタとエミッタがONにはなっているがリードリレーを駆動できるだけの電圧が生じない
原因はトランジスタの扱い方に問題があることがわかる、なるほどねえ、ベースとエミッタ間も電流が流れないとだめなんだ。
昔勉強したけどスイッチとして使う基本ができていなかった。
#回路図エディタを使って今回回路図を少し作成してみた
![arduino_timer2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200517/a5e9aa29-25d1-eec5-6107-62442e57cf6a.png)
コレクタ側にリードリレーをつなぐことで無事動作しました。
ちなみにコイルのリレーはもちろんだがリードリレーもD2ピンのHIGHで4V近くの電圧が出力されても直接リレーを動作まではできない。やはりトランジスタで駆動させることが必要だった、もしかしてもっと低電圧で動作するリレーもあるかもしれないが
## pmod oled rgbから別のディスプレイへ
最も安価なディスプレイが最近は変化していて、配線もやや少なくてすみ電圧も5Vでいいのでarduinoといっしょに動作させるには簡単。配線をいかにしっかりさせるかが問題
![IMG_20200313_232229_039.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200517/f49ffec1-53ad-c0b5-717e-4690f0663659.jpeg)
リード線を細いのを使わないととにかく扱いずらいので半田付けが難しいが手持ちのオレンジ色の細いもので格闘してなんとか配線し動作確認した。
回路図エディタの使い方が少しわかってきて重宝している。
いちおう配線図を描いたが、この部品との接続は、順番とDの番号を一致させることだけがメモしてあればいいかな（左下の番号順がディスプレイの端子順）
![arduino_timer3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200517/8e8c875e-0067-a602-72c0-efc847da71f9.png)

## 工具も小さな充電式ドリルを調達して作業がはかどるように。最近のはLEDで作業場所を照らせるのはいい。
![IMG_20200312_223217_882.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200517/b5c06228-3d5f-d3a7-60bc-055de42f2bd2.jpeg)
このドリルに付属していたドリル刃は木工用で使えないがもともと持っていた金属かコンクリ用のドリル刃で基盤もサクサク穴があけられた
## アクリルケースの加工
これもうまくやらないとアクリルケースにヒビが入る。可変抵抗用の穴は除々にドリル刃を大きいものに替えて6mmで穴を大きくして、最後は半田ごての先をプラスチック加工で使い分けている違うものにして拡大、リーマーで削り落として貫通させた
![IMG_20200312_223231_989.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200517/6d2d1623-95e8-d4d6-cfc0-8f7386dace51.jpeg)
DVWA（XXS:Reflected）全レベルの脆弱性について

## 前提
- kali linux環境がある
- [DVWAのセットアップ済み](https://qiita.com/KPenguin/items/7e4f1c428c3dadf8591c)
- [初級レベル理解済み](https://qiita.com/KPenguin/items/783caef6a43e594ed7cd)

## 目標
- 脆弱性の理解を深める。

## 手順概要
- 大まかな挙動を把握する
- コードを見て脆弱性をみつける
- コードの脆弱性を攻撃する

## 内容
###挙動の把握
- ボタンを押すとGETリクエストが飛ぶ
- クエリにname=hogeが乗っかる
- そのクエリがpreタグへ転写される（下図）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/af27504d-2a6b-ea5b-3e45-11f09cf0e7ef.png)

### コードを確認
#### low
- 特に設定なし。
- scriptを差し込めば、そのまま転写される。

```php:
<?php
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>'; 
?> 
```

#### medium
- str_replace(a,b,c)は、cの中にaが入っていればbに置換する
- 今回の場合、`<script>`が入っていれば、"空"へ置換される

```php:
<?php
    // Get input
    $name = str_replace( '<script>', '', $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>"; 
?> 
```

#### high
- mediumロジックは同じ
- ここでは正規表現を使ってさらに厳格にチェックしている。

```php:
<?php
    // Get input
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>"; 
?>
```

#### impossible
- sessionを拿捕する必要がある
- htmlspecialcharsはhtmlにとっての特殊文字をエスケープさせるので、タグの入力が不可能。

```php:
<?php
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Get input
    $name = htmlspecialchars( $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
}

// Generate Anti-CSRF token
generateSessionToken(); 
?>
```

### 脆弱性を攻撃する
#### low
- 防御無しのため、ストレートに攻撃する。
- `<script>alert("low")</script>`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/063c5600-ed32-d0e1-1ab8-e5df7c37d678.png)

#### medium
- 制限されているのは`<script>`という文字列だけなので一部変更すれば突破できる
- `<script >alert("medium")</script >`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/c0bff9a7-0399-cc81-c0f4-3bddb8e87f0f.png)

#### high
- mediumみたいに空白を開けても並びが"script"ならブロックされる。なので、script以外を使う。
- `<img src="#" onerror=alert("high")>`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584889/fcb7c213-3e81-181b-ec04-4e79a1793da9.png)


#### impossible
- 無理っぽい
【助けてください】GoogleChromeのブックマーク自動保存ができない問題


下の記事を真似して「GoogleChromeのブックマークの自動保存」を試しましたが、できませんでした。
https://qiita.com/yamagami2211/items/b6726b3e2ed5bd017b61


コードは下のとおりです。

start.dat
@ECHO OFF
mkdir %date:~-10,4%%date:~-5,2%%date:~-2,2%
cd %~dp0%date:~-10,4%%date:~-5,2%%date:~-2,2%
copy "C:\Users\<ユーザー名>\AppData\Local\Google\Chrome\User Data\Default\Bookmarks.bak"
copy "C:\Users\<ユーザー名>\AppData\Local\Google\Chrome\User Data\Default\Bookmarks"
PAUSE

batファイルを作って実行したら添付画像のように、「空っぽのフォルダ」が作られます。![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503030/fee56c91-3c9a-5044-4129-412b9527f052.png)
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503030/468dfdf2-d6d0-9dea-b064-b8dc9290c9ab.png)
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/503030/13ca868f-5de4-3874-3790-c2ff1d1d9fe4.png)

実現出来たら便利だと思います。いろいろ調べましたが、解決できませんでした。

どなたか、お助け下さいませ・・・🙇
プログラムはなぜ動くのか？を読んでみてまとめることで知識の定着を図る投稿#3

[プログラムはなぜ動くのか第２版](amazon.co.jp/プログラムはなぜ動くのか-第２版-知っておきたいプログラムの基礎知識-矢沢久雄/dp/4822283151/ref=sr_1_1?adgrpid=53631245656&gclid=Cj0KCQjw0pfzBRCOARIsANi0g0tajATNcn3H7Ogokqrdst5O2JctSzMRb6A0XyW5GegcPbJwaEvZO84aAlK8EALw_wcB&hvadid=338517958683&hvdev=c&hvlocphy=2392&hvnetw=g&hvqmt=e&hvrand=9776556383623440456&hvtargid=kwd-334563073858&hydadcr=27265_11561134&jp-ad-ap=0&keywords=プログラムはなぜ動くのか&qid=1583760691&sr=8-1)

を僕が師匠と読んでいる方に進めていただき、読んでみようと思いました。
そこで、僕的にはかなり難しいこともあり、この本をまとめながら読み進めていくことによって理解度を高めようと思いました。

こちらはあくまでも推奨する記事ではなく、僕がこうした方が定着しやすいかもと思い、記録に残すことにしました。

##プログラムの流れを決めるプログラム・カウンタ
１行だけで役に立つプログラムというものは、滅多にありません（え！あるんだ！）

今度はプログラムが記述された通りに実行される仕組みを説明してくれます。

WindowsなどのOSは、ユーザーからプログラムの起動が指示されると、ハード・ディスクに保存されているプログラムをメモリーにコピーします。（へぇ〜）

|プログラム・カウンタの値の変化|アドレス|メモリーの内容|
|:-----------------|:-----------------|:-----------------|
|0100|0100|命令:0105番地の値をアキュムレータに格納せよ|
|0101|0101|命令：0106番地の値を汎用レジスタに格納せよ|
|0102|0102|命令：アキュムレータの値に汎用レジスタの値を加算せよ|
|0103|0103|命令：アキュムレータの値をディスプレイに表示せよ|
|0104|0104|命令：プログラムを終了せよ（OSに戻れ）|
|0105|0105|データ：123|
|0106|0106|データ：456|

へぇこういう順序で動くねんな

アドレスの0100番地が、このプログラムの実行開始位置

WindowsなどのOSは、プログラムをハード・ディスクからメモリーにコピーした後で、レジスタの一つであるプログラム・カウンタに0100を設定します。

OSはレジスタの一つであるプログラム・カウンタを0100に設定する

CPUが1つの命令を実行すると、プログラム・カウンタの値を1追加します

CPUの制御装置はプログラム・カウンタの値を参照して、メモリーから命令を読み出して実行します。

つまりプログラム・カウンタがプログラムの流れを決めています。

##なるほど

このプログラム・カウンタはテニスの王子様でいうところの才気煥発の極みということか

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253981/318c9d3c-d8aa-453f-620f-dc13e47d2d1a.png)
Pythonで毎日AtCoder #1

### はじめに
今回から、python3で競プロの問題(AtCoder)を解く毎日という企画をしようと思います。問題の選択は、[AtCoder Problems](https://kenkoooo.com/atcoder/#/list/tax_free)のRecommendationsからです。

#### 目的

- レートを上げる。
- 初見問題への対応力をつける

### #1
[問題](https://atcoder.jp/contests/arc008/tasks/arc008_1)

**考えたこと**
2WAしました。場合分けを考える問題が苦手なことが分かりました。
この問題は、n mod(10)の大きさで場合分けしました。問題を読むと、N個以上買うのにいくらかかるかを答えるので、Nを越えた数を買ってもよいことが分かります。個別に買った方が安いのか、まとめて買った方が安いのかをn mod(10)で比較すると次のようになります。

```
n mod(10), 個別, 個別とまとめて買ったときの差
1 , 15 , 85
2 , 30 , 70
3 , 45 , 55
4 , 60 , 40
5 , 75 , 25
6 , 90 , 10
7 , 105 , -5
8 , 120 , -20
9 , 135 , -35
10 , 150 , -50
```
となります。
このことからn mod(10)>6のときにまとめて買った方が安いことが分かります。
よって、

```
if n % 10 > 6:
    b = 100 * (n // 10 + 1)
else:
    p = n % 10
    b = 100 * (n // 10) + p * 15
```
にすれば、うまく条件を満すことができます。
あとは上のコードに標準入力と出力をつけるだけです。出力には、min()を使います。

```
n = int(input())
a = 15 * n
if n % 10 > 6:
    b = 100 * (n // 10 + 1)
else:
    p = n % 10
    b = 100 * (n // 10) + p * 15
print(min(a,b))
```

### まとめ
A問題なのに2WAも出してしまったのが悔しい。タグに不穏なワードが入っていますが、そうならないようにがんばります。
【Udemy Python3入門+応用】　53. キーワード引数の辞書化

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**


##■キーワード引数の辞書化
#####◆例
```python:keyword_augment_dict
def menu(food='beef', drink='wine'):
    print(food, drink)

menu(food='beef', drink='coffee')
```
```:result
beef coffee
```
まずこういったサンプルを用意する。
ここに、食べ物や飲み物だけでなく、他にも付け足したいときを考える。

#####◆キーワード引数を辞書化する
```python:keyword_augment_dict
def menu(**kwargs):
    print(kwargs)

menu(food='beef', drink='coffee')
```
```:result
{'food': 'beef', 'drink': 'coffee'}
```
`menu`にわたす引数の頭に`**`をつけることで、
わたした引数が辞書化される。

```python:keyword_augment_dict
def menu(**kwargs):
    for k , v in kwargs.items():
        print(k, v)

menu(food='beef', drink='coffee')
```
```:result
food beef
drink coffee
```
作成された辞書のkeyとvalueを引っ張ってきてprintするように組んだ。

```python:keyword_augment_dict
def menu(**kwargs):
    for k , v in kwargs.items():
        print(k, v)

d = {
    'food': 'beef',
    'drink': 'ice coffee',
    'dessert': 'ice cream'
}
menu(**d)
```
```:result
food beef
drink ice coffee
dessert ice cream
```
`d`で作った辞書は、`menu(**d)`により、それぞれのkeyとvalueのセットに展開されて渡される。


##■普通の引数、位置引数のタプル化、キーワード引数の辞書化の同時使用
#####◆同時使用も可能
```python:args
def menu(fruit, *args, **kwargs):
    print(fruit)
    print(args)
    print(kwargs)

menu('banana', 'apple', 'orange', food='beef', drink='wine')
```
```:result
banana
('apple', 'orange')
{'food': 'beef', 'drink': 'wine'}
```
最初の`banana`は普通の引数として`fruit`に渡され、
`apple`と`orange`は`*args`に渡されることでタプル化され、
`beef`と`wine`は`**kwargs`により辞書化された。

#####◆注意点
```python:args
def menu(fruit, **kwargs, *args):
    print(fruit)
    print(kwargs)
    print(args)

menu('banana', food='beef', drink='wine', 'apple', 'orange')
```
```:result
    def menu(fruit, **kwargs, *args):
                              ^
SyntaxError: invalid syntax
```
`**kwargs`を先に、`*args`を後にするとエラーとなる。
これらを同時に使う場合は、`*` → `**`の順で使うようにしよう。
アプリケーションを作ってみます

自分用メモ

new コマンド実行
rails _5.0.7.2_ new Put.Memo -d mysql
データベースを作成
rails db:create


作るのは単語帳アプリ
最初にデータベース設計をしてみて自分のしてみたいことを整理してみた
機能として
---アカウント機能
---投稿機能
---いいね機能
---検索機能
---意味の部分にurl,画像を描けるようにする
---ランキング機能

![82486AC1-7B32-4DAC-8A93-1D76A94AED99_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600111/d3d9a033-54ac-3948-16df-67a0c3da17d4.jpeg)

次にフロント実装

topページには
：スクロール機能
：ランキング機能

↑とりあえずこれだけ実装したい
 できればタグごとのランキング,ページネーション機能をつけたい

ビューはこんな感じ
単語、意味とurlと画像
で一つの投稿としてこれをランキングで複数並べる形にしたい
Put.Memoのところをクリックするとでtopページに戻るようにした
ヘッダーだけだけどまぁ機能としては上だけで十分だと思う
https://gyazo.com/429eb62d3c07605ff058e91be4f43712

後で
タイトルのところに作った人のアカウント名を付けようと思う

とりあえず今日はここまで
Azureのいつでも無料サービスまとめ

# Azureの無償枠

Microsoftが提供するパブリッククラウドのAzureのサービスには
いくつか無償枠が存在します。
代表的なサービスを以下にまとめました。

## Azure Web Apps (PaaS) 

Azureが提供するPaaSです。
Freeレベルでは1GBまでのディスク領域(ストレージ)が無料です。
カスタムドメインや複数インスタンスには対応していませんが、
Web Appsの時間分の料金そのものは発生しません。

Azureには他にMobile AppsやAPI Appsというサービスもありますが、
こちらのサービスと含めて10のリソースまで無料枠となります。

## Azure Functions (FaaS)

Azureが提供するFunction as a Serviceです。
従量制プランで400GB秒のリソース使用枠と100万回の実行回数の範囲内であれば無料です。
サービスのバージョンごとにサポート言語は違いますが、
個人的にはPowerShellにも対応してくれたのは大きいです！

| 言語       | 1系                     | 2系                    | 3系                    |
|------------|-------------------------|------------------------|------------------------|
| C#         | GA (.NET Framework 4.7) | GA (.NET Core 2.2)     | GA (.NET Core 3.1)     |
| JavaScript | GA (Node 6)             | GA (Node 8、10)        | GA (Node 10、12)       |
| F#         | GA (.NET Framework 4.7) | GA (.NET Core 2.2)     | GA (.NET Core 3.1)     |
| Java       | 該当なし                | GA (Java 8)            | GA (Java 8)            |
| PowerShell | 該当なし                | GA (PowerShell Core 6) | GA (PowerShell Core 6) |
| Python     | 該当なし                | GA (Python 3.6、3.7)   | GA (Python 3.6、3.7)   |
| TypeScript | 該当なし                | GA1                    | GA1                    |
※GAは一般提供開始(General Availability)の略
[サポート言語](https://docs.microsoft.com/ja-jp/azure/azure-functions/supported-languages#languages-by-runtime-version)

## CosmosDB (NoSQL)

[Microsoft、「Azure Cosmos DB」をずっと無料で使える「Free Tier」発表　地球規模の分散データベースを最大5GBまで](https://www.itmedia.co.jp/news/articles/2003/09/news074.html)

上の記事を見たから今回エントリを書くに至りました。
Azureが提供するドキュメントNoSQLです。
5GBまでのストレージと400RU(リクエストユニット)までが無償のようです。

## Azure Notebook

若干毛色が違いますが、Azureで提供されているJupyterNotebookです。
JupyterNotebookといえばGoogleColaboratoryが有名ですが、
こちらのAzure NotebookはPythonだけでなくF#やRも利用できます。
Microsoftならではですね。

GPUのオプションがないこととPreview版ではありますが、
有効な選択肢かと思います。

[Azure Notebook](https://notebooks.azure.com/)

## Azure DevOps

* Azure Pipelines CI/CDツール
* Azure Boards 看板管理
* Azure Repos プライベートレポジトリ 2GBまで無償
* Azure Artifacts 開発用パッケージ管理

上の４つを包括したサービスです。

# まとめ

他にも無料のサービスはありますので、以下のリンクからご確認ください。

[いつでも無料](https://azure.microsoft.com/ja-jp/free/search/#always-free)

注意点としてサービスの時間単価としてみれば無償枠の範囲だったとしても、
ネットワークの転送に費用が請求されることもあるので注意して利用ください。
DjangoのMiddlewareを自作してどこからでもrequest情報にアクセスできるようにしてみた

modelのuser_created(作成者)やuser_updated(更新者)に共通処理でログインユーザを格納できないか考え始めたのがきっかけ。

それまではviewからformにユーザ情報を渡して、user_createdやuser_updatedに格納する処理を書いてました。

# Djangoのmiddleware(ミドルウェア)とは
[公式](https://docs.djangoproject.com/ja/3.0/topics/http/middleware/)より
>ミドルウェアは、Django のリクエスト/レスポンス処理にフックを加えるためのフレームワークです。

リクエスト送信時やレスポンス返却前に行う処理を定義できるものです。

# middlewareの実装
### threadlocalを操作する関数を定義
```common/middlewares/threadlocals.py
from threading import local


THREAD_LOCAL = local()


def set_thread_variable(key, value):
    """ スレッドローカルデータに値を格納する
    """
    setattr(THREAD_LOCAL, key, value)


def get_thread_variable(key, default=None):
    """ スレッドローカルデータから値を取得する
    """
    return getattr(THREAD_LOCAL, key, default)


def get_request():
    """ スレッドローカルデータからリクエスト情報を取得する
    """
    return get_thread_variable('request')

```

### middlewareクラスを定義
```common/middlewares/request_store_middleware.py
from common.middlewares.threadlocals import set_thread_variable
from django.utils.deprecation import MiddlewareMixin


class RequestStoreMiddleware(MiddlewareMixin):
    def process_request(self, reuqest):
        set_thread_variable('request', reuqest)

```
今回はリクエストの情報がほしいので`process_request`のみ定義しときます。

### settings.pyのMIDDLEWAREに追加
```settings.py
.
..
...
MIDDLEWARE = [
    .
    ..
    ...
    'common.middlewares.request_store_middleware.RequestStoreMiddleware', # 追加
]
...
..
.
```

# 好きなところでget_requestを呼ぶだけ
僕はDBへの保存時にユーザ情報を格納するのが目的なので、models.pyで使用することにしました。

```common/models.py
.
..
...
from common.middlewares.threadlocals import get_request
from django.db.models.signals import pre_save
...
..
.
class Company(BaseModel):
    """ 企業モデルクラス
    """
    ...
    ..
    .
    created_user = models.ForeignKey(User, on_delete=models.DO_NOTHING, null=True, blank=True)
    updated_user = models.ForeignKey(User, on_delete=models.DO_NOTHING, null=True, blank=True)
...
..
.
def set_user_receiver(sender, instance, *args, **kwargs)
    request = get_request() # user情報を格納する前に認証チェックをしても良いかも
    instance.created_user = request.user
    instance.updated_user = request.user


pre_save.connect(set_user_receiver, sender=Company) # pre_saveを使うと、save()実行前に呼び出したい関数を登録できる。
```

おわり
Adafruit Trinket M0でTinyGo(外部LED編)

#はじめに
[第2回](https://qiita.com/quadnine/items/829a291c93a1c71a88e1)に続き、今回はTinyGoに外部LEDを接続して点滅させてみる
#動作環境
* OS: macOS 10.15.3
* Go: 1.13.8
* TinyGo: 0.12.0
* マイコン: Adafruit Trinket M0
* LED: [Grove Red LED](http://wiki.seeedstudio.com/Grove-Red_LED/)

LEDは[スイッチサイエンス](https://www.switch-science.com/catalog/1254/)か[マルツ](https://www.marutsu.co.jp/pc/i/829294/)あたりで通販可能

#配線
| Trinket M0 | Grove LED |
|:----------:|:---------:|
| D0         | SIG       |
| -          | NC        |
| 3V3        | VCC       |
| GND        | GND       |

D0の代わりにD1〜D4でもOK

#実行コード
```go:main.go
package main

import (
	"machine"
	"time"
)

func main() {
	//led = D0 or D1 or D2 or D3
	led := machine.D0
	led.Configure(machine.PinConfig{Mode: machine.PinOutput})
	for {
		led.Low()
		time.Sleep(time.Millisecond * 500)

		led.High()
		time.Sleep(time.Millisecond * 500)
	}
}
```
#ビルド&書き込み
###パターン1. Macでビルド&書き込み
MacにインストールしたTinyGoを使ってビルドから書き込みまで一気に実行

```
$ tinygo flash -target trinket-m0 ./main.go
```

###パターン2. Dockerでビルド&Macから書き込み
Mac上でDockerを使ってビルドして、書き込みはMacから実行
Trinket M0はUSBマスストレージとして扱えるので、ビルドで生成されたUF2ファイルをドラッグ&ドロップで書き込み

```
$ docker run --rm -v $(pwd):/src -w /src tinygo/tinygo:0.12.0 \
tinygo build -o /src/flash.uf2 -size=short -target trinket-m0 ./main.go
```

#実行結果
![IMG_20200310_213652.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79375/b44f5e93-f4d3-ffbb-483d-72582760efb5.jpeg)
【Udemy Python3入門+応用】　52. 位置引数のタプル化

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**


##■位置引数のタプル化
#####◆例
```python:positional_augment_tuple
def say_something(word1, word2, word3):
    print(word1)
    print(word2)
    print(word3)

say_something('Hi!', 'Mike', 'Nancy')
```
```:result
Hi!
Mike
Nancy
```
もちろんこのように、いちいち`word1`,`word2`,`word3`のように設定してもよいが、
位置引数をタプル化することでうまくやる方法がある。

#####◆位置引数をタプル化する
```python:positional_augment_tuple
def say_something(*args):
    print(args)

say_something('Hi!', 'Mike', 'Nancy')
```
```:result
('Hi!', 'Mike', 'Nancy')
```
`say_something()`の`()`の中に入れる引数の頭に`*`をつけることで、
そこに入ってくる引数をタプル化することができる。

これで生成したタプルをさらにforループを回してprintすることで、先程のものを再現できる。

```python:positional_augment_tuple
def say_something(*args):
    for arg in args:
        print(arg)

say_something('Hi!', 'Mike', 'Nancy')
```
```:result
Hi!
Mike
Nancy
```

#####◆普通の引数と組み合わせる
```python:positional_augment_tuple
def say_something(word, *args):
    print('word =', word)
    for arg in args:
        print('arg =', arg)

say_something('Hi!', 'Mike', 'Nancy')
```
```:result
word = Hi!
arg = Mike
arg = Nancy
```
say_something'に渡す引数として、`word`を追加してみた。
すると、最初の引数である`Hi!`のみがまず`word`に入り、
それ以降の引数である`Mike`と`Nancy`は`*args`に入ることがわかる。


#####◆注意点
```python:positional_augment_tuple
def say_something(*args, word):
    print('word =', word)
    for arg in args:
        print('arg =', arg)

say_something('Hi!', 'Mike', 'Nancy')
```
```:result
    say_something('Hi!', 'Mike', 'Nancy')
TypeError: say_something() missing 1 required keyword-only argument: 'word'
```
`*args`を先に、`word`を後にすると、エラーとなってしまう。
必ず、普通の引数 → `*`の順で使うようにしよう。
[備忘録]XCodeで空白やタブ文字を可視化する方法

# はじめに

やっぱりコード書くときは特殊文字とか見えててほしいよね。

ということで備忘録として書いておきます。というか書きたい。

# 手順

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265818/df7de3a0-98cf-5e00-8298-6df55d36a148.png)

以上。

# 終わりに

VSCodeとか他のエディタみたいに設定項目から設定するものだと思っていた。

というかこういうところをカスタマイズする楽しさがあると思っていて、俺はそれが楽しい。（環境構築が大好き）
Zephyr > STM32L476 > error: 'LED1_GPIO_PORT' undeclared > DT_ALIAS_LED1_GPIOS_CONTROLLERなどLED1関連でエラー

```txt:動作確認
Ubuntu 18.04 LTS
ボード: STM32L476 Nucleo_64 (以下、STM32L476)
ボード: STM32F769I
Zephyr 2.1.0-rc1
```

### エラー

STM32L476にて自作のMessage Queueのプログラムを試そうとしたところ、下記のエラーとなった。

```
error: 'LED1_GPIO_PORT' undeclared (first use in this function); did you mean 'IS_EXTI_GPIO_PORT'?
 #define DT_ALIAS_LED1_GPIOS_CONTROLLER  LED1_GPIO_PORT
```

LED1の定義がないようだ。

同じソフトをSTM32F769I用にビルドすると成功した。

### DTSの違い

boards/arm/stm32f769i_disco/stm32f769i_disco.dts

```
	aliases {
		led0 = &red_led_1;
		led1 = &green_led_2;
		led2 = &green_led_3;
		led3 = &red_led_4;
		sw0 = &user_button;
	};
```

boards/arm/nucleo_l476rg/nucleo_l476rg.dts

```
	aliases {
		led0 = &green_led_2;
		sw0 = &user_button;
	};
```

確かにSTM32L476用のDTSにはLED1（とLED2)の定義がない。
そのためにビルドエラーとなるようだ。

### 関連

LEDの使用に関してDTSのエイリアスを指定することが記載されている。

- [Blinky sample](https://docs.zephyrproject.org/latest/samples/basic/blinky/README.html)
Sass::SyntaxError in Devise::Registrations#new 解決方法　

# 前提条件
・gemfileに使いたいパッケージを記述している

```ruby:Gemfile
 gem 'devise'
```
・ターミナルで`bundle install`が済んでいる

#エラー内容
 [![Screenshot from Gyazo](https://gyazo.com/baf646c7015789692e427e05c5d0bcac/raw)](https://gyazo.com/baf646c7015789692e427e05c5d0bcac)


どうやら`@import "modules/user"`でうまく'_user.scss'が読み込めてないみたいです

_user.scssを動かしてみます

[![Screenshot from Gyazo](https://gyazo.com/3312129d7e24ff4d79d97754578abde5/raw)](https://gyazo.com/3312129d7e24ff4d79d97754578abde5)

ここから

[![Screenshot from Gyazo](https://gyazo.com/dc4b11838394c4b55d0c080ee8e12989/raw)](https://gyazo.com/dc4b11838394c4b55d0c080ee8e12989)

modulesディレクトリの中へ入れてみました

[![Screenshot from Gyazo](https://gyazo.com/79e0d044ee34c2314406018e60c24f84/raw)](https://gyazo.com/79e0d044ee34c2314406018e60c24f84)

無事に動くようになりました




#ここで考えたこと
`@import "modules/user"`と書いてあったけど、
これをよく読むと、
*modulesディレクトリの中にある、_user.scssを読み込んでね（@import）*
ってことだから、

試しに
`@import "user"`に変えて
`_user.scss`のファイルの位置を元に戻したら、
ちゃんと動きましたとさ

###めでたしめでたし
Win10 + PHP + Laravel 開発環境構築メモ

# 概要
- Windows10にPHP開発環境を構築したときのメモです
- 後で見返す用に書きだしたレベルなので、内容は適宜修正します。

---

# PHP(XAMMP)
- Apache, MariaDB, PHP, Perl などがパッケージ化されたもの
- https://www.apachefriends.org/jp/index.html
 - 特定バージョンを入れる場合は「その他のバージョン～」から
- インストールした後はPATHを追加する
 - 例) C:\xampp\php

---

# composer
- PHPでの開発におけるライブラリの依存関係などを管理してくれるもの
- https://getcomposer.org/doc/00-intro.md#installation-windows
 - DLは Composer-Setup.exe から

---

# xdebug
- PHPでデバッグするための拡張モジュール
- https://xdebug.org/download
 - 色々試行錯誤したけどうまくいかなかったので、最終的に以下の手順で導入した。

1. コマンドプロンプトで `$ php -i` をたたく
2. https://xdebug.org/wizard に[1]の内容を貼り付けて「Analyse my phpinfo() output」を押下
4. 画面下部に表示される手順に従って操作していく
5. [1]に戻り、再度 Analyze して Xdebug installed のところにバージョンが出てきたらOK
6. `$ php -v` の出力でも確認できる

```
$ php -v
PHP 7.4.3 (cli) (built: Feb 18 2020 17:29:46) ( ZTS Visual C++ 2017 x64 )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Xdebug v2.9.2, Copyright (c) 2002-2020, by Derick Rethans ★ここが出力されたらOK
```


```ini:php.ini(参考)
zend_extension = C:\xampp\php\ext\php_xdebug-2.9.2-7.4-vc15-x86_64.dll

[xdebug]
xdebug.remote_enable=1
xdebug.remote_autostart=1
```

- vscodeで `php -i` したとき色々エラーが出る場合は、
<br>エラー箇所の extension= の後ろをフルパスにしていくとよい？

---

# npm (node.js)
- node.jsです。
- https://nodejs.org/en/
- LTSの方入れておきました

---

# VisualStudioCode
- Microsoft が提供しているコードエディタ
- https://azure.microsoft.com/ja-jp/products/visual-studio-code/


```json:setting.json(追記する)
"php.validate.executablePath": "C:\\xampp\\php\\php.exe",
"php.suggest.basic": false,
```

- Extensions として以下を追加した。
 - PHP Debug
 - PHP IntelliSense
 - PHP Class Generator
 - PHP DocBlocker
 - PHP import checker
 - phpcs
 - PHP Intelephense
 - PHP Namespace Resolver
 - Bracket Pair Colorizer
 - VS Code Counter

---

# サンプルプロジェクトで動作確認

1. `$ composer create-project "laravel/laravel=6.*" sample`
2. `$ cd sample`
3. `$ php artisan -V`
4. `$ composer install`
5. `$ npm install`
6. `$ php artisan serve`
7. 任意の場所 (routes/web.php あたり？) にブレークポイントを置いて、デバッグ起動

```json:launch.json(参考)
{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "stopOnEntry": true,
            "log": true
        },
        {
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9000,
        }
    ]
}
```
【Udemy Python3入門+応用】　51. デフォルト引数で気をつけること

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**



##■デフォルト引数で気をつけること
#####◆空のリストや辞書はデフォルト引数に使わない
```python:list_augment
def test_func(x, l = []):
    l.append(x)
    return l

r = test_func(100)
print(r)

r = test_func(100)
print(r)
```
```:result
[100]
[100, 100]
```
毎回新しいリストを使う場面が多いが、
そんなときにデフォルト引数に空のリストを設定してしまうと、
1つのリストをずっと使い続けることになる。

#####◆毎回初期化するように組み込む
```python:list_augment
def test_func(x, l = None):
    # lを空のリストに初期化する
    if l is None:
        l = []
    l.append(x)
    return l

r = test_func(100)
print(r)

r = test_func(100)
print(r)
```
```:result
[100]
[100]
```
`def`内で、最初に`l`を初期化するように記述してやる。
そうすると、`test_func`を呼び出すごとに毎回`l`の初期化が行われるため、
毎回空のリストを使えるようになる。
ソース起点のクラス設計

# はじめに
クラス設計について調べるとオブジェクト指向やデザインパターンなどが出てきます。これらは正しく理解できればとても便利なものですが正しく理解できずに形だけ真似て無駄に複雑なクラスを設計している人がいました。その時にオブジェクト指向やデザインパターンなどを理解する前に簡単な考え方から理解する方が良いと思い、自分が開発しているときの手順や気を付けていることなどを一部抜き出して紹介します。

自分の独断と偏見に満ちた方法なので100%正解というわけではないので、一つの方法としてみてくださればと思います。

# クラス設計の思想
当然ですが開発を行う際はシステムを使って作業の簡略化や使用者へのサービスなど、システムを通して何かを実現したいことがあるはずです。そのため、開発後にシステムの拡張や変更等がなければクラス設計は必要ないと思っています。しかし現実には使用者の要望や業務フローの変更など実現したいことが変わることがあり、その時にクラス設計をしっかりしていれば簡単な修正であったり、既存の処理に影響を与えずに拡張できるようになります。
オブジェクト指向やデザインパターンを使用すれば拡張しやすいクラスを作ることができますが、ここで説明するのはそれを使用せずに拡張しやすいものを目指します。

# クラス設計の手順
1. 必要な機能を決定する
2. 1ルート作成する
3. ルートを細かく分割して関数を作成する
4. 関数をグループにまとめてクラスを作る
5. 何度か出ている変数をクラス変数にする
6. 2のルートになるように5のクラスを1つの関数から呼び出す

# クラス設計で気を付けていること
 - 関数内は簡単な処理にする
   - 処理が多いとバグを生みやすく、1つの関数が持つ機能が複数になる可能性があります。その場合は、さらに分離できるのではないかと見直します。
 - 条件文やループ文は極力使用しない
   - 条件文やループ文があるだけでソースが見にくくなります。条件文を使うぐらいならば別関数にして見やすさに気をつけます。
 - 条件式の中は1つの条件式にする
   - 条件文の中の式に``` if(a == b && c == d) ```のような書き方はソースが見にくくなるうえに無駄な条件を生みやすいです。その場合はネストが深くなりますが、別の条件文で判定した後にさらに別の条件文で判定をします。(if文を2つ使います)
 - クラス関数に整合性を持たせる
   - クラス変数や関数名、クラス名など整合性を持たせます。
 - クラスが必要かどうかを考える
   - クラスが多くなるとソースの管理が大変になります。拡張が不要で簡潔になる場合は、フィールド関数やクラスを使用しない方を選びます。
 - クラス間のつながりは極力少なく、標準的な型にする
   - クラス間のつながりが大きいと修正する際に手間が増えます。そのため、引数を少なくして独自のデータクラスでやり取りを行わず言語の標準的な型を使用します。

# クラス設計の詳細
## 1. 必要な機能を決定する
厳密にはクラス設計の範疇ではないため、割愛しますが可能な限り使用者が開発物を使用するシーンを具体的にイメージしたほうが使いやすいものができます。また、問題解決にはロジカルシンキングやラテラルシンキングなどが有効だと言われます。

## 2. 1ルート作成する
必要な機能を実現するロジックを正常な1ルートだけ作成します。機能が複数ある場合は機能分、機能が分割できていない場合は、気にせず1ルート分作成します。粒度としては、実際にコーディングするイメージで極力細かく書いていきます。開発者の好みにもよりますが以下のいくつかの手法でロジックを作成します。

 - 日本語で箇条書き
 - シーケンス図やアクティビティ図などのUML
 - コーディング

## 3. ルートを細かく分割して関数を作成する
2で作成したロジックを細かく分割します。1ステップ単位で分けるとキリがないため、処理の塊単位で分けます。ニュアンスにはなってしまいますが、○○からデータ取得や××の計算をするなど大体1フレーズの言葉で表せる単位で分けます。この時、付箋か何かに1フレーズと関数が分かるように書いておきます。

## 4. 関数をグループにまとめてクラスを作る
3で分けたものをグループにまとめてクラスを作成していきます。この時のまとめ方としては、関数の作成時に使用した1フレーズの対象(上の○○や××)に共通する値があるはずなのでそれでまとめます。無ければ1フレーズの後半のデータ取得や計算などでまとめます。デザインパターンなどを入れ込むときはこの手順から入れ込んでいきます。

## 5. 何度か出ている変数をクラス変数にする
関数化の時に書き出した1フレーズの対象(上の○○や××)に関する変数で、クラス内で何度か出てきたものをクラス変数にします。

## 6. 2のルートになるように5のクラスを1つの関数から呼び出す
クラスができたのでmain関数などから呼び出します。main関数が各関数を呼び出しているため、main関数を見ると機能を実現するために何の処理をしているのかが一覧のように見ることができます。また、別の機能に差し替える場合や拡張する場合はmain関数の該当関数を差し替えるだけでできるため容易に修正できます。

# おわりに
クラス設計の方法について書きました。良く見てみると基本設計/詳細設計/コーディングという一般的な流れを汲んでいることが分かります。
ただ、一般的な方法と違うのは設計前に1ルート決めることで設計の確度を上げるとともに効率的なクラスにできるという点だと思っています。
クラス設計に失敗すると設計者がいなくなった瞬間にソースの扱いがめちゃくちゃになりバグやデータのライフサイクルが壊れる可能性があります。たとえクラスの設計者がいたとしても、クラスを使う人の解釈次第で意図しない使われ方をするため、使いやすく、分かりやすく、簡単なクラス設計を心掛ける必要があります。
誰がどう見てもわかりやすいクラス設計をするのは難しいですが、極力客観的に見返して知識0の状態でもわかりやすいクラスを心掛けるようにしています。なんとなく[以前書いたテーブル設計](https://qiita.com/mink0212/items/c5e08110e8e0fe902b89)に似ているような気がします。
[Kaggle] ep.X - Regularized Greedy Forest (RGF)


# Regularized Greedy Forest (RGF)

GBDTと似ている。目的関数が小さくなるように以下の操作を繰り返すことで、決定木の集合を作成します。

- 葉を分岐サせる、もしくは新しい木を作成する
- 今まで作成した決定木全体について葉のウェイトを修正する

## 主なライブラリ

rgf_python
[Kaggle] ep.X - Extremely Randomized Tree (ERT)

# Extremely Randomized Tree (ERT)

ランダムフォレストとほぼ同じ。分岐を作成する際にそれぞれの特徴量において最もよくデータを分割できる閾値を用いるのではなく、ランダムに設定した閾値を用いる。
[Kaggle] ep.X - コンペの流れ

# tldr

分析コンペの流れについて勉強しました。

# 流れ

1. タスクの理解
2. 評価指標の理解
3. データ理解 (Exproratory Data Analysis, EDA)
3. 特徴量の作成
4. データの分割（学習データとバリデーションデータ）
4. モデルの作成
5. モデルの評価
6. モデルのチューニング
7. アンサンブル
8. 提出
東京オリンピックのエンブレムを遊びつくす！(1)〜僕が何を作ったか〜

#はじめに
　大学の授業で<b>オリンピックのエンブレム</b>を応用して何か作品を作ってみるという機会を頂けたので、その記録を何回かに分けて書いていきたいと思います。<b>幾何学</b>の話をしたり、<b>grasshopper</b>の話をしたり、<b>unity</b>の話をしたりと内容が大きく変わりますが、興味のあるところだけでも読んでくれると嬉しいです！
　また、unityとかgrasshopperとか興味あるけど、どんな風に作品に使えるかわからないという方も読んでいただけると嬉しいです！

　とまあ説明はこの辺りにして、まずは僕がどのような物を作ったのか紹介したいと思います。

#完成品
僕が作ったのはオリンピックのエンブレムを作った幾何学を利用した映像作品です。
日出ずる国ということで日の出を表現しました。
![movie1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498495/d5eac75d-ec82-69e8-9e2b-09796c1de811.gif)

#これからの展望
大まかに分けて以下のような構成でブログを書いていくつもりです。
1.[僕が何を作ったか](https://qiita.com/marche/items/1e41685b567462e42d5e)
2.[エンブレムに隠された法則](https://qiita.com/marche/items/843e095c2caf618f3944)
3.[ひし形充填の基本]
(https://qiita.com/marche/items/d709e1cbfa3b18f96744)
4.ひし形充填の発展
5.grasshopperでひし形充填をする
6.左右対称にひし形を充填する
7.unityでひし形充填をする
8.日の出を作る
Flask-Babelで多言語化をやってみる

# Flask-Babelとは？
[Flask-Babel](https://pythonhosted.org/Flask-Babel/)とは、PythonのFlaskで多言語対応(i18n, l10n)をするためのライブラリ。
多言語化対応にコンパイルが必要という、ちょっと使い勝手が特殊で理解に時間がかかったためメモを残す。

## インストール
```shell
$ pip install Flask-Babel
```


## HTTPリクエストのAccept-Languageヘッダで言語判別する設定
下記のコードの`request.accept_languages.best_match`には対応する言語を[ISO 631-1](https://ja.wikipedia.org/wiki/ISO_639-1%E3%82%B3%E3%83%BC%E3%83%89%E4%B8%80%E8%A6%A7)に従って指定する
※ 日本語対応にはjaのみで基本的には問題ないが、IEではja_JPが無ければ動かないという報告がある

```python
from flask import Flask, request
from flask_babel import Babel

app = Flask(__name__)
babel = Babel(app)

@babel.localeselector
def get_locale():
    return request.accept_languages.best_match(['ja', 'ja_JP', 'en'])
```

## 翻訳キーワードをPythonファイル、またはHTMLファイルに埋め込む
翻訳キーワードを埋め込むためには、gettext関数を用いて、引数には翻訳キーワードを記述する
Babelは翻訳箇所を自動検出して翻訳ファイル(.po)を作成するため、翻訳ファイルの作成より先に翻訳箇所を記述する必要がある


### HTMLファイル
テンプレートエンジンがjanja2の場合は下記のように書ける

```html
<p>message: {{ gettext('Hello world!') }}</p>
```

### Pythonファイル
```python
from flask_babel import gettext

print(gettext('Hello world!'))
```


## Pythonファイル、HTMLファイルの翻訳対象の箇所を翻訳ファイルに反映する
下記のようなbabel.cfgを作成する

```txt:babel.cfg
[python: **.py]
[jinja2: **/templates/**.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_
```
下記のコマンドで、Pythonファイル(*.py)とHTML(*.html)に記述された`gettext`を検出して翻訳ファイルを整理する  

```shell
$ pybabel extract -F babel.cfg -k lazy_gettext -o messages.pot .
```

すると、翻訳ファイルのテンプレート(messages.pot)が作成される

## 各言語の翻訳ファイルを生成する
翻訳ファイルのテンプレート(messages.pot)を元に、各言語の翻訳ファイルを作成する
- `$ pybabel init -i messages.pot -d translations -l ja`
- `$ pybabel init -i messages.pot -d translations -l en`


## 翻訳テンプレート(messages.pot)を各言語の翻訳ファイルに反映する
`pybabel extract`コマンドを使ってmessages.potを更新した場合は、各言語の翻訳ファイルも更新する

```shell
$ pybabel update -i message.pot -d translations
```

## 翻訳する文言の記述
下記のように、各翻訳ファイルに翻訳する文言を記述する

```txt:messages.po
msgid "翻訳キーワード"
msgstr "翻訳後の文言"
```

## 言語ファイルのコンパイル
翻訳する文言を記述した翻訳ファイル(.po)をコンパイルして、バイナリファイル(.mo)を生成する  
翻訳は生成した.moファイルを読み込んで行われる

```shell
$ pybabel compile -d translations
```

## まとめ
翻訳ファイルの更新手順は以下である
1. Pythonファイル、またはHTMLに`gettext`を定義する
2. `gettext`で記述された翻訳キーワードで、翻訳テンプレートを作る(`$ pybabel extract -F babel.cfg -k lazy_gettext -o messages.pot .`)
3. 各言語の翻訳ファイルに翻訳テンプレートの内容を反映(`$ pybabel update -i message.pot -d translations`)
4. 各言語の翻訳ファイルに翻訳する文言を記述する
5. 翻訳ファイルをコンパイルしてバイナリファイルを作る(`$ pybabel compile -d translations`)



## 上手くいかない場合の確認項目
- 翻訳が行われず、msgidで指定したキーワードがそのまま表示される  
translationsフォルダの階層を確認する。  
translationsフォルダは翻訳対象のファイルと同階層になければならない。
Perl Git による入園式

# はじめに
**Perl** って、~~ちょっと古いかもしれませんが~~ 枯れていて、手に馴染む感じがいいですよね。
もうちょっとだけ *[AtCoder](https://atcoder.jp/home)* でユーザが増えてもいいと思うのですが。

# 実は簡単 Perl インストール
実は簡単、というかすでにインストールされている場合もあるんですよね。
![git.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/90671d14-57ae-8cde-179d-1a14d2490388.png)
**Git for Windows** をインストールされている場合、同時に Perl もインストールされますので、Git Bash から Perl を呼び出すことができます。
**perl -v** とコマンド実行して画像の様にバージョン情報が表示された場合、すでに入園済みです。

インストールされていない場合、Qiitaの諸先輩の投稿 *[Git インストール for Windows](https://qiita.com/andna0410/items/c9b8e232d4aa9ac77584)* を参考にインストールすることができます。

エディタとして Vim が入っていますので、即プログラミング可能です。

# 他のインストール方法
こちらが詳しいです。
+ [Strawberry PerlをWindowsにインストールする](https://tutorial.perlzemi.com/blog/20180808153368.html)
+ [ActivePerlをWindowsにインストールする](https://tutorial.perlzemi.com/blog/20080602121231.html)
+ [msys2をWindowsにインストールしてPerlを使う](https://tutorial.perlzemi.com/blog/20180806153350.html)

# VSCodeのインストール
Vim も素敵ですが、VSCode も素敵ですよね。
Qiitaの諸先輩の投稿 *[Visual Studio Code (Windows版) のインストール](https://qiita.com/psychoroid/items/7d85ae6bade4a67aedb1)* を参考にインストールすることができます。
# VSCodeの設定
VSCode から Git Bash への連携をしやすくするための設定はこちらになります。
*[WindowsのVSCodeでGit Bashをターミナルに設定する](https://qiita.com/psychoroid/items/63cc0ece70fce0f0cfc0)*

AtCoder の問題を実行するためのお薦め設定はこちらになります。
*[PerlのAtCoder向けVSCode設定(tasks.json)](https://qiita.com/superrino130/items/7025bc0f0ac7966ba193)*
# まとめ
+ Git いいよね
+ VSCode いいよね
+ Perl いいよね
+ 今回は~~パクリ~~紹介ばかり

参照したサイト

+ [Git インストール for Windows](https://qiita.com/andna0410/items/c9b8e232d4aa9ac77584)
+ [Strawberry PerlをWindowsにインストールする](https://tutorial.perlzemi.com/blog/20180808153368.html)
+ [ActivePerlをWindowsにインストールする](https://tutorial.perlzemi.com/blog/20080602121231.html)
+ [msys2をWindowsにインストールしてPerlを使う](https://tutorial.perlzemi.com/blog/20180806153350.html)
+ [Visual Studio Code (Windows版) のインストール](https://qiita.com/psychoroid/items/7d85ae6bade4a67aedb1)
+ [WindowsのVSCodeでGit Bashをターミナルに設定する](https://qiita.com/psychoroid/items/63cc0ece70fce0f0cfc0)
+ [PerlのAtCoder向けVSCode設定(tasks.json)](https://qiita.com/superrino130/items/7025bc0f0ac7966ba193)
文系のクラウド初心者がCompTIA Clould Essentialsを取得した話

# はじめに
- 2019年12月にCompTIA Clould Essentialsに合格したのでその記録です。
  - この記事の記載はすべて受験時点のものになります。
- QiitaにCompTIA Clould Essentialsの記事が見当たらなかったのでどなたかの参考になればと思います。
- 初投稿なのでどうぞお手柔らかにお願いします。

### 対象
- CompTIA Clould Essentialsを受験しようとしている方
- CompTIA Clould Essentialsってどんな資格か知りたいという方


### 私の経歴
- 簡単に自己紹介します。文系学部卒、ネットワークメインのセールスエンジニア歴２年ほどです。
- クラウドを組み込んだ商材を扱ってはいますが、クラウドそのもの(AWSとか)を触ったことはありません。

### 受験動機と目的
・クラウドのメリットデメリット、オンプレと比べて何が違ってどういう点でいいの？といったことを把握したかった。
・AWSなどのクラウド関連のスキルを身につけたかったのでそのとっかかりとして。

# CompTIA Clould Essentialsとは
- CompTIAはベンダーニュートラルなIT資格で、世界的に有名です。

- その中でも、Cloud Essentialsはクラウドに関する基礎資格です。
  - CompTIAの資格体系については[こちら](https://www.comptia.jp/certif/comptia_certificaiton/)から。

>CompTIA Cloud Essentialsは、ビジネス、または技術的側面から見たクラウドコンピューティングの意義やクラウドの導入によるメリット/デメリットを判断し運用できる知識とスキルを証明する認定資格です。
https://www.comptia.jp/certif/additional_professional/comptia_cloud_essentials/



# 勉強法
### インプット
- まずTACが出版している以下のテキストを読みました。1、２週間くらいでざっと読み通せると思います。
  - [Cloud Essentials テキスト&問題集 CLO‐001対応版 (実務で役立つIT資格 CompTIAシリーズ)](https://www.amazon.co.jp/Cloud-Essentials-CLO%E2%80%90001%E5%AF%BE%E5%BF%9C%E7%89%88-%E5%AE%9F%E5%8B%99%E3%81%A7%E5%BD%B9%E7%AB%8B%E3%81%A4IT%E8%B3%87%E6%A0%BC-CompTIA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4813252060)

- 内容はITパスポートのような基礎資格で出てくるクラウドの内容をちょっと広げるくらいなので、基礎を学習済みの方なら時間さえ確保できれば大丈夫なはずです。

### アウトプット
- 有料ですが、TACでweb模試を受けることができます。
  - 詳細は[こちら](https://web.tac-school.co.jp/it/comptia/cloud-e.html)。
  - 個人的にはweb模試でのアウトプットの方が大事だと思います。

- 模試でアウトプット→わからなかったこところをテキストで確認、これを繰り返してこの模試で安定して8割以上正答できるようになれば大丈夫だと思います。

# 試験
### バウチャーの入手と試験予約
- 受験するためには、バウチャー購入後、ピアソンVUEから試験の予約を行う必要があります。
- バウチャーの入手方法は公式ストア、TACなどいくつかあるので、お好みのものを選んでください。
- 上記のweb模試にはバウチャー付きのものもあります。

- 時々FREE RETAKEキャンペーンをしています。このキャンペーンを利用すれば一度落ちても無料で再受験できるのでおすすめです。私もFREE RETAKEキャンペーンのバウチャーを購入しました。



### 試験本番
- 受付の際に身分証明書を２つ求められるので注意してください。
- 私は運転免許証＆クレジットカードを出しました。

- 試験自体はTACのweb模試に近いと感じました。
- web模試をしっかり理解できていれば問題ないはずです。
- 私は結構時間余りました。


# 受験後の感想
### 目的は達成できたか？
- クラウドの全体像、クラウドのメリットデメリット、オンプレとの比較について理解できました。
- とっかかりとしてはちょうどよい資格だと感じました。

### 雑感
- ベンダーニュートラルなので、特定のサービスのスキルが習得できるわけではありません。
あくまでクラウドとは？ということを理解しているかを問う試験だと思います。

- クラウドを扱っていて多少は理解しているけどもう少し詳しく知りたいという営業の方やクラウドに今後関わりたいけど何から手を付ければいいのかわからない、という方におすすめです。

- 早く実践的なクラウドのスキルが欲しいというエンジニアの方は直接AWSやAzureの資格にチャレンジしたほうがいいのではないでしょうか。
[Kaggle] ep.X - k近傍法

# tldr

k近傍法モデルを勉強しました。

# k近傍法
k-nearest neighbor algorithm, kNN

レコード間の距離をそれらの特徴量の値の差を用いて定義し、その距離が最も近いk個のレコードの目的変数から回帰・分類を行う。
【初心者】長めのモデル名(スネークケース)からfindとかをする

#コンソールでモデルから値を取得しようとしたとき
知らずにスネークケースでモデルを指定してエラーになっていたので調べました。
おそらく初心者や始めたばかりの頃は`User`モデルとか`Post`モデルなどしか扱わないので悩まないと思います。。
そもそもスネークケース、キャメルケースとは？という方へ。

#UserとかPostとかの短いモデル名のとき

```
User.find(1)
```
簡単に取得できますね。

#長めのモデル名のとき
####キャメルケースとスネークケースとは

```
CustomerOrder
```
キャメルケース(大文字部分がラクダの背中っぽい)
CとOが大文字

```
customer_order
```
スネークケース(ヘビっぽい)
単語と単語のつなぎ目に_が使われている

#モデルから値を取得

```
CustomerOrder.find(1)
```
で取れます。(キャメルケース)

```
Customer_order.find(1)
```

スネークケースでは不可。
数(ryフーリエ変換2

#前回の~~ラブライブ！~~まとめ
 
離散フーリエ変換は

```math
F[k] = \sum^{N-1}_{m=0}f[m]e^{-i\frac{2\pi}{N}mk} \\
f[n] = \dfrac{1}{N}\sum^{N-1}_{k=0}F[k]e^{i\frac{2\pi}{N}nk}
```

のようになります。

[導出] https://qiita.com/DivineJK/items/f42f89beb939cba3a3ee

#今回の目標

高速フーリエ変換を実装するところまでやります。

#離散フーリエ変換を素直に実装

まずは、式にしたがって、離散フーリエ変換のコードを書いてみます。

```python:simple_dft.py
import math

# 標準入力の受け取り
N = int(input())
f = list(map(int, input().split()))

F = [0 for _ in range(N)] # ここに変換後の値を代入

omega = 2 * math.pi / N
grow = 1
fund = complex(math.cos(theta), -math.sin(theta)) # 1のN乗根

for k in range(N):
    for m in range(N):
        F[k] += f[m] * grow
        grow *= fund

print(F) # 出力
```

$%$これはさらっと見ると2重ループがあるので少なくとも$O(N^2)$です。高速フーリエ変換では、これを改善します。

#高速フーリエ変換

$N$が2の累乗であるとします。つまり、ある正の整数$M$を用いて$N=2^M$とあらわせるとします。もし、与えられたデータの個数が2の累乗でないならば、データ数が2の累乗になるまで0埋めします。$N=1$も2の0乗とみなせますが、その離散フーリエ変換は自分自身になるので扱いません。

$%$まずは、離散フーリエ変換の式に現れる複素指数関数をみてみます。
$m$が偶数、つまり$m=2l(l\in \mathbb{Z})$のとき、

```math
e^{-i\frac{2\pi}{N}mk} = e^{-i\frac{2\pi}{N}2lk} = e^{-i\frac{2\pi}{N/2}lk}
```

$m$が奇数、つまり$m=2l+1$のとき、

```math
e^{-i\frac{2\pi}{N}mk} = e^{-i\frac{2\pi}{N}(2l+1)k} = e^{-i\frac{2\pi}{N}k}e^{-i\frac{2\pi}{N/2}lk}
```

どちらも$e^{-i\frac{2\pi}{N/2}lk}$が現れていることがわかると思います。このことから、離散フーリエ変換の式は

```math
\begin{align}
F[k] = \sum^{N/2-1}_{l=0}f[2l]e^{-i\frac{2\pi}{N/2}lk} + e^{-i\frac{2\pi}{N}k}\sum^{N/2-1}_{l=0}f[2l+1]e^{-i\frac{2\pi}{N/2}lk}
\end{align}
```

$%$という、二つの和に分けることができます。これらはそれぞれデータ数$N/2$の離散フーリエ変換（に、適当な係数がかかったもの）になっています。
次に、$0\le k\le N/2-1$として、$F[k+N/2]$を考えます。これは、

```math
\begin{align}
F[k+N/2] &= \sum^{N/2-1}_{l=0}f[2l]e^{-i\frac{2\pi}{N/2}l(k+N/2)} + e^{-i\frac{2\pi}{N}(k+N/2)}\sum^{N/2-1}_{l=0}f[2l+1]e^{-i\frac{2\pi}{N/2}l(k+N/2)} \\
&= \sum^{N/2-1}_{l=0}f[2l]e^{-i\frac{2\pi}{N/2}lk} - e^{-i\frac{2\pi}{N}k}\sum^{N/2-1}_{l=0}f[2l+1]e^{-i\frac{2\pi}{N/2}lk}
\end{align}
```

$%$となります。$F[k]$とほぼ同じ形の式が出てきました。この結果は、データの配列$f$の偶数項目と奇数項目を取り出してできた長さ$N/2$の2つの配列について、離散フーリエ変換を求めることを$N/2$回行っていけば良いということになります。

これをもとに擬似コードを書いてみます。

```python
def simply_fft(f, N):
    if N == 1:
        return f # 要素数1の場合、自分自身
    else:
        fe = [f[2*i] for i in range(N//2)]   # fの偶数項目コレクション
        fo = [f[2*i+1] for i in range(N//2)] # fの奇数項目コレクション
        fe = simply_fft(fe, N//2)
        fo = simply_fft(fo, N//2)
        theta = 2 * math.pi / N
        grow = 1
        fund = complex(math.cos(theta), -math.sin(theta)) # 1のN乗根
        FFT = [0 for i in range(N)] # このリストは作らず直接fに代入してもok
        for i in range(N//2):
            FFT[i] = fe[i] + grow * fo[i]
            FFT[i+N//2] = fe[i] - grow * fo[i]
            grow *= fund
        return FFT
```

このアルゴリズムの実行時間を$T_N$で表すと、

```math
\begin{align}
T_N = \begin{cases}
O(1) & (N = 1) \\
T_{N/2} + O(N) & (\mathrm{otherwise})
\end{cases}
\end{align}
```

となり、これを解くと$T_N = O(N\log N)$です。

#参考

https://atcoder.jp/contests/atc001/tasks/fft_c
ORA-12514: TNS:listener does not currently know of service requested in connectとなった時の対応方法

- 環境
    - 接続元 : (EC2インスタンス)Ubuntu 18.04 LTS(64ビットx86)
    - 接続先 : (RDS)Oracle12.2.0
    - SQL*Plus: Release 12.2.0(64bit)

# 事象 : SQL*PlusでRDSに接続しようとしたら接続できなかった

```bash
$ sqlplus64 admin/password@oracle-12.hoge.us-east-2.rds.amazonaws.com:1521/ponsukedb

SQL*Plus: Release 12.2.0.1.0 Production on 火 3月 10 11:26:38 2020

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect
descriptor


ユーザー名を入力してください: 
```

## 原因 : データベース名が間違っているから
> 接続先のリスナーが接続情報に含まれるSERVICE_NAMEに対応するサービスを識別できない場合に出力されます。
> [ORA-12514 - 解決!ORACLE!](http://www.noguopin.com/oracle/index.php?ORA-12514)

データベース名(SID)が8文字以上ある時点で間違っている。

> データベースの名前は、8バイトまでに制限されています。
> [データベース・オブジェクト名および修飾子](https://docs.oracle.com/cd/E57425_01/121/SQLRF/sql_elements008.htm)

### 対応方法 : AWSのコンソールで正しいデータベース名を確認して接続しなおす。
メモリ不足でRDSを作った時に指定したデータベース名を忘れた:skull:

1. AWS マネジメントコンソールにログインする。
2. [RDS]リンクからRDSの画面を表示する。
1. サイドメニューにある[データベース]リンクでデータベースの一覧を表示して、対象のRDSのDB 識別子リンクから詳細画面を表示する。
2. [設定]タブを開いて[DB名]でデータベース名を確認する。
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/3cb940ad-510c-0b45-e92d-db383faa8557.png)
1. 正しいデータベース名で接続しなおす。

```bash
$ sqlplus64 admin/password@oracle-12.hoge.us-east-2.rds.amazonaws.com:1521/pondb

SQL*Plus: Release 12.2.0.1.0 Production on 火 3月 10 11:45:48 2020

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

最終正常ログイン時間: 火 3月  10 2020 11:17:11 +00:00


Oracle Database 12c Standard Edition Release 12.2.0.1.0 - 64bit Production
に接続されました。
SQL>
```
掲示板

#  記事の概要
私が作成したポートフォリオ解説をします
作った背景、工夫したところ、機能、などをまとめました



# 背景

簡単な掲示板のようなものを作ろうと思いましたが、掲示板なので盛り上がったり、人がもう一度来たくなる要素のある掲示板を作ろうと思いました。

#目的

・PHPを用いてwebアプリケーションを作成する
・webアプリの基本的な構成、動作を知る
・就活目的なので、自分の技術のレベルを知ってもらう

#スペック
言語
PHP 7.4.2
データーベース
MariaDB 10.4.11
開発環境
Apache　2.4.41

ビジュアルスタジオコード使用

#主な機能
会員登録した人がログインしたら掲示板メッセージを送信できます。

・会員登録
会員のお名前、メールアドレス、パスワード、画像を選択することで会員登録ができます。


・会員登録におけるエラー表示
名前に関しては空のときにエラー、メールアドレスに関しては空の時とすでに登録済みの時はエラー、パスワードに関しては空の時と4文字以下の時はエラー




・ログイン機能
メールアドレス、パスワードを入力します。
データベースにある情報と一致したらログインして、一致しなければログインできないという機能です
次回からログインの欄にチェックをすると、cookieに2週間の間情報が保存されます。


・メッセージ送信機能
メッセージを入力するとデーターベースにメッセージが保存されて、それを作成日の新しい順に表示しています。



・削除機能
そのメッセージを投稿した人だけが削除したメッセージを削除できるようにしました


・返信機能
返信したいメッセージに対して返信が可能です



・いいね機能
いいねは一人の会員に対して1回可能で、もう一度いいねしようとすると、いいねを削除します




#開発手順
1、要件定義
2、環境選定
3、データベース設計
4、設計
5、コーディング

#1、要件定義
今回作成するアプリに必要な機能は
・会員登録
・ログイン機能
・メッセージ表示機能

そのために情報が保存できるデーターベースが必要です

また、メッセージに関しては
・メッセージ送信者がメッセージを削除できる
・すべての会員がどんなメッセージに対しても返信できる
・すべての会員がどんなメッセージに対しても1回だけ「いいね」ができ、その「いいね」が削除できる

#環境選定

PHPを使用。

上記環境はWindowsローカル上に構築しました。

#データーベース設計
どんな情報が必要かを考えてデータベースの設計しました。

「いいね」機能をつけるときに、追加でテーブルが必要になり付け加えました。

※画像追加

#設計

会員登録→ログイン→掲示板→ログアウト→ログイン

の順に移動するように設計しました



#5.コーディング

設計が固まったところで、コーディングをスタート。

※しかし設計とおりにコーディングいかず、設計を変更しながらコーディングしました。いいねの機能は、コーディング中に追加したので、最初の設計通りには行きませんでした。


##5.1データーベース作成
ローカル環境のMysqlサーバーに
専用ユーザーを作成して、データーベースを作成。そのあと、テーブルを作成。

##5.2データーベース接続確認
PDOを用いて、データーベースの接続。
try~catchを用いて、成功しているか判断

##5.3・会員登録機能
入力した値をmemberテーブルに保存。


![GIF 2020-03-10 16-04-37.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600143/ccde6331-a1fc-4d67-487c-31ffc1b164cc.gif)

また、入力欄が空、すでに登録済みメールアドレスを入力したなどの場合、error[]という配列に値を代入します。そして、error[]があるばあいは同じページに、error[]が空ばあいは確認画面に飛びます。また、error[]の要素とその値によってメッセージを赤字でページ内に表現します。

![GIF 2020-03-10 16-20-53.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600143/1c122351-0bb0-a85f-86c9-9a3ad9466d1b.gif)

##5.4ログイン機能
入力したemailとpasswordがmemberテーブルに保存されている値と一致した場合には、ログインします。エラーが発生した場合は赤字でメッセージをだします。
自動的にログインするをチェックした場合はcookieに値を2週間保存します。


##5.5メッセージの送信、削除、返信機能
メッセージを送信してデータベースに保存。そして、メッセージを新しい順に写真、名前、日付をつけて表示しました。

![GIF 2020-03-10 19-40-46.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600143/d4205aeb-0cf2-742d-b62a-5c6786b6382c.gif)

また、削除の機能を追加して、返信機能も追加しました。
返信機能では「RE」を押すことで、そのメッセージとそのメッセージを送信主の名前をメッセージの入力欄に記載

![GIF 2020-03-10 19-43-14.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600143/13af82b4-976d-7749-9476-fca2ec1fc6b3.gif)



#5.6いいね機能
いいね追加、削除機能
データーベースに、coutsテーブルを作成。もしそのメッセージにいいねをしていない場合にいいねをクリックしたら、countデータベースにユーザーのidとメッセージのid、時間を保存する。逆に、そのメッセージにいいねをしている状態でいいねをクリックしたら、countデータベースから登録あったしてカラム（ユーザーのidとメッセージのid、時間を保存したもの）を削除する。

いいね表示機能
そして、countsテーブルから、メッセージのidの数だけいいねの数を表示する

![GIF 2020-03-10 19-54-12.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600143/0ebf4d6c-5c40-9614-45e4-8c7b875dde79.gif)


#5.7
htmlspecialcharsでセキュリティ対策をしました

#課題点

・全体のレイアウトのいびつさ
htmlをその都度に入力していたので、いびつなレイアウトになりました。設計をしっかりしてその通りに形を整えることができなかったのが原因と思われます

・ユーザーに配慮した設計
ユーザーの使いやすいような、見た目や機能にできてない。スマートフォンに対応したりしていない。
ファイルの最終更新日時を取得するオブジェクトを作りました。 #blueprism

# これを作った理由

こういうちまっとした処理はいろいろ使うから。
一日一回更新するファイルとか、何ヶ月以上更新してないドキュメントは…とか。

# 必要なもの

[ファイルのタイムスタンプ（作成日時、更新日時、アクセス日時）を取得、設定する(DOBON.NET)](https://dobon.net/vb/dotnet/file/filetimestamp.html)
[日時（DateTimeオブジェクト）を文字列に変換する (DOBON.NET)](https://dobon.net/vb/dotnet/string/datetimeformat.html)

# これを踏まえて作ったオブジェクト

コードステージがダメだったときには例外スローしてくれるからそれを拾ったらいいじゃんという理由で、私はBlue Prismのコードステージの中にはそんなにまめにtry-catchを書かないです。
その代わり、コードステージ1個の中にはいっぱいは書かないようにして、コードステージの前に、入力引数が正しいかをチェックしています。
これの場合は、入力引数のパスがちゃんとあるか、パスで書かれたファイルが存在しているか、というのを先にチェックして、ダメならそこで例外にして返しています。
![gamen1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/4ee02ec2-5b15-8bf0-8b82-49b69152b9aa.png)

入力引数は、FileName（ファイルのフルパス）
出力引数は、日と時と別にして文字列で返します。

名前空間は特に追加していません。

コードステージの中身は2行だけ

```VB
strLastModifiedDate = System.IO.File.GetLastWriteTime(FileName).ToShortDateString()
strLastModifiedTime = System.IO.File.GetLastWriteTime(FileName).ToShortTimeString()
```

# 終わりです

これに限らず、コード1行とかで済むようなちょびっとでも、汎用でよく使うならみんなが使える部品にしておけば、みんなそれを手間なく使えるし、あっちとこっちのプロセスでちょっとずつ書き方が違うみたいな仕様ゆれとかもなくせて、便利だと思います。
kintoneのカスタマイズ効率をあげよう。脱超初心者編2

**Qiitaではなく、下記のサイトに移行しました**
**続きも掲載していますのでこちらをご覧ください**

https://potara.net/tag/%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%9e%e3%82%a4%e3%82%ba%e5%8a%b9%e7%8e%87%e3%82%b7%e3%83%aa%e3%83%bc%e3%82%ba/


[kintoneのカスタマイズ効率をあげよう。脱超初心者編1](https://qiita.com/potara/items/714dec8ba0751784042d)の続きです。
まだ見ていない人は先に1を見てください。

今回やることは2つです。
1. https://127.0.0.1:8000/ のアクセスを不要にします。
2. 2つ目、3つ目のカスタマイズをしやすいようにGitHubを使って複製できるようにします。

# 自己証明書の作成
[mkcert](https://github.com/FiloSottile/mkcert/releases/)をダウンロードして、以下のコマンドを実行します。
実行ファイル名はダウンロードしたファイル名に書き換えてください。
実行方法がわからなければ[Visual Studio Code Live Server Extensionを使ってkintoneカスタマイズ開発効率をあげよう！](https://developer.cybozu.io/hc/ja/articles/360026502091)を参考にしてください。

```powershell
> ./mkcert-v1.4.1-windows-amd64.exe -install
> ./mkcert-v1.4.1-windows-amd64.exe localhost 127.0.0.1 ::1
```

実行できれば2つのファイルができるはずです。
そのファイルをプロジェクトフォルダの1つ上に移動させます。
カスタマイズフォルダはカスタマイズするアプリごとに増えますが、この自己証明書は共通だからです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480759/90dcba8f-1990-656b-93a3-2c45cbdb7f7a.png)

次はpackage.jsonを書き換えます。

```json:package.json
    "ws": "ws --https --cert ../localhost+2.pem --key ../localhost+2-key.pem",
```

これでhttps://127.0.0.1:8000/ にアクセスする必要がなくなりました。

つぎは2つ目、3つ目のカスタマイズテンプレートを作りやすくします。
これまでに作ってきたkintone-customize-templateフォルダをコピーしてもいいのですが、不要なファイルの書き換えなど少し面倒です。
なのでGitHubを使ってそれを簡単にします。

# Gitのインストール
以下からダウンロードしてインストールします。
https://git-scm.com/

インストール途中の選択肢「Choosing the default editor used by Git」では「Use Visual Studio Code as Git's default editor」を選択します。

# kintone-customize-templateをclone

以下のコマンドを実行します。

```powershell
> git clone git@github.com:potaracom/kintone-customize-template.git プロジェクト名
> cd プロジェクト名
// .gitフォルダを削除
// package.jsonのname, dev, prodを書き換え
// manifest.dev.json, manifest.prod.jsonのappを書き換え
> npm install
```

これでカスタマイズを始める準備完了です。