OmniAICreator/Qiita-1.07M huggingface dataset:
identは拒否していいことがわかった

従来は主にメールサーバで使われることがあった。
手元の[YAMAHAルータの初期設定がident許可](http://www.rtpro.yamaha.co.jp/RT/FAQ/IP-Filter/network-security-filter.html)だったので、なんなのか調査してみた。

[Buffaloの無線LANはデフォルトでidnetを拒否](http://buffalo.jp/download/manual/fs_online/fshpg300n/manual/function/l_fshpg300n6.html)している。

![スクリーンショット 2014-06-17 8.10.08.png](https://qiita-image-store.s3.amazonaws.com/0/25728/7de11bca-1d54-32d2-8368-36740ddfe4db.png)


# 調査

[ファイアウォール ident](https://www.google.co.jp/search?hl=ja&q=%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB+ident&lr=lang_ja&gws_rd=ssl)で検索するとわかるでしょう。

[ファイアウォール設定後、メール送信に時間がかかる-アライドファン.com](http://www.allied-fan.com/qa5.html)

* windowsはident対応していない
* identはport 113を使う。

[Received: format of various SMTP Mail Transfer Agents](http://vega.sra-tohoku.co.jp/~kabe/vsd/mail/received.html)によると

> 普通の人が使うMTAで今時identを動かしていることは少ないので、 
> キャッシュ専用機やspamware/spamhausくらいでしか観測されない。
> identの返り値により IDENT: がつく場合とつかない場合がある。

## メールヘッダ

```bash:identがついた例
Received: from chat.ru (CacheFlowServer@[194.224.131.4])
        by masamune.bio.is.tohoku.ac.jp (8.11.3/8.11.3) with ESMTP id g2DJLaG08716
        for <xxxx@dais.is.tohoku.ac.jp>; Thu, 14 Mar 2002 04:21:37 +0900 (JST)

Received: from tagebau.de (IDENT:squid@[203.197.216.92])
	by masamune.bio.is.tohoku.ac.jp (8.11.3/8.11.3) with SMTP id g4T65Wx01690;
	Wed, 29 May 2002 15:05:35 +0900 (JST)
```

# 結論

* identを許可しなくてもメール送受信ができること
* 113ポートをListenしていない

ということからidentの許可をやめた。
「プログラムでシダを描画する」をLabVIEWで描画する

#はじめに
色んな言語でプログラムでシダを描画するのが流行ってるようなのでLabVIEWでもやってみました。

##元ネタ
十進BASICでシダの葉プログラムを作ってみた（笑）
https://www.youtube.com/watch?v=KgvTw3aLacQ

[Proccessing]プログラムでシダを描画する - 強火で進め
http://d.hatena.ne.jp/nakamura001/20140505/1399316565

「プログラムでシダを描画する」一覧
http://qiita.com/qt-luigi/items/b22204c7ef73260324bd


#実行結果
![2014-06-16 03_11_37-main.vi フロントパネル 「shida.lvproj_マイ コンピュータ」.png](https://qiita-image-store.s3.amazonaws.com/0/36514/765f22f3-1315-c3b1-e85d-f21168508903.png)

ちゃんと描けた!
LabVIEWだと計測制御メインなのでグラフプロットが殆ど。この手のグラフィックを描くのは新鮮ですｗ

#コード
再帰関数はVIスニペットでは無理なのでGithubにソースを上げました。
https://github.com/ktyubeshi/labview_shida

## main.vi
![main.vi.png](https://qiita-image-store.s3.amazonaws.com/0/36514/cff450a0-8cdc-9e18-ab30-4fc48e468318.png)

## f.vi

※再入実行(再帰呼び出し)を許可する設定にしておく

![f.vi.png](https://qiita-image-store.s3.amazonaws.com/0/36514/152f44a8-869d-de99-220c-705e05a1939b.png)

![f.vi .png](https://qiita-image-store.s3.amazonaws.com/0/36514/8d93f444-19aa-9f38-1db0-4b48bcf2344e.png)

## w.vi
w1x～w4yは纏めました。

![wd.png](https://qiita-image-store.s3.amazonaws.com/0/36514/35555410-6d09-d2d2-9bd4-0aff51ea0b31.png)

![wd2.png](https://qiita-image-store.s3.amazonaws.com/0/36514/4786b579-ae51-a5c1-a7b7-2912f29fca8f.png)

![wd4.png](https://qiita-image-store.s3.amazonaws.com/0/36514/d6ed7710-d886-0e83-72e1-b52d18a0af34.png)

![wd8.png](https://qiita-image-store.s3.amazonaws.com/0/36514/db3a0c00-a182-9c31-7170-5109eba83b2a.png)

![wd5.png](https://qiita-image-store.s3.amazonaws.com/0/36514/135df77b-314e-b663-a1e8-07e5b1ef4a71.png)

![wd3.png](https://qiita-image-store.s3.amazonaws.com/0/36514/978e2274-c873-4537-d661-f24f511930a1.png)

![wd6.png](https://qiita-image-store.s3.amazonaws.com/0/36514/bccaec24-ed56-e5d1-744b-44fa36ac8948.png)

![wd7.png](https://qiita-image-store.s3.amazonaws.com/0/36514/6380840e-5557-0dd6-a791-5ee76d479f5c.png)

#課題
とりあえずLabVIEWに標準で用意されている2Dピクチャ表示器とそれ用の関数を使ってやってみましたが、これらの表示器や関数の入出力データに使われているピクチャ型というデータタイプはビットマップデータではなく、描画命令の羅列を保持します。描画は遅いし繰り返し実行するとさらに遅くなります(ドットを描画する命令を追記していくためにメモリの動的確保が頻発してそう)
2D配列でビットマップデータを扱うようにすれば劇的に高速化するはず
JavaScript の継承とカプセル化

参考文献：Supercharged JavaScript Graphics: with HTML5 canvas, jQuery, and More より。

いろんなやり方があるが、これが一番自然な方法なんじゃないかと筆者は言っている。

```lang:js
<script type="text/javascript">
var pet = function(name, legs) {
    var that = {
        name: name,
        getDetails: function(){
            return that.name + ' has ' + legs + ' legs';
        }
    };
    return that;
};
var cat = function(name) {
    var that = pet(name, 4);
    that.action = function(){
        return 'free as a bird';
    };
    return that;
};
</script>
```

```lang:js
var neko = cat('tama');
```

こうして neko を作った後で、neko の name を変えることはできるが、legs は変えられない、という訳である。
PCL : ReflectionでGetConstructor(s)が使えないっぽい



ので、typeof(クラス).GetTypeInfo().DeclaredConstructors から探す方向で。

```csharp

    using System;
    using System.Linq;
    using System.Reflection;
```   
    
３つのコンストラクタを持つサンプルクラス:


```csharp

	public class Person
	{
		public string nickname = "";

		public Person(){}
		public Person(string firstname, string lastname){
		}
		public Person(string nickname){
			this.nickname = nickname;
		}

	}  
	  
```    

Person(string nickname)を探すテスト:


```csharp

		[Test]
		public void TestFindConstructor()
		{
			var t = typeof(Person).GetTypeInfo ();

			var cs = t.DeclaredConstructors.Where (
				ci => ci.GetParameters ().Count() == 1 &&
				ci.GetParameters().First().ParameterType == typeof(System.String)
			).FirstOrDefault();
			
			Assert.IsNotNull (cs);
			var person = (Person)cs.Invoke (new string[]{ "Monkey" });
			Assert.AreEqual (person.nickname, "Monkey");
		}
```
phpenv入れてる時brew doctorしたら出るWarning消した

brew doctorしたらこんなWarningが出た

```
$ brew doctor
Warning: "config" scripts exist outside your system or Homebrew directories.
`./configure` scripts often look for *-config scripts to determine if
software packages are installed, and what additional flags to use when
compiling and linking.

Having additional scripts in your path can confuse software installed via
Homebrew if the config script overrides a system or Homebrew provided
script of the same name. We found the following "config" scripts:

    /Users/takc923/.phpenv/shims/php-config
```

PATH通ってるところに`*-config`なファイルあったら、`./configure`スクリプトが自分の設定ファイルと勘違いして事故るかもよ、的な警告っぽい。つまり`/Users/takc923/.phpenv/shims/`をPATHから外したら直るはず。

とは言えこれをPATHから外すとphpenvが使えなくなる気がするので、brewを実行するときだけ該当のパスを外すようにした。
`.zshrc`に以下の行を追加。

```
alias brew="env PATH=${PATH/~\/\.phpenv\/shims:/} brew"
```

これでbrewコマンドを叩くと、元の`$PATH`から`~/.phpenv/shims:`を取り除いたものを`PATH`に設定した状態で実行される。
この該当パスが`$PATH`の一番後ろにあると`:`がなくて正規表現にヒットせずに取り除かれないので注意。

この変数の記法は`man zshexpn`の`PARAMETER EXPANSION`の項を参照。

これでWarningが消えた

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

参考: http://easyramble.com/homebrew-config-scripts-warning.html
【Rails4】メール送信をスレッド（Thread）で非同期実行する


まずは、UserMailerとかいう名前でMailerを作っておく。
※名前はなんでもいいと思います。

```rb:app/mailers/user_mailer.rb
class UserMailer < ActionMailer::Base
  default from: "noreply@sample.com"

  # メール送信
  def notice(user, opts={})
    @resource = user
    subject = t('user_mailer.notice.subject')
    mail(to: @resource.email, subject: subject)
  end
end
```

**`en.user_mailer.notice.subject`または`ja.user_mailer.notice.subject`という設定で辞書ファイルに題名を設定しておきます。**

**`app/views/user_mailer`にメール本文の内容を書いたファイルを置きます。**
これがメールの本文の内容になります。

ここでは`notice.html.haml`というファイル名にしておきます。
**ファイル名はメソッド名に対応しています。**

URLをメールの内容に付ける場合は

```erb
<%= user_url(@user, host: 'example.com') %>
```
などとしておきます。

**`config.action_mailer.default_url_options`が設定されている場合は、`host: 'example.com'`の部分は必要ありません。**


コントローラなどで、下記のようにメールを送信します。

```rb
    # スレッドで通知メール送信
    Thread.new do
      UserMailer.notice(@user).deliver
    end
```
ちゃんとメール送信できるかどうか確認してから、スレッドでやるといいと思います。

***

この方法であればdelayed_jobなどのgemを使用しなくても、非同期実行でやってくれます。
エラー処理とかはできてないのでログとかは出すようにしておいたほうがいいかもしれません。


参考URL
http://guides.rubyonrails.org/action_mailer_basics.html
Xamarin.Formsでキーボードに隠れないようにレイアウトをずらすハック

**(追記): コメントで指摘があったScrollViewを使った方がスマートなのでコメント参照**

ハックというほどでもないのですが

* Gridの一番下の行のRowDefinisionをAutoにする
* 一番したのRowにスペーシング用のBoxViewを設置
* BoxViewのHeightRequestを使って高さを調整し、レイアウトをずらす

--ほかにいい方法無いのかな。。。--
Capistrano3でデプロイしたらChatWorkに通知する


イケてるエンジニアなら、capistranoでデプロイしたらHipChatに通知するなんてことをやっていると思います。
ただ、会社でChatWorkは使ってるけど、HipChatつかってないって人もいるじゃないんでしょうか？

HipChatが無いならChatWorkに通知すればいいじゃないとググってみたらありました。

[mitukiii/capistrano-chatwork](https://github.com/mitukiii/capistrano-chatwork)


まあREADMEみればわかると思いますが、軽く導入方法を説明しておきます。

### 1. Capistrano用のディレクトリを作成
適当に作業用のディレクトリを作成します。
今回は`cwtest`って名前のディレクトリを作成します。

```
$ mkdir -p ~/capistrano/cwtest
$ cd ~/capistrano/cwtest
```

### 2. Gemfileを作成

以下のような中身を作成しておきます。

``` Gemfile
source "https://rubygems.org"$
gem 'capistrano', '~> 3.1'$
gem 'capistrano-chatwork'$
```

あとは`bundle install`を実行しましょう。

### 3. Capistranoの設定を行う

まずはCapistranoのファイルを用意する

```
$ bundle ex cap install
```

Capfileに以下のように記述

```
# Load DSL and Setup Up Stages
require 'capistrano/setup'

# Includes default deployment tasks
require 'capistrano/deploy'

# ChatWork 
require 'capistrano-chatwork'

Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
```


あとはconfig/deploy.rbにChatWork APIの情報を記述します。

``` diff:config/deploy.rb

lock '3.2.1'

set :application, 'testapp'
set :repo_url, 'git@github.com:polidog/symfony2bss.git'
set :deploy_to, '/var/www/vhost/test'


## ChatWork
set :chatwork_api_token, 'APIキーを入力'
set :chatwork_room_id, 'ルームID'
```

### 4. デプロイを行ってChatWorkへ通知を行う

```
$ bundle ex cap production deploy
```

これでChatWorkに以下のように通知がくると思います。

![スクリーンショット 2014-06-17 1.39.17.png](https://qiita-image-store.s3.amazonaws.com/0/2095/1ffd136d-232d-8a52-7c30-d09aa6004e90.png "スクリーンショット 2014-06-17 1.39.17.png")

## 通知メッセージカスタマイズする

デフォルトのメッセージだと味気ないのでメッセージ内容をちょっと変えましょう。
`config/deploy.rb`のなかで以下の設定をします。

``` diff:config/deploy.rb

lock '3.2.1'

set :application, 'testapp'
set :repo_url, 'git@github.com:polidog/symfony2bss.git'
set :deploy_to, '/var/www/vhost/test'


## ChatWork
set :chatwork_api_token, 'APIキーを入力'
set :chatwork_room_id, 'ルームID'
++ set :chatwork_deploy_started_message, "[#{rails_env}]へデプロイを開始します。ブランチ:#{deployment_name}, ユーザ(#{user}) :):):):)"
++ set :chatwork_deploy_finished_message, "[#{rails_env}]へのデプロイが完了しました。ブランチ(#{deployment_name}), ユーザ(#{user}) (beer)(beer)(beer)(beer)"
++ set :chatwork_deploy_failed_message, "[#{rails_env}]へのデプロイが失敗しました。 ブランチ(#{deployment_name}), ユーザ(#{user}) (devil)(devil)(devil)(devil)"
```

こんな感じに変更してデプロイを行えば以下のようになります。
![kobito.1402937690.382290.png](https://qiita-image-store.s3.amazonaws.com/0/2095/760b0337-3e66-3076-cab6-f31a748d532a.png "kobito.1402937690.382290.png")


絵文字も使えるのでちょっと楽しいですね！


#### メッセージで使用可能なメソッド

|メソッド名|説明|
|-----|-----|
| user |gitの設定ファイル、または環境変数からユーザー名を取得する|
| deployment_name |ブランチ名または、application変数から取得する|
| rails_env | rails_env変数から値を取得する|

こんな感じですかね。。間違ってたらごめんなさい。

## 最後に


非常に簡単にChatWorkへの通知ができるのでぜひ興味があるかたは使ってみてださい！
XAMPP上のapacheでリバースプロキシを使ってWebrick上で動作しているredmineにアクセス

既にXAMPPのインストールと、redmineのインストールを済ませているものとして話を進めます。

# redmine の環境
Environment:
  Redmine version                2.5.1.stable
  Ruby version                   2.0.0-p353 (2013-11-22) [x64-mingw32]
  Rails version                  3.2.17
  Environment                    production
  Database adapter               SQLite

# リバースプロキシの設定

apache が `C:\xampp\apache` に インストールされているとして `httpd.conf` を編集

```apache:C:\xampp\apache\httpd.conf
# こいつをコメントアウト
LoadModule proxy_http_module modules/mod_proxy_http.so 
```

続いて `extra\httpd-proxy.conf` を編集

```apache:C:\xampp\apache\extra\httpd-proxy.conf
<IfModule proxy_module>
<IfModule proxy_http_module>
# 以下の2行を追加. IP部分は適宜変更
ProxyPass /redmine http://127.0.0.1:3000/redmine
ProxyPassReverse /redmine http://127.0.0.1:3000/redmine
```

上記の編集を終えたら、apache再起動.

# Redmineの設定

redmineフォルダ直下の`config.ru`を編集する

```rb:config.ru
require ::File.expand_path('../config/environment',  __FILE__)
if ENV['RAILS_RELATIVE_URL_ROOT']
  map ENV['RAILS_RELATIVE_URL_ROOT'] do
    run RedmineApp::Application
  end
else
  run RedmineApp::Application
end
```

`sinatra` だとこれだけでOKだが、`Webrick` の場合、以下のファイルを編集する

```rb:C:\Ruby200-x64\lib\ruby\gems\2.0.0\gems\rack-1.4.5\lib\rack\handler\webrick.rb
def service(req, res)
  env = req.meta_vars
  #以下の行を追加。@app.call(env)より前であればここじゃなくてもいい。
  env["HTTP_HOST"] = "#{env["SERVER_NAME"]}:#{env["SERVER_PORT"]}"
```

コマンドプロンプトを起動し、以下のコマンドを入力

```
> set RAILS_RELATIVE_URL_ROOT=/redmine
> ruby script/rails server webrick -e production
```

# 完了

上記設定を完了した後、`http://127.0.0.1/redmine` にアクセスすると `http://127.0.0.1:3000/redmine` の情報が表示されるはず。

ポイントはWebrickでsub-uriでアクセスする際はrackのrubyスクリプトをいじる必要があるということかなぁ。これが正解だとは思っていないので、要調査。
ViewpagerのFragmentを動的に更新


viewpagerで、Fragmentを利用する場合、
Activityの様に実装しても、更新されません。

FragmentPagerAdapter内では、Fragmentmanagerにて管理されているため、こちらを更新させる必要があります。


##FragmentPagerAdapterの実装

```FragmentPagerAdapter
  @Override
  public int getItemPosition(Object object) {
    return POSITION_NONE;
  }
  public void destroyAllItem(ViewPager pager) {
    for (int i = 0; i < getCount() - 1; i++) {
      try {
        Object obj = this.instantiateItem(pager, i);
        if (obj != null)
          destroyItem(pager, i, obj);
        } catch (Exception e) {
        }
      }
  }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        super.destroyItem(container, position, object);

        if (position <= getCount()) {
            FragmentManager manager = ((Fragment) object).getFragmentManager();
            FragmentTransaction trans = manager.beginTransaction();
            trans.remove((Fragment) object);
            trans.commit();
        }
    }
```

2016/01/25　ご指摘のありました、下記については、申し訳ありませんが、私の方にて試すことが暫くできないため、実装者様側にて、getCount() - 1 が正しいかは判断お願い致します。
```
for (int i = 0; i < getCount() - 1; i++) {
```

⚠️getItemPosition()で、POSITION_NONEをreturnする


##Activity側の実装
```Activity
public class MainActivity extends ActionBarActivity {

  private FragmentAdapter _pagerAdapter;
  private void updateFragment() {
    ViewPager pager = (ViewPager) findViewById(R.id.viewpager);
    pager.setOnPageChangeListener(pagerListner);
    _pagerAdapter.destroyAllItem(pager);
    _pagerAdapter.setResource(resources);
    _pagerAdapter.notifyDataSetChanged();
    pager.setAdapter(_pagerAdapter);
  }
}
```

私がやりたかったのは、３枚のFragmentをボタンアクション時に、異なった内容の３枚のFragmentに変更する
ことだったので、変更ボタンaction時に

まず、
**destroyAllItem()**
をcallします。

次に、新しいリソース(表示したいもの)をセット
**setResource()**

そして、
**notifyDataSetChanged()**
で変更通知

viewpagerにadapterをセットして完了

***
ちょっと適当に作っていますが、、、
[サンプルソース](https://github.com/rmizusawa/FragmentPagerSample)
x86-64 アセンブリ読んでみる -O0

Cのコード

      void f(){
        printf("a\n");
      }

      int main(){
        f();
        return 0;
      }

アセンブリコード
コンパイラはicc 14.0.3
コンパイラオプションは -O0 -g

      0000000000400514 <f>:
      400594:       55                      push   %rbp
      400595:       48 89 e5                mov    %rsp,%rbp
      400598:       48 83 ec 10             sub    $0x10,%rsp
      40059c:       b8 3c 08 40 00          mov    $0x40083c,%eax
      4005a1:       48 89 c7                mov    %rax,%rdi
      4005a4:       b8 00 00 00 00          mov    $0x0,%eax
      4005a9:       e8 ba fe ff ff          callq  400468 <printf@plt>
      4005ae:       89 45 f0                mov    %eax,-0x10(%rbp)
      4005b1:       c9                      leaveq
      4005b2:       c3                      retq
      4005b3:       90                      nop
      0000000000400554 <main>:
      400554:       55                      push   %rbp
      400555:       48 89 e5                mov    %rsp,%rbp
      400558:       b8 00 00 00 00          mov    $0x0,%eax
      40055d:       e8 b2 ff ff ff          callq  400514 <f>
      400562:       b8 00 00 00 00          mov    $0x0,%eax
      400567:       c9                      leaveq
      400568:       c3                      retq

動作を理解していく。
まずmainから

      400558:       b8 00 00 00 00          mov    $0x0,%eax
      40055d:       e8 b2 ff ff ff          callq  400514 <f>

eaxレジスタは戻り値を渡すのに使われるらしい。
でも400558で初期化するのは無駄な気もする。
そして、callqで400514 fに飛ぶ

      400514:       55                      push   %rbp
      400515:       48 89 e5                mov    %rsp,%rbp
      400518:       48 83 ec 10             sub    $0x10,%rsp

callerのベースポインタを退避して、callerのスタックの若いほうにcalleeのスタックを積む

      40059c:       b8 3c 08 40 00          mov    $0x40083c,%eax
      4005a1:       48 89 c7                mov    %rax,%rdi
      4005a4:       b8 00 00 00 00          mov    $0x0,%eax

.rodataセクションに埋め込んである"a\n\0"のアドレスをeaxに入れる。
raxを引数用レジスタrdiに入れる。
引数渡し用のレジスタはrdi/rsi/rdx/rcx/r8/r9の順に使われる。
これも直接rdiにアドレスを書き込めば良いような気がする。
やはりeaxを初期化する。

      4005a9:       e8 ba fe ff ff          callq  400468 <printf@plt>
      4005ae:       89 45 f0                mov    %eax,-0x10(%rbp)

printfを読んで返り値をレジスタに入れる。

      4005b1:       c9                      leaveq
      4005b2:       c3                      retq

rbp,rspをcallee側で戻して返る。
-O2を付けたら、かなり大胆に変わったので、次はそれを読む。
perlでAzureのBlob操作

perl関連でAzureのBlobの操作。

サンプルなどはここに書いてありますが、最初はちょっとてこずる。
http://junnama.alfasado.net/online/2013/12/netazurestrageclientcpan.html

まずは、CPANの「Net::Azure::StorageClient」を使えるようにする。

環境はUbuntsu。

```bash:command
# apt-get install libxml-perl
# cpan -i Net::Azure::StorageClient
```

構成的に「test」というコンテナを作り、中に「20140616」というフォルダ、その中に「test.tsv」というファイル。
つまりは以下の構成。

```dummy
  test
   |-20140616
        |-test.tsv
```

# フォルダのリストの表示


```pl:list.pl
#!/usr/bin/perl

use Net::Azure::StorageClient::Blob;

my $blobService = Net::Azure::StorageClient::Blob->new(
                                    account_name => 'アカウント',
                                    primary_access_key => 'シークレットキー', );
my $res = $blobService->list_blobs( 'test', { options => 'prefix=20140616/' } );
my $xml = $res->content;
print "$xml";
```

シークレットなんかは自分でMSから取得したアカウントとか。

結果は以下のxml

```xml:result
<?xml version="1.0" encoding="utf-8"?>
<EnumerationResults ContainerName="https://アカウント.blob.core.windows.net/test">
  <Prefix>20140616/</Prefix>
  <Blobs>
    <Blob>
      <Name>20140616/test.tsv</Name>
      <Url>https://アカウント.blob.core.windows.net/test/20140616/test.tsv</Url>
      <Properties>
        <Last-Modified>Mon, 16 Jun 2014 12:34:39 GMT</Last-Modified>
        <Etag>0x8D1577679848FBC</Etag>
        <Content-Length>34</Content-Length>
        <Content-Type>text/tab-separated-values</Content-Type>
        <Content-Encoding /><Content-Language />
        <Content-MD5>tfxlTh3a1F1LiVPyrfawLw==</Content-MD5>
        <Cache-Control />
        <BlobType>BlockBlob</BlobType>
        <LeaseStatus>unlocked</LeaseStatus>
        <LeaseState>available</LeaseState>
      </Properties>
    </Blob>
  </Blobs><NextMarker />
</EnumerationResults>
```

# フォルダのダウンロード

test.tsvというファイルをダウンロードしています。
ローカルをフォルダで指定するとエラーになります。

フォルダ単位でのアップとかは出来そう。

```pl:get.pl
#!/usr/bin/perl

use Net::Azure::StorageClient::Blob;

my $blobService = Net::Azure::StorageClient::Blob->new(
                                    account_name => 'アカウント',
                                    primary_access_key => 'シークレットキー', );
my $res = $blobService->download('test/20140616/test.tsv', '/tmp/test.tsv');
my $xml = $res->message;
print "$xml";
```

★結果

```dummy
OK
```

「$res->content;」とかすると中身表示しちゃう。

# ファイルのアップロード

ローカルの「/tmp/up.txt」をアップロードしています。

```pl:up.pl
#!/usr/bin/perl

use Net::Azure::StorageClient::Blob;

my $blobService = Net::Azure::StorageClient::Blob->new(
                                    account_name => 'アカウント',
                                    primary_access_key => 'シークレットキー', );
my $res = $blobService->upload('test/20140616/up.txt', '/tmp/up.txt');
my $xml = $res->message;
print "$xml";
```

★結果

```dummy
Created
```

慣れると操作は色々。

上のリンクのブログにあるようにフォルダにファイル5000個以上の時とか、スレッド増やしたりとか色々癖はありそう。
mkmfでわくわく環境チェック

Rubyの標準添付ライブラリに`mkmf`があります。

これは本来Rubyの拡張ライブラリを作るMakefileを作るためのRuby標準添付ライブラリなのですが、Ruby developerの方々の手によって素晴らしく便利で柔軟に作られているため、かんたんにマシンの環境チェックする用途にも使えるようです。

「構造体struct statでst_ctim.tv_nsecメンバーが取れる環境なのかチェックしたい」
=> [have_struct_member](http://docs.ruby-lang.org/ja/2.1.0/method/Kernel/i/have_struct_member.html)("struct stat", "st_ctim.tv_nsec")

「mecabが使えるものなら使いたい」
=> [have_header](http://docs.ruby-lang.org/ja/2.1.0/method/Kernel/i/have_header.html)('mecab.h')

「ライブラリlibcがあってしかもprintfが使えるのか気になってしょうがない」
=> [have_library](http://docs.ruby-lang.org/ja/2.1.0/method/Kernel/i/have_library.html)("c", "printf")

「今までチェックしたことをまとめてヘッダーファイルとして書き出したい」
=> [create_header](http://docs.ruby-lang.org/ja/2.1.0/method/Kernel/i/create_header.html)

このヘッダーファイルには`struct stat st_ctim.tv_nsec`メンバーがあるなら`#define HAVE_STRUCT_STAT_ST_CTIM 1`のように書きだされています。
あとはヘッダーファイルを`#include`して`#ifdef`等で分岐すればどんな環境でもポータブルに使えるコードを書くことができます。(要調査力)
わざわざヘッダーに書きださなくても[$defs](http://docs.ruby-lang.org/ja/2.1.0/method/Kernel/v/defs.html)には`["-DHAVE_STRUCT_STAT_ST_CTIM"]`のように配列が詰まっているのでコンパイルオプションとしても使いやすく設計されています。
使い方はかんたん。`require 'mkmf'`と唱えるだけです。

Rubyのコードなのでif文なんかも思いのまま、これでご家庭の隅に複雑に詰まってしまったconfigureのいくつかはRubyコードで綺麗にまとめられるんじゃないでしょうか。

「こっちのほうがもっと汎用的で高機能だよー」等の声があればぜひ教えていただきたいところですが、「標準添付」は結構なアドバンテージなのではないでしょうか。Rubyすばらしい。
(「mkmfをそんな用途に使うんじゃねえ！」って言われたらどうしよう。。。)
さくっとスクショを取るnpmモジュール - webshot

https://github.com/brenden/node-webshot

あくまでも、PhantomJSのwrapper。

# install

```
npm install webshot -g
```

# 使い方

```js:app.js
var webshot = require('webshot');

webshot('http://google.co.jp', 'google.png', function(err) {
// エラー処理を書く
});
```
Rakefileにunicorn起動・停止のコマンドを追加する


いい加減<code>$ bundle exec unicorn_rails...</code>をやるのが面倒なので、Rakefileにunicorn起動・停止のタスクを追加した。

```ruby:Rakefile
require File.expand_path('../config/application', __FILE__)

Rails.application.load_tasks

namespace :unicorn do
 
  ##
  # Tasks
  ## 
  desc "Start unicorn"
  task(:start) {
    config = rails_root + "config/unicorn.rb"
    sh "bundle exec unicorn_rails -c #{config} -E development -D"
  }
 
  desc "Stop unicorn"
  task(:stop) { unicorn_signal :QUIT }
 
  desc "Restart unicorn with USR2"
  task(:restart) { unicorn_signal :USR2 }
 
  desc "Increment number of worker processes"
  task(:increment) { unicorn_signal :TTIN }
 
  desc "Decrement number of worker processes"
  task(:decrement) { unicorn_signal :TTOU }
 
  desc "Unicorn pstree (depends on pstree command)"
  task(:pstree) do
    sh "pstree '#{unicorn_pid}'"
  end
 
  ##
  # Helpers
  ##
  def unicorn_signal signal
    Process.kill signal, unicorn_pid
  end
 
  def unicorn_pid
    begin
      File.read("/tmp/unicorn.pid").to_i
    rescue Errno::ENOENT
      raise "Unicorn doesn't seem to be running"
    end
  end
 
  def rails_root
    require "pathname"
    Pathname.new(__FILE__) + "../"
  end 
end
```


これで、<code>$ rake unicorn:start</code>で、unicornの起動。
<code>$ rake unicorn:stop</code>でunicornの停止が出来る。

unicorn.pidをrails/tmp/pidsにおいている人は、<code>/tmp/unicorn.pid</code>のpathを変更したらいけるはず。

## 参考
[Rake tasks for Unicorn: start stop restart increment decrement pstree](https://gist.github.com/pda/1210769)
HomebrewでインストールしたJenkinsでプラグイン一覧が表示されないとき


プラグイン一覧を管理しているjsonがないのが原因のようです
以下覚書として。



```bash
$ wget -O default.js http://updates.jenkins-ci.org/update-center.json
$ sed '1d;$d' default.js > default.json
$ mkdir /usr/local/opt/jenkins/updates
$ mv default.json /usr/local/opt/jenkins/updates/
$ java -jar /usr/local/opt/jenkins/libexec/jenkins.war
```

これで表示されました！
Railsでアップロードされたファイルをウイルススキャン

Railsでアップロードされたファイルを自動的にウイルススキャンできるミドルウェアを昔作ったサービスで作ったのを思い出し、Gem化してみた。

https://github.com/dtaniwaki/rack-secure-upload

インストールは簡単。

```rb:Gemfile
gem 'rack-secure-upload'
```

application.rbに以下を追加するだけ。

```rb:config/application.rb
module MyApp
  class Application < Rails::Application
    config.middleware.insert_before ActionDispatch::ParamsParser, Rack::SecureUpload::Middleware, :avast
  end 
end
```

現在はAvastとFsecureに対応（別途インストールしておく必要がある）。
Avastは無料なので気軽に試せるがEC2のmicroインスタンスだと貧弱すぎてスキャンにものすごい時間がかかる。

簡単なSampleアプリケーションを以下に作ってみた。

https://github.com/dtaniwaki/rack-secure-upload-sample-app

試しに[eicar](http://www.eicar.org)をアップロードしてみると、

![Screen Shot 2014-06-16 at 11.19.14 PM.png](https://qiita-image-store.s3.amazonaws.com/0/22653/b7f1c9f8-6078-585a-1877-a3a85c31d7e4.png)

406を返す。

例外を出すこともできる。

![Screen Shot 2014-06-16 at 9.26.04 PM.png](https://qiita-image-store.s3.amazonaws.com/0/22653/666125da-944c-2567-cfe4-c9ba3f244a63.png)

後はこれを別のミドルウェアでrescueしてエラー画面出すなり、nginxでインターセプトしてエラー画面出すなりするとOK。

本来は[IPS](http://ja.wikipedia.org/wiki/%E4%BE%B5%E5%85%A5%E9%98%B2%E6%AD%A2%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0)などで検出すべきだけど、そこまで本格的なものは要らない人のためには重宝しそう！
まあ、ディレクトリ監視でウイルススキャン走らせてても良いのだけれど、常駐させる負荷はなくなるかな！？
git で "Agent admitted failure" とエラーが出たら

git で ssh を使って clone しようとしたらこんなエラーが出ました。
id_rsa を作ったり消したりしていたのが原因だったようです。

```console
Agent admitted failure to sign using the key.
Permission denied (publickey).
```

こんなときは

```console
$ ssh-add ~/.ssh/id_rsa
```

で解決。
Sublimeで連番の置換を行う

# 問題

例えば, `FILTER A BY hour = 1 OR hour = 2 OR hour = 3`みたいなコードを書きたいことがあります．こんなときに，なるべくタイプをせずに書きたいわけだが，

1. コピペで `FILTER A BY hour = 1 OR hour = 1 OR hour = 1` ってして
2. 1->2, 1->3と置換する

この2の作業をもっと簡単にしたい．

# 解決策

IncrementSelectionプラグイン
<https://github.com/yulanggong/IncrementSelection>

`Package Install -> IncrementSelection` でインストール可能!

# 使い方

連番にしたい数字部分を選択して，コマンドパレットからIncrementSelectionを実行するだけ．先の例だと

1. コピペで `FILTER A BY hour = 1 OR hour = 1 OR hour = 1` ってして
2. cmd+Fの検索で'[0-9]'-> FindAll
3. cmd+P -> IncrementSelection

もっとたくさんの列を出力しなきゃいけない時にとても役に立ちます．ちなみにAからはじめてB,C,D...という列にすることも出来るみたいです．
Trailing Closures and Curried function

SwiftはScalaに似てる、SwiftはScalaに似てるってずっと感じてたので大きく勘違いしていた。SwiftでTrailing Closureを書きたい場合はCurry化した関数を書く必要はないらしい。


## Curried Function in Swift
そもそもSwiftにはCurry化した関数を書くことができることを先に知ったのが発端。

```swift
func incrementBy(add: Int)(value: Int)-> Int {
    return add + value
}

let f = incrementBy(3)
f(value: 3)
```

引数を丸括弧で分けていくことで部分適用された関数を書くことができる。

## Curried Function in Scala
ScalaではこのCurry化を使ってTrailing ClosureみたいなDSLを書く

```scala
def incrementBy(add: Int)(value: Int): Int = add + value

val f = incrementBy(3)_  // このアンダーラインは部分適用された関数オブジェクトを生成するのに必要
f(3)
```

これをTrailing Closureで書く場合はこんな感じ.

```scala
incrementBy(3) {
     4 
} // -> 7
```

制御構造に見えるのでDSLっぽい。Trailing Closureもコレと同じようなものだろうと思って書いてみた。

## Trailing Closure in Swift

```swift
func incrementBy(v1: Int, v2: Int)(op: (Int, Int) -> Int)-> Int {
    return op(v1, v2)
}

incrementBy(3, 4) {
    $0 + $1
} // -> Error: Extra argument in call
```

引数多いと怒られる。ちゃんと隅々までドキュメント見ればよかったんだけど例が少なかったので勘違いしたのかもしれない。実はSwiftではCurry化なんて必要なくてClosureを最後の引数で渡すように書くだけで同じことができる。

```swift
func incrementBy(v1: Int, v2: Int, op: (Int, Int) -> Int)-> Int {
    return op(v1, v2)
}

incrementBy(3, 4) {
    $0 + $1
} // -> 7
```

ちょっと勘違いしていたのでメモ
RuboCop | Style/AlignHash | EnforcedColonStyle

# RuboCop | Style/AlignHash | EnforcedColonStyle

## 概要

RuboCopの「Style/AlignHash EnforcedColonStyle」警告について。

### 設定値一覧

|設定対象|設定値|内容|デフォルト|
|:-------|:-----|:---|:--------:|
|EnforcedColonStyle|key|キー左揃|○|
|EnforcedColonStyle|separator|キー右揃、valueを揃える|--|
|EnforcedColonStyle|table|キー左揃、valueを揃える|--|

## EnforcedColonStyle

key, separator, tableの各値での rubocop 実行結果をまとめます。

### 検証プログラム

enforced_colon_style.rb

~~~ruby
h_key = {
  name: 'tanaka',
  age: 33
}

h_separator = {
  name: 'tanaka',
   age: 33
}

h_table = {
  name: 'tanaka',
  age:  33
}

print h_key
print h_separator
print h_table
~~~

### EnforcedColonStyle key(デフォルト) でチェックした場合

.rubocop.yml

~~~yaml
AlignHash:
  EnforcedColonStyle: key
~~~

キーが右揃えになっている h_separator のみ警告発生

~~~bash
$ rubocop enforced_colon_style.rb
Inspecting 1 file
C

Offenses:

enforced_colon_style.rb:8:4: C: Align the elements of a hash literal if they span more than one line.
   age: 33
   ^^^^^^^

1 file inspected, 1 offense detected
~~~

### EnforcedColonStyle separator でチェックした場合

.rubocop.yml

~~~yaml
AlignHash:
  EnforcedColonStyle: separator
~~~

キーが左揃えになっている h_key/h_table で警告発生

~~~bash
$ rubocop enforced_colon_style.rb
Inspecting 1 file
C

Offenses:

enforced_colon_style.rb:3:3: C: Align the elements of a hash literal if they span more than one line.
  age: 33
  ^^^^^^^
enforced_colon_style.rb:13:3: C: Align the elements of a hash literal if they span more than one line.
  age:  33
  ^^^^^^^^

1 file inspected, 2 offenses detected
~~~

### EnforcedColonStyle table でチェックした場合

.rubocop.yml

~~~yaml
AlignHash:
  EnforcedColonStyle: table
~~~

Valueが揃っていない h_key で警告発生
キーが右揃えになっている h_separator で警告発生

~~~bash
$ rubocop enforced_colon_style.rb
Inspecting 1 file
C

Offenses:

enforced_colon_style.rb:3:3: C: Align the elements of a hash literal if they span more than one line.
  age: 33
  ^^^^^^^
enforced_colon_style.rb:8:4: C: Align the elements of a hash literal if they span more than one line.
   age: 33
   ^^^^^^^

1 file inspected, 2 offenses detected
~~~

## 補足
この警告は `rubocop -a` で修正可能です。
MavenをEclipseで使いたい初学者のトラブル例

## はじめに（経緯）

「せんせー、Mavenがなんかうまく動きません」

というわけで、初学者向けにまとめておく。

## プロジェクトと動作環境のJDK Versionの不一致

`mvn package`や`mvn jetty:run` でプロジェクトのパッケージ化や動作をさせようとする際に、次のようなエラーが発生する。

```
Fatal error compiling: invalid target release: x.x
```

```
Fatal error compiling: 1.8は無効なターゲット・リリースです
```

```
Unsupported major.minor version XX.X
```

こうしたときは、Mavenが、maven-compiler-pluginで指定されたプロジェクトのJDKのバージョンよりも古いバージョンのJavaで動作している。


### 原因の一例

Mac OSXであれば、Appleから提供されるJDKとOracleから提供されるJDK(やOpenJDK)が混在している環境で、適切にJAVA_HOMEを指定できていないなど。

Windowsであれば、必要なバージョンのJDKがインストールされていなかったり、環境設定のJAVA_HOMEが古いJDKを指定しているなど。

### チェック方法

```bash:
$ java -version
  # JavaのVersionが表示される
$ mvn -version
  # 表示されるJava versionもしくはJava homeの値が、
  # プロジェクトで想定しているバージョンと一致しているかを確認する
```

### 回復手順の一例

maven-compiler-pluginに対応するバージョンのJDKをインストールする。
インストールされている状態であれば、シェルにJAVA_HOMEのパスを適切に設定する。

Mac OSXであれば.bash_profileなどに以下の様に設定。

```bash:
$ vim ~/.bash_profile
  # JDK8を利用する場合
  export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
$ mvn -version
  # 表示されるJava versionもしくはJava homeの値が、
  # プロジェクトで想定しているバージョンと一致しているかを確認する
```

Windowsであれば、環境設定からJAVA_HOMEを対応するバージョンのJDKに指定しなおす。

### 参考

> [Major.minor unsupported version 51.0 Java MAC OSX](http://stackoverflow.com/questions/22435011/major-minor-unsupported-version-51-0-java-mac-osx)


## Fatal error compiling: invalid target release: x.x

```
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project xxx: Fatal error compiling: invalid target release: 1.8 -> [Help 1]
```

日本語の場合






## maven-resources-plugin:2.5に起因するMavenプロジェクト作成/インポートのトラブル

IDE（Eclipse）でmavenプロジェクトを作成/インポートしようとすると、上記のPlug-inが起因となったエラーのダイアログが発生し、Javaプロジェクトとして構築されない。

### 原因の一例

mavenでダウンロードしたプラグインのキャッシュ等に問題がある（と思われる）。

### 回復手順の一例

- ネットワーク接続が正常に行える環境かを確認する。
- .m2/repository ディレクトリを削除し、mavenプロジェクトの作成/インポートを再実行する。

```bash:
$ cd ~/.m2
$ rm -R repository
```

### 参考
> [Could not calculate build plan: Plugin org.apache.maven.plugins:maven-resources-plugin:2.5 or one of its dependencies could not be resolved](http://stackoverflow.com/questions/12533885/could-not-calculate-build-plan-plugin-org-apache-maven-pluginsmaven-resources)

## プロキシ環境下でのトラブル

- BYODしてるノートPCなどで、家では実行できたmvnコマンドがプロキシ環境下では実行できない（orその逆）
- IDEのProxyは外したのにMavenリポジトリに接続できない


### 原因の一例

Eclipseなどの一部のIDEでは、MavenのProxy設定を ${HOME}/.m2/settings.xml に任せている<sup><a name="fnref:1"></a>[1](#fn:1)</sup>ので、環境にあわせて編集する必要がある。

### 回復手順の一例

**Proxy環境下**で動作しない場合は、[Proxy設定が行われているか確認](http://qiita.com/gishi_yama/items/2e92d3d72e21c74704cb)する。

**Proxy環境外**で動作しない場合は、Proxy設定を外しているかを確認する。具体的には、Proxy設定の中のactive要素の値をfalseに変更すれば、Proxy設定が外れる。

```xml
<settings>
  <proxies>
    <proxy>
      <active>false</active>
<!--以下略-->
```

Proxy環境下に戻ったときは、設定も戻しておくことを忘れないように。


## おわりに

今後も新たに掲載できるものが増えていけば更新する。

----
1. <a name="fn:1"></a>デフォルト設定の場合。変更している場合は適宜ファイルパスを読み替える。[&#8617;](#fnref:1)
.mdb内の特定のテーブルをxmlに変換する

Microsoft Accessを使わずに、.mdbの中から特定のテーブルをxmlとして得る。
##使った環境
* Visual Studio Express 2012 for Windows Desktop

##コード（VB）
```vbnet:
Option Explicit On

Module Module1
    Sub Main()
        Dim cn As New ADODB.Connection
        Dim rs As New ADODB.Recordset
        'データベースに接続
        cn.Open("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=C:\Users\*********\hoge.mdb", , , )
        'レコードセットを開く。保存したいテーブル名を指定
        rs.Open("テーブル名", cn)
        'レコードセットをxmlに出力
        rs.Save("C:\Users\*********\hoge.xml", ADODB.PersistFormatEnum.adPersistXML)

        MsgBox("DONE")
        rs.Close()
        rs = Nothing
        cn.Close()
        cn = Nothing

    End Sub
End Module
```
###参照設定
* Microsoft ActiveX Data Objects 6.0 Library
* Microsoft ADO Ext. 6.0 for DDL and Security

### その他
読み込むmdbと保存するxmlのパスは適宜。

##参考
* [Connection オブジェクト](http://msdn.microsoft.com/ja-jp/library/cc364251.aspx)
* [Recordset オブジェクト](http://msdn.microsoft.com/ja-jp/library/cc364264.aspx)
nginx + php5-fpm で、php が動いた設定ファイル例


php が起動できずにかなりハマってしまい内外の各種ブログを参考にさせていただき、やっと以下の設定ファイルで php が動きました（<?php phpinfo();?> が、表示された）

ハマっている最中、実際に php が動いた設定のサンプルとかあれば... と思いつつも見つからなかったので、同じようにハマっている方の参考になればと思い投稿しました

```/etc/nginx.conf

user www-data;
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    # multi_accept on;
}

http {
    include       /etc/nginx/mime.types;

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

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;

    gzip  on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

    server {
        #listen 80;
        root /usr/share/nginx/www;
        #index index.php index.html index.htm;

        location ~ \.php$ {
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME /usr/share/nginx/www/$fastcgi_script_name;
            include fastcgi_params;
        }
    }
}
```
```/etc/nginx/conf.c/default.conf

server {
#listen 80;
  location / {
     root   /usr/share/nginx/www;
     index  index.html index.htm;
     index  index.php;
  }

 #location ~ \.php$ {
 #    root           html;
 #    fastcgi_pass   127.0.0.1:9000;
 #    fastcgi_index  index.php;
 #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
 #    include        fastcgi_params;
 #}
 location ~ \.php$ {
     root           /usr/share/nginx/www;
     fastcgi_pass unix:/var/run/php5-fpm.sock;
     fastcgi_index  index.php;
     fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/www$fastcgi_script_name;
     include        fastcgi_params;
 }
}
```
ポイントは多分以下のように思います
1. rastcgi_pass を unix ソケットをフルパスで記載
2. fastcgi_param で、$document を使わないでフルパスで記載

尚、当方のドキュメントルートはデフォルトの /usr/share/nginx/www のままです

あと、上記設定では nginx 起動時にまだワーニングが残ってます

```bash
pi@raspberrypi ~ $ sudo service nginx restart
Restarting nginx: nginx: [warn] conflicting server name "" on 0.0.0.0:80, ignored
nginx.
pi@raspberrypi ~ $ 
```
JavaScript easing

```coffeescript
easeOutExpo = (t, b, c, d) ->
  if t is d then b + c else c * (-Math.pow(2, -10 * t / d) + 1) + b

now = +new Date

step = ->
  t = +new Date - now # 現在秒 (現在
  b = 0               # 最初の値
  c = 100             # 変動する値
  d = 2000            # 何秒かけて動くか
  v = easeOutExpo(t, b, c, d)
  console.log v
  setTimeout (-> step()), 1000 / 60 if d > t

step()
```

※ Cの変化量とは
例えば、x1（座標が10）からx2（座標が100）に移動する場合cは90となる。
つまり変化の総量である。
超簡単！xmlファイルの変更だけでできるAndroidのタブレット対応


## はじめに
先日リリースした Wantedly の[Androidアプリ](http://goo.gl/rxT59a)では、xml ファイルの変更のみでできる簡易なタブレット対応を行っています。その概要を紹介します。


## タブレットでの画面レイアウトの問題点
スマートフォン向けに画面レイアウトの設計を行っていると、タブレットでアプリを起動したときに以下のような問題が出るケースがあります。

* 画像の縦横比率が崩れる
* 文字が小さい
* margin が小さい
* weight を使ったレイアウトが崩れる

こうした問題は xml ファイルの変更でサクッと解決しましょう。

（参考）Nexus7 でアプリを起動した時のタブレット対応前（左）と対応後（右）の画面

![Nexus7での表示例](https://qiita-image-store.s3.amazonaws.com/0/39324/d7d4f78f-84cc-e904-6e8c-a02699cf44d7.png "image.png")

実際にアプリを操作してみたい方は[こちら](http://goo.gl/rxT59a)からどうぞ。



## 対応方法
ここでは "7インチタブレット縦向き" の場合に "画像と文字" を大きく表示させる例を紹介します。

### 事前準備
*res/values/* 配下のファイルに "タブレット画面で表示する際に値を変えたいもの" を定義します。対応済みであれば不要です。


```xml:dimen.xml
<resources>

    <dimen name="imageview_logo">48dp</dimen>
    <dimen name="textsize_small">14sp</dimen>
    <dimen name="textsize_medium">18sp</dimen>
    <dimen name="textsize_large">22sp</dimen>

</resources>
```


layout ファイルはこんな感じです。


```xml:fragment_main.xml
...

<ImageView
    android:layout_width="@dimen/imageview_logo"
    android:layout_height="@dimen/imageview_logo"
    android:src="@drawable/logo" />

<TextView
    android:layout_width="wrap_contet"
    android:layout_height="wrap_contet"
    android:text="Hello"
    android:textSize="@dimen/textsize_large" />

...
```



### やること
*res/values-sw600dp/* フォルダ* を作成し、配下のファイルにタブレット画面向けの値を定義します。


```xml:dimen.xml
<resources>

    <dimen name="imageview_logo">64dp</dimen>
    <dimen name="textsize_small">16sp</dimen>
    <dimen name="textsize_medium">20sp</dimen>
    <dimen name="textsize_large">24sp</dimen>

</resources>
```
\* sw600dp は smallestWidth:600dp の意味

以上！超簡単ですね。

## 参考ドキュメント
本件に関連するオフィシャルドキュメントのリンクです。

様々な画面サイズに対応するベストプラクティスが記載されています。上述の values-swXXXdp あたりの詳細についても触れています。必読です！
http://developer.android.com/guide/practices/screens_support.html


リソースタイプの使い方、フォーマットなどについて書かれたドキュメントです。それぞれのリソースについて、必要に応じて、画面サイズごとに適切な値を用意しましょう。
http://developer.android.com/guide/topics/resources/available-resources.html

マルチペインなど、もう一歩進んだタブレット対応を行う場合はここを参考にしましょう。
http://developer.android.com/guide/practices/tablets-and-handsets.html


## おわりに
フィードバックなどありましたらよろしくお願いいたします。
Node.jsアプリケーションのヒープをdumpしたい

Node.jsで書かれたイベントドリブンなデーモンはプロセスが死なないため結構リークする。HTTPサーバであれば、クラスタリングしておいて適当に殺せば他のワーカが働いてくれるので問題ないが、持続的接続を行うデーモンの場合は非常に殺しづらい。こういうリークしてるアプリケーションをデバッグしたい場合、デバッガをアタッチすれば良いことが多いのだが、本番環境でしかリークしない時本番で動いていアプリケーションのメモリの内容を直接見られると嬉しい。

## node-heapdumpでヒープダンプをとる

node-heapdumpを使うと簡単にV8のヒープをそのままダンプできる。

とりあえずrequireする。

```app.coffee
heapdump = require 'heapdump'
...

```

### USR2シグナルを送ってスナップショットをとる

UNIX環境であればてきとうにUSR2シグナルを送るだけでスナップショットをとれる。

```
kill -USR2 $pid
```

### メソッドを呼び出してスナップショットをとる

メソッドを呼び出して特定場所のスナップショットをとることもできる。Linuxであればforkしてからスナップショットをとってくれるので、ノンブロッキングに実行できる。

```
heapdump.writeSnapshot "/tmp/heapdump-#{Date.now()}.heapsnapshot"
```

## スナップショットを読む

保存したスナップショットを読みにはGoogle Chromeの開発者ツールを使えば良い。

Developer ToolのProfileタブから適当にロードできる。

![DeveloperTool.png](https://qiita-image-store.s3.amazonaws.com/0/5218/00dbeb06-0de6-bd7b-02dd-1956afd4e1de.png)
[MFC] CDialogでDomodalしたときにすぐにクローズしようとしてASSERTで怒られた件

ちょっと細かい話です。

## 事の経緯

DoModalって普通はユーザに回答を促すダイアログを出したいときに使うので、表題のようなことは起こり得ないんでは…と思われるかもしれませんが、こういう状況は例えば…
「ファイルのコピー中の進捗表示」
などの、進捗表示系ダイアログを作るときに往々にして起こり得ます。


だいたい、進捗表示をやらせる場合は、

* メイン(UI)スレッドに進捗ダイアログ表示
* ワーカースレッドで実作業

という形にほぼ落ち着くかと思います。で、ワーカー側からユーザ定義ウィンドウメッセージをダイアログに送って、表示の更新を行うのがセオリーですね。

で、「ワーカーが終わったらダイアログを自動的に閉じたい」という欲求も当然でてきます。普通に組むとそれなりに動いてくれるわけですが、ここで問題があって、ワーカーの処理が早く終わりすぎた等、ダイアログが表示し終わる前にEndDialog等で終わらせるとASSERTが出てしまう…ということです。
ASSERTはデバッグの時しかでないので無視してもいいといえばいいんですが、それでは気持ちが悪いのでなんとかしてみましょうということです。

モードレスダイアログならこういった状況は起きにくいんですが（HIDEで隠してあとで破棄すればよいだけの話）、モードレスの場合はメインウィンドウが触れたりしますよね。それは困るのでモーダルで…と言うことです。

## 解決方法

色々やってみましたが、結局

* OnInitDialog でタイマー起動
* タイマー関数で閉じる要求のフラグを見てここからEndDialog発行
* ユーザメッセージからのダイアログ閉じる要求は、直接EndDialogを呼び出すのではなく、閉じる要求フラグを立てる

という方法に落ち着きました。多少泥臭いですが仕方なしです。

「メッセージを送るんじゃなくて直接閉じれないの？」と思われがちですが、MFC(かな)は「スレッドが違うもの同士のダイアログは触れてはならない」という面倒くさい鉄の掟があるのでメッセージで…ということでした。


コードにするとこんな感じです。

```cpp:CxxxDialog.h

#define USER_PROGRESS WM_USER + 0x10

```

```cpp:WorkerThread.cpp

// 進捗状況ダイアログを閉じたい
void WorkerThread::CloseWindow(CWnd *pWnd)
{
	pWnd->SendMessage(USER_PROGRESS,0,1);
}


```


```cpp:CxxxDialog.cpp

CxxxDialog::CxxxDialog(hogehoge) : hogehoge
{
	m_close = false;
}


BEGIN_MESSAGE_MAP(CxxxDialog, CDialog)
...
	ON_MESSAGE(USER_PROGRESS,&CxxxDialog::OnUserProgress)
	ON_WM_TIMER()
END_MESSAGE_MAP()


BOOL CxxxDialog::OnInitDialog()
{
	// iroiro
	m_TimerID = SetTimer(100,100,NULL);
	// iroiro
}

LRESULT CxxxDialog::OnUserProgress(WPARAM wParam, LPARAM lParam)
{
	// iroiro

	// 仮に、lparamが1の時は閉じる要求があったことにする
	if(lParam == 1){
		m_close = true;
		return 0;
	}
	// iroiro
}

void CxxxDialog::OnTimer(UINT nIDEvent)
{
	// クローズ指示が来た場合、タイマーによってEnddialogを使うことで安全に閉じる
	if(m_close){
		KillTimer(m_TimerID);
		EndDialog(0);
	}
}

```
Mac のディスプレイに Raspberry Pi のデスクトップを表示する

# はじめに
## ようするに
要するに Mac のX11 を使って Raspbian の LXDE を Mac 上で使う方法。Mac には XQuartz 等の X11環境がインストールされていることが前提です。ただし、事前に起動してなくてもかまいません。

## なにがうれしいのか
1. HDMI をTVにつないだり、キーボードやマウスの用意をしないで Mac だけで Raspberry Pi を使える
2. Mac のアプリと Raspberry Pi のアプリの間でコピー&ペーストが出来るので便利
3. しかも、VNC 不要

## 注意
以下で、192.168.11.14 は、私の環境での Raspberry Pi の IP アドレスです。この値は、ご自身の環境でのアドレスに置き換えてください
アカウントとパスワードはデフォルトのままとしてますので、ここもご自身の環境で変更されているなら、そのように置き換えてください
 
# 手順
1. Raspberry Pi を起動。
2. Mac のターミナル を起動して、以下のように -X オプション付きで ssh のセッションを開始する。

```Bash
uedatakeyuki-no-MacBook-Air:~ takeyuki$ ssh -X pi@192.168.11.14
pi@192.168.11.14's password: raspberry
```
※2016.07.08 追記
最近の Raspbian だと avahi が最初から入っているみたいで

```Bash
ssh -X pi@raspberrypi.local
```

と、ホスト名.local で名前が引けるみたいです

※追記終わり 

この時まだ起動されていないようでしたら X11 が Mac 上で自動的に起動されます。

3. ログイン後、lxsession と入力します

```Bash
pi@raspberrypi ~ $ lxsession
Openbox-Message: A window manager is already running on screen 0
Has notifications support True
Loading...
Connecting to daemon...
Connected.
displaytray True
Done loading.
```

これで、Raspbian のデスクトップ(LXDE)が起動されるので、Raspberry Pi のアプリを Mac のアプリと同様に使えます

#まとめ
上記の手順を一言でまとめると「-X オプション付きで ssh で接続し、lxsession を起動」になります

※2020.05.20 補足
久しぶりにやってみたら **-X** では繋げてもらえず **-Y** でないと繋がりませんでした、世の中は日々セキュリティに厳しくなっているようです
あと、**lxsession** だと今となっては昔懐かしい lxde が開くので、それはそれで初期の RPi を思い出して懐かしいのですが感傷など不要なら**x-session-manager** のほうがナウいかもしれません

参考:[SSH using Linux or Mac OS](https://www.raspberrypi.org/documentation/remote-access/ssh/unix.md): X-forwarding

※補足終わり


※2024.06.15 補足
bookworm で x-session-manager を実行しようとしたら
```
pi@raspberrypi:~/github/infoboard $ x-session-manager
Failed to inhibit: Access denied
```
って叱られて気がついた（遅い）のですが、コレだと余計なことしすぎててちょっとガサツすぎるので

```
/usr/bin/lxsession -s LXDE-pi -e LXDE
```

のほうがいいと思いました

※補足終わり


※2024.06.16 補足
コマンド長くておぼえられないのでシェルにしました
https://github.com/UedaTakeyuki/x-session

※補足終わり
Apache Pig で大規模データセットを分散処理する

# Apache Pig とは

[Apache Pig](http://pig.apache.org/) は簡潔に Hadoop でのクエリーを記述することのできる高水準な言語です。

このように高水準な記述で大規模なデータセットを扱えるドメイン固有言語のようなものは他にもいくつかありますが、現時点では Pig はその柔軟さや拡張性という面からかなり優位性が高いのではないかと思います。

|種類|説明|
|:--|:--|
|Pig|手軽に使えて複雑な処理も可能であり柔軟性が高い、パフォーマンスは低め|
|Hive|SQL ライクな文法が使用可能で Pig よりパフォーマンスが高い|
|Hadoop Streaming|Ruby や Python など慣れ親しんだ言語で MapReduce を記述できるが、実装そのものは自力で記述する必要が有る|
|Java|当然ながら最もハイパフォーマンスでありその分生産性は低い、毎日実行される処理など性能を追い求める場合はこれ|

実務で利用するなら、アドホックな分析には Pig を多用、毎晩実行するような定型処理だけガッツリとチューニングした Java プログラムを利用、といった風に使い分けるのが現実的かと思います。


## Pig を使うための準備をする

### パッケージの追加

Debian / Ubuntu を開発環境に使っていることを前提にします。 Cloudera の CDH3 のリポジトリを利用するのが最も手軽かと思います。

Debian の場合こうします。

```bash
# 公開鍵の追加
curl -s http://archive.cloudera.com/debian/archive.key | sudo apt-key add -

# ソースリストの記述
sudo vim /etc/apt/sources.list.d/cdh3.list 
# deb     http://archive.cloudera.com/debian squeeze-cdh3 contrib
#　deb-src http://archive.cloudera.com/debian squeeze-cdh3 contrib

sudo apt-get update
sudo apt-get install hadoop-pig
```

Pig にはテスト目的のローカルモード、分散実行用の Hadoop モードといったものがあり、開発のためにはまずローカルモードでジョブが普通に実行できる状態を目指します。

### Java のインストール

GNU/Linux ディストリビューションには OpenJDK などが用意されているかとは思いますが、 Pig のために [Oracle JDK](http://www.oracle.com/technetwork/java/javase/downloads/index.html) を公式サイトからダウンロードします。

[あなたとJAVA, 今すぐダウンロード](http://www.oracle.com/technetwork/java/javase/downloads/index.html)

ちなみに筆者は[プログラミング言語環境について以前にも書いた](http://qiita.com/ynakayama/items/2a4d4802c93eb5c40eab)ように /opt に入れますので /opt/java/jdk/current/bin あたりにパスを通し、また JAVA_HOME などの環境変数も適切に設定します。

### 動作確認をする

きちんと動作するかどうかの確認には Pig のチュートリアルを実行してみるのが良いでしょう。

```bash
wget -O  tutorial.tar.gz "https://cwiki.apache.org/confluence/download/attachments/27822259/pigtutorial.tar.gz?version=1&modificationDate=1311188529000"
tar xzvf tutorial.tar.gz
cd pigtmp
pig -x local script1-local.pig
```

ローカルモードで Pig を実行すると Hadoop のときのように出力先のディレクトリに part-r-00000 や _SUCCESS といったファイルが生成されます。

## Pig スクリプトを記述する

文法について日本語の情報としては[このあたり](http://d.hatena.ne.jp/yutakikuchi/20130107/1357514830)に良質な情報がありますので参考にすると良いでしょう。

よくありそうなケースとして次のようなシナリオを考えてみます。

```
タブ区切りに区切られたテキストの中に、主キー、開始時刻印、終了時刻印、件数が格納されている。これらのレコードを件数ごとにグルーピングしたい。
```

Pig であれば記述は 3 行程度で済みます。

```
raw = LOAD 'input.txt' USING PigStorage('\t') AS (key: chararray, start: chararray, end: chararray, counts: int);
grouped = GROUP raw BY counts;
STORE grouped INTO 'result' USING PigStorage();
```

1 行めはデータの形式を定義、 2 行めでグルーピングすなわち特定のデータごとにレコードをまとめる処理を記述、 3 行目で result というディレクトリに結果を出力しています。

ローカルモードと Hadoop モードでは、主に入出力ファイルが圧縮されたアーカイブかどうかといった点が異なります。しかしその他の大部分は同じです。

SQL に似てますから直感的な記述が可能ですし、これを Hadoop クラスタで実行すればそのまま分散処理ができるというわけです。便利ですね。

## 参考

大規模なデータセットを効率的に扱うための Pig 超入門
http://blog.livedoor.jp/sasata299/archives/51457409.html

10分でHadoop-Pigの基本文法を理解する
http://d.hatena.ne.jp/yutakikuchi/20130107/1357514830

Apache Pig でデータを処理する
http://www.ibm.com/developerworks/jp/linux/library/l-apachepigdataquery/

Getting Started (v0.12.1)
http://pig.apache.org/docs/r0.12.1/start.html

Pig Latin Basics (v0.12.1)
http://pig.apache.org/docs/r0.12.1/basic.html

Pig UDF Manual (v0.12.1)
http://pig.apache.org/docs/r0.12.1/udf.html
サイト制作時使っているサービス　リンク集

##IE表示の確認
###IETester
http://www.my-debugbar.com/wiki/IETester/HomePage
![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/f144f408-e230-f155-7037-7f692eb1745f.png)



##ダミー画像サイト
###Dynamic Dummy Image Generator
http://dummyimage.com/
![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/5d8a050b-e1e3-ab4e-f2c6-f36752c6cd23.png)



##Web Debugging Proxy
###Fiddler2
http://www.telerik.com/fiddler
![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/14eb9ed3-2adc-1155-ea56-46cb604f9193.png)

##バリデーションチェック
###Html Validator for Firefox
https://addons.mozilla.org/ja/firefox/addon/html-validator/
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/17a6ca44-e4f9-702b-36c6-1f045a1b9c81.png)


##エラーによるリンク切れ＆サイトマップ書き出し
###Website Explorer
http://www.umechando.com/webex/download.htm(本家)
http://www.vector.co.jp/soft/win95/net/se247055.html
![cp.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/6fbb1a3d-ae8a-5c90-b96d-d6cedc8d1cc3.png)

##画像圧縮
### tinypng
https://tinypng.com/
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/0212a96f-ef9e-5a15-ca83-c696d755d54d.png)


## 画像base64化
### BASE64 IMAGE
https://www.base64-image.de/
![base64.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/e7f288d3-6ff5-d1bd-f8c3-1289ff2f5513.png)


## psd画像をサムネイルで見たい
### IrfanView
http://www.irfanview.com/
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/85bd5a62-1def-deec-741d-9602cb900f8c.png)

##差分チェック
###WinMerge
http://www.forest.impress.co.jp/library/software/winmerge/
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/44278/7b2afebe-d9b4-5f8b-62d8-069eea3d9559.png)
Closure を使って幸せ Parse 生活

いちいち`findObjects...`とか打つの面倒だしViewControllerが汚くなるのでラッピングしましょう。
それに、`(objects as PFObject[]!).map {...}`が美しくないです。

```swift:Message.swift
class Message {
    class func findAllByUserWithBlock (user: PFObject!, callback: (PFObject[]!)->()) {
        let query = PFQuery(className: "Message")
        query.whereKey("user", equalTo: user)
        query.findObjectsInBackgroundWithBlock {(objects : AnyObject[]!, error: NSError!) in
            if (objects.count > 0) {
                callback(objects as PFObject[]!)
            }
        }
    }
}
```

```swift:HogeViewController.swift
let user = PFUser.currentUser()
Message.findAllByUserWithBlock(user) {(messages: PFObject[]!) in
    self.messages = messages.map {(message: PFObject!) in JSQMessage(text: message["text"] as String, sender: message["sender"] as String, date: message.createdAt)}
}
```

まあまあ心が洗われる文法になりました。
`PFObject`もラッピングしてあげれば`as String`も`[""]`も不要になりますね。
面倒くさいです。

ちなみにブロックはrubyのごとく()の外に出して呼ぶことが出来ます。
jQueryでよく見るような`})`を沢山見なくてすみますね。

`PFUser`も悲しい書き方がたくさん出来てしまうので、`extension`使って汚いコードを押し込みましょう。