OmniAICreator/Qiita-1.07M huggingface dataset:
UIButton のアイコン部分だけをアニメーションさせる

UIButton は背景とアイコンを別に画像指定出来るので、アイコンにあたる UIImageView の transform を使ってアイコン部分だけをアニメーションさせる、ということができる。
例えば、カメラの撮影ボタンの中身だけを画面回転に合わせて動かしたい時などに使える。

```objectivec
UIButton *btn;
[btn setImage:icon forState:UIControlStateNormal]; // アイコン
[btn setBackgroundImage:bg forState:UIControlStateNormal]; // 背景

// 追記: この行を UIViewAnimation で括るとアニメーションになる --
btn.imageView.transform = transform; // CGAffineTransform
// --
```

ただ、これだけだと transform 適用時にうまく描画されないことがあるので、以下2行を追加する：

```objectivec
btn.imageView.clipsToBounds = NO;
btn.imageView.contentMode = UIViewContentModeCenter;
```
普通にビルドしてみる Ruby 2.0.0-rc1

投げっ放しな手順 on Mac OS X

```bash:INSTALL
# Xコードとコマンドラインツール入れる
# homebrew 入れる
brew install autoconf
brew install openssl

curl ftp://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-rc1.tar.bz2 -O
tar xjf ruby-2.0.0-rc1.tar.bz2
cd ruby-2.0.0-rc1
autoconf
./configure --prefix="$HOME/ruby" \
  --with-openssl-dir=/usr/local/opt/openssl
make
make install
export PATH=$HOME/ruby/bin:$PATH
```
画像の加工処理にMiniMagickを使う


MiniMagick 
https://github.com/minimagick/minimagick

> A ruby wrapper for ImageMagick or GraphicsMagick command line.

ReadmeにはRMagickのメモリリークについての言及があり、そのsolutionとして作ったとの記述が。
これを使うことにしました。

##MiniMagickを使う

```mini_magick.rb
require 'mini_magick'
image = MiniMagick::Image.open("food.jpeg")
result = image.composite(MiniMagick::Image.open("overlay.png", "jpg")) do |c|
  c.gravity "northeast" 
  c.quality "75" 
end

result.write "output_minimagick.jpg" 
```

↓imagemagickのCLIを使う場合

```imagemagick.rb
cmd = "convert food.jpeg overlay.png -gravity northeast -composite -format jpg -quality 75 output_imagemagick.jpg" 
system cmd
```

###実行速度測定
(480x480の画像にオーバーレイ処理した場合)

>
$ time ruby mini_magick.rb
real     0m0.438s
user     0m0.288s
sys     0m0.117s
>
$ time ruby imagemagick.rb
real     0m0.146s
user     0m0.081s
sys     0m0.054s

MiniMagickを使うと、CLIを直接使う場合の約3倍の処理時間がかかりました。
速度を考えるとCLIが最強ですが、MiniMagickを使えば前述のコードのように、CLIを直接呼び出すよりも書きやすくなります。


上記のコードは以下にもアップしてあります。
https://github.com/masawo/minimagick_test


##参考
ImageMagick: Command-line Tools
http://www.imagemagick.org/script/command-line-tools.php

mini_magickとImageMagickで画像を切り取る - 橋本詳解
http://d.hatena.ne.jp/shokai/20120303/1330783040
Twitter BootstrapのTabの使い方

サンプル通りに書くと，
Tabの表示が出来なかったのですが，
以下を追加すると，
Tabが動くようになりました！

（　以下のcodeはほぼHTMLです．
　　とはいえ，scriptの中に変な□の表示が出てしまうので，
　　jsp表示としています．
　　　↑実際に動かしているのもjspです．
　　あしからず;　）

※ 私のための備忘録です． 

```jsp:momoclo.jsp
<html>
<head>
<link href="../bootstrap/css/bootstrap.css" rel="stylesheet">
<!-- 下を追加 -->
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.js"></script>
</head>

<body>
	<!-- tab -->
　　	<div class="tabbale">
		<div id="content">
			<ul class="nav nav-tabs">
				<li class="active"><a data-toggle="tab" href="#2" >Red</a></li>
    	　　　		<li class=""><a data-toggle="tab" href="#4">Pink</a></li>
    	　　　		<li class=""><a data-toggle="tab" href="#1">Yellow</a></li>
    	　　　		<li class=""><a data-toggle="tab" href="#3" >Green</a></li>
    	　　　		<li class=""><a data-toggle="tab" href="#5">Purple</a></li>			
    　　　		</ul>
    		
    		<div id="my-tab-content" class ="tab-content">
        　　　			<div class="tab-pane active" id="1">
           　　 　			<h1>Yellow</h1>
            　　　			<p>しおりん</p>
        　　　			</div>
        　　　			<div class="tab-pane" id="2">
            　　　			<h1>Red</h1>
            　　　			<p>かなこ</p>
        　　　			</div>
        　　　			<div class="tab-pane" id="3">
            　　　			<h1>Green</h1>
            　　　			<p>ももか</p>
        　　　			</div>
        　　　			<div class="tab-pane" id="4">
            　　　			<h1>Pink</h1>
            　　　			<p>あーりん</p>
        　　　			</div>
        　　　			<div class="tab-pane" id="5">
            　　　			<h1>Purple</h1>
            　　　			<p>れにちゃん</p>
        　　　			</div>
        	</div>
        </div>

　　		<!--  ここが重要！ -->
　　　　	<script type="text/javascript">
    　　　		jQuery(document).ready(function ($) {
        　		$('#tabs').tab();
    　　		});
　　　　	</script>
	</div> <!-- container -->

	<!--  これも忘れずに！！bootstrap.jsを読み込んであげましょう -->
	<script type="text/javascript" src="../bootstrap/js/bootstrap.js"></script>
	
</body>
</html>
```
dateコマンドでの ago 指定の罠 

date コマンドの -d オプションでは ```date -d '1 week ago'``` のような形式で現在日時から x単位前の日時を指定できます。

ふと "1ヶ月と1日前" が欲しくなったのでこうしたら…

```sh
% date -d '1 month 1 day ago'
Thu Feb  7 09:18:24 JST 2013
```

…軽くタイムスリップしてしまい、何が何やら。 叩いたのは今日、2013/1/8 なので、これは "1ヶ月後の1日前" の日付。

"1ヶ月と1日前" のように単位を複数指定する場合は ago を重ねないといけない様子。なんと言うか...人間の目には中途半端でキモい。また無意識にやらかしそうで怖い。

```sh
date -d '1 month ago 1 day ago'
```

------------------------------

結論: 変に気取った書き方しないで +/- 使っとけってことですな

```sh
date -d '-1 month -1 day'
```
Rack::CacheでMemcachedのSASL認証を使う

SqaleではMemcachedが使えるのですが、SASL認証が必要なので、単にURIを設定するだけでは動きません。
Rack::CacheのストレージにMemcachedを使おうとすると、READMEなどを読んだだけではやり方が分からなかったのでメモ。

1. Memcachedの起動＆設定確認
----------------------------
Memcachedの起動とホストなどの設定確認は[公式サイト][sqale]を見てください。

[sqale]: https://sqale.jp/support/manual/how-to-use-memcached

2. 設定を`.env`に書く
---------------------
上で確認した設定を`.env`に書いてコミットします。

    MEMCACHE_SERVERS=memcached001.sqale.lan
    MEMCACHE_PORT=11211
    MEMCACHE_USERNAME=kyanny-memkun
    MEMCACHE_PASSWORD=6b5af17e19f746bdd891bc076bf75ec73dda6a792b61d66a

3. 必要なRubyGemsをバンドルする
-------------------------------
Gemfileに追記します。

```ruby:Gemfile
gem 'dalli'
gem 'rack-cache'
```
4. `config.ru`で`Rack::Cache`の設定をする
-----------------------------------------
`config.ru`の`Rack::Cache`を使いたいアプリケーションのところで設定をします。

```ruby:config.ru
# :
# :
# :
require 'dalli'
require 'rack-cache'
# :
# :
# :
map "#{base_dir}/recent.atom" do
	memcached_stem = "memcached://#{ENV['MEMCACHE_SERVERS']}:#{ENV['MEMCACHE_PORT']}"
	memcached_query = "username=#{ENV['MEMCACHE_USERNAME']};password=#{ENV['MEMCACHE_PASSWORD']}"
	use Rack::Cache,
		:verbose => true,
		:metastore => "#{memcached_stem}/meta?#{memcached_query}",
		:entitystore => "#{memcached_stem}/body?#{memcached_query}"
	run TDiary::Feed.new('atom')
end
```

これで`Rack::Cache`が使えるはずです。
ポイントは、`username`などのパラメーターを、URIのクエリーパラメーターとして渡すところですね。`Rack::Cache`のソースのコメントに書いてありました。
rspec カスタムマッチャー

以下のようなことがしたいときに使う。

```
it { 1.should greater_than 0 }
```

`RSpec::Matchers::define`を利用する。

```
RSpec::Matchers.define :greater_than do |expected|
  match {|actual| actual > expected }
end
```

see: https://www.relishapp.com/rspec/rspec-expectations/v/2-12/docs/custom-matchers/define-matcher
rspec Pending Tips

`it`, `specify`, `example`それぞれの先頭に`x`をつけるだけで、Pendingになる。

```
describe Foo do
  xit { 1.should eq 1 }
  xspecify { 1.should eq 1 }
  xexample { 1.should eq 1 }
end
```

Result

```
Pending:
  Foo 
    # Temporarily disabled with xit
    # ./spec/models/foo_spec.rb:4
  Foo 
    # Temporarily disabled with xexample
    # ./spec/models/foo_spec.rb:6
  Foo 
    # Temporarily disabled with xspecify
    # ./spec/models/foo_spec.rb:5
```
oh-my-zshを使って, コマンドのオプション補完を追加

# oh-my-zsh

https://github.com/robbyrussell/oh-my-zsh

まず, oh-my-zshをダウンロードする.

```console
$ git clone https://github.com/robbyrussell/oh-my-zsh.git
```

<details><summary>オプション補完を追加できるコマンドの一覧 (編集時点)
</summary><div>

```console
$ ls ./oh-my-zsh/plugins/**/_* | gawk -F/ '{print $NF}'
_adb
_autopep8
_bazel
_boot2docker
_bower
_bundler
_capistrano
_cargo
_celery
_codeclimate
_coffee
_cpanm
_dnote
_docker-compose
_docker-machine
_docker
_extract
_fab
_fd
_flutter
_frontend-search.sh
_gas
_gatsby
_gb
_geeknote
_gem
_git
_hub
_asadmin
_gradle
_httpie
_ipfs
_jira
_kitchen
_knife
_artisan
_lein
_port
_meteor
_mix
_nanoc
_nomad
_nvm
_security
_pass
_pep8
_pip
_pod
_powder
_powify
_pylint
_rails
_react-native
_rebar
_redis-cli
_repo
_ripgrep
_ros
_rust
_rustup
_salt
_sbt
_scala
_scd
_scw
_sfdx
_spring
_supervisorctl
_supervisord
_swift
_task
_terminitor
_terraform
_thor
_tmux-cssh
_tmuxinator
_tugboat
_ufw
_vagrant
_vault
_wake
_wd.sh
_xcselv
_yarn
_zeus
_n-kill
```
</div></details>


# 設定

上の中から, 例えば, `docker`, `terraform`, `pip`のオプション補完を追加する場合は,
以下のように`$fpath`を追加する.
(ただし, `$fpath`は`compinit`より前に書く. )

```bash:~/.zshrc
# fpathの追加
for cmd in docker terraform pip ; do
    fpath=(/path/to/oh-my-zsh/plugins/$cmd $fpath)
done

# 補完を有効化
autoload -Uz compinit
compinit -u
```

`~/.zshrc`の再読み込み後, これらのコマンドでオプション補完が有効になる.
システムモニタConkyでグローバルIPアドレスとホスト名を表示

# 設定

`~/.conkyrc`に以下を追記する.

```~/.conkyrc
[Global]
${texeci 3600 curl ifconfig.me}
${texeci 3600 curl ifconfig.me/host}
```


# 説明

`$texeci`により, 指定した時間間隔でコマンドを実行して, その出力を __Conky__に表示できる.
`texeci`の後の数字は, 実行するコマンドの時間間隔 (秒) で, 適宜編集する.

なお,

- __グローバルIPアドレス__は`curl ifconfig.me`,
- __ホスト名__は`curl ifconfig.me/host`,

により, 取得できる.


# 参考

[Linux/conky - epian-wiki](http://epian-wiki.appspot.com/wiki/Linux/conky)
Qiitaの投稿をGitHubにバックアップ

[元記事](http://qiita.com/items/a98dffc4b1ad095898b1)を参考に、Pythonに移植
##使い方

+ [GitHub](https://github.com/)のアカウントを作成してください
+ [GitHub for Windows](http://windows.github.com/)とPythonをインストールしてください
+ GitHub for Windowsを起動して、新規リポジトリ`Qiita`作成
+ [update.py](https://github.com/Tsutomu-KKE/Qiita/blob/master/update.py)をリポジトリに追加し、中身の`user`を自分のidに書き換え
+ GitHub for WindowsでQiitaを開きtoolsメニューの`open a shell here`でGit Shellを起動し、`python update.py`を実行
pythonでcase class

Scalaでcase classというのがあります。
newする際に入れた引数とその名前でimmutableオブジェクトを作ってくれるやつです。

便利なのでpythonでもcase classっぽいもの作りたいなー、と思ってやってみました

```python
def caseclass(args):

    class _Case(object):
        def __init__(self, kwargs):
            self._initwargs = kwargs


        def _type_check(self, key, value):
            if isinstance(value, self._initwargs[key]) is False:
                raise TypeError;

        def init(self, **kwargs):
            [self._type_check(key, kwargs[key])  for key in kwargs]
            self._kwargs = kwargs

        def getattr(self, name):
            return self._kwargs[name]

        def setattr(self, name, value):
            raise TypeError;



    def case(klass):
        _case = _Case(args)
        krass = type(klass.__name__, klass.__bases__,
                     {
                "__getattr__":_case.getattr,
                "__setattr__":_case.setattr,
                "__init__":_case.init
                })

        return krass

    return case
```
で、使い方はcaseclassをデコレータとして使います

```python
#{引数:引数の型}という形式の辞書インスタンスを引数にします
@caseclass({'foo':str, 'bar':int})
class Hoge(object):pass

hoge = Hoge(foo = "hello", bar = 1)
print(hoge.foo) # "hello"と出力
print(hoge.bar) # 1と出力
hoge.num = 1 # SetしようとするとTypeErrorが飛びます

fuga = Hoge(dosukoi = "nokotta") #と、定義されてない引数を指定してもErrorが飛びます
```

もしかしたら、もっといいやり方あるかも
How to use Googl Drive API via google/api_client on Ruby

This is a record of my trial to use Google Drive API on Ruby (and on Rails).

1. For installed applications
Differences from web applications
-> Include  some parameters in authorization code request at a first authorization (access_type=offline& approval_prompt=force)
-> Require refresh_token ( and access_token ,too).

My sample code is following.

```ruby:qiita.rb
require 'google/api_client'
  ##
  # Retrieve a list of File resources.
  #
  CLIENT_ID = ' your client ID '
  CLIENT_SECRET = ' your client secret '
  REDIRECT_URI = ' your redirect url '
  OAUTH_SCOPE = 'https://www.googleapis.com/auth/drive'
  
 # Initialize the client & Google+ API
  client = Google::APIClient.new
  # Initialize OAuth 2.0 client
  # client.authorizaton returns Signet::OAuth2::Client objext

  client.authorization.client_id = CLIENT_ID
  client.authorization.client_secret = CLIENT_SECRET
  client.authorization.redirect_uri = REDIRECT_URI
  client.authorization.scope = OAUTH_SCOPE

  # Request authorization
  redirect_uri = client.authorization.authorization_uri
  # You will get a redirect URL, and input it to an address var of a browser.
  puts redirect_uri
  # When prompted ,copy an authorization code and paste it to your terminal.
  client.authorization.code = gets.strip

  # Get tokens
  # ex. {"access_token"=>"ya296ZSGyxLfflpv1ADxHjCKvZLoKyVylgjiLhW1sX_fKw",
  #      "token_type"=>"Bearer", "expires_in"=>3600,
  #      "refresh_token"=>"1/4jaoSQ_edOCVegeaORYEdlwMiwyLJB3E1uNz3hfKQto"}
  tokens = client.authorization.fetch_access_token
 
  #Update tokens and retrieve a list of File Resources.
 begin
    client.authorization.update_token!(
        :refresh_token => tokens["refresh_token"],
        :access_token => tokens["access_token"],
        :expires_in => tokens["expires_in"]
    )
    drive = client.discovered_api('drive', 'v2')  
rescue
    puts "Here is in resucue"
 ensure
    result = Array.new
    page_token = nil
    begin
      parameters = {}
      if page_token.to_s != ''
        parameters['pageToken'] = page_token
      end
      api_result = client.execute(
          :api_method => drive.files.list,
          :parameters => parameters)
      if api_result.status == 200
        files = api_result.data
        result.concat(files.items)
      else
        puts "An error occurred: #{result.data['error']['message']}"
        page_token = nil
      end
   end while page_token.to_s != ''
   # Printing file names
   result.each { |item|
      puts item.title
   }
end
```


参考にしたURL
http://www.eisbahn.jp/yoichiro/2012/10/google-drive-api-ruby-on-rails.html
http://www.eisbahn.jp/yoichiro/2012/05/google_oauth2_web_server_profile_refreshtoken.html
http://code.google.com/p/oauth-signet/wiki/SignetOAuth2Client
http://rubydoc.info/github/google/google-api-ruby-client/
https://developers.google.com/drive/v2/reference/files#resource
いじょ
cakephpのauth

備忘録としてメモ
IDとパスワード以外を、条件にセットしたい場合
beforefilterに
こんな感じで追加

 //ログインの際の追加条件(仮登録状態のユーザにはログインさせない)
 ```$this->Auth->authenticate = array(
                AuthComponent::ALL => array(
                'userModel' => 'User',
                'scope' => array("User.reg_flag" => 1)
                ),
                'Form');
```
Rails で "cannot parse Cookie header: invalid %-encoding" に対処する

# tl;dr
Rails で "cannot parse Cookie header: invalid %-encoding" ってエラーが頻発したら、
[morenocarullo/rack-cleancookies](https://github.com/morenocarullo/rack-cleancookies/blob/master/lib/rack/cleancookies.rb) を使って不正な cookie を無視するようにすると解決します。

# 試してみよう
おもむろにブラウザであなたの Rails アプリを開き、コンソールから

```js
document.cookie = "hi=%;"
```

と入力して、ページをリロードしてみましょう。
500 が出ましたか？

# エラー出た？
はい、cookie に "%" という文字列が入ると Rack が 500 を返します。
この挙動に関する議論は

- ["invalid %-encoding" error leaves rack.request.cookie_hash == nil · Issue #225 · rack/rack](https://github.com/rack/rack/issues/225)
- [bad diagnostics for malformed cookies · Issue #2622 · rails/rails](https://github.com/rails/rails/issues/2622)

などにあります。

# あり得そうなストーリー
「なんで cookie に "%" いれなあかんねん」と感じるかもしれません。しかし、あり得るストーリーとしては、Google Analytics で流入元をトラッキングする際に、例えばキャンペーン名を「10%OFF」として、
http://example.com/?utm_source=...&utm_medium=...&utm_campaign=100%25OFF
なんて URL を載せてしまうかもしれません。
この URL にアクセスすると、Google Analytics は `utm_campaign` の値を cookie に保存してしまい、その cookie を持ったままアクセスするとエラーが発生します。エラーが起きても cookie は勝手に消えないので、このリンクを踏んだブラウザでは恒常的にエラーが出続けます。
これ、ハマりそうな予感がしませんか。

# 対策
[morenocarullo/rack-cleancookies](https://github.com/morenocarullo/rack-cleancookies/blob/master/lib/rack/cleancookies.rb) という Rack ミドルウェアを使って、不正な cookie を無視するようにすると、エラーにはならなくなります。
Gemfile に

```ruby
gem 'rack-cleancookies'
```

と書いて `bundle install` し、

```ruby
if defined?(Rails.configuration) && Rails.configuration.respond_to?(:middleware)
  Rails.configuration.middleware.insert_before ActionDispatch::Cookies, Rack::CleanCookies::Middleware
end
```

というコードを `config/initializers/clean_cookies.rb` あたりに仕込みます。
この Rack ミドルウェアでは、`invalid %-encoding` が出る cookie を除外して、次の Rack ミドルウェアに渡します。
`ActionDispatch::Cookies` の前に登録しているため、エラーを起こさないというわけです。

初 Qiita でした。
ggplot2

load library

```r:R
library(ggplot2)
```

load csv file

```r:R
d <- read.csv("./file.csv")
head(d)
```

適当に

```r:R
ggplot(d, aes(journal)) + geom_bar()

ggplot(d, aes(year, fill=lib_type)) + geom_bar()

ggplot(d, aes(year, fill=lib_type, data=mtcars)) + geom_bar()
```

色とか付けちゃったりして

```r:R
ggplot(d, aes(x = min_read_length, y = total_seq_qual)) + geom_point(aes(colour = lib_type))

ggplot(d, aes(x = log(total_number_of_reads), y = total_seq_qual)) + geom_point(aes(colour = lib_type))

ggplot(d, aes(x = index, y = total_seq_qual)) + geom_point(aes(colour = lib_type))

ggplot(d, aes(x = min_read_length, y = total_seq_qual)) + geom_point(aes(colour = year)) + facet_wrap(~ lib_type)
```

densityとか

```r:R
ggplot(d, aes(x = min_read_length)) + geom_density(aes(colour = year))
```
Ubuntu+WeechatでもIRCで呼ばれたら通知したい！

MacだとGrowl使えたけどUbuntuで似たことやるにはどうすんだろと思って調べた.

[notify-send](http://manpages.ubuntu.com/manpages/gutsy/man1/notify-send.1.html) というのがある. これを使えば任意のテキストをGrowlっぽく通知させることができる.

````
$ gem install weechat
````

以下のような内容を `~/wee.rb` として保存.

``````````````ruby:~/wee.rb
# coding: utf-8
require 'rubygems'
require 'weechat'

def weechat_init
  Weechat.register("send-notify", "memerelics", "0.1", "GPL3",
                   "Notify message with using notify-send.", "", "")
  run_hook_signal
  return Weechat::WEECHAT_RC_OK
end

def run_hook_signal
  Weechat.hook_signal("weechat_highlight", "notify_highlight", "")
end

def notify_highlight(data, signal, message)
  notify message
end

def notify message
  system("/usr/bin/notify-send", message)
end
``````````````

weechatコマンドで以下のようにこのスクリプトをload.

```````````
/ruby load ~/wee.rb
```````````

これであとは自分の名前が出たらポップアップが出てきます.

![](http://i.imm.io/RZyY.png)

![](http://i.imm.io/RZyO.png)

あずにゃんに怒ってもらうことができました.
【エラー】Collection was mutated while being enumerated.


##意味
列挙子つかってアクセスしてる最中に配列の中身を変更すんじゃねぇよ、次のオブジェクトわかんなくなるやろぼけ

##解決策
	for (id *obj in [hogeArray reverseObjectEnumerator]) {
        
    }

ってかんじにreverseObjectEnumeratorを使う。
arrayが逆順になるので中身を変更しても次のオブジェクトは変わんないのでだいじょうぶ
楽しいコールバックの使い方

##コールバックとは
###概要
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;プログラム中で、呼び出し先の関数の実行中に実行されるように、あらかじめ指定しておく関数。呼び出し先の関数の引数としてコールバック関数への参照情報を渡すことで、呼び出し先から任意のコールバック関数を実行させ、コールバック関数に実行制御を移すことができる。電話を相手に一度かけて電話番号のみを伝え、いったん電話を切って折り返し相手からかけなおしてもらう様子(これを「コールバック」という)に似ているためこの名前がついた。コールバック関数は、呼び出し先で何らかのイベントが発生した場合の処理を指定する目的で使われることが多い。コールバック関数を使うと、イベントの発生を検知するための処理と、そのイベントが起こった時に実行すべき個々の処理を分離して記述することができる。
###自分の理解
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;関数Bのポインタはパラメーターとして、関数Aに渡します。関数Aは動いている時、そのポインタを利用して、関数Bを呼び出します。このような状況に、関すBはコールバックというものです。
例えば：
$("button").click(function(){
&nbsp;&nbsp;&nbsp;&nbsp;$("p").hide("slow",function(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert("The paragraph is now hidden");
&nbsp;&nbsp;&nbsp;&nbsp;});
});
    この中、function(){alert("The paragraph is now hidden");}はコールバック関数です。
##クロージャーとは
###概要
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;典型的にはクロージャは、外側の関数（以下、エンクロージャ）の内側の関数リテラルや、ネストした関数定義によって必要になる。言語により、そのような内側の関数内に出現する自由変数（内側の関数の仮引数でもなく、内側の関数自身のローカル変数でもない変数）の扱いは異なるが、自由変数が、その呼び出しにおけるエンクロージャのその名前の変数を、レキシカルに参照するのがクロージャであり、実行時に外部の関数が実行された際、クロージャが形成される。クロージャは内部の関数のコードとエンクロージャのスコープ内の必要なすべての変数への参照からなる。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;クロージャはプログラム内で環境を共有するための仕組みである。レキシカル変数はグローバルな名前空間を占有しないという点でグローバル変数とは異なっている。またオブジェクトのインスタンス変数とは、オブジェクトのインスタンスではなく関数の呼び出しに束縛されているという点で異なる。
###自分の理解
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;クロージャは外側と内側関数があり、外側関数return参数後、クロージャの変量はまたいる。でも、クロージャ内の関数の変量はもうなっかた。
例えば：
#####例1
function a(){
&nbsp;&nbsp;&nbsp;&nbsp;var i=0;
&nbsp;&nbsp;&nbsp;&nbsp;function b(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(++i);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;return b;
}
var c = a();
c();
結果は：
0
1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;この変量iはクロージャの中使う、またあります。クロージャは中の関数と外の間に橋を作って連絡できるになります。

#####例2
var nAdd;
function f1(){
&nbsp;&nbsp;&nbsp;&nbsp;var n=999;
&nbsp;&nbsp;&nbsp;&nbsp;nAdd=function(){n+=1}
&nbsp;&nbsp;&nbsp;&nbsp;function f2(){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(n);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000
ストックされた投稿を調べる

`ストックされた投稿を調べる`簡単な方法がなかったので、QiitaAPIを使って、Pythonで書いてみました。
`ユーザ名`を適宜直してください。
タイトルの一覧とストック数が出力されます。

```py:Python
import urllib2
import json

def getweb(url):
	fp = urllib2.urlopen(url)
	s = fp.read()
	fp.close()
	return json.loads(s)	

user = 'ユーザ名'
for i in xrange(1, 100):
	url = 'https://qiita.com/api/v1/users/%s/items?page=%s' % (user, i)
	lst = getweb(url)
	if (len(lst) == 0): break
	for d in lst:
		n = int(d['stock_count'])
		if (n > 0):
			print d['title'], n
```
tmux

## 256色の指定を確認する
文字色: `for i in {0..255} ; do printf "\x1b[38;5;${i}mcolour${i}  "; done`
背景色: `for i in {0..255} ; do printf "\x1b[48;5;${i}mcolour${i}  "; done`

## tmux に 256 color の使用を強制する
`-2` オプションを付ける。
非修飾な関数へのコールは実行時に解決されます

マニュアルの下記ページの 5 番目の「非修飾な関数へのコールは実行時に解決されます」とは

- [PHP: 名前解決のルール - Manual](http://php.net/manual/ja/language.namespaces.rules.php "PHP: 名前解決のルール - Manual")

次のようにグローバルと名前空間とで同じ名前の関数が定義されていた場合に

**a.php**

```php
<?php
function hoge()
{
    return __FUNCTION__;
}
```

**b.php**

```php
<?php
namespace A\B;

function hoge()
{
    return __FUNCTION__;
}
```

次のコードを実行すると、１回目の `hoge()` は a.php で定義されているグローバルな `hoge()` が、２回目の `hoge()` は b.php で定義されている `A\B\hoge()` が呼ばれます。

```php
<?php
namespace A\B;

require_once 'a.php';

// hoge
var_dump(hoge());

require_once 'b.php';

// A\B\hoge
var_dump(hoge());
```

なお、ネームスペース直下の関数はファイルの読込時に登録されるため、次のコードだと両方とも `A\B\hoge()` が呼ばれます。

```php
<?php
namespace
{
    function hoge()
    {
        return __FUNCTION__;
    }
}

namespace A\B
{
    // ↓の hoge() はここの実行時に既に登録されている
    var_dump(hoge());
    
    function hoge()
    {
        return __FUNCTION__;
    }
    
    var_dump(hoge());
}
```

次のように if とかで囲むと最初の例と同じ結果になります。

```php
<?php
namespace
{
    function hoge()
    {
        return __FUNCTION__;
    }
}

namespace A\B
{
    // ↓の hoge() はここの実行時にはまだ登録されていない
    var_dump(hoge());
    
    if (true)
    {
        function hoge()
        {
            return __FUNCTION__;
        }
    }
    
    var_dump(hoge());
}
```

## 詳細

完全修飾名や修飾名の場合は(phpコードの)コンパイル時に名前が解決されます。一方、非修飾名の場合はコンパイル時に `A\B\hoge()` と `hoge()` の両方に解決され、実行時に存在する方の関数が呼び出されます。

[vld](http://pecl.php.net/package/vld "PECL :: Package :: vld") で opcode を見てみると、異なる opcode になっていることがわかります。

**(完全)修飾名**

- `INIT_FCALL_BY_NAME`
- `DO_FCALL_BY_NAME`

**非修飾名**

- `INIT_NS_FCALL_BY_NAME`
- `DO_FCALL_BY_NAME`

Zend Engine の非修飾名の関数呼び出しのコードは、次のように関数テーブルを２回検索しています。

**[zend_vm_execute.h:1350](https://raw.github.com/php/php-src/master/Zend/zend_vm_execute.h "zend_vm_execute.h:1350")**

```c
static int ZEND_FASTCALL  ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
	// ～省略～
	
	} else if (zend_hash_quick_find(EG(function_table), Z_STRVAL(func_name->constant), Z_STRLEN(func_name->constant)+1, func_name->hash_value, (void **) &call->fbc)==FAILURE) {
		func_name++;
		if (UNEXPECTED(zend_hash_quick_find(EG(function_table), Z_STRVAL(func_name->constant), Z_STRLEN(func_name->constant)+1, func_name->hash_value, (void **) &call->fbc)==FAILURE)) {
			SAVE_OPLINE();
			zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(opline->op2.zv));
		} else {
		
	// ～省略～
}
クラスの静的メソッドを名前空間にインポートして修飾なしで呼ぶ

思いつき、テストコードとかで使えなくもないかも？

**[import.php](https://gist.github.com/4468971)**

```php
<?php
function import($ns, $klass)
{
    $ref = new ReflectionClass($klass);
    $methods = $ref->getMethods(ReflectionMethod::IS_STATIC | ReflectionMethod::IS_PUBLIC);

    $code = "namespace $ns;\n";

    /* @var $method ReflectionMethod */
    foreach ($methods as $method)
    {
        $func = $method->getName();

        if (function_exists("$ns\\$func") === false)
        {
            $code .= "function $func(){ return \\call_user_func_array('$klass::$func', \\func_get_args()); }\n";
        }
    }

    eval($code);
}
```

## 使用例

`PHPUnit/Framework/Assert/Functions.php` を `require` すると アサーションなどがグローバル関数に登録されるため、テストコードがスッキリ書けます。

 - [PHPUnitの$this-&gt;assertXXXX() の別記法 #PHP - Qiita](http://qiita.com/items/4029f2fd4f852941ec20 "PHPUnitの$this-&gt;assertXXXX() の別記法 #PHP - Qiita")

```php
<?php
require_once 'PHPUnit/Framework/Assert/Functions.php';

class SomeTest extends PHPUnit_Framework_TestCase
{
    function testSomething()
    {
        $this->assertEquals(2, 1+1); //普通こう書くけど
        self::assertEquals(2, 1+1);  //これでもOK
        assertEquals(2, 1+1); // ↑の require があればこれでもOK
    }
}
```

が、`PHPUnit/Framework/Assert/Functions.php` には `assertXXXX` だけで無くもっと短い関数も定義されているため、次のように equalTo なんてグローバル関数がどこかで定義されていると・・・

**function.php**

```php
<?php
function equalTo($a, $b)
{
    return $a == $b;
}
```

`PHPUnit/Framework/Assert/Functions.php` を `require` すると fatal error になってしまいます。

```php
<?php
namespace A\B\C;

require_once __DIR__ . '/function.php';

// Fatal error: Cannot redeclare equalTo()
require_once 'PHPUnit/Framework/Assert/Functions.php';

class ImportFunctionsTest extends \PHPUnit_Framework_TestCase
{
    function testEqualTo()
    {
        assertThat(\equalTo(1, 1), isTrue());
    }
}
```

そこで、名前空間に `PHPUnit_Framework_Assert` のメソッドを関数としてインポートしてやります。

```php
<?php
namespace X\Y\Z;

require_once __DIR__ . '/function.php';
require_once __DIR__ . '/import.php';

import(__NAMESPACE__, 'PHPUnit_Framework_Assert');

class ImportFunctionsTest extends \PHPUnit_Framework_TestCase
{
    function testEqualTo()
    {
        assertThat(\equalTo(1, 1), isTrue());
    }
}
```
ubuntu12.04に共用のrubyをインストールして共用の開発環境を構築する手順

* 注意：EC2のマイクロインスタンスでやりました

## 参考
http://piyopiyoducky.net/install-share-rbenv-ruby-build-in-ubuntu/
http://kujira16.hateblo.jp/entry/2012/09/04/144953

## Rubyのビルドに必要なAPTパッケージをインストール
ついでにAPTパッケージのアップデートと、もろもろ欲しいものもインストール

```
$ apt-get update && apt-get upgrade && apt-get install git build-essential zlib1g-dev libssl-dev libreadline-dev libyaml-dev libxml2-dev libxslt-dev libsqlite3-dev mysql-server libmysqlclient-dev libpcre3-dev python-software-properties sysv-rc-conf zsh colordiff libncurses5-dev libgdbm-dev libffi-dev
```

node.jsを入れておくとv8エンジン絡みではまらないですんだ
http://mocabrown.com/blog/archives/2296

```
$ apt-get install nodejs
```

ほんとうはこっちのほうがいいと思うけど、細かいことは気にしないんなら↑が楽だと思う
http://www.oiax.jp/rails/zakkan/rails_3_2_installation_on_ubuntu.html

## rbenvのインストール

```
$ cd /opt
$ git clone https://github.com/sstephenson/rbenv.git
$ chgrp -R adm rbenv
$ chmod -R g+rwxXs rbenv
```

Bashユーザー向けに/etc/profile.d/rbenv.shを作成。
zshユーザーは各自下記の内容を~/.zshrcに追加。

```
$ vim /etc/profile.d/rbenv.sh
```

```bash
export RBENV_ROOT="/opt/rbenv"
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"
```

一旦ログインし直して、上記の環境変数への設定が正しく行われているか確認

```
$ printenv | grep RBENV
```

ruby-buildプラグインを追加

```
$ mkdir -p $RBENV_ROOT/plugins
$ cd $RBENV_ROOT/plugins
$ git clone https://github.com/sstephenson/ruby-build.git
```

## rubyインストール

インストール可能なrubyのversionを表示

```
$ rbenv install -l
```

rubyインストール（結構時間かかる）

```
$ rbenv install 1.9.3-p362
```

インストールされているか確認

```
$ rbenv rehash
$ rbenv global 1.9.3-p362
$ ruby -v
```

## 必要そうなgemのインストール

一旦gemのupdate

```
$ gem update
```

bundlerというパッケージマネージャをインストール

```
$ gem install bundler
```

RubyからMySQLを利用する際には、コレを入れておくとパフォーマンスが劇的に改善するとのこと

```
$ gem install mysql2
```

railsインストール

```
$ gem install rails
```

インストールしたgemをパスに追加する

```
$ rbenv rehash
```

rbenv rehashするのが面倒だと感じるなら、以下のgemも入れておく(Rubyのバージョンごとに必要であることに注意)

```
$ gem install rbenv-rehash
```
Test.HUnit


`Assertion` は単なる `IO ()`なので、なんかアクションを書いてコンストラクタである`TestCase`へ渡せば、`Test`型のデータを作れる。`Test`型のデータは`runTestTT`で実行するのがお手軽(ターミナルに結果を表示)。後`Test`型には`TestList`ってコンストラクタもあり、これを使って複数のテストを1つにまとめてもよい。もしくは`Assertion`の段階で `>>` で連結して1つの`IO ()`にまとめても無問題。

`Assertion` は、`IO`アクションが普通に終われば成功扱いとなる。テストの失敗を知らせるには`HUnitFailure`を例外として投げればいいのだけど、こいつは隠蔽されているので実際は`assertFailure`を呼べばよい。

```haskell:
% runghc
module Main (main) where
import Test.HUnit

test1, test2 :: Test
test1 = TestCase $ return ()
test2 = TestCase $ assertFailure "FAILED"

testN :: Int -> Test
testN = TestCase . assertBool "I don't like 13" . (/= 13)

tests :: Test
tests = TestList . ([test1, test2] ++) $ (map testN [1 .. 20])

main :: IO ()
main = do
  count <- runTestTT tests
  putStrLn ("The result is " ++ show count)
  return ()

```

```
### Failure in: 1
FAILED
### Failure in: 14
I don't like 13
Cases: 22  Tried: 22  Errors: 0  Failures: 2
The result is Counts {cases = 22, tried = 22, errors = 0, failures = 2}
```
gitコミット時にデバッグコードが含まれていないかをチェックする

すべてのgitユーザーにおすすめのhook

`debugger`や`console.log`などコミットするべきではないものをコミットすることはありませんか？
もしくは他のメンバーがコミットしていてイラッとしたことはありませんか？

そんな時はgitのhook(pre-commit)を使います。

以下はこのhookを使うための準備です。
[gitのhooksを管理する(自分用テンプレートを使う)](http://qiita.com/items/59fdf8b9aa9ef48ecbdf)
[git hookでできること](http://qiita.com/items/d8a8d498c9f853a445f5)

pre-commitのコードは以下の通り(ruby)

**`checkes`の内容を変えて、自分のチェックしたいコードを追加できます。**

```ruby:pre-commit
#!/usr/bin/env ruby
 
class String
  # colorization
  #   from http://stackoverflow.com/questions/1489183/colorized-ruby-output
  def colorize(color_code)
    "\e[#{color_code}m#{self}\e[0m"
  end
  def red ; colorize(31) ; end
  def green ; colorize(32) ; end
  def yellow ; colorize(33) ; end
  def pink ; colorize(35) ; end
end
 
 
checks = %w{
  debugger
  byebug
  logger
  puts
  binding.pry
  save_and_open_page
  console.log
}
 
errors = []
 
files_changed = `git diff --cached --name-only HEAD`
files_changed.each_line do |filename|
  filename.chomp!
  changes = `git diff --cached -U0 HEAD -- "#{filename}"`
  checks.each do |check|
    result = changes.split(/\n/).grep(/^\+.*\b#{check}\b/)
    unless result.empty?
      errors << {:name => check, :file => filename, :matches => result}
    end
  end
end
 
unless errors.empty?
  errors.each do |error|
    puts "'#{error[:name]}' found in file: #{error[:file]}".yellow
    error[:matches].each {|m| puts "  -> #{m}" }
  end
  puts "COMMIT REJECTED. Please remove them before commiting OR use --no-verify".red
  exit 1
end
```

---

使うにはとにかく各プロジェクトの`.git/hooks/`配下に`pre-commit`を配置し、実行権限を与えれば動きます。（権限重要で実行権限が無いと、何も起きない）

```bash:
$ cd rails_project
$ cp /somewhere/pre-commit .git/hooks/
(OR $ vi .git/hooks/pre-commit)
$ chmod 755 .git/hooks/pre-commit
```

デバッグコードを含むコードをコミットしようとすると

```bash:
$ git commit
'debugger' found in file: app/controllers/posts_controller.rb
  -> +    debugger
'puts' found in file: app/controllers/posts_controller.rb
  -> +    #puts params.inspect
COMMIT REJECTED. Please remove them before commiting OR use --no-verify
```

のように出力されます。

**一時的にチェックを無効にしてコミットしたい場合は**

```bash:
$ git commit -m "Commit without checks" --no-verify
```

**たまにこのフックが原因でエラーになる**

確認したかぎりでは、エンコーディングの違うソースを扱うとたまにエラーになる。
その時はそのプロジェクトではフックを諦めて削除。
`rm .git/hooks/pre-commit`

--------------------------------

git hooksはプロジェクトごと.git/hooksにありますが、既存の数あるプロジェクトで有効にするには少し手間がかかります。
詳細は[gitのhooksを管理する(自分用テンプレートを使う)](http://qiita.com/items/59fdf8b9aa9ef48ecbdf) 参照

---

デバッグコードはproduction環境であっても比較的無害な気はしますが、一度Javascriptのコードがconsole.logのせいで動かなかったことがあります。（特定のレガシーブラウザで起こった）

個人的にはデバッグコードをあまりに頻繁にコミットしてプッシュまでしてしまう人は、不注意だったりコードの読みやすさ・コミットの作り方の意識が低いのかなと思う。（それだけバグも作りやすい人）
enumの項目数

以下のようにすれば、`(int)Some.CountOfSome`で項目数(=3)として使えます。
最初の要素はデフォルトで0なので、`=0`は不要ですが、数字に意味があるのを明示しています。

```c#:C#
enum Some
{
	A = 0,
	B,
	C,
	CountOfSome
}
```

下記のようなFuhdukiさんのコメントの方法もあります。

```c#:C#
var count = Enum.GetValues(typeof(Some)).Length;
```
attr_accessibleのspec

###### 1.spec/support/be_accessible_matcher.rb を作成

```ruby:be_accessible_matcher.rb
RSpec::Matchers.define :be_accessible do |attribute|
  match do |response|
    response.class.accessible_attributes.include?(attribute)
  end
  description { "be accessible :#{attribute}" }
  failure_message_for_should { ":#{attribute} should be accessible" }
  failure_message_for_should_not { ":#{attribute} should not be accessible" }
end
```

###### 2.モデルのスペックを作成（Userの場合）

```ruby:user_spec.rb
# encoding: utf-8
require 'spec_helper'

describe User do
  context "attr_accessible が設定されている" do

    before do
      @user = User.new
      @accessible = [:firstname, :lastname, :email]
    end

    it "すべてのカラムをチェック" do
      @event.class.column_names.each do |name|
        if @accessible.include?(name.to_sym) then
          @event.should be_accessible name.to_sym
        else
          @event.should_not be_accessible name.to_sym
        end
      end
    end

  end
end
```

参考
[RSpecでmodelのattr_accessibleをテストする](http://blueberrycake.hatenablog.com/entry/2012/05/01/153656)
CocoaPods導入顛末

# はじめに
iOSアプリ作成で独自モジュールを作成した時、Archiveでのスタティックリンクライブラリの設定等で今まで苦労して来た。調べてみるとどうやらCocoaPodsという便利なしくみがあるらしい。これを導入する。環境はMac OSX 10.8.2。まずは一般的なライブラリを導入したいのでBlocksKitを導入する。

# セットアップまで
ひとまず設定するまではホームディレクトリでも良いらしい。

```sh
sudo gem install cocoapods
```
gemは何もしなくても導入済みだったので上記…と思ったが、

```sh
sudo gem install cocoapods -V
```

としないと、結構時間がかかるので不安になる。これでcocoapods導入。セットアップ。

```sh
 $ pod setup
Your RubyGems version (1.8.24) is too old, please update with: `gem update --system`
```
と、怒られるのでアップデート。

```sh
 $ sudo gem update --system
```

無事にセットアップできる。

```sh
 $ pod setup
Setting up CocoaPods master repo
Cloning spec repo `master' from `https://github.com/CocoaPods/Specs.git' (branch `master')
Setup completed (read-only access)
```

# Podfileの編集
とりあえず、既にworkspaceを導入済みだったので、workspace属性、xcodeproj属性を指定した。細かいところは下記を見ながら想像して設定。
http://rubydoc.info/gems/cocoapods/Pod/Podfile#platform-instance_method

```txt
platform :ios
dependency 'BlocksKit'
workspace 'XXXXX.xcworkspace'
xcodeproj 'YYYYY/YYYYY.xcodeproj'
```

試しにこれでやるとiOS4.3がどうたらこうたらと言われる。

```sh
 $ pod install
[DEPRECATED] `dependency' is deprecated (use `pod')
Resolving dependencies of `./Podfile'
Updating spec repositories
Resolving dependencies for target `default' (iOS 4.3)
[!] BlocksKit (1.8.1) is not compatible with iOS 4.3.
```

バージョン指定が必要なのだろう。platformにオプションがある事を発見する。下記のように修正。無事にPodプロジェクト、BlocksKit導入もできた。ここまで来ると手軽すぎる。

```txt
platform :ios, "5.0"
dependency 'BlocksKit'
workspace 'XXXXX.xcworkspace'
xcodeproj 'YYYYY/YYYYY.xcodeproj'
```

# おしまいに
とても手軽なので、デフォルト導入して良い仕組みだと思った。BlocksKitも素晴らしいので是非お試しあれ。

# 参考
http://d.hatena.ne.jp/Watson/20111204/mac_dev_jp_advent_calendar_cocoapods01
爆速でHTMLコーディングするためのtips

心構え
　・HTMLは最小限にする
　・JSも最小限。不要なら
　・デザインとか全部決まってから手を付ける。

開発環境
　・リアルタイム入力補完ができるエディタ
　　（プログラマならEcripseとかEmeditorとか、MacならCodaか）
　・動作確認の InternetExplorer
　　＞Macで動いてWindowsでレイアウト崩れた！Windowsが悪い！　←なに言ってんだ・・・？？
　・おまけでDreamwaver。

下準備
　・予め画像を切り出しておく。

HTMLコーディング開始
　・画像切り出しは全部後回しにして、 ZencodingでHTMLを「一気に」組む。
　　HTML”だけ”組む。
　　IDやclass名もここでつけちゃう。
　　ブラウザで開くとめちゃくちゃだけど気にしない。
　　文字も入力しない。

画像やCSSパスを設定する。
　・作ったHTMLをDreamwaverにコピペして、
　　Dreamwaver上から「画像パスと画像サイズ」を突っ込んでいく。
　　Dreamwaverはここだけ。

CSSセレクタを自動生成する。
　・OneClickCSS（ http://css.miugle.info/ ）を利用して、CSSセレクタを自動生成する。

CSSを直接打たず、LESSやSASSを使う。
　・CSSを直接打たないで、LessやSassを使ってCSSコーディングを行う。
http://lesscss.org/
http://sass-lang.com/
　　開発環境が準備できない人はLessの方が便利

　・Class、ID名ベースのCSSは使わない。
　　子孫セレクタ、子セレクタベースのコーディングを心がける。
　　LessやSassは子孫セレクタベース。

文字入力、ALT、metaタグを入れていく。
　・レイアウトが7割りできた段階で、文字やALTを入れていく。

いいねボタンやJSを入れて、最後の調整をする。
 　・JSはcoffee scriptを利用する。
 　　賛否両論あるけど早い

完成！

○組む
○レイアウトする
○入れる

の3アクションで行けるからめちゃくちゃ早い。


HTMLコーディングくらい超速で終わらせよう。
XOOPS Cubeのiniファイルの優先順位


XOOPS Cubeのiniファイルは継承パターンを採用している。下記の順でiniファイルがロードされ、後勝ちになる。つまり、先に読み込まれた設定値は、後に読み込まれた設定値で上書きされる。

1. site_default.ini
2. site_default.dist.ini
3. site_custom.ini
4. site\_custom_{XOOPS_SALT}.ini
XOOPS Cubeのiniファイルの設定を取得する


`XCube_Root` オブジェクトから取得できる。

```php
<?php

$root = XCube_Root::getSingleton();
$root->getSiteConfig(); // 全部配列で取得
$root->getSiteConfig('Cube'); // Cubeカテゴリを配列で主食
$root->getSiteConfig('Cube', 'SystemModules'); // Cube.SystemModulesの値を取得
```
メソッドの委譲機能

ActiveRecordのモデルを作っていると親子関係のクラスがたくさん出来ますが、子のクラスオブジェクトから親のクラスに実装されたメソッドを呼ぶことがあります。
そんなときに、コードをより直感的かつスマートに記述することができる便利な機能を教えてもらいました。

```ruby:qiita.rb
# parent.rb
class Parent < ActiveRecord::Base
  has_many :children

  def has_parent?
    ...
  end
end

# child.rb
class Child < ActiveRecord::Base
  belongs_to :parent
end

> child = Child.find(1)
> child.parent.has_parent? # 冗長な感じがする

# child.rb をこう書くと
require 'forwardable'
class Child < ActiveRecord::Base
  extend Forwardable

  belongs_to :parent
  def_delegator :parent, :has_parent?, :has_grandparent?
end

# こう書ける！
> child.has_grandparent?
```

## 委譲機能について

> オブジェクトの機能を再利用するには、クラス継承やモジュールのMix-inを利用する方法があります。しかし、これらの方法は元になるクラスやモジュールの実装をそのまま取り込んでしまいます。
委譲では、再利用したい機能を取り込むのではなく、その機能を持つオブジェクトに処理を依頼することで、機能の再利用を実現させます。

## forwardable

forwardableには2つのモジュールが定義されており、それぞれ

* Forwardable クラスに対してメソッドの委譲機能を定義する
* SingleForwardable オブジェクトに対してメソッドの委譲機能を定義する

となっています。
**Forwardable**を使ってArrayクラスの機能を再利用するコードを書いてみる。

```ruby:qiita.rb
require 'forwardable'
class MyClass
  extend Forwardable
  # 実装の動きが追いやすいように、オブジェクトからアクセス可能にしておく
  attr_accessor :ary

  def initialize
    @ary = Array.new
  end

  # 配列の要素を追加する機能の委譲をする
  def_delegator :ary, :push
end
```

pushメソッドが思惑通りに動いているか、試してみる。

```ruby:qiita.rb
obj = MyClass.new
obj.ary # => []

obj.push 'one' # => ["one"]
obj.push 'two', 'three' # => ["one", "two", "three"]
```

さらに、このクラスオブジェクトに**SingleForwardable**を使って、他の機能を委譲してみる。

```ruby:qiita.rb
obj.extend SingleForwardable
# 配列の要素を取り出す機能の委譲をする
obj.def_delegator :ary, :shift

obj.shift # => "one"
obj.ary # => ["two", "three"]
```

ActiveRecordのケースのように、機能の一部を再利用したいケースでは継承やMix-inより委譲するほうが向いていて、扱いも簡単で便利でした。

### def_delegatorとdef_delegatorsの使い方

```ruby:qiita.rb
  # 第3引数はエイリアスになる
  obj.def_delegator :ary, :push, :add
  obj.add "four" # => ["two", "three", "four"]

  # 複数の機能をリストで委譲する
  obj.def_delegators :ary, :pop, :clear
  obj.pop # => "four"
  obj.ary # => ["two", "three"]
  obj.clear # => []
```
XOOPSの起動処理順序


## mainfile.phpロード時

1. XOOPS_URLなど設定定数の定義
1. iniファイルのロード
1. XCube_Rootの初期化
1. XCube_Controllerの初期化
  * デリゲートの初期化
  * マネージャの初期化
  * コントローラストラテジーに決定

## common

1. サイトプリロードのロード
1. preFilterの実行
1. エラーハンドラーの初期化
1. xoops_*関数のロード
1. ロガーの初期化
1. DBに接続
1. 言語の決定、ランゲージマネージャの初期化
1. テキストフィルタの初期化
1. 全般設定のロード
1. ヘッダスクリプトの初期化
1. デバッガーのセットアップ
1. インターフェイスのロード
1. preBlockFilterの実行
1. セッションの初期化
1. ユーザの初期化
1. モジュールコンテキストの初期化
1. postFilterの実行

## header

1. ブロックのセットアップ
1. ブロックの実行
1. キャッシュの実行
1. Output Bufferの開始
HierarchyViewerでviewをデバッグする

Android SDKに含まれるHierarchyViewerでviewの構造を見れるみたい。各viewの親子関係とかプロパティの値とか。viewが現れないときはこれでviewが生成されているか、width/heightが正しく設定されているか、とかを見ながらデバッグできるっぽい。単体でも起動できるけどEclipseのパースペクティブに統合されているのでそちらから使うのがよさそうだ。

さて便利そうなツールではあるが、しかし！HierarchyViewerそのままだと実行できない。どうやらコードに手を加える必要があるようだ。

やりかたは以下にあるとおり、ViewServerを自分で設定する(as of Android SDK r21)。

[HierarchyViewer - Unable to debug device](http://enadroid.blogspot.com/2011/08/hierarchyviewer-unable-to-debug-device.html)

この ViewServer project からViewServer.javaをとってきてプロジェクトに加える。同じディレクトリにあるViewServerActivity.javaはデモなのでプロジェクトごとcloneして試してみるのもいいかもしれない。

さて表示してみるとあれこれ見れる。図は[デベロッパーサイト](http://developer.android.com/tools/debugging/debugging-ui.html)より。

![HierarchyView tree](http://developer.android.com/images/developing/hv_treeview_screenshot.png)

緑だったり黄色だったりする◯はレンダリングに掛かった時間を示すもので、UIのパフォーマンスチューニングに使うためのものみたい。左から「測定 (measure)」、「レイアウト (layout)」、「描画 (draw)」で、他のviewのレンダリングと比較して相対的に時間がかかっていると黄色くなったり赤くなったりする。
多重代入まとめ

配列の要素を代入

```
a,b,c = [0,1,2]
a #=> 0 
b #=> 1
c #=> 2
```

文字列をスプリットして代入

```
str = "I am hungry.\n"
a,b,c = str.chomp.split
a #=> "I"
b #=> "am"
c #=> "hungry."
```
数学とコンピュータ数学

数学とコンピュータ数学の比較。

|数学|int, decimal|double, float|
|:--|:--|:--|
|任意の数字が対象|有限桁数が対象|有限有効桁数、有限指数が対象|
|数字以外は計算の対象外|最大値、最小値を表せ、計算対象となる|最大値、最小値、イプシロン、非数値、+無限大、-無限大を表せ、計算対象となる|
|数学のルールは成り立つ|有効桁数内での数学のルールは成り立つ|数学のルールで規定されない演算もでき、桁落ちなどにより、数学のルールが成り立たないこともある|
|0割は許されない|0割は例外|0割は矛盾しない計算|
|無限大は数字ではない|無限大は表現できない|無限大も計算対象なので、数字と同様に扱える|
|非数値は数字ではない|非数値は表現できない|非数値も計算対象なので、数字と同様に扱える|
Instrumentsを使用せず、プログラムから空きメモリ量や使用中のメモリ量、CPU負荷を取得する

##デバイスの空きメモリ量を取得する
host_statistics() を使用して、vm_statistics_data_t 構造体を取得します。その中の free_count という値が空きメモリ量を示しています。（この値の単位はページ数なので、単位をバイトに変換するためにはページサイズを掛ける必要があります。）

    #import <mach/mach.h>
    
    + (unsigned int)getFreeMemory {
        
        mach_port_t host_port;
        mach_msg_type_number_t host_size;
        vm_size_t pagesize;
        
        host_port = mach_host_self();
        host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
        host_page_size(host_port, &pagesize);
        vm_statistics_data_t vm_stat;
        
        if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS) {
            NSLog(@"Failed to fetch vm statistics");
            return 0;
        }
        
        natural_t mem_free = vm_stat.free_count * pagesize;
        
        return (unsigned int)mem_free;
    }        

##アプリが使用しているメモリ量を取得する
タスク（いわゆるプロセス）の基本情報を取得するための関数 task_info() を使用して、task_basic_info 構造体を取得します。その中の resident_size という値が、物理メモリ使用量（バイト）を示しています。

    struct task_basic_info basic_info;
    mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
    kern_return_t status;
    
    status = task_info(current_task(), TASK_BASIC_INFO,
                       (task_info_t)&basic_info, &t_info_count);
    
    if (status != KERN_SUCCESS)
    {
        NSLog(@"%s(): Error in task_info(): %s",
              __FUNCTION__, strerror(errno));
    }

    vm_size_t residentSize = basic_info.resident_size;


##アプリの CPU 負荷を取得する
使用メモリ量を取得する際に用いた task_info() は第2引数に渡す値に応じて様々な情報を得ることができます。

 [task_info の man page](http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task_info.html)

メモリ使用量を取得する場合には TASK_BASIC_INFO を指定しましたが、 TASK_THREAD_TIMES_INFO を指定することで実行中のスレッドの CPU 使用時間を取得することができます。

    struct task_thread_times_info thread_info;
    t_info_count = TASK_THREAD_TIMES_INFO_COUNT;
    kern_return_t status;
    
    status = task_info(current_task(), TASK_THREAD_TIMES_INFO,
                       (task_info_t)&thread_info, &t_info_count);
    
    if (status != KERN_SUCCESS) {
        NSLog(@"%s(): Error in task_info(): %s",
              __FUNCTION__, strerror(errno));
        return;
    }
    
    uint64_t userTime   = tval2msec(thread_info.user_time);

上記コードで用いている tval2msec は time_value_t 型で得られた CPU 使用時間を msec に変換するためのマクロです。

    #define tval2msec(tval) ((tval.seconds * 1000) + (tval.microseconds / 1000))
 
##アプリ内でメモリ使用量と CPU 負荷をリアルタイム表示
上記の方法で取得したメモリ使用量と CPU 負荷、加えて View の数をアプリ内にリアルタイム表示するクラスを公開しています。よろしければご利用ください。

stats
[http://d.hatena.ne.jp/shu223/20110428/1303930059](http://d.hatena.ne.jp/shu223/20110428/1303930059)

![stats](http://s3.amazonaws.com/cocoacontrols_production/ios_screens/1265/full.png?1349224920)
別exeの実行状況を画面(textBox1)に非同期に表示する

```c#:C#
private IAsyncResult sr;
private Process pr = new Process();
private byte[] bb = new byte[4096];
private void callback(object o)
{
  int n = pr.StandardOutput.BaseStream.EndRead(sr);
  var s = Encoding.GetEncoding(932).GetString(bb, 0, n);
  textBox1.Text += s;
  textBox1.SelectionStart = textBox1.Text.Length - 1;
  textBox1.ScrollToCaret();
  if (n == 0) return;
  sr = pr.StandardOutput.BaseStream.BeginRead(bb, 0, bb.Length, callback, null);
}
private void button1_Click(object sender, EventArgs e)
{
  pr.StartInfo.FileName = XXX;
  pr.StartInfo.RedirectStandardOutput = true;
  pr.StartInfo.UseShellExecute = false;
  pr.Start();
  sr = pr.StandardOutput.BaseStream.BeginRead(bb, 0, bb.Length, callback, null);
  pr.WaitForExit();
}
```
OfTypeの使い方

WindowsのFormの画面にCheckBoxがたくさんあるとします。
プログラムで、すべてチェック済みにしたいとき、

```c#:C#
foreach (var cntr in Controls)
{
	var cb = cntr as CheckBox;
	if (cb != null) cb.Checked = true;
}
```

このように書くと思いますが、OfTypeを使うと以下のようにかけます。

```c#:C#
foreach (var cb in Controls.OfType<CheckBox>()) cb.Checked = true;
```

似たようなものに Castがありますが、Castでは、型が異なると例外になります。
mac初心者のtips

##win→macへのショートカットの変更部分

- F２ →
このサイトを参考にさせていただきました。
http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-use-function-key-as-default-in-mac-os.html

（デフォルトのファンクションの割当をかえてしまいます。）
文字列からリソースIDを取得する

随分前にブログに書いたのですが、アクセスが多かったのでこちらにも書きます。
http://t-kashima.hateblo.jp/entry/20110203/1296748262

ここでは色々な方法でリソースIDを取得する方法を説明します。

## 文字列からリソースIDを取得する
R.string.text が直接指定できず、文字列を利用してリソースIDを取得します。

```java
int strId = getResources().getIdentifier("text", "string", getPackageName());
```

同じように R.id.text_view のリソースIDを取得したい場合は以下のようにします。

```java
int viewId = getResources().getIdentifier("text_view", "id", getPackageName());
```

そしてこれらを組み合わせると、TextViewを取得して文字列を設定することができます。

```java
Resources res = getResources();
int strId = res.getIdentifier("text", "string", getPackageName());
int viewId = res.getIdentifier("text_view", "id", getPackageName());
TextView textView = (TextView)findViewById(viewId);
textView.setText(res.getString(strId));
```

## 変数と文字列からリソースIDを取得する
このやり方が便利なのは文字列とfor文の変数を使ってリソースIDを取得する場合です。

```java
int strId, viewId;
String resViewName, resStrName;
TextView textView;
Resources res = getResources();
for(int i = 0; i < MAX; i++){
    resStrName = "str" + i;
    strId = res.getIdentifier(resStrName, "string", getPackageName());
    resViewName = "text_view" + i;
    viewId = res.getIdentifier(resViewName, "id", getPackageName());
    textView = (TextView)findViewById(viewId);
    textView.setText(res.getString(strId));
}
```

こうすることで動的に文字列やビューを取得することができます。
無料で日本語音声合成

.NetFramework3.0から音声合成、音声認識ができますが日本語は標準で入っていません。
有料で買うこともできますが、無料でもMicrosoftから出ています。

+ 下記から x86_SpeechPlatformRuntime\SpeechPlatformRuntime.msi をダウンロードして実行(64ビットOSでもx86で実行確認しています)
+  DL：http://www.microsoft.com/download/en/details.aspx?id=27225
+ 下記から MSSpeech_TTS_ja-JP_Haruka.msi をダウンロードして実行
+  DL：http://www.microsoft.com/download/en/details.aspx?id=27224
+ addHaruka.regを実行。ちなみに、削除は、delHaruka.reg
+  追加：http://plaza.harmonix.ne.jp/~fakira/turedure/addHaruka.reg
+  削除：http://plaza.harmonix.ne.jp/~fakira/turedure/delHaruka.reg (アンインストール用)
+  参考：http://denspe.blog84.fc2.com/blog-entry-116.html

以上の準備後、.NetFramework3.0以上で、System.Speechを参照追加し、下記のようにできます。

```c#:C#
var syn = new System.Speech.Synthesis.SpeechSynthesizer();
syn.SelectVoice("Microsoft Server Speech Text to Speech Voice (ja-JP, Haruka)");
syn.Speak("こんにちは");
```

[参考用 GitHub SpeechTest](https://github.com/Tsutomu-KKE/SpeechTest)
複数タブ内でのSplitContainerの名前のつけ方

N枚目のタブのM個めのSplitContainerの名前を`splitContainerN_M`とします。
このようにして、一度つけた名前は、変更しないようにします。

理由：SplitContainerの名前を後から変えると、VisualStudioのデザイナがおかしくなるため。(バグと思われます)
プロジェクト名を変更する

VisualStudioで一切合切のプロジェクト名を変更したい場合、次のようにしている。もっと簡単にできるかもしれないが。

+ テンプレートエクスポートでプロジェクトテンプレートを選ぶ。
+ 新規作成で作成したテンプレートを選び、プロジェクト名を好きに変える。
+ 必要ならば作成したテンプレートを削除する。
+ 拡張子にcurがあるとエラーになるので、適宜変更する。
iOSでSQLiteの全文検索機能を使う

以下はiOS 5以前の情報です。iOS 6 SDK以降では[デフォルトで全文検索拡張が有効](http://www.adevelopingstory.com/blog/2013/04/adding-full-text-search-to-core-data.html)なため、
自前でビルドする必要はありません。


# iOS 5以前に対応させる方法
--
SDKに含まれるSQLiteは全文検索が無効なため、自前でビルドする必要がある。
以下、Static Libraryとしてビルドする方法。

## SQLiteのソースコードを入手
[SQLite Download Page](http://www.sqlite.org/download.html)

## Static Library用のTargetを追加
Project＞Add Target＞Cocoa Touch Static Library

## SQLiteのソースコードを作成したTargetに追加
 * sqlite3.h
 * sqlite3.c

## Build Settingsを変更
全文検索を有効にするには、以下のプリプロセッサマクロを設定する必要がある。
 * **SQLITE_ENABLE_FTS3**
 * **SQLITE_ENABLE_FTS3_PARENTHESIS**

以下に上の2つを追加
Project＞（Static LibraryのTarget）＞BuildSettings＞Preprocessor Macros

## Static Libraryを使用する
### メインのターゲットビルド時に、Static Libraryもビルドされるように
 * Project＞（SQLiteを使用するTarget）＞Build Phases
 * Target Dependency＞（Static LibraryのTarget）

### Static Libraryを追加
 * Project＞（SQLiteを使用するTarget）＞Summary
 * Linked Frameworks and Libraries＞「+」＞（Static Library）

## 参考リンク
 * [SQLiteを用いて、iOSで高速全文検索をしよう](http://dev.totodotnet.net/post/14115190858/sqlite-ios)
 * [SQLite FTS3 and FTS4 Extensions](http://www.sqlite.org/fts3.html)
Pythonで文字列 <-> 日付(date, datetime) の変換

##文字列から日付(datetime)

```python
from datetime import datetime as dt

tstr = '2012-12-29 13:49:37'
tdatetime = dt.strptime(tstr, '%Y-%m-%d %H:%M:%S')
```
strptimeの第二引数は第一引数のフォーマットを渡す。
例えば、
tstr = `'2012/12/29 13:49:37'`だった場合、
dt.strptime(tstr, `'%Y/%m/%d %H:%M:%S'`)

##文字列から日付(date)
```python
import datetime

tstr = '2012-12-29 13:49:37'
tdatetime = datetime.datetime.strptime(tstr, '%Y-%m-%d %H:%M:%S')
tdate = datetime.date(tdatetime.year, tdatetime.month, tdatetime.day)
```

##日付から文字列
```python
from datetime import datetime as dt

tdatetime = dt.now()
tstr = tdatetime.strftime('%Y/%m/%d')
```

**参考**
週など他の指定子(%Yみたいなやつ)が知りたい場合は、下記リンクの一番下から確認してください
[基本的な日付型および時間型](https://docs.python.org/ja/3/library/datetime.html)
monitの起動スクリプトでperlbrewのperlの使い方

私はプロセス監視にmonitを利用しています。I used to use daemontool but for me I like monit rather than monit :)

Perlのアプリを起動し、監視するときに悩んでしまったのでメモしておきます。

monitではstart/stopスクリプトを書いて監視させます。このとき、perlbrewを使用しているとユーザ権限で起動するときに環境変数が設定されておらず、モジュールが入ったperlbrewのperlがうまく使えません。この対処法としてPERLBREW_ROOTをユーザのperlbrewまで張っておいて、そこからsource/perlbrew useしてperlbrew環境を持ってくる行が必要でした。

	#!/bin/bash
	export PERLBREW_ROOT=/home/<user>/perl5/perlbrew
	source $PERLBREW_ROOT/etc/bashrc; 
	perlbrew use perl-5.12.4
	/PATH_TO_YOUR_APP/myapp daemon &