OmniAICreator/Qiita-1.07M huggingface dataset:
VCS入門

# VCS入門

高野 将

## はじめに

本文書はVCS（Version Control System：バージョン管理システム）の概念、使い方を、未経験者でもわかるように伝えることを目的として、[GitHubで公開していた文書](//github.com/masaru-b-cl/introduction-to-vcs "VCS入門 - GitHub/masaru_b_cl")の転載です。

本書のゴールは以下の通りです。

- VCSの概念を理解する。
- SCMの考えを理解する。
- SCMを意識したVCSの利用ができる。

なお、なるべく特定のVCSに依存しない説明を行い、ツールの詳細な使い方については本書の対象外とします。別稿として、各VCS毎の使い方はまとめるかもしれません。

## 目次

- [1章 VCSのない世界](17e50dfe39df5f47b77e "1章 VCSのない世界")
- [2章 VCSでできること](f00bf3d14b9cd63b31d4 "2章 VCSでできること")
- [3章 VCSのある世界](7709aec58972d679ea57 "3章 VCSのある世界")
- [4章 VCSのみでの限界](7148358f80e1309aeb36 "4章 VCSのみでの限界")
- [5章 SCMという智慧](78255dae9f7320b2dd17 "5章 SCMという智慧")
- [6章 SCMを意識したVCS利用](200a6c8b6d145aa5d621 "6章 SCMを意識したVCS利用")
- [7章 SCMの次のステップ](71bdd9f9ed75c985616d "7章 SCMの次のステップ")
- [付録A 参考文献](87dc8ca41a3d1fcc20c8 "付録A 参考文献")

## ライセンス
<a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/deed.ja"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="http://i.creativecommons.org/l/by-sa/3.0/88x31.png" /></a>

この 作品 は <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/deed.ja">クリエイティブ・コモンズ 表示 - 継承 3.0 非移植 ライセンスの下に提供されています。</a>
How to install GNU Emacs 24.3.50.1 on CentOS 6.4

* 開発ツールをインストールします。

```shell-session
$ sudo yum -y groupinstall "Development Tools"
```

* autoconf をインストールします。(最新版が必要)

```shell-session
$ wget ftp://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.xz
$ tar xf autoconf-latest.tar.xz
$ cd autoconf-2.69
$ ./configure
$ make
$ sudo make install
```

* automake のインストールが必要かも 

* ncurses をインストールします。

```shell-session
$ cd
$ wget http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.9.tar.gz
$ tar xf ncurses-5.9.tar.gz
$ cd ncurses-5.9
$ ./configure --with-shared
$ make
$ sudo make install
```
* emacs をインストールします。

```shell-session
$ cd
$ git clone git://git.savannah.gnu.org/emacs.git
$ cd emacs
$ ./autogen.sh
$ ./configure --without-x --with-x-toolkit=no --with-xpm=no --with-jpeg=no \
    --with-gif=no --with-tiff=no --with-png=no --without-selinux --without-makeinfo
$ make bootstrap
$ sudo make install
```

下記サイトを参考にしました。

- http://qiita.com/ironsand/items/fc755449b0e754ab1dd0
- http://toybox-v2.blogspot.jp/2013/01/centos5emacs242.html
- http://stackoverflow.com/questions/9506046/ffmpeg-install-on-centos-64-bit-install-with-fpic-error

1.4Gi くらい必要です。
Proof Generalのholes-modeを無効化

Proof GeneralでCoqファイルを開くと、holes-modeというマイナーモードが立ち上がります。
個人的にはC-c C-jを、カーソルの位置まで証明を進める (proof-goto-point) にバインドしたいのですが、holes-modeのバインドに消されて厄介なので、アドバイスを使ってholes-modeを無効にしてみました。

以下のコードを.emacsに追加するればOKです。

```el:.emacs
(defadvice coq-mode-config (after deactivate-holes-mode () activate)
  "Deactivate holes-mode when coq-mode is activated."
  (progn (holes-mode 0))
)
```


なお、C-c C-jを (proof-goto-point) にバインドするコードは、例えば以下のような感じです。

```el:.emacs
(add-hook 'proof-mode-hook
  '(lambda ()
     (define-key proof-mode-map (kbd "C-c C-j") 'proof-goto-point)))
```
mysql の定期的なバックアップ

* 解説が不十分な部分ついては、補足（コピペで本文に取り込める体裁だとありがたい）を頂けると助かります！
* mysqlのバックアップ手法に関しては様々な方法がありますので随時追記していきたいと思います！
* サーバー構成に関しても様々なパターンがありますので、随時追記していきたいと思います。


- - -

mysql-server 5.1.8以降では、以前の手法ではWarningが発生するようになったため、
それ回避した上での手法を公開したいと思います。

まずmysql5.1.8以前のバージョンでのバックアップ手法

```

mysqldump --opt --all-databases --default-character-set=binary -u root > /root/backup/mysql/all_db.sql

```

以前はこれで問題なかったのですが、5.1.8以降では上記コマンドを実行すると下記のWaningが
発生するようになりました。

```

-- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.

```

これはバージョン5.1.8からmysqlデータベースにeventsテーブルが追加されたことが原因です。

mysqldump コマンドに対して全てのデータベース内容をdumpする「`--all-databases`」のオプションを付与している場合、
これまでの手法では上記のeventsテーブルのみが対象外となってしまっているために発生しているWaningです。

この回避策としては、mysqldum　コマンドに対して「`--all-databases`」のオプションを付与している場合は
さらに「`--events`」 のオプションを追加する必要があります。

これらの内容を反映した上での、バックアップ取得スクリプトを作成してみました。

##  /bin/sh + mysqldump バージョン
###事前準備（バックアップ保存用ディレクトリの作成）

```
sudo mkdir /root/backup/mysql


```

###スクリプト作成開始

```
sudo vim /root/backup4mysql.sh


```



```backup4mysql.sh
#!/bin/sh

# 他のユーザからバックアップを読み込めないようにする
umask 077

# バックアップファイルを何日分残しておくか（一ヶ月分）
period=31
# バックアップファイルを保存するディレクトリ
dirpath='/root/backup/mysql'

# ファイル名を定義(※ファイル名で日付がわかるようにしておきます)
filename=`date +%y%m%d`

# mysqldump実行（ファイルサイズ圧縮の為gzで圧縮しておきます。）
mysqldump --opt --all-databases --events --default-character-set=binary -u root --password=パスワード | gzip > $dirpath/$filename.sql.gz

# 古いバックアップファイルを削除
oldfile=`date --date "$period days ago" +%y%m%d`
rm -f $dirpath/$oldfile.sql.gz
```

###アクセス権限設定変更
このshellにはmysqlのrootのパスワードが丸々記載されているため、rootユーザ以外は内容を閲覧できなくしておく必要があります。

```

sudo chmod 0700 /root/backup4mysql.sh


```

###cron設定
最後にこのスクリプトをcronで定期実行することにより、定期的に全データベースのバックアップを取得することが可能となります。

```

su -
echo "0 3 * * * root /root/backup4mysql.sh" > /etc/cron.d/backup4mysql

```

以上、ご参考になれば幸いです。
LinuxでKVMとQEMU使ってAndroidのミュレータを高速化

これは快適。
[How to Start Intel Hardware-assisted Virtualization (hypervisor) on Linux to Speed-up Intel Android x86 Gingerbread Emulator](http://software.intel.com/en-us/blogs/2012/03/12/how-to-start-intel-hardware-assisted-virtualization-hypervisor-on-linux-to-speed-up-intel-android-x86-gingerbread-emulator)
Rendr入門(2): リクエスト処理の流れ（Router, Controller、View、Template）

[前回のRendrの概要紹介](http://qiita.com/mshk/items/5912dcd4d9fa52ff6371)に続いて、ここではRendrでのリクエスト処理の流れを解説します。
Rendrアプリのスケルトンコード、rendr-app-templateを参考にします。
https://github.com/airbnb/rendr-app-template

※まだざっくりしてるので、頻繁にアップデートされます。不明な点は質問してください。

# ルーターによるURLのルーティング

Rendrにリクエストを行うと、ルーターがURLに関連づけられたコントローラを呼び出します。
ルーターの設定は、`app/routes.js` で行います。Railsの`config/routes.rb`に相当します。

サンプル:

```
module.exports = function(match) {
  match('',                   'home#index');
  match('repos',              'repos#index');
  match('repos/:owner/:name', 'repos#show');
  match('users'       ,       'users#index');
  match('users/:login',       'users#show');
  match('users_lazy/:login',  'users#show_lazy');
};
```

`match()`に渡す引数の一つ目がURLパターン、二つ目がコントローラとアクションを表しています。URLパターンで`:parameter`と書く事で、マッチした文字列をクエリパラメータをコントローラに渡す事が出来ます。

# コントローラ

コントローラは、リクエストに対するデータ取得とビューの呼び出しを担当します。
`app/controllers`の下にファイルを作成していきます。

ルーティングファイルの'users#index'から呼び出されるのが、下記の関数です。アクション毎に関数を定義します。

サンプル(`app/controllers/users_controller.js`):

```
module.exports = {
  index: function(params, callback) {
    var spec = {
      collection: {collection: 'Users', params: params}
    };
    this.app.fetch(spec, function(err, result) {
      callback(err, result);
    });
  }
}

```

ここでは、Backbone.Collection形式でデータ(Users)を取得しています。`this.app.fetch`は、サーバ側とクライアント側でのデータfetchを抽象化するrendrの機能です。実際のデータ・レイヤーについては、話が複雑になるので別途解説します。

fetchが成功したら`callback`を呼び出してビューにデータを渡します。

# ビュー

テンプレートへのデータの受け渡しと、クライアント側での動作を記述するのがBackbone.Viewを拡張する「ビュー」の役割です。`app/views`の下にファイルを作成します。
ここでは、ひとまずサーバ側でのデータの受け渡しを見て行きます。

サンプル(`app/views/users/index.js`):

```
module.exports = BaseView.extend({
  className: 'users_index_view'
});

module.exports.getTemplateData = function(){
data = BaseView.prototype.getTemplateData.call(this);
return data;
};
module.exports.id = 'users/index';
```

`module.exports.id`の部分を、コントローラとアクションに対応させます。

ビューに遷移した段階で`getTemplateData()`が呼ばれ、コントローラでfetchされたオブジェクトがBackbone.Collection/Backbone.Modelに変換されます。

コントローラで「collection」「model」の名前でfetchしたものは、自動的にビューに渡るデータとして変換されます。つまり、ひとつのビューに対して一つのColleciton/Modelを自動で割り当てる事ができます。この辺は、現在も仕様が激しく変わっているところで、複数のCollection/Modelを受け渡すことができるようになるようです。getTemplateData()を上書きする事で、独自のデータセットを作る事もできます。

# テンプレート

テンプレートは`app/templates`の下に作成します。ビューから渡されたデータをレンダリングします。
標準ではHandlebarsを使用していますが、Rendr用にラッパーモジュールを書いて他のエンジンを使う事もできます。

サンプル:

```
<h1>Users</h1>
<ul>
{{#each models}}
  <li>
    <a href="/users/{{login}}">{{login}}</a>
  </li>
{{/each}}
</ul>
```

# rendr-cli

rendrのプロジェクトファイル作成をコマンドラインから行うツール。実はまだ使った事無いので、使ってからまた詳細を書きます。
https://github.com/technicolorenvy/rendr-cli

# まとめ

Rendrにおけるリクエスト処理の流れを解説しました。

* `app/routes.js`でルーティングを行う。
* `app/controllers/*_controller.js`にあるコントローラのロジックが呼び出される。
* `app/views/`の下の対応したビューが呼び出されて、テンプレートにデータが渡る。
* `app/templates/`の下のテンプレートがレンダリングされる。

という、一連の流れとそれぞれのパートの連携のキーを理解頂けたでしょうか？
これでひとまず、自分の作りたいアプリケーションを実装する「基礎」が分かったと思います。

次回は、データの取得を行うDataLayerについて書く予定です。
ChefでError executing action &#39;install&#39; on resource &#39;package[hoge]&#39; が出た場合の対処法


##エラー内容

```
Recipe: php54::default
  * package[php] action install
================================================================================
Error executing action `install` on resource 'package[php]'
================================================================================


Chef::Exceptions::Package
-------------------------
Version 5.4.14-1.el5.remi of php not found. Did you specify both version and release? (version-release, e.g. 1.84-10.fc6)
```

適切な（yumリポジトリが保有している）バージョンを指定できていないのが問題。

##対策

そもそもバージョン指定しない。

```chef-repo/cookbooks/mysql55/recipes/default.rb
%w{mysql-server mysql-devel}.each do |pkg|
  package pkg do
    action :install
#    version node['mysql55']['version']
  end
end
```

```chef-repo/cookbooks/mysql55/attributes/default.rb
#default['mysql55']['version'] = "5.5.34-1.el5.remi"
default['mysql55']['server-id'] = "0"
```

##バージョン指定したい場合は・・
該当バージョンを保有するremi/epel/rpmforge etcが入るように、別途調節する必要がある。

//TODO 希望のバージョンのミドルウェアが含まれているリポジトリを探す効率の良い方法を追加調査。
gitで複数のリモートレポジトリにpushする方法


追加したいレポジトリの`.git/config`に一行追加すればOK。

```
[remote "origin"]
    url = git@github.com:ongaeshi/milkode.git
+   url = git@github.com:hogehoge/hogehoge.git
    fetch = +refs/heads/*:refs/remotes/origin/*
```

[さらに詳しく](http://ongaeshi.hatenablog.com/entry/how-to-push-to-remote-repository-of-multiple-git)
Hash[*array] は数が多すぎるとスタックオーバーフローになる


```
irb(main):001:0> RUBY_VERSION
=> "2.0.0"
irb(main):002:0> Hash[*((0..100001).to_a)];nil
=> nil
irb(main):003:0> Hash[*((0..1000001).to_a)];nil
SystemStackError: stack level too deep
        from /Users/yuichi-tateno/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/irb/workspace.rb:86
Maybe IRB bug!
```

oh
Qiitaで数式

Qiita で数式を打てるようになったらしいです

```math
e^{i\theta} = \cos\theta + i\sin\theta
```

画像ではなくてコピペできるのがすごいですね

[matw.co | 数式をツイートしよう！](https://matw.co/)

これを作っている時とか『数式なんて誰もツイートしねえよ！』とか馬鹿にされることもありましたが，数式を打てないサービスは良くないと思うのでとても良いと思います
Vimで巨大なファイルを開く方法

Vimで巨大なファイルを開くとき、既存のプラグインなどの設定が影響してものすごく遅くなったり、最悪の場合フリーズしてしまいます。

そういうときは、以下のように設定ファイルを明示的に読み込まないようにしてファイルを開きます。

```vim
vim -u NONE file_name
```
SpriteKit入門 -1-

Xcode5で追加されたSpriteKitが面白そうなので触ってみます。
英語は苦手ですが、下記のドキュメントを一通り読んでみるのが目標です。
[Sprite Kit Programming Guide](https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Introduction/Introduction.html "Sprite Kit Programming Guide")

まずは、「Single View Application」でプロジェクトを作成します。
![新規Project作成](https://lh5.googleusercontent.com/-fnzQfT-rOSI/Ul2oSz4LycI/AAAAAAAAAV4/bi7MBTHM7oE/w886-h581-no/spritekit_001.png "新規Project作成")

このあたりの設定はお好きなようにしてください。
ちなみに私はiPhoneは持っていません。
iPadで確認していきます。
![Projectオプション](https://lh6.googleusercontent.com/-_U3GyckbMxI/Ul2sHBnDuiI/AAAAAAAAAW0/-DA0H7uyyCE/w886-h581-no/spritekit_002.png "Projectオプション")

SpriteKitフレームワークを追加します。
![SpriteKitフレームワーク追加](https://lh4.googleusercontent.com/-Ge3hl-8xXRA/Ul2tbVUGg9I/AAAAAAAAAXg/atl1IbMyM6g/w886-h581-no/spritekit_003.png "SpriteKitフレームワーク追加")

ViewControllerの設定でSKViewクラスを選択します。
![SKView設定](https://lh5.googleusercontent.com/-edDoLw2VIls/Ul2wRtm00tI/AAAAAAAAAYA/GV77hxBfLdw/w886-h581-no/spritekit_004.png "SKView設定")

SpriteKit.hをインポートします。

```objectivec:SpriteViewController.h
#import <UIKit/UIKit.h>
#import <SpriteKit/SpriteKit.h>

@interface SpriteViewController : UIViewController

@end
```

FPSなどの情報を画面に表示するように設定します。

```objectivec:SpriteViewController.m
- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    SKView *spriteView = (SKView *)self.view;
    spriteView.showsDrawCount = YES;
    spriteView.showsNodeCount = YES;
    spriteView.showsFPS = YES;
}
```

新しいクラスを追加します。
![新規クラス作成](https://lh5.googleusercontent.com/-McPFJ3O-Ays/Ul2zSag8MsI/AAAAAAAAAYg/myANhXkxzro/w730-h490-no/spritekit_005.png "新規クラス作成")

SKSceneクラスを継承してHelloSceneクラスを作成します。
![クラス名設定](https://lh5.googleusercontent.com/-rRqbPJVNtlA/Ul2z6QPcO1I/AAAAAAAAAZA/HH4RIVqk2VQ/w729-h489-no/spritekit_006.png "クラス名設定")

|||
|:--|:--|
|Class|**HelloScene**|
|Subclass of|**SKScene**|


HelloScene.hをインポートします。

```objectivec:SpriteViewController.m
#import "HelloScene.h"
```

SKViewにHelloSceneを表示します。

```objectivec:SpriteViewController.m
- (void)viewDidAppear:(BOOL)animated
{
    HelloScene *hello = [[HelloScene alloc] initWithSize:CGSizeMake(768, 1024)];
    SKView *spriteView = (SKView *)self.view;
    [spriteView presentScene:hello];
}
```

画面は真っ黒ですけど、下端にFPSとか表示されていればとりあえずOKです。
![Run](https://lh3.googleusercontent.com/-0ihO22iSCzU/Ul22KkzR3II/AAAAAAAAAZk/3eOAnpTGC0A/w498-h648-no/spritekit_007.png "Run")

今回はここまで。
PHPのログをfluentdにて収集


fluentd Document
[Data Import from PHP Applications](http://docs.fluentd.org/articles/php)

PHPからログをfluentdにインポートするには「fluent-logger-php」というライブラリを使用します。

fluent-logger-phpはPHP 5.3以上でないと使用することができないので注意です

なにはともあれ、fluentdがインストールされていないとどうにもならないので下記エントリを参考にサクッとfluentdをインストールして下さい
[CentOSにfluentdを導入](http://qiita.com/michiomochi@github/items/1a3cd07497550bc4d5c2)

fluentdのconfigファイルを編集し、ログの受取り口を設定します

```/etc/td-agent/td-agent.conf
# fluent-logger-php test用に追記
<source>
  type unix
  path /var/run/td-agent/td-agent.sock
</source>
<match fluentd.test.**>
  type stdout
</match>
```

fluentdを再起動

```
$ /etc/init.d/td-agent restart
```

fluent-logger-phpをgit cloneしてきます

```
$ git clone https://github.com/fluent/fluent-logger-php.git
```

git cloneしてくるとfluent-logger-phpというディレクトリが生成されるのでそのディレクトリ内にfluent-logger-php-test.phpというファイルを作成し、下記を記載します

```fluent-logger-php/fluent-logger-php-test.php
<?php
require_once './src/Fluent/Autoloader.php';
use Fluent\Logger\FluentLogger;
Fluent\Autoloader::register();
$logger = new FluentLogger("unix:///var/run/td-agent/td-agent.sock");
$logger->post("fluentd.test.follow", array("from"=>"userA", "to"=>"userB"));
```

で、fluent-logger-php-test.phpをcuiで実行します

```
$ php fluent-logger-php-test.php
```

fluentdのログを確認します

```/var/log/td-agent/td-agent.log
2013-10-16 03:52:12 +0900 fluentd.test.follow: {"from":"userA","to":"userB"}
```

出た
実行時間とかメモリ使用量とか気にしてみようと思ったから

はい、表題の通りに気にしてみようと思ったので
実行時間の方はほぼ標準機能で行けます、多分。
実行時間の方法1
% time test.py
と 入力で時間が出力されます
real    0m0.109s
user    0m0.072s
sys     0m0.036s

timeコマンドはウチのmacからでもubuntuからでも特に違いはなかったようです。


実行時間の方法2
import time
start=time.clock()

end=time.clock()
print end-start

先頭から終了時に入れれば全体の速度、特定のクラス内に埋め込めばピンポイントでソコを。

メモリ使用量の方法1
import resource
ru = resource.getrusage(resource.RUSAGE_SELF)
print ru.ru_maxrss

こちらは単に全体の使用量のみっぽい。


メモリ使用量の方法2
from guppy import hpy
h = hpy()


print h.heap()

これはまた先頭と終了部分に入れてあげれば、ただこちらはかなり細かく出てパッと見ると何が何やらで私には情報量多すぎてアレです。
lessのおすすめオプション

# 概要
lessのman見てたら便利っぽいの見つけたからまとめる

# 内容

## 自分がドキュメントのどこらへんを見てるのか表示する(-m)
![スクリーンショット 2013-10-16 1.38.54.png](https://qiita-image-store.s3.amazonaws.com/0/94/b0f8bb01-77c3-489f-755b-6e2e4515e645.png)

`less -m` で↑のスクショの左下のようにドキュメントのどこらへんにいるかをパーセンテージで表示する

## 自分が見てる行数やそのパーセンテージや開いてるファイル名を表示する(-M)
![スクリーンショット 2013-10-16 1.39.59.png](https://qiita-image-store.s3.amazonaws.com/0/94/8618290c-8533-d731-28e1-06da3cdb9156.png)

`less -M` で↑のスクショの左下のように行数と `-m` 同様なパーセンテージと開いているファイル名を表示する

## ドキュメント内検索する時に検索ワードに大文字が入ってない限り大文字小文字を区別しない(-i)

`less -i` でドキュメントを開くと、ドキュメント内検索する時に検索ワードに大文字が入ってない限り大文字小文字を区別しない。

つまり、 ↓のようなドキュメントを開いている時に

![スクリーンショット 2013-10-16 2.02.59.png](https://qiita-image-store.s3.amazonaws.com/0/94/8d6928f2-d6f7-8ba6-f69d-04e420e39a86.png)

`/test` で検索したら全部ヒットするが

![スクリーンショット 2013-10-16 2.03.19.png](https://qiita-image-store.s3.amazonaws.com/0/94/43471b11-b825-7af6-24b4-215f8b3e3045.png)

`/Test` で検索すると`Test` しかヒットしない

![スクリーンショット 2013-10-16 2.03.38.png](https://qiita-image-store.s3.amazonaws.com/0/94/bdca1100-956b-7c98-a726-c3f59175bcab.png)

## ANSI Color Escape Sequenceを色表示する(-R)
oh-my-zsh使ってたら勝手に設定されてた`-R`オプション。
例を示すと、`-R`オプションを使わずに

```
echo -e '\e[33m Warning! \e[m' | less
```

というコマンドを打つと

![スクリーンショット 2013-10-16 2.14.27.png](https://qiita-image-store.s3.amazonaws.com/0/94/6d715e0c-2be8-35f5-7140-813fb3edb477.png)

こうなるが、`-R`オプションをつけると

![スクリーンショット 2013-10-16 2.15.24.png](https://qiita-image-store.s3.amazonaws.com/0/94/4886cfe4-9f33-b419-34fe-b159f171e451.png)

こうなる

## 行番号表示(-N)
![スクリーンショット 2013-10-16 2.20.31.png](https://qiita-image-store.s3.amazonaws.com/0/94/993327af-d42f-dbab-1646-30133e7dba1c.png)

とても分かりづらいが、↑の左側の数字が行番号。ただし、manによると大きなファイルを開いた場合動作が重くなるらしいので注意。

## 1行が画面に入りきらない場合に折り返さない(-S)
常時使うようなオプションではないけれど、1行が長いログ見る時に便利。
普通にオプション無しの`less`でapacheのログファイルとか見るとこんな感じになっちゃう

![スクリーンショット 2013-10-16 19.59.14.png](https://qiita-image-store.s3.amazonaws.com/0/94/438bf793-148b-ca91-91e4-d57a47a8f432.png)

これを`less -S`で見ると

![スクリーンショット 2013-10-16 20.01.33.png](https://qiita-image-store.s3.amazonaws.com/0/94/7dfdc400-b5b6-af9f-a5a1-a895bb19a009.png)

すっきり！
もちろん切れた部分も見れます。矢印キーの←→で。vimの要領で`hl`押しても駄目なので注意。

![スクリーンショット 2013-10-16 20.02.16.png](https://qiita-image-store.s3.amazonaws.com/0/94/3786cf1e-d895-e010-b258-77fbf2182919.png)

ちなみにスクショのログはてきとうにぐぐって拾ってきました。

# 補足
`LESS`環境変数に常時使うオプションを指定できるので、`.zshrc`に

```
export LESS="-iMR"
```

とか書いておくと幸せになれる。
oh-my-zsh使ってる人はoh-my-zshを読み込んだ後に指定しないと多分`-R`で上書きされちゃうから注意
libev で見つけた, ちょっとした extern "C" マクロスニペット

最近デザインディレクターみたいなお仕事になって、趣味でしかコード書かなくなってしまい。「じゃあ余暇は思いっきり修験に時間のかかる言語とかをのんびりやるか」と思い至り、C言語を勉強してる VoQn です。

で、 linux kernel のソースとか libev のソースとか読んでたりしてたのですが、 libev の `ev.h` に小さいけど「あっ、すぐ意味わかったし、なんか小技っぽい」というのを見つけた次第で、ちょっと自分でも使ってみようかなと思うものが。

## `IF_CPP(expr)` マクロ

いや、本当にこれだけなんですけどね。
libev には [EV_CPP](https://github.com/michaelmior/libev/blob/master/ev.h#L43) というマクロで実装されています。

```c:if_cpp_macro.h
#ifndef IF_CPP
#  ifdef __cplusplus
#    define IF_CPP(expr) expr
#  else
#    define IF_CPP(expr)
#  endif
#endif
```

## 使い方
### `IF_CPP(expr)` マクロ使ってない場合（before）
```c:hoge.h
#ifndef _HOGE_H_
#define _HOGE_H_

#ifdef __cplusplus
extern "C" {
#endif

/* … */

#ifdef __cplusplus
}
#endif

#endif
```
よく見るパターンですね。

### `IF_CPP(expr)` マクロ使った場合（after）

```c:hoge.h
#ifndef _HOGE_H_
#define _HOGE_H_

#include "if_cpp_macro.h"

IF_CPP(extern "C" {)

/* … */

IF_CPP(})

#endif
```

プラグマ書く量減ったっていうのと、ヘッダファイルから `#if` プラグマのネストが減りましたね。

ほんっとーに、これだけ。でも `#ifdef __cplusplus` 何度も書くのだるいなーってきっと libev の人面倒臭かったんだろうな、というのと、案外「純粋にCで書いてるけど C++ 相手に対応するのかったるい」って場合のショートハンドを書く時のパターンに応用できそうだな。と思った。

#[追記] Gauche の方がもっと賢かった
Gauche の [SCM_DECL_BEGIN](https://github.com/shirok/Gauche/blob/dd5edf5aa5e8016a7d70fc08ed836f97ad283d40/src/gauche.h#L94) がもっとインテリジェンスな感じだった

```c
#ifndef XX_DECL_BEGIN
#ifdef __cplusplus
#define XX_DECL_BEGIN extern "C" {
#define XX_DECL_END }
#else /* not c++ */
#define XX_DECL_BEGIN
#define XX_DECL_END
#endif

XX_DECL_BEGIN

/* ... */

XX_DECL_END
```

ああ、こりゃ賢いわ。マネさせてもらってます
Vagrant 1.3.4 が Virtualbox 4.3 に対応してないので Virtualbox公式のコマンドから対応する方法

## はじめに

先ほどVirtualBox 4.3がリリースされました。
http://www.oracle.com/us/corporate/press/2033376

<del>ですがまだ vagrant が 4.3 に対応していないので以下のようなエラーが表示され動きません。</del>

10/16 8:26 追記 ここから
Virtualbox 4.3 に対応したバージョンが出ました。 → http://downloads.vagrantup.com/tags/v1.3.5
10/16 8:26 追記 ここまで

```text
Vagrant has detected that you have a version of VirtualBox installed
that is not supported. Please install one of the supported versions
listed below to use Vagrant:

4.0, 4.1, 4.2
```

そこでコマンドから既存のVMを操作する方法を。（ちなみにVirutalbox限定）

## VM 一覧で vmname もしくは uuid を確認。

まずはVMの一覧から vmname もしくは uuid を確認します。

```bash
VBoxManage list vms
```

実行すると以下のような感じで出力されます。

```bash
"wheezy64" {ec1a8357-f4ae-4463-bdfc-5fff34bc054c}
"web_default_1378518607" {7a6e33a4-b34b-4ed3-8b77-2e4ff86fdb04}
"wp_default_1381838856" {45537216-ad10-4460-93d7-4a19d45732c9}
```

このうち、 "web_default_1378518607" が vmname で、{7a6e33a4-b34b-4ed3-8b77-2e4ff86fdb04} が uuid です。

## ヘッドレスでVMを起動する

画面を伴わない方法で起動したいので、`--type headless` オプションを追加して起動します。上記のコマンドで取得した vmname もしくは uuid を指定してください。

```bash
VBoxManage startvm {vmname|uuid} --type headless
```

## SSHでつなげる

あとは以下の要領でSSHに繋げられらはず。

```bash
ssh localhost -p 2222 -l vagrant
```

## その他

その他、使えそうな主なコマンドは以下の通りです。

* 電源 Off

```bash
VBoxManage controlvm {vmname|uuid} poweroff
```

* 一時停止

```bash
VBoxManage controlvm {vmname|uuid} pause
```

* 再開

```bash
VBoxManage controlvm {vmname|uuid} resume
```

多分このくらいあれば問題ないと思いますので、[対応されるまで](https://github.com/mitchellh/vagrant/issues/2374) どうぞです。
ちなみに vagrant で設定していたポート転送などについては、そのまま使えていますが、環境によっては使えないかもしれません。
MacOSX + homebrew環境でのPostgreSQL+PostGISのアップグレード


9.2.4 -> 9.3.1 にアップグレードしたときのメモ。

$ brew update
$ brew upgrade

ってやったときにPostgreSQLもアップグレードされてた。
このままだと、いままのDBを引き続き使うことができないので、PostgreSQL自体だけでなく、DBをアップデートする必要がある。
PostGISも使っていたのでちょっとややこしいことになっていた。

PostgreSQL 9.2.4にスイッチする
$ brew switch postgresql 9.2.4

DB全体のダンプを作成
$ /usr/local/Cellar/postgresql/9.2.4/bin/pg_dumpall > pg_dump_2013-10-16_0.dump

古いDBのディレクトリを移動させておく
$  mv /usr/local/var/postgres /usr/local/var/postgres-old

PostgreSQL 9.3.1にスイッチする
$ brew switch postgresql 9.3.1

新しいDBを作成&初期化
$ /usr/local/Cellar/postgresql/9.3.1/bin/initdb -D /usr/local/var/postgres

さきほど作成したDBのダンプをリストアする
$ /usr/local/Cellar/postgresql/9.3.1/bin/psql -d postgres -f pg_dump_2013-10-16_0.dump

一応これで移行出来たっぽいけど大丈夫なんかな・・・。
validates_length_of とブラウザからの入力は改行が\r\nとして送信される件

`before_validation` で入力を整えるのがいいのかな。

```ruby
class Post < ActiveRecord::Base
  # when Post has body:text

  before_validation :body do
    self.body = body.gsub(/\r\n/, "\n")
  end

  validates_length_of :body, maximum: 100
end
```

これで "foo\r\nbar" という文字列が送信されても "foo\nbar" になおしてからvalidateするので見た目どおりに動く。

さて、これはテストすべきだろうか。別にこれはRailsの実装がまずいわけではないがハマりどころではある。特にクライアント側でリアルタイムにユーザに残りの入力可能文字数を見せている場合は対応すべきだ。そうでない場合は別の方法で解決するほうがいいこともある（たとえば `validates_length_of` の custom tokenizer を使う方法など）。わかってしまえば自明なことで常にテストすべきとも思わないが、プロジェクトをgrepして探し出せるほうがいいからモデル１つ分くらいはきっちりテストを書いておくのがよいのかなと思う。

cf. [テスト書きすぎ問題](http://hitode909.hatenablog.com/entry/2013/10/14/094604)
YAML Front-matter とかいうやつ


Octopress でもブログ書いてるんだけど、markdown のヘッダに、

```
---
layout: post
title: "metersToEquatorPixels を Google Maps Android API v2 で"
date: 2013-10-09 00:21
comments: true
categories: [Android, Java, Geo, GoogleMapsAPI]
---
```

こんな風にメタ情報を書くルールになっている。

この書き方、 Front-matter というそうで。

* [Front-matter - jekyllrb](http://jekyllrb.com/docs/frontmatter/)

んで、github は、これをいい感じに整形して表示してくれる。

* [amay077.github.com/source/_posts/2013-10-09-meterstoequatorpixels-in-gmap-v2.markdown](https://github.com/amay077/amay077.github.com/blob/source/source/_posts/2013-10-09-meterstoequatorpixels-in-gmap-v2.markdown)

@Qiita とか ＠Kobito でもこれに対応してくれると、私が嬉しい。

Kobito で「書き出し」た .md ファイルのヘッダが Front-matter になってたり、逆に Front-matter を読み込んでくれるといいな。
Provisioning Profile の UUID を調べる

### あれ？Xcode 5 からインストール済み Provisioning Profiles の見方が変わった...
詳しくは[こちら](http://stackoverflow.com/questions/18041267/provisioning-profiles-menu-item-missing-from-xcode-5)を参照。

正直どうでもいいと思っていた。Titanium のコマンドラインから adhoc ビルドをするまでは・・・。

### Provisioning Profile の UUID がコピペできない...
コマンドラインで UUID の指定は必須なのにコピペできない。これは困った。
Xcode の 設定からはそもそも UUID が見れない（上記リンク参照）。そしてTitanium Studio では表示されるけど、コピーができない。

### iPhone 構成ユーティリティ
救いは「Phone 構成ユーティリティ」にあった。[ここ](http://support.apple.com/kb/DL1465?viewlocale=ja_JP)からダウンロードできる、アップル純正のツール。これを使えば、いまMacにインストールされている Provisioning Profile を一覧できるし、UUIDのコピーも可能。

## 追記
Titanium のコマンドラインで、Provisioning Profile の UUID を **「空」** エンターすると、利用可能な Provisioning Profile の UUID が一覧表示されるようです。つまり上の手順は無駄だ！[@ryugoo_](https://twitter.com/ryugoo_)さんありがとう！
PHPでフィボナッチ数F38を求める

PHPでフィボナッチ数列をつくってみる
http://qiita.com/zss_tr/items/2a7625b2d2188538adbc

この書き方はフィボナッチ数の定義ですが、そのまま実装すると非常に効率が悪く、実用にはなりません。

```php
<?php
	
	// by satosystems
	// http://d.hatena.ne.jp/satosystems/20121228/1356655565
	function fib1($n){
		if ($n < 2){ return $n; }
		return fib1($n - 2) + fib1($n - 1);
	}
	
	// by Dan Kogai
	// http://blog.livedoor.jp/dankogai/archives/50958771.html
	function fib2($n){
		if($n < 2){return $n;}
		return fib2_sub(1, 1, $n);
	}
	function fib2_sub($a, $b, $c){
		if ($c <= 2){ return $a; }
		return fib2_sub($a+$b, $a, $c-1);
	}
	
	// by NurseAngel
	function fib3($n){
		$fib0 = 0;
		$fib1 = 1;
		$ret = 0;
		for($i=0; $i<$n; $i++){
			$ret = $fib1;
			$fib1 = $fib0 + $fib1;
			$fib0 = $ret;
		}
		return $ret;
	}
	
	// by C言語による最新アルゴリズム事典
	function fib4($n){
		return floor( pow((1+sqrt(5))/2, $n) / sqrt(5) + 1/2 );
	}
```

| 関数 | 処理時間 | F(38)の値 |
|:-----------|------------:|:------------:|
| fib1() | 34.29149秒 | 39088169 |
| fib2() | 0.00005秒 | 39088169 |
| fib3() | 0.00002秒 | 39088169 |
| fib4() | 0.00002秒 | 39088169 |


fib1はフィボナッチ数列の定義そのものです。
何も考えずに実装したらこうなることでしょう。
しかしこちらは、計算時に自分自身を2回呼び出します。
つまり引数が1増えるにつれ、fib1()を呼び出す回数がおよそ2倍になります。
計算量はO(2<sup>n</sup>)となり、効率の非常に悪いオーダーです。
fib1(100)なんて求めようとすると、早々と反応がなくなってしまいます。


fib2は少々わかりにくいですが、上から順ではなく下から計算しています。
fib2_sub()の1回目に与えている1,1という引数は、順にF2、F1の計算結果です。
あとはfib2_sub()の再帰呼び出しで計算します。
fib2_sub()の2回目の引数はF2+F1つまりF3、F2、数値の37です。
fib2_sub()の3回目の引数はF3+F2つまりF4、F3、数値の36です。
…と順に下っていき、最後のfib2_sub()の引数はF38、F37、数値の2となります。

これによって引数が1増えても、fib2()の呼び出しは1回しか増えません。
計算量はO(n)となり、劇的に改善どころかとんでもない速度になりました。
というかこの時点で早すぎてfib2(38)では計算する意味がないレベル。
fib2(1000)でも余裕で計算可能です。


正直既にこの時点で終わりでいいんじゃね、という気もしますが、よく見てみたらfib2_sub()の再帰って実は計算には全く使わず、単にループ回数をカウントしてるだけです。
カウントしてるだけならループでいいだろう、ということでfib3()です。
こちらも単純に下から足してるだけで、やってることはfib2()とほぼ同じです。
ただ再帰の関数呼び出しが無くなったせいか、速度もさらに上がっています。


さて、実は再帰もループも使わずにフィボナッチ数を一発で求める[公式が存在します](http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0)。

```math
Fn = \frac{ \phi^n - \left(-\phi \right)^{-n} }{ \sqrt{5} } = \left[ \frac{ \phi^n }{ \sqrt{5} } + \frac{1}{2} \right]
```

ただしφは[黄金比](http://ja.wikipedia.org/wiki/%E9%BB%84%E9%87%91%E6%AF%94)

ルートとか割り算とか入ってるくせに計算すると必ず自然数になるとか意味がわからない。
計算量はO(1)でいいのかな、これ？

早すぎてfib3()と違いが分かりませんが、F2000とかを求めようとするとfib4()のほうが早くなるようです。
どちらにしろ0.1秒以下なので実用上はほとんど変わらないレベルですが。
まあともかく、結論としては、フィボナッチ数を求めるアルゴリズムでfib1()だけを書いてるサイトは投げ捨ててしまえ、ってことでいいですかね。


※2013/06/07に[自サイトに掲載したもの](http://yuubiseiharukana.blog.shinobi.jp/Entry/1179/)。
VimにRuby関連プラグインをインストール


Vim初心者です。
Vimmerを目指し、千里の道も一歩から…

##参考にさせていただいたサイト
+  [NeoBundleの導入](http://qiita.com/puriketu99/items/1c32d3f24cc2919203eb)
+ [vim使っているrubyistで、これ入れていないのはヤバいプラグインまとめ](http://qiita.com/alpaca_taichou/items/ab2ad83ddbaf2f6ce7fb)

##NeoBundleを入れてみる
というわけでまずはVimのプラグイン管理ツールであるところの
NeoBundleを入れてみました。

```Bash:
mkdir -p ~/.vim/bundle
git clone https://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
git clone https://github.com/Shougo/vimproc ~/.vim/bundle/vimproc
```

`~/.vimrc`をいじります。
まだよく分からないので今回はこんな感じにしてみました。

```Bash:
if has('vim_starting')
	set nocompatible               " be iMproved
	set runtimepath+=~/.vim/bundle/neobundle.vim
endif

call neobundle#rc(expand('~/.vim/bundle/'))

NeoBundle 'Shougo/neobundle.vim'
NeoBundle 'Shougo/vimproc'
NeoBundle 'VimClojure'
NeoBundle 'Shougo/vimshell'
NeoBundle 'Shougo/unite.vim'
NeoBundle 'Shougo/neocomplcache'
NeoBundle 'Shougo/neosnippet'
NeoBundle 'jpalardy/vim-slime'
NeoBundle 'scrooloose/syntastic'
""NeoBundle 'https://bitbucket.org/kovisoft/slimv'

NeoBundle 'alpaca-tc/alpaca_tags'
NeoBundle 'AndrewRadev/switch.vim'
NeoBundle 'bbatsov/rubocop'
NeoBundle 'tpope/vim-endwise'

filetype plugin indent on     " required!
```

viを起動して、`:NeoBundleInstall`コマンド実行でインストールされます。
コンソールVimのヤンクでMacのクリップボードにコピー


やってみよ。

##参考にさせていただいたサイト
[【Vim】【Mac】Vimのヤンクでクリップボードにコピーする]
(http://sea-mountain.hatenablog.jp/entry/20110421/1303362772)

##基本の流れ

基本は.vimrcに以下を書けばOKらしいです。

```
set clipboard=unnamed,autoselect
```

ところが、vimのビルドによってはできないということで、チェック。


```
vim --version | grep clipboard
-clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments 
 -xterm_clipboard -xterm_save 
```
`-clipboard`ってことで、クリップボード共有はできないビルドみたい。

##MacPortを使ってvimをインストール
それなら`+clipboad`なvimを入れてしまいましょう、ということでチャレンジ。

```Bash:
$ port variants vim
vim has the variants:
   athena: Build GUI version using Athena widgets
     * conflicts with gtk1 gtk2 motif
     * requires x11
   big: Build big feature set
     * conflicts with small tiny
   cscope: Enable source code browsing with cscope
   gtk1: Build GUI version using GTK 1.x widgets
     * conflicts with athena gtk2 motif
     * requires x11
   gtk2: Build GUI version using GTK 2.x widgets
     * conflicts with athena gtk1 motif
     * requires x11
[+]huge: Build huge feature set
     * conflicts with big small tiny
   motif: Build GUI version with Motif widgets
     * conflicts with athena gtk1 gtk2
     * requires x11
   perl: Enable Perl scripting
   python: Compatibility variant, requires +python25
     * requires python25
   python25: Enable Python scripting
     * conflicts with python26 python27
   python26: Enable Python scripting
     * conflicts with python25 python27
   python27: Enable Python scripting
     * conflicts with python25 python26
   python31: Enable Python scripting
     * conflicts with python32 python33
   python32: Enable Python scripting
     * conflicts with python31 python33
   python33: Enable Python scripting
     * conflicts with python31 python32
   ruby: Compatibility variant, requires +ruby18
     * requires ruby18
   ruby18: Enable Ruby scripting
     * conflicts with ruby19
   ruby19: Enable Ruby scripting
     * conflicts with ruby
   small: Build small feature set
     * conflicts with tiny
   tcl: Enable Tcl scripting
   tiny: Build tiny feature set
   universal: Build for multiple architectures
   x11: Build CLI version with X support
   xim: Build with support for X Input Method
```
うーんどれでクリップボード有効になるのか分かりませんが、上記参考サイトによりますと、+rubyしちゃえばできるようになるみたいです。ちょうどいいや、やってみよ。

```Bash:
sudo port install vim +ruby
```

それなりにお時間がかかります。
完了後、`~/.bash_profile`にviとvimのエイリアスを指定します。

```Bash:
alias vim='env LANG=ja_JP.UTF-8 /opt/local/bin/vim'
alias vi='env LANG=ja_JP.UTF-8 /opt/local/bin/vim'
```

確認してみましょう。

```Bash:
$ source ~/.bash_profile
$ vi --version | grep clipboard
+clipboard       +iconv           +path_extra      -toolbar
+eval            +mouse_dec       +startuptime     -xterm_clipboard
```
Vagrant導入


仮想の開発環境作成ツールであるところのVagrantを導入してみました。
折角VMware Fusion持っているのでプラグインも導入してみました。

##本体のインストール

公式サイトからdmg持ってきてインストールします。簡単！
http://www.vagrantup.com/

##VMware Fusion用プラグインを購入、インストール

以下で購入できます。シングルパーソン、2台までのライセンスあたり$79です。購入完了するとすぐにライセンスファイルのダウンロードリンクとインストールの仕方が書かれたメールが送られてきます。
http://www.vagrantup.com/vmware

まずはプラグインをインストールして…

```Bash:
$ vagrant plugin install vagrant-vmware-fusion
Installing the 'vagrant-vmware-fusion' plugin. This can take a few minutes...
Installed the plugin 'vagrant-vmware-fusion (2.0.8)'!
```

ダウンロードしたライセンスファイルを適用すれば完了です。

```Bash:
$ vagrant plugin license vagrant-vmware-fusion license.lic 
Installing license for 'vagrant-vmware-fusion'...
The license for 'vagrant-vmware-fusion' was successfully installed!
```
MacにRuby1.9をインストール

MacPortsを使ってインストールしてみました。

##参考にさせていただいたサイト
[Macのruby を最新のバージョンにアップデート](http://hotwebtopics.seesaa.net/article/363130711.html)

##やってみよ

```Bash:
$ port list ruby*
ruby                           @1.8.7-p374     lang/ruby
ruby-build                     @20130628       ruby/ruby-build
ruby19                         @1.9.3-p448     lang/ruby19
ruby20                         @2.0.0-p247     lang/ruby20
ruby186                        @1.8.6-p420     lang/ruby186
ruby_select                    @1.0            sysutils/ruby_select
```

ございますね。今回は1.9.3を入れます。

```Bash:
$ sudo port install ruby19
```

MacPortsのRubyをruby19にします。
これで`/opt/local/bin/ruby`ができます。
パスも通っている…だが相変わらず古いバージョンを見ている模様。
ありゃ？

```Bash:
$ sudo port select ruby ruby19
Selecting 'ruby19' for 'ruby' succeeded. 'ruby19' is now active.
$ which ruby
/opt/local/bin/ruby
$ ruby -v
ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin12.0]
$ /opt/local/bin/ruby -v
ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-darwin12]
```
.bash_profileでエイリアスを指定します。

```Bash:
alias ruby='/opt/local/bin/ruby'
```

再度確認。

```Bash:
$ source ~/.bash_profile
$ ruby -v
ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-darwin12]
```

できました。(合ってるのかな)
MacPortsのインストールと設定メモメモ


MacPortsはOS Xのパッケージ管理ツールっていうんですかね。
最近はHomebrewの記事をよく見かけますが、まずはこちらを試してみます。


##参考にさせていただいたサイト
[MacPortsの基本的な使い方とコマンド](http://blog.asial.co.jp/371)


##インストール

1. Xcodeを入れておきます。
https://developer.apple.com/jp/technologies/tools/

2. MacPortsのdmgをダウンロードしてインストールします。
http://www.macports.org/

3. PATHの設定なんかも自動でやってくれるみたいです。
.bash_profileを反映させて、完了です。簡単！

```Bash:
$ source ~/.bash_profile
```


##使用方法

ほい、自身の更新確認とリスト更新。

```Bash:
$ sudo port selfupdate
Password:
--->  Updating MacPorts base sources using rsync
MacPorts base version 2.2.0 installed,
MacPorts base version 2.2.0 downloaded.
--->  Updating the ports tree
--->  MacPorts base is already the latest version

The ports tree has been updated. To upgrade your installed ports, you should run
  port upgrade outdated
```

パッケージ検索。

```Bash:
port search <キーワード>
```

インストール。

```Bash:
sudo port install <パッケージ名>
```

アンインストール。

```Bash:
sudo port uninstall <パッケージ名>
```

で、インストール時には追加可能なオプション(variants)を指定可能です。
オプションの表示は以下。

```Bash:
port variants <パッケージ名>
```
インストールするときには、以下のように指定します。

```Bash:
sudo port install <パッケージ名> +オプション +オプション
```
ruby の sprintf書式文字列の、あまり使われていないような気がする機能

ruby の sprintf というか、書式文字列 % 値 の、書式文字列。

```ruby
"%*d" % [7,123456] # => " 123456"
"%0*x" % [8,32767] # => "00007fff"
"%*.*f" % [10,3,1.0/3] # => "     0.333"
```

こういう機能がある。なんのことかというと、上記の３つの式は

```ruby
"%7d" % 123456 # => " 123456"
"%08x" % 32767 # => "00007fff"
"%10.3f" % (1.0/3) # => "     0.333"
```

と、同じ。 

`%7d` の 7 を引数から取ってくることができるようになる。C 言語の（もしかしたら、GNU拡張の）printf にあった機能で、ruby に取り込まれているんだと思う。

C 言語だと決定的に便利な機能だと思うんだけど、ruby だと`%#{size}d` って書けばいいから不要かも。

※ 私の記憶が確かなら、java の sprintf にはこの機能がない。
カーソル位置を行頭トグルする（Vim）

Vimでは
- 空白を除く行の行頭に移動する`^`と
- 行頭に移動する`0`

の両方がありますが、覚えきれずに誤爆したり、そもそも`^`は`6`の上という押しにくい位置にあったりと色々アレなので、比較的押しやすい`0`でトグル出来るようにするとはかどるんじゃあないかと思ったら結構はかどったので実際おすすめです。
`^`のキーマップを覚える方が編集速度が早まるんじゃという疑惑もありますが、`^`を押すよりも`0`を二連打するほうが楽ですし、ホームポジションも崩れず、筋肉への負担も少ないです。スゴイ！

```vim
nnoremap <expr> 0
\         col('.') == 1 ? '^' : '0'
```

これでささやかなはかどりが得られますね？


`追記:`

-   `^`してから`0`したい系の改良を投稿してもらえました

  [Vimで、カーソル位置を行頭トグルする(改)](http://qiita.com/kentaro/items/8669d98ceb9b11d645e4#comment-d25dcddc900653ae8fc5)

-  `0` -> `^` -> `$` のローテーションをするTIPSがありました

     [行頭 → 非空白行頭 → 行末 をローテートする](http://qiita.com/Linda_pp/items/ee4bf64b1fe2c0a32cbd)
第15回オフラインリアルタイムどう書くの参考問題をGoで解く

問題はこちらのリンクから。
http://qiita.com/Nabetani/items/0b56395d4c9e7c64b230

Rubyで解いてみたが( http://qiita.com/nidouchi/items/3ba43c6021d1e4d54fcd )、処理時間かかりすぎなのでGoに初挑戦。結果、我慢できる時間内で処理できるようになったけれど、アルゴリズムは基本的にRuby版と変えていないので遅いのは変わらず。

```go
package main

import "fmt"
import "strings"

func judge(chars []string) bool {
	for i := 0; i < len(chars) / 2; i++ {
		if chars[i] != chars[len(chars) - i - 1] {
			return false
		}
	}
	return true
}

func countBits(v uint) int {
	count := 0
	for i := 0; i < 32; i++ {
		if ((1<<uint(i)) & v) != 0 {
			count++
		}
	}
	return count
}

func solve(prob string) int {
	max := 0
	orgChars := strings.Split(prob,"")
	for i := 1; i < (1 << uint(len(prob))); i++ {
		cb := countBits(uint(i))
		if cb <= max {
			continue
		}
		selChars := make([]string, cb)
		k := 0
		for j := 0; j < len(prob); j++ {
			if ((1<<uint(j)) & i) != 0 {
				selChars[k] = orgChars[j]
				k++
			}
		}
		if judge(selChars) {
			max = cb
		}
	}
	return max
}

func test(prob string, ans int) {
	a := solve(prob)
	result := "NG"
	if ans == a {
		result = "OK"
	}
	fmt.Printf("%s %d %s\n", prob, a, result)
}

func main() {
/*0*/ test( "I_believe_you_can_solve",9 )    
/*1*/ test( "a",1 )    
/*2*/ test( "aa",2 )    
/*3*/ test( "aaa",3 )    
/*4*/ test( "ab",1 )    
/*5*/ test( "aabb",2 )    
/*6*/ test( "ABBA",4 )    
/*7*/ test( "Abba",2 )    
/*8*/ test( "1234567890",1 )    
/*9*/ test( "1234567890987654321",19 )    
/*10*/ test( "abcdcba",7 )    
/*11*/ test( "0a1b2c3d4c5b6a7",7 )    
/*12*/ test( "abcdcba0123210",7 )    
/*13*/ test( "abcdcba_123210",7 )    
/*14*/ test( "_bcdcba0123210",7 )    
/*15*/ test( "abcddcba0123210",8 )    
/*16*/ test( "abcdcba01233210",8 )    
/*17*/ test( "a0bc1dc2ba3210a",9 )    
/*18*/ test( "a0bc1ddc2ba3210",8 )    
/*19*/ test( "3a0bc1ddc2ba3210",10 )    
/*20*/ test( "11oooo1111o1oo1o111ooooooooooo",20 )    
/*21*/ test( "11o1111o1111oo11ooo11111ooo1oo",20 )    
/*22*/ test( "111111oo11o111ooo1o1ooo11ooo1o",21 )    
/*23*/ test( "11o1o1o11oo11o11oo111o1o1o11oo",27 )    
/*24*/ test( "oo111o1o11o1oo1ooo11o1o11o1o1o",27 )    
/*25*/ test( "1o1oo11111o1o1oo1o1o1111oo1o1o",28 )    
/*26*/ test( "QQooooQooooQQyQoyQQQyyyyQQoyoy",15 )    
/*27*/ test( "oQoooQooooQyoyQoyoyyyQQyQQQQoQ",16 )    
/*28*/ test( "yyyyyooyQyyyoyyQyyooyQoQoQQoQy",17 )    
/*29*/ test( "yyQoyQoyyQyQQoyooooyyQQyQyooQy",24 )    
/*30*/ test( "oQQooQoQyQQoyoQQoQyQyQyQoQoooo",24 )    
/*31*/ test( "oQQyQQyyQyQQoooyQQyyyQQQyyQQoy",25 )    
/*32*/ test( "WAk9iHI4jVDlStyudwTNqE138kwan2",3 )    
/*33*/ test( "c43fIu1Mlz0K9hEVOgGcUdbeB5ksa7",3 )    
/*34*/ test( "CAbYcW5VqHjzFdIkH_61PM0TsyRuie",3 )    
/*35*/ test( "jInQnUvSayrJTsQWujovbbqW0STvoj",10 )    
/*36*/ test( "iZDrvpUKgtj3FrZsZ4CLjrEgUdZzQG",11 )    
/*37*/ test( "ROgYUOu6er_DA7nB6UGquO1GUHC62R",11 )    
/*38*/ test( "Oh_be_a_fine_girl_kiss_me",9 )    
/*39*/ test( "8086_6502_6809_Z80",11 )    
/*40*/ test( "xcode_visualstudio_eclipse",11 )    
/*41*/ test( "word_excel_powerpoint_outlook",9 )    
/*42*/ test( "abcdefghijklmnopqrstuvwxyz0123",1 )
}
```
KIFテスト時の操作のデフォルトタイムアウトを変更する

KIFTestActor:setDefaultTimeoutのクラスメソッドをbeforeAllで呼ぶ。

```objc:Acceptance_Tests.m
interface Acceptance_Tests : KIFTestCase
@end

@implementation Acceptance_Tests


- (void)beforeAll
{
  [super beforeAll];
  [KIFTestActor setDefaultTimeout:0.50]; // 10.00 -> 0.50 seconds
}

@end
```
OSXでのCython実行方法メモ

##OSXでのCython実行方法メモ

###セットアップファイルを用意する。

```py:filename_setup.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#filename_setup.py
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext as build_pyx
setup(name = 'filename', ext_modules=[Extension('filename', ['filename.pyx'])], cmdclass = { 'build_ext': build_pyx })

```

###Terminalでセットアップファイルをビルドする。

```bash
$ cp filename.py filename.pyx
$ Cython filename.pyx
$ python filename_setup.py build
$ python
```

\#ちなみに上記のCython前にpyx内にてcdef使って変数の型を指定してあげるとより一層速くなる。

###Pythonでインポートする。

```py
>> import pyximport; pyximport.install()
>> import filename
```

簡単でそ

[Cython: C-Extensions for Python](http://cython.org)
第15回オフラインリアルタイムどう書くの参考問題をRubyで解けてない

問題はこちらのリンクから。
http://qiita.com/Nabetani/items/0b56395d4c9e7c64b230

問題が文字列が長い場合(#20等)はまともな時間で解けないです。

```rb
def solve(q)
  max = 0
  (2**q.size).times{|i|
    w = ("%0#{q.size}b"%i).chars.zip(q.chars).select{|e| e[0]=='1'}
    max = w.size if w.size > max && w == w.reverse 
  }
  max
end

DATA.readlines.each do |line|
  no,q,a,s = line.chop.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans.to_s
  puts ans == a.to_i ? ' o' : ' x'
end
__END__
0	I_believe_you_can_solve	9	evo_n_ove
1	a	1	a
2	aa	2	aa
3	aaa	3	aaa
```
RubyでSOAP通信を行う方法


rubyでSOAP通信する方法。

```sample.rb
require "net/http"
require "uri"
require "rexml/document"

uri = URI.parse("APIのURL")

response = nil

request = Net::HTTP::Post.new(uri.request_uri)
request.body = <<EOS
<?xml version="1.0" encoding="UTF-8"?> 
・
・
・
・
・
・
・
・
EOS

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

http.set_debug_output $stderr

http.start do |h|
  response = h.request(request)
end

puts response.body

```

以上のスクリプトを実行するとコンソールに取得結果のXMLが出力される。
Tick-Tack-Toe

```c:hena1.c
// http://nabetani.sakura.ne.jp/hena/1/
#include <stdio.h>
#define b(c)((s[0]==c&&s[1]==c&&s[2]==c)||(s[3]==c&&s[4]==c&&s[5]==c)||(s[6]==c&&s[7]==c&&s[8]==c)||(s[0]==c&&s[3]==c&&s[6]==c)||(s[1]==c&&s[4]==c&&s[7]==c)||(s[2]==c&&s[5]==c&&s[8]==c)||(s[0]==c&&s[4]==c&&s[8]==c)||(s[2]==c&&s[4]==c&&s[6]==c))
char s[9],places[20];main(x,c,i){
	for(;~scanf("%s",places);){
		i=c=0;
		memset(s,0xff,9);
		for(;i<9;i++,c^=1){
			if(!places[i])break;
			x=places[i]-'1';
			if(~s[x]){
				if(c)puts("Foul : o won.");
				else puts("Foul : x won.");
				break;
			}
			s[x]=c;
			if(b(c)){
				if(c)puts("x won.");
				else puts("o won.");
				break;
			}
		}
		if(i==9)puts("Draw game.");
		fflush(stdout);
	}
}
```
等差数列

```rb:hena11pre.rb
#!/usr/bin/env ruby
#http://qiita.com/items/c206fbc645c255cb7de6
#http://nabetani.sakura.ne.jp/hena/ord11arithseq/
STDOUT.sync=true
while gets
	h={}
	$_.chomp.chars{|e|h[e.to_i(36)]=1} # because already sorted...
	r=1
	0.step(35){|i|
		if h.has_key?(i)
			1.step(35){|j|
				k=1
				while h.has_key?(i+j*k) do k+=1 end
				r=[r,k].max
			}
		end
	}
	p r
end
```
Javaにおけるフレームの位置調整


## はじめに

JavaはみんなEclipseを使っているからか、使っているクラスのインポート先が書かれていないことが多い。Processingを使って、sublimeで編集していると、ときどきイラっとするのでほとんどコピペだけど、フレームの位置調整のサンプルコードをまとめておく。

## サンプルコード

JFrameを使ったテストを書く。

```Java:TestWindow.java
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.event.*;

public class TestWindow extends JFrame {
	public JTextArea textarea = null;
	protected JLabel label = null;
	public JTextField text = null;

	public TestWindow () {
		// ここからは全部UIのサンプルなので、意味は無い
		this.setSize(480, 320);
		this.setTitle("status");
		JPanel panel = new JPanel();
		panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

		JPanel panel1 = new JPanel();
		panel1.setBorder(new EmptyBorder(5,5,5,5));
		label = new JLabel ("Hoge");
		panel1.add(label);
		text = new JTextField ("None", 40);
		panel1.add(text);
		panel.add(panel1);

		JPanel textAreaPanel = new JPanel();
		textAreaPanel.setBorder(new EmptyBorder(5,5,5,5));
		textarea = new JTextArea(20, 50);
		JScrollPane scrollPane = new JScrollPane(textarea);
		scrollPane.setSize(450,300);
		textAreaPanel.add(scrollPane);
		panel.add(textAreaPanel);

		this.setContentPane(panel);
		this.pack();
		// ここまでは全部UIのサンプルなので、意味は無い
		// setLocation()はpockの後に書くこと。

		// ここからが該当のコード
		Toolkit toolkit = Toolkit.getDefaultToolkit();
		Dimension screenSize = toolkit.getScreenSize();
		this.setLocation(100, (screenSize.height - this.getHeight()) / 2);

		this.setVisible(true);
	}
}
```

なお、必要なクラスは、

* java.awt.Toolkit
* java.awt.Dimension

の２つである。
ビットあみだくじ

```rb:hena11.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/93cde1a6b7561426a3ac
#http://nabetani.sakura.ne.jp/hena/ord11bitamida/
STDOUT.sync=true
while gets
	# d6-7b-e1-9e =>
	# [{0=>1, 1=>0, 3=>7, 7=>3}, {0=>3, 3=>0, 7=>8, 8=>7}, {1=>5, 5=>1, 6=>8, 8=>6}, {0=>2, 2=>0, 3=>4, 4=>3, 5=>7, 7=>5}]
	a=$_.split('-').map{|e|
		x={}
		l='%08b'%e.to_i(16)+'0'
		i=0
		while i<8
			if l[i,1]=='1'
				j=i+1
				while l[j,1]=='1' do j+=1 end
				x[i]=j;x[j]=i
				i=j
			else
				i+=1
			end
		end
		x
	}.reverse
	puts (0..8).map{|e|a.reduce(e){|s,f|s=f.has_key?(s)?f[s]:s}}*''
end
```
ボールカウント(野球)

```rb:hena3pre.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/ebd8a56b41711ba459f9
#STDOUT.sync=true
def solve(l)
	r=[]
	a=[0,0,0]
	l.chars{|e|
		a[1]+=1 if e=='s'
		a[2]+=1 if e=='b'
		a[1]+=1 if e=='f'&&a[1]<2
		(a[0]+=1;a[1]=a[2]=0) if e=='p'||a[1]>2
		a[1]=a[2]=0 if e=='h'||a[2]>3
		a[0]=a[1]=a[2]=0 if a[0]>2
		r<<a*''
	}
	r*','
end
DATA.each_with_index{|e,i|
	input,expect=e.chomp.split(' -> ')
	puts 'Case '+(i+1).to_s+': '+(expect==solve(input)?'OK':'NG')
}
__END__
s -> 010
sss -> 010,020,100
bbbb -> 001,002,003,000
ssbbbb -> 010,020,021,022,023,000
hsbhfhbh -> 000,010,011,000,010,000,001,000
psbpfpbp -> 100,110,111,200,210,000,001,100
ppp -> 100,200,000
ffffs -> 010,020,020,020,100
ssspfffs -> 010,020,100,200,210,220,220,000
bbbsfbppp -> 001,002,003,013,023,000,100,200,000
sssbbbbsbhsbppp -> 010,020,100,101,102,103,100,110,111,100,110,111,200,000,100
ssffpffssp -> 010,020,020,020,100,110,120,200,210,000
```
サイコロを転がす

```cpp:hena12.cpp
//http://qiita.com/Nabetani/items/f3cca410428f90333e28
//http://nabetani.sakura.ne.jp/hena/ord12rotdice/
#include <iostream>
#include <string>
#include <vector>
using namespace std;

// http://www.prefield.com/algorithm/misc/dice.html
enum FACE { TOP, BOTTOM, FRONT, BACK, LEFT, RIGHT };
class dice {
public:
  dice() {
    id[TOP] = 1; id[FRONT] = 2; id[LEFT] = 3;
    id[RIGHT] = 4; id[BACK] = 5; id[BOTTOM] = 6;
  }
  int& operator[] (FACE f) { return id[f]; }
  const int& operator[] (FACE f) const { return id[f]; }
  bool operator==(const dice &b) const {
    const dice &a = *this;
    return a[TOP] == b[TOP] && a[BOTTOM] == b[BOTTOM] &&
           a[FRONT] == b[FRONT] && a[BACK] == b[BACK] &&
           a[LEFT] == b[LEFT] && a[RIGHT] == b[RIGHT];
  }
  void roll_x() { roll(TOP, BACK, BOTTOM, FRONT); }
  void roll_x2() { roll(TOP, FRONT, BOTTOM, BACK); }
  void roll_y() { roll(TOP, LEFT, BOTTOM, RIGHT); }
  void roll_y2() { roll(TOP, RIGHT, BOTTOM, LEFT); }
  void roll_z() { roll(FRONT, RIGHT, BACK, LEFT); }
  void roll_z2() { roll(FRONT, LEFT, BACK, RIGHT); }
  vector<dice> all_rolls() {
    vector<dice> ret;
    for (int k = 0; k < 6; (k&1?roll_y():roll_x()),++k)
      for (int i = 0; i < 4; roll_z(), ++i)
        ret.push_back(*this);
    return ret;
  }
  bool equivalent_to(const dice& di) {
    for (int k = 0; k < 6; (k&1?roll_y():roll_x()),++k)
      for (int i = 0; i < 4; roll_z(), ++i)
        if (*this == di) return true;
    return false;
  }
private:
  void roll(FACE a, FACE b, FACE c, FACE d) {
    int tmp = id[a];
    id[a] = id[b]; id[b] = id[c];
    id[c] = id[d]; id[d] = tmp;
  }
  int id[6];
};

int main(){
	string line;
	for(;getline(cin,line);){
		dice di;
		cout<<1;
		for(int i=0;i<line.size();cout<<di[TOP],i++){
			if(line[i]=='N')di.roll_x();
			if(line[i]=='E')di.roll_y();
			if(line[i]=='W')di.roll_y2();
			if(line[i]=='S')di.roll_x2();
		}
		cout<<endl<<flush;
	}
}
```
バス代

```rb:hena9.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/84255ac417ef25069a3b
#http://nabetani.sakura.ne.jp/hena/ord9busfare/
STDOUT.sync=true
while gets
	a=$_.chomp.split(':')
	fare=[a[0].to_i]
	fare[1]=(fare[0]/2+9)/10*10
	fare[2]=(fare[1]/2+9)/10*10
	a=a[1].split(',').map{|e|
		if e[0,1]=='A'
			['A',{'n'=>fare[0],'p'=>0,'w'=>fare[1]}[e[1,1]]]
		else
			[e[0,1],{'n'=>fare[1],'p'=>0,'w'=>fare[2]}[e[1,1]]]
		end
	}.group_by{|e|e[0]}
	a.default=[]
	p (a['A'].map(&:last).reduce(:+)||0)+(a['C'].map(&:last).reduce(:+)||0)+(a['I'].map(&:last).sort[0..-1-a['A'].size*2].reduce(:+)||0)
end
```
続柄

```rb:hena6.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/5e1c944541f09f0f9711
#http://nabetani.sakura.ne.jp/hena/ord6kinship/
STDOUT.sync=true
z=0
a={}
4.times{|i|
	(3**i).times{|j|
		a[z+=1]=[i,j]
	}
}
while gets
	n,m=$_.split('->').map{|e|a[e.to_i]}
	if n[0]==m[0]&&n[1]==m[1]
		puts 'me'
	elsif n[0]==m[0]&&n[1]/3==m[1]/3
		puts 'si'
	elsif n[0]==m[0]&&n[1]/3/3==m[1]/3/3
		puts 'co'
	elsif n[0]==m[0]+1&&n[1]/3==m[1]
		puts 'mo'
	elsif n[0]+1==m[0]&&n[1]==m[1]/3
		puts 'da'
	elsif n[0]==m[0]+1&&n[1]/3/3==m[1]/3
		puts 'au'
	elsif n[0]+1==m[0]&&n[1]/3==m[1]/3/3
		puts 'ni'
	else
		puts '-'
	end
end
```
ビットボンバーマン

```rb:hena8.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/709d61dff282cff7a890
#http://nabetani.sakura.ne.jp/hena/ord8biboma/
require 'json'
D=[[-1,0],[1,0],[0,-1],[0,1]]
def dfs(x,y,i)
	if 0<=x&&x<6&&0<=y&&y<5&&$wall[y][x]==0
		$result[y][x]=1
		dfs(x+D[i][0],y+D[i][1],i)
	end
end
STDOUT.sync=true
while gets
	$wall,bomb=$_.split('/').map{|e|sprintf('%032b',e.to_i(16))[0,30].chars.map(&:to_i).each_slice(6).to_a}
	$result=JSON.parse(JSON.generate(bomb)) #deep copy
	bomb.size.times{|y|
		bomb[0].size.times{|x|
			if bomb[y][x]==1
				D.size.times{|i|dfs(x+D[i][0],y+D[i][1],i)}
			end
		}
	}
	puts sprintf('%08x',($result.map(&:join)*''+'00').to_i(2))
end
```
エントロピー符号

```rb:hena8pre.rb
#!/usr/bin/env ruby
#http://qiita.com/Nabetani/items/24b9be4ee3bae4c89a95
#http://nabetani.sakura.ne.jp/hena/ord8entco/
T={
	'000'=>'t',
	'0010'=>'s',
	'0011'=>'n',
	'0100'=>'i',
	'01010'=>'d',
	'0101101'=>'c',
	'010111'=>'l',
	'0110'=>'o',
	'0111'=>'a',
	'10'=>'e',
	'1100'=>'r',
	'1101'=>'h',
	'111'=>:eof,
}

STDOUT.sync=true
def solve(l)
	idx=0
	r=''
	loop{
		s=T.keys.find{|e|l[idx..-1].start_with?(e)}
		return '*invalid*' if !s
		idx+=s.size
		break if T[s]==:eof
		r+=T[s]
	}
	r+':'+idx.to_s
end
while gets
	puts solve($_.chomp.chars.map{|e|('%04b'%e.to_i(16)).reverse}*'')
end
```
Y字路巡り

```rb:hena3.rb
#!/usr/bin/env ruby
#http://nabetani.sakura.ne.jp/hena/ord3ynode/
T={ #clockwise
	'A'=>['D','C','B'],
	'B'=>['E','A','C'],
	'C'=>['F','B','A'],
	'D'=>['A','E','F'],
	'E'=>['B','F','D'],
	'F'=>['C','D','E'],
}
STDOUT.sync=true
while gets
	curr='A';prev='B'
	print 'A'
	$_.chomp.chars{|e|
		if e=='b'
			curr,prev=prev,curr
		elsif e=='r'
			curr,prev=T[curr][(T[curr].index(prev)+2)%3],curr
		elsif e=='l'
			curr,prev=T[curr][(T[curr].index(prev)+1)%3],curr
		end
		print curr
	}
	puts
end
```