OmniAICreator/Qiita-1.07M huggingface dataset:
El Capitanでtd-agentを無理矢理動かす


# 結論

インストーラーでインストールして、実行ファイル `/opt/td-agent//usr/sbin/td-agent` を起動します。

```
sudo /opt/td-agent//usr/sbin/td-agent --log /var/log/td-agent/td-agent.log --use-v1-config
```

# 背景
td-agentはEl Capitanをサポートしていません。

[Download | Fluentd](http://www.fluentd.org/download)

```
OSX 10.9 and 10.10. El Capitan will be supported soon
```

# 試しにインストールして起動してみる

[Installing Fluentd using .dmg Installer (MacOS X) | Fluentd](http://docs.fluentd.org/articles/install-by-dmg)を参考にして
2.1.4をインストールしてみます。


```
~ sudo launchctl load /Library/LaunchDaemons/td-agent.plist
Password:
~ less /var/log/td-agent/td-agent.log
/var/log/td-agent/td-agent.log: No such file or directory
```

ログが書き出されません。

# 起きていること

td-agent.plist を見ると/usr/sbin/td-agentを起動しようとしています

```xml
~ cat /Library/LaunchDaemons/td-agent.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>KeepAlive</key>
  <true/>
  <key>Label</key>
  <string>td-agent</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/sbin/td-agent</string>
    <string>--log</string>
    <string>/var/log/td-agent/td-agent.log</string>
    <string>--use-v1-config</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>WorkingDirectory</key>
  <string>/opt/td-agent</string>
</dict>
</plist>
```

実際には`/usr/sbin/td-agent`はありません。

```
~ ls /usr/sbin/td-agent
ls: /usr/sbin/td-agent: No such file or directory
```

ですので、起動に失敗しています。

# 対応策

検索するとそれらしいファイルがあります。これを使います。

```
/opt/td-agent//usr/sbin/td-agent
```

## フォアグラウンドで起動する
td-agent.plistを参考にして引数をつけます。

```
sudo /opt/td-agent//usr/sbin/td-agent --log /var/log/td-agent/td-agent.log --use-v1-config
```

## デーモンとして起動する

sudoをつけて`/Library/LaunchDaemons/td-agent.plist`を編集します。

```
sudo vi /Library/LaunchDaemons/td-agent.plist
```

12行目を`<string>/opt/td-agent//usr/sbin/td-agent</string>`に変更します。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>KeepAlive</key>
  <true/>
  <key>Label</key>
  <string>td-agent</string>
  <key>ProgramArguments</key>
  <array>
    <string>/opt/td-agent//usr/sbin/td-agent</string>
    <string>--log</string>
    <string>/var/log/td-agent/td-agent.log</string>
    <string>--use-v1-config</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>WorkingDirectory</key>
  <string>/opt/td-agent</string>
</dict>
</plist>
```

```
sudo launchctl load /Library/LaunchDaemons/td-agent.plist
```

で起動できるようになります:sushi:

# 注意
送信にHTTPSを使う際に、SSL証明書エラーが起こるようです。
App内課金がレビューOK後にDeveloper Removed from Saleステータスになる件

昨日、レビュー申請していたConsume型のApp内課金アイテムが無事審査を通り、
「Your In-App Purchase status is Ready for Sale」というメールが来ていたので、
ウキウキしながらiTunes Connectを見てみたら、
なぜか「Developer Removed from Sale」
というステータスになってた。

え？！
せっかく審査通ったのに誰か消したの？！
と思ったら、どうもそうではないらしく、

Appleのドキュメント（https://developer.apple.com/library/ios/documentation/LanguagesUtilities/Conceptual/iTunesConnectInAppPurchase_Guide_Jpn/Chapters/WorkingWithYourProductsStatus.html）
によると

「Approved」
In-App PurchaseがAppleにより承認され、対応するアプリケーションと共にApp Storeで実際に提供できるようになったことを示しています。
この状態にするには、iTunes Connectでプロダクトを「Cleared for Sale」に設定する必要があります。「Cleared for Sale」になっていないプロダクトの状態は、「Developer Removed from Sale」になります。
アプリケーションの特定版でリリースするプロダクトは、Appleの承認を得るまで「Approved」状態になりません。

とのこと。
よく見ると、価格および配信状況の配信可能の欄が「いいえ」になっていたので、
これを編集して「はい」にしたら、無事にステータスが「Approved」になりました。

![いったんDeveloperRemovedfromSaleになる図.png](https://qiita-image-store.s3.amazonaws.com/0/9589/b91c67b0-3e83-d2fc-0dd6-dd0af845464d.png)

一瞬、どこを変えたらいいのかわからなかったのでメモ。
Ubuntu15.10 に nginx+php5-fpm をインストール

1.Ubuntu15は最初からApache2が入っているのでまず削除する。

```
sudo systemctl stop apache2.service
sudo systemctl disable apache2.service
sudo apt-get remove apache2
```

2.nginxとphp5-fpmインストール
`sudo apt-get install nginx php5-fpm`

3.nginx設定ファイル編集

```lang:/etc/nginx/sites-available/default
 location ~ \.php$ {
  include snippets/fastcgi-php.conf; #この中身を下に表示
 
  # With php5-cgi alone:
  # fastcgi_pass 127.0.0.1:9000;
  # With php5-fpm:
  fastcgi_pass unix:/var/run/php5-fpm.sock;
 }
```

```lang:snippets/fastcgi-php.conf
# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+\.php)(/.+)$;

# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;

# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;

fastcgi_index index.php;
include fastcgi.conf;
```
3.php5-fpm設定

```lang:/etc/php5/fpm/php.ini
cgi.fix_pathinfo=0
date.timezone = Asia/Tokyo
```


参考
https://www.howtoforge.com/tutorial/installing-nginx-with-php-and-mysql-on-ubuntu-lemp/
c++ builder > IDE > プロジェクト Project1.exeは例外クラスEAccessViolation(メッセージ 'アクセス違反') を送出しました > [プロジェクト]-[$プロジェクト名$をクリーンアップ] / [F9]

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

Alt+F9にて変更したユニットファイルだけをコンパイルして実行すると以下のエラーがでて停止することがたびたび起きる。

> プロジェクト Project1.exeは例外クラスEAccessViolation(メッセージ 'アクセス違反') を送出しました

これまでの対応では Shift+F9 でビルドをすることだったが、以下の欠点がある。

1. ビルド番号が増える
2. 修正のないユニットを再度ビルドする時間がかかる

## try 1

以下の方法で回避できるようだ。

1. Alt+F9で修正したユニットをコンパイルする
2. Win32\Debug\にあるProject1.* ファイルをすべて消す (ただし、Project1.exeは除く)
3. 実行する

こちらの方法だとビルド番号が増えない。

## try 2
(追記 2016/01/07)

以下の方法でも回避できる

1. [プロジェクト]-[$プロジェクト名$をクリーンアップ]
2. F9

こちらの場合、ビルド番号が増えないような気がする。
atomでterm2やterm3がインストールできなくなった話


##原因

Xcodeをアップデートしてから立ち上げていなかったので、ライセンス承認をしていなかった。

##対策

Xcodeを立ち上げて承認をしてから、パッケージのインストールをしたら解決した。

##その後
term3のインストールは成功したが、term2だと失敗する事がわかった。
term2に戻そうと思ったのは、term3がフリーズする事が多くコマンドを止められなかったため。

未解決
node.jsでパイプを使ってパスワードつきZIPを解凍する

※*nuxなどfunzipが叩ける前提で


パスワードつきZIPファイルが添付されたメールを受け取り、添付ファイルをゴニョゴニョとやりたいことがありまして
メールからZIPファイルを取り出すとこまでは[MailParser](https://github.com/andris9/mailparser)でアッサリと書けたのですが、node.jsのみで完結してパスワードつきZIPファイルを解凍するという方法が見つからなくてですね

*nixにだいたいあるunzipコマンドは入力に標準入力がとれないことが多いです
テンポラリファイルに書き込んで処理するというのもディスクへの入出力を余計にはさまないといけないのがいまいちダサい気がしまして

調べたらunzipの標準入力・標準出力専門版みたいなfunzipというコマンドがあるらしいので、それを使ってみましょう

ついでにBufferに入ったデータを他プロセスのstdinに流し込んで、その標準出力をキャプチャするという例にもなってます

funzipコマンドをパスが通っているところにインストールした上でお試しください

```js
var fs = require('fs');
var ZIP_FILE = 'ZIPファイルの在処';

var spawn = require('child_process').spawn;
var stream = require('stream');
var ZIP_PASSWORD = 'ZIPファイルのパスワード';
var FUNZIP_OPTIONS  = '-' + ZIP_PASSWORD;

var funzip = spawn('funzip', [FUNZIP_OPTIONS]);
var chunks = [];

funzip.stdout.on('data', function(chunk){
    chunks.push(chunk);
});


/**
*    解凍結果を処理するのがここ
*/
funzip.stdout.on('close', function(){
    var buffer = Buffer.concat(chunks);
    /**
    *   この時点でbufferはバイナリのBufferになってますので適宜
    *   処理してね
    */
});

/**
*   例としてファイルからZIPファイルを読み込んでますが
*/
fs.readFile(ZIP_FILE, 'binary', function(err, data){
    /**
    *   Bufferになっているdataを処理するなら流れは同じ
    */
    var bufferStream = new stream.PassThrough();
    bufferStream.end(new Buffer(data, 'binary'));
    /**
    *   ↓でfunzipコマンドのstdinにdataを流し込んでます
    *   $ funzip < data みたいな感じです
    */
    bufferStream.pipe(funzip.stdin);
});
```
瑕疵担保責任に関する民法を調べてみた

## はじめに
同じ業界で請負業務を行っている社長と飲む機会があり、瑕疵担保責任の話が出たのでまとめてみる。

僕は民法に関しては素人なので、自分用にまとめておこうと思い以下に記載。
とりあえず、必要になりそうな条文を[WIKIBOOKS](https://ja.wikibooks.org/)より抜粋して僕なりの解釈を書いているので間違いなどがあれば教えて欲しい。
（あまり理解してないので「？」が多いですが・・・）

以下に記載している文章は、システムを請け負った側の視点で書いています。

## 前提
民法には`契約自由の原則`と言うものがあるらしく、契約書の作成は必須ではない。
契約書を作成した場合は民法よりも優先され、裁判になった際に重要な証拠となる。
(民事訴訟法（247条）によって、証拠裁判主義が採用されているためらしい。）

契約書を交付しなかったり、記載していない事項に関しては以下の民法が適用される。

## 民法第634条

1. 仕事の目的物に瑕疵があるときは、注文者は、請負人に対し、相当の期間を定めて、その瑕疵の修補を請求することができる。ただし、瑕疵が重要でない場合において、その修補に過分の費用を要するときは、この限りでない。
2. 注文者は、瑕疵の修補に代えて、又はその修補とともに、損害賠償の請求をすることができる。この場合においては、第533条の規定を準用する

この条文により、納品した製品に関して瑕疵担保責任がある事が民法で定められている事がわかる。
なので、契約書を交わさずに製品を納品した場合でも瑕疵担保責任が発生する。

ただ「その修補に過分の費用を要するときは、この限りでない。」の部分がイマイチわからない。修補に費用を要しない時なんてあるのだろうか？
つまり、補修に関して費用を請求して良いと解釈して良いのだろうか？

また、「瑕疵の修補に代えて、又はその修補とともに、損害賠償の請求をすることができる。」と言うのも怖い文章だ。
瑕疵担保責任に加えて損害賠償の請求までできるとは・・・。

とりあえず、第533条を見てみる。

## 民法第533条
1. 双務契約の当事者の一方は、相手方がその債務の履行を提供するまでは、自己の債務の履行を拒むことができる。ただし、相手方の債務が弁済期にないときは、この限りでない。

これは商品やサービスが出来上がって引き渡す時前なら支払いを拒めると言う事だろうか？
逆も然りで、支払いをもらう前なら商品やサービスの提供を拒めるという事になるということか。

そして、支払い期限を設けた場合は商品を提供しても支払いの請求が出来ないと言う事になるのかな・・・？

と、なると第634条にある「第533条の規定を準用」と言うのは、瑕疵担保責任中に発生した費用と修正内容に関する対応に関しても同様に扱えるという事になる。

## 民法第637条
1. 前三条の規定による瑕疵の修補又は損害賠償の請求及び契約の解除は、仕事の目的物を引き渡した時から一年以内にしなければならない。
2. 仕事の目的物の引渡しを要しない場合には、前項の期間は、仕事が終了した時から起算する。

これは瑕疵担保責任の期間にあたるものに関する条文。
「瑕疵の修補又は損害賠償の請求及び契約の解除」が1年以内である事を指している。
また、引き渡さない場合は仕事の最終日から1年以内という事か。

と言う事は、１年以上経った時点で補修などの依頼を断る権利を持てるという事か。
これ、重要そうなので覚えておこう。

## 商法について
* 民法・・・一般消費者を対象とした売買
* 商法・・・商人間の売買

との事なので、僕は民法を調べたけれど実は商法を調べなければならなかった事に気付いた。
また、優先順位は

* 第一順位が商法
* 第二順位が商慣習法
* 第三順位が民法

となるらしい。

ちなみに、商法に則ると上記の部分に違いが見える。
例えば、瑕疵担保責任については「直ちに発見できない瑕疵の場合は、6か月以内にこれを発見し、通知すること」とある。
民法では１年だったが、商法では半年になるようだ。

もう少し詳しく調べてみました。
[瑕疵担保責任に関する商法を調べてみた](http://qiita.com/syou007/items/cc5cf94069db935bc213)

## 最後に
三つの条文を見るだけでも、なかなか難しい。
できればこのような状況には陥りたくないが、請負業務を行っていた場合は発生する事なのだろう。

民法に関してはもう少し条文がありそうだが、、、とりあえず上記を知っておけば良さそうだ。
[PHP]Google的ページャーのロジック

スクラッチでページャーを実装する必要があり、いちおうそのロジック（パターン）を残しておこうと思う。
なおこちらに掲載しているロジックは、本来のものを簡素化させたものです。
簡素化させてから動作確認していないので動かないかもしれないですが、そこはご了承ください。

あと、よりスマートな方法があればご教授いただけると幸いです。

```php:pager.php
<?php
$page_num = 10;            // 表示ページ数
$page_end = $page_num - 1; // 末ベージ数計算用
$page_pos = 5;             // 該当ページ表示位置
$view_cnt = 50;            // 1ページの表示件数

$page_now; // 現在のページ番号
$count;    // データ総数

$page_max = ceil($count / $view_cnt); // 最大ページ数

$start = 0; // 開始ページ
$end = 0;   // 末ページ

// 開始ページの計算
if ($page_max <= $page_num) {
    $start = 1;  
} else {
    $start = (($page_now - $page_pos) > 1)? $page_now - $page_pos : 1;
    // 終了ページが最大超になる場合
    if ($start + $page_end > $page_max) {
        $start = $page_max - $page_end; 
    }
}

// 末ページの計算
$end = ($page_max <= $page_num)? $page_max : $start + $page_end;
?>
<!--| pager BGN |-->
<div class="pager">
<ul class="inline-list">

<li class="first"><a href="/page/1">|&lt; 先頭へ</a></li>

<?php if ($page_now > 1): ?>
<li class="prev"><a href="/page/<?= ($page_now - 1) ?>">&lt; 前へ</a></li>
<?php endif; ?>

<?php for($start; $start <= $end; $start++): ?>
<li <?= ($start == $page_now)? 'class="current"' : '' ?>><a href="/page/<?= ($start) ?>"><?= $start ?></a></li>
<?php endfor; ?>

<?php if ($page_max > $page_now): ?>
<li class="next"><a href="/page/<?= ($page_now + 1) ?>">次へ &gt;</a></li>
<?php endif; ?>

<li class="last"><a href="/page/<?= ($page_max) ?>">最後へ &gt;|</a></li>
</ul>
</div>
<!--| pager END |-->
```
Mac Eclipse Juno で djUnitを使う

MacのEclipseでdjUnit使わなきゃいけなくなって色々大変だったのでメモ

* Eclipse Junoにインストール
* java.lang.VerifyError への対処

djUnitのメリットについてはこちらを参照:
[djUnitで Virtual Mock Objects ユニットテスト](http://hamasyou.com/blog/2004/10/24/djunit-virtual-mock-objects/)
## Eclipse Junoにインストール
※なぜかはわからないけどMarsにはインストールできなかったので、すでに動いてる報告のあったJunoに入れた。（最新版ならできるかもしれないけど試していない）

参考: [テストを楽にっ！！「djUnit」によるJavaソーステスターへの道](http://maplesystems.co.jp/blog/all/programming/11326.html)

ヘルプ>新規ソフトウェアのインストール から
http://works.dgic.co.jp/djunit/update/3.5.x/site.xml
を作業対象に追加して少し待つとdjUnit pluginが出てくるのでチェックして次へ。
同意したりして進んでいけば導入完了。

テストをするプロジェクトを右クリックしてビルドパス>ビルドパスの構成でライブラリに外部Jarを追加でpluginsフォルダの中のdjunit.jarを追加。

次にテストするプロジェクトを右クリックしてプロパティを選択。djUnitの項目を選択して、coverageのタブで「coverageを使用する」にチェック。Virtual Mock Objectsのタブを選択して、「Virtual MockObjectsを使用する」にチェック。適用を選択。

これでとりあえず使えるようになるはず。

Junit4を使ってやるかJunit3でやるかでテストコードの書き方が違うので注意。
詳しくはこちらを参照:
[テストケースの準備](http://works.dgic.co.jp/djwiki/Viewpage.do?pid=@E38386E382B9E38388E382B1E383BCE382B9E381AEE6BA96E58299)

## java.lang.VerifyError への対処
JDK7以降で使おうとすると以下のエラーがでるかもしれない。

```
java.lang.VerifyError: Expecting a stackmap frame at branch target (略)
```

実行するときにオプションで-XX:-UseSplitVerifierをつけてやればいいらしい。
参考:[既存プロジェクトをJDK8へ移行したら、java.lang.VerifyErrorが出た](http://tech.furyu.jp/blog/?p=3361)

Eclipseで設定するには実行の構成>引数で、djUnitのところのテストコードを選択して、VM引数に-XX:-UseSplitVerifierを書き込んで適用。

これでエラーが消えてちゃんと使えるはず。
さくらのクラウドAPIライブラリsacloudのラッパーを作ってみた。


## はじめに

さくらのクラウドのAPIライブラリである、sacloudのラッパーライブラリを作ってみました。まだ途中ですが、ひとまず紹介をしたいと思います。サーバの状態の定期取得などを裏側でやっています。ネットワークインターフェースやディスク管理をやりやすくしようと思っています。最終的にはアーカイブ自動作成までやりたいです。そのうちnpmにも登録します。

リポジトリ:https://github.com/syuhei176/SakuraCloudJS

## How To Use

1. さくらのクラウドの設定画面でAPIキーを発行する。


2. 以下のコマンドでサンプルを動作させることができる。

```
SAKURA_TOKEN={ACCESS TOKEN} SAKURA_SECRET={ACCESS TOKEN SECRET} node sample/poweron_and_off.js
```


## API

### Server Class

```
//zone -> is1a, is1b or th1a
var sakuraCloud = new SakuraCloud({
	zone : 'is1a',
	accessToken        : {Access Token},
	accessTokenSecret  : {Access Token Secret}
});

var server = sakuraCloud.server('server name');

//サーバの作成
server.create(function(err, result) {
	//電源ON
	server.powerOn(function(err) {
		//電源OFF
		server.powerOff(function(err, result) {
			//削除
			server.terminate(function(err, result) {
			});
		});
	});
});

```
【質問】Spring MVC(JPA使用)で初期データ入れ込み時の文字化け対応方法

現在、Spring MVCを使用したシステム開発を行っています。
JPAを使用し、初期データを入れ込むときに、文字化けが起こります。
解決方法について教えていただけると助かります。

詳細は以下の通りです。

【システム構成】
OS･･･Windows7 Professional
Java･･･1.8.0.66
開発環境･･･STS3.4.0
フレームワーク･･･Spring MVC
使用DB･･･HSQLDB2.2.9(オンメモリ)
設定文字コード･･･UTF-8

【状況】
●Spring MVCを起動するときにスクリプト(insert文)を読み込み、HSQLDB(オンメモリ)に登録する
●テーブル登録にSQL文は使用せず、エンティティクラスを定義する形にする
●Hibernate JPAを使用し、設定はpersistence.xmlに記述している
　※hibernate.hbm2ddl.import_filesで設定

【出来ていること】
●エンティティクラスの定義に従い、HSQLDBにテーブルが作成される
●スクリプトを読み込み、テーブルにデータがinsertされる
●プログラムから登録した場合、日本語でも文字化けせず登録できる

【問題点】
●スクリプトで登録する場合、日本語が混じっていると文字化けする
＜例＞
＜入れたいデータ＞
prod_class_code･･･A
prod_class_name･･･パソコン
upd_username　　･･･admin
reg_datetime　　･･･2015-11-19 12:23:01.511
upd_datetime　　･･･2015-11-19 12:23:01.511

＜格納結果＞
prod_class_code･･･A
prod_class_name･･･繝代た繧ｳ繝ｳ
upd_username　　･･･admin
reg_datetime　　･･･2015-11-19 12:23:01.511
upd_datetime　　･･･2015-11-19 12:23:01.511

【関係するファイル】
●persistence.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

	<persistence-unit name="persistenceUnit"
		transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
			<property name="hibernate.hbm2ddl.auto" value="create-drop" />
			<property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbc.JDBCDriver" />
			<property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:mem:mydata" />
			<property name="hibernate.hbm2ddl.import_files" value="sql/load.sql" />
		</properties>
	</persistence-unit>
</persistence>

●スクリプト
　src/resources/sql/load.sql

INSERT INTO M_product_class (prod_class_code, prod_class_name, upd_username, reg_datetime, upd_datetime) VALUES ('A', 'パソコン', 'admin', now(), now());


●エンティティクラス
package entity;

import java.sql.Timestamp;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class M_product_class {
	@Id
	private String prod_class_code;
	private String prod_class_name;
	private String upd_username;
	private Timestamp reg_datetime;
	private Timestamp upd_datetime;

        /* アクセサメソッドは省略 */
}
with句を使って処理時間計測をちょっと楽に書く

## よくある処理時間計測
```
import time

start = time.time()  # 計測開始
do_something()       # 計測対象の処理を実行
end = time.time()    # 計測終了
print 'CalcTime: {}'.format(end-start)
```
使うモジュールはtimeでもdatetimeでも各自好みがあるかと。

## なにがダメか
ダメではありません。ただ、
**・startとendを消し忘れてコミットする**
**・色々埋め込みすぎて何が計測用に書いたものかわからなくなる**
**・そもそもstartとendを書くのがめんどう**
とか色々あります。

## with句を使って書いてみよう
with句は、
開始時に```__enter__```, 終了時の```__exit__```のそれぞれが呼び出されるという特徴があり、
ファイルIOなどの処理にもよく利用されます。
開始と終了時に実行されるとはまさに計測処理に使えそうですね。
実際に書いてみると、

```
import time

# 処理時間を計測するクラス
class ProcessingTimer(object):

    def __init__(self):
        self.start_time = 0  # 開始時間

    def __enter__(self):
        self.start_time = time.time()

    def __exit__(self, exc_type, exc_val, exc_tb):
        print 'processing time: {}'.format(time.time() - self.start_time)

def func()
  with ProcessingTimer():
    do_something()
```

実行したらこんな感じ（結果は適当ですぜ）

```
>>>> func()
processing time: 0.0352
```

最小構成で書きましたがProcessingTimerをカスタマイズすれば色々できそうです。
こういった感じで作っておけば、ちょっと処理時間が気になったときに
　**1.with ProcessingTimer():を足す**
　**2.計測したい部分を一括インデント**
で計測できるようになります。
外す時も
　**1.with ProcessingTimer():を消す**
　**2.計測した部分を一括インデント戻し**
でOKです。(なんか自分でも便利な気がしてきた)
Unity5.xでuGUIのImageを白くする

このへん
http://tsubakit1.hateblo.jp/entry/2014/09/17/015251
http://elix-jp.sakura.ne.jp/wordpress/?p=953
を参考にしながら実装してみたメモ。
1. Unity5.x用のbuilt-in shaderをリンク先のDowunloadsからダウンロード
　　(http://unity3d.com/jp/get-unity/download/archive)
2. アーカイブ内のSprits-Default.shaderを開く
3. 1行目の
`Shader "Sprites/Default"`
　を
`Shader "Sprites/Custom"`
　とかに変更
4. fixed4 frag(v2f IN) : SV_Target の中身を

```
			fixed4 frag(v2f IN) : SV_Target
			{
				fixed4 c = SampleSpriteTexture (IN.texcoord) * IN.color;
				c.rgb = c.rgb*2+max(fixed3(0,0,0),IN.color.rgb-0.5)*2;
				c.rgb *= c.a;
				return c;
			}
```

　の様に修正
5. ファイル名をSprits-Custom.shaderなどとして保存し、Projectに持ってくる
6. Unity上でシェーダを右クリックCreate→Material
7. 生成されたMaterialを該当ImageのMaterialにセット
8. ColorのRGB値0〜128〜255で、黒〜原色〜白と変色可能になります
KitKat 未満で ListView の addFooter / removerFooter に注意！

Android 4.1.2 でフッターが表示されなかったり、非表示にするときクラッシュすることがあります。
クラッシュする場合のスタックトーレスは以下

```
E/AndroidRuntime: FATAL EXCEPTION: main
E/AndroidRuntime: java.lang.ClassCastException: android.widget.ArrayAdapter cannot be cast to android.widget.HeaderViewListAdapter
E/AndroidRuntime:     at android.widget.ListView.removeFooterView(ListView.java:390)
E/AndroidRuntime:     at jp.tokushima.tatsuhama.listviewfooter.MainActivity$1.run(MainActivity.java:29)
E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:615)
E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:4872)
E/AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
E/AndroidRuntime:     at dalvik.system.NativeStart.main(Native Method)
```

原因は、`addFooterView`, `setAdapter` の順番にあるそう。
http://developer.android.com/intl/ja/reference/android/widget/ListView.html#addFooterView%28android.view.View%29
ちゃんと書いてますね。。。
KitKat 以上の端末で問題なく動くのが怖い。
**KitKat 未満もサポートしてるのに、普段 KitKat 以上の端末でしか動作確認していない場合は要注意！**

ダメな例

```
setAdapter(...);
addFooterView(...);
``` 

良い例

```
addFooterView(...);
setAdapter(...);
```

ちなみに、Footer じゃなくても Header でも同様とのこと。
サンプルプロジェクトを
https://github.com/tatsuhama/ListViewFooterCrash
に置いたので、適当にどうぞ。
naming > { 1, 2, 3 } / { 1, 3, 6} > 違いが分かる名前付け

３つのイベントをチェックするためのカウント。

配列の用意として以下の２通りを考えてみた

1. { 1, 2, 3 }
2. { 1, 3, 6 }

1の方は個別のイベントごとにカウントする数。イベント１でカウント１つ、イベント２でカウント２つ...
2の方は開始時からのカウントの数。

どちらも動作としては同じになる。

問題はそれぞれの違いがわかるような配列名の付け方。

1. eachCounts[] = { 1, 2, 3 }
2. countsFromStart[] = { 1, 3, 6 }

対称性が悪い。

Code Completeに「変更する部分は後ろに」という命名が確かあった。 `revenueTotal`と`revenueAverage`のような書き方が対称性がいいとのこと。

1. countEach[] = { 1, 2, 3 }
2. countTotal[] = { 1, 3, 6 }

配列は複数形のsをつけたい派なので、本当は`countEachs[]`, `countTotals[]`としたいが違和感がある。
稼働中のサービスで安全にdrop tableする方法

DBサーバーのディスク容量の空きが少なくなり、不要なテーブルを削除することになりました。
対象のテーブルのデータ量が多く、平常時でもそこそこ負荷のあるサーバーなのですが、
テーブル削除だけのためにメンテナンスをするのもアレなので、
深夜帯にしれっとdropしたい気持ちを抑えつつ、負荷のかからないdrop tableの手順を試してみました。

# サービス稼働中にテーブルdropする時の問題点

## metadata lock

drop対象のテーブルに書き込みやトランザクションが貼ってあるとmeta data lockがかかってしまいます
今回は参照等がないテーブルなので、問題なし

## 巨大なファイルを削除するとI/O待ちが発生する

巨大なテーブルのデータファイルを削除すると他のプロセスがI/O待ちになる可能性があります


# 安全にテーブルdropするには

完全にこちらを参考をさせて頂きました。
[負荷の高いMySQLでメタデータを極力ロックさせずにDROP TABLEする](http://qiita.com/mxxxxkxxxx/items/7d503e8aba257dfa0947)

dropする前にデータファイルにハードリンクを貼ることで、
drop時はファイル削除を行わず、後に優先度を下げて実ファイルを削除するという流れです。

しかしioniceで優先度を下げても、
巨大なテーブルのデータファイルなどを削除する際はCPU使用率など見る限り負荷がかかっていました。
ioniceは緩やかに削除というより、実行の順番の優先度を下げるという挙動のようです。

なので、次に負荷をかけずに巨大なファイルを削除するということで下記を参考にさせてもらいました。
[大量・巨大なファイル操作を低負荷で行う方法](http://www.nari64.com/?p=748)

truncateコマンドで徐々にファイルサイズを削り、小さくした後に削除するというやり方です。


# 安全にテーブルdropする手順

まとめて下記のような流れで処理しました

- 削除前に念のため、dump取る

```
mysqldump DB_NAME hoge_table > dump_hoge_table.sql
```
- 対象テーブルのデータファイルにハードリンクを貼る

```
ln /usr/local/mysql/data/DB_NAME/hoge_table.ibd /root/hoge_table.ibd
ln /usr/local/mysql/data/DB_NAME/hoge_table.frm /root/hoge_table.frm
```

- drop tableを実行

```
mysql DB_NAME -e "DROP TABLE hoge_table"
```

- ハードリンクを貼ったファイルをtruncateコマンドで徐々にサイズを削った後に、rmを実行

```lang:php
//ファイルサイズ取得
$file_size = 0;
$cmd	= "du -m {$file_path} | awk '{print $1}'";
exec($cmd, $output, $ret);
if($ret == 0) $file_size = $output[0];

//truncateで徐々に切り詰める
if($file_size){
  $i = 1;
  while ($i <= $file_size) {
    $tmp_size = $file_size - $i;
    $cmd	= "truncate -s {$tmp_size}M {$file_path}";
    exec($cmd, $output, $ret);
    //0.1sec sleep
    usleep(100000);
    $i++;
  }
//ファイル削除
$cmd = "rm {$file_path}";
$res = exec($cmd, $output, $ret);
```

的な感じで、稼働中の本番DBで百数テーブル、260GB程度削除しましたが、負荷なく実行できました。
そこそこ時間はかかりますが、、、truncateの部分はもっと攻めて良さそうですがそれはまた次の機会に・・・
gitでcloneした時のデフォルトブランチを変更する

リモートリポジトリでの作業となります。

```bash
$git symbolic-ref HEAD refs/heads/XYZ
```

これでcloneしたときにXYZがcheckoutされているようにできます。

以下参考
http://stackoverflow.com/questions/11893678/warning-remote-head-refers-to-nonexistent-ref-unable-to-checkout
Vorlon.jsをgulp+browserSync環境で実行する

やりたいのはbrowserSyncを実行しつつ、ローカル環境でのみVorlon.jsをhtmlに動的に差し込んで実行したい。

Vorlon.jsに関しては省略します。
[Vorlon.jsとは？ ブラウザーでWebデバッグできるお手軽な開発者ツール](http://www.buildinsider.net/web/vorlon/01)

前提として`npm i -g vorlon`でインストールを済ませておきます。

```js:gulpfile.js
var gulp = require('gulp');
var browserSync = require('browser-sync');
var shell = require('gulp-shell');

gulp.task('default', ['vorlon', 'browser-sync', 'watch']);

gulp.task('vorlon', shell.task(['vorlon']));
```
gulp-shellで`vorlon`コマンドを実行させます。
私の環境の場合、全てのhtmlに共通したjsを読み込んでいる事が多いので
そういった共通js(後述ではcommon.js)に`http://localhost:1337/vorlon.js`をcreateElementで作成します。

```js:common.js
var localHost = /localhost|192\.168\.0\./;
var hostname = location.hostname;

if(localHost.test(hostname)) {
  createVorlonJS();
}

function createVorlonJS() {
  var script = document.createElement('script');
  script.type = 'text/javascript';
  script.src = '//'+location.hostname+':1337/vorlon.js';
  var s = document.getElementsByTagName('script')[0];

  return s.parentNode.insertBefore(script, s.nextSibling);
}
```

あとはいつも通りコマンドで`gulp`を叩くだけです。
一々htmlにデバッグのときだけ直接書くのは面倒なのでjsでさくっと作ってみましたが、静的に書いた場合との差が何かあるかもしれません。
既存のプロジェクトにrails generateでminitestを追加したらMysqlに怒られた話

初投稿。
曲がりなりにも2年Rails使ってるのにテスト書いたことないの恥ずかしすぎるし、徐々にでいいからテスト書いていこうね運動実施中。
というわけで既存のmodelに対する簡単なテストを作ってみたら、Mysqlに怒られた。

# やったこと
Rails + minitestでテスト作成。

```db/migrate/20151112145702_create_users.rb
  1 class CreateUsers < ActiveRecord::Migration
  2   def change
  3     create_table :users do |t|
  4       t.string :name, null: false
  5       t.string :email, null: false
  6       t.index  [:name, :email], unique: true
  7 
  8       t.timestamps null: false
  9     end
 10   end
 11 end
```

こういう感じで作られたtableがあって、

```console
$ rails g minitest:model user
　　create  test/models/user_test.rb
　　create  test/fixtures/users.yml
```

こんな感じでコマンドラインからtestを作ると、

```test/model/user_test.rb
1 require "test_helper"
  2 
  3 class UserTest < ActiveSupport::TestCase
  4   def user
  5     @user ||= User.new
  6   end
  7 
  8   def test_valid
  9     assert user.valid?
 10   end
 11 end
```
こんな感じでtest作ってくれる。
とりあえずこのまま実行。

```console
$ bundle exec rake test test/models/user_test.rb                                                          
Started

ERROR["test_valid", UserTest, 2015-11-16 20:02:17 +0900]
 test_valid#UserTest (1447671737.22s)
ActiveRecord::StatementInvalid:         ActiveRecord::StatementInvalid: Mysql2::Error: Field 'name' doesn't have a default value: INSERT INTO `users` (`created_at`, `updated_at`, `id`) VALUES ('2015-11-19 01:50:15', '2015-11-19 01:50:15', 980190962)
```

怒られる。
今回作ったテストケースでは```does'nt have a default value```って言われてるけど、実際にやってたときは「unique indexついてるけどuniqueじゃないよこれ」みたいなこと言われて困ってた。

# 原因

原因は単純な話で、一緒にcreateされてた```test/fixtures/users.yml```を見逃してたから。

```text/fixtures/users.yml
  1 # Read about fixtures at
  2 # http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html
  3 
  4 # This model initially had no columns defined.  If you add columns to the
  5 # model remove the '{}' from the fixture names and add the columns immediately
  6 # below each fixture, per the syntax in the comments below
  7 #
  8 one: {}
  9 # column: value
 10 # 
 11 two: {}
 12 #  column: value
```

中身が空のfixtureだー！これはダメ。
テストデータ作ろうとした時に引っかかったからMysqlに怒られてたのね。
```FactoryGirl```を使ってるのでfixtureファイルを削除して解決。
PEG.jsのサンプルをちょっと改造して、関数とか呼べるようにしてみた

# 概要
PEG.jsのサンプルに四則演算のサンプルがありますが、これをちょっと改造して、オレオレ関数を呼べるように改造してみました。

# コード
http://pegjs.org/online に貼り付けて実行できます。


```js
/*
 * Simple Arithmetics Grammar
 * ==========================
 *
 * Accepts expressions like "2 * (3 + 4) + sum(1,2,3,4)" and computes their value.
 */

/* 
 * (1)お便利関数群
 *  https://github.com/pegjs/pegjs/blob/master/examples/javascript.pegjsから拝借
 */
{
  function filledArray(count, value) {
    var result = new Array(count), i;
    for (i = 0; i < count; i++) {
      result[i] = value;
    }
    return result;
  }

  function extractOptional(optional, index) {
    return optional ? optional[index] : null;
  }

  function extractList(list, index) {
    var result = new Array(list.length), i;
    for (i = 0; i < list.length; i++) {
      result[i] = list[i][index];
    }
    return result;
  }

  function buildList(head, tail, index) {
    return [head].concat(extractList(tail, index));
  }

  function buildTree(head, tail, builder) {
    var result = head, i;
    for (i = 0; i < tail.length; i++) {
      result = builder(result, tail[i]);
    }
    return result;
  }

  function optionalList(value) {
    return value !== null ? value : [];
  }
}

Expression
  = head:Term tail:(_ ("+" / "-") _ Term)* {
      var result = head, i;

      for (i = 0; i < tail.length; i++) {
        if (tail[i][1] === "+") { result += tail[i][3]; }
        if (tail[i][1] === "-") { result -= tail[i][3]; }
      }

      return result;
    }

Term
  = head:Factor tail:(_ ("*" / "/") _ Factor)* {
      var result = head, i;

      for (i = 0; i < tail.length; i++) {
        if (tail[i][1] === "*") { result *= tail[i][3]; }
        if (tail[i][1] === "/") { result /= tail[i][3]; }
      }

      return result;
    }

/* 
 * (2)関数 functionを先頭に追加
 */ 
Factor
  = function
  /  "(" _ expr:Expression _ ")" { return expr; }
  / Integer


Integer "integer"
  = [0-9]+ { return parseInt(text(), 10); }

_ "whitespace"
  = [ \t\n\r]*

/*
 * (3)識別子
 */
identifier
   = [A-Za-z_][A-Za-z0-9_]+ { return text(); }

/*
 * (4)パラメータリスト
 */
ParameterList
 = head:Expression tail:( _ "," _ Expression )* {
      var ret = buildList(head,tail,3)
      return ret;
   }

/*
 * (5)関数追加(複数パラメータ対応)
 */
function 
  = func:identifier _ "(" _ params:ParameterList? _ ")" { 
    var funcName = func.toLowerCase();
    // 関数実行処理
    switch(funcName) {
      case "sum" : // sum関数を実行
          if (params == null) {
             alert("パラメータがありません:sum")
          }
          return params.reduce(function(l,r) { return l + r })
      default :
          return 0;
    }
}
```

# 実行結果

こんなんなりました。

![pegjs.png](https://qiita-image-store.s3.amazonaws.com/0/58872/f2e5ea0b-2920-33f3-6c5a-86194c1ba7b2.png)
JAVA Bronzeメモ

##コンパイルエラー
コンパイルの時点でエラーとなった場合は、プログラムの中にJavaの文法に合っていない記述が含まれていることを表しています

##コンパイルできるが実行できない
コンパイルは問題無かったがプログラムの実行時にエラーとなる場合があります。このような実行時エラーはプログラムは文法的には間違っていないが使い方に問題がある場合に発生します。
メソッド定義の構文としては正しいためコンパイルは成功するが、実行できない

##JRE JAVAプログラムの実行環境
Java Runtime Environment

##ライブラリ
「他人が利用することを想定した複数のクラスファイルの集まり」のことを<FONT color="#ff0000">ライブラリ</font>という。

##ガベージコレクション
不要になったメモリ領域を自動的に開放する機能

##JAVA エディション(版、編、年版)
Java SE(Java Platform Java Standard Edition)
Java EE(Java Platform Enterprise Edition)
Java ME(Java Platform Micro Editon)

platform→実行環境
UITableViewControllerを 3D Touch の Peek and Pop (プレビュー機能) に最短で対応させる方法

記事の内容はこちらを参照してください。
https://mishimay.github.io/cc236a06f3a73a469862/
<!--


思っていたよりも簡単に対応できました。
UITableViewController以外で Peek and Pop を行いたい場合も参考になると思います。

1. 3D Touch を検知するviewとdelegate先を `registerForPreviewingWithDelegate:sourceView:` で登録する

    ```swift
    override func viewDidLoad() {
        super.viewDidLoad()
        registerForPreviewingWithDelegate(self, sourceView: tableView)
    }
    ```

1. delegateを受け取るUITableViewControllerで `UIViewControllerPreviewingDelegate` プロトコルを採用する

    ```swift
    class MyTableViewController: UITableViewController, UIViewControllerPreviewingDelegate {
        // ...
    }
    ```

1. delegateメソッド `previewingContext:viewControllerForLocation:` で 3D Touch を検出する範囲と、その範囲をタッチされた際に表示するPeek画面 (プレビュー画面) を指定する

    ```swift
    private var previewingViewController: UIViewController?

    // ~~~

    func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
        if let indexPath = tableView.indexPathForRowAtPoint(location) {
            // 3D Touch の範囲を指定
            previewingContext.sourceRect = tableView.rectForRowAtIndexPath(indexPath)
            
            // Peek画面 (プレビュー画面) を返す
            let object = objects[indexPath.row]
            previewingViewController =  NextViewController(object)
            return previewingViewController
        }
        return nil
    }
    ```

1. delegateメソッド `previewingContext:commitViewController:` でPopしたとき (Peekした後に更に強く押したとき) の挙動を記述する

  - *Peek (プレビュー) した画面を使い回す場合*
    この場合、画面が**ぼよん**とするアニメーションが付きます。

    ```swift
    func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) {
        if let previewingViewController = previewingViewController
            // 画面遷移させる
            showViewController(previewingViewController, sender: self)
        }
    }
    ```

  - *Peek (プレビュー) した画面とは別の画面をPopする場合*

    ```swift
    func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) {
        if let indexPath = tableView.indexPathForRowAtPoint(CGPointMake(previewingContext.sourceRect.midX, previewingContext.sourceRect.midY)) {
            // 画面遷移させる
            let object = objects[indexPath.row]
            let viewController = AnotherViewController(object)
            showViewController(viewController, sender: self)
        }
    }
    ```

# 参考
Apple公式
https://developer.apple.com/library/prerelease/ios/documentation/UserExperience/Conceptual/Adopting3DTouchOniPhone/3DTouchAPIs.html#//apple_ref/doc/uid/TP40016543-CH4-SW1

とても詳しくわかりやすい解説
http://krakendev.io/peek-pop/


-->
rbenv 管理下のruby script をcron から実行する （備忘録）

rbenv を使っていると、なにもせずに crontab に ruby script_name とするといろいろ文句を言われますね。
# とにかく回避
cronからの起動用shellスクリプトを書く。
rbenv / bundler しているアプリケーションが、ディレクトリ ~/application01 にあるとします。

```bash:ruby_script.sh
!/bin/sh

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

cd ~/application01
ruby appli01.rb
```
起動用shellスクリプトなどは、~/bin に置く習慣なので、crontab はこんなふうに。

```
2 * * * * ~/bin/ruby_script.sh
```
# もっと簡単な方法がある？

のかもしれませんが、とりあえず備忘録、ということで。
以下も読んではいますが、いまいち理解しきれておりません。
[cronからbundle exec...はsu -lc ...が一番便利](http://qiita.com/kazuph/items/c530359eada5b2639e68)
Webページの表示が遅くなったとき：一次調査


自分が対応するときの手順メモです（自己責任）

#自身のPCから確認
1.リソース状況の確認
観点）
　・CPUがカツカツ
　　　　　→　jsなどのローカル処理があやしい

　・メモリ空きなし
　　　　　→　pcスペックがあやしい

　・他のPCでも同じ状態になるか

2.問題のある範囲の確認
観点）
　・静的、動的
　　　→　動的のページが遅い場合、生成部分があやしい

　・サイズが大きい、小さい　＊静的ページで
　　　→　サイズが大きいページが遅い場合、ネットワークがあやしい

3.デベロッパーツールによる確認
　・Network
　　　の確認（TTFB）
　・Timeline


# サーバーサイドの確認

リソース
　・top
　・df / free
ネットワーク
　・
ログ
　・apache
DB
　・接続数


参考URL
デベロッパツール：使い方（chrome）
http://www.buildinsider.net/web/chromedevtools/01

デベロッパーツール：スライド（chrome）
http://www.slideshare.net/yoshikawa_t/chrome-developer-tools-17787728

ページ表示高速化のあたりチェック
https://developers.google.com/speed/pagespeed/insights/

遅いとき対応の目安サイト
http://www.aiship.jp/knowhow/archives/20507

TTFBは200ms以下にする（chrome:公式）
https://developers.google.com/speed/docs/insights/Server
[備忘録] MacのVirtualBoxでメニューバーを非表示にする

いつも忘れるのでメモ。
MacのVirtualBoxでゲストOSをフルスクリーンで利用中にMenu Barを表示しないようにする方法。

/Applications/VirtualBox.app/Contents/Resources/VirtualBoxVM.app/Contents/Info.plist
このファイルの `LSCanProvideIMVideoDataSource` と `NSHighResolutionCapable` の間に以下のパラメータを追加する。

```xml
<key>LSUIElement</key> <string>1</string>
```

これで画面の上の方の操作をする際に、メニューバーに邪魔されずにすむのだ。

# 参考
- https://forums.virtualbox.org/viewtopic.php?f=2&t=21676#p305585
.htaccessのメモ

#.htaccessのメモ

## IP制限

### ディレクトリ自体に設定（指定したIPのみ可）
`# 優先順位
 Order deny,allow
 # すべて禁止
 deny from all
 # 指定したIPのみ許可
 allow from 123.123.123.123
 allow from 234.234.234.234`

### ファイルごと設定（指定したIPのみ可）
`<Files example.html>
 Order deny,allow
 deny from all
 allow from 123.123.123.123
 allow from 234.234.234.234
 </Files>`

## リダイレクト

`# 開始
 RewriteEngine On`

### 指定ページにリダイレクト
 `# 指定ページを除く
 RewriteCond %{REQUEST_URI} !examle.html
 # ループ防止
 RewriteCond %{REQUEST_URI} !ex_error.html
 # スマホ制御
 RewriteCond %{HTTP_USER_AGENT}  ! (iPhone|Android.*Mobile|Windows.*Phone) 
 # エラーページへ遷移
 RewriteRule ^(.*)$ html/ex_error.html [R]
 RewriteBase /`

### httpsにリダイレクト
`# 必ずhttpsにリダイレクト
 RewriteCond %{HTTPS} off
 RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]`


## 引越し
みそは301で永久引越し

`RewriteEngine on
RewriteBase /
RewriteRule ^(.*)$ http://www.abc.123.jp/page/ [R=301,L]
Redirect 301  / http://www.abc.456.jp/page/`



## ベーシック認証

### .htaccessの記述
`AuthUserFile /var/www/example.com/.htpasswd
 AuthGroupFile /dev/null
 AuthName "Input ID and Password."
 AuthType Basic
 require valid-user
 <Files ~ "^.(htpasswd|htaccess)$">
 deny from all
 </Files>`

### .htpasswdの記述
`example:ibWEPMMsR.AJc`
ユーザー名：hash化したパスワード

#### 参考URL：htpasswd作成
http://www.luft.co.jp/cgi/htpasswd.php
MySQLパーティショニングは外部キーと一緒に使えない＆おまけの外部キー削除方法

パーティショニングした時に制約に引っかかったのでメモ。

あるテーブルで5000万レコードぐらいのデータを流し込む必要があったので、テーブルを作成する時にパーティションで分割しようと考えた。

# 例

```mysql:
CREATE TABLE `hoge` (
  `key` int(10) unsigned NOT NULL,
  `key2` varchar(10) NOT NULL,
  `test1` varchar(50) DEFAULT NULL,
  `test2` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`key`),
  KEY `hoge_FK1` (`key2`)
);

CREATE TABLE `piyo` (
  `key2` varchar(10) NOT NULL,
  `test4` varchar(50) DEFAULT NULL,
  `test5` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`key2`),
  KEY `hoge_FK1` (`key2`),
  CONSTRAINT `hoge_FK1` FOREIGN KEY (`key2`) REFERENCES `hoge` (`key2`) ON DELETE CASCADE ON UPDATE CASCADE
)
  PARTITION BY HASH(`key2`) PARTITIONS 500;
```

下のpiyoを流したときに以下のエラーが。
`ERROR 1506 (HY000): Foreign key clause is not yet supported in conjunction with partitioning`

どうやら制約で外部キーが使えない模様。。
![パーティション化.png](https://qiita-image-store.s3.amazonaws.com/0/93950/280c059f-0ab3-8b98-bfe4-a164f0f125ea.png)

https://dev.mysql.com/doc/refman/5.6/ja/partitioning-limitations.html

設計上外部キーを消すわけにはいかなかったので諦めることに・・。しょんぼり。

# おまけ
これを行っている時に、テーブルを作成後に外部キーを削除する方法を見つけたのでメモ。

１．SHOW CREATE TABLEで外部キーの確認。

```mysql:
mysql> SHOW CREATE TABLE piyo;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                     |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| piyo  | CREATE TABLE `piyo` (
  `key2` varchar(10) NOT NULL,
  `test4` varchar(50) DEFAULT NULL,
  `test5` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`key2`),
  KEY `hoge_FK1` (`key2`),
  CONSTRAINT `hoge_FK1` FOREIGN KEY (`key2`) REFERENCES `hoge` (`key2`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
```

２．外部キーの名前が「hoge_FK1」と分かったのでこれを削除するには以下のようにする。

```mysql:
ALTER TABLE piyo DROP FOREIGN KEY hoge_FK1;
```

３．外部キーを再度付与したい場合は以下のようにする。

```mysql:
ALTER TABLE piyo ADD CONSTRAINT hoge_FK1 FOREIGN KEY (key2) REFERENCES hoge(key2) ON DELETE CASCADE ON UPDATE CASCADE;
```
ProjectileにRootを識別させる


;; Projectile version: 0.13.0

Projectileでは、以下のファイルがある場所をRootと認識しています。


```elisp
("rebar.config" "project.clj" "build.boot" "SConstruct" "pom.xml" "build.sbt" "gradlew" "build.gradle" "Gemfile" "requirements.txt" "setup.py" "tox.ini" "package.json" "gulpfile.js" "Gruntfile.js" "bower.json" "composer.json" "Cargo.toml" "mix.exs" "stack.yaml")
```

ProjectのRootとした場所に上記のファイルがない場合は、
`projectile-project-root-files`に、ファイルを追加することで任意にRootを決定できます。

```elisp
;; .projectrootがある場所をRootとする
(add-to-list 'projectile-project-root-files ".projectroot")
```
AsciidoctorをdockerとAtomエディタでいい感じに使えた

diagramは文字化けした。
@hnakamurさんの以下記事を参考にすれば解決するかも。

* [asciidoctorで日本語の本文とPlantUMLのクラス図が入った文書をPDFに変換してみた - Qiita](http://qiita.com/hnakamur/items/33a5e342ea79cffbbd9b) 
* [asciidoctor-fopubで生成されるPDFの"Table of Contents"などを日本語化する - Qiita](http://qiita.com/hnakamur/items/94ff084ac5dc326ac859)

## 参考

* [公式サイト](http://asciidoctor.org/)
* [dockerhub](https://hub.docker.com/r/asciidoctor/docker-asciidoctor/)

## 書き方

* [公式サイト user-manual](http://asciidoctor.org/docs/user-manual/)
* [quick-reference](http://asciidoctor.org/docs/asciidoc-syntax-quick-reference/)
    * [#images](http://asciidoctor.org/docs/asciidoc-syntax-quick-reference/#images)

```rst:a.adoc
= Hello, AsciiDoc!
Doc Writer <doc@example.com>

An introduction to http://asciidoc.org[AsciiDoc].

== First Section

* item 1
* 日本語

[source,ruby]
puts "Hello, World!"

image::http://asciidoctor.org/images/octocat.jpg[GitHub mascot]

[source,ruby]
.a.rb
----
puts "Hello, World!"
----
```

* //  : コメントアウト
* <<< : 改ページ
* = : 見出し1
* == : 見出し2

## 出力例

* htmlは以下。pdfは本みたいでかっこいい。

![](https://raw.githubusercontent.com/asciidoctor/asciidoctor/master/screenshot.png)

## 変換

```bash:html化
asciidoctor a.adoc
```

```bash:pdf化
asciidoctor-pdf a.adoc
```

## diagramsが含まれている場合の変換

```bash:html化
asciidoctor -r asciidoctor-diagram a.adoc
```

```bash:pdf化
asciidoctor-pdf -r asciidoctor-diagram a.adoc
```


----

## dockerで使う

```bash:adoc.sh
docker run --rm -it \
  -u 1000:1000 \
  -v /home/User1/Downloads/:/documents/ \
  asciidoctor/docker-asciidoctor \
  asciidoctor-pdf $1
  #asciidoctor $1
```

* 出力されるファイルを uid:1000, gid:1000 とする。

```bash:実行方法
sh adoc.sh a.adoc
```

* a.pdf が出力されていることを確認。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/307a677c-d32e-f977-1800-83427c7f56f3.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/23a2f29a-521b-b5da-f894-350c9a5e2980.png)


## Atomでプレビュー

* [asciidoctor/atom-asciidoc-preview](https://github.com/asciidoctor/atom-asciidoc-preview)

![atom-ascii.png](https://qiita-image-store.s3.amazonaws.com/0/25728/919b4514-d417-b829-017f-3c94034070a3.png)

* `ctrl-shift-a`でプレビューが見れる。

![preview.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2e65487f-da1f-c773-4526-2475627753dd.png)


## Webブラウザ

* [Asciidoctor.js Live Preview - Chrome ウェブストア](https://chrome.google.com/webstore/detail/asciidoctorjs-live-previe/iaalpfgpbocpdfblpnhhgllgbdbchmia)

* [Asciidoctor.js Live Preview :: Add-ons for Firefox](https://addons.mozilla.org/ja/firefox/addon/asciidoctorjs-live-preview/)
【FileMaker】データのロールバックを実装するーレイアウト編

さて、FileMakerのいいところは「保存」ボタンを押さなくてもそのままデータの更新ができて、システムを使うのに疎い方でも「保存」なんていうアクションを覚えなくてもいいところではないでしょうか？

確かにいいんですが、
「あ、間違えた」
というときにはちょっと面倒くさいですよね。

「修正する前は何を入力していたんだっけ！？」
となりますよね。

こういう時にデータを元に戻したい！ということを「ロールバック」といいます。

とりあえず一番簡単なのは、

**レイアウトの自動更新をやめる**

ことです。

「え、どこどこ！？」

ここです。
![スクリーンショット 2015-11-19 9.00.46.png](https://qiita-image-store.s3.amazonaws.com/0/60538/7cd7924e-7fa4-3ca6-064d-4d2219547a84.png)

このチェックを外すと、画面を離れる時にこういうメッセージが出てきます。
![スクリーンショット 2015-11-19 9.03.36.png](https://qiita-image-store.s3.amazonaws.com/0/60538/f2b98410-ff9a-5b75-8cf2-1aae70228280.png)

このダイアログボックスで「保存しない」を選択すると、入力したことが無かったことになります。（顔のシミも無かったことにしてほしい。。。）

はい、行が消えました。
![スクリーンショット 2015-11-19 9.06.18.png](https://qiita-image-store.s3.amazonaws.com/0/60538/17b3b9e2-ddba-5858-c84a-a72cd2826866.png)
今回は新規レコードの追加ですが、元々データが入っていた場合は、データの更新が無かったことになります。

これが一番お手軽で確実なデータのロールバックではないでしょうか。

いままでレイアウト設定を気にせず使っていた方、「万が一」の時のためにこういう設定を見直してみませんか！？
エレクトロン手巻き寿司

コマンドラインからアプリ名とURLを指定して叩くとアプリになるコマンドを作った。

- 手巻き寿司が食べたかった。
   - 海苔=Electron
   - 酢飯=AppName
   - 具=URL

## 概要

1. 😊 < へいらっしゃい。
1. 🙋 < `$ npm install electron-temaki-sushi -g`
2. 🙋 < `$ electron-temaki-sushi Google https://google.com/`
3. 🙆 🍣(Google.app)三👏😊 < あいよ。

## 公開

- ソースコードは[GitHub](https://github.com/mh61503891/electron-temaki-sushi)に公開しています。
- npmパッケージも[公開](https://www.npmjs.com/package/electron-temaki-sushi)しています。

## 参考URL

- [lectronでChatworkをデスクトップアプリ化 (Webview + badge)](http://qiita.com/mottox2/items/7a1373f23ba02245d0e0): Webviewを使うあたりを参考にさせていただきました 🙏
    - でもまだTwitterのウェブサイトとかだとログインボタンが効かなかったりする。Googleのウェブサイトだと上手く動くやうだ。（ふしぎ。）
- [Electron - Enable copy and paste](http://www.pracucci.com/atom-electron-enable-copy-and-paste.html): 入力フォームとかへのコピペ機能の追加方法など参考にさせていただきました 🙏

## 勘所

- CLIを作るのに`meow`というのを使ってみた。なぜねこなのか。
- アプリのひな形にタイトルを流し込んだりするのにテンプレートエンジンを使ってみた。`ect`というやつ。速いらしいよ。
- `CoffeeScript.compile('CoffeeScriptのソースコードの文字列')`とするとJavaScriptのソースコードの文字列が得られる。
- `tmp`モジュールは`setGracefulCleanup()`してやるとプロセスが不慮の事故で終了してもちゃんと後片付けをしてくれるようだ。
- `gulp`モジュールは`start()`を叩いてやればソースコードからもタスクを実行できる。
- `package.json`の`bin`に指定したスクリプトはシェルスクリプトとそれをラップしたWindows向けのバッチファイルを`npm install`時に生成してくれるようだ。
- README.mdに絵文字（`:piyo:`）を使うとGitHubでは見えても`https://www.npmjs.com`では見えないのでつらい。

## そのうち調べたい事柄

- Electronで作ったアプリのクッキーやらはどこに保存されておるのか？
- アプリにステータスバーが欲しい。HTTPリクエスト中なのか何してるのか分かりづらい。
- アプリを起動後に閉じてしまったDevToolsを再度`openDevTools()`するにはどうすればええのか？
- faviconとかやらを使ってアプリのアイコンとかにしたいよね。

## 類似アプリ

ウェブサイトをアプリにしたい。そんなあなたにOS X用であれば[Fluid - Turn Your Favorite Web Apps into Real Mac Apps.](http://fluidapp.com/)というのもあるYO。
Qiita > 考察 > その時々に必要なストックをどうまとめるのか

現在僕がストックしている数は594。この中からその時々の作業に必要なストックをどうまとめるのか。

### ストックし直す
よくやる方法として、ストックを一旦解除してからストックし直す。
こうすると、ストックの最新ページにしばらくは並ぶので、直近の作業向けにまとまる。

### 外部ブックマークに登録
はてなブックマークを利用。
[00今]のようなタグをつけて、その時々に必要なもののみ登録。
作業が終わったら、[00今]タグはクリア。

### ブラウザブックマークに登録
作業PCが固定の場合に限り、ブラウザのブックマークに登録でもいい。
ただし、タイトルが途中までしか表示されないので、長いタイトルのストックはタイトルが読みきれなくなる。

### キーワードでストック内検索
タイトルや中身で検索しやすいストックはこれでもいい。
適当なキーワードが思いつくかどうか。
ただし、作業のたびに検索というのは効率が悪いと思っている。作業の流れが中断される。
理想は、作業前に15分くらいでストックまとめが完了して、一旦まとめたものはリストで見れること。そのリストには作業に関係ないストックは一切入っていない状態。

### 限定公開のまとめ記事を作る
まだ試していない方法でこの記事を書きながら思いついた方法だが、限定公開で作業用リンクだけの記事を投稿してもいいかもしれない。
ただし、リンクをMarkdownで書くのは以下のように手間ではある。

 - URLをコピー
 - タイトルをコピー
 - Markdownに整形
 
これを必要なリンク数だけ繰り返すことになる。
作業が終わったら記事は消すか不使用が分かるタイトルに変更する。
一つの記事ができれば、それをコピーして次の記事を作るのは短時間でできるかもしれない。
PHP高速化：APCu + ZendOpcache

##参考サイト
説明：
・[APC / OPcacheについて](https://www.xserver.ne.jp/manual/man_server_php_apc.php)
・[超わかりやすいスライド](http://www.slideshare.net/hirokawa/php-55-26227359)
導入：
・[APC導入でPHPのパフォーマンスアップ](https://blog.e2info.co.jp/2015/01/18/apc%E5%B0%8E%E5%85%A5%E3%81%A7php%E3%81%AE%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%82%A2%E3%83%83%E3%83%97/)
・[CakePHPにAPC導入](http://ameblo.jp/itboy/entry-11382264564.html)
・[centosでyum installしたphp55のOpcacheを有効にする](http://www.shirakobato-ss.com/columns/ict-columns/open-source/998/)

## 測定方法・対象
測定ツール：Apache Bench
PHP:5.5.30
Zend OPcache: v7.0.6-dev
使用フレームワーク：CakePHP
実施コマンド： ab -n 100 -c 100 xxx.jp

## 結果 (Requests per second)
| 導入前 | APCu導入+CakePHPでクエリ結果をキャッシュ | OPcahce導入後 |
|:------|:-----------|:-------|
| 42.56 | 63.52 | 289.11 |

## 所感

OPcacheが爆速過ぎる。自分の環境では５倍近く早くなりました＼(◎o◎)／
ChromeのdeveloperToolで見たTTFBも、
100ms位から40ms位になったので凄い改善です。
コンパイルにそれだけ時間がかかってたってことですかね。
入れるだけで早くなるので、まだ導入してない方は是非導入しましょう！
技術英語 > All the projectors [are in place], ... / installed as a part of

@ Star Trek Voyager > PROJECTIONS

このエピソードでは、ホログラムであるドクターが初めて医療室以外の艦内を歩き回れるようになった。

そのためには艦内のあちこちにprojectorsを置いていくというのをトレスが行った。

---

ドクターの行動範囲を広げようとしてトレスが

> All the projectors are in place, ...

http://eow.alc.co.jp/search?q=in+place&ref=sa
> in place
> 1. 適当な位置に、適所に、所定の［あるべき・決まった］位置［場所］に、定位置に
...
> in-place
1. 配置済みの、整っている
...

<hr>
関連して思い出したのは

http://eow.alc.co.jp/search?q=installed
> installed as a part of
《be ～》～の一部として設置される［取り付けられる］

<hr>
関連して思い出したのは

http://qiita.com/7of9/items/c099c5b05f89f6bbe89b
> 装置の搬入などで作業者の一人が「Easy. Easy.」など言っているのが以前あった。この時は「？」であったが、「Be careful」の意味だったので納得。
C++ Shared Pointerのテスト

C++11のshared pointerの振る舞いを調べるコード。
２つのベクターに代入してリファレンスカウントを出力する、

```
#include <iostream>
#include <memory>
#include <vector>

using namespace std;

class X{
    int x;
public:
    X(int x):x(x){
        cout << "constructed" << endl;
    };
    ~X(){
        cout << x << " destructed" << endl;
    }
};

vector< shared_ptr<X>> globalVect;


void add(shared_ptr<X> &x){
    cout << "passed to func" << endl;
    cout << "count " << x.use_count() << endl; // 1
    
    vector< shared_ptr<X>> localVect1;

    localVect1.push_back(x);
    cout << "copy to local vector" << endl;
    cout << "count " << x.use_count() << endl; //2
    
    globalVect.push_back(x);
    cout << "copy to global vector" << endl;
    cout << "count " << x.use_count() << endl; // 3

}

int main(int argc, const char * argv[]) {
    auto x = shared_ptr<X>(new X(10));
    cout << "shared point created" << endl;
    cout << "count " << x.use_count() << endl; // 1
    add(x);
    
    cout << "return to main" << endl;
    cout << "count " << x.use_count() << endl; // 2
    
    globalVect.erase(globalVect.begin(), globalVect.end());
    cout << "deleted from glibal vector" << endl;
    cout << "count " << x.use_count() << endl; // 1
    
    x.reset();
    cout << "manually realeased" << endl;
    cout << "count " << x.use_count() << endl; // 1

    return 0;
}
```
OpenSSHの警告メッセージを出さないようにする方法


#### 下記の時に、こういった警告メッセージを出させないようにする方法です

- 初めてのホストに接続した時
- 接続先ホストのフィンガープリントが変わった時

```

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

```

### リモートサーバへsshで接続する時にオプションで警告出さないようにする

#### sshコマンドのオプションで警告出さないようにするパターン
```
$ ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null server_name
```

#### configで設定するパターン
```
$ vim ~/.ssh/config
host *
        StrictHostKeyChecking no
        UserKnownHostsFile=/dev/null
```

#### StrictHostKeyCheckingのオプションについて

##### 簡単な設定項目
|オプション     | 意味     |
|:-------------|:---------|
|ask(default)  |確認させる |
|yes	       |接続しない |
|no	       |接続する   |

#### UserKnownHostsFileのオプションについて

/dev/nullを指定することで、readしても空なので、新規ホストに接続した時と同じ挙動になります。
新規ホストに接続後、ホスト情報をwriteしても何も起きないので、既存のknown_hostsファイルに影響を与えることもありません。
Node.jsからiRemoconを制御するメモ


手元にiRemoconが来ました。
http://i-remocon.com/

IRKitみたいなアレです。赤外線電波を学習して使うことができ、Webと家電を連携してくれます。

![](https://i.gyazo.com/6e66e10c9116f259238af959348e496f.png)


Node.jsから使いたいなと思っていたら、hecomiさんの[node-iRemocon](https://github.com/hecomi/node-iRemocon)がとても役に立ちました。

## 準備

```
$ npm i iremocon
```

## 試してみる

iPhoneのアプリなどで予めIPが分かっていると早い(今回は`172.16.12.232`がIP)

### 赤外線電波の記憶

`ir001`にセットする場合

```app.js
var iRemocon = new require('iRemocon');
var iremocon = new iRemocon('172.16.12.232');

iremocon.ic('ir001', function(err, msg) {
  if (err) {
    console.error(err.code, err.error, err.detail);
    // e.g. 003 受信エラー 不正なリモコンデータを受信した
    return;
  }

  console.log(msg);
  // e.g. ic;ok
});

```

これで`ir001`というチャンネルに記憶できます。

### 赤外線電波の発信

発信するときは以下のようになります。

```app.js
var iRemocon = new require('iRemocon');
var iremocon = new iRemocon('172.16.12.232');

iremocon.is('ir001', function(is){
  console.log(is);
});
```