OmniAICreator/Qiita-1.07M huggingface dataset:
JavaでReflection　第一回:コンストラクタ編


<h2>はじめに</h2>
javaを使ったアプリ開発でちょくちょくリフレクションを使用するけど、
いままで何となく使用していたので、備忘録変わりに今後複数回に分けて文書に
まとめてみようと思う。

<h2>本文</h2>
さて、今回は「第一回: コンストラクタ」編ということでコンストラクタを使用して
インスタンスを生成する方法について記載する。
検証用にBeanクラスとReflectionTestクラスを作成する。
ReflectionTestクラスから、Beanクラスで定義したコンストラクタを使用して
リフレクションによりインスタンスを生成するといった流れ。

```java:Bean.java
public class Bean {

	public Bean(){
		this.pubVar = "default pubVar";
	};

	public Bean(String pubVar){
		this.pubVar = pubVar;
	};

	@SuppressWarnings("unused")
	private Bean(String[] args) {
		this.pubVar = args[0];
	}
	// instance var
	public String pubVar;
}
```
```java:ReflectionTest.java
import java.lang.reflect.Constructor;


public class ReflectionTest {

	public static void main(String []args) throws Exception {

		// ①引数なしのコンストラクタを使用してインスタンス生成
		Bean bean = Bean.class.newInstance();
		System.out.println(bean.pubVar);	// 	default pubVar

		// ②引数ありのコンストラクタを使用してインスタンス生成
		bean = Bean.class
				.getConstructor(String.class)
				.newInstance("引数ありコンストラクタの検証");
		System.out.println(bean.pubVar);	// 引数ありコンストラクタの検証
		
		// ③private コンストラクタを使用してインスタンス生成
		Class<?>[] params = {String[].class};
		Constructor<Bean> constructor = Bean.class
				.getDeclaredConstructor(params);
		constructor.setAccessible(true);
		bean = constructor
				.newInstance(new Object[]{new String[]{"プライベートコンストラクタの検証"}});
		System.out.println(bean.pubVar);	// プライベートコンストラクタの検証
	}
}

```

<h3>①引数なしのコンストラクタを使用してインスタンス生成</h3>
[newInstance()](http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#newInstance())メソッドを使用して
引数なしのデフォルトコンストラクタを呼び出しインスタンスを生成する。

<h3>②引数ありのコンストラクタを使用してインスタンス生成</h3>
まずは、Class.getConstructor()メソッドを使用してConstructor情報を取得する。
その際にgetConstructorメソッドの引数には、使用するコンストラクタの引数情報(class)を指定する。
またgetConstructorメソッドの引数は可変長引数なので引数の数に応じて「String.class, String.class」の様に引き渡す事が可能だ。
次に、生成したConstructorインスタンスのnewInstanceメソッドを使用してインスタンスを生成する。
その際にnewInstanceメソッドの引数にはコンストラクタに引き渡す引数を指定する。

<h3>③private コンストラクタを使用してインスタンス生成</h3>
Class.getDeclaredConstructor()メソッドを使用してConstructor情報を取得する。
※ Class.getConstructorメソッドは不可視な対象情報を取得できない為getDeclreadConstructorを使用する。というかこちらを使用しておけば問題ない？
次に、そのままnewInstanceメソッドでprivateコンストラクタからインスタンス生成しようとすると
java.lang.IllegalAccessExceptionが発生する。
そこで、constructor.setAccessible(true)メソッドを使用してリフレクション時にアクセス可能な様にアクセシビリティを緩くする。※セキュリティマネージャの設定により使用できない可能性がある。
その後、Constructor.newInstanceメソッドにて、インスタンスを生成する。
僕の中でRailsのflashの使い方が落ち着いてきた

ご報告です。今まで試行錯誤という感じで使っていたのですが、Railsのflashの使い方が落ち着いてきました。

## そもそもflashとは

セッションに一時的にメッセージを入れておける機能です。何も考えずに使うと次回のリクエストに有効です。

```rb:some_controller.rb
flash[:notice] = 'そのページはログインしないと見れないよ！'
redirect_to login_path
```

のように使うのが有効と思います。詳しくは調べてください。

## Bootstrapとともに使う

上記のように説明されることが多い flash ですが、実態は Hash なので、任意のキーが使用できます。ぼくはよく Bootstrap を使うので、 Alerts コンポーネントと組み合わせて使っています。

```rb:some_controller.rb
flash[:success] = 'success!'
flash[:info] = 'info'
flash[:warning] = 'warning'
flash[:danger] = 'danger'
```

```haml:some_view.html.haml
- flash.each do |type, msg|
  %div{class: "alert alert-#{type}"}= msg
```

のようにするのに落ち着きました。

ご意見大歓迎です。
AWS EC2インスタンスを簡単に消せないようにする方法

# AWS EC2はサーバを立ち上げるのも簡単ですが、消すのも簡単です。

せっかく時間をかけて作ったサーバも
**Actions** メニューの **Terminate** を選択すると
一回の確認画面がでるだけで、そこで **Yes** を押すとインスタンスが消えてしまいます。
物理サーバで言うと破棄です。業務でやっちゃったら **エライこと** です。

少しの時間、リストには表示されていますがステータスがterminatedになってしまい
二度と立ち上がらなくなります。

# そこで、

簡単にTerminateできないようにするため下記設定を行います。

1.  **対象のインスタンス** を選択する
1.  **Actions** メニューの **Change Termination Protection** を押下する　　
1. 確認画面で **Yes,Enable** を押下する

すると、 **通常通りインスタンスのTerminateをしようとしても
確認画面でYesがグレーアウトになっていて押下できなくなっています。**

![1.png](https://qiita-image-store.s3.amazonaws.com/0/14822/90c36a40-31b7-3b60-7e12-8a37b77e4312.png)


もちろん元の設定に戻すことは同じ手順で可能です。

業務でAWS EC2を使用する場合はデフォルトでこの設定を行っておくのが良いかもしれません。
omniauthで、OAuth処理を始めたURLへコールバックしたい場合（リンクのみ）

https://github.com/intridea/omniauth/wiki/Saving-User-Location

元のURLがrequest.env['omniauth.origin']に入っているよ！下記のようにすれば戻れる。

```rb
class SessionsController < ApplicationController
  def callback
    # do your authentication stuff here...
    redirect_to request.env['omniauth.origin'] || '/default'
  end
end
```
CSSだけでiOSのロックスクリーンを作る


#CSS3のKeyframeを利用
今日紹介するのはCSS Animationを使ってiOS7ロックスクリーンのスライダーの様に、キラリラリンとなるテキストの作り方です。
![331f920a2341620d1e417fd4a4a99942.gif](https://qiita-image-store.s3.amazonaws.com/0/36382/5459f3ed-27d4-2847-36af-db5a3cf56834.gif)

今回はKeyframeを利用してアニメーションを実装します。
>@keyframes は、アニメーション中に到達すべきポイントであるキーフレーム (通過点) を明示することで、CSS animation の流れの中間地点をページ作者が制御することを可能にします。これにより、ブラウザにすべてを自動的に扱わせる場合よりも、アニメーションの流れの中間地点をより明確に制御することができます。

#keyframesの構文
```css
@keyframes <identifier> {
  [ [ from | to | <percentage> ] [, from | to | <percentage> ]* block ]*
}
```
<identifier>
キーフレームのリストを識別する名前。これは CSS 構文規則で定義されている識別子に適合する必要があります。
from
アニメーションの始まりである 0% を示す。
to
アニメーションの終わりである 100% を示す。

```css
@keyframes identifier {
  0% { top: 0; left: 0; }
  30% { top: 50px; }
  68%, 72% { left: 50px; }
  100% { top: 100px; left: 100%; }
}
```

#さっそく実装
HTML,CSSはこんな感じです。Jade,Stylusで書いてる方が見やすいと思いますのでそのまま載せときます。

```jade:index.jade
extends layout

block content
  div#background
  div#lockscreen
    div#status-bar
      span#rssi ●●●●○
      span#carrer Softbank
      span#wifi
      span#GPS
      span#battery
        
    div#time
      span 11:18

    div#date
      span 1月28日金曜日

    div#slider
      span > スライドでロック解除

    div#camera
```

```stylus:style.styl
*
  padding 0
  margin 0
  color #FFF
  font-size 13px
  font-family "Helvetica Neue"
  font-weight lighter
  line-height 1.1

body
  height 100%
  background #000

div
  overflow hidden


div#wrap
  position relative
  width 100%

div#lockscreen
  width 100%

div#background
  background #000
  height 100%

div#status-bar
  span
    letter-spacing 0px 
    padding 5px 
    float left
    font-weight normal

div#time
  text-align center
  span
    font-size 600%

div#date
  text-align center
  span
    font-size 150%
    font-weight normal

div#slider
  position absolute
  bottom 10%
  width 100%
  text-align center
  background #999 -webkit-gradient(linear, left top, right top, color-stop(0, #999), color-stop(0.5, #fff), color-stop(1, #999))
  background-size 20% 100%
  background-repeat no-repeat
  background-position -200px top
  -webkit-background-clip text
  -webkit-text-fill-color transparent
  -webkit-animation shimmer 4s infinite
  span
    font-size 190%
    -webkit-text-fill-color transparent
    opacity 1
@keyframes shimmer 
  0%
    background-position -10% 0
    opacity 1
  100%
    background-position 110% 0
    opacity 1
```

CSSの最後にkeyframesがありますね、ここでバックグラウンドをを左から右へ動かしています。

#Point
ポイントはここ！
1.グラデーションでバックグラウンドを宣言
2.-webkit-background-clip textでテキストの形のマスクを作る
3.-webkit-text-fill-color transparentでテキストの色を透明にする
4.-webkit-animation shimmer 4s infiniteでKeyframe Animationを実行

```stylus:style.styl
div#slider
  position absolute
  bottom 10%
  width 100%
  text-align center
  background #999 -webkit-gradient(linear, left top, right top, color-stop(0, #999), color-stop(0.5, #fff), color-stop(1, #999))
  background-size 20% 100%
  background-repeat no-repeat
  background-position -200px top
  -webkit-background-clip text
  -webkit-text-fill-color transparent
  -webkit-animation shimmer 4s infinite
```
Ansible オレオレベストプラクティス

多種多様な構成のサーバーを Ansible で管理する場合、単一のベストプラクティスツリーに押し込むのは管理が大変すぎて現実的ではないなとおもい、どうしたものかなと悩んでいました。で、最近やっとこれかなという構成ができたので共有してみます。

## 何が問題か？

* ロールには共用できるものとできないものがある、それがいっしょこたに混ざるのが嫌
* 無理に共用できるようにと変数を多用するととても管理が大変。変数も覚えられないし、テストが大変
* 読み込むファイルのパスが大元のymlからの相対パスであり、`include` ではディレクトリ階層での整理が難しい
* `-l` で対象サーバーを絞り込んでも全てのタスクが表示され、skipped, skipped, skipped と関係ない task 表示がターミナルが埋まって見づらい

## そして、たどり着いたオレオレベストプラクティス

まとめて管理したいサーバーグループ毎にベストプラクティスツリーを作り、共用可能な、共用したいロールをその外に出すという構成です。次のような Playbook となります。

```yaml:site.yml
- hosts: all
  sudo: yes
  vars_files:
    - ../vars/common.yml # 共通変数
    - ../private_vars/common.yml # リポジトリにコミットしない共通変数
  roles:
    - ../common-roles/base # 共通処理の role は外側にある
    - ../common-roles/iptables
    - { role: ../common-roles/apache24, httpd_service_name: "httpd", httpd_mpm: "worker" }
    - apache-config
    - snmp
    - users
```

心置き無く汎用性のないロール、タスクを書くことができ、共用可能なものは多重に管理する必要がありません。
変数は site.yml のあるディレクトリの host_vars や group_vars の値を外の共通 role でも参照可能です。

全体は次のような感じ

```
.
├── common-roles/
│   ├── base/
│   │   ├── defaults/
│   │   │   └── main.yml
│   │   ├── files/
│   │   │   ├── ...
│   │   │   └── ...
│   │   ├── handlers/
│   │   │   └── main.yml
│   │   ├── templates/
│   │   │   ├── ...
│   │   │   └── ...
│   │   └── tasks/
│   │       └── main.yml
│   ├── role-A/
│   │   :
│   └── role-B/
│       :
├── service-A/
│   ├── group_vars/
│   │   ├── all
│   │   ├── development
│   │   ├── production
│   │   └── staging
│   ├── host_vars/
│   │   └── host1
│   ├── hosts-development
│   ├── hosts-staging
│   ├── hosts-production
│   ├── roles/
│   │   ├── role-X/
│   │   │   ├── defaults//
│   │   │   ├── files/
│   │   │   ├── handlers/
│   │   │   ├── meta/
│   │   │   ├── tasks/
│   │   │   └── templates/
│   │   └── role-Y/
│   │       ├── defaults/
│   │       ├── files/
│   │       ├── handlers/
│   │       ├── meta/
│   │       ├── tasks/
│   │       └── templates/
│   └── site.yml
├── private_vars/
│   └── common.yml
├── vars/
│   └── common.yml
:
```

インベントリファイルは実行時に指定するので一つのファイルにすることもできますが、シンプルに保ちたいのでそれぞれのディレクトリに置きます。
全サーバーに対して ansible コマンドで何か実行したい場合もあるかとは思いますが、そんな時でも ansible なら実行権限をつけたスクリプトなどをインベントリファイルとして指定すればその出力を使ってくれるので、各ディレクトリのファイルをマージするスクリプトを指定してあげれば解決です。ファイル名も hosts-development, hosts-staging, hosts-production などルールがあれば、そのスクリプトも単純化できます。

いかがでしょうか、もっと良い方法があるよとか、私はこうやってるとかコメントいただけると幸いです。
VMWare Fusion上のLinuxにおける仮想ディスクの領域拡張


1) VMWare Fusion自体の仮想ディスクサイズを変更し直します。仮想マシンの設定から変更可能です。

2) fdisk で既存のパーティションを削除し、再作成します。

  2-1)  ディスクサイズがVMWare Fusionで設定し直したサイズになっていることを確認します。
    
    #fdisk /dev/sda -l 
  
  2-2)  すべてのパーティションを削除します。
    
     コマンド (m でヘルプ): d
     領域番号 (1-4): 1 
 
  2-3) パーティション作成
  
     コマンド (m でヘルプ): n
     コマンドアクション
     e   拡張
     p   基本領域 (1-4)
     p
     領域番号 (1-4): 1
  
   swapパーティション作成は上記のように作成後、以下のようにシステムタイプを変更します。

    コマンド (m でヘルプ): t 
    領域番号 (1-4): 2
    16進数コード (L コマンドでコードリスト表示): 82
    領域のシステムタイプを 2 から 82 (Linux スワップ) に変更しました 
   
3) rebootし、resize2fsでサイズ拡張させます。
  
    resize2fs /dev/sda1
第18回オフラインリアルタイムどう書くの参考問題


オフラインでリアルタイムに「どう書く」をやるイベント
http://atnd.org/events/47025
をやります。

現時点では、まだまだ空きがありますので是非。
で。

今回の参考問題は「山折り谷折り」という名前で、
http://nabetani.sakura.ne.jp/hena/ord18mafovafo/
です。

当日出す問題の難易度と分量はこれを目安に考えると良いと思います。
とはいえ、似たような問題が出ることはあまり多くありません。

参加予定の方は、何分で解けたとかいう情報を付けてくださると、本番用の問題の参考になりますのでできればお願いします。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

それと。先日 CodeIQ に出した問題(最大公約フィボナッチ数(?))の問題と解題
http://nabetani.hatenablog.com/entry/codeiq_gcfibo_q649
も公開されていますので、こちらも是非。
iTerm2のテーマをSolarizedに変更する方法

## はじめに
iTerm2のカラースキームとかをSolarizedにしたかったので設定方法メモ。
## 手順
1. 以下のコマンドで任意の場所にクローンするか、[ここ](https://github.com/altercation/solarized)からzipをダウンロード

``` git
git clone https://github.com/altercation/solarized.git
```
![altercation_solarized-5.png](https://qiita-image-store.s3.amazonaws.com/0/25574/9080f733-5253-6a13-ae0e-db3070072dc3.png "altercation_solarized-5.png")
ちなみに上記のテーマを取得すると、iTerm以外にもVimやemacs,VisualStudioといったツールにも同じように設定できる。  


2.以下の画像を参考に`Load Presets...`から`Import...`を選択

![全画面_2014_01_26_10_45-18.png](https://qiita-image-store.s3.amazonaws.com/0/25574/dfceec7a-1a0f-2dca-5edc-451f1f735d26.png "全画面_2014_01_26_10_45-18.png")


3.`Open`ウィンドウが開いたら手順1でダウンロードした場所を開き、`iterm2-colors-solarized`を選択する

4.Dark,Lightの好きな方を選択し、`Open`を選択

5.再度`Load Presets...`を選択し、以下のように選択肢が増えていれば成功。
![全画面_2014_01_26_11_00-2.png](https://qiita-image-store.s3.amazonaws.com/0/25574/a248622e-c097-12dd-15d4-677b612b1d0a.png "全画面_2014_01_26_11_00-2.png")

## おわりに
SublimeTextとかで背景黒にしてるので、ターミナル環境は少し明るめにしたかった。  
これで作業が捗る。
[Sencha Touch]アイコンの変更方法

## はじめに

Sencha Touchのバージョン2.2以降では、アイコン表示にアイコンフォントを使用するようになった。
ここでは、アプリで使用するアイコンの変更方法を説明する。

## デフォルトで使えるアイコン

デフォルトテーマではPictosフォントを使用している。

- Pictosフォント  
  http://www.pictos.cc/font/

デフォルトではPictosフォントの全アイコンが使用できるようにはなっていない。
デフォルトで使えるアイコンの一覧は公式ドキュメントには載っていないが、以下のファイルの`@if $include-default-icons {`のところに定義されている。

`<アプリフォルダ>/touch/resources/themes/stylesheets/sencha-touch/default/src/_Button.scss`

## Pictosフォントからアイコンを追加する

例：ハートマークのアイコンをアイコンクラス名"heart"で使用できるようにする

```scss:app.scss
@import 'sencha-touch/default';
@import 'sencha-touch/default/all';

//※テーマのインポート後に記述
@include icon('heart');
```

アイコンクラス名は以下のファイルの`icon-character-for-name`という関数に定義されている。

`<アプリフォルダ>/touch/resources/themes/stylesheets/sencha-touch/baes/mixins/_Class.scss`

上記に定義されているクラス名が気に食わなければ、第1引数に任意のクラス名、第2引数にアイコンフォントの文字コードを指定すれば変更できる。
例：ハートマークのアイコンをアイコンクラス名"like"で使用できるようにする

```scss:app.scss
@include icon('like', 'k');
```

## 他のアイコンフォントを使用する

例：GenericonsのTwitterアイコンを使用する

- Genericons  
  http://genericons.com/

1. Genericonsのホームページからアイコンフォントをダウンロードする。
1. zipファイルを解凍してfontフォルダ内のフォントファイルを以下の場所にコピーする。  
  `<アプリフォルダ>/resources/sass/stylesheets/fonts/genericons/`
1. app.scssに以下の記述を追加する。

```scss:app.scss
@include icon-font('genericons', inline-font-files(
		'genericons/genericons-regular-webfont.woff', woff, 
		'genericons/genericons-regular-webfont.ttf', truetype,
		'genericons/genericons-regular-webfont.svg', svg
));
@include icon('twitter', '\f202', 'genericons');
```

`\f202`はアイコンに対応付けられた文字コードで、Genericonsホームページでアイコンを選択して`Copy CSS`のリンクをクリックすると表示される。

## デフォルトアイコン定義を無効にする

```scss:app.scss
//※テーマのインポート前に記述
$include-default-icons: false;

@import 'sencha-touch/default';
@import 'sencha-touch/default/all';
```

## 参考

- 公式ドキュメント(バージョン2.3.1)  
  [Theming - Touch - Sencha Docs](http://docs.sencha.com/touch/2.3.1/#!/guide/theming)
- ゼノフィ 技術ノート  
  [Sencha Touch 2.2での新しいテーマ](http://www.xenophy.com/sencha-blog/7446)
【Scala】OptionとListのmap()に感動する


mapってメソッドがいくつかのクラスにあります。
特にOptionとListについては感動したので、感動を分かち合いたいと思います。

#Option

```scala

val optIntVal: Option[Int] = Some(10)
val optStrVal: Option[String] = Some("文字列だす")

```

こんな感じでOption[***]の変数があったとしましょう。

個人的に一番使うのが多いのが、このOptionに対してgetOrElseでStringの引数を呼び出すことです。

```scala

val strVal = optStrVal.getOrElse("") //よくやる

```

##改善前

しかし、Option[Int]のgetOrElseで結果的にStringにしたい、ということも良くありまして、その際は最近まではこう書いてました。

```scala
var strVal = ""
if(optIntVal.isDefined){
	strVal = optIntVal.get.toString
}
```

##改善後

型変換が絡むと、とたんにgetOrElseが使えないと思ってたからですね。
書きながらも、かなり気持ち悪がってました。

ご存じの方も多いと思いますが、解決策としてはこちら

```scala
val strVal = optStrVal.map(_.toString).getOrElse("") //1行で書けた!
```

map()が肝ですね。
プレースホルダーとして「_」が使えます。これがOptionの場合は中身を意味しています。
わかりやすく書くとこうです。

```scala
val optStrValForConvert:Option[String] = optStrVal.map(_.toString) //Option[Int]から、Option[String]への変換
val strVal = optStrValForConvert.getOrElse("")
```

#List

map()内でプレースホルダーが使えることが分かれば、Listの場合も何となくイメージできますよね。

こんなリストを想定します。

```scala
val strList = List("1", "2", "3")
val intList = List(1, 2, 3)
```

それぞれList[Int]と、List[String]に変換しましょう。

##改善前

恥ずかしいですけど改善前です。

```scala
val newIntListForConvert = ListBuffer()[Int]

strList.foreach{ str =>

	//今思い返しても恥ずかしい…	
	newIntListForConvert += str.toInt
}

val newIntList = newIntListForConvert.toList

```

##改善後

Listにもmap()が備わっているので使います。

```scala
val newIntList = strList.map(_.toInt) //なんと…
val newStrList = intList(_.toString) //1行で…!
```


私も完全に独学でScalaを進めているのですが、同じような境遇の方の一助になれば幸いです。
ちゃんとコップ本読めってことですよね...
はてなのAPIをつかってみた / Rails4とWSSE認証

- - - - - - - - - - - 
ブログを更新しました。<a href="http://workabroad.jp/posts/2040">元の記事はコチラ</a>
- - - - - - - - - - - 
API使ってどうのこうのという分野に経験が浅いので、頑張ってみた。慣れるといろんなことできて楽しい。HTTPリクエストの投げ方とか、勉強になりました。今回ははてなブックマークでやってみました。



はてなで指定されたURIに、指定されたフォーマットでリクエストを投げる。
ていうと簡単だけど、指定されている状態をどうつくるのか悩んだ。。

認証にはOAuthとWSSEがあって、WSSEは非推奨でセキュリティもよろしくないという話だけど、シンプルなのでWSSE認証ででやりました。

基本はここに載っている。
[はてなブックマークAtomAPI](http://developer.hatena.ne.jp/ja/documents/bookmark/apis/atom)

WSSE認証については[ここ](http://developer.hatena.ne.jp/ja/documents/auth/apis/wsse)にありますが、下のようなものをヘッダにつけろということです。

```
X-WSSE: UsernameToken Username="hatena", PasswordDigest="ZCNaK2jrXr4+zsCaYK/YLUxImZU=", Nonce="Uh95NQlviNpJQR1MmML+zq6pFxE=", Created="2005-01-18T03:20:15Z"
```
これをつくる関数はprivateにしてあります。

**SnsController**

``` ruby
class SnsController < ApplicationController


	private
	# WSSE認証をHTTPヘッダにつける準備です
	# Get WSSE authentication format
	def get_wsse(user, pass)

		created = Time.now.iso8601

		nonce = ''
		20.times do 
			nonce << rand(256).chr
		end

		passdigest = Digest::SHA1.digest(nonce + created + pass)

		return "UsernameToken Username=\"#{user}\", " +
	    "PasswordDigest=\"#{Base64.encode64(passdigest).chomp}\", " + 
	    "Nonce=\"#{Base64.encode64(nonce).chomp}\", " +
	    "Created=\"#{created}\""
	end

end

```
　　



で、リクエストを送るにはNet::HTTPクラスを使うということで。
startはすぐに通信開始してブロックの最後まで行ったら終わるとな。へぇー。
実際のPOSTリクエストはhttp.post(api, xml, header)でできました。

XMLははてなのフォーマットに合わせてあります。



**SnsController**

``` ruby
class SnsController < ApplicationController


	def hatena(user, pass, uri, tags)

		# Hatena API
		api = URI.parse('http://b.hatena.ne.jp/atom/post')

		# WSSE authentication
		header = {
			"X-WSSE" => get_wsse(user, pass),
			"Accept" => "application/x.atom+xml, application/xml, text/xml, */*"
		}

		# Hatena XML Format
		xml = "<entry xmlns=\"http://purl.org/atom/ns#\"><title>dummy</title><link rel=\"related\" type=\"text/html\" href=\"#{uri}\" /><summary type=\"text/plain\">#{tags}</summary></entry>"

		# Post Hatena bookmark
		response = Net::HTTP.start(api.hostname, api.port) do |http|
			http.post(api, xml, header)
		end

		xml = Nokogiri::XML(response.body)

	end


	private
	# WSSE認証をHTTPヘッダにつける準備です
	# Get WSSE authentication format
	def get_wsse(user, pass)

		created = Time.now.iso8601

		nonce = ''
		20.times do 
			nonce << rand(256).chr
		end

		passdigest = Digest::SHA1.digest(nonce + created + pass)

		return "UsernameToken Username=\"#{user}\", " +
	    "PasswordDigest=\"#{Base64.encode64(passdigest).chomp}\", " + 
	    "Nonce=\"#{Base64.encode64(nonce).chomp}\", " +
	    "Created=\"#{created}\""
	end

end

```

response.bodyにはXMLが入っているんだけど、Nokogiriでパースして、
xml = Nokogiri::XML(response.body)　その後ごにょごにょするという流れ。

引数のuser, pass, uri, tagsは、はてなのアカウント名（本当はAPIキー推奨らしい）とパスワード、ブックマークしたいURL、tagsはコメントなんだけど、個人的にタグの方が好きなので、tagsとしました。

以上です。それではー。






 → <a href="http://workabroad.jp/posts/2040">http://workabroad.jp/posts/2040</a>
OSをMavericksにアップデートしたらVagrantが止まった / 回復した

- - - - - - - - - - - 
ブログを更新しました。<a href="http://workabroad.jp/posts/2046">元の記事はコチラ</a>
- - - - - - - - - - - 
時間ができたので、重い腰を上げてMountain LionからMavericksにアップデートしました。基本何も変わりませんが、壁紙も新しくなって何となく清々しい気分です。
いろいろアプリを起動してみた結果、大きな問題もありませんでしたが、ローカル開発環境のVagrantだけ止まってしまいました。


こんなエラーが出る。

```
Bringing machine 'default' up with 'virtualbox' provider...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.
```


ググったらすぐ解決方が見つかった。
このコマンド打つだけ。

```
sudo /Library/StartupItems/VirtualBox/VirtualBox restart
```

Virtual Box 4.3以上使ってる人は以下らしい。

```
sudo launchctl load /Library/LaunchDaemons/org.virtualbox.startup.plist
```

でも一番最新の 4.3.2 だとこの現象は起きないみたい。
Virtual Boxを最新版にしてからOSをアップグレードするのも一つの手ですね。

この人が詳しく解説してくれている。
[Fixing Vagrant after an OSX Mavericks update](http://www.stumiller.me/fixing-vagrant-osx-mavericks-update/)

なおった。一安心。


 → <a href="http://workabroad.jp/posts/2046">http://workabroad.jp/posts/2046</a>
heroku / アプリから別のアプリのデータベースに接続する

- - - - - - - - - - - 
ブログを更新しました。<a href="http://workabroad.jp/posts/2047">元の記事はコチラ</a>
- - - - - - - - - - - 
あるherokuアプリから、別のアプリのデータベースに接続するにはどうしたらいいのか疑問に思ったので実験してみた。普通に config/database.yml を編集するだけじゃうまくいかなかったよ。

<!-- extract -->

こんなデータベースがあったとします。
**アプリAのDB**

```
# config/database.yml 
production:
  adapter: postgresql
  encoding: utf8
  port: 5432
  pool: 25
  database: 123456789
  password: thisispassword
  username: thisisusername
```
　
で、別のアプリの設定をこんな風にしてみた。
**アプリBのDB**

```
# config/database.yml 
production:
	#アプリAのDBのHostname
  host: ec2-11-111-111-111.eu-west-1.compute.amazonaws.com
  adapter: postgresql
  encoding: utf8
  port: 5432
  pool: 25
  database: 123456789
  password: thisispassword
  username: thisisusername
```

通常はhostを書かなくてもいいんだけど、別アプリだからhostはいるよね、ということで書いたんだけど、これだけではうまくいかなかった。
　
###環境変数

どうやら、herokuはデータベースを作成した時に、環境変数を自動で作成してるみたい。

```
heroku config
```
を叩くとわかりますが、下のような変数が設定されています。

```
# === Config Vars
# DATABASE_URL: 
# HEROKU_POSTGRESQL_COLOR_URL: 
```
HEROKU_POSTGRESQL_COLOR_URLのほうは「アプリB」のデータベースで、DATABASE_URLがこのデータベースを使いますよ、ということみたい。

で、DATABASE_URLは以下のような書式で指定できる。
（Postgreslを使っている場合）

```
postgres://[username]:[password]@[host]:[port]/[database]
```

これをherokuの環境変数にセットしてあげれば、接続することができました。


```
heroku config:add DATABASE_URL=postgres://…………
```

まちがってconfig消しちゃったって場合も、DBの情報があれば、上の書式に当てはめれば復元することができますよっと。
以上です。それではー。


 → <a href="http://workabroad.jp/posts/2047">http://workabroad.jp/posts/2047</a>
herokuやSquareSpaceで独自ドメインを使う時に便利な転送サービス見つけた

ブログを更新しました。<a href="http://workabroad.jp/posts/2048">元の記事はコチラ</a>

###herokuやSquareSpaceで転送が必要なとき

これらのサービスで独自ドメイン使う時は、こんな流れ。

【行程1】
まずはwww.xxxx.comのCNAMEをheroku/SquareSpaceで指定されたものにする

　↓

【行程2】
xxxx.com（Naked Domain）をwww.xxxx.comに転送


1はどのドメインレジストラーでも対応していて問題なくいけるんだけど、2には対応していないところもある。
今回はムームードメイン。FAQにも転送には対応していませんってハッキリ書いてある。

Amazon Route53とか使ってると簡単なんだけどね。
お金払っていいっていう人はRoute53をお勧めします。



###ムームードメインの場合

今回はムームードメインの場合だけど、どこの会社でもだいたい同じ。

コントロールパネル / ネームサーバ設定変更 で「ムームードメインのネームサーバ（ムームーＤＮＳ）を使用する」を選択。

![Screen Shot 2014-01-25 at 4.43.23 PM](http://image.workabroad.jp/upload/2014/87/workabroad.jpg)

左メニューの「ドメイン管理」から「ムームーＤＮＳ」をクリック。
該当のドメインの横にある変更ボタンをおす。

![domain](http://image.workabroad.jp/upload/2014/88/workabroad.jpg)

CNAMEは普通に設定。（1の行程）
herokuやSquareSpaceのドキュメントに載ってると思います。
そういえば以前にも書いた。
[heroku で 独自ドメインを使う際の最善策を考えた](http://www.workabroad.jp/posts/2002)


で、こんどはNaked Domainからのアクセスをwww.xxxx.comに転送しないといけないんだけど（2の行程）、ムームドメインは転送に対応していないので、困ったなーと思ってたらこのサービスを見つけた。
　
**[Naked Domain Redirect](http://wwwizer.com/naked-domain-redirect)**

自分のレジストラーのDNS設定で、そのドメインが174.129.25.170を指すように設定。
そうすると、www.xxxx.comをxxxx.comにリダイレクトしてくれるというサービスです。

なので、ムームドメインでAレコードを設定します。

![domain2](http://image.workabroad.jp/upload/2014/89/workabroad.jpg)
Aレコードに174.129.25.170を設定するだけ。

これでしばらくすれば、xxxx.com にアクセスするとwww.xxxx.comに転送されて、ページが正常に見えるようになる、と。
DNSの設定には数時間かかる場合もありますので、気長に待ちましょう。

以上です。それではー。




<a href="http://workabroad.jp/posts/2048">http://workabroad.jp/posts/2048</a>
遅延処理を簡潔に！Blocksの中に書いた処理を遅延実行するカテゴリ


普通に特定のメソッドを遅延実行する場合はNSObjectクラスの「performSelector:withObject:afterDelay:」メソッドを使用しますが、簡単な処理だとわざわざメソッドを定義するのは面倒だし、可読性が落ちます。
そこで、今回はそれを特定のメソッドではなく、Blocksの内容を遅延実行するカテゴリをご紹介します！


## NSObject+BlocksWait

```objectivec:NSObject+BlocksWait.h
#import <Foundation/Foundation.h>

@interface NSObject (BlocksWait)

+ (void)performBlock:(void(^)())block afterDelay:(NSTimeInterval)delay;

@end
```

```objectivec:NSObject+BlocksWait.m
#import "NSObject+BlocksWait.h"

@implementation NSObject (BlocksWait)


+ (void)performBlock:(void(^)())block afterDelay:(NSTimeInterval)delay 
{
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), block);
}

@end
```

## 使用例
最近リリースした「[キス顔カメラ - 気になるあの子のキス顔が撮れるアプリ](https://itunes.apple.com/jp/app/kisu-yankamera-qininaruano/id780308591?mt=8)」では以下のように、1.5秒後に音声を再生する、のような処理を行うときに使用しています。


```objectivec:hoge.m
#import "NSObject-BlocksWait.h"


- (void)hogehoge
{
	// …いろいろ処理があって…


	[NSObject performBlock:^{
		NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"wav"];
		self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:soundPath] error:nil];
		[self.player play];
	} afterDelay:1.5f];

	// …いろいろ処理があって…
}
```
androidゲームプログラマ目指して(日記みたいなものです)

初投稿です。
現在Androidのゲームプログラマを目指している私が、今までに学んだこと、また現在学んでいること等をまとめていけたらなと考えています。
まだまだ独力でのアプリ開発もままならない状態のため、レベルの低い、内容もgdgdになる可能性が高いですが、学習の日記程度の気持ちで投稿していきたいと思います。

##なぜAndroidか
私は、子供の頃からゲームが好きで(まあ人並み程度なのかもしれませんが…)「いつかゲームを作ってみたいな」と漠然と考えていた頃がありました。しかし大人になるにつれて、昔ほどゲームに触れなくなり、いつしかゲームなしでも生きられる悲しい大人になってしまっていました。
３年ほど前のことです。ガラケーも廃れていき、私の周りにもスマートフォンを持つ人が増えてきました。私も周りに合わせるようにガラケーを捨てスマートフォンに機種変更をします。
はっきり言って感動しました。いままでお世辞にも快適とは言えなかったWebブラウジングはPCに劣らないほどのもので、マーケットにはAndroidをより快適に利用できるようになるアプリ、また様々なゲームで溢れかえっていました。
画面をタップしているだけで楽しいゲーム、加速度センサーを利用した、私が今まで体験したことのないゲーム、コンシューマ機に劣らないクオリティのゲームと、プレイするゲームひとつひとつが私を感動させてくれました。
そんな中、ふと思いました。「こんなゲームあったら面白いんじゃないかな？」と。
とりあえずAndroidでのアプリ開発について調べ始めました。幸運にも、個人レベルでも開発、公開ができることがわかりどんどん開発したいと思うようになりました。
開発環境の整備が容易で、手軽に作成したものを公開でき、普段ゲームをやらない人すらゲームを楽しむことができる、なんといっても、私が本当に久しぶりにゲームを楽しんだプラットフォームである、だからこそAndroidでゲームを作りたいのです。
思い立ったようにアプリ開発について調べ、書籍を探し、私のゲーム開発を目指す日々が始まりました。



##言語の選択
まずAndroidアプリを作成するにあたってどの言語を使用されているのかを調べました。(主にネットで「Android　開発」でググった)
どうやらAndroidアプリはJava言語で作るらしい
　　　↓
よし、Javaしかない！！！

清々しいくらいの安直さでJava言語の学習が始まりました。
学習を進めるうちにUnityやらなんやらの開発エンジンなんかがあったり、そもそもゲーム開発に関する書籍なんかはC/C++がメインだったり…まあJavaでいこう！と決めた以上、とりあえずJavaでまともなゲーム１個くらい作りたいものです。(実際はC++の勉強もこっそり始めてますが…)


##現在までの学習
まずは、私の学習状況についてです。
学習手順は

1.やさしいjava
2.イラストでよくわかるAndroidアプリの作り方
3.なぜ、あなたはJavaでオブジェクト指向開発ができないのか
4.AndroidゲームプログラミングA to Z ←現在学習中！！

といった順番で書籍を読み進めています。
現在はAndroidゲームプログラミングA to ZでOpenGLを使用した２Dゲームの作成方法を学んでいる段階です。
この本、多少古い情報が多いですが、想像以上にためになるものです。
andEngineなどのゲームエンジンを使用せずに、Eclipseの設定からOpenGLを使った３Dゲームの開発まで説明してくれます。音楽に関しては、音の物理的な性質や圧縮方法など、グラフィックでは、各ピクセルがどのようにメモリに格納されていくのかなど、とても細かく説明してくれます。現在、OpenGLで２Dゲームを作成していくところまで読み進めたのですが、この章もとても丁寧な解説がされていてびっくりです。
この章を終える頃には、なにか２Dゲームを作成してみたいと考えています。

このまま各書籍で学んだこと等を書いていくとえらく長くなってしまいそうなので、そのうち少しずづやっていきたいと思います。

初投稿なのにだいぶ長くなってしまいましたが、今後もこのような日記的なものを書いてみようかなと思います。
boxenで日本語版のfirefoxをインストールしたいとき

boxenでfirefoxをインストールするときに普通に

```rb
include firefox
```

とすると英語版のfirefoxをインストールしてしまう。

firefoxのpuppetはlocaleを指定が指定できるようになってるんだけど、firefoxの日本語のロケールがja-JPでなくて、ja-JP-macになっているので注意!

```rb
  class { 'firefox':
    locale => 'ja-JP-mac'
  }
  include firefox
```

とすると無事日本語のfirefoxがインストールされる。
npmjs.orgの代わりにnpmjs.euからパッケージをダウンロードする

[registry.npmjs.eu](http://npmjs.eu/)というnpmjs.orgのミラーが出来たそうです。European npm mirrorだそうです。

```shell-session:Terminal
$ npm --registry http://registry.npmjs.eu/ install express
```

とすることでnpmjs.euを使ってインストール出来る模様です。もしくは$HOME/.npmrcに

```:.npmrc
registry = http://registry.npmjs.eu/
```

で良いと思います。

最近、npmjs.orgが不調だったりするのですぐに使いたい場合などはこちらを使うと良いのかもしれません。試しにexpressをダウンロードしてみましたがnpmjs.orgと比べて別段遅くも感じなかったです。
VPSからRailsのActionMailerでメールを送信する(≠gmail経由)

PHPでPostfixを利用して、簡単にメールを送る方法は調べれば出てきます。
[PHPで作るお問い合わせメールフォーム(自動返信機能付き)](http://webgaku.hateblo.jp/entry/20120822/1345604952)


同じようなことをRailsでやりたくて、ネットを調べたのですがGmail経由の情報は合ったのですが、独自ドメインで送信する方法が見つからなかったので、ご紹介します。
[RailsのActionMailerでメールを送信する(Gmail経由)](http://qiita.com/ytr_i/items/0907ee3312ed9d79c9e8)

##Postfixがインストールされているかの確認
VPSなどからメールを送る際には、SMTP(Simple Mail Transfer Protocol)に則ったソフトウェアが必要になります。色々種類は有りますが、ここではPHPのメール送信で利用したPostfixを利用します。

PostfixはVPS上で以下のコマンドで入っているかどうか確認することができます。(yumでインストールされた中で、postfixを検索検索！)

```bash:Terminal
$ yum list installed | grep postfix
postfix.x86_64       2:2.6.6-2.2.el6_1  @anaconda-CentOS-201303020151.x86_64/6.4
```

postfix…と表示されれば、インストールされています！もし表示されなければyumでインストールして下さい

```bash:Terminal
$ sudo yum install postfix
```

##メールを送るための環境設定
メールを送るための環境設定を行います。とりあえずは開発環境のみで使う設定を行います。
Postfixはデフォルトでローカルから特に認証をせずにメールを送ることができるので、saslauthdなどの認証は不要。
また、`config.action_mailer.raise_delivery_errors=true`を設定しないとメールが送れていなくてもエラーメッセージが表示されません。デフォルトで`false`になっているので、`true`に変えましょう。

```ruby:/config/environments/development.rb
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  :address => 'localhost'
}
```

##メールを送るクラスの作製
メールを送るためのコントローラ、送信するメールの内容を記述するクラスを自動生成します

```bash:Terminal
# rails g mailer クラス名 メソッド名

$ rails g mailer NoticeMail sendMail
```

##メールクラスの編集
メールを送るアドレスや、送信先などを設定します。

```ruby:/app/mailers/notice_mail.rb
class NoticeMail < ActionMailer::Base
  #送信元のアドレス
  default from: "from@example.com"

  # Subject can be set in your I18n file at config/locales/en.yml
  # with the following lookup:
  #
  #   en.notice_mail.sendMail.subject
  #
  def sendMail
    @greeting = "Hi"

    #宛先メールアドレス
    mail to: "to@example.org"

    #送信メールの件名
    mail subject: "テストメールです" 
  end
end
```

##メール内容の編集
生成されたテンプレートの拡張子を`~.html.erb`にすればHTMLメール、`~.text.erb`にすればテキストのメールを送ることができます

```ruby:/app/views/notice_mail/sendMail.text.erb
NoticeMail#sendMail

<%= @greeting %>, find me in app/views/app/views/notice_mail/sendMail.text.erb

テストメールです！！
```

これで、メールを送ることができます！Railsのコンソールで確認してみましょう。

```bash:Terminal
$ rails c
NoticeMail.sendMail.deliver
```

##Viewからメールの送信
Viewの中からメールを送信するには、バタンなど押されたときにアクションとして書いてあげればOKです！
まずはコントローラにリンクが押された時のアクションを作り、ルートを定義します。

```bash:Terminal
#コントローラとビューの作成
$ rails g controller MailList top
```

```ruby:/app/controllers/mail_list_controller.rb
  #メールを送るアクション
  def go_mail
    NoticeMail.sendMail.deliver
    render :text => '送信完了！'
  end
```

```ruby:/config/routes.rb
  #メールを送るアクションのルート定義
  get 'go_mail' => 'mail_list#go_mail'
```

あとはViewに押されたときにアクションを実行するリンクを作ります。

```ruby:/app/views/mail_list_top.html.erb
<%= link_to "メール送信", :action => 'go_mail' %>
```
 エラーが起きずに送信されればバッチグーです！！
お疲れ様でした＾＾
emacs風の切り貼りのできるenthumble設定

#要旨
enthumbleのデフォルトのFBNPモードは移動はemacs風であるが、切り貼り関係はemacs風になっていない。その点を強化した設定を作成してみた。
#概要
enthumbleのキー設定で、無変換で修飾されたあるキーにより、shift down状態（shiftが押されたままの状態）にさせることができる。これを、emacsでのset-mark-command(C-SPCまたはC-@)後の領域選択状態と似たようなものとみなし、emacs風の切り貼りを実現するようにしてみた。
#Base Mode
![FBNPモード](http://jp.enthumble.com/img/enthumble/keyboard_FBNP.png)
趣旨からしてFBNPモード。
#KeyList.ini
キー設定ファイル(./KeyList./FBNP.ini)の中身。

```ini:FBNP.ini
[HowToUse]
Check=http://jp.enthumble.com
Name=enthumble version 3.0
[KEY]
Space={shift down}
Muhenkan={Esc}
Henkan={Esc}
Hiragana={}
F1={}
F2={}
F3={}
F4={}
F5={}
F6={}
F7={}
F8={}
F9={}
F10={Volume_Mute}
F11={Volume_Down}{Volume_Down}
F12={Volume_Up}{Volume_Up}
F23={}
F24={}
1={F1}
2={F2}
3={F3}
4={F4}
5={F5}
6={F6}
7={F7}
8={F8}
9={F9}
0={F10}
-={F11}
Hat={F12}
\={}
Q=^q
W={shift up}^x
E={END}
R=^r
T=^t
Y={shift up}^v
U=^u
I={Tab}
O=^o
P={up}
@={shift down}
LB={}
A={HOME}
S=^s
D={shift up}{Delete}
F={right}
G={shift up}
H={BS}
J={Enter}
K={shift down}{END}{shift up}^x
L={right}
Semicolon={}
:={}
RB={}
Z=^z
X={shift up}^x
C={shift up}^c
V=^v
B={left}
N={down}
M={Enter}
,={}
.={}
/={}
Backslash={}
Up={ASC 33194}
Down={ASC 33195}
Left={ASC 33193}
Right={ASC 33192}
LButton={ctrl down}{PgUp}{ctrl up}
MButton={MButton}
RButton={ctrl down}{PgDn}{ctrl up}
WheelUp={}
UWheeDown={}
PageUp={}
PageDown={}
Home={}
End={}
Delete={}
Bacspace={}
Enter={}
Escape={}
Hankaku={}
Tab={}
Capslock={}
Lwin={}
Rwin={}
Insert={}
```

#解説
##set-mark-command風の無変換+スペース(or 無変換+@)

```ini
Space={shift down}
@={shift down}
```

無変換+スペースまたは無変換+@は、shift downであり、これはemacsのC-SPC(set-mark-command)と同様の働きをする。つまり、無変換+スペース押下後、カーソル移動とともに選択領域を設定できる。なお、C-は、emacsでのCtrlと同時押しの略記。
##切り貼り関連

```ini
W={shift up}^x
D={shift up}{Delete}
X={shift up}^x
C={shift up}^c
K={shift down}{END}{shift up}^x
Y={shift up}^v
```

1. 無変換+wでemacsのC-w同様、選択領域をカット(kill-region)する。このとき、shift upとして、領域選択状態を解除するようにした。
1. 無変換+dは、領域をdeleteする。ここは、ちょっとemacsと違うが、自然な挙動と思う。
1. 他の、Windows風のカット、コピーコマンド無変換+x、無変換+cの際にもshift upするようにして、無変換+スペースと一緒に使用できるようにした。
1. 無変換+kは、emacsのC-k(kill-line)と似た挙動になるようにした。
1. 無変換+yは貼り付けとし、emacsのC-y(yank)と似た挙動になるようにした。

##要注意！

```ini
G={shift up}
```

shift downはemacsのset-mark-commandと同じではない。emacsでは、set-mark-commandして、その後それを忘れて何をしても大概大丈夫だが、shift downはそうではない。この設定では残念ながら、 **shift downしたまま、気付かずに操作し、何が起きているのかわからななくなるときがある** 。そういう時のために、無変換+gは、shift upとした（emacsユーザは、何が起きているのかわからないとき、C-g(keyboad-quit)を押す癖があると思う）。

#ありがとうenthumble！
投稿者は、まだenthumbleを使用し始めて2ヶ月であるが、すでにenthumbleが無くてはならない存在となっている。報告書のwordを書く際に、非常に強力である。また、ファイル名変更などの際のカーソル移動と切り貼りにも地味に活躍する。もちろん、エクスプローラー中のファイル選択の移動時などにもだ。
投稿者は、もともとはxkeymacs（もちろんこれもすごいソフト）を使用していたが、左手の小指が腱鞘炎気味となり、Windows上でのemacsキーバインドを封印していた。そんな時enthumbleと出会い、久しぶりに自由なキー操作ができるようになった。ネット上の情報によれば、親指のほうが腱鞘炎になりづらいらしい。なお、説明不要かもしれないが、emacserにとって小指の腱鞘炎は職業病のようなもの。
enthumbleのもう一つ嬉しい点として、Windowsキーバインドを使えるということがある。例えば、Ctrl+aなんかは結構便利だ。xkeymacsを使用していた時は気づかなかった。Ctrl+cやCtrl+vも普段使うようになるので、無変換だけ気をつければ、enthumbleのない環境に移ってもなんとかなる。こういうところも気に入っている点だ。
素晴らしいソフトを作成されたenthumble作者のhara様に改めてお礼を言いたい。
caskとpalletを使って、RubyのBundlerのようにpackage.elから管理する


1 caskをインストールする(指示通りpathに追加するのを忘れずに)

```
curl -fsSkL https://raw.github.com/cask/cask/master/go | python
```

2 caskをアップグレードする

```
cask upgrade
```

3 .emacs.d/配下で以下のコマンドを実行して、Caskファイルを作成する

```
cask init
```

4 作成されたCaskファイルにpalletを追加

```
(depends-on "pallet")
```

5 以下のコマンドでpalletをインストールする

```
cask install
```

6 .emacsに以下の設定を追加

```
(require 'cask "~/.cask/cask.el")
(cask-initialize)
(require 'pallet)
```

7 これで、何も意識しなくてもpackage.elでいままでどおりインストールするとCaskファイルにその内容が追記されるし、逆にCaskファイルにpackageを追加して5のコマンドを実行しても同じようにインストールされる

8 packageのアップデート

```
cask update
```

9 linux,osx,windowsで、違うpackageのEmacsを使う
Ruby から Perl を 実行(run) する方法 ; gem 経由

# 前置き

Raw な Ruby からは Perl スクリプトを run するのは非常にメンドイらしい

gem を使って楽に run する

開発者曰く「バグを見つけたら issue report ください」とし「Rspec で 充分なテストしてるから(大丈夫)」とも仰っている。

# 環境導入

```
gem install ruby-perl
```

# コード諸々

* 'heello, Perl from Ruby'

```rb:hello.rb
require 'perl'
Perl.run %Q{print 'hello, Perl from Ruby\n'}
```

```
$ ruby hello.rb
hello, Perl from Ruby
```

* foreach 処理

```rb:foreach.rb
require 'perl'
Perl do
  run <<-EOF
my @stone = ("Perl", "Ruby");

foreach my $gem (@stone){
  print "$gem\n";
}
EOF
end
```

```
$ ruby foreach.rb
Perl
Ruby
```

# 異常

* Perl の文法ミス
  * Perl のエラーコードが出る
  * Perl のエラーが起きても、Ruby のエラーは起きない<sub>[@1](#1)</sub>

```rb:syntaxErrorPerl.rb
require 'perl'
Perl.run %Q{ pInt 'hello, world\n' }
```

```
$ ruby syntaxErrorPerl.rb
String found where operator expected at (eval 1) line 2, near "pInt 'hello, world'"
  (Might be a runaway multi-line '' string starting on line 1)
    (Do you need to predeclare pInt?)
```

<a name="1">@1</a>

Perl 文法ミスによる Perl.run の例外処理を試行したが、error を出力していなかった

```rb
begin
  Perl.run %Q{ pInt 'hello, world\n' } #=> no exception
rescue => e
  p e.class   # 以下 2 行が実行されず
  p e.message #
end
```

----

gem 情報元

[zephiroworks/ruby-perl](https://github.com/zephirworks/ruby-perl)
ACRAを使ってクラッシュレポートをメールで受け取る

##ACRAについて
ACRAはAndroidのアプリが強制終了した時のクラッシュレポートを収集するためのライブラリです。
本来は自動収集する使い方が普通なのですが、以前の方式(Google Docs上にレポートを集める)は利用できないようになっています。
今の方式はバックエンドのサーバを用意して、Acralyzer(ACRAのバックエンドアプリケーション)を走らせて、そこに集めるようです。

今回はさくっと使いたかったので、メールでレポートを集める方法を選択肢ました。

##ACRAの導入
###ライブラリのダウンロード
[ここ](http://search.maven.org/remotecontent?filepath=ch/acra/acra/4.5.0/acra-4.5.0.zip)からACRAのライブラリがダウンロードできます。

###ライブラリをプロジェクトに追加
ダウンロードしたZipファイルを解答して/build/acra-4.x.0.jarをプロジェクトの/libsにコピーします。

###ApplicationクラスでACRAを初期化
ACRAはApplicationクラスを継承したクラスで初期化します。
いきなりメール送信画面が現れるのは不親切なので、確認ダイアログを表示するようにします。

```java:MyApplication.java
import org.acra.*;
import org.acra.annotation.*;

@ReportsCrashes(
    formKey = "", // Google DocsのformKeyの設定なので空文字
    mailTo="<YOUR_EMAIL_ADDRESS>",
    mode=ReportingInteractionMode.DIALOG, // Dialogを表示
    resDialogTitle=R.string.acra_dialog_title, // Dialogのタイトル
    resDialogText=R.string.acra_dialog_text, // Dialogのテキスト
    resDialogCommentPrompt=R.string.acra_dialog_comment_prompt // 発生状況を入力する欄のラベル
)
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        // The following line triggers the initialization of ACRA
        super.onCreate();
        ACRA.init(this);
    }
}
```
strings.xmlに文字列を追加します。

```xml:strings.xml
<string name="acra_dialog_title">クラッシュレポート</string>
<string name="acra_dialog_text">予期せぬエラーが発生しました。アプリを終了します。\nクラッシュレポートを送信しますか?</string>
<string name="acra_dialog_comment_prompt">発生状況を教えてください。</string>
```

AndroidManifest.xmlに定義を追加します。

```xml:AndroidManifest.xml
<manifest ...>
  <application ... android:name="MyApplication">
    ...
    <activity
      android:name="org.acra.CrashReportDialog">
    </activity>
  </application>
  <uses-permission android:name="android.permission.INTERNET">
  </uses-permission>
</manifest>
```

MyApplicationクラスの設定とINTERNETパーミッションの追加します。
また表示されるDialogはDialogテーマのActivityとして実装されているので、<activity>タグでの宣言が必要です。

ACRAの導入は以上です。
とりあえずメールで送信するぐらいだったらサクッと導入できます。

強制終了が発生すると、このようなダイアログが表示されます。
![acra-dialog-sample.png](https://qiita-image-store.s3.amazonaws.com/0/20559/53bc167e-d2e4-c85b-99dc-039c48fa2631.png "acra-dialog-sample.png")

メールで送信するとこんなかんじで届きます。

```
USER_COMMENT=強制終了した！
ANDROID_VERSION=4.4.2
APP_VERSION_NAME=1.0
BRAND=google
PHONE_MODEL=Nexus 5
CUSTOM_DATA=
STACK_TRACE=java.lang.ArrayIndexOutOfBoundsException: length=0; index=1
...
```


余裕できたら、Acralyzerで自動収集する方式も試してみたい。
[HTML5][作業メモ]ドットインストールでHTML5の勉強を始めてみた。

HTML5の知識が必要となったので、dotInstallを用いて学習を行う。  
まずは開発環境の整備から。今回作成した開発環境は以下のとおり。

* OS: Mac OSX
* IDE: NetBeans 7.4(Java EE)
* Chrome: 32.0.1700.77
* JDK: 1.7.0_45
* git: 1.8.3.4

NetBeansを選んだ理由はHTML5、JavaFXを安定して利用できそうだから。また、同様の理由でNetBeasのインストールではJavaEEのプリセットを選択した。

---

### 開発環境作成の手順

下記リンク先の情報を参考にNetbeansをインストール  
このとき、予めローカルにgitリポジトリがあると、プロジェクトをそのまま構成管理ツール上で利用できる。

[HTML5の製作環境としてNetBeans IDEを使ってみる](http://tomotomosnippet.blogspot.jp/2011/05/html5netbeans-ide.html)  
[HTML5アプリケーションの開始](https://netbeans.org/kb/docs/webclient/html5-gettingstarted_ja.html)

----

### 動作確認

環境構築後は下記のコードを写経して、簡単にフォームを作成。

[HTML5 #01 メモ帳の画面を作る](http://dotinstall.com/lessons/memo_html5/2301)


空のHTML5プロジェクトを作ったならば、以下のようなindex.htmlを作成する。
Webブラウザでフォームを動作を確認して、完成。
NetBeansではChromeを利用してリアルタイムプレビューを行うことができた。

```html
<!DOCTYPE html>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<html lang="ja">
    <head>
        <title>HTML5を使ったメモ帳</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width">
    </head>
    <body>
        <h1>メモ帳</h1>
        <textarea id="memo" rows="10" cols="40" name="40"></textarea>
        <p><input type="button" id="save" value="Save"> <input type="button" id="clear" value="Clear">
        </p>
    </body>
</html>
```

このドットインストールは全８回なので、適宜続きを行ってみる。
reportlabで画像追加メモ


###bottomup指定なしの場合

```Python
filename = 'pdftest'
# -*- coding: utf-8 -*-
from reportlab.pdfgen import canvas
from PIL import Image

image =Image.open('/Users/momiji/work/spam.jpg')

pdf_cnvs = canvas.Canvas('./spam.pdf' )  
pdf_cnvs.setPageSize((image.size[0]+10,image.size[1]+10))
pdf_cnvs.drawInlineImage(image,0,0)
pdf_cnvs.save()

```

![スクリーンショット 2014-01-25 22.28.59.png](https://qiita-image-store.s3.amazonaws.com/0/35241/c0b0bf9c-3195-f1ad-d9cd-81968c7f3bac.png "スクリーンショット 2014-01-25 22.28.59.png")

原点が左下。

-

###bottmup=Falseの場合

```Python
pdf_cnvs = canvas.Canvas('./spam.pdf',bottomup=False)  

```

![スクリーンショット 2014-01-25 22.42.18.png](https://qiita-image-store.s3.amazonaws.com/0/35241/d87b961c-31a8-0bf5-ef45-db021d3a3e9e.png "スクリーンショット 2014-01-25 22.42.18.png")
こうなる。

-
###y座標を変更する

```Python
pdf_cnvs.drawInlineImage(image,0,-image.size[1])
```
![スクリーンショット 2014-01-25 23.04.57.png](https://qiita-image-store.s3.amazonaws.com/0/35241/54b8676a-7ee1-74ca-1fff-2e802c6e3b18.png "スクリーンショット 2014-01-25 23.04.57.png")

左上から描画されるが、１８０度回転している。

--
drawInlineImageで画像を貼ると、ipadで途中で途切れる事案発生。
ipadで読むならdrawImageのほうが良かった。
CentOSをChefでセットアップする


VirtualBox上にCentOS6.5をインストールして、Chefをインストールしたのでその記録。

# CentOS 6.5をセットアップする

## VMを作る

このときビデオメモリが初期設定の512MBだとCUIインストーラーしか起動せず、インストールしてもMinimal相当しかインストールできない。

## インストール

とりあえずMinimalでインストールする。

## ネットワーク有効化

ネットワークの設定ファイルを開く。

``` Bash
vi /etc/sysconfig/network-scripts/ifcfg-eth0
```

ONBOOTの値をyesに変更する。

``` Bash
ONBOOT=yes
```

ネットワークの再起動をする。

``` Bash
/etc/init.d/network restart
```

## Chefのインストール

デフォルトでcurlは入っているはずなので、下のコマンドを実行してChefをインストールする。

```
curl -L https://www.opscode.com/chef/install.sh | bash
```

## knife-soloのインストール

ついでにknife-soloをインストールする。
curlでスクリプトからインストールしたChefは/opt/chef以下に自分用のRubyなどをインストールしている。
なので、そちらのgemでknife-soloのインストールを行う。

``` Bash
/opt/chef/embedded/bin/gem i knife-solo --no-ri --no-rdoc
```
さくらVPSを使ってとにかく早くWebサーバ構築までやったときのメモ


細かいことは置いといて、さくらVPSにデフォルトでインストールされているCentOSのままでApacheインストールまでやる手順。

DNSの反映があるけども、順調にいけばVPS契約からWebサイト公開まで１時間くらいでいけると思います。

## 1. さくらVPSで契約
登録したメールアドレスに、VPSのIPアドレスとrootの初期パスワードが送られてくる。

## 2. DNSレコード（Aレコード）設定
デフォルトのホスト名は`wwwxxxx.sakura.ne.jp`みたいになってる。これを、`host.example.com`に変更したいとする。

独自ドメインを使う場合など、ホスト名を変更したい場合は反映に時間かかるので、先にDNSの設定をしておくといい。

## 3. さくらVPSコントロールパネルにログイン
https://secure.sakura.ad.jp/vpscontrol/

IPアドレス、パスワードは、登録時に送られてくるメールに書いてあるものを入力。

※メールに書かれているパスワードは、コンパネのパスワードでもあり、rootアカウントのパスワードでもある。あとからrootのパスワードを変えても、コンパネのパスワードはそのまま（最初に送られてきたやつのまま）なので注意！わかりづらい・・・

## 4. ホスト名を変更（DNSの逆引き設定）
ホスト名の欄にある「変更」リンクをクリックして、DNSの逆引き設定をする。

2で登録したAレコードに使ったホスト名（host.example.com）を設定する。

※2の変更が反映されるまで数十分〜数時間かかるので、反映されないうちに逆引き設定しようとするとエラーになる。
※ここで変更したホスト名は、サーバのhostnameとは無関係なので注意。

## 5. SSHでログイン
Macであればターミナルを使ってVPSにログインする。

```
$ ssh root@host.example.com
```

Windowsは・・・PuTTYとか使ってがんばってください。

## 6. ホスト名を変更（hostsとか）

```/etc/sysconfig/network
- HOSTNAME=localhost.localdomain
+ HOSTNAME=host.example.com
```

```/etc/hosts
- 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
+ 127.0.0.1   host.example.com localhost
```

一旦再起動。

```
# shutdown -r now
```

一度SSHが切断されるので、１分くらい待ってから再び接続。

プロンプトのホスト名が変わってるはず。

```
[root@host ~]#
```

あとは、以下コマンドで確認。

```
# hostname
host.example.com
```

## 7. iptablesでフィルタリング設定

（このあたりの知識はあやしいですが・・・）起動時に読み込んで自動設定するために、設定ファイルを作成する。

```
# vim /etc/sysconfig/iptables
```

以下を保存。SSH,HTTP以外のポートを閉じる。

``` /etc/sysconfig/iptables

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT 
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

```

起動時に読み込んでくれるようにしておく。

```
# chkconfig iptables on
```

以下コマンドで、試しに設定ファイルを読み込んでみる。

```
# /etc/rc.d/init.d/iptables start
```

もしエラーが出たら、何かしら設定が間違ってるので修正を。

念のため、一度再起動させてからもちゃんとSSHで接続できるかを確認しておいたほうが良いです。

## 8. Apacheをインストール

インストールして・・・

```
# yum -y install httpd
```

起動。

```
# /etc/rc.d/init.d/httpd start
```

iptablesと同様に、サーバ起動時にApacheを起動するようにしておく。

```
# chkconfig httpd on
```

これでローカルのブラウザ等で`http://host.example.com`にアクセスするとApacheのデフォルトページが表示されるはず。

## あとは
SSHのセキュリティまわりをきちんと設定するのと、作業用アカウントを作成したりですかね。

- - -
> Blog URL : http://www.utano.jp/ (Syntax Error.)
Boost.Numpyでnumpy.int32のrvalueコンバータの登録

# pythonからC++の関数を呼び出したときにnumpy.int32がdid not match C++ signatureになる問題の解決
Boost.Numpyにrvalueコンバータが不足しているので、それを登録する。
コンバータの不足はBoost.Numpyに限らないと思うので、以下の要領で追加すれば、解決できるはずです。

### ※追記(2014/08/11)
本家の[Boost.Numpy](https://github.com/ndarray/Boost.NumPy)が更新されていたり、boostのバージョンが更新されたので、少し書き直しました。
64bit, Visual Studio 2013, numpy-1.8.1で警告が出ないようにいろいろ修正すると変更箇所が多くなったので、[fork](https://github.com/soyiharu/Boost.NumPy)しました。
64bit, Visual Studio 2013, python3.4(anaconda)でcmakeを利用した環境で付属のテストコードがパスすることを確認しています。

### ※追記(2014/10/29)
以前からの懸案事項であった、intかlongのどちらかしか使えない問題の解決方法を見つけたので、更新しました。
新しい方法の方がうまくできています。
以前のものとは違う方法で、もはや関係がないので、コードは削除しました。(以前の解決方法が気になる方は、リポジトリよりlib/numpy/src/dtype.cppの以前のバージョンを参照してください）

## 動作確認
確認用のコード（[C++でpythonを拡張する(Boost.NumPy)](http://qiita.com/termoshtt/items/0103803c40331c77c727)にあったものを少し変更）
unsigned intとunsigned longを引数とする関数を用意します。

```cpp:mymodule.cpp 
#include "boost/numpy.hpp"

namespace p = boost::python;
namespace np = boost::numpy;

np::ndarray new_zero(unsigned int N) {
  p::tuple shape = p::make_tuple(N);
  np::dtype dtype = np::dtype::get_builtin<double>();
  return np::zeros(shape, dtype);
}

np::ndarray new_empty(unsigned long N) {
  p::tuple shape = p::make_tuple(N);
  np::dtype dtype = np::dtype::get_builtin<double>();
  return np::empty(shape, dtype);
}

BOOST_PYTHON_MODULE(mymodule) {
  Py_Initialize();
  np::initialize();

  p::def("new_zero", new_zero);
  p::def("new_empty", new_empty);
}
```

```make:Makefile
BOOST_INC=C:/boost
BOOST_LIB=$(BOOST_INC)/stage/lib
BOOST_NUMPY_INC=C:/Boost.NumPy
BOOST_NUMPY_LIB=$(BOOST_NUMPY_INC)/lib/Release
PYTHONHOME=C:/Python34
PYTHON_INC=$(PYTHONHOME)/include
PYTHON_LIB=$(PYTHONHOME)/libs

mymodule.pyd : mymodule.obj
	link.exe /DLL /nologo /INCREMENTAL:NO /LIBPATH:$(BOOST_LIB) /LIBPATH:$(BOOST_NUMPY_LIB) /LIBPATH:$(PYTHON_LIB) mymodule.obj boost_numpy.lib /OUT:mymodule.pyd /IMPLIB:mymodule.lib 
mymodule.obj : mymodule.cpp
	cl.exe /c /nologo /Ox /MD /W3 /GS- /DNDEBUG -I$(BOOST_INC) -I$(BOOST_NUMPY_INC) -I$(PYTHON_INC) /Tpmymodule.cpp /Fomymodule.obj /EHsc
```

## 実行

```shell-session
In [1]: import numpy as np                                                     
                                                                               
In [2]: import mymodule                                                        
                                                                               
In [3]: mymodule.new_zero(np.uint32(3))                                        
Out[3]: array([ 0.,  0.,  0.])                                                 
                                                                               
In [4]: mymodule.new_empty(np.uint32(4))                                       
Out[4]:                                                                        
array([  2.47959055e-315,   2.47856790e-315,   3.83525216e-316,                
         4.36620001e-316])                                                     
```

numpy.uint32がunsigned intとunsigned longに変換されているのが分かるかと思います。
ちなみに、numpy.uint64を渡すとエラーになります。bit数が合わないので当然です。
PHPStoemでローカルに立てたサーバにsslで接続するとエラーになる場合の対処法


## 発生した現象
PHPStormでhttps://localhostに接続してJavascriptのデバッグをしようとしたら、例外が発生して接続できませんでした。発生した例外は以下のもの。

> java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

## 原因
PHPStormはJDK6を使っているが、OSX 10.9 MarvericksにはJDK7しか入っていないため。
JDK6が入っていたとしても、https://localhostの自己証明書がJava6に登録されていないため接続できない。

## 対処法
### JDK 6を入れる

Mac Developer Centerにログインして対応したJava6をダウンロードしてインストール。Homeフォルダのシンボリックリンク書き換えなど、下記のページを参考にしました。

http://qiita.com/m_mysht/items/a5e60d260c7078331d66

### JDK6にlocalhostの証明書を登録

```
cd /System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security
cp cacerts cacerts_org
keytool -import -file /path/to/server.crt -keystore /cacerts -alias localhost
```

- keytoolでlocalhostの証明書をJDK6に追加する。
- cacertsを念のためバックアップとっておく。
- server.crtはlocalhostにssl接続するために作った時の証明書。
- keytoolを実行すると、cacertsファイルのパスワードを聞かれる。デフォルトのパスワードは`changeit`
- バージョンによっては`changeme`であるという情報も見たが詳細は不明。

上記を行って、PHPStormを再起動するとJavascriptをデバッグできるようになった。

## その他
PHPのProjectのツリーで、Document Rootのフォルダで右クリックして、Mark Directory As > Resource Rootを設定してやれば、デバッグに使うファイルをそのフォルダから読み込むようになるので、上記の対応はいらないかも・・。（あとから気づいたが真意は不明）
Scipyでデータをnormarizeする


よく忘れるのでscipy.orgから引用してメモ．

```python
>>> import numpy as np
>>> from scipy import stats

>>> a = np.array([ 0.7972,  0.0767,  0.4383,  0.7866,  0.8091,  0.1954,
                   0.6307, 0.6599,  0.1065,  0.0508])

>>> stats.zscore(a)
array([ 1.1273, -1.247 , -0.0552,  1.0923,  1.1664, -0.8559,  0.5786,
        0.6748, -1.1488, -1.3324])

>>> b = np.array([[ 0.3148,  0.0478,  0.6243,  0.4608],
                  [ 0.7149,  0.0775,  0.6072,  0.9656],
                  [ 0.6341,  0.1403,  0.9759,  0.4064],
                  [ 0.5918,  0.6948,  0.904 ,  0.3721],
                  [ 0.0921,  0.2481,  0.1188,  0.1366]])

>>> z_score = stats.zscore(b, axis=1, ddof=1)

>>> z_score
array([[-0.19264823, -1.28415119,  1.07259584,  0.40420358],
       [ 0.33048416, -1.37380874,  0.04251374,  1.00081084],
       [ 0.26796377, -1.12598418,  1.23283094, -0.37481053],
       [-0.22095197,  0.24468594,  1.19042819, -1.21416216],
       [-0.82780366,  1.4457416 , -0.43867764, -0.1792603 ]])

>>> np.allclose(np.mean(z_score, axis=1), np.zeros(5))
True
```

参考(引用)
[scipy.org](http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mstats.zscore.html)