OmniAICreator/Qiita-1.07M huggingface dataset:
CNTKサンプルのinstall_cifar10.pyがエラーを起こすとき

# Cifar10がダウンロードできない
ディープラーニングの分散学習を行うためにCNTK（Microsoftのディープラーニング用フレームワーク）を触っていたところ、サンプルのinnstall_cifar10.pyが動かず、学習が始められなかった。

## 原因
cifar10のダウンロードURLが変更されていた。
```http://```の部分が、本元のサイトは```https://```になっていた。

## 解決策
CNTK/Examples/image/DataSets/CIFAR-10/install_cifar.pyの５行目にあるURLを書き換える。

- 元のコード

```python:install_cifar10_old.py
ut.loadData('http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz')
```

- 変更後の５行目

``` python:install_cifar10.py
ut.loadData('https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz')
```

以上。

# 雑談

分散学習のためにNNablaやChainerMNのインストールを試してもうまくいかない、、、。
Visual Studio > Tool > VS2017: Spy++のインストール

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

- [VC++ ダイアログボタンクリック](http://www.ne.jp/asahi/hishidama/home/tech/vcpp/clickdlg.html)

> VC++に付属しているspy++を使って、ダイアログのボタンのコントロールIDを調べることが出来る。

VS2017でセットアップするには?

https://stackoverflow.com/questions/43360339/how-do-i-get-spy-with-visual-studio-2017

「Visual Studio C++ コア機能」をセットアップするようだ。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/aeecd515-e1d4-d05b-bab9-408bf2841563.png)

セットアップ後、以下にspyxx.exeが見つかるようになった。

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools

### 関連

- [C++ Builder > メモリが足りません (Abnormal Program Termination) 表示を別ソフトから検知する + アルファ](https://qiita.com/7of9/items/474b02ca0161ad26cbdb)
UnityEditorが突然落ちた時のメモ (UI::Canvas::CaptureBatchFrame)

解散アドベントカレンダーi日目です。
完全に書くの忘れていた＋忙しすぎて記事書けてませんでしたね。
まぁ一日くらい遅れても誤差誤差。

さて今回はUnityがクラッシュして困ってた時の備忘録というか覚え書きです、
結論から言うとUnityのバグで落ちていたのですが近いうち修正されると思います。困ってる人がもしかしたらいるかもしれないのでメモしときます。

## 症状
シーンを再生するとほぼ１００％落ちる。

Editor.Logを見てみると、以下のような感じでした。

```
Receiving unhandled NULL exception
Obtained 23 stack frames.
#0  0x00000101bfe4d2 in UI::Canvas::CaptureBatchFrame(dynamic_array<UISystemProfilerInfo, 4ul>&, dynamic_array<char, 1ul>&, UI::SubBatch const&, int, int, int, dynamic_array<int, 4ul>&) const
#1  0x00000101bfdf23 in UI::Canvas::CaptureFrame(dynamic_array<UISystemProfilerInfo, 4ul>&, dynamic_array<char, 1ul>&, UI::Canvas const*, dynamic_array<int, 4ul>&) const
#2  0x00000101c02223 in UI::CanvasManager::CaptureFrame(dynamic_array<UISystemProfilerInfo, 4ul>&, dynamic_array<char, 1ul>&, dynamic_array<EventMarker, 4ul>&, dynamic_array<char, 1ul>&, dynamic_array<int, 4ul>&)
#3  0x00000100db16d8 in UnityProfiler::SaveCurrentFrameRecording()
#4  0x00000100db0ae8 in UnityProfiler::EndFrame()
#5  0x00000100db08af in UnityProfiler::RecordPreviousFrame(ProfilerMode)
#6  0x00000100365cfc in Application::TickTimer()
#7  0x007fff8e2f9e0f in __NSFireTimer
#8  0x007fff8c86fc54 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__
#9  0x007fff8c86f8df in __CFRunLoopDoTimer
#10 0x007fff8c86f43a in __CFRunLoopDoTimers
#11 0x007fff8c866b81 in __CFRunLoopRun
#12 0x007fff8c866114 in CFRunLoopRunSpecific
#13 0x007fff8bdc6ebc in RunCurrentEventLoopInMode
#14 0x007fff8bdc6cf1 in ReceiveNextEventCommon
#15 0x007fff8bdc6b26 in _BlockUntilNextEventMatchingListInModeWithFilter
#16 0x007fff8a35da54 in _DPSNextEvent
#17 0x007fff8aad97ee in -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:]
#18 0x007fff8a3523db in -[NSApplication run]
#19 0x007fff8a31ce0e in NSApplicationMain
#20 0x0000010220e8a5 in EditorMain(int, char const**)
#21 0x0000010220ed19 in main
#22 0x007fffa1fec235 in start
Launching bug reporter
```

なんかキャンバスが悪さしてるっぽい雰囲気がありますね。

## 解決方法

結論から言うとUnityのprofilerウィンドウが開かれていたのが原因でした。
Unityのissue Trackerを見てみると同じ症状がありました。
https://issuetracker.unity3d.com/issues/entering-playmode-with-profiler-open-and-ui-in-the-scene-crashes-in-ui-canvas-capturebatchframe

 ISSUE TRACKER曰く将来的に修正される予定らしいのですが現状では落ちてしまうので同じ症状が出てる方いましたらこちらを試して見てください。
【Windows】Node.jsをアンインストールする

## 前提
インストーラーを使ってインストールしたNode.jsが対象。

## 手順
1. 「プログラムと機能」からNode.jsをアンインストールする。
1.  下記フォルダを手動で削除する
``` 
%USERPROFILE%\AppData\Roaming\npm
%USERPROFILE%\AppData\Roaming\npm-cache
```

## 備考
プロキシの設定している場合は、.npmrcファイルも手動削除する必要あり。
SphinxにLilyPondを組み込む

[Sphinx](http://www.sphinx-doc.org/)は、Pythonで書かれたドキュメント生成ツールです。[reStructuredText](http://docutils.sourceforge.net/rst.html)を用いて、高品位の出力を得ることができます。Pythonによる拡張が容易です。
[LilyPond](http://lilypond.org/)は、C++およびSchemeで書かれた楽譜生成ツールです。独自の言語を用いて、高品位の出力を得ることができます。Schemeによる拡張が容易です。

似たもの同士ですね。こいつらを組み合わせて、高品位の楽譜付きドキュメントを作れるようにしてみたいと思います。

# どうなるの？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/22238/6d49b4bf-c45e-8da1-1ab8-5682c465bf3f.png)

シンタックスハイライトに対応していて、出力画像はSVGになっているので綺麗です。公式マニュアルの出力よりモダンな感じがしますね。
もっと見たい方は[LilyPond四週間（未完成）](https://suitougreentea.github.io/lilypond-four-weeks/)へ。また、具体的にどうやって組み込んでいるかは[ソースコード](https://github.com/suitougreentea/lilypond-four-weeks)の`extensions/`と`source/conf.py`を見てください。

# Directive

```restructuredtext
.. lily::
  :caption: タイ
  :name: tie-example

  \relative c' {
    c2~ c8 g'4 f8~ 8. e16~ 8 d8 c2
  }
```

こんな感じでソースコードを入力すると、画像のようにコードと出力が並んで出力されるようにするのが目標です。そのために`lily`ディレクティブを作ります。

## Original by Wei-Wei Guo

https://bitbucket.org/birkenfeld/sphinx-contrib

偉大なる先駆者です。
機能としては、ソースコードからpng画像を出力するという、最低限のものです。

## Improved by Fabrice Salvaire

https://github.com/FabriceSalvaire/sphinx-lilypond

Python3用にクリーンアップし、独立したものです。LilyPondがSVGのクロップに対応し次第[^1]SVG出力にも対応する予定だそうです。

[^1]: [LilyPondのmasterブランチに`-dcrop`オプションが実装されました](http://git.savannah.gnu.org/gitweb/?p=lilypond.git;a=commit;h=dcb458c225534895f69f4c05137809d20d6a79b9)。~~2.20で使用可能になるかと思いきや、stable/2.20ブランチには組み込まれていません。Changesドキュメントには書いてあるのですが…。メーリングリストにこの件を投げたことがあるのですが、安定版候補のブランチに新しく機能を組み込むことには慎重なようです。果たしてどうなるか。~~ **(12/25追記)stable/2.20ブランチに取り込まれたようです。次のリリースで使用可能になりそうな予感。**


## 改造しました

https://github.com/suitougreentea/sphinx-lilypond/

PyPIには登録していないので（READMEの手順を踏むとフォーク元のものがインストールされます）、自前でcloneしてパスを通して使ってください。

SVG画像を出力するようにしました。上に書いたように、まだ公式でSVGのクロップに対応していないため、一旦PDFでクロップされた出力を得て、それをSVGに変換するという手順を取っています。そのため、**外部ツール[pdf2svg](https://github.com/dawbarton/pdf2svg)が必要です**。

画像のように、ソースコードと出力画像が併置されるようにしました（オプションで変更可能）。

また、大量のオプションが追加されています。

* `nowrap`: 実質、互換性のために残されているようなものです。本来は、入力を`\new Staff <<` `>>`で囲ったりせずに生のデータを用いて出力するようになるオプションです。
* `linenos`: 行番号を表示します。
* `lineno-start`: 行番号を表示する時、何行目から開始するかを指定します。
* `emphasize-lines`: ハイライトする行番号を指定します。
* `caption`: コードの上に表示するタイトルを表示します。
* `name`: クロスリファレンスに用いる名前を指定します。
* `without-code`: ソースコードを表示しません。
* `without-image`: 出力画像を表示しません。

とは言え、LilyPond四週間のために突貫工事したものですので、LaTeX対応が無くなっていたり、インライン表記（ロール）対応が無くなってたり、色々と削減されている機能も多いです。このあたりは要改善。


# Pygments Lexer

Sphinxは、ソースコードのシンタックスハイライトに[Pygments](http://pygments.org/)を使っています。残念ながら、公式のLexerリストにはLilyPondが無いため、自分でLexerを用意する必要があります。

## Original by Jeffery Shivers

https://github.com/jefferyshivers/lilypondlexer

先駆者がいるというのは、本当にありがたいことです。

## 改造しました

https://github.com/suitougreentea/lilypondlexer

オリジナルをそのまま使うだけではハイライトが不十分だったため、フォークしていくらか修正しました。まだまだ対応していない記法があるはずなので、要改善。

なお、SphinxにLexerを認識させるには、こんな感じにする必要があります。`conf.py`に書くなり、拡張を書くなりすると良いでしょう。

```python3
from lilypondlexer import lilypond

def setup(app):
    app.add_lexer("lilypond", lilypond.LilyPondLexer())
```
アクセスポイントで聖夜っぽさを表現してみた

# 見上げてごらん天井を
現在多くのオフィスにはアクセスポイント(AP)が設置されているかと思います。
単に便利なだけでなく、フリーアドレスや業務改革の流れもあり、かなり普及しましたね。天井の AP に目をやると、LED があり、青だったり、緑だったりするかと思います。これは LED の色と点灯によって状態を表しているんです。
![IMG_1460.JPG](https://qiita-image-store.s3.amazonaws.com/0/215499/f202701e-c349-850e-ebf7-11c534b0f3da.jpeg)

# AP のご機嫌を知る
では、Aironet(3800) の LED の状態とその意味を見てみましょう。
![LED.png](https://qiita-image-store.s3.amazonaws.com/0/215499/93d3fb71-447f-f73e-6082-c7967ad6ea04.png)
LED が点滅していたり、赤色が出てくる場合は、アップグレードやコントローラを探すなど電波を提供する準備をしているケースが多く、しばらく待ってみて、状態が改善しない場合はトラシューを行うことが多いです。

#もう LED を点けたいなんて言わないよ絶対
AP のご機嫌を伺える便利な LED ですが、お客様の環境によっては、光らせたくないケースもあります。例えば、病室やホテルの部屋など、睡眠の際に LED が眩しいとご迷惑をかける場合です。
但し、安心してください、設定で消せますよ！
![LED_set.png](https://qiita-image-store.s3.amazonaws.com/0/215499/0281dfd8-b071-9932-08f0-ce30b5e65df9.png)
設定画面を見ていただくと、LED を点灯させる時間の設定や、無制限に点灯させるといったことも AP 毎に可能で、複数の AP を設置後に、あっ！どの AP をどこに取り付けたんだっけ？という時に AP を個別に光らせて場所を確認することができます。

#AP で聖夜っぽさを出してみる
公開日がクリスマスということもあり、ラボにあった AP と緑のケーブルを集め、AP が コントローラを探す際の LED 状態を利用して、クリスマスツリーを作成してみました。
*(夜中に会議室で一人、AP とケーブルを並べ、部屋を真っ暗にして撮影に臨んだ SE の姿を思い浮かべながらご覧下さい)*
![20171220_112025.GIF](https://qiita-image-store.s3.amazonaws.com/0/215499/29bf19c2-4029-f458-5a10-bbbda81c7933.gif)

#なんと AP でラズパイだと！？
最後に、やはり少しはプログラムっぽい要素がないと・・・ということでラズパイです。実は、Aironet3800 という機種は拡張モジュールに対応しており、HDK ボードにラズパイを載せて使う事ができるのです！！(Raspberry Pi A/B/2/3)
![AP3800_module.png](https://qiita-image-store.s3.amazonaws.com/0/215499/8bb8ad7b-638c-b28e-26ee-930e08f2463a.png)
他にも、Intel NUC Modules、Intel Quark E100、Beaglebone Black、XBee Radio Socket が載せられるようになっていたりします。
https://developer.cisco.com/docs/adp/#external-modules
下記に Sandbox もあり、プログラマーでも遊べる AP となっていますので、是非お試しあれ。
https://developer.cisco.com/site/adp/

以上、最後までご覧いただきありがとうございました。良い年末年始を！
Slackbotを使ってemojiをスタンプ風にする備忘録

#はじめに
Slackを使っていてひとつ、どうしても改善したいことがありました。
「emojiのスタンプを拡大して表示すること」です。
せっかくbotを作ったのでpythonを使ったSlackbotを経由させてスタンプを拡大させてみました。

#環境
- Windows10　64bit
- Python 3.5.4

#仕様
スタンプを押した後に、「拡大」と入力すると次のような感じでbotが拡大emojiを返すイメージ。
若干かっこ悪い。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201826/dcef33e4-950b-181d-2f29-f931ec4133a0.png)



#SlackのemojilistからAPIを取得

まずslackAPIのTokenを取得。
取得方法はこちらの[サイト](https://qiita.com/ykhirao/items/0d6b9f4a0cc626884dbb)を参考にしました。

Slackにログインした状態で[ここ](https://api.slack.com/custom-integrations/legacy-tokens)にアクセスできれば取得できるはずです。

自分のSlackチームにログインした状態で、
[このサイト](https://api.slack.com/methods/emoji.list/test)にアクセス。

Testerタブをクリック。
そうすると、Valueの部分にチーム名が表示されるはずです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201826/7809f985-90ec-6dc7-bf80-e127c3baf3f5.png)

この状態でTest Methodをクリックすると、APIを取得できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201826/2acaf6cd-fdcb-3774-576c-34148c8f43b2.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201826/4c297092-7ada-7522-248d-8752cc8305e0.png)


#中身
Slackbotの作成に関してはこちらの記事を参照。
[Slackbot備忘録(1)](https://qiita.com/usomaru/items/529b6f40902ee1eda125)


実際に今回追加したコードはこちら

```python:my_mention.py
@listen_to('拡大')
def default_emoji(message):
    import urllib
    import json
    url = '取得したurl'
    
    html = urllib.request.urlopen(url)
    jsonfile = json.loads(html.read().decode('utf-8'))
    text = message.body['text']
    #::を消す
    title = text.replace(':', '')
    #titleからさらに拡大を消す
    title2 = title.replace('拡大', '') 
    
    telop = jsonfile['emoji'][title2]
    message.send(telop)
```

取得したAPIからtextと一致するemoji配列を呼んでるイメージです。
一致させるためにtextから文字置換をしまくってます。

listen_toなので、botさんをチャンネルに招待しないと動かないので注意です。

python/Slackbot初心者なのでこんな方法しか思いつきませんでした。

もっとスマートに拡大できたらいいのですが、
ひとまず不満が解消されました。

#参考
- [Slackのemojiをスタンプ風に使用できるbot](https://qiita.com/hymst/items/af572844a9454696dc06)

本当はやりたかったこと↓

- [SlackでLINEみたいにスタンプを大きく表示する
](https://qiita.com/icchi_h/items/f71ec5599ccd0527b6f3)
TOMOYOLinuxをUbuntu16.04にインストールする方法

#はじめに
自身への覚書程度になので、詳しくは[TOMOYOLinux公式サイト]()を参照してください。

#Ubuntu16.04に対するTOMOYOLinux
TOMOYOLinuxにはいくつかバージョンがありますが、Ubuntu16.04では2.5.x系をデフォルトで使用することができる.

したがって1.x系などに見られるカーネルを含めたコンパイルなども必要ない.

対応しているか確認するためには
```grep tomoyo_write_inet_network /proc/kallsyms```
に対して以下が得られればOK
```ffffffff8115e460 T tomoyo_write_inet_network```

もちろんUbuntu16.04は対応している. 

#インストールtomoyo-tools
aptで簡単にインストール
```sudo apt install tomoyo-tools```

#初期化
##ツールのパスを通す.
```export PATH=$PATH:/usr/sbin```

##ポリシーを初期化する

```
/usr/lib/tomoyo/init_policy
```

##ブートローダを設定
デフォルトでされているのでOK

```sudo update-grub```

再起動！！！
mitmproxyでサイトにjsを埋め込む


# 概要
ウェブサイトにjsを埋め込んだときに、他のJavaScriptと競合したり、
埋め込んだjsが適切に挙動をするかというのを本番に入れる前に検証する必要がある。
そういうときに行うMITMクライアントとして、[mitmproxy](https://github.com/mitmproxy/mitmproxy)が良かった、という話

# インストール

brewでサクッと手に入る

```sh:

brew install mitmproxy

```

# 端末の設定

iPhoneの場合は、
1. 端末でのproxyの設定をする。
2. 証明書をインストールする。

ということが必要になる。
詳細は以下を見て欲しい
https://qiita.com/yimajo/items/c67cb711851f747c35e5


# mitmproxyにフックさせるscriptの用意

## 概要
基本としては
- `request(flow)` リクエストにフックする関数
- `response(flow)` レスポンスにフックする関数

という形になる。
versionが上がって、ネット上のサンプルコードはほぼ動かないので、以下の[公式のサンプル集](https://github.com/mitmproxy/mitmproxy/tree/83f87607036aad642515efe4fcdb0de9a8e31ed6/examples/simple)を見ながら試すのがいい。

## 実際に書いて見ると

簡単にscriptタグを挿入するスクリプトは以下のようになった

```python3:hook.py

from bs4 import BeautifulSoup
from mitmproxy import ctx, http

def response(flow: http.HTTPFlow) -> None:
    html = BeautifulSoup(flow.response.content, "html.parser", from_encoding="utf8")
    if html.body:
        script_tag = html.new_tag("script", type="text/javascript")
        script_tag.string = "alert('okok');"

        html.head.insert(1, script_tag)
        flow.response.content = str(html).encode("utf8")

```

# 結果

実際に動かして、挙動を見てみる

```sh:

mitmproxy -p 8080 -s hook.py --anticache

```

でGoogleにアクセスすると

<img width="320" alt="IMG_0003.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/65978/aa8acbe3-fc0c-6328-2bf4-cc7e1b44cf02.png">

一方、mitmproxyの方は、以下のように動いてるのがわかる

<img width="1162" alt="mitm.png" src="https://qiita-image-store.s3.amazonaws.com/0/65978/a0a9427d-1aac-7e9b-2e1e-4293e89d7641.png">

# 結論
便利
window.openが動かないときはwindow.location.hrefで飛ばしたい

window.location.hrefで飛ばした時はサーバーの設定等によって開かないときがあります。
window.openで新規タブを開くとうまくいきますが、現在ios safariではサポートしていません。

```javascript
if(window.open(url,"_blank")){
  
}else{
  window.location.href = url;
}
```

これで両方に対応できます
GitLab/GitHub上でUML図を使った議論を可能にするChrome拡張、Planterを作成しました。


# 1.Planterって何？
* Merry Christmas!! おっさんサンタからの贈り物ですよ。
* PlantUMLサーバーと連携し、 GitLab/GitHubのイシュー、Markdownファイル等に埋め込まれたUML図を描画します。
* Chromeの拡張です。
* オープンソースです。(作者はほとんど時間がないので、適当な出来です。改善のお手伝いをください）

# 2.Planterが解決する問題
こんな方にオススメです。

* GitHub/GitLabのイシューやプルリク(MR)の議論でUML図を使いたい!!
* Markdownファイルに記載したPlantUMLの図をGitHubやGitLab上でも見たい。

>詳しい方はgitlab.comのサーバーには既にPlantUMLが組み込まれており、[Markdown記法でUMLを記載する](https://docs.gitlab.com/ee/administration/integration/plantuml.html)ことが可能なことをご存知でしょう。しかし、オンプレミスで動作させているGitLabサーバーは複雑な設定をする必要がありますし、[こちら](https://qiita.com/kitfactory/items/2fde799fa092f0d8f0f1)で紹介したようなMarkdown Preview Enhancedプラグインで記載したUMLは見ることはできません。本稿は、こういった問題を解決します。

# 3.Planterの使い方
## 3.1.Planterのインストール
* Chrome拡張ストアに行きます。
こちらのリンクから[Planter](https://chrome.google.com/webstore/detail/planter/knjokobklkikglcolanaamnkefmkkemc?hl=ja)をインストールします。

## 3.2.PlantUMLサーバーの設置
次にPlantUMLサーバーを立てます。[Apache Tomcat](http://tomcat.apache.org/)などのJ2EEサーバーが必要です。tomcatのインストールはzipを解凍するだけです。

つぎにPlantUMLサーバーアプリのダウンロードです。以下から、warファイルをダウンロードしてください。

[PlantUML J2EE warファイル](http://sourceforge.net/projects/plantuml/files/plantuml.war/download)

こちらのwarファイルをtomcatを解凍したwebappsの中にwarファイルをコピーします。

$ apache-tomcat
├── bin
├── webapps (ここにwarファイルをコピー)
....

その後、tomcatを解凍したbinフォルダの中のstartupで起動します。

```
>cd bin
>startup.sh

```

## 3.3.Planterの設定

chrome://extensionsを開き、オプションから設定をします。

<img src="https://qiita-image-store.s3.amazonaws.com/0/35954/cddf0425-e727-61d1-9098-d467402f7956.png" width=540>

<img src="https://qiita-image-store.s3.amazonaws.com/0/35954/c5a08eb3-0ab1-03f9-8777-41a8492eeb30.png" width=700>

Planterは標準でGitHub/GitLabを __本家のPlantUML__ でレンダリングするようになっています。標準でも動作をしないわけではないですが、本家PlantUMLサーバーはお試しとして、 __必ず自前サーバーで設定して使用してください。__ 

# 4.使ってみよう！

イシューやマークダウンファイルでUMLを記載してみましょう。以下のように記載します。

\`\`\`plantuml
@startuml
PlantUMLのコンテンツ
@enduml
\`\`\`

つまり、[Markdown Preview Enhanced](https://marketplace.visualstudio.com/items?itemName=shd101wyy.markdown-preview-enhanced)で記述したコードブロックを記載することができます。今までマークダウンで、いろいろなUMLを描いていると思いますが、それをGitLab/GitHub上で見ることが出来ます。

すると、

__GitLab__
<img src="https://qiita-image-store.s3.amazonaws.com/0/35954/f8fe2c59-a9bf-4ac8-a2b9-357767b3d83b.png" width=640>


__GitHub__

<img src="https://qiita-image-store.s3.amazonaws.com/0/35954/bbe95c74-c5c4-2113-fc18-98c97d5c625f.png" width=640>


# 5.PlanterはOSSです。

PlanterはGitHub上に公開されたOSSです。GitHubの[こちら](https://github.com/kitfactory/Planter)をご参照ください。Planterは都元ダイスケさんの[pegmatite](https://github.com/dai0304/pegmatite)や小飼弾さんの[js-deflate](https://github.com/dankogai/js-deflate)によってなりたっています。(自分は見事に何もやってません。）その恩恵を皆さんと分かちあいたいと思います。雑な出来で何とかクリスマスに間に合ったレベルですが、皆さんのプルリクエストをお待ちしています。

個人的にもまだreloadしないとたまに画像が出ないとか少し直したいと思ってますが、ちょいちょい直してあげてください。
Vimの非同期文法チェッカALEにプロジェクト固有の情報を教える

# はじめに

Vimの非同期文法チェックエンジン、[ALE (Asynchronous Lint Engine)](https://github.com/w0rp/ale)に、プロジェクト固有の情報を教えたいことがある。典型的なのがC/C++のヘッダのインクルードパスで、makefileで-Iで場所を教えていたりすると、ALEから呼ばれた`gcc`や`clang`がそのパスを探せずにエラーを報告してしまう。これを解決するには以下のようにすれば良い。

1. `.vimrc`を修正して、カレントディレクトリに`.vimrc.local`があったら読むようにする
2. ALEに追加情報が必要な場合はそこに`.vimrc.local`を作って、その中に情報を書く
3. 例えばC/C++のインクルードパスを教えるには`g:ale_cpp_clang_options`と`g:ale_cpp_gcc_options`に"-std=c++14 -Wall -Ipath/to/header"を指定する

# 状況

あるプログラムが参照するヘッダのインクルードパスが、コンパイル時に`-I`オプションで指定されているものとする。

例えばこんな状況を考える。

```
project
├── includes/
│   └── hoge.hpp
└── src/
    └── test.cpp
```

test.cppの中身はこんな感じ。

```cpp:test.cpp
#include <hoge.hpp>
```

もちろん、makefileには-Iで適切にヘッダファイルの場所を教えているから、問題なくコンパイルできる。

しかし、この`src/test.cpp`をALEを有効にした状態のVimで編集すると、「hoge.hppが見つからないよ」と怒られてしまう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/dde99f24-0abf-c3d3-b146-b2d56258b153.png)

これはALEから呼び出される`clang++`や`g++`には`-I`オプションが渡されていないのでヘッダが探せないため。

# 解決法

直接解決するには、`g:ale_cpp_clang_options`と`g:ale_cpp_gcc_options`にヘッダの場所を教えてやれば良い。デフォルト値は`-std=c++14 -Wall`になっているので、今回の場合は

```vim
let g:ale_cpp_clang_options = "-std=c++14 -Wall -I../includes"
let g:ale_cpp_gcc_options = "-std=c++14 -Wall -I../includes"
```

とやってやれば、この警告は消える。しかし、毎回Vimを起動する度に上記の設定をするのは面倒。なので[Vimでプロジェクト固有の設定を適用する](https://qiita.com/unosk/items/43989b61eff48e0665f3)を参考に、まず`.vimrc`に

```vim:~/.vimrc
augroup vimrc-local
  autocmd!
  autocmd BufNewFile,BufReadPost * call s:vimrc_local(expand('<afile>:p:h'))
augroup END

function! s:vimrc_local(loc)
  let files = findfile('.vimrc.local', escape(a:loc, ' ') . ';', -1)
  for i in reverse(filter(files, 'filereadable(v:val)'))
    source `=i`
  endfor
endfunction
```

と書いて、もしカレントディレクトリに`.vimrc.local`があったら読み込むようにする。

その上で、先程の`test.cpp`と同じディレクトリに

```vim:.vimrc.local
let g:ale_cpp_clang_options = "-std=c++14 -Wall -I../includes"
let g:ale_cpp_gcc_options = "-std=c++14 -Wall -I../includes"
```

というファイルを作ってやればよい。ファイル構成はこんな感じになる。

```
project
├── includes/
│   └── hoge.hpp
└── src/
    ├── .vimrc.local
    └── test.cpp
```

この状況で`test.cpp`をVimで開いても、「ヘッダが見つからない」とは怒られない。

# まとめ

ALEにプロジェクト固有の情報を伝える方法をまとめた。「C/C++のヘッダは面倒だよね」という話は[ALEのissue](https://github.com/w0rp/ale/issues/392)にもなってて、作者も「100%の解決策はないよね〜」みたいなことを書いている。また、冒頭に書いたように[本家のFAQ](https://github.com/w0rp/ale#faq-c-configuration)に「vimrc-localを使え」と書いてあるんだけれど、僕のようなVim初心者にはそれだけの情報ではきつかった。

# 参考

* [Vimでプロジェクト固有の設定を適用する](https://qiita.com/unosk/items/43989b61eff48e0665f3)
* [ALE FAQ: How can I configure my C or C++ project?](https://github.com/w0rp/ale#faq-c-configuration)
* [ALEのcpp関連の設定情報](https://github.com/w0rp/ale/blob/master/doc/ale-cpp.txt)
C++ Builder > メモリが足りません (Abnormal Program Termination) 表示を別ソフトから検知する + アルファ

```txt:動作環境
C++ Builder XE4
```

### 関連

[C++ Builder > メモリが足りません (Abnormal Program Termination) > 再現方法](https://qiita.com/7of9/items/5b64b5ad82ce0e2119cf)

上記のエラーが出たソフトを探すにはどうするか。

状況としては以下になるようだ。

- メッセージのウィンドウキャプションは「実行ファイル名(.exeなし)」になる
    - 例: Project1

### code

[FindWindow](https://msdn.microsoft.com/ja-jp/library/cc364634.aspx)

```Unit2.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
	HWND hwnd;

	hwnd = FindWindow(NULL, L"Project1");
	if (hwnd == NULL) {
		return;
	}

	ShowMessage("found");
}
//---------------------------------------------------------------------------
```

### 実行例

- [C++ Builder > メモリが足りません (Abnormal Program Termination) > 再現方法](https://qiita.com/7of9/items/5b64b5ad82ce0e2119cf)でビルドしたProject1.exeを実行する。
- Project1のフォーム上のボタンを押して、エラーメッセージを表示しておく
- 上記のコードをビルドしたソフトProject2.exeを実行する
- Project2のフォーム上のボタンを押す

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d8bb7027-505d-eadb-db8a-d4809333a6dc.png)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/54412230-17e6-f5fb-228a-e9c9b6fc4ebd.png)

### プラスアルファ

@ うしおととら
> うしおととらの行動を見てきた親しき者達に告ぐ。 これより先は見てはならぬ… 其は見ずとも良い物語。 見ずとも良い。 見れば心憂い必ずや後悔する。

**注意: 下記は根本原因の解決ではありません。**

「メモリが足りません。」表示に対してOKを押す処理。

```Unit2.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
	HWND hwnd;

	hwnd = FindWindow(NULL, L"Project1");
	if (hwnd == NULL) {
		return;
	}

	SetForegroundWindow(hwnd);
	keybd_event(VK_RETURN, 0, 0, 0);
}
//---------------------------------------------------------------------------
```
HistoryAPIの使い方

必要なメソッドは以下の三種

* pushState(state, title, url)
* replaceState(state, title, url)
* onpopstate(function(e))

# pushState
ブラウザの履歴を追加する

第一引数にjavascriptオブジェクトを自由に入れることができる
第二引数は現在使われていないためnullで良い
第三引数には変更したいurlを入れる

# replaceState
現在のブラウザの履歴を更新する

第一引数にjavascriptオブジェクトを自由に入れることができる
第二引数は現在使われていないためnullで良い
第三引数には変更したいurlを入れる

# pushStateとreplaceStateの違い

例えば localhost:3000/home.htmlという場所をスタートとした場合

```js
// pushStateの場合
pushState(null, null, 'localhost:3000/company.html')
// 履歴の中身 ['localhost:3000/home.html', 'localhost:3000/company.html']
// 戻るボタンを押すとlocalhost:3000/home.htmlに戻る

// replaceStateの場合
replaceState(null, null, 'localhost:3000/company.html')
// 履歴の中身 ['localhost:3000/company.html']
// 戻るボタンを押すとlocalhost:3000/company.htmlよりも前にいたページに戻る
```

というような違いが現れる

# popState
ブラウザの戻るボタンを押したときに発生する(pushStateで入れた履歴の場合のみ)

* サンプル

```js
$(window).on('popstate', function(event) {
  // 処理
})
```
Kinectなきこれから、僕らのジェスチャーデバイス選び

この記事はQuadアドベントカレンダー21日目の記事です。
今年はRealSenseを利用した常設展示物を作ったりしたのですが、非常に不安定で苦労しました...
そんなこともあり別デバイスを検討しようかなと思った矢先に、[Kinect終了が発表](http://jp.techcrunch.com/2017/10/26/20171025microsoft-finally-kills-off-the-kinect-but-the-tech-will-live-on-in-other-devices/)されどうしたものかと思い、現状のデバイスを調べて見ました。

候補に上がるのは以下のものではないでしょうか。

+ Kinect(在庫ある限り...)
+ Intel RealSense
+ Leap Motion

## デバイス別解説

### Kinect

![k2.jpg](https://qiita-image-store.s3.amazonaws.com/0/15535/e7cf9a0d-de68-8679-3424-ee52f260db92.jpeg)

センシング範囲が広いのが特徴、体全体を利用するジェスチャーなどに利用されることが多いようです。確か8mぐらいまで認識範囲があると思います。広い範囲での検知をしたい場合はまずはKinectの選択になるのではないでしょうか。在庫あればですが...

### Intel RealSense
![RS-SR300-carousel-01.jpg](https://qiita-image-store.s3.amazonaws.com/0/15535/b5860e7d-6924-f0e8-6cee-322ae97c013c.jpeg)

[RealSense](https://www.intel.co.jp/content/www/jp/ja/architecture-and-technology/realsense-overview.html)は現状もっとも活発に開発が続けられているデバイスではないでしょうか。Razer Bladeにも搭載されたり、高機能WebCamとしても使えるようです。認識範囲はKinectと比べるとかなり狭く、0.7 ~ 1.0mぐらいです。　おそらくデスク上で利用するのを想定して作られたようです。デフォルトで顔認識あります。(顔認識は2mまで有効です。)

ハンドジェスチャーの判定がデフォルトで組み込まれています。Kinectよりは細かいジェスチャーを検知できます。

ただし、恐ろしく不安定です。 起動してもドライバが落ちたり、反応しなかったりと、個人的には全く信用できないデバイスです。公式サイトでもDevloper Kitという言い方で配布してるのを見るともしかしてこれはあくまでも開発用で、製品版ではない？と勘ぐりたくなります。　（製品版として出してるのは、全て組み込まれものばかりのような...)
ちなみに開発マシンにUSBで直接さして給電はお勧めできません、ベットUSBで給電させながら利用する方法をお勧めします。開発マシンで一点ご注意ください、[Razor](https://www2.razerzone.com/jp-jp/gaming-systems/razer-blade)との相性は最悪です。

### Leap Motion

[LEAP MOTION](https://www.leapmotion.com/)
RealSenseとよく似た機能です。こちらもデスクトップでの利用を想定していると思います。検知範囲も1mぐらいです。
こちらもハンドジェスチャーを検知できます。精度もRealSenseと近いのではないでしょうか？　Macで開発するなら一番相性良さそうです。検知範囲の狭さがネックですかね...

## 新しいデバイス
上記デバイスは正直短い期間の展示物であれば、どうにか持つかもしれませんが、常設となると厳しいです。
そんな僕らの前に現れた新しいデバイスがこちらです。


### ZED 2k Stereo Camera

![ZED_product_main.jpg](https://qiita-image-store.s3.amazonaws.com/0/15535/6ce5332f-393e-4e92-caf2-afdb8dd92bcd.jpeg)

[ZED](https://www.stereolabs.com/)、価格は$449です。
これ良さそうではないですか？　今までのデバイスと違い、Technologyの箇所に<b>SLAM</b>の文字が！！！

Kinectなき今後、これらのデバイスが再び活発に発売されることを期待しています。
手に入ったらレポート書きます。
素の Ruby で HTML エスケープするなら cgi/escapeが最強

# はじめに

ここでいう HTML エスケープは，文字列中の `&` や `<` などを `&amp;` や `&lt;` などの文字参照に変換することを指します。

Rails などのウェブアプリケーションフレームワークや何らかの HTML テンプレートシステムなどを使っている場合，HTML エスケープのためのメソッドが用意されているので，それを使えばいいでしょう。

そうでない場合はどうするか，というのがこの記事の主旨です。

# 自前で実装

自分で Ruby で実装するなら，おそらく以下のようなコードが最適でしょう。

```rb
ESCAPE_TABLE = {
  '&' => '&amp;',
  '<' => '&lt;',
  '>' => '&gt;',
  '"' => '&quot;',
  "'" => '&#39;'
}

def escape_html(str)
  str.gsub(/[&<>"']/, ESCAPE_TABLE)
end
```

# cgi/escape を使え

HTML エスケープ用メソッドを自前で書く必要はありません。
標準添付ライブラリー `cgi` に用意されているからです。

CGI を書く人がほとんどいなくなった今，忘れられたライブラリーとも言えそうです。

「でも，たかがエスケープのために CGI なんか扱うゴツい（？）ライブラリー読み込むのヤだなあ」ですって？
いえいえ，Ruby 1.9 以降の `cgi` ライブラリーはいくつかに分割されているので，HTML エスケープのためのライブラリーファイルだけを読み込めばいいのです。
Ruby 2.3 以降なら，`cgi/escape` だけ読み込めば OK です。

以下のように使います。

```rb
require "cgi/escape"

puts CGI.escapeHTML("<a> & 'b'") # => "&lt;a&gt; &amp; &#39;b&#39;"
```

# cgi/escape は何が嬉しいのか

`cgi` ライブラリーにおける ` CGI.escapeHTML` は，Ruby 2.2 までは Ruby で書かれていました。
それが，[C によって書き直され](https://github.com/ruby/ruby/pull/1164)，Ruby 2.3 に搭載されました。

これによりエスケープ処理が格段に高速化されたのです。
もう**コレ一択**ですね！

# おまけ：cgi/util について

最後に，`cgi/util` ライブラリーについて述べておきます。

`cgi/escape` が Ruby 2.3 で導入された C 実装のライブラリーであるのに対し，`cgi/util` は Ruby 2.2 以前も 2.3 以降も存在する，Ruby で書かれたライブラリーです。

`cgi/util` には，エスケープ処理などに関するいくつかのメソッドやエイリアスが定義されています。

Ruby 2.3 以降は，〈もし `cgi/escape` が無かったら `cgi/util` 内で定義された `escapeHTML` メソッドが生きる〉ようになっています。
「`cgi/escape`  が無い場合」というのは， JRuby などでしょうか？

# Ruby 2.7 でさらに高速化（2019-12-04 追記）

Ruby 2.7 で，`CGI.escapeHTML` がさらに高速化したそうです。

参考：

* [Ruby 2.7.0-preview3 リリース](https://www.ruby-lang.org/ja/feeds/news.rss)
* [Optimize CGI.escapeHTML by reducing buffer extension and branches by k0kubun · Pull Request #2226 · ruby/ruby](https://github.com/ruby/ruby/pull/2226)

# 別名もあるよ（2019-12-23 追記，2021-12-02 書き直し）

`escapeHTML` というメソッド名が Ruby ぽくなくて気に入らないなら，`escape_html` という<ruby>別名<rt>エイリアス</ruby>もあります。
ただし，この別名は `cgi/escape` では定義されていないので，こちらを使いたければ

```rb
require "cgi/escape"
```

ではなく

```rb
require "cgi/util"
```

とする必要があります。
Planning Analytics Local の Software Supported Environments サイト

#内容
少し前まで見えたはずの、Planning Analytics Local 2.0のSoftware Supported Environmentsサイトが最近見れません。
http://www-01.ibm.com/support/docview.wss?uid=swg27049052

ここ数日困ったなあと思っていたのですが、以下のサイトからアクセスして、
https://www.ibm.com/software/reports/compatibility/clarity/index.html

「Operating System」とか「Related Software」をチェックして、「Create a report」すれば見れる事がわかりました。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/a67c7145-e177-7c71-8336-cc5fa4b22538.png)

同じ様に困ってる人もいるかも知れないので、情報共有まで。
他のS/Wでも見れないサイトがある時は、こちらからお試し下さい。
pythonでrandomを使ってみる。

なにぶん、初心者なもので。
randomの使い方もわからんかったのです。

`shiracamus様よりご指摘頂いた点を修正致します`


python3でコンソール立ち上げて…

まずはモジュールを使えるようにする。
`import random`

単純な乱数取得

```py
>>> print(random.random())
0.7053217152160873
>>> print(random.random())
0.8461746389717953
>>> print(random.random())
0.12047153256715915
>>> print(random.random())
0.31427179976283537
```

リストのシャッフル

```py
>>> data = ["A", "B", "C"]

>>> data
['A', 'B', 'C']

>>> random.shuffle(data)
>>> data
['A', 'C', 'B']
>>> random.shuffle(data)
>>> data
['B', 'C', 'A']
>>> random.shuffle(data)
>>> data
['A', 'C', 'B']
```

```py
>>> random.shuffle(data)
>>> data[1]
'A'
>>> random.shuffle(data)
>>> data[1]
'C'
>>> random.shuffle(data)
>>> data[1]
'A'
>>> random.shuffle(data)
>>> data[1]
'A'
>>> random.shuffle(data)
>>> data[1]
'A'
>>> random.shuffle(data)
>>> data[1]
'A'
>>> random.shuffle(data)
>>> data[1]
'A'
>>> random.shuffle(data)
>>> data[1]
'C'
>>>
```
リストの数が少ないからあまり変化してるようには見えませんね…。


チョイス（追記しました）

```py
>>> data =  ["A", "B", "C", "D", "E"]
>>>
>>>
>>> import random
>>> random.choice(data)
'B'
>>> random.choice(data)
'E'
>>> random.choice(data)
'B'
>>> random.choice(data)
'D'
>>> random.choice(data)
'D'
>>> random.choice(data)
'B'
>>>
```

シャッフルはリストを破壊的にまぜまぜするんすね。
１個だけとるならチョイスのほうが楽ですね…。

slackbotでランダムな回答をしようと思って使ってみました。
randomはもっと色々使えそう。
JSON.stringifyを自分で作ってみた

そういえば自分で実装したことがあったので、せっかくなので公開してみる。
ちなみに結構しんどかった。

```javascript
  const _ = require('underscore'); // ライブラリunderscoreを使う。

  const addDoubleQuatationToString = function (str) {
    if (typeof str === 'string') {
      return '\"' + str + '\"';
    } else {
      return str;
    }
  };

  const arrWithNoElement = function (arr) {
    return Array.isArray(arr) && arr.length === 0;
  };

  const objWithNoPropety = function (obj) {
    return typeof obj === 'object' && !Array.isArray(obj) && Object.keys(obj).length === 0;
  };

  const isNotObject = function (obj) {
    return typeof obj !== 'object';
  };

  const isBaseCase = function (obj) {
    return obj === null || isNotObject(obj) || arrWithNoElement(obj) || objWithNoPropety(obj);
  };

  const stringify = function(obj) {
    let resultString = '';
    let count = 0;
   
    if (isBaseCase(obj)) {
      if (obj === null) {
        resultString += obj;
      } else if (arrWithNoElement(obj)) {
        resultString += '[]';
      } else if (objWithNoPropety(obj)) {
        resultString += '{}';
      } else {
        resultString += addDoubleQuatationToString(obj);
      }
      return resultString; 
    } else {
      _.each(obj, function (value, indexOrKey, iteratedObj) {
        if (Array.isArray(iteratedObj)) {
          if (count === 0) {
            let addedString = stringify(value);
            resultString += '[' + addedString;
          } else {
            let addedString = stringify(value);
            resultString += ',' + addedString;
          } 
          count ++;
          if (arrWithNoElement(iteratedObj) || count === iteratedObj.length) {
            resultString += ']';
          }
        } else {
          if (count === 0) {
            let addedString = stringify(value);
            resultString += '{' + addDoubleQuatationToString(indexOrKey) + ':' + addedString;
          } else {
            let addedString = stringify(value);
            resultString += ',' + addDoubleQuatationToString(indexOrKey) + ':' + addedString;
          } 
          count ++;
          if (count === Object.keys(iteratedObj).length) {
            resultString += '}';
          }
        }
      });
      return resultString;
    }

  };
```
MonacaアプリのイベントとNCMBの関係

ちょうどハマったので共有を。

Monacaアプリを作る際にはJavaScriptを使いますが、動かすときには幾つかのイベントがあります。主なものとして以下があります。

- deviceready
- DOMContentLoaded
- ons.ready

devicereadyはアプリが動作できる状態になり、**プラグインの呼び出しが可能になった時に呼ばれます** 。それに対して DOMContentLoaded はDOMの読み込みが完了したタイミングで呼ばれます。devicereadyはDOMContentLoadedより後に呼ばれるようです。ons.readyはさらにOnsen UIの画面構築まで完了したタイミングで呼ばれるイベントです。

devicereadyはアプリ、つまりiOSやAndroid環境でしか呼ばれないためにMonaca IDEのプレビュー表示では呼ばれないイベントになります。そのため、つい DOMContentLoaded を使ってしまいます。

そして本題なのですが、DOMContentLoadedのタイミングではプラグインが使えない状態なので、ニフクラ mobile backendのプッシュ通知のデバイストークン登録に失敗します。

```javascript
NCMB.monaca.setDeviceToken(
  applicationKey,
  clientKey,
  senderId,
  function() {
    alert('Registerd.');
    NCMB.monaca.getInstallationId((id) => {
      alert("installationID is: " + id);
    });
  },
  function(err) {
    alert(JSON.stringify(err));
  }
);
```

動かすためには deviceready で実行する必要があります。

## 解決策

プレビューでも動いてプッシュ通知のデバイストークン登録もできるようにするには実機動作かどうかを判断するのが良さそうです。

```javascript
const event = window.cordova ? 'deviceready' : 'DOMContentLoaded';
document.addEventListener(event, () => {
  // この中で処理
});
```

ons.ready を使っている場合はこういった問題は発生しないでしょう。

```javascript
ons.ready(() => {
  
});
```

----

試していないですが、 jQueryの `$(function() {});` は `$(document).ready(function(){});` と同じで、ドキュメントが準備完了になった段階で呼ばれるのでプラグインが使えるとは限りません。同じ問題が発生する可能性があります。スマートフォンアプリを作っているのでちゃんと deviceready を使いましょう。
Parcel+VueJS環境づくりまで(.vueファイル使用)

# もう古いので
https://qiita.com/rururu3/items/ba58f5538804186a6d76
こっちみてね

---

https://qiita.com/rururu3/items/3a90858844e7b2a90e42
を書いた後、しばらくしてまた調べてみたら.vueファイル使えるっぽいので構築までしてみたら出来た。

# parcelとは
https://parceljs.org/
コンフィグ無しでウェブアプリケーション作ろうぜ・・・って言う感じのビルドツール

# 環境構築
```
npm install --save-dev babel-preset-env parcel-bundler parcel-plugin-vue vue
```

# 各種ソース
```package.json
{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "dev": "parcel index.html",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "babel-preset-env": "^1.6.1",
    "parcel-bundler": "^1.2.1",
    "parcel-plugin-vue": "^1.4.0",
    "vue": "^2.5.13"
  }
}
```

```json:.babelrc
{
    "presets": ["env"]
}
```
```index.html
<html>
<body>
  <div id="app"></div>
  <script src="./index.js"></script>
</body>
</html>
```

```index.js
import Vue from 'vue/dist/vue.esm.js';
import MyApp from './MyApp.vue';

new Vue({
  el: '#app',
  components: {
    MyApp,
  },
  template: '<my-app></my-app>',
});
```

```html:MyApp.vue
<template>
  <div>
    {{ title }}
  </div>
</template>

<style>
</style>

<script>
  export default {
    data() {
      return({
        title: 'Hello World',
      });
    },
  }
</script>
```

# 結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142784/0137d2a1-a825-a18b-da8d-11ea7a94829f.png)

# 感想
.vue出来たから、次作るものから移行しようかな

# 置き場
https://github.com/rururu3/ParcelVueComponentMyTemplate
Making debian package

#check install でdebを作る
## boost
```shell-session
./bootstrap.sh --prefix=/usr/local/boost
./b2
sudo checkinstall ./b2 install
```

## opencv
```shell-session
# remove opencv if installed
rm -rf /usr/local/opencv
  
./configure xxxx .
make -j2
sudo checkinstall
```

# ディレクトリ構成からdeb作る
http://d.hatena.ne.jp/conceal-rs/20090518/1242643016
YellowfinでのJavascriptChart作成のTips

#前段

前回の[記事](https://qiita.com/celery/items/858de1f0eeb579b1f4a0)では、ほぼ貼り付けでタグクラウド型Chartが作成できる方法をご紹介しましたが、
今回はより開発しやすいよう、様々なTipsを挙げていきます。

<img width="845" alt="YellowfinJSChartについて.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/223443/ce0281a2-6919-c7fd-a869-55c4b19f41a7.jpeg">


#データの呼び出し

generateChart変数に関数を設定し、optionsと引数を与えることで、Yellowfinのデータタブで用意したデータが参照できるようになります。

<img width="550" alt="options.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/223443/a8d39c9f-d607-0f51-dcf0-648d1f6f2327.jpeg">

#debugのやり方

上の画像でも入力されていましたが、debugger;を記述することで、breakpointを設置することができます。ライブラリ中でも可能です。

<img width="415" alt="debugger.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/223443/9800ce5f-6df5-f91a-4138-c40da5eb25f1.jpeg">

chromeデベロッパーツール(windowsではF12、Macではcommand+option+i)を開き、
プレビュータブに移ることで設定したbreakpointでオブジェクトの中身等を確認できます。

<img width="599" alt="debugger2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/223443/86203c2a-5dbc-ffb8-ecb4-e31dab34c5a9.jpeg">

#Yellowfinのoutput型(Objectとは)

オブジェクトとしてまずoutputされる。アクセスには中の子どもを参照する。

<img width="815" alt="object.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/223443/6d0ee6f8-d739-39c8-3318-82420787b58f.jpeg">

データはdataのObjectの中に入っており、その下にカラム名、データが格納されている。
アクセスしたいデータにフォーカスするとこんな感じ

options:Object
-dataset:Object
--data:Object
---カラム名:Array
----カラム名[n]:Object
-----formatted_data
-----raw_data

#おまけ(JavascriptChart作成で重要なこと)

なんらかのライブラリを使用する場合、 YellowfinからのOutputの型、そして、そのライブラリのinputの型を合わせることが必要です。
これはここだけの話しではなく、バッチ処理、データ移行処理の基本ですね。

<img width="862" alt="omake.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/223443/7be6ca0c-6bb5-add5-4969-754f6efb4dda.jpeg">

ちなみに右上のライブラリは[前回作成したd3-cloudライブラリ](https://qiita.com/celery/items/858de1f0eeb579b1f4a0)のオブジェクト型です。
C++ Builder XE4 > メモリが足りません (Abnormal Program Termination) > 再現方法

```txt:動作環境
C++ Builder XE4
Windows 7 Pro (32bit)
```

「メモリが足りません」もしくは「Abnormal Program Termination」というエラーはどの場合に出るのか。

### code

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	TDateTime dt1 = VarToDateTime(L"2017/12/21 14:20");
}
//---------------------------------------------------------------------------
```

エラーの発生手順は以下。

- 上記のソフトをビルドして、日本語Windows 7環境で実行する
- ボタンを押す

### 英語OS環境

英語版のWindows 7環境では「Abnormal Program Termination」になるのではないだろうか。

[What Causes "Abnormal Program Termination"](https://community.embarcadero.com/article/technical-articles/162-programming/14933-what-causes-abnormal-program-termination)

> (2) There is not enough memory to expand the stack.

現在見つかっている「Abnormal Program Termination」に対して、その解決の糸口をどのように見つけるか。

### VarToDateTime

http://docwiki.embarcadero.com/Libraries/XE4/ja/System.Variants.VarToDateTime

> 指定されたバリアントを TDateTime 値に変換します。

Lプリフィックスにすると、バリアントの認識に失敗するのかもしれない。

いったん、String型変数において、VarToDateTime()を使う場合はエラーにはならない。
ActiveAdminでselect2をactiveadmin_addonsを利用して使う

# はじめに
Rails4.2から5.0->5.1にアップグレードする際にActiveAdminのバージョンも上げた。
ActiveAdminでselect2を利用する[activeadmin-select2](https://github.com/mfairburn/activeadmin-select2)が2016年4月からメンテされてていないようで、
現行のActiveAdmin1.2とRails5.1の組合せでは動作しなかった。

そこでActiveAdminでselect2が別扱える[activeadmin_addons](https://github.com/platanus/activeadmin_addons)を利用することにした。

activeadmin_addonsからselect2を使う方法及び、activeadmin-select2からactiveadmin_addonsへ移行する方法を記す

ActiveAdminでselect2が動くとこのような補完表示ができる
![](https://raw.githubusercontent.com/platanus/activeadmin_addons/master/docs/images/select2-default.gif)

※ 個人的な意見としてはActiveAdminを使うとメンテしにくくて、テーブルの要素を一覧以外の機能を追加したくなったらTwitter Bootstrapなど使って簡易なデザインの管理画面を作ることをおすすめする


### 今回のgemのバージョン
* activeadmin (1.2.0)
* activeadmin_addons (1.1.1)

## Gemfileの変更

```
activeadmin # そのまま
activeadmin_addons # 追加
# activeadmin-select2　# 削除
```

### 設定ファイルの自動生成
```
bin/rails g activeadmin_addons:install
```

config/initializers/activeadmin_addons.rb　が生成される

## select2の設定


## 注意デフォルトの<input type='select'>がselect2になる

例えば年月日などもselect2になってしまうと、幅調整などに時間が取られてしまう。
既存のActiveAdminで書いた資産を利用する場合はこれ結構手間である。

[![https://gyazo.com/ff963f623b660a9cc0e3a572bda878fc](https://i.gyazo.com/ff963f623b660a9cc0e3a572bda878fc.gif)](https://gyazo.com/ff963f623b660a9cc0e3a572bda878fc)


[![https://gyazo.com/4b2aa2ad37c577de08390e68b6b99b33](https://i.gyazo.com/4b2aa2ad37c577de08390e68b6b99b33.gif)](https://gyazo.com/4b2aa2ad37c577de08390e68b6b99b33)


回避方法は2通り有り、後者の方がactiveadmin-select2から移行する場合は修正が少なくて済む


### 回避方法1 select2を使わない<input type='select'>にはクラスにdefault-selectを設定する

つまりこのように書いてあげる

```
f.input :created_at, input_html: { class: "default-select" }
```


### 【推奨】回避方法2 select2を使わない<input type='select'>にはクラスにdefault-selectを設定する

activeadmin_addonsの設定ファイルにあるデフォルトのselectの書き方がselect2になっているのでdefaultにしてあげることで、
selectタグが通常のselectタグの表示になる


```config/initializers/activeadmin_addons.rb
ActiveadminAddons.setup do |config|
  config.default_select = "default"
end
```

明示的にselect2で表現したい<input type='select'>に、classにselect2を設定する。
この修正方法はactiveadmin-select2でselect2を設定していた箇所のみ明示的に置き換えするので移行しやすい

```
# 旧activeadmin-select2版のselect2でフォームを記載する場合
f.input :created_at, as: :select2

# activeadmin_addons版
f.input :created_at, input_html: { class: "select2" }
```

参考: https://github.com/platanus/activeadmin_addons/blob/master/docs/select2_default.md
Dockerizeを使って他のコンテナの起動を待つ

# はじめに
この記事は「[学生 Advent Calendar 2017](https://adventar.org/calendars/2386)」7日目(大遅刻)の記事です。

docker-composeの`links`や`depends_on`を使えば、コンテナの起動順を制御することはできます。しかし、他のコンテナの起動を待つことはできません。

例えばデータベースを利用するアプリのコンテナとデータベースのコンテナがあったときに、データベースが起動していないにもかかわらずデータベースを利用するコンテナがデータベースに接続しようとして、例外を吐いて落ちてしまうことがあります。

そこで今回は`Dockerize`を用いて、他のコンテナの起動を待つことができるように設計する方法を紹介します。

# Dockerfile側の準備
Dockerizeはコンテナ内に導入するツールです。従って、Dockerfileにdockerize導入コマンドを追記していきます。Ubuntu(Alpine以外?)用とAlpine用にそれぞれ別のバイナリが用意されているので、導入時には注意しましょう。

バイナリをもらってくるのに必要なhttps対応のwgetを導入して、Dockerizeのバイナリを落としてきて、指定した場所に配置して、tar ballを削除するだけのコマンドです。

```dockerfile:Ubuntuの場合
ENV DOCKERIZE_VERSION v0.6.1
RUN apt-get update && apt-get install -y wget \
 && wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
 && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
 && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz
```

```dockerfile:AlpineLinuxの場合
ENV DOCKERIZE_VERSION v0.6.1
RUN apk add --no-cache openssl \
 && wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
 && tar -C /usr/local/bin -xzvf dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
 && rm dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz
```

# docker-compose側の準備
続いてdocker-compose側で待つ対象を指定します。今回は`entrypoint`を利用して待つ動作を挟み込みましょう。今回はタイムアウト時間を60秒に設定し、`tcp://mysql:3306`に応答があるまで待つようにしています。

ただ、このままだと応答があった時点でコンテナが終了してしまうので、`command`に起動したいアプリの起動コマンドを記入しておくことを忘れないでください。今回はPythonアプリを起動する例を挙げておきます。

```yaml
version: '3'
services:
  app:
    build: .
    ports:
      - "5000:5000"
    links:
      - mysql
    entrypoint:
      - dockerize
      - -timeout
      - 60s
      - -wait
      - tcp://mysql:3306
    command: python /usr/src/app/hoge/app.py

  mysql:
    image: mariadb:latest
    environment:
      MYSQL_ROOT_PASSWORD: 'root_pass'
      MYSQL_DATABASE: 'hoge'
      MYSQL_USER: 'hoge'
      MYSQL_PASSWORD: 'hoge_pass'
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
```

# おわりに
既存のDockerfileとdocker-compose.ymlに少し記述を追加するだけで、コンテナの起動を待つように設定することができました。いろいろな箇所で役立つはずですので、ぜひお試しください。
【PlayCanvas】twitter上でPlayCanvasコンテンツを動かす

#何
twitterのplayer cardを使ってPlayCanvasのコンテンツを動かしてみます
結果はこんな感じ
![embedtwitter.gif](https://qiita-image-store.s3.amazonaws.com/0/148084/fa1d28de-cbbc-1883-14ee-172b45d7b0f9.gif)
https://twitter.com/utautattaro/status/970216193679179776

#やり方
twitter の player cardを利用します
[Player card — Twitter Developers](https://developer.twitter.com/en/docs/tweets/optimize-with-cards/overview/player-card)

HTMLのhead内に以下のようにtwitter 用のmetaタグを記入します。

```html:index.html
<head>
<meta name='twitter:card' content='player'/>
<meta name='twitter:title'content=タイトル/>
<meta name='twitter:description'content=説明/>
<meta name='twitter:image'content=実行前に表示される画像の絶対パス/>
<meta name='twitter:player'content=PlayCanvasの実行URL/>
<meta name='twitter:player:width'content='640'/>
<meta name='twitter:player:height'content='480'/>
</head>
```

登録ができたら以下のリンクから正しく登録できたかテストします。
[Card Validator - Twitter](https://cards-dev.twitter.com/validator)

player cardの場合はドメイン単位でtwitterのwhitelistに登録する必要があるので、まず使う前に上のリンクから登録します。

1,2日程度で登録が完了したメールが届くので、以降はURLをつぶやくだけで使うことができます。
自己流テスト作成技法まとめ

初めまして、ハンズラボエンジニアの @szkdskです。
前職はSIerで、ハンズラボには今年1月に入社したので今月でちょうど1年が経ちます。
テストについての記事を書きたいなーと思っていたらアドベントカレンダーやるということで、
軽い気持ちで参加しました。

これまでの経験から、フィーリングで記事を書いているので誤りなどご指摘いただけると幸いです。


# テストケースの作成について感じていること
本記事では、単機能テストのケースの作り方についてを書いていきます。
前職では複数のシステムのお仕事をさせていただきましたが、
テストケースの作り方については「現場独自のノウハウ」「ベテランの経験と勘」という案件が多く、
体系的にまとまっていないと感じていました。（もちろん、きちんとノウハウ化している方々も多くいらっしゃると思います。）
そんな中で、初めてテストケースを作ることになった方や、
以前のテストをそのまま使いまわしているけれど、なんでこのケースをやっているんだ？という疑問を持った方向けに
自分が使っている手法について、まとめてみます。

# ソフトウェアテストのV字モデル
ソフトウェアテストにはV字モデルというものがあり、  
それぞれの段階でテストする観点などが違ってきます。  
それぞれについていくつか具体例をあげると以下のようになるかと思います。

* コーディングに対するテスト
    * linter、コンパイラ

* 詳細設計に対するテスト
    * 単機能テスト
    * 自動テスト(単機能テストに相当するユニットテスト)

* 機能設計に対するテスト
    * 結合テスト
    * I/Fテスト
    * シナリオテスト

* システム設計に対するテスト
    * 性能テスト
    * 運用テスト

このうち案件に寄らずにテストケースを考えることができるのは、
単機能テスト（含む自動テスト）です。
私の場合、テストケースを考える際、ホワイトボックステストと、ブラックボックステストの二つに分けています。

## ホワイトボックステスト
ホワイトボックステストは、ソースコードからテストケースを作成する手法です。  
ソースコードを基準としてテストをするため、論理的に誤ったコードを判別することが可能ですが、機能や仕様の間違いを摘出することは不可能です。  
全てのコード、条件分岐を通るようにテストケースを作成します。
テスト結果としては、カバレッジ率を指標とすることが多いです。
また、静的解析ツールをこのタイミングで実行し、テスト結果とすることもあります。  


## ブラックボックステスト
ブラックボックステストは、入出力仕様からテストケースを作成する手法です。
ソースコードは考えず、その機能が「何を入力するのか」「何を出力するのか」をテストするケースを作成します。
同値分割・境界値分析やデシジョンテーブルを用いてテストをするのが一般的だと思います。  
### 同値分割・境界値分析
例えば、20才区切りで0〜100才までの年齢を入力して情報を出力するプログラムのテストをする場合、
すべてのケースをテストすると101ケース実施することになってしまいます。
そこで、同じ結果となる入力値を一つにまとめて"同値クラス"というもの作り、同じ結果になるものの中でも  
代表的な値や、結果が変化する境界にある値のみをテストし、無駄なテストケースを省略します。
以下に例を挙げてみます。
この例の場合は代表値、限界値をテストすれば良いので、101ケースから、15ケースまで省略できます。

| 年齢層 | 代表値（同値クラス内の任意の値） | 下限値 | 上限値 |
|--------|----------------------------------|--------|--------|
| 0〜20  | 15                               | 0      | 20     |
| 21~40  | 30                               | 21     | 40     |
| 41~60  | 50                               | 41     | 60     |
| 61~80  | 70                               | 61     | 80     |
| 81~100 | 90                               | 81     | 100    |

### デシジョンテーブル
デシジョンテーブルとは、Yes/Noで判別できる条件を集めて、結果を判別する手法です。
割引の条件がサービスデー、60才以上、会員であること の3つの条件があり、
そのうち一つ満たせば20%、二つで30%、すべて満たすと40%となる仕様がある時、
どのような入力をすればすべてのパターンが作れるかを考える際に使用します。

| No.  |                    | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|------|--------------------|---|---|---|---|---|---|---|---|
| 条件 | サービスデーである | Y | Y | Y | Y | N | N | N | N |
|      | 60才以上である     | Y | N | Y | N | Y | Y | N | N |
|      | 会員である         | Y | N | N | Y | Y | N | Y | N |
| 結果 | 割引率40%          | Y |   |   |   |   |   |   |   |
|      | 割引率30%          |   |   | Y | Y | Y |   |   |   |
|      | 割引率20%          |   | Y |   |   |   | Y | Y |   |
|      | 割引なし           |   |   |   |   |   |   |   | Y |

## エラー推測
不具合が起きやすい条件でテストを実施する手法です。
言語やフレームワークによってケースとするべき内容が変わる場合がありますが、
代表的なものをいくつか挙げます。

- 小数計算時の丸め誤差
- 空文字入力、null入力
- 半角スペースや*(アスタリスク）、HTMLタグ、SQLなどの特殊な意味を持つ入力
- うるう年
- 存在しない日付、時間の入力
- データベースにデータが入っていない状態での処理実行
- etc


## 最後に
とりとめもなく書き連ねてしまいましたが、この記事が少しでもお役に立てれば幸いです。

明日は@Yuki_BB3さんの記事です！
Unknown switches '--colors, --progress'

railsのwebpackerで`$ bin/webpack --colors --progress`を実行すると、Unknown switches '--watch, --progress, --color'と言われてしまった。

どうも、bundlerの不具合のようで、1.16.xにupdateしたら、`$bundle binstub bundler --force`を実行して、bundlerのbinstubを再作成しないといけないらしい。

###参考サイト
https://github.com/bundler/bundler/issues/6149
https://techracho.bpsinc.jp/hachi8833/2016_08_24/25037
Ethereum Smart Contract Security Best Practicesの日本語訳をしました

この記事は[Ethereum Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ethereum)、21日目の記事です。

私自身Advent Calendarで何かを発信するのは初めてで、これを機に[Ethereum Smart Contract Security Best Practices](https://consensys.github.io/smart-contract-best-practices/)の日本語訳をしました。数ヶ月前からやろうやろうと思って先延ばししてたので、締切あるの本当に大事ですね。。

前日の[kurotaky](http://kurotaky.hatenablog.com/entry/2017/12/20/233000)さんと偶然ネタが被ってしまいましたがご愛嬌:joy:

今回まとめた日本語訳はこちらで公開しています。
https://msykd.github.io/smart-contract-best-practices/

# Ethereum Smart Contract Security Best Practicesとは
Ethereum(Solidity)でコントラクトを設計・開発する上でのベストプラクティスがたくさん載っています。
特にスマートコントラクトは、パブリックチェーンに1度乗せてしまうと何かトラブルがあった時のリスクが甚大になってしまう可能性が高いです。それを未然になるべく防ぐための情報や考え方が詰まっています。
コントラクト開発される方は必ず一読されることをオススメします。

# 補足
ざっと一通り訳しましたが、Google翻訳大先生にほぼ頼っています。
よって訳の間違い、誤字・脱字が大量に発生している可能性もあるのでアントラストでお願いします:sweat:
今回すごく勉強になったので、皆様も和訳チャレンジしてみるのオススメです〜。
MYSQLの全文検索で検索文字列を沢山入れたらエラーになった。

# 環境

MYSQL 5.7.20

# 事象

FULLTEXTインデックスを設定したカラムに以下のような[バイグラムで検索](https://qiita.com/horikeso/items/eb8d55ec05a324d07fa3)するSQLを実行したところ

```sql
SELECT COUNT(*) FROM `table_name` WHERE (match(`bigram`) against('+"長い い文 文字 字列" in boolean mode'));
```

下記のエラーが出た

```
ERROR 191 (HY000): Too many words in a FTS phrase or proximity search
```

`match against in boolean mode`を使う際は気を付けた方が良さそうです。
バリデーションルールのminとは？再勉強


やりたいこと

凄く単純な事ですけど、バリデーションルールを使い、ユーザの年齢をチェックしたいことです。

```php:UserRquest.php
public function rules()
{
    return [
        'age' => 'required|min:1|max:100',
    ];
}
```
ageの値は０で入力して、POSTすると、エラーメッセージが出ませんでした。
あれ？！！なんで？


いろいろ調べる、minは文字サイズの最小値として判定するかもしれません？

例：タイトルは1から１００文字

```php:
public function rules()
{
    return [
        'title' => 'required|min:1|max:100',
    ];
}
```
で、試しすると、思った通りに実行することができました。


じゃあ、`between`を使えば、いけるなかと

```php:UserRquest.php
public function rules()
{
    return [
        'age' => 'required|between:1,100',
    ];
}
```
ダメでした。
０を入力したのに、またバリデーションに合格


またいろいろ調べると、ドキュメントから

> between:min,max
> フィールドが指定された最小値と最大値の間のサイズであることをバリデートします。sizeルールと同様の判定方法で、文字列、数値、配列、ファイルが評価されます。

> digits_between:最小値,最大値
> フィールドが整数で、桁数が最小値から最大値の間であることをバリデートします。

ということでした。

最終のソースコード

```php:UserRquest.php
public function rules()
{
    return [
        // 'age' => 'required|integer|between:1,100',
        'age' => 'required|digits_between:1,2',
    ];
}
```

結局、自分の勉強不足でした。
一生忘れないように以上のメモを。