OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Studio Code でターミナルにコマンド入力する拡張機能を開発

# 作ったもの

VSCodeの拡張機能を開発しました。具体的な機能は以下の通り。

* テキスト編集時に、Ctrl + F1で実行される。
* 実行すると、ターミナルに指定したコマンドが入力される。

VSCodeの公式ドキュメントを参考に作成しました。
https://code.visualstudio.com/docs


# 手順
## ひな形の作成
拡張機能のひな形を作成します。
任意のディレクトリで `yo code` を実行すると、ひな形が生成されます。

## package.jasonの編集
このファイルでは、拡張機能の実行方法を指定します。
今回はCtrl + F1で実行するために、contributesを以下のように書き直します。


```json:package.json
    "contributes": {
        "keybindings": [
            {
                "command": "extension.sayHello",
                "key": "ctrl+f1",
                "when": "editorTextFocus"
            }
        ]
    },
```


## src/extension.tsの編集
このファイルでは、拡張機能の実行内容を指定します。
実行するとメッセージが表示され、ターミナルに入力を行うように書き直しました。

```typescript:extension.ts
export function activate(context: vscode.ExtensionContext) {

    // Use the console to output diagnostic information (console.log) and errors (console.error)
    // This line of code will only be executed once when your extension is activated
    console.log('Congratulations, your extension "xsl-fo-runner" is now active!');

    // The command has been defined in the package.json file
    // Now provide the implementation of the command with  registerCommand
    // The commandId parameter must match the command field in package.json
    let disposable = vscode.commands.registerCommand('extension.sayHello', () => {

        vscode.window.showInformationMessage('runExtension!');
        const terminal = vscode.window.createTerminal();
        terminal.sendText('cd C:/');
    });

    context.subscriptions.push(disposable);
}
```
mysqlで日本語を扱えるようにする

#mysqlで日本語を使って怒られた人向けの記事

こんなエラーが出た人向け

```:エラー例
ERROR 1366 (HY000): Incorrect string value: '\xE3\x82\xBF\xE3\x82\xA4...' for column 'title' at row 1
````



#現在の状態を確認する
任意のユーザでログインして、statusコマンド


```:コマンド例
# mysql -u minato -p

(パスワードを入力)  

mysql> status

   mysql  Ver 14.14 Distrib 5.7.21, for Linux (x86_64) using  EditLine wrapper
   ~~
   Server characterset:    utf8
   Db     characterset:    utf8
   Client characterset:    utf8
   Conn.  characterset:    utf8
   ~~

```

#上記が全部utf-8になってない人は設定する

```:/etc/my.cnf

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

[mysqld]
character-set-server=utf8
```

使ってるOSによって置いてあるディレクトリは違うと思う
（上記はCentOS7)の例

#再起動する

```
# systemctl restart mysqld.service
```

#注意：文字コード設定はDB毎にもある
一旦、日本語を扱えない文字コードで作ったDBはstatusを見れば分かる通り、日本語が扱えないままになってる。作り直せば解決だけども、文字コードくらい変更できると思う(そこまでは調べてない、もし調べたら追記します)
TilemapのCollider、GridとSpriteの違い

　Unityの標準Tile Assetには、次の3個のCollider Typeがあります.

* None
* Sprite
* Grid

　`None`は文字通りColliderが設定されないTypeです。

　`Sprite`は画像に合わせてColliderが設定されます。

　`Grid`はTilemapのグリッドに合わせてColliderが設定されます。

　次の図に注目してください。

![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/4125/2fa2826d-5a5d-c60a-86f0-17e1b8f60bda.png)

　左のTileはCollider TypeはGrid、右のTileはCollider TypeはSpriteに設定しています。
　左のGrid Typeに設定したTileではGridの1マスにそってColliderが設定されていますね。
　右のSprite Typeに設定したTileではSpriteの外側にそってColliderが設定されていますね。

　Collider Typeにはこのような違いがあります。


　もう一例紹介します。

　次の画像はTileのCollider TypeをSpriteに設定した例です。

![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/4125/9caf5b12-82ea-56a7-b715-caa1af0be9f7.png)


　次の画像はTileのCollider TypeをGridに設定した例です。

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/4125/c1d39651-12db-96a6-5118-47cde4c0dd91.png)

　目的に合わせて適切なCollider Typeを設定しましょう。

　参考
 https://docs.unity3d.com/ja/2017.2/ScriptReference/Tilemaps.Tile.ColliderType.html
MacOS 10.13 High Sierra で Unity の Assets ディレクトリ下のファイルが表示されない

# この記事は？
[macOS 10.13 High Sierra にて、Projectウィンドウ内のファイルが見えない、あるいはMonoDevelopが起動しない - Unity日本語ヘルプデスク](https://helpdesk.unity3d.co.jp/hc/ja/articles/115012768187-macOS-10-13-High-Sierra-%E3%81%AB%E3%81%A6-Project%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E5%86%85%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E8%A6%8B%E3%81%88%E3%81%AA%E3%81%84-%E3%81%82%E3%82%8B%E3%81%84%E3%81%AFMonoDevelop%E3%81%8C%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%AA%E3%81%84) に関する補足です。

# 対象者
この記事投稿時点で筆者が確認しているのは以下を利用しているケースです。

## OS
Mac OS 10.13 High Sierra

## Unity version
* 5.6.5f1
* 2017.3.0

# 問題
掲題の通り、 Assets ファイルにデータが表示されません。
既存のものも新しく追加したものもです。
ファイル自体はドラッグ&ドロップでも配置されますが、Editor上に表示されません。

`MSAA support is disabled on High Sierrra for this GPU` というエラーが原因です。

[macOS 10.13 High Sierra にて、Projectウィンドウ内のファイルが見えない、あるいはMonoDevelopが起動しない - Unity日本語ヘルプデスク](https://helpdesk.unity3d.co.jp/hc/ja/articles/115012768187-macOS-10-13-High-Sierra-%E3%81%AB%E3%81%A6-Project%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E5%86%85%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8C%E8%A6%8B%E3%81%88%E3%81%AA%E3%81%84-%E3%81%82%E3%82%8B%E3%81%84%E3%81%AFMonoDevelop%E3%81%8C%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%AA%E3%81%84) に記載のバージョンに **ダウングレードしてください**。

# 備考
Unity の最新のバージョンが上記以外の場合であったり OS に更新が入った場合はこの限りではありません。
handleEvent と onEvent と this.props.onEvent

これは [Learn ReactJS: Part I | Codecademy](https://www.codecademy.com/courses/react-101/lessons/this-props/exercises/receive-event-handler-prop) の 「10. handleEvent, onEvent, and this.props.onEvent」 を翻訳したものです。

---

ネーミングについて話しましょう。

イベントハンドラを prop として渡すとき、さっきしたように、ふたつの名前を決めねばなりません。

どちらのネーミング決定も親コンポーネント・クラスのなかで行います。つまり、コンポーネントクラスはイベントハンドラを定義してから渡します。

決めねばならないひとつめの名前は、イベントハンドラ自体の名前です。

`Taker.js` の6行目から12 行目までを見て下さい。これがイベントハンドラです。この名前を `talk` としました。

```Taker.js
import React from 'react';             // 1
import ReactDOM from 'react-dom';      // 2
import { Button } from './Button';     // 3
                                       // 4
class Talker extends React.Component { // 5
  talk() {                             // 6
    let speech = '';                   // 7
    for (let i = 0; i < 10000; i++) {  // 8
      speech += 'blah ';               // 9
    }                                  // 10
    alert(speech);                     // 11
  }                                    // 12
                                       // 13
  render() {                           // 14
    return <Button talk={this.talk}/>; // 15
  }                                    // 16
}                                      // 17
                                       // 18
ReactDOM.render(                       // 19
  <Talker />,                          // 20
  document.getElementById('app')       // 21
);                                     // 22
```

決めねばならないふたつめの名前は、イベントハンドラを渡すための prop の名前です。これは属性名と同じです。

15行目で分かるとおり、この名前も `talk` としました。

```.js
return <Button talk={this.talk} />;
```

これらふたつの名前はどんなものでも構いませんが、しばしば用いられるネーミング規約があります。この規約にしばられる必要はありませんが、コードを読むにあたって理解しておいたほうがよいでしょう。

ネーミング規約は次のとおりです。まず、待機しているイベントのタイプを考えます。この例では、イベントのタイプは「click」です。

`click` イベントを待機するなら、イベントハンドラの名前は `handleClick` となります。`keyPress` イベントを待機するなら、イベントハンドラの名前は `handleKeyPress` となります。

```.js
class MyClass extends React.Component {
  handleHover() {
    alert('I am an event handler.');
    alert('I will be called in response to "hover" events.');
  }
}
```

prop の名前は `on` とイベント・タイプをつなげたものとなります。「click」イベントを待機しているなら、prop の名前は `onClick` になります。「keyPress」イベントを待機しているなら、prop の名前は `onKeyPress` になります。

```.js
class MyClass extends React.Component {
  handleHover() {
    alert('I am an event handler.');
    alert('I will listen for a "hover" event.');
  }

  render() {
    return <Child onHover={this.handleHover} />;
  }
}
```
5分で出来る シャボン玉っぽいオブジェクトを作るTIPS

SVG animationを使ってサクッとﾓﾆﾓﾆした有機物っぽい動きを作るためのTIPSです。
ただし、この方法はIE11およびEdgeは非対応ですのでご注意ください。
SVG animation 対応状況: https://caniuse.com/#feat=svg-smil

# キーフレームとなる要素の用意
適当なグラフィックソフトを使って、アニメーションのフレームとなるベクター図形を用意します。
ポイントとして各フレームごとにあんまり大きく変化させないようにします。
ベースになるオブジェクトをつくって、アンカーポイントをちょっとだけずらすぐらいの調整にするがいい感じです。
<img width="369" alt="スクリーンショット 2018-01-27 23.22.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/7193/669d9dfb-b680-d44e-ddd3-f42a74ff281a.png">

# SVGタグに落とし込む
要素をそれぞれSVGとして書き出し、アニメーションさせる要素（今回はpathのみ）を中身をコピペして定義していきます。
以下の例ではanimationの最後に一番最初の形のパスを指定して、繰り返した時に不自然な動きにならないようにしています。（あんまりスマートじゃないですね。もっといい方法がありそう）

このとき、各フレームの要素がviewBoxからはみ出してしまわないように注意してください。
各フレームごとの要素の最大値を使うのが手っ取り早いと思いますが、縦横比が大きく違うような物をアニメーションさせる場合はベクター図形を制作している段階で気をつけておく必要があります。

```xml
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 656 584">
    <path d="M625,319c0,164-178,279-342,279S4,429,4,265,173,4,337,4,625,155,625,319Z" style="fill:#b9efef;stroke:#b9efef;stroke-linejoin:round;stroke-width:8px">
        <animate attributeName="d"
                 repeatCount="indefinite"
                 dur="3s"
                 to="M652,265c0,164-151,315-315,315S4,456,4,292,209,4,373,4,652,101,652,265Z" />
        <animate attributeName="d"
                 repeatCount="indefinite"
                 dur="3s"
                 to="M607,292c0,164-169,279-333,279S4,384,4,220,200,4,364,4,607,128,607,292Z" />
        <animate attributeName="d"
                 repeatCount="indefinite"
                 dur="3s"
                 to="M652,265c0,164-151,315-315,315S4,456,4,292,209,4,373,4,652,101,652,265Z" />
        <animate attributeName="d"
                 repeatCount="indefinite"
                 dur="3s"
                 to="M625,319c0,164-178,279-342,279S4,429,4,265,173,4,337,4,625,155,625,319Z" />
    </path>
</svg>

```


# 必要に応じて動きをつける
パスを変化させるのと併せて、ゆっくり回転させるとそれっぽい感じになります。
SVG内で回転アニメーションをすることも出来るみたいですが、今回はシンプルにCSSのanimationを使いました。変化させる時間や回転速度は適宜調整するとそれっぽい感じ度が上がると思われます。

## 動作サンプル
<p data-height="265" data-theme-id="0" data-slug-hash="KZOLvx" data-default-tab="html,result" data-user="ampersand_xyz" data-embed-version="2" data-pen-title="shabon" class="codepen">See the Pen <a href="https://codepen.io/ampersand_xyz/pen/KZOLvx/">shabon</a> by ampersand_xyz (<a href="https://codepen.io/ampersand_xyz">@ampersand_xyz</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
scalaで書いたUDFをpysparkから呼び出したい

# 動機
sparkのプログラムを書いていて計算速度が思ったよりでないときがあった。調べるとpythonで書かれたuser defined function (UDF) は速度が遅いらしい。というのはspark自体がJavaで書かれていて、UDFをpythonで書いてしまうとJavaとpythonの間を変換する作業が走るから遅いとのこと。もうだいぶpythonで書き進めてしまい、今更scalaやjavaで書き直すのはめんどくさい。そこでscalaで書いたUDFをpythonから呼び出すことにした。

# 参考サイト
ここが一番わかりやすい
http://blog.einext.com/apache-spark/scala-udf-in-pyspark

http://blog.einext.com/apache-spark/scala-udf-in-pyspark
https://stackoverflow.com/questions/33233737/spark-how-to-map-python-with-scala-or-java-user-defined-functions
https://qiita.com/suin/items/b8a7af13b00cfdecfd1e
https://qiita.com/ytanak/items/97ecc67786ed7c5557bb
https://www.slideshare.net/SparkSummit/getting-the-best-performance-with-pyspark
# 動作環境
ここを参考につくってください。
https://qiita.com/neppysan/items/0fe706f04b001c082d38


# scalaでUDFを書く
##scalaビルド用ディレクトリ作成
以下のディレクトリを作成

```

├── project
│   └── target
│       └── config-classes
├── src
│   ├── main
│   │   ├── resources
│   │   └── scala
│   └── test
│       ├── resources
│       └── scala
└── target
```
## ビルド設定ファイルの作成

`./build.sbt`に以下を書き込む（よくわかってない）

```
name := "SparkUDFs"
version := "0.1"
scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-sql"       % "2.1.0"
)
```
## scalaのUDFを作成

`./src/main/scala/scalaudf.scala`に以下を書き込む

```scala
package com.example.spark.udfs

import org.apache.spark.sql.api.java.UDF1

class addOne extends UDF1[Integer, Integer] {
  def call(x: Integer) = x + 1
} 
```
## .jarの作成
次のコマンドを叩く。15分ぐらいかかる。

```
root@spark:~/scala_udf# sbt clean package
```
`./target/scala-2.11/scala_udf-assembly-0.1-SNAPSHOT.jar`ができたことを確認。

#サンプルデータの作成
`./sample.json`を作成

```json
{"name":"a","value":1}
{"name":"b","value":2}
{"name":"c","value":3}
```

# pythonファイルの作成

./test.pyを作成

```python3
from pyspark import SparkContext
from pyspark.sql import SparkSession, SQLContext

spark = SparkSession.builder.appName("test").getOrCreate()
sc = spark.sparkContext
sqlContext = SQLContext(sc,sparkSession = spark)

sqlContext.registerJavaFunction("add_one", "com.example.spark.udfs.addOne")
readfile = "/root/scala_hello_world/sample.json"
sample = spark.read.json(readfile)
sample.createOrReplaceTempView("sample")
data = spark.sql("SELECT name,value, add_one(cast(value as int)) from sample")
data.show()
```

追記
spark2.3からはこれでOK

```python3
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("test").getOrCreate()
spark.udf.registerJavaFunction("add_one","com.example.spark.udfs.addOne","integer")
readfile = "/root/scala_hello_world/sample.json"
sample = spark.read.json(readfile)
sample.createOrReplaceTempView("sample")
data = spark.sql("SELECT name,value, add_one(cast(value as int)) from sample")
data.show()
```

#コマンド実行

```
root@spark:~/scala_udf# spark-submit --jars ./target/scala-2.11/scala_udf-assembly-0.1-SNAPSHOT.jar test.py
+----+-----+-----------------------+                                            
|name|value|UDF(cast(value as int))|
+----+-----+-----------------------+
|   a|    1|                      2|
|   b|    2|                      3|
|   c|    3|                      4|
+----+-----+-----------------------+

```

おわり。
Raspberry Pi3(ラズパイ3)をキーボードなし/LANケーブルなしで初期設定する

#はじめに

Raspberry Pi3をキーボードなし/LANケーブルなしで初期設定するためのメモです。(Windowsで)

#1. OSインストール

1. DD for Windowsをダウンロード
http://www.si-linux.co.jp/techinfo/index.php?DD%20for%20Windows

1. RASPBIAN STRETCHをダウンロード（DESKTOP/LITEどちらでも。NOOBSはダメ。）
https://www.raspberrypi.org/downloads/raspbian/

1. DD for Windowsを**管理者権限で起動**して、microSDへ書き込む。

※ここのあたりは、ググるとより詳しい説明が見られます。

#2. 初期設定

1. sshファイルをルートフォルダへ格納する。中身は空でOK。

1. wpa_supplicant.confファイルをルートフォルダへ格納する。ファイルの内容は以下です。ssid,psk(平文)は環境に合わせて修正を。:warning:初期設定完了後にpskは暗号化しましょう:warning:

```text:wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="hogehoge"
    psk="hogehogepassword"
}
```

 
Windowsから見るとこんな感じになります。 
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/213203/c54aa40f-7525-31e0-a9bc-cfb72437b0c9.png)

#3. Raspberry Pi3起動

microSDをRaspberry Pi3へ差して、電源ON。繋がります。
【はじめてのプログラミング】Ruby をはじめるときの いろは

#Rubyを触るための基礎知識

###**そもそもRubyとは何か？**
>Rubyは絶妙にバランスのとれた言語です。 Rubyの作者である、Matzことまつもと ゆきひろ氏は、好みの言語(Perl、Smalltalk、Eiffel、Ada、Lisp)の一部をブレンドし、 関数型プログラミングと命令型プログラミングが絶妙に調和された新しい言語を作りました。

![ruby.jpeg](https://qiita-image-store.s3.amazonaws.com/0/202968/20b21871-ba08-1154-4674-450c1634c9aa.jpeg)


端的に言えば、「日本人が作った、いいとこ取りのめっちゃええプログラミング言語」です。
また、Rubyの特徴の一つに「オブジェクト指向」という表現があります。
プログラマ以外の方と話すときに、「オブジェクト指向のプログラミングが〜」というとちょっと分かってる風に思われます。
ただしプログラマの前で話してはいけません。野球の話のときに、ポジションの説明をしているようなものです。

で、オブジェクト指向とは何かというと、
**「ものを細かく分解して、もう一回使いやすいように整理すること」**
だと思ってもらえればいいです。
(超わかりやすいように個人的に整理した言い方ですので、異なる点があることはご承知おきください。)

【参考リンク】
[Rubyを始めたけど今ひとつRubyのオブジェクト指向というものが掴めないという人、ここに来て見て触って！](http://++.github.io/2013/02/07/understand-ruby-object/)


Ruby以外の言語の多くも、このオブジェクト指向という考え方に沿っているものの、
Rubyはその中でも特にその色が強いといわれています。

###**Rubyを使ってみる**
まずRubyを始めたい、という方はまずはProgateの無料コースを受講することをおすすめします。

[Ruby | プログラミングの入門なら基礎から学べるProgate[プロゲート]](https://prog-8.com/languages/ruby)

Rubyを実際に私達のPCでいじるためには、環境構築あるいはCloud9というアプリケーションを使う必要があります。
環境構築は利用者のPCやOSのバージョンによって方法が異なるため、初心者にとって非常にハードルが高いです。
Cloud9の利用は比較的ハードルが低く、かつかんたんなサービス開発であれば事足ります。
しかし、「すぐにRubyを触ってみる」ためには一手間かかります。
【参考リンク】
[Cloud9の使い方と便利機能！最強プログラミング開発環境（IDE）](https://www.sejuku.net/blog/385)

よって、いつもおなじみProgate様でRubyってどんなもの？どんなことができるん？というのを触ってみることをおすすめします。

あるいは英語が読める方であれば公式の[Ruby Tutorial](http://tryruby.org/levels/1/challenges/0)ではブラウザからRubyをいじることができます。

###**Rubyの基本文法**

Rubyってどうやって書くの？をかんたんにご紹介します。
各文法を暗記する必要はなく、「あ、簡単そうだな」と思えればそれがゴールです。

■基礎文法


```
print("Hello, Ruby")
# 「Hello, Ruby」という文字列をコンソールに表示する
```

printは**メソッド**と呼ばるもので、"Hell, Ruby"という文字列は**文字列オブジェクト**です。
"   "のなかを違う文字に変えればその文字がコンソールに表示されます。
ちなみにRubyのメソッドでは()を省略することができます。

ちなみに、printに似たものとして以下の２つがあります。

```
p "Hello, Ruby"
puts "Hello, Ruby"
```

さらに数字の表示と計算は以下のとおりです。

```

puts (10)
# 10という数値を表示する

1 + 1
# 2 が表示される

2 - 1
# 1 が表示される

3 * 3
# 9 が表示される

4 / 2
# 2 が表示される

```
そしてこれらの文字列や、数値を一時的に「箱に保存する」ことができます。
その箱のことを変数、といいます。
イメージとしては下記の図がわかりやすいかな、と思います。
中学、高校の数学でならったXを使った計算に近い考え方です。
![ダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/202968/299eebeb-c1a3-1bfd-f18a-9483b03ef223.png)

```
alphabet = "abc"
japanese ="あいう"
# いまalphabetという名前の箱には"abc"が、japaneseという名前の箱には"あいう"の文字列がそれぞれはいっています

print "これが" + alphabet + "です"
#「これが abc です」という文字列が表示される

print "これが" + japanese + "です"
#「これが あいう です」という文字列が表示される
```

Rubyにかぎらずすべてのプログラミング言語において、この変数という概念が登場します。
書き方はどの言語もほとんど変わりませんが、
***[変数名] = [入れたい文字列や数値、変数など]***
というかたちです。
SESでメールを受信してS3バケットに保管する

# 手順概要
SESを使ってS3のバケットに受信メールを保管するまでの手順を整理する。

# 手順詳細

## Rule Setの作成
SESのホーム画面で、`Email Receiving`から`Rule Sets`を選択する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/4b477913-703f-7b10-a124-dc0c07903f38.png)

`Create a New Rule Set`をクリックする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/526fc3b4-7a77-0853-ab8d-75604f250f8a.png)

Rule setの名前(Rule set name、ここではtest-rulesetを指定する)を記述し、`Create a Rule Set`ボタンをクリックする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/9aaa7a12-61db-4d4d-f0b0-3e9fa39310e2.png)

この時点では作成したRule set(test-ruleset)は有効化されず、
`Inactive Rule Sets`として作成される(あとで有効化する)。
`test-ruleset`リンクを選択してRuleの作成に進む。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/82e23d64-93bb-f7ff-9a9d-f42d62cfb432.png)


## Ruleの作成

`Create Rule`ボタンをクリックする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/79a667e5-4998-1e59-0e4b-ad9e85dc119c.png)

### Ruleを適用する受信先メールアドレスの設定

`Recipients`(受信先メールアドレス)を指定する。
特に指定しない場合は、受信可能な全てのメールアドレスを対象としたルールになる。

受信先メールアドレスを記載したあと、`Add Recipient`ボタンをクリックしてRuleを適用するアドレスを指定する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/e6de1cb1-e2a4-01be-886c-388c452ee8f9.png)

指定が終わったら、画面右下の `Next Step` ボタンをクリックする。

### メール受信時アクションの設定

メールを受信した際にどのようなアクションを実行するのかを指定する。
メールをBounceさせたり、特定のLambdaを実行させたりといったことも可能。
今回は`S3`を選択して、**特定のバケットにメールを保管する**。
(複数のアクションを指定することももちろん可能)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/6e235111-c98d-b562-7bfe-fea1cc3ef4bd.png)

#### S3のアクションの指定

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/f3766f4f-7d78-35c1-b571-d415c421b0db.png)

1. 保管先とするS3バケットを指定する
2. S3バケットにメールが保管された際の通知先SNSトピックを指定する(オプション)

ここまで完了したら、画面右下の `Next Step`ボタンをクリックして、
次のステップ(Rule詳細の設定)に進む。

### Rule詳細の設定

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/451d125d-1ad4-fc25-f0ef-a1dca34f627d.png)

1. Ruleの名前を指定する
2. Ruleを所属させるRule setの名前を指定する
3. Rule適用の順番を指定する(直前のRuleをどこにするかを記述)
    - この場合は、単一のルールしか設定していないので`<Beginning>`を指定して、最初に評価・適用されるRuleとする。

## Rule Setの有効化

先ほど作成したRule set(test-ruleset)を選択して、
`Set as Active Rule Set`ボタンをクリックする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/e78346b2-9a89-3fb7-cb32-0f96b8a26468.png)

## メール受信の確認

対象となるドメインのメールアドレスにメールを送信する。
(Ruleの対象となる受信先アドレスを指定している場合はそのメールアドレスに送信する)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/60376ef3-ce50-df2e-47c6-f827404d1177.png)

下図のように指定したS3バケットにメールが届いていれば受信できている。
(MIME形式なので、対応したアプリケーションでの読み込みが必要)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/fdc2224c-8e81-828a-6ca8-5e468cf8b46d.png)
grammyawardsnews

[Grammy Awards 2018 Nominees Highlight]( https://grammyawardsnews.com/)
[Grammy Awards 2018 Nominees Highlight]( https://grammyawardsnews.com/)
[Grammy Awards 2018 Nominees Highlight]( https://grammyawardsnews.com/)
[Grammy Awards 2018 Nominees Highlight]( https://grammyawardsnews.com/)
[Grammy Awards 2018 Nominees Highlight]( https://grammyawardsnews.com/)
[Grammy Awards 2018 Nominees Highlight]( https://grammyawardsnews.com/)
[Grammy Awards 2018 Nominees Highlight]( https://grammyawardsnews.com/)
express-validator新旧API比較

# はじめに

Expressを調べる機会があり、バリデーションということで[express-validator](https://github.com/ctavan/express-validator)も調べようとしたのですが、
・・・あるぇ？本とかに書いてあるのとAPIが全然違う？(。´･ω･)?

どうやら2017年8月末にリリースされたv4.0.0から新しいAPIが導入されたようです。誰も何も言ってないのはlegacy APIとして従来のAPIも提供されているからでしょう。

# 比較してみた

新旧のAPIで同じことをするコードを書いてみました。プログラム全体は以下にあります。
https://github.com/junjis0203/comparison_express-validator_api

以下、APIを見比べて感じたことです。

## あるパラメータに対するvalidateとsanitizeがまとめて書けるようになった

これが大きい気がします。旧APIでは以下のようにcheckとsanitizeを分けて書かないといけませんでした。また、sanitizeはチェーンではなくサニタイズされた結果を返すためサンプルのように分けて書く必要があり非常にいけてません。

```js:legacy_api.js抜粋
    req.check('name', 'Name must be specified').notEmpty();
    req.check('mail', "E-mail don't look like E-mail").isEmail();

    // legacy API can't chain sanitization
    req.sanitize('mail').trim();
    req.sanitize('mail').normalizeEmail();
```

新APIではこんな感じに書けます。ふとどれがvalidationでどれがsanitizationかわかりにくいかもという気もしましたがこっちの方がかっこいいからよし（個人の感想です）

```js:new_api.js抜粋
    check('mail', "E-mail don't look like E-mail")
        .isEmail()
        .trim()
        .normalizeEmail()
```

## custom validatorが書きやすくなった

今度は新APIを先に見せます。先のmailパラメータに対するvalidationには続きがあって以下のようにcustomメソッドですでに登録されているメールアドレスかチェックしています。
ちなみにJavascript素人でPromiseよくわからないのでexpress-validatorのUsageとは違いベタにtrue返してます。（true返さないとvalidation failになるのがわかりにくかった）

```js:new_api.js抜粋
    check('mail', "E-mail don't look like E-mail")
        .isEmail()
        .trim()
        .normalizeEmail()
        .custom(function(value) {
            if (exists_entry(value)) {
                throw new Error('this email is already in use');
            }
            return true;
        })
```

旧APIにもcustom validatorを登録する方法はあるのですが、なんとなくこういうアプリ固有チェック的なものはグローバルなvalidatorとして登録するのはいまいちなんじゃないか（個人の感想です）と思い旧API使用サンプルではValidationResult取得後に確認を行っています。

```js:legacy_api.js抜粋
    req.getValidationResult().then(function(result) {
        errors = undefined;
        if (!result.isEmpty()) {
            errors = result.array();
        } else {
            entry = {name: req.body.name, mail: req.body.mail};
            // this check is too specific for installing custom validator
            if (exists_entry(entry.mail)) {
                errors = [{ param: 'mail', msg: 'this E-mail address is already in use' }];
            } else {
                add_entry(entry);
            }
        }
```

## validationしたパラメータだけをまとめたオブジェクトを返すAPIができた

旧APIでは上のコードにあるようにvalidationを行った後、reqオブジェクトから改めて値を取り出す必要があります。超いけてません（個人の感想です）

新APIではvalidation（sanitiationのみのものも可）したパラメータをまとめてオブジェクトとして返すmatchedDataが提供されています。

```js:new_api.js抜粋
        entry = matchedData(req);
```

どこから取り出さないといけないかが隠蔽されてていい雰囲気ですね。
そういえば書き忘れていましたが新APIは処理本体の前にミドルウェア的？に記述するようです。パラメータが満たすべき条件を宣言的に書けるのがいいなと思いました。

# 新APIのここがダメ

`notEmpty`が提供されていません。
はじめ`exists`がそれだろうと使っても空文字列がすり抜けるので確認したところ「existsはundefinedじゃなければおｋ」とのことでした。

`notEmpty`相当のことをするには、`isLength({min: 1})`とする必要があります。

（追記）
`not().isEmpty()`と書けばよいとの[コメント](https://qiita.com/junjis0203/items/1f9be7fc181676b84d12#comment-46a5459d5a946b1acfa4)をいただきました。

# まとめ

express-validatorの新APIでいいなと思った点をまとめます。

- 旧APIでは分かれていたvalidateとsanitizeをパラメータごとに書けるようになった
- アプリ固有チェック的custom validationが書きやすい
- 宣言と処理が分離されており、パラメータをまとめたオブジェクトが取得できる
Rust で tail コマンドを実装してみた


#キッカケ
ある日、急に Rust を使ってみたくなって、何か簡単に実装できるもので、かつ実用的になりそうなものを考えてみたところ、tail コマンドを実装することにしてみた。

C 言語での実装を参考に、ロジックは出来るだけそのまま利用して実装した。

#実装環境

```
$ cargo -V
cargo 0.24.0 (45043115c 2017-12-05)
$ rustc -V
rustc 1.23.0 (766bd11c8 2018-01-01)
```

#実装結果

[rtail github](https://github.com/17g/rtail)

```
Usage: rtail [options] FILE

Options:
    -n NUMS             number of lines
    -h                  print help
```

まだ、借用チェッカーとの激しい戦いは収まらず、書きたい様に書けている感じが全然しない。
コンパイラに乗せられてコード書いてる感じ。

現状は初期実装のレベルで、最終的には標準入力からの処理と -f のフォロー処理は実装したいと思っている。

個人的な普段利用は macOS だが、仕事用 PC の Windows マシン用に書いている。
※まだ Windows での動作は未確認。

#手元にあった、12 万行弱のログファイルを使ってベンチしてみた

- tail (C 言語)

```
$ time tail -n 10000 120000.log
tail -n 10000 120000.log  0.06s user 0.02s system 30% cpu 0.251 total
```

- rtail (Rust/debug)

```
$ time ./target/debug/rtail -n 10000 120000.log
./target/debug/rtail -n 10000 120000.log  0.63s user 1.15s system 90% cpu 1.979 total
```

- rtail (Rust/release)

```
$ time ./target/release/rtail -n 10000 120000.log
./target/release/rtail -n 10000 120000.log  0.26s user 1.14s system 87% cpu 1.591 total
```

遅い。。遅過ぎる。
多分自分の実装が悪い。。はず。

#追記(速度改善に取り組んだ 2018/01/28 1:10)
遅い原因は、何となく tail 結果表示バイト位置を決めるループにあるんだろうと考えていたが、実際その通りで、ファイルの読み取り位置を seek するバイト配列のバッファサイズを大きめ( 1024 バイト)にとってやったら劇的に速度改善した。

- rtail (Rust/debug improved)

```
$ time ./target/debug/rtail -n 10000 120000.log
./target/debug/rtail -n 10000 120000.log  0.09s user 0.01s system 70% cpu 0.132 total
```

- rtail (Rust/release improved)

```
$ time ./target/release/rtail -n 10000 120000.log
./target/release/rtail -n 10000 120000.log  0.00s user 0.01s system 7% cpu 0.205 total
```

C 実装並かそれ以上に速度が出ていて、いい感じ。ステキ。
バッファサイズを 1024　バイトにしたのは結構適当で、バッファサイズを 4096 バイトあたりまで試してみたが、これ以上の目立った速度改善は見られなかったので、1024 に留めておいた。

#追記(標準入力からの処理を追加した 2018/01/29 23:30)

これと言って書くこともないのだが、機能追加したので追記しておく。
処理自体は結構バタ臭いというか泥臭いことをしているが、パフォーマンスチェックしたところ、上記の改善版と大きく変わらない速度が出ていたので、良しとする。

#追記(ファイルの監視追加読み込みを実装した 2018/02/03 17:00)

-f のオプションで動くファイル監視をして追加分を表示する機能を実装した。
マルチプラットフォームでそのあたりをさくっとやってくれる crate([passcod/notify](https://github.com/passcod/notify)) を見つけたので、それを使えばあっさりと実装できた。

ただ、今のところ、狙い通りに動くのは linux でのみ。
macos と windows では、以下の通り。

- macos 

一部のケースでしかうまく動作しない。具体的に言うと /var/log/wifi.log などを監視している状態で Wifi の状態が変わっても何も読み込みが行われなかった。(適当なテキストファイルだとちゃんと動作する)
notify の実装を見てみると、macos の場合、FSEvents を使ってファイル監視しているようだ。
試しに homebrew で fswatch をインストールし、モニタリング方法を fsevents_monitor と
 kqueue_monitor で切り替えてみたところ、kqueue_monitor でのみファイルの変更通知が来た。

FSEvents の仕様上、通知しないパターンがあるようだ。残念ながら、そういう記述がある箇所は見つけきれなかった。
notify の isuue にも kqueue の実装が入っていたので、実装されるのを待とうと思う。

- windows

macos のケースと同じで、別プロセスが掴んでいるファイルの追加読み込みが行えない。
tail を流した状態で、そのファイルを掴んでいるプロセスを落とすと一気に読み込みが行われる。

マルチプラットフォームのアプリケーションって難しい。
smarty インストール 備忘録

# smarty 2 インストール
- smarty 2.5.19 をダウンロード
- ダウンロードしたzipファイル内のlibsディレクトリ内を全て自分の作成しているディレクトリにコピペ
- 新たに以下のフォルダを作成
    - templates
        - ここにテンプレートファイル(.tpl)を入れていく
    - templates_c
    - cache

完了
TypeScriptでオブジェクトの部分更新する方法

# 概要

JavaScriptやTypeScriptでプログラムを書いていて、オブジェクトの一部のフィールドだけ更新した新しいオブジェクトを返したい、というケースが増えてきました。
これはイミュータブルなオブジェクトを使ってデータを管理する手法が流行ってきたのが大きな原因だと思います。たとえば React の props や state は、オブジェクトの一部を書き換えるのではなく、常に新しいオブジェクトを作って値を差し替える手法を採っています。

では、このようなデータを更新するのを TypeScript でどうやるのかというのを試行錯誤してきたのですが、Spread演算子とPartialを使うことで、おそらく一番楽な方法だと思われる手順を発見したので共有します。


# 手順

いくつかのフィールドを持ったデータの塊があるとします。
たとえば以下のようなユーザデータを考えます。

```ts
interface User {
  name: string;
  tel: string;
  age: number;
}
```

このデータをフォームの編集で使うことを考えます。フォームで各フィールドを編集し、編集されたデータはリポジトリという場所に保存するということにします。リポジトリにデータが保存されるとフォームに通知され、表示が更新されます。

リポジトリにユーザを保存する処理を以下のように書きます。

```ts
class Repository {
  user: User;

  updateUser(newUser: User) {
    this.user = newUser;
  }

  ...
}
```

updateUser()メソッドは、User型のデータを受け取り保存します。

次にupdateUser()メソッドを呼び出す部分の処理を考えてみます。
Reactを使っているなら、それぞれのフィールドごとにonChange ハンドラを作る感じになるでしょう。ユーザ名が変更されたときの処理は以下のように書けます。

```ts
  onChangeName(e: React.FormEvent<HTMLInputElement>) {
    const oldUser: User = this.props.user;
    const str: string = e.currentTarget.value;
    const newUser: User = {
      name: str,
      tel: oldUser.tel,
      age: oldUse.age
    };
    repository.updateUser(newUser);
  }
```

最初、↑のように書いていたのですが、各フィールドのonChangeごとにこれを書くのは辛すぎます。
幸いなことに、Spread演算子を使うことで、oldUserからのコピー部分は大きく省略することができます。

```ts
  onChangeName(e: React.FormEvent<HTMLInputElement>) {
    const oldUser: User = this.props.user;
    const str: string = e.currentTarget.value;
    const newUser: User = {...oldUser, name: str};
    repository.updateUser(newUser);
  }
```

さらにPartialを使うことで、onChangeハンドラの記述量を減らすことができます。

そもそも古い情報と更新したい情報のマージをonChangeハンドラで行っているのは、repository.updateUser() がUser型を受け取っているからです。
本当なら onChangeハンドラでは「どのフィールドを更新するか」という情報だけを扱って、その情報をrepository.updateUser()に渡すことができればベストです。

これを実現する方法を考えてみます。Spread演算子でUser型のオブジェクトと差分オブジェクトのマージを行って、User型のオブジェクトを得るためには、差分オブジェクトがUser型の部分集合である必要があります。

```ts
// ↓の式が成り立つには、orgUserはUser型で、partOfUserはUser型の部分集合でないといけない。
const updatedUser: User = {...orgUser, ...partOfUser}
```

User型の定義を再掲します。

```ts
interface User {
  name: string;
  tel: string;
  age: number;
}
```

このUser型の部分集合を、TypeScriptでは以下のように定義することができます。

```ts
interface UserPartial {
  name?: string;
  tel?: string;
  age?: number;
}
```

ありがたいことに、TypeScriptにはこのような部分集合を作るためのPartialというMapped Typeが定義されています。上で定義したUserPartial と同様の型は、以下のように表現できます。

```ts
Partial<User>
```

repository.updateUser() を、Partial<User> を受け取るように書き換えてみます。

```ts
class Repository {
  user: User;

  updateUser(part: Partial<User>) {
    this.user = {...this.user, ...part};
  }
}
```

呼び出し元部分をこれに合わせて書き換えます。

```ts
  onChangeName(e: React.FormEvent<HTMLInputElement>) {
    const str: string = e.currentTarget.value;
    repository.updateUser({name: str});
  }
```

今やonChangeハンドラは元のオブジェクトを知る必要も、マージをする必要もなくなりました。
このやりかたが一番楽だと思います。

また、repository.updateUser() の引数は、User型の部分集合であることをコンパイラがチェックしてくれるため、間違ったフィールド名や型を引数に渡すとコンパイラエラーを起こしてくれます。便利。


# まとめ

Partialはオブジェクトの部分更新をするのにとても便利だという知見の紹介でした。
ご参考まで。
SESでメール送信ドメインの登録を行う

# 目的
- SESドメインを認証するための手順について整理する。
- おそらく今後何度も行うと思われるので自分向けの備忘録

# 前提

- 認証したいドメインがすでにRoute 53の管理配下におかれていること

# 手順

Route53の画面に移動する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/337ee9a0-5b04-b9c1-3adb-e761b65119d4.png)

1. SESのホーム画面で、`Identity Management`→`Domains`を選択する。
2. `Vefify a New Domain`ボタンをクリックする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/05b45d94-b2b0-6e82-e62d-8b80054640ad.png)

対象としたいドメイン名(ここでは`example.com`)を入力する。
また、DKIMを使ったメールの送信者認証を行う場合は、
`Generate DKIM Settings`チェックボックスを`ON`にする。
ここまで終わったら、`Verify This Domain`ボタンをクリックして、
次の画面へと遷移する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/acff264f-d126-75f1-5f65-3b5e5dcea70e.png)

確認のダイアログが表示される(2回表示される。上記SSは2回目の画面)。
メールの受信を行う場合は`Email Receiving Record`のあたりに表示されるチェックボックスを`ON`にする。
**今回は設定するドメインがRoute 53の配下にあるので、`Use Route53`ボタンをクリックするのみで設定は完了**する。
(Route 53以外で管理している場合は表示されたDNSレコードの設定をドメインを管理しているDNSに設定する)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/40692/0166118c-aaae-1082-c47e-93f5b1d8d3dc.png)

設定したドメインのステータスが`verified`になっていれば設定完了。
AWSのCLIからメールを送信してみてちゃんと送信できるかも念のため確認すれば一旦はOK。
さくらvpsの初期設定でやったこと(CentOS7)

## はじめに
さくらvpsを借りてみました。登録手続きが想像以上に簡単で、15分くらいでsshログイン確認までできてしまい驚きです。
グローバルIPが払い出された訳ですが、このままではどこからでもroot直ログできる危険な状態です。。。。
とりあえずインストール直後に最低限設定したことをまとめていこうと思います。

##### この設定もしたほうがイイよ！　というものがあれば是非ご教授頂けると助かります。

<font color=red>【更新履歴】</font>
<font color=red>2018/9/7：日本語文字化けへの対応について追記</font>

## 一般ユーザを作る
初期状態はrootユーザしかないため、まずは一般ユーザを作成します。今後はrootユーザに直接ログインすることは禁止し、一般ユーザでログインしてスイッチするようにします。

```bash
useradd ユーザー名
passwd ユーザー名
usermod -G wheel ユーザー名
```

## ssh設定
パスワードログインを禁止し、公開鍵認証のみ許可する設定を行う。

```bash
vi /etc/ssh/sshd_config
# sshd_configを次のように編集する

PermitRootLogin no # root直ログを禁止する
PermitEmptyPasswords no # 空パスワードの禁止
PasswordAuthentication no # パスワードログインの禁止

# 最後にsshdの再起動
service sshd restart
```

次にssh-keygenで秘密鍵、公開鍵のペアを作ります。クライアント側(自分のPC側)とサーバ側(さくらvps側)どちらで作成しても構いませんが、クライアント側に秘密鍵、サーバ側に公開鍵を配布します。
NW経由で秘密鍵を受け渡しはしたくないので、今回は自分のPC上でssh-keygenをして、サーバ側に公開鍵を配布するようにしました。

```bash
ssh-keygen -t rsa
Enter file in which to save the key (/home/user/.ssh/id_rsa): # 鍵の作成場所
Enter passphrase (empty for no passphrase): # パスワードの付与(そのままエンターしてパスワードをかけないこともできる)
```

~/.ssh/配下にid_rsaとid_rsa.pubのファイルができていることを確認。
このうち、id_rsa.pubをサーバに配布し、ssh_authorized_keysに追記すればOK。

`echo id_rsa.pub~/ >> ~/.ssh/authorized_keys`

### <font color=red>ここで注意！！！</font>
パーミッションは必ず下記のように設定します。過不足あるとうまく認証できません。私はどハマりしました、、、

```
chmod 700 /home/user/.ssh
chmod 600 /home/user/.ssh/authorized_keys
```

ssh認証時に
`Permission denied (publickey).`
といったエラーメッセージが表示され、/var/log/secureに下記のようなエラーが出ている場合は要チェック！

```
Authentication refused: bad ownership or modes for file /home/ogyu/.ssh/authorized_keys
```

鍵交換ができたら、sshで接続してみます。
`ssh user@xx.xx.xx.xx -i ~/.ssh/id_ira`
※tips: -iつけなくてもデフォルトで~/.ssh/id_iraを参照する模様

問題なければsshのconfigファイルに設定を記述して、以降のログインを簡略化しちゃいましょう！

```bash:~/.ssh/config
Host vps
    HostName xx.xx.xx.xx
    Port 22
    User myuser
    IdentityFile ~/.ssh/id_rsa
```
これで次から`ssh vps`で接続できます。

## firewalldの設定
基本的にはアプリケーションの使用ポートに従って随時ポートの穴あけすれば良いと思いますが、とりあえずhttpポートくらい開けておきました。
firewalldの設定は別記事にまとめていますのでご覧ください。
[【CentOS7】firewalldによるパケットフィルタリング設定](https://qiita.com/kod314/items/450ea28500b57bed120d)

## 日本語文字化け対応(2018/9/7追記)
私はコードを書く際、コメントは頑張って極力英語で残すようにしているので、日本語の文字化けについては当初あまり気にしていませんでした。

しかし、何だかんだで日本語に出くわすこともあり、emacsで開いた時なんか日本語文字化けするー、、読めねーとフラストレーションが溜まってました。

なので、下記の設定を行いました。

```bash:設定言語の確認
echo $LANG
> C
```
やはりデフォルトの英語設定となっていたので、bash_profileに下記を追記した。

```bash:.bash_profile
export LANG=ja_JP.utf8
```

最後に設定を再度適用させればOK。

```bash
source .bash_profie
echo $LANG
> ja_JP.utf8
```

<br><br><br>他に必要だと思った設定があれば随時更新していこうと思います。
Hanamiでflashメッセージを表示する

Hanamiでflashメッセージを表示する方法です :cherry_blossom:

# バージョン

- Ruby 2.4.2 
- Hanami 1.1.0

# 事前準備

hanamiでは、デフォルトでセッションが無効になっているため、セッションを有効にする必要があります。
`apps/web/application.rb`を編集し、セッションを有効にします。

```diff:apps/web/application.rb
-      # sessions :cookie, secret: ENV['WEB_SESSIONS_SECRET']
+      sessions :cookie, secret: ENV['WEB_SESSIONS_SECRET']
```

# 使い方

## コントローラーでメッセージを定義
`flash[キー] = 値` で値を設定できます。（キーの名前は任意です。）

```ruby
flash[:success] = '成功しました。'
```

## ビューで表示
```erb
<%= flash[:success] %>
```

```erb:実装例
<% %i[success danger notice].each do |key| %>
  <p class="#{key}"><%= flash[key] %></p>
<% end %>
```

# Railsと違うところ

- Railsでは`flash`、`flash.now`、`flash.keep`等使えますが、hanamiでは、`flash.now`や`flash.keep`のような機能はありません。

- ビューで表示する際、Railsだと、よく`flash.each do |key, value|`～みたいな書き方をしますが、hanamiではできません。（`each`ができません）

### 参考
- [Class: Hanami::Action::Flash（Hanami）](http://www.rubydoc.info/gems/hanami-controller/Hanami/Action/Flash)
- [ActionDispatch::Flash::FlashHash（Ruby on Rails）](http://api.rubyonrails.org/classes/ActionDispatch/Flash/FlashHash.html)
Pythonの算術演算子 Aidemyで学んだことの備忘録

#前置き
現在、AidemyでPythonの学習をはじめたので備忘録として書いていく

#算術演算子

##足し算
x + y

##引き算
x - y

##掛け算
x * y

##割り算
x / y

##割り算の余り
x % y

##べき乗
x ** y

＃所感
PHPとは違い、 x ** yでべき乗を求められることに感動した
小さな画面のMacで戦うためのツール群

最近仕事では MacBook Pro 13 インチモデル一台のみで作業しています。家では15インチの MacBook Pro に27インチのモニターを繋いで作業しているのでそれに比べると作業効率は若干落ちている気がします。なるべく効率を落とさないで作業するためのツールを紹介します。

## Magnet

[Magnet](https://itunes.apple.com/jp/app/magnet-%E3%83%9E%E3%82%B0%E3%83%8D%E3%83%83%E3%83%88/id441258766?mt=12)

ウィンドウをドラッグして画面端に寄せたりキーボードショートカットを利用したりすると画面サイズに合わせてウィンドウを自動調整してくれるツールです。どこかの論文で読んだ気がするのですが、一説では広い画面やデュアルモニターに比べ、狭い画面ではウィンドウ操作に費やす時間が増えるそうです。それを軽減するだけでも効率はかなり上がると思います。

今のWindowsはわかりませんが、以前 Windows Vista をメインで使っていたときにはウィンドウサイズの自動調整は標準で使えた機能でしたが、Macを使うようになってから同様の機能がなくて不便でした。それを実現できたのがこのツールです。

<img width="1440" alt="スクリーンショット 2018-01-27 20.09.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/14918/df02f78e-dfbc-c244-bfd2-4ab0693ffee1.png">

## HyperSwitch

[HyperSwitch](https://bahoom.com/hyperswitch)

Macは `Command + Tab` でアプリケーションのフォーカスを変更できますが、同じアプリケーションで複数のウィンドウを開いている場合は `Command + Tab` では変更できません。同一アプリケーション内でウィンドウのフォーカスを変更するにはそのアプリケーションにフォーカスした後さらに `Command + F1` を使用する必要があり、2ステップかかってしまいます。それを1ステップで行えるのがHyperSwitchです。設定したコマンド（標準では `Alt + Tab` ?）で画面ごとに選択できるようになります。

この機能もWindowsでは標準で使えたと記憶しています。

## Alfred

[Alfred](https://www.alfredapp.com/)

定番ですが、Alfredはキーボード操作でファイルやアプリケーションを開くことができるランチャーです。Alfredから直接コマンドを実行することもできます。最近はSpotlightが使いやすくなっていると聞いているので、そちらに慣れている場合はランチャーとしてはそれほど魅力的ではないかもしれませんが、自分が気に入っているのは他のアプリケーションとの連携です。

Powerpackの購入が必要だったかもしれませんが、[Dash](https://kapeli.com/dash)と連携してドキュメントを検索したりiTunesと連携してキーボードの入力で簡単にライブラリ内を検索できるミニウィンドウを表示させたりと、各アプリを個別に開いてからマウスで操作するというような手間を省くことができます。

<img width="593" alt="スクリーンショット 2018-01-27 21.35.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/14918/79b48f95-35b1-39ff-cbd0-0f785ebb5a7d.png">

## Karabiner-Elements

[Karabiner](https://pqrs.org/osx/karabiner/) [^1]

こちらも定番ですが、キーボードの入力をいろいろカスタマイズできるツールです。

最近のMacでは caps lock をcontrolに変更したりキーリピートのスピードを変更したりというのは標準でできるのでそういう用途であれば必要ないのですが、自分は狭い画面でもせめてキーボードは快適に打ちたいということでMacのキーボードの上にHHKBを置いて作業しているので、HHKBが接続されているときにはMacのキーボードを無効にするという設定をするのに使用しています。

また、キーボードの操作でマウスカーソルを動かす機能もMacにはついていますが、どうにも使いにくかったのでKarabiner-Elementsの機能でマウスカーソルを動かせるように設定しています。

[^1]: OSがSierraになってから「Karabiner」という名前のアプリは使えなかったのですが、これからは「Karabiner-Elements」を使えということなんでしょうか。

## ShowyEdge

[ShowyEdge](https://pqrs.org/osx/ShowyEdge/)

若干タイトルからは外れるかもしれませんが、最近使っているツールとしてShowyEdgeを紹介します。これは現在の入力ソースに応じてカラーバーを表示して視覚的に入力ソースを把握しやすくしてくれるものです。毎日Vimを使っているのですが、ノーマルモードの操作のときに日本語IMEがオンになっていると思った通りの操作ができなくてストレスが溜まることがあります。ShowyEdgeを導入することで現在の入力ソースを確認がわかりやすくなったのでそのストレスを軽減できました。
VAIO PhoneでSDカードに書き込みができなかった話


日本通信VAIO Phone VA-10J(Android 5.0.2)でSDカードに書き込みができない問題にぶち当たり、試行錯誤の末に解決できたので他に困っている方々の一助になればとメモ。

# 本題に入る前に

そもそも、Android4.4以上ではSDカードの書き込みが制限されており、ファイラーアプリ等からSDカードに書き込みできるようにするためには、権限を設定する必要がある。

[【スマホのコツ】Android5.0以上でSDカードへ書き込みができるファイラーアプリとその方法：オクトバ](https://octoba.net/archives/20150718-android-feature-lollipop-sdcard.html)

ここまではネットにたくさんの情報が転がっているし、これ自体は問題ではない。

# 何が起こっていたか

「SDカードの選択」をしようとすると、エラーにより失敗。
![Select_SD_ERR](https://qiita-image-store.s3.amazonaws.com/0/233979/e01b6c87-e6f4-469c-07aa-07e30f6c1880.jpeg)

# 手がかり発見

選択を行う画面でSDカードの名前が出てこないことに気付いた。
問題ないSDカードでは、ちゃんと名前が出てくるので、これが原因ではないかと推測。
![Select_SD_NG](https://qiita-image-store.s3.amazonaws.com/0/233979/0d27509f-26c2-ea72-e777-1c6dc6dc6387.jpeg)

# 解決！

では何故名前が出てこないのか？
試行錯誤の末、SDカードのフォーマット時にボリュームラベルを付けてみることに。
![Volume_Lavel](https://qiita-image-store.s3.amazonaws.com/0/233979/d56312f9-0a5d-2d78-9780-be247e528306.jpeg)

すると、SDカードの選択の際に名前が表示され、無事書き込みができるように。
![Select_SD_OK](https://qiita-image-store.s3.amazonaws.com/0/233979/d481b938-cec8-aa09-070f-091c5b9f426a.jpeg)

# ちなみに

SDカードを挿して、設定画面で初期化するとまたまた問題が再現する。
これ、不具合では？と思うが、ご注意あれ。
![Init_SD](https://qiita-image-store.s3.amazonaws.com/0/233979/52ef7c00-76ff-0d85-f7fb-ba5f8af02585.jpeg)
XenServerにWindows10を導入する

# 1.はじめに
この前XenServerを自宅のサーバーに導入したので今回はWindows10をXenServerで仮想化しようと思い立った。
# 1.1使用したもの
- DVD
- Windows10.iso

# 2.インストール
- Windows10.isoを入手する
- DVDに書き込む
- XenServerのNew VMからテンプレにあるWindows10(64bit)を選択
- 名前を決めてインストールメディアを選択する
 - Windowsの共有でWindows10.isoを置いてそこからインストールできるらしいのだが自分にはまだ早かった模様
 - わかりやすくインストール用DVDをつくりそれをサーバーに入れた
- スペックを指定してCreate Nowで作成
 - ここで詰まった。理由は簡単でAMD-Vを有効にしていなかったため
 - BIOSからAdvanced > CPU Configuration >　SVM > [Enabled]で解決
- Windowsを選択し、consoleからWindows10を起動する
- インストールして終了

# 3.最後に
- Windowsの共有からインストールする方法を探さないと・・・。
- この投稿もまた雑なので後々修正する。
- 次はFedoraの導入したい

# 参考
https://www.tekwind.co.jp/faq/ASU/entry_134.php
https://docs.citrix.com/content/dam/docs/ja-jp/xenserver/current-release/downloads/xenserver-vm-users-guide.pdf
https://www.compnet.jp/wordpress/archives/1159
Rails 5.1系でgemを追加せずにBootstrapを導入する方法

## 背景
Rails5.1系でBootstrapを導入する際に毎回導入手順を忘れてしまうため、そのメモとして投稿させて頂きます。

## 前提
* Bootstrapを導入するためにはjQueryが動く環境が必要である
* Rails5.1以降では、デフォルトでjQueryが使用出来るようになっていない

## 導入手順1 : jQueryを導入する
*`rails _5.1.4_ new アプリ名`のコマンド実行直後でアプリの雛形が出来ている状況を想定

今回は、JavaScriptのバッケージマネージャーである `Yarn`を使います!
(`Yarn`はRailsのBundlerのように複数のパッケージを管理するツールです)

Yarn自体を導入する方法(公式HP)
https://yarnpkg.com/lang/en/

今回はMacOSのversionで導入するので、以下のコマンドを実行してYarnを導入します

```
brew install yarn
```

そして、rails newしたディレクトリ内で実行

```
yarn add jquery
```

コマンドが実行されると `node_mojules`というフォルダが生成され、中にjQueryが格納されてます。

## 導入手順2 : jQueryを読み込ませる
node_mojulesというフォルダに生成されたjqueryを`マニフェストファイル`に読み込ませます。

>*注釈 
`マニフェストファイル`とは、Railsでまとめて読み込みたいライブラリなどの情報をあらかじめ記述しておく設定ファイルのことです！

Bootstrap導入にあたって記述が必要なマニフェストファイルは以下の通り！
>#### javascript： jQueryの設定で必要
app/assets/javascript/application.js
#### css： Bootstrapそのものの設定で必要
app/assets/stylesheets/application.css

まず最初にjQueryを読み込む設定から

```application.js

<中略>
# //= require_tree . より上に　今回読み込みたいjQueryの設定を記述

//= require rails-ujs
//= require turbolinks
//= require jquery/dist/jquery.js　　←　ここが今回記述追加した部分
//= require_tree .

```

上記設定を行うことでjQueryが使えるようになりました。

## 導入手順3 : Bootstrapの導入
gemをインストールするのではなく、先ほどと同じように`Yarn`を使ってインストールします！
Bootstrap3をインストールするので、@以降に3と明記してコマンド実行

`yarn add bootstrap@3`

以下のマニフェストファイルにBootstrapを読み込む記述を追加

```application.css

<中略>
 *
 *= require bootstrap/dist/css/bootstrap.min
 *= require_tree .
 *= require_self
 */

```

### 確認

実際に`rails s`してテンプレートにBootstrapが反映されるのか確認します。

```index.html.erb
<nav class="navbar navbar-default">
  <div class="container-fluid">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#gnavi">
        <span class="sr-only">Bootstrap</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="#">Bootstrap

      </a>
    </div>
    <div id="gnavi" class="collapse navbar-collapse">
      <ul class="nav navbar-nav">
        <li><a href="">top</a></li>
        <li><a href="">menu1</a></li>
        <li><a href="">menu2</a></li>
      </ul>
    </div>
  </div>
</nav>

```

上記コード中のBootstrapのnavbarがテンプレートにも反映されていることが確認できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222024/224ec594-d385-9343-1af9-9f76b50d371c.png)

# まとめ
Rails5.1系では以前のバージョンのようにjQueryとBootstrapを`Yarn`などパッケージ管理ツールでインストールする必要がある！
しかし、gemfileに従来のように`twitter-bootstrap-rails`といったgemを追加し、bundle installしなくてよい！！

# 注記
完全に自身のメモ用の記事なので、間違いなどもあるかもしれません...
その際はご指摘頂ければ幸いです。
OSS Gateでgoogletestへの貢献を試みた

OSS Gateワークショップにビギナーとして参加し、OSS開発への第一歩を踏み出しました。

# OSS Gateとは

[Doorkeeper OSS Gate](https://oss-gate.doorkeeper.jp/)
> 「OSS Gate」とはOSS開発に参加していない人が参加する人に変わる「入り口」を提供する取り組みです。
by 公式

参加したワークショップ
[OSS Gate東京ワークショップ2018-01-27](https://oss-gate.doorkeeper.jp/events/68516)

OSSビギナーが、サポートを受けながらOSSに貢献する、というワークショップでした。
OSS開発に携わりたいけど、最初の一歩が踏み出せない、というあなた（昨日までの私！）、ぜひ人の力を借りて一歩を踏み出しましょう。

# 動機

* 達人プログラマになりたくなった。著名OSSのコードと自分のコードとのレベル差がヒドイ。
* googletestがOSSとして存在していたおかげでプログラマ人生変わった。他の人にもそうなってほしい。

# やったこと

まず、端的に成果を述べると、googletestに新しいissueを報告しました。
https://github.com/google/googletest/issues/1431
内容は、最初にサンプル動かすときに、すんなり動かせなかったので、説明追加して欲しいなー、というものです。

なんだそんなこと、と思われるかもしませんが、私にとってgoogle先生が主体のOSSに関わる、ということは、とても敷居の高いことでした。
実際に、今日OSS Gateに参加できなければ、ずっと一歩を踏み出すことができなかったと思います。

### 実際やった手順

* ビギナー1人に対して、サポーターが1人（今回からの体制のようです）。
* 貢献したいOSSを公式ドキュメント通り動かす。
* 動かすまでにやったこと、うまくいかなかったこと、を細かくメモに残す。
* 残した作業メモから、フィードバックできそうなことを整理する。
* OSS開発者に伝わるようにフィードバックをissueとして報告する。

# わかったこと

* 公式ドキュメントで不明点があると、技術ブログなどで解決しがちだが、一次ソースの質を向上することは重要である。そのためのフィードバックは、OSSへの貢献である。
* フィードバックは難しくない。普段適当に解決しているだけで、コミュニティに有用な情報を見逃しているだけ。
* 今ならやれそう！OSS開発！

# 次やること

* 最初で最後の一歩にしない。
* 来週中に次の貢献をする！
* 今年中にgoogletestのソースコードにpull requestを送る！

# 感想

行ってみて本当に良かったです。
次、OSSにフィードバック(pull requestも含めて)する敷居がぐっと下がりました。
昨日までの私と同じ境遇にいる方、ぜひOSS Gateで一歩踏み出しましょう！

# 余談

サポーターの方がまさかの同業さんだったため、組込みLinuxの話題で盛り上がりました。
新しい出会いがあるのも、この種のイベントの魅力ですよね。
["Internal Server Error"との闘い] koa(koa-session,koa-passport)でユーザー登録ページ

koaフレームワークで、以下のミドルウェアとボディーパーサーを使用してセッションを使用したサイトを作成しています。
また、ユーザー管理DBはMongoDB(mongoose)を使用しています。

* koa-session
* koa-passport
* koa-router
* koa-static
* async-busboy(ボディーパーサー)

ユーザー登録画面を作成において、使用済みIDチェックなどの処理は画面リロードなしで行うようFetch APIを使用しています。
特にユーザー登録に成功したときに、そのままサーバー側でログインした状態に移行したいなというときに、躓いたので備忘録としての投稿です。

ユーザー登録画面において、登録ボタン(signupButton)をクリックした際に、Fetch APIでPOSTリクエストを投げます。

```js:クライアント
signupButton.onclick = async evt => {
    const res = await fetch('/signup', {
        method: 'POST',
        body: new FormData(signupForm)
    });
    const resText = await res.text();
    if(resText === 'exists') {
      // 使用済みID
    }
};
```

```js:サーバー(Node.js)
router.post('/signup', async ctx => {
    const { fields } = await asyncBusboy(ctx.req);
    const id = fields.id;
    const pass = fields.pass;
    const confirmPass = fields.confirmPass;

    if (fields.id && fields.pass && fields.pass === fields.confirmPass) {
        try {
            // DB検索
            const user = await User.findOne({ id });
            if (user) {
                // 使用済みID
                ctx.body = 'exists';
            } else {
                // ユーザー登録
                const newUser = new User({ id, password });
                await newUser.save();
            }
        } catch (err) {
            // エラー
            ctx.body = 'error';
        }
    }
});
```

ここで、登録ボタンをクリックすると、ユーザー登録に成功したらそのまま自動的にログイン→ログイン後の画面に遷移したいと思い、コードを以下のように修正しました。

```js:クライアント
// ...
    // 'success'だったら'/app'に遷移する処理追加
    if(resText === 'success') {
        location.href = '/app';  
    }
    if(resText === 'exists') {
      // 使用済みID
    }
// ...
```

```js:サーバー(Node.js)
// ...
                // ユーザー登録
                const newUser = new User({ id, password });
                await newUser.save();
                await ctx.login(newUser); // passportのloginメソッドを実行し、ログイン状態に移行
                ctx.body = 'success'; // 'success'を返す
// ...
```

これでサーバー側でログイン済みの状態となるようですが、クライアント側は一応URLが'/app'になっているものの、`Internal Server Error`と表示されてしまいます。
なぜかと調査すると、そう、クッキーが空のままなのです。
どうしたものかとひと悶着したのち、以下のようにFetch APIで一行付け足すだけで解決しました。

```js:クライアント(ブラウザー)
// ...
    const res = await fetch('/signup', {
        method: 'POST',
        body: new FormData(signupForm),
        credentials: 'include' // ←これ追加
    });
// ...
```

これで、'/app'に遷移しても`Internal Server Error`とならずにログイン後のページのコンテンツが表示されるようになりました。
Bashで"たまに" or "よく"お世話になるコマンド

# はじめに

* この記事は**あくまで自分用**のチートシートです．
* 記事を読んでくださってありがたいですが，記事を読んでもわからないことがあれば**ご自身**で別途調べることをおすすめします．
 
> **わからないことがあれば自分で調べることも大切だと思います．**

* 結構即興で書いてるところが多いと思うので間違いも多いと思います．~~(自分用のチートシートなので構わない)~~
* 間違いに対してアドバイス，コメントはどんどん書いてもらって大丈夫です．むしろ嬉しい，助かります(\*^^\*)
* チートシートなのでちょこちょこ更新があると思います．

# あるファイルを連番でコピーしたい
```bash:Terminal
> seq [連番の初期値] [連番の終了値] | xargs -i cp [コピー元ファイル名] [コピーしたいファイル名]{}.[拡張子] 
```

`cp`コマンドは最後の引数がDESTになるから，ただのブレース展開だと最後の展開がDEST扱いとなりうまく実行されない．

```bash:Terminal(失敗例)
cp [コピー元ファイル名] [コピーしたいファイル名]{1..9}.[拡張子] 
```

上記の場合`[コピーしたいファイル名]9.[拡張子]`がDEST扱いとなりNG．
たぶん`[コピーしたいファイル名]9.[拡張子]`がディレクトリじゃねーよとBashに怒られる．

# Git系

## リポジトリ構築

```bash:Terminal
> git init
```

これが無いと始まらない．

## ステージング

### ステージングエリアにレッツゴー!

```bash:Terminal
> git add <追跡したいファイル名>
```

`git add *`とかでよく一括してステージングエリアにファイルを登録しちゃう．(Modifyだけなら`git add -u`が断然マシ)
悪い癖だけど便利なんだよね……
~~たまにステージングエリアぶっ壊れるけど~~

### ステージングエリアからゴーバック! (アンステージング)

```bash:Terminal
> git reset [tree-ish] <対象ファイル名>
```

**tree-ish**について知りたいなら`man git`叩いて`/tree-ish`で検索しろ!
それでわかる!

## コミット

### コミットやり直したいんだけど?

```bash:Terminal
> git commit --amend -a
```

`-C HEAD`のオプション追加でHEADへのコミットに使用したコミットメッセージをそのまま流用できる．
小文字`-c`では，流用するコミットメッセージが入力された状態でエディタが起動する．

### コミット取り消したいんだけど?

これにはいくつか方法がある．

* 以前のコミットを残して，そのコミットを**打ち消す**ためのコミットを新たに追加する方法． ･･･ (1)
* 以前のコミットを**無かった**ことにする方法． ･･･ (2)

説明が少し長くなるため，要点だけ知りたいならコマンドだけ見ればよろしい．

(1)は過去のコミットに間違いが存在し，これを取り消したことを含めてGitに記録しておきたい時に活躍する．
(2)は過去のコミットに間違いが存在したが，これを無かったこととして扱う際に活躍する．

例えると……
(1)は，直前のコミットから出現したバグを早急に修正したが，念の為バグを含んだ事実もGitの歴史に残しておきたい時に活用．
(2)は至って単純．バグなんて知らないよ?って感じでGitに記録する．

余程のことがない限りは(1)の方を用いる．
何故かって? そりゃーバグの原因を未来の自分が閲覧できるから．(GitはVCS, 歴史を刻むもの)
恥ずかしい! 黒歴史バイバイって場合は(2)をどうぞ．

少し長くなったが主役のコマンドだ．

```bash:Terminal(1の方法)
> git revert <HEADなどのtree-ish>
```

```bash:Terminal(2の方法)
> git reset [--hard | --soft] <戻したいコミットまで>
```

revertはコミットを順々に遡ること．
コンフリクトを生じる原因となり得るため．

resetは少し注意が必要．

* `--hard`オプションは，Gitのワーキングツリー，ステージングエリアとHEADの位置を含める3つ全てを指定のコミットまで移動する．
故に，直前の編集した内容を含め全てが闇に葬られる．
* `--soft`オプションは，HEADの位置のみを指定のコミットまで移動する．故に，直前のステージングエリアまでが残る．
* オプション無し(`--mixed`)は，HEADの位置とステージングエリアを指定するコミットまで移動する．故に，ステージングエリアの状態は闇に葬られるが，編集内容は崖に捕まっている状態だ．

詳しく知りたくば[ここ](https://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe)が役に立つだろう．

Gitにとってコミットは生命線，これを修正するとなるとどうしても説明が長くなりがちになる．
仕方ないじゃん? だって下手すりゃリポジトリ死ぬんだから!!!

けどGitの生命線手術ができるようになってくると玄人感出てくるから面白い．(ブランチ，タグ操作も玄人感満載で好き)

# 変更一言
20180215: Gitだけで記事一つ書けそう…
stb_image がBMPファイル読み込み時にクラッシュする問題の対処(macOS限定)

いつからか macOS 上で、 stb_image を使用しBMPファイルをロードするとクラッシュするようになりました。

どうも `-O2` で最適化した際のみに発生する問題のようで、対処法はこちらに上がっています。
https://github.com/nothings/stb/issues/514

まだ、リポジトリ上のソースには反映されていないようなので、早急に対処したい場合はコメントされている `stbi__shiftsigned` をコピーして使用します。

**2018/01/30 更新**
現在は修正が反映されています。
stb_image 2.18 以上であれば修正が反映済みです。
Emacs Lispで(a==1 && a==2 && a==3) を true にしてみたい

元ネタ： [javascript - Can (a ==1 && a== 2 && a==3) ever evaluate to true? - Stack Overflow](https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true)

これに対する Qiita 記事のまとめが以下。

- [(a==1&&a==2&&a==3)を常にtrueにするStackOverflowの問題を解いたQiita記事まとめ - Qiita](https://qiita.com/aimof/items/bb786c112f7dcc3be6c9)

flet使えば良いですね。cl-fletを使うのが推奨されているようです。ちなみにfletとcl-fletの挙動は微妙に違うのですが(たしか)、今回に限っていうとどちらでも変わらず。

```lisp
(require 'cl)

(cl-flet ((= (x y) t))
  (let ((a 10))
    (and (= a 1) (= a 2) (= a 3))))
; => t
```
React/JSXのコンパイル環境を構築

HTMLでReactのライブラリを読み込んでReactでコーディングすることは可能だが、コンパイルに時間がかかり、コンテンツが大規模になればそれなりに描画に時間がかかってしまいます。そこで、React/JSXを利用して事前にコンパイルすることが推奨されています。

本記事では、React/JSXのコンパイル環境を備忘録として書きます。

## crate-react-appのインストール

create-react-appをグローバルインストールします。

```
npm install -g create-react-app
```

## プロジェクトの作成 

例： react-jsx-appプロジェクトを作成する場合

```
create-react-app react-jsx-app
```

Reactアプリの雛形が作成される。


## webpackのインストール(任意)

webpackとは、JavascriptやCSSなどのリソースファイルを一つにまとめたり、JSXのような特殊な記法て書かれたファイルを変換するツールです。Webサイトは、様々なリソースファイルで構成されているので、webpackを利用することで、最適な形で作り変えることができます。

npmでグローバルインストールします。

```
npm install -g webpack
```

webpackでReact/JSXをビルドする場合は以下のモジュールをインストールした方が良い

- babel-loader
- babel-core

```
$ npm i --save-dev babel-loader babel-core
```

- babel-preset-react: これインストールしないとwebpackコマンドでSyntax Errorになるらしい

```
$ npm i --save-dev babel-preset-react
```