OmniAICreator/Qiita-1.07M huggingface dataset:
AsyncReactiveCommandのコードスニペット

#背景
17/03/28 追記：※ReactiveProperty3.6.0からこのコードスニペットが含まれます。

既存のReactiveProperty関連のコードスニペットとして

- ReactiveCollection
- ReactiveCommand
- ReactiveCommandGeneric
- ReactiveProperty
- ReadOnlyReactiveCollection
- ReadOnlyReactiveProperty

はありますが、AsyncReactiveCommandのスニペットは無かったので作りました。
なお、上記コードスニペットは
ReactivePropertyをnugetで取得するとついてきますが、
使用するためには手動でコードスニペットマネージャーに追加する必要があります。

#コード

```xml:AsyncReactiveCommand.snippet
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Keywords>
        <Keyword>arcomm</Keyword>
      </Keywords>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
      <Title>AsyncReactiveCommand</Title>
      <Author>soi</Author>
      <Description>AsyncReactiveCommand Non Generic</Description>
      <Shortcut>arcomm</Shortcut>
    </Header>
    <Snippet>
      <Declarations>
        <Literal Editable="true">
          <ID>CommandName</ID>
          <Default>CommandName</Default>
        </Literal>
      </Declarations>
      <Code Language="csharp"><![CDATA[public AsyncReactiveCommand $CommandName$ { get; }$end$]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>
```

```xml:AsyncReactiveCommandGeneric.snippet
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Keywords>
        <Keyword>arcommg</Keyword>
      </Keywords>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
      <Title>AsyncReactiveCommandGeneric</Title>
      <Author>soi</Author>
      <Description>AsyncReactiveCommand Generic</Description>
      <Shortcut>arcommg</Shortcut>
    </Header>
    <Snippet>
      <Declarations>
        <Literal>
          <ID>T</ID>
          <Default>T</Default>
        </Literal>
        <Literal Editable="true">
          <ID>CommandName</ID>
          <Default>CommandName</Default>
        </Literal>
      </Declarations>
      <Code Language="csharp"><![CDATA[public AsyncReactiveCommand<$T$> $CommandName$ { get; }$end$]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>
```

##使用方法
上記コードのファイルを作成して、
VisualStudioのコードスニペットマネージャーから追加できます。
Railsでmarked.jsを使用してみる

こちらの方の記事を参考に、Markdownのプレビュー機能を作成しました。
[Railsにマークダウンのリアルタイムプレビューを実装する](http://qiita.com/fujitora/items/425ed05d213dd07c6ab5)
ただ、そもそも使用しているライブラリに対する知見がないため、メモとして残したいと思います。

下記2つのライブラリを使用しておりますが、今回は *marked.js* に関して記載します。

- marked.js
- vue.js

なお、Ruby、Railsのバージョンは下記になります。

- Ruby 2.3.1
- Rails 5.0.0.1

## 公式ドキュメント

marked.js自体のドキュメントはこちら。
[https://github.com/chjj/marked](https://github.com/chjj/marked)
marked.jsのGemのドキュメントはこちらです。
[https://github.com/rosscooperman/marked-rails](https://github.com/rosscooperman/marked-rails)

## インストール

Gemfileに追記し、インストールします。

```rb:Gemfile
gem 'marked-rails'
```
```
$ bundle install
```
application.jsに下記を追記します。
（Rails 3.1以上であれば、Asset Pipelineによって読み込めるので、個別インストールの必要はないようです。）

```rb:application.js
//= require marked
```
Railsへのインストールはこれで完了です。

## 実際に使用してみる

[marked.jsの公式ドキュメント](https://github.com/chjj/marked)を参考に、実際に使用してみます。
適当なビューを作成し（今回はindexとします。）、下記を記載します。

```html:index.html.erb
<div id="content"></div>
<script>
  console.log(marked('I am using __markdown__.'));
  document.getElementById('content').innerHTML =
      marked('# Marked in browser\n\nRendered by **marked**.');
</script>
```
すでにmarkedはGemでインストールしているので、`marked`メソッドが使用できます。
ブラウザで表示した結果はこちらです。
![スクリーンショット 2017-02-07 11.52.52.png](https://qiita-image-store.s3.amazonaws.com/0/118817/b97745a9-9832-8991-a467-466cece3bf7e.png)

逆に`marked`メソッドがない場合は下のようになります。

```js
document.getElementById('content').innerHTML =
      '# Marked in browser\n\nRendered by **marked**.';
```
![スクリーンショット 2017-02-07 11.56.27.png](https://qiita-image-store.s3.amazonaws.com/0/118817/474c77b6-2d19-d358-5e64-51a4e6e4aaf6.png)

Markdownはきいておらず、単なる文字列として出力されています。
いくつかMarkdownを試してみましたが、基本的なところは普通に出力できました。
[日本語Markdownユーザー会](http://www.markdown.jp/syntax/)

## オプションについて

いくつかオプションも設定できるようです。
詳しくは調べられていないので、設定のコードを記載します。
また、ハイライトについては[公式ドキュメント](https://github.com/chjj/marked)の例では、[node-pygmentize-bundled](https://github.com/rvagg/node-pygmentize-bundled)と[highlight.js](https://github.com/isagalaev/highlight.js)と連携していました。

```js
  marked.setOptions({
    // コードのハイライト（今回は割愛）
    highlight: function (code, lang, callback) {
      require('pygmentize-bundled')({ lang: lang, format: 'html' },
                                     code, function (err, result) {
        callback(err, result.toString());
      });
    },
    // Githubっぽいmd形式にするか
    gfm: true,
    // Githubっぽいmdの表にするか
    tables: true,
    // Githubっぽいmdの改行形式にするか
    breaks: false,
    // Markdownのバグを修正する？（よく分からなかったので、とりあえずdefaultのfalseで）
    pedantic: false,
    // HTML文字をエスケープするか
    sanitize: true,
    // スマートなリストにするか。pedanticと関わりがあるようなので、こちらもdefaultのtrueで。
    smartLists: true,
    // クオートやダッシュの使い方。
    smartypants: false,
  });
```
Raspberrypi Zero over USB on Ubuntu16.04 （OTG)

Ubuntu16.04にUSB接続したraspberrypiZeroをUSB経由でインターネットに接続する。(OTG接続)

## 用意するもの
* 母艦PC Ubuntu16.04
* OTGモードの設定が済んでいるRaspberrypiZero
* 参考：http://www.raspi.jp/2016/07/pizero-usb-otg/

> * config.txt
dtoverlay=dwc2の1行を追記します。


> * cmdline.txt
 modules-load=dwc2,g_etherの1文をrootwaitのあとに追記します。改行せずスペース区切りで続けて記述するように注意します。


## Ubuntu に RaspberryZero をUSB接続する。
デスクトップ > 設定 > ネットワーク > 有線 (ハードウェアアドレスからraspi zero を判断。) > オプション > IPv4設定
ローカルリンク専用へ変更
`※ 再接続や母艦の再起動後にはまた設定が必要。
そのたびに有線接続**がインクリメントされてる。
誰か永続化方法教えてくださいｗ`
![Screenshot from 2017-02-05 11-52-20.png](https://qiita-image-store.s3.amazonaws.com/0/75071/792238df-589e-ca1b-32f2-7bd32b661fa1.png)


## Routing する
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -s 169.254.0.0/16 -o [internet iface名(eth0..wpl**)] -j MASQUERADE

```
※ 永続化するなら
vi /etc/sysctl.conf
- # sysctl -w net.ipv4.ip_forward=1
+ sysctl -w net.ipv4.ip_forward=1

iptables 永続化は省略...
```

## リンク先のscriptを動かす。
https://gist.github.com/MarkJB/c1d72682142f545171aa207fb1634153
※以下はgithubのscriptを手動で行う手順
問題なくscriptが動く人、書き換えて使う人はリンク先のscriptを動かして作業完了。


## 接続情報を調べておく。
ifconfig

直接Webに繋がるIPのgatewayを控える [webIPのgatewayIP]
eth0 IP or wlp* IP
と、そのgatewayIP (192.168.1.1とか)

raspberrypiZero が接続されてるenps* の[LocalIP] 
リンクローカルアドレス 169.254.xxx.xxx

## raspberrypi Zero にログインする。
ssh pi@raspberrypi.local (pwはここでは省略)

# raspberrypi側でRouting
sudo route add default gw [localIP] usb0 
echo "nameserver [WebIPのgatewayIP]" | sudo resolvconf -a usb0

これで外部に繋がる（はず


参考：http://qiita.com/hasokon/items/bf88d2c9b7fb077b7797
Qiitaのクローン(のようなもの)をRails5で作ってみたよ

## 動機
 - Qiitaの投稿のインターフェースは、好きです。私は、[coderstable](https://coderstable.com/)というエンジニアむけマッチングツールをつくり、運営しています。
 - このサービスに、イベントの資料であったり知り合った人にレビューを依頼したりといったことをQiitaのような投稿機能をつかってできればいいなとおもって、「ノート機能」という形で、マークダウンでの投稿、コメントをQiitaの体感に近い形で実現しました。


## コピーした機能
 - Markdownで投稿できる
 - 画像をドラッグアンドドロップで貼り付けられる
 - コメント機能もマークダウン可、画像もドラッグアンドドロップで貼り付け可

## 使った技術
 - Rails5.0
 - Ruby 2.3.0
 - [gem Qiita-markdawn](https://github.com/increments/qiita-markdown)
 - coffeescript
 - HTML5 FileApi(画像のドラッグアンドドロップ)


## ノート機能とは
 - ノート機能は、気軽に、自分のアウトプットを記録したり、他のメンバーへ公開することができます。投稿すると、あなたがメンバーとなっているスペースに通知できたり,疑問点、や詰まっていることなども特定のユーザに依頼して、アドバイスがもらえたりできます。オフラインでの出会いや、勉強会が開催されるきっかけになるかもしれません

## 投稿のしかた

### ノートを書くからフォームを表示します。
![スクリーンショット_2017-02-06_10.39.13_PM.jpg](https://s3-us-west-2.amazonaws.com/collabostarter/production/images/data/user/3/1.jpg?1486388392)

### 各種入力していきます。画像もドラッグアンドドロップでアップロード可能です
![スクリーンショット_2017-02-06_10.41.23_PM.jpg](https://s3-us-west-2.amazonaws.com/collabostarter/production/images/data/user/3/2.jpg?1486388496)

## スペースへの公開のしかた

### 詳細画面の「スペースへ公開」を押します
![スクリーンショット_2017-02-06_10.43.46_PM.jpg](https://s3-us-west-2.amazonaws.com/collabostarter/production/images/data/user/3/3.jpg?1486388732)

### コメント、公開先を選択します。
 ![スクリーンショット_2017-02-06_10.44.05_PM.jpg](https://s3-us-west-2.amazonaws.com/collabostarter/production/images/data/user/3/4.jpg?1486388799)

### 投稿するとスペースの皆様へメールで公開することができます。

## 特定のユーザへの公開のしかた

###「ユーザへお願い」ボタンを押します。
 ![スクリーンショット_2017-02-06_10.58.37_PM.jpg](https://s3-us-west-2.amazonaws.com/collabostarter/production/images/data/user/3/5.jpg?1486389549)

### お願いの内容とだれにお願いするかを選択します（一人しか選択できません）
![スクリーンショット_2017-02-06_10.58.11_PM.jpg](https://s3-us-west-2.amazonaws.com/collabostarter/production/images/data/user/3/6.jpg?1486389620)

## コメントのしかた

### 詳細画面下部からコメントを投稿することができます
![スクリーンショット_2017-02-06_11.00.36_PM.jpg](https://s3-us-west-2.amazonaws.com/collabostarter/production/images/data/user/3/7.jpg?1486389668)
多言語対応

- VFページの文言はカスタムラベルを使って、言語を切り替えられるようにする
- Translation Workbenchを使って各項目のラベルを多言語対応する
 - カスタム項目のラベル
 - 選択リストの項目値
 - レコードタイプ
 - ボタン名、アクションの表示ラベル
- SOQLの結果は toLabel()を使って翻訳（選択リストとレコードタイプに対してのみ使用可能）
`SELECT Id, toLabel(xxx__c), ...`
Common Log Formatのdate型ログをEmbulkでElasticsearchにdate型で入れたメモ

※こちらの記事は[個人ブログ](https://tech.tsukapah.com/common-log-format-elasticsearch-embulk/)に移行しました

なんか苦労したのでメモ。
#読み込むログ

```log.json
{"time_local":"05/Feb/2017:03:38:34 +0900","hoge":"piyo"}
```

NginxやApacheでよく見かけるフォーマット。

#Embulkの設定

Elasticsearch的にUTCで入れたほうが扱いやすいので`timestamp`型で取り込んでUTCに戻してあげる。

```config.yml
in:
  type: file
  path_prefix: /path/to/json/
  parser:
    type: jsonl
    charset: UTF-8
    newline: LF
    columns:
      - { name: "time_local", type: "timestamp", format: "%d/%b/%Y:%T %z" }
      - { name: "hoge", type: "string" }
out:
  type: elasticsearch_ruby
  cluster_name: elasticsearch
  mode: normal
  nodes:
    - {host: "es_host", port: 9200}
  index: jsonlog
  index_type: log
```

このEmbulkの定義で読み込むと`time_local`の値は以下の感じで出力される。

```
2017-02-04 18:38:34 UTC
```

#Elasticsearchのインデックステンプレート

EmbulkでUTCに戻すのはいいが、このまま突っ込むだけだとElasticsearchはdate型としては受け入れてくれない。
突っ込む前にフォーマットを定義してマッピングしておかないと、文字列としてドキュメントが登録されてしまう。

```template.json
{
  "template": "jsonlog",
  "mappings": {
    "log": {
      "properties": {
        "time_local": {
          "type": "date",
          "format": "YYYY-MM-dd HH:mm:ss' UTC'"
        },
        "hoge": {
          "type": "string",
          "index": "not_analyzed"
        }
      }
    }
  }
}
```

```bash
$ curl -XPUT es_host:9200/_template/jsonlog?pretty -d "$(cat template.json)"
```

あとは上の設定でEmbulkを使ってbulkインポートしてあげれば時系列データとして意味のあるログになる。
Salesforce cheatsheet

[Record Locking Cheat Sheet](http://resources.docs.salesforce.com/194/0/en-us/sfdc/pdf/record_locking_cheatsheet.pdf)

[SF1 Cheatsheet](http://resources.docs.salesforce.com/rel1/doc/en-us/static/pdf/SF_S1-Developer_cheatsheet_web.pdf)
LINE Bot Awards向けにLINEBotを開発してみた


[SnapDish](https://snapdish.co)というサービス開発運営をしています。今回、LINE Bot Awardsなるものがあったので、自社のリソースを利用しLINEボットの開発をやってみました。

開発したボットは、ごはん予報士、おにょーん。イケてるでしょ、いかにも予報を外しそうな、予報士。いいんです。楽しければ。

ちなみに、開発期間は（たぶんだけど）、色々と並行してやりながら2−3週間（営業日ベース）程度費やしてみました。

![f256x256png.png](https://qiita-image-store.s3.amazonaws.com/0/18766/1a9c0524-509b-0c99-0247-789a0ee8d922.png "f256x256png.png")


## 友達追加してほしいたまー。
![11_81HT0bl.png](https://qiita-image-store.s3.amazonaws.com/0/18766/34bd8a71-95b6-c704-92ba-07c67963df8e.png "11_81HT0bl.png")


## はじめに、LINEボットって？
LINEボットを友達に追加してもらうだけで、LINE上のユーザと気軽にやり取りができます。やり取りはLINE Messaging APIを利用するだけでできます。各言語のSDKが揃っているので、容易に開発ができます。遊んでみましょう！おにょーんは、Pythonで動いているたまー。

## 目的、やりたいこと
* レシピ検索だるい問題の解決
* 料理のアイディアやひらめきがもっと欲しい問題の解決

## 救世主、ごはん予報士、おにょーんがやってくれること
**基本サービス**

* ごはん予報（言い換えると、作りたくなるごはんを毎日お届け）
* もぐもぐ検索（おいそうな写真を♥もぐもぐすると、関連の料理写真をカールセルでお届け）

**欲張りなあなたへ、オプションサービス**

* お気にりの料理の管理
気になった料理の保存ができます。

* 日記投稿
写真を選んでおにょーんに送るとSnapDishに非公開で投稿されます。

* 日記閲覧
「日記」と入力してメッセージをおにょーんに送ると、投稿した日記を確認できます。

## おにょーんの中身

おにょーんは、玉ねぎ。普通の玉ねぎは、剥いても剥いても、玉ねぎ。おにょーんは、なんとコンピュータによって制御されています。ふざけ過ぎた説明ですみません。でも、実際そうなのです。では、どんな制御がなされているのか概要を簡単に説明します。

まず言い訳から、短期間の開発で、設計時間もあまりなかったので、色々と苦戦し試行錯誤しましたが、最終的にまず以下のプロセスで制御することにしました。

1. 料理データ分類（by UGD+Sorting by Meta Data）
1. スコアリング（by UGD*アルゴリズム） 
1. 画像解析による投稿のスコア推定（by 機械学習）
1. エディティグフィルター（編集ロジック）

*UGD: User Generated Data*

**ポイント**
1000万以上の料理情報から「作りたくなるごはん」をどう見つけるか？
なので、それを念頭に実装してみました。

## もっと詳しく知りたい方へ
以下のイベントで解説するので、参加してください！
そして、私とおにょーんと友達になってください！
2017/2/28 Food Service Engineers Meetup #2
https://foodengineers.connpass.com/event/49514/

## 最後に、今後の課題たまー。

特徴量の学習によるクラスタリングの精度向上だったり、スコアリングの手段の選定、もしくは、アルゴリズム調整だったり開発できたらなと考えています。

ビジュアルメディア、料理写真や動画ｘテクノロジーを使って、お料理モチベーションを活性化させることが出来ないか探求していきたいと思っているので、興味のある方は、コンタクトしてみてください！
USB-RSAQ2(PL2303)をMacOS Sierraで使う

・Prolific社のドライバをインストール
http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=229&pcid=41
PL2303_MacOSX_1.6.1_20160309.pkg をダブルクリック

・リカバリーモードにて以下を実行
$ csrutil enable --without kext
参考： http://qiita.com/tuckQ/items/26c0bebbdfa2e094dba8

・以下の修正をInfo.plistに加えて、RSAQ2のデバイスIDを認識させる。

```shell-session
$ diff -u /Library/Extensions/ProlificUsbSerial.kext/Contents/Info.plist.bak /Library/Extensions/ProlificUsbSerial.kext/Contents/Info.plist
--- /Library/Extensions/ProlificUsbSerial.kext/Contents/Info.plist.bak    2017-02-07 20:32:03.000000000 +0900
+++ /Library/Extensions/ProlificUsbSerial.kext/Contents/Info.plist    2017-02-07 20:35:31.000000000 +0900
@@ -108,6 +108,23 @@
             <key>idVendor</key>
             <integer>1659</integer>
         </dict>
+        <key>067B_04BB</key>
+        <dict>
+                        <key>CFBundleIdentifier</key>
+                        <string>com.prolific.driver.PL2303</string>
+                        <key>IOClass</key>
+                        <string>com_prolific_driver_PL2303</string>
+                        <key>IOProviderClass</key>
+                        <string>IOUSBInterface</string>
+                        <key>bConfigurationValue</key>
+                        <integer>1</integer>
+                        <key>bInterfaceNumber</key>
+                        <integer>0</integer>
+                        <key>idProduct</key>
+                        <integer>1211</integer>
+                        <key>idVendor</key>
+                        <integer>1659</integer>
+        </dict>
     </dict>
     <key>OSBundleLibraries</key>
     <dict>

$ sudo touch /Library/Extensions
$ sudo touch /System/Library/Extensions
$ sudo kextload ProlificUSBSerial.kext
```

以下の通り認識するはず。
$ ls /dev/*usb*
/dev/cu.usbserial   /dev/tty.usbserial
1.13以降はMAINTAINERの代わりにLABELを使うようにしよう

https://github.com/docker/docker/pull/25466

こちらによると、Docker 1.13からMAINTAINERの使用が非推奨（deprecated）となったようです。

互換性は保たれるとのことで、従来のDockerfileが動かなくなるということは無いですが
今後新規に作成するDockerfileでは対応しておいたほうが良さそうです。

### MAINTAINERを廃止してLABELを使う

MAINTAINERの代わりにLABELを活用してくれということなのでLABELに書き換えてみました。

https://github.com/okisanjp/docker-centos7/commit/c085afffb435e576b0f1900a1a03f59b8991a2a0

```
λ git diff 4ba573f .
diff --git a/Dockerfile b/Dockerfile
index c0d1185..3e9284c 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,5 @@
 FROM centos:7
-MAINTAINER okisanjp
+LABEL  maintainer "okisanjp <okisan.jp@gmail.com>"

 # yum update
 RUN yum -y update && yum clean all
```

ちなみに、LABELを使用すると`docker inspect`でmaintainerを確認したり出来ます

```
λ docker inspect centos7 | grep "maintainer"
                "maintainer": "okisanjp <okisan.jp@gmail.com>",
```
Xcode setting ENABLE_BITCODE=NO にならない！！

CocoaPods で入れたライブラリがあると、実機でビルドできない ><

環境 : XCode Version 8.2.1 (8C1002)

## 遭遇したエラー

```
ld: -weak_library and -bitcode_bundle (Xcode setting ENABLE_BITCODE=YES) cannot be used together
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

どうやら ```ENABLE_BITCODE=NO``` にすれば良いっぽい。

その他もろもろのハマりポイント、こちらのエントリが参考になる。

[【クソ食らえ】CocoaPodsとApple Mach-O Linker Errorとlinker command failed with exit code 1でどハマり - Qiita](http://qiita.com/sutchan/items/0a78042261ca3f0a7d91)

やっぱりこのエントリの最後にあるポイントが抜けポイントだったんだけど・・
微妙に動作が違ったのでメモ。

### プロジェクト側の設定

![image](https://qiita-image-store.s3.amazonaws.com/0/5691/69ac7969-6524-07a7-daeb-f57b2d21bc9e.png)

Enable Bitcode 全部 No にする。（これはOK）

### Pods側の設定

![image](https://qiita-image-store.s3.amazonaws.com/0/5691/0fb445d0-ad3e-5c64-ceb9-f60e5424b10a.png)

Podsの選択肢、**Debug No, Release Yes** にしたらやっとビルド通過した・・

- - -

## とはいえ全く納得できん！

なんでよ！！
最初とにかく全部Noだろ！と両方Noにしたら認識されず、XCodeに「いーや！お前はどっかYesになってる。ダメだダメだ！！でなおしてこーい！」と怒られ怒られ・・（涙）
（訳：最初と同じリンカエラーがずっと出てるだけ）

どこにもないねん! Yesは残ってないんじゃ！！

とキレまくってたのですが、（その時の全体Find結果がこれ）

![image](https://qiita-image-store.s3.amazonaws.com/0/5691/a0506d83-c592-bef0-a1d8-5c098bea8d71.png)

ぐぬぬ〜・・と思いながら、さらにググってみたら、これがヒット。

[xcode7 - XCODE 7 and ENABLE_BITCODE=YES setting does not work - Stack Overflow](http://stackoverflow.com/questions/31561286/xcode-7-and-enable-bitcode-yes-setting-does-not-work)

同じこと書いてあるんですが、スクショの絵をよーく見ると、片方だけ（Debugの方だけ）Noにしてる・・
まさかね・・？と思いながら同じ設定にしてみたら・・・ **通りやがった！**

1回ビルド通った後、両方No設定（最初のやつ）にしたら・・問題なく通るんですが！！？
なんでよ！ ><
全く納得できん・・がともあれやっと一歩進んだ・・

（このXCodeの謎挙動・・ただのバグっぽい。。このエントリの賞味期限多分短いと思うけど・・）
【Debian 8 Jessie】時刻を同期する

この記事は、下記の記事を構成している記事のひとつです。
[さくらのVPS と Debian 8 Jessie で独自ドメインのWebサイトを立ち上げる手順](http://qiita.com/osktak/items/7224bd263288b40b4b98)

・さくらのVPS（プラン512）
・Debian 8 Jessie（さくらのVPS カスタムインストール）
の環境を前提にしています。

# ntpをインストールする
```tarminal:hoge$
sudo aptitude -y install ntp
```

# 時刻を同期するntpサーバーを設定する
```tarminal:hoge$
sudo vi /etc/ntp.conf
```
```/etc/ntp.conf
#server 0.debian.pool.ntp.org iburst
#server 1.debian.pool.ntp.org iburst
#server 2.debian.pool.ntp.org iburst
#server 3.debian.pool.ntp.org iburst
server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp
```

設定したら、ntpを再起動します。

```tarminal:hoge$
sudo systemctl restart ntp
```

下記のコマンドで動作確認します。

```tarminal:hoge$
sudo ntpq -p
```
```
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+ntp1.jst.mfeed. 133.243.236.17   2 u  682 1024  377    0.758    0.431   0.086
*ntp2.jst.mfeed. 133.243.236.17   2 u   83 1024  377    0.778    0.026   0.145
+ntp3.jst.mfeed. 133.243.236.17   2 u  747 1024  377    0.945   -1.850   0.826
```

# ntpを自動起動するようにする
```tarminal:hoge$
sudo systemctl enable ntp
```
SketchUpでVidroレンダラー

#概要
SketchUpで書き出して、Vidroでレンダリングしてみた。
「vidroはフリーのグローバルイルミネーションレンダラです。
レイトレーシングベースの大域照明アルゴリズムによってフォトリアルなレンダリングを実現します。」

#写真
![vtest5.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/c7522cb3-1628-31f8-97e4-3808231b0b81.jpeg)

#環境
SketchUp
 v7.1.6860 
 v8.0.16846
Vidro
 100630
#成果物
objとmtlとvdrを書き出す。

https://github.com/ohisama/viup
Polly（青い鳥）ですっごく簡単にSlackでアンケートを取るよ


https://www.polly.ai/


click to `Add Polly to Slack`!

<img width="400px" src="https://qiita-image-store.s3.amazonaws.com/0/127115/93e56905-dc79-09c0-da29-4b163a35c05a.png"/>

click to `Add To Slack`!

<img width="400px" src="https://qiita-image-store.s3.amazonaws.com/0/127115/07ab7e35-908f-2860-a303-fe70a4991804.png"/>

click to `Authorize`!

<img width="400px" src="https://qiita-image-store.s3.amazonaws.com/0/127115/a8f50c6a-dd50-f0d4-f0e8-1e8913ee675d.png"/>

認証すると画面全体に大きい鳥が表示されアクティブだよというアピールを始めます。

<img width="400px" src="https://qiita-image-store.s3.amazonaws.com/0/127115/cd9f46f6-f3be-9981-6f6c-af06e3eeb44c.png"/>

そうするとSlackに`Polly`が出現します。

<img width="200px" src="https://qiita-image-store.s3.amazonaws.com/0/127115/0df8775f-101a-ee8c-a26b-3c48b7e7aecf.png"/>


ここからは急に`アンケート`のことを`poll`と呼び始めるよ。

あとは簡単です。
1.以下コマンドを`poll`を作りたいチャンネルに流します。

`/invite @polly`

2.Pollyを招待したチャンネルに`poll`を作成して流します。

`/poll "飲みに行こうぜ、そういう気分なんだ。" "今日" "明日" "やっぱり今日"`

![Kobito.UPq0c6.png](https://qiita-image-store.s3.amazonaws.com/0/127115/9e9cd1b8-247e-b602-15fb-ae8536d0d309.png "Kobito.UPq0c6.png")


出ました。でもこの状態だとまだ他ユーザーは見れません。
まずはオプションを指定しましょう。

 - `One Vote Max`・・・択一回答か指定できます。飲み会の日程調整ではOFFにしましょう。デフォルトONなので気をつけて。
 - `Hide Results`・・・作成した自分以外のユーザーが集計結果を見れるか指定できます。飲み会の日程調整ではOFFにしましょう。誰が来るか分からないとみんな牽制し合います。
 - `Anonymous`・・・匿名にするか指定できます。飲み会の日程調整ではOFFにしましょう。誰が来てくれるのか分からなくなります。
 - `Private Comments`・・・集計結果画面等で入力するコメントを他ユーザーに公開するか指定できます。飲み会の日程調整ではOFFにして、行きたいお店や食べたい物を話し合いましょう。デフォルトONなので気をつけて。

時はきた。

click to `Submit to Channel`

グループ内メンバーに`poll`が表示されます。
今回は`Anonymous`をONにしていますがOFFにすると誰がどこに投票したか分かるようになります。

<img width="400px" src="https://qiita-image-store.s3.amazonaws.com/0/127115/5bd3089c-4936-127f-bbd0-23f03e651730.png"/>

と同時に作成者にはPollyからDMが届きます。


<img width="400px" src="https://qiita-image-store.s3.amazonaws.com/0/127115/6cfd3af3-5839-071c-b5f8-03c68e889012.png"/>

ここから

- `poll`を削除する
- リマインドメッセージを送る
- 集計結果を見る
- `poll`を締め切る

ことができます。


集計の画面はこんな感じで見やすいです。

<img width="400px" src="https://qiita-image-store.s3.amazonaws.com/0/127115/d4a5587c-ffea-fc35-0e41-06d70868f9e4.png"/>

トップ画面ではもちろん過去の`poll`を一覧で見れます。
<img width="400px" src="https://qiita-image-store.s3.amazonaws.com/0/127115/534c00d4-6d88-e9e7-776a-7e1c283853c0.png"/>

公式さえ見れば難しいことは何も無いけどちょっと楽しかったので記事化。

もう調整さん必要ないかも。
Azureで管理者を追加する方法


ググってもすぐに出てこないので、自分用メモ
* 誰かに権限を与えたい場合の方法


## 結論

1. サブスクリプションをクリック
2. IAMをクリック
3. ユーザを追加


## 管理者

管理者と言っても3つあるらしい

1. AA: アカウント管理者
2. SA: サービス管理者
3. CA: Azure クラシック ポータルの共同管理者  


## Azureの感想

* すごくわかりにくい(UXが悪い)
 * ぐぐって調べてもわからない or 冗長
* 反応が遅い (海外サーバ?)


## 用語

* Microsoft: マイクロソフト
* Azure
scrapyでspiderの開始時、終了時に特定の処理を挟ませる方法


spiderの開始時、終了時にフックさせるような関数を書く方法です。

以下の内容をプロジェクトの直下に配置します。

```python
import scrapy

class SpiderHook(object):

    @classmethod
    def from_crawler(cls, crawler):
        ext = cls

        crawler.signals.connect(ext.spider_opened, signal=scrapy.signals.spider_opened)
        crawler.signals.connect(ext.spider_closed, signal=scrapy.signals.spider_closed)

        return ext

    def spider_opened(self, spider):
        # spider開始時の処理

    def spider_closed(self, spider):
        # spider終了時の処理
```

そして、settings.pyにこのクラスを読み込む設定を書きます。

```
EXTENSIONS = {
    '<project name>.<file name>. SpiderHook': 100,
}
```

参考:
https://doc.scrapy.org/en/latest/topics/extensions.html
Rails作業MEMO - CollectionをRenderする

# 概要
Viewでの繰り返し部分を、eachメソッドを使用するのではなく、コレクションをレンダリングすることで実装する。

# Version
Ruby: 2.3.1
Rails: 5.0.1

# コード
```views/xxx.html.erb
<% @users.each do |user| %>
  <ul class="lists">
    <li class="list">#{user.name}</li>
  </ul>
<% end %>
```

上記は以下に書き換え可能

```views/yyy.html.erb
<ul class="lists">
  <%= render partial: "user", collection: @users %>
</ul>
```

```_user.html.erb
<li class="list">#{user.name}</li>
```
___POINT___
・ Partial内の変数名、Partialの値、Collectionの値の関係性に注意

>パーシャルはデータの繰り返し (コレクション) を出力する場合にもきわめて便利です。:collectionオプションを使用してパーシャルにコレクションを渡すと、コレクションのメンバごとにパーシャルがレンダリングされて挿入されます。

>（中略）

> パーシャルを呼び出す時に指定するコレクションが複数形の場合、パーシャルの個別のインスタンスから、出力するコレクションの個別のメンバにアクセスが行われます。このとき、パーシャル名に基づいた名前を持つ変数が使用されます。（[Railsガイド](https://railsguides.jp/layouts_and_rendering.html)）。

→コレクションの数だけパーシャルが挿入される。
→変数名 = パーシャル名。

初めてこの方法を使用した際に、変数名とパーシャル名を一致させておらずハマったのでメモ。

# 参考
[Railsガイド](https://railsguides.jp/layouts_and_rendering.html)
[Qiita / Rails 部分テンプレートの使い方](http://qiita.com/shizuma/items/1c655dadd2e04b3990a8)
Shellだけで文章のN-gramを求めたい

参考
[シェルの弱点を補おう！"まさに"なCLIツール、egzact]
(http://qiita.com/greymd/items/3515869d9ed2a1a61a49#%E6%96%87%E7%AB%A0%E3%81%AEn-gram%E3%82%92%E6%B1%82%E3%82%81%E3%82%8B)

こちら、``conv``や``addl``などのコマンド集です。
データ処理ももちろんですが、"コマンド文字列"を作るために便利なコマンド、という感じだと思います。

# やったこと

```bash
$ cat niwa.txt
にわにはにわにわとりがいる

$ cat niwa.txt | grep -o . | sed -n 'N;p;D;' | paste - - -d '' | sort | uniq -c | sort -k 1 -n
      1 いる
      1 がい
      1 とり
      1 には
      1 はに
      1 りが
      1 わと
      2 わに
      3 にわ
```

というわけで、「にわ」が三回含まれているみたいです :chicken:

N-gramと書きましたが、実際やりたいことのコアは上記参考ページの``conv``に相当することです。
多分awkとかでもっと普通に書けるとは思いますが、シェルっぽくパイプで色々繋いで書いてみました。
ぶっちゃけ、``paste``と``sed``を色々いじっていて、面白いなーと思ったで、後学のために記します。


# 解説

## pasteのところ

```bash
$ seq 10 | paste - - -d ' '
1 2
3 4
5 6
7 8
9 10

$ seq 10 | paste - - - -d ':'
1:2:3
4:5:6
7:8:9
10::

$ seq 20 | paste $(echo "${(r:8::- :)}") -d ','
1,2,3,4
5,6,7,8
9,10,11,12
13,14,15,16
17,18,19,20
```

paste コマンドは``-``が現れる毎に、標準入力から１行持ってくるみたいです。
なので``-``をN個書くことで、入力をN個ずつのグループに分けることが出来ます（便利）。

``-d``は挿入するデリミタを指定することが出来ます

## sedのところ

sedは、単に文字列を置換するだけではなく、結構いろいろなことができるんですね。

sedに渡している``N;p;D;``は、それぞれ

```
N   入力の次の行をパターンスペースに追加する。
p　　現在のパターンスペースを出力する。
D　　パターンスペースの最初の改行までを削除し、次の入力行を読み込まずに、その結果のパターンスペースでサイクルを開始する。
```

というような意味になります[sed man page](http://linuxjm.osdn.jp/html/GNU_sed/man1/sed.1.html)

```
$ seq 5 | sed -n "N;p;D;" 
```

とすると、何が起きるのか考えてみた所

1. patternスペースに1が読み込まれる
2. ``N``で次の行が読み込まれ、パターンスペースは``1 2``となる（便宜上、スペースを改行と読み替えて下さい）
3. ``p``で、パターンスペースを出力する
4. ``D``でパターンスペースから先頭の1行を削除する -> ``2``になる
5. （おそらく）次の行の2を読みに行くが、1行目を処理したときの``N``ですでに読み込まれているんで何もおきない
6. ``N``で次の行が読み込まれ、パターンスペースは``2 3``となる

というような動きをしているのだと思います。1, 5 あたりはちょっと怪しい・・・
ですが、2. のところで、patternスペースが``1 2``となるのはこういう動きなんじゃないかな？と思います

結果としては

```
$ seq 5 | sed -n "N;p;D;"
1
2
2
3
3
4
4
5
```

となります。
なお、オプションの``-n``を外すと、最後にマッチングに失敗した行が出力されてしまうため最後にもう一回5が出力されます。


もうちょっと何が起こっているのかわかりやすくするために、pの前に``=``というコマンドを挟むと、こんな感じになります。
``=``は、現在の行数を表示するコマンドです。

```
$ seq 1000 1005 | sed -n "N;=;p;D;"
2
1000
1001
3
1001
1002
4
1002
1003
5
1003
1004
6
1004
1005
```

ふむふむ。

# 発展

では、3個ずつはどうすればいいでしょうか？

paste は簡単ですね

```
paste - - - 
```

sedは

```
sed -n "1N;N;p;D"
```

となります。``N``は、数字の引数を取ることができて、マッチした行数のときのみそのコマンドが実行されます。
というわけで、上記コマンドは、1行目のときのパターンスペースに1行取り込み、以後はこの``1N``は何もしません。
2行目以降の行はN、Dで1行ずつ出したり入れたりするので、結果的にパターンスペースには3行ずつ入った状態でpが呼ばれます。

同様に、4-gramなら``sed -n "1N;2N;N;p;D"``という感じです。

``conv``コマンドとして仕立てるには、pasteとsedそれぞれのコマンド文字列を、引数から生成する必要がありますが、規則性がはっきりしているので、これはそんなに難しくなさそう。

# 実験

``` bash 
# 3-gram
$ cat melos.txt | grep -o . | sed -n "1N;N;p;D" | paste - - - -d '' | sort | uniq -c L | sort -k 1 -r | head -10
     51 メロス
     33 ロスは
     29 った。
     24 。」「
     22 ている
     22 た。「
     21 のだ。
     19 。メロ
     17 スは、
     17 おまえ
```

# 感想

なんとなく思ったのは、今までパイプでコマンドをつなぐときは、文字列を加工またはフィルターするということが多かった気がします
sedを上手く使えば、むしろ増やすということが結構簡単にできるため、手数が増えそうだな、と思いました。

例えば、参考ページの``dupl 2``は以下の様に書けます

```bash
$ echo kuri | sed -n "p;p;"
kuri
kuri
```
【Debian 8 Jessie】IPv6を無効化する

この記事は、下記の記事を構成している記事のひとつです。
[さくらのVPS と Debian 8 Jessie で独自ドメインのWebサイトを立ち上げる手順](http://qiita.com/osktak/items/7224bd263288b40b4b98)

・さくらのVPS（プラン512）
・Debian 8 Jessie（さくらのVPS カスタムインストール）
の環境を前提にしています。

# IPv6を無効化する設定

```tarminal:[hoge]$
sudo vi /etc/sysctl.conf 
```

最終行に追記します。

```bash:/etc/sysctl.conf
# IPv6を無効化
net.ipv6.conf.all.disable_ipv6 = 1
```

# 設定を即時反映する

```tarminal:[hoge]$
sudo sysctl -p
```
```
net.ipv6.conf.all.disable_ipv6 = 1
```

下記のコマンドで確認します。

```tarminal:[hoge]$
sudo ifconfig
```
EC-CUBE3 クロネコヤマトB2用CSV出力プラグインのCSV並び順変更（非公式）

EC-CUBE3にてクロネコヤマトB2用CSV出力プラグインを使っているのですが、出力されるCSVの並び順を変更する必要があったため、非公式なやり方ではありますが備忘録のため記録したいと思います。

###CSV並び順はどこに？
クロネコヤマトB2用CSV出力プラグインをインストールして確認して頂くとわかりますが、CSVの並び順は"dtb_csv"というテーブルの中に定義されています。
では、このテーブル定義はどこでされているのか？

###マイグレーションファイル（Versionxxxxxxxxxxxx.php)修正

```php:Versionxxxxxxxxxxxx.php
function insertCsvB2(Schema $schema)
{
    $data = array(
                    // 出荷予定日
                    array(
                        "entity_name" => "Eccube\\\\Entity\\\\Order",
                        "field_name" => "send_date",
                        "reference_field_name" => "",
                        "disp_name" => "出荷予定日",
                    ),
                    ...
            );
}
```

上記のinsertCsvB2メソッドの中にdata配列が定義されています。
このdata配列がイコール"dtb_csv"の定義となっています。
つまりこの配列順序を入れ替えることで希望の並び順に変更することができます。

###インストールできない
通常通り管理画面からインストールしようとしましたが、失敗。
インストールできたように見せかけて"dtb_csv"にデータが入っていませんでした。

管理画面でダメならコマンドだ。

```
$ php app/console plugin:develop install --code=TransportCSVexportB2

Catchable fatal error: Argument 1 passed to Eccube\Entity\Csv::setCreator() must be an instance of Eccube\Entity\Member, null given, called in /Applications/MAMP/htdocs/sotohe/app/Plugin/TransportCSVexportB2/Migration/Version201603101200.php on line 821 and defined in /Applications/MAMP/htdocs/sotohe/src/Eccube/Entity/Csv.php on line 291

```

なんかエラーが返ってきました。

###これで解決しました（無理やり感）
上記エラー箇所をみてみると。
なぜかマイグレーションファイルの以下部分にてこけていました。

```php:Versionxxxxxxxxxxxx.php
        // どうやらこいつがnullで返される
        $Member  = $app['eccube.repository.member']->find(1);
        
        // dtb_csv
        foreach ($data as $key => $val) {
            $reference_field_name = ($val['reference_field_name']) ? "'" . $val['reference_field_name'] . "'" : 'NULL' ;
            $Csv = new Csv();
            $Csv
                ->setCsvType($CsvType)
                // nullを入れるな！って怒られる
                ->setCreator($Member)
                ->setEntityName($val['entity_name'])
                ->setFieldName($val['field_name'])
                ->setReferenceFieldName($reference_field_name)
                ->setDispName($val['disp_name'])
                ->setRank($key+1)
                ->setEnableFlg(Constant::ENABLED);
            $app['orm.em']->persist($Csv);
        }
```

上記コードの中のメンバーを取得してくる部分がなぜかnullで返されてしまいました。
したがってメンバー取得部分を以下のように修正。

```
$Member  = $app['eccube.repository.member']->loadUserByUsername('管理者のID');
```
'管理者のID'は"dtb_member"のlogin_idをいれてください。

そしたら再度インストール（コマンドで）

```
$ php app/console plugin:develop enable --code=TransportCSVexportB2
success
```
やったー！！

"dtb_csv"の並び順も思った通り！

以上です。

あ、どなたかもっとスマートな並び順の変更のやり方をご存知の方教えてください。
【文字化け防止策】Sublime Text 3 で機種依存文字をハイライト表示する

Sublime Text 3 + ConverttoUTF-8 で Shift_JIS 形式のファイルを編集中に、**「機種依存文字」**をハイライト表示させて事前に文字化けを防ぐためのテクニックをご紹介します。

## 1. Trailing Spaces をインストール
Install Packages から **「Trailing Spaces」**と検索するとたぶん出てきます。
https://github.com/SublimeText/TrailingSpaces

## 2. Settings User に機種依存文字を登録
Performance > Package Settings > Trailing Spaces > Settings - user を開きます。

開いたら、下記の文字列を追記して上書き保存してください。

```json
{
    "trailing_spaces_regexp": "　|Ⅰ|Ⅱ|Ⅲ|Ⅳ|Ⅴ|Ⅵ|Ⅶ|Ⅷ|Ⅸ|Ⅹ|ⅰ|ⅱ|ⅲ|ⅳ|ⅴ|ⅵ|ⅶ|ⅷ|ⅸ|ⅹ|①|②|③|④|⑤|⑥|⑦|⑧|⑨|⑩|⑪|⑫|⑬|⑭|⑮|⑯|⑰|⑱|⑲|⑳|㊤|㊥|㊦|㊧|㊨|㍉|㍍|㌔|㌘|㌧|㌦|㍑|㌫|㌢|㎝|㎏|㎡|㏍|℡|№|㍻|㍼|㍽|㍾|㈱|㈲|㈹|〜|—"
}
```

## 3. 登録された機種依存文字がハイライトされる！

試しに機種依存文字を入れてみると、先ほど登録したものがハイライトされます。
これは分かりやすい！

![スクリーンショット 2017-02-07 18.53.45.png](https://qiita-image-store.s3.amazonaws.com/0/57867/f90c7bbd-85b0-01ae-5139-8cef668b8d1a.png)

※ついでに全角スペースもハイライトされます。

これで、どこに機種依存文字が含まれているのかパッと見でわかりやすくなるので、文字化けを未然に防ぐ事が可能です。

## 4. ほかの機種依存文字も登録してみよう

追加登録は非常に簡単で、登録したい文字列を `|` で区切るだけです。

新しく出現した場合は **モジバケモン図鑑** に登録しておきましょう！

## ちなみに Atom でも設定できるっぽい？

https://atom.io/packages/trailing-spaces

僕は生粋の Sublime Text 使いなので試してはいませんが、Atom でも同じプラグインがあったので設定できるかもしれません。

お試しあれ。
Capistrano3でディレクトリをデプロイする

オプションが普通に用意されてた。

http://capistranorb.com/documentation/getting-started/configuration/

```rb:deploy.rb
set :repo_tree, "/path/to/directory"
```

これで特定ディレクトリをデプロイできる。
current下に展開されるのは特定ディレクトリの中身。

複数のディレクトリをデプロイしたい場合は、
[ソース](https://github.com/capistrano/capistrano/blob/master/lib/capistrano/scm/git.rb) と [改造例](http://qiita.com/k-yamada@github/items/a831ba87668c2e71dc70) をみて頑張れば多分いけそう。
身体で覚えるvim（初心者向け）



# vimtutor

前の記事でも書きましたがVimにはチュートリアルがあります。
単ににターミナルから
```bash
vimtutor
```
とコマンド打つだけでいつでもチュートリアルを始められます。
チュートリアルの導入文が、

```bash
     Vim は、このチュートリアルで説明するには多すぎる程のコマンドを備えた非常
     に強力なエディターです。このチュートリアルは、あなたが Vim を万能エディ
     ターとして使いこなせるようになるのに十分なコマンドについて説明をするよう
     なっています。
```

Vimmerのドヤ顔が浮かびます。
30分ほど弄っていれば基本操作はバッチリです。


# ゲームを遊んでいればvimを覚えられる！？

https://vim-adventures.com/

![imgres.jpg](https://qiita-image-store.s3.amazonaws.com/0/158747/6692cb2d-f5dc-4c97-8598-9fde23333a17.jpeg)

Vim adventuresってゲームがあります。
英語ですがプログラマならなんとか読めるはず。

そうですよね、単にhjkl移動を体に
染み込ませるのだけだって結構時間かかります。
ゲーム好きはこういうので覚えてしまいましょう。

追記。
ゲームは30分も立たずにレベル３クリアしました。
レベル４～レベル１３をプレイするには$25も
払わなければいけないようです。自分は払いません。

内容も今ひとつ。hjkl移動を覚えるにはいいですが
ソレ以外はvimtutorのが濃いと思います。
Laravel5.4 へのアップデート手順と生じた変更点４つ

## はじめに
Laravel を 5.3 から 5.4 にアップデートしたら、思いのほか大きく改修することになった。
忘れないように手順と変更点をメモしておく。

## アップデート手順

### composer.json でバージョンをあげる
```composer.json
"require": {
    "laravel/framework": "5.4.*"
}
```

### アップデート
- `composer update`

### バージョン確認
- `php artisan -V`

### キャッシュクリア
- `php artisan view:clear`
- `php artisan route:clear`

### ide_helper を再作成（ついでに）
- `php artisan ide-helper:generate`

※ide_helper とは
https://github.com/barryvdh/laravel-ide-helper

## 変更された処理と対応

### 1. PHPUnit のバージョンを上げる
```composer.json
"require-dev": {
    "phpunit/phpunit": "5.7.*",
}
```

ひとまず PHPUnit のバージョンを上げよう。
上げないと大量にエラーを吐く。

### 2. Assert メソッドが変わった
この変更が原因でテストが失敗しまくっていた。
各 Assert メソッドを置換して対応した。

#### Assert メソッド新旧対応表
| 5.3 以前 | 5.4 |
|:-:|:-:|
| seeInDatabase | assertDatabaseHas |
| dontSeeInDatabase | assertDatabaseMissing |
| seeJson | assertJson |
| dontSeeJson | ? |

#### `dontSeeJson` の代わりがないので作成した
```AbstractTestCase.php

private function formatToExpectedJson($key, $value)
{
    $expected = json_encode([$key => $value]);

    if (Str::startsWith($expected, '{')) {
        $expected = substr($expected, 1);
    }

    if (Str::endsWith($expected, '}')) {
        $expected = substr($expected, 0, -1);
    }

    return trim($expected);
}

protected function assertDontJson(TestResponse $testResponse, array $assertData)
{

    $testResponseContent = json_encode(
        (array)$testResponse->original
    );

    foreach ($assertData as $key => $value) {
        $expected = $this->formatToExpectedJson($key, $value);
        PHPUnit::assertFalse(
            Str::contains($testResponseContent, $expected),
            "[{$expected}]".PHP_EOL.'within'.PHP_EOL."[{$testResponseContent}]."
        );
    }

    return $testResponse;
}
```

#### テスト関連リファレンス
https://laravel.com/docs/5.4/testing
https://laravel.com/docs/5.4/http-tests
https://laravel.com/docs/5.4/database-testing

### 3. make() メソッドのパラメータに第 2 引数を指定できなくなった

>make Method Parameters

>The container's make method no longer accepts a second array of parameters. This feature typically indicates a code smell. Typically, you can always construct the object in another way that is more intuitive.


### 4. レスポンスの中身へのアクセス方法が変わった

| 5.3 以前 | 5.4 |
|:-:|:-:|
| $response->response->content() | $response->content() |

5.4 の方はトレイトで取得している
`/vendor/laravel/framework/src/Illuminate/Http/ResponseTrait.php`


## あとがき
他にも気づいたら追記して行こうと思う。

## 公式のアップグレードガイド
- https://laravel.com/docs/5.4/upgrade
- https://readouble.com/laravel/5.4/ja/upgrade.html
 - 翻訳中のもよう
Lombokで冗長的なコードを減らす

##Lombokとは
Lombokは、Javaのgetter/setterなどボイラープレートを簡略にしてくれるライブラリ。
フィールド・メソッドにアノテーションをつけるだけで、コンパイル時にコードを自動生成してくれる。
これまで行っていたであろう、IDEでの自動生成を行わなくてよく、なおかつ変更ミスなども減らすこともできる。
[GitHub](https://github.com/rzwitserloot/lombok)はこちらへ。

##動作環境
macOS
Android Studio 2.2.3
Gradle 2.14.1
Gradle Plugin 2.2.3

##導入

1. メニューから Android Studio → Preferences... → Plugins → Browse repositories... とクリック

2. 「lombok」で検索し、「Lombok Plugin」を選択

3. 「Install」ボタンをクリックしてインストール

4. Android Studioを再起動

5. build.gradle(Module: app)のdependenciesブロック内に以下を記述
[README](https://projectlombok.org/mavenrepo/)から抜粋。

```:build.gradle
dependencies {
  provided 'org.projectlombok:lombok:1.16.12'
}
```

lombokはコンパイル時にしか使用しないため、「compile」ではなく「provided」にすること。

6. File → Other Stetting → Default Settings... → Build, Execution, Deployment → Compiler → Annotation Processors とクリック
プロジェクトを開いてない状態のときは、Configure → Preferences → Build, Execution... でいける。

7. Enable annotation processing をチェック


##使い方
使い方は以下の記事を参考にしてください。

* [Lombok 使い方メモ](http://qiita.com/opengl-8080/items/671ffd4bf84fe5e32557)
* [書きかけのLombok解説](https://gist.github.com/Getaji/cee34b8b91393ad1cdaf)

公式サイトも載せておきます。

* [Lombok features](https://projectlombok.org/features/index.html)

##参考
* [誰も教えてくれなかった Lombok のこと](http://www.coppermine.jp/docs/notepad/2014/01/lombok.html)
【GAS】QUERY関数でサブクエリ的な処理をやってみる

　いま、果物と価格が並んでいて、平均価格以上の果物を抽出するという典型的なサブクエリ的なことをやってみます。

![スクリーンショット 2017-02-07 18.19.40.png](https://qiita-image-store.s3.amazonaws.com/0/139134/ce7e83ee-2aa8-50b0-b673-c8d152e26b33.png)

　貼り付けた画像に式が写っているのですが、

```
=QUERY(A2:B7,"select A,B where B >= "&AVERAGE(B2:B7)&"")
```

　"select A,B where B >=" & ここに関数を書く & ""という形に慣れてしまえばいいと思います。「&」内に独立した式を書けるということです。"QUERY式の一部" & 独立した関数 & "QUERY式の残り"（この場合はないので""となっている）という具合です。

　この例ではAVERAGE関数を挿入してみましたがもちろんQUERY関数でもいけます（単一結果であることが前提）。QUERY関数以外の関数でも自由にぶち込めるのでサブクエリ「的」と表現しました。

　QUERY関数は他の関数と組み合わせられることは広く知られていると思いますがそれは大抵の場合、QUERY関数で返した結果を受けて「外側」からUNIQUEしたり、SUMしたりだと思います。

　このようにQUERY関数の「内側」においても他の関数を取り込めることを抑えておくと表現の幅が広がるでしょう。
embulkのtemporary dirctoryを変更する

embulkのテンポラリディレクトリとしてjava.io.tmpdirを参照している。
そのため、下記のコマンドで変更可能。

```
embulk "-J -Djava.io.tmpdir=tmp/" run test.yml
```

実行中はjrubyのファイルとかができる

```
[tmp] ls
jruby-51186              
```


それとは別にplugin側でテンポラリディレクトリを持つことがある。

例えば、embulk-output-td: https://github.com/treasure-data/embulk-output-td#configuration
tmpdir: temporal directory (string, optional) if set to null, plugin will use directory that could get from System.property

参照するパラメータ違うため、別途yml内で指定する必要がある。
Unity3D:NGUI BUG

Bug1:全角文字を入力し、キャレットを真ん中に移動し、全角を入力すると、キャレットの位置から文字列の最後までが選択されてしまう、そして、入力された新し文字が一番後ろになっている。

１）まずは　string ime = "";　を定義する
２）void Update ()にある　string ime = Input.compositionString;　を　ime = Input.compositionString;に変更する。
２）void Update ()にある
　　mSelectionEnd = string.IsNullOrEmpty(ime) ? mSelectionStart : mValue.Length + ime.Length;
　　を下記のように変更する：
　　mSelectionEnd = string.IsNullOrEmpty(ime) ? mSelectionStart : mSelectionStart;
３）void　UpdateLabel ()にある
	int end = mSelectionEnd - mDrawStart;
	を下記のように変更する：
　　int end = mSelectionEnd + ime.Length - mDrawStart;

以上です。


Bug2:全角を入力したあとに、確定してない状態で、マウスを画面上にタッチすると、文字が複製されて、二回表示されている。
Updateメソッドにある　// Windows has them, OSX may not. They get handled inside OnGUI() instead.　の下に下記のソースを追加する
if (Input.GetMouseButton(0) || Input.GetMouseButton(1) || Input.GetMouseButton(2))
   mSelectionStart = mSelectionEnd = mLastInputPos;
   s = mLastIME;


#if UNITY_STANDALONE
    protected int mLastInputPos = 0;
#endif
を上に定義する。

protected virtual void OnPress (bool isPressed)
に下記のソースを追加する
#if UNITY_STANDALONE
            mLastInputPos = mSelectionEnd;
#endif

update() 中修改如下
if ((ime.Length == 1 || string.IsNullOrEmpty(ime)) && !string.IsNullOrEmpty(Input.inputString))


GetLeftText()中修改如下
int min = (mValue.Length <= Mathf.Min(mSelectionStart, mSelectionEnd)) ? mValue.Length : Mathf.Min(mSelectionStart, mSelectionEnd);
return (string.IsNullOrEmpty(mValue) || min < 0) ? "" : mValue.Substring(0, min);

UpdateLabel()中修改如下
int end = mSelectionEnd - mDrawStart;  修改成  int end = mSelectionEnd + ime.Length - mDrawStart;
echoでは@が使えない

※ちょっとしたメモで書いておきます。参考程度に。あとそこまで詳しくもないので大目に見てください。

## そもそも```@```って・・・？
@は関数(includeなど・・・。)等の前に加えると、PHPの設定のエラー表示がオンの時に注意書きが表示されなくするものです。例えばfpで接続できなかったときに、エラー表示をさせないようにすることができます。

## 今回の本題
今回は、文字を表示する```echo```という関数ですが、以下のように書いてみました。

```php
<?php
// define('MESSAGE', 'Hello World!');
@echo 'Message: '.MESSAGE;
?>
```

定数をわざとエラー表示を作るために、コメントアウトしています。
これを出力すると、

```php
Parse error: syntax error, unexpected 'echo' (T_ECHO) in /path/to/script.php on line 3
```

※スクリプトのディレクトリは架空のものです。
エラーが発生。構文エラーが出ました。
```echo```を```print```に変更してみます。以下がスクリプトです。

```php
<?php
// define('MESSAGE', 'Hello World!');
@print 'Message: '.MESSAGE;
?>
```
出力すると、

```
Message: MESSAGE
```
になります。
imgui で UTF-8 なテキスト（漢字等）を表示する

https://github.com/ocornut/imgui  で UFT-8なテキストを表示するための方法のメモです

#環境
Windows 10 pro
DxLib 3.1.6f
visual studio professional 2015
Unicode 文字セットを使用する

#初期化
フォントの設定を行います。

```cpp

E_RESULT init_draw()
{
	g_pd3dDevice = (LPDIRECT3DDEVICE9)GetUseDirect3DDevice9();
	ImGui_ImplDX9_Init(mainWindowHandle, g_pd3dDevice);
        
        //フォントの設定を行う。IPAゴシック 14ポイント
	ImGuiIO& io = ImGui::GetIO();
	io.Fonts->AddFontFromFileTTF("resource\\ipag.ttf", 14.0f, nullptr, io.Fonts->GetGlyphRangesJapanese());

	return E_RESULT_SUCCESS;
}

```

#表示の実際

サンプルプログラムを見ると文字コード直接埋め込みでした。

```cpp:imgui_demo.cpp
        // 384行目付近を抜粋
        ImGui::Text("Hiragana: \xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91\xe3\x81\x93 (kakikukeko)");
        ImGui::Text("Kanjis: \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e (nihongo)");
```
<br>
これでは面倒なので調べたところ、なんてことはありませんでした。
u8リテラル指定だけで表示できます。


```cpp
E_RESULT	exec_draw_imgui()
{
	RenderVertex();
	getInputEvent();
	ImGui_ImplDX9_NewFrame();

        // 漢字を u8 リテラルで指定するところがポイントです
	{
		static float f = 0.0f;
		ImGui::Begin(u8"メインメニュー", &show_another_window);
		ImGui::SliderFloat("float", &f, 0.0f, 1.0f);
		ImGui::ColorEdit3("clear color", (float*)&clear_col);
		ImGui::End();
	}

	// Rendering
	g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, false);
	g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, false);
	g_pd3dDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, false);
	D3DCOLOR clear_col_dx = D3DCOLOR_RGBA((int)(clear_col.x*255.0f), (int)(clear_col.y*255.0f), (int)(clear_col.z*255.0f), (int)(clear_col.w*255.0f));

	ImGui::Render();
	g_pd3dDevice->Present(NULL, NULL, NULL, NULL);

	RefreshDxLibDirect3DSetting();

	return E_RESULT_SUCCESS;
}
```
[Unity] Androidのjar/aarを必要なやつだけ入れる

## UnityでAndroidのjar/aarを入れるには
[UnityでGooglePlayServicesを入れるにはPlayServicesResolver(unity-jar-resolver)が便利](http://qiita.com/tkyaji/items/b838c97228f99f194bcd)
っていうのを以前書いたんですが、これと同じような処理を実装してみました。

[AndroidJarResolver.cs](https://gist.github.com/tkyaji/deaf1dab31037feb2dcf1ec6da1a5c29)

抜粋すると、こんな感じで指定しています。

```csharp:AndroidJarResolver.cs
[MenuItem("JarResolver/Resolve")]
private static void resolveJar() {
    
    // Examples
    /*
    addLibrary("com.google.android.gms", "play-services-basement");
    addLibrary("com.google.android.gms", "play-services-ads");
    addLibrary("com.android.support", "recyclerview-v7");
    addLibrary("com.android.support", "cardview-v7");
    addLibrary("com.android.support", "percent");
    addLibrary("com.android.support", "support-annotations");
    */
}
```

かなり雑に実装してるので、うまく取ってこれないパターンがあるかもしれません。


## やってること

Android SDKのディレクトリの中から、指定した jar/aar だけコピーしているだけです。
例えば`play-services-ads`の`10.0.1`だと以下のパスにaarがあります。
```
<ANDROID_SDK>/extras/google/m2repository/com/google/android/gms/play-services-ads/10.0.1/play-services-ads-10.0.1.aar
```
WindowsServer2012でVPN(PPTP|L2TP)を構築するときのメモ

ESXi上のWindowsServer2012にVPNを構築したのでそのときのメモ

クライアント側のレジストリもいじらないと接続できない罠があるので注意



## VPNサーバーの設定

以下のサイトを参考にした

[Windows Server 2012でVPNサーバを立てる on AWS - サーバーワークス エンジニアブログ](http://blog.serverworks.co.jp/tech/2014/10/08/vpnonaws/)

[WindowsServer2012でVPNサーバーを立ててみる - まぽろぐ](http://mapopi.com/1213/)

大体は上記のサイトに沿って設定していけばOK

一部違う部分は、役割と機能追加のウィザードのサーバーの役割をインストールする際にリモートアクセス内の「DirectAccessおよびVPN」と「ルーティング」の両方をインストール

![スクリーンショット-2016-02-06-19.43.37.png](https://qiita-image-store.s3.amazonaws.com/0/147445/9c5f6d8f-cb03-2671-cab1-6024804d94a0.png)


機能タブではリモートサーバー管理ツール->役割管理ツール内の「リモートアクセス管理ツール」をインストール

![スクリーンショット-2016-02-06-20.06.43.png](https://qiita-image-store.s3.amazonaws.com/0/147445/9b7172ad-d760-654c-0031-ffb965316bea.png)


途中ルーティングとリモートアクセスの画面にはどうやっていくのかわからず困ったが、スタート画面に追加されていた

![スクリーンショット-2016-02-06-19.48.46.png](https://qiita-image-store.s3.amazonaws.com/0/147445/b598c154-6868-1fbc-5bf5-9e9d6d9dd8b1.png)

今回はPPTPとL2TPの二つを設定するため、ポート接続を許可する必要がある。

ルーティングとリモートアクセスの該当サーバー内のポートを右クリックし、プロパティを開く

![スクリーンショット-2016-02-06-20.16.41.png](https://qiita-image-store.s3.amazonaws.com/0/147445/a2040c84-2dbb-835d-5b10-e35c90441923.png)


PPTPとL2TPをRAS/ルーティングに設定すればOK



以下のサイトを参考に必要に応じてWindows ファイアウォールでポートを解放する

[Windows Server 2012 R2 通信ポートの開放を行う手順 - Symfoware](http://symfoware.blog68.fc2.com/blog-entry-1231.html)

![スクリーンショット-2016-02-06-20.33.56.png](https://qiita-image-store.s3.amazonaws.com/0/147445/04dae78c-ba9e-11ff-682c-e50e28c5d3da.png)


また、外部から接続させる場合はルーターの設定から1723, 500, 4500, 1701ポート及びESPプロトコルを解放する

![スクリーンショット-2016-02-06-20.28.12.png](https://qiita-image-store.s3.amazonaws.com/0/147445/fa171a0d-c640-7e95-bd98-2459c1678b34.png)


これでwindows以外のクライアントからVPN接続することができるようになった



Windows7クライアントからVPN接続

windows7からWindowsServer2012へVPN接続する際、レジストリを書き換えないと接続できない

レジストリ サブキー:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent

レジストリ エントリ:AssumeUDPEncapsulationContextOnSendRule

データ型:DWORD (32 ビット) 値

データの値:2

上記のレジストリを追加し、再起動後windows7からもWS2012へVPN接続することができた
WindowsServer2012でポート転送

テスト用仮想マシンへポート転送する必要ができたのでメモ

ちなみに設定後ルーター自体にその機能があるのを見つけて設定消し去ったのはナイショ

[[備忘録] WindowsServer2012R2でポート転送(portproxy)をやってみる。](http://qiita.com/dumpty-alma@github/items/2cdec8c30cc46ae9c7ed)

このqiitaが一番簡潔で分かりやすかった

listenaddress=0.0.0.0はダミーでもなんでもなくてそのままで大丈夫みたい
dat.GUIのスライダーっぽいものをつくる


デモ：http://codepen.io/mo4_9/pen/qRyoKE

スライダーのセレクタ、初期値、最大値、最小値を渡せば、いくつでも量産できるようにする。
あとはinputのchangeを監視して、cookieなどに数値を保管すれば実用的。

```javascript
class Slider {

  // slider max min initialValue
  constructor(opts={}) {
    this.isDragging = false;

    this.$slider = opts.$slider || $(".slider") || $("div");
    this.$sliderInner = this.$slider.find(".slider__inner") || $("div");
    this.$sliderFg = this.$slider.find(".slider__inner--fg") || $("div");
    this.$sliderInput = this.$slider.find(".slider__input") || $("div");

    this.initialValue = isNaN(opts.initialValue) ? 0 : opts.initialValue;
    this.max = isNaN(opts.max) ? 1000 : opts.max;
    this.min = isNaN(opts.min) ? 0 : opts.min;

    this.isInt = opts.isInt || true;
    this.floatNum = isNaN(opts.floatNum) ? 0 : opts.floatNum;

    this.init();
    this.initListener();
  }

  init() {
    this.$sliderInput.val( this.initialValue );
    // 初期のwidthを合わせる
    this.fixSliderWidthByInputNum( this.initialValue );
  }

  initListener() {
    
    const that = this;

    // slider側
    this.$sliderInner.on("mousedown", (e) => {
      e.preventDefault();
      this.isDragging = true;
    })
    this.$sliderInner.on("mouseup mouseleave", (e) => {
      e.preventDefault();
      this.isDragging = false;
    })
    this.$sliderInner.on("mousemove", (e) => {
      e.preventDefault();
      if(!this.isDragging) return;
      let percent = ( (e.offsetX + 1) / this.$sliderInner.width() ) * 100;
      percent = Math.min(percent, 100);
      this.$sliderFg.css("width", `${percent}%`)

      const num = this.getAdjustedNumber(percent);
      this.$sliderInput.val( num ).change(); // changeイベント発火 http://qiita.com/foo9/items/51ffdaa5305fbc4efa58
    })
    
    // input側
    this.$sliderInput.on("change", function(){
      that.fixSliderWidthByInputNum( $(this).val() );
    })

  }
  
  // inputの数値からスライダーのwidthを決定
  fixSliderWidthByInputNum(num) {
    let percent = ( num - this.min ) / ( this.max - this.min ) * 100;
    percent = Math.min(percent, 100);
    this.$sliderFg.css("width", `${percent}%`);
  }

  getAdjustedNumber(percent) {
    let num = ( this.max - this.min ) * ( percent / 100 ) + this.min;
    if (this.isInt) {
      num = Math.floor(num);
    } else {
      num = num.toFixed(this.floatNum);
    }
    return num;
  }

}


(() => {
  new Slider({
    $slider: $(".slider-01"),
    initialValue: 50, max: 100, min: 30
  })
  new Slider({
    $slider: $(".slider-02"),
    initialValue: 1000, max: 5000, min: 300
  })
  new Slider({
    $slider: $(".slider-03"),
    initialValue: 2000, max: 10000, min: 1000
  })
})()
```
Rails でツリー構造をシリアライズして RDB に持つことに抵抗があるときに読む投稿

# はじめに

Rails + RDB を使っていて、ツリー構造を持ちたくなることありますよね。
例えば企業の部署を構造的に管理しなければならないときとか、ディレクトリ構造を保持しなければならないときとか。
そういうときに、皆さんどうやって管理されてますか？

## 動機

僕は今までオブジェクトをシリアライズして text型のフィールドに突っ込むことでやり過ごしてきました。
実際、この方法で特に問題なかったんですが、ある案件で、サブツリーを取り出して、コピーしたいなーっていう要件が出てきました。
サブツリーを取り出す？・・・それってまずサブツリーを検出するアルゴリズムを実装しないといけないよね・・・どこに持つ？共通化したいな？どこに持つ？

## 調査

というわけで、そもそもツリー構造って RDB でみんなどう扱っているの？っていうのを知りたくて情報の海（Google）に飛び込みました。

するとそこで目にしたのは、"Nested Set Model" というデータ構造。
あー、昔勉強しましたねこれ！
詳細は省きますが、ツリー構造を集合だと思うとイケてるよってものです。
詳しく知りたい人は Appendix をご覧ください。

それで、アルゴリズムにあたりを付けたところで github で実装を調査すると、以下のようなものが見つかりました。

### gem調査

#### acts_as_tree

- （旧）https://github.com/rails/acts_as_tree
- （新）https://github.com/amerine/acts_as_tree

なぜか rails のオーガニゼーションから別のところに移管されていました。

`parent_id` を指定していることから、隣接リストモデルで実装されているようです。
シリアライズとあまり変わらない気がするのでちょっと無視。

#### closure_tree

https://github.com/mceachen/closure_tree

これも `parent_id` 指定してるから隣接リストモデルかな？またちょっと無視

#### awesome_nested_set

https://github.com/collectiveidea/awesome_nested_set

`lft`、`rgt` を定義しているので、入れ子集合モデルのようです。
`parent_id` も同時に指定しているのはパフォーマンスのためでしょう。

というわけで、少しこの gem の中身を見てみたんですが、left とか right を操作するのがちょっと嫌だなと思いました。僕はツリー構造の操作に興味があるのであって、その実装は（少なくとも使用者であるときには）無視できるべきだという感覚からです。

## 調査結果

Google の検索結果 1ページに目には、めぼしいものがなかった。

# 次のアクション

なかったので、作れば良いかと思って作りました。
エンジニアたるもの、欲しいものは自分で作れの精神ですね。
（作り始めた後でより良い物が見つかることも多いですけど、そんなことでへこたれませ……）

https://github.com/chase0213/fast_tree

メソッドの詳細は README に書いているので省略しますが、高速であることと、メソッドが直感的であることを目指してデザインしました。

# おわりに

ツリー構造を Rails で扱う方法を簡単に調査して、結局自分で作りました。
僕は、適当にツリーっぽいものを構築した後で、一気にガチャってツリーを再構築できるようなメソッドだったり、オブジェクトからツリーを構築できるメソッドだったりが欲しいんですけど、そういうリクエストやバグがあれば github の issues/pull-requests に投げていただければ幸いです。できればそれほど大きくない限り PR の方が良いです。

あと、パフォーマンス上、生の SQL 書いているところがあって、それは他の DB だとどうかなーって感じがするので、テスト追加の PR とかもお待ちしてます。


# Appendix

- Nested set model - wiki pedia
https://en.wikipedia.org/wiki/Nested_set_model

- SQLで木と階層構造のデータを扱う（１）―― 入れ子集合モデル
http://www.geocities.jp/mickindex/database/db_tree_ns.html
irbやpryで日本語入力できるようにする

OS X標準のrubyでirbやpryを使用して日本語入力をした際、文字化けしてしまう問題がある。

このままではテストする際に煩わしのでその対処法をメモ



どうやらreadlineが参照しているlibeditに問題があるっぽい。

[日本語が使えるirbにしておく - ザリガニが見ていた...。](http://d.hatena.ne.jp/zariganitosh/20140923/japanese_irb)



--noreadlineオプションを使えばreadlineを使用しないのでそのままでも日本語入力が可能となる。

```bash
irb --noreadline
```


readlineを使用する場合は参照先ライブラリのパスを変更する必要がある。

上記のサイトを参考にして

```bash
BUNDLE=`ruby -r readline -e 'puts $LOADED_FEATURES.grep /readline/'`
OLD=`otool -L $BUNDLE | awk '/libedit/{print $1}'`
NEW=`brew list readline | grep libreadline.dylib`
sudo install_name_tool -change $OLD $NEW $BUNDLE
```
これを実行すると参照先が更新されてirbやpryでも日本語入力が可能となる。