OmniAICreator/Qiita-1.07M huggingface dataset:
log4jのログ出力先を取得する


### log4jの定義

```xml
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
	
<!-- File Appender -->
<appender name="file" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="/var/log/info.log" />
        <param name="MaxBackupIndex" value="10" />
		<param name="MaxFileSize" value="10MB" />
		<param name="Append" value="true" />
        <param name="Encoding" value="UTF-8" />
        <layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%d{yyyy/MMM/dd HH:mm:ss.SSS} [%-5p] %m%n" />
        </layout>
</appender>

<!-- Logger -->
<category name=“jp.co.xxx” additivity="false">
	<priority value="debug" />
	<appender-ref ref="file" />
</category>

</log4j:configuration>
```

### 出力先の取得

```java
//カテゴリ名を取得してLoggerを取得
Logger logger = Logger.getLogger("jp.co.xxx");
// File Appenderを取得
FileAppender appender = (FileAppender)logger.getAppender("file");
//getFileでファイル出力場所が取得できる。
System.out.println(appender.getFile());
```

実行結果

```
/var/log/info.log
```
setFileでファイル出力先を指定することもできる。
Max/MSP:マックスTips！(Did You Know? 拾い読み)

Max/MSP での開発を加速する Tips集をお届けします。

引用元は Cycling'74 の公式 Tips集 ["Did You Know?"](http://cycling74.com/category/articles/did-you-know/) です。

全 52 本の記事をながめてみると、前半は MaxMSP 5、後半は Max 6 の各新機能の紹介を主に構成されていますが、MSP/Jitter/Max4Live/Gen など派生ライブラリ紹介以外にもパッチング効率が上がる Tips や、Max 自体に追加されたオブジェクトの紹介も含まれています。

今回は、この Did You Know? から、Max でのパッチワーク全般で効果のありそうな Tips を筆者の独断で拾いだして説明をこころみます。


#### 動作確認環境
動作確認は Max 6 / Mac OS X でおこないました。
Windows の場合は `Cmd` を `Ctrl` で読み替えてください。


#### Tips 一覧

- [オブジェクトを整列/均等分布させる (Week 40: Snap Align)](#2-1)
- [[loadbang] [loadmess] を無効化する (Week 29: Disable Loadbang And Loadmess)](#2-2)
- [エクスターナルを一覧化する (Week 35: List Objects)](#2-3)


## オブジェクトを整列/均等分布させる
[Week 40: Snap Align](http://cycling74.com/2011/10/24/week-40-snap-align/)

![MaxTips1.png](https://qiita-image-store.s3.amazonaws.com/0/8510/03b2fded-4f6e-32a6-f669-e6fb9e141a8f.png)

Adobe などのドロー系ソフトでおなじみの機能が Max にも用意されています。

- 整列
> オブジェクトを複数選択 > メニューの `Arrage > Align > .. `
> オブジェクトを複数選択 > `Cmd + Y` 

- 均等分布(Distribute)
> メニューの `Arrange > Distribute > .. `

均等分布は Max 6 で追加となった機能と思われます。先の動画 2:22〜 で紹介されていますが、均等分布を保ったまま間隔を広げたり狭めたりもできるのが目新しい。


## [loadbang] [loadmess] を無効化する
[Week 29: Disable Loadbang And Loadmess](http://cycling74.com/2011/08/08/week-29/)

![MaxTips2.png](https://qiita-image-store.s3.amazonaws.com/0/8510/3b52960b-ef4a-96ef-5853-1fcf316b4405.png)


結線ミスで [loadbang]  [loadmess] を使ったパッチが開かないことはよくあります。そんな時の対処法。

> `Cmd + Shift` を押しながらパッチを開く

(このキーボードショートカットがなかなか覚えられない... 
そんなときはテキストでパッチを開いて[loadbang] を削除してしまいましょう)

## エクスターナルを一覧化する
[Week 35: List Objects](http://cycling74.com/2011/09/19/week-35-list-objects/)
2種類の観点から、エクスターナル名とその実体 (ファイルの所在) を表示することができます。

0. アプリケーション (Max.app) がロード済のエクスターナル
0. パッチが依存するエクスターナル

一見よく似た機能なので使い分けが気になるところ。

前者は自前でエクスターナルを開発している時のトラブルシューティング時に、後者はパッチを他マシンに移動するケースで有用です。


#### アプリケーションがロード済のエクスターナルを表示する場合
> メッセージ `; max externs` をクリック もしくは bang

![MaxTips3.png](https://qiita-image-store.s3.amazonaws.com/0/8510/e33a8149-64df-6da5-f866-c59b92064cbe.png)


#### パッチが依存するエクスターナルを表示する場合
> 対象のパッチを最前面にした状態で、メニューから `File > List Externals And Subpatcher Files`

![MaxTips4.png](https://qiita-image-store.s3.amazonaws.com/0/8510/5a9d5efb-248f-9296-7307-300a4412a2ad.png)


## まとめ

数ある Did You Know? の記事の中でも特に広く便利に使えそうなものを抜粋して日本語で平易な説明をつけました。ハッピーパッチング！

## 参考にした記事

- [Cycling '74:Did You Know?] (http://cycling74.com/category/articles/did-you-know/)
Tipsの引用元

- [マックス裏技メーリングリスト] (http://groups.yahoo.co.jp/group/maxtips/)
有用な Tips の判断基準の参考にしました。Max 4.x 時代の古い記事ですが今でも使える Tips があります。
SublimeText2におけるFortranのシンタックスハイライト設定

[Sublime Text 2](http://www.sublimetext.com "Sublime Text 2")には，デフォルトでFortranのsyntax highlightが入っていない．

Fortranで書かれたソースコードのsyntax highlightを，以下の手順で設定した．



* fortran.tmbundleを[fortran.tmbundle·GitHub](https://github.com/textmate/fortran.tmbundle "fortran.tmbundle·GitHub")からダウンロード

* ダウンロードしたファイル（fortran.tmbundle-master.zip）を解凍し，その中の"Syntaxes"フォルダを"fortran"に名称変更．
* 作成した"Fortran"フォルダを，以下にコピー

　　　　　Home/Library/Application\ Support/Sublime\ Text\ 2/Packages
   
これで，Sublime Text 2を起動すると、Fortranのsyntax highlightが適用可能になる。
Rubyで素数判定

Rubyで素数を見つける。範囲は１から１００００まで


```rb:prime.rb
def prime_number(prime)
  arr = []
  (1..prime).each do |num|
    if prime % num == 0
      arr << num
    end
  end

  if arr.count < 3 && prime != 1 && 0 < prime
    puts "#{prime}は素数です"
  else
    puts "#{prime}は素数ではない"
  end
end

(1..10000).each do |num|
prime_number(num)
end
```

[初めてのRuby](http://www.oreilly.co.jp/books/9784873113678/)に載っているコードを見ながら書いた。

```rb:prime.rb
def prime_number(numbers)
  (1..numbers).each do |number|
    sqrt = Math.sqrt(number)
    factor_found = (2..sqrt).any? { |i| number % i == 0 }

    if factor_found || number == 1
      print "#{number}は素数ではない\n"
    else
      print "#{number}は素数である\n"
    end
  end
end
```


別の書き方、変な書き方あったらコメントをお待ちしております！
Ruby 2.0.0-rc2 + vagrant 1.4.0のインストール(OS X 10.8.5)


## Ruby 2.0.0-rc2

```zsh
% brew install rbenv
% brew install ruby-build
% brew install readline 
% brew install openssl
% rbenv install -l
```
色々選べるが今回2.0.0-rc2にした。

```
% rbenv install 2.0.0-rc2
Downloading ruby-2.0.0-rc2.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/9d5e6f26db7c8c3ddefc81fdb19bd41a
Installing ruby-2.0.0-rc2...

BUILD FAILED

Inspect or clean up the working tree at /var/folders/yx/0c5flp7x69v7rcvdthwzshy40000gn/T/ruby-build.20131231002536.94716
Results logged to /var/folders/yx/0c5flp7x69v7rcvdthwzshy40000gn/T/ruby-build.20131231002536.94716.log

Last 10 log lines:
installing default gems:      /Users/satzz/.rbenv/versions/2.0.0-rc2/lib/ruby/gems/2.0.0 (build_info, cache, doc, gems, specifications)
                              bigdecimal 1.1.0
                              io-console 0.4.1
                              json 1.7.5
                              minitest 4.3.2
                              psych 2.0.0
                              rake 0.9.6
                              rdoc 4.0.0.rc.2.1
                              test-unit 2.0.0.0
The Ruby openssl extension was not compiled. Missing the OpenSSL lib?
```

opensslの場所を正しく指定できていない。

```zsh
% RUBY_CONFIGURE_OPTS="--with-readline-dir=`brew --prefix readline` --with-openssl-dir=`brew --prefix openssl`" rbenv install 2.0.0-rc2


% rbenv global 2.0.0-rc2
% rbenv rehash

% rbenv versions
  system
* 2.0.0-rc2 (set by /Users/satzz/.rbenv/version)

% ruby --version
ruby 1.8.7 (2010-08-16 patchlevel 302) [i686-darwin10]

```
2.0.0は入ったが、1.8.7は引退したそうなのでuninstall。ありがとう1.8.7。
https://www.ruby-lang.org/ja/news/2013/06/30/we-retire-1-8-7/

```zsh


% echo 'eval "$(rbenv init -)"' >> ~/.zshrc
% echo 'export PATH="$HOME/.rbenv/shims:$PATH"' >> ~/.zshrc
% . ~/.zshrc

% rbenv uninstall -f 1.8.7

% ruby --version
ruby 2.0.0dev (2013-02-08 trunk 39161) [x86_64-darwin12.5.0]


```

## vagrant 1.4.0
まずOracle Virtual BoxをDLして起動
https://www.virtualbox.org/wiki/Downloads

vagrantはgemで入れてもよいが、古いのでgitで落としてgem化
http://d.hatena.ne.jp/dot_h2o2/20131210/p1

```zsh
% git clone https://github.com/mitchellh/vagrant.git
% cd vagrant
vagrant% git checkout tags/v1.4.0
vagrant% gem build vagrant.gemspec
vagrant% gem install vagrant-1.4.0.gem
vagrant% . ~/.zshrc
vagrant% vagrant -v
Vagrant 1.4.0

```

OS イメージをDLして起動しSSH接続

```zsh
% vagrant box add base http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20131103.box 
% mkdir vagranttest
vagranttest% cd vagranttest
vagranttest% vagrant init
vagranttest% vagrant up

vagranttest% vagrant ssh
  
```
とりあえずログインできた。
Berkshelf入門

Berkshelf **ver 3** の入門です。

BerkshelfとVagrantを使って、１行もレシピを書かずにnginxサーバを構築してみましょう。

## 必要なもの

* Vagrant (v1.6以上を推奨)
* VirtualBox
* vagrant-omnibusプラグイン
* ChefDK(berksコマンドはこれに含まれています)

各ツールのインストール方法についてはこちらの記事をご覧ください。

[簡単！今どきのVagrant+ChefSolo入門(2014年9月版)](http://dqn.sakusakutto.jp/2014/09/vagrant_chefsolo_20149.html)

ここから下は、各ツールはすでにインストール済みという前提で説明します。

## chef-repo(作業用ディレクトリ)を作ります

```sh
$ cd /tmp
$ mkdir chef-repo
$ cd chef-repo
```

## Berksfileを作成します。

ver2と書き方が違うのでご注意。

```txt:Berksfile
source "https://supermarket.chef.io"

cookbook 'nginx'
```

## Berksfileの内容をもとにcookbookを取得します。

```sh
$ berks vendor cookbooks

# これでcookbooksの下にサードパーティcookbookが入ります
$ ls cookbooks
apt/  Berksfile.lock  bluepill/  build-essential/  nginx/  ohai/  rsyslog/  runit/  yum/  yum-epel/
```

## Vagrantfileを作成します

```rb:Vagrantfile
Vagrant.configure("2") do |config|
   config.vm.box = "chef/centos-6.6"
   config.omnibus.chef_version = :latest
   config.vm.provision :chef_solo do |chef|
     chef.cookbooks_path = "./cookbooks"
     chef.add_recipe "nginx"
   end
end
```

## vagrant upします

```sh
$ vagrant up
```

これだけで、自分でレシピを一つも書かずにnginxのサーバが構築できます。
Markdown のリスト深さ各サービス対応状況

Markdown でリスト書いてて各サービスがどの程度の深さまで対応しているか気になったので実験してみた

## 結果

|サービス|深さ|
|:---:|:---:|
|Qiita|5|
|Gist|10|
|はてなブログ|30 以上|

## 例

### Qiita

- 1
    - 2
        - 3
            - 4
                - 5
                    - 6

### Gist

[listtest.md](https://gist.github.com/phimcall/8186335)

### はてなブログ

[listtest](http://phimcall.hatenablog.com/entry/2013/12/31/040034)

はてなブログが一番多いの以外だった. Gist の 10 まで対応するの, 妥当な感じある.
Qiita の 5 まで対応は少なすぎる感じする. よろしくお願いします.
iTunesにmp3をドラッグ&ドロップしても曲がミュージックに追加されない時の対処法

iTunes 11.1.3
Mac 10.9.1(2010mid)

## プレイリストを作ってそこに入れればおｋ
あとはそのプレイリストを同期してやればiPhoneに入る
iOS/Androidにおけるcrypto-jsの不具合

iOS/Android対応のブラウザアプリでcrypto-jsを利用していたところ、数千回に1回ぐらいの割合で以下のような現象が発生しました。

- SHA256によるハッシュ生成で違う値が生成される
- AES/DESによる暗号化したデータを復号化しようとしても`Malformed UTF-8 data`のエラーが発生する

調べてみたところ、

[Mobile Safari in iOS 6.1.3 produces Error: Malformed UTF-8 data](https://discussions.apple.com/thread/5022036)

に近い現象の模様。
上記のディスカッションでは、それなりに大きいサイズのファイルで、かつiOSの話でしたが、数百文字程度の文字列でも発生しました。
失敗したら再度やり直すという対応をいれても発生し続けたので、どうにもならん感じ。

回避策としては、

- Hash生成には [jsSHA](http://caligatio.github.io/jsSHA/) を使用
- 暗号化は独自ロジックで実装

で対応しました
AESあるいはDESなどの暗号化が必須な場合は、crypto-js以外のライブラリを選択した方が良いかとー。

結局何が原因なのかははっきり分からないのが気持ち悪いところ・・・
date("Y_W")の罠

@2013/12/30
突然ですが以下の出力はどうなると思いますか？

```PHP
echo date("Y_W");
```

「"2013_"の…ごじゅう…」
と思いますよね！
思うじゃないですか！
しかし実際の出力は以下のようになります。

```
2013_1
```

(｀◎△◎)!?
[な…　何を言っているのか　わからねーと思うが　おれも(ry](http://dic.nicovideo.jp/a/%E3%81%82...%E3%81%82%E3%82%8A%E3%81%AE%E3%81%BE%E3%81%BE%20%E4%BB%8A%20%E8%B5%B7%E3%81%93%E3%81%A3%E3%81%9F%E4%BA%8B%E3%82%92%E8%A9%B1%E3%81%99%E3%81%9C!)

失礼、取り乱しました(´ー｀;)
table名をdate("Y_W")とかでインクリメントしてたりすると年末にひどい事になる訳ですがなぜこのような事がおこるのかというと、

>W | ISO-8601 月曜日に始まる年単位の週番号

ISO-8601さんどういう事ですかーとぐぐると
>ある年における、「最初の木曜日を含む週が、その年の第1週である。」と規定されている。
>[ISO_8601](http://ja.wikipedia.org/wiki/ISO_8601)

(ﾟｰﾟ;ﾅ､ﾅﾙﾎﾄﾞ~
つまり
Y:2013年です。
W:2014年1週目です。
と見事にお二人の呼吸が合わず2013_1という残念な結果を返してしまったのでした…orz
対処法はいたってシンプル。
>o | ISO-8601 形式の年。これは Y ほぼ同じだが、ISO 週番号 （W）が前年あるいは翌年に属する場合がある点で 異なる（PHP 5.1.0 で追加）。

との事ですので

```PHP
echo date("o_W");
```

としてあげれば

```
2014_1
```

oさんGJ!

ちなみに2015/01/01は木曜日(!)ですので2014年も12/29からdate("W")さんが1を返し始めますのでお気をつけて。
よいお年を〜(⌒∇⌒)ﾉ""
minibianに感動した

* Jessie対応されました。

minibian
-------------
* [公式サイト](http://minibianpi.wordpress.com/)
* ログイン/パスワード : root / raspberry
* 最初から /boot/config.txt に `gpu_mem=16` の設定がされている。

```bash:
# free -m
             total       used       free     shared    buffers     cached
Mem:           485         44        440          0          5         20
-/+ buffers/cache:         18        467
Swap:            0          0          0
```

## パーティションサイズの拡大

必ずraspberry piで行うこと。

```bash:
# fdisk /dev/mmcblk0
d 2
n p 2 Enter Enter
w
# reboot もしくは partprobe
```

```bash:
# resize2fs /dev/mmcblk0p2
# reboot
```

再起動後、パーティションサイズが増えていることを確認。

## 環境メモ

```bash:
sudo apt-get install -y screen
screen -R

sudo apt-get install -y \
 build-essential golang default-jre-headless ruby python python-dev python-pip \
 trac-ja-resource \
 locales curl ack-grep etckeeper autossh expect git nkf \
 apache2 libapache2-mod-php5 mysql-server php5 php5-cli \
 fswebcam sharutils imagemagick \
 awesome iceweasel-l10n-ja lxterminal \
 postfix mutt logwatch mailutils pflogsumm procmail \
 manpages-ja manpages-ja-dev \
 wkhtmltopdf xrdp xterm xtightvncviewer zenity ttf-mona ttf-takao pcmanfm rdesktop \
 screen ranger sshfs aptitude \
 nagios3 samba vsftpd \
 w3m wget vim vim-gtk strace sudo telnet tig \
 nethack-console angband slashem

echo awesome > /home/User/.Xsession

for i in nethack-common samba slashem-common mysql nagios3 vsftpd saned
do
  sudo update-rc.d -f $i remove
done


for i in ansible slenium django flask
do
  sudo pip install $i
done

sudo update-alternatives --all
sudo dpkg-reconfigure locales
sudo dpkg-reconfigure tzdata
sudo ln -s /etc/fonts/conf.{avail,d}/10-sub-pixel-rgb.conf
sudo dpkg-reconfigure fontconfig
```
Berkshelfはver2からver3でだいぶ仕様が変わるので気をつけましょう

# 今のうちからver3を使いましょう

2013/12/30時点では、

`gem install berkshelf`

 するとver2がインストールされます。

しかしver2はじきに時代遅れになるのでいまのうちからver3を使いましょう。

`gem install berkshelf --pre`

すれば`3.0.0.beta4`をインストールできます。

ver3では依存関係のトラブルがいろいろ解消されているようです。
例えばCygwinだとver2はインストールできませんでしたがver3はすんなりインストールできました。

# Berksfileの記法が変わる

ver2
`site :opscode`
ver3
`source "http://api.berkshelf.com/"`


# コマンド体系が変わる
ver2
`berks --path=vendor/cookbooks`

ver3
`berks vendor vendor/cookbooks`

# その他変更点はGithubのwikiを見ましょう。

ここを見ればよさそうです。

https://github.com/berkshelf/berkshelf/wiki/_pages
easy_install のインストール(Windows)

# easy install のインストール #
PyPI の [setuptools](https://pypi.python.org/pypi/setuptools) の Windows のところから[ez_setup.py](https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py) をダウンロードして適当な場所に保存

ダウンロードしたディレクトリで、コマンドを実行

```
python ez_setup.py
```

Python の Scripts フォルダに PATH を通す。

これで、 easy_install が使えるようになる。
Xcode5でCocoaPodsを追加したらLinker Errorが出た際の対処法

Xcode5でCocoaPodsを用いてライブラリを導入してビルドした際に、どうやっても以下のエラーが鳴り止みませんでした。

>
ld: library not found for -lPods
clang: error: linker command failed with exit code 1 (use -v to see invocation)

どうやらCocoaPodsのリンカーが見つからないそうなので、StackOverflowさんに書いてあることを大体は試したのですが、全く状況は変わりませんでした。（大半がアーキテクチャを修正しろみたいなことが書かれていました。）

そこで思ったのが、「Podプロジェクトと自身のiOSプロジェクトが一緒にビルドされているのか？」ということです。実際にスキーマをいじくってたら一緒にビルドされていなかったので、設定して再度ビルドしたらうまくいきました！ 以下に、その設定方法を記述していきます。

# 1. スキーマの設定画面を開く
Xcodeの左上にある、スキーマの選択画面から"Edit Scheme"を選択
![Screen Shot 2013-12-30 at 10.56.10 PM.png](https://qiita-image-store.s3.amazonaws.com/0/25585/4e93db36-4461-df73-cf9e-1ce36f9b8e6a.png)

# 2. スキーマの管理画面を開く
設定画面が上から出てくるので、その画面の下部にある"Manage Scheme"を選択
![Screen Shot 2013-12-30 at 11.06.53 PM.png](https://qiita-image-store.s3.amazonaws.com/0/25585/dbed8177-eecf-2a1e-0dc4-d4d4b188041e.png)

# 3. スキーマの共有を設定する
最後に、自身のプロジェクトやPodsの共有をするために、一番右の欄の"Shared"をチェックして、OKボタンを押します。
![Screen Shot 2013-12-30 at 11.07.06 PM.png](https://qiita-image-store.s3.amazonaws.com/0/25585/bb66c18c-f339-0dd6-d6d3-342d1c521b59.png)

# 4. Cleanしてから、再度Build
エラーが出たまま作業した場合は、Product > Cleanをしてから、ビルドしましょう。
Buffer SDKの使い方

時間が空いたので自分の開発したアプリのShortpathブラウザにBufferの機能を追加しました。

Buffer SDKの利用の仕方を解説します。

# Buffer SDKの入手

https://github.com/bufferapp/buffer-ios-sdk から入手してください。.aと.hファイルがダウンロードできます。

# Xcodeの設定

XcodeでHeader Pathを.hのファイルのディレクトリ、Library Pathを.aのファイルのディレクトリを指定します。


次に以下のフレームワークを設定します。

* AdSupport.framework
* libsqlite3.0.dylib
* Twitter.framework
* Accounts.framework
* Security.framework
* QuartzCore.framework
* SystemConfiguration.framework
* MobileCoreServices.framework
* CoreGraphics.framework
* FacebookSDK.framework

# Bufferのウェブページでアプリ登録

https://bufferapp.com/developers/apps でアプリを登録します。
Client IDとClient Secretが発行されます。Client Secretはメールで発行されるのでスパム判定されていないか注意してください。

# Buffer SDKでプログラミング

AppDelegateの`- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions`で以下のコードでClient IDとClient Secretを設定します。

```objc
[[BufferSDK sharedAPI] setClientID:@"" andClientSecret:@""];
```

以下のURLスキームをXcodeで設定します。XXXXはClient IDに置換します。

```
▾ URL Types (Array)
    ▾ Item 0 (Dictionary)
          URL Identifier (String) com.buffer.sdk
        ▾ URL Schemes (Array) (1 item)
            Item 0  (String) [YOUR URL SCHEME, for instance "bufferXXXX"]
```



以下のコードでシェアできます。


```objc
[BufferSDK presentBufferSheetWithText:@"This is a test." completionBlock:^(NSDictionary *response){
    NSLog(@"response %@", response);
}];
```


初回実行時は、アプリ認証が発生します。Bufferが起動されて認証されます。ですのでiphoneにあらかじめBufferがインストールされていることが必要です。
認証されるとbufferXXXXのURLスキームにコールバックされます。
認証移行は通常にシェアできます。

シェアするメッセージに含まれる長いURLなどはBufferの短縮URLの結果の文字数でカウントされるようです。

http://showrtpath.hatenablog.com/entry/2013/12/29/161402
で同じ内容を書いています。
「Chrome Web Store」でツールバーの提供が中止されるらしい

##Googleが「Chrome Web Store」でツールバーの提供を中止するらしい
この件について調べてみました。間違っている箇所がありましたらご指摘ください。

自分なりにThe Chromium Blogブログの[記事](http://blog.chromium.org/2013/12/keeping-chrome-extensions-simple.html)の要点をまとめると、

+ Chrome拡張機能は、一つの目的（用途）で設計されるべき。
+ Chrome拡張機能は、一つの`browser action`ボタン、または、`page action`ボタン（だけ）を持つべき。
+ 「ツールバー」はこれらの方針に合わないことから、ポリシーを変更して、提供中止。
（ウェブストアに既存の拡張機能に関しては2014年6月までは大丈夫）


##参考記事
+ [グーグル、「Chrome Web Store」でのツールバー提供を中止へ--ポリシーを変更](http://japan.cnet.com/news/service/35041752/)
+ [Keeping Chrome Extensions Simple](http://blog.chromium.org/2013/12/keeping-chrome-extensions-simple.html)
PHP5でrunkit

PHP界きっての反則技、runkit。
http://www.php.net/manual/ja/book.runkit.php
昔はXAMPPにデフォルトで入っていたのですが、いつのまにか消えていました。
http://yuubiseiharukana.blog.shinobi.jp/Entry/75/
もはやPECLがメンテナンスされてないんですよね。
http://pecl.php.net/package/runkit

Windows版runkitをメンテしてる人を見つけたので試してみます。
https://github.com/Crack/runkit-windows
試したバージョンは「php_runkit-1.0.4-5e179e978a-5.5-vc11.dll」。
TSのほうです。

ダウンロードしたファイルをxampp/php/ext内に入れて、php.iniに

```php
	extension=php_runkit.dll
	runkit.internal_override = true
	runkit.superglobal = _FOO
```

と書いておきます。
phpinfo()でrunkitの項目が追加されていることを確認しましょう。

runkitを使うと、通常では絶対に有り得ないコーディングが可能になります。

```php
<?php
	// 定数
	define('HOGE', 1);
	print(HOGE); // 1
	
	runkit_constant_redefine('HOGE', 2);
	print(HOGE); // 2
	
	runkit_constant_remove('HOGE');
	print(HOGE); // Notice: Use of undefined constant HOGE
	
	// 関数
	runkit_function_redefine('phpinfo', null, 'print("a");');
	phpinfo(); // "a"と表示される
	
	runkit_function_remove('phpinfo');
	phpinfo(); // Call to undefined function phpinfo()
	
	// 返り値を利用しているか確認
	function foo() {
		var_dump(runkit_return_value_used());
	}
	foo(); // false
	$a = foo(); // true
	
	// スーパーグローバル
	$_FOO = 'foo';
	$_BAR = 'bar';
	function test(){
		print($_FOO); // foo
		print($_BAR); // Notice: Undefined variable: _BAR
	}
	test();
	
	var_dump(runkit_superglobals());
```

掟破りにも程があるだろ。

見てのとおり、定数も関数も制限？何それってレベルで上書きできてしまいます。

runkit.internal_overrideは組み込み関数のオーバーライドを制御するディレクティブです。
デフォルトはfalseで、ユーザ定義関数しか上書きできません。
trueにすると上記のようにphpinfo()等も上書きできるようになります。
さすがにechoのような言語構造は上書きできません。

runkit.superglobalは、「スーパーグローバル変数として扱う変数を追加する」というこれまた反則なディレクティブです。
今回は"_FOO"を追加しているので、\$\_FOOが\$\_REQUEST等と同格のスーパーグローバル変数になります。
runkit_superglobals()は、現在のスーパーグローバル変数一覧を取得します。
\$GLOBALS、\$\_REQUEST、\$\_SESSIONといった見慣れた変数と一緒に\$\_FOOが入っているのが確認できます。

runkit_return_value_used()は他と毛色の違う関数で、関数呼び出しが、その返り値を使っているかを確認できるという、どういうときに使うのかよくわからない機能です。
いやほんとこれどういうときに使うんだ？

あとrunkit_lint()でコードチェックとかも可能なはずなのですが、手元環境ではapache毎落ちてしまって確認できませんでした。
理由はよくわかりません。
今更聞けない目的別soxの使い方


# はじめに

soxは、音声ファイルをコマンドラインから加工・変換することができる便利なコマンドだ。フォーマットの変換などはmanを見ずにできるが、ある程度込み入った処理をするとなった途端、Googleでいくつものページを見返すことになって不便なので、ここに過去に使ったコマンドとそのオプションの備忘録を残しておく。

# オーディオ形式の変換

最も多い使い方、wavファイルから、mp3などに変換するパターン。

```
$ sox <input>.wav <output>.mp3
```

またはその逆。あまり多く使わないと思いきや、プログラムで使うライブラリや、パッケージがサポートしている音楽ファイル形式がまちまちで頼ることがしばしばある。

上記の場合、ただ変換するだけでなく、サンプルレートは16kでモノラルじゃないと動かないとか言う場合もある。そういった場合は、エフェクトをかけて、変換を行う。

```
$ sox <input>.mp3 <output>.wav channels 1 rate 16k
```

録音音声がraw（ヘッダレス）形式でwavに変換を行う場合、rawのタイプ指定を行う必要がある場合もある。

```
$ sox -r 16k -e signed -b 8 -c 1 <input>.raw <output>.wav
```

こんなもんだろうか。他にも遭遇した場合はまた追記していくことにする。

# 結合

2つの音楽ファイルを結合する場合はこちら。

```
$ sox <input1>.wav <input2>.wav <output>.wav
```

# 混合

2つの音楽ファイルを混合する場合、

```
$ sox -m <input1>.wav <input2>.wav <output>.wav
```

# X倍再生

スロー再生とか高速再生とかしたい場合はこちら（例は1.2倍、速くなる）。

```
$ sox <input>.wav <output>.wav speed 1.2
```

# トリミング

長い音楽ファイルの一部だけを取り出すトリミング作業をするときのコマンドオプション。


```
$ sox <input> <output> trim <start> <trim_time>
```

```
$ sox <input> <output> trim <start> =<end>
```

それぞれ

* input: 入力ファイルのパス
* output: 出力ファイルのパス
* start: 開始秒
* trim_time: 開始秒からのトリミング時間（秒）
* end: 終了秒

になる。

# 正規化

何かの理由で、再生するソースの音量がとても小さい or 大きい場合に音量を正規化するコマンドオプション。

```
$ sox <input> <output> norm
```

# 何気に優秀なplayコマンド

Linuxなどで音楽や音声ファイルを再生するコマンドラインは、alsa playerが有名だが、soxを入れたときについてくるplayコマンドは、soxの処理を入れながら再生することが出来るため、ちょっと凝った処理をしたい場合に威力を発揮する。

```
$ play <input> trim <start> <end>
```

簡易的な音再生プログラムを作りたい場合は、popenでこれを呼び出すとかなり時間節約できるかも・・

# 対となるrecコマンド

再生(play)ができるなら、録音もできるでしょという感覚は正解でもちろん、録音用のコマンドも提供されている（ただ、どちらもsoxのショートカットにすぎない）

```
$ rec -c 1 -r 16k output.wav trim 0 360
```

上記は、1チャンネル、サンプルレート16kHzで360秒、wavファイルを録音するときのコマンド。録音時間を指定できるのは以外と便利だったりする。
PHP5 Strict Standards:を非表示にする方法

#PHP5でStrict Standardsのワーニングが出る場合

######状況
PHP5.4以降はStrict Standardsのワーニングが表示される


######方法

+ PHP.iniで解消する方法

```ini:php.ini
- error_reporting = E_ALL | E_STRICT
+ error_reporting = E_ALL & ~E_STRICT
```

+ PHPソースに記述する方法

```php:sample.php
ini_set('error_reporting', E_ALL | ~E_STRICT);
```

参照：[PHPマニュアル error_reporting](http://php.plus-server.net/function.error-reporting.html "PHP Manual")
参照：[PHP Document#error_reporting](http://php.net/error-reporting "PHP Documentation")


######Warningの理由

PHP5でクラスの継承を行った場合、継承元の引数の数や型が異なる場合に、ワーニングが表示されるようになりました。

```PHP:e_strict.php5
<?php
class ClassA
{
    function __construct() { echo "__construct() in ClassA<br>"; }
    function methodA($param) { echo "methodA in ClassA<br>"; }
    function methodB() { echo "methodB in ClassA<br>"; }
}
class ClassB extends ClassA
{
    function __construct() {
        parent::__construct();
        echo "__construct() in ClassB<br>";
    }
    function methodA() { echo "methodA in ClassB<br>"; }
    function methodB($param) { echo "methodB in ClassB<br>"; }
}
?>
<?php
    echo "コンストラクタを呼び出します。<br>";
    $class_b = new ClassB();
    echo "methodAを呼び出します。<br>";
    $class_b->methodA();
    echo "methodBを呼び出します。<br>";
    $class_b->methodB('1');
?>
<hr>
<?php
    show_source($_SERVER["SCRIPT_FILENAME"]);
?>
```

引用元：[Link](http://www.doyouphp.jp/php5/php5_estrict.shtml)

E_STRICTでのワーニング

```txt
( ! ) Strict standards: Declaration of ClassB::methodA() should be compatible with ClassA::methodA($param) in (省略)\e_strict.php on line 16

( ! ) Strict standards: Declaration of ClassB::methodB() should be compatible with ClassA::methodB() in (省略)\e_strict.php on line 16
コンストラクタを呼び出します。
__construct() in ClassA
__construct() in ClassB
methodAを呼び出します。
methodA in ClassB
methodBを呼び出します。
methodB in ClassB
```

参考情報：[PHP Document#abstract](http://php.net/manual/ja/language.oop5.abstract.php "PHP Documentation")

-----
######PHPでエラーになるオーバーロード

オブジェクト指向言語でいう所の「オーバーロード※」はPHP5で動作できません。
※名前は同じだけれども引数の数や型が異なるメソッドを複数用意できる。

```php:OverloadTest.php
<?php
class ClassA
{
    function doSomething()
    {
        echo "doSomething<br>";
    }

    function doSomething($param = "")
    {
        echo "doSomething with param: " . $param . "<br>";
    }
}

$obj = new ClassA();

// 2番目のメソッドがコールされる
$obj->doSomething();
$obj->doSomething("foobar");
?>
```

引用元：[Link](http://www.doyouphp.jp/sample/sample_class_base_overload.shtml)

PHP5エラー

```txt
Fatal error: Cannot redeclare ClassA::doSomething() in (省略) OverloadTest.php on line 9
```

----

######PHPでのオーバーロードの意味
参考情報：[PHP Document#Overloading](http://www.php.net/manual/ja/language.oop5.overloading.php "PHP Documentation")
simple_formで普通のButtonを作成する方法

simple_formのマニュアルには’f.button :submit’のみが掲載されていますので、どうやって普通のButtonを作成するのがすごし探しました：

```erb
<%= f.button :button, 'save_draft', :type => 'button', :class =>'btn btn-primary' %>
```
肝心のパラメータば2番目の`:button`と`:type`です。
OS X Mavericksにアップデートした後のApacheの設定


先日、Mavericksにアップデートしたのですが、
アップデート後からlocalhostに繫がらなくなりました。

原因は、Apacheの設定が変わっていたようです。
以下、変更した部分です。

##ユーザー名、グループ名を変更

```console
#131行付近
User  yourName
Group yourGroup
```

##Virtualhost読み込み先変更

```console
#479行目付近
#コメントアウトするか、ご自身のVirtualhostのパスをInclude

#Virtual hosts
Include /private/etc/apache2/extra/httpd-vhosts.conf
```


##document root変更

```console
#170行目付近
DocumentRoot “パス”

#198行目付近
<Directory “DocumentRootと合わせる”>

```

##PHP設定

###php5_module設定

```console
#以下を追加

#PHP Settings
<IfModule php5_module>
    AddType application/x-httpd-php .php
    AddType application/x-httpd-php-source .phps
</IfModule>
```

###LoadModule設定

```console
#118行付近
#コメントアウトする。
LoadModule php5_module libexec/apache2/libphp5.so
```
ERROR - Could not load 'guard/phpunit' or find class Guard::Phpunitが出た時の対処法


##gem guardのバージョンが2.+であることが原因

インストールしているguardのバージョンを調べる

```
gem list guard
```

2.+のguardがある場合はアンインストールする

```
#バージョンは任意のもの
gem uninstall guard -v='2.2.5'
```

これでguardを立ち上げ直せばOK

##参考

[Can't run guard:watch with Laravel Guard (Page 1) / Laravel 4.x Help / Laravel Forums](http://forums.laravel.io/viewtopic.php?id=14681)
Call to undefined method PHPUnit_Framework_TestResult::allCompletlyImplemented()が出た時の対処法


##guard-phpunitのファイルのタイポが原因

```.rvm/gems/ruby-2.1.0/gems/guard-phpunit-0.1.4/lib/guard/phpunit/formatters/PHPUnit-Progress/PHPUnit/Extensions/Progress/ResultPrinter.php

//250行目、256行目にある以下のメソッド名を編集する

$result->allCompletlyImplemented() 
↓
$result->allCompletelyImplemented()
```

Completelyのタイポが原因でエラーになってた。

##参考
[Call to undefined method PHPUnit_Framework_TestResult::allCompletlyImplemented() · Issue #18 · JeffreyWay/Laravel-Testing-Decoded](https://github.com/JeffreyWay/Laravel-Testing-Decoded/issues/18)
無線LAN APがブリッジモード時にWeb UIへアクセスする方法

# 経緯

CTUにルーターの機能があるので無線LAN APはブリッジ（非ルーター）でいいしょ、って感じなんだけど、ブリッジにすると無線LAN APのWeb UIにアクセス出来なくなってしまった。

# 解決方法

Twitterで呟いたらopに教えてもらえた。op is god.

- Web UIにアクセスしたいパソコンのIPアドレスを、無線LAN APのIPアドレス（本体に書いてあるやつなど）と同じサブネットにする。

今回僕が買った[WN-G300R](http://www.iodata.jp/lib/manual/wn-g300r/htm2/ap.htm)では、初期のIPアドレス（APモード時）が`192.168.0.201`だったので、このサブネットである`192.168.0`を拝借して適当なIPアドレス（例えば`192.198.0.10`とか）を名乗る。
この状態で`192.168.0.201`へアクセスすると無事に設定画面へいける。後は無線LAN APのIPアドレス取得をDHCPなどに設定すれば、ルーター配下のサブネットになるみたい。
neoagentのベンチマークの取り方


[mcb](http://www.interdb.jp/techinfo/mcb/)というベンチマークツールを使って[neoagent](https://github.com/cubicdaiya/neoagent)のベンチマークを取ってみる。

mcbは上のサイトにもあるように

```
gcc -Wall -lpthread -lnsl -o mcb mcb.c
```

でコンパイルして、

```
./mcb -c get -t 10 -n 1000 -l 100 -a 127.0.0.1 -p 11211
```

というふうに実行する。

neoagentは設定例だと/tmp/neoagent.sockにUnix Domain Socketを作るので、mcbでこれに接続する。

```
./mcb -c get -t 8 -n 1000 -l 100 -T UNIX_SOCKET -f /tmp/neoagent.sock
```

## 並列性能

去年ぐらいの社内勉強会で見た結果の追試。

同時リクエスト数を1から20まで変化させて、1秒あたりのgetの処理数を測る。

```bash
for i in {1..20}; do echo -n $i "\t"; ./mcb -c get -t $i -n $(( 3000 / $i )) -l 100 -a 127.0.0.1 -p 11211 | awk '$1 ~ /performance/{print $3}'; done
```

neoagentのworker_maxを0, 1, 4と変えたものと、素のmemcachedで秒処理数をプロットする。

![kobito.1388360367.341121.png](https://qiita-image-store.s3.amazonaws.com/0/5978/57b18050-6c2f-9697-687e-2517e7669053.png "kobito.1388360367.341121.png")

社内勉強会のスライドでは1.5倍ぐらいになっていたのだが、今は並列化してもスコアが伸びないのかもしれない。

ちなみに環境はec2のm1.xlargeインスタンスでCPUは4コアでmemcachedとneoagentは同じサーバーで動かした。neoagentのバージョンはv0.8.8。

### 別ホストでのベンチ

memcachedとneoagentを同じサーバーで動かすのはベンチマークとしてどうかと思ったので、別ホストのmemcachedに繋ぐベンチマークを取ってみた。

![kobito.1388852567.840922.png](https://qiita-image-store.s3.amazonaws.com/0/5978/2efd3720-7e38-4887-2f7c-852526cb50bc.png "kobito.1388852567.840922.png")

ワーカーがゼロのときは特殊な動きをするようだ。
さくらのレンタルサーバーにWordPressをインストール


1. コントロールパネルにて PHPのバージョンが 5.2.4 以上であることを確認 （NOTE-1）
2. データベースの設定 -> 新規作成（IMG1）する。今回は MySQL 5.5 、文字コード utf-8 で作成
3. 左袖メニューのクイックインストールから（IMG2）ブログ -> WordPress を選択
4. ライセンスにチェック、ディレクトリを指定する。 **テーブルの接頭語** は複数運用するさいに関係あるもので通常はデフォルトでいいっぽい
5. インストールボタン押下。成功するとインストール完了画面に（IMG3）遷移。失敗するとクイックインストール画面に戻ってしまう（インストール先フォルダの指定し忘れたらそうなった
6. WordPress の設定を行う

——————————————
【NOTE1】
WordPress 日本語版の動作環境

- PHP バージョン 5.2.4 以上
- MySQL バージョン 5.0 以上

【IMG1】 DB新規作成
![さくらインターネットサーバコントロールパネル.png](https://qiita-image-store.s3.amazonaws.com/0/20773/88e4701d-3e45-4666-d90f-e53a029a098a.png "さくらインターネットサーバコントロールパネル.png")

【IMG2】クイックインストール
![さくらインターネットサーバコントロールパネル-4.png](https://qiita-image-store.s3.amazonaws.com/0/20773/e1bc2a35-6898-a909-b1f7-4a0919490f92.png "さくらインターネットサーバコントロールパネル-4.png")

【IMG3】インストール完了画面
![さくらインターネットサーバコントロールパネル-2.png](https://qiita-image-store.s3.amazonaws.com/0/20773/d071570f-75cb-3392-81c6-bb74a10684cb.png "さくらインターネットサーバコントロールパネル-2.png")
mouseover/outによる画像の差し替え


<html lang="ja">
    \<head>
        \<meta charset="utf-8"/>
        \<script>
            window.onload = function(){
            var target = document.getElementById('target');
            target.addEventListener('mouseover',function(){
                target.style.backgroundColor = 'red';
            },false);
            target.addEventListener('mouseout',function(){
                target.style.backgroundColor = 'white';
            },false);
            };
        \</script>
        
        <style>
            p#target{
                border:solid 1px #999;
                padding:10px
            }
        </style>
    </head>
    <body>
        <div id='container'>
            <!--h1>見出し１</h1-->
            <div id='contents'>
                <p id="target">EventLister</p>
            </div>
            <!--p><input type="button" id="btn" value='リセット' /></p-->
        </div>
    </body>
</html>
brewdlerの初期設定をちょっとだけ簡単にする。

homebrewのパッケージ管理はどうやらbrewdlerというのが良いらしいので試してみました。すでにhomebrewでいろいろインストールしているので、それらをBrewfileに書き出したいなと思います。
作業しながら書いてます。

```
brew tap | awk '{print "tap " $0}' >> Brewfile
brew list | awk '{print "install " $0}' >> Brewfile
```

awk/sed/grepに詳しい方にとっては当たり前かもしれませんが、調べながらやりました。

上記コマンドで出来たBrewfileの先頭にupdateとかupgradeとかを書いて、おしりに必要なcaskを記述すれば、とりあえずbrewdlerを使えるようになりそうです。

caskを使うためにはtapを先に追加しないとダメですね。

```
tap phinze/homebrew-cask
install brew-cask
```

出来たようです。

どうもcaskは無条件でダウンロードしているっぽいです。
cURLでHTTPステータスコードだけを取得する

curlでHTTPステータスコードだけを取得する方法をいつも忘れるのでメモ。

```shell-session
$ curl -LI mazgi.com -o /dev/null -w '%{http_code}\n' -s
200
```

こんな感じで `-w` (write out)で `http_code` を指定しつつ、他は `-o` (output)で `/dev/null` にでも捨てる。
そして `-s` (silent)を指定して「進捗どうですか？」を表示しないようにする。
赤フグのニキシー管時計を作ってみた

かねてからニキシー管の時計を作ってみたいなーと思っていたのですが、手頃なキットを見つけたので買ってみました。赤フグ株式会社の [赤フグニキシー時計](http://www.akafugu.jp/ja/posts/products/nixie/) です。Amazon でも売っていて、入手のしやすさはニキシー管時計のキットの中では抜群だと思います。

## 完成図

![前面](https://raw.github.com/iizukak/memo/master/img/nixie_clock_01.jpg)

![前面](https://raw.github.com/iizukak/memo/master/img/nixie_clock_02.jpg)


キットに含まれるニキシー管は IN-12 という型番のものでした。ニキシー管の中では小ぶりで、時計本体もフットプリントはスマホよりちょい大きいくらい。発色は「これぞニキシー管！」という色合いで、たいへん満足しています。

![前面](https://raw.github.com/iizukak/memo/master/img/nixie_clock_03.jpg)


少し部品同士が干渉してケースへの収まりが悪かったりしますが、そのへんは、こういったキットではご愛嬌ですね。

![前面](https://raw.github.com/iizukak/memo/master/img/nixie_clock_04.jpg)

## 組み立て

### 必要な工具

+ ハンダこて
+ ニッパ
+ ドライバ (+, - 両方)
+ マルチテスタ
    + なくても作ることはできますが、たぶんあったほうが良い
+ マスキングテープ
    + ハンダ付け時にパーツを一時的にくっつけておくため

基板が小さく、ハンダ付けも細かい作業となるため、小さなコテ先を持つハンダこてがあると良いと思います。ちなみに今回の組み立てには [HOZAN H-130](http://www.hozan.co.jp/catalog/Soldering_Tools/H130.htm) というハンダこてを使いました。

### 組み立て難易度

基本的には、プリント基板に説明書通りにハンダ付けしていくだけで、特殊な加工などは必要ありません。ですから、難易度はそれほど高くありません。一人で折り鶴を折れない僕も作れたので、たぶん誰でも作れると思います。所要時間は、個人差あると思いますが、三時間程度で作れました。

### 組立手順書の誤植だと思われる部分

[こちら](http://www.akafugu.jp/ja/posts/products/nixie/assembly/) にキットの組立手順書があります。いくつか誤りが含まれると思われます。

1. 電源ボードとロジックボードの接続部分に、
   
   > 各ケーブルが正しい場所に接続されていることを確認して下さい。電源ボード上のGND、5V、HVは、 それぞれロジックボード上のGND、5V（真ん中）、HVへ接続して下さい。
   
   と書かれているのですが、ロジックボードの 5V は真ん中ではありません。基板上の表記が正です。
   
2. ロジックボードの電解コンデンサの部分に

   > 次は電解コンデンサの番です。写真に写っているのは青色ですが、キットによっては黒色 のものが付属している場合もあります。いずれも側面に10μF(または33μF)と印刷されています。 

   と書いてありますが、どちらの記述もありませんでした。ただ、このキットに含まれる電解コンデンサはひとつだけですので、間違えることはないかと思います。

3. ディスプレイボードにニキシー管をハンダ付けする前に、先にネジを基板に通しておいてください。ニキシー管とネジが干渉します。

あと、たまに説明書が英語のままの部分がありますが、がんばって読みます。

## 感想

ニキシー管の時計は完成品としても様々な商品が売っていますが、自分で作ると愛着も湧くし、動いたときの感動もあるし、作って良かった。僕の工作は、割と「作って満足！」なものが多いのですが、ニキシー管時計については常用できそうです。
C++/CX: JSON文字列をパースする

JSON文字列は Windows::Data::Json::JsonValue::Parse でパースできる。
ここでは C++/CX で実装したが、C#/VB.NET でも同様。 

```cpp:MainPage.xaml.cpp
//
// MainPage.xaml.cpp
// MainPage クラスの実装。
//
#include "pch.h"
#include <pplawait.h>
#include "MainPage.xaml.h"

using namespace App1;
using namespace Platform;
using namespace Windows::Foundation;
using namespace Windows::UI::Xaml;
using namespace Windows::Web::Http;
using namespace Windows::Data::Json;

MainPage::MainPage() {
  InitializeComponent();
  // tags_ は MainPage の private メンバ。
  tags_ = ref new Platform::Collections::Vector<String^>();
  TagList->ItemsSource = tags_;
  /* XAML上は以下のように ListViewを配置し、名前:TagListを与えている。
    <ListView x:Name="TagList" >
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}" FontSize="32"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
  */
}

void App1::MainPage::Button_Click(Object^ sender, RoutedEventArgs^ e) __resumable {
  /* GET https://qiita.com/api/v1/tags
   * により、Qittaからタグ列を手に入れる。
   */
  HttpClient^ client = ref new HttpClient();
  String^ response = 
    __await client->GetStringAsync(ref new Uri(L"https://qiita.com/api/v1/tags"));
  /* Qiita-APIから手に入れた JSON文字列を 
     Windows::Data::Json::JsonValue::Parse でパースし、JsonValueを手に入れる。
　*/
  JsonValue^ val = JsonValue::Parse(response);
  /* Qiita-API からは、タグ列は JsonObjectの配列(JsonArray) で得られる。*/
  JsonArray^ ary = val->GetArray();
  tags_->Clear();
  for ( unsigned int i = 0; i < ary->Size; ++i ) {
    /* タグ名を手に入れ、tags_に追加する */
    tags_->Append(ary->GetAt(i)->GetObject()->GetNamedString(L"name"));
  }
}
```

実行結果:
![result](http://www1.c3-net.ne.jp/episteme/Qiita/tags.png)
Herokuにルートドメインを無料で設定する（リンクのみ）

結果だけ知りたい人はこちらを見るべし。Gehirnなら無料。
http://qiita.com/Tkashiro/items/8249455477bbb5333118

以下でスクリーンショット入りで説明がある。参考までに。
http://support.gehirn.jp/manual/dns/apexalias/

Dozensは一発で設定してくれるオプションはあるものの、ルートドメインは対応してない様子。
Heroku本体は海外のサービスを薦めているけれど、そこそこお高い感じ。


以下はおまけ。

うまく繋がらないなーという時はnslookupとかdigとか使ってみると良いかも。
http://qiita.com/ms2sato/items/d4d9f248f4a39c6debb6

MacでDNSのキャッシュリセットは下記。
sudo killall -HUP mDNSResponder
OpenTKでXamarinでもクロスプラットフォームOpenGL地図描画エンジン入門


最近ベクタ地図化したYahoo地図の中の人が、[OpenGLを使ったAndroid版地図描画エンジンの入門](http://codezine.jp/article/detail/7424)を始めました。

とりあえずネイティブの面白そうなコードを見るとXamarinに写経したくなるので、Xamarin.Androidで写経した上で、Xamarin.iOSでも動くクロスプラットフォームにしてみました。
https://github.com/tilemapjp/map-android-samples
iOS側はかなり実装適当ですが…。

とりあえず1対1写経してやったあと、iOS側に移そうと思っていろいろ調べてたら、各プラットフォームの標準のOpenGLラッパはなんか結構使用感が違うみたいで、OpenGL初心者の私には何が何やらの状態…。
でもXamarin.iOSのOpenGLサンプルをつらつら見てると、よくOpenTKというライブラリを読み込んでいるので、なんぞこれ？と思って調べてみると、[OpenGL、OpenCL、OpenALあたりを共通のAPIで使えるようにc#でラッパ](http://www.opentk.com/)したインタフェースのようでした。
これのOpenGLクラスがXamarin.iOS/Android両方に共通I/Fのライブラリとして提供されていて、かつ割とAndroidのOpenGL I/Fと1対1で置き換えられるので、

* まずAndroidのOpenGL APIを全部OpenTKのそれに置き換えてやる
* (OpenTK自体のAndroid依存を除く)Androidに依存しないOpenTKだけで完結する処理、またユーザ操作を受けて表示領域を切り替える処理等を分離
* Xamarin.iOSでOpenGLの表示領域を準備するところまでMonoTouch.GLKit等で行い、後はAndroidから切り出したOpenTKベースのコードを読み込んでやる  
=> 表示できる事を確認
* Xamarin.iOS側のユーザジェスチャ受け取り処理等を、切り出したユーザ操作処理と結びつけてやる  
=> 操作できる事を確認

ぐらいで、知識なさ過ぎてちゃちゃっと簡単にレベルではなかったものの、まあ年賀状を準備するのが年末最終日にズレ込む程度の実害で対応できました。

OpenGL、Android、iOS全てに詳しい人であれば、OpenGLの各APIや利用シーケンス等も全部覚えていて、AndroidだろうがiOSだろうが最適なOpenGL対応コードをちゃっと書けてしまうのでしょうが、
OpenGLについてほとんど知識のない人間でも、共通APIになっている部分を移し替えるだけで動いている、しかもネイティブアプリとして、という状態に持っていけるのはすごいのではないでしょうか。
（そんなパッと持ってきたコードを実戦で使いたいかどうかは別として、そういう事もできるポテンシャルというのは評価されてよいと思います。）

いくつか同様の事を試される方のために注意点を。

### OpenTKのライブラリロード時にプラットフォーム依存部分がある

ライブラリをusingする時に、各プラットフォーム別に呼び出し分けが必要な部分があるので、注意が必要です。
下記のような感じで共通化できるでしょう。

```cs:OpenTKの呼び出し
#if __ANDROID__
using OpenTK.Platform.Android;
#elif __IOS__
using OpenTK.Platform.iPhoneOS;
#endif
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.ES20;
```

### VertexAttribPointer関数の最終引数はIntPtr型

VertexAttribPointer関数の最終引数は、頂点行列の中の読み込みオフセットを指定する値らしいのですが、intではなくIntPtr型です。
Android側APIだと、0指定にお気軽に定数が書いてあったりしたのですが、OpenTKだと0を指定したくても下記のようにする必要があるようです。

```cs:VertexAttribPointer
int a = 0;
GL.VertexAttribPointer (mAPosition, 3, All.Float, false, FSIZE * 3, (IntPtr)a);
```

### GetAttribLocation関数の引数型がAndroidとiOSで違う

GetAttribLocation関数の第2匹数nameは、実装ミス？なのか何か判りませんが、iOS版ではstring, Android版ではSystem.Text.StringBuilderになっています。
ですので下記のような実装分けが必要です。

```cs:GetAttribLocation
#if __ANDROID__
mAPosition = GL.GetAttribLocation (program, new System.Text.StringBuilder("a_Position"));
#elif __IOS__
mAPosition = GL.GetAttribLocation (program, "a_Position");
#endif
```

### 行列処理とかの便利関数は、独自実装なので使い勝手が違う

行列式等は、例えば4x4行列なら、Android APIはfloat[16]で処理しているのに対し、OpenTKはMatrix4のような構造体を用意し、回転、射影等の処理関数もそれぞれのデータ型に応じたものが提供されているので、そのまま丸写しという感じにはいきません。
といいつつ、OpenGL固有の関数に比して、の話で、実際は割と丸写しでしたが。
個人的には、Matrix4構造体は専用の型を持つ分float[16]より見通しよくなりそうなイメージがありつつ、実際はmatrix[0][1]みたいなアクセスができるわけではなくmatrix.M11みたいなまさかのプロパティ名アクセスなので、ループとかの自動化処理がやりにくくちょっと使い難そうな感じでした。

## 結論

やっぱりXamarin、OpenGLも大丈夫ー

### 誰か

WindowsPhoneでも共通部分そのまま持ち回せるか試してくれないかな…。
うちには環境がない…。
メソッド呼び出しのログをとる記事が面白かったのでマクロみたいな感じにしてみた


# Qiitaを眺めていて
[[Ruby] caller を利用してメソッド呼び出しをログに記録させる。](http://qiita.com/katoy/items/a4dac843383185019f9d)という記事を見つけて，「これ面白い！でも，既存のメソッドにログとる部分を追加するみたいにできないかな？」と思って色々試行錯誤．

イメージとしては，

```rb
def test
  puts “hello world”
end
add_trace :test
```
みたいな感じ．

このとき`add_trace`をうまいこと定義したら，`test`メソッド内にログ用のコードを埋め込めるはず．

# 結果
- まぁできたけど，けっこう複雑…（検証環境：ruby-2.1.0dev）
- Qiitaってサイト内記事を引用する方法あるのかな？
- 毎度毎度，Qiitaの綴りがわからなくなる．

# コード
```rb:trace.rb
# このモジュール内はほぼ参考記事通り
module Util
  class Trace
    @@enable = true
    @@log = nil

    class << self

      def enable= bool
        @@enable = bool
      end

      def log= log
        @@log = log
      end

      def trace *args
        @@log.debug "#{caller.first} (#{args.join(',')})" if @@enable && @@log
      end

      # add_trace用のメソッドだけ追加（callerではうまくいかない）
      def trace2 source, *args
        @@log.debug "#{source.join(':')} (#{args.join(',')})" if @@enable && @@log
      end

    end
  end
end

define_method :add_trace do |method_name|
  # メソッド定義位置をあらかじめ取得（evalを使うため）
  __source = method(method_name).source_location.push("`#{method_name}'")
  # 新しいメソッド名
  __new_method = "__original_#{method_name}".to_sym
  # パラメータリストを取得（eval用に文字列にしておく）
  __params = method(method_name).parameters.map{|a| a[1]}.join(',')
  # traceコードを含んだ新しいメソッドを定義
  self.instance_eval <<-EOS
    alias :#{__new_method} :#{method_name}
    def #{method_name}(#{__params})
      Util::Trace.trace2(#{__source},#{__params})
      self.send(:#{__new_method}, #{__params})
    end
  EOS
end


if $0 == __FILE__

  require 'logger'

  Util::Trace.log = Logger.new(STDERR) do |log|
    log.level = Logger::DEBUG
  end

  def sub
    puts "'sub' is called"
  end
  add_trace :sub

  def sub2( x, y )
    puts "'sub2’( #{x}, #{y} ) is called"
  end
  add_trace :sub2

  Util::Trace.enable = true
  puts "----- trace on"
  sub
  sub2 1, {a: 2, b: 3}

  Util::Trace.enable = false
  puts "----- trace off"
  sub
  sub2 1, {a: 2, b: 3}

end

```

長い…　結局重要なのは`define_method :add_trace`のブロック．
`if $0 == __FILE__`以下は検証用．

パラメータ渡す部分はけっこう悩んだけど，とりあえず`eval`さんの破壊力で解決．
というか，ほぼ`eval`さん頼みであまり美しくはない．
特にこの表示だと変にハイライト効いちゃって意味不明．

そういえば，Methodオブジェクトってあまり使ったことなかったけど，今回は大いに役立ってくれました．

以下，実行結果．

```
$ ruby trace.rb
----- trace on
D, [2013-12-30T04:58:20.325428 #69889] DEBUG -- : trace.rb:56:`sub' ()
'sub' is called
D, [2013-12-30T04:58:20.325507 #69889] DEBUG -- : trace.rb:61:`sub2' (1,{:a=>2, :b=>3})
'sub2'( 1, {:a=>2, :b=>3} ) is called
----- trace off
'sub' is called
'sub2'( 1, {:a=>2, :b=>3} ) is called
```
ちゃんとメソッドの定義位置もとれてる．

# おわりに
しばらくRubyつかってなかったけど，やっぱり何でもありな感じが楽しい言語でした．
CSSをjavascriptで操作する



<html lang="ja">

    <head>
        <meta charset="utf-8"/>
        <script>
            window.onload = function(){
                var contents = document.getElementById('contents');
                contents.innerHTML = '<ul>'+
                    '<li>List1</li>'+
                    '<li>List2</li>'+
                    '<li>List3</li>'+     
                    '</ul>';
                var li_element = document.createElement('li');
                li_element.innerHTML = 'List4';
                var ul = document.querySelector('#contents > ul');
                ul.appendChild(li_element);
                var btn = document.getElementById('btn');
                btn.addEventListener('click',function(){
                var h1 = document.querySelector('#container > h1');
                
                //h1.style.borderBottom = 'solid 1px #999';
                //h1.style.marginBottom = '20px';
                //h1.style.padding = '0px';
                h1.className = 'title';
                ul.className = 'information';
                    
            },false);
                
            };
        </script>
        
        <style>
            h1.title{
                border-bottom:solid 1px #999;
                margin-bottom:20px;
                padding:0;
            }
            
            ul.information{
                font-weight:bold;
            }
            ul.information li{
                padding:10px;
                border-bottom:solid 1px #ccc;
            }
        </style>
    </head>
    <body>
        <div id='container'>
            <h1>見出し１</h1>
            <div id='contents'></div>
            <p><input type="button" id="btn" value='Styleを適用' /></p>
        </div>
    </body>
</html>
プロパティ変数の属性オプション


値をどのように割り当てるかを指定する属性

|属性|意味|
|:-----------|:-----------|
|assign|参照ではなく値を代入する|
|strong|強い参照(初期値)|
|weak|弱い参照|
|copy|オブジェクトをコピーする|

アクセス権などを指定する属性

|属性|意味|
|:-----------|:-----------|
|readonly|読み出しのみ|
|readwrite|読み書き自由(初期値)|

アクセサメソッドに関する属性

|属性|意味|
|:-----------|:-----------|
|nonatomic|アトミックではない|
|getter=ゲッタ名|ゲッタメソッドを指定する|
|setter=セッタ名|セッタメソッドを指定する|
ボタンを押すことでテキストエリアの内容を消すjs



<html>
\<head>
        <meta charset="utf-8" lang="ja" />
****
\<script>

            function reset(){

                var reset_target = document.getElementById("text");

                if(reset_target.value == ''){
                    alert('すでにリセットされています。');
                }else{
                    reset_target.value = '';
                }
}; 
            window.onload = function(){
                var btn = document.getElementById('reset');//resetIdのボタンにbtnという関数を付与。
                btn.addEventListener('click',function(){
                                     reset();
            },false);
            }; 
 
\</script>
****
\</head>
	   \<body>
        \<textarea id="text" style="width:200px; height:100px;" ></textarea>
        \<p>\<input type="button" id="reset" value="リセット"></p>
    	\</body>
</html>


※jsの注意点
Functionとfunctionは区別する。
innerHTMLでhtmlファイルを簡単に書き換えるjs




\<html lang="ja">
\<head>
\<meta charset="utf-8">
****

\<script>

window.onload = function(){
                
	var contents = document.getElementById('contents');
                
	contents.innerHTML = '<ul>'+
                    ’<li>List1</li>'+
                    ’<li>List2</li>'+
                    ’<li>List3</li>'+
                    ’</ul>';
            };
\</script>

****
    </head>
    <body>
        <div id='container'>
            <h1 class='title'>見出し１</h1>
            <div id='contents'></div>
        </div>
    </body>
</html>
ファイルを閉じるときの:wq :x ZZ 挙動を確認した。


ぐぐったら:wqとZZを同じと堂々と書いてるサイトがたくさんあって割りとびつくりしたし、何か自分で確認しないと不安だったので。
Qiitaの検索で'vim :x'で検索して一件もhitしなかったので全く同様の検証や解説を書いた記事はない認識です。。

検証は手元にあったのは
mac:MacOS10.7.5
VIM:7.3.515  

----
ubuntu:Ubuntu12.04LTS
VIM:7.3.429
の2環境。ただ既にデフォルトの挙動とことなる設定にしている可能性があるので比較はもしかしたら意味が無いかもしれないです。


終了方法は　:wq :x ZZ の3通り。
開いたファイルに対して行う操作は
ケース1 何も他の操作をせずにすぐに終了
ケース2 インサートモードで文字入力を行い、その後にxで削除して編集前と同じ内容にする。
ケース3 インサートモードで文字入力を行い、その後にuで編集を取り消して編集前と同じ内容にする。

挙動が違うとの判定基準にタイムスタンプの更新の有り無しで判定します。

| ケース| mac|mac|mac|ubuntu|ubuntu|ubuntu|
|:-----------|------|------|----|---|----|---:|
|終了方法|:wq|:x|ZZ|:wq|:x|ZZ|
| ケース1 |有り|無し| 無し|有り|無し|無し|
| ケース2 |有り|有り| 有り|有り|有り|有り|
| ケース3 |有り|無し|無し|有り|無し|無し| 

ふーむ、ふーむ。十分に整えた環境ではありませんがOSやバージョンによって変動しない環境と思って良さそうかな？  
変更してなくてもタイムスタンプ更新されるのは私はイヤなんですが、コレを調べようと思ったきっかけは:wqのがより良い終了方法でZZは嫌い とのことで。。まぁご本人にきいてみたほうが早いかもしれん。  
それとも何かタイムスタンプ以外にもチェックするべき箇所あったかな。。
タイムスタンプ以外のポイントや、こういうメリット・デメリットがをご存知の方は気が向きましたら何かコメとかで下さいませ。
Railsでメソッド名を文字列から作る方法

メソッド名が

`method1`
`method2`

などとなっているメソッドがあったとします。
このとき、「変数`id`に`2`が入っていたならば`method2`を呼び出す」なんてことをしたいとします。

そのようなときは`send`メソッドを使用します。

`method2`を作りたければ

```ruby
id = 2
send("method"+id)
```
で作れます。

なので

```rb
Sample.send("method"+id)
```

という使い方ができます。
mod_mruby を VS2013 でビルドする方法

* [matsumoto-r さん作の mod_mruby](https://github.com/matsumoto-r/mod_mruby) を VS2013 でビルドします。
* ド素人なので、こうしたらもっと良いよとかの情報があればコメントしてもらえると助かります

# Apache モジュールをビルドするための下準備
## ActivePerl をインストールする
現時点ではv5.16.3

- http://www.activestate.com/activeperl

## XAMPP をインストール
現時点では1.8.2

- http://www.apachefriends.org/jp/xampp-windows.html
- 今回は c:\xampp にインストールしたとする

## apxs-win32 をダウンロード
- http://www.apachelounge.com
- Download -> Additional から apxs-win32.zip をダウンロード
- apxs-win32をunzip した後、以下のコマンドを入力

```
cd apxs-win32
perl Configure.pl --with-apache2=c:\xampp\apache --with-apache_prog=httpd.exe
```

# mod_mruby のビルド手順

## Visual Studio 2013 をインストールする
無償試用版をダウンロード

- http://www.microsoft.com/ja-jp/dev/

今回は C:\Program Files\Microsoft Visual Studio 12.0 にインストールしたものとする

## git インストール

- http://git-scm.com/

## ruby インストール

- https://www.ruby-lang.org/ja/

## bison インストール
- MinGW でインストールした
- msys 下のbinファイルを環境変数PATHに通しておく

## mod_mruby clone
```
git clone https://github.com/bamchoh/mod_mruby
git checkout support_to_build_vs2013 origin/support_to_build_vs2013
```

## mruby をビルド
```
cd mruby
ruby ./minirake
cd ..
```

## mod_mruby をビルド
### Makefile.vs2013 修正
- APACHE_ROOT を _xampp下のapacheのパス_ に指定
- LIBPATH に kernel32.lib があるパス と msvcrtd.libがあるパスを指定

```
nmake -f Makefile.vs2013
```

# Apache モジュールの動作確認
- mod_mruby.so を xampp/apache/modules 下にコピー

- httpd.conf に 以下の行追加

```
LoadModule mruby_module modules/mod_mruby.so
<IfModule mruby_module>
AddHandler mruby-script .rb
</IfModule>
```

- test_without_discount.rb を xampp/htdocs 下にコピー
- xampp 起動
- http://127.0.0.1/test_without_discount.rb に アクセス / 
サーバー情報等が表示されてればOK
common lispでメール送る（gmail）

(ql:quickload :cl+ssl)
(ql:quickload :cl-smtp)
して
(cl-smtp:send-email "smtp.gmail.com" "from_addr@gmail.com" "to_addr@xxx.jp" "件名" "本文"
                    :ssl :tls :authentication '(:login "from_addr@gmail.com" "パスワード"))
でいけた。

http://d.hatena.ne.jp/nagayoru/20090306/1236295373
↑参考というかそのまま
SublimeText2でテキストファイルやHTMLファイルの自動入力補完を有効にする

SublimeText2の入力補完機能は、.rbや.jsといったソースファイルを編集しているときはキー入力に反応して補完ウィンドウを表示してくれるのですが、テキストやHTMLでは`Ctrl + Space`を入力しなければ表示されません。

テキストやHTMLでもキー入力に反応して補完されるようにするには設定ファイルの`auto_complete_selector`を書き換えます。
（設定ファイルはメニューの"Preferences > Settings - Default"で表示できます）

デフォルトでは以下のようになっていると思います。

```Preferences.sublime-settings(old)
"auto_complete_selector": "source - comment",
```

これに対して`text`を追加します。

```Preferences.sublime-settings(new)
"auto_complete_selector": "source - comment, text",
```

また、以下のように記述するとHTMLのみが対象になります。

```Preferences.sublime-settings(new)
"auto_complete_selector": "source - comment, text.html",
```
Sencha Architect 3 で TouchGrid を使えるようにする


Sencha Touch 2.3 には TouchGrid というタッチデバイス向けのグリッドコンポーネントが含まれています。

詳しくは[こちら](http://www.xenophy.com/sencha-blog/8935)をご覧ください。

この TouchGrid を Sencha Architect 3 のコンポーネントとして使えるようにする手順です。

* * *

1. TouchGrid は Sencha Touch Bundle または Sencha Complete に含まれているので、それをダウンロードします。その中に sencha-touch-grid.aux があります。
![Sencha-touch-grid_1.png](https://s3-ap-northeast-1.amazonaws.com/yosh18qiita/Sencha-touch-grid_1.png "secha-touch-grid_1.png")
1. Sencha Architect 3 のメニューから [File] - [Install User Extension] を選択、または左ペインから [EXTENSIONS] をから sencha-touch-grid.aux を選択します。

![Sencha-touch-grid_2.png](https://s3-ap-northeast-1.amazonaws.com/yosh18qiita/Sencha-touch-grid_2.png "secha-touch-grid_2.png")
3. すると EXTENSIONS に sencha-touch-grid が追加されます。
![Sencha-touch-grid_3.png](https://s3-ap-northeast-1.amazonaws.com/yosh18qiita/Sencha-touch-grid_3.png "secha-touch-grid_3.png")


以上。