OmniAICreator/Qiita-1.07M huggingface dataset:
Mavericks システム標準の壁紙のパス

Mac OS X Mavericks システム標準の壁紙の場所を調べたのでメモを残しておきます。

# ログイン画面の背景画像

```
/System/Library/Frameworks/AppKit.framework/Resources/NSTexturedFullScreenBackgroundColor.png
```

# デスクトップのデフォルト壁紙

```
/Library/Desktop Pictures/*.jpg
```



# 参考URL

* [OS Xのシステム標準の画像やアイコンはどこに入っている？｜Mac](http://weekly.ascii.jp/elem/000/000/164/164091/)
* [初めからMacで利用できる壁紙が入っているフォルダの場所 / Inforati](http://inforati.jp/apple/mac-tips-techniques/system-hints/where-is-the-location-of-mac-os-default-desktop-picture.html)
Appium入門(Android編)

#はじめに
Appiumの使い方が良くわからない人の為に、
とてもお手軽にAppiumを利用できる方法をまとめました。
慣れた人なら1時間かからずに使用感を確認することができるはずです。

#事前準備
* ここではWindowsを利用していますが、Macでも試せます
* [Appium](http://appium.io/)のダウンロードと解凍、できるひとはインストール
* Android SDKのダウンロードとインストール
    * Androidのエミュレーターのインストール(Genymotionがおすすめ)
* Rubyをインストール
* Gemを2個インストールしておく
    * [selenium-webdriver](https://rubygems.org/gems/selenium-webdriver)
    * [appium_lib](https://rubygems.org/gems/appium_lib)
* テスト用のapkファイルを何かダウンロードしておく
    * ここでは、[Appiumの公式チュートリアル](https://github.com/appium/sample-code/tree/master/sample-code/examples/ruby)に含まれているNotesアプリを利用します。
    * ttp://appium.s3.amazonaws.com/NotesList.apk
    * ([Sauce Labs](https://saucelabs.com/)提供なので、問題があった場合は別なアプリを探します)

↑この辺りのやり方は検索してみてください。
わかりやすいドキュメントが沢山ヒットします。

#手順
**Appiumを起動します**
GUIでもCUIでも、どちらでも可。
![AppiumGUI.png](https://qiita-image-store.s3.amazonaws.com/0/36320/6a16c76b-1cbd-4f97-ffa5-82878fa83094.png)
GUIを利用する場合、事前準備で解凍したAppiumフォルダ内のAppium.exeを立ち上げて、
右上のロケットアイコンをクリックすればOKです。(設定等いじる必要なし)

**Androidエミュレーターを起動します**
AVDを使っても良いのですが、Genymotionの方が圧倒的に動作が速く、安定しています。

**動作させます**

```ruby:test.rb
require 'selenium-webdriver'
require 'appium_lib'

opts = {caps: {deviceName: :android,
               platformName: :android,
               app: 'C:\appium_workspace\NotesList.apk', #apkのパス、自身の環境に合わせてください
               appActivity: 'NotesList'}}

driver = Appium::Driver.new(opts).start_driver

driver.find_element(:id, "com.example.android.notepad:id/menu_add").click
driver.find_element(:id, "com.example.android.notepad:id/note").send_keys("Appium")
driver.find_element(:id, "com.example.android.notepad:id/menu_save").click

driver.quit
```

上記コードの実行で、Androidエミュレーター上でメモ帳アプリが立ち上がり、
「Appium」と書かれたメモが保存されるはずです。

#解説
Appiumを利用することで、Webブラウザの自動操作とほぼ変わらない感覚で、
ネイティブアプリの自動操作が実行できます。

後はお好きなテストフレームワークと組み合わせて頂ければ、
ネイティブアプリの自動テストができてしまいます。

**appActivityの探り方**
AndroidManifest.xmlにactivityが記載されているので、そこから探してください。

**UI elementの探り方**
Android SDKのtoolsフォルダの中に、
hierarchyviewerやuiautomatorviewerという便利アイテムがあるので、
そちらを利用してみてください。
![UIAutomatorViewer.png](https://qiita-image-store.s3.amazonaws.com/0/36320/5ab09456-3a7c-6c65-92a6-ca86b6e80b25.png)
使い方は至極簡単で、Androidエミュレーター使用中に、Viewerでスクリーンショットを取ってみてください。
そうすると、上記画像の様にUIの解析ができます。
画像はUI Automator Viewerですが、Hierarchy Viewerでも、ほとんど同じことができます。
RequestSpecでJSONの中身を検証する

```rb
# RequestSpecでJSONの中身を検証
json = JSON.parse(response.body)
json.each do |data|
  keys = data.keys
  expect(keys).to match_array(['id', 'title', 'body'])
  expect(data['id']).to eq(1)
  expect(data['title']).to eq('タイトル')
end
```
C# 自然順で文字列をソートする

# そもそも自然順ってなに？

エクスプローラーのソートで数字部分を数値の大きさとして比較してくれるアレです。

![2014-08-27_131045.png](https://qiita-image-store.s3.amazonaws.com/0/52104/8fbb297f-ca18-424b-e793-f29478f60b7d.png)

名称としてこれが本当に正しいのか分からないんですけど、英語サイトでは Natural Sort なんて書いてあったりするのでたぶんそれの直訳なのかな？
もし上のファイルを単純にファイル名でソートすると以下のようになります。

* hoge1.txt
* hoge10.txt
* hoge15.txt
* hoge2.txt
* hoge3.txt

この結果を望むケースは少ないですよねー。
エクスプローラーさんは、なにげにお利口です。

# 私はニコ厨なのです(`・ω・´)

ニコニコ動画のゲーム実況を見るのが大好きで、夜中にふと寂しくなったときとか、人の声が聞きたくなったときに見ますｗ
部屋が無音だと寂しいから見もしないのにテレビ付けてる人っていますよね？
あれに近い感覚なのかなぁ。
実況動画は大抵ゲーム開始からエンディングまでに動画が３～１００本とかなり幅はありますが、長期のシリーズ物になることが多いんです。
完結までの投稿期間が２年以上になることも珍しくないので、投稿者さまが動画に付けるタイトルに揺れが生じます(´・ω・`)
数字が全角だったり半角だったり、タイトルとパートの番号の間に空白があったりなかったり様々です。

そうすると自前のツールで動画を一覧表示したときに綺麗に並んでくれないわけです(；´д｀)
そこで気の利いたライブラリがないか調べてみたんですけど、なさそうな感じだったので作っちゃいました。
比較する文字列同士の先頭から１文字ずつカレントカルチャで比較していって、数字に読める文字が見つかったら、数字に読めない文字が見つかるまでの固まりを一つの数値として評価するようにしています。

```csharp:自然順比較のオプションフラグ
[Flags()]
public enum NaturalComparerOptions
{
    /// <summary>アラビア数字。</summary>
    Number = 0x1,
    /// <summary>ASCIIローマ数字。</summary>
    RomanNumber = 0x2,
    /// <summary>日本語ローマ数字。</summary>
    JpRomanNumber = 0x4,
    /// <summary>日本語丸数字。</summary>
    CircleNumber = 0x8,
    /// <summary>日本語漢数字。</summary>
    KanjiNumber = 0x10,
    /// <summary>すべての数字。</summary>
    NumberAll = Number | RomanNumber | JpRomanNumber | CircleNumber | KanjiNumber,

    /// <summary>空白文字の存在を無視。</summary>
    IgnoreSpace = 0x10000,
    /// <summary>数字表現の違いを無視。</summary>
    IgnoreNumber = 0x20000,
    /// <summary>全角半角の違いを無視。</summary>
    IgnoreWide = 0x40000,
    /// <summary>大文字小文字の違いを無視。</summary>
    IgnoreCase = 0x80000,
    /// <summary>カタカナひらがなの違いを無視。</summary>
    IgnoreKana = 0x100000,
    /// <summary>すべての無視条件。</summary>
    IgnoreAll = IgnoreSpace | IgnoreNumber | IgnoreWide | IgnoreCase | IgnoreKana,

    /// <summary>既定の比較オプション。</summary>
    Default = NumberAll | IgnoreSpace | IgnoreNumber | IgnoreWide | IgnoreCase,
}
```

綺麗に実装できればよかったんですけど、私の実力不足でコードがかなり長くなってしまいました。
コアの比較処理が100行、クラス全体では1600行弱にもなります(；´д｀)
書いた時期が古く私の実力も今よりポンコツだったし、.NET2.0 前提なのも原因というのは言い訳です(ノ▽≦*)

# 試しにサンプルデータを自然順でソートしてみる

```csharp
static void Main()
{
    // これが正しい並び順
    string[] titles = new string[] {
        "FFⅩ実況 part1",
        "FF10実況 part2",
        "FF10実況part３",
        "FF１０実況 part４",
        "FF１０実況 part5",
        "FF１０実況part６",
        "FF１０実況 part7",
        "ＦＦ１０実況 part8",
        "FF１０実況 part9",
        "FF１０実況 part10",
        "FF１0実況 part11",
        "FF１０実況 part12前編",
        "FF１０実況 part12後編",
    };

    // 普通のソート
    Array.Sort(titles, StringComparer.CurrentCulture);

    // 自然順のソート
    Array.Sort(titles, new NaturalComparer());
}
```

普通のソートでは前編と後編もひっくり返っています。
コード的には 前＞後、上＞下 だったりするので、こういう並びになるんですね。
![2014-08-27_140526.png](https://qiita-image-store.s3.amazonaws.com/0/52104/1045fafb-faf6-c521-17f1-f9a25bcf0f17.png)

興味がある方は~~デバッグ~~触ってみてください。
[NaturalComparer.cs](https://github.com/tomochan154/toy-box/blob/master/NaturalComparer.cs)
[Linux]PhantomJSをインストールする

* PhantomJSをLunux(AmazonLinux)にインストールします
 * インストールと言ってもバイナリDLして配置するだけでした

### 環境
* 確認したのは AmazonLinux
 * 他のLinuxでもいけるんじゃないかと思います

### 手順
1. [こちら](http://phantomjs.org/download.html) から最新のものをDL(本記事記述時点(2014/08/27)の最新は1.9.7)
> $ cd ~/
> $ wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.7-linux-x86_64.tar.bz2

2. 解凍
> $ cd /usr/local/src/
> $ sudo tar jxf ~/phantomjs-1.9.7-linux-x86_64.tar.bz2 

3. 配置
> $ sudo ln -s phantomjs-1.9.7-linux-x86_64 phantomjs
> $ sudo ln -s /usr/local/src/phantomjs/bin/phantomjs /usr/local/bin/phantomjs

##### 確認
> $ phantomjs -v
> 1.9.7

#### 補足
* [公式](http://phantomjs.org/build.html) を見てビルドしようとしたらとんでもなく時間がかかってげんなりししてたら、実はバイナリが提供されてたというオチだった
 * githubからソースコードをcloneして、build.shを叩くも２時間経ってもまだ終わらなーいという状況
 * 環境はAWSのEC2、t1.small
 * 10時間以上かかったって人も http://devlup.com/javascript/setup-phantomjs-on-amazon-ec2-instance/4468/
iPhone::色を反転

iphoneで色を反転させて違う雰囲気を楽しむ。

▼設定
▼一般
▼アクセシビリティ
▼(一番下)ショートカット
ホームボタンを3回続けて押したときの挙動が設定できます。

項目
VoiceOver
色を反転
ズーム機能
スイッチコントロール
AssistiveTouch

当記事では、「色を反転」について書いておきます＾＾

いつもと違ったiPhoneを楽しめるかもしれません。
私もやってみてます。
Chef ディレクトリ構成を変えて使用ファイルの効率化

Chef により OS や OS のバージョン、ホスト名によってファイルを分別したいと思ったことありませんか？

* [Chef Documents - About Files](http://docs.getchef.com/essentials_cookbook_files.html)
* [Chef Documents - About Templates](http://docs.getchef.com/essentials_cookbook_templates.html)

上記に掲載されておりますが、割と知られていないかもと思いましたので、ご参考になれば。

## こういうことが出来る

| 使用リソース | ファイル配置場所 | 使用されるファイル |
|:----------:|:---------------|:-----------------|
| cookbook_file<br>remote_file | files/`centos-5.10`<br>files/`centos-6.5`<br>files/`default` | cook 対象サーバが CentOS 5.10 の場合 `ココ` のファイル<br>cook 対象サーバが CentOS 6.5 の場合 `ココ` のファイル<br>cook 対象サーバが上記 OS+Version 以外の場合 `ココ` のファイル |
| template | templates/`centos-5.10`<br>templates/`centos-6.5`<br>templates/`default` | cook 対象サーバが CentOS 5.10 の場合 `ココ` のファイル<br>cook 対象サーバが CentOS 6.5 の場合 `ココ` のファイル<br>cook 対象サーバが上記 OS+Version 以外の場合 `ココ` のファイル |

OS のバージョンによって使用する rpm パッケージをディレクトリ毎に分けておくことや、
OS によって設定ファイルを分けることもディレクトリの命名規則だけで可能です。

#### CentOS 5 系 or 6 系でディレクトリを分ける
下記のようにディレクトリを作成した場合、

```
files/centos-5
files/centos-6
```

cook 対象サーバが `CentOS 5.5` や `CentOS 5.8` の場合は files/`centos-5` ディレクトリ内のファイルが使用され、
cook 対象サーバが `CentOS 6.2` や `CentOS 6.5` の場合は files/`centos-6` ディレクトリ内のファイルが使用されます。

#### ホスト名によりディレクトリを分ける
下記のようなディレクトリを作成した場合、

```
templates/foo.example.com
templates/bar.example.com
```

cook 対象サーバが `foo.example.com` というホスト名の場合は templates/`foo.example.com` 内 erb ファイルがテンプレートして使用され、
cook 対象サーバが `bar.example.com` というホスト名の場合は templates/`bar.example.com` 内 erb ファイルがテンプレートして使用されます。

## ディレクトリ名とディレクトリ名検索順序
下記順序によってディレクトリ名が検索されます。
node となってる箇所については ohai により cook 対象サーバで収集された情報です。

> ※ Chef Documents より引用
>
> 1. `node[:fqdn]`
> 2. `node[:platform]`-`node[:platform_version]`
> 3. `node[:platform]`-`version_components`
> 4. `node[:platform]`
> 5. `default`

例えば cook 対象サーバが `CentOS 5.8` の場合、下記のような順序でディレクトリが検索されます。

> 1. files/`centos-5.8`
> 2. files/`centos-5`
> 3. files/`centos`
> 4. files/`default`

もちろん
`centos` の箇所は、`debian` や `ubuntu` でも使用できます。
【Photoshop】レイヤーを逆順＆レイヤーごとに連番で画像を保存

レイヤーごとに連番で画像を保存できる、というのは知っていたけど、レイヤーを逆順にする方法を知らなかったのでメモ。

#レイヤーを逆順にする
逆順にしたいレイヤーを選択し、レイヤー＞重ね順＞逆順

#レイヤーごとに連番で画像を保存
1. アニメーションウインドウ＞「レイヤーからフレームを作成」で１フレーム１レイヤーに。
※このとき１フレームにあったレイヤーから連番になる。

2. ファイル＞書き出し＞ビデオをレンダリングで、画像シーケンスを選択して「レンダリング」
※連番が何桁か、保存形式は何か、連番の前に付けるファイル名は何かが指定できる。
ただ、いつも使うような名前でアクション作っといて、あとからファイル名一斉置換で変更っていうのもいいかも。

参考：http://tomaki.exblog.jp/15857408
TweepyのStatusオブジェクトをJSONに変換する


jsonで書き出したい時に困ったけどドキュメント見てもググっても見つからなかったからメモ

結局 ``t._json``で出来る（``t``はTweepyのStatusオブジェクト）。

```get_as_json.py
import sys
import tweepy
import json

consumer_key = sys.argv[1]
consumer_secret = sys.argv[2]
access_token = sys.argv[3]
access_token_secret = sys.argv[4]
screen_name = sys.argv[5]

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
client = tweepy.API(auth)

tweets = client.user_timeline(screen_name=screen_name)
for t in tweets:
	t_json = t._json 										# ココ
	print json.dumps(t_json)
```


使う

```
$ python get_as_json.py CONSUMER_KEY CONSUMER_SECRET ACCESS_TOKEN ACCESS_TOKEN_SECRET user_name
```
Engine Yardですべてのサーバに特定のファイルを配置する


![スクリーンショット 2014-08-27 14.11.47.png](https://qiita-image-store.s3.amazonaws.com/0/1232/791565d4-6765-f412-2bc1-e0e67797f9c3.png)

## 概要

Engine Yard Cloudにて、特定のファイルをすべてのインスタンス（サーバー）に一発で配置する方法を紹介します。

## 準備

engineyard gemの3.0.0以上をインストールします。

```
$gem install engineyard
$ey -v
engineyard version 3.0.0
```

## ファイルをインスタンスに上げる

ココでは、test.confを/data/ 以下に上げてみます

```
$ey scp test.conf /data/  -e #{環境名} --all
```

コマンドの使い方は、`ey scp [転送したいファイル]　[転送先]` です。


Appサーバのみを指定したい場合は、最後のオプションが変わります。

```
$ey scp test.conf /data/  -e todo20_stg --app-servers
```

ほかにもDBやUtilityインスタンスの指定方法は次のようになっています。(ey helpで確認できます)
```
 -A, [--all]                                    # scp to all servers
      [--app-servers]                            # scp to all application servers
      [--db-servers]                             # scp to database servers
      [--db-master]                              # scp to the master database server
      [--db-slaves]                              # scp to the slave database servers
      [--utilities=one two three]                # scp to all utility servers or only those with the  given names
```


## 適応

### dotenvを使って、環境設定をばらまく
- https://support.cloud.engineyard.com/tickets/84680
KVMゲストがホストのファイルシステムをマウント

参考: [Etsukata blog: VirtFS で Qemu ゲストホスト間ファイル共有](http://blog.etsukata.com/2013/07/virtfs-qemu.html)

# VirtManagerでFilesystem設定

VirtManagerにて ハードウェアを追加 -> Filesystem を選択。
以下の様に指定

![9p.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3e1b4f88-aed8-db6c-34f7-4ac09250e715.png)

ゲストを落とし設定反映。

# ゲストからホストのディレクトリをマウント実施

```bash:手動でマウント
sudo mount -t 9p -o trans=virtio tmptag /mnt
```

OS起動時にマウントするにはrootのcronに@reboot指定すれば良い。

```bash:crontab&nbsp;-e
@reboot mount -t 9p -o trans=virtio tmptag /mnt
```

```bash:マウントタグはここからも確認できる
cat /sys/bus/virtio/drivers/9pnet_virtio/virtio4/mount_tag
```

* もしくはnfsを使う。

# ホストHDDとの性能比まとめ

* [KVMを使う（ディスク性能編その2） « さくらインターネット研究所](http://research.sakura.ad.jp/2010/04/21/kvm-diskperf2/)

ホストのHDDを使うのが良さそうですね。
FirefoxのSeleniumIDEとSleniumServerを利用しIEを操作

# Selenium IDEを使う (Firefoxで動かす)

1.Firefoxをインストール
2.Firefoxで[seleniumhq](http://docs.seleniumhq.org/download/)にアクセスし、アドオンをインストール

![1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/0ddcd311-80f8-b6a3-64b0-7f40491030ce.png)

3.firefoxを再起動

Selenium IDEのボタンが追加される。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/86359212-ad42-e388-3a9a-64fec69a00dc.png)

4.Selenium IDE起動

![3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/6b2db000-16c4-5bbd-7c16-c74f37e59d67.png)

# Selenium Server (javaで動かす)

![server.png](https://qiita-image-store.s3.amazonaws.com/0/25728/70c6f748-97e7-5412-25b4-58fb086f77e1.png)

* selenium-server-standalone-2.42.2.jar をダウンロード

## selenium-server-standalone-2.42.2.jarを起動

* selenium-server-standalone-2.42.2.jar と同じフォルダに
IEDriverServer.exe を入れる。

```text:selenium-start.bat
java -jar selenium-server-standalone-2.42.2.jar -Dwebdriver.ie.driver=.\IEDriverServer.exe
```

## IEの設定 (SeleniumServerから操作するために必要)

![スクリーンショット 2014-08-27 13.24.49.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3d1affa1-d880-40db-d2a4-945410783d3a.png)

* すべてのゾーンに対して`保護モードを有効にする`のチェックを入れる。

# Selenium IDEからIEを操作する (SleniumServer経由で動かす)

Selenium IDEのオプション -> WebDriver にて

* Enable WebDriver Playback をチェック
* internet explorer と入力

![スクリーンショット 2014-08-27 13.32.56.png](https://qiita-image-store.s3.amazonaws.com/0/25728/63a155fd-3546-0981-254f-f886f9780e57.png)

![スクリーンショット 2014-08-27 13.37.12.png](https://qiita-image-store.s3.amazonaws.com/0/25728/4e9dc775-ca44-3466-76ef-cad3fd292aa7.png)

あとはFirefoxでテストの記録を行い、テストケースを実行するとIEで再生される。

## 画面キャプチャ (Seleniumの機能)

![スクリーンショット 2014-08-27 13.40.58.png](https://qiita-image-store.s3.amazonaws.com/0/25728/207f34df-a619-1a65-9ca4-e482473dfdce.png)

`captureEntirePageScreenshot`命令を使う。
iOS8からのプッシュ通知


iOS8からプッシュ通知の仕様が変わり、プッシュ通知アクション機能の追加などが行われました。
またそれにともなって、今まであった通常のプッシュ通知の登録、プッシュからアプリを開いた時のコールバックのメソッドが変更になりましたので、軽くまとめてみました。


## 通常のPush通知

###APNSサーバーへの登録
####iOS7まで
```Objective-C
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
```

####iOS8から
```Objective-C
UIUserNotificationType types = UIUserNotificationTypeBadge |  UIUserNotificationTypeSound | UIUserNotificationTypeAlert;

UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];

[[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];


```

通知の種類を表現する `UIRemoteNotificationType` は `UIUserNotificationType` に変わったので注意が必要です。


###iOS7以前と8移行の両立
これらのクラス、メソッドはiOS8移行でしか機能しないものなので、iOS7から8への移行期は両方のiOSに対応する必要があると思われます。
以下のように、iOSのバージョンごとにプッシュ通知の登録部分を分けて登録することでiOS7,8共に問題なく機能します。

```Objective-C
if ([[[UIDevice currentDevice] systemVersion] compare:@"8.0" options:NSNumericSearch] == NSOrderedAscending)
{
	/// iOS7 以前のプッシュ通知の登録
} else {
	/// iOS8 移行のプッシュ通知の登録
}

```

##インタラクティブプッシュ通知
###通知アクション
iOS8から新規に追加された機能の一つに通知アクションというものがあります。
プッシュ通知を左にスワイプするとボタンが表示され、ボタンごとにバックグラウンドで処理を行ったり、特定の画面を表示するなどできます
ロック画面・通知センターでは２つ、アラートの通知では４つまでアクションを用意する事ができます。
例えば、新規メール通知に対して、返信、アーカイブ、転送、削除のアクションが用意でき、削除、アーカイブはアプリを開かずに行えます

```Objective-C
UIMutableUserNotificationAction *acceptAction = [[UIMutableUserNotificationAction alloc] init];

acceptAction.identifier = @"REPLY_ACTION";
acceptAction.title = @"返信";

background acceptAction.activationMode = UIUserNotificationActivationModeForeground;
acceptAction.destructive = NO;

device acceptAction.authenticationRequired = NO;
```

| プロパティ  |    用途   |
|:---------:|:---------:|
|identifier|アクションの識別子（一意の値）|
|title|プッシュ通知をスワイプした時に表示されるアクションの名前|
|activationMode|ボタンが押された時にバックグラウンドで実行するか、アプリを開くか|
|destructive|メールの削除等の破壊的な操作かどうか|
|authenticationRequired|バックグラウンドのアクションの場合、ストレージへの書き込みなどデバイスのロック解除が必要かどうか|


###通知カテゴリ
一つのアプリでも複数種類のプッシュ通知が存在することが考えられます。
その時に通知アクションのまとまりを通知カテゴリとしてまとめて登録しておき、プッシュ通知のアクションはそのカテゴリに王子て表示されるという仕様になっています。


```Objective-C
UIMutableUserNotificationCategory *inviteCategory = [[UIMutableUserNotificationCategory alloc] init];

inviteCategory.identifier = @"NEW_MAIL_CATEGORY";

# アラートの通知の場合
[inviteCategory setActions:@[replyAction, deleteAction, archiveAction]
forContext:UIUserNotificationActionContextDefault];

# 通知センター、ロック画面の場合（２こしかひょうじされないため）
[inviteCategory setActions:@[replyAction, deleteAction]    forContext:UIUserNotificationActionContextMinimal];
```
【JavaScript＋Photoshop】画像の白色を透過させる

各チャンネルの色が乗った部分のみを抽出して乗算することで、白色を排除しています。
カラーモードは、RGB・CMYK・グレースケールに対応。

```js:
#target "Photoshop"


function CheckSelection()
{
	var select_bool = true;
	try
	{
		app.activeDocument.selection.bounds;
	}
	catch(e)
	{
		select_bool = false;
	}
	return select_bool;
}


try
{
	if (app.documents.length == 0){throw("ファイルが開かれていません。");}
	
	with(app.activeDocument)
	{
		var color_mode = mode;
		if ("DocumentMode.GRAYSCALE,DocumentMode.RGB,DocumentMode.CMYK".indexOf(color_mode.toString()) == -1)
		{
			throw("ファイルのカラーモードがRGB・CMYK・グレースケールのものしか処理できません。");
		}
		
		alert("処理実行します。途中でエラーが起きた場合は保存しないでください。");
		
		flatten();
		
		var doc_channels = channels;
		for (i=0; i<doc_channels.length; i++)
		{
			if (doc_channels[i].kind == ChannelType.COMPONENT)
			{
				selection.load(doc_channels[i]);
				selection.invert();
				
				var new_layer = artLayers.add();
				new_layer.name = "Finish";
				new_layer.blendMode = BlendMode.MULTIPLY;
								
				var channel_name = doc_channels[i].name;
				var solid_color = new SolidColor();
				if ("グレー,gray".indexOf(channel_name) != -1)
				{
					solid_color.gray.gray = 100;
				}
				else if ("レッド,red".indexOf(channel_name) != -1)
				{
					solid_color.rgb.red = 0;
					solid_color.rgb.green = 255;
					solid_color.rgb.blue = 255;
				}
				else if ("グリーン,green".indexOf(channel_name) != -1)
				{
					solid_color.rgb.red = 255;
					solid_color.rgb.green = 0;
					solid_color.rgb.blue = 255;
				}
				else if ("ブルー,blue".indexOf(channel_name) != -1)
				{
					solid_color.rgb.red = 255;
					solid_color.rgb.green = 255;
					solid_color.rgb.blue = 0;
				}
				else if ("シアン,cyan".indexOf(channel_name) != -1)
				{
					solid_color.cmyk.cyan = 100;
					solid_color.cmyk.magenta = 0;
					solid_color.cmyk.yellow = 0;
					solid_color.cmyk.black = 0;
				}
				else if ("マゼンタ,magenta".indexOf(channel_name) != -1)
				{
					solid_color.cmyk.cyan = 0;
					solid_color.cmyk.magenta = 100;
					solid_color.cmyk.yellow = 0;
					solid_color.cmyk.black = 0;
				}
				else if ("イエロー,yellow".indexOf(channel_name) != -1)
				{
					solid_color.cmyk.cyan = 0;
					solid_color.cmyk.magenta = 0;
					solid_color.cmyk.yellow = 100;
					solid_color.cmyk.black = 0;
				}
				else if ("ブラック,black".indexOf(channel_name) != -1)
				{
					solid_color.cmyk.cyan = 0;
					solid_color.cmyk.magenta = 0;
					solid_color.cmyk.yellow = 0;
					solid_color.cmyk.black = 100;
				}

				if (CheckSelection())
				{
					selection.fill(solid_color, ColorBlendMode.NORMAL , 100, false);
				}
			}
		}

		selection.deselect();

		var doc_layers = layers;
		for (j=0; j<doc_layers.length; j++)
		{
			if (doc_layers[j].isBackgroundLayer){doc_layers[j].remove();}
		}

		if (layers.length != 1)
		{
			mergeVisibleLayers();
			artLayers[0].name = "Finish"
		}
		else
		{
			artLayers[0].blendMode = BlendMode.NORMAL;
		}

		alert("処理完了しました。");
	}
}
catch(err_str)
{
	alert(err_str);
}
```
CDN化をnginxの設定で行う方法

瞬間的な高負荷に耐える為にアプリケーション側を変更せず、nginxの設定のみで対応する方法

CDNとは、「Contents Delivery Network」といわれるもので、最適なネットワークを経由してWebコンテンツをキャッシュし効率的に配信できる物です。Amazon(AWS)では「CloudFront」というサービスがあります。他にも「Akamai」などが有名です。

# 前提条件

- バックエンドにProxyするCMSを使う(ここではPlone) (画像等も静的なデータではなくCMSから配信)

# 今回の実験

- CDNには、Amazon(AWS) CloudFrontを用いた
- nginx - Varnish - CMSアプリ(Plone(複数台))という構成(当社が普段から使っている構成)
- 画像やファイルなどのみをCDNから配信させる
- 画像やファイルのオリジナルは、Plone内つまり、同じnginxからCDNに転送


# 手順

- CDN(Amazon CloudFront)を設定する。
  Web用、HTTP/HTTPSを使う、Custom Originの設定を行う。(下部の「参考にしたサイト(1)」を参照)
- nginxの設定を行う


## ポイント

### 方式

- nginxにて指定のURI(画像などを特定)は、CDN(CloudFront)にリダイレクトする
- 指定のURIは、正規表現を用いて、Ploneの仕様に合わせて特定する(これはVarnishのキャッシュ設定と同じ設定を持ってきた)
  [VarnishのサンプルVCLはこちら](https://gist.github.com/terapyon/156460121aa6508164d0)

### nginxのconf

- locationの中で、proxy_passが1回しか指定できない
- 複数の条件を分岐できない且つネスト出来ない <これは一番ハマった。(下部の「参考にしたサイト(3)」を参照)
- Amazon CloudFrontからデータを取得する時は、Ploneからデータを取得出来るようにする (下部の「参考にしたサイト(2)」を参照)


## 設定ファイルの抜粋

```nginx.conf
upstream to_varnish {
    server 127.0.0.1:6081;
}
server {
...
省略
...
    location / {
        if ($uri ~* \.(jpe?g|png|gif|pdf|gz|tgz|bz2|tbz|zip|tiff|tif)$) {
            set $no_plone A;
        }
        if ($uri ~* /(image|(image_(?:[^/]|(?!view.*).+)))$) {
            set $no_plone A;
        }
        if ($uri ~* \.(svg|swf|ico|mp3|mp4|m4a|ogg|mov|avi|wmv|flv)$) {
            set $no_plone A;
        }
        if ($uri ~* \.(css|js)$) {
            set $no_plone A;
        }
        if ( $http_user_agent != "Amazon CloudFront" ) {
            set $no_plone "${no_plone}B";
        }
        if ($no_plone = AB) {
            expires 1h;
            rewrite ^ http://YOUR_SUBDOMAIN.cloudfront.net$request_uri? last;
        }
        proxy_pass http://to_varnish/VirtualHostBase/http/YOUR_DOMAIN:80/Plone/VirtualHostRoot/;
    }
```

# 動作確認

- nginxのログを閲覧
  Amazon CloudFront からのアクセスがあることを確認
- Firebugなどでネットワークの取得元を確認
  画像などが、302でCDNへリダイレクトされていて、取得元URLが変わっていた

# 効果

数人でアクセスしているレベルだと、Varnishで十分はさばけるので、効果を感じることが出来なかった。
(リダイレクトが発生する分、100ms程度時間が掛かるケースもあった)
実際に高負荷状態を作り、Varnishでも耐えられない程度の状態でないと、実感できないと思う。



# 参考にしたサイト

1. [Amazon CloudFrontをカスタムオリジンで使用する方法](http://www.lancork.net/2014/05/amazon-cloudfront-with-rentalserver/)
- [NginxでCloudFrontにリダイレクトしてカスタムオリジンで負荷分散する](http://dev.classmethod.jp/cloud/nginx-cdn-redirect-cloudfront-custom-origin/)
- [Nginxで複数条件のIF文を書く方法がすごいｗ](http://qiita.com/ukitazume/items/ab1c929783e87227e466)

# 著者関連Blog記事

[Ploneへの急激なアクセスを処理する方策(CDN化)](https://www.cmscom.jp/blog/0eqy3m)
MacでワンライナーでDOKCER_HOSTを設定する

# DOKCER_HOSTの設定

boot2dockerを使ってる場合、Macでは```DOCKER_HOST```という環境変数が必要です。
Terminalを抜けると再設定しないといけないので、エイリアスにしておくと便利です。

## ワンライナー
```shell-session
export DOCKER_HOST=tcp://$(boot2docker ip):2375
```

## .bash_profileに登録する

```shell-session:.bash_profile
﻿alias docker-host="export DOCKER_HOST=tcp://$(boot2docker ip):2375"
```
Debian7 CPANでinstall GDするとjpegテストエラーでこける

必要そうなパッケージを入れて準備

```
apt-get install libjpeg-dev libgd2-xpm-dev libpng-dev 

```

CPANでインストール実行

```
perl -MCPAN -e shell
cpan[1]> install GD
```

make testでtest 10なる項目でこける。

```
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-MTest::Harness" "-e" "undef *Test::Harness::Switches; test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/GD.t ........ 1/12 Testing using png support.
t/GD.t ........ Failed 1/12 subtests 
        (less 1 skipped subtest: 10 okay)
t/Polyline.t .. ok   

Test Summary Report
-------------------
t/GD.t      (Wstat: 0 Tests: 12 Failed: 1)
  Failed test:  10
Files=2, Tests=13,  0 wallclock secs ( 0.02 usr  0.00 sys +  0.08 cusr  0.00 csys =  0.10 CPU)
Result: FAIL
Failed 1/2 test programs. 1/13 subtests failed.
make: *** [test_dynamic] エラー 255
```

t/GD.tのtest10を見てみる

```pl:t/GD.t

if (GD::Image->can('newFromJpeg')) {
  compare(test10('frog.jpg'),10);
} else {  
  print "ok ",10," # Skip, no JPEG support\n";
}

～略～

sub test10 {
  my $fn = shift;
  my $im = GD::Image->newFromJpeg($fn);
  return image($im)
}
```

なんとなく変換した後の画像データが意図したデータになっているかのテストっぽい。
いろいろ調べると以下のフォーラムがヒットした

https://rt.cpan.org/Public/Bug/Display.html?id=49053

どうやらlibjpeg8の場合にこのテストエラーが起こるらしい。
Debian7だとlibgd2-xpm-dev (もしくはlibgd2-noxpm-dev)の依存としてlibjpeg8が入ってしまう。
libjpeg64を無理やり入れようとすると、依存関係からlibgd2-xpm-devがremoveされる。
お手上げ。

libjpeg8で変換した画像は実用では特に問題なさげなのでforceでインストールした。

```
perl -MCPAN -e shell
cpan[1]> force install GD
```

これだとインストール成功
インストール後、実運用のperlスクリプトでテストしたところでは、jpegの処理に問題はなさそうなのでとりあえずこれでOK。
EmmetでHTMLタグに好きな属性をつける方法


Emmetもしくはzen-codingを使用していて、HTMLに属性をつける方法です。

# 属性を追加
属性を付与するには[]を内につけたい属性を書きます。

## style属性をつける
試しにstyle属性をつけてみましょう。

```emment:style属性を追加
td[style="padding: 4%;"]
```
出力されるHTML

```html:style属性が付与されたタグ
<td style="padding: 4%;"></td>
```
tdタグにstyle属性が付与されて出力されました。

## 好きな属性をつける
例えば使用頻度があまりない属性でも特に問題無くつけることができます。

```emment:ng-repeat属性を追加
div[ng-repeat="item in items"]
```
出力されるHTML

```html:ng-repeat属性が付与されたタグ
<div ng-repeat="item in items"></div>
```

## 複数属性をつける場合
複数属性を付与したい場合は、[]内で半角スペースで区切ります。

```emment:複数属性を追加
div[title="ほげ" ng-repeat="item in items"]
```
出力されるHTML

```html:複数属性が付与されたタグ
<div title="ほげ" ng-repeat="item in items"></div>
```

# Emmet関連 
EmmetでHTMLタグへテキストを挿入する方法
http://qiita.com/pugiemonn/items/a402fc192155878a0de0
メモ： boot2dockerのUpdate(0.8.0->1.2.0)


はじめに
====
boot2docker を 久しぶりにUpdate(0.8.0 -> 1.2.0)したらちょっとエラーになったのでメモです。

問題
====
boot2docker を単にUpdateしたら、

```
% docker ps -a
2014/08/27 11:48:13 Error response from daemon: client and server don't have same version (client : 1.14, server: 1.12)
```

みたいなエラーが出ました。
Mac上のClientのVersionは挙がっても、VirtualBox内のVersionが変わっていないからエラーになるようです。

解決方法
====
VirtualBoxのISOを更新すれば直りました。

昔のISOを削除するとコンテナは空になってしまうので、重要なのはDeleteする前にPushなどしておきましょう。

だいたい下記の手順でやれば良いだろう、というメモ。

```text:Terminal
% brew update
% brew upgrade boot2docker
% boot2docker delete
% boot2docker download
% boot2docker init
% boot2docker up
Waiting for VM and Docker daemon to start...
............................................
Started.

To connect the Docker client to the Docker daemon, please set:
    export DOCKER_HOST=tcp://192.168.59.104:2375

% export DOCKER_HOST=tcp://192.168.59.104:2375  
% docker ps -a
 CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
＃＃何もない＃＃
```
GDALをワイルドカードが使えるようにWindowsでコンパイルする

gdalをコンパイルするときにwildcardを有効にするにはnmake.optのsetargv.objを有効にしなくてはいけない。
そうしないと、gdalbuildvrt　などでワイルドカードが使えない。

nmake.optのSETARGVをコメントアウトして以下のように指定

`
SETARGV = "C:\PROGRA~2\MICROS~1.0\VC\lib\setargv.obj"
`

そのあと以下のコマンドでコンパイル

`
nmake -f makefile.vc
`

参考
http://alastaira.wordpress.com/2011/07/02/building-gdal-to-support-wildcards/
Chrome37(x64)でMacTypeが無効になったときの対応

本日Chrome37が公開され64bit版も公開されました。
早速x64版をインストールしたらMacTypeが有効になっていない・・・

そんなときの対応方法です！

## chrome://flags/ で設定画面をOpen!
![スクリーンショット 2014-08-27 10.12.56.png](https://qiita-image-store.s3.amazonaws.com/0/48016/5eb48cf7-b0e6-b00c-39d2-aed00ae3e7c8.png)

## 「DirectWrite を無効にする」を有効にする
否定の否定で難しい。。。

## Chromeを再起動！
再起動したらMacTypeが有効になってる！ぱっと見わかりますねー。一安心。
![スクリーンショット 2014-08-27 10.13.14.png](https://qiita-image-store.s3.amazonaws.com/0/48016/114dc17c-eccd-59cc-1306-896cef1afcd1.png)

IEではDirectWriteを無効にするオプションがないのでぜひつけてほしいな。。。
いや、もっと言えば。。。
もっときれいにフォントをレンダリングしてほしいな。。。
過去のコミットの Author 情報を変更する


## git filter-branch で過去ログを一括変更する

```shell
git filter-branch -f --commit-filter '
        if [ "$GIT_AUTHOR_EMAIL" = "before@mailaddress" ];
        then
                GIT_AUTHOR_NAME="Your Name";
                GIT_AUTHOR_EMAIL="after@mailaddress";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' HEAD
```

## git push -f で強制 push する
git filter-branch 後に push するとエラーが出るので -f を付ける。

```
git push -f
```
[AWS 4]AWSでのアカウント戦略！IAMを使って行こう！


個人的メモです。

小規模レベルでのアカウント戦略を考えて行きます。
(適宜、加筆修整します)
ここでは簡単にグループ作成とユーザー作成およびフループへの登録を

#想定ユーザを考える
2014/8/26時点におけるIAMのグループ設定で適用できるポリシーテンプレートが77あります。
小規模想定なので、その中の3つで良いかと思います。

- ”Administrator Access”
- ”Power User Access”
- ”Read Only Access”

##Administrator Access
[[AWS 1]AWSアカウント取得後にする大切なこと！先ずIAMへ行け！](http://bit.ly/VEhXWO)の中で適用しています。
AWSアカウントの替わりになる強力な権限を持っています。

##Power User Access
上記、Admin用からIAM操作権が省かれたポリシーです。
開発関連に使用すると良いでしょう。

##Read Only Access
参照用ユーザ向けポリシーです。
監視などの用途に使うのが良いでしょう。

#(今後作成)AWS CLIで、グループ作成
Admin用は既に作成済なので省略し、PowerユーザーとRead Onlyユーザ用のグループを作成します。

##Powerユーザー向けグループ作成


##Read Onyユーザー向けフループ作成
Twitter風の〜分前を実装する(Rails編)


ダッシュボードを作っていて最新データの更新時刻を一覧表示にしたけど、パッとみても時間がわかりにくい...ということでTwitter風の〜分前って表示を実装しようと思いました。

**Twitter風の〜分前を実装する(JavaScript/Vue編)を書きました(2019/12/1)**
https://qiita.com/bellx2/items/379dd0e22256bc1895b0

## 調査

作ろうと思ったらその名もズバリなエントリーを発見。

[time_ago_in_wordsでtwitterライクな「○分前」を表示](http://mochizblog.heroku.com/28)

というか、すでにRailsのDateHelperに[time_ago_in_words](http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-time_ago_in_words)というファンクションがあるようです。なるほど。

## 実装

日本語で表示するために

```config/application.rb
config.i18n.default_locale = :ja
```

```config/locales/ja.yml
ja:
  datetime:
    distance_in_words:
      half_a_minute: "30秒前後"
      less_than_x_seconds:
        one:   "1秒"
        other: "%{count}秒"
      x_seconds:
        one:   "1秒"
        other: "%{count}秒"
      less_than_x_minutes:
        one:   "1分"
        other: "%{count}分"
      x_minutes:
        one:   "約1分"
        other: "%{count}分"
      about_x_hours:
        one:   "約1時間"
        other: "約%{count}時間"
      x_days:
        one:   "1日"
        other: "%{count}日"
      about_x_months:
        one:   "約1ヶ月"
        other: "約%{count}ヶ月"
      x_months:
        one:   "1ヶ月"
        other: "%{count}ヶ月"
      almost_x_years:
        one:   "１年弱"
        other: "%{count}年弱"
      about_x_years:
        one:   "約1年"
        other: "約%{count}年"
      over_x_years:
        one:   "1年以上"
        other: "%{count}年以上"
```

あとは、該当の箇所に

```
time_ago_in_words(alertDate)+"前"
````
とすれば表示できます。

## タイムゾーンが設定されていない場合

HerokuはUTCで時差は９時間。Rails側のTimeZoneを変更する方法もあると思うのだがうまく反映できるか不明なので、とりあえず9時間マイナスで表示のみ変更で暫定対応。

```
time_ago_in_words(alertDate-9.hour)
```

## 課題
* タイムゾーンを正しく設定する
* ja.yamlはどこから探すのが良いのか調べる(参考にしたサイトのが不十分だったため）
Webots for NAOのインストール

NAOのしミューレたであるWebots for NAOをインストールします。

ダウンロード
=============

コミュニティーサイトからダウンロードします。

https://community.aldebaran.com

やはり最新版はないので、older software versionを使います。

![スクリーンショット_2014-08-24_14_10_25.png](https://qiita-image-store.s3.amazonaws.com/0/52430/86f75568-6b0f-8345-8435-3616a9b2485f.png)

一番下のWebotsフォルダにあります。

![Archives_Resources_Aldebaran_Community.png](https://qiita-image-store.s3.amazonaws.com/0/52430/70899345-d366-27a6-2e76-bf876ea31309.png)


私はMacなので、 webots-for-nao-7.4.3.dmg を使いました。
180MBあります。

実行時にライセンスが求められます。

![Welcome_to_Webots_for_NAO_7_4_3__unlicensed__と_デスクトップ_と_Webots_for_NAO_-_license_registration.png](https://qiita-image-store.s3.amazonaws.com/0/52430/b14c3383-c0d9-62c2-343f-bf07b8ebcaad.png)

ブラウザが開くので、free 90 days trialを選びましょう。

![Webots_for_NAO_-_license_registration.png](https://qiita-image-store.s3.amazonaws.com/0/52430/0404b6e0-b8ee-7079-dbf5-65c30ece07bd.png)

名前とメアドを聞かれるので、入れるとメールが来ます。
そこのURLを開くとWebotsのページに飛ばされるので、そこでパスワードを入れます。

![Webots__robot_simulator_-_My_account.png](https://qiita-image-store.s3.amazonaws.com/0/52430/6b4d425c-b501-64a3-ab4f-83e0ca874e87.png)

これで、登録したメアドとパスワードが有効になります。

やっと起動しました。
![webots](http://gyazo.com/cb50764aa8831cf8a3f670c7bf208ac5.gif)

90日あればPepper直前まではもちますね。
【MacOSX】InterfaceBuilderでボタンをデフォルトボタンやキャンセルボタンにする


デフォルトボタンというのは、RETURNキーが割り当てられていて濃淡が変化するアニメーションを伴った水色のボタンのことです。キャンセルボタンはESCキーが割り当てられたボタンのことです。

1. InterfaceBuilderでxibファイルを表示してボタン部品を選択します
2. Attributes Inspectorを表示します
3. Buttonの一番下の項目「Key Equivalent」をクリックします
4. RETURNキーまたはESCキーを入力します

これで完了です。

**RETURNキーを割り当てた場合**

![RETURNキーを割り当てた場合](http://f.st-hatena.com/images/fotolife/f/fhisa/20140827/20140827080813.png "RETURNキーを割り当てた場合")

**ESCキーを割り当てた場合**

![RETURNキーを割り当てた場合](http://f.st-hatena.com/images/fotolife/f/fhisa/20140827/20140827080849.png "RETURNキーを割り当てた場合")

REURNキーを割り当てたボタンは、アプリケーションを実行すると自動的に濃淡が変化するアニメーションを伴った水色のボタンとして表示されます。

ESCキーを割り当てたボタンにはESCキーの他に「COMMAND+ピリオド」も割り当てられます。

古くからのMacユーザーでないと知らないかもしれないのですが、昔のMacのキーボードにはESCキーがなくて何かをキャンセルするような操作には「COMMAND+ピリオド」が割り当てられていました。それが今に至るまで二三十年越しで引き継がれているわけですね。
CoffeeScriptの練習

初心者のボクがCoffeeScriptを練習します。ということまずはJavaScriptと比較することかなと思いました。

# 変数
変数に文字列を代入します。

```javascript:JavaScript
var val_string = "hoge";
var val_float = 1.23;
var val_boolean = true;
```

```coffeescript:CoffeeScript
val_string = "hoge"
val_float = 1.23
val_boolean = true
```
セミコロンが消えます。

# コメント
複数行コメントと1行コメントの書き方

```javascript:JavaScriptのコメント
/*
 複数行のコメントだよ
*/

// コメントだよもん
```

```coffeescript:CoffeeScriptのコメント
###
 複数行のコメントだよ
###

# コメントだよもん
```

# 配列
配列です。

```javascript:JavaScript
var items = ["aaa", "bbb", "ccc"];
```

```coffeescript:CoffeeScript
items = [
  "aaa"
  "bbb"
  "ccc"
]
```
改行してカンマが消えるのですかね。


配列の中にハッシュを入れました。

```javascript:JavaScript
var items = [
  {title: "コーラ",  price: 150},
  {title: "トマトジュース", price: 120},
  {title: "ビール", price: 300}
];
```

```coffeescript:CoffeeScript
items = [
  {
    title: "コーラ"
    price: 150
  }
  {
    title: "トマトジュース"
    price: 120
  }
  {
    title: "ビール"
    price: 300
  }
]
```

# メソッド
hogeというメソッドでalertを表示します。

```javascript:JavaScript
function hoge() {
    alert("aaa");
}
```

```coffeescript:CoffeeScript
hoge = ->
  alert "aaa"
  return
```

## メソッドで引数を受け取る
hogeメソッドにpiyoという引数をワタシます。

```javascript:JavaScript
function hoge(piyo) {
    alert("aaa" + piyo);
}
```

```coffeescript:CoffeeScript
hoge = (piyo)->
  alert "huga" + piyo
  return
```

## 無名関数

```javascript:JavaScript
var huga = function() {
  alert("aaa");
}
```

```coffeescript:CoffeeScript
huga = ->
  alert "aaa"
  return
```
JavaScriptでみると異なりますが、CoffeeScriptだとhugaと関数を定義した書き方と同じになるのですね。

# メソッド
メソッドはそのまま使うことができます。

```javascript:JavaScript
setTimeout(console.log(3), 3000);
```

```coffeescript:CoffeeScript
setTimeout console.log(3), 3000
```
カッコがなくなるだけです。

# if文
if文を書くと`{}`が無くなります。

```javascript:JavaScript
if (true === true) {
  console.log('true');
} else {
  console.log('false');
}
```

```coffeescript:CoffeeScript
if true == true
  console.log 'true'
else
  console.log 'false'
```
CoffeeScriptのif文の`==`と書くとJavaScript側で`===`になっています。

# 参考
* [JS Coffee 変換サイト](http://js2coffee.org/)
* [CentOSでコマンドラインからCoffeeScriptをコンパイルしました](http://qiita.com/pugiemonn/items/23f7ff4e2ee2701781c9)
NAN化されたnode-ffiを試すには

# 背景

0.11系に未対応だったnode-ffiを[NAN化](http://yosuke-furukawa.hatenablog.com/entry/2014/04/07/205935)した方が[現れた](https://github.com/node-ffi/node-ffi/issues/159)ので、試してみた。

node-ffiは任意の共有ライブラリを動的にJavaScriptから呼び出して使えるようにするライブラリ。Pythonでいうところのctypesのようなもの。

# やり方

```bash
nodebrew use 0.11
git clone https://github.com/avatar5d/node-ffi.git
cd node-ffi
npm install -g node-gyp
npm install nan
node-gyp rebuild
```

# 動かし方

- [NAN化されたnode-ffiを試した](http://kjunichi.cocolog-nifty.com/misc/2014/08/nannode-ffi-833.html)

# 関連投稿

- [OSXでAtom Shellでネイティブモジュール動かす](http://qiita.com/kjunichi/items/606d710eb9dd24ebe805)
- [NodObjCをnode-webkitで動かす](http://qiita.com/kjunichi/items/733ae042220a7c4d9d42)

# 関連記事

- [node-ffiをGoで入門してElectronを使って応用してみる](http://abrakatabura.hatenablog.com/entry/2015/12/11/000722)
Modern Java Web Architectureで作られたMarkdownで書ける情報共有アプリを公開します！


> この投稿は[JavaEEのアーキテクチャを再興する](http://qiita.com/ukiuni@github/items/b9d18b44570ece0e3933)に属する投稿です。Open Reportsという名前の、どこかで見たことのあるサービスのクローンアプリをModern Java Web Architectureで作りました。Markdownでドキュメントを書いて、公開することができます。
アプリは[Github](https://github.com/ukiuni/CMS)でオープンソースにて公開しています。
アプリのサンプルは[こちら](http://openreport.ukiuni.cloudbees.net/)で動いています。

Qiita、いいですよね。何がいいかというと、Markdownでレポートを書くことができ、見てくれた人の反応を見ることができ、お気に入りのレポートを抑えておける事です。
ただ、Qiitaには載せることのできない、組織内にとどめておきたい情報もたくさんあります。
そんな情報を自分たちのサーバで管理することができるアプリを作成しました。

![openreports_items.png](https://qiita-image-store.s3.amazonaws.com/0/25176/5379d41d-8fd9-64c6-ff43-c9a4a9660774.png)

# 情報共有のためのアプリとして。
チーム内やグループ内だけに公開したい情報共有を、自分たちの管理するサーバで運用したいことがあるでしょう。そんな時はこのアプリを使うとよいでしょう！セットアップも簡単です。
## セットアップ
GithubからOpenReport_XXXXX.warを[ダウンロード](https://github.com/ukiuni/OpenReport/releases)して、Tomcatに配置するだけでアプリが動きます。その他のアプリケーションサーバでもWebプロファイルであれば動作すると思います。

# リファレンスアーキテクチャとして
このアプリはModern Java Web Architectureで作られています。アーキテクチャ説明書も[こちら](https://github.com/ukiuni/CMS/blob/master/doc/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E8%AA%AC%E6%98%8E%E6%9B%B8.odt)に公開してあります。アプリもドキュメントもApache License 2.0で公開していますので、作成するアプリケーションのベースとして使って頂いても結構ですし、リファレンスアーキテクチャとして、新しいアプリを作るときの参考にして頂いても結構です。

# 勉強用に
AngularJS、Bootstrap、JAX-RS、JPAを使ったアプリケーションです。更にはSelenium+Tomcat embedを使った自動テストも行っています。Webアプリケーションの作り方を勉強する場合のサンプルとしてもお使いいただけます。

# 検証用に
新しい技術を試すときに、このアプリに組み込んで試用すると技術の実用性を効率的に検証できます。

# 初めてのオープンソースへのコミットメントに
Githubで運用しているので、修正・更新を簡単に送っていただけます。オーナーとは日本語でやりとりできます。
PullRequestお待ちしております！

アプリのサンプルも[こちら](http://openreport.ukiuni.cloudbees.net/)で公開しています。ぜひご利用ください。
トルコ政府ジオポータル開設

トルコ政府がジオポータルを開設したとのこと。ニュースソースは、例えば次の通り。2014年8月19日のニュースであるようだ。
http://www.hurriyetdailynews.com/turkey-launches-giant-geoportal.aspx?pageID=238&nID=70654&NewsCatID=374
ここから辿っていったところ、次のURLが当該サイトのようだ。
http://geoportal.ormansu.gov.tr/geoportal/catalog/main/home.page
どちらかというとエンタープライズ的な感じがする構成になっている。
## INSPIREロゴの存在
右上に欧州INSPIREのロゴマークが入っているところが特徴的である。欧州連合への参加を希望している国には、欧州基準に整合することが重要であると考える傾向が多いともきく。
## arcgisonline.com への依存性
HTMLソースレベルで内容を確認してみたところ、いくつか arcgisonline.com への依存もあるようだ。
## ダウンロード可能なデータのフォーマット
http://geoportal.ormansu.gov.tr/geoportal/catalog/download/download.page では、ダウンロード可能なファイルの形式が選択できるようになっている。
### ベクトルデータのフォーマット

- File Geodatabase - GDB - .gdb
- Shapefile - SHP - .shp
- Autodesk AutoCAD - ACAD - .dxf
- Autodesk AutoCAD - ACAD - .dwg
- Bentley Microstation Design (V8) - DGN_V8 - .dgn

### ラスタデータのフォーマット

- ESRI GRID - GRID
- File Geodatabase - GDB - .gdb
- ERDAS IMAGINE - IMG - .img
- Tagged Image File Format - TIFF - .tif
- Graphic Interchange Format - GIF - .gif
- Joint Photographics Experts Group - JPEG - .jpg
- Joint Photographics Experts Group - JPEG 2000 - .jp2
- Bitmap - BMP - .bmp
- Portable Network Graphics - PNG - .png
RedshiftのCompute NodesのPublic IP一覧を取得するワンライナー

前提：

- awscli,jqが入っていること。
- aws configureかRoleでクレデンシャルが設定されていること


```
$ aws redshift describe-clusters | jq -r '.Clusters[].ClusterNodes[]|select(.NodeRole | contains("COMPUTE-"))|.PublicIPAddress'
```
TitaniumでiOS実機にアプリを転送できなくなったので対処


最初はiPhoneで実機検証をしていたが、iPadも使用することになりiPadを追加。
その際にiPhoneとiPad両方にアプリを転送できなくなってしまったので対処。
(最初はiPhoneだけ出来たんだけどなぁ)

## 対処

1. iPadのデバイスを登録
2. プロビジョニング情報を更新
3. Xcodeに最新の情報を反映
4. Titaniumで情報を更新
	1. メニューバーの「Run」から「Run Configurations」を選択
	2. Titanium iOS Deviceの中に今まで使用していた実行構成の設定があるので開く
	3. 右下の辺りに「Refresh」ボタンがあるので押す
	4. Select Provisioning Profileを正しい最新のプロファイルにする
	5. 「Apply」を押下
	6. 後は実行するだけなので「Run」を押す

## メモ

### 参考サイト

* http://mushikago.com/i/?p=3931

### Titanium実行時のログ

```
Titanium Command-Line Interface, CLI version 3.3.0, Titanium SDK version 3.2.3.GA
Copyright (c) 2012-2014, Appcelerator, Inc.  All Rights Reserved.
Please report bugs to http://jira.appcelerator.org/
For help, run: titanium help build
[ERROR] :  Invalid "--pp-uuid" value "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
```

調べてみたら、Provisioning ProfileのUUIDが違うっぽい。
http://support.titanium-mobile.jp/questions/3594


### Titaniumで扱ってるProvisioning Profileの情報を見る
コマンドで見れるらしい。

```bash
ti info
```

こんな感じで出てくる。

```bash
~~~~~ 略 ~~~~~
Apple WWDR Certificate
  Apple WWDR                  = installed

Development iOS Provisioning Profiles
  Test **EXPIRED**
    UUID                      = XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
    App Prefix                = XXXXXXXXXX
    App Id                    = jp.example.*
    Date Created              = 00/00/0000 00:00 AM
    Date Expired              = 00/00/0000 00:00 AM
  jp.example.myapp
    UUID                      = XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
    App Prefix                = XXXXXXXXXX
    App Id                    = jp.example
    Date Created              = 00/00/0000 00:00 AM
    Date Expired              = 00/00/0000 00:00 AM
~~~~~ 略 ~~~~~
```

ログに出ているIDと、ここで表示されているIDが違った。
コレが原因かな？
OSXのLaunchAgentでホストOSのファイル監視してリモートサーバーにrsyncして同期する方法


最初はnodejsのwatch使ってやろうと思ったが、調べてる内にmacで完結できることはmacでやろうと思ってtryしてみた。

例えばvirtualboxとかでプロジェクトのgitカレントを共有フォルダ設定していて更にリモートサーバーに飛ばしたい場合等に使う予定(まだ試していないが。。。。)

## 参考にしたサイト

* [OS Xの標準機能でここまでできる！ファイルの内容の変更を検知して通知センターに通知するデーモンを簡単に作成する方法](http://ottan.me/2013/05/07/daemon-to-notify-notification-center-by-detecting-file-changes/)
* [launchd.plistの書き方](http://ka-zoo.net/2013/04/launchd-plist/)

## LaunchAgentのplistを作る

習慣らしくてplistとタグ名は一致させるらしい(タグは.plistを除いた形)

* usernameと記載されているものは自分のuser名に変更してください

### ~/Library/LaunchAgents/me.username.rsync.plist

```xml:~/Library/LaunchAgents/me.username.rsync.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <!-- Label plistと同一の名前 -->                                                                                                                                                                    
        <string>me.username.rsync</string>
        <key>ProgramArguments</key>
        <array>
            <string>rsync</string>
            <string>-av</string>
            <string>--delete</string>
            <string>-e</string>
            <string>ssh</string>
			 <!-- ホストのrsync対象元  -->
            <string>/Users/username/sample/</string>
			 <!-- リモートのrsync対象先(dest)  -->
            <string>vagrant@192.168.56.103:/home/vagrant/sample</string>
        </array>
        <key>WatchPaths</key>
        <array>
            <!-- usernameは自分のユーザー名に変更する -->
            <string>/Users/username/sample/</string>
        </array>
		 <!-- ログの出力先設定デフォルトは/var/log/system.logに書かれるらしい。最初は書いておいて動作上問題がなければ/dev/nullにしてもよいと思う(そうしないとログで容量が圧迫される  -->
        <key>StandardOutPath</key>
        <string>/tmp/me.username.monitor.out.log</string>
        <key>StandardErrorPath</key>
        <string>/tmp/me.username.monitor.err.log</string>
    </dict>
</plist>

```


## ホストのrync元のディレクトリを作る

launchAgentのWatchPathは最初にsync元のディレクトリ作っとおかないと動かないのでloadする前に作る

```shell:~/ホストOS(OSX)
mkdir /Users/username/sample/
```

## リモートのrync先のディレクトリを作る

rsyncがこけるのでこれも同様に

```shell:~/リモートサーバー
mkdir /home/vagrant/sample
```


## LaunchAgentに作ったplistをloadさせる

```shell
launchctl load ~/Library/LaunchAgents/me.username.rsync.plist
```



## ホストOS側で試しにファイル作って見る

```shell:/Users/username/sample/sample.txt
echo 'test' > /Users/username/sample/sample.txt
```

## リモートに反映されているか確認する

```shell:~/リモートサーバー
ll /home/vagrant/sample

# sample.txtが作られていれば問題なし！！！
```


## 【補足】plistの更新について

launchAgentはplistを更新しても一回unloadしてloadをし直さないとplistの更新分は読み込み直さないので注意

```shell
launchctl unload ~/Library/LaunchAgents/me.username.rsync.plist
```


## 最後に

これでローカルでファイルゴリゴリ触れる〜
Seleniumことはじめ

とりあえずSeleniumを触ってみたので少しメモ書き。と言っても全部試したわけじゃないので不足点は多いです。

# そもそもSeleniumとは？

Webサイトをテストするためのツール。あらかじめスクリプトを書いておくことで、ブラウザ上でその通りの操作を行い、途中途中で要素が存在するか、URLが期待値と合致しているかどうか などといった検査を行うことができるというものです。

とりあえず「Webサイトの試験と言ったらSelenium」みたいな話を聞いていたのでググってみたら、該当記事が古いのばっかりで凄く不安を感じていたのですが、2012年あたりに2.x系列がリリースされて今も十分使えるプロダクトのようです。

## で、Seleniumを使うには
とりあえず **英語版の** Seleniumのサイトからダウンロードできます。Seleniumのサイト自体には日本語版があるのですが、日本語サイトからダウンロードできるのは1.xです。まずここで割とハマった。いくら「最新版は公式サイトを見てください」とはいえ・・・。

 * [Selenium公式サイト](http://docs.seleniumhq.org/projects/)

とりあえず、それぞれのファイルは以下の場所に配置します。

 * Selenium IDE→Firefoxに拡張機能としてインストールします
 * Selenium ServerとInternet Explorer Driver Server→あとで参照可能なフォルダに配置します。IE Driverはパスの通ったフォルダに置いておかないとダメらしいのでC:\Seleniumあたりにフォルダを作って適当においておきます。
 * Selenium Client & WebDriver Language Bindings→とりあえず自分がメインで使う言語のクライアントをインストールしておきます。自分はPythonを使いました。

なお、ここでのPythonは、Version2系統でなければダメなようです(3.xは各所に非互換の部分があるため、正常に動作しません)。自分は[Pythonの公式ページ](http://www.python.jp/news/python2.7.8.html)からダウンロードしましたが、(Selenium Clientのインストールに必要な)setuptoolsやpipが同梱されていないので、以下のサイトを参考にインストールします。

 * [Life with Python](http://www.lifewithpython.com/2012/11/Python-package-setuptools-pip.html)

# とりあえず、軽く使ってみる
簡単に使うには、ひとまずSelenium IDEを起動して操作を記録→再生するのが一番簡単です。

 1. Firefoxを起動し、Selenium IDEを起動する
 2. Selenium IDEの「アクション＞テストの記録」にチェックが入っているのを確認する
 3. Firefoxのウィンドウに戻り、テストしたいサイトを開く
 4. テストしたいページまでリンクを辿って移動する
 5. 「アクション＞テストの記録」のチェックを外して記録を停止する

大まかにはこんな感じで、簡単な動作コードができあがります。
![Selenium IDEウィンドウ](https://qiita-image-store.s3.amazonaws.com/0/14499/31414bbc-403a-ec2e-1a5d-89d0a6361acb.jpeg)

あとは、テストを行いたい行を選択して、右クリックメニューの「コマンドの挿入」、コマンドに「assertTitle」などのコマンドを入れてテストを追加していきます。このとき、期待する値は「値」フィールドではなく、「対象」フィールドに入れないといけないので注意(ここでまたハマった)
![assertコマンドの指定](https://qiita-image-store.s3.amazonaws.com/0/14499/809e76e2-c7e5-559a-6741-43289f3d78e8.png)

そのほか注意するべき点として、クリック後、ページ遷移が完了するまで待ちたい場合は、`click`コマンドでなく、`clickAndWait`コマンドを使うこと、Ajaxなど画面遷移せずに画面が切り替わる処理を待ちたい場合は、`waitForVisible`コマンドなどを使って要素の存在を確認すること くらいです。

# テストケースを出力する
テストケースをファイルに出力する場合は、「ファイル」メニューの「テストケースを保存」または「テストケースをエクスポート」を選択します。テストケースを保存を選択した場合、テーブルタグで一行に1つずつのテストコードが書かれたHTMLファイルが出力されます。

エクスポートを選ぶと、言語を指定してテストコードをファイルに保存できます。標準ではpython, ruby, c#, javaの4つの言語から選択できますが、コードフォーマットが気に入らない場合、別の言語で出力したい場合は、「オプション＞設定」より追加できます。

## エクスポートしたテストケースを実行する

エクスポートしたテストケースは、通常通りそれぞれのインタプリタを使って実行できます(ただし、それぞれの言語用のSeleniumクライアントモジュールが事前にインストールされている必要があります)。
ただし、前述の通り、Pythonを使う場合は、バージョン２系列である必要があります。３系列ではスクリプトが上手く動きませんので、ご注意ください。

また、自分の環境ではRubyで出力したファイルがのっけから構文エラーになって使えませんでした。C#などはコンパイルが面倒なので試していません。


言語名の後に「Remote Control」と書かれているものでエクスポートしたテストケースは、Selenium Serverを使って任意のブラウザを起動し処理しますので、事前にSelenium Serverを起動しておく必要があります。Selenium Serverの起動方法は以下のサイトを参照。

 * [Selenium Server](https://code.google.com/p/selenium/wiki/Grid2)

とりあえずこのような感じ。また何か見つけたら追記するかもしれません。
Vagrant ホストを git submodule として使う

Infrastructures as Codes と聞いたらこう思った。

- 開発環境が必要なときにパッとセットアップしていらなくなったらパッと捨てたい
- だけど環境を整備する操作の履歴はとっておきたい

追加でこれもあったらいいよね。

- 開発時には手元のエディターを使って、動作確認を Vagrant ホストでやりたい


というわけで git submodule 先生、出番です !!


開発環境の整備
--------------

まずローカルのどこかや github あたりにホストの設定をおいておく。たとえばこういうの。

https://github.com/januswel/centos6.5

各ブランチの位置づけはこう。

- master
    - サーバーの基礎設定だとか必須のパッケージインストールだとかをする
    - 他のブランチの土台
- その他
    - ミドルウェアや開発環境をのっける

上記リポジトリにはとりあえずで Node.js をつっこんだ nodejs ブランチがある。

https://github.com/januswel/centos6.5/tree/nodejs

ブランチは必要なものを適宜つくっていけばいいんだけど、基礎部分 master に変更があった場合は以下を参照して歴史改変していく前提。

http://qiita.com/janus_wel/items/45275f5fbc3823fa698f


実際の開発
----------

開発開始、となった際にまずプロジェクト用のディレクトリを切って、 git を使う準備をする。

```sh
mkdir -r /path/to/project/dir/
cd /path/to/project/dir/
git init
```

で、たとえば Node.js アプリを開発します、という場合は、こう。

```sh
git submodule add -b nodejs https://github.com/januswel/centos6.5.git vagrant
git commit -m 'Add vagrant host as a submodule'
```

<code>-b</code> でブランチ指定。サブモジュール追加後に commit しておく。

あとは Vagrant ホストをたちあげてプロビジョニングを走らせる。うちの場合こう。

```sh
cd vagrant
cp conf.yml.example conf.yml
vi conf.yml
vagrant up
cd ansible
ansible-playbook playbook.yml
```

conf.yml あたりのハナシは以下のようなことをしていると解釈してくださいな。全然本筋じゃないので無視していい。

- http://qiita.com/janus_wel/items/b379ab090f588288bbb9
- http://qiita.com/janus_wel/items/405998b2ebd47dd8b8af

これで開発環境が整った。楽 !!


開発は手元の環境で、動作確認は Vagrant ホストで
-----------------------------------------------

ガリガリと書くために Vagrantfile に以下の共有ディレクトリ設定をしてある。

```rb
  config.vm.synced_folder "..", "/shared"
```

/path/to/project/dir/vagrant に Vagrant ホストがある場合は /path/to/project/dir 以下が /shared として共有されるわけですはい。というわけで以下のように手元でコードを書いていける。 Node.js の例ね。

```sh
cd /path/to/project/dir
mkdir app
cd app
vi helloworld.js
```

これを動かすために vagrant ssh して以下のコマンドを打つ。

```sh
cd /shared/app
node helloworld
```

開発環境からアプリコードが独立できてるね。


他のメンバーは
--------------

普通の submodule の扱いと一緒。

```sh
git pull https://example.com/your-team/awesome-app.git
git submodule init
```

で、あとはホスト立ち上げのコマンド群を打っていく。


ホスト側に変更があったとき
--------------------------

以下のコマンドでアップデートできる。

```sh
git submodule foreach git pull --rebase
git commit -am 'Update vagrant host'
```

ホストの再セットアップが必要なら <code>vagrant destroy</code> して最初からやりなおせばいいじゃない。
[Git]ファイルの変更履歴を行単位（orコミット単位）で調べる方法

# 1.ファイルの「行単位」の変更履歴を確認

```
git blame ファイル名
```
このコマンドにより、各行の

```
コミットのハッシュ値 (名前 日時   行数) ファイルの中身
```

が閲覧できる。

# 2.「コミット単位」の変更履歴を確認
コミットのハッシュ値を`git blame`で確認し、

```
git show コミットのハッシュ値
```
を叩けばコミット単位で変更を確認できる。