OmniAICreator/Qiita-1.07M huggingface dataset:
Mac に ndenv で Node.js をインストール

# 概要

先日の投稿で、Mac に anyenv を入れ、その anyenv で ndenv をインストールしました。次は、ndenv で Node.js をインストールします。  
  
[Mac に anyenv をインストール](https://stangler.hatenablog.com/entry/2019/01/18/161956)


[Mac に anyenv で ndenv をインストール](https://stangler.hatenablog.com/entry/2019/01/22/153349)

# Node.js のリストを表示

まず、ターミナルを開いて、以下のコマンドを実行し、ndenv でインストール可能な Node.js のリストを表示します。  
  
```
% ndenv install -l
```

# Node.js のインストール
  
ここでは、最新ではなく、ちょっと前のバージョンをインストールしてみます。  
  
```
% ndenv install v9.11.1
% ndenv rehash
```
  
インストール後の rehash をしておきましょう。私はよく忘れるのですが、これを忘れると Node.js が稼働しません。  
  
# 確認
  
以下のコマンドを実行してバージョンを確認します。  
  
```
% node -v
```

次のように表示されれば OK です。  
  
```
v9.11.1
```
  
# グローバル設定
  
今入れた v9.11.1 を Mac で使うデフォルトの Node.js にしてみます。  
  
```
% ndenv global v9.11.1
```
  
# 別のバージョンをインストールする

次に別のバージョンをインストールして複数バージョンの管理をしてみます。とりあえず、今回は、 v11.7.0 をインストールしてみます。  
  
```
% ndenv install v11.7.0
```

# 複数バージョンの確認
  
以下のコマンドを実行します。  
  
```
% ndenv versions
```
  
以下のように表示され、デフォルトとして設定した v9.11.1 には、アスタリスクがついています。  
  
```
  v11.7.0
* v9.11.1 (set by /Users/XXXXX/.anyenv/envs/ndenv/version)
```
  
# ローカル設定
  
ここでは、特定のディレクトリのみ v11.7.0 を使うローカル設定を行います。temp というディレクトリを作成し、そこに設定してみます。  
  
```
% mkdir temp && cd $_
% ndenv local v11.7.0
```

うまくいったかどうかバージョンを確認してみます。  
  
```
% node -v
```
  
以下のように表示されれば、複数バージョンを同一 Mac 内で管理することが可能になったということです。  
  
```
v11.7.0
```
  
以上です。
progateに載っていなかった情報を書くブログ(主にコマンド）[学習が進み次第,随時追加]

######[railsチュートリアル 3章より](https://railstutorial.jp/chapters/static_pages?version=5.1#aside-when_to_test)
#rails g で失敗した時の戻り方

#####コントローラー編

```
$ rails generate controller StaticPages home help
```

```
$ rails destroy  controller StaticPages home help
```
 ---

#####モデル編


```
  $ rails generate model User name:string email:string
```

```
  $ rails destroy model User
```
---
#####マイグレーション編

```
  $ rails db:migrate
```

```
  $ rails db:rollback
```

#ターミナルコマンド
![スクリーンショット 2019-01-23 15.54.36.png](https://qiita-image-store.s3.amazonaws.com/0/325154/05c73b7b-284c-1865-9373-75b7355557e3.png)

application.html.erbの名前を変えたいとき

```
$ mv app/views/layouts/application.html.erb layout_file
```
application.html.erbに戻すとき

```
$ mv layout_file app/views/layouts/application.html.erb
```
XcodeでFirebaseを導入した後、Thread 1: signal SIGABRTやNo such module 'Firebase'が出たときの有効な解決手段

[公式ページを参考にFirebaseを導入](https://firebase.google.com/?hl=ja)

```


import UIKit
//Firebase用追加コード
import Firebase

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        window = UIWindow()
        window?.rootViewController = UINavigationController(rootViewController: LoginVC())

//Firebase用追加コード
        FirebaseApp.configure()


        return true
    }
```

シミュレータを立ち上げると、
![スクリーンショット 2019-01-21 3.57.07.png](https://qiita-image-store.s3.amazonaws.com/0/325154/f34e1203-b363-8973-d01b-d85581c973e5.png)
エラーが。。。

```
Thread 1: signal SIGABRT
```

別のエラー
![スクリーンショット 2019-01-21 4.00.08.png](https://qiita-image-store.s3.amazonaws.com/0/325154/07408688-5302-4199-74b9-9a6e04714199.png)

``` 
No such module 'Firebase'
```
にも有効な解決手段です。

###解決法
Podfileの中に

```
pod 'Firebase/Firestore'
```
を追加。

ターミナルで

```
pod install
```
をして、
Finder上でアプリケーションを開き
白いアイコンのInstagram.xcworkspaceを開くとエラーが消えてました。
renameコマンド（がうまく使えなかった記録）

# dockerのubuntu

```uauntu:bash
# uname -a
Linux 638cce8bc295 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 x86_64 GNU/Linux
# bash --version
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)

# rename
Usage:
    rename [ -h|-m|-V ] [ -v ] [ -n ] [ -f ] [ -e|-E perlexpr]*|perlexpr
    [ files ]
# rename --version
/usr/bin/rename using File::Rename version 0.20
```

数字ではじまるファイル名
https://qiita.com/kaizen_nagoya/items/2dde95f6b1af1714ebb4
を変更しようと努力中

```
# rename 0 p0 0?.py 
File::Rename::rename: no _code in HASH(0x556823dccf48)
 at /usr/bin/rename line 45.
# rename 0 p0 0* 
File::Rename::rename: no _code in HASH(0x55c3d2e69f48)
 at /usr/bin/rename line 45.
# rename 0 p0 0*.py
File::Rename::rename: no _code in HASH(0x5581b6898f48)
 at /usr/bin/rename line 45.
```

もっと悲しい現象が

```
# rename 1 p1 1?.py
```

エラーがでないが、何も変わっていない。

# 文書履歴(document history)
ver. 0.01 初稿 20190123 午前
ver. 0.02 悲しい現象 20190123 午後
### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
FireTVでレイアウト境界線を表示する

## はじめに
Android開発でレイアウトをデザイナーさんにチェックしてもらったり、UIコンポーネントの構成を調べたりする際に役に立つ「レイアウト境界線を表示する」設定ですが、FireTVの開発者向けオプションにはそれにあたるものが存在しません。

| FireTV | AndroidTV |
| :--: | :--: |
| ![device-2019-01-23-123810.png](https://qiita-image-store.s3.amazonaws.com/0/79142/f81eb4b0-f7a3-c951-ae3d-68f832ef8eac.png) | ![device-2019-01-23-123948.png](https://qiita-image-store.s3.amazonaws.com/0/79142/e92fae29-08af-de19-b7eb-ddb25d56ee10.png) |


しかし、ADB経由で簡単に設定することが可能です。

## 設定方法

```
adb shell am force-stop com.app.name
adb shell setprop debug.layout true
adb shell monkey -p com.app.name -c android.intent.category.LAUNCHER 1
```

以上！🙋‍♀️
pipenv installがUnicodeDecodeErrorを起こす

ある日何の気はなく`pipenv install`を実行しようとしたら、以下のエラーが出て実行に失敗するようになってしまいました。

```
Traceback (most recent call last):
  File "c:\python37\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "c:\python37\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Python37\Scripts\pipenv.exe\__main__.py", line 5, in <module>
  File "c:\python37\lib\site-packages\pipenv\__init__.py", line 47, in <module>
    from .cli import cli
  File "c:\python37\lib\site-packages\pipenv\cli\__init__.py", line 3, in <module>
    from .command import cli
  File "c:\python37\lib\site-packages\pipenv\cli\command.py", line 7, in <module>
    import crayons
  File "c:\python37\lib\site-packages\pipenv\patched\crayons.py", line 49, in <module>
    is_powershell = "powershell" in shellingham.detect_shell()[0]
  File "c:\python37\lib\site-packages\pipenv\vendor\shellingham\__init__.py", line 22, in detect_shell
    shell = get_shell(pid, max_depth=max_depth)
  File "c:\python37\lib\site-packages\pipenv\vendor\shellingham\nt.py", line 100, in get_shell
    processes = dict(_iter_process())
  File "c:\python37\lib\site-packages\pipenv\vendor\shellingham\nt.py", line 78, in _iter_process
    info = {'executable': str(pe.szExeFile.decode('utf-8'))}
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x83 in position 0: invalid start byte
```
いままでは動いていたのにおかしいなー、何もしていないのに動かなくなったなーと思っていろいろ原因を探っていたのですが、見当たらず。どうしたものかと思っていたら…。

答えは上記Tracebackの中にある
`{python}\lib\site-packages\pipenv\vendor\shellingham\nt.py`に答えがありました。

上記プログラムの中には、Windows上で現在起動している全てのアプリを取得する という処理があります(逆にこれで全てのアプリ一覧が取れるんだ というのにも今気づいた)

```python:lib\site-packages\pipenv\vendor\shellingham\nt.py
    success = windll.kernel32.Process32First(h_process, byref(pe))
    while True:
        if not success:
            errcode = windll.kernel32.GetLastError()
            if errcode == ERROR_NO_MORE_FILES:
                # No more processes to iterate through, we're done here.
                return
            elif errcode == ERROR_INSUFFICIENT_BUFFER:
                # This is likely because the file path is longer than the
                # Windows limit. Just ignore it, it's likely not what we're
                # looking for. We can fix this when it actually matters. (#8)
                continue
            raise WinError()
        info = {'executable': str(pe.szExeFile.decode('utf-8'))}
        if pe.th32ParentProcessID:
            info['parent_pid'] = pe.th32ParentProcessID
        yield pe.th32ProcessID, info
        success = windll.kernel32.Process32Next(h_process, byref(pe))
```

`str(pe.szExeFile.decode('utf-8'))`が「実行ファイル名が日本語」のアプリを検出すると上記の例外を発生させる ということのようです。

このため、該当のアプリをタスクマネージャより探して終了させればOK(今回の場合、「ラベル屋さん9.exe」でした)。

# 結論
Traceback見るの大事。
MySQL8でgrantできなかった

MySQL8にしたら、`GRANT`ができませんでした。

8ではユーザー作成と権限付与が同時にできないらしいので、先に`CREATE USER`してから`GRANT`します。
（普通は先にユーザー作成すんのが筋だろってだろってことみたい）

```sql:mysql8
CREATE USER myuser@'%' IDENTIFIED BY 'password';
GRANT DELETE,INSERT,SELECT,UPDATE ON mydb.* TO myuser@'%';
FLUSH PRIVILEGES;
```

## 追記(2020/12/28)

ロールモデルも対応してるので、最近ちゃんとロールを定義するようにしてます。

```sql:mysql8
-- ロール作成
CREATE ROLE 'webadmin';
-- ロールに権限付与
GRANT DELETE,INSERT,SELECT,UPDATE ON mydb.* TO 'webadmin';

-- ユーザー作成
CREATE USER myuser@'%' IDENTIFIED BY 'password';
-- ユーザーにロール権限を付与
GRANT 'webadmin' to myuser@'%';
-- デフォルトロールのセット
SET DEFAULT ROLE 'webadmin' TO 'myuser'@'%';

FLUSH PRIVILEGES;
```

複数のロールを付与した場合はデフォルトロールが使用されます。
`SET ROLE`で切り替え可能。

```sql:mysql8
SET ROLE 'webadmin';
```
macOSをリカバリするときのエラー　-2002F

![macOS_recovery_-2002F.png](https://qiita-image-store.s3.amazonaws.com/0/347708/f4857621-780e-f22f-3615-9bf8faf00c20.png)

この前、macOSのアップデートをしたとき、最後の再起動がなかなか終わらず（12時間くらい、画面が真っ黒なまま待ちました）、電源ブチッして強制終了した事がありました。
その後、起動したところ、一部のストレージ内のアクセス権がおかしくなったのか、開けないファイルがいくつ出て来てしまい...Finderから再度設定しなおすも、直らず。
という事で、リカバリだ！となりました。
macOS復元システム「command (⌘) + R」で起動したところ、［ -2002F ］のエラー。初めて見たので、ドキドキでしたが、無事に復旧できました。

## 原因

「-2002F」は、ネットワーク系のエラーのようです。私の場合は、WifiルーターとDHCPサーバーが異なっていたために、起きたようです。

## 解決方法

一時的に、現在のDHCPを止め、WifiルーターのDHCPサーバーを有効にしました。
WifiルーターのDHCPサーバーから、IPをもらう事で、無事にmacOS復元システムで起動でき、復旧できました。
数字ではじまるファイル名 仮説(241)

pythonのプログラムで、一緒に作業をしている人が、数字で始まるファイル名をつけられていた。

そこで、数字ではじまるファイル名の扱いを調べ始める。

基礎4. ファイル名、フォルダ名のルール
https://web-manabu.com/html-css4/
「
注意点として先頭に「数字」を使用しないことです。HTMLでは問題ありませんがプログラム（Javascript, PHP）では数字を先頭にしたファイル名は使ってはいけない決まりになっています。先頭に数字を使わない習慣にしましょう。
」

[Android]リソースファイル名は数字から始まってはダメ
https://androiphone.uvs.jp/?p=116
「
リソースファイルに　1dan_1_voice.ogg　とか入れると、R.javaでエラーを吐いていた。
なんで～?とおもいdan1_1_voice.oggとかだとOKだった。どうやら数字から始まるファイル名はぺけらしい。」

数字のファイル名はNG
http://d.hatena.ne.jp/YasushiIizuka/20100615/1276598002
「
ndroidではresのdrawableに画像などを置くと、R.javaが自動生成されて、Rクラスから読み込みが可能ですが、ファイル名を数字にから始めるとうまくいきません。
Javaの識別子の規則で数字から始まる識別子はNGというのがあります。
」

Ethernet 記事一覧　Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794

Wireshark 一覧 wireshark(0)、Ethernet(48) 
https://qiita.com/kaizen_nagoya/items/fbed841f61875c4731d0

線網（Wi-Fi）空中線(antenna)(0) 記事一覧(118/300目標)
https://qiita.com/kaizen_nagoya/items/5e5464ac2b24bd4cd001

C++ Support(0)　
https://qiita.com/kaizen_nagoya/items/8720d26f762369a80514

Coding Rules(0) C Secure , MISRA and so on
https://qiita.com/kaizen_nagoya/items/400725644a8a0e90fbb0

Autosar Guidelines C++14 example code compile list(1-169)
https://qiita.com/kaizen_nagoya/items/8ccbf6675c3494d57a76

Error一覧(C/C++, python, bash...) Error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

なぜdockerで機械学習するか 書籍・ソース一覧作成中 (目標100)
https://qiita.com/kaizen_nagoya/items/ddd12477544bf5ba85e2

言語処理100本ノックをdockerで。python覚えるのに最適。:10+12
https://qiita.com/kaizen_nagoya/items/7e7eb7c543e0c18438c4

プログラムちょい替え（0）一覧:4件
https://qiita.com/kaizen_nagoya/items/296d87ef4bfd516bc394

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

小川清最終講義、小川清最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

#### 文書履歴(document history)
ver. 0.01 初稿 20190123
ver. 0.02 URL追記　20230210
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Vue.js入門〜Vue.jsのはじめの一歩〜を5分で飛ばし読みする



※この内容はVue.js入門の〜基礎から実践アプリケーション開発まで〜の第1章をを勉強したときの自己流理解メモです。

活字アレルギー過ぎて、Vue.js 入門の本を読むのにストレスフルで辛らいので、時間かかるけど、自分語（なくわかる適当な言葉で）に変換して読んでいくことにした。


とりあえず、Vue.jsを学んでいくスタートとして、最初に知りたいことは、
Vue.js てHTML、CSS、jQuery、JSやってきたけど、それらと何が違うの?

プログラマ、コーダーとしての初心者の壁は、若干越えたところあたりにいる私は、まだ真のエンジニアになりきれていない感がこういうところに現れる。（ポエムになりそうなのでここでやめる）

## HTML、CSS、jQuery、JSとVue.jsとの違い。（ざっくり）
P9の"現在の課題とVue.js" に、ほかのフレームワークに比べて学習コストが低くなるように考慮されていると書かれていた。なんとなくだけど、`覚えなきゃいけないことも少ないし、良いかも?`という期待が持てた。  

期待持てたのはいいけど、結局どこらへんが学習コスト低くなるの?、と気になるところ。
他のフレームワークを深く触ったことないから、納得できるかわからないけど、その答えっぽい文章を探してみた。

>P10
「UI構築には、簡単なHTMLをベースにした形で書いていける&JavaScriptのデータ&Vue.jsの提供するAPIを組み合わせれば簡単に動的なHTMLの描画ができるよ」  

ふむふむ、HTMLとJavascript使うのね。なるほど。
あ、そんな感じならJavascript勉強した時と難易度大差ないかも??...
いや、ちがう、動的って書いてある。動的っていうのもはっきり定義とかわからないけど、変化していくって感じかな?... 

学習コストがかからないには、2つの理由があることがわかった。
1. HTMLとJavascriptを使うからそれがわかるならいけそう（P10）
2. 環境構築なしに始められる（P11）

という2点。
私は環境構築苦手意識あるから、それなしにスタートできるのはとても魅力的なフレームワークだ、学習コスト低い認定した。（環境構築ちゃんとやれば楽しかったけどやっぱまだ苦手だ）

## HTMLやCSSとのと違いは学習コストだけが違うの? 
そんな疑問が湧いてきたので、サクサク読み進めるとP17にはこんな内容の記述もありました。
>P17
「Vue.jsはコンポーネントを容易に使えるライブラリ」

コンポーネントってなんやろ? アトミックデザインみたいなものかな? それぐらいの理解。小さい単位、部品で開発してその組み合わせだから、大きい開発でも事故りづらい? （Vue.jsのいいところは、コンポーネントごとにファイルを作れるみたい）  

## P18 "リアクティブシステム"
っていう項目があったので、それも簡単にまとめてみる（できるかな...）

>P18
状態の変更をVue.jsが検知（監視）して、自動的にviewに反映する。これを可能にしているプロパティこそ算出プロパティです。

（プロパティがなんのこっちゃわからんけど、プロパティというものこそ動的な状態変化を管理しているものの根本なのかな?これからやっていくから今回はこの程度でOK!ということにする）


## まとめ

P23までVue.jsのメリットを書かれていた。その辺はとりあえずいいかなと思ってよみ飛ばしたけど、P23までを一言でまとめると、2点
1. Vue.jsでは簡単な1枚ページから複雑なWEBアプリまで作ることができるけど、Vue.js自体viewに特化したライブラリなので、アプリとか作るときは他のプラグインの導入が必要だよ
2. テスト、ビルドの環境は自分で容易しろよ?
3. 環境構築に必要なオススメツールを羅列してておわり

最初大丈夫大丈夫、怪しくないよ〜と甘い言葉で近寄ってきて、最後に怖いお兄さんでてくるみたいな、そんな感じで2章がんばっていこうぜ！という内容でした。
改めてこの記事を読み返すとサクサクわかるけど、スタートした時は30分もかかってしまった。

*【1章 Vue.jsのはじめの一歩  完】*

※この内容はVue.js入門の〜基礎から実践アプリケーション開発まで〜 のP23を勉強したときの自己流理解メモです。

次は、<a href="https://qiita.com/sakiyama0101/items/f80f3ed2405788cca0f9">導入、基礎知識の確認とVue.js</a>の勉強に入っていく。
ReactはJavaScriptのすごい版なんでしょ程度の理解の人が書いた

#Reactについて
ReactはFacebookが作ったJavaScriptのライブラリ。
公式ドキュメント見ると拡張性とか柔軟性とか書いてあるけど、そのあたりは他のライブラリを理解していないと実感できないと思いスルー。
とにかくReact使わないより使うほうが画面もっとかっこよく自由にできるんでしょ、的なモチベーションで勉強しています。

##ReactはJSXを使う
JSXはJavaScriptの構文を拡張機能のこと。
とはいえ、JavaScriptのようにそのままWebブラウザで読み込めるものではなく、
Webブラウザで読み込む前にコンパイル（Webブラウザで読み込めるJavaScriptに変換する）する必要がある。
つまり、JSXで書いたコードの動作を確認するためにはコンパイラのインストールが必要となる。

###JSXで画面に表示するための要素の作成
HTMLタグの単位で作成する。
JavaScriptの変数定義と似ている。

```JSX.js
const h1 = <h1>Hello world</h1>;
```
これをコンパイルすると、下記に変換される。

```CompiledJSX.js
var h1 = React.createElement(
  "h1",          // HTMLタグ名
  null,          // idやclassなどの属性(今回何もしていしていないのでnull)
  "Hello world"  // HTMLタグの中身
);
```

'null'の部分にはHTMLのidやclassなどの属性が入る。
ここでは何も属性していないので'null'になっている。

また、複数行でHTML要素を定義するためには'()'で区切る必要がある。

```JSX.js
const a1 = (
  <a href="hello_world.html">
    <h1>Hello world</h1>
  </a>
);
```

これをコンパイルすると、下記に変換される。

```CompiledJSX.js
var a1 = React.createElement(
  "a",                          // HTMLタグ名
  { href: "hello_world.html" }, // idやclassなどの属性(今回はhref='hello_world.html'を追加する例)
  React.createElement(          // HTMLタグの中にHTMLを入れるときは、React.createElementの中にReact.createElementを入れる。
    "h1",
    null,
    "Hello world"
  )
);
```

###１つのJSXには１つのHTMLタグだけ
下記はHTMLタグが２つはいっているのでエラーとなる。

```JSX.js
const a1 = (
    <h1>Hello world</h1>
    <h2>This is JSX expression</h2>
);
```
HTMLタグを２つ以上記載する場合は何かのHTMLタグないにぬいぐるむ必要あり。

```JSX.js
const a1 = (
    <div>                     // 別に<div>でなく<section>とか<article>とかでもOK
      <h1>Hello world</h1>
      <h2>This is JSX expression</h2>
    </div>
);
```

### 作成した要素を画面に出力する
ReactDOMというDOMを扱うライブラリを使う。
DOMはHTMLなどのドキュメントの要素を触ったりするための道具みたいなもん。
画面に文字とかを出力するのはその中でも'render'というメソッドを使う。

```JSX.js
ReactDOM.render(
  <h1>Render Text</h1>,               // 表示する内容
  document.getElementById('article')  // 表示する対象。あらかじめ作成されている「idが'article'となっているHTMLタグ」内に表示する。
);
```

constで定義したHTMLを１つめの引数に入れることもできる。

```JSX.js
const myList = (
  <ul>
    <li>list1</li>
    <li>list2</li>
  </ul>
);

ReactDOM.render(
  myList,
  document.getElementById('app')
);
```
ネットワークスペシャリスト試験に合格した勉強方法

#1.はじめに
はじめまして。都内IT企業でネットワーク分野に直接関わっていない仕事をしてます、文系出身の3年目SEです。
2017年秋のリベンジで、2018年秋にネットワークスペシャリスト試験に合格することができたため、勉強方法をまとめました。午前Ⅱから記載しています。

#2.きっかけ
基本情報技術者試験や応用情報技術者試験を通してネットワーク分野がさっぱりだったため、学習を始めました。
全てが理解できるようになったわけではありませんが、興味を持つことができ、知識を得ることができてよかったと思います。

#3.試験概要
IPAのサイトに載っていますので、熟読してください。

（参考）IPAのネットワークスペシャリスト試験のページ
[https://www.jitec.ipa.go.jp/1_11seido/nw.html](https://www.jitec.ipa.go.jp/1_11seido/nw.html)

#4.私が行った試験勉強など
####2017年秋(不合格のため参考までに)
すごく基礎的・初歩的な参考書を読み込み、とにかくプロトコルなどを覚えました。
適当なテキストを購入してしまい、相性が悪く、結局最後までやり切りませんでした。
案の定試験一週間前でも分からないことだらけでした。

####2018年秋
前回は午後Ⅰまで通過(意外)していたので、反省を活かして、午後問題に時間を割きました。

#####具体的なやり方
・**午前Ⅱ**は過去問道場さま(ネットワークスペシャリストドットコム)で8割取れるまで繰り返しました。わからない問題はチェックを入れて、繰り返すことが大事です。

・**午後**は過去問を以下のような簡易的なリストを作成して、記号で習熟度を記載して何回か繰り返しました。
　例を作成してみましたが、私はノートに手書きで適当に書いていました。
苦手な問題はわかるまで解き、よくわからない単語はメモをして、調べてください。

| 出題回 | 1回目 | 2回目 | 3回目 | 4回目 | 5回目 |
|:-:|:-:|:-:|:-:|:-:|:-:|
| 平成27年午後Ⅰ問1  | ×  | △ | 〇 | ◎ | -  |
| 平成25年午後Ⅰ問2  | ×  | ×  | △ | 〇 | ◎ |
| 平成29年午後Ⅰ問1  | △ | ×  | 〇 | ◎ | -  |
| 平成25年午後Ⅱ問1  | 〇  | △  | 〇 | ◎ | ◎ |
記号はこんなイメージです。
×：全然わからない・・・
△：自信ないなあ
〇：もう一回くらい解いておこうかな
◎：完璧！


#5.Tips
☆ノートに勉強時間を記録したり、勉強時間記録アプリなどを使うとやる気がでる場合があります。
☆勉強タイミングについて、私の場合は平日夜はやる気がかくれんぼしていたので、休日や会社で勉強を進めていました。環境を変えたり、同士を見つけるのがいいのかもしれません。
☆本試験では、午前で出た単語が午後にも出ることがあります。午前でわからないと思った場合は休憩時間に調べておくと少しだけ心がやすらぐかもしれません。
☆どの参考書を使用したとしても、過去問と解説が一番大事なので、解説が詳しくて、自分に合っていると思ったものを選んでください。
☆試験勉強始めたときは、全てが苦手と思っていましたが、進めるうちに自分の(比較的)得意分野や(覚えられない)苦手分野が見えてきます。弱点などを把握しておくと、取捨選択ができてくると思います。
☆イメージが湧きにくいところでもありますので、実物に触れられる環境があれば、触れた方が良いです。図が沢山出ているような読み物を読むのも良いと思います。


#6.お世話になったサイトやアプリ
過去問道場さま（ネットワークスペシャリストドットコム）
[https://www.nw-siken.com/]
(https://www.nw-siken.com/)

IPAのネットワークスペシャリスト試験のページ
[https://www.jitec.ipa.go.jp/1_11seido/nw.html](https://www.jitec.ipa.go.jp/1_11seido/nw.html)

StudyPlus(勉強時間記録できるSNS)
[https://www.studyplus.jp/]
(https://www.studyplus.jp/)


#7.さいごに
最後までお読みいただきありがとうございます。
ネットワークスペシャリスト試験は記憶することが多く大変でしたが、その分多くの知識を得ることができます。業務で関わることが少なく、今まで関心が持てませんでしたが、この試験勉強を通して日常生活に関係してくることが分かって興味が湧きました。
合格しなくとも、勉強してきたことは積み重なりますし、合格後も継続して学習していくことが大切だと感じました。

お役に立てれば嬉しいです。
アノテーションコマンド

アノテーションコマンドについて
---
// TODO: あとで追加すべき内容を表す
// FIXME: 修正すべき箇所を表す
// OPTIMIZE: パフォーマンスの最適化をすべき箇所を表す
// HACK: リファクタリングすべき箇所を表す
// REVIEW: レビューすべき箇所を記す

物によっては表示されないかもですね。
ある種、チーム内で処理の共有あとあとなんだっけというのがないようにグループのWikiなどに記載方法とか乗せるといいですね！


---


## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
【Xcode10】IB(Storyboard/Xib)でカスタムビューの高さを動的なものとして扱う

# はじめに
IBで配置したカスタムViewのサイズをAutoLayoutによる動的に計算される高さで扱いたい場合の対応方法です。

# 対応方法
1. IBでViewを選択している状態で、右側のSizeInspectorをタップ。
2. 下部のIntrinsicSizeをPlaceHolderにする。
3. 高さを計算して欲しい場合、WidthのNoneにチェックし、Heightに仮で扱いたい高さを指定する。

できました！
青いViewは上下左右マージンしか指定していません。
<img width="300" alt="スクリーンショット_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/110630/de5257e6-e69b-0f50-3ad7-78d22b8e1620.png">
<img width="300" alt="スクリーンショット_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/110630/ad6da96e-f462-040d-af2e-88f538af99bc.png">


# おわりに
知ってるだけでレイアウトもかなり組みやすくなるかと思います！
ubuntu16.04に.NET coreをインストールしてみる

せしまるです。

ubuntu16.04に.NET coreをインストールする方法を備忘録として残そうかと。

## 環境
・VirtualBox
・ubuntu 16.04（ゲスト）
・windows10（ホスト）


## インストール

下記コマンドを入力します。

```console:console
$ sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ xenial main" > /etc/apt/sources.list.d/dotnetdev.list'
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 417A0893
$ sudo apt-get update
$ sudo apt-get install dotnet-dev-1.0.4
```

1行目のxenialをubuntuのバージョン毎に変更すれば入るのかな('_')？

まぁとりあえず確認

```console:console
$ dotnet --info
.NET Command Line Tools (1.0.4)

Product Information:
 Version:            1.0.4
 Commit SHA-1 hash:  af1e6684fd

Runtime Environment:
 OS Name:     ubuntu
 OS Version:  16.04
 OS Platform: Linux
 RID:         ubuntu.16.04-x64
 Base Path:   /usr/share/dotnet/sdk/1.0.4
```

dotnetコマンドが動いているから行けたっぽい。

次にHello World!してみる。

```console:console
$ dotnet new console -o helloworldapp
$ cd helloworldapp
$ dotnet restore
$ dotnet run
Hello World!
```

成功しました('ω')！
【Laradock】Mysqlの設定変更を反映させたい。

①mysqlの情報を変更する。
laradockの.envファイルを書き換えるなり、MysqlのDockerファイルを書き換えるなり。

②docker-compose.ymlのMysql句に書かれている

```
volumes:
- ${DATA_PATH_HOST}/mysql:/var/lib/mysql
```
にあたるデータを削除する。
ここにMYSQLのコンテナ情報が詰まっている。

`docker-compose build --no-cache mysql`を実行する

反映されていると思う。

参考資料
https://github.com/laradock/laradock/issues/1260


殴り書きなのであとで書き直すと思います。
Xampp内のMySQLにコマンドで接続する方法

まずは、Xampp内のMySQLの場所を把握すること


MySQLに接続

```
mysql -u root -p
```

デフォルトのディレクトリの場合はこれで接続できる。

```
c:\xampp\mysql>mysql -u root -p

```

DB一覧を見る

```
SHOW DATABASES;
```
随時追加予定。
Kubernetes 環境変数とSecretの設定

[「Kubernetes完全ガイド」](https://www.amazon.co.jp/Kubernetes%E5%AE%8C%E5%85%A8%E3%82%AC%E3%82%A4%E3%83%89-impress-top-gear-%E9%9D%92%E5%B1%B1/dp/4295004804) を元に、環境変数とSecretの設定確認を行った結果をまとめます。

##実行環境
Kubernetes / kubectl version : 1.5.2
CentOS 7.4

※[構築手順1](https://qiita.com/m-eno/items/6caae931ea727f55f5c0)、[構築手順2](https://qiita.com/m-eno/items/4fa92ce812ce2a655d6c)

##環境変数の設定
Kubernetesで環境変数を設定するには、Podテンプレートに、envまたはenvFromを指定

##静的設定
spec.containers.envに値を設定

```json-doc:sample-env.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-env
  labels:
    app: sample-app
spec:
  containers:
    - name: nginx-container
      image: nginx:1.12
      env:
        - name: MAX_CONNECTION
          value: "100"
```
作成したPod/コンテナに、環境変数が設定されている

```
[root@master ~]# kubectl exec -it sample-env env | grep MAX_CONNECTION
MAX_CONNECTION=100
```
Podに関する情報（Podのアドレス、起動時間等）は、fieldRefを使って参照可能。参照可能な値はkubectl get pods -o yamlで見えたもの　　
例）稼働ノード

```
[root@master ~]# kubectl get pods sample-env -o yaml
中略
spec:
 nodeName: worker
```

```json-doc:sample-env-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-env-pod
  labels:
    app: sample-app
spec:
  containers:
    - name: nginx-container
      image: nginx:1.12
      env:
        - name: K8S_NODE
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
```
稼働しているPodに、自身の情報（稼働ノード情報）が環境変数として、埋め込まれている事が確認出来る

```
[root@master ~]# kubectl get pods -o wide
NAME                                 READY     STATUS    RESTARTS   AGE       IP             NODE
sample-env-pod                       1/1       Running   0          9s        172.17.0.4     worker

[root@master ~]# kubectl exec -it sample-env-pod env | grep K8S_NODE
K8S_NODE=worker
```

##Secret
データベース接続用のユーザ名、パスワード等の機密情報のPod外部への格納機能（base64エンコード）。一般的なスキーマレスのGenericを作成


```
#Secretに埋め込む値をファイルに書き出す
[root@master ~]# echo -n "root" > ./username
[root@master ~]# echo -n "rootpassword" > ./password
```

作成したファイルを元にSecretを作成

```
[root@master ~]# kubectl create secret generic --save-config sample-db-auth --from-file=./username --from-file=./password
secret "sample-db-auth" created
```

作成したSecretを確認  kubectl get

```
[root@master ~]# kubectl get secrets sample-db-auth -o json
{
    "apiVersion": "v1",
    "data": {
        "password": "cm9vdHBhc3N3b3Jk",
        "username": "cm9vdA=="
    },
    中略
```

base64からのデコード

```
[root@master ~]# kubectl get secrets sample-db-auth -o json |jq -r .data.username | base64 --decode
root
```
【書評】「Amazon Web Services 基礎からのネットワーク&サーバー構築」を読んでみて

普段iOSエンジニアとして働いていますが、ネットワークやサーバーを基本的なところから知らないので、SAA(AWSソリューションアーキテクト)の試験を受けることもあって勉強しました

# 今回読んだ本
[Amazon Web Services 基礎からのネットワーク&サーバー構築](https://images-fe.ssl-images-amazon.com/images/I/51AqPb3-deL.jpg)
![51AqPb3-deL.jpg](https://qiita-image-store.s3.amazonaws.com/0/261386/d89a0309-d607-d1c6-6747-bc16100ca34e.jpeg)

# 感想
この本に書かれているようなサーバーとアプリ側の問題切り分けは、この本を読んだくらいでは私はできなさそうですが読んでよかったです。
過去に[合格対策 AWS認定ソリューションアーキテクト - アソシエイト](https://www.amazon.co.jp/gp/product/486594043X/ref=ppx_yo_dt_b_asin_title_o08__o00_s00?ie=UTF8&psc=1)いわゆる青本を何度か読んだことがあって確かにAWSを広く浅く理解する分にはいいのですが、自分はそもそも「ネットワーク構築」「サーバー構築」のような根幹的なことがわかっていなかったし、実際に手を動かして構築したわけではないためイメージしづらいところがありました。
その点この本はAWSについてはそれほど広く扱われていませんが、実際にWordPressでブログシステムをつくりながら「ネットワーク構築」「サーバー構築「Webサーバーソフトインストール」「HTTPの動き」「プライベートサブネット構築」「NAT構築」「DBを用いたブログシステム構築」「TCP/IPによる通信の仕組み」について学ぶことができます。
この本を読んでから次の学習ステップに向かうことで次の学習がより効果的に進められるかもしれません。
(試験受かるといいな-)

# この本を勧めたい層
- サーバーとかネットワーク全く知らない状態でこれからSAAの勉強を始めようとしている人
【Macユーザー向け】ターミナルで使えるショートカットキーまとめ


今回は、私がターミナルで作業をする際によく使用するショートカットキーをまとめました。
自分がよく使うものに絞っているので、全て知りたい方はこの記事を読んでも物足りないかと思います。
最低限、これらのショートカットキーをマスターしておけば、作業効率が上がること間違いなしです！

まずはじめに、この記事に出てくる記号の意味を書いておきます。

| 記号 | 意味 |
|:-:|:-:|
| ⌘  | command  |
|  ⌥ |  option |
| ⇧  |  shift |
| ⌃   |  control |

以下が私がよく使用するショートカットキーになります。

| キー | 動作 |
|:-:  |:-:       |
| ^ + b | 後方に1文字ぶん移動  |
| ^ + f | 前方に1文字ぶん移動  |
| ^ + a | 行頭に移動  |
| ^ + e | 行末に移動  |
| ⌥ + ⇦ |  前の単語まで移動  |
| ⌥ + ⇨ | 次の単語まで移動  |
| ⌥ + d | 単語を削除  |
| ^ + w | 単語を削除  |
| ^ + h | カーソルの後方1文字削除  |
| ^ + d | カーソル位置の1文字削除  |
| ^ + k | カーソル位置から行末までを削除  |
| ^ + u | カーソル位置から行頭までを削除  |
| ^ + y | 最後に削除した内容を挿入する  |
| ^ + l | 表示されている内容を全て削除する  |
| ^ + p | 前に入力したコマンド履歴を表示する |
| ^ + n | 後に入力したコマンド履歴を表示する|
| ^ + r | インクリメンタル検索を開始する |

最後のインクリメンタル検索は使いこなせれば、かなり強力なツールになります。
慣れるまでは大変だと思いますが、ぜひチャレンジしてみましょう。
棒グラフにそれぞれの件数を加える（stat_count)

ちょっとしたメモです。

ggplot2でgeom_bar()（棒グラフ）を使って作図する際に、その棒にそれぞれの件数を書き加える方法です。


# 件数を加えないで作図

普通に作成するとこうなります。

```R
library(ggplot2)
data("mtcars")

ggplot(mtcars, aes(x = gear)) + 
     geom_bar(stat = 'count') 
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/176860/73765c1a-16fc-f9ef-47ec-39ef67c2c43d.png)


# 効率的に件数を加える方法

このグラフに、件数を加えるとこうなります。

```R
ggplot(mtcars, aes(x = gear)) +
  geom_bar(stat = "count") +
  stat_count(aes(label = ..count..), geom = "text", vjust = 2, colour = "white")
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/176860/89b32e39-40ce-0f9b-f197-c852c809ea3d.png)

この方法は、r-wakalang.slack.comにて、kazutanさんに教えていただきました。
いつも、お世話になってます！！



# 余談~非効率な方法で件数を加える~

上記、`stat_count()`を使わずに書くと、こんな風になります。

```R
library(dplyr)

mtcars %>% 
    group_by(gear) %>% 
    summarise(cnt = n()) %>% 
    ggplot(aes(x = gear, y = cnt)) +
    geom_bar(stat = 'identity') +
    geom_text(aes(label = cnt), vjust = 2, colour = 'white')
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/176860/ca6c4384-151e-6650-9ffd-be4b5a103c03.png)

出力結果は全く同じです。
非効率な方は、一度`gear`毎の件数を集計し、その集計結果を元に作図しているので、ひと手間加えていることになります。

```R:こんなデータを一度作成しています
mtcars %>% 
     group_by(gear) %>% 
     summarise(cnt = n()) %>% 
     head()
# A tibble: 3 x 2
   gear   cnt
  <dbl> <int>
1     3    15
2     4    12
3     5     5
```

以上、小ネタでした。
jQueryでajaxを順番に実行するメモ

jQueryのDeferredで毎回ハマるので自分用にメモ。

# サンプルの仕様
日付のリストから日付を順番に取り出して、対象データをAPIから取得する。
日付が新しい順に格納されているので、順番を担保する必要があります。

# サンプルコード

```js
var target_dates = [
    "2019-01-23",
    "2019-01-22",
    "2019-01-21",
    "2019-01-20",
    "2019-01-19"
];

function getItems() {
    
    var d = $.Deferred();
    
    var target_date = target_dates.shift();
    var postData = {
        target_date : target_date
    };
    
    $.ajax({
        type: 'POST',
        url: 'api.php',
        timeout: 10000,
        cache: false,
        data: postData,
        dataType: 'json',
    }).done(function(response) {
        console.log(response);
        d.resolve();// 通信が終了したら次へ
        
    }).fail(function() {
        alert('通信エラーが発生しました。');
        
    });
    
    return d.promise();
}


$(function() {
    // 順番に実行
    $.when(getItems())
        .then(function() {
            return getItems();
         })
        .then(function() {
            return getItems();
         })
        .then(function() {
            return getItems();
         })
        .then(function() {
            return getItems();
         });
});
```

# メモ
.then()の中でreturnするのを毎回忘れるんですよね…。
仮想MFAデバイスのデータを引き継がないでスマートフォンを交換した場合の対応方法

##はじめに

スマートフォン交換してからMFAのデータないことに気づき、その時の対応メモです。
以下のマニュアル通りで対応できます。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/lost-broken-mfa/

##Rootユーザで確認します

メールアドレスを入力する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/d2023b8d-b285-3de7-f8a8-14183dcd2879.png)

パスワードを入力する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/47d19fa3-71e1-5b62-2b85-a37d25b1a7a3.png)


「Having problems with your authentication device? Click here」をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/f1c491dd-a8f2-d75c-7510-f077d20a057d.png)

再度パスワードを入力する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/e0c9f56a-6ea5-043c-ec84-15d369b99993.png)


Sign In Using Alternative Factorsをクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/c5e16db0-9508-cbc7-3782-685d7ca05be9.png)

確認Eメールの送信をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/156ecfe3-b415-4dbd-90d0-89c37cdd17c4.png)

件名が「AWS Email Verification」のメールが送信される。Verify your email addressをクリックする。

直ぐに連絡を受けるをクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/e5b8cb5d-c416-f1ae-9ddf-c50b059e675a.png)

表示された６桁の番号を、受信した電話で入力する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/05860d71-673c-b7ee-024e-7f63026337df.png)

サインインして再度MFAを登録する。

##上記でも解決しない場合は、サポート対応
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/067a785b-4572-d96c-4e1a-f0046c9a4e19.png)
「AWSサポートに問い合わせください」のリンクをクリック
ケースのフォームに入力
シアトルから電話がかかてくる
本人確認のためにメールが送信され、テンポラリーの数字を読み上げる
サポート側でMFA設定解除の作業を実施
MFAなしでログインできる
MFAを再設定する

##お約束
投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。
Windows Subsystem for Linux で ssh-agent を使う

# 前回のおさらい

https://qiita.com/wing-tail/items/22f2c74b4cfdde05bc2b
WSL + hyper でゴキゲンな Linux 開発環境を手に入れた！

# 概要

Windows 10 Spring Creators Update (1803) でデフォルト導入されるようになった OpenSSH クライアントは、WSL からだとバグで動かなかった。
しかし、Windows 10 October 2018 Update (1809) にて直ったので、自動起動設定をしておくと作業が捗る。

# 前提

スタート → 設定 → システム → バージョン情報から「Windows の仕様」を確認。
バージョンが1809ならOK.
違っていたら、スタート → 設定 → 更新とセキュリティ → Windows Updateから「更新プログラムのチェック」で更新する。

# 方針

.bashrc に ssh-agent と ssh-add の実行を記載する。
ただし、ssh-agent による PID 等の設定をファイルに出力してやって固定化する。
これによってクライアントでシェルを複数起動した場合でも１つの ssh-agent を共有できる。
つまり、screen などを利用した際に ssh-agent が乱立することはなくなる。

# 設定内容

```
SSH_AGENT_FILE="$HOME/.ssh/ssh_agent"

# 固定化された ssh-agent 設定が存在すれば、それを読み込んで
# 既に起動している ssh-agent プロセスを再利用
[ -f $SSH_AGENT_FILE ] && source $SSH_AGENT_FILE >& /dev/null

# ssh-add がエラーを返すなら、ssh-agent プロセスが存在しないものとして
# これを起動しつつ、設定をファイルに出力
if ! ssh-add -l >& /dev/null ; then
    ssh-agent > $SSH_AGENT_FILE
    # ssh-agent の設定内容を標準出力してほしいなら、/dev/null へ投げなくても良い
    source $SSH_AGENT_FILE >& /dev/null
    # $HOME/.ssh 配下にある id_rsa という名前のファイルを ssh-add
    find $HOME/.ssh -name id_rsa | xargs ssh-add
fi
```

注意点としては、screen の自動起動なども設定していた場合に、それより前に ssh-agent の設定を記載すること。
まあ、プロセス進行を考えれば当たり前の話だけど。

あと、秘密鍵の命名規則によって、ssh-add している箇所の記述は微調整が必要になる。
`$HOME/.ssh/hogehoge/id_rsa` に統一して、hogehoge の部分を適宜変更するフォルダ単位の管理が、個人的にはベストだと思ってる。

# 結果

WSL（hyper）起動時に秘密鍵のパス入力したら、Windows をシャットダウンするまで、パス入力しないで秘密鍵を使えるようになった！
C#：ASP.NET COREでのDBアクセスについて（ADO.NET SqlClient/Dapper）

#始めに
　これまでまともにORマッパーを利用したことがなかったので、ADO.NET SqlClientで作成したものをDapperで作り直してみました。
　両方作成してみて、ようやくORマッパーのメリット（可読性能、メンテナンス性能）を感じることができました。

#内容
　画面遷移時に、SELECTした内容をテーブル構造で表示します。
　肝心のModelの部分だけでいいよ、文章長いよという方もいらっしゃると思いますが、自分だったらMVC全て記載されていた方が嬉しいので記載します。

#環境
　■VisualStudio2017
　■SQlServer2016

#コード
##共通
　Controllerはどちらのパターンでも同一です。ModelとViewが分岐します。

```Controller_HomeController.cs
public IActionResult Hoge()
{
    ViewBag.Shiire = Models.Hoge.Get_Shiire();
    return View();
}
```

##ADO.NET SqlClient版
　SELECTしてきた結果をList in ListにReadしながら詰め直しています。

```Model_Hoge.cs
public static List<List<string>> Get_Shiire()
{
    List<List<string>> shiire = new List<List<string>>();
    using (var con = new SqlConnection("DB接続文字列"))
    using (var cmd = new SqlCommand("SELECT 仕入先CD,仕入先名,取引メモ FROM tb_仕入先マスタ", con))
    {
        con.Open();
        using (var dr = cmd.ExecuteReader())
        {
            while (dr.Read())
            {
                List<String> Rowdata = new List<String>
                {
                    dr["仕入先CD"].ToString(),
                    dr["仕入先名"].ToString(),
                    dr["取引メモ"].ToString()
                };
                siire.Add(Rowdata);
            }
       }
       con.Close();
   }
   return siire;
}
```

```View_Hoge.cshtml
<table class="table">
    <thead>
        <tr>
            <td>仕入先CD</td>
            <td>仕入先名</td>
            <td>取引メモ</td>
        </tr>
    </thead>
    <tbody>
        @foreach (var item1 in ViewBag.Shiire)
        {
            <tr>
                <td>@item1.[0]</td>
                <td>@item1.[1]</td>
                <td>@item1.[2]</td>
            </tr>
        }
    </tbody>
</table>
```


##Dapper版
　マップ先(Shiire)を用意してQueryで直接詰めています。

```Model_Hoge.cs
using Dapper;
public class Shiire
{
    public string 仕入先CD { get; set; }
    public string 仕入先名 { get; set; }
    public string 取引メモ { get; set; }
}

public static List<Shiire> Get_Shiire()
{
    using (SqlConnection connection = new SqlConnection())
    {
        connection.ConnectionString = "DB接続文字列";
        connection.Open();
        string sql = "SELECT 仕入先CD,仕入先名,取引メモ FROM tb_仕入先マスタ";
        return connection.Query<Shiire>(sql).ToList();
    }
}
```

```View_Hoge.cshtml
<table class="table">
    <thead>
        <tr>
            <td>仕入先CD</td>
            <td>仕入先名</td>
            <td>取引メモ</td>
        </tr>
    </thead>
    <tbody>
        @foreach (var item1 in ViewBag.Shiire)
        {
            <tr>
                <td>@item1.仕入先CD</td>
                <td>@item1.仕入先名</td>
                <td>@item1.取引メモ</td>
            </tr>
        }
    </tbody>
</table>
```

##感想
　今回のパターンでは取得データが全てStringなので差が出ませんでしたが、キャストミスなどが発生しにくい分Dapperの方が好みだなと思いました。
JavaScript入門6~jQuery入門~

##jQueryとは##
jQueryとはJavaScript用のオープンソースライブラリです.
htmlやCSSの書き換え,イベントの設定などのDOM操作や,Ajaxと得意とします.

##JQueryのDOM操作のパターン##
1.イベントを設定したい要素を取得する
2.その要素にイベントを設定
3.イベントが発生したときの処理を実行する.

1→$()メソッドとCSSのセレクタを使用する.
2→jQueryのonメソッドを使用する.
3→処理ごとに異なる.


##使い方##

まず使いたい機能のリンクを引っ張ってきます

```
<script src ="使いたいリンクは公式からひっぱてここにかく"></script>
```

こんな感じで使いますです

```
$('document').ready(function(){
処理内容
});
```

`$(｀セレクタ｀)`はjQueryで要素を取得するメソッドらしいです.
もっというと,要素を｢jQueryオブジェクト｣というjQuery独自のオブジェクトに変換するものらしいです.

取得した要素にイベントを設定する時は次のように書くらしいです.

```
$()で取得した要素.on('イベント名', function()){
イベントが発生したときの処理
})
```
イベント名はonclickイベントならclick,onsubmitイベントならsubmitというように,先頭のonを取ったものを指定する.
安定版ではないEgretEngineの最新版を試してみるには？

# はじめに

Egretの公式WeChatアカウントや公式サイトからベータ版のニュースがよく流れてきます。しかしながら、ニュース記事にはダウンロード方法などは書かれておらず、公式サイトにもダウンロード情報はありません。

こういう場合はどうしたらいいのでしょうか？

# 方法1: GitHubから入手する

事例：[一般公開前のEgret3Dを試してみる](https://qiita.com/motoyasu-yamada/items/8e81e402ffb7395c4c3e)

Egretエンジンのコア部分はオープンソースで配信されています。GitHubからダウンロードしてみてください。
GitHub: https://github.com/egret-labs/


# 方法2：コミュニティの製品リリース情報から入手する

事例：[EgretWingの UIエディタが大きくバージョンアップ](https://qiita.com/motoyasu-yamada/items/5f62b3fea46c369133c5)

Egret 社区(Community)の产品发布(Product Release)カテゴリで配布されていることが多いです。

Egret コミュニティ→製品リリース： https://bbs.egret.com/forum-47-1.html

# 方法3: コミュニティで質問する

EgretのWecChatコミュニティで質問すると比較的リアルタイムにかえってきます。
Ubuntu+MySQL(on Docker)+SQLAlchemyを構築する際の手順、ハマりポイント

# 環境
- Ubuntu 18.04
- Mysql(on docker)
- Python3.6
- SQLAlchemy

# 手順
## MySQLイメージの作成、起動まで
```
docker pull mysql
docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3306:3306 mysql
```
# DB作成
```
docker exec -it e5edc5732d78 bash
```
```
mysql> CREATE DATABASE test;
```

## SQLAlchemyのインストール
```
pip3 install SQLAlchemy
```
## コード
参考：https://qiita.com/bokotomo/items/a762b1bc0f192a55eae8
実行するとUserテーブルがない場合にはユーザーテーブルを作成してくれます。

```python
import sys
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Float, DateTime

DATABASE = 'mysql://%s:%s@%s/%s?charset=utf8' % (
    "root",
    "mysql",
    "127.0.0.1",
    "test",
)
ENGINE = create_engine(
    DATABASE,
    encoding = "utf-8",
    echo=True
)

session = scoped_session(
    sessionmaker(
        autocommit = False,
        autoflush = False,
        bind = ENGINE
    )
)

Base = declarative_base()
Base.query = session.query_property()

class User(Base):
    __tablename__ = 'users'
    id = Column('id', Integer, primary_key = True)
    name = Column('name', String(200))
    age = Column('age', Integer)
    email = Column('email', String(100))

def main(args):
    Base.metadata.create_all(bind=ENGINE)

if __name__ == "__main__":
    main(sys.argv)
```

## 躓いたところ1
SQLAlchemyの依存パッケージが足りない

```
ModuleNotFoundError: No module named 'MySQLdb'
```
ここでインストールするパッケージはMySQLdbでもMySQL-pythonでもないです。
正しい必要なパッケージインストールはこれ！

```
pip3 install mysqlclient
```
まぁ怒られるんですけども。。。

```
OSError: mysql_config not found
```

解決方法は以下

```
sudo apt install default-libmysqlclient-dev
```

## 躓いたところ2
上記コードは正常に動くのですが、接続ホストをlocalhostにしていた際のハマりポイントです

```
sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)") (Background on this error at: http://sqlalche.me/e/e3q8)
```

というエラーが実行時に出ます。
内容はシンプルで/var/run/mysqld/mysqld.sockに接続に向かった結果失敗してるだけなんですよね。
当然といえば当然で、私が接続したかったMySQLはdocker内にあり、
MySQLが動作してるコンテナの3306ポートとホスト(Ubuntu)の3306ポートを接続しているとはいえ、
当然Ubuntuの/var/run/mysqld/mysqld.sockにはなにもないわけです。

このエラーからわかることは、SQLAlchemy(正確にはmysqlclient or libmysqlclientだと思いますが)の
セッション作成時にlocalhostを指定するとlocalhostにTCPのセッションは張らない、ということです。
逆に127.0.0.1を指定したら普通にTCPセッション貼るのか。。。という。。。
docker上にMySQLを立てる場合の知見としてまたひとつ賢くなったのでした。

といった流れでUbuntu+MySQL(docker)でSQLAlchemyを実行できました！
docker上のmysqlの永続化などに関しては他の方がいろいろと書いているので、調べてみてください。
Rails 5 の API モードを触ってみる

Rails で JSON を返す API を作りたい！
でも MVC の V は要らないな・・。
そんな時は API モードで！
[Rails による API 専用アプリ](https://railsguides.jp/api_app.html)

## Rails を --api で作成

~~~sh
$ rails new my-service --api
$ cd my-service
$ bundle install
$ rails s
~~~

http://localhost:3000/ へアクセス

![rails_welcome.png](https://qiita-image-store.s3.amazonaws.com/0/106789/cbc505a3-1cee-8bc9-b4d1-14dd980e4289.png)

この画面が見えると安心しますね

## JSON を返す API を作成

それでは試しに user というリソースを作ってみます
scaffold を使います
scaffold は controller や model を自動生成してくれる機能です
カラムが何も無いとアレなので name:string くらい作っておきます

~~~sh
$ rails g scaffold user name:string
$ rails db:migrate
$ rails s
~~~

サーバーを立ち上げたまま、ターミナルをもう一つ開いてユーザーを登録します
name はマイケルジャクソンさんも絶賛の [Lion Stout](http://www.worldbeer.co.jp/beer/srilanka/index.html) にします

~~~sh
$ curl --request POST --url http://localhost:3000/users/ --data 'user%5Bname%5D=Lion%20Stout'
~~~

今度は以下の URL にアクセスしてみます
(users で複数形になっていることに注意です)

http://localhost:3000/users/

ちゃんと Lion Stout さんが登録されていますね！

![rails_welcome_json.png](https://qiita-image-store.s3.amazonaws.com/0/106789/13c51bd9-c163-9545-07c7-8e226f10c78f.png)

([JSON formatter](https://chrome.google.com/webstore/detail/json-formatter/bcjindcccaagfpapjjmafapmmgkkhgoa?hl=ja) という Chrome 拡張を使っています)

## controller

こんな感じで自動生成されます
REST に沿って CRUD 操作のメソッドが用意される感じです
`render json: @users` で JSON のレスポンスを返します

~~~ruby
class UsersController < ApplicationController
  before_action :set_user, only: [:show, :update, :destroy]

  # GET /users
  def index
    @users = User.all

    render json: @users
  end

  # GET /users/1
  def show
    render json: @user
  end

  # POST /users
  def create
    @user = User.new(user_params)

    if @user.save
      render json: @user, status: :created, location: @user
    else
      render json: @user.errors, status: :unprocessable_entity
    end
  end

  # PATCH/PUT /users/1
  def update
    if @user.update(user_params)
      render json: @user
    else
      render json: @user.errors, status: :unprocessable_entity
    end
  end

  # DELETE /users/1
  def destroy
    @user.destroy
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_user
      @user = User.find(params[:id])
    end

    # Only allow a trusted parameter "white list" through.
    def user_params
      params.require(:user).permit(:name)
    end
end
~~~

## テスト

これは scaffold の機能ですがテストも自動生成してくれます

~~~sh
$ rails t
Running via Spring preloader in process 20343
Run options: --seed 58286

# Running:

.....

Finished in 0.832185s, 6.0083 runs/s, 8.4116 assertions/s.
5 runs, 7 assertions, 0 failures, 0 errors, 0 skips
~~~

## 参考

- [Ruby on Rails 5のAPIモードと非APIモードのファイル差分](https://qiita.com/61503891/items/d4eda649a10a3494830c)


[Rails でトークン認証 API を 15 分で実装する](https://qiita.com/kumagaias/items/250e7d6cf46966e4c8c2) も宜しければご覧ください。
WEBアプリの作成（個人的な備忘）

#ディレクトリ構成

## 一般的なディレクトリ構成

RailsなどのMVCフレームワークは以下のような構成になっています。

```:app配下
app/
  ├ assets/
  ├ controllers/
  │　├ users
  │  └ members
  ├ views/
  │  ├ users/
  │  │ ├ index
  │  │ └ edit
  │  └ members/
  │    ├ index
  │    └ edit
  └ models/
    ├ user
    └ member
```

## 個人的に好きなディレクトリ構成
しかし、仕事の場合、機能単位で依頼する場合が多く
以下のような構成が個人的には好みです。

```:app配下
app/
  ├ user/　機能ごとにフォルダが分かれている。
  │　├ controller
  │  ├ views/
  │  │  ├ index
  │  │  └ edit
  |  └ model
  └ member/
   　├ controller
     ├ views/
     │  ├ index
     │  └ edit
     └ model
```

## 今回の作成するアプリの構成

最近、Go言語の勉強を始めたので、備忘を兼ねて個人的な記録して掲載しています。
今回の構成は、以下の通りです。
Userなどを使わず、M001 などを使っているのは、自分がSIer勤務で機能IDを
テーブルやソースファイルに付加する方が馴染み深いためです。

```:app配下
app/
  ├ main.go
  ├ static/
  │  └ css/
  │    └ common.css
  ├ M001/
  │　├ handler.go
  │　└ view/
  │    └ index.html
  └ Templates/
     ├ Application.html
     └ Footer.html
```


#今回のソース

以下のmain.goの書き方だと、M001などの機能が増えるたびにimportを記述する必要があります。
main.goは修正せずにデータベースなどから機能IDなどを取得して、機能追加できるようにしたいです。（今は方法がわかりません。）


```golang:main.go
package main

import (
    "log"
    "net/http"
    "M001"
)

func main() {
    //staticファイル読みこみ
    http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static/")))) // これがないとダメ

    // M001
    http.HandleFunc("/M001/", M001.Handler)

    log.Fatal(http.ListenAndServe(":8080", nil))
}
```

```golang:M001/handler.go
package M001

import (
    "html/template"
    "net/http"
)

type Person struct {
    Name string
    From string
}

func Handler(w http.ResponseWriter, r *http.Request) {

    p := Person{
        Name:"佐藤",
        From :"埼玉",
    }

    tmpl := template.Must(template.ParseFiles("Templates/Application.html", "Templates/Footer.html", "M001/view/index.html"))
    tmpl.Execute(w, p)
}
```

```golang:M001/view/index.html
{{define "content"}}
<p>名前:{{.Name}}</p>
<p>出身:{{.From}}</p>
{{end}}
```

```golang:Templates/Application.html
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <title>テスト</title>
    <link rel="stylesheet" type="text/css" href="../static/css/common.css">
</head>

<body>
    ヘッダー情報<br>
    {{template "content" .}}
    変数を使わない場合 .(dot)はいらない<br>
    {{template "copyright"}}
</body>
</html>
```

```golang:Templates/Footer.html
{{define "copyright"}}
Copyright 2019 xxxxxx All Rights Reserved.
{{end}}
```

```golang:static/css/common.css
p {
color:blue;
}
```
[解決].pyファイルの関連付けが上手くいかなくて悩んだ件

windowsで.pyファイルを関連付けしたのですが、ダブルクリックして実行しようとすると、毎回既定のプログラムを選択させられる現象に陥りました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/267148/ea722fd7-6c91-8989-f53e-f2a222f4a24b.png)

#試したこと
 - コントロールパネルから既定のプログラムを選択 → 何度選択しても「不明なプログラム」になる
 - Python再インストール → 変わらず
 - レジストリをいじって、関連付けをリセット。 → 変わらず
 
 と、手を尽くしたものの、全く原因が分からず途方に暮れておりました・・・

#さらに色々とテストしてみた
そこで、原因を特定するために、色々とテストをしてみました。

 - pythonのexeファイルを他の拡張子に関連付け → ***できる！***ということは、pythonのプログラムには問題無し。
 - `.py`ファイルを`.pyt`などに変更して関連付け → ***できる！***ということは、`.py`の拡張子だけに問題がある。
 
原因は.pyの拡張子に付いて回ることが分かったので、さらに原因を探ります。

#レジストリの設定を見直す
そこで、レジストリの拡張子関連の設定を見直しました。結果から言うと、これで***解決***しました！

レジストリの設定は間違うとプログラムに重大な問題を引き起こす可能性があるので危険な操作です。
慎重に行ってください！

`HKEY_CLASSES_ROOT`
を開いて、
`.py`
を探します。

開くと、データは`py_auto_file`となってますね。ここに関連付けられたプログラムのパスが書かれています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/267148/85d17a80-a8da-ff40-f339-b8a56128f72f.png)

次に、`py_auto_file`を検索しましょう。(Ctrl + Fで検索できます）
見つかったらフォルダを開いて行ってcommandというフォルダを開いてみましょう。
ここにパスが書かれています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/267148/d3e98da8-85f3-b1c8-1dba-7ec30bb0a023.png)

私の場合は、ここが以前消したはずのpython2.7のものになっていたのが原因でした・・・

ここを書き換えると、無事起動できました！

#さいごに
pythonのバージョンを複数入れている方だと、このような現象に陥る可能性があります。
3.x系のPython記法でスクリプトなどを組んで、いざ実行しようとダブルクリックしたら動かない！ってことにもなります。(Python 2.x系のexecuterが呼ばれてしまうので）

是非、この辺り注意してみて下さい。
DateTime::createFromFormatの!と|はUnixエポックにはリセットしない

[DateTime::createFromFormat](http://php.net/manual/ja/datetime.createfromformat.php)のフォーマット文字列の`!`と`|`の説明に「Unix エポックにリセット」と書いてありますが、実はそのタイムゾーンでの1970年1月1日0時0分0秒にリセットされます。

例えば

```console
% php -d date.timezone=Asia/Tokyo -r 'echo(DateTime::createFromFormat("!", "")->format("Y-m-d H:i:s"));'
1970-01-01 00:00:00
```

となります。説明通りだと`1970-01-01 09:00:00`になりそうですがそんなことはありません。

もちろんマニュアルの`|`のところの例に書いてある

> Y-m-d| は、文字列をパースした結果から年月日を設定し 時分秒には 0 を設定します。

もちゃんと動きます。

ドキュメントのバグとしてバグレポ([#76569](https://bugs.php.net/bug.php?id=76569))したんだけど一向に直る気配がないですねー。
【AWS入門】AWSアカウント作成〜IAMユーザー作成 day1-1

Udemyの新種でAWS入門コースを購入した。
作業メモレベルだが、進めた内容をアウトプットする。

## Udemyコース
手を動かしながら2週間で学ぶ AWS 基本から応用まで
https://www.udemy.com/share/100taiB0EfeFtSRnQ=/

講座の動画を見ながらAWSアカウントを作成、作業用のIAMユーザーの作成まで学習した。

## AWSアカウント作成

https://aws.amazon.com/jp/

クレカを用意しておく。
住所は半角英字
電話番号は+81がつくので、先頭の0をとる？

## AWSアカウントへログイン
AWS マネジメントコンソール画面で、画面右上の自分の名前からアカウント
IAM ユーザー/ロールによる請求情報へのアクセス＞編集
IAM アクセスのアクティブ化 のチェックをONにして 更新ボタンを押す

### なぜIAMユーザーをアクティブ化するか？
デフォルトで作成されるルートユーザは、全てのAWSサービスを使用できる特権ユーザーである。
通常の作業にルートユーザを使ってはならない（DBサーバーをたてる等）
そのためIAMユーザーに適切なポリシーを割り当てて、通常のAWSサービスを使う必要がある。
IAMユーザーは利用者ごとに払い出せる。

## IAMユーザーの作り方
AWSトップを表示して、検索ボックスに「IAM」と入力する。
サジェストに「IAM ユーザーアクセスと暗号化キーの管理」が表示されるので、サジェストをクリックする。
左メニューのユーザーをクリックする。
ユーザーを追加をクリックする。
ユーザー詳細の設定＞ユーザー名を入力
AWSアクセスの種類を選択＞アクセスの種類＞AWS マネジメントコンソールへのアクセスを有効にする
コンソールのパスワード＞どちらでもよい、カスタムパスワードを選ぶなら自分でパスワードを入力する
パスワードのリセットが必要＞自分のIAMアカウントならチェックオフでいいが、他人のIAMアカウントを作るならその人にパスワードを決めてもらうため有効にする
次のステップ：アクセス権限をクリックする

### アクセス権限を設定
今回は自分のIAMユーザーを作るため、既存のポリシーを直接アタッチを選択してAdministratorAccessを選択する。
（AdministratorAccessにすると大概のAWSサービスは使えるようになる）
次のステップ：確認ボタンをクリックする

### タグの追加 (オプション)
一旦空欄で、次のステップ：確認ボタンをクリックする
確認＞ユーザーの作成をクリックする

これでIAMユーザーが作成された
ダッシュボードを表示する
IAMユーザーでログインするため、ルートユーザをサインアウトして、IAMユーザーでログインする
IAM ユーザーのサインインリンクをコピーし、サインアウトする
アカウント、ユーザー名、パスワードにIAM用の値を入力する
ログインできたらIAMユーザーが正しく作成されている。

## 感想
Udemyの講座を初めて利用したがなかなかいいね、途中再開も楽チン。
動画のおかげでAWSアカウント作成がスムーズにできた。
なぜIAMユーザーを作るか？という説明もわかりやすい。
[Intervention]Ignored attempt to cancel a touchend event with cancelable=false, for example because scrolling is in progress and cannot be interrupted.

> [Intervention]Ignored attempt to cancel a touchend event with cancelable=false, for example because scrolling is in progress and cannot be interrupted.

こんなエラーがでてきたので対処法を。
エラー文読めばわかるけど・・・。

ブラウザのスクロールや再読込(下にスワイプして離す)などの実行中ではtouchendイベントのキャンセルは無視されますよ、ということらしい。

具体的にはpreventDefault()などの実行をしているとこのエラーがでる模様。
なのでイベント発生時に実行している関数内で下記のように条件分岐させることでエラーが回避できる。

```javascript
$(el).on('touchmove',ontouchmove);

function ontouchmove(e){
  if(e.cancelable){
    e.preventDefault();
  }
}
```
【ATOM】ATOMのテキスト保存時に文末のスペースが削除されるのを解消してMarkdownをもっと使えるようにする

# 事象
ATOMインストールしてMarkdown書くの楽しい～！
Markdown Previewがマジで神すぎてやばい。
↓
保存してみると全部改行消えとるがな。。。。
というATOMインストールしてうっきうきの初学者向けの記事です。

# 対処
Atom editorの設定を変更すれば解決
FIle - Settings - Packages - whitespaceと検索。 
以下のように設定する。  
- [x] Ensure Single Trailing Newline (ファイルの末尾に改行を追加する)
- [x] Ignore Whitespace On Current Line (カーソル行の空白は削除しない)
- [x] Ignore Whitespace Only Lines (空行の空白は削除しない)
- [x] Keep Markdown Line Break Whitespace (Markdownの改行空白は削除しない)
- [ ] Remove Trailing Whitespace (末尾の空白を削除する)

# 結果
末尾の空白削除がなくなってATOMでMarkdownライフがはかどる！