OmniAICreator/Qiita-1.07M huggingface dataset:
AppCodeのlogvを少しいじる

AppCodeのLive Templatesにはデフォルトでlogvというテンプレートが付いている。
これは変数をNSLogで出力する時に便利なものだ。

けどこのlogv、文字列を挿入する場合はダブルクオートがエスケープされない。
その為、後からエスケープをする必要がある。
![preview.gif](https://qiita-image-store.s3.amazonaws.com/0/15888/885ee991-b270-292d-a6b6-403a57600eca.gif)

そこでlogvの変数編集画面で、EXPR_COPYのExpressionをEXPRからescapeString(EXPR)に書き換える。
![4817d0a6771e7b754f40455701688bc0.png](https://qiita-image-store.s3.amazonaws.com/0/15888/618a5da1-4198-5fe9-2425-de30df56bd5a.png)

これで自動でエスケープされるようになる。
![fixed.gif](https://qiita-image-store.s3.amazonaws.com/0/15888/87b738bf-2122-a72f-a0fe-a998f1562623.gif)
Ubuntu Desktopをインストールした後軽量化した

LivaPCに[Ubuntu Desktop 日本語 Remix 14.04](https://www.ubuntulinux.jp/download/ja-remix)をインストールした。
LivaPCはiPad用ACアダプタで動作した。

## bootオプション

grubのbootオプション末尾に text を入力しインストールするとcuiで起動した。

# アプリケーションの追加

```bash:
$ sudo apt-get install -y tasksel
$ LANG=C sudo tasksel
```

OSインストール直後: 3.8GB

パターン1
---------

```diff:tasksel
-Print server
-Ubuntu desktop
+OpenSSH server
+DNS server
+LAMP server
+Virtual Machine host
```

taskselで変更後: 2.4GB

パターン2
--------

```diff:tasksel
-Print server
-Ubuntu desktop
+OpenSSH server
+lubuntu minimal installation
```

taskselで変更後: 2.8GB

```bash:手動でアプリ追加削除
$ sudo apt-get install -y \
  w3m curl build-essential nkf vim ranger zsh byobu \
  docker.io monit etckeeper \
  mailutils mutt postfix
$ sudo apt-get purge libpam-smbpass
$ sudo apt-get autoremove -y
$ sudo apt-get clean
```

# その他設定

## etckeeper

```bash:
$ sudo sed -i.org -e 's@VCS="bzr"@#VCS="bzr"@' -e 's@#VCS="git"@VCS="git"@' /etc/etckeeper/etckeeper.conf
$ sudo etckeeper init && sudo etckeeper commit init
```

## grub修正

```diff:/etc/default/grub
-GRUB_CMDLINE_LINUX="text"
+GRUB_CMDLINE_LINUX=""
```

```bash:
$ sudo update-grub2
```

## update

```bash:
$ sudo apt-get update
$ sudo apt-get upgrade -y
```

## byobu

* [Ubuntu - byobuで毎秒スクロールアップする問題対応 - Qiita](http://qiita.com/tukiyo3/items/912cf15454e58e7f3e74)

## editorをvimに設定

```bash:
$ sudo update-alternatives --config editor
```


## docker

```bash:docker
$ sudo usermod -a -G docker `whoami`
$ docker.io pull ubuntu:14.04
```

## lxde自動ログイン

```bash:
$ sudo sed -ie "s@# autologin=dgod@autologin=`whoami`@" /etc/lxdm/default.conf
```

## vino

* [Vino - ArchWiki](https://wiki.archlinux.org/index.php/Vino)
* [Fix VNC Desktop Sharing on Ubuntu Desktop 14.04 - BonusBits](http://www.bonusbits.com/wiki/KB:Fix_VNC_Desktop_Sharing_on_Ubuntu_Desktop_14.04)

```bash:5900ポートで待ち受け
$ export DISPLAY=:0
$ vino-preferences
-> 他のユーザが自分のデスクトップを表示できる
-> 他のユーザがデスクトップを操作できる
-> パスワードの入力を要求する
# TLS無効化。gvncviewerを使えば設定不要
$ gsettings set org.gnome.Vino require-encryption false
$ /usr/lib/vino/vino-server &
```

> gsettings set org.gnome.Vino require-encryption false

これをしないとmacから接続が出来なかった。

```bash:keyringを削除する場合
$ rm $HOME/.local/share/keyrings/Default_keyring.keyring
```

## monitにvinoを登録

```bash:/etc/monit/conf.d/vino
check host vino with address localhost
    start program = "/usr/bin/sudo -u execuser -i DISPLAY=:0 /usr/lib/vino/vino-server"
    stop  program = "/usr/bin/killall vino-server"
    if failed host localhost port 5900 then restart
    if 5 restarts within 5 cycles then timeout
```

## ホームディレクトリを英語にする

```bash:
LANG=C xdg-user-dirs-gtk-update
```

# Lubuntu 14.04.2 を入れた時のメモ

* 普通にインストールできた。
Xamarinで使えるManagedなオープンソース地図エンジン：OsmSharp

過去に2回ほどに分けて、Xamarinでクロスプラットフォームで使えそうな（使えるようになりそうな）オープンソース地図エンジンについて紹介してきましたが（[第1回](http://qiita.com/kochizufan/items/5c8734c036379eca2c47)、[第2回](http://qiita.com/kochizufan/items/6d5e7cdc668376d275d6)）、第2回で紹介した[OsmSharp](https://github.com/OsmSharp/OsmSharp)が格段に開発が進んで、もう実案件投入できるんじゃね？というくらいになってきました。

[実ライブラリレポジトリ](https://github.com/OsmSharp/OsmSharp)だけでなく、[サンプルのレポジトリ](https://github.com/OsmSharp/OsmSharp.Samples)もできて、メインのベクタ地図表示だけでなく以前は判りにくかったラスタタイルの表示サンプルもiOS/Android双方に用意され、非常にいい感じになっています。

![OsmSharpのiOSタイル表示サンプル](https://qiita-image-store.s3.amazonaws.com/0/10108/b29fb5c4-f295-3441-6d12-d96a61fa9a3e.png)

![OsmSharpのAndroidタイル表示サンプル](https://qiita-image-store.s3.amazonaws.com/0/10108/d83f5ec4-2047-7619-ff5f-1ee45b791672.png)

サンプルを表示させるとこんな感じです（実際のサンプルは、デフォルトでマルチタッチ回転がオフになってるので、オンに変えて実行しています）。
びっくりするほどぬるぬる動くとか、そこまでではないですが、マルチプラットフォームで開発できるオープンソース、というメリットと天秤にかければ、十分採用を検討できる域に達しています。

もちろん、ちょっと触ってみるだけでもまだまだ課題はあって、

* タイルの隙間に少し白い線が入ってしまう時がある。座標計算で丸め誤差が出てる感じ。
* iOS版で、最初の画面表示に、何か操作しないと地図が表示されない事がある。
少しでもタッチしてやるか、全く動かなくてもいいのでViewDidLoad或いはAddSubView後に座標指定してやると、再描画される。
* 描画エンジン（プラットフォーム間共通）とUIライブラリ（各プラットフォーム別）が別の構成だが、UI側がまだ試行錯誤の段階のよう。
プラットフォーム毎に実装度に大分差がある感じ。
例えば、iOSだとダブルタップしてやると全世界からでも一気に最大ズームに飛んでしまうデフォルトズームイン動作（バグ？）があるので、それを抑制してやらないといけない状況だが、Androidだとダブルタップを取るイベントがそもそもまだなくて、シングルタップからダブルタップ検知を開発者側が組んでやらないといけない状況。
* マーカーのアンカーに指定できる場所が限られている。

等、直して欲しい所はたくさんあるのだけれど、育てば十分Xamarin界の標準地図エンジン化できるポテンシャルはあると思える。
何といっても、Managedだし。

一つ前の記事で書いたNetTopologySuiteもそうだし、このOsmSharpもそうだけど、なんかすごい勢いで開発が進んでて、状況が変化してる。
どっかから金がついてて、加速させてるんじゃないかと思うくらい。
別にMicrosoftから金が出てるんじゃないかと思うわけじゃないけど、例えばだけど、

* 完全にManagedでレスポンスも機能も十分な地図エンジンが、OsmSharpでもMSが開発してもいいけど完成して
* それの上に乗る地図が、OSMでもいいし、或いは商用用途ならばBingやNokiaも決して悪い地図ではないので提供されて
* それがXamarin、.NETの上だと、iOS/Android/Windowsまで視野に入れて完全にマルチプラットフォーム開発できる

という状況になると、少なくとも地図モバイルアプリ開発に関しては、流れが変わってくるんじゃないかなという感じがする。
まあ、妄想ですが。
【Active Decorator】ある変数が存在した時にのみ、前後に修飾語を付けたい時

たとえば、年、月、日を変数として持っており

西暦2014年5月1日

や

5月1日

西暦2014年5月

のように各々の変数の有無で、表示する内容を変更したい時があったとします。

ActiveDecorator内で下記のようなメソッドを定義します。

```rb
module ProductDecorator
  def before_after(value, before, after, condition, not_adapted)
    if condition.call
      return before + value.to_s + after
    else
      return not_adapted
    end
  end
end
```

```rb
  sprintf("%s %s %s", before_after(year, "西暦", "年", lambda{year.present?}, ""), before_after(month, "", "月", lambda{month.present?}, ""), before_after(year, "", "日", lambda{day.present?}, ""))
```

とやれば、欲しいものが出てきます。before_afterの引数の中身は左から(対象変数、前につける修飾子、後につける修飾子、修飾子を付けたい時の対象変数の条件式、条件式が偽の時の文字列)

業務アプリケーションを作ってる時にはよく出てくるので、まとめてみました。

ちなみに条件式を変えれば、変数の有無だけでない処理が可能です。

なんか他にいい方法がありそうですが、、、
達人の皆様教えてください。
UITableViewCellのaccessoryView以外を無効にする方法

例えばUITableViewCellのaccessoryViewにUISwitchを付けたとします。

```objc
UISwitch* sw = [UISwitch new];
sw.on = b;
[sw addTarget:self action:@selector(changeSwitch:) forControlEvents:UIControlEventValueChanged];
cell.accessoryView = sw;
```

```objc
//スイッチおした時
- (void)changeSwitch:(UISwitch*)sender{
NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell*)[[(UISwitch*)sender superview] superview]];
[self tableView:self.tableView didSelectRowAtIndexPath:indexPath];
}
```

さて、このような実装をすると何の問題があるかというと、テーブルのセルをタップしてもdidSelectRowAtIndexPath:は呼ばれるため、UISwitchがオフになっているのに内容はオンになったりして整合性が取れなくなります。
そのためUISwitchだけを反応するようにする必要があります。

ここでセルにuserinteractionプロパティを使うのはハズレです。
userinterctionはsubviewにも反映されるのでUISwitchもろとも動かなくなります。

hitTest:を使うのもハズレです。

ではどうするかというと、

```objc
-(NSIndexPath*)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
```
を利用します。

```objc
-(NSIndexPath*)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell*cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    if ([[cell.accessoryView class] isSubclassOfClass:[UISwitch class]]) {
        return nil;
    }
    return indexPath;
}
```

このように実装すればタップ後のdidselectは呼ばれず、UISwitchからの直接呼び出しのみが有効になります。
Webserviceメソッドのリクエスト生データを見る

# 概要
Webserviceが受け付けたxmlデータを見たい場合、
以下の処理ができれば良かったが、結構な時間をかけてしまったので、
同じ事で戸惑わないように、
ここに自分が対処した方法を載せときます。

# コード
```vbnet:service.asmx
<WebMethod> _
Public Function myFunc( ByVal myArg As String) As myResponse()

    Try
        Dim req As HttpRequest = Context.Request
        Dim sr As System.IO.Stream

        sr = Context.Request.InputStream
        Dim strLen As Integer = CInt(sr.Length)
        Dim strArr(strLen) As Byte
        '受け取ったStreamの読取位置が最後尾にきているらしく、
        '↓が抜けるとデータが取得できない
        sr.Position = 0                 

        Dim strRead As Integer = sr.Read(strArr, 0, strLen)
        Debug.Print("リクエスト内容 ： " & System.Text.Encoding.UTF8.GetString(strArr))
```
}}}
CSS の pointer-events プロパティでマウスイベントを制御する

Twitter Bootstrap の `.btn` に `.disabled` をつけると、click イベントが発生してないことに今さら気がついて、なんでだろうと思ってコードをみてみたら、こういう指定があった。

```css
.btn.disabled,
.btn[disabled],
fieldset[disabled] .btn {
  pointer-events: none; /* これなに */
  cursor: not-allowed;
  filter: alpha(opacity=65);
  -webkit-box-shadow: none;
          box-shadow: none;
  opacity: .65;
}
```

`pointer-events` はデフォルト値 `auto` 、
これを `none` とすると、マウスイベントを拾わなくなるらしいです。

モダンブラウザではサポートされてるけど、IE は11から。

SVG のイベント制御もできるようなんですが、こちらはきちんと読んでないです。

## パフォーマンスチューニングにも使えるらしい(らしい)

こういう使い方もあるのかー

[60fps scrolling using pointer-events: none | The CSS Ninja - All things CSS, JavaScript &amp; HTML](http://www.thecssninja.com/javascript/pointer-events-60fps "60fps scrolling using pointer-events: none | The CSS Ninja - All things CSS, JavaScript &amp; HTML")

## ref.

* [pointer-events - CSS | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/pointer-events)
* [Can I use... Support tables for HTML5, CSS3, etc](http://caniuse.com/#feat=pointer-events)
* [JavaScript - pointer-events: none;で60fpsをキープしたままスクロール - Qiita]( http://qiita.com/FiNGAHOLiC/items/684b2d6dd51ade60cd83)
【cocos2d-x】プロジェクトを作成する


##流れ
1,cocos2d-xをダウンロードして解凍
2,コマンドでプロジェクトを作成する
3,作成したプロジェクトを起動

##1,cocos2d-x v2.2.3をダウンロード
①以下リンクよりダウンロード。
→http://www.cocos2d-x.org/download

②ダウンロードした圧縮フォルダを解凍

##2, コマンドでプロジェクトを作成する

```
//project-creator下に移動
$ cd /cocos2d-x-2.2.3/tools/project-creator/

//プロジェクトを作成 ※大文字の部分を適宜変更して下さい
./create_project.py -project YOUR_PROJECT_NAME -package COM.HOGE -language cpp
```
##3,作成したプロジェクトを起動する

```
//以下パスにプロジェクトフォルダが作成される
/cocos2d-x-2.2.3/projects/

//iosのxcodeproj位置
/cocos2d-x-2.2.3/projects/YOUR_PROJECT_NAME/proj.ios/

```



##※初回起動時にWorkspace Integrityのエラーが出た際
Xcodeを一回閉じて、再度開くとエラーがなくなります。
参考：http://d.hatena.ne.jp/shinriyo/20130819/p1
ubuntuにeclipse lunaのインストール

まずjdkをインストール

```
  sudo add-apt-repository ppa:webupd8team/java
  sudo apt-get update
  sudo apt-get install oracle-java8-installer
```

http://www.eclipse.org/　
からeclipseをダウンロードしてきます。

```
 sudo mkdir /usr/local/eclipse
```

eclipseのフォルダ作成


eclipseのインストール
```
 cd /usr/local
 sudo tar xvfz /home/user/download/eclipse-jee-luna-M7-linux-gtk-x86_64.tar.gz
```    
pleiadesのインストール

```
 cd /usr/local/eclipse
 sudo unzip /home/user/download/pleiades_1.4.0.zip
```

eclispse.iniを編集して終了

```
-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20140415-2008.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.200.v20140427-1923
-product
org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vm
-/usr/lib/jvm/java-8-oracle/bin/java
-vmargs
-Dosgi.requiredJavaVersion=1.8
-XX:MaxPermSize=256m
-Xms128m
-Xmx1g
-javaagent:/usr/local/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
```
LabVIEWの組込み関数を関数パレットに登録する

#はじめに
LabVIEWの関数パレットの編集画面では通常、ファイルパスを持ったVI,ライブラリ,別の関数パレット等を登録するようになっており、ファイルパスを持たない組込み関数の登録は出来ません。
が、色々と試してみたところ、組込み関数の登録方法が分かったので紹介します。

#空のパレットを用意する
LabVIEWにもともと用意されれているパレットファイルを直接弄っても出来ますが、何かあっても面倒なので新規にパレットファイルを用意します。

![パレットの編集1.png](https://qiita-image-store.s3.amazonaws.com/0/36514/9cfa48d4-d104-b9ed-2f6d-d95fc35780d7.png)
![パレットの編集2.png](https://qiita-image-store.s3.amazonaws.com/0/36514/a08e7dd7-6353-c77f-446f-67d0de434794.png)
![新規パレット.png](https://qiita-image-store.s3.amazonaws.com/0/36514/cfaa9d46-470e-289a-ae7a-c2e71ced4428.png)
![既存または新規.mnuファイルを選択.png](https://qiita-image-store.s3.amazonaws.com/0/36514/c00ac431-d341-92b9-5ca4-1cbda6b343cf.png)
![2014-05-20 22_53_28-制御器および関数パレットセットを編集.png](https://qiita-image-store.s3.amazonaws.com/0/36514/af5dc51f-a386-35ae-5ac4-364db5f35456.png)

"変更を保存"するとパレットファイルも保存されます。
ファイルパスが表示されるのでコピーしておきます。

#パレットに組込み関数を登録

下のVIスニペットでパレットファイルのパスを指定してから実行すると、指定したパレットファイルに組込み関数が追加されます。

[alucky4416](http://qiita.com/alucky4416)さんの[LabVIEW SJIS <-> UTF-8 文字コード変換](http://qiita.com/alucky4416/items/64d4557d74b730c36e40)の記事で紹介されていた
通常ではパレットに登録されていないUTF-8文字列変換の関数を登録してみました。

![パレットに組込み関数を登録する.png](https://qiita-image-store.s3.amazonaws.com/0/36514/66e8304e-5ee2-896d-bc51-8b7fc00a5808.png)

![登録されたパレット.png](https://qiita-image-store.s3.amazonaws.com/0/36514/8ec11914-2449-49de-68dc-30af00da4a4b.png)

関数パレットに登録されることで、クイックドロップからも呼び出せるようになります。
![2014-05-21 00_24_22-クイックドロップ.png](https://qiita-image-store.s3.amazonaws.com/0/36514/fbd5517f-ccbc-a337-5797-1ed7f510e0bb.png)

#参考
組込み関数が登録されているパレットのitems配列要素のitem pathを調べるとこのようになります。
サブVIとして登録されている関数はItemPathにはVIのパスが入りますが、組込み関数の場合は関数の内部名？が入ります。
詳しく調べていませんが下記のような形で命名されているようです。(?の部分は単にオブジェクトのクラスによって違う？)

BUILT_IN_FUNC_スタイルのリング定数の値_?_?_VIオブジェクトクラス名

![パレットに登録されているパスを調べる.png](https://qiita-image-store.s3.amazonaws.com/0/36514/36ae86f4-2ea7-840b-ad24-be25b08f9959.png)

![2014-05-21 00_09_22-名称未設定 3 フロントパネル 「名称未設定プロジェクト 1_マイ コンピュータ」 _.png](https://qiita-image-store.s3.amazonaws.com/0/36514/398b606d-e460-5eae-d19f-6e2da7e23100.png)
USBデバイスをつくってみたい(3) LEDとブザーがついたデバイス完成編


https://vine.co/v/MHwL5a1YaH3


![vine](http://giant.gfycat.com/SlipperyNeighboringAnnashummingbird.gif)


ここまでのあらすじ
---------------
* USBキーボードやマウスの仲間のHIDクラスという仕様のデバイスが作れるようになった
* Mac側のドライバ/ソフトウエアはRubyで書けることがわかった



bootloader
----------
mega328Pにして容量に余裕ができたのでブートローダを入れておくことにした。http://rayshobby.net/?p=7363 の中に入っていたbootloaderの元ネタの https://github.com/baerwolf/USBaspLoader

mega328Pの設定＆ハードに合わせて調整。
https://github.com/takeru/USBaspLoader/commit/ef1ae4d1ad4cd44cba23328d18cc02d54c1fe74b

D6をプルダウンしたままリセットすると"USBasp"として振る舞うブートローダが起動する。この状態で本体部分への書き込みができる。書き込みはArduinoIDEから"USBasp"を選べばスケッチを書き込めるし、

```
avrdude -C /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/etc/avrdude.conf -c usbasp -p m328p -U flash:w:hidled.hex
```

とすればコマンドラインからavrdudeでも書き込める。
書き込んだらプルアップを外してリセットし直すと、書き込んたソフトウエアが動く。

これでちょこちょことfirmwareを改善していくのが楽になる。書き込み機(Arduinoを使っていた)がいらないので机がスッキリする。



ハードウエア
----------

面倒なのでブレッドボードに組み込んで完成！

- mega328p
- 20MHz 22pF*2
- 100Ω*2,1KΩ*1
- 抵抗入りLED*5
- トグルスイッチ*2
- 圧電ブザー
- 0.1uF
- 配線


![hidled.jpg](https://qiita-image-store.s3.amazonaws.com/0/16626/27ffcacb-3463-3a55-d2f7-d3a8c0638e6b.jpeg "hidled.jpg")

使いながらバージョンアップしていこう。


ソフトウエア
----------

https://github.com/takeru/hidled


```
% ruby hidled_host.rb
usage:
  ruby hidled_host.rb -r
  ruby hidled_host.rb -s 1,0,1,0,0,0,0,0
```
コマンドラインから8byteを読み書きしてLEDのON/OFFを切り替えます。



まとめ
-----
* 自作USBデバイスをつくるのは思っているより簡単だ
* ブレッドボードのやり直しが出来る安心感はすばらしい
* Arduinoやその他の何かの再発明なきもするが気にしない
 * 全部入りの完成品をゴールだとすれば面白いのではないか
 * Arduino手に入れてもそこまで行けない人はいっぱいいる


TODO
----
* ピンもメモリも余裕ありまくりなので全部入りのやつをつくる
 * 温度センサ
 * 明るさセンサー
 * 赤外線LED
 * 赤外線受信モジュール
 * コンデンサマイク
* Windows / Linux
カーネル初期化処理のグラフ


do_initcall関数はドライバなどの初期化関数を呼び出します。
`initcall_debug`という起動パラメータを与えると、これらの初期化関数呼び出しの情報をdmesgに出力されるようになります。

この呼び出しの情報をbootgrapghというスクリプトを用いてグラフ化します。

## 準備
対象となるカーネルにおいて`CONFIG_KALLSYMS`と`CONFIG_PRINTK_TIME`が有効になっている必要があります。

## 初期化情報の取得
`initcall_debug`を起動パラメータに与えて起動します。

起動完了後にdmesgを確認すると以下のように初期化関数(initcall)の情報が出力されているはずです。

```dmesg抜粋
[    0.003582] initcall init_static_idmap+0x0/0xe0 returned 0 after 0 usecs
[    0.003610] calling  spawn_ksoftirqd+0x0/0x1c @ 1
[    0.003814] initcall spawn_ksoftirqd+0x0/0x1c returned 0 after 0 usecs
[    0.003844] calling  init_workqueues+0x0/0x270 @ 1
[    0.004475] initcall init_workqueues+0x0/0x270 returned 0 after 0 usecs
[    0.004506] calling  check_cpu_stall_init+0x0/0x20 @ 1
[    0.004530] initcall check_cpu_stall_init+0x0/0x20 returned 0 after 0 usecs
[    0.004556] calling  rcu_scheduler_really_started+0x0/0x18 @ 1
[    0.004578] initcall rcu_scheduler_really_started+0x0/0x18 returned 0 after 0 usecs
```

## グラフの作成

グラフの生成はカーネルのソースに含まれるscripts/bootgraph.plを使用します。

対象マシン上にbootgraph.plが無い場合はdmesgの内容を保存します。

```console
$ dmesg > boot.log
```

bootgraph.plが有る環境にて以下のようにsvg画像を出力します。

```console
$ scripts/bootgraph.pl boot.log > boot.svg
``` 

対象マシン上にbootgraph.plが有る場合は以下のようにワンライナーでOKです。

```console
$ dmesg | scripts/bootgraph.pl > boot.svg
```

## 作成されたグラフ
画像の向きは変えました。
※処理時間の短いものは文字が潰れていますが、svg画像ではちゃんと見れます。

![boot.png](https://qiita-image-store.s3.amazonaws.com/0/13343/0adad04c-0ddc-56f8-3bdc-92c844c59193.png "boot.png")
10分で完了！Wordpressのデータベースをバックアップして新しい環境に移行する方法


愛用のMacbook死んでWPのデータ移行を行ったため、ついでにその手順をまとめました。
phpMyAdminなんて入れてないよ！って人のための移行手順です。

##元記事
下記エントリの転載になります。
[10分で完了！WordPressのデータベースをバックアップして新しい環境に移行する方法 - rokuro Fire](http://www.rokurofire.info/2014/05/21/backup_wpdb/)

##プラグイン「WP-DBManager」でバックアップ

#####エラーメッセージの対応

プラグインをインストールしたら、画面上部にメッセージが出ます。

![image1.jpg](https://qiita-image-store.s3.amazonaws.com/0/10172/b2cb6d4b-99ac-94a8-fe46-61934eff4314.jpeg "image1.jpg")

メッセージに沿って、作業を進めます。

```cmd
# backup-db ディレクトリの作成
# このディレクトリにWPが書き込める権限を付けておく
$ cd {WPのパス}/wordpress/wp-content/
$ mkdir backup-db

# .htaccessファイルの作成
# プラグインディレクトリ内にある htaccess.txtをコピーする
$ cp plugins/wp-dbmanager/htaccess.txt backup-db/.htaccess
```

#####「DB Options」タブ

![image2.jpg](https://qiita-image-store.s3.amazonaws.com/0/10172/85137c0e-f7ff-435a-18c5-2819c8996c52.jpeg "image2.jpg")

下記3つがちゃんと設定されているかを確認します。

* Path To mysqldump
* Path To mysql
* Path To Backup

私のAWS環境だと「Path To mysqldump」、「Path To mysql」が空欄になっていました。下記コマンドの出力結果を入力します。

```cmd
$ which mysql
/usr/bin/mysql

$ which mysqldump
/usr/bin/mysqldump
```

#####「Backup DB」タブ

設定内容を確認し「Backup」を押せば完了です。

![image3.jpg](https://qiita-image-store.s3.amazonaws.com/0/10172/6c0b6cef-060e-bfc2-2e9c-0d94bea2f899.jpeg "image3.jpg")

先ほど作ったbackup-dbディレクトリに、1400542358_-_{DB名}.sql のようなファイルが作成されているはずです。

##新しい環境にDBを移す

先ほど作成した.sqlファイルを移動させ、下記コマンドを打てば完了です。

```mysql
#データベースの作成
mysql> create database {DB名} default character set utf8;

#mysqlを終了してから下記コマンド
$ mysql -u {username} -p {DB名} < 1400542358_-_{DB名}.sql

```

慣れれば5分くらいで完了します。
phpMyAdminを普段使わない方はこの方法だととても早いです。
例外をチェインした際に以前の例外を取得する

例外が発生した際に、`rescue` 句 や `ensure` 句で新しい例外を発生させる場合があります。

```rb
begin
  raise "Error A"
rescue
  raise "Error B"
end
```

呼び出し元によりわかりやすいエラーメッセージを伝えるために、
独自の例外を作って投げ直したりする場合です。
具体的には以下の様なコードです。

```rb
class OreOreError < StandardError; end

def divide_by_zero(num)
  num / 0
end

def calculate(num)
  divide_by_zero(num) # raise ZeroDivisionError
rescue => e
  raise OreOreError.new("#{e.class} が「#{e.message}」って言ってるわ！")
end

begin
  calculate(100)
rescue => e
  p e #=> #<OreOreError: ZeroDivisionError が「divided by 0」って言ってるわ！>
end
```

ただこの場合、問題があります。
以前に発生した例外 (上記のコードの場合は ZeroDivisionError) の情報が消えてしまうということです。
例えば、もとの例外の `Exception#backtrace` が分からなくなるため、
デバッグに支障をきたすこともあるでしょう。

しかし、ここで朗報です！
Ruby 2.1 で追加された `Exception#cause` を使えば、以前に発生した例外もたどれるようになりました。

```rb
begin
  calculate(100)
rescue => e
  puts "現在のエラー:  #{e.inspect}"
  puts "1つ前のエラー: #{e.cause.inspect}"
end

# 現在のエラー:  #<OreOreError: ZeroDivisionError が「divided by 0」って言ってるわ！>
# 1つ前のエラー: #<ZeroDivisionError: divided by 0>
```

全ての例外をたどって backtrace を出せるようにしてみたり。

```rb
class Exception
  def full_backtrace
    return [self.inspect] + backtrace unless cause

    [self.inspect] + backtrace + cause.full_backtrace
  end
end

puts e.full_backtrace * "\n"

# #<OreOreError: ZeroDivisionError が「divided by 0」って言ってるわ！>
# oreore.rb:22:in `rescue in calculate'
# oreore:19:in `calculate'
# oreore:26:in `<main>'
# #<ZeroDivisionError: divided by 0>
# oreore.rb:15:in `/'
# oreore.rb:15:in `divide_by_zero'
# oreore.rb:19:in `calculate'
# oreore.rb:26:in `<main>'
```

### Ruby 2.0 以前の場合

Ruby 2.0 以前の場合は `Exception#cause` が使えないため、少し工夫が必要です。
例外オブジェクトのインスタンス変数に、以前の例外を持たせるようにします。
`$!` は Ruby の組み込み変数 (Kernel の特殊変数) の1つで、
最後に例外が発生したときの Exception オブジェクトを持っています。

```rb
class OreOreError < StandardError
  attr_reader :previous # Exception#cause の代わり

  def initialize(msg)
    super(msg)
    @previous = $!
  end
end

def divide_by_zero(num)
  num / 0
end

def calculate(num)
  divide_by_zero(num) # raise ZeroDivisionError
rescue => e
  raise OreOreError.new("#{e.class} が「#{e.message}」って言ってるわ！")
end

begin
  calculate(100)
rescue => e
  puts "現在のエラー:  #{e.inspect}"
  puts "1つ前のエラー: #{e.previous.inspect}"
end

# 現在のエラー:  #<OreOreError: ZeroDivisionError が「divided by 0」って言ってるわ！>
# 1つ前のエラー: #<ZeroDivisionError: divided by 0>
```

### 参考

* [instance method Exception#cause](http://docs.ruby-lang.org/ja/2.1.0/method/Exception/i/cause.html)
* [variable $!](http://docs.ruby-lang.org/ja/2.1.0/method/Kernel/v/=21.html)
* [Ruby – Why U No Have Nested Exceptions?](http://www.skorks.com/2013/04/ruby-why-u-no-have-nested-exceptions/)
Core Motionで歩数計

CMStepCounterを試してみたのでメモ。
ソースコードは[GitHub](https://github.com/yaslab/CMStepCounterDemo)においてあります。キモとなるクラスはStepCounter.m/.hです。

##はじめに

iPhone 5sは、ユーザーの歩数データを蓄えていて、[Core Motion](https://developer.apple.com/library/ios/documentation/coremotion/reference/coremotion_reference/_index.html)の[CMStepCounter](https://developer.apple.com/library/ios/documentation/coremotion/reference/CMStepCounter_class/Reference/Reference.html#//apple_ref/doc/uid/TP40013504)クラスから歩数情報にアクセスすることができます。

##CMStepCounter

CMStepCounterには、おおまかに分けて以下の2つの機能があります。

1. ユーザーの移動を監視し、移動した時にイベントを発生する
1. iPhoneに蓄積されている過去の歩数データを取得する

##使い方

機能を使う前に、端末が対応しているかどうかを確認しましょう。

```objc
if ([CMStepCounter isStepCountingAvailable]) {
    // 歩数計に対応している
}
else {
    // 歩数計に未対応
}
```

ユーザーが移動した時にイベントが発生するようにするには、監視を開始するメソッドを呼び出します。

```objc
// インスタンスを生成
CMStepCounter *stepCounter = [CMStepCounter new];
// 移動の監視を開始する
[stepCounter startStepCountingUpdatesToQueue:[NSOperationQueue mainQueue] updateOn:1 withHandler:^(NSInteger numberOfSteps, NSDate *timestamp, NSError *error) {
    // 移動した時にこのブロックが呼ばれる
    NSLog(@"累計歩数: %d", (int)numberOfSteps);
}];
```

また、イベントが不要になったら監視を停止するメソッドを呼び出します。

```objc
// 移動の監視を停止する
[stepCounter stopStepCountingUpdates];
```

使い方は、ストップウォッチのような感じで、start〜を呼ぶと歩数カウントが開始され、移動する度にブロックのnumberOfSteps変数に歩数が通知されます。
ただ、アプリを終了してしまうとカウント中の歩数が失われてしまうので注意が必要です。
iPhoneに歩数データが蓄えられているので、直接問い合わせることもできます。

```objc
NSDate *start = ...; // 保存しておいた開始日時
NSDate *end = [NSDate new]; // 現在日時
[stepCounter queryStepCountStartingFrom:start to:end toQueue:[NSOperationQueue mainQueue] withHandler:^(NSInteger numberOfSteps, NSError *error) {
    // 歩数を取得したときにこのブロックが呼ばれる
    NSLog(@"指定期間の歩数: %d", (int)numberOfSteps);
}];
```

蓄えられている歩数データは1週間分で、1週間より前のデータはなくなってしまいます。
必要であれば取得したデータをアプリ側で保存しておくとよいでしょう。

CMStepCounterの使い方は以上です。これを使えば歩数計アプリが簡単に作れますね！
JJUG CCC 2014 Spring で喋ってきた

[JJUG CCC 2014 Spring](http://www.java-users.jp/?page_id=965) で Java を使った SPA の開発事例について喋ってきました。発表資料はこちら。

* [Modern Java Web / SPA Development](https://speakerdeck.com/monzou/spa-development)

セッションに参加して頂いた方々、本当にありがとうございました。

今回は事例紹介ということで、最初からある程度網羅的に話そうと思っていました。GW 過ぎぐらいまで仕事が猛烈に忙しく、なかなか資料を準備する時間が無かったのですが、週末にどうにか資料を作ってみたら盛り過ぎた感は否めず、結局スライドは飛ばし気味に口頭でひたすら喋る感じにしてみました。あまり緊張しない方なので個人的には大変楽しくお話させて頂いたのですが、スピードも早く内容も多かった上に、部屋が非常に広かったので後方に座られていた方は見づらかった思います。資料は事前にアップロードしておくべきでしたね……。発表後は様々な方に「面白かった」などと言って頂けてとても嬉しかったです。

## 発表内容について

今回 SPA 開発事例ということで発表させて頂いたんですが、そもそも発表しようと思った理由も幾つかあって、そのひとつは「Java に対する悪印象をもう少し軽減したい」ということでした。海外だと Web 系のスタートアップなんかでも Java を使っているところは多いのに、日本では Java と言うだけで DIS られる傾向にあるのが悲しいなと常々思っていて、少しでも面白い事例紹介が出来ればなぁと思ったのでした。「Java はつまらない」といった意見も良く聞きますが、個人的には別に Java を使っていてつまらないと感じることは少なく、言語的な冗長さはあるかもしれませんが、決して嫌いな言語ではありません。エンジニアとしては言語の機能のような表面的なことにこだわるよりも、「何を作るか」「どのように作るか」をしっかり考え、少なくとも自分にとって理想的だと思えるプロダクトを作ることの方がよほど本質的なことなので、「Java だから」と言って敬遠されてしまうのはやっぱり悲しいものです。使っている言語ではなく、それを使って何をしたかが大事ですし、もっと Java を使った事例紹介を増やしていけば多少は印象を改善していけるのではないかなと思いました。ですのでセッションでは（Java を土台としつつ）技術的な話だけでなく、例えばモデリングに対する考え方であったり、アーキテクチャの考え方なども幅広く喋ってみたつもりです。勿論、技術面でも聞いて頂いた皆さんに興味を持ってもらえるような内容を喋ったつもりですので、聞いて頂いた方に少しでも伝わるものがあったら嬉しいですし、感想を頂けると大変ありがたいです。

## JJUG CCC の感想

カンファレンス自体の感想ですが、驚いたのが若い方と女性が非常に多かったことです。これは正直びっくりしました。高齢化が叫ばれて久しい Java ですが（笑）、これほど若い方や女性が沢山参加されているというのはやはり JJUG の皆さんの活動の成果なのかなと感じました。セッション内容も言語の話やコアな技術ネタのほか、Scala や私のような事例紹介までバラエティ豊かで、個人的には「聞いてみたい」と思えるセッションが多いイベントでした。今回は懇親会まで参加させて頂いたのですが、色々な方とお話することが出来て大変楽しかったです。

---

木曜日は Java Day Tokyo にも参加するつもりなので、またお会いする機会があったら皆さん是非お声がけ下さい。
GitLabをrpmでインストール

GitのツールといえばGithubですが、最近ちらほらとGitLabについても良く耳にするようになってきました。今回試験的にGitLabを導入するにあたり、以下にそのインストール方法を書いていきます。


#環境など#
* CentOS 6.4
* GitLab-rpm 6.8.2

#GitLabのインストール#
##RPMの取得##
はじめにGitLabのインストールに必要なRPMのダウンロードURLを、[こちら](https://www.gitlab.com/downloads/)からコピーし、curlでもってきます。

※記事を書いた当時の最新版で進めます

```
~ curl -o gitlab-6.8.2_omnibus-1.el6.x86_64.rpm https://downloads-packages.s3.amazonaws.com/centos-6.5/gitlab-6.8.2_omnibus-1.el6.x86_64.rpm
```

##関連パッケージのインストール##
以下のコマンドを実行し、関連パッケージをインストールします。

```
~ yum install openssh-server
~ yum install postfix
```

これで関連パッケージのインストールが完了しました。

##GitLabインストール##
GitLabを以下のコマンドでインストールします。
chef等で諸々の設定を行うため時間がかかります。
※指定するRPMのファイル名は上記で設定した名前にしてください


```
~ rpm -i gitlab-6.8.2_omnibus-1.el6.x86_64.rpm
```


次に設定ファイルの作成を行います。


```
~ mkdir /etc/gitlab
~ vim /etc/gitlab/gitlab.rb
```


```rb:gitlab.rb
# これは自分が使用するURLにあわせてください
external_url "http://xxxxxxxxxxx"
```

その後，以下のコマンドにて設定を適応させてください。


```
~ gitlab-ctl reconfigure
```

これでGitLabの初期設定は完了です。
最後に下記コマンドでGitLabを起動しましょう。

```
~ gitlab-ctl start
```

これでexternal_urlにて指定したアドレスで、GitLabを利用することができます。

##SSHのポートを変更している場合##

```
~ vim /var/opt/gitlab/gitlab-rails/etc/gitlab.yml
```


```yaml:gitlab.yml
#以下のコメントを外して番号を変更
ssh_port: 22
```
変更後、GitLabをリスタートします。

```
~ gitlab-ctl restart
```



#まとめ#
RPMを利用した方法だと、chefで必要なものを勝手にやってくれるのでいろいろと手間が省けて楽だなぁと思いました。他にもインストール方法はあるようなので、そちらは別途調べて頂ければ幸いです！

以下参考にしたURLです。SSLを用いた方法については、参考URLを見て頂ければと思います。

##参考URL##
* https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md
* http://redmine.jp/tech_note/subversion/
* http://qiita.com/tacck/items/d025f02e1db656a6fc66
ansible で sources.list を変更したときに update する

`register` で `template` モジュールの実行結果を受けて、
`changed` の場合は必ず update して、
`skipped` の場合は `cache_valid_time` で情報が古い場合だけ update するようにしました。

```yaml:tasks/apt.yaml
---
- template: src=sources.list.{{ ansible_distribution }}.j2 dest=/etc/apt/sources.list owner=root group=root mode=0644
  register: apt_sources_list
- apt: update_cache=yes
  when: apt_sources_list|changed
- apt: update_cache=yes cache_valid_time=3600
  when: apt_sources_list|skipped
```

詳細は [ansible で sources.list を変更したときに update する](http://blog.n-z.jp/blog/2014-05-20-ansible-apt-update.html) をみてください。
ansible で ppa を追加する

ansible コマンドなら `ansible all -s -K -i ./inventory_hosts -m apt_repository -a "repo='ppa:chris-lea/node.js'"` とか、`playbook` に書くなら、 `- apt_repository: repo='ppa:chris-lea/node.js'` とかいう話です。

詳細は [ansible で ppa を追加する](http://blog.n-z.jp/blog/2014-05-20-ansible-add-ppa.html) を見てください。
Raspberry Piにポケミクを接続

Raspberry PiにポケミクNSX-39をつなぎ、ミクさんのお言葉を頂戴したい。MIDI再生とかの知識不足でやたら回り道をしてしまったので備忘録的に。

# 用意するもの

* Raspberry Pi
* [Raspbian](http://www.raspberrypi.org/downloads/)のイメージを書き込んだSDカード(試したのは2014-01-07)
* ポケミクNSX-39

# やり方

## お言葉の準備

以下のページなど利用させていただきつつMIDIファイルを作成する。

[ポケットミクで好きな歌詞を歌ってくれるMIDIファイルを作成](http://aisot.org/39/mikuex)

頂戴したいお言葉を入力し、[MIDIをダウンロード(音あり)]を選択、ダウンロードしたMIDIファイルをRaspberry PiにSCPとかする。

## 機材の準備

1. Raspberry Piを起動して、キーボードとディスプレイとつなげるなり、ネットワークにつなげてSSHするなりする
2. NSX-39の切り替えスイッチを[USB]にして、Raspberry PiとUSB接続する

## お言葉の再生

Raspberry Piで以下のコマンドを入力する

```
pi@raspberrypi ~ $ aplaymidi -l
 Port    Client name                      Port name
 14:0    Midi Through                     Midi Through Port-0
 20:0    NSX-39                           NSX-39 MIDI 1
pi@raspberrypi ~ $ aplaymidi (MIDIファイルのパス) --port 20:0
```

aplaymidi -lでoutput portsを確認し、NSX-39のポートを見つけて、aplaymidiの--portに指定すればミクさんのお言葉を聞くことができる。
Symfony2でパンくずリストを作る方法(Twigテンプレで作ります)

SYmfony2でパンくず機能をつけようと思うとBundleを入れてーとか面倒なことになります。様々な方法を考えた結果、牡蠣の方法が一番楽でスマートということがわかりこれを採用しています。

Twigテンプレにbread_addしていき、bread_showで表示するという流れです。考え方がわかれば簡単です。

#service.yml にクラスを登録

app/config/service.yml に書きましたが、それぞれのBundle以下のservice.ymlに書いても構いません。下記ではCommonExtensionクラスを読み込ませ、TwigのExtensionを利用するようにサブクラスを作ります。

```yaml:app/config/service.yml
services:

    app_common.twig.extension:
        class: App\CommonBundle\Twig\CommonExtension
        arguments: ["@service_container", "@router"]
        tags:
            - { name: twig.extension }
        public: true
    
```

# CommonExtensionクラス

CommonExtension.php の中身は下記のとおりです。bread_add, bread_showのfunctionをtwigテンプレ内で使えるようにしています。このサブクラスの作り方は今回のパンくずに限らず利用ができます。

```php:src/App/CommonBundle/Twig/CommonExtension.php
<?php

namespace App\CommonBundle\Twig;

class CommonExtension extends \Twig_Extension
{
    private $breads;
    private $container, $router;

    public function __construct($container, $router)
    {
        $this->container = $container;
        $this->router = $router;
    }
    public function getFilters()
    {
        return array(           
            'bread_add' =>  new \Twig_Filter_Method($this, 'addBread'),
            'bread_show' =>  new \Twig_Filter_Method($this, 'showBread', array('is_safe' => array('html')))
        );
    }
    public function addBread($var)
    {
        if(!is_array($this->breads)) $this->breads = array();
        if(is_array($var)){
            
            foreach($var as $label=>$params){
                
                if(isset($params['path'])){
                    
                    if(isset($params['params'])){
                        $url = $this->container->get('router')->generate($params['path'], $params['params']);
                    } else {
                        $url = $this->container->get('router')->generate($params['path']);
                    }
                    $this->breads[ $label ] = $url;
                    
                } else {
                    $this->breads[ $label ] = '';
                }
            }
        }
    }
    public function showBread($var)
    {
        if(!is_array($this->breads)) $this->breads = array();
        $this->addBread($var);
        
        $breads = array();
        foreach($this->breads as $label => $url){
            if($url){
                array_push($breads, '<a title="'.$label.'" href="'.$url.'" itemprop="url"><span itemprop="title">'.$label.'</span></a>');
             } else {
                array_push($breads, $label);
             }
        }
        return join(' &gt; ', $breads);
    }
}
?>
```

#bread_add, bread_show 利用方法

bread_addしていき、bread_showで表示します。bread_add('label' => array('path'=>'__', 'title'=>'__'))  

```php

{% set bread = { 'ページタイトル':{'path':'page'}, (title):{} } %}

{{ {'トップページ':{'path':'homepage'}}|bread_add }}
{{ bread|bread_show }}

```

という風にすると

```html
<a title="トップページ" href="/" itemprop="url"><span itemprop="title">トップページ</span></a> &gt; ページタイトル
```

という風に出力されます。
Objective-Cのプロトコルというもの



##前提
基本的に勉強中です。

Objective-CのプロトコルはJavaのインターフェース相当とか結構いろいろなところに書いてあるので、こんな感じかなとあんまり実用性のない例で書いてみました。


##プロトコルTalk
```objectivec:Talk.h
#import <Foundation/Foundation.h>
@protocol Talk <NSObject>
@required
-(void)talk;
@end
```

##クラスCat
```objectivec:Cat.h
#import <UIKit/UIKit.h>
#import "Talk.h"
@interface Cat : NSObject <Talk>
@end
```

```objectivec:Cat.m
#import "Cat.h"
@implementation Cat
-(void)talk{
    NSLog(@"ニューー");
}
@end
```


##クラスDog
```objective-c:Dog.h
#import <Foundation/Foundation.h>
#import "Talk.h"
@interface Dog : NSObject <Talk>
@end
```

```objectivec:Dog.m
#import "Dog.h"
@implementation Dog
-(void)talk{
    NSLog(@"わうん");
}
@end
```


##MainとしてクラスViewController.mで実行
```objectivec:ViewController.m
#import "ViewController.h"
#import "Cat.h"
#import "Dog.h"
@interface ViewController ()
{
    NSMutableArray <Talk> *objects;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    objects = [@[] mutableCopy];
    Cat *cat = [[Cat alloc] init];
    Dog *dog = [[Dog alloc] init];
    
    [objects addObject:cat];
    [objects addObject:dog];
    
    for (int i = 0; i<[objects count]; i++) {
        [objects[i] talk];
    }
}
@end

```

```結果
2014-05-20 22:23:34.009 abdcfgl[67806:60b] ニューー
2014-05-20 22:23:34.009 abdcfgl[67806:60b] わうん
```


<br>

`<Talk>`とか書いてあるけれど、Talkプロトコルと関係ないオブジェクトも配列に追加できて、talkメソッド無いと実行時エラーになった。そもそもジェネリックスではないだろう!と。

全然まだまだだけど。なんとなく、少しわかった。
参照を切らずに配列を空にする

```js
var a = new Array(1000);
var b = a;
```
配列を空にする時

```js
a = [];
console.log(b); // Array(1000)
```
空の配列を代入すると参照が切れてしまうので、
切りたくない場合は

```js
a.splice(0, a.length);
console.log(b); // []
```
EZ GUIを使ったUIの作成はじめの一歩

## 全体的な作業の流れ
1.デザインタスク
1-1.デザインカンプの作成
1-2.パーツの切り出し

2.エンジニアリングタスク
2-1.EZ GUIのインポート
2-2.大枠(BG/Header/Contents/Footer)を配置
2-3.MainCameraの位置調整
2-4.ボタン類の配置
2-5.リスト生成スクリプト作成
2-6.フォントの作成
2-7.テキストの入力
2-8.経験値やスタミナのゲージ配置と描画スクリプト作成
2-9.シーン遷移のスクリプト作成

## 主要なコンポーネントの配置方法
### UIManager
1. 空のGameObjectを作成
2. UIManagerをドラッグ
3. UiCamerasにMain Cameraをドラッグ
4. Default Fontを指定

### SimpleSprite
1.空のGameObjectを作成
2.SimpleSpriteをドラッグ
3.Materialを指定
4.Pixel Perfectをチェック
5.Width/Heightを調整
6.Pixel Dimensionsを調整

### UIButton
1.空のGameObjectを作成
2.UIButtonをドラッグ
3.Normal/Over等のボタン画像を追加
4.Pixel Perfectをチェック
5.Width/Heightを調整
6.Materialを指定
7.BuildAtras
8.Textを指定

### ScrollList
1.空のGameObjectを作成
2.UIScroll Listをドラッグ
3.ViewableAreaを指定
4.Prefab Itemsにリスト化したいアイテムをドラッグ

SpriteTextを使う
1.空のGameObjectを作成
2.SpriteTextをドラッグ
3.Pixel Perfectをチェック
4.Textを指定
5.Width/Heightを調整
PCでタッチでバイスを再現する


#やりたかったこと

スマホサイト制作で、on touch イベントを使うことがありました。

そのテストのために毎回サーバーにアップして実機でテストするなんて、面倒！

PCでタッチを再現できたら楽だなあ…

#解決策

Chrome の拡張機能を入れたら、いけました。

c Touch r3
https://chrome.google.com/webstore/detail/ctouch-r3-filesystem/iemofinbkpbpamdjljafoheiaamajgdn/related

参考にしたサイトには、Chrome のアップデートにより、いろいろ設定しないと使えないという話でしたが、インストールしてすぐに使えました。

環境はMac OS X 10.8

使えなかった場合は、下記URLを参考に設定をいじってみてください。



参考URL
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11116576661

http://ameblo.jp/miru-miru-365/entry-11726842881.html

http://www.ko-tan.com/article/300916718.html


#追記
コメントにて、Chrome のDeveloper tool でもタッチイベント再現できるよという情報をいただきました。

で、探してみたのですがなかなか切り替えの設定方法がわからない…

と思っていた所、次の記事を見つけました。

[消えた User Agent の項目。Google Chormeのバージョン32.xのお話](http://hm-solution.jp/web/post3121.html)

設定ボタン（歯車）左のボタン（>三）→ タブで「Emulation」を選択　→ 機種を選んで「Emulate」を押す。

この記事にあるように、Chrome 32 からは非常に見つけづらい場所に移動してしまいました。
Dockerチートシート

# Dockerチートシート
個人的によく使うコマンドのまとめ

2014/05/20現在の情報です。

## 設定確認
```
docker version    # Dockerのバージョン表示
docker info       # コンテナ・イメージ数、ユーザ情報など現在の情報表示
```


## コンテナ起動
```
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

# 例: ubuntu_hostというホスト名でubuntuを起動。
docker run -it -h ubuntu_host ubuntu:14.04 /bin/bash 

# 例: 最大メモリ使用量を256MBに制限して起動。終了したらコンテナ自動削除
docker run -it -m 512m --rm ubuntu:14.04 /bin/bash

# 例: redisというコンテナ名でコンテナをバックグラウンドで起動
# (コンテナ名はLink,マウント機能で利用)
docker run -d --name redis dockerfile/redis

# 例: 上で作成したredisコンテナに対してdbというエイリアスをつけてコンテナ間通信
docker run -it --link redis:db ubuntu /bin/bash

# 例: 6379ポートをホストにマッピング、ホストの/data/redisをコンテナの/dataにマッピング
docker run -d -p 6379:6379 -v /data/redis:/data --name redis dockerfile/redis

```
コンテナ間通信の参考: [Dockerコンテナ間のlink，database.ymlの書き方  | SOTA](http://deeeet.com/writing/2014/03/20/docker-link-container/)

## メジャーなレポジトリ
* [busybox](https://index.docker.io/_/busybox), [centos](https://index.docker.io/_/centos), [ubuntu](https://index.docker.io/_/ubuntu/), [debian](https://index.docker.io/_/debian)
  * 公式イメージ。人気なのは言わずもがな
* [dockerfile/*](https://index.docker.io/u/dockerfile/)
  * [Dockerfile Project](http://dockerfile.github.io/)が管理。
  * ElasticSearch,nginx,redis,mongodbなど。baseはubuntu 14.04
  * よくメンテナンスされている
  * プログラムはソースからmakeしており、ほぼ最新
  * dockerfileで作成されているため、自分で変更もしやすい
* [orchardup/*](https://index.docker.io/u/orchardup/)
  * Orchard (Dockerコンテナのホスティングサービス会社) が提供
  * redisやpostgresql,nginxなど。baseはubuntu12.04
  * 比較的安定している感じ
* [tutum/*](https://index.docker.io/u/tutum/)
  * Tutum もDockerコンテナのホスティングサービス
  * MySQLやRabbitMQなど。
  * よく更新されている。baseはubuntu14.04
* [base](https://index.docker.io/_/base/)
  * 今は非推奨。中身はubuntu12.10。
* [stackbrew/*](https://index.docker.io/u/stackbrew/)
  * オフィシャルパッケージの管理者(?)
* [google/*](https://index.docker.io/u/google/)
  * Google Cloud Platform関連など

個人的にはDockerfile Projectが使いやすそうな感触。
データも/dataに入るようになっているため、ホストのディスクをマウントさせやすい。


## コンテナ操作
```
docker ps -as            # コンテナ一覧(停止コンテナ含む、サイズ表示)

docker start CONTAINER   # コンテナを起動
docker restart CONTAINER # コンテナ再起動
docker stop CONTAINER    # コンテナ終了
docker kill CONTAINER    # コンテナ強制終了

docker attach CONTAINER  # コンテナへアタッチ

docker top CONTAINER     # コンテナのプロセスを表示
docker logs -f CONTAINER # コンテナのログを表示(ログ出力をfollow)
docker inspect CONTAINER # コンテナの情報を表示

docker rm CONTAINER      # コンテナを削除
```

## イメージの操作
```
docker pull NAME[:TAG]
docker images --tree     # イメージ一覧表示（ただし,treeオプションは非推奨）

docker inspect IMAGE     # イメージの情報を表示
docker rmi IMAGE         # イメージを削除

```

## イメージ作成
```
# dockerfileからイメージ作成
docker build -t NAME[:TAG] .
# またはコンテナからイメージを作成
docker commit -m "comment" CONTAINER NAME[:TAG]

# 自分のイメージをpush
docker login
docker push NAME[:TAG]
```
Dockerのコンテナをすべて破棄したい

起動中のコンテナをすべて破棄したいときのシェルスクリプトです。

```bash
docker rm -f $(docker ps -q)
```

としたいとこですが、これではsudo docker ps -qの結果が空だった場合エラーになります。
そこで条件分岐を加えます。

起動中のコンテナをすべて破棄

```bash
ps=$(docker ps -q)
if [ ${#ps} -ne 0 ]; then
  docker rm -f $ps
fi
```

ちなみに起動中のコンテナをすべて停止する場合は。

```bash
ps=$(docker ps -q)
if [ ${#ps} -ne 0 ]; then
  docker stop -f $ps
fi
```

当然ですが、終了してしまったコンテナも含めて破棄する場合は以下です。

```bash
ps=$(docker ps -q -a)
if [ ${#ps} -ne 0 ]; then
  docker rm -f $ps
fi
```
MongoDBでデータベースサイズが気になるとき

MongoDBはその性格上、大きめに容量を確保します。はじめから大してデータサイズが大きくならないことがわかっているときは、以下のオプションにより、利用する容量を節約できます。

--smallfilesオプションをつけて起動する、または設定ファイルに以下を追加する。

    smallfiles = true
ちょっと便利！ ChatWork（チャットワーク） に MySQLのステータス情報をメッセージする

MySQLのステータス情報をchatworkにメッセージ出力するshellを作成してみました。


## shell 

```
#!/bin/bash

_host=`hostname -s`
_roomid=010101010
_msg=`mysqladmin -umyuser -ppasswwwww status`

cat << _EOT_ > /tmp/msg.txt
[info]
[title]
${_host}さんからMySQLステータスのお知らせ
[/title]
${_msg}
改行も含めてメッセージ送って見ると
するか。どうでしょうか？
改行はうまくいってますかね？

[/info]

_EOT_

_body=`cat /tmp/msg.txt`

curl -X POST -H "X-ChatWorkToken: XXX APIトークンを入れてね XXX" -d "body=${_body}" "https://api.chatwork.com/v1/rooms/${_roomid}/messages"

exit 0
```

## 出力結果

![chatworks.jpg](https://qiita-image-store.s3.amazonaws.com/0/37544/f2730201-32cb-04ba-fca6-1859651b8eee.jpeg)

単純にメッセージを出しただけですが、実際はステータスの結果を見て、エラーだった場合のみメッセージを送信するとかの制御を入れるようにすれば、もっと便利に使えるのではないかな？と思います。

なお、chatworkのapiドキュメントに関しては、

http://developer.chatwork.com/ja/index.html

で確認できます。
jquery.mCustomScrollbar.jsでカスタムスクロールバーを付けた中のareaがなんでかスムーズスクロールしちゃう件

#現象
Custom Scrollbar pluginを使ったカスタムスクロールバーの中にareaがあると、なんでか最下部へのスクロールになる。
バージョンは2.8.3くらい？

#ひとまずの解決策
jquery.mCustomScrollbar.js内のareaの記述を消す。（textareaのほうは消さない！）
→直った！
【excel】セルの値で空きセルを埋める方法

##何がやりたいか？
タイトルだとわかりづらいですが、

| A列 | B列 |
|:----|------------:|
| hoge|  |
|     |  |
| hugahuga|  |
|     |  |
|     |  |

このような状態のときに、

| A列 | B列 |
|:----|------------:|
| hoge|  |
| hoge|  |
| hugahuga|  |
| hugahuga|  |
| hugahuga|  |

というように、空きセルを埋めたい。

##そのための方法
B列にA列に値があれば、A列の値を、なければB列の真上の値を参照するように書く。

=IF(ISBLANK(INDIRECT(ADDRESS(ROW(),COLUMN()-1))),INDIRECT(ADDRESS(ROW()-1,COLUMN())),INDIRECT(ADDRESS(ROW(),COLUMN()-1)))

そうすると、

| A列 | B列 |
|:----|------------:|
| hoge| hoge|
|     | hoge|
| hugahuga| hugahuga |
|     | hugahuga |
|     | hugahuga |

となりB列に想定の列ができる。
A列の空きセルに似たようなことを書くと循環参照になって失敗する。
MAMP環境をMac標準のもので作る(mysqlはインストールする)

mysql
=======

* [mysql](http://dev.mysql.com/downloads/mysql/)をインストール

PATH追加

* PATH=/usr/local/mysql/bin:$PATH

```diff:/usr/local/mysql/my.cnf
+[client]
+default-character-set=utf8
+
+[mysqld]
+skip-character-set-client-handshake
+character-set-server = utf8
+collation-server = utf8_general_ci
+
+[mysqldump]
+default-character-set=utf8
```

apacheでphpを使えるようにする
=============================

```diff:/etc/apache2/httpd.conf
-#LoadModule php5_module libexec/apache2/libphp5.so
+LoadModule php5_module libexec/apache2/libphp5.so
-    DirectoryIndex index.html
+    DirectoryIndex index.html index.php
-    AllowOverride None
+    AllowOverride All
```

```bash:php.ini
$ sudo cp -p /etc/php.ini.default /etc/php.ini
$ sudo touch /var/log/apache2/php_errors.log
$ sudo chown _www:_www /var/log/apache2/php_errors.log
```

```diff:php.ini
-display_errors = Off
+display_errors = On

 [Date]
 ; Defines the default timezone used by the date functions
 ; http://php.net/date.timezone
 ;date.timezone =
+date.timezone = Asia/Tokyo

-;error_log = php_errors.log
+error_log = /var/log/apache2/php_errors.log
```

phpからmysqlに接続ができることを確認
================================

```diff:/etc/php.ini
-pdo_mysql.default_socket=
+pdo_mysql.default_socket= "/tmp/mysql.sock"
-mysql.default_socket =
+mysql.default_socket = "/tmp/mysql.sock"
-mysqli.default_socket =
+mysqli.default_socket = "/tmp/mysql.sock"
```

```php:
<?php
if (!$conn = mysql_connect('localhost', 'root', '')) {
    die('MySQL接続失敗');
}
echo 'MySQL接続成功';
mysql_close($conn);
```

apache起動
==========

```bash:起動
$ sudo /usr/sbin/apachectl restart
```

各種情報
==========

```bash:ログ
$ tail -f /var/log/apache2/*log
```

```bash:DocumentRootを変更
$ sudo sed -ie "s@/Library/WebServer/Documents@/var/www@" /etc/apache2/httpd.conf
$ sudo mkdir /var/www
$ sudo chmod 777 /var/www
$ sudo /usr/sbin/apachectl restart
```

```bash:実行ユーザ
User _www
Group _www
```

safariのキャッシュクリア
==========

* alt+command+E
選択したフォルダの階層構造を保ったままAssetBundleにする

Unity5では階層構造を保ったままAssetBundleにできるらしく、このような記事も「今更かよ....」とか思われそうではありますが、AssetBundle関連の記事は少ないように思いましたので投稿させて頂きました。

以下、コードになります。

```csharp:BuildAssetBundle

public class BuildAssetBundles
{

    [ MenuItem("Assets/Build AssetBundle/WebPlayer ExplicitAssetNames")]
    static void BuildAssetBundle_ExplicitAssetNames_WebPlayer ()
    {

        //AssetBundleにするフォルダを選択.
        string selectPath = EditorUtility.OpenFolderPanel( "フォルダを選択して下さい", Application.dataPath, "FolderName");
        if( selectPath.Length == 0 )
        {
            Debug.Log( "フォルダ選択エラー" );
            return;
        }

        //選択したフォルダはプロジェクトに存在するかチェック.
        if( selectPath.IndexOf( Application.dataPath ) < 0 )
        {
            Debug.Log("選択したフォルダは作業中のプロジェクトに存在しません");
            return;
        }

        //プロジェクト名を取得.
        string prjName = Application.dataPath.Replace("/Assets", "");
        prjName = prjName.Substring(prjName.LastIndexOf("/") + 1);

        //出力パスを指定.
        string outPath = EditorUtility.SaveFilePanel("Save Resources", "", prjName, "unity3d");
        if( outPath.Length == 0 )
        {
            return;
        }

        //オブジェクト名のみになるように整形.
        string[] names = Directory.GetFiles( selectPath, "*.*", SearchOption.AllDirectories);
        for( int i = 0 ; i < names.Length ; i++ )
        {
            string path = names[ i ];
            path = path.Replace( "\\", "/" );
            path = path.Replace( selectPath + "/", "" );
            path = path.Substring( 0, path.LastIndexOf( "." ) );
            names[ i ] = path;
        }

        //Resourcesからのパスに整形.
        string resPath = selectPath.Replace( Application.dataPath + "/Resources/", "" );
        resPath += "/";

        //Assetの配列を作成.
        Object[] assets = new Object[names.Length];
        for( int i = 0 ; i < names.Length ; i++ )
        {
            assets[i] = Resources.Load( resPath + names[i] );
        }

        //AssetBundleを出力.
        BuildPipeline.BuildAssetBundleExplicitAssetNames( assets, names, outPath,
                                                BuildAssetBundleOptions.CollectDependencies | 
                                                BuildAssetBundleOptions.CompleteAssets |
                                                BuildAssetBundleOptions.DeterministicAssetBundle
                                             );

        //終了ログ.
        Debug.Log("Build is finished!");
    }

}

```

http://blog.douga-kan.com/lagoon/blog/2012/11/07/%E3%80%90unity%E3%80%91android%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA-%E5%82%99%E5%BF%98%E9%8C%B2%E2%91%B1%E3%80%80assetbundle%E3%81%A7%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E6%A7%8B%E9%80%A0/
こちらをやる上で参考にさせて頂いた記事になります。
記事をお書きになったmush様、大変参考になりました。この場を借りてお礼申し上げます。
初回アクセス時にリンクにjsessionidが入るのをなんとかする

初回アクセス時はセッション維持にcookieが使えるか判断できず、埋め込むURLにセッションIDを入れる動きをします。

フレームワークやJSTLで使用されるencodeURLの結果にjsessionidが含まれるので
その結果からjsessionidを無理やり消す形で対応。


```java:CutJsessionidFilter.java
package ex.web.interceptor;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class CutJsessionidFilter implements Filter {

    private static class CutJsessionidResponseWrapper extends
            HttpServletResponseWrapper {

        public CutJsessionidResponseWrapper(final HttpServletResponse response) {
            super(response);
        }

        @Override
        public String encodeURL(final String url) {
            String encurl = super.encodeURL(url).replaceAll(
                    ";jsessionid=[0-9a-zA-Z]+", "");
            return encurl;
        }
    }

    @Override
    public void init(final FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(final ServletRequest request,
            final ServletResponse response, final FilterChain chain)
            throws IOException, ServletException {
        if (response instanceof HttpServletResponse
                && !(response instanceof CutJsessionidResponseWrapper)) {
            chain.doFilter(request, new CutJsessionidResponseWrapper(
                    (HttpServletResponse) response));
            return;
        }
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
    }
}
```

```xml:web.xml
<filter>
  <filter-name>cutJsessionidFilter</filter-name>
  <filter-class>ex.web.interceptor.CutJsessionidFilter</filter-class>
</filter>
  
<filter-mapping>
  <filter-name>cutJsessionidFilter</filter-name>
  <url-pattern>/*</url-pattern>
  <dispatcher>REQUEST</dispatcher>
  <dispatcher>INCLUDE</dispatcher>
</filter-mapping>
```

JSPで色々やっている場合はINCLUDEの指定も必要になる場合があります。
[Apache Tiles](http://tiles.apache.org/2.2/framework/index.html) を使用しており、テンプレートからJSPを埋め込んでいたため対応が必要でした。

懐かしさもある話かと思いますが、Tilesの罠に気づかず意外と時間を取られたので。

結論
**Servlet 3.0を使おう！**
バックグラウンドでもカウントするだけのサンプルコードメモ


https://github.com/nmisawa/BGSample

単純にNSTimerで1秒毎にNSLogするだけのアプリなんだけども、applicationDidEnterBackground
に入ったあと、endBackgroundTaskをすると止まってしまう。呼ばれないはずなんだけどな。

一般的なコードなんだけど、疲れてるせいでなにか忘れてるのかも。
TiShadow spec でAlloy.Globalsがundefinedになるとき

## 遭遇した問題

Titamium Mobile + Alloyを使って
TiShadow spec しているときに、alloy.jsで定義したAlloy.Globalsがundefinedになる。

console.log(Alloy.Glibals)は空のオブジェクト「{}」となっている。


## 仮説

Alloyがprecompileしたalloy.jsをtishadiw specで読み取れていないのではないか？


## やったこと

「Alloy.Globals」をbuild/以下でgrepしたところ、build/tishadow/src/android/app.js に、自分が定義したと思しきコードを発見した。
そこで

```js
describe("xxxx", function(){
    var Alloy = require("alloy");
    var App = require("app");
    :
    :
});
```

のように書いたところ、undefinedが解消できた。

precompile後のapp.jsはcontroller/index をcreateController()するのが残念。これは、今は影響がなかったので対応を保留した。