OmniAICreator/Qiita-1.07M huggingface dataset:
参照整合されているマスターデータをseed.rbで初期値セットする (Rails, PostgreSQL)


## 課題
参照整合されているマスターデータをseed.rbを用いて初期値セットしたい。
初回のセットは問題なくできるのだが、参照されているマスターデータの削除・更新をしようとすると、「外部参照しているデータがあるからダメよ」とその処理の時点でエラーが発生してしまう。
そうするとマスターデータの更新を行うことができないじゃないか。。

結論としては、参照検査されるタイミングをデータの処理時点ではなく、トランザクションの終了時に遅延させるすることで対応した。

## 状況
下記テーブルにて、採用活動の採用状況管理を行っているとする。

#### リクルーティング者
* テーブル名:Recruiting
* カラム: name, age, address, status

#### リクルーティング状況マスター
* テーブル名: RecruitingStatus
* カラム: status

#### 外部キー制約
`recruiting.status`に対して`recruiting_status.status`から外部キー制約を行う。

## 対策
そこで、参照検査されるタイミングを遅延することで、一時的に削除・更新をできるようにした。

`db/migrate/...`にて外部キーを作成する際、PostgreSQLはデフォルトだと`NOT DEFERRABLE`なので`DEFERRABLE INITIALLY IMMEDIATE`で作成する。

```
class AddForeignKeyToRecruiting < ActiveRecord::Migration
  def up
    execute <<-SQL
      ALTER TABLE
        "recruiting"
      ADD CONSTRAINT
        "recruiting_recruiting_status_fk"
      FOREIGN KEY
        ("status")
      REFERENCES
        "recruiting_status" ("status")
      ON DELETE NO ACTION
      ON UPDATE CASCADE
      DEFERRABLE INITIALLY IMMEDIATE;
    SQL
  end

  def down
    execute <<-SQL
      ALTER TABLE
        "recruiting"
      DROP CONSTRAINT if exists "recruiting_recruiting_status_fk";
    SQL
  end
end
```

`seed.rb`を用いて初期データを追加する。

* トランザクションの中で処理を行う。
* `SET CONSTRAINTS recruiting_recruiting_status_fk DEFERRED`で`DEFERRABLE INITIALLY DEFERRED`に変更する。

```
begin
  ActiveRecord::Base.transaction do
    connection = ActiveRecord::Base.connection
    deferred_sql = 'SET CONSTRAINTS recruiting_recruiting_status_fk DEFERRED'
    connection.execute(deferred_sql)

    RecruitingStatus.delete_all

    RecruitingStatus.create!([
      { status: '不採用' },
      { status: '採用' },
    ])
  end
rescue => e
  puts "Rollback for RecruitingStatus:\n#{e}"
end
```

これで`seed.rb`を用いてマスターデータのセット・更新ができるようになった。

## 参考
[SET CONSTRAINTS](https://www.postgresql.jp/document/9.4/html/sql-set-constraints.html)
Excel 2016 > csvファイル > 日本語が文字化けする対処方法

```txt:動作環境
Windows 8.1 pro (32bit)
Excel 2016
```

###症状
csvファイルを開くと、日本語が文字化けする。

###対応方法
1. ファイル > オプション > 言語　を選択
2. 「編集言語の選択」がデフォルトで`英語`になっているのを`日本語`にする
3. 「既定に設定」を押す

Officeの再起動後に有効になる。
Atom Emmetの[ctrl + u]で画像のサイズが取得出来ない場合（Atom）


keymap.csonに以下を追記

```coffeescript
'.platform-win32 atom-text-editor, .platform-linux atom-text-editor':
  'ctrl-u': 'unset!'
'atom-text-editor:not([mini])':
  'ctrl-u': 'emmet:update-image-size'
```

[html-img](https://atom.io/packages/html-img)という多機能なパッケージもあるみたいですが、CSSには対応していないみたいです。
XCTestからKinesis#putRecordsを実行するとNSInternalInconsistencyExceptionが発生


## 概要

XCTestからAWSKinesis#putRecordsを実行するとNSInternalInconsistencyExceptionが発生する。XCTest以外からは正常に実行される。

例外内容:

```
failed: caught "NSInternalInconsistencyException", "Invalid parameter not satisfying: [modelClass isSubclassOfClass:AWSMTLModel.class]"
```

## 環境

* Xcode7
* Cocoapods 0.38.2
* Objective-c

## 原因

AWSCore内にインストールされているMantleが重複インストールされるとこのエラーが発生する（らしい）。

## 対策

Test用のターゲットに`exclusive`オプションを設定して重複インストールされれないようにする。

```
platform :ios, '8.0'

pod 'AWSiOSSDKv2/Kinesis'

target :ExampleTest, exclusive: true do
    pod 'OCMock'
end
```

## 参考

* [Weird assert · Issue #326 · Mantle/Mantle](https://github.com/Mantle/Mantle/issues/326)
CentOS5.9 で yum から tomcat7 が入らない

## インストール手順

```
yum install yum-priorities -y
rpm -Uvh http://mirrors.dotsrc.org/jpackage/6.0/generic/free/RPMS/jpackage-release-6-3.jpp6.noarch.rpm 
yum install tomcat7-webapps -y --nogpgcheck
```

## エラー内容

```
Running rpm_check_debug
ERROR with rpm_check_debug vs depsolve:
rpmlib(FileDigests) is needed by apache-commons-logging-1.1.3-2.jpp6.noarch
rpmlib(PayloadIsXz) is needed by apache-commons-logging-1.1.3-2.jpp6.noarch
rpmlib(FileDigests) is needed by apache-commons-pool-tomcat5-1.5.7-1.jpp6.noarch
rpmlib(PayloadIsXz) is needed by apache-commons-pool-tomcat5-1.5.7-1.jpp6.noarch
rpmlib(FileDigests) is needed by apache-commons-daemon-1.0.15-1.jpp6.noarch
rpmlib(PayloadIsXz) is needed by apache-commons-daemon-1.0.15-1.jpp6.noarch
Complete!
(1, [u'Please report this error in https://bugzilla.redhat.com/enter_bug.cgi?product=Red%20Hat%20Enterprise%20Linux%205&component=yum'])
```

上記のようなエラーがでるので、同様の現象で海外サイトを漁ってみたが該当PKGを yum remove したり yum clean all しても解決できなかった。。。
結局 tar.gz でインストールにする。

```
wget https://archive.apache.org/dist/tomcat/tomcat-7/v7.0.54/bin/apache-tomcat-7.0.54.tar.gz
tar zxf apache-tomcat-7.0.54.tar.gz
mv apache-tomcat-7.0.54 /usr/share/tomcat7
```
pod installでundefined method `project’ 発生


## 概要

Cocoapodsの`pod install`をすると`undefined method project for #<Pod::Installer:xxx>`のエラーが発生する。

## 環境

* Cocoapods 0.38.2

## 原因

0.38.0からGemfile中の`post_install`内で使う`installer_representation.project`は廃止された。

## 対策

代わりに`installer_representation.pods_project`を使う。

例:

```Gemfile
post_install do |installer_representation|
  installer_representation.pods_project.targets.each do |target|
  end
end
```

## 参考

* [post_install App Extension for AFNetworking "undefined method `project'" Xcode 7 Beta 3 · Issue #3811 · CocoaPods/CocoaPods](https://github.com/CocoaPods/CocoaPods/issues/3811)
RassberyPI ruby環境作成


・libを入れる
sudo apt-get install libssl-dev
sudo apt-get install libreadline-dev
sudo apt-get install ruby-dev

・rbenv
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

rbenvが使えるようになる。

rbenv install --list

・とりあえず、2.1.7をインストール 

rbenv install 2.1.7
(とても時間がかかる（ハードディスク化しても１時間くらい。。。）)

rbenv global 2.1.7
rbenv rehash
ruby -v

とりあえず使うであろうgemを入れる

gem install mechanize
(nokogiriのビルドに時間がかかる。。。)

gem install erubis
gem install sinatra --no-ri
(riでなぜか固まる。。。)
sqlite3でcsvファイルからインポート


他のDBからcsvファイルとして抽出したデータをローカルのDBにインポートしてみる。

csvファイルは事前に整形しておく。

## 現在の設定を確認
 `.show`で区切り文字を確認する。

```
sqlite> .show
     echo: off
      eqp: off
  explain: off
  headers: off
     mode: list
nullvalue: ""
   output: stdout
separator: "|"
    stats: off
    width:
sqlite>
```

separatorが現在の区切り文字。上記では`|`となっている。


## 区切り文字の変更
csvは`,`区切りなので、`.separator ,`で区切り文字を変更する。

```
sqlite> .separator ,
sqlite> .show
     echo: off
      eqp: off
  explain: off
  headers: off
     mode: list
nullvalue: ""
   output: stdout
separator: ","
    stats: off
    width:
sqlite>
```

separatorが`|`から`,`に変更された。

## csvファイルのimport
インポートは`.import csvファイ名 テーブル名`でインポート

```
sqlite> .import sample.csv TEST_TABLE
```

### おまけ
何度もimportとdrop/createを繰り返して試していたら、ファイルサイズが大きくなっていた。
どうやらdoropやdeleteでテーブルやレコードを削除しても、ファイルサイズすぐに減らず、コマンドで空き領域を開放する必要がある。
空き領域を開放するには、`vacuum;`を実行
`sqlite> vacuum;`
targetSDKが23以下のアプリはPermissionChekerが使える

Android M になると、ユーザーが permission(protectionLevel=dangerous)を任意のタイミングで操作できるようになるのはご存知かと思います。アプリインストール時は、以下のようになります。

* targetSDK を API22 以前に指定 -> dangerous な permission が デフォルト **ON** でインストールされる
* targetSDK を API23 に指定 -> dangerous な permission が デフォルト **OFF** でインストールされる

このように、targetSDK を API23 に指定する場合は、dangerous な permission が **OFF** になってしまうため、必然的に permission のチェックが必要になってくることになります。これを嫌って、targetSDK を API22 以前のものに指定する開発者もまだいらっしゃるかと思いますが、その場合、Context.checkSelfPermission がうまく動かないようです。

https://code.google.com/p/android-developer-preview/issues/detail?id=2773
https://code.google.com/p/android-developer-preview/issues/detail?id=2824

ということで、targetSDK を API22 以前のままビルドするアプリを 、Android M に取り急ぎ対応させたい場合(compileSDK を API23 にするなど)は、PermissionChecker を使いましょう。

http://developer.android.com/intl/ja/reference/android/support/v4/content/PermissionChecker.html

***

2015/10/15 追記

SMS の permission(READ_SMS など)は、targetSDK を API23 にしないと、状態が正しく取得できないです。仕様かどうかはソースを調べてないのでわかりません。
React.js (JSX) で <pre>タグ内の改行が消えてなくなるんだけど？

JSX で

```html
<pre>
foo
bar
</pre>
```

と書くと、レンダリングされる結果は

```html
<pre>foo bar</pre>
```

となる。

いやいや、pre-formatted text を書きたいんだよ俺は。

幸いにも ES6 (ES2015 っていうのかな? babel です) を使っていたので、次のような方法が使えた。

```html
<pre>
{`
foo
bar
`}
</pre>
```

これでレンダリング結果は

```html
<pre>
foo
bar
</pre>
```

となる。

[Template string](https://babeljs.io/docs/learn-es2015/#template-strings) が multi line サポートしてくれてて本当に良かった。
rubyinstaller-2.2.3のインストール時にsqlite3で躓いた時

#sqlite3で躓いたが…

##rake --tasksでまた躓いた。(今度は、rakeでnokogiriやらbcypt_extやら…)

```C:/ruby/lib/ruby/gems/2.0.0/gems/sqlite3-1.3.7-x86-mingw32/lib/sqlite3.rb:6:in `require':cannot load such file -- sqlite3/sqlite3_native (LoadError)```

ネット上には様々な情報があるけれども、上記のエラーがでちゃった時には…
[SQlite](http://www.sqlite.org/)から、Precompiled Binaries for Windowsをダウンロードして、パスの通ったところ(渡しの場合は```C:\Ruby22\bin```)に移動させる。(今回は、32bit版です。)

[Windows で SQLite3 の 64bit バイナリを自分で作る-Qiita](http://qiita.com/akaneko3/items/0e99c3c1366dfbad006f)

あたりを参考にすると幸せになれるかもしれません。
残念ながら64bit版は試していません。
Pocket WiFi 401HW > 無線で見つからなくなる > バッテリ外して再起動

```txt:動作確認
Windows 7Pro
iPad mini 4
```

ワイモバイルの401HW

使っているうちに、無線で見えなくなる時がある。
スイッチで電源入り切りしても回復せず。

バッテリーを外してからつけて、再起動したら見えるようになった。

微妙だ。。。

<hr>
3時間程度使っていたら上記の症状が発生する。

<hr>
(2015/10/09追記)
今日は午前中だけで7回は切断された。

401HWが悪いのか、ワイモバイルのネットワークの問題なのかはっきりしない。

<hr>
(2015/10/09追記)
昨日は3回程度切れた程度だったが、今日は25回以上切断した。

いったんつながらなくなると、何をやってもつながらないのが結構続く。

ルータがダメなのか、ネットワークがダメなのかはわからない。
c++ builder XE4, 10.2 Tokyo > form > フォームサイズ自動変更

```txt:動作確認
C++ Builder XE4 on Windows 7pro
Rad Studio 10.2 Tokyo Update 2 on Windows 10 Pro(追記: 2017/12/26)
```

ノートPC (1367 x 768)向けに作っていたソフトを大画面モニタで使用するため、フォームサイズ自動変更する。

##try1 
以下の関数を FormShow()にてコールしている。

```cpp
void __fastcall TForm1::Screen_autoSizeSetting()
{
	// 基準となるノートPCの解像度
	int noteW = 1367;
	int noteH = 768;

	int myW = Screen->Monitors[0]->Width;
	int myH = Screen->Monitors[0]->Height;

	if (myW <= noteW && myH <= noteH) {
		return;
	}

	float ratioH = (float)myH / (float)noteH;
	float ratioW = (float)myW / (float)noteW;

	int setRatio;
	if (ratioH < ratioW) {
		setRatio = ratioH * 100; // 少数第二位まで扱う
	} else {
		setRatio = ratioW * 100;
	}

//	String msg = IntToStr(setRatio);
//	OutputDebugString(msg.c_str());

	this->ScaleBy(setRatio, 100);

}
```

##try2 (複数フォーム対応版)

任意のフォームに適用するバージョン。

```cpp
void __fastcall TFormMain_graph::XXX_autoSizeSetting(TForm *formsPtr[], int num)
{
	// 基準となるノートPCの解像度
	int noteW = 1367;
	int noteH = 768;

	int myW = Screen->Monitors[0]->Width;
	int myH = Screen->Monitors[0]->Height;

	float ratioH = (float)myH / (float)noteH;
	float ratioW = (float)myW / (float)noteW;

	int setRatio;
	if (ratioH < ratioW) {
		setRatio = ratioH * 100; // 少数第二位まで扱う
	} else {
		setRatio = ratioW * 100;
	}

	for(int idx=0; idx < num; idx++) {
		formsPtr[idx]->ScaleBy(setRatio, 100);
	}

}
```

以下のような使い方にする

```cpp
void __fastcall TFormMain_graph::Screen_autoSizeSetting()
{

	TForm *forms[] = {
		this,
		Form2,
		FormXXX,
	};
	int numForms = sizeof(forms) / sizeof(TForm *);

	XXX_autoSizeSetting(forms, numForms);

	return;
}
```

内部処理を共通化することで、変更時の対応を楽にする。

### 注意点
(追記 2017/12/26)

Monitors[]使用時は、下記の点に注意するとよい。

[C++ Builder XE4, 10.2 Tokyo > モニタ解像度 > Bug > Screen->Monitors[0]のWidthとHeightがおかしくなる](https://qiita.com/7of9/items/5cf279339b0081a7feef)
Amazon EC2にSudoユーザーを追加する。

# はじめに

どーでもいい内容です。
僕がAWSを構築して人に全ての権限を渡すときに使ったコマンドのメモです。
セキュリティ甘々です。

ってか「こんなのメモるな！」っていうくらいどーでも良いことだけど。

## ユーザーの追加
渡すユーザーを作成します。

```sh
$ ssh ec2-user@xxxx -i xxx.pem
$ useradd sudo-user
```

必要ならパスワードをつけるけど、ここでは鍵認証SSHでログインしてもらうのでつけない。

## 鍵の作成
自分のPCでRSA鍵を作る。

```sh
$ ssh-keygen -t rsa
```

適当なフォルダに鍵をつくる。必要に応じてパスフレーズをつける。

## 作った鍵を登録する

```sh
$ ssh ec2-user@xxxx -i xxx.pem
# 作成したsudoユーザーに切り替える。
$ sudo su - sudo-user 
$ mkdir .ssh
$ vi .ssh/authorized_keys
```

先ほど作った鍵の公開鍵(`ras.pub`の中身)を貼り付けて保存する。

## sudo権限をつける

```sh
$ ssh ec2-user@xxxx -i xxx.pem
$ sudo visudo
```

rootの下あたりに・・・。パスワードも無しで・・・。

```
root    ALL=(ALL)       ALL
sudo-user ALL=(ALL)       NOPASSWD:ALL
```

保存。

## sudoユーザーでログインして確認

```sh
$ ssh sudo-user@xxx -i ras[さっき作った鍵]
$ sudo ls
```

確認が終わったら相手に秘密鍵を送る。
メールなどのインターネットを使う場合は接続情報と鍵は一緒に送らないこと。

以上。

## 最後に
実際はsudo-userには`passwd`をつけてあげたほうが良いけど、一時的に環境構築をするときはちょっと邪魔なので全て割愛した。
`ec2-user`にも鍵をかけたほうが良いかもしれない。その場合は以下の設定も変える必要がある。

```sh
$ sudo visudo -f /etc/sudoers.d/cloud-init
```

[初期アカウントがパスワード無しでsudo出来るのが気持ち悪いという貴方へ](http://blog.serverworks.co.jp/tech/2013/08/16/sudo-without-password-makes-me-feel-disgusting/)を参考にしてます。

visudoは絶対使いましょう。ミスったときに取り返しがつかなくなります。

あと、rootユーザーでsshできるかな？と見てみると

```sh
$ sudo view /etc/ssh/sshd_config
```

こうなってた

```
PermitRootLogin forced-commands-only
```

なので、特定のコマンドしか使えないのでrootユーザーに関する考慮は不要の模様。
でも念のためrootのauthorized_keysを確認

```sh
$ sudo view /root/.ssh/authorized_keys
```

こうなってた。

```
no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="echo 'Please login as the user \"ec2-user\" rather than the user \"root\".';echo;sleep 10" ssh-rsa XXXXXXXX
```

特に変更しなくても問題なさそうだ。
最初にshare dialogにアクセスしたユーザだけog:imageが表示されない問題


facebookのog:imageを毎度違うものにするため、サーバーでシェア用ページを生成する手法をとる際、
生成したページのshare dialogを初めて開いたユーザだけ、og:imageが正しく表示されないという
facebook側の仕様(?) がある模様。

これは、
og:image:width
og:image:height
を正しく設定しておけば解決できる。

例:

```
<meta content="960" property="og:image:width" />
<meta content="504" property="og:image:height" />
```
毎度忘れるRubyの配列操作

毎度ggっているので備忘録。versionは2.2.2

| やりたいこと     | メソッド |
|:-----------------|:---------|
| 末尾から取り出す | pop      |
| 末尾に追加する   | push     |
| 先頭から取り出す | shift    |
| 先頭に挿入する   | unshift  |

    irb(main):001:0> array = [1, 2, 3, 4, 5]
    => [1, 2, 3, 4, 5]
    irb(main):002:0> array.pop
    => 5
    irb(main):003:0> array
    => [1, 2, 3, 4]
    irb(main):004:0> array.push(5)
    => [1, 2, 3, 4, 5]
    irb(main):005:0> array.shift
    => 1
    irb(main):006:0> array
    => [2, 3, 4, 5]
    irb(main):007:0> array.unshift(1)
    => [1, 2, 3, 4, 5]
    irb(main):008:0>

どれも破壊的ですね。
boxファイルを再配布

``box add``してboxファイルは消しちゃった方向け

ver1.7.3にて確認

## コマンド

``box repackage``コマンドを使う

```bash
vagrant box repackage <name> <provider> <version>
```

* name  
  元々のbox名
* provider  
  ``virtualbox``とか``aws``とかを指定する
* version  
  省略可能?

## 例

```bash

vagrant box list

# hoge (virtualbox, 0)みたいな感じでboxリストが表示されるので確認

vagrant box repackage hoge virtualbox

# カレントディレクトリへpackage.boxが生成されるはず

```
TypeScriptでWikipedia APIから情報取得

TypeScriptでWikipediaの情報をmediawiki APIにより取得する。
WikipediaのAPIに関しては[MediaWiki APIを使ってWikipediaの情報を取得](http://qiita.com/yubessy/items/16d2a074be84ee67c01f)を参考にした。

# 目標
ある文字列を含む記事の検索結果を取得する。

# 返り値の確認
[APIサンドボックス](https://ja.wikipedia.org/wiki/%E7%89%B9%E5%88%A5:API%E3%82%B5%E3%83%B3%E3%83%89%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9)を使って確認する。
形式=json、操作=query, list=search、srsearch=「検索文字列」にしてリクエストすれば、返り値が確認できる。
![APIサンドボックス.PNG](https://qiita-image-store.s3.amazonaws.com/0/56307/8b35907e-7c67-f6da-f741-f70b0905ca85.png)
![APIサンドボックス結果.PNG](https://qiita-image-store.s3.amazonaws.com/0/56307/d22087b8-09ef-d8e2-e61e-576e5aca4ef6.png)

# TypeScriptソースコード
APIサンドボックスのリクエスト結果からリクエストコードを書く。
リクエストにはjqueryを使用している。

```ts:Wikipedia.ts
namespace utils.Wikipedia {
    const ENDPOINT = 'https://ja.wikipedia.org/w/api.php?'
    const TITLE_BASE_URL = ENDPOINT + 'action=query&list=search&format=json&srsearch='

    export function search(title: string, success: (infos: Array<SearchInfo>) => void, fail?: (jqXhr: JQueryXHR) => void) {
        var url = TITLE_BASE_URL + encodeURIComponent(title)
        var xhr = $.ajax({
            url: url,
            type: 'GET',
            dataType: 'jsonp',
            jsonpCallback: 'callback'
        })
        xhr.then((json: SearchResponseJson) => {
            success(json.query.search)
        }, fail)
    }

    interface SearchResponseJson {
        query: {
            search: Array<SearchInfo>
        }
    }

    export interface SearchInfo {
        title: string,
        snippet: string,
        wordcount: number,
        timestamp: string
    }
}
```
Macで `.gz` ファイルの内容を確認したい場合はzcatではなくてgzcatを使うらしい


* .gzファイルをzcatすると↓のように怒られる

	```
	zcat: can't stat: xxx.gz (xxx.gz.Z): No such file or directory
	```
	
* かわりにgzcatコマンドを使用すればOK

	```
	gzcat xxx.gz
	```
c++ builder > form > モニタ解像度の取得 > Screen->Monitors[0]->Width; / ->Height; // Screen->PrimaryMonitor->

```txt:動作確認
C++ Builder XE4
```

モニタ解像度を取得したい。
過去に作ったプログラムのソースを参考にした。

```cpp
// 1. Monitors[]使用
	int width = Screen->Monitors[0]->Width;
	int height = Screen->Monitors[0]->Height;

	String msg = String().sprintf(L"W%d x H%d", width, height);
	Memo1->Lines->Add(msg);

// 2. PrimaryMonitor使用
	width = Screen->PrimaryMonitor->Width;
	height = Screen->PrimaryMonitor->Height;
	msg = String().sprintf(L"W%d x H%d", width, height);
	Memo1->Lines->Add(msg);
```

```txt:結果(Memo1:TMemo)
Memo1
W1920 x H1080
W1920 x H1080
```

モニタが複数ある場合は Monitors[]を使えば2つ目も扱える。
tarコマンドについての素朴な疑問を調べた 

## はじめに
linuxを使うにあたって避けて通れない``tar``コマンド。入門書でも当たり前のように使われてるけど、そもそも``tar``って何者なのよとずっと気になっていたので調べてみました。

## 何の略？
**T**ape **Ar**chievesの略。
その名の通り、元々は磁気テープ向けにファイルをアーカイブするためのコマンドでした。

## アーカイブって何？
アーカイブとは複数のファイルを一つにまとめることです。
ここで私は「1つにまとめるならディレクトリという仕組みがあるじゃないか」と疑問に思ったのですが、それは的外れでした。

ディレクトリは飽く迄も概念で、それをどのように実現するかはファイルシステムの自由です。場合によってはファイルはディスク上にバラバラに配置されているかもしれません。そのままではシーケンシャルな磁気テープにファイルを書き出すことはできません。

![無題の図形描画.png](https://qiita-image-store.s3.amazonaws.com/0/29682/30400153-e9ef-4bd7-f616-cb857b8e94b9.png)

そこで、複数のファイルを一つにまとめるアーカイブの出番です。ファイルのフォーマットを決めて一つのファイルにまとめることによって初めて磁気テープに書き出したり、ファイルを配布できるようになるのです。

![無題の図形描画 (1).png](https://qiita-image-store.s3.amazonaws.com/0/29682/b2701ff6-7dc5-427c-a303-edf7a4cf113f.png)

## hoge.tar.gzって何？
tarフォーマットのアーカイブファイルをgzipという形式で圧縮したものです。

私は、なぜ直接``hoge.gz``に圧縮せず``tar``を挟むのか疑問でした。

理由は、gzipにアーカイブ機能がないからです。例えば、zipではAファイルとBファイルをひとまとめに（アーカイブ）して圧縮できます。しかし、gzipではそのような事はできずファイルを一つ一つ圧縮する事しかできません。そのため、tarでファイルを1つにまとめてから圧縮する必要があるのです。

![無題の図形描画 (2).png](https://qiita-image-store.s3.amazonaws.com/0/29682/7a2897f7-e044-7937-8174-6963c45fa2af.png)

## zipでよくね？
なぜメジャーなzipを使わないんだろうと疑問におもったのですが、ごめんなさい、これに関しては結論は出ませんでした。恐らく「歴史的経緯」で片付くと思うのですが、文献が見当たりませんでした。

少なくとも、Linux界隈ではtar.zgがよく使われているということは事実で、そういうものなんだという割り切るしかなさそうです。OSが変われば作法も変わるというのは当たり前のことですしね。

## なんでオプションにハイフンがないの？
``tar``コマンドはオプションにハイフンをつけなくてもいい珍しいコマンドです。例えば次のような具合です。

```bash
$ tar cvf hoge.tar hoge
```

しかし、次のようにハイフンをつける事もできます。

```bash
$tar -cvf hoge.tar hoge
```

なぜオプションにハイフンを付けたり付けなかったりして良いのでしょうか。

結論から言ってしまえば歴史的経緯によるものです。コマンドラインオプションに``-``をつける慣習ができる前から``tar``コマンドは存在していたのです。

* tarコマンドができる
 * この時点ではオプションに``-``は必要なかった
* コマンドラインオプションは"-"で始めるというルールができる
* そのルールに従うようにtarコマンドを修正する
 * しかし、互換性のために古い記法も残された

tarコマンドは非常に長い歴史のあるコマンドということですね。
MacOS フルキーボードのキーコード一覧

# MacOS KeyCode (Full)

キーコードを送信して，キーが押されれたのと同じ処理を実行させるサーバプログラムを作成する予定があり，Macのキーコード一覧をネットで調べた結果を保存しておく．

※ 参照元URL http://hyslog.com/blog/2012/06/25/569

| Key | Code |
|:---:|:---:|
| a | 0 |
| b | 11 |
| c | 8 |
| d | 2 |
| e | 14 |
| f | 3 |
| g | 5 |
| h | 4 |
| i | 34 |
| j | 38 |
| k | 40 |
| l | 37 |
| m | 46 |
| n | 45 |
| o | 31 |
| p | 35 |
| q | 12 |
| r | 15 |
| s | 1 |
| t | 17 |
| u | 32 |
| v | 9 |
| w | 13 |
| x | 7 |
| y | 16 |
| z | 6 |
| | |
| 0 | 29 |
| 1 | 18 |
| 2 | 19 |
| 3 | 20 |
| 4 | 21 |
| 5 | 23 |
| 6 | 22 |
| 7 | 26 |
| 8 | 28 |
| 9 | 25 |
| | |
| – | 27 |
| + | 24 |
| [ | 33 |
| ] | 30 |
| \ | 42 |
| ; | 41 |
| ‘ | 39 |
| , | 43 |
| . | 47 |
| / | 44 |
| | |
| F1 | 122 |
| F2 | 120 |
| F3 | 99 |
| F4 | 118 |
| F5 | 96 |
| F6 | 97 |
| F7 | 98 |
| F8 | 100 |
| F9 | 101 |
| F10 | 109 |
| F11 | 103 |
| F12 | 111 |
| F13 | 105 |
| F14 | 107 |
| F15 | 113 |
| F16 | 106 |
| F17 | 64 |
| F18 | 79 |
| F19 | 80 |
| | |
| tab | 48 |
| caps lock | 57 |
| space | 49 |
| return | 52 |
| left shift | 56 |
| right shift | 60 |
| left option | 58 |
| right option | 61 |
| left control | 59 |
| right control | 62 |
| left command | 55 |
| right command | 54 |
| delete | 51 |
| esc | 53 |
| | |
| left arrow | 123 |
| right arrow | 124 |
| up arrow | 126 |
| down arrow | 125 |
| | |
| fn | 63 |
| delete | 51 |
| home | 116 |
| end | 121 |
| page up | 115 |
| page down | 119 |
| | |
| clear | 71 |
| = | 81 |
| / | 75 |
| * | 67 |
| – | 78 |
| + | 69 |
| enter | 76 |
| . | 47 |
| 0 | 82 |
| 1 | 83 |
| 2 | 84 |
| 3 | 85 |
| 4 | 86 |
| 5 | 87 |
| 6 | 88 |
| 7 | 89 |
| 8 | 91 |
| 9 | 92 |
reactやmithrilのvdomでiframeの中を管理

![iframe](https://i.gyazo.com/29d9a92413fc5fd8f4e94306488288de.gif)

こんなことがしたい。

# react の場合
```html
<body>
  <iframe id="box-preview-iframe"></iframe>
</body>
```

```coffeescript
$ ->
  iframeBody = document.getElementById("box-preview-iframe").contentDocument.body
  comp = React.render(React.createElement(Preview, {}), iframeBody)
  setInterval((()->
    date = new Date
    console.log body = """<div>
    <span>#{date.getHours()}</span>:
    <span>#{date.getMinutes()}</span>:
    <span>#{date.getSeconds()}</span>
    </div>"""
    React.render(React.createElement(Preview, {body}), iframeBody)
  ),1000)

Preview = React.createClass
  render: ->
    JSXTransformer.exec(@props.body || "<div></div>")
```

## [追記] Mithril の場合
* https://github.com/lhorie/mithril.js/issues/67
* https://lhorie.github.io/mithril/tools.html
* https://lhorie.github.io/mithril/tools/template-converter.html

を読む限り

* http://lhorie.github.io/mithril/tools/template-converter.js

これを使えばよさそう。component含んでるけど。

```html
<script src="template-converter.js"></script>
<body>
</body>
```

```coffeescript
$ ->
  m.mount(document.body, RootComponent)

RootComponent =
  controller: (data)-> {}
  view: (ctrl)->
    m("div", {id: "box"}, [
      m("section", {id: "box-box-preview"}, [
        m.component(PreviewComponent, ctrl.PreviewController)
      ])
    ])


PreviewComponent =
  controller: (attrs)->
    setInterval((()->
      console.log date = new Date
      model.body("""<div>
      <span>#{date.getHours()}</span>:
      <span>#{date.getMinutes()}</span>:
      <span>#{date.getSeconds()}</span>
      </div>""")
      m.redraw(true)
    ),1000)
    model = {
      head: m.prop("")
      body: m.prop("")
    }
  view: (ctrl, attrs)->
    m("iframe", {
      id: "box-preview-iframe",
      config: PreviewComponent.config(ctrl, attrs)
    }, [])
  config: (ctrl, attrs)-> (elm, isInitialized, ctx, vdom)=>
    if !isInitialized
      console.log ctrl
      m.mount(elm.contentDocument.head, {
        view: (_ctrl, _attrs)->
          code = templateConverter.Template(ctrl.head())
          new Function("ctrl", "attrs", "return #{code}")(_ctrl, _attrs)
      })
      m.mount(elm.contentDocument.body, {
        view: (_ctrl, _attrs)->
          code = templateConverter.Template(ctrl.body())
          new Function("ctrl", "attrs", "return #{code}")(_ctrl, _attrs)
      })

```

![mithril](https://i.gyazo.com/f36bd8f6dc645997b136fd6ed99e5b44.gif)
React 0.14 - ExecutionEnvironmentはどこへいった


さくっとreact 0.14にあげてみたらこれがコケた

```js
import ExecutionEnvironment from 'react/lib/ExecutionEnvironment'
```

そもそもテストで行っているハックっぽいことなので、ドキュメントにも載ってなさげだった。
色々探して`fbjs`に含まれるようになったことがわかった

ということでこんなんで解決

```
$ npm i -D fbjs
```

```js
import ExecutionEnvironment from 'fbjs/lib/ExecutionEnvironment'
```
アクセスログで時間単位(分)でドメイン毎のアクセス数の合計数を算出するワンライナー

squidのアクセスログからアクセスしたドメイン毎の1分間単位のアクセスを調べるワンライナーを書いたのでメモ。

squidに限らず、アクセスログの時間単位の集計は基本的に以下にならってやれば良いのでないかと思います。(簡易なものは）

1. sedでアクセスログの時間列の不要部分を削除する
1. awkで必要な列だけ抽出
1. sort と uniq -cで行数をカウント

# 最終的なワンライナー

```
$sed 's/:[0-9][0-9][\x20]+\+0900\.[0-9][0-9][0-9]|//g' access.log | awk -F "|" '{ print $1,$8; }' | sort | uniq -c
      2 06/Oct/2015:18:00  - AAA.ne.jp
      2 06/Oct/2015:18:00  - BBB.ne.jp
      2 06/Oct/2015:18:07  - CCC.ne.jp
      2 06/Oct/2015:18:07  - AAA.ne.jp
      3 06/Oct/2015:18:10  - CCC.ne.jp
      4 06/Oct/2015:18:10  - BBB.ne.jp
・・・・
```

# sedでアクセスログの時間列の不要部分を削除する

最後のパイプの部分でuniqコマンドによってユニークな行数をカウントするので、不要な秒やそれ以外の時間の部分をsedコマンドを使って削除します。
正規表現で合致する部分を任意の文字列に置き換えることができるので、今回は正規表現にマッチした部分（秒以下の時間の部分）を空文字に置換（つまり削除）するようにしています。

```
$cat access.log
06/Oct/2015:18:00:47 +0900.483|200|・・・

$sed 's/:[0-9][0-9][\x20]+\+0900\.[0-9][0-9][0-9]|//g' access.log
06/Oct/2015:18:00  -|200|・・・
```

集計単位が時、秒の場合も同様に不要な部分を削除すれば同じ要領で集計が出来ると思います。


# awkで必要な列だけ抽出

今回、ドメイン毎の集計なのでアクセス時間とドメイン部分以外はuniqコマンドで集計する際に邪魔です。
必要な列の抜き出しにはawkコマンドを使います。
今回のログでは1列目にアクセス日時、8行目にドメインの記載があったので該当列のみ抽出します。
各列のセパレーターは「|」なので-Fオプションで指定します。

```
$ awk -F "|" '{ print $1,$8; }' access.log
```

上記で該当列のみの抽出が出来ます。

# sort と uniq -cでカウント

uniqコマンドの-cオプションを付与することで内容が同じ行のカウントができるのでこれを利用します。

sedとawkによって既に集計したい時間とドメインのみの行となっているので、アクセスした日時分までが同じでかつ、同じドメインの場合には同じ文字列となっているはずです。
上記を利用し、uniq -cによって行数を集計します。
なお、uniqは事前にソートされている必要があるのでsortコマンドを使って事前にソートするようにしています。
Docker コマンド一覧

- コンテナ

| 操作  | コマンド  |
|---|---|
| コンテナ一覧  | docker ps  |
|  実行中コンテナへの接続(attach) | docker attach CONTAINER  |
|  コンテナ実行 | docker run  |
|  コンテナ実行（ファイル共有付き） | docker run -v [ホスト側のディレクトリ]:[コンテナ側のディレクトリ] |
|  実行中コンテナへの接続（bash付き） | docker exec -i -t <Container ID> /bin/bash  |
|  インタラクティブコンテナ実行（bash付き） | docker run -i -t ubuntu:vivid /bin/bash  |


- イメージ

| 操作  | コマンド  |
|---|---|
| コンテナ一覧  | docker images  |
| Ubuntu(15.04)イメージの取得と実行  | docker run ubuntu:vivid  |

参考サイト
https://gist.github.com/hotta/69b476ae6662c5ff67f0/
PyDevでテンプレートカスタマイズ

# 概要
Eclipse + PyDev環境でモジュール作成時に自動挿入されるコメント等を変更する。
今回は下図の先頭に「# -*- coding: utf-8 -*-」を追加して作成されるようにする。
![a.png](https://qiita-image-store.s3.amazonaws.com/0/73630/27c53c2d-440d-4b4f-89a5-46c98d7c1bf3.png)

# 手順

0. Eclipseのメニューバーから [Window] > [Preferences] > [PyDev] > [Editor] > [Templates]を選択
0. 下図左側の赤枠「Nameが<Empty>」の項目を選択し、[Edit]
![b.png](https://qiita-image-store.s3.amazonaws.com/0/73630/d3021ae6-f87f-0200-667b-c9913108285f.png)

0. 「Pattern」のを編集し、「# -*- coding: utf-8 -*-」を追加する > [OK] > [OK]
![c.png](https://qiita-image-store.s3.amazonaws.com/0/73630/2c1dea47-6b39-ee98-915b-9cfcdbba71b4.png)

 - 新規Pydevモジュールを作成して確認する
![d.png](https://qiita-image-store.s3.amazonaws.com/0/73630/d53daf8d-f37b-7ba7-89e2-91e1c091280d.png)

MainやClassのテンプレートを変更することも可能

# 参考
 - [How do I make a file template for PyDev?](http://stackoverflow.com/questions/14220295/how-do-i-make-a-file-template-for-pydev)
csharp > 列挙型 enum > ビットフラグ

引用: 即効入門 C#プログラミング すぐに現場で使える知識 by 中 博俊さんら
8.3 ビットフラグ

> 列挙型をビットフラグとして利用する場合には、定義時に`[Flags]`属性を指定します。

http://ideone.com/aoiVdY

```csharp
using System;

public class Test
{
	[Flags]
	public enum EKeys
	{
		None = 0,
		Alt = 1,
		Control = 2,
		Shift = 4,
		Windows = 8,
	}
	public static void Main()
	{
        var k = EKeys.Control | EKeys.Alt;
        Console.WriteLine(k);
	}
}
```

```txt:結果
Success	time: 0.05 memory: 24096 signal:0
Alt, Control
```
csharp > 列挙型 enum > 基になる型 > : byte など / int.MaxValue

引用: 即効入門 C#プログラミング すぐに現場で使える知識 by 中 博俊さんら
8.1 列挙型の定義

>基になる型は、コロンの後ろに整数型 (byte, sbyte, short, ushort, int, uint, long, ulongのいずれか)を指定します。基底型を省略した場合には int 扱いされます。

```csharp
enum Signal : byte
{
   Red,
   Green,
   Yellow,
}
```

ふと疑問に思ったのが、enumでデータ型の最大値を超えた時にどうなるか

http://ideone.com/JnvGuH

```csharp
using System;

public class Test
{
    enum SomeValue : int {
    	val1 = int.MaxValue,
    	val2,
    }
	public static void Main()
	{
	   int val;
	   val = (int)SomeValue.val1;
       Console.WriteLine(val.ToString());
	   val = (int)SomeValue.val2;
       Console.WriteLine(val.ToString());
	}
}
```

ideoneでは以下のようにコンパイルエラーとなった。

```
Compilation error	time: 0.05 memory: 23960 signal:0
prog.cs(7,6): error CS0543: The enumerator value `Test.SomeValue.val2' is outside the range of enumerator underlying type `int'
Compilation failed: 1 error(s), 0 warnings
```
技術英語 > Copy once, check thrice

以下のページで見た言葉がひっかかった

http://cpphints.com/hints/2
>Copy once, check thrice

thriceというのは初めてみた。

http://ejje.weblio.jp/content/thrice

> 三たび，3 倍.

http://www.eigowithluke.com/2012/12/times/

> 「三回、三度」にも「three times」と「thrice」二つの言い方があります。しかし、「thrice」を使うと、古めかしい印象を与えます。現在、ほとんどの場合ネイティブは「three times」を使っています。

上記では古めかしいと記載があるが、一番上のリンクのように実際に使用している人もいる。
Mac OS X El CapiptanでSIPを無効化する


El Capitanでは、System Integrity Protecton (SIP)という機能が有効となり、いろいろとセキュリティーが強化されました。
通常は、そのまま利用すればいいのですが、何かしらの理由で無効化したい場合は、下記の手順で無効化します。

1.リカバリモードで起動する

command + r を押しながらMacを起動します。

2.コマンドを打つ

ユーティリティ -> ターミナルで、ターミナルを開き、

```bash
csrutil disable
```

と入力。再起動します。

3.再度有効化する

何かしらの理由で再度有効化したい場合は、

```bash
csrutil enable
```

とし、再起動します。
GNU Makefileテンプレート

# はじめに
忘れがちなGNU makeのmakefileの書き方を記載します。
バージョンはGNU Make 3.81です。

# テンプレート
markdownで記載するとなぜか半角スペースに変換されてしまっていますが
makefile内のインデントはタブ文字です。

```mf:makefile
CFLAGS=-I. -g -Wall -Werror
INCS=test.h
OBJS=test.o
LIBS=#-lpthread -lm
TARGET=test

%.o: %.c $(INCS)
	$(CC) $(CFLAGS) -c -o $@ $<

$(TARGET): $(OBJS)
	$(CC) $(CFLAGS) -o $@ $^ $(LIBS)

clean:
	rm -rf $(TARGET) *.o
```

```c:test.h
#define STRING "Hello World!\n"
```

```c:test.c
#include "test.h"
#include <stdio.h>

int main(int argc, char*argv[])
{
    printf(STRING);
    return 0;
}
```
三項演算子は悪か？

プログラマーとして社会人デビューした新人さんのプログラムをレビューしていた時、三項演算子の話がちらっと出たのでまとめます。
先にまとめておくと、三項演算子はif文の短縮形ではないよ、という話です。

> 追記 2015/10/15
> ここでは"条件演算子"のことを"三項演算子"として書いています。
> 三項演算子は名前の通り３つの項目がある演算子の総称で、直接"?:"演算を指すものではないため、ここでは"条件演算子"と記述するほうがより正確でした。
> [bsdhack](http://qiita.com/bsdhack)さんありがとうございました。

# 三項演算子とは
条件により返却する値を切り替えることができる演算です。

```text:書式
[条件] ? [TRUEの場合の返却値] : [FALSEの場合の返却値] ;
```

```java:サンプル
final int MAX = 100;
int ans = 120;

int result = MAX < ans? MAX : ans;
//resultは100
```
例はansが100以上なら100を、100以下ならそのままansを返すという処理です。

# 事の発端

上記の例でいうと、こういう感じのソースコードがありました。

```java:if文サンプル
int ans = 120;
int result;

if(MAX < ans){
  result = MAX;
}else{
  result = ans;
}
```
ふむ。処理としては同じような気がします。
というか三項演算子の説明としてよくこういうソースコードが出される気がします。
ということで、三項演算子は使わないの？ということを聞いて見ると「三項演算子はわかりにくいから使わないように、と教わった」そうです。
確かに会社やプロジェクトによっては三項演算子を禁止する規約を設けているところがあるのも事実です。

いやいや、なんでもかんでもifで分岐させてしまうのは違うだろうということで使い分けを考えてみます。

# if"文"と三項"演算子"

if文と三項演算子を考えるとき、まず注目しなくてはいけないのが"文"と"演算子"の違いです。
if文は制御構文なので、処理を分岐させるというものです。
それに対して三項演算子は"演算子"と名前が付いているように処理分岐を行うためのものではないのです。

そこを意識すると使い分けも明確になるかなと思います。

## 演算子

演算子というと"+"や"<="などがあります。
改めて意味を考えてみると
```
ans = [項目1] + [項目2]
```
という場合の"+"演算子は項目1と項目2の数値を足したものを返却する、という機能になります。

では三項演算子はというと
```
ans = (条件) ? [項目1] : [項目2]
```
項目1か項目2のどちらかを返却する、どちらを返すかは条件による。という機能になります。


# 使い分け
if文は処理の分岐を行う場合に使います。
三項演算子は2つ（もしくはそれ以上）の中から一つを選択するという処理を行う場合に使います。

上記のような例だと"MAX"or"そのまま"を選ぶ処理なので、三項演算子が適しており、結果としてif文で書くよりもシンプルで短くなります。
逆に短く書きたいから三項演算子を使う、というのは本末転倒なわけです。

# 混乱の原因
「三項演算子は可読性が悪い」と言われ、嫌われる原因は結局のところif文の代わりに三項演算子を使ってしまっている悪いパターンが蔓延しているからだと思います。
三項演算子の中に"処理"を書いてしまうとif文でいいじゃんという話になってしまいます。

# まとめ

if文と三項演算子はそもそも役割が別だよ、ということを言いたいがための記事でした。
役割を明確にして使い分ければ、読み手にもコードの意図が伝わるので可読性は良くなるはずです。
しかしどこまでを"演算"にしてどこからが"分岐処理"なのかという線引は作るプログラムの目的だったりプログラマーのセンスだったりも大いに関わってくるため難しい問題だとは思います。
Ractive.js + webpack + gulpのときのテンプレート、プラグインのrequire


Ractive.jsのwebアプリを書いてwebpack+gulpでビルドしています。
webpackでのビルドはqiitaなど他のいろいろな記事を参考にしてできるようになりました。
その際、Ractive.jsのテンプレートやプラグインのrequireに関して分かったことのメモです。

##プラグインモジュールの読み込み
[公式でpluginとして紹介されているトランジションやカスタムイベントプラグイン](http://docs.ractivejs.org/latest/plugins)を\<script\>タグで読み込む場合は、ただ\<script\>タグを書くだけでいいものが多いですが、モジュールとしてrequireする場合、それぞれ多少クセがありました。

それぞれのモジュールはnpmなどでインストール済みとします。

```javascript
var Ractive = require('ractive');

//キーイベントはまずローカル変数としてrequireする
var keys = require('ractive-events-keys');

//hoverとslidehorizontalはrequireのみ
require('ractive-events-hover');
require('ractive-transitions-slidehorizontal');

var ractive = new Ractive({
    el: '#main',
    template: require('ractive!./template.html'),
    //slideとfadeはここでrequire
    transitions: {
        slide: require('ractive-transitions-slide'),
        fade: require('ractive-transitions-fade')
    },
    //実際のキーイベントはkeys変数から指定
    events: {
        escape: keys.escape,
        scape: keys.space,
        enter: keys.enter,
        uparrow: keys.uparrow,
        downarrow: keys.downarrow
    },
    data: {
        //データ
    }
});
```


##テンプレートやpartialをモジュールをロードする感覚で読み込みたい。

\<script\>タグ内に書くとエディタによってはハイライトやインデントをしてくれなくなったりします。なので.htmlや.mustacheで書いてこんな感じにしてrequireしたい

```
├── app.js
├── template.html //メインテンプレート
└── partials //メインテンプレート内で使うpartial
    ├── header.html
    ├── footer.html
    └── menu.html
```

これを簡単にrequireするには [ractive-loader](https://www.npmjs.com/package/ractive-loader)をインストールする

```
$ npm install --save ractive-loader
```
これだけであとはメインのjsでテンプレートを'ractive!'のプリフィックスをつけてこんな感じで指定すればOK。
webpackのconfigに設定するやりかたもありましたがこっちで問題なくできました。

```javascript
var Ractive = require('ractive');

var ractive = new Ractive({
    el: '#main',
    template: require('ractive!./template.html'),
    partials:  {
        header: require('ractive!./partials/header.html'),
        footer: require('ractive!./partials/footer.html'),
        menu: require('ractive!./partials/menu.html')
    },
    data: {
        //データ
    }
});
```

これだと本体のテンプレートやpartialは.htmlなどの通常のファイルとして書けます。
ビルドするとテンプレートのhtmlはjsオブジェクトにパースされて出力されていました。
git bundle to Dropbox

# git fire が盛り上がってるようですが

pushしちゃうの？

# というわけでbundleしてDropboxに放り込んじゃいましょう

.gitconfigのaliasに

```
bundle-dropbox-all = !git bundle create ~/Dropbox/dev/git-bundle/`hostname`-all.bundle --all > /dev/null
```

として、火事が起きたら `git now` からの `git bundle-dropbox-all`
cocos2d-xの画面の向き(縦横)は設定だけでは済まないのでまとめておく

#はじめに
cocos2d-xでプロジェクトを作成した直後に、まずやるべき画面の縦横設定についてまとめます。
設定をいじるだけではダメなので、トータルで何をするかをまとめておきます。
※「これも必要だろ！」などのつっこみあればコメントください。

#画面の縦横を設定
##iOS
プロジェクトの`[General]`を開き、`[Device Orientation]`を設定します。
Portrait :　縦
Landscape :　横（左右はどちらでもかまいません）
![スクリーンショット 2015-10-08 1.19.59.png](https://qiita-image-store.s3.amazonaws.com/0/94988/1d7984e3-f708-70ce-bba4-716ee69c922f.png)


次に旧バージョン対応（iOS7以前）のために、以下のコードを追加しておくと良いでしょう。

```lang:RootViewController.mm
// Override to allow orientations other than the default portrait orientation.
// This method is deprecated on ios6
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    //return UIInterfaceOrientationIsLandscape( interfaceOrientation );  //横
    return UIInterfaceOrientationIsPortrait( interfaceOrientation );  //縦
}

// For ios6, use supportedInterfaceOrientations & shouldAutorotate instead
-(NSUInteger) supportedInterfaceOrientations{
#ifdef __IPHONE_6_0
    //return UIInterfaceOrientationMaskAllButUpsideDown;  //横
    return UIInterfaceOrientationMaskPortrait;  //縦
#endif
}
```

##Andorid
プロジェクトにある`[AndroidManifest.xml]`の`[android:screenOrientation]`を設定します。
portrait :　縦
landscape :　横

```lang:AndroidManifest.xml
<activity android:name="org.cocos2dx.cpp.AppActivity"
                 android:label="@string/app_name"
                 android:screenOrientation="portrait" //★この部分★
　　　　　　　　　　android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
                 android:configChanges="orientation">
```
参考：[画面の向きを設定する](http://study-cocos2d-x.info/game/212/)

#スプラッシュ画面
##iOS
iOSでは、`[Launch Image Source]`を`[Images.xcassets]`を利用するように切り替えた上で、以下の設定をしましょう。

**縦の場合**
![スクリーンショット 2015-10-08 1.28.54.png](https://qiita-image-store.s3.amazonaws.com/0/94988/a24d23f5-23b6-511d-d9df-ebdaf73a9309.png)

**横の場合**
![スクリーンショット 2015-10-08 1.34.05.png](https://qiita-image-store.s3.amazonaws.com/0/94988/3736c35e-48a6-a95b-a9b9-3d535c1be011.png)

##Andorid
Androidでは、スプラッシュは**作らないのが推奨**です。
どうしてもという方はこの記事を参考にされてはどうかと思います。
参考：[Androidでスプラッシュ画面を作る方法](http://qiita.com/glayash/items/646e5c0d5de82cfc17bc)

#あとがき
プロジェクト新規作成時には、解像度対応などいろいろやることがたくさんあります。
いずれは、まとめようと思っていますが、今回は画面の向き設定についてでした。

参考：[cocos2dx画面解像度対応](http://blog.tadamatuapps.com/2013/03/cocos2dx.html)
CppSharp コンパイル (Mac,2017/07/05)

monoが開発しているC++のクラスをC#で使用できるようにするツールです。

基本的には以下のとおりです。
https://github.com/mono/CppSharp/blob/master/docs/GettingStarted.md

Mac上でコンパイルしてみます。

CppSharpを取得します。

```
git clone https://github.com/mono/CppSharp.git
```

LLVMを取得します。

```
cd CppSharp/deps
git clone http://llvm.org/git/llvm.git
cd llvm
git checkout cccdd2eff6e04737dfc4a2caf33ea1a6ee5fb80e
```

Clangを取得します。

```
cd tools
git clone http://llvm.org/git/clang.git
cd clang
git checkout 6a795889c33eb039866a867b41c30fdf000e345d
```

buildディレクトリを作成してcmakeでmakefileを作成します。
そしてコンパイルします。

コンパイル済みのLLVM、Clangが公式で配布されているので、配布されている環境を使用している方はそちらを使用したほうが楽です。

```
cd ../../
mkdir build
cd build

cmake -G "Unix Makefiles" -DLLVM_ENABLE_LIBCXX=true -DLLVM_BUILD_32_BITS=true -DCMAKE_BUILD_TYPE=RelWithDebInfo ..

make
```

premakeでCppSharpのプロジェクトを作成し、コンパイルします。

```
cd ../../../build/
./premake5-osx gmake
config=release_x86 make -C gmake
```

そうすると、gmake/lib/にDLLが生成されます。

生成されたバイナリの
```
CppSharp.AST.dll
CppSharp.dll
CppSharp.Generator.dll
CppSharp.Parser.dll
CppSharp.Parser.CSharp.dll
CppSharp.Runtime.dll
CSharp.CSharp.dll
libCppSharp.CppParser.dylib
libStd-symbols.dylib
```
をコードを生成するアプリケーションから参照します。

dylib以外を参照に追加して、以下のコードを記述します。

```
namespace App
{
	class SampleLibrary : CppSharp.ILibrary
	{
		public void Setup(CppSharp.Driver driver)
		{
			var options = driver.Options;
			options.GeneratorKind = CppSharp.Generators.GeneratorKind.CSharp;
			options.LibraryName = "SampleLib";
			options.Headers.Add(@"絶対パス/Sample.h");
			options.Libraries.Add("Sample.lib");
		}
		public void SetupPasses(CppSharp.Driver driver)
		{
		}

		public void Preprocess(CppSharp.Driver driver, CppSharp.AST.ASTContext ctx)
		{

		}

		public void Postprocess(CppSharp.Driver driver, CppSharp.AST.ASTContext ctx)
		{
		}
	}

	class Program
	{
		static void Main(string[] args)
		{
			CppSharp.ConsoleDriver.Run(new SampleLibrary());
		}
	}
}
```

これを実行すると、Sample.hをC#で使用できるようにするコードが生成されます。

ただ、何故かQtSharpは上手く行かなかったので今後調査していきます。
環境を変えた時、Javaのクラスパスを指定しても読み込めないとき

# 区切り文字を忘れている

Javaのクラスパスを「-cp」オプションで指定する時、環境によって違うので忘れないように。

- Windows系：「`;`」（セミコロン）
- UNIX系：「`:`」（コロン）

例）Linuxの場合
`java -jar -cp "piyo.jar:fuga.jar:." hoge.jar`

# 複数のコマンドを指定するときの終端文字が違う
こちらはクラスパスとは直接関係ないがシェルに組み込んだ時などよく忘れる。
- Windows系：「`&`」（アンパサンド）
- UNIX系：「`;`」（セミコロン）

例）
`java -jar hogera.jar ; java -jar hogehoge.jar`
Excel－覚書

Excel使いたての頃のメモが出てきたので懐かしみつつ投稿。
最近また使うようになったので追加していくかも。

#●「セルの書式設定」を一発で出す
`[Ctrl]+1`
※テンキーの1は不可。

#●行列一発挿入
行又は列を選択して、
`[Ctrl]+[Shift]+[+]`

#●行列一発削除
行又は列を選択して、
`[Ctrl]+[-]`

#●行選択
`[Shift]+[Space]`
※行の選択は日本語入力(IME)をOFFにする必要がある。

#●列選択
`[Ctrl]+[Space]`

#●シートの一覧表示アドイン
Excelシート一覧アドイン
http://www.vector.co.jp/soft/win95/business/se439939.html
すごく便利。右クリックでシートの一覧を表示してくれるアドイン。

#●キーボードでシート名変更
`[ALT]→O→H→R`
全部単独で順に押す。

#●隣のシートへ移動
`[Ctrl]＋[PageUp] or [PageDown]`

#●確定した文字を確定前に戻す
`［Ctrl］＋［Backspace］`

#●改行(検索で入力することで改行文字として認識する)
`「Ctrl」＋「J」`
なんとシート名などにも適用される（表示上は見えないが、印刷などでは改行されている）

#●現在の日付、時間入力
`「Ctrl」＋「;」`：日付入力
`「Ctrl」＋「:」`：時間入力

#●指定Excelファイルのシート/セルを指定して飛ぶハイパーリンク
`=HYPERLINK("C:\Hoge\file.xlsx"&"#'"&SUBSTITUTE("シート名","'","''")&"'!A1","リンクの表示名")`

#●勝手に連番を数えてくれる
`=IF(ISNUMBER(INDIRECT(ADDRESS(ROW()-1,COLUMN()))),INDIRECT(ADDRESS(ROW()-1,COLUMN()))+1,1)`
この数式を下へコピーしていくと勝手に連番が作成されていく。
行の削除を行っても数字が崩れない。どこにコピーしても同じ数式。

#●偶数行のセルの背景色を変えて見やすくする
ホーム→条件付き書式→セルの強調表示ルール→その他のルール→指定の値を含むセルだけを書式設定
「セルの値」になっていることを確認して、その右を「次の値に等しい」にする。
数式を入れるところに`=MOD(ROW(),2)=0`と入れる。
書式設定→塗りつぶしで背景色を選ぶ。
※Excel2010の場合。Excel2003の場合→http://unmei.in/excel-every-other-row

#●項目チェック
`=IF(COUNTA(D6:D65536) = 0, "表示項目無し" ,(IF(COUNTA(D6:D65536) = SUBTOTAL(3,D6:D65536), "全" & COUNTA(D6:D65536)  & "項目","全" & COUNTA(D6:D65536) & "項目中" & SUBTOTAL(3,D6:D65536) & "項目表示"))`
なんに使ったかよく覚えてないが、項目を数えるための数式？

#●シート名を取得する
`=MID(CELL("filename",$A$1),FIND("]",CELL("filename",$A$1))+1,31)`

#●図形に数式を入力
例えばセルA1に数式を作る。
次に図形を選んで数式バーに「`=$A$1`」と入力するとA1の内容が図形の中に表示される。

#●日付けに曜日を追加
セルの書式設定→ユーザ定義
ここの定義を「`yyyy年m月d日(aaa)`」のようにする（aaaが曜日）
※セルは「2010/12/3」のような日付データであること。

#●日付けを和暦に
A1に「2004/2/22」があり、「=DATESTRING（A1）」で「平成16年02月22日」が返る。

#●数字を漢数字に
A1に「123」があって、「=NUMBERSTRING(A1,3)とすると「一二三」が返ります。表示形式を「2」とすると「壱百弐拾参」が返される。

#●期間計算
DATEDIF(開始日,終了日,単位)。単位は、「"D"」などの指定された記号を使います。
"Y" は期間内の満年数 。"M"は 期間内の満月数。"D"は 期間内の日数を求める記号です。

#●文字列操作
LEFTB(文字列,[バイト数])　　:文字列の先頭から指定されたバイト数の文字を返す。
RIGHTB(文字列,[バイト数])　　:文字列の末尾 (右端) から指定されたバイト数の文字を返す。
　バイト数を省略すると1を指定したことになる(1の時は省略できる)。
MIDB(文字列,開始位置,バイト数)　:文字列の任意の位置から指定されたバイト数の文字を返す。
半角文字は1バイト、全角文字は2バイトとなります。ただしUNICODOでは半角文字も2バイト。
文字列が開始位置から何番目にあるかを返す

#●検索
=FIND(検索文字列,対象,開始位置)
　　(注)　英字の大文字と小文字を区別できる代わりに、ワイルドカード文字を使用することができない。

#●ドロップダウンリストの空白を詰める
以下を入力規則に入れる
`=OFFSET($F$6:$F$65535,,,COUNTA($F$6:$F$65535))`
　F6～F65535はドロップダウンリスト

　Excel2007以降対応版
`=OFFSET($F$6:$F$1048576,,,COUNTA($F$6:$F$1048576))`

#●列の一番下のデータを参照する
`=LOOKUP(10^10,C:C)`
このようにするとC列の一番下にデータがある場合にそれを表示する。
また、計算式があっても計算結果が空の場合は、データとみなされない。
(ここがINDEXとCOUNTAを組み合わせた参照では計算式が空でもカウントするので、計算式の結果が空の場合はカウントしたくない場合にすごく便利)。
※C2:C5のように範囲指定しても可。

#●フィルターした時にフィルターした件数を表示する。
「B2:B100」の範囲にフィルターの表があるとする。
`=IF(COUNT($B$2:$B$100)<=SUBTOTAL(3, $B$2:$B$100),"","フィルター後："&SUBTOTAL(3, $B$2:$B$100)&"件")`

#●フィルター後に有効になる条件付き書式
・B1セルに「無効」、「有効」、「自動」が選べる入力規則のリストを作成。
・B2:B100の条件付き書式に以下を入力。また、フィルター後に設定したい書式（フィルター後の時にだけ背景変えるなど）を設定しておく。
`=OR($B$1="有効", AND( $B$1="自動", COUNT($B$2:$B$100)>SUBTOTAL(3, $B$2:$B$100)) )`

・B1を「無効」にするとフィルター関係なく条件付き書式は無効となる。
・B1を「有効」にするとフィルター関係なく条件付き書式は有効となる。
・B1を「自動」にするとフィルター後のみ、条件付き書式は有効となる。
MySQLの起動／終了シェルスクリプト

MySQLサーバが起動してるときは停止するか否かを聞き対話式で停止できる。
停止しているときはその逆が行える。
`/etc/init.d/mysqld`は環境によって違うので、編集して使う。

```sh:mysql_stend.sh
#!/bin/bash
#
# @(#) mysql_stend.sh ver.1.0.0 2015.09.16
#
# Usage:
#   mysql_stend.sh
#
# Description:
#   MySQLサーバの起動／終了スクリプト.
#
###############################################################################

######################
# オプション解析処理 #
######################
PROGNAME=$(basename $0) # プログラム名
VERSION="1.0"           # バージョン
HELP_MSG="'$PROGNAME -h'と指定することでヘルプを見ることができます"

# ヘルプメッセージ
usage() {
  echo "Usage: $PROGNAME"
  echo 
  echo "オプション:"
  echo "  -h, --help"
  echo "      --version"
  echo "・現在のMySQLサーバが起動しているかどうかわかる"
  echo "・MySQLサーバが停止しているときは開始し、開始しているときは停止する"
  exit 1
}

# オプション解析
for OPT in "$@"
do
  case "$OPT" in
    # ヘルプメッセージ
    '-h'|'--help' )
      usage
      exit 1
      ;;
    # バージョンメッセージ
    '--version' )
      echo $VERSION
      exit 1
      ;;
    '--'|'-' )
      # 「-」か「--」だけ打った時
      shift 1
      param+=( "$@" )
      break
      ;;
    -*)
      echo "$PROGNAME: 「$(echo $1 | sed 's/^-*//')」オプションは存在しません。'$PROGNAME -h'で確認してください" 1>&2
      exit 1
      ;;
    *)
      # コマンド引数（オプション以外のパラメータ）
      if [[ ! -z "$1" ]] && [[ ! "$1" =~ ^-+ ]]; then
        #param=( ${param[@]} "$1" )
        param+=( "$1" )
        shift 1
      fi
      ;;
  esac
done

# 不正パラメータ
if [ ! -z $param ]; then
  echo "$PROGNAME:「${param}」不正なパラメータがあります。"
  echo $HELP_MSG 1>&2
  exit 1
fi
###############################################################################

##########
# メイン #
##########
pcnt=`ps -ef | grep mysqld | grep -v grep | wc -l`
if [ $pcnt = 0 ]; then
  echo "MySQLサーバ停止中"
  while :
  do
    printf "起動しますか？(y/n):"
    read input
    if [ -z "${input}" ]; then # 空欄の場合ループするためデフォ値を入れる
      input="c"
    fi
    if [ ${input} = "y" ]; then
      /etc/init.d/mysqld start
      break
    elif [ ${input} = "n" ]; then
      exit 1
    fi
  done
else
  echo "MySQLサーバ起動中"
  while :
  do
    printf "停止しますか？(y/n):"
    read input
    if [ -z "${input}" ]; then # 空欄の場合ループするためデフォ値を入れる
      input="c"
    fi
    if [ ${input} = "y" ]; then
      /etc/init.d/mysqld stop
      break
    elif [ ${input} = "n" ]; then
      exit 1
    fi
  done
fi

exit 0
```
innobackupexでsocketエラーが出て詰まったのでメモ

以下を打つとsocketエラーが出る
`$ innobackupex --ibbackup=xtrabackup --defaults-file=/etc/my.cnf --user=root --password=xxx hoge`

# エラー内容

```
InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona LLC and/or its affiliates 2009-2013.  All Rights Reserved.

This software is published under
the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.

Get the latest version of Percona XtraBackup, documentation, and help resources:
http://www.percona.com/xb/p

151007 13:59:18  innobackupex: Executing a version check against the server...
151007 13:59:18  innobackupex: Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_file=/etc/my.cnf;mysql_read_default_group=xtrabackup' as 'root'  (using password: YES).
innobackupex: got a fatal error with the following stacktrace: at /usr/bin/innobackupex line 3011.
        main::mysql_connect('abort_on_error', 1) called at /usr/bin/innobackupex line 1551
innobackupex: Error: Failed to connect to MySQL server: DBI connect(';mysql_read_default_file=/etc/my.cnf;mysql_read_default_group=xtrabackup','root',...) failed: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) at /usr/bin/innobackupex line 2995.
151007 13:59:18  innobackupex: Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_file=/etc/my.cnf;mysql_read_default_group=xtrabackup' as 'root'  (using password: YES).
innobackupex: got a fatal error with the following stacktrace: at /usr/bin/innobackupex line 3011.
        main::mysql_connect('abort_on_error', 1) called at /usr/bin/innobackupex line 1570
innobackupex: Error: Failed to connect to MySQL server: DBI connect(';mysql_read_default_file=/etc/my.cnf;mysql_read_default_group=xtrabackup','root',...) failed: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) at /usr/bin/innobackupex line 2995.
```
#対処法
オプション--hostを設定する。
ローカル・ループバック・アドレスを設定したらinnobackupexが使えるようになった。
`$ innobackupex --ibbackup=xtrabackup --defaults-file=/etc/my.cnf --user=root --password=xxx --host=127.0.0.1 hoge`
ViewPagerでこれから表示しようとするViewやItemの取得にはsetPrimaryItem()を。

初投稿です。ドキドキ
ブログのほうにちょろちょろ書いていましたが、ハマったところのエッセンスだけここに残せればと思います。

#ViewPagerでこれから表示しようとするViewをいじりたい
##普通にinstantiateItem()でやれば？
そういう考え方もありますね。
ただ、タッチイベント系のライブラリを組み合わせる場合、
前後のアイテムを先読みするので、複数のViewにセットされてしまうことで不具合が生じる場合があります。
たとえば、[PhotoView](https://github.com/chrisbanes/PhotoView)とか

##どうしたいの？
表示するときにセットして、次のViewに移るとき外す、を繰り返したい。

##それを実現するのが
**setPrimaryItem()メソッド**
PagerAdapterクラスのメソッドです。
アブストラクトメソッドではないので、見落としがちです。
FragmentPagerAdapterで現在表示中のFragmentを取得....という場合でも使われている、よくできる子。
この子をオーバーライドするして、自分好みに変化させます。

#どうつかうの？
instantiateItem()でアイテムをセットするときに、inflateするときのViewにいじりたいViewをsetTag()しておきます。
setPrimaryItem()で前の要素にセットしていたものを外し、これから表示するものをgetTag()して取得して、いじる！

コードのイメージはこんな感じ。


```lang:ImagePageradapter

    @Override
    public View instantiateItem(ViewGroup container, int position) {
        View view = inflater.inflate(R.layout.image_display_view, container,false);
        ButterKnife.bind(this, view);
        view.setTag(mImageView);//いじりたいViewをsetTag
        Picasso.with(mActivity).load(new File(AR.adapter.get(position))).resize(p.x,p.y).centerInside().into(mImageView);
        }
        container.addView(view);

        return view;
    }

    @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        View view = (View)object;
        if(oldImageView!=null){
            mAttacher.cleanup();
        }
        currentImageView = (ImageView)view.getTag();//getTagをつかって取得し、後はいじるだけ。
        mAttacher = new PhotoViewAttacher(currentImageView);
        oldImageView = currentImageView;
        super.setPrimaryItem(container, position, object);
    }
```
##おわりに
setPrimaryItemで現在のViewを保存しておけば、いつ呼ばれるかわからないdestroyItem()よりも確実な破棄の処理が行えます。
ライフサイクルのないカスタムViewなどで、Viewが表示されている間だけ何かしたいという時に有用かと思います。
AppIDとiTunesConnectでの設定変更

# はじめに
iTunesConnectでAppIDを変えようと思ったら変更不可になってウワー :scream: になったり
増えすぎたAppIDを整理するために調べたこと。
2015年10月時点の情報です。

#Certificates, Identifiers & ProfilesからAppIDを消せない

- iTunes Connectのアプリ枠に設定されている
    - バイナリアップ前であれば別のAppIDに変えることで削除可能

![スクリーンショット-2015-10-08-0.01.40.png](https://qiita-image-store.s3.amazonaws.com/0/12362/b8cb69de-5a03-68ae-c949-d132c23ae313.png)

 - バイナリアップされていると別のAppIDに切り替え不可
    - 削除不可


![スクリーンショット 2015-10-08 0.11.05.png](https://qiita-image-store.s3.amazonaws.com/0/12362/8389bfa3-cc3f-05b4-4135-03b199ea7fb4.png)


#Certificates, Identifiers & ProfilesにAppIDを作成される

ワイルドカードなbundleIdentifierからsuffixをつけ
![スクリーンショット-2015-10-07-23.47.08.png](https://qiita-image-store.s3.amazonaws.com/0/12362/f2c0a56e-cc21-e811-3089-22ef1d2df591.png)

保存すると`Certificates, Identifiers & Profiles`に次のようなネーミングルールで
AppIDが作成されました。レスポンスが返されるまで少し待たされます。

```
jp.hoge.[バンドルIDのサフィックス]
↓
jp-hoge-[バンドルIDのサフィックス]
```

![スクリーンショット-2015-10-07-23.53.10.png](https://qiita-image-store.s3.amazonaws.com/0/12362/e3b126ac-7adb-1bce-5ec1-8c63c22c8269.png)

後から同じアプリの登録情報を確認すると

![スクリーンショット-2015-10-08-0.01.40.png](https://qiita-image-store.s3.amazonaws.com/0/12362/e778eed4-3dc9-d662-6a1b-475f06630dc3.png)

ユニークなAppIDが設定されている状態になります。


# さいごに
TestFlightを使うためにバイナリアップロードすると、Storeに公開していなくてもAppIDが固定されて再設定不可になります。
iTunes Connectに未設定で開発中に使用しているAppIDは消せてしまうので注意しましょう。
provisioing Fileと違って一括では消せなくなっている点は不便でもありますが、事故は起こりにくい。