OmniAICreator/Qiita-1.07M huggingface dataset:
CSV.open で Encoding::UndefinedConversionError になる場合

[Ruby 標準添付ライブラリの CSV](http://ruby-doc.org/stdlib-2.1.2/libdoc/csv/rdoc/CSV.html) で Windows-31J (Shift_JIS でも良いけど) な CSV を作っていたのだけれども、特定の文字が含まれていると ``Encoding::UndefinedConversionError`` になってしまう。

```irb:
irb(main):011:0> CSV.open(File.join('/var/tmp/hoge.csv'), 'w', encoding: 'Windows-31J') do |csv|
irb(main):012:1*   csv << %w( d é f )
irb(main):013:1> end
Encoding::UndefinedConversionError: U+00E9 from UTF-8 to Windows-31J
```

最初は気楽に undef とか replace とか指定すれば良いんでしょ、とか思っていたんだけど。

```irb:
irb(main):014:0> CSV.open(File.join('/var/tmp/hoge.csv'), 'w', encoding: 'Windows-31J', undef: :replace, replace: '*') do |csv|
irb(main):015:1*   csv << %w( d é f )
irb(main):016:1> end
ArgumentError: Unknown options:  undef, replace.
```

``CSV.open`` に undef も replace も渡せない。
(話の流れで省略してるけど invalid も同じように渡せない)

実際に例外出しているのは ``CSV.new`` で、 ``CSV.new`` には決まったオプションしか渡せない。

書き出しの手間を考えると CSV ライブラリは使いたい、でも undef, replace 使いたい。
でも CSV.new には undef とか渡せない、でも文字コード変換して CSV 書き出したい。
とかぐるぐるしてたんだけれども。

実際に ``CSV.open`` が何をやっているかを参考にしつつ。
``File.open`` して、それを ``CSV.new`` に渡すことにした。

```irb:
irb(main):017:0> File.open(File.join('/var/tmp/hoge.csv'), 'w', encoding: 'Windows-31J', undef: :replace, replace: '*') do |file|
irb(main):018:1*   csv = CSV.new(file, encoding: 'Windows-31J')
irb(main):019:1>   begin
irb(main):020:2*     csv << %w( d é f )
irb(main):021:2>   ensure
irb(main):022:2*     csv.close
irb(main):023:2>   end
irb(main):024:1> end
=> <#CSV io_type:File io_path:"/var/tmp/hoge.csv" encoding:Windows-31J lineno:1 col_sep:"," row_sep:"\n" quote_char:"\"">
```

これで、例外にならない。

```
$ cat /var/tmp/hoge.csv
d,*,f
```

指定の通りに replace されてる。
Mr. James CoplienのCertified ScrumMasterを受けてきた。(2日目)

Certified ScrumMaster(CSM)を受講してきましたので、自分の備忘録の意味も含めて、記録。
コースはこちら。
http://www.scrumalliance.org/certifications
私が受講したCSMは2日間の日程です。
本日は2日目の報告
1日目の報告は[こちら](http://qiita.com/ukiuni@github/items/45b46bb3874233bdf00a)

# 内容
時系列で講義の内容と私の主観を報告していきます。

## Scrumの座学
* Sprint Planningはスプリント期間の5％
* バックログにはProduct BacklogとSprint Backlogがある。
** Product BacklogはWhatがSprint BacklogにはHowが記載される。
* プロダクトオーナーは出来上がりの完全なイメージが必要。何を構築するかを明確にする必要がある。
* Velocityのばらつきは、良いケースでも20％位あると考えたほうが良い。
* チームは全てのバックログを常に見積もっている状態にある。細分化しているバックログがが2〜3スプリント分である。
* スプリントゴールとはチームをまとめるための、モチベーションアップの方法の一つ。
* スプリントバックログには、勉強、とか、テスト、とかも入れることができる。
* 人が働いているのは、平均すると業務時間の約半分程度である。ただし、ばらつきがあるので気をつけるべし。
* 信頼を得るためには、自分から何かを与えることだ。
* 改善とはチームをポジティブすることだ。
* Daily Scrumはスプリントの再計画するために行う。
** 3つの質問に答える。スプリントゴールを達成するために、昨日何をしたか。今日何をするか。障害はあるか？
** スクラムマスターはDaily Scrumに参加する必要はない。時として、するべきではない。なぜなら、Daily Scrumはチームのものだから
** ドラッグ=ベロシティー低下要因が存在する。
** スプリントで間に合わなかったとしても、次のベロシティーの調整はしない。50%で失敗するので。3度連続で起こったら初めて下げる。
** スクラムモードは2つあるといい。改善モードと安定・定着モード
** チームを2つに分けるとチーム間にコーディネーションコストがかかるため、各チームの生産性は元のチームの50%にならない。30%位になるだろう。要注意
** 一つの成果を出すことに最大限人が群がるべき。できるだけ早く成果をリリースするのがビジネスの目的でもある。
上は絶対ではないそうですが、チームのビジネス的価値を最大にするために利用できるプラクティスです。

# Velocityゲーム
研修の締めにSprintを体験するためのゲームをしました。
内容は研修を受けたほうがいいです。
今回の研修では、Mr. James Coplienの奇跡をみました。すげー。Mr. James Coplien。そして、プロジェクトメンバーには多様性が必要だ。

# まとめ
素晴らしく感動した研修でした。機会があったら、ぜひ受けてみることをおすすめします。
Seleniumでname属性をClickしてもSubmitされない

##問題
submitボタンをクリックしてフォームを送信したい。

```html:Form.html
<input type="submit" name="post" value="投稿" />
```
```csharp:FormTest.cs
driver.FindElement(By.Name("post")).Click();
```

ローカルでは動くが、
試験サーバでは毎回エラーが起こる画面が1つ発生。
なぜだ。

##解決策
[SendKeysにすると動くよ！(StackOverflow.com)](http://stackoverflow.com/questions/11676790/click-command-in-selenium-webdriver-does-not-work)

```csharp:FormTest.cs
driver.FindElement(By.Name("post")).SendKeys(Keys.Enter);
```
または

```csharp:FormTest.cs
driver.FindElement(By.Name("post")).SendKeys(Keys.Return);
```

##原因(?)
バグっぽい。
再現シナリオがわからないからクローズされてる。
[Issue 2864:Clicking with 2.12.0 using Firefox 5 sometimes works and sometimes does not](https://code.google.com/p/selenium/issues/detail?id=2864)


##あとがき
私の環境は以下のとおり。
Selenium: 2.41.0.0(C#)
ローカル：Windows 7(x86) + Firefox 29.0.1
試験サーバ：Windows Server 2012 R2 + Firefox 29.0.1

HTML/CSSを並行で開発していて、
気づいたらClickでも送信されるようになっていた。
HTMLやCSSが原因？
気が向いたら調べてみます。
寿司と温泉

絵文字とか記号とかでプログラミングだって？それPHPでできるよ！！

```php
<?php
$♨ = "温泉";
function ?(){
	return "おすし";
}
echo "{$♨}いきたいな〜、".?()."たべたいなー。".PHP_EOL;
```

(しかし、多くのエディタではシンタックスエラーがでる、Gistも、Qiitaも）

![スクリーンショット 2014-06-06 21.49.31.png](https://qiita-image-store.s3.amazonaws.com/0/6959/66b14106-e442-1a8c-8c73-161af8637036.png)
OSXにAtomエディタをインストールしてプロジェクトマネージャを使うまでの手順

# はじめに

[Atomエディタ](https://github.com/atom/atom)に[atom-project-manager](https://github.com/danielbrodin/atom-project-manager)を入れれば、Sublime Textみたいに複数のプロジェクトを登録して簡単に切り替えられるようになります。

# インストール手順

## Atomエディタのインストール

[Atomのリリースページ](https://github.com/atom/atom/releases)からatom-mac.zipをダウンロードして展開し、出来たAtom.appをFinderで/Applicationsに移動します。

## atomとapmコマンドのインストール

Atomを起動し、[Atom]/[Install Shell Commands]メニューを実行します。

## atom-project-managerのインストール

ターミナルで以下のコマンドを実行します。

```shell-session
apm install project-manager
```

# 使い方

## プロジェクトの登録

1. Atomエディタの[File]/[Open]で自分のプロジェクトファイルがあるフォルダを開いておきます。
2. [Packages]/[Project Manager]/[Save Projects]メニューを選び、Project titleを入力してenterキーを押します。

## プロジェクト一覧表示と切り替え

Ctrl-Command-pを押すとプロジェクト一覧が表示されるので、Ctrl-n, Ctrl-pで選んでenterを押すか、マウスでクリックすれば切り替えられます。

プロジェクトで開いていたタブの状態は、別のプロジェクトに切り替えた後、戻ってきた時に復元されました。これは便利！
TodoistのAPIを使い任意のプロジェクトを作成してみる

Todoistを最近使ってます。

https://ja.todoist.com/

UIがいい感じ、素敵

（最近awsの障害影響でダウンしてましたが・・・）

 

自分の仕事上での使い方としては、

毎日年月日のプロジェクトを作って、そこでタスク管理しています。

20140531

20140601

20140602

みたいな・３・

 

でも毎日プロジェクト作成するのめんどくさい。

って思ってたらTodoistのAPIの存在を知ったので、APIを使って自分用のバッチファイルをPHPで作りました。

http://todoist.com/API/


```php:Todoist.php
<?php

require_once 'HTTP/Request.php';
require_once 'TodoistException.php';

class Todoist
{
    const API_URL = 'https://todoist.com/API/';
    const MAIL_ADDRESS = '';
    const PASSWORD = '';
    private $token;

    public function __construct()
    {
        $this->login(Todoist::MAIL_ADDRESS, Todoist::PASSWORD);
    }

    private function login($email, $password)
    {
        $params = array(
            'email' => $email,
            'password' => $password
        );

        $url = $this->createUrl('login', $params);
        $res = $this->remote($url, array());

        if ($res === 'LOGIN_ERROR')
        {
            throw new TodoistException('login error');
        }
        $this->token = $res->token;
    }

    public function createProject($projectName)
    {
        $params = array(
            'name' => $projectName,
            'token' => $this->token
        );

        $url = $this->createUrl('addProject', $params);
        $res = $this->remote($url, array());
        if ($res === 'ERROR_NAME_IS_EMPTY') {
            throw new TodoistException('project name error');
        }
    }

    private function remote($url, $option)
    {
        $http = new HTTP_Request($url, $option);
        if (!PEAR::isError($http->sendRequest())) {
            $res = $http->getResponseBody();
            return json_decode($res);
        } else {
            throw new TodoistException('remote error');
        }
    }

    private function createUrl($action, $params)
    {
        return Todoist::API_URL.$action.'?'.http_build_query($params, NULL, '&');
    }

}
```

```php:TodoistException.php
<?php

class TodoistException extends Exception
{
    public function __construct($message, $code = 0, Exception $previous = null)
    {
        parent::__construct($message, $code, $previous);
    }
    public function __toString()
    {
        return __CLASS__. " : [{$this->message}]\n";
    }
}
```


```php:todoist_batch.php
<?php

require_once 'Todoist.php';
try {
    $todoist = new Todoist();
    $todoist->createProject(date('Ymd'));
} catch (Exception $e) {
    echo $e;
}
```

みたいなバッチファイルを作成して、cronに登録して毎日実行させてます。

<pre>
30 00 * * * /usr/bin/php /var/phpwork/batch/todoist_batch.php >> /var/log/batch.log 2>&1
</pre>


https://github.com/hatahata12/TodoistApiTest
ローカル環境設定メモ

 - ホームディレクトリにプロジェクト作成
 - githubのファイルURL→コマンド：git clone https://github.com/~
 - データベースにフォルダ作成→インポート
 - httpd-vhostsとhostの修正→apache再起動・キャッシュクリア
 - エラー→DocumentRootの訂正
 
phpを使う時
 - config.php
 - logのフォルダとファイル作成
 - パーミッション修正（サーバーのユーザーをグループ追加・グループのパーミッション変更）
   - wp:書き込むフォルダ全体に　その他:logのみ
RDSからEC2上のMySQL(mroonga)にレプリケーションする



■したいこと

RDSをマスター、EC2上のMySQLそスレーブとして、レプリケーションさせる

※RDS側のテーブルのストレージエンジンはInnoDBだがスレーブ側のMySQLのストレージエンジンはMroongaにしたい。

■time_zoneを合わせておく

Aisa/Tokyoで揃えたかったので、RDSとEC2上MySQLのtime_zoneはAsia/Tokyoにしました。

（タイムゾーンをお互い違うままでやったら、レプリケーションエラーになった）

RDS側(ちとめんどい）

http://dev.classmethod.jp/cloud/aws/change-timezone-on-amazon-rds-mysql/

MySQL側

my.cnf
<pre>[mysqld]
default-time-zone=Asia/Tokyo　＃追加
</pre>

 ※再起動してエラーがでた場合

<pre>
mysql_tzinfo_to_sql /usr/share/zoneinfo/ | mysql -u root -p mysql
</pre>

 ■スレーブ側のMySQLにRDS特有のテーブルを作成

これが作られてないとレプリケーションエラーする。

<pre>
use mysql;
CREATE TABLE `rds_heartbeat2` (
  `id` int(11) NOT NULL,
  `value` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
</pre>

■レプリケーションさせたいテーブルをMASTER側に作成する

・マスター側

<pre>
CREATE TABLE `articles` (
 `id` varchar(32) NOT NULL,
 `title` varchar(26) NOT NULL,
 `del_flag` tinyint(4) NOT NULL DEFAULT '0',
 `create_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
 `update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
</pre>

・スレーブ側

マスターと同じものを作成

※この時点でマスター側になんらかのデータを登録しておく

■マスター側に専用ユーザを作成
マスター側にレプリケーション用のユーザを作成する

<pre>
CREATE USER 'repl'@'%' IDENTIFIED BY 'test';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
</pre>

■スレーブ側のmy.cnfの設定

<pre>
[mysqld]
server-id = 111
log-bin   = mysql-bin
relay-log = relay-log
</pre>

■マスタのダンプをとる

<pre>
mysqldump -u dbuser -p -h ~~~~~~~~~~~rds.amazonaws.com --no-create-db --routines --triggers --single-transaction masterdb articles > dump.sql
</pre>

※RDSはFLUSH TABLES WITH READ LOCKできません

■スレーブにマスタのダンプをインポート

<pre>
mysql -u root -p  slavedb < dump.sql
</pre>

■マスタのバイナリログ情報の確認

<pre>
show master status;
</pre>

例えばこんな感じに出力

<pre>
mysql-bin-changelog.000001 120
</pre>

mysql-bin-changelogはバイナリログで、120は位置情報です

■SLAVEを設定

<pre>
CHANGE MASTER TO
MASTER_HOST='~~~~~~~~~~~rds.amazonaws.com',
MASTER_USER='repl',
MASTER_PASSWORD='test',
MASTER_LOG_FILE='mysql-bin-changelog.000001',    
MASTER_LOG_POS=120;
</pre>

LOG_FILEとLOG_POSはマスタのバイナリログ情報の値にする

一度登録して変更したい場合は

<pre>
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin-changelog.000002',  MASTER_LOG_POS=422;
</pre>

■スレーブ開始

<pre>
START SLAVE
</pre>

■スレーブの状態確認

<pre>
SHOW SLAVE STATUS
</pre>

Slave_IO_RunningがYES Slave_SQL_RunningがYES なら問題ない。
ただしスレーブ開始後にマスターにデータを追加し、 スレーブに反映されているかをきちっと確認する

マスターでのデータ登録がスレーブにも反映されている（レプリケーションされている） ことが確認できたら、スレーブ側のエンジンを本来設定したいエンジンにする

■スレーブ側のエンジンの変更

<pre>
ALTER TABLE articles 
  ADD FULLTEXT INDEX `content_index` (title) COMMENT 'parser "TokenMecab", normalizer "NormalizerAuto"';
ALTER TABLE articles  ENGINE=mroonga COMMENT='engine "InnoDB"';
</pre>

こんな感じでレプリケーションができました。
なぜ後からALTERでエンジンを変えてるかというと、
最初のレプリケーションでいくらスレーブ側のテーブルを指定のエンジンで作成していても
初レプリケーション後、マスター側のテーブルと構成が同じになっているから（再作成？）
初レプリケーション後ALTERでエンジン変えてあげれば、以降問題ありません。
デストラクタだけカレントディレクトリが違う

```php
	class HOGE{
		public function __construct(){
			var_dump(getcwd());
		}
		public function fuga(){
			var_dump(getcwd());
		}
		public function __destruct(){
			var_dump(getcwd());
		}
	}
	
	$hoge = new HOGE(); // C:\path\to\DocumentRoot\test
	$hoge->fuga(); // C:\path\to\DocumentRoot\test
	 // C:\xampp
```

PHPのシャットダウン中にデストラクタが呼ばれた場合、カレントディレクトリがサーバのルートに変わってしまいます。
chdir()等でカレントディレクトリを変更していた場合にも元に戻ってしまいます。

まあデストラクタの問題というよりはシャットダウン処理の仕様で、[register_shutdown_function()](http://jp1.php.net/manual/ja/function.register-shutdown-function.php#92657)でも[同じ現象](http://jp1.php.net/manual/ja/language.oop5.decon.php#56996)が発生します。

```php
	register_shutdown_function(function(){
		var_dump(getcwd()); // C:\xampp
	});
```

ここまでであれば、相当わかりにくいけどどうにか納得できないこともない。
そういう仕様ならそれに合わせるしかあるまい。

```php
    class HOGE{
        public function __construct(){
            var_dump(getcwd());
        }
        public function fuga(){
            var_dump(getcwd());
        }
        public function __destruct(){
            var_dump(getcwd());
        }
    }

    $hoge = new HOGE(); // C:\path\to\DocumentRoot\test
    $hoge->fuga(); // C:\path\to\DocumentRoot\test
    $hoge = 1; // C:\path\to\DocumentRoot\test

    $hoge = new HOGE(); // C:\path\to\DocumentRoot\test
    $hoge->fuga(); // C:\path\to\DocumentRoot\test
	// C:\xampp
```

なんてこった。
これはあかんで。
こちらはスクリプト中でデストラクタが呼ばれるため、カレントディレクトリが継続しています。

回避手段としては、デストラクタでディレクトリ/ファイルを扱わないというのもありますが、仕様上難しいこともあるでしょう。
まあ実用的には、
・コンストラクタあたりでフルパスを定義しておいて、以後はそれを使う
で問題ないでしょう。


なおディレクトリ名がC:\になっているのはXAMPPを使っているからで、Linux環境でも再現します。
getcwd()が/とかになる。
[手記]Unity4.3系とXcode5.1との連携エラー

UnityからiPhone書き出しする時に
***
"UnityException: Launching iOS project via Xcode4 failed. Check editor log for details"
***

というエラーが出る。原因としてはUnity側にある模様。

解決方法としては

`Unity.app/Contents/BuildTargetTools/iPhonePlayer/Unity4XC.xcplugin/Contents/Info.plist`
の中の
```xml
<key>DVTPlugInCompatibilityUUIDs</key>
<array>
<string>63FC1C47-140D-42B0-BB4D-A10B2D225574</string>
<string>37B30044-3B14-46BA-ABAA-F01000C27B63</string>
</array>
```
を
```xml
<key>DVTPlugInCompatibilityUUIDs</key>
<array>
<string>63FC1C47-140D-42B0-BB4D-A10B2D225574</string>
<string>37B30044-3B14-46BA-ABAA-F01000C27B63</string>
<string>A2E4D43F-41F4-4FB9-BB94-7177011C9AED</string>
</array>
```
として保存すれば良い

Unity4.5系で治る予定？
Chromecast開発で気をつけるポイント Android編


### まずは、Chromecastの紹介と開発について次のサイトを読んでみましょう
+ [Google Japan Blog: Chromecast で好きなオンライン動画や映画をキャストしよう] (http://googlejapan.blogspot.jp/2014/05/chromecast.html)

+ [Chromecast 向けアプリの開発について - Google Developer Relations Japan Blog] (http://googledevjp.blogspot.jp/2014/05/chromecast.html)
+ [Casting Your Content to the Big Screen - Google Cast — Google Developers] (https://developers.google.com/cast/)


## AndroidのSender開発について気をつける点
### 依存するライブラリ
+ Android Support Libraries rev 19.0.1 以上
 + android-support-v4
 + android-support-v7-appcompat
 + android-support-v7-mediarouter
+ Google Play services SDK rev 4.3 以上
 + google-play-services_lib

このように多くのライブラリが必要となります。
既存アプリケーションで使用しているバージョンとの競合に気をつけて下さい。ActionBarSherlockを使用している場合、ActionBarCompatへ移行を検討する必要があります。

Google Play Serives に依存しますので、RAM容量が少ない2.3系の古いデバイスでは注意が必要です。
ユーザーによっては、このGoogle Play Serivesをアンインストールや無効にしている停止しているかもしれません。この場合Chromecastの機能は一切使えません。

### アプリケーションの構成
古いアプリケーションの場合、ActionBarやFragmenntを導入していないものもあると思います。
公式ページにその場合にどのサンプルコードを参考すれば良いかチャートがありますので、これを参照して下さい。
[Sender App Development - Google Cast — Google Developers](https://developers.google.com/cast/docs/sender_apps)

今後のUI/UX改善対応や開発効率を考慮すると ActionBarとFragmnetの導入は強くお勧めします。

### Cast Companion Library (CCL) の活用
GitHubには、アプリケーションのCast対応を簡単にするライブラリとそのサンプルが公開されています。

+ [googlecast/CastVideos-android](https://github.com/googlecast/CastVideos-android)
+ [googlecast/CastCompanionLibrary-android](https://github.com/googlecast/CastCompanionLibrary-android)

#### CCLは次のような機能がサポートされています。
+ Chromecastデバイスのディスカバリー
+ カスタマイズされたNotification
+ カスタマイズされたChromecastデバイスのコントロールダイアログ (Media Router)
+ カスタマイズされたキャスティングコントロールプレーヤー (Activity)
+ カスタマイズされたミニコントローラー
+ ロックスクリーンコントローラー (RemoteControlClient)
+ セッションリカバリー機能
+ SenderとRecieverのカスタムデータチャネル
+ Google Play services のインストールチェッカー

これらの機能は、サンプルアプリケーションをビルドして動かしてみるとどのようなものかわかるとおもいます。[Google Cast Design Checklist](https://developers.google.com/cast/docs/design_checklist)に従ったUIを実装しており、アプリケーションは非常に簡単にCastへの対応が出来るようになっています。

#### ただし、幾つか注意があります。
+ **公式ライブラリーではない!**
+ パッケージ名は com.google.sample.castcompanionlibrary となってます。そのまま使用してはいけません。パッケージ名は**必ず変更**しなければなりません。
+ カスタムNotification (VideoCastNotificationService) で使用している Notification Id が 1 になっているため、既存アプリで IDが競合しないように変更する必要があります。
+ カスタマイズされたキャスティングコントロールプレーヤー(Activity)を内包してまますが、そのまま使用せず、ユーザーのアプリのデザインに合わせて実装し、CCLからこのActivityを使用するように変更する必要があります。
+ 内包されているカスタマイズされたNotificationも使用する仕組みとなっているので、ユーザーのアプリに合わせてCCLを変更する必要があります。カスタマイズされたミニコントローラー/カスタマイズされたChromecastデバイスのコントロールダイアログも同じです。
+ 内包されているカスタマイズコンポーネントをそのまま使用出来るUIである方が開発は楽ではありますね…

+ Mavenリポジトリに登録されてないので、自分でローカルリポジトリに登録する必要があります。

### ロックスクリーンコントローラーの問題
Google Cast Design Checklist の [Cast menu, while castin](https://developers.google.com/cast/docs/design_checklist#sender-control-lockscreen) に載っているロックスクリーンは、Nexus5 KitKat 4.4.2 のものです。
他のデバイスでは実現出来ません。デバイスによっては ユーザが配置している LockScreen AppWidget と競合して表示されないこともあります。
Android RemoteControlClient API はの実装は各マニファクチャーに依存している点に注意が必要です。
Nexus5でも、fastforward/next/previous/rewind のメディアボタンが表示できなかったりします…
【Apache】Basic認証がうまく通らないときのメモ

ものすごくはまったのでメモ。
Basic認証作成の記事はたくさん出ているので、割愛しますが
しっかりvirtualhostでhtpasswdも指定したり
設定など間違いないのに、そのサイトを開いてみると
確かにIDとパスを聞かれる。

でも正確なパスを入れてもまた聞かれる。
パスの暗号化もできている。

結果：
Apacheのモジュールがコメントアウトされていました。
LoadModule authz_user_module modules/mod_authz_user.so
こいつがコメントアウトされていると、正常に機能しないと。


ものすごく時間がかかったものの
先輩はさくっとクリアしてて、経験ってすごいと思いました。
以後、注意ですね。
Unityのプロジェクトをjenkins先生に流したらファイルが無いと言われて、調べた結果


# 現象

[vuforia]("https://developer.vuforia.com/")入りのUnityプロジェクトをビルドするジョブをjenkinsで作った

なにやら
`ld: library not found for -lQCAR`
とか言ってコケる

jenkins のワークスペース見たら、`libQCAR.a`など一部のファイルサイズが0kbなっていた

ローカルmacでlsしたらなにやら@マークがついてる

# 結論

AssetStore経由でない .unitypackage に [**EA（Extended Attributes）**](http://ja.wikipedia.org/wiki/%E6%8B%A1%E5%BC%B5%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%B1%9E%E6%80%A7) がついてた

これが mac →　git → mac（ビルドサーバー）と渡っていき、
ビルドサーバーで参照できなかった模様


# 対処

### ローカル
1. 該当するインポート済みのアセットを削除
1. .unitypackageのEAを`xattr -d`コマンドで削除
1. .unitypackageを再度インポート

### リポジトリ
git経由でEAの更新の仕方がわからなかったので、gitリポジトリ作りなおした

### ビルドサーバー
ワークスペースクリア

・・・わりと序盤だからよかったけど、しばらくしてからこの方法は厳しそう

---
参考：[Macでlsした時のパーミッションにあるアットマークを消す。xattrコマンド。]("http://d.hatena.ne.jp/kanonji/20100912/1284292517")
iOSの言語設定に応じて設定されるNSLocaleの値について簡単にまとめてみる

iOSの「設定」-> 「一般」-> 「言語環境」中の「言語」と「書式」に応じて、NSLocaleの設定値がどう変わるか忘れそうなのでメモ。

## どういう目的に使われているのか確認する
同じような目的に使われているように思い込みがちですが、全く違う目的に使われています。

[iPhone ユーザガイド iOS 7.1 ソフトウェア用](http://manuals.info.apple.com/MANUALS/1000/MA1565/ja_JP/iphone_user_guide_j.pdf) P.20から抜粋。

> 言語環境設定
> 「設定」 > 「一般」 > 「言語環境」と選択し、以下を設定します:
> • iPhone で使用する言語
> • 音声コントロールで使用する言語
> • 使用するキーボード
> • 書式(日付、時刻、および電話番号)
> • カレンダーの書式

つまり、「言語」で設定した項目が、システム全体で使われる言語（日本語やアメリカ英語、イギリス英語...）として使用される。
「書式」で設定した項目は、日付や時刻のフォーマットを決定するのに使われます。
あと、「書式」はVoiceOverの読み上げの時にも使われるそうです。

## NSLocaleの何に設定されるのか
「言語」は、NSLocaleのpreferredLanguageで取得したNSArrayの先頭の要素から取得できます。

preferredLanguageで取得したNSArrayには、[IETF言語タグ](http://ja.wikipedia.org/wiki/IETF%E8%A8%80%E8%AA%9E%E3%82%BF%E3%82%B0)のBCP47で定義されたものが格納されています。
「言語」で指定したものが最初の要素に設定されているので、システムで使われている言語を確認したい場合は先頭の要素を使って確認してください。

```objc:
NSString * countryCode = [[NSLocale preferredLanguages] objectAtIndex:0];
```

「書式」は、NSLocaleのsystemLocaleかcurrentLocaleで取得できます。
systemLocaleはシステム全体の「書式」を取得できますが、マルチユーザ環境で現在のユーザーの「書式」を取得したい場合は、currentLocaleが使えます。


```objc:
NSString * locale = [[NSLocale currentLocale] objectForKey:NSLocaleIdentifier];
```


#### 「言語」「書式」の設定とNSLocaleに設定される値
| 言語環境 | 書式 | PreferredLanguage | NSLocaleIdentifier |
|:-----------|:------------|:------------:|:------------:|
|日本語|日本語|ja|ja_JP|
|日本語|英語（アメリカ合衆国）|ja|en_US|
|英語（English）|英語（アメリカ合衆国）|en|en_US|
|英語（English）|英語（イギリス）|en|en_GB|
|英語（British English）|英語（アメリカ合衆国）|en-GB|en_US|
|英語（British English）|英語（イギリス）|en-GB|en_GB|
|ドイツ語|ドイツ|de|de_DE|
|フランス語|フランス|en|en_GB|

### 

## おっかない所
### 「言語」はIETF言語タグに従って設定される
同じ言語だと思っていても、アメリカ英語とイギリス英語のように別な言語タグが定義されている場合があります。
事前に確認するくらいの勇気を持ちましょう。

### 言語と書式は別個に設定できる
「言語」と「書式」は別個に設定できるため、システムの言語は日本語でも日付や電話番号はアメリカ式の表記法で書かれてしまう場合があります。
取得した情報を何のために使うのか把握した上でどちらを使うか検討してみましょう。

#### 言語は日本語を使うけど書式だけ入れ替えた例
| 言語環境 | 書式 | システムで使われる言語 | 年月日|電話番号|
|:-----------|:------------|:------------:|:------------:|:------------:|
|日本語|日本語|日本語|2014年 1月 5日 日曜日 0:34 |03 1234 1234|
|日本語|英語（アメリカ合衆国）|日本語|Sunday, January 5, 2014 12:34 AM|(408)555-1212|
|日本語|英語（イギリス）|日本語|Sunday, January 5, 2014 00:34|07700 900202|

## 参考
[NSLocale Class Reference](https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/classes/NSLocale_Class/Reference/Reference.html)
Dokku にデプロイしたら ikachan で通知するプラグインを作った

* https://github.com/udzura/dokku-ikachan-plugin

主にぼくが得をする感じのプラグインを書いた。めっちゃ便利で感動している。

READMEあるけど日本語で説明すると、

### インストール

```bash
$ git clone https://github.com/udzura/dokku-ikachan-plugin.git ikachan
```

plugins-install は要らない。

### 設定

最初に `/home/dokku/dokkurc` に何かを書く必要がある。

```bash
export IKACHAN_HOST=http://dokku001.example.com:8080
export IKACHAN_CHANNEL='#ikachan'
# 複数チャンネルに通知する
export IKACHAN_CHANNEL='#ikachan,#development,#test'
```

### 使い方

ふつうに git push dokku master すると経過を通知してくれて便利。

```irc
00:00 <ikachan> ✈︎ Image build for minne-chan started on dokku001.example.com
00:01 <ikachan> ✔︎ Image build for minne-chan finished on dokku001.example.com
...
```

通知のタイミングは、デフォルトで「`pre-build,post-build,pre-deploy,post-deploy`」なんだけど、`$IKACHAN_HOOK_ENABLED`という項目で設定できる。

```bash
export IKACHAN_HOOK_ENABLED="pre-build,post-deploy"
```

### 困ってること

`build-failed` みたいなフックポイントがないので、失敗しても通知されない...

----

ということで有効に使ってください。
OpenSSHの秘密鍵から公開鍵をツクル


実行する頻度が少ないので、いざって時に毎回調べてるのでメモしておく。

```
ssh-keygen -y -f 秘密鍵 > 公開鍵 ;
```

* 秘密鍵のpermissionが **400** になっていることを確認する
* 公開鍵のpermissionを **644** に変更する

当たり前ですが、公開鍵から秘密鍵をツクルことは **できません** のでｗｗ
何ヶ月経過したかを月数を吐き出すJS


	var today = $.now();
	var month = (today - from)/1000/60/60/24;
	
	function Month(fromday) {
		from = Date.parse(fromday);
		month = Math.floor((today - from)/1000/60/60/24/30.417);
		return month;	
	}
シェルスクリプトの便利なやつ


何時も忘れてググりながらなので備忘録メモ的に

##引数の数だけループ処理を行う

```bash

for x in "$@"
do

  echo "$x"

done

```

これをやると引数の数だけループしてくれます
`"$@"`と囲むことで各引数にスペースが含まれていても正しく処理されます

```bash

d104:~ nagane$ cat test.sh
#!/bin/bash
for x in "$@"
do
  echo "$x"
done

d104:~ nagane$ sh test.sh sushi yuki 'ho shi'
sushi
yuki
ho shi
d104:~ nagane$

```

`shift`を使ってループを回す方法もありますが
そんな複雑な事しなくても良いならこっちの方が綺麗に書けます。
QiitaでLaTeXって書くときは書き方も工夫してみよう

Qiitaを初めとする$\rm\LaTeX$が使える環境(場面)で$\rm\LaTeX$って書くときは`LaTeX`なんて書かずに$\rm\LaTeX$ってちゃんとロゴで出力しようよ、って話。

あくまでも奨励なのでお好きに

※この記事をアプリなどQiita以外から閲覧すると正常に表示されません。なおこれは$\rm\LaTeX$を扱う全ての記事に言えることです。

* * *


# LaTeXの表記

$\rm\LaTeX$の正しい表記は今まで散々示してきました。

$\rm\LaTeX$なんて扱わない自分が言うのはなんですが、他にも次のような表記がみられるでしょう。

- LaTeX
- latex
- LATEX

ひとつ目以外は見ないでしょうか、それらはもっての他だそうです。あくまでも正しい表記は$\rm\LaTeX$、そんな特殊表記出来ないよって環境ではLaTeXって表示しろってことだそうです。

# んで結局どうすりゃいいんだ

前置きが大変長くなってしまいました。

$\rm\LaTeXで$

[$\rm\LaTeX$]

を出力するのは次の通りです。

```latex
$\rm\LaTeX$
```

`\LaTeX`なんてコマンドが存在するんですね。

$\underline{\rm\LaTeXは\LaTeXって書いていきましょう！}$()

ここで問題、何回$\rm\LaTeX$って書いたでしょうか。



* * *
P .S.
なんやら脆弱性とやらで悲しいことになってますね
calc()を使うとCSSで四則計算ができる。それもコンパイルしなくていいぞ！


[【メモ】高さをcssで%指定し、可変に。](http://qiita.com/ch_hori/items/30fb72654f42ad54bee5)
という記事を発見したので、ちょっと調べてみたら。
 **CSSで四則計算ができる**ではないか！それもコンパイルなしで。

SASSとかLESSとかStylusとかのメタ言語じゃなくてもできる！とかうれしすぎ。
特に横サイズを固定できないスマホでは、これができたら助かること山盛りだったんだけど。

[【メモ】高さをcssで%指定し、可変に。](http://qiita.com/ch_hori/items/30fb72654f42ad54bee5)
だとコード例が書かれているけど *「説明べたなので…」* とおっしゃってるので、ちょっと調べてみた。


# ブラウザ・OS対応状況
| ブラウザ | 対応状況 |特記|
|:-----------|:-----------|:-----------|
| IE | IE9〜 ||
|Chrome|Chrome26~|-webkit-(ベンタープレフィックス)付きならChrome19~使用可能|
|Firefox|Firefox16|-moz-付きならFirefox4~使用可能|
|Safari|Safari6.1,7.0~|-webkit-付きならSafari6.0~使用可能|
|Opera|Opera15~||
|iOS|iOS7~|-webkit-付きならiOS6.0~使用可能|
|Android|Android4.4~||

…あー。
これは、当分実務で使うの無理だわw
ちょっとがっかり。
PCはまだいけるような気がするけど、スマホはiOS6.0（プレフィックス付き）~/Android4.4~だと、ほぼ最新機種しか使えないなあ。

でも、諦めたくない！諦めないで！

と、なればフォールバック（代替機能）付けるしかないよね。記述増えるけど。

```css:css
.sampleBox {
  width: 97.9%; /*IE9未満とかプレフィックス使ってもだめなブラウザやOS対応*/
  widht: -webkit-calc(100% - 20px);/*Chrome19~25対応*/
  width: -moz-calc(100% - 20px);/*Firefox4~15対応*/
  width: calc(100% - 20px);  
}
```
うーん。長いなあ。

# こんな部分に使うと便利
電卓持ち出して計算すればいいじゃん!というのも至極ごもっともな話なんですが、多くのブラウザやOSの最新バージョンでは対応してるので、あと1年くらい経てばバリバリ使えるプロパティになることは間違いないと思うし、時期を見て使ってみたいところです。
## 割り切れない計算
SASSなんかのメタ言語が便利だなーと指をくわえて見ているのは四則計算部分。
特に割り切れない数とかになると「ここで四則計算できればなあ」とか思っちゃう訳だ。
3分割とかすると「33.33%」みたいな数になっちゃうので、いつも見た感じが微妙に思っていた（SASSもコンパイルすると、33.33%みたいな数値になってしまうけど）。

```css:css
/*使えない残念なブラウザとOS用*/
.sampleBox1of3 {
  width:33.333%;
}

/*使える素敵なブラウザとOS用*/
.sampleBox1of3 {
  widht: -webkit-calc(100% / 3);
  width: -moz-calc(100% / 3);
  width: calc(100% / 3);  
}
```

#こんな計算もできるよ
```html:html
<html>
  <style>
    body {font-size: 20px;}

    .sample {
      font-size: 125%;
      font-size: -webkit-calc(1em + 5px);
      font-size: -moz-calc(1em + 5px);
      font-size: calc(1em + 5px);
    }

    .sample2 {
      font-size: 175%;
      font-size: -webkit-calc(1em * (4/4) + 15px);
      font-size: -moz-calc(1em * (4/4) + 15px);
      font-size: calc(1em * (4/4) + 15px);
    }
  </style>

  <body>
    <p>20ピクセルのフォント</p>
    <p class="sample">加算して25ピクセルのフォント</p>
    <p class="sample2">除算・乗算・加算して35ピクセルのフォント</p>
  </body>
</html>
```
ソースコードをコピペして確認できるように書いてみました。
```.sample2```が妙な計算してます。
35pxにするなら```font-size: calc(1em + 15px);```って書けばいいじゃないか！って話なんですが、こういう計算もできるという例で書いてみました。

#スペシャルサンクス
以下のサイトを参考にしました。(人´∀`)ｱﾘｶﾞﾄｳｺﾞｻﾞｲﾏｽ

+ [【メモ】高さをcssで%指定し、可変に。](http://qiita.com/ch_hori/items/30fb72654f42ad54bee5)
+ [CSSで計算式を可能にするcalc()ファンクション｜Web制作 W3G](https://w3g.jp/blog/tools/css3_calc_function)
+ [css calc()で長さを計算して求める | このコードわからん](http://hai3.net/blog/2013/01/06/css-calc/)
+ [calc() - 汎関数記法 - CSS3 Pre-Reference ～ CSS3のリファレンスサイト ～](http://css3.under.jp/value-unit/functional-notation/calc.html)
※ここにある演算子```mod(剰余）```は現在演算子としては存在しないようです。
Swiftでコレクションクラス

SwiftでC#でいうところのコレクションクラスを作ってfor...inでループを回す方法。
どうやればいいかマニュアルを見てもよく分からなかったので試行錯誤中です。
方法を知ってる方居ましたらコメント頂けると助かります:D

### (失敗)何も考えないでやってみる
```swift
class Hoge {
// 略
}

var items = Hoge()
for item in items {
}
```
```
>error: type 'Hoge' does not conform to protocol 'Sequence'
```
どうやらSequence Protocolを使うとできるらしい？

### (失敗)Sequence Protocolを使ってみる
```swift
class Hoge : Sequence {
    func generate() -> Hoge {
        return self
    }
}

var item = Hoge()
for item in items {
}

```
・・・すごくエラーが出ます。
The Swift Programming LanguageのFor-In Statementを見た感じ、
Generator Protocolも必要そうです。

### (成功？)Generator Protocolも使ってみる
とりあえずエラーはなくなりました。

下記を試してみると分かりますが、
For-In Statementの説明に書かれている通り

1. (Sequence Protocolの)generate methodが1度だけ呼ばれる
1. (Generator Protocolの)next methodがnilを返すまで繰り返し呼ばれる

と処理されるようです。

```swift
class Hoge : Sequence, Generator {
    var count = 0
    
    func next() -> Hoge? {
        println("Hoge \(self.count)")
        if self.count < 10 {
            self.count++
            return self
        }
        return nil
    }
    
    func generate() -> Hoge {
        println("generate()")
        self.count = 0
        return self
    }
}

var hoge = Hoge()
for a in hoge {
}
```

この方法で良いのか分かりませんが、
後はnext()とgenerate()の中身を書けば動くのでいいのかな・・・？

## 追記
その後、Generator Protocolの実装先をインナークラスにしてみたところ
それっぽくまとまりました。

#### まとめ
1. コレクションクラスにしたいクラスに Sequence プロトコルを実装する。
1. コレクションクラスのインナークラスに Generator プロトコルを実装する。
1. for...inで回す


*@JunSuzukiJapan@github さんが [[Swift]自作クラスでfor...in](http://qiita.com/JunSuzukiJapan@github/items/07b0b3ea8fe1cf3ab716) で、*
*うまくまとめてくださいました。ありがとうございます！*
ARM V8をシミュレータで試食

ARMも64bitが当たり前になりつつある昨今ですが、一般人には動かせる環境が無いです。。

とりあえずですが、2014年6月現在、ARM社からFastModelというシミュレータが落とせるのでLinux-PCをホストとして遊ぶことができます。
いい時代になったもんです。

で、ファーストコンタクトとして、とりあえずの動かし方がなんかわかりにくいのでまとめてみました。


##動かすのに必要なもの

[ホスト環境]
Ubuntu 12.04(64Bit)
(ほかのLinuxでもできるかもしれない。64Bitは必須の模様)


##入手方法

以下より、ARM V8のファウンデーションモデルを入手します。

http://www.arm.com/ja/products/tools/models/fast-models/foundation-model.php
から、「今すぐダウンロード」でダウンロードできます。
(要ログイン。登録は無料)

うまくダウンロードできない場合は、いったんsilver.arm.comからログインして
｢Download｣-｢Fast Models Main product｣を選択してダウンロードしてください。

##とりあえず動かす
ダウンロードした FM000-KT-00035-r0p8-52rel06.tgz を適当な場所に展開

models/Linux64_GCC-4.1/Foundation_v8
がシミュレータ本体になります。


とりあえずHello Worldを出したい場合は

```bash:cmd

$ ./Foundation_v8 --image ../../examples/hello.axf

```

とすれば動きます。

実行例：

```console:example

$ ./Foundation_v8 --image ../../examples/hello.axf
terminal_0: Listening for serial connection on port 5000
terminal_1: Listening for serial connection on port 5001
terminal_2: Listening for serial connection on port 5002
terminal_3: Listening for serial connection on port 5003
Simulation is started
Hello, 64-bit world!
```
tmuxをCygwinにインストールする方法

MacとLinuxではtmuxを使っていたけど、Cygwinは対応していなかったのでScreenを使ってた。
久しぶりに調べたら、tmux 1.9からCygwinにも対応したようなのでインストールしてみた。

↓と、色々書いてみたものの、結局 `apt-cyg install tmux` でインストールできた…。

## Cygwinにtmuxをインストールする
**以下は、ソースからコンパイルしてインストールしたい方のみへのインストール方法です。**
**とにかくインストールできれば良い場合は、**

```bash
% apt-cyg install tmux
```

**してください。**

### 事前準備
apt-cygが入っていれば、ncursesはapt-cygで入れられる。

```bash
% apt-cyg install ncurses
```

apt-cygで入るlibeventは古い？のでソースからコンパイルする。

```bash
% wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
% tar xvf libevent-2.0.21-stable.tar.gz
% cd libevent-2.0.21-stable
% ./configure --prefix=/usr
% make
% make install
```

### tmuxをコンパイル→インストール
まずは、 [tmuxのWebサイト](http://tmux.sourceforge.net/) からソースをダウンロード

```bash
% tar xvf tmux-1.9a.tar.gz
% cd tmux-1.9a
% CFLAGS="-I/usr/include/ncurses" ./configure --prefix=/usr
% make
% make install
```

## Cygwinで使う上でのTips
* minttyでzshとtmuxをデフォルトで立ち上げるには、minttyのショートカットを作って、リンク先を以下に設定
  * `C:\cygwin\bin\mintty.exe /bin/zsh --login -c "tmux"`
* 既存の.tmun.confがShift-JISやCRLFになっている場合は、UTF-8のLFにすると上手くいったりする
* mintty以外でコピーしたものをペーストする時は、Shiftを押しながら右クリック

## 参考URL
[tmuxがCygwin上で動作するようになったのでインストール手順をまとめてみた - atdxfe's Blog](http://atdxfe.hatenablog.com/entry/2013/11/27/031058)
Swiftにおける名前付き引数


今話題の「Swift」をさわってみた。いろいろ感想はあるけど、ざっと見た感じ、「普通のFunction」、「クラスの中でのinit」、そして「その他のメソッド」の3つで、引数に対するスタンスが違うっぽいのが気になった。

### Function
普通の関数は、funcキーワードの後に定義をごりごり書く。デフォルトでは、引数に名前はつかない。

```swift
func addBy(amount: Int, times: Int) -> Int {
    return amount * times
}
addBy(2, 3) // 6
```

引数名の前にラベルを置く事で、名前付き引数を実現出来る。

```swift
func addBy(amount amount: Int, times times: Int) -> Int {
    return amount * times
}
addBy(amount: 2, times: 3) // 第一引数をamount, 第二引数をtimesという名前で呼び出し
```

ラベルと引数名が同じなら、`#`を使う事でさっくり書ける。

```swift
func addBy(#amount: Int, #times: Int) -> Int {
    return amount * times
}
addBy(amount: 2, times: 3) // 6
```

### クラスのinit
クラスのinitは、オブジェクト生成時に呼ばれる。何もしなくても基本的に名前付き引数の形で呼び出す事になる。

```swift
class Counter {
    var count: Int
    init(count: Int) {
        self.count = count
    }
}
var counter = Counter(0) // Error!
var counter = Counter(count: 0)
```

関数の定義の時と同様、引数名の前にラベルを置けるみたいだけど、何のメリットがあるかは分からない。

```swift
class Counter {
    var count: Int
    init(myCount count: Int) {
        self.count = count
    }
}
var counter = Counter(myCount: 0) // myCountという名前で呼び出し
```

### メソッド
クラスにおけるメソッドの定義では、デフォルトでは第二引数以降を名前付き引数の形で呼び出す事になる。この辺はObjective-Cを踏襲している？

```swift
class Counter {
    var count: Int
    init(count: Int) {
        self.count = count
    }
	func incrementBy(amount: Int, times: Int) {
		count += amount * times
	}
}
var counter = Counter(count: 0)
counter.incrementBy(2, times: 3) // {count 6}
```

これも関数の定義の時と同様、第一引数にもラベルを置いたり、`#`で名前付き引数にしたり出来る。

```swift
class Counter {
    var count: Int
    init(count: Int) {
        self.count = count
    }
	func incrementBy(#amount: Int, times: Int) {
		count += amount * times
	}
}
var counter = Counter(count: 0)
counter.incrementBy(amount: 2, times: 3) // 第一引数も名前付きで呼び出し
```

### 所感
普通の関数の定義がベースにあって、`init`や`メソッド定義`では所定の引数に`#`がついた扱いになるようなイメージだと思う。名前付き引数が簡単に実現出来るのは、地味かもしれないけど自分としては嬉しい機能。
特定のファイルの一部を書き換えて書き戻す？

むしろお知恵を借りたいのであえて書きますが。

あるファイルに0という数字があれば、そのファイルの中身を1とし、1なら0とする、ついでに標準出力にも値を出す、という操作を簡単にやりたかったんですが中々思いつかず、以下のようなアレな感じに……いやねPythonとか長めのshellスクリプト書けば出来ると思うんですが

```
$ cat /tmp/test.txt
0
$ sed -e "s/0/2/" -e "s/1/0/" -e "s/2/1/" /tmp/test.txt | sponge | tee /tmp/test.txt
1
$ sed -e "s/0/2/" -e "s/1/0/" -e "s/2/1/" /tmp/test.txt | sponge | tee /tmp/test.txt
0
$ sed -e "s/0/2/" -e "s/1/0/" -e "s/2/1/" /tmp/test.txt | sponge | tee /tmp/test.txt
1
$ sed -e "s/0/2/" -e "s/1/0/" -e "s/2/1/" /tmp/test.txt | sponge | tee /tmp/test.txt
0
$ sed -e "s/0/2/" -e "s/1/0/" -e "s/2/1/" /tmp/test.txt | sponge | tee /tmp/test.txt
```

おうふ何かヘボい。良いアイディアがあれば教えてください。

# これなにしてんの

sedで 0->2, 1->0, 2->1 として、spongeで吸って、teeで書き戻してます。

追記: あ、ちょっと実際に欲しい要件とちがった。……いやまぁいいや。

# もらいもの

trコマンド使えばという託宣が来ました。ありがとうございます

```
$ cat /tmp/test.txt | tr "01" "10" | tee /tmp/test.txt
```

catなのでspongeが要らないです楽ですね。
順列と組合せの総数の素因数分解を求める

# 動機

順列や組合せの総数は、その名前どおり組合せ的に増加してしまうため、計算機で扱いたいときは工夫が必要です。また、結果が十分小さくても、途中の乗算でオーバーフローしてしまうおそれもあります。

ここでは、「[階乗の素因数分解を求める](http://qiita.com/HirotoKagotani/items/87234e4104cb2b7fb8ff)」で示した方法を応用して、順列や組合せの総数も、素因数分解のまま求めてしまうことにします。

（以下、数式部分が見づらい場合は、数式をどれでも右クリックし、Math Settings -> Math Renderer から適当なものをお選びください）

# 順列の総数

順列の総数 $_nP_k=\frac{n!}{(n-k)!}$ の分子と分母をそれぞれ素因数分解で表しておけば、結果の素因数分解は各素数の指数を計算するだけで求められます。指数の計算も減算のみです。

つまり、例えば、

```math
 _{12}P_{4}=\frac{12!}{8!}=\frac{2^{10}\times3^5\times5^2\times7^1\times11^1}{2^7\times3^2\times5^1\times7^1}=2^3\times3^3\times5^1\times11^1
```

のように、簡単に求められます。

# 組合せの総数

組合せの総数は $_nC_k=\frac{n!}{(n-k)!\times k!}$ と表せますが、同様です。

例えば、

```math
_{12}C_{4}=\frac{12!}{8!\times4!}=\frac{2^{10}\times3^5\times5^2\times7^1\times11^1}{2^7\times3^2\times5^1\times7^1\times2^3\times3^1}=3^2\times5^1\times11^1
```

となります。

# コード

次のコードは、それぞれの階乗（の素因数分解）を求めてから結果を出すのではなく、各素数ごとに結果の指数を直接求めるように工夫しています。

最終結果はこれらの素因数分解を求めるところまでです。例えば、総数どうしの比率から確率を求めたい場合などは、このままで扱えることもあります。しかし、総数そのものを実際に求めるにはこれらを掛け合わせることになり、その場合はオーバーフローに注意する必要があります。

```c:permcomb.c
#include <stdio.h>

void
permutation(int n, int k) {
  int prime[n+1];
  int i, j;

  for (i = 2; i <= n; i++) {
    prime[i] = 1;
  }
  for (i = 2; i <= n; i++) {
    if (prime[i]) {
      for (j = i*2; j <= n; j += i) {
        prime[j] = 0;
      }
    }
  }
  for (i = 2; i <= n; i++) {
    if (prime[i]) {
      prime[i] = 0;
      for (j = i; j <= n; j *= i) {
        prime[i] += n/j;
        if (j <= n-k) prime[i] -= (n-k)/j;
      }
      if (prime[i])
        printf("%d^%d\n", i, prime[i]);
    }
  }
  printf("\n");
}

void
combination(int n, int k) {
  int prime[n+1];
  int i, j;

  for (i = 2; i <= n; i++) {
    prime[i] = 1;
  }
  for (i = 2; i <= n; i++) {
    if (prime[i]) {
      for (j = i*2; j <= n; j += i) {
        prime[j] = 0;
      }
    }
  }
  for (i = 2; i <= n; i++) {
    if (prime[i]) {
      prime[i] = 0;
      for (j = i; j <= n; j *= i) {
        prime[i] += n/j;
        if (j <= n-k) prime[i] -= (n-k)/j;
        if (j <= k) prime[i] -= k/j;
      }
      if (prime[i])
        printf("%d^%d\n", i, prime[i]);
    }
  }
  printf("\n");
}

int
main(void) {
  permutation(12, 4);
  combination(12, 4);
  permutation(100, 50);
  combination(100, 50);
  return 0;
}
```
Rails / Google Analytics が動きを止めた & なぜかURLが正常に取得できない

- - - - - - - - - - - 
ブログを更新しました。<a href="http://workabroad.jp/posts/2096">元の記事はコチラ</a>
- - - - - - - - - - - 
突如 Google Analytics の解析が取れなくなって悩んだ…。
Gitの履歴を見て、変更前に直しても復旧せず。Analyticsのコードを見直しました。

<!-- extract -->
　　
RailsのTurbolinksを使っていて、いつも [Turbolinks Compatibility](http://reed.github.io/turbolinks-compatibility/) にお世話になっています。

今までは普通に解析できてたし、GA Debugでもビーコンが送信されてるのが確認できているので、何が原因か分からないんですが、気になった点はユニバーサル アナリティクス。
　　
ユニバーサル アナリティクスが発表されてから久しいですが、まだ対応してませんでした。
それが原因なのか分かりませんが、いい機会なのでコードを見直すことに。
　　
　　
こんな感じで解析が取れるようになりました。

layouts/application.html.erb

```html

<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-000000-00', 'YOUR-SITE.com.');
  ga('send', 'pageview');

</script>

```

これは、analyticsの管理画面の Track info から出てくる普通のコードです。
```UA-000000-00``` と ```YOUR-SITE.com``` は適宜置き換えてください。
どこでもいいでしょうが、取りあえずbodyを閉じる直前に置きました。
　　

assets/javascripts/analytics.js.coffee

```coffee

$(document).on 'page:change', ->
  # Need to specify the URL
  url = location.href.split('#')[0]

  # Tracking

  if window._gaq != undefined
    _gaq.push(['_trackPageview', url])

  else if window.pageTracker != undefined
    pageTracker._trackPageview(url)

```

ここでURLをオプションで指定しないと、全部同じURLとして取得された。
 _gaq.push と _trackPageview に ```url``` を渡しています。

今の所、これでうまくいっています。

###参考

http://blog.james-lafa.fr/rails-4-google-analytics-with-turbolinks/
http://stackoverflow.com/questions/18632644/google-analytics-with-rails-4
https://developers.google.com/analytics/devguides/collection/analyticsjs/pages



 → <a href="http://workabroad.jp/posts/2096">http://workabroad.jp/posts/2096</a>
デバッグビューを作ってみる

NSLogに出力するデバッグ文字列たちをアプリのViewに出したい。
Xcode触りながらテストする分にはあんま需要はないけど
諸事情でXcode触れない環境下での疎通テストに等使ったりした。

--
#### つかいかた
1. DebugViewのソースを用意する
1. xibをつくる(DebugView.xib)
1. xibの中にUIView入れる
1. UIViewのCustom ClassにDebugViewを入れてひもづける
1. DebugViewにUITextViewを入れてIBOutletのプロパティにひもづける
1. DEBUG_LOG(@"hoge"); でつかう

#### 補足
* テキスト消去と画面クローズのIBActionあるので適当に。
* ログ出すたびに上に出るので、うざかったら「[DebugView open];\」の行を消して
applicationDidBecomeActive:applicationあたりに「[DebugView open]」書いておくと
ホーム画面経由でアプリ復帰した時にでるのでウザさがマシになる。

--

```objc:DebugView.h
#import <UIKit/UIKit.h>

@interface DebugView : UIView

#define DEBUG_LOG(A, ...){\
[DebugView open];\
[DebugView addText:[NSString stringWithFormat:A, ## __VA_ARGS__]];\
NSLog(@"%@",[NSString stringWithFormat:A, ## __VA_ARGS__]);}

+ (DebugView*)instance;
+ (void)open;
+ (void)close;
+ (void)addText:(NSString*)value;
+ (void)removeText;
@end
```

```objc:DebugView.m
#import "DebugView.h"

@implementation DebugView{
    __weak IBOutlet UITextView *textView;
}

#pragma mark - static

static BOOL isOpen;
static DebugView *sharedView = nil;

+ (DebugView*)instance {
	@synchronized(self){
		if(sharedView == nil)
            sharedView = (DebugView*)[[[NSBundle mainBundle] loadNibNamed:@"DebugView" owner:nil options:nil] objectAtIndex:0];
	}
	return sharedView;
}
+ (id)allocWithZone:(NSZone *)zone{
    @synchronized(self) {
        if(sharedModel == nil)  {
            sharedModel = [super allocWithZone:zone];
            return sharedModel;
        }
    }
    return nil;
}

+ (void)open{
    if(isOpen) return;
    isOpen = YES;
    UIWindow* window = [UIApplication sharedApplication].keyWindow;
    if(!window)window = [[UIApplication sharedApplication].windows objectAtIndex:0];
    [window addSubview:[DebugView instance]];
}

+ (void)close{
    if(!isOpen) return;
    isOpen = NO;
    [[DebugView instance] removeFromSuperview];
}

+ (void)addText:(NSString*)value{
    [[DebugView instance] addText:value];
}

+ (void)removeText{
    [[DebugView instance] removeText];
}

#pragma mark - public

- (void)addText:(NSString*)value{
    NSString* str = [NSString stringWithFormat:@"%@\n%@", textView.text, value];
    textView.text = str;
    textView.textColor = [UIColor whiteColor];
    [self setNeedsDisplay];
}

- (void)removeText{
    textView.text = @"";
    [self setNeedsDisplay];
}

#pragma mark - IBAction

- (IBAction)onTouchDeleteTextButton:(id)sender {
    [self removeText];
}

- (IBAction)onTouchCloseButton:(id)sender {
    [DebugView close];
}
@end
```
rails/怒りのsimple_formで条件付きradio buttonを実装

ここ最近simple formネタばっかり投稿している気がする（白目

例えばアップグレードはできるけどダウングレードができない支払い方法選択フォームとかの場合（なんじゃそりゃ

```haml
= f.input :plan_type, collection: [['flee', 0], ['light', 1000], ['normal', 10000], ['pro', 100000]], as: :radio_buttons, disabled: -> (plan) {plan.to_a[1] < current_user.plan_type}
```

ブロックのとこがアレな気がしてならないけど取り敢えずメモっておきます。
Swift の true と TRUE は別物です。


## Swift の Bool は true or false
Swift で Bool 型として扱われるのは、 true or false だけです。

## じゃあ TRUE とか FALSE ってなんなのなの？
互換用に定義されている、 Int 型を返すマクロです。

``` objectivec:Sample

TRUE == 1 // true
TRUE == 0 // false
TRUE == -1 // false

FALSE == 0 // true
FALSE == 1 // false
FALSE == -1 // false

```
　



###### さよなら YES or NO
Ubuntu14.04 に rbenv をインストールして Ruby のバージョン管理

いろいろなプロジェクトで使っている Ruby のバージョンが異なっていると、いちいちインストールしなおしたりしなければならず非常に煩雑です。
rbenv を使うと、複数の Ruby をインストールして、またそれらをすぐに切り替えることができます。
簡単にインストールできるので、ぜひやりましょう。

## まずアップデート

```
sudo apt-get update
sudo apt-get upgrade
```

## rbenv をインストール

```
cd 
sudo apt-get install git build-essential libssl-dev
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

`~/.profile` の末尾に下記を追記する(たとえばgeditなどの好きなエディタで編集してください)。

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

上記を反映する。

```
source ~/.profile
```

## Rubyのインストール

以下のようにすると、インストール可能なバージョンの一覧が表示されます。

``` 
$ rbenv install --list
```

たくさん表示されますが、好きなものをダウンロードしましょう。
よくわからない人は、1.9.3-pXXX のXXX部分の数字が一番大きいのがおすすめです（執筆時点では 1.9.3-p547）。
まあ最近は2.xでもいいと思いますけど…。どうせ簡単に切り替えられるので気になったものをインストールしてみましょう。

```
$ rbenv install 1.9.3-p547
```

とか。数分かかります。気長に待ちましょう。

***注意: Ubuntu14.04 + rbenv ではバグがあるため 2.x 系のインストールは失敗します。ひと工夫することで回避できますが、私が原因をきちんと把握できてないのでここでは触れません。***

終わったら rehash で rbenv を更新します。

```
$ rbenv rehash
```

最後に、今インストールしたバージョンを global に指定して、Ruby のバージョンを確認すれば完了です。

``` 
$ rbenv global 1.9.3-p547
$ ruby --version
ruby 1.9.3p547 (2014-05-14 revision 45962) [x86_64-linux]
```

## 基本的な使い方

### インストール可能なバージョンの一覧

``` 
$ rbenv install --list
```

### インストール


```
$ rbenv install [バージョン]
```

### グローバルで使う Ruby のバージョンを指定する

そのマシン全体で使うデフォルトのRubyのバージョンを変更するには `global` を使います

```
rbenv global [バージョン]
```

### ローカルで使う Ruby のバージョンを指定する

`local` を指定すると、そのディレクトリ以下の Ruby のバージョンを指定できます。
たとえば基本的には 1.9.3-p547 を使うんだけどこのプロジェクトだけは 2.0.0-p481 を使いたい、といった場合に使います。この情報は `rbenv local` したディレクトリに `.ruby-version` が生成されて、その中に記録されています。

```
rbenv local [バージョン]
```
Javascriptでオブジェクトの配列をKey/Valueでソートする関数


オブジェクトの配列をオブジェクトのキー/値をもとにソートしたいと思ったときに作った関数を公開します。Node.jsでしか挙動確認していません。

##対象となるオブジェクトの配列の構造
あくまで例です。

```
[ 
  { user_name: 'のびすけ',
    area: '台中市',
    title: 'Qiitaのデザイン',  
    thread_id: 34,
    read_status: 0,
    newest_time: Wed Jun 04 2014 04:45:25 GMT+0000 (UTC),
    id: 1298 },
  { user_name: 'のびすけ',
    area: '台中市',
    title: 'aaa',
    thread_id: 37,
    read_status: 0,
    id: 1356 },
  { user_name: '菅原 遼介',
    area: '台中市',
    title: 'フルスタックな営業募集',
    thread_id: 36,
    newest_time: Fri Jun 06 2014 03:52:30 GMT+0000 (UTC),
    id: 1353 }
]

```
複数のオブジェクトが配列の中にある感じです。=> [{...},{...},{...}]

このときに例えばidが若い順番にオブジェクトをソートしたいってことがあると思います。これを実現する関数を作ってみました。

##自作した関数
実際にはNode.jsで利用しているのでコールバック出来るようにしています。

* 第１引数: オブジェクトの配列 [Array]
* 第２引数: ソートの軸にしたいキー名 [String]
* 第３引数: 降順(desc)か昇順(asc)か [String]
* 第４引数: コールバック関数

```object_array_sort.js

  function object_array_sort(data,key,order,fn){
    //デフォは降順(DESC)
    var num_a = -1;
    var num_b = 1;

    if(order === 'asc'){//指定があれば昇順(ASC)
      num_a = 1;
      num_b = -1;
    }

   data = data.sort(function(a, b){
      var x = a[key];
      var y = b[key];
      if (x > y) return num_a;
      if (x < y) return num_b;
      return 0;
    });

   fn(data); // ソート後の配列を返す
  }
```

##使い方

idの値が若い順に並び替えている例です。

```index.js

var data =  [{...},{...},{...}]; //利用したいオブジェクト配列

object_array_sort(data, 'id', 'asc', function(new_data){
	//ソート後の処理
	console.log(new_data); //
});
```

##結果

idが若いオブジェクトの順番にソートがされました。

```
[ 
  { user_name: 'のびすけ',
    area: '台中市',
    title: 'Qiitaのデザイン',  
    thread_id: 34,
    read_status: 0,
    newest_time: Wed Jun 04 2014 04:45:25 GMT+0000 (UTC),
    id: 1298 },
  { user_name: '菅原 遼介',
    area: '台中市',
    title: 'フルスタックな営業募集',
    thread_id: 36,
    newest_time: Fri Jun 06 2014 03:52:30 GMT+0000 (UTC),
    id: 1353 },
  { user_name: 'のびすけ',
    area: '台中市',
    title: 'aaa',
    thread_id: 37,
    read_status: 0,
    id: 1356 }
]

```

良かったらツッコミとか待ってます!

参考: [WEB開発備忘録　Javascriptで、連想配列(ハッシュ/hash)のキーを変数で指定するには？ -](http://go.shr.lc/1pKA0Hd)
参考: [[JavaScript]配列の配列・オブジェクトの配列をソート | 言葉の海のプログラマー -](http://go.shr.lc/1pXkw03)
これから研究を始める大学学部生や院生はDr.Elgを利用しよう



## Dr.Elgの説明
`Dr.Elg`ってなんぞやという感じですが、それもそのはずで、`Dr.Elg`とはここで私が初めて提唱する研究者向けのツール群です。特にこれから研究や卒論を始めるであろう大学学部生や院生には利用することを推奨します。基本的にはどれも無料のものなので学生さん必見です！！

`Dr.Elg`は研究を行ううえで便利な5つのツールの頭文字をとって名づけました。

* **D**ropbox
* **R** および RStudio
* **E**vernote
* **L**aTeX
* **G**itおよびGitHub

一番しっくりくる並びがこれだった、というだけで深い意味はありません。こんな文字列のほうが意味ありげで格好いい、というものがあればぜひお知らせください。

## 環境

自分の使用しているパソコンのOSは、

* Mac OS X 10.9.3
* Windows 7 Home Premium

になります。`Dr.Elg`のツールはOSを選びませんが、各OSで設定方法などが異なるので注意してください。

各ツールの概要と利用方法、そしてそれぞれの魅力について説明します。

## バックアップを備える定番オンラインストレージDropbox

[`Dropbox`](https://www.dropbox.com)はオンラインストレージサービスとして定番のもので、無料で2GBまでが利用できます。

写真やテキストファイルだけでなく、音楽ファイルやPDFなど、あらゆるファイルを保存し、WindowsでもMacでも、異なるパソコン間でファイルを同期できるのでUSBメモリーいらずな生活が過ごせます。また、一度同期されたファイルは万が一削除してもバックアップを取ることが可能です。

ちなみに、[このリンク](https://db.tt/WpEsOsd)からDropboxの登録とインストールを行えば、あなたに500MB（私には1GB）の容量が増えます（超推奨）。

URL: https://db.tt/WpEsOsd (招待URL)

## 統計解析や作図機能を備えるR/RStudio

[`R`](http://cran.r-project.org)はGPLライセンスの下で開発が進んでいる統計解析環境です。他の統計解析ソフトは高価なものが多いですが、`R`は無料です！**パッケージ**と呼ばれる拡張機能を備えていますが、それらも無料で使えます！

そして[`RStudio`](http://www.rstudio.com)は`R`の機能をそのまま備え、更に便利に使えるよう、整備された統合開発環境です。まずはRで、というのもいいですが、一度`RStudio`の良さを味わうと元には戻れません（おそらく）。

今ではさまざまな分野の研究で`R`が使われており、日本語の書籍やブログでの紹介が増えています。研究に必要な統計解析や作図はこの`R`を使ってやるのが標準ともいえます。`R`でできることはそれだけではなく、無限の可能性を秘めています。

URL:

* R http://cran.r-project.org
* RStudio http://www.rstudio.com


## メモから論文まで、すべてを記録するEvernote

5つのツールの中でも、もっとも利用する頻度が高く、とにかくなんでも[`Evernote`](https://www.evernote.com)に突っ込む、という習慣が確立しています。`Evernote`の検索機能は素晴らしい。`Evernote`のノートブック、ノートという概念は、紙媒体から完全に離れていない世界をコンピュータ上に再現しており素晴らしい。関連ノート表示機能は他に例を見ないほど素晴らしい。など、絶賛の声が止まない`Evernote`です。

Dropbox同様、基本的な利用は無料ですが、各月ごとに保存できる容量に制限があります（Dropboxは固定）。有料会員になれば各月の最大保存容量が1GBまで増えるので、空き容量気にする必要がなくなります。そしてまた、[こちらのリンク](https://www.evernote.com/referral/Registration.action?uid=276123&sig=797aac5db83e3d6039a009749e49ea1c)を利用して登録をしてくれればあなたにも私にも幸福があります。ぜひ！

URL: https://www.evernote.com/referral/Registration.action?uid=276123&sig=797aac5db83e3d6039a009749e49ea1c (招待URL)

## 古の文明とは言わせない、美文書作成システムLaTeX

[`LaTeX`](http://www.latex-project.org)で作られた文書は美しい。それは`LaTeX`が組版処理システムとして確固たる地位をもって開発されているためである。

`LaTeX`の長所は、数式の表示に優れていることが大きい。こんな感じに、文書中に複雑な数式を書きたいときに`LaTeX`では簡単に記述することができます。

```math
RGR=\frac{(\ln DBH_{2012}-\ln DBH_{2005^*})}{(t_{2012} -t_{2005^*})}
```

最初はとっつきにくいかもしれませんが、慣れてしまえば自由自在、思うがままに文書の見た目を操作することができます。中身はともかく、形から入りたいあなたは今すぐ`LaTeX`を使うべきでしょう。そしてなにより、窓から開放された気分は素晴らしいのです。

インストール、初期設定に関してはこちらの記事（[2012年、Mac(Lion)とTeXと日本語と、あとhomebrew - A Way of Code](http://toggtc.hatenablog.com/entry/2012/02/20/230500)）が新しめで詳しいのでおすすめ。

URL: http://www.latex-project.org

## さまざまなプロジェクト、バージョン管理に便利なGit/GitHub

最後に、これまで挙げたツールの中でも最も最近熱いのが[`GitHub`](https://github.com/)によるバージョン管理です。`GitHub`はバージョン管理システムである`Git`の機能を備え、**ソーシャルコーディング**の概念により、複数人でのソースコードの管理を念頭においています。

ファイルの細かい変更点をcommit messageとして残せるし、issues機能を使って課題や進捗状況を把握することもでき、乱雑になりがちなファイルを簡単にリポジトリと呼ばれるフォルダの下で管理することができます。

そして学生、教育機関の関係者であれば２年間、５つの非公開リポジトリを作成することができるので、まずは登録をしてみましょう。草を生やすことに謎の達成感を得ることができます。

URL: GitHub: https://github.com/


## 身も蓋もない話

Qiitaをチェックするような学生が、これまでに挙げたツールを使用していないとは考えにくい...。反対に、こうしたツールを使っていない学生はこの記事を発見できるとは思えない。

→**周囲の学生に告知を願います**、と書き残しておきます。
Engine Yardにデプロイした際にSlackに通知する。


Gemなどもあるが、さほど使いやすくも無かったのでcurlを直接叩いた。

```ruby:deploy/after_bundle.rb
on_app_master(){
  token = 'put_your_toke_for_incoming_webhook'
  link = 'https://github.com/engineyard/todo/commit/' + config.revision
  icon = ':ghost:'
  run 'curl -X POST --data-urlencode \'payload={"channel": "#tokyo", "username": "' + config.environment_name + '", "text": "@channel ' + config.deployed_by + ' deployed <' + link + '|'+ config.revision[0..7] + '>", "icon_emoji": "'+icon+'"}\' https://railtie.slack.com/services/hooks/incoming-webhook?token=' + token
}
```

JSONの作成などを綺麗にする余地はあるが動いたので。
iosでもスクロールさせないようにする


通常スクロールを固定するにはhtml,bodyにoveflow:hiddenをかけるときかなくなるが、iosなど touch eventによるスクロールは固定できない。

```sass
html,body
	overflow: hidden
```

なので、height: 100%;をする固定できる。

```sass
html,body
	overflow: hidden
	height: 100%
```