OmniAICreator/Qiita-1.07M huggingface dataset:
passphraseの有無を手入力無しで判別する

```
openssl rsa -text -passin pass:[passphrase] -in [/path/to.pem] && echo success
```

手入力で判別するだけなら、↓等で聞かれるかどうかだけで良いのだけど自動でやりたかった。おそらくこんな需要はあまり無いと思うけど…

```
openssl rsa -text  -in [/path/to.pem]

```

### 参考

opensslコマンドtips — ありえるえりあ http://dev.ariel-networks.com/column/tech/openssl/view

このページでもman見ても「パスワード/password」と書いてあってpassphraseでも大丈夫かが心配だったがどうやら同じ事で良いらしい。
LXCのcached rootfsのupgradeする方法 (Ubuntu/Debian)

概要
----

`lxc-create`で作成されるrootfsのキャッシュですが、放っておくとupgradeが必要なパッケージが多くなっていきます。
start後に`apt-get upgrade`をやるのも情けない話ですので、create時に`apt-get upgrade`をするようなLXC templateを作るのもひとつの解決策です。

ですが、templateを作る程のでも無い場合は、cachedなrootfsを直接upgradeしてしまう方法を紹介します

実施
----

```
$ sudo mount -t proc proc /var/cache/lxc/trusty/rootfs-amd64/proc
$ sudo mount -o bind /dev /var/cache/lxc/trusty/rootfs-amd64/dev
$ sudo mount -t sysfs sys /var/cache/lxc/trusty/rootfs-amd64/sys
$ sudo chroot /var/cache/lxc/trusty/rootfs-amd64
# apt-get update ; apt-get upgrade
# exit
$ sudo umount /var/cache/lxc/trusty/rootfs-amd64/sys
$ sudo umount /var/cache/lxc/trusty/rootfs-amd64/dev
$ sudo umount /var/cache/lxc/trusty/rootfs-amd64/proc
```

解説
----

`lxc-create`は`/var/cache/lxc/HOGE`をコピーしているだけに過ぎないため、コピー元であるrootfsのツリーをupgradeしてあげれば、upgrade済のrootfsを基にしたコンテナが配備されます。

あとがき
-------

べ、 別にUbuntuじゃなくてもいいんだからね！
i8080 アセンブラ

#i8080 ニーモニック
```
mvi a, 00h  aレジに0x00をセット
mov a, d    dレジの内容をaレジにセット
sta 81e0h   aレジの内容をメモリ0X81e0にセット
lda 81e0h   aレジにメモリ0X81e0の内容をセット
inr a       a++
cpi 100     aレジの内容と100を比較、aレジの内容は変わらん
            フラグ変わる
sui 100     aレジの内容から100を引く、フラグ変わる
adi 100     aレジの内容に100を足す、フラグ変わる
jmp loop    loopに飛ぶ 
jz skip     zフラグが立った、skipに飛ぶ
jnz skip    zフラグが立たない、skipに飛ぶ
jc skip     cフラグが立った、skipに飛ぶ
jnc skip    cフラグが立たない、skipに飛ぶ
hlt         停止
push psw    aレジの内容とフラグをスタックに積む
pop psw     aレジの内容とフラグをスタックから取り出す
call echo   サブルーチンechoを呼ぶ
ret         サブルーチンから戻る
out 92h     i/oの0X92にaレジの内容をセット
```
#実行環境

[jsdo ohisama1](http://jsdo.it/ohisama1/zFlT)
世の中にはどんなライブラリがあって、どんなふうに動いているのかをサクッと見たい人に送る素敵アプリ

GitHub や Google Group を眺めていると、実にたくさんのライブラリプロジェクトがあります。
UI に関連するものもあれば、設計を整理するのを助けてくれるものもあり、様々です。

特に、UI に関連するものは、実際に動かすとどうなるのかが気になるところ。しかし、必ずしも README にスクリーンショットがあるとは限らないのが現状です。また、スクリーンショットがあっても、操作感がわからなかったりすることもあります。

そんなあなたへ、いろいろなライブラリのサンプルを寄せ集め、実際に動く様子を手に持って触れるアプリがありますのでご紹介。

for Android: [Libraries for Developers](https://play.google.com/store/apps/details?id=com.desarrollodroide.repos)
for iOS: [Libraries for Developers](https://itunes.apple.com/jp/app/libraries-for-developers/id653427112?mt=8)

片っ端からライブラリを寄せ集め、デモも組み込まれているすぐれもの。ライブラリの Author やライセンス情報も同時に閲覧できるようになっているため、実際に組み込みたいライブラリを見つけた時にも安心して使うことができます。
商品アップロードAPIで「Typeが指定されていません。」のメッセージが表示される解決方法

「商品アップロードAPI」で、新しい商品登録を行う処理を作成していますが、「Typeが指定されていません。」というメッセージが表示され、Typeを1,2,3,4 に変更して動作を試してみましたが、同様のメッセージが表示され、正常に処理ができません。

**リクエスト内容**

```
POST https://test.circus.shopping.yahooapis.jp/ShoppingWebService/V1/uploadItemFile?seller_id=セラーID HTTP/1.1
Authorization: Bearer アクセストークン
Host: test.circus.shopping.yahooapis.jp
Content-Length: 20
Expect: 100-continue

type=1&file=data.csv
```

**レスポンス内容**
```
<?xml version="1.0" encoding="UTF-8" ?>
<Error>
  <Message><![CDATA[typeが指定されていません。]]></Message>
  <Detail></Detail>
  <Code>it-09001</Code>
</Error>
```
お手数ですが、チェックする箇所などございましたら、教えていただけますでしょうか。

どうぞ、宜しくお願いいたします。
jqPlotで、曜日別に背景色を変える


## 前提
・グラフのX軸に日付を、MM/DD　の形式で表示させている。
・jqplotで棒グラフを使っている。
・土日祝日のときに背景色を変える。
・y軸の値は数字（パーセントなど、単位がついていないもの）

## 下準備
グラフが表示されるHTMLに、x軸の日付それぞれにデータタグを埋め込んでおく（土曜日、日曜日、こどもの日、など）

## 実施
`$.jqplot.postDrawHooks.push()` に、`$('.jqplot-xaxis-tick').length`間回すfor文を書く。

`$('.jqplot-xaxis-tick')`のそれぞれの値とデータタグを比較して、土日祝日であればjqplotのオプションの中にcanvasOverlay.objectsとして内容をpushする。

あとはjqplotオプションを指定して`jQuery.jqplot()`を実行してやればよい。

以上

## 使い道ある？
土日祝日と平日の場合で、グラフの背景を変更させたいって要望があったのでやりましたが、具体的にどの程度効果があるかわかりません。。

むしろ知っている人がいたら教えてほしいです。
コマンドラインからyoutubeを再生する


## 使うもの
- youtube-dl
- mplayer (or [mpv](http://mpv.io/manual/master/))

## install
> https://github.com/rg3/youtube-dl/blob/master/README.md#installation

### Mac

```:Homebrew
$ brew install youtube-dl mplayer
```

### Linux

```:apt*/yum
$ sudo apt-get install youtube-dl mplayer
```

### Windows

```:youtube-dl.exe
https://yt-dl.org/latest/youtube-dl.exe
```

> https://github.com/rg3/youtube-dl/releases

```:mplayer-win
http://oss.netfarm.it/mplayer-win32.php
```

## update

```:native
$ sudo youtube-dl -U # -U/--update
# or
youtube-dl -U
```

## python-pip

```:install
$ sudo apt-get install python-pip # if needed
$ sudo pip install youtube-dl
```

```:update
$ sudo pip install -U youtube-dl # -U/--update
```

## コマンド
通常再生

```
$ youtube-dl 'https://www.youtube.com/watch?v=hoge' -o - | mplayer -
```

音声のみ

```
$ youtube-dl 'https://www.youtube.com/watch?v=hoge' -o - | mplayer - -novideo
```

or

```:fetch-sound-only
$ youtube-dl 'https://www.youtube.com/watch?v=hoge' -f bestaudio -o - | mplayer -
```

<hr>
## mpv
next mplayer2

- https://github.com/mpv-player/mpv
- http://mpv.io

### install
- http://mpv.io/installation/

### play

```:play
$ mpv 'https://www.youtube.com/watch?v=hoge'
```

```:sound-only
$ mpv 'https://www.youtube.com/watch?v=hoge' --no-video # or -no-video
```

> http://mpv.io/manual/master/
Dropwizard に学ぶ / Jersey ResourceConfig

* [Dropwizard](https://dropwizard.github.io/dropwizard/index.html)
* [Jersey 1.18 User Guide](https://jersey.java.net/documentation/1.18/index.html)

## Hello World

Jersey-1.x での Hello World です。

```java:src/main/java/app/resources/AppResource.java
package app.resources;

import javax.ws.rs.*;
import javax.ws.rs.core.*;

@Path("/")
public class AppResource {
    private final String message;

    public AppResource() {
        message = "Hello World!";
    }

    public AppResource(String message) {
        this.message = message;
    }

    @GET
    @Path("hello")
    @Produces(MediaType.TEXT_PLAIN)
    public Response hello() {
        return Response.ok(message).build();
    }
}
```
```java:src/main/java/app/AppResourceConfig.java
package app;

import com.sun.jersey.api.core.PackagesResourceConfig;

public class AppResourceConfig extends PackagesResourceConfig {
    public AppResourceConfig() {
        super("app.resources");
    }
}
```
```xml:web.xml
<web-app>
  <filter>
     <filter-name>Jersey Web Application</filter-name>
     <filter-class>com.sun.jersey.spi.container.servlet.ServletContainer</filter-class>
     <init-param>
         <param-name>javax.ws.rs.Application</param-name>
         <param-value>app.AppResourceConfig</param-value>
     </init-param>
   </filter>
   <filter-mapping>
     <filter-name>Jersey Web Application</filter-name>
     <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>
```
```xml:pom.xml
...
<properties>
  <jersey.version>1.18.1</jersey.version>
  ...
</properties>
<dependencies>
  <dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>${jersey.version}</version>
  </dependency>
  <dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-servlet</artifactId>
    <version>${jersey.version}</version>
  </dependency>
  ...
</dependencies>
...
```

## ResourceConfig

`PackagesResourceConfig` を使えば、指定パッケージ内のリソースをまとめて読むことができますが、コンストラクタに引数を渡すことができません。代わりに `ScanningResourceConfig` を使うことで、コンストラクタ内で `getSingleton` で管理下のインスタンスを取り出して、リソースのインスタンスを追加することができます。

```java:AppResourceConfig.java
package app;

import com.sun.jersey.api.core.ScanningResourceConfig;

import app.resources.AppResource;

public class AppResourceConfig extends ScanningResourceConfig {
    public AppResourceConfig() {
        getSingleton().add(new AppResource("Hello! Created at " + new java.util.Date()));
    }
}
```

Dropwizard では、以下のような方法で `JerseyEnvironment#register` でリソースを登録しますが、結果的には `ScanningResourceConfig` を継承した  `DropwizardResourceConfig` を経由して、同じ方法で追加されることになります。

```java
@Override
public void run(HelloConfiguration config,
                Environment environment) {
    HelloService helloService = config.getHelloServiceFactory.build();
    environment.jersey().register(new HelloResource(helloService));
}
```

Dropwizard では、DI コンテナに頼らずに、シンプルにコンストラクタ引数で依存オブジェクトを渡す慣習になっています。登録するリソースが多くなると一つ一つ書くのは手間ですが、リソースクラスからインジェクション関連のアノテーションを排除することができ、依存ライブラリも少なくてすみます。
javascriptのnullは 0以上 0以下で 0ではない

少しはまったから備忘録として。
どうやらjavascriptのnullは0以上0以下かつ0ではないらしい。

![javascriptの闇.png](https://qiita-image-store.s3.amazonaws.com/0/11510/da23d27d-395c-cfe9-84b3-da34b2f9d479.png)

仕様としてjavascriptは内部に+0や-0というものを持っているようです。javascriptの闇を見ました。

# 参考URL
[JavaScriptの動かないコード　(中級編)　nullが0以上0以下と認識されてしまう](http://d.hatena.ne.jp/language_and_engineering/20090906/p1)
Junos基本集


####コンソール接続
***

ターミナルソフトの設定

* ボーレート：9600bps
* データビット数：8
* パリティ：無し
* ストップビット：1
* フローコントロール：無し

####初回ログイン
***

初回はrootでログインしてシェルコマンドモードに入る。
パスワードは設定されていないのでブランクでenterを実行。

```
login:root
Password:
root@%
```

cliコマンドでcliオペレーションモードに入る。

```
root@%
root@%cli
root>
```

####シャットダウン
***
JUNOSが動作するプラットフォームはFreeBSDが動作するUNIXホストのため、コマンドを用いて正確にシャットダウンする必要がある。

request system haltコマンドでシャットダウンを行う。

```
root>request system halt
Halt the system ? [yes,no] (no) yes
```

1時間後にシャットダウン

```
root>request system halt in 60
```

すぐにシャットダウン

```
root>request system halt at now
```

時間指定シャットダウン(ここでは22時を指定)

```
root>request system halt at 22:00
```
Apple Magic Track Padと Magic Mouse を同時に使う２つの理由

#Magic Trackpad使っていますか？
トラックパッドとして使えるものの、マウスの代わりにはならない。。。。
発売時に注目を集めたMagic Trackpadですが、周りの人の反応を聞くとその評価はイマイチだったりします。

とはいえ天下のApple製品ということで、捨てる訳にもいかずに眠らせている方もいるのではないでしょうか？

#①LaunchPadの立ち上げが便利
３本指でピンチすると、LaunchPadが立ち上がります。
ここからアプリの名称で絞り込んで立ち上げると便利です。

3rdパーティ製のランチャーをインストールするという手もあるのですが、
Apple謹製のデバイスとアプリだけで済むので、精神的にほっこりします。

![トラックパッド.png](https://qiita-image-store.s3.amazonaws.com/0/50037/01a36d55-5569-6a8d-3053-3bb8d0d79f82.png)

#②フルスクリーンの切り替えが便利
MagicMouseの２本指ドラッグで事足りるのですが、
ファイルやフォルダをドラッグしていると、フルスクリーン間の移動ができなくなってしまい、

『タスケテ！！』

感満載になることがあります。Ctrl+左右キーを器用に使う選択肢や、しつこく左端に居ると切り替えてくれますが、
そんな時にデスク左側にトラックパッドがあると、
３本指の左右スワイプでフルスクリーンの移動ができ、

『タスカッタ！！』感と
『スマート！！』感が半端ではありません。

![トラックパッド_と_マジックトラックパッドを使う理由.png](https://qiita-image-store.s3.amazonaws.com/0/50037/6109ff68-02e6-8059-4cd0-e5e7d91afc34.png)

#総評
実際、UXに非常にこだわるMacでは必須ではないアイテムですが、
余らせたMagic Trackpadを有効活用したいという方は、一度試してみてください笑
Qiita内ランキングサイト一覧


Qiitaでのストック数を会社や個人でのランキングをしてくれているサイト一覧。
他にもあったら教えてください。
(2016/6/4: スクリーンショットを更新しました)

## Qiita Orgs Ranking
[![qiita-org-ranking.png](https://qiita-image-store.s3.amazonaws.com/0/6664/a955ad67-8fea-a4e6-0ad1-5c0a9e523481.png "qiita-org-ranking.png")](http://qiita-orgs-rank.mat-aki.net/)


http://qiita-orgs-rank.mat-aki.net/


QiitaのOrganizationのランキングが見えるシンプルなQiita風のサイト。
各Organizationの中でのランキングも見やすい。
ソニックガーデンの中の人が作っている模様。

## Qiita organizations graph


[![qiita-organization-graph.png](https://qiita-image-store.s3.amazonaws.com/0/6664/2acd2bb9-bbe9-5201-03fb-168247a99221.png "qiita-organization-graph.png")](http://www.sasaplus1.com/qiita-organizations-graph/)


http://www.sasaplus1.com/qiita-organizations-graph/


Organizations Graphと言いつつ、いきなり個人毎のstatsが出てくるｗでも会社毎にも見える。
Google Chartを使っていてシンプル。棒グラフと円グラフ2つでわかりやすい。
投稿数毎のランキングも見える。
## qrank

[![qrank.png](https://qiita-image-store.s3.amazonaws.com/0/6664/3b88b190-aad4-6db8-b3bc-4b52911f82c7.png "qrank.png")](http://qrank.wbsrv.net/)


http://qrank.wbsrv.net/

ランキングもあるけどトップは人気記事を表示。
言語タグごとのランキングが見れるのもいい。
はてブ数がついてるのが特徴。
CGDataProviderCreateWithDataで作成したデータを解放する


写真撮影のときにこの関数を使っていて、メモリが解放されてないので写真を撮るたびに使用メモリがガンガン増えていた…という話。

定義箇所を見るとこんな感じ。

```CGDataProvider.h
/* The callback used by `CGDataProviderCreateWithData'. */

typedef void (*CGDataProviderReleaseDataCallback)(void *info, const void *data,
  size_t size);

/* Create a direct-access data provider using `data', an array of `size'
   bytes. `releaseData' is called when the data provider is freed, and is
   passed `info' as its first argument. */

CG_EXTERN CGDataProviderRef CGDataProviderCreateWithData(void *info,
  const void *data, size_t size, CGDataProviderReleaseDataCallback releaseData)
  CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
```

第4引数の`releaseData`に解放時のコールバック関数を入れるとのこと。
そのときオマケで第1引数の`info`まで付けてくれるらしい。

普通は`data`を解放するだけだろうけど、せっかくなので`info`にもなにか渡してみる。

```hoge.mm
static void releaseData(void *info, const void *data, size_t size)
{
    NSLog(@"%@\n", (__bridge_transfer NSString*)info);
    free((unsigned char *)data);
}
```

```hoge.mm
    NSString *str = @"Data Released!";
    CGDataProviderRef provider = CGDataProviderCreateWithData((__bridge_retained void*)str, buf, len, releaseData);
```
Linux cmd


###Shell script in background
```bash
nohup script.sh &
```

###Clear terminal
```bash
clear  or  ctr+l
```

###Apache Virtual Host Dump
```bash
sudo apachectl -t -D DUMP_VHOSTS
```

###Reload .bash_profile
```bash
source ~/.bash_profile
```

##Screen

###To start the section
```
screen -R node
```

###Detech screen

```
press ctrl + a AND d
```

###List all screen section

```
screen -la
```

###To restore screen section 

```
screen -r node(name)
```

###T find the program running on a port
```
sudo lsof -i :80 # checks port 80
```
Trello API を叩いてカードを作成する方法（curl利用）


「Trello API を叩いてカードを作成する」という基本的なことをしてみたかったので，原始的に curl を利用して流れを確認して手順にまとめました．


# アクセスのための準備

## API Key の取得

ここにアクセスします

https://trello.com/1/appKey/generate


すると Key: というボックスがあると思いますのでその値をコピーします．


## API Token の取得

今回は，期限無制限でRead/Write権限のついたトークンを取得します．
下記のURLをブラウザで開きましょう

https://trello.com/1/authorize?key=<上で取得したKey>&name=<application名（任意）>&expiration=never&response_type=token&scope=read,write


するとこんな感じの画面が開かれるので Allow しましょう

![Auth](http://i.gyazo.com/f927bc2b55a6023e736352f281c80cb6.png)


Allow すると下記のようにシンプルなページが表示されるのでキーをコピーします．

```
You have granted access to your Trello information.

To complete the process, please give this token:

  <ここにキーが表示される>
```


# Trello のエンティティ関係

```A ---> B``` を AとBが1対多の関係としたときに次のようなエンティティ関係のようです．

```
Member ---> Board ---> List ---> Card

```


つまりカードを投稿するには，次の順で情報を取得していく必要があります．

1. 投稿したい Board の ID を取得する
2. 投稿したい List （Todo, Do, Done など） の ID を取得する
3. Card を投稿する

## 1. Board の ID を取得する

```
curl "https://trello.com/1/members/<username>/boards?key=<Key>&token=<Token>"
```

で取得することができます．
しかしこれだけだと大量のデータに埋もれてIDを取得できないので，APIの機能にあるフィルタをかけてみましょう．


```
$ curl "https://trello.com/1/members/<username>/boards?key=<Key>&token=<Token>&fields=name"
```

返却値を整形して見ると

```
[
    {
        "name": "Welcome Board",
        "id": "XXXXe2eaed887e7c007d46"
    },
    {
        "name": "test",
        "id": "XXXXc321d57991e7312a7d4"
    }
]
```

てな感じで Board IDを取得できました．

## 2. List の ID を取得する

Board一覧と同様にListの一覧を取得しましょう．

```
$ curl "https://trello.com/1/boards/<BoardのID>/lists?key=<Key>&token=<Token>&fields=name"
```

結果はこんな感じです．あと一息！

```
[
    {
        "id": "XXXXXX57991e731XXXXX",
        "name": "To Do"
    },
    {
        "id": "XXXXXXd57991e73XXXXXXX",
        "name": "Doing"
    },
    {
        "id": "XXXXXXXX57991eXXXXX",
        "name": "Done"
    }
]
```

## 3. カードを投稿する

カードを投稿しましょう！カードは様々な値を含んで投稿することができます．
詳しくは，[post-1-cards の仕様書](https://trello.com/docs/api/card/index.html#post-1-cards)を参照ください．

今回はシンプルにタイトルのみのカードを投稿します．

```
curl -X POST "https://trello.com/1/cards?key=<Key>&token=<Token>&idList=< 2. で取得したリストのうち投稿したいリストのID>&name=カードタイトル"
```

きちんと登録されていました．

![result](http://i.gyazo.com/0d5a9b0092a552623970a0bb89996e91.png)



# おわりに

今回は，Trello の API の使用方法について調査しました．
Trello にはたくさんのAPIが用意されているようなので，いろいろ活用したいですね．
Capistrano3でGithubにあるコードをデプロイ

#初期設定

##Capistranoのインストール

local（デプロイを行う場所）にCapistranoをインストールします

```
me@local $ gem install capistrano
```

##デプロイ用ユーザーの作成

チーム内で共通のリリースを行いたいので、remote（デプロイ先のホスト）にそれ用ののユーザーを作成

```
root@remote $ adduser deploy
root@remote $ passwd -l deploy #パスワードログインを禁止
```

##deployユーザーのauthorized_keysに公開鍵を追加

deployユーザーのauthorized_keysにローカルの公開鍵（Githubに登録済み）を追加。

```
me@localhost $ ssh root@remote
    root@remote $ su - deploy
    deploy@remote $ cd ~
    deploy@remote $ mkdir .ssh
    deploy@remote $ echo "ssh-rsa AAAAB3NzaC1yc2EA***********#公開鍵" >> .ssh/authorized_keys
    deploy@remote $ chmod 700 .ssh
    deploy@remote $ chmod 600 .ssh/authorized_keys
```

これによって、deployユーザーでsshログインできるようになり

```
me@local $ ssh deploy@remote

deploy@remote $
```

さらに、-Aオプションをつけ、鍵を持ち回る設定にすることで、Githubの認証も可能となる

```
me@local $ ssh -A deploy@remote 'ssh git@github.com'
    Hi kiriki-qwt! You've successfully authenticated, but GitHub does not provide shell access
```

##.ssh/configの設定
deployユーザーのssh設定ファイルに以下を追記。

```
StrictHostKeyChecking no
```

##deployユーザーにパスワードなしsudoを許可

Capistranoのタスク内でsudoをできるように、visudoで以下の行を追加

```
deploy ALL=NOPASSWD:ALL
```


#タスク設定

##Capistranoの初期化

アプリのディレクトリに移動してCapistranoを初期化する
```
me@local $ cd path/to/aplication_dir
me@local $ cap install
```

すると、以下のように自動でファイルが生成される

```
├── Capfile
  ├── config
  │   ├── deploy
  │   │   ├── production.rb
  │   │   └── staging.rb
  │   └── deploy.rb
  └── lib
      └── capistrano
              └── tasks
```


##testタスクの作成、実行

config/deploy/以下に開発環境用の設定ファイルを作成して、server、user、rolesを記述

```
me@local $ vi config/deploy/development.rb


#config/deploy/development.rb
server 'remote.server.name', user: 'deploy', roles: %w{web}

```

config/deploy.rbをすべてコメントアウトし、以下のようなテストタスクを記述

```
#config/deploy.rb

desc "テストタスクです"
task :test do
  on roles(:web) do
    execute "pwd"
  end
end
```

`cap -T` を実行すると、テストタスクが表示されているはず。そのまま実行してpwdが実行されればOK。

```
me@local $ cap -T
  *****
  *****
  cap test                           # テストタスクです

me@local $ cap development test
  INFO[2d7af785] Running /usr/bin/env pwd on remote.server.name
  DEBUG[2d7af785] Command: /usr/bin/env pwd
  DEBUG[2d7af785] 	/www/devel/kiriki
  INFO[2d7af785] Finished in 0.853 seconds with exit status 0 (successful).
```

##デプロイタスクの作成、実行

いよいよGithubからコードをチェックアウトしてきます。


```
#config/deploy.rb

set :application, 'tech.qwtt.jp'
set :repo_url, 'git@github.com:github-repo.git'
set :deploy_to, '/www'#環境によってパスが変わる場合は config/deploy/***.rbに定義する

set :pty, true #タスク内でsudoするためにこれが必要！！

desc "deploy tech.qwtt.jp"
task :deploy do
  on roles(:web) do
    application = fetch :application
    deploy_to = fetch :deploy_to
    
    execute "sudo chown deploy:deploy #{deploy_to}"
    
    if test "[ -d #{deploy_to}/#{application} ]"
      execute "cd #{deploy_to}/#{application}; git pull; sudo sh setup.sh"
    else
      execute "cd #{deploy_to}; git clone #{fetch :repo_url} #{application}; cd #{application}; sudo sh setup.sh"
    end
  end
end
```
iOS Metalで流体シミュレーション！

ローレベルグラフィックスAPI、Metal、せっかく出たからには使ってみないわけにはいきません。
残念なことに、あんまり使ってみた等の情報が少ないです。
せっかくなので、とっかかりとして流体シミュレーションにチャレンジします。

非常に素直なAPIで、OpenGL ES等と比べるとクリーンで明瞭なので、
とても扱いやすい印象でした。

詳細はこちら
http://wowdev.jp/?p=1380

勉強会でのスライドも公開しています
http://www.slideshare.net/ushiostarfish/metal-fuild-simulation

手っ取り早くソースが欲しい方はこちら
https://github.com/Ushio/MetalFluidDemo

デモの動画はこちらです。
https://flic.kr/p/oBpSPo

注意点としては、A7チップを持つデバイスでしか動作しない点です
シミュレータでも動作しません

※Xcode Version 6.0.1、iPhone6に対応しました(github)
gpgでパスフレーズを聞かれずにファイルを復号化する方法

# バッチファイルなどからgpgを使うには

簡単で、以下の通りのコマンドでOK

`echo 【復号化パスフレーズ】| gpg --passphrase-fd 0 --decrypt --batch --no-secmem-warning 【復号化したいgpgファイル】
`

「--passphrase-fd 0」と「--batch」オプションを用いて、標準出力でパスフレーズを渡す方法でとっても簡単です。

なお、「--no-secmem-warning」は「gpg: Warning: using insecure memory!」のエラーが出ないようにするおまじないです。
unicorn用upstart script(redmine,ubuntu)

Ubuntu14.04にRedmine&Unicornをセットアップし、Nginxとの連携も確認して、さて起動のスクリプトの準備と思ったところでハタと気がつきました。

**Upstart**じゃん！

ということでUpstart用のスクリプトを書きました。

で、調べて見ると意外なほどに情報がない。とりあえず見つけた[Upstart を使ってお手軽 daemon 化](http://heartbeats.jp/hbblog/2013/02/upstart-daemon.html)経由でたどりついた[Upstart Intro, Cookbook and Best Practises
](http://upstart.ubuntu.com/cookbook/upstart_cookbook.pdf)を参照しました。



```/etc/init/redmine.conf
#/etc/init/redmine.conf
description "Redmine"
author "Hiroshi Obata <obata.hiroshi@propos.jp>"


start on runlevel [2345]
stop on runlevel [016]


env PATH=/bin:/usr/bin:/sbin:/usr/sbin:/home/hiro/.rbenv/bin:/home/hiro/.rbenv/shims

env ENVIROMENT=production
env CONF=/var/redmine/config/unicorn.rb


chdir /var/redmine
exec bundle exec unicorn_rails -c ${CONF} -E ${ENVIROMENT}

```

中身はほとんど説明不要だと思います。/var/redmineにインストールしたredmineを起動しています。envでPATHなどの環境変数を指定しています。

使い方

redmine起動

```
sudo initctl start redmine
```

redmine終了

```
sudo initctl stop redmine

```

### はまったところ

あたり前ですが、Unicorn起動時に-Dオプションは不要です。起動スクリプトからそのままコピペしてはまりました。
ForgeMODとBukkitPluginの連携方法

ForgeMODとBukkitPluginを連携させるには**PluginMessage**を使う
例外は一部省いているので各自つけてください

## ForgeMOD側の処理(1.7.2/1.7.10で確認済み)

チャンネル名をTestChannelで作り、送受信できるようにする

```java:Forge側
    public static FMLEventChannel channel = NetworkRegistry.INSTANCE.newEventDrivenChannel("TestChannel");

    @Mod.EventHandler
    public void init(FMLInitializationEvent event) {
        channel.register(this);
    }

    /**
     * クライアントからサーバーへパケットを送るときに呼ばれる
     */
    @SubscribeEvent
    public void onServerPacket(FMLNetworkEvent.ServerCustomPacketEvent event) {
        Packet packet = event.packet.toC17Packet();
        if (packet instanceof C17PacketCustomPayload){
            C17PacketCustomPayload pluginmessage = (C17PacketCustomPayload) packet;
            System.out.println("送信チャンネル: " + pluginmessage.func_149559_c());
            System.out.println("内容"+ new String(pluginmessage.func_149558_e(), "UTF-8"));
        }
    }



    /**
     * サーバーから受信したときに呼ばれる
     */
    @SubscribeEvent
    public void onClientPacket(FMLNetworkEvent.ClientCustomPacketEvent event) {
        Packet packet = event.packet.toC17Packet();
        if (packet instanceof C17PacketCustomPayload){
            C17PacketCustomPayload pluginmessage = (C17PacketCustomPayload) packet;
            System.out.println("受信チャンネル: " + pluginmessage.func_149559_c());
            System.out.println("内容"+ new String(pluginmessage.func_149558_e(), "UTF-8"));
        }
    }
```

```java:プラグインメッセージの送り方
		try {
			byte[] message = str.getBytes("UTF-8");
			ByteBuf data = Unpooled.wrappedBuffer(message);
			C17PacketCustomPayload packet = new C17PacketCustomPayload("TestChannel", data);
			FMLProxyPacket pkt = new FMLProxyPacket(packet);
			channel.sendToServer(pkt);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
```

## Bukkit側の処理

プラグインメッセージを送受信するために、**PluginMessageListener**の実装と、
onEnableに以下のように記述します

```java:onEnable
	@Override
	public void onEnable(){
		Bukkit.getMessenger().registerOutgoingPluginChannel(this, "TestChannel");
		Bukkit.getMessenger().registerIncomingPluginChannel(this, "TestChannel", this);
	}

	@Override
	public void onPluginMessageReceived(String channel, Player player, byte[] message) {
		System.out.println("チャンネル名:"+channel);
		System.out.println("プレイヤー名:"+player.getName());
		try {
			System.out.println("内容:"+new String(message, "UTF-8"));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}
```

```java:プラグインメッセージの送り方
player.sendPluginMessage(this, "TestChannel", new String("テスト").getBytes("UTF-8"));

```








## 参考にしたもの
[http://wiki.vg/Protocol#Plugin_Message](http://wiki.vg/Protocol#Plugin_Message)
[http://wiki.vg/Plugin_channel](http://wiki.vg/Plugin_channel)
AppleScriptObjC上でAppleScriptを動かす

いろいろと試行錯誤してみたのですが、自分はこれに落ち着きました。
（XcodeでCocoa-AppleScript Applicationを作る場合）

Resources内に格納したASDialog.scptにパラメータを渡して、runしています。
（load〜runでは、AppleScriptObjC側で読み込んでしまうのが原因か、うまくいかないケースが有りましたので直接runしています。）
パラメータや戻り値はstringやtextではなくUnicode textで統一。

```applescript:
----------【AppleScriptファイル内】

on run as_prm
	activate
	display dialog (item 1 of as_prm) as Unicode text
	display dialog (item 2 of as_prm) as Unicode text
	
	return "完了" as Unicode text
end run


----------【AppleScriptObjCファイル内】

property NSBundle : class "NSBundle"

(*スクリプトファイルのパス取得*)
set as_path to (NSBundle's mainBundle()'s resourcePath()) as Unicode text & "/ASDialog.scpt"

(*パラメータを渡してrun 戻り値あり*)
set as_prm to {"ダイアログ1回目" as Unicode text, "ダイアログ2回目" as Unicode text}
set as_result to run script as_path with parameters as_prm

log as_result
```
C#を使って驚いたこと

## あるよね

* ラムダ式完備
* Linqが便利すぎる
* Dictionary
* Action+ラムダ式でスコープを柔軟に変更できるメソッドを作れる

ラムダ式はJavaに慣れすぎててすごく自然に書かれてたのを見てびっくりした ここまで普通に使われていたとは...

Action利用例

```csharp
 Action<string> addText = (s) =>
            {
                App.Current.Dispatcher.Invoke(new Action(() =>
                {
                    listbox1.Items.Add(s);
                    listbox1.SelectedIndex = listbox1.Items.Count;
                }));
            };
```

これを呼び出すのは`addText.run(s)`でもなく`addText.exec(s)`でも無く、`addText(s)`というJavaではありえない仕様。この仕様のお陰でメソッド内でのみ利用可能などのスコープの柔軟性を作っているのは非常に便利だと思う。
この`addText`メソッド(?)で利用した`App.Current.Dispatcher.Invoke(Action)`はWPFフォームのコントロールを別スレッドから呼び出す際に使用するらしい。
JavaとCsでのスレッドの利用法が微妙に違うのは今後慣れるしかなさそう

個人的に残念なのはコードフォーマットのデフォルトのスタイルが気に入らないだけなのでなんとか設定でねじ伏せようと思います。
git 同一リポジトリ内でプラットフォームごとにリモートブランチを切って管理する

要はリモートブランチを別ブランチを元に rebase したい場合のハナシ。

特定のプラットフォームにだけは少し設定を変えたいだとかの場合、 master ブランチをベースとしてプラットフォーム名でブランチを切ってリモートにあげたりしたい。たとえばこういう状況。

```
      , C   origin/ios
A - B       origin/master
      ` D   origin/android
```

B が基本の共通機能の最新の commit で C が iOS 用の設定を含んだバージョン、 D が Android 用の設定を含んだバージョン、という形。

別にプラットフォームに限ったハナシじゃなく、特定顧客向けの設定だとかの管理も同様。


基本機能に変更があった場合
--------------------------

基本機能に手直しを入れたり追加があったりするとそれを ios ブランチや android ブランチにも適用したい。そのときの心情としてはこうなってほしいはずだ。

```
          , C   origin/ios
A - B - E       origin/master
          ` D   origin/android
```

普通の <kbd>git push</kbd> は通らないが、 <kbd>--force-with-lease</kbd> オプションを使えばこれに似たようなことはできる。たとえば origin/ios がローカルの ios ブランチに対応しているとして、以下の操作で実現可能。

```sh
git checkout ios
git rebase master
git push --force-with-lease origin ios
```

<kbd>--force-with-lease</kbd> は最後に fetch したあとにメンバーが push した場合に push を失敗させるもの。この代わりに fetch 時間をチェックしない <strong><kbd>-f</kbd> / <kbd>--force</kbd> を使うとタイミングによってはメンバーの commit をふっ飛ばしてしまう</strong>ので複数人でいじってる場合は使わないほうがいい。


やっていることはリモートブランチの歴史改変
------------------------------------------

似たようなこと、といったのは上記の <kbd>git push --force-with-lease</kbd> を使った操作だと実際のコミットグラフは以下のように C が C' 、 D が D' になるから。

```
          , C'  origin/ios
A - B - E       origin/master
          ` D'  origin/android
```

ダッシュありなしの<strong>違いは commit id</strong>。ブランチの元になる commit が B から E に変更されるのでそれに引きづられてブランチ側の id も変わる。

そもそも git は push するときにローカルとリモートで共通の祖先を持つかどうかをチェックする。 C の親は B 、 C' の親は E なので前述したように <kbd>--force-with-lease</kbd> なしの push は失敗する。だけど <kbd>--force-with-lease</kbd> オプションはこのチェックを迂回してリモートを書き換えてしまうらしい。

というわけで、祖先を書き換えてしまう、つまり歴史改変をやっているというわけだ。


コマンド長いよ !
----------------

.gitconfig に以下を書いておく。

```conf
[alias]
    overwrite = push --force-with-lease
```

これで以下のように使える。

```sh
git overwrite origin ios
```
GSN/D-Case解説ビデオ集


# GSN(Goal Structuring Notation)およびD-Case(Dependability Case)についての日本語解説ビデオ

ビデオは新着順です。


| Video | Contents |
|--------|--------|
| ![kobito.1409013326.991889.png](https://qiita-image-store.s3.amazonaws.com/0/51055/f77b103f-9435-5046-4067-211163eecb8b.png "kobito.1409013326.991889.png")| 技術レビューにおけるGSN, D-Caseの現場活用法(1)〜レビューの前提となる基準を作る<br> 株式会社 デンソークリエイト小林展英さん <br> https://www.youtube.com/watch?v=SmI6_FPjlaU
|[![kobito.1409015337.464171.png](https://qiita-image-store.s3.amazonaws.com/0/51055/de5c6d1d-5692-7d21-8651-ec97e50bae29.png "kobito.1409015337.464171.png")](https://www.youtube.com/watch?v=SmI6_FPjlaU)|GSNとD-Case、パターンとモジュール化、日本流の差分・派生開発への適応 電気通信大学 松野先生 https://www.youtube.com/watch?v=fNCjNx-frmQ
|![kobito.1409013991.354766.png](https://qiita-image-store.s3.amazonaws.com/0/51055/108687a9-dafd-7eb0-138a-7c70845a7fe2.png "kobito.1409013991.354766.png")|GSNの拡張, D-Caseと国際標準化への動き - 電通大学 松野先生 x 平鍋対談 電気通信大学 松野先生 https://www.youtube.com/watch?v=vZJmNH2vIus
|![kobito.1409015283.932070.png](https://qiita-image-store.s3.amazonaws.com/0/51055/d26f4507-ea5d-fd92-bbc5-594aaa8966b9.png "kobito.1409015283.932070.png")|GSN, D-Caseの動向と必要性 - 名古屋大学 山本先生 x 平鍋対談 https://www.youtube.com/watch?v=nGJbI2PmQn8
|![kobito.1409015998.058579.png](https://qiita-image-store.s3.amazonaws.com/0/51055/f45016dc-d9f5-06c7-e621-40b7e306e456.png "kobito.1409015998.058579.png")|GSN解説(2) - GSNの基礎とその構成要素 名古屋大学 山本修一郎教授 https://www.youtube.com/watch?v=0OOxmxrnZS0
|![kobito.1409015886.547645.png](https://qiita-image-store.s3.amazonaws.com/0/51055/85435f26-b843-521b-a3b1-fbbc19b76dbb.png "kobito.1409015886.547645.png")|GSN解説(1) - GSN (Goal Structuring Notation)とは何か？名古屋大学 山本修一郎教授 https://www.youtube.com/watch?v=cV8oJ4mcMwM


#DEOS の所真理雄(理事長)のコンセプトトーク

| Video | Contents |
|--------|--------|
|![kobito.1409016735.324671.png](https://qiita-image-store.s3.amazonaws.com/0/51055/a8c41206-cba6-b61b-2e04-1f7a22066726.png "kobito.1409016735.324671.png")|所さん、TED に登場！<br>"Reductionism cannot be applied to complex or open systems.<br>https://www.youtube.com/watch?v=dKIOuWYyU28
|![kobito.1409017168.079812.png](https://qiita-image-store.s3.amazonaws.com/0/51055/cccb915f-26f5-50a9-61a2-141c3d2105ea.png "kobito.1409017168.079812.png")|Mhttps://www.youtube.com/watch?v=SmI6_FPjlaUario Tokoro on Open System Dependability ICR/WIN Joint Seminar <br> https://www.youtube.com/watch?v=QnnqHEV1SEM
|
Sublime Text 2のLaTeXToolsの設定


webで情報を検索すると，古いバージョンのLaTeXToolsの設定方法しか書いてないので混乱した．．．ので覚書．

- LaTeXToolsのバージョン：2014-3-12
- 基本はREADMEを読む．



準備
====
1. Sublime Text 2をインストール，LaTeXToolsパッケージをインストール
2. MacTeX2014をインストール．もしくはlatexmkがあればOK

Sublime Text 2の設定
====
1. `Sublime Text 2->Preference->Package settings->LaTeXTools->Setting User`を開く
2. `"osx"`の`"texpath"`に，`latexmk`へのパスを追加．MacTexならすでに`/usr/texbin`が追加されているので何もしなくてもOK
3. "builder_settings"の中に以下のものを追加．

```python:
		// General settings:
		// See README or third-party documentation
		"command": ["latexmk", "-cd", "-f", ""], // これを追加
```
4. `Sublime Text 2->Preference->Package settings->LaTeXTools->Reconfigure...`を選択して，OKを押す．


latexmkの設定
===

##日本語latexソースの場合
デフォルトの~/.latexmkrc，もしくは"latexソースのあるディレクトリ"/.latexmkrcに以下のものを書く．

```bash:これはwebで検索するとよく見かける設定．
#!/usr/bin/env perl
$latex            = 'platex -synctex=1';
$latex_silent     = 'platex -synctex=1 -interaction=batchmode';
$bibtex           = 'pbibtex';
$dvipdf           = 'dvipdfmx %O -o %D %S';
$makeindex        = 'mendex %O -o %D %S';
$max_repeat       = 5;
$pdf_mode	  = 3; # generates pdf via dvipdfmx

# Prevent latexmk from removing PDF after typeset.
# This enables Skim to chase the update in PDF automatically.
$pvc_view_file_via_temporary = 0;

# Use Skim as a previewer
$pdf_previewer    = "open -ga /Applications/Skim.app";
```

###英語latexソースの場合
何もしなくてもOK．デフォルトでpdflatexが使われる．


Sublime Text 2での編集操作
===
1. latexソース.texを開く．
2. Cmd+Bでビルド：設定したとおり `latexmk -cd -f latexソース.tex`が実行され，PDFビューアーが開く．


カスタム設定したいなら
=====
Cmd+Bを押したときに実行されるビルドコマンドを，latexmkの代わりに設定ファイルに書けばよい．

```python:"builder_settings"の中の設定
		// General settings:
		// See README or third-party documentation
		// "command": ["latexmk", "-cd", "-f", ""], // これを変更する
		"command": ["platex", ""], // たとえばplatex単体を実行
```
アジャイルレトロスペクティブズ を読んでみた

# 概要
最近所属しているチームでもアジャイルを取り入れ用ということになったのでアジャイルに関する色んな本を読んでいるのですが、振り返りで1冊書いた本に惹かれたのでまとめを書いてみました。

* [アジャイルレトロスペクティブ 強いチームを育てる「ふりかえり」の手引き] (http://www.amazon.co.jp/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%83%AC%E3%83%88%E3%83%AD%E3%82%B9%E3%83%9A%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%82%BA-%E5%BC%B7%E3%81%84%E3%83%81%E3%83%BC%E3%83%A0%E3%82%92%E8%82%B2%E3%81%A6%E3%82%8B%E3%80%8C%E3%81%B5%E3%82%8A%E3%81%8B%E3%81%88%E3%82%8A%E3%80%8D%E3%81%AE%E6%89%8B%E5%BC%95%E3%81%8D-Esther-Derby/dp/4274066983/ref=sr_1_2?ie=UTF8&qid=1408955293&sr=8-2)


# 現在の状況
チームとしてアジャイルを始めてみて2ヶ月程度。
ふりかえり的なことは最近開始。

# まとめ
## レトロスペクティブとは
* 仕事が一段落したときに、チームメンバーが集まり仕事のやり方やチームワークを点検し、改善していくミーティングのこと
* 一段落した時ではなく、周期的に行っても良いものだと思った
* 「ふりかえり」がキーワード

## 自分が思う対象読者
* 会議をもっとうまくやりたい人
* チームを活気づけたい人
* 改善を促したい人、または改善したいことがある人
* 炎上プロジェクトを何とかしたい人

## レトロスペクティブの流れ
* 場を作る
* データを集める
* アイデア出し
* 何をやるかの決定
* レトロスペクティブ終了

# 所感
凄く簡単に。とてもシンプルに書くと上の流れを意識するということなのかなと思いました。皆で集まり、情報をまとめて、次どうするかアイデアを出し、決定し、次で実践する。これだけなんだなと。正直な感想はこうでした。

実際には具体的なふりかえりの方法がいくつも書かれています。感情を付箋の色で表現してみるというのは面白いなぁと思ったり。色んな手法があって驚き、また面白かったですが結局のところはコミュニケーションだったり思いやりなんだなぁと感じることもままありました。感情的にならないということもそうですし、相手の話を良く聞くということもそうだと思います。

まだまだ実践できることのほうが多いので試行錯誤を繰り返していきたいですね。

詳しい手法の話については本を手にとってみてください。
vsftpdを設定した

# 要件

* /srv/htdocs/ をデザイナがFTPで読み書きしたい。
* 念のため /srv/htdocs/ より上には移動できないようにしておく。

# インストール

```bash:
pacman -Sy vsftpd
adduser designer
passwd designer
```

# ファイルリスト

* /etc/vsftpd.conf
* /etc/vsftpd/vsftpd_user_conf/designer
* /etc/vsftpd/vsftpd.user_list
* /etc/vsftpd/vsftpd.chroot_list

# 設定

```bash:/etc/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list
listen=YES

userlist_deny=NO
userlist_enable=YES
userlist_file=/etc/vsftpd/vsftpd.user_list
user_config_dir=/etc/vsftpd/vsftpd_user_conf
seccomp_sandbox=NO
allow_writeable_chroot=YES
```

> seccomp_sandbox=NO
> allow_writeable_chroot=YES

これがないと接続できなかった。

参考:

* [500 OOPS: priv_sock_get_cmd or 500 OOPS: vsftpd: refusing to run with writable root inside chroot() | digitalwhores](http://www.digitalwhores.net/linux/500-oops-priv_sock_get_cmd/)
* [vsftpd saying 500 OOPS: priv_sock_get_cmd (after update?..) (Page 1) / Networking, Server, and Protection / Arch Linux Forums](https://bbs.archlinux.org/viewtopic.php?id=147074)

```bash:/etc/vsftpd/vsftpd_user_conf/designer
local_root=/srv/htdocs/
```

* FTP接続時、/srv/htdocs/ に移動

```bash:/etc/vsftpd/vsftpd.user_list
designer
```

* FTP接続できるユーザを限定する

```bash:/etc/vsftpd/vsftpd.chroot_list
local_root=/srv/htdocs
```

* FTP接続とともに /srv/htdocs にchroot。 /srv/htdocs を / とみなす。

# vsftpdサービス開始

```bash:
systemctl start vsftpd
```
rails4でrspecを作成すると実行時にすごい数のwarningが出る


``rails g rspec:install``を実行した際に出力される``.rspec``にデフォルトで``--warnings``が含まれている。
この``--warnings``を削除すればよい。


### 参考
* http://stackoverflow.com/questions/24003316/guard-with-rspec-on-rails-4-giving-a-lot-of-warnings
WP_Queryでページネーションがうまくいかなくて対応したこと

※この記事は2014年8月作成で、WPバージョン3.7.1とかそのくらいの頃の話になりますのでご注意ください。

--

![こういうやつ.png](https://qiita-image-store.s3.amazonaws.com/0/11587/8c04145c-76f1-489d-9484-1bfc7acea1ae.png "こういうやつ.png")



WP_Queryを使って固定ページで特定のカテゴリとか投稿タイプとかの一覧をとって、それをページングさせようとしたときにわりとすんなり言ってくれなかったメモ。

\$queryとか\$max_num_pageとかがうまくglobalのやつに入ってくれないっていうのが問題っぽかった。

※'/hoge'が1ページ目であるということがわかっている前提に作られています。

````
<?php

global $post; // これは取れる
global $paged; // これも取れる
global $max_num_page; // これが取れない

$list = new WP_Query("category_name=hoge&paged=$paged");
$max_num_pages = $list->max_num_pages; // これで取れる

if($list->have_posts()): while($list->have_posts()): $list->the_post();
	// ループ処理
endwhile;

// ループのあとにページネーション
?>

<nav>
<?php if($paged > 1): //最初のページと前のページ ?>
	<a class='page' href="/hoge/">&laquo;</a>
	<a class='page' href="/hoge/page/<?php echo($paged - 1) ?>">&lt;</a>
<?php endif; ?>
<?php for($i = 1; $i <= $max_num_pages; $i++): // 各ページ ?>
<?php
	if($i == $paged){
		echo "<span class='page current'>$i</span>";
	} else {
		if($i == 1) echo "<a class='page' href='/hoge/'>1</a>";
		else echo "<a class='page' href='/hoge/page/$i'>$i</a>";
	}
?>
<?php endfor; ?>
<?php if($paged < $max_num_pages): // 次のページと最後のページ ?>
	<a class='page' href="/hoge/page/<?php echo $paged + 1 ?>">&gt;</a>
	<a class='page' href="/hoge/page/<?php echo $max_num_pages ?>">&raquo;</a>
<?php endif; ?>
</nav>

<?php
	endif; wp_reset_query();
?>

````

クラスとスタイルはまぁ適宜。
ただしこれだと全ページが出ちゃいますので注意してください。

時間なかったのでパパッとやっちゃったけど、functions.phpに入れられるような形にしてもよかった。
F#のシーケンスでコルーチン

ドラッグ＆ドロップをイベントドリブンで書くと処理が分断されます。コルーチンを使うことでシーケンシャルに書くテクニックがあります。今回はシーケンスで実装してみます。

この記事には続編があります。

* [F#のシーケンスでコルーチン(2)](http://qiita.com/7shi/items/78fa1d02730c7cd11786)

この記事をベースにJavaScript版を作成しました。

* [ECMAScript 6のyieldでコルーチン](http://qiita.com/7shi/items/622c322bd482b340038c)
* [ECMAScript 6のyieldでコルーチン(2)](http://qiita.com/7shi/items/e9d65db80bfaa6adaa16)

# コルーチンを使わない書き方

コルーチンを使わずにイベントドリブンで書いてみます。

```fsharp:DnDCoroutine.fsx
#r "System"
#r "System.Drawing"
#r "System.Windows.Forms"

open System
open System.Drawing
open System.Windows.Forms

let mutable r = Rectangle(10, 10, 40, 40)
let mutable startX, startY, startR, dragging = 0, 0, r, false

[<EntryPoint; STAThread>] do
let f = new Form(Text = "DnD Coroutine")

f.Paint.Add <| fun e ->
    e.Graphics.FillRectangle(Brushes.Red, r)

f.MouseDown.Add <| fun e ->
    if r.Contains(e.X, e.Y) then
        startX <- e.X
        startY <- e.Y
        startR <- r
        dragging <- true

f.MouseMove.Add <| fun e ->
    if dragging then
        r.X <- startR.X + e.X - startX
        r.Y <- startR.Y + e.Y - startY
        f.Invalidate()

f.MouseUp.Add <| fun e ->
    dragging <- false

Application.Run f
```

状態を変数に入れてMouseDown, MouseMove, MouseUpを別々に処理します。

# コルーチンをサポートするクラス

イベントが発生するたびにシーケンスを読み取ることで処理を継続することができます。このように中断されることを前提とした関数のようなものをコルーチンと呼びます。

ドラッグ＆ドロップに特化したサポートクラスを作ります。

```fsharp
type DnDCoroutine(target:Control) =
    let mutable x, y, isDragging = 0, 0, false
    let mutable en = Unchecked.defaultof<Collections.Generic.IEnumerator<unit>>
    let mutable coroutine = Seq.empty<unit>
    do
        target.MouseDown.Add <| fun e ->
            x <- e.X
            y <- e.Y
            en <- coroutine.GetEnumerator()
            isDragging <- en.MoveNext()
        target.MouseMove.Add <| fun e ->
            x <- e.X
            y <- e.Y
            if isDragging then
                isDragging <- en.MoveNext()
        target.MouseUp.Add <| fun e ->
            x <- e.X
            y <- e.Y
            if isDragging then
                isDragging <- false
                en.MoveNext() |> ignore
    member this.Coroutine with set(c) = coroutine <- c
    member this.X = x
    member this.Y = y
    member this.IsDragging = isDragging
```

これを使って書き直すと次のようになります。

```fsharp
let mutable r = Rectangle(10, 10, 40, 40)

[<EntryPoint; STAThread>] do
let f = new Form(Text = "DnD Coroutine")

f.Paint.Add <| fun e ->
    e.Graphics.FillRectangle(Brushes.Red, r)

let dndc = DnDCoroutine(f)
dndc.Coroutine <- seq {
    if r.Contains(dndc.X, dndc.Y) then
        let startX, startY, startR = dndc.X, dndc.Y, r
        yield ()
        while dndc.IsDragging do
            r.X <- startR.X + dndc.X - startX
            r.Y <- startR.Y + dndc.Y - startY
            f.Invalidate()
            yield ()
}

Application.Run f
```

マウスを押し下げてから離すまでの処理が一連の流れで書けるようになりました。

`yield ()`の役割は`Application.DoEvents()`とほぼ同じですが、後者のように副流（サブのイベントループ）を作らない点が異なります。その代償としてコルーチンは自身のシーケンスの打ち切りを自身で管理できません（【追記】`yield`したまま戻って来ない可能性があるという意味です）。つまり受動的な存在です。
auto scalingのセットアップ

```
cd /usr/local/src
sudo wget http://ec2-downloads.s3.amazonaws.com/AutoScaling-2011-01-01.zip
sudo unzip AutoScaling-2011-01-01.zip 
sudo mv AutoScaling-1.0.61.6 /usr/local/share/aws/
cp /usr/local/share/aws/AutoScaling-1.0.61.6/credential-file-path.template ~/.ssh/aws-credential-file-path
```

.bash_profileに次を追記

```
export AWS_AUTO_SCALING_HOME=/usr/local/share/aws/AutoScaling-1.0.61.6
export PATH=$PATH:$AWS_AUTO_SCALING_HOME/bin
export AWS_CREDENTIAL_FILE=/home/shida/.ssh/aws-credential-file-path
```

launch-config, scaling-groupの作成

```
as-create-launch-config example-lc --image-id ami-xxxxxxxx --instance-type t1.micro --group wellknown,default
as-create-auto-scaling-group example-sg --launch-configuration example-lc --availability-zones ap-northeast-1a --min-size 1 --max-size 1 --load-balancers example-elb
```

っていうか管理画面から出来るようになってるやん orz
controllerの中でstoreを操作


Sencha Touchのコントローラの中でストアを扱うための第一歩

過去のアプリケーションを再利用し、アプリケーションの起動時に表示されるメッセージボックスの文字列をストアの1個目の要素にする。

_過去のアプリケーション_
* [caroucelコンポーネントの使い方](http://qiita.com/uchikoshi22/items/78803a68a9d44eff20a2)
* [storeのデータをcaroucelコンポーネントに表示](http://qiita.com/uchikoshi22/items/0891de5f53c37131cbf7)
* [初めてのcontrollerの追加](http://qiita.com/uchikoshi22/items/48785995abe579f8e84e)

app/controller/Players.jsのconfig.control内を以下のように書き換える

```
'main': {
    // initialize: 'sayGreeting'
    // アプリケーション初期化イベント発火時のメソッドを
    // sayGreetingからshowOneRecordに変更
   initialize: 'showOneRecord'
}
```

app/controller/Players.jsにshowOneRecordメソッドを追加する

```
showOneRecord: function() {
    var store = Ext.getStore('Players');
    var first_record = store.first().get('name');
    Ext.Msg.alert(first_record);
},
```

* 2行目でストアを取得
* 3行目では、2行目で取得したストアの最初の要素のnameキーの値を取得

この状態でapp/controller/Players.jsを保存した後に、例によってcarouseltestフォルダに移動して

`python -m SimpleHTTPServer`

のコマンドを打ってブラウザで [http://0.0.0.0:8000](http://0.0.0.0:8000) にアクセすることで以下の描画を行うアプリケーションを実行できます。

![CarouselTest_and_CarouselTest.png](https://qiita-image-store.s3.amazonaws.com/0/19083/e844c194-78c1-6ac4-f19b-b2d49e81769a.png "CarouselTest_and_CarouselTest.png")
yum install一発でよしなに入れておきたいコマンドリスト


以下Linuxで私が最初に入れておくべきコマンドたち。
新しい情報ではないですが、真っさらなLinuxOSにとにかく一発で入れようと思ったので、まとめました。
標準ライブラリなどを一気に入れます。これらはGitHubにでもそろそろまとめようかと思いますが、まずはここにメモします。

|更新日|内容|
|:--:|:----|
|2014/08/28|yum -y installを修正|

#0. 私の開発環境
* ruby on rails 4.2.*
* Python 2.7.*
* CentOS 6.5(vm環境)➡︎作業時はrootにしてます。

# 1. yumでいれるもの一覧

```yum.csh
# 最初にupdateします。古いと動かなかったり互換性の問題がでたりするかもしれない。その可能性を先に潰すため。(時間かかるので注意)
$ yum -y update

# 必要な物を全部インストールします。半角スペースで区切れば、連続インストール可能です。
$ yum -y install
  
  # おそらく誰もが必要なものでしょう
  wget
  man
  git
  # (*2)
  tig
  jwhois
  gcc
  make
  autoconf
  patch

  # (*1)
  ntp


  # 適宜必要なものを取捨選択します
  curl-devel
  openssl-devel
  sqlite-devel
  mod_ssl

  # (*1)
  mysql-devel
  httpd-devel

  # (*1)(*2)
  nginx

  # nokogiriのライブラリあたりでこけないようにここらへんは入れたい(*3)
  libyaml-devel
  libxml2-devel 
  libxslt-devel

```

#2. wgetで入れるもの一覧
追加で、入れるものがあれば、wgetの方

```wget.csh
# ruby, Pythonは安定バージョンを入れる(2014/08/25時点)→makeとかもすること, bundlerもinstall
$ wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.2.tar.gz
$ wget https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tar.xz

# ポート周り → 22, 80, 443開放します
$ wget https://launchpad.net/ufw/0.33/0.33/+download/ufw-0.33.tar.gz

```

#3. 備考欄
>(*1)
* 要start & chkconfig on
* start, restart, reload

>(*2)
~~~ここの環境は自分に合わせてください。
◯nginx → http://nginx.org/packages/centos
* rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
するか、/etc/yum.repos.d/nginx.repoを作成して、その情報を追記するかしてください
* unicornと使う場合は、gem install unicorn-railsなどを利用します
>
◯tig → http://pkgs.repoforge.org/rpmforge-release
* rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.i686.rpm
とするか情報を記述するか


#4. git configチートシート

```git.csh
$ git config --global user.name "test"
$ git config --global user.email test@example.com
$ git config --global core.editor vim
$ git config --global color.ui true
$ git config --global core.autocrlf input
```

#5. 危険コマンド集

```bad_command.csh
# フォルダであってもall yesをして全消去。全削除したいときには便利ですが、あまり使わない方がよさげ
$ yes | rm -R
```


TODO
Dockerでコード書いておくこと
ArchLinuxにAnsibleしたらInvalid syntax error

* [Ansibleで管理するために一手間必要なディストリビューション - Qiita](http://qiita.com/tukiyo3/items/779f61be8348f8e45de5)

参考: [Invalid syntax error · Issue #30 · jlund/streisand](https://github.com/jlund/streisand/issues/30)

# エラー

```bash:実行
$ sh run.sh
sudo password:

PLAY [myserver] *******************************************************************

GATHERING FACTS ***************************************************************
failed: [myserver] => {"failed": true, "parsed": false}
invalid output was:   File "/home/owner/.ansible/tmp/ansible-tmp-1408999276.05-85157681217062/setup", line 532
    except OSError, e:
                  ^
SyntaxError: invalid syntax


TASK: [利用者削除] **************************************************************
FATAL: no hosts matched or all hosts have already failed -- aborting


PLAY RECAP ********************************************************************
           to retry, use: --limit @/Users/owner/book.retry

myserver          : ok=0    changed=0    unreachable=0    failed=1
```


# 対処

Ansibleはpython2が必要。

```bash:
pacman -Sy python2
```

```diff:main.yml
  ---
  - hosts: localhost
+   vars:
+     ansible_python_interpreter: python2
    sudo: yes
    tasks:
      - pacman: name=libvirt state=installed
```

再度実行して正常終了することを確認。
Hadoop 2.5.0がリリースされました


変更点とか、追加機能についていくつかメモ書き。

## 概要

リリースノートは[こちら](http://hadoop.apache.org/docs/r2.5.0/)。2.5.0になって、ようやくこのページが更新されました。次回以降のリリースでも、このページが更新されるようにしていきたいですね。

Hadoopユーザにとって嬉しい機能としては、こんなのがあります。

* A new Hadoop metrics sink that allows writing directly to Graphite.
* YARN's REST APIs now support write/modify operations. Users can submit and kill applications through REST APIs.

また、HDFS Rolling Upgradeが適用可能な最初のマイナーバージョンアップでもあります。(2.4 -> 2.5.0)

ちなみに、

* Using the OfflineImageViewer, clients can now browse an fsimage via the WebHDFS API.

これは自分が実装しました。ほぼ全てHortonworksのHaohuiさんにレビュー・コミットしてもらっていて、彼にはとても感謝しています。
OfflineImageViewerで特定のディレクトリの情報だけ取りたい、というような場合に役に立ちます。後ろのほうに説明があります。

## (dist)cpに関するオプション

cpコマンドに[ACL](http://hadoop.apache.org/docs/r2.5.0/hadoop-project-dist/hadoop-hdfs/HdfsPermissionsGuide.html#ACLs_Access_Control_Lists)を保持するオプション(-pa)と、[XAttr](http://hadoop.apache.org/docs/r2.5.0/hadoop-project-dist/hadoop-hdfs/ExtendedAttributes.html)を保持するオプション(-px)が追加されました(distcpも同様)

* ドキュメントは[こちら](http://hadoop.apache.org/docs/r2.5.0/hadoop-project-dist/hadoop-common/FileSystemShell.html#cp)
* 全てを保持したいときは、`$ cp -ptopax src dst`で大丈夫

```detail
t: time
o: owner
p: permission
a: ACL (自動的にpermissionも保持する)
x: XAttr
```

注意点

* `cp -p`は今までどおり、time, owner, permissionを保持する
* ただし、`cp -pa`だとtime, ownerは保持されない
* `src`のFileSystemがACLに対応していない場合、もしくは、`src`がACLを保持しているが`dst`のFileSystemがACLに対応していない場合、`cp -pa src dst`は失敗する
* XAttrの場合でも、同様

## oiv_legacyコマンドの追加

Hadoop 2.4でfsimageの形式が変わった([HDFS-5698](https://issues.apache.org/jira/browse/HDFS-5698))ため、それを読み込んでdumpするツールであるOfflineImageViewerも変化した。

### 2.3以前のoivでできたこと

* Ls: ls形式で出力
* XML: XML形式で出力
* Indented: インデントした状態で出力
* Delimited: 任意のdelimiterで出力
* FileDistribution: ファイルサイズの統計情報を出力
* NameDistribution: ファイル名・ディレクトリ名の統計情報を出力(NameNodeではファイル名・ディレクトリ名をStringで保持するので、使い回せばその分ヒープが節約できる)

### 2.4のoivでできること

* Ls
* XML
* FileDistribution

デグレ！

### 2.5のoivでできるようになったこと

* Web: 指定したポートにWebHDFS REST API(read-only)を提供するHTTPサーバを起動する。`hdfs dfs -ls webhdfs://localhost:5978/path/to/dir`のようにアクセスすることで、interactiveにfsimageの情報を出力させることが可能。要はjhat的なもの。([HDFS-5978](https://issues.apache.org/jira/browse/HDFS-5978))

  + 今後、[dfs -findコマンド](https://issues.apache.org/jira/browse/HADOOP-8989)と組み合わせることで様々な条件で検索できるようになる予定。
  + findコマンドはまだマージされていないけど、2.6では使えるようにしたい。

* XML
* FileDistribution

これでもまだ足りない上に、性能問題も指摘 ([HDFS-6293](https://issues.apache.org/jira/browse/HDFS-6293))

* fsimageが巨大だと、それに応じて大量のメモリが必要 (2.4のLsでも同様)
* fsimageの形式が変わったことで、一旦ほぼ全ての情報をメモリに読み込む必要が出たため

### 解決策(妥協案): oiv_legacyコマンド

* 2.5.0で追加された機能
* SecondaryNameNode/CheckpointNodeで旧形式のfsimageを追加でdumpするよう修正 (プロパティ"dfs.namenode.legacy-oiv-image.dir"を設定すると、設定したディレクトリに出力される)
* dumpされた旧形式のfsimageに対してoiv_legacyコマンドが使える
* oiv_legacyコマンドは2.3までのoivコマンドと同じ、すなわち2.3までと全く同じことができる

これで、めでたく昔の形式を利用するツール(例:[hdfs-du](https://github.com/twitter/hdfs-du))も今まで通り使えるようになります
CSS小ネタ ボタンに添える三角形マークの作り方

初めてスマホサイトを作ったときに、メニューやボタンで三角形を多用したんですけど、サーバーのために出来るだけ軽くしたかったので、画像を使わずにCSSで作れないかなーって試行錯誤した結果を紹介します。

![2014-08-26_025636.png](https://qiita-image-store.s3.amazonaws.com/0/52104/164579c0-d4bd-fb52-29c3-c58a4f2fb21b.png)

```css
.icon-button {
    width: 44px;
    height: 44px;
    border: solid 1px #000;
    border-radius: 3px;
}
.clearfix:after {
    display: block;
    clear: both;
    content: "";
}
.arrow-r:before,
.arrow-b:before,
.arrow-l:before,
.arrow-t:before {
    position: relative;
    display: block;
    margin: auto;
    top: 50%;
    width: 0px;
    height: 0px;
    border: 11px solid transparent;
    border-right-color: #666;
    border-top-color: #666;
    content: "";
}
.arrow-r:before {
    margin-left: 12%;
    margin-top: -24%;
    -webkit-transform: rotate(45deg);
    transform: rotate(45deg);
}
.arrow-b:before {
    margin-left: 24%;
    margin-top: -36%;
    -webkit-transform: rotate(135deg);
    transform: rotate(135deg);
}
.arrow-l:before {
    margin-left: 36%;
    margin-top: -24%;
    -webkit-transform: rotate(225deg);
    transform: rotate(225deg);
}
.arrow-t:before {
    margin-left: 24%;
    margin-top: -12%;
    -webkit-transform: rotate(315deg);
    transform: rotate(315deg);
}
```

```html
<ul class="sample-buttons clearfix">
  <li><div class="icon-button arrow-l"></div></li>
  <li><div class="icon-button arrow-r"></div></li>
  <li><div class="icon-button arrow-t"></div></li>
  <li><div class="icon-button arrow-b"></div></li>
</ul>
```

ボタンの中にサイズ０のブロック要素を作って、太い境界線を付けることで三角形にしています。
ボタンと三角形のサイズを４：１になるようにすれば、大体どんな大きさでも大丈夫なはずです。
うーん、CSS のクラス分けって、こんな感じでいいのかな？
おかしなところがあったら、突っ込みください(o*｡_｡)oﾍﾟｺｯ

こんな小さな CSS でも出来るまで軽く１時間くらい掛かってしまって、入り口は簡単そうなのに本気でやると難しいです・・・。
作っているうちにクラスがいっぱい増えちゃって頭がパンクしちゃうんですよねぇ(´・ω・`)