OmniAICreator/Qiita-1.07M huggingface dataset:
gitで共有ブランチのコミットを書き換えてみた

git resetとかgit commit --amendをやると既存コミットが書き変わる。
通常、こういった操作は自分しか触らないローカルブランチで、しかもpush前にしかやらない（と思ってる）。
コミットを書き換えると、そのコミットをpullしている他の人にも影響するからなんだけど、
実際にやってみたらどうなるんだ？！というのを試してみた。

### こんなシチュエーションを考えてみた
- あるリポジトリを二人の作業者がcloneして作業している(my_repo/your_repo)
- 二人はmasterを共有ブランチとしてtopicブランチからmerge, pushしている
- my_repoの作業者が残念なコミットをpushしたことに後から気づき、masterを直接書き換えて誤魔化そうとした
- your_repoの作業者は残念なコミットまでpullしている

### ケース1：git resetで闇に葬ろうとも、他人のブランチから蘇る

```
my_repo]$ git log --oneline --decorate | head -n 2
　78cc640 (HEAD, origin/master, my-topic, master) my cool commit
　1e9525d fifth commit
my_repo]$ git reset --hard HEAD~
my_repo]$ git push -f origin master
```

何も知らないyour_repo作業者は自分の変更をコミットしてmergeする

```
your_repo]$ git ci -m "sixth commit"
your_repo]$ git checkout master && git pull
your_repo]$ git push origin master
```

この時点で消したはずのコミットが元に戻ってる
(your_repoにmy cool commitが残っているので、それがpushで復元されている)

```
my_repo]$ git pull
my_repo]$ git log --oneline --decorate | head -n 2
　957a166 (HEAD, origin/master, master) sixth commit
　78cc640 (my-topic) my cool commit
```

### ケース2：git commit --amendで書き換えると、他人のブランチでコンフリクトを起こす(rebaseでも同じ)

```
my_repo]$ git log --oneline --decorate | head -n 2
　78cc640 (HEAD, origin/master, my-topic, master) my cool commit
　1e9525d fifth commit
my_repo]$ vi cool.rb
my_repo]$ git add cool.rb
my_repo]$ git commit --amend
my_repo]$ git push -f origin master
```

何も知らないyour_repo作業者は自分の変更をコミットしてmergeしようとして・・・

```
your_repo]$ git ci -m "sixth commit"
your_repo]$ git checkout master && git pull
　....
　CONFLICT (add/add): Merge conflict in cool.rb
```

your_repo作業者がmasterブランチを更新しようとしてコンフリクトが発生する。
作業者自身はブランチを触っていないため何が起きたかわからなくなる。
とりあえず状況を確認すると・・・編集した覚えのないファイルがコンフリクト
(ローカルに取り込んでいたmy cool commitと、--amendされた後のmy cool commitの内容が衝突している)

```
your_repo]$ git status
  ....
  #       both added:         cool.rb
```

こうなると、my_repo作業者に内容を確認するなりcloneし直すなりしないと先に進めなくなる。
ちなみに、git rebaseでコミットをまとめた場合も同じことが起こる。
Parser CombinatorでIPアドレスのチェック

まだちょっと試行錯誤しなきゃいけないと思いますが、とりあえずIPアドレスをチェックする方法。

```scala
import java.net.{InetAddress,UnknownHostException}
import util.parsing.combinator.RegexParsers

object IpParsers extends RegexParsers {
  def ipAddress: Parser[String] = """[0-9a-fA-F:\.]+""".r.withFilter { str =>
    try {
      val addr = InetAddress.getByName(str)
      true
    } catch {
      case e: UnknownHostException => false
    }
  }
}
```

1. 前提として、IPv4またはIPv6文字列をまとめて扱い、ざっくりと文字列の範囲を選びとる。（最初の正規表現マッチ）
1. `withFilter`で抽出した文字列の検証を追加
1. `InetAddress.getByName`でIPアドレスとみなせるかどうかフィルタ

結果は見つかった文字列(ex. `192.168.0.0`, `::1`)になる。
`Parser`クラスに`withFilter`や`flatMap`などのMonadicなメソッドが定義されてるのは知らなかった。

## 余談

Scala 2.10 なら `Try` が使えますね。エラー処理はこう書いたほうがすっきりするかも。

```scala
util.Try(InetAddress.getByName(str)).isSuccess
```

この場合、例外は全て握りつぶして`false`を返す仕様。
jqGridでセル内改行させる

```css:
.ui-jqgrid tr.jqgrow td {
  white-space: normal;
  word-break: break-all;
}
```

デフォルトは `.ui-jqgrid tr.jqgrow td` で `white-space: pre;` と指定されているので、これを上書きするスタイルを定義すれば、セル内改行されるようになる。

__before__

![before.JPG](https://qiita-image-store.s3.amazonaws.com/0/28302/c3a5b3de-977f-c178-47da-62f07a23f508.jpeg)

__after__

![after.JPG](https://qiita-image-store.s3.amazonaws.com/0/28302/0de2d5ca-f51d-5433-9ff7-7a5dfbe5162a.jpeg)



#参考
- [スタイルシート［CSS］/テキスト・フォント/改行・スペース・タブの扱いを指定する - TAG index Webサイト](http://www.tagindex.com/stylesheet/text_font/white_space.html)
- [半角英数字の文字列を折り返す：CSS小技](http://kumacrow.blog111.fc2.com/blog-entry-496.html)
nginxで動いているサイトをApplication Cacheに対応させる手順


結構前の記事だけど、ここを参考にさせてもらった。
http://tenderfeel.xsrv.jp/html-xhtml/html5-html-xhtml/1172/

## 1. .appcacheを作成

どのファイルをキャッシュするのか？といった情報を記載したマニフェストファイルを`.appcache`という拡張子で作成する。

例えばこんな感じ。詳しくは上の参考サイト等を参照。

```hoge.appcache

CACHE MANIFEST
# バージョンとか更新日時とかここに。

## Cache Files
CACHE:
js/xxx.js
css/xxx.css
img/xxx.png

## Network Files
NETWORK:
*
```

置く場所はどこでもいいっぽい。まぁ、特別な理由がなければDocumentRootで良いと思う。

## 2. htmlタグにmanifest属性を追加

キャッシュ対象とするページのhtml（index.htmlとする）をこう。

```html:index.html
<!DOCTYPE html>

- <html lang="ja">
+ <html lang="ja" manifest="hoge.appcache">

	<!-- 省略 -->

</html>
```

## 3. nginxのMIMEタイプの設定を変更

`/etc/nginx/mime.type`に、`appcache`について追記。

```/etc/nginx/mime.type

types {
	(省略)
	text/cache-manifest		appcache;
}

```

最後に再起動。

```
# /etc/init.d/nginx restart
```

以上。とりあえず導入するだけならこれでできるけど、キャッシュの更新をどうするかとかちゃんと考えておかないと危険。

- - -
> Blog URL : http://www.utano.jp/ (Syntax Error.)
Titanium Studioが起動しないときのメモ

しばらく前から、Titanium Studioがエラーがでて起動できない状態がつづいていた。

まじめに、エラーログをみてみたら、

（ドキュメントフォルダ）/Titanium_Studio_Workspace/.metadata

に書き込みできなくて起動できないようだった。
（なぜそうなったのか、原因は不明）

上記のフォルダを削除したら、無事起動することが出来た。
TMPでcase

Qiitaの投稿練習も兼ねて
タイトルの通りで、C++のTMPでcaseを実現してみようとかいうそういうのです
文章で書くよりコードを見たほうがわかりやすいと思うので例を乗せます

```cpp:example1.cpp
case_ < char >::of
<
	match < char , long > ,
	match < short , int > ,
	match < int , short > ,
	match < long , char > ,
	match < list < pattern < 0 > , double > , list < double , pattern < 0 > > >
>::type // => long
```

```cpp:example2.cpp
case_ < list < float , double > >::of
<
	match < char , long > ,
	match < short , int > ,
	match < int , short > ,
	match < long , char > ,
	match < list < pattern < 0 > , double > , list < double , pattern < 0 > > >
>::type // => list < double , float >
```

includeやusingなどは省略しています
TMPのために僕自身が作成したライブラリ、[FTMP](https://github.com/minamiyama1994/FTMP)を使用しています
まあ、TMPってこんなこともできるんだよーって話です
これをうまく使えばTMPの際のメタ関数の場合分けがなんとかなるかもしれません
【WordPress】固定ページが親子関係をもつか調べる

人間は親がいないと生まれませんが、固定ページは天涯孤独のやつのほうが多数派ですね。

サイトではよく、横にサイドバーを表示したりすると思うのですが、例えば、親子関係のない単独のページでは、サイドバーを表示しないようにしたい、とかありますよね？

固定ページが親子関係をもつか調べる関数を作ってみました。

```php:functions.php
function is_lonely() {
    global $post;

    if(is_page()) {
        $children = get_children(array('post_parent' => $post->ID, 'post_type' => 'page'));
        if(empty($children)) { // 子ページをもたない
            $ancestors = get_post_ancestors($post->ID);
            if(empty($ancestors)) {
                return true; // 親をもたない
            } else {
                return false; // 親をもつ
            }
        } else {
            return false; // 子ページをもつ
        }
    } else {
        return false; // 固定ページじゃない
    }
}
```

小ネタでした。

****
参考サイト
[関数リファレンス/get post ancestors](http://wpdocs.sourceforge.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/get_post_ancestors)
[関数リファレンス/get children](http://wpdocs.sourceforge.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/get_children)
【HypCommonFunc】フッターバーのサイズを変更する

hyp_preload.phpの１７７０行目付近のこの内容に変更

styleをつけて適当にwidthとheightを指定しただけですが、

```php:hyp_preload.php
<!--blockMenu-->
<div id="keitaiblockmenu" data-role="header" data-theme="{$this->k_tai_conf['jquery_theme']}">
 <div data-role="navbar">
  <ul><li>{$blockmenu}</li></ul>
 </div>
</div>
<!--/blockMenu-->
<!--blockMenuBar-->
<div data-role="header" data-theme="{$this->k_tai_conf['jquery_theme']}" style="height:55px">
 <a href="{$_url}" data-ajax="false" data-icon="home2" data-iconpos="notext" style="height:50px;width:60px">Home</a>
 <h4>
  <a id="keitaifixedbar_main" href="#keitaiMainContents" data-ajax="false" style="display:inline;text-decoration:none;"><pagetitle></a>
 </h4>
 <a id="keitaifixedbar_block" href="#" data-icon="menu" data-ajax="false" data-iconpos="notext" style="height:50px;width:60px" >block</a>
</div>
<!--/blockMenuBar-->
```

data-iconのところは自分で作成する

HypCommonの設定を開き、モバイル設定の追加CSSの中にオリジナルのテーマを入れますが、ここに以下を追加

今回はテーマ　f　があるとして作っています。

```css:jquery_custom.css
.ui-icon-menu {
	background-image: url(サイトURL/images/menu.png);
	background-repeat: no-repeat;
	background-size:44px 44px;
	background-color:#ff6666;
	-webkit-border-radius:	9px;
	border-radius:9px;
	position:absolute;
	left:7px;
	width:44px;
	height:44px;
	margin:0 !important;
}
.ui-icon-home2 {
	background-image:url(サイトURL/images/home.png);
	background-repeat:no-repeat;
	background-size:44px 44px;
	background-color:#ff6666;
	-webkit-border-radius: 9px;
	border-radius: 9px;
	position:absolute;
	left:7px;
	width:44px;
	height:44px;
	margin:0 !important;
}
.ui-btn-text {
	top:10px;
	font-size: 16px;
}
.ui-btn-inner {
	height:44px;
}
div.ui-btn-text {
	top:0;
}
h4.ui-title {
	width:100%;
	position:relative;
	top:7px;
}
```

アイコンの大きさはbackground-sizeで指定
アイコンが見えるサイズはwidth heightで指定

【平成26年2月5日16時50分追記】
修正したcssを追加
自動ログイン ( teraterm macro )

メモ

```bash:host.login.ttl
username  = ''               ; ssh user
userpass  = ''               ; ssh user password
publickey = '~/.ssl/pub.key' ; ssh public key file
hostname  = '127.0.0.1:22'   ; ssh host:port
port      = '22'             ; ssh host connection port
auth_type = 1                           ; ssh auty type
; auth_type = 1 : password
; auth_type = 2 : public key
; auth_type = 3 : challenge
; auth_type = 4 : pageant 
;

getspecialfolder logdir "MyDocuments";
logfileptn = '%s_%s-%s.log'

getdate datetime  '%Y%m%d'
getdate datetime2 '%Y%m%d-%H%M%S'

sprintf logfileptn username hostname2 datetime2;
logfile=inputstr;

debugmode = 0;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


sshuser = ' /user=';
strconcat sshuser username;

sshpass = ' /passwd=';
strconcat sshpass userpass;

sshpkey = ' /keyfile=';
strconcat sshpkey publickey;

msg = '';

strconcat msg hostname ; xample.com

if auth_type=1 then; password
   sshauth   = ' /ssh /2 /auth=password ';

   sprintf '%s %s %s %s' hostname sshauth sshuser sshpass
   msg=inputstr;
   
elseif auth_type=2 then; publickey
   sshauth   = ' /ssh /2 /auth=publickey ';
      
   sprintf '%s %s %s %s %s' hostname sshauth sshuser sshpass sshpkey
   msg=inputstr;

elseif auth_type=3 then; challenge
   sshauth   = ' /ssh /2 /auth=challenge';
      
   sprintf '%s %s %s %s' hostname sshauth sshuser sshpass
   msg=inputstr;

elseif auth_type=4 then; pagent
   sshauth   = ' /ssh /2 /auth=pagent';
      
   sprintf '%s %s %s %s' hostname sshauth sshuser
   msg=inputstr;

endif;

connect msg;


changedir logdir;
; binary:appended:plain:timestamp:dialog 
logautoclosemode 1;
logopen logfile 0 1 1 0 0;

logwrite #13#10;
logwrite '***********************************************'
logwrite #13#10;
logwrite 'login : '
logwrite datetime2
logwrite #13#10;
logwrite '-----------------------------------------------'
logwrite #13#10;

if debugmode=1 then

   wait '#' '$'
   sendln 'id'
   pause 1;
	
   wait '#' '$'
   sendln 'date'
   pause 1;
	
   wait '#' '$'
   sendln '/sbin/ifconfig'
   pause 1;
	
   wait '#' '$'
   send 'ps aux '
   send '| sed -e "s/[ ]\+/ /ig"'
   send '| cut -d " " -f 11'
   send '| grep "/"'
   send '| grep "[[]" -v'
   send '| sort'
   send '| uniq'
   sendln
   pause 1;
	
   wait '#' '$'
   send 'netstat -an'
   send '| cut -d ":" -f 2'
   send '| cut -d " " -f 1'
   send '| sed -e "/^$/d"'
   send '| sed "/[^0-9]/d"'
   send '| sort'
   send '| uniq'
   sendln
   pause 1;
	
   wait '#' '$'
   sendln 'df -H'
   pause 1;

endif;

```
Python 3.x で進捗を表示しながらファイルをダウンロードする

Qiita のコードハイライトが残念だったので Gist に書きました。
https://gist.github.com/tyochiai/8817420

なんてこたーないサンプルなんですが、「Python ダウンロード 進捗」でググったらなぜか `sys.stdout.write()` を使うようなサンプルしか出てこなかったので (たぶんどっかに出処があるんでしょう) 別に `print()` でもいいのよーというサンプルです。

`urlretrieve()` は引数 `reporthook` に関数を渡しておくと 1 ブロックダウンロードする度に　現在のブロック数、ブロックサイズ、総ダウンロードサイズ を引数に渡して呼び出してくれます。

ところで `urlretrieve()` なんですが、ドキュメントだとレガシーインターフェースに分類されててそのうちなくなるかもよーとか書いてあります (実際いくつかのメソッドが 3.3 で非推奨になってます)。その時は代替になるメソッドが用意されるんですかね。
CocoaPodsで "[!] Pod::Executable pull" エラーが出てしまった際の対策


pod install を実行した際に、↓こんな風にエラーが出てしまいました

```
[!] Pod::Executable pull

A	AFHARchiver/0.2.1/AFHARchiver.podspec

A	AFWunderlist/1.0/AFWunderlist.podspec

(省略)

A	ym/1.2.6/ym.podspec

A	zipzap/6.0/zipzap.podspec
Pull is not possible because you have unmerged files.

Please, fix them up in the work tree, and then use 'git add/rm <file>'

as appropriate to mark resolution, or use 'git commit -a'.
```

#原因
2014/1/30にSpecsのリポジトリが壊れてしまったようです。

Repairing Our Broken Specs Repository http://blog.cocoapods.org/Repairing-Our-Broken-Specs-Repository/
> Unfortunately we've encountered a bug in libgit2 and we are going to have to force push into the Specs repository. (Also known as the ‘master’ spec repo.)
>
>What does this mean for you?
>Well, basically your CocoaPods setup is going to break. 
>
>You are going to have to manually delete any local copies of the Specs repository and re-clone the new version of the Specs repository. 
>
>You can do that with the following commands:
>
>pod repo remove master
>pod setup

#解決策
セットアップが完了するまで数分かかりました。

```
pod repo remove master
pod setup
```

#参考
Error on pod install - stack overflow http://stackoverflow.com/questions/18224627/error-on-pod-install
【WordPress】複数のサイドウィジェットを定義する

管理画面＞外観＞ウィジェットでサイドウィジェットを作れる、というのは多分みなさんご存知だと思います。
投稿のアーカイブやカテゴリ、タグクラウドなんかをパパッと表示してくれて、とても便利です。
そのウィジェットですが、複数個作りたいときってありますよね。

作り方は簡単で、ウィジェットを登録するときに、

```php:functions.php
if(function_exists('register_sidebar')) {
	register_sidebar();
}
```

て、してたのを

```php:functions.php
if(function_exists('register_sidebars')) {
	register_sidebars(3, array('name' => 'サイドウィジェット%d'));
}
```

にするだけです。
「3」となっているのはウィジェットを３つ作りたいからです。作りたい個数を書いてください。
%dとなっている部分は、WordPress側で処理して、1から番号をふってくれます。
![ウィジェット](http://f.cl.ly/items/063L261m372C3h0e2W2V/ss2014020502.png)

呼び出すときは、dynamic_sidebar()で呼び出していたのを、番号をつけて呼び出します。

```php:
dynamic_sidebar(2);
```

本家ドキュメントを見ると、エラーを防ぐために返り値を使いなさい的なことが書いてあります。

```php:sidebar.php
<!-- サイドナビ -->
    <nav id="side_navi">
        <ul>
	    <?php if(!function_exists('dynamic_sidebar') || !dynamic_sidebar(2)): ?>
                <li>ウィジェットが動的に作成されませんでした</li>
            <?php endif; ?>
        </ul>
    </nav>
```

****
参考サイト
[本家](http://wpdocs.sourceforge.jp/WordPress_%E3%82%A6%E3%82%A3%E3%82%B8%E3%82%A7%E3%83%83%E3%83%88_API#.E8.A4.87.E6.95.B0.E3.81.AE.E3.82.B5.E3.82.A4.E3.83.89.E3.83.90.E3.83.BC.E3.81.AE.E7.99.BB.E9.8C.B2)
[［WordPress］ウィジェットを複数設定する方法](http://design-plus1.com/tcd-w/2010/12/widget-2.html)
perl cpan コマンド

メモ

```bash:起動
perl -MCPAN -e shell
```

```bash:検索
i /regex/
```

```bash:標準インストール
install path/to/file.tar.gz
```

```bash:testを実行せずにインストール
notest install path/to/file.tar.gz
```

```bash:testに失敗してもインストール
force install path/to/file.tar.gz
```

```bash:標準アップデート
upgrade path/to/file.tar.gz
```

```bash:testに失敗してもアップデート
force upgrade path/to/file.tar.gz
```

```bash:testを実行せずにアップデート
notest upgrade path/to/file.tar.gz
```

```bash:ヘルプ
help
```

```bash:終了
quit
```

* 2014/03/25 追加

```bash:設定初期化
o conf init
```

```bash:設定確認
o conf 
```

```bash:設定反映
o conf commit
```

```bash:設定
# Makefile.PL $makepl_arg
o conf makepl_arg PREFIX=/path/to/dir

# make arg
o conf make <make-command>
o conf make_arg <make-command-arg>

# make install arg
o conf make_install_build_command <make-command>
o conf make_install_arg <make-command-arg>

# wget
o conf wget <wget-command>

# pager
o conf pager <less-command>

# unzip
o conf unzip <unzip-command>

# tar
o conf tar <tar-command>
o conf tar-verbosity <none|yes>

# gzip
o conf gzip <gzip-command>

# gpg
o conf gpg <gpg-command>

# patch
o conf patch <patch-command>
```
Rubyでクオート、ダブルクオート以外でのStringの書き方

コードを書いてて良く、ストリング書きたいけど文字列内に大量に 「"」 や 「'」 が入り混じってて、いちいちエスケープしたくないけど、書き方忘れた。名前なんだっけ？って思う時があったので、メモ代わりにかいておく。

良く使うのがヒアドキュメントと%記法なんですが、名前がいつも浮かばない。

### パーセント記法
```rb
# とりあえず単純にストリングを書きたい
# %の後に特定の文字で囲むと、その間の文字列をStringとして認識してくれるみたい。ダブルクオートの代わり
str1 = %!This is a string.!
str2 = %{"And you can do this too!"}
str3 = %[Also stuff like #{1 + 1}]  # => "Also stuff like 2"
```

さらにいくつか特殊（？）なケースもあるみたい

```rb
# %q でシングルクオートの代わり
str3 = %[Also stuff like #{1 + 1}] # => "Also stuff like \#{1 + 1}"
```

```rb
# %r で正規表現
regex1 = %r!^\/[a-z0-1]+\/$!
regex1 =~ '/hoge234'   # => nil
regex1 =~ '/hogeA/'   # => nil
regex1 =~ '/hoge234/'   # => 0
```

### ヒアドキュメント
ヒアドキュメントも結構使うのでメモっておく

```rb
# <<の後に、ヒアドキュメント開始タグを書いて、最後に同じタグで閉じると、その間がStringとして保存される。
str = <<EOS
<html>
<head>
</head>
<body>
</body>
</html>
EOS
```

```rb
# でも、こうするとエラーになる。閉じタグはちゃんと左端にないとダメなのね。
str = <<EOS
<html>
<head>
</head>
<body>
</body>
</html>
  EOS

# しかもmarkdownのシンタックスでもエラーになってるみたいですね。カッコ悪い。
```

```rb
# 「<<」の代わりに、「<<-」にすると動いたりする
str = <<-EOS
<html>
<head>
</head>
<body>
</body>
</html>
  EOS
```

とりあえず、パっと思いつくのはこれくらい。後は「パーセント記法」とか「ヒアドキュメント」と言う名前が思い出せればググってます。（そこに辿り着くまでが長い）
【小ネタ】【WordPress】固定ページにpage.php以外のテンプレートを使う

「階層構造を持つ固定ページの親ページだけ、子ページの一覧を表示する」のを実現したかったので、（条件分岐とかでも実現できそうですが）親ページのみ、page-parent.phpを使うことにしました。


#親ページ用テンプレートpage-parent.phpを作成する

重要なのは、ファイルの冒頭に

```php:
<?php
/* Template Name: [TemplateName] */
?>
```

と記述することです。
[TemplateName]の部分は何でも良いですが、何のためのテンプレートかわかるようにしておきましょう。
私の場合は

```php:page-parent.php
<?php
/* Template Name: ParentPage */
?>
```

としました。


#管理画面で、テンプレートを選択する

固定ページの投稿画面で、テンプレートという選択ボックスが増えていると思います。
デフォルトテンプレートになっていますが、これを、さっき作ったテンプレートに変えます。
![テンプレート選択](http://cl.ly/image/2D142W1u2j0r/ss2014020501.png)

****

ちなみに、単独の固定ページのみ、別のテンプレートを使うときは、ファイル名を
page-[スラッグ名].php
または、
page-[PostID].php
にするだけで、適応されます。
s3をバックエンドにしたGyazoクローン

S3をバックエンドにした[Gyazo](https://gyazo.com/ja)サーバ(upload.cgi)のクローンを公開しました。

* https://github.com/essa/s3gyazo

Gyazoのクローンは既にたくさんありますが、これは以下の特色があります。

* S3に直接アップロードするので、容量の心配がない (その代わりに課金の心配がある)
* Dockerfile が付属しているので、deployが簡単 (Dockerが動いていれば)

### インストール方法

まず、S3のアカウントを取得して、このシステム専用の bucket を一つ作成してください。それから、amazon AWSの [IAM Management Console](https://console.aws.amazon.com/iam/home?#security_credential)というページで、Access Key を作成(Create New Access Key)します。

この時に、Access Key ID と Secret Access Key を書きとめておいてください。

次に、Dockerが動く環境を用意します。

```bash
git clone https://github.com/essa/s3gyazo.git
cd s3gyazo
cp env.sample env
```

envをエディタで開いて、Access Key ID と Secret Access Key と bucket の名前をこのファイルに書きこんで下さい。

```bash
sudo docker build -t s3gyazo .
sudo ./start_docker.sh
```

で起動します。そのままだとホストの 8081 ポートで動くので、これを変えたい時は、start_docker.sh を変更してください。

### 使い方

アップロード先を変更できる Gyazo クライアントなら、そのまま使えると思います。私は、nginx の frontendを立ててbasic 認証をかけているので、以下のクライアントで動作確認しました。

* [gyazowin+を最新のgyazowinのソースとマージした - tyoro.exe](http://exe.tyo.ro/2012/02/gyazowingyazowin.html#more)
* [Basic認証対応のMac用Gyazoクライアントを作った - unknownplace.org](http://unknownplace.org/memo/2012/06/22/1/)

### 謝辞

以下のソースを参考にさせていただきました。ありがとうございます。

* [udzura/upload.cgi](https://github.com/udzura/upload.cgi)
* [send/gyazo-sinatra](https://github.com/send/gyazo-sinatra)
* [GoogleAppEngineで動くGyazoクローンgaezooのソースをアップしました。 - When it’s ready.](http://a2c.hatenablog.com/entry/20091223/1261505344)
AWS の ELB に対して RapidSSL の SSL 証明書食わせる時にハマったお話し。


# 現象

1. **Invalid Private Key** って言われる
1. **Invalid Public Key** って言われる

# 原因と対策

## Invalid Private Key

端的にパスフレーズ付きの秘密鍵を食わせてたから。

```bash:openssl
openssl rsa -in example.com.key -out example.com.key.nopass
```

とかしてやって、.nopass な方を食わせれば OK

## Invalid Public Key

最初は発行された Public Key (メールとかに貼り付けられてるヤツ) が間違ってるのか？！とか思ったけど、違った。
原因としては、中間証明書の方だった。

ELB (だけかどうかは知らんが) に中間証明書を食わせる場合、 **中間証明書 → クロスルート証明書** の順で食わせないとダメらしい。

んで、RapidSSL さんの場合、以下の Intermediate CA が提供されている。

1. Primary Intermediate CA: **GeoTrust のクロスルート CA**
1. Secondary Intermediate CA: **RapidSSL 自身の CA**

これを利用する場合、 **Secondary → Primary** の順で貼り付けないとダメなのでしたー
【Scala】複数コンストラクタ【オーバーロード】


↓を参考というかほとんど写経です。
http://seratch.hatenablog.jp/entry/20110428/1303999721　

Javaではおなじみの複数の引数をとる（オーバーロード）コンストラクタを定義してみましょう。

#キーワード
* 補助コンストラクタ（auxiliary constructor）

#実践

##パターン：引数の省略（デフォルト値）

複数のコンストラクタを定義したいPersonクラスを用意します。

```scala
class Person(name: String, sex: String) {

}
```


もう一つコンストラクタを用意します。

```scala

class Person(name: String, sex: String) {
  def this(name: String) = {
    this(name, "woman")
  }
}
```

まあこの場合なら、

```scala
class Person(name: String, sex: String = "woman") {

}
```

これ（デフォルト引数）でも同様ですね。

##パターン：違う型（型変換）

通常のコンストラクタ

```scala
class Person(name: String, specialAbility: Map[String]) {

}
```

割と単純な例ですが、もう一つコンストラクタを用意します。

```scala
class Person(name: String, specialAbility: Map[String, String]) {

  def this(name: String, specialAbilityList:List[(String, String)]) = {
    this(name, specialAbilityList.toMap)
  }
}
```

#ポイント

* サブで定義したコンストラクタは、必ずメインのコンストラクタ（メインの宣言の部分）のコンストラクタを通る。
* ↑の特性のため、実利用時のポイントとしては、メインのコンストラクタはなるべくおおざっぱなもの（大は小を兼ねる的な）にしておき、サブのコンストラクタで細分化するようなイメージか。

サブコンストラクタでの細分化例

```scala
class Person(elems: List[Map[String, String]]) {

  def this(singleMap: Map[String, String]) = {
    this(List(singleMap))
  }

  def this(mapKey: String, mapValue: String) = {
    this(List(Map(mapKey -> mapValue)))
  }
}

```
[Ruby]Hashのdefault_procで簡易キャッシュ


プログラム中で、ちょっとしたキャッシュを作りたい場合。もちろんメソッドを用意してもいいのですが、再利用性が低かったり、ちょっと大袈裟感があったりする場合も。

```ruby
def foo
  %(a b c b a d).each do |id|
    puts sample_item(id)
  end
end
def sample_item id
  @sample_cache[id] ||= Sample.find(id)
end
```

そんな時には、Hashのdefault_procを使うと簡易的に代替できます。

```ruby
def foo
  sample_cache = {}
  sample_cache.default_proc = proc do |hash, key|
    hash[key] = Sample.find(key)
  end
  %(a b c b a d).each do |id|
    puts sample_cache[id]
  end
end
```

コンストラクタにブロックを渡すのでもOK。

```ruby
def foo
  sample_cache = Hash.new{|hash, key|
    hash[key] = Sample.find(key)
  }
  %(a b c b a d).each do |id|
    puts sample_cache[id]
  end
end
```

一応、レンスポンス的にもこちらの方が速い。

```ruby:benchmark
require 'benchmark'

class TestClass
  def initialize keys, cycles
    @keys = keys
    @cycles = cycles
    @cache = {}
  end
  def get_data i
    @cache[i] ||= Time.now
  end
  def test1
    ret = {}
    (1..@keys).cycle(@cycles){|i| ret[i] = get_data(i)}
  end
  def test2
    ret = {}
    cache = Hash.new{|h,k| h[k]=Time.now}
    (1..@keys).cycle(@cycles){|i| ret[i] = cache[i]}
  end
end

t = TestClass.new(10000, 1000)
Benchmark.bm do |x|
  x.report { t.test1 }
  x.report { t.test2 }
  x.report { t.test2 }
  x.report { t.test1 }
end
```

```bash:result
       user     system      total        real
   2.860000   0.010000   2.870000 (  2.866910)
   2.150000   0.000000   2.150000 (  2.162081)
   2.180000   0.000000   2.180000 (  2.188632)
   2.980000   0.000000   2.980000 (  2.983547)
```
[PhantomJS]location.hrefを使ったリダイレクトにハマったら


HTTPステータスコードの301や302を使ったリダイレクトなら、一応ちゃんと処理してくれるのですが。JavaScriptの`location.href`なんかを使ったリダイレクトを書かれると、`onLoadFinished`で謎のエラー終了を引き起こすことが、結構ある様子。

仕方ないので、万能ではないものの対応しておく。

```javascript
function render_page(move_to) {
  var page = require('webpage').create();
  page.onNavigationRequested = function(url, type, willNavigate, main) {
    if (main && url != move_to) {
      page.close();
      render_page(url);
    };
  });
  page.open(move_to, function(status){
    if (status == 'success') {
      // do something
      page.render('path/to/snapshot.png');
    };
  });
```

結構な苦肉の策です。
[PhantomJS]ネットワーク由来でないタイムアウトも、きちんと切断する


PhantomJSでタイムアウトを設定したい場合、公式ドキュメントには何故か載っていない`resourceTimeout`でOKなハズなんですが。

```javascript
var page = require('webpage').create();
page.settings.resourceTimeout = 5000;
page.open('http://example.com', function(status){
  // do something
});
```

こちら、ネットワーク要員のタイムアウトしか拾ってくれず。コンテンツが異様に大きいとか、JSで継続的にロードを行っていて...など、タイムアウトしないで`onLoadFinished`もコールされない、困った場面に直面してました。

仕方ないので`setTimeout`を使って自力でタイムアウトさせる処理を追記。

```javascript
var page = require('webpage').create();
page.settings.resourceTimeout = 5000;
var timeout = setTimeout(function(){
  page.stop();
}, 5000);
page.open('http://example.com', function(status){
  clearTimeout(timeout);
  // do something
});
```

この`stop`メソッドで強制切断した場合も、`open`のコールバック引数の`status`にちゃんと`"fail"`が返ってくるので、普通にエラー処理しておけば良い（当然ながら`onResourceTimeout`はコールされないので、そこで同じ処理を書くなら、ちょっと工夫が必要）。
Capybara+PhantomJSでCSVをダウンロード

フォームやリンクからCSVをダウンロードしたい場合があるかと思いますが、PhantomJSが現行バージョンではContent-Dispositionで返ってきたレスポンスを受け取ってくれません。

https://github.com/ariya/phantomjs/issues/10052

とはいえ、どうしてもファイルを受け取りたい場合があったので、結構強引だけど実装してみた（実際に書いたコードは複雑なので、エッセンス部分だけ）。

まず「クリックしたいボタンのPOSTをAjaxでエミュレートして結果コンテンツを戻す関数」をJavaScriptで書き、定義をぶっ込む。

```ruby
page.execute_script(%!
  window.getCsv = function(target){
    var efn = document.querySelector("input[value='"+target+"']");
    if (efn) {
      var f = efn.parentNode;
      var es = f.getElementsByTagName("input");
      var query_str = "";
      for (var i=0; i<es.length; i++) {
        var name = es[i].getAttribute('name');
        var val  = es[i].getAttribute('value');
        if (name) {
          query_str += name + '=' + val + '&';
        }
      }
      var xhr = new XMLHttpRequest();
      xhr.open(f.getAttribute('method'), f.getAttribute('action'), false);
      xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      xhr.send(query_str);
      return xhr.responseText;
    }else{
      return "";
    }
  }
!)
```

関数の中身は、適当に。対象ページによって全然変わってくるだろうし、jQueryなどをインジェクトしてあればもっと簡単に書けるはず。

そして、必要な場面でCSVを取り出す。

```ruby
ret = page.evaluate_script("getCsv('#{target}')")
ret.split("¥r¥n").each do |line|
  # do something
end
```

RubyとJavaScriptが錯綜して少しトリッキーだけど、基本的には認証やCSRF対策が施されたページでも動くはず。
[Ruby]あまり見ないけどたまに便利なメソッド[String編]


## sprintfのフォーマット文字列として扱う

```ruby
"ID: %05d" % 321
# => "ID: 00321"
```

## 足したり掛けたりする

```ruby
"ventra " * 2 + "space people"
# => "ventra ventra space people"
```

## 中央寄せ文字列を作る

```ruby
"title".center(20)
# => "       title        "

" title ".center(20, "#")
# => "###### title #######"
```

左寄せ、右寄せも

```ruby
"title".ljust(20, ".")
# => "title..............."

"title".rjust(20, ".")
# => "...............title"
```

## 一行毎に処理する

```ruby
"abc\ndef\nxyz".each_line do |line|
  puts line
end
```

`.lines`でもいける。

```ruby
"abc\ndef\nxyz".lines do |line|
  puts line
end
```

`.split("\n").each`より手軽だけど、`.each_line`や`.lines`に渡される行は改行コードが入ったままなのに注意。

## IDをインクリメントする

```ruby
"X1001".succ
# => "X1002"
"X9999".succ
# => "Y0000"

"A".succ
# => "B"
"Z".succ
# => "AA"
```

なんとなく、こうしたいんだろうなと思えるIDを作ってくれて便利。

## 連続した文字を縮める

```ruby
"Woooooooooooow!".squeeze
# => "Wow!"
```

## 先頭の文字列が一致するかどうかを調べる

```ruby
%w(F-14 A-10 F-18).each do |jet|
  puts "#{jet} is Fighter" if jet.start_with?("F-")
end
# => "F-14 is Fighter" "F-18 is Fighter"
```
Bashで二重起動防止


いちいちlockファイル置いたりしてexitしたらゴミが残ったり、シビアなタイミングだとファイル作る前に２つ目が起動しちゃったりするのはナンセンス。

お手軽かつ比較的正確にやるなら、pgrepで既に同じシェルが起動していないか調べれば良い。

```bash
if [ $$ -ne $(pgrep -fo "$0") ]; then
  echo "既に起動されています"
  exit 1
fi
```

引数も含めて多重をチェックするなら、検索する文字列を少し工夫する。

```bash
_CMD="$0 $@"
if [ $$ -ne $(pgrep -fo "$_CMD") ]; then
  echo "既に起動されています"
  exit 1
fi
```
Pry上でreload!要らずのファイル編集


単体だと`reload!`の無い`pry`。`pry-rails`ならコマンド入るけど、そうでなければコードをいじるたびに再起動とか面倒。

でも、`pry`上でエディタ起動してファイルを編集すれば、コードがリロードされるだけでなくオブジェクト再作成などテストの流れをやり直さなくて良くて便利だったのでメモ。

まず、エディタは`vim`を使いたいので`.pryrc`で指定しておく。

```.pryrc
Pry.config.editor = "vim"
```

で、とりあえず簡単なテストクラスを作成。

```ruby:/tmp/my_class.rb
class MyClass
  def initialize
    @create_time = DateTime.now
  end
  def foo
    puts "created at #{@create_time}."
  end
end
```

`pry`で動かしてみる。

```ruby:pry
[1] pry(main)> require '/tmp/my_class'
=> true
[2] pry(main)> x = MyClass.new
=> #<MyClass:0x007fbbebd03848
 @create_time=
  #<DateTime: 2014-01-19T23:35:08+09:00 ((2456677j,52508s,39159000n),+32400s,2299161j)>>
[3] pry(main)> x.foo
created at 2014-01-19T23:35:08+09:00.
=> nil
```

というところで、先ほどのクラスを編集。

```ruby:pry
[4] pry(main)> edit /tmp/my_class.rb
```

ここで先ほどエディタとして指定した`vim`が起動するので、適当に編集。今回は`foo`メソッドの出力するメッセージを気持ち変えてみただけ。

```ruby:/tmp/my_class.rb
class MyClass
  def initialize
    @create_time = DateTime.now
  end
  def foo
    puts "edited. but still created at #{@create_time}."
  end
end
```

保存して`vim`を終了させると、`pry`に戻る（自動的にコードは再読み込みされている）。
Railsの`reload!`だと、リロード後はインスタンスの再作成からやらなければならないが、この形であれば、すぐに続きのテストが出来る。

```ruby:pry
[5] pry(main)> x.foo
edited. but still created at 2014-01-19T23:35:08+09:00.
=> nil
```

いちいち開けたり閉じたりが面倒な場合もあるけど、テストの流れでちょっとした修正を入れたい時など、むしろ便利な場面も多いかなと。
mysqlコンソールをpagerで便利に


コマンドコンソールが見やすくなる。

```bash
mysql -u username -p --pager="less -S -n -i -F -X" db
```

mysqlコンソールに入ってから設定するなら

```
mysql > pager less -S
```

やぱり要らなくなったら

```
mysql > nopager
```

lessで使えそうなオプションは、次のあたり。

オプション | 説明
:--------|:------------------------------------------
-S       | 画面幅より長い行を折り返さない
-n       | 行番号を表示しない（レスポンスが良くなる）
-i       | 検索時に大文字/小文字を区別しない
-F       | 1画面でファイル全体が表示できる場合はlessを自動終了
-X       | 端末にtermcap初期化文字、非初期化文字を送らない

出力を画面に表示させずファイルにとっておきたい場合は `cat` を使ったりするのも便利。

```
mysql > pager cat > /tmp/dump.txt
```

いつも決まったpagerを使いたいなら、エイリアスを作っておくとか。

```bash
alias mysql="mysql --pager='less -S -n -i -F -X'"
```
[Ruby]あまり見ないけどたまに便利なメソッド[Array編]


## countにブロックを渡す

```ruby
[1,2,3,4,5].count(&:even?)
# => 2
```

## nilを消す

```ruby
[1, nil, "xyz", 3, nil, "hoge"].compact
# => [1, "xyz", 3, "hoge"]
```

## 逆方向にeach

```ruby
name = %w(naohiko mori)
name.each(&method(:puts))
# => "naohiko" "mori"
name.reverse_each(&method(:puts))
# => "mori" "naohiko"
```

## ゼロを消す

```ruby
points = [1,2,0,4,0,0,3]
points.select(&:nonzero?)
# => [1,2,4,3]
points.reject(&:zero?)
# => [1,2,4,3]
```

## 適当にピックアップする

```ruby
%w(aaa bbb ccc ddd eee).sample
# => "ddd"
```

## 同じ処理を繰り返す

```ruby
spell = %w(ventra ventra space people)
spell.each{|word| puts word}
# => "ventra" "ventra" "space" "people"
spell.cycle(3){|word| puts word}
# => "ventra" "ventra" "space" "people" "ventra" "ventra" "space" "people" "ventra" "ventra" "space" "people"
```

引数を省略すると無限に繰り返すので注意。

## 場合の数を作る

```ruby
names = %w(taro hanako nao)
domains = %w(@sample.com @foobar.co.jp)
names.product domains
# => [["taro", "@sample.com"],["taro", "foobar.co.jp"],["hanako", "@sample.com"],["hanako", "foobar.co.jp"],["nao", "@sample.com"],["nao", "foobar.co.jp"]]
```
Rubyのコードレビューで軽く突っ込んだところ


## Enumerable#findを使う

```ruby:before
def find_something
  ret = nil
  Foo.each do |item|
    if item.this_is_it?
      ret = item
      break
    end
  end
  ret
end
```

```ruby:after
def find_something
  Foo.find{|item| item.this_is_it?}
end
```

## Orを活用する

```ruby:before
def find_or_create info
  ret = find_something(info.id)
  ret = create_something(info) if ret.nil?
  ret
end
```

```ruby:after
def find_or_create info
  find_something(info.id) || create_something(info)
end
```

## 文字列結合をmap+joinで
```ruby:before
str = ""
Items.each do |item|
  str += "#{item.key}='#{item.val}'"
end
```

```ruby:after
str = Items.map do |item|
  "#{item.key}='#{item.val}'"
end.join
```

## メソッド呼ぶだけのイテレーションは&で

```ruby:before
%w(1 0 2 5 0 2).map{|v| v.to_i}.select{|v| v>0}
```

```ruby:after
%w(1 0 2 5 0 2).map(&:to_i).select(&:nonzero?)
```

nonzeroと「0より大きい」は等価でないけど。

## 配列から除外はrejectでも可

```ruby:before
%w(1 0 2 5 0 2).map(&:to_i).select(&:nonzero?)
```

```ruby:after
%w(1 0 2 5 0 2).map(&:to_i).reject(&:zero?)
```
最速でBootswatchを試してみる


Bootstrap CDNを利用して、簡単にBootswatchを試してみる事ができます。
http://www.bootstrapcdn.com/


```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>最速Bootswatch</title>
  <!-- Yeti を入れてみる-->
  <link href="//netdna.bootstrapcdn.com/bootswatch/3.1.0/yeti/bootstrap.min.css" rel="stylesheet">
  <!-- Bootstrapのjavascript-->
  <script src="//netdna.bootstrapcdn.com/bootstrap/3.1.0/js/bootstrap.min.js"></script>
</head>
<body>
  ....
```

テーマは一覧から選びます。
http://www.bootstrapcdn.com/#bootswatch_tab

Bootswatchの各テーマからlinkタグをコピペして利用できるようになっているので、非常に簡単です。
Chromeが持ってるApplication Cacheを一覧表示／削除する方法


## 一覧を表示する

chromeのアドレスバーに、以下URIを入力してEnter。

```
chrome://appcache-internals/
```

するとApplication Cacheの一覧が表示される。

`View Entries`リンクをクリックすると、キャッシュされている画像ファイルなどのリストが表示できる。

## 削除する

各キャッシュごとに、`Remove`リンクがあるので、それをクリックすると削除できる。

- - -
> Blog URL : http://www.utano.jp/ (Syntax Error.)
RubyのXML-RPCを利用してFC2ブログに投稿するサンプル


XML-RPCの利用には特にgemは必要ありません。
今回はsinatraを使って、webアプリからAPI経由でFC2に投稿するサンプルを作ってみました。

```ruby:main.rb
# encoding: utf-8
require 'sinatra'
require 'xmlrpc/client'

get '/fc2/new' do
  erb :new
end

post '/fc2/create' do

  #FC2ブログのエンドポイント
  client = XMLRPC::Client.new2('http://blog.fc2.com/xmlrpc.php')
  #HTTPを圧縮しない
  client.http_header_extra = {'accept-encoding' => 'identity'}

  #ブログID,パスワード、コンテンツ
  blog_id = 'blog_id'
  password = 'password' 
  contents = {
    'title' => 'test',
    'description' => 'test post'
  }

  begin
    #APIリクエスト(新規投稿)
    client.call('metaWeblog.newPost', '', blog_id, password, contents, 1)
  rescue XMLRPC::FaultException => e
    p e.faultCode
    p e.faultString
  end

end
```

新規投稿時は、metaWeblog.newPostというパラメータでコールしてやるといいです。
PHPによるサンプルやその他の命令については以下に詳しく紹介されています。

http://nekoriki.net/83

また、XML-RPCクライアントのHTTP圧縮によるエラーの回避については下記を参考にさせていただきました。

http://uisteven.blog.fc2.com/blog-entry-44.html
MacOSでのvagrant導入と仮想環境接続方法

こんにちは、初めて投稿します。
今後、覚えたことを時々投稿していきます。

#vagrantを導入するにあたっての手順
1.VirtualBoxをインストールする
2.vagrantのインストールする
3.vagrantの設定

#virtualBoxのインストール
virtualBoxのダウンロードサイト
https://www.virtualbox.org/wiki/Downloads

![virtual.png](https://qiita-image-store.s3.amazonaws.com/0/34911/e850b28b-9bc5-b006-afc4-5abbc4fcc959.png)

赤い四角で囲ってあるリンクからダウンロードする。

#vagrantのインストール
vagrantのダウンロードサイト
http://www.vagrantup.com/downloads.html

![vagrant.png](https://qiita-image-store.s3.amazonaws.com/0/34911/f06e1b49-6018-0114-1eaf-45a209b574f6.png)

赤い四角で囲ってあるリンクからダウンロードする。

#vagrantの設定

上記二つをダウンロードしたら、vagrantの設定を行う。

## 1.vagrantのディレクトリを設定する

vagrantを保存するディレクトリを作成しておく(分かりやすく$HOMEに作成しました)

```bash
# ディレクトリを作成する
$ mkdir cent
# そのディレクトリ二位どうする
$ cd cent
```

## 2.vagrantで使用するboxを追加する

vagrantにLinuxのデータを追加する。(今回はCentOSを入れます)

vagrantに追加するOS情報が記されているサイトです。
http://www.vagrantbox.es/

```bash
# 基本的なBoxを追加するときの構成
$ vagrant box add {title} {url}
```

こちらは、titleとboxのURLを設定したとき例

```bash
$ vagrant box add centOS https://github.com/2creatives/vagrant-centos/releases/download/v0.1.0/centos64-x86_64-20131030.box
```

## 3.vagrantの仮想マシンを設定

vagrantの仮想マシンの設置構成

```bash
$ vagrant init {title}
$ vagrant up
```

設置例

```bash
$ vagrant init centOS
$ vagrant up
```

## 4.vagrantで設定した仮想マシンに接続

仮想マシンに接続します。

接続するのはsshと入力するだけで大丈夫です。

```bash
$ vagrant ssh
```

![スクリーンショット 2014-02-05 10.22.52.png](https://qiita-image-store.s3.amazonaws.com/0/34911/fb25d0b4-43b2-dada-50a6-de626fb2e6c3.png)

↑
何の異常もなく完了して[vagrant@vagrant-{title} ~]というかたちになれば完了です!!

## 補足.vagrantのコマンドとvagrantで設定した仮想マシンをrootで入る方法

vagrantを起動するコマンド

```bash
$ vagrant up
```

vagrantが起動しているかどうかのコマンド

```bash
$ vagrant status
```

vagrantの終了コマンド

```bash
$ vagrant halt
```

vagrantでのroot権限での入り方

```bash
$ su -
password:
```
↑
初期のパスワードはユーザー名になっていると思います。
後で変えた方が安全かと思います。

以上です。ありがとうございました。
【mysql】文字列関連の関数

##文字列結合

```mysql:concatの例
select concat(last_name,' ',first_name) from users;
```
* 備考1

oracleの||は使えないので注意。
ただし、SQLモードを変更すれば||も使用できる。SQLモードの変更方法はコメント参照。

* 備考2

concatのパラメータにひとつでもnullがある場合、戻り値はnullになってしまう。対策としてはifnullを併用する。

```mysql:パラメータにnullが存在する場合
select concat(ifnull(last_name,""),' ',ifnull(first_name,"")) from users;
```

参考：[nullを含むフィールドのconcat](http://www.happyquality.com/2009/03/16/877.htm)


##置換
```mysql:replaceの例
select replace(last_name,'11','00') from users;
```
Macのディスクを圧迫するsleepimageは削除可能


Macでディスクフル警告が出てきたので[GrandPerspective](http://grandperspectiv.sourceforge.net/)で調査したところ
`/var/vm/`配下に

```
-rw------T  1 root  wheel   4.0G  2  4 12:34 sleepimage
```
なるものが見つかった。

[MacBook Airを圧迫するsleepimageをどうにかする : まるたけ食堂](http://blog.livedoor.jp/gf8d/archives/52159018.html)

によると気軽に削除可能とのこと。
Nginxからトラッキング用のCookieを設定する

# やりたいこと

- アクセスログからユニークユーザを特定したい。
 - proxyを通してアクセスをさばいているので、複数ユーザ／クライアントのログが丸められてしまっている。
- Cookieベースでユーザを特定できるといいな。
- 専用ツールの利用は無し（あとから考えよう）。
- Apacheではなく、Nginxを使いたい。
 - かつ、Apacheのmod_usertrackのようなことをしたい。

ログからのトラッキング以外に、現在は[Piwik](http://piwik.org)というOSSのツールも使っています。こちらもとても面白いものなので、いつか簡単にご紹介します！

## Nginxのモジュール対応表

[Nginxのモジュール対応表](http://wiki.nginx.org/ModuleComparisonMatrix)を見てみます。
mod_usertrackに対応するのは、[ngx_http_userid_module](http://nginx.org/en/docs/http/ngx_http_userid_module.html) だそうです。

下記は、nginxの設定例。default.confなどに記載します。

```
user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    # トラッキングIDをログの末尾にくっつける
    log_format app_main  '$remote_addr - $proxy_add_x_forwarded_for - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for" "$uid_got"';

    access_log /var/log/nginx/nginx-access.log  app_main;

    server {
        listen       80;
        server_name  localhost;
        location / {
            root   /usr/share/nginx/html/;
            index  index.html index.htm;
        }

        # トラッキングIDの設定
        userid          on;
        userid_name     app_uid;
        userid_domain   wp1.localhost;
        userid_path     /;
        userid_expires  365d;
    }
}
```

設定内容：

- Cookie名を app_uid にする。
- xxx.app.com に対して適用させる。
- パスは/ (アプリケーションの特性にあわせて、/xxx のほうが良い場合もある) 。
- 期限は365日。

## Cookieの確認

上記の設定で実際にためしてみます。

- NginxはVirtualBox / Vagrantで立ち上げたCentOS（ゲストOS)中で起動。
- ホストOS側の /etc/hosts にwp1.localとしてゲストOSのIPを設定。(Vbox Privateネットワークで、192.168.33のネットワークになっています）
- ホストOS側のFireFoxでアクセス。

![wp-cookie.png](https://qiita-image-store.s3.amazonaws.com/0/27976/d2b5c3f5-a19d-000d-c0fb-673dbc28564c.png "wp-cookie.png")


## ログに出力させてみる
ログには、*$uid_got* で書き出すことができます。
下記は *app_main* という名前でカスタマイズしたログフォーマットの例です。
プロキシ経由でのアクセスが中心なので、以下のように proxy_add ... を指定しています

```
$remote_addr - $proxy_add_x_forwarded_for
```

```
log_format  app_main  '$remote_addr - $proxy_add_x_forwarded_for - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for" "$uid_got"';
```

下記は、実際のログの出力です。

```
192.168.33.1 - 192.168.33.1 - - [05/Feb/2014:06:01:01 +0900] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:26.0) Gecko/20100101 Firefox/26.0" "-" "app_uid=0B21A8C0D851F1523E33BDBF02040303"
```
以上、こんな感じです。
簡易的にiOSアプリで海賊版アプリの動作判別と海賊対策の噺

#簡易的にiOSアプリで海賊版アプリの動作判別と海賊対策の噺
iOSアプリケーションの海賊行為は遡ればiPhoneOS2.0（厳密にはもっと前から存在していましたが）の頃からあります。
当時Installer(Cydiaの前身)で個別にハックしたAppStoreアプリをレポジトリ配布していたのがわりと当初の話だったかと思います。
iOS3あたりからHackulous（海賊版及びツール配布サイト）が登場し、その手法は現在の海賊版アプリの基礎を築きました。
HacklousはiOS5あたりで消滅しましたが、その後もAppcake等の海賊版配布サイトが次々と出現しiOS5の後期には誰もが簡単に海賊版をインストールすることが出来るようになりました。

Hacklousで配布されていたinstallous(海賊版AppStore)はインストールを容易にするガワと肝心のインストールをして起動できるように細工するコアに分かれています。
コアの部分は"AppSync"と言います。
mobilesubstrate(iOS7ではcydissubstrate)上で動作し、未署名（もしくは他者の署名の）アプリをインストールさせる言わばtweakです。

Hacklousが海賊版のアプリの基礎を作ったと書きましたが、実は現在もAppSyncはアップデートされており現状どの海賊版AppStoreもAppsyncを利用しています。

そのため、appsyncが存在しているかどうかを判別することで海賊版がインストール出来る端末かどうかを判定出来ます。
以下がコードです。

```objc
    NSString*appsyncpath = @"/Library/MobileSubstrate/DynamicLibraries/AppSync.dylib";
    if ([[NSFileManager defaultManager] isReadableFileAtPath:appsyncpath]) {
        //検出された時の処理
    }
```

仕組みは簡単でappsyncまでのパスをNSFileManagerで読み取り可能かどうか判定するだけです。
ただし、この手法で強制的にアプリを終了させたりするのは危険です。
なぜなら以下のような問題点が隠れているからです。

#問題点
・当のアプリが正規購入かどうかは加味されない。
・この手法を回避する方法がある。（後述）
・アクセスが禁止されている領域の権限を見ている（規約的に大丈夫？）
・AppSyncを海賊行為以外で利用している人もいる（後述）
・無料アプリではAppSyncを指摘するメリットが全くない。
...etc

##問題点A
この手法を回避する方法がある。
体験談ですが、私のリリースしている夜狐八重奏は上記の手法でAppSyncユーザーを弾いていましたがxconという脱獄対策回避tweakによって無効化されました。
文字通りのイタチごっこになるので、あくまで簡易的な対策ということになります。

脱獄対策回避tweakの例
xcon
break through
tsProtector P

##問題点B
AppSyncを海賊行為以外で利用している人もいます。
iDeviceのファイルアクセスをPCから行う際、もっとも利用されているのがiFunboxですが
iFunboxのapp install機能にはAppSyncが利用されています。
![ifunbox.jpg](https://qiita-image-store.s3.amazonaws.com/0/24979/8817cade-53aa-c4aa-6400-5351ce949d9e.jpeg)
これは自分で用意したipa(ios package application)をAppSyncによってインストールさせる機能です。
また、AppStoreで配布出来なかったアプリを無償でipaで配布している方もいる(iKeyholeTV等)ので一概にAppSyncを利用しているユーザー=悪というわけにもいきません。

#その他の回避策
他にはInfo.plistが改ざんされるのを利用し、Info.plistのファイルサイズを比較する手法や課金での対策ではレシートのUUIDを比較する（わりと強固）方法があります。

残念ながら現状では最強の海賊版対策というものはありませんし、逆にあまりに強固なガードも考えものです。
また、コストをかけるべき場所なのかをよく考える点でもあります。

もしも有益な情報やご指摘ありましたらコメント頂けると嬉しいです。


#あと就活してます！
来年度卒業のピチピチの大学生です。
5年程iOSアプリ作ってきました！
Objective-CとArtemis（マルチプラットフォームゲームエンジン）が扱えます。
是非、気にかけてくださいましたらご連絡下さい！！うんこ！
cromteria☆gmail.com
Google's benchmark lib が便利すぎてやばい


https://github.com/google/benchmark

http://google-opensource.blogspot.jp/2014/01/introducing-benchmark.html

![benchmark-screenshot](http://1.bp.blogspot.com/-wk7hsdYodo8/UtS75FZag6I/AAAAAAAAAks/cQFiCXPbtwk/s1600/image00.png)


関数とかのベンチマークをサポートしてくれるライブラリ.

C++11 機能(より正確には -std=c++0x)を使っているので新しめの C++ コンパイラでないと動きません.

使い方は至って簡単で, ユニットテストのように, ベンチマークで計測したい関数を適当に benchmark::State を引数に取るようにして, マクロで呼び出しの指示を与えます.

```
#include "benchmark/benchmark.h"

static void BM_LongTest(benchmark::State& state) {
  double tracker = 0.0;
  while (state.KeepRunning())
  for (int i = 0; i < state.range_x(); ++i)
    tracker += i;
  CHECK(tracker != 0.0);
}
BENCHMARK(BM_LongTest)->Range(1<<16,1<<28);

int
main(
  int argc,
  const char** argv)
{
  benchmark::Initialize(&argc, argv);

  benchmark::RunSpecifiedBenchmarks();
  return EXIT_SUCCESS;

}
```

これだと Range により, 2^16 ~ 2^28 の間でよろしく値のパターンを振って MB_LongTest を呼び出してくれます.

出力は以下のようにしてこれもよろしくレポートしてくれます.

```
Reading /proc/self/cputime_ns failed. Using getrusage().
Benchmarking on 1 X 2297.19 MHz CPU
2014/02/05-03:06:36
DEBUG: Benchmark          Time(ns)    CPU(ns) Iterations
--------------------------------------------------------
DEBUG: BM_LongTest/64k      219496     221310       2268                                  
DEBUG: BM_LongTest/256k     871541     880878        574                                  
DEBUG: BM_LongTest/2M      7076118    7158361         72                                  
DEBUG: BM_LongTest/16M    62749889   63467500          8                                  
DEBUG: BM_LongTest/128M  894819972  902404000          1                                  
DEBUG: BM_LongTest/256M 1793205019 1809572000          1  
```

特定の値を指定して関数を呼び出したり(Arg), スレッドの数を指定して関数を呼び出したり(Threads)と出来て, 大体のことはできますね. ストレステストやランダムテストにも使えそうです!

## 名前がよくない

しかしネーミングセンスは残念ですね… これだと混乱してしまいますし検索でもなかなか引っかからないですね.
vagrantで起動したCentOS上のMySQLに、ローカルのOSから接続する方法

vagrantで起動したCentOS上のMySQLに、ローカルのOSから接続する方法。

## ポートフォワードの場合

ローカルのポートを、仮想環境のMySQLのポートにポートフォワード。

```:Vagrantfile
  config.vm.network :forwarded_port, guest: 3306, host: 8806
```

```:接続情報
host: localhost
port: 8806
...
```

## SSHトンネルの場合

```:接続情報
// SSHトンネル
host: localhost
port: 2222
user: vagrant
pass: 無し
秘密鍵: /path/to/insecure_private_key

// MySQL
host: 10.0.2.15
port: 3306
...
```

SSHトンネルの場合、my.cnfで接続元のアドレスを制限する設定があると、MySQLのホスト名で全く同じアドレスを指定しないと接続できない（？）

```:my.cnf
bind-address            = 10.0.2.15
```

こうなっていたら、`localhost` `127.0.0.1` では繋がらず、`10.0.2.15`をホスト名に指定しなければ繋がらない（？）
AWSのamiを一覧表示する

AWSのAMIを一覧表示します。

<pre>
#! /usr/bin/env python
#-*- coding: utf-8 -*-
import urllib2
import argparse
from BeautifulSoup import BeautifulSoup

def main():
    fp = urllib2.urlopen('http://cloud-images.ubuntu.com/precise/current/')
    soup = BeautifulSoup(fp)
    table = soup.find('table')
    rows = table.findAll('tr')
    for row in rows[1:]: # first is header
        tds = row.findAll('td')
        region = tds[0].text
        arch = tds[1].text
        store = tds[2].text
        ami = tds[3].text.replace('Launch', '')
        print('{} {} {} {}'.format(region, arch, store, ami))
if __name__ == '__main__':
    main()
</pre>
Ruby on Railsのtrue/false まとめ


|             | xxx.nil? | xxx.empty? | xxx.blank? | xxx.present? | if xxx |
|------------:|:--------:|:----------:|:----------:|:------------:|:------:|
| nil         | True     | **Error**  | True       | False        | False  |
| 0           | False    | **Error**  | False      | True         | True   |
| 1           | False    | **Error**  | False      | True         | True   |
| ""          | False    | True       | True       | False        | True   |
| " "         | False    | False      | True       | False        | True   |
| "word"      | False    | False      | False      | True         | True   |
| []          | False    | True       | True       | False        | True   |
| [nil]       | False    | False      | False      | True         | True   |
| [0]         | False    | False      | False      | True         | True   |
| [""]        | False    | False      | False      | True         | True   |
| [" "]       | False    | False      | False      | True         | True   |
| ["word"]    | False    | False      | False      | True         | True   |
| {}          | False    | True       | True       | False        | True   |
| {:ni => nil}| False    | False      | False      | True         | True   |
| {:ze => 0}  | False    | False      | False      | True         | True   |
| {:bl => ""} | False    | False      | False      | True         | True   |
| {:sp => " "}| False    | False      | False      | True         | True   |
| {:wo => "word"| False  | False      | False      | True         | True   |
| | nilかどうかだけ | 入れ物の中身が入っているか入っていないか。スペースは""の中にスペースが入っているのでfalse。[nil][""]も、nilや空の文字列が入っているのでfalse。| nilかどうか（nil?）＋空かどうか（empty?）＋スペースだけかどうか | 単純にblank?の反対。スペースはあるとはみなされない。 | 単純にnil?の反対。なにかしらの入力があればTRUE。 |
Linqで快適な生活を 其の2

Linqには、二つの配列の中身を走査して、操作するZip関数があります。これをAggregate関数と合わせると、リスト内のdouble配列の中身をindex別に足し合わせることが簡単にできます。

```C#
var doubleArrayList = new List<double[]>() { 
new double[3] { 1, 2, 3 },
new double[3] { 1, 1, 1 },
new double[3] { 10, 31, 41 } 
};

var zippedList = doubleArrayList.Aggregate((total, calculatingArray) => total.Zip(calculatingArray, (valOfTotal, valOfCalc) => valOfTotal + valOfCalc).ToArray());
```

zippedListは double[3] {12, 34, 45}　となります。 AggregateとZipのコンビネーションは他にも色々とできそうですね！

快適、快適。
「次のモジュールは最適化を有効にされて、またはデバッグ情報なしでビルドされました」の解決策

Visual Studio C# 2010 Expressにおいて、以下のエラーに悩まされました。

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

次のモジュールは最適化を有効にされて、またはデバッグ情報なしでビルドされました。

C:\Users\username\projectName\projectName\bin\Release\projectName.exe

このモジュールをデバッグするには、プロジェクトのビルド構成をデバッグ モードに変更します。このメッセージを非表示にするには、デバッグ オプションの [起動時にユーザー コードが見つからないとき警告] の設定を無効にします。

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
パスを見て、ふと「なんでReleaseなんだ？」と思ったため、構成マネージャを開いてビルドの構成を確認すると、「アクティブソリューション構成」がDebugになっているのに対し、リストの項目にあるプロジェクトの「構成」はReleaseになっていました。
これをDebugにすると、無事に解決しました。ビルドは色々と難しいですね。

一応、この問題に関する質問はMSDN（http://social.msdn.microsoft.com/Forums/ja-JP/14d360fb-f66c-49b0-95a9-134d7a68cae5 )にもあったそうですが、原因は色々あるのでしょう。
internalクラスのinternalメソッド

C#には[internal](http://msdn.microsoft.com/ja-jp/library/7c5ka91b.aspx)という、「アセンブリが同じクラスのみから参照できる」という便利なアクセス修飾子があります。あるライブラリを書く際に気になったのですが、internalクラスの中のメソッドをpublicで宣言するべきなのか、internalで宣言するべきなのかで迷いました。どちらでも参照のスコープは同じですからね。

しかし、結論としては、publicが良いみたいです。

理由としては、宣言しているアセンブリ以外でも公開したいという場合に、クラスをpublicに変更すれば、メソッドがライブラリの外にも公開されるようになるからです。もしメソッドがinternalですと、いちいちinternalをpublicなどに変更しなければなりません。永久にライブラリの外へ公開したくないメソッドであるときのみ、internalにすればよいでしょう。

* stack over flowに同様の答えがありました。=> [URL](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCwQFjAA&url=http%3A%2F%2Fstackoverflow.com%2Fquestions%2F711361%2Fpublic-vs-internal-methods-on-an-internal-class&ei=FIe5UoeAM4-HkgWn54H4AQ&usg=AFQjCNHEivGxSPlhXfuEmwzCzK8kgsOkIg&sig2=rK36CDz_WwSLg9SjIhqXMw&bvm=bv.58187178,d.dGI)
pythonにswitchはないけれど

追記（2014/2/6）
* pythonのバージョンは 2.7.5を用いました。python 3.Xでは確認しておりません。
* リスト型より辞書やセットの方が高速だと勧めて頂きましたので、修正致しました。
***
僕はswitch文が好きです。プログラムの見通しが断然良くなりますし、頭が整理されます。しかし、pythonにはswitch文は存在しません。条件分岐にはif, elif などを使うのがメジャーで、例えば以下のようなswitch文がある場合、

```py
# javaなどで用いられる一般的なswitch文
switch(str){
case 'a':
case 'b':
    print('a,b'); break;
case 'c': 
    print('c'); break;
}
```

pythonでは、if, elif を使って以下のようになります。

```py
if str == 'a' or str == 'b':
    print('a,b')
elif str == 'c':
    print('c')
```

最初のif 文の中で、 str == を 2回書くのは面倒くさいです。特に、これが2個以上であったり、変数名が長かったりすると、if文が長くなり、プログラムの可読性が落ちます。そこで、

```py
if str in {'a', 'b'}:
    print('a, b')
elif str == 'c':
    print('c')
```

とすると、見通しが良くなります。python の in が便利であることを再確認させられますね。
構造体をasによる型変換を行う

C#のキャストで as ってありますよね。もしうまく型が変換出来なかった場合は、例外を出すのではなく、nullになるという優れものですが、例えばキャストしたい型（例：UserInfo）が構造体のようなNull非許容型だったりすると、

```C#
var userInfo = obj as UserInfo;
```
とすることが出来ません。なぜなら、UserInfoは構造体、つまり Null非許容型であるために、nullを返すことが出来ないからです。
もし、Null非許容型で asを使いたい場合は、

```C#
var nullableUserInfo = obj as UserInfo?;
```
というように、?を型の名前の最後に付けて、Null許容型にしましょう。その後、

```C#
if(nullableUserInfo != null)
	var userInfo = nullableUserInfo.Value;
```
とnullチェックをした後に、Valueを取得して、Null非許容型に戻すこともできます。
この方法はパラメータ引数をするときにも使えます。

```C#
void method(UserInfo? defaultInfo = null){
	if(defaultInfo != null)
		do_something
}
```
[VS2010]Resourcesに設定した画像が実行時に表示されない時は

Resourcesに登録した画像について、デザイナーでは画像が正しく表示されているのに、実行時には表示されない時は、Resourcesに登録した画像のプロパティを確認しましょう。ビルドアクションの設定を誤ると実行時に表示されません。

参考URL
http://mithrilworks.jp/others/program/xaml/resource.html
ActiveRecordのfind_by_sqlでテーブル名を変えるようなSQLクエリを書く場合の注意点

railsのActiveRecordでfind_by_sqlというメソッドがあるのですが、これで例えば

```ruby
models = Model.find_by_sql(“select t.id, t.name from model as t”) 
```

というようなクエリを書いた場合、返ってくる Modelのattributesは id や nameではなく、t.id, t.nameとなります。よって、

p models[0].attributes
とすると、

```ruby
{“t.id”=>10, “t.name”=>”hoge”}
```

と表示されます。これで結構悩まされたので、注意ですね。
Linqで快適な生活を

LinqにはSelectやAllなど便利なメソッドがいくつもあるのですが、中でも自分のお気に入りはAggregateです。例えば、リスト内で最大の値を持つ要素のIndexを知りたい場合は以下のように書くことが出来ます。

```c#
var l = new List<int>() {3, 1, 5, 4, 2};
var maxIdx = l.Select((val, idx) => new { V = val, I = Idx }).Aggregate((max, working) => (max.V > working.V) ? max : working).I;
// maxIdx は 2となる
```

上記の例では、OrderByDescendingを使った方が分かりやすいかもしれませんが、もっと複雑な条件にも対応できるのがAggregateの良いところですね。Dictionaryなどにも対応できるので、今日も快適な生活を送れます。また、途中の無名クラスへのselectも常套手段だったりします。