OmniAICreator/Qiita-1.07M huggingface dataset:
コマンドプロンプトでのドライブ移動

##**コマンドプロンプトでドライブを移動する**

コマンドプロンプトを起動すると

    C:\User\ユーザ名>

と表示されている。

この状態から cd コマンドを使いDドライブに移動しようとしても移動できない。

    C:\User\ユーザ名>cd d:
    D:

    C:\User\ユーザ名>

では、どうやってDドライブに移動するのか

    C:\User\ユーザ名>d:
    
    D:\>

#####**「 d: 」これだけで移動することができた！**

この方法でD以外のドライブに移動することもできる。
VimとctagsとSolidity

Vim で Solidity を書くときの ctags 設定。
ctags が `*.sol` の Solidity のソースを認識できるようにする。contract と function の定義を正規表現として追加。

```~/.ctags
--langdef=Solidity
--langmap=Solidity:+.sol
--regex-solidity=/^[ \t]*function[ \t]+([^\(\)]+)\([^\(\)]*\)/\1/f,function/i
--regex-solidity=/^[ \t]*contract[ \t]+([a-z0-9]+)/\1/c,contract/i
```

これで ctags　が `*.sol` のファイルを認識してくれるようになる。

```bash
$ ctags CryptoKitties.sol
```

Vim で ctags の定義を表示するための taglist プラグインを使用しているので、新しいフォーマットを追加する。

```vim:~/.vimrc
let tlist_solidity_settings='solidity;c:contract;f:function'
```

vim-test の [Truffleプラグイン](https://github.com/grohiro/vim-test-truffle) もあるよ。
.NET Coreで、ローカル Webサーバーをさくっと立ち上げる

.NET Coreを利用すると、さくっとローカルWebサーバーを起動することができます。

まずは、.NET Coreをダウンロードします。

- [.NET Core 2.1 SDK](https://www.microsoft.com/net/download/windows)

PowerShell（またはコマンドライン）を起動し、次のようにして新規プロジェクトを作成します。

```
dotnet new webApp -o myproject
cd myproject
```

そして、SSLを有効にします。

```
dotnet dev-certs https --trust
```

後は、サーバーを起動しましょう。

```
dotnet run
```

これで、`https://localhost:5001`または、 `http://localhost:5000`でアクセスすることができます。
ジェネリクス(共変、反変)[kotlin備忘録]

共変反変についてのお勉強。備忘録です。
[Kotlin Programming Language(日本語訳)](https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/generics.html) を読んでいたのですが、何度読んでも共変反変がぼやっとしかわからない；；
ということで忘れないように参考にしたサイトと考えたことを残しておきます。

#共変と反変
共変と反変はkotlinではinとout修飾子で表します。inが反変、outが共変です。

[追記]Javaでは<? extends Object>みたいな感じで書かないといけない。?が何の継承かを明記しなければならないのだと思います。

Kotlin Programming Language(日本語訳)では以下のように言い換えています。
>実存的言い換え：コンシューマ（消費者）は in、プロデューサ（生産者）は out ！

これはin(反変)は消費だけする(引数として使用)、out(共変)は提供だけする(戻り値として使用)ということだと理解しました。

そもそも共変と反変とは何か。
例えばAny型とString型があったとして、AnyはStringのスーパータイプという関係があります。
ではList\<Any>とList\<String>にはどんな関係があるか...通常は何もありません。
この状態を不変と言いますが、これに関係を持たせるのが共変と反変です(と理解しました)。
共変だとList\<Any>はList\<String>のスーパータイプで、反変だとList\<String>はList\<Any>のスーパータイプとなります。

詳しい解説ができるほど勉強できていないので、参考にしたサイトを最後に置いておきます。

# お試しコード
とりあえずどんな特性を持つのかをコードを書いて試してみました。
[Try Kotlin](https://try.kotlinlang.org)を使ったのでまだgithubに上げていません。のちに上げます。
[追記]あげました。
https://github.com/raibito/KotlinCodeBowl/blob/master/covariance_contravariance.kt

```kotlin

// 共変 -> プロデューサ   提供(戻り値に使う)だけする、消費(引数として使用)できない
class MyListOut<out T>(value: T) {
    val value: T= value
    	get() = field   //  valはgetだけ持つ(提供だけする)ため、共変
}

// 反変 -> コンシューマ  消費(引数として使用)だけする、提供(戻り値に使う)できない
class MyListIn<in T>{
    fun print(value :T){ // valもvarもget(提供)は持つため、Tは引数としてしか使えない
        println(value)
    }
}


fun main(args: Array<String>) {
    // 共変　out
    val anyList1: MyListOut<Any> = MyListOut<String>("test1")
    val any: Any = anyList1.value // 提供はOK
    println(any)
    
   // 反変  in
    val anyList2: MyListIn<String> = MyListIn<Any>()
    anyList2.print("test2")  // 消費はOK
}

```

基本的に今回わかったことにはコメントをつけています。
うまくまとまってなくて申し訳ないです。

#参考
Kotlin Programming Language(日本語訳)
https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/generics.html

【Java】ジェネリックス型の不変、共変、反変とは何か
http://www.thekingsmuseum.info/entry/2016/02/07/235454
pythonで配列/リストをfor(foreach) したときに何番目か？（indexとかkey的なもの）も習得したい。

javascriptばっか最近かいてて、久しぶりにpython書いたら忘れてたので備忘。

結論としては　次のように記述。

```python
for index, value in enumerate(list):
```

## 前提
pythonでlistをforすると（てかforするって言うのかな？ と語彙のなさはごめんなさい）
jsのforEachみたいな感じで、勝手に中身分だけループしてくれてありがたし。

```python
list = [ "a", "b", "c"]
for value in list:
    print(value)
# 結果
a
b
c
```
ただそういや何番目の値なんだ？ってindexどうやってとる？

## js,PHPだと
js,PHPとかだと以下のように習得するが。。

```javascript
list.forEach(function(value, index){
 //そうですもちろん私の勤め先はES5
});
```
```php5
foreach ($list as $key => $value){
    //なんかの処理
}
```

## pythonはenumerate関数をつかう
```python

list = [ "a", "b", "c"]

for index, value in enumerate(list):
     print(index, value )

# 結果
0 a
1 b
2 c

# len　で配列/リストの要素数を習得する古式ゆかしき方法もあり
for i in range(len(list)):
    print i, list[i]
# ただforeach 好きの私の好みではない。
```


あれ？ わざわざ関数かませるってなんかpythonらしくねーな。とおもったら、
このenumerate関数はイケてるのかもしれない。。

## enumerate関数
開始する値を引数に指定できたりする。


```python
for i, name in enumerate(list, 1):
    print(i, name)
# 1 a
# 2 b
# 3 c
```
zip(),enumerate()とかでいろんなforが回せるように、
あえてforにはindex,valueをとる仕組みがついてないのかな？

##その他
なんか見覚えあるなぁーとわたしには毎度おなじみDictionary.comで調べたら、
enumuerateの語源はnumberと同じとな。
高校のときにnumerous（多数の）がnumberと同じ語源ってを覚えたのを思い出した。
それつまり覚えてないやつ。

>
1. to mention separately as if in counting; name one by one; specify, as in a list:
Let me enumerate the many flaws in your hypothesis.
2. to ascertain the number of; count.

> < Latin ēnumerātus (past participle of ēnumerāre), equivalent to ē- + numer(us) number + -ate


## 参考URL
http://www.gesource.jp/programming/python/code/0022.html
https://note.nkmk.me/python-enumerate-start/
https://python.civic-apps.com/zip-enumerate/
http://www.dictionary.com/browse/enumerate
PowerShellでファイルサイズを降順に出力

## Cドライブが容量パンパン！

VisualStudioやUnity等、開発環境をインストールすると容量がひっ迫するのは誰しも経験あるはずです。SSDで250GBあれば大丈夫と思っていましたが、ついつい不要なファイルもそのままにしてしまうはずです。不要なファイルや容量の大きいファイルを特定して、ディスクリソースの最適な有効活用を行いましょう

## PowerShellでファイル名とサイズの一覧をエクスポート
### PowerShell ISEを起動

Cドライブなどを調べたいなら管理者モードで起動しましょう。

### コードを貼り付け

```powershell

$Directory = "" #検索先ディレクトリ
$Output = "" #csv出力先フォルダ
$GetDate = Get-Date -Format "yyyy年MM月dd日"


Get-ChildItem -Path $Directory -Recurse `
  | Select-Object FullName,Name,Length,LastWriteTime `
  | Sort-Object -Descending Length `
  | Export-Csv -Path "$Output\Output_$GetDate.csv" -NoTypeInformation -Encoding Default
```

ファイルによっては、以下のように「アクセスできないよ！」というようなメッセージを吐きますが気にしない
![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/123580/eac11055-c760-7e38-d44d-f3ab0aa20deb.jpeg)
pandasのDataFrameを散布図グラフ付きExcelファイルで出力する

社内用に、誰でもとりあえず機械学習がお試しできるアプリを作成することになった。
基本的にMSOfficeで仕事する部署なので、学習・予測結果はExcelファイルで出力することとした。
その際、学習用データの実測値と予測値の散布図プロットも入れといてほしいとのこと。
Excelファイルを操作するライブラリをいくつかあたった結果、openpyxlならグラフも扱える模様。
openpyxlを使ってグラフを編集する方法のメモ↓

```python3:test.py
import pandas as pd
import openpyxl

data = {"measured val.": [866,931,926,1338,1490,1576,774,553,618,252],
        "predicted val.":[936,923,526,1384,1165,1630,490,722,741,402]}

df = pd.DataFrame(data)

wb = openpyxl.Workbook()
ws = wb.active
ws.title = "sheet1"

#シートにdataframeのデータを移す
xl_row = 2
xl_col = 1
for col in df.columns:
    ws.cell(row=1, column=xl_col, value=col)    #1行目にカラム名を入力
    xl_row = 2                                  #行カウントを２に戻す
    for row in df.index:
        ws.cell(row=xl_row, column=xl_col, value=df.at[row, col])   #ws.cell()で指定したセルに値を入力できる
        xl_row += 1                                                 #1行進める
    xl_col += 1

#グラフの追加
cht = openpyxl.chart.ScatterChart() #散布図
cht.x_axis.title = df.columns.values[0]    #X軸タイトル
cht.y_axis.title = df.columns.values[1]    #Y軸タイトル
cp = openpyxl.drawing.text.CharacterProperties(sz=1000) #フォントサイズの設定(ここでは10pt)
cht.x_axis.title.tx.rich.p[0].r.rPr = cp #X軸タイトルのフォントサイズ
cht.y_axis.title.tx.rich.p[0].r.rPr = cp #Y軸タイトルのフォントサイズ
xvalues = openpyxl.chart.Reference(ws, min_col=2, min_row=2, max_row=len(df)) #X軸(=実測Y)のデータ範囲指定
yvalues = openpyxl.chart.Reference(ws, min_col=1, min_row=2, max_row=len(df)) #Y軸（=予測Y）のデータ範囲指定
srs = openpyxl.chart.Series(yvalues, xvalues, title_from_data=False) #Chartに系列を追加する
srs.graphicalProperties.line.noFill = True #線を消す
srs.marker.graphicalProperties.solidFill = '0000FF' #マーカーの塗りつぶし
srs.marker.graphicalProperties.line.noFill = True #マーカーの枠線を消す
srs.marker.symbol = 'circle' #マーカーの形
srs.trendline = openpyxl.chart.trendline.Trendline(trendlineType='linear', dispRSqr=True) #近似曲線を設定
cht.series.append(srs) #Chartに系列を追加
cht.legend = None #凡例は無し
ws.add_chart(cht, 'C2') #C2セルにChartを追加

#保存
wb.save('test.xlsx')
```

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/242733/a618d8d4-d8dd-7069-9311-fb8feef6742b.png)

グラフの軸タイトルのフォント設定の仕方でしばらくハマってしまった。上記のコード記述も良くないと思う。。。動くけど。。。
TrelloAPIからタイムスタンプを取得する

## 概要

TrelloAPIからリソース(ボード、カード、リストなど)が作成された日時(タイムスタンプ)を取得する方法について紹介します。

## 結論

Trelloの各リソース(一応Modelというらしい)のidは前半の8bitを16進数->10進数変換するとunixタイムスタンプで取得できます。

- 通常の場合

```js

function getTimeStamp(id) {
  let timeStamp16x = id.slice(0,8);
  let timeStamp = parseInt(timeStamp16x, 16);
  return timeStamp;
}
```

- Moment.jsのmomentオブジェクトで取得する場合

```js

//moment.jsで取得する場合
function getTimeStampMoment(id) {
  let timeStamp16x = id.slice(0,8);
  let timeStamp = parseInt(timeStamp16x, 16);
  let momentTimeStamp = moment.unix(timeStamp);
  return momentTimeStamp;
}
```
AWS初心者がAWS勉強会に参加してみた④

③の続きになります。
AWSストレージサービスとデータベースについて書いていきます。

##1.AWSストレージ

#Amazon EBS
EBSとは「Elastic Block Store」の略であり、
Amazon EC2インスタンスが利用する永続化されたブロックレベルのストレージです。
EBSはアベイラビリティゾーン毎で独立していて、それぞれのアベイラビリティゾーンで異な
るEBSボリュームを作成することができ、任意のEC2インスタンスに接続して利用します。
※アベイラビリティゾーンって何？って方は↓を参照ください
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html

インスタンスとは独立して存在していますので、EBSボリュームを付け替えることも可能です。
EBSのコストは容量とIOPSの値に応じて課金が発生するようになっています。
EBSボリュームは3種類あり「マグネティック(SATA)、汎用SSD、プロビジョンドIOPS(SSD)」から
選択できるようになっており、上記の観点からコストに差が発生します。
またEBSボリュームはアベイラビリティゾーンに自動的にレプリケーションされます。


#Amazon S3
S3とは「Simple Storage Service」の略で、AWSインフラストラクチャー上に形成された
ファイルレベルのオブジェクトストレージであり、1バイト～5TBの範囲のオブジェクト
（画像、動画、ファイル、スナップショットなど）を保存することが可能です。
オブジェクトを保存する箱は「バケット」と呼ばれています。
ウェブサービスインターフェースを備えていて、ウェブのどこからでもバケットにアクセスして、
データの保存や取得が可能です。また、Amazon EC2などのサービスと連携し、
様々なユースケースに対応することが可能です。

S3のコストは実際に使用したストレージ容量で課金が発生します。
S3もアクセス頻度予定に応じて3種類あり、
頻繁にアクセスするデータのための「AmazonS3標準」、
長期間保存するが頻繁にはアクセスしないデータのための「Amazon S3標準-低頻度アクセス」や
長期アーカイブデータ保存用の「Amazon Glacier」があります。

なお、S3バケットはリージョン毎に独立した存在なので、
S3バケット名の重複が発生する可能性があるので、その点注意が必要です。
リージョン内で他の誰かが既に同名のバケットを作成している場合は、
同名でバケットを作成することはできません。

また、バケットに対するアクセス制御の設定ができ、暗号化処理はサーバーサイドと
クライアントサイドで暗号化キーの管理などの対応が異なりますので、そこも要注意。

#Amazon Glacier
上記のAmazon S3サービスでは、アクセス頻度によって3種類あると記載しましたが、
保存対象データの特性、例えば、企業のセキュリティポリシーで、
5年間や無期限で保存してなければならないデータなどは、Amazon S3サービスを利用すると
コストが割高になってしまいます。
そこで、長期バックアップ用途、低頻度アクセスに特化したサービスに、
Amazon Glacierがあります。

Amazon Glacierは、GB単位で0.007USD/1ヶ月という低コストで長期保存ができます。
さらに、Amazon Glacierサービスに保存されたデータはAES-256で暗号化され、
通信もSSL経由で行われます。
ただ、読み込み速度は異常に遅いので、頻繁にアクセスする必要のあるデータには
利用しないほうが良いです。


##2.AWSストレージ

#Amazon RDS
Amazon RDSは「Amazon Relational Database Service」の略であり、AWSが提供するマネー
ジド型のリレーショナルデータベースです。
サイズ可変のマネージド型であるため、データベースの管理タスクはAWSの責任範囲であ
り、利用者はアプリケーション開発に専念出来ます。
例としてAmazon Aurora、Oracle、Microsoft SQL Server,PostgreSQL、
MySQLやMariaDBなどのデータベースエンジンを利用可能です。
またバックエンドのストレージはSSDなので、IOPSの値も大きいです。
前述で、データベースの管理タスクはAWSが行うと記載しましたが、例えば、
データベースソフトウェアへのパッチ適用、データベースとトランザクションログの
バックアップも自動で行われます。
ユーザーが定義したデータ保持期間内において、直近で5分前までの任意の時点に
ロールバックすることも可能です。

また、RDSインスタンスはアベイラビリティゾーン毎で独立しているため、可用性を高めるための
「マルチAZ」構成を構築することによる可用性の強化やデータベースのワークロードを処理
しきれない場合でもリードレプリカを作成して、DBインスタンスの性能をスケールアウトする
ことも可能です。

因みに、Amazon RDSはリレーショナルデータベースサービスですが、
それ以外にも色々なデータベースサービスがあります。

※例
「Amazon DynamoDB」（NoSQLデータベースサービスの）
「Amazon ElastiCache」（MemcachedやRedis準拠の分散メモリキャッシュサービス）


ストレージとDBに関しては以上です。
※時間が出来たらイメージ図追加するかも


⑤に続きます。
linuxで連番のディレクトリを一括で作る方法

画像格納やらキャッシュやらで、0から99までの100個のディレクトリを作りたいってことが稀にある。
コマンドひとつで解決したのでメモ。

## 環境
- bash 4.1.2

## コマンド

0から99まで一括でディレクトリ作る

```
$ mkdir {0..99}
```

確認

```
$ ls
0   18  27  36  45  54  63  72  81  90
1   19  28  37  46  55  64  73  82  91
10  2   29  38  47  56  65  74  83  92
11  20  3   39  48  57  66  75  84  93
12  21  30  4   49  58  67  76  85  94
13  22  31  40  5   59  68  77  86  95
14  23  32  41  50  6   69  78  87  96
15  24  33  42  51  60  7   79  88  97
16  25  34  43  52  61  70  8   89  98
17  26  35  44  53  62  71  80  9   99
```

できてるー！  
  
一桁の場合に左を0で詰めて欲しい場合はこんなんでいける

```
$ mkdir {00..99}
```

確認

```
$ ls
00  10  20  30  40  50  60  70  80  90
01  11  21  31  41  51  61  71  81  91
02  12  22  32  42  52  62  72  82  92
03  13  23  33  43  53  63  73  83  93
04  14  24  34  44  54  64  74  84  94
05  15  25  35  45  55  65  75  85  95
06  16  26  36  46  56  66  76  86  96
07  17  27  37  47  57  67  77  87  97
08  18  28  38  48  58  68  78  88  98
09  19  29  39  49  59  69  79  89  99
```

できてるー！  
  
アルファベット順に作りたいときは、こんなん

```
$ mkdir {a..z}
$ ls
a  c  e  g  i  k  m  o  q  s  u  w  y
b  d  f  h  j  l  n  p  r  t  v  x  z
```

ひとつかしこくなりました。
python の pyserial で 自動でarduino unoに接続する

# arduinoを接続したら、自動で検出して接続させる
接続したらシリアルポートの選択とかしないで、スタートさせたい。
ちなみにarduino nanoとかは応用すればできます。

## 環境
macbook pro 
macOS High sierra
python 3.6.5

#やり方
##とりあえずインストール

```bash:bash
pip install pyserial
```

# コード

```python:*.py
import serial
import serial.tools.list_ports

ser = serial.Serial()
ser.baudrate = 115200
devices = serial.tools.list_ports.comports()
for device in devices:
    if device.usb_description()=='Arduino Uno':
        ser.port=device[0]
ser.open()
while True:
    line = ser.readline().decode('utf8').rstrip()
    print(line)
```
intelMKLを用いたライブラリとNumpyを併用した際に生じるエラーの解消

### 起きた問題の内容
intelMKLを利用するFortranライブラリをPythonからCtypesを用いて利用する際にNumpyと併用しようとすると以下のエラーが出た。行った対処法と情報ソースをメモとして残す。

```
MKL FATAL ERROR: Cannot load neither libmkl_avx.so nor libmkl_def.so
```

環境は以下の通り

- Python 3.6.3
- Ubuntu 16.04.4
- Numpy 1.14.5
- MKL 2018 update?

### 対応
.bashrcにて次のような環境変数を追加した。

```bash
export LD_PRELOAD=/opt/intel/mkl/lib/intel64/libmkl_core.so:/opt/intel/mkl/lib/intel64/libmkl_sequential.so
```

LD_PRELOADに登録すると同じ関数が複数見つかった場合、LD_PRELOADの対象となるライブラリのものを優先して利用するようになるらしい。

### 原因と情報ソース
Numpy内部で利用しているMKLとFortranで利用している。MKLが干渉してしまっているようだ。NumpyのMKLの関数と自分でインストールしたMKLのどちらを利用してよいか混乱している状態というところだろうか？

この対応によってNumpy側のMKL利用時に問題が生じないかどうかは検討していないので、副作用には要注意かもしれない。

下記リンク先の情報を参照している。

StackOverFlow:
https://stackoverflow.com/questions/13951953/linking-intels-mkl-within-python-c-c-fortran-2003-program

上のStackOverFlowフォーラムにて回答してくれてる方のブログ:
http://debugjournal.tumblr.com/post/98401758462/intel-mkl-dynamic-link-library-error

Intel Forumの関連投稿:
https://software.intel.com/en-us/forums/intel-math-kernel-library/topic/300857
３桁カンマ区切りのEditTextを実装する

# {
金額などの数値を入力してもらう際に、値を変更する度にカンマ区切りに自動整形するEditTextを実装してみました。EditTextを継承して作ってます。

```kotlin:CurrencyEditText.kt
class CurrencyEditText : android.support.v7.widget.AppCompatEditText {
    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

    private var prevText = text.toString()

    private val watcher:TextWatcher = object : TextWatcher {
        override fun afterTextChanged(s: Editable?) {
        }

        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
            prevText = s.toString()
        }

        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
            val text = s?.toString() ?: return
            if (prevText == text) return
            val number = text.replace(",", "").toLongOrNull() ?: return
            val textWithComma = number.toStringWithSeparator()
            if (textWithComma == text) return

            val countRightFromCursor = text.length - selectionEnd
            setTextKeepState(textWithComma)
            setSelection((textWithComma.length - countRightFromCursor).coerceAtLeast(0))
        }
    }

    init {
        addTextChangedListener(watcher)
    }
}

fun Number.toStringWithSeparator() = "%,d".format(this)
```

あとは普通にレイアウトxmlで使うだけ。

```xml
<itmammoth.hoge.CurrencyEditText
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    ...
    />
```


# 苦労した点

カンマ区切りに整形した文字列をsetTextすることで、直前のカーソル位置からずれてしまうということが起こりました。気持ち悪いので、`setSelection`でカーソル位置を戻してます。

あと、値に変更がない場合はonTextChanged内でスルッとreturnしてます。これがないと無限ループに陥ります。

# 改善したい点

~~スタイルが素の状態（？）になってしまい、AppThemeのEditTextのスタイルが適用されません。レイアウトxml`style`を指定しないと浮いた感じになってしまうと思います。`CurrencyEditText`の中で、コードでデフォルトスタイルを適用するとかしないといけないのかなあ・・・？~~
追記） `EditText`ではなく`android.support.v7.widget.AppCompatEditText`を継承すべきでしたね・・・。これで解決です。修正しました。

# }

簡易実装なのでテスト充分とはいえないのですが、今の所まともに動いてるようです。なんかあったらコメントください。
AWS 認定ソリューションアーキテクトに合格するまで

AWS認定ソリューションアーキテクト – アソシエイト (2018 年 2 月リリース)を取った。　　
どんなことやったかとかを書いておく。

## 前提レベル

- エンジニア歴1年半
- 普段ちょこちょこAWSサービスに触るものの自分で環境構築することはほぼない
- 使ってたりちょこっとでも設定したことあるのは大体こんな感じだった。
  - VPC、 EC2、 S3、 CloudFront、 ELB、 Route 53、 RDS(Aurora)、 SQS、 DynamoDB、 Athena、 Elastic Cache
- いろいろ使ってはいたけど詳細は把握していなかったし、EFS、Glacier、Auto Scaling、 Lambda なんかは名前は知っているかなくらいのレベル。本当に名前だけ。

## やったこと

本は下2冊を時には手を動かしながら読み進めた。

### [合格対策 AWS認定ソリューションアーキテクト - アソシエイト](https://amzn.to/2MlfkUp)

- ちょっと古い本なので、最新情報が抜けていたりするけど基本的なことは変わっていないので十二分に役立つ。必読と言ってもいい。
- 2週くらい

### [Amazon Web Services 業務システム設計・移行ガイド](https://amzn.to/2tAsyVD)

- オンプレからクラウドへの移行という趣旨ではあるけど、実際に手を動かしてやってみるような部分も多く、役に立った。
- 関係ない部分も多いので取捨選択が必要。特にアカウント管理、オンプレとの連携部分は流し読みでよい。
- もっといい本があるんじゃないかと思う。

### [AWS クラウドサービス活用資料集](https://aws.amazon.com/jp/aws-jp-introduction/)を読む
    
- 下記サービスはマストと言ってもいい
    - VPC
    - S3
    - Glacier
    - EC2
    - ELB
    - Auto Scaling
    - AM
    - CloudWatch
    - DynamoDB
    - SQS
    - RDS
- 下記も読んどこう
    - KMS
    - SNS
    - Lambda
    - Redshift
- 実際にAWSでいろいろやってみる
    - VPC
        - プライベートサブネットのルートテーブルのデフォルトゲートウェイにNATゲートウェイを指定してみるとか(これ頻出!!)
    - ユーザーデータ入れてEC2立ち上げてみる
    - Auto Scaling は特に使ってみた方がいいと思う。
- 模試
    - 2000円かかってしまうが、問題の感じを掴むのに受けておいた方がよい。

## 試験本番

- 困った時の選択肢はこれ!!
  - DynamoDBは拡張性・可用性高いよ。でも大きすぎるデータは入れれないから、そういう時はメタデータだけを入れよう
  - プライベートサブネットでNATゲートウェイ使って外のリソースにアクセスできるようにする
  - EFSを使ってEC2間でリソース共有

## 受けて思ったこと

- 解答で頻出するサービスや構成から、AWSの考えるベストプラクティクスが感じ取れる
- 高可用性・拡張性・セキュリティ(リソースにアクセスできるのは最低限にする)などがそのベストプラクティスの根本にある
- 無料枠あるし、ちょっと使ってみるくらいだったら安いからどんどんインスタンス起動してみよう。
- 会社でAWSを使っているなら、どのサービスがどんな設定で使われているかとか、ネートワーク構成とかを改善点を考えながら見てみると業務理解も深まり勉強にもなって一石二鳥。
GitHubとEclipseの連携とかまとめ 2 他の人が作ったfeature brancheに切り替えて作業

件名の通りのことをやってみたい時のお話
ついでに他の人が作業中のfeature brancheに更新を加えたから自分のEclipseのワークスペースに反映したいなんて時の対応も記載。

### 前提
* eclipseの状態
    * こんな感じでローカルはdev1_f2というfeature brancheで作業している。
    * まだインデックスに登録していないConsts.javaっていう更新ファイルがあるとします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/206483/c6f1be93-2b02-a33b-8e91-acea8e16d393.png)

* GigHubの状態
汚いけどこんな状態。別の人が作業していたdev1_f3で作業したいみたいなケースを想定しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/206483/3f6c7bfd-6775-d34c-57c7-0f0cd6112308.png)

## やり方
### ①とりあえずこんな感じでアップストリームからフェッチ　を選びます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/206483/481f6d40-6d5c-b36b-9ae5-00c7c9134593.png)

うまくいくとこんな感じのダイアログが出る
![image.png](https://qiita-image-store.s3.amazonaws.com/0/206483/7d382e35-9be0-1326-922b-8c90e39f1ae5.png)

さらに、Gitリポジトリー上のリモートトラッキングにもorigin/dev1_f3が追加されているのが確認できる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/206483/da1d5a4b-2d7c-4adb-788b-ad380c873c2b.png)

これ何をしたかというとその名前の通りアップストリーム（＝リモートリポジトリのはず）からfetchをしたってことのはず。
猿でもわかる～さんの言葉を借りるなら「fetchを実行すると、リモートリポジトリの最新の履歴の取得だけをした状態」。
まあ、リモートの各ブランチの最新状態を取ってきたけどローカルにマージされたわけではないみたいな状態かなあ。

### ②dev1_f3ブランチへの切り替え
こんなふうにして新規ブランチを選択。
なおすでにローカルに存在するブランチに変えるなら新規ブランチじゃなくてその下にある既に作成済みのブランチを選ぼう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/206483/7a27598c-fe7d-13cd-4d94-48e3045a68a1.png)

そうするとこんな感じの画面が出るので、選択をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/206483/a9438634-2334-5880-1652-64892c367c3e.png)

origin（リモート）のdev1_f3を選ぶ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/206483/e1c794e1-dacf-4d8f-2ba6-4b7630ab1197.png)

戻ってくるとこんな感じ。
とりあえずチェックがいっぱい入ってるがよくわからないのでそのままにしておいて完了をおす・・・

![image.png](https://qiita-image-store.s3.amazonaws.com/0/206483/15c594cb-e769-5efc-4916-560fded32211.png)


そうすると場合によってはこんなダイアログが出る
![image.png](https://qiita-image-store.s3.amazonaws.com/0/206483/d358c4cb-7b3c-6fe3-7c4c-baa43540c210.png)

これはそれまでの作業中だったdev1_f2で編集していたConsts.javaってファイルがまだコミットされてないからこのままチェックアウトすると消されちゃうよっていう警告。
とりあえずConsts.javaの編集は活かしたいけど今は早くチェックアウトしたいんじゃーって人はスタッシュを選ぶとファイルを避難できる。あとでdev1_f2に戻ってくればConsts.javaの編集は元通り。
なお、dev1_f2に戻ってきたいときは先程の「切り替え」を使おう。
とりあえずコミットしてからにするかって人はコミットを選べばいい。
今回はスタッシュします。

最終的には以下のようにdev1_f3になっているのが分かると思う。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/206483/f70b17f6-75fc-6e52-3400-a28a29e3989a.png)

### ③他の人が作業中のfeature brancheに更新を加えたので、自分のワークスペースに反映したい時。
例として今回は他の人がリモートのdev1_f3にhoge2.txtというファイルを置いたとします。
と言ってもやることは簡単。またアップストリームからフェッチを選ぶ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/206483/f5550dd5-1f6e-b008-5bff-c1b07a38aa4a.png)

そうするとこんなのが出る
![image.png](https://qiita-image-store.s3.amazonaws.com/0/206483/d47db72f-d10c-811f-40c0-0d567155d984.png)

その後、マージを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/206483/93e370db-3322-ca3a-9b77-108119b02dfe.png)


こんなのが出る。今回はリモートのdev1_f3とマージしたいからこれを選ぶ。
マージオプションとか高速フォワードオプションはよくわからないです・・・（のでデフォルト）

そうするとこんな感じでワークスペースでもhoge2が見えるようになる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/206483/627ce48b-0df5-da59-a440-fb16063608da.png)

まあこれでコンフリクトが発生しなければだいたいのことは出来るのではないかなあと。
そのうちコンフリクトの解消法も書きますかね。
item2 の最強設定

iterm2は、皆さん使ってますか？
使っていますよね。

それでは、実務でも使ってる設定をひとつ紹介したいと思います。
複数の環境を、複数のウィンドウ、タブ（crtl+t）を開いては、該当のディレクトリでコマンドを打つとかしますよね。

例えば、 Python ならば、virtualenv で `source /path/to/environment`で、仮想環境を参照する。
例えば、 node ならば、 npm で、`npm start` で、ローカル環境で実行する。
例えば、 GAE ならば、 gcloud_dev_server.py で、`gcloud_dev_server.py app.yaml` で、ローカル環境で実行する。
例えば、いつもターミナルで、ステージング環境に、 ssh でアクセスするとか。

複数のプロダクトに関われば関わるほど、または、 api とフロントエンドを分けているならば、ローカル実行環境は、複数用意されてると思います。
ただ、いつも同じコマンドを実行していると時間の無駄にもなります。そこで、iterm2 を使って、いつも同じコマンドを実行して、同じ環境を用意できるようにしましょう。

目指すゴールは、以下の画像です。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/59728/967f5d86-404e-6cea-b784-9cd7962e06d2.png)
![2.png](https://qiita-image-store.s3.amazonaws.com/0/59728/563e5e6c-6a8e-0b9c-745e-e77483c9ccbb.png)


### 環境の設定（基本編）
始めに、開いておきたい環境分、 profile の作成を行います。環境の設定は、複数の例を挙げていきます。まずは、基本編として、試しにこんな環境を作成してみました。 profile には、「;」 を用いることで、複数のコマンドを登録することができます。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/59728/15449417-90c9-3bcf-be3e-ff0bd625ca04.png)

次に、先ほど設定した ssh 接続を自動化してみましょう。 

iterm2 のコンソール画面を右クリックして、新しいタブを開きます。タブの開き方は、`[右クリック] > [New Tab] > [ssh-test] > [ssh-test] `(profileのtag項目に、sshと記載した場合)です。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/59728/fc17d308-fee5-d604-0e1b-46bccd59aebb.png)

タブを開くと、自動的にssh接続を開始すると思います。これで、自動的にssh接続ができます。
![6_v2.png](https://qiita-image-store.s3.amazonaws.com/0/59728/736939ca-8a2d-d111-1412-97f7484edac6.png)

これでも、ある程度便利になったと思います。しかし、プロダクトごとに環境を使いたいという人にとっては、まだ足りないと思います。複数のタブを開いては、その環境の立ち上げを繰り返すことになります。

### 環境の設定（応用編）
次は、複数のタブや環境の立ち上げ（複数のprofile設定を参照して起動）を支援している設定で、Arrangements の設定を行います。

Arrangements は、現在立ち上げている profile、タブの状態を保管して、一挙に立ち上げることができます。Arrangements の保存は、`[Window] > [Save Window Arrangement]`で行います。
![8.png](https://qiita-image-store.s3.amazonaws.com/0/59728/0e18f462-5433-c57a-887e-50408b709071.png)

保存時には、以下のように名前を入力することになります。
![9.png](https://qiita-image-store.s3.amazonaws.com/0/59728/08a03345-9934-5bce-17b8-5335d8e36945.png)

保管された情報は、`[iTrem2] > [Preferences...]` から確認可能です。
![11.png](https://qiita-image-store.s3.amazonaws.com/0/59728/05a69b42-1751-306a-0443-0f47167cd6c4.png)

それでは、上記の要領で、以下画像のような profile を作ってみます。
![12.png](https://qiita-image-store.s3.amazonaws.com/0/59728/9f87992b-993b-0585-1b0e-ee2bf5919f0c.png)

基本編と同じように、開いてみます。その後、画面分割（Command+d）で、画像と同じように開いてみましょう。そうすると、 参照するプロファイルは、画面分割された test-dir_1 であることが確認できます。 
で、
![13.png](https://qiita-image-store.s3.amazonaws.com/0/59728/3c79a490-a2c3-ae29-c720-1068148b5a4b.png)
![14.png](https://qiita-image-store.s3.amazonaws.com/0/59728/6ce04fef-6bfc-6eaa-88d5-a17845e248a5.png)

次に、右側の画面分割された画面上を `[右クリック] > [Edit Session...]` をクリックすると以下画像が表示されます。この後、`[test-dir_2(profileの選択)] > [Use Selected Profile]` を選択しましょう。最後には、右側の画面分割された画面上を `[右クリック] > [Restart] ` で、 profile が切り替わることを確認します。
![15.png](https://qiita-image-store.s3.amazonaws.com/0/59728/5410bd4c-f6ec-89b1-8e76-fcf4a562262e.png)

プロファイルの切り替わりの確認。
![16.png](https://qiita-image-store.s3.amazonaws.com/0/59728/730737f0-2019-c812-3ee6-4bbc490baaf2.png)

最後は、 Arrangements の保存で上部で示した通りにやると、ゴールです。お疲れさまでした。
![17.png](https://qiita-image-store.s3.amazonaws.com/0/59728/d07017e0-653b-43a3-4b8a-35d10ee3610d.png)
Binary Decision Diagramを扱うためにCUDDをインストール

お試し中のメモ。

# ダウンロードとかパッケージの情報

- http://vlsi.colorado.edu/~fabio/
- https://github.com/ivmai/cudd


# インストール

- デフォルトでconfigureするとエラーが出た（記憶がある）ので、g++-mp-6を指定してビルドするように修正（環境でMacPortsを利用していることを想定）
- インストールした結果、/usr/local/includeにファイルが置かれるようになった（おそらく変更できる）


```bash
./configure CC=gcc-mp-6 CXX=g++-mp-6 --enable-silent-rules --enable-shared --enable-obj
make
sudo make install
```

# はじめてのビルド

- ソースファイル
  - このプログラムのソースはこちら
  - http://web.mit.edu/sage/export/tmp/y/usr/share/doc/polybori/cudd/node5.html

```c++
#include <iostream>
#include "cuddObj.hh"

using namespace std;

int main() {
  Cudd mgr;
  BDD x = mgr.bddVar();
  BDD y = mgr.bddVar();
  BDD f = x * y;
  BDD g = y +!x;
  cout << "f is" << (f <= g ? "" : " not")
       << " less than or equal to g" << endl;
  return 0;
}
```

- ビルド方法

```bash
g++ -Wall -o main main.cpp -I/usr/local/include -lcudd
```

- 実行結果
  - おそらく実行されている感じ

```bash
./main
#> f is less than or equal to g
```

# next

- もう少し複雑な例題をC++側のインタフェースを利用して使って見る（動作確認含む）
zaimのカンマ区切りのCSVをタブ区切りのCSVに変換する

CSVというのは単一の仕様というのはどうやら無いらしく（[RFC4180](https://tools.ietf.org/html/rfc4180)というのはあるがこれはカテゴリがInformationalなので、標準ではない）、データを吐く側と食う側でどのみち合意が必要なようです。
逆に合意さえあれば、パースを簡略化できます。
そんなわけでzaimのCSVの仕様を調べます。

# zaimのCSVの仕様

**タブの扱い**

`pbcopy`（macOSのコマンドです）でタブ文字をクリップボードにコピーして、zaim web からタブ文字を含む取引を登録してみました。

```shell-session
$ printf '\t' | pbcopy
```

CSVをダウンロードしてみると、タブ文字はそのまま含まれていました。

**改行の扱い**

zaim Web からは改行文字の入力ができなかったので、アプリから入力してみました。
CSVをダウンロードしてみると、この取引のレコードは、改行がスペースに置き換えられていました。

# awkで処理してみる

まず、タブを消す前処理です。

```awk:タブをスペース4つに置換するawkスクリプト
{
  sub("\t", "    ", $0);
  print $0
}
```

次に、カンマをタブに置換します。
単に`tr ',' '\t'`としてしまうと、ダブルクォートの中にカンマが出現する場合、フィールドの区切りがおかしくなってしまいます。
結構悩んだ挙げ句、以下のStackOverflowの回答にたどり着きました。

https://stackoverflow.com/a/13498269

ダブルクォートでエスケープされているまずダブルクォートを区切り文字としてフィールドを分けてから、1フィールド飛ばしで `,` を `\t` に置換するとよいようです。
CSVにカンマが出現する場合、1フィールド中のカンマは必ず偶数個出現することを利用しているわけですね。

```awk:カンマ区切りのCSVをタブ区切りのCSVに変換するawkスクリプト
BEGIN {
  FS=OFS="\""
}
{
  for (i=1; i<=NF; i+=2) {
    gsub(/,/,"\t", $i);
  }
  print $0;
}
```

# csvformat を使う

csvkitに含まれているcsvformatコマンドを使うともっと簡単にできます。

```sh
brew install csvkit
cat zaim.csv | csvformat -T
cat zaim.csv | csvformat -T | awk -v FS='\t' '{if(NF != 16){print NF}}'  # 各行のカラムの数を数えて正しくパースできていることを確認
```
SQLite3::SQLException: duplicate column name  のエラー



ruby on rails
で画像投稿を実装中、
$ rails g migration add_image_to_users image:string
と入力して、上手くいかないので、何度か実験していたら、
bundle exec rake db:migrate
を入力したところ、


SQLite3::SQLException: duplicate column name image


というエラーが発生
テーブルには、imageカラムは既にあるから、エラーが出たみたいな感じ。

解決した方法
bundle exec rake db:reset
でデータを一度消してから、
bundle exec rake db:migrate
で成功。
Githubリポジトリ検索ツールを作った

# 本記事について

本記事は、以下ブログ記事の内容を転記したものです。
[Githubリポジトリ検索ツールを作った](http://teinen.hatenablog.jp/entry/2018/06/11/124123)

# 動機
* Githubの検索が結構使いづらい
  * インスタントにリポジトリ名で検索したい
* 非同期で検索したい
* [axios](https://github.com/axios/axios)使ってみたい

# 成果物

URL: [Github Repository Search](https://teinen.github.io/github-repo-search/)
Github: [teinen/github-repo-search](https://github.com/teinen/github-repo-search)



# 使い方
検索ボックスにワードを打ち込むと、非同期で30件検索する。  

API: [Search | GitHub Developer Guide](https://developer.github.com/v3/search/#search-repositories)    

検索条件:  

* [リポジトリ名から検索](https://help.github.com/articles/searching-repositories/#search-by-repository-name-description-or-contents-of-the-readme-file)する。
* スター数で降順ソートする。

```
https://api.github.com/search/repositories?q={{ 検索ワード }}+in:name&sort=stars
```

# 表示する情報
<img width="1150" alt="スクリーンショット 2018-06-25 22.40.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/241738/44172c42-a3c9-b8ce-7481-daf873bb94fa.png">

* リポジトリ名(`full_name`)
* リポジトリURL(`html_url`)
* スター数(`stargazers_count`)
* フォーク数(`forks_count`)
* ウォッチ数(`watchers_count`)
* 説明(`description`)
* ホームページ(`homepage`)

# 使ったものたち
* [Vue.js](https://vuejs.org/)
* [axios](https://github.com/axios/axios)
  * 非同期処理
* [lodash](https://lodash.com/docs/4.17.10)
  * 遅延処理(_.debounce)
* babel
* webpack
* yarn

# 今後の改善案
* ソート条件を指定できるように(スター数、フォーク数、最終アップデート等...)
* 単体テスト追加
  * lodashのモック化が出来ず断念した
* アカウント認証追加
  * [GitHub API v3 | GitHub Developer Guide](https://developer.github.com/v3/#rate-limiting)
  * 認証しないと、60回/hourしかリクエスト出来ない...

# 参考

[Computed Properties and Watchers — Vue.js](https://vuejs.org/v2/guide/computed.html#Watchers)
[Lodash Documentation](https://lodash.com/docs/4.17.10#debounce)
[Preact](https://preactjs.com/repl)
at corder A問題を解こう

# at corder A問題を解こう

## 概要
- タイトルのままです
- https://abc100.contest.atcoder.jp/tasks/abc100_a を解きます

## なぜ書くのか

- 書きたいから
- qiita書きたいなーって言って書かないまま終わるのを避けるため。
- pythonの神では今のところないけど、初心者なりに付加価値をつけられるとしたらこうして迷った跡を残しておくことかなと思ったので

## 環境
- ipad pro 
- Pythonista

## 今のレベル

- コピペ職人
- jupyter とか触るけど調べていい感じのコードツギハギしてる感じ
- markdown も怪しいかもしれない(読みづらかったらすみません)

## 目指すところ

独力でkaggleの問題を解けるようになる。できれば今年中に。

## 問題

16当分したケーキを隣り合わせにならないように2人でとることができれば「Yay!」できなければ「:-(」をかえすコードを書く。

## 考え方

地味に代入して考える

- 1つづつならいける
- 5こと1個でもいける
- 8個ずつでもいける
- 7個と9個だといけない
- この辺りで「8個より上の数を取ろうとするとダメっぽい」と気がつく

## 書いたコード

入力された数値のどちらかが8より大きければ顔文字を返すコードをかけばいい

```py

l = list(map(int,input().split()))

if l[0] <=8:
 if l[1]<=8:
	 print("Yay!")
 else:
	 print(":(")
else:
	print(":(")

```

ちなみに標準入力のコードは思い出せなくてググりました。python3だとlist（）がいる、というところで詰まりそうになった。

## 結果

Accepted.やったね
記事にしていくとやる気が出るので次はB問題かな
[WIP/初学者]flashとflash.nowの使い分け

# flash[:notice]

- redirect_toを使う場合に設定
 - 次のリクエストまで有効なメッセージを設定したい場面で使用。
 - 次のリクエストが終了した時点で、自動的にメッセージは削除。
 - redirect_toした先の画面でメッセージを表示したい場合に用いる。


# flash.now[:notice]

- renderを使う場合に設定
 - 現在のリクエストでのみ有効なメッセージを設定する。
 - 現在のリクエストが終了した時点で、自動的にメッセージは削除される。
 - renderでflash[:notice]を設定すると、画面遷移後のページにも表示される
Processingのダウンロード方法

## Processingのダウンロードが、寄付限定（有料化?）


- Processingのダウンロードが、寄付限定（有料化?）になったのかと思いましたが、以下でダウンロード出来ます。
- 公式ページのダウンロードリンクですと寄付画面にリダイレクトされます
- バージョンは3.3.7です（2018.06.25現在）

http://download.processing.org/processing-3.3.7-macosx.zip

※ 基本無料ですが、開発維持のためにも長期的に利用する方は基本的には寄付しましょう
Vue.jsのrender: h => h(App)について調べた

# `render: h => h(App)`

```js:src/index.js
import Vue from 'vue';
import App from './App.vue';

new Vue({
  el: '#app',
  render: h => h(App)
})
```

```vue:src/App.vue
<template>
  <div>
    ...
  </div>
</template>

<script>
export default {

}
</script>

<style>
  ...
</style>
```

何となく使ってたけど、`render: h => h(App)`って何だろう。

# 描画関数
[描画関数とJSX — Vue.js](https://jp.vuejs.org/v2/guide/render-function.html)

公式ドキュメントによると、以下のような`template`レンダリングへの代替とのこと。

```js:src/index.js
import Vue from 'vue';
import App from './App.vue';

new Vue({
  el: '#app',
  components: { App },
  template: '<App />'
})
```

`render`関数の使い方として、次のようなものが紹介されている。

```js
render: function (createElement) {
  return createElement('h1', this.blogTitle)
}
```

この関数は、以下と同じように描画される。

```html
<h1>{{ blogTitle }}</h1>
```

# 改めて`render: h => h(App)`を見てみる

[Explanation for `render: h => h(App)` please](https://github.com/vuejs-templates/webpack-simple/issues/29)

公式のissueにドンピシャなものがあった。

これが...

```js
render: function (createElement) {
  return createElement(App)
}
```

こうなって...

```js
render (createElement) {
  return createElement(App)
}
```

短くなって...

```js
render (h) {
  return h(App)
}
```

こうなる。

```js
render: h => h(App)
```

ちなみに、`h`というエイリアスは`hyperscript`から来ており、仮想DOMの実装でよく使われるらしい。
>It comes from the term "hyperscript", which is commonly used in many virtual-dom implementations. "Hyperscript" itself stands for "script that generates HTML structures" because HTML is the acronym for "hyper-text markup language".

# 参考
[描画関数とJSX — Vue.js](https://jp.vuejs.org/v2/guide/render-function.html)
[Vue.js 2.0 の render について試してみた](https://qiita.com/kazupon/items/2cc9a3427f468866d6dd)
[( ᐛ )σ「render: h => h(App) 」](https://qiita.com/pokkur/items/4d1fbce6cdafcc12b885)
[Explanation for `render: h => h(App)` please](https://github.com/vuejs-templates/webpack-simple/issues/29)
Swiftのドキュメントコメント

メソッドに適切なコメントを書こうと思っても、`Option+Command+/`で出せる`Parameters`や`Returns`以外は何があったかすら結構忘れがち。

なので、コピペ用にまとめて置こうと思った次第。

```swift
import Foundation

/// オブジェクトのサンプル
class SampleObject {

    /// サンプルメソッド
    ///
    /// - Attention: Watch out for this!
    /// - Author: Tim Cook
    /// - Authors:
    ///   John Doe
    ///   Mary Jones
    /// - Bug: This may not work
    /// - Complexity: O(log n) probably
    /// - Copyright: 2016 Acme
    /// - Date: Jan 1, 2016
    /// - experiment: give it a try
    /// - important: know this
    /// - invariant: something
    /// - Note: Blah blah blah
    /// - Precondition: alpha should not be nil
    /// - Postcondition: happy
    /// - Remark: something else
    /// - Requires: iOS 9
    /// - seealso: [Apple web site](www.apple.com)
    /// - Since: iOS 9
    /// - Todo: make it faster
    /// - Version: 1.0.0
    /// - Warning: Don't do it
    ///
    /// - Parameters:
    ///   - paramA: パラメータAの説明
    ///   - paramB: パラメータBの説明
    /// - Returns: 戻り値の説明
    func sampleMethod(paramA: String, paramB: String) -> String {
        return paramA + paramB
    }

}
```

jazzyでドキュメントとして出力すると、こんな感じになります。

![screencapture-file-Users-DaisukeTodate-Documents-workspace-GitHub-JazzySample-docs-Classes-SampleObject-html-2018-06-25-21_59_23.png](https://qiita-image-store.s3.amazonaws.com/0/116677/d7817053-b0cc-3b7c-fd6e-641d6c7c1851.png)

ながっ。

コメントを書くのはいい事だけど、何事もほどほどに。

# 参考
https://qiita.com/y-some/items/8bc06567eee18dfeafbb
https://useyourloaf.com/blog/swift-documentation-quick-guide/
【Ruby】インスタンスの生成プロセス<広島東洋カープ編①>

#webサイト構築の流れを広島東洋カープの選手を用いて確認する①

>
1.　クラスを用意する
- クラスを定義する
- クラスの内容を書いていく(情報を持たせる)
2. クラスからインスタンスを生成する
- クラスを元に空のインスタンスを生成する 
3. インスタンスに情報を追加する

以上。

もう少し詳しくみていこう。

#1.クラスを用意する
>- クラスを定義する

```ruby:
#class (大文字で始まる)クラス名 でクラスを定義できる
class Player
#endで閉じることを忘れずに
end
```



>- クラスの内容を書いていく(クラスに情報を持たせる)

```ruby:
#定義したクラスに情報を持たすためには、attr_accessor シンボルと記す
class Player
  attr_accessor :name
#この:nameシンボルに表したような情報のことを"インスタンス変数"と呼ぶ
end
```

>- 一つのクラスに対しインスタンス変数を複数用意することも可能

```ruby:

class Player
  attr_accessor :name
  attr_accessor :number
end
```

#2.クラスからインスタンスを生成する

>- クラスを元に、新しくインスタンスを生成していく。

```ruby:
class Player
  attr_accessor :name 
  attr_accessor :number
end

#変数player2に代入し、Playerクラスからインスタンスを生成する
player2 = Player.new
#これで今、Playerクラスを元に空のインスタンスが生成された状態
```
#3. インスタンス変数に値を代入する=>インスタンスに情報を追加していく

```ruby:
class Player
  attr_accessor :name 
  attr_accessor :number
  attr_accessor :position
  attr_accessor :throw_hand
  attr_accessor :hitting_hand
end

player1 = Player.new
player2 = Player.new
player3 = Player.new
player4 = Player.new

player1.name = 'Kosuke Tanaka'
player1.number = 2
player1.position = 'short stop'
player1.throw_hand = 'right'
player1.hitting_hand = 'left'

player2.name = 'Ryosuke Kikuchi'
player2.number = 33
player2.position = 'second'
player2.throw_hand = 'right'
player2.hitting_hand = 'right'

player3.name = 'Yoshihiro Maru'
player3.number = 9
player3.position = 'center fielder'
player3.throw_hand = 'right'
player3.hitting_hand = 'left'

player4.name = 'Seiya Suzuki'
player4.number = 51
player4.position = 'right fielder'
player4.throw_hand = 'right'
player4.hitting_hand = 'right'

```
【AzureFunctions】AzureFunctionsでEntitiyFrameworkを使うための接続文字列の書き方

# この記事の内容

 FunctionsでADO.NETとEntityFrameworkを使いたかったけど調べてもなかなか出てこなかったので記事に残しておきます。

今回の方法以外にもADO.NETを使用しなければこういった方法の接続方法もありますので参考までに
[Azure portal の Functions に書いたスクリプト](https://chomado.com/programming/c-sharp/update-sql-database-from-azure-functions/)

# 設定値

partialClass でEntitiesクラスに設定を追加します

```csharp:Entities.cs
    [DbConfigurationType(typeof(MyDbContextConfig))]
    public partial class Entities : DbContext
    {
        public Entities(string connectionString) : base(connectionString)
        {
        }
    }

```

元の自動生成されたEntitiesクラスは

```csharp:Entities.cs
        public Entities() : base("name=Entities")
        {
        }
```

となっている為引数を増やしオーバーロードします。

次にMyDbContextConfigクラスを作ります

```csharp:MyDbContextConfig.cs

    public class MyDbContextConfig : DbConfiguration
    {
        public MyDbContextConfig()
        {
            SetProviderServices("System.Data.EntityClient",
            SqlProviderServices.Instance);
            SetDefaultConnectionFactory(new SqlConnectionFactory());
        }
    }

```


# 使い方

```csharp:Main.cs
var connectionString = ConfigurationManager.ConnectionStrings["Entities"].ConnectionString;
using(var db = new Entities(connectionString))
{
    // dbの処理
    var userList = (from n in db.user_info select n).ToList();
}

```


#Azureの設定
接続文字列をそのまま入れるだけでは動かないので少し書き方を変えてやる必要があります。

```json:local.settings.json
"ConnectionStrings": {
  "Entities": "metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string='data source={server-name}.database.windows.net;initial catalog={db-name};persist security info=True;user id={username};password={password};MultipleActiveResultSets=True;App=EntityFramework'"
}
```

Azureのアプリケーション設定にも同様の値を入れておけば完了です。
Team Provisioning Profile にDevice追加後


Team Provisioning Profileが更新されない場合　
よくあるのが端末を追加したのに反映されない

<img width="250" alt="3013ecb5d9275f3e1bd87fbc87d71715-300x213.png" src="https://qiita-image-store.s3.amazonaws.com/0/266239/0813998f-e710-0cf6-c936-cfaffe7164d0.png">

こんな風にUUIDが認識できないとかエラーになってFabricでインストールできずチーム全員に迷惑をかけてしまう・・・

その場合はローカルにある Provisioning Profile を全て削除する

```
$ cd ~/Library/MobileDevice/
$ cd Provisioning\ Profiles/
$ ls -ltr 
$ rm -f *
```

その後に　XCode > Preferences > Accounts > Download All Profiles
WindowsにPathがどうしても通せなかった話（文字制限！？）

# Pathが通らない問題

Windows版gccであるところのMinGWをダウンロードしたのだが，Pathがどうやっても通らなかった。

- binをシステムの環境変数に追加したところ，gccが認識されないという問題にいたった。

通常この手の問題は

- スペルミスをチェックし
- Windowsを再起動

することで解決すると思っていたが全然だめであった。

`echo %Path%`や`set`でPathが正しく帰ってくるのに，である。

# 思わぬ原因


[こちらの記事](https://qiita.com/sansaisoba/items/bb2258eb9e29e08e74ed)が参考になった。

```
SETX /M PATH "%PATH%;C:\Program Files\Git\cmd"
```

のようにPathを設定できるのだがその結果が

```
警告: 保存されたデータは 1024 文字に切り捨てられました。

失敗：～～～
```
などと出るのだ。どうやらpathに一度に入るのは1024文字以内と決められているらしい。

**は？**

これには温厚な私もブチ切れた。かの邪智暴虐なM社を粉砕しに行かなければならない。
筆者はしがない情弱である。こういうのはやめてほしいのである。
**やめて**

補足：[pathの文字制限](http://www.atmarkit.co.jp/ait/articles/1510/30/news041.html)はとんでもないゴミカスな問題を引き起こすようだ。

## 回避策
仕方がないのでUserの環境変数が空いていたのでそちらに移したら動いた。

**他にも賢い回避策などありましたら教えてください。お願いします。**
VS Codeでswiftを書く

`xcode`が~~ゴミ~~あまりにも使いにくいのでVSCodeで開発する環境を整えてみた。

# サーベイ
VSCodeのswift関係プラグイン検索するとトップに[Swift Language](https://github.com/kasik96/Swift-VS-Code)が出てくるが、これは構文的な補完くらいはしてくれるが型情報などの大事な機能を提供していない。
2番手には[Swift](https://github.com/RLovelett/vscode-swift)というパッケージが出てくるが、これは別途Language Serverを導入して使うらしい。面倒だが強そうなので、これを導入することにした。

# 導入
導入がわかりにくかったので手順を書いておく。
ランゲージサーバは[これ](https://github.com/RLovelett/langserver-swift)。
導入は以下のようにする。

```sh
git clone https://github.com/RLovelett/langserver-swift.git
cd langserver-swift
make install
```
これで`/usr/local/bin/langserver-swift`という実行ファイルが配置される。

VSCodeのプラグインはデフォルトで`/usr/local/bin/LanguageServer`を見に行くようで、設定を変える必要がある。
VSCodeのユーザ設定に、

```
"swift.languageServerPath": "/usr/local/bin/langserver-swift"
```

を追記する。

# 動作確認

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

いい感じ！
IE11では、jsのテンプレートリテラル(バッククォートで挟むやつ)が効かない。ので別対応。

IEよ、てめぇだけは許さねぇ。と思う出来事は日々あるものの。
今回はかなりショックだったので、メモ。
テンプレートリテラルが効かないってどゆこと。
ふつうに難しいことはしてないっす。ES6の結構ファンディメンタルな文法だとおもってつかってたら、IE11未対応って。。。。（←思い込んでた私がわるいんです。はい。）


これを

```javascript

html = `<div>hoge
            <div>huge  
                <div>hage
                </div>
            </div>
        </div>`;
```

こんな風にかけてか！！！！

```javascript

html = "<div>hoge<div>huge<div>hage</div></div></div>";
html = "<div>hoge"+ 
            "<div>huge"+
                "<div>hage"+
                "</div>"+
            "</div>"+
        "</div>";
```
と憤慨したが。qiitaにメシアあり。
https://qiita.com/_shimizu/items/837b529de9f3302e315c

```javascript

var heredoc = (function () {/*
    <div>hoge
        <div>huge
            <div>hage
            </div>
        </div>
    </div>;
*/}).toString().match(/(?:\/\*(?:[\s\S]*?)\*\/)/).pop().replace(/^\/\*/, "").replace(/\*\/$/, "");
```
キョンキョンよろしく。あなたに会えてよかった。

ブラウザ作るの大変だとはうかがっているんですが。それでも。。。なんとかなりませんかねIE.
細かいcommitをまとめたい時のgit rebase -i

1. `git log --graph --oneline`などでrebaseしたいコミット対象を確認

```
* 636dfb4 [add]initial commit
* 62cc37c [add]initial commit
* ddcc7db [add]initial commit
```

2.`git rebase -i [戻りたい対象のcommit id]`　で編集。

```
// 実行する
$ git rebase -i ddcc7db

// 以下のようなメッセージが出るので、下のCommandsに合わせてまとめるなどする
pick ddcc7db [add]initial commit
fixup 62cc37c [add]initial commit
fixup 636dfb4 [add]initial commit

# Rebase ddcc7db..636dfb4 onto ddcc7db (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
```

3.`git push -f` で反映。(conflictに注意)
macOSのrmdirで.DS_Storeを無視して削除する

## 問題提議

`rmdir`は引数が空のディレクトリの場合のみ削除するコマンドです。

```bash
rmdir dir # dirが空の場合のみ削除される
rm -r dir # dirが空かどうかに関わらず削除される
```

`rm -r`はディレクトリに何か入っているかどうかに関わらず問答無用でディレクトリを削除してしまうため、
空のディレクトリを削除する場合は`rmdir`を使うように習慣づけると事故防止につながります。

しかし、macOS上でrmdirを使う場合は一点厄介な問題があります。
**macOSでGUIの表示設定を管理する隠しファイル`.DS_Store`がディレクトリに居座っているとディレクトリが削除できなくなるのです。**

```bash
mkdir dir
open dir  # GUIでdirを開く際に.DS_Storeが生成される
rmdir dir # dir/.DS_Storeが存在するためエラー
```

`.DS_Store`は特に重要なデータを含んでいないファイルであり (特にこれから削除されようとしているディレクトリについてはなおさら)、普通は`rmdir`の際には無視されてほしいファイルです。

## 対策
`.bashrc`等で以下のような関数を定義することで`rmdir`をoverrideします。

```bash
function rmdir() {
    # PS1が定義済 (=インタラクティブシェル) の場合のみ実行
    if [[ -n "${PS1}" ]]; then
        for dir in $@; do
            dss="${dir}/.DS_Store"
            # .DS_Storeのみがdirに存在する場合のみ削除
            if [[ -d "${dir}" && `ls -a "${dir}" | wc -l | awk '{print $1}'` = 3
                              && -f "${dss}" ]]; then
                rm "${dss}"
            fi
        done
    fi
    # もとのコマンドを実行
    command rmdir $@
}
```

これによってインタラクティブシェルで`rmdir`を呼んだ場合は事前に`.DS_Store`のみが削除され、結果として”`.DS_Store`のみを含むディレクトリ”についても1コマンドで削除されます。
PHP Twitter自動フォロー/ フォロー解除

twitteroauth利用
＊twitteroauthがちょっと古いかもしれないけどこんな感じで。
 APIのバージョンが変わった場合はコード内のエンドポイントを変更してください。

```php

$toa = new TwitterOAuth($CK, $CS, $AT, $AS);

// フォローワー
$followers = $toa->OAuthRequest("https://api.twitter.com/1.1/followers/ids.json","GET",array('cursor' =>-10));

// フォロー済み
$friends = $toa->OAuthRequest("https://api.twitter.com/1.1/friends/ids.json","GET",array('cursor' =>-1));

// デコード
$followers = json_decode($followers);
$friends = json_decode($friends);

// 2つの差分を取る
$diff = array_diff($followers->ids, $friends->ids);

// ランダムに1つのユーザーIDを取得
// 順番にフォローしていくとスパム認定されやすいのでランダムに１ユーザーをフォロー
$user_id = $diff[array_rand($diff)];
$user = $toa->OAuthRequest("https://api.twitter.com/1.1/users/show.json","GET",array('user_id' => $user_id));

// デコード
$r = json_decode($user);

// フォローリクエスト承認待ちでない場合のみ
if($r->follow_request_sent != 1){
    $ret = $toa->OAuthRequest("https://api.twitter.com/1.1/friendships/create.json","POST",array('user_id' => $user_id));
}
```
＊APIを使ったフォローはスパム認定されやすいので連続して利用しないほうがいいです。利用する場合は時間を空けて１日のフォロー数は50を超えないようにしてください。

フォローを解除する場合は、フォローしているユーザーに対してフォロー解除のリクエストを送信します。

```php
$toa->OAuthRequest("https://api.twitter.com/1.1/friendships/destroy.json", "POST",  array( 'user_id' => $user_id ));

```
フォローしていないユーザーに対してフォロー解除のAPIを叩くとスパム認定されやすくなるので注意してください。
<img width="697" alt="Twitter アカウント凍結" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266239/3f0c0848-b32a-82fb-da69-93c0acc7ab51.png">
Windows Server 2012R2で評価版に正式版のプロダクトキーが入らない！

# このエディションのWindowsのライセンス認証にそのキーは使えません
評価版のWindows Server 2012R2に対して
正式版のライセンスを画面から入力すると
「このエディションのWindowsのライセンス認証にそのキーは使えません。別のキーを試して下さい。」
<img src="https://qiita-image-store.s3.amazonaws.com/0/265300/baaa0869-8eb1-5e75-0659-6283ee28e5d7.png" width=70%>
となる


# 現在動作しているエディションを変更する
現在動作しているエディションを変更する必要があります。
ServerStandardEula -> ServerStandard

コマンドプロンプトにて下記のコマンドを実行して下さい(XXXXX-XXXXX-XXXXX-XXXXX-XXXXXの部分はお手元のライセンスキーに置き換えて下さい)

```
DISM /online /Set-Edition:ServerStandard /ProductKey:XXXXX-XXXXX-XXXXX-XXXXX-XXXXX /AcceptEula
```
<img src="https://qiita-image-store.s3.amazonaws.com/0/265300/3b30d747-2e6d-caaf-a011-9da9f8fa51a5.png" width=70%>
これでOK

参考サイト
https://docs.microsoft.com/ja-jp/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/jj574204(v=ws.11)
`org.scalatest.Matchers._`と`org.scalactic.Tolerance._`を同時にimportすると、`+-`の呼び出しでエラー発生


# 環境
* Scala 2.12.5
    * sbt 1.1.3
    * ScalaTest 3.0.5


# やりたいこと
Scalaのテストコードで、浮動小数点数の比較をしたいです。
ScalacticのToleranceトレイトで定義されている`+-`メソッドを、使います。
http://www.scalactic.org/user_guide/Tolerance



# 問題
以下のテストコードを実行したら、`+- is not a member`というエラーが発生しました。


```scala:SampleTest.scala
import org.scalatest.FreeSpec
import org.scalatest.Matchers._
import org.scalactic.Tolerance._

class SampleTest extends FreeSpec {

    "tolerance test" in {
      2.00001 shouldBe (2.0 +- 0.01)
    }
}
```



```plain:sbt_console
>testOnly SampleTest

[error] SampleTest.scala:12:29: value +- is not a member of Double
[error]       2.00001 shouldBe (2.0 +- 0.01)
[error]                             ^
[error] one error found
[error] (Test / compileIncremental) Compilation failed
```


# 解決

`import org.scalactic.Tolerance._`文を削除したら、エラーは発生しませんでした。


# 原因

## ライブラリのソースを参照

`SampleTest`がimportしている`Matchers`は、`Tolerance`トレイトをミックスインしています。

```scala:org.scalactic.Matchers.scala
trait Matchers extends Assertions with Tolerance with ShouldVerb with MatcherWords with Explicitly { matchers =>

}
```


```scala:org.scalactic.Tolerance.scala
trait Tolerance {

  final class PlusOrMinusWrapper[T: Numeric](pivot: T) {

    def +-(tolerance: T): Spread[T] = {
    //...
    }
  }

  import scala.language.implicitConversions

  implicit def convertNumericToPlusOrMinusWrapper[T : Numeric](pivot: T): PlusOrMinusWrapper[T] = new PlusOrMinusWrapper(pivot)
}
```

## Scala Compiler Option`-Xlog-implicits`

scalacのオプションには、「implicitが適用されない理由」を教えてくれる、`-Xlog-implicits`というオプションがあります。

>-Xlog-implicit-conversions
  Print a message whenever an implicit conversion is inserted.

https://docs.scala-lang.org/overviews/compiler-options/index.html

build.sbtにscalacのオプションを設定して、テストを実行しました。

```sbt:build.sbt
scalacOptions ++= Seq("-Xlog-implicits")
scalaVersion := "2.12.5"
```


```plain:sbt_console
>testOnly SampleTest

[info] SampleTest.scala:12:25: <convertNumericToPlusOrMinusWrapper: error> is not a valid implicit value for Double(2.0) => ?{def +-: ?} because:
[info] reference to convertNumericToPlusOrMinusWrapper is ambiguous;
[info] it is imported twice in the same scope by
[info] import org.scalactic.Tolerance._
[info] and import org.scalatest.Matchers._
[info]       2.00001 shouldBe (2.0 +- 0.01)
[info]                         ^
[error] SampleTest.scala:12:29: value +- is not a member of Double
[error]       2.00001 shouldBe (2.0 +- 0.01)
[error]                             ^
[error] one error found
```

implicitに関する情報が出力されました。
内容は、以下の通りです。

* `convertNumericToPlusOrMinusWrapper `への参照が曖昧
* `org.scalactic.Tolerance._`と`org.scalatest.Matchers._`で、同じスコープ内で二重にimportされている