OmniAICreator/Qiita-1.07M huggingface dataset:
Djangoでローカルのdb.sqlite3のデータをファイル出力してherokuに入れる

ローカルの開発環境のDBはdb.sqlite3を使っている。
このDBのデータをherokuに移行して使いたい。
流れとしては
`$ python manage.py dumpdata`
を使ってダンプファイルを作成。
作ったダンプファイルをgitでherokuにデプロイしたうえで
`$ heroku run python manage.py loaddata [ダンプファイル名]`
とする。
※[The Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli)をインストールしている前提。

## dumpdataの使い方
### 基本形
`$ python manage.py dumpdata　> dump.json`
これが基本形。
dump.jsonというファイル名で出力。
基本はJSONで出力されます。
model.pyで管理されているテーブルとadmin関連のテーブルを対象とする（はず）。

### フォーマットの指定
`python manage.py dumpdata --format=yaml　> dump.yaml`
YAML形式が良ければ--formatで指定する。
※YAMLを使う時は[PyYAML](https://pyyaml.org/)を追加しないと処理できない。

`python manage.py dumpdata --format=xml　> dump.xml`
XML形式が良ければ--formatで指定する。

### インデント
`$ python manage.py dumpdata -–indent 2 > dump.yaml`
何も指定しないと1行でずらっと出力されるので、整形したければ-–indentでインデントする。
深く検証していないけど数字だけ？2は半角スペース2つでインデント

### ダンプするテーブルを指定
`$ python manage.py dumpdata -–indent 2　map.prefecture > dump.yaml`
テーブルを指定することができる。
上記はmapアプリのprefectureテーブルだけをダンプする。

`$ python manage.py dumpdata -–indent 2　map.prefecture map.city > dump.yaml`
当然複数テーブル指定可能。
上記はmapアプリのprefectureとcityという2つのテーブルをダンプする。

`$ python manage.py dumpdata -–indent 2　–exclude map.prefecture > dump.yaml`
基本全部ダンプでいいんだけど、一部のテーブルは除外したいという時は–-exclude
bcmbm-mruby v1.0の使い方

2019/01/23追記: [v1.1リリース](https://github.com/yamori813/bcmbm-mruby/releases/tag/v1.1)しました。

[BCM/mips mruby](https://qiita.com/yamori813/items/062e3b9969b6a59402a1)のクロスビルドしたVMバイナリーを用意したので、使い方を書きます。mrubyは2.0.0ベースです。もちろん完全非保証です。

私はFreeBSDで実行していますが、LinuxやMac OS Xでもできると思います。

ターゲットはBCM4712とBCM535xです。

まずgithubの[ソースツリー](https://github.com/yamori813/bcmbm-mruby)をリカーシブルでcloneします。

```
$ git clone --recursive https://github.com/yamori813/bcmbm-mruby.git
```

mrubyとtoolsの下でmakeしてコマンドを用意します。mrubyはhostのコマンドだけで問題ありません。

最新のリリースタグにあるmain.bin.gzのバイナリファイルをダウンロードして同じディレクトリにコピーします。解凍の必要はありません。

flashに書き込み用のイメージをビルドします。

```
% make image
```

[samples/hello.rb](https://github.com/yamori813/bcmbm-mruby/blob/master/samples/hello.rb)がコンパイルされて入ります。自分で作ったスクリプトを入れたい場合は以下のようにします。

```
% make image RBSCRIPT=myscript.rb
```

main.trxというファイルが出来上がるので、これをtftpでアクセスできるディレクトリにコピーします。

ブートローダのCFEのイメージ形式のtrxはこんな感じになってます。

![trxformat.png](https://qiita-image-store.s3.amazonaws.com/0/104066/32ab4f55-e867-748a-947d-fe278cbd681f.png)

Headerには一つ目のkernel.gzのサイズなどが入っています。二つ目のrootfs以降はただ追加されているだけです。Linuxの場合、64Kのブロックのバウンファリーにrootfsを開始位置を合わせるのですが、mrbはメモリにコピーしてから実行するので、VMのすぐ後にあります。

ターゲットにシリアルを接続して115200ボーでターミナルソフトを起動します。

ターゲットの電源を入れるとログが出るので^CでCFEを止めます。

IPアドレスはターゲットのデフォルトのIPアドレスのネットワークをホスト側にaliasで設定するか、ターゲットをホストのネットワークに設定します。

ターゲットのIPアドレスを設定する場合は以下のようにします。

```
CFE> ifconfig eth0 -addr=10.0.1.123
```

tftpでホストからmain.trxを取得してFlashに書き込みます。元々のルーターの機能は無くなりますので注意してください。

```
CFE> flash -noheader 10.0.1.37:main.trx flash1.trx
```

host側からputする場合は

```
CFE> flash -noheader : flash1.trx
```

として

```
echo "bin
put main.trx 
quit
" | tftp 10.0.1.123
```

します。

これで電源を入れ直すとmrubyのスクリプトが実行されます。

```
Starting program at 0x80001000
bcmbm-mruby 2a3c2cd(master) Fri Dec 14 15:15:50 JST 2018
mruby ec812c64(master)
BOOT_CONSOLE : uart0
Clock : 200000000
Hello Bear Metal mruby on YABM..........
```

電源投入後5秒くらいで処理に入れるのもBear Metalのメリットと思います。DHCPとかNTPするとちょっと遅くなりますが。

蟹さんと同じようにVMとmrbを完全に分離して焼く事も出来るのですが、設定の手間がかかるので、一般的なCFEのファームウエアの構成にしました。

ほとんどmrbgemが入ってないので、追加したい時はvmのクロスビルドが必要です。

このmruby VMではfloatは使えません。

# Mac OS Xでの場合

USB Ethernetモジュールを使って焼いてみました。(このときクライアントでアップできることを知らなかったので、tftpのサーバを上げる方法になります。ターゲットをtftpのサーバモードにしてputする方が簡単です。)

Ethernetインターフェースに適当なアドレスを設定します。

![スクリーンショット（2019-01-28 19.21.13）.png](https://qiita-image-store.s3.amazonaws.com/0/104066/c0c99819-3a08-77ce-73ab-14596cd744c3.png)

tftpdを起動します。

```
$ sudo launchctl load -w /System/Library/LaunchDaemons/tftp.plist
```

imageを作りtftpのディレクトリにコピーします。

```
$ make image
$ sudo cp main.trx /private/tftpboot/
```

後はターゲットで読み込んで焼きます。

```
CFE> flash -noheader 10.10.10.3:main.trx flash1.trx
Reading 10.10.10.3:main.trx: Done. 294912 bytes read
Programming...done. 294912 bytes written
*** command status = 0
```

tftpdはリブート後も起動しますので、使わなくなったら止めた方がよいでしょう。

```
sudo launchctl unload -w /System/Library/LaunchDaemons/tftp.plist
```
雪豹で試しましたが、他でもいけるのではないかと思います。
Aurora PostgreSQL 互換版（10.5）東京リージョン登場記念でパラレルスキャンを試す

この記事は **[インフラ勉強会 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/infra-workshop)** 14 日目の記事です。

昨日 13 日目は akiko-pusu さんでした。

---

AWS 東京リージョンに Aurora PostgreSQL 互換版（10.5）がようやく登場したので、パラレルスキャンを試してみました。

※**本家 PostgreSQL の実装のほうのパラレルスキャンです。**Aurora 独自実装（これを書いている時点では MySQL 5.6 互換版のみに実装されている）のパラレルクエリのことではありません。

# パラレルスキャンとは

テーブルスキャンを複数のプロセス（Worker プロセス）で実行するもので、PostgreSQL 9.6 で実装されました。PostgreSQL 9.6 ではシーケンシャルスキャン（インデックスを使わないスキャン）のみが対象でしたが、PostgreSQL 10 からはインデックスを使ったスキャンも対象になりました。

# Aurora 独自実装のパラレルクエリとの違い

これを書いている時点では PostgreSQL 互換版には未実装ですが、Aurora 独自実装のパラレルクエリは、

 * 前面の SQL ノードではなく背後のストレージノードがデータのスキャン／フェッチを担当する
 * 共有バッファを経由せずにデータを取得する

点が本家 PostgreSQL の実装と異なります。

# 試してみた

書籍**「[［改訂新版］内部構造から学ぶPostgreSQL 設計・運用計画の鉄則](https://gihyo.jp/book/2018/978-4-297-10089-6)」**の P.290 ～ の例に近い形で、1,000 万レコードのテーブルから、

 * Aurora PostgreSQL 9.6 デフォルト設定（パラレルスキャン無効）
 * Aurora PostgreSQL 9.6 `max_parallel_workers_per_gather = 2`（Worker プロセス 2 つ）
 * Aurora PostgreSQL 10.5 デフォルト設定（Worker プロセス 2 つ）

について、

 * `EXPLAIN ANALYZE SELECT id, avg(value) FROM table_i GROUP BY id;`（シーケンシャルスキャン）
 * `EXPLAIN ANALYZE SELECT id, avg(value) FROM table_i WHERE id < 10 GROUP BY id;`（インデックススキャン）

を試してみました（インスタンスタイプは db.r4.large）。

※すべての組み合わせではありません。

# 結果

以下のようになりました（単位：ms）。各々 1 回目がデータページが共有バッファに読み込まれていない状態、2 回目が読み込まれた状態です。

| バージョン／パラレルスキャン有効・無効 | シーケンシャル 1 回目 | シーケンシャル 2 回目 | インデックス 1 回目 | インデックス 2 回目 |
|:-:|--:|--:|--:|--:|
| 9.6／無効 | 6,764.665 | 2,718.139 | - | - |
| 9.6／有効 | 6,303.016 | 2,936.115 | 185,450.502 | 923.486 |
| 10.5／有効 | 5,707.766 | 2,921.991 | 42,457.903 | 493.760 |

シーケンシャルスキャンの場合、

 * データページが共有バッファに読み込まれていなければ、パラレルスキャンのほうが速い
 * データページが共有バッファに読み込まれていれば、わずかにパラレルスキャンのほうが遅い

という興味深い結果となりました。

おそらく、Worker プロセスの数が増えると結果が変わってくるでしょう。

インデックススキャンの場合、PostgreSQL 10 でかなり高速化しているのがわかります。

Aurora 独自実装のパラレルクエリではどうなるのか、楽しみです。

---

# 補足・テスト用テーブル定義とデータ生成

```sql:テストテーブル・データ
pq_test=> CREATE TABLE table_i (number SERIAL PRIMARY KEY, id INT, value INT);
CREATE TABLE
pq_test=> CREATE INDEX idx_id ON table_i (id);
CREATE INDEX
pq_test=> CREATE FUNCTION gen_data () RETURNS INTEGER AS '
pq_test'> BEGIN
pq_test'>      FOR i IN 1..10000000 LOOP
pq_test'>          EXECUTE ''INSERT INTO table_i (id, value) VALUES((random() * 10000)::int % 100, (random() * 100000000)::int % 10000)'';
pq_test'>      END LOOP;
pq_test'>
pq_test'>      RETURN 1;
pq_test'> END;
pq_test'> ' LANGUAGE 'plpgsql';
CREATE FUNCTION
pq_test=> SELECT gen_data();
 gen_data
----------
        1
(1 row)
```
android build error

### １、No toolchains found in the NDK toolchains folder for ABI with 

１、android ndk-bundle\toolchainsを確認する

C:\Users\　ユーザー名　\AppData\Local\Android\Sdk\ndk-bundle\toolchains

下記二つを存在しないためエラーとなりました。
mipsel-linux-android-4.9
mips64el-linux-android-4.9

２、公式サイトでダウンロードする
https://developer.android.com/ndk/downloads/

３、解凍する

４、下記二つのフォルダをtoolchainsフォルダに追加する
C:\Users\　ユーザー名　\AppData\Local\Android\Sdk\ndk-bundle\toolchains
mipsel-linux-android-4.9
mips64el-linux-android-4.9

### ２、Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'.

app.gradle のcompile を implementationに差し替え

    //compile fileTree(include: ['*.jar'], dir: 'libs')
    implementation fileTree(include: ['*.jar'], dir: 'libs')

### ３、One of the plugins you are using supports Java 8

全部のエラー
One of the plugins you are using supports Java 8 language features. To try the support built into the Android plugin, remove the following from your build.gradle:
    apply plugin: 'me.tatarka.retrolambda'
To learn more, go to https://d.android.com/r/tools/java-8-support-message.html

つまりme.tatarka.retrolambdaを除外しろの意味、こんな感じです

    //apply plugin: 'me.tatarka.retrolambda'

### 4 Cannot resolve symbol XXXX

android studio のcacheにライブラリーが含まれていないため、cacheを廃棄して再起動必要となる
 “File” -> “Invalidate Caches / Restart” -->“Invalidate and Restart”

### 5 Unknown run configuration type AndroidRunConfigurationType

なんでいきなり上記のエラー、、、？？？

原因：一部pluginを使えない
対策：
1,File/setting/pluginsを開き
2,赤になる部分は使えないため、チェック外してから再チェックを入れる。
3,android studio　を再起動する。
4,新しいpluginsをセットアップする。。。。
Turingパターンでメリークリスマス

# はじめに

[U-TOKYO AP Advent Calendar 2018](https://qiita.com/advent-calendar/2018/ut_ap)の15日目の記事です. 
クリスマスまであと10日なので, 今日は**Turingパターン**を作ってお祝いします. 

Turingパターンとは, 魚の斑模様や縞模様のような自己組織化によるパターン(自然界に多い)の総称です. 
<img width="512" src="https://qiita-image-store.s3.amazonaws.com/0/144878/55fcde49-9c86-b0b7-ff5d-f63850898b19.png">
[Mbu pufferfish - Wikipedia](https://en.wikipedia.org/wiki/Mbu_pufferfish)

シマウマや熱帯魚や蝶の模様が同じモデルで説明できるというのは興味深いですね. 
最近は人工生命(ALife)の文脈で登場することも多いようです.

名前からお気づきの方も多いと思いますが, これを発見したのは, Turingマシンでお馴染みの数学者Alan Turingです. 
彼は晩年に数理生物学にも取り組んでいたようで, 1952年に"The Chemical Basis of Morphogenesis"(形態形成の化学的基礎)を執筆しています. 

Turingパターンは**反応拡散方程式**というものを解くことで得られます.
私は分子生物学に詳しくないのでよくわかりませんが, 体表に存在する複数種類の色素が反応拡散方程式で仮定されるモデルに従っているのでしょうか. 

# 拡散方程式
まずは拡散方程式を導入します. 
位置$r$における拡散物質の密度を$u$, 時間を$t$とすると, 密度分布の時間発展は次の拡散方程式に従います. 

```math
\frac{\partial u(r,t)}{\partial t} = D_{u}\nabla ^2u(r,t)
```

$D_{u}$は拡散係数です. $u,r,t$に依存する場合もありますが, ここでは定数とします. 
また, 以下では$u(r,t)$を単に$u$と書きます. 
$\nabla ^2$はラプラシアンと呼ばれる演算子で, 「勾配の発散」を意味します. 物理では非常によく使います. 
一言で言うと, その物質の濃度の差が無くなる方向に拡散するときの強さのようなものです. 
ちなみに, 熱伝導方程式も同じ形で書けます. 

このままでは, お湯の中に入れた味噌が全体に拡散して終わりなので, 別の物質との反応によって物質の濃度が高くなるような項を考えていきます. 

# Gray-Scottモデル
Gray-Scottモデルは次のような仮定のもとで反応拡散の様子を考えます. 
1. この系では, 一定の**補充率(feed rate)**$f$で餌である物質Uが追加されるとします
2. 2つの物質VとVが1つの物質Uから物質Vを作るとします
3. 物質Vは一定の**減量率(kill rate)**$k$で不活性物質Pに変化します
バクテリアVが餌Uを食べながら増殖していく過程を想像するとわかりやすいかもしれません. 

反応式でまとめると次のようになります. 
U + 2V → 3V
V → P

# 反応拡散方程式
先程の拡散方程式と反応式から次の反応拡散方程式が導かれます. 

```math
\frac{\partial u}{\partial t} = D_{u}\nabla ^2u-uv^2+f(1-u)\\
\frac{\partial v}{\partial t} = D_{v}\nabla ^2v+uv^2-(f+k)v
```

ともに第1項は拡散方程式から, 第2項は反応式と反応速度論からわかります. 
第1式の第３項は補充項, 第2式の第3項は減量項です. 
これを解くことでUとVの反応と拡散の様子がわかります. 
[Reaction diffusion simulation](http://pmneila.github.io/jsexp/grayscott/)では, $f$と$k$を変えてインタラクティブに時間発展を観察することができます. 

# 数値シミュレーション
Pythonでの実装がこちらにあります. 
https://github.com/alifelab/alife_book_src
ソースコードの解説は文献[1]をご参照ください. 

設定ファイルを少し変更して`grey_scott.py`を実行すると…？

```matrix_visualizer_fragment.glsl
uniform sampler2D u_texture;
varying vec2 v_texcoord;
void main()
{
    float r = texture2D(u_texture, v_texcoord).r;
    gl_FragColor = vec4(1-r,r,0.2,1);
}
```

![greyscott.gif](https://qiita-image-store.s3.amazonaws.com/0/144878/f1d65777-4318-dd66-e4ec-08411996fc5d.gif)


このようにクリスマスカラーのTuringパターンができました！！
これはストライプの例ですが, パラメータを少し変えるだけで全く違う模様になっておもしろいので, いろいろ試してみてください. 

# おわりに
クリスマスまで, 引き続き[U-TOKYO AP Advent Calendar 2018](https://qiita.com/advent-calendar/2018/ut_ap)をお楽しみください！
<img width="256" alt="スクリーンショット 2018-12-15 6.56.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/144878/c9a1368b-bc12-dbf8-e4c7-f8b19ec27b55.png">


# 参考文献
[1] [作って動かすALife ――実装を通した人工生命モデル理論入門](https://www.oreilly.co.jp/books/9784873118475/), 岡瑞起 他, O'Reilly, 2018.

[2] [生物にみられるパターンとその起源 非線形・非平衡現象の数理２](http://www.utp.or.jp/book/b302450.html), 松下貢 編, 三村昌泰 監修, 東京大学出版会, 2005.
私とansibleとマヨネーズ


[Ansible Blogger 2018 （sponsored by Red Hat） Advent Calendar 2018　15日目](https://qiita.com/advent-calendar/2018/ansibleblogger)だよー。

なんのパクリなのか・・・。

ふと思いついたタイトルにそって内容をそのまま書きます！

## 初めに

[Ansible Night in Osaka 2018.07](https://ansible-users.connpass.com/event/90117/)のイベントで初めてansibleのイベントに参加させて頂きました。


[こっち](https://qiita.com/itsuyan/items/d8e2c32166a7cbfdc36f)でも書かせて頂いてます。

マヨネーズ？

マヨラーなんです。


初めて参加したコミュニティイベントの懇親会でマヨネーズで二時間語ってしまう失態をしてしまう。

でも、これは何かの縁だと思いがんばってます（何をや）


## あなたが好きなAnsible Moduleについて

正直僕自身はmoduleをどれが好きなどはまだ語れるほどではないです。
なので、今後僕が好きになるmoduleをつくってやろうかと。


そう。


**「マヨネーズmodule」**を・・・。


## マヨネーズmoduleとは？


いや、まったくもって名前の通り。

マヨネーズを作るmoduleをってことです。

IoTとの連携になるんだと思います。


来年中には形にしてみんなにお披露目したいですね。


## これだけ？

他の真面目な人に申し訳ない・・・。

このネタ枠みたいな記事を許してほしい。


ansibleの東京での勉強会などにも行脚するので許してほしい・・・。


これからもansibleの人たちもそうじゃない人たちもよろしくです！！！
Cordovaプラグインの変数について

Monaca で 複数の Cordova プラグインを組み込んだ場合、それぞれの Cordova プラグインに設定されている値によって、ビルドの際に競合が発生する場合があります。

特に、Android Support Libraryや、Google Service 用ライブラリーのバージョン設定は、ビルド時に競合が発生しやすくなります。


# variable オプション

Cordova プラグインのインストール方法の説明に `--variable` のオプションが記載されている場合があります。

以下は、cordova-admob-pro プラグインの [Installation](https://github.com/floatinghotpot/cordova-admob-pro#installation) に記載されている例です。

```xml:例
cordova plugin add cordova-plugin-admobpro --save --variable PLAY_SERVICES_VERSION=16.0.0
```

この設定は、`PLAY_SERVICES_VERSION` の値として `16.0.0` を使用してビルドを行う設定になります。


# Monaca で variable オプションを利用する場合

Monaca で variable オプションを利用する場合は、`Cordovaプラグイン` 画面で `有効` になっている Cordova プラグイン の `設定` 画面にある `インストールパラメータ` へ設定することで、variable オプションを利用することができます。

```plaintext:インストールパラメータ設定例
PLAY_SERVICES_VERSION=16.0.0
```


# preference タグ

variable オプションは、plugin.xml の `preference` タグを使用することで、利用できるようになります。

以下は、cordova-admob-pro プラグインの [plugin.xml](https://github.com/floatinghotpot/cordova-admob-pro/blob/master/plugin.xml) の plugin.xml の抜粋です。

```xml
<platform name="android">
  <preference name="PLAY_SERVICES_VERSION" default="16.0.0"/>
  <framework src="com.google.android.gms:play-services-ads:$PLAY_SERVICES_VERSION" />
</platform>
```

preference タグでは、`default` 属性を設定することで、デフォルト値を設定することができます。

実際に、`PLAY_SERVICES_VERSION` を使用する場合は、先頭に `$` を付け、`$PLAY_SERVICES_VERSION` のように記述します。


# おわりに

よく利用されている Cordova プラグインのドキュメントには、`--variable` オプションの記載が多く見られます。
ビルドエラーの原因が、variable オプションで指定できる値で回避できる場合も多いため、ビルドエラーが発生した際には、一度、対象の Cordova プラグインのドキュメントに variable オプションの設定が記載されていないか確認してみてください。

variable オプションの記載がない場合でも、Cordova プラグインをダウンロードし、自分で preference タグを設定することで、variable オプションを利用できる Cordova プラグインを作成できます。

一度、チャレンジしてみてください。


# 関連記事

[Cordova プラグインの設定について - Android 編](https://qiita.com/keeey/items/177708d71aa562b614ed)
[build.gradle のカスタマイズについて](https://qiita.com/keeey/items/3a85d0673485d3e8d669)
sublime text3 で書いた Markdown をブラウザでプレビューする方法

# 参考gif画像

sublime text で書いたMarkdownをリアルタイムでブラウザに表示させます。

![markdown.gif](https://qiita-image-store.s3.amazonaws.com/0/300911/2ff5440c-0508-67ef-a87b-11ecd29fb69b.gif)


# 環境
MacOS Sierra 10.12.6
Sublime Text 3

※ package controlをインストールしておいてください

# 準備

1、command + shift + p で Command Pallet を開く。

2、install と入力して、Package Control: Install Packages を選択。 

3、OmniMarkupPreviewer と入力し選択。

以上で準備完了です！！

# ブラウザでプレビュー

sublime textを開き「.md」ファイル内で　command + option + o を押すとブラウザが開き、マークダウンをプレビューすることができる。

# エラーが出たら
![スクリーンショット 2018-12-15 5.28.26.png](https://qiita-image-store.s3.amazonaws.com/0/300911/1b5dcab7-fcc5-d6f8-e434-bda29469d1d3.png)
このようなエラーが出てきたら、

Preferences → Package Settings → OmniMarkupPreviewer → Settings - Userに

```
{
  "renderer_options-MarkdownRenderer": {
    "extensions": ["tables", "fenced_code", "codehilite"]
  }
}
```

を入力すれば解決する。
Hyper-V + systemd-nspawnの開発環境を作る(3) ～ コンテナ作成 ～

[前回](https://qiita.com/yaasita/items/228342cda57ad2d01bf3)の続き

# コンテナの作成

ubuntuのコンテナを作成します

    apt install -y systemd-container debootstrap
    cd /var/lib/machines/
    debootstrap --arch amd64 bionic ./ubuntu http://archive.ubuntu.com/ubuntu
    curl -L https://git.io/fpbnu > ubuntu/etc/systemd/network/80-container-host0.network
    curl -L https://git.io/fpbn2 > ubuntu/etc/systemd/resolved.conf
    echo ubuntu-guest > ubuntu/etc/hostname
    perl -i -ple 's/^(127.0.0.1\slocalhost).*/$1 ubuntu-guest/' ubuntu/etc/hosts

# コンテナ内での設定

以下のコマンドでコンテナに入ります

    systemd-nspawn -D ./ubuntu

コンテナ内で以下設定をします

    # ↓はコンテナ内で打つコマンド
        passwd
        # 好きなパスワードを設定する
        apt remove -y netplan.io
        systemctl enable systemd-networkd
        exit
    # ↑ここまでコンテナ内

# 起動


以下のコマンドで通常のマシンのようにbootします

    systemd-nspawn -D ./ubuntu --network-bridge br0 -b

起動したら先ほど設定したrootアカウントのパスワードで入ります

    # 疎通確認用のnginxを入れます
    apt update
    apt install -y nginx
    echo ubuntu1 > /var/www/html/index.nginx-debian.html

この状態で `http://10.100.0.3/` にアクセスしてubuntu1の文字が見えたらOKです

# 終了

    systemctl halt

--------------------------------

[次回](https://qiita.com/yaasita/items/9bb3511a4d341212b3c6)
Capistranoのデプロイコマンドを簡単にするシェルスクリプト

## はじめに
この記事は[Linkbal Advent Calendar 2018](https://qiita.com/advent-calendar/2018/linkbal)の14日目の記事です（投稿日が1日過ぎていることは内緒です）。

どうも、水野（キンチキ）です。今回は[前回の記事](https://qiita.com/kinchiki/items/2238b5b6fdfb23297917)と同じくシェル周りのネタです。


## capistranoのデプロイコマンドが長い
capistranoでのデプロイは `bundle exec cap production deploy` ですよね。これならまだいいのですが、hogeブランチをstging環境にデプロイする場合だと `bundle exec cap staging deploy BRANCH=hoge` という長いコマンドになります。

`bundle exec` はaliasの作成などでいいですが、環境名とブランチ名をいちいち打つのは非常にめんどくさいです。
私は1年ほど前に諸事情で毎日様々なブランチを合計で最低10回はデプロイしているときがありました。それなのに毎回こんな長いコマンドを打つのは耐えられませんでした。
もちろん、ctrl+rによるインクリメント検索（peco使用）で毎回コマンドのすべてを打ってはいませんでしたが、それでもいちいちブランチ名を変えたりするのがとにかく面倒でした。

そして、毎日何回もデプロイする場合、馬鹿にならない時間をコマンドを入力することに取られます。

ということで、思考停止で簡単にデプロイできるcapistrano用のラッパーのシェルスクリプトを作成しました。

## capistrano用のラッパーのシェルスクリプト
プロジェクトのルートディレクトリに適当な名前でファイルを作成し、以下を記載してください。
ここではファイル名を `deploy.sh` とします。

なお、このシェルスクリプトは私の人生初シェルスクリプトなので、イマイチな点があるかと思います。
そういう点がありましたら、コメントや編集リクエストを頂けると幸いです。

```sh:deploy.sh
#!/bin/sh

# usage用のテキスト
usage="usage: deploy.sh <target_environment> <target_branch>\n<target_branch> default is current branch\nex: deploy.sh stg develop"

# 引数の数が0 または2より多い場合エラー
if [ $# -eq 0 ] || [ $# -gt 2 ]; then
    echo $usage
    exit 1
fi

# environment が存在しないものならエラー
# devとstaging環境がある想定
# productionは怖いので外しておく
environment=$1
if [ $environment != "dev" ] && [ $environment != "stg" ] && [ $environment != "staging" ]; then
    echo "deploy.sh: $1: No such environment"
    exit 1
fi

# stg だった場合 staging に変換
[ $environment = "stg" ] && environment="staging"
# current branch name を $current_branch に入れる
current_branch=$(echo $(git symbolic-ref --short HEAD | tr -d '\n'))

# コマンド実行
# 引数が2つのときは2つ目の引数に入力したブランチをデプロイ
if [ $# -eq 2 ]; then
    bundle exec cap $environment deploy BRANCH=$2
# 引数が1つのときはカレントブランチをデプロイ
elif [ $# -eq 1 ] && [ -n $current_branch ]; then
    bundle exec cap $environment deploy BRANCH=$current_branch
fi
```

ファイルを作成したら以下のコマンドで実行権限を付与します。

```sh
$ chmod +x deploy.sh
```

あとは以下のようなコマンドでデプロイ可能です。

```sh
# staging環境にカレントブランチをデプロイ
$ ./deploy.sh stg

# dev環境にhogeブランチをデプロイ
$ ./deploy.sh dev hoge
```

このシェルスクリプトは、余分なものを一切入力せずに環境名とブランチ名だけ入力すればデプロイできます。
また、ブランチ名を省略すればカレントブランチをデプロイしてくるため、タイピング量が減ってとても快適です。

ただ、私は `./deploy.sh` すら入力するのが面倒だったので、パスが通ったディレクトリにファイルをコピーして、ファイル名を `capdep` として `capdep stg` としていました。

・・・これを書いていて思いましたが、gitリポジトリで他の人が使っていてかつ変更されることを考えると `alias capdep=./deploy.sh` のようにエイリアスを作成したほうがいいですね。

## おわりに
この記事のシェルスクリプトはかなり簡単なものです。
しかし、簡単なシェルスクリプトでもいろいろなことができます。

決った手順で複数のコマンドを実行したり、長いコマンドを打つことがある方は、シェルスクリプトを書いて楽にすることを検討してみるいいかもしれませんね。

それではまた。
Hyper-V + systemd-nspawnの開発環境を作る(2) ～ ubuntuネットワーク設定 ～

[前回](https://qiita.com/yaasita/items/737a2ebdaf818454930c)の続きです

# ホスト側ネットワーク設定

netplanではなくsystemd-networkdにして、ブリッジインターフェイスを作成します

    apt update
    apt upgrade -y
    apt remove -y netplan.io
    cd /etc/systemd/network
    curl -L https://git.io/fpbOF > br.network
    curl -L https://git.io/fpb3U > bridge.netdev
    curl -L https://git.io/fpb3t > eth0.network
    curl -L https://git.io/fpb3Y > eth1.network

iptablesと転送の許可設定をします

    apt install -y iptables-persistent
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    netfilter-persistent save
    curl -L https://git.io/fpb3M > /etc/sysctl.conf

疎通確認用のnginxを入れて再起動してみます

    apt install -y nginx
    systemctl reboot

再起動後、 `http://10.100.0.2/` にアクセスしてnginxのデフォルトページが見れればOK

![nginx.png](https://qiita-image-store.s3.amazonaws.com/0/106549/afeb6ca0-32bb-1b11-7fb1-2a10204041ac.png)

-------------------------------------

[次回](https://qiita.com/yaasita/items/88b54fd6c2fef9195508)
QA戦隊を目指して 〜メンバー増減や育成の際に気にしていること〜

#■この記事の題材
テストメンバーや、QAリーダーの立ち位置にていくつかチームに参戦したり
チーム編成した際に感じたことの一つとして、大体のチームで属人化に関して
大なり小なり課題があり苦労が見えることが多く、そんな中で気にしてやってみたことを
ザックリですが記載してみようと思います

![vs.png](https://qiita-image-store.s3.amazonaws.com/0/323167/be4a2a90-6298-f9e0-8938-37598f3f32e7.png)



#■課題を感じるサインとは
主に、下記やそれに近い印象を持ったときに
「あ、どちらかに偏ってきているな…」と感じます


- **Good**
 - 得意度や熟練度による効率の良さ
 - より特化した戦略(改善)への着手

- **Bad**
 - 特定人物不在により、タスク対応のし辛さ
 - ミスなどの認識不足による、リスクの潜在

####　⇒　属人化傾向

　　
　　

- **Good**
 - 一定ラインの成果確保
 - チームとして(増減時)の取り回しの良さ

- **Bad**
 - 責任感やモチベーションの希薄化
 - タスク消化やインシデント検出の鈍化

####　⇒　標準化傾向

　
　

#■偏りを感じたときは
標準化を進めよう！と思い、属人化を薄めたいけど、上記のように属人化傾向による良い点もある…
そのためある程度両方のメリットも残しつつ、チームの全体的な底上げを行うことで
属人化の大きなリスクである「タスク遂行不可の状態」の回避に取り組んでいます

具体的には…？
各メンバーのパーソナリティやスキルの部分に関し、枠割分担や数値化を行いつつ
現状のチームの弱点の再認識と向上を図っています


　

####【パーソナリティ面】
行動特性を大まかに分け適正を持っていそうなメンバーに役割をアサインします。
さながら、ゲームキャラクターのジョブのように。

---

他部所との連携、チーム状況の俯瞰、改善タスクの実行などに長けている
![コマンダー.png](https://qiita-image-store.s3.amazonaws.com/0/323167/1ac823f6-c0f8-9e85-24e3-c052a46fb5ed.png)**『コマンダー』**

---

新規へのチャレンジ意欲、率先能力、バグ検出などに長けている
![アタッカー.png](https://qiita-image-store.s3.amazonaws.com/0/323167/32187343-3227-1d5d-a24a-8f47a177c6ed.png)**『アタッカー』**

---

任意のタスクへの安定した対応能力、振り返り能力、自己管理能力などに長けている
![タンク.png](https://qiita-image-store.s3.amazonaws.com/0/323167/42c33c3b-713b-2306-0163-81a8acfed974.png)**『タンク』**

---

資料整備、プロセス決め、QAツール作成などに長けている
![バッファー.png](https://qiita-image-store.s3.amazonaws.com/0/323167/4d11466c-315f-3070-2d7a-2485fd55051e.png)**『バッファー』**

---

プラス思考、他者への献身、問題点の検出などに長けている
![ヒーラー.png](https://qiita-image-store.s3.amazonaws.com/0/323167/88de7e87-7c2e-1e4c-4b72-5f12886531af.png)**『ヒーラー』**

---

**◆パーソナリティ面で特に気をつけている点として**
※定期的に1対1でミィーティングを行う中で、受ける印象をフィードバックし
　本人の希望やチームの状況を互いに理解しながら決めていきます

※1特性に留めず、順次多方向にアサインしていきます
![ヒアリング.png](https://qiita-image-store.s3.amazonaws.com/0/323167/b68e9df0-3522-8181-63d1-6db572247960.png)

　

####【スキル面】
主要業務をカテゴライズし、数値化し視覚化。
個人やチームとして弱い部分を確認し改善します。
さながら、ゲームキャラクターのステータス割振りのように。

**●カテゴライズと数値化/視覚化例**
「キャラ追加」「ステージ追加」「ガチャ」「ミッションやログボ」「スケジュール」などといった
業務カテゴリと、そこに紐づく詳細タスクへの経験値を集計します
平均点が低い弱点となりえるカテゴリやタスクタイプは、総合点数が低いメンバーに優先的に
学習してもらい各メンバーごとの格差も調整を加えます

![経験値表.png](https://qiita-image-store.s3.amazonaws.com/0/323167/6dc9b828-1004-f299-0e8c-26ff4abcc08a.png)
　　　　　　　　　　　　　　　　　　　⇩
![チーム力.png](https://qiita-image-store.s3.amazonaws.com/0/323167/a025211a-7713-a659-6297-146541c2ccfc.png)

　
　

**◆スキル面で特に気をつけている点として**
※基本的には本人に自己評価の体で点数をつけてもらいます

※チームとしてのスキル点を底上げしつつ、最終的には
　皆が何でも出来るように仕向けるため集計したものは公表しています

※定期的に更新することで成長傾向も記録しておき、互いの振り返りの材料にします

![勇者.png](https://qiita-image-store.s3.amazonaws.com/0/323167/cff305a2-acf2-c7aa-bf29-564319263fbd.png)
　
　

**◆他全体的に気をつけている点として**
※成長が見える＆伝えるとよりモチベーションupにも繋がりやすい
※良い点は皆の前で褒める
　(承認欲求を満たしつつ競争心を煽る意味でも)
※課題点は1on1などで改善していく
　(あまりプライドを損ねないためにも)
※相手にも納得してもらいつつ進めていく
　(0か100かは不満の元や反発になりやすい)
※他チーム状況を知ってもらう
　(自身にない視点への気づきに) 
など




#■最後に
ここまで読んでくださりありがとうございます。
簡単ではありますが、パーソナリティ/スキルの２つの面から属人化による
リスクを軽減するために行っている方法を紹介させていただきました。

職場環境やチームメンバー状況など様々な要因により対応方法や
効果は異なり「これだ！」といった正解を出すことは難しい問題だと思っておりますが
とあるチームのQA戦隊の編成方法の１つとしてご参考いただけますと幸いです。
Vimのセッション機能を使う

[Vim Advent Calendar 2018](https://qiita.com/advent-calendar/2018/vim) 14日目 代打記事です。

みなさん、vimに[セッション機能](https://vim-jp.org/vimdoc-ja/usr_21.html#21.4)があるのはご存知でしょうか？
便利そうなので使ってみようと思っていますが、せっかくなのでVim scriptの勉強も兼ねてコマンド作ってみました。

fzf.vimを使うとこんな感じになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/21a1dc7b-44cc-0e9c-c88d-03d74abf9cbc.png)

以下のコードをvimrcに貼ればそのまま使えるとおもいます。

# [2018-12-22] 追記
プラグイン化しました。
また、記事中のソース若干変更は入っています。
https://github.com/skanehira/vsession

# セッションファイル保存先
`~/.vim/sessions/`配下にセッションファイルを保存します。
ディレクトリがなければ作るようにしています。

```vimscript
" session path
let s:session_path = expand('~/.vim/sessions')

if !isdirectory(s:session_path)
    call mkdir(s:session_path, "p")
endif
```

# セッションの保存
`:SaveSession test1.vim`という感じで、セッションファイル名を指定して保存します。
同じファイル名を指定すると上書きされるのでご注意。

```vimscript
" save session
command! -nargs=1 SaveSession call s:saveSession(<f-args>)
function! s:saveSession(file)
    execute 'silent mksession!' s:session_path . '/' . a:file
endfunction
```

# セッションの復元
`:LoadSession ~/.vim/sessions/test1.vim`という感じで、セッションファイルのパスを指定して読み込みます。

```vimscript
" load session
command! -nargs=1 LoadSession call s:loadSession(<f-args>)
function! s:loadSession(file)
    execute 'silent source' a:file
endfunction
```

fzf.vim版はこちらです。

```vimscript
command! FloadSession call fzf#run({
\  'source': split(glob(s:session_path . "/*"), "\n"),
\  'sink':    function('s:loadSession'),
\  'options': '-m -x +s',
\  'down':    '40%'})
```

# セッションの削除
`:DeleteSession ~/.vim/sessions/test1.vim`という感じで、削除します。

```vimscript
" delete session
command! -nargs=1 DeleteSession call s:deleteSession(<f-args>)
function! s:deleteSession(file)
    call delete(expand(a:file))
endfunction
```

fzf.vim版はこちらです。

```vimscript
command! FdeleteSession call fzf#run({
\  'source': split(glob(s:session_path . "/*"), "\n"),
\  'sink':    function('s:deleteSession'),
\  'options': '-m -x +s',
\  'down':    '40%'})
```

# キーマッピング
こんな感じでマッピングしたら楽です。

```vimscript
nnoremap <Leader>se :SaveSession 
nnoremap <Leader>lse :FloadSession<CR>
```

# 参考記事
https://thinca.hatenablog.com/entry/20100201/1265009821
https://qiita.com/shinshin86/items/6e6cbdb77cb59b87d21f
http://nanasi.jp/articles/code/io/file-path.html

# 最後に
初めてVim script書いたので、おかしなところがありましたら教えて頂けると助かります。
ちなみに、vimのセッションプラグインはありました。

使ってないのですが、良さげなので興味ある方はどうぞー

https://github.com/Shougo/unite-session
https://github.com/xolox/vim-session
GitHub Actionsを使ってLaTeX文書をAspellでスペルチェックする

## はじめに

英語論文のスペルチェックに[Aspell](https://ja.wikipedia.org/wiki/GNU_Aspell)を使ってる人は多いと思います。自分でローカルで実行する分には良いのですが、共同で執筆している場合などは軽微なスペルミスはあまり指摘したく/されたく無いですよね。こういう仕事にはCIツールが向いています。

最近、[GitHub Actions](https://github.com/features/actions)というGitHubのCIツールがベータ公開されました。ということで、早速Aspellを使って自動的にLaTeX文書をスペルチェックしてくれるGitHub Actionを作成してみました。

成果物は[GitHub Actions for Aspell](https://github.com/mh61503891/action-paper-aspell)で公開しています。

## 使用方法

まず、リポジトリのルートディレクトリに `.aspell.en.pws` というファイル名でユーザ辞書を置きます。ユーザ辞書の作り方の詳細は省略しますが、大抵は以下のようなコマンドで辞書を作るのでは無いでしょうか。

```sh
$ aspell --dont-backup --lang=en --mode=tex --personal ./.aspell.en.pws -c main.tex
```

次に、リポジトリのルートディレクトリに `.github/main.workflow` を以下のように作成して `.aspell.en.pws` と一緒に `git push` します。

なお、`ASPELL_PERSONAL` の `./` は省略すると動かないようです。

```hcl
workflow "Spell Checking with Aspell" {
  on = "push"
  resolves = ["GitHub Action for Aspell"]
}

action "GitHub Action for Aspell" {
  uses = "mh61503891/action-paper-aspell@master"
  env = {
    ASPELL_LANG = "en"
    ASPELL_MODE = "tex"
    ASPELL_PERSONAL = "./.aspell.en.pws"
    ASPELL_FILES = "main.tex main.bib"
  }
}
```

すると  `push` イベントに反応してDockerで`aspell` が実行され、スペルミスが無ければ成功、有れば失敗します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/32894/411164fc-f5fa-a798-20ae-110e81536f1a.png)

## GitHub Actionsの作成方法メモ

* [GitHub Actions | GitHub Developer Guide](https://developer.github.com/actions/) - まずは公式ドキュメントに目を通した方が良さそうです。
* [GitHub Actions](https://github.com/actions) - 様々なアクションが登録されています。書き方の参考になります。
* [sdras/awesome-actions: A curated list of awesome actions to use on GitHub](https://github.com/sdras/awesome-actions)
* [Topic: github-actions](https://github.com/topics/github-actions)

## 今後

スペルチェックだけでなく学会の執筆要項に準拠しているかをチェックするLinterとかできたら便利そうだなと考えています。
12-15 music-synthesizer-for-android

https://adventar.org/calendars/3353 の15日目エントリーです。

## music-synthesizer-for-android (is not only for Android)

music-synthesizer-for-androidは、こう聞くとびっくりするかもしれませんが、Google公式リポジトリで配布されているYAMAHA DX7互換のソフトウェアFMシンセサイザーです。music-synthesizer-for-androidという名前は長いので、この界隈(?)ではよくMSFAと略されます。

https://github.com/google/music-synthesizer-for-android

名前だけ見ると完全にAndroid専用ですが、実態は単なるC++ライブラリなので、オーディオ出力と繋ぎ合わせると、およそC++コードからコンパイルして実行できるどんな環境でも動作します。いくつか派生プロジェクトを挙げると…

- dexed: MSFAをJUCEによってオーディオプラグイン化してGUIを追加したもの、に加えて他のソフトウェアFMシンセサイザーなどもサポートしたもの（そういうわけでMSFAだけではないものです）  https://github.com/asb2m10/dexed
- webdx7: WebAudioModulesを使ってMSFAを動かせるようにしたもの https://github.com/webaudiomodules/webdx7

## 実機からの録音データを利用した完全に近いパラメーター調整

DX7というFM音源は多数のシンセサイザー開発者の興味を引くものであるようで、商用製品ならNative InstrumentsのFM8、OSSでもHexterなどがDX7互換音源というかたちで公開されています。MSFAのドキュメントによると、これらはまだ再現度が低いようです（とは言ってもこれが書かれたのはまだcode.google.comがあった頃なのですが）。FM音源の互換チップやシンセサイザーで重要なのは、同じパラメーターを渡した時に実機と同じ音が発生することなので、再現度の高さが重要です。

MSFAが面白いのは、MSFAを作るにあたって、DX7の実機にMIDIメッセージを送信して得られた音と、エミュレーションで再現した音をRoland Quad-Captureで録音して、ほぼビットレベルまで同一になるところまでunit testでチェックしていたことです。DX7の内部で使用されているYM21290とYM21280をリバースエンジニアリングして音色を再現するのはそれほど難しくなかった、というような話がwikiページ…だったものとして残されているドキュメント…にまとめられており、これ自体がだいぶ面白い読み物です。

https://github.com/google/music-synthesizer-for-android/blob/master/wiki/YamahaDx7.wiki

## 使い方

DX7はMIDIメッセージを受け取ることで演奏できます。とは言っても、波形を合成した結果は自分のアプリケーション側で取得して、適宜音声出力に流してやる必要があります。プログラム側がやることは

- RingBufferを用意する
- そのRingBufferをコンストラクターに渡してSynthUnitのインスタンスを作る
- Synth.init(sampleRate)で初期化する
- RingBufferにMIDIメッセージを書き込む
- Synth.getSamples()で合成結果を取得する
- 取得したサンプルデータをオーディオI/OのAPIなどで出力する（あるいはwavなどに保存する）

これだけです。MIDIメッセージとしては、まずシステムエクスクルーシブで音色定義を送信してやる必要があり、これを手作業で適切に行うためにはDX7のMIDI実装を知っている必要があるのですが、実際には[Dexed Cart](https://www.audiobombs.com/items/1038/dexed-cart-1.0)など既知の音源集から音色を選んでそのファイル内容をそのまま送ってやれば良いようです。あとはノートオン／オフなどの命令も含め、MIDI音源と同じように操作すればよいでしょう。
PHPのフォームタグの種類について

PHPを学んでいく上で、様々なフォームタグが出てきます。
今回は、PHPのタグの種類を見てみましょう。

#formタグとは？
formタグは、フォーム全体のタグを囲むときに使用します。
そのため、次のような書き方をします。

```
<?php

form action = "complete.php" method = "post"

?>
```
action属性は、送信ボタンを押したときに指定したページに遷移させます。
また、method属性は、どのようにしてデータを送信するかを定めます。


#フォームに使うタグ
フォームによく使うタグは、次の3種類が挙げられます。

###input
これは、次のように表し、終了タグはありません。

```
<input type="text" name="お名前" value="" size="50">
```

type属性の入力は必須で、text（一行入力）の他にも、radio（ラジオボタン）、checkbox（チェックボックス）などの種類があります。
また、name属性も必須ですが、送信ボタンやリセットボタンには不要です。
value属性は、input type=textのときは必要ありませんが、ラジオボタン、チェックボックス、プルダウンには必須です。
そして、size属性は、入力欄の大きさを定めます。

###textarea
これは、終了タグを必要として、次のように表します。

```
<textarea name ="お問い合わせ内容" cols="40" rows="40"> </textarea>
``` 
このように入力することで、一行ではなく、複数行を入力することができます。
また、colsは横幅、rowsは高さを表しているので、入力欄の大きさを指定することができます。


###select
これは、プルダウンのメニューを表します。

```
<select name="年齢">
<option value="">選択してください。</option>
<option value="">19歳</option>
<option value="">20歳</option>
```

このようにすれば、プルダウンは完成です。
Serverless Framework @ AWSでlambdaを定期起動するlambdaを作る

何らかの理由でLambdaから別のLambdaを呼びたいことがあります。
例えば、Lambdaのコールドスタートのコストを極力払いたくない時、定期的にそのLambdaを発火させるのが一つのパターンとして紹介されることがあるようです。

![コールドスタートを速くする](https://image.slidesharecdn.com/20170117tuneupawslambda-170118015345/95/tune-up-aws-lambda-18-638.jpg?cb=1487201430)
スライド: <https://www.slideshare.net/keisuke69/tune-up-aws-lambda>

というわけで、これを[Serverless Framework](https://serverless.com/)でやってみます。
おそらくこれをやっている人は沢山いると思います。↓のリンク先の記事がまさに今回の例そのままなのですが、Lambdaの名前をリテラルで埋め込むあたりがしっくりこなかったので、Qiitaに書き直してみました。

<https://lorenstewart.me/2017/10/02/serverless-framework-lambdas-invoking-lambdas/>

## やること

単純です。

- 2つLambdaを用意して、片方をscheduleイベントで発火するようにする
- 発火したLambdaは、もう一つのLambdaを呼ぶ

### Lambdaの実装

今回は、呼ぶ側と呼ばれる側の二つの関数を同じJavaScriptモジュールに詰め込むことにします。scheduleで発火するLambdaから、呼ばれるLambdaの名前を知る方法ですが、環境変数`CRON_TARGET_NAME`で渡すことにします。

```javascript
const AWS = require("aws-sdk");
const lambda = new AWS.Lambda();

module.exports.hello = (_event, _context) => {
  console.log("hello");
};

module.exports.cron = (_event, _context) => {
  const params = {
    FunctionName: process.env.CRON_TARGET_NAME,
    InvocationType: "Event",
  };
  lambda.invoke(params, (err, data) => {
    console.log(err, data);
  });
};
```

### serverless.yml

あとは設定ファイルである`serverless.yml`を書きます。

```yml
service: schedule-test

provider:
  name: aws
  runtime: nodejs8.10
  region: ap-northeast-1
  memorySize: 128

  iamRoleStatements:
    - Effect: Allow
      Action:
        - lambda:InvokeFunction
      Resource:
        - "*"

functions:
  hello:
    handler: handler.hello
    name: ${self:provider.stage}-hello-function
  cron:
    handler: handler.cron
    environment:
      CRON_TARGET_NAME: ${self:functions.hello.name}
    events:
      - schedule: rate(5 minutes)
```

Lambdaを起動する際に必要なものは2つあります。

- 適切な権限（`functions.cron`の実行ユーザが`lambda:InvokeFunction`を許可されていること）
- Lambda関数の名前
  - [AWSのドキュメント](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html)によると、ARNではなく単に関数名でもLambdaを起動するのに十分です

今回の起動対象である`function.hello`のAWSでの名前は`functions.hello.name`で指定することができます。名前をデフォルトではなく明示的に指定をしておくことで、他の箇所からは`${self:functions.hello.name}`で参照できるようになるため、`cron`の環境変数`CRON_TARGET_NAME`に名前を渡せるようになっています。

IAMについては`iamRoleStatements`を書くことでLambdaを起動できるように権限を足しました。

### やっていないこと

- `iamRoleStatements`の`Resource`は`*`より絞った方がいいかも
- ~~2つのLambda関数は同期している必要がなさそうなので、`InvocationType: "Event"`の方が適切かも~~
    - （2018/12/15 追記）asyncにしておいた方が都合が良いだろうというアドバイスをいただいたのでサンプルを修正しました

## 参考リンク

- <https://lorenstewart.me/2017/10/02/serverless-framework-lambdas-invoking-lambdas/>
- <https://serverless.com/framework/docs/providers/aws/guide/iam/>
AWS Cloud9でHerokuのインストールが毎回必要?になる(Railsチュートリアル )

#前提
RailsチュートリアルをAWS Cloud9を使ってやってます。

#問題
railsチュートリアルの一章でherokuのインストールをしたが、AWS Cloud9に入りなおす度にherokuコマンドがないといわれ、毎回インストールコマンドを実行していた。
（ちなみにインストールコマンドを実行するとherokuコマンドが使えるようになるが、エラーが出ていた。）


```consol:1章のherokuインストールコマンド
source <(curl -sL https://cdn.learnenough.com/heroku_install)
```
```consol:2回目以降に実行した時のエラー
mv: cannot move ‘heroku’ to ‘/usr/local/heroku’: Directory not empty
```

#解決
なんとなくインストールコマンドのcurlだけで実行してみる。

```consol:コマンド
curl -sL https://cdn.learnenough.com/heroku_install
```
```consol:結果
curl -OL https://cli-assets.heroku.com/heroku-linux-x64.tar.gz
tar zxf heroku-linux-x64.tar.gz && rm -f heroku-linux-x64.tar.gz
sudo mv heroku /usr/local
echo 'PATH=/usr/local/heroku/bin:$PATH' >> $HOME/.profile
source $HOME/.profile > /dev/null
```

結果を見ると「\$HOME/.profile」に\$PATHの設定を追加してる。
けどbashの設定ファイルって「.profile」だっけ？と思い調べるとbashの設定ファイル「.bash_profile」らしい。
ということで「\$HOME/.bash_profile」に$PATHの設定を追加して再起動してみる。

```consol:.bash_profile追加
PATH=/usr/local/heroku/bin:$PATH
```

再起動後herokuコマンドが使用できた！

#参考
bashで環境変数(PATH)の設定
https://qiita.com/iam1at/items/91cb8478160c9fbee134

curlコマンドでapiを叩く
https://qiita.com/bunty/items/758425773b2239feb9a7
業務と技術の協調

![bpms.JPG](https://qiita-image-store.s3.amazonaws.com/0/37985/4ddd7e4d-43f5-b2a5-ed5b-a4ff118d0724.jpeg)

奪うものでなく　一緒にやっとやれるようになるものかな

■1,会社全体を考える(Kgi)
■2,部署単位(kgi,kpi)
■3,それをどうするか(rpa)

ロボットとかでなく、効率化した上で
次のステップへ進むものかな。

１、人がやる物
２、効率化するもの

ただそれが今出来て機械解析とかとも連携などいわれるけど

ITが全てではないので

なんだろうな　その上で技術ってあると思う
20代プログラマに贈る、この先生きのこるために

このAdventCalendarに三度目の登場になります。 @diostray です。
今回の記事はタイトルの通り、少々エモい話をしてみようと思います。
タイトルはネットスラングですが、「[ぎなた読み](https://dic.nicovideo.jp/a/%E3%81%8E%E3%81%AA%E3%81%9F%E8%AA%AD%E3%81%BF)」というちゃんとした用語があったことを最近知りました。

# はじめに（&経歴）
そもそもお前は何様じゃいという斧やマサカリが飛んできそうなので、先に自己紹介しておきます。(というかなぜ最初の記事でやらなかったし…)

約10年SEの業界(通称SIer)にいましたが、今月justInCaseに入社したばかりです。
それまでやってきた技術をつらつらと書くとこんな感じです。

* Infrastructure (基礎知識レベル)
    * CentOS / Ubuntu / WindowsServer
    * MySQL / PostgreSQL / Oracle
    * Apache / Tomcat / nginx
* Backend
    * Java
    * PHP (Wordpress)
    * Ruby on Rails
    * SOAP / Rest API
* Frontend
    * JavaScript
        * jQuery
        * CoffeeScript
    * CSS / SCSS
    * C#
    * Kotlin
* Mobile
    * Java (Android)
    * Objective-C (iOS)

## 巨人の肩に乗る
* [ロシアの天才ハッカーによる【新人エンジニアサバイバルガイド】](https://qiita.com/jacksuzuki/items/b2fa6b44962e73a53d08)
* [これからの時代のエンジニアの生存戦略
](https://qiita.com/yokoji/items/da73df747cdbf311c03f)
* [[ まつもとゆきひろ氏 ]若手エンジニアの生存戦略](https://qiita.com/Tsutou/items/50be50cdb200f1e31d1c)

上の記事は個人的におすすめ（特に一番上）なので、一読することをおすすめします。
高名な記事ばかりですので、見たことある方が多いとは思いますが。

# 本題
というわけで、10年近くIT業界で生きてきた身として、「若いプログラマ(エンジニア)がこの先生きのこるにはどうしたら良いんだろう？」という疑問に答えてみたいと思います。
偉大な先人を含め百家争鳴な気はしてますが、私の考えというのを述べてみたいと思います。

# Be lazy
一番はこれだと思います。
上のMatz氏が言及していますが、プログラマの三大美徳の一つに「怠惰」というのがあります。
これはサボれと言っているのではなく、効率化しなさいと言っているのは有名な内容なので、詳細は割愛します。

コンピュータの性能や機能は進歩の一途をたどっています。特に同じような仕事を手作業でやっているのならば、それらをツールなりにして自分の作業を効率化した方が早いですし、ヒューマンエラー防止に繋がります。

私個人の話になりますが、とあるシステムが自動生成したファイルをリポジトリにコミットする時、ファイルを移動する必要がありました。
今までは手作業でやっていましたが、それをPowerShellで実装してヌケモレとかのヒューマンエラーをなくした記憶があります。

そんな小さなことかよ！と思うかもしれませんが、そういう小さなところから効率化の恩恵に与ると、ちょっとしたことでも効率化しようという意識が働きます。

# Make your knowledge
この業界はとにかく進歩が早い業界として知られています。2年前の最新技術が今となっては使い物にならないとかよく聞く話でもあります。
そんな中個人的に大事にしているのは、技術や単語そのものを覚えることを重要視しないことだったりします。

- その技術はそれまでに出ていたどんな問題を解決するためのものだったのかという背景や歴史
- その単語が表現している概念
- 技術や単語の親和性

比較すると、こちらの方を重要視しています。

技術や言葉の意味だけであれば、GoogleやWikipediaに頼ればある程度知ることができます。
それはすなわちコンピュータの進化や発展によって、人間でなくてもできる分野ということです。

コンピュータではできないことができていないと、飯のタネがなくなってしまうことになるので、そんなスキルを身に着けていかないといけないと思っています。

# Create value
結構前なんですが、ものすごく印象に残っている記事があります。
Simejiを開発された方のインタビューで、プログラマ/デザイナーとはどういう人かを答えて頂く内容だったと思います。
そこで、「プログラマとは0を1にする人、デザイナーは1を100にする人」という内容がありました。
（すみません。記事を見つけることができませんでした…何分昔のものでして…）

プログラマとは、大なり小なり世の中に存在しないものを作り出す人、つまるところクリエイターだと私は理解しました。

ものを作り出すクリエイターにとって重要なことは、「価値があるかどうか」だと思います。
価値があるかどうか。それは作ったものによってどんな問題が解決できるのか、そしてその解決できた量によると思います。

逆から言うと、今から作るもので、どんな問題が解決できるのかを認識していないと、元は価値あるものであっても、価値のないものに成り下がってしまうことになってしまうわけです。

自分が今から作るものは、どんな価値を提供するものか。それを問うてから目の前の仕事に取り組んでもらいたいなと思います。

# 終わりに
長文失礼しました。この~~駄文~~文章がどこかのどなたかの蒙を啓くことになれれば幸いです。
初心者がDjangoのチュートリアルで何をやり何を考えているか(3)-1

## 前回までのあらすじ

前回、全体像がある程度見えたことでわかった気になり調子をこいたが、やはり躓いてしまった。原因は単なる知識不足で、ほとんど知識もないままに車を運転して事故に遭ってしまったようだ。亀のような歩みだが1歩1歩知識を確かめながら進める。というわけで「はじめてのDjangoアプリ作成その3」。

## URL ディスパッチャって何？
>このチュートリアルでは URLconf の基本的な使い方を知ってもらいます。より詳しくは URL ディスパッチャ を参照してください。

ディスパッチャってなんぞ？ググる。
>ディスパッチャ：処理を待っているデータやプロセスが複数ある場合に、効率よく処理できるよう必要な資源の振り分けや割り当てを行うシステムやプログラムのこと

再びチュートリアル。

>アプリケーションのURLを設計するには、俗に URLconf (URL configuration) と呼ばれる Python モジュールを作る必要があります。

URLconf とか url.py とか何がどう違うんだ？とググる。広く浅く読んで理解したところでは、URL dispather = URF conf = urls.py ですべて同じものだった。モジュールを作るっていってもテキストでPython入力して〇〇.pyって保存するだけのこと。〇〇っていうのがモジュール名になるみたい。

**初心者は同じものを別の名前で言われても混乱するだけなんだよ**

再びチュートリアル。


```
def detail(request, question_id):
    return HttpResponse("You're looking at question %s." % question_id)
```
ここで自分が理解できていたこと

* def で関数つくる
* detail は関数名
* question_id はチュートリアルその2でデータベースに設定した主キー（のはず）
* return この値を返せっていう命令

頭を悩ましたのがこの2つ

* `request` お前誰？いつ湧いてきた？オレが勝手に名前を決めていいモノなの？`__init__`のselfみたいに決まったものなの？
* `HttpResponse` お前も大文字で偉そうだよな？クラスなの？

## request と HttpResponse って何？

今さらなんでそんなところで躓くんだ？と思われるかもしれないが、初心者は得てしてそんなもの。足し算引き算を覚えたくらいで足元も覚束ない。わからないまま見過ごしてきたモノもたくさんある。ググる。

>Django は、システム全体にわたって、リクエストとレスポンスオブジェクトを使っ て処理状態を受け渡します。

>あるページへのリクエストを受け取ると、Django は HttpRequest オブジェクトを生成します。このオブジェク トにはリクエストのメタデータが入っています。次に Django は適切なビューをロー ドして、 HttpRequest をビュー関数の最初の引数に渡しま す。各ビューは HttpResponse オブジェクトを返さねばな りません。

>このドキュメントでは HttpRequest および HttpResponse オブジェクトの API について説明します。

→ http://djangoproject.jp/doc/ja/1.0/ref/request-response.html#httprequest

Django v1.0 のドキュメントが出てきた。現バージョンの方も同じような記述が見つかった。現バージョンの該当箇所も下記に引用しておく。

>Django は、システムを通じてステータスを渡すために、リクエストとレスポンスのオブジェクトを使います。

>あるページがリクエストされたとき、Django はリクエストに関するメタデータを含んだ HttpRequest オブジェクトを生成します。それから Django は HttpRequest をビュー関数の最初の関数として渡し、適切なビューを読み込みます。あらゆるビューは HttpResponse オブジェクトを返す必要があります。

>このドキュメントでは、HttpRequest と HttpResponse オブジェクトの API を説明しています。これは django.http モジュールにて定義されています。

昔のバージョンのほうがわかりやすいな。「Django は、システム全体にわたって、リクエストとレスポンスオブジェクトを使って処理状態を受け渡します。」と「Django は、システムを通じてステータスを渡すために、リクエストとレスポンスのオブジェクトを使います。」とじゃあ前者に軍配が上がる。そういうこともあるのか。

いやいやそうじゃなくて。最後の記述にモジュールが出てきた。モジュールとな？ということはファイルがあるということだ。ずーっとモヤモヤしてたこと。`from django.urls import path` とか `from django.http import HttpResponse` とかちょいちょい django が顔を出してくるけれど、本体はどこにあるんだろう？という疑問。 Djangoってwebフレームワークだから環境そのもので、こうして作業している場所全体が Djangoってやつなのかなぁ、となんとなく見過ごしてきたけれど、自分の認識は間違っていて、どうやらはっきりとしたモノがいるらしい。刑事は容疑者がどこにいるのかを聞き込みして足で探し回るのだ。そこで覚えたのがfind と locate コマンドである。

## Django ってどこにあるの？

```
$ find ~/ -name django -type d
```
するとあっさり発見した。（pollsdirectory/pollsvenv/までが自分がつけた名前）

```
~/pollsdirectory/pollsvenv/lib/python3.6/site-packages/django
（以下略）
```

で、`$ cd （略)/django` で飛んで、さらに`tree` コマンドで調べたら…

```
django
├── __init__.py
├── __main__.py
├── __pycache__
├── apps
├── bin
├── conf
├── contrib
├── core
├── db
├── dispatch
├── forms
├── http
├── middleware
├── shortcuts.py
├── template
├── templatetags
├── test
├── urls
├── utils
└── views
```
**そうか、お前たちここにいたのか！**

続く。
サロゲートキーとナチュラルキーについて調べた

俺でもわかるシリーズアドベントカレンダー１５日目です。よろしくおねがいします。:hugging:

お恥ずかしながらデータベースのナチュラルキーとサロゲートキーについて知らなかったので、自分なりに調べてみた。

# はじめに
まず、テーブルの中のデータで一意となるものを`主キー`と呼びます。これは流石に知っていますね。
ですが、この主キーはさらに２つに分類することが出来ます。それが、`サロゲートキー`と`ナチュラルキー`です。

それぞれ特徴を見てみます。

# サロゲートキー
サロゲートキーは機械的につけられた連番のキーです。オートインクリメント等でつけられたものがそうです。
下の`No`カラムがサロゲートキーです。

| No | 名前 | 年齢 |
|:-:|:-:|:-:|
| 1  | taro  | 12  |
| 2  | hanako  | 18  |
| 3  | tadokoro  | 24  |
| 4  | hirorin  | 17  |


このキーがあれが、一つのレコードを特定できるため、CRUD処理がしやすくなります。
また、外部キーを使用する際にもサロゲートキーだけを考えるだけで良いので、テーブル間の依存がしにくいです。

ただ、データ自体は機械的に付けられた連番なので、このデータだけ見てもなんの情報なのか全くわかりません。
必ずなにか別のカラムと合わせて取得します。


私は主キーといえばこのことを指すものだと思っていました。



# ナチュラルキー
ナチュラルキーは、サロゲートキーとは全くの逆です。データの中身を見れば、なんの情報なのが人間が理解することが出来るようなカラムが主キーとなります。
とある学校で、以下のような学生の情報を持つテーブルがあったとしましょう。

| 学部番号 | 入学年 | 出席番号 | 名前 | 年齢 |
|:-:|:-:|:-:|:-:|:-:|
|  011 | 2014  |  006 | hirorin  |  14 |
| 021  | 2015  |  102 |  hanako |  17 |
| 022  |  2015 | 036  |  flandre |  495 |
| 021  | 2018  |  006 | hirorin  | 17  |

さて、ナチュラルキーも主キーの一種だとはじめに書きましたが、上記の場合はそれが主キーになるでしょうか。

- 学部番号
    - 同じ学部なら重複する
- 入学年
    - 同じ年に入学すれば重複する
- 出席番号
    - 学部、入学年が異なれば同じ出席番号の人もいるかもしれない
- 名前
    - 同じ名前なら(ry
- 年齢
    - 同じ年齢なら(ry

なんだかどれも主キーになり得なさそうです。

ここで出てくるのが`複合主キー`と呼ばれるものです。
例のテーブルの場合は`学部番号`, `入学年`, `出席番号`の３つをまとめれば特定の学生を見つけることができそうです。

サロゲートキーと違って、どのカラムを一つ取っても利用者にとってはなんの情報かはわかりやすいです。

ただし、特定の一人を見つけるために３つのカラムを見る必要があります。
また、外部キーを設定することになった場合は、複合外部キーとしなくてはなりません。JOINする際にはSQLの文量は、サロゲートキーを採用しているときと比較して多くなります。

# まとめ
## サロゲートキー
機械的につけられた連番のキー。
一つのカラムで一人の特定が可能、テーブル間で依存が起こりにくい。
サロゲートキーだけでは、なんの情報だか分からない。

## ナチュラルキー
ユーザが設定したキー。
一つの絡むだけでも何の情報だか理解できる。
一人の特定をするのに複数のカラムを要する（複合主キー）
テーブル間の依存が強くなりがち。

---

どっちの方式で主キーを決めるかは永遠の終わらない議論のような気がします。
システムによって、どちらが良いかよく考える必要がありそうですね。
Golang 1.11でGO111MODULE=onの状態でグローバルにgo getできない時の対処法

Golang製のツールをgo getしようとした時、

```
go: cannot find main module; see 'go help modules'
```

とエラーが出力されキョトンとしてしまいました。
ググってみてもこれと言った明確な解決方が見つからなかったのですが、[GolangのWikiのModulesページ](https://github.com/golang/go/wiki/Modules#why-does-installing-a-tool-via-go-get-fail-with-error-cannot-find-main-module)に対処法がまとまっていました。

# 結論
Golang公式にはいくつかの対処法が記載されていましたが、今回採用した手順は以下の通りです。

## Goツール用のディレクトリを作成
僕はホームディレクトリに作成しましたが、基本的にはどこでもOKです。

```
mkdir go-tools
cd go-tools
```

## Modulesの初期設定
以下のコマンドでGo Modulesのファイルが作成されます。

```
go mod init go-tools
```

## go getの実行
例としてgo-langserverをインストールしたい場合は以下の通りです。uオプションはお好みで。

```
go get -u github.com/sourcegraph/go-langserver
```

これで$GOPATH/binにGo製のツールが追加され、グローバルで利用できるようになっているはずです。

## 補足
### エラーが出るようになった原因
Go 1.11において、GO111MODULE=onを設定している場合、go.modファイルの存在するディレクトリでしかgo getが実行されなくなります。
GO111MODULE=onの挙動がGo 1.12から標準になるらしいので、今後は上で紹介したような方法や何かしらのツールを使った管理を行う形になるのかも知れません。

※ 前情報通り、Golang1.12からはgo.modファイルがなくてもgo getが実行できるようになりました。そのため今回紹介する手順は必要なくなっているかと思います。

### その他の対処法
[GolangのWikiのModulesページ](https://github.com/golang/go/wiki/Modules#why-does-installing-a-tool-via-go-get-fail-with-error-cannot-find-main-module)では他にもグローバルにツールをインストールする方法がいくつか紹介されていましたので、その一部を紹介いたします。
他の方法や詳細を知りたい方はWikiの方をご覧ください。

#### GO111MODULE=onを辞める
GO111MODULE=onの時にModulesの仕様上go getのグローバル実行ができないのであれば、それをやめてしまえばいいという話。
環境変数からGO111MODULE=onを取り除くか、GO111MODULE=autoを設定するといいでしょう。

#### 実行時だけGO111MODULE=onを外す
Go 1.12以降に備えてGO111MODULE=onはセットしたままで慣れておきたい、という場合、実行時だけModulesを外すという手もあります。

```
GO111MODULE=off go get example.com/cmd
```

エイリアスを設定しておくという方法も紹介されていました。

```
alias oldget='GO111MODULE=off go get'
```

#　まとめ
掲載内容に誤りや疑問がありましたら、コメント・編集リクエストをいただけると大変助かります。
閲覧いただき、ありがとうございました。
LinuxでmacOS Mojaveのダイナミックデスクトップを再現する

Linuxのデスクトップ背景をMacOS Mojaveのように時間帯によって変化する壁紙に変更する方法を紹介します.
今回はUbuntu16.04で行いました.
![6Dei3CN.gif](https://qiita-image-store.s3.amazonaws.com/0/317841/bf0a40e5-f81f-85e5-3e90-0def3ab7d7a6.gif)
参考記事:
https://www.omgubuntu.co.uk/2018/06/macos-mojave-dynamic-background-linux
##ディレクトリを作成する
壁紙を保存するディレクトリを作成します.

```
$ mkdir -p ~/Pictures/wallpapers
```

##macOS Mujaveの壁紙をダウンロードする
先程作成したディレクトリにMojaveの壁紙をダウンロードします.
壁紙はこちらのGitHubから入手できます.(https://github.com/xtai/mojave-dynamic-heic)

```
$ cd ~/Pictures/wallpapers
$ git clone https://github.com/xtai/mojave-dynamic-heic.git
```

ここで,cloneした``mojave-dynamic-heic/``を``mojave-background/``にリネームします.

```
$ mv mojave-dynamic-heic/ mojave-background/
$ cd mojave-background
```

さらに,cloneした画像をリネームします.ubuntuの場合は1,それ以外のOSの場合は2を実行します.

**1. ubuntuの場合**

```
$ rename "s/-/_/;" mojave_dynamic-*.jpeg
$ rename "s/mojave_dynamic_0/mojave_dynamic_/;" mojave_dynamic_0*.jpeg
```

**2. それ以外の場合**

```
$ rename - _ mojave_dynamic-*.jpeg
$ rename mojave_dynamic_0 mojave_dynamic_ mojave_dynamic_0*.jpeg
```
***
以下のような構造になっていることを確認してください.

```:ディレクトリ構造
~/Pictures/
　　　wallpapers/
　　　　　　　mojave-background/
　　　　　　　　　　mojave_dynamic_1.jpeg
　　　　　　　　　　mojave_dynamic_2.jpeg
　　　　　　　　　　...
　　　　　　　　　　...
　　　　　　　　　　...
　　　　　　　　　　mojave_dynamic_16.jpeg
```

##XMLスライドショーをダウンロードする
 こちらからzipファイルをダウンロードします([mojave.xml](https://gist.github.com/trongthanh/7d632e90687e1bc219e1f3262d337702/archive/9ef82f1c6c7425fe4f990ada6318614afbb74445.zip))
ダウンロードしたら展開し,``mojave.xml``を開きます,文字列"**thanh**"を全て自分のユーザ名に置換してください.
vimの場合はコマンドモードで次のコマンドを入力すると一括変換できます.

```:vim
 :%s/thanh/<ユーザ名>/g
```

具体的には以下のような変更になります.

```:mojave.xml
#変更前
<from>/home/thanh/Pictures/wallpapers/mojave-background/mojave_dynamic_14.jpeg</from> 
<to>/home/thanh/Pictures/wallpapers/mojave-background/mojave_dynamic_15.jpeg</to>

#変更後
<from>/home/<ユーザ名>/Pictures/wallpapers/mojave-background/mojave_dynamic_14.jpeg</from> 
<to>/home/<ユーザ名>/Pictures/wallpapers/mojave-background/mojave_dynamic_15.jpeg</to>
```

変更したら任意の場所に保存します.
今回は``~/Pictures/wallpapers/mojave-background``に保存します.
##背景を変更する
GNOME Tweak toolを開きます.インストールしていない場合は以下のコマンドでインストール・実行します.


```:Tweak_tool
#インストール
$ sudo apt-get install gnome-tweak-tool

#実行
$ gnome-tweak-tool &
```

Tweak toolを開いたら``デスクトップ``→``背景の画像``から先程保存した``mojave.xml``を選択します.![IMG_9873 2.jpg](https://qiita-image-store.s3.amazonaws.com/0/317841/b2827a87-f509-8fb4-67ca-fcccc6474718.jpeg)

背景が時刻に応じたMojaveの画像に切り替われば完了です.うまくいかない場合はディレクトリ名や構造,画像名が``mojave.xml``内のものと一致しているか確認してみてください.
とりあえずこれからWPで個人ブログ始めたい人へ無料おすすめのテーマとプラグイン(過去の自分へのメッセージ)

今回は、とりあえずWPで個人ブログを始めたい人に向けたゆるーい記事を書きたいと思います。
とりあえず始めたい人に個人的に何回も個人ブログを作っては挫折した自分がこうしたほうがよかったなという意味を込めて書きます。

やってはいけないことは一つだけで、
デザインにこだわりすぎて最初から頑張らないことです。

ブログを書く上で大切なのは続く癖をつけて、記事を増やすことだと思います。
デザイナー（フロントエンジニア）を目指してるからWPをはじめてめっちゃ凝ったデザインにしていくぞっ！
と、PSDでデザイン作ってコーディングしてテーマ作成していく。
できた時には満足して記事を書きません。（数年前の私です）

何回もアホみたいに作るので、スキルは上がるかもしれませんが個人ブログが一向に成長しません。
なので、そんな人に（数年前の自分に向けた）記事を書きたいと思います。

## いいから記事を書いて（過去の自分。。。）
とにかく、記事を書く癖をつけたほうがいいです。
ブログは記事がなければ意味がありません。（過去の自分に言ってます）
他のブログでこんな機能があるからこれをつけたいとかいいです。
記事が何十件もできると必要な機能が見えてきます。
そうしたら、無料テーマでは対応しきれないのでテーマを作ればいいです。（過去の自分に言ってます）

## 私が思うテーマの選ぶ基準
記事詳細もアイキャッチがなくても見栄えがいいものを選ぶことだと思います。
ブログを書く上で重要なのは記事の内容です。
アイキャッチがないとかっこよくないデザインは避けたほうがいいです。
個人的にはブログを書くで一番大変なのがアイキャッチの作成です。

## 始める人へおすすめのテーマ
- NEBlue (https://ja.wordpress.org/themes/neblue/)
    - とてもシンプルだけど使い勝手がいい
- Sparkling (https://ja.wordpress.org/themes/sparkling/)
    - 日本語でも十分見やすい
- Sanse (https://ja.wordpress.org/themes/sanse/)
    - アイキャッチを設定しないテーマ
    - 文字だけの人はかなり良さそう
- Diamond (https://ja.wordpress.org/themes/diamond/)
    - トップページが若干日本語だと、見づらく感じるかもしれませんが使いやすそう

## おすすめプラグイン
- Easy FancyBox (https://ja.wordpress.org/plugins/easy-fancybox/)
    - 記事本文内で画像をリンク設定した時画像をモーダル表示してくれます。
- EWWW Image Optimizer (https://ja.wordpress.org/plugins/ewww-image-optimizer/)
    - メディアアップロードした画像をいい感じに圧縮をしてくれます。
- Lazy Load (https://ja.wordpress.org/plugins/lazy-load/)
    - 記事の画像表示を後から読み込みページ表示スピードを向上させます。
- VA Social Buzz (https://ja.wordpress.org/plugins/va-social-buzz/)
    - 記事を読んでもらって気軽にシェアーをしてもらうために、FacebookとTwitterのシェアーボタンを追加してくれます。
    - テーマで用意している場合は不要です。
- Yoast SEO (https://ja.wordpress.org/plugins/wordpress-seo/)
    - SEO対策にとても便利なプラグインです。

## 導入するのはまだ早いプラグイン
- AddQuicktag(https://ja.wordpress.org/plugins/addquicktag/)
    - 本文に登録しておいたタグを挿入できるプラグイン
        - ちゃんと設計してから使わないと負の遺産になるからとりあえず入れてはやめてね。つかっても、必要最低限にね（過去の自分に言ってます）
- Contact Form 7(https://ja.wordpress.org/plugins/contact-form-7/)
    - フォームを簡単に作れるプラグイン
        - 始めたばかりの時はGoogleのフォームでも十分だと思いますよ。むしろブログ専用のツイッターアカウントを作ってDMへメッセージしてくださいでもいいとおもいます。（過去の自分に言ってます）

## まとめ
同じことしか言ってませんが、どんなものが必要かはシンプルな状態から育てて必要な時に機能をつけたほうがいいです。
なので、最初にあれもこれも機能を考えてデザインしてテーマ作成して満足しないでください。（過去の自分に言ってます）
まずは続けれるようにシンプルなところからスタートをしていってください。(数年後の自分より)