OmniAICreator/Qiita-1.07M huggingface dataset:
ArchLinuxの個人的な推奨事項

この記事は"Arch Linux"を使う上での私の考える推奨を紹介します。一般的な推奨事項は[こちら](https://wiki.archlinux.jp/index.php/%E4%B8%80%E8%88%AC%E7%9A%84%E3%81%AA%E6%8E%A8%E5%A5%A8%E4%BA%8B%E9%A0%85)を参照下さい。
また、[こちら](https://wiki.archlinux.jp/index.php/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89)にインストール方法が有ります。

## ArchLinuxとは
ArchLinuxとは軽量、シンプルで最小構成からシステムを構築できる先進的[^newly]なLinuxディストリビューションです。
その真の利点はどんな目的と信念のシステムも簡単に構築できる点です。
公式のリポジトリには非常に多くのソフトウェアがあり、無い場合でもaurというユーザーリポジトリを探せば大抵のソフトウェアはインストールできます。
また、ArchLinuxはローリングリリースであるため、ソフトウェアのバージョンが基本的に最新のためコードを自力でビルドする場合でも問題が発生しずらいです。
最小構成から構築するという問題が発生した場合もどのソフトウェアが原因になったかが容易に特定することができます。
ArchLinuxはインストールがコマンドラインからしかできない[^inst]ため上級者向けと言われますが、このような特性から運用が非常に簡単であるため初心者や中級者にもお勧め[^learn]します。

## kernel
Linux kernelはlts版もインストールしておくことを薦めます。
`# pacman -S linux-lts`
(滅多にありませんが)アップデートしたkernelにバグがあった場合でも起動できるようにするためです。
あとはブートローダのエントリにlts版のファイルを追加しておきましょう。

archでは様々なカーネルを同時にインストールして使うことができます。詳細は[こちら](https://wiki.archlinux.jp/index.php/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB)にありますが、Linusのgitからビルドすることや、"バイナリブロブ"が取り除かれたdebianユーザー向けの物など、ユニークな物があります。

## Editor
デフォルトで入っている`vi`は`vim`のaliasではなくBSDで使われているオリジナルの`vi`です。Unixライクを信条にする方には良いでしょうが`vim`を使用したい場合はインストールする必要があります。
`# pacman -S vim`

emacsを使用する場合もインストールが必要ですがterminalでのみ動作するバージョンの方を個人的には薦めます。
`# pacman -S emacs-nox`

## network
Archユーザーの中には全て手動で設定するべきだと考えている人も存在しますが流石に苦行ですので`netctl`の使用をお勧めします。
このツールでテキストベースのファイルでネットワークについての全ての設定を管理することができでき、簡単に切り替えることができます。

## HiDPI
4KモニタやAppleのRetinaのような高解像度ディスプレイにインストールする場合はコンソールの文字が小さくなって見えません。これは巨大なフォントを使用することで改善します。デフォルトインストールで一番大きい物を有効化するには
`$ setfont latarcyrheb-sun32`
違うパッケージがインストールできる場合は
```# pacman -S terminus-font
$ setfont ter-132n
```
を使用して下さい。12.5inch,4K Displayというかなり高いDPIを持つディスプレイでも視認可能でした。

## USBメモリ
ArchLinuxではUSBメモリでよく使われるファイルシステム`exFAT`,`NTFS`がデフォルトインストールでは入らないので入れる必要があります。
`# pacman -S exfat-utils ntfs-3g`
また`libimobiledevice`というソフトウェアを使うことでiPhoneをマウントすることができます。
`# pacman -S ifuse usbmuxd libplist`
マウントする時は`ifuse`を使用します。
`# ifuse <mountpoint>`
アンマウントする時は通常の`umount`と同様の方法でできます。

## 日本語
日本語を表示する必要がある場合は別途フォントをインストールすることを薦めます。
`# pacman -S adobe-source-han-sans-jp-fonts`
or
`# pacman -S otf-ipafont`
日本語入力については[こちら](https://wiki.archlinux.jp/index.php/国際化#.E3.82.A4.E3.83.B3.E3.83.97.E3.83.83.E3.83.88.E3.83.A1.E3.82.BD.E3.83.83.E3.83.89.E3.83.95.E3.83.AC.E3.83.BC.E3.83.A0.E3.83.AF.E3.83.BC.E3.82.AF)を確認して下さい。大抵の場合はインプットメソッドフレームワークとインプットメソッドを別途インストールすることになるでしょう。私が`skk`というあまりお勧めするべきではないIMを使っているためwikiをよく読んでください。


## 最後に
個人の好みが分かれるデスクトップ環境などは記載しなかったので[ArchWiki](https://wiki.archlinux.jp/)を検索してください。ArchLinuxについてここを検索すれば大抵のことは分かります。
ただ日本語版は古い情報の場合があるので困った時は[本家](https://wiki.archlinux.org/)を調べましょう。


[^newly]: 例えば`python`コマンドは`python3`を起動させます。
[^inst]: といっても難しいのはブートローダーのインストールぐらいでwikiの通りに進めれば誰でもインストールできます
[^learn]: Linuxの勉強にも良いですよ
vimでバッファの内容をコマンドとして実行する

こんにちは、アイスタイルアドベントカレンダー23日目を担当します塚本です。
今年は簡単なvimネタです。

僕はvimをコーディングの他、何かのコマンドの標準出力から新たなコマンド作るのに利用しています。

知っているとほんのり便利な小技だと思いますので、ありがちなユースケースに沿ってご紹介します。


# コマンドを組み立てる
極端な例ですが、例えばgitでバージョン管理しているファイルに対して下記のように変更があったとしましょう。
![7c9aec7332e49cc58a476fe8ad0c86e2.png](https://qiita-image-store.s3.amazonaws.com/0/216988/1c172733-b935-355f-f8ef-2af9d9e23b87.png)

この時、特定のファイルだけをステージングするには一つ一つ `git add [ファイル名]` するか`git add -p .`すれば良いですが、今回はvimを使ってみます。

まずはgit status の標準出力をvimで受け取ります。`vim -` とすることで標準入力をバッファに取り入れることができます。

```bash
git status | vim -
```
![a0a0b9f6afa2cf918f33a8ea79f6f018.png](https://qiita-image-store.s3.amazonaws.com/0/216988/2f42efab-3b94-a6a8-405e-e0a2f400c6a0.png)

次にステージングしたいファイル名だけを残し、余分な行をすべて消します。短形選択やglobalコマンドが役に立つでしょう。
![2f5ec37e6afbe6a12e473903d1d809d0.png](https://qiita-image-store.s3.amazonaws.com/0/216988/17bebdaa-65dc-815d-d48d-79c0a2bb24dd.png)

ここから更に`ctrl+j`を複数回実行、行頭に`git add`を付けることでコマンドを組み立てます。
![b73068ef5f59b8ea9a0873f4bd003772.png](https://qiita-image-store.s3.amazonaws.com/0/216988/743c2f63-b017-af95-dbd5-51c0ea4cb76a.png)


# バッファの内容をシェルで処理する

この状態で `:%!sh` すると目的のファイルがステージングされます。
![19143777240f953266db2e4be5e35f11.png](https://qiita-image-store.s3.amazonaws.com/0/216988/e1382f7f-93b3-6ecc-b9ae-2d3ab496d4a2.png)

!コマンドは指定範囲の内容を外部のコマンドを使って処理するコマンドです。`{範囲}!{外部コマンド｝`とすることで指定された範囲を外部のコマンドで処理することが出来ます。

この例では!コマンドでバッファの内容をシェルの標準入力に渡し、実行しているわけですね。

!コマンドに関してはちょうど今年のvimアドベントカレンダーで解説されている方がいらっしゃいました。詳しくはこちらをどうぞ！
[Vimと外部コマンドをつなぐ!コマンド(仮称)](https://qiita.com/nil2/items/9f2365eb1e8abf3d323b)

# まとめ
標準入力をvimの強力な編集機能で編集し、新たなコマンドとして実行する。地味ですが結構色々応用できそうな気がしませんか？

今回は極端な例でご紹介しましたが、僕は他にも外部APIへのリクエストログを加工してcurlコマンドを作成する等の用途で利用しています。

是非他にも色々な活用法を探してみてください。
Jenkins Pipelineのjunit関数にオプションを指定していい感じにしよう

この記事ではJenkins 2.88, Pipeline Plugin 2.5, JUnit Plugin 1.23を使用して動作確認を行いました。

# 簡単テスト結果集計junit
Jenkins Pipelineの使用時、テスト結果xmlファイルからの集計にはjunit関数を使います。

```
junit 'junit_output.xml'
```
こんな感じですね。

これで特に実用上困らないですが[JUnit Plugin](https://wiki.jenkins.io/display/JENKINS/JUnit+Plugin)の説明を見ると、[Configuration](https://wiki.jenkins.io/display/JENKINS/JUnit+Plugin#JUnitPlugin-Configuration) に4つオプション指定できると書いてあります。

https://jenkins.io/doc/pipeline/steps/junit/ を見て指定の仕方を確認します。

# 実際のオプション指定の書き方と意味
```junit allowEmptyResults: true, keepLongStdio: true, healthScaleFactor: 2.0, testResults: '**/target/reports/TEST-*.xml'
```

- Test report XMLs
    - テスト結果のxmlファイルを指定します
- Retain long standard output/error
    - 長い標準エラー出力を保持します
- Health report amplification factor
    - 「空模様の倍率」。2.0だと5%のテスト失敗が10%の失敗として空模様(Build trend)に反映される？
- Allow empty results
    - 空のテスト結果ファイルを指定してもエラーになりません

## おや？ Pipeline Pluginの説明に他にも書いてあるぞ...?
https://jenkins.io/doc/pipeline/steps/junit/
testDataPublishersとか色々指定できるようだけど力尽きたのでここまで...
Ancient C探訪記：プリプロセッサ編

 **おことわり**： この記事では「1975年頃のC言語」仕様を解説します。2017年現在のC言語仕様とは異なるため、あなたのC言語ライフには役立たないことを予めご承知おきください。

（本投稿は [Ancient C探訪記](https://qiita.com/yohhoy/items/6631443736ab779d3fbb) シリーズの一部です。）

シリーズ最後の話題は「プリプロセッサ(Preprocessor)」を取り上げます。


# Ancient Cのプリプロセッサ
## defineマクロ
"[C Reference Manual][cman]" §12.1 Token replacement から一部を引用します。Ancient Cでは、単純トークン置換を行うマクロ(macro)のみ利用可能です。関数形式マクロ(function-like macro)は存在しません。

> A compiler-control line of the form
>
> ```
> # define identifier token-string
> ```
>
> (note: no trailing semicolon) causes the preprocessor to replace subsequent instances of the identifier with the given string of tokens (except within compiler control lines).


## ファイルinclude
"[C Reference Manual][cman]" §12.2 File inclusion から一部を引用します。Ancient Cではダブルクォーテーション(`"..."`)のみサポートします。山括弧(`<...>`)は記述できません。

> To further exploit this technique when a large C program consists of several files, a compiler control line of the form
>
> ```
> # include "filename"
> ```
>
> results in the replacement of that line by the entire contents of the file filename.


## 標準規格との差分
Ancient Cのプリプロセッサには前述の2命令しかありません。シンプル！

標準C（ANSI C／C90）では`#`演算子、`##`演算子、条件付き取込み(Conditional inclusion)の`defined`と`#if`/`#elif`/`#ifdef`/`#ifndef`/`#else`/`#endif`、各種ディレクティブ`#undef`, `#line`, `#error`, `#pragma`、定義済みマクロ`__DATE__`, `__TIME__`が追加されています。

---
もっと "[C Reference Manual][cman]" を読みこめば発見があるかもしれませんが、本シリーズはこの辺りでお開きとしたいと思います。

[cman]: https://www.bell-labs.com/usr/dmr/www/cman.pdf
痛slackにする

web版とアプリ版（mac）での方法を記載します。

# web版（chrome, firefox）

chromeまたはfirefoxを使っていることを前提とします。

## 1.stylusを導入します

stylusを使えば特定のサイトにcssを適用することができます。

- firefox: https://addons.mozilla.org/ja/firefox/addon/styl-us/
- chrome: https://chrome.google.com/webstore/detail/stylus/clngdbkpkpeebahjckkjfobafhncgmne

またその他にも似たような拡張機能があるので、それらを使用しても構いません。

---

##2.背景に適用する画像をbase64に変換
macの場合はターミナルから可能です。

```
$ base64 serval.png
```

webアプリで変換しても問題ないです。
というかこっちの方が便利です。
https://www.base64-image.de/

##3.スタイルを適用します。
僕の場合は以下のようにcssを設定しました。
`#messages_container`に背景画像を設定しています。
それ以外のcssはユーザーの操作（例えばマウスカーソルのホバー）等でサーバルちゃんが見えなくなるので、このようにしています。
ちなみに私は元画像は半透明のものを使っているのでcssでは半透明にする設定を行なっていません。（css難しくてうまく半透明にできなかったので。。。）
画像の大きさによってはstylishエディタが重くなってしまいます。
あまり、ガリガリ編集することがないので問題ないと思います。

```css:痛slack(web)
.p-workspace__primary_view_body {
    background-image: url(data:image/png;base64,<base64に変換したpngの文字列>);
    background-repeat: no-repeat;
    background-position: bottom right;
}
.c-scrollbar__hider {
    background-color: rgba(255,255,255,0) !important;
}
.c-message_kit__background {
   background-color: rgba(255, 255, 255, 0.3) !important;
}
.c-message_kit__background:hover {
   background-color: rgba(255, 255, 255, 0.6) !important;
}
.c-message_kit__background--hoverd {
    background-color: rgba(255, 255, 255, 0.6) !important;
}
```

##完成
あとはstylishの方で対象となるslackのドメインを指定して完成です。
![slack_web_serval.png](https://qiita-image-store.s3.amazonaws.com/0/83495/496ad540-f5f9-4f0f-628a-0fd7dd71c3e1.png)
かわいい。

#アプリ版(mac)

**現在このやり方はうまくいきません**
**ご注意ください**

公式の推奨しているやり方かわからないので、やってみる方は自己責任でお願いします。
windowsでもできると思うのですが、macでしか試していません。

##実装方法
`/Applications/Slack.app/Contents/Resources/app.asar.unpacked/src/static/ssb-interop.js` に以下のコードを追記してください。

```js:痛slack(mac)
document.addEventListener('DOMContentLoaded', function() {
  var css = `\
    #messages_container {\
        background-image: url(data:image/png;base64,<base64に変換したpngの文字列>);\
        background-repeat: no-repeat;\
        background-position: bottom right;\
    }\
    .c-scrollbar__hider {
        background-color: rgba(255,255,255,0) !important;
    }
    .c-message_kit__background {
       background-color: rgba(255, 255, 255, 0.3) !important;
    }
    .c-message_kit__background:hover {
       background-color: rgba(255, 255, 255, 0.6) !important;
    }
    .c-message_kit__background--hoverd {
        background-color: rgba(255, 255, 255, 0.6) !important;
    }`
  $("<style></style>").appendTo('head').html(css);
});
```

すごいシンプルで先ほどのweb版痛slackのcssをheadに追加しているだけです。

完成品は以下のようになります。
![slack_app_serval.png](https://qiita-image-store.s3.amazonaws.com/0/83495/96188f43-e7aa-5caf-07fa-aaf6dfaf71b1.png)
かわいい。

#まとめ
サーバルちゃんかわいい。

背景に使う画像ですが、base64に変換しないでどこかにアップして、urlを指定するのも当然大丈夫です。
ただ、わざわざあげるほどのことでないので今回はbase64で画像を読み込んでいます。

アプリを痛くする方法は、darkテーマにする方法を参考にしました。
darkテーマにしたい人は下記urlを確認してみるといいと思います。（もちろん自己責任で！）
https://qiita.com/kazuki1213/items/bfc85bc847caa1617c18

＊追記
slackのcssが変更されている場合があるので、うまく適用されない場合は一度確認してください。
git worktreeを使ってUnityのプラットフォーム切り替えを楽にする

### はじめに
以前Unityのクライアントサイドの仕事をしていたときに、地味に時間がかかっていたのがAndroidとiOSのプラットフォームの切り替えでした。
切り替え時間を高速化する正攻法は、Cache Serverを導入することであり、現在のUnityでは簡単にLocal Cache Serverを有効にすることが出来ます。しかしながら、SDKの組み込み等AndroidとiOSの切り替えを頻繁にすることがあったので、より楽できないかと考えたのがgit worktreeを使う方法です。
今回は、Android用の作業ディレクトリとiOS用の作業ディレクトリを分け、それぞれのプラットフォームに設定したUnityを2つ立ち上げることにします。
Unityを2つ起動するためには、作業ディレクトリも2つ用意する必要があります。

### git worktree
通常は1つの作業ディレクトリのみ使用しているため、作業中に別のプラットフォームに切り替えたい場合は
時間の掛かるプラットフォーム切り替えを行わなければいけませんでした。
作業用ディレクトリ2個用意するためなら、同じリポジトリから別の作業用ディレクトリにcloneするのが一番簡単ですが

* 容量を2倍食う
* .gitディレクトリが別物なので、それぞれの作業ディレクトリでfetch/pullする必要がある

というデメリットがあります。
git worktreeはgitの作業ディレクトリを複数作成することができるコマンドで、.gitディレクトリは共有されており上記のデメリットが解消されています。
参考: [複数の作業ディレクトリを作成する git worktree](https://qiita.com/usamik26/items/0d42db4ea25e2a2ce845)

コマンド例

```bash
$ git branch dev_android # 作業用ブランチ作成
$ git worktree add ../Android dev_android # 作業ディレクトリ追加
```

同じブランチを複数の作業ディレクトリでチェックアウトすることは出来ないので、まず作業用ディレクトリを作り、そのブランチを指定して新しい作業ディレクトリを追加します。
この作業ディレクトリを指定してターミナルからUnityを起動すれば、同時に2つのプラットフォームで作業することができます。確認したいときも時間の掛かるプラットフォーム切り替えをする必要はありません。

### git stash

git worktreeによる複数の作業ディレクトリは、.git以下を共有しています。（worktreeで作成した作業ディレクトリの.gitを見てみたところ
シンボリックリンクを張っているのではなく、元の.git以下を参照するようなgitdir指定がされています。）
これによる地味ながら、たまーに便利だなと思うのがstash listを共有している、ということです。
Unityを２つ起動してUIなどを調節したいが、commitしてamendを繰り返すのもちょっと面倒…という非常に狭い範囲ではありますが作業ディレクトリ間でstash listが共有されているので簡単に変更を受け渡すことができます。
ブレットボードでArduboyを作ってみる

[Arduino Advent Calendar](https://qiita.com/advent-calendar/2017/arduino) 24日目です。

昨日は@junya28nyaさんで物理フリックを30個量産販売している話でした。
このツイートは拝見しましたがとても完成度が高いのが印象的でした。

さてArduinoを使ったミニゲーム機：Arduboyが販売されています。
かっこよくてとても欲しいのですががすごくお高いです。。。

https://arduboy.com/

http://akizukidenshi.com/catalog/g/gM-11863/

![](http://akizukidenshi.com/img/goods/C/M-11863.jpg)

そんな時以下のページを見つけてpro microもAliexpressで仕入れたのが
転がっていたのでブレットボードでやってみました。

https://ht-deko.com/arduino/arduboy_clone.html


###完成品
さっそくですがこうなりました。
配線は互換機作成ページのそのままです。
LEDとリセットボタンはなく、上下左右とABボタンのみとなりました。

![IMG_0758.JPG](https://qiita-image-store.s3.amazonaws.com/0/146663/70df4607-0997-7617-be74-ea0b3e145bb6.jpeg)

###設定
配線が済んだら設定です。
ArduinoIDEのライブラリマネージャからArduboyと検索して出てきた以下のものを入れました。
・Arduboy
・Arduboy2

ライブラリを入れたら本物とはピン配置が異なるので互換機作成ページに従い、core.hのピン
を修正しておきます。

###Let's Play
あとは公式からサンプルゲームを落としてきて書き込んでみましょう。
テニスゲームを書き込んでみました。

![IMG_0790.JPG](https://qiita-image-store.s3.amazonaws.com/0/146663/d002bf3c-87a7-f952-bccf-84459a76cd4a.jpeg)

ブレットボード（650円）とAliexpressで買ったpro micro互換機（350円ぐらい？）と
タクトスイッチとジャンパ線合わせて1200円ぐらいでしょうか？？

とても雑にブレットボードでArduboyもどきを作ってみましたが
ちゃんとゲームが動くので面白いですね。
初心者の恥ずかしい失敗記録

　私のプログラマーとしての経歴はCOBOLが一番長く20年ほどで、管理に移ってからは自分の仕事の効率化で使うExcelマクロです。
　現在は、ちょっと欲張ってHTMLやJavaScriptやPythonに手を出して、本を読みながら悪戦苦闘しています。当然、ミスと失敗の連続です。
　ミスと失敗を防ぐためには、もっと勉強すればいいのでしょうが、週末に勉強する程度では、なかなか前に進みません。
　そのうえ、悲しいかな、同じミスも繰り返します。
　ある日、失敗をしないためには、失敗を記録し、それを読み直せばいいと思いつきました。
　そこで、このブログに恥ずかしい失敗とミスを書き出して、ミスをしないように心がけることにします。

　これを読む方々へ。
　失敗とミスばかり書いていますので、あまりあざ笑わないでください。できれば、何も言わず読むだけに徹していただければ幸いです。
　ついでにアップするソースは、皆さんからすれば目を覆いたくなるようなシロモノでしょうが、それについても温かく見守っていただきたく。
TouchDesignerでのMIDIのセットアップ

TouchDesignerではMIDIを使うのがとても簡単ですが流石に繋ぐだけとまではいかないので、そこまでの解説をしたいと思います。

今回は<a href="http://www.korg.com/jp/products/computergear/nanopad2/">nanoPAD2</a>を使用します。

TouchDesignerを立ち上げてMIDIコントローラを接続しただけでは警告が出てしまいます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/175399/079a8533-83bc-92d5-a4c6-2639bfba4319.png" width="50%">


まず、DialogsのMIDI Device Mapperを開きます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/175399/4a76d22d-7bb6-af55-458e-e587f47fcfcb.png" width="50%">

<img src="https://qiita-image-store.s3.amazonaws.com/0/175399/3bbb1302-5363-f3a0-8d2d-e46734f403c4.png" width="50%">

その中にあるCreate New Mappingを押し、新しくできたもののIn Deviceの使用したいデバイス名が出てくると思うのでそれを選択します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/175399/8ce66790-602b-d267-a0d4-141222e1143d.png" width="50%">

認識してくれました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/175399/69726cb3-28c8-094a-15cc-7c4326bb9b21.png" width="50%">

#MIDIで画像切り替え
４つのボタンを押して画像が切り替えをやってみたいと思います。
ファイルは<a href="https://www.amazon.co.jp/clouddrive/share/0m9fQokP8VrdDhjwdRisozM1FuArmGAoqHYgayff9F?ref_=cd_ph_share_link_copy">こちら</a>
完成図
<img src="https://qiita-image-store.s3.amazonaws.com/0/175399/7ce51309-4f82-3c8e-39f5-f3b080f7337a.png" width="80%">

midiinCHOPの入力をfanCHOPで何番目のボタンが押されているかをわかるようにします。
fanCHOP->All Channels Off : Set to -1

ボタンが押された時に値が更新されるようにholdCHOPを使用します。
そのままだと-1,0,1,2,3の値が来て、
hold の Sample を Off to On にしているため-1から0の時に値が更新されません。

そこでmathCHOPで値に+1をしてその値をholdのTriggerにいれます。

nullCHOPを繋いで、その値をswitchTOPのIndexに参照させることで画像切り替えができました。
アイスタイルのデザイナーって何してるの？

みなさん、こんにちは。
今年の９月からアイスタイルにジョインしたデザイナーの新井です。
この記事は、[「アイスタイル Advent Calendar 2017」](https://qiita.com/advent-calendar/2017/istyle)24日目の記事です。
今日はクリスマス・イヴですね:santa_tone2:

# はじめに
女性で＠cosmeを知っていたり、利用している人は割と多いと思うのですが、
男性の方だと知らない方がいたり、またアイスタイルと聞いてすぐに＠cosmeと結びついている人は、まだまだ少ないのではないかなと思います。

また、＠cosme＝口コミサイトといった印象も強いのではないでしょうか。
（私も、転職する前まではそう思っていました。）


しかし、実際には口コミ以外にも＠cosmeのリアル店舗や通販、サロン予約や化粧品業界の求人など、美容に関わる様々なサービスがあります。

デザイン部では、それらサービス別にデザイナーがいて運用をしたり、チームを組んで新規開発などを行なっています。

今回は簡単ではありますが、私が入社してからの業務を３つに分けてお話したいと思います。

##１.マークアップ

入社して最初の作業はマークアップでした。
内容はcssの修正で難しくはありませんでしたが、前職ではデザイナーとフロントと完全に分業されていて、久しく触れていなかったので少し不安でした。

また、この時に初めてGithubを使いました。
まずは基本の使い方など教わり、ブランチを作ってプルリクしてと一連の作業をしたのですが、その頃は手順を覚えるのに必死で、はっきり理解できていなかったと思います。。

しかも、自分が黒い画面でコマンドを打つ日が来るとは、想像もしていなかったのでびっくりでした。
（黒い画面が怖いのは、デザイナーあるあるだと思います。）


##2.ディレクション

運用案件では、既存ページのリニューアルと新規ページのデザインをしました。

今後のステップアップとしてアートディレクターを目指しているので、サポートを受けつつ、ディレクションも担当させてもらいました。

スケジュール確認や、ワイヤー、画面設計書の作成、デザイナーへの指示など、想像以上に考えなければいけない事が多く、
またコミュニケーション力もこの短期間でアップしたように思います。


##3.デザイン
今は新規プロジェクトのデザインを担当しています。

今回の案件で初めてAdobe XDを利用しました。

XDの良いところは操作が軽いところと、PhotoshopやIllustratorなどの連携です。
例えば、KVなどの画像はCCライブラリに入れておく事で、後に修正が発生した場合でも、psdを修正し保存するだけでXDにも反映されます。

また、デザイン→プロトタイプ→共有までの一連の流れを、XDだけでできてしまうのも魅力的です。


これまでカンプ一覧はhtmlで作っていて、デザインの修正があるたびに画像の書き出しをしていましたが、
XDのプロトタイプやコメント機能を利用することで、確認や修正などスピーディーに対応する事ができました。

また、違うパターンのプロトタイプを作りたい時は、「新規リンクの作成」で何パターンも簡単に作れる事ができるのも便利です。

ディレクターがワイヤーを作る時にも使えば、デザイナーがパワポから文字を１つずつコピペするといった、地味に面倒な作業も減るので、今後社内でも幅広く活用できたらなと思っています。


#最後に
この３ヶ月間で、デザイン以外の業務に携わる事が多かったので、そこをピックアップして書いてみました。
それがアイスタイルの良さでもあると思います。

また、サービスを横断してクリエイターがナレッジ共有をしたり、ヘルプで案件に入ったりと、横軸でつながる機会もあるので、スキルアップにも繋がると思います。


アイスタイルに興味がある人の参考になれば嬉しいです。
最後までお読みいただきありがとうございました。

明日は@sugat1679です！
イーサリアムの Whisper を使ってみる

[Ethereum Whisperを利用したP2Pチャット機能 - Qiita](https://qiita.com/tomohata/items/433911567b0a202b7074)

いつか上記記事を読んで、「あ、確かに、`web3`のAPIには`.shh`があった」と気付いて、やってみました。
APIいろいろ変わったので、詳細内容を添付します。

## 確認した結果
- 同じノードで試してみて、送信と受信はできた
- `symKeyID` + `topic`でメッセージ公開内容を限定できる
    - なので、誰でも見えるではなく、上記情報をしている人だけ見える

## 環境
- `geth`をインストールして、下記コマンドで起動しておく
    - ポイントは`--ws`周りのオプション。許可APIも`shh`を入れる必要がある

```
geth -dev --ws --wsport 8546 --wsaddr 0.0.0.0 --wsorigins "*" --wsapi "eth,web3,shh" console

// 上記コマンドで起動したconsoleで下記を実行して、symKeyの値をメモしておく
> web3.shh.newSymKey()
"6a255cd62f2f9989119a60ea0cac6aa71aba479e99a49cff8a6eade669f1e44e"
>
```
- **マイニング開始しなくてOKです**

## 確認手順
- 作業ディレクトリを作成し、そこに移動する
- `yarn add web3`実行し、`web3`をインストールする
- 次のセクションのコードで`send.js`と`watch.js`を作成する
- `node watch.js`を実行してから、別のターミナルで`node send.js`を実行すると、watchのほうに下記のような受信したデータが表示された！

```
receive data:
{ sig: '0x045811f4c1ac1c860c18d314159eeedb13dd194e40eb95851f5abd9b303731bfdb918e1b41a43a75875c5d9ea073011a985ec4bdf1a151d2ee27c25e4186b90919',
  ttl: 10,
  timestamp: 1514038334,
  topic: '0xffaadd11',
  payload: '0xffffffdddddd1122',
  padding: '0x6a6a321cadb2b17e45fe678e74c1fcb252fd2737bff136086666f85a436b8840d5d0752529b83e2608202f7a320325fb9518a8bd32e5a418a278279fdbac1bc49c9e704cd2b67cf3
b512f08c25f67c77ec28561f32d662abd13e89521bec7c34339ef5bbfdb2ee01ae11af1428781f786da980243891896a0408885a95744ba88a0896f4b00089ef4ba6ae2ec4865ed3fc463c83e7b99c
0ee108f43c249856e45aae3447aa75b256bd96500b369a0545f06c86cbe4',
  pow: 0.6714754098360656,
  hash: '0x962587c9de2d3f355dbaf098762a57288a12dba1edb00c35e1f5fbe63da9a38c' }
```

## コード

```javascript
// send.js
var Web3 = require("web3");
var web3 = new Web3();

web3.setProvider(new Web3.providers.WebsocketProvider('ws://0.0.0.0:8546'));

var symKey = '2996cfb046f29413e55796fc201a3f7146b19ce63644369fc0f415f7d83a4637';
var keyPair = null;

Promise.all([
  web3.shh.newKeyPair().then((id) => { keyPair = id; })
]).then(() => {
  web3.shh.post({
    symKeyID: symKey, // encrypts using the sym key ID
    sig: keyPair, // signs the message using the keyPair ID
    ttl: 300,
    topic: '0xffaadd11',
    payload: '0xffffffdddddd1122',
    powTime: 3,
    powTarget: 0.5
  });

  console.log('sent message');
});
```

```javascript
// watch.js
var Web3 = require("web3");
var web3 = new Web3();

web3.setProvider(new Web3.providers.WebsocketProvider('ws://0.0.0.0:8546'));

var symKey = '2996cfb046f29413e55796fc201a3f7146b19ce63644369fc0f415f7d83a4637';
var keyPair = null;

Promise.all([
  web3.shh.newKeyPair().then((id) => { keyPair = id; })
]).then(() => {
  subscription = web3.shh.subscribe("messages", {
      symKeyID: symKey,
      topics: ['0xffaadd11']
  }).on('data', (message) => {
    console.log('receive data: ')
    console.log(message);
  });

  console.log('started subscribe.');
})
```

## まとめ
- イーサリアム上では、P2Pのメッセージングもできる
- まだまだ把握できてないことが多い
    - メッセージは、P２Pネットワークに公開する時、暗号されている？
    - 先に送信し、そのあと watch する場合でも、メッセージを受信できると理解していたが、うまくできませんでした
    - やはり異なるノードで試してみたい

## 参考資料
- [web3.shh — web3.js 1.0.0 documentation](https://web3js.readthedocs.io/en/1.0/web3-shh.html#post)
pukiwikiのbasisスキンをPHP7に対応させる


自分がやってるpukiwikiサイトでは、
basisスキン( https://pukiwiki.osdn.jp/?自作スキン/basis )を使っています。

ところが、ある日突然レンタルサーバーのPHPバージョンがPHP7.0になってしまい、
スタイルが崩れて上手く表示されないという事態に・・・

ということで、basisスキンをPHP7に対応させるときの修正点について書いておきます。

pukiwiki バージョン ：1.5.1
PHP バージョン：7.0.19


#修正点
basis/base.css.php の内容を変更します。

```base.css.php
#197行目
-- <?php if (ereg("MSIE (5|6)", $ua)) {?>
++ <?php if (preg_match("/MSIE (5|6)/", $ua)) {?>
```

意外と見つけるの大変でした。。。

ereg() はPHP7.0で削除されたんですね。
ということで、preg_match() に書き直します。

#修正後
無事、正しく表示されるようになりました！

![新しいビットマップ イメージ.jpg](https://qiita-image-store.s3.amazonaws.com/0/218953/144fbc3a-f430-8fdc-32b5-3aa226eebdab.jpeg)
【追補】Cygwinインストール革命 (Mac/Linuxユーザーに朗報。Windows上で tmux(端末多重化ソフト) や vim が使える環境が3分で構築できます！emacs, git や Xサーバーも追加インストール可能)

この記事は、『[Cygwinインストール革命 (Mac/Linuxユーザーに朗報。Windows上で tmux(端末多重化ソフト) や vim が使える環境が3分で構築できます！emacs, git や Xサーバーも追加インストール可能)](https://qiita.com/javacommons/items/879efd486313cac8b381)』に対する最新・追加情報です。

##1. OSのビット数自動判定の追加

バッチファイル内の CYG_BITS の指定を以下のようにすることで 32bit Windows では 32bit Cygwin が、64bit Windows では 64bit Cygwin が自動的にインストールされるようになりました。

```
set CYG_BITS=auto
```

##2. Emacs のウィンドウ間移動について

tmux パッケージをインストールした場合には

```
「Shift+矢印キー(Shift↑ Shift↓ Shift← Shift→)でペイン間移動」ができます。
「Ctrl+矢印キー(Ctrl↑ Ctrl↓ Ctrl← Ctrl→)でペインリサイズ」ができます。
```

という旨を説明していましたが…

Emacs については
<kbd>「Alt+矢印キー」または「Esc+矢印キー」でウィンドウ間の移動ができる</kbd>ように site-start.el に設定が書き込まれるようになっています(が説明を書いていませんでした)。emacs-w32 をウィンドウモードで起動した場合には、マウスクリックによるウィンドウ移動が可能ですが、コンソールモードでは <kbd>C-x o</kbd> を繰り返し押すことになり、移動方向も指定できませんので特に役に立ちます。

<kbd>Alt+矢印キーによる Emacs のウィンドウ間移動は、Emacs単体でも役に立ちますが、tmux でペインの移動(Shift+矢印)やペインのリサイズ(Ctrl+矢印)をしながら、ペイン内で開いたコンソールモードの Emacs の中でウィンドウ分割した場合でも tmux 用のキー操作と干渉することなくウィンドウ移動することができるように意図(設計)されています。</kbd>

##3. Emacs のウィンドウサイズ自動調整について

Emacs のウィンドウを C-x 2 で上下に分割した後に、どちらかのウィンドウをさらに C-x 2 で分割すると、２分の１の高さのウィンドウが一つと４分の１の高さのウィンドウが２つできてしまいますが、これら全部を３分の１の高さに(均等に)そろえるコマンドとして M-x balance-windows があります(ちなみに、縦分割・横分割の両方に対応しています)。このコマンドは標準では <kbd>C-x +</kbd> にバインドされていますが、日本語キーボードでは <kbd>+</kbd> を入力するのに Shiftキーを 押さなければならないので <kbd>C-x \<kp-add\></kbd> でも M-x balance-windows が起動できるように site-start.el に設定が書き込まれるようにしています(が説明を書いていませんでした)。 (<kbd>\<kp-add\></kbd> はテンキー上の + キー)

## 以上です

『[Cygwinインストール革命 (Mac/Linuxユーザーに朗報。Windows上で tmux(端末多重化ソフト) や vim が使える環境が3分で構築できます！emacs, git や Xサーバーも追加インストール可能)](https://qiita.com/javacommons/items/879efd486313cac8b381)』に情報を追加するとごちゃごちゃするので、別記事として整理した上で上記情報を別記事の方に組み込みます。
おかげさまで『[Cygwinインストール革命 (…)](https://qiita.com/javacommons/items/879efd486313cac8b381)』が当方の記事の中で一番アクセスの多い記事となっています。ありがとうございます。
GASでJSONを返すAPIを作る


#目的/ゴール
GoogleAppsScriptを利用して、SpreadSheetのデータをJSONで返すAPIを作成する

#背景
Django家計簿アプリの作成にトライ中。
今はGoogleSpreadSheetで家計簿をつけているので、そのデータをDjangoでも利用したいと考えている
そこでSpreadSheetから現状のデータを取り出し、JSONで返してくれるAPIを作成したい。

GoogleAppsScriptで、単に`return [json data]`でいいのかと思ったらだめだった。どうやらContentServiceを利用する必要があるらしい
なんとかAPI-Callに成功したのでとりあえずメモ

# GAS
##script
```js
function doGet(e) {
  // listデータをjsonに変換
  payload = JSON.stringify(get_kakeibo())
  // payloadをreturnするだけではだめ
  // ContentServiceを利用して、responseを作成
  ContentService.createTextOutput()
  var output = ContentService.createTextOutput();
  output.setMimeType(ContentService.MimeType.JSON);
  output.setContent(payload);
  // return response-data
  return output;
}

function get_kakeibo(){
  var id = [SpreadsheetのID]
  var ss = SpreadsheetApp.openById(id)
  var sheet = ss.getSheetByName("シート名")
  var values = sheet.getRange(1, 1, 3, 10).getValues()
  
  var res = {}
  for(var i=0; i<10; i++){
    res[values[2][i]] = values[0][i]
  }
  Logger.log(res)
  return res  
}
```

##設定
公開＞Webアプリケーションとして導入
・CurlやWebアプリでアクセスできるようにするため、アクセスできるユーザは「全員（匿名ユーザも含む）」にする

##curlで叩く
無事、APIを叩けました

```sh
# -Lオプションでリダイレクトに対応させる。jqでJSON表示
UG26:~ user$ curl -L "https://script.google.com/macros/s/AKfycbyszn8odB6D9bkL6H6fQJyA83PO3uske-I34F0bNhPsJeSlAN8/exec?method=get_kakeibo" | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   546    0   546    0     0    392      0 --:--:--  0:00:01 --:--:--   392
100   216    0   216    0     0     93      0 --:--:--  0:00:02 --:--:--   250
{
  "年月": "Now",
  "合計資産": 2198700,
  "資産運用": 864710,
  "SBI【5万+貯金】": 800000,
  "ゆうちょ【40万over】": 521254,
  "財布": 12736,
  "貯金": 86200,
  "収入": 536954,
  "現金支出": 121682,
  "カード払い": 0
}
UG26:~ user$ 
```
herokuコマンドで「error getting commands pid」が発生する場合の対処

# herokuコマンドで「error getting commands pid」が発生する場合の対処

## 環境

- macOS High Sierra 10.13.2
- Homebrew 1.4.1
- heroku 6.14.43

## はじめに

久々にherokuコマンドを実行したら、以下のエラーが発生しました。

```
$ heroku
!    error getting commands pid 18162 SIGSEGV (signal 11)
```

herokuを最新にしてみましたが、解決せず。

## 解決策

結論から言うと、herokuコマンドのPATHを設定すると解決しました。

[herokuのダウンロードページ](https://devcenter.heroku.com/articles/heroku-cli#download-and-install)を見ると

> First, run ``` which heroku ``` to see what binary ``` heroku ``` is pointing to. If it is not ``` /usr/local/bin/heroku ```, you need to either delete the binary it is pointing to, or make ``` /usr/local/bin/ ``` higher up in your ``` PATH ``` environment variable by modifying your ``` ~/.bashrc ``` file or equivalent.

とのことなので、herokuのPATHを見てみると

```
$ which heroku
/usr/local/heroku/bin/heroku
```

``` /usr/local/bin/heroku ``` でないので、
上記のPATHを設定（自分は ``` ~/.zshrc ```）を変更、再読込、コマンドを叩いてみると

```
$ heroku
Loading... ⣾
 ▸    Add apps to this dashboard by favoriting them with heroku apps:favorites:add
See all add-ons with heroku addons
See all apps with heroku apps --all

See other CLI commands with heroku help
```

解決です。

## 参考
- https://help.heroku.com/TL6IX2AD/why-am-i-seeing-error-getting-commands-pid-12345-sigsegv-signal-11-when-using-the-heroku-cli
- https://devcenter.heroku.com/articles/heroku-cli#download-and-install
Homebrewでツールをインストールしようとすると/usr/localに書き込み権限がなくて失敗する問題

自宅でiOSのビルド環境を整えようとCarthageをHomebrew経由でインストールしようとしたら、こんな感じのエラーが。

```
$ brew install carthage
Permission denied @ dir_s_mkdir - /usr/local/Frameworks
```

書き込み権限がないのかな？と思って権限を付与しようと思っても、うまくいかない。

```
sudo chown -R $(whoami) /usr/local/
chown: /usr/local: Operation not permitted
```

詰んだと思いつつ泣きながら探してたら、[こんな記事](https://gist.github.com/irazasyed/7732946)を発見

ふむふむ、英語はよくわからんが/usr/local全体の権限を変更する必要はないんだな。

てことで、以下のコマンドで必要なディレクトリにだけ権限を付与。

```
sudo install -d -o $(whoami) -g admin /usr/local/Frameworks
```

これでinstallは上手くいった。

めでたし。
Djangoカスタムフィルタでクエリ実行結果を受け取ってみた

# やりたいこと
Djangoテンプレート機能のカスタムフィルタで任意のクエリを発行し、その実行結果をテンプレートで表示すること

# 前提条件
- Django 2.0
- python 3.6

# アプリ構成
```
manage.py
polls/
    __init__.py
    models.py
    templatetags/
        __init__.py
        poll_extras.py
templates/
    index.html
```
# 実現方法
```python:manage.py
#!/usr/bin/env python
import os
import django
from django.shortcuts import render_to_response

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sample.settings")
    django.setup()

    # テンプレートに渡すキーを取得
    from polls.models import Child
    childs = Child.objects.raw('SELECT id, name FROM child where id = 1')
    child = childs[0]

    # テンプレートを発行
    app_data = {'child': child}
    print(render_to_response(template_name='/sample/templates/index.html', context=app_data))
```

```python:polls/model.py
from django.db import models

class Child(models.Model):
    class Meta:
        db_table = 'child'
```

```python:polls/templatetags/poll_extras.py
from django import template
from polls.models import Child

register = template.Library()

@register.filter
def fetch_object(sql):

    # childテーブル限定だがここも可変にしたい
    records = Child.objects.raw(sql)
    return records
```
```html:templates/index.html
{% load poll_extras %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<!-- 描画元から渡されキーを元にクエリを作成し、childオブジェクトを取得  -->

{{% with 'select id, name from child where id = '|add:child.id as sql %}
name: {% with sql|fetch_object as objects %}

<!-- childオブジェクトのプロパティを描画  -->
{% for object in objects %}
  {{ object.name}}, id: {{ object.id }}
{% endfor %}

{% endwith %}
{% endwith %}
</body>
</html>
```

```html:発行されたhtml
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
name:Child1, id: 1
</body>
</html>
```
# データ構造

```mysql:childテーブル定義
       Table: child
Create Table: CREATE TABLE `child` (
  `id` varchar(20) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  `parent_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
```

```mysql:childテーブルレコード
+----+--------+-----------+
| id | name   | parent_id |
+----+--------+-----------+
| 1  | Child1 |         1 |
| 2  | Child2 |         1 |
| 3  | Child3 |         1 |
| 4  | Child4 |         2 |
| 5  | Child5 |         2 |
| 6  | Child6 |         2 |
| 7  | Child7 |         3 |
| 8  | Child8 |         3 |
| 9  | Child9 |         3 |
+----+--------+-----------+
```

# ハマったところ
- `QuerySet API`で`raw`を使用する場合は必ずPKを取得しないといけない
- 上記制約から`raw`以外のAPI使用が良い
- デフォルトフィルタの`add`は文字列と数値の足し算はできないため、その場合は空文字を返す
- Django、python自体（入門者なのでエラー発生の切り分けがむずい）

# 参考サイト
- https://qiita.com/kitaro_tn/items/0543704d2c86459a1063
- http://y0m0r.hateblo.jp/entry/20120618/1340025202
- http://tokibito.hatenablog.com/entry/20121003/1349275941
no matching cipher found. と出てSSH接続ができない。

## 今回のお題
表題の通りです。
ターミナルからssh接続ができずに困りました。。。

### きっかけ
PCを再起動した直後から起こりました。
もしかしたらOSのバージョンアップがあったかもしれませんが、
原因は別のところにあるのかもしれません。

### 現象
以下コマンドでssh接続を試みるが、以下の文言が返ってきて接続できない。
`ssh sanapon1020@XXX.XXX.XXX.XX`

```console
Unable to negotiate with XXX.XXX.XXX.XX port 22: no matching cipher found. Their offer: aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se
```
no matching cipher found...？

### 対応
~/.ssh/configを作成し、以下を追記しました。

```~/.ssh/config
Host XXX.XXX.XXX.XX
  Ciphers aes128-cbc
```
Akka実践バイブルをゆっくり読み解く

# 今回のお題
『[Akka実践バイブル](https://www.shoeisha.co.jp/book/detail/9784798153278)』です。
鈍器レベルの重厚さを持つこの本を、タイトルの通りゆっくりと読み解いていきたいと思います。
普段はAkkaどころかScalaすら使わないのでどこまで正確に書けるかわからないけど、
隔週くらいのペースで読み解いていきたいです。
# 今後の予定
第１章　[Akkaの紹介](https://qiita.com/louvre2489/items/a04f22cb33b1a5e24b98)
第２章　[最小のAkkaアプリケーション](https://qiita.com/louvre2489/items/84e7553909b0002e4268)
第３章　[アクターによるテスト駆動開発](https://qiita.com/louvre2489/items/340ac6f5da6c544c1b8d)
第４章　[耐障害性](https://qiita.com/louvre2489/items/aceb4c891cd4f4d51b12)
第５章　[Future](https://qiita.com/louvre2489/items/3b7630405046b8384a01)
第６章　[Akkaによるはじめての分散アプリケーション](https://qiita.com/louvre2489/items/82efa0b92fb26a89124e)
第７章　[設定とロギングとデプロイ](https://qiita.com/louvre2489/items/a299dddc5709af543644)
第８章　[アクターの構造パターン](https://qiita.com/louvre2489/items/d3b1affcb1447b3e8dce)
第９章　[メッセージのルーティング](https://qiita.com/louvre2489/items/2f863fa8579be31fd38a)
第１０章　[メッセージチャネル](https://qiita.com/louvre2489/items/cbafc6f4510777491e82)
第１１章　[有限状態マシンとエージェント](https://qiita.com/louvre2489/items/2c3ddbacef89152ca7ca)
第１２章　ストリーミング
第１３章　システム統合
第１４章　クラスタリング
第１５章　アクターの永続化
第１６章　パフォーマンスTips
第１７章　Akkaのこれから

１７章が終わるのが８ヶ月後！？早くも企画倒れの予感が・・・
挫けずちまちま更新していこう。
Djangoにmatplotlibで円グラフ表示

#目的/ゴール
matplotlibで作成した円グラフを、DjangoのWebページに乗せる
##背景
現在、DjangoとHerokuで家計簿アプリ作成を試みており、円グラフでdashboard的に情報を見せたいと考えている。
しかし、Djangoで棒グラフを書く方法は様々な記事で紹介されているが、円グラフについては情報が少ない。。。

試行錯誤の末、なんとか円グラフをDjangoで表示できたので、メモを残しておく
※一部ソースコードを修正して簡略化いるので、パッケージとかで抜けているところがあるかも。。。


#準備
matplotlibをインストールする
`pip3 install matplotlib`

#Django
## urls.py
画像を表示するインデックスページと、画像のURLを指定

```py3:urls.py
urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^charts/simple.png$', views.simple,name="charts"),
]
```

## views.py
`index`と`simple`を用意

```py3:views.py
# coding:utf-8
from django.http import HttpResponse
from django.shortcuts import render

def index(request):
    return render(request, 'gas/fig.html',output)

def simple(request):
    import django
    from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
    import matplotlib.pyplot as plt 
    # prepare for data 
    datas = [20, 30, 10]
    labels = ['Wine', 'Sake', 'Beer']
    colors = ['yellow', 'red', 'green']
    # create figure
    fig = plt.figure(1,figsize=(4,4))
    ax = fig.add_subplot(111) 
    ax.axis("equal")
    pie = ax.pie(datas, #データ
                 startangle=90, #円グラフ開始軸を指定
                 labels=labels, #ラベル
                 autopct="%1.1f%%",#パーセント表示
                 colors=colors, #色指定
                 counterclock=False, #逆時計回り
                 )
    # Return
    canvas=FigureCanvas(fig)
    response=django.http.HttpResponse(content_type='image/png')
    canvas.print_png(response)
    return response
```

## html
templateを用意。imgタグで`simple`のURLを叩く

```html:index.html
<!doctype html>
<html lang="en">
  <head>
    <title>hello</title>    
  </head>

  <body>
    <img src="/gas/charts/simple2.png" alt="">
  </body>
</html>


```

# 結果
こんな感じ。無事、円グラフ出力成功！
<img width="434" alt="スクリーンショット 2017-12-23 22.13.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/199902/6af64db5-8300-b4c8-cc27-445f35274275.png">

# Link
https://code.i-harness.com/ja/q/294480e
空かどうかを検査するために empty() を使ってはいけない

日頃 CakePHP 関連のリポジトリーに送られてくるプルリクエストを眺めていると、実に多くの方が [empty()](http://php.net/manual/ja/function.empty.php) を安易に使用しているのが目に留まります。[実例](https://github.com/cakephp/cakephp/pull/11564/commits/12dcfdf8010ad4cea89540f7396778b3db153a2b#diff-fd4f22acc893c3e8bf3a34208ae0dd76R40)をご覧ください。

ですが、空かどうかを検査するために `empty()` を使用するのは適切ではありません。代わりに `!` 演算子の使用を推奨します。 `!empty()` の代わりには、何もせずに真偽コンテキストに渡すか `(bool)` による型変換が良いでしょう。これは [CakePHP のコーディング規約](https://book.cakephp.org/3.0/ja/contributing/cakephp-coding-conventions.html#empty-isset)にも書かれています。

`empty()` は検査対象が未定義であっても `E_NOTICE` レベルのエラーを発生させません。これは検査したい変数がひょっとすると未定義かもしれない場合には便利ですが、それ以外の場合には変数名の打ち間違いを見落としてしまう原因になりかねません。

もっとも、開発に IDE を利用している方は、自分がそんなミスをするはずがないと信じているかもしれません。あるいは、テストケースをしっかり書いているから大丈夫と安心している方もいらっしゃるかもしれません。

そういった方々を説得するために、この記事では別の問題にも言及します。下のコードをご覧ください。 CakePHP3 の例ですが、ご存知でない方でも問題を理解できると思います。

```php
/** @var \App\Model\Entity\User $user */
if (empty($user->articles)) {
   ...
}
```

PHP マニュアルの記述を信じるなら、上のコードは以下のコードと同じことです。

```php
/** @var \App\Model\Entity\User $user */
if (!isset($user->articles) || $user->articles == false) {
   ...
}
```

さて、この時 CakePHP の内部ではどんな処理が行われるのでしょうか。

CakePHP3 では Entity のプロパティーは[マジックメソッド](http://php.net/manual/ja/language.oop5.overloading.php#language.oop5.overloading.members)によって実装されています。このため、式 `!isset($user->articles)` は `__isset()` メソッドを呼び出します。この式の結果が偽になると（[アソシエーション](https://book.cakephp.org/3.0/ja/orm/associations.html)があればそうなるでしょう）、次の式 `$user->articles == false` が評価されることになり、今度は `__get()` メソッドが呼び出されます。


Entity の `__isset()` メソッドは内部的に `has()` メソッドを呼び出しており、 `has()` メソッドは内部的に `get()` メソッドを呼び出しますが、この `get()` メソッドというのは `__get()` メソッドが内部的に呼び出すメソッドです。結果として、一度の `empty()` で二度も `get()` メソッドが呼び出されてしまうわけですから、非効率なのがお分かりいただけるだろうと思います。

`empty()` を使わない例と比較してみましょう。

```php
/** @var \App\Model\Entity\User $user */
if (!$user->articles) {
   ...
}
```

こちらは `__get()` メソッドが呼び出されるだけですね。また、 Entity は [ArrayAccess](http://php.net/manual/ja/class.arrayaccess.php) を実装していますが、配列形式のアクセスでも同じことが言えます。 `empty()` は `offsetExists()` と `offsetGet()` を呼び出します。

それにしても、どうして `empty()` が安易に使用されてしまうのでしょう。私が知る限りでは Scrutinizer というコード解析サービスが `empty()` の使用を推奨しているようですが、もしかするとそうした影響があるのでしょうか。

ちなみに Scrutinizer が `empty()` の使用を推奨しているのは、その `empty` という名称が持つ可読性のためだそうです。もしそれだけの理由であればやめた方が良いでしょう。私には、むしろ可読性を落としているようにさえ思えます。

なぜなら `empty($var)` という記述は、ひょっとすると `$var` が未定義になる場合があるかもしれない、という誤った情報を読み手に伝えてしまうからです。スコープ内に `$var` が宣言されていればそんな誤解も早く解けますが、それがテンプレートのような被インクルードファイル中でのことだったらどうでしょう。当然、読み手は、変数が未定義になる場合があるのかもしれない、と疑わなければなりません。

`!$var` という記述になっていれば、最初からそうした疑いを読み手に抱かせないはずです。これこそが可読性なのではないでしょうか。

もし CakePHP 関連のリポジトリーにプルリクエストを送る機会がありましたら、ご自身の行った変更の中に不適切な `empty()` の使用が含まれていないかを事前にご確認ください。また、既存のコードに含まれている不適切な `empty()` の使用を修正するプルリクエストも歓迎します。その際にはどうぞプルリクエストが大きくなりすぎないようにもご配慮くださいませ。
Firebaseすっごーい！（FirebaseによるWebサイトのホスティング）

# 概要
やんごとなき理由がありhttpsのサイトが必要になったので、Firebaseを使ってみることに。
感動的に簡単に出来たのでqiitaに残す。マジ簡単だから使ってみてくれ。

# 準備
以下のものが必要だよ
* Googleのアカウント

なんとこれだけ！すっごーい！

# Firebaseのプロジェクトを作る
以下のサイトでFirebaseのプロジェクトを作る
https://console.firebase.google.com/

# Firebase CLI(firebase-tools)のセットアップ
## CLI(firebase-tools)のインストール
npmパッケージになっている。
以下のコマンドを実行することでインストールできる。

```
npm install -g firebase-tools
```

## firebaseにログイン
以下のコマンドを実行するとブラウザが立ち上がる。認証するとログインが完了する。

```
firebase login
```

# プロジェクトの初期化
以下のコマンドでプロジェクトを初期化できる。

```
firebase init
```

CLIで色々聞かれるけど、今回はプロジェクトは上で作ったFirebaseプロジェクトを選択。
あと「hosting」を選択すればOK。

適当にやってればpublic/index.htmlができるはずだ。
あとは好きに編集してくれ。

# デプロイ
以下のコマンドでデプロイができる。
たーのしー！

```
firebase deploy
```

以下がコンソールに出力される。

```
=== Deploying to 'hogehoge-project'...

i  deploying hosting
i  hosting: preparing public directory for upload...
✔  hosting: 1 files uploaded successfully

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/hogehoge-project/overview
Hosting URL: https://hogehoge-project.firebaseapp.com
```

Hosting URLにアクセスすれば作ったページが見れるよ。

# 料金
料金は以下を参照してくれ。
とくに遊びで使ってたら金なんかかからない。

https://firebase.google.com/pricing/?hl=ja

# つかってみた所感
すっごーい！
![smile.jpg](https://qiita-image-store.s3.amazonaws.com/0/65939/c913e59e-611a-f72d-b45d-43f16460b107.jpeg)
お名前.comのドメインをIDCFクラウドでHTTPS

https通信のできるapiサーバーを立てようと勉強ついでにチャレンジしたら色々とハマったのでまとめとく:santa:

基本的な手順書と参考サイト
・[IDCF クラウド DNS スタートアップガイド](https://www.idcf.jp/help/dns/guide/pdf/dns_guide.pdf)
・[バーチャルホストでHTTPSを手軽に使ったWebサーバー構築](https://www.idcf.jp/help/cloud/guide/advanced013.html)
・[IDCFクラウドのDNS機能を使ってみる](http://blog.watercloud.net/article/431503429.html)

#流れ
[お名前.com](https://www.onamae.com/)でドメインを取得
↓
[idcf](https://www.idcf.jp/)で仮想サーバを立てる
↓
ドメインの所有権をidcfに移す
↓
certbotでssl証明発行
↓
httpd.confの設定を編集

こうやって書くと簡単に感じるんだけど、反映に時間がかかったりしてとりあえず困る事が多かった:frowning2:

#1.お名前.comでドメインを取得
ドメインの取得は普通にしてください

#２．idcfで仮想サーバを立てる
なんとなくできると思います。最安で500円なのでidcf最高
IPアドレスのファイアーウォールの設定などを行っておいてください。
[バーチャルホストでHTTPSを手軽に使ったWebサーバー構築]
(https://www.idcf.jp/help/cloud/guide/advanced013.html)の１章の部分を参考

#３．ドメインの所有権をidcfに渡す
これが厄介だったw
そもそもDNSなんて言葉も初見だったのでとても困惑した
雰囲気で説明して見る:rolling_eyes:
DNSってのは一つのドメイン（example.com）を軸にして、www.example.comやshop.example.comなど他のホストを管理しているサーバーである。
つまり、example.comが以下のように「IPアドレス」と「ホスト＋ドメイン」を管理している。
www.example.com　＝ 〇〇.〇〇.〇〇.〇〇
shop.example.com　＝ 〇〇.〇〇.〇〇.〇〇
もちろん以下のようにホストなしのドメインを設定する事もできる
example.com　＝ 〇〇.〇〇.〇〇.〇〇

では本編に戻る
基本的には[IDCF クラウド DNS スタートアップガイド](https://www.idcf.jp/help/dns/guide/pdf/dns_guide.pdf)に書いてある通りに進める。

まずはゾーンの作成
:hugging: 注意事項 :hugging:
作成するゾーン名はお名前.comで取得したドメイン名と同じにする！

ゾーンを承認（所有権を移す）させなきゃいけないので、お名前.comの設定をいじります。
（※[IDCFクラウドのDNS機能を使ってみる](http://blog.watercloud.net/article/431503429.html)が分かりやすいので確認してみてください）

DNS関連機能の設定から内部ドメイいで、所有権を移動したいドメインを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150607/0089a8bb-68b9-bc02-5ece-216c9ace8e57.png)
<br>
DNSレコード設定を利用するからTXTタイプでvalueがアクセストークンになっているレコードを登録
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150607/bedfa0bc-17ff-dd6c-965b-eafbb69622dc.png)
:hugging: 注意事項 :hugging:
反映されるのに結構時間かかる

これでidcfdのゾーンの承認がされます！
（※アクセストークンのレコード削除なども忘れないように）

お名前.comでネームサーバーの変更を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150607/e38ea2f0-9bd3-22f3-dd91-e6bf309a1b8c.png)

所有権を移したいドメインを選択して変更先を入力
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150607/def912fc-ed5e-9238-0107-f52433a0df03.png)

これでドメインの所有権がidcfになりました！

そして、ゾーンに仮想マシンのグローバルIPアドレスとドメインを紐づけるAタイプのレコードを登録
:hugging: 注意事項 :hugging:
反映されるのに結構時間かかる

#4.certbotでssl証明発行
[バーチャルホストでHTTPSを手軽に使ったWebサーバー構築](https://www.idcf.jp/help/cloud/guide/advanced013.html)の２章をなぞるだけです。

```bash
# CertbotのクライアントとApacheをダウンロード
$ yum -y install epel-release
$ yum -y install certbot python-certbot-apache

#　ドメインにちゃんとIPアドレスが紐づいているのか確認
$ nslookup YourDomain
Server:		ローカルIP
Address:	ローカルIP#53

Non-authoritative answer:
Name:	YourDomain
Address: グローバルIPアドレス
# みたいに出力されたらok

# ssl証明書を発行
$ certbot certonly --standalone --agree-tos -m YourEmailAddress -d YourDomain
```

うまくいかない時は所有権を移したりする際の反映に時間がかかっている可能性があります。

#5.httpd.confの設定を編集
以降は[バーチャルホストでHTTPSを手軽に使ったWebサーバー構築](https://www.idcf.jp/help/cloud/guide/advanced013.html)の３、４章で出来ます。
基本的に反映に時間がかかるので焦らず行きましょう。


<br>
とにもかくにも反映に時間がかかって上手くいっているのかダメなのかわからない事が大変だった。:no_good:
Kubernetes Hard The Wayしてみる

※Kubernetesについての詳細は書きません。


## Kubernetesを辛い方法で作ってみる
そんな思いが込められたこちらのリポジトリ、[kelseyhightower/kubernetes-the-hard-way](https://github.com/kelseyhightower/kubernetes-the-hard-way)をイチからやってみました。
[こちら](https://www.slideshare.net/ktateish/kubernetes-the-hard-way)にもあるとおり、辛い方法でやってもバグがあったりなどして正常に動かないこともあります。（何個かぶちあたりました。）
ちなみにrepositoryでは

> Verify the Google Cloud SDK version is 183.0.0 or higher:

とありますが、[公式ページ](https://cloud.google.com/sdk/docs/quickstart-mac-os-x)を見るとMACOS,その他のOSを見ても180.0.0を配布しているようなので、180.0.0を使っています。


## 前提条件
 - サンプルはGCEを元に話を進めているのでGoogle Cloud Platformのアカウントを作成しておくと良い。
 - Kubernetes用にプロジェクトを作成しておくと良い。リポジトリ上では `kubernetes-the-hard-way` でやっている。
 - プロジェクトに紐づく支払先を作成しておく。
 - SSH鍵ペアを作っておく
https://cloud.google.com/compute/docs/instances/adding-removing-ssh-keys?hl=ja


## 注意事項
 上で書いたとおり、何個かうまくいかなかった点を記載します。(GCEに慣れている人は当たり前だ！となりそうですが）
 - gcloudコマンドでリソースを作成する時はプロジェクト名でなくプロジェクトIDを指定する。 
 (例）　`kubernetes-the-hard-way-XXXXXX`

```
google-cloud-sdk/bin/gcloud config set project kubernetes-the-hard-way
gcloud compute networks create プロジェクト ID --subnet-mode custom
```

 - あらゆるgcloudコマンドでリソースを作成する際に、 `--zone us-west1-c` などのゾーンの指定が不足しているので足す。エラーとなり作成できず。
 - [Issue](https://github.com/kelseyhightower/kubernetes-the-hard-way/issues/275)にもなっていますが、kube-proxy,kubeletが開始できなかったです。このへんは掘り下げて調べる必要がありそう。Issueのやり方でも解決できず。 こちらによって `kubectl get nodes` の値が返ってきません..
 

## 所感
 - 解説は少ないのでリンクを詳細に読む必要がありますが、GKEを使ってぽちぽち作成するより中身がどうなっているかわかるので、やってよかったと思います。
 - 今回はGCEでやっていますが、他のクラウドでも同じように作れるような説明になっています。
 - 今回のこちらの一連の作成自体で大体2,3時間、インスタンスをコントローラー3台、ワーカー3台起動して¥22くらいでした。
NavigationViewのmenuItemの要素を取得する

ナビゲーションドロワーの書くメニュー要素のViewを取得したいとするのだがこれが難しい。

ナビゲーションドロワーに通常使われるNavigationViewだが、特に各要素のViewにアクセスするメソッドは用意されていないようだ。`MenuItem`なら取れるけど。

customViewを設定しているわけでもないので`findViewById`もだめ。


と思っていたら`findViewsWithText`が使えるらしい。

```kotlin
val outViews = ArrayList<View>() |
navigationView.findViewsWithText(outViews, "メニュー1", View.FIND_VIEWS_WITH_TEXT)
```

空の配列を渡しておけばそのテキストを持つViewを配列に入れておいてくれる。
NDB Clusterをディスクベースで使おう

NDB Clusterは勘違いされやすいですが
SSDにデータを保存できたり(性能は1/10)、
Memcache APIを使ってmemcachedでアクセスできたりします。

で今回は前者を行います。
実はディスクベースなNDB Clusterは10年仕様が変わってません。
そのためこちらの方の資料をなぞる形になります。
http://d.hatena.ne.jp/shibainu55/20081123/1225206847

性能が1/10としたのはHP社の資料からになります。
https://h50146.www5.hpe.com/services/ci/opensource/pdfs/HP_OpenServices.pdf
NVDIMMや3D XPoint(Optane SSD)がその性能を発揮すれば性能差は狭まるかもしれません。

SQLノードから実施します。

```
mysql> create logfile group lg_1 add undofile 'undo_1.dat' engine ndb;
Query OK, 0 rows affected (1.98 sec)
mysql> create tablespace ts_1 add datafile 'data_1.dat' \
    -> use logfile group lg_1 engine ndb;
Query OK, 0 rows affected (1.93 sec)
後はcreate tableで
tablespace ts_1 storage disk ENGINE = ndbcluster;
と最後につけるだけになります。
```

保存先はデータノードのデータディレクトリ配下のディレクトリになります。

```
$cd /var/lib/mysql-cluster
ノード1
$ sudo ls ndb_4_fs
D1  D10  D11  D2  D8  D9  data_1.dat  LCP  undo_1.dat
ノード2
$ sudo ls ndb_5_fs
D1  D10  D11  D2  D8  D9  data_1.dat  LCP  undo_1.dat
標準では128MBのファイルが作成されるようです。
$ sudo ls -l ndb_4_fs
total 262236
drwxr-x--- 4 root root      4096 Dec 23 08:52 D1
drwxr-x--- 3 root root      4096 Dec 23 08:52 D10
drwxr-x--- 3 root root      4096 Dec 23 08:52 D11
drwxr-x--- 4 root root      4096 Dec 23 08:52 D2
drwxr-x--- 3 root root      4096 Dec 23 08:52 D8
drwxr-x--- 3 root root      4096 Dec 23 08:52 D9
-rw-r--r-- 1 root root 134283264 Dec 23 09:10 data_1.dat
drwxr-x--- 3 root root      4096 Dec 23 08:52 LCP
-rw-r--r-- 1 root root 134217728 Dec 23 09:05 undo_1.dat
```

memcache pluginをディスクベースで使えるようにします。
/usr/share/mysql/memcache-api/ndb_memcache_metadata.sqlを編集します。
sed -i -e "s/ENGINE/tablespace ts_1 storage disk ENGINE"
SQLノードから流し込みます。
cat /usr/share/mysql/memcache-api/ndb_memcache_metadata.sql | mysql -uroot -p
後はmemache pluginを起動させるだけです。

検証した感じでは全データノードが再起動すると
ディスクベースでも素のMySQL程簡単には使えないようではありました。
きちんと学んで挙動を説明できるようにしたいものです。
ディスクベースのmemcacheでも簡単に構築できますので
興味がある人は触って見て下さい。
AWS Glueが東京リージョンに来たのでScalaを動かしてみた



## はじめに

現在オシゴトでSparkを導入しようとしていたので、今更感がありつつも入門記事を書こうと思っていたのですが、マネージドサービスのAWS Glueが[東京リージョンに来た](https://aws.amazon.com/jp/about-aws/whats-new/2017/12/aws-glue-is-now-available-in-the-asia-pacific-tokyo-aws-region/)のでその話を書くことにしました。


## やったこと

現時点でGlueはPythonのみサポートのようですが、ScalaやJavaもPy4J経由で呼び出せるようなので動かしてみました。

### Scalaコード

とりあえず動くことを確認したかったので、S3から読み取ったCSVをそのまま吐き出すだけです。
面白くないです。
AssemblyでFatJarに固めた後、S3にアップロードしておきます。

注意点として、Python側で生成したSparkContext内のjvmに対して呼び出しを行うため、Scala側では`SparkContext`の生成は行いません。

```scala
import org.apache.spark.sql._
import org.apache.spark.sql.catalyst.ScalaReflection
import org.apache.spark.sql.types.StructType

case class TestCSV(
  id: Int,
  name: String
)

object GlueScala {
  def main() {
    val spark = SparkSession.builder().getOrCreate()

    val ds: Dataset[TestCSV] = {
      import spark.implicits._
      val schema = ScalaReflection.schemaFor[TestCSV].dataType.asInstanceOf[StructType]
      spark.read
        .schema(schema)
        .option("header", true)
        .csv("s3n://path/to/input.csv").as[TestCSV]
    }

    ds.write.csv("s3n://path/to/output")
  }
}
```

CSVファイルはこんな感じ。

```
id,name
1,a
2,b
3,c
...
```

### GlueのETL Jobを作成する

Glueの画面から、ETL -> Jobsと進み、Add Jobを押した後のメニューで`A new script to be authored by you`を選びました。

#### 権限

以下の権限を持つIAMロールも作成/設定する必要があります。

- Glueの実行権限
- 処理対象データや、Pythonコード、Scalaで作成したJarファイルを置くS3バケットへの参照権限
- 処理結果を吐き出すためのS3書き込み権限

#### Jarの場所を設定

Scalaで作成したJarファイルへのパスを通してあげましょう。
`Script libraries and job parameters (optional)`エリア内の`Dependent jars path`の欄にS3のパスを設定します。
このエリアで並列度の設定などもできるようですが今回はデフォルトのままです。

### Pythonコードを書く

上記のAdd Jobの設定後出てくるConnectionの画面でOKを押すと、Pythonコードを書くためのエディタが出てきます。

Pythonでは、SparkContextの作成とScalaのメソッドを呼び出す部分だけを記述しました。

S3へアクセスするためキーを設定している個所については、IAMロールの権限を引き継げそうな気もしますが書かないと動かなかったのでとりあえず書いてしまいました。
今後試行錯誤してみます。

```python
import sys
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from py4j.java_gateway import java_import
 
## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
 
sc = SparkContext()
sc._jsc.hadoopConfiguration().set("fs.s3n.awsAccessKeyId", "XXXXXXXXXXXXXX")
sc._jsc.hadoopConfiguration().set("fs.s3n.awsSecretAccessKey", "XXXXXXXXXXXXXX")
sc._jsc.hadoopConfiguration().set("fs.s3n.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem")

java_import(sc._jvm, "GlueScala")
sc._jvm.GlueScala.main()
```

なお、上記の権限で言及しているとおり、ここで作成したPythonコードはS3上に置かれます。

### 動かす

あとはPythonエディタの画面の `Run job` を押すだけです。
もちろんJob一覧から選択して`Run job` を押してもよいです。 
Scalaの `ds.write.csv` で指定したS3パスにCSVファイルが吐かれることでしょう。

## さいごに

というわけでGlue上でScalaコードを動かす事ができました。
実用性については試行錯誤や検証が必要かと思いますが、EMRクラスタを立てなくても動かせる気軽さがうれしいですね。
年末も近いことだしお金のことも考えてみよう。


社内でふとした時に投資してる？って会話をした。投資って意外とよく分からんって話が多かったので複利の計算表をGoogle Docsで作成し
毎月の積立と数年後の結果を出してみよう。

FV:将来価値(Future Value), PV:現在価値(Present Value), r: 表面金利, n: 経過年数, k: 年間利息発生回数

$ FV = PV  \times  (1+ {r \over k})^{nk}  $

利回り5％、元本10万、利息は年に1回として計算すると5年後の価格は、

$ 127,628 = 100,000  \times  (1+ {0.05 \over 1})^{5}  $

Google Docsで上記計算式を再現する。
![Compound_interest01.png](https://qiita-image-store.s3.amazonaws.com/0/46374/6763bf80-9008-8cb4-542e-51cbaa2ea12f.png "Compound_interest01.png")

```
=B1*POW(1+B2/100),B3)
```

とはいえ、毎月積み立てたらいくらなんだ？を計算してみる。
$ 130,542 = 130,000  \times  (1+ {0.05 \over 12}) $

```D6
=C6*POW(1+(($B$2/100)/12),1)
```

```D7
=(C7+(D6-C6))*POW(1+(($B$2/100)/12),1)
```

![Compound_interest02.png](https://qiita-image-store.s3.amazonaws.com/0/46374/f4032dbe-e23b-5a61-354a-085b08f3ed97.png "Compound_interest02.png")

'
'
![Compound_interest03.png](https://qiita-image-store.s3.amazonaws.com/0/46374/174d8363-d876-968e-5673-e8354373edf2.png "Compound_interest03.png")
（桁丸めもしているため、計算方法によって数値が異なる可能性があります。目安としてみて頂ければ。。）

桁がひとつ上がると威力が分かる。
元本をどれだけ早く積み上げ、年月を見方につけて回すかで結果がかなり変わってくる。
機械的に積み立て、年に一度程度リバランスするくらいが良いのではと個人的には思う。

さて、利回り5%以上平均出してくれるのはインデックスファンドですかね。。。

仕事をしっかりする方が時間辺り利回り断然良いですが、その後の資産も複利効果をうまく出していきたいものです。
OSXでwebrtcのnative buildが失敗した。

# 概要

webrtcのnative buildをmacで実施してたら失敗した

<img width="573" alt="スクリーンショット 2017-12-23 21.26.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/6246/f3e75723-18d2-9133-e03c-6f3698ae1f2e.png">

こんなことになった。

# sdkのパスがうまく見えてないとかかな。

```
$ sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
```

これを実行したらちゃんと動作するようになった。

ちゃんちゃん。
PeerCast プログラミング配信 Advent Calendar 2017 23日目

今年の春くらいに、妄想していた人工配信者計画と今日したことを書きます。

# 人工配信者計画とは
限界集落PeerCastの過疎化を人工配信者によって止める計画。
人工配信者とは、人間の配信者ではなく、ソフトウェアが配信を行う。（似たようなのがあるような気がするのは気のせい）

なんらかの方法で映像を生成し、それを配信する。
リポジトリはhttps://github.com/DoG-peer/jinkou_haishinsya

## 春にしていたこと
DCGANを試そうと実装していた。（実装したけど使っていない件）

配信の録画とかをDCGANとかに食わせて画像生成しようかなーと思っていた。実装はできた。が、満足した。しばらく放置。

# 最近していること
開発用Dockerファイルを書いていた。

* 動画が扱える
* 古典的な手法（opencvにあるようなもの）が使えるようにする
* メインの機械学習はTensorFlow
* Dockerイメージ内にvimを入れてそこで開発（補完の都合）

# 今日したこと（昼間に）
## 開発環境の修正
tmuxを捨て単純にzshを起動させるようにした。なんか挙動がおかしかった。`SHELL=/bin/zsh`しないといけなかったりした。

## VAEについて調べる
https://qiita.com/kenmatsu4/items/b029d697e9995d93aa24#%E5%8F%82%E8%80%83
DCGANとVAEどっちが強いのか分かっていないのだけど、VAEの方が扱いやすそうなので、調べたかった。

## VAEを実装しようとする
上記記事を見て実装。deepmindのtensorflowラッパーライブラリsonnetを使ってみたかったので使ってみる。ただし、途中で眠くなったので、そこで配信終了。