OmniAICreator/Qiita-1.07M huggingface dataset:
LINQのクエリ構文


```cs:正の数の要素を求めるクエリ
int[] nums = { 1, -2, 3, 0, -4, 5 };

var res = from n in nums where n > 0 select n;

foreach (int i in res) {
	Console.WriteLine(i);
}
```

```cs:orderby句
int[] nums = { 1, -2, 3, 0, -4, 5 };

var res = from n in nums orderby n descending select n;

foreach (int i in res) {
	Console.WriteLine(i);
}
```

```cs:group句
string[] websites = {
	"A.com", "B.net", "C.net", "D.com", "E.org",
	"F.org", "G.tv", "H.net", "I.tv"
};

var webAddrs = from addr in websites
				where addr.LastIndexOf(".") != -1
				group addr by addr.Substring(addr.LastIndexOf("."));

// var sites は IGrouping<string, string>型
foreach (var sites in webAddrs) {
	Console.WriteLine(sites.Key);
	// var site は string型
	foreach (var site in sites) {
		Console.WriteLine(" " + site);
	}
}
```

```cs:intoによる継続
string[] websites = {
	"A.com", "B.net", "C.net", "D.com", "E.org",
	"F.org", "G.tv", "H.net", "I.tv"
};

var webAddrs = from addr in websites
               where addr.LastIndexOf (".") != -1
               group addr by addr.Substring (addr.LastIndexOf ("."))
               into ws
               where ws.Count () > 2
               select ws;

Console.WriteLine ("Top-level domains with more than 2 members.\n");
foreach (var sites in webAddrs) {
	Console.WriteLine (sites.Key);
	foreach (var site in sites) {
		Console.WriteLine (" " + site);
	}
	Console.WriteLine ();
}
```

```cs:let句
string[] strs = { "alpha", "beta", "gamma" };

var chrs = from str in strs
           let chrArray = str.ToCharArray ()
           from ch in chrArray
           orderby ch
           select ch;

foreach (char c in chrs) {
	Console.Write (c + " ");
}

// 実行結果
// a a a a a b e g h l m m p t 
```

```cs:join句
Item[] items = {
	new Item ("ItemA", 1111),
	new Item ("ItemB", 2222),
	new Item ("ItemC", 3333),
	new Item ("ItemD", 4444)
};

InStockStatus[] statusList = {
	new InStockStatus (1111, true),
	new InStockStatus (2222, false),
	new InStockStatus (3333, true),
	new InStockStatus (4444, true)
};

var inStockList = from item in items
                join entry in statusList
                on item.ItemNumber equals entry.ItemNumber
                select new { Name = item.Name, InStock = entry.InStock };

Console.WriteLine ("Item\tAvailable\n");
// var t は匿名型
foreach (var t in inStockList) {
	Console.WriteLine ("{0}\t{1}", t.Name, t.InStock);
}
```

```cs:グループ結合
string[] travelTypes = {
	"Air",
	"Sea",
	"Land",
};

Transport[] transports = {
	new Transport ("Bicycle", "Land"),
	new Transport ("Balloon", "Air"),
	new Transport ("Boat", "Sea"),
	new Transport ("Jet", "Air"),
	new Transport ("Canoe", "Sea"),
	new Transport ("Biplane", "Air"),
	new Transport ("Car", "Land"),
	new Transport ("Cargo Ship", "Sea"),
	new Transport ("Train", "Land")
};

var byHow = from how in travelTypes
            join trans in transports
            on how equals trans.How
            into lst
            select new { How = how, Tlist = lst };

foreach (var t in byHow) {
	Console.WriteLine ("{0} transportation includes:", t.How);
	foreach (var m in t.Tlist) {
		Console.WriteLine (" " + m.Name);
	}
	Console.WriteLine ();
}
```
.batでタイピングゲーム

　どうもです。batでタイピングゲームを作りました。

　簡単な英単語のタイピングです。時間を競います。単語数は1365。ですが、自分専用の単語集を作ることができます。

　バッチファイルの中身を掲載しておきますが、このバッチファイルは単体では動作しません、いろんなファイルが必要です。なので、axfcアップローダにフォルダをあげておきます。良かったら遊んでやってください。

　今は表示された単語を入力するただのタイピングですが、そのうち日本語⇔英語の高校生向けテスト対策バッチ(笑)でも作る予定です。

```lang:typing.bat
@echo off
cd /d %~dp0
setlocal enabledelayedexpansion
title タイピングゲーム

:start
for /f "delims=" %%i in ('findstr /b [0-9] %cd%\score.txt') do set best=%%i
set /a bestsec=best/100
set /a bestms=best%%100
set que=0
set r=0
set w=0
for /f "delims=" %%i in ('findstr A %cd%\option.txt') do set temp1=%%i
set question=%temp1:~4%
for /f "delims=" %%i in ('findstr B %cd%\option.txt') do set temp2=%%i
set original=%temp2:~4%
for /f "delims=" %%i in ('findstr C %cd%\option.txt') do set temp3=%%i
set line=%temp3:~4%
set loop=0
set usedb=13
if %original% == 1 set usedb=14
if %original% == 2 set usedb=1
cls
echo タイピングゲーム
echo.
echo  1…start
echo  0…setting
choice /c 10 /n
if %errorlevel% == 1 goto top
start /wait %cd%\option.txt
cls
echo トップに戻ります。
timeout /t 2 /nobreak >nul
goto start


:top
cls
echo 準備中...
set /a loop+=1
set /a dbnum=(%random%*usedb/32768)+1
set /a num=(%random%*line/32768)+1
set count=1
if %original% == 2 set dbnum=14
for /f %%n in (%cd%\database\DB%dbnum%.txt) do (
call :check %%n
set /a count+=1
)

:check
if %count% == %num% set sentence=%1& goto setting
exit /b

:setting
set q%loop%=%sentence%
if %question% == %loop% (
call :wait
call :btime
goto ans
)
goto top

:ans
cls
set /a que+=1
echo Ｑ%que%.【!q%que%!】
set /p input="入力> "
set a%que%=%input%
if "!q%que%!" == "%input%" goto right
goto wrong

:right
set /a r+=1
set j%que%=〇
if %que% == %question% goto fin
goto ans

:wrong
set j%que%=×
if %que% == %question% goto fin
goto ans

:fin
cls
call :etime
if %elapse% lss %best% (set renewal=1) else (set renewal=0)
echo  正解数 :%r%問(%question%問中)
echo 経過時間:%diffsec%.%diffms%秒
echo 過去最高:%bestsec%.%bestms%秒
echo.
if %renewal% == 1 (
echo ベストスコア更新！
echo.
echo %elapse% >%cd%\score.txt
)
set loop=0
call :finloop
pause >nul
goto start

:finloop
set /a loop+=1
set echoque=%loop%
if %loop% leq 9 set echoque=0%loop%
echo Ｑ%echoque%...!j%loop%! 【!q%loop%!→!a%loop%!】
if %loop% == %question% exit /b
goto finloop

:btime
for /f "tokens=1,2,3,4 delims=:." %%a in ("%time%") do (
　　set hour=1%%a
　　set min=1%%b
　　set sec=1%%c
　　set ms=1%%d
　　set /a hour-=100
　　set /a min-=100
　　set /a sec-=100
　　set /a ms-=100
　　set /a begin=hour*360000+min*6000+sec*100+ms
)
exit /b

:etime
for /f "tokens=1,2,3,4 delims=:." %%a in ("%time%") do (
　　set hour=1%%a
　　set min=1%%b
　　set sec=1%%c
    set ms=1%%d
　　set /a hour-=100
　　set /a min-=100
　　set /a sec-=100
　　set /a ms-=100
　　set /a end=hour*360000+min*6000+sec*100+ms
)
set /a elapse=end-begin
set /a diffsec=elapse/100
set /a diffms=elapse%%100


exit /b

:wait
cls
echo タイピングゲームを始めます。何かキーを押してください。
echo.
echo  問題数：%question%問
if %original% geq 1 (echo  オリジナル問題あり) else (
echo  オリジナル問題なし)
echo  過去最高:%bestsec%.%bestms%秒

pause >nul
cls
echo ３秒前...
choice /d y /n /t 1 >nul
echo ２秒前...
choice /d y /n /t 1 >nul
echo １秒前...
choice /d y /n /t 1 >nul
exit /b
```

[DLはここから。](http://www1.axfc.net/u/3424066)

以上です。不具合・感想などありましたら、是非コメントにて。
AngularJSの$qにはES6方式とCommonJS方式がある件

AngularJSの\$q、何度説明を読んでもピンとこなかったのですが、あることに気づいたら、すっと頭に入りました。それは、\$qには、ES6方式とCommonJS方式という2つのスタイルがあることです。Node.jsなどで良く知られているPromiseは、ES6方式であるため、その頭でCommonJS方式のコードを読むと混乱するのです。これは、特別な情報ではなく、version 1.3以降の公式ドキュメントの冒頭に書いてあります。(https://code.angularjs.org/1.3.13/docs/api/ng/service/$q)

たとえば、以下のサンプルで$qをnew Promiseと置き換えればそのままES6のPromiseが得られます。

```js
var promise = $q(function(resolve, reject) {
    setTimeout(function() {
      if (okToGreet(name)) {
        resolve('Hello, ' + name + '!');
      } else {
        reject('Greeting ' + name + ' is not allowed.');
      }
    }, 1000);
})

```

ただ、検索エンジンで「AngularJS \$q」などを検索すると、日本語はもちろん、英語でも1.2以前の$qの利用法、CommonJS方式のPromiseの使い方が上位に来ます。なので、公式に当たっていない人は、CommonJS方式しか知らない人も多いのではないかと思います。

```js
var promise = (function(){
  deferred = $q.defer();
  setTimeout(function() {
    deferred.notify('About to greet ' + name + '.');
    if (okToGreet(name)) {
      deferred.resolve('Hello, ' + name + '!');
    } else {
      deferred.reject('Greeting ' + name + ' is not allowed.');
    }
  }, 1000);
  return deferred.promise;
})();
```

CommonJS方式がデフォルトとされるのには理由があります。

```
Note: progress/notify callbacks are not currently supported via the ES6-style interface.

However, the more traditional CommonJS-style usage is still available, and documented below.
```

とあるように、notify機能（利用法は上のコードを参照）は、CommonJS方式でしか使えないからです。個人的には使い慣れたES6方式の方が好みなのですが、プロジェクトに一部でもnotify機能を使う可能性があるなら、プロジェクト全体をCommonJS方式で統一した方が良い・・・という主張にも合理性がありますね。

いずれにせよ、AngularJSの\$q、というよりPromiseに2つの方式があるということは、Javascriptを扱うプログラマなら頭の隅に置いておいた方が良さそうな知識ではないかと思います。知らないのは自分だけだった可能性もありますが・・・。
sedでタイムスタンプを整形する



下記の様なログを

```:before
2015-02-26 03:51:37 +0000 hogehoge
```

みたいにする必要があったので、`sed`で変換してみた。

```:after
2015-02-26T03:51:37+0000	hogehoge
```

結論から言うと、こんな感じで行けた。

```shell
$ sed "s/\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\) \([0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}\) \(\+[0-9]\{4\}\) /\1T\2\3\t/g"
```

注意したところ

- {}は`\`でエスケープしないといけない。
- ()でくくると、`\1`とか`\2`で内容を引用できる。　※数字は順番を表す
- ()も`\`でエスケープしないといけない。
【トリビア】Apache2のpidファイルが残ってしまっている場合の起動時の挙動

どうも通常はpidファイルを上書きしてそのまま起動するようです。

二つのほぼ同じ構成のApacheサーバーにおいて、SIGKILLしてしまいpidファイルが残っている状態で起動をかけると何故か動作が異なった。

サーバーAは
「httpd (pid 18) already running」
というエラーを出力して起動しなかった。

サーバーBは
「 pid file /usr/local/apache2/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run?」
という警告を出力してそのまま起動した。

ちゃんとSIGTERMすればいいだけなので調べる必要などなかったが、どうしても気になってしまいソースも読んでみたら
簡単な話で、既に同じPIDのプロセスが存在するかどうかで挙動が異なるということだった。
同じPIDのプロセスがいたら止まっておくことにするみたい。当たり前だけれど。
pidが残っていたら問答無用で起動しないアプリケーションが多いので、こういう分岐があることがちょっと予想外でした。
スターバックスは2フェーズコミットを使わない


http://ameblo.jp/ouobpo/entry-10070039150.html

> この記事は、Joel Spolsky編著の書籍『The Best Software Writing I』にも選ばれた記事です。非同期メッセージングが複雑に絡み合うエンタープライズ統合システムにおいて、2フェーズコミットによる厳密なトランザクション管理を行わずにシステムを設計する戦略を紹介しています。

- 原題：[Starbucks Does Not Use Two-Phase Commit](http://www.eaipatterns.com/ramblings/18_starbucks.html)
- 日本語訳：[スターバックスは2フェーズコミットを使わない](https://code.google.com/p/gregors-ramblings-ja/wiki/18_starbucks)
Meteor アップデート方法


Meteor の新しいバージョンがリリースされた時に。

## Meteor 最新版にアップデート


```bash
$ meteor update
```

## Meteor アプリを最新版にアップデート

Meteor アプリを最新のバージョンにアップデートする場合は、
そのディレクトリに移動してから `meteor update` を実行します。

```bash
$ cd <METEOR_APP_DIR>
$ meteor --version
Meteor 1.0.2.1

$ meteor update
Changes to your project's package version selections from updating the release:

accounts-password      upgraded from 1.0.5 to 1.0.6
autoupdate             upgraded from 1.1.4 to 1.1.5
...(以下省略)...

$ meteor --version
Meteor 1.0.3.2
```

## バージョンを指定してアップデート

`meteor update` コマンドの後ろに `--release` オプションをつけて、適用したいバージョン番号を続けて指定します。

例えば、バージョン番号 1.2.1 にアップデートしたい場合は以下のようになります。

```bash
$ meteor update --release 1.2.1
```

# 注意事項

アップデートによって動かなくなることもあるので、git 等でバージョン管理を行うか、バックアップを取ってから `meteor update` の実行をお勧めします。

# 参考ページ

* [Documentation - Meteor #meteorupdate](http://docs.meteor.com/#/full/meteorupdate)
Backbone-relationalメモ


# 使い方

## 逆参照時の取り扱い

`includeInJSON`の挙動をようやく把握したのでメモ（あんまり興味なかった）。こんな感じ。

```coffeescript
class AlbumModel extends Backbone.RelationalModel
  @
  
class PhotoModel extends Backbone.RelationalModel

  relations: [
    {
      # PhotoModelとAlbumModelの関係をが 1:N とする
      type: Backbone.HasOne
      relatedModel: AlbumModel
      
      # photoModel.get('album') でAlbumModelを取得
      key: 'album'
      
      # albumModelからどう見えるか
      reverseRelation:
        # albumModel.get('photos') としてPhotoModelを取得
        key: 'photos'
        # albumModel.get('photos') として取得した場合に含めるのはidのみ
        includeInJSON: ['id']
    }
  ]

# e.g.
album = new AlbumModel(id: 1)
album.fetch()

# snip
photos = album.get('photos')

photo = photos[0]
photo.attributes

###
{
  id: 123
}
###
```


# トラブルシュート
## 連携先のコレクションが常にBackbone.Collectionになる

例えばこんなふうに、2つのファイルに分かれている。

```coffee
class Photo extends Backbone.RelationalModel
  idAttribute: 'id'
  urlRoot: '/ajax/photos/'
  
class PhotoCollection extends Backbone.Collection
  model: Photo
```

```coffee:album.coffee
class Album extends Backbone.RelationalModel
  idAttribute: 'id'
  urlRoot: '/ajax/albums/'
  relations: [
    {
      type: Backbone.HasMany,
      key: 'photos',
      relatedModel: Photo,
      collectionType: PhotoCollection
    }
  ]
```

`Album`を初期化して`photos`を取り出すと、collectionが`Backbone.Collection`になった。

```coffee:view.coffee
album = new Album(id: 1)
collection = album.get('photos')  # これがBackbone.Collectionになる！
```

`album.coffee`内で`PhotoCollection`が参照できないため`Backbone.Collection`が返る。Collectionオブジェクトが返ってくるので一見普通に動いているように見えてしまうのがクセモノ。色々調べた結果、`album.coffee`で`photo.coffee`をrequireしていないのが原因だった。ショボイ。
OSX からサーバ上の GUI を叩く。の続き


先日の[アレ](http://qiita.com/bunzaemon/items/86122a38d24df5a5c7d7)の続き。

##Chrome

私は、*shrc は一枚に集約して、OS 毎の差分を書いて運用してる（といってもサーバーへは単に scp するだけだけれども）

別に mac の方では、md ってコマンドが無い状態でも良いのだけれど、 Text::Markdown が既に入ってたのを思いだす。
メインブラウザも Chrome だしってんで。

コレで動くか？

```shell-session:
$ open -a Google\ Chrome "data:text/html;base64,$(base64  <(perl -MText::Markdown=markdown  -0777ne 'print markdown($_)' readme.md ) )"
```
動かん、、、

```shell-session:
$ /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome "data:text/html;base64,$(base64  <(perl -MText::Markdown=markdown  -0777ne 'print markdown($_)' readme.md ) )"
```

動く。なんで？
（動くけど、環境により Chrome がエラーを吐いたり吐かなかったり。）

* 丸呑みじゃないと描画が崩れる。
* 日本語が入るだけで壊滅する。


恐らく使う事は無いんだろうけど、一応 *shrc に

```shell-session:.bashrc

function md() {
    case ${OSTYPE} in
        darwin*)
            /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome "data:text/html;base64,$(base64  <(perl -MText::Markdown=markdown  -0777ne 'print markdown($_)' $@ ) )"
            ;;
        *)
            firefox "data:text/html;base64,$(base64 -w 0 <( Markdown.pl $@ ) )"
            ;;
    esac
}
```

などと書いておく。

ちなみに Markdown.pl の方がオリジナルで、 Text::Markdown は、それのポートだそうで。



・・・なんて事をメモって保存しといたら、、、

## w3m


[ひょんな事](http://qiita.com/bunzaemon/items/0bcb1db967a75e6a47b4)から、 サーバ上に w3m がインストールされているのを発見。

え？
正直、心の中では複雑な感情が湧き出て来たものの、それはそれ。

で、先日のアレは、

```shell-session:
$ w3m "data:text/html;base64,$(base64 -w 0 <( Markdown.pl Markdown_1.0.1/License.text) )"
```
でもOK だと（ついでに `konqueror` でも）。

正直、コマンドラインで完結するなら、その方が良いのだけれど、Mac からサーバ上の w3m 叩くと、XQuarz が立ち上がるのが、なんともウザい、、、
同じウザいなら、炎のキツネで良いか。
CentOS 上で html ファイルクリックしたら、


昔懐し（現行愛用者の方スイマセン） Konqueror が立ち上がる様になってしまったらしい。
「どーにかしてくれ」
と言われて、「あんたの方が、CentOS 歴、長いだろーがよ」と思いながらも探す。

## デフォルトアプリケーションの変更方法
CentOS6.6 では、ファイルブラウザ上から、

```
ファイルを右クリック => プロパティ => Open With タブで変更
```

.html だろうと、.txt だろうと、拡張子があるものに関しては、これで変更出来る。

### ひとこと
メニューの Preference から？とか、コマンドラインから？とか思い、探しまわっちまったい。

そのお陰で、`w3m` が `/usr/bin` に入ってる事を発見し、電車の中で化粧直しをしてる女性を見かけた様な気分を味わっているのだが、、、


## 確認しました。

20150305 追記

ご指摘のあった `mimeapps.list` は CentOS6.6 の当該環境下では、`${HOME}/.local/share/applications/mimeapps.list`
として保存されていて、Konqueror の時は、

```shell-session:mimeapps.list
[Default Applications]
text/plain=gedit.desktop
text/html=kde4-kfmclient_html.desktop
```

なのが、 firefox 指定時には、

```shell-session:mimeapps.list
[Default Applications]
text/plain=gedit.desktop
text/html=preferred-web-browser.desktop
```

になりました。このファイルの直接の変更により、デフォルトアプリケーションが変更されるのも確認しました。

過去のバックアップには、`${HOME}/.local/share/applications/mimeapps.list` が存在しませんでしたので、今回の GUI 操作により初めて作成されたものと思われます。

コマンドラインから修正出来るのが確認出来て、すっきりしました。
wjn さん有難うございました。

以下、メモ

```shell-session:
$ grep html /usr/share/applications/defaults.list
text/html=mozilla-firefox.desktop
```

```shell-session:${HOME}/.local/share/applications
$ ls | grep preferred-web-browser
preferred-web-browser.desktop
$ grep firefox preferred-web-browser.desktop 
Exec=firefox %u
Icon=firefox
```
Python で Project Euler #16「べき乗の数字和」

[Problem 16 「べき乗の数字和」](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2016)

> $2^{15} = 32768$ であり, これの数字和 ( 各桁の和 ) は $3 + 2 + 7 + 6 + 8 = 26$ となる.
> 同様にして, $2^{1000}$ の数字和を求めよ.

```py:Python
# n = 15
n = 1000
result = sum(map(int, str(2 ** n)))

print result
print result == 1366
```

```:結果
1366
True
```
itamaeでrbenv+mysql環境構築

久しぶりにchefを触ろうと思ったらディレクトリの構成とか、これなんだっけ？ってなったのでitamae使ってみました。

# 環境

* CentOS6.5
* ruby1.9.3
* Mysql5.6

# Itamae準備

``` ruby:Gemfile
source 'https://rubygems.org'
gem 'itamae'
gem 'itamae-plugin-recipe-rtn_rbenv'
```

```
$ bundle install --path=vendor/bundle
```

# レシピ作成
rbenvは[itamae-plugin-recipe-rtn_rbenv](https://github.com/itamae-kitchen/itamae/blob/master/lib/itamae/resource/base.rb)を使用させていただきました。

mysqlは別recipe

```ruby:mysql_for65.rb
execute 'yum -y remove mysql*'

package 'http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm'

%w( mysql-community-server mysql-community-devel ).each do |pkg|
  package pkg
end

service 'mysqld' do
  action :start
end
```

実行用のrecipe

```ruby:default.rb

include_recipe 'rtn_rbenv::user'
include_recipe './mysql_for65.rb'

```

# nodeの準備

```node.json
{
    "rtn_rbenv": {
        "user": "vagrant",
        "versions": {
            "1.9.3-p484": ["bundler"]
        },
        "global": "1.9.3-p484"
    }
}
```

# 実行

```
$ bundle exec itamae ssh -j node.json -h hogehoge -p 22 -u fugafuga recipes/default.rb
```

これからこっち使おう!

# 参考サイト

* [itamae-kitchen/itamae](https://github.com/itamae-kitchen/itamae)
* [rutan/itamae-plugin-recipe-rtn_rbenv](rutan/itamae-plugin-recipe-rtn_rbenv)
ボタンの文字もウィンドウサイズに合わせてほしいゾ！

レイアウトをGridにしてボタンを押してスケールさせてやるぜニシシシシ…
とか考えてやってみたら、

**ボタン自体はスケールするのに文字サイズは変わらねぇんかい！！！１**

って感じになったのでアレコレやってみた結果、以下のコードで行けそう。

```csharp:MainWindow.xaml
<!-- Gridに突っ込んでる体です… -->
<Button Width="auto" Height="auto" Grid.Column="1">
    <Viewbox Stretch="Uniform">
         <Label Content="情報取得"/>	
    </Viewbox>				
</Button>
```

違ってたらご指摘ください...
AngularJS入門　あなたの名前は？


```
<!DOCTYPE html>
<html lang="ja" ng-app>
<head>
  <meta charset="utf-8">
  <title>AngularJS</title>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.3/angular.min.js"></script>
</head>
<body>
  <h1>AngularJS入門</h1>
  名前：<input type="text" ng-model="oyatsu">
  <br>
  好きなおやつは「{{oyatsu}}」ですね。
</body>
</html>
code
```
<html lang="ja" ng-app>
<head>
  <meta charset="utf-8">
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.3/angular.min.js"></script>
</head>
<body>
  <h1>AngularJS入門</h1>
  名前：<input type="text" ng-model="yourname">
  <br>
  あなたの名前は「{{yourname}}」ですね。
</body>
</html>

となります！
NSArrayやNSDictionaryを、SwiftのArrayやDictionaryと相互に変換する


# 背景

ちょっと調べないと分からなかったので。

# 変換方法

実はほぼそのままキャストできてしまう模様。

## Array

```swift:
// Array -> NSArray
var nsarr: NSArray = NSArray(array: ["A", "B", "C"])
println(nsarr)

// NSArray -> Array
var arr: [String] = nsarr as [String]
println(arr)
```

```output
(
    A,
    B,
    C
)
[A, B, C]
```

## Dictionary

```swift:
// Dictionary -> NSDictionary
var nsdic: NSDictionary = NSDictionary(dictionary: ["key1": "value1", "key2": "value2"])
println(nsdic)

// NSDictionary -> Dictionary
var dic: Dictionary = nsdic as Dictionary
println(dic)
```
```output
{
    key1 = value1;
    key2 = value2;
}
[key2: value2, key1: value1]
```

# おまけ: Array of Dictionary

```swift:
var sample: [Dictionary<String, AnyObject>] = [
    ["key1": "value1", "key2": "value2"],
    ["key3": "value3", "key4": "value4"]]

// Array of Dictionary -> NSArray of NSDictionary
var nsdicarr: NSArray = NSArray(array: sample)
println(nsdicarr)

// NSArray of NSDictionary -> Array of Dictionary
var dicarr: [Dictionary<String, AnyObject>] = nsdicarr as [Dictionary<String, AnyObject>]
println(dicarr)
```
```txt:output
(
        {
        key1 = value1;
        key2 = value2;
    },
        {
        key3 = value3;
        key4 = value4;
    }
)
[[key2: value2, key1: value1], [key4: value4, key3: value3]]
```

# 参考

Mac Developers blog — Convert NSMutableArray to Swift Array...
http://dev.eltima.com/post/96538497489/convert-nsmutablearray-to-swift-array
ビットコインのブロックチェーン解析ツール まとめ

以下に移行しました<br><a href="http://block-chain.jp/tech/bitcoin-blockchain-analysis-tools/" title="ビットコインのブロックチェーン解析ツール まとめ">ビットコインのブロックチェーン解析ツール まとめ</a>
AWS IAM で複数の新規ユーザを同時に作成しグループに追加する(AWS SDK for Ruby)


AWSのマネージメントコンソールでは、IAMの新規ユーザの追加は一度に5ユーザずつしか登録することができず、40名(1クラスの学生数)やそれ以上のユーザを追加していくのは非常にめんどくさく退屈な作業となります。

AWS SDK for Rubyを使って新規ユーザ登録を自動化し、楽ができると素敵です。


# 初めてのAWS SDK for Ruby

AWS SDK for Rubyを初めて使う人(私も含む)は、下記の公式のドキュメントを参照して、~~AWS SDK for Rubyのインストール~~(下記のbundle installでインストールされますね)、アクセスキーの設定(~/.aws/credentials)を行いましょう。

* [AWS SDK for Ruby](http://aws.amazon.com/jp/sdkforruby/)
* [AWS SDK for Ruby のご利用開始にあたって](http://aws.amazon.com/jp/developers/getting-started/ruby/)

# では、はじめましょう

とりあえず、適当なディレクトリを作成しそのディレクトリ下にこれから示す3つのファイル user_password_group.csv, Gemfile, addusers.rbを作成しましょう。

## user_password_group.csv

新規に追加したいIAMユーザのユーザ名とパスワード、ユーザを追加するIAMグループを記述した、CSVファイル `user_password_group.csv`を準備します。

```user_password_group.csv
test_user_01,kG3MnDlx,testGroup
test_user_02,pGw4B40Z,testGroup
test_user_03,QQa57hFd,testGroup
```

各ユーザを追加するIAMグループ(ここではtestGroup)はあらかじめ作成しておきましょう。

## Gemfile

Gemfileは https://github.com/awslabs/aws-ruby-sample/blob/master/Gemfile を参考にしました。

```ruby:Gemfile
source 'https://rubygems.org'
gem 'aws-sdk', '~> 2.0.22'
```

bundle install して必要なGemをインストールしておきましょう。ここでAWS SDK for Rubyもインストールされるはずです。

```
$ bundle install
...
Bundle Complete! ...
```

## addusers.rb

本体の addusers.rb はAPIドキュメント[Aws::IAM::User](http://docs.aws.amazon.com/sdkforruby/api/Aws/IAM/User.html) を矯めつ眇めついろいろと試行錯誤して次のようになりました。

```addusers.rb
require 'rubygems'
require 'bundler/setup'
require 'aws-sdk'
require 'csv'

users = []
CSV.foreach("user_password_group.csv") do |row|
  users.push({user_name: row[0], password: row[1], group_name: row[2]})
end

users.each do |user| 
  iam_user = Aws::IAM::User.new(user[:user_name])
  iam_user.create
  iam_user.create_login_profile({password: user[:password]})
  iam_user.add_group({group_name: user[:group_name]})
end
```

# では、実行へ

早速実行しましょう。

```
$ ruby addusers.rb
/home/...../aws-sdk-core/plugins/regional_endpoint.rb:30:in `after_initialize': missing region; use :region option or export region name to ENV['AWS_REGION'](Aws::Errors::MissingRegionError)
... 
```

むぅ、怒られてしまいました。region optionの設定が必要だったみたいです。ここは、環境変数 AWS_REGIONを設定することで乗り切りましょう。

```
$ export AWS_REGION='ap-northeast-1'
```

もう一回実行。


```
$ ruby addusers.rb
$
```
今度は無事実行できたようです。

# 実行結果

AWSマネージメントコンソールのIAM > GroupsのページでtestGroupsを選択すると、確かにuser_password_group.csvで記述した、3ユーザが登録されているのがわかります。

![aws_iam_addusers.png](https://qiita-image-store.s3.amazonaws.com/0/25656/22ac295e-86d5-58a8-3f69-2ce8579fce55.png)

# 最後に

なにぶん初めて AWS SDK (for Ruby)を触ったので、ここでやった方法が適切なのかはよくわかりません。もっと簡単な方法があるよ、ここはちょっとまずいのでは、などありましたらコメントでご教授いただけると幸いです。

ソースコードはこちら。

* https://github.com/rikitoro/addusers

# 参考リンク

* [AWS SDK for Ruby](http://aws.amazon.com/jp/sdkforruby/)
* [AWS SDK for Ruby のご利用開始にあたって](http://aws.amazon.com/jp/developers/getting-started/ruby/)
* [AWS SDK for Ruby APIドキュメント](http://docs.aws.amazon.com/sdkforruby/api/)
AmazonLinuxのホスト名を変更するには


別にEC2限定ではないが。

1.hostnameを設定

```BASH
sudo hostname webserver.domain.com
```

2./etc/sysconfig/networkを変更

```/etc/sysconfig/network
HOSTNAME=webserver.domain.com
```

3./etc/hostsを変更

```/etc/hosts
127.0.0.1 webserver.domain.com webserver localhost localhost.localdomain
```

4./etc/profile.d/prompt.shを変更
**忘れがちなのがシェルプロンプトの [user@host ~]のhost部分**

```/etc/profile.d/prompt.sh
export NICKNAME=webserver
```

書き換えて、再ログインするなどで、以下のようになる

```bash
[ec2-user@webserver ~]$
```

# 参考
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-hostname.html
GWT用の<input type="range"/>クラスを作りました


## &lt;input type="range"/&gt;とは?

&lt;input type="range"/&gt;は下画像のような値を調整するスライダーみたいなものです。
![alt text](http://3dtech.jp/wiki/index.php?plugin=attach&refer=NPESDK_GWT&openfile=NPESDK_GWT_Range.png "Range image")

作成するウェブアプリ次第かも知れませんが、
ゲームや動画のボリューム調整とかに頻繁に使うUIではないでしょうか。

残念なことにGWTには標準でinputのrangeに対するクラスは提供されていません。
GWTはオープンソースプロジェクトなので

- 分からなかったらソースコードを見ろ！
- 存在しない機能は自分で実装しろ！

ということなのでしょう。

こういうところに不便を感じる方も多いのでしょうが、
私はJavaをHTML5+JavaScriptへ変換してくれるだけで十分満足しています。

今回は自作のRangeクラスの紹介と
input type=rangeのイベントハンドリングについて少々解説したいと思います。

## onchangeイベント

onchangeイベントは値の変更後(マウスボタンリリース時)に発行されます。

JavaScriptで書くとこんな感じでしょうか。

```js:onchange.js
var range = document.createElement("input");
range.setAttribute("type", "range");

range.onchange = function() {
    document.write(range.value);
};
```

自作したRangeクラスを使ってJavaで書くと以下のようになります。
onchangeイベントはGWT標準のChangeEvent, ChangeHandlerでハンドリングできます。

```java:ChangeEvent
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import net.npe.gwt.user.client.ui.Range;

final Range range = new Range();

range.addChangeHandler(new ChangeHandler() {
    @Override
    public void onChange(ChangeEvent event) {
        System.out.println("onChange:"+range.getValue());
    }
});
```

## oninputイベント

oninputイベントは値変更中に発行されるイベントです。
ボリューム調整などはこちらのイベントを利用するべきでしょう。

oninputイベントをJavaScriptで書くとこのようになります。

```js:oninput.js
var range = document.createElement("input");
range.setAttribute("type", "range");

range.oninput = function() {
    document.write(range.value);
};
```

残念なことにGWTではoninputに対するクラスやインターフェースが提供されていません。
自作したInputEvent, InputHandlerでoninputイベントをハンドリングします。

```java:InputEvent
import net.npe.gwt.event.dom.client.InputEvent;
import net.npe.gwt.event.dom.client.InputHandler;
import net.npe.gwt.user.client.ui.Range;

final Range range = new Range();

range.addInputHandler(new InputHandler() {
    @Override
    public void onInput(InputEvent event) {
        System.out.println("onInput:"+range.getValue());
    }
});
```

## 使い方

http://npedotnet.github.io/archives/npesdk-gwt-1.0.jar

をダウンロードしてプロジェクトへ追加し、.gwt.xmlに下の行を追加してください。

```xml
<inherits name='net.npe.gwt'/>
```

詳細な解説が必要な方はこちらをご覧ください。
http://3dtech.jp/wiki/index.php?NPESDK_GWT

GitHubでソースコードを公開しています。:octocat: 
https://github.com/npedotnet/NPESDK_GWT

オンラインデモページも作りました。
onchangeとoninputの違いも分かると思います。
http://npe-net.appspot.com/npesdk/gwt/demo/index.html

![alt text](http://3dtech.jp/wiki/index.php?plugin=attach&refer=NPESDK_GWT&openfile=NPESDK_GWT_DEMO.png "NPESDK_GWT")

それでは楽しいGWTライフを！ :shipit:
ChefDKハンズオン Debianの環境設定


[ChefDKハンズオン](http://qiita.com/eielh/items/adb173ffcd6389c12e36)をLinuxの環境を確認していなかったので、Debianで確認しました。

backports-debian-7wheezyをつかった場合の例です。

環境設定方法

```
$ uname -v
#1 SMP Debian 3.16.7-ckt4-3~bpo70+1 (2015-02-12)
$ sudo aptitude update
$ sudo aptitude -y install git curl vim
$ curl -sSL https://get.docker.com/ | sh
$ sudo groupadd docker
$ sudo gpasswd -a ${USER} docker
$ curl -O https://opscode-omnibus-packages.s3.amazonaws.com/debian/6/x86_64/chefdk_0.4.0-1_amd64.deb
$ sudo dpkg -i chefdk_0.4.0-1_amd64.deb
$ sudo service docker restart
```

editorはvimにしておきました。
dockerをsudoなしで使えるようにしています。一度ログアウトして再度ログインすればChefDKハンズオンができると思います。

以下は必要に応じて。

```
$ git config --global user.email "you@example.com"
$ git config --global user.name "Your Name"
```


# 参考文献

https://docs.docker.com/v1.5/installation/debian/#debian-wheezystable-7x-64-bit
ifとunlessの使い分け

ifとunlessってどう使い分けてますか？
「個人的な好みの問題だろ」とか「unlessはキモい」とか「if notの立場はどうなるのか」とか「規約でうちでは禁止してます」とか色いろあると思います。
その辺は置いておくとして、例えばこんなケースだったらどっちでも良さそうに見えますよね。

```rb
def create_foo(name)
  return unless name.present? # 名前が入ってなかったらreturn
  Foo.create name: name
end

def create_foo(name)
  return if name.blank? # 名前が空だったらreturn
  Foo.create name: name
end
```

では次のケースではどうでしょうか？

```rb
def create_foo(name)
  return unless name.present?
  return unless name.length.in? 2..64
  Foo.create name: name
end

def create_foo(name)
  return if name.blank?
  return if name.length < 2 || name.ength > 64
  Foo.create name: name
end
```

fooのcreate条件はどちらが分かりやすいでしょうか？
僕は断然上だと思います。
上の書き方ならこんな風に流れるように読めます。

```rb
def create_foo(name)
  return unless name.present?         # 名前が入っており、
  return unless name.length.in? 2..64 # 2文字以上64文字以内なら
  Foo.create name: name               # Fooを作成する
end
```

## 常に正常系の条件を

```rb
return if 異常系の条件
正常処理
```

上のようにガード節に``if 異常系の条件``とすると「どういう時にダメなのか？」は分かるけれど、「どんな時に正常なのか？」は条件を反転させる必要があるので分かりづらいです。
「異常じゃなければ正常だろう」で問題が解決するケースは稀です。

```rb
return unless 正常系の条件
正常処理
```

逆に、上のようにガード節にunlessを使うと「どんな時に正常なのか？」が分かりやすくなります。
「どういう時にダメなのか？」は分かりづらくなるように見えますが、「正常じゃなかったらダメ」という事は分かります。
なので「正常じゃないってどんな状態？」まで追う必要がなければこれで十分です。

## 正常じゃない条件を作るのは難しい

``name.present?``が正常系の条件なら``name.blank?``が正常じゃない条件、つまり補集合の条件になることを理解するのはそんなに難しく無いと思います。
ですが``num.in? [1, 2, 3]``の補集合の条件はなんでしょうか？ 
``num < 1 || num > 3``ですか？ 
nilは？
1.5は？

わざわざ難しい条件を見つけ出すより``unless 正常系の条件``を使った方が分かりやすくミスも減るのではないでしょうか。

## ブールを返すメソッドは肯定形が良い

リーダブルコード 3.6

> それから、名前を否定形にするのは避けたほうがいい。例えば
>   bool disable_ssl = false;
> ではなく、肯定形にしたほうが声に出して読みやすい(それに短くて済む)
>   bool use_ssl = true;

コードコンプリート 11.2.4

> 肯定的なブール変数名を使用する
> notFound, notdone, notSuccessfulといった否定的な名前は、否定された時の意味がわかりにくい

というわけでifもunlessも渡す条件は正常系を基本として、特にガード節はunlessを使うと読みやすいなーと感じています。
mousewheelイベントを使用してブロック要素のマウススクロールを有効化する



e.preventDefault()でマウススクロールイベントが無効になってしまったので、以下で対処した。


### hogeというブロック要素のスクロールを有効に。

```javascript:
//マウススクロールイベント
var scrollPosition = 0;
$('#hoge').on('mousewheel', function(e) {
  //マウススクロールした回転量を取得
  var delta = e.originalEvent.deltaY ? -(e.originalEvent.deltaY) : e.originalEvent.wheelDelta ? e.originalEvent.wheelDelta : -(e.originalEvent.detail);
  //対象要素の非表示領域を含めた縦幅を取得
  height = $('#hoge').get(0).scrollHeight;
  scrollPosition = scrollPosition-delta;
  if (scrollPosition < 0) {
    scrollPosition = 0
  }
  if (scrollPosition > height) {
    scrollPosition = height;
  };
  $('#hoge').scrollTop(scrollPosition);
});
Vue.jsで固定ヘッダ、トップへスクロールボタン

jQueryなるべく使いたくないですね。Vue.jsでなんとかしましょう。

[DEMO](http://embed.plnkr.co/1XPFqJ/)

#スクロールイベントを取る

mounted内に仕込みます。

```js
document.onscroll = (e) => {
  this.position = document.documentElement.scrollTop || document.body.scrollTop;
}
```

これで、html側に、position変数を使った条件分岐を直接入れることが出来ます。

#アニメーションヘッダ

v-bind:classを使って、クラスをトグルします。
下記のように書くと、positionが0以上の時に、stickyクラスが付加されます。

```html
<header class="header" :class="{'sticky': position > 0}">
タイトル
</header>
```

あとは、CSS側でアニメーション設定を行えば、スクロールでアニメーションするヘッダが作れます。

#トップへスクロールボタン

こちらも同様です。500px以上スクロールした時に表示されるようにします。
v-transitionを設定することで、.toTop.v-enterクラスが生成時に付加され、トランジションが終わった時に外れます。

//TODO v-transitionをvue 2.x～の記述に修正

```html
<div class="toTop" v-show="position > 500" v-on="click: toTop()" v-transition>
  Jump To Top
</div>
```

スムーススクロールに関しては、仕方なくjQueryを使用しています。

#jQueryの代わりにVue.jsは使えるのか？

jQuery + jQuery Pluginでもできることですが、動きはCSSに、条件はHTML側に書くことで、ほとんどjsを書くことなく実現できます。
View側にロジックが入るのはあまり推奨されませんが、コード量削減の利点はそれ以上に大きいです。

Reactが大きく取り上げられていますが、個人的には、jQueryを使っていた領域でVue.jsを採用し、それより大規模開発でReactを使っていくのがいいのかな、と考えています。
MacでAndroidネイティブ開発環境構築

**MacBook Air + Eclipse + Android SDK による開発環境の構築手順です。一番クラシックな手法での開発環境になります。他の選択肢としては「Eclipse ADTバンドル版」や、Eclipse不要の「Android Studio」を用いた開発方法もあります。**


## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg)１）JDK7 インストール
▼ここからDL
http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
⇒Mac OS X x64　185.86 MB　jdk-XXXX-macosx-x64.dmg

ダウンロードしたら、dmgファイルをダブルクリックしてインストーラーを実行します。

## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg)２）Eclipse インストール
▼ここからDL
http://www.eclipse.org/downloads/
⇒Eclipse IDE for Java EE Developers「Mac OS X 64 Bit」

ターミナル起動後、解凍と移動

```
$ cd ~/Downloads
$ tar zxfv eclipse-jee-luna-SR1a-macosx-cocoa-x86_64.tar.gz
$ mv eclipse ~/Applications/
```

## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg)３）Android SDK インストール
▼ここからDL
http://developer.android.com/sdk/index.html#Other
⇒Other Download Options
　└ SDK Tools Only
　　 └ Mac OS X　android-sdk_rXXXX-macosx.zip

ターミナル起動後、解凍と移動

```
$ cd ~/Downloads
$ unzip android-sdk_r24.0.2-macosx.zip
$ mv android-sdk-macosx ~/Applications/
```

## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg)４）パッケージのインストール

ターミナル起動後、パッケージインストーラーを起動

```
$ ~/Applications/android-sdk-macosx/tools/android
```

適宜、必要なものをインストール。


## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg)５）ADT Plugin インストール

Finderで ``~/Applications/`` フォルダを開き、Eclipseを起動する。
Eclipse起動時、普通にクリックすると「開発元が未確認」エラーが出るので、「controlキー＋クリック ⇒ 開く」。

メニューバー ＞ Help ＞ Install New Software...

[Add]ボタン押した後、以下を入力して[OK]ボタン。

```
名前　　　　：ADT Plugin
ロケーション：https://dl-ssl.google.com/android/eclipse
```

あとは成り行きで・・・

SDKロケーションの設定を求められたら、 ``~/Applications/android-sdk-macosx`` と入力。


## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg)６）Android開発フォルダにパスを通す

設定ファイルを開いてパスを２つ記述。

```
vi ~/.bash_profile
───────────
export ANDROID_HOME=$HOME/Applications/android-sdk-macosx
export PATH=${PATH}:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools
```

反映する

```
source ~/.bash_profile
```


ハローワールド的なやつは近日記載予定 m(_ _)m


## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg)参考URL

▼Mac OS X 上に Android 開発環境を構築する
http://kzy52.com/entry/2014/11/08/220810

▼Android環境構築(Mac版)
http://techfun.cc/android/mac-android.html
【TreeTagger】TreeTagger入門

## TreeTaggerとは？
英語用の形態素解析ツール。（フランス語、ドイツ語も対応しているらしい。）
日本語の形態素解析はmecabが有名。

## インストール
自分はCentOSにインストールした。

###1.[TreeTaggerのサイト](http://www.cis.uni-muenchen.de/~schmid/tools/TreeTagger/)から、4ファイルをダウンロードして適当なディレクトリに置く。展開はしなくて良い。

* Download the tagger package for your system
※自分の環境にあったパッケージファイル。
linuxなので、tree-tagger-linux-3.2.tar.gz。

* Download the tagging scripts into the same directory.
tagger-scripts.tar.gz

* Download the installation script install-tagger.sh
※インストールのためのシェルスクリプト
install-tagger.sh

* Download the parameter files for the languages you want to process.
※形態素解析したい言語のパラメータファイル。
英語用にenglish-par-linux-3.2-utf8.bin.gz

###2.インストール用のシェルスクリプト実行

```bash
install-tagger.sh 
```

### 3.動作確認
以下を実行して品詞解析の結果が出力されるか確認。

```bash
echo “A quick brown fox jumps over the lazy black dog.” | cmd/tree-tagger-english
```

これでインストール完了！

##使い方
cmd/tree-tagger-englishにパイプで解析したい文書を渡す。

```bash
cat file.txt | cmd/tree-tagger-english
```

##その他
解析結果の品詞については[品詞の一覧](http://taichino.com/engineer-life/linux/365#more-365)を参照。


インストールの参考
http://d.hatena.ne.jp/rkmt/20140114/1389687306
http://otani0083.hatenablog.com/entry/2013/10/01/195037
【Gulp】gulp-s3-uploadプラグインで静的コンテンツをAmazon S3へ転送する

#概要

フロントエンドのタスクランナーであるgulpの「gulp-s3-upload」プラグインを使い、フォルダへのファイル追加を監視して、Amazon S3にリソースを自動転送します。
単純に静的リソースを動的コンテンツと切り離して、全てAmazon S3に格納しようという魂胆で試しました。
ここではやってませんが、抱き合わせでクライアントPCでGulpで画像の最適化タスクを実施するのが理想だと思います。


#準備・必要なもの

・AWSアカウント
・Amazon S3バケット（バケット名）
・Amazon S3を操作できる権限を持ったIAMアカウント
（IAMアカウントのキーとシークレットキー）

※バケットとIAMアカウントの設定方法は割愛します

###gulp諸々の準備


プロジェクトの作業ディレクトリに移動してお決まりのコマンド

```ruby:

npm init

```

続いてgulpをインストール

```ruby:

npm install gulp --save-dev

```

####プラグインのインストール

「gulp-s3-upload」というプラグインと、フィイル更新監視用に「gulp-watch」プラグインをインストールします。

・[gulp-s3-upload](https://www.npmjs.com/package/gulp-s3-upload)
・[gulp-watch](https://www.npmjs.com/package/gulp-watch)

```ruby:

npm install --save-dev gulp-s3-upload gulp-watch

```


#ファイル構成

![スクリーンショット 2015-03-04 14.43.19.png](https://qiita-image-store.s3.amazonaws.com/0/67591/8f6c91b1-dfab-cd54-23f3-4fef8329084a.png)

このサンプルでは「resource」に追加されたファイルをuploadさせます。


#glupタスクを作る


```ruby:glupfile.js

var gulp = require('gulp');
var s3 = require('gulp-s3-upload')({
  /*IAMアカウントのキーとシークレットキー*/
  accessKeyId:"********",
  secretAccessKey:"******************"
});

gulp.task("upload", function() {
  gulp.src("./resource/**")
    .pipe(s3({
      /*バケット名*/
      Bucket:'******',
      ACL:'public-read'
    }))
  ;
});

gulp.task('watch', function(){
  gulp.watch('./resource/**',['upload']);
});

```

#実行

```ruby:

gulp watch

```
画像を「resource」フォルダに追加すると

![スクリーンショット 2015-03-04 17.12.21.png](https://qiita-image-store.s3.amazonaws.com/0/67591/08b835d6-0121-6cd4-1a1c-9dd09f3758ff.png)

バケットの中を確認

![スクリーンショット 2015-03-04 17.12.49.png](https://qiita-image-store.s3.amazonaws.com/0/67591/20ddbc58-d091-c75a-08a9-16502a867fbe.png)

以上です。
Google Apps ScriptでGmailの操作

気づいたことをメモしていく
# 参考
- [Gmail Service - Apps Script — Google Developers](https://developers.google.com/apps-script/reference/gmail/)

# スクリプト例
## 受信箱のメール検索
- 受信箱から指定された文字列をタイトルに含むメールを検索し、最終受信日時と一緒にログに出力

```js
function search() {
  var searchString = "探したいメール";
  var threads = GmailApp.getInboxThreads();
  for (var i = 0; i < threads.length; i++) {
    var subject = threads[i].getFirstMessageSubject();
    if( subject.indexOf(searchString ) == -1 ){
      continue;
    }
    var lastDateStr = Utilities.formatDate( threads[i].getLastMessageDate(), "Asia/Tokyo", "yyyy/MM/dd HH:mm:ss" );
    Logger.log(subject + "," + lastDateStr);
  }
}

```
URLを開く（ブラウザ連携）もっとも簡単な方法 [v3.3〜]

今まで共通ヘッダのネイティブコードを書いていましたが、
v3.3からは標準で組み込まれたのでこんなに簡単になっていました。

```cpp
Application::getInstance()->openURL("http://qiita.com");
````

一行。準備するファイルなどもなし。
今までの苦労は忘れましょう・・・ｗ
【備忘録】Sublime Text2をMacのターミナルから起動する


```sh
$ sudo ln -s /Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl /usr/bin/subl
```

自分の場合はこうでした。
要するにリンク先を``""``で囲う必要がなかった。んー。(スペースをエスケープしているから、とのことです。コメント欄参照　@hirokishirai さん、ありがとうございます)  

何回もやり直したのでw　メモしときます。

起動  

```bash
$ subl
```

ファイル名指定して起動

```bash
$ subl file_name
```

ファイルを新しいウィンドウで起動

```bash
$ subl -n file_name
```

カレントディレクトリをtree表示で起動

```bash
$ subl .
```



参考：

http://www.sublimetext.com/docs/2/osx_command_line.html

http://qiita.com/hirokishirai/items/6b008623d1ea05b4d92e
capistrano3とaws-sdk v2を組み合わせるとDefinitionErrorにハマった話

コメントより追記
2015/9月現在、aws-sdk (2.1.23)が本文書の問題に対応しているそうです。

***
capistrano3のスクリプト中でaws-sdk v2を使うと以下のようなエラーが起きてハマったのでメモしておきます。

```
Aws::Resources::Errors::DefinitionError: unable to define method Aws::EC2::DhcpOptions#delete, method already exists
```

## 発生状況
Capfileの末尾にrequire "aws-sdk"を書いて、deploy.rb内でAws::EC2::Resource.newしたら発生。

## 原因
どうもaws-sdk-resources-2.0.28/lib/aws-sdk-resources/operation_methods.rb:72でdefine_methodしている箇所との食い合わせが悪い様子。deleteメソッドを定義しようとしたらすでに定義されててダメーという感じ。

```operation_methods.rb
 68       def safe_define_method(method_name, &block)
 69         if instance_methods.include?(method_name.to_sym)
 70           msg = "unable to define method #{name}##{method_name}, "
 71           msg << "method already exists"
 72           raise Errors::DefinitionError, msg
 73         else
 74           define_method(method_name, &block)
 75         end
 76       end
```

ancestorsを見てみると、`capistrano/setup` とか `capistrano/deploy` をrequireした時点で余計なクラスが挟まっている。このせいで、未定義のはずのメソッドが参照できてしまい、エラーになっている模様。

```
# 正常に動くケースのancestors
[Aws::EC2::DhcpOptions, Aws::Resources::Resource, Object, JSON::Ext::Generator::GeneratorMethods::Object, Kernel, BasicObject]

# エラーになるケースのancestors
[Aws::EC2::DhcpOptions, Aws::Resources::Resource, Object, JSON::Ext::Generator::GeneratorMethods::Object, Capistrano::DSL, Capistrano::DSL::Stages, Capistrano::DSL::Paths, Capistrano::DSL::Env, Capistrano::TaskEnhancements, Kernel, BasicObject]
```

## 対策
`capistrano/*`をrequireする前にsafe_define_methodを通してしまえ！という乱暴な方法しか思いつかなかった。とりあえず期待通り動いた感じがするけど、良い対応の仕方ではない・・・。より良いアイデアあれば教えていただけると幸いです。

```Capfile
# aws-sdkを先にrequireしてsafe_define_methodを通してしまうおまじない
require 'aws-sdk'
Aws::EC2::Resource

# Load DSL and set up stages
require 'capistrano/setup'

# Include default deployment tasks
require 'capistrano/deploy'
...
...
```
FactoryGirlでモデルを複数生成するときに便利なやつ


## FactoryGirl.create

テスト内で保存されたモデルが必要な場合、以下のように書く

```ruby
let!(:product) do
  FactoryGirl.create(:product)
end
```

で複数必要な場合はこんな感じに書いてたんですが、これやめたほうがいいです

```ruby
let!(:products) do
  2.times{ FactoryGirl.create(:product) }
end
```

何故かというとarrayの順序と、DBから取得した時の順序が保証されないんですよね。

```ruby
let!(:products) do
  2.times{ FactoryGirl.create(:product) }
end

it 'should equal' do
  expect(products).to eq(Product.all) # これはテストを実行する度に順序が変わる可能性がある
end
```

じゃあ順序を保証するためにどうするのか？

一瞬、```sleep```…？と頭によぎりましたがこれもやめましょう

## FactoryGirl.create_list

あるよね。そりゃあるよね。

```ruby
let!(:products) do
  FactoryGirl.create_list(:product, 2)
end

it 'should equal' do
  expect(products).to eq(Product.all)
end
```

サクセス！
MacにRuby 2.2.1のインストールする方法

# Homebrewをインストール
```bash
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
```bash
brew -v
# Homebrew 0.9.5
```

# rbenv、ruby-buildをインストール
```bash
brew install rbenv
brew install ruby-build
```
```bash
rbenv -v
# rbenv 0.4.0
```

# bash_profileに追記
```bash
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi' >> ~/.bash_profile
source ~/.bash_profile
```

# Ruby 2.2.1をインストール（ちょっと長い）
```bash
rbenv install 2.2.1
```

# Rubyのバージョンを2.2.1にセット
```bash
rbenv rehash
rbenv global 2.2.1
```
```bash
ruby -v
# ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-darwin14]
```
Gitリファレンス独書

Git 2.3.0 のマニュアルを上から読んでいる。気になったオプションを書いていく。

## [git-init](http://git-scm.com/docs/git-init)

### --separate-git-dir

.gitとワーキングツリーを分けることができる。[直下に.gitを置きたくない共有ドキュメントの管理](http://d.hatena.ne.jp/pneumaster/20130919/1379599127)とか[Dropboxみたいにツールでsyncしちゃうので.gitを置きたくない場合](http://uu59.blog103.fc2.com/blog-entry-9.html)のような利用例があるようだ。
.git/configのcore.worktreeで設定できる。

### --shared

デフォルト=trueだとGroupも書き込める(664とか)ので、それを変更するオプション。falseだとユーザのみ書き込める(umask=022)。all/0xxx(umask)も指定できる。
設定で言うとcore.sharedRepository。

## [git-clone](http://git-scm.com/doocs/git-clone)

### --local/-l

ローカルリポジトリでcloneするときに可能ならハードリンクを使用する。ディスクをケチるオプション。
逆に--no-hardlinksを指定すると強制的にコピーする。バックアップ用途などに使うらしい。

### --reference \<repository>

参照用のローカルリポジトリを設定することでネットワークを渡ってくるデータ量を減らすらしい。可能ならハードリンクを使う。ハードリンクしたくないときは--dissociateを指定する。CI回したり頻繁にリリースする場合に使えそう？
他にもネットワーク利用をケチるオプションは結構多い。--depthでのシャローコピー、--single-branchで指定したブランチだけコピってくるとか。

### --origin \<name>/-o \<name>

remoteの名前にoriginを使いたくない時に指定。master以外をcheckoutしたいときは--branch \<name>/-b \<name>を使う。

## [git-add](http://git-scm.com/docs/git-add)

### -i

インタラクティブモードになるけど…使いやすいの…？間違ったコマンドをいれるとHuh?って言われてイラッとする。

### -p

[コミットをファイルより細かい単位に更に分割](http://qiita.com/crifff/items/1abf08bca4ce51db4775)できるらしい。しかしインタラクティブつらい。

## [git-status](http://git-scm.com/docs/git-status)

### --ignored

gitignoreで無視されたファイルを表示。.gitignoreを変更したあとの確認とかに使えそう。

### -uno

リポジトリに追加していないファイルを表示しない。デフォルトは-uall。-unormalもあるけどallとの違いがわからない。

### -n/--dry-run

実際には実行しない。たまに必要。

## [git-commit](http://git-scm.com/docs/git-commit)

### -a

更新と削除を自動的にaddしてコミットする。今までgit add -uしてgit commit -mしてたけど、このオプションでいいじゃんと思った。

### -S\[\<keyid>] / --gpg-sign\[=\<keyid>]

GnuPGでコミットに対して署名できる。堅めのオープンソースプロジェクトだと使うみたい。Linux Kernelとか。[準備が結構めんど]((https://www.insaneworks.co.jp/kota/git%E3%81%A7%E7%BD%B2%E5%90%8D%E4%BB%98%E3%81%8Dcommits%E3%82%84tag%E3%82%92%E4%BD%9C%E3%82%8B/))くさい。とりあえず[CentOSでgpg --gen-keyするのにrngdが欲しい](http://it.toolbox.com/blogs/lim/how-to-generate-enough-entropy-for-gpg-key-generation-process-on-fedora-linux-38022)という時点でしばしハマった。

## [git-reset](http://git-scm.com/docs/git-reset)

### -p

git add -p的にインタラクティブモードでハンク単位にリセットするかどうか指定できる。

## [git-branch](http://git-scm.com/docs/git-branch)

### -v/-vv/--verbose

コミットハッシュ、コミットログ、vvの場合はリモートブランチを出力。

### --list \<pattern>

ブランチ名をpatternでglobできる。


## [git-checkout](http://git-scm.com/docs/git-checkout)

### --orphan [new-branch]

空のブランチ、もしくはヒストリから切り離されたブランチを作れる。使いどころがわからないけど、site-specificなファイルを格納するとか？

## [git-stash](http://git-scm.com/docs/git-stash)

### show

-pでdiffが見れる。HEADとのdiffだと思う。

## [git-tag](http://git-scm.com/docs/git-tag)

## -a/--anotate, -s/--sign 

オプションなしだとコミットに名前をつけるだけ。-aでタグオブジェクト生成、-sでGPGサイン付き。（[Git bookに書いてあるとおり](http://git-scm.com/book/ja/v1/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%82%BF%E3%82%B0)だけど）

## [git-shortlog](http://git-scm.com/docs/git-shortlog)

### -s

コミット回数の合計が見れる。
【C#】winapiで電卓の数字を表示する

ボタンを配置してtestメソッドを実行すると電卓の数字が取得できる。


```
    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, StringBuilder lParam);

    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr GetWindow(IntPtr hWnd, int uCmd);

    private const int GW_HWNDNEXT = 2;
    private const int WM_GETTEXT = 0x000D;



 private void test()
    {
      IntPtr hWnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, null, "電卓");
      if (hWnd != null)
      {
        IntPtr hWndChild = FindWindowEx(hWnd, IntPtr.Zero, "CalcFrame", "");
        hWndChild = FindWindowEx(hWndChild, IntPtr.Zero, "#32770", "");
        hWndChild = FindWindowEx(hWndChild, IntPtr.Zero, "Static", "");
        hWndChild = GetWindow(hWndChild, GW_HWNDNEXT);
        hWndChild = GetWindow(hWndChild, GW_HWNDNEXT);
        StringBuilder sb = new StringBuilder(256);

        SendMessage(hWndChild, WM_GETTEXT, sb.Capacity, sb);

        MessageBox.Show(sb.ToString());
      }
    }

 private void button2_Click(object sender, EventArgs e)
    {
      test();


    }

```
参照：msdn 英語が苦手な場合は二つ開いてにらめっこする。
https://msdn.microsoft.com/ja-jp/library/cc364757.aspx
https://msdn.microsoft.com/en-us/library/ms633515(v=vs.85).aspx
.remove() と.empty()の違い

## ■違い
.remove()：指定したDOM要素自体を削除する。
.empty() ：指定したDOM要素の”子要素のみ”を削除する。


## ■失敗例
他の人が書いたコードで、ダイアログで表示させた要素の閉じるボタンをクリックしたときに、要素は”見た目的には”消えるのだけど、その裏側のボタンが押せなくなるバグが出ていた。

jsをよく見ると、要素を消す時に.empty()を使っていた。
.empty()だと見た目上消えていても、装飾されていないdivなどで見えない要素が残っていると裏側の要素の操作ができなくなったり、もう一度ダイアログ表示しようとすると無限に生成されたり、表示がおかしくなったりする。（もちろん使い方次第ですが。）

jqueryで要素を消す際は基本.remove() を使ったほうがすっきるすると思う。


## ■参考記事
「jQuery removeとemptyによるDOM要素削除方法の違い」
http://kojikoji75.hatenablog.com/entry/2014/05/20/214503
RubyMine で Heroku Postgres に接続する方法

開発時にはちょくちょくデータの中身を見たり書き換えたりしたいもの。
CUI の方が好きって方も多いと思いますが、私は GUI で閲覧・操作したいと思うタイプです。
MySQL を使っている時は MySQL Workbench を使っていたんですが、PostgreSQL の場合ははてどうしようと考え、せっかくなので RubyMine を使うことにしました。
データベースに接続する機能は以前からありましたが、今までは使ったことなかったんですよね。

## Heroku Postgres の接続文字列

Heroku Postgres は heroku 自らが提供するアドオンです。
実体は AWS EC2 上に存在しているため、これ単体を利用することも可能になっています（と聞きました）。
今回は普通にアドオンとして使用していますが、これに対してローカルから外部接続を行うことになります。
外部接続に必要なのは以下の情報です。

* Host
* Port
* Database
* User
* Password

この情報は Heroku Postgres のアドオン管理画面からでも、`heroku config` で得られるサーバ環境変数の `DATABASE_URL` に記載された接続文字列からでも取得できます。
接続文字列の場合は、以下の形式で記載されています。

```
postgres://(User):(Password)@(Host):(Port)/(Database)
```

## RubyMine に接続設定を行う

必要な情報が揃ったところで、RubyMine の設定を行いましょう。
おそらく初期状態では右端情報に「Database」という文字列が、いかにも畳まれていますという感じで横になって表示されていますので、これをクリックして展開します。
あるいは画面情報のメニューから、 `View -> Tool Windows -> Databse` と辿ってウィンドウを展開します。

Database ウィンドウを開いたら、ウィンドウ左上の `+` ボタンをクリック。
` + -> Data Source -> PostgreSQL` と選択して、PostgreSQL の接続設定画面を開きましょう。
デフォルトで「Database」タブが開いているので、先ほど確認した5つの情報を入力します。

入力を終えたら、「Advanced」タブを開きます。
設定値と思しき文字列が20個ほど並んでいますが、末尾の `<user defined>` に以下を入力しましょう。

* Name ... `sslmode`
* Value ... `require`

入力を終えたら、「Database」タブに戻ります。
「Test Connection」ボタンを押して、テスト接続が正常に行えることを確認しましょう。

テスト接続に成功したら、「OK」ボタンを押して設定を終えます。
Database ウィンドウに登録した Host名で Heroku Postgres のデータベースが表示されているはずです。
数十秒程度待つと同期が終わり、実際に中身を確認できるようになります。

## ローカルの PostgreSQL にも接続する

特に難しいことは何もありませんが、ついでですので言及しておきます。
こちらも Host, Port, Database, User, Password の5つの情報が必要です。
ローカル環境の場合、ポートはよほどのことが無い限りデフォルトの 5432 になっていると思います。
User や Password の設定を省略する方も多いので、実際のところ明示的に指定した覚えがあるのはデータベース名だけってことも多いでしょう。
この場合、Database タブで入力する内容は以下のようになります。

* Host ... `localhost`
* Port ... `5432（最初からこれになっています）`
* Database ... `設定しているデータベース名`
* User ... `（何も入力しない）`
* Password ... `（何も入力しない）`

Heroku Postgres で必要だった「Advanced」タブの設定は不要です。

RubyMine が若干のエラーメッセージを表示しますが、無視して構いません。
「Test Connection」ボタンを押し、 テスト接続を行ってみましょう。

## ちょっとした注意事項

データベースを扱う GUI ツールに共通することですが、データベースの変更内容は即座に反映されません。
テーブルの作成や削除などのスキーマレベルの変更（DDL 発行）は Database ウィンドウ上部のリロードボタンを、データの追加や更新、削除など CRUD 操作（DML 発行）はテーブル上部のリロードボタンを押し、同期を行ってください。

## RubyMine で快適に開発

IDE 上でデータベースの中身を逐次確認できると、開発がとても快適になります。
Rails Console のようなコマンドライン操作はそれはそれで必要になることも多いのですが、視覚的に見やすい状態でデータを閲覧できるのはとても分かりやすいので、RubyMine をお持ちの方はぜひ試してみてください。
MySQL Workbench と同じく、欲しいと思う以下の機能がストレス無く動きます。

* テーブル内容を表形式で表示（エクセルそのまんま）
* テーブル内容を視覚的に変更、削除可能（エクセルそのまんm
* カラム単位でソート順の変更（エクセr
* テーブル内容を表示しつつ、where 句を打ち込んで簡単に絞り込み可能
* テーブルなどのデータベースオブジェクトを視覚的に一覧表示
* テーブル内のカラム、キーの定義を視覚的に一覧表示
* DDL をデータベース単位、データベースオブジェクト単位で簡単に生成
* テーブルデータのエクスポートをCSVやTSV、INSERT文方式で行える（日本語も大丈夫）

個人的には SQL 文を打ち込める コンソール画面を複数開けないのが若干の不満ですが、シンプルで見やすく使いやすいので、さらに RubyMine が手放せなくなりました（ステマ）。
not running under UIUserInterfaceIdiomPadのエラーになる時


UIPopoverControllerを使ってみたところ、下記のエラーになりました。


>*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIPopoverController initWithContentViewController:] called when not running under UIUserInterfaceIdiomPad.'

プロジェクトの設定で、TARGETSツリーGeneralタブのDevicesに **Universal** を選択すると解消されました。IdiomPad=iPadなんですね。

![ef41fe316ef5fcc86d53aff66bb227b8.png](https://qiita-image-store.s3.amazonaws.com/0/28556/cf355f65-4b14-7e7b-5a04-4243d5d9ac7a.png "ef41fe316ef5fcc86d53aff66bb227b8.png")
（選択肢はiPhone、iPad、Universalがあります）

エラーはとりあえず解消されます。
しかしiPhone用に作っていたアプリの見た目が一気に変わっちゃいますね。。
【MySQL】MySQLデータバックアップ・復元方法


##データバックアップ

全てのデータの場合

```全てのデータの場合
$ mysqldump -u root -x --all-databases > dump.sql
```

特定のデータのみの場合

```特定のデータのみの場合
$ mysqldump -u root -p データベース名 > dump.sql
```

特定のテーブルを抽出する場合

```特定のテーブル
$ mysqldump -u ユーザー名 -p -t データベース名 テーブル1 テーブル2 ... > ダンプファイル名
```

##データの復元方法

全てのデータの場合

```全てのデータの場合
$ mysql -u root -p < dump.sql 
```

特定のデータのみの場合

```特定のデータのみの場合
$ mysql -u root -p データベース名 < dump.sql 
```



>参照）
 http://phpspot.net/php/pgmysqldump%E3%81%A7%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%EF%BC%86%E5%BE%A9%E5%85%83.html
 
 
##その他（復元の際にデータが重すぎたー！とかの場合）
データが重すぎる場合は、オプションで以下のような設定をしてあげると復元がうまくいく♪

128MまでOKだよ〜というオプションをつけてあげる

```128MまでOKだよ〜というオプションをつけてあげる
mysql --max_allowed_packet=128M -u root -p DB名 < SQLファイル名
```

構造のみをdumpしてあげる
```構造のみをdump
mysqldump -uUSER_NAME -pPASSWORD --no-data DB_NAME > FILE_NAME
```