OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS 7 cmake 3.10.2のソースファイルからのインストール

# 動作確認環境
- 仮想環境 VMware Workstation Player 14.1.1
- OS Windows 10 Pro 64bit

# 仮想環境
- OS CentOS 7.4 (1708) minimalインストール
- メモリ 2GB
- HDD 250GB

# ダウンロード・展開
最新バージョンの確認
[Download | CMake](https://cmake.org/download/)

`/usr/local/src`ディレクトリに移動する。

````
cd /usr/local/src
````
ソースファイルをダウンロードする。

````
wget https://cmake.org/files/v3.10/cmake-3.10.2.tar.gz
````

ダウンロードしたファイルを展開する。

````
tar zxvf cmake-3.10.2.tar.gz
````
# コンパイル・インストール
展開したディレクトリに移動する。

````
cd cmake-3.10.2
````

コンパイル・インストール

````
./bootstrap --prefix=/opt/cmake --no-system-libs
make
make install
````

# エラー対策
`./bootstrap`で`lib64`関連のエラーが発生するため、共有ライブラリへの対策。
エラー内容。

````
/usr/local/src/cmake-3.10.2/Bootstrap.cmk/cmake: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /usr/local/src/cmake-3.10.2/Bootstrap.cmk/cmake)
/usr/local/src/cmake-3.10.2/Bootstrap.cmk/cmake: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /usr/local/src/cmake-3.10.2/Bootstrap.cmk/cmake)
````

`/etc/ld.so.conf`の編集

````
vi /etc/ld.so.conf
````
`/usr/local/lib64/`を追加し、更新コマンド`ldconfig`を実行する。

````
/usr/local/lib64/
````

この時点で`ldconfig`するとエラーが表示される。

````
ldconfig: /usr/local/lib64/libstdc++.so.6.0.24-gdb.py は ELF ファイルではありま せん - 先頭に誤ったマジックバイトを持っています。
````

対策を行う。（参照しないようにする）

````
mv /usr/local/lib64/libstdc++.so.6.0.24-gdb.py /usr/local/lib64/back.libstdc++.so.6.0.24-gdb.py
````

以上で`./bootstrap`が実行できる。

# 環境変数 PATH の設定
インストールしただけではcmakeが実行できないので、`/etc/bashrc`環境変数を設定する。

````
vi /etc/bashrc
````

`PATH=$PATH:/opt/cmake/bin`を追加し、コマンドを実行する。

````
PATH=$PATH:/opt/cmake/bin
source /etc/bashrc
````
# バージョン確認

````
cmake -version
````
以下のような内容が、表示される。

````
cmake version 3.10.2

CMake suite maintained and supported by Kitware (kitware.com/cmake).
````
# 参考
[MySQLのビルドに欠かせないCMakeを準備する：仕事で使える魔法のLAMP（45） - ＠IT](http://www.atmarkit.co.jp/ait/articles/1203/02/news117.html)
[CMakeインストールメモ(Hishidama's CMake install Memo)](http://www.ne.jp/asahi/hishidama/home/tech/cmake/install.html)
(

---
[目次](https://qiita.com/knutpb1205/items/3ece0cab588afdb13f02)
Swift: NSCoderを使ったデータの保存、ロード

Swift勉強メモ

NSCoderを使ったデータのエンコード、デコードについて。(作っているアプリはTodoリスト）
インデントのずれはめんどいので無視。

データはplistで保存される。

```swift
var itemArray = [Item]()
let dataFilePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("Items.plist")
```

エンコード

```swift
// Todoリストにアイテムを追加ボタンが押された後の流れ。            
let newItem = Item()
            newItem.title = textField.text!
            //配列に新しいTodoリストを追加
            self.itemArray.append(newItem)
            //saveItemsメソッドでデータをエンコードしてplistに保存する。
            self.saveItems()
        }

func saveItems() {
        let encoder = PropertyListEncoder()
        
        do {
            let data = try encoder.encode(itemArray)
            try data.write(to: dataFilePath!)
        } catch {
            print("Error encoding item array, \(error)")
        }

        tableView.reloadData()
    
    }
```

デコード

```swift

override func viewDidLoad() {
        super.viewDidLoad()
        
        loadItems()
}


func loadItems() {
        if let data = try? Data(contentsOf: dataFilePath!) {
            let decoder = PropertyListDecoder()
            do {
                itemArray = try decoder.decode([Item].self, from: data)
            } catch {
                print("Error decoding items")
            }
            
        }
    }

```
ベータ分布を使ったベルヌーイ分布のパラメータ学習（MLSベイズ図3.3）

# 目的

- 機械学習スタートアップシリーズ「ベイズ推論による機械学習入門」の図をJuliaで再現する
- 今回の対象: 図3.3 ベータ分布を使ったベルヌーイ分布のパラメータ学習

# ベータ分布、ベルヌーイ分布の計算

- Distributions.jlから利用できる

```julia
using Distributions
μtruth = 0.25
dist = Bernoulli(μtruth)
println(rand(dist, 10))

# ==> [0, 0, 1, 1, 1, 0, 0, 0, 0, 1]  (コインを10回ふった結果）
```

# ベータ分布のプロット

- IJuliaをインストールして、Jupyter Notebook上で実行する
- 描画はPlots.jlを使い、バックエンドはGR Frameworkとする
- 0付近と1付近が危ないので少し避けておく

```julia
using Plots
gr()

ϵ = 0.01;
x = linspace(ϵ, 1.0 - ϵ, N);
bdist = Beta(0.5, 0.5)
y = pdf.(bdist, x)
plot(x, y, ylim=(0.0, 7.0))
```

- プロットの例

![plot example of beta dist.](https://qiita-image-store.s3.amazonaws.com/0/7181/8d1b1bbf-beec-2cfd-13da-e29e853a0f23.png)

# 学習
- コインをふって表の出た回数と裏の出た回数（総数 - 表の出た回数）を計数し、ベータ分布のパラメータα、βに加算して更新する（詳しくは本などを参照）
- サンプル数は$N=50$まで
- $\alpha, \beta$の初期値は適当に決めて良い
    - 本と同じく、$N=1, 3, 10, 50$のときだけ結果をプロットする

- パラメータ更新部分

```julia
nsample = 50;
α = 10.
β = 5.
bdist = Beta(α, β)
d1 = (α, β)
samples = Int64[]
lα = [α]
lβ = [β]
for i in 1:nsample
    ni = rand(dist)
    push!(samples, ni)  # サンプル
    
    pos = sum(samples)  # 1の回数
    neg = i - pos       # 総数 - 1の回数
    push!(lα, α + pos)
    push!(lβ, β + neg)
end
pos = sum(samples)
neg = nsample - pos
push!(lα, α + pos)
push!(lβ, β + neg)
println(samples)
println(lα, lβ)
```

- プロット部

```julia
ldist = []
indices = [1, 3, 10, 50]
for idx in indices
    αi = lα[idx]
    βi = lβ[idx]
    disti = Beta(αi, βi)
    push!(ldist, disti)
end

# beta dist plot
plot()
for i in 1:4
    yi = pdf.(ldist[i], x);
    plot!(x, yi, ylim=(0.0, 7.0))
end
plot!()
```

- 本を真似して$(0.5, 0.5)$、$(1., 1.)$、$(10., 5.)$を初期値として、結果を確認する

- $(0.5, 0.5)$からスタートする場合

![0505.png](https://qiita-image-store.s3.amazonaws.com/0/7181/0ce21d0d-b420-8713-f57f-43d0f92b6ca3.png)

- $(1., 1.)$からスタートする場合

![11.png](https://qiita-image-store.s3.amazonaws.com/0/7181/3187f444-f691-9310-02ae-3cebc3a6da60.png)

- $(10., 5.)$からスタートする場合

![105.png](https://qiita-image-store.s3.amazonaws.com/0/7181/4d5079f2-a011-b510-1ed4-eb6da888f41f.png)
Sublime Text 3で起動時にImportErrorが発生した場合の対処法

# 症状
Sublime Text 3を起動したときにプラグインの読み込み中にImportErrorが発生した場合の対処法です。先日、Sublime Text 3を起動すると、起動時に見かけないエラーが発生していることに気付きました。私はMaterial Themeを使用しているのですが、これを読み込む際に下記のようなエラーが発生しました。アップデート後から発生したと記憶しています。この記事では下記エラーの対処法を記載致します。

~~~
ImportError: No module named 'yaml'
~~~

# 環境
- OS Windows10 Home x64
- Sublime Text3 build 3143 x64
- Material Theme v4.1.4

# 対処方法
Sublime Textがインストールされたディレクトリにある``python3.3.zip``（Sublime Text 3の場合）へ不足しているライブラリを追加することで解決できます。今回のエラーへの具体的な対処法は次の通りです。

1. ここから [https://pypi.python.org/pypi/PyYAML](https://pypi.python.org/pypi/PyYAML) 使用状況に合わせてライブラリの入ったファイルをダウンロードします。
    - 私の場合は``PyYAML-3.12.win-amd64-py3.5.exe``をダウンロードしました。
1. ダウンロードしたファイルを解凍してyamlのディレクトリごと``python3.3.zip``の中へコピーします。

以上です。この操作の後、Sublime Textを再起動すると上記のエラーはなくなります。

# 経緯
Sublime Textは独自でPythonを``python3.3.zip``から使用していますが、初めはPythonをインストールしているPCであればそこで使われているライブラリを勝手に使ってくれるものだろうと想像して、外部からの自動読み込みを実現するためにいろいろ試してみましたが、エラーの解消には至りませんでした。そこで、第2案として``python3.3.zip``へのライブラリの直接の追加、今回の場合はPyYAMLを追加することで解決に至りました。同じ方法でSublime Text 2へも対応できるかもしれませんが、これについては試していません。もしも同様の問題で困っている方がおられるのならこの内容がお役に立てばと投稿しました。
VMware FusionでVMDKのサイズを縮小する

VMware FusionでWindows 10を動かしてます。表題のことをやろうとしてDefragしたりと、色々試して見ましたが、コマンドが用意されていたようです。

http://eng-notebook.com/blog-entry-159/

```
C:\Program Files\VMware\VMware Tools\VMwareToolboxCmd.exe" disk shrink C:\
```

と、これだけ。おお、VMDKのサイズがしっかり小さくなるじゃないですか。すばらしい。
Rust製仮想通貨(BitZeny)マイニングツール ManukaZeny

## ManukaZenyとは

有名BitZenyマイニングツールである[cpuminer](https://github.com/macchky/cpuminer)をRustでラップしたツールです。
**リポジトリ：https://github.com/miyagaw61/ManukaZeny**

## 機能

### Slackへの状況通知

プロセスの開始・終了とハッシュレートの平均をSlackで通知します。

### 予備アドレスに自動切換え

プロセスが落ちたり、接続に失敗したりした場合に、予備のアドレスに自動で切り替えることができます。

### Ctrl+C（SIGINT）で終了時、minerdも同時にkill

ManukaZenyを終了させてもバックグラウンドで走らせているminerdが残り続け、重くなってしまうということはありません。

## スクリーンショット

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132486/ae7f101e-c6c7-f486-ec69-6d459d85b1b8.png)

上記のスクリーンショットでは、一つ目は接続不可能な存在しないアドレス、二つ目は接続可能な存在するアドレスを指定した場合の挙動です。
接続失敗した後、次の新たなアドレスを用いてマイニングを再試行しているのがわかると思います。
現状では、リトライ回数は3回になっています（アップデートで変わる可能性があります）。

## 導入

### cpuminerの導入

導入方法は[cpuminer](https://github.com/macchky/cpuminer)を参考にしてください。
最後のmakeが終了すると、「minerd」というバイナリが生成されているはずです。
無事生成されていたら、パスを通してください。

### ManukaZenyの導入

```
cargo install --git https://github.com/miyagaw61/ManukaZeny
```

### Slackの情報を環境変数に設定

SlackのエンドポイントURLとチャンネルを環境変数に設定します。
SlackのAPI利用開始については、[こちらを参考にしてください](https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008)。

```
export RUSGIT_SLACK_URL=[slack-url] 
export RUSGIT_SLACK_CHANNEL=[slack-channel] 
```

RUSGIT_SLACK_CHANNNEL環境変数の例
・ `#manukazeny`
・ `@username`

### JSONファイルの準備

ManukaZenyはJSONで書かれた設定ファイルを読み込み、挙動を変えます。

```JSON
{ "addresses": ["ABC", "IJK", "XYZ"] }
```

addressesプロパティにはウォレットのアドレス（ユーザー名）を設定してください。

### 実行

引数にJSONファイルを渡して実行してください。

```
manukazeny start [json-file]
```

### 終了

```
manukazeny stop
```

## 機能追加予定

### JSONのプロパティ追加

・oオプション（プールアドレス）
uオプションはウォレットアドレス、oオプションがプールアドレスです。

・リトライ回数

・スレッド数

・その他細かい設定項目

### nohupを上回るdeamon機能

探して見つかれば実装します。なければnohupしてください。
[supervisor](https://qiita.com/yushin/items/15f4f90c5663710dbd56) とか [deamonize](https://yoshitsugu.net/posts/2017-04-05-daemonize-gskkserv.html) とか良さそう？

### Slackだけでなくメールでの通知も可能にする

https://sendgrid.com/ を使用するつもりです。

### Webからグラフでステータスを確認できるようにする

KibanaとかGrafanaとかになるのかなぁ

### RPC

リモートプロシージャコールで遠隔から制御できるようにします。

### TLS実装

TLS通信を実装してセキュリティを向上させます。

## 貢献

機能追加依頼やバグ等を発見した際には、issueを建てていただくか [@miyagaw61](https://twitter.com/miyagaw61) へ連絡していただければ対応します。
【SSIS】取り込みファイルに同一キー行が存在した場合、最初の行だけ取り出す！

#やりたいこと
下図のように、赤線のデータのみ取得したい。
ここで取り込みファイルのキー項目は氏名とする。
![取り込みファイル内容.png](https://qiita-image-store.s3.amazonaws.com/0/115879/c3441aa5-e9f5-f18d-df74-cb4f1e565e87.png)
#作成したパッケージ
全体図は下図のようになる。制御フローはデータフロータスクのみ。
![全体図(データフロー).png](https://qiita-image-store.s3.amazonaws.com/0/115879/18d18038-b99e-3553-635f-0e1f338a289d.png)



##各グループの役割について説明
###行番号設定
まず、取り込みファイルからどの行が何行目か分からないので、派生列、スクリプトコンポーネントより先頭から順に数字を設定する。
![派生列設定.png](https://qiita-image-store.s3.amazonaws.com/0/115879/cbe8ace8-8847-a98e-ac6b-7423ab03b4eb.png)


![行番号割り振りスクリプト.png](https://qiita-image-store.s3.amazonaws.com/0/115879/3bab8dc8-1de8-9093-210b-63889eb20855.png)

ここまで実行するとデータビューアは以下のようになる。
![行番号設定データビューア.png](https://qiita-image-store.s3.amazonaws.com/0/115879/33a23fda-3c6b-1221-4e6e-92c9f9c40c90.png)

###同一キー(名前)で最小の行番号データのみ取得
ここからが本番。
ファイルの各行をキー(名前)でグループ化して行番号が最小の値を取得する。
それをファイルのグループ化前と行番号でくっつけて完成!

![集計.png](https://qiita-image-store.s3.amazonaws.com/0/115879/89fd2857-5830-429c-f526-219dbe097ece.png)

マージ結合後のデータビューア
![マージ結合後データビューア.png](https://qiita-image-store.s3.amazonaws.com/0/115879/48ae9f78-3e0c-0718-2572-9b05cbf5d9fc.png)


余談)各並び替えタスクはマージ結合タスクで必要なので適当に設定してください！

#まとめ
並び替えタスクで重複を排除できるようなチェックボックスがあったんですが、どの行を排除するまでは指定できなかったので、このような処理を書きました。
#感想
また、この方法を知るまでは一時表を使ってSQLで書こうとしましたが、一時表とトランザクションの設定がうまくいかず、断念しました。。。難しい。
ARM入門（Nucleo STM32F103RBを使ってみた）

◆初稿　2018-03-03(Sat)　Written by Zepher.
#はじめに
開発環境
OS　Windows7(64bit)
ターゲットボード　Nucleo STM32F103RB

#やりたいこと(→ARM開発チュートリアル)
これまでPICやRPiを使った電子工作をしてきた。
RPiにもARMが使われている。
正直、Raspbianはお手軽電子工作には重い。(いろんな意味で)
ベアメタルでARMを使ってみたい。(興味津々)
使い勝手的にPICとどう違うのか、疑問。
→いじっていく中で感じ取りたい。

#導入
スモールスタートとしたく、[秋月](http://akizukidenshi.com/catalog/g/gM-07724/)で今回のターゲットボードを購入。(1600円くらい)
　購入品はこれだけ。ワンボードにライタ基板とターゲット基板がくっついてる。
　ライタ基板はパキっと割ればターゲット基板と分割できる。
　→分割後もジャンパワイヤで繋げばこのライタ基板を使って書き込み可能。なんとまぁ。

PCに開発環境を構築。
　１．[ドライバ](http://www.st.com/content/st_com/ja/products/embedded-software/development-tool-software/stsw-link009.html)(en.stsw-link009)をDLしてインストール
　２．[ファームウェア](http://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-standard-peripheral-library-expansion/stsw-stm32143.html)(STSW-STM32143)とやらをDL
　　→中身はサンプルプロジェクトやらペリフェラルライブラリやらのようだ。
　　※こいつめっちゃ探した、、、汗(ユーザマニュアル(ソフト)の記載が不親切なんだもん、、、)
　３．[統合開発環境](https://www.keil.com/download/product/)(MDK-ARM)をDLしてインストール
　　→いくつかあるみたいだが、今回はKeil(カイルって言うの？)のμVision5を選択。
　　※ユーザ登録が必要みたい。適当に埋めた。英語読めないとちょっとトチる。

導入としてはこんなもん？ソフトはお金かかってない。Keilは試用ライセンスってやつを選んだが、
32kBまではタダらしい。何が32kBかは現状良く理解してない。プログラムコードのサイズかな？

#基板とPCをminiB-USBケーブルで繋いで初通電
やっとここまできた。電源が入ると、基板はひとりでに動き始める。といっても、所詮Lチカだが。
どうやら出荷の時点でサンプルが既に書き込まれている模様。
通電すると、ライタ基板側のLEDが赤色に点灯する。(通信時には緑点灯)
左の青いSWを押すたびに、右の緑のLEDの点滅速度が三段階に変化する。
右の黒いSWはリセットスイッチのよう。

軽い満足感を感じつつも、我に帰って以下継続。

#ライタ基板のアップデート
ライタ基板(ST-Linkって言うみたい)のアップデートをする。
　→ST-LinkUpgrade.exe　を実行
　※場所は、C:\Keil_v5\ARM\STLink\　らへん。私の場合は。

#出荷時のサンプルコード(Lチカ)を見る
いよいよチュートリアルも佳境を迎える。
やっとIDEのお出まし。Keilさん。
　１．μVision5を立ち上げ。
　２．Pack Installerをクリック。(Project \ Manage \ Pack Installer)
　　→こいつを使うと、最新のリリースされてるパッケージを探してDLできるらしい。便利。
　　※もちろん、いまから探すサンプルコードも見つかる。
　３．左のDeviceってとこからSTM32F103RBをクリック
　　(STMicroelectronics \ STM32F1 Series \ STM32F103 \ STM32F103RB)
　４．右のExamplesからBrinky(NUCLEO-F103RB)をInstall(Actionって列のInstallをクリック)
　　→Pack Installerは外部と通信するので、いちいち描画に時間がかかる。DLも。
　５．保存先を決定。適当に。
　６．自動で開いた気がするが、手動でもProject \ Open Projectから開ける。
　　→今回開くプロジェクトは、Blinky.uvprojxってファイル。
　７．デバッグモードで実行してみる。(Debug \ Start/Stop Debug Sessionから)
　　→ライタ基板のLEDが赤から緑に点灯色が変化する。通信してるってことかな。
　　※EVALUATION MODEとかいうワーニングがでる。気にしない。
　８．動かしてみる。(Debug \ Runから)
　　→ライタ基板のLEDがひっきりなしに赤と緑の点滅を繰り返しながらLチカし始める。
　
　以上。

#おわりに
とりま、チュートリアルとしてはこんなところ。
今回はNUCLEO(ヌークレオっていうのかな？)ボードを使って、開発環境の導入から
ARMマイコンをIDE上でデバッグ動作させるところまでやった。

次回はLチカのプログラムを吟味して、オリジナルLチカをやってみたい。

ご指摘やご質問は歓迎します。みなさん、稚拙な私にどうかご教示ください。m(_ _)m
【オブジェクト】JavaScriptのお勉強

#オブジェクトとは
配列と同じようにグループ化された値．
配列とは違い，**名前(プロパティ名)**と**値**がペアになっているのが特徴

#例文
```javascript:object.js
    var user = {  //オブジェクトの設定
      mail: "example1@mail.com",
      score: 80,
      apeal: function(name){  //メソッド
        console.log("Hi! I'm " + name + "from " + this.mail);
      }
    };

    console.log(user["mail"]);
    //添字にプロパティ名をいれることでそこにアクセスできます
    user.score = 100;
    console.log(user.score);
    //このような方法で値を変えることもできる
    user.apeal("Tom");
```

#実行結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/240997/d60d525d-5c06-5a59-6aec-314ec4468953.png)
<font color = "red">わかりやすい</font>

#考察
ソースコードをかなり見やすくできる．
webサービスを作るにあたってデータ管理がしやすそう．

#最後に
JavaScriptがもともと用意しているオブジェクトもある．
引用:[オブジェクトの利用](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Working_with_Objects)
オフラインリアルタイムどう書く E22 の問題


オフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/70488 )を行っています。

問題は「辞書順に数を並べる」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/orde22numord/
です。

出題者の気分としては、問題を読み始めてから解けるまで1時間あればなんとかなるかもしれないと思ってますが、ひとそれぞれで。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、
https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。
指定した年月日の営業日を求めるプログラム

お仕事にてJavaで営業日を求めるプログラムを作成したが、Scalaではどうやるのか疑問に思ってちょっとコーディングしてみた。
以下の例は、仮に２０１８年３月２６日を指定した時の３月の営業日一覧を返してくれる。

```
package test
import java.util.Date
import org.joda.time._
import org.joda.time.format._

/*
 * 指定した年月日の営業日を一覧で出す
 */
object Main extends App {
  
  // 祝日セット
  val yearCalendar = Map( 201801 -> List(1,2,3), 201802 -> List(10), 201803 -> List(21), 201804 -> List(30), 201805 -> List(3,4,5))
  // 日付
  val year = 2018
  val month = 3
  val day = 26
  
   (1 to day).toList
    .map( x => new DateTime(year, month, x, 0 ,0 ,0 ) )
    .filter( x => x.dayOfWeek().get == Week.MONDAY.value || x.dayOfWeek().get == Week.TUESDAY.value ||
                x.dayOfWeek().get == Week.WEDNESDAY.value || x.dayOfWeek().get == Week.THURSDAY.value ||
                x.dayOfWeek().get == Week.FRIDAY.value)
    .filterNot(x => yearCalendar.getOrElse( DateTimeFormat.forPattern("yyyyMM").print(x).toInt , List(Int) ).contains(x.getDayOfMonth) )
    .foreach( x => println( DateTimeFormat.forPattern("yyyy-MM-dd").print(x) ) )
}


```

結果は以下の通り。ちゃんととれてるjoda..。

```
2018-03-01
2018-03-02
2018-03-05
2018-03-06
2018-03-07
2018-03-08
2018-03-09
2018-03-12
2018-03-13
2018-03-14
2018-03-15
2018-03-16
2018-03-19
2018-03-20
2018-03-22
2018-03-23
2018-03-26
```



DateクラスのEnumがなかったので書いてみた。以下リンクのサイト参考。

```

trait EnumLike {
  type Value
  def value: Value
}
trait Enum[T] extends EnumLike {
  type Value = T
}
trait EnumCompanion[A <: EnumLike] {
  def values: Seq[A]
  def valueOf(value: A#Value): Option[A] = values.find(_.value == value)
}

abstract sealed class WeekType(val value: Int) extends Enum[Int]
object Week extends EnumCompanion[WeekType] {
  case object MONDAY extends WeekType(1)
  case object TUESDAY extends WeekType(2)
  case object WEDNESDAY extends WeekType(3)
  case object THURSDAY extends WeekType(4)
  case object FRIDAY extends WeekType(5)
  lazy val values = Seq(MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY)
}
```

参考：
[リンク] https://gist.github.com/gakuzzzz/4ad53153e28b3a6e0aa6
fastify-knexjsを使用してDBへアクセスする

https://github.com/chapuletta/fastify-knexjs

## 動作環境

* fastify: v1.0.0-rc.2
* fastify-knexjs: v1.0.6
* knex: v0.14.4
* pg: v7.4.1

## インストール

```
$ npm install knex --save
$ npm install pg --save
$ npm install fastify --save
$ npm install fastify-knexjs --save
```

## マイグレーション

Knexfileを作成する。

```javascript:knexfile.js
module.exports = {
  development: {
    client: 'pg',
    connection: {
      database: process.env.PGDATABASE,
      port: process.env.PGPORT,
      user: process.env.PGUSER,
      password: process.env.PGPASSWORD
    },
    migrations: {
      tableName: 'knex_migrations'
    },
    seeds: {
      directory: './seeds/development'
    }
  }
};
```

以下を実行して各種ファイルを生成する。

```
$ $(npm bin)/knex migrate:make create_users
$ $(npm bin)/knex seed:make seeds
```

生成されたファイルを以下のように編集する。

```javascript:migrations/${timestamp}_create_users.js
'use strict';

exports.up = function(knex, Promise) {
  return knex.schema.createTable('users', table => {
    table.increments('id').primary();
    table.string('name');
  });
};

exports.down = function(knex, Promise) {
  return knex.schema.dropTable('users'); 
};
```

```javascript:seeds/development/seeds.js
exports.seed = async function(knex, Promise) {
  await knex('users').del();
  await knex('users').insert([
    {id: 1, name: 'hoge'},
    {id: 2, name: 'piyo'}
  ]);
};
```

マイグレーションを実行し、DBを最新化する。

```
$ $(npm bin)/knex migrate:latest
$ $(npm bin)/knex seed:run
```

## エンドポイントを定義する。

```javascript:app.js
const app = require('fastify')();
const NODE_ENV = process.env['NODE_ENV'] || 'development';

app.register(
  require('fastify-knexjs'),
  require('./knexfile')[NODE_ENV]
);

app.get('/users/:id', (req, reply) => {
  // fastifyインスタンスにknexプロパティが定義される。
  return app.knex('users')
    .first('*')
    .where({ id: req.params.id });
});

module.exports = app;
```

```javascript:www.js
const app = require('./app');

app.listen(3000, err => {
  if (err) {
    app.log.error(err);
    process.exit(1);
  }
});
```

## 動作確認

Webサーバを起動する。

```
$ node ./www.js
```

`http://localhost:3000/users/1`にアクセスすると、以下が返却される。

```json
{"id":1,"name":"hoge"}
```
PythonのREST API実装するならFlask OR Django

##背景

仕事でPythonをつかってREST APIを作成することになりました。
超苦戦しているんですけれどもし自分のようにフレームワークの選定などに
苦戦している人がいたら参考にしていただけるように共有させていただきます。

結論としてDjangoを採用しました。その過程について以下で説明します！

##Flaskの場合
Flaskは軽量なフレームワークとして人気が出ているみたいです。
実際自分がFlaskを採用しなかったのはSQL Alchemyで出力結果をJSONにすることができずに
(ネストされたテーブルの情報を)超苦戦した結果あきらめたorz


FLuskのミニマルのコード、少ない行数で1ファイルで実装できる
![rest-api.png](https://qiita-image-store.s3.amazonaws.com/0/241701/37c392f4-d6c6-e4ca-cd68-dace0372cf8c.png)



##Djangoの場合
DjangoはFlaskと比較して複雑かもしれませんがこのREST API
フレームワークはなんと**ブラウザで実際に試すことができます！**
manage.pyがあるのが心強いです！でもFlaskのように簡単ではないですorz
具体的にはDatasource設定→ルートを設定→Modelを作成→Serializerを作成
などの手順を踏んで実装します。

DjangoのRESTは以下からサンプルコードをダウンロードして使ってみてください
 [DjangoのREST APIのクイックスタート(英語)](http://www.django-rest-framework.org/tutorial/quickstart/ "DjangoのREST APIのクイックスタート")

##結論
Djangoのほうが製品として仕上がっている感があり、長く使う観点からもDjangoかなと思いました。
Vector3の初期化を計測してみた。

Vector3.zero は new Vector3(0,0,0) をしているので遅いと聞いて気になったので計測してみました。
(Unity2017.3)

| コード| 100万回実施(ms) |
|:-:|:-:|
| var t = new Vector3(1000, 2000, 3000); | 19ms  |
| var t = Vector3.zero; |  17ms |
| var t = Vector3.one; |  17ms |
| var t = v; //計測前にキャッシュしてVector3  | 7ms  |
| var t = v; t.x = 1000; t.y = 2000; t.z = 3000; | 12ms  |

Vetor3.zero は new Vector3() よりは早いですが、キャッシュを代入するのに比べると遅かったです。
キャッシュも、その後に各値代入するとやっぱり其れなりに時間が掛かりました。

```benchmark.cs
		int loop = 1000000; // 100万回

		Debug.Log("--------- new Vector3() ------------");

		sw = new System.Diagnostics.Stopwatch();
		sw.Start();
		for (int i = 0; i < loop; i++)
		{
			var t = new Vector3(1000, 2000, 3000);
		}
		Debug.Log(sw.ElapsedMilliseconds + "ms");

		Debug.Log("--------- Vector3.zero ------------");

		sw = new System.Diagnostics.Stopwatch();
		sw.Start();
		for (int i = 0; i < loop; i++)
		{
			var t = Vector3.zero;
		}
		Debug.Log(sw.ElapsedMilliseconds + "ms");

		Debug.Log("--------- Vector3.one------------");

		sw = new System.Diagnostics.Stopwatch();
		sw.Start();
		for (int i = 0; i < loop; i++)
		{
			var t = Vector3.one;
		}
		Debug.Log(sw.ElapsedMilliseconds + "ms");

		Debug.Log("--------- キャッシュを代入 ------------");

		sw = new System.Diagnostics.Stopwatch();
		sw.Start();
		for (int i = 0; i < loop; i++)
		{
			var t = v;
		}
		Debug.Log(sw.ElapsedMilliseconds + "ms");

		Debug.Log("--------- キャッシュを代入してから値を設定 ------------");

		//Vector3 v = Vector3.zero;
		sw = new System.Diagnostics.Stopwatch();
		sw.Start();
		for (int i = 0; i < loop; i++)
		{
			var t = v;
			t.x = 1000;
			t.y = 2000;
			t.z = 3000;
		}
		Debug.Log(sw.ElapsedMilliseconds + "ms");

```
前置き（自己紹介）

技術的な事をアウトプットしていくのが本来の使い方だと思うが、
最初の一発目のみ目的と自己紹介。

【目的】
人材派遣SESからエンジニアに転向する為にいろいろやって行き転職する。（WEB色強だがいろんな分野を触る）

【自己紹介】
人生の寄り道を得て何も知らない状態で中途採用でIT企業に就職。
目的は手に職を付ける為。ところが就職先は技術とは無縁な人材派遣会社だった‐‐（あれ？募集要項と違わない？＾＾；

流されるまま数年過ぎ、いい加減アクションを起こそうと立ち上がる。
この計画を脱出プロジェクトと命名する。
私が中途なので少し遅いが、上記のような会社にいれば大体25、6くらいにこんなヤバさを感じてくる事を共感してくれる方も多いと思ってる。思って欲しい。

無駄にした時間が大きすぎるが四の五の言っていられないので、休日や平時帰った後にスキルアップしつつ、転職活動をし始めている状態です。

今後進めていく事についてはコスパの関係もあり広く浅く、
とりあえず簡単なものを自分のお手手で作って動かしてみるという進め方にする。
今までの経験上、資格が役に立たないとは言わないが例えばJAVAGOLD持っている人間より実際の現場にいた人間や作ったことある人間の方が強いと感じたので（無資格なのに凄い技術屋がいたりすする）優先度については　作ってみる＞資格。もちろん両方大事っちゃ大事だが。

で作ったものはQiitaでアウトプットする。
これも経験上だがアウトプットしたものを見る事が出来る状態にしておかないと人間忘れる。
それは人間として仕方ない事だと思うが、こうする事で思い出す速度が速くなるのだ。

そんな感じでpaizaとか転職サイト見つつぽつぽつ進めます。
伸び代を感じて頂けた特定派遣以外の会社様はぜひともよろしくお願いします！

今までやって来た事、やろうと思っている事をどうやって管理して行こうかと思い、
下に簡単に追記して行く事にする。
【今までやって来た事】
VBA（2年）-進捗管理ツール、winAPI使用、access連動とか作成。よっぽど特殊な事以外は作成可能
JAVA（1年進行中） -詳細設計、コーディング。（但し炎上プロジェクトでいい経験値になったと思わない。まだまだ初心者。

【脱出プロジェクトから作ってきたもの】
SNS(動的WEBアプリケーション)-某参考書からjsp⇒サーブレット⇒DBの動作とサーバー設置からの動作確認の為に作成、一つ自分で作るのに動的webプロジェクト、mariaDB、centOS、apache、tomcat、vpsと触る事が出来たので当初目的の広く浅くは達成出来たと思う。
http://27.120.120.20/hello_world_now/
じゃあ対策打てよとか言われるかもしれないが悪戯はしないでください・・・

テキストエディタ(hta)-記事をまとめるまで忘れてたがそういえば作った、htmlとcssとjavascriptを始めて触ったときのである。これがwebアプリ作って見ようと思えたきっかけかもしれない。書き込みをlogテキストとして保存していき表示する単純なものでやってるのはローカル動作する↑のSNS見たいな感じ、todo:gitにあげておく

【使用して来たもの】
gitlab（1年）-某プロジェクトで使用。
github（数ヶ月）-個人で使用、導入前にさらっと本を読んだのでわかばちゃんとかフェッチされてるが味が出てて好き、まだまだ初心者。https://github.com/lunalice
eclipse(1年)-某プロジェクトと個人で使用。個人だとintellij（Community）とか導入して見たのだが流石に機能制限がきつくてeclipseでいい感じになった。今後技術系に転職出来た場合流石にeclipseだと辛過ぎるのでintellij（Ultimate）購入しようと思う。お勧めのIDEを聞くと自分の使いやすいものを使えという流れになると思うのでアンテナ張って行く所だと思う。
bootstrap、mariaDB、centOS7、apache、tomcat9、vps（各少し）-SNSの動作確認の為使用、LAMP環境に少しでも触れて経験値の足しに（PHP入ってないケド）

【今後やっていくつもり（優先度順）】
playframework導入から簡単なもの作成（題材：ブックマークレットか勤怠管理）
spring導入から簡単なもの作成（題材：ブックマークレットか勤怠管理）
AWS（今はvps借りて作って見たのでAWSを使って見たい、トレンドっぽいし）
ruby on rails導入から簡単なもの作成（題材：未定）
php（wordpress）導入から簡単なもの作成（題材：未定）
androidsdk導入から簡単なもの作成（題材：未定）
資格取得
C#(unity)でモデリング（題材：未定）

以上。お勧めの進め方、参考書、言語、フレームワークコメント頂けると幸いです。
さくらVPSでdocker使って５分でWordPressを構築する

# 概要
さくらVPSで利用しdockerをインストールしてWordPressを動かす手順のメモ書き

## 事前準備
* 今回はさくらVPSの環境で実行
* OSはCentOS7をインストールしていること

## 参考
dockerの正式サイトにあるインストール手順
https://docs.docker.com/install/linux/docker-ce/centos/#prerequisites

## 手順
```sh:既存のdocker関連をアンインストール
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate  docker-selinux docker-engine-selinux docker-engine
```

```sh:dockerに必要なソフトインストール
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
```

```sh:dockerのリポジトリインストール
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum-config-manager --enable docker-ce-edge
```

```sh:dockerCEのインストール
sudo yum install docker-ce
```

```sh:dockerのバージョンリスト表示
yum list docker-ce --showduplicates | sort -r
---
docker-ce.x86_64            17.12.1.ce-1.el7.centos            @docker-ce-stable
docker-ce.x86_64            17.12.0.ce-1.el7.centos            docker-ce-stable
docker-ce.x86_64            17.09.1.ce-1.el7.centos            docker-ce-stable
```

```sh:dockerのバージョン指定してインストール（上の数字を入力）
 sudo yum install docker-ce-XX.XX.1.ce-1.el7.centos
```

```sh:docker起動
 sudo systemctl start docker
```

```sh:dockerにMySQLとWPを入れる
sudo docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql
sudo docker run --name some-wordpress --link some-mysql:mysql -d -p 8080:80 wordpress
```

## WordPress起動
アクセス方法は以下の方法でログイン。さくらVPSのアドレスを利用。

```
http://<IPアドレス>:8080
```

![wp1.png](https://qiita-image-store.s3.amazonaws.com/0/230829/2a6571de-c296-b4a3-f090-d179b5cad133.png)

### 初めてみた所感
* コンテナという仮想環境で動いているので、コンテナ環境にアクセスしないとアクセスできないと思っていたがそんなことなかった。いきなりアクセスすることができて楽だった。
* ただコンテナ上のMySQLとWordPressが分からない。（今後勉強していく）
* この作業であればあんまりメリットが感じない。他の環境に移行する方法も合わせて学ぶ。
まずはドットインストールから。（Ubuntu使っているのでその部分は読み替える）
【初学者向け】Pythonのインストール方法(GUI  Windows)

# 目的
Pythonをインストール (してPythonistaの一員になる！)

# 環境
Windows8.1(64bit)

# インストール手順
###1.未インストールの確認
実はすでにインストールされてたりしないよね？

[コマンドプロンプト]

```
C:\> python
'python' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

###2.インストーラのダウンロード
[公式サイト](https://www.python.org/downloads/)にアクセスし、Python2.x系か3.x系の最新版をダウンロード

Python2.x系？3.x系？なにそれ？
どうやら2.x系で作られたものが3.x系では動かなかったりするみたいです。
今回は初インストールなので、3.x系で。

**↓だと32bit版がダウンロードされるので注意！**(怒られるかなと思ったら普通にインストールされてしまった)
![p1.JPG](https://qiita-image-store.s3.amazonaws.com/0/241192/3729c413-09c2-68a7-1487-d447a2ddca67.jpeg)

（コンパネから32bit版をアンインストールし、改めて）64bit版のインストーラを。
①[公式サイト](https://www.python.org/downloads/)の一番下より[Downloads] - [Windows]を選択
![p4.JPG](https://qiita-image-store.s3.amazonaws.com/0/241192/b59bd5a9-1798-1ea1-68cd-4824e4d1d317.jpeg)

②x86-64 版をクリック
![p5.JPG](https://qiita-image-store.s3.amazonaws.com/0/241192/0a94022e-3afd-3100-e715-3cc5d1f2e8fb.jpeg)

###3.インストール
「python-3.6.4-amd64.exe」を実行。
"Add Python 3.6 to PATH"にチェックを入れた状態で"Install Now"をクリック。
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/241192/a5428f96-615f-3b86-5a71-9f8c3aa4e771.jpeg)

Mark氏に感謝しつつ"Close"
![無題.jpg](https://qiita-image-store.s3.amazonaws.com/0/241192/f937581c-430d-0046-4bb0-48734b85f5fe.jpeg)

###4.インストールの確認

[コマンドプロンプト]

```
C:\> python
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:54:40) [MSC v.1900 64 bit (AMD64)]
 on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

[環境変数]
チェックボックスをONにしたので、PATHが設定されているようです。

```
C:\Users\ユーザ名\AppData\Local\Programs\Python\Python36\Scripts
C:\Users\ユーザ名\AppData\Local\Programs\Python\Python36\
```

[スタートメニュー]
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/241192/f5e5b2c4-c63d-7637-dfc7-1a7c5178fd0d.jpeg)

###5.Hello World

ここまでやらないとインストールできたとは言えません？ね。

```python
>>>print ("Hello World")
Hello World
>>>
```

無事にインストール出来たようですね。
お疲れさまでした。
AWS Cloud9でPython3を使う方法

# AWS Cloud9でPython3を使う

下記の３つの手順を実行すればOK

## AWS Cloud9のPython Versionを変更
AWS Cloud9のPreferencesの中で変更

![スクリーンショット 2018-03-03 15.04.03.png](https://qiita-image-store.s3.amazonaws.com/0/210767/797ea50f-064b-f62a-f09e-45c59bb9523d.png)

## pythonのaliasを変更
.bashrcのaliasをpython36に変更

```
# User specific aliases and functions
alias python=python36
```
書き換え後はsourceコマンドをお忘れなく

## update-alternativesを実行

以下を実行

```
sudo update-alternatives --config python
```
番号を聞かれるので、2を選ぶ

```
# .bashrc

There are 2 programs which provide 'python'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/bin/python2.7
   2           /usr/bin/python3.6

Enter to keep the current selection[+], or type selection number: 2
```

## バージョン確認

これで無事AWS Cloud9でPython3が使えるようになります

```
$ python -V
Python 3.6.2
```

```
$ pip -V
pip 9.0.1 from /usr/lib/python3.6/dist-packages (python 3.6)
```
SPA初心者による初心者の為のLaravel+Vueルーティング関連をまとめてみた（不完全版）

#目的
自分がLaravel＋Vueについて勉強している中一番最初に困惑した部分をまとめておこうと思いこの記事を書こうと思いました。
そもそも筆者は無印PHPと無印Jsしか触ったことがないのでルーティングなにそれおいしいの？状態な人間です。故にわからないところが多いですがその点ご容赦ください。
#目次
- 1.そもそもWebでのルーティングって？
- 2.LaravelとVue.jsのルーティング

#そもそものルーティングって？
そもそも、フレームワークに触れたことのない人間がいきなりルーティングと言われてもさっぱりわからぬ...✌︎('ω';✌︎)
となるので、ざっくりとしたニュアンスで自分なりの見解で説明すると、
**投げつけられた（リクエスト）URLに沿って、それに関連付けされたページ生成などを投げ返す(レスポンス)仕組み**です。

![スクリーンショット 2018-03-03 14.03.56.png](https://qiita-image-store.s3.amazonaws.com/0/240192/4967c992-f698-cdaa-5111-c666aa9b3a1a.png)
例えば```https://xxxxx.com```のようなURLにアクセスした場合一番最初はindex.htmlつまるところトップページが表示されます。
その後URLを```https://xxxxx.com/login```にアクセスした際にログインページを表示させると言ったものです。
ここで僕らのような駆け出し初心者は、当たり前のようなことが混乱材料になってしまうのです。
それではSPAであることを前提にLaravelのルーティングを説明していきます。
#LaravelとVue.jsのルーティング
この項目では、LaravelとVueのルーティングについて触れていきます。
Laravelにおけるルーティングは、主にSPAの元ページへのルーティングを目的にしています。
Vue.jsのルーティングは、主に元ページにたどり着いた後のDOM変更用vueへのルーティングが目的にしています。
![スクリーンショット 2018-03-03 15.20.55.png](https://qiita-image-store.s3.amazonaws.com/0/240192/0e8ced58-e851-da31-68f4-223ce4cb720a.png)
【即時関数&タイマー処理(setInterval,setTimeout)】JavaScriptのお勉強

#即時関数とは
その場で関数を定義して，直後に使いたいときなどに使う．
##書き方
```javascript:即時関数.html
    /*
      即時関数
    */
    (function plus(number) {
      var x = 10,
          y = 5;
      console.log(x + y + number);
    })(20);
```

```javascript:即時関数.html
   /*
     定義後即座に呼び出すので関数名を定義しなくてもいい
   */
    (function (number) {
      var x = 10,
          y = 5;
      console.log(x + y + number);
    })(20);
```
##実行結果
これをscriptタグの中で実行すると
![image.png](https://qiita-image-store.s3.amazonaws.com/0/240997/0da7f598-2805-c5f9-cf91-e4950530fb68.png)
こんな感じでコンソールされるよ．便利．

#どういうときに使うのか
- 人が作ったソースコードをいじりたいとき，または人に渡すとき干渉し合わないようにするため．

#タイマー処理
setIntervalとsetTimeoutという関数がある．
setIntervalが一定時間ごとにある処理を繰り返す．
setTimeoutが一定時間後にある処理を一回実行するというもの．

##書き方
showという関数を繰り返し実行する場合

```javascript:setInterval.html
    var i = 0;
    function show() {
      console.log(i++);
    }
    setInterval(function() {
      show();
    }, 1000);
```
最後にある数字の単位は[ms]なので今回は一秒ごとにiに1を足した数字が出てくる．

```javascript:setTimeout.html
    var i = 0;
    function show() {
      console.log(i++);
      var tid = setTimeout(function() {
      show();
      }, 1000)
      if (tid > 3) {
        clearTimeout(tid);
      }
    }
    show();
```
setTimeoutはsetIntervalと違く，一回しか中身が実行されないので変数に入れてそのあとのif文で何回繰り返すか制御している．
**clearTimeout**は繰り返すのをやめるという意味．
##注意
- setIntervalは前の処理の結果を考えずに一定時間ごとに繰り返すのでブラウザが耐え切れずクラッシュするおそれあり．
- setTimeoutは前の処理が終了してから実行するので安心．

##最後に
色がないのでもう少し色を付けくわえたら見やすいかも．
Gitの基礎　初期化からコミット

# Gitの基礎　初期化からコミット
勉強会やらチーム開発でGitを使う機会が多く、教える機会も多い。
使ったことがない人向けに一度まとめて見た。ついでにqiita投稿の練習。
osはmacOS High Sierra。

## Gitとはなんぞや
簡単に行ってしまうと分散バージョン管理ツール。
ソースコードなどのファイルをバージョン管理ができる。

よく勘違いしがちだが、Git≠Git Hub

- Gitはローカル(自身のPC)のバージョンを管理できる。
- Git Hubはオンライン上でバージョン管理ができるサービス。

## インストール
公式サイトに従えば良い　[Git-Gitのインストール](https://git-scm.com/book/ja/v1/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

## Gitの流れ

1. ローカルリポジトリ(バージョン管理したいディレクトリ)の初期化
`git init`

1. ファイルの新規作成、編集
1. 編集したファイルをインデックス(バージョン管理の対象)に登録する
`git add`

1. インデックスをコミット(バージョン登録)する
`git commit`
1. 2に戻る

基本的にはこれを繰り返す形になります。 

##ローカルリポジトリの初期化
作業用のディレクトリを作成し、初期化します。
初期化には`git init`を使います

```shell-session
$ mkdir git-test
$ cd git-test/
$ git init
Initialized empty Git repository in /private/var/folders/xc/blk0wtmj21s5twhkbq51j3_40000gn/T/tmpspace.4aawRiydTw/git-test/.git/
```
すでに作業しているディレクトリがあり、新たにバージョン管理したいだけなら`git init`のみで良いです。

##ファイルの新規作成、編集
今回は新たにtestファイルを作成します。

```shell-session
$ echo 'はじめてのGit' >> test
```

##編集したファイルをインデックスに登録する
先ほど作成したファイルをインデックスに追加します。
インデックスへの追加は`git add 'ファイル名'`です。
`git add -A`を使えば全てのファイルを追加できます。

```shell-session
$ git add test
```
##インデックスをコミットする
インデックスのファイルをバージョンに登録します。
コマンドは`git commit`を使います。
使うとエディタが起動するのでこのバージョンの説明を書きましょう。
`git commit -m "メッセージ"`でエディタを起動することなくコミットすることもできます。

```shell-session
$ git commit -m "testの作成"
[master (root-commit) 0a84a1d] testの作成
 1 file changed, 1 insertion(+)
 create mode 100644 test
```

以下のコマンドでデフォルトに使用するエディタをemacsにできます(重要)

```shell-session
$　gitconfig--global core.editor'emacs-nw'
```

## おまけ　差分とかを見てみよう
ここまでで基本の流れはおしまいですがせっかくバージョン管理をしているので、ファイルを編集して差分とかを見て見ましょう。
まずtestファイルの編集と新たにファイルを追加しコミットします。

```shell-session
$ echo "ほげほげ" >> test
$ echo げこげこ >> newfile
$ git add -A
$ git commit -m "testの編集。newfileの作成"
[master 9ea1a59] testの編集。newfileの作成
 2 files changed, 2 insertions(+)
 create mode 100644 newfile
```

`git log`で今までのコミットが見れます
`git log --online`で一行表示になります

```shell-session
$ git log
commit 9ea1a591bb9395c5261d46d050484227bee65ba7 (HEAD -> master)
Author: hoge <>
Date:   Sat Mar 3 14:55:33 2018 +0900

    testの編集。newfileの作成

commit 0a84a1dcc7ab4853d73f44a6932e4a3e233fa415
Author: hoge <>
Date:   Sat Mar 3 14:43:13 2018 +0900

    testの作成
```

`git diff (id1) .. (id2)` でid1とid2の差分が見れます。
`git diff (id1)` で最新のバージョンとid1の差分が見れます。
idは頭4桁のみで大丈夫です。

```shell-session
$ git diff 0a84
diff --git a/newfile b/newfile
new file mode 100644
index 0000000..3fcee85
--- /dev/null
+++ b/newfile
@@ -0,0 +1 @@
+げこげこ
diff --git a/test b/test
index ba6055a..39c5e7c 100644
--- a/test
+++ b/test
@@ -1 +1,2 @@
 はじめてのGit
+ほげほげ
```
##おわりに
ここまでがブランチを作らない場合の基本操作です
ブランチの使用方法は[次回記事](https://qiita.com/wataling/items/5b98e2569c426c784577)で行います
Digit Recognizer Sample (Simple deep MLP with Keras) を読んで勉強する

[Digit Recognizer の Tutorial](https://www.kaggle.com/c/digit-recognizer#tutorial) で紹介されている Sample その 3 ([Simple deep MLP with Keras](https://www.kaggle.com/fchollet/simple-deep-mlp-with-keras/code)) を読んで見て機械学習を勉強する。今回は Notebook はなく Code のみだった。


# 写経

各種ライブラリの import

```py
from keras.models import Sequential
from keras.utils import np_utils
from keras.layers.core import Dense, Activation, Dropout

import pandas as pd
import numpy as np
```

トレーニング・テストデータの読み込み

```py
train = pd.read_csv('../input/train.csv')
labels = train.ix[:,0].values.astype('int32')
X_train = (train.ix[:,1:].values).astype('float32')
X_test = (pd.read_csv('../input/test.csv').values).astype('float32')
```

バイナリ行列への変換
https://qiita.com/pekepek/items/916a1a5349f740d03dbc#one-hot-encoding-of-labels

```py
y_train = np_utils.to_categorical(labels) 
```

最大値で割って 0-1 に値が収まるように正規化

```py
scale = np.max(X_train)
X_train /= scale
X_test /= scale
```

標準偏差で各値を引く。あまり理解できていないが、最大値で割るのと同じようによく行われる前処理のよう

```py
mean = np.std(X_train)
X_train -= mean
X_test -= mean
```

* 入力次元数
    * 784
    * 28 x 28 pixel だからか
* 最後の出力次元数
    * 10
    * 1 - 10 に分類分けするので

```py
input_dim = X_train.shape[1]
nb_classes = y_train.shape[1]
```

ニューラルネットワークの実装
中間層の出力数や Dropout の割合は任意の値かな

```py
model = Sequential()
model.add(Dense(128, input_dim=input_dim))
model.add(Activation('relu'))
model.add(Dropout(0.15))
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dropout(0.15))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))
```

fit の `show_accuracy` param がなくなったので、ここで `metrics=['accuracy']` を指定する

```py
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
```

`nb_epoch` は `epochs`、`show_accuracy` は削除

```py
model.fit(X_train, y_train, epochs=10, batch_size=16, validation_split=0.1, verbose=2)
```

最後に学習したモデルで評価して、提出用ファイルの作成

```py
preds = model.predict_classes(X_test, verbose=0)

def write_preds(preds, fname):
    pd.DataFrame({"ImageId": list(range(1,len(preds)+1)), "Label": preds}).to_csv(fname, index=False, header=True)

write_preds(preds, "keras-mlp.csv")
```
専用のNavigatorを作って画面遷移を管理する

[この記事](https://www.swiftbysundell.com/posts/navigation-in-swift)そのままだけどなんかいいと思ったのでメモ。
複数の遷移先があるとき使ってみようかな・・・


``` .swift
.navigate(to: .signup)
```
みたいに画面遷移できる。

``` .swift

protocol Navigator {
    associatedtype Destination
    
    func navigate(to destination: Destination)
}



class LoginNavigator: Navigator {
    // Here we define a set of supported destinations using an
    // enum, and we can also use associated values to add support
    // for passing arguments from one screen to another.
    enum Destination {
        case loginCompleted
        case forgotPassword
        case signup
    }
    
    // In most cases it's totally safe to make this a strong
    // reference, but in some situations it could end up
    // causing a retain cycle, so better be safe than sorry :)
    private weak var navigationController: UINavigationController?
    
    // MARK: - Initializer
    
    init(navigationController: UINavigationController) {
        self.navigationController = navigationController
    }
    
    // MARK: - Navigator
    
    func navigate(to destination: Destination) {
        let viewController = makeViewController(for: destination)
        navigationController?.pushViewController(viewController, animated: true)
    }
    
    // MARK: - Private
    
    private func makeViewController(for destination: Destination) -> UIViewController {
        switch destination {
        case .loginCompleted:
            return WelcomeViewController()
        case .forgotPassword:
            return PasswordResetViewController()
        case .signup:
            return SignUpViewController()
        }
    }
}
 
```
betterdiscordを入れてテーマや背景を設定する

betterdiscordを入れて背景を変えてみた。

### betterdiscordとは

https://kunimaly.ml/install-better-discord/

discordのアプリを拡張させるものでインストールするとテーマを入れたり背景画像を設定したり
プラグインを入れたりといろいろとできるようです。

discordのアプリが既にインストールされていることが前提となります。

### インストール

ここから自分のOSのものをダウンロードします。（僕はWin10です。）

https://betterdiscord.net/home/

クリックしてインストールを進める。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146663/cdf9bdfc-d0a4-56ff-e050-db7b8027b4e1.png)

インストール終了後、自分のアカウントの設定ボタン（歯車マーク）を押してbetterdiscordの
設定項目がでてくればおｋ。

### テーマの適用

https://betterdocs.net/collections/themes

ここから好きなものを選びます。
betterdiscord theme でググってもいいでしょう。

NotAnotherAnimeThemeを選んでみました
https://github.com/WhatDaPuck/NotAnotherAnimeTheme

適当なフォルダにcloneします。

```
>git clone https://github.com/WhatDaPuck/NotAnotherAnimeTheme.git
```

歯車マークを押してbetterdiscordの設定からThemes → Open Theme Folder と進みます。

![2018_0303.png](https://qiita-image-store.s3.amazonaws.com/0/146663/af5730d7-250b-0d56-09dc-a7cc1efb1b54.png)

エクスプローラーが開いたら、さっきcloneしてきたthemeファイルをドラッグ&ドロップで
放り込みます。

![2018_0303_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/146663/189099da-f81c-1816-84ab-e222c3015e93.png)

Ctrl+rを押してdiscordのアプリを開き直します。
THEMESをチェックを入れると反映されます。

![2018_0303_2.png](https://qiita-image-store.s3.amazonaws.com/0/146663/c9354f65-25c6-becd-13b0-326d60a6bfa5.png)

### 画像の差し替え
こちらの方によると制約があって画像をBase64変換して埋め込むそうです。

https://loumo.jp/wp/archive/20170516120046/

こちらで背景にセットしたい画像をBase64変換します。
変換した値を先ほど読み込ませたテーマのcssファイルに貼り付けます。


https://lab.syncer.jp/Tool/Base64-encode/


![image.png](https://qiita-image-store.s3.amazonaws.com/0/146663/e8921f33-8634-6416-81d6-e6e8c2b3cb2d.png)

再読み込みしてしばらくすると背景画像がセットされます。

![無題1.png](https://qiita-image-store.s3.amazonaws.com/0/146663/f02b1ee0-b31b-f406-542b-6e60d16b29e0.png)

会社で開くと即死するように設定できました。
jaccsの吐くcsvをマトモに吸い上げる

数年前にKAMPO STYLE CLUBカードを作って以来、そこそこ使ってるんですが、csvの形式がヤバい。

何がヤバいって以下な感じ

- 明細以外の余計な情報が大量に入ってる
- 日付が "2017/1/8" みたいな形式なのでソートするとおかしくなる
- SJIS
- ダウンロードしたときのファイル名がcsvの中身の年月と関係ない（DLした日付？）
- 明細部分に余計な情報が混じる（外貨のとき。）
    - 行を増やすなカラムにてくれ頼む

で、適当にマトモcsvにしてくれるRubyの書き捨てみたいなコードを書いたので載せとく。

```jaccs.rb
# jaccsのどうかと思うcsvを吸い上げてマトモcsvに吐き出すruby

require 'csv'

first_nengappi = true
output = CSV.generate do |ocsv|
  Dir.glob('*.csv').each do |input_path|
    input = CSV.read(input_path, encoding: "CP932:UTF-8")
    in_meisai = false
    input.each do |irow|
      if first_nengappi && irow[0] == 'ご利用年月日'
        ocsv << ['ソート日'] + irow
        first_nengappi = false
      end
      if irow[1] == '＜＜今回のお支払明細＞＞'
        in_meisai = true
        next
      end
      if irow[1] == '＜＜次回以降のお支払明細＞＞'
        in_meisai = false
        next
      end
      next unless in_meisai
      # 以下、明細本体の場合の処理
      # 年月日がない場合も無視でいい
      next if irow[0].nil? || irow[0].length == 0

      # 出力用に吐き出し
      sort_date = Date.parse(irow[0])
      ocsv << [sort_date.strftime('%Y/%m/%d')] + irow
    end
  end
end

# 出力して終わりでいいよね？
puts output
```

csvをまとめたディレクトリで `ruby jaccs.rb` とでもすれば動く。少なくともMacでは動く。

＊「え？今になって確定申告のことやってんの？」という煽りコメントはお控え下さい。つらい。
[SCSS]便利な&（アンパサンド）の使い方メモ


SCSSにおいての&（アンパサンド）の使い方備忘録です。

## 基本の使い方

```scss
.class {
	&.hoge {
		background-color : #31A0FF;
	}
	
	&__foo {
		background-color: #FD997C;
	}
	
	&:hover {
		text-decoration: underline;
	}
}
```

コンパイル後のCSS

```css
.class.hoge {
  background-color: #31A0FF;
}

.class__foo {
  background-color: #FD997C;
}

.class:hover {
  text-decoration: underline;
}
```

シンプルに```.class```の直後に```&```後の文字列がくっつきます。

## &を組み合わせる

```scss
.class {
	& + & {
		margin-top: 1em;
	}

	&,
	&--hoge {
		margin-top: 1em;
	}
}
```

コンパイル後のCSS

```css
.class + .class {
  margin-top: 1em;
}

.class, .class--hoge {
  margin-left: 1em;
}
```



## 特定の親要素の場合に適用

```scss
.class {
	color: #333;

	.parent & { // 親要素指定
		color: #8B5BB5;
	}

	.parent &__foo { // 親要素+class名変化
		color: #3B8C10;
	}
}
```

コンパイル後のCSS

```css
.class {
  color: #333;
}

.parent .class {
  color: #8B5BB5;
}

.parent .class__foo {
  color: #3B8C10;
}
```

```.class``` の中でも```.parent```内の```.class```にだけ適用したい時に便利です。


### 特定の親要素の応用

```scss
.class {
	$parent: &; // 親要素を変数に定義

	&__child {
		color: #333;

		#{$parent} & { // 親要素を変数で呼び出し
			color: #8B5BB5;
		}

		#{$parent}-hoge & { // 親要素を変数+class名変化で呼び出し
			color: #3B8C10;
		}
	}
}
```

コンパイル後のCSS

```css
.class__child {
  color: #333;
}

.class .class__child {
  color: #8B5BB5;
}

.class-hoge .class__child {
  color: #3B8C10;
}
```

親要素のclass名を変化させられるのは便利ですね！
```$hoge : &;```これで変数に定義できるというのも驚きです。

## @at-rootと組み合わせてルートから指定
### @at-root 基本

```@at-root``` を先頭につけると、階層を無視してコンパイルされます。

```scss
.parent {
	@at-root .class {
		display: flex;
	}
}
```

コンパイル後のCSS

```css
.class {
  display: flex;
}
```

親要素の```.parent```を無視して```.class```が独立します。

### @at-root と & の組み合わせ

```@at-root``` はあまり使う機会はありませんが、```&```と組み合わせるとブラウザハックなどに便利です。

```scss
.class {
	display: flex;

	// IE10以降のハック
	@at-root _:-ms-input-placeholder, :root & {
		display: block;
	}
}
```

コンパイル後のCSS

```css
.class {
  display: flex;
}

_:-ms-input-placeholder, :root .class {
  display: block;
}
```

以上になります。

プリプロセッサーで書く方法を覚えてしまうとCSS直書きには戻れませんね。

お役に立てたら幸いです。

---

下記のページを参考にさせていただきました。ありがとうございます。

▼Level up your Sass with the ampersand
https://codepen.io/hidanielle/post/level-up-your-sass-with-the-ampersand
Twitter API を使って思い出を振り返る

自分は思い出を大切にするタイプで写真を結構とります。
写真はたまに見返さないと意味ないと思っています。なので Twitter に定期的に投稿して、それを見ることで思い出を振り返ります。

Google photo の「X年前の今日」写真をまとめてくれるのがとても良い機能なのですが、負荷抑制のためかたまにしかあの機能が発動しない。あれが毎日発動してくれれば満足なのだが、、、、。
とりあえずただランダムに HDD の写真をツイートします。うちにはラズパイがいるので定期的にツイートさせる。

# 参考サイト
- [Python で画像付きツイート - Qiita](https://qiita.com/yubais/items/864eedc8dccd7adaea5d)
- [PythonでTwitter API を利用していろいろ遊んでみる - Qiita](https://qiita.com/bakira/items/00743d10ec42993f85eb)
- [Pythonでexif(Jpegの撮影日など)を取得する | Divide et impera](https://glorificatio.org/archives/2898)
- [TwitterAPIで複数画像を投稿する＠C# 備忘録 : まぢぽん製作所](http://blog.livedoor.jp/mgpn/archives/51974794.html)


# 写真のパスと日付を取得
写真は jpeg しかないので jpeg に絞る。ツイート時に撮影日時もツイートしたいので日付を取得する関数も作る。

```getPhoto.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
import random
import imghdr
from PIL import Image
from PIL.ExifTags import TAGS

STORAGE_ROOT = "/Volumes/UNTITLED/Pictures"


def get_rand_photo_path():

    path = STORAGE_ROOT

    while True:
        if os.path.isdir(path):
            path += "/" + random.choice(os.listdir(path))
            continue

        if imghdr.what(path) == "jpeg":
            return path
        else:
            print(path + " is not jpeg file.")
            path = STORAGE_ROOT


def _get_exif(img):
    exif = img._getexif()
    try:
        for id, val in exif.items():
            tg = TAGS.get(id, id)
            if tg == "DateTimeOriginal":
                return val
    except AttributeError:
        return "NON"

    return "NON"


def get_photo_day(path):
    img = Image.open(path)
    date = _get_exif(img)
    img.close()
    return date

```

# 写真をアップロード
ほとんど[Python で画像付きツイート - Qiita](https://qiita.com/yubais/items/864eedc8dccd7adaea5d)のコードを利用しています。

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

import json
from requests_oauthlib import OAuth1Session
from getPhoto import get_rand_photo_path, get_photo_day

CK = 'XXXXXXXXXXXXXx'
CS = 'XXXXXXXXXXXXXx'
AT = 'XXXXXXXXXXXXXx'
AS = 'XXXXXXXXXXXXXx'

url_media = "https://upload.twitter.com/1.1/media/upload.json"
url_text = "https://api.twitter.com/1.1/statuses/update.json"

# OAuth認証 セッションを開始
twitter = OAuth1Session(CK, CS, AT, AS)

# 画像投稿
photo_path = get_rand_photo_path()
files = {"media" : open(photo_path, 'rb')}
req_media = twitter.post(url_media, files=files)

# レスポンスを確認
if req_media.status_code != 200:
    print("画像アップデート失敗: %s", req_media.text)
    exit()

# Media ID を取得
media_id = json.loads(req_media.text)['media_id']
print("Media ID: %d" % media_id)

# Media ID を付加してテキストを投稿
params = {'status': get_photo_day(photo_path), "media_ids": [media_id]}
req_media = twitter.post(url_text, params=params)

# 再びレスポンスを確認
if req_media.status_code != 200:
    print("テキストアップデート失敗: %s", req_media.text)
    exit()

print("OK")
```

# cron でお好きな時に実行
これで思い出用のアカウントをフォローすれば写真を定期的に振り返れます。
意外と簡単ですね。
AltJSのススメ(1)

この記事はMonappyにも掲載しております
https://monappy.jp/memo_logs/view/miss_monacoin/3092

Webを語る上では欠かせないJavaScript
現在では、ウェブサイトを飛び出して、サーバー、ユーティリティー、コマンドライン、IoT、スマートフォンアプリにまで使われています。

皆さん（といっても暗号通貨界隈）で身近なものは、モナコイン取引第1位、ビットバンク。他には、自動売買ボットなども、Pythonに並んで使われています（当社比）

そんなJavaScript、元々がチャラい言語だったので、最近ボロが出始めています。

それを補うために、様々な解決策が編み出されています。

「言語を変えればいいじゃないか！」という意見はもっともなのですが、現実そう上手くはいきません。

そこで、本記事では、@tomotomo_9696君のためにその解決策の一つを教えます。

## 環境構築

​​​プログラミングの8割を占めるといっても過言ではない環境構築！

最近のデファクトスタンダード、Node.jsをインストール！

https://nodejs.org/en/

とりあえずインストールすればいいや

その次、コマンドラインを開きましょう。

WindowsはPowerShell,Mac/Linuxはターミナルとかそういう名前のやつを開きましょう

そして、

```shell
$ npm -v
```

と入力したら、

エラーなく表示されますか？

されなければ、もう一回インストールし直し！

## テンプレをインポート

とりあえず下記コマンドを入力する

```shell
$ git clone https://github.com/MissMonacoin/vue-template.git
$ cd vue-template
$ npm i
$ npm start
```

もしエラーが出たら、Gitコマンドをインストールしよう

そして、http://localhost:3000にアクセス！

F12 or Ctrl+Shift+I or ⌘⌥I

を押すと上手くいくかな？

上手くいかなかったら、原因を手探りで探してみましょう

## ライブラリ・フレームワークの選定

多数のライブラリが各開発者の不満に合わせて開発されてきました。

古い順に並べてくと、

Vanilla.js, Prototype, jQuery, Angular, React, Vue

こんな感じですかね。

私はReactと比べる時は必ずVueをお勧め致します。

なぜなら、

- ロジックと外観が分かれていてコードを読みやすく、それぞれに集中できる

- 早い！

- 安全に各操作を実行できる

- メモ帳プログラミングもできる

## AltJSの選定

AltJSにはいろんな目的のもといろんな種類があります

ざっくりと分割しますと、

JSX(Facebook) TypeScript Babel Coffee

今までのJavaScriptに慣れていて、冗長なキーワード以外にあまり不満を持っていない人はBabel

型付けを求める人や、angularを使う人はTypeScript

React使いはJSX一択

Coffeeは、ES6によりメリットが現在ほぼありません

もっと知りたい人は下記サイトへ

https://qiita.com/soarflat/items/b251caf9cb59b72beb9b



めんどくさいからまた今度

もし私が飽きて忘れてしまったら、投げ銭して起こしてね

[![Monappy](https://img.shields.io/badge/DonateMe-monappy-yellow.svg)](https://monappy.jp/users/send/@miss_monacoin?amount=39&message=%E3%82%82%E3%81%AB%E3%82%83%E3%81%AE%E5%AF%84%E4%BB%98%E3%81%A7%E3%81%99)
[![モナコイン](https://img.shields.io/badge/DonateMe-monacoin-yellow.svg)](https://monya-wallet.github.io/a/?address=MStxnMRVMHH95YPzGeR9pdc3HLrvL6pjSo&scheme=monacoin&message=%E5%AF%84%E4%BB%98%E3%82%92%E3%81%82%E3%82%8A%E3%81%8C%E3%81%A8%E3%81%86%E3%81%94%E3%81%96%E3%81%84%E3%81%BE%E3%81%99&req-opreturn=%E5%AF%84%E4%BB%98%E3%81%A7%E3%81%99)
[![ビットコイン](https://img.shields.io/badge/DonateMe-bitcoin-orange.svg)](https://monya-wallet.github.io/a/?address=1HohzLWyA7L1ifx6hr2Xr5N1sGZrR1ZbMt&scheme=bitcoin&message=%E5%AF%84%E4%BB%98%E3%82%92%E3%81%82%E3%82%8A%E3%81%8C%E3%81%A8%E3%81%86%E3%81%94%E3%81%96%E3%81%84%E3%81%BE%E3%81%99&req-opreturn=%E5%AF%84%E4%BB%98%E3%81%A7%E3%81%99)
[![Tipmonaで投げる](https://img.shields.io/badge/TipMe-%40tipmona-ff69b4.svg)](https://twitter.com/share?text=%40tipmona%20tip%20%40monya_wallet%2039%20%E3%82%82%E3%81%AB%E3%82%83%E3%81%AE%E5%AF%84%E4%BB%98%E3%81%A7%E3%81%99)