OmniAICreator/Qiita-1.07M huggingface dataset:
djangoでN+1queryのテストを手軽に済ませたい場合にはassertNumQueriesが便利

## djangoでN+1queryのテストを手軽に済ませたい場合にはassertNumQueriesが便利

django1.7移行では [assertNumQueries](https://docs.djangoproject.com/ja/1.9/topics/testing/tools/#django.test.TransactionTestCase.assertNumQueries) が失敗時にcaptureしたqueryの結果を出力してくれる様になりました。
なので以下のようなコードを書いてあげれば、withで囲った部分で発行されたDBのqueryが分かるようになります。

```python
from django.test import TestCase

class Test(TestCase):
    def _callFUT(self):
        Model(name="foo").save()
        return Model.objects.count()

    def test_it(self):
        with self.assertNumQueries(3):
            self.assertEqual(self._callFUT(), 1)
```

例えば上のコードでは `self._callFUT()` 内で実行されたqueryの数を調べる事ができます。
本来は2件なのですが `assertNumQueries()` に3を指定してわざと失敗させています。

実行結果

```
Creating test database for alias 'default'...
F
======================================================================
FAIL: test_it (__main__.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "qr_34141zLt.py", line 46, in test_it
    self.assertEqual(self._callFUT(), 1)
  File "/home/podhmo/vboxshare/venvs/django/lib/python3.3/site-packages/django/test/testcases.py", line 90, in __exit__
    query['sql'] for query in self.captured_queries
AssertionError: 2 != 3 : 2 queries executed, 3 expected
Captured queries were:
QUERY = 'INSERT INTO "model" ("name") VALUES (%s)' - PARAMS = ('foo',)
QUERY = 'SELECT COUNT(*) AS "__count" FROM "model"' - PARAMS = ()

----------------------------------------------------------------------
Ran 1 test in 0.005s

FAILED (failures=1)
Destroying test database for alias 'default'...
```

発行されたqueryが分かるようになります。

## test以外で特定の範囲内で発行されたqueryを知りたい場合

`django.test.utils.CaptureQueriesContext` が使えるかもしれません。

以下の様な感じでがんばってください

```python
from django.test.utils import CaptureQueriesContext
from django.db import connections

with CaptureQueriesContext(connections["default"]):
    do_something()
```

Wrote by [PileMd](https://pilemd.com/)

## 参考

- https://code.djangoproject.com/ticket/21462
- https://meshy.co.uk/posts/debugging-assertnumqueries-tests
ChromeでHTML ElementのイベントがどのjavascriptにbindされてListen状態になっているか見る


ちゃんと見れるの知らなかったのでメモしておきます。

他人のページなのでちょっとアレですが、こちらのサイトで見てみました。
http://jquery.keicode.com/ui/autocomplete.php

Developerツール（右クリック＆要素の検証）で見られるんですね。

![スクリーンショット 2016-04-16 17.03.54.png](https://qiita-image-store.s3.amazonaws.com/0/30411/31918c2f-23b1-f2af-7173-48a909ef3c7f.png "スクリーンショット 2016-04-16 17.03.54.png")

デベロッパツールの表示はこんな感じ。

![スクリーンショット 2016-04-16 16.44.02.png](https://qiita-image-store.s3.amazonaws.com/0/30411/a6c20529-3d8d-4fde-d2a2-c731bd6fbec5.png "スクリーンショット 2016-04-16 16.44.02.png")

``<input type="text" id="ac1"/>``に対するEvent Listenersはこんな。

![スクリーンショット 2016-04-16 17.02.51.png](https://qiita-image-store.s3.amazonaws.com/0/30411/793d4bac-cde3-c428-4548-0cbaa86b9598.png "スクリーンショット 2016-04-16 17.02.51.png")


この場合、 ``<input type="text" id="ac1"/>`` には
blur,click,focus,input,keydown,keypress,mouseup,remove
のイベントに対して、jquery-ui-1.10.4.min.jsの6行目がListenしています。

他人のJavascriptがなんのイベントを拾って実装しているのかが丸裸になります。自分の実装の参考にできるのでいいですね。

jquery ui の autocomplete を真似た実装がしたかったので、inputのどんなイベントをListenしているのか見たかったのですが、onchangeだけbindしとけばいいかなーとおもってたら全然違ってた。アハハ。
AWS Lambda / Upload a .ZIP file から Code entry type に戻す方法

AWS Lambda にて `Upload a .ZIP file` で一度登録すると、 `Code entry type` に戻せないのかと思ったが戻せた。

## どうやるか

対象のファイルを単独で zip にして `Upload a .ZIP file` でアップロードすることで `Code entry type` での編集にできる。
Python2.7 で タイムゾーン付き日時を Unixtime に変換する

## やりたかっこと

ISO 8601 `YYYYMMDDThhmmss.SSS+900` を Unixtime に変換しようとしていた。
python2.7 で `strptime` では `%z` がサポートされていないので、タイムゾーンを使った日付変換が面倒くさい。`%z` を使うと下記のように怒られる。
`ValueError: 'z' is a bad directive in format '%Y%m%dT%H%M%S.%f%z'`


[strftime() と strptime() を使ってtzinfo付きdatetime <-> stringの変換をやってみた](http://qiita.com/yu-sa/items/8063544e6163703f816c) を参考に途中までやっていたのだが、 JST から JST の変換はゾーン指定子を気にする必要がなかったことに気づいた。
※UTCからJSTへの変換などは上記の記事のようなことが必要だろう。

## タイムゾーン指定子を削除してしまえばいい

タイムゾーン
使えないなら
消してしまえ

```py
>>> from datetime import datetime
>>> import time
>>> int(time.mktime(datetime.strptime('20160323T204100.001+0900'.replace('+0900', ''), '%Y%m%dT%H%M%S.%f').timetuple()))                                       
1458733260
```

ちょっと強引だけどシンプルになった。
技術英語 / 電子工作 > リスニング > What is a Capacitive Proximity Sensor?

What is a Capacitive Proximity Sensor?
https://www.youtube.com/watch?v=Y1mA50tEmLQ&index=9&list=PLH-cCAXYL7WG6tddLeW1P2_MvDFU1_Cya

測定関連の動画を探していて見つけた。Capacitive Proximity Sensor.

赤文字ははっきり聞き取れない部分。
青文字はそのように聞き取れるが、文法的にしっくりいかない部分。

(0:00-)
Welcome to the G TV. Today I will be showing you what a Capacitive proximity sensor is. Capacitive Proximity sensors can be used to  sensible <font color=red>metallic</font> and non-metallic materials. Some ideal applications include Liquid level detection, Material level control, Counting, and Induction molding processes, such as a detection level of plastic pellets in the <font color-red>beat-whopper</font>.

[補足] metallic は lが2つというのは初めて知った
[補足] beat-whopper というものは未消化

(0:30-)
The capacitor consists of two metal plates, separated by insulator called "Dielectric". Capacitive Proximity Sensors can detect any target that has dielectric constant greater than air. 

(0:42-)
The Dielectric constant is electric static field generated by the oscillator circuit. If the object enters this field causes  interference, oscillation then begins. <font color=red>The detector will</font> trigger the circuit monitor the oscillator output. When it detects sufficient change in the field, it switches on the output circuit.

(1:03-)
The output circuit remains active until the target is removed from the sensing field. Sensing ranges can depend on the material needed to be detected. There is no de-rating factor to be applied when sensing metal targets. 

(1:18-)
But other materials do affect the sensing range. Sensors can be used to detect liquid through non-matellic materials, such as glass or plastic. But they need to be mounted so that the sensor detects just the liquid not the container.

(1:40-)
Generally, the sensing distance for Capacitive Proximity sensors is greater, for larger or denser targets. But the effects of electro-static field produced by non-conductive material can be quite small. Usually sensing distance with this material is short. 

(1:53-)
Materials such as ungrounded conductive material can be sensed from further away because it causes more interference in the electro-static field. Grounded conductive material causes even more interference and thus has a longer sensing distance.

(2:11-)
Since the composition of the material and ambient condition can have an impact on the sensing field, many Capacitive Proximity sensors are equipped with sensitivity adjustment potentiometers.

[補足] [potentiometers 秋月電子](http://akizukidenshi.com/catalog/c/cvr)

(2:19-)
Capacitive Proximity <font color=blue>switches(sensors?)</font> can detect materials in greater ranges from inductive sensors and have a long operation life. Capacitive Proximity sensors along with thousands of other products and services, are available at Galco.com.


本当は以下の動画の記事にしようかとしたが、6分もあるので、タイピングが時間がかかりそうなので未処理。
[Capacitive Proximity Sensor](https://www.youtube.com/watch?v=SsvjxnN8ZUk&index=6&list=PLH-cCAXYL7WG6tddLeW1P2_MvDFU1_Cya)
カスタムBean ValidatiorでpropertyPathにインデックスを付与する

## 1.やりたいこと

* Bean Validationでカスタムバリデータを作成してバリデーションをする
* 対象はコレクション(ArrayやList、Setなど)
* ConstraintViolation.getPropertyPath()でproperty[1]みたいに取得できたい

## 2. やったこと

カスタムバリデータで以下のようにViolationの設定をするとよいっぽい。

```java
// ConstraintValidatorContext context
context.buildConstraintViolationWithTemplate(message)
       .addBeanNode()
       .inIterable()
       .atIndex(index)
       .addConstraintViolation()
       .disableDefaultConstraintViolation();
```

.inIterable()でLeafNodeContextBuilderが取得できるので、
それに対してatIndex(index)を呼び出してIndexを設定する。
ConstraintViolation.getPropertyPath()は、property[1]のようになる。

できた。

ちなみに、LeafNodeContextBuilder#atKey(Object)を呼び出すと

```java
.atKey("xyz") // => property[xyz]
```

みたいになった。

おわり。

## 追記

List&lt;Bean&gt;みたいにして、Beanのプロパティにアノテーション付けたら、
こんなことしなくて良い..>_<..
TweenMaxとScrollMagicで自由自在にスクロールアニメーション

フロントエンド弱い自分でも、かなりぐりんぐりんなスクロールアニメーションを実装出来たので、その時のメモ。

## TweenMaxとは

任意のアニメーションを実現できるJavaScriptライブラリ。
GreenSockが作っている。TweenLiteという軽量版もある。

> GreenSock | TweenMax
> https://greensock.com/tweenmax

こんな風に書きます。
cssアニメーションのkeyframeみたいに前の状態（`from`）と後の状態（`to`）を決めて、

こんなことができます。

https://codepen.io/ikuwow/pen/aNGmOr

## ScrollMagicとは

スクロールアニメーションを作るためのJavaScriptライブラリ。
TweenMaxで作ったアニメーションの、時間軸をスクロール量に置き換えたり、特定のスクロール位置に達したら何かのアニメーションをトリガーするなどしてスクロールアニメーションを作る。

> ScrollMagic ♥ Demo
> http://scrollmagic.io/

例がいっぱいあって、けっこうときめきます。

> Examples - ScrollMagic
> http://scrollmagic.io/examples/index.html

## 複数アニメーションを入れるためのTimelineMax

複数のアニメーションを入れるときはこちら。

> GreenSock | TimelineMax
> https://greensock.com/timelinemax

（今後デモを追加する予定。。。）
OpenCVのネイティブピクセルフォーマットがBGRな理由

http://www.learnopencv.com/why-does-opencv-use-bgr-color-format/

> “Why not use RGB when everybody else and their aunts use RGB?”
> 
> This is the question I asked Dr. Gary Bradski, founder of OpenCV, when I met him at a conference a few months back, although I left out the part about everybody and their aunts using RGB. He answered my question with another question.
> 
> “Why is the the US standard railroad gauge 4 feet, 8.5 inches?”
> 
> The answer to that question of course is “Because of Roman horse’s ass!” 

（参考訳）

> 「なぜ一般に使われているRGB順ではないのですか？」
>
> 数ヶ月前のカンファレンスでOpenCVファウンダーであるGary Bradski博士に会った際、一般に使われるRGBではないことについて、私が彼に聞いた質問です。彼は私に別の質問をしました。
> 
> 「なぜ米国の鉄道レール幅は4フィートと8.5インチなのか？」
>
> この質問への答えは、もちろん「ローマ帝国時代の馬のお尻の幅由来です！」

## 蛇足
http://www.snopes.com/history/american/gauge.asp

---

:::note info
2022-12-30追記
より真面目(？)な解説はyoyaさんによる記事「[OpenCV のピクセル形式が BGR である理由](https://qiita.com/yoya/items/bfef7404ded22649a2af)」を参照ください。
:::
mysql 中文 问号

http://blog.csdn.net/encienqi/article/details/5963662

mysql中的中文成了问号
关键字: mysql rails
我用mysqladmin -uroot create的方式创建数据库，都会碰到数据表中的中文变成问号的问题。 

如果通过client（比如phpmyadmin）来创建数据库，把collation设为utf8_unicode_ci就不会有问题。 

原来要在mysql的config文件的[mysqld]里加上这两行： 
default-character-set=utf8 
collation-server=utf8_unicode_ci 

mysql的config文件，linux缺省在/etc/my.cnf，windows缺省在my.ini。
【備忘録】Sublime Text 3いろいろ

##インストールしたパッケージ
- japanize
- IMESupport
- ConvertToUTF8


##参照サイトさん
- [[tips][Sublime Text] Sublime Text 3をインストールしたらまずやること](http://keidrun.tumblr.com/post/73033053898/tipssublime-text-sublime-text)
Mac (el capitan) で、postgres をアップグレード


[こちらの記事](http://openbook4.me/sections/1307)をほぼそのままですが、[herokuのPostgresのバージョン](https://devcenter.heroku.com/articles/heroku-postgresql#version-support-and-legacy-infrastructure)に合わせて、最新ではなく9.4.5を入れた。

```shell-session
mv /usr/local/var/postgres /usr/local/var/postgres9.3
initdb /usr/local/var/postgres -E utf8

rm -rf /usr/local/var/postgres

initdb --locale=ja_JP.UTF-8 /usr/local/var/postgres

pg_upgrade -d /usr/local/var/postgres9.3 \
-D /usr/local/var/postgres \
-b /usr/local/Cellar/postgresql/9.3.1/bin \
-B /usr/local/Cellar/postgresql94/9.4.5/bin
```
UXのきほん

#企業の中堅社員の再教育が興味ある
・一番悪戦苦闘してるのが
・
webだと30代半ば、40代以上はほとんど役に立たない


#UXを業務を業務で使っているとは？どういうこと？？
半分以上が使っている。
狭い範囲
会社の中でUXを実践することになってきている。

・自分たちの会社のブランドが必要。
それを欲しがっているユーザーを探す。

・儲かるってことに対して否定的

・UXが理解されない
↓
・UXがわかっている人は稼いでいる

・UXは人に言わないほうがいい

#もう古老の話は効かない

#世界のルールが全部変わった　どのように？

#変わってかない人が多い　そりゃめんどくさいからね。
・危機を煽るのがコンサルタント

#スキル = 知識・技術 + 判断

#クライアントのゴールは間違っている
ゴールを目指す。
ごーるがあっているか？
それは別

#ものを作ると　いろいろ問題が出てくる。　その問題がクリエイティブの源泉

#毎日違う店にいけ

#聞かない　よく見る


#学習ではなく　発達
UXは税痛い


#UXをするにはHCDがベース

#客のヒアリングを信じない


#UXの中で調査が一番むずかしい
#調査のときに聞いちゃいけない。病院いえばで検査

#観察で見つける。　見つけたあとにそれを聞く　



#最後に徹夜して作る奴は糞

#もう、もうかるものはUXしかない

シュンソクって言う靴は小学生の６割がはいてる

#考えたくない

#スターバックスは　3reプレイスを売っている

#ビジネスモデルジェネレーション
→ワークショップ
http://localhost:7999/ftpopen?path/ にアクセスするとWinSCP.exeがftp://user4:pass@192.168.100.70/path/ を開くサンプル

http://localhost:7999/ftpopen?path/ にアクセスすると
WinSCP.exe が ftp://user4:pass@192.168.100.70/path/ を開くサンプル。


```java:ftpopen.go
package main

import (
    "fmt"
    "net/http"
    "runtime"
    "os/exec"
    "time"
)

func ftpopen(w http.ResponseWriter, r *http.Request) {
    var path = r.FormValue("path")
    fmt.Println(time.Now().Format("15:04:05") +" "+ path)
    if runtime.GOOS == "windows" {
        exec.Command("winscp.exe", "ftp://user4:pass@192.168.100.70/"+path).Run()
    } else {
        exec.Command("pcmanfm", "ftp://192.168.100.70/"+path).Run()
    }
}

func main() {
    http.HandleFunc("/ftpopen", ftpopen)
    fmt.Println("Listening port 7999")
    http.ListenAndServe("127.0.0.1:7999", nil)
}
```

```bash:コンパイル
GOOS=windows GOARCH=386 go build ftpopen.go 
```

----

## ユーザ名をaccount.txtに記述する場合

```text:account.txt
user4
```

```java:fileread/fileread.go
package fileread

import (
        "bufio"
        "fmt"
        "os"
)

func Get_user() string {
        var fp *os.File

        fp, _ = os.Open("account.txt")
        defer fp.Close()

        scanner := bufio.NewScanner(fp)

        var username string
        for scanner.Scan() {
                username = scanner.Text()
                fmt.Print(username)
        }
        return username
}
```

```java:ftpopen.go 
package main

import (
	"./fileread"
	"fmt"
	"net/http"
	"os/exec"
	"runtime"
	"time"
)

func ftpopen(w http.ResponseWriter, r *http.Request) {
	var path = r.FormValue("path")
	var user = fileread.Get_user()
	fmt.Println(" "+time.Now().Format("15:04:05") + " " + path)
	if runtime.GOOS == "windows" {
		exec.Command("winscp.exe", "ftp://"+user+":pass@192.168.100.70/"+path).Run()
	} else {
		exec.Command("pcmanfm", "ftp://192.168.100.70/"+path).Run()
	}
}

func main() {
	http.HandleFunc("/ftpopen", ftpopen)
	fmt.Println("Listening port 7999")
	http.ListenAndServe("127.0.0.1:7999", nil)
}
```

----

## explorerを開く場合

* [Re[1]: 同じフォルダを二つ開きたくない。](http://bbs.wankuma.com/index.cgi?mode=al2&namber=54709&KLOG=91)

```go:
package main

import (
    "fmt"
    "net/http"
    "runtime"
    "os/exec"
    "time"
)

func explorer(w http.ResponseWriter, r *http.Request) {
    var path = r.FormValue("path")
    fmt.Println(time.Now().Format("15:04:05") +" "+ path)
    if runtime.GOOS == "windows" {
        // explorerを複数開かないようにする
        exec.Command("rundll32.exe", "url.dll,FileProtocolHandler", path).Run()
    } else {
        exec.Command("pcmanfm", "smb://192.168.100.70/"+path).Run()
    }
}

func main() {
    http.HandleFunc("/open", explorer)
    fmt.Println("Listening port 7999")
    // chrome起動 (並列に実行)
    // go exec.Command("C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe", "http://google.co.jp").Run()

    http.ListenAndServe("127.0.0.1:7999", nil)
}
```
Firefoxさん「'animation' の値をパース中にエラーが発生しました」

似たようなCSSアニメーションを大量生産したい時に。

```stylus
for i in 1..10
  .anime-{i}
    animation-name 'anime-' + i
```

(コンパイル後)

```CSS
.anime-1 {
  -webkit-animation-name: 'anime-1';
          animation-name: 'anime-1';
}
.anime-2 {
  -webkit-animation-name: 'anime-2';
          animation-name: 'anime-2';
}
.anime-3 {
  -webkit-animation-name: 'anime-3';
          animation-name: 'anime-3';
}...
```

などと書いていたのですが、これだとfirefoxとかIEで動きません。なまじchromeでは動くから困る。
ひたすら[MDN](https://developer.mozilla.org/ja/docs/Web/CSS/animation-name)とにらめっこしてようやく気づいた。

正解は

```CSS
.anime-1 {
  -webkit-animation-name: anime-1;
          animation-name: anime-1;
}
.anime-2 {
  -webkit-animation-name: anime-2;
          animation-name: anime-2;
}
.anime-3 {
  -webkit-animation-name: anime-3;
          animation-name: anime-3;
}...
```

これで動きます。なまじchromeでは動くから(略
stylusはちょっと面倒ですが

```stylus
for i in 1..10
  .anime-{i}
    animation-name 'anime-%s' % i
```

こうなります。他の書き方もあるぞって方は是非教えてください。
こんな書き方してる人がそもそもいないのか、ちょっとハマったし、そういう注意喚起も見当たらなかったのでメモ。
Centos7+anaconda2.4.1でtensorflowをインストールする


##前提

```
python3 -V
Python 3.5.1 :: Anaconda 2.4.1 (64-bit)

pip -V
pip 8.1.1 from /root/anaconda3/lib/python3.5/site-packages (python 3.5)
```

##公式サイトの手順に従ってインストール
https://www.tensorflow.org/versions/r0.8/get_started/os_setup.html#pip-installation

pip,virtualenv,dockerを使った方法が紹介されているが、
今回はpipでインストールする。

紹介されていたpipでのインストールコマンドではエラーが生じた。
pip3が入っていなかったので、pipで実行したが、python3.4ではなかったためか下記のようなエラーが生じた。

```
pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.8.0rc0-cp34-cp34m-linux_x86_64.whl
tensorflow-0.8.0rc0-cp34-cp34m-linux_x86_64.whl is not a supported wheel on this platform.
```

##少し手を入れて再度インストール

ローカル環境に持ってきて名前の「cp34」→「cp35」に変更し再度インストールすると
成功したよう！
「cp34」の部分はパイソンのバージョンと関係があるようなのだが、それ以上のことはわからずじまい。。。


```
wget https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.8.0rc0-cp34-cp34m-linux_x86_64.whl
mv tensorflow-0.8.0rc0-cp34-cp34m-linux_x86_64.whl tensorflow-0.8.0rc0-cp35-cp35m-linux_x86_64.whl
pip install --upgrade tensorflow-0.8.0rc0-cp35-cp35m-linux_x86_64.whl
```

##検証
[公式サイトで紹介されているコマンドラインでの検証方法](https://www.tensorflow.org/versions/r0.8/get_started/os_setup.html#run-tensorflow-from-the-command-line)に従って、動作検証

公式サイトの結果と少しだけ異なるものの、きちんと動いてる！

```python:cosole
$ python
>>> import tensorflow as tf
>>> hello = tf.constant("Hello, TensorFlow!")
>>> sess = tf.Session()
>>> print(sess.run(hello))
b'Hello, TensorFlow!'　←本当は'Hello, TensorFlow!'のみ表示される予定でした。
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42
```

bってなんだろ・・・
VBA で JSON 変換する cJobject ライブラリ

#cJobject について
VBA で JSON を扱う場合、ほとんど ScriptControl か JSONLib を使っているようです。
ただ、制約があったり機能が少ないなどあまり使い勝手はよくないです。
cJobject も json 変換出来るライブラリですが、日本で紹介されたサイトが見当たりませんので、ご紹介します。

[Kintone レポートツール](http://qiita.com/rex0220/items/9e7a3dd2246ce029b3e4)で使用したライブラリですが、これをベースに kintone 用ライブラリを作成して使用しています。
検索やソート、クローン機能などもあるようですが試していません。
もう少し日本でも使用例が増えて、情報が集まってくれるとうれしいです。


cJobject は、[Desktop Liberation](http://ramblings.mcpher.com/) で公開されている巨大なライブラリの一部です。
データ関連について、あまりにも機能が多すぎて、json 関連の機能があることが埋没してしまっています。
また、巨大ライブラリの一部ということで、クラス、標準モジュールなどソースが分散しているのが、少し使いにくい点です。
最初に使ったときは、よくわからず巨大ライブラリから必要な機能を切り出して使いました。

#ダウンロード
cJobject の機能を手っ取り早く試すには、下記からexcel ファイルをダウンロードします。
[ダウンロードページ](http://ramblings.mcpher.com/Home/excelquirks/downlable-items) で、Data Manipulation　を展開すると、最後に[vanillacJobject.xlsm](http://ramblings.mcpher.com/Home/excelquirks/downlable-items/vanillacJobject.xlsm?attredirects=0&d=1) があります。

vanillacJobject.xlsm ファイル
![image](https://qiita-image-store.s3.amazonaws.com/0/100572/6ad1a29c-7c7a-c3cc-4927-04cb953db4d7.png)


json 変換のコード例

```
Private Function getMoreData() As cJobject
    
    ' just get some vanilla json data
    Set getMoreData = JSONParse("[" & _
            "{'name':'john', 'demographics':{'age':25,'sex':'male'}}," & _
            "{'name':'mary', 'demographics':{'age':50,'sex':'female'}}" & _
        "]")

End Function
' simple test
Private Sub showData()
    Dim job As cJobject, jo As cJobject, jp As cJobject, jm As cJobject
    
    Set job = getMoreData()
    
    ' stringify
    Debug.Print job.stringify
```

vba のデバッグ実行で、json オブジェクトを階層で表示できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/100572/d3c95407-15f5-19c7-f569-487c1309d8bc.png)

使い方などは、そのうち少しづつでも紹介できればと思います。
c++ builder / memory leak > MAXSTACKSIZE > スタックを最大スタック サイズより大きくしようとすると、EStackOverflow 例外が発生します。

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

http://stackoverflow.com/questions/6150018/what-is-a-safe-maximum-stack-size-or-how-to-measure-use-of-stack
で見つけた MAXSTACKSIZE というキーワード

http://docwiki.embarcadero.com/RADStudio/XE8/ja/メモリ割り当てサイズ（Delphi）

プロジェクトオプションでは
C++リンカ > 出力 > スタックサイズ(最大) が 0x00100000 で上記２つめのリンクの 1048576 に対応する。

> アプリケーションのスタックは、最大スタック サイズより大きくなることはできません。スタックを最大スタック サイズより大きくしようとすると、EStackOverflow 例外が発生します。

1MB以上のメモリリーク時に EStackOverflow 例外が発生する、という理解で正しいのだろうか。

## 試してみた

vmware上のWin7において、意図的にメモリリークするコードを試した。

Timer1Timerにて1秒ごとに 1024個のTStringListポインタをnewしてdeleteしないコード。

プロジェクトオプションにて最大スタックサイズを65536バイトに設定した。

と準備をしているうちに気づいたが、newしている場合はヒープ領域になるので、スタックサイズとは別の扱いになるのだろう。

代わりに「ヒープサイズ（最大）」を65536バイトにして、毎秒8192バイトをnewで消費するコードを試したが、65536バイト消費した後もソフトは動き続けている。

裏ではメモリ破壊を起こしているのだと思われる。
ActiveRecord オブジェクトでも values_at したい

# 追記 (2023/06/29 (木))

Rails 6.1 以降では [ActiveRecord::Core](https://api.rubyonrails.org/classes/ActiveRecord/Core.html#method-i-values_at) というメソッドが追加されています。

- [Rails 6.1 adds values_at attribute method for Active Record - BigBinary Blog](https://www.bigbinary.com/blog/rails-6-1-adds-values_at-attribute-method-for-active-record)

よって Rails 6.1 以降では以下で紹介している独自の拡張は不要です。


@jnchito さん、コメントで教えていただきありがとうございました ☺️

# 概要

僕の大好きなメソッドに [Array#values_at](http://docs.ruby-lang.org/ja/2.3.0/method/Array/i/values_at.html) や [Hash#values_at](http://docs.ruby-lang.org/ja/2.3.0/method/Hash/i/values_at.html) というものがあります。Array オブジェクトや Hash オブジェクトから任意のインデックス群、またはキー群に該当する値を取得するメソッドです。

```rb
['金剛', '比叡', '榛名', '霧島'].values_at(1, 3)
#=> ["比叡", "霧島"]

{ kongo: '金剛', hiei: '比叡', haruna: '榛名', kirishima: '霧島' }.values_at(:hiei, :kirishima)
#=> ["比叡", "霧島"]
```

今回、ActiveRecord オブジェクトでも同様のことがしたいなと思いました。

# 結論

[ActiveRecord::Core#slice](http://apidock.com/rails/ActiveRecord/Core/slice) を使って実現しました。

```rb
module ActiveRecord
  module Core
    module Extension
      def values_at(*methods)
        slice(*methods).values
      end
    end
  end
end
```

以下は使用例です。

```rb
class Category < ActiveRecord::Base
  has_many :kanmusus
end

class Kanmusu < ActiveRecord::Base
  include ActiveRecord::Core::Extension

  belongs_to :category
end

Kanmusu.find(21).values_at(:name, :category, :length)
#=> ['金剛', #<Category ..., name: "金剛型戦艦", ...>, 222]
```

# 解説

初めは以下のように実装しました。

```rb
module ActiveRecord
  module Core
    module Extension
      def old_values_at(*keys)
        attributes
          .with_indifferent_access
          .values_at(*keys)
      end
    end
  end
end

Kanmusu.find(21).old_values_at(:name, :length)
#=> ['金剛', 222]
```

これは

1. `attributes` で ActiveRecord オブジェクトの属性をハッシュで受け取る。
2. Hash オブジェクトのキーとして文字列とシンボルの両方を受け付けられるように [ActiveSupport::HashWithIndifferentAccess](http://apidock.com/rails/ActiveSupport/HashWithIndifferentAccess) オブジェクトに変換する。
3. Hash#values_at を呼ぶ。

という流れです。

しかしこの方法では ActiveRecord オブジェクトの属性値しか取得できません。つまり、アソシエーション先のオブジェクトや任意のメソッドの返り値を取得することができないのです。ちなみに `Hash#values_at` で Hash オブジェクトに存在しないキーを指定すると `nil` が返ります。

```rb
Kanmusu.find(21).old_values_at(:name, :category, :length)
#=> ['金剛', nil, 222]
```

そこで ActiveRecord::Core#slice を使うことにしました。この内部では指定したメソッドのコールが行われているので、属性値以外も取得できます。さらに気の利いたことに、返り値は Hash オブジェクトではなく ActiveSupport::HashWithIndifferentAccess オブジェクトです。

```rb
Kanmusu.find(21).values_at('name', 'category', :length)
#=> ['金剛', #<Category ..., name: "金剛型戦艦", ...>, 222]
```

ただし ActiveRecord::Core#slice を使う場合、存在しないメソッドを指定するとエラーになるので注意が必要です。

```rb
Kanmusu.find(21).values_at(:name, :category, :length, :gouchin)
#=> NoMethodError: undefined method `gouchin' for #<Kanmusu>
```
lnのオプション

lnのオプションがわからなかったので、調べてみた

# 結論

`ln -snf`を使いましょう

# やってみる

## 環境

```
OS X El Captain
バージョン 10.11.4
```

## 準備

```
yoan@wolverine [13時46分57秒] [/tmp/test]
-> % ls
file-2016-04-16_13:46:51
yoan@wolverine [13時46分58秒] [/tmp/test]
-> % cat file-2016-04-16_13:46:51
hogehoge
```

## `-s`オプション

通常の用途としては問題なく利用できる

```
yoan@wolverine [13時47分08秒] [/tmp/test]
-> % ln -s file-2016-04-16_13:46:51 symlink
yoan@wolverine [13時47分24秒] [/tmp/test]
-> % cat symlink
hogehoge
```

しかし、リンク元が変わった場合にリンクを再度作成することができない。
(ログファイルがローテートされたタイミング等)

```
yoan@wolverine [13時47分27秒] [/tmp/test]
-> % mv file-2016-04-16_* file-`date "+%Y-%m-%d_%H:%M:%S"`
yoan@wolverine [13時47分50秒] [/tmp/test]
-> % cat symlink
cat: symlink: No such file or directory
yoan@wolverine [13時48分01秒] [/tmp/test]
-> % ln -s file-2016-04-16_13:47:50 symlink
ln: symlink: File exists
```

## `-f`オプション

いわゆる`force`オプション

**リンクがすでに存在している場合に、そのリンクを削除してから、新しく作る**

```
yoan@wolverine [13時48分10秒] [/tmp/test]
-> % ln -sf file-2016-04-16_13:47:50 symlink
yoan@wolverine [13時48分14秒] [/tmp/test]
-> % cat symlink
hogehoge
yoan@wolverine [13時48分16秒] [/tmp/test]
-> %
```

## `-n`(`-h`)オプション

```
-h    If the target_file or target_dir is a symbolic link, do not follow it.  This is most useful with the -f option, to replace a symlink which may point to a directory.

-n    Same as -h, for compatibility with other ln implementations.
```

* リンク対象となるファイル/ディレクトリがシンボリックリンクの場合、なにも行わない
* `-f`オプションと共に利用すると、シンボリックリンクがディレクトリを指している時に有用である


意味がわからんのでやってみる。
ディレクトリ2つと`foo`ディレクトリへのシンボリックリンクを準備

```
yoan@wolverine [14時09分04秒] [/tmp/test]
-> % ls
bar     foo
yoan@wolverine [14時11分05秒] [/tmp/test]
-> % cat bar/file
bar
yoan@wolverine [14時11分13秒] [/tmp/test]
-> % cat foo/file
foo
yoan@wolverine [14時09分16秒] [/tmp/test]
-> % ln -sf foo symlink
yoan@wolverine [14時09分04秒] [/tmp/test]
-> % ls
bar     foo     symlink
```

symlinkを`bar`ディレクトリに変更する

`-sf`だとディレクトリが変わっていない。

```
yoan@wolverine [14時09分16秒] [/tmp/test]
-> % ln -sf bar symlink
yoan@wolverine [14時09分22秒] [/tmp/test]
-> % cat symlink/file
foo
```

`-n`オプションを利用すると、ディレクトリが変わっている。

```
yoan@wolverine [14時09分27秒] [/tmp/test]
-> % ln -snf bar symlink
yoan@wolverine [14時10分08秒] [/tmp/test]
-> % cat symlink/file
bar
```
AWS CLIの出力をYAMLにする

@shogomuranushi さんが[拙作の j2y](http://qiita.com/y13i/items/ee93ea07ecff11990676) で CloudFormation のテンプレートを作る話を[書いてくれた](http://muranonushi.hatenablog.jp/entry/2016/04/16/115853)ので、なんか他の使い方ないかなーと思って書いてみます。

[AWS CLI](https://aws.amazon.com/jp/cli/)の表示形式は `json`, `table`, `text` が[選べます](http://docs.aws.amazon.com/ja_jp/cli/latest/userguide/controlling-output.html)が、 `yaml` は選択肢にありません。

そこで、 [j2y](https://github.com/y13i/j2y) を使ってAWS CLIの出力をYAMLにしてみます。

```shell-session
$ j2y -e "$(aws ec2 describe-regions)"
Regions:
- Endpoint: ec2.eu-west-1.amazonaws.com
  RegionName: eu-west-1
- Endpoint: ec2.ap-southeast-1.amazonaws.com
  RegionName: ap-southeast-1
- Endpoint: ec2.ap-southeast-2.amazonaws.com
  RegionName: ap-southeast-2
- Endpoint: ec2.eu-central-1.amazonaws.com
  RegionName: eu-central-1
- Endpoint: ec2.ap-northeast-2.amazonaws.com
  RegionName: ap-northeast-2
- Endpoint: ec2.ap-northeast-1.amazonaws.com
  RegionName: ap-northeast-1
- Endpoint: ec2.us-east-1.amazonaws.com
  RegionName: us-east-1
- Endpoint: ec2.sa-east-1.amazonaws.com
  RegionName: sa-east-1
- Endpoint: ec2.us-west-1.amazonaws.com
  RegionName: us-west-1
- Endpoint: ec2.us-west-2.amazonaws.com
  RegionName: us-west-2
```

おお。これなら `describe-instances` とかの出力結果も少しは見やすいかもですね。

# 標準入力できるようになりました（from v0.0.8）

```shell-session
$ aws ec2 describe-regions | j2y
Regions:
- Endpoint: ec2.eu-west-1.amazonaws.com
  RegionName: eu-west-1
- Endpoint: ec2.ap-southeast-1.amazonaws.com
  RegionName: ap-southeast-1
- Endpoint: ec2.ap-southeast-2.amazonaws.com
  RegionName: ap-southeast-2
- Endpoint: ec2.eu-central-1.amazonaws.com
  RegionName: eu-central-1
- Endpoint: ec2.ap-northeast-2.amazonaws.com
  RegionName: ap-northeast-2
- Endpoint: ec2.ap-northeast-1.amazonaws.com
  RegionName: ap-northeast-1
- Endpoint: ec2.us-east-1.amazonaws.com
  RegionName: us-east-1
- Endpoint: ec2.sa-east-1.amazonaws.com
  RegionName: sa-east-1
- Endpoint: ec2.us-west-1.amazonaws.com
  RegionName: us-west-1
- Endpoint: ec2.us-west-2.amazonaws.com
  RegionName: us-west-2
```
静的サイトジェネレーターHugoの導入Tips。　③Staticフォルダの使いこなし

静的サイトジェネレーターHugoの導入Tips　その3。Staticフォルダに,静的WikiであるMDWikiを配置してみる。

#staticフォルダの位置。 
Hugoのサイト管理はsitesフォルダ以下で行う。今回のお題は,content/themes等のフォルダと,同列にあるstaticフォルダ。以下,構成例:

```
sites
...
├─content
│  ├─blog
│  └─content
...
├─static
│  ├─css
│  ├─img
│  │  ├─2014
│  │  │  ├─04
│  │  │  └─09
│  │  └─OkhttpTest
│  ├─js
│  └─wiki
│      └─pages
└─themes
    └─hugo-future-imperfect
...
```

Hugoにおいて,staticフォルダ以下のファイルは,そのまま公開用フォルダ(public)にコピーされる。
そのため,例えばstatic/imgフォルダ以下に画像を置いたり([配置例](https://scorching-inferno-3735.firebaseapp.com/img/OkhttpTest/IMG_20150510_1.jpg))，static/wikiフォルダ以下に静的Wikiを配置する([配置例](https://scorching-inferno-3735.firebaseapp.com/wiki))といったことが容易にできる。

# MDWiki
今回用いた静的WikiのMDWikiはHugoと相性が良いので軽く記しておく。
MDWikiの概要は,『[MarkDownで書いたファイルを置くだけでWiki化できるMDWikiを導入してみた。](http://qiita.com/nusa/items/8b07a8d75abc2044fa87)』がよくまとめてくれている。
タイトルにある通り,Hugoと同様にMarkDownでWikiが書ける。個人向けのWikiとしては快適な使用感。
試しに作った今回のwikiのフォルダ構成は以下の通り。

```
└─wiki
    │  index.html
    │  index.md
    │  navigation.md
    │
    └─pages
            about.md
            AndroidStudioTips.md
            Gimmicks1.md
            intent_bundle.md
```            

トップフォルダのnavigation.mdに各ファイルへのリンクを書いていく形式:

```md:navigation.md
<!--
  -- Navigation
  -- (Read: http://dynalon.github.io/mdwiki/#!quickstart.md#Adding_a_navigation)
  -->

[このWikiについて](pages/about.md)
[IntentとBundleを学ぶ](pages/intent_bundle.md)
[AndroidStudio Tips](pages/AndroidStudioTips.md)
[MDWikiのGimmicks入門](pages/Gimmicks1.md)
```

MDwikiの特徴として,"ギミック"を用いたサイトの装飾がある。例えば,
> [gimmick:yuml (type: 'activity', style: 'plain') ]( `Make Coffee´->`want more coffee´->`drink coffee´ )
と表記すると=> 
![yuml_MDwiki.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/6754f4bd-47b9-361e-6dfa-979f9ce1e858.png)
*(日本語は未対応？)*

##MDwikiのdeploy
Hugoの管理下に入っていれば,Hugoサイトの更新時にMDwikiも更新される。

例えば:

```
c:\Hugo\sites>hugo -t hugo-future-imperfect
..（ 略）..
in 284 ms

c:\Hugo\sites>firebase deploy

=== Deploying to 'scorching-inferno-3735'...

i  deploying hosting
i  preparing public directory for upload...
+  88 files uploaded successfully
..（ 略）..
```
*firebase deployコマンドは差分形式ではなく,すべてのファイルをアップロードしてしまう(いずれなんとかしたい)。*
タイムゾーンを気にしないといけないのは文字と DateTime オブジェクトを変換する時だけ

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/38864/2dc7edd1-a983-f308-cfc1-a6599c10b318.png)

- UTC で保存されている時刻を JST としてパースしてしまった
- SGT で表現されるサーバーの現在時刻を、 JST として管理画面に出力してしまった

これらは全て「表現」と「実体」を変換する際に起こる問題だ。一度「実体」に変換されれば大小比較の際にタイムゾーンを考慮する必要は無く、一度「表現」されてしまえば大小比較をするべきではない（文字の大小と時刻の大小は食い違うことがある）。

「表現」と「実体」の変換ルールは[きめの問題](https://ja.wikipedia.org/wiki/%E3%81%8D%E3%82%81%E3%81%AE%E5%95%8F%E9%A1%8C) なので、悩んでる暇があったらシステムの設計者に問い合わせよう。
atomで置換を使って連番テキストを作る


#

```
<input type="text" name="hoge1" id="hoge1">
<input type="text" name="hoge2" id="hoge2">
<input type="text" name="hoge3" id="hoge3">
```
上のようなHTMLを１０個くらい作りたい時、一個作ってコピーして作る方法が真っ先に思いつく。だが、いちいち数字部分にカーソルを合わせて消去して数字タイプしてっていうのも面倒くさい。そこでAtomによる置換を使って連番テキストを楽に作る方法を考えた。


```
1
2
3
4
5
〜(中略)〜
10
```
上のような数字だけのテキストを用意しておき、ctrl+fで置換パレットを開く。

置換前
```
^(\d\d|\d)
```

置換後
```
<input type="text" name="hoge$1" id="hoge$1">
```
のように数字で置換させたい箇所を$1で置き換える。
これで置換を行えば１０個のinputタグを生成できる。

# 追記
Emmetで連番テキストを作るという上位互換の記事が作られたのでリンク
Emmetを利用して連番テキストを作る
http://qiita.com/from_kyushu/items/34e522fa284fa64a5215
diff3コマンドを利用してGit/SVNを使わずに文書の3ウェイマージを実現する

## はじめに

現在開発しているWebサービスにgitのような特定のリソースを同時編集した際に
自動でマージ・コンフリクトする機能やプルリクエスト的な機能を実装できたらと思い、
いろいろ調べてた結果diff3コマンドというのに出会った。


Wikipediaなんかは[これ](https://ja.wikipedia.org/wiki/Help:%E7%B7%A8%E9%9B%86%E3%81%AE%E7%AB%B6%E5%90%88#.E7.B7.A8.E9.9B.86.E3.81.AE.E7.AB.B6.E5.90.88.E3.83.9A.E3.83.BC.E3.82.B8.E3.81.AE.E3.83.AC.E3.82.A4.E3.82.A2.E3.82.A6.E3.83.88)でマージ機能が実装されてたりするとのこと

Qiitaの編集リクエストなんかもGitかSVNを使ってるものと思ってたけど
もしかしたらこれで実装されてたりするかも？




## やり方

```OLDFILE.txt
こころぴょんぴょん待ち？。
考えるふりして、もうちょっと近づいちゃえ。
簡単には教えないっ。
こんなに好きなことは内緒なの。
```

```MYFILE.txt
こころぴょんぴょん待ち？。
考えるふりして、もうちょっと近づいちゃえ。
簡単には教えないっ。
ほんとは好きなんだと(好きなんだつまり…ななな！)囁く
```


```YOURFILE.txt
こころぴょんぴょん待ち？。
楽しさ求めて、もうちょっとはじけちゃえ(ぴょんぴょんと)。
簡単には教えないっ。
こんなに好きなことは内緒なの。
```

↓以下でマージ実行


```sh:diff3.sh
diff3 -m MYFILE.txt OLDFILE.txt YOURFILE.txt > 結果.txt
```

-mオプションはマージの意
これでOLDFILE.txtからYOURFILE.txtへの変更がMYFILE.txtに統合される


```結果.txt
こころぴょんぴょん待ち？。
楽しさ求めて、もうちょっとはじけちゃえ(ぴょんぴょんと)。
簡単には教えないっ。
ほんとは好きなんだと(好きなんだつまり…ななな！)囁く
```


コンフリクト時はこんな感じ

先ほどのYOURFILE.txtを以下に変更

```YOURFILE.txt
こころぴょんぴょん待ち？。
考えるふりして、もうちょっと近づいちゃえ。
簡単には教えないっ。
こんなに好きなことは。(いいよね夢、恋の夢、好きなんだつまり…ななな！)。内緒なの。
```


```コンフリクト.txt
こころぴょんぴょん待ち？。
考えるふりして、もうちょっと近づいちゃえ。
簡単には教えないっ。
<<<<<<< my.txt
ほんとは好きなんだと(好きなんだつまり…ななな！)囁く||||||| parent.txt
こんなに好きなことは内緒なの。=======
こんなに好きなことは。(いいよね夢、恋の夢、好きなんだつまり…ななな！)。内緒なの。>>>>>>> your.txt
```



その他に良い感じの実装方法やライブラリなどあればコメントにて教えていただけると嬉しいです！


## 参考
[diff3 - ３つのファイルの差異の表示](http://technique.sonots.com/?UNIX%2F%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%2F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E5%87%A6%E7%90%86%2Fdiff3)
Aptana 3.6.1の「新規」→「Railsプロジェクト」が、Workspace内ではなくDocumentにファイルを作りにいく。


Java VMのバージョンを1.6に設定して、何とか無事Aptanaを起動。
「新規」メニューから rails プロジェクトを生成し、無事bundle complete!までたどり着いたので、めでたし、めでたし、と思っていました。

# 現象
プロジェクト生成したら、プロジェクトルートのフォルダ内が空っぽ！
え？確かに成功したのに？

変だなぁと思いつつ、再度生成。
一つ上のWorkspaceに戻り、プロジェクト名に2をつけて
rails new proj2
と入力。
そうしたら何と、

```
Can't initialize a new Rails application within the directory of another, please change to a non-Rails directory first.
Type 'rails' for help.
```

のエラーメッセージが・・・
他のrailsプロジェクト内に、別のプロジェクトを作るな！と？

何が起きているのか、一つずつディレクトリを上にずらして
rails new proj2
を試してみたら、何と、Documentsのフォルダ内にむき出しで
app, bin, db, configなどのrailsのフォルダ群や、Gemfile, Rakefileなどが生成されているではありませんか！

いや、この現象、以前の古いAptanaでも起きたことがあったような気がする。

# 環境
Mac OS El Capitan (Version 10.11.4)
Aptana 3.6.1

# 回避します
この現象とは、戦いません。
もしかしたら、「あぁ、それだったら、AptanaStudio3.iniに何ちゃらを一行追加すれば解決するよぉ。」という情報をどなたかお持ちかも知れませんが・・・
AptanaがWorkspaceを認識していない？
.metadataが壊れた？（んじゃなくて、だいたい、試行錯誤している間に私が壊しちゃった？）
いろいろと考えられますが・・・

ちなみに、この現象は、Scientific Linux/Aptana 3.4では起きません。

bashで、Workspaceを開いて、Workspaceから
rails new proj
でコマンドを叩けば、何の問題もなくプロジェクトを生成できて、それを「新規プロジェクトとしてフォルダをインポート」すれば、Aptanaで編集できるから、この方法で逃げます。
そもそも、プロジェクト生成なんて、滅多に行う操作じゃないし。

# 原因などをご存知でしたら、ご教示ください
「あんた、こういう操作をしただろ、それで.metadataが壊れたんだぞ」
とか、
「それだったら、プロパティにこれを設定しろ」
とか、何かご存知の方がいらっしゃったら、コメントいただけるとありがたいです。
でも、とりあえず、何とかなってますので、大丈夫っちゃ大丈夫です。
モバイルルーター経由で印刷や共有、Pingが飛ばない

モバイルルーター経由で印刷や共有、Pingが飛ばない。

モバイルルーター:EMobile GL04P
パソコン:windowsノート2台
プリンター:Fujitsu レーザー

ルーターのプライバシーセパレーター機能が邪魔をする

http://faq.ymobile.jp/faq/view/105757
arduinoでcast

#概要
arduinoでstatic_cast、reinterpret_cast、dynamic_castやってみた。
#環境
arduino ide ver 1.6.4
arduino uno
#写真
![cast.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/772ce464-050e-cb44-28a5-da74ab078609.jpeg)

#サンプルコード
```
class Kitty {
public:
	int val = 0;
};
class Chobits : public Kitty {
public:
	int val = 1;
} obj ;

void setup()
{
	Serial.begin(115200);
	Serial.println("start");
	double d = 3.141592;
	float f = static_cast<double> (d);
	Serial.print("f => ");
	Serial.println(f);
	int n = static_cast<int> (d);
	Serial.print("n => ");
	Serial.println(n);
	long l = 42;
	short s = static_cast<short> (d);
	Serial.print("s => ");
	Serial.println(s);
	char c = static_cast<char> (d);
	Serial.print("c => ");
	Serial.println(c);
	unsigned int u1 = 137U;
	int n1 = static_cast<int> (u1);
	Serial.print("n1 => ");
	Serial.println(n1);
	int n2 = 139;
	unsigned int u2 = static_cast<unsigned int> (u1);
	Serial.print("u2 => ");
	Serial.println(u2);
	long lval = 200;
	int * i2 = reinterpret_cast<int *> (lval);
	Serial.print("i2 => ");
	Serial.println(* i2);
	Serial.print("obj.val => ");
	Serial.println(obj.val);
	Kitty * po = dynamic_cast<Kitty *> (&obj);
	Serial.print("po->val => ");
	Serial.println(po->val);
	Serial.println("end");
}
void loop()
{
}

```
SQL（SSDT用）のスニペットを作ったときにハマッた話

###visual studioのSSDT（SQL Server Data Tools）で使用するスニペットを作ってみました

![ねた３1.jpg](https://qiita-image-store.s3.amazonaws.com/0/90337/b6acd27e-3425-f947-dade-b6c3d6592fb0.jpeg)

今回作ったのはこれ

```xml:test.snippet
<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
  <Header>
    <Title>テスト</Title>
    <Shortcut>tt</Shortcut>
  </Header>
  <Snippet>
    <Code Language="SQL">
      hogehoge
    </Code>
  </Snippet>
</CodeSnippet>
</CodeSnippets>
```

ツール>コードスニペットマネージャー>インポートから読み込んでみました。

エラーが出ました
>言語の属性がないか、または無効です。

MSのコード スニペット スキーマ リファレンス
https://msdn.microsoft.com/ja-jp/library/ms171418.aspx

通りに言語設定の所はCode Language="SQL"って書いているんだけどなぁ

###もしかして・・・
SSDTの場合は違うのかもしれない
SQL Serverデータツール（SSDT）で使う場合はこうじゃないとだめなことが判明

```xml
<Code Language="SQL_SSDT">
```

読み込まれるようになりました。うーん

##visual stdioのコードスニペットについて作り方や使い方は以下を参考にしました
http://qiita.com/go_astrayer/items/3793cc92d35c3ac0c0c9
Sketchでartboard単位で書き出し

## うまくいかない方法
![Screen Shot 2016-04-16 at 12.18.45 PM.png](https://qiita-image-store.s3.amazonaws.com/0/27895/b37c4139-0999-2cb5-a01f-b3594cfa50e3.png)

このようにA4サイズのアートボードがあるとして左側のアートボードをExportしたいとする。
ただしA4の白紙になっている部分をいくらクリックしてもアートボードを選択することができず、うまくいかない

## うまくいく方法
![Screen Shot 2016-04-16 at 12.21.27 PM.png](https://qiita-image-store.s3.amazonaws.com/0/27895/8182ec90-d1d5-8bb9-9e50-06757ea3356b.png)

左側のレイヤー表示している部分から該当アートボードを選択してExportする。
Subversion tip - 差分を unified 形式の0行オプションで表示

LinuxなどのCUIでsvnコマンドを使うネタです。TortoiseSVNではありません。

`diff -U0` と同じ表示形式にする為のオプションの紹介です。

```
$ svn di --diff-cmd diff -x -U0
```

個人的にはCUIではこの表示形式が一番見易いと思っているので、タイプ量は増えますが愛用してます。
【VBS】Windowsアプリケーションを起動するコードサンプル

VBScriptで、ウィンドウズアプリケーションを起動するサンプルです。

応用して、様々なプログラムを起動できると思いますので、
自動化・効率化に転用してみてください。

```vbnet:VBS
Option Explicit

Const vbHide = 0             'ウィンドウを非表示
Const vbNormalFocus = 1      '通常のウィンドウで、最前面のウィンドウ
Const vbMinimizedFocus = 2   '最小化で、最前面のウィンドウ
Const vbMaximizedFocus = 3   '最大化で、最前面のウィンドウ
Const vbNormalNoFocus = 4    '通常のウィンドウで、最前面ではない
Const vbMinimizedNoFocus = 6 '最小化で、最前面にはならない

Dim objWShell
Set objWShell = CreateObject("WScript.Shell")
objWShell.Run "%windir%\system32\calc.exe", vbNormalFocus, False
WScript.Echo "Windowsの電卓を実行しました！"
Set objWShell = Nothing
```


> objWShell.Run "%windir%\system32\calc.exe", vbNormalFocus, False

この行では動作させるプログラムとオプションを指定しています。

・「"%windir%\system32\calc.exe"」の箇所には起動させたいプログラムを記載します。
　メモ帳を起動する場合は「notepad.exe」にしましょう。

・「vbNormalFocus」の箇所はオプションです。
　用途に合わせて、Constではじまる行のどれかを記載しましょう。
github pages を lektor で作成　その1

# 事前準備

[github pages](https://pages.github.com/)を参考にしながら、新しいレポジトリを作成。

例　今回は kentaro0919.github.io 

```
$ git clone レポジトリ

例　git clone https://github.com/kentaro0919/kentaro0919.github.io
```

でローカルにレポジトリをコピー


# lektor の作業

まずは、ページをビルドする先を新しいレポジトリに指定。

```
$ lektor build --output-path path/kentaro0919.github.io

Started build
U index.html
U about/index.html
U projects/index.html
U blog/index.html
U static/style.css
U blog/first-post/index.html
Finished build in 0.08 sec
Started prune
Finished prune in 0.01 sec
```


リポジトリに移動

```
$ cd path/kentaro0919.github.io
```

作成されていることを確認

```
$　ls
about      blog       index.html projects   static
```

リポジトリに追加

```
$ git add .
```

コミット

```
$ git commit -m "first commit"
```

githubにpush

```
$ git push
```

これだけで公開できちゃいました

[http://kentaro0919.github.io/](http://kentaro0919.github.io/)

内部から公開することもできるようなので、次回は内部からの更新の予定
Mac  | Option + Tab キーで、同じアプリ内のウィンドウを切り替え可能にする

「システム環境設定」で「キーボード」を選ぶ。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/0e4550ef-7c0a-0c7f-ac3c-abc9b6479f3e.png)

「ショートカット」→「次のウィンドウを操作対象にする」を選んで、 `opt + tab` キーを押す。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/e3c76e7f-7ed7-f077-2349-abb91c853337.png)

これでOK。

# 画面例

Google Chrome のウィンドウを切り替えてみる。

もうひとつのウィンドウが後ろにあっても。（全く見えなくても）

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/345d55e7-1667-cdd9-0012-1834a03cbaf8.png)


ショートカットで一発です。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/e37ec081-5197-c28f-e118-4802e9f36a1e.png)


# 補足

- 最初は　`Command + F1` がショートカットに割り当てられている。
- ググったら、他の記事がやや古いOS向けの説明だったり、文章が長かったので。簡単なまとめを書いた。

# 環境

- OS X El Capitan



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Unity5のポストプロセスでxcode code signingの変更を行うサンプル


「Unityのビルドポストプロセス時に、どの署名を使うかXCodeのプロジェクトファイル設定を変更する」
というだけのシンプルなサンプルソースがネット上に転がってなかったので書いてみました。

PBXProjectクラスではフレームワークの追加とかプロジェクトファイルにできることならなんでも出来ますが、そのへんの応用例は他のブログなどを参照していただければ。



```Assets/Editor/PostBuildProcess.cs

using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;

public class PostBuildProcess
{
	[PostProcessBuild]
	public static void OnPostProcessBuild(BuildTarget buildTarget, string path)
	{
		if( buildTarget==BuildTarget.iOS )
		{
			ProcessForiOS( path );
		}
	}

	private static void ProcessForiOS(string path)
	{
		string projPath = PBXProject.GetPBXProjectPath( path );
		PBXProject proj = new PBXProject ();
		proj.ReadFromFile( projPath );

		string target			= proj.TargetGuidByName( PBXProject.GetUnityTargetName() );
		string debugConfig		= proj.BuildConfigByName( target, "Debug" );
		string releaseConfig	= proj.BuildConfigByName( target, "Release" );

		proj.SetBuildPropertyForConfig( debugConfig, "CODE_SIGN_IDENTITY[sdk=iphoneos*]", "iPhone Developer" );
		proj.SetBuildPropertyForConfig( releaseConfig, "CODE_SIGN_IDENTITY[sdk=iphoneos*]", "iPhone Distribution: XXXXXX" );

		proj.WriteToFile( projPath );
	}
}
```
2016/05/19
プロジェクトファイル名などの文字列がマジックワードになっていたのですが、関数で取得できることに気が付いたのでリファクタリングしています。

path + "/Unity-iPhone.xcodeproj/project.pbxproj";
↓
PBXProject.GetPBXProjectPath( path );

proj.BuildConfigByName( target, "Release" );
↓
proj.TargetGuidByName( PBXProject.GetUnityTargetName() );
Puppet4.xではじめるサーバ設定自動化 1（インストール）

Puppet4.xではじめるサーバ設定自動化の、インスール編です。
全体的な目次は、[ここ](http://qiita.com/kijibato/items/ae510dfa91884bdd9f61)を参照してください。

# インストール

Puppet4.xのインストール方法です。
4.xと、旧バージョン系の3.xで、インストール用のコマンドが違います。

大きくわけて、OSが使っているパッケージシステムが、yum(RHEL,CentOS)かapt(Debian, Ubuntu)かと、OSバージョンによってインストールで実行するコマンドが違います。

## yum(RHEL,CentOS)

yumを使うOSの場合です。バージョンごとに最初のrpmが微妙に違います。このrpmをインストールすると、puppet用のインストール資材が使えるようになります。（yumrepoの設定が追加される)

```
puppetlabs-release-<COLLECTION>-<OS ABBREVIATION>-<OS VERSION>.noarch.rpm
```

### CentOS 7 (RHEL 7)
pc1-el-7です。

```
# rpm -Uvh https://yum.puppetlabs.com/puppetlabs-release-pc1-el-7.noarch.rpm
# yum install -y puppet-agent
```

### CentOS 6 (RHEL 6)
pc1-el-6です。

```
# rpm -Uvh https://yum.puppetlabs.com/puppetlabs-release-pc1-el-6.noarch.rpm
# yum install -y puppet-agent
```

## apt(Debian, Ubuntu)

aptを使うOSの場合です。バージョンごとに最初のdebが微妙に違います。このdebをインストールすると、puppet4.x用のインストール資材が使えるようになります。

```
puppetlabs-release-<COLLECTION>-<VERSION CODE NAME>.deb
```

### Ubuntu 14.04.4 LTS

VERSION CODE NAMEは、/etc/lsb-releaseのDISTRIB_CODENAMEなどで確認。

```
# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.4 LTS"
```

pc1-trustyです。

```
# wget https://apt.puppetlabs.com/puppetlabs-release-pc1-trusty.deb
# sudo dpkg -i puppetlabs-release-pc1-trusty.deb
# sudo apt-get update
# sudo apt-get install puppet-agent
```

## その他

### Amazon Linux AMI 2016.03

せっかくなので、AWSの標準的なOSのAmazon Linuxについても調べました。

残念ながら、まだpuppet4.xは通常のリポジトリにはないみたいです。
http://aws.amazon.com/jp/amazon-linux-ami/2016.03-packages/

- puppet3-3.7.4

いちお、gemでpuppet4.xもインストールはできますが、公式には推奨インストール方法でないので、Amazon Linuxでの4.xはまだ使わない方が良いかもしれません。

```
$ ruby -v
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]
$ gem --version
2.0.14.1
$ sudo gem install puppet
省略
$ sudo /usr/local/bin/puppet --version
4.4.1
```

gemでのインストールなので、実行時のパスがpuppet-agentの場合と違います。

# インストール先

puppet-agentをインストールすると、/opt/puppetlabsの配下にいろいろなツールがインストールされます。

主なものです。
puppet本体。

```
# /opt/puppetlabs/bin/puppet --version
4.4.1
```
facterです。サーバの情報を表示、取得する時に使います。

```
# /opt/puppetlabs/bin/facter --version
3.1.5 (commit b5c2cf9b2ac290cb17fcadea19b467a39e17c1fd)
```

Rubyも、OS標準とは別に、puppet用のrubyがインストールされます。

```
# /opt/puppetlabs/puppet/bin/ruby --version
ruby 2.1.8p440 (2015-12-16 revision 53160) [x86_64-linux]
# /opt/puppetlabs/puppet/bin/gem --version
2.2.5
```

つまり、オールインワンでインストールされます。rubyなどは、そのときのpuppet推奨バージョンが入っています。

# 参考

公式サイトのインストール方法紹介

- https://docs.puppet.com/puppet/latest/reference/install_linux.html
Puppet4.xではじめるサーバ設定自動化 0（はじめに）

# Puppet

Puppetは、サーバの構成管理をするためのツールです。
サーバの設定を、自動化できます。

単純な自動化であればシェル実行とかでもよいですが、Puppetを使うとサーバごとに設定ファイルを変えるとか、サーバのIPを取得して設定ファイルに埋めるなど便利なことができます。

参考までに、Puppetの他にも設定を自動化できるツールに、Ansible、Chefがあります。
各ツールでサーバの構成管理ができますが、ツールの背景的な思想が違う印象です。なので、イメージが近いツールを選ぶと良いかと思います。（基本機能のみであれば、そこまで違いを感じないかも？）

- Ansible : サーバを操作する
- Puppet : サーバを管理する
- Chef : サーバを制御する、Rubyで

あと、各ツールのすみわけは、こんな感じです。

- Ansible : 小規模システム、ピンポイントに導入する場合
- Puppet : 大規模システム、がっつり構成管理する場合
- Chef : Rubyで書きたい場合

※意見には個人差があります。

# 4.x

2015年にでたバージョン4.x系でよくなっている部分もありますが、残念なことに4.xの情報が少ない状況です。せっかくなので、まとめていくことにしました。

途中で力尽きなければ、次のような構成になります。

- [Puppet4.xではじめるサーバ設定自動化 1（インストール）](http://qiita.com/kijibato/items/e32c9fb32bb3dde00597)
- [Puppet4.xではじめるサーバ設定自動化 2（実行）](http://qiita.com/kijibato/items/f41bfb632702de3a6015)
- [Puppet4.xではじめるサーバ設定自動化 3（パッケージ管理）](http://qiita.com/kijibato/items/db51e6985ebdad146af5)
- [Puppet4.xではじめるサーバ設定自動化 4（ディレクトリ）](http://qiita.com/kijibato/items/48617bf5674b465ac2d5)
- [Puppet4.xではじめるサーバ設定自動化 5（リンク）](http://qiita.com/kijibato/items/679a805afb35f3e9a371)
- [Puppet4.xではじめるサーバ設定自動化 6（ユーザ・グループ）](http://qiita.com/kijibato/items/a4b0e5788b992ee36c88)
- [Puppet4.xではじめるサーバ設定自動化 7（ファイル変更）](http://qiita.com/kijibato/items/a21ac405cf48e26adc97)
- [Puppet4.xではじめるサーバ設定自動化 8（ファイルの穴埋めERB）](http://qiita.com/kijibato/items/e18f5637c4c22c6eac28)
- [Puppet4.xではじめるサーバ設定自動化 9（サービス管理）](http://qiita.com/kijibato/items/be660e442b47b3254430)
- [Puppet4.xではじめるサーバ設定自動化 10（コマンド実行）](http://qiita.com/kijibato/items/867aec3ec499c3f9f889)
- [Puppet4.xではじめるサーバ設定自動化 11（条件分岐）](http://qiita.com/kijibato/items/68e3d18e7197ce554ddd)
- Puppet4.xではじめるサーバ設定自動化 12（ループ）
- Puppet4.xではじめるサーバ設定自動化 13（サーバ情報を使うfacter）
- Puppet4.xではじめるサーバ設定自動化 14（apply注意点）
- ~~Puppet4.xではじめるサーバ設定自動化 15（AWSで使う）~~ 試せる環境なかった。。。

## リリースノートの抜粋

4以降の変更で、主な内容をまとめていく予定です。（リンクがない項目は、まだです。）

- Puppet 4.0 リリースノート ピックアップ(まだ)
- Puppet 4.1 リリースノート ピックアップ(まだ)
- Puppet 4.2 リリースノート ピックアップ(まだ)
- Puppet 4.3 リリースノート ピックアップ(まだ)
- [Puppet 4.4 リリースノート ピックアップ](http://qiita.com/kijibato/items/df3566296efbacc06cc7)
- [Puppet 4.5 リリースノート ピックアップ](http://qiita.com/kijibato/items/61480583ff5941dfce00)
- [Puppet 4.6 リリースノート ピックアップ](http://qiita.com/kijibato/items/ecbd5c9452b086339cfa)
- [Puppet 4.7 リリースノート ピックアップ](http://qiita.com/kijibato/items/d23bdb39690c5807e489)
- [Puppet 4.8 リリースノート ピックアップ](http://qiita.com/kijibato/items/9bc9a2f6b8375159fc5c)

# 手軽に使う場合

手軽にPuppetを使う場合、スタンドアローン（変更対象サーバに定義を置いて、その定義をそのサーバに反映する）での利用がおすすめなので、とりあえずスタンドアローン前提で書きます。

がっつり構成管理する場合は、エージェント/マスター構成（定義を反映するサーバと、定義が置いてあるサーバが違う）がよいですが、説明が長くなるのでシンプルな内容にしぼります。
[Studio One] デフォルトの保存フォルダを変更する

# Studio Oneのデフォルトの保存フォルダを変更する
gitでバージョン管理をしたいと思った際に初期フォルダがリポジトリ配下にあると嬉しい。
初期フォルダ
[Mac]
~/Documents/Studio One

## 初期フォルダを変更する
[Studio One] -> [環境設定]
![スクリーンショット 2016-04-16 9.39.46.png](https://qiita-image-store.s3.amazonaws.com/0/111261/932c2a66-4711-186e-dcb4-8555d9dfe7e6.png)

[ロケーション] -> [ユーザーデータ] -> [ユーザーデータロケーション]を変更する
![スクリーンショット 2016-04-16 9.41.04.png](https://qiita-image-store.s3.amazonaws.com/0/111261/11b35e83-82cc-8f12-f9a5-3850d31c53cf.png)
[Monaca] Androidのバージョンコードについて

AndroidアプリをGoogle Playに公開する際に、バージョンとバージョンコードが必要となります。
バージョンは、いわゆるアプリのバージョンです。
バージョンコードは、アプリ内部で管理するためのものになります。

Monacaでアプリを開発する際に、このバージョンコードで気をつけなければいけない点があります。

# WebViewとCrosswalk
対象のCordovaバージョンは、5系です。
通常、このバージョンコードは、システム側で自動的に採番されますが、この採番方法がWebViewとCrosswalkでは異なります。

標準のWebViewを使用している場合は、バージョンが「1.22.33」の場合は「122338」となります。
末尾の「8」は、プロジェクトで使用しているSDKバージョン等により付加される数字になります。

次に、Crosswalkです。
上記のWebView版と同じようにバージョンを「1.22.33」にしてビルドしてみます。

| タイプ | バージョンコード |
|:-----|:--------------|
| ARM   | 122332 |
| x86   | 122334 |

ARMの場合は、末尾に「2」
x86の場合は、末尾に「4」

が、付加されます。
このように同じバージョンを設定しても、バージョンコードは、その時の状況により異なった値になります。

WebViewを使用しているアプリをGoogle Playに登録後、バージョンを変更しない状態でWebViewからCrosswalkに変更し、ビルドするとバージョンコードは、小さい値になってしまいます。
この状態でGoogle Playにアプリを更新しようとすると、バージョンコードが低いため、アプリを更新することはできません。
このように、バージョンコードの自動採番を利用している場合は、注意が必要です。

# バージョンコードを手動で設定する
このバージョンコードは、手動で設定することもできます。
Monacaメニューの、

設定 - Androidアプリ設定 - バージョンコードを指定

にチェックをつけることにより、開発者側で管理することができます。
手動で設定したバージョンコードの末尾にもプロジェクトの環境により、上記のような数字が付加されます。

# Cordova4系
Cordova4系でCrosswalkを使用していた場合は、Cordova5系とはバージョンコードの採番方法が異なります。
バージョン「1.22.33」の場合、Cordova4系でCrosswalkを使用していた場合のバージョンコードは、

| タイプ | バージョンコード |
|:-----|:--------------:|
| ARM   | 2000000 + 12233 + 末尾の数字 |
| x86   | 7000000 + 12233 + 末尾の数字 |

となり、Cordova5系よりも大き数字になります。

Cordova4系+Crosswalkを使用したアプリをGoogle Playに公開後に、CrosswalkからWebViewに変更したり、プロジェクトをCordova5系にアップグレードした場合は、状況によってはバージョンコードが低くなってしまします。

Cordova4系の場合は、Monacaメニューの、

設定 - Androidアプリ設定 - バージョンコードを指定

の項目がありませんので、config.xmlファイルのandroid-versionCodeを直接修正する必要があります。

■記入例
```<widget xmlns="http://www.w3.org/ns/widgets" id="com.example.helloworld" version="1.0.0" android-versionCode=“1”>```

通常このバージョンコードの設定は、あまり意識しない部分になります。そのため、気がつきにくい箇所でもありますので、バージョンコードの問題が出た時には、この辺を参考にしてみてください。
技術英語 > Besides, there's no way to [put the genie back in the bottle]. / You cannot undo what you've done.

@ Star Trek Voyager > THRESHOLD

ワープ10の議論の中で Janeway が

> Besides, there's no way to <font color=red>put the genie back in the bottle</font>.

アラジンの魔法のランプ

<hr>
関連して思い出したのは

> You cannot undo what you've done.