OmniAICreator/Qiita-1.07M huggingface dataset:
リストをソートするときにクロージャの代わりに IComparer を渡して GC Alloc を抑える


## 問題

- リストをソートするときに、外部の変数を参照してソートする必要がある
- `List.Sort` に比較関数としてクロージャを渡すと GC Alloc が発生するのをどうにかしたい(ソートの頻度がそこそこあるため)

はじめに、リストをソートするときに GC Alloc が発生していることを、Unity のプロファイラで確認します。

```csharp:
var list = new List<int> { 1, 2, 5, 6, 10, 11, 12 };

_button1.onClick.AddListener(() =>
{
    Profiler.BeginSample("GCAllocCheck: sort(closure)");
    int p = 6;
    // list を p との距離が近い順にソートしたい
    list.Sort((a, b) => Math.Abs(a - p).CompareTo(Math.Abs(b - p)));
    Profiler.EndSample();
    
    Observable.NextFrame(FrameCountType.EndOfFrame).Subscribe(_ => EditorApplication.isPaused = true);
});
```

実行すると 104 B のゴミが発生していることが確認できます。

![スクリーンショット_2017-12-10_15_48_59.png](https://qiita-image-store.s3.amazonaws.com/0/1900/5ce088b4-0e30-2231-c2a7-717e697745b1.png "スクリーンショット_2017-12-10_15_48_59.png")

## 対応

IComparer インターフェースを実装したインスタンスを予め作成しておいて、そのインスタンスを使い回すようにします。

```csharp:
class ListComparer : IComparer<int>
{
    // p を元にしてソートしたい
    public int P { get; set; }

    public ListComparer()
    {
        P = 0;
    }

    public int Compare(int a, int b)
    {
        return Math.Abs(a - P).CompareTo(Math.Abs(b - P));
    }
}
```

上のような ListComarer を作っておき、これを List.Sort に渡します。

```csharp:
var list = new List<int> { 1, 2, 5, 6, 10, 11, 12 };
var comparer = new ListComparer();

_button1.onClick.AddListener(() =>
{
    Profiler.BeginSample("GCAllocCheck: sort(closure)");
    int p = 6;
    // list を p との距離が近い順にソートしたい
    list.Sort((a, b) => Math.Abs(a - p).CompareTo(Math.Abs(b - p)));
    Profiler.EndSample();
    
    Profiler.BeginSample("GCAllocCheck: sort(comparer)");       
    comparer.P = p; // p をソートするタイミングで更新
    list.Sort(comparer); // comparer を使い回す          
    Profiler.EndSample();            
    
    Observable.NextFrame(FrameCountType.EndOfFrame).Subscribe(_ => EditorApplication.isPaused = true);
});
```

実行結果です。

![スクリーンショット_2017-12-10_15_51_02.png](https://qiita-image-store.s3.amazonaws.com/0/1900/5d964940-4bf2-fd74-977b-eb2ab4abf675.png "スクリーンショット_2017-12-10_15_51_02.png")


GC Alloc が 0 B と表示されており、ゴミが発生していないことが確認できます。

## 捕捉

ちなみに、`list.Sort((a, b) => a - b)` のように比較関数が外部環境を参照しない場合、比較関数は内部でキャッシュされて使い回されます(参考: [Unityでのボクシングの殺し方、或いはラムダ式における見えないnewの見極め方](http://neue.cc/2016/01/06_525.html))。


## 参考

- [Unityでのボクシングの殺し方、或いはラムダ式における見えないnewの見極め方](http://neue.cc/2016/01/06_525.html)
- [C#のGCゴミとUnity(5.5)のコンパイラアップデートによるListのforeach問題解決について](http://neue.cc/2016/08/05_537.html)
	- Unity のプロファイラの使い方を参考にさせていただきました
久しぶりのcesium

advent calenderにcesiumが上がって、なんか書こうかなあ
と思って、昔のを思いだして実行してみたが、動かない

1.18レベルでは動いたんだか、今の1.40はかなり
セキュリティが強化されてるんだなあ・・

普通の状態ならともかく、この多忙の状態だと
つまんないもんしかアップできないなあ・・

まあ、今日中に動かすことができれば登録しようかなあ・・
考え中

cesiumはいいのだが、GUIを追加するのがめんどくさいし、
この更新の頻繁さを解決する開発環境あたりが知りたいなあとか
思ってたりする

そういえば、そんなことも英語に書いてあった気もする
#トラブル連発
cesiumもnpmでインストールできるということになったから、
<pre>
npm install cesium
</pre>
でやったら、エラーになって、なんとnpmまで動かなくなってしまった。

なんか、上のコマンドで動かすのでlocalにインストールするのかと思えば
~~グローバルにインストールしているような感じである。~~
(npmの仕様が変わってプロジェクト配下のnode-moduleでなく、%user_home%配下のnode-moduleに変わった？？)

[hone]\package.jsonがどーたら・・とかいうので、困ってしまった。

#nodeのイントール直し
しかたがないので、nodistでインストールしていたはずだった環境を
nodeのmsiのインストーラでprogram files\nodojsにインストール直して
nodistのpathからprogram files\nodojsのパスに変更。

どうも、この辺のnodistとnodeのパスが前から怪しかったから仕方がないのだが
困ったもんだなあ。

他のアプリでもexpressがグローバルだったんだけど、なんか消えているので
また、インストールし直していたりする。
(これもnpmの仕様のせいなんだろうなあ・・）

windowsでnodeはあかんのかなあ？まあ、macでもおんなじようなことをいって
いるのでnodeがあかんのだろうな・・

やっぱり、nodistの環境にきちんとせんといかんなあ
でも、nodeだけでも大丈夫かなあ？

当面はnodistは辞める・・という選択でいきますか

#nodist0.7から0.8へ
上の状況はnodist0.7でやっていたんで、0.8になって、npmも管理するようになったんんでnodistでもいけるみたいです。

ただ、
<pre>
npm install -g npm 
</pre>
でやらずに、
<pre>
nodist npm match 
</pre>
で自分のnodeのバージョンにあったnpmをnodistで入れておく必要があるみたいです。

#cesium-webpack-boilerplate
っで、やりたかったのは、[cesium-webpack-boilerplate](https://github.com/rot1024/cesium-webpack-boilerplate)を
うごかしたかっただけなんだが、nodist 0.8.8にして
nodeはLTSの8.xの最新 8.9.3を使うと・・で
nodist npm match　でやると5.5.1がダウンロードされる。
これで、cesium-webpack-boilerplateをnpm install
すると、エラーになっていた。

どうも、windowsはnpm 5.5.1がだめで、5.0.3にしないといかんようだ。
っで。
<pre>
nodist npm + 5.0.3
nodist npm 5.0.3
</pre>
にして、もう一度cesium-webpack-boilerplateをnpm install
・・おおおお！動き出した。

これで、更新に対応できるんかなあ？
FinOpsのはなし

"FinOps"とか今っぽい言葉を勝手に作ってみましたが、要は資産運用です。  
自分の資産、つまりお金をどうしたらいいの？という話をします。  

## このエントリーを読むにあたっての注意

筆者の本職は(恐らくはこれを読んでいるあなたと同じ)開発者です。金融の専門家ではありません。しかも投資を始めてから1年未満の初心者です。  
このエントリーの内容を鵜呑みにせず、専門サイト等をあたり自分自身でよく勉強・理解してから行動に移すことを強く勧めます。  
**自己責任なのは言わずもがな。**  

## 貯蓄だけでなく投資も検討すべき理由

資産運用は大きく分けて「貯蓄」と「投資」の二つがあります。  
今は、銀行に預けているだけで良かった昔と違い、定期預金の金利が高くても[0.1%](http://www.aeonbank.co.jp/interest/deposit/)という時代です。貯蓄だけでは、せっかくの資産を“活用”できているとは言えません。  

### なるべく早く始めたい理由

「複利効果」は運用期間が長くなるほどその効果が高まるそうです。 
http://www.meijiyasuda.co.jp/401k/chishiki/kiso/step/step_01.html  
株であれ投資信託であれ評価額は上下に変動するものなので、この通りに増えることはないでしょうが、期間が長いほど効果が増幅されるのは違いありません。(あれ、ということは長期で見て右肩下がりだった場合、その効果もマイナス方向に増幅される・・・？)  

## 投資をすべきでない理由

いろいろなサイトを見ていると、投資はあくまで余剰資金でやるべきと書かれています。  
まったく貯金のない人、結婚・子育て等で今後まとまった資金が必要になることが明らかな場合にムリをしてまでやるものではないそうです。  

## 要件定義

といったあたりで開発者らしく、投資に求める要件を定義してみます。  

1. 本業を別に持ち(学ぶべき＆確認すべきことは極力少なく)
2. 余剰資金で(せいぜい月数万？)
3. 確実に増やす！

上記以外の要件をお持ちの方もいらっしゃるかと思います。  
その場合は別のやり方が適切だと思われますが、本エントリーでは触れません。あしからず。  

## 投資の種類

投資対象には、「株式」「債券」「投資信託」「不動産/REIT」「金」などがあります。株式などはさらに「日本」と「外国」に分けられたりします。それぞれの特徴はググって調べてください。(え  
私が皆さんに伝えたいのは「投資対象にはいろいろあるけど、投資信託を通じてたいていのものには投資できるよ」という点です。  

エンジニアに馴染みが深いレイヤーモデルで表すとこんな感じです。  
![img01.png](https://qiita-image-store.s3.amazonaws.com/0/11338/20cba3bc-5d68-323a-9ef1-c7fc0daa6e2c.png)

つまり、株式や債券を直接売買するのはデバイスを直接操作するようなものなので、API(投資信託)を通じてやることで要件1を満たそうというわけです。  
また、投資信託なら100円から買えるサービスもあるので要件2も満たせます。  

## 投資の基本1：分散投資

売買における絶対普遍的な正解は「安く買って高く売る」です。しかし、超能力者でもない限りそれをあらかじめ知ることはできません。そこでリスクを抑えるために行うのが「分散投資」です。  

先にも書いた通り、投資対象の価値は時間が経つにつれ上下に変動します。しかし、「資産・銘柄」あるいは「地域」によってそのパターンは違うそうです。  
もし、あなたが“これは絶対上がる！”と信じたものにすべての資産をつぎ込んでしまうとその価値が下がった場合のダメージをダイレクトにくらいます。しかし、例えば「株式と債券（の投資信託）を半々に」とか「株式でも日本と世界を1:2で」といった感じにしておけば、片方が下がってももう片方が上がって相殺される場合があります。結果、リスクを低減することができます。  

何をどれだけの比率で持つか？という概念を「ポートフォリオ」といいます。詳細はググってください。あと、「リバランス」も重要なキーワードです。  
投資信託にはあらかじめ複数の資産を組み合わせ、内部でリバランスまでしてくれる「バランス型」の商品もあります。  

## 投資の基本2：積立

「資産・銘柄」「地域」だけでなく、「時間」を軸に分散させるとそれは「積立」となります。  
詳しくは「ドルコスト平均法」で検索してほしいのですが、「安いときに買う」は不可能なのであえて「毎月“同じ金額分”買う」ことでリスクを低減するセオリーです。  
毎月少しずつ資金を加えていけばいいというのも、会社員向きだと言えます。

## 活用したい制度

詳しくはこれもググってほしいのですが、投資を始めるのに最適な3つの制度があります。

### iDeCo

老後の資産を築くため、投資信託を毎月積立購入していく制度です。  
運用して得られる収益が非課税になるだけでなく、毎月の積立額が所得控除の対象になるなどその節税効果は絶大！  
対象商品が厳選されているのも初心者向き。  
ただし、60歳になるまで引き出すことはできません。  

### NISA

毎年120万円までの投資で得られた収益が非課税になります。  
2023年までの期間限定。  

### つみたてNISA

2018年から始まる新制度。  
毎年40万円までと上限はNISAよりも低いですが、非課税期間20年(NISAは5年)は魅力的！

### まとめ

* 投資は余剰資金でやろう！
* 投資信託で分散＆積立＋たまにリバランスくらいがリスク的にも手間的にもおすすめ！
* 使えるもの(制度)は使おう！
 * 優先度は iDeCo > つみたてNISA > NISA(つみたてNISAと併用は不可) かな？

## 最後に(警告)

何度も繰り返しますが、投資対象の価値は常に変動します。さらに、10年に一度は大暴落が起きるとも言われています。前回は「リーマンショック(2008年)」、単純計算では2018年に“次”が来てもおかしくありません。  
しかし、ドルコスト平均法を理解すればこれは逆にチャンスであるとも言えます。過剰に恐れることなく、また逆に過剰にのめり込むことなく、許容できるリスクの中でうまく運用していきたいですね。(自分への言い聞かせ)

## 参考リンク

[投資の基礎知識](http://www.fsa.go.jp/policy/nisa2/knowledge/index.html)
Amazon Inspectorがkernelの古い脆弱性を検出し続ける

#現象
Linux EC2でkernelのセキュリティアップデートを適用したにもかかわらず、Inspectorが相変わらず古いkernelの脆弱性を検出する。
何ヶ月か運用していくと、ある程度古いkernelの脆弱性は検出されなくなるんだけど、さっき適用したkernelアップデートで解消するはずの脆弱性は引き続き検出されて「？」な事態に。

#原因
Inspectorは実行中のkernelのバージョンではなく、サーバにインストールされているすべてのkernelのバージョンについて脆弱性の有無をチェックしている。
通常、kernelのバージョンアップを実行しても古いバージョンのkernelはすぐには削除されず、サーバ上に何世代かはバックアップされている。

CentOSなら /etc/yum.conf に世代数が設定されている。
参考 https://qiita.com/testnin2/items/2946cc6bc54b0de96221
勉強会をゲーミフィケーションする

Livesense Advent Calender 2017-学- 3日目の記事です。

# まずは自己紹介
こんにちは。
マッハバイト（旧ジョブセンス）でディレクター？マネージャー？をしているasuciiと申します。
今年のLivesense Advent Calender、非エンジニアによる投稿一発目。
そこはかとなく漂う*場違い感*をものともせず、書いていきたいと思います！！（緊張）

リブセンスでは勉強会がとても盛んで、毎日社内でなんらかの勉強会が行われています。
私もその中で大きめの勉強会を主催して2年目になり、
ノウハウも溜まってきたのでせっかくの機会ということでここにアウトプットしようと思いました。

題して**「勉強会のゲーミフィケーション」**。
勉強会にゲーム的な要素をこうやって入れてます、というお話です。
なんだか難しそうですが実際はとても簡単です！

# ゲーミフィケーションとは…
少し前に流行ったキーワードですね。
「幸せな未来はゲームが作る」（ジェイン・マクゴニガル著）などの
信頼できるソースを辿っていくと、「ゲーム」に共通する特徴は下記の4つと言われています。

- **ゴール**
    - プレイヤーが達成すべき具体的な成果。プレイヤーの目的意識。
- **ルール**
    - プレイヤーがゴールに達する上での制約。
- **フィードバックシステム**
    - プレイヤーがどこまでゴールに近づいているかを示すもの。
    - 得点・レベル・合計点・進捗表示などの形で示される
- **自発的な参加**
    - 自分の意志で参加または脱退できる自由がある。

あなたの好きなゲームを思い浮かべても、これらの要素は必ずあるのではないでしょうか。
これらの要素を勉強会の中でも成り立たせることが可能です。

# 勉強会の内容
ここで勉強会の中身について軽く触れておきます。
勉強会といっても発表を聞いて終わりというタイプのものではなく、
自分が目標とするスキルを身につけるための社内研修だと思って下さい。
扱うテーマは、リブセンスで仕事をするさまざまな職種の人に役立つもの。
ロジカルシンキングなど思考系の勉強会が盛んですが、SQL、Excel、財務諸表、Webマーケティングといった実務に役立つスキルもいろいろと扱っています。

業務開始前や終了後に、同じ場所に集まって集団学習します。
そして**宿題がでます。**（ここがポイント）

# どうゲーミフィケーションしてるか
色々な取り組みの中で一番うまく行ってるのは**「レビュー＆講評」**システムです。
「ゲーミフィケーションするぞ！！」という感じで始めたわけではないのですが、結果的に良い感じにワークしています。
どういう流れかというと…

- まず宿題がでます。（提出期限は3日〜1週間程度）
- 宿題を提出したら、レビュー担当者が全員分の宿題に目を通し、コメントをつけます。
- レビュー担当者は自分の担当分の中から「皆のお手本にしたい」ものを選びます。これが講評です。
- 次回の「講評」コーナーで、レビュー担当者が誰のどの点がよかったかを皆の前で発表します。

たったこれだけです。
この中にどうゲーム要素が入ってるかというと…

- ゴール
    - **宿題を期限内に完成させる**というのがこの場合のゴールになります。
    - 回を重ねると**「講評にあがる」**という目標を設定する人もでてきます。
- ルール
    - 宿題をする人は役職、職種にかかわらず**皆平等に同じ期限で同じ宿題**をやります。
- フィードバック
    - 自分の提出物に対して**必ずコメントがつきます**。
    - 自分比で前回に比べて良くなったところを教えてもらえたりします。
    - さらに、特に良いアウトプットが出せたときには、講評という形で**皆の前で発表され、賞賛されます**。
- 自発的な参加
    - 業務外の勉強会のため、参加・脱退は自分の意思で決められます。

講評が発表されるときのドキドキ感も一つのスパイス。
自分の名前があがると「よっしゃー！」と喜びの声が上がることもあります。
さらに一度講評に上がるとその後人が変わったようにモチベーションが上がるなんてことも…。
褒められる、認められるって大事なことだなと日々感じます。

# まとめ
こうやって文字にまとめると「それだけなの？」という感じかもしれません。
とはいえ、シンプルで効果的な取り組みほど長く続けていけるものです。
あなたの会社、チームの教育にもゲーム要素を活かしてみてはいかがでしょうか？
属人化という人的SPOF(単一障害点)について

####■ 前提
***
下記に基本的な用語の説明を記載します。
「属人化」
特定の業務について特定の人しか行えない。やり方が展開されていない。つまりその人しかその業務を遂行することができない状態

「SPOF」
単一障害点。つまり、ひとつのコンポーネントで障害をきたすとシステム全体のコンポーネントで異常をきたしてしまう。

####■ 属人化の問題点
***
下記に属人化することでの問題点を記載します。

- 属人化タスクがあるチームのパフォーマンスは、開発全体の進捗低下につながる。ゆくゆくは秘伝のタレへ.....
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122901/675e7db4-1dc9-de06-55a4-4a9de7a3777d.png)

***

- 属人化されたタスクからアウトプットされた成果物に問題(バグ)が起きたときに他の開発者が対応できない。人的SPOFになりやすい。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122901/009c3cf9-824c-31ad-b432-0c3ec8aa0fef.png)

####■ 属人化になるまでの流れ
***
下記に属人化になるまでの流れを記載します。主に下記の2つがあると考えます。

#####*① 大規模プロジェクトのようなスピード感が求められている開発現場の場合*

- 下記図にあるようにどうしても「類似タスク」があると前同じようなタスクを行なった人のほうがスピード感が高いためPBIを振りがちです。そうすると下記でいう「Aタスク」が属人化しやすいです。※ ex. サーバ構築作業
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122901/2d445f33-3f36-90cf-9eeb-bfce6f7ff746.png)

#####*② 新しい開発者が入ってきた際にドキュメントなどがなく横展開ができていない場合*

- 2,3人の少人数チームの中で、少人数ゆえに口頭などでコミュニケーションが活発な仕事現場において、新しく2,3人の開発者が入ってきたときに「ドキュメント」や、サーバ構築であれば「サーバ管理ツール(Chef,Ansible)の設定ファイル」がないなどで、結果としてAタスクが属人化してBさんがAタスクを行うことへのハードルが上がります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122901/0dcd2a41-f905-9d9a-51ff-fbcc93f228db.png)

####■ 今後、属人化を起こさないための業務プロセス
***
下記に今後チーム内で属人化を起こさないために必要なプロセスを記載します。

| 三大ポイント | 
|:-----------|
|  ① 「ドキュメント管理」 : チームにノウハウがなく新しいことをするときはドキュメントやコメントを残す。      | 
|  ② 「コードの均等性 : ソースコードにおける属人化防止。    | 
|  ③  「スクラムチームによるタスク分配を均等にする」 :  Scrumで行っているのであれば作業が属人化しないようにそれぞれにタスクを分配する。※ 〇〇大臣を作らない。    | 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122901/e8c48b68-73fb-9187-b482-80873520192c.png)


####参考資料
https://developers.eure.jp/tech-management/advent-calender-17/
http://at-grandpa.hatenablog.jp/entry/2017/07/25/082252
【MSP記事】ちょっとまって！その不満、フィードバックHubに書いてみない？

*「もっと、こんな風な機能があったらいいのに」*
*「ここの操作性が悪くて使いにくい」*

あなたはどんなパソコンを使っていますか？Windows？りんごちゃん？それともペンギンちゃんですか？

どんなパソコンを使っていても、何かしらの不満が出てくると思います。そんな時、Windows10なら開発者に直接意見を出すことができる機能があります。

<img width="136" alt="62143a74e7ba92140b8db9d6803a5b99.png" src="https://qiita-image-store.s3.amazonaws.com/0/150188/c6469450-f307-9146-dbcd-5a532bf93f41.png">

*これは[Microsoft Student Partners アドベントカレンダー](https://qiita.com/advent-calendar/2017/mspjp)の3日目の記事です。*
*MSPって何？という方は[こちら](http://mizune.hatenablog.com/entry/2017/12/01/002031)！*

## フィードバックHub、使ったことありますか？
フィードバックHubは、Windows10の最初期からデフォルトでインストールされているアプリの一つです。あなたがWindows10を使っていて、特にアンインストールした覚えがなければスタートメニューの中に存在しています。

　<img width="766" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/150188/cbcae91a-7de5-717b-1c02-474062bb2b18.png">

フィードバックHubでは様々なユーザがいろいろなフィードバックを投稿しています。左側のタブからフィードバックを選んでみてみると、ユーザが投降したフィードバックの一覧を見ることができます。

<img width="766" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/150188/c7de9bdd-db79-4d08-7d29-bdd815747bd6.png">

## フィードバックHubに投稿する
Windowsユーザであれば、だれでもフィードバックHubに登録することができます。
フィードバックタブの新しいフィードバックの追加から、あなたの持っている問題や提案を追加してみてください。

フィードバックHubには、Windows自身または付属機能に関する問題や提案を投稿することをおすすめします。例えば、以下のような問題を言います。

- Microsoft IMEの変換精度について
- タブレットモードでの動作について
- ペイント3DのUIについて
- Edgeのテーマについて

逆に、以下のような問題はフィードバックHubではない別のサイトを利用するのが良いでしょう。なぜならそれはWindowsのせいではない可能性が高いからです。

- インターネットに接続できない
- 動作速度が遅い
- 音が出ない
- 画面が割れてしまった

## 実例
最後に、私が提出した問題を紹介したいと思います。

<img width="766" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/150188/59db0799-07f4-aabb-48a8-5d3a514e0241.png">

SkypeのWindowsアプリがリリースされたころ、Windowsに紐ついたアカウントでなければSkypeを利用することができませんでした。
私はそれが非常に不便だったので、フィードバックHubに投稿したところ、最新版で解決済みなのでアップデートしてね！(超意訳)と開発者から返信をもらうことができました。

## さいごに
フィードバックHubは、インターネット上のQ&Aコミュニティーとは違いMicrosoftの開発者に直接意見を出すことができます。

Windows10に対して改善点や不満点をお持ちの方。ぜひ、フィードバックHubに投稿してみてはいかがでしょうか。
Counterparty DEX に BTC が上場できない理由

## おさらい

2日目の記事で、下記2点を確認しました。

* Counterparty のメッセージは `OP_RETURN` という特殊な命令の後ろに隠れている
* Bitcoin-core からは Counterparty のメッセージは認識できない

Counterparty のメッセージは、ブロックチェーンという道路を走る Bitcoin という車の、屋根に乗っているようなものです。
車内(Bitcoin)からは見ることができませんし、屋根(Counterparty)から車内を覗くこともできません。

## Counterparty DEX で BTC/XCP 注文が約定しない理由

Counterparty にとっての FAQ なのですが、Counterparty DEX では BTC/XCP の注文は受け付けられるものの約定しません。
XCP だけでなく対 BTC の取引は同様に約定しません。

この仕様となっている理由は…答えを先に書きます。
「BTC の売り注文を出した人が、トークンをだまし取ることが可能であるから」です。

この仕様を理解するには、Bitcoin ブロックチェーンと Counterparty メッセージとの関係の理解が要ります。

## 騙しの手口

ブロックチェーンのお約束に従って、Alice と Bob にご登場いただきましょう。悪者は Bob に演じて頂くことにします。

0. 話を簡単にするために BTC/XCP の板には何の注文もないことにします。
0. 悪者 Bob は「1BTC 払って 1500XCP を買いたい」という注文メッセージを送信します。
0. メッセージがブロックに採り込まれ、Counterparty server が板情報を更新します。
0. 板情報の更新を確認した Bob は、1BTC を別のアドレスに移動します。
0. Alice は「1500XCP を払って 1BTC を買いたい」という注文メッセージを送信します。
0. メッセージがブロックに採り込まれ、Counterparty server がマッチングを実行し、Alice の 1500XCP を Bob のアドレスへ移動します。
0. Bob の 1BTC は別のアドレスに移動済みなので Counterparty server は何もできません。
0. Alice の丸損です。

Counterparty 内のトークン同士の場合には、注文メッセージの送信により売りたいトークンはロックされます。
具体的に、仮に Bob が「1500BANANA を払って 1500XCP を買いたい」という注文を出した場合、約定するかタイム・アウトするまで 1500BANANA は他の用途には使えません。
よってこのような問題は起きません。

Counterparty は Bitcoin の屋根に乗っているため、Bitcoin の送着金とは無関係であり、ロックを掛けられないのです。

## 対策案

どうしても BTC/XCP のトレードをしたい場合、atomic swap が解決策の一つとして考えられます。
atomic swap の説明は他に譲りますが、普通は Bitcoin と Litecoin との間の送金など、無関係なチェーン間での価値交換に用いられる技術です。
同じ Bitcoin ブロックチェーンに相乗りしている Counterparty と Bitcoin での使用が検討されるのは不思議に思えるかもしれませんが、いままで説明してきたとおり、両者は実質的に別の価値記録です。よって検討に値することになるわけです。

## 現実

しかし Coutnerparty では atomic swap が実現されていません。どうやら主な理由は下記のようなもののようです。

* atomic swap は 4トランザクションをやり取りする必要があり、ブロック承認間隔が 10分程度の Bitcoin では時間がかかって萎える
* BTC も XCP もオフチェーンで購入する手段がいくつもあり、頑張るだけ時間の無駄

## Monaparty の場合

「対策案」の項は、Counterparty と Monaparty 両方で当てはまることでした。
しかし「現実」の項は Counterparty 側にたった現実です。

ブロック承認間隔が 90 秒と短く、MONA は買えても XMP は買えない、そんな現時点での Monaparty では、どうでしょうか。
atomic swap 実装はコストをかけるに充分なものかもしれません。

## まとまっていないまとめ

BTC/XCP (MONA/XMP) が DEX で約定しない理由をブロックチェーンに近い側から概説しました。

2億円近い価値が burn により閉じ込められた XMP ですから、MONA/XMP の取引を可能にした方はクリプト界のヒーローに一躍躍り出ることでしょう。(大げさ?)

どなたか挑戦してみませんか？ [実験コードならあるっぽい](https://github.com/rubensayshi/counterparty-p2sh-demo/blob/b104f4ac6c871ef8a653db0c6594a4a39792e163/atomic-swap.js#L164)ですよ。
PHP勉強[ #0 事前勉強 ]

#PHP勉強　#0 事前勉強
##PHPとはなんぞや
　Web開発にてよく使用される[スクリプト言語](https://www.weblio.jp/content/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E8%A8%80%E8%AA%9E)。
　多くのOS,サーバ環境に対応しており、手続き型、オブジェクト型を選択、混在させることができる。
　JavaScriptとの大きな違いはコードの実行されるタイミング。
　　- JavaScript：クライアントサイト（ブラウザ）
　　- PHP：サーバサイド
　　　※そのため、PHPがインストールされたWebサーバが必要となる
　広域なデータベースに対応しており、データベース機能を用いたWebページの作成が容易。
　【PHPでできること】
　　- セキュアなサーバサイドでの実行ができる
　　- HTMLの生成
　　- データベースとの連携
　　- イメージやPDF,Flashムービーを生成することができる
　　- スクリプト言語でできること
　[参考HP]
　　- [今さら聞けない！PHPとは【初心者向け】](https://techacademy.jp/magazine/6618)
　　- [PHPとは](http://php.net/manual/ja/intro-whatcando.php)
##PHPの記述方法（簡単な部分）
#####特徴
 初心者向けとされている要素としては以下。
　- 関数が豊富
 ファイルの拡張子は「.php」、基本的にはHTMLにphpタグを使用して埋め込む記法を用いる。
##MAMPとはなんぞや
　MAMP(マンプ※)はPHPやWordPres等の開発環境（ローカル環境にてWebサイトを開発できるソフトをまとめてインストール、実行できるパッケージ）。
　　※MAMPとは「Macintosh」「Apache」「MySQL」「PHP」の頭文字
Perl のエラーメッセージをちょっときれいにしてくれるツールを書いた

手前味噌で恐縮ですが、
Perl のエラーメッセージをちょっときれいにするような 
[ppe](https://metacpan.org/pod/release/KFLY/App-PPE-0.04/script/ppe) というツールを書いてみました

名前は、Prettify Perl Error messages の頭文字からとりました
install は、`cpanm App::PPE` で出来ます

# 使い方

## 例1

こんなコードがあったとして

```perl:foo.pl
use strict;
use warnings;
 
my $str;
warn $str;
```

普通に実行した時、次のようなエラーメッセージが表示されますが
![image.png](https://qiita-image-store.s3.amazonaws.com/0/10717/50e8fb3f-309d-bc7f-273b-53bdaaa26134.png)

ppe に食わせてみると次のようになります
![image.png](https://qiita-image-store.s3.amazonaws.com/0/10717/a3d37b95-30b9-700b-c129-ea82b2c950c7.png)

## 例2

同様にこんなコードがあったとして

```perl:bar.pl
use strict;
use warnings;
 
sub f {
```

次のような具合になります

![image.png](https://qiita-image-store.s3.amazonaws.com/0/10717/569a259e-0065-5f98-556f-d69de488126d.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/10717/f9e1a17c-783c-6ad1-e4df-2985daffd55f.png)

フォーマットは、`ファイル名:該当行: [タグ] (エラー分類) メッセージ` にしています
エラー分類の詳しいことは、[perldiag](https://perldoc.perl.org/perldiag.html) を参照ください


多少、見やすくなっているといいなーと思うのですが、
いかがでしょうか・・？

以上です!
Redux でクソゲー作成60分チャレンジした


# 成果物
サイト: https://elzup.github.io/pwaa/#/
Repository: https://github.com/elzup/pwaa

ぷわーは PWA からとってます。

![kusoge-.gif](https://qiita-image-store.s3.amazonaws.com/0/40717/729bfee0-af9c-ab90-3957-e6b0fbe4865e.gif)

# 使ってるもの

* Flowtype
* Redux
* [s2s](https://github.com/akameco/s2s)
* [react-router](https://reacttraining.com/react-router/)
* [redux-persist](https://github.com/rt2zz/redux-persist)
* [create-react-app](https://github.com/facebookincubator/create-react-app)
* [styled-jsx](https://github.com/zeit/styled-jsx)

* オレオレ boilerplate


# 実装しようとしたもの
* 何かゲーム
    * 記録くらいはしたい

# 実装したもの
* 連打ゲーム
* 最高記録を保存
* タイム表示
* 前回の記録表示


# 作業動画
1時間作業動画を残してみました。
https://www.youtube.com/watch?v=mQLDTdmuAB8

(後から気づいた致命的なミスなんですがエディタほとんど見切れてました笑)
動画に残す時は手元で録画するより配信してしまったほうがPCが軽そうです。

ラスト GitHubPages へのデプロイで手間取ってますが react-router 関係でした。



# 感想
1時間でこんなものしか作れないのかという感じです。この程度のゲームなら最低限の style まではいきたかったです。
ミニゲーム集が作りたいので、これをベースに追加していこうと思います。

本格的にゲーム作るろうとするときにいつも面倒に思うのは「ゲーム開始演出」とか「終了時の勝敗演出」です。Flux なアーキテクチャでゲームを作ったのは初めてだけどそれは変わらないなと思いました。

画面サイズ変えたの忘れてて作業動画が見切れてたの本当悲かった。
【ほぼ自分語り】僕がVimを使い始めた理由とSpaceVim

この記事は [チームスピリット Advent Calendar 2017](https://adventar.org/calendars/2207) の3日目の記事です。中級以上の
 Vimmer にはほとんど関係のない話になります。

## Vim のなにがいい?

* 豊富なプラグイン
* 無理のないキーマッピング
* **テキストオブジェクトという概念**

## Vim との出会い

* 大学に入って初回のプログラミング講義が Vim の講座だった。
* 初回講義だけ Vim を使わされた。

## Vim への最初の印象

* 言語に沿った補完はない。文法チェックもインスペクターもない。Emmet/ビルド/デバッグ/実行機能もない。
* `H`, `J`, `K`, `L` がどうやったら左下上右と認識できるのか教えて欲しい。
* 入力を終える度に `Esc` を押しにいくのは面倒くさい。しかも押しにくいキーでもある。
* 便利と言いつつ紹介してきた教授すら操作がもたつく。
    * その教授は普段は gedit 使いだったそう。なぜ薦めてきた。

## Vim の凄い奴に出会った

1. 最初に就職した会社で Vim の凄いやつに出会った。
1. 「え!? コーディングに!? Vim!? 大丈夫!?!?(笑)」みたいなノリだったが、華麗なコーディング作業を見て閉口。
    * **キャレットの移動にほとんど時間を使っていない。** 編集する箇所に自由自在にカーソルが飛ぶ。
1. 「び、Vim キーバインドじゃなくてもエディタ機能でそれ位できるし!」と心の中で強がる。だがキーバインドを覚えてないし、普段使ってもない。

### 冷静に考えてみた

* 先程の「**機能はたくさんあるけど覚えきれない**」は普通のエディタの最大の泣き所。普通のエディタは入力モードしかない上に1入力1操作という原則があるので使えるキーマップが少ない。そうすると操作内容と全く脈絡のないキーにマッピングせざるを得ないのである。
* コーディングというのはコードを書く時間よりも、書かれたコードを読む時間や修正する時間の方が圧倒的に長かったりする。そう考えると、一度入力モードから抜けてから、カーソルの移動を楽に行えるようにするというのは理にかなってる。

## Vim を使い始めた

1. 最初はシェルで `vimtutor` を実行してチュートリアルから始める。
1. 普段使っている IntelliJ IDEA や VSCode にプラグインを入れて Vim のキーバインドにしてみる。
1. Neovim の設定ファイルをカスタマイズし、仕事に必要な機能(Emmet/構文ハイライト/チェッカー/Linter/フォーマッター/ランナー)や Fuzzy Finder などをプラグインで補う。

## Vim を使ってみて分かったこと

* **最初の1ヶ月は進捗が犠牲に。**
* Vim の恩恵を受け始めたのは2ヶ月を超えたあたりから。

* **`H`, `J`, `K`, `L` が左下上右にしか見えなくなってきた。**
* テクスト編集系のマッピングは多そうに見えるが、そのほとんどが実は **モーション + テキストオブジェクト** のマッピングになっているので覚えることはそこまで多くない。
    * `ci"` -> **C**hange **I**nner `"` -> `"` で囲まれた中のテキストを編集
    * `da"` -> **D**elete **A**round `"` -> `"` で囲まれたテキスト( `"` を含む)を削除
    * `dip` -> **D**elete **I**nner **P**aragraph -> キャレットのある段落を削除
* `Esc` は押しにくいというのは Vimmer の間でも共通する認識であり、殆どが `Ctrl-[` で代用するか `jj` にリマップしている。
* プラグインのほとんどは遅延ロードに対応する設計になっており、とにかく起動が早い! `dein.vim` という神器を使いこなすことでプラグインを200個入れても0.7秒程度で起動します。
    * [dein.vim](https://github.com/Shougo/dein.vim) というプラグインマネージャーは複数のプラグインのファイルを結合して
 `state` と呼ばれるファイルを生成することで、プラグインのロード時間を爆速にします。
    * 0.7秒もそこそこ長いのでシェルで作業するときは `Ctrl+Z` で suspend するか画面分割を使います。
* 使いこなせば便利! しかしカスタマイズが面倒くさい! **最初からプラグイン込みでセットアップされた Vim が欲しい!**

## SpaceVim

![SpaceVim](https://qiita-image-store.s3.amazonaws.com/0/102243/29f8b3f4-86c4-64b4-4914-d359f7a5d5b5.png)

[SpaceVim/SpaceVim: A community-driven vim distribution inspired by spacemacs](https://github.com/SpaceVim/SpaceVim)

* 厳密には Vim ではなく、膨大な Vim の設定ファイルである。Vim と Neovim に対応している。予め200個近いプラグインがインストール&セットアップされている。
* レイヤーという概念があり、ユーザーはプラグイン単位ではなく、利用する機能によってレイヤー単位で使うか使わないかをカスタマイズする。
* キーバインドをど忘れしても、最初のキーを押せばガイドが表示されるので、キャッチアップしやすい!
* 一部 Vim の標準キーバインドを上書きするので賛否両論がある。

## SpaceVim を使ってみて分かったこと

* とにかく便利機能が多い!
* ドキュメントが圧倒的に少ない＆古い!
* ドキュメントが少なすぎてソースコードを直接読む -> PR で小さな修正を送り続ける -> いつの間にか SpaceVim のコミュニティ入りに。
* 使おうと思ってる機能が既にセットアップされているのは嬉しい! **が、今の所キーマッピングを調べる時間で相殺されている。**

## SpaceVim 結論

* SpaceVim は正直言ってポテンシャル採用している部分はある。
* Vim 全体に言えることだが、やはりプラグインの組み合わせではIDEの言語機能の品質を完全には到達できないというのが現状。
    * Vim はすぐに使えるという反面、ワークスペースやプロジェクトの情報を殆ど与えられていない。
    * 複数のプラグインで実現したとしても、プロジェクトのコードを解析するデーモンがプラグイン別に2つ走ったりするので効率もよろしくない。
    * しかし Language Server の普及により、近い将来的に IDE 並の言語機能が Vim から扱えるようになると思っている。
* 多くの人が同じような `.vimrc` を記述するのに時間を費やすのは無駄だよね、というモチベーションで支持しているし、たまにPRを送る。

おしまい。
新人エンジニアがコードレビューを受ける側としての頑張りどころ

# 忙しい人のために結論

Atomって便利だよって話。

# 1.エンジニア初期 〜ひたすらいろんなところにレビューを受ける頃〜
レビューを受けすぎて毎回お願いしたりとか、
先輩エンジニアの無駄な時間を割くのが心苦しく声をかけずらい。



## 最初の改善
「聞きたいことをまとめて質問してみる」とか「決まった時間に声かけてみる」などの方法を試してみたが、いまいち正攻法な気がしてない。
先輩エンジニアの空いている時間を気にしつつ、Slackを投げたり直接声かけたりプログラミング以外にも気を張ってしまい気疲れが発生。

分からないことを質問する繰り返しになり、質問を聞かれる側にメリットが見出せない。
**こんな状況を打破したい。**

## 2番目の改善で行ったこと
聞き方を工夫するのではなく自分の仕事を自分で見つめ直した。

最初の内は仕事を早くこなせるようになりたいって
どんどん前に進みたくなり、仕事で手一杯になってしまう。
なら**考えないで改善しよう。**


例えば、空白やインデント、文法の一貫性など
考えなくても治せるできる部分は自動化しよう。


##実際に行うべきこと

#### **エディターで制約をつける**



### ミスタイプの監視
・空白やインデント(lintの導入)
[linter](https://atom.io/packages/linter)
[auto-indent](https://atom.io/packages/auto-indent)
[show-ideographic-space](https://atom.io/packages/show-ideographic-space)

→ **お、エディターで解決**

### 作業の効率化
・ GitやコマンドラインをAtom上から操作
[git-plus](https://github.com/akonwi/git-plus)
[terminal-plus](https://github.com/jeremyramin/terminal-plus)
→ **お、エディターで解決**

### コミュニケーションの効率化
slackやstackoverflowをAtom上から操作
[slack-chat](https://atom.io/packages/slack-chat)
[ask-stack](https://atom.io/packages/ask-stack)
→ **お、エディターで解決**


あれ、全部解決？

# その他Atomで最近やってること

####ペアプロ(共同編集ができる)
[Teletype for Atom](https://teletype.atom.io/)

#### タスク管理
[imdone-atom](https://atom.io/packages/imdone-atom)


#### markdown
[Atom をMarkdownエディタとして整備](https://qiita.com/kouichi-c-nakamura/items/5b04fb1a127aac8ba3b0)

#結論
####全部Atomで完結。

Atomは簡単にパッケージを入れられるのでおすすめです。
パッケージの豊富さやバリエーションはこの記事参照!
[Atomと遊ぼ?](https://qiita.com/onigirimantarou/items/ec6ef5eaf948230f27d7)









# 以上 2017年の振り返り。
Bokehで正規分布の確率密度関数の特定区間の面積の計算を可視化する．

# 本日は

- [正規分布の確率密度関数の形があやふやになった時の対処法](https://qiita.com/SatoshiTerasaki/items/d884d26ab7320304cb81)

の続きとして正規分布のが持つ確率密度関数の可視化と特定区間の面積を可視化しましょう．

# 実装例

```py3:distribution.py

import numpy as np
from scipy import integrate
from scipy.stats import norm
from bokeh.models import ColumnDataSource, LabelSet
from bokeh.models.widgets import Slider, RangeSlider, Div
from bokeh.plotting import figure, show, output_file
from bokeh.layouts import row, widgetbox
from bokeh.io import curdoc

def func(xs, mu, sigma):
    return 1/(sigma*np.sqrt(2*np.pi))*np.exp(-(xs-mu)**2/(2*sigma**2))
    # return norm.pdf(xs,mu,sigma)


def get_patches(a, b, xs, mu, sigma):
    mask = np.all([a <= xs, xs <= b], axis=0)
    xs2 = xs[mask]
    ys2 = func(xs2, mu, sigma)
    xs2 = np.concatenate([[a, a], xs2, [b, b]])
    ys2 = np.concatenate(
        [[0, func(a, mu, sigma)], ys2, [func(b, mu, sigma), 0]])
    return xs2, ys2

a, b = -1, 1
mu = 0
sigma = 1
xs = np.linspace(-5, 5, 100)
ys = func(xs, mu=mu, sigma=sigma)


p = figure(x_range=(-5, 5), y_range=(-0.05, 0.5))
source = ColumnDataSource(data=dict(xs=xs, ys=ys))
p.line('xs', 'ys', source=source)

ab_slider = RangeSlider(title='a_b', value=[a, b],
                        start=-5, end=5, step=0.1)
mu_slider = Slider(title="mu", value=0,
                   start=-5.0, end=5.0, step=0.1)
sigma_slider = Slider(title="sigma", value=b,
                      start=0.1, end=5.0, step=0.1)
info = Div(text='integral value= {}'.format(
    integrate.quad(lambda x: func(x, mu, sigma), a, b)[0]))


labels_source = ColumnDataSource(
    data=dict(xs=[a, b], ys=[0, 0], names=['a', 'b']))
labels = LabelSet(x='xs', y='ys', text='names', level='glyph',
                  x_offset=-3, y_offset=-15, source=labels_source,
                  render_mode='canvas')
p.add_layout(labels)

xs2, ys2 = get_patches(a, b, xs, mu, sigma)
patches_source = ColumnDataSource(data=dict(xs=[xs2], ys=[ys2]))
p.patches('xs', 'ys', fill_color='blue', alpha=0.5, source=patches_source)
output_file('brewer.html', title='brewer.py example')


def update(attr, old, new):
    a, b = ab_slider.value
    mu = mu_slider.value
    sigma = sigma_slider.value
    ys = func(xs, mu, sigma)
    xs2, ys2 = get_patches(a, b, xs, mu, sigma)
    source.data.update(dict(xs=xs, ys=ys))
    labels_source.data.update(dict(xs=[a, b]))
    patches_source.data.update(dict(xs=[xs2], ys=[ys2]))
    info.text = 'integral value= {}'.format(
        integrate.quad(lambda x: func(x, mu, sigma), a, b)[0])

ws = [ab_slider, mu_slider, sigma_slider]
for w in ws:
    w.on_change('value', update)
w = widgetbox(*ws, info)
root = row([w, p])

document = curdoc()
document.add_root(root)
```

# 実行例

```shell-session
$ bokeh serve --show distribution.py
```

ブラウザが立ち上がり下の図ようになります．

<img width="678" alt="スクリーンショット 0029-12-03 午後1.36.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/135978/be20b437-c655-89ee-9f8f-d9d0ca9cdabc.png">

　`mu` `sigma` `a` `b` のパラメータを動かして遊んでみてください．

ここでは1シグマ区間　$[-\sigma, \sigma]$ 上にある確率密度関数の面積を青色ゾーンで示しています．この値は約６８％になることが知られているのですが，実際になっているようですね．
Cloud9にPHP7 + Lumenをインストール


PHPでAPIを作りたかったので **LARAVEL** ベースの軽量フレームワーク **Lumen** を使いました。

今回はAPIだけなのでマイクロフレームワークを選択しました

Cloud9にはデフォルトではPHP5系がインストールされているので7系をインストールしLumenをインストールします


## PHP7インストール
まずは[このサイト](https://community.c9.io/t/laravel-5-3-installation-on-cloud9/9038)を元にPHP7をインストール

``` bash
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install libapache2-mod-php7.0
sudo a2dismod php5
sudo a2enmod php7.0
sudo apt-get install php7.0-dom
sudo apt-get install php7.0-mbstring
sudo apt-get install php7.0-zip
```

### PHPのバージョン確認

以下のコマンドでPHP7がインストールされている確認

``` bash
php -v

# 以下のように表示されていれば正常にインストールされている
PHP 7.0.26-1+ubuntu14.04.1+deb.sury.org+1 (cli) (built: Nov 29 2017 10:01:47) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.26-1+ubuntu14.04.1+deb.sury.org+1, Copyright (c) 1999-2017, by Zend Technologies
```

### MySQL用ドライバーインストール
PHP7のMySQL用ドライバーをインストールする

``` bash
sudo apt-get install php7.0-mysql
```


## Lumenをインストール
Composerを使ってLumenをインストールします
今回はtestと言うプロジェクト名で作ります

``` bah
composer create-project --prefer-dist laravel/lumen test
```

## Lumenの初期設定

### .envファイルの設定

APPKEYの設定とDBの設定を行います
DBの設定はCloud9の初期設定状態となってます。

```diff
APP_ENV=local
APP_DEBUG=true
- APP_KEY=
+ APP_KEY="EttTJfhKALNC_37cggwwbbRu6QeXXzsaj9c4fnfK_ZN2jz6Ly8ML_6UQKLP7_-2Q"
APP_TIMEZONE=UTC

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
- DB_DATABASE=homestead
- DB_USERNAME=homestead
- DB_PASSWORD=secret
+ DB_DATABASE=c9
+ DB_USERNAME=root
+ DB_PASSWORD=

CACHE_DRIVER=file
QUEUE_DRIVER=sync

```

## MySQLの起動

初期起動時にはMySQLは起動していないので以下コマンドにてMySQLを起動します

``` bash
mysql-ctl start
```

## apacheのルートディレクトリの変更
apacheのルートディレクトリをLumenのpublicディレクトリに変更します。

``` bash
sudo vi /etc/apache2/sites-enabled/001-cloud9.conf  
```

以下のように/etc/apache2/sites-enabled/001-cloud9.confのDocumentRootを/home/ubuntu/workspace/{プロジェクト名}/publicに変更します

```diff:/etc/apache2/sites-enabled/001-cloud9.conf
<VirtualHost *:8080>
-    DocumentRoot /home/ubuntu/workspace
+   DocumentRoot /home/ubuntu/workspace/test/public
    ServerName https://${C9_HOSTNAME}:443

    LogLevel info

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <Directory /home/ubuntu/workspace>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

ServerName https://${C9_HOSTNAME}
search hit BOTTOM, continuing at TOP  
```


## 起動確認
![アセット_1.png](https://qiita-image-store.s3.amazonaws.com/0/43289/495ea7d5-b1f8-6f33-b05c-b8640de8db32.png "アセット_1.png")
上記スクリーンショットの通り「Run Project」を押下し

**https://{プルジェクト名}-{ユーザ名}.c9users.io/**

にアクセスし以下の通り表示されれば完了です
![アセット 1.png](https://qiita-image-store.s3.amazonaws.com/0/43289/61a4d91d-0747-1695-68b7-760ba360e8fd.png "アセット 1.png")
Windowsで特定のポートを使用しているプロセスを停止する方法

##特定のポートを使用しているプロセスを探し、強制終了する
###手順
1. netstatで対象プロセスのPIDを取得
2. taskkillで対象プロセスを終了させる

```:使用するコマンド
netstat -aon | find "[探したいポート番号]"
taskkill /f /pid [終了させたいPID]
```

```:実行例
8080番ポートを使用しているプロセスを終了させる場合

netstat -aon | find "8080"
TCP         0.0.0.0:8080           0.0.0.0:0              LISTENING       12104
TCP         [::]:8080              [::]:0                 LISTENING       12104

ここでは１２１０４がPIDとなっているので、続けてtaskkillする

taskkill /f /pid 12104
成功: PID 12104 のプロセスは強制終了されました。
Swift用アニメーションエンジンを作り始める



Quadアドベントカレンダー3日目の記事です。

今年は7本記事を書く必要があるので連載ものにしたいと思います。
最近はSwiftのプログラミングばかりなので、Swiftでアニメーションを作る場合の方法を探って見たいと思います。昔の記事でTimerを使ったゲームループもどきを作りましたが、もっと良いやり方がありました。

## CADisplayLinkを利用する
iOSではCADisplayLinkを利用してループが作れるます。Timerと比較すると、こちらの方がディスプレイのリフレッシュレートと同期するのでiOSもこちらの利用を想定しているようです。(簡単に考えるとこちらの方が無駄がないぐらいの認識で良いです。)

[CADisplayLinkの詳細](https://developer.apple.com/documentation/quartzcore/cadisplaylink
)はこちらで

## 試してみる。
今回のコードは全てViewContorller.swiftに記述しています。viewDidLoad()に追加しています。

### CADisplayLinkインスタンスを作成

```swift

/// 引数にコールバックのメソッドを指定するようです
self.updater = CADisplayLink(target: self, selector: #selector(self.loop(_:)))
```

loopメソッドも定義しておきます。

```swift
@objc func onLoop(_ sender:AnyObject) -> Void {
    print("loop") // コンソールにloop文字列を表示しづづける。     
}
```

### フレームレートの設定
60FPSに設定して見ます。

```swift
updater!.preferredFramesPerSecond = 60
```

### スレッドに登録

ここまでではまだ動きません、スレッドに登録することで動き始めます。RunLoopのことはまだあまりわかっていませんが、RunLoop.currentはおそらくメインスレッドかと思います。

```swift
updater?.add(to: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode)
```


これで実行すると、コンソールに「loop」という文字列が表示され続けますね。FPSを変更することで、表示回数が変わることが確認できます。

もう少しだけ面白くしましょう。
矩形でも動かして見ましょう。


```swift
let v:UIView = UIView(frame: CGRect(x: 50, y: 0, width: 10, height: 10))
```
背景色赤にしておきます。

```swift
v.backgroundColor = UIColor.red
```

```swift
@objc func onLoop(_ sender:AnyObject) -> Void {
    print("loop") // コンソールにloop文字列を表示しづづける。
    self.v.frame.origin.y += 2     
}
```

これで縦に移動する矩形が表示されました。簡単にアニメーション作れることはわかったので、ここから応用していきたいと思います。
続きは次回へ
pySpherepts > getHammersleyNodes()移植完了 > IcosNodesと比べて中心からの距離が小さい?

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
```

[pySpherepts > on GitHub > 球面上の点: Icosahedral Nodesを取るNumpy+Scipy実装](https://qiita.com/7of9/items/3f81de6d1b2337ac6a9e)
の続き。


getHammersleyNodes()の移植が完了した。

実際に使ったところ、気になる点が見つかった。

### 気になる部分

[Jupyter Notebook on GitHub](https://github.com/yasokada/pySpherepts_171126/blob/master/samplePlotSphNodes_gHN_171203.ipynb)

```py3:samplePlotSphNodes_gHN_171203.ipynb
'''
HammersleyNodes 
'''

import numpy as np
from pylab import rcParams
import getHammersleyNodes_171203 as gHN
import plotSphNodes_171127 as pSN

rcParams['figure.figsize'] = 10,10
rcParams['figure.dpi'] = 75

xs = gHN.getHammersleyNodes(100)

elev, azm = 30.0, -30.0

#NG: hidden by the central sphere
pSN.plotSphNodes(xs, elevation=elev, azimuth=azm)

# *1.05: required not to be hidden by the central sphere
pSN.plotSphNodes(xs * 1.05, elevation=elev, azimuth=azm)

print(xs)

```

一つ目のplotSphNodes()による図では球上の点が見えない。
(中心の大球で隠れてしまっている)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a3a2a096-cde5-a3df-85b8-5006a0f7db4a.png)

二つ目の図（点の中心からの距離を増やした）の場合は以下となる。
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/7b31c9ea-d781-86f9-b92c-2be9ba179f8e.png)

MATLABコードの結果は以下で、二つ目の図と分布はほぼ同じになる。
（距離を増やした分のずれはある）。
（距離を増やさない場合での両者の値は一致している）。
（azimuthの違いのため、view(60,30)としている）。
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/70f3c55c-0210-698b-cc34-40338a6a2e9c.png)

### getIcosNodes()との違い

- getIcosNodes() : 点が隠れない
- getHammersleyNodes() : 点が隠れる

両者の点分布生成結果に関して、中心からの距離が異なるように思われる。
この場合、二つの結果を使った計算（例：球殻積分）結果を比較すると誤差を生むかもしれない。
Twilio のマスターアカウントとサブアカウントについて

[Twilio Advent Calendar 2017](https://qiita.com/advent-calendar/2017/twilio) の3日目となります。

Twilio にはアカウントの管理の概念として「マスターアカウント」と「サブアカウント」があります。
Twilio で受託開発をしたり、サービス運営をしたりする上で重要な概念ですので、注意点を含めて解説していきます。

## マスターアカウントとは
**追記 新しくなった Twilio コンソールからマスターアカウントの呼び名が変わり、"プロジェクト" と呼ぶようになったそうです。以下、マスターアカウント = プロジェクト として記載します。**

Twilio で管理するメインのアカウントです。マスターアカウントには複数のユーザーが所属することができます。それぞれのユーザーには権限があり、「オーナー」、「管理者」、「開発者」、「経理」の4つがあります。 Twilio を最初に使い始めたユーザーがオーナーとなります。

私たちと関係の深そうな「開発者」権限は、課金情報やサブアカウントの作成以外ができるアカウントです。電話番号の追加などもできるので、それなりに権限の大きな役割となります。

さて、マスターアカウントには複数のユーザーが所属できると書きました。つまり、1つのメールアドレスで、複数のマスターアカウントに所属することも可能です。その方法は簡単で、ホーム -> 設定 -> ユーザー管理からユーザーを追加するだけです。

1つのメールアドレスで複数のマスターアカウントに所属すると、以下のようにヘッダからアカウントの切り替えが可能になります。

![スクリーンショット 2017-12-03 12.44.59.png](https://qiita-image-store.s3.amazonaws.com/0/11103/f3285c61-8711-dfeb-51a2-3aaea97d4d56.png)

これで、それぞれの権限でそれぞれの Twilio コンソールが見られるようになります。

## サブアカウントとは

サブアカウントとは、マスターアカウントが管理する Twilio のアカウントです。

サブアカウントごとに電話番号の管理やそれぞれのデータを完全に切り分けることができるので、マスターアカウントを複数持っている状態に近いと言えます。

サブアカウントを作成するには、Twilio の [SubAccont API](https://jp.twilio.com/docs/api/rest/subaccounts) を呼ぶか、手動でサブアカウントを作成するかで対応できます。

作成したサブアカウントは、Twilio コンソールの右上メニューより切り替えることができます。

![スクリーンショット 2017-12-03 12.50.20.png](https://qiita-image-store.s3.amazonaws.com/0/11103/c8ce4568-a948-a20b-ca4e-3947a34acee3.png)

サブアカウントを切り替えたあとは、基本的には そのサブアカウントでログインした状態として Twilio コンソールを扱うことができます。

## 複数のマスターアカウントとサブアカウントの使い分け

さて、ここからが本題です。どのように複数のマスターアカウントとサブアカウントを使い分ければ良いのでしょうか。

最も大きな違いは「決済方法」でしょう。クレジットカード情報を登録できるのは、「マスターアカウント」だけです。つまり、それぞれのアカウントで決済するカードを変えたい場合には複数のマスターアカウントにせざるを得ません。反対に、サブアカウントで使った Twilio 料金はそのマスターアカウントで決済することになりますので、決済を一元管理したい場合にはサブアカウントで運用する流れとなります。

Twilio を使ってサービスを運営する場合にはサブアカウントは大変便利なものですが、何点か注意点もあります。その一つとして、**通話の録音料金はマスターアカウントでしか取得できない**というのがあります。サブアカウントごとに今月の通話料などは API を通じて取ってこれるので、例えばサブアカウントごとで別の支払い方法で請求することは可能です。しかし、実際にはサブアカウントごとに録音も蓄積されていくわけですが、この料金がなんと取ってくることができません。。これは録音が今までの総蓄積量を月初に一括で請求する仕様だからなのかもしれません。

サブアカウントごとに録音料金も一緒に計算したい場合には、Twilio の RecordingsAPI で総録音分数を取得し、サブアカウントごとに削除した録音分数を引くような処理が必要です。最終的にこの面倒な方法に落ち着きましたが、他にいい方法があれば教えてください。

ちなみにサブアカウントはアカウントごとクローズすれば、そのサブアカウントで持っていた電話番号料金や録音料金など、そのサブアカウント単位の全ての請求が止まるのは魅力的です。例えばサブアカウントで利用していた契約を削除したいって場合にはわざわざ電話番号や録音を消す必要がなくなります。また、サブアカウントは API をうまく利用すればお客様に Twilio の存在を全く知られないままサービスを始めていただくことができるようになります。お客様の方で Twilio とサービス側それぞれにお金を払うみたいな複雑なフローを組ませなくていいのは大変魅力的です。

実は大きな違いはこれだけです。そのため、サービス運営側でデータベースに `AccountSID` と `AuthToken` だけ保存しておけば、実質複数マスターアカウントでもサブアカウントでも同様のコードでほとんどがうまくいきます。

例えば通話料がとても大きな企業にはそれぞれマスターアカウントを持ってもらうようにし、決済金額が低い企業にはサブアカウントで一括管理みたいな柔軟な運用も可能になることでしょう。

## 終わりに
本記事ではマスターアカウントとサブアカウントの使い分けについて説明しました。

来年はもっと多くの Twilio を使ったサービスが出てくることを楽しみにしています！
pythonで一年間の休日判定をしてみた

# 背景
python3で一年間の休日判定を行ってみた。
特定年度の休日をYYYY-MM-DD形式で出力する

# 手法
①内閣府のcsvデータをダウンロードして祝日の判定データとする。
②一年間の日付データを回す
③データの曜日判定（土日）をする
④①を使いデータの祝日判定をする
⑤年末年始など会社特有の休日判定をする

#　コード
```python3
import datetime
import pandas
import urllib

public_holiday_csv_url="http://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv"
file_name = public_holiday_csv_url.split("/")[-1]

# 対象年度
target_year = 2018

# 会社特有の休日
company_holiday = ['2018-01-02','2018-01-03','2018-12-28','2018-12-31']


def get_holiday_flg(date):
    # 通常の土日
    if (date.weekday() >= 5):
        return True

    # 祝日
    holidays_df = pandas.read_table(file_name, delimiter=',', encoding="SHIFT-JIS")
    if date.strftime("%Y-%m-%d") in holidays_df['国民の祝日月日'].tolist():
        return True

    #　会社の休日
    if date.strftime("%Y-%m-%d") in company_holiday:
        return True

    return False


if __name__ == '__main__':

    # 内閣府から祝日データを取得、更新したいときにTrueにしてね
    if True:
        urllib.request.urlretrieve(public_holiday_csv_url, file_name)

    # 年始から日付を回す
    date = datetime.datetime(target_year, 1, 1, 0, 0)
    while date.year == target_year:
        if get_holiday_flg(date):
            print(date.strftime("%Y-%m-%d"))
        date += datetime.timedelta(days=1)
```

`pip install pandas`
でpandasをインストールしておく

改良の余地はありそうだけど、こんな感じで簡単にできた

# 2017/12/04追記
#### あ、振替休日考慮できてない

# 参考
参考にいたしました。ありがとうございます。

Pythonで営業日を取得
http://cartman0.hatenablog.com/entry/2017/05/25/195818
Qtでキュートなツールを作る(プロジェクト作成編)

[解散 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/kaisan) 9日目でございます。
今回もQtをVisualStudioで扱っていきます。

[前回の記事](https://qiita.com/dais_k/items/b54acf15bb9fab50511b)で導入まで終わりました。
今回は実際にVisualStudio上でQtを扱ってみましょう。
注意としては、WindowsAPIを使った事があり
これまでリソースエディタを使っていた~~自分みたいな情弱な~~人向けに書いているので
それとの共通事項は省いて説明します。

##0.始める前に訂正(?)
前回、VSのお好みのバージョン、ビットをインストールと言いましたが
いざVS2015(本体は64bit)で32bitのツールを作ろうとした所、下の様なエラーが出てしまいました。
![ss04.png](https://qiita-image-store.s3.amazonaws.com/0/217330/f0b491a3-efd2-0403-6b99-316e4a7ba4cb.png)
No default Qt version found. Check your Qt VS Tools settings.

……???
という事で、32bitアプリケーションはバッサリ切り捨てて、64bit版を作る事にします。
~~いい加減64bitアプリケーションに完全移行しても大丈夫でしょう?~~

てな訳で、前回設定した**Qt Options**の上、**Qt Project Settings**を開きます
![ss05.png](https://qiita-image-store.s3.amazonaws.com/0/217330/18df7e87-da8c-4fc2-170c-2d97a4d97bd4.png)

この一番下、**Version**の項目から
VSのバージョンや作成ツールのbitに合った物を選びましょう
![ss07.png](https://qiita-image-store.s3.amazonaws.com/0/217330/a55c47f7-7b9e-34c4-62ab-41114fd5a7bd.png)

この名前ですが、**Qt Options**で設定した名前がそのまま入るようです。
今回は、32bitを消して64bit版を入れました。
![ss06.png](https://qiita-image-store.s3.amazonaws.com/0/217330/4dee466e-78ae-7bfa-7f23-5d2a07222f5a.png)

##1.新規プロジェクト作成
前回お見せした、新規プロジェクトのQt欄から作成します。
今回は、純粋な独立したGUIツールですので
**Qt GUI Application**を選びましょう。
![ss01.png](https://qiita-image-store.s3.amazonaws.com/0/217330/d2dfdcdf-d414-fab2-1339-6b2911efc577.png)

すると、Qt専用のアプリケーションウィザードが起動します。
最初に追加のモジュールを選べます。
すごい! インストールの時より項目が沢山! なにこれ!
![ss02.png](https://qiita-image-store.s3.amazonaws.com/0/217330/b9065733-f066-6abf-a0ae-1ba2ac543c1f.png)

正直な話、これまでのようにWindowsAPIとリソースエディタで
簡単なツールを作っていたぐらいでしたら
このまま次へ行ってしまって何も問題ありません。
ここでは主にネットワークを使った何かだったり、
ちょっと一つ上の動作ができるようにするための機能を追加できるだけです。
もう少し丁寧な解説は[こちらのページ](https://www.sra.co.jp/qt/licence/)を調べてみると良いですよ。

続いてプロジェクト設定ですね。
画像でカーソルを合わせていますが**Base class**に気を付けてください。
今回はダイアログ形式でのツールを作りますので、**QDialog**に変更しましょう。
後の項目は基本的にそのままでOKです。
出力名称や保存名称を変えたい場合は変えてみましょう。
![ss03.png](https://qiita-image-store.s3.amazonaws.com/0/217330/c747747d-262c-8531-7e17-e58086cd87d9.png)

これで基本部分が構築された状態で始める事が出来ます。
一度空ビルド&実行してみると良いでしょう。
何も書かれていない寂しいダイアログが出てくれます。

##2.Qt Designerに触れてみる
**From Files**フォルダの.uiを開くと
Qt Designerが起動します。
(0番の設定が間違っていると、この時点でお見せしたようなエラーが出ます)
黒く塗りつぶしているのはプロジェクト名ですのでお気になさらず。

ちなみに、Generated Filesには触れないように気を付けてくださいね。
![ss08.png](https://qiita-image-store.s3.amazonaws.com/0/217330/baf979ca-d7c4-14d7-bd77-05a1639f3a1f.png)

ここまで来たらあとはリソースエディタと同じですね!
配置は見た目通りになりますので、好きに配置してみたり
少しの間触れて遊んでみましょう。
勿論、配置してそのままビルド実行してもその通りに出力されます。

##3.次回予告(?)
このままボタン配置して、プログラム打つぐらいまで進めようかと思いましたが
やっぱりアドベントカレンダー的にネタ不足待ったなしなのでここで切らせてもらいます。
~~(自分の事巻き込んだ主催者許さないからな)~~
[よろしければ他の方の記事もどうぞ。](https://qiita.com/advent-calendar/2017/kaisan)

次回は、いよいよ本格的にプログラムを打ち始めましょう。
リアルタイムで見ている人が居るかわかりませんが、次回更新までに
どんなボタンがあるのかを一通り見ておくと良いかもしれません!
wsl+cmder

**vscodeがインストール済みば vscodeのターミナルを使う**

# wsl+cmderのディレクトリー

## CmderのTask

- 「Settings」を選択
- 「Startup」 -> 「Tasks」

## startup directory

|項目名|設定値|
|:--|:--|
|Commands|-new_console:d:C:\workspace\tokesi C:\Windows\System32\bash.exe|

![wsl_directory.png](https://qiita-image-store.s3.amazonaws.com/0/174000/e0ea0b41-0c27-bfe8-902d-124a8e7bdbcd.png)
MoneyForward クラウド請求書から売上データをPowerBI でビジュアライズ

CData ODBC Driver for Money Forward を使って、Money Forward data へのライブ接続をMicrosoft Power BI レポートに連携できます。

Microsoft Windows のODBC ビルトインサポートにより、CData ODBC Drivers はMicrosoft Power BI のようなセルフサービスアナリティクスツールへのセルフサービス統合を実現します。CData ODBC Driver for Money Forward はPower BI のレポートをライブMoney Forward data にリンクします。標準SQL を使ってMoney Forward data をPower BI Designer にロードできます。データ更新をスケジュールまたはオンデマンドで更新することにより、Money Forward data をダッシュボードからモニタできます。また、Money Forward data をリアルタイムで反映し分析します。この記事では、ODBC driver を使ってMicrosoft Power BI Designer でMoney Forward data ビジュアライゼーションを作成する方法について示します。

#MF クラウド経費でのAPI の利用設定
MoneyForward はOAuth 認証標準を利用しています.OAuth では認証するユーザーにブラウザでMoneyforward との交信を要求します
OAuth Client クレデンシャルを取得する方法は次の通り；
1. MoneyForward にログインして、右上の［？］ボタンをクリックして、［API 連携β （開発者向け）］をクリックします。
2. ［新規作成］をクリックします。
3. 名前、Redirect URI、Scopes フィールドを入力します。
4. Redirect URL をhttps://localhost:33333 に設定します。
5. MF クラウド請求書API 利用規約への同意にチェックします。
6. ［作成］をクリックします。作成が成功すると、OAuth クライアントクレデンシャルであるClient ID、Client Secret、スコープ、Calllback URL が表示されます。

#ODBC のDSN の確立
1. CData ODBC Driver for kintone をダウンロードします。30日の無償評価版があります。[http://www.cdata.com/jp/drivers/moneyforward/download/](http://www.cdata.com/jp/drivers/moneyforward/download/)
2. DSN 設定を実施：次の接続プロパティを設定して、接続してください。
- OAuthClientId：アプリケーション設定のクライアントID に設定。
- OAuthClientSecret：アプリケーション設定のクライアントシークレットに設定。
- CallbackURL：アプリケーション設定のSite URL に設定します。
- 接続時に、本製品 がディフォルトブラウザのOAuth エンドポイントを開きます。もし、”この Web サイトのセキュリティ証明書には問題があります”などのメッセージを表示する場合には、”このサイトの閲覧を続行する（推奨されません）”をクリックします。注意点として、認証を完了させるには、Moneyforward にログインする必要があります。本製品 がOAuth プロセスを完了します。 

これでODBC 接続でMoneyForward への接続が可能になりました。

#PowerBI からMoneyForward ODBC への接続、レポートの作成
1. Power BI Designer を起動して［Get Data］をクリックします。
2. ODBC 接続を選択します。SQL でのクエリを行う場合には［advanced option］にSQL クエリを直接打ち込みます。
3. CData ODBC Driver for MoneyForward をドロップダウンから選択します。ユーザー名・パスワードは入力不要ですが、ブランクだとはじかれるので"a" とでも入れておきます。
4. テーブルが取得されるので、ビジュアライズに使うテーブルを選択します。確認してデータをロードします。
5. あとは、通常のテーブルデータと同じようにPowerBI 上でレポートを作成します。
6. データを最新に更新する場合には［refresh］をクリックしてください。

#Money Forward Data レポートをPower BI にアップロード
ODBC データソースベースのレポートを、組織内のPowerBI ユーザーと共有できます。ダッシュボードまたはレポートをアップロードするには、PowerBI.com にログインして［Get Data］>［Files］をクリックし、Power BI Designer ファイルまたはExcel ワークブックにナビゲートします。これで［Reports］セクションでレポートを見たり編集したりできます。

#スケジュールおよびオンデマンドで更新
Power BI Personal Gateway を使って、レポートに関連づけられたデータセットを自動的に更新できます。 オンデマンドでもデータセットを更新できます。Personal Gateway をインストールしたら、手順に従いPersonal Gateway ODBC DSN を設定します：
1. ［Dataset］セクションでMoney Forward Dataset を右クリックします。
2. ［Schedule Refresh］をクリックします。
3. データセットの［Settings］セクションで［Manage Data Sources］ノードを展開します。［ODBC］セクションで［Edit］をクリックします。
4. ［Authentication Method］メニューで［Anonymous］を選択します。Money Forward クレデンシャルがDSN にすでに保存されているためです。

Personal Gateway を設定したら、オンデマンド更新および更新をスケジュールできます。

更新をスケジュールするには、［Schedule Refresh］ノードを開して［Keep Your Data Up-To-Date］オプションで［Yes］を選択します。更新の間隔を指定してから［Apply］をクリックします。

オンデマンドで更新するには、［Datasets］セクションでMoney Forward dataset を右クリックし［Refresh Now］をクリックします。
vueで共通処理内でdataを操作する

## 前提条件:
- vue初心者
- フロントエンド苦手

## 概要:

- Vue-Cliでポートフォリオサイトを構築
- 各ページで表示するプロフィール情報を保持したJSONファイルを取得するよう変更した。
- 毎回コンポーネント毎に同一の処理をコピペしていてウンコードになっていたためProfile.vueというファイルに該当箇所を切り出し。
- ここで問題発生、どうやってこの共通処理を呼び出せばいいのかがわからない…。

## 解決:
これがいいのかどうかは不明だがmixinとextendというのがやりたいこと(共通処理を継承)を実現してくれそうだった。
今回はmixinを採用、比較的わかりやすかったため。
今のところvue.extendとの違いは理解出来ていない。

```javascript
<script>
// 共通化する実装を@components/以下に新規vueファイルで実装

import axios from 'axios';

export default {
  data() {
    return {
      name: '',
    };
  },
  mounted() {
    this.getProfileJson();
  },
  methods: {
    getProfileJson() {
      axios.get('static/profile.json').then((response) => {
        this.setProfile(response.data);
      }).catch((error) => { console.error(error); });
    },
    setProfile(profile) {
      this.name = profile.name;
    },
  },
};

</script>
```

```javascript
//  実際にプロフィール情報を継承して利用する*.vue
import Profile from '@/components/Profile';

export default {
  name: 'Hoge',
  mixins: [Profile],
};
</script>
```

　実装してみれば実にシンプルで簡単なのだけど2つの点で勘違いしていたために大いに時間をかけてしまった。

- `@/App.vue`を継承したコンポーネントが`@/components/`の単一コンポーネントだと思っていた
- `@/main.js`に処理を記述してVueに渡せば全コンポーネントで利用が可能だと思っていた

`import [コンポーネント名？] from '@/components/'` で`src/`以下を参照してくれるらしい。
この機能自体はvueそのものではなくwebpack由来だとのこと。

ということでmain.jsに記述を追加したり、App.vueに記述を追加したりゴニョゴニョしまくっていたが多分これはなにかを勘違いしていると思ったのでその段階で実装を一旦諦めて寝た。

そして朝起きてからふと、そもそも単一コンポーネントなのだから各ファイルにimportするのが正しいのでは？と思い至り実装したら問題なく動いた。

JSの理解度とVueそのものの知識を学習しながら書いているので上手いこといかないがこれでやりたいこととしては実装出来た。

そのやり方はうまくないとかあれば指摘いただけると嬉しい。
Alexaに買いたいものを伝えて共有の買い物リストに追加

先日、Amazon Echo Dot が届きまして、遊んでいます。
我が家では夫婦の共同の買い物リストとして、Wunderlistを使っており、
Alexaに伝えたらそこに登録できると簡単だなーとおもったのが発端。
※Alexa側にも買い物リストがあるけど、それを共有するのは家庭内の運用を変えることになるので、ちょっと面倒だった。


#■やりたいこと
・Alexaに買いたいものを伝えたら共有の買い物リストに追加される


#■やりたいことはこんな感じのイメージ
１．「アレクサ。牛乳を買い物リストに追加」
２．Wunderlistの所定のリストに「牛乳」が追加される

#■準備
今回使用するツールは以下の3つ

- Alexa：音声入力用
- Wunderlist：出力先
- IFTTT：上記二つを連携

##〇Alexa側
特になし
※まずはお手軽にということでAlexa Skills Kitなどは使わずにやってみることにしてます。


##〇Wunderlist側
Wunderlistには機能として設定したメールアドレスからme@wunderlist.comにメールを送信すると
指定したリストにTODOを追加することができるので、この機能を有効にしておく。
※GmailにしておくとIFTTTにてThatの設定がはかどると思われる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/106639/15c3b408-4628-df80-6fd1-2138354b5150.png)


##〇IFTTT側
・Wunderlistに登録したGmailアカウントでサインイン

・NewAppletで以下のAppletを作成する

[THIS]
Choose a service
→Amazon Alexaを選択
※Amazonにサインインしていないとこのタイミングでサインインを求められると思われる。

Choose trigger
→今回は買い物リストにアイテムを追加することをトリガーにしたいので
「Item added to your Shopping List」を選択

[That]
Choose action service
→Gmailを選択
※EmailではなくGmail
Choose action
→サインインしているGmailのメアドからme@wunderlist.comへ送信することになるので
　「Send an email」を選択

Complete action fields：メール送信するための情報を設定
To address：me@wunderlist.com
![image.png](https://qiita-image-store.s3.amazonaws.com/0/106639/477fe936-48f6-252b-d6ed-60538b270774.png)


Subject:{{AddedItem}}
TODOリストの見出しにはメールのSubjectが設定されるので、買い物リスト的にはここに設定したほうが見やすい。
※我が家はTODOリストのソートのための一つ仕掛けをしているので[01_購入:{{AddedItem}}]としています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/106639/bf336fbc-7360-b48a-ac20-ff5b8143c605.png)

Body:未設定

上記を設定したらCreateActionをクリック


[Review and finish]のページになるので問題なさそうだったらFinishをクリック。
これで「アレクサ。牛乳を買い物リストに追加」と伝えれば、ちょっとしたらIFTTT経由でGmailからメールが送信されて
Wunderlistの所定のリストに追加されます。


ただし、Alexa側の買い物リストにも追加され続けるので注意が必要。
→使わないのであれば、たまに手動で削除でもしておいたほうがいいかもしれない。
※そのうち、Alexa Skills Kitでその辺を制御できそうなものを作りたい気分。




#■IFTTTでAlexaとワンダーリストを連携のまとめ
THIS:Alexaの「Item added to your Shopping List」
That:Gmailで TO [me@wunderlist.com] Subject [{{AddedItem}}] で送信

※ワンダーリストについてはあらかじめ「Wunderlistにメールする」の機能を有効にしておき、
送信元のメールアドレスを有効にしておく必要がある。