OmniAICreator/Qiita-1.07M huggingface dataset:
ASP.NET WebForm UpdatePanelロード時に処理をする

ASP.NET WebFormでは、JavaScript側で`pageLoad`という名前のfunctionを用意しておくとページが読み込まれるたび処理してくれます。これはUpdatePanelでのロード時も例外ではありません。
※つまりPostBackも含めた通常のページロード、UpdatePanelの更新、あらゆる場合で`pageLoad`は動きます。

```js
<script>
    function pageLoad(sender, args) {
        console.log("page load event occur");
    }
</script>
```

使いどころとしては、jQuery UI等の部品をUpdatePanel内で使用している場合などです。

こうした部品(datePickerなど)は、通常`$(document).ready()`(`$()`)で初期化処理を行いますが、UpdatePanel内で使用している場合は`pageLoad`で行う必要があります。

なぜなら、これらのイベントはUpdatePanel更新時には動いてくれないためです。UpdatePanel内に部品がある場合、最初はうまく出てきますが一回UpdatePanelの更新を行うと部品が動作しなくなる・・・のはこのためです。

そのため、ページロード時一回だけ動いてくれればいい処理はdocument.ready、UpdatePanel更新時も含めて動いてくれないと困る処理は`pageLoad`と使い分ける必要があります。

＜参考＞
$(document).ready() and pageLoad() are not the same!
http://encosia.com/document-ready-and-pageload-are-not-the-same/
EC2でPHPを5.4に更新する手順

## 更新手順

### 古いPHPにお別れを

```
$ sudo yum remove php-* httpd-*
```

### 新しいPHPをお出迎え

```
$ sudo yum install httpd24 php54 php54-mysql
$ php -v
PHP 5.4.26 (cli) (built: Mar 27 2014 23:53:54) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
```

* mysqlなどは必要ならばご一緒に
* [ここ](http://webtatic.com/packages/php54/)にphp54-xxxというパーケージリストが書いてあったので参考までに

----

ゴミがのこったりするのか[ここ](http://blog.ybbo.net/2014/01/24/%E3%80%90%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%80%91centos5%E3%81%ABphp5-4%E3%82%92yum%E3%81%A7%E7%B0%A1%E5%8D%98%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B/)にあるような手順ではエラーが出てはいらなかった

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Seleniumerといっていますが、Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
【Excel】１ページでおさめたPDFを作る

忘れるのでメモ。

#１ページにおさめる
ファイル＞ページ設定＞ページ＞拡大縮小印刷
横１×縦１ページに印刷に指定

#PDFで保存
ファイル＞プリント＞PDF＞PDFとして保存

#左右中央に印刷（PDF）する
ファイル＞ページ設定＞余白タブの水平にチェックを入れる
ASP.NET WebForm jQueryでPageのメソッドを呼び出す

jQueryのajax等で、サーバーサイドの処理を呼び出したい！という場合以下のようにする。

サーバー側(AjaxTest.aspx.vb/AjaxTest.aspx.cs)

```vbnet
<WebMethod()>
Public Shared Function Echo(ByVal text As String) As String
    Return text
End Function
```

```csharp
[WebMethod()]
public static string Echo(string text)
{
	return text;
}
```

JavaScript側

```js
$.ajax({
    type: "POST",
    url:  "AjaxTest.aspx/Echo",
    data: JSON.stringify({ text: "echostring" }),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    cache:false
}).done(function (data) {
    //data.dに返り値が入っている
})

```

注意すべきポイント

* サーバーサイドのメソッドは、`Shared`(`static`)である必要がある。
* 送るデータは、jsonでなく"文字列"である必要があるため、JSON.stringifyが必要(dataTypeでjsonを指定しているのに?不思議だがこれが真実)。
* contentTypeの指定は必須(jQueryのデフォルトでは`application/x-www-form-urlencoded; charset=UTF-8`のため、指定しないと失敗する。このため、`$.post`などで横着すると失敗する)。
* dataTypeも必要
* cache:falseは必須ではないが、IEでおかしな挙動があったりするので基本あったほうがいいと思う。
* 返り値は頼まなくてもJSONでシリアライズされてくるため、サーバーサイドでの`JavaScriptSerializer`によるシリアライズは不要

＜誤情報＞
* よく言われる、web.configへのwebServicesセクションへの追加は不要

```
<webServices>
  <protocols>
    <add name="HttpGet"/>
    <add name="HttpPost"/>
  </protocols>
</webServices>
```

* ScriptManagerは必要なく、EnablePageMethods="true"も不要
* メソッドに`ScriptMethod`Attributeを付与する必要もない
cordova3.4にbarcodeプラグインをいれてみた

cordova 3.4 のCLIでbarcord scannerのプラグインをいれてみたメモ


cordovaのプロジェクトを作成

cordova create barcode  info.kdapp.barcode barcode 

barcodeプロジェクトができる。

cd barcode
プロジェクト内に移動

cordova platform add android
アンドロイドplatformを追加

https://github.com/wildabeast/BarcodeScanner

を指定してプラグインを追加する
cordova plugin add https://github.com/wildabeast/BarcodeScanner

githubから読み込んでプロジェクトに追加される。便利。


barcode/www/index.htmlを編集する。
https://github.com/wildabeast/BarcodeScannerにかかれている
javascriptからの制御サンプルをそのままつかってみる。


---------------
index.html
---------------
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>barcode plugin test</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
  $("#btn1").live("click",btn1_on);
  $("#btn2").live("click",btn2_on);
});
funtciont btn1_on(){
  cordova.plugins.barcordScanner.scan(
    function(result){
      alert("we got a barcode\n"  +
               "result: "  +  result.text + "\n" +
               "format: " + result.format * "\n" +
               "cancelled: " + result.cancelled); 
    ),
    function(error){
      alert("scanning failed: " + error);
    )
  );
}
function btn2_on(){
  cordova.plugins.barcodeScanner.encode("TEXT_TYPE",  "abcde",
    function(success){
      alert("encode success; " + success);
    },
    function(fail){
      alert("encoding failed; " + fail);
    }
}

</script>
</head>
<body>
<br />
<br />
<div id="btn1">scan</div>
<br />
<br />
<div id="btn2">encode</div>
</body>
</html>

--------------------------------------------------------------------

ビルド
cordova build

実機にdeploy
cordova run android


これでscanが動作OK。

encodeは動作しなかった。
第１引数のTEXT_TYPEの部分は
BarcodeScanner.Encode.TEXT_TYPE
となっていたが、BarcodeScannerが見つからないようで、
ソースをたどると"TEXT_TYPE"となっていたので置き換えてみた。

今度は関数内のエラーなのか、異常終了でアプリが落ちておわる。

scan側のみ使っておこう。。
Blocks のアレゲなシンタックスのための Xcode の Snippet 

Blocks のアレゲなシンタックスは有名で非常に覚えにくいです。なので有名な [OSX / iOS アプリ開発者のココロの叫びを表したサイト](http://fuckingblocksyntax.com/ "How Do I Declare A Block in Objective-C?")があるのはもはや有名ですね。ココに書かれているシンタックスを Xcode の Snippet にして置いてます。

[griffin-stewie/XcodeBlockSyntaxSnippets](https://github.com/griffin-stewie/XcodeBlockSyntaxSnippets "griffin-stewie/XcodeBlockSyntaxSnippets")

デフォでもいくつかは入ってますし、他にもすでにいっぱいあると思いますが自分自身が環境変更があったときに便利なように GitHub に置いておこうと思ったしだいです。
Clojureでmapcatのfor版としてforcatを作る（＋おまけpapply）

なにげに便利なmapcatですが、そのfor版もなにげに便利だと思いますので作ってみます。

```forcat.clj
(defmacro forcat [seq-exprs & body-exprs]
  `(apply concat (for ~seq-exprs (concat ~@body-exprs))))
```

body部に複数フォーム入れられるようにもしてみました。

```
user=> (forcat [x (range 3) y [:a :b]] [x] [y])
(0 :a 0 :b 1 :a 1 :b 2 :a 2 :b)
```

#### おまけ
短かったので全く別のこととして`partial apply`の単なるエイリアスとしてpapplyを作ってみます。

```papply.clj
(defn papply [f & args] (apply partial apply f args))
```

これをどんなときに使うかですが、`(map #(* %1 %2) [[3 5] [6 9]])`のような動かないコードを改善するとき`(map (fn [[v1 v2]] (* v1 v2)) [[3 5] [6 9]])`とする代わりに`(map (papply #(* %1 %2)) [[3 5] [6 9]])`とすることができます。
weechatの使い方

$ weechat
で立ち上げてから、
weechatのチャット欄で
/server add haskell chat.freenode.net -autoconnect
とやると、haskellという名のサーバが設定される。
その後、チャット欄で
/connect haskell
とやるとサーバに接続され、
/join #haskell
でhaskellチャンネルに入れる。
/exit
で終了
iOS7でUIWebViewのサブクラスを作るときの注意点

UIWebViewのサブクラスで`scrollViewDidScroll:`メソッドを実装する場合は必ず`[super scrollViewDidScroll:]`を呼ぶようにしましょう。
これを呼ばないと、ロードしたページ内のjsで `window.pageYOffset` が常にゼロを返して、ハマります。
iOS6では問題なかったけどiOS7以降からこういう挙動になったっぽい。チッ。
http://stackoverflow.com/questions/19001892/window-pageyoffset-not-working-in-ios7
Gitian : 複数のビルダーに証明された信用できるバイナリー配布方法


現時点2014/04/01で日本語情報がググって0だったので、書いてみる


## Gitian とは?

### 目的

* 安心してバイナリをダウンロードできるようにする

### 解決方法

* 複数人でビルドして、同一のバイナリ作ってサインする

### なぜ?

* ビルドのグループの方が、1人でやるより信頼できる
* 信用できないバイナリのダウンロードから人々を遠ざける
* セキュアで、使いやすいアップグレードのプロセスを作る

## gitian-builder

GitHubのレポジトリ

[devrandom/gitian-builder](https://github.com/devrandom/gitian-builder "devrandom/gitian-builder")

## サンプル

gitian-builder を使ったビットコインのビルドプロセス

[Building bitcoin with gitian-builder](https://gist.github.com/devrandom/806265 "Building bitcoin with gitian-builder")


bitcoin のリリース

[Gitian-building Bitcoin releases](http://gavintech.blogspot.jp/2014/02/gitian-building-bitcoin-releases.html "Gitian-building Bitcoin releases")

## 公式サイト

[Gitian: a secure software distribution method](http://gitian.org/ "Gitian: a secure software distribution method")
rubyのrequireで詰まったこと

とりあえず時間があるうちはできるだけ投稿していきたいと思います．

今回はruby初心者が恐らく詰まるであろう(といいつつひょっとしたら俺だけ!?)requireの小話です．

複数クラスから構成されるプログラムを書くときに同じディレクトリにファイルを分けて書いたのですが，
`@require "hoge.rb"`
みたいに参照しようとしたところ，
`'require': cannot load such file`
となり，実行できませんでした．

**同じディレクトリに入れてるんだから，相対パスで参照可能じゃないの！？というかサンプルこういう書き方になってたけど！？**
って思ったのですが，
**ruby1.9.3からはセキュリティの関係で上の書き方ではダメになったらしいです．**

調べたところ，
**`@require "./hoge.rb"`**
の書き方で通りました．

ネットで調べながらコード書いてると1.9.3以前のものとかが多くて，意外と気づかずにはまってしまいました・・・

これ以外にもバージョンの違いではまったところがあるので，それに関しても記事にしたいと思います．
かなり小話でしたが，これで今回は終わりです．
【緊急】falseコマンドの深刻な不具合

# falseコマンドを使っている方は、今すぐ点検を！

[Single UNIX Specification](http://www.unix.org/what_is_unix/single_unix_specification.html)を策定している[The Open Group](http://www.opengroup.org/)が、falseコマンドに深刻な不具合を見つけたことを発表しました。

**影響を受けるシステムはfalseコマンドを実装しているほぼ全てのUNIX系OS** であり、与える影響は計り知れないということです。

# 不具合の内容

現在のfalseコマンドの[man](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/false.html)によれば、このコマンドは戻り値1(偽)を返すとされています。

しかしそれは、当然1を返してくるものと期待しているユーザーに対して **正直な動作** をしており、これはfalse(偽る)というコマンド名に対して実は不適切な動作をしています。

# The Open Groupの対応方針

今回の不具合報告に合わせ、The Open Groupのスポークスマンは次の声明を発表しました。

> 確かに前述のとおりの不具合は見つかったものの、falseというコマンドの長い歴史からすればとても「いまさら」な話である。また、あまりに普及率が高いコマンドで及ぼす影響も甚大であることからも、もし修正を実施したとなれば「いまさら仕様を変えるなよ」と世界中から白い目で見られることは必至である。
> 我々もいまさらそんな苦労と顰蹙を買いたくないし、それに、今日(4/1)が終われば世の中もきっと我々の発表を無かったことにしてくれるに違いないと思うので、とりあえず今日をひっそり生きようと思う。

このようにThe Open Groupは **「それは断じて仕様である」メソッドの発動を示唆** しており、falseコマンドの動作は結局そのままになるものと見られています。

情報元；[https://twitter.com/uspmag/status/450658253039366144](https://twitter.com/uspmag/status/450658253039366144)
rake releaseでコミットを先にしろと怒られた時の対応


# 現象
gemの修正が終わり,Githubに一度pushした状態。
rake releaseでタグ打ちとRubygemsへのアップロードをしようとすると、次のエラーが出た。
修正は終わって、pushしているのでもうコミットすべきファイルはないはず…

```
$ rake release
ansible_spec 0.0.1.2 built to pkg/ansible_spec-0.0.1.2.gem.
rake aborted!
There are files that need to be committed first.
/Users/Adr/.rvm/gems/ruby-1.9.3-p194@global/gems/bundler-1.3.5/lib/bundler/gem_helper.rb:115:in `guard_clean'
/Users/Adr/.rvm/gems/ruby-1.9.3-p194@global/gems/bundler-1.3.5/lib/bundler/gem_helper.rb:75:in `release_gem'
/Users/Adr/.rvm/gems/ruby-1.9.3-p194@global/gems/bundler-1.3.5/lib/bundler/gem_helper.rb:50:in `block in install'
/Users/Adr/.rvm/gems/ruby-1.9.3-p194/bin/ruby_noexec_wrapper:14:in `eval'
/Users/Adr/.rvm/gems/ruby-1.9.3-p194/bin/ruby_noexec_wrapper:14:in `<main>'
Tasks: TOP => release
(See full trace by running task with --trace)
MBA:ansible_spec Adr$
```

#原因
ステージングにかかわらず、未コミットのファイルがあると起こる。

実は別件でadd前の編集中のファイルがあった。
確かにcommitしていないが、でもaddしていないのでステージングもされていないのでは。。
addとは無関係にcommitされていないファイルがあると無条件にダメなのか？

```
MBA:ansible_spec Adr$ git st
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	modified:   lib/ansible_spec.rb
#
no changes added to commit (use "git add" and/or "git commit -a")

```

# 解決策
未コミットのファイルを一旦checkoutで元に戻すと、`rake release`を実行できる。
この対応で良いのか分からず、理解できてないところもあるけど、取り敢えず今後は気をつける。
どなたか別の解決策・注意点をご存知でしたら教えて下さい。。。
「はじめて読む486」を読んでみました。


http://www.amazon.co.jp/はじめて読む486―32ビットコンピュータをやさしく語る-蒲地-輝尚/dp/4756102131

正確な理解ができている気があまりしないのですが、とにかく全部読むことはできたので、自分なりに理解した内容をまとめてみようと思いました。

切り口としては、パイプラインが、とか、命令が、とかいろいろあるんだとは思うのですが、この本自体がOSと、CPUの連携について記述されている部分が多いため、OSから見たCPUの機能、という視点でまとめてみようと思います。


# マルチタスク
486の背景には、OSがMS-DOSからWindowsへと、移行していく、という時代の流れがあったのだと感じます。

WindowsのようなマルチタスクOSに必要な機能をサポートすべく486には次の機能が実装されています(進化は286、386などいくつかの段階をへて、という感じだとは思いますが)。

* タスク管理機能
* セグメント機構
* アドレス変換

まず、マルチタスクOSというからには、まずタスク群をそれぞれ個別に管理するような機能が必要です。

次にタスクがアクセスするメモリ領域が重複しないようメモリの保護を行うことが重要になります。これを実現するのがセグメント機構です。

最後にマルチタスクを実現するためには広大なメモリ領域が必要になります。486ではアドレス変換機能を利用したページング処理により、メモリの物理的な限界を破る仮想記憶を実現します。

以下、それぞれの機能について説明します。

# タスク管理機能
486では、タスク切り替えを1命令で実行可能です。
各タスクは(Task State Segment)というデータ形式(C言語的には構造体)で表現されます。

TSSは下記の情報を保存しています。

* 各レジスタの値
* OS用タスク管理情報
* I/O許可マップ

各種セグメントレジスタ、スタックポインタ、インストラクションポインタ、など、タスクごとに切り替える必要があるレジスタすべてを記憶しておく必要があります。

# セグメント機構

* コードセグメント
* データセグメント
* スタックセグメント

コードセグメントとは、プログラム本体を配置するメモリ領域です。
いわゆる命令(インストラクション)のシーケンスを配置するためのものです。
現在実行されている命令はインストラクションポインタというレジスタで管理されます。

データセグメントとは、プログラムから扱うデータ(静的定数、静的変数、ヒープ領域など)を入れるメモリ領域です。

スタックセグメントは、スタックを配置するためのセグメントです。
スタックセグメント上のスタックの状態を管理するためにスタックポインタ、ベースポインタと呼ばれるレジスタが使用されます。

それぞれのコードセグメントはセグメントディスクリプタと呼ばれるテーブル構造で管理されます。セグメントディスクリプタにはセグメントのメモリ上の開始位置と、オフセットが設定されており、範囲を超えるとセグメンテーションフォルトという例外を発行します。

# アドレス変換とページング
32bitのCPUならば約4GBのアドレス空間をあつかうことができますが、486当時のPCのメモリはそれには遠く及ばない物理メモリしか搭載してませんでした。

そこで論理アドレス(本文中ではリニアアドレスと呼ばれています)という抽象層を挟むことで、物理的な制約を飛び越えるアイデアが考案されました。
論理アドレスはその名の通り、論理的にとりうるすべてのアドレス空間上の位置をさします。
論理アドレスを使用すると、CPU側からは0から始まる広大なアドレス空間(論理アドレス空間)が見えます。

このCPUから見えるアドレス空間をページ単位に分割します。
例えばアドレス0x0〜0x0xFFまではページ1番、0x100〜0x1FFまではページ2番、という具合です。
次に実際の物理アドレス空間を論理アドレス空間と同じサイズで分割し、論理アドレス空間と、物理アドレス空間のページを1対1に対応づけます。この対応付けを管理するテーブルをページテーブルと呼び、この論理アドレスと物理アドレスの対応付けをアドレス変換、と呼びます。

ただ、このままでは若いアドレスの論理ページのみが物理メモリ上に存在することになり、すこぶる勝手が悪い状態です。

そこで、よく使うページを物理メモリ上に、あまり使わないページを外部記憶にクルクルと入れ替えながら使う、という仕組みで、どのメモリにアクセスしても同じような速度で使用できる、という仕組みが考えられました。この仕組みは、ページングを利用した仮想記憶、と呼ばれます。

余談ですが、このように使用頻度の高いメモリを、物理メモリの上にのせる、という話は、キャッシュの考え方そのものです。

現在使用中のメモリのそばに次に使うデータが配置されていることが多い、という性質を空間的局所性とよびます。また、最近使ったデータは再度使われることが多い、という性質を時間的局所性と呼びます。

キャッシュ、仮想記憶はこの時間的、空間的局所性を利用して、広大なメモリ空間を表現する仕組みです。

# 結び
本の中では8086+MS-DOSと、i486+マルチタスク、という対比で説明されていることが多かったです。i486の時代はまさしくマルチタスクがPCで、ということが現実味を帯びてきた時代だったのだと思います。
けっして現在廃れてしまった話ではなく、むしろ基本となる話だと思いますので、この本を読んで本当によかったと思います。
拙文を最後までお読みいただきありがとうございました。
【Android】画面サイズに合わせて、動的にView要素のサイズの変更

Androidの端末ごとの画面サイズ依存に悩まされていたので、いいやり方がないか調べたのでメモ。

レイアウト側のxmlでのサイズ指定で[android:layout_weight="1"]といったかたちで比率を指定していくのが基本だけれど、
どうしてもフォントサイズとか、上手くいかないことが多い。
なので、動的に画面サイズを取得して、フォントサイズやなんやらを変えて処理する方法をネットで探してみました。

参考サイト：[画面解像度に合わせた、フォントのサイズを指定する]
(http://andante.in/i/android%E3%82%A2%E3%83%97%E3%83%AAtips/%E7%94%BB%E9%9D%A2%E8%A7%A3%E5%83%8F%E5%BA%A6%E3%81%AB%E5%90%88%E3%82%8F%E3%81%9B%E3%81%9F%E3%80%81%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%81%AE%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92%E6%8C%87%E5%AE%9A/)

もろActivity側で書いてあるので、それをstaticなメソッドに変えて、画面サイズの取得方法も、AndroidのAPIのバージョンによって処理を変えてみました。

##画面サイズに合わせた変更方法

基準となるようなstone.png(画面サイズ幅480pxを基準として、480px X 1pxとしました。)をdrawableのディレクトリのなかに仕込ませて、その画像の幅サイズを取得し、実際にアプリを起動させる端末の画面サイズを取得して、その倍率がどれくらいかに合わせて、動的にフォントサイズとかいろいろ変えていくという流れです。

##実装

### 1.stone.pngの仕込み
Photoshopとか、なにかの画像編集ツールをつかって、480px X 1pxの画像をつくり、res > drawable のなかに仕込みます。

###2.レイアウト側
とりあえず、適当にTextViewなんかをおいてみます。

```xml:mypage.xml

<LinearLayout
	android:id="@+id/linearLayout_mypage_welcome"
	android:layout_width="match_parent"
	android:layout_height="80dip"
	android:orientation="vertical" >
<TextView
	android:id="@+id/textView_mypage_welcome"
	android:layout_width="match_parent"
	android:layout_height="wrap_content"
	android:text="ようこそ○○○さん" />
</LinearLayout>

```

###3.プログラム側
setScaleSize(Context context)というstaticメソッドにしました。
これだと、Activityを渡せば、MainActivityに書かないでツール系メソッドのクラス内にまとめられるので、使いやすいです。

画面サイズ取得のメソッド、getWidth()がAndroidのAPIレベル13以降は非推奨になっているので、13より前と13以降で処理を変えています。
Integer.valueOf(android.os.Build.VERSION.SDK_INT) でアプリを起動している端末のAndroidのAPIレベルの数値が取得できるので、取得した値の数値で条件分岐しています。

```java:MainActivity.java

public class MainActivity extends Activity {

	private TextView welcomeText;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.mypage);		
		findView();
		// 指定のテキストビューのテキストサイズに倍率をかける
		welcomeText.setTextSize(14 * setScaleSize(this.getApplicationContext()));		
	}

	public void findView() {
		welcomeText = (TextView) findViewById(R.id.textView_mypage_welcome);
	}
	
	/**
	 * drawableにstone.png（480px×1px）を仕込ませて、幅サイズの基準値にして、
	 * 画面サイズによって拡大縮小の調整をする。
	 * @param context
	 * @return float
	 */
	public static float setScaleSize(Context context) {
		
		//stone.pngを読み込んでBitmap型で扱う
		Bitmap _bm = BitmapFactory.decodeResource(context.getResources(),
				R.drawable.stone);

		float width = 0;
		float _scale = 0;

		//画面サイズ取得の準備
		WindowManager wm = (WindowManager) context.getSystemService(WINDOW_SERVICE);
		Display disp = wm.getDefaultDisplay();

		// AndroidのAPIレベルによって画面サイズ取得方法が異なるので条件分岐
		if (Integer.valueOf(android.os.Build.VERSION.SDK_INT) < 13) {
			Log.d("TEST", "12までのが来てる！");
			width = disp.getWidth();

		} else {
			Log.d("TEST", "13以降が来てる！");
			Point size = new Point();
			disp.getSize(size);
			width = size.x;
			
		}

		_scale = (float) width / (float) _bm.getWidth();
		
		return _scale;
	}	
}

```

以上になります！
Ruby文法まとめ (数値編)

===================

> 参考文献
> 株式会社テクノロジックアート著, 独習Ruby; SHOEISHA

## 基本表記
```rb
	i = 5		# 整数
	f = 3.5		# 浮動小数
	
	i = 0b1000000	# 2進数
	j = 0100		# 8進数
	k = 0x40		# 16進数
	
	p i, j, k		# => [64, 64, 64]
```
	
## 数値クラス
|クラス		| 	説明		|
|:-----:	| :----:	|
|Bignum		| メモリサイズ内であれば無制限に大きな整数 |
|Fixnum		| マシンのポインタサイズ(32bit, 64bit)までの整数 |
|Float		| 浮動小数点 |

## 数値の演算
```rb
	i, j, k = 10, 5, 3
	
	i + j		# => 15
	i - j		# => 5
	i * j		# => 50
	i / j		# => 2
	i % j		# => 1
	i ** k		# => 1000
```

```rb
1 / 0	# => ZeroDivisionError例外が発生
```

## 数値の比較
```rb
5 == 8		# => false
5 != 8		# => true
5 < 3		# => false
5 <= 5		# => true

# 左が大きい時は1、右の時は-1、同じなら0を返す
5 <=> 8		# => -1
5 <=> 3		# => 1
5 <=> 5		# => 0
```

## 演算メゾッド
|メゾッド名|説明|
|---------|------|
|abs|絶対値|
|div, quo|商 (div:整数, quo:実数)|
|modulo, remainder|余り (modulo:引数の符号, remainder:呼び出し側の符号)|
|divmod|divとmoduloを合わせたもの。商と余りが返される|
|ceil, floor|小数点以下の丸め (ceil:元の数値よりも大きい整数, floor:小さい整数)|
|round, truncate|丸め (round:四捨五入, truncate:切り捨て)|

## 数値の判定メゾッド
|メゾッド名|説明|
|--------|---|
|zero?, nonzero?|ゼロ、非ゼロの判定|
|integer?|整数か判定|
|nan?|NaN(Not a number)か判定|
|finite?, infinite?|有限か無限か判定|

## 数値の変換メゾッド
|メゾッド名|説明|
|--------|---|
|to_s|文字列に変換|
|prec_f, prec_i|整数と浮動小数点数の相互変換|

## 数学系メゾッド
```rb
i = 100
Math.log10(i)	# => 2.0
Math.sqrt(i)	# => 10

# 別の使用法
include Math
i = 100
log10(i)	# => 2.0
sqrt(i)		# => 10
```
【メモ】HomeBrewでサービス（デーモン）管理


偶然見つけたのでメモ。
[LaunchRocket](https://github.com/jimbojsb/launchrocket)とか折角インストールしたけどもう要らないかも。

### 使用方法

```
$ brew services

usage: [sudo] brew services [--help] <command> [<formula>]

Small wrapper around `launchctl` for supported formulae, commands available:
   cleanup Get rid of stale services and unused plists
   list    List all services managed by `brew services`
   restart Gracefully restart selected service
   start   Start selected service
   stop    Stop selected service

Options, sudo and paths:

  sudo   When run as root, operates on /Library/LaunchDaemons (run at boot!)
  Run at boot:  /Library/LaunchDaemons
  Run at login: /Users/xxx/Library/LaunchAgents
```


`brew services list`
でサービス一覧表示、
`brew services start サービス名`
でサービス起動など、極めて直感的に操作可能。

### その他
HomeBrewには`brew beer`や`brew services`など`brew --help`に載っていない隠しコマンドが幾つかあるようで、
それらは[ここらへん](https://github.com/Homebrew/homebrew/tree/master/Library/Contributions/cmd)を漁ればあるそうです。


### 参考
- [Starting and Stopping Background Services with Homebrew](http://robots.thoughtbot.com/starting-and-stopping-background-services-with-homebrew)
- [Homebrew service manager | Java Bien!](http://blog.javabien.net/2014/02/27/homebrew-service-manager/)
SyncStitch:Train Gate Controll

[SyncStitch](http://www.principia-m.com/jp/syncstitch.html)を勉強中。
CSP(Communicating Sequential Processes)を論理基盤に持つ、
並行プロセス検証ツール。

Schemeで書けて、軽快に動作する。

以下は、作りかけの電車の遮断機制御プロセス。
遮断機の前後に、電車進入検知器がある、という想定。
このモデルは無条件で全部のプロセスを合成しているため、
ありえない遷移が発生する。

```scm:Definitions
(define-event f.enter)
(define-event f.exit)
(define-event b.enter)
(define-event b.exit)
(define-event c.open)
(define-event c.close)
```

```scm:SYS
(define-channel ch-fc (x) '((0)))
(define-channel ch-bc (x) '((0)))
(define-channel ch-cg (x) '((0) (1)))

(define-process SYS
  (par '() FRONT BACK CTRL-CLOSE))

(define-process FRONT
  (! f.enter (! ch-fc (0) (! f.exit FRONT))))
(define-process BACK
  (! b.enter (! b.exit (! ch-bc (0) BACK))))

(define-process CTRL-CLOSE
    (? ch-fc (x) (! c.open
      (? ch-bc (x) (! c.close CTRL-CLOSE)))))
```
幅広い監視、メトリックツール NewRelic導入手順


メトリック(数字で、変化する状態を分析すること)、メトリックツールは、「あとから入れれば良いや」と思っているとずるずる入れずに過ごしてしまいますよね。そこで、早めにメトリックツール New Relicを、AWSに紐づけて導入しました。


##New Relicとは
http://understeer.hatenablog.com/entry/2012/10/10/140709

##EC2インスタンスを使った、AWS CloudWatchとの連携(gem)
http://kkurahar.github.io/blog/2013/11/10/newrelic-aws/

##ハマった所 Daemon化(サーバプロセスの常駐化)
UpstartというLinuxのプロセス化ツールだとプロセスがすぐ死んでしまったので、
下記のパッチで公開されていた、gem上でなんとかする方法でやりました。

https://github.com/newrelic-platform/newrelic_aws_cloudwatch_plugin/pull/34/files
SQLite のみで UUID 生成する


SQLite には UUID を生成する処理はないが、関数を使い以下のクエリを実行することによって擬似的な UUID (ver.4) を作ることが出来る。

 - ブレースがいらない場合は printf の第一引数を `'%s-%s-%s-%s-%s'` とすること
 - `lower()`, `hex()`, `randomblob()` の関数が必要なので、これらが外されている場合は使えない

```sql
SELECT printf('{%s-%s-%s-%s-%s}',
               lower(hex(randomblob(4))),
               lower(hex(randomblob(2))),
               lower(hex(randomblob(2))),
               lower(hex(randomblob(2))),
               lower(hex(randomblob(6))));
-- => {8edfec23-41ea-1da4-2cec-0fe5f857e17c}
```

生成された UUID は厳密な形式の UUID ではないのであくまでそれっぽい UUID を作りたい場合にのみに実行すること。

これを応用してテーブル作成時に UUID をレコード挿入時に DEFAULT 構文に追加するとレコード挿入時に自動的に UUID を生成してくれる。

```sql
CREATE TABLE uuid_test (
  uuid char(38) NOT NULL DEFAULT(printf('{%s-%s-%s-%s-%s}', lower(hex(randomblob(4))), lower(hex(randomblob(2))), lower(hex(randomblob(2))), lower(hex(randomblob(2))), lower(hex(randomblob(6))))),
  something text NOT NULL
);
```

これを uuid.sql として保存し、SQLite 上に読み込ませて実行すると以下の通りになる。

```bash
sqlite> .read uuid.sql
sqlite> insert into uuid_test (something) values ('foo');
sqlite> insert into uuid_test (something) values ('foo');
sqlite> insert into uuid_test (something) values ('foo');
sqlite> select * from uuid_test;
{30115bbb-559b-a5a8-b385-f5372b5de032}|foo
{21232081-352a-cb09-ae2d-6017d44e2ca7}|foo
{f3117d72-57d4-153f-d945-0a4280ba7f87}|foo
```

レコード挿入時に uuid カラムに対して擬似的な UUID が生成されていることがわかる。
bundleコマンドをバッチファイルから実行すると途中終了する

Windowsで```bundle exec XXX```コマンドをバッチファイルから叩いたら最後まで実行されずに途中で終了してしまった。

具体的には下記のバッチファイルだと```bundle -v```は1回しか実行されない。

```bat
bundle -v
bundle -v
```

バッチファイルからバッチファイルを呼び出すと呼び出し先のバッチファイルが終了したところで処理全体が停止するのが仕様である。
Windowsだとbundleコマンド自体がバッチファイルで実装されているためバッチファイルを呼び出したのと同じような振る舞いをしてしまう。

対処法としてはバッチファイル形式の処理実行前に```call ```をつければ良い。

```bat
call bundle -v
call bundle -v
```
XOOPSのデータ永続化アーキテクチャの概要




XOOPSの永続化アーキテクチャは基本的に、[Data Mapper](http://martinfowler.com/eaaCatalog/dataMapper.html)パターンになっている。サードパーティ製モジュールはそうじゃないものもある。
 
* XoopsObject : データオブジェクトの抽象クラス
* XoopsObjectHandler : マッパー。XoopsObjectをDBに保存したり、DBからXoopsObjectを再構築する抽象クラス

![Astah_-__no_title_____.png](https://qiita-image-store.s3.amazonaws.com/0/889/f2ff2efe-3f94-c3a5-bf0f-b22163dd5ebb.png "Astah_-__no_title_____.png")

XoopsObjectは、ざっくり言うとキーと値から構成されるマップのようなもので、 `get` で値を取得したり、`set` で値を更新したりする。

# XoopsObjectの具象クラス

慣習上XoopsObjectをそのまま使うことはなく、XoopsObjectを継承した具象クラスをデータオブジェクトとして使う。

XoopsObjectの継承関係一覧:

![html_…_object_php_-_xoops_-___Volumes_CaseSensitive_Dropbox_projects_suin_xoops_.png](https://qiita-image-store.s3.amazonaws.com/0/889/12fb02fb-6483-6a07-72c2-66aeeea2df8f.png "html_…_object_php_-_xoops_-___Volumes_CaseSensitive_Dropbox_projects_suin_xoops_.png")

# XoopsObjectHandlerの具象クラス

XoopsObjectHandlerも同様に、XoopsObjectHandlerを継承した具象クラスをマッパーとして使う。

XoopsObjectHandlerの継承関係一覧:

![html_…_object_php_-_xoops_-___Volumes_CaseSensitive_Dropbox_projects_suin_xoops_.png](https://qiita-image-store.s3.amazonaws.com/0/889/14f1495a-5359-3b32-ada4-faf0273d4f8c.png "html_…_object_php_-_xoops_-___Volumes_CaseSensitive_Dropbox_projects_suin_xoops_.png")


# 歴史的な経緯

* XOOPS2.0のころまで: XoopsObject、XoopsObjectHandlerだけだった。
* XOOPS Cube Legacyから: 互換性を重視するため古いORMはそのままにして、XoopsSimpleObject、XoopsObjectGenericHandlerが追加された。

このような歴史的な経緯で、現在は下記図のような継承関係になっている。

![Astah_-__no_title_____.png](https://qiita-image-store.s3.amazonaws.com/0/889/9e99f8ef-e0f6-c450-7363-230b3fd88670.png "Astah_-__no_title_____.png")


XoopsObjectGenericHandlerの継承関係:

![handler_php_-_xoops_-___Volumes_CaseSensitive_Dropbox_projects_suin_xoops_.png](https://qiita-image-store.s3.amazonaws.com/0/889/b6a64c5d-29a8-4c71-e253-c42e1771a6c5.png "handler_php_-_xoops_-___Volumes_CaseSensitive_Dropbox_projects_suin_xoops_.png")



XoopsSimpleObjectの継承関係:

![html_…_object_php_-_xoops_-___Volumes_CaseSensitive_Dropbox_projects_suin_xoops_.png](https://qiita-image-store.s3.amazonaws.com/0/889/0cde0d36-b5fa-e69c-a1f2-7e09475db413.png "html_…_object_php_-_xoops_-___Volumes_CaseSensitive_Dropbox_projects_suin_xoops_.png")

…他多数

# Xoops*Handlerの取得方法

`xoops_gethandler` 関数または、`xoops_getmodulehandler` 関数で取得するのが楽。前者は /html/kernel にあるハンドラーが、後者はモジュール内にあるハンドラーが取れる。

# モジュール作るならXoopsObject? それともXoopsSimpleObject?

結論としては、どちらでもいい。Legacyで追加された、XoopsSimpleObject/XoopsObjectGenericHandlerのほうがAPIが強化されていたり、複製モジュール(D3)に対応しているという違いがあるだけ。
sshで踏み台経由時のショートカット


##リモートホストでコマンドの実行

リモートホストAにコマンドを実行したいとき
```````````````
$ ssh hoge@hostA "実行したいコマンド"
```````````````

で,この場合ホストAにssh接続してさらにコマンドを実行させることができる.

これを使って,踏み台経由でsshする際,ショートカットできないか試してみる.

##通常の踏み台経由でのssh接続

例えばhostAは外部ネットワークからssh接続する際に踏み台サーバであるhostBを経由する必要があるとすると
```````````````
local$ ssh hoge@hostB
hostB$ ssh hoge@hostA
hostA$
```````````````

と,2段階に分けてssh接続作業をしなければならない.

##$ ssh hoge@hostA "実行したいコマンド"を応用
そこで
````````````````
$ ssh hoge@hostB "ssh hostA"
````````````````
で,ssh接続したhostBにおいてhostAへのssh接続コマンドを実行させてみる

以下のエラーが発生
````````````````
Pseudo-terminal will not be allocated because stdin is not a terminal.
````````````````

Pseudo-terminalとは疑似端末のことで,それが割り当てられていないとのこと.
一回ぽっきりのコマンド実行のために模擬端末を割り当てない仕様になっている.

##-tオプション

というわけで,模擬端末を割り当ててやる必要がある.

```````````````
local$ ssh -t hoge@hostB "ssh hostA"
hostA$ 
```````````````
-tオプションをつけてやることで,コマンドを実行する際に模擬端末をつけてやることができる.
brew cask alfred linkが失敗するときの対処

### 問題

[Mac - homebrew-caskでインストールしたアプリをalfredから呼び出すときのメモ - Qiita](http://qiita.com/kametaro/items/942cafd910fc7989be3a)

を参考に設定していたところ、何故か以下のように…
成功しました！→linkされてません
という謎現象発生。

```
$ brew cask alfred link
==> Successfully linked Alfred to homebrew-cask.
```
↓

```
$ brew cask alfred status
==> Alfred is not linked to homebrew-cask.
```

### 解決

alfredの設定画面
↓
Features
↓
Default Results
↓
Search Scope
↓
/opt/homebrew-cask/Caskroom/ を追加

```
$ brew cask alfred status
==> Alfred is happily linked to homebrew-cask!
```

となったので、やってる事は同じのようです。
プロキシ環境のCentOSにAnsibleをインストールする方法メモ

※まだpingしか試してないので他に必要なのあるかも

```
export http_proxy=http://
export https_proxy=https://
curl -O http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -ivh epel-*.rpm
yum install ansible
yum install openssh-clients
```

または

```
export http_proxy=http://
export https_proxy=https://
curl -O http://python-distribute.org/distribute_setup.py
python distribute_setup.py
easy_install pip
yum install gcc
yum install python-devel
pip install ansible
yum install openssh-clients
```
Android GALAXY S4で標準ブラウザなのにUAに「Chrome」と書いてあるのをみやぶるコード


S4の標準ブラウザのWebAudioがどうもおかしく、検出しようと思ったらできなかったので書いておきます。

詳しくはこちら  
[GALAXY S4の標準ブラウザのUAに『Chrome』と書かれている件について](http://www.rainorshine.asia/2013/06/03/post2422.html)


## 違いは「Version」があるかないか

UAに

* SC-04Eが含まれてて
* Versionがあれば
* Androidの標準ブラウザ


## コード

``` isS4Browser.coffee
isS4Browser = ua.indexOf('SC-04E') > -1 and ua.indexOf('Version') > -1
```

そのへんのAndroidやChrome検出のコードをこれで上書きすればおk！


## 以下、証拠スクショ
標準ブラウザに 「Chrome」と書いてある…。

標準ブラウザ  
![Screenshot_2014-03-31-20-15-50_png__1080×1920_.png](https://qiita-image-store.s3.amazonaws.com/0/2631/f0ddaac7-319b-8b00-4ec4-a6ea73b28566.png "Screenshot_2014-03-31-20-15-50_png__1080×1920_.png")


Chrome  
![Screenshot_2014-03-31-20-18-19_png__1080×1920_.png](https://qiita-image-store.s3.amazonaws.com/0/2631/e1645196-eb80-6788-b0f2-6d919aeb0519.png "Screenshot_2014-03-31-20-18-19_png__1080×1920_.png")
#innobackupex でテーブル指定してバックアップ→リストア

XtraBackupというかinnobackupexでフルバックアップは分かるんだけど、テーブル指定する方法をよく忘れるのでメモ。
参考：[Percona XtraBackupの基本的な使い方 | 外道父の匠](http://blog.father.gedow.net/2012/09/24/how-to-percona-xtrabackup/)

----

## バックアップ

```shell-session
# innobackupex --user=$USER --password=$PASSWORD --tables-file=/path/to/tables.file /path/to/backup
```

`--tables-file`オプションで指定するファイルの内容はこんな感じ。

```shell-session
database_name.table_name_0
database_name.table_name_1
database_name.table_name_2
```

バックアップが完了すると`/path/to/backup`内に`yyyy-mm-dd_hh-mi-ss`みたいなディレクトリができる。

## (Optional)転送

バックアップ取得ホストとリストア先が違う場合はこんな感じで転送すればよいと思います。

* 踏み台ホストを経由して転送する例：

```shell-session
tar zcv yyyy-mm-dd_hh-mi-ss | ssh $REMOTE_HOST_A -A "ssh $REMOTE_HOST_B -l$REMOTE_USER -A 'tar xvf - -C /path/to/work_dir'"
```

## リストア

```shell-session
# /etc/init.d/mysqld stop
# rm -rf /var/lib/mysql/*
```

フルバックアップと違ってバックアップディレクトリに`my.cnf`が含まれないので、`--defaults-file`の指定が必須、たぶん。

```shell-session
# innobackupex --defaults-file=/etc/my.cnf --user=$USER --password=$PASSWORD --apply-log -export /path/to/backup/yyyy-mm-dd_hh-mi-ss
# innobackupex --defaults-file=/etc/my.cnf --user=$USER --password=$PASSWORD --copy-back /path/to/backup/yyyy-mm-dd_hh-mi-ss
# chown -R mysql:mysql /var/lib/mysql
```

```shell-session
# mysql_install_db --user=mysql
# mysql_secure_installation
```
realpath関数の相対パス取得版

```php
function relativepath($dst) {
    switch (false) {
        case $src = getcwd():
        case $dst = realpath($dst):
        case $src = explode(DIRECTORY_SEPARATOR, $src):
        case $dst = explode(DIRECTORY_SEPARATOR, $dst):
        case $src[0] === $dst[0]:
            return false;
    }
    $cmp =
        DIRECTORY_SEPARATOR === '\\' ?
        'strcasecmp' :
        'strcmp'
    ;
    for (
        $i = 0;
        isset($src[$i], $dst[$i]) && !$cmp($src[$i], $dst[$i]); 
        ++$i
    );
    return implode(
        DIRECTORY_SEPARATOR,
        array_merge(
            array('.'),
            ($count = count($src) - $i) ?
                array_fill(0, $count, '..') :
                array()
            ,
            array_slice($dst, $i)
        )
    );
}
```
.htaccessでサイトをメンテナンスモードに


```.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !\maintenance.html$
RewriteCond %{REMOTE_ADDR} !^***\.***\.***\.***$
RewriteRule ^(.*) /maintenance.html [R,L]
</IfModule>
```

自分だけは見れるように、%{REMOTE_ADDR} の "***" にあなたのIPアドレスを入れるといいですよ。

何ともタイムリーですね。来年強襲してくるという噂の怨敵「10％」の時のためにもメモメモ。今宵は長そうです。
Rails 4 で TinyMCE を使う時の注意点


自分用メモです。環境によって多少は異なります。
なお、[jquery-turbolinks](http://kray.jp/blog/must-know-about-turbolinks/)が入っている環境です。

## data-turbolinks-track を有効にする

assets 呼び出しをベタ書きで修正　

```rhtml:修正前
<%= tinymce_assets %>
```

```rhtml:修正後
<%= javascript_include_tag 'tinymce', 'data-turbolinks-track' => true %>
```
変更されてないバッファーを全部閉じる el

変更されてないバッファーを全部閉じる。ただし、\*..\.* 名（*scratch* など）は除く。

```el
(defun my-close-all-unmodified-buffer ()
  (interactive)
  (let ((buffers (buffer-list)))
    (mapcar
     #'(lambda (buf)
         (if (and (not (buffer-modified-p buf))
                  (not (string-match "^\\*.+\\*$" (buffer-name buf))))
             (kill-buffer buf)))
     buffers)
    ))
```
Zabbixでログ監視

#Zabbixでのログ監視の自分的設定メモ
すぐに忘れてしまうのでこちらに残しておきます。

アプリ系のログは通常はfluentdを使ってログをゴニョゴニョしてメールを飛ばしているが
システム系ログをZabbixで監視設定した時のメモ。テンプレートにすれば楽なので。

ポイントは普通に設定してしまうと監視対象のログの全メッセージが
Zabbixに格納されてしまい、無駄に容量食うので必要なキーワードだけを監視対象にしたい。


#前提
前もってZabbixがroot権限で実行できるように/etc/zabbix/zabbix_agentd.conf内の# AllowRoot=0をコメントインしておく。

 # AllowRoot=0
 ↓↓↓
 AllowRoot=1

#メモ
1. GUIでZabbixサーバへログインし、管理 -> 一般設定 -> GUIの設定 -> 正規表現 -> 正規表現の作成
2. 条件式を下記のように設定

名前              ：messages ※任意
条件式            ：error|warn|fail|fatal|ERROR|WARN|FAIL|FATAL ※任意
条件式の形式       ：結果が真
大文字小文字を区別  ：いいえ ※この条件だと「いいえ」にしても大文字小文字が区別されないので注意

![zabbix-server- 正規表現の設定.png](https://qiita-image-store.s3.amazonaws.com/0/24044/9529f9a8-681d-c224-a451-173c54bda5ce.png)


3.2で設定した条件式をテスト
テスト文字列へ条件式で設定した文言のうち例として「error」を入力し、テスト条件式をクリックし確認する

最終結果が真であれば動作OK

![正規表現のテスト.png](https://qiita-image-store.s3.amazonaws.com/0/24044/23411cac-075f-bd68-e4e7-a29d1415a848.png)


4.アクションの設定、
設定 -> テンプレート -> ＜任意のテンプレート＞アイテム ->  アイテムの作成

名前            ：ログ監視(/var/log/messages)
タイプ          ：Zabbixエージェント(アクティブ)
キー            ：log[/var/log/messages,@messages]
データ型        ：ログ
更新間隔(秒)    ：30 ※任意
ヒストリ保存期間：90 ※任意

![zabbix-server- アイテムの設定.png](https://qiita-image-store.s3.amazonaws.com/0/24044/ad7b6b7e-7af6-6d5e-af6d-bcd90a724939.png)


5.トリガーの設定、
アイテム ->  ログ監視(/var/log/messages)右側メニューから「トリガーの作成」を選択

名前  ：ログ監視(/var/log/messages) on {HOST.NAME}
条件式：({Template OS Linux:log[/var/log/messages,@messages].iregexp(@messages)})#0&({Template OS Linux:log[/var/log/messages,@messages].nodata(300)})=0

![zabbix-server- トリガーの設定追加.png](https://qiita-image-store.s3.amazonaws.com/0/24044/cc7b5bd4-743d-a7b5-438e-7f73a5fe9e1c.png)

6.loggerでテスト
logger -p user.warn -t [TEST] "logger test \"warn\""
監視データのヒストリに格納され、アクションでメールが飛べば想定通りの動き

logger -p user.warn -t [TEST] "logger test \"hoge\""
これは正規表現にマッチしないのでヒストリに格納されない。想定通りの動き
InputTouches(Asset)でイベント登録後は後処理に注意

※InputTouchesやイベントに限らずstaticなものは後処理に注意です。

タッチ・ジェスチャー検出などに使ってるInputTouchesというAssetでは、

```csharp
Gesture.onShortTapE += onTap;
Gesture.onSwipingE += onSwiping;
```

のようにイベント登録しますが、staticなイベント登録になるので登録したクラスをもつGameObjectがDestroyされたタイミングで

```csharp
void OnDestroy () {
    Gesture.onShortTapE -= onTap;
    Gesture.onSwipingE -= onSwiping;
}
```

のようにイベントを削除しないと、削除されたはずのGameObjectに対してイベントが呼び出されてしまいエラー(MissingReferenceException)になってしまいます。

※追加(2014/03/31)
正確にはそれだけではエラーになりませんが、その中で削除済みのものを参照時点でエラーになります。どちらにせよ期待する挙動ではないはずです。
sshの公開鍵をさくっと取得するスクリプト


参考ブログ: http://blog.id774.net/post/2013/12/16/441/

ということらしい。

僕は時々しかやらない作業なんだけど、時々やることは大体覚えていられないのでとりあえずなんかいい感じにアレ出来るスクリプトにしておく。

なんとなくgitのサブコマンドにしておいて、`git hub-pubkeys` みたいな感じで取得出来ればいいかなとおもった。

```bash:git-hub-pubkeys
#/bin/sh -u
set -e

readonly DEFAULT_USER='hachibeeDI'

if [ $# -ge 2 ]; then
  echo 'too much arguments'
  exit 1
fi

if [ -z $1 ]; then
  readonly USER_NAME=$DEFAULT_USER
else
  readonly USER_NAME=$1
fi

readonly GITHUB_PUBKEY_API="https://github.com/${USER_NAME}.keys"
curl $GITHUB_PUBKEY_API
```

curlってどこにでも入ってるコマンドなのかな？ シェル力とか低いのでよくわかりません。アレな場合はwgetとかで書き換えると良いのかもしれない。

DEFAULT_USERは適当に各自のIDにして、引数なしで呼べばそれが出て、IDを引数にして呼べばそのIDの公開鍵が吐き出される。
あとは`~/.ssh/authorized_keys`とかにリダイレクトしよう。
おしまい。
smartparens.elをストレスなく使う

smartparens.elは対応カッコの自動挿入や選択範囲をカッコで囲むなど便利なelispです。

しかし、いつの間にかEmacsでカーソルを動かすだけで少しフリーズするようになり、その原因がsmartparens.elだということがわかりました。

次の機能を使わなければ、他の良い機能は快適に使い続けられるかと思います。

## 原因1 対応カッコのハイライト機能
`show-smartparens-global-mode`を有効にしているとかなり重くなるので現状使わないほうがいいかもしれません。
`smartparens-global-mode`だけ有効にしています。

```el
(smartparens-global-mode)
;; (show-smartparens-global-mode)
```

## 原因2 対応カッコの削除機能
`[DEL]`キーもしくは`[C-h]`に当てられている`delete-backward-char`にadviceをかけられて削除するたびにフリーズしてしまいます。これを無効化します。

```el
(ad-disable-advice 'delete-backward-char 'before 'sp-delete-pair-advice)
(ad-activate 'delete-backward-char)
```

## おわりに
対応カッコの表示には代わりにEmacs内蔵の`show-paren-mode`を使っています。
この機能はEmacs 24.4からもっと賢くなるようですね。
http://emacsredux.com/blog/2013/12/31/a-peek-at-emacs-24-dot-4-smarter-show-paren-mode/
BouncyCastle: RSAのプライベートキーをパラメータから生成


プライムとCRTパラメータが無い場合は、RsaKeyParameter(true) で生成すること！
それ以外はRsaPrivateCrtKeyParameters()(こっちの方が処理が速い)


```csharp

        public static RsaKeyParameters ToRsaPrivateKey(this Jwk jwk)
        {
            System.Diagnostics.Debug.Assert(jwk.kty == Jose.Jwa.KeyType.RSA);

            // Private Key
            if( jwk.p == null )
            {
                return new RsaKeyParameters(true,
                    jwk.n, jwk.d);
            }
            return new RsaPrivateCrtKeyParameters(
                        jwk.n, // Modulus
                        jwk.e, // Pulbic Exponent
                        jwk.d, // Private Exponent  
                        jwk.p, // 1st Prime
                        jwk.q, // 2nd Prime
                        jwk.dp, // 1st Factor CTR exponent
                        jwk.dq, // 2nd Factor CTR exponent
                        jwk.qi  // 2nd Factor CTR exponent
                        );
            //TODO: "oth" (Other Prime Info パラメータ)はどうする？
                        
        }
```
NewtonSoft.Json: 型に定義されていないフィールドを辞書に入れる


タイプシリアライザで処理されないフィールドをJTokenで辞書にいれるので、Linq が必要:

```csharp

    using Newtonsoft.Json;
    using Newtonsoft.Json.Converters;
    using Newtonsoft.Json.Linq;
```

Number, Name を受け付ける。 id はJsonにしない。 
定義しないフィールドは Extends の辞書に入れる。::


```csharp

        public class MyToken 
        {
            [JsonIgnore]
            public int? id {get;set;}
            public int Number { get; set; }
            public string Name { get; set; }

            [JsonExtensionData]
            public IDictionary<string, JToken> Extends;

        }
```
        
テスト:

```csharp
        
        [TestMethod]
        public void TestSerializerExtensible()
        {

            var token_str = @"
            { ""Number"": 432143, ""Name"" : ""Hoge Hoge"", ""http://hoge.com/"" : true, ""id"":35 }
            ";

            var token =  JsonConvert.DeserializeObject<MyToken>(token_str);

            Assert.AreEqual(token.Name, "Hoge Hoge");
            Assert.AreEqual(token.Number, 432143);
            Assert.IsNull(token.id);

            token.id = 1;
            Assert.IsTrue(token.Extends["http://hoge.com/"].ToObject<bool>());
            Assert.AreEqual(token.Extends["id"].ToObject<int>(), 35);
            Assert.AreEqual(token.id, 1);

        }
```
hashコマンドって何？

#コマンドが叩かれると（ちょっと嘘）
* コマンドを検索します。
* 取り敢えず環境変数PATHに格納されている場所順にコマンドを検索していくとしましょう。
* ちなみに我が家の環境ではこんな感じになってます

```bash:$PATH
$ echo $PATH | tr : \\n
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
```

上から順々に検索していきますが、毎度毎度検索するのは全く無駄ですね。
という訳でハッシュテーブルの登場です。

#ハッシュテーブルには何が
* お察しの通りだと思いますが、見つかったコマンドの場所をメモしておきます。

#コマンドが叩かれると（本当は）
* 先にハッシュテーブルにコマンド（とそのパス）があるかどうか確認する
* なければ環境変数PATHに格納されている場所から順々に検索する
* 見つかれば実行
* ハッシュテーブルに登録する事も忘れない

#ハッシュテーブルの中身を確認するには
* `hash`コマンドを引数無しで実行すればおｋ

```bash:ハッシュテーブルの確認
$ hash
hits	command
   2	/usr/bin/git
   1	/bin/mv
   1	/bin/cp
   4	/bin/ls
```

ただし左側の数字は実行回数
Railsの404,500エラーページをカスタマイズ


Railsはエラーページをもともと用意してくれていて本番で動かすと
そこに飛ばしてくれるので、まぁいいっちゃいいのですが、
簡単に設定できるのでやってしまえばいいかと。
（レイアウトとかそのまま使えてサイト内ページっぽくなるし）
  

- - -

■環境
Rails 4.0.3
Ruby 2.1.1

- - -
  


とりあえずローカルで見たいのでWEBric(rails s)を本番設定で起動して確認します。
（developmentのままだといつもの赤いページが表示されます）

まず、ActionController::RoutingErrorを拾うためにroutesに設定が必要です。

```ruby
# config/routes.rb

# どこにも当てはまらなかったものを取得するので最終行に書いて下さい。
get '*path', to: 'application#render_404'

```

次にapplicationコントローラに設定を書きます。

```ruby

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  rescue_from ActiveRecord::RecordNotFound, with: :render_404
  rescue_from ActionController::RoutingError, with: :render_404
  rescue_from Exception, with: :render_500

  def render_404(exception = nil)
    if exception
      logger.info "Rendering 404 with exception: #{exception.message}"
    end
    render template: "errors/error_404", status: 404, layout: 'application'
  end

  def render_500(exception = nil)
    if exception
      logger.info "Rendering 500 with exception: #{exception.message}"
    end
    render template: "errors/error_500", status: 500, layout: 'application'
  end
end

```

あとはviews以下にerrorsディレクトリを作ってそれぞれ
error_400.slim(haml)とerror_500.slimを置いて
好きなようにデザインして下さい。


applicationコントローラじゃなくてerorrsコントローラとかにしたいとかは
適当にパスを書き換えればできます。
オリジナル「LINEで送るボタン」は不可

備忘録
下記、ガイドラインにあるように
オリジナル画像は不可です。
テキストは可です。

(2) 設置者は、LINEで送るボタンを外部サイトに設置する場合、専用アイコンを使用しなければなりません。但し、設置者は、専用アイコンの代わりに「LINEで送る」又は「LINE」というテキスト文字を使用することができます。

参考URL:
http://media.line.me/guideline/ja/
3/31日のJavaScript学習内容

text:独習JavaScript

本日の学習内容
3.8-4.5の練習問題
7.1-7.2

少しですが、新しい範囲に入って、新たに、よりWebページ作成についての発展的な内容を勉強することができました。
この範囲を学ぶことによって文字の入力ホームや、ボタンやマウスの動きなどで様々な画面操作を作ることができます。
多くのWebページを作るにあたって、各イベントハンドラはこれからも沢山使うと思うのでしっかり覚えていきたいと思います。
このテキスト自体は半分と少し程度しかまだ終わっていませんが、
全体的にJavaScriptの構文の基本は学べたと思っています。
しっかり応用できるようなスキルをもっと身につけていきたいです。
HaroopadでSyntax Helpを表示する（ショートカットキー）

#Haroopadって
* とっつきやすいMarkdownエディタです。

#Markdownって
* 文書を記述するための軽量マークアップランゲージのひとつ
* プレーンテキストをそれっぽくかっこよく修飾するのに便利


#でも
* Markdownの書き方なんてそんなすぐ覚えられない＞＜

#Show Syntax Help
* という便利な機能があって、画面左端にSyntax Helpを表示してくれます。
* Haroopadさんステキ！

#勿論ショートカットキーあるよね？
* あります。
* Ctrl+Shift+H


- - -

ショートカットキーが書きたかっただけなんだよねこの記事
Mavericksにして死んだものと、蘇生方法


先週末、もろもろの事情によりMacのOSをMavericksにアップデートしたので、
そのとき発生した問題と解決のメモ。

結論から言えば、 **全部がんばれば直ります**。
なので、がんばれるときにやった方がいい。

ちなみにおかげで、[Lobic Pro X](http://www.apple.com/jp/logic-pro/)が使えるようになった。うふふ。


## 何より先に

 - ```xcode-select install``` で、xcodeのコマンドラインツールをいれた方がいい
 - mountain-lion以前と違い、XCode起動してインストールする形じゃないので注意

## 各種ソフトウェアの現象と解決


### virtualbox
 - アプリ自体は動くけど、VMの起動ができない
 - → 丁度アプリのアップデート来てたので、アップデート(というか再インストール)したら直った
 - VMの設定など無事

### genymotion
 - 起動できなかったけど、virtualboxなおしたら復活

### Emacs
 - 起動できるけど、 ```package.el``` が使えなくなってて、 ```(package-initialize)```でコケる
 - → 再インストールしたら直った
 - [cleane](http://github.com/fnobi/cleane)作っといてよかった

### tree

 - コマンド自体消滅してた
 - こういうのも消えるんだ…
 - → brewで再インストール、で解決


### mysql
 - mysqlコマンド自体が消滅してた
 - → インストールし直し
 - apacheとかphpの設定も書きなおす必要ありで面倒

### imagemagick, ffmpeg
 - 実行はできるけどコケる
 - → コケた時に、「XXXが見つからない」的なメッセージが出るので、そいつらをbrewで入れなおす
   - ```libpng```とか```libtool```とか


### sass
 - まったく通らなくなってた (もちろんcompassも同様)
 - → sassを再インストールしようとするも通らないので、めんどくさくてrubyごと再インストール… (```rvm install 2.1.1```)

### Eclipse
 - 一番カオスってた。現象ぜんぶは覚えてないけど、とりあえずビルド通らない
 - 自分の場合は、即Java自体のアップデート求められて、応じちゃったので、Eclipseというよりはそちらの問題っぽい
 - 基本的には、[Help] → [Install New Software...]から、よしなに最新設備を入れつつ、勝手に設定書き換わってるっぽいところを、ずんずん直していく感じ
 - エラーでググっても、状況によりけりでいろんな解決方法あるので、正しいものかを判別するのが大変だった。
   - 実際、いくつか間違った対応して墓穴を掘ってたっぽい

## まとめ

 - めんどくしゃい!!!
 - せめてHomebrew周りはどうにかなんないのかなー
TweetVimを使う

#TweetVimってなに
* https://github.com/basyura/TweetVim
* `vim`からTwitter見たりツイートできたり色々できるよ
* 他のプラグインとの連携とか便利

#導入
##`vim`入ってなければ入れる

```bash:vimのインストール
$ sudo apt-get install vim
```

##プラグイン管理のプラグインを入れる
`Vundle`です

```bash:Vundleを入れる
$ git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle
$ echo "source ~/.vim/bundle/vundle/test/minirc.vim" >> ~/.vimrc
```

##`Vundle`を使ってTweetVimとそれに必要なプラグインを導入

```bash:~/.vim/bundle/vundle/test/minirc.vim
Bundle 'basyura/TweetVim'
Bundle 'mattn/webapi-vim'
Bundle 'basyura/twibill.vim'
Bundle 'tyru/open-browser.vim'
Bundle 'h1mesuke/unite-outline'
Bundle 'basyura/bitly.vim'
Bundle 'Shougo/unite.vim'
 
filetype plugin indent on
```

編集後にVimコマンド`:BundleInstall`を実行してインストールする

##`curl`が必要らしいので入れる

```bash:curlを入れる
$ sudo apt-get install curl
```

以上で導入は取り敢えず完了

#使い方
##何をするにもまずは認証
* `Vim`起動後Vimコマンド`:TweetVimHomeTimeline`でHomeTimelineを表示させる
* まだ認証してないから表示できない
* 自動でブラウザでOAuth認証のためのページが表示される
* PINが貰えるので待ち受けてるTweetVimに教えてあげる
* 認証が完了すればHomeTimelineが表示される

###認証したユーザを削除したい場合には
`~/.tweetvim/accounts/`の中にユーザごとの認証情報のデータがあるので、ユーザ名のディレクトリごと削除すれば良い

##あとはコマンドで色々できます
###HomeTimelineを表示
`:TweetVimHomeTimeline`
###Mentionを表示
`:TweetVimMentions`
###ツイート
`:TweetVimCommandSay メッセージ`
引数としてメッセージを渡せばいいけど、引数がない場合はプロンプトが表示される

##UserStreamできる
らしいんだけどよくわかりません

#ぶっちゃけ
ここ見るより[https://github.com/basyura/TweetVim](https://github.com/basyura/TweetVim)の方がわかりやすい
docker push 再開

`docker push` をインハウスとかでやって時間が掛かりすぎて憤死し、C-cとかで中断した場合、再度プッシュしようとすると

```
2014/03/31 06:58:35 Error: push docker-index.tokyo.pb/botbox is already in progress
```

って言われる。

### 直しかた

`sudo service docker restart` って言う複雑なコマンドを発行すれば、なんとか再度プッシュできるようになった。

ウヴォー
maven s2jdbc-gen 連携

# pom.xml

```xml:properties
<properties>
    <s2framework.version>[2.4,2.5)</s2framework.version>
    <maven.package>${project.groupId}.${project.artifactId}</maven.package>
</properties>
```

```xml:dependencies
<dependency>
    <groupId>org.seasar.container</groupId>
    <artifactId>s2jdbc-gen</artifactId>
    <version>${s2framework.version}</version>
    <scope>provided</scope>
</dependency>
```

# s2jdbc-gen-build.xml の 修正

```diff:maven-repository参照
<project name="s2jdbc-gen" default="gen-ddl" basedir=".">
+ <import file="maven-build.xml"/>
  <property name="rootpackagename" value="rootpackage" />
```

```diff:maven連携
+<property name="rootpackagename" value="${maven.package}" />
-<property name="rootpackagename" value="com.example.apps" />
 <property name="entityfilepattern" value="**/*.java" />
 <property name="env" value="ut" />
 <property name="jdbcmanagername" value="jdbcManager" />
-<property name="projectName" value="project" />
+<property name="projectName" value="${maven.build.finalName}" />
-<property name="classpathdir" value="target/classes" />
+<property name="classpathdir" value="${maven.build.outputDir}" />
 <property name="entitypackagename" value="entity" />
 <property name="namespackagename" value="names" />
-<property name="javafiledestdir" value="src/main/java" />
+<property name="javafiledestdir" value="${maven.build.srcDir.0}" />
-<property name="testjavafiledestdir" value="src/test/java" />
+<property name="testjavafiledestdir" value="${maven.build.testDir.0}" />
 <property name="javafileencoding" value="UTF-8" />
 <property name="version" value="latest" />
 <property name="sqlfilepattern" value="META-INF/sql/**/*.sql" />
 <property name="applyenvtoversion" value="false" />
 <property name="uses2junit4" value="false" />
```


```diff:classpathref変更
 <path id="classpath">
    <pathelement location="${classpathdir}" />
+   <path refid="build.test.classpath"/>
-   <fileset dir="lib">
-      <exclude name="lib/sources/**" />
-   </fileset>
-   <fileset dir="src/main/web/WEB-INF/lib">
-      <exclude name="src/main/web/WEB-INF/lib/sources/**" />
-   </fileset>
 </path>
brew update でundefined method `to_sym' for nil:NilClass時の対処

`HomeBrew`はMacOS上でパッケージ管理を肩代わりしてくれる愛いやつ。
`brew update`でなにかエラー出た時は、以下のコマンドで対処しましょう。

## 対処コマンド

```
$ brew doctor
```

お医者さんです。あとは出力されたメッセージを見つつ順番に対処していきましょう。
以下は、自分の時の対処手順です。

## brew update
```
$ brew update
Error: undefined method `to_sym' for nil:NilClass
Please report this bug:
    https://github.com/mxcl/homebrew/wiki/troubleshooting
/usr/local/Library/Homebrew/cmd/update.rb:103:in `report'
/usr/local/Library/Homebrew/cmd/update.rb:101:in `each_line'
/usr/local/Library/Homebrew/cmd/update.rb:101:in `report'
/usr/local/Library/Homebrew/cmd/update.rb:23:in `update'
/usr/local/Library/brew.rb:95:in `send'
/usr/local/Library/brew.rb:95
```

なんかでたのでとりあえずお医者さん出動

## brew doctor

```
$ brew doctor
Warning: /Library/Frameworks/Mono.framework detected
This can be picked up by CMake's build system and likely cause the build to
fail. You may need to move this file out of the way to compile CMake.

Warning: No developer tools installed.
You should install the Command Line Tools.
Run `xcode-select --install` to install them.
BIZ2013-0063:~ nishiyama$ xcode-select --install
xcode-select: note: install requested for command line developer tools
```

## Warningへの対処
出力されたWarningは2つ。
* Warning: /Library/Frameworks/Mono.framework detected
* Warning: No developer tools installed.

### Warning: /Library/Frameworks/Mono.framework detected

詳細メッセージは以下のとおり

```
This can be picked up by CMake's build system and likely cause the build to
fail. You may need to move this file out of the way to compile CMake.
```

意訳すると「CMake時に失敗するかもしれないからどっか他に置け」

MonoFrameworkはMacやLinux上で.netFrameworkを動作させるものだけど一先ず使わないので消すことに。（使う場合は移動させてリンクや環境変数変えたりとかで対処するのだと思います）

ここに書いてあるUninstall用シェルを実行。
http://www.mono-project.com/Mono:OSX

```bash
#!/bin/sh -x

#This script removes Mono from an OS X System.  It must be run as root

rm -r /Library/Frameworks/Mono.framework

rm -r /Library/Receipts/MonoFramework-*

for dir in /usr/bin /usr/share/man/man1 /usr/share/man/man3 /usr/share/man/man5; do
   (cd ${dir};
    for i in `ls -al | grep /Library/Frameworks/Mono.framework/ | awk '{print $9}'`; do
      rm ${i}
    done);
done
```

### Warning: No developer tools installed.

詳細メッセージは以下の通り

```
You should install the Command Line Tools.
Run `xcode-select --install` to install them.
MAC-PC:~ user$ xcode-select --install
xcode-select: note: install requested for command line developer tools
```

意訳すると「command line developer tool入れろ」

メッセージにあるコマンドを実行してインストール。

```
$ xcode-select --install
```

## 再度 brew doctor

```
$ brew doctor
Your system is ready to brew.
```

これで `$ brew update` 通りました。
FluentdからElastic Searchへ投入するデータの型を変換する

FluentdからElastic Searchへ投入するデータの型を変換する
===

元々やりたかった事
---
* apacheのアクセスログをfluentdで取り込んでElastic Searchに投入してKibanaで分析したい
* アクセスログはちょっと形式をいじってレスポンスタイムが記録されるようになっている
* ElasticSearchで10秒以上とか遅いアクセスを抽出したい

困った事
---
* 標準のapacheのログ形式は使えないので自前で下記の感じで正規表現を定義

``` fluent.conf
<source>
  type tail
  format /^(?<host>[^ ]*) - - \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (
?<code>[^ ]*) (?<size>[^ ]*) (?<restime>[^ ]*) (?<resstate>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<
agent>[^\"]*)")?.*$/
  path /path/to/access.log
  time_format %d/%b/%Y:%H:%M:%S %z
  tag apache.access
</source>
```
* restimeというキーでレスポンスタイムがでるのだけど、文字列型でElastic Searchに登録されてしまい、大小比較が辞書式になってしまっている
* どうも標準の形式を使うと自動的に型変換されるけど、正規表現でカスタムの定義をすると全部文字列型になってしまうらしい

対応案１：Elastic Search側で変換する（失敗）
---
* Elastic Search側でマッピングを指定することができるらしい
  * http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-core-types.html
  * 試してみたけどなぜかうまくいかない

対応案２：fluentd側で変換する（成功）
---
* fluentdのプラグインで[fluent-plugin-typecast](https://github.com/tarom/fluent-plugin-typecast)というのを発見
* 下記の感じで適用
    * item_typesという項目でマッピングを記述する

```
# gem install fluent-plugin-typecast
```

``` fluent.conf
<match apache.access>
  type typecast
  item_types restime:integer
  prefix typed
</match>

<match typed.apache.access>
  type elasticsearch
(snip)
</match>
```

結果
---
* 無事変換できました。
* こんな↓感じでKibanaからクエリ投げると10秒以上のレスポンスのアクセスを抽出できました。

```
restime:[10 TO *]
```

おわりに
---
ElasticSearch側のmappingで解決できなかった謎は解けなかったけどよしとします