OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】uGUIを使ったゲームをAndroid/iOSでリリースするにあたって起こった問題など

つい最近、uGUIをふんだんに使った（というか、キャラも何もかもuGUIで作った）ゲームをAndroid/iOSでリリースしました。
リリースする際に起こった問題を何点か記載してみます。

# Androidでの問題
## uGUI InputField
Line Typeを「Single Line」にすると、ソフトウェアキーボードの完了キーを押すと入力内容が消滅するようになる。
「Multi Line Submit」にすると正しく動くので、こちらを使いましょう。
## uGUI Mask
端末依存かOS依存か明確には調査できていませんが、一部の端末でMaskが効かなくなりました。
これは対処法不明なので放置中。。
## メモリ
uGUI関係ないですが、困った。
Androidは端末スペックに幅があるので、ちょっと古い端末だとすぐメモリが足りなくなって落ちます。
自身の検証不足が原因ではあるのですが、今さらそう簡単には直せなかったり・・・。

# iOSでの問題
## RemoteNotificationの問題
iOSではuGUI周り特に問題が起きなかったので、別のトコロを。

Unityから吐いたiOSプロジェクトをそのままビルドして送ると、iTunes Storeから「Missing Push Notification Entitlement」と記載されたメールが送られてきます。
RemoteNotification用のコードが入ってるのにRemoteNotificationの設定がONになっとらんよー　ってことらしいです。

UnityのiOSプロジェクトはデフォルトでRemoteNotificationのコードが含まれてしまっているようなので、UnityAppController.mm の下記3つのメソッドを消しておけばOKです。

```lang:UnityAppController.mm
- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
```

# Linqは意外と大丈夫でした
今回、C#のLinqはガッツリ使いました。

LinqはiOSでのみエラーになる部分が沢山あるため敬遠しがちですが、どういった使い方をすると落ちるかをまとめてくださっている方が居るので、それに沿えば全然問題ナシでした。

ただ、開発中のメイン検証マシンはAndroidで、iOSでの検証は最後にやる、といったような場合は最初から避けても良いかもしれません。

# まとめ
現時点では、uGUIはAndroidでのMaskの挙動が致命的。
他に問題は見当たらなかったので、実に惜しい・・・。

どなたか回避策があればご教授くださいませm(_ _)m
それってほんとにRelativeLayout必要？

![Slice 1.png](https://qiita-image-store.s3.amazonaws.com/0/74571/b3c1ba60-6611-e912-bc26-68d00880a0b8.png "Slice 1.png")

先日、↑のようなレイアウトを作成しようとして、知ったことをメモ。

いつの頃からかAndroidのEclipseはRelativeLayoutをデフォルトにレイアウトするようになっていて、（といっても、私はAndroid Studioのほうを使っていますがｗ）ついつい、

* ＋ボタンは左寄せ
* 送信ボタンは右寄せ
* テキストボックスは＋ボタンの右、送信ボタンの左

みたいな考えをしがちです。

が、このレイアウトでは、

* 送信ボタンがテキストボックスにあわせて伸びる(=match_parent指定が必要)
* ＋ボタンはテキストボックスに合わせて伸びない(=wrap_content指定が必要)

なので、RelativeLayoutではうまくいきません。

じゃあ、どうするのか？

**LinearLayoutのlayout_weightをうまくつかう** のです。

![Slice 2.png](https://qiita-image-store.s3.amazonaws.com/0/74571/e5d79fef-3557-54b9-c363-e40eb9dfaca7.png "Slice 2.png")

layout_weightプロパティは、レイアウトの残った部分で、うまく配分してくれるらしいので、↑のように指定をすることで、両端のボタンを配置して残った部分全体にテキストボックスを置くことができます。

LinearLayoutでは、

* minWidth, minHeightとかも使える
* 送信ボタンをmatch_parent指定にするとテキストボックス配置後のボックスサイズにぴったりな感じでレイアウトしてくれる

など、RelativeLayoutだとできなかったこともできます。
PostgreSQLのストリーミングレプリケーションで、更新が完了したはずなのにデータがスレーブに反映されていない場合がある


#同期レプリケーション？

PostgreSQL9.1以降でストリームレプリケーションを設定するとき、postgresql.confでsynchronous_commitをon(デフォルト)にしておくと、同期レプリケーションで動作します。

「同期」と聞くと、以下のような動作じゃないかと思いますよね。例としてinsertを考えます。また、単純化するためにスレーブも1台とします。

1. アプリケーションからマスターDBにinsertを発行
1. マスターDBがinsertを実行。自身に反映される
1. insertの内容がスレーブDBに送られる
1. スレーブDBにinsertの内容が反映される
1. マスターはアプリに「insert完了」と通知する

insertが全てのノードに適用されて初めて、アプリは「insert成功」と認識するので「同期レプリケーション」だ！

・・はい、残念ながら違います。
もし上記のような動作であれば、アプリケーションからinsertを発行し、完了直後に「スレーブDBに」selectを投げたらinsertしたデータが見えるはずですよね?
しかし、[Let's Postgresql!](http://lets.postgresql.jp/)では以下のように書いてあります。

> 同期モードであっても、更新直後にスレーブで参照クエリ実行すると、まだ更新が反映されていない場合があります。
(http://lets.postgresql.jp/documents/technical/9.1/1)

えー？
実際、私もこの現象に遭遇しました。

# ログシッピングであるということ

PostgreSQLのストリーミングレプリケーションはWALの転送によるレプリケーションです。
ですので、上記のinsertの動作はもう少し細かく書くと以下のようになります(タイミングや用語がちょっと違うかもしれませんが・・）

1. アプリケーションからマスターDBにinsertを発行
1. マスターDBがinsertの内容をWALに書き込む
1. マスターDBが自身にinsertの内容を反映
1. WALがスレーブDBに転送される
1. スレーブDBは受け取ったWALをディスクに書き込む
1. スレーブDBはWALの書き込み完了時点でマスターDBに「受信した」と返答
1. マスターDBはスレーブDBからの受信完了通知を受けて、アプリに「insert完了」と通知
1. スレーブは受信したWALを自身に反映する(この時点でinsertの内容が反映される)

つまり、アプリがinsert完了したと思った時点では**スレーブDBがそのinsertに関するWALは受信したことは保証されている(同期レプリケーション)が、WALの内容が自身に反映されているかは保証されない**のです。
同時に転送されているWALの量やスレーブDBの負荷状況によってはこの「受信から適用」までの時間は延びる可能性があることは容易に想像できます。

# 結論と回避方法
ほとんどのケースでは上記の時間差は問題にならず、「insert直後にスレーブでselect」をしてもちゃんとデータは見えると思います。
ただ、上記のような事がタイミング次第ではあり得る、ということはアプリケーション設計時に憶えておいた方がいいでしょう。「insertしたデータをすぐにselectしてserialを取得しておき、そのserialに基づいてデータをいじる」というような処理は結構ありがちですので気をつけましょう。

じゃあどうやって回避するのか?
一番楽ちんなのは[pgpool](http://www.pgpool.net/mediawiki/index.php/Main_Page)使うことでしょうか。pgpoolだと、「更新系SQLはマスターに送り、参照系SQLはスレーブに送る」ということを自動でやってくれますが、その中で、絶対にスレーブに飛んで欲しくない参照系SQLの前に

```c
/*  NO LOAD BALANCE */
```

というコメントを入れてやればOKです。そうするとこのSQLは絶対にマスターに飛びます。
もしくは、明示的なトランザクションで囲ってもOKです。insertの失敗に備えるのであればトランザクション使う方がいいでしょうね。
Ruby NokogiriでRSSのパースが出来ない

わからないことの備忘録。

RubyのNokogiriを使って、iTunesのRSSをパースしようとしたものの、`xml`の中には値はあるのに、item_nodesのところはなぜか値が空っぽになっていて取得できない。

自分の想定では、`xml.xpath('//entry')`の部分でentryタグないの値をとってきて、その中のものを取得できると思って書いたのですが思い通りにいかず。

最終的にやりたいことは`im:image`とか`im:collection`の中身とかを扱いたいんだけど・・・・。

わからない・・・・

```ruby
# -*- encoding: UTF-8 -*-
require 'nokogiri'
require 'open-uri'

url = 'https://itunes.apple.com/jp/rss/topsongs/limit=10/genre=27/xml'

xml = Nokogiri::XML(open(url).read)

item_nodes = xml.xpath('//entry')

p item_nodes

item_nodes.each do |item|
  puts "id：" + item.xpath('id').text
  puts "link：" + item.xpath('link').text
  puts "im:image" + item.xpath('im:image').text
end
```

簡単なヒントでもいいので、ご助言いただけると助かります。
rubyXLでページ設定のヘッダー/フッターの設定が消えてしまう

![headerfooter.png](https://qiita-image-store.s3.amazonaws.com/0/70195/6aa78d31-e1f2-fd14-f9cd-7ad72fd019ec.png)

rubyXLを使っていてハマった。。。

エクセルテンプレートのページ設定で、ヘッダー/フッターを設定しても
出力されたエクセルからヘッダー/フッターの設定が消えている。

調べていったところ、HeaderFooterSettingsのoddFooterに設定すればいけそう！
ってことでまずは値を設定してみた。

※「&P/&N」の部分はちょっと違うかも。忘れたｗ

```
worksheet.header_footer.odd_footer = RubyXL::StringValue.new(val: "&P/&N")
```

xlsxをzip化し解凍して中身を確認

```
<headerFooter><oddFooter val="&P/&N"/></headerFooter>
```

テンプレートファイルの中身はこうなので失敗・・・

```
<headerFooter><oddFooter>&P/&N</oddFooter></headerFooter>
```

あれこれ試してみたけどどれもうまくいかず、、、
RubyXL::StringValue
ではなくて、ただのStringならうまくいきそうなのに！
って思ってStringをいろいろ試してみた結果
HeaderFooterSettingsクラスの中を変更したら解決した！

```
    #define_child_node(RubyXL::StringValue, :node_name => :oddFooter)
    define_child_node(RubyXL::StringNode, :node_name => :oddFooter)
```

最終的には
config/initializers/rubyXL_header_footer_settings_extension.rb
というファイルを作成し、こんな中身を書いて解決しました。

```
require "rubyXL"

module RubyXL

  # http://www.schemacentral.com/sc/ooxml/e-ssml_headerFooter-1.html
  class HeaderFooterSettings < OOXMLObject
    define_attribute(:differentOddEven, :bool, :default => false)
    define_attribute(:differentFirst,   :bool, :default => false)
    define_attribute(:scaleWithDoc,     :bool, :default => true)
    define_attribute(:alignWithMargins, :bool, :default => true)
    # これではページ設定のヘッダー、フッターが機能しなかったのでStringNodeに修正
    #define_child_node(RubyXL::StringValue, :node_name => :oddHeader)
    #define_child_node(RubyXL::StringValue, :node_name => :oddFooter)
    define_child_node(RubyXL::StringNode, :node_name => :oddHeader)
    define_child_node(RubyXL::StringNode, :node_name => :oddFooter)
    define_child_node(RubyXL::StringValue, :node_name => :evenHeader)
    define_child_node(RubyXL::StringValue, :node_name => :evenFooter)
    define_child_node(RubyXL::StringValue, :node_name => :firstHeader)
    define_child_node(RubyXL::StringValue, :node_name => :firstFooter)
    define_element_name 'headerFooter'
  end

end
```

※evenHeaderとかfirstHeaderとかも変更が必要かもしれないけど、今は試してないです。
FreeBSD 11使ってみた

FreeBSD 11は[最低5年間サポート](http://gihyo.jp/admin/serial/01/bsd-yomoyama/0001)ということで触ってみる。
lenovoのNotePCで作業。


## インストール

ftp://ftp.freebsd.org/pub/FreeBSD/snapshots/amd64/amd64/ISO-IMAGES/11.0/

から一番新しそうなものをダウンロード。今回は以下を用いた。

* FreeBSD-11.0-CURRENT-amd64-20150509-r282694-disc1.iso

## ネットワークについて

* ue0 : USB-NIC
* alc0 : Atheros AR8162 PCIe Fast Ethernet

## インストール後の設定

* 一般ユーザでログイン。

```bash:
su -
pkg install -y sudo
visudo
```

```bash:
pkg install -y \
  xorg lxde-meta ja-font-takao vim virtualbox-ose firefox
```

## Xの起動

```bash:
startx
```

## virtualbox

* [VirtualBox - FreeBSD Wiki](https://wiki.freebsd.org/VirtualBox)

```diff:/boot/loader.conf
+ vboxdrv_load="YES"
```

```diff:/etc/rc.conf
+ vboxnet_enable="YES"
```

```bash:
sudo virtualbox
```

## firefox

firefoxの起動はdbusが必要。

```diff:/etc/rc.conf
+ dbus_enable="YES"
```

```bash:
firefox
```

## pkgの追加/削除手順

```bash:
# 追加
pkg install xfce
# 削除
pkg delete xfce
pkg autoremove
```
fleetctlのサブコマンドとetcd上の状態遷移図

概要
----

fleetctlには submit/destroy, load/unload, start/stop の対となるサブコマンドがあります
これを実行したときにetcd上における状態遷移を図にしておきました

状態遷移図
--------

```
                local-fs <-|-> etcd
                           |
                  submit   |             load           start
                ---------> |          -------->        ------>
    *.service file         | inactive           loaded         launched
                <--------- |          <--------        <------
                  destroy  |            unload           stop
                           |
```

解説
----

**\*.serviceファイル** を _fleet submit_ すると、etcd上にサービスとして読み込まれた状態(**inactive**)となります
**inactive**状態のサービスに対し _fleet load_ すると、実行先ホストが決定された状態(**loaded**)となります
**loaded**状態のサービスに対し _fleet start_ すると、実際に実行された状態(**launched**)となります

stop, unload, destroy はそれぞれ逆の操作です

ちなTIPS
=======

\*.serviceファイルの中身の変更方法
-----------------------------------

\*.serviceファイルの中身を変えたい場合は、stop/unload/destroyまでしてetcd上から取り除いてから、submit/load/startする必要があります

上書きは出来ない模様

fleetctlを経由せず、直接dockerコマンドでrun/stopした場合
---------------------------------------------------

ちゃんと `fleetctl list-units` に反映されます

ご自分で試してみて
emacsにrsenseを入れてみた。

なんかいろいろ徘徊してたら、[rsense](http://goo.gl/a9pN1g)を見つけたのでいれてみました。
補完をやってくれる拡張です。

DLして、そのソースを僕は~/opt/以下にコピーしました。

書いてある通りにinstallして、init.elに

```el
(setq rsense-home "/Users/koichi.yanagimoto/opt/rsense-0.3")
(add-to-list 'load-path (concat rsense-home "/etc"))
(require 'rsense)

(add-hook 'ruby-mode-hook
  (lambda ()
    (add-to-list 'ac-sources 'ac-source-rsense-method)
    (add-to-list 'ac-sources 'ac-source-rsense-constant)))
```

を追加したら、キレイに候補が出てくれた！
ハードディスクの完全消去 - KIERUTO 

# KIERUTO とは
　パソコンやサーバのハードディスクのデータ消去を行うツールです。通常、フォーマットだけではハードディスクの情報は復元可能です。復元するプログラムも多数存在しています。破棄、リース返却、中古販売する際には、ハードディスクのデータ消去を行わないと、情報漏洩につながる可能性があります。
　GNU Core Utilities に含まれる **Shredを簡単なメニュー形式から実行できるツール**を作成しました。

# 特徴
+ NSA標準（米国家安全保障局）推奨方式での消去が可能です。
+ ハードディスクだけでなく、フロッピーディスク、USBディスクのデータ消去も可能です。
+ HP製のProLiantサーバ のccissドライバも認識できます。
+ Slax Linuxをベースとしています。

# 起動方法
1. ダウンロードしたISOイメージをCD-Rに焼いてください。(USB メモリからブートする場合は　[linux usb creator](http://www.linuxliveusb.com/ "linux usb creator") 等をご利用ください）
2. パソコンのBIOSでCD-ROM ブート可能とします。
3. 作成したCD-ROMからブートします。
4. 以下のアイコンをクリックするとメニューが表示されます。

![icon.jpg](https://qiita-image-store.s3.amazonaws.com/0/78224/c1664500-d16d-188e-5bcc-567e52f3846f.jpeg)

# 使い方
メニュー
![menu.jpg](https://qiita-image-store.s3.amazonaws.com/0/78224/e5496777-fdc1-0b8c-c5cd-8a389fd2070f.jpeg)

「1 ハードディスクのゼロクリア」は　０書き込みを１回だけ行います。高速ですがデータ消去の目的にはお勧めしません。

```bash:実行コマンド
# /usr/bin/shred -v -z $dev
```

「2. NSA標準（米国国防省NSA規格）」 の方式で消去が実施されます。乱数書き込み 2回 + 0 で書き込みを1回行います。 **通常はこちらを選択してください。**

```bash:実行コマンド
# /usr/bin/shred -v -n 2 -z $dev
```

「3　接続されているハードディスクの一覧」 を選択すると接続しているデバイスが表示されます。

「４　ハードディスクの選択」　ターゲットデバイスの変更を行うことができます。
***メニュー画面の１行目に記載されているハードディスクがターゲットとなります。***別のディスクをターゲットとする場合は、こちらのメニューから選択してください

「5 ハードディスクの情報表示」はハードディスクのシリアル番号やリビジョンが表示されます。*※ディスクによっては表示できません*

（例）

```
Check HardDisk Information.

/dev/hda:

Model=ST310211A, FwRev=3.39, SerialNo=XXXXXXXXXX
Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% }
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=0
BuffType=unknown, BuffSize=512kB, MaxMultSect=16, MultSect=16
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=19541088
IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
PIO modes: pio0 pio1 pio2 pio3 pio4
DMA modes: mdma0 mdma1 mdma2
UDMA modes: udma0 udma1 *udma2
AdvancedPM=no WriteCache=enabled
Drive conforms to: device does not report version: 1 2 3 4

* signifies the current active mode
```

 「6 ハードディスクの消去を確認」　はハードディスクのHEXダンプを取ります。
先頭と指定したエリアを表示します。
![kakunin.png](https://qiita-image-store.s3.amazonaws.com/0/78224/4bc01c36-2cb4-03ef-4ca6-267c99f2e4ff.png)

# ダウンロード

GUI版
　　  [kierutov1b.iso](http://k.fam.cx/dl/kierutov1b.iso "kierutov1b.iso")　 (md5sum:a89261fbabce1971e2a605d25fc1c2e0)
PowerShellを使って押されたキーを調べる


\[System.Console]::ReadKey() でもほとんどのキーを取得することができますが、修飾キー（ShiftやCtrlなど）とその他のキーの組み合わせを取得する関数なので、修飾キー単独では取得できません。

```
ユーザーの押すキーを取得する
> $key = [System.Console]::ReadKey()
(ここでF1キーを押す)

取得したオブジェクトの型を確認する
> $key.GetType().FullName
System.ConsoleKeyInfo

取得したキーを確認する
> $key.Key
F1
> $key.Key.value__
112
```

$Host.UI.RawUI.ReadKey() を使うと、すべてのキーを取得することができます。取得できるのはキーの番号なので、System.EnumクラスのGetNameメソッドを使ってConsoleKeyオブジェクトに変換できます。

```
ユーザーの押すキーを取得する
> $key = $Host.UI.RawUI.ReadKey()
(ここでF1キーを押す)

取得したオブジェクトの型を確認する
> $key.GetType().FullName
System.Management.Automation.Host.KeyInfo

取得したキーを確認する
> $key.VirtualKeyCode
112
> [System.Enum]::GetName([System.ConsoleKey], $key.VirtualKeyCode)
F1
```
Effective C++ (3rd) > 31項 > インタフェースクラス > 具体例

引用: Effective C++ 第3版

> Personをインタフェースクラスにすると、次のようになるでしょう。

```cpp
class Person {
public:
    virtual ~Person();
    virtual std::string name() const = 0;
    virtual std::string birthDate() const = 0;
    virtual std::string address() const = 0;
    ...
}
```

> 純粋仮想関数を持つクラスのオブジェクトを生成することはできないので、Personを使うときには、そのポインタか参照を使うことになります。
> ...
> また、インタフェースクラスを使うには、オブジェクトを生成しなければなりません。そのために、派生クラスのオブジェクトを生成する関数がよく使われます。そのような関数は、一般にファクトリ関数(13項を参照)とか仮想コンストラクタと呼ばれます。これはインタフェースクラスのインタフェースを持つオブジェクトを動的に生成し、そのポインタ(...)を戻す関数です。


上の実装例で"= 0"は純粋仮想関数。
[ローベルのC++教室](http://www7b.biglobe.ne.jp/~robe/cpphtml/html02/cpp02018.html)
Effective C++ (3rd) > 31項 > インタフェースクラス > 仮想でない関数の定義 > 継承によって変えるべきではない / NVI

引用: Effective C++ 第3版

> 仮想でない関数の定義は、継承によって変えるべきではありません。そのような関数は、インタフェースクラスに定義も書いてしまえば便利なわけです。

<hr>

直接関連するか分からないけど、NVI(Non Virtual Interface)というのがある。

http://codezine.jp/article/detail/7294
> - 「同じような処理があちこちにバラ撒かれる（Code Clone）ことを避けたい」
> - 「インターフェースの変更が実装に及ぼす影響を小さく抑えたい」
を実現するスタイルの一つがNVIです。
技術英語 > L, as in Log > Logの"L"

電話越しでアルファベットを言う時、きちんと相手に伝わらないことがある。

そういう時は各アルファベットについて
L, as in Log
のように言うと通じやすい。

Phonetic Alphabet Tablesというように各アルファベットがテーブルになっている。
http://www.osric.com/chris/phonetic.html

ただし、これらのテーブル記載のものは自分にとっては馴染みがない(unfamiliar)なものが多いので、頑張って覚えるよりも、適宜自分がパッと言える単語に置き換えるのでもいいと思う。

P, as in Penguin
Q, as in Quiz
など
CocoStudioのUIEditorで作ったListViewを使う（v2.2.6版)


今回はUI Editorで作ったUIのListViewの実装サンプルCocos2d-x v2.2.6版です。

kyokomiさんの記事を参考にしました。ありがとうございます。

cocos2d-x - CocosStudioのUIEditorで作ったListViewを使う - Qiita 
http://qiita.com/kyokomi/items/46ee2f7c92cf1d3342b8

これができれば、面倒なスクロール制御のUIも素早く作れるようになるでしょう！

まずはUiEditorのほうでListViewコンテナを設置します。
以下では黄色い帯の中に設置しています。
特別な設定はありませんが、倍率を上げるのではなく、サイズを変更で位置を調整しないと
実装のときに表示がおかしくなります。

![20150519_053937.jpg](https://qiita-image-store.s3.amazonaws.com/0/79490/12777998-abd0-b600-fbf0-07518db18271.jpeg)

次に、ListViewの中の表示するパーツを作ります。
キャンパスリストを右クリックで追加します。
この時前に作ったキャンパスとサイズが同じになってしまいますが、
左上のキャンパスサイズの設定で調整します。

![20150519_054011.jpg](https://qiita-image-store.s3.amazonaws.com/0/79490/a21555ac-f6a4-62d1-0a99-27f17ac3e470.jpeg)

できたら両方共エクスポートし、プロジェクトのResourceフォルダに突っ込みます。

コードは以下のようになります。
ListViewに入れる複数のテキストと画像を変更する操作をしているところがキモです。

まずはUI全体を表示。

```
    // UI設置
    gui::TouchGroup* ul = gui::TouchGroup::create();
    ul->addWidget(GUIReader::shareReader()->widgetFromJsonFile("CollectionView/CollectionView_1.json"));
    this->addChild(ul);
```

ほかのパーツは前回説明したので、はしょってListViewの設定にいきます。

v2.2.6ではCocoStudioで作ったパーツは「ウィジェット」という名前で扱われます。

配置したListViewは、名前指定で捕捉します。

```
    // ListView設定
    UIListView *pList = (UIListView*)ul->getWidgetByName("ListView_1");
```

次に、ListViewに入れるパーツを設定します。
Jsonを読み込んでパーツをインスタンス化し、さらにパーツの中のパーツを設定していきます。
設定時に、CocoStudioでつけたパーツの名前を使います。

最後に、pushBackCustomItem でListViewにパーツを突っ込みます。

```
	for (int i=0; i<10; i++) {
            UIWidget *listObj = GUIReader::shareReader()->widgetFromJsonFile("listObject/listObject.json");

            ((UILabel*)listObj->getChildByName("Label_1"))->setText("hogehoge");
            ((UIImageView*)listObj->getChildByName("Image_3"))->loadTexture("hogehoge.png");

            pList->pushBackCustomItem(listObj);
	}
```

実行でこんな感じになります。
（実際のゲーム用にちょっといじってあるので、表示は少し違います）

![20150519_060001.jpg](https://qiita-image-store.s3.amazonaws.com/0/79490/c816af3b-87b0-d9fd-d6b7-442be2fbdd64.jpeg)

このようなスクロール処理を手づけて作ったことがあるのですが、３日以上かかってました。
複雑なコーディング、設置の場所調整など、そうとう面倒です。

今回は３０分かかっていません。
CocoStudioで作ると非常に効率的です。

参考まで。
Good luck!
APTのコンパイル時間は煩わしいのか

## tl;dr

AndroidでAPTでガシガシコードを生成してもキャッシュがあればそこまで問題ないはず．

## APT

最近のAndroidのライブラリの隆盛を見ていると、[Dagger2](http://google.github.io/dagger)や[AutoValue](https://github.com/google/auto/tree/master/value)等アノテーションプロセシングを利用してコンパイル時にソースコードを生成する手法が多いように見受けられます．
パフォーマンス観点やコンパイル時にバグを発見できる利点を考えれば至極当然とも言えますが、コンパイル時に延々とソースコードを生成する事で開発生産性を落とすリスクはないのか、小さなアプリを作成して検証してみました．

### リポジトリ

今回、アプリ起動→データを非同期でDBに投入→そのDBからデータを取得→ListViewに表示という至極簡単なアプリを作成しました．
apt moduleではDIにDagger2, シンタックスヘルパーに[retrolamda](https://github.com/orfjackal/retrolambda), ORMに[DBFlow](https://github.com/Raizlabs/DBFlow)を利用し、runtime moduleではORMのみ[ActiveAndroid](http://www.activeandroid.com/)を利用しています．非同期処理には両者とも[RxAndroid](https://github.com/ReactiveX/RxAndroid)を利用しています．RxAndroidはAPTとは一切関係ありませんね．
※特に意味はないですがORMのTransactionは不使用です．

https://github.com/hotchemi/apt-profile

### 検証環境

- MacBook Air (13-inch, Early 2014)
- Processor: 1.4 GHz Intel Core i5
- Memory: 4 GB 1600 MHz DDR3

### 検証結果

キャッシュ有りとキャッシュ無しの2パターンを各モジュールに対して検証します．
カジュアルに5回ずつ計測しました．

#### apt/キャッシュなし
一番遅い結果に．

```
./gradlew clean apt:installDebug --profile
```

- 1回目: Total time: 50.222 secs
- 2回目: Total time: 1 mins 2.961 secs
- 3回目: Total time: 56.094 secs
- 4回目: Total time: 51.708 secs
- 5回目: Total time: 58.114 secs

#### apt/キャッシュあり

cleanしない版．初回のみ遅かったですが2回目以降はキャッシュが効いています．

```
./gradlew apt:installDebug --profile
```

- 1回目: Total time: 40.626 secs
- 2回目: Total time: 15.505 secs
- 3回目: Total time: 14.077 secs
- 4回目: Total time: 13.445 secs
- 5回目: Total time: 14.545 secs

#### runtime/キャッシュなし

キャッシュが無い状況下では当然ですがruntime moduleの方が速かったです．

```
./gradlew clean runtime:installDebug --profile
```

- 1回目: Total time: 39.917 secs
- 2回目: Total time: 46.036 secs
- 3回目: Total time: 38.881 secs
- 4回目: Total time: 38.833 secs
- 5回目: Total time: 37.06 secs

#### runtime/キャッシュあり
aptモジュールより僅かに速いですが無視できる範囲です．

```
./gradlew runtime:installDebug --profile
```

- 1回目: time: 14.02 secs
- 2回目: Total time: 14.019 secs
- 3回目: Total time: 14.687 secs
- 4回目: Total time: 13.702 secs
- 5回目: Total time: 13.63 secs

## まとめ

今回の実験では、キャッシュが効いている状況下であればaptでも通常のコンパイルと遜色ない結果となりました．
但し、今回作成したアプリは超小規模＆DBやレトロラムダも僅かな箇所しか使っていないので、プロダクトレベルまでコードベースが膨れてくるともしかしたら体感できる差が現れるかもしれません．
Android Studioでポチポチして開発してしまうと余計なコマンドが発行されて遅くなると思うのでコマンドで開発した方が良いと思います．
D言語のハッシュモジュールのパフォーマンス


[Vasily's blog: Computing cryptography hashes: Rust, F#, D and Scala](http://vaskir.blogspot.jp/2015/04/computing-cryptography-hashes-rust-vs-f.html)

この記事見て，D言語のハッシュ実装ってそんなに変な実装だったかな？とソースを見たけど特別遅そうな実装には見えない．で，よくよく考えたらdmdってこの手のヘビーな計算関係の最適化弱かったなぁと思い出したので，LLVMをバックエンドにしているldcで試したらRustとほぼ同じ速度だった(少し速い)ので安心した，という単なるメモ記事．

## Rust

`Duration`の出力が見えにくかったので，msに変更．Rust 1.0.0とrust-cryptoは0.2.31を使った．

```rust
extern crate crypto;
extern crate time;
 
use crypto::md5::Md5;
use crypto::sha1::Sha1;
use crypto::sha2::{Sha256, Sha512};
use crypto::digest::Digest;
use time::now;
 
fn bench<T: Digest>(name: &str, digest: &mut T, input: &Vec<u8>) {
    let started = time::now();
    for _ in 1..100 {
        digest.input(&input);
        digest.reset();
    }
    let elapsed = time::now() - started;
    println!("{:?} elapled {:?}", name, elapsed.num_milliseconds());
}
 
fn main() {
    let input = vec![0u8; 10000000];
    bench("MD5", &mut Md5::new(), &input);
    bench("SHA1", &mut Sha1::new(), &input);
    bench("SHA256", &mut Sha256::new(), &input);
    bench("SHA512", &mut Sha512::new(), &input);
}
```

結果:

```
"MD5" elapled 1977
"SHA1" elapled 1812
"SHA256" elapled 4524
"SHA512" elapled 2678
```

## D言語

Rustの実装に合わせて，`finish`じゃなくてRustの`reset`相当の`start`にした．

```d
module main;
 
import std.stdio;
import std.digest.md;
import std.digest.sha;
import std.datetime;
 
void bench(T)(string name, T digest, const ubyte[] input) {
        auto sw = StopWatch(AutoStart.yes);
        for (auto i = 0; i < 100; i++) {
                digest.put(input);
                digest.start();
                //auto hash = digest.finish();
        }
        sw.stop();
        writefln("%s - %s ms elapsed.", name, sw.peek.msecs);
}
 
void main(string[] args)
{
        auto input = new const ubyte[10_000_000];
        MD5 md5; bench("MD5", md5, input);
        SHA1 sha1; bench("SHA1", sha1, input);
        SHA256 sha256; bench("SHA256", sha256, input);
        SHA512 sha512; bench("SHA512", sha512, input);
}
```

dmd 2.067での結果:

```
MD5 - 8363 ms elapsed.
SHA1 - 16611 ms elapsed.
SHA256 - 35451 ms elapsed.
SHA512 - 24743 ms elapsed.
```

ldc2-0.15.2-beta1での結果:

```
MD5 - 1970 ms elapsed.
SHA1 - 1676 ms elapsed.
SHA256 - 4273 ms elapsed.
SHA512 - 2964 ms elapsed.
```

多分gdcでもldcに近いパフォーマンス出るはず．数値計算とかにD言語使っている人達がgdc/ldcを使いまくっているの，これは仕方ないなという感じですね…
ConohaのAPIを試してみる

## 概要

Conohaが新しくなってAPIもあるみたいなので試してみる。

## APIユーザ作成

ConohaのダッシュボードからAPIユーザを作成


## OpenStackクライアントのインストール

```shell-session

brew install python
pip install python-novaclient
```

## 環境変数ファイル作成と読み込み

```text:openrc.sh

export OS_USERNAME=APIユーザ名
export OS_PASSWORD=APIパスワード
export OS_TENANT_NAME=テナント名
export OS_AUTH_URL=https://identityHost:portNumber/v2.0
```

```shell-session

source openrc.sh

```

## 動作確認

### サーバ作成

flavorをnameで指定したときにエラーになったので、IDを指定した。

```shell-session
nova boot test --image gncvmi-centos-7.1-x86_64 --flavor 7eea7469-0d85-4f82-8050-6ae742394681
```

### サーバ削除
```shell-session
nova delete servername
```

### サーバ一覧
```shell-session
nova list
```

### イメージ一覧
```shell-session
nova image-list
```

###  構成一覧
```shell-session
nova flavor-list
```

## 参考

[OpenStack RC ファイルを用いた環境変数の設定](http://docs.openstack.org/ja/user-guide/content/cli_openrc.html)
JavaScriptでデフォルト引数

jsでデフォルト引数使いたい時

```js:yasyoku.js
;(function(){

    // 夜食食べる
    var eatMidnightMeal = function(aMeal){
        aMeal = aMeal || 'ラーメン';
        console.log(aMeal + '食べる');
    };

    eatMidnightMeal(); // ラーメン食べる
    eatMidnightMeal('ポテチ'); // ポテチ食べる

    /*
    aMeal = aMeal || 'ラーメン';

    aMealが存在したらaMeal、 
    なかったらラーメンが代入される。
    */
})();
```

以上。
使い捨てのチェックリストを生成するWebサービスとHubotスクリプト

# Why, What, How

所属している会社には、毎月1日に利用している端末からWebサービス、その他諸々のパスワードを変更して、メールでマネージャーに報告しなければいけないという決まりがある。マネージャーは受け取ったメールを検索して「誰々がまだ変更してないからメールで催促して―」といったことをしないといけないので、メールは決まったフォーマットで送らなければならない。

パスワード変更を義務付ける前に2段階認証を義務付けて欲しいこととか、パスワードを毎月変えるとどれぐらいセキュリティ上の安全性が高まるのかっていう話をBizの偉い人たちに持ちかける事はもう諦めてしまったので、そのクリエイティブさを感じない運用方法だけでもどうにかできないかと、

https://chcklst.herokuapp.com/

https://github.com/bugcloud/chcklst
https://gist.github.com/bugcloud/6f788316658a63328f63
を書いた。
タイトルの通り、**「使い捨てのチェックリストを生成するWebサービス」**と**「そのクライアントとして動作するHubotスクリプト」**

GitHubのIssueやPull Requestにチェックリストをつけるのが便利でよく使っているので、その部分だけをWebサービス化した。

![image](https://qiita-image-store.s3.amazonaws.com/0/3063/3f88701b-62b7-5bcb-71d2-c933da838e64.png)

こんな感じにHubotにお願いすると、

![image](https://qiita-image-store.s3.amazonaws.com/0/3063/e95eb6b6-7d64-d4c7-ef8c-470a6bba31f1.png)

こういうページが返ってくる。あとはみんなでチェックするだけ。チェック状態は保存される。

# hubot-cronで定期的にチェックリストを発行して通知する

[hubot-cron](https://github.com/miyagawa/hubot-cron)を使うことで「月の初めにチェックリストを発行して全員に通知」というのが自動化できる。
所属の会社ではチャットツールにHipChatが使われていて、Hubotが自身のHubotタスクを呼び出すことができないため、ひと工夫が必要。[HipChat Bot Lab](http://botlab.hipch.at/)にいる*Hearsay*を利用する。

## cronに固定メッセージを登録

```
@hubot new job 30 9 1 * * @all パスワード更新の時間です。update password
```

のような感じに、毎月1日に全員宛てに固定のメッセージが飛ぶようにする。

## Hearsayが固定メッセージに反応してHubotタスクを実行する

Hearsayの設定を

![image](https://qiita-image-store.s3.amazonaws.com/0/3063/decad50b-18c8-845e-fed3-271055b2d14c.png)

こんな感じにして、固定メッセージをトリガーにHubotタスクでチェックリストを発行する。

![20150519022254.png](https://qiita-image-store.s3.amazonaws.com/0/3063/4933e777-5a4c-11a5-267b-ba7b3e77afcc.png)



これで毎月1日にパスワードを更新したかどうかを確認するためのチェックリスト生成が自動化できた。
JavaScript  bind,call,apply入門！

Js特訓中、標題の件で悩んだのでメモります。

bind,call,applyは
簡単に言うと　なりすましができます。
持ってない機能を使えます

「thisの値を束縛する。」
「レシーバーオブジェクトを変更する。」なんて言うそうです。

具体例として下記コードで　ペンギンに空を飛ばせます。

```js:penguinFly.js
// ペンギンくん
var Penguin = {
    name: 'ペンギン',
};

// 鷹
var Falcon = {
    name: '鷹',
    fly: function(){
        console.log(this.name + 'が大空を飛びました');
    }
};

Falcon.fly();  // '鷹が大空を飛びました
```

鷹は空を飛べるので、flyという関数を持っています。
ではまず、callとbindを使ってペンギンに空を飛ばせます。

```js:penguinFly.js

// call 
Falcon.fly.call(Penguin); // ペンギンが大空を飛びました

// bind は一旦変数にしまって使う
var flyPenguin = Falcon.fly.bind(Penguin); 
flyPenguin(); // ペンギンが大空を飛びました

```
第一引数にthisにしたい値を入れて使います。
下記のように使うと引数を渡すこともできます。

```js:penguinFly.js
// 引数ありバージョンに変更
Falcon.fly = function(aComment){
    console.log(this.name + 'が' + aComment + '大空を飛びました');
}

// call
Falcon.fly.call(Penguin, '元気よく');
// ペンギンが元気よく大空を飛びました

// bind
var flyPenguin = Falcon.fly.bind(Penguin, '元気よく');
flyPenguin();
// ペンギンが元気よく大空を飛びました
```

applyは基本的に使い方は同じですが、配列を渡せます。

```js:penguinFly.js
Falcon.fly = function(comment1, comment2){
    console.log(this.name + 'が' + comment1 + comment2 + '大空を飛びました');
}

//call
Falcon.fly.call(Penguin, '思い切って', '元気よく');
// ペンギンが思い切って元気よく大空を飛びました

// apply 
Falcon.fly.apply(Penguin, ['思い切って', '元気よく']);
// ペンギンが思い切って元気よく大空を飛びました

```

以上です、
変なとこあったらご指摘ください〜
http://qiita.com/setzz/items/155af03120a330fd4437
これもわかりやすかったです！
Grandstream GXP2130設定

Grandstream社のSIP電話、[GXP2130](http://www.grandstream.com/index.php/products/ip-voice-telephony/enterprise-ip-phones/gxp2130
)の設定について。

## 設定ファイルの作成方法

1. [Grandstream社のサイト](http://www.grandstream.com/support/tools)から、Configuration Templateを落としてくる。
2. ZIPファイルを展開したら、使っている機種の設定ファイル（GXP2130ならgxp2130_40_60_config_1.0.4.23.txt）を編集する。
3. XML Configuration File Generatorで設定ファイルをXMLに変換する（変換方法はいずれ書く）
4. できあがったXMLファイルをTFTPサーバーに配置する

## 編集のコツというか心がけ

* デフォルトからいじりたいところだけ変更する。
* 設定ファイルでデフォルト値がコメントアウトせずに入っているところも、一旦コメントアウトして、カラッポのXMLから始める方が混乱しない。

## SIP

P270: 電話機に表示される名前

    P270 = OpenPBX

P47: SIPサーバーのアドレス

    P47 = 192.168.1.100

P35: SIPのUser ID
XML Configuration File Generatorで上書きされるので、ダミーの内容を入れておく。

    P35 = xxx

P36: SIPのAuthenticate ID
XML Configuration File Generatorで上書きされるので、ダミーの内容を入れておく。
内容がよくわからない場合は、User IDと同じ値を入れておくとうまくいくと思います。

    P36 = xxx

P34: SIPのパスワード
XML Configuration File Generatorで上書きされるので、ダミーの内容を入れておく。

    P34 = xxx

## 音

GUI上だと「設定 - 着信音」から

P343: ダイヤル音（受話器を上げたときの音）

    P343 = f1=400,f2=400,c=25/25;

P346: 呼び出し音

    P346 = f1=440,f2=415,c=100/200;

P348: 通話中トーン（相手が通話を切ったときの音）

    P348 = f1=400,f2=400,c=50/50;

P349: 再送信音（話中音）

    P349 = f1=400,f2=400,c=50/50;


## 言語

P1362: 表示言語（ja=日本語）

    P1362 = ja

## LCD表示

P335: 無操作時におけるバックライトの明るさ(10-100)

    P335 = 10

P2918: 無操作時にスクリーンセーバーを起動するかどうか(0=起動しない, 1=起動する)

    P2918 = 0

P1404: LCD画面に為替相場を表示するかどうか(0=表示しない, 1=表示する)

    P1404 = 0

## Bluetooth

設定ファイルのテンプレートには記載がないが、Bluetoothのon/offも設定できる。

P2910: Bluetoothを有効にするか(0=無効, 1=有効)

    P2910 = 0
cocos2dx v2.2.6 において、UI Editor で作ったUIを動かすコード

cocos2dxにおいて、やはり作るゲームはリッチな画面にしたいものです。
で、手付けで画像やスプライトを配置したり、アニメーションさせようとするとそれはもう莫大な時間がかかる。

そこで、CocoStudioのAnimation editor や UI Editor を使って、
すばやくリッチな画面を作ろうということになるわけですが、cocos2dxのコードは名前が変わったり、
関数が廃止になったり、ソースファイルがもうなくてウェブのサンプルが動かなかったみたいなことがあります。

で、今回はcocos2dxのv2系の最後である（だろう）2.2.6でのUI Editorでエクスポートしたデータを
動かすコードです。

まずは最低限、表示、アニメーション、ボタンの動作を実現します。

ウェブにもいろいろコードがありましたが、v3系だったり、v2.2系で名前が変わってたりすでに関数がなかったりしました。
UILayer関数は2.2.6ではもう存在しません。

ですので、おそらく2.2.6でのコードは日本語ではレアじゃないかと思います（2015/05/19現在）。

まずはヘッダで、

```
using namespace cocos2d::extension;
using namespace cocos2d::ui;
```

としてください。
これがないとエラーがバリバリ出ます。

まずはUIの表示です。
Jsonファイルを指定するときにはResourceフォルダのフルパス指定します。

```
    gui::TouchGroup* ul = gui::TouchGroup::create();
    ul->addWidget(GUIReader::shareReader()->widgetFromJsonFile("CollectionView/CollectionView_1.json"));
    this->addChild(ul);
```

次にアニメーションの開始です。
UIのアニメーションは、作ったアニメごとに動作を制御します。

Jsonファイルの指定は、Resourceフォルダのフルパスではないことに注意。
フォルダ名を入れると動かないしエラーも出しません。
ここでハマりました。

「Animation0」は、UI Editorでつけたアニメの名前です。

```
    ActionManager::shareManager()->playActionByName("CollectionView_1.json","Animation0");
```

最後にボタンの飛び先の指定です。
「Button_1」はUI Editorでつけたボタンの名前です。
toucheventselector はnamaespace cocos2d::ui してないと使えないのでハマります。

```
    UIButton *pButton = (UIButton*)ul->getWidgetByName("Button_1");
    pButton->addTouchEventListener(this, toucheventselector(CollectionScene::buttonCallback));
```

以上でした。
参考まで。
Good luck!
さくらVPS LAMP環境構築:超入門（躓いたところメイン）

さくらVPS LAMP環境構築する過程で躓いたところのエラーと対処方を書いていきます。

ドットインストールのさくらVPS入門動画を見ながらやってます。。。
http://dotinstall.com/lessons/basic_sakura_vps/8001

vps借りる契約は済んでいるものとします。


#1 sshに接続してみる

## ssh接続ができない:port22が解放されていない 

```lang:エラー。sshで接続しようとするとこんな感じでprot22に接続できないエラーが発生する
maru:~ shirakawa$ ssh root@153.120.1.123
ssh: connect to host 153.120.1.123 port 22: Connection refused
```

```lang:対処法
vpsの管理画面に行き、サーバーを強制再起動じゃ＞＜
強制再起動でだめならOS再インストールじゃ＞＜
```

## ssh接続ができない:長いエラー( WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!)が発生する

```lang:エラー。こんなエラーがでる
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.

The fingerprint for the RSA key sent by the remote host is
xx:xx:xx:xx:xx:xx:xx:xx:xx:

Please contact your system administrator.

Add correct host key in /Users/paspasasaa/.ssh/known_hosts to get rid of this message.
Offending key in /Users/paspasasaa/.ssh/known_hosts:6

RSA host key for xxx.xxx.xxx has changed and you have requested strict checking.
Host key verification failed.
```

```lang:対処法
sshの履歴？にOS再インストールする前の情報??が残っているのが問題。なのでsshの履歴?を削除する。
vi ~/.ssh/known_hosts
vimでknown_hostsを開く。ー＞全て削除じゃ＞＜
```



#2 yum update しよう
```lang:方法
sshログインした状態で
yum update
コマンドを打つ
```
5秒くらいで終わる

#3 サーバー環境の言語を日本語に設定する
```lang:方法
vim /etc/sysconfig/i18n
で言語ファイル？を開く
LangのところをCからja_JP.UTF-8に変更する
```

#4 ユーザーの追加(+パスの追加)
```lang:方法
useradd ユーザー名
これでユーザーを追加できる！簡単！root権限でずっと遊んじゃダメ＞＜
passwd ユーザー名
これでユーザー名にパスを付けられる！簡単！
```

#5 新規ユーザーでsudoできるようにする
```lang:方法
usermod -G wheel ユーザー名
visudo
コマンドを押してsudo管理ファイル？を開く
## Allows people in group wheel to run all commands
の次の行がコメントになっているのでコメントを外す(wheelグループの権限を解除する)

これだけ
```

#6 sshログインの時に秘密鍵＋公開鍵とかを使ってログインできるようにする


長くなったので割愛

(自分用メモ:Evanote見てね)
bundle installでNo pg_configと言われる解決方法。

Gemfileに`pg`というgemを追加してbundle installをしたところ失敗しました。
環境はVagrantのCentOSです。

# bundle installが失敗

```bash:postgresqlがなくて失敗
bundle install

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /home/vagrant/.rbenv/versions/2.2.2/bin/ruby -r ./siteconf20150518-3729-805ug4.rb extconf.rb
checking for pg_config... no
No pg_config... trying anyway. If building fails, please try again with
 --with-pg-config=/path/to/pg_config
checking for libpq-fe.h... no
Can't find the 'libpq-fe.h header
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

略

An error occurred while installing pg (0.18.2), and Bundler cannot continue.
Make sure that `gem install pg -v '0.18.2'` succeeds before bundling.
```
postgresqlが入っていないので入れるといいみたいです。

# postgresqlをインストール

```
sudo yum install -y postgresql-devel
```
今度はbundle installが走るようになりました。

# 参考
http://stackoverflow.com/questions/6040583/cant-find-the-libpq-fe-h-header-when-trying-to-install-pg-gem
Slackのトピックに色をつけて目立たせる裏ワザ？

Slackの#generalチャネルを告知用にしているので、雑談をそこでしないでほしいかったり、チャネルごとに用途があったりすると、その説明をチャネルの見えるところに書いておきたいと感じます。

## トピック機能でチャネルの説明を書ける

Slackにはトピックという機能があり、`/topic`コマンドで設定することができます。トピックを設定すると、そこにチャネルの説明を表示することができます。

```
/topic 【みんなへのお知らせ】このChには告知以外は書き込まないでください
```

![Slack.png](https://qiita-image-store.s3.amazonaws.com/0/889/7bd565a5-fb73-1977-6e5d-929070b87864.png)

ご覧のように、チャネル名の右側にトピックが表示されます。ところが、トピックの色が灰色で若干目立ちません。きっとトピック機能を使っている人の中には「トピックに色が付けられたらなぁ〜」と感じている人もいるのではないでしょうか？

## 目立たせるには絵文字やMarkdownのパワーを借りる

実は、Slackのトピックの中でも絵文字やMarkdownを使うことができます。ということは、 「:blue_heart::green_heart:おしらせ:yellow_heart::purple_heart:」のように絵文字でかこって目立たせたり、トピックを「**太字**」にしたり「`コード`」にして字体を変えることができます。

先ほどの目立たなかった「みんなへのお知らせ」も絵文字とMarkdownを駆使するとこうなります。

```
/topic  *`【みんなへのお知らせ】このChには告知以外は書き込まないでください`:bow:*
```

Before
![Slack.png](https://qiita-image-store.s3.amazonaws.com/0/889/038788da-dfab-d329-7f3b-294167dafed8.png)

After
![Slack.png](https://qiita-image-store.s3.amazonaws.com/0/889/ac062e6c-4d0c-0cff-6b91-fec0a034780c.png)


いかがでしょうか？みなさんも、トピックを目立たせてたいことがあれば、是非ためしてみてください:bow:

## 付録

いろいろなトピックの目立たせの例を付録にまとめます。

```
/topic `雑` `談` `チ` `ャ` `ン` `ネ` `ル`
```
![Slack.png](https://qiita-image-store.s3.amazonaws.com/0/889/e690f86d-5ec8-ed89-d6a5-7f6e9b878c74.png)


カスタム絵文字と組み合わせる

![Slack.png](https://qiita-image-store.s3.amazonaws.com/0/889/2199068c-570a-2265-9c49-2bc3651ce27f.png)
Jenkins + Gitbucket したら unknown option local のエラー

そこそこハマった。

![WS000197.JPG](https://qiita-image-store.s3.amazonaws.com/0/78250/73db3581-131d-d9d2-156a-6c2edf724b86.jpeg)

URL は当然ですがダミーです。
こんな感じのエラーが出ました。

調べたところ、こういった文脈が。

[http://stackoverflow.com/questions/23104110/unknown-option-git-config-local-reported-by-jenkins](http://stackoverflow.com/questions/23104110/unknown-option-git-config-local-reported-by-jenkins)

```lang:StackOverflow
The problem was that Git was outdated, and version that comes with CentOS didn't support the --local option for git config.
Updating git to version 1.7.12 solved the issue.
```

当方 centos6.6 の rpm(yum) で git を入れてました。

```lang:shell
$ git --version
git version 1.7.1
```

古かった。。

なので、Git を make build する。

```lang:shell
$ sudo yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel
$ curl -L -O https://www.kernel.org/pub/software/scm/git/git-2.4.1.tar.gz
$ tar xfz git-2.4.1.tar.gz
$ cd git-2.4.1
$ ./configure --prefix=/usr/local/git-2.4.1
$ make
$ sudo make install
```

rpm はアンインストールせず、binary を差し替える方向で。
この差し替えはその他の動作互換まで確認できてませんが、こちら今のところ特に問題なく Jenkins + Gitbucket は動いてます。

```lang:shell
$ sudo ln -s /usr/local/git-2.4.1 /usr/local/git
$ sudo mv /usr/bin/git /usr/bin/git-1.7.1
$ sudo ln -s /usr/local/git/bin/git /usr/bin/git
$ git --version
git version 2.4.1
```

再度 Jenkins ジョブ登録を試し、当初のエラーが発生しないことを確認。
Ansible で shell に変数っぽいものを使うなら環境変数が安心

これを実行しても `/tmp/a b c` というファイルは作成されません。`/tmp/a` と `b` と `c` が作成されます。

```yaml
---
- hosts: localhost
  gather_facts: no
  tasks:
    - shell: touch -- {{ item }}
      with_items:
        - "/tmp/a b c"
```

引用符で囲ったところで変数に引用符が含まれているとやっぱりダメです。

```yaml
---
- hosts: localhost
  gather_facts: no
  tasks:
    - shell: touch -- '{{ item }}'
      with_items:
        - "/tmp/a ' b ' c"
```

環境変数を経由すると安心です。

```yaml
---
- hosts: localhost
  gather_facts: no
  tasks:
    - shell: touch -- "$fn"
      with_items:
        - "/tmp/a b c \r\n!\"#$%&'()-=^~\\|@`[{;+:*]},<.>?_"
      environment:
        fn: "{{ item }}"
```

---

例として touch を使ってますが、もちろん touch するだけなら file モジュールでできます。
ブラウザからiOSアプリを立ち上げられるようにする Xcode6設定

##カスタムURLスキームを設定すると
ブラウザのリンクからiOSアプリを起動できます。

##設定方法
![150518_xcode.png](https://qiita-image-store.s3.amazonaws.com/0/24420/26621aaf-f31b-5e79-bf9b-2553e2d60db3.png)

1.infoを選択
2.URL Typesの左の三角をクリックして開く。最初は下位の設定ひとつもなく数字は(0)
3.下のプラスマークをクリック
4.設定項目がでたら、Identifierを設定。アプリのIDと同じでOK
5.URL Schemes を設定。たとえば、ここで「chemimodel」と入力する。

以上。
この設定をしてビルドすると、HTMLから

```
<a href="chemimodel://">アプリ起動</a>
```
とリンクを張れば、アプリが起動する。
Ansible で with_fileglob にマッチしたファイルをコマンドで変換して copy する

`with_fileglob` にマッチしたファイルを、ローカルのコマンドで変換して `copy` でリモートにコピーする方法。

下記の例ではファイルの先頭 3 行だけをコピーします。

```yaml
---

- hosts: localhost
  gather_facts: no
  tasks:

    - shell: head -3 -- "$fn"
      delegate_to: localhost
      with_fileglob:
        - files/*.conf
      environment:
        fn: "{{ item }}"
      always_run: yes
      changed_when: no
      register: res

    - copy:
        dest: "/tmp/{{ item.item | basename }}"
        content: "{{ item.stdout }}"
      with_items: res.results
```

## 解説

- `shell` でコマンドでファイルを加工して標準出力に出す
  - `with_fileglob` でマッチしたファイルを対象にする
  - `item` にはローカルの絶対パスが入っている
  - `delegate_to` でローカルでの実行を指定
  - 上書きするとローカルのファイルが上書きされるので注意
  - 結果を `res` 変数に入れる
- `copy` でファイルをリモートに書き込む
  - `res.results` に `with_fileglob` の繰り返しの各結果が入っている
  - `with_fileglob` の `item` も `item` に入っている（なので `item.item`）

## 注意

- ファイルにマルチバイト文字が含まれると化けます
- 本当は UTF-8 -> Shift_JIS がやりたかったのだ・・・
krpanoメモ

krpanoを使ってみたメモ

###はじめに

krpanoとは、dmmやVR系のウェブサイトで広く使われている（2015年5月現在）360度プレイヤー。

基本はパノラマ静止画のビューワーだが、pluginが多数用意されていて、これらを使うと、360度動画の再生や、スマホのジャイロ機能の連動なども手軽にできる。

再生やセッティングに独自のxmlファイルを使うので、最初少し使い方にクセがある。

jsに慣れてるなら、なるべくjavascript interfaceの.call()からkrpano Actionsと呼ばれる独自関数を呼ぶのがわかりやすい？


###基本

情報はあまりないので、基本的には公式ドキュメントを見ながら、exampleファイルを探り探りいじっていくことになる。

**公式サイト**
http://krpano.com/

**krpanoの使い方マニュアル - 360°パノラマVRニュース**
http://panorama.poo.tokyo/krpano-manual/
krpanoについて日本語でまとめられた良記事を載せてくれています。

---

###htmlにkrpanoの読み込み

HTMLファイルの、bodyタグ内に以下を記述。
<code>
	<script src="./embedpano.js"></script>

	<div id="pano" style="width:100%;height:100%;">
		<noscript>
			<table style="width:100%;height:100%;">
				<tr style="vertical-align:middle;"><td>
					<div style="text-align:center;">
						ERROR:<br/><br/>Javascript not activated<br/><br/>
					</div>
				</td>
			</tr></table>
		</noscript>
		<script>
			embedpano({
				swf:"./krpano.swf",
				id:"krpanoObj",
				xml:"./vid360.xml",
				target:"pano",
				html5:(document.domain ? "prefer" : "auto"),
				passQueryParameters:true
			});
			init();
		</script>
	</div>
</code>

---

###XMLファイルの記述

公式リファレンス：　http://krpano.com/docu/xml/

以下、上記　 **embedpano({..., xml:"./vid360.xml", ...})**　で読み込んだvid360.xmlの中身の一部。

---

一番外側のタグ
`<krpano version="1.18" bgcolor="0x000000">
</krpano>`

---

外部xmlの読み込み
例："skin"というフォルダに入った"videointerface.xml"を読み込み
`<include url="skin/videointerface.xml" />`

---

pluginの読み込み
各pluginの詳細は[公式ページ](http://krpano.com/plugins/)を参照
`<plugin name="xxxx"/>`

---

actionの定義
`<action name="my_action">xxxxxx</action>`

タグの間にactionを定義する。基本的な書き方はjsと同じだが、krpano用の、[krpano action](http://krpano.com/docu/actions/)が使える。
ここで定義したactionは他のactionや、javascript APIの**.call()**などから呼ぶことができる。


---

###javascriptからkrpanoを操作する
公式リファレンス:　http://krpano.com/docu/js/

---

####基本：krpanoオブジェクトの呼び出し

javascriptからは、getElementByIdでkrpanoオブジェクトにアクセスできる。

**document.getElementById(*id*)**

idは、最初に　**embedpano({id:xxx})**　で指定したもの。
毎回、getElementByIdで取得するのも面倒なので、**krpano()**という関数を作っておくと便利。
<pre>
function krpano(){
	return document.getElementById("krpanoObj");
}
</pre>

---

####プラグインへのアクセス

**plugin[*pluginname*]**

---

####主なAPI
基本的に以下の３つ。
実際の各操作は.call()でkrpanoのactionsを呼ぶことになる。

---

**.get(*variable:string*);**
※variableは、文字列として指定することに注意

例：Videoplayer pluginから、loadbytes変数の値を取得。
<pre>
krpano().get("plugin[video].loadedbytes");
</pre>

---

**.set(*variable:string*, *value*);**
※variableは、文字列として指定することに注意

例：gyro pluginのenabled変数をfalseに設定。
<pre>
krpano().set("plugin[gyro].enabled", false);
</pre>

---

**.call(*action:string*);**
※actionは、文字列として指定することに注意

例：Videoplayer pluginのpause()関数(action)を呼ぶ。
<pre>
krpano().call("plugin[video].pause();");
</pre>


どんなactionsがあるかなどの詳細は以下
↓↓↓
Krpanoのリファレンス
http://krpano.com/docu/actions/

Videoplayer pluginのリファレンス
http://krpano.com/plugins/videoplayer/

Gyro pluginのリファレンス
http://krpano.com/plugins/userplugins/fieldofview/gyro/


---

###プロダクト版のユーザー登録

試用版では、画面にwatermarkがつく。解除にはプロダクト版の購入が必要。

プロダクト版を購入すると、メールでライセンスコードが送られてくる。

公式サイトからダウンロードしたファイル一式の中に**krpano Tools.app** (macosxの場合)というアプリが入っていて、その中の"Settings"でライセンスコードを入力すると、watermarkのないjsファイルなどが生成される。
カレントディレクトリ以下のファイルをワンライナーで圧縮

超メモ
カレントディレクトリ以下のログファイルを個別にgzip形式に圧縮。

なお、ファイル名に空白が混じることは考慮していないです。

```shell
find . -name "*.log" | xargs gzip
```
cocos2d::CC～ は deprecated らしい

Cocos2d-x 3.6 にて。

## cocos2d::CCDrawNode は deprecated らしい

```cpp
#include "cocos2d.h"

void f()
{
    cocos2d::CCDrawNode* p = NULL;
}
```
これをコンパイルすると、

```text
warning C4996: 'cocos2d::CCDrawNode': was declared deprecated
    ....\deprecated\ccdeprecated.h(672) : see declaration of 'cocos2d::CCDrawNode'
```
って言われる。

## ヘッダ
Warningメッセージが親切では無いよね。。。該当ヘッダ見てもよく分からん。

```cpp:ccdeprecated.h(672)
CC_DEPRECATED_ATTRIBUTE typedef DrawNode CCDrawNode;
```

## 対策
CC を削れば良かった。

```cpp
cocos2d::CCDrawNode* p = NULL; // warning
```
　↓

```cpp
cocos2d::DrawNode* p = NULL; // no warning
```

## 「CC」でググったら情報見つかった。
[cocos2d-x version2.2.3からversion3.2rc0への移行メモ - よく寝てちょっと食べる](http://d.hatena.ne.jp/laynts/20140804/p1)

> 基本的にCCプレフィックスを削除
>
> 基本的にクラスのCCプレフィックスを削除する
> ただし例外として、以下のクラスやマクロについてはプレフィックスを削除するだけではない
Qiitaで色々なフォントを使う

QiitaはMarkdownを用いて文章を書いて投稿するツールですが、Qiitaでフォントをいじれるという秘密に気がついている人は少ないのではないでしょうか。今回はQiitaが数式を書くために採用している[MathJax](https://www.mathjax.org/)を使って、色々なフォントに挑戦してみました。
また、このページには載っていないが「このようなテクニックを知っている」というものがありましたら、お気軽にコメントや編集リクエストでご指摘ください。


> このページで紹介しているソースコードはやむを得ない事情で`U+200c`（‌ZERO WIDTH NON-JOINER）が混入しています。**コピペしても動かない可能性がある**ので、気をつけてください。（手動で入力するか、エディタなど機能で取り除くとよいでしょう。）

# フォントサイズ

````latex
```math
\def\textlarge#1{%
  {\rm\Large #1}
}
\def\textsmall#1{%
  {\rm\scriptsize #1}
}
​​​​​​​​```‌​‌‌

This is $\textlarge{Large}$
This is $\textlarge{Small}$
````

```math
\def\textlarge#1{%
  {\rm\Large #1}
}
\def\textsmall#1{%
  {\rm\scriptsize #1}
}
```

This is $\textlarge{Large}$
This is $\textsmall{Small}$

# 色

```latex
This is $\color{red}{\rm Red}$
This is $\color{blue}{\rm Blue}$
```

This is $\color{red}{\rm Red}$
This is $\color{blue}{\rm Blue}$

# STIXGeneral

````latex
```math
\def\textrm#1{%
  {\rm #1}
}
​​​​​​​​```‌​‌‌

This is $\textrm{STIXGeneral}$
````

```math
\def\textrm#1{%
  {\rm #1}
}
```

This is $\textrm{STIXGeneral}$

# Blackboard Bold

```latex
This is $\mathbb{Blackboard Bold}$
```

This is $\mathbb{Blackboard Bold}$

# Small Caps

````latex
```math
\def\textsc#1{\dosc#1\csod}
\def\dosc#1#2\csod{{\rm #1{\scriptsize #2}}}
‌```

This is $\textsc{SMALL} \textsc{CAPS}$
````

```math
\def\textsc#1{\dosc#1\csod}
\def\dosc#1#2\csod{{\rm #1{\scriptsize #2}}}
```

This is $\textsc{SMALL} \textsc{CAPS}$
列挙型enumの列挙定数を文字列に変換する方法【C,C++】

# 列挙型enumの列挙定数を文字列に変換する方法

enumで宣言した列挙定数を文字列に変換したいときのためのプチテクニック。

なお逆に、文字列を列挙定数に変換したいときはこちら→[文字列を対応する列挙定数(enum)に変換する【C++】](http://qiita.com/nunu-e64/items/e29075bdd82fad8ec28c)

defineマクロの#演算子（文字列化演算子）は、マクロの引数を見たままの文字列リテラルに置き換えてくれるのでこれを利用することで簡単に実装が可能です。

```c:test.c
#include <stdio.h>

#define STR(var) #var	//引数にした変数を変数名を示す文字列リテラルとして返すマクロ関数

int main() {
	enum color_tag{
		RED,
		BLUE,
		GREEN
	};

	printf("%s : %d\n", STR(RED), RED);
	printf("%s : %d\n", STR(BLUE), BLUE);
	printf("%s : %d\n", STR(GREEN), GREEN);

	return 0;
}
```

結果

```bash
RED : 0
BLUE : 1
GREEN : 2
```

この程度であれば"RED"と直接書く方法もありますが、もう少し複雑になって平文を書きたくないシーンでは有効です。

enumで宣言した列挙子そのものを文字列として比較や出力に利用したしたかったのですが、検索しても[.NET FrameworkのEnum.ToString()](https://msdn.microsoft.com/ja-jp/library/a0h36syw%28v=vs.110%29.aspx)など複雑な方法しか見つかりませんでした。
defineマクロは多用すべきではありませんが、利用方法を知っておくと便利な機能も存在します。
ubuntuをWindows上に。。。<linux>(windwos対象)

<html>
<head>
<title>ubuntuをwindows上に導入する</title>
</head>
<body>
  
 <h3>・Ubuntu導入</h3>
<p>
IT業界やIT系の勉強をされている学生さんなどなどコンピュータ系に触れている方なら<br>
ubuntuという言葉を一度は耳にしたことがあるとは思います。<br>
UbuntuとはLinux OSです。<br>
もっと厳密にいうとLinuxはOSという言い方をしませんが、ここではグダグダにならないようにOSという<br>言い方をします。<br>
今回はwindows上でUbuntuを動作させる方法を紹介します。<br>
まずはいくつか用意するものがあるので、用意するものから順々に紹介していきます。
</p>
<div>
<p>
<h4>1・VMwaerPlayer</h4>
<h4>2・Ubuntu iso</h4>
<h4>3・Windwos搭載マシン</h4>
</p>
<p>
<a href="http://www.vmware.com/jp/">VMwaerPlayer</a>
<br>
<a href="http://www.ubuntu.com/">Ubuntu</a>
これらをダウンロードします。<br>
ドキュメントフォルダー上にVMISOというフォルダーを作ってください。<br>
そこにubuntuのISOファイルを置きます。
<br>
次にVMwaerPlayerをインストールし起動してください。<br>
VMwaerPlayerのインストールが終了したら、起動し指示の通りUbuntuをセットアップしてください。<br>
以上でインストールおよびUbuntuセットアップ作業は終了です。<br>
</p>
<p>
ここではVmwaerのインストールをCドライブ、ISOをC:\Users\username\Documentにセットしましたが、これは説明のために指定しただけで、<br>
ISOファイルの場所VMwaerPlayerの場所は各自でほかの場所にセットしても問題ありません。</p>
<p>
<h2>注意</h2>
ISOファイルからインストールした場合はISOファイルを削除したり場所移動したりしないでください。<br>
ISOをCDに取り込みインストールさせた場合はISOを削除してもコンピュータからCDを抜いても問題ありません。
</p>
</div>

</body>
</html>
Go: int同士の割り算は、intが戻り値なので注意

整数同士の割り算、例えば 100000 ÷ 30 = 3333.333333333 の結果はfloatになりそうですが、Goは3333のようにintが戻り値になるので注意が必要です。

計算結果を少数として欲しい時は、計算に使う数字を`float64`に変換しておく必要があります。

```go:play.golang.org/p/iq539h6DGI
package main

import (
	"fmt"
)

func main() {
	fmt.Printf("%t\n", 10 / 3) // 3
	fmt.Printf("%t\n", 10 / 3.0) // %!t(float64=3.3333333333333335)
	fmt.Printf("%t\n", 10.0 / 3) // %!t(float64=3.3333333333333335)
	fmt.Printf("%t\n", float64(10) / 3) // %!t(float64=3.3333333333333335)
	fmt.Printf("%t\n", 10 / float64(3)) // %!t(float64=3.3333333333333335)
	
	if 10 / 3 > 3 {
		fmt.Println("10 / 3 > 3 = TRUE")
	} else {
		fmt.Println("10 / 3 > 3 = FALSE")
	}
	
	if 10 / 3 > float64(3) {
		fmt.Println("10 / 3 > float64(3) = TRUE")
	} else {
		fmt.Println("10 / 3 > float64(3) = FALSE")
	}
	
	if 10 / float64(3) > 3 {
		fmt.Println("10 / float64(3) > 3 = TRUE")
	} else {
		fmt.Println("10 / float64(3) > 3 = FALSE")
	}
}
```

[このコードを実行してみる](http://play.golang.org/p/iq539h6DGI)
evalから呼んだファイルでの__FILE__の値


###Sample code

`/top/app/main.rb`

``` main.rb
eval(File.read(File.expand_path("../sub.rb" ,__FILE__)))
```

`/top/app/sub.rb`

```sub.rb
eval(File.read(File.expand_path("../something.rb" ,__FILE__)))
```

このように、`main.rb`が`sub.rb`を読み込み評価して、`sub.rb`が`something.rb`を読み込み評価することを期待している。

このとき`top`ディレクトリで、`ruby ./app/main.rb`を実行した場合には、`sub.rb`の__FILE__は`.`を示す。このため、`something.rb`の読み込みには失敗する。
以下のように`binding`オブジェクトを渡して、main.rbのコンテキストを`sub.rb`に渡してあげると成功する。

``` main.rb
eval(File.read(File.expand_path("../sub.rb" ,__FILE__)), binding)
```

###参考
- http://docs.ruby-lang.org/ja/2.2.0/method/Kernel/m/require_relative.html
- http://docs.ruby-lang.org/ja/2.2.0/method/Kernel/m/eval.html
Perl : DBIで実行されたクエリをお手軽に見る

前提条件：cpanm、dbi、mysqlがイントールされていること

### DBIx::QueryLog をインストール

```bash
$ cpanm DBIx::QueryLog
```

### **使用例１：クラス全体のクエリを出したい場合**

use DBIx::QueryLog;

```pl:querylog1.pl
use strict;
use warnings;
use utf8;
use DBI;
use DBIx::QueryLog;

my $dbh = DBI->connect('DBI:mysql:hoge_db', 'root', '');
my $sth;

# クエリ１
$sth = $dbh->prepare("SELECT * FROM hoge_table LIMIT ?");
$sth->execute(1);

# クエリ２
$sth = $dbh->prepare("SELECT * FROM hoge_table LIMIT 2");
$sth->execute();

# クエリ３
$sth = $dbh->prepare("SELECT id,name FROM hoge_table LIMIT 2");
$sth->execute();

1;
```

実行

```bash
$ perl querylog1.pl
```

結果

```bash
[2015-05-18T21:58:03] [main] [0.000209] SELECT * FROM hoge_table LIMIT 1 at querylog1.pl line 12
[2015-05-18T21:58:03] [main] [0.000103] SELECT * FROM hoge_table LIMIT 2 at querylog1.pl line 16
[2015-05-18T21:58:03] [main] [0.001153] SELECT id,name FROM hoge_table LIMIT 2 at querylog1.pl line 20
```

### **使用例２：一部のクエリを出したい場合**

use DBIx::QueryLog ();
DBIx::QueryLog->begin;
ここが出力対象になる
DBIx::QueryLog->end;

```pl:querylog2.pl
use strict;
use warnings;
use utf8;
use DBI;
use DBIx::QueryLog ();

my $dbh = DBI->connect('DBI:mysql:hoge_db', 'root', '');
my $sth;

# クエリ１
$sth = $dbh->prepare("SELECT * FROM hoge_table LIMIT ?");
$sth->execute(1);

# クエリ２
DBIx::QueryLog->begin;
$sth = $dbh->prepare("SELECT * FROM hoge_table LIMIT 2");
$sth->execute();
DBIx::QueryLog->end;

# クエリ３
$sth = $dbh->prepare("SELECT id,name FROM hoge_table LIMIT 2");
$sth->execute();

1;
```

実行

```bash
$ perl querylog2.pl
```

結果

```bash
[2015-05-18T22:00:06] [main] [0.000123] SELECT * FROM hoge_table LIMIT 2 at querylog2.pl line 17
```

### **おまけ：結果をファイルに出力したい**

```pl:querylog3.pl
use strict;
use warnings;
use utf8;
use DBI;
use DBIx::QueryLog;

open my $fh, '>>', 'tmp/query.log' or die $!;
$DBIx::QueryLog::OUTPUT = $fh;

my $dbh = DBI->connect('DBI:mysql:hoge_db', 'root', '');
my $sth = $dbh->prepare("SELECT id,name FROM hoge_table LIMIT 1");
$sth->execute();

1;
```

結果

```bash
$ cat tmp/query.log
[2015-05-18T22:05:03] [main] [0.000123] SELECT id,name FROM hoge_table LIMIT 1 at querylog3.pl line 12
```