OmniAICreator/Qiita-1.07M huggingface dataset:
とあるエンジニアの問題意識 2019-02-26



# さっきまで何をやっていたか忘れてしまう。
細かいレベル無限のタスクスイッチングの余波で。これは人間の脳の自然な仕組みだとはいえ、どうにかうまく思い出せないものかと毎回思う。ここ1分間ほどのMac OSでの操作をダイジェストに高速再生してくれるソフトウェアでもあれば助けになるかもしれない。

# 昔、業務委託を1ヶ月だけやった時。
ガチガチに緊張して疲労困憊していたころ。エネルギー管理が今より100倍苦手だった。あの時代に比べたら今は天国かと思う。どちらかというとエネルギーの質が変わった。波の描かれ方が。

# 莫大なエネルギーを消費するもの。
たとえばWi-fiが繋がらない時の無限のコスト感。他にやりたいことがあるのに突発的なロードに何度も行き当たる。たぶん脳の中でも飛行機が何度も壁に当たって追突している気がする。たった十数秒でも。そんな数秒で疲れるはずがないという認知否認がある。少しずつ是正していく。

# コンディションが良い時は意識のメモリの階層を意識できる。
3個ほどのタスクがあり、それをノートに書き付ける。1個のタスクに3個の下位チャンクが連なる。それがまた派生する。その全体像を把握して自分が旅から戻ってこられそうかを意識する。耳栓とニット帽での刺激低減が大きな味方だ。脳のワーキングメモリの働きに敏感になれる。

# 戦争で母親が我が子を守る。
火垂るの墓の世界。自分のエネルギー問題も同じだと思う。我が子を戦争に差し出す親はいない。いや、歴史的にはいただろうけれど。母親のように自分のエネルギー状態を守る。戦争の火の粉から隠してあげる。子供を守るなら全力になれる。

# 朝にたくさんのタスクが発生する時。
ノートに書き付けてみると大小あわせて10個を超えている時もある。脳のワーキングメモリを余裕でオーバーフローする。ノートに頼るのは本当は嫌だ。だけど完全な脳から逆算すると人間のそれはまだまだ未完成系なのだろう。脳の足りないピースを外部装置で埋め合わせているのだろうな。

# 脳や手足のステップ数1個ずつを認知したい気持ちがある。
キーボードを打つ操作の1個ずつに対して。たとえば格闘ゲームではコンマ秒のフレームレートまで認識される。あれを1日の仕事やプライベートの全時間でやる感覚。マインドフルネスが上達すれば十分可能だとは思う。今日はわりと調子が良いので感覚はつかめている。

# 自分のエネルギー状態が我が子だと気付いた。
かなり繊細なひな鳥みたいだ。この子を大事に大事に守りたい。とても愛おしい気持ちがする。人生35歳にしてセルフコンパッションに気付く。もっと早くから愛してあげたかったと思う。今からでは遅くはない。

# 朝の大勢のスタンドアップミーティングは短時間でもエネルギー消費度が高い。
呼吸法や視界聴覚刺激の低減も試すが、応急処置だ。周りに人がいる。自分が何を話すか、他の人が何を話しているか。そういった構え効果が莫大なエネルギーを使う。これが意識できないタイプのエネルギー消費。

# インターフェイスの悪いソフトウェアが辛い。
これがなかなか人には伝わらない。自助努力を求められる。インターフェイスと人間は歩み寄りだ。だがさすがにpivotal trackerは辛すぎて未だに付き合いづらい。前にUIの悪い部分を書き出したら短時間で30個ほど見つかった。苦いやつだ。

# エネルギー管理。
人の話し声が意識のエネルギーを消費する。自分は意識していなくても人の声が耳に入るだけで脳は言語処理をしている。そうでなければカクテルパーティー効果は起きないだろう。だがいちど事実を理解するとこのタイプの消費さえリアルタイムで認知できるような気もする。

# 仕事をしていると戦争を感じる。
職場の雰囲気や人間関係ではない。エネルギー管理の話だ。人の話し声はロケット砲みたいな感じがする。実際は轟音ではないのだけれど小さな小さな兵器のような。人命は注意力だ。うかうかしているとどんどん死ぬ。だから最新の注意を払って平和を実現する。

# #エネルギー 管理に対してもっと優れたメンタルモデルを持ちたい。
戦争に例えるのが一番しっくりと来ている。人の声やSlackの通知の中で戦うのは空気中でゼロ戦を飛ばし合うみたいだ。そして母親は我が子であるエネルギーを大事に守る。気持ちだけではだめだ。頭脳と戦略と機敏さも要求される。

# 瞑想二年半の選手。
だけどまだまだ経験が浅い。体は35歳だけど心は2歳半。ちなみに注意力のコントロールベイベーは生まれたて。まだ0歳の赤子のように感じる。おもちゃ戦争の中を生き延びるため、この子供を守りながら戦う。

# うまくなりたいモチベーションは幸福感に対する期待だ。
たとえばマインドフルネスの技術を進めることは期待感が大きい。だからモチベーションがある。闇雲なプログラミングの勉強はコスパが高いとは言えない。無限の技術を事前に身に着けても使わなければ投資が無駄になるだけだ。モチベーションは期待値依存。努力や精神論の話じゃない。

# マルチタスキングには独特の誘惑がある。
脳のワーキングメモリ数が良好な時にはそれでも良いかもしれない。だがたやすく破綻する。ノイズにまみれて自己観察力が圧倒的に低下してしまう。自分自身がどの場所にいるかも分からなくなる。そいつがボトルネック。

# 昔話。
いつ出来るのかと急き立てられるのには独特の焦りを感じる。対策はこまめにステートを共有すること。だがこれにも落とし穴が。ステートの共有自体が実は高度なスキル。どのような表現をしようか迷っている間に時間が経つ。ネトゲでチャットに慣れていない初心者と言えばわかりやすいだろうか。

# ゆっくりと落ち着いて仕事がしたい時もある。
特に自分の身体感覚がスローペースな時には。その方がずっと仕事ができることは実証されている。あとは心理的抵抗をどう乗り越えるか。焦りという最大のボトルネックは昔克服したが、まだ0%になったわけではない。何度だって呼吸を整えて解消する。

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/635








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
zsh-syntax-highlighting が使用できない場合

`zsh-synyax-highlighting` を導入しようとしたら、ちょっとだけ詰まった話。

`zsh-synyax-highlighting`とは、その名の通り、ターミナルコマンドに色をつけて見やすくしてくれるプラグインだ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241647/a4c1e814-f9da-cfa4-620f-65a0edb55db9.png)

こんな感じ。`cd`や`ll`コマンドが緑色になっているのが確認できるだろう。

基本的に公式ページのhow to install を見てその通りに進めて行けばOKです。
https://github.com/zsh-users/zsh-syntax-highlighting/blob/master/INSTALL.md

私はoh-my-zshを既に導入していたので、↓の方法でインストール

```shell
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
```

そして、`~/.zshrc`ファイルを書き換えていくのだが、ここで事件発生。

`vim ~/.zshrc`で当該ファイルを開き、編集！

```
plugins=( [plugins...] zsh-syntax-highlighting)
```

ここで事件発生。
こいつをコピペしたらzshが動かなくなってしまったのだ。bashの画面に戻ってしまってものすごく焦ったのだが、原因は`[plugins...]`。これ、他のプラグインが書かれていますよー、という親切なお知らせ。

何もいじっていなければ66行目あたりに

```shell:~/.zshrc
plugins=(git)
```
と書かれているはずなので、こいつを

```shell:~/.zshrc
plugins=(git zsh-syntax-highlighting)
```

と書き換えてあげればいいだけの話だったのだ。

保存して `source ~/.zshrc` すると、無事にハイライトされていた。

めでたしめでたし。

参考：
https://medium.freecodecamp.org/jazz-up-your-zsh-terminal-in-seven-steps-a-visual-guide-e81a8fd59a38
線形回帰問題を機械学習で解く

cousera機械学習week2の概要。自分の理解では、線形回帰における機械学習とは、与えられる実データ(x,y)に対し、予測式HΘにxの値を代入れて得られる予測値との差が最小になるようなΘを機械的に見つけ出す手法のこと。このプロセスを行列式で示し、それをOctaveで記載して計算する。

####1. カレントディレクトリをデータ、プログラムファイル(xxxx.m)のあるフォルダに設定。
プログラムファイルを使うと、ファイル名をコマンドのように扱うことができる。引数がある場合は、ファイル名（引数1,引数2,,,,）で記載する。

####2. データを読み込み、x, y の行列に分割してプロットする。

####3. 予想式（1変数による直線回帰）を定義する。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/311614/ab3a848f-6d31-140f-17e4-04bcb3eb810f.png)

この式はxの1*2行列[1  x]とΘの2*1行列[Θ0; Θ1]の積で示すことが出来る。

####4. 実データと予想値の差Jを定義する。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/311614/3d50060d-3999-c8e9-41d8-9f8b991043c8.png)

実データyと予想値H(x)の差の二乗の総和として定義。Θが決まると実データ(x,y)に対するJ値が決まる。

####5. Θを変換させてJを徐々に小さくする。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/311614/2530db08-5c38-b1a0-ba3f-271e8c2b9fc2.png)

Θの変換式はJ算出式の偏微分で定義できる（より良いΘに近づける変換ロジック、機械学習の肝）。Θ初期値、α値を決める。規定回数変換させてΘの収束値を求める。
Googleスプレッドシート - ボタンを押すだけでメールを送信する機能

今回はタイトル通り、
GASの記述ルールやお作法、変数、定数、型、配列や演算子など様々な基本を複数回に分けて書いていきます！

以下様々なGASの記事を紹介してます！
https://bzbot.work/

##紹介記事
今回紹介している記事は以下です！
https://bzbot.work/2019/02/01/spreadsheet-email-1/


```javascript:GAS
function goGoGmail() {
  var sheet = SpreadsheetApp.openById('****************');
  var add = sheet.getSheetByName('メールテンプレ').getRange(1,2).getValue();
  var popUp = Browser.msgBox("送信確認！", add + "へ送信しますか？", Browser.Buttons.OK_CANCEL);
  if (popUp == 'ok') {
    var mailSubject = sheet.getSheetByName('メールテンプレ').getRange(2,2).getValue();
    var mailBody = sheet.getSheetByName('メールテンプレ').getRange(3,2).getValue();
    GmailApp.sendEmail(add, mailSubject, mailBody);
    Browser.msgBox("送信しました");
  } else {
    Browser.msgBox("キャンセルしました");
  }
}
```

var sheet = SpreadsheetApp.openById('****************');
にはスプレッドシートのID部分を指定することができます。
それ以外にもActiveのシートとして別の記述をする方法もあります！

Toには送信先アドレスをセットします。
Subjectには送りたい件名をセットします。
Bodyには送信したい内容をセットします。

##送信用シート
![image.png](https://qiita-image-store.s3.amazonaws.com/0/363116/a7bcda48-67f6-4a4a-fe89-eabdbb997190.png)

送信確認は誤送信を防ぐ意味でもポップアップで通知をしています。
##送信確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/363116/50fafae5-bde4-e766-9b69-7410efcfdc90.png)

最後に送信の完了確認が取れました。
##送信完了
![image.png](https://qiita-image-store.s3.amazonaws.com/0/363116/855b8009-b0b3-17d6-5ab9-cca3fdc7ae59.png)


どういった場面でManualで送信をする方法でやりたいか？ですが、
これは結構現場によりけりですが、メールフォーマットでスクレイピングをする様なビジネスだったり、メールの文面から判断する様なシステムがあったときに、一度セットしておけばフォーマット変更がない限りずっと使えます。

私も仕事でそういった場面があったときに都度送ったりしてましたがどこかに向き先とか指定できるツールがあればなってことでつくってみました。
Visual C++ 2015 にてOpenMP適用

Visual C++ 2015 の既存アプリへOpenMPを適用する方法を記載します。
Qiitaへは練習がてらの初投稿です。
Hello World的な簡易な内容ですみません。適宜拡充できればと思います


# 1.OpenMPとは
OpenMPは、C / C++ / FortranにてマルチプロセスでのプログラムをサポートするAPIです。

複雑な事前準備をすることなく、Visual Studioへの簡易設定とプログラム上の並列化したい箇所へOpenMP適用のおまじないを記載することで、実行プログラムに高速化の恩恵を受けれます。(論理的には適用箇所へNコアでN倍の高速化が期待できますが、実際にはプログラムの依存関係、メモリ帯域幅、ファイル書込等の並列化できないリソースなどの制約によりN倍にはなることはほぼないです)





# 2. Visual Studio 2015の環境設定

Visual Studuio 2015でC++ アプリのプロジェクト作成後

プロジェクトのプロパティから
-> 構成プロパティ
-> C/C++
-> 言語
-> [OpenMPのサポート] を「はい」にする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/284078/2376a396-683e-8cf7-2c99-3f7771442b93.png)



# 3. プログラムへのOpenMP適用

for文へのOpenMP適用方法 

### 変更前
以下の様なfor文があった場合に、for文の直前へ一行おまじないを入れることで実行時の並列化が可能です。

    int a[100000];
    
    for (int i = 0; i < 100000; i++) {
        a[i] = 2 * i;
    }

### 変更後
for文の前に「#pragma omp parallel for」の一行を足すだけで並列化が可能です。

    int a[100000];

    #pragma omp parallel for
    for (int i = 0; i < 100000; i++) {
        a[i] = 2 * i;
    }

この際に、
- for文のカウンタ i は符号付整数である。
- カウンタ i の増分は整数の加算 or 減算である
- ループ内は continue以外のジャンプ(break、exit、goto)は許容されていない
等の制約があます。満たさないとコンパイル時にエラーとなります。

以上、初投稿により簡単ですみませんが、随時拡充したいと思います。
RTKPLOTのGoogleMAP機能を使う

#RTKPLOT
RTKLIBに含まれるソフトウェアの一つ。
GoogleMapAPIを使って航空写真で表示できていたのだけど、近年になってWindowsやGoogleの仕様変更で航空写真や地図が使えなくなっていた。
木谷先生twitter@tomoyappに解決法を教えていただいたのでメモ。

##レジストリ追加
http://gpspp.sakura.ne.jp/diary201712.htm
12/05の記事を参照。
たいして要約になってないけど、以下の手順。

・レジストリキーをいじる。regeditを起動して、以下のようにキーを掘り進める。

HKEY_LOCAL_MACHINE - SOFTWARE - Wow6432Node - Microsoft - Internet Explorer - MAIN - FeatureControl - FEATURE_BROWSER_EMULATION

・メニュー [編集] - [新規] - [DWORD (32ビット) 値] を実行して、レジストリ値を追加。

・レジストリ値の名前 "rtkplot.exe"、0002af8 (16進) または11000 (10進) を入力。

##GoogleMapAPIキー
ググったらたくさん出てくる。どうにかしてGoogleMap APIキーを手に入れる。

##rtklplot_gm.htmを書き換える
http://www.rtklib.com/rtklib_support.htm No.142参照。

rtklib/bin/rtklplot_gm.htmをメモ帳とかで開く。

```code
<script src="http://maps.google.com/maps/api/js?v=3&sensor=false"
->
<script src="http://maps.google.com/maps/api/js?key={YOUR_API_KEY}&v=3&sensor=false"
```

key=GoogleMAP APIの16進数文字列&

という感じの文字列を追加する。
 
## NTRIP STR MAPでも使えるようにする。
以下から引用
http://www.rtklib.com/rtklib_support.htm

```
No.148 Map view of NTRIP Browser does not work (SRCTBLBROWS)

Map view of NTRIP Browser does not work. Map view only shows a blank page.
Add the following entry of Windows registries by regedit (Registry Editor) to run the WebBrowser component on NTRIP Browser as IE 11.
- Key: KEY_LOCAL_MACHINE - SOFTWARE - Wow6432Node - Microsoft - Internet Explorer - MAIN - FeatureControl - FEATURE_BROWSER_EMULATION
- Name: srctblbrows.exe
- Type: REG_DWORD
- Data: 11000 (decimal)
Additionally, obtain your own API Key by yourself and edit the header line of the HTML file rtklib/bin/rtklib_gmap.htm as follows. (2020/07/10)
<script src="http://maps.google.com/maps/api/js?v=3&sensor=false"
->
<script src="http://maps.google.com/maps/api/js?key={YOUR_API_KEY}&v=3&sensor=false"
```
本日のエラー 

## String interpolation produces a debug description for an optional value; did you mean to make this explicit?

Google翻訳
「文字列補間は、オプションの値に対するデバッグ記述を生成します。これを明確にするつもりでしたか？」

### 原因
Optional型の文字列をunwrapせず直接出力しようとした。

### 解決方法
インターンで扱ったコードを簡略化したものです。

```swift
var text:String? = nil
text = "Internship"
print("\(text ?? "text is nil")")
```
こんな感じでやったと思う。

あと使わなかったけどこれ。

```swift
let text: String? = nil
text = "Internship"

if let text = text {
    print("\(text)")
}
else {
    print("nil")
}       
```

強制アンラップは基本使わないと以前教わりました。
エラーもメモだけじゃなくてQiitaにもあげていこうと思います！
以上です！

3月から就活の合間合間で100DaysOfCodeやってみようかなと思います！
No route matches [GET]の原因と解決策

###エラー
post/indexのブラウザ上で、postコントローラーのdestroyアクションを実施した結果、以下のエラーが起きた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/288657/1375cb03-7f71-e24a-33a2-ad28da11f876.png)

####エラーの該当箇所
```
<%= link_to("削除", "/posts/#{@post.id}/destroy", {method: "delete"}) %>
```

###解決策
rake　routesでひとまず確認

```
rake routes
```
```
 posts_create POST   /posts/create(.:format)           posts#create
               GET    /posts/:id/edit(.:format)         posts#edit
               POST   /posts/:id/update(.:format)       posts#update
               POST   /posts/:id/destroy(.:format)      posts#destroy
```
###解決策
routesと、メソッドを変えたら解決した。

####①POSTをDELETEに変更

routesで、**POST**   /posts/:id/destroy(.:format) を、**DELETE** /posts/:id/destroy(.:format)に変更

参考記事：https://railsguides.jp/routing.html

####②link_toをbutton_toに変更

```
<%= button_to("削除", "/posts/#{@post.id}/destroy",method: :delete) %>
```

参考記事：https://qiita.com/y-temp4/items/2d50feb3ff0d65acdf67
###メモ

link_toからbutton_toに変更すると、Viewはこうなった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/288657/391e4e49-5a47-d9b8-b601-f105ae458b90.png)
Windows 10 Pro x64 + Python3 で selenium + chromedriver でhtml5の日付入力を試してみる

#目的
html5の日付入力を試してみる
※yyyymmdd の形式で入力している例しか見つけられなかったのだけど
　Chrome で入力すると yyyy Keys.TAB mmdd HHMM になるんだよな・・・
　試したサンプルでも上記のキー入力で動作が確認できたしな
##サンプルコード
対象とするhtmlの抜粋
<pre>
&lt;input type="date" name="caldate1"&gt;
&lt;input type="datetime-local" name="caldate2"&gt;
</pre>
コード

```python
# Windows Add env PYTHONIOENCODING = UTF-8 & restart vscode

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait, Select
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome('C:\\Dev\\tool\\webdriver\\chromedriver.exe')  
driver.get('http://localhost:8080/')
try:

    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.NAME, 'caldate1'))
    )

    elm = driver.find_element_by_name('caldate1')
    # ブラウザでのキー入力は yyyy Keys.TAB mmdd
    elm.send_keys('1987')
    elm.send_keys(Keys.TAB)
    elm.send_keys('1231')

    elm = driver.find_element_by_name('caldate2')
    # ブラウザでのキー入力は yyyy Keys.TAB mmdd HHMM
    elm.send_keys('2019')
    elm.send_keys(Keys.TAB)
    elm.send_keys('0102')
    elm.send_keys('2314')

    time.sleep(2) # 表示確認用のwait
finally:
    driver.quit()
```
##参考にしたサイトはこちら
[日付の入力欄を作る](https://www.tagindex.com/html5/form/input_date.html)
[How to Select Date from DatePicker/Calendar in Selenium Webdriver](https://www.guru99.com/handling-date-time-picker-using-selenium.html)
遺伝的アルゴリズム (Genetic Algorithm)

##１．定義
遺伝的アルゴリズム（genetic algorithm、略称：GA）とは、1975年にミシガン大学のジョン・H・ホランド（John Henry Holland）によって提案された近似解を探索するメタヒューリスティックアルゴリズムである。計算機科学とオペレーションズリサーチで遺伝的アルゴリズムはより大きな進化的アルゴリズムのクラスクラス（Evolutionary algorithm、略称：EA）に属する自然選択のプロセスに触発されてメタヒューリスティック。4つの主要な進化的アルゴリズムの一つであり、その中でも遺伝的アルゴリズムは最も一般的に使用されている。ダーウィンの進化論に基づいて、生物突然変異や交叉や選択などを使って、遺伝的アルゴリズムは最適化および検索問題に対する高品質の解決策を生成するために使用される。

##２．アルゴリズムの流れ
- 4つの主要ステップがある：
 - ソリューションを暗号化する
 - 初期集団を生成する
 - 遺伝的数学と適応評価を使う
 - 選択によって新しい集団を生成する
 
![alt](http://ipr20.cs.ehime-u.ac.jp/column/ga/image/fro.gif)

##3. 主な要因
###1. 選択
選択は生物の自然淘汰をモデル化したもので、適応度にもとづいて個体を増やしたり削除したりする操作である。 選択のアルゴリズムには次のようなものがある。

####ルーレット選択

![roullete.png](https://qiita-image-store.s3.amazonaws.com/0/349079/aea4ebb4-dcb9-d2dc-4931-e485b75052da.png)

ルーレット選択は個体 i を選ぶ確率を pi と置いたとき、
>Pi =Fi/𝝨fk (1≤k≤N)

とする選択方式である。上記の式の fi は個体 i の適応度を表す。この方式はホランドが最初に提案したときに使われた選択方式であり、最も有名な選択方式であるが適応度が負の数を取らないことが前提になっている。また適応度が高いことが前提になっているため最小値を求める問題では使の適応度の格差が激しい場合は適応度の高い個体の選ばれる確率が非常に高くなり、初期収束（後述）の原因にもなる。このため、実際には適応度をスケーリングした値を使用することが多い。

####ランキング選択
ランキング選択は各個体を適応度によってランク付けして、「1位なら確率 p1, 2位なら確率 p2, 3位なら…」というふうにランクごとにあらかじめ確率を決めておく方式である。

この方法は、ルーレット選択と違い選択確率が適応度の格差に影響されない。しかし、これは逆に適応度にあまり差がない個体間でも選択確率に大きな差が生じる可能性がある。また、個体にランク付けをするため次世代が揃うたびにソートを行う必要がある。

###2. 交叉
交叉（組み換え）は生物が交配によって子孫を残すことをモデル化したもので、個体の遺伝子の一部を入れ換える操作である。交叉はその性質上、最も重要な遺伝的操作と言うことができる。

![alt](http://www.softtechdesign.com/GA/GA_figure1.gif)

###3. 突然変異
突然変異は生物に見られる遺伝子の突然変異をモデル化したもので、個体の遺伝子の一部を変化させる操作である。局所（的）最適解に陥ることを防ぐ効果がある。
突然変異の確率は0.1%～1%、高くても数%である。確率が低すぎると局所（的）最適解に陥りやすくなり、高すぎるとランダム探索に近づいてしまう（解が収束しにくくなる）。

![alt](https://www.researchgate.net/profile/Chun_Liu28/publication/272093243/figure/fig8/AS:329956690284546@1455679213204/Mutation-operators-applied-to-chromosomes-in-the-proposed-genetic-algorithm.png)
Argo CD でプライベートリポジトリにアクセスできるようにする

### バージョン
- argocd: v0.11.1+bdeecc2
- argocd-server: v0.11.2+1e5d08c



### 方法

`argocd repo add` コマンドを使うと関連リソースを自動で作ってくれる。
普通argocd自体の設定もGitレポジトリで管理すると思うが、その前にこのコマンドで作ってしまってそこからYAMLを清書すると楽。

```console
$ argocd repo add git@github.com:${USER}/${REPO}.git --ssh-private-key-path ~/.ssh/${PRIVKEY}
```
自分向け: flowのライブラリをtypescriptにする手順

1. 依存を更新する(まずこれをしないと変なところでハマる可能性があるので１番最初に必ず行う)
1. flow-typedを削除
1. yarn remove flow-bin
1. package.jsonのscriptフィールドを修正しflow関連を削除
1. `yarn add --dev typescript ts-jest @types/jest @akameco/tsconfig` (tsconfigは任意)
1. tsconfigの編集: extendsにakameco/tsconfigを指定しoutDirとtargetとlibの指定
1. jest.config.jsにpreset ts-jestを追加
1. eslintの設定(eslint-config-precureを使っていればflowならflow,tsならtsで自動設定されるので変更する必要はないが一応確認)
1. 拡張子をjs→tsに変更
1. 必要な@typesのインストール
1. testを通す
1. buildを通す
1. flowをDropするのでリリースする際はメジャーバージョンを上げること

---

flowからTypeScriptにする構成は2通り考えれるが、

1. typescript, jest, ts-jest, prettier, eslint
2. typescript, babel, @babel/preset-typescript, jest, prettier, eslint

ライブラリにおいては、babelと型定義の生成等手間がかかるので基本的にtypescriptオンリーの方がよい。
JQueryのonメソッドを使って動的に生成されたDOM要素を操作する

## この記事について
JQueryにて利用されるonメソッドについて記載する

```
on
→動的に生成された要素に対して、Jqueryのイベントを適応させる
```

## サンプルコード

onメソッドを利用することによって、動的に生成されたDOM要素に対して、イベントを適応させることができる。
clickメソッドは、すでに存在しているDOM要素に対してイベントを設定することができるが、動的に新しく生成されたDOM要素に対しては反応しない。
動的にコンテンツを生成する場合はONを使って実装する必要がある。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
  <title>sample</title>
</head>
<body>
  <input type="submit" value="add!">
  <script>
    $(function(){
      $('input').click(function() {
        var li = $('<li>').text('added!').addClass('add');
        $(this).before(li);
      });
      $('body').on('click', '.add', function() {
        $(this).remove();
      });
    })
  </script>
</body>
</html>
```

試しにonのかわりにclickメソッドで動くか実際に確かめてみてください。
発掘:親子関係のレコードソース

http://www.accessclub.jp/bbs6/0004/das662.html
親子関係のレコードソース --DAO、ADO、SQL & Access フォーラム--
No662.親子関係のレコードソース
タイトル： 親子関係のレコードソース
記事No： 662
投稿日： 2004/10/09(Sat) 14:16
投稿者： tada

OS:
Access Version:

```visualbasic
mon = Me!処理月2

Dim F顧客台帳2 As Form
Dim fk As Form

Set fk = Forms![F顧客台帳1]!Form.[F顧客台帳2]
fk.RecordSource = ("顧客台帳 クエリ" & mon)
```

現状ーーー　　　 F顧客台帳1フォームとF顧客台帳2フォームの親子関係です
変数monはーーーー2004/10 になってました
したいことーーー 子供フォーム（F顧客台帳2）のレコードソースに（顧客台帳 クエリ" & mon）をもって　　　　　　　　　きたいのです
問題点ーーーーーSet fk = Forms![F顧客台帳1]!Form.[F顧客台帳2]でとまります
どうしてですかねー


タイトル： Re: 親子関係のレコードソース
記事No： 664
投稿日： 2004/10/09(Sat) 14:52
投稿者： benkei
参照先： http://www.accessclub.jp/actips/tips_96.htm

> OS:
> Access Version:

> したいことーーー 子供フォーム（F顧客台帳2）のレコードソースに（顧客台帳 クエリ" & mon）をもって
>　　　　　　　　　きたいのです
> 問題点ーーーーーSet fk = Forms![F顧客台帳1]!Form.[F顧客台帳2]でとまります
> どうしてですかねー

子供フォーム（F顧客台帳2）のレコードソース:
`Forms!F顧客台帳1!SUBCrtName.Form.RecordSource`
*SUBCrtNameは　メインフォームのサブフォームコントロール名 多分"F顧客台帳2"

に（顧客台帳 クエリ" & mon）を


`Forms!F顧客台帳1!F顧客台帳2.Form.RecordSource　= fk.RecordSource`


かなあ？


タイトル： Re: 親子関係のレコードソース
記事No： 665
投稿日： 2004/10/09(Sat) 14:56
投稿者： hatena
参照先： http://www.accessclub.jp/bibouroku/ziten.cgi?action=view&data=19

> 現状ーーー　　　 F顧客台帳1フォームとF顧客台帳2フォームの親子関係です
> 変数monはーーーー2004/10 になってました
> したいことーーー 子供フォーム（F顧客台帳2）のレコードソースに（顧客台帳 クエリ" & mon）をもって　　　　　　　　　きたいのです
> 問題点ーーーーーSet fk = Forms![F顧客台帳1]!Form.[F顧客台帳2]でとまります
> どうしてですかねー

レコードソースを代入するだけなら下記の１行でOKかと思いますよ。

`Forms![F顧客台帳1]![F顧客台帳2].Form.RecordSource = "顧客台帳 クエリ" & mon`

注意点として、「F顧客台帳2」の部分は、サブフォームコントロール名でなければ
いけないということです。

サブフォームの参照方法の詳細は下記のURLを参考にしてください。

http://www.accessclub.jp/bibouroku/ziten.cgi?action=view&data=19


タイトル： Re^2: 親子関係のレコードソース
記事No： 666
投稿日： 2004/10/09(Sat) 19:16
投稿者： tada

> > 現状ーーー　　　 F顧客台帳1フォームとF顧客台帳2フォームの親子関係です
> > 変数monはーーーー2004/10 になってました
> > したいことーーー 子供フォーム（F顧客台帳2）のレコードソースに（顧客台帳 クエリ" & mon）をもって　　　　　　　　　きたいのです
> > 問題点ーーーーーSet fk = Forms![F顧客台帳1]!Form.[F顧客台帳2]でとまります
> > どうしてですかねー
>
> レコードソースを代入するだけなら下記の１行でOKかと思いますよ。
>
> Forms![F顧客台帳1]![F顧客台帳2].Form.RecordSource = "顧客台帳 クエリ" & mon
>
> 注意点として、「F顧客台帳2」の部分は、サブフォームコントロール名でなければ
> いけないということです。
>
> サブフォームの参照方法の詳細は下記のURLを参考にしてください。
>
> http://www.accessclub.jp/bibouroku/ziten.cgi?action=view&data=19

納得しました
最高にうれしい
ありがとうございました
4月からCDSにDynamics365のアドオンであるポータルが接続できるようになる（いつかはまだわからない）

#CDS for Appsにポータル機能が使えるようになる
以下に記述がありました。
https://docs.microsoft.com/ja-jp/business-applications-release-notes/April19/dynamics365-portals/cds-starter-portal

リリース情報は以下です。
CDS starter portalがApril 2019でプレビューになっています。
https://docs.microsoft.com/en-us/business-applications-release-notes/April19/dynamics365-portals/planned-features

CDS for Apps が何者かは以下です。
環境を構築した後にCDSを作れると思いますが、そこにポータルを立てれるようです。
CDSは、Dynamics365やPowerAppsでDBのような役割（データ構造定義を持つような）を果たす機能です。
https://docs.microsoft.com/ja-jp/powerapps/maker/common-data-service/data-platform-intro

#Dynamics365のポータルとは
##アドオンを導入するだけでWEB構築・CMSっぽい
![image.png](https://qiita-image-store.s3.amazonaws.com/0/190486/9d94a7fc-d673-64f1-f14c-63a4ced5d908.png)
ポータルを構築するだけで、Azure上にCDSのデータからWEBページを構築します。
Dynamics365（図ではCDSと表現）をCMSのように使うイメージです。

##ポータルは誰でも利用できる
ポータルは、Azure上にあり、だれでもアクセスできます。
ログインして使えるようにもできますが、ログイン情報はM365のユーザーデータとは独立して、ポータルだけで管理することができます。
そのため、自社のお客様にログインして使ってもらったりとか、匿名の人が資料をダウンロードしたり、といった使い方ができます。

##ポータルで入力したデータがCDSに入っていく
Dynamics365のビューやフォームが、WEBページにそのまま出てくるようなイメージです。（いろいろカスタマイズもできます）
お客様とかがWEBページで入力したデータがそのままCDSに入っていくのでDynamics365で入力即参照できますし、
逆にDynamics365で入力したデータを、お客様に即座に見せることができます。

##自社の情報共有に使う場合はライセンスが問題
Dynamics365で自社の社員向けのポータルも構築可能ですが、その場合はライセンスが必要です。
TeamMemberという安いライセンスでもいいですが、月額870円なのでそこそこ高いイメージです。
それならばPowerAppsのPlan1で済ましたほうがいいですね。
たぶん上に書いたような外部の人向けに公開するのがいい使い方なんでないかなと思います。

#ライセンスが使えるみそ？？？
Dynamics365ではポータルを使うために、Enterpriseライセンスが最低10個必要でした。
それだけで月額10万円を超えるので、小規模な使い道には展開しづらいのではと思います。
あと、一つのテナントでポータルが一つまでという制約があって、
開発用と本番用の2つを作りたい場合は、追加でもう一つ買う必要がありました。（１ポータル月額5万強ぐらい）

PowerAppsではどうなるんでしょうかね。
綺麗なプルリクをあげたいあなたへ

# なぜ書くか
見やすくて理解しやすいプルリクの方が読む方も早く読めるし、出した方も早く返ってくるからなんか `win-win` な気がするから。

# プルリクとは？
プルリクエストの略。
コードの変更をレビュワーに通知し、マージを依頼する機能。
プルリクをあげてレビューを受けることで、一人では気づけない指摘やバグや記述ミスの発見をすることができ、コードの品質を高める。

# 綺麗なプルリクとは？
コードを書いていない他の人が見て、すぐに概要を把握できるプルリクをここでは「綺麗なプルリク」とすることとする。

# 綺麗なプルリクのメリットは？
- 開発速度の向上
- 確認漏れの減少
- 仕様ズレの早期発見

# 意識すること
1. プルリクで何をしているかをわかる説明文を書く
2. プルリクの粒度を小さくする
3. コミットを綺麗にする
4. 自分の意図をコメントしておく

## 1. プルリクで何をしているかをわかる説明文を書く
そのプルリクは何のためのもので、何をしているのかを説明文として書こう。

- 概要
- 目的
- 変更内容

上記の内容を書くことで、レビュアーは「このためのプルリクか」「こういうことをしようとしたコードなのか」とコードを読むための準備ができる。
準備ができるとレビュアーとしてもより早くコードの理解をすることができ、「こっちのやり方のほうがいいよ」「ここはバグ生みそう」などより質の高いFBをすることが可能になる。

さらに、UIが変更になった場合は、その `before` と `after` のスクショも一緒に貼ってあげるとお互いの認識のズレが生じにくくなり、仮にズレがあったとしてもより早い段階で気づくことができる。（下記の書き方で書ける）

```
before | after
---- | ----
<img src="" width="320"/> | <img src="" width="320"/>
```

また、もしも意図的に変更していない箇所があればそれも追記しておくと余分なコミュニケーションコストがかからない。

結論、「何をするためのプルリクか」「何をしたプルリクか」「何を変更したプルリクか」を明確にすると良い。

```
## 該当エピック
epic: #1111
## 概要
一文で何を実装したのかを書く。
## 目的
一文で何のために実装したものなのかを書く。
## 変更内容
- 変更内容1の修正
- 変更内容2の追加
- 変更内容3の削除
## PR除外箇所
- 除外した内容
    - 理由
```

## 2. プルリクの粒度を小さくする
変更箇所が少なければ少ないほど、レビュアーに与えるストレスは少なくなる。
変更箇所が多いと、どうしても心理的に避けてしまい、後で時間があるときに確認しようとなってしまうため待ち時間が生じる可能性が高い。
しかし、変更箇所が少ないと「これくらいだったら今確認してあげよう」となり、待ち時間が少なくFBをもらえるかもしれない。

もしも、プルリクにファイルが多くなりすぎている場合は、設計の段階でイシューを分割するべきかもしれない。
大体、一つのプルリクに多くて10ファイルがストレスを感じにくい量なのかもしれない。

結論、1プルリクに含めるファイルは最小限にしよう。多い場合は、分割できないかを考えてみよう。


<img width="258" alt="スクリーンショット 2019-02-27 0.36.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/232348/241e81aa-2ba1-d782-e6cb-85cca8589053.png">

※これは筆者が実際に出したプルリクである。精神的にレビュアーにダメージを与えたに違いないと反省しております。

## 3. コミットを綺麗にする
コミットは、機能ごとでまとめて、変更内容が何か、メッセージを読めばわかるコミットメッセージを書こう。

### 一般的にコミットで大事と言われていること
- 可読性
    - commit message の読みやすさ
    - 変更概要を簡単に把握できるようにする
- 原子性
    - commit 粒度の小ささ
    - 変更の粒度を不必要にあげない
- 論理性
    - 変更が意味的にまとまっているか
    - 変更は意味的にまとめて commit する

要するに、読みやすく、規模を小さく、関連している変更をまとめていると読みやすいプルリクになるということである。

可読性をあげる方法として、`[Mod]` `[Add]` `[Del]` ` [Fix]` などをコミットメッセージの前につけてあげるとその内容が修正なのか、新規追加なのか、削除なのか、バグ修正なのかがコードを見なくても予想をつけることができる。
さらに、コミットメッセージには

- 具体性
- 人間的意味

の二つを持たせることを意識する必要がある。

具体性とは、例えば `Fix bugs` ではなく `ユーザー登録フォームのボタンが押せない問題を修正` になり、
人間的意味とは、`OLD_CONST1, OLD_CONST2を削除` ではなく、 `ver2.0で廃止した登録関連の古い定数を削除` になる。

```
ex)
- [Fix] ユーザー登録フォームのボタンが押せない問題を修正
- [Add] ユーザー管理画面で複数ユーザーに対して一括で権限付与できる機能を追加
```

結論、関連性のある処理でまとめて、コミットメッセージだけでレビュアーが何の処理が書かれているかを把握できるようにしよう。

## 4. 自分の意図をコメントしておく
あらかじめの補足情報や相談をコメントにしておくことでレビュアーのプルリクに対する理解も進み、より深い議論をすることができる。
コメントは、レビュアーのためだけの機能ではなく、レビューしてもらう側も意見を伝えることができるための機能であることを覚えておこう。

結論、不安な箇所や意図がある箇所はコメントを書こう。

## 番外編
プルリクやコミットをする際に役に立つgitコマンド

- git add --patch
    - 関連のある変更をまとめることができる
- git rebase -i
    - コミットし忘れた内容を前のコミットとまとめることができる
    - squashを選ぶことで前の内容と結合することができる
- git push --delete origin some-branch
    - pushしてしまったが、まだプルリクあげたくなかった時にプルリクを削除することができる
    - プルリクを作成したが、出したくなくて消したい場合にプルリクをcloseにすることができる


## 参考サイト
https://katsuki.hatenablog.com/entry/2018/07/20/081849
https://dev.classmethod.jp/study_meeting/git-workshop-20180327/
https://ics.media/entry/14449
https://techlife.cookpad.com/entry/2016/08/17/111500
[C言語] 毎朝これを拝むと C のポインタが理解できるかもしれない

じつは[今朝書いた Perl のリファレンスの記事](https://qiita.com/tani-ro-hei/items/7378ce37390d257e63a7)とも関係は大アリなのですが、たまたま手元にこんなものがあったので、ついでながら投稿です。
毎朝このサンプルプログラムを拝むと、そのうち C のポインタが理解できるかもしれないらしいですよ。もっとも、私にはちっとも理解できませんが・・・。

# とても有難いサンプルプログラム

```c:ptr.c
#include <stdio.h>

void main()
{
    int zero, i;
    zero = i = 0;
    i++;
    int *ptr = &i;
    printf("zero == 0, i == 1, ptr は i へのポインタです.\n");
    printf("i = %d, &i = %p, ptr = %p, *ptr = %d.\n", i, &i, ptr, *ptr);
//    i = 1, &i = 0028FF30, ptr = 0028FF30, *ptr = 1.

    int *ptr2 = ptr;
    printf("ptr2 はポインタで, ptr2 の指すアドレスは ptr の指すアドレスです.\n");
    printf("ptr2 = %p, *ptr2 = %d.\n", ptr2, *ptr2);
//    ptr2 = 0028FF30, *ptr2 = 1.

    ptr2 = &zero;
    printf("ptr2 に zero のアドレスが代入されました.\n");
    printf("zero = %d, &zero = %p, ptr2 = %p, *ptr2 = %d.\n", zero, &zero, ptr2, *ptr2);
//    zero = 0, &zero = 0028FF34, ptr2 = 0028FF34, *ptr2 = 0.

    printf("このとき, ptr が指すアドレスに保存されている値は?\n");
    printf("ptr = %p, *ptr = %d.\n", ptr, *ptr);
//    ptr = 0028FF30, *ptr = 1.

    getchar();
}
```

以上！
ANGULAR.JS公式チュートリアルのPhoneCat Tutorial Appはじめました。

#ANGULAR.JS公式チュートリアルのPhoneCat Tutorial Appはじめました。

#なぜ始めたのか?
業務でJavascriptのwindowオブジェクトの操作とJasmineのUTをやる機会が
あったので、これを機会にJavaScriptの知識を深めたいと思い、テーマを探していました。

目に留まったのがGoogleなどが開発を手掛けたAngularJSが有名！などという情報が入ってきたので、公式ページにあったチュートリアルを試してみることにしました。
電話のカタログページを使ったチュートリアルみたいですね。

参考:https://docs.angularjs.org/tutorial

ひとまず、今回は環境構築から始めたいと思いまっす。

#前提
・Gitがインストールされていることを前提として進めます。

#環境構築

繰り返しになりますが、今回は環境構築がメインです。

まずはangular-phoncatのリポジトリをクローンして
クローンしたフォルダをカレントディレクトリにします。

```
git clone --depth=16 https://github.com/angular/angular-phonecat.git
cd angular-phonecat
```

--depth=16のオプションは最新16件分のコミットのみ抽出するらしいです。
ダウンロード速度を考慮して設定してるみたいですね。


次に依存関係を解決するためにNode.jsをインストールします。
これは事前設定されているローカルWEBサーバの実施に使うみたいです。

インストーラはOS毎に分かれているので公式ページから適切なものをダウンロードしてインストールしてください。

参考:https://nodejs.org/en/download/

Node.JSについてよくわからなかったので調べてみたところ、サーバでJavaScriptを実行できるようにするための
プラットフォームらしいです。
まずは使ってみて雰囲気つかんでみて、気になるとこがあったら詳細に調べてみたいと思います。

インストールが完了したらコマンドラインで次のコマンドを叩いて正常にインストールされた事を確認します。
ちなみに、2019年2月26日現在ではv10.15.1が推奨される最新のNode.jsです。
11.10.0も公開されていましたが、安定している方を選びます。

```
node --version
```

Node.jsをインストールしたらnpmも取得されます。
npmはパッケージ管理ツールでNode.jsのパッケージを管理するのに使用します。
まずは依存関係をインストールしてみます。

```
npm install
```

完了したら実際にWEBサーバを起動してみましょう！
デフォルトの設定ではポート8000をリスナーとするlocalhostが作成されるはずです。

```
npm start
```

起動に成功したらhttp://localhost:8000/index.htmlにアクセスしてみましょう。
こ、これがAngular.jsを使ったページか！めっちゃカッコいい画面やんけ！って画面が表示されれば成功です。

さて、まだ環境構築は終わりではありません。
次は単体テストの機能が正常に動作するか確認します。

angular.jsはKarmaを使って単体テストするように構築されています。
さっそくKarmaを起動してみます。
起動はnpmの以下コマンドでできます。

```
npm test
```

Chromeのブラウザが起動してKarmaの画面が表示されます。
今回はKarumaの勉強に焦点を当てるわけではないので、いったん此処まで。

次にテストツールのE2E(エンドツーエンド)の確認です。
このプロダクトはユーザとブラウザの対話をシュミレートすることでテストします。

WEBサーバが起動した状態で、別のコマンドラインを起動して、次のコマンドを実行します。

```
npm run protractor
```

すると、ブラウザが起動してアプリケーションを自動でテストし始めます。
検索用テキストボックスに勝手に文字が入力されて検索されたりと少し驚きますが、これによりE2Eのテストが自動化できる仕組みっぽいです。
たぶん別途specを用意する必要があるんだと思いますが、これは別の機会に勉強します。

今回はここまで!

参考:https://docs.angularjs.org/tutorial/step_01


マークダウンは後程なおします。
おやすみなさい。
【Python】PyPIエラー対応 File already existsの対処法

# 発生したエラー

`twine`を使って、PythonパッケージをPyPIに登録しようとしたところ、

`HTTPError: 400 Client Error: File already exists. See https://pypi.org/help/#file-name-reuse for url: https://upload.pypi.org/legacy/`

のエラーとなる。

```
$ twine upload --repository pypi dist/*
Enter your username: hogefuga
Enter your password: 
Uploading distributions to https://upload.pypi.org/legacy/
Uploading cc
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 11.4k/11.4k [00:01<00:00, 9.14kB/s]
NOTE: Try --verbose to see response content.
HTTPError: 400 Client Error: File already exists. See https://pypi.org/help/#file-name-reuse for url: https://upload.pypi.org/legacy/
$
```

# 対処方法

原因は、PyPIに登録済みのパッケージとファイル名が重複してしまっているため。

PyPIには同じバージョンのパッケージを再登録はできない。

`setup.py`の`version`を変更した上で、`python setup.py bdist_wheel`でパッケージファイルを作り直すことで、登録が可能。

```python:setup.py
#!/usr/bin/env python
# coding: utf-8

from setuptools import setup, find_packages
from codecs import open
from os import path

here = path.abspath(path.dirname(__file__))

with open(path.join(here, 'README.md'), encoding='utf-8') as f:
    long_description = f.read()

setup(
    name='gokulang',
    packages=['gokulang'],

    version='1.0.1', # 1.0.0 => 1.0.1 に変更
# ...
```

# 環境

- Python 3.6.6
- twine 1.13.0
ランダムな文脈表示

100分de名著の太宰治「斜陽」（高橋源一郎著）に感銘を受けた。
そして、そのノリのまま、webアプリを一つ作成した。

http://world-l-word.com/dazai/index.html

特徴：小説「人間失格」から、文脈をランダムに表示するもの。
データ：青空文庫から適当に。
undefined method `name' for nil:NilClassの原因と解決策

##エラー

2行目のpost.user.nameの「name」のメソッドが見当たらない

```post.index
ActionView::Template::Error (undefined method `name' for nil:NilClass):
    1: <% @posts.each do |post| %>
    2:       <P><%= link_to(post.user.name, "/users/#{post.user.id}") %></p>
    3:       <p><%= link_to(post.content, "/posts/#{post.id}") %></p>
    4:   <% end %>
```

##原因:postテーブル内の何かしらのレコードがなかった

考えられる原因は２つ

(1)postはpost.controller.rbに定義されていない
(2)データベースのpostモデルに、あるべきレコードがない

前者は、コントローラーで定義されていたので、後者の方に原因があると見立てた。

##解決策：DBの全てのレコードを空にした
```
rake db:reset
```
>全てのテーブルを dropして、"db/schema.rb" を元にテーブルを再作成する。（参考記事：http://o.inchiki.jp/obbr/183)
##

##メモ
DBの全てのレコードを空にした後、改めて、post.createしたら無事にpost.indexに反映された。

今回のエラーの原因は、
データベースのレコードと、ユーザー登録されているユーザーのレコードがミスマッチしていたこととだと思った。開発途中で、DBのusersモデルにカラムを追加したり、消去していたことで、ズレが生じていたかも。
JavaScriptのvar、let、constの違いを恋愛に置き換えて説明してみる。

<p>JavaScriptの変数宣言Var,let,constについて恋愛に置き換えて説明してみました。</p>
<p>主人公は花子ちゃんです。</p>
##varの場合
<p>花子ちゃんは同じクラスの太郎くんが好きだと宣言するとします。</p>
```javascript

var my_crush = "太郎くん";
console.log(my_crush); // 太郎くん;
```
<p>しかし、二郎くんを好きになってしまった場合、後から宣言し直すことができます。</p>
```javascript

var my_crush = "二郎くん";　
console.log(my_crush); //　二郎くん
```

##letの場合
<p>同じく花子ちゃんは同じクラスの太郎くんが好きだと宣言するとします。</p>
```javascript

let my_crush = "太郎くん";
console.log(my_crush); // 太郎くん;
```
<p>次に二郎くんを好きになってしまったとしても、宣言し直すことができません。</p>
```javascript

let my_crush = "二郎くん" ;
console.log(my_crush); //　エラー
```
<p>しかし、ひっそりと好きな人を二郎くんにすることは可能です。</p>
```javascript

my_crush = "二郎くん";
console.log(my_crush); //　二郎くん
```

##constの場合
<p>上記同様、花子ちゃんは同じクラスの太郎くんが好きだと宣言するとします。</p>
```javascript

const my_crush = "太郎くん";
console.log(my_crush); // 太郎くん;
```
<p>次に二郎くんを好きになってしまったとしても、let同様宣言し直すことができません。</p>
```javascript

const my_crush = "二郎くん";
console.log(my_crush); //　エラー
```

<p>さらにひっそりと好きな人を変えることもできません。</p>
```javascript

my_crush = "二郎くん";
console.log(my_crush); //　エラー
```

##まとめ
<p>constは最も一途</p>
<p>letは見かけ上一途</p>
<p>varは一途ではないが、いさぎが良い</p>
Entityのライフサイクルでハマりかけた話

##はじめに
- 今回は、Jpaを使う際に絶対に意識する必要があるEntityのライフサイクルについてとJpaの挙動について痛い目にあったので、出来事ベースでエントリを書かせてもらいます
- そんなん知ってるよって方は僕の認識に齟齬があったら指摘ください

##背景
- Spring-data-Jpaを使ってから1年くらい経過しました
- なんとなくメソッドの命名規則さえ意識すればクエリを自動生成してくれるんで便利だなと思っていました

##きっかけ
- 年始に入ってから、JSUG勉強会1回目でカサレアルの多田さんがSpring-data-Jpaを積極的に使う理由は見当たらないという旨の発言をされていまして、自分の中ではいまいち理解しきれずにいました（反抗的ですみませんｍｍ）
- それでも使いたいなら、パーフェクトJavaEEを10周してくださいとのことだったので、3~4周はしておこうと思い読んでおきました

##JavaEEを読んだ感想
- なんとなくで実装していた部分（例えばimplements seriarizableのとことか）知識がなかったので新たな発見は多かったです
- ただ、Entityのライフサイクルはメソッドの自動実装に依存しまくってたので、意識することがないのかなと思ってました

##そして、この伏線たちが・・・
- ここまで伏線を張るともうお分かりかと思いますが、襲いかかってきましたｗｗｗ

##事の発端
- とあるテーブルに対して主キー指定でかつ、日付を１週間の範囲指定で削除する実装をしていました
- こんなかんじです

```UserRepository.kt
interface UserRepository : JpaRepository<UserEntity, Int>{

    fun deleteByIdAndBasedateBetweenAnd(startId: Int,start: Date,end :Date)
}
```
- こいつを７万レコードくらい落としにいったときに100秒くらいかかりまして白目になりましたｗｗｗ

##原因
- ぱっとみ原因はわからなかったので、ymlで一旦show-sql=trueにしました
- すると、こんなかんじでしたｗｗｗｗ

```sample.sql
select * from user where id =XX and basedate....
delete from user where id = XX and basedate=XX
delete from user where id = XX and basedate=XX
delete from user where id = XX and basedate=XX

```
- ご覧の通り、全権取得して範囲内で1日ずつ指定して削除を実行していました
- なので、一旦はメソッドに@QueryでJPQLで実装したことで実行時間は解決したのですが、もう１個疑問が生まれました

##なんでselect走ってるんだろう？
- 実装のイメージには省略しちゃいましたが、実はこのメソッドには@Transactionalがついています
- このアノテーションを外すと動かなくなってしまうのですが、その原因はselectしてるところに関係がありました(ようするにEntityのライフサイクルが登場します)

##Entityのライフサイクルとは
- 基本的にはパーフェクトJavaEE読んでもらった方がわかりやすいので、簡単にしか説明しませんが、Entityの状態は大きく分けて4つあります

|    名前   |    説明   |
|:------------------|:------------------|
|    persist()   | 単にエンティティのインスタンスをnewしただけの状態。永続コンテキスト中で管理されていないため、状態を変更してもDBには一切反映されない。|
|    find()   |永続コンテキスト中で状態が管理された状態。適切なタイミングでDML文の犯行によりDBと同期がとられる。 |
|   remove()   | 永続コンテキスト中で削除が予約された状態。 |
|   merge()   | 一旦Managedな状態にあったエンティティが永続コンテキストから切り離された状態。 |

- deleteはこの状態でいうremoveのことなのですが、永続コンテキスト中で状態が管理された状態に対してのみ実行されるので、selectを実行されてかつ同一のトランザクション内でないと実行してくれないということです
- ここらへんの話を詳しく知りたい方は、まずは「jpa entity ライフサイクル」で画像検索してみてください

##まとめ
- Spring-data-Jpaをなんとなくで使うのはやっぱり危険
- 具体的には、自分の思っている挙動と自動実装で生成されるクエリが一致するとは限らない
- また、ライフサイクルを知らなくても使えることは使えるけど、ハマった時にまじで沼に入りかねない
- なので当面はMybatis推しで行きたい
- カサレアルの多田さんのおかげで命拾いしました。ありがとうございます。

## 参考

[Java ORマッパー選定のポイント](https://www.slideshare.net/masatoshitada7/java-or-jsug?ref=https://twitter.com/i/cards/tfw/v1/1090929751462531075?cardname=player&autoplay_disabled=true&forward=true&earned=true&edge=true&lang=ja&card_height=130&scribe_context=%7B%22client%22%3A%22web%22%2C%22page%22%3A%22search%22%2C%22section%22%3A%22default_tweets%22%2C%22component%22%3A%22tweet%22%7D&bearer_token=AAAAAAAAAAAAAAAAAAAAAPYXBAAAAAAACLXUNDekMxqa8h%252F40K4moUkGsoc%253DTYfbDKbT3jJPCEVnMYqilB28NHfOPqkca3qaAxGfsyKCs0wRbw)
[パーフェクトJavaEE](https://www.amazon.co.jp/%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88-Java-EE-%E4%BA%95%E4%B8%8A-%E8%AA%A0%E4%B8%80%E9%83%8E/dp/4774183164/ref=sr_1_fkmr0_2?ie=UTF8&qid=1551192958&sr=8-2-fkmr0&keywords=%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88java+kindle)
Kotlin用ドキュメント生成ツール「dokka」のセットアップ&操作方法

## 「dokka」とは？

Kotlin用のドキュメント自動生成ツールです。
Kotlin公式が提供しています。

## 環境

- OS：macOS Mojave 10.14
- Kotlin：1.3.21
- Gradle：5.2.1
- dokka：0.9.17

## セットアップ

### インストール

appフォルダ配下の「build.gradle」にdokkaのプラグインと設定を追加します。

```diff_groovy:/app/build.gradle
+ apply plugin: 'org.jetbrains.dokka-android'
+ 
+ dokka {
+     outputFormat = 'html' 
+     outputDirectory = "$buildDir/javadoc"
+ }
```

ルート直下の「build.gradle」にdokkaのバージョンとクラスパスを追加します。

```diff_groovy:/build.gradle
buildscript {
    ext {
+         dokka_version = '0.9.17'
    }

    dependencies {
+         classpath "org.jetbrains.dokka:dokka-android-gradle-plugin:$dokka_version"
    }
}
```

## 実装

ドキュメント化したいメソッドやプロパティにドキュメンテーションコメント(KDoc)を付けます。

例

```kotlin:MainActivity.kt
package com.example

import android.os.Bundle
import android.support.v7.app.AppCompatActivity

/**
 *  メインアクティビティ
 */
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    /**
     *  2つの数字を足す
     *
     *  @param x 数字1
     *  @param y 数字2
     *  @return 数字1 + 数字2
     */
    fun add(x: Int, y: Int): Int {
        return x + y
    }

}
```

## ドキュメントの生成・閲覧

Android Studioのターミナルで `./gradlew dokka` を実行すると、 `outputDirectory` で指定したフォルダ(/app/build/javadoc/)内にドキュメントが生成されます。

「…javadoc/app/index.html」をWebブラウザで開くとドキュメントを閲覧できます。

<img width="615" alt="スクリーンショット_2019-02-26_23_59_18.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/138245/d95d49f1-7f4f-3042-69c1-a5a17c9c2978.jpeg">
<img width="616" alt="スクリーンショット_2019-02-27_0_01_45.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/138245/3307551f-401e-7b8e-e8b1-f2c2b3c87108.jpeg">
<img width="425" alt="スクリーンショット_2019-02-26_23_46_37.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/138245/c7860d5f-72ba-f42c-8bf8-68dabc22353c.jpeg">

非常にシンプルなデザインです。

## おわりに

ここでは簡単にしか紹介していません。
dokkaの使い方についてもっと詳細に知りたい場合は参考リンクなどをご参照ください。

KDocについては以下のページが参考になります。
https://kotlinlang.org/docs/reference/kotlin-doc.html
https://qiita.com/opengl-8080/items/fe43adef48e6162e6166

## 参考リンク

- [dokka/README.md at master · Kotlin/dokka](https://github.com/Kotlin/dokka/blob/master/README.md)
- [Kotlin版Javadocを生成できる「dokka」の導入手順 - Qiita](https://qiita.com/kanatano_mirai/items/351832a0ef166f052141)
もうそれtrueなんだから比較しないでくれ頼むから

## if文って？

世の中には様々な言語がありますが、どの言語にも大抵備わっている構文、「if文」。
「if」と記載した後ろに条件を書くことで、その条件を満たした時のみ実行させる処理を記載できる、プログラミングといったらコレだよコレって感じのアレです。

## if文が成立する条件とは

上で「どの言語にも大抵備わっている」と書きましたが、それが成立する条件は**言語ごとに異なります**。
ざっくり分けても以下のパターンがあり得ます。

- 条件がtrueになった時
- 条件がその言語でtrueと等価であるとされる値になった時
- 条件が特定の値以外となった時
- 条件がnullやnilといった空ではない時

世の中の「ほげほげ入門」や「サルでもわかるふがふが」みたいな本やページにはtrue/falseのパターンしか載っていないことも多々ありますが、ちゃんとした仕様は言語によって異なるのでお気をつけて。
(といってもtrue/falseを覚えてれば書けますが)

## 「true == trueやめてもらえます？」問題

初めて聞いたって？そら今作ったからね。
なんの話をしたいかというと、プロジェクトのコードをチェックアウトしてザーッと眺めた時に他の人が書いたであろう

**「それ比較前にtrueですからぁ〜！残念ッ！」**

なコードで見てぐんにゃりしてしまい、まだ午後一だというのに元よりクソみたいなプロジェクトのせいでほんの5g程度しかない仕事のやる気が雲散霧消する事態を避けるべく、ついでに言ってしまえばさも言語に詳しい風を装ってチームに情報共有し自身の成功体験とチームからの信頼を勝ち取ろうという極めて前向きなディスりをしていこうという話です。(ここまで一呼吸で)

先に述べた通り、言語によって異なるのでここから先はお使いの言語で調べてみてください。
今回はmatlabという*ググラビリティ皆無*の言語でやっていきます。

## if文の　仕　様　を確認　し　よ　う　(たのめーる的ギャグ)

どこで確認するか、公式リファレンスだよ。それ以外信じちゃダメ、ゼッタイ。

[if, elseif, else](https://jp.mathworks.com/help/matlab/ref/if.html)

説明のところを読んでみると、

> if expression, statements, end は、式を評価し、式が真 (true) であるときに一連のステートメントを実行します。

ふむふむ、「true」で実行するのは他の言語と変わりませんね。
ただ、その後ろに気になることが書いてありますね。

> 結果が空でなく、非ゼロの要素 (論理値または実数値) のみが含まれる場合に、式は true になります。それ以外の場合は、false です。

これを知っているか否かでif文の組み方が変わってしまいます。

例えば、文字列中に特定の文字列が含まれている場合を想定してください。(ていうかその状況でこの記事思いついたんだけど)
以下では「hogehoge」という文字配列から「eho」を探し、見つかったら開始インデックスを、見つからなかったら空配列を返してくることを想定しています。

```

if strfind('hogehoge', 'eho') ~= 0
    % ステキなサムシング………………………………………………カモン！
end

```

not equalで比較してるので正しそうですが、if文の仕様に照らし合わせると、以下で十分な訳です。

```

if strfind('hogehoge', 'eho')
    % 話は変わるけど、サトームセンもうないんだよね
end

```

言語仕様がわかってるとコード量が少なくて済むので、知ってる構文も調べてみてはいかがでしょうか。
(そして暇な時間を潰しましょう)

## 文体がぶっ飛んでるけど今日どしたの？

にほんしゅはおいしい。
【備忘録】[batch] dateの値をファイル名に利用

##dateコマンドについて
dateコマンドを利用してフォルダ名/ファイル名を作成するbatchを作成したことは誰しもあると思います。ぐぐればすぐ出てきますしね。
簡単に備忘録としてまとめてみます。

```
echo date
```

************実行結果************
2019/02/26


dateコマンドは当日の日付けをyyyy/mm/ddで返すコマンド。
ファイル名やディレクトリ名にするには、/を除く必要がある。
2通りの簡単な方法があったため、メモ。

####1.     %date:/=%
おそらくこれが一番シンプルで簡単な例

```echo.bat
set yyyymmdd=%date:/=%
echo %yyyymmdd%
```
************実行結果************
20190226

「/=」で「/」を文字なしに変換している。
例えば、set yyyymmdd=%date:/=#%とすると、
実行結果は2019#02#26となる。

####2.   %date:~0,4%%date:~5,2%%date:~8,2%
1.と比較して多少ややこしいが、これはこれで応用が利きそう。

```echo.bat
set yyyymmdd=%date:~0,4%%date:~5,2%%date:~8,2%
echo %yyyymmdd%
```
************実行結果************
20190226

「%変数：~x,y% 」変数のx文字目からy文字分を抽出。
x文字目は含まれないことがポイントかも。

###実行例
よくあるテンプレートだが、一応。
日付フォルダの有無をチェックし、ない場合は作成するバッチ。

```mkdir.bat
@echo off

rem - 日付フォルダの有無をチェックし、ない場合作成する

set yyyymmdd=%date:/=%
set base_path=C:\Users\####\Desktop

if not exist %base_path%\%yyyymmdd% (
    mkdir %base_path%\%yyyymmdd%
)
vimの小技

# 検索した文字を置き換えて修正

```
cgn<c-r><c-p>"...
```

## ヘルプ

```
:h gn
:h i_CTRL-R_CTRL-P

' 覚えにくいので、下記参照
:h i
```

# 感想
忘れやすいので備忘録として
Nuxtでグーグルアドセンスの導入でハマったこと

Nuxtに置いて、グーグルアドセンスの導入でハマったので記録しておきます。
## Nuxtでグーグルアドセンスの導入でハマったこと
結論としては、[Nuxtのグーグルアドセンスモジュール](https://github.com/nuxt-community/google-adsense-module)を使えば問題ありません。

これを使わないと、画面遷移やDOMの書き換えがおきた時に、アドセンスが正しく読み込まれないという不具合がおきてしまします。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
はじめてのC++【2日目】

#2日目
１日目の方の記事に編集リクエストや間違いを指摘してくれた方本当にありがとうございました。
嬉しくなりモチベーションがバク上がりしました。
##03-08　乱数っぽいなにか
ゲームを制作するときに乱数をよく使うらしい
乱数を生成するときは"rand関数"　rand()は、0～RAND_MAXの間の値を返値とします。
「サイコロを２回投げて、その和を求めるプログラム」
※rand関数で乱数を生成し6で割る。その値は0~5なので+1する。
<img width="460" alt="スクリーンショット 2019-02-26 22.17.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/298612/e33c26e9-dd9d-46f9-b455-1e5277998e13.png">
実行結果
<img width="268" alt="スクリーンショット 2019-02-26 22.17.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/298612/961fde33-037b-1756-2056-bc0558009106.png">

※rand関数で乱数を生成しRAND_MAX+１で割ると0以上1未満の数字が出てくる。その解に*6をしてint型にすると0~5の数字になる。そこから最後に1を足す。
<img width="640" alt="スクリーンショット 2019-02-26 22.27.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/298612/58e49622-ba1c-d8ea-d69b-9add40e1fbb7.png">
実行結果
<img width="279" alt="スクリーンショット 2019-02-26 22.27.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/298612/0f334758-a2e2-e9e7-585b-b5f519e6fc40.png">
RAND_MAXとは？
RAND_MAXとは、あらかじめ定義されている定数であり、具体的には215-1=32767です。

後者のほうが前者よりも均等に現れると書いているがなぜだろう？
高度な割り算をすることによって確率が変わるのか？
また、後者のほうが計算量が多いので一長一短とのこと。

RAND_MAXはintの最大値になるので、(double)(RAND_MAX + 1)にするとオーバーフローする

※何回実行しても同じ数字になる件について
<img width="386" alt="スクリーンショット 2019-02-26 22.43.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/298612/0a07b459-7199-6853-b982-8bdd7c9d2c5b.png">
コンピュータは無茶苦茶な値を取り扱うことが苦手なので、乱数として不自然な挙動をする。
この乱数を擬似乱数という。
乱数を作るときはある初期値から乱数を生成する。その初期値を「乱数種」という。
乱数種を設定する関数は"srand()"
そして、時間と乱数種を組み合わせることでより正確な乱数を生成することができる。
<img width="477" alt="スクリーンショット 2019-02-26 22.57.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/298612/bde1c32e-b630-47b0-1d25-8ce7e51a829f.png">
疑似乱数はMT(Mersenne Twister)法が一番質が高いらしい。
##03-09
数学でよく使うライブラリの紹介

int abs　整数限定の絶対値
double fabs　少数限定の絶対値

double floor　小数第一位切り捨て 
double celi　 小数第一位切り上げ

double fmod(x,y) x/yの余り
double modf(x, *p) xを整数部と小数部に分離  小数部は*pに格納
ややこしいやつを書いた。

数値誤差によるバグにも注意

「型について」
基本double型でもいいが、処理速度が気になるときはfloatを使うときもある。
3dグラフィックを扱う場合など
将来的に3Dゲームを制作したいので使用用途に応じて型を書き分けられるように実践をたくさん積まないと！
##03-10　オーバーロード
同じ関数名でも引数が違うと使うことができる。これを”オーバーロード”という。

良い例

```cpp
int    A(int x)
double A(double x)
```

悪い例

```cpp
int    Func(){return 0;}
double Func(){return 1;}
```

```cpp
int    Func(){return 0;}
int    Func(){return 1;}
```

##03-11　もっとロジカルに
bool型はtrue, falseしかとれない
０と1を使うよりtrue, falseを使うほうがわかりやすい

##終わりに
今日はクラスまでやるつもりでしたができませんでした。
明日からはポインタ天国なので楽しみにして寝ます。
明日こそはクラスまでやる！
おやすみなさいzZZ
Python の Iterator と Generator

## まとめ

* Iterator とは、`__iter__` と `__next__` を持つオブジェクト。for などで繰り返しに使える。
* Generator function とは、yield を含む関数。Generator を返す。
* Generator とは、Iterator の一種。send() や throw() など拡張機能もある。

## [Iterator](https://docs.python.org/3.6/library/stdtypes.html#typeiter)

まずイテレータの復習。`__iter__` と `__next__` を持つオブジェクトをイテレータと呼び、for などで繰り返しに使える。

```python
# 1 から max までの数を数えるカウンターをイテレータとして作った
class Counter():

    def __init__(self, max):
        self.count = 0
        self.max = max
    
    def __iter__(self):
        return self

    def __next__(self):
        self.count += 1
        if self.count <= self.max:
            return self.count
        raise StopIteration()

# 1 から 3 まで for で数える
for i in Counter(3):
    print(i)

# next(iterator, default) はイテレータの次の値を返す。無ければデフォルトを返す。
counter = Counter(3)
print(next(counter, '終わり'))
print(next(counter, '終わり'))
print(next(counter, '終わり'))
print(next(counter, '終わり'))
```

実行結果

```
1
2
3
1
2
3
終わり
```

## [Generator](https://docs.python.org/3.6/reference/expressions.html#generator-iterator-methods)

Yield 文を使うと、クラス構文を使わずにイテレータを作る事が出来る。yield を含む関数をジェネレータ関数と呼ぶ。ジェネレータ関数は return を含まないのにジェネレータと呼ぶオブジェクトを返す。ジェネレータはイテレータとして使える。yield 文でイテレータとしての結果を返す。

```python
# 1 から max までの数を数えるカウンターをジェネレータで作った
def counter_simple(max=None):
    count = 0
    while count < max:
        count += 1
        next = yield count

for i in counter_simple(3):
    print(i)
```

実行結果

```
1
2
3
```

ジェネレータにはイテレータに加えていろいろ機能がある。

* `generator.send()` で値を渡す。渡した値は yield の戻り値となる。
* `generator.throw()` で例外を投げられる。
* `generator.close()` で中断出来る。

```python
# 1 から max までの数を数えるカウンター高級版
def counter_rich(max=None):
    count = 0
    try:
        while count < max:
            count += 1
            try:
                next = yield count
                if next != None:
                    count = next
            except Exception as e:
                print(f'例外「{e}」がやってきた!')
    finally:
        print('終了します')

print('100 まで数えるカウンター')
counter = counter_rich(100)
print(next(counter))
print(next(counter))
print('counter に 5 を送ってスキップ')
print(counter.send(5))
print(next(counter))
counter.throw(Exception('ちょっと待って'))
print(next(counter))
print(next(counter))
print('100 に行く前に中断')
counter.close()
print(next(counter))
```

実行結果

```
100 まで数えるカウンター
1
2
counter に 5 を送ってスキップ
6
7
例外「ちょっと待って」がやってきた!
9
10
100 に行く前に中断
終了します
Traceback (most recent call last):
  File "generator.py", line 38, in <module>
    print(next(counter))
StopIteration
```

asyncio に続きます。
【JavaScript】連想配列の値(value)で並び替え

<h2>連想配列の値で並び替えをしてみた。</h2>
<p>以下のような連想配列を値が大きい順にソートしたかったので、挑戦してみました。</p>
```JavaScript
let obj = {
  "Apple" : 10,
  "Orange" : 5,
  "Banana" : 12,
  "Mango" : 2,
  "Melon" : 7,
}
```

<h3>キーと値にそれぞれキーをつけた連想配列を格納した配列の作成</h3>
<p></p>
```JavaScript
let arr = let arr = Object.keys(obj).map((e)=>({ key: e, value: obj[e] }));
console.log(arr);

// [ { key: 'Apple', value: 10 },
//   { key: 'Orange', value: 5 },
//   { key: 'Banana', value: 12 },
//   { key: 'Mango', value: 2 },
//   { key: 'Melon', value: 7 } ]
```
<p>※mapに訂正しました。</p>

<h3>キー[value]でソート</h3>
<p>上記で作成した連想配列を格納した配列をキー[value]でソートします。</p>
```JavaScript
arr.sort(function(a,b){
  if(a.value < b.value) return 1;
  if(a.value > b.value) return -1;
  return 0;
});
console.log(arr);

// [ { key: 'Banana', value: 12 },
//   { key: 'Apple', value: 10 },
//   { key: 'Melon', value: 7 },
//   { key: 'Orange', value: 5 },
//   { key: 'Mango', value: 2 } ]
```

<p>いぇーい(^^)<br>すごく回りくどいけどソートすることができました！</p>
生年月日から年齢を取得 for Oracle

```SQL:GET_AGE
CREATE OR REPLACE FUNCTION GET_AGE
    (
    IN_BIRTHDAY         IN DATE                  -- 生年月日
  , IN_DESIGNATED_DATE  IN DATE DEFAULT SYSDATE  -- 指定日
    )
    RETURN NUMBER -- 年齢(年のみ)
--
-- 生年月日から本日までの満年齢の取得。
--
IS
BEGIN
    RETURN(TRUNC(MONTHS_BETWEEN(IN_DESIGNATED_DATE, IN_BIRTHDAY) / 12)) ;
END GET_AGE ;
/
SHOW ERROR FUNCTION GET_AGE
--  PUBLIC SYNONYM に
-- ↓実行権をPUBLICにし、インスタンスの全スキーマから実行可能に
-- https://docs.oracle.com/cd/E57425_01/121/SQLRF/statements_9014.htm#i2155015  SQL language reference
GRANT EXECUTE ON GET_AGE TO PUBLIC ;
--
-- ↓PUBLIC SYNONYM に
-- http://docs.oracle.com/cd/E57425_01/121/SQLRF/statements_7001.htm#CJAJCDDF  SQL language reference
CREATE OR REPLACE PUBLIC SYNONYM GET_AGE FOR GET_AGE ;
```

```SQL:
-- 使用例
SELECT GET_AGE(TO_DATE('1980/02/28', 'YYYY/MM/DD')) AS GET_AGE FROM DUAL ;
SELECT GET_AGE(TO_DATE('1980/02/28', 'YYYY/MM/DD'), TO_DATE('2020/02/29', 'YYYY/MM/DD')) AS GET_AGE FROM DUAL ;
SELECT GET_AGE(TO_DATE('1980/02/29', 'YYYY/MM/DD'), TO_DATE('2020/02/29', 'YYYY/MM/DD')) AS GET_AGE FROM DUAL ;
SELECT GET_AGE(TO_DATE('1980/03/01', 'YYYY/MM/DD'), TO_DATE('2020/02/29', 'YYYY/MM/DD')) AS GET_AGE FROM DUAL ;
SELECT GET_AGE(TO_DATE('1980/02/29', 'YYYY/MM/DD'), TO_DATE('2020/03/01', 'YYYY/MM/DD')) AS GET_AGE FROM DUAL ;
SELECT GET_AGE(TO_DATE('1980/02/29', 'YYYY/MM/DD'), TO_DATE('2021/02/28', 'YYYY/MM/DD')) AS GET_AGE FROM DUAL ;
SELECT GET_AGE(TO_DATE('1980/02/29', 'YYYY/MM/DD'), TO_DATE('2021/03/01', 'YYYY/MM/DD')) AS GET_AGE FROM DUAL ;
```
DockerfileのADDはurlをコピー元に指定すると自動解凍してくれない

> 03/26追記

そもそもとしてADD自体使うのがあまりオススメできない。
アクセス先のコンテンツが冪等なら
`wget gzip tar`で十分というのが強い人の考え方っぽいです。
[better docker image - Speaker Deck](https://speakerdeck.com/orisano/better-docker-image?slide=15)

> `RUN wget`にすることでcacheが効く

なるほど。



# はじめに

ADDでremote urlを指定してtgz落として、そのまま展開してくれるよネーなんて思ってたらしてくれなかったので泣きながら`RUN`を書いた。

最終的なものはこれ


```Dockerfile:Dockerfile
RUN mkdir example \
    && curl -sL http://example.com/release/1.0/example-bin-1.0.tgz \
    | tar zx -C example  --strip-components 1
```
rmとかは用いていないけどあんまり美しくない。。。

# ADD | Dockerfile
Dockerfileを学びながら書いていたら`ADD`という物を知った
> The ADD instruction copies new files, directories or remote file URLs from <src> and adds them to the filesystem of the image at the path <dest>.
> [ADD | Docker Documentation](https://docs.docker.com/engine/reference/builder/#add)

簡単にいうと`指定したファイルやディレクトリをコンテナ内に追加する`インストラクション。
同じようなものに`COPY`というものがる。

###`ADD`と`COPY`の違い
ざっくりと。
より深く知りたかったらこちらとか
[[docker] COPY とADD の違いを試してみた - Qiita](https://qiita.com/hihihiroro/items/0956326d6731bc927166)

#### COPY

```Dockerfile:Dockerfile
COPY
```

- 指定したファイルやフォルダをコピーする
- urlはコピー元に指定できないヨ！
- 圧縮されていてもそのまま！

#### ADD

```Dockerfile:Dockerfile
ADD
```

- 指定したファイルやフォルダをコピーする
- remoteのファイル(url)もコピー元に指定できる！
- コピー元のファイルが圧縮されていたらコンテナ内に自動解凍して配置！

ざっくりとした違いはこんなかんじ。
`ADD`でremoteの圧縮されたファイルを指定したらそのまま解凍してコンテナ内に設置できそう！
それができれば`wget && tar && rm`とかナンセンスな`RUN`をしなくてすみそう！

-> できませんでした。


エラー発生してTwitterで嘆いてると友人から公式リファレンスを投げつけられる。

>  Resources from remote URLs are not decompressed.
> 要約: remoteのurlを指定した場合自動解凍はされません。 

> [Dockerfile reference | Docker Documentation](https://docs.docker.com/v17.09/engine/reference/builder/#add)

かなしみ

# 最終的な形

```Dockerfile
RUN curl -sL http://example.com/release/1.0/example-bin-1.0.tgz \
	| tar zx -C ./
```

```shell
# la
example-bin-1.0/

# tree example-bin-1.0
example-bin-1.0
├── bin
│   ├── example
│   ├── sample
│   └── answer
・
・
```
curlしたものをtarにパイプで渡すことでちょっとはマシなDockerfileになった。
ただこれだと`example-bin-1.0`というフォルダができてダサいので、

```Dockerfile
RUN mkdir example \
    && curl -sL http://example.com/release/1.0/example-bin-1.0.tgz \
    | tar zx -C example  --strip-components 1
```

tarのオプションでケアしてあげる。
これで`mv example-bin-1.0 example`したかのような状態。

```shell
# la
example/

# tree example
example
├── bin
│   ├── example
│   ├── sample
│   └── answer
・
・
```
/tmpとかに落として,解凍して,リネームして,/tmpに保存したヤツ削除……という1連の動作を&&で繋ぐよりはスマートだけど、煮え切らないですね。



# 余談
remoteの圧縮ファイルを`ADD`したら展開**されてしまう**バージョンがあったらしくて、
リファレンスと挙動が違うとissueが立ってた。
[Behaviour of ADD for remote tar balls changed with 17.06 · Issue #33849 · moby/moby](https://github.com/moby/moby/issues/33849)
<img width="890" alt="Screenshot_2019-02-26 23.30.03_ryrodE.png" src="https://qiita-image-store.s3.amazonaws.com/0/270408/fe95c818-dac8-cb53-21b3-c4cd5242f430.png">

うん。