OmniAICreator/Qiita-1.07M huggingface dataset:
vim で編集中のファイルをブラウザで開いたり、格納ディレクトリを Finder を開いたりするエイリアス（Mac）

mac は`open`というコマンドでダブルクリックのようなことをできる。
参考: [知ってるとちょっと便利なMacの固有コマンド](https://qiita.com/suzuki-hoge/items/21c59c92e07988bb4c3e#open)

また、vim のコマンドラインモードでは`%`で今編集中のファイルのパスを手に入れることができる。

（おまけ）
これは vim の今の作業ディレクトリからの相対パスになる。
また、フルパスにしたり拡張子にしたりもできる。
気になる人は`:tab h %:p`とかしてみるとマニュアルが引ける。
挙動を確かめて見たい場合は`:!echo %:e`とかやってみるとわかる。

これを知っていると、例えば`.html`を編集している時に以下のコマンドで編集ファイルをブラウザで開ける。

```
:!open %
```

vim の作業ディレクトリを開きたい場合は、`.`が今の作業ディレクトリを表すのでこう。

```
:!open .
```

編集しているファイルのあるディレクトリを開きたいなら、`%`に`:h`を付ける。

```
:!open %:h
```

だいたいこんな感じ。

ただし、`open`はまんまダブルクリックなので、`:!open %`の際に例えば`.md`ファイルがエディタに紐づいているとエディタが開いてしまう。
そんな時は`-a`でアプリを指定するか、`.app`に含まれている実行ファイルを直接使う。

`-a`ならこう。

```
:!open -a /Applications/Google\ Chrome.app %
```

`.app`を使うならこう。こっちは`open`を使ってないので細かい挙動が決められる。

```
:!/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --new-window %
```

で、ここらまで行くとさすがに長いので、適当に自作コマンドを作る。

```:.vimrc
command! B !/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --new-window %
```

`command! B `に続けて書くだけ。
`B`の部分は大文字で始まって入れば良いので、今まで紹介した`!`で始まるコマンドを適当に登録すれば良い。

呼ぶ時はこう。

```
:B
```

快適だ :D
jQuery「Invalid or unexpected token」→は？

# jQueryでInvalid or unexpected tokenって出る
→検索する
→それっぽい解決策が出ない
→＼(^o^)／
ってなったので直した。

## コンソール
![image.png](https://qiita-image-store.s3.amazonaws.com/0/268717/1893e4ac-2645-d590-f4f0-935eef1b9da2.png)

ここで気づけばよかったのに・・・(5行目って書いてある)

## 環境
エディタ: VSCode
jekyll 3.8.3 (静的HTMLジェネレータ)
jQuery-3.2.1.min.js
→これらをコンパイルして出力する

## 理由
改行コードがうんちだった
![image.png](https://qiita-image-store.s3.amazonaws.com/0/268717/b48906a3-2a8e-cfec-c6cd-cb7823e7e86a.png)

## 対策
エディタ右下の改行コード「CRLF」→「LF」に変更
→再コンパイルする
→
![image.png](https://qiita-image-store.s3.amazonaws.com/0/268717/918af0ad-ead9-6ef0-e197-aaf33a403b62.png)

### やったぜ。

## まとめ
俺は悪くないんや。
改行コードが悪かったんや。
(= 理由が謎なトークンエラーのときは改行コードを疑ってみて！)

### 余談
Qiita初投稿記事でした。
Node.js で S3上のZipをダウンロードし保存前に解凍する

Node.js で zip をダウンロードしたことありますか。
こないだなんですけどねとある案件で遭遇しました。実は意外と手続きが多かったんです。
zip ってダウンロードしたら保存して、その後解凍して、中身を取り出して、保存場所を指定して保存して、zip そのものは破棄して。（保存するときは古いファイルが置かれているかチェックして..etc）

これ zip の中身だけ保存したいなーと感じませんか。方法を探すと見つかりましたよ。なのでメモがてらのせておきますよ。

## zip の中身だけほしいのでその場で解凍する
コードの塊はこちら

```
 var bufStr = response.data
   , zipBuffer = Buffer.from(bufStr, 'utf8')
   , NodeZip = require('node-zip')
   , zip = new NodeZip(zipBuffer.toString("base64"), { base64: true })
   , unzipped = zip.files["your-folder-name/your-text-file.txt"].data;
```

※ zip.files["---/---"] にはフォルダ名も含まれますので要注意。

例えば zipに固めた sample フォルダのなかに 01_01_sample.js が入っている構成の zip には
次のようにアクセスします。

zip.files["sample/"]
zip.files["sample/01_01_sample.js"]
zip.files["sample/02_01_sample.js"]

## 雑感
作業を終えた彼をみて私が先生に伺うとこうおっしゃりました...

> 解決はしたのですが、彼はいつもコードの塊をおいています。問題に対する答えをどう導きだしたのか解き方をひとつの手順ごとに言葉で表してください。ココがわかれば話として組み立て安くなります。実際のコードではなく辻褄があうシステムの状態を構築しておけるのです。すると図にできるので見た目で表せるようにもできます。普通の人はコードを読みません。ですがつながりが見た目でわかると興味を持ちます。

今回は図を用意していないので文章で展開しますね。するとこうでした。

まず S3 にリクエストを送ると zip の塊は utf8 のテキストで届きます。このままではコンピュータはあつかえません。これを一度ビット列に変換します。こんどはプログラマーがビット列だと中身にアクセスできません。なので ビット列 を base64 形式で取り込み zip の各情報にプログラミングでアクセスできるオブジェクトにして zip をメモリ上でやりくりするのが上記のコードです。

それでは以上です。

## おまけ
こちらは解凍し終えた zip の中身を保存する例です。上記と組み合わせてご使用あれ。

```
  import fse from 'fs-extra'

  var fileNames = Object.keys(zip.files)
  fileNames.forEach(fileName => {
    var unzipped = zip.files[fileName].data
    zip.files[fileName].dir ?
      fse.ensureDirSync(`${dirPath}\\${fileName}`) :
      fse.outputFileSync(`${dirPath}\\${fileName}`, unzipped)
  })
```

## 参考
https://stackoverflow.com/questions/10359485/how-to-download-and-unzip-a-zip-file-in-memory-in-nodejs
https://nodejs.org/api/buffer.html#buffer_buffer
「Clean PC Pro 2018」と「Driver Updater」を削除

親がソフトを自覚のないままインストールしていた。消すのに苦労した。

* Clean PC Pro 2018
* Driver Updater

特徴

* unins000.msg が無いため「プログラムの追加と削除」からアンインストール出来ない
* ググって unins000.exe をコピーし unins000.msg にして unins000.exe を実行するもファイルが壊れていてアンインストール出来ないと出る。(想定内)
* タスクトレイから右クリック -> 終了してもプロセスが残っている(?)
* tasks から削除しても復活する
    * ソフトが正常終了する時にtaskに登録されているかのチェックがある様子。

![tasks.png](https://qiita-image-store.s3.amazonaws.com/0/25728/47c308f7-246c-ec85-3594-7f88527dc296.png)


## 消し方

* タスクマネージャーから該当タスクを終了
* tasks からタスクの削除
* c:\program files\該当のフォルダを削除
* OS再起動

完了
【Android】KotlinとJavaでMapをGSONを使用してJSONに変換する

# はじめに
GSONは、Googleが提供するJSONのパースするライブラリである。
JavaのオブジェクトとJSONを変換できるがKotlinでも可能である。
今回はKotlinのMutableMapと変換が簡単にできたので共有したい。

# GSONの使い方
Android Studioのに以下の記述をする。

```gradle:build.gradle
dependencies {
    implementation 'com.google.code.gson:gson:*.*.*'
}
```

「*.*.*」最新のバージョンを記載する。
最新バージョンは以下から確認する。
https://github.com/google/gson

上記を記載したらAndroid Studio上の「Sync Now」をクリックすれば準備完了。

![スクリーンショット 2018-07-03 3.12.37.png](https://qiita-image-store.s3.amazonaws.com/0/264726/15e3dcc1-7529-dcd9-565e-750426bff75d.png)

これでプロジェクトでGSONが使用可能となる。

# JavaのMapをJSON変換
JSON変換処理を以下のように実装してみた。

```java:Sample.java
public void test(){
    ArrayMap<String, String> map = new ArrayMap<>();
    map.put("a1", "A1");
    map.put("a2", "A2");
    map.put("a3", "A3");

    Gson gson = new Gson();
    String jsonString = gson.toJson(map);
    Log.d("Java", jsonString);

    Type type = new TypeToken<ArrayMap<String, String>>(){}.getType();
    ArrayMap<String, String> map2 = gson.fromJson(jsonString, type);
    for (String mapValue : map2.values()) {
        Log.d("Java", mapValue);
    }
}
```

Logを確認すると

***D/Java: {"a1":"A1","a2":"A2","a3":"A3"}***
***D/Java: A1***
　　***A2***
　　***A3***

のようになる。JSON変換できることが確認できた。
ここまでは前からできたので目新しいことはない。

# KotlinのMapをJSON変換

ここからが本題。
上記のJavaの実装をKotlinで実装する。
MapはKotlinのMutableMapを使用する。

```kotlin:Sample.kt
fun test(){
    val map : MutableMap<String, String> = mutableMapOf()
    map.put("a1", "A1")
    map.put("a2", "A2")
    map.put("a3", "A3")

    val gson = Gson()
    val jsonString : String = gson.toJson(map)
    Log.d("Kotlin", jsonString)
    val type : Type = object : TypeToken<MutableMap<String, String>>() {}.type

    val map2 : MutableMap<String, String> = gson.fromJson(jsonString, type)
    for (mapValue in map2.values) {
        Log.d("Kotlin", mapValue)
    }
}
```

Logを確認すると

***D/Kotlin: {"a1":"A1","a2":"A2","a3":"A3"}***
***D/Kotlin: A1***
　　　　　***A2***
　　　　　***A3***

のようになる。Javaと同様にJSON変換できることが確認できた。

# 終わりに

Kotlinの使いやすさはGOOD！
AWS WAFを使ってOWASPのトップ10 Webアプリケーションの脆弱性に対応するterraformのコードを書きました


## はじめに
[Use AWS WAF to Mitigate OWASP’s Top 10 Web Application Vulnerabilities](https://aws.amazon.com/jp/about-aws/whats-new/2017/07/use-aws-waf-to-mitigate-owasps-top-10-web-application-vulnerabilities/)
AWSが公式に提供しているOWASPのトップ10 Webアプリケーションの脆弱性を緩和するAWS WAFのテンプレートがあります。

[https://s3.us-east-2.amazonaws.com/awswaf-owasp/owasp_10_base.yml](https://s3.us-east-2.amazonaws.com/awswaf-owasp/owasp_10_base.yml)


これは、CloudFormationテンプレートなので普段インフラ構築するときに使用するterraformのコードに落とし込んでみました。

## レポジトリ
[https://github.com/twinuma/terraform-waf-owasp](https://github.com/Twinuma/terraform-waf-owasp)

## 出来上がる設定内容
こちらの方が詳しくまとめてくださっているので参照してみてください。
同じ内容がterraformのコードで実現できるようにしています。
[https://qiita.com/fnifni/items/0ef1434f3fb5063d13e4](https://qiita.com/fnifni/items/0ef1434f3fb5063d13e4)
Pass,Sass,Iassとは？？？[ITパスポートの学習]


# はじめに〜書こうと思った理由について〜

この記事を書こうと思った理由は、
ITパスポートの資格を取ろう！
と思って学習をしているときに、



「sass」
「pass」
「iass」


といった言葉ができてて、どれが何で一体なんなの・・・？？？？
と思ったので、
調べてわかったことをまとめました。



# 対象とする人
・ITパスポート学習中です！！！・・・な人

#この記事の流れ
・何の略語なの？
・Sassについて
・Passについて
・Iassについて
・ITパスポートの試験では・・・・
・追記
・コラム


#何の略語なの？

Sass・・・ Software as a Service（ソフトウェア　アズ　ア　サービス）
Pass・・・ Platform as a Service(プラットフォーム　アズ　ア　サービス）
Iass・・・ Infrastructure as a Service(インフラストラクチャー　アズ　ア　サービス)


では、上から見ていきましょう〜。


# Sassについて

SasSとは、ソフトウェアをサービスとして提供しますよ、という意味です。
具体例を言うと、(gmail)であったり、(yahoo mail)ですね。

gmailとか登録すれば簡単に使えますよね。
そういった簡単に使えるサービスを指して、Sassといいます。

# Passについて
Passとは、プラットフォームをサービスとして提供しますよ、という意味です。データベースやプログラムの実行環境といった、自分で用意するのが少々面倒なものがすでに用意されており、自分が作ったアプリケーションさえあれば、簡単にアプリケーションを公開することができます。
具体例を言うと、「heroku」ですね。herokuを使えば簡単にアプリケーションを公開する事ができますよね。僕自身、herokuを使った事が一度あるのですが、herokuを使うと簡単にアプリケーションを公開できるんやなぁと思いました。

# Iassについて
Iassとは、インフラをサービスとして提供しますよ、という意味です。メモリ等のリソースを自由に設定する事ができ、カスタマイズがしやすいです。
具体例を言うと「AWS」ですね。AWSを使って、アプリケーションを公開しようと思ったら、EC2インスタンスを作成したり、Elastic IPを準備したり、ポートを設定したり・・・・・色々知識も必要ですし、大変ですよね。しかし、その代わり、自由にカスタマイズができます。PassやSassでは出来ないような設定でも、Iassを使えば出来ます。

#ITパスポートの試験では・・・・
Sassといったらサービスを提供していて、例えばgmailとかやなー
Passといったらプラットフォームを提供していて、例えばherokuとかやなー
Iassといったらインフラを提供していて、例えばAWSとかやなー
と覚えておけば、三つを使い分ける事ができ、得点できるかと思います。

# 追記
もう一つ似ている用語として
Dass・・・ Desktop as a Service(デスクトップ　アズ　ア　サービス)
というのもあります。

Dassとは、簡単にシンクライアントを実現できる仕組みのことです。
シンクライアントとは、
<h4>「データを内部に残さないような仕組み」</h4>
のことです。
シンクライアントを使えば、データを外部の空間に置いておけるので、もし、悪い人がパソコンの内部のデータを
盗もうとしても、シンクライアント上にデータがあるので、盗めないです。


具体的な例で流れを示すと、

A社でデータを作った人「このデータは大事だから、パソコンの内部に置くのではなく、シンクライアント上に置いておこう（データをパソコンの中に保存しておくのではなく、サーバに保存しておこう）。」
↓
悪い人「A社のデータを盗んでやるぜ！！！」
↓
悪い人「よっしゃ、A社のパソコンを手に入れたで・・・・。データ盗もう。」
↓
悪い人「あれ・・・・・？パソコンの内部にデータがない・・・・？？これじゃあ盗めない・・・・。」
↓
A社でデータを作った人「データを取られなくてよかった〜。」

こんなかんじです。

試験に出るかもなので、覚えておくといいと思います。


# コラム
ITパスポートの勉強としては、僕は２週間ほど勉強しました。
ただ、結構がっつり勉強しましたね。一日8時間ぐらい勉強をしたので、100時間ぐらいはITパスポートの勉強をしたと思います。
勉強方法としては、

・「ITパスポート最速合格術 ～1000点満点を獲得した勉強法の秘密 」
という本を三回読む。
・過去問５年分をする。間違ったところは復習をし、もし同じ問題が出たら取れるようにする。（[ITパスポート試験ドットコム](https://www.itpassportsiken.com/)というサイトを使いました。）
・電車に乗っている時間などのすきま時間に、ITパスポートを学習をするためのアプリがあるのでそれで学習・復習。

テスト本番では、自分が見たことない問題が結構出たので焦りましたが、無事合格することができました。

参考にしてもらえたらと思います！



# というわけで・・・
お読みいただきありがとうございました。
間違い等ございましたら、ご指摘いただけると嬉しいです！
Visual Studio Code 逆引きチートシート

# **はじめに**

こちらがちゃんとしたチートシートです！
[Visual Studio Code Tips and Tricks](https://code.visualstudio.com/docs/getstarted/tips-and-tricks)

こちらは逆引き的に「こういうことやりたいな → こちらをどうぞ」的な操作集です。
かつ、あまりに数が多すぎると大変なので、本当にしぼってよく使うものだけ。

Windows前提で書いてあります。

# **起動からファイルを開くまで**

## Visual Studio Codeを起動する
コマンドプロンプトで ``code`` または ``スタートメニューから`` 起動する。

## ファイルを開く
エクスプローラーから右クリックして ``Open with Code``で開く。

## フォルダを開く
``ファイルメニュー``から``ワークスペースにフォルダを追加``でどんどんフォルダを開くことができます。メモをとるにしてもコーディングするにしても任意のフォルダ配下の複数ファイルを操作したいと思うのでフォルダを開いておくと便利。

# **基本的なエディタ操作**

## 普通に編集がしたい

カーソル上下左右で動いて……と一般的なエディタとほぼほぼ一緒です。

※ 少しだけ個人的に違和感があるのは ``Ctrl + 左右`` のときに普通の日本語エディタだと 英数字漢字カナかな記号 などの区切りまでカーソルが飛びますが日本語はひとくくりになって一気にカーソルが飛びます。慣れました。

## インデントを一気にいれたい

``Shift + 上下`` でインデントしたい複数行を選択。 選択おわったら ``Tab`` で一気に動きます。 ``Shift + Tab`` で一気に下がります。
タブで作られるインデントのスペース数は、エディタ右下の ``タブのサイズ:2`` みたいなところから変更可能です。

いわゆるタブ(\t)ではなく、スペースで入るのでご安心ください。

## 複数行の同一個所を同じように変更したい

例えば以下のようなテキストで、

```
子いわく、「あああ」
子いわく、「いいい」
子いわく、「ううう」
  :
```

``いわく`` を一気に ``曰く`` にしたい場合。 もちろん素直に置換する方法もありますが、影響範囲を限定的にするのにはこちらをおすすめ。

``子`` と ``いわく`` の間にカーソルをおいて　``Ctrl + Alt + 下`` をおすとカーソルが下にのびます。 ``Ctrl + Alt`` を押したままで ``下`` を押すことでどんどんのびます。 ``上`` をおすと縮みます。
縦3つ分くらいのカーソルができたところで、イメージこんな感じです。

```
子|いわく、「あああ」
子|いわく、「いいい」
子|いわく、「ううう」
  :
```

Deleteを押して消すか、Shiftを押しながら ``いわく`` を選択するかしてから、``曰く``
を入力します。

よくある使い方としては、例えば、画像ファイルの位置が変わって特定のフォルダ配下になった時など。

```
<img src="a.jpg" alt="">
<img src="b.jpg" alt="">
<img src="c.jpg" alt="">
```

``a.jpg`` の前にカーソルを移動して、下に拡張して、一気にフォルダ名をいれたりすることが可能です。

```
<img src="|a.jpg" alt="">
<img src="|b.jpg" alt="">
<img src="|c.jpg" alt="">
```

```
<img src="./images/a.jpg" alt="">
<img src="./images/b.jpg" alt="">
<img src="./images/c.jpg" alt="">
```

みたいな感じ。

終わったら ``Esc`` でマルチカーソルが解除されます。
文章で書くと難しいですが、やればわかります！！

## 複数に散らばった同じ単語を同じように変更したい ≒ 置換

その１では、文章のインデントが綺麗にそろってるときに使えますが、例えば以下のようなテキストでインデントがそろってない場合。

```
子いわく、「あああ」
  子いわく、「いいい」
    子いわく、「ううう」
      :
```

``いわく`` を選択します。するとエディタ上で ``いわく`` がすべて薄っすら色が変わったと思います。 その状態で ``Ctrl + F2`` をおすとすべての個所にカーソルが出現します。

```
子|いわく、「あああ」
  子|いわく、「いいい」
    子|いわく、「ううう」
      :
```

この複数カーソルの状態で``いわく`` を普通に ``曰く`` に書きかえればすべて書き換わります。

終わったら ``Esc`` でマルチカーソルが解除されます。

## 複数の同じ場所を同じように変更したい その３

特に規則性もない複数の個所を一気に編集したい。

```
わたしいわく、「子いわく『彼いわく』」
  :
```

``わたし`` の後をクリックしてカーソルを移動。 その後に ``子`` の後を ``Alt`` を押しながらクリック、さらに ``彼`` の後も ``Alt`` を押しながらクリック。 これでカーソルが3つになります。 他にも編集したい個所があったら ``Alt`` を押しながらクリックして追加することが可能、で、カーソルが増えたところで一気に編集。

終わったら ``Esc`` でマルチカーソルが解除されます。


## 今編集しているファイルをエクスプローラーで開きたい

左ペインのメニューから ``右クリック`` で ``エクスプローラーで開く`` を選ぶ。
丁寧にファイルが選択された状態でエクスプローラーが開きます

## ファイルを新規で作りたい

``Ctrl + n``のおなじみ(？)のショートカットで行けます。
そのまま ``Ctrl + s`` のおなじみ(？)のショートカットで保存できますし、ここでファイル名聞いてくるので適当な名前で保存してください。
ファイルの場所は今開いていたフォルダ配下がデフォルトです。

# 他にも便利な機能はやまほどあるけど...

Gitとの連携であったり、ターミナル連携であったり、具体的な作業によってはもっと色々便利機能ありますが、とりあえず会議のメモをとったり日常生活をする分にはこれくらい覚えておけば快適に生活できると思います。
シノロジのNASは最高！

最近の一番の買い物は、sinologyのNAS

・なんといっても、これが電源入れっぱなしの状態なので、サーバーとして活用できるから


やったこと

・会社からのDDNSでのアクセス　→　固定IPがないので、ＤＭＳしかアクセスできない
・いまdockerでのせたコンテナを、会社からアクセスするのが当面の目標

・redmineは、会社の環境からアクセス禁止になっていた
→なぜDMSがみれるのに、redmineは見れないのだろうか？　どっかにセキュリティホールがあるんやないですか？



やりたいこと

・NASをPYTHON開発のサーバーに仕立てること
→　ちなみにドッカでマウントした、jupyternotebookは家庭LANでは見えている　（会社からも見えるのか？）

・node's を入れてみること


他のトピック
・会社がジラコンフェルエンスをやり始めた！　
→REDMINEを卒業！
FragmentでBackPressedを捕る取る採る盗る

#FragmentでBackPressedを捕る

``` kotlin:FragmentOnBackPressed.kt
fun View.catchBackPressed(vararg listener: FragmentOnBackPressed) {
	requestFocus()
	setOnKeyListener { _, k, e ->
		if (k == KeyEvent.KEYCODE_BACK && e.action == KeyEvent.ACTION_UP) {
			listener.any { it.onBackPressed() }
		} else {
			false
		}
	}
}

interface FragmentOnBackPressed {
	fun onBackPressed(): Boolean
}
```

```kotlin:AppFragment.kt
class AppFragment: Fragment(), FragmentOnBackPressed {

	override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
		super.onViewCreated(view, savedInstanceState)
		view.catchBackPressed(this)
	}

	override fun onBackPressed(): Boolean {
		return if (flag) {
			some()
			true
		} else {
			false
		}
	}

}
```

##仕様
`View.setOnKeyListener`の中で`listener.any { it.onBackPressed() }`としているので、`true`を返すとそれ以降の`onBackPressed`を呼び出しましぇん。
つまり...

```kotlin:MyFragment.kt 
class MyFragment: Fragment(), FragmentOnBackPressed {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val viewModel = ViewModelproviders.of(this).get(MyViewModel::class.java)
        view.catchBackPressed(viewModel, this)
    }

    override fun onBackPressed(): Boolean {
        some()
        return true

    }
}

class MyViewModel: ViewModel(), FragmentOnBackPressed {

    override fun onBackPressed(): Boolean {
        someModel()
        return true
    }

}
```
とすると、`MyFragment`の`onBackPressed`は絶対に呼ばれないですね！
Pythonで開発する際の参考サイトまとめ


はじめに

Pythonでの開発にあたり参考になりそうなサイトをまとめてみました。

＜ドキュメント＞
https://www.python.org/

公式サイトです。英語サイトになります。必須。


＜ブログ＞
https://note.mu/daikawai/n/n314881cc522f

全体像をまとめてくれています。データサイエンス向け。


＜学習＞
* PyQ
https://pyq.jp/

python専門のe-Learningサイトになります。
月2980円〜と値段もお手頃

* Progate
https://prog-8.com/languages/python

もちろんProgateにもコンテンツありです。

* Udemy
https://www.udemy.com/

UdemyにもPythonのコンテンツが沢山揃っています

＜ライブラリ＞
* Numpy
http://www.numpy.org/

Numpyの公式サイトです。英語サイトになります。
数値計算には必須のライブラリになります。

* Pandas
https://pandas.pydata.org/

Pandasの公式サイトです。英語サイトになります。
データ操作には必須のライブラリになります。

* scikit-learn
http://scikit-learn.org/stable/

Scikit-learnの公式サイトです。英語サイトになります。
機械学習用のツールが揃っており必須となります。

＜その他＞
* PyCon JP
https://www.pycon.jp/

Pythonユーザーのためのカンファレンスの運営主体のページ。

* Pythonic
https://www.pythonic-exam.com/

Pythonエンジニアの育成協会です。

＜ひとこと＞

機械学習の普及に伴って、日本語でもPython関連の情報が増えてきました。
大変便利なライブラリも揃っています。
ぜひ学習を進めていきましょう。
windowsユーザー向けVi入門編

**操作がわかりにくいので最低限を記載します。**

移動は矢印キーを使います。

編集開始→iボタンで現在位置から編集可能
コピー→Window右クリックで編集を押すとコピーできます。
貼り付け→window右クリックで編集を押すと貼り付けできます。
全選択→window右クリックで編集を押すと全選択できます。
編集モード終了→エスケープボタンで終了


**ここからはコマンドモード（編集できない状態）**
保存せずに終了→：q
保存せずに強制終了→：q！

保存して終了→：wq
保存して強制終了：wq！

以上！！
Supervisorで複数プロセスをグループ化して、一括操作する

# はじめに
サーバーサイドの各種常駐プロセスをdaemon化したい、というときに
[`Supervisor`](http://supervisord.org/) を使うと便利ですよね。

私のプロジェクトでも `Supervisor` を使用していますが、
複数プロセスをまとめて起動/停止するオペレーションや、各プロセスの設定を使い回す際に少しハマったのでメモ。

# 各プロセスの設定
今回、各プロセスの設定は `hogehoge.conf` に記載しておくこととします。
以下の例ではGCP CloudSQLに接続するためのcloudsql_proxyのプロセスを起動しています。

```ini:cloudsql.conf
[program:cloudsql]
command=cloud_sql_proxy -instances=hogehoge::asia-northeast1:fugafuga -dir=/cloudsql/
autostart=false
autorestart=true
```

# supervisor.confの設定
Supervisorの大元の設定ファイルとして、 `supervisor.conf` があります。
こちらのファイルで先ほど作成したプロセス毎のconfファイルを読み込み、設定します。

```ini:supervisor.conf

~~~中略~~~

; The [include] section can just contain the "files" setting.  This
; setting can list multiple files (separated by whitespace or
; newlines).  It can also contain wildcards.  The filenames are
; interpreted as relative to this file.  Included files *cannot*
; include files themselves.

[include]
files = /etc/supervisor/conf.d/*.conf

[group:first_group]
programs=cloudsql
[group:second_group]
programs=cloudsql, nginx
```

このように設定することで、各プロセスの定義をグループ化することができます。
以下のようなコマンドを叩くと、グループ単位での操作が可能です。

```console
~ $ supervisorctl start first_group:*
```
※アスタリスクをプロセス名に変えれば、プロセス単位での操作も可能です。

また、同一のconfファイルの定義をグループ間で使い回すことができるので、
サーバーの種類に応じたプロセス定義をグループ化してまとめることが出来ます。
上記の例では、 `group:second_group` では `cloudsql` のプロセスに加えて、 `nginx` のプロセスもグループに加えています。

このグループ化を使うことで、サーバー間で設定ファイルを個別に作らずとも
サーバー毎の設定を `group` にまとめて記載しておけば、起動するgroupを変えるだけで起動プロセスの制御が可能となります。
「『エンジニアリング組織論への招待』の現場改善事例」参加メモ

- https://connpass.com/event/89096/

## 本日のパネルディスカッションのネタ
- 通信不確実性
- 方法不確実性
- 目的不確実性

## 通信不確実性
- 2017年11月の開発チーム状況
    - エンジニアの数＝開発スピード
    - 毎日残業
    - チーム内の信頼なし
    - タコ部屋、ネットに繋がらない
    - スクラム経験者、ほぼゼロ
    - LMのシステム開発知識、ほぼゼロ
- アジャイル開発が魔法の言葉
    - 仕様変更しまくり
- 役割付けは行ったが、お互いのチームに何を伝えたら良いのかが決めていなかった。
- ふりかえりの型を決めた。できてなかったことは、何をやりたいかをちゃんと言っていなかった。
- こうやって解決して行くのだということを体験してもらう。
- チームないのでふりかえりの思い出
    - 精神的にきついというプロブレム
        - 深掘りすると、高圧的な態度がきついということがわかった
     - ふりかえりのふりかえりをした。プロブレムへのアプローチの仕方がよかったのかを話し合ってみる。
-　何に向かってふりかえりをすべきだったのかが
    -　隠しちゃう。不安です。みたいな抽象的な言葉のプロブレムは、 深掘り必要

## 方法不確実性
- 低空飛行するベロシティ
- 終わらないストーリー
    - 課題の共有スピードが遅いこともあった
    - ふりかえりまで共有しない。
- RSpecにこころ折れるメンバー
- LMメンバーが、少しずつエンジニアと会話できるようになる。
- 蓋を開けない問題。できるエンジニアに難しいことを任せて、終わらなかった。
    - いい雰囲気になった状態を壊さないような空気になり、お互いに干渉できない。
    - エンジニアでできるできないの差が出てきてしまった。
- 自動テストをなぜやるのか。
    - エンジニアのモチベーション
    - 事業の継続性の観点
        - やりたい人が過半数を超えないと自動化の文化が根付かない。0から1にするのは難しい。


## 目的不確実性
- エンジニア主導の開発
- ユーザーのバリューを最優先
- 新しいツールを積極的に試している
- 価値を理解して現場から提案している
    - プロダクトの価値や方向性がチームで共有されている状態を作りたい
TeraStationのデータをQNAPへ移行する

TeraStationのデータをQNAPへ移行することになった際のメモ

[TeraStation(TS3400)のデータをQNAPへ移行する](https://竹内電設.com/post/terastation%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92qnap%E3%81%B8%E7%A7%BB%E8%A1%8C%E3%81%99%E3%82%8B/)の抜粋版です

* TeraStationの共有フォルダの公開プロトコルにバックアップを追加する
* QNAPのrsyncコマンドでTeraStationの共有フォルダ(バックアップ元)のパスを確認する
  
```
# rsync -avn rsync://admin@[TeraStationのIPアドレス]:873/ .  
array1_win
```

* QNAPの共有フォルダ(バックアップ先)のパスを確認する

```
# ls /share
win@
```

* @マーク付きのパスを調べる

```
# readlink  /share/win
CACHEDEV1_DATA/win
```

* バックアップ元(TeraStationの共有フォルダ)とバックアップ先(QNAPの共有フォルダ)が確定したのでrsyncコマンドを実行する

```
# rsync -avr --dry-run rsync://admin@[TeraStationのIPアドレス]:873/array1_win/ /share/CACHEDEV1_DATA/win
```
本番のときは`--dry-run`オプションを外して実行する
JavaScriptでよくやるArray Sort

:writing_hand: [ramdajs](https://ramdajs.com/)

```javascript:sample.mjs
import R from "ramda";

const arr = [
  { name: "zzz", age: 20 },
  { name: "bbb", age: 5 },
  { name: "bbb", age: 50 },
  { name: "bbb", age: 32 },
  { name: "vvv", age: 8 }
];

// single key
console.table(R.sort(R.ascend(R.prop("name")), arr));
console.table(R.sort(R.descend(R.prop("name")), arr));

// ↑とやりたいこと的にはだいたい同じ
console.table(R.sortBy(R.prop("name"))(arr));
console.table(R.reverse(R.sortBy(R.prop("name"))(arr)));

// multi key
console.table(
  R.sortWith([R.ascend(R.prop("name")), R.ascend(R.prop("age"))])(arr)
);
console.table(
  R.sortWith([R.descend(R.prop("name")), R.descend(R.prop("age"))])(arr)
);
```

```bash:実行(v10.6.0)
node --experimental-modules sample.mjs

┌─────────┬───────┬─────┐
│ (index) │ name  │ age │
├─────────┼───────┼─────┤
│    0    │ 'bbb' │  5  │
│    1    │ 'bbb' │ 50  │
│    2    │ 'bbb' │ 32  │
│    3    │ 'vvv' │  8  │
│    4    │ 'zzz' │ 20  │
└─────────┴───────┴─────┘
┌─────────┬───────┬─────┐
│ (index) │ name  │ age │
├─────────┼───────┼─────┤
│    0    │ 'zzz' │ 20  │
│    1    │ 'vvv' │  8  │
│    2    │ 'bbb' │  5  │
│    3    │ 'bbb' │ 50  │
│    4    │ 'bbb' │ 32  │
└─────────┴───────┴─────┘
┌─────────┬───────┬─────┐
│ (index) │ name  │ age │
├─────────┼───────┼─────┤
│    0    │ 'bbb' │  5  │
│    1    │ 'bbb' │ 50  │
│    2    │ 'bbb' │ 32  │
│    3    │ 'vvv' │  8  │
│    4    │ 'zzz' │ 20  │
└─────────┴───────┴─────┘
┌─────────┬───────┬─────┐
│ (index) │ name  │ age │
├─────────┼───────┼─────┤
│    0    │ 'zzz' │ 20  │
│    1    │ 'vvv' │  8  │
│    2    │ 'bbb' │ 32  │
│    3    │ 'bbb' │ 50  │
│    4    │ 'bbb' │  5  │
└─────────┴───────┴─────┘
┌─────────┬───────┬─────┐
│ (index) │ name  │ age │
├─────────┼───────┼─────┤
│    0    │ 'bbb' │  5  │
│    1    │ 'bbb' │ 32  │
│    2    │ 'bbb' │ 50  │
│    3    │ 'vvv' │  8  │
│    4    │ 'zzz' │ 20  │
└─────────┴───────┴─────┘
┌─────────┬───────┬─────┐
│ (index) │ name  │ age │
├─────────┼───────┼─────┤
│    0    │ 'zzz' │ 20  │
│    1    │ 'vvv' │  8  │
│    2    │ 'bbb' │ 50  │
│    3    │ 'bbb' │ 32  │
│    4    │ 'bbb' │  5  │
└─────────┴───────┴─────┘
```

:moyai: 「...ramdajsほんま便利や」
atom-beautifyで.vueを整形した時にpugのインデントが気に食わない

タイトル時点で何かニッチな感じがする。時間のないときに限って気になってしまうものですよね…。

# なんの話か

Vueの単一コンポーネントファイル`*.vue`をatom-beautifyで整形すると、まあまあうまいこと整形するんですよね、恐ろしいことに。ところが、`<template lang="pug">`で使っていると、なぜかここだけインデントがタブになる。なぜだ。

# ヒント

みんな（？）困ってるわけです。

* [Wrong indent char when beautify \<template lang='pug'\> part in vue files. #1747](https://github.com/Glavin001/atom-beautify/issues/1747)

コード弄ったら直ったよ、的なのがヒントです。pug-beautifyのコードいじってるみたいですが、いやいやそもそもこれってオプションがきちんと渡ってないってことなんでは。それ以前にオプションってなによ。

# オプションとは何か

なんだか気になってしまったので追いかけることにしました。Atomは恐ろしいことにデバッグコンソールが出せるんですよね。使ってますか。なんなんだこのエディタ。

読み込まれているファイルのツリーから怪しげなものを探し…まあ`atom-beautify/src/beautifier/vue-beautifier.coffeescript`でしょうね。

中を読んでみると、正規表現でtemplate, style, scriptの各タグを切り分けて、さらにlangも読んで適切なbeautifierに渡すようになっています。なるほどなるほど。なんだか想像がついてきましたが、ブレークポイントを入れて中身を見てみますか。

<img width="551" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/34122/f1d6d32d-2946-0c89-4088-d8e371544a70.png">

うん。何かこれ見たことある。atom-beautifyのVue設定にある項目ですよね。それがそのまま渡されている。**pug-beautifyに。**

pug-beautifyの設定は

```
fill_tab : true/false,default true, fill whether tab or space.
omit_div : true/false,default false, whether omit 'div' tag.
tab_size : number, default 4, when 'fill_tab' is false, fill 'tab_size' spaces.
```

だそうです（<https://www.npmjs.com/package/pug-beautify>）。atom-beautifyのVue設定項目とは互換性なさそう。

**だけど結局、設定が単純に渡されているだけだから、自分で書けばいい。**

# 結論

**config.csonのatom-beautify設定に以下のようなものを追加する。**

```yaml
"*":
  "atom-beautify":
    vue:
      fill_tab: false
      tab_size: 2
```

# 考察

これ、こういう仕様なのかもではあるのだけれど、atom-beautify/vueの設定をそのまま渡すんじゃなくて、きちんとコンバートすればいいだけなんでは。こういう感じに。

```diff
diff --git a/src/beautifiers/vue-beautifier.coffee b/src/beautifiers/vue-beautifier.coffee
index 6c693b9..764749b 100644
--- a/src/beautifiers/vue-beautifier.coffee
+++ b/src/beautifiers/vue-beautifier.coffee
@@ -22,7 +22,10 @@ module.exports = class VueBeautifier extends Beautifier
           when "template"
             switch lang
               when "pug", "jade"
-                require("pug-beautify")(text, options)
+                require("pug-beautify")(text,
+                  fill_tab: options.indent_with_tab
+                  tab_size: options.indent_size
+                )
               when undefined
                 require("js-beautify").html(text, options)
               else
```

ただ実際やってみると、`options.indent_size`の設定が読めてない（デフォルトから上書きされていない）気がする。それはAtom側の仕様のような…余裕のあるときにちゃんと追いかける…かもしれない…。

# おまけ

設定を書き加えるとおもむろに出てくるUI。

before:
![before.png](https://qiita-image-store.s3.amazonaws.com/0/34122/4c471916-7209-7fa5-8f8d-ddfc02c836e9.png)

after:
![after.png](https://qiita-image-store.s3.amazonaws.com/0/34122/37b3fa9f-cf41-1770-ae54-ebe6e6790d1b.png)

デフォルトのインターフェイスにはないけれど値が追加されると、とりあえず出しておこう、みたいになるんでしょうか（調べてない）。
Laravelのリレーションについて

Laravelでリレーションがしたいときはモデルに記述する必要があります。
１対１の場合はこんな感じ↓

```php
public function phone()
    {
        return $this->hasOne('App\Phone');
    }
```
例えばAiueoというモデルにこれを記述すると、aiueosテーブルのphone_idとphonesテーブルのidが紐付き、aiueosテーブルからselectしてきたときにphonesテーブルから取得したデータがオブジェクトとして入ってきます。

aiueosテーブルのカラム名がiphone_idではない場合は、
↓↓↓↓↓↓↓ あなたの記事の内容
`return $this->hasOne('App\Phone', '自分のテーブルの該当カラム名', '紐づけたいテーブルののカラム名');`
───────
return $this->hasOne('App\Phone', '自分のテーブルの該当カラム名', '紐づけたいテーブルのカラム名');
↑↑↑↑↑↑↑ 編集リクエストの内容
のような形で記述しなければいけない。

多対１の時は逆なので注意
例：`return $this->belongsTo('App\Phone', '紐づけたいテーブルのカラム名', '自分のテーブルの該当カラム名');`

1対多の時はこれ
`return $this->hasMany('App\Phone', '紐づけたいテーブルのカラム名', '自分のテーブルの該当カラム名');`
しかし、僕がこれでやった時はなぜか失敗
`return $this->hasMany('App\Phone'）`
これだとなぜか上手くいった・・・謎

hasOneだけでいいじゃん、belongsToとかいらないじゃんとか思う人もいると思う。
でも従属テーブルのidでSELECTかけたいときとかに必要になるから頭の片隅に入れといてね

後、hasManyで自分のidから紐付さきのテーブルの行をまとめて削除する方法とかあるのかな？あったら便利

終わり
SSHのパスワード認証設定をする

# はじめに
サーバにログインするための一般的な方法であるSSHについて、パスワード認証の設定方法を勉強します。

# 環境
・CentOS7サーバ2台
・sshdインストール済
・ユーザ名jinnai73、パスワードxxxxでログインできる設定をする

# ユーザの作成
接続先サーバ側で、ユーザとパスワードの設定を行います。以前書いた以下の記事を見ながら実施しました。
[Linuxユーザアカウントの管理コマンド](https://qiita.com/jinnai73/items/1a639a71a5e726dc2392)

```text:接続先サーバ
[root@sv11-centos74 ~]# useradd jinnai73
[root@sv11-centos74 ~]# passwd jinnai73
ユーザー jinnai73 のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
```

# パスワード認証によるSSH接続の許可
SSHサーバの設定で、パスワード認証の許可を行います。編集する設定ファイルは/etc/ssh/sshd_configにあります。デフォルトではパスワード認証が許可されていますが、クラウド環境では以下のように、インスタンス起動時に禁止になっていることも多いです。

```text:接続先サーバ
[root@sv11-centos74 ~]# grep 'PasswordAuthentication ' /etc/ssh/sshd_config
#PasswordAuthentication yes
PasswordAuthentication no
```

viで該当行を削除して、sshdを再起動します。

```text:接続先サーバ
[root@sv11-centos74 ~]# vi /etc/ssh/sshd_config
[root@sv11-centos74 ~]# systemctl restart sshd
```

# アクセス
接続元サーバから、sshコマンドでログインします。

```text:接続元サーバ
[root@sv10-centos74 ~]# ssh jinnai73@10.33.0.130
jinnai73@10.33.0.130's password: 
Last login: Thu Jul  5 01:30:32 2018
                                                             
[jinnai73@sv11-centos74 ~]$
```

できました！

# まとめ
パスワード認証によるsshアクセスをするためには、以下が必要です。
・アクセス先にユーザ名とパスワードが設定されていること
・アクセス先のsshdでPasswordAuthenticationがnoになっていないこと
[Swift4] URL指定した画像を非同期でUIImageViewにセットする、便利なExtension

# こう使えるようになる
```swift
let url: URL? = URL(string: "https://hogehoge")
sampleImageView.loadImageAsynchronously(url: url, defaultUIImage: fugafugaUIImage)
```

## 活躍する場面
例えば、サーバーから取得した**画像URLをもとに、TableViewを構成する時**。
同期的にUIImageをセットしていては、カクカクの悲しいTableViewになってしまう。
そんな時、↓のようなextensionを使えば、**滑らかなTableView**を取り戻し幸せになれる！

# extension
```swift
// 指定URLから画像を読み込み、セットする
// defaultUIImageには、URLからの読込に失敗した時の画像を指定する
extension UIImageView {
    func loadImageAsynchronously(url: URL?, defaultUIImage: UIImage? = nil) -> Void {

        if url == nil {
            self.image = defaultUIImage
            return
        }

        DispatchQueue.global().async {
            do {
                let imageData: Data? = try Data(contentsOf: url!)
                DispatchQueue.main.async {
                    if let data = imageData {
                        self.image = UIImage(data: data)
                    } else {
                        self.image = defaultUIImage
                    }
                }
            }
            catch {
                DispatchQueue.main.async {
                    self.image = defaultUIImage
                }
            }
        }
    }
}
```

補足: Viewの更新はメインスレッドで行わなければいけない。ので、`DispatchQueue.main.async`内で更新している。
RailsのAMSについて学ぶ(has_many/has_oneとroutes)_100DaysOfCodeチャレンジ17日目(Day_17:#100DaysOfCode)

# はじめに

この記事はTwitterで人気のハッシュタグ`#100DaysOfCode`をつけて、
100日間プログラミング学習を続けるチャレンジに挑戦した17日目の記録です。

## 動作環境

* ruby 2.4.1
* Rails 5.0.1

## 現在学習している内容のリポジトリ

https://github.com/yuta-ushijima/notebook-api-on-rails

## 本日学んだこと

* has_manyとroutesの関係
* has_oneとroutesの関係

## has_manyとroutesの関係

belongs_toと同様に、has_manyの関係においても親子関係をネストさせてroutesで表現することができます。

ただし、belongs_toやhas_oneと違うのは、単一リソースでも表記が複数形になるという点。

### 例:Contactモデルからみて、Phoneモデルはhas_manyの関係にある

```
Rails.application.routes.draw do
  resources :contacts do
    # Phoneモデルとのネストされたroutes(has_many)
    resource :phones, only: [:show]
    resource :phones, only: [:show], path: 'relationships/phones'
  end
end
```

上記のコードによって、下記のようなルーティングが生成されます。

| Helper | HTTP/Verb | Path | Controller#Action |
|:--:|:--:|:--:|:--:|
| contact_phones_path | GET | /contacts/:contact_id/phones(.:format) | phones#show  |
| | GET | /contacts/:contact_id/relationships/phones(.:format) |phones#show|


## has_oneとroutesの関係

has_oneもbelongs_toやhas_manyと同様に、親子関係をネストさせてroutesで表現することができます。

has_oneはその名の通り、Contactモデルに対して紐付くオブジェクトが1つだけなので、belongs_to同様にシンボルで渡すモデル名は単数形です。

### 例:Contactモデルからみて、Phoneモデルはhas_manyの関係にある

```
Rails.application.routes.draw do
  resources :contacts do
    # Addressモデルとのネストされたroutes(has_one)
    resource :address, only: [:show]
    resource :address, only: [:show], path: 'relationships/address'
  end
end
```

上記のコードによって、下記のようなルーティングが生成されます。

| Helper | HTTP/Verb | Path | Controller#Action |
|:--:|:--:|:--:|:--:|
| contact_address_path | GET |　/contacts/:contact_id/address(.:format) | addresses#show  |
| | GET | /contacts/:contact_id/relationships/address(.:format) |addresses#show|

※controller名は必ず複数形にする命名規則があるので、addressesとなっています。
Spring Bootで実装するWebAPIのアーキテクチャを考える

[Spring Boot + MySQLでシンプルなWeb REST APIサーバを実装する - Qiita](https://qiita.com/YutaKase6/items/007f6b7d12d342c1330c)

# Outline
Spring bootを使ったWebAPIのアーキテクチャ、クラス設計を考える。
Springの思想?に則り、3層アーキテクチャを採用する。

# 3層アーキテクチャ
以下のような3層を定義する。
<img width=512 src="https://qiita-image-store.s3.amazonaws.com/0/90526/d62889c1-9fe9-23a5-0060-47059df7909f.png">


# 各層の役割
- アプリケーション層
    - UI
    - クライアントとの入出力とビジネスロジックをつなぐ
- ドメイン層
    - ビジネスロジック
    - ドメインを表現するオブジェクト、手続きたち
- インフラ層
    - 永続化の実装
    - 他サービスとの通信等の実装


# 基本的なルール
以下を定義する

- ドメイン層は、他の層に**依存してはならない**
- アプリケーション層、インフラ層はドメイン層に依存して良い

このルールにより以下のような成果物となる

- ビジネスロジックが明確になる
- UIからロジックが独立する
- 永続化(ストア)の実装からロジックが独立する
- テスタブル

<img width=512 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90526/e4cbb97e-204a-2dc1-d39e-4382a425e8a7.png">


# パッケージ構成
```
.
├── SpringApiApplication.java
├── application
│   ├── controller
│   │   ├── ControllerExceptionHandler.java
│   │   └── UserController.java
│   └── resource
│       ├── ErrorResponse.java
│       └── UserBody.java
├── domain
│   ├── exception
│   │   └── NotFoundException.java
│   ├── object
│   │   └── User.java
│   ├── repository
│   │   └── UserRepository.java
│   └── service
│       └── UserService.java
├── infrastructure
│   ├── entity
│   │   └── UserEntity.java
│   └── repository
│       ├── UserJpaRepository.java
│       └── UserRepositoryImpl.java
```

# 各パッケージの解説
## Application層
### Resource
リクエストやレスポンスのオブジェクト
### Controller
入出力とサービスのマッピングをする

## Domain層
### Domain Object
ビジネスを行う上で必要なモデルを表現するオブジェクト
### Service
ビジネスロジック本体
### Repository Interface
Infrastructure Layerとのインタフェース
依存関係逆転の原則ってやつ
### Exception
Exceptionたち

## Infrastructure層
### Entity
通信時の構造体を表現するオブジェクト 
### Repository Implement
Repository Interfaceの実装。
SQL Server Management Studio と BCP で空文字とNULLのファイル上での扱いが異なる

# 概要

SQLServerManagementStudion (以下 SSMS) と BCP のそれぞれで、ファイルへ NULL と空文字を出力した場合、出力結果が異なります。データ登録時も、両者で NULL と空文字の扱いが異なることで、SSMS で出力した内容を BCP で登録したり、BCP で「上位200行の編集」で開いたテーブルに直接コピペで反映した場合に予期せぬ値として登録されてしまうことがあります。

# 詳細

## ファイルへの出力時

表の中はそれぞれの値の出力結果になります。

|【対象】|【NULL】|【空文字(スペース0)】|【空文字(スペース1)】|
|:--|:--|:--|:--|
|SSMS|**NULL**|空文字(スペース0)|空文字(スペース1)|
|BCP|**空文字(スペース0)**|**空文字(スペース1)**|空文字(スペース1)|

## ファイルからの登録時

表の中はそれぞれの値の登録結果になります。

|【対象】|【NULL】|【空文字(スペース0)】|【空文字(スペース1)】|
|:--|:--|:--|:--|
|SSMS|**NULL**|**空文字(スペース0)**|空文字(スペース1)|
|BCP|**'NULL'**|**NULL**|空文字(スペース1)|

# 結論

- SQLServerManagementStudioで出力したファイルをBCPで取り込まない。
- BCPで出力したファイルをSQLServerManagementStudioで取り込まない。

# 補足

## Oracle(SI Object Browser)

SI Object Browser は、BCP の入出力結果と考え方が同じのようです。ですので、Oracle <--> SQLServer 間でちょこっとデータ移行をやる場合は、SI Object Browser <--> BCP でのやり取りがよいみたいです。 

# 編集後記

今回、初投稿です。書きっぷり含めてアドバイスがあれば、ぜひお願いします。
1行目～X行目の出力，Y行目～最後までの出力

FBでTLを見ていて，出ていた話を調べたメモ

参考
[Man page of SED](https://linuxjm.osdn.jp/html/GNU_sed/man1/sed.1.html)
[Man page of ED](https://linuxjm.osdn.jp/html/GNU_ed/man1/ed.1.html) (sedのscriptのとこにはedのコマンドを入れれば良いので，合わせて読むと良い）

```:targetfile
1
2
3
4
5
6
7
8
9
10
```

```shell:3行目～8行目のみ表示
sed -n -e '3,8p' targetfile
3
4
5
6
7
8
```

```shell:1～3行目，8行目～最後のみ表示
sed -n -e '1,3p' -e '8,$p' targetfile
1
2
3
8
9
10
```

行数指定のところは，``ed``コマンドのパターンマッチとか使ってもいいよ．
ThingSpeakに登録してcurlでデータを送ってグラフを表示するまで

# 背景
データを集めて表示したい。

# ThingSpeak
REST APIとかMQTT APIでデータを送ると保存して表示したり解析させてくれたりするサービス。制限ありで無償。
ラズパイとかで収集した温度データを定期的にアップロードしてグラフにして見れたりする。

もともとオープンソースやったプロジェクトをMATLABで有名なMathWorksが買収？して運営してるっぽい。
MATLABつかった解析もできたり、MATLABとの親和性が高い。

[IoT Analytics - ThingSpeak Internet of Things](https://thingspeak.com/)

[ThingSpeak Documentation - MathWorks 日本](https://jp.mathworks.com/help/thingspeak/index.html)

[GitHub - iobridge/thingspeak: ThingSpeak is an open source “Internet of Things” application and API to store and retrieve data from things using HTTP over the Internet or via a Local Area Network. With ThingSpeak, you can create sensor logging applications, location tracking applications, and a social network of things with status updates.](https://github.com/iobridge/thingspeak)

# 登録
ThingSpeakのサイトからポチポチしてたらできる。
![IoT Analytics   ThingSpeak Internet of Things.png](https://qiita-image-store.s3.amazonaws.com/0/184221/c18c96a9-84f8-cd4f-75f6-e3e72cc101f6.png)

アカウントは、MathWorksアカウントでSign Inできる。
![Sign Up   ThingSpeak IoT.png](https://qiita-image-store.s3.amazonaws.com/0/184221/1b80e459-7020-7a66-cbe1-07e214f06fe7.png)

# Channel
Sign Inしたら、Channelっての作る。
![My Channels   ThingSpeak IoT.png](https://qiita-image-store.s3.amazonaws.com/0/184221/f270232c-2888-c92f-1375-cf889d316f6a.png)

いろいろあるけど、適当にNameとFieldさえ記入してたら大丈夫な気がする。
![Channels   ThingSpeak IoT.png](https://qiita-image-store.s3.amazonaws.com/0/184221/fbcf67a6-3407-ffa3-dce8-98266a5a3569.png)

こんな感じで空のグラフが出て来る。経度と緯度も入れたら地図もでてきた。経度緯度はGoogle Mapで取得した。
![Home Data   ThingSpeak IoT.png](https://qiita-image-store.s3.amazonaws.com/0/184221/9899fda5-4b64-0b29-3402-d1946c8916ec.png)

# データ送信
とりあえず、curl使った。
GETでもPOSTでもいいっぽい。こんな感じで書いたら、field2にデータが送信される。

```
curl 'https://api.thingspeak.com/update?api_key=xxx&field2=10'
curl -w '\n' 'https://api.thingspeak.com/update' -d 'api_key=xxx&field2=2'
curl https://api.thingspeak.com/update?api_key=xxx\&field2=8
```
※`xxx`を自分のAPI Keyでおきかえ。

# グラフ表示
グラフかけたとこ。このままやとそっけないけど、いろいろできるらしい。
![Home Data   ThingSpeak IoT (1).png](https://qiita-image-store.s3.amazonaws.com/0/184221/1565d3a2-ca5f-a8a5-3230-dd75ade808d6.png)


# 参考にしたとこ
[データを簡単に保存&グラフ化できるThingSpeakが便利！ - iwathiの/var/log](http://iwathi3.hatenablog.com/entry/Data-to-Graph-ThingSpeak)

[curlコマンドを使って複数パラメータを持つGETリクエストを投げる - ike-daiの日記](http://d.hatena.ne.jp/ike-dai/20111114/1321265245)
クラス変数はなぜ必要なのか【Java】

# はじめに
<!-- Javaのバージョンは1.8.0_161です。エディタにはSublime Text3を使用しました。-->
<!-- Javaにはクラスメソッドとインスタンスメソッドの2種類があることを知りました。-->
Javaを習いたての時期には、
「クラスをインスタンス化することで、そのクラスが持つ変数を使用できるようになる」
と教わることが多いかと思います。

しかし変数の宣言時にstaticを書いた場合、クラスをインスタンス化せずに、その変数を使用できます。

本記事では、なぜインスタンス化なしで使用できる変数があるのか、について紹介します。

# クラス変数とは
クラス変数とは、インスタンス化せずに使用可能な変数のことです。
クラス変数が役立つ場面は、インスタンス化されて生成された各オブジェクトに共通する変数が必要となった場合です。
また、クラス変数を使用する場合は

```
(クラス名).(クラス変数名)
```

とします。クラスの持ち物である感じが出ています。


一方でインスタンス変数を使用する場合は

```
(インスタンス名).(インスタンス変数名)
```

とします。インスタンスの持ち物である感じが出ています。

# クラスに所属する変数
例えば、半径を入力すると円の面積を計算してくれるCircleクラスを考えます。

半径を入力するたびに、Circle型のオブジェクトが生成されます。
各オブジェクトはそれぞれ独自の半径をインスタンス変数として持っています。
しかし、生成されたオブジェクトの個数を数える場合、各オブジェクトに属するインスタンス変数ではなく、クラスに属する変数があると便利です。

```java:Main.java
public class Main{
    public static void main(String args[]){

        for (int i = 0; i < args.length; i++){ // コマンドライン引数に半径を入力
            double r = Double.parseDouble(args[i]);
            Circle circle = new Circle(r);     // Circle型オブジェクトの生成
            System.out.println("Area : " + circle.getArea());
        }

        System.out.println("The number of Circle objects : " + Circle.numberOfCircles);

    }
}
```
```java:Circle.java
public class Circle{

    private double radius; // 円の半径
    private double area;   // 円の面積

    public static int numberOfCircles = 0; // クラス変数（Circleオブジェクト数を表す）

    public Circle(double r){
        radius = r;
        numberOfCircles++; // Circle型オブジェクトが生成される度にインクリメントされる
    }
    
    public double getArea() {	
    	return Math.pow(radius, 2) * 3.14;	
    }
}
```

Main.javaを以下のように実行すると、、、

```
java Main 3 4 5 6
```

実行結果が

```
Area : 28.26
Area : 50.24
Area : 78.5
Area : 113.04
The number of Circle objects : 4
```

となります。

# まとめ
クラス変数は、インスタンス化された各オブジェクトから共通してアクセスすることができます。
上記のつたない例では伝わりにくいと思いますが。。

随時、訂正と加筆をしていく予定です。
2018/09/09 : Circleクラスに面積を返すメソッドを追加しました。

<!--Oracle社の[The Java<sup>TM</sup> Tutorials](https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html)には以下のように記載されていました。
和訳は怪しいですが、ご容赦ください、、、
>同一のクラスから複数のオブジェクトが生成された場合、それぞれが異なるインスタンス変数を持つ。自転車クラスの場合、ペダルを回す速さ、ギア、スピードなどがインスタンス変数として挙げられる。自転車型の各オブジェクトは、これらの変数に対してそれぞれ独自の値を持ち、異なるメモリアドレスに保存される。
>
>全てのオブジェクトに共通する変数が必要になったとき、static修飾子を付加すればよい。static修飾子を宣言時に付加されたフィールドは、静的フィールドまたはクラス変数と呼ばれる。これらは各オブジェクトではなくクラスと関連付けられる。
>(以下略)

申し訳ないですが、長くなりそうなので序盤のみの紹介としました。-->
nginxとcarrierwaveを使ってサーバー上の任意の箇所に画像を保存する

Capistranoを使ってサーバー上にデプロイすると、毎回別のディレクトリができて、
currentフォルダからのショートカットになりますが、
carrierwave等でプロジェクト内に画像等を保存している場合はそれじゃ困ると思いますので、
別パスに保存したい。
(S3等に保存していて気にしていない人がほとんどかもしれませんが。。。)

プロジェクト内の任意のパスに画像を保存するには下記の設定を変えればできたので、
備忘として残しておきます。

``` /etc/nginx/conf.d/app.conf
    location / {
      try_files $uri/index.html $uri.html $uri @unicorn;
    }

    location @unicorn {
      # HTTP headers
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto https;
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_pass http://ドメイン;
    }

　　　　　　　　# ここで画像を保存したいパスを指定
    location /home/app/uploads {
      root /;
    }

```

これで「https://ドメイン/home/app/uploads/…」等にアクセスされた時は
サーバー内の「/」がルートパスとなるので、
「/home/app/uploads」配下を見に行くようになります。

で、プロジェクト内のuploaderファイルのstore_dirを下記のように変えます。

``` image_uploader.rb
  def store_dir
    #"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
    "/home/app/uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

```

これで「/home/app/uploads」配下に画像をアップロードするようになりました。
あ、「/home/app/uploads」のアクセス権限を正しく設定するのをお忘れなく。

もっといい方法があれば教えて下さい。
MySQL5.7 community Windows版インストール


インストーラを使って任意のディレクトリにインストールする方法
<font color=gray>もしかすると他のバージョンでも使えるかもしれないが、</font>

初期状態では、インストーラを進めると、インストールディレクトリ（パス）
を聞いてこず、`My.INI`ファイルが`ProgramData`に入ってしまうとか、
データフォルダが`Program Filesm`に入っていて、何だか管理しにくい
わたしゃ　<font color=blue>ドライブ直下に置きたい</font>のだ。 

もしかして、インストーラから、任意のディレクトリにインストール出来ないのか？
と試行錯誤の結果、まあ、あったということで以下メモ

###まずこのフォルダを作っておく
`C:\Program Files\MySQL\MySQL Server 5.7`
<font color=red>これがミソ</font>

###その後、インストーラを起動する
インストールする種類は`Server Only`（データベース単体）
途中でパスを聞いてくるので
installのディレクトリとデータファイルのディレクトリをそれぞれ
`C:\MySQL\MySQL Server 5.7`
と設定


###その後の設定はお好みで
`Account and Roles`が設定できるので、`Root`のパスワードと、ユーザ追加が可能
`DB Admin`のユーザをもうひとつ追加しておくなど

###インストールが進み
Ready to configure
の状態となったら、ログファイルのディレクトリを作ってやる
`C:\MySQL\MySQL Server 5.7\log`

###Advanced Options の画面では
ログファイルの置き場はすべて
`C:\MySQL\MySQL Server 5.7\log`
の下に来るように設定する。
※この時点でlogのディレクトリが作成されていないと、次の画面で、DBがスタートしないので注意

###後は適当に進む

しかしまあこのインストーラって少々デキが悪く、Reconfigが効かないときがあるので、一気にやってしまうことを推奨
途中でインストールがおかしくなったら、プログラムから、Mysql-Installerを起動し、リストからMySQL ServerをRemoveする。（再起動はやむなし）

###さて、無事インストールが完了したら
サービスのプロパティを出し、「実行ファイル」が
`"C:\MySQL\MySQL Server 5.7\bin\mysqld.exe" --defaults-file="C:\MySQL\MySQL Server 5.7\my.ini"`
となっていれば、<font color=bule>OK</font>
あとはワークベンチから`my-ini`が読めたらな....
AtCoder B - A to Z String pythonで解いた際のメモ

・B - A to Z Stringの問題のメモ
https://beta.atcoder.jp/contests/abc053/tasks/abc053_b

<問題の概要>
"QWERTYASDFZXCV"のようなランダムな文字列が与えられ、その中でAから始まってZから終わる部分を抜き出して、その間の文字数をカウントするということ。上の文字列の場合は"ASDFZ"が抜き取ることができ、その長さは５なので、それを表示するということ。

<自分の回答>

```
a = input()
b = ""
c=""
counterf=0
counter =0


for x in a:
    if x == "A":
        b+=x
        counterf +=1
    elif counterf >=1:
        b+=x
        
for x in b[::-1]:
    if x == "Z":
        c+=x
        counter+=1
    elif counter >=1:
        c+=x
print(len(c))
```

やり方は最初からAで始まる場所を探して抜き取る、そして文字列を逆から読み取ってZから始まる部分を抜き取るそしてA-Zの文字列を作るというもの。でもこのやり方はfor文を２回使う必要があり面倒だなと感じた、他の方の回答でいいと思ったのでメモしておく。

```
# -*- coding: utf-8 -*-

s = input()

print(s.rfind("Z") - s.find("A") + 1)

```

この方法は、findとrfindを使う方法
findは文字列を左から検索して該当の文字列が最初に検索ヒットする場所のインデックス(なんばんめの文字か)を検索してくれる。
rfindは右から検索してくれるだから、右からAの検索、左からZの検索をすればその間どのくらい文字列があるのかはわかるということ。


```
atoz = list(input())
A_num = 0
Z_num = 0
for i, j in enumerate(atoz):
    if j == "A" and A_num == 0:
        A_num = i + 1
    elif j == "Z" and A_num < i:
        Z_num = i + 1
    else:
        pass
    
print(Z_num - A_num+1)

```
これは関数のenumerateを使用する方法。
enumerateはiterator(今回だとリストに格納している)のそれぞれのオフセット番号とそれぞれの中身をタプルで返している。
それでそれぞれの番号でAが最初に見つかる→最初に見つかる場合
Zが最後に見つかるオフセットの番号→Zが出るたびに、その番号を上書きして更新すれば最終的に一番最後の番号が出る。
でもAが始まった後のZだけ見つけたいので、Aが見つかった場合に変数に1を足して、その変数が1以上ならその処理をするというif文を書けばいい。


<感想>
まだ関数型プログラムやオブジェクト指向型プログラミングや命令型プログラミングなど、様々なプログラミングの手法があるがまだどう違うのか理解できていない。それぞれ調べて意識しながらコードをかける様目指す。あとHTMLやCSSなどやりたい勉強もあるからそっちも手を抜かずに頑張ります。
Gitリポジトリをまとめて操作するコマンドを作る

カレントディレクトリ以下のGitリポジトリをまとめて操作するコマンドを作ってみた。

```bash
#!/bin/zsh

SILENT=0
if [[ $1 = "-s" ]]; then
	shift
	SILENT=1
fi

declare -a COMMAND=(git --no-pager $argv)
if [[ $1 = "!" ]]; then
	shift
	COMMAND=($argv)
fi

for D in $(find -L $PWD \( -name vendor -o -name node_modules \) -prune -o -type d -name .git -print -prune)
do
	cd $(dirname $D)
	[[ $SILENT = 0 ]] && echo -e "\e[37;44;1m${PWD}\e[m"
	$COMMAND[*]
done
```

使いかたは `git-recursive pull` や `git-recursive status` のように使う。 カレントディレクトリ以下のGitリポジトリで pull したり status が見れる。複数のリポジトリを操作した後に、 `push` し忘れてるとかを簡単に確認できる。また、　`git-recursive ! ls` のように `!`　を使うとGitのサブコマンド以外も実行できる。

色をつけたり `-prune` で打ち切って高速化していたりしている。元々は xargs でワンライナーにして Ctrl+r で引っ張りだしていたけど、拡張していくうちに複数行にした。並列化しても良いが status が意味不明になるのが嫌でやめた。並列化オプションとかつけても良いと思うけど面倒なので誰か頑張ってほしい。

## 使用例

```bash
# 全部の status
git-recursive status
# 全部 pull
git-recursive pull
# 全部の最後のログ
git-recursive log -n1
# node_modules 以外から git grep
git-recursive grep TODO -- ':!/node_modules/'
git-recursive grep "// TODO:" -- ':!/vendor/' 
# 全部で make
git-recursive ! make
# 全部のパスを表示（-s でリポジトリの場所の表示をやめる）
git-recursive -s ! pwd
```
C#アプリのインストーラーを作成する


作ってみる。

# インストーラープロジェクトのインストール
「新しいプロジェクトの追加」に[その他のプロジェクトの種類]-[Visual Studio Installer]がない場合は[ツール]-[拡張機能と更新プログラム]から「Microsoft Visual Studio 2017 Installer Projects」をインストールします。または[Microsoft Visual Studio 2017 Installer Projects](https://marketplace.visualstudio.com/items?itemName=visualstudioclient.MicrosoftVisualStudio2017InstallerProjects) (InstallerProjects.vsix)をダウンロードしてインストールします。

# インストーラーの設定

# インストーラーの作成

セットアッププロジェクトをビルドします。

# 参考にさせていただいたページ
[Visual Studio 2017 インストーラの作成 セットアップウィザード](https://sys-guard.com/post-14669/)
Windows10にDockerを入れてJupyter Notebookをコンテナで動かす

# はじめに

[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb)上でお手軽にWebスクレイピングとかしてみたかったけど、ログインが必要なページ等は無理そうなので方向を変えてWindows 10上のDockerコンテナで構築してみる。

まずは、試しに[Jupyter Notebook](http://jupyter.org/)を動かしてみる。

## 環境

- Windows 10 Pro (1803)

## Docker for Windowsのインストール

- [公式ページ] (https://docs.docker.com/docker-for-windows/install/) からダウンロード
  - DockerIdが必要なので、未登録の場合は登録してからDLする
- インストーラーを起動してインストール

## Dockerの動作確認

WindowsPowerShell等で下記コマンドを実行してhello worldのイメージが起動することを確認

```
$ docker run hello-world
```

```
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9db2ca6ccae0: Pull complete
Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/
```

## Jupyter Notebookの公式イメージからコンテナを起動

```
$ docker run -d -p 8888:8888 -v ${pwd}:/home/jovyan/work jupyter/scipy-notebook start-notebook.sh --NotebookApp.token=''
```

## ブラウザでアクセス

```
http://localhost:8888
```

NotebookApp.tokenを空文字にして起動しているのでパスワード入力無しでアクセス出来ます。
また、-vでコンテナを起動したディレクトリをマウントしているので、保存したファイル等はその場所に永続化されます。

[以前](https://qiita.com/FrozenVoice/items/966d2778086f2b707922)にGoogle Colaboratory上で動かしてみた気温グラフ表示もJupyter上で動きました。

![02.png](https://qiita-image-store.s3.amazonaws.com/0/165884/a6bf06fb-d581-4ebe-ab20-bb9502be4e1e.png)
Visual Studio Codeのプロジェクトを直接開く


## 動機
[Project Manager](https://marketplace.visualstudio.com/items?itemName=alefragnani.project-manager)でプロジェクトの管理をしているが、Visual Studio Code自体を起動する時、ついでにプロジェクトを開くことができない。

起動してからプロジェクトを開くのがめんどいので、直接開いて欲しい。

## プロジェクトデータの実態
`C:\Users\<ユーザー名>\AppData\Roaming\Code\User\projects.json`に格納されている。

## 実装例
### アクセス方法
[fenrir](http://hp.vector.co.jp/authors/VA026310/soft2.htm)で検索できるよう、各プロジェクトをひとつのフォルダにまとめる。

Windowsショートカットとかシンボリックリンクでもいいのだが、今回はEnterだけでVisual Studio Codeを起動できるよう、「Visual Studio Codeで指定フォルダを開く」ショートカットとする。

### jq
jsonファイルの処理には[jq](https://stedolan.github.io/jq/)を使う。

### コマンドプロンプトでプロジェクトパスの一覧を作成
マルチルートプロジェクトが混じってると面倒だが、とりあえずそれは考えないで、1プロジェクト1ルートだとしてパスの一覧を作成する。

jqはutf-8で書かれているので、`chcp`でコードページをutf-8に変更しないと動作しない……とのこと。

```bat
cd %USERPROFILE%/AppData/Roaming/Code/User
chcp 65001
cat projects.json | jq -r ".[].rootPath" > projects.txt
```

これで、各プロジェクトのルートパスが記述されたテキストファイルができる。

### AutoHotKeyでショートカットを作成
一覧作成も併せて行う。

```ProjectManager.ahk
; コマンドプロンプトを、カレントディレクトリが%USERPROFILE%/AppData/Roaming/Code/User、非表示で実行
Run, cmd /c chcp 65001 && cat projects.json | jq -r ".[].rootPath" > projects.txt, %USERPROFILE%/AppData/Roaming/Code/User, Hide

DestDir = %USERPROFILE%\Projects ; ショートカットを置くディレクトリを指定
editor = C:\Program Files\Microsoft VS Code\Code.exe

If not FileExist(DestDir) ; ディレクトリが存在しなければ作成する
    FileCreateDir, %DestDir%
Loop, Read, projects.txt ; プロジェクト一覧からショートカットを作成する
{
    SplitPath, A_LoopReadLine, OutFileName, OutDir
    FileCreateShortcut, %editor%, %DestDir%\%OutFileName%.lnk, %OutDir%, %A_LoopReadLine%, , ,
    ; [note]
    ; すでに存在する場合は上書きされる
}
```

### AutoHotKeyで自動実行
上記を自動的に実行するようにする。

```Routine.ahk
SetTimer, OnTimer, 300000 ; ミリ秒/5分ごとにタイマーサブルーチンを実行
Return

OnTimer:
    ; 20分 以上操作を行っていなければ
    If ( A_TimeIdlePhysical > 1200000 )
    {
        Run, ProjectManager.ahk ; この場合A_WorkingDirからの相対パス
    }
    Return
```

これでプロジェクトごとのショートカットが作成される。

### 問題
ところが、なぜかショートカット作成時にVisual Studio Codeのパスが`C:\Program Files\Microsoft VS Code\Code.exe`ではなく`C:\Program Files (x86)\Microsoft VS Code\Code.exe`と誤って登録されてしまう。

試しに、単純に`Run`してみても起動しない。どうもAutoHotKeyの一部コマンドで`C:\Program Files`を含むパスが勝手に`C:\Program Files (x86)`に変換されているような感じ。

色々試したが解決しなかったので、暫定的に`C:\Program Files\Microsoft VS Code`から`C:\Program Files (x86)\Microsoft VS Code`へシンボリックリンクしておくことにした。

```bat
mklink /d "C:\Program Files (x86)\Microsoft VS Code" "C:\Program Files\Microsoft VS Code"
```

気味は悪いが、いちおう動作するようになった。
開発現場に加わる時に、Gitで最初にすること(訂正)

#初めての開発現場で
環境構築を完了し、gitにも登録した。
で、そのあと何すりゃいいんだ？って人向けの備忘録。
開発現場のプロジェクトを、自分の環境に持ってこよう！

#Git cloneする
Git プロジェクトを取得するには、大きく二通りの方法があります。
ひとつは既存のプロジェクトやディレクトリを Git にインポートする方法、
そしてもうひとつは既存の Git リポジトリを別のサーバーからクローンする方法です。

今回は後者の
***既存の Git リポジトリを別のサーバーからクローンする方法です。***

新しい現場に参入した時は、***git clone***により、開発中のプロジェクトを、
自分のローカルに持ってくることが通常です（多分）。

なので最初は***git clone***コマンドから始まります。
下記コマンドで、自分のローカルリポジトリに開発中のプロジェクトを持ってきます。

ターミナルで
```$git clone 【持ってくるプロジェクトのURL】```

これでそのプロジェクトのすべてのファイルのすべての歴史が、手元にやってきます。
＊【持ってくるプロジェクトのURL】ってのは、現場の人にgitのアカウントを承認してもらうと、プロジェクトを確認できて、そこで見れるはず。

ちなみにgit cloneは 下記コマンドを全て一度に実行してくれるコマンドです。
・git init
・リモートリポジトリの各種設定
・git pull

git cloneでローカルにプロジェクトを持ってこれたら、プロジェクト上に移動します。
```$cd プロジェクト名```

次にプロジェクト用のデータベースを作ります。
```$rails db:create```
これでcloneしたプロジェクト用のデータベースができるはずです。

＊RailsとDBの接続設定を管理しているファイルは config/database.yml です。

```$rails s```
これで、プロジェクトを確認できるはずです。

*途中、エラーが出ることがありますが、大体がrubyやrailsのバージョン違いによるエラーかと思います。その場合、cloneしたプロジェクトの環境に合わせたバージョンに切り替えてください。



#補足
***Git initとは***
```$ git init```
上記コマンドで、```.git ```という名前の新しいサブディレクトリが作られ、リポジトリに必要なすべてのファイル (Git リポジトリのスケルトン) がその中に格納されます。
簡単にいうと***masterリポジトリ***が作成されます。

***Git pullとは***
リモートリポジトリを、自分のローカルリポジトリにマージする。

***マージ（merge）とは***
別ブランチの変更点を取り込むコマンド。
今回はリモートのリポジトリを全てローカルに持ってきた感じ。


参考
https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-Git-%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E5%8F%96%E5%BE%97


https://qiita.com/yh2020/items/efd888854acf89af5ca7