OmniAICreator/Qiita-1.07M huggingface dataset:
WordPress: WPが用意したjQueryを読み込まない【functions.php】


```php:functions.php
/**
 * WPが用意したjQueryを読み込まない
 */
add_action('wp_print_scripts', 'deregister_jquery');

function deregister_jquery()
{
  if(!is_admin())
  {
    wp_deregister_script('jquery');
  }
}
```
WordPress: feedにカスタム投稿タイプを追加する【functions.php】


★のとこにfeedに追加したいカスタム投稿タイプを追加する

```php:functions.php
/**
 * feedにカスタム投稿タイプを追加する
 */
add_filter('pre_get_posts', 'add_custom_post_type_feed');

function add_custom_post_type_feed($query)
{
  if (is_feed())
  {
    $post_type = $query->get('post_type');
    if (empty($post_type))
    {
      $query->set('post_type', array('post', 'hoge1-posts', 'hoge2-posts', 'note-posts')); // ★
    }
    return $query;
  }
}
```
WordPress: メインクエリの内容を変更（カスタム投稿タイプを追加）する【functions.php】


★のとこにメインクエリに追加したいカスタム投稿タイプを追加する

```php:functions.php
/**
 * メインクエリの内容を変更（カスタム投稿タイプを追加）する
 */
add_action('pre_get_posts', 'modify_main_queries');

function modify_main_queries($query)
{
  if (!is_admin() && $query->is_main_query())
  {
    if ($query->is_home())
    {
      $query->set('post_type', array('hoge1-posts', 'hoge2-posts')); // ★
    }
  }
}
```
WordPress: 投稿時のimageタグから要らない記述を消す【functions.php】


↓title="" class="" height="" を消してみる

```php:functions.php
/**
 * 投稿時のimageタグから要らない記述を消す
 */
add_filter('get_image_tag', 'remove_img_attr', 10, 6);
add_filter('post_thumbnail_html', 'remove_img_attr', 10);

function remove_img_attr($html)
{
  $html = preg_replace('/title=[\'"]([^\'"]+)[\'"]/i', '', $html);
  $html = preg_replace('/ class=[\'"]([^\'"]+)[\'"]/i', '', $html);
  $html = preg_replace('/(height)="\d*"\s/', '', $html);
  return $html;
}
```
Rails4で自動EXPLAINが消えた理由

Rails3.2で導入された自動EXPLAINがRails4で早くも削除されていました。

- [remove AR auto-explain](https://github.com/rails/rails/commit/d3688e02ca52c0b72d3092e8498da51e06b7fc58)

理由は大きく分けて2つあるようです。

- ほとんど使われていない
- アセットパイプラインが壊れることがある - [cannot compile assets including scss files in production environment](https://github.com/rails/rails/issues/9385)

自動EXPLAINは消えましたが `ActiveRecord::Relation#explain` は残っているので問題なく使えるらしいです。
fluentdでapacheのアクセスログをmongoDBにつめる方法


fluentd(td-agent)を使ってapacheのアクセスログを動的にmongoDBに登録していく。
WEBアプリとログ集計のサーバー２台構成。

送信側サーバー：
　appacheのアクセスログを出力しているサーバー。

受信側サーバー：
　mongoDBでログを集計するサーバー。

#送信側サーバー準備
##td-agentのインストール

yumでインストールするためにURLを追加する。
その後でyumでインストールを行う。


```
sudo vi /etc/yum.repos.d/td.repo
```

```td.repo
[treasuredata]name=TreasureDatabaseurl=http://packages.treasure-data.com/redhat/$basearchgpgcheck=0
```

```
sudo yum install -y td-agent
```

##td-agentの設定
td-agent.confを書き換える。
※元ある内容は全て消して書き換えてしまってよい。

```
vi /etc/td-agent/td-agent.conf
```

```td-agent.conf
<source>  type tail  format apache  path /var/log/httpd/httpd_access_log  tag mongo.apache</source><match mongo.apache>  type forward  flush_interval 10s  <server>    host ホスト名    port 24224  </server></match>```

#受信サーバー準備
##fluentdのインストール
gemからfluentdをインストールする。
※受信サーバーにはruby1.9以上が入っていることが前提。

```
gem install fluentdgem install bson_extgem install fluent-plugin-mongo
```

##mongoDBのインストール
yumでインストールするためにURLを追加する。
その後でyumでインストールを行う。

```
vi /etc/yum.repos.d/10gen.repo
```

```10gen.repo
[10gen]name=10gen Repositorybaseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64gpgcheck=0enabled=1
```

```
yum install mongo-10gen-server mongo-10gen
```

#ログ収集の開始
##mongoDBの起動

受信側サーバーでmongoDBを起動する。

```
/etc/init.d/mongod start
```

受信側サーバーでfluentdを起動する。

```
fluentd -c /etc/fluentd/fluent.conf -vv -o /var/log/fluentd/fluentd.log &
```

送信側サーバーでtd-agentを起動する。

```
sudo /etc/init.d/td-agent start
```

#動作確認

送信側サーバーでアクセスログを手動で書き込む。

```
sudo vi /var/log/httpd/httpd_access_log
```

```httpd_access_log
127.0.0.1 - - [10/Jun/2013:20:30:39 +0900] "GET /favicon.ico HTTP/1.1" 404 288 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"127.0.0.1 - - [10/Jun/2013:20:46:07 +0900] "GET / HTTP/1.1" 403 5044 "-" "Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0"127.0.0.1 - - [10/Jun/2013:20:46:07 +0900] "GET /favicon.ico HTTP/1.1" 404 288 "-" "Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0"
```

受信側サーバーでmongoDBの内容を確認する。

```
mongo httpd
>db.accesslog.count()
3
>db.accesslog.find

```

mongoDBにアクセスログの内容が確認できたら設定完了。

#おまけ
##アクセスログが受信側サーバーに登録されていないとき
td-agentのログを確認する。

```
tail -f -n 100 /var/log/td-agent/td-agent.log
```

これでエラーを確認し対応する。
HTML5・Canvasを使って画像縮小したいならcanvasResizeがいい感じ

http://qiita.com/ms2sato/items/c3cb0075138ade865bc2
にて困っていたら@kuboonさんがフォローくれました。ありがとうございます！

https://github.com/gokercebeci/canvasResize
こいつが便利なのはクロスブラウザをそれなりにしてくれている事と、MobileSafariでのバグ対応を入れてくれている事だと思います。
http://gokercebeci.com/dev/canvasresize
で試す事も出来ます。

ザックリ下記のように使える。

```html
        <script src="js/lib/binaryajax.js"></script>
        <script src="js/lib/exif.js"></script>
        <script src="js/lib/canvasResize.js"></script>
```

しておいて例えば下記。

```js
var file = //fileインスタンス
canvasResize(file, {
            width: 280,
            height: 280,
            crop: false,
            quality: 100,
            callback: function(data, width, height) {
                alert('縮小終わり');
            }
        });
    }
```
jQuery で checked をつけたり外したり


`.prop()` を使う。
第二引き数は `true`（チェックをつける）, `false` （チェックを外す）の他に関数を渡すことができる。
関数の場合はインデックスと現在の選択状態が渡される。

````
$("input[type='checkbox']").prop("checked", function(i, val) {
  return !val;
});
````

注意: チェックを外す時に `.removeProp()` を使わない！
一度 `.removeProp()` しちゃうと、二度とチェックをつけることができなくなる。
Chrome / Safariでページ内スクロールしたときの不要な枠線を消す方法

```html:html
<a href="#hoge">ほげ</a>
<a href="#foo">ふー</a>
：
：
<div class="content" id="hoge">
：
：
</div>
<div class="content" id="foo">
：
：
</div>

```

のようにページ内リンクのスクロールで、Chrome / Safariの場合、不要な枠線が出てしまう場合は、

```JavaScript:JavaScript
$('.content').on('focus', function(e) {
    $(this).trigger('blur');
});
```

とすれば解除できる。

もっとスマートな方法はありそうなので、ご指摘いただければ嬉しいです。
scpでmacからupload/download

CyberDackを使ってたけど頻繁にフリーズするのでscpコマンドを使う
私用頻度高いのによく忘れるのでメモ

download
`scp hostuser@host:/path/to/hostfolder /path/to/localfile`

upload
`scp localfile host@host:/path/to/hostfolder`
Rでpdfに好きな日本語フォントを使用する

Rで手っ取り早く日本語フォントを使用するにはJapan1GothicBBB等を指定しますが、
好きな日本語フォントでPDF出力したくてハマったので整理しました。

# 準備

``` r:R
install.packages("ggplot2")
install.packages("Cairo")

# extrafontライブラリでフォントの管理を簡略化します。
install.packages("extrafont")
require(extrafont)

# システムフォントをRのライブラリ配下にインポートします(十数分かかります。)
font_import()

# 今のセッションで使えるようにフォントをロードします。
loadfonts(quiet = TRUE)

```

# 実行

## Windowsの場合

Cairoライブラリ(とpar関数？)を使います。

*改めて実施してみたらpar関数無しでも日本語出力出来ました*

``` r:R
require(extrafont)
require(ggplot2)
require(Cairo)

loadfonts(quiet=TRUE)

# plot作成
gg <- ggplot(mtcars,aes(x=wt,y=mpg)) + geom_point()
gg <- gg + ggtitle("車の重さと燃費の関係")
gg <- gg + xlab("重さ") + ylab("燃費")
gg <- gg + theme(text = element_text(family="Rounded M+ 2c light"))
gg <- gg + theme(plot.title = element_text(
                 face = "bold",family="Rounded M+ 2c bold"))

# PDF出力(A4横)
CairoPDF(paper="a4r",width=11.69,height=8.27)
# par(family = "Rounded M+ 2c light") # 不要？
print(gg)
dev.off()
```

## Macの場合

Cairoライブラリを使い、CairoFontsでフォントを指定します
XQuartsのインストールが必要です。

``` r:R
require(extrafont)
require(ggplot2)
require(Cairo)

loadfonts(quiet=TRUE)

CairoFonts(regular = "Rounded M+ 2c light",bold="Rounded M+ 2c bold")

# plot作成
gg <- ggplot(mtcars,aes(x=wt,y=mpg)) + geom_point()
gg <- gg + ggtitle("車の重さと燃費の関係")
gg <- gg + xlab("重さ") + ylab("燃費")
gg <- gg + theme(plot.title = element_text(face="bold"))

# PDF出力(A4横)
CairoPDF(paper="a4r",width=11.69,height=8.27)
print(gg)
dev.off()
```
AlloyでiPhoneとiPadで処理を分ける記述


## View
```
platform="ios" formFactor="handheld"
platform="ios" formFactor="tablet"
```

## tss
```
[platform=ios formFactor=handheld]
[platform=ios formFactor=tablet]
```

**ちなみにAndroidは**

## View
```
platform="android"
```
## tss
```
 [platform=android]
```
php5.4以降は連想配列の定義がラクになった

php5.4以降は連想配列の表記が少しラクになりましたよ。
"array"とタイプする必要がなくなったので、タイプ量が減ります。

```php:array.php
<?

/**
 * 古い連想配列表現方法を使った多重配列定義例
 *
 */
$array_old = array(
    array('index' => 1,
          array('hoge' => 'hohoho', 'fuga' => 'fufufu'),
          array('updated_at' => time()),
        ),
    array('index' => 20,
          array('hoge' => 'gegege', 'fuga' => 'gagaga'),
          array('updated_at' => time()),
        ),
    array('index' => 300,
          array('hoge' => 'ohohoh', 'fuga' => 'ufufuf'),
          array('updated_at' => time()),
        ),
    array('index' => 4000,
          array('hoge' => 'egegeg', 'fuga' => 'egegeg'),
          array('updated_at' => time()),
        ),
    );

/**
 * php5.4から採用された新しい連想配列表現方法を使った多重配列定義例
 *
 */
$array_new = [
    ['index' => 1,
     ['hoge' => 'hohoho', 'fuga' => 'fufufu'],
     ['updated_at' => time()],
        ],
    ['index' => 20,
     ['hoge' => 'gegege', 'fuga' => 'gagaga'],
     ['updated_at' => time()],
        ],
    ['index' => 300,
     ['hoge' => 'ohohoh', 'fuga' => 'ufufuf'],
     ['updated_at' => time()],
        ],
    ['index' => 4000,
     ['hoge' => 'egegeg', 'fuga' => 'egegeg'],
     ['updated_at' => time()],
        ],
    ];
}
AppCodeを入れたら最初にやること

## AppCode

今更ですが [AppCode](http://www.jetbrains.com/objc/) を使い始めました。
AppCode というのは、Xcode のダメなところを良くした感じの IDE です。
たとえば、クイックフィックスやコード補完機能が充実していたり、いい感じのデバッガが搭載されてたり、vim や emacs ライクなキーバインドが使えたりと色々なメリットがあります。

Interface Builder が使えないので、そこは Xcode を使わなければならないのですが、片方 (Xcode/AppCode) で編集すると即座にもう片方に反映されるのであまり困っていません。

ライセンス料が99ドル/年必要ですが、30日間は無料で体験できますし、また AppCode で作ったプロジェクトはそのまま Xcode でも問題なく読み込むことができるので、試しに使ってみることをおすすめします。

AppCode は使い始めたばかりなのですが、とりあえず最初にいくつか設定を行ったのでメモしておきます（他にもやったことがあったら適時追加しておきます）。

## 行番号を表示する
Preferences で Editor > Appearance > Show line numbers

## キャレットの位置の設定を変える
デフォルトの設定だと、クリックした場所にキャレットが移動してしまいます(フリーカーソルって言うのかな？)。
これはこれで便利なのかもしれませんが、あまり一般的な挙動ではないのでとても戸惑います。

Preferences > Editor > Virtual Space > Allow placement of caret after end of line

のチェックを外すとよくある感じの挙動になります。

## 行末の余分なスペースを削除する
Preferences > Editor > Strip trailing spaces on Save

で設定を変えられます。デフォルトは "Modified Lines" ですが、お好みで "All" でも良いと思います（オフにしたいときは "None" ）。

## Bitbucket のプラグインを入れる
デフォルトの状態では Bitbucket との連携ができないのですが、私は Bitbucket も使っているので不便です。

Preferences > Browse repositiories を開いて、検索窓に "bitbucket" と入力すると、 "Bitbucket VCS Integration" が表示されるはずです。ダブルクリックするとインストールできます。

インストール後はIDEの再起動が必要です。再起動を促すダイアログが表示されるのでそれに従いましょう。

## Pixate の設定をする
私は Pixate を使っているのですが、AppCodeからでは設定できません。
他の Framework もそうなのですが、このあたりの設定はすべて Xcode から行います。
Xcode でアプリの設定を行えば、適時AppCode側にも反映されるので、いつものように Xcode を使えば OK です。
>fname 2>&1がこの順番でないといけない理由

標準出力と標準エラー出力を両方とも同じファイルにリダイレクトする場合、次のように書きます。

```zsh
..(何かのコマンド).. > fname 2>&1  
```

これを間違えて逆にしてしまうと、標準エラー出力の内容が標準出力され（つまりターミナルに普通に表示される）、標準出力がファイルにリダイレクトされます。

```zsh
... 2>&1 > fname
```

なかなか覚え難いんですが、理屈がわかってしまえば当然の結果です。rubyで言えばこういうことです。

1つ目の場合、先に標準出力を外部ファイルを参照するように変更してから、標準エラー出力にもそれをコピーします。

```rb
# ... > fname 2>&1
$stdout = File.open('fname', 'w')
$stderr = $stdout
# $stderr と $stdout は同じものを指している
```

2つ目の場合、標準エラー出力を標準出力が参照している内容に向けてから、標準出力の方向を変更します。

```rb
# ... 2>&1 > fname
$stderr = $stdout
$stdout = File.open('fname', 'w')
# $stderr と $stdout は別のものを指している
```
git-svnでsvnから緩やかにgitに移行しよう(基本手順編)


## まずはインストール
環境はOS:CentOS5.5。svnはすでにインストールされているものとします。

    $vim /etc/yum.repos.d/rpmforge.repo
    [rpmforge]
    name = Red Hat Enterprise $releasever - RPMforge.net - dag
    mirrorlist = http://apt.sw.be/redhat/el5/en/mirrors-rpmforge
    enabled = 0
    gpgcheck = 0

    $yum install git git-svn --enablerepo=rpmforge
    $git svn --version //確認

## 既存svnリポジトリをgit化する
    $mkdir 作業ディレクトリ
    $cd 作業ディレクトリ
    $git init
    $git svn clone -s --prefix svn/ [svnリポジトリ（trunkはつけない）] [clone後ディレクトリ名]
    $cd cloneしたディレクトリ
    $git svn show-ignore >> .git/info/exclude

＊(余談)もしすでにaddしてるものがある場合や.gitignoreが効かないそんなときは..

    $git add --cached file名

さらにcommitまでしてた場合

    $git add --cached file名
    $git commit -m "取り消し" file名

これでOK。

## 開発のフロー
    $git checkout -b topic-branch名
    $git add .
    $git commit -m "コメント"
して開発する。

#### もしsvnのリモートリポジトリtrunkから更新内容を取り込みたいなら
     $git svn rebase

もしくは

    $git svn fetch
    $git checkout trunk //確認
    $git checkout master
    $git merge trunk

#### リモートリポジトリに変更を反映したい場合
    $git checkout master
    $git merge topic-branch名
    $git svn dcommit

#### もしtopicブランチを削除したいなら
    $git branch -d topic-branch名
改行を含まない長い文字列をhere-documentで書くことができる

`<<` を使うと **here-document** を使って長い文字列を標準入力に渡すことができます。多くの場合改行を含む文字列を渡すのに使います。

```zsh
$ cat << EOF
heredoc> hello
heredoc> world
heredoc> EOF
hello
world
```

上記の例でいうところの `EOF` の位置に相当する文字列がシングルクォートもしくはダブルクォートに囲まれていない場合、here-document内では変数が展開されることを知っている人も多いと思いますが、改行文字の前に `\` を置くことで改行文字を消すこともできます。異様に長い改行なしの文字列を渡したいときに使えそうです。

```zsh
$ foo=bar
$ cat << EOF
heredoc> hello \
heredoc> $foo
heredoc> EOF
hello bar
$ cat << 'EOF'  # シングルクォートで囲んである
heredoc> hello \
heredoc> $foo
heredoc> EOF
hello \
$foo
```

ちなみに、そんなに長くない改行なしの文字列を標準入力に渡したい場合は `<<<` を使って **here-string** として渡すか、素直にパイプで渡した方がいいです。

```zsh
$ cat <<< 'foo bar baz'
foo bar baz
$ echo foo bar baz | cat
foo bar baz
```
CLOBBER無効時にリダイレクションでファイルを上書きするには>|を使う

シェルで `>` を使うと標準出力をファイルに書き込めますが、意図せずファイルを上書きしてしまう危険があるので、これができないようにしている人も多いのではないでしょうか。

```.zshrc
setopt noclobber
```

これを設定していると既にファイルが存在する場合エラーになります。

```zsh
$ echo foo > hoge
$ ls
. .. hoge
$ echo foo > hoge
zsh: file exists: hoge
```

これはこれで嬉しいのですが、時にはファイルが存在することを理解した上で、あえて上書きしたい場合もあります。そういう場合は `>|` か `>!` を使います。

```zsh
$ ls
. .. hoge
$ echo bar >! hoge
$ cat hoge
bar
```

さらに `>>` でファイルに追記できますが、これもファイルが存在しない場合はエラーが発生してしまいます。

```zsh
$ echo foo >> huga
zsh: no such file or directory: huga
```

ファイルが存在しない場合は新規作成したい場合（clobberが有効な状態のときの `>>` と同じ挙動）にするには先ほどと同様に `>>|` か `>>!` を使います。

```zsh
$ echo foo >>! huga
$ cat huga
foo
```
zgrepで"-h"オプションが効かない

#前置き

##grep、zgrepの"-h"オプションとは
複数のファイルを対象にgrepする時に、検索結果の先頭にマッチしたファイル名を同時に表示するのを抑止する。

##zgrepとは
「圧縮されている可能性のあるファイルで、正規表現の検索をする 」

gzipで圧縮されたファイルもされていないファイルも検索できるので、ローテーションのついでにgzipで圧縮しているログファイルあたりをgrepしたい時に便利。

実はshell scriptで実装されてたりする。

```shell-session
$ which zgrep
/usr/bin/zgrep
$ file /usr/bin/zgrep
/usr/bin/zgrep: POSIX shell script text executable
```


#本題
T/O
ソースはhttps://access.redhat.com/site/solutions/188483

RHEL6(≒CentOS 6)では”-h"オプションが効かない。
RHEL5(≒CentOS 5)では使えるのでハマると厄介そう。

#回避方法
"-h"ではなく"--no-filename"を使う。

```shell-session
$ zgrep foo f1 f2
f1:foo
f2:foo
$ zgrep -h foo f1 f2
f1:foo
f2:foo
$ zgrep --no-filename foo f1 f2
foo
foo
```
gitignore.ioのAPIを使って、Gradleのタスクからgitignoreファイルを作成する


http://gitignore.io/cli を参考にやってみました。

## 作成方法

以下のタスクを *build.gradle* に追加します。

```build.gradle
task createGitIgnore << {
    def target = ['java', 'gradle', 'eclipse', 'intellij'].join(',')
    file('.gitignore').text = new URL("http://gitignore.io/api/$target").text
}
```

次に、以下のコマンドを実行します。

```bash
$ gradle createGitIgnore
```

プロジェクト配下に *.gitignore* が出来ていることを確認して下さい。

## 一覧

一覧を出力する場合、以下のタスクを追加します。

```build.gradle
task showGitIgnoreList << {
    new URL("http://gitignore.io/api/list").text.split(',').each { println it }
}
```
次に、以下のコマンドを実行します。

```bash
$ gradle showGitIgnoreList
```

ズラッと指定できる項目一覧が表示されます。
PHPでHello World

http://d.hatena.ne.jp/Nabetani/20130921

文字列リテラル、数値リテラルを使わずに"Hello World"を出力します。

```php
Hello World
```

PHP開始タグ、終了タグの外側にあるテキストはPHPでは一切処理されず、ただのHTMLとして扱われます。
従って、たったこれだけで"Hello World"が完成!


ああっ、石を投げないで。


まあ、誰かにやられる前に先を取っておかないといけないと思った。
まともな(普通に考えたらまともじゃない)やり方はそのうち考えます。
Vimのオプションのdisplayにlastlineを設定した時の挙動がさっぱりわからなかった


まずhelp.
displayと名前がつくものが多くて，他のがいろいろ引っかかってしまった．
どうせ補完ででるだろうけど，とりあえず「:help 'display'@ja」で見れる．

>lastline : 
>これが含まれると、ウィンドウの最後の行ができる限りまで表示される。
>含まれないと、最後の行が収まりきらないならその行は "@" と表示される。

と書いてある．
よくわからなかった．

要するに，ウィンドウ全体が
![2013-09-25-18:39:29.png](https://qiita-image-store.s3.amazonaws.com/0/29708/86936af4-1ee9-5421-f2b0-0400a6fabe5b.png)
という状態の時に
ウィンドウ高さを1つ減らすと

lastlineが設定されていない場合
![2013-09-25-18:42:36.png](https://qiita-image-store.s3.amazonaws.com/0/29708/3b1f9f52-79ee-3d58-32e0-13d6f5c13cc7.png)

latlineが設定されている場合
![2013-09-25-18:43:20.png](https://qiita-image-store.s3.amazonaws.com/0/29708/574789da-a9e3-5c54-ae2e-ae2e9a7728b1.png)

になる．
たまたまウィンドウの高さだけれども，画面のスクロールなどでも同じ．
Sublime Text 2 - Preferences.sublime-settings

{
	"close_windows_when_empty": true,
	"color_scheme": "Packages/Solarized Color Scheme/Solarized (light).tmTheme",
	"draw_white_space": "all",
	"fallback_encoding": "Shift-JIS",
	"font_face": "Source Code Pro",
	"font_size": 14.0,
	"highlight_line": true,
	"highlight_modified_tabs": true,
	"ignored_packages":
	[
		"Vintage"
	],
	"indent_guide_options":
	[
		"draw_active"
	],
	"open_files_in_new_window": false,
	"shift_tab_unindent": true,
	"theme": "Soda Light.sublime-theme",
	"trim_trailing_white_space_on_save": true,
	"word_wrap": true
}
logwatchでやってくるメールを止める root宛のメール転送設定 ( 環境構築四苦八苦 4th Day )

ずぅっと前にさくらVPSにRails入れて、PerlやらRubyやらPythonやら入れてほげっと遊んでたのですが、そこに[Logwatch](http://easyramble.com/install-setup-logwatch.html)も入れていた様で、気づくと彼からのメールが止まらない。。。

あれ、どこにインストールしたっけ？てか、インストールしてたよね？`,､('∀`) '`,､？？
ってなったので、もろもろ確認して、メール送信を止めさせます。

```pl
$ yum list installed
logwatch.noarch        7.3.6-49.el6     @base  
```

まず、yumでインストールしていたのはわかりました。

一応、動いてんのか？ってことを知りたい場合は以下のコマンドを打つといいかも。

```pl
# ログを表示
$ logwatch –print
# メールを送る
$ logwatch –mailto example@example.com
```

さて本題。
で、コンフィグファイルどこにあんのよ？ってなったら以下。

```pl
$ locate logwatch.conf
/etc/logwatch/conf/logwatch.conf
/usr/share/logwatch/default.conf/logwatch.conf
```

/usr/share/logwatch/default.conf/logwatch.conf の方が優先的に扱われる様です。
という訳で、設定ファイル編集。

```pl
$ vim /usr/share/logwatch/default.conf/logwatch.conf
#MailTo = root
# Default person to mail reports to.  Can be a local account or a
# complete email address.  Variable Print should be set to No to
# enable mail feature.
MailTo = root
```

ほう、root宛にメールを投げている。
root宛のメールの受取人って誰よ？ってことでチェック。

```pl
$ sudo vim /etc/aliases
# Person who should get root's mail
root: watashi@anata.wx.yz
```

ここをゴニョって、変更内容を有効化するには、newaliases コマンドを実行する。
*MailTo:*  のところをいじるといいです。

```pl
sudo newaliases
 ```

```pl
$ ls -l /etc/aliases*
-rw-r--r-- 1 root root  1547  4/4 19:12 2013 /etc/aliases
-rw-r--r-- 1 root root 12288  4/4 19:14 2013 /etc/aliases.db 
```




でも、これしたら、その他のroot宛のメールも受け取れなくなるので、これ今回はやらない。
複数人宛にメールを飛ばしているときはここをいじるけど、私一人だけの鯖で、logwatchだけ省きたいって時はこう↓↓

logwatchのメールを飛ばしているcronを編集しに行く

```pl
$ cd /etc/cron.daily
$ ls -l
-rwxr-xr-x  1 root root  265  4/5 19:17 2011 0logwatch
```

この 0logwatch を実行させなくする。
実行権限をなくします。

```pl
$ sudo chmod -x 0logwatch
$ ls -l 0logwatch /usr/share/logwatch/scripts/logwatch.pl
-rw-r--r-- 1 root root   265  4/519:17 2011 0logwatch
```

これでlogwatchからメールはもう届かないはず。
Canvasで画像を縮小したいのだけど、MobileSafariでは大きな画像に関して取得される高さが小さくなっているらしい時

大きな画像を選んでCanvasで縮小すると、下の方が真っ黒になってあれあれ？となってしまうと思う。

※コメント戴いた内容から、下記の話題へ続く。
http://qiita.com/ms2sato/items/d1e6a58b23af41e0090a


iOS6からのバグの様子。下記を参考にすべし。
http://stackoverflow.com/questions/11929099/html5-canvas-drawimage-ratio-bug-ios

コード保全のため一応転載。

```js
/**
 * Detecting vertical squash in loaded image.
 * Fixes a bug which squash image vertically while drawing into canvas for some images.
 * This is a bug in iOS6 devices. This function from https://github.com/stomita/ios-imagefile-megapixel
 * 
 */
function detectVerticalSquash(img) {
    var iw = img.naturalWidth, ih = img.naturalHeight;
    var canvas = document.createElement('canvas');
    canvas.width = 1;
    canvas.height = ih;
    var ctx = canvas.getContext('2d');
    ctx.drawImage(img, 0, 0);
    var data = ctx.getImageData(0, 0, 1, ih).data;
    // search image edge pixel position in case it is squashed vertically.
    var sy = 0;
    var ey = ih;
    var py = ih;
    while (py > sy) {
        var alpha = data[(py - 1) * 4 + 3];
        if (alpha === 0) {
            ey = py;
        } else {
            sy = py;
        }
        py = (ey + sy) >> 1;
    }
    var ratio = (py / ih);
    return (ratio===0)?1:ratio;
}

/**
 * A replacement for context.drawImage
 * (args are for source and destination).
 */
function drawImageIOSFix(ctx, img, sx, sy, sw, sh, dx, dy, dw, dh) {
    var vertSquashRatio = detectVerticalSquash(img);
    ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh / vertSquashRatio);
}
```

上記をどこかに定義しておいて下記のように変更してみると良い。

```js
    //context.drawImage(img, 0, 0, canvaswidth, canvasheight); //これはダメだった
    drawImageIOSFix(context, img, 0, 0, width, height, 0, 0, canvaswidth, canvasheight);
```
pycharmのショートカット

Pycharm Community Editionがでたので早速使ってみた。

Macのとき。

コマンド＋F				検索
コマンド＋R				置換
コマンド＋shift+F			grep検索
コマンド＋shift+R			grep置換
コマンド＋オプション＋R	実行
コマンド＋オプション＋D	デバッグ実行
コマンド＋O				クラス名フィルタ
コマンド＋shift＋O			ファイル名フィルタ
jquery minimalect.jsとajaxとの連携

単純にajaxのsuccess内で再度読み込むだけだとselectからリストを生成してもらえない。
liをsuccess内で生成して書き換えてやることで対応可能だった。
ちなみにminmalect.jsでselectを置き換えているとchangeイベントは使えないのでクリックイベントで対応しています。

```js
    // 都道府県から市区町村取得
    $(function(){
        $('#prefBox li').click(function(){
            var prefCode = $(this).attr('data-value'); // 都道府県の番号取得

            // 都道府県に変更があった場合に関数を呼び出す
            if($(this).html() != $('#prefBox .minict_wrapper input').attr('placeholder')){
                changeMunicipality(prefectureCode);
            }
        });
    });

    // 都道府県から市区町村を取得する関数
    function changeMunicipality(prefCode) {
        $('#' + municipality+ ' option').remove(); //optionを取り除く
        $('#municipalityBox .minict_wrapper ul li').remove(); // 既存のliを取り除く

        $.ajax({
            dataType: "jsonp",
            data: {
                "prefCode": prefCode
            },
            cache: true,
            url: "xxxxxxxxxxxxxxxxxxx",
            success: function (data) {

                // 一番最初のliを作成
                minimalect_row = '<li class="minict_first selected">';
                minimalect_row += '市区町村を選択';
                minimalect_row += '</li>';
                $(minimalect_row).appendTo('#municipalityBox .minict_wrapper ul');

                // liとoptionを作成
                $.each(data, function(i) {
                    model = this;

                    // optionの作成
                    row = '<option value="' + model.code + '">';
                    row += model.name;
                    row += '</option>';
                    $(row).appendTo('#' + municipality);

                    // liの作成
                    minimalect_row = '<li data-value="' + model.code + '">';
                    minimalect_row += model.name;
                    minimalect_row += '</li>';
                    $(minimalect_row).appendTo('#municipalityBox .minict_wrapper ul');
                });
                
                // minimalectの再読み込み（必要か要確認）
                $('select').minimalect();
                
                // placeholderとvalueを初期化
                $('#municipalityBox .minict_wrapper input').attr('placeholder','市区町村を選択');
                $('#municipalityBox .minict_wrapper input').val('市区町村を選択');
            }
        });
    }
```
WordPress: プラグインのCSSを読み込まない【functions.php】


Contact Form 7とWP-PageNaviのCSSを読み込まないでみる

```php:functions.php
/**
 * プラグインのCSSを読み込まない
 */
add_action('wp_print_styles', 'deregister_wp_print_styles', 100);

function deregister_wp_print_styles() {
  wp_deregister_style('wp-pagenavi');
  wp_deregister_style('contact-form-7');
}
```
WordPress: プラグインのJavaScriptを読み込まない【functions.php】


Contact Form 7のJavaScriptを読み込まないでみる

```php:functions.php
/**
 * プラグインのJavaScriptを読み込まない
 */
add_action( 'wp_print_scripts', 'deregister_wp_print_script', 100 );

function deregister_wp_print_script() {
  wp_deregister_script('contact-form-7');
}
```
Diffie-Hellman鍵交換の例

Diffie-Hellman鍵交換
============================

## 概要

発信者と受信者で同じ鍵を使う共有鍵暗号は暗号化方式の一つ.
鍵を共有するには安全に送付しないといけない, という問題がある. 安全な送付問題への回答の一つがこのアルゴリズム.

(鍵交換という名は付いているが)そのものを交換しなくても, 断片的な情報だけを送り合って, 計算で手元に同じ数が現れれば良いじゃないか, という考え方をする.
通信で飛び交った断片的な情報だけを拾い集めても肝心の共有鍵を逆算することが出来ないのがこのアルゴリズムのキモ.


## 例

AさんとBさんがそれぞれ秘密の値a, bを定義

```
a=7(秘密)
b=12(秘密)
```

PとGを決めて共有する.

```
P=13, G=3 を共有, 交換する(公開)
```

Aさん, Bさんはそれぞれ以下の計算を行い, 結果を相手に送る(第三者に見られても良い)

```
[A->Bに送信(公開)] G^a mod P = 3 // ((3 ** 7)  % 13)
[B->Aに送信(公開)] G^b mod P = 1 // ((3 ** 12) % 13)
```

Aは G^b mod P = 1 を受け取った. ここから鍵を計算する.

```
(G^b mod P)^a mod P
 = (1)^7 mod 13 = 1 = 共有鍵
```

Bは G^a mod P = 3 を受け取った. ここから鍵を計算する.

```
(G^a mod P)^b mod P
 = (3)^12 mod 13 = 1 = 共有鍵
```

以上でAさん, Bさんは共有鍵（= 1）を得ることが出来た.

```
P=13, G=3, (G^b mod P)=1, (G^a mod P)=3
```

この4つを盗聴していた人間がいたとしてもa,b, 共有鍵を求めることは出来ない.

// お手頃な数字を使ったためかいまいち感覚がつかめない. もうちょっと大きな数でやったほうがよかったかも
fluentd で json に time を残したい

[fluentd の ChangeLog](https://github.com/fluent/fluentd/blob/master/ChangeLog) によると、0.10.34 以降、in_tail の format ltsv などで time が json に残らなくなったようです。out_s3 で format_json にしていると、時刻を特定する手段がなくなるので要注意です。

自分の場合は td-agent の設定を

```
<match nginx.access>
  type s3
  （中略）
  format_json
</match>
<source>
  type tail
  format ltsv
  path /var/log/nginx/access.log
  pos_file /var/log/td-agent/nginx.access.log.pos
  tag nginx.access
  time_format %FT%T%:z
</source>
```

というようにしておいて、nginx で出力するログを

```
    log_format ltsv "time:$time_iso8601"
        "\thost:$remote_addr"
        "\tforwardedfor:$http_x_forwarded_for"
        "\treq:$request"
        "\tstatus:$status"
        "\tsize:$body_bytes_sent"
        "\treferer:$http_referer"
        "\tua:$http_user_agent"
        "\treqtime:$request_time"
        "\tcache:$upstream_http_x_cache"
        "\truntime:$upstream_http_x_runtime"
        "\tvhost:$host";
```

というようにしていました。タイムスタンプが ISO 8601 ですが大きな意味は無いです。これを S3 に飛ばすと、time が無くなってしまいました。`time:$time_local` でも同じでした。

これを何とかするには、まずアクセスログにタイムスタンプをもう一つ追加します。

```
    log_format ltsv "time:$time_iso8601"
        "\tts:$iso8601"     # ←ここ追加
        "\thost:$remote_addr"
        "\tforwardedfor:$http_x_forwarded_for"
        "\treq:$request"
        "\tstatus:$status"
        "\tsize:$body_bytes_sent"
        "\treferer:$http_referer"
        "\tua:$http_user_agent"
        "\treqtime:$request_time"
        "\tcache:$upstream_http_x_cache"
        "\truntime:$upstream_http_x_runtime"
        "\tvhost:$host";
```

そして、新たに追加した ts に犠牲になってもらいます。

```
<source>
  type tail
  format ltsv
  path /var/log/nginx/access.log
  pos_file /var/log/td-agent/nginx.access.log.pos
  tag nginx.access
  time_format %FT%T%:z
  time_key ts   # ←ここ追加
</source>
```

こうすれば、ts が犠牲となり、time は生き残ります。

使い方がおかしいとかあれば指摘してもらえるとうれしいです。あと、なんで time が消されるようになったのか気になります。
undefined symbol: rb_Digest_SHA1_Init の倒し方


## libssl-dev を入れる

必要なパッケージはぐぐったりすればいろいろでてきます。

rvm を入れて rvm requirements してみるのもいいかもしれません。

## pkg-config を入れる

これパッケージが入ってないと digest/sha1 が libssl をリンクしてくれません。

## chsh -s /bin/bash する

Debian 6.0 を使っているなら要注意。

このバージョンに含まれる zsh がバギーでパッケージが揃っていてもライブラリを正しくリンクしてくれなかったりします。

rvm を入れようとするとその zsh バギーだから他のバージョン使ってと教えてくれます。

## まとめ

rvm が恐ろしく親切なので rbenv が使いたいにしてもとりあえず rvm を入れてちゃんとビルドできたのを確認してから rvm seppuku からの rbenv install が安心かもしれません。
【Mac】ドメイン割り当てたローカルサーバを追加する方法（バーチャルホスト）

いつも忘れるのでメモ。MAMPを使っている場合です。

## サーバ名とローカルファイルのパスを追加する
/Applications/MAMP/conf/apache/extra/httpd-vhosts.conf

```
<VirtualHost *:80>
ServerName    サーバ名
DocumentRoot    "ローカルファイルのパス"
</VirtualHost>
```

## ホストにサーバ名を追加する
※このために新たにアプリとか入れたくないので、黒い画面で。
sudo vi /private/etc/hosts

```
127.0.0.1    サーバ名
```

## MAMPを再起動
サーバ名にアクセスすると、見れるはず。

参考：[MAMPでバーチャルホストの設定 (2種類)](http://soohei.net/889 "MAMPでバーチャルホストの設定 (2種類)")

##難しすぎるだろ！もっと簡単に！！
そんなときはAnvil使えばいいんじゃないですかね。
[Anvilを利用して超絶簡単にバーチャルホスト立ち上げる+ライブリロードする方法 - SPEC Design College](http://specdesign.com.au/blog/web/anvil/)
WordPress: メンテナンスモード【functions.php】


```php:functions.php
/**
 * メンテナンスモード
 */
add_action('get_header', 'wp_maintenance_mode');

function wp_maintenance_mode()
{
  if (!current_user_can('edit_themes') || !is_user_logged_in())
  {
    wp_die('<h1>ただいまメンテナンス中です。</h1>');
  }
}
[リスト]デプロイツール


デプロイツールのリスト。追記大歓迎です。

## Ruby

* [Capistrano](http://capistranorb.com/ "Capistrano")

## Nodejs

* [jitsu](https://github.com/nodejitsu/jitsu "jitsu")

## Python

* [Fabric](http://docs.fabfile.org/en/latest/ "Fabric — Fabric 1.8 documentation")

## PHP

* [Altax](http://kohkimakimoto.github.io/altax/ "Altax - A simple deployment tool for PHP")
* [Phing](http://www.phing.info/ "Phing")
* [Rocketeer](http://rocketeer.autopergamene.eu/ "Rocketeer")
* [Deployer](http://deployer.org/ "Deployer — Deployment Tool for PHP")

## Perl

* [cinnamon](https://github.com/kentaro/cinnamon "cinnamon")
Vagrantにスナップショット機能を加えるplugin、vagrant-vbox-snapshotの紹介


(追記:2016/01/16)
ちゃんと追ってないですが、Vagrant 1.8からSnapshot機能が公式についたみたいなので、そこを先にチェックして見た方が今はいいと思います。

[Vagrant 1.8の公式サイトの紹介文](https://www.hashicorp.com/blog/vagrant-1-8.html)

# vagrant-vbox-snapshotっていうVagrantのplugin、有用ですよ、という話
ネット上にvagrant-vbox-snapshotを使っている人が少ないみたいなので、紹介する価値があるかなと思って書いてみました。

Vagrantが何かとか、Vagrantのインストールの仕方とか基本的なことは書きません。ネット上に一杯溢れてますし。

で、このvagrant-vbox-snapshotは何かというと、Vagrantでsnapshotを作成するためのpluginです。詳しくは以下のリンクを見ると分かるかと。

- 公式サイト(githubリポジトリ)
   - https://github.com/dergachev/vagrant-vbox-snapshot
- 日本語情報
   - [Vagrant 1.1+ でスナップショット](http://hayajo.hatenablog.com/entry/2013/06/13/120258)
   - [仮想マシンのスナップショットとるならvagrant-vbox-snapshotが便利](http://blog.code-life.net/blog/2013/06/12/vagrant-vbox-snapshot/)

VirtualBox以外でこのpluginを使用したことがないので他のソフトウェア(VMWareなど)を使用したときにも使えるかは分かりませんが、VirtualBox + Vagrant使用時ならかなり有用なpluginです。


#インストール

具体的な使い方は上記リンクを読んでみると大半書いてあるので改めて紹介する意味あるのかなと思いつつ書いていきます。

インストールは以下の通り。
`vagrant plugin install vagrant-vbox-snapshot`

すると`vagrant snapshot`コマンドが使えるようになります。

`vagrant snapshot`と打って確認できるサブコマンド群はこんな感じです。

```
$ vagrant snapshot
Usage: vagrant snapshot <command> [<args>]

Available subcommands:
     back
     delete
     go
     list
     take

For help on any individual command run `vagrant snapshot <command> -h
```

全部のコマンドは使ったことが無いので、普段使っているコマンドに絞って以下説明します。

# 使い方

## スナップショットを作成する
`vagrant snapshot take <スナップショット名>`

## スナップショットの一覧を出す
`vagrant snapshot list`

## 指定したスナップショットの状態に移行する
`vagrant snapshot go <スナップショット名>`

## スナップショットを削除する
`vagrant snapshot delete <スナップショット名>`

`vagrant snapshot back`は使ったことが無いのでよく分かりません。

# 何が便利なのか？

最近話題のChefやPuppet、Ansibleなどの構成管理ツールの実験をするときに各仮想マシンの状態を戻して実験する際に非常に役立ちます。というか無いとやってられません。

複数のスナップショットもこのpluginで作成できるので重宝してます。
OptParserの使い方

```py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from optparse import OptionParser
 
if __name__ == '__main__':
 
    """ コマンドエラー時に表示する文字列 """
    usage = u'%prog [Args] [Options]\nDetailed options -h or --help'
 
    version = 0.1
    parser = OptionParser(usage=usage, version=version)
 
    """ test.py -d 20111201 のように、オプションの後に整数値を入力させたい場合 """
    parser.add_option(
        '-d', '--date',
        action = 'store',
        type = 'int',               # 受け取る値の型を指定する
        dest = 'download_date',     # 保存先変数名
        help = 'Set date(yyyymmdd) you want to download.(ex.20110811)'  # --help時に表示する文（見れば分かるかｗ)
    )
     
    """ 文字列が欲しい場合 (test.py -f hoge.txt) """
    parser.add_option(
        '-f', '--file',
        action = 'store',
        type = 'str',           # 型指定
        dest = 'file_name',     # 保存先変数名
        help = 'Set filename (ex. hoge.txt)'
    )
 
    """ -s を指定した場合、trueを保存する """
    parser.add_option(
        '-s', '--sleep',
        action = 'store_true',      # store_trueの場合、Trueが'dest'で指定された変数へ格納される。(false時はstore_false)
        dest = 'hoge_flg',
        help = 'set sleep flag'
    )
 
    """ 各オプションのデフォルト値をセット """
    parser.set_defaults(
        download_date = None,
        file_name = None,
        hoge_flg = False
    )
 
    """ オプションをパース """
    options, args = parser.parse_args()
 
    """ 単純な引数(例: test.py a b)はargs[index]で取得できる """
    if len(args) > 0:
        for i, v in enumerate(args):
            print 'Args[%s] is: %s' % (i, v)
 
    """ オプションで指定した値は options.<変数名>で取得できる """
    date = options.download_date
    if date:
        if len(str(date)) != 8:
            # エラーを発生させるときは↓こんな感じ
            parser.error('Date must be yyyymmdd')
 
    print 'date: %s, file: %s, sleep: %s' % (options.download_date, options.file_name, options.hoge_flg)
```

このファイルを –help オプションをつけて実行すると

```zsh
$ python test.py --help
 
Usage: test.py [Args] [Options]
Detailed options -h or --help
 
Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -d DOWNLOAD_DATE, --date=DOWNLOAD_DATE
                        Set date(yyyymmdd) you want to download.(ex.20110811)
  -f FILE_NAME, --file=FILE_NAME
                        Set filename (ex. hoge.txt)
  -s, --sleep           set sleep flag
```
djangoでmemcachedに関わるエラー

#MemcachedKeyCharacterError: Control characters not allowed.
djangoのキャッシュ機能でキーにオブジェクトなどを指定した場合におこる可能性があるようです。

```py:models.py
from django.db import models

class TestModel(models.Model):
    test = models.CharField(verbose_name=u'テスト')
```
```py:views.py
from django.core.cache import cache

def test_view(request):
    obj = TestModel.objects.get(pk=1)
    objs = cache.get(obj, None)
```
上記にてビューを呼ぶと'cache.get(obj, None)'の箇所で、'MemcachedKeyCharacterError: Control characters not allowed'エラーが起こる可能性があります。

```py:models.py
from django.db import models

class TestModel(models.Model):
    test = models.CharField(verbose_name=u'テスト')

    def __unicode__(self):
        return u"%s:%s" % (self.__class__.__name__, self.id)
```
上記のようにオブジェクトを出力などをしたときに呼ばれるメソッドで、文字列定義すればエラーを回避できます。

#Cache key contains characters that will cause errors if used with memcached
```py:views.py
from django.core.cache import cache

def test_view(request):
    obj = TestModel.objects.get(pk=1)
    objs = cache.get("aaaa bbbb", None)
```
上記のようにスペースなどが含むキーもNGです。
Scipyでの疎行列の扱い

## pythonで疎な文書ベクトルの類似度や距離を計算をするメモ

Scipyで疎行列を使う際の基本的な操作について
書いたのが昔なので、どっか間違ってるかも


```py:行列の計算
import scipy.sparse as sp
import numpy as np

a = sp.lil_matrix((1, 10000)) # 1*10000の疎行列が作成される
b = sp.lil_matrix((1, 10000))
# a.shape => (1, 10000)
for i in xrange(a.shape[1]):
	r = np.random.rand()
	if r < 0.9:
		r = 0.0
	a[0, i] = r
# aの各要素にrandomで数値を格納した
a
# => <1x10000 sparse matrix of type '<type 'numpy.float64'>'
        with 947 stored elements in LInked List format>
# bも同様にした
```

```py:変換
ca = a.tocsr()
ca
# => <1x10000 sparse matrix of type '<type 'numpy.float64'>'
        with 947 stored elements in Compressed Sparse Row format>
#lil => csrとなりました
```

```py:行列積
# 転置行列
ta = a.T
# 行列の積
print a.dot(ta) # (1,1)の行列だが、これも疎行列で表される
# => (0, 0)        853.19504342
```

```py:ベクトルの大きさ
v = np.array([[1, 1]])
math.sqrt(np.dot(v, v.T))
# => 1.4142135623730951
np.linalg.norm(v)
# => 1.4142135623730951

np.linalg.norm(a)
# => エラー起きる
np.linalg.norm(a.todense())
np.linalg.norm(a.toarray())
# => 29.209502621916037

#コサイン類似度
import scipy.spatial.distance as dis
dis.cosine(a.todense(), b.todense())
# => 0.91347774109309299
```

```py:疎行列のユークリッド距離
# -*- encoding: utf-8 -*-

import scipy.spatial.distance as dis
import scipy.sparse as sp
import numpy as np, scipy.io as io
import math

def sparse_distance(v1, v2):
    """1*Nのベクトル間のユークリッド距離を求める
    args:
        v1, v2 : 1 * N の(疎)行列
    """
    if not sp.issparse(v1) or not sp.issparse(v2):
        # 疎な行列でなければ組み込みのeuclideanを使う
        if v1.size != v2.size:
            raise ValueError
        return dis.euclidean(v1, v2)
    indexes1 = v1.rows.item()[:]
    indexes2 = v2.rows.item()[:]
    if indexes1.length != indexes2.length:
        raise ValueError
    indexes = indexes1 + indexes2  # 2つのベクトルの疎でない所のindex
    euc_dis = 0.0
    for index in indexes:
        _dis = v1[0, index] - v2[0, index]
        euc_dis += _dis ** 2
    return math.sqrt(euc_dis)
```
djangoコマンドの二重起動を防止する

djangoコマンドとは'python manage.py 〜'で実行するコマンドのことです。
デフォルトでshellなどたくさん便利なコマンドが用意されています。
ここでは詳しく説明しませんがカスタムコマンドをつくることが可能です。
そして、そのカスタムコマンドなどはcrontabなどバッチとして動かすことが多いのですが、なんらかの原因で二重起動しないようにしてみます。

```py:custom_command.py
import sys
import commands
from django.core.management.base import BaseCommand

def is_process_exist(process_name):
    """
    このプロセスが動いていたらTrueを返す
    """
    output = commands.getoutput("ps -ef | grep '%s' | grep -v grep | wc -l" % (process_name))
    is_exist = int(output) >= 2

    return is_exist


class Command(BaseCommand):
    def handle(self, *args, **options):
        # 二重起動チェック
        if is_process_exist(__name__.split('.')[-1]):
            sys.exit('duplication!')

        # 以下処理〜

```
Facebookみたいにtextareaの一部を強調する

![bx07r4swyI.gif](https://qiita-image-store.s3.amazonaws.com/0/153/b261207b-1434-b589-1e49-1a0cf4eac20f.gif)

Facebookで人物を補完すると、その人物名の周りに枠が表示されて強調されますよね（gif画像参照）。

これのやり方を解説します。

# TL;DR

textareaの強調表示は、textareaを透明にして後ろにいい感じの背景を設置してるだけ

---

## textareaの中にDOMを入れても表示されない

パッと考えるとtextareaの中にDOMツリーを入れるとそれが表示されるんじゃないか、と思うかも知れません

```html:textareaの中に直接DOMを記述してみる
<textarea><span>1</span></textarea>
```

が、ぜんぜんそんなことは無くて、そのまま文字列が表示されてしまいます。

![Screen Shot 2013-09-25 at 1.59.57 PM.png](https://qiita-image-store.s3.amazonaws.com/0/153/0d1b54c9-2231-7891-0529-a6ebda72b7c0.png)

ご存知のようにtextareaやinputは、他の要素のように子要素を表示するのではなく、自身のvalue属性の値を画面に表示する働きをします。value属性は文字列を格納するためのものなのでDOMを入れられないわけですね。

## 強調用のDOMを重ねあわせる

textareaにはDOMをそのまま入れられないので、仕方がなく周りに設置したDOMの位置を微調整して重ねあわせることでtextareaが強調されているかのように見せかけているわけです。

このとき問題になるのがtextareaと重ねあわせるDOMのz軸方向の位置関係です。textareaより手前にあるとtextareaを選択できなくなってしまします。一方でtextareaより奥にあると表示されません。

さてどうしたら良いのでしょう？

### background-color: transparentが肝

textareaの背景色を透明にして、後ろにあるDOMが表示されるようにすればよさそうですね。つまりtextareaが `background-color: transparent;` であればよいわけです。

### いい感じの場所に背景色をつけるにはどうすればいいの？

もう一つ考えなければならないのが、どこに背景を設置するかです。やり方はいろいろ考えられますが、後述するサンプル実装の場合は、textareaの文字列の背後に全く同じ透明な文字列を設置して、該当箇所を強調させています。全く同じ文字列を全く同じように背後に置いてあるので、位置がピタリと合う訳ですね。他にもやり方はありそうなので考えてみてください。

## サンプル

で、試しに作ってみました。

- https://github.com/yuku-t/jquery-overlay

このプラグインは正規表現で指定された文字列に背景色を付けるシンプルなものです。

非常にシンプルなので、先日公開したtextareaに補完機能をつけるプラグインとも簡単に結合することが可能です。プラガブル万歳＼(^o^)／

- http://yuku-t.com/jquery-textcomplete/#textarea3

![kw1I6VWtpY.gif](https://qiita-image-store.s3.amazonaws.com/0/153/ce070838-0c10-91d4-19aa-e8396b2bcd40.gif)


## textareaを使うと背景色を変えるくらいしか強調手段がない

上記のサンプルページを表示してみた人は気がついたかも知れませんが、背景色を付ける以外の強調方法を使えません。例えば文字の色を変えたり、イタリックにしたり、太さを変えたり、大きさを変えたりしたくてもできないのです。

理由はtextareaを使っていることです。あくまでも表示されている文字列はtextarea由来のものであり、こいつらの一部の色を変えたり、イタリックにしたりすることができないのは最初に見た通りです（てか、それができるならこんな回りくどいことをしなくてもいいわけで）。

### contentEditableを使えばなんとかなる？

contentEditableは使えないのか？と思う向きもあるかと思います。たしかにその通りでcontentEditableを使うこともできるかも知れません。こちらを使えば文字列の大きさも好き勝手に変えられるので表現力は上です。
が、いかんせん面倒なのでやってない＋contentEditable内でのカーソル位置の制御が難しい（JavaScriptから調整不可？）なので、僕は諦めた次第です。

# まとめ

textareaの強調表示は、textareaを透明にして後ろにいい感じの背景を設置してるだけ
configure: error: no acceptable C compiler found in $PATH

新しいmacの開発環境set upしててこのエラーでつまづいたけど

configure: error: no acceptable C compiler found in $PATH

でこのエントリに救われた

http://d.hatena.ne.jp/agw/20120730/1343711730

ﾟ+.(◕ฺ ω◕ฺ )ﾟ+.
MacOSX に homebrew で R をインストール

思い立ったので入れてみました。

まず、 `gfortran` が必要らしいのでインストールします。

```
% brew install gfortran

curl: (22) The requested URL returned error: 404
Trying a mirror...
==> Downloading ftp://ftp.linux.student.kuleuven.be/pub/people/skimo/isl/isl-0.11.2.tar.bz2

curl: (7) couldn't connect to host
Error: Download failed: ftp://ftp.linux.student.kuleuven.be/pub/people/skimo/isl/isl-0.11.2.tar.bz2
```

エラーになったので、`brew update`

```
% brew update
```

```
% brew install gfortran
```

今度は成功。
次はRのインストール。

```
% brew install R
Error: No available formula for r 
```

エラーになったので、それっぽいフォーミュラを下記githubのページから探して追加

https://github.com/homebrew

```
% brew tap homebrew/science
```

```
% brew install R
r: Unsatisfied dependency: XQuartz 
Homebrew does not package XQuartz. Installers may be found at:
  https://xquartz.macosforge.org
Error: An unsatisfied requirement failed this build.
```

またエラー。
`XQuartz` が必要らしいので

エラーメッセージにある通り、

こちら https://xquartz.macosforge.org/landing/ からダウンロードしてインストールします。
その後、再度インストールにチャレンジ。

```
% brew install R
```

インストール完了。

```
% R             

R version 3.0.1 (2013-05-16) -- "Good Sport"
Copyright (C) 2013 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin12.4.0 (64-bit)

R は、自由なソフトウェアであり、「完全に無保証」です。 
一定の条件に従えば、自由にこれを再配布することができます。 
配布条件の詳細に関しては、'license()' あるいは 'licence()' と入力してください。 

R は多くの貢献者による共同プロジェクトです。 
詳しくは 'contributors()' と入力してください。 
また、R や R のパッケージを出版物で引用する際の形式については 
'citation()' と入力してください。 

'demo()' と入力すればデモをみることができます。 
'help()' とすればオンラインヘルプが出ます。 
'help.start()' で HTML ブラウザによるヘルプがみられます。 
'q()' と入力すれば R を終了します。 

>
```

無事Rが起動出来ました。

---

参考にさせていただいたページ
[Mac + Homebrew で R 環境の構築](http://salinger.github.io/blog/2013/02/26/1/)
[Mountaion LionにRを入れて使うまでの準備](http://otukutun.hatenablog.com/entry/2013/03/01/175345)
[これは便利！Homebrewに追加されたtapコマンドはリポジトリを追加して簡単にフォーミュラを増やせる](http://blog.hifumi.info/mac/mac-%E3%83%87-homebrew-%E3%83%8E%E3%82%B9%E3%82%B9%E3%83%A1/)
[リスト]Static Site Generator

追記:2014/08/09
以下２つ見ればこのメモはいらないかも(´・ω・｀)

* [Static Site Generators](http://staticsitegenerators.net/ "Static Site Generators")
* [Top Open-Source Static Site Generators - StaticGen](https://www.staticgen.com/ "Top Open-Source Static Site Generators - StaticGen")

静的にHTMLを書き出すもののリストを作ってみよう。
[スター数付き版](http://jsbin.com/biyeg)


## Ruby

* [Jekyll](http://jekyllrb.com/ "Jekyll • Simple, blog-aware, static sites")
* [Octopress](http://octopress.org/ "Octopress")
* [Middleman](http://middlemanapp.com/ "Middleman: Hand-crafted frontend development")/[日本語](http://middlemanapp.com/jp/)

## Nodejs


* [Wikismith](http://wikismith.com)
* [Wintersmith](http://wintersmith.io/ "Wintersmith")
* [Punch](http://laktek.github.io/punch/ "Punch - A Fun and Easy Way to Build Modern Websites")
* [roots](http://roots.cx/ "roots | where it all begins")
* [Assemble](http://assemble.io/ "Home | Assemble")
* [Harp](http://harpjs.com/ "The open-source web server with built-in preprocessing – Harp")
* [DocPad](http://docpad.org/ "DocPad - Streamlined Web Development")
* [haiku](https://github.com/jxson/haiku)
* [Hexo](http://hexo.io/)
* [Metalsmith](http://www.metalsmith.io/ "Metalsmith")
* [Headstart](http://www.headstart.io/ "Headstart")

## Python

* [Hyde](http://ringce.com/hyde "Hyde - A Python Static Website Generator")


## PHP

* [Sculpin](https://sculpin.io/ "Sculpin — PHP Static Site Generator")
* [Spress](http://spress.yosymfony.com/)
* [Phest](http://c-note.chatwork.com/post/68781816704/phest-php-easy-static-site-generator)

### Wordpress

* [StaticPress](http://staticpress.net/ "StaticPress")

## Go

* [Hugo](http://hugo.spf13.com/)

## Perl

* 教えて下さい！
Vim + tagbar-phpctags で PHP 開発

tagbar-phpctags を使うと、PHP の変数、クラスやメソッド、メンバの情報を分かり易く表示してくれて便利。

## インストール

予め、PHP, Tagbar, ctags はインストールしておく

-

[追記 13/10/21]
[vim-scripts/tagbar-phpctags](https://github.com/vim-scripts/tagbar-phpctags) からプラグインを持ってきた場合、既に phpctags が用意されており、態々ビルドする必要が無い事が判明。

```
.
├── ChangeLog.md
├── README
├── README.md
├── bin
│   └── phpctags   <- 既に用意されている
└── plugin
    └── tagbar-phpctags.vim
```

また、`g:tagbar_phpctags_bin` が未定義なら、この `phpctags` を見に行くことも分かったので特に設定も必要ない。
唯一必要なのは、`bin/phpctags` の実行権限なので、NeoBundle を使っているユーザなら `.vimrc` に下記コードを書けば簡単に使えるようになると思う。

```.vimrc
NeoBundle 'vim-scripts/tagbar-phpctags', {
  \   'build' : {
  \     'others' : 'chmod +x bin/phpctags',
  \   },
  \ }
```

windows はよく分からないので、下の様にして除外しても良いかも。

```.vimrc
NeoBundle 'vim-scripts/tagbar-phpctags', {
  \   'build' : {
  \     'windows' : '',
  \     'others' : 'chmod +x bin/phpctags',
  \   },
  \ }
```
[追記ここまで]

-

### phpctags のビルド

phpctags は[リポジトリ](https://github.com/techlivezheng/phpctags)などからソースを持ってきてビルドする必要がある。

※ git、またはダウンロードでも良いし、composer にパッケージが登録されているので、ここから持って来ても良い。

git で持って来てビルドするなら、以下のとおり。

<pre>
$ git clone https://github.com/techlivezheng/phpctags.git
$ cd phpctags
$ make
</pre>

make すると、build/phpctags.phar が出来上がる。
実行するなら `php phpctags.phar` となるが、composer のグローバルインストール同様、パスが通っているところに移動させてあげれば `phpctags` で済む。
ただ、vimrc にて直接パスの指定も出来るので、別に移動させなくても良い。

※ ちなみに `make install` を実行すると、
`Sorry, you need to move phpctags to /usr/bin/phpctags or /usr/local/bin/phpctags or any place you want manually.` と言われる。


### tagbar-phpctags のインストール

自分が NeoBundle を使っているので、NeoBundle でのインストールのみ

```VimScript:.vimrc
NeoBundle 'vim-scripts/tagbar-phpctags'

" phpctags のパスが通っていれば、下の設定は必要なし
let g:tagbar_phpctags_bin = 'phpctags/build/phpctags.phar'
```

## 同じソースで見え方の比較

| 通常の tagbar | tagbar-phpctags |
|:----------:|:-----------:|
|![before.png](https://qiita-image-store.s3.amazonaws.com/0/2987/03ee364a-3b29-f486-12fc-d9dfccd2abe0.png "before.png")|![after.png](https://qiita-image-store.s3.amazonaws.com/0/2987/07c5fa52-2d8a-38fe-5f7c-bc44aebb75a4.png "after.png")|

※ソースは Doctrine/ORM/Query.php です。
padrinoで処理を中断し出力する(phpで言うところのexit)

例えばログインエラーなどの共通処理をする際にエラーページへのリダイレクトだと都合が悪い場合、処理を中断して出力したいということがある

exitだとinternal server error、abortだと標準エラーになってしまうのが、以下のようにすると任意の出力をすることができる

```rb:
            if access_token.nil?
                throw :halt, [200, '{"status":false,"error_code":"109","description":"invalid access_token"}']
            end
```
git configでuser.nameを設定しているのに毎回Usernameを聞かれる場合、remoteのurlを確認する。

(・Θ・) oO( GitHub EnterpriseだとHTTPが初期値で表示されてたから……

## 確認

```bash
git remote -v
```

* OK … `git@ghe.example.local:project/repository.git`
* NG … `http://ghe.example.local/project/repository.git`

## 設定

```bash
git remote set-url origin git@ghe.example.local:project/repository.git
```

# ずどさんありがとう

* https://twitter.com/Takazudo/status/382715407716474880
ImageMagick が新しくなったせいで RMagick が動かない問題

なんか、ImageMagick をupgrade するたびに毎回なってめんどくさいアレのメモ〜 :alien:
ImageMagick の新しいバージョンを削除して、一個前のやつにしてあげればよい。

とりあえずImageMagick外します

```
$ brew unlink imagemagick
```
ImageMagickが入ってるところに行きます

```
$ cd /usr/local/Cellar/imagemagick
```
何がいるのか見ます

```
$ ls
./        ../       6.7.7-6/  6.8.0-10/ 6.8.6-3/
```
ほう、6.8.6-3 が新しいやつか(ΦωΦ) 
一番新入りのやつを消す

```
$ rm -rf [新しいバージョン]
```
バージョン一覧見る

```
$ brew versions imagemagick
6.8.6-3  git checkout 870d5e9 /usr/local/Library/Formula/imagemagick.rb
6.8.0-10 git checkout 321b293 /usr/local/Library/Formula/imagemagick.rb //←これぽさ
6.7.7-6  git checkout 7d951fb /usr/local/Library/Formula/imagemagick.rb
6.7.5-7  git checkout f965101 /usr/local/Library/Formula/imagemagick.rb
6.7.1-1  git checkout 2c6e638 /usr/local/Library/Formula/imagemagick.rb
6.6.9-4  git checkout 4e7c332 /usr/local/Library/Formula/imagemagick.rb
6.6.7-10 git checkout 0476235 /usr/local/Library/Formula/imagemagick.rb
6.6.7-8  git checkout db99927 /usr/local/Library/Formula/imagemagick.rb
6.6.7-1  git checkout 7cd042f /usr/local/Library/Formula/imagemagick.rb
6.6.4-5  git checkout 53886de /usr/local/Library/Formula/imagemagick.rb
6.6.4-2  git checkout 2658d63 /usr/local/Library/Formula/imagemagick.rb
6.6.4-0  git checkout 2e50cf3 /usr/local/Library/Formula/imagemagick.rb
6.6.3-9  git checkout 46dc691 /usr/local/Library/Formula/imagemagick.rb
6.6.3-8  git checkout 9b5f4b5 /usr/local/Library/Formula/imagemagick.rb
・
・
・
```
二番目に新しいやつが多分今まで動いてたやつなので、その子に切り替える

```
$ git checkout [戻したいバージョンを指定]
```
リンクし直す

```
$ brew link imagemagick
```

rmagick 入れなおす〜

```
$ gem install rmagick
```
ヾ(*'ω'*)ﾉﾞ:beers: