OmniAICreator/Qiita-1.07M huggingface dataset:
エンジニアとしての問題解決思考

みなさん、普段エンジニアとしてどんな仕事をしていますか？
新規開発？保守運用？色々あると思います。

さて、どんな仕事をしていても開発要望や、開発依頼などがお客様、または企画・開発からやってくると思います。
例えば、「管理画面にxxでも検索出来る機能を作って欲しい」とか。

このような依頼にどう対処しているでしょうか。

- A. すぐに要望に答えて作る
- B. 今の仕事を終わらせてから作る
- C. 開発リーダーと調整して、都合の良い時に作る
- D. なぜそれが欲しくなったのかを聞く

依頼側からすると、A~Dの順で「仕事が早くて良い人だ」という評価をするでしょう。

### 果たしてその問題とは何か？

我々エンジニアの存在意義は、欲しいものを作る事が仕事ではありません。
(と、私は考えてます)

あらゆる問題を「技術」という道具を使って解決する人間です。

まずは、依頼や要望が来たときに、それが「なぜ問題か」を考える必要があります。
問題が分かると、その中から順に課題が出てきて、そこで初めてその課題をどう対処するか決まります。
場合によっては「対応しない」という選択肢が出てきてもOKです。

## 問題とは何か

勘違いしがちなのは、今回のように「管理画面でxxで検索出来る機能がない」事が問題で、
その反対の「管理画面でxxで検索出来る機能を作る」が解決策だ。
というパターンです。

表面化・顕在化した事象を問題と勘違いし、その裏返しを解決策として対応していれば永遠とツギハギのシステムを作っていくことになったり、本質からずれたシステムになりがちです。

つまり、「今xxが出来ない」事は問題ではありません。

### 本当の問題は

では本当の問題は何か。
端的に、目指したい姿と、現実とのギャップです。

仮にですが、今回出てきた依頼が「管理画面で1000円以上の商品を検索出来る機能を作りたい」だったとします。

じゃあ、依頼主の理想とする姿を聞いてみましょう。

すると、実は「特定のジャンルでは、【価格＝信頼】になっているという仮説があり、高い商品だけを検索出来るようにして、売上が上がればその仮説の検証の1つになるのではないかと考えていた」という話が出て来るかもしれません。

そうなってくると、話は変わってきます。

#### この場合の理想の状況

```
特定のジャンルで【価格】=【信頼】考えがあり、高価格商品が売上に繋がっているという仮説を検証し易い状況を作りたい。
```

#### 現状

- 商品はカテゴリ・検索ワードでしか検索出来ない
- 並び順は関連度順に並んでいる

### 見えてきた本当の問題

この場合の問題は、「特定ジャンルでは価格が高い商品が売れるという仮説を検証したいが、現状だとユーザが検索し辛い状況にあり、検証もし辛い状況にある」という理想と現実とのギャップに問題があります。

## 対応すべきこと

そうすると、最初の「1000円以上で検索出来るようにする」というのは手段の1つでしかありません。

他にもこの問題に対応する術はいくらでもあります

- 並び順に価格でソートする機能を付ける
- 特定のジャンルだけは予め最初から高単価順に並べて表示する
- 高単価の商品に何かしらのマークを付けて目立たせる
- etc...

また、そもそも現時点では出てませんが、本当の問題を考えると、「この仮説を検証するための、ジャンル毎の価格別の販売数が見れない。」
という課題も出てくる可能性もあります。

## エンジニアが取り組むべきこと

このように、お客様や企画・営業から日々依頼や要望がある中で、本当に必要な事に時間を使う為には、「目指したい姿は何か」という部分を聞き出して、そこから本当の問題を洗い出し、対応していく事で、無駄なく本当に解決すべき問題を解決していけるエンジニアになっていけると思います。

最初に上げたように、依頼が上がった段階で「簡単そうだから」という理由等からすぐに対応している場合、依頼主からの評価は上がるかもしれません。

でも、それでは本来の問題解決にはなっていない可能性が大いにあります。

より、依頼主と一緒に、本当の問題に取り組んで行けるエンジニアこそ本来評価されていくべきだと自分は考えています。
FOSS4G系GIS企業一覧

よくチェックしてるとことか、いちいち思い出すのが面倒なので、一覧にまとめてみました。  
ESRIとか言い出したらきりがないので、FOSS4G或いはオープンソース系中心です。  
個人的にチェック先は海外中心なので、国内で有名どころの漏れがあったらすみません。

## 海外

* [MapBox](https://www.mapbox.com/) - [turf.js](http://turfjs.org/)とかむっちゃ使ってます。
* [CARTO](https://carto.com/) - 超いいモバイルSDK作ってた[Nutiteq](https://github.com/nutiteq)が買収され、現在CARTO Mobile SDKとしてベーシックだと無料になりました。やった！
* [MAPZEN](https://mapzen.com/) - TangramもモバイルSDKよさげなので使ってみたい。
* [Klokan Technologies](https://www.klokantech.com/) - 世間一般には[MapTiler](http://www.maptiler.com/)の方が有名そうだが個人的には[Georeferencer](http://www.georeferencer.com/)の会社。
* [Mousebird consulting](http://mousebird.github.io/mousebird/) - 高性能なモバイル3D地球儀SDK、[WhirlyGlobe - Maply](http://mousebird.github.io/WhirlyGlobe/)の開発元。





...まだ書きかけです

## 国内




...まだ書きかけです
tmuxでログをのこしたい

`pipe-pane`を使って幸せになりましょう。

```
tmux new \; pipe-pane "cat >> $PWD/log.txt"
```

ただし、これはセッションまるごと保存しようとするものであり、
必ずしもログとして嬉しくないかもしれません。

```
user@vultr:~/foo$ tmux new "foreman start; bash" \; pipe-pane "cat >> $PWD/log.txt"
# セッションを手動で止める
user@vultr:~/foo$ cat log.txt
23:16:54 web.1  | started with pid 11223
23:16:55 web.1  | [2017-08-29 23:16:55] INFO  WEBrick 1.3.1
23:16:55 web.1  | [2017-08-29 23:16:55] INFO  ruby 2.4.0 (2016-12-24) [x86_64-linux]
23:16:55 web.1  | == Sinatra (v2.0.0) has taken the stage on 5000 for development with backup from WEBrick
23:16:55 web.1  | [2017-08-29 23:16:55] INFO  WEBrick::HTTPServer#start: pid=11223 port=5000
^C(← いらない)23:17:08 system | SIGINT received, starting shutdown
23:17:08 web.1  | == Sinatra has ended his set (crowd applauds)
23:17:08 web.1  | [2017-08-29 23:17:08] INFO  going to shutdown ...
23:17:08 web.1  | [2017-08-29 23:17:08] INFO  WEBrick::HTTPServer#start done.
23:17:08 system | sending SIGTERM to all processes
23:17:08 web.1  | exited with code 0
user@vultr:~/foo$ exit ← いらない
```

<!--
ですから、

```
foreman start > >(tee -a out.txt) 2> >(tee -a err.txt >&2)
foreman start 2>&1 | tee -a log
```
-->
Node-RED - CSVファイルを読み込む

Node-REDでCSVファイルを読み込む方法です。

#1. csv−to−jsonノードを追加します
- [node-red-contrib-csvtojson](https://flows.nodered.org/node/node-red-contrib-csvtojson)を参照し、`npm install node-red-contrib-csvtojson`　でcsv-to-jsonノードを追加します

#2. 下記のフローでCSVファイルを読み込みます

```
[{"id":"b4537ba5.4f1cb","type":"csv to json ext","z":"21ecb3a8.211334","name":"","version":"0.1","source":"filename","delimiter":",","quote":"\"","escape":"\"","ignoreEmpty":false,"checkType":false,"trim":false,"noheader":false,"includeColumns":"","headers":"","debug":false,"x":430,"y":180,"wires":[["8fc381a8.d96db"]]},{"id":"f1cbf651.2bb4b8","type":"inject","z":"21ecb3a8.211334","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":120,"y":180,"wires":[["c6dc854f.84919"]]},{"id":"c6dc854f.84919","type":"template","z":"21ecb3a8.211334","name":"","field":"filename","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"test.csv","output":"str","x":270,"y":180,"wires":[["b4537ba5.4f1cb"]]},{"id":"8fc381a8.d96db","type":"debug","z":"21ecb3a8.211334","name":"","active":true,"console":"false","complete":"false","x":610,"y":180,"wires":[]}]

```
<img width="1056" alt="スクリーンショット 2017-08-30 8.04.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/393a29e2-b4c3-0338-b43c-846f985725fc.png">
Filemaker 「サーバー上のスクリプト実行」でレイアウトが切り替わらない

#環境
クライアント側：Filemaker pro 16（社内全員）
サーバー側：Filemaker server 15

#事象
「サーバー上のスクリプト実行」ステップを実行し、
サブスクリプトを動かした時に、レイアウトが切り替わらない事象がおきました。

サブスクリプトを途中で止めて結果を確認してみると、
どうやらサブスクリプトの中の、「新規ウインドウ」ステップの処理の中で、レイアウトを指定しても、
きちんと動いていないことが分かりました。

#原因
原因は、サーバー側がバージョン15だったことです。
バージョン15だったら動かないステップを無意識に使っていました。

```
新規ウインドウ[スタイル::ダイアログ; 名前:"sample"; 使用するレイアウト:"サンプル"]
```

なので、今回のようなケースでは、レイアウト切り替えのステップを別に追加する必要があります。

```
新規ウインドウ[スタイル::ダイアログ; 名前:"sample"; 使用するレイアウト:<現在のレイアウト>]
レイアウト切り替え[「サンプル」(テーブル名);アニメーション:なし]
```

サーバーで実行する時は、Filemakerの１クライアントとして動きます。
バージョンを意識して開発するという初歩的なことでした。
ROSBAGから、SLAMのTFの結果をcsvにまとめる。

##目的
ROSのTFからSLAM(gmapping/cartographerなど)の自己位置推定結果を受信する。
[ROSのTFからSLAMの結果を受信する](http://qiita.com/nnn112358/items/8eb3d045e3f1e4cc0b5b)よりも良い方法があったため、ここに記載する。

##実装
rostopicコマンドを使う

```
$ rostopic echo /tf -p -b 2017-08-30-00-00-00.bag > tf_`date "+%Y%m%d_%H%M%S"`.csv
```


引数
-p matlab/octaveライクなplotting formatで出力する
-b bag fileを指定する。

http://wiki.ros.org/rostopic

結果：

tf_20170830_000000.csvのような、テキストファイルが出力される。

```
time,field.transforms0.header.seq,field.transforms0.header.stamp,field.transforms0.header.frame_id,field.transforms0.child_frame_id,field.transforms0.transform.translation.x,field.transforms0.transform.translation.y,field.transforms0.transform.translation.z,field.transforms0.transform.rotation.x,field.transforms0.transform.rotation.y,field.transforms0.transform.rotation.z,field.transforms0.transform.rotation.w
1503488850592379207,0,1503488850590262955,odom,base_footprint,0.0,-0.0,0.0,0.0,0.0,-0.0,1.0
1503488850615588518,0,1503488850615016206,base_link,base_scan,-0.25,0.0,1.53,-0.0906412823601,0.158088607453,0.489071347702,0.852995525769
1503488850624114299,0,1503488850623585564,odom,base_footprint,0.0,-0.0,0.0,0.0,0.0,-0.0,1.0
1503488850636991246,0,1503488850736799565,base_footprint,base_link,0.0,0.0,0.1,0.0,0.0,0.0,1.0
```

LibreOffice/Excelなどで
field.transforms0.header.frame_idと
field.transforms0.child_frame_idで
抽出したいtfをフィルタリングし、
field.transforms0.transform.translation.x、
field.transforms0.transform.translation.y
で散布図を描くとSLAMの結果が可視化できる。
他言語プログラマがGo言語を読むための豆


急にGoで書かれたソースコードを読む必要があったので、最低限これくらいは把握しておくと、雰囲気はつかめるかな、ということをまとめました。あくまで読むだけです。書くにはいろいろ足りません。

気になったら詳細な解説はそれぞれ調べてください。


## 関数の書式

以下はMyStructという自分で作った構造体のメソッドを定義する例です。

```go
func (s *MyStruct) addAndGetValue(input int) int {
    s.value += input
    return s.value
}
```

引数int、戻り値int、構造体のポインタ指定など、こんな感じになります。


## defer

deferは予約語です。

```go
func someFunction() {
    defer fmt.Println("グラディウス")
    …
}
```

このように書いておくと関数の最後にdeferで指定した文を最後に実行することができます。
ロックの開放とかですかね。

## スライスとmake
データ構造がわかれば、そのプログラムはわかったも同然ですよね（いいすぎ）。
スライスは可変長配列です。makeは初期化に使います。まあnewみたいなもの。newもあります。

```go
hoge := make([]int, 100)
```

## mapとmapのループ
mapも組み込まれています。
rangeですべての要素に対してループできます。

```go
var m map[string]int
sum := 0
for _, value := range m { 
    sum += value
}
```

変数宣言はvarだったり、:=だったり。
"_"はブランクを表します。keyを使わない場合はこれを使います。
Goは使わない変数宣言やimportが許されません。


## GOPATH
環境変数です。
importの基準となるディレクトリです。CLASSPATH的な。
importされているモジュールを参照したいときは$GOPATH/srcあたりを探すと見つかるかもしれません。


## 参考
http://golang.jp/effective_go
http://qiita.com/mizukmb/items/b543f88bc37c9a75673f
Chainerについて

１．Chainer(PFN: Preffered Network)とは
　・機械学習のフレームワーク

２．特徴
　・実行時間が比較的短い
　　ImageNetの分類問題を指標とした比較において最も短い．(Chainerの公式ブログより)
　　（Tensorflow：24.3h，CNTK：9.1h，NXNet：7.7h，Chainer：4.4h）
　　＊あくまで１つの指標
　・NVDIAと技術提携，インテルと協業
　　CPU及びGPUの最大手と協力することが発表されている．
　・日本語の解説が豊富で開発しやすい
　　開発元のPFNのHPは日本語で書かれている．

３．導入手順
　1.VirtualBoxでubuntu(64bit)入れる　
　　Ubuntu 14.04 LTS
　2.次を端末に入力(Chainerとpythonのインストール)
　　sudo apt-get install python-pip
　　sudo pip install --upgrade pip
　　sudo pip install chainer==1.24.0
　　sudo apt-get install python-matplotlib

４．サンプルコード実行
　端末で次を入力して確認した．
　　$python train_mnist_cnn.py
　⇒特に問題なし．想定通りの結果を出力した．

５．所感
　ビギナーに扱いやすい条件が多い．

参考：Interface８月号

メモ：DeepLearningの青い本読みたい...
zsh 5.2以降のオプション GLOB_STAR_SHORT（**.cで**/*.cと同じ展開をさせる）

`**/*`が`**`になるので、ちょっとだけタイプが楽になる。

```~/.zshrc
autoload -Uz is-at-least
is-at-least 5.2 && setopt glob_star_short  # **.c で **/*.c と同じ展開をする
```

`***`だと`***/*`と同じで、シンボリックリンクをたどるようになるらしい。

```
       GLOB_STAR_SHORT
              When this option is set and the default zsh-style globbing is in effect, the pattern `**/*' can be abbreviated to `**'  and  the
              pattern  `***/*'  can  be  abbreviated to ***.  Hence `**.c' finds a file ending in .c in any subdirectory, and `***.c' does the
              same while also following symbolic links.  A / immediately after the `**' or `***' forces the pattern to be treated as the unab‐
              breviated form.

```
プログラミング初心者&Unity初心者にオススメの書籍


#はじめに
今からUnityで簡単なアプリを作りたいプログラミング初心者にオススメ書籍を紹介したい。
とりあえず見栄えは悪くてもアプリとして動けばよいという人のための最短コース。

3Dとか絶対無理なので当然2D限定の話。3Dをやりたい人にはごめんなさい。

私が実際に読んでみて「買ってよかったー」と思った本を紹介している。
自分が読んだ本しか紹介できないので、実はもっと名著があったらごめんなさい。


#前提条件
C#は分からなくていいので、CとかC++が最低限分かる人。
最低限というのはif文かけます、関数呼べます、みたいな感じ？(クラスが書ければ問題ないと思う）
適当な入門書1冊読んだことある人なら大丈夫のはず。（自分はそういうレベルなので）


#オススメ書籍

###Unity5 3D/2Dゲーム開発実践入門　作りながら覚えるスマートフォンゲーム開発 
吉谷 幹人 
固定リンク: https://www.amazon.co.jp/dp/4883379671/

(絶対読む) 序章　Unityの特徴と概要
(絶対読む) 1章　Unityでゲーム開発を行う前の準備
(絶対読む) 2章　Unity はじめの一歩－Unityの画面構成や基本操作を覚える
(読まない) 3章　ゲーム作成の基本－物理エンジンとコリジョンをマスターする
(読まない) 4章　ゲームオブジェクトの制御－プレファブとエフェクトを極める
(読まない) 5章　本格的な3Dゲームを作成－キャラクターとGUIをコントロールする
(絶対読む) 6章　本格的な2Dゲームを作成－スプライトと2D物理エンジンを使いこなす
(絶対読む) 7章　ゲームのリリース準備をして、ストアに登録する
(絶対読む) 付録　Unityをさらに使いこなすために

まず買うべき書籍。初めてUnityを触る人でも「Flappy bird」のパクリが作れる。
言われるがままに作るだけで出来上がる達成感が素晴らしいし、一通りの流れが分かるのが何よりも大きい。

2Dの部分だけ読む。3Dのところは読まなくていい。（私は1年経っても読んでない）

###見てわかるUnity5 C#超入門 (Game Developer Books) 
掌田 津耶乃 
固定リンク: https://www.amazon.co.jp/dp/4798044962/

次にこの書籍なのだが、これは買わなくてもいい。
サンプル作ったけど、やっぱりC#よく分からない、UnityのScriptよく分からないって人は買ってもいいかもしれない。
自分の場合、スクリプトの作り方がよく分からなかったので、この本を買って流し読みしてイメージをつかんだ。

この本をオススメできない理由は、本の内容に問題があるのではなく、
オススメできるかどうか判別できるレベルまで中身を読んでいないから。

Scriptの描き方を覚えた後は、さっさとUnityのマニュアルを読んで動かしていったので、皆さんもそうすればよいと思う。

1冊目でスクリプトの作り方がわかった人や、C#を既に理解できた人はスキップしてＯＫ

###uGUIではじめるUnity UIデザインの教科書 
岩井 雅幸 
固定リンク: https://www.amazon.co.jp/dp/B014IIXL1Y/

これは絶対に買ったほうがいい。ただし最初に買うべきではないと思う。

まずしょぼいアプリを作ってみる。

その後「なんか俺のアプリって・・・見栄え悪いな」と思うときがくる。

そのときに買うべし。

よくあるソシャゲーメニュー（一番下にメニューある奴）の作り方などが書かれていて、絶対真似したくなる内容が書かれている。
周囲に勉強させてもらえるプログラマーのいない趣味プログラマーにとっては、紛れも無い名著。絶対買うべし。

###UnityゲームUI実践ガイド　開発者が知っておきたいGUI構築の新スタンダード 
池和田 有輔 
固定リンク: http://amzn.asia/abrGjAF

実はこっちも名著らしい。

でも、読んだことが無いので分からない・・・。

###リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice) 
Dustin Boswell (著), Trevor Foucher (著), 須藤 功平 (解説), 角 征典  (翻訳)
固定リンク: http://amzn.asia/alkkgly

(注意)Unityで1つ2つ小さなアプリを完成させた人が読むべき。アプリを作る前に読まなくて良い
最短距離でUnityまで突っ走ってきたプログラミング初心者のコードはグチャグチャで自分でも難解だと思う。そういう人がコードの可読性をあげるためには、リーダブルコードで何が必要なのか概念を学んでみることが大切だと思う。
いきなり座学ばかりでつまらないと思うし、コードを書いて自分の問題点を意識できない人が本書を読んでも身につかない。あくまで自分のコーディングに問題を感じたら読むべき本。

###ゲームプログラマのためのコーディング技術
大圖 衛玄 (著)
固定リンク: http://amzn.asia/biY7xXW

(注意)先に必ずリーダブルコードを読むこと
リーダブルコードで説明された概念をゲームプログラミングに絞って説明してくれている本。プログラミング＆Unity初心者に最適な本。リーダブルコードで概念を学び、本書で具体例を学び、実際にコードを書く、という流れがオススメ。

http://amzn.asia/biY7xXW


#経験談
ちなみに2冊目までの情報で見栄えの悪いアプリを作ったが、それが半年で5万ダウンロードぐらいまでいった。
最初は中身がしょぼかったので★１が多かったが、中身を作り上げていったところ評価も★５が多発してダウンロードが伸びた。
ちなみに中身を作り上げたというのは見栄えをよくしたという話ではない。
見栄えが悪くても、中身がしっかりしていれば（＝ユーザーの需要をつかんでいれば）、しっかり使ってもらえるので見栄えは気にしなくてよい。
見栄え自体の優先順位は低い。とにかく形を作ろう。

#最後に
また気が向いたら更新したい。
周囲に聞ける人がいない者同士、お互いがんばりましょう。
Swiftで参照型の値から生ポインタを作る方法

Swiftで参照型の値から生ポインタを作る方法や、関連トピックについて説明します。

バージョン

```
Apple Swift version 4.0 (swiftlang-900.0.54.11 clang-900.0.31)
Target: x86_64-apple-macosx10.9
```

# Unmanagedを使う

Swiftには `Unmanaged<T>` という型があります([リファレンス](https://developer.apple.com/documentation/swift/unmanaged))。

ここでいう `manage` はメモリ管理のことです。Swiftのメモリ管理は参照カウンタによって実現されていますが、この参照カウンタの操作はコンパイラが自動的に生成しており、プログラマが明示的に行うことはありません。`Unmanaged<T>` は参照型の値をこの管理下から外すためのハンドラであり、参照型の値 `T` に対して、明示的な参照カウンタ操作を呼び出せます。例えば、以下のコードは `Cat` のインスタンスに対して `retain` と `release` を呼び出すものです。

```swift
let cat: Cat = Cat()
let unmanagedCat: Unmanaged<Cat> = Unmanaged<Cat>.passUnretained(cat)
unmanagedCat.retain()
unmanagedCat.release()
```

`Unmanaged` には `UnsafeMutableRawPointer` を返すメソッド `toOpaque()` があるので、これを使って生ポインタが得られます。以下に例を示します。

```swift
let cat: Cat = Cat()
let unmanagedCat: Unmanaged<Cat> = Unmanaged<Cat>.passUnretained(cat)
let rawCat: UnsafeMutableRawPointer = unmanagedCat.toOpaque()
```

`Unmanaged` はこのように、参照型と生ポインタの両方と相互に変換できます。また、参照型の変換の際は、変換と同時に参照カウンタの増減を行うかどうかのバリエーションがあります。そのため、全部で6通りの変換があります。

- 参照型からUnmanagedへ変換、カウンタを+1する: `static func passRetained(_ value: Instance) -> Unmanaged<Instance>`
- 参照型からUnmanagedへ変換、カウンタはそのまま: `static func passUnretained(_ value: Instance) -> Unmanaged<Instance>`
- Unmanagedから参照型へ変換、カウンタを-1する: `func takeRetainedValue() -> Instance`
- Unmanagedから参照型へ変換、カウンタはそのまま: `func takeUnretainedValue() -> Instance`
- Unmanagedから生ポインタへ変換: `func toOpaque() -> UnsafeMutableRawPointer`
- 生ポインタからUnmanagedへ変換: `static func fromOpaque(_ value: UnsafeRawPointer) -> Unmanaged<Instance>`

# unsafeBitCastを使う

参照型の値は内部的にはポインタです。そして、 `UnsafeMutableRawPointer` のメモリ表現もポインタそのものです。なので、 `unsafeBitCast` で変換できます。以下に例を示します。

```swift
let cat: Cat = Cat()
let rawCat: UnsafeMutableRawPointer = unsafeBitCast(cat, to: UnsafeMutableRawPointer.self)
```

ただしこれは参照型の値と `UnsafeMutableRawPointer` のメモリ表現が現在のところたまたま同じであるから動くだけです。Swiftの規格上において動作が保証されるものではないので、使用は推奨しません。

# ObjectIdentifierを使う

もし生ポインタを使用したい理由が、参照先インスタンスの同一性にもとづいて、辞書のキーを構築するなどであれば、 `ObjectIdentifier` を使うという選択肢もあります([リファレンス](https://developer.apple.com/documentation/swift/objectidentifier))。これは同一性に基づく値が欲しいだけである場合には最適な選択肢です。今のところそのような予定は全く無いですが、もしもSwiftがコピーGCを実装した仮想マシン上で実行されるような事があれば、インスタンスアドレスはメモリマネージャによって変更される可能性があります。そのようなアドレスが変化する環境においても、`ObjectIdentifier` は同一の値でありつづけるでしょうから、コードの意味上もこちらが適切なのです。ただまあ、現状のIdentifierの実装はポインタのアドレス値です([ソース](https://github.com/apple/swift/blob/b7af9bfe833caf9215c71332beaaa151685e8990/stdlib/public/core/ObjectIdentifier.swift#L18))。

# ポインタのアドレス値を取り扱う

もしポインタが指しているアドレスの整数値が取得したいのであれば、 `Int.init(bitPattern: UnsafeMutableRawPointer?)` で変換できます([リファレンス](https://developer.apple.com/documentation/swift/int/2428763-init))。逆に、アドレスの整数値からポインタを生成したいのであれば、 `UnsafeMutableRawPointer.init?(bitPattern: Int)` が使えます([リファレンス](https://developer.apple.com/documentation/swift/unsafemutablerawpointer/2431882-init]))。
gitでaddできないファイル/ディレクトリがあるときに確認すること

## 問題点 ##
gitを使っていると、statusを確認してもaddしても変更が検知されないファイルやディレクトリがありました。
.gitignoreに書いてるとか、こちらに書いてある方法で敢えて変更を無視している場合はそれに気づければいいですが、そうじゃないときもあります。
[既に git 管理しているファイルをあえて無視したい](http://qiita.com/usamik26/items/56d0d3ba7a1300625f92)

## 解決策 ##
* macの人は.DS_Storeファイルをignoreしていることがあると思いますが、それが原因となっていることがあります。
一旦.gitignoreから.DS_Storeを削除して、git管理下にします。すると、gitが変更したファイル/ディレクトリを検知してくれるので、それらをaddした後に.gitignoreに.DS_Storeを追記します。
* .DS_Storeを削除して、こちらのようにしてもいいと思います。
[.gitignore の設定を反映させる](http://qiita.com/Potof_/items/c75eba9cfa72819506de)

今回はこれで解決できました。
Rパッケージopenairによるカレンダープロットでの料金可視化

## openairパッケージ
もともとは大気汚染データの可視化で作成されたパッケージのようですが、
株価の推移やパブリッククラウドの課金データの可視化にも役立ちそうです。
rmarkdownやshinyでレポートの可視化&自動化をやっている方でしたら便利にご利用いただけるかと思います。

## 利用手順
ドコモの株価を取得しカレンダープロットしてみたいと思います。
### パッケージインストールと読み込み
```
install.packages("openair")
library("openair")
```

### ドコモの株価取得し、データフレームに変換
```
install.packages("quantmod")
library("quantmod")
docomo <- getSymbols("9432.T",src="yahooj",auto.assign=FALSE, from = "2000-04-01")
docomo_df <- data.frame(date=index(docomo), coredata(docomo))
```

### カレンダープロット
```
calendarPlot(docomo_df, pollutant = "YJ9432.T.Adjusted")
```
以下のようにプロットできます。
横のバーが株価を示しており、カレンダーはそれにあわせた株価の色を示しています。
![cal1.png](https://qiita-image-store.s3.amazonaws.com/0/123580/52cd9d49-2303-e2ca-cdec-8e7cc57989cd.png)


引数で西暦を指定できます。
```
calendarPlot(docomo_df, pollutant = "YJ9432.T.Adjusted", year = 2017)
```
![cal2.png](https://qiita-image-store.s3.amazonaws.com/0/123580/16eb9e1a-dff0-3b3a-f533-4e20be406fae.png)

バーの色も指定できます。
以下は株価が高ければ赤、安ければ緑。
limits = で株価の範囲指定もしています。
```
docomo_df %>% calendarPlot(pollutant = "YJ9432.T.Adjusted", year = 2016, cols = c("#ffffff", "#adff2f", "red"), limits = c(3000, 5500))
```![cal3.png](https://qiita-image-store.s3.amazonaws.com/0/123580/fcaa8b26-7f13-d8ba-68f9-96152e3a2762.png)

dataクラスと値さえあれば利用できるのでとても簡単です。

※追記
日本語の列名が入っているとうまく表示されませんね。
Rはここらへんがな～
Unity 2017で.NET4.6選択時にVisual Studio上で出るエラーを消す方法

:warning:  **Unity2018では、下記の対応は必要ありません**

----

Unity2017では.NET4.6が選べるようになっていますが、現在(2017/8/30) Visual Studioのプロジェクトファイル生成に問題があり、.NET4.6にしてもC#6.0が使えなかったり、IDE上で大量のエラーが出たりします。

原因はcsprojの内容にあります。

* `LangVersion`が4なのでC#6.0を書くとエラーになる (6になっていてほしい)
* `TargetFrameworkVersion`が3.5なので`IObservable`が見つからないなどのエラーが出る(特にUniRxを使っているとき[^1])

いずれもIDE上の問題でありUnityでのビルドには影響ありませんが、
波線が目障り、Unityにアタッチができないなど、開発に支障があります。

"試験的"が取れるまで待てばいいのですが、早くC#6を書きたいので、
プロジェクト生成のフックで無理やり直しました。

```csharp:ProjectFileGenerationFix.cs
using SyntaxTree.VisualStudio.Unity.Bridge;
using System.IO;
using System.Text;
using System.Xml.Linq;
using UnityEditor;
using UnityEngine;
 
[InitializeOnLoad]
public class ProjectFileGenerationFix
{
    class UTF8StringWriter : StringWriter
    {
        public override Encoding Encoding
        {
            get { return Encoding.UTF8; }
        }
    }
 
    static string XDocumentToUTF8String(XDocument document)
    {
        var writer = new UTF8StringWriter();
        document.Save(writer);
        return writer.ToString();
    }
 
    static ProjectFileGenerationFix()
    {
        if (PlayerSettings.GetApiCompatibilityLevel(BuildTargetGroup.Standalone) == ApiCompatibilityLevel.NET_4_6)
        {
            ProjectFilesGenerator.ProjectFileGeneration += (string name, string content) =>
            {
                if (!name.EndsWith(".csproj"))
                {
                    return content;
                }
 
                var document = XDocument.Parse(content);
 
                var ns = (XNamespace)"http://schemas.microsoft.com/developer/msbuild/2003";
                var propGroup = document.Root.Element(ns + "PropertyGroup");

                propGroup.Element(ns + "LangVersion").SetValue(6);
                propGroup.Element(ns + "TargetFrameworkVersion").SetValue("v4.6");
                propGroup.Element(ns + "TargetFrameworkProfile").Remove();

                Debug.Log(name + ": 'LangVersion' is set to '6'.");
                Debug.Log(name + ": 'TargetFrameworkVersion' is set to 'v4.6'.");
                Debug.Log(name + ": 'TargetFrameworkProfile' is removed.");

                return XDocumentToUTF8String(document);
            };
        }
    }
}
```

このスクリプトをエディタ拡張としてAsset/Editor等に入れておくと、csprojが生成される時にLangVersionを6に、TargetFrameworkVersionを4.6に修正してくれます。

[^1]: 別件ですが、UniRxを使っていて.NETを4.6にすると`IObservable`が競合します。`ScriptingDefineSymbols`に`ENABLE_MONO_BLEEDING_EDGE_EDITOR`と`ENABLE_MONO_BLEEDING_EDGE_STANDALONE`を足すと直ります。こっちはUnityでのビルドができなくなるのでより深刻。
Node.jsで画像アップロードを受けつけるサーバー


カメラ撮影したものをサーバーにアップロードする仕組みを作っています。

> クライアント側コードはまた別途

今回はサーバー側のミニマム構成っぽいものを書いてみたのでメモです。
環境は`Node.js v8.2.0`です。

## 準備

expressだけ使っているので

```
npm i --save express
```

だけはやります。


## コード

```server.js
'use strict';

const fs = require('fs');
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;

app.get('/', (req, res) => res.send('POSTでアップロードしてください。'));

app.post('/', (req, res) => {
    let buffers = [];
    let cnt = 0;

    req.on('data', (chunk) => {
        buffers.push(chunk);
        console.log(++cnt);
    });

    req.on('end', () => {
        console.log(`[done] Image upload`);
        req.rawBody = Buffer.concat(buffers);
        //書き込み
        fs.writeFile('./img.jpeg', req.rawBody, 'utf-8',(err) => {
            if(err) return;
            console.log(`[done] Image save`);
        });
    });
});
 
app.listen(PORT);
```

## 実行

```
node app.js
```

こんな感じで普通にサーバーを立てます。

その後画像データが送信されるとこんな感じでプログレス表示のように表示されます。

```
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[done] Image upload
[done] Image save
```

![](https://i.gyazo.com/4dea163db3c9ed7e488e3ec089a4bc2d.png)

無事に保存できました。
描画最適化

# 描画
- 表示用のメモリ領域を、ピクセル情報で埋める作業
- 画面全体の色情報が記録されたメモリ領域のことをフレームバッファと呼ぶ

# Set Pass Call
- Draw Callと同義
- CPUからGPUに送る描画命令
- MaterialやShaderのPassが多いと増える
- Shaderのプロパティを動的に変えても増える
- CPU側の負担となる

# Draw Call
- グラフィックスAPIを使用して、画面に描画を行う際に呼び出す命令の事

[DrawCall (ドローコール) って何？ 描画パフォーマンスを考える一つの指標を見る]     
(https://tech.drecom.co.jp/what-is-drawcall/)

#GPU側の描画の問題
## Rendererがいっぱい(ピクセル描画が重い)
 - fragment shaderが複雑すぎる
 - テクスチャのキャッシュミスがひどい
 - PVRTCなどのフォーマットの方がテクスチャのキャッシュにヒットしやすい
 - Cube mapのようにランダムアクセスするテクスチャはキャッシュミスがひどい
 - ピクセル描きすぎ(オーバードロー)

## Tilerがいっぱい
 - 送信している頂点数が多すぎる

[【Unity】Unity Performance Casual Talk 「ドローコール伝説の終わり」 レポート](http://qiita.com/baba_s/items/5260807ced7fc3c02ca6)

# VSync
- ディスプレイの更新タイミングに合わせて処理を行う仕組み
- またの名を垂直同期と呼ぶ
- VSyncをオフにするとパフォーマンスは良くなるが、ティアリングという描画ズレが起きる可能性がある
- ティアリングとは、ディスプレイの更新と、描画の更新が被って、描画途中のものが表示されてしまう現象  

[【速いぜ！】スマホ向けUnity高速化Tips]
(https://ameblo.jp/sugawara-monolizm/entry-11875747245.html)

# Matcap
- 事前にレンダリングした画像を使用して、ライト表現を行う手法
- 材質と光を表現した球の絵を使用して疑似的にライティングを行う
- 比較的軽く、モバイルでも動く

[【Unity】Matcap、事前に用意した綺麗な光表現を利用する](http://tsubakit1.hateblo.jp/entry/2016/06/30/073000)
[[Unity] Shader ForgeをつかってMatCapシェーダーを作る](http://qiita.com/akerusoft/items/d58416d608cb3c76c153)

# batching

[Mobile Optimization – Batching in Unity](http://blog.theknightsofunity.com/mobile-optimization-batching-unity/)

# Profiler

[(殴り書き)UnityのVRサポートでパフォーマンスとかプロファイルとか](http://udasankoubou.blogspot.jp/2015/11/unityvr.html)

# Texture Format
- ETC2 : 全てのAndroid機種が対応できるフォーマットの中でOpenGLES3.0対応の機種で使用可能、Alphaチャンネルもサポート

[【Unity】Texture Format](http://techblog.kayac.com/unity_advent_calendar_2016_10)

#  Asset

[【Unity アセット真夏のアドベントカレンダー 2017】世界をローポリにしてやろうか！](http://blog.kazumalab.com/entry/2017/08/12/004927)

[Draw Call Minimizer](https://www.assetstore.unity3d.com/jp/#!/content/2859)

- Shader Forgeの出力はVertex ShaderとFragment Shader
- Amplity Shader Editorの出力はSurface Shader
Kotlin Android ExtensionsのParcelableSupportを使う

先日Kotlin1.1.4がリリースされましたが、それと同時にAndroid ExtensionsによるParcelableサポートが発表されました。

> Android Extensions plugin now includes an automatic Parcelable implementation generator. 
> https://blog.jetbrains.com/kotlin/2017/08/kotlin-1-1-4-is-out/

まだexperimentalな機能ですが、軽く触った感すでに十分使えそうだったので使い方を軽くまとめておきます。

KEEP: https://github.com/Kotlin/KEEP/blob/603cfefff14e1da3edd103b3f65fc0d5a13227a3/proposals/extensions/android-parcelable.md

# 概要

Parcelable化したいクラスに対し、アノテーションを付与することでコンパイル時にParcelableの実装に必用なコードが生成してくれます。

v1.1.4時点で以下のアノテーションとインターフェースが提供されています

- `@Parcelize`
- `@RawType`
- `Parceler`

# 基本的な使い方(`@Parcelize`)

`Parcelable`を実装したクラスに`@Parcelize`を付与するだけです。それだけで`Parcelable`の実装に必用なコードが生成されます。

```
@Parcelize
class User(val name: String): Parcelable
```

現時点で`@Parcelize`を付与できるクラスの条件は以下のとおりです

- `class` or `data class`であること
- `Parcelable`を実装していること
- プライマリコンストラクタ内に定義されたプロパティが`Parcel`に書き込み可能な型であること
- プライマリコンストラクタ内のパラメータは全て`val`or`var`であること

以下のケースは、v1.1.4時点ではサポートされていません

- `object`クラス
- `@Parcelize`を利用したクラスの継承

# `@RawValue`

Parcelableの持つプロパティの型が、シリアライズ可能かどうか不定な場合に利用します。
例えば、以下のようなクラスでは`T`が不定なため警告が発生し、コンパイルが通らなくなります。

```
@Parcelize
class Range<T: Comparable>(lower: T, upper: T): Parcelable
```

このとき`T`に対して`@RawValue`を付与することで、実質的にシリアライズ可能なインスタンスが渡されることを明示できます。

```
@Parcelize
class Range<T: Comparable>(lower: @RawValue T, upper: @RawValue T): Parcelable
```

ただし、`T`の型が必ずシリアライズ可能であると保証するものではないため、不正な型のインスタンスを使えばランタイム中に例外が発生します。利用する際は注意が必用です。また、`@RawValue`を付与したプロパティのシリアライズには`Parcel#writeValue`が利用されるようです。([参考](https://github.com/Kotlin/KEEP/blob/603cfefff14e1da3edd103b3f65fc0d5a13227a3/proposals/extensions/android-parcelable.md#rawvalue-annotation))

ちまみに、2017/08/30時点では、このアノテーションのプロポーザル(PR)はまだ`master`にマージされていません。
https://github.com/Kotlin/KEEP/pull/72

# `Parceler`

独自の`CREATOR`を作るためのインターフェースです。 [`johncarl81/parceler`](https://github.com/johncarl81/parceler)とは別物。

`companion object`に実装することで、CREATORの処理を一部移譲できます。
あまり使う機会はない気がするので詳細は一旦省略します。
詳しく知りたい方は[KEEP](https://github.com/Kotlin/KEEP/blob/603cfefff14e1da3edd103b3f65fc0d5a13227a3/proposals/extensions/android-parcelable.md#custom-parcelables)を読みましょう。

# 感想

軽く触ってみた感じ、かなり良さそうな印象を受けました。特に`@RawValue`のように、細かいユースケースをうまくサポートしているところが気に入っています。今開発しているプロダクトでは`johncarl81/parceler`を使っていますが、Kotlinと組み合わせるといろいろツラいところがあり、今すぐにでも置き換えたいくらいです。
S3のライフサイクル設定

#■目的
ファイルサーバとしてS3を利用する場合，古いファイルは消して節約を図りたいです．
その際に取る方法とてして，

```
１．シェルで定期的に消す
２．S3のLifeCycle設定を利用
```

2の場合，短い期間は設定できず，30日は残さないといけません．
まぁ，30日あった方が良いので，S3を使うなら極力LifeCycleを設定する方向で．

#■設定方法
LifeCycleを設定する対象には，

```
バケット全体とバケットの中の一部
```

があります．

前者は，何も考えずそのまま設定で良いですが，後者の場合はPrefixを用いて設定します．

例）imagesディレクトリ以下を対象とする．
あるバケットに，imagesのディレクトリがあって，そこにたまっている画像は30日過ぎれば消す仕様とします．ただし，そのバケットには他にも，worksやらlogsやら色々ある状況です．
（logsも消せよって話はおいておいて）

その場合設定する方法としては，

```
prefixの設定で，"images"を設定
```

することです．
この設定を行うことによって，同じバケットにあるworksやlogs以下は対象外となります．

#■過去のファイルは？
過去LifeCycleを設定せずファイルを放置してきており，途中から設定を行った場合はどうなるのか？

試したところ，過去のファイルもルールが適用され，仮に90日でExpireであれば，90日前のファイルは削除されます．
なので途中でルールを設定しても，キチンと過去のファイルも適用してくれるので安心です．
SSHするときの設定メモ

# 目的
SSHする際に設定していることのメモ

# 設定ファイル
/etc/ssh/sshd_config

まずはPort番号(デフォルト22)変える

```
Port NNNNN（ウェルノウンではないポート番号）
```

自分が覚えやすいNoで良いかと(語呂合わせとかを利用)

パスワード認証なしにして鍵交換のみ許可

```
PasswordAuthentication no
```

rootでのログインはなしに．

```
PermitRootLogin no
```

最低限これだけはやっておきたい．
Vueのあれこれ


基本的に公式ドキュメントから、自分の忘れやすいところを抜き出しています。

[公式ドキュメント](https://jp.vuejs.org/)	

# v-if, v-show(cssのdisplay:none;)
https://jp.vuejs.org/v2/guide/conditional.html#v-show

一般的に、v-if はより高い切り替えコストを持っているのに対して、 v-show はより高い初期描画コストを持っています。 そのため、とても頻繁に何かを切り替える必要があれば v-show を選び、条件が実行時に変更することがほとんどない場合は、v-if を選びます。



# computed, method
https://jp.vuejs.org/v2/api/#computed

vueのtemplateの中にmethodやcomputedを書くとそれがvue.jsによって監視されるんだけど、computedの場合は結果をキャッシュするからtemplateの中に何か処理を書く場合はcomputedを使用するのがおすすめやな
template以外で何か処理をする場合はmethodを使う

methods	ビューモデルのメソッドを保持するオブジェクト。methodsに限らないがビューモデル内で定義されたメソッド内でのthisはビューモデル自身を指す
computed	動的なプロパティを生成するメソッドを持つオブジェクト。methodsとの違いとして呼び出しに括弧を用いずプロパティであるかのようにアクセス出来る。またgetやsetの定義が出来る


# v-for
https://jp.vuejs.org/v2/guide/list.html#v-for

配列 / オブジェクト / 範囲の反復処理が可能

Vue が各ノードの識別情報を追跡できるヒントを与えるために、また、先ほど説明したような既存の要素の再利用と並び替えができるように、一意な key 属性を全てのアイテムに与える必要があります。この特別な属性は 1.x の track-by に相当するものですが、しかしこれは属性のように動作します。従って、これを動的な値に束縛するためには v-bind を使う必要があります (以下は省略構文を使ったものです):

```html:Item.vue
<div v-for="item in items" :key="item.id">
  <!-- content -->
</div>
```

可能なときはいつでも v-for に key を与えることが推奨されます。これは、繰り返される DOM の内容が単純でない、または性能向上を標準の動作に意図的に頼っていない場合に限ります。

# filterに関して

Vue1.xと2.xで結構変わっている
http://qiita.com/yutaro23/items/095cf66038bb9fabc094


```html:Input.vue
<div id="app">
  <input v-on:input="hoge = $event.target.value" />
  <p :class=hoge>{{ hoge | fuga }}</p>
</div>
```


```js:main.js
new Vue({
	el: '#app',
  data: {
  	hoge: ''
  },
  filters: {
  	fuga: function(value) {
    	return value.toUpperCase();
    }
  }
});
```

#コンポーネント
https://jp.vuejs.org/v2/guide/components.html

```js:グローバル登録
// 登録する
Vue.component('my-component', {
  template: '<div>A custom component!</div>'
})
// root インスタンスを作成する
new Vue({
  el: '#example'
})
```


グローバルに全てのコンポーネントを登録する必要はありません。別のコンポーネントのインスタンスオプションの components に登録することで、そのコンポーネントのスコープ内でのみ利用可能なコンポーネントを作成できます


```js:ローカル登録
var Child = {
  template: '<div>A custom component!</div>'
}
new Vue({
  // ...
  components: {
    // <my-component> は親テンプレートでのみ有効になります
    'my-component': Child
  }
})
```

data は関数でなければいけません。

```js
Vue.component('my-component', {
  template: '<span>{{ message }}</span>',
  data: {
    message: 'hello'
  }
})
```
[Xcode]Cross-platform

<p>Xcodeでクロスプラットフォームなプロジェクトの生成方法を試行錯誤してみて、自分なりのやり方を考えてみた。</p>

<p>Xcodeのクロスプラットフォームなプロジェクトな雛形として、ゲーム系プロジェクトが用意されているので、どんなプロジェクトが生成されるのか試してみる。</p>

<img width="183" alt="Cross-Platformプロジェクト.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/12540/0314acbe-abd7-0724-212b-aa4795e8d20e.jpeg">

<p>単独のプロジェクトではターゲット名がプロダクト名となっているが、クロスプラットフォームなプロジェクトのターゲット名は、macOSやiOSとなっていた。</p>

![構成.jpg](https://qiita-image-store.s3.amazonaws.com/0/12540/9bf03dfa-f6d3-6b42-a2e2-f4657d73c1d3.jpeg)

<p>これを参考することにした。</p>

<p>空のプロジェクトを生成する。</p>

<img width="183" alt="Emptyプロジェクト.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/12540/dbd4a2ce-af3e-5317-c80c-8a24354ff248.jpeg">

<p>ターゲットmacOSを追加する。</p>

<img width="183" alt="ターゲットmacOS.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/12540/c94e2221-5030-1b7c-ea0d-c26e8bbe814f.jpeg">

<p>ターゲット名をmacOSとすると、更生がスッキリする。</p>

![ターゲット名.jpg](https://qiita-image-store.s3.amazonaws.com/0/12540/8ec013f9-ff21-4c18-122b-7ca11faa8546.jpeg)

<p>その代わり、バンドルIDと商品名を修正する必要がある。</p>

![商品名.jpg](https://qiita-image-store.s3.amazonaws.com/0/12540/984c39c2-f80a-d955-6ab4-4203c82ea648.jpeg)

ソースコード
GitHubからどうぞ。<br />
<a href="https://github.com/murakami/KeepADiary">https://github.com/murakami/KeepADiary</a> - GitHub<br />

関連情報
<a href="https://cocoa-study.connpass.com">Cocoa勉強会 BUKURO.swift (connpass)</a><br />
<a href="https://cocoa-kanto.connpass.com">Swift勉強会 関東 (connpass)</a><br />
<a href="https://atnd.org/groups/cocoa-study">Cocoa勉強会 BUKURO.swift (ATND)</a><br />
<a href="http://cocoa-study.peatix.com">Cocoa勉強会 BUKURO.swift (Peatix)</a><br />
<a href="https://mosa.connpass.com">MOSA BUKURO.swift (connpass)</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk</a>note<br />
[クイズ]javascriptと仲良くなるための一歩　第４４話「this参照３」

#問題

```js
var obj = {
           x:3,
           doit: function(){ console.log("method is called." + this.x); }
          }
var fn = obj.doit;

var obj2 = {
            x:4,
            doit2:fn
           }
obj2.doit2(); //=> ?
```

:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:

#答え

```js
var obj = {
           x:3,
           doit: function(){ console.log("method is called." + this.x); }
          }
var fn = obj.doit;

var obj2 = {
            x:4,
            doit2:fn
           }
obj2.doit2(); //=> method is called.4
```
スクレイピング: 仮想通貨の時価総額推移について

これまでに仮想通貨が市場に供給されると
自分が保有している仮想通貨やトークンがどれほどまでに
時価総額が推移しているかが気になる。

そこでCryptoCurrency MarketCapitalizationsのサービスを使って
時価総額の推移をスクレイピングで抽出してみる。

https://coinmarketcap.com

時価総額の推移は下記ページから情報が取得できる。
たとえばビットコインの時価総額だと現時点で722億ドルということがわかる。

https://coinmarketcap.com/currencies/bitcoin/historical-data/

![c1.png](https://qiita-image-store.s3.amazonaws.com/0/142016/1c311de4-9caa-2425-a44f-50d121c5b2a4.png)

時価総額を取得すること自体はこのサイト自体のAPIで取得できるが、
推移を取得するためのAPIが見つからなかったので、スクレイプで情報を取得する


上記ページのソースは単純なテーブル構造のため
bitcoinの時価総額をCSVで抽出するだけであれば、少ないコードで済み、シンプルといえる。
(2017/8/25現在）

```py3:MarketPrice.py

from bs4 import BeautifulSoup
import requests as rs
import csv

url='https://coinmarketcap.com/currencies/bitcoin/historical-data/?start=20130428&end=20170827'

res=rs.get(url)

soup=BeautifulSoup(res.text,"html.parser")

prices=soup.select("div#historical-data  tr.text-right")
f = open('market_price.csv', 'w')
writer = csv.writer(f, lineterminator='\n')
for item in prices:
    date=item.select("td")[0].string
    volume=item.select("td")[5].string
    marketcap=item.select("td")[6].string

    csvlist = []
    csvlist.append(date)
    csvlist.append(volume)
    csvlist.append(marketcap)

    print(date,volume,marketcap)
    writer.writerow(csvlist)
f.close()

```

補足：

時価総額が記載されているテーブル列は非常にシンプルな
構造のため、下記のCSSクエリで済む。

```py3:cssクエリ
prices=soup.select("div#historical-data  tr.text-right")

```

上記のスクリプトと同じ要領で、bitcash(bth),　ripple,　Ltecoin,　Ethereum(eth),　Rippleも出力した結果が下記のとおり。

![chart.png](https://qiita-image-store.s3.amazonaws.com/0/142016/b65fb19b-b784-f1c8-0e7a-032c8b07af43.png)


この結果で面白いのが2017年6月末時点で、Ethereumの時価総額がBitcoinの時価総額に到達する直前だった。
そこから7月に入るとEthereumのFlashCrashといったスケーリング問題が浮き彫りになり、Bitcoinの分裂問題で時価総額が、仮想通貨全体で下落した。

そして8月に入り一時的にBitcoinの分裂問題も解決？したのか仮想通貨全体が再び上昇基調にある。（8月にはいるとBitcashがあらたに市場に流通することとなり、市場への供給当初からrippleの時価総額を抜いている。）

以上で時価総額の推移を抽出できたが、情報提供元であるサイト自体、トークンの市場取引価格を提供するAPIを公開している。そのためサービス自体がとても魅力的ともいえる。

次回は自分の保有するトークン残高を日本円で取得するようにしてみようと思う。
D3.jsでアロー関数を使う時の注意点

既存のD3.jsのコードを[アロー関数]で置き換える際に変な動作を起こしてしまったのでメモしておきます。

### 追記 (2020/08/29)

2020年8月にリリースされた D3 v6 ではイベントリスナの書き方が変わりました。
詳しくは [D3 v6 アロー関数使用時の移行ガイド](https://qiita.com/cieloazul310/items/e604535e27fa4db539ba)へ。以下は v5 以前のコードとなります。

D3.jsでは、DOMにイベントを与える[`selection.on(typenames, listener)`]で、イベントリスナ内でそのDOMを選択したいときに`this`を使うことが多いです。

例えば、以下のようなコードがよく使われます。

```JavaScript
  d3.selectAll("rect")
    .data(data)
    .enter()
    .append("rect")
    .attr("x", function(d) {return xScale(0);})
    .attr("y", function(d) {return yScale(d.name);})
    .attr("width", function(d) {return xScale(d.value) - xScale(0);})
    .attr("height", yScale.bandwidth())
    .attr("fill", "white")
    .on("mouseover", function() {
      d3.select(this)
        .transition().duration(500)
        .attr("fill", "orange");
    })
    .on("mouseout", function() {
      d3.select(this)
        .transition().duration(500)
        .attr("fill", "white");
    });
```

このコードに使われている関数を[アロー関数]で置き換えると、最後の二つ`.on("mouseover", listener)`と`.on("mouseout", listener)`で設定されたイベントリスナーは正常に動作しません。これはアロー関数の**thisを束縛しない**という性質によるものです。

アロー関数に置き換えつつ、今まで通りの動作を与えるには、以下のようにlistenerの引数に`d, i, nodes`を取り、`this`と書いていたところを`nodes[i]`と書くことで解決します。

```JavaScript
  d3.selectAll("rect")
    .data(data)
    .enter()
    .append("rect")
    .attr("x", (d) => xScale(0))
    .attr("y", (d) => yScale(d.name))
    .attr("width", (d) => xScale(d.value) - xScale(0))
    .attr("height", yScale.bandwidth())
    .attr("fill", "white")
    .on("mouseover", (d, i, nodes) => {
      d3.select(nodes[i])
        .transition().duration(500)
        .attr("fill", "orange");
    })
    .on("mouseout", (d, i, nodes) => {
      d3.select(nodes[i])
        .transition().duration(500)
        .attr("fill", "white");
    });
```

[`selection.on(typenames, listener)`](https://github.com/d3/d3-selection#selection_on)ではイベントリスナーの引数に、`datum(d)、index(i)、nodes`が渡されます。

- `datum (d)`: 要素にバインドされているデータ（datumはdataの単数形）
- `index (i)`: セレクションの中の順番
- `nodes`: NodeList（要素の集合）

```JavaScript
  d3.selectAll("rect")
    .on("click", (d, i, nodes) => {
      console.log(d)
      //=> datum (= data[i])

      console.log(i);
      //=> index (0, 1, 2, ...)

      console.log(nodes);
      //=> NodeList [rect, rect, rect, ...]
      // d3.selectAll("rect").nodes()で得られるものと同じ

      console.log(nodes[i]);
      //=> rect
    });
```

既存のコードを無理にアロー関数に置き換える必要はありませんが、置き換えたときにこういうことが起きる可能性はあると思うので、備忘録として残しておきます。


[アロー関数]: https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/arrow_functions
[`selection.on(typenames, listener)`]: https://github.com/d3/d3-selection#selection_on
AV1 Specofication を読む(パース処理)

#AV1 specification 日本語訳

ビットストリームからシンタックス要素（画像をつくるためのパラメータや係数値など）を抽出する方法です。
算術符号化がつかわれています。

まずは、算術符号化を使わない復号方法です。

----


#9. パース処理

##9.1 f(n)パース処理

この処理は、シンタックステーブル内のシンタックス要素のデスクリプタが f(n) のときに呼ばれます。

次の n ビットがビットストリームから読まれます。

この処理は以下のように規定されます。

```C++
x = 0
for (i=0; i<n; i++)
{
	x = 2*x + read_bit()
}
```

read_bit() は、ビットストリームｋら次のビットを読み、ビットストリームポインタを1進めます。
ビットストリームがバイト列で提供されるならば、最初のビットは最初のバイトのMSBです。


##9.2 2値デコーダのパース処理

非圧縮ヘッダとパーティションサイズを除いて、ビットストリーム全体はエントロピー符号化されています。
エントロピーデコーダは「boolean decoder（2値デコーダ）」とも呼ばれ、エントロピーでコード処理を定位するために、init_bool(sz), exit_bool(), read_bool(p) が使われます。

###9.2.1 2値デコーダの初期化処理

この処理の入力は、2値デコーダが何バイト読むかを指定する変数 sz です。

この処理は、シンタックス構造内で init_bool(sz) 呼び出しでなされます。

sz<1 になるようなデータをビットストリーム内に含んではなりません。

注意：
init_bool が呼び出されるときは常にビット位置はバイト荒いんされています。なぜなら、非圧縮ヘッダとデータパーティションはバイト単位の長さだからです。

BoolValue = f(8)

BoolRange = 255

BoolMaxBits = 8*sz - 8

9.2.2節で規定される2値デコード処理を、ビットストリームからマーカーシンタックス要素を読むために呼びます。
読んだ値は0でなければなりません。

###9.2.2 2値デコード処理

この処理の入力は、2値デコードのための確率を指定する変数 p (0.255) です。

この処理の出力は、デコードされた2値 bool です。

この処理は、シンタックス構造内で read_bool(p) が呼ばれたときになされます。

split = 1 + (((BoolRange-1) * p) >> 8)

Boolrange, BoolValue, bool を以下のように更新します。

 * BoolValue < split ならば、
  * BoolRange = split
  * bool = 0
 * BoolValue >= split ならば、
  * BoolRange -= split
  * boolValue -= split
  * bool = 1

BoolRange<128 ならば、以下を適用します。

 * newBit を以下のように求めます。
 　*　BoolMaxBits>0 なあば、以下の手順を適用します。
   1. newBit = f(1)
   2. BoolMaxBits -= 1
  * そうではなければ、newBit = 0 とします。しかし、これは発生してはいけません。
 * BoolRange を2倍します
 * BoolValue を以下のように更新します
  * BoolValue = (BoolValue << 1) + newBit

###9.2.3 2値デコーダの終了処理

この処理は、シンタックス構造から exit_bool() が呼ばれたときになされます。

パディングシンタックス要素を、f(BoolMaxBits) で読みます。

パディングは0でなければなりません。

フレームの最後の符号化バイトがスーパーフレームマーカーにならないよう、十分なパディングビットが挿入されなければなりません。
バイト b がスーパーフレームマーカーであるのは、(b & 0xE0) == 0xC0 であるときのみです。
つまり、MSB3ビットが 0b110 です。

注意：
パディングは、ビット位置をバイトアラインさせるために必要かつ、ふれーむが　スーパーフレームマーカーで終了させないようにするためにも使われます。
ビットストリームがすでにバイトアラインされていれば、パディングは0でも構いません。
8ビット以上パディングしてもかまいません。

###9.2.4 read_literal パース処理

この処理は、read_literal(n) が呼ばれてたときになされます。

この処理は以下のように規定されます。

```C++
x = 0
for (i=0; i<n; i++)
{
	x = 2*x + read_bool(128)
}
```

戻り値は x です。
例の黒い画面に慣れるための準備 その２

# 前回までの24
[前回のやつ](http://qiita.com/blue2gou/items/3718b12495e5beabdf68)
1. VirtualBoxインストールした
2. クソ回線でUbuntuのisoが手に入らなかった

# いざOSインストール
予定を変更してUbuntu → CentOS-7で行きます。
理由はCentOSはサーバ用途がメインらしく、業務で触る機会が多そうだから。慣れてきたら趣味で他のも触っていきたい。

# 驚き
### めっちゃGUIだった。Where is 黒い画面.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/199415/34bf31cb-03bb-a6a3-32d6-6c2694a9b9da.png)

### マジGUI。マジ日本語。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/199415/eae3b087-c9c1-3cfd-587d-adc738dc52b3.png)

### マイwindowsのデスクトップよりオシャレ。OK連打してただけなのにこれはすごい。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/199415/505feb4d-55d9-72f6-430e-78e0d88de3fb.png)

# ニホンゴ
日本語を入力できるようになるまで30分かかった。強い。
入力ソースを「日本語」じゃなくて「日本語（かな）」にしないとダメ。
それにしてもほんとに違和感なく使えてしまうのに驚き。最初から火狐入ってるしすげぇな。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/199415/68e521ac-1fcd-b228-ffe9-63a133a2ada4.png)
特に設定しなくても、youtubeも見れちまうんだ。（よゐクラおもしろいよね

# すげぇや！
とりあえずインストールまで終わってガシャガシャいじれるようになった。
こんなにすんなりできるなんて思ってなかったし、GUIでいじるなんてめちゃめちゃ時間かかると思ってから感動。
おれのLinuxライフはここからだ！

# 目的
え？目的？黒い画面？何言ってるかわかんないっすね。
大事なこと忘れてる様な気がするけど気のせい気のせい。
[Symfony2 config] サービスコンテナのサービスを拾う

## あらまし

コンフィグファイル内でコンテナ内のサービスを使いたいことあるやん？
ぴゃっと取れたら幸せやん？
でも、検索してもなかなか出てけぇへんかってんわー。
んで、書いとこーって。

## コンフィグファイル内でコンテナからサービスを呼び出す

```/app/config/config.yml
(前略)
    arguments:
        - @=container.get('サービス名')
```

- [Symfony2のservices.ymlでコンテナに登録されたオブジェクトのメソッドを実行する方法](https://polidog.jp/2016/04/23/symfony_container/)
    - この記事によると"@=service('サービス名')"で取得できるとあるが、その後本人によって上記の方が適切であると訂正されている。
    - [Twitter - polidog氏](https://twitter.com/polidog/status/834832967050485761)
    - なんか'@@なんちゃら'って書き方もあったようだけど…忘れた (´･ω･｀)
Lumenで複数のDBにアクセスする方法

公式ドキュメントにやり方が記載されてなかったので。

# 設定ファイルを追加する
`config/database.php` を新規作成してください。

以下のような構成になるはずです。

```
.                        
├── app                          
├── artisan              
├── bootstrap                    
├── composer.json        
├── composer.lock  
├── config
│   └── database.php      
├── database                      
├── phpunit.xml          
├── public                    
├── readme.md            
├── resources                      
├── routes                       
├── storage                         
├── tests                   
└── vendor                
```

# 設定ファイルの記載
`config/database.php` の `connections` 配列に接続先を追加します。

```
<?php
return [
    
    'default' => 'db1',
    'migrations' => 'migrations',
    'connections' => [
        'db1' => [
            'driver'    => env('DB_CONNECTION'),
            'host'      => env('DB_HOST'),
            'port'      => env('DB_PORT'),
            'database'  => env('DB_DATABASE'),
            'username'  => env('DB_USERNAME'),
            'password'  => env('DB_PASSWORD'),
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
        ],
        'db2' => [
            'driver'    => env('DB2_CONNECTION'),
            'host'      => env('DB2_HOST'),
            'port'      => env('DB2_PORT'),
            'database'  => env('DB2_DATABASE'),
            'username'  => env('DB2_USERNAME'),
            'password'  => env('DB2_PASSWORD'),
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
        ],
    ],
];
```

`default` は明示的に指定していない時に読みに行くDBの向き先で、
`migrations` は設定されていないと artisan migrate 時にエラーがでます。

# .envファイルの修正
`.env` ファイルに接続先の情報を記録する定数を追加します。

```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=db1
DB_USERNAME=
DB_PASSWORD=

DB2_CONNECTION=mysql
DB2_HOST=127.0.0.1
DB2_PORT=3306
DB2_DATABASE=db2
DB2_USERNAME=
DB2_PASSWORD=
```

※上記の接続情報は適当ですので、環境に合わせて適切に設定してください

# 利用方法
デフォルトだと `config/database.php` の `default` で指定された向き先のDBに繋がるので、
異なるDBにアクセスしたい際は、明示的に指定してやる必要があります。

## Eloquent側に接続情報を記載するやり方

```
<?php

class Hoge extends Model {

    protected $connection = 'db2';

}
```
## 実行時に接続情報を定義するやり方
```
<?php

class ExampleController extends Controller {

    public function fooMethod()
    {
        $foo = new Foo;

        $foo->setConnection('db2');

        $data = $foo->find(1);

        return $data;
    }

}
```
## クエリビルダで指定するやり方
```
$users = DB::connection('db2')->select(...);
```

# 結論
Laravelのやり方とほぼ同じでした :rolling_eyes:
[axios] 画像データのレスポンスを取得する際にハマった話

axios を使って画像データ(PNG画像)を取得する REST-API を叩いた際に画像データが期待通りに取得できなくてハマったのでメモを残す。

# どういう状況か
前述の通り、[axios](https://github.com/axios/axios) を使って画像取得の REST-API を実行～画像取得、それにプラスして base64 エンコードした文字列をフロントエンドに送ることが目的。
構成と一連の流れは次のような感じ。

* 構成

    ```:構成
    フロントエンド ⇔ バックエンドA ⇔ バックエンドB
    ```
* 流れ
  1. フロントエンドからバックエンドAに対して画像取得のAPIを実行
  1. バックエンドAは仲介人のような立ち位置で、バックエンドBに対して画像取得のAPIを実行。ここで axios を使う
  1. バックエンドBからバックエンドAに画像が response で返る
  1. バックエンドAは base64 エンコードしてフロントエンドへ返す
  1. フロントエンドは base64 エンコードされて返却された文字列を dataURL で表示する

で、バックエンドBからバックエンドAに返った response にはバイナリデータっぽい文字化けした文字列があって、これを一生懸命 base64 エンコードしていた。

ここで、この **「バイナリデータっぽい文字化けした文字列」が response で返ってきているのがおかしい**、と気づけなかったのがハマった原因。

# 返却される画像データは arraybuffer が正しい
ということで、結論を書くと axios のインスタンスを create する際に設定するパラメータに問題があった。

以下に駄目だったケースと期待通りに動いたケースを示すが、responseType と Content-Type に json を指定したのが誤り。画像データを取得する際は、それぞれ **arryabuffer** と (PNG画像の場合は) **image/png** を指定する必要があった。

## 画像取得が正常に行えなかったケース

```javascript:設定するパラメータ
var instance = axios.create({
  'responseType': 'json',
  'headers': {
    'Content-Type': 'application/json'
  }
});
```

そのときのシーケンスがこちら。
<img width="804" alt="axios_get_image_ng.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193342/5f632b40-f16e-8acb-c09b-cb019927d0da.png">


## 画像取得が正常に行えたケース

```javascript:設定するパラメータ
var instance = axios.create({
  'responseType': 'arraybuffer',
  'headers': {
    'Content-Type': 'image/png'
  }
});
```

そのときのシーケンスがこちら。
<img width="804" alt="axios_get_image_ok.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193342/db73dbfb-2b70-98ac-569d-9e7282a69a99.png">


# どうして気づくのが遅れたか
自分自身の知識/経験不足と、しつこいようだが、前掲の「バイナリデータっぽい文字化けした文字列」が返って来ていたのが原因。
「バイナリデータを取得しているんだから、そりゃあ文字化けしてるよね」と思い込んでいた。
なので、base64 エンコードをする際の実装に問題があるとばかり(ここでも)思い込んで、そっちの処理の見直しと試行錯誤ばかりを繰り返していた。

実際は base64 エンコードの処理は問題なくて、画像取得の REST-API を叩く際に axios に設定するパラメータが間違っていた、という話。

# おまけ
base64 エンコードの処理はググればいくらでも見つかるけれども、下記のような感じ。

```javascript:base64エンコードする処理
/**
 * 画像データを base64 エンコード
 *
 * @param {array} imgData
 */
function base64Encode(imgData) {
  // arraybuffer で渡された imgData を base64 エンコードする
  const base64Encoded = imgData.toString('base64');
  return base64Encoded;
}
```
rails5でdeviseインストール時のconfig.action_mailer.default_url_optionsのエラー

rails g device:installをすると以下の文が現れる。
1. Ensure you have defined default url options in your environments files. Here
     is an example of default_url_options appropriate for a development environment
     in config/environments/development.rb:

       config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
しかし、実際にconfig/environments/development.rb:に以下の文を書くと、rails sが出来なくなる。

config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
FWMARKを使ってport80, 443のみにDS-Liteを適用する

# 概要

以前このような記事を書きました。

* [IPoE(v6)+DS-LiteとPPPoE(v4)を両立させる(ポリシールーティング)](http://qiita.com/knok/items/2618cd83be17ff3d8e08)

しばらくして次のような問題が出てきました。

* iproute2 4.xでこの書式を受け付けなくなった (Debian jessie->stretchでメジャーバージョンが上がった)
* キャリアグレードNATは提供する側の都合で仕様がかわる
  * 長時間張りっぱなしのセッションは、データが流れないとCGN側で切られるけどこちら側からは切れたように見えない
    * IMAPクライアント立ち上げっぱなしとかで困る
    * sshに関しては特別扱いされるようになったっぽい
* 出口IPがサービスによってはBANされてることがある

これに対し、「80, 443以外はDS-Lite使うのをやめたら」という助言を知人よりいただいたので、それを実践してみました。

## トンネルインターフェースの作成

[以前の記事](http://qiita.com/knok/items/2618cd83be17ff3d8e08#%E3%83%88%E3%83%B3%E3%83%8D%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)にあるままです。そちらを参考にしてください。できあがったインターフェースはip5tnl1という名前とします。

## Netfilterのmark機能

Linux Advanced Routing & Traffic Control HOWTOのChapter 11が詳しいです。

* https://linuxjf.osdn.jp/JFdocs/Adv-Routing-HOWTO/lartc.netfilter.html
  * (注意: ネット上にある古い記事の中には linux.or.jp ドメイン上に[Linux JF(Japanese FAQ) Project](https://linuxjf.osdn.jp/)へのリンクを張っているものが多くありますが、それらを見かけたときは linuxjf.osdn.jp に読みかえてください)

特定のルールにマッチするパケットに対し、記号を付けることができます。32bitの値でビット単位に意味を持たせることができます(CONFIG_IP_ROUTE_FWMARK)。今回はこの機能を活用します。

### 送信先ポート番号が80, 443のパケットにマークを付ける

```
iptables -A PREROUTING -i br0 -t mangle -p tcp --dport 80 -j MARK --set-mark 2
iptables -A PREROUTING -i br0 -t mangle -p tcp --dport 443 -j MARK --set-mark 2
```

物理デバイスbr0のPREROUTINGチェイン、mangleテーブルにMARKモジュールを使って0x002(2ビット目)を立てます。送信先ポート80, 443に対してこれらを適用します。

### マークとテーブル、ルーティングの定義

```
# mark 0x02に対しポリシールーティングテーブル3番を適用
ip rule add fwmark 2 table 3 
# ポリシールーティングテーブル3番のデフォルトゲートウェイをトンネリングデバイスに設定
ip route add default dev ip6tnl1 table 3 
```

これで80, 443ポートへのすべての通信はip6tnl経由で出ていくことになります。

### 例外を設定する

ただ、すべての通信がうまくはいかないことがあります。先に述べた「アドレスがBANされている」ようなケースです。

自分の場合、DHCPで特定のMACアドレスを持つハードウェアに対し固定アドレスを割り当てているので、そういった機器が利用するサービスがBANされているようなケースに、次のようなルールの追加で対処しています。

```
iptables -A PREROUTING -i br0 -t mangle -p tcp -s 192.168.xx.yy \
 -j MARK --set-mark 0 
```

このルールは先の--set-mark 2の後に来るように記述します。ルールは-Aオプションで追加した順序で適用されるので、すべてのソースIPアドレスが2とマーキングされたあと、指定したソースIPアドレスのパケットすべてのマーキングを0に設定しなおします。
これにより、ここで指定したIPアドレスの通信のみ、通常のルーティングに従うことになります。

## 雑感

なんだかんだで[The Linux Documentation Project(LDP)](http://tldp.org/)と[その翻訳(JF)](https://linuxjf.osdn.jp/)は頼りになります。JFはここ何年もアクティビティが非常に低いですが、今でも役に立つ情報はあります。ただ、リンク切れにだけ気を付けてください。