OmniAICreator/Qiita-1.07M huggingface dataset:
Chefのレシピ用リソースに指定する属性のバリデーションを手軽にチェック

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

OpscodeChefのレシピで使えるリソースは、属性のバリデーションをそれなりにやっています。
リソースが使えるケースでは、なるべく使ったほうがミスを防げるかもしれません。

じゃあどんなバリデーションなのか軽く確かめる方法。

## Chef::Resouceのインスタンスをつくる

Chef::Resouce以下のクラスは名前を渡せばパラメータを全部デフォルトでインスタンスが作成されます。

Cronリソースで色々確かめてみます。

```ruby:Pry_ChefResourceCron
> require 'chef'
=> true

> cron = Chef::Resource::Cron.new 'my_cron'
=>
<cron[my_cron]
  @name: "my_cron"
  @noop: nil
  @before: nil
  @params: {}
  @provider: nil
  @allowed_actions: [:nothing, :create, :delete]
  @action: :create @updated: false @updated_by_last_action: false
  @supports: {}
  @ignore_failure: false
  @retries: 0
  @retry_delay: 2
  @source_line: nil
  @elapsed_time: 0
  @resource_name: :cron
  @minute: "*"
  @hour: "*"
  @day: "*"
  @month: "*"
  @weekday: "*"
  @command: nil
  @user: "root"
  @mailto: nil
  @path: nil
  @shell: nil
  @home: nil
  @environment: {}
> 
```

## 属性に値を入れてみて確認する

属性の名前はそのままメソッドになっていますので叩けばOK。このように。

```ruby:Pry_CronResource
## 何も渡さなければ現在の値
> cron.minute
=> "*"

## なにか渡せば代入
> cron.minute 50
=> "50"

## バリデーションに引っかかる例１、99分
> cron.minute 99
RangeError: RangeError
from /Users/sawanoboriyu/Dev/Reading/chef/lib/chef/resource/cron.rb:56:in 'minute'

## バリデーションに引っかかる例２、コマンドラインがStringでない
> cron.command 12
Chef::Exceptions::ValidationFailed: Option command must be a kind of String!  You passed 12.
from /Users/sawanoboriyu/Dev/Reading/chef/lib/chef/mixin/params_validate.rb:150:in '_pv_kind_of'
```


## 過信は禁物

分のバリデーションをもう少し試してみましょう。

```ruby:Pry
> cron.minute "abcde"
=> "abcde"
```

そんなチェックで大丈夫か。


### Chef-Applyで実験

そらFailしますわ、でも強行しないようになってるだけマシと思おう。

```shell:chef-apply_with_invalid_parameter
# cat <<EOL | chef-apply -s
> cron 'hoge' do
>   minute 'abcde'
> end
> EOL
Recipe: (chef-apply cookbook)::(chef-apply recipe)
  * cron[hoge] action create
================================================================================
Error executing action `create` on resource 'cron[hoge]'
================================================================================

Chef::Exceptions::Cron
----------------------
Error updating state of hoge, exit: 1

Resource Declaration:
---------------------
# In /tmp/recipe-temporary-file20130920-9634-1ps5rqz

  1: cron 'hoge' do
  2:   minute 'abcde'
  3: end

Compiled Resource:
------------------
# Declared in /tmp/recipe-temporary-file20130920-9634-1ps5rqz:1:in `run_chef_recipe'

cron("hoge") do
  action :create
  retries 0
  retry_delay 2
  minute "abcde"
  hour "*"
  day "*"
  month "*"
  weekday "*"
  user "root"
  cookbook_name "(chef-apply cookbook)"
  recipe_name "(chef-apply recipe)"
end

[2013-09-20T05:18:47+00:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
[2013-09-20T05:18:47+00:00] FATAL: Chef::Exceptions::Cron: cron[hoge] ((chef-apply cookbook)::(chef-apply recipe) line 1) had an error: Chef::Exceptions::Cron: Error updating state of hoge, exit: 1
```

ちなみに上のChefApplyでChefが何をしようとして、何が`exit 1`だったのかの答えはこちら。

```shell:bash
# echo '* abcde * * * ' | crontab -u root -
"-":0: bad hour
errors in crontab file, can't install.
```
eggパッケージのインストールとアンインストール

# インストール
## インストール実行コマンド

```bash
easy_install hogehoge.egg
```

- インストールが実行されると、eggが展開されて所定の場所に置かれ、参照パスが設定される

## 配備されるファイル群の置き先
- Pythonのライブラリ置き場所に展開される

```
${python_lib}/site-packages/${eggパッケージ名）)
```

- 環境によって違うが、例えば下記の場所とか

```
/usr/lib/python2.6/site-packages
```

## 参照パスの書き込み先

```bash
${python_lib}/site-packages/easy-install.pth
```

# アンインストール
- 1. パッケージのインストール先を調べておく

```bash
python
>>> import ${module_name_in_the_package}
>>> print ${module_name_in_the_package}.__file__
```

- 1. easy_installでコマンドを叩いて参照を削除する

```bash
easy_install -mxN ${package_name}
```

- 2. 対象の${package_name}のeggファイルとディレクトリを削除する

#Reference
- [EasyInstall - The PEAK Developers Center](http://peak.telecommunity.com/DevCenter/EasyInstall?action=highlight&value=EasyInstall)
input[type=file]をデザイン的になんとかする方法

##ボタン画像をクリックしたときに、input[type=file]をクリックしたことにする（JS）
> IE の場合は、実際に form 送信された内容の内、input type=file の内容が空なのだ。
http://qiita.com/Qiita/items/c686397e4a0f4f11683d

これにははまった・・・

##ボタン画像とinput[type=file]を同じサイズで重ねて、input[type=file]上にして透明にする
IEでクリックするとinput[type=file]のファイルパスが書かれるところにカーソルが残って気持ち悪い・・・

##input[type=file]でlabelを使う
IE8以下でlabel内に画像があった場合、その画像をクリックしても何も起こらないのでJSで対応。
このJSはIE9以上で走らせると、キャンセルや開くを押したあとにもう一度選択画面？が立ち上がる。

```js
if ($.browser.msie && $.browser.version < 9) {
    $('label > img').click(function () {
    	$('#'+$(this).parent().attr('for')).focus().click();
    });
}
```
Amazon SESのDKIM設定をBINDでしようとした

普通に記述して設定しようとしても、うまくいかない。
いろいろ調べたところ、BIND9.3.1からアンダースコアを含むドメインが設定できないようだ。

BINDの設定を変えるか、他の制約の緩いDNSサービスを使う必要がある。
どっちにしようか、検討中。。

参考
https://secure.netowl.jp/bbs/detail.cgi?td=1091
http://sesblog.amazon.com/post/Tx18THES39W68A3/DKIM-Troubleshooting-Series-Introduction-to-DKIM-and-First-DNS-Hurdles
https://1x4x9.net/mt-static/support/themes/ray_tracing/body.gif
AppleのPUSH通知実装

# 参考文献
- [APNSで通知が飛ばない場合に考えられる問題](http://qiita.com/0x0c@github/items/811fb70d0d2523968e50)
- [Push Notificationを使ってみる](https://sites.google.com/site/aoi68k/home/push-notificationwo-shittemiru)
- [Apple Push Notification Serviceで気をつける事あれこれ](http://yskmanabe.blogspot.jp/2012/02/blog-post.html)
ggplot2で地図をプロット

# 参考文献
- [ggplot2によるコロプレスマップ・プロット 再考](http://blogs.yahoo.co.jp/igproj_fusion/16545186.html)
- [Rの基本グラフィックス機能またはggplot2を使って地図を描くには](http://sudillap.hatenablog.com/entry/2013/03/26/210202)
- [Using CJK Fonts in R and ggplot2](http://kohske.wordpress.com/2011/02/26/using-cjk-fonts-in-r-and-ggplot2/)
- [福島原発のγ線量測定データをggplot2で可視化してみた](http://d.hatena.ne.jp/mickey24/20110315/ggplot2)
R+knitr+pandocでレポート作成

# 参考文献
- [pander](http://rapporter.github.io/pander/#tables)
- [pander mardown tables with pipes inside not processed correctly](http://stackoverflow.com/questions/17015141/pander-mardown-tables-with-pipes-inside-not-processed-correctly)
- [Programmatically creating Markdown tables in R with KnitR](http://stackoverflow.com/questions/15488350/programmatically-creating-markdown-tables-in-r-with-knitr)
- [pandoc](http://johnmacfarlane.net/pandoc/demos.html)
- [knitr](https://github.com/yihui/knitr)
- [パッケージknitr](http://qh73xe.jimdo.com/%E3%83%97%E3%83%AD%E3%83%83%E3%83%88/%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8knitr/)
- [Set margin size when converting from Markdown to PDF with pandoc](http://stackoverflow.com/questions/13515893/set-margin-size-when-converting-from-markdown-to-pdf-with-pandoc)
xcode4 projectがxcode5で開けない時

storyboardを疑ってみると良いかもしれないです。

開けるようになるまで```<scenes> ..  </scenes>```を適当に間引いて、開けるようになったら直前に間引いたエリアに問題があるｗ
quick sortみたいに半分半分でやっていくと効率いいです。

今回問題になった箇所は、こんなかんじにMapViewControllerの中にUIViewがいくつかあって、その中にUIButtonとかパーツが入ってるような入れ子？

![87dcce7b7aa01cd0784661dfb5ede879.png](https://qiita-image-store.s3.amazonaws.com/0/5222/87ee642d-c1f1-b97c-793a-2f2f2a2c8c53.png "87dcce7b7aa01cd0784661dfb5ede879.png")

UIView3が下ギリギリにしてたのが悪かったのか、xcode4で一度開いて位置をずらして保存後、xcode5で開いたら開けるようになりました。
SublimeTextで.tagsが検索結果に出てきてうざいっていうのを解消する方法

Settings - User に次の設定を追加します。

```python
"file_exclude_patterns": ["*.pyc", "*.pyo", "*.exe", "*.dll", "*.obj","*.o", "*.a", "*.lib", "*.so", "*.dylib", "*.ncb", "*.sdf", "*.suo", "*.pdb", "*.idb", ".DS_Store", "*.class", "*.psd", "*.db", ".tags", ".tags_sorted_by_file"],
```

デフォルトとの違いは `".tags", ".tags_sorted_by_file"` を追加したこと。
これにより .tags と .tags_sorted_by_file が SublimeText から見えなくなり、検索結果にでてこなくなります。
もちろん CTags の機能自体は使えます。
Ruby 空ディレクトリ削除スクリプト

空ディレクトリ削除するためのスクリプトを書いたのでメモしておく


dir_del.rb本体

```rb
#!/usr/bin/env ruby
# encoding: utf-8
#
require "find"
require 'optparse'

puts "削除"

# コマンドライン引数を解析してハッシュに格納する
options = {}

OptionParser.new do |parser|
  # オプションを指定
  parser.on('-m', "--mode モード選択: input(削除確認する) noinput(確認しない,初期値) ") {|v| options[:mode] = v}
  parser.on('-d', "--directory ディレクトリ指定 ") {|v| options[:directory] = v}
  parser.parse!(ARGV)
end

if options[:mode] && options[:mode] == "input"
  input_mode = true
else
  input_mode = false
end

if options[:directory]
  directory_path = options[:directory]
else
  puts "ディレクトリ指定してください"
  raise

end

puts ARGV[0]
delete_dirs = []
Find.find(directory_path) do |path|
  if FileTest.directory?(path)
    if Dir.entries(path).join == "..."
      if input_mode
        print "#{path} を削除しますか？ [Y(defalut)/N]"
        input_value = gets.chomp
        unless input_value == "N"
          Dir.rmdir(path)
          delete_dirs << path
        end
      else
        Dir.rmdir(path)
      end
    end
  end
end
```

使い方

```shell-session
問答無用で削除
$ dir_del.rb -d 削除対象ディレクトリ
確認しながら削除
$ dir_del.rb -m input -d 削除対象ディレクトリ
```
imsettings-1.5.0がビルド出来ない時の対処法

gccに存在しないはずのオプションを入れてエラーが出る
まずebuild unpackして
ebuild compileしてエラーを確認
portageのtmpのworkディレクトリに移動して
./configure
./imsettings/Makefile の 509行目を削除
これでビルドできるし,少なくとも自分のKDE環境だと動く
emergeしてる時にperlかpythonでエラーが出た人へのアドバイス

perlは何が悪いのか,すぐにモジュールを見つけられなくなる
portageからはモジュールをインストールしてるように見えるから,依存があるとエラーが出る
そういう時は,dev-perl/を全てインストールしなおしても解決できるけど,全てやるのはしんどい

perl-cleaner --all
を実行しよう
pythonは
python-updater
おわり
ログファイルをS3に定時バックアップする


#### [ログファイルをS3にバックアップする / さよならインターネット](http://blog.kenjiskywalker.org/blog/2013/09/20/logfile-backup-to-s3/)

デイリーのログファイルをS3へバックアップしたいという事案はよくあると思います。 
一つの例として私の方法を載せますので、よりよい方法などあれば教えて頂きたいです。

## backup dir 

`/var/log/backup/nginx/YYYYMMDD/` 
`/var/log/backup/app/YYYYMMDD/`  

## backup file

`/var/log/backup/nginx/20130918/access.20130918-00.log.gz`
`/var/log/backup/nginx/20130918/access.20130918-01.log.gz`
`/var/log/backup/nginx/20130918/access.20130918-02.log.gz` 
...
  

`/var/log/backup/app/20130918/app.20130918-00.log.gz`
`/var/log/backup/app/20130918/app.20130918-01.log.gz`
`/var/log/backup/app/20130918/app.20130918-02.log.gz` 
...


上記ディレクトリに、それぞれ 
nginx、アプリケーションのログがあるとします。
  
nginxのログはtd-agentによって

```
<store>
  type file_alternative
  time_slice_format %Y%m%d-%H
  path /var/log/backup/nginx/access
  output_data_type attr:msg
  localtime
  output_include_time false
</store>
```

`/var/log/aggregated/nginx/access.20130919-00.log`
`/var/log/aggregated/nginx/access.20130919-01.log`
`/var/log/aggregated/nginx/access.20130919-02.log`

このように吐き出され、それを日付が変わったのち

```bash
#!/bin/sh

# set -e
DATE=`date --date '1 days ago' +%Y%m%d`
BASE="/var/log/backup"
for type in nginx app;
do
  DIR="${BASE}/${type}/${DATE}"
  mkdir "${DIR}"
  mv ${BASE}/${type}/*${DATE}*log "${DIR}"
  nice gzip --fast ${DIR}/*log
done
```

こちらのアーカイブスクリプトによって

`/var/log/backup/nginx/YYYYMMDD/`

というディレクトリを作成し、その配下へ昨日分のログファイルをgzip化し退避します。 
そして、退避したログファイルをS3へバックアップします。

バックアップは[s3cmd](http://s3tools.org/s3cmd)を利用しても良いですが 
先日1.0のリリースが行われた[awscli](https://github.com/aws/aws-cli)を利用します。

## backup script

```bash
#!/bin/bash

export PATH=/root:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/bin
export AWS_CONFIG_FILE=/opt/aws/awscli.conf

PROG=`basename $0`
LOCKFILE="/tmp/${PROG}.lock"
TIMESTAMP="/tmp/${PROG}.log"
FROM=root
TO=MAILADDR
DATE=`date +%Y%m%d --date '1 day ago'`
BUCKET="backup-bucket"
BACKUP_LIST="nginx app"

### error
error(){
cat <<EOF | sendmail -t
From: $FROM
To: $TO
Subject: error

error: $1

EOF
log "ERROR: $1"
exit 1;
}

### log
log(){
    echo "[`date '+%Y/%m/%d %k:%M:%S'`($$)] $1" >> $TIMESTAMP
}

log "*** start ${PROG} ***"

### to s3
for list in ${BACKUP_LIST}
do
  [ -d "/var/log/backup/${list}/${DATE}" ] || error "not found backup dir(1)."

  aws s3 cp --recursive /var/log/backup/${list}/${DATE}/ s3://${BUCKET}/${list}/${DATE}

  for check_file in `ls /var/log/backup/${list}/${DATE}`
  do
    LOCALFILE_SIZE=`ls -la /var/log/backup/${list}/${DATE}/${check_file} | awk '{print $5}'`
    S3FILE_SIZE=`aws s3 ls s3://${BUCKET}/${list}/${DATE}/ | grep ${check_file} | awk '{print $3}'`
    [ "${LOCALFILE_SIZE}" = "${S3FILE_SIZE}" ] || error "not same ${check_file} filesize LOCAL and S3"
  done

  log "FINISHED BACKUP s3://${BUCKET}/${list}/${DATE}"
done

log "*** finish ${PROG} ***"

exit
```


`aws s3 cp --recursive`によって昨日分のログファイルディレクトリを
再帰的にバックアップを行い、ファイルの整合性を担保する為に
ファイルサイズの比較を行っています。(可能であればMD5チェックを行いたい)
  
このように、深夜に昨日分のログファイルをS3にバックアップするようにしています。  
  
以上、ご参考になれば幸いです。
本番環境でのserverspecの運用方法


#### [本番環境でのserverspecの運用方法 / さよならインターネット](http://blog.kenjiskywalker.org/blog/2013/09/20/serverspec-with-cron/)

- ミドルウェアの管理はchefを使用している
- サーバへのデプロイはcapistranoを使用している
  
上記2点が当てはまる場合、serverspecの使い方として  

- [Testing #chef Cookbook by #serverspec #devops / さよならインターネット](http://blog.kenjiskywalker.org/blog/2013/07/13/serverspec-chef-cookbook/)
- [serverspecでchefのjsonを読み込む / さよならインターネット](http://blog.kenjiskywalker.org/blog/2013/07/31/serverspec-attribute/)
- [serverspecをJenkins氏で回す場合について / さよならインターネット](http://blog.kenjiskywalker.org/blog/2013/06/30/serverspec-jenkins/)  
  
上記エントリーを参考にして頂ければchef + serverspecである程度の
インフラストラクチャの構築とテストが行えるかと思います。  
  
また、こちらのエントリーのように、chefのrecipeからserverspecのテスト自体を
生成してしまうという素晴らしいアイデアもあります。最高ですね。  
  
#### [Chef のレシピから serverspec のテストを自動生成する chef-serverspec-handler という gem を作ってみた](http://tily.hatenablog.com/entry/2013/07/21/150404)  
  
で、結局使えるのはわかったのですが、どのように運用すべきか
というところは各所で試行錯誤中かと思います。
一例として、基礎的な内容ではありますが、現在試している内容を
記載してみようと思います。

## 前提条件
> capistranoを実行するサーバは、対象の全サーバのrootアカウントに
> 鍵認証でノーパスワードでログインが可能である

## chefをcapistranoでdeploy時にテスト

capistranoの設定にserverspecの項目を増やすことで
chef-soloなどが実行された後に、serverspecが実行されます。
これは台数が多いと時間が結構かかるので良し悪しがあるかと思います。

```
  desc "run serverspec"
  task :run_serverspec do
    `cd /root/chef/ ; rake`
  end
```

## cronで定時実行

`/etc/cron.d/serverspec`

```
0 */1 * * * root cd /root/chef/ ; rake 1> /dev/null
```

正常終了であればログを破棄、エラーが出力された際には
メールにて通知するようにします。  
  
## とても簡単なことですが

取り敢えずの導入としては、上記２つの方法を実践しています。
新しくミドルウェアを追加した際にテストがコケたりするので
なかなか面白いです。  
  
serverspecでどのような監視をしているかなど話し合うの面白そうですよね。
以上、ご参考になれば幸いです。
cocos2d-x 2.1.5インストール方法

## その1 インストール
http://www.cocos2d-x.org/ にアクセス
downloadからzipをダウンロードしてzip展開。
(現在stableはv2.1.5)


## その2 XCode用テンプレート作成

インストールしたフォルダで以下コマンドを実行

> 
>  $sudo ./install-templates-xcode.sh
> 

XCodeでNew>Projectでcocos2d-xの項目があったらインストール成功です。
おわり。

## その3 プロジェクト作成

インストールしたフォルダで以下コマンドを実行

> 
$cd tools/project-creator/
$./create_project.py -project [project_name] -package [package_name] -language [cpp|lua|javascript]
proj.ios		: Done!
proj.android		: Done!
proj.win32		: Done!
proj.mac		: Done!
proj.blackberry		: Done!
proj.linux		: Done!
proj.marmalade		: Done!
New project has been created in this path: /Users/kei/cocos2d-x-2.1.5/projects/Lights
Have Fun!
>

projectsフォルダ内にiOS,Android,Win32,mac..のプロジェクトが作成されます。
iOSは"proj.ios"内の.xcodeprojをクリックしてXCodeを起動します。
Androidは"proj.android"内をeclipseでimportして起動します。
おわり。
第14回オフラインリアルタイムどう書くの参考問題 with Python

オフラインリアルタイムどう書く
第14回(9月28日) http://atnd.org/events/43076
の、参考問題「円周上のCrossing」
http://nabetani.sakura.ne.jp/hena/ord14crosscircle/
の実装例。

慣れないpythonで。

他の言語などの解答例は
http://qiita.com/Nabetani/items/66806c9dc14a96f2fd42
から辿れます。

で。

```python
#coding:utf-8
#tested with Python 2.7.5 and Python 3.3.2

import re

def solve( src ):
    return str(len(
            [ 0
                for a in range( 0, len(src) )
                for b in range( 0, a )              
                for c in range( 0, b ) if src[a]==src[c] 
                for d in range( 0, c ) if src[b]==src[d] ] ))

def test( samples ) :
    for line in samples.splitlines():
        a=re.split( "\s+", line ) # num, input, expected
        if len(a) <3:
            continue
        actual = solve( a[1] )
        ok=actual==a[2]
        print( [ "ok" if ok else "***NG***", a[1:3], actual ] )

test( """
0   aabbca1bcb  14  
1   111ZZZ  0   
2   v   0   
""")
```

いつも通り、テストデータの大半は省略。

ひどくナイーブな実装。最悪 O(N**4) という有り様だが、今回の問題にはこれで十分。

点を4つ選ぶ。最初と三番目が同じ名前で、二番目と最後が同じ名前なら交点がある。全部試せば終わり。

リスト内包表記を使うべき場面じゃないような気がするが、使いたいので迷わず使用。
使うことにはしたものの、リストの中身に興味が無いので 0 で埋めるということになり、ちょっと変な感じになった（ような気がしているが、Pythonista じゃないので本当に変なのかどうかはよくわからない）。

順序を変えると typical case は速くなるけど worst case が速くならないのでそのままにしておいた。
ClipStudioPluginの始め方[mac]

# 前提
使用環境

- Mac OSX 10.8.4
- Xcode Version 4.6.3 

使用プロジェクトはSDK付属のHSV

# 手順
1. ClipのサイトからClip Studio(体験版)をダウンロード・インストールする．
1. PluginSDKをダウンロード
http://www.clip-studio.com/clip_site/download/clipstudiopaint/cspsdk

1. Xcodeでプロジェクトを開く
`解凍フォルダ/FilterPlugIn20121220/FilterPlugIn/FilterPlugIn/ProjectMac/FilterPlugin.xcodeproj`など

1. ビルドする
出力は
`解凍フォルダ/FilterPlugIn20121220/FilterPlugIn/FilterPlugIn/OutputMac/FilterPlugIn/Debug/HSV.bundle`

1. `Users/username/Documents/CELSYS/CLIPStudioPlugIn/PAINT/`に`HSV.bundle`をコピー

1. ClipStudioを再起動し，フィルタが追加されていることを確認！

![Screen Shot 2013-09-19 at 23.06.49.png](https://qiita-image-store.s3.amazonaws.com/0/25428/c24dfd13-c5b9-72fe-f88f-b50dcae10680.png)

ClipStudioを使うのは初めてだったので，何のプラグインが追加されたのか地味にわかりづらい…．
HSVだから色相・明度・彩度かなぁと思いつつ最初迷いました．

# 所感
付属のPDFの情報がややわかりづらかったのでまとめてみました．

色相・明度・彩度のパラメタ調整なのに，スライダーに参考色が無いのはちょっと使いづらそう．こういう部分のUIは変えられるのかなぁ？
Redmineの全アカウントのパスワードを強制変更

adminアカウント、もしくはadmin相当のアカウントのパスワードを忘れてしまった場合、Redmineのサーバにログインできるなら、rails consoleを使ってリセットできます。

この方法は[Redmine.jp](http://redmine.jp/)にも記載があるので、今回は全部のアカウントのパスワードを強制的に変えてしまう方法を載せてみます。

こんな時に使ってます。主に管理者としての作業です…。

* 本番DBのデータをダンプして検証環境にリストアし、各アカウントの権限チェックを行いたい場合。

```
# rails console production
Loading production environment (Rails x.x.x)
>> @users = User.all
>> for user in @users
>>   user.password = “……” #好きなパスワードにしちゃう
>>   user.auth_source_id = nil
>>   user.save!
>> end
```
ユーザによっては、LDAPやOpenIDの認証を使ってるケースもあるので、ローカルのパスワード変更に加え、auth_source_id をnilに指定すればOKです。

### 20151128 追記：

この方法でのパスワード変更ですが、確認した時点でRedmine3.x系では、パスワードが短すぎるとsave!の処理でエラーになります。

```
ActiveRecord::RecordInvalid: Validation failed: Password is too short (minimum is 8 characters)
```

8文字以上のパスワードを指定してください。
ClipStudioPluginSDKのビルドが出来ない[mac]

# 症状

サンプルについてくるHSVをXcodeでビルドしようとすると

```

The run destination My Mac 64–bit is not valid for Running the scheme HSV

```
と表示され，ビルドできない．

# 対処

Base SDKを変更する．
![Screen Shot 2013-09-19 at 22.33.16.png](https://qiita-image-store.s3.amazonaws.com/0/25428/a781dc44-6faf-ed09-252e-46ee4711cdbb.png)
jsonを取得、表示するアプリケーション　その８

毎回URLConnectionを開き直してるのでセッション管理で発行されるCookieが維持できない
なのでCookieManagerを使ってCookieを受け入れるようにする

```groovy:json_client.groovy
import groovy.swing.SwingBuilder
import groovy.json.JsonOutput
import groovy.beans.Bindable
import javax.swing.*
import java.awt.*
import java.net.*

def manager = new CookieManager()
manager.cookiePolicy = CookiePolicy.ACCEPT_ALL
CookieHandler.default = manager

@Bindable
class Model {
	String method = 'GET'
	String url = ''
	String params = ''
	String json = ''
}
def model = new Model()

def tabPane

def prettyPrint = { text ->
	def result = JsonOutput.prettyPrint(text)
	(result =~ /\\u[0-9a-zA-Z]{4}/).each { match ->
		def code = match[2..5]
		def encTxt = new String([Integer.parseInt(code, 16)] as int[], 0, 1)
		result = result.replaceAll(/\\u${code}/, encTxt)
	}
	result
}

def sendRequest = {
	model.json = ''
	
	def method = model.method
	def url = model.url
	def params = URLEncoder.encode(model.params, 'utf-8').replaceAll('%3D', '=').replaceAll('%26', '&')
	if (method == 'GET') {
		url = "${url}?${params}"
	}
	
	def conn = url.toURL().openConnection()
	conn.requestMethod = method
	if (method == 'POST') {
		conn.doOutput = true
		conn.outputStream << params
	}
	
	model.json = prettyPrint(conn.inputStream.getText('utf-8'))
	tabPane.selectedIndex = 1
}

new SwingBuilder().frame(title:'jsonを取得、表示するアプリケーション', defaultCloseOperation:JFrame.EXIT_ON_CLOSE,
						size: [800, 600], show:true) {
	lookAndFeel('nimbus')
	borderLayout()
	hbox(constraints: BorderLayout.NORTH) {
		comboBox(items:['GET', 'POST'], selectedItem:bind(source: model, sourceProperty: 'method', mutual: true))
		textField(text:bind(source: model, sourceProperty: 'url', mutual: true))
		button(text:'送信', actionPerformed:sendRequest)
	}
	tabPane = tabbedPane(constraints: BorderLayout.CENTER) {
		scrollPane(name:'パラメータ') {
			textArea(text:bind(source: model, sourceProperty: 'params', mutual: true))
		}
		scrollPane(name:'レスポンス') {
			textArea(editable:false, text:bind {model.json})
		}
	}
}
```

![qiita-008.png](https://qiita-image-store.s3.amazonaws.com/0/17179/41b70ff0-4171-0fa5-c842-c19b7459169a.png)
Emacs で rcodetools を使って "=>" で値を表示する

Rubyの勉強会などでプレゼンを行ってる人を見てると

```Ruby
10.times do |i|
  i                             # =>
end
```

の状態から

```Ruby
10.times do |i|
  i                             # => 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
end
```

の状態にパッと変える事がよくあるんですが「あれは何なのだろう？」と疑問に思いながらも他のことで頭がいっぱいで質問できずにいました。

## xmpfilter

これは `xmpfilter`という物の機能らしく `rcodetools` に含まれています。
xmpfilter自体はrubyで書かれたプログラムでそれを `rcodetools.el` から呼び出すのですが、PATHを設定してないとLoad Errorになり、値を表示してくれるどころかバッファーの中身が全部消されます。一瞬何が起こったのかわからず混乱すること請け合いですね。

## 環境

Cocoa Emacs 24 
MacbookとUbuntuでDropboxを使ってEmacsの設定同期を行ってる

## rcodetools の インストール

`$ gem install rcodetools` でインストールすると el ファイルも一緒にインストールされます。

rbenv を使ってるなら `$ rbenv rehash` も忘れずに。

俺はすっかり忘れてひどく時間を無駄にしました。いやマジで。gccの入れなおしとかまでしました。10時間ぐらい無駄に…。

## 設定

```el:~/.emacs.d/inits/30-rcodetools.el
(require 'rcodetools)
(setq rct-find-tag-if-available nil)
(defun ruby-mode-hook-rcodetools ()
  (define-key ruby-mode-map (kbd "<C-tab>") 'rct-complete-symbol)
  (define-key ruby-mode-map (kbd "<C-return>") 'xmp))

;(global-set-key (kbd "<C-return>") 'xmp)

(add-hook 'ruby-mode-hook 'ruby-mode-hook-rcodetools)
(defun make-ruby-scratch-buffer ()
  (with-current-buffer (get-buffer-create "*ruby scratch*")
    (ruby-mode)
    (current-buffer)))
(defun ruby-scratch ()
  (interactive)
  (pop-to-buffer (make-ruby-scratch-buffer)))
```

## 試しに使ってみる

`M-x ruby-scratch` して

```rb
a=1
b=3
a+b
```

して a+b の行で M-; (`comment-dwim`) を二回入力すると # => が入力されるので、そこで `Ctrl + Return` を入力すると結果が表示される。ステキ！

rct-complete-symbol が何を補完してくれるかはよくわかんない。だってどのサイトもどのタイミングで補完コマンドを打ったら何が補完されるか書いてないんですもん。

## 問題対策

・何故かバッファーの内容が消える
→Path通ってないんのでは？

## 参考

rcodetoolsをemacsで使う設定するときにはまったのでメモ - とみふらの明るく楽しい日記
http://d.hatena.ne.jp/tomitake_flash/20100220/1266662660

rvm で ruby 1.8.7 インストール時にエラーになったので gcc 4.9 を homebrew で入れた | EasyRamble
http://easyramble.com/install-gcc-with-homebrew.html

Ruby1.8系をrbenvで追加インストールしたら少し嵌る - Fevnirのブログ
http://fevnir-r.hateblo.jp/entry/2013/03/11/215422

rcodetoolsが素晴らしすぎる件 - I am Cruby!
http://d.hatena.ne.jp/authorNari/20090523/1243051306

EmacsでRubyの開発環境をめちゃガチャパワーアップしたまとめ | Futurismo 
http://futurismo.biz/archives/1295
gruntでexpressを起動すると文字化けするのを解消

個人的メモ

どうもgrunt.util.spawnが文字化けしてる。
grunt/lib/grunt/util.jsの最後の方を以下のように直したら化けなくなった。
自分のPCではテストもエラーになっていたが、grunt本家のテストではエラーになっていないようなので、原因が特定できない。この修正をすると自分のPCでもエラーはなくなる。

こちらの投稿が参考になった。
[dataイベントで受け取るバッファの文字化け](http://qiita.com/shigeki@github/items/d6e83fa42b3f05c352da )

```js
  var child = spawn(cmd, args, opts.opts);
  var stdout = [];
  var stdoutLength = 0;
  var stderr = [];
  var stderrLength = 0;
  if (child.stdout) {
    child.stdout.on('data', function(buf) {
        stdout.push(buf);
        stdoutLength += buf.length;
    });
  }
  if (child.stderr) {
    child.stderr.on('data', function(buf) {
        stderr.push(buf);
        stderrLength += buf.length;
    });
  }
  child.on('close', function(code) {
    var so = Buffer.concat(stdout, stdoutLength);
    var se = Buffer.concat(stderr, stderrLength);
    callDone(code, so.toString(), se.toString());
  });
  return child;

```
nodejs風に inherits(constructor, superConstructor) して継承したり、コンスタクタを委譲したり

ブラウザJSでも require('util').inherits 的なことができるとやっぱり都合がいいので、モジュール化してみた

```js:inherits.js
(function (global) {
    'use strict'

    var isBrowser = !! global.self
    var isWorker  = !! global.WorkerLocation
    var isNodeJS  = !! global.global

    function inherits (ctr, sCtr) {
        var F = function () {}
        F.prototype = sCtr.prototype
        ctr.prototype = new F
        ctr.prototype.constructor = ctr
        ctr.super_ = sCtr
    }

    var utils = {
	    inherits: inherits
    }


    if (isNodeJS) {
        module.exports = utils
    }
    else {
        global.utils || (global.utils = {})
        for (var method in utils) {
            global.utils[method] = utils[method]
        }
    }

})(this.self || global)
```

### 単純な継承

- Person.prototypeオブジェクトを祖先に持つオブジェクト
- コンストラクタは 継承もとの Person コンストラクタをそのまま使う

```js:01.js
function Person (name, sex) {
    this.name = name
	this.sex  = sex
}
Person.prototype.sayMySex = function () {
	return this.sex
}

function Male (name) {
	Person.call(this, name, 'male')
}
utils.inherits(Male, Person)


window.onload = onLoad

funcion onLoad () {
	var boy = new Male('taro')
	console.log(boy.name) // "taro"
	console.log(boy.sayMySex()) // "male"
}

```

### 継承元のコンストラクタとは別のものに委譲した継承

- Person.prototypeオブジェクトを祖先に持つオブジェクト
- コンストラクタは 継承関係のない Superman コンストラクタを利用する（委譲する）

```js:02.js
// コンストラクタの委譲先になるコンストラクタ
function Superman (name) {
    this.name = name
	this.sex  = 'superman'
}
Superman.prototype.fly = function () { return 'i can fly' }

function Mondo () {
	Superman.call(this, '中村主水')
	this.profession = '仕置人'
}
utils.inherits(Mondo, Person)

function onLoad () {
	var mondo = new Mondo
	console.log(mondo.name) // "中村主水"
	console.log(mondo.sayMySex()) // "superman"
	console.log(mondo.profession) // "仕置人"

	try {
		console.log(mondo.fly())
	} catch (err) {
		console.log(err.message) // "Object #<Mondo> has no method 'fly'
	}
}
```
UbuntuでNginxとUnicornを使いRailsアプリを動かす


- Ubuntu 13.04
- Nginx 1.5.4
- Ruby 2.0.0p247
- Ruby on Rails 4.0.0

## 最新のNginxを入れる
`cd ~`
Nginxの鍵をダウンロードし追加する
`wget http://nginx.org/keys/nginx_signing.key`
`sudo apt-key add nginx_signing.key`

`/etc/apt/sources.list`に以下の2行を追加する
	deb http://nginx.org/packages/mainline/ubuntu/ raring nginx
	deb-src http://nginx.org/packages/mainline/ubuntu/ raring nginx

apt-getを更新
`sudo apt-get update`

Nginxをインストール
`sudo apt-get install nginx`

ついでにGitもインストール
`sudo apt-get install git`

## rbenvを入れる
`cd ~`
`git clone git://github.com/sstephenson/rbenv.git .rbenv`
`git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build`

`~/.bash_profile`に以下の2行を追加する

```
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```

`source ~/.bash_profile`で設定を反映させる

### Rubyをインストール
インストールできるバージョンを確認
`rbenv install --list`
今回は2.0.0-p247というバージョンをインストールします
`rbenv install 2.0.0-p247`
`rbenv rehash`
デフォルトに設定
`rbenv global 2.0.0-p247`

### Railsをインストール
`gem install rails`
`rbenv rehash`

### ついでにMySQLをインストール
`sudo apt-get install mysql-server`

## Nginxの設定
`/etc/nginx/conf.d/`に設定ファイルを作成する
`sudo vim /etc/nginx/conf.d/test.conf`
設定ファイル（例）

        upstream test {
                server unix:/tmp/test.sock;
        }

        server {
                listen          80;
                server_name     test.jp;
                access_log      /var/www/test/logs/access.log;
                error_log       /var/www/test/logs/error.log;

                location / {
                        proxy_pass http://test;
                }


                location = /robots.txt  { access_log off; log_not_found off; }
                location = /favicon.ico { access_log off; log_not_found off; }

        }
Nginxの再起動
`service nginx restart`

## 作ったRailsアプリの設定
GemfileにUnicornで必要なものを追加する
    gem 'unicorn'
    gem 'execjs'
    gem 'therubyracer'

そして
`bundle install`

RailsのconfigフォルダにUnicornの設定ファイルを作成
`vim config/unicorn.rb`
設定ファイル（例）　最低限なものしか書いてありません。。。
    listen '/tmp/test.sock'
    pid '/tmp/test.pid'

最後にUnicornを起動
`unicorn_rails -c config/unicorn.rb -E production -D`

Unicornが動いているか確認するには
`ps -ef | grep unicorn | grep -v grep`

Unicornをとめるには
`kill -QUIT 【プロセスID】`
splitで分割したファイルの結合方法

$ cat [接頭辞]* > [元のファイル名]

例：
# ls -tlr
total 2499240
-rw-r--r-- 1 root root 524288000 Sep 19 18:12 xaa
-rw-r--r-- 1 root root 524288000 Sep 19 18:13 xab
-rw-r--r-- 1 root root 524288000 Sep 19 18:14 xac
-rw-r--r-- 1 root root 524288000 Sep 19 18:15 xad
-rw-r--r-- 1 root root 462044471 Sep 19 18:16 xae

#cat xa* >  [元のファイル名]
Amazon SESで差出人名(送信者名)が文字化けするとき

差出人名の部分 **だけ** MIMEエンコードする必要がある

```rb
require 'nkf'

from = "#{NKF.nkf('-jWM', '差出人')} <user@example.com>"
#=> "=?ISO-2022-JP?B?GyRCOjk9UD9NGyhC?= <user@example.com>"

```
ActiveLDAPで日本語が含まれる検索ができなくてハマった

ActiveDirectoryなんかと連携する場合、設定触る権限なかったりでどうしても日本語で検索できないと困るって場合がある。
ところが、Net::LDAPでエラーが返ってしまう。

```example.rb
Group.find(:first, :filter => "(sAMAccountName=営業部)")
=>Invalid filter syntax. (Net::LDAP::LdapError)
```


ひょっとしてNet::LDAP日本語使えないのかなと思って試してみると、そういうわけではない。

```net_ldap_sample.rb
# coding: utf-8
require 'net/ldap'

# net_ldap=Net::LDAP.newの詳しい記述は省略

net_ldap.open do |ldap|
  treebase = "dc=example,dc=com"
  filter = Net::LDAP::Filter.eq( "sAMAccountName", "営業部" )
  attrs = ["cn"]
  ldap.search(:base => treebase, :filter => filter, :attributes => attrs, :return_result => false ) do |entry|
    entry.each do |attr, values|
      puts"#{attr}: "      
      values.each do |value|
        puts "  #{value}"
      end
    end
  end
end

=>cn:
  営業部
```

Net::LDAPのソースを漁ってみると、Net::LDAP::Filter内のFilterParserに正規表現が。
どうもここで日本語がはねられてるようなので別ファイルでオーバーライドする。
※変更箇所以外はparse_filter_branchメソッドまるごとコピペ

```rb
class Net::LDAP::Filter
  class FilterParser
    def parse_filter_branch(scanner)
- if value = scanner.scan(/(?:[-\w*.+@=,#\$%&!'\s\]|\\[a-fA-F\d]{2})+/)
+ if value = scanner.scan(/(?:[-\w*.+@=,#\$%&!'\s\p{Letter}]|\\[a-fA-F\d]{2})+/u)
```
本当は漢字セットの\p{Han}でマッチさせたかったが、マッチングできず正規表現深追いしたくなかったので\p{Letter}で逃げの一手に出ることに。。。

2014/4/22追記
Net::LDAPの0.6ではこの問題解決されてそうです（未検証）。
多分この対処はいらなくなるはず。
メールアドレス入力時にドメイン名typo(っぽいもの)を検出&サジェストする

[Kicksend/mailcheck](https://github.com/Kicksend/mailcheck) を使うと，メールアドレスのtypoとしてありがちな `*@gmali.com`や`*@gmail.co`といったtypoを検出し，サジェストすることが簡単にできる．

## 簡単な利用方法
メールアドレス以外も入力する場合は[READMEの例](https://github.com/Kicksend/mailcheck#usage-with-jquery)のように`blur`時に実行すればよい．

## 応用
ユーザーにメールアドレスのみ入力してもらう，もしくはアドレスを最後に入力してもらう場合は，blurを挟まずに登録ボタンを押すことになるためblur時のサジェストでは遅すぎる．
そのため以下のようにkeyup時かつサジェストすべきと思われるタイミング(メールアドレスのドメインのTLD入力中)で実行すると良い．

```coffeescript
acceptableTLD = Kicksend.mailcheck.defaultTopLevelDomains.concat ['co.jp', 'ne.jp'] # co.jp, ne.jpはデフォルトでは含まれないので入れておく
$noticeBox = $('.js-email-invalid-message') # サジェストを表示するタグのクラスを指定
$('#email').on 'keyup', (ev) ->
    # ユーザーがTLDを入力し始めたと思われるタイミング以降のみサジェストする
    # e.g. foo@example.c| (|: カーソル)
    return unless /@([^.]+\.)+.+$/.test(ev.target.value)
    $(@).mailcheck
      topLevelDomains: acceptableTLD
      suggested: (element, suggestion) ->
        suggestion_html = "Did you mean: #{suggestion.address}@<b>#{suggestion.domain}</b>?"
        $noticeBox.fadeIn(200).html suggestion_html
      empty: -> $noticeBox.slideUp(200).html ''
```
ofxBox2dで距離ジョイントに空気抵抗を与える方法


距離ジョイントというか、ofxBox2dには空気抵抗が無いので、無理やりシミュレートする方法。

```cpp
voidtestApp::update() {
    ofxBox2dBaseShape shape = /* hogehoge */;
    shape.setVelocity( shape.getVelocity()*.9);	//定数は好きな数値に調整
}
```

現在のスピードに定数をかけて、減衰させてやってるだけ
力技だけど、なんとかこれで切り抜けたのでメモ。
StoryboardでViewControllerを設置して親クラスをTableViewControllerにすると

```
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UITableViewController loadView] loaded the "xxxxxxxxxx" nib but didn't get a UITableView.'
```

### 結果
落ちた

### 教訓
- TableViewControllerを親クラスにするときは素直にTableViewControllerを設置する。
- ViewControllerにUITableViewを載せてそれっぽくしてもだめっぽい
開始と停止を制御出来るタイマー

(・[Θ](https://gist.github.com/teppeis/6576829)・) oO( `#bigCookie`のclickを連打すれば…… )

## コード

```js:timer.js
function Timer(interval, fn) {
    this.interval = interval;
    this.fn = fn;
    this.tm = null;
    this.start = function() {
        if (!this.tm) {
            this.tm = setInterval(fn, this.interval);
        }
        return this;
    };
    this.stop = function() {
        clearInterval(this.tm);
        this.tm = null;
        return this;
    };
    return this;
}
```

```js:timer.min.js
function Timer(a,b){this.interval=a;this.fn=b;this.tm=null;this.start=function(){if(!this.tm){this.tm=setInterval(b,this.interval)}return this};this.stop=function(){clearInterval(this.tm);this.tm=null;return this};return this};
```
## 使用例

### どんどこカウント

```js
var count = 0;
window.tm = new Timer(1, function() { console.log(count++); });
window.tm.start();
```

止める時は`window.tm.stop()`で。

### 何かのクッキーを連打

```js
new Timer(100, document.querySelector('#bigCookie').onclick).start();
```

(^ω^) ？
Sublime Textでファイルの自動保存


もう`Control + S`、`Command + S`を一々押すのがダルい。

## 例によって、フォーカスが外れた時しか自動保存できない


menuのSublime Text2から以下の通り


`Preferences` -> `Settings - Default`

175行前後にある`save_on_focus_lost`が`false`になっているので、`true`に。

```175行前後にある
"save_on_focus_lost": true,
```

これで、OK.


## こちらもどうぞ

[Eclipseでファイルの自動保存](http://qiita.com/dvorak__/items/2201356c0e8dadf150f8)
Go言語におけるinterface{}とリフレクションを使ったパターン


## 出力引数としてinterface{}を受け取る

設定したい変数のポインタをinterface{}として受け取る。
interface{}なので、任意の型を渡すことができる。
`reflect.ValueOf`で`reflect.Value`型に変換する。
その後、`Value.Elem()`でポインタが指している先を取得して、`Value.Set()`で値を設定する。

http://play.golang.org/p/qsTwrL11mu

```reflect_pattern1.go
package main

import (
	"fmt"
	"reflect"
)

func set(p, v interface{}) error {
	pv := reflect.ValueOf(p)
	if pv.Kind() != reflect.Ptr {
		return fmt.Errorf("p must be pointer.")
	}

	vv := reflect.ValueOf(v)
	if pv.Elem().Kind() != vv.Kind() {
		return fmt.Errorf("p type and v type do not mutch")
	}

	pv.Elem().Set(vv)

	return nil
}

func main() {
	var hoge int
	fmt.Println(hoge)
	set(&hoge, 100)
	fmt.Println(hoge)
	fmt.Println(set(&hoge, 10.4))
}

```

## 関数をinterface{}で受け取る

関数は引数や戻り値を含めて型なので、引数や戻り値が一致しないと同じ型として扱うことができない。そのため、引数の型をinterface{}にしておき、任意の関数を渡し、リフレクションして呼び出す。

http://play.golang.org/p/fFmGNRlqcn

```reflect_pattern2.go
package main

import (
	"fmt"
	"reflect"
)

func call(f interface{}) {
	fv := reflect.ValueOf(f)
	if fv.Kind() != reflect.Func {
		panic("f must be func.")
	}
	fv.Call([]reflect.Value{})
}

func main() {
	f := func() {
		fmt.Println("hello!")
	}
	call(f)
}
```
phpフレームワークのプラグインをcomposer管理


composerむっちゃ便利なんですが標準でインストールする`vendor/`ディレクトリ以下にインストールしてしまうとcomposer対応してないフレームワークのプラグインとかはちゃんと読み込めなくて困ったちゃんになるなーと思っていました。symfony1系のプラグインとかcakephpのプラグインとかwordpressのプラグインとかですかね。

だけども[composer/installers] (http://github.com/composer/installers)を使えば解決される事が解ったので設定方法をまとめておきます。


プラグインの各ソースファイルをgitリポジトリ管理とかにしておいてcomposerでインストール出来るように以下の`composer.json`をプラグインのルートディレクトリ直下に置いておけば完了です。

```composer.json
{
    "name": "you/ftp",
    "type": "cakephp-plugin",
    "require": {
        "composer/installers": "~1.0"
    }
}
```

`composer/installers`を標準でrequireするようにして`type`を各プラグインの設定に変えてやれば良いです。

あとはこのgitリポジトリ管理とかだったりを[packagist] (https://packagist.org)に登録したりしてプロジェクトからcomposerインストールしてくればオッケーですb


2013/9/19 現在の対応されているtype一覧

| Framework    | Types
| ---------    | -----
| AGL          | `agl-module`
| AnnotateCms  | `annotatecms-module`<br>`annotatecms-component`<br>`annotatecms-service`
| CakePHP 2+   | **`cakephp-plugin`**
| CodeIgniter  | `codeigniter-library`<br>`codeigniter-third-party`<br>`codeigniter-module`
| Croogo       | `croogo-plugin`<br>`croogo-theme`
| Drupal       | <b>`drupal-module`<br>`drupal-theme`</b><br>`drupal-profile`<br>`drupal-drush`
| FuelPHP v1.x | `fuel-module`<br>`fuel-package`
| Joomla       | `joomla-component`<br>`joomla-module`<br>`joomla-template`<br>`joomla-plugin`<br>`joomla-library`
| Kohana       | **`kohana-module`**
| Laravel      | `laravel-library`
| Lithium      | **`lithium-library`<br>`lithium-source`**
| Magento      | `magento-library`<br>`magento-skin`<br>`magento-theme`
| Mako         | `mako-package`
| MediaWiki    | `mediawiki-extension`
| OXID         | `oxid-module`
| MODULEWork   | `modulework-module`
| phpBB        | `phpbb-extension`<br>`phpbb-style`<br>`phpbb-language`
| PPI          | **`ppi-module`**
| SilverStripe | `silverstripe-module`<br>`silverstripe-theme`
| symfony1     | **`symfony1-plugin`**
| TYPO3 Flow   | `typo3-flow-package`<br>`typo3-flow-framework`<br>`typo3-flow-plugin`<br>`typo3-flow-site`<br>`typo3-flow-boilerplate`<br>`typo3-flow-build`
| TYPO3 CMS    | `typo3-cms-extension`
| WordPress    | <b>`wordpress-plugin`<br>`wordpress-theme`</b><br>`wordpress-muplugin`
| Zend         | `zend-library`<br>`zend-extra`


参考

[symfony1.4 のプラグインを composer で管理] (http://qiita.com/aki77@github/items/85a942bc36d25ab992d4)
[PHPエンジニア養成読本［現場で役立つイマドキ開発ノウハウ満載！］] (http://gihyo.jp/book/2013/978-4-7741-5971-3)
逆射影変換でマウス位置を3D空間に表示してみる


いわゆるRayCast的なことを自前でやってみるテスト。
気づいたことや分かったことを徒然とまとめていきます。

実際に作ってみた[jsdo.itのデモはこちら](http://jsdo.it/edo_m18/kvwu)


##手順

1. 手順はまず、マウス座標をビューポートの逆変換をする（これは-1〜1の間に収まるようにするだけ。ただし、Y座標の扱いに注意）
2. 次に、ProjectionMatrixの逆行列を生成する
3. さらにViewMatrixの逆行列を生成する
4. 求めた行列を使ってプロジェクションを適用する関数を通して変換する（逆射影変換も結局は射影変換ってこと？）

```javascript
// スクリーン上のマウス位置3D空間内の座標系に変換（ビューポート行列の逆を行う）
mouseX =  (mouseX/SCREEN_WIDTH) * 2 - 1;
mouseY = -(mouseY/SCREEN_HEIGHT) * 2 + 1;
```

とりあえず、Three.jsの中を覗いて見たものをメモ。
↓まずはProjector.js内で行われている`unprojectVector`の処理。

```Projector.js
this.unprojectVector = function ( vector, camera ) {
	camera.projectionMatrixInverse.getInverse( camera.projectionMatrix );

    _viewProjectionMatrix.multiplyMatrices( camera.matrixWorld, camera.projectionMatrixInverse );

    return vector.applyProjection( _viewProjectionMatrix );

};
```

getInverseメソッドで、カメラの`projectionMatrix`の逆行列をprojectioMatrixInverseに保存。
この逆行列とカメラ位置をかけたものを`_viewProjectionMatrix`に保存

これらを用いて、渡された`vector`に`applyProjection`を適用している。

##最終的に出来た部分
```javascript
//プロジェクション変換マトリクスの生成
var projMatrix = mat4.perspective(60, w / h, 1, 100, mat4());

//ビュー座標変換マトリクスの生成
var viewMatrix = mat4.lookAt(vec3(0, 0, z), vec3(0, 0, 0), vec3(0, 1, 0));

//モデル変換マトリクスを生成
var modelMatrix = mat4();

//最終的に使用されるMVP合算マトリクスを生成
var mvpMatrix   = mat4();

//...中略

//他で取得したマウスの位置を元に3次ベクトルを生成（この時点でmouse.x, mouse.yともに-1〜1の間になるよう補正済）
var pos = vec3(mouse.x, mouse.y, 0);

//プロジェクションの逆行列を生成
var invProjMatrix = mat4.inverse(projMatrix);

//ビューの逆行列を生成
var invViewMatrix = mat4.inverse(viewMatrix);

//上記の計算結果用
var res = mat4();

//生成した逆行列を掛ける
mat4.multiply(invViewMatrix, invProjMatrix, res);

//できあがった行列をマウス座標に適用する
pos = vec3.applyProjection(pos, res);
```

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

##参考記事
* [その48 スクリーン座標でワールド空間の地面を指す](http://marupeke296.com/DXG_No48_PointGroundInScreen.html)
* [Three.js でピッキング(3Dモデルをマウスで選択)してみた](http://tmlife.net/programming/javascript/threejs-picking.html)
nginxベースのgroongaサーバーでログ関連のカスタマイズをするには

> もっとgroongaを知ってもらおう!ということで週刊groongaをはじめました。毎週木曜にgroongaやmroonga、rroongaのトピックを投稿予定です。

[gihyo.jp](http://gihyo.jp/)さんでgroongaの隔週連載が最終回を迎えました。groongaの最新情報と今後に興味があれば一読をおすすめします。

* [「最終回　groongaの今と未来」](http://gihyo.jp/dev/clip/01/groonga/0011)

第1回から第10回までの過去記事については、[隔週連載groonga](http://gihyo.jp/dev/clip/01/groonga)のページを参照してください。

今年も11/29に[全文検索エンジンgroongaを囲む夕べ 4](http://atnd.org/events/43461)を開催することになりました。参加登録はお早めに! 発表者も[募集](http://atnd.org/events/43461#application)しています。

# はじめに

オープンソースの[カラムストア機能付き全文検索エンジンgroonga](http://groonga.org/ja/)を公開しています。最新のバージョンは2013年8月29日にリリースした[3.0.7](http://groonga.org/ja/docs/news.html#release-3-0-7)です。

今回は、nginxベースのgroongaサーバーに追加されたログ関連のディレクティブを使う方法を紹介します。

# もうひとつのgroongaサーバー

groongaのサーバーを立てるときには、いくつか選択肢があります。プロトコル別に分けるとGQTPかHTTPを使うかという選択肢があります。また、HTTPを使うにしても、groongaコマンドに実装されているサーバー機能を使うか、あるいはnginxベースで実装されたgroonga-httpdコマンドを利用するという選択肢があります。

いずれにせよ、それぞれの目的のために個別のパッケージが存在しています。

* groonga-server-gqtp (GQTPという専用プロトコル)
* groonga-server-http (HTTP)
* groonga-httpd (HTTP)

参考までにgroongaとgroonga-httpdのどっちを使ったらいいのか判断に迷ったら、[比較](http://groonga.org/ja/docs/server/http/comparison.html)したドキュメントを参照してみてください。

# 新規追加されたログ関連のディレクティブとは

groonga 3.0.7では、このgroonga-httpdにログ関連のカスタマイズを行うためのディレクティブが追加されました。

* groonga_log_path
* groonga_log_level

従来はログ関連のカスタマイズができなかったので、所定のパス(/var/log/groonga/httpd/groonga.log)に固定のログレベル(NOTICE)でログが出力されるようになっていました。

groonga-httpdではコンテキストに応じて複数のデータベースが使えたり、アクセスするときのプレフィクスを変更できたりするのに、ログは決め打ちなので、個別にログをとることができなかった問題が解消されたことになります。

groonga-httpdの設定ファイルはgroonga-httpdパッケージをインストールすると雛形の設定ファイルが/etc/groonga/httpd/groonga-httpd.confに生成されます。

## groonga_log_path

ログの保存先を指定するディレクティブです。従来は、次のように決め打ちだったのが、

```
http {
  ...
  groonga_log_path /var/log/groonga/httpd/groonga.log;
  ...
}
```

次のようにlocationごとにも設定できるようになりました。

```
http {
  ...
  location /d/ {
    groonga_log_path /var/log/groonga/httpd/groonga-location-d.log;
  }
  ...
}
```

locationコンテキストではgroongaのデータベースを個別に指定できるので、データベースごとのログ保存先を変更できることになります。
これまで一緒くたになっていたのを分けることができますね。

ディレクティブの詳細については、[groonga_log_path](http://groonga.org/ja/docs/reference/executables/groonga-httpd.html#groonga-log-path)を参考にしてください。


## groonga_log_level

ログレベルをカスタマイズするためのディレクティブです。従来は、次のように決め打ちだったのが、

```
http {
  ...
  groonga_log_level notice;
  ...
}
```

ロケーションごとにも指定できるようになりました。

```
http {
  ...
  location /d/ {
    groonga_log_level debug;
  }
  ...
}
```

locationコンテキストではgroongaのデータベースを個別に指定できるので、データベースごとのログレベルを変更できることになります。

ログレベル自体は次のものを指定できます。

* emergency
* alert
* critical
* error
* warning
* notice
* debug
* dump
* none

デフォルトのログレベルはnoticeであり、問題があったデータベースだけdebugにするといったことができるようになりました。
ログの保存先指定と組合せることで切り分けしやすくなりました。

ディレクティブの詳細については、[groonga_log_level](http://groonga.org/ja/docs/reference/executables/groonga-httpd.html#groonga-log-level)を参考にしてください。

# まとめ

今回は、nginxベースのgroongaサーバーに追加されたログ関連のディレクティブを使う方法を紹介しました。groongaを初めて使う場合にはあまり関係ありませんが、運用していくにあたってより高機能なgroongaサーバーを使いたい場合には、groonga-httpdが選択肢となります。

groongaに興味を持ったなら、まずは[インストール](http://groonga.org/ja/docs/install.html)して試してみてください。

groongaの基本的な動作を知るための[チュートリアル](http://groonga.org/ja/docs/tutorial.html)もあります。インストールしたら試してみてください。
iOS6 -> iOS7変更対応


OpenGLとかUIKit関係

全体の感想としてFoundation->objcへの置き換えとか、UI* -> NS* への置換えからgccとかのobjcコンパイラとの互換性を意識したのかなって思いました。#知らんけど

時間がない状態でさらっと調べただけなのでいっぱい穴は有ります。

# とりあえず
OSのバージョン調べるやつ

``` iOS_Version_Check
float osVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
```

# Foundation

## NSString (iOS Category)
+ drawInRectで使用するenumのprefixがUI*からNS*に変わった。
+ UILineBreakModeだとかUITextAlignmentとかがNSLineBreakModeとかNSTextAlignmentとかに変わっている。

# UIKit関連
## 全体
+ iOS7.0になりフラットデザインが適用されている。基本的に前のデザインに戻す方法はない。
+ 一部の色を変えたりしていると、デフォルトデザインから乖離して悪目立ちするので、個別に対応していく必要がある。
+ 見た目についてはUIAppearanceで解決するのが良い

## UITableView
+ tableViewのインスタンスの扱いが微妙に変わっている
+ まだ詳細は把握出来ていないが、以前はインスタンスを使いまわしていたが、現在はインスタンスを生成しなおしている感じがある <要確認>
+ self.viewに対してbackgroundColor等を設定しており、ViewDidLoadでその設定が反映されていない場合はcellの呼び出し時に受け取ったtableViewで再度設定しなおすことで暫定対処できる。何が起こっているかは精査する必要がある。

## UITableViewCell
+ backgroundColorの初期値が白になってる?

## UIApplication
+ ステータスバーがアプリのViewにオーバーレイされるようになったのでフルスクリーンが20pxズレる。画像をきっちり合わせてた場合はViewの背景(何もなければ黒地)がでてしまうので直す必要がある。

+ ナビゲーションバーとかは自動的にバーの位置を合わせてくれるが、UIToolBarを画面上部に置いてた場合はそのような調整はしてくれないので自分でずらす必要がある。
+ この変更が一番きっついと思う

+ UIStatusBarStyleBlackTranslucentとUIStatusBarStyleBlackOpaqueはiOS7.0でDeprecated(非推奨)された。

- Reference
https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/occ/instm/UIApplication/setStatusBarOrientation:animated:

# EAGL関係 (Quarts Core?)
## CADisplayLink
+ invalid時に自動的にrunLoopへの登録を解除するようになった
+ 上記に伴い、既存の用にinvalid後にremoveRunLoopするとセグメンテーションフォールトで落ちるので注意。
UIImagePickerで、取得した画像を別Viewで表示する。

UIImagePickerで画像を取得した後に、新しいViewで画像を表示させます。
以下、FirstViewControllerでUIImagePickerで画像を取得し、SecondViewControllerで画像を表示させます。

```objc:FirstViewController.h
//
//    FirstViewController.h
//

#import <UIKit/UIKit.h>

@interface FirstViewController : UIViewController<UIImagePickerControllerDelegate, UINavigationControllerDelegate>
@end

```

UIImagePickerを使用するためのdelegate宣言として、UIImagePickerControllerDelegateとUINavigationControllerDelegateを宣言します。

```objc:FirstViewController.m
//
//    SecondViewController.m
//
#import "FirstViewController.h"
#import "SecondViewController.h"

@interface FirstViewController ()

@end


@implementation FirstViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

- (IBAction)touchSelectImage:(id)sender {
        UIImagePickerController *imagePickerVC = [[UIImagePickerController alloc] init];
        imagePickerVC.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        imagePickerVC.delegate = self;
        [self presentViewController:imagePickerVC animated:YES completion:nil];
}

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    [picker dismissViewControllerAnimated:YES completion:nil];
    UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage];
    SecondViewController *secondVC = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    secondVC.selectImage = image;
    [self.view addSubview:secondVC.self.view];
}

```

didFinishPickingMediaWithInfoで、取得した画像オブジェクト（UIImagePickerControllerEditedImage）を、secondViewで定義するUIImageに代入します。
その後、[self.view addSubview:secondVC.self.view]で、secondVCを表示します。

```objc:SecondViewController.h
//
//    SecondViewController.h
//

#import <UIKit/UIKit.h>

@interface SecondViewController : UIViewController

@property (weak, nonatomic) IBOutlet UIImage *selectImage;
@property (weak, nonatomic) IBOutlet UIImageView *selectImageView;

@end


```

FirstViewControllerから取得してくるUIImageをselectImageとして定義します。


```objc:SecondViewController.m
//
//    SecondViewController.m
//

#import "SecondViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController
{
    __weak IBOutlet UIImage *selectImage;
}

@synthesize selectImage, 
    selectImageView;

- (void)viewDidLoad
{
    [super viewDidLoad];
    selectImageView.image = selectImage;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}
@end

```

@synthsizeで@propartyで宣言した変数を宣言するのを忘れずに。
PHPで一時的なファイルポインタを扱う方法

## 選択肢

### `$fp = fopen('php://memory', 'r+b');`

- メモリ上に領域を確保する。メモリリークに注意。

### `$fp = fopen('php://temp', 'r+b');`

- メモリ上に領域を確保し、 **2MB** を超えたら自動削除される一時ファイルを作る。

### `$fp = fopen("php://temp/maxmemory:{$n}", 'r+b');`

- メモリ上に領域を確保し、`$n` バイトを超えたら自動削除される一時ファイルを作る。

### `$file = new SplTempFileObject($n);`

- 上記の `SplFileObject` 版 (継承クラス) 。  
引数は省略可能でデフォルトはもちろん **2MB (2 \* 1024 \* 1024 )** 。 **0** にすることも可能。  
OOP好きな人はこれでどうぞ。

### `$fp = tmpfile();`

- 自動削除される一時ファイルを作る。  
「ファイル」に対してしか操作できない関数を扱う場合はこれが優秀。
- これに限り、 **`stream_get_meta_data($fp)` で返される配列の `'uri'` 要素からファイル名を取得出来る** 。

[tempnam()関数](http://php.net/manual/ja/function.tempnam.php)もあるけど、自分でファイルを削除する必要があったりして使いにくい、というか少し用途が違う気がするので割愛。

## メモリが解放される・一時ファイルが削除されるタイミングは？

### 手続き型

- `fclose($fp)` のようにして **ファイルポインタを閉じた** とき。
- **スクリプトが終了した** とき。

<del>変数コンテナのように自動的にガーベジコレクションが行われるわけではない。</del>
[訂正します。](http://qiita.com/mpyw/items/60da2c08d384a53ec47e)

### オブジェクト指向型

- 変数のガーベジコレクションが行われると、自動的にリソースの解放も行われる。

ちなみにPDOもこれに該当するため、いちいち `$pdo = null;` などとする必要は基本的には無い。


## 使用例

```php:cURLのCookieとして用意する
$ch = curl_init();
$meta = stream_get_meta_data($fp = tmpfile());
curl_setopt($ch, CURLOPT_COOKIEJAR, $meta['uri']);
curl_setopt($ch, CURLOPT_COOKIEFILE, $meta['uri']);
```

```php:繰り返し上記のコードが呼ばれる可能性が場合は後始末が必要
fclose($fp);
curl_close($ch);
```
iOS7にしてアプリ(LINEやうたスマ)のマイクが使えなくなった時の対処法



LINEの無料通話や無料カラオケ うたスマなどのマイクを使うアプリで、iOS7にしてマイクが使えなくなった場合の対処法です。

iOS7ではマイクの利用が許可制になっています。

ホーム画面 > 設定 > プライバシー > マイク > アプリ名 
でマイクの利用許可をONにしてください。

## 設定をタップ

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/27793/6e90eabe-ede1-2d92-d359-f87cce6401a2.jpeg "1.jpg")

## プライバシーをタップ

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/27793/6357c718-6b08-7e96-7fe5-a4b7281d35a4.jpeg "2.jpg")

## マイクをタップ

![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/27793/9809942f-49d8-5b01-9dcb-530fb7c74095.jpeg "3.jpg")

## 許可するアプリ名をON(緑色の状態)にする

![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/27793/2d962304-9c20-49cf-d80a-1a5f61be7611.jpeg "4.jpg")
gitの空ブランチを作る


##空ブランチ？

そもそも空ブランチとは何かというと、すでにあるコミット (master) なんかのブランチとは関係なく、全く関連性も何もないブランチのこと。

『そんなものがあるのか？』と不思議に思ったのですが、GitHubのとあるリポジトリには、"gh-pages" というものが存在しているのに気がつきました。!

![orphan-branch.png](https://qiita-image-store.s3.amazonaws.com/0/27976/cdfec16f-c1f2-f85b-74c6-db48bea6e2ea.png "orphan-branch.png")



ツリーを見ると、全く独立していて、ドキュメントやプロジェクトページのHTMLが入っていたりします。GitHub上では、このドキュメント用の空のブランチが作れますが、コマンドラインから作るのは知りませんでしたので、メモ。

##作り方

"doc" というドキュメント用の空ブランチを作る場合。

* git checkout --orphan doc
 
orphanオプションを付ければ良いんですね。

ちなみに、既に履歴のあるリポジトリ上でorphanブランチを作ると、その時点での中身が入ったまま新しいブランチが作成されます。

~~ということで、いったん新しいブランチのディレクトリの中身を消してしまい、そこから新しくファイルを追加していく必要があります。~~ 空ブランチにだけ必要なファイルを用意しコミットし、すでにあるファイルは必要がなければコミット対象に登録しなければ問題ありません。

ただし、Oprhanブランチから、通常のソースを含む作業ブランチ（masterやdevelop) に切り替えようとすると、Orphanブランチ的には未コミットのファイルがあると、切り替え時に怒られたりしますのでご注意を。

##追記：GUIから作れるといいんだけど...

さて、わたしはよくSourceTreeを使うのですが、今の所、Orphan BranchをGUIから作る機能はついていないそうです。（軟弱ですみません...)

- [Atlassian Answers / How to create a Orphan Branch in SourceTree?](https://answers.atlassian.com/questions/308088/how-to-create-a-orphan-branch-in-sourcetree)

なお、SourceTreeからOrphan Branchを見るとこんな感じです:)

![orphan-branch-with-sourcetree.jpg](https://qiita-image-store.s3.amazonaws.com/0/27976/8e154fce-f722-d77a-5d0c-36df887cf879.jpeg)


### 2016/01/30 追記

- 空ブランチ作成時には、無理に中身を全部消さなくとも大丈夫な件を修正しました。
- SourceTreeについての情報を載せました。

###参考

 * http://akkunchoi.github.io/git-empty-branch.html
 * http://d.hatena.ne.jp/eldesh/20120715/1342343316