OmniAICreator/Qiita-1.07M huggingface dataset:
3DモデルをiOSアプリで動かす【その２】PowerVR Insider SDK

[【その１】3Dモデルのファイルフォーマット](http://qiita.com/shu223/items/9562278980bf71e79a02) からの続きです。

#PowerVR Insider SDK を導入する

前回調べた STL や OBJ を OpenGL で読み込めばいいのかな、ぐらいに思ってたのですが、

> iPhoneで使用される3D APIであるOpenGL ES1.xおよび2.0には標準で3Dモデルを表示するための形式は存在しません。（[iPhoneで3Dモデルを表示する](http://omegapoint.cocolog-nifty.com/blog/2012/04/iphone3d-317c.html)）

だそうです。


で、いろいろ見てると、 **iOS に 3Dモデルファイルをインポートする形式としては、 PowerVR POD （拡張子 .pod） という形式が一般的** っぽいです。

**iOS デバイスの GPU チップサプライヤーである Imagination Technologies 社によるファイルフォーマット** だとか。

参考：[Cocos3D Importing: Generating POD Files](http://brenwill.com/2011/cocos3d-importing-converting-collada-to-pod/)


この **PODファイルへの変換を行うユーティリティ** や、 **iOSアプリ用に POD ファイルを読み込むライブラリ** は、PowerVR 社の **"PowerVR Insider SDK"** に入っているようです。


というわけでまずはそのSDKのインストールから。


##SDKのインストール

インストーラをダウンロードします（要登録）。

[PowerVR Insider SDK Downloads - Imagination Technologies](http://www.imgtec.com/powerVR/insider/sdkdownloads/index.asp)

利用環境を選ぶところがありますが、iOS以外にも適当にチェックマークつけると、ダウンロード量が莫大になってしまったのでご注意ください。


##サンプルを試してみる

インストール完了すると、

```
/Users/Shared/Imagination/PowerVR
```

にフォルダがつくられていて、たどっていくと Examples というフォルダがあります。

OGLES2IntroducingPOD というサンプルのプロジェクトをビルドして実行すると、

![podexample.jpg](https://qiita-image-store.s3.amazonaws.com/0/3180/bff85239-015b-faa4-dc4c-b3128c6732bb.jpeg)

こんな感じで podファイルが iOS 上で描画されることを確認できます。


#POD形式への変換

##STL / OBJ から COLLADA 形式へ変換する

POD形式へは、SDKに付属している PVRGeoPOD というユーティリティで変換できるのですが、入力ファイルが COLLADA (拡張子 .dae) 形式である必要があります。
 
STL や OBJ から COLLADA への変換は、上でビューワーソフトとして紹介した MeshLab で可能です。

[File] > [Export Mesh As] で ファイルタイプとして Collada を選択するだけです。

![export_collada.jpg](https://qiita-image-store.s3.amazonaws.com/0/3180/154a6eb6-26f9-ef3a-89c6-d1b35fad9bae.jpeg)


##PODファイルを生成する

前述した PVRGeoPOD は Blender, 3D Max, Maya 等、各種3Dソフトのプラグインとして提供されているのですが、 PowerVR SDK に Mac アプリ版も同梱されています。

```
/Applications/Imagination/PowerVR/GraphicsSDK/PVRGeoPOD/GUI/OSX_x86
```

にある PVRGeoPODGUI.app というやつです。


これで xxx.dae を open して export するだけなんですが、 COLLADAファイルがでかいと、 **Final Export Stage でメッチャ時間かかります** 。。


##PODファイルを iOS アプリ内で表示してみる

OGLES2IntroducingPOD サンプルのプロジェクトに生成した .pod ファイルを追加し、OGLES2IntroducingPOD.cpp の定数定義を書き換えます。

```
// POD scene files
//const char c_szSceneFile[]			= "Scene.pod";
const char c_szSceneFile[]			= "xxxx.pod";
```

ビルドして実行すると、無事表示され・・・ません。実行時にカメラがないとかライトがないとか、 **あれやこれやエラー** が出ました。


この修正は OpenGL ES の知識が必要そうなので、cocos3d 使った方が手っ取り早そう、と思い cocos3d をダウンロードしてみたりしましたが、こっちはこっちで cocos2d とのバージョンが云々で example プロジェクトのビルドがすんなりいかず。

cocos3dはドキュメントもしっかりメンテされてるしいろいろと情報も出そろっているので何とかなると思いますが、なんかもっと stable で使いやすい（導入しやすい）描画ライブラリがある気がするので、これ以上踏み込まず、今回の勉強はここまでにしておきます。

（またつづきに手をつけたら更新します）


#自分のアプリに POD 描画ライブラリを導入する

OGLES2IntroducingPOD サンプルと同様に、 OGLE2Tools.xcodeproj ごとプロジェクトに追加して、サンプルのデモ本体である OGLES2IntroducingPOD.cpp を参考にして実装すればいいんじゃないかと思うのですが、自分では試していません。

下記記事ではそんな感じでうまくいったとのことです。

- [３Dモデル（.POD）の読み込みと描画 - 大人になりたくない](http://yhy.hatenablog.com/entry/2013/08/21/235336)

また、GitHub にもいくつか OGLE2Tools を使用したプロジェクトがありました。

（こちらも自分でやってみたらまた更新したいと思います）
穴を空ける for チュートリアル


チュートリアル用にこんな感じで、特定のスポットに穴を空けて表示したい。

![Screenshot](https://qiita-image-store.s3.amazonaws.com/0/6527/d3b9ff7a-5e10-ea78-a332-0f3814f6ed70.png "iOS Simulator Screen shot Apr 29, 2014, 16.25.10.png")


### 利用する側

穴を空ける場所と、穴の大きさを指定して使うようにしたい。

```objc:
-(void) viewDidAppear:(BOOL)animated {
	[super viewDidAppear:animated];

	// 初回ヘルプ表示
	SpotHelpView *spotHelpView = [[SpotHelpView alloc] initWithFrame:self.view.window.bounds];
	[spotHelpView makeHoleAt:CGPointMake(290, 45) radius:30];
	[self.view.window addSubview:spotHelpView];
}
```

### ビューの定義

```objc:
@interface SpotHelpView : UIView

-(void) makeHoleAt:(CGPoint)point radius:(CGFloat)radius;

@end
```

### ビューの実装

```objc:
@implementation SpotHelpView

-(id) initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
		self.backgroundColor = [UIColor blackColor];
		self.alpha = 0.5;
    }
    return self;
}

-(void) makeHoleAt:(CGPoint)point radius:(CGFloat)radius {
	CAShapeLayer *mask = [[CAShapeLayer alloc] init];
	mask.fillRule = kCAFillRuleEvenOdd;
	mask.fillColor = [UIColor blackColor].CGColor;

	// 画面全体
	UIBezierPath *maskPath = [UIBezierPath bezierPathWithRect:self.bounds];
	// 穴を空ける
	[maskPath moveToPoint:point];
	[maskPath addArcWithCenter:point radius:radius startAngle:0 endAngle:2 * M_PI clockwise:YES];
	
	mask.path = maskPath.CGPath;
	self.layer.mask = mask;
}

@end
```
シェル操作課題をawkで解く


awkの勉強をしていると、[シェル操作課題 (cut, sort, uniq などで集計を行う) 設問編](http://d.hatena.ne.jp/Yamashiro0217/20120727/1343371036)を見つけたので出来るだけawkを使って解いてみた。

###問題ファイル

```sample
server1,1343363124,30,/video.php
server2,1343363110,20,/profile.php
server3,1343363115,7,/login.php
server1,1343363105,8,/profile.php
server2,1343363205,35,/profile.php
server2,1343363110,20,/profile.php
server3,1343363205,30,/login.php
server4,1343363225,12,/video.php
server1,1343363265,7,/video.php
```


###問1 このファイルを表示しろ

```
想定期待結果:
ファイル全体の表示
```

```awk
$ awk '{print}' sample
```


###問2 このファイルからサーバー名とアクセス先だけ表示しろ

```
想定期待結果:
server1,/video.php 
server2,/profile.php
server2,/login.php  
server1,/profile.php 
server2,/profile.php 
server2,/profile.php
server3,/login.php 
server4,/video.php 
server1,/video.php 
```

```awk
$ awk -F '[,]' '{print $1, $4}' sample
```


###問3 このファイルからserver4の行だけ表示しろ

```
想定期待結果:
server4,1343363225,12,/video.php 
```

```awk
$ awk '/server4/' sample
```

###問4 このファイルの行数を表示しろ

```
想定期待結果:
9
```

```awk
$ awk '{print}' sample | wc -l
```

###問5 このファイルをサーバー名、ユーザーIDの昇順で5行だけ表示しろ

```
想定期待結果:
server1,1343363265,7,/video.php
server1,1343363105,8,/profile.php
server1,1343363124,30,/video.php
server2,1343363110,20,/profile.php
server2,1343363110,20,/profile.php
```

```awk
$ sort -k1,1 -k3,3n -t"," sample | awk 'NR<6'
```



###問6 このファイルには重複行がある。重複行はまとめて数え行数を表示しろ
```
想定期待結果：
8

補足：
hoge,30
foo,20
hoge,30 
だったら２行と数える。
```

```awk
$ awk '{a[$0]=$0} END {print length(a)}' sample
```


###問7 このログのUU(ユニークユーザー)数を表示しろ
想定期待結果：	6

```awk
$ awk -F'[,]' '{print $3}' sample | sort | uniq | wc -l

$ awk -F'[,]' '{print $3}' sample | awk '{a[$0] = $0} END {print length(a)}'
```


###問8 このログのアクセス先ごとにアクセス数を数え上位1つを表示しろ

想定期待結果： 4 /profile.php 

```awk
$ awk -F'[,]' '{print $4}' sample | sort | uniq -c | sort -rn | head -1
```


###問9 このログのserverという文字列をxxxという文字列に変え、サーバー毎のアクセス数を表示しろ
```
想定期待結果：
3 xxx1
3 xxx2
2 xxx3
1 xxx4
```

```awk
$ awk -F'[,]' '{print $1}' sample | awk 'sub(/server/,"xxx")' | sort | uniq -c
```

###問10 このログのユーザーIDが10以上の人のユニークなユーザーIDをユーザーIDでソートして表示しろ

```
想定期待結果:
12
20
30
35
```
```awk
$ awk -F'[,]' '{print $3}' sample | awk '$0>10 {print}' | sort | uniq
```
ターミナルで Gif アニメーションを表示する

こちらの記事を参考にさせて頂きました。ありがとうございます。カレンちゃん可愛い！
> [ターミナルに画像を表示する](http://qiita.com/woxtu/items/f049bf5f89003fb52fdd)

そのソースコードを元に、Gif アニメーションも表示できるように拡張してみました。

```ruby
#!/usr/bin/env ruby

require 'curses'
require 'rmagick'

DOT_CHAR = "  "
IMAGE_PATH = ARGV[0]
INTERVAL = ARGV[1] ? ARGV[1].to_f : nil

def pixel2color_text(pixel)
  color = [pixel.red, pixel.green, pixel.blue].map { |n| (n * 5) / (255 * 255) }
  "\x1b[48;5;#{16 + color[0] * 36 + color[1] * 6 + color[2]}m#{DOT_CHAR}\x1b[0m"
end

def screen_columns
  Curses.init_screen
  columns = Curses.cols / 2
  Curses.close_screen
  columns
end

def draw(image)
  image = image.sample((1.0 * screen_columns) / image.columns)
  rows = (0...image.rows).map do |row|
    pixels = image.get_pixels(0, row, image.columns, 1)
    pixels.map { |pixel| pixel2color_text(pixel) }.join
  end
  picture = rows.join("\n")

  puts picture
end

def animate(image_path)
  image_list = Magick::ImageList.new(image_path)
  # (ImageList#delay から算出した) デフォルトの interval 値でアニメがもっさりする場合は
  # INTERVAL の値を 0.1 などに弄ってみてください。
  interval = INTERVAL || ((1.0 * image_list.delay) / 100)

  image_list.each do |image|
    draw(image)
    sleep(interval)
  end
end

def clear_screen
  puts "\e[H\e[2J"
end

def main
  interrupted = false
  Signal.trap(:INT) { interrupted = true }

  # Ctrl + C で終了します。
  # ※ ただし、現在のアニメーションが最後のコマまで再生されるまでは終了できません。
  until interrupted do
    animate(IMAGE_PATH)
  end

  clear_screen
end

main
```

### デモ

![スクリーンショット](http://gifzo.net/BWheDh6IXFX.gif)

楽しい！ ✌(’ω’✌ )三✌(’ω’)✌三( ✌’ω’)✌
nodebrewを使ってNode.js+expressを入れてみた


ほぼ[Node.js超入門](http://qiita.com/takeharu/items/e273313e228abde889bc)に書かれている通り。

node.jsのバージョン管理ツールnodebrewを入れる。

```bash
$ curl -L git.io/nodebrew | perl - setup
```

nodebrewを使ってstableなnode.jsを入れる。

```bash
$ nodebrew ls-remote
...
$ nodebrew install v0.10.25
$ nodebrew use v0.10.25
```

npmでexpressを入れる。
expressコマンドを使うためにはexpress-generatorを入れないといけないらしい。

```bash
$ npm install express -g
$ npm install express-generator -g
```

パス追加

```Bash:.zshrc
export PATH="$HOME/.nodebrew/current/bin:$PATH"
```

テストアプリ作成+実行まで

```Bash
$ express TestApp
   create : TestApp
   create : TestApp/package.json
   create : TestApp/app.js
   create : TestApp/public
   create : TestApp/public/images
   create : TestApp/public/stylesheets
   create : TestApp/public/stylesheets/style.css
   create : TestApp/routes
   create : TestApp/routes/index.js
   create : TestApp/routes/users.js
   create : TestApp/public/javascripts
   create : TestApp/views
   create : TestApp/views/index.jade
   create : TestApp/views/layout.jade
   create : TestApp/views/error.jade
   create : TestApp/bin
   create : TestApp/bin/www

   install dependencies:
     $ cd TestApp && npm install

   run the app:
     $ DEBUG=my-application ./bin/www
```

デフォルトポートは3000番
[localhost:3000](localhost:3000)
AngularJSアプリをRailsのApplication Templateで試作


フロント開発のツールが整ってきていますが。

AngularJSはController,Filter,Directive,Serviceなどなど構成要素が多いため、
by handでちまちまファイルを用意するのが面倒。なので、yeomanとかangular seedとか
簡単にベストプラクティスに沿った構成を生成できる手段がいくつか存在しています。

ただ、簡単な実験ならクライアントで完結可能ですが、
API（=サーバーサイドのコード）が必要になるので、
RailsのApplication Templateで雛形をセットアップした方が結局楽なんじゃねと思ってました。

実際にyeomanを使ってプロトタイピングをしてみたものの、
無理してこれを使う意味が見いだせず。
（もちろんRailsを使わないなら話は別です）

という背景で試作したのがコレです。
狙いは、サクッとAngularAppを動かせて、
あわよくばherokuに上げてプロトタイピングやプロダクションユースに使えること。
https://github.com/konpyu/rails-application-template


構成要素は
- herokuにhostします
- htmlはhamlで書きます
- cssはsassで書きます
- jsはcoffeescriptで書きます
- sprocketでconcat & minify (dev環境では無効)
- APIはgrapeを使います
- JSONテンプレートはjbuilderを使います（grape-jbuilderを利用）
- jsの外部ライブラリの管理はbower-rails


以下をプラスするのも推奨
- capybaraでE2Eテスト
- newrelic in heroku



状況次第でニーズは違うと思いますが、ミニマムな構成例だと思います
参考にしていただければ

Application Templateについてはtachibaさんの記事が参考になります
http://qiita.com/tachiba/items/26b2e9dc271bd8e6907d
ロジスティック分布をPythonで

numpyを使ってロジスティック分布を書いてみました。


```py
import numpy as np
from  matplotlib import pyplot as plt

sigma = 1.0
mu = 0

x = np.arange(-5., 5., 0.001)
y = np.exp(-(x-mu)/sigma) / (sigma*(1+np.exp(-(x-mu)/sigma))**2)
    plt.plot(x, y)

plt.show()
```

こんな感じ。
![logistics.png](https://qiita-image-store.s3.amazonaws.com/0/16434/88e0cb3e-b745-89ed-4bc4-ecfd6034dd42.png)

累積分布も

```py
import numpy as np
from matplotlib import pyplot as plt

sigma = 1.0
mu = 0

x = np.arange(-5., 5., 0.001)
y = 1. /(1 + (np.exp(-(x-mu)/sigma)))
plt.plot(x, y)

plt.show()

```

![ロジスティック累積.png](https://qiita-image-store.s3.amazonaws.com/0/16434/8bd8bf3b-3e9d-bdb1-d325-423072d4f8ca.png)

## 参考文献

[numpy+matplotlibで正規分布 - Soleil cou coupé](http://d.hatena.ne.jp/xef/20120315/1331829958)
[ロジスティック分布 - Wikipedia](http://ja.wikipedia.org/wiki/%E3%83%AD%E3%82%B8%E3%82%B9%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E5%88%86%E5%B8%83)
Raspberry Piのセットアップ

Raspberry Piを買ったのでセットアップ方法をまとめてみます。
今後環境を再構築することもありそうですしね。

![raspberry-pi.jpg](https://qiita-image-store.s3.amazonaws.com/0/39729/d88d04c7-d1aa-6f65-b078-d0aa40f0a959.jpeg)

# 用意したもの
今回購入したのは次の4つです。

* Raspberry Pi Type B
* Raspberry Pi用のカメラモジュール
* SDカード
* 無線LANアダプタ

その他に家にあった、

* マイクロUSBコード
* USB充電器
* LANケーブル
* ノートPC（SDカードへの書き込み用）

を用意しました。

USB充電器はタブレット用のもので1Aくらい流せるやつです。

Raspberry Piのセットアップ方法を書いたサイトをみるとHDMIケーブルやキーボードとかを使ってセットアップしてますが、今回はそれができなかった（後述）ので、SSHログインしてセットアップします。

そういう訳でLANケーブルも用意しました。

# SDカード作成
以下のサイトを参考にしました。

[Raspberry Pi初心者のためのOS別セットアップガイド](http://www.lifehacker.jp/2013/02/130226raspberry_pi_guide.html)

## Raspberry Pi用のOSイメージのダウンロード
上の記事に従って以下からOSイメージをダウンロードします。

[Downloads | Raspberry Pi](http://www.raspberrypi.org/downloads/)

今回はRaspbianのZIPファイルをダウンロードしました。

私の時だけかもしれないですけど、ダウンロード速度が200kbpsくらいしかでなくて半日くらいかかりました。
あらかじめ寝る前などにダウンロードを始めておくことをお勧めします。

## Win32DiskImagerのインストール
Win32DiskImagerは以下からダウンロードしてインストールします。

[Win32 Disk Imager -  Browse /Archive at SourceForge.net](http://sourceforge.net/projects/win32diskimager/files/Archive/)

## SDカードへのOSイメージの書き込み
上のセットアップガイドの通りにSDカードにRaspbianのOSイメージを書き込みます。

# Raspberry Piのセットアップ
上のセットアップガイドに従ってHDMIとキーボードを接続したところ、Raspberry Piを起動しても画面が映らない現象が起きました。
原因不明ですが、HDMIセレクターを通した上にDVIに変換してディスプレイに接続していたのがまずかったのかもしれません。

なので以下のサイトを参考にSSHでログインしてセットアップしました。

[Raspberry PiをUSBキーボードもディスプレイも使わずにセットアップする方法 | blog.nambo.jp](http://blog.nambo.jp/2013/07/23/raspberrypi-mac-osx/)
[Raspberry Piの初期設定方法 | blog.nambo.jp](http://blog.nambo.jp/2013/07/24/raspberrypi-first-setting/)

# 無線LANのセットアップ
無線LANのセットアップ方法は以下のサイトを参考にしました。

[Raspberry Pi 無線 LAN 設定おぼえ書き | Ag Blog](http://ag.hatenablog.com/entry/2014/01/13/182102)

上記サイトに加えていくつか設定を追加します。
まず、WPA2-PSK/AESの場合はさらにwpa-supplicant.confに以下の設定を追加します。

    ...
    network={
        ...
        # 追加
        key_mgmt=WPA-PSK
    }

次に、Raspberry Piを長時間放置しておくと無線LANアダプタがスリープモードになってしまい、外部からSSHで接続できなくなりますので、それを防止するために/etc/network/interfacesに以下の設定を追加します。

    ...
    allow-hotplug wlan0
    wireless-power off # 追加
    ...

これで完了です。
無線LANを使うと電源ケーブルしかケーブルがないのですっきりします。

![rasp-wifi.jpg](https://qiita-image-store.s3.amazonaws.com/0/39729/8fefdf6e-3e6b-4291-2751-f9627be951ed.jpeg)

# まとめ
これでRaspberry Piのセットアップができました。

Raspberry Piが登場してからだいぶ時間が経ってるので、情報がたくさんあってだいぶ楽でした。ありがたいです。

カメラについては開発環境を整えてからセットアップする予定です。
objective-c クラス 理解のためのメモ


## 参考資料

[クラスの定義](http://www.objectivec-iphone.com/introduction/method/class.html)  
[Objective-Cのクラス定義を理解しよう](http://www.atmarkit.co.jp/ait/articles/0811/10/news108.html)  
[Objective-Cのクラスやプロパティ、特徴的なメソッドの使い方](http://www.atmarkit.co.jp/ait/articles/1404/09/news029.html)  


## objective-c の歴史
```
c  +--- c++
   +-- objective-c --- objective-c++

NextStep - OpenStep - MacOS X なので、 NSXXX というクラス名が多い。

xcode
  LLVM と clang（くらん）
  LLVM と gcc
  clang はフロントエンド

objective-c -(frontend)- LLVM IR -(backend)- ARM | x86 etc 

clang は c, c++, objective-c, objective-c++ をサポート。
clang はオープンソース
clang は dylib だけど、gcc はコマンドラインで対話するので、clang は詳細な情報を提供できる。

```

## クラス理解のステップ

* 基底クラス NSObject（ 例外：NSProxy ）
* デフォルトは @protected
* メソッドのインターフェースは h に @interface / @end
* メソッド 定義は m に @implementation /@end  
    \+ クラスメソッド  
    \- インスタンスメソッド  
    \- (戻り値型)メソッド名  
    \- (戻り値型)メソッド名:(引数型)引数1　ラベル:(引数型)引数2  
    \+ alloc  はメモリ確保とゼロ初期化  
    \- init  はそれ以外の初期化（通常これを再定義する）  
   引数を持つメソッドのサフィックスは引数のラベルにするのが慣例
* クラスメンバ変数や多重継承はない。
* 利用側では #import 。多重定義を防ぐ仕組みが入っている。
* メソッド利用

```objectivec
// オブジェクト型はポインタ表現。
// ARCで参照カウンタ式の自動リリース機構が機能するようになったため、明示的な破棄をしなくてもよい。
//（ARC だと retain, release などを使用しない）
Animal*		p1 = [[Animal alloc] init];
Animal*		p2 = [Animal new];

[p1 setAge:1 withName:@"はなこ"];
```


* プロパティ @property
  - settter/getter の自動生成。
  - xxx だと setXxx が setter, xxx が getter
  - _xxx  という名前のメンバ変数（実体）が作られる

* 非公開メソッドやメンバはこう書こう

```objectivec
     // 無名カテゴリによるクラスエクステンションを使った非公開メンバ変数とメンバ関数
    // .m の先頭に interface を書く。
    @interface MyClass () {  
        int _hoge; // 属性は _ で始めると統一感がある。 
    }
 
    - (void)innerMethod; // というかプロトタイプ宣言自体が省略可能なので、これも省略していい。
    @end
```
* C++ では 0 とか NULL でポインタを初期化、objective-c では nil。 



```objectivec
     // プリミティブな型
    NSInteger		age = 0;
    // オブジェクト型はポインタで表現する
    NSString*		name = @"HogeHoge";   // オブジェクトリテラル
    NSString*		name = [[NSString alloc] init];  // 前からの記法   
    NSString*		name = [NSString new];  // 新しい記法   
```


## tips ( xcode5 なら Ctrl + 6 でメソッド一覧 )
* #pragma mark -
* #pragma mark コメント
* // MARK: マークの説明
* // TODO: タスク内容
* // FIXME: 要修正の内容
* // !!!: 要注意の内容
* // ???: 疑問点
* #warning コメント
* #error コメント
新卒研修に参加してICPCの問題を解いてみた

(個人の日記です)

[Wantedlyエンジニア新人研修（コーディング）](http://qiita.com/awakia/items/913cdcdd5fdd90e4584f)の一貫で、新卒エンジニアがICPCの問題に取り組んでいたので、1問だけ一緒に解いてみました。

解いた問題は[Hierarchical Democracy](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1188&lang=jp)というやつ。


```rb
def s z;z.is_a?(Array)?z.map{|z|s z}.sort[0..z.size/2].reduce(:+):z/2+1;end;gets;$<.map{|l|p s(eval(l.gsub'][','],['))}
```

120Bでした。

`is_a?(Array)`のあたりなどもっと短くかけるイディオムがありそう。

はじめてCode Golf的なものをやったので、[るびまゴルフ](http://magazine.rubyist.net/?0021-RubiMaGolf)の連載記事なんかを読みながらやってました。今回使った`$<`みたいなやつは[Kernel moduleのドキュメント](http://docs.ruby-lang.org/ja/2.1.0/class/Kernel.html)を読むと調べられます。

Rubyって難しいですね。
試行錯誤による解の探索（ブラインド探索）

#解法の確立とは
例えば、二次方程式は

```math
x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}
```

のa,b,cに代入することで解を得ることができます。このように単純作業で解を得ることができる問題を、 **解法が確立している** と言います。
解法が確立していない問題の例として、

* 迷路
* パズル
* ゲーム

などがあります。
このような解法が確立されていない問題を解くには試行錯誤する必要があります。
今回はこのなかで、迷路を解く解法について説明します。

#迷路の定義
迷路のいくつかの要素をまとめます。
迷路にはスタートとゴールがあります。
その途中に、節点（分かれ道）、行き止まり節点（行き止まり）があります。これはグラフを使って表すことができます。

#ブラインド探索
**こっちのほうがゴールに近そう** とかそういうことを考えずに（知識に頼らずに）闇雲に探索する方法をブラインド探索と言います。

今回は、ブラインド探索のうち **深さ優先探索** （depth-first search）と **広さ優先探索** （breadth-first search）について説明します。

## 深さ優先探索
行き止まりまで探索し、ゴールが見つからなかったら戻って別の道を進む方法です。
LIFO（後入れ先出し）を使って実現することができます。

###長所と短所
####長所
* わかりやすい
* メモリ使用量が小さい 探索の深さに比例

####短所
* ゴールが近くにあるのに他の深い道に入ってしまうと時間がかかる

##広さ優先探索
同じ深さの分かれ道をそれぞれ探し、ゴールが見つからなかったら次の深さの分かれ道を探す方法です。
**分かれ道で影分身して並行して進んでいく** みたいなイメージがあります。
これも、LIFOを使って実現可能です。
###長所と短所
####長所
* 経路が最短となる解を見つけることができる
* 分散処理に強い

####短所
* 解が深いと処理時間が増える
* メモリ使用量が大きい　探索の深さに指数的

#ヒューリスティック探索
長くなったので実装はまた別にまとめます。
【MySQL】日時の計算（加算・減算）



例：

```sql
"SELECT count(id) as cnt FROM table  
WHERE (date > (NOW() - INTERVAL 60 SECOND)",
```

上記SQLは、dateカラムにある値が、現在時刻から60秒前以降の値のidの数を数えるものです。

INTERVALの前にマイナス-・プラス+記号をつけることで、減算・加算ができます。

+(-) INTERVAL 数値　単位　という構文になります。


単位は、

MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH

など
Python で Qiita のAPIの認証コードを取得してみた。



Python 初心者がQiita.comの認証トークンを取得してみる。


    #!C:/Python27/
    # -*- coding:utf-8 -*-
    import urllib
    import urllib2
    import cookielib
    import json
    # http is urllib2.HTTPHandler(debuglevel=1)
    opener = urllib2.build_opener(urllib2.HTTPSHandler(debuglevel=1),                                   urllib2.HTTPCookieProcessor(cookielib.CookieJar()))
    urllib2.install_opener(opener) 

    def get_token() :
        name = 'user_name'
        passwd = '**********'
        url = 'https://qiita.com/api/v1/auth'
        login_post = {'url_name':name,'password':passwd}
        param = urllib.urlencode(login_post)

        req = urllib2.Request(url,param)
        res = urllib2.urlopen(req)
        token = json.loads(res.read())
        return token['token']    
'
Ruby　アルゴリ計算

##エラトステネスの篩

```hello.rb
def eratosthenes(n)
  numbers = (0..n).to_a
  numbers[0],numbers[1] = nil
  numbers.each do |d|
    next if d == nil
    break if (Math.sqrt(n) < d)
    (2*d..n).step(d){|e| numbers[e] = nil}
  end
  numbers.compact!
  return numbers
end

p eratosthenes(100)

=> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

```

##１から９までの九九を計算する

```hello.rb

[*1..9].each do |abc|
  [*1..9].each do |f|
    printf("%3d", abc * f)
  end
  print "\n"
end
 =>
  1  2  3  4  5  6  7  8  9
  2  4  6  8 10 12 14 16 18
  3  6  9 12 15 18 21 24 27
  4  8 12 16 20 24 28 32 36
  5 10 15 20 25 30 35 40 45
  6 12 18 24 30 36 42 48 54
  7 14 21 28 35 42 49 56 63
  8 16 24 32 40 48 56 64 72
  9 18 27 36 45 54 63 72 81
```

##ジャンケンを実装する

```hello.rb
def jankenn
  janken = { グー: 0, パー: 1, チョキ: 2 }
  puts("ジャンケン！！！")
  n = gets.chomp
  puts "わたし： #{n}！！！"
  m = janken.key(rand(3)).to_s
  puts "相手： #{m}！！！"

  if %w(グー チョキ パー).any?{ |abc| abc == n }
    if n == m
      puts "引き分け"
    elsif n == "グー" && m == "チョキ"
      puts "あなたの勝ち"
    elsif n == "チョキ" && m == "パー"
      puts "あなたの勝ち"
    elsif n == "パー" && m == "グー"
      puts "あなたの勝ち"
    else
      puts "あなたの負け"
    end
  else
    "グー・チョキ・パーのいずれかを入力して下さい！"
  end
end

```

##好きな倍数を作る

```hello.rb

def input_of_multiple
    puts "数値は１から始まります"
    puts "数値の終わりの範囲を入力して下さい"
    range = gets.chomp.to_i
    if range == 0
      raise "正の整数を入力してください"
    end
    puts "倍数を入力し下さい"
    x = gets.chomp.to_i
    if x == 0
      raise "正の整数を入力してください"
    end

  arr = []
  ->(range, x){
    (1..range).each do |abc|
      arr << abc if abc % x == 0
    end
  }.call(range, x)
  print arr
end

```

##素因数分解

```hello.rb
class Integer
  def prime_factors(n=self)
    list = []
    k = 2
    while n != 1
      if n % k == 0
        list.push(k)
        n = n / k
      else
        k = k + 1
      end
    end
    return list
  end
end

p 100.prime_factors
=> [2, 2, 5, 5]
```
PHPのstrtotime()で第１・第３月曜日みたいなのを表現する

first day of +1 monthみたいな書き方ができて便利なstrtotime()ですが、[www.php.net](http://www.php.net/manual/ja/function.strtotime.php)には簡単なサンプルしか書かれてなかったので、ヤマカンで試してみました。

```php
date_default_timezone_set("Asia/Tokyo");
$now = time();

$start = strtotime('+3 day',$now);
$end = strtotime('+4 day',$start);
echo date('Y-m-d',$start)." ".date('Y-m-d',$end)."<br />\n";

$start = strtotime('next Monday',$now);
$end = strtotime('next Friday',$start);
echo date('Y-m-d',$start)." ".date('Y-m-d',$end)."<br />\n";

$start = strtotime('first day of +1 month',$now);
$end = strtotime('+10 day',$start);
echo date('Y-m-d',$start)." ".date('Y-m-d',$end)."<br />\n";

$start = strtotime('first Monday of +1 month',$now);
$end = strtotime('+10 day',$start);
echo date('Y-m-d',$start)." ".date('Y-m-d',$end)."<br />\n";

$start = strtotime('second Tuesday of +1 month',$now);
$end = strtotime('+10 day',$start);
echo date('Y-m-d',$start)." ".date('Y-m-d',$end)."<br />\n";

$start = strtotime('third Wednesday of +1 month',$now);
$end = strtotime('+10 day',$start);
echo date('Y-m-d',$start)." ".date('Y-m-d',$end)."<br />\n";

$start = strtotime('fourth Thursday of +1 month',$now);
$end = strtotime('+10 day',$start);
echo date('Y-m-d',$start)." ".date('Y-m-d',$end)."<br />\n";
```
HomeBrew で Mac に Docker を入れてみた



> boot2docker を使う方法は既に古く、公式どおり Docker Toolbox をインストールする方が良いです。
> [https://www.docker.com/products/docker-toolbox](https://www.docker.com/products/docker-toolbox)
>
> 因みに、近い将来リリースされる予定の Docker for mac で、更に手順が変わる事になります。
> [https://blog.docker.com/2016/03/docker-for-mac-windows-beta/](https://blog.docker.com/2016/03/docker-for-mac-windows-beta/)

少し前にDockerでMacがサポートされて、homebrewでインストール出来るようになったと聞いて。取り敢えず触ってみたメモ書きです。詳しい説明はしませんし出来ません。なるべくシンプルに行ったことを書きます。

環境は Mac OS X 10.9.2 (Marvericks) + Homebrew 0.9.5 + VirtualBox 4.3.6です。

# homebrew で boot2docker をインスコ

boot2docker をインストールする。

```
brew update

brew tap homebrew/binary
brew install docker boot2docker
```

# boot2docker-vmの準備

Macでdockerするために必要ななにか。

```
boot2docker init

boot2docker up

boot2docker ssh
```
最後のssh接続は特に不要ですが動作確認として。
パスワードはtcuserで入れます。
特にやることないのですぐにexitします。

# dockerコマンドの確認

ちゃんと動くか確認です。

```
export DOCKER_HOST=tcp://localhost:4243

docker version
```

私の環境ではこんな感じの表示になります。

> Client version: 0.10.0
> Client API version: 1.10
> Go version (client): go1.2.1
> Git commit (client): dc9c28f
> Server version: 0.10.0
> Server API version: 1.10
> Git commit (server): dc9c28f
> Go version (server): go1.2.1
> Last stable version: 0.10.0


# コンテナを入れたり上げたり消したり

取り敢えず覚えておくことはこの3つです。

```
コンテナのインストール
docker pull ubuntu

コンテナの起動
docker run -i -t ubuntu /bin/bash

コンテナの削除
docker ps -a -q
docker rm `docker ps -a -q`
```

# CentOSも入れてみる

私は主にサーバサイドの構築でCentOSやAmazon Linuxを触る事が多いので、centosを入れてみます。実は docker pull は省略しても勝手にpullされます。


```
docker run -i -t centos /bin/bash
```


# 参考にさせて頂いたサイト

[dockerが正式サポートしたOS Xの環境を構築してみた！ | Act as Professional - hiroki.jp](http://hiroki.jp/docker-on-osx)

[boot2dockerでdockerを試す - @znz blog](http://blog.n-z.jp/blog/2014-02-23-boot2docker.html)
Corkscrewを使ってHTTP経由でSSHのトンネリング接続を行う

httpのproxyしか通らない環境下でsshしたいときはcorkskrewをいれる。

```
# brew install corkscrew
```

## 認証用の設定
proxy接続時に認証が必要な場合は認証用の設定を書いておく。

```~/.ssh/proxyauth
username:password
```

ローカルに対してssh接続するとき以外はすべてトンネリングするように設定する。

```.ssh/config
Host *
  ProxyCommand /usr/local/bin/corkscrew 接続先のホスト 接続先のポート %h %p ~/.ssh/proxyauth

Host localhost 127.0.0.1
  ProxyCommand none
```
Sinatraを動かすまで

個人的なメモなので今更でも、適当でもいいのだと言い訳してみる。
今回は本当に基礎的な部分に関してだけまとめる。

#環境
以下の環境で行った。

| 開発環境 | バージョン |
|:------:|:---------:|
|MacBook|10.9|
|rbenv|rbenv 0.4.0|
|rubygems|2.2.2|
|Bundler |version 1.5.3|
|ruby|2.1.1p76|

環境の準備に関しては、別途用意する。

#sinatraの準備
適当なフォルダ内で以下のコマンドを打つ。

```
bundle init
```

するとGemfileが生成される。
ディレクトリ構造は下のようになる。
.
└── Gemfile

Gemfileを開き以下のように編集する。

```
source "http://rubygems.org"

gem "sinatra"
```

その後以下のコマンドを打つ。

```
bundle install --path vendor/bundle
```

optionでpathを指定している理由は、システムにインストールし過ぎるとgemがカオスになるらしく、bundlerの推奨環境としてvender/bundle以下に個別に管理するようにしたほうが良いらしい。

コマンドを打った後のディレクトリ構造は以下のようになる。

.
├── Gemfile
├── Gemfile.lock
└── vendor

#sinatraの起動

インストールが終わったら起動用のスクリプトを配置する。
名前はapp.rbを使う。

今回は起動をするだけなので中身はいたってシンプル。

```
require 'sinatra'
```
これだけ。

用意が終わったら下のコマンドで起動してみる。

```
bundle exec ruby app.rb
```
すると
![スクリーンショット 2014-04-29 11.29.22.png](https://qiita-image-store.s3.amazonaws.com/0/12680/7b3a0650-ff49-18a5-165e-ad37d4d891df.png "スクリーンショット 2014-04-29 11.29.22.png")
のように表示がされるので、適当なブラウザで開いてみると
![スクリーンショット 2014-04-29 11.30.25.png](https://qiita-image-store.s3.amazonaws.com/0/12680/f1a43fa3-cd13-9458-b6b8-981b9bd847be.png "スクリーンショット 2014-04-29 11.30.25.png")
このように表示される。

今回はapp.rbの中で"/"に対してアクセスが有った時に何も指定をしていないのでこのようなエラー画面が表示された。

#感想

bundle installで毎度毎度pathの指定を忘れて、システムのgemにインストールしてしまって慌てるのは僕だけじゃないはず。
なんか楽な方法はないのかな？

bundle exec ruby も面倒くさいなぁ・・・
Rails4 simple_form カスタマイズ


入力項目のclass適用は
:input_html => { :class => 'xxx' }
で指定

submitボタンの文字は
f.submit 'xxx'
で指定

ここではTwitter bootstrapと一緒に使っています。

```erb:sample.html.erb

<%= simple_form_for(@image, url: image_upload_index_path(@image)) do |f| %>

  <%= f.input :title, :input_html => { :class => 'input-xxlarge' } %>

  <%= f.input :desc, :input_html => { :class => 'input-xxlarge', :rows => '10' } %>

  <%= f.input :path %>

  <br/>
  <%= f.submit '登録', :class => 'btn btn-primary' %>
  <%= link_to '戻る', :back, :class => 'btn' %>

<% end %>

```
BTKInjectorの日本語ドキュメントを書いてみた

## 日本語ドキュメント
[BTKInjector ホーム](https://github.com/tomohisaota/BTKInjector/wiki/ホーム)

@ikesyoさんのおかげで、travis-ciもセットアップできました。Thanks!
ドキュメントをソースコードから分離したので、必要に応じてサンプル等も追加して行く予定です。

## Github上に置く日本語ドキュメント
いい方法が見つからないので、今回は各言語別ファイルにして手作業でリンクを作成しています。もっといい方法は無い物か。。。
JavaScriptでかっこよくthisを回避する

```js
var a = {
    f: function() {
        // do something
    }
};
```

こんな感じのオブジェクトがあるとき、

```js
a.f.call(null);
```

こんなコードを書くことがあります。`Function#call()`メソッドを使って`a.f()`の中で`this`が`a`になるのを避けているんですけど、わりとダサイ感じです。

```js
(0, a.f)();
```

こうすることで同じことができることに気づいたのでメモ。

```js
('unset this', a.f)();
```

これだとコードの意図も書いておけて、なんかかっこいい気がしました。タイプ数増えちゃいますけど。
Semantic Versioning

# Semantic Versioning って何？

Semantic Versioning とは、バージョン番号の付け方のルールのことです。

## なぜ必要か？

バージョン番号の大小を、プログラムで機械的に判定したい、というのが動機です。このために厳密な仕様が定義されています。

## どこで使われているか？

パッケージを管理するシステムで使われています。RubyGems や CocoaPods がそうです。

## 備考：一般のアプリの場合

Semantic Versioning は、主として、ライブラリ向けのバージョン番号を想定しています。

一般のアプリは必ずしも Semantic Versioning を守る必要はありません。しかし、バージョン番号の付け方に迷うようなら参考にしてもよいかと思います。

なお、バージョン判定をする何らかのフレームワークを使うなら、その動作仕様を知っておくべきです。例えば、OS X アプリの自動更新機能を提供する [Sparkle](https://github.com/pornel/Sparkle) では、Semantic Versioning とは微妙に違うルールでバージョン判定されます。

# 仕様の基本事項

## バージョン番号の形式

「`Major番号.Minor番号.Patch番号`」と、3つの数字をドットでつないだ番号となります。常に3つの数字を使い、省略はできません。

例：`1.0.0` `2.1.3` `3.10.1`

## 番号の意味

* Patch番号：バグ修正の時にインクリメントする番号です。
* Minor番号：後方互換性がある変更の時にインクリメントする番号です。
* Major番号：後方互換性がない変更の時にインクリメントする番号です。

なぜ番号の意味が決まっているかというと、アプリがライブラリを使う場合にどういった範囲の更新を許容するかを指定したいからです。以下のような指定が可能になります。

* バグ修正（Patch）は許容するが、機能追加（Minor）は許容しない。
* 機能追加（Minor）は許容するが、従来機能の変更（Major）は許容しない。

## 補足：開発段階

Major 番号が 0 のものは、開発段階を示します。この場合は、Minor 番号や Patch 番号に上記のような番号のルールはありません。API の仕様も確定していない状態であり、API に非互換な変更がされることも十分ありえます。

Major 番号が 1 以上になった時点で、Public な API が公開された、という扱いになります。その後、上記の番号のルールに従います。

# 応用(1) プレリリース

ベータ版や RC 版のバージョン番号の付け方です。

## バージョン番号の形式

「`X.Y.Z-hoge`」と、通常バージョンの後にハイフンをつけて、プレリリース文字列を追加します。

## 大小判定

プレリリースは、通常バージョンより低いバージョンとなります。

例：`1.0.0` < `1.1.0-alpha` < `1.1.0`

通常バージョン部分が同じプレリリース同士では、プレリリース文字列の ASCII ソート順になります。

例：`1.1.0-alpha` < `1.1.0-beta` < `1.1.0-beta2` < `1.1.0-RC`

# 応用(2) ビルドメタデータ

## バージョン番号の形式

「`X.Y.Z+fuga`」と、通常バージョンの後にプラスをつけて、ビルドメタデータ文字列を追加します。

あるいは、「`X.Y.Z-hoge+fuga`」と、プレリリースバージョンの後にプラスをつけて、ビルドメタデータ文字列を追加します。

## 大小判定

ビルドメタデータは、バージョンの大小に影響を与えません。

例：`1.1.0` = `1.1.0+ext1` = `1.1.0+ext2`

例2：`1.1.0-alpha` = `1.1.0-alpha+ext1` = `1.1.0-alpha+ext2`

# 参照

仕様書：[Semantic Versioning 2.0.0](http://semver.org/)

この記事はLTで発表した内容を整理したものです。LT発表資料：[Semantic Versioning // Speaker Deck](https://speakerdeck.com/usamik26/semantic-versioning)
ALAssetsLibraryのassetForURL:resultBlock:を使うときには循環参照に気をつける（し、非同期実行性にも気をつける）


## 使うとき
`cellforcollectionView:cellForItemAtIndexPath:`にて、既に該当するモデルの各行に対してマッピング済みの画像をカメラロールから参照し、設定する際に利用していた。

## 問題点
コレクションビューを利用したとき、以下のようなケースでセルに設定した画像が意図しないものにすり替わってしてしまう。この変化はデフォルト設定の画像に対して起こる。
1. reloadDataを呼び出したとき
2. コレクションビューをスクロールしたとき

## cellforcollectionView:cellForItemAtIndexPath:の対策前後

対策前の実装

```objc

    UIImageView *recordImageView = (UIImageView *)[cell viewWithTag:100];
    
    //各行に対してマップする画像を特定する処理（は割愛）

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]
    [library assetForURL:imagePathURL resultBlock:^(ALAsset *asset) {            
        if (asset){
            UIImage *thumbnail = [[UIImage alloc] initWithCGImage:[asset thumbnail]];
            //画像をビューに表示する
            recordImageView.image = thumbnail; //->この処理はasset==nilのときだけ実行される
        }
        //->例えばこのときはrecordImageView.imageには何も代入されない（ため、前回のセル内容が再利用される）
    } failureBlock:^(NSError *error) {
        //error handling

    }];
```

対策後の実装

```objc

    UIImageView *recordImageView = (UIImageView *)[cell viewWithTag:100];
    //blocks内部で利用するimageプロパティが、前回使われた内容のまま使われないようにnilを代入する
    recordImageView.image = nil // プレースホルダ画像を設定してもよい
    if(!self.library){
        self.library = [[ALAssetsLibrary alloc] init];
    }
    
    //各行に対してマップする画像を特定する処理（は割愛）

    [self.library assetForURL:imagePathURL resultBlock:^(ALAsset *asset) {
        //非同期実行の処理でも期待通りの画像を取得するために、セルを取得しなおす
        UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath];
        if(!cell){
            //Cell is not visible anymore
            return;
        }
       if (asset){             
            UIImage *thumbnail = [[UIImage alloc] initWithCGImage:[asset thumbnail]];
            //画像をビューに表示する
            recordImageView.image = thumbnail;
        }else{
            // no asset case
        }
    } failureBlock:^(NSError *error) {
        //error handling
    }];
```

## まとめ
~~上記の対策前の実装にて、`recordImageView.image`のretainCount（ARC on なので実際には[こちら](http://spkrln.hatenablog.com/entry/2012/06/19/004407)を参考にさせていただきました）を調べてみると、blocksの中でカウントされているので循環参照が発生していることがわかる（一方、対策後の実装では増えていない）。~~ 
~~症状と対策について、順を追っては説明はできていないのだが、原因はこの循環参照によるものだと思う。~~ 

~~循環参照の問題点はメモリリークする（ため、アプリが落ちる）というものだと単純に考えていたので、こんなところで出くわすとは思わなかった。~~

~~本件は`dequeueReusableCellWithReuseIdentifier:forIndexPath:`にて再利用されたセルの画像が解放されずに残ってしまうためにこのような現象が起きたのだ、と推測してとりあえず開発を進める。~~ 

[追記]
アドバイスいただいた内容で、再まとめしました。

* この問題は循環参照が原因となるものではない（ので、タイトルと記事との関連性が薄くなってしまった）
* `dequeueReusableCellWithReuseIdentifier:forIndexPath:`にて取得できたセルのイメージが新たに設定されないまま再利用されたため、このような現象が起きた
* blocksの処理は非同期で行われるため、取得できたセルのイメージを表示すべきかどうかを再チェックしないと根本的な解決とならない
Vimをメモ帳程度に使うために覚えておくべきコマンド


メモ帳というのは例の``notepad.exe``のことです。


## この記事について

Vimの使い方が全然分からなかったあの頃。TeraTermからメモ帳にコピペして編集してまたコピーして、TeraTermに貼り付け直したような経験はありませんか？私は沢山あります。

実機のコンソールを使っているときなど、コピペ作戦が使えないこともあるので、「とりあえずメモ帳でできるくらいのことはできる」ようにコマンドをまとめてみました。

「ファイル」と「編集」はメモ帳のメニューと合わせています。

## 基本操作

似たような機能はバッサリ省きました。

|やりたいこと |Vimでのコマンド |覚え方 |備考 |
|---------------|--------------|--------------|----------------|
|キャンセル|**ESC**|Escape|最重要コマンド **困ったらとりあえずESC**|
|カーソル移動|**h j k l**|左下上右|最悪、カーソルキーでも移動はできる|
|半画面スクロール|CTRL-D CTRL-U|Down Up|CTRL-E CTRL-Yで行単位スクロール|
|1文字削除(前)|**x** ※小文字||カーソル位置の文字を削除 Deleteキーと同じ|
|1文字削除(後)|**X** ※大文字||カーソルの前を削除 BackSpaceキーと同じ|
|挿入モード|**a i**|Append Insert|カーソルの後か前のどっちから入力始めるかの違い|
|ビジュアルモード|**v**|Visual|選択する Vだと行単位での選択になる|

画面下に``--INSERT--``とか``--VISUAL--``と表示されていれば、そのモードになってます。
ESCを押せばノーマルモードに戻ります。他にも入力を待ち受けるタイプのコマンドをキャンセルするときにもESC。困ったらESC。

## ファイル

「ファイルを開く」ダイアログは出せませんが、ファイルパスの指定にはTABキーでの補完が聞きます。
ついつい``!``をつけたくなりますが、普段はつけないように癖付けておいたほうが無難です。

|やりたいこと |Vimでのコマンド |覚え方 |備考 |
|---------------|--------------|--------------|----------------|
|新規作成  | $ **vim** ファイルパス ||存在しないファイルを指定すると、新規作成|
|開く|**:e** ファイルパス|Edit|Vimを開いている状態で別のファイルを開きたいときに
|上書き保存|**:w**|Write|!をつけると強制上書き|
|名前を付けて保存|**:w** ファイルパス|Write|既に存在する場合はエラー !をつけると強制上書き|
|終了|**:q**|Quit|未保存の場合はエラー !をつけると強制終了|


## 編集

Vimの世界では、クリップボード的なところにテキストを置くことを **ヤンクする** と言います。
ビジュアルモードで範囲選択してヤンクしたりする操作がちょっと戸惑うけど、メモ帳をマウス無しで使おうとするとShift押しながらカーソルで選択してCtrl-C押したりするので、手間は大して変わらないはず。


|やりたいこと|Vimでのコマンド|覚え方 |備考 |
|---------------|--------------|----------------|----------------|
|元に戻す|**u**|Undo|Ctrl-RでRedoもできる|
|切り取り|選択後 **d**|Delete|削除と思いきや、バッファに入る|
|コピー|選択後 **y**|Yank||
|貼り付け|**p**|Paste|Pでカーソルの前に貼り付け|
|削除|選択後 **d**|Delete|ヤンクせずに削除するコマンドは無いっぽい？|
|検索|**/**検索文字列||カーソル位置は検索対象に含まない|
|次を検索|**n**|Next|Nで逆方向に検索|
|置換|**:%s**/置換前/置換後/g|Substitute|%を付けないと、カーソル行内で検索|
|行へ移動|行番号 **G**|Go to|100行目に移動なら``100G``と入力|
|すべて選択|**ggVG**||ggで先頭へ Vで行選択モード Gで末尾へ|


## その他

メモ帳にはないけど、とりあえずのときにも便利なコマンド。

|やりたいこと|Vimでのコマンド|覚え方 |備考 |
|---------------|--------------|----------------|----------------|
|チュートリアル|$ **vimtutor ja**|Vim Tutor 日本語版|30分くらいでVimの使い方が一通り学べる|
|行番号の表示|**:set number**|||
|保存して終了|**ZZ**||非常に押しやすい|



## おまけ

最悪、``i``か``a``を押して挿入モードに入ってしまえば、カーソルキーで移動できるしバックスペースで削除もできるので、とりあえずの編集はできてしまいます。本当に急いでいるときはこれも有り。

``u``でアンドゥするときに、一度の挿入モードで編集した内容が全部戻ってしまうので、そこは注意。
Rubyで前処理。Pixivのタグ検索結果に1タグ1カラムの表データを加える

#概要
Pixivのタグ検索結果に対して統計解析をする際に、
作品別のタグ情報を1タグ1カラムの表データにする必要があった。
加えて、作者別・時系列別の解析もできるように、元の結果も表示する必要があった。
具体的に言えば、(A)から(B)に変換する必要があった。
そのため、[以前のRubyコード](http://qiita.com/nezuq/items/69d15011b6c4b73830b7)を修正した。

(A)
0000000,000000,jpg,...,タグ1 タグ2 タグ3,...,http
0000000,000000,jpg,...,タグ1 タグ3 タグ4,...,http

(B)
illust_id,user_id,extension,...,tags,...,user_url,タグ1,タグ2,タグ3,タグ4
0000000,000000,jpg,...,タグ1 タグ2 タグ3,...,http,1,1,1,0
0000000,000000,jpg,...,タグ1 タグ3 タグ4,...,http,1,0,1,1

#データ
[-> Pixiv検索結果をCSVダウンロードするHTMLファイルを用意した](http://qiita.com/nezuq/items/55800d55c03606e0b13c)

#コード
```ruby:pxcsv2tagtable.rb
# coding: UTF-8

=begin
pxcsv2tagtable.rb
Copyright (c) 2014 nezuq
This software is released under the MIT License.
http://opensource.org/licenses/mit-license.php
=end

require 'csv'

#入力ファイル名
INPUT_CSV = 'INPUT.csv'
#出力ファイル名
OUTPUT_CSV = 'OUTPUT.csv'
#しきい値（出現頻度が指定範囲外のタグのカラムは出力しない）
#MAX_FREQUENCY = 1.000
#MIN_FREQUENCY = 0.005
#しきい値（出現回数が指定範囲外のタグのカラムは出力しない）
MAX_COUNT = 9999
MIN_COUNT = 3
#表示しないタグのパターン
UNDISP_KEYPATTERN = /漫画|落書き/
#元データの列名
ORIGINAL_COLUMNS = %w(illust_id user_id extension title server_no user_name illust_128_url x1 x2 illust_480mw_url x3 x4 illust_entry_dt tags tool_name evaluate_cnt evaluate_sum view_cnt caption page_cnt x5 x6 x7 x8 user_disp_id x9 r18_flg x10 x11 user_url)
#元データの表示フラグ
DISP_ORIGINAL_COLUMNS = true

h_org = {}
h = {}
clm = []
CSV.foreach(INPUT_CSV, encoding: "UTF-8") do |row|
    ORIGINAL_COLUMNS.each_with_index do |key, i|
        h_org[key] = clm.clone if (! h_org[key])
        h_org[key].push(row[i])
    end if (DISP_ORIGINAL_COLUMNS)
    tags = row[13] ? row[13].split(' ') : []
    (h.keys | tags).each do |key|
        h[key] = clm.clone if (! h[key])
        h[key].push(tags.include?(key) ? 1 : 0)
    end
    clm.push(0)
end

sum = ->(ary){ary.reduce {|x, y| x + y}}
cnt = h.values[0].length
lst = h.delete_if {|key, ary|
#        (key =~ UNDISP_KEYPATTERN) || !((sum.call(ary)*1.000/cnt).between?(MIN_FREQUENCY, MAX_FREQUENCY))
       (key =~ UNDISP_KEYPATTERN) || !((sum.call(ary)).between?(MIN_COUNT, MAX_COUNT))
    }.sort_by{
        |key, ary| -sum.call(ary)
    }

CSV.open(OUTPUT_CSV, "wb") do |csv|
    hdr = []
    h_org.each do |key,val|
            hdr.push(key)
    end if (DISP_ORIGINAL_COLUMNS)
    for i in 0..(lst.length - 1) do
        hdr.push(lst[i][0])
    end
    csv << hdr
    for i in 0..(cnt - 1) do
        row = []
        h_org.each do |key,val|
            row.push(val[i])
        end
        for j in 0..(lst.length - 1) do
            row.push(lst[j][1][i])
        end
        csv << row
    end
end

puts "end!"
```
電子書籍(ePub)をMacで音声ファイルに変換


この前の[オライリーコレクション祭り](http://www.oreilly.co.jp/sales/2014/04/deal-of-the-day-oreilly-collection.html)で、何冊かePubを買いました。
DRMフリーって、色んなデバイスで読めて素晴らしい。

でも、あんまり読めてなくて積み本になってます。
そこで、Macに`say`で読み上げてもらって耳から強制的に読もう！と思いました。
(iPhoneのiBooksが読み上げてくれたら便利なのに...)

# ePubファイルについて
ePub持ってない人は、こちらが無料なのでダウンロードしてみてください。
[O'Reilly Japan - EPUB 3とは何か？](https://www.oreilly.co.jp/books/9784873115528/)


「.epub」ファイルは単なるzipファイルなので、`unzip`コマンドで解凍できます。

```shell-session
cd ~/Downloads/

unzip oreilly-978-4-87311-552-8e.epub -d epub
```

「epub」というフォルダの中に解凍しました。
その中の「OEBPS」というフォルダに文章等が保存されてます。

ざっと見で、chで始まるxhtmlがチャプター(章)みたいな感じ。適当。

# sayコマンドについて
Macに喋ってもらうには、`say`コマンドを使います。

使い方を簡単に紹介します。詳細は`man say`を参照。
漢字もけっこうよろしく喋ってくれます。

```shell-session
say 'はろーはろー'
```
パイプも行けます。

```shell-session
echo 'はろーはろー' | say
```
ファイルにも保存できます。

```shell-session
say 'はろーはろー' -o hello.m4a
```

sayコマンドについては別に記事を書きました
[Macのsayコマンドの使い方 - Qiita](http://qiita.com/manuluu/items/0c17acb21f119647c205)

# ePubを読み上げてもらう
少し乱暴ですが、htmlタグは必要無いので`sed`でぜんぶ除去します。
そのままパイプで`say`に渡します。
問題無く喋ってくれたら、「Ctrl + C」で中止しましょう。

```shell-session
sed 's/<[^>]*>//g' epub/OEBPS/ch*.xhtml | say --progress
```
全ての章を一気に処理してます。
`--progress`をつけると経過時間が分かって便利です。
本によってはファイル名とか構造が違って動かないかもしれないので、その場合は適当にパスを修正します。

# 音声ファイルに保存

デスクトップに「epub.m4a」という名前で保存します。

```shell-session
sed 's/<[^>]*>//g' epub/OEBPS/ch*.xhtml | say -o ~/Desktop/epub.m4a --progress
```

あとはiTunesに入れてiPhoneで聞き流すだけです。

「入門Sinatra」は3時間49分でした。
ファイルサイズは54MB、変換完了までMacbook Proで40秒。

タイトル自動でつけたり、チャプターごとにトラック分けたりしてくれるスクリプト書きたい。
ていうか、誰か作ってくれないかな...(ﾁﾗｯ

#iPhoneで再生する場合
iTunesでオーディオブックにしておきましょう。
再生速度を変えられますし、どこまで再生したかを記憶してくれるので便利です。
`[情報を見る > オプション > メディアの種類]`

iPhoneでは以下から再生できます。
`[ミュージック > その他 > オーディオブック]`
アルバム名を書かないと空白のセルになるので、アルバム名は入れておきましょう。
# 参考
[概説EPUB(構造解説編) - HowManyFilesの日記](http://d.hatena.ne.jp/HowManyFiles/20101015/1287147998)
[EPUB - Wikipedia](http://ja.wikipedia.org/wiki/EPUB)
[はじめてのEPUB:その1 - 達人出版会日記](http://d.hatena.ne.jp/tatsu-zine/20100324/1269451084)
[sedでhtmlのタグを除去する | サラトガIT日記](http://www.dollpaper.com/info/347.html)
コントラスト調整

## ヒストグラムを伸張する
```matlab
newImg = imgadjust(img, [low_in; high_in], [low_out; high_out], gamma)
```

### データの上下1%でダイナミックレンジが飽和するように伸張してみる
```matlab
newImg2 = imgadjust(img, [], [], 5);
```
「5のガンマをかける」
画像の二値化

## simple
```matlab
img = ('img.jpg');
grayImg = rgb2gray(img);
bwImg = im2bw(grayImg);
figure;
imshow(bwImg);
```

## 大津の二値化
```matlab
thresh = graythresh(grayImg); % grayImgは前の流用ということで
bwImg2 = im2bw(grayImg, thresh);
figure;
imshow(bwImg2);
```

### 参考
[判別分析法（大津の二値化）画像処理ソリューション](http://imagingsolution.blog107.fc2.com/blog-entry-113.html)

## manual
```matlab
imtool(grayImg); % grayImgは前の流用ということで

% ヒストグラムを表示して、それっぽいしきい値を見つける

bwImg3 = grayImg < 60; % しきい値を60にしたい時
figure;
imshow(bwImg3);
```

## もっと楽にmanualする
以下のコードを「スクリプト」として書く

```matlab
%%
img = ('img.jpg');
grayImg = rgb2gray(img);
imshow(grayImg > 30);
%%
```

30を右クリックして「値のインクリメントおよびセクションの実行」をクリックすると、四則演算のボタンが出てくる。ここをクリックすると動的に画像を見ながら二値化できる。
ubuntu14.04 + apache2.4.xでforbbidenが出る場合の解決方法

#はじめに
こんにちはubuntu14.04。
というわけで、ubuntu14.04 LTSがリリースされましたね。
ubuntu14.04で```sudo aptitude install apache2```をすると、この記事を書いている現在ではapache 2.4.6が入ってきます。
この記事はapache2.4系ではまりやすい事柄に関してまとめたいと思います。
（つまり別にubuntu14.04特有ではないということだけど…）

##症状：forbidden
vhostの設定をして、どう考えてもconfはあっているはずなのに、forbiddenが出る。
例えば、

```sh:example.com.conf
<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerName www.example.com
    DocumentRoot /mnt/hgfs/vm/www/
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <Directory "/mnt/hgfs/vm/www/">
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
```

で、```sudo service apache2 restart```しても、
「あれっ、なんでforbidden?」
ってなる。
エラーログはこんなかんじ

```sh:error.log
...
AH01630: client denied by server configuration: /mnt/hgfs/vm/www/index.html
```


##解決策
アクセス許可の設定が2.4系だと結構変わっている。
ubuntu12.04 LTSをずっと使っていて14.04 LTSを使いはじめると結構はまりがちだと思います。
こんなかんじに変更しましょう。

```sh:example.com.conf
<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerName www.example.com
    DocumentRoot /mnt/hgfs/vm/www/
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <Directory "/mnt/hgfs/vm/www/">
        Require all granted
    </Directory>
</VirtualHost>
```

この他にも、

```sh:
    #全拒否
        Require all denied

    #IPアドレスxxx.xxx.xxx.xxxのみ許可
        Require ip xxx.xxx.xxx.xxx

    #ローカルIPアドレスのみGETとPOSTを許可
    #それ以外はGETのみ許可
    <RequireAny>(省略可)
        Require all granted
        Require method GET
        <RequireAll>
            <RequireAny>
                Require ip 192.168.
                Require ip 172.16.
                Require ip 10.
            </RequireAny>
            Require GET POST
        </RequireAll>
    </RequireAny>
```

これに関しては[こちら](http://httpd.apache.org/docs/current/ja/mod/mod_authz_core.html#require)に詳しく載ってます。
MATLABをはじめる　

大学の授業でMATLAB始まったんだけど使わない限り覚えないなって思ってとりあえずノートをまとめ直すことにした。参考にしたい人画像無くてすいません。MATLABは学校じゃないと出来ないんです(そもそも今のところそんなにやる気もない)。
MATLABはインタプリタ言語で、Matrix Laboratoryの略らしい。プログラミングより数学勉強しようぜ！というノリ。型とか俺達が受け持つから数学やってくれよな！という思いらしい。

ファイルの拡張子は.m。.mmは違う言語ですねそうですね。

MATLAB Centralっていうポータルサイトみたいなのがあるらしいので気になる人は要チェケラらしい。

http://www.mathworks.co.jp/matlabcentral/

## 画像の取り込みや表示
### 画像の取り込み
```matlab
img = imread('img.jpg');
```
セミコロンを付けないとimgの中身がだばーっと出てくる(確か)

### 画像の表示
```matlab
Imshow(img);
```

## もっといろいろやる
### 新しいウィンドウ開く
```matlab
figure
```

### 画像の詳しい情報を見る
```matlab
imgInfo = imfinfo('img.jpg')
```

### 画像を詳しく調べる
```matlab
imtool(img);
```

### グレースケールにする
```matlab
grayImg = rgb2gray(img);
```

グレースケールにした画像をイメージツールで立ち上げるとコントラスト調整が出来るようになった気がする。

### Imshowのオプション
- 'DisplayRange'
  - [low, high]を取る、low以下を黒にしてhigh以上を白にするらしい
- 'Xdata' or 'Ydata'
  - XもしくはY座標の最大最小をきめる。

### 画面をきれいにする
```matlab
clc;
clear; % とか
```

## 変数の定義、行列の生成
```matlab
N = 8 % Nに8入れる
X = [1:5] % Xに1,2,3,4,5が入る
Y = [1:0.2:pi] % 1からpiまで0.2刻みで入ってた気がする
```

### いろいろな行列
```matlab
zeros(m, n) % 全部0の行列
ones(m, n) % 全部1の行列
eye(m, n) % 単位行列
diag([x1, x2, x3, ..., xn]) % 対角行列
rand(m, n) % 一様乱数行列(0~1の範囲らしい。(1~0)なのか[1~0]とかは知らない。)
```

## 画像の保存
```matlab
imwrite(img, 'yahoooooo.png');
```

## レシピ
### 便利機能をQiitaで書いてここにリンク貼る。
- [matlab - 画像の二値化 - Qiita](http://qiita.com/makerbox/items/2ffa1d901d3898164f16)
Rails + Angular.jsでTurbolinksを有効なままAngular.jsを動かす

##問題
railsでTurbolinksを有効にしたままだと、画面遷移をした際にAngular.jsが動きません。
おそらくTurbolinksが画面遷移をAjaxに置き換えており、その際にAngular.jsをうまく初期化できていないようです。

* 参考
[Rails 4のturbolinksについて最低でも知っておきたい事](http://kray.jp/blog/must-know-about-turbolinks/)


##対処策
####1. htmlのng-appを外す
Angularを使用する場合にhtmlタグに付ける`ng-app`を外します。

~~~html:before
<html ng-app="app">
~~~

~~~html:after
<html> 
~~~


####2.app.jsでbootstrapする

~~~javascript:app.js
window.App = angular.module('app', ['ngResource']);
//下記を追加
$(document).on('ready page:load', function(){
  angular.bootstrap(document.body, ['app']);
});
~~~

これで動作するようになりました。

下記ページを参照させていただきました。
[Turbolinksを有効にしたままでangularjsを使用する](http://kouyatakao.hatenablog.com/entry/2014/03/22/123254)
Guzzle v3での相対URIの解決

[前回](/KitaitiMakoto/items/8796e0f5a3a62cd3a882)に引き続きGuzzle バージョン３という古い環境でのお話ですが。

[Guzzle\Http\Url](http://api.guzzlephp.org/class-Guzzle.Http.Url.html)というクラスが同梱されているので、`Net_URL2`の代わりにでも使おうとして、相対URIの解決ではまったのでメモ。
相対URIを解決する`combine`メソッドが、デフォルトではおかしな解決をしてしまうのです。

（因みに最新のバージョン４では問題ないです）

```php:uri.php
<?php
require_once __DIR__ . '/vendor/autoload.php';

$baseUri= 'http://example.net/sample/path';
$relativeUri = 'relative/path';

echo 'Base URI: ', $baseUri, PHP_EOL;
echo 'URI to combine: ', $relativeUri, PHP_EOL;

$uri = \Guzzle\Http\Url::factory($baseUri);
echo 'Default : ', $uri->combine($relativeUri), PHP_EOL;

$uri = \Guzzle\Http\Url::factory($baseUri);
echo 'RFC 3986: ', $uri->combine($relativeUri, true), PHP_EOL;

$uri = \GuzzleHttp\Url::fromString($baseUri);
echo 'Guzzle 4: ', $uri->combine($relativeUri), PHP_EOL;
```

    $ php ./uri.php
    Base URI: http://example.net/sample/path
    URI to combine: relative/path
    Default : http://example.net/sample/path/relative/path
    RFC 3986: http://example.net/sample/relative/path
    Guzzle 4: http://example.net/sample/relative/path

↑の通り、`combine`の第二引数に`true`を渡すと、ちゃんと解決してくれます。
【F#】Seq.unfold と Regex

Seq.unfold の使い方がちょっと理解できたのでメモ。
今回 unfold を利用したのは、ある文字列 str から Regex でマッチした部分文字列とその前にある（前のマッチ以降の）部分文字列をペアにして seq<string * string> として返すというもの。
例を挙げると、文字列 ab1cde23fg45h6ijk に対し、正規表現 \d+ で次のような文字列ペアのシーケンスを取得します。
[("ab", "1"); ("cde", "23"); ("fg", "45"); ("h", "6"); ("ijk", "")]
（実際には list ではなく seq ですが）

```fsharp
let str = "..." // 対象の文字列
let re = new Regex(@"...") // 対象文字列の特定の部分文字列にマッチする正規表現
Seq.unfold
    (fun (p : int, m : Match) ->
        if p < 0 then None
        else if m.Success then
            let v = (str.Substring(p, m.Index - p), m.Value)
            Some(v, (m.Index + m.Length, m.NextMatch()))
        else
            let v = (str.Substring(p), "")
            Some(v, (-1, m)))
    (0, re.Match(str))
```

ちなみに、Seq.unfold を使う前は次のように再帰を使って書いてました。

```fsharp
let str = "..."
let re = new Regex(@"...")
let rec f1 (p : int) (m : Match) pairs =
    if m.Success then
        let v = (str.Substring(p, m.Index - p), m.Value)
        f1 (m.Index + m.Length) (m.NextMatch()) (pairs @ [v])
    else
        let v = (str.Substring(p), "")
        pairs @ [v]
f1 0 (re.Match(str)) []
```
WinSCPでsudoを使う（SakuraVPS）

SakuraVPS(CentOS 6.5) WinSCPでsudoを使えるようにする。

# Sudoersを編集する

ここを参考にした。
http://winscp.net/eng/docs/faq_su

※WinSCPで使うログインユーザーは`username`と仮定。

```
$ sudo visudo
```

```
## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
##      user    MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
username  ALL=(ALL)       ALL
username  ALL=NOPASSWD: /usr/libexec/openssh/sftp-server
```

## 補足

sudo使用時にパスワードを要求される状態では、WinSCPは使えなさそうなので、パスワードなしで使えるようにする。

`username  ALL=NOPASSWD: /usr/libexec/openssh/sftp-server`として、SFTPセッションの時のみパスワードなしでsudoを使えるようにする。

※もちろん`username  ALL=NOPASSWD: ALL`とすればセキュリティレベルは下がるが、便利にはなる。

# WinSCPの設定

接続情報を入力する場所の設定を開き、SFTP＞SFTPサーバに`sudo /usr/libexec/openssh/sftp-server`を設定する。

恐らくこれだけでは接続できない。

![winscp.png](https://qiita-image-store.s3.amazonaws.com/0/37334/82dc5db0-e95a-547d-2a99-a7be257a25cb.png)


# Sudoersをもう一度編集

次は以下を設定

```
$ sudo visudo
```

```
#
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
#         You have to run "ssh -t hostname sudo <cmd>".
#
Defaults    requiretty
```

↓ 変更後

```vim
Defaults    requiretty
Defaults:username !requiretty
```

ヒント
Is it okay to disable requiretty?
http://unix.stackexchange.com/questions/65774/is-it-okay-to-disable-requiretty

# 接続する

これでrootユーザーでなくてもOK！

とはいえ操作ミスで大事なファイルを消したくはないので、通常（sudoしない用）の設定を作り直して、使うようにしてみます。

![winscp2.png](https://qiita-image-store.s3.amazonaws.com/0/37334/aae9bc1e-414d-7bd0-3d3c-8324e0c4fadb.png)

定石ってやつを知らないが、こんな感じでよさそうですね。
trampでリモートサーバのファイルをSSH経由で編集	


Emacsにはtrampって機能があって、SSH経由でリモートサーバのファイルを編集することができるみたい。

「え、普通にsshログインして触ればよくね？」って思ってたんだけどそうじゃない、全然そうじゃない。これの凄さはローカルのEmacsの環境のままリモートのファイルを操作できるって事。すげーまじすげー。

## 設定
.emacsに以下を記述

````.emacs
(require 'tramp)
(setq tramp-default-method "ssh")
````

これでファイルを開く際にリモートサーバのファイルを指定すればOK。

````
C-x C-f /ssh:user@hostname#port:.emacs.d/init.el
````

Emacsすげー。この機能で .emacs.d/ 配下をGithub管理にしてどうにか頑張ってどこでも良い感じのEmacsが使えるようにしようとしてたのが不要になった。サイコー、これサイコー。
複数のCSVファイルを1ファイルにまとめるコマンド

#処理
カレントディレクトリに結合したいCSVファイルのみを入れて、
ターミナルで下記コマンドを発行する。

##コマンド
###■Windows
type *.csv > INPUT.csv

###■Linux
cat *.csv > INPUT.csv

#結果
全CSVファイルを結合したINPUT.csvが出力される。
man の出力をファイルに落とす

man の出力をそのままファイルにリダイレクトすると

```shell-session
$ man cat > file
```

環境や条件次第では制御文字が残っておかしなことになってしまうので
そんな時は col をかませて制御文字をとってあげるとよい。

```shell-session
$ man cat | col -b > file
```

もちろん git help とかもいけます

```shell-session
$ git help init | col -b > file
$ # やっていることは man git-init と同じことだから当たり前ですけどね
```

## 余談

Cygwin 環境で制御文字が残ったのでこの記事を書こうと思ったのですが、Linux（xubuntu 12.04）では `man cat > file` でなんの問題もなかった・・・。今どきの Linux はそういうものなのか？