OmniAICreator/Qiita-1.07M huggingface dataset:
さくらクラウドでrootのパスワードを忘れた時の対処法


サーバ設定をしておいてパスワードを忘れていいのは新人までだよねってことで、忘れてしまってごめんなさい。

*パスワードを忘れたって良いじゃない、人間だもの*

ってことで忘れて困った人。

まずこんなキーワードでグーグル先生に問い合わせを行いますよね
「さくらクラウド root パスワード 忘れ」

一番上に出てきた記事がこれ
http://sakura.custhelp.com/app/answers/detail/a_id/1390

・OSの再インストール
・ISOイメージから起動し、Rescueモードを利用する
・コンソール画面から、シングルユーザモードを起動する


まあ一般的なLinuxのルートのパスワードを忘れた時の対処法だと思います。

ただ、これ以外のパスワード再設定方法がありました。

それがここに記載されている「ディスクの修正」というもの
http://support.sakura.ad.jp/manual/cloud/basic/os_reinstall.html

ディスクの修正の部分で
ホスト名とパスワードが変更できました。

まあ今回の場合は、本番運用しているものではない、且つ停止状態にあったのでこの方法が使えるのかと思います。

意外と便利なので驚きました。

ただ、やっぱりrootのパスワードを紛失するとかあり得ないので、管理を徹底する事が重要なのですね。
「プログラムでシダを描画する」をSass(CSS)で描画する

元ネタ
> [プログラムでシダを描画する - 強火で進め](http://d.hatena.ne.jp/nakamura001/20140505/1399316565)
> [「プログラムでシダを描画する」をEmacs Lispで描画する](http://qiita.com/akmiyoshi/items/ff4df934a5a89aaafbcb)
> [「プログラムでシダを描画する」をDartで描画する - Qiita](http://qiita.com/zukkun/items/08b72c9934d3c0c09936)
> [「プログラムでシダを描画する」をGoで描画する - Qiita](http://qiita.com/qt-luigi/items/ec6cd349259fe6cc29eb)
> [Clojure - プログラムでシダを描画する - Qiita](http://qiita.com/woxtu/items/30aebcf15770c438d6fd)
> [「プログラムでシダを描画する」をPythonで描画する - Qiita](http://qiita.com/noc06140728/items/8b8f06cfc312b8492df4)
> [「プログラムでシダを描画する」をJavaScript+Canvasで描画する - Qiita](http://qiita.com/alucky0707/items/ada6514d6068fdff2a8c)
> [「プログラムでシダを描画する」をPHPで描画する - Qiita](http://qiita.com/mpyw/items/dc339f12705f8b97ef67)


追記:
`$flaag: #{random(10) <= 3};`のままだとコンパイルに数時間かかる上にあまり`$flag: #{random(100) <= 25};`でした場合と大差なかったのでソースを`$flag: #{random(100) <= 25};`の方に修正しました。

![fern.png](https://qiita-image-store.s3.amazonaws.com/0/42193/eef4de72-a736-244d-9b84-bcaa36d2cbb1.png)

 

```scss:fern.scss
$N: 20;
$COLOR: green;
$WIDTH: 500px;
$HEIGHT: 500px;

@function W1x($x, $y){ @return 0.836 * $x + 0.044 * $y;}
@function W2x($x, $y){ @return -0.141 * $x + 0.302 * $y;}
@function W3x($x, $y){ @return 0.141 * $x - 0.302 * $y;}
@function W4x($x, $y){ @return 0;}

@function W1y($x, $y){ @return -0.044 * $x + 0.836 * $y + 0.169;}
@function W2y($x, $y){ @return 0.302 * $x + 0.141 * $y + 0.127;}
@function W3y($x, $y){ @return 0.302 * $x + 0.141 * $y + 0.169;}
@function W4y($x, $y){ @return 0.175337 * $y;}


@function f($k, $x, $y, $box-shadow:""){
	@if $k > 0 {
		$box-shadow: f($k - 1, W1x($x, $y), W1y($x, $y), $box-shadow);
		
		$flag: #{random(100) <= 25};
		@if $flag == "true" {
			$box-shadow: f($k - 1, W2x($x, $y), W2y($x, $y), $box-shadow);
		}
		
		$flag: #{random(100) <= 25};
		@if $flag == "true" {
			$box-shadow: f($k - 1, W3x($x, $y), W3y($x, $y), $box-shadow);
		}
		
		$flag: #{random(100) <= 25};
		@if $flag == "true" {
			$box-shadow: f($k - 1, W4x($x, $y), W4y($x, $y), $box-shadow);
		}
		
		@return $box-shadow;
	} @else {
		$s: 490;
		$x: $x * $s + $WIDTH * 0.5;
		$y: $HEIGHT - $y * $s;
		@if $box-shadow != "" {
			$box-shadow: $box-shadow + ",";
		}
		@return $box-shadow + $x + " " + $y + " 0 0 " + $COLOR;
	}
}


.fern{
	width: $WIDTH;
	height: $HEIGHT;
}

.fern:after{
	content: "";
	display: block;
	width: 1px;
	height: 1px;
	background: rgba(255, 255, 255, 0);
	box-shadow: unquote(f($N, 0, 0));
}
```
Lubuntu 14.04 でSSID非公開のアクセスポイントを使用する方法

あらまし
=======

Lubuntu 14.04をインストール後、メニュー→設定→ネットワーク接続からWiFiネットワークを設定しても、
WiFiネットワークにつながらない。ちなみに、Ubuntu 14.04 では問題ない。

SSID非公開のアクセスポイントを使用するには、ひと手間必要になる。

本題
====

まず、メニュー→設定→ネットワーク接続からWiFiネットワークを設定する。

そのあと、以下の手順で`iwconfig`でSSIDを選択する。

SSID非公開アクセスポイントのSSIDを`FooAccessPoint`としたとき、コンソールから以下を入力する。

```console
$ sudo iwconfig wlan0 essid FooAccessPoint
```

これで`FooAccessPoint`に接続してくれる。

参考
====
* http://superuser.com/questions/118551/connecting-to-a-hidden-wireless-network-on-kubuntu
* `man iwconfig` - http://linuxcommand.org/man_pages/iwconfig8.html
vimでhtml.erbファイルを書く時に便利なプラグイン

railsでhtml.erbを書く時に、タグの入力を書く手間を減らすには[surround.vim](https://github.com/tpope/vim-surround)と[rails.vim](https://github.com/tpope/vim-rails)の組み合わせがいい感じのようです。

**インストール**
[neobundle.vim](https://github.com/Shougo/neobundle.vim)を使います

```vim:.vimrc
NeoBundle 'tpope/vim-rails'
NeoBundle 'tpope/vim-surround'
```

**利用方法**

まず以下の１行を`<div>`タグで囲んでみます。

```html+erb:hoge.html.erb
タイトルは@titleです。
```

ビジュアルモードで１行全てを選択後、`S<div>`と入力すると以下のように`<div>...</div>`タグで囲んでくれます。

```html+erb:hoge.html.erb
<div>タイトルは@titleです。</div>
```

次に`@title`を`<%= %>`で囲みます。
ビジュアルモードで`@title`を選択後、`S=`と入力すると、選択部分を`<%= %>`で囲んでくれます。
（この機能を使うにrails.vimを導入する必要があります。）

```html+erb:hoge.html.erb
<div>タイトルは<%= @title %>です。</div>
```
codeigniter で http から https に強制的に飛ばす方法


#やりたかったこと

一部のページだけSSLを適用したいので、http から https へ飛ばす必要が有りました。その際にやったことをまとめます。

#解決法

## functionを作成

libraries/Myclass.php を作成して、
次のようなfunction を書きます。

```Myclass.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 

class Myclass {

	public function force_ssl()
    {
        $CI =& get_instance();
        $CI->config->config['base_url'] = str_replace('http://', 'https://', $CI->config->config['base_url']);
        if ($_SERVER['SERVER_PORT'] != 443)
        {
            redirect($CI->uri->uri_string());
        }
    }

    
}
```

## https に飛ばしたい箇所で function を読み込む

```form.php

    public function form1()

    {
			$this->load->library('myclass');
			$this->myclass->force_ssl();
	}
```

ライブラリを読み込んで、force_ssl を指定。
これで完成。

# まとめ
方法としては、config.php で指定したURLのhttp を https に変えて強制的にリダイレクトかけるっていう、大雑把な感じです。

.htaccess で設定するやり方もあったのですが、何かの理由でできなかったんですよ。今となっては理由を思い出せないですが。

#参考

http://www.davidnard.com/2011/04/easy-ssl-redirection-in-codeigniter/
DeployGateのグループ機能がリリースされたのでAPI経由でアップロードする

グループ機能自体は[こちら](http://qiita.com/k_kinukawa/items/7951f035ac83e77e9ea7)を参照していただきたい

# グループ機能をAPI経由で使う
DeployGateにはPush APIが存在している
そのAPI経由でグループに対してアプリをアップロードしてみる！

## 準備
今の所DeployGateの[APIページ](https://deploygate.com/docs/api)には書いていないが、グループ詳細ページのAPIキー部分にある？に書いてあるのでそれをやる
![スクリーンショット 2014-05-28 23.49.14.png](https://qiita-image-store.s3.amazonaws.com/0/6717/d3d8513d-0172-138d-9f7c-d854bc27be08.png)

この文章によると、グループのAPIキーは今の所アップロードには使わないらしい
APIキーは各自のを使い、owner name部分にグループの名前を入れる

## アップロード
ということで以下のコマンドを叩けばグループにアップロード出来た

```shell-session
$ curl -F "file=@sample.apk" -F "token=your api key" -F "message=sample" https://deploygate.com/api/users/group_name/apps
```

便利

# 余談
僕が作ってる[DeployGateのGradleプラグイン](https://github.com/DeployGate/gradle-deploygate-plugin)でも、userNameにグループ名を、tokenに自分のAPIキーを書くことでグループ機能のアプリに対してもアップロード出来ます
お使いください
Haskellの関数の動作チェック2

# 関数の使い方メモ

動作環境
GHCi, version 7.6.3

## (++)関数
```
Prelude> import Data.List
Prelude Data.List> [] ++ "abc"
"abc"
Prelude Data.List> [] ++ [1,2,3]
[1,2,3]
Prelude Data.List> [] ++ []
[]
Prelude Data.List> "abc" ++ []
"abc"
Prelude Data.List> [1,2,3] ++ []
[1,2,3]
Prelude Data.List> "abc" ++ "def"
"abcdef"
Prelude Data.List> [1,2,3] ++ [4,5,6]
[1,2,3,4,5,6]
Prelude Data.List> [] ++ [1..]
[1,2,3,4,5,Interrupted.　　　　　　　　　　　　(処理中断)
```

## length関数
```
Prelude Data.List> length []
0
Prelude Data.List> length [1]
1
Prelude Data.List> length [1,2]
2
Prelude Data.List> length "abc"
3
Prelude Data.List> length ["abc","def"]
2
Prelude Data.List> length [1..]
Interrupted.
Prelude Data.List> length ""
0
```

## reverse関数
```
Prelude Data.List> reverse []
[]
Prelude Data.List> reverse[1,2,3]
[3,2,1]
Prelude Data.List> reverse []
[]
Prelude Data.List> reverse [1,2,3]
[3,2,1]
Prelude Data.List> reverse "abc"
"cba"
Prelude Data.List> reverse [1]
[1]
Prelude Data.List> reverse "a"
"a"
Prelude Data.List> reverse [1..]
Interrupted.
```

## intercalate関数
```
Prelude Data.List> intercalate "abc" ["eee", "fff", "ggg"]
"eeeabcfffabcggg"
Prelude Data.List> intercalate "" ["eee", "fff", "ggg"]
"eeefffggg"
Prelude Data.List> intercalate "" ["", "", ""]
""
Prelude Data.List> intercalate [1,2] [[333, 444], [555, 666], [777, 888]]
[333,444,1,2,555,666,1,2,777,888]
Prelude Data.List> intercalate [1,2] [[], [], []]
[1,2,1,2]
```

## transpose関数

```
Prelude Data.List> transpose ["abcde"]
["a","b","c","d","e"]
Prelude Data.List> transpose ["abcde", "fghij"]
["af","bg","ch","di","ej"]
Prelude Data.List> transpose []
[]
Prelude Data.List> transpose [[], [], []]
[]
Prelude Data.List> transpose [[], [1], []]
[[1]]
Prelude Data.List> transpose ["123", "45", "6789"]
["146","257","38","9"]
```
AngularJSにあったLoading(ローディング)／Progress(プログレス)を簡単に表示するライブラリ

AngularJSだけでもないが、ちょっと長めの検索処理などを実装する際に、UIで検索処理中なのか、フリーズしてるのかわかりづらいため、いわゆるローディングのアイコンを表示したくなったりする。
AngularJSにも、$rootScopeを使ったローディングのサンプルなんかはあるには、あったがスキル不足のためか、うまく表示できなかった。
ということで、Googleで検索して見つけました。

# 本家
[ngProgress](http://victorbjelkholm.github.io/ngProgress/)

*A slim, site-wide progressbar for AngularJS*
とうたわれているので、かなり軽量なのかと期待しましたが、
後で考えると、細い線のプログレスバーだと言いたいのだと理解しました。
※決して重くはないです。

# 導入方法（我流）
1. 上記ホームページから[ngProgress.min.js](https://raw.github.com/VictorBjelkholm/ngProgress/master/build/ngProgress.min.js)のリンクを右クリックでダウンロード
2. GitHubの[ngProgress.css](https://github.com/VictorBjelkholm/ngProgress/blob/master/ngProgress.css)を取得。(自分は、選択してコピーして、テキストエディタに貼り付けました)
3. 次に、ホームページの *Usage* の章のサンプルコードみながら、JSファイルのリンクを追加したり、`var app`のコール時に、*ngProgress* を指定したり、 *Controller* の引数に追加したりすれば、導入は完了です。（英語ですがあえて読まなくても大丈夫でした）
4. 最後に、*API*の章に、`ngProgress.start()`だとか`ngProgress.complete()`というメソッドの例があるので、検索処理など時間のかかるリクエストの前後に実装すれば完了です。

# ポイント
* `var app`宣言のパラメータを忘れないようにしましょう。（わかっているとは思いますが、念のための注意）
* ボタン連打や非同期処理が重なるケースがある場合は、`ngProgress.start()`の前に、`ngProgress.reset()`をコールしておくと安定しそうです。
* たまにプログレスバーが暴走して、行ったり来たりするのは、おそらく僕の実装不備だと思っています。

# 感想
導入が簡単なわりには、嫌味のないプログレスバーが導入できます。
色や高さも調整できるようなので、多少のカスタマイズもできそうです。
Rails で不可算名詞を扱う方法

# 目的

例えば knowledge リソースを扱いたい場合に url が /knowledges となってしまうのを /knowledge にしたい

# 方法
## `config/initializers/inflections.rb ` へ追加する
`rails new APP_NAME` で生成される`config/initializers/inflections.rb`のコメントに書いてある通り。
knowledge を追加したい場合は、以下のようにする。

```rb:config/initializers/inflections.rb
ActiveSupport::Inflector.inflections(:en) do |inflect|
  inflect.uncountable %w( knowledge )
end
```

これを設定することで knowledge が不可算名詞扱いとなり、`pluralize`, `singularize` の結果が knowledge のままとなる。以下は`rails c`の結果。

```
# before
irb(main):001:0> 'knowledge'.pluralize
=> "knowledges"

# after
irb(main):001:0> 'knowledge'.pluralize
=> "knowledge"
```

scaffold の実行結果も変わります。controller の名前が knowledges_controller から knowledge_controller になる。route も変わるので url が /knowledge になってスッキリ。

```
# before
$ rails g scaffold Knowledge
      invoke  active_record
      create    db/migrate/20140528134235_create_knowledges.rb
      create    app/models/knowledge.rb
      invoke    test_unit
      create      test/models/knowledge_test.rb
      create      test/fixtures/knowledges.yml
      invoke  resource_route
       route    resources :knowledges
      invoke  scaffold_controller
      create    app/controllers/knowledges_controller.rb
      invoke    erb
      create      app/views/knowledges
      ####### 以下省略 #######

# after
$ rails g scaffold Knowledge
      invoke  active_record
      create    db/migrate/20140528134451_create_knowledge.rb
      create    app/models/knowledge.rb
      invoke    test_unit
      create      test/models/knowledge_test.rb
      create      test/fixtures/knowledge.yml
      invoke  resource_route
       route    resources :knowledge
      invoke  scaffold_controller
      create    app/controllers/knowledge_controller.rb
      invoke    erb
      create      app/views/knowledge
      ####### 以下省略 #######
```

# 余談

一部の単語は rails 側で登録されている。
https://github.com/rails/rails/blob/b22b1882238b08ed341bebc32335b6b6f6f64dfb/activesupport/lib/active_support/inflections.rb#L68

# メモ

- `ActiveSupport::Inflector` が `pluralize` 系の解決をする
- `ActiveSupport::Inflector` は不可算名詞だけじゃなく、people, person などの不特定のケースも対応できる

# 動機

Rails のレールに乗るからには仕方ないのか？ってのが気になって調べた。もしかしたら後で困ったときに使いそうなのでメモした。

# SEE ALSO

[Railsで単数形を複数形に変換する方法と、その変換がうまく行かない場合の対処法](http://d.hatena.ne.jp/kiyo560808/20101110/1289411761)
Android Studio(Gradle)からAndroid Bootstrapを利用する

割と便利そうな[Android Bootstrap](https://github.com/Bearded-Hen/Android-Bootstrap)ですが、公式Wikiを見てもセットアップ方法はEclipseを対象にしたソレしか無い模様。

時代はGradleということで、Gradleな（Android Studioな）プロジェクトからAndroid Bootstrapを利用します。

## サブモジュールに追加する

gitを利用する前提とします。

自分のAndroidプロジェクトのルートで


```
git submodule add git@github.com:Bearded-Hen/Android-Bootstrap.git AndroidBootstrap
```

Android Bootstrapをサブモジュールとしてプロジェクトに追加しました。

## プロジェクトから参照する

自分のプロジェクトの`setting.gradle`を開いて


```diff
include ':app'
+ include ':AndroidBootstrap:AndroidBootstrap'
```

そして、`app/build.gradle`に


```diff
dependencies {
+ compile project(':AndroidBootstrap:AndroidBootstrap')
}
```


## フォントを追加する

最後に、`AndroidBootstrap/fontawesome-webfont.ttf`を`app/src/assets`にコピーします。

これで完了。それっぽいデザインのアプリを少ない手数で作れて嬉しいですね。
WebStormでNode.jsアプリをデバッグする(Mocha, Typescript版もあり)

WebStormだと様々な形式のNode.jsアプリが簡単にデバッグできます．
実際に画像で見てみましょう

# 単純なNode.jsアプリの場合

## 1. Javascriptを書いてブレークポイントを置く
![rapture_20140528221455.png](https://qiita-image-store.s3.amazonaws.com/0/10713/f4b7bce7-b45d-f1be-d9b9-f57fcf170369.png)


## 2. 右クリック＞Debug app.js
![rapture_20140528221615.png](https://qiita-image-store.s3.amazonaws.com/0/10713/63654c58-5c61-1f6e-8e69-54fb652402c8.png)

## 3. やったぜ
![rapture_20140528221653.png](https://qiita-image-store.s3.amazonaws.com/0/10713/3d0acbde-9034-aeec-35ab-4194ef8ee5a4.png)

# Mochaのテストをデバッグしたい場合

## 1. mochaを入れる
上メニューFile>Settings > Node.js and NPM > 緑の＋ボタン > mochaをInstall Package
![rapture_20140528221942.png](https://qiita-image-store.s3.amazonaws.com/0/10713/a0fc8bca-80a3-9ff6-da47-bbb22d7b4874.png)

## 2. mochaのテストを書いてブレークポイントを置く
testというフォルダを作ってその中にテストJS
![rapture_20140528224001.png](https://qiita-image-store.s3.amazonaws.com/0/10713/a8e3ba01-1447-4bd9-1fe8-7892351b9f1a.png)

## 3. 上メニューRun>Edit Configurations
![rapture_20140528221118.png](https://qiita-image-store.s3.amazonaws.com/0/10713/577c8ac3-8d79-e229-3c95-3f375ef2da43.png)

## 4. 左上の＋ボタン＞Mocha
![rapture_20140528221230.png](https://qiita-image-store.s3.amazonaws.com/0/10713/c01b6028-4f47-f66a-68d8-5577fe309cb6.png)

## 5. Mochaの設定をしてOKで閉じる
![スクリーンショット 2014-05-28 22.30.51.png](https://qiita-image-store.s3.amazonaws.com/0/10713/5c0c581d-2a27-f811-43a8-762d98d18f69.png)

ほとんどの項目は初期のままでよい．
以下の項目は自分で指定する必要があるかも

| 項目名 | 意味 |
|:------|------:|
|Mocha package|mochaの場所．node_modules/mochaとなるはず|
|Test directory|テストjsが入っているフォルダ|

## 6. 右上にあるデバッグボタンを押す
![rapture_20140528224122.png](https://qiita-image-store.s3.amazonaws.com/0/10713/2af429ba-ff6d-02e0-ddc5-b4e87d6eabe9.png)

## 7. やったぜ
![rapture_20140528224205.png](https://qiita-image-store.s3.amazonaws.com/0/10713/abff8d11-16cc-edf1-2c54-8e294e102c5b.png)


# Typescriptの場合

## 1. Typescriptを入れる
mochaを入れる手順と同じ
![スクリーンショット 2014-05-28 22.43.33.png](https://qiita-image-store.s3.amazonaws.com/0/10713/5161d049-8a0c-2665-d6cb-3d8a2a412b1f.png)

## 2. Typescriptファイルを作るとヒントが出るのでAdd watcher
![rapture_20140528224543.png](https://qiita-image-store.s3.amazonaws.com/0/10713/1fc69659-f425-bd5a-5691-53b2f8571e6d.png)

## 3. Typescriptを書いてブレークポイントを置く
![rapture_20140528225356.png](https://qiita-image-store.s3.amazonaws.com/0/10713/42b250f6-92f3-f361-4d97-3b0f880cb33a.png)

## 3. __コンパイルされたjsファイル__で右クリック＞Debug app.js
![rapture_20140528225325.png](https://qiita-image-store.s3.amazonaws.com/0/10713/864965f5-26b3-029b-d33c-84b0b4b1b459.png)

## 4. やったぜ
![rapture_20140528225512.png](https://qiita-image-store.s3.amazonaws.com/0/10713/f2a268cb-cb25-6aa9-73e5-0f71f2fc5f68.png)
Chromeでデスクトップキャプチャーするには

# 2018/10追記

月日が流れ、 Screen Capture APIなるAPIが実装されたようです。
Qiitaでは以下の記事が分かり易そうでした。

- [Chromeのブラウザ内（もしくはデスクトップ）操作をJavaScriptで録画する - Qiita](https://qiita.com/zaru/items/4b766dc3cdee90a2faf8)



# 事前準備

- コマンドライン引数の「--enable-usermedia-screen-capturing」が必要
- オレオレ証明書で良いのでhttpsでアクセスできるページのみ有効


## OSXのコマンドライン引数

```bash
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --enable-usermedia-screen-capturing
```

## Windows

```text
C:\Users\foo\AppData\Local\Google\Chrome\Application\chrome.exe --enable-usermedia-screen-capturing
```

## 注意

すでにChromeが起動していると有効にならない

# HTMLを用意

```
<html>
<meta charset="UTF-8">
<video id='world' width="256" height="256" autoplay></video>
<button onClick="start()">start</button>
<button onClick="stop()">stop</button>
<script>
var video = document.getElementById("world");
var localStream;
 
function start() {
    if (navigator.webkitGetUserMedia) {
        navigator.webkitGetUserMedia({
            audio: false,
            video: {
                mandatory: {
                    chromeMediaSource: 'screen',
                    minWidth: 1280,
                    maxWidth: 2560,
                    minHeight: 720,
                    maxHeight: 1440
                }
            }
        }, function (stream) {
            localStream = stream;
            var url = window.webkitURL.createObjectURL(stream);
            video.src = url;
            video.play();
        }, function (error) {});
    }
}

function stop() {
    if (navigator.webkitGetUserMedia) {
    	localStream.stop();
    }
}
</script>
</html>
```

# httpsでHTMLをアクセスできるようにする

[koaでhttpsを使う](http://qiita.com/kjunichi/items/6feb9b8c4eb1e796e91d)などを参考にw

# じつは

この機能は[将来的に廃止予定](https://code.google.com/p/chromium/issues/detail?id=347641)らしい

# 関連投稿

- [node.jsでchrome.exeをオプション付きで起動して終了するには - Qiita](https://qiita.com/kjunichi/items/219cc62283a33e9a7844)

# 関連記事

- [Atom Shellでデスクトップキャプチャー（動画）アプリ](https://abrakatabura.hatenablog.com/entry/2014/05/29/075150)
- [デスクトップキャプチャーをChromeの機能拡張で実現](https://abrakatabura.hatenablog.com/entry/2014/06/05/072328)
- [祝！Electron V0.36.0でAdd desktopCapturer module.](https://abrakatabura.hatenablog.com/entry/2015/12/12/184103)
- [Windowsでデスクトップキャプチャーして動画をつくるには](https://abrakatabura.hatenablog.com/entry/2017/04/07/070355)
MQTT-SN と MQTTの違いのまとめ

MQTT-SNにはMQTTにはないメッセージと、同じメッセージでもMQTTとは異なるフォーマットがある。　これはペイロードの長さの制限から、長いトピックが使用できず、２オクテットの整数に置換する必要があるためである。　以下にMQTTと異なるメッセージを列挙した。
##ADVERTISE
G/Wはそのプレゼンスをクライアントに通知するために、定期的にブロードキャストする。　
クライアントは可動中のG/WのアドレスとIdをG/Wリストとして保持する。　AdvertiseとGwInfoの受信でこのリストを更新する。　またクライアントは、Duration * Nadv　時間内にAdvertiseを受信していることで、G/Wが稼働中である事を知る。　

##SERCHGW　
クライアントはネットワークに接続した時に、SERCHGWでG/Wを検索する。　接続からSERCHGW送信までの時間は0〜Tserchまでのランダムな時間とする。これは複数のクライアントが同時にSERCHGWを送出する無駄を省くためである。

##GWINFO
G/WはSERCHGWを受信するとGWINFOを返信する。　クライアントはGWINFOを受信したら、G/Wリストを更新する。　GWINFOではSERCHGWと同じRadiusを使用する。　GWINFO送信までの時間は0〜Tgwinfoまでのランダムな時間とする。

##CONNECTION
クライアントはG/Wと接続する。G/Wはクライアントのプロキシーとなってブローカーと接続する。　マルチG/Wの場合、接続中のG/Wがダウンしたら、バックアップのG/Wに再接続する必要がある。

##REGISTER
クライアントはTopicNameをG/Wに登録し、TopicIdをREGACKで受け取る。　REGACKでエラーが報告されるとTwait待って再度REGISTERする。　G/WもクライアントにREGISTERを送信することがある。　（クライアントがワイルドカードでSubしたした場合、ClearnSessionフラグ無しでGwに再接続した場合）
G/WはクライアントがSubしたワイルドカードのTopicについてサーバーからPubされた場合、そのTopicに対応するTopicIdがG/Wに登録されていなければ、登録しクライアントにREGISTERを送信する。　この場合にはREGISTERにTopicIdが入力されている。
REGISTERを受診したクライアントまたはG/WはREGACKで返信する。

Pre-definedTopicはクライアントとG/W間で予め決めているもので、登録なしで使用できる。　G/Wとクライアント間の通信などに使用できる。　G/Wによるクライアントの制御に活用できる。
クライアントが未知のTopicIdを受診した時、PUBACKの応答はReturnCode=”Rejected:Invalid TopicId” となる。　この応答を受けてG/WはTopicを削除するか、変更する。

##PINGREQ
クライアントはCONNECTで指定したKeepAliveTimeでPINGREQをG/Wに送信する。　G/WはPINGRESPで応答する。　同様に、クライアントはG/WからのPINGREQを受信すると、PINGRESPを送信する。　クライアントはPINGREQを数回送ってもPINGRESPを受信できない場合には、他のG/Wに再接続する。　他のG/Wに再接続が集中しないようにKeepAliveTimeはそれぞれのクライアンで異なる値をとる。

##DISCONECT
DISCONNECTのDurationはsleepする時に指定する。　Durationの指定があるときはASleep。
G/Wは、このDurationでクライアントがCONNECTすればActive、PINGREQすればAwake、何もなければLostと判断する。　G/WはClientIdがセットされたPINGREQを受信した場合、sleepタイマーをリセットしAwakeになったと判断する。　クライアントにPubすべきデータを受信していなければ、直ちにPINGRESPを返信する。　PubデータがあればPubする。　その後PINGRESPを返信する。
クライアントはPINGRESPを受信後Asleepになる。　G/Wはクライアント用のスリープタイマーを再起動する。　クライアントはPINGRESPを送信した後、PINGRESP以外のメッセージを受診したら、Tretryタイマーを起動し、PINGRESPを受診したら、タイマーを止める。　TretryタイマーがタイムアップしたらPINGREQを再送してTretryタイマーを起動する。　リトライ回数はクライアントが決める。　(バッテリーの消耗を防ぐため)　PINGRESPが受信できなければクライアントはAsleepになる。　クライアントはsleep　Duration後Pubすべきデータがなければ、CONNECTせずにPINGREQでG/Wが稼動していることを確認するだけとすべき。

DISCONNECTのCleanSession Flgがセットされていれば、G/Wはそのクライアントのデータを削除する。　

##SUBSCRIBE
TopicNameにワイルドカードが含まれていたら、SUBACKのTopicIdは0x0000となる。　G/WはTopicIdが0x0000の場合、最初のPubでTopicNameとTopicIdをREGISTERでクライアントに通知する。
Pre-defined TopicであってもSubが必要。
koaでhttpsを使う

# koaでhttpsを使う

```
var https = require('https');
var options = {
key: fs.readFileSync(__dirname +"/key.pem"),
cert: fs.readFileSync(__dirname +"/cert.pem")
};
https.createServer(options, app.callback()).listen(4430);
```

expressと違い、#callbackが必要だった。

## オレオレ証明書でためすには

key.pem、cert.pemの2ファイルを用意する。

自分は[昔書いたブログ記事](https://abrakatabura.hatenablog.com/entry/2013/09/18/070657)を参考にすると作れる。

### Windowsだとハマるかも

オレオレ証明書の作成をWindowsでやったら、BOM付で作られ、そのままだとエラーで怒られたので、BOMなしにして、ついでに改行コードもLFに変換したら動いた。


# 関連記事

- [Atom Shellでデスクトップキャプチャー（動画）アプリ](http://kjunichi.cocolog-nifty.com/misc/2014/05/atom-shell-c5d0.html)
@RequestPartについて

multipart/form-dataでファイルのアップロードを行う時用のアノテーションです。
これまでも@RequestParamでファイルを受け取ることができていましたが、
何が違うのか。
<a href="http://docs.spring.io/spring/docs/3.1.x/javadoc-api/org/springframework/web/bind/annotation/RequestPart.html">Springのドキュメント-RequestParam(English)</a>にもある通り、
<ul>
	<li>@RequestParam　は単純なname-valueの値を扱うためのもの</li>
	<li>@RequestPart　　　はJSONやXMLなど、より複雑な構造のデータを扱うためのもの</li>
</ul>
です。ただ、今までできなかったわけではないことは知っての通り。
@RequestParamと@RequestBodyを使えば同じことはできますよね。

@RequestPartにしかできないことは、
@RequestPart("meta-data")で送られてくるメタ情報を受け取ることができる、ということ。

他にも違うことができるかもしれませんが、
直近で私が@RequestPartを選ぶ基準は、
メタデータで何かすることがあれば@RequestPartを使う。
としようと思います。
EC2（Amazon Linux）にHubotを入れて、HipChatでBot化するまで


* [Hubotをインストール、hipchatと連携し、foreverでデーモン化(CentOS6.4)](http://qiita.com/kon_yu/items/cdc452bcd2bb89f85de1)を参考。
* EC2のインスタンスを立ち上げ後、SSHアクセスした状態を前提。

## 始めにタイムゾーンの設定とアップデート
	$ sudo yum update
	$ sudo cp /usr/share/zoneinfo/Japan /etc/localtime 

## Hubotに必要なパッケージのインストール

	$ sudo yum --enablerepo=epel install npm redis

## redisの起動

	$ sudo /etc/init.d/redis start
	redis-server を起動中:	[  OK  ]

## coffee-scriptとhubotのインストール

	$ sudo npm install -g coffee-script hubot
	$ hubot --create mybot
	$ cd mybot
	$ npm install

## hubotの動作確認
	$ ./bin/hubot
	Hubot> hubot ping
	Hubot> PONG
	Hubot> exit

## hubot-hipchatのインストール
	$ sudo yum install libicu-devel
	$ npm install hubot-hipchat --save

## HipChatで起動するためのスクリプトを作る
``~/mybot/``内で起動用のスクリプトファイルを作る。

	$ vi run.sh

```run.sh
#!/bin/bash

export HUBOT_HIPCHAT_JID="jid"
export HUBOT_HIPCHAT_PASSWORD="password"
bin/hubot --adapter hipchat
```

HUBOT_HIPCHAT_JIDはHipChatにログインした時にある設定項目の、Account Infoのjabber IDの値を設定します。

## 動作させる
	$ sh ./run.sh
	[Wed May 28 2014 00:00:00 GMT+0900 (JST)] INFO Connecting HipChat adapter...
	[Wed May 28 2014 00:00:00 GMT+0900 (JST)] INFO Connected to hipchat.com as @****
	[Wed May 28 2014 00:00:00 GMT+0900 (JST)] WARNING The HUBOT_AUTH_ADMIN environment variable not set
	[Wed May 28 2014 00:00:00 GMT+0900 (JST)] INFO Data for brain retrieved from Redis
	[Wed May 28 2014 00:00:00 GMT+0900 (JST)] INFO Joining ******_*****@conf.hipchat.com


## デーモン化
foreverをインストール

	$ sudo npm install forever -g

インストール後、先程作ったrun.shにforeverの記述を追加する

```run.sh
#!/bin/bash

export HUBOT_HIPCHAT_JID="jid"
export HUBOT_HIPCHAT_PASSWORD="password"

forever start -c coffee bin/hubot -a hipchat

```

再度動作させる

	$ sh ./run.sh
	
``info: Forever processing file: bin/hubot``の様なメッセージが出たら成功！

## 話しかける

![スクリーンショット_2014-05-28_22_04_23.png](https://qiita-image-store.s3.amazonaws.com/0/1165/cf465fa8-37b7-02ed-d12b-124c0d8042ef.png "スクリーンショット_2014-05-28_22_04_23.png")

やったね！
PHPオブジェクト指向入門（後半）

# **コンセプト**

オブジェクト指向プログラミング未経験者～理解を深めたい人、ノンケ～ホモまで幅広くカバーするつもり。多分。

# **[クラスとオブジェクト（初級）](http://qiita.com/mpyw/items/41230bec5c02142ae691#1-2)**

# **[クラスとオブジェクト（中級）](http://qiita.com/mpyw/items/41230bec5c02142ae691#1-3)**

# **クラスとオブジェクト（上級）**

非常に長くなりそうだったので分けました。こっちは書くペース遅いと思います、あともう前半で出し尽くした感あるのでそんなに期待しないで（

## **遅延静的束縛**

## **抽象クラス**

## **インターフェース**

## **オーバーロード**

## **トレイト**

## **名前空間**

## **オートロード**

## **`use` `self` `static` `parent` `final` キーワードに関するまとめ**

## **`オーバーライド` `オーバーロード` `オートロード` に関するまとめ**

## **ジェネレータ**

## **エラーハンドラ**

## **例外スタック**

## **バージョン毎の差異の概要**

# **暇人向けの考察**

## **「配列」「オブジェクト」における「キー」「プロパティ」の扱い方の差異**

## **どこまでアクセス権に配慮すべきか**

## **PHPのマジックメソッドは安全か**

## **どこまで例外処理をすべきか**

## **シングルトンパターンとの正しい付き合い方**
AnsibleFest NYC 2014 スライドまとめ


自分用にまとめました。

[AnsibleFest NYC 2014](https://www.eventbrite.com/e/ansiblefest-nyc-2014-tickets-10952628607?&__hssc=5198188.2.1401280997240&__hstc=5198188.5ec3e47e80cd8e247c1aa9be00646186.1394271240131.1396453821332.1401280997240.6&hsCtaTracking=261f3d79-418d-441d-9076-f8182c662981%7C130401c9-5325-43a8-a421-34073706af66)

リンクなしのやつは見つかりませんでしたorz..

"What’s New In Ansible” — Michael DeHaan, Founder & CTO, Ansible
["Ansible and Notification Modules”](http://www.mattmakai.com/static/presentations/2014-ansible-notification-modules.html#/) — Matt Makai, Twilio
["Ransack - an application built on Ansible’s API”](https://speakerdeck.com/angstwad/ansiblefest-ransack-an-application-built-on-ansibles-api) — Paul Durivage, Rackspace
["Monitoring Driven Deployment” - Itamar Hassin, ThoughtWorks](http://www.slideshare.net/ItamarHassin/monitordriven-development-using-ansible-34920480)
["How edX uses Ansible”](https://speakerdeck.com/jarv/how-edx-uses-ansible), John Jarvis, edX
[“Ansible & Docker”](http://www.slideshare.net/PatrickGalbraith/docker-ansible-34909080) - Patrick Galbraith, HP
["Ansible Tower](https://www.youtube.com/watch?v=xqozpN09y1c) - Dave Johnson, Ansible
[“Ansible and GCE”](https://speakerdeck.com/erjohnso/ansiblefest-nyc-2014) - Eric Johnson, Google
[“#ansible at Twitter, Managing the Flock”](https://www.youtube.com/watch?v=fwGrKXzocg4) - Steve Salevan, Twitter
Arduinoスケッチの見つかりにくく時に重大なミス（配列）

配列を扱う時に犯しやすく、重大なバグにつながる可能性のある間違いのメモ。

#配列のおさらい
配列は変数の集合であり、一つの変数で複数の値（要素）を扱うことができる。
###宣言

~~~~~~~~~~
int a [5] = {5,6,7,8,9};
int b [] = {1,2,3,4};
int c [4]; 
~~~~~~~~~
[]内で要素の数を指定し、{}内に要素を記述する。
要素の数を指定しない(b)で、または要素を指定しない(c)で初期化することもできる。
###要素
それぞれの要素は変数名と添字によって表される。上記の例であれば以下のようになる。
aは以下の要素の集まりである。

~~~~~~~~~~~~~~~
a[0]=5,a[1]=6,a[2]=7,a[3]=8,a[4]=9
~~~~~~~~~~~~~~

#配列指定時のバッファオーバーフロー
配列で指定した要素を超えて要素を書き込んでしまうこと。
int a[5];と指定したにも関わらずa[10]=10;と書き込むなど。 
##なぜ見つけにくいか？
エラーがでない場合があるため。プログラムに割り当てられたメモリ内に空きがある場合、指定していない領域に意図しない形で書き込みが行われるが、書き込み自体は行われるためエラーは出ない。しかし他処理で使うメモリ領域に書き込みが行われると重大な問題となる可能性がある。

##注意が必要な点
###添字のカウント
添字は０からであり１からではない。
下記はaの５つの要素に1を入れる、という処理をしようとしているが、
a[0]が空、a[1]〜a[4]は1、そして宣言していないa[5]に1を書き込んでおり、どこか不明なメモリ領域にa[5]の値1を記録してしまう。

~~~~~~~~~~~~~~~~~~~~
int a[5];
for ( i=1;i<=5;i++){
a[i]=1;
}
~~~~~~~~~~~~~~~~~~~~

###文字列を扱う場合
char型の配列を扱う場合、文字数＋1の大きさ(要素数)が必要なことに注意。char型の場合最後にNull終点文字が自動的に付加されるため。
下記ではoneは３文字だが実際に必要なのはNull終点含め４文字分であり、オーバーフローが起こる。

~~~~~~~~~~~~
char a[3];
char b[]="one";
strcpy(a,b);
~~~~~~~~~~~~~


あと致命的な間違いにはならないが、Arduinoのスケッチ(というかC++)では「配列変数から配列変数への直接代入はできない」というのを忘れがちなので心に留めておく。
PythonのDict圏

> Pythonは辞書(dict)ってのを使っているけど、キーが文字列じゃないのに辞書というのはちょびっと違うかも、という気が少しするけど、Hashよりは圧倒的にましだと思う。値群とキー群の格元の対応付けという意味では、数学的には関数と呼ぶのも正しい気がするけどそれはまた混乱を呼ぶ。
> [https://twitter.com/shibu_jp/status/471445247973527553](https://twitter.com/shibu_jp/status/471445247973527553)

> まぁ、map(射)が一番無難な気がする。
> [https://twitter.com/shibu_jp/status/471445639964815360](https://twitter.com/shibu_jp/status/471445639964815360)

Pythonの辞書は例えば `{'a': 10, 'b': 20}` のようなkeyとvalueの組の集合ですが、当然この例ではString全域で定義されてないのでこのdictは写像(函数)ではありません。
しかしこれをどうにか射と呼べないかと思って色々考えてまとめてみました。

勝手に考えたことなので以下には重大な誤りが含まれている可能性があります. 見つけたらコメント等で指摘してください.

## Dict圏

以下, 型と呼べばPythonのビルトインなクラスのインスタンスの集合を考え, それ以外の(自作クラスなどの)インスタンスなどはひとまず考えないことにする.
辞書のkeyとvalueの型を固定する. すなわち, keyとvalueの集合はPythonの標準的な型(Bool, Int, Str, [Int], ...)であって, 型1つのみである.
keyが型$A$, valueが型$B$であるような辞書は自然にこれらの直積の部分集合と同一視し, さらに辞書は$A \to B$なる写像の部分グラフとみなすこともある.

このとき、以下を **Dict圏** とよぶ.

- 対象: Pythonの型
- 射: $f:X \to Y$がDict圏の射であるとは, $f$は$X$をkey, $Y$をvalueとする辞書である.
- 射の合成: $f:X \to Y$, $g:Y \to Z$が与えられたとき, $g \circ f:X \to Z = [(x,z); \exists y: (x,y) \in f, (y,z) \in g]$と定める. これは値の合成が可能なものは合成しそれを集めた辞書である.

これは自然に圏の構造をもつ. 任意の対象$X$に対し$1_X = [(x,x); x \in X]$(これは写像として恒等写像$X \to X$のグラフである)が恒等射である.

## 性質

$A,B$を型, $f,g:A \rightrightarrows B$を平行射とする. このとき以下は明らかである.

- terminal object: terminal objectが存在すれば, `N = {}` のような元を持たない型である. このとき任意の型からの一意的な射 `{}` がのびる.
- product: $A \times B$とは, 集合としての直積である. PythonではこれはAとBのタプルとして定義されている. $p_A = [((a,b), a); a \in A, b \in B]:A \times B \to A$は射影であり, 任意の対象と射の組$Z, z_A, z_B$に対しUMPから導かれる射$h$は $h = [(z,(a,b)); \exists z. (z,a) \in z_A, (z,b) \in z_B \wedge \exists z. (z,a) \in z_A, b \in B \wedge \exists z. (z,b) \in z_B, a \in A]$となる. (この$h$は, $z_A$における組と$z_B$における組の和集合をとったものである. ただし共通の$z$に対して組が存在すればそれらの組を対応させ, 存在しなければそれは$A,B$から適当に取ってきて作ることとする. こうして定まる$h$は図式を可換にする射である.)
- equalizer: $f,g$のequalizer $(E,e:E \to A)$ は $E = [ a \in A; \exists v: (a,v) \in f, (a,v) \in g ] $, $e = [(a,a); a \in E] $ である.

productやequalizerはSetと同様に構成が可能である. ただしここでは射の記述に辞書の言葉を用いた. また, pullbackの存在は以下で保証される.

Fact. 圏$\mathscr{C}$がterminal object, binary product, equalizerを持てば有限極限をもつ.

よってDict圏は有限極限を持つことが分かった.

- exponential: $Z^X$は$X$から$Z$への射全体である. このとき, evaluationは次のような辞書である: $e = [((f,x), z); \exists (x,z) \in f]$. すなわち, $f$と$x$に対し, $f(x)$が存在すれば$(f,x) \mapsto f(x)$とする. そういう対応が存在するものをすべて集めたものがevaluation arrowとなる. このとき$f: Y \times X \to Z$に対し, UMPから誘導される射$h$とは, $h = [(y,[(x,z)]); ((y,x),z) \in f]$である.

よってDict圏はCCC(Cartesian Closed Category)である.


## コメント

割と$\mathbf{Set}$と同じ感じで構成できるのが面白かったけれど、普遍的に存在して可換になるとかはちゃんと確認しないとすぐには分からないものが多かったｲﾒｯｼﾞ。あとこの圏(と同型な圏)には名前ついてないんだろうか。
また面倒なんでやってないけどelementary toposであるのも示せる気がします。それはまぁ演習ってことで(適当)。

まとめ: Pythonのdictを射と呼ぶのは余計混乱するからやめよう。あと、少なくともmap(写像)ではない。
Xen 4.4 on Ubuntu 14.04でOracle Solaris 11.2βのインストーラをPVで起動する(未成功)

Xen 4.4 on Ubuntu 14.04でOracle Solaris 11.2βのインストーラをPVで起動、インストールを試みたが失敗した。

本エントリーの状況
------------------

以下のエラーが発生し、起動しない

```console
$ sudo xl create /tmp/sol-11.cfg -c
Parsing config from /tmp/sol-11.cfg
do_bys_alloc_contig: 'align' 0x40818b20 is less than MMU_PAGESIZE 0x40818b60
Press any key to reboot.
```

ちなみにOpenindiana 151a8は同じ方法でtext intellerが起動成功


作業
----

環境:

* CPU: Intel Xeon L5420
* OS: Ubuntu 14.04
* HV: Xen 4.4.0 (apt-get install)

1. ISOイメージからkernelとboot_archiveを取り出す
2. Xenのcfgファイル作成


### 1. kernelとboot_archiveの取り出し ###

```console
$ sudo mount -o loop,ro /tmp/sol-11_2-beta-text-x86.iso /mnt
$ sudo cp /mnt/platform/i86xpv/kernel/amd64/unix /tmp/
$ sudo cp /mnt/platform/i86pc/amd64/boot_archive /tmp/
$ sudo umount /mnt
```

* `unix` : Solarisのkernel
* `boot_archive` : Linuxのinitrdに相当


### 2. Xenのcfgファイル作成 ###

```py:/tmp/sol-11.cfg
name        = 'sol-11'
kernel      = '/tmp/unix'
ramdisk     = '/tmp/boot_archive'
extra       = '/boot/platform/i86xpv/kernel/amd64/unix'
memory      = '4096'
vcpus       = '1'
localtime   = 1
disk        = [
                  'file:/tmp/sol-11_2-beta-text-x86.iso,6:cdrom,r'
              ]
on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'
```

### 3. 起動 ###

(冒頭の状況と同じです)

```console
$ sudo xl create /tmp/sol-11.cfg -c
Parsing config from /tmp/sol-11.cfg
do_bys_alloc_contig: 'align' 0x40818b20 is less than MMU_PAGESIZE 0x40818b60
Press any key to reboot.
```

あとがき
--------

正直、理由がわからない。
HVMならば動くのだろうが、その場合のオーバヘッドが気になる。

`kernel`と`boot_archive`の取り出し作業は、bootloaderにPvGrub(or PyGrub)を使えば不要かもしれませんが、未検証。

エラーメッセージでググると、やはり問題は上がっているが解決に至っているものは無い。
奇特な環境なんでしょう。。。

助けてくださいー！シ●ア少佐ァー！！
.alert.alert-errorがスタイルされない

## 環境
- ruby 2.1.2
- rails 4.1.1
- bootstrap-sass (3.1.1.1)

## きっかけ
.alert.alert-errorをクラスに指定したけど、意図した表現が実現できなかった。
あれ？って思ったけど、原因は単純でbootstrapにそもそも定義がないため。[本家サイト](http://getbootstrap.com/components/#alerts)
.alert-dangerの表現を意図していたので、CSSを下記の解決策ように記述すれば.alert-errorも.alert-dangerと同じ表現になる。

## 解決策

```sass
@import "bootstrap"

/* snip */

.alert-error
  @extend .alert-danger

```
Pyside の透過PNG表示のサンプル

Pyside のウィンドウに透過PNGの画像ファイルを貼り付けて、非矩形のウィンドウを作成するサンプルです。

```python:ImageViewer.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
from PySide import QtCore, QtGui


class ImageViewer(QtGui.QWidget):
    def __init__(self):
        super(ImageViewer, self).__init__()
        self.initUI()

    def initUI(self):
        '''
        ユーザーインターフェースの初期化
        '''
        # 枠なしWindow
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)

        #半透明
        self.setWindowOpacity(0.8)

        self.setWindowTitle('ImageViewer')

        self.imageLabel = QtGui.QLabel()
        self.imageLabel.setBackgroundRole(QtGui.QPalette.Base)
        self.imageLabel.setSizePolicy(
            QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)

        self.imageLabel.setScaledContents(False)

        self.filenameLabel = QtGui.QLabel()

        self.imageLabel.setToolTip("コンテキストメニューで操作してください。")

        # Debug用
        #self.button = QtGui.QPushButton('open')
        #self.button.clicked.connect(self.open)

        #self.quit = QtGui.QPushButton('quit')
        #self.quit.clicked.connect(self.close)

        layout = QtGui.QVBoxLayout()
        layout.setContentsMargins(0, 0, 0, 0)
        layout.addWidget(self.imageLabel)

        # Debug用
        #layout.addWidget(self.filenameLabel)
        #layout.addWidget(self.button)
        #layout.addWidget(self.quit)

        self.setLayout(layout)
        self.setGeometry(50, 50, 250, 250)

    def contextMenuEvent(self, event):
        '''
        コンテキストメニュー
        '''
        menu = QtGui.QMenu(self)
        menu.addAction('Open', self.open)
        menu.addAction('Quit', self.close)
        menu.exec_(event.globalPos())

    def open(self):
        (path, ftype) = QtGui.QFileDialog.getOpenFileName(self, "Open File")
        image = QtGui.QImage(path)
        pixmap = QtGui.QPixmap.fromImage(image)

        self.filenameLabel.setText(os.path.basename(path))

        self.imageLabel.setPixmap(pixmap)
        self.resize(image.size())
        mask = QtGui.QPixmap.fromImage(image.createAlphaMask())
        self.setMask(mask)


def main():
    app = QtGui.QApplication(sys.argv)

    iv = ImageViewer()
    iv.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    import sys
    main()


# EOF


```

Windows7 での実行例

元のPNGファイルの透過部分が完全に透明処理されている

![pyside-imageview-screenshot.PNG](https://qiita-image-store.s3.amazonaws.com/0/26107/9aa5f423-a41c-9fa3-d73a-d127e9a20685.png)
Qiitaのタグ検索でg++が検索できない

tag:g++が3件投稿されてるはずなのに検索できない。。。

[tag:g++の検索結果 - Qiita](http://qiita.com/search?utf8=%E2%9C%93&sort=&q=tag%3Ag%2B%2B)

http://qiita.com/tags/g%2b%2b
OS Xで始めるVagrant

Vagrantの使い方をメモ
VirtualBoxはインストールしてある状態でお願いします。

##環境
* OS X 10.9.3
* Vagrant 1.6.2
* VirtualBox 4.3.10


##Vagrantをインストールする
[www.vagrantup.com](http://www。vagrantup。com)からインストーラをダウンロードし、インストールする。


##Vagrantfileを作る
Vagrantfileはゲストマシンの環境を記述したファイルであり、以下のコマンドで作成できる。

```bash:
$ vagrant init [title] [url]
```
titleはローカルに保存するBoxの名前なので、任意。
urlは[ここ](http://www。vagrantbox。es)を参照し、イメージを選択する。


例えばこんな感じに。

```text:
$vagrant init CentOS6.5x86_64 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
```
そして、

```text:
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
```
こんな感じで表示されたら準備完了。
<br>

##ゲストマシンの起動とアクセス
```bash:
$ vagrant up
```
ゲストマシンを起動する。
新しいBoxを利用する際にはダウンロードのための時間がかかる。
<br>

完了したら、

```bash:
$ vagrant ssh
```
でアクセスできる、簡単。
<br>

##ゲストマシンの状態を管理
以下，ちょっとしたゲストマシン状態管理のためのコマンドです。
###ゲストマシンの状態を表示
```bash:
$ vagrant status
```
vagrantで作成した仮想マシンの状態を表示する。
<br>

###ゲストマシンのリロード
```bash:
$ vagrant reload
```
Vagrantfileを書き換えたときなど，設定の反映するためのリロード。
<br>

###ゲストマシンのサスペンド
```bash:
$ vagrant suspend
```
仮想マシンをサスペンド状態にする。
リジュームするには`vagrant up`か`vagrant resume`する。
<br>

###ゲストマシンの停止
```bash:
$ vagrant halt
```
ゲストマシンを停止させる。
このコマンドを使用する前に，ゲストマシン内でシャットダウンのためのコマンドを実行する必要がある。
強制シャットダウンオプションとして`--force`がある。

起動するためには`vagrant up`する。
指数表現・指数表記を結果から察する

#指数表現・指数表記って何？

PHPの書籍を読んでいると指数表記と記述されており、ウィキってみました。

>指数表記（しすうひょうき）は、数の表記方法の1つ。主に非常に大きな、また非常に小さな数を表記する場合に使われる。

ここまでは分かります。

表記方法の説明になると、

```math
m \times R^e
```

>R は、m および e の基数であり、m は有理数、e は整数である。m を仮数部（mantissa）、e を指数部（exponent）と呼ぶ。有理数を10進数で表現することが多いので、 通常R = 10 である。

・・・私には理解できません。

#結果から意味を察する

なので結果から意味を察することにします。

```php
echo 1E5; //表示結果は 100000 ← 1の後に0が5個
echo 1E6; //表示結果は 1000000 ← 1の後に0が6個
```

もう一つ試してみます。

```php
echo 241E5; //表示結果は 24100000 ← 241の後に0が5個
echo 241E6; //表示結果は 241000000 ← 241の後に0が6個
```

要は```E```の前の数字の後に```0```を何個付けるかという表記方法だと思います。
もう少し具体的に書くと ```241E5``` の場合、```241 * (10*10*10*10*10) ``` という計算式になります。

次にウィキペディアで説明している仮数部と指数部を結果から察します。

```php
echo 241E5; //表示結果は 24100000
```

上記の例だと ```241``` を ***仮数部：かすうぶ（mantissa）*** と呼び、 ```5``` を ***指数部：しすうぶ（exponent）*** と呼ぶのかと思います。

ちなみに下記のように記述すると、

```php
echo 456.3765E2;
```

表示結果は ```45637.65``` となります。
計算式は ```456.3765 * (10*10)``` になります。
インターフェースの暗黙的実装を隠ぺいするとどうなるか

以下のようなクラス構造を作るとどう動作するのか、ちょっと自信が無かったので確認。

```csharp
// 基底クラスであるインターフェースを実装
public class Animal : IHogerable
{
    public void DoHoge()
    {
        Console.WriteLine("Animal");
    }
}

// 派生クラスで同じインターフェースを実装
public class Dog : Animal, IHogerable
{
    // new は無くても動作は同じ。new が無い場合は警告が出る。
    public new void DoHoge()
    {
        Console.WriteLine("Dog");
    }
}

public interface IHogerable
{
    void DoHoge();
}
```

これらを `IHogerable` 型の変数経由で呼び出すとどうなるか？
もちろん、`Animal` 型の変数や `Dog` 型の変数経由で呼び出した場合はそれぞれのメソッドが呼ばれる。

```csharp
var animal = new Animal();
animal.DoHoge(); // Animal.DoHoge が呼ばれる
var dog = new Dog();
dog.DoHoge(); // Dog.DoHoge が呼ばれる

foreach (var hogerable in new IHogerable[] { animal, dog })
{
    hogerable.DoHoge(); // どっちのメソッドが呼ばれる？？？
}
```

```text:実行結果
Animal
Dog
Animal
Dog
```

![InterfaceMethodHide.png](https://qiita-image-store.s3.amazonaws.com/0/11978/2b28c468-bff8-0fb1-c565-226d8ab71b98.png)

`IHogerable` 型の変数経由で呼び出した場合、インスタンスの型に応じて呼び出されるメソッドが変わる。

----

なお、`Dog` クラスの宣言で明示的に `: IHogerable` を書くか書かないかで動作が変わる。

```csharp
public class Dog : Animal // IHogerable の実装を宣言しない
{
    public new void DoHoge() // 単に Animal.DoHoge の実装を隠ぺいする
    {
        Console.WriteLine("Dog");
    }
}
```

こうすると

```text:実行結果
Animal
Dog
Animal
Animal
```

`IHogerable` 経由で呼び出した場合に `Animal.DoHoge` の方が呼ばれるようになる。
つまり、`Dog` クラスで `IHogerable` の実装を上書きする意図があるかないかをくみ取ってくれる。

よく考えられているなぁ……

----
さらに確認した内容を追記します。

**Q. インターフェースに複数のメンバーが定義されている場合は？**

A. `Dog` で隠ぺいした分はそちらが、隠ぺいしていない分は `Animal` のメンバーが呼び出されます（つまり一部だけを隠ぺいすることが可能）

**Q. `Animal` クラスで暗黙的な実装と明示的な実装の両方がある場合は？**

A. `IHogerable` 型経由で `Dog` インスタンスのメンバーを呼び出した場合、以下の優先順で呼ばれます。直感通りです

- `Dog` クラスの明示的実装
- `Dog` クラスの隠ぺいしている暗黙的実装
- `Animal` クラスの明示的実装
- `Animal` クラスの暗黙的実装
asset_host を 環境変数を使って出し分ける

# 管理ツールのasset_hostだけ自host見に行かせたくて糞はまった件

## 概要

とある、Railsアプリケーションがあったとしてですね。

例えば、アプリケーションサーバ(メインコンテンツを表示してるサーバ)では、js, css, html, pngなどの静的ファイルは
画像サーバのドメインを見に行ってほしくて、管理ツールのサーバは自サーバを見に行ってほしいっていうことがあったんですね。

メインコンテンツ : web
管理ツール : admin

とします。

プロセス監視はeyeを使ってます。

## asset_host

rails_root/config/environments/production.rb

```rb
  config.action_controller.asset_host = "//stat.yanap.jp" unless ENV["ROLE"] == "admin"
```

環境変数のROLEにadminが設定されてるときは、asset_hostを設定しないで、自サーバ見に行くようにしたい

## eye

https://github.com/kostya/eye
https://github.com/kostya/eye/blob/master/examples/unicorn.eye
### admin.eyeみたいなの用意します

```rb
# 一番外側
ROLE = "admin"

# Eye.application "rails_unicorn" do の中
env "ROLE" => ROLE

# process("unicorn") do の中
role = ''
if ROLE == 'admin'
  role = "ROLE=#{ROLE}"
end

# unicorn start command
start_command   "sudo -u yanap #{role} bundle exec unicorn_rails -c ./config/unicorn.rb -E RAILS_ENV -p 5000 -D"
```

思えば、当たり前なんですが、unicorn起動コマンドのところまで、ちゃんと渡さないとダメだった。
Eye.application "rails_unicorn" do の中までで、止まってて、できないできない言ってはまってしまった。
Type.IsAssignableFrom はどっちがどっち？

毎回わからなくなるのでメモ。

```csharp
/* 基底型.IsAssignableFrom(派生型) -> true */
// false
var textBoxIsAssignableFromControl = typeof(TextBox).IsAssignableFrom(typeof(Control));
// true
var controlIsAssignableFromTextBox = typeof(Control).IsAssignableFrom(typeof(TextBox));

/* あるオブジェクトがあるクラスを継承しているかを知りたい場合 */
var someObj = new TextBox();
var someType = someObj.GetType();

// is 演算子はわかりやすい
// true
var someObjIsControl = someObj is Control;

// Type オブジェクトで同じような判定をする場合、順序が逆と覚えておこう
// true
var someTypeIsControl = typeof(Control).IsAssignableFrom(someType);
```

最近は「`null` 安全な順序」と覚えています。
実は引数に `null` を渡しても `ArgumentNullException` が発生しないのですよね。

```csharp
foo.IsAssignableFrom(typeof(FooBar));
// という順序だと変数が null のときどうやっても NullReferenceException が発生してしまう

typeof(FooBar).IsAssignableFrom(foo);
// foo に null が入っていても false が返る作りになっているので null に対して例外が発生することがない
```
オブジェクト指向　（オレの流儀）


自分のC++アプリケーションへのこだわりをMQTT-SN Gatewayを例に書いた。

#Ｃ＋＋にmain()はいらない
オブジェクト指向言語(c++)の main()は醜悪だ。美しさを微塵も感じない。　
醜い main()はアプリケーション・プログラムの奥深くに隠蔽するのがオレの流儀だ。
少なくとも、アプリケーションを作成しているのだから、アプリケーション・クラスとか、その派生クラスがなければならないと思う。　main()関数はそのアプリケーション・インスタンスを起動するための最小限のものにしたい。　
これはオレのこだわり。

##最小限の main() はこれ
この様式は様々なアプリケーションに共通だ。
アプリケーションはProcessクラスとして定義される。

```cpp:main()
Process* theProcess = NULL;
int main(int argc, char** argv){
	theProcess->initialize(argc, argv);
	theProcess->run();
	return 0;
}
```
後はProsessクラスの派生クラスを定義すれば、アプリケーション・プログラムが構築できる。

#アプリケーションの定義
Proessから派生したクラスのインスタンスを生成するだけ。
これをコンパイルすれば、完成。

##MQTT-SN Gateway のアプリケーションの定義はこれ

必要なクラス定義をインクルードして、メインスレッドとその他のスレッド（Task）を生成する。

```cpp:A_ProgramStructure.cpp
#include "GatewayResourcesProvider.h"
#include "ClientRecvTask.h"
#include "ClientSendTask.h"
#include "BrokerRecvTask.h"
#include "BrokerSendTask.h"
#include "GatewayControlTask.h"
#include "lib/ProcessFramework.h"
/**************************************
 *       Gateway Application
 **************************************/
GatewayResourcesProvider gwR = GatewayResourcesProvider();
GatewayControlTask th0 = GatewayControlTask(&gwR);
ClientRecvTask th1 = ClientRecvTask(&gwR);
ClientSendTask th2 = ClientSendTask(&gwR);
BrokerRecvTask th3 = BrokerRecvTask(&gwR);
BrokerSendTask th4 = BrokerSendTask(&gwR);

```
![Process Framework8.jpg](https://qiita-image-store.s3.amazonaws.com/0/41752/82da9fff-c39e-5aa8-207b-1799dade4bb0.jpeg)

 クラスのインスタンスを生成するだけで、アプリケーション・プログラムが出来上がる。　美しいではないか。　　

世の中、main()を隠蔽しないアプリケーション・プログラムのなんと多いことか。


興味があれば、ソースコードはここ。
https://github.com/ty4tw/MQTT-SN
Rails で他言語対応するために必要なこと



＃コメントをいただいて更新しました。

# セットアップ

下記のgemをインストール。

```Gemfile
gem 'rails-i18n'
```

# 使い方

各言語ごとの文言を config/locales/xx.yml に記載します。


```config/locales/ja.yml
ja:
    view:
        edit: "編集"
        delete: "削除"
        back: "戻る"
```
画面に表示させる時には、下記のように t("path") で書きます。

```index.html.haml
%td= link_to  t('view.edit'), edit_data_path(initial)
%td= link_to  t('view.delete'), data, :method => :delete, :data => { :confirm => 'Are you sure?' }
```

# 注意

i18n の gem だけインストールして使っている場合、エラーが起きた時にエラーメッセージが異なることがあります。例えばデフォルト言語を日本語にしていた場合など。

```
ActiveRecord::RecordInvalid: translation missing: ja.activerecord.errors.messages.record_invalid
```

このようなエラーメッセージが表示されて何が原因かわからなくなるのでrails-i18nをインストールしておくと便利です。
Node.jsの人はちゃんとsleepしてください

Node.jsでがんばりすぎると別のプロセスに迷惑だから長いことかかる処理は `sleep()` みたいなのを挟みながらやりたいなー。

と思ってググった結果がこうですよ。

https://github.com/ErikDubbelboer/node-sleep

```js
  binding = {
    sleep: function(s) {
      var e = new Date().getTime() + (s * 1000);

      while (new Date().getTime() <= e) {
        /* do nothing, but burn a lot of CPU while doing so */
        /* jshint noempty: false */
      }
    },
```

だめですね。これCPU使いまくり。

まあ、CPUがいくら発熱してもいいよって思っても、制御が別のタスクに行かないのはアウトです。たとえばこれがサーバのリクエストハンドラに使われてたら、みんな一定秒数遅れてページ表示される、んじゃなくて、 **サーバーが一定秒数止まる** ことになる。つまり、そのリクエストに3人来たら、3人目は1人目の3倍待たないといけない。

もしコールバック連鎖を使ってるバックグラウンドスレッド(DBのバッチ更新トランザクションとか)があった場合は、sleep してメイン処理を待機させようとしたつもりが、肝心のバックグラウンド処理を止めてしまうことに。

CPUを使いすぎることはREADMEにちゃんと書いてあるんですが、マルチタスクが止まるって点には言及してない。

> On windows the module will fall back to a while loop which will use 100% CPU!

まーね、これはネタリポジトリだろうしね...

https://www.npmjs.org/package/sleep 

> 186	 downloads in the last day
> 1001	 downloads in the last week
> 4741	 downloads in the last month

え、いいのかきみたち! コレジャナイってなるよ。

だいたい誰がこんな...

[Nodeビギナーズブック » Node.jsチュートリアル » Node.js 教程 #ブロッキングとノンブロッキング](http://www.nodebeginner.org/index-jp.html#blocking-and-non-blocking)

おまえかー!! まったくもー、「悪い例」ってちゃんと書いといてよ。

というわけで、綺麗なスリープはこう書くといいよというのを、async.js 使って説明します。

```js
var async = require('async');

var repeating = 0;
async.forever(function(callback) {
    async.series([
        function(callback) {
            console.log("どっこらせー");
            setTimeout(callback, 1000);
        },
        function(callback) {
            console.log("よっこいせー");
            setTimeout(callback, 1000);
        },
        function(callback) {
            if (++repeating < 5) {
                callback();
            } else {
                console.log("おしまい");
            }
        }
    ], callback);
}, function(err) {
    console.log(err);
});
```

`setTimeout()` のコールバックが async の次のステップに行くトリガーになるのがポイント。

ちなみにコールバック地獄版はこちら。

```js
var repeating = 0;
(function() {
    var redoFunc = arguments.callee;
    console.log("どっこらせー");
    setTimeout(function(){
        console.log("よっこいせー");
        setTimeout(function() {
            if (++repeating >= 5) {
                console.log('おしまい');
            } else {
                redoFunc();
            }
        }, 1000);
    }, 1000);
})();
```

上級者はもっといい方法を知ってるのかなぁ。
初めてrails serverコマンドを打った時のエラーあれこれ

vagrant + virtualbox centos64
ruby 最新ver
rails 最新ver

#rails server
としてもエラーが出る。
Failed to build gem native extension.　なんやねん。
sqlite3.h is missing. Try~~~
どうやらsqlite3がいないよ、コレを試してみて！ってことらしいので…
言われた通りにやっていく

#yum install sqlite-devel
※このときpermissionなんたらって出たら一番最初に「sudo」つけてためしてくんろ。以下同様っす。

成功した！これならいけるかなって思ってsqlite3をインスコします
#gem install sqlite3-ruby

お、いけた。
んじゃようやく…
#rails s

またエラー。
今度は…
Could not find gem 'uglifier (>= 1.3.0) ruby' in the gems available on this machine.

ってことなので、、、
#gem install uglifier
成功。

もう一度rails sするも失敗。
次はturbolinksを入れろってさ…
#gem install turbolinks
成功した。

次こそは！と思ったら。
エラー。Could not find a JavaScript runtime. 
ジャバスクリプトのランタイムが無い、、、と。
#vi Gemfile
# #gem 'therubyracer',  platforms: :ruby
「#」を外します。:wqで終了。

#bundle install

よーし、もう大丈夫！のはず！w
#rails s
で成功！ようやくおわたよ！！
一定期間たったゴミファイルを自動的に削除するスクリプト

# Intro
threaddumpなどを定期的にとるよう設定しているんだけど、そういったファイルが気が付くとたまっていて、手作業で削除するということが多かった。あと、バックアップファイルが散らばっていた。

特定のディレクトリ以下に置いてあるファイルを一定期間たったら削除するようなスクリプトが欲しかったので作った。ファイルのみを再帰的に削除し、ディレクトリはそのまま残す。

# script

```
#!/bin/bash

LIVING_DAYS=14

# These directories are target for sweeper!
SWEEPED_DIRS=( $SCRIPT_OUTPUT_DIR )

sweep_files()
{
n=${#SWEEPED_DIRS[@]}
n=$((n-1))

echo "remove these fiels..."

while [ $n -ge 0 ] ;
do
find ${SWEEPED_DIRS[$n]} -mtime +$LIVING_DAYS -type f | tee $LOG_FILE
find ${SWEEPED_DIRS[$n]} -mtime +$LIVING_DAYS -type f -exec rm -f {} \;
  n=$((n-1))
done
}

sweep_files

echo "Success sweeping!!"
```

# 使い方
cronで仕掛ける（手動で気づいた時に実行してもいい）。SWEEPED_DIRSに入っているディレクトリの中のLIVING_DAYS以上たったファイルを削除する。
backupとかlogとかそういったdirectoryを設定しておくと幸せになれる。
コマンド一つで"git status"と"git branch"と"git stash list"を表示


```ini:.gitconfig
[alias]
  st = !git status -s && echo --- branch && git branch -v && echo --- stash && git stash list | cat
```

こうしておくと、`git st`でgit statusとgit branchとgit stash listの結果が一度にでるので便利
Scalaでインクリメントカウンタを1行で書く


呼び出すたびに次の数字を返すカウンタをScalaで実装する方法です。 `Stream` を使うと1行で書けます。

```scala
val numberStream = Stream.from(0).iterator
                                                  //> numberStream  : Iterator[Int] = non-empty iterator
println(numberStream.next)                        //> 0
println(numberStream.next)                        //> 1
println(numberStream.next)                        //> 2
```

このスニペットを動かしてみる: https://ideone.com/fgUwzU


thread-safeなのか気になるところですが、Scala 2.10 の実装では thread-safe になっていました。

```scala
  @SerialVersionUID(-602202424901551803L)
  final class Cons[+A](hd: A, tl: => Stream[A]) extends Stream[A] with Serializable {
    override def isEmpty = false
    override def head = hd
    @volatile private[this] var tlVal: Stream[A] = _
    def tailDefined: Boolean = tlVal ne null
    override def tail: Stream[A] = {
      if (!tailDefined)
        synchronized {
          if (!tailDefined) tlVal = tl
        }

      tlVal
    }
  }
```

https://github.com/scala/scala/blob/2.10.x/src/library/scala/collection/immutable/Stream.scala#L1077