OmniAICreator/Qiita-1.07M huggingface dataset:
【個人メモ】powerline fontpatcher 別リポジトリになってたのでメモ

# fontpatcherはいずこへ...

powerlineのフォント、fontpatcherでパッチを当てる形になってるのだけど、
Documentには書かれてない。

https://powerline.readthedocs.org/en/latest/fontpatching.html

作者のリポジトリを見てみたら、
pythonのパッケージとして管理されてた。

https://github.com/Lokaltog/powerline-fontpatcher

## インストール

以下でOK

```
> pip install --user --upgrade git+git://github.com/Lokaltog/powerline-fontpatcher
```

このままだと**fontpatcher-symbols.sfd** がねえよって怒られるので、
対策しとく。

僕の環境はMac OS Xなので以下の手順を踏む。

```
mkdir -p /Users/futoase/Library/Python/2.7/fonts
cd /Users/futoase/Library/Python/2.7/fonts
curl -O https://raw.githubusercontent.com/Lokaltog/powerline-fontpatcher/develop/fonts/powerline-symbols.sfd
```

Issueは放置中...
https://github.com/Lokaltog/powerline-fontpatcher/issues/1

## つかいかた

powerline-fontsをcloneして、パッチを当てる

```
> git clone git@github.com:Lokaltog/powerline-fonts.git
> cd powerline-fonts/SourceCodePro
> powerline-fontpatcher Sauce\ Code\ Powerline\ Bold.otf  
```

**Sauce Code Powerline Bold for Powerline.otf** 作成されるので、
Mac OS Xにフォントをインストール。

```
> open .
```

でFinderを立ち上げて、
**Sauce Code Powerline Bold for Powerline.otf**をダブルクリック

![スクリーンショット 2014-06-06 11.38.09.png](https://qiita-image-store.s3.amazonaws.com/0/3985/89a35024-8098-661f-42b7-5ab4bf8b93f2.png)

terminalにフォントを指定。

するとこうなる。

![スクリーンショット 2014-06-06 11.39.52.png](https://qiita-image-store.s3.amazonaws.com/0/3985/8bdc5017-842a-b116-9558-b6ed34aa986a.png)

やっと会社マシンをまともな状態にできたぞ
[Swift] SwiftとObjective-Cで相互に連携する


詳細は公式ドキュメント「[Swift and Objective-C in the Same Project](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html)」を参照。

今後、SwiftとObjective-Cでの相互連携が当たり前になっていくのだと思います。
てなわけで、それぞれのファイルで定義したクラスにアクセスする方法をメモしておきます。

結論から書くと、それぞれBridgeとなるファイルが生成され、そこを経由してやりとりする、というのがおおまかな流れになります。

[追記]

## Swiftで宣言されたprotocolをObjC側で利用する

Swiftでただ宣言しただけではブリッジ用のファイルに書き出されないため、ObjeC側で利用できません。
`@objc`をつけて宣言する必要があります。

```objc:protocol
@objc protocol Hoge {
	var name: String?
	func fuga()
}
```

利用するときは型にProtocol名をそのまま使います。

```objc:type
var aHoge: Hoge?
```

## NSObjectを継承していないクラスをObjective-C側で利用する

Swift側で`NSObject`を継承をさせると、自動的にブリッジとなるファイル`<#ProductName#>-swift.h`ファイルが生成されます。
が、逆を返せば`NSObject`を継承していないSwiftのクラスはそのブリッジのファイルに書きだされません。

しかし、`@objc` attributeを利用すれば`NSObject`を継承していなくてもObjective-C側から利用することが可能になります。
具体的には以下。

```withoutNSObject.swift
@objc(SomeClass)
class SomeClass {
	// ファクトリメソッドを定義しておく
	class function create() -> SomeClass {
		return SomeClass()
	}
	func doMethod() -> () {
		println("Perform a method!")
	}
}
```

```withoutNSObject.m
// Objective-C側での利用
SomeClass *someClass = [SomeClass create];

// インスタンスメソッドも呼べる
[someClass doMethod];
```


## Objective-C内でSwiftで定義したクラスを利用する

Objective-C側でSwiftで定義されたクラスを利用するには、Xcodeが自動生成する`ProjectName-Swift.h`ファイルをimportします。
あとは普通にObjC側から、Swiftで定義したクラスを利用することが出来ます。

```TestView.swift
import UIKit;

class TestView: UIView {
    init(frame: CGRect) {
        super.init(frame: frame)
        backgroundColor = UIColor.greenColor()
    }
}
```

```ObjcViewController.m

#import "ObjcViewController.h"

// Swift側の定義を読み込む
#import "ProjectName-Swift.h"

@interface ObjcViewController ()

// Swiftで定義したUIViewクラスを保持
@property (nonatomic, strong) TestView *testView;

@end

@implementation ObjcViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.testView = [[TestView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:self.testView];
}

@end

```



## Swift内でObjective-Cで定義したクラスを利用する

今度は逆のパターンです。
Swift内で、Objective-Cで定義したクラスを利用する方法です。
こちらのケースの方が多いのではないでしょうか。

さて、こちらもブリッジとなるヘッダファイルを介して利用します。
ただし、こちらの場合は、Swiftプロジェクト内にObjCファイルを生成しようとすると、`ProjectName-Bridging-Header.h`を生成しますか？　と聞かれ、「はい」と答えると生成されるようです。

![](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/Art/bridgingheader_2x.png)
（公開されているAppleのサイトから引用）

このヘッダファイルに、Swift内で使用したいObjective-Cクラス用のヘッダファイルをimportさせます。

```ProjectName-Bridging-Header.h
#import "ObjcViewController.h"
```

比較的簡単に連携できそうなのでSwiftも問題なく使えるんじゃないでしょうか。
今から楽しみです。
Automator のライブラリが消えた

現象
======
Automator のライブラリがいつのまにかいくつか消えていた。
基本的な動作もままならない。

解決策
======
plist(設定ファイル)を消す。
OSX アプリで動作がおかしくなったら基本的にこの方法で良い。

ターミナルを起動し、以下のコマンドを実行。
Automator を再起動しましょう。

```
defaults delete com.apple.Automator.plist 
```
サーバーのアプリケーションログを外部に保存したい

Azure mobile servicesを使っていて、ログコンソールがあまりにもアレ（重い、検索できない、過去ログたどりづらい)ので、ログ保存出来るサービスやツールを軽く調べてみたメモ、適宜更新していきたいです。おすすめのツールなどあればぜひ教えて下さい

### [Fluentd](http://fluentd.org/)
> Fluentd is an open source data collector designed for processing data streams

Bigdataの保存・解析サービスを提供するTreasure data社によるログ収集用OSS
Treasure dataと連携するとログの解析とかが簡単にできるのかもしれないけどよくわかってない

### [Logstash](http://logstash.net/)
> logstash is a tool for managing events and logs. You can use it to collect logs, parse them, and store them for later use (like, for searching)

Log収集のためのツール、現在はElasticSearchと同じ開発元になっており、連携が容易っぽい

### [Loggy](https://www.loggly.com/)
> Simplify log management

ログ管理に特化したWebサービス? 200MB, 7日間保存まで無料
質問 マイ・オークション表示（出品終了分）API 

ここでこういった形で質問をしてもよいのか解りませんが、
困っていますので、よろしくお願いいたします。

マイ・オークション表示（出品終了分）API で、
商品の画像が、取得できていません。

オークションURL、タイトル、価格、ID 等は、正常に取得できますが、
画像だけは、すべて、
「画像を表示できません」という画像のアドレス
http://image.auctions.yahoo.co.jp/images/na-with-ph_75x75.gif
が、返ってきています。

これが正常な動作でしょうか？

解る方がおられましたら、教えていただけますか。
OpenSSL祭り : CentOS 5.5


[CVE-2014-0224](http://lepidum.co.jp/blog/2014-06-05/CCS-Injection/)とかいろいろ対応

http://www.openssl.org/ からアプデートを入手:


    $ wget https://www.openssl.org/source/openssl-0.9.8za.tar.gz
    

rpmbuild, [入っていますか](http://qiita.com/IK12_info/items/bcf695460363bae87eb9)？:

    $ sudo yum install rpm-build    

RPM作る:

    $ sudo rpmbuild -ta openssl-0.9.8za.tar.gz

インストール:

    $ sudo rpm -Uvh --nodeps /usr/src/redhat/RPMS/x86_64/*.rpm
VirtualBoxで64bitVMを作れるようにする(Hyper-V有効なWindows 8.1 Pro編)

VirtualBoxの仮想マシン新規作成で64bitのゲストが選択できない現象を解消する方法です。
##環境
問題が出ていた環境は、

* OS： Windows 8.1 Pro 64bit
* Hyper-V有効
* Intel VT、VT-d有効

です。
この時のVirtualBoxの仮想マシン新規作成時の選択肢はこんな感じ。
![VBoxCreateVM(32bit).png](https://qiita-image-store.s3.amazonaws.com/0/19989/bcccc553-2317-7dfa-b235-a89c6f322e6c.png)


#ざっくりいうと
Hyper-VがCPUの仮想化支援拡張(VT、VT-dなど)を握ってしまい、VirtualBoxでは無効と判定されてしまう。
結果、64bitサポートが無効になってしまう。

#対策
Hyper-Vを無効にすればVirtualBoxの64bitサポートが有効になります。
ブートメニューにHyper-Vを無効にした起動メニューを追加して簡単に切り替えられるようにします。
##手順
###ブートメニューに項目を追加
bcdeditを使用してブートメニューに項目を追加します。
管理者としてコマンドプロンプトを起動し、現在の起動設定をコピーした上でHyper-Vを起動しないように設定変更します。

```
Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\WINDOWS\system32>bcdedit /copy {current} /d "Disable Hyper-V"
エントリは {ea37cfa1-ecb8-11e3-bec0-78dd08b0ae41} に正常にコピーされました。

C:\WINDOWS\system32>bcdedit /set {ea37cfa1-ecb8-11e3-bec0-78dd08b0ae41} hypervisorlaunchtype off
この操作を正しく終了しました。

C:\WINDOWS\system32>
```

最初のbcdeditの出力は環境によって異なります。
出力されたGUIDを次のbcdeditの引数にします。

###Hyper-Vを無効にして起動
Shiftキーを押しながらWindowsを再起動します。
「オプションの選択」が表示されたら“別のオペレーティングシステムの使用”を選択します。
![OtherOS.jpg](https://qiita-image-store.s3.amazonaws.com/0/19989/d90398ef-ca7e-8085-c3b5-13144201c43c.jpeg)
「オペレーティングシステムの選択」で先ほど追加した“Disable Hyper-V”を選択します。
![DisableHyperV.JPG](https://qiita-image-store.s3.amazonaws.com/0/19989/9d3a23d9-5143-8ed7-39a5-82f0d12fef2a.jpeg)
PCが再起動し、Hyper-V無効の状態でWindows 8.1が起動します。

###確認
VirtualBoxを起動し仮想マシンの作成を実行します。
64bitの選択肢が増えています。
![VBoxCreateVM(64bit).png](https://qiita-image-store.s3.amazonaws.com/0/19989/75e6ab19-25f1-641f-b589-6e13225bb109.png)

#まとめ
ハイパーバイザーやホスト型の仮想PCソフトの共存は一筋縄ではいかないというお話でした。

Windows 8から追加されたClient Hyper-VではUSBが使えないため、VirtualBoxも必要となるシチュエーションがあります。
ウィルス対策ソフトと仮想PCソフトの共存はダメとわかっているんですけどね。
##スペシャルサンクス
今回の対応では以下のサイトを参考にさせていただきました。
ありがとうございました。

* [【仮想OS】virtualboxで64bitOSが選択できない場合](http://acball.hatenablog.com/entry/2013/11/05/205712)
* [蒼の王座・裏口 » Windows 8.1で、VirtualBoxとHyper-Vを簡単に切り替える方法](http://sqlazure.jp/r/%E6%9C%AA%E5%88%86%E9%A1%9E/375/)
Javascriptでのエンコーディング

私は日頃 *Javascript*は *UTF-8*形式でファイルを保存しています。

最近 *Shift-JIS*で書かれたテキストファイルを *UTF-8*で書かれたコードから読み込む必要が出てきたのですが、

**「Javascript encoding」**でぐぐると、

* __空白文字を%20にエンコーディングする__ような話と、
* 自分の意図と同じような __Shift-JISとUTF-8を変換する__話

がでてきて最初のうち間違えて前者を一生懸命やってしまったので、

なるべく同じようなアホを増やさないように覚書。 :p

サーバ上のファイルをエンコーディングを指定して読み込むには以下のようにして読み込みます。

*send()*をする前に *overrideMimeType()*でエンコーディングを指定しているところがミソです。

この方法でEUC-jpとかも行けるはず。

```js
/**
 * サーバ上のファイルを取ってくる
 *
 * @param {String} path ファイルのパス
 *
 * @return {String} ファイルの内容
 */
function get_content_SJIS(path) {
 var ajax = new XMLHttpRequest();
 if (ajax != null) {
  ajax.open('GET', path, true);
  // my file's charset is Shift-JIS.
  ajax.overrideMimeType('text/plain; charset=Shift_JIS');  // <-- ココ
  ajax.send(null);

  ajax.onload = function(e) {
   utf8text = ajax.responseText;  // <-- UTF-8形式の文字列になっている
   ゴニョゴニョ(utf8text);
  };
 }
}
Createjsで★を動かす


[サンプル](http://jsdo.it/matsui_q/fZL9)


#位置調整
```
//canvasの幅と高さを取得
nWidth = canvasElement.width;
nHeight = canvasElement.height;

//位置調整
colorStar.x = nWidth * Math.random();
colorStar.y = nHeight / 2;
```


#Tweenアニメーション

Tween()コンストラクタで基本設定
Tween.to()メソッドにプロパティを追加

```
//書き方
new Tween（対象オブジェクト,　初期設定オブジェクト）
Tweenオブジェクト.to（プロパティ値のオブジェクト,間隔,イージング関数）

var myTween = new createjs.Tween(target, {loop:true});
myTween.to({y:nHeight-40, rotation:360}, 1000, Ease.bounceOut);
```

#アニメーションの種類

IN   はじめが加速するかんじ
OUT  おわりが減速するかんじ
INOUT はじめとおわり両方ある

##線形
linear
none

##増減
backIn
backInOut
backOut
bounceIn
bounceInOut
bounceOut

##滑らかな曲線
circIn
circInOut
circOut
cubicIn
cubicInOut
cubicOut
elasticIn
elasticInOut
elasticOut
quadIn
quadInOut
quadOut
quartIn
quartInOut
quartOut
quintIn
quintInOut
quintOut
sineIn
sineInOut
sineOut

##引数で変えられるメソッド
getBackIn
getBackInOut
getBackOut
getElasticIn
getElasticInOut
getElasticOut
getPowIn
getPowInOut
getPowOut

アニメーションの動きは下記参考に
[TwennJS Spark Table](http://www.createjs.com/#!/TweenJS/demos/sparkTable)
方向キーから脱却する為、メモ


##上下左右に１文字ずつ移動

|ショートカット|Action|
|:---------:|:-----:|
|`control + F`|カーソルを右へ|
|`control + B`|カーソルを右へ|
|`control + P`|カーソルを上へ|
|`control + N`|カーソルを下へ|

##文頭文末へ一気に移動

|ショートカット|Action|
|:---------:|:----:|
|`control + A`|行頭/段落先頭に移動|
|`control + E`|行末/段落末に移動|

##文字入力のショートカット

|ショートカット|Action|
|:---------:|:-----:|
|`control + D`|カーソルの右側の文字を削除|
|`control + H`|カーソルの左側の文字を削除|
|`control + K`|カーソル右側の文字から行末/段落末まで削除|
|`control + delete`| カーソル左側の１単語とその後ろのスペース.句読点を削除|

参考サイト
[テキスト入力が死ぬほどはかどるMacショートカット] (http://www.find-job.net/startup/mac-shortcut)
Scala: リストを条件によって分割する(String.splitのList版)



たとえば、`List(1, 0, 1, 1, 0, 1)`というリストを `0` で区切ったリスト `List(List(1), List(1, 1), List(1))` に変換したいときに使う。


```scala
  def split[A](xs: List[A], f: A => Boolean): List[List[A]] = {
    val (a, b) = xs.span((a: A) => !f(a))
    b.isEmpty match {
      case true  => List[List[A]](a)
      case false => List[List[A]](a) ++ split(b.tail, f)
    }
  }

  assert(
    split[Int](List(1, 0, 1, 1, 0, 1), _ == 0) == List(List(1), List(1, 1), List(1))
  )
```


implicit class にしておくと使いまわしやすいかも。

```scala
  implicit class SplittableList[A](list: List[A]) {
    def splitBy(f: A => Boolean): List[List[A]] = splitList(list, f)

    private def splitList(xs: List[A], p: A => Boolean): List[List[A]] = {
      val (a, b) = xs.span((a: A) => !p(a))
      b.isEmpty match {
        case true  => List[List[A]](a)
        case false => List[List[A]](a) ++ splitList(b.tail, p)
      }
    }
  }

  assert(
    List(1, 0, 1, 1, 0, 1).splitBy(_ == 0) == List(List(1), List(1, 1), List(1))
  )
```
CocoaPodsで入れたAFNetworkingが使えない

## 現象
GHUnitのテストコードとProductionのコードのビルドフェーズを分けており、GHUnit内で下記のコードを実行した場合は問題ないものの、Productionでビルドした場合だけ実行できないということが起こりました。

下記コードを実行したところ、

```objectivec:obj-c
#import <UIKit+AFNetworking.h>
// 途中省略
UIImageView *test = [[UIImageView alloc] init];
[test setImageWithURL:[NSURL URLWithString:@"http://hoge.jp"]];
```

ビルド成功した後、シミュレータが起動したところで下記のエラーとともに落ちる。

```
[UIImageView setImageWithURL:]: unrecognized selector sent to instance
```

## 対応と原因
### ビルドのセッティングを変更
1. アプリのBuild Settings → Linkng → Other Linker Flags
2. アプリの部分が空になっていたら、$(inherited)を入力
3. 再ビルド、実行

### 原因
コンパイル時のリンカ設定によるもののようです。他の人の環境で実行できて、自分だけ実行できないという場合は
ビルドの設定周りが怪しいので疑ってみると良いかもしれません。コンパイラ周りも勉強しないとな。。
#### キーワード
build setting other linker flags
ファイルシステム関数とシンボリックリンクの関係

# **操作の安全性を保証したいときに取るべき手段**

## 1. 適切な関数を用いて種類をチェックする

| | ファイル | ディレクトリ | シンボリックリンク | ネームドパイプ<br />デバイススペシャルファイル<br />UNIXドメインソケット |
|:---:|:---:|:---:|:---:|:---:|
| **[file_exists](http://www.php.net/manual/ja/function.file-exists.php)** | ○ | ○ | リンクを解決 | ○ |
| **[is_file](http://www.php.net/manual/ja/function.is-file.php)** | ○ | × | リンクを解決 | × |
| **[is_dir](http://www.php.net/manual/ja/function.is-dir.php)** | × | ○ | リンクを解決 | × |
| **[is_link](http://www.php.net/manual/ja/function.is-link.php)** | × | × | ○ | × |

## 2. これから行う操作が可能かどうかチェックする

| 読み取り可能 | 書き込み可能 | 実行可能 |
|:--:|:--:|:--:|
| **[is_readable](http://www.php.net/manual/ja/function.is-file.php)** | **[is_writable](http://www.php.net/manual/ja/function.is-writable.php)** | **[is_executable](http://www.php.net/manual/ja/function.is-executable.php)** |

なお、これらの関数は **「存在確認」+「リンクを解決」+「○○可能」** というプロセスを踏むため、 **[file_exists](http://www.php.net/manual/ja/function.file-exists.php)** 関数を併用する必要はありません。

# **実装例**

```php:読み取れるファイルかどうか判定
function is_readable_file($f) {
    return !is_dir($f) && is_readable($f);
}
```

```php:ファイルの作成・削除・アクセスが出来るディレクトリかどうか判定
function is_active_dir($d) {
    return is_dir($d) and is_writable($d) and
           PHP_OS === 'WIN32' || PHP_OS === 'WINNT' || is_executable($d);
}
```

```php:無効なシンボリックリンクであるかどうか判定
function is_invalid_link($l) {
    return is_link($l) && !file_exists($l);
}
```

# **リンクを解決しない関数一覧**

誤っているものや足りないものがあれば教えてください！

- **[is_link](http://www.php.net/manual/ja/function.is-file.php)**
- **[lchgrp](http://www.php.net/manual/ja/function.lchgrp.php)**
- **[lchwon](http://www.php.net/manual/ja/function.lchown.php)**
- **[lstat](http://www.php.net/manual/ja/function.lstat.php)**
- **[linkinfo](http://www.php.net/manual/ja/function.linkinfo.php)** (リンク解決が副作用ではなく主目的の関数なので含めます)
- **[readlink](http://www.php.net/manual/ja/function.readlink.php)** (リンク解決が副作用ではなく主目的の関数なので含めます)
- **[unlink](http://www.php.net/manual/ja/function.unlink.php)** **←要注意！**
openFrameworksパフォーマンスチューニング


## ツール等

### Instruments.app

Xcodeに付属のプロファイラ

アプリの稼働中にどの部分がボトルネックになっているかを確認できたり、頑張ればメモリリークも発見できる時がある。

自分が説明するのもアレなので詳しくは[こことか](http://tech-gym.com/2012/04/ios/732.html)…

- 得に何もしなくてもXcodeのメニューから起動できるので楽チン
- Releaseビルドになっていると関数名のシンボルが消えて何のコッチャになってしまうので注意 (最近はRelease/Debugの速度もかわらないのでずっとDebugでもいいかな、と思ってしまいます)

基本的には:

- `Product > Profile ⌘I` で起動
- `Time Profiler`を選択
- 左側の`Call Tree`のリストの中にあるチェックボックスを **上から4つ入れる**
- メソッド/関数の処理負荷の高い順にリストがソートされるので眺める

という流れです

### ofxTimeMeasurements

https://github.com/armadillu/ofxTimeMeasurements

導入が楽で素朴な機能のいい奴

- 単純な仕組みなので余分なオーバーヘッドが入りこむ余地がない
- 関数の時間など計測する時に明示的にSTART/STOPのマクロを仕込まないといけない、が、逆に変な挙動もないのでわかりやすい
- ただSTART/STOP間の時間をはかってるだけなのでDebug/Releaseビルド関係なく計測できる
- FlashとかThree.jsの左上のアレみたいな機能がついててればもっといいのだが

### 自力

```cpp
void ofApp::draw()
{
	// ....
	
	stringstream ss;
	ss << "framerate: " << ofToString(ofGetFrameRate(), 0);
	ofDrawBitmapString(ss.str(), 10, 20);
}
```

みたいな

- 何の導入もいらないので一番楽
- draw/updateの境なく1フレーム単位でのレートになるのでofxTimeMeasurementsと比較して切り分けは多少雑か
- `ofSetWindowTitle(ofToString(ofGetFrameRate(), 0));` というのもよくやるけど **60fps以上で動かす時にこれが原因でフレームレートが激落ち君になったことがあるので注意** (おそらくOS側UIアップデートでウインドウタイトル変更の処理をブロックしてしまうタイミングがあるのだと思われます)

## 方針

とりあえず自力でやるのが手間もなくていいと思いますが、ofxTimeMeasurements導入も手間としてはそんなにかわらないので最初から入れててもいいかな… という気もします。

注意点としては `ofSetVerticalSync(true);` になっていると処理がどんなに早く終わってもディスプレイの垂直同期を待ってからの描画になるので60fpsで頭打ちになります。

この場合十分に処理が早いといいのですが、何かの問題で1フレームあたりの処理にコンスタントに 1000ms/60 = 16.6666ms 以上かかってしまった場合、本来描画するはずの垂直同期に間にあわなくなり最悪次の垂直同期まで待つことになるので急にレートが30fpsまで落ちることがあります。(最近ないけど、昔はよくありました)

なので見た目のブラッシュアップまでも行かないベースシステムの開発中の時は:

```cpp
void ofApp::setup()
{
	ofSetVerticalSync(false);
	ofSetFrameRate(0);

	// ...
}
```

のような感じで垂直同期OFF、フレームレート上限無しのフリーランの状態で開発するのが処理が今どれぐらいの負荷になっているのかがfpsを見るだけで大体わかっていいので最近のマイブームです。

見た目的な部分に入ってきた場合には垂直同期が入ってないとティアリングがおきるので入れといてください


## oFローカルなパフォーマンスTIPS

- `ofGetElapsedTime()` は呼びすぎると結構処理が重い。フレームあたりで一意の時間があればいいだけであれば単純にグローバル変数にキャッシュしてそれを使ったほうがいい
- `ofToString()`、`ofSplitString()`等々も内部は`std::stringstream`を使ってたりするので結構重い。`sscanf()`は比較的高速なのでそっちにするとよい
- `ofImage::getColor()` / `ofImage::setColor()` はofColorのコピーをやりとしているので辛い。`ofImage::getPixels()`でポインタをもらってガリガリやったほうが倍ぐらい高速
- `ofMatrix4x4`も地味に最適化されてないので遅い部類。以前mat4 * vec3の計算を大量にしなければいけない時はその部分だけ[libSIMDx86](http://simdx86.sourceforge.net/)に置き換えたりしましたがかなり高速化できました。

もっとあったっけな、思い出したら追記します…
RaspberryPiでDockerを動かす


**2014/6/25 2週間ほどトライした結果、個人の見解としてはRaspberryPiでDockerを動作させるのは推奨しません。イメージビルド時に発生する大量の書き込みに対してSDカードの書き込み性能がボトルネックになること、コンテナイメージのscrap & buildに著しく時間がかかること、高負荷時にdocker自身が落ちること、公式にサポートされていないことが理由です。**

----

DockerをArchLinuxの載ったRaspberryPiで動かしてみます。


# 前提

* ArchLinuxを使用

# Dockerの導入

## Dockerインストール


```sh
pacman -Syu docker
```

## RaspberryPi用ベースイメージのダウンロード

**注意！x86_64のベースイメージは使えないのでraspbianのベースイメージを使用すること。**
単にArchLinuxで検索するとIntel用が出て来るので、`rpi`のsuffix or prefixを付けて検索するのが良さそう。
ちなみに、Intel用のベースイメージを実行すると`exec format error`と表示されて落ちます。

* [resin/rpi-raspbian](https://index.docker.io/u/resin/rpi-raspbian/)

Python入りのrpi-raspbianを利用したベースイメージはこちら。

* [missionst/rpi-pythonbase](https://index.docker.io/u/missionst/rpi-pythonbase/) resin-rpi-raspbian + python

rpi-raspbianのベースイメージをpullする。

```bash
[root@alarmpi ~]# docker pull resin/rpi-raspbian
Pulling repository resin/rpi-raspbian
3ec3d58821ee: Download complete
```

## ベースイメージの確認

```bash
[root@alarmpi ~]# docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
resin/rpi-raspbian   wheezy              3ec3d58821ee        5 months ago        160.3 MB
resin/rpi-raspbian   latest              808b368c3b55        5 months ago        178.4 MB
resin/rpi-raspbian   jessie              01992f5cb20d        6 months ago        175.7 MB
```

## rpi-raspbianを試してみる

```bash
[root@alarmpi ~]# docker run -i -t resin/rpi-raspbian:wheezy /bin/bash
root@34f142e42d13:/# whoami
root
root@34f142e42d13:/# hostname
34f142e42d13
```

動いた！

----

参考

* [DockerのArchLinux向けガイド](http://docs.docker.io/installation/archlinux/)
* [Docker on Raspberry Pi in 4 Simple Steps](http://resin.io/blog/docker-on-raspberry-pi-in-4-simple-steps/)
俺のlogrotate.conf

gzipで圧縮より、若干圧縮率悪くても超高速なlzopの方が好みなので変更しているだけ。

```shell-session
$ sudo yum install lzop
```

設定はこれだけ。

```shell-session
$ grep ^compress /etc/logrotate.conf
compresscmd /usr/bin/lzop
compressoptions -U
compressext .lzo
```
golangでテキストファイルを1行ずつ読んで配列（スライス）に詰め込む

```go
package main

import (
  "bufio"
  "fmt"
  "os"
)

func main() {
  lines := fromFile("hoge.txt")
  fmt.Printf("lines: %v\n", lines)
}

func fromFile(filePath string) []string {
  // ファイルを開く
  f, err := os.Open(filePath)
  if err != nil {
    fmt.Fprintf(os.Stderr, "File %s could not read: %v\n", filePath, err)
    os.Exit(1)
  }

  // 関数return時に閉じる
  defer f.Close()

  // Scannerで読み込む
  // lines := []string{}
  lines := make([]string, 0, 100)  // ある程度行数が事前に見積もれるようであれば、makeで初期capacityを指定して予めメモリを確保しておくことが望ましい
  scanner := bufio.NewScanner(f)
  for scanner.Scan() {
    // appendで追加
    lines = append(lines, scanner.Text())
  }
  if serr := scanner.Err(); serr != nil {
    fmt.Fprintf(os.Stderr, "File %s scan error: %v\n", filePath, err)
  }

  return lines
}
```

## Memo
* 改行区切りのテキストデータの読み込みは`bufio.Scanner`が便利なので使うべし
    * "Scanner provides a convenient interface for reading data such as a file of newline-delimited lines of text." 
* 空要素のスライスを用意し、`append`で読み込んだ行内容を順次追加する
* ファイルのクローズは関数return時に(確実に)行いたいので`defer`で呼ぶ。関数が長くなってreturnが複数箇所に存在するような場合に有用
    * defer指定処理が実行されるのは`return`時のみで、`os.Exit(1)`した場合は実行 __されない__ ので注意
日本語表記の日時をTimeオブジェクトに変換（Time.strptimeメソッド）

残念ながら（`require 'time'`してから）`Time.parse`しても日本語表記の日時は理解してくれません。西洋圏の表記はかなり理解してくれるんですけどねぇ。
ので`Time.strptime`を使います。
なお、`DateTime.strptime`および`Date.strptime`でも使用するフォーマットは全く同じです。
#例

```ruby
Time.strptime("2014年 6月 3日 19:20", "%Y年 %m月 %d日 %H:%M")
=> 2014-06-03 19:20:00 +0900
Time.strptime("2014年 6月23日 19:20","%Y年 %m月 %d日 %H:%M")
=> 2014-06-23 19:20:00 +0900
```
パースしたい文字列とフォーマット文字列を引数に与えるとTimeオブジェクトに変換してくれます。
さて。ここでは" 6月 3日"という空白付き月日表記が問題になります。詳しくは下で解説します。
#解説
##るりまなど確認
るりまではstrptimeの基本が`Date.strptime`なので、これを参照してみます。
>##singleton method `Date.strptime`

>```ruby
strptime(str = '-4712-01-01', format = '%F') -> Date
```
与えられた雛型で日付表現を解析し、 その情報に基づいて日付オブジェクトを生成します。
`Date._strptime` も参照してください。 また `strptime`(3)、および `Date#strftime` も参照してください。

>[PARAM] str: 日付をあらわす文字列
[PARAM] format: 書式
[singleton method Date.strptime](http://rurema.clear-code.com/1.9.3/method/Date/s/strptime.html)

フォーマットはUNIXの`strptime`に依存するので、そこを確認します。

>#STRPTIME
##名前
strptime - 文字列であらわされている時間を tm 構造体の時間に変換する  
##説明
strptime() 関数は strftime(3) の逆関数である。

>個々のフィールドディスクリプターは **% とそれに続く文字** からなり、 後者にフィールドディスクリプターを置き換える内容を指定する。 format 文字列中の **他の全ての文字には、入力文字列にマッチする文字がなければならない** 。 フォーマット文字列中にある **空白は例外であり、 入力文字列中の 0 個以上の空白とマッチする** 。 2 つのフィールドディスクリプターの間には、 空白・英字・数字がなければならない。
strptime() 関数は、入力文字列を左から右へ処理する。 入力された **3 つの要素 (空白・文字・フォーマット) は、順に処理される** 。 入力がフォーマット文字列とマッチできない場合、関数は停止する。 残りのフォーマット文字列と入力文字列は処理されない。

>（引用者註：強調部分は引用者による。フィールドディスクリプターは省略。）
[Man page of STRPTIME](http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/strptime.3.html)

フィールドディスクリプタは、例えば`%Y`, `%m`, `%d`というやつですね。他にもいろいろありますので、上記サイトまたは[Time#strftime](http://rurema.clear-code.com/1.9.3/method/Time/i/strftime.html) / [Date#strftime](http://rurema.clear-code.com/1.9.3/method/Date/i/strftime.html)をご確認ください。
##今回の例を確認
今回あげた例では、月と日が一桁の場合に空白が入っています。
空白がなく *"06月03日"* となっていれば

```ruby
Time.strptime("2014年06月03日 19:20","%Y年%m月%d日 %H:%M")
=> 2014-06-03 19:20:00 +0900
```
となるので悩まなかったのですが、 *" 6月 3日"* なんです。
空白付き月日の文字列を対象に同じフォーマットで実行すると

```ruby
Time.strptime("2014年 6月 3日 19:20","%Y年%m月%d日 %H:%M")
ArgumentError: invalid strptime format - `%Y年%m月%d日 %H:%M'
```
とエラーを返します。
ここで、引用した
>フォーマット文字列中にある空白は例外であり、 入力文字列中の 0 個以上の空白とマッチする。 

というのが効いてきます。
つまり正規表現的に表現すると、空白`_`が`_*`に相当します。（空白の代わりにアンダースコアを使いました）。
なので`"2014年 6月 3日"`にマッチするフォーマットは、最初の例で書いたように`"%Y年 %m月 %d日"`になります。
##分の部分にも空白が入ると
分の部分も空白入りで表記している場合には、フォーマットの分の部分に空白を使えば大丈夫です。

```ruby
Time.strptime("2014年 6月 3日  7: 5","%Y年 %m月 %d日 %H: %M")
=> 2014-06-03 07:05:00 +0900
```
見た目が奇妙だから、これはまずないでしょうけどね^_^。
ちなみに、文字列" 7: 5"の直前にも空白が入って（"__7:_5"）空白が2つ連なっているのですが、もともとのフォーマットで%H直前に空白が入っているので、 *0個以上の空白* とマッチしてくれています。
クレカ会社判別正規表現

spreeのソース読んでて、へーと思ったのでメモ。


```rb
CARD_TYPES = {
      visa: /^4[0-9]{12}(?:[0-9]{3})?$/,
      master: /(^5[1-5][0-9]{14}$)|(^6759[0-9]{2}([0-9]{10})$)|(^6759[0-9]{2}([0-9]{12})$)|(^6759[0-9]{2}([0-9]{13})$)/,
      diners_club: /^3(?:0[0-5]|[68][0-9])[0-9]{11}$/,
      american_express: /^3[47][0-9]{13}$/,
      discover: /^6(?:011|5[0-9]{2})[0-9]{12}$/,
      jcb: /^(?:2131|1800|35\d{3})\d{11}$/
    }
```

https://github.com/spree/spree/blob/master/core/app/models/spree/credit_card.rb

試してないから本当に正しいのかわからない。
spreeから外れるときにもしかしたら使うかも。
TCPClientはアプリケーション終了時にFINを送信しない

# WPFでアプリケーションを終了するとき、相手にRSTを送信する

TCPClientでコネクションを確立させた後、おもむろにアプリケーションを閉じると、通信回線上ではRSTが送信されます。これはTCPの仕様上きれいな終わり方ではないようです。

http://www.wdic.org/w/WDIC/RST%E3%83%91%E3%82%B1%E3%83%83%E3%83%88

# WPFでアプリケーションを終了するときに、相手にFINを送信するようにする

WPFアプリケーションはクローズボタンが押された後、いくつかのイベントが発生してから完全に終了します。

http://msdn.microsoft.com/ja-jp/library/ms748948(v=vs.110).aspx

Windows Form アプリではリソースの解放を行うのに Disposed イベントがあったのですが、WPFには無いようなので、Closed イベントを代替メソッドとして TCPClient.Close()を呼ぶようにします。

そうすると、アプリ終了時にTCPClientもクローズされるので、めでたくFINパケットが送信されます。

# Shutdownは? 呼ばなくていいの?

TCPClient.Close()を呼ぶと、内部的にDispose()が呼ばれます。Dispose()の中でSocketのInternalShutdownメソッドを呼んでおり、その中でShutdownメソッドを呼んでいるようです(想像なので、もしかしたら違うかも)

http://referencesource.microsoft.com/#System/net/System/Net/Sockets/Socket.cs#c84007a498b38b5f

ですので、TCPClient.Close()が呼び出されれば、内部的に正常に処理されるので安心してください(想像)

# この件から私が得るべき教訓

何の調査もせず、実際の動きから想像でものをいうと、本来のあるべき姿とは別の方向に読者さんを導いてしまうので、ある程度調査した後にレポートすべきですね。今回は多くの方々に混乱を与えてしまったことをここにお詫びします。
YesodのForm(Applicative, Monadic)でモデルに表示したくないフィールドがあった時

##はじめに
正直言ってこれはバッドノウハウなんじゃないかと個人的に思ってるので、もっといい方法があったり、いやこれでいいってなことがあったらコメントで教えていただきたく……
##困ったこと
YesodにはApplicative FormやMonadic Formといったモデルを指定すればほとんどのフォーム関連の処理をよしなにしてくれるという素敵な機能がありますが、フォームの定義時にモデル内のすべてのフィールドを何らかの形でフォームにすることを要求されます。ということは、モデル内にユーザには表示したくない隠しフィールドみたいなのが存在するとそれも何らかの形でフォームの中に生成しないといけないような感じになってしまいます。

たとえば、Modelないでこのように定義されたモデルがあったとします。

```
Model
  something Text
  hidden Bool
```

フォームはこんな感じにします。すると、秘密にしておきたいBoolのフィールドも丸見えになってしまいます……

```hs:form.hs
addMemberForm affiliations extra = do 
  (firstNameResult, firstNameView) <- mreq textField "なんか" Nothing
  (hiddenResult, hiddenView) <- mreq boolField "秘密のBool" Nothing --これを表示したくないけどユーザ側の変更では常時Falseになっててほしい
  let result = Member
          <$> firstNameResult
          <*> hiddenResult
      widget = $(widgetFile "template")
  return (result, widget)
```

最初にフォームの中でそのフィールドを埋め込まなければいいのかなと思ったのですが、そうするとPostで値を送信した時に初期値になる値が欠落してしまってダメっぽいので諦めました。

##若干怪しい解決
しょうがないのでこのように解決しました。
Yesodのフィールドのソースを読んで、その真似をした常時Boolを返すフィールドを作る

```hs:form.hs

alwaysFalseField :: Monad m => RenderMessage (HandlerSite m) FormMessage => Field m Bool
alwaysFalseField = Field
      { fieldParse = \_ _ -> return $ Right $ Just False
      , fieldView = \_ _ _ _ _ -> [whamlet| |]
      , fieldEnctype = UrlEncoded
                                    }
```

そして、さっきの秘密のフィールドを定義するときにこのフィールドを使いました。

```hs:form.hs

  (hiddenResult, hiddenView) <- mreq alwaysFalseField "秘密のBool" Nothing --これを表示したくないけどユーザ側の変更では常時Falseになっててほしい

```

一応この方法で常時初期値を返す秘密のフォームを作ることは出来ました。しかしこれがいい方法とも思えないのでご指摘お待ちしています……
PyCrypto で OpenSSL AES-256-CBC の暗号文を復号

OpenSSL 1.0.1g の EVP_BytesToKey() を読みながらテスト
Python 2.6.6, PyCrypto 2.0.1

## 暗号文作成

まずは openssl コマンドで暗号文を作成。パスワードは password

```console
$# ターミナルに出力するため BASE64 エンコードしている
$ echo 'This is plain text !' | openssl aes-256-cbc -e -k password | openssl base64 -e
U2FsdGVkX1/Ab5WcN6HAN6ppt5YvoqTzD2VuQBbtmLIzAeTkYZFRUjtjwu/M5oMO
```

## 復号処理

PyCryto の AES で復号する

```py
import base64
from hashlib import md5
from Crypto.Cipher import AES

encoded = 'U2FsdGVkX1/Ab5WcN6HAN6ppt5YvoqTzD2VuQBbtmLIzAeTkYZFRUjtjwu/M5oMO'
encrypted = base64.b64decode(encoded)
print 'encrypted: '+ repr(encrypted)
## encrypted: 'Salted__\xc0o\x95\x9c7\xa1\xc07\xaai\xb7\x96/\xa2\xa4\xf3\x0fen@\x16\xed\x98\xb23\x01\xe4\xe4a\x91QR;c\xc2\xef\xcc\xe6\x83\x0e'

# Salted__ に続く 8 バイトが salt
salt = encrypted[8:16]
print 'salt: '+ repr(salt)
## salt: '\xc0o\x95\x9c7\xa1\xc07'

secret = 'password'
# 簡略化しているが、OpenSSL の KDF の真似
hash1 = md5(secret + salt)
hash2 = md5(hash1.digest() + secret + salt)
hash3 = md5(hash2.digest() + secret + salt)
key = hash1.digest() + hash2.digest()
iv = hash3.digest()
print 'key: '+ repr(key)
print 'iv: '+ repr(iv)
## key: "\x1e\xfdh\xb0_\x05\xe1\x83x\xa5\xfe\x1d8&E#<'\x9f\xaf\x0e\xcba\x12\\KX\x897X\x90\x0c"
## iv: '4-\\iNh-\xc7\x99\tg\xe2\xbb\xcd\x12\xf5'


cipher = AES.new(key, AES.MODE_CBC, iv)
## salt を除いたデータを decrypt する
decrypted = cipher.decrypt(encrypted[16:])
print 'decrypted: '+ repr(decrypted)
print 'original: '+ repr(decrypted[0:-ord(decrypted[-1])])
## decrypted: 'This is plain text !\n\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b'
## original: 'This is plain text !\n'
```


## 参考文献

* EVP_BytesToKey(3)
* http://alpha.mixi.co.jp/2007/10639/
* http://www.deusty.com/2009/04/decrypting-openssl-aes-files-in-c.html
* http://stackoverflow.com/questions/12562021/aes-decryption-padding-with-pkcs5-python
PHP製軽量CMS『elgg 1.9』を試してみた

# elggって何？

FacebookのようなSNSサイトを構築・管理できます。PHP製のCMS（コンテンツ管理システム）、てことになるのかな。同種のものとしては Joomla! や OpenPNE があります。日本ではあまり普及してないようですが、カスタマイズ性の高さと、軽量で高速な動作をすることから、海外では結構人気のようです。

elgg公式サイト
http://elgg.org/

# elgg 1.9 の新機能、レスポンシブ

事前に聞いていた話ではレスポンシブ対応（＝モバイル対応）されるとのことだったので、ひそかにそこだけ期待してました。（他にも新機能あるんだろうけど、わかり次第追記します）

さて elgg 1.9.0-rc.1 が 2014.05.25 にリリースされたようなので、早速インストールしてみました。

デスクトップ表示はこんな。相変わらずのシンプル・イズ・ベスト。
![elgg1.9_desk.png](https://qiita-image-store.s3.amazonaws.com/0/36751/d138ee98-87f2-c83c-c6ef-6827b4482ce7.png)

そしてモバイル表示。おぉ、さらにシンプル！
![elgg1.9_mobi.png](https://qiita-image-store.s3.amazonaws.com/0/36751/50e76790-cbdb-c6a7-08eb-69284753b654.png)

# レスポンシブ設定

ただし、初期状態ではレスポンシブではないので、管理画面のプラグインから「Aalborg Theme 1.9」というテーマを有効化してあげる必要があります。（最初から同梱されてます）
![elgg1.9_responsive.png](https://qiita-image-store.s3.amazonaws.com/0/36751/1114a097-c870-a9aa-6779-3214e7fb7321.png)

# elgg 1.9 インストール方法

（おいおい追記予定）
Azure websitesのFTP認証情報の調べ方

1. Dashboardの右にあるDownload publish profileをクリック
2. ダウンロードされたxml中にpublishProfileというタグが複数ある。このうち、publishMethod="FTP"となってるものの、publishUrl, userName, userPWDがFTPのために利用できる

参考URL: http://weblogs.asp.net/bleroy/azure-web-sites-ftp-credentials
hubot-scriptのredmine.coffeeでRedmineと連携する

hubot-script の redmine.coffe で Redmine と連携するところまで。
HUBOT は既に作成済という状況から始めます。

- [HUBOT](https://hubot.github.com/)
- [github/hubot](https://github.com/github/hubot)
- [github/hubot-scripts](https://github.com/github/hubot-scripts)

## package.json に hubot-script を追加

package.json に hubot-scripts が記載されていない場合は追記してください。
デフォルトで記載されているので削除してなければ追加されているはずです。

```json:package.json
...

 "dependencies": {
    "hubot": ">= 2.6.0 < 3.0.0",
    "hubot-scripts": ">= 2.5.0 < 3.0.0"
  },

...
```

## hubot-scripts.json に redmine.coffe を追加

hubot-scripts.json に redmine.coffe を追加します。

```coffeescript:hubot-scripts.json
["redis-brain.coffee", "tweet.coffee", "redmine.coffee"] 
```

## Redmine を設定

Redmine の API を利用できるように設定します。

1. REST-API を許可する

    [管理] > [設定] > [認証] > [RESTによるWebサービスを有効にする] にチェックを入れて保存

2. API アクセスキーを取得

    [個人設定] > [API アクセスキー] を表示しメモ
    発行していない場合は新規発行する

## HUBOT に Redmine と連携するための設定を追記

HUBOT を実行するファイルに Redmine と連携するための設定を記載します。
ここでは bin/hubot に記載してます。

```shell-session:bin/hubot
#!/bin/sh

#npm install
export PATH="node_modules/.bin:node_modules/hubot/node_modules/.bin:$PATH"

# Redmine Configurations
#export HUBOT_REDMINE_SSL=""
export HUBOT_REDMINE_BASE_URL="http://my-redmine-url"
export HUBOT_REDMINE_TOKEN="***************************(your API access key)"
export HUBOT_REDMINE_IGNORED_USERS=""

exec node_modules/.bin/hubot "$@"
```

- （追記） `HUBOT_REDMINE_BASE_URL` が 非SSL の場合は `HUBOT_REDMINE_SSL` はコメントアウトしてください。
    - [コメント](https://qiita.com/kseta/items/978dce4bfe0c8016b233#comment-852a9ecca419f0d6b0f1) でご指摘ありがとうございます。

以上で設定完了です。

## 動作確認

```shell-session:console
$ cd hubot
$ ./bin/hubot

...

#  Issue ID : 21212 の場合
Hubot> hubot show me #21212

....
```

動作確認のサンプルコマンドでは `hubot show me <issue-id>` を使いました。
その他のコマンドは [redmine.coffee](https://github.com/github/hubot-scripts/blob/master/src/scripts/redmine.coffee) から読み取るか `hubot help` を実行して確認してください。
GNU Emacs Lispリファレンスマニュアル

# ほぼリンクだけですが…

* GNU Emacs Lispリファレンスマニュアル(トップ)
http://www.bookshelf.jp/texi/elisp-manual/21-2-8/jp/elisp.html

* GNU Emacs Lispリファレンスマニュアル(目次)
http://www.bookshelf.jp/texi/elisp-manual/21-2-8/jp/elisp_toc.html#SEC_Contents

```text:引用
このinfoファイルは、GNU Emacs Lispマニュアル 2.9版であり、GNU Emacs 21.3版に対応します。

旧版の翻訳である elisp-manual-20-2.5-jp.tgz を参考に最新版の変更点を追加しています。元文書の翻訳をされた方々に深く感謝いたします。

また、「コメント」と書いてある部分は私が追加した部分です。また、分かりにくい部分などは原文の意味を曲げない範囲で、加筆を行っています。

またこの文書は原文のライセンスを継承しますので、再配布、コピー、変更などはすべて自由にしていただいて構いません。
```

# 参考 (さらにリンク)

* [GNU Emacsマニュアル](http://www.bookshelf.jp/texi/emacs-man/21-3/jp/emacs.html) ( [目次](http://www.bookshelf.jp/texi/emacs-man/21-3/jp/emacs_toc.html#SEC_Contents) )

* [Emacs Lisp プログラミング](http://www.bookshelf.jp/texi/emacs-lisp-intro-jp/eintro.html) ( [目次](http://www.bookshelf.jp/texi/emacs-lisp-intro-jp/eintro_toc.html#SEC_Contents) )

# Lispの歴史 (GNU Emacs Lispリファレンスマニュアルより)

[Lispの歴史](http://www.bookshelf.jp/texi/elisp-manual/21-2-8/jp/elisp_2.html#SEC8)
　 **Lisp（LISt Processing language、リスト処理言語）は、 人工知能の研究向けに1950年代末にMITで初めて開発されました。 Lisp言語はとても強力なので、 エディタコマンドを記述するなどの他の目的にも理想的なのです。**
　長年にわたって何ダースものLispが実装されており、 それぞれが独自の特徴を有しています。 その多くは、1960年代のMITのMACプロジェクトで開発されたMaclispの 影響を受けています。 最終的には、Maclispの系統の実装者達は共同して、 Common Lispと呼ばれるLispシステムの規格を開発しました。 そうこうするうちに、MITのGerry SussmanとGuy Steeleは、 単純化してあるが非常に強力なSchemeと呼ばれるLispの方言を開発しました。
　GNU EmacsはMaclispの影響を強く受けていますが、 Common Lispからの影響は少ないです。 **Common Lispを知っている読者は、 Common Lispとの多くの類似点に気づかれるでしょう。 しかしながら、Common Lispの多くの機能は、 省いてあるか、単純化してあります。 これは、GNU Emacsが必要とするメモリ量を削減するためです。** ときには、劇的に単純化してあるために、 Common Lispユーザーは混乱するかもしれません。 GNU Emacs LispとCommon Lispとの相違点は、 ことあるごとに指摘するつもりです。 Common Lispを知らない読者は、何も心配することはありません。 本書は自己完結しています。
　 **`cl'ライブラリにより、Common Lispをかなりエミュレートできます。**
　Emacs LispはSchemeの影響をまったく受けていません。 しかし、GNUプロジェクトには、Guileと呼ばれるSchemeの実装があります。 拡張が必要なすべての新たなGNUソフトウェアではGuileを使います。
virtio 環境で systemd v213 に上げるときの注意点

systemd v213 に上げてリブートすると network interface の名前が変わり得る。

systemd はデフォルトで [PredictableNetworkInterfaceNames](http://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/) という機能が有効になっており、eth0, eth1 のような名前から enp0s25, wlp2s0, ens3 のような固有の永続的な名前に起動時にリネームする。ところが、v213 から virtio 環境での名前の付け方が変わり、固有の名前がつかなくなって従来の eth0, eth1 のような名前のままになった。おそらくこのコミット。
http://cgit.freedesktop.org/systemd/systemd/commit/?id=bf81e792f3c0aed54edf004c1c95cc6f6d81d0ee
自分はさくらの VPS でこれに遭遇した……
プログラマも知っておきたいウェブマーケティング用語集（随時更新）


ウェブ系の会社にいると、プログラマも必然的にウェブマーケティングに関わることになります。おそらく。

ということで、がちがちのプログラマでも最低限知っておきたいウェブマーケティング用語をまとめていきます。

随時更新なので、はじめは控えめで。


#A

## ABテスト
_えーびーてすと_

ページ上の画像（バナー、ボタン）やテキストを置き換えた複数のパターンを試し、どれが一番効果的（収益に貢献するか）を選ぶためのテストのこと。

例えば、「お問い合わせフォームで、緑とオレンジのどちらのボタンの方がクリックされる確率が高いか？？」という実験をしたりするが、これがABテスト。

ABテストという割に、 **3種類以上のパターンでテストすることもあるので、ABCテスト、ABCDEFGHIテストなどともいう**。

世の中には様々なABテストサービスがあり、
代表格は、google analytics の「ウェブテスト」機能。
なんとこれが無料（！）。
他にも"Optimizely"などの有料テストツールがある。

参考
[初心者でも出来る！Googleアナリティクス「A/Bテスト」設定マニュアル](
http://www.find-job.net/startup/ga_abtest)

[A/Bテストを簡単にWebサイトやアプリに実装するツールまとめ](
http://matome.naver.jp/odai/2135722241578457401)


[【ケース別】A/Bテストツール徹底比較 Optimizely vs planBCD vs Visual Website Optimizer](
http://www.assion.co.jp/blog/optimizely-vs-planbcd-vs-visualwebsiteoptimizer/)

#C

##CV
_こんばーじょん、しーぶい_

購買、登録、問合せなど、何らかの成果発生のことを指す。
多くの場合、CVの数が売上げに直結するため、ウェブマーケティングで最重要の指標とされている。

最頻出用語で、慣れてくるとついつい業界外の人にも使ってしまうが、大抵の人はCharacter Voice（声優）の略かと思うか、コンテキストから類推して分かったふりをするかのどちらかである。


[Wikipedia　CV](http://ja.wikipedia.org/wiki/CV)


## CPA
_しーぴーえー_

Cost Per Acquisition または Cost Per Action のこと。
日本語にすると、「成果獲得一件あたりにかける費用」とでも言えよう。
Acquisition （顧客獲得）と、Action（行動）でちょっと意味が違うらしいが、あんまり深い所は気にしなくていい。

例えば500円のボールペンを800円かけて売ったら（CPA=800円）、これは赤字。CPAが下がるほど「獲得効率が良い」ということになる。

CVは増やすべきだが、CPAは減らすべきもの。

http://e-words.jp/w/CPA.html

#S

## SEO
_えすいーおー_

Search Engine Optimization（検索エンジン最適化）のこと。
あるキーワードで検索した時に、なるべく上位に表示させようと対策をすること。つまり、google に媚を売ること。

ウェブサイトコーディングの時は、meta タグの記述、正しい文書構造でHTMLを記述するなど、最低限のSEO対策はやっておこう。

コンテンツを増やしたり、いろんなところからリンクをもらったりすると、順位が上がる傾向にある。逆に、ある日突然、順位が大幅に下がる時もある。

[SEO対策｜検索上位を独占するために弊社が行っている36の手順](
http://bazubu.com/seo-13666.html)
壊れたロボット２

　ああああああああ！！２週目だというのに無限ループですよ！！なんの条件みすったのか・・・グラフから脱出出来なくなってる・・・

```java:
public class Main {
	boolean[][] grid = new boolean[51][51];
	int[] xMove = new int[]{1, -1, 0, 0};//xの進む距離
	int[] yMove = new int[]{0, 0, -1, 1};//yの進む距離
	double[] dir;
	
	double dfs(int n, int x, int y, double prob) {
		System.out.println(n + "ステップ目");
		double ret = 0;
		if(grid[x][y]) {
			//System.out.println("We had already visited.");
			return(0);//既に訪れたならばその連続確率は０となる
		}
		if(n == 0) {
			return(prob);//成功した事になるので、連続確率はprobで良い
		}
		System.out.println(x + ", " + y);
		for(int r = 0; r < 4; r++) {
			grid[x][y] = true;
			ret += dfs(n - 1, x + xMove[r], y + yMove[r], prob * dir[r]);
			grid[x][y] = false;
		}
		return(ret);
	}
	
	
	public double getProbability(int n, int east, int west, int south, int north) {
		dir = new double[]{((double)east)/100.0, ((double)west)/100.0, ((double)south)/100.0, ((double)north)/100.0};
		return(dfs(n, 25, 25, 1));
	}
	
	void doIt() {
		int n = 14;
		//以下２ケースにおいて無限ループ
		int x = 2, y = 2, z = 0, r = 0;
		//int x =1, y =1, z =1, r = 1;
		int east = 25*x, west = 25*y, south = 25*z, north = 25*r;
		System.out.println(getProbability(n, east, west, south, north));
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Main().doIt();
	}

}
```
　
　頑張らないとマズいなぁ・・・。７/11日ICPCあるのに・・・
cocos2dx 3.0 プロジェクト作成コマンド


3.0から追加されたcocosコマンドの使い方。
ふつーに忘れるのでメモ。

参考URL:http://blog.syuhari.jp/archives/2626


```
$ cocos new HogeGame -p com.HogeGame -l cpp -d ~/
```

引数はそれぞれ下記になります。

new : HogeGame がプロジェクト名
-p : Android のパッケージ名
-l : 言語、cpp lua js を指定可能
-d : プロジェクトを作成するディレクトリのパス
「プログラムでシダを描画する」をGroovyでやってみた

# 説明とか
恐らく震源地
[プログラムでシダを描画する - 強火で進め](http://d.hatena.ne.jp/nakamura001/20140505/1399316565)
たぶんきっかけ
[プログラムでシダを描画する](http://qiita.com/woxtu/items/30aebcf15770c438d6fd)
先達の皆様
[「プログラムでシダを描画する」一覧](http://qiita.com/qt-luigi/items/b22204c7ef73260324bd)

正直Groovy素人ですゆえ、ちっともGroovyらしくないかもしれませんがご容赦を。

\# 実は最初Ruby+GDで組んでたけどもたもたしてたらRuby版が上がってたのでGroovyで書き直したというのは内緒だ

# 生やしてみる
```groovy:drawfern.groovy
import java.awt.Color
import java.awt.image.BufferedImage
import java.io.File
import java.util.Random
import javax.imageio.ImageIO

class Fern {
  def W1x = { x, y -> 0.836 * x + 0.044 * y }
  def W1y = { x, y -> -0.044 * x + 0.836 * y + 0.169 }
  def W2x = { x, y -> -0.141 * x + 0.302 * y }
  def W2y = { x, y -> 0.302 * x + 0.141 * y + 0.127 }
  def W3x = { x, y -> 0.141 * x - 0.302 * y }
  def W3y = { x, y -> 0.302 * x + 0.141 * y + 0.169 }
  def W4x = { x, y -> 0 }
  def W4y = { x, y -> 0.175337 * y }
  
  def drawer
  def rnd
  
  Fern() {
    rnd = new Random()
  }
  
  def f(k, x, y) {
    if (0 < k) {
      f(k - 1, W1x(x, y), W1y(x, y))
      if (rnd.nextDouble() < 0.3)
        f(k - 1, W2x(x, y), W2y(x, y))
      if (rnd.nextDouble() < 0.3)
        f(k - 1, W3x(x, y), W3y(x, y))
      if (rnd.nextDouble() < 0.3)
        f(k - 1, W4x(x, y), W4y(x, y))
    } else {
      drawer(x, y)
    }
  }
  
  def sprout(n, clos) {
    drawer = clos
    f(n, 0, 0)
  }
}

class FernCanvas {
  def width
  def height
  def allowed
  def img
  def fernColor = new Color(0.0F, 0.5F, 0.0F)
  
  FernCanvas(size, padding) {
    width = size
    height = size
    allowed = size - padding
    img = new BufferedImage(
            width, height, BufferedImage.TYPE_INT_RGB)
    def g = null
    try {
        g = this.img.createGraphics()
        g.setColor(Color.WHITE)
        g.fillRect(0, 0, width, height)
    } finally {
        if (g != null) {
            g.dispose()
        }
    }
  }
  
  def plot(x, y) {
    def plotX = (int)( x * allowed + width * 0.5)
    def plotY = (int)( height - y * allowed)
    img.setRGB(plotX, plotY, fernColor.getRGB())
  }
  
  def save_png_to(fileName) {
    ImageIO.write(img, "PNG", new File(fileName));
  }
}

def N = 20

canvas = new FernCanvas(500, 10)
new Fern().sprout(N) { x, y ->
  canvas.plot(x, y)
}
canvas.save_png_to("fern.png")
```

![fern.png](https://qiita-image-store.s3.amazonaws.com/0/41893/70ca11a0-4246-b546-8d4f-46fb88bb9797.png)

# 我ながら
drawer = clos　の辺りがなんかキモいですorz
Java nio対応 ファイルコピー

ファイルコピーのJava1.5以降対応版。


```java:FileUtil.java
	/**
	 * NIOチャネルを使って高速にコピーします。
	 * @param srcPath コピー元パス
	 * @param dstPath コピー先パス
	 * @throws IOException IOエラー
	 */
	public static void copy(final String srcPath, final String dstPath) throws IOException {
		FileChannel srcChannel = new FileInputStream(srcPath).getChannel();
		FileChannel destChannel = new FileOutputStream(dstPath).getChannel();
		try {
			srcChannel.transferTo(0, srcChannel.size(), destChannel);
		} finally {
			srcChannel.close();
			destChannel.close();
		}
	}
	
	/**
	 * NIOチャネルを使って高速にコピーします。
	 * @param src コピー元パス
	 * @param dst コピー先パス
	 * @throws IOException IOエラー
	 */
	public static void copy(final File src, final File dst) throws IOException {
		FileChannel srcChannel = new FileInputStream(src).getChannel();
		FileChannel destChannel = new FileOutputStream(dst).getChannel();
		try {
			srcChannel.transferTo(0, srcChannel.size(), destChannel);
		} finally {
			srcChannel.close();
			destChannel.close();
		}
	}
ファイルの更新を監視してTeX文書を自動ビルド

以下のファイルがあったとして、

- `main.tex`
- `main.bib`

PDFを生成するには、

1. `platex main`
2. `pbibtex main`
3. `platex main`
4. `platex main`
5. `dvimdfmx main`

を実行する。

これをファイルの変更に応じて自動で実行したい。

ただし、2〜4が不要な場合はスキップしたい。そんな`Rakefile.rb`がこれ↓。

```Rakefile.rb
require 'rake'
require 'rake/clean'

PAPER = 'main'
LATEX = 'platex -kanji=utf8'
BIBTEX = 'pbibtex -kanji=utf8'
DVIPDFM = 'dvipdfmx'
ZIP = 'zip'

task :default do
  Rake::Task[:clean].execute
  Rake::Task[:latex].execute
  Rake::Task[:bibtex].execute
  Rake::Task[:latex].execute
  Rake::Task[:latex].execute
  Rake::Task[:dvipdfm].execute
end

task :latex do
  sh("#{LATEX} #{PAPER}")
end

task :bibtex do
  sh("#{BIBTEX} #{PAPER}")
end

task :dvipdfm do
  sh("#{DVIPDFM} #{PAPER}")
end

task :archive do
  sh("#{ZIP} -r #{PAPER}.zip *")
end

task :watch do
  require 'watchr'
  require 'digest/md5'

  executor = Class.new {
    def submit(path, &task)
      current_hash = Digest::MD5.file(path).to_s
      @hashes ||= {}
      if @hashes[path] != current_hash
        task.call()
        @hashes[path] = current_hash
      end
    end
  }.new

  script = Watchr::Script.new

  script.watch "#{PAPER}.tex" do
    executor.submit "#{PAPER}.tex" do
      Rake::Task[:latex].execute
      executor.submit "#{PAPER}.aux" do
        Rake::Task[:bibtex].execute
        Rake::Task[:latex].execute
        Rake::Task[:latex].execute
      end
      Rake::Task[:dvipdfm].execute
    end
  end

  script.watch "#{PAPER}.bib" do
    executor.submit "#{PAPER}.bib" do
      Rake::Task[:latex].execute
      Rake::Task[:bibtex].execute
      Rake::Task[:latex].execute
      Rake::Task[:latex].execute
      Rake::Task[:dvipdfm].execute
    end
  end

  Watchr::Controller.new(script, Watchr.handler.new).run
end

CLEAN.include(%w{aux log dvi bbl blg toc lof lot fdb_latexmk fls out bb xbb DS_Store}.map{|e|"**/*.#{e}"}+['**/.DS_Store'])
CLOBBER.include("#{PAPER}.pdf")
```

`rake watch`で監視開始します。
MySQLのバイナリログを数時間単位で削除する

通常、MySQLのbinlogは`expire_logs_days`で指定した日数を超えたものを削除しているでしょう。
ただ、それでは1日より細かい単位での指定はできません。
もし数時間単位で消したい場合は`PURGE MASTER LOGS`構文を使います。

#####指定したbinlog以前を削除
```
PURGE MASTER LOGS TO 'mysql-bin.010000';
```
mysql-bin.010000以前のbinlogを削除。

#####指定した日時以前を削除
```
PURGE MASTER LOGS BEFORE '2014-06-25 22:46:26';
```
2014年06月25日22時46分26秒以前のbinlogを削除。

ただこれでは直接指定なのでバッチ処理には向かない。

###指定した時間より古いbinlogを削除
```
PURGE MASTER LOGS BEFORE NOW() - INTERVAL 3 HOUR;
```
3時間以上経ったbinlogを削除。ちなみにDAYでもできるらしい。
これを使って以下のような簡単なスクリプトを作ってcronに登録します。

```purge.sql
FLUSH LOGS;
PURGE MASTER LOGS BEFORE NOW() - INTERVAL 3 HOUR;
```
```purge.sh
mysql -uroot < purge.sql
```
```cron
30 * * * * /usr/local/sbin/purge.sh
```
binlogは基本的にバックアップマシンで保存しているのでライトに削除。
これで例え大量にアクセスのくるデータベースでも繊細な容量管理ができますね。

####参考
MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.6.1.1 PURGE MASTER LOGS 構文
http://dev.mysql.com/doc/refman/5.1/ja/purge-master-logs.html
logging - Can expire_logs_days be less than 1 day in MySQL? - Server Fault
http://serverfault.com/questions/179165/can-expire-logs-days-be-less-than-1-day-in-mysql
C++98 線形代数パッケージ Eigenを調べる

#概要
C++98で書かれたポータブルな線形代数パッケージ[Eigen](http://eigen.tuxfamily.org/index.php)
Intel MKL無しでも、MKL並の速度のBLASインターフェースと種々の行列演算や行列分解を提供する。
もちろんIntel MKLをラップする事もできる。
uBLASよりもずっと速い。

でもいろいろといじりたい事がでてきた。
そこで、まずはEigenの仕組みを調べる。

#namespace
まずはnamespaceの構造は
namespace eigen -> namespace internal 
これだけ。
eigenの中にいろんなクラスがぶら下がってヘルパ関数やテンプレートメタプログラミング用のクラス等がinternalにぶら下がる。

#EigenBase
まずEigenBaseクラスを整理する。
Eigenの提供する行列クラスの一番上の継承元は大体これ。
/src/Core/EigenBase.hに定義がある。

```cpp
namespace Eigen {
        template<typename Derived> struct EigenBase{
                typedef typename internal::traits<Derived>::StorageKind StorageKind;
                typedef typename internal::traits<Derived>::Index Index;
                Derived& derived();
                const Derived& derived() const;
                inline Derived& const_cast_derived() const;
                inline const Derived& const_derived() const;

                inline Index rows() const;
                inline Index cols() const;
                inline Index size() const;

                template<typename Dest> inline void evalTo(Dest& dst) const;
                template<typename Dest> inline void addTo(Dest& dst) const;
                template<typename Dest> inline void subTo(Dest& dst) const;
                template<typename Dest> inline void applyThisOnTheRight(Dest& dst) const;
                template<typename Dest> inline void applyThisOnTheLeft(Dest& dst) const;

        };
};
```

定義とコメントは省略して、宣言だけ書いた。

見ての通りCRTPにより静的ポリモーフィズムを実現している。

EigenBaseを継承するクラスはStorageKindとIndexをまずtypedefしなくてはならない。
StorageKindはデータの格納形式を表す列挙子で、Indexは添え字の型を表す列挙子。

EigenBaseを継承するクラスは最低限 Index rows(), Index cols()を定義しなければならない。
これらのメンバ関数は行・列の次元を返す事を想定している。
Index size()はIndex row(), Index cols()から計算する用定義されている。

次のメンバ関数テンプレート群は、今の段階では説明が難しいが、Expression-templateを実現するための関数群である。
これらはEigenBaseを継承するクラスで実装しないと、EigenBase内で定義されているデフォルトの関数が適応される。
もちろん継承先で定義しなおして、式変形を最適化する事もできる。

#マクロ・メタ関数
良く使われるマクロやメタ関数は
/Eigen/src/Core/util/Constants.h 
/Eigen/src/Core/util/ForwardDeclarations.h 
/Eigen/src/Core/util/Macros.h 
/Eigen/src/Core/util/Meta.h 
あたりにある。
涙ぐましいenumハックが涙を誘う。
ctagsのエラー append mode is not compatible with tags to stdout^@ にぶち当たったら。


vim でファイルを開こうとしたら、タイトルの様なエラーが出た。

ひとまず

```
--append=no
```

とすれば良い。

しかし、原因がわからない。

```
:Tlist
```
がなんやら関係していそうだが…。

[参考:ctagsのソースらしいページ](http://sourcecodebrowser.com/exuberant-ctags/5.7/options_8h.html)
UIButton を Storyboard/Interface builder で角丸にする


# Identity Inspector から設定する

例では cornerRadius の値を 15 に設定してみました。

![Screen Shot 2014-06-25 at 21.14.43.png](https://qiita-image-store.s3.amazonaws.com/0/27210/66f20b4c-836b-6d24-4945-2eb7176f6004.png "Screen Shot 2014-06-25 at 21.14.43.png")

# 実行

![Screen Shot 2014-06-25 at 21.15.28.png](https://qiita-image-store.s3.amazonaws.com/0/27210/d3d79392-688c-6514-c785-083daae497cc.png "Screen Shot 2014-06-25 at 21.15.28.png")

実行時しか反映されないのが残念ではあります。。
[小ネタ]mackerel-client-rubyを使って一括retireさせるスクリプト


## 何これ？
status == 'working'以外のhostsを全部retireさせます。

## 必要？
普通は必要無いかと思うんですが、AutoScale使ってると気づいたら数百のホストが登録されてたりするので、作りました。落ちるときに自分をretireさせる…とかの方がスマートでしょうけど、これはこれで手軽なので。
[mackerelio/mackerel-client-ruby](https://github.com/mackerelio/mackerel-client-ruby)を使ってます。
当初、retire APIあっても動いてるのを特定できる情報無かったら意味無い！って思ってたんですが、statusが取れるので、地道に管理画面から固定サーバ全部のstatusをworkingに変更する事で区別つくようになったので、どうにかなりました。

## ソース
```ruby
# -*- coding: utf-8 -*-
# mackrel-client-ruby 0.0.2 使用
require 'mackerel'
client = Mackerel::Client.new(:mackerel_api_key => ENV['MACKEREL_APIKEY'])
 
client.get_hosts(service: 'service_name').each do |host|
  # working以外で初期登録から一週間以上経過している
  if host.status != "working" && host.createdAt < Time.now.to_i - (60 * 60 * 24 * 7)
    p "retire host id:#{host.id}"
    p client.retire_host(host.id)
  end
end
```
https://gist.github.com/u1tnk/daa091e3f693b7c3faf1
見ての通りショボいですねw

## まとめ
これ使って388hosts → 9hostsまで激減して超スッキリ！管理画面も軽い！

mackerel meetupでも訴えましたが、自動的にstatus変わるポリシーとか定義できる嬉しい。
- 10分生きてたらworkingに変更
- 10分死んでたら…に相応しいの無いですが、unknown的な感じ。
- 一週間死んでたら自動でretire
とか。

## 追記
起動してすぐに退役しちゃうのはどうか…という事で起動して一週間判定をつけました。
ctagsの監視対象外にするオプションexclude


```
ctags -R
```
とかして、

```
ctags: Warning: ignoring null tag なんたら.js
```

とか出てきたら

```
vi ~/.ctags
```
とかして、


```
--exclude=*.js
```

とかしましょう。

ここで、ポイント。

アスタリスクを忘れずに。

.jsのみだと相変わらず対象内にしてしまう。

ctags Man日本語ページ
http://hp.vector.co.jp/authors/VA025040/ctags/ctags_j.html
ChefでPearパッケージをインストールする話(まずそんなニーズ無い)(社内環境でよくある話) 

#これは何？
社内環境(Proxy環境下)のサーバにChefでPearパッケージをインストールする話。
Composerあるんだから滅多にニーズの無い話なんだけど、たまたまやる機会があったので忘れないようにメモ。


# 結論：pear config-set http_proxyでProxyを刺してあげましょう。
recipeの中でコマンド発行してあげればOK。

```ruby:recipe/default.rb
execute 'install-pearなんたら' do
  command 'pear config-set http_proxy http://${USER}:${PASSWORD}@${PROXY_HOST}:${PROXY_PORT}'
  command 'pear config-set auto_discover 1 && pear install hoge/fuga'
  not_if  { File.exists?('/usr/bin/phpfuga') }
end
```