OmniAICreator/Qiita-1.07M huggingface dataset:
Google の検索結果を「2年以内」にデフォルト指定する

Google で検索すると「ツール」タブで「期間指定なし▼」を開くと「1年以内」が選択できる。

<img width="860" alt="Screen Shot 2020-05-25 at 12.21.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15175/6b8ff8d9-f311-6aa3-9a55-11c35a7fd95e.png">


また、[Chrome ウェブストア - 拡張機能](https://chrome.google.com/webstore/category/extensions?hl=ja&)の [ato-ichinen](https://chrome.google.com/webstore/detail/ato-ichinen/pojaolkbbklmcifckclknpolncdmbaph?hl=ja&) などで「1年以内」を強制することが出来る。

しかし、技術記事は1年以内では情報量が足らないことがあり、「2年以内」や「3年以内」を指定したいことも少なくない。
これを解決するために、 Chrome のデフォルトの検索エンジンの設定にパラメーターを追記することで対応することが出来る。

## デフォルトの検索エンジンの設定
下記の文字列を Chrome のアドレスバーに貼り付けて設定画面に遷移する。
[chrome://settings/searchEngines](chrome://settings/searchEngines)

<img width="667" alt="Screen Shot 2020-05-25 at 12.38.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15175/f3e742c6-b18c-ccc4-601e-f609a75031f1.png">

「Other search engines」の右横にある「Add」ボタンを押下してダイアログを表示する。

<img width="530" alt="Screen Shot 2020-05-25 at 12.24.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15175/12fb83f8-ac65-345a-7ffe-73ffafb26210.png">

#### Search engine
`Google` と指定。デフォルトと重複していても問題ない。

#### Keyword
`google` 等と指定。ユニークである必要があり、デフォルトの `google.com` と重複できない。

#### URL with %s in place of query
デフォルトの文字列に `tbs=qdr:y2&` を追加した以下の文字列を貼り付ける。
`y2` を `y3` にすれば「3年以内」になる。
蛇足だが `qdr:` の上限値は `y2147483647` の模様。

```
{google:baseURL}search?tbs=qdr:y2&q=%s&{google:RLZ}{google:originalQueryForSuggestion}{google:assistedQueryStats}{google:searchFieldtrialParameter}{google:iOSSearchLanguage}{google:searchClient}{google:sourceId}{google:contextualSearchVersion}ie={inputEncoding}
```

##### デフォルト値
省略されていて分からないが macOS でのデフォルト値は以下の通り。

```
{google:baseURL}search?q=%s&{google:RLZ}{google:originalQueryForSuggestion}{google:assistedQueryStats}{google:searchFieldtrialParameter}{google:iOSSearchLanguage}{google:searchClient}{google:sourceId}{google:contextualSearchVersion}ie={inputEncoding}
```

#### デフォルトの検索エンジンの設定
追加した項目の右端にある縦三点リーダーをクリックし、「Make default」を選択してデフォルト指定にする。

## 反映結果
<img width="847" alt="Screen Shot 2020-05-25 at 12.40.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15175/d1b1b81a-12e2-fcac-c3d1-2cd52dad37d7.png">

Chrome のアドレスバーに検索語を指定して検索すると、無事「2年以内」の指定で検索結果が表示される。

##### 問題点
デフォルトではアドレスバーで電卓が利用可能だが、この置き換えを実施すると残念ながら機能しなくなるので、 `calculator 9567+1085` または `電卓 9567+1085` と入力して代替する必要がある。
<img width="275" alt="Screen Shot 2020-05-26 at 10.26.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15175/ebafcacd-7382-4b5c-df4e-c4a217bad5af.png">
【VMware】VMwareToolsとは何か？

# はじめに
vSphereにて仮想マシンを構築した際になにげなく**VMwareTools**を導入すると思います。
しかし、**VMwareTool**について詳しいことを理解できていませんでした。
今回は勉強の意味も込めて記事にアウトプットしたいと思います。

# VMwareToolsとは？

仮想マシンにインストールするツール。
仮想マシンの機能を最適に利用するための仮想化専用のドライバや管理機能を提供するもの。

# VMwareToolsの機能

※全ては網羅できていません。

## ハイパーバイザーとの時刻同期

仮想マシンのゲストOS時刻をESXiに同期

## 仮想化専用ドライバ

仮想ネットワークアダプタに設定可能な準仮想化ドライバなど、仮想マシン用に最適化されたデバイスドライバを提供

WindowsServer(仮想マシン)にてネットワークアダプタを「VMXNET3」に設定している場合
**→「VMwareTools」のインストールが必要**

![1_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/6014b074-b05a-7676-5ed6-5d670f3358f9.jpeg)


## マウス操作の最適化

仮想マシンコンソール画面でのマウス操作の最適化

※WindowsServer(仮想マシン)にVMwareToolsを導入した後の方がマウス操作が軽快です。

## 仮想マシンハートビート

- ハイパーバイザー(ESXi)との間で、ゲストOSの死活監視を実施
- ゲストOSでの障害発生時にvSphere High Availabiliity(HA)と連携し、仮想マシンを自動的に再起動することができる。

## メモリ管理ドライバ

ゲストOS内でメモリ管理を行うためのエージェント(バルーンドライバ)
ゲストOS内のアイドルメモリを解放するなどの機能を提供

**アイドルメモリ**
**→使用していない状態に消費するメモリ使用量**


# まとめ

**VMwareTools導入後に利用できる機能は多い。**

例えば、

- ハイパーバイザーとの時刻同期
- 仮想化専用ドライバ
- マウス操作の最適化
- 仮想マシンハートビート
- メモリ管理ドライバ

他にもあると思いますが、ざっくりとわかる範囲で書きました。

# 参考
[徹底攻略VCP6.5-DCV教科書 VMware vSphere 6.5対応 徹底攻略シリーズ Kindle版](www.amazon.co.jp/dp/B078YL2Y8V)
[初心者向け！VMware Toolsとは？VMware Toolsの概要と機能](https://ramin.hatenablog.com/entry/2019/04/12/003626)
[Splunk]App削除でゴミroleが残ってしまった場合の対処方法

はじめに
---
- 不要になったappを削除したときに**ユーザの新規作成に失敗した**
- appによってはroleの残骸がsplunk内のconfigに残ってしまうケースがある模様
- 以下の例はalert_manager関連のappのroleが残ってWARNが出ている
<img width="992" alt="スクリーンショット 2020-05-25 12.33.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/082f9b31-5d98-cac8-ec70-90b1a08dd77c.png">

- 消したappに紐づく不要なroleを消すことで改善できる。以下はそのトラブルシューティング方法です


手順
---

```shell

1. Splunkインストールされたlinux上でfindコマンドで残骸調査

find /home/splunk/etc -type f -name "*" |xargs grep "alert_manager*"

(出力結果、抜粋)
/home/splunk/etc/passwd::admin:$6$62/3GSEUMRSVRBpu$D6BZelGp.wvAHSU6etK7ZRa9JrjrC8arzw1HsgoNyF9/JMmVX8WkJzmC.jfwz.YCKxTv3JYjXSawMCieHXmnq/::Administrator:admin;alert_manager;alert_manager_user:changeme@example.com:::17745

2. paswdファイルに`alert_manager;alert_manager_user`を発見したののでviエディタで削除し保存

3. Splunkのサービス再起動

4. Userの新規作成が可能に！

```
- この場合は、passwd内のUserに削除したalertmanager関連のroleの残骸が残っていたため、新規ユーザ作成に失敗していた模様。


参考記事
---
- [How to troubleshoot unknown role warnings for 'ess_analyst' in Splunkd.log, even after uninstalling the Splunk App for Enterprise Security?
](https://answers.splunk.com/answers/205496/how-to-troubleshoot-unknown-role-warnings-for-ess.html)
- [Why am I getting "WARN AuthorizationManager - Unknown role" errors in splunkd.log after deleting the VMware and Windows Infrastructure apps?
](https://answers.splunk.com/answers/218749/why-am-i-getting-warn-authorizationmanager-unknown.html)
phpMyAdminでテーブル構造を表示させる方法

phpMyAdminのバージョン5.0.1で言語が英語だと構造が表示されるのに、下記のように日本語に変更すると表示されない場合の対処法です。
![202005251134.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/f7bf5a78-1981-83b8-918d-8f4295f53657.png)
こちらの記事を参考にしています。
[解決！phpMyAdmin テーブル構造の内容が表示されない問題](https://hapicode.com/php/phpmyadmin-error.html#phpmyadmin-%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%8C%E5%95%8F%E9%A1%8C%EF%BC%9F)

##作業環境
OS : Windows 10 HOME
phpMyAdmin :  5.0.1
##Xamppのインストール方法
インストール方法については、別記事にて解説しています。
[【環境構築】Windows10にXAMMPをインストール方法](https://qiita.com/neneta0921/items/46b2b974ecc6075acb3c)
##解決方法
###「Util.php」書き換える
Xamppを起動している場合は、停止します。
```C:\xampp\phpMyAdmin\libraries\classes```に移動します。
![202005251126.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/b2d8fa25-a9f9-6db0-0134-c6a7ce63aa40.png)
```Util.php```をエディタで開きます。
![202005251128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/ee7d19a5-2348-a5d9-a36d-8c3657af8498.png)
1617行目の記述```$ret = strftime($date, (int) $timestamp);```を以下のように変更します。

```
$ret = strftime('%Y-%B-%d %H:%M', (int) $timestamp);
```

![202005251127.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/5201c29e-df9f-98f9-4c34-6b03b5fb0338.png)
Xamppを再起動して、phpMyAdminを開くと下記のように表示されました。
![202005251125.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643170/19e09699-34ee-46b4-988b-ebb0bd6d3887.png)

###表示されない原因
下記によると、表示されない原因は以下のとおりです。

>strftime()の第一引数に、$dateの中身として%Y 年 2 月 %d 日 %H:%Mが渡されている。これ自体は仕様通りで問題が無いように見える。

>しかし、strftimeを処理する際に、依存するWindowsのCライブラリでは、**文字列を一度Shift-JISに変換している**。つまり、UTF-8→SJIS→UTF-8の変換が行われている。ここで、漢字の「月」の字が文字化けを起こし、不正なマルチバイト文字と認識され、strftime()がfalseを吐いている、というのが真相である。

引用元：[phpMyAdmin5.0.1の「状態」タブがFatal Errorで表示されないバグ](https://crieit.net/posts/phpMyAdmin5-0-1-Fatal-Error)


以上、phpMyAdminでテーブル構造を表示させる方法でした。
[メモ] kaggleのEDA入門本


メモまとめ。実際のプロットの仕方などは本書を参照
[kaggleで上位に入るための探索的データ解析入門](https://www.amazon.co.jp/gp/product/B086H28DBL/ref=dbs_a_def_rwt_bibl_vppi_i0)


## EDAの概要
＜目的＞
特徴や傾向の理解だけでなく、モデル学習に適した”良いデータを作ること”

＜問い＞
・解釈を誤っていないかどうか？
・他に良い特徴はないか？
・学習に必要なデータを選別できてるか？

＜良いデータとは＞
・不要な情報が取り除かれていること
・目的変数と関連があること
・データに優先度が付けられていること

＜EDAプロセス＞（必ずしも順番通りではない）
1. `データセット理解`
2. `データクリーニング`
3. `分析の切り口検討`
4. `データ分析`
5. `データ選択`


--------
### ① データセット理解
▼目的
・目的変数、またデータ同士の関連を把握する
・分析すべきところのアタリをつける

▼内容
・`データの意味の把握`
　e.g. 量的（continuous）データと判明
　　　→　distplot, 相関、外れ値があるかなどの分析検討できる
・`取りうる値の範囲`
　　　→ 外れ値かどうか判断できる
・`値の意味`


--------
### ② データクリーニング
▼目的
・誤った解釈、学習を防ぐため

▼内容
・`欠損値`
・`外れ値`
・`表記揺れ`：e.g. 1000円, 1,000、一千円
・`重複データ`
・`データ型変換`：e.g. 男女→0/1
・`無意味データ（無規則）の消去`

--------
### ③ 分析の切り口検討
▼目的
・隠された特徴、新たな仮説を得るため

▼内容
・`要約統計量`：平均、中央値、標準偏差など
・`スライシング`：e.g. 男女→20代男性→20代男性高所得層
・`合成` e.g.
　　　- 顧客単価（＝売上/顧客数）
　　　- 営業利益（＝売上総利益-販管費）

・`尺度変換`：e.g. 28歳、32歳→20代、30代
・`無名数化`：e.g. テストの点数を偏差値に変換

--------
### ④ データ分析
▼内容
・`単変数の分析`：ヒストグラム(distplot)
・`変数間の分析`：棒グラフ、箱ひげ図(bar/cat/box/violin plot)
・`時系列の分析`：折れ線グラフ（lineplot）
・`相関分析`：散布図、ヒートマップ（scatter/re plot, heatmap）

（sns.FacetGridが便利そう）


## 参考
・[kaggleで上位に入るための探索的データ解析入門](https://www.amazon.co.jp/gp/product/B086H28DBL/ref=dbs_a_def_rwt_bibl_vppi_i0)
・[From data to Viz](https://www.data-to-viz.com/)
・[matplotlib cheatsheets](https://github.com/matplotlib/cheatsheets)
・[sweetviz](https://github.com/fbdesignpro/sweetviz)
・[datavizcatalogue](https://datavizcatalogue.com/index.html)
・[Top 50 matplotlib Visualizations – The Master Plots (with full python code)](https://www.machinelearningplus.com/plots/top-50-matplotlib-visualizations-the-master-plots-python/)

・[Jupyter/Pythonでデータ分析する人にお勧めしたい！便利なライブラリー「PixieDust」をザクッと紹介します](https://qiita.com/ishida330/items/53f1b0df2247fab5c6dd)
・[Comprehensive data exploration with Python (kaggleで最もvoteが多いnotebookの日本語解説)](https://qiita.com/hkthirano/items/12e046b3e02961d8460d)
・[Titanic Data Science Solutions（kaggleで2番目にvoteが多いnotebookの日本語解説）](https://qiita.com/nanairoGlasses/items/bf83ed4d01eee82d0844)
Marp でスライドを書いていて URL に認識されてしまった文字からハイパーリンクを消したい

Marp を使えばスライドを Markdown で書くことが出来ます。
とっても便利！！過去にブログで何回か紹介したことがあります。

- [Marp を使ってスライドを作ってみる](https://blog.okazuki.jp/entry/2019/07/24/182744)
- [Marp で上詰めにする方法](https://blog.okazuki.jp/entry/2019/07/29/153315)

Marp は便利で URL を書くと自動でハイパーリンクにしてくれます。
でも、たまにいらぬおせっかいの時があります。

例えば ASP.NET Core とか書くと ASP.NET のところがハイパーリンクになってしまいます。以下のように。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/af203099-e1b3-ed7a-f9cc-f30a313a0159.png)

個人的にこれはいただけなかったので、以下のように対処しました。（もっといい対処方法があれば知りたい。）

```markdown
---
marp: true
---

ASP&period;NET  Core
```

`&period;` とかあるのはじめて知った。これで以下のようになって目的達成です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/5e76abe3-aa31-410c-fd2c-1fe95360df66.png)
ABC168

AtCorder Beginner Contest 168 に参加しました。
ABCの3問ACでした。
Python3を使用しています。
# A問題
一番右の数字を取り出して場合分けします。

```python
N = input()
if N[-1] == '3':
    print('bon')
elif N[-1] == '0' or N[-1] == '1' or N[-1] == '6' or N[-1] == '8':
    print('pon')
else:
    print('hon') 
```

# B問題
文字列の長さで場合分けして、短い場合はそのまま、長い場合は省略して出力します。

```python
K = int(input())
S = input()
if len(S) <= K:
    print(S)
else:
    print(S[:K] + '...')
```

# C問題
長針と短針の分速を求め、H時M分のときの角度(頂上からの差)を求めます。
これにより二辺とその間の角が求められるので余弦定理により、もう一辺の長さを求めます。

```python
import math
A, B, H, M = map(int,input().split())
T = 60 * H + M
a = (360 /60/ 12) * T
b = ((360 / 60) * T ) % 360
k = abs(a - b)
print(a, b, k)
if k > 180:
    kakudo = 360 - k
else:
    kakudo = k
X = A ** 2 + B **2 - 2 * A * B * math.cos(math.radians(kakudo)) # 余弦定理
print(X ** (1/2))
```
CSV取得

#CSV取得(空白行で抜けるバージョン)

```VBA
Sub GetVbaCsv()
  Application.ScreenUpdating = False
  
    Dim buf As String
    Dim A As Variant
    Dim i As Long
    Dim j As Long
    Dim FSO As Object
    
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    Filename = "A.csv"
    
    B = FSO.BuildPath(ThisWorkbook.Path, Filename)
    
    Check = True
    
    Open B For Input As #1
    
        Do Until EOF(1)
        
            i = i + 1
            Line Input #1, buf
            
            '一行丸ごと空白が挟まっていた場合抜ける
            If (buf = "") Then Exit Do
            
            A = Split(buf, ",")
            
            '最初項目が空白だった場合抜ける
            If (A(0) = "") Then Exit Do
            
            For j = 0 To UBound(A)
                
                Cells(i, j + 1) = A(j)
            
            Next j
            
        Loop
        
    Close #1
    
    Set FSO = Nothing

    Application.ScreenUpdating = True
    
End Sub
```
【Rails】DateTimeで日付と時間を比較をする際の注意点

経緯を書いているとポエムになってしまったので、結論を先に書いておきます。

**環境**
Rails  5.2.4.2
Ruby  2.6.6

## 結論

- DateTimeで日付を指定すると、インスタンスはDateクラスになる。
- Dateクラスはタイムゾーンの情報を持っていないため、+0000になる。
- DateクラスはDateTime/Timeクラスになった時点でタイムゾーンを持つ。
- DateクラスとDateTime/Timeクラス（Railsだと`ActiveSupport::TimeWithZone`クラス）を比較するときはDateクラスをDateTimeクラスへ変換する必要がある。


## ポエム

ことの起こりは深夜0時も回った頃。RSpecを走らせたところ、実装と関係のないところが落ちる。

調べてみたところ、どうやろ本当はreturnしないといけないところがreturnしていないようです。
してほしい挙動としては、「最後にツイートした日時が昨日より最近のときにreturnする」というもの。

```rb
    return if last_tweet.tweeted_at > DateTime.yesterday
```

というわけで、調べてみました。

## デバッグ

```pry
[2] pry(#<RegisteredTag>)> DateTime.yesterday
=> Thu, 21 May 2020
```

うんうん、合ってる。

```pry
[3] pry(#<RegisteredTag>)> DateTime.yesterday.to_time
=> 2020-05-21 00:00:00 +0900
```

よかろう。


```pry
[4] pry(#<RegisteredTag>)> last_tweet.tweeted_at.to_time
=> 2020-05-21 00:30:02 +0900
```

そうだよね、では比較してみよう。

```pry
[6] pry(#<RegisteredTag>)> last_tweet.tweeted_at > DateTime.yesterday.to_time
=> true
```

比較したらそうなるはずなんだ。では、元のコードに戻してみよう。

```pry
[5] pry(#<RegisteredTag>)> last_tweet.tweeted_at > DateTime.yesterday
=> false
```

ファファファ？？？？

ということで、改めて確認してみます。

## 日付の比較

```pry
[33] pry(main)> DateTime.yesterday
=> Thu, 21 May 2020
[34] pry(main)> after_9
=> Thu, 21 May 2020 09:21:38 +0900
[35] pry(main)> DateTime.yesterday < after_9
=> true
[37] pry(main)> before_9
=> Thu, 21 May 2020 08:31:48 +0900
[38] pry(main)> DateTime.yesterday < before_9
=> false
```

8時台 < DateTime.yesterday < 9時台
ということで、`DateTime.yesterday`にはタイムゾーンが適用されていないようです。


### Date.yesterdayでもやってみた

```pry
[22] pry(main)> Date.yesterday
=> Thu, 21 May 2020
[23] pry(main)> Date.yesterday < before_9
=> false
[24] pry(main)> Date.yesterday < after_9
=> true
```

DateTimeと同じ挙動をします。

### クラスを見てみる

```pry
[31] pry(main)> Date.yesterday.class
=> Date
[32] pry(main)> DateTime.yesterday.class
=> Date
```

あ、DateTimeで作ってもインスタンスのクラスはDateになるんですね。
つまり、`Date.yesterday`と`DateTime.yesterday`は同じもののようです。
postgresql テーブルのフィールドを編集する

__テーブルにカラム追加__
```ALTER TABLE テーブル名 ADD COLUMN カラム名 データ型;```

__テーブルのカラムを削除__
```ALTER TABLE テーブル名 DROP COLUMN カラム名;```

初めてQiitaに投稿してみてMarkdown記法がわからないのでちょとずつ頑張っていこうと思う。
<img width="763" alt="スクリーンショット 2020-05-30 15.06.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294711/c264ac31-d281-319c-66e7-f3069b7c737e.png">

出典：https://thinkit.co.jp/cert/marugoto/2/1/19/2table.htm
【Golang】構造体

#【Golang】構造体
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

```
package main 
//struct 構造体
//クラスのような感じ

import (
	"fmt"
)

//struct
//型
//キャピタル＝頭文字を大文字にする。小文字だと外部からアクセスできない
type Vertex struct {
	X int
	Y string
	Z int
}

//3 値を書き換える関数は、引数をポインタ型にする
//関数　Xを書き換える
//引数がポインタ型ではないので変わらない
func Changev(v Vertex) {
	v.X = 100000
}

//関数 Yを書き換える
//引数はポインタ型で渡す
func Changev2(v *Vertex) {
	//本当は下記で書くといいが、
	// (*v).X = 1000
	//下記でも、自動で*vにしてくれる
	v.X = 1000000
}

func main() {
	//1
	//宣言
	v := Vertex{X: 1, Y: "A"}
	fmt.Println(v)
	//>>{1 A 0}

	//値にアクセス
	fmt.Println(v.X, v.Y, v.Z)
	//>>1 A 0

	//上書き
	v.X = 2
	fmt.Println(v.X)
	//>>2

	//宣言
	//複合リテラルs
	//順番に値を入れる
	v2 := Vertex{1, "B", 100}
	//Xのみ　他はデフォルトが入る
	v3 := Vertex{X: 1}
	fmt.Println(v2)
	//>>{1 B 100}
	fmt.Println(v3)
	//>>{1  0}


	//アドレスはない
	//宣言　空 デフォルト値が入る
	v4 := Vertex{}
	fmt.Println(v4)
	//>>{0  0}
	fmt.Printf("%T %v\n", v4, v4)
	//>>main.Vertex {0  0}


	//別の書き方 空
	var v5 Vertex
	fmt.Println(v5)
	//>>{0  0}
	fmt.Printf("%T %v\n", v5, v5)
	//>>main.Vertex {0  0}


	//new
	//アドレスが帰ってくる。
	//v4,v5とは意味合いが違う
	v6 := new(Vertex)
	fmt.Println(v6)
	//>>&{0  0}
	fmt.Printf("%T %v\n", v6, v6)
	//>>*main.Vertex &{0  0}

		
	//v6と同じ表現（アドレス）をnewを使わないで表現
	//明示的にアドレスを取得したい場合はこっちを使う場合が多い
	v7:= &Vertex{}
	fmt.Println(v7)
	//&{0  0}
	fmt.Printf("%T %v\n", v7, v7)
	//>>*main.Vertex &{0  0}


    //2
	//空を作る
	//スライスとかマップの場合はmake([]int, 0)の方が多い
	/*
		    s := make([]int, 0)
			s := []int{}
			fmt.Println(s)
	*/
	//goは書き方が複数あって困惑するが、今は書き方が複数あるということが理解できていればOK

	
	//3 構造体は値型
	//応用
	//値を書き換えたい
	v8 := Vertex{3, "B", 1000}
	//値渡しなので、コピーが作られて渡される
	Changev(v8)
	//書き換わらない
	fmt.Println(v8)
	//>>{3 B 1000}

	//書き換えたい場合　アドレス渡しにする
	v9 := &Vertex{4, "C", 122}
	//参照渡し
	Changev2(v9)
	fmt.Println(v9)
	//>>&{1000000 C 122}


}
```
CSVファイルの行頭に行番号を入れる方法

行数が数百行あるCSVファイルの行頭に行番号を入れたかった。
何かいい方法はないかと悩んだ、ExcelでCSVファイルを加工すると思わぬことが起こるのでExcelは使いたくない。
shellでも書くか・・・面倒くさい、と思った時に見つけた方法。

- 環境
    - Windows10 64bit バージョン1909
    - nl (GNU coreutils) 8.31

```bash:CSVファイルの行頭に行番号を入れる方法
$ nl -w1 -s, {元のCSV}.csv > {行番号付きCSV}.csv
```

`nl`コマンドは行番号付きでファイルを表示してくれる。

```bash
$ nl sample.csv
     1  "hoge",2020/05/31,"fuga"
     2  "kuma",2020/05/30,"usagi"
     3  "tako",2020/05/29,"inu"
     4  "ponsuke",2020/05/02,"numa"
```

`-W1`オプションで行番号の表示幅を最小にする。

```bash
# 「0」を指定したら怒られた
$ nl -w0 sample.csv
nl: invalid line number field width: ‘0’: Numerical result out of range

$ nl -w1 sample.csv
1       "hoge",2020/05/31,"fuga"
2       "kuma",2020/05/30,"usagi"
3       "tako",2020/05/29,"inu"
4       "ponsuke",2020/05/02,"numa"
```

`-s,`オプションで行番号の後に「,」を表示してくれる。

```bash
$ nl -w1 -s, sample.csv
1,"hoge",2020/05/31,"fuga"
2,"kuma",2020/05/30,"usagi"
3,"tako",2020/05/29,"inu"
4,"ponsuke",2020/05/02,"numa"
```

### 参考
[ 【 nl 】コマンド――テキストファイルを行番号付きで出力する：Linux基本コマンドTips（98） - ＠IT](https://www.atmarkit.co.jp/ait/articles/1703/30/news024.html)
部分集合のリストに対応する元の集合リストのindexを取り出す。

ある二つのリスト（A, B）を用意する。ここで$B\subset A$である。
部分集合Bに対応するAのindexを取り出したい。

つまり

```math
A = [1\sim 100の整数のリスト]\\
B = [1\sim 100の偶数のリスト]\\

\Longrightarrow index = [1, 3, 5, 7..., 99]
```
このようなindexを取得する。

#実装

```python
A = list(range(1, 101))

B = list(range(2, 102, 2))
```

部分集合Bに対応するAの要素にTrueを返す関数がNumpyにある。

```python
import numpy as np

isin = np.isin(A, B)
print(isin)
#array([False,  True, False,  True, False,  True, False,  True, False...
print(len(isin) == len(A))
#True
```

また、Trueの要素のindexを返す関数もNumpyにあった。

```python
index = list(np.where(isin))[0]
print(index)
#array([ 1,  3,  5,  7,  9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33...
```
実装できた。

#実践

ランダムな数字を与えたAとそこからランダムに要素を取得したBを用意する。

```python

A = random.sample(range(1, 100), k=5)
B = random.sample(A, 3)

print(A)
#[37, 24, 76, 55, 52]
print(B)
#[55, 76, 37]

index = list(np.where(np.isin(A, B)))[0]
print(index)
#array([0, 2, 3])
```
ランダムでも取得できた。

#今後

indexを取得できたが、それはソートされたものであった。つまり、Bの最初の要素は、Aの何番目の要素であるようにBの順番を考慮したindexは取得できていない。for文で一つ一つ確認することはできるが、大きい長さのA、Bの場合だと計算量がとても大きくなってしまう。そのため別な方法を考えなければいけないだろう。
Unityど素人の奮闘記

#Unityでドミノ倒し作ってみた.
今回はUnityの物理エンジンを使ってドミノ倒しを作ってみました.
ただ同じ大きさのドミノを倒しても面白くないと思いn番煎じながら1.5倍の大きさのドミノを倒していくものにしました.
参考：https://estorypost.com/social-network/youtube/domino-can-topple-1-5-times-its-size/
もはやリアルで示されているものをわざわざやる必要もないのですが笑
##Step1 地面をつくる
Createから[3D Object]の[Plane]もしくは[Terrain]を選択します.
今回は自分自身の復習の意味もあってTerrainを選択しました.
<img width="1792" alt="スクリーンショット 2020-05-24 21.12.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547761/f006c254-c78f-cd4b-bf41-939ddc7d939a.png">
Terrainを使う際の注意はTerrainの中央がシーンビューの中央とずれていることです.
一辺が500の正方形なのでtransformでPositionをx=-250,y=0,z=-250にしておきましょう.
##Step2 自然をつくる
AssetStoreからStandardAssetsをインストールしてください.
驚くほど簡単に山や木,湖がつくれてびっくりします.
<img width="1792" alt="スクリーンショット 2020-05-24 21.23.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547761/cee4bbe2-448a-53f3-ced1-7d3a98761264.png">
今回は一応全てインポートしておきましょう.
<img width="1792" alt="スクリーンショット 2020-05-24 21.31.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547761/ff63ceec-f616-862a-c6cb-4ba05a0eca6d.png">
山や木を作ることは非常に簡単でTerrainから[Raise or Lower]を選択して左クリックで山ができます.
山をへこませたい時はシフトキーを押しながら左クリックをすればいいです.
木も同様に木のマークをクリックしインポートしたStandardAssetsの素材をEditから加えてタッチすれば出来ます（適当）
山の表面,地面の表面の素材も同様にもはやドラッグするだけです.
##Step3 ドミノ作成
ドミノの作成で注意することは一つだけです.
それは各辺の長さをr倍した時,体積はr^3倍となることです.そのことにだけ注意すれば問題ないと思います.
あとはAdd ComponentでRigidBodyを追加してあげましょう.
Cubeからドミノを作成した場合,Box Colliderは最初から追加されています.
あとは一番小さなドミノを傾けて...
と言いたいところですがまだ何もコードを書いていないので書きましょう.
すべてのドミノが倒れた時に歓声が起こるコードを書きます.
##Step4 歓声作成
<img width="1792" alt="スクリーンショット 2020-05-24 21.58.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547761/6cc3c19a-8d39-7234-3c7d-2f63438a5ab1.png">
上のようなソースコードでpublic変数としてAudioを追加できるようにしました.
Audioは効果音ラボさんからダウンロードさせていただきました.
効果音ラボ(https://soundeffect-lab.info/)
あとはCreateから[CreateEmpty]を選択し,[Timekeep]と名前を変更しました.
オブジェクトに先ほどのTimekeepスクリプトを追加し,音声も追加しました.
<img width="1792" alt="スクリーンショット 2020-05-25 11.08.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547761/9097942d-999a-6f2c-a2bd-030e94005e46.png">
#完成！
これからも勉強していきます...
【xcodeエラー】Unity-iPhone has conflicting provisioning settings.が出た時はこうして下さい

#今回のエラー
Unityでスマホアプリを作る際にxcodeでビルドを行いました。
ところが下記のようなエラーが出ました。
（私は1度AppStoreにアプリの審査を出しました。１回目は特に何もせずできましたが２回目に下のようなエラーになりました。）
#エラー内容
●出現場所
こちらの写真はエラーが終わったあとなのでエラーコードは表示されていません。
一番下の行にエラーが出ていました。
![xcodeerror2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/c8f9d717-d408-526d-e9f8-407e3dfda48b.png)

●エラーの内容
Unity-iPhone has conflicting provisioning settings.
（その下に英文が何行か書いてあり、code signing identif を "iPhone Developer"にしなさい。みたいな英文が書いてありました。）
#対処方法
よくわからないですが
TARGETS > Build Settings > Signing
の値を下の画像のように変えました。
![XcodeError.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/fb765d86-1185-b7fa-faa2-dac54946c6f2.png)
そうしたらできました。
なぜできるようになったかは分かりませんが、
下の画像の項目を1つかえて、チェックしてと繰り返し行いました。
無駄に時間を費やしてしまったなと思ったので、私と同じことが起こらないようにとQiitaにまとめておきました。

どなたかのお役に立てれば幸いです。
わからないことがあれば
twitterまで連絡ください。
@e_san_desuyo
ggplotで枠線あり目盛り線なしのグラフ作る

この記事ではR version 3.6.1、tidyverseパッケージを使っています。

##コード

```{r}
library(tidyverse) #パッケージの読み込み
head(iris) #データの確認

iris %>% 
  ggplot(aes(x = Sepal.Length, y = Sepal.Width))+ #軸に用いる値の指定
  geom_point()+ #散布図作成
  theme_bw()+ #枠線と目盛り線のあるテーマを設定
  theme(panel.grid = element_blank()) #目盛り線を消去
```
  
##完成品
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519845/185a7974-8266-3639-ac14-38937c15bc69.png)
Email To Case での添付ファイルの扱い

Email To Case - User emails aren't capturing attachmentsという質問と回答です。

Classicでは、添付ファイルはCaseオブジェクトの「Notes and Attachments」（またはファイル）関連リストに配置されません。「メール」関連リストから受信メールに移動し、メールを開いて添付ファイルを表示する必要があります。


Lightning Experienceでは、添付ファイルはケースの[添付ファイル]関連リストに追加されるだけでなく、メールメッセージレコードの[添付ファイル]関連リストにも表示されます。

ただし、があるようです。どうも事前に設定が必要らしい。

Salesforce管理者が[設定]から[ケースの添付ファイル関連リストにメールの添付ファイルを表示]を有効にした場合
メールの添付ファイルがケースの添付ファイル関連リストにも表示されます。
このオプションを選択すると、ファイルがメールから添付された場合に、[添付ファイル]関連リストにメールアイコンが表示されます。ケースの添付ファイル関連リストのリストビューにソース列も表示されます。

https://help.salesforce.com/articleView?id=000321514&type=1&mode=1
webサイトを作るにはまずは「見えない力線」に注目して作ろう

デザインというものは見え方は人によって様々で一概にこれがいいというものは特にありません。
しかし見やすいとか、理解しやすいサイトというのは誰もが同じように感じるものではないでしょうか？
そこで基本的なことですが、改めて意識しておくといいことでもあるのでここに書かせていただきます。
今回は「見えない力線」について紹介したいと思います。
この見えない力線に意識してサイトを作成していくと自ずとユーザにとって見やすい。理解しやすいサイトになるでしょう。

##「見えない力線」とは
要はガイドのことなんですが、サイトに見えないガイドを引き、それに沿っても文字や画像を配置することによって関連付けされた情報はただ単に見栄えがよくなるだけでなく、各要素に対する秩序をもたらし、そのページにきたユーザに情報を素早く理解できるようなサイトを作ることができます。

![名称未設定-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536289/6bd77a9c-ecc9-0a78-efc3-9db47ea7790e.jpeg)


##ダブルチェック以上のチェックをする
ただこの「見えない力線」に気をつけていても色々と修正していくと自分が気づかないうちにずれてしまうことがあります。
結構自分では気づかないところは他の人は気づくものです。私自身も他の人が作成したものはすぐに気づくのですが自分の作成したものを気づくのはなかなか難しくずれていたまま先に進めてしまうこともあります。
最近新しくLPを1人でコーディングして作成したのですが至る所にズレなどがあり自分の甘さに痛感しました。
1人でやり切らずダブルチェックなどは必ずやるべき項目ですね
##まとめ
お洒落なサイトというものは流行などもあっていずれは古臭いデザインとなり廃れてきますが(全てがそうとも言い切れないが)、ユーザが見やすい、理解しやすいサイトというのはずっと愛されるものではないかと思っています。
初めてサイトを作ってみようという人はまずはオシャレなものというより、ユーザが使いやすい見やすいサイトを作ってみてはどうでしょうか？
Macでインポートする際、Gradleビルドが止まってしまう時

# 発生している問題・エラーメッセージ
表題の通りSTSでSpringbootを使用したアプリケーションの作成時にインポートをする際、
ビルド中に固まってしまい、STSが完全に止まってしまった。
エラーメッセージを見てみると

```
org.gradle.tooling.BuildException: Gradle distribution 'https://services.gradle.org/distributions/gradle-5.4.1-bin.zip' を使用してビルド・アクションを実行できませんでした。
```
が出てくる。


#結論
https://stackoverrun.com/ja/q/11329562
<img width="838" alt="スクリーンショット 2020-05-21 16.01.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641577/46d4b908-e8bb-b223-4b73-35ecbdc2f28f.png">

こちらの回答にある、ユーザーディレクトリの隠しフォルダにある.gradle/caches/5.4.1にある
「scripts」および「scripts-remapped」フォルダを移動し、STSを再起動→インポートでビルドが出来た。


#いろいろと試したこと
・Gradleのバージョンが原因だと思い、最新バージョンでビルド。
→STSが固まった。

・Eclipseのメモリが原因？
https://qiita.com/crarrry/items/7601290c11f7a310913b
こちらを参考に、メモリを上げてみた。
→STSが固まった。

・毎回同じところで固まるので、インポートの途中で変にファイルが作成されていることが原因と特定。
https://stackoverrun.com/ja/q/11329562


#原因
インポート中に予期せぬ動作終了が起きてしまい、Gradleビルド中に中途半端なファイルが作成されてしまった。


#最後に
環境構築に時間を取られがちです。
STSよりもAndroid studioでこういったエラーの情報が多かったので、ご参考になればと思います。

### 補足情報（FW/ツールのバージョンなど）

Mac　Catalina バージョン10.15.4
JDK 14.0.1
STS 4.6.1

参考
https://qiita.com/crarrry/items/7601290c11f7a310913b
https://stackoverrun.com/ja/q/11329562

#共に働くWebエンジニアを募集しています!
不動産SHOPナカジツでは自社サービスを作っていく仲間を募集しています。
詳しくはWantedlyからお問い合わせください。
A Style-Based Generator Architecture for Generative Adversarial Networks

https://arxiv.org/pdf/1812.04948.pdf

Tero Karras, Samuli Laine, Timo Aila

StyleGANのぺーパ。とりあえず評価指標に関する部分だけ。

### Perceptual path length

隠れ層の空間の性質が良いことを主張するためにPerceptual path lengthというものを
導入している。

- 隠れ層の性質が良ければ2つの隠れ値$z_1$と$z_2$の間を補間しながら画像を生成した際に画像が連続的に穏やかに変化していくはず。
- 一方隠れ層が折れ曲がっていると補間して生成した画像がドラスティックに何度も変わるはず。
- なので、補間した際の変化の度合いを計測してやれば、それが隠れ層の性質の指標になる。
- $z_1$と$z_2$の間を十分細かく割ってやって、それぞれに対して画像を生成し、画像の差分をすべて足し合わせたものがパス長になる。
- 「画像の差分」をVGG16の埋め込み層での差分として定義する。
- 隠れ層の性質は、すべての端点間に対するパス長の期待値として定義される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412142/45ef1a37-2d7e-c82e-7377-8daa0c12938c.png)

Gは生成関数、slerpは球面線形補間、dはVGGでの距離、εはパスの分割に用いる区分距離。

すべての端点というのは明らかに無理ゲーなので、実際には100000ペアを生成して平均を取っている。区分距離εは10-E4としている。すごく計算が大変そう。

### 線形分離性

これも隠れ層の性質の良さを主張。隠れ層が画像の属性に対して線形分離可能になっていることを示そうとしている。
- 元の画像データセットには属性がラベルとしてついているので、これを使ってクラス識別器を訓練
- ランダムな$z$に対して画像を生成して、クラス識別機のconfidenceが十分高いものを選別
- 線形SVMを、$z$から属性を予測するように訓練。
- $X$をSVMが予測したクラス、$Y$をクラス分類器が識別したクラスとして、条件付きエントロピー$H(Y|X)$を計算
- これを属性ごとに加算したものの指数を取ってスコアとする。$exp(\Sigma_i H(Y_i|X_i))$ 指数を取るのは対数ドメインの値を線形ドメインに戻して比較しやすくするため。
`kubectl get all`でEnvoy Filterが表示されない件

いま会社で[Istio](https://istio.io/)の[Envoy Filter](https://istio.io/docs/reference/config/networking/envoy-filter/)を使っているのですが、チームメンバーから**「Envoy Filterって`kubectl get all`で表示されないんですかね？」**という質問を受けたので、調べてみました。


# 1. 現状調査

```bash
$ kubectl get all
```
確かにEnvoy Filterは表示されません。
<br />


```bash
$ kubectl get EnvoyFilters
NAME                                    AGE
envoyfilter.networking.istio.io/xxxxx   3d16h
```
こちらだと表示されますね。


# 2. 表示されない原因
https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/#categories
こちらのドキュメントを要約すると、おおよそ以下の通りです。

- [Custom Resource](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/)（KubernetesのAPI拡張）に、`categories`という項目がある
- `categories`に指定した値は、`kubectl get <category-name>`の書式で使用可能
- `all`も`categories`の一つ


# 3. 裏付け調査
```bash
$ kubectl get crd
NAME                                CREATED AT
--- 中略 ---
envoyfilters.networking.istio.io    2020-04-07T09:02:18Z
```
念のため確認してみましたが、Envoy FilterはCustom Resourceでした。
<br />


```bash
$ kubectl describe crd envoyfilters.networking.istio.io
--- 中略 ---
Categories:
      istio-io
      networking-istio-io
```
確かに`all`がありませんね。
<br />


```bash
$ kubectl get istio-io
NAME                                    AGE
--- 中略 ---
envoyfilter.networking.istio.io/xxxxx   3d16h
```
`all`はダメでしたが、`Categories`にあった`istio-io`では表示できました。


# 結論
`kubectl get all`の`all`は、全部という意味ではないんですね〜
bash/zshで「入力途中の履歴補完」(not インクリメンタルサーチ)

インクリメンタルサーチは謎のモードに突入するのが面倒なので、
私は「入力途中の履歴補完」を利用する。

こちらを使うと、既に入力済みの内容以降をそのまま履歴補完してくれる。
(謎のモード遷移はない)




設定方法がイマイチまとまっていなかったので、
備忘録代わりに記載する

## bash
```bash:.bashrc
bind '"\C-n": history-search-forward'
bind '"\C-p": history-search-backward'

# ついでに履歴の件数も上げておく
HISTSIZE=100000
```

## zsh
こっちの情報がなかなか出てこず苦労した；

```zsh:.zshrc
autoload history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^p" history-beginning-search-backward-end
bindkey "^n" history-beginning-search-forward-end

# ついでに履歴の件数も上げておく
export SAVEHIST=100000
```

## 参考サイト
https://qiita.com/wankoromaru/items/92a85bd84bb3e3a08c71
https://qiita.com/isao_e_dev/items/8db0be6f2c1aacd30ed9
https://mollifier.hatenablog.com/entry/20090318/1237302243
https://qiita.com/syui/items/c1a1567b2b76051f50c4
AIRBNBのようにGOOGLEMAPをWEBに追加

# 追加背景
今自分で習いながらAIRBNBのような民泊シェアリングエコノミーサイトを作っているので、その中でもGOOGLEMAPの位置表示機能を追加する手順をシェアできればかと思います。今回は部屋の掲載ページに載せるので主にROOM関連のファイルで編集していきます。

# GEM追加

```Gemfile.
gem 'geocoder', '~> 1.4'
```
bundle install

#DB migration
rails g migration AddFieldsToRoom latitude:float longitude: float (掲載した部屋のページに表示したいのでこの場合ROOMのDBに追加)
rails db: migrate

## rooms table
|Column|Type|Options|
|------|----|-------|
|home_type|string|null: false|
|room_type|string|null: false|
|accommodate|integer|null: false|
|bed_room|integer|null: false|
|bath_room|integer|null: false|
|listing_name|string|null: false|
|summary|text|null: false|
|address|text|null: false|
|is_tv|boolean|null: false|
|is_kitchen|boolean|null: false|
|is_aircon|boolean|null: false|
|is_heating|boolean|null: false|
|is_internet|boolean|null: false|
|price|integer|null: false|
|active|boolean|null: false|
|latitude|float|null: false|
|longitude|float|null: false|
|user|references|foreign_key: true|
### Association
- belongs_to: user
- has_many: photos

#Roomモデルファイル編集
```room.rb
  geocoded_by :address
  after_validation :geocode, if: :address_changed?
```
ROOMのDBのADDRESSから位置付けをする。あとはアドレスがアップデートされる度にGEOCODEがVALIDATIONをかけ、位置経緯を自動的に決める。

#Roomビューファイル編集
```rooms/show.html.rb
    <!-- GOOGLE MAP -->
    <div class="row">

      <div id="map" style="width: 100%; height: 400px"></div>

      <script src="https://maps.googleapis.com/maps/api/js"></script>
      <script>
          function initialize() {
            var location = {lat: <%= @room.latitude %>, lng: <%= @room.longitude %>};
            var map = new google.maps.Map(document.getElementById('map'), {
              center: location,
              zoom: 14
            });

            var marker = new google.maps.Marker({
              position: location,
              map: map
            });

            var infoWindow = new google.maps.InfoWindow({
              content: '<div id="content"><%= image_tag @room.cover_photo(:medium) %></div>'
            });
            infoWindow.open(map, marker);
          }

          google.maps.event.addDomListener(window, 'load', initialize);
      </script>

```
最後の一行はGOOGLEMAP APIのマップ生成を行うためのJquery
https://techacademy.jp/magazine/5638#sec2　（DOMについて忘れたかけてるのでもう一度復習）

Markerはマップ上にピンマークされるように指定。
infowindowでは部屋のカバー写真をマップ上に表示させる

これでマップは表示されるはず。（下の図を参照、場所は適当にマレーシアにしてます笑）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634461/7689ad73-35a4-8eea-39dc-473e85ac6329.png)

DBではちゃんと経緯を生成されている！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634461/3c59907a-e643-68ff-ce8d-c16d916cb031.png)

そして。。。表示成功！勉強しながらやっていますが、レベルアップしたような達成感はあります。（ズームアウトすると訳のわからん熱帯雨林みたいなところにある、ちょうど写真には合うけど笑）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634461/fa87aed0-3342-a4f0-a46e-26b4d68ce78c.png)
pyenv installがBUILD FAILEDしたとき

# エラー
pyenv installしようとして以下のエラーが出た。

```shell-session
$ pyenv install 3.8-dev

Downloading openssl-1.0.2k.tar.gz...
-> https://pyenv.github.io/pythons/6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0
Installing openssl-1.0.2k...
Installed openssl-1.0.2k to /Users/xxxx/.pyenv/versions/3.8-dev

python-build: use readline from homebrew
Cloning https://github.com/python/cpython...
Installing Python-3.8-dev...
python-build: use readline from homebrew
ERROR: invalid Python executable: /Users/xxxx/.pyenv/versions/3.8-dev/bin/python3.8

The python-build could not find proper executable of Python after successful build.
Please open an issue for future improvements.
https://github.com/pyenv/pyenv/issues

BUILD FAILED (OS X 10.14.6 using python-build 20180424)

Inspect or clean up the working tree at /var/folders/mt/60ryk_vd0t31nhq0lbs00tfr0000gn/T/python-build.20200521173320.20266
Results logged to /var/folders/mt/60ryk_vd0t31nhq0lbs00tfr0000gn/T/python-build.20200521173320.20266.log

Last 10 log lines:
			install|*) ensurepip="" ;; \
		esac; \
		 ./python.exe -E -m ensurepip \
			$ensurepip --root=/ ; \
	fi
Looking in links: /var/folders/mt/60ryk_vd0t31nhq0lbs00tfr0000gn/T/tmph_359u_1
Collecting setuptools
Collecting pip
Installing collected packages: setuptools, pip
Successfully installed pip-19.2.3 setuptools-41.2.0
```

# 対処

以下のissueにたどり着き、pyenvをupgradeしたら問題なくpyenv installが成功した。
https://github.com/pyenv/pyenv/issues/743

```shell-session
$ brew upgrade pyenv
```

```
$ pyenv install 3.8-dev

python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Cloning https://github.com/python/cpython...
Installing Python-3.8-dev...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.8-dev to /Users/xxxx/.pyenv/versions/3.8-dev
```
【覚書】pythonのstring.Template.substituteでは日本語キーを使えない

# どういうこっちゃ
こういうこと。
Python 3.7.2で確認。

```.py
import string

# ↓これだと ValueError: Invalid placeholder in string が発生する
# template = string.Template('eng_keyは${eng_key}です。日本語キーは${日本語キー}です') 

template = string.Template('eng_keyは${eng_key}です。日本語キーは${ja_key}です')
data = {
    'eng_key': 'eng_hogehoge',
    '日本語キー': 'ja_ほげほげ',
    'ja_key': 'ja_hogehoge'
}

print(template.substitute(data))
# eng_keyはeng_hogehogeです。日本語キーはja_hogehogeです
```

dict内に日本語のキーを持っている場合は注意しましょう。


2020-08-04追記：
キーにハイフンを含んでいる場合も失敗するかもしれません。
詳しく調べてないですが、上記の例で言うと`ja-key`だとValueErrorを送出し、`ja_key`なら大丈夫って感じです
実在する Web ページの bad practice を集めたサイト HTMHell の紹介

フロントエンド初心者の私です。
最近は実際に運用されている Web ページの HTML を読んで勉強することがありますが、本当にこの実装を鵜呑みにして良いのか...？と迷う場面が多々あります。
そんなときに見つけたサイト [HTMHell](https://www.htmhell.dev/) が自分のニーズにハマったので紹介します。

## HTMHell

[HTMHell](https://www.htmhell.dev/)

title の "Markup from Hell" が良い味出してます。

<img width="827" alt="Screen Shot 2020-05-24 at 23.53.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179455/f557967c-51cd-a1aa-a74a-7ce19d0a1722.png">

> A collection of bad practices in HTML, copied from real websites.

とあるように、実在する Web ページから bad practice を抜き出してきて、どこが悪いのか、どう改善すれば良いのかを紹介しているサイトです。

取り上げられているコードを幾つか紹介したいと思います。
※日々更新されているため、最新の情報と異なる場合があります。

### #8 anchor tag used as button

[\#8 anchor tag used as button](https://www.htmhell.dev/8-anchor-tag-used-as-button/)

```html:Bad
<a href="#" onclick="modal.open()">Login</a>
```

モーダルのオープンに `<a>` タグを使用している例です。
実際によく見かけるような気もしますが、 `<a>` タグは本来はナビゲーション用途として使われるべきで、この例のように同一ページ内でのアクションを目的とする場合は `<button>` タグが適しているそうです。

```html:Good
<button type="button" onclick="modal.open()">Login</button>
```

### #9 Cookie Consent from Hell

[\#9 Cookie Consent from Hell](https://www.htmhell.dev/9-cookie-consent-from-hell/)

```html:Bad
<body>
  <header>…</header>
  <main>…</main>
  <footer>…</footer>

  <div class="cookie_consent modal">
    <p>We use cookies…</p>
    <div class="cookie_consent__close">
      <i class="fa fa-times"></i>
    </div>
    <div class="cookie_consent__ok">OK</div>
  </div>
</body>
```

クッキー利用に対して同意を求めるモーダルの実装です。
海外のサイトでは特に画面下部に固定表示されているのをよく見かけますね。

この例では `<body>` の最下部にモーダル部分の実装が書かれているため、キーボードユーザーは Tab キーを連打してこのモーダルにフォーカスを移動させる必要があります。
しかも `<div>` 要素はデフォルトでフォーカスが当たらないのでそもそもモーダルに辿り着けない可能性もあります。
また他にも `<div>` 要素をボタンに使うと [Assistive technology](https://en.wikipedia.org/wiki/Assistive_technology) によるセマンティクスの理解の妨げになったり、 `Enter` や `Space` キーでボタンを押せなかったりなど色々問題があるようです。

これらを改善したコードは以下のようになります。

```html:Good
<body>
  <div class="cookie_consent modal">
    <p>We use cookies…</p>
    <button class="cookie_consent__ok">OK</button>
    <button class="cookie_consent__close">
      <span class="sr-only">Close notification</span>
      <i class="fa fa-times" aria-hidden="true"></i>
    </button>
  </div>

  <header>…</header>
  <main>…</main>
  <footer>…</footer>
</body>
```
## 終わりに

英語なので全て読むのは骨が折れますが、実在する HTML の断片を集めただけあって実践的でよく遭遇するような内容が多く含まれています。
フロントエンド初心者の方は是非一度目を通してみてください！
ローカル環境でserverが起動しない時の対処法 PG::ConnectionBad

#結論
_DBを起動させていないから_

<img width="1440" alt="スクリーンショット 2020-05-25 9.48.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642619/e1f3e5a4-4a9d-2796-46f8-b448631ec946.png">

#解決法
```ruby:terminal
brew services start postgresql    
```

※postgresqlのところはそれぞれ使っているDBを指定

```ruby:terminal
bin/rails s 
```
###開発環境
`Homebrew 2.2.17`
`ruby 2.5.1p57`
`Rails 5.2.4.3`
`psql (PostgreSQL) 12.3`
Unityメモ


# JavaScript
```
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse


    ws.on('message',function(message){
        const obj = JSON.parse(message);

        console.log("command: ", obj.command);
        console.log("level: ", obj.level);
        if( obj.command == 'move'){
          console.log('timeElapsed : '+ obj.timeElapsed)
        }
    });

```

# Unity
```
    https://docs.unity3d.com/ja/2018.4/Manual/JSONSerialization.html
    [Serializable]
    public class MyClass
    {
        public string command;
        public int level;
        public float timeElapsed;
    }
    void Update() {

        MyClass myObject = new MyClass();
            myObject.command = "move";
            myObject.level = 1;
            myObject.timeElapsed = 47.5f;
            string json = JsonUtility.ToJson(myObject);

            byte[] data = System.Text.Encoding.ASCII.GetBytes(json);

            ws.Send(data);
        }
```

# unity > stringからbyte[]への変換 
```
byte[] data = System.Text.Encoding.ASCII.GetBytes(text);
```
irucaをタスクスケジューラで自動更新してみた

#はじめに
新型コロナウイルスのため在宅勤務が基本となりましたが、お互いの状況がわからないとのことで、irucaという在席管理ツールを使うようになりました。

【iruca】
　　https://iruca.co/

ただ、こういったツールは適切に更新されることで正しく運用できます。
逆に言うと更新漏れが起こるとツールの活用が不十分とも言えます。

そのため、更新漏れが起こらないよう機械的に更新できないか検討してみました。

#実施したこと
Windows標準のタスクスケジューラを活用して、ログイン時にirucaのステータスを更新するbatファイルを起動させるものです。

irucaはAPIを提供しているため、外部からの更新が可能です。今回はそれを利用してます。

【irucaのAPIドキュメント】
　https://iruca.co/api

PowerShellでirucaのAPIを呼び出すスクリプトを作成、batファイルでPowerShellを稼働させ、タスクスケジューラでそのbatファイルを稼働させる、といった流れです。

#作成したもの
前述の通り、PowerShellとbatファイルを作成しました。

##APIを呼び出すPowerShell
irucaのステータスを「在席」にするのと、ひとことを「mm/dd 在席中」とするようにputメソッドでirucaの情報を更新するスクリプトにしています。


```powershell:iruca.ps1
<# irucaの固定パラメータ #>
#ルームコード
$room_code = 'irucaのルームコード'

#APIトークン
$api_token = 'ルームに設定されているAPIトークン'

<# 個人別可変パラメータ #>
#更新対象のメンバーID
$member_id = 'メンバーID'

#更新するステータス
$status = '在席'

#更新するメッセージ（現在日付取得→文字列形成）
$month = (Get-Date).Month
$day = (Get-Date).day
$message = "$month/$day 在席中"


<# API設定 #>
#メンバー情報更新APIのURL生成
$uri = "https://iruca.co/api/rooms/$room_code/members/$member_id"

#リクエストヘッダーの生成（あいことば設定ありの場合）
$headers = @{ 'X-Iruca-Token' = $api_token }

#パラメータ設定
$body = [System.Text.Encoding]::UTF8.GetBytes('{"status": "' + $status + '","message": "' + $message + '"}')

#API実行(PUT)
Invoke-RestMethod -Method PUT -Uri $uri -Headers $headers -Body $body -ContentType 'application/json'
```

###PowerShellを採用した理由
わざわざPowerShellで作成しなくても、batファイル単体でもできなくはないです。
ただ、iruca APIではJSON形式でやり取りをする関係から、コマンドプロンプトで実行した場合、JSONが扱える（文字化けしない）ようにするにはjqコマンドをインストールしないといけないようでした。

会社の環境では勝手に追加インストールができないので、jpコマンドを必要としないPowerShellを採用しました。


##タスクスケジューラで起動させるbatファイル
前述のPowerShellをbatファイル内で起動するようにしています。
わざわざbatファイル経由ではなく、PowerShellファイルを単体で起動させた方がシンプルなのですが、PowerShellファイルを自由に起動できないよう制限が設けられているようです。

そのため、batファイル内で一時的に実行ポリシーを変更してPowerShellファイルを起動させてます。

```run.bat
@echo off
REM irucaのステータスを更新するツール
echo irucaを更新しています。

powershell -NoProfile -ExecutionPolicy Unrestricted .\iruca.ps1

echo 更新完了しました
exit
```

##タスクスケジューラの登録
基本的にはこちらを参考にして登録してます。

【タスクスケジューラの設定内容の詳細】
　https://jm1xtk.dip.jp/cnt/109_task/index.php

今回はログオン時にbatファイルを起動させたいので、トリガーを「ログオン時」にしてます。

タスクスケジューラの登録の際、注意しなければいけないポイントとしては、batファイル内で稼働させるpowershellが相対パスで指定されてるため、作業フォルダの指定が必要になります。

【タスクスケジューラに登録したバッチがうまく実行できない時に確認すること】
　http://sogohiroaki.sblo.jp/article/178281845.html

#まとめ
毎日のルーチン作業であるからこそ、漏れやゆるみが出てしまい、ツールの形骸化が生まれてしまいます。
また、同じことであるならば日々それに費やす時間がもったいないものです。

ささいなことでも自動化できれば適切に続けられるので、APIが提供されているものは積極的に活用していければチーム運営が良くなると思います。

#参考リンク
- PowerShell を使用して GET, POST, PUT のリクエストを行う
    - https://poke-dev.hatenablog.com/entry/2018/06/02/114939
- PowerShellのPS1ファイルの作成と実行
    - https://techinfoofmicrosofttech.osscons.jp/index.php?PowerShell%E3%81%AEPS1%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8%E5%AE%9F%E8%A1%8C
-  curl/PowerShellでHTTPアクセスいろいろ
    - https://qiita.com/zaki-lknr/items/8950f6acea20961a8afc
- Powershellを楽に実行してもらうには
    - https://qiita.com/tomoko523/items/df8e384d32a377381ef9   
- タスクスケジューラからのBat起動が失敗する際の対処
    - https://sachinashi.com/windowstask/
Adversarial Latent Autoencoders

https://arxiv.org/pdf/2004.04467.pdf

Stanislav Pidhorskyi Donald A. Adjeroh Gianfranco Doretto
Lane Department of Computer Science and Electrical Engineering

GANは絵が綺麗だけど、絵の制御ができない。AE系は絵の制御はできるけど、絵がボケる、という従来の問題をAEとGANのいいとこ取りでうまくやりました、という話。確かに画期的にきれいな絵がでているように見える。

### 概要
- ALAE - Adversarial Latent Autoencoder を提案
- 単純なMPLをEncoder Decoderに用いるものと、StyleGANのGeneratorを用いるものの2つを提案
- latent codeが disentangle できていることを確認
- 1024ｘ1024できれいな絵が出た。

### イントロ

通常のVAEでは隠れ変数空間を固定した事前確率分布に寄せていた。
一方、GANの研究では入力から十分離れた中間層がよくdisentangleされていることが確認されている。

A) 隠れ空間の分布はデータから学習することでdisentangle できるようにする。
B) 出力分布はadversarialに訓練する。
C) AE互恵性をもつようにする。

Cの意味がわからないけど、x->z->x が成り立つようにするという意味のようだ。


#### 手法
やっていることは意外に簡単で、訓練は基本的にGANで行い、その際に用いたエンコーダとデコーダを用いて画像の再構成などを行う。

図中一番上のの F->w-> G がGANで言うところの生成ネットワーク。右のE->Dの部分がDiscriminator ネットワークに相当する。ポイントは
- 生成ネットワーク、Discriminatorネットワークをそれぞれ2つに分けて、その一部がエンコーダ(E)、デコーダ(G)として使えるようにしていること。
- FとGの間のwとEとDの間がrepresentation に当たるのだが、この2つがおなじになるように最適化すること。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412142/9cf547e9-97ce-043d-cee9-5deb599b5f45.png)

### 評価
- 7.1 の評価では、MNISTを1次元配列にしたものを利用。CNNでなくMLP。
 - long feature -1024 bit, E, G の中間層
 - short feature -50 bit Wの空間
 - dw, sw はわりにどうでもいい感じ。
 - 学習した表現に対して、簡単なクラス識別が簡単に学習できるか、をみている。disentangleできてれば、簡単に識別できるはず、ということだがこれはダウト。というかdisentangleできていれば簡単に識別できるのは本当だが、簡単に識別できるからと言ってdisentangleできているとは限らない。
 - 線形SVM での結果と1NNの結果を比較している。線形SVMはdisentangleできていないと識別できない、ということらしい。disentanglementと線形分離可能は違うはずだが。この2つで性能が大差ないALAEはdisengangleできていると主張。
 
 - xからx'の再構成は今ひとつに見える。これはある意味当たり前で、zのレイヤでの再構成ロスを最小化しているだけでxのレイヤではしていないから。そう考えるとこの再構成は逆にすごい。

- 7.2 StyleALAE をStyleGANと比較。
 - https://arxiv.org/abs/1812.04948 - StyleGANの論文で提案されているPPL Perceptual path lengthで比較
JSONについて超基礎部分を簡単にまとめてみた

# 目的

- LaravelのAPIを学ぶにあたりJSONを扱うため基礎的な部分を簡単にまとめる

## そもそもJSONってなに？

- データフォーマットのことである。
- 「JavaScript Object Notation」の略称らしい。
- プログラミング言語ではない(お恥ずかしながら、筆者は勉強するまでプログラミング言語だと思っていた。)

## 特徴はなに？

- たくさんのプログラミング言語がJSON形式のデータの扱いに対応している。
- 人間も読みやすい
- ほとんどの言語において単純な処理で書き出しや読み込みができる。

## JSONの文法

- 下記の様な文法になっている。
    - 数値が格納されている場合

        ```JSON
        {"変数名": 格納されている数値}
        ```
    - 文字列が格納されている場合

        ```JSON
        {"変数名": "格納されている文字列"}
        ```
    - 複数の文字列を別々の変数に格納する場合

        ```JSON
        {"変数名_1": "格納されている文字列_1", "変数名_2": "格納されている文字列_2"}
        ```
    - 配列に複数の文字列が格納されている場合
    
        ```JSON
        {
          "配列名": [ "文字列_1", "文字列_2", "文字列_3"]
        }
DaprでRubyとJavaを連携させてみる

## はじめに

[マイクロサービス開発を容易にするDaprをJavaで利用してみた](https://qiita.com/koduki/items/bf50cb3aa14b88243ad2)に引き続きDaprです。

[チュートリアル](https://github.com/dapr/samples/tree/master/1.hello-world)のStep6に相当します。
コードは下記を参照
https://github.com/koduki/example-dapr/tree/v01

## 構成概要

チュートリアルではPythonですが、趣味の問題でRubyを使っています。
この構成のポイントはRubyとJavaは直接通信しないどころはRubyはあくまで自分のサイドカーのDaprと話すのであってJavaを起動しているDaprとは直接話さないことです。

![dapr_sample01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54904/9de0ce94-b09b-966e-d76d-8a5d128b7620.png)

テストがローカルなので実は直接話すこともできるのですが、分かりやすくJavaのDaprポートを3500, RubyのDaprポートを3600とします。

## コード

今回は1秒に一度、対象APIにリクエストを投げるだけの超シンプルなコードです。
`javaapp`はJavaアプリのappidです。こちらを使ってDparどうして適切なアプリを自動で発見します。APIが動いているIPとかポート番号の指定は不要です。
Rubyコード内で指定している`http://localhost:#{MY_DAPR_PORT}`はJava側のDaprではなくRuby側のDaprです。なので常にlocalhostですし、ポート番号も今回で言えば3500では無く3600です。

```ruby
require 'net/https'
require "json"

MY_DAPR_PORT=ARGV[0]

n = 0
while true do
    n += 1
    params = {data: {orderId: n}}

    url = "http://localhost:#{MY_DAPR_PORT}/v1.0/invoke/javaapp/method/neworder"
    uri = URI.parse(url)
    http = Net::HTTP.new(uri.host, uri.port)

    headers = { "Content-Type" => "application/json" }
    response = http.post(uri.path, params.to_json, headers)

    sleep 1
end
```

## 実行＆確認

では実行してみましょう。DaprはWebアプリだけでは無くコマンドも問題なくラッピングできるようです。
まず、API側を立ち上げます。

```bash
$ dapr run --app-id javaapp --app-port 8080 --port 3500 ./mvnw quarkus:dev
```

続いて別ターミナルでクライアント側を立ち上げます。

```bash
$ dapr run --app-id rubyapp --port 3600 ruby app.rb 3600
```

Java側の実行結果を見ると以下のようになっています。

```bash
== APP == orderId: 1
== APP == orderId: 2
== APP == orderId: 3
```

ちゃんと毎秒定期実行されてるのが分かりますね。

`dapr list`を実行することで今起動しているDaprの一覧も確認できます。

``` bash
$dapr list
  APP ID   HTTP PORT  GRPC PORT  APP PORT  COMMAND             AGE  CREATED              PID    
  rubyapp  3600       55932      0         ruby app.rb 3600    28m  2020-05-24 21:08.13  44897  
  javaapp  3500       56777      8080      ./mvnw quarkus:dev  3d   2020-05-21 21:21.30  27471  
```

## まとめ

上手くRubyとJavaでDaprを経由して通信ができました。

このアーキテクチャの面白いところはRubyコードもJavaコードもあくまでDaprとしか会話してないのでその間はHTTPなりgRPCなりでセキュリティをさほど気にしなくて良いことです。
通信の暗号化とか認証とかはDapr同士がやれば問題ないのでセキュリティに関する部分を外だしできるのは大きいですね。

分散トレーシングとかTwitter APIやKafkaなど他のコネクタもあるはずなのでそこら辺も試してみたいと思います。
同じマイクロサービス支援ということでKNativeと似たレイヤーかと最初は思ってたのですが、あちらはビルド環境やFaaS, Servelessと言ったインフラ観点よりなのに対し、こちらはかなりアプリより仕組みなのでCNCFにも採択されてますし今後が気になるツールなのは間違い無いですね。
Jitsi-MeetでWEB会議環境を簡単構築

WEB会議システム「Jitsi」のインストール備忘録。

## インストール環境
オンプレのLinuxサーバ（Ubuntu 18.04）

## 手順

- rootへ移行します。

```
$ su -
```

- リポジトリを登録します。

```
# wget https://download.jitsi.org/jitsi-key.gpg.key
# apt-key add jitsi-key.gpg.key
# echo 'deb https://download.jitsi.org stable/' > /etc/apt/sources.list.d/jitsi-stable.list
```

- 必要なソフトウェアをインストールしていきます。

```
# apt update

(1) nginxサーバ
# apt install -y nginx
  ※nginxの代わりにapache httpサーバでも可

(2) OpenJDK-8
# apt install -y openjdk-8-jre-headless

(3) Jitsi-Meet
# apt install -y jitsi-meet
  ※インストール途中で入力が必要です。
     ・ホスト名またはIPアドレス
     ・SSL証明書をどうするか
       ⇒とりあえず環境を作ってみるだけなので「Generate a new self-signed…」を選択します。
```

これで準備完了です。簡単♪

ブラウザからIPアドレスまたはホスト名でアクセス`https://(IP or hostname)`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/bf186ee7-4bb5-349f-d47d-8f83e26f4e50.png)
`GO`ボタン押下でWEB会議開始。使い方も簡単。
画面共有等も可能で、機能的には必要十分。
Rocket.Chatと連携して利用するようにすれば、コミュニケーションツールとしてかなり有用な気がします。
Pythonでソートをする。ついでにアルゴリズムを考えてみる。

#メソッド、組み込み関数でのソート
まずは以下のリストについてソートすることを考えてみる。

```python
data = [5, 3, 2, 4, 1, 6]
```

Pythonでリスト型を昇順または降順にソートするにはsort()とsorted()の二種類が存在する。
- リスト型のメソッドであるsort():そのリスト自体をソート
- 組み込み関数sorted():ソートされたリストを新しく戻り値として返す
##リスト型のメソッドsort()
 もとのリスト自体を書き換える。

```python
data.sort()
print(data)
# [1, 2, 3, 4, 5, 6]
```

 デフォルトでは昇順のソートになっている。降順にソートするためには引数reverseをTrueにする。

```python
data.sort(reverse = True)
print(data)
# [6, 5, 4, 3, 2, 1]
```

注意が必要なことはsort()では戻り値はNoneである。

```python
x = data.sort()
print(x)
# None
```
##組み込み関数sorted()
　引数にソートしたいリストを指定すると、ソートされたリストを新たに生成し戻り値として返す。

```python
new_data1 = sorted(data)
print(new_data1)
# [1, 2, 3, 4, 5, 6]
```

sorted()もsort()と同様にデフォルトでは昇順になっている。降順にソートするためには引数reverseをTrueにする。

```python
new_data2 = sorted(data, reverse = True)
print(new_data2)
# [6, 5, 4, 3, 2, 1]
```

#ソートのアルゴリズム
　3つのソートアルゴリズムについてまとめてみる。
　まとめて見るだけなので、速度、メモリ使用量などは気にしない。
　デフォルトでは昇順、コメントに変更することで降順になる。
##考えるソートアルゴリズム
- バブルソート
- 挿入ソート
- マージソート

###バブルソート
　隣り合う2つの値を比較し、条件に応じて並び替えることを繰り返す。

```python:bubble_sort
for i in range(len(data)):
    for j in range(len(data) - 1):
        if data[j] > data[j+1]: # data[j] < data[j+1]
            data[j], data[j+1] = data[j+1], data[j]
print(data)
# [1, 2, 3, 4, 5, 6]
```

###挿入ソート
　整列してあるデータに対して、対象を適切な位置に入れる(挿入する)。
　今回は2分探索は用いない。

```python:insert_sort
for i in range(1, len(data)):
    j = i - 1
    target = data[i]
    while data[j] > target and j >= 0: # data[j] < target
        data[j + 1] = data[j]
        j -= 1
    data[j + 1] = target
print(data)
# [1, 2, 3, 4, 5, 6]
```

###マージソート
　リストを小さな単位に分け、2つのリストの先頭を比較し、一つにする。

```python:merge_sort
import math

def merge(x,y):
    m = []
    i = 0
    while i < len(x):
        i += 1
        j = 1
        while j < len(x):
            if x[j-1] > x[j]: # x[j-1] < x[j]
                x[j-1] , x[j] = x[j] , x[j-1]
            j += 1
    i = 0
    while i < len(y):
        i += 1
        j = 1
        while j < len(x):
            if x[j-1] > x[j]: # x[j-1] < x[j]
                x[j-1] , x[j] = x[j] , x[j-1]
            j += 1

    while x != [] and y != []:
        if x[0] < y[0]: # x[0] > y[0]
            m.append(x.pop(0))
        else:
            m.append(y.pop(0))
    if x == []:
        m += y
    else:
        m += x
    return m

data=[7,4,2,8,1,5,3,9,6]
n = 0
i = math.log2(len(data))
while n < i+1:
    tmp = []
    k=0
    while k < len(data):
        tmp = tmp
        m=merge(data[k:k+2**n],data[k+2**n:k+2**(n+1)])
        tmp += m
        k += 2**(n+1)
    data.clear()
    data += tmp
    n += n+1

print(data)
# [1, 2, 3, 4, 5, 6]
```

#終わりに
　Qiita初投稿なので至らない点多くあると思いますので、ご指摘をお願いします。
　バブルソートと挿入ソートに関しては比較的すぐにできたが、マージソートについては結構時間がかかった。