OmniAICreator/Qiita-1.07M huggingface dataset:
AndroidStudioでAPKを作ったあとに特定のディレクトリにAPKをコピーする

リリース用のAPKを必ず同じ場所に配置したい場合があると思いますが、AndroidStudio/gradleなら専用タスクを作ることで簡単に実現できます。

参考: http://stackoverflow.com/questions/21434554/copying-apk-file-in-android-gradle-project/21533902#21533902

```groovy:build.gradle
apply plugin: 'com.android.application'

android {
...
    def publish = project.tasks.create("publishAll")
    android.applicationVariants.all { variant ->
        if (variant.buildType.name.equals("release")) {
            def task = project.tasks.create("publish${variant.name.capitalize()}Apk", Copy)
            task.from(variant.outputFile)
            task.into(deployTo)

            task.dependsOn variant.assemble
            publish.dependsOn task

            // copyXxxMappingTxt
            if (variant.buildType.runProguard) {
                def copyTask = project.tasks.create("copy${variant.name.capitalize()}MappingTxt", Copy)

                // variant.outputFile = "build/outputs/apk/xxx.apk"
                // from: "build/outputs/proguard/free/release/mapping.txt"
                // into: "proguard-outputs/free-release-mapping.txt"

                def flavorName = variant.productFlavors[0].name
                def buildTypeName = variant.buildType.name

                copyTask.from(variant.outputFile.parent + "/../proguard/${flavorName}/${buildTypeName}/mapping.txt")
                copyTask.rename('(.*)', "${flavorName}-proguard-\$1")
                copyTask.into(variant.outputFile.parent + "/../../../proguard-outputs")

                System.println("* copy mapping txt : [${flavorName}][${buildTypeName}]")

                copyTask.dependsOn variant.assemble
                task.dependsOn copyTask
            }
        }
    }
...
}
...
```

```properties:gradle.properties
deployTo=D:\\hoge\\fuga
```

上記のように書いておくと、"publishAll" という task を実行するだけで release の assemble が実行されたあとに "D:\\hoge\\fuga" にAPKが配置されます。

複数の ProductFlavor がある場合も release 版だけが全部実行されるので便利です。


ついでに copyXxxMappingTxt のようなタスクで mapping.txt を特定のディレクトリにコピーするようにしてあります。
これも "publishAll" で実行されます。
Preference使用方法[Android]

#Preferenceの基本
　データ、保存したいですよね。
　データの簡単な保存方法にプリファレンスというものがあります。
　プリファレンスは、 **キーと値の組み合わせでデータを保存する** 方法です。1つのキーに1つの値を保存、シンプルですね。これはアプリの設定情報の保存などに向いているモノです。大量のデータや複雑なものはデータベースなど、別の保存方法を選びましょ。

　アプリは複数のプリファレンスを持つことができます。また、使えるデータ型は以下の5つに限られます。

- boolean型
- float型
- int型
- long型
- String型

#Preferenceへのアクセス
　まずは、プリファレンスにアクセスです。
　contentクラスの`getSharedPreferences()`を用いて、 **`SharedPreferences`** オブジェクトを取得です。

```
SharedPreferences prefer = getSharedOreferences("ファイル名", モード)
```
　ここで、ファイル名は保存先のファイル名です。モードは3つあり、その中から適したものを選びましょう。

| MODE | アクセス権 | 
|:-----------|------------:|
| MODE_PRIVATE|他のアプリからアクセス不可|
| MODE_WPRLD_READABLE|他のアプリから読み込み可能|
| MODE_WORLD_WRITEABLE|他のアプリから書き込み可能|
　ただし、保存先のファイル名とアクティビティ名が同じ場合に限り、`getPreferences()`が使え、こちらは引数がモードのみでオッケーです。
#Preferenceの保存
　保存には **Editor** クラスを用います。
　`edit()`でオブジェクト取得、保存する値がint型の場合、`putInt()`でキーと値を保存、`commit()`で実際にファイルに書き込むという流れです。

```
Editor editor = pref.edit();
editor.putInt("id", userId);
editor.commit();
```
#Preferenceの読み込み
 読み込みでは、SharedPreferenceseオブジェクトを取得後、値を`getInt()`等のメソッドでキーを与えて値を呼び出す流れです。

```
SharedPreferences pref = getSharedPreferences("user_data", MODE_PRIVATE);
		
int useId = pref.getInt("id", 10001);
```
　`getInt()`の第1引数はキー、第2引数は **デフォルト値** となります。なにも保存してない場合に呼び出された時にその値を返します。
#Preferenceの削除
##特定のキーを削除
　特定のキーと値のデータを削除する場合は、`Editor`クラスの`remove()`を用います。引数に、String型のキーを与えます。この場合も、次に`commit()`をすることで実際の削除が行われます。
##すべてのキーを削除
　複数のデータを保存した後に、まとめて削除したい場合は、`clear()`を用います。こちらは引数なさいで一気に。さようなら。

#参考
[SharedPreferences | Android Developers](http://developer.android.com/reference/android/content/SharedPreferences.html)
Unityのアセットストアでチェックしておきたいパブリッシャー達(人型モデル編）

アセットストアといえば定期的にセール等してUnity使ってる人なら何度か見たことがあると思います。
（もしあなたアセットストアにアクセスしたことがなくUnityオンリーでやっているならば今すぐアセットストアを開いても良い）

今回はただのパブリッシャー紹介（自分がチェックしてる所）になります。

----通常の等身-----

CrossRoad_kimys2848
https://www.assetstore.unity3d.com/#publisher/2049
〜NPCとついているアセットが主
人型アセットの中では恐らく日本人好み具合トップ
ファンタジー系

H.S
https://www.assetstore.unity3d.com/#publisher/2353
可愛い女の子のモデルが少数
早くパブリッシャーイメージになってる獣耳少女が販売されて欲しい。

piccolo
https://www.assetstore.unity3d.com/#publisher/2532
バニーガールやアリスチックなモデルが一時期拡散されてた。
まだ数が少ないのでこれからに期待
武器アセットなどもおいてあるので多様性ありそう

k.fantasy
https://www.assetstore.unity3d.com/#publisher/2202
ちょっとのぺーっとしたのが特徴
定期的に新作がでるので追っておくとよさそう



-----デフォルメキャラ------

Apupu
https://www.assetstore.unity3d.com/#publisher/2648
わりと最近出てきた人
アニメ調のデフォルメキャラが魅力的だが20130606時点で2つしかない
今後追いかけておくと良いかもしれない


jay
https://www.assetstore.unity3d.com/#/publisher/3345
こちらも2つしか販売されてないけど使い勝手良さそうな見た目なので○
ガンナーと勇者っぽいのがリリースされてる



追いかけるとまだまだ要るんだけど今回はここまで
ω’)ノシ
iOSメモ - int x = 010について悩む

```objc    
    //プリフィックスとして使うものだった
    int num = 010;//octal 8進数:10 -> 10進数:8
    NSLog(@"%d",num);
    int num2 = 0b10;//binary 2進数:10 -> 10進数:2
    NSLog(@"%d",num2);
    int num3 = 0x10;//hexadecimal 16進数:10 -> 10進数:16
    NSLog(@"%d",num3);
```

- 参考文献

[Programming with Objective-C: OSNumber]
(https://developer.apple.com/library/mac/documentation/Kernel/Reference/OSNumber_reference/translated_content/OSNumber.html)
[Programming with Objective-C: Values and Collections]
(https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/FoundationTypesandCollections/FoundationTypesandCollections.html)

- 余談

どこで使うのか気になる。
OSNumber,NSNumber,NSIntegerとの関係性とかちゃんと把握したいネ。primitive...orz

- 追記
int num = 090;//error
ソシャゲ界隈でよくKPIになるDAUの数理分析→継続率と会員の掘り起こし率が大事そう


ソーシャルゲーム界隈でよくDAU(Daily Active User)がKPIになったりするけど、じゃあどうしたらDAU増えるの？ってところをちょっとクリアにしたくて簡単に考えてみた。

## DAUの計算式をモデル化

### 定義
数理モデルを書くために下記を定義します。

* 翌日継続率 R：前日のDAUのうち今日も継続して使うユーザの割合
* 掘り起こし率 B：前日Activeじゃなかったユーザが復帰してくる割合
* 全ユーザ数U(t): 日付tでの全会員数
* DAU D(t)：日付tでのDAU数
* 新規登録数 i(t)：日付tでの新規に登録したユーザ数

### 仮定
問題を簡単にするために全ユーザ数U(t)はその日に登録する会員数i(t)より非常に大きいものとします。

```
U(t) >> i(t)
```

### DAUの差分方程式
翌日DAUは下記の数式モデルで書く事が可能。

```
D(t+1) = R*D(t) + B*U(t) + i(t)
```

翌日継続率と掘り起こし率が定数なのが気になりますが、問題を簡単にするためと、僕らのサービスでぶれはあるもののだいたい一定の値を示していたので定数と置きました。翌日継続率に関してはソシャゲ界隈の分析で一定数になってるのよく見かけるし、掘り起こし率に関しては、既存ユーザの掘り起こしリテンションは会員数に比例するものと考えるとまぁ妥当性あります。

## 分析

両辺をユーザ数U(t)で割る事でDAU率d(t)に関する方程式が導けます。なお、U(t)>>i(t)を仮定しているのでこの時点で流入項は無視しましょう。

### DAU率の差分方程式

```
d(t+1) = R*d(t) + B
```

### 定常状態のDAU率

すごく時間が経ったとき、継続率d(t)は割合の数字なので0〜1のどこかの一定な値に落ち着くはずです。t→Tとして定常状態時の式を解きましょう。

```
d(T) = R*d(T) + B
d(T) = B / (1-R)
```

定常状態でDAU率d(T)は1-R（翌日継続しない率?）に反比例して、掘り起こし率Bに比例する事がわかりました。継続率を大きくし、掘り起こし率も大きくすることで定常時のDAU率を上げる事ができますね。

### 定常状態のDAUの影響項

さて、今度は定常時のDAU率dに対してRやBが変化する場合のそれぞれの影響度について考えてみます。RやBをそれぞれΔR、ΔBだけ変化させてみた時のDAU率の変化量Δdは下記のように書けます。

```
Δd = δd/δR * ΔR + δd/δB * ΔB
Δd = (B/(1-R)^2)ΔR + 1/(1-R)ΔB
```

仮に継続率30%、掘り起こし率10%だとすると、

```
Δd = 0.2*ΔR + 1.4*ΔB
```

定常時のDAU率を高めるには掘り起こし率を高める方が効果が高いようですね。

### DAU率の時間変化率

1日先の差分方程式と今日の差分方程式を比較してみましょう。

```
d(t+2) = R*d(t+1) + B
d(t+1) = R*d(t) + B
```
両辺を引き算して、d(t+1)-d(t)=Δd(t)とおくと、下記の式が算出されます。

```
Δd(t+1) = R*Δd(t)
```

DAU率の変化率はRが小さいほど一気に収束して行きます。新規流入分、定常状態より多くなっているDAUがRの減衰率に応じて収束する形になりますね。

## 結論

以上の事から下記仮説が導きだされます。

* 継続率が高いと、DAU率の減衰が少なくてよい
* 定常時のDAU率は継続率と掘り起こし率に依存するが、掘り起こし率を高める方がより影響度は大きそう

もちろん、DAU率で考えたのでDAU数も見た方がいいです。DAU数は入力項無視できないので入力によってだいぶ上下ありそうですね。

ただDAUを上げましょうと言うよりも、これらの値をウォッチして施策を打って行く方がだいぶクリアな気はします。
ソーシャルゲームの分析とか数理分析をあんまり専門でやるわけでもないので、何か間違いや気になるところがあれば指摘してもらえると幸いです。
10bit データが連続して書き込まれたファイルを読み込む

Yahoo知恵袋で質問が出ていたので簡単なプロトタイプを作ってみました。
『FORTRANプログラムで、ある数値群(1次元)の書かれたバイナリファイルを 1バイトの...』
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13131416368#

yahoo知恵袋で答えたものを少しだけ直してあります。
エンディアンの問題や、ファイルのどの位置からデータが始まるのか、などいくつか任意性がありますが、ここでは原理的に出来ることを示すため、ヘッダーなしにファイルの先頭からデータが始まり、エンディアンは書き出し側と読み込み側で一致しているものとしました。

実行例
```
00000001000000100000001100000100000001010000011000000111
           1 :0000000100
           2 :0000100000
           3 :0011000001
           4 :0000000100
           5 :0000011000
```


```fortran
    program bit10
      implicit none
      character(LEN=1), allocatable :: buf_a(:)
      character(len = 32) :: tmp 
      integer :: i, iwk, len_i
      integer :: i0, i1, j0, j1
 ! write data : 7 * 8bits = 56bits     
      len_i = 7
      allocate( buf_a(len_i) )
      open(51, access = 'direct', recl = 1)
      do i = 1, len_i
        write( 51, rec=i ) i
      enddo
 ! read data : 7 * 8bit = 56bits     
      rewind(51) 
      do i = 1, len_i
        read( 51, rec=i ) buf_a(i)
      enddo
      write(*, '(*(b8.8))', advance = 'no') ichar(buf_a) ! char -> unsigned int
      print *
 ! split 50bits to 5 * 10bits     
      do i = 1, 5
        i0 = ibyte_begin(i)
        i1 = ibyte_end  (i)
        j1 = ibit_end   (i)
        iwk = transfer(buf_a(i1:i0:-1), iwk)              ! Little endian assumed
        iwk = iand(ishft(iwk, -(8 - j1)), b'1111111111')  ! Bit order hsb->lsb
        write(tmp, '(b32.32)') iwk
        print *, i, ':', tmp(32 - 10 + 1:32)
      end do
      stop
    contains 
      pure elemental integer function ibyte_begin(i)
        integer, intent(in) :: i
        ibyte_begin = ((i - 1) * 10 + 1) / 8 + 1 ! where i-th 10bit-data begins in an array
      end function ibyte_begin  
      
      pure elemental integer function ibyte_end(i)
        integer, intent(in) :: i
        ibyte_end = (i * 10 - 1) / 8 + 1 ! where i-th 10bit-data ends in an array
      end function ibyte_end 

      pure elemental integer function ibit_begin(i)
        integer, intent(in) :: i
        ibit_begin = mod((i - 1) * 10 + 1, 8) / 8 + 1 ! where i-th 10bit-data begins in a byte 
      end function ibit_begin  
      
      pure elemental integer function ibit_end(i)
        integer, intent(in) :: i
        ibit_end = mod(i * 10, 8) ! where i-th 10bit-data ends in a byte
      end function ibit_end 
    end program bit10
```
gecodeをCygwin向けにパッケージ化してみる

http://qiita.com/yositani2002/items/6e9b765452676a40a2ef
こちらでBerkshlelfのv3系を使いたいが為に,gecodeをソースインストールしました。
ソースインストールにはかなり時間がかかりますので、パッケージが無いのか探してみました。

Cygwinには標準のレポジトリ以外に、cygportというレポジトリがあるようです。
cygportで以下のように探してみましたが、gecodeやlibgecodeを探しても見つかりませんでした。

```lang:bash
##設定を有効化
$ apt-cyg update -m ftp://ftp.cygwinports.org/pub/cygwinports
# 名前で検索
$ apt-cyg find gecode*
$ apt-cyg find libgecode*
##元のレポジトリに戻し
$ apt-cyg update -m  ftp://ftp.jaist.ac.jp/pub/cygwin/
```

名前が同じで紛らわしいですが、自分でパッケージをつくるビルドツールとしてのcygportというコマンドがあるようです。


今回はそのビルドツールとしてのcygportでgecode-3.7.3をパッケージ化し、配布できるようにしてみました。

出来上がったものだけで、ビルドツールに興味ないという方は以下のファイルを解凍の上、
ftpかhttpのサーバーに展開し、以下のようにすれば導入できるかと思います。

```lang:bash
$ wget https://bitbucket.org/yositani2002/cygport-gecode/downloads/x86_64.tar.gz
$ tar xzvf x86_64.tar.gz
$ mv x86_64 <公開ディレクトリ>
$ apt-cyg update -m  {ftp,http}://<公開しているサーバー>/
$ apt-cyg install gecode
//レポジトリ戻し
$ apt-cyg update -m  ftp://ftp.jaist.ac.jp/pub/cygwin/
```

以下は自力でパッケージ化する場合の話になります。

本家マニュアル
https://cygwin.com/cygport/manual.html
http://www.cygwin.com/cygport/README

参考にしたサイト
http://fd0.hatenablog.jp/entry/2014/01/26/002816

以下はレポジトリからとってきてパッケージ化する流れです。

```lang:bash
//依存パッケージはREADMEのREQUIREMENTSを参照ください。
$ apt-cyg install cygport gettext gettext-devel ..
$ cd /usr/src
$ git clone https://bitbucket.org/yositani2002/cygport-gecode.git
$ cd cygport-gecode
$ cygport gecode fetch
//一つづついく場合
$ cygport gecode prep
$ cygport gecode make
$ cygport gecode check
$ cygport gecode install
$ cygport gecode package
//またはprepからpackageまで一括でやる場合
$ cygport gecode all
```

treeコマンドがなかったのでDOS窓から。

```
C:\cygwin64\usr\src\gecode-3.7.3.x86_64>tree dist /F
フォルダー パスの一覧
ボリューム シリアル番号は 32A1-7B09 です
C:\CYGWIN64\USR\SRC\GECODE-3.7.3.X86_64\DIST
└─gecode
    │  gecode-3.7.3-src.tar.xz
    │  gecode-gecode-3.7.3-3.7.3.tar.xz
    │  setup.hint
    │
    └─gecode-debuginfo
            gecode-debuginfo-gecode-3.7.3-3.7.3.tar.xz
            setup.hint
```

geniniコマンドはperlのスクリプトです。cygwinの本家にあります。
以下の手順で、dist配下が公開されている状態を想定しています。。

```
$ cp -R gecode /var/www/dist/x86_64/release/
$ cd /var/www/dist
$ genini --recursive x86_64 | bzip2 -c > x86_64/setup.bz2
```


以上でパッケージの作成と公開が終了です。
これで例えば、berkshelfのインストールは最短コースだとこうなるかと思います。

```lang:bash
$ apt-cyg update -m  http://<ホスト>/<パス>
$ apt-cyg install gecode
//戻し
$ apt-cyg update -m  ftp://ftp.jaist.ac.jp/pub/cygwin/
$ USE_SYSTEM_GECODE=1 gem install berkshelf
```

うまくいったでしょうか。
[Git] 2 つのリモートリポジトリの差分を確認する

他にスマートな方法がありそうな雰囲気をかもしだしていますが、とりあえず動作確認ができた方法が見つかりましたので投稿しておきます。

1. まず、片方のリモートリポジトリをクローンして、ローカルの master ブランチとします。
2. 次に `git remote add` の `-f` オプションを使ってリモートブランチ tmp にもう片方のリモートリポジトリを fetch します。
3. master ブランチとリモートブランチ tmp とで diff を取ります。

```bash
git remote add -f tmp path/to/repository
git diff master remotes/tmp/master
```

下記を参考にしました。ありがとうございます。
http://stackoverflow.com/questions/1968512/git-getting-the-difference-between-two-repositories
CompojureとjQueryでWebアプリを作る No.2（静的ファイルへのルーティング）

# プロジェクト内のファイルの確認
プロジェクト内のファイル構成を確認してみる。「greet」プロジェクトのディレクトリ内に移動し、`tree`コマンドを実行。

```shellscript
$ pwd
/...(略).../greet
$ tree
.
├── README.md
├── project.clj
├── resources
│   └── public
├── src
│   └── greet
│       └── handler.clj
├── target
│   ├── classes
│   └── stale
│       └── extract-native.dependencies
└── test
    └── greet
        └── test
            └── handler.clj

10 directories, 5 files
$ 
```

これを踏まえて、まずはproject.cljを編集する。

# project.cljの編集
中身を確認。

```clj:project.clj
(defproject greet "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [compojure "1.1.8"]]
  :plugins [[lein-ring "0.8.11"]]
  :ring {:handler greet.handler/app}
  :profiles
  {:dev {:dependencies [[javax.servlet/servlet-api "2.5"]
                        [ring-mock "0.1.5"]]}})
```

こいつの末尾を次のように変更。

```clj:project.clj
(defproject greet "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [compojure "1.1.8"]]
  :plugins [[lein-ring "0.8.11"]]
  :ring {:handler greet.handler/app}
  :profiles
  {:dev {:dependencies [[javax.servlet/servlet-api "2.5"]
                        [ring-mock "0.1.5"]]}}
  ;↓この一行を追加。右丸カッコの内側に入れるように注意すること。
  :web-content "public")
```

# handler.cljの編集

続いてhandler.cljのルーティングを追加する。まずは変更前のファイルの状態を確認。

```clj:handler.clj
(ns greet.handler
  (:require [compojure.core :refer :all]
            [compojure.handler :as handler]
            [compojure.route :as route]))

(defroutes app-routes
  (GET "/" [] "Hello World")
  (route/resources "/")
  (route/not-found "Not Found"))

(def app
  (handler/site app-routes))
```

`app-routes`内に以下の一行を追加する。

```clj:handler.clj
(ns greet.handler
  (:require [compojure.core :refer :all]
            [compojure.handler :as handler]
            [compojure.route :as route]))

(defroutes app-routes
  (GET "/" [] "Hello World")
  ;この一行を追加。
  ;これで「greet/resources/public/greet.html」なんかを作っておけば、
  ;「http://localhost:3000/greet.html」へアクセスしてこれを取得できる。
  (route/files "/")
  (route/resources "/")
  (route/not-found "Not Found"))

(def app
  (handler/site app-routes))
```

# greet.htmlを作成

HTML5的な行儀の良し悪しはともかく、次の内容のHTMLファイルを**publicディレクトリ直下**に作成する。

```html:greet.html
<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <form>
      <table>
        <tr>
          <td>First Name:</td>
          <td><input name="first_name" type="text" value="" /></td>
        </tr>
        <tr>
          <td>Last Name:</td>
          <td><input name="last_name" type="text" value="" /></td>
        </tr>
      </table>
      <div><input id="greet_button" type="submit" value="Greet" /><div/>
    </form>
    <div id="greeting_area"></div><br/>
  </body>
</html>
```

# 静的ファイルへのアクセスを確認

ではブラウザで[http://localhost:3000/greet.html](http://localhost:3000/greet.html)へアクセスしてみる。

![静的ファイルの表示](https://qiita-image-store.s3.amazonaws.com/0/39876/62d371ff-64db-5492-6956-a3542f68aa5b.png)

ばっちり表示されている。

次はこのHTMLファイルからのPOSTを受け取れるよう、サービス側のルーティングにPOST用のルートを追加してみる。
AmazonLinux(EC2)で、crondにタイムゾーン変更を反映するにはOS再起動が必要


特にAmazonLinuxに限った話ではないが…。AmazonLinuxをそのまま使うと、タイムゾーンがUTCになっているので、JST（日本時間）にしますよと。まぁ、ここらへんはEC2定番Tipsなわけなんだけど、そのままだと、crondにはタイムゾーン反映されてませんから注意。これもありがち。

```
$ date
2014年  7月 16日 水曜日 16:40:28 UTC
$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$ date
2014年  7月 17日 木曜日 01:40:28 JST
```

/etc/localtimeにシンボリックリンクをはるっていうね。

でもこれだけだと、yum updateなどをすると再度タイムゾーンが戻ってしまう。なので/etc/sysconfig/clockを編集しますよと。

```/etc/sysconfig/clock
ZONE="Asia/Tokyo"
UTC=false
```

で、問題はここから。crondにもタイムゾーン変更を反映するには、crondを再起動すればOKみたいなブログ記事が沢山あるけど、なぜか反映されず…。

```
$ sudo service crond restart
```

Amazonのドキュメントを読むと、素直にOS再起動が必要っぽい…。

```
$ sudo reboot
```

というわけで、素直に再起動したら、crondにもちゃんと反映されていた。うーん、なんでだろ。なんか環境変わったのかな。

参考 : http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-time.html
横にだけページングするネストしたスクロールビューをAuto Layoutで

# 動機
NAVITIMEのiOSアプリ的なレイアウトが実現したいという質問に、
知恵袋で回答したが、全然閲覧ないし不毛だと思いました。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10131302435

サンプルも作ったのに
https://github.com/tikidunpon/NestedScrollViewSample


# 期待動作
1-1→2-1の横移動はページングで、
1-1→1-2の縦移動はページングなしでスクロールしたい。
![スクリーンショット 2014-07-13 1.05.42.png](https://qiita-image-store.s3.amazonaws.com/0/9628/da95a6ab-7e25-9f45-c88d-d6703d38656b.png)

動かすと以下の様になる。
縦方向にはページングしないので、ページ間でもスクロールを停止できる。
![NestScroll.gif](https://qiita-image-store.s3.amazonaws.com/0/9628/a7663273-c00d-943a-7fd2-018d90fe9996.gif)

# スクロールビューの構成
左のChildに1-1,1-2を、右のChildに2-2のViewを乗せます。  
スクロールビューのcontentSizeは内包するコンテンツによって決定するので、  
ParentもChildも上下左右の制約は忘れずにつけること。
![スクリーンショット 2014-07-17 1.23.24.png](https://qiita-image-store.s3.amazonaws.com/0/9628/1b9b2587-848d-7f16-c5a6-7ac079366698.png)

画面サイズ以上のビューをレイアウトするので、
ViewControllerのSimulated SizeをFreeformにしておくと良いです。
![スクリーンショット 2014-07-17 1.29.22.png](https://qiita-image-store.s3.amazonaws.com/0/9628/58c2b678-9fa2-b82e-2d79-fbe65accf87a.png)
Pocketに保存したページをランダムに3つ表示してくれる「Iriguti」をリリースしました


Pocketに保存したページをランダムに3つ表示してくれる[Iriguti](http://iriguti.ongaeshi.me/)というWebアプリを作りました。

はじめてRailsを使ってアプリを作ってみましたが、慣れてくると豊富なプラグインのおかげでとても便利ですね。

![Iriguti](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20140717/20140717011401.png)

[続きを読む](http://ongaeshi.hatenablog.com/entry/iriguti-released)
CompojureとjQueryでWebアプリを作る No.1（プロジェクトを作る）

CompojureとjQueryでごく簡単なWebアプリを作ってみる。
目的は、POSTでデータを受信し、JSONデータを返すという一連の流れの整理。

# 前提条件
1. プラットフォームはLinux（Ubuntu 14.04）。
2. clojureをある程度使えるレベルの人向け。
3. jQueryはselectorを使えるレベルの人向け。
4. leiningenはインストールされていて正常に使用できる状態とする。

# プロジェクト生成
プロジェクトを作る。
プロジェクト名は「greet」とすると、つぎのようなコマンドを実行する。

```shellscript
$ lein new compojure greet
```
しばらくするとプロンプトが戻ってきて`lein`コマンドを実行したときのディレクトリに、`greet`ディレクトリが生成されている。

```shellscript
$ ls
greet/ ...(他にもあるかもしれんけど)
```

# サーバーとして起動

今生成された「greet」プロジェクトをサーバーとして起動させるには、**`greet`ディレクトリに移動してから**、`lein`コマンドを使う。

```shellscript
$ cd greet
$ lein ring server
2014-07-17 01:12:56.736:INFO:oejs.Server:jetty-7.6.8.v20121106
2014-07-17 01:12:56.994:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:3000
Started server on port 3000

```
こんな感じでサーバーが起動する。多分自動でブラウザが

http://localhost:3000

にアクセスし、次のように表示される。（と思う）

![ブラウザで表示](https://qiita-image-store.s3.amazonaws.com/0/39876/66e6f6db-b015-2577-f1e1-fec909b5dac0.png)

次はcompojureで静的なHTMLファイルをルーティングする方法。
Django アプリを golang の Gin と pongo2 で書き直す その1


Django アプリとはいっても非常に小規模なサイトの話です。
機能としては、

- サイト全体が Django のテンプレートを使用
- お申し込みフォーム(確認画面あり)
- お問い合わせフォーム(確認画面あり)
- お知らせ更新機能(今は html 直書きだったりするけどついでに DB から読み込みたい)

[Gin](https://github.com/gin-gonic/gin "Gin") は高速という噂の golang の Web フレームワークで、[pongo2](https://github.com/flosch/pongo2 "pongo2") は Django 風の記述ができるテンプレートエンジンです。 Gin にもテンプレートエンジンは付属していますが、 pongo2 を使って既存の Django 向けに書かれているテンプレートを極力活かしたいので使うことにしました。

とりあえず、単純に html を読み込んでレンダリングするのと静的なファイルの配信までやってみます。

ディレクトリ構成は、

```
.
├── main.go
└── static
    ├── images
    ├── css
    └── js
└── templates
    ├── base.html
    └── index.html
```

index.html は base.html を `{% extends "base.html" %}` しています。

```go:main.go	
package main

import "github.com/flosch/pongo2"
import "github.com/gin-gonic/gin"

func main() {
    r := gin.Default()

    r.GET("/", func(c *gin.Context) {
		tpl, err := pongo2.FromFile("templates/index.html")
		if err != nil {
			c.String(500, "Internal Server Error")
    	}
		err = tpl.ExecuteWriter(pongo2.Context{"title": "Welcome to my homepage!"}, c.Writer)
		if err != nil {
			c.String(500, "Internal Server Error")
		}
	})

	r.Run(":8080")
}
```
Renderer がプラガブルになったら `c.HTML` が使えるようになるみたいですが、今のところはこんな感じで。
`pongo2.Context` でテンプレートで使用する変数を渡します。
ここでは、 `{{ title }}` が使用できます。

あとは、静的なファイルの配信です。
これは `r.Static("/static", "static")` を一行追加するのみ。ついでに`/`の処理を外に出してみる。

```go:main.go	
package main

import "github.com/flosch/pongo2"
import "github.com/gin-gonic/gin"

func indexEndpoint(c *gin.Context) {
    tpl, err := pongo2.FromFile("templates/index.html")
    if err != nil {
        c.String(500, "Internal Server Error")
    }
    err = tpl.ExecuteRW(c.Writer, pongo2.Context{"title": "Welcome to my homepage!"})
    if err != nil {
        c.String(500, "Internal Server Error")
    }
}

func main() {
    r := gin.Default()

    r.GET("/", indexEndpoint)
    r.Static("/static", "static")

    r.Run(":8080")
}
```

これでとりあえずトップページの表示はいけました。
既存の Django テンプレートは特に難しいことをしていない(extend と block と変数の表示くらい)なので完全に使い回すことができました。

ついでに、 [go-bindata](https://github.com/jteeuwen/go-bindata "go-bindata") を使って、ワンバイナリにしようかと思ったけど、 `pongo2` 的につらそうだったのでやめました…。(ちゃんと調べてない)

次回はフォームまわりの処理でもやろうかと。
iOS8 extension のデバッグ方法


- extension はアプリケーションとは別のバンドルになるため、別プロセスで動く。

- デバッグログは Xcode 画面下部のログウィンドウではなく、System Log Console で確認できる。

- Swift で書いててもデバッグするには `println()` ではなく `NSLog()` を使わないとログに出力されない。（どうやらバグの様である）

- iOSSimulator でデバッグ対象の extension を使用するアプリを起動したら、メニューバーより `Debug` > `Open System Log..` を開いてデバッグログを確認できる。

参考: http://stackoverflow.com/questions/24031612/how-to-debug-ios-8-extensions-with-nslog
GitHubのAPI取り方

#GitHubにつながらないタイミングがあるとき

```
$ git pull origin devel
```

よく落ちる時間帯などをデータ収集してマイニングすればCRONなども見直せると思います。

##Developer
APIも公開されてて親切
→https://github.com/blog/1348-github-system-status-api
1年半前に公式から公開されてます。

##対象読者
* GitHubのAPIを使ってみたいがサンプルとか見てみたい
* まずは、日本語で見てみたい
* 詳しくは自分で実装したいのでさわりだけ見てみたい
* GitHubに嫌われてるのかなと思ってる方
* Rubyなどでいい感じにGitHubのAPIを連携したい方

#早速紹介します
あくまでも紹介なので、インフラ部分までは解説しません。せいぜい導入が限界です、私のやる気では

##1. ここからはコマンド中心になります
ターミナルを起動してください

---
###朗報
ターミナルといえば、3日前にiTerm2の2.0がリリースされましたので使っている方はぜひアップデートしましょう
→http://iterm2.com/news.html

具体的に変更された箇所は以下です。興味がある方は見てみるといいと思います。
→http://iterm2.com/appcasts/full_changes.txt

---


* API

```
GET /users/:username
```
###恒例のHello Worldから

```
$ curl https://api.github.com/zen
```
これを叩きますと、ランダムにレスポンスが返ります。

###ユーザの情報を返します

```
// リクエスト

$ curl -i -u 自分のユーザ名 https://api.github.com/users/ユーザ名


// レスポンス

//<ステータス部分>
HTTP/1.1 200 OK
Server: GitHub.com
Date: Wed, 16 Jul 2014 15:27:01 GMT
Content-Type: application/json; charset=utf-8
Status: 200 OK
・・・
Content-Security-Policy: default-src 'none'
Content-Length: 1301
Access-Control-Allow-Credentials: true
・・・
Vary: Accept-Encoding
X-Served-By: 03d91026ad8428f4d9966d7434f9d82e

//<JSON部分>
{
  "login": "pollseed",
  "id": 6825891,
  "url": "https://api.github.com/users/pollseed",
  "html_url": "https://github.com/pollseed",
　・・・
  "type": "User",
  "site_admin": false,
  "name": "ポールシード",
  "company": "engineer",
  "blog": "http://qiita.com/pollseed",
  "location": "Tokyo",
  "email": "",
  "hireable": false,
  "bio": null,
　・・・＜A>
  "created_at": "2014-03-01T17:09:47Z",
  "updated_at": "2014-07-15T00:30:29Z"
　・・・＜B＞
}
```
試しに私のアカウントにGETリクエストを投げてみました。長いので少し省略してます。みなさんも自分のアカウントにリクエスト投げてみてください。きっとその情報が帰ってくるはずです。

* 「-i」をつけないと、上のHTTP/1.1 200 OKというJSONの上記に書かれた部分がでなくなります。（<ステータス部分>のみ）

* 「-u」をつけないと、パスワードも入れずに見れます。要は認証しないという形を取ります。

→ちなみに-uをつけて、認証するとupdated_atの下（省略してある＜B>）にプライベートリポジトリの数や、プランや空き容量なども閲覧することができてしまいます。


###まぁ、こちらが公式のGitHubにアクセスすればHTTPのステータスが返ってくるので利用できるというわけです。

```
$ curl -i https://api.github.com
```

##2. 応用
Shellにしてもいいです.
またはアプリケーションにしてしまっても・・・その場合は
→https://github.com/settings/applications/new
こちらにクライアントIDを登録しましょう
OAuth認証のやつです。TwitterAPIと同じ要領です。迷うことはないでしょう。

こちらのサンプルソースなどは気が向いたら更新します。
例えば、GETリクエストのレスポンスJSONを加工すれば、今までアップしたリポジトリ情報から色々探れますので、バックアップの助けになったり、壊れたコミットなども取得できるかもしれないです。
重ね合わせで使えるAPIなので、色々と利用できます。

##3. 資料（In English）
* https://status.github.com/api
* https://developer.github.com/
Mackerel-agentをMacOSX(darwin)に導入する


githubからcloneしてきても良いのですが、brewで簡単に導入することもできます。
## HOW-TO
まだbrew公式には取り込まれていないため、自分で`brew tap`コマンドで追加しています

```
sudo sh << SCRIPT
brew tap motemen/mackerel-agent
brew update
brew install mackerel-agent
SCRIPT
```

Mackerelのサイトと同じように、一気にコピペすれば動きます。

導入が完了すると、設定ファイルが

`/usr/local/etc/mackerel-agent.conf`に配置されます。ここにapi-keyを追加しましょう。

```
$ vim /usr/local/etc/mackerel-agent.conf
```
Dashboadから右上の詳細ってリンクを踏むとAPIKEYがあるので、コピペします。書き加える行数は関係ないです。最初なり最後なり、自分の好きな所に。

```mackerel-agent.conf
...

apikey = "APIKEY"

...
```

保存したら、早速実行してみましょう。

```
$ sudo mackerel-agent
```

これでDashboadにあなたのMacの名前が表示されるはずです。

### エラーが出た場合
コンフィグファイルの位置の設定がおかしいとエラーが出るようです。
現状のmackerel-agentの仕様のようです。しかたがないので設定ファイルにシンボリックリンクを貼りましょう。

```
sudo sh << SCRIPT
mkdir ~/Library/mackerel-agent
ln -s /usr/local/etc/mackerel-agent.conf ~/Library/mackerel-agent/mackerel-agent.conf
SCRIPT
```

これでもう一度

```
$ sudo mackerel-agent
```
とすれば動くでしょう。


## 追記：deamon化して自動で起動するようにしよう
デーモン化していないみたいなので、このままですと、起動の度に毎回`sudo mackerel-agent`しなくてはなりません。
面倒なのでデーモン化してしまいましょう。
あまりUNIX、darwinの内部はよく理解していないので、間違っていたら編集リクエストやコメントを頂けると幸いです。

### How to

```
sudo sh << SCRIPT
sudo ln -s /usr/local/Cellar/mackerel-agent/agent/homebrew.mxcl.mackerel-agent.plist /Library/LaunchDaemons/homebrew.mxcl.mackerel-agent.plist
launchctl load /Library/LaunchDaemons/homebrew.mxcl.mackerel-agent.plist
SCRIPT
```

これでエラーが出なければ動いているかと思います。
確認方法は

```
$ launchctl list
```
とでもやって、目grepするなりパイプしてgrepしましょう。`homebrew.mxcl.mackerel-agent`があれば動作しています。
【Grunt】ファイルの指定方法いろいろ


Gruntの色々なファイルの指定方法をメモ。

##一つのファイルを指定
```gruntfile.js
{src: 'foo/this.js', dest: ...}
```

##配列で複数指定
```gruntfile.js
{src: ['foo/this.js', 'foo/that.js', 'foo/the-other.js'], dest: ...}
```

##パターンに当てはまるファイルすべて
```gruntfile.js
{src: 'foo/th*.js', dest: ...}
```

##先頭にaかbが含まれるファイルすべて
```gruntfile.js
{src: 'foo/{a,b}*.js', dest: ...}
```

##先頭にaかbが含まれるファイルすべて:その2
```gruntfile.js
{src: ['foo/a*.js', 'foo/b*.js'], dest: ...}
```

##すべてのフィイル
```gruntfile.js
{src: ['foo/*.js'], dest: ...}
```

##最初にファイルを指定した後にすべてのファイル
```gruntfile.js
{src: ['foo/bar.js', 'foo/*.js'], dest: ...}
```


##bar.jsを除くすべてのファイル
```gruntfile.js
{src: ['foo/*.js', '!foo/bar.js'], dest: ...}
```

##すべてのファイル、最後にbar.js
```gruntfile.js
{src: ['foo/*.js', '!foo/bar.js', 'foo/bar.js'], dest: ...}
```

##ファイルパスを使用
```gruntfile.js
{src: ['src/<%= basename %>.js'], dest: 'build/<%= basename %>.min.js'}
```

##gruntファイルのタスクに設定されたパスも参照できる
```gruntfile.js
jshint:{
	all:{
		src:'foo/js/'
	}
}

{src: ['foo/*.js', '<%= jshint.all.src %>'], dest: ...}
```

###参考
- [Configuring tasks](http://gruntjs.com/configuring-tasks#building-the-files-object-dynamically)
Jerseyとは

# Jerseyとは
モダンなWebアプリについて調査してるとよく出てくるJerseyってなんなのかが気になった。
セットで出てくるJAX-RSってのもついでに調べてみた。

## そもそもJAX-RSとは
JAX-RS = Java API for RESTful Web Services
JavaでつくるリッチなWebアプリのためのAPI（HTTPを直接扱う高水準API）

## JerseyはJAX-RSのリファレンス実装
**REST**っていうWebのアーキテクチャスタイルがあって、
このスタイルに沿って作成されたWebサービスが**RESTful Web Service**.
Javaで作りたい場合、**JAX-RS**ってAPIを使うと幸せになれる。
JAX-RSを参照実装している**Jersey**ってAPIを使うともっと幸せになれる。
つまり...
Jerseyとは、Javaで作るWebアプリをREST対応にするために必要な作業を簡素化できる素晴らしい技術！

## ぶっちゃけどうなん？
AngularJSとかBackbone.jsでゴリゴリWebアプリを作るのが流行ってるし、
今風のアプリを作りたいならいいかもしれない。
クライアントサイドはBackbone.jsとかSCSS
サーバサイドはJavaEE(JAX-RS)
って構成でなにか作ってみたい。

## 調べる上で新たに気になった技術
Spring MVC
Dropwizard
Play Framework
Ninja Framework

## 参考情報
* [Modern Java Web / SPA Development](https://speakerdeck.com/monzou/spa-development)
* [Jersey と Apache Tomcat を使って RESTful な Web サービスを作成する](http://www.ibm.com/developerworks/jp/web/library/wa-aj-tomcat/)
* [eXtreme JAX-RS](http://www.slideshare.net/btnrouge/extreme-jaxrs)
iOS8 BETA3


iOS8のBETAを入れてみた

インターフェイスはそれほど変更点はない。

今の時点ではBETA3だが、やたらと落ちる落ちまくる
BETAだから仕方がないのか・・・

規約うんぬんで実際のスクリーンショットなどは公開が禁止されているらしい


落ちまくる動作

1.AppStoreからのアプリダウンロード時
パスワード認証が終わりいざ！インストールとなった時点で落ちる

2.ヘッドフォンからの音楽操作
例えば「極飛ばし」をすると
固まる or 落ちる

3.Gunosyを立ち上げると落ちる
100%落ちアプリが全く起動できない

一般公開まで あと 約１ヶ月半
Appleさん期待してます。


<b><font size="5" color="blue">ただただ Appleさん</font></b><br />

macの次のOS YOSEMITE のインターフェイス最高っす！

<b><font sizes="4" color="green">iPhoneと同じフラットデザイン最高</font></b>

<b><font color="#ff1493" size="6">可愛いっす</font></b>

iPhone / Mac　ともに一般公開が楽しみですっ
TwitterBotを悪用したDDoSまがいの攻撃

# **ことわり**

- ここで扱う被害はネットワークの機能停止ではなく、 **メンション欄の機能停止** を指します。つまり、一般的なDDoSの定義と大きく異なり、あくまでこれはTwitter上における攻撃を形容したものだと考えてください。
- この記事は攻撃を助長する目的で執筆していません。私の知り合いだけで3名もの方がこの攻撃の被害に遭われており、一方Bot製作者側では対策が為されていることが少ない…という現実を踏まえて、<ins>TwitterBot製作者側での対策を促すことが目的</ins>です。まぁゼロデイ晒しでも何でもないので特にここを気にする必要はないかもしれませんが。

# **攻撃手法**

**※ ここで登場するスクリーンネームは実在するものとは一切関係ありません。**

| 立場 | スクリーンネーム |
|:---:|:---------------:|
|攻撃者| `@anonymous`<br />(多くの場合は使い捨て) |
|被害者| `@target` |
|ボット| `@A` `@B` `@C` ... `@Z`<br />(増えれば増えるほど悪質) |

1. 攻撃者が、攻撃用アカウントとして `@anonymous` を作成する。
2. 攻撃者が、**スクリーンネーム** `@anonymous` の **名前** に `@target` を含むように名前を変更する。ここでは `@target死ね` に変更したとする。
3. 攻撃者が、ボット `@A` `@B` `@C` ... `@Z` をフォローする。
4. 攻撃者が、ボットが反応する言葉をツイートする。ここでは `おやすみ` であるとする。
5. 各BOTが、 `@anonymous` に対して一斉に返信を始める。
6. `@anonymous` のメンション欄は当然BOTからの反応で埋まるが、<ins>BOTが名前を含めて返信するタイプの場合には `@target` のメンション欄も同時に埋めてしまう</ins>。

`@target` のメンション欄が埋まってしまう一例です。

```text:@Aによるツイート
@anonymous @target死ねさん、おやすみなさい！
```

```text:@Bによるツイート
@anonymous @target死ねさん…もうそろそろ寝たほうがいいよ…
```

```text:@Cによるツイート
@anonymous 寝ようよ…@target死ね…
```

...


```text:@Zによるツイート
@anonymous 【早く】@target死ね【寝ろ】
```

# **対策**

## **TwitterBot製作者**

相手の　**「名前」「現在地」「プロフィール」「ツイート本文」** などの情報をBotのツイートに引用するときは、必ず **`@` `＠`** を **除外** しましょう。

## **被害者**

### <ins>特定のアカウントのみに攻撃を受けている場合</ins>

`@anonymous` を本文中に含むツイートを全て **ミュート** しましょう。公式APIとしてはまだキーワードミュート機能は実装されていませんが、非公式アプリではこの機能が独自実装されている場合があります。

なお、この方法だと `@anonymous1` `@anonymous2` などもミュート対象になってしまいます。これを避ける場合は、 `@anonymous(?![A-Za-z0-9_])` のように **正規表現** を用いる必要があります。 

### <ins>複数のアカウントからの攻撃を受けている場合<br />いたちごっこが続いている場合</ins>

上記と同じようにミュートしたいところではありますが、こちらでは **正規表現** を使う必要があります。この時点で、正規表現対応のミュート機能が使える非公式アプリに限られることになります。

…とは言っても、相手が作成するスクリーンネームに一定の規則性を見つけなければ、正規表現を書くことは難しいでしょう。そして、規則性など全く無い場合がほとんどだと思います。従って、本文だけでミュート対象であるかを判断するのは困難です。他の要素を対象に含める必要があります。

#### **複合ルールが使える**

以下のルールを **AND条件** として設定してください。

- `[Bb][Oo][Tt]` が **「スクリーンネーム」「名前」「プロフィール」** のうち少なくともどれか1つにマッチする。
- `^@(?![Tt][Aa][Rr][Gg][Ee][Tt](?![A-Za-z0-9_]))[A-Za-z0-9_].*?(?:@|＠)[Tt][Aa][Rr][Gg][Ee][Tt](?![A-Za-z0-9_])` が **「ツイート本文」** にマッチする。

もし、正規表現のオプションで「大文字小文字を区別しない」といったものがある場合は、もう少しシンプルに書けるでしょう。

- `bot` が **「スクリーンネーム」「名前」「プロフィール」** のうち少なくともどれか1つにマッチする。
- `^@(?!target(?![a-z0-9_]))[a-z0-9_].*?(?:@|＠)target(?![a-z0-9_])` が **「ツイート本文」** にマッチする。

#### **複合ルールが使えない**

上記のうちどちらかのルールを設定することになりますが、どちらを採っても巻き添えは発生します。前者を採れば全てのBotを、後者を採れば自分が先頭ではない全ての複数メンションをミュート対象にしてしまうことになります。自分が機能不足のアプリを使用している以上、多少の妥協は必要です。
【PHP】機種依存文字を変換する最低限のコード


#やりたかったこと
ローマ数字や（株）などの機種依存文字を、大抵の環境で見られる文字に変換する必要が合った。

# コード

```
    function convSpecialChar($subject) {
		
		//変換前の文字
        $search = Array('Ⅰ','Ⅱ','Ⅲ','Ⅳ','Ⅴ','Ⅵ','Ⅶ','Ⅷ','Ⅸ','Ⅹ','①','②','③','④','⑤','⑥','⑦','⑧','⑨','⑩','№','㈲','㈱');
		//変換後の文字
        $replace = Array('I','II','III','IV','V','VI','VII','VIII','IX','X','(1)','(2)','(3)','(4)','(5)','(6)','(7)','(8)','(9)','(10)','No.','（有）','（株）');

        $ret = str_replace($search, $replace, $subject);

        return $ret;
    }

```

これで何とかなりました。
よく使われる文字だけの変換なので、全ての文字は網羅していません。

#参考
http://wataame.sumomo.ne.jp/archives/1586

http://memo.xight.org/2006-06-19-13

http://php.nekosuke.com/000056.htm
[Rails]wheneverを使って特定時間に集中しがちなバッチ処理を分散させる


毎日夜中にバッチ処理回したい時ってあるじゃないですか。しかも何も考えずに設定すると、気づいたら夜の4:00とかにタスクが集中してサーバの負荷が高くなる事もしばしば。

Railsでバッチ処理を実現するなら[whenever](https://github.com/javan/whenever)が便利ですが、wheneverを使うと以下のように例えば4時頃に実行したいタスクを10分ずつずらして実行できます。


```
# だいたい4時頃実行すればいいタスク
tasks = %w(task1 task2 task3 task4)
tasks.each_with_index do |task, i|
  exec_time = ( Time.parse("4:00") + i*10.minutes ).strftime("%H:%M")
  every 1.day, at: exec_time do
    rake task
  end
end
```

出力結果は下記。

```
0 4 * * * /bin/bash -l -c 'cd /path/to/app && RAILS_ENV=production bundle exec rake task1 --silent >> log/cron.log 2>> log/whenever.log'

10 4 * * * /bin/bash -l -c 'cd /path/to/app && RAILS_ENV=production bundle exec rake task2 --silent >> log/cron.log 2>> log/whenever.log'

20 4 * * * /bin/bash -l -c 'cd /path/to/app && RAILS_ENV=production bundle exec rake task3 --silent >> log/cron.log 2>> log/whenever.log'

30 4 * * * /bin/bash -l -c 'cd /path/to/app && RAILS_ENV=production bundle exec rake task4 --silent >> log/cron.log 2>> log/whenever.log'
```

きれいに10分ずつずれて実行されてます。
rubyって便利ですね！
画像アップローダー

画像のアップローダーを作ってみました。
今回は、画像をサーバーにアップしてDBにファイル名を保存するタイプのアップローダーです。

画像のアップロードフォーム
=
```html:form.html

<!-- MIMEのマルチパートデータとして画像を送ってくれる -->
<form action="form.php" method="post" enctype="multipart/form-data">
  <input type="file" name="upload">
  <input type="submit" value="アップロード">
</form>
```

受け取りのフォーム
=
```php:form.php
<?php
//第１引数は、フォームから受け取った画像があるかどうかの確認。第２引数では、画像を指定したフォルダに移動させている。
if (move_uploaded_file($_FILES["upload"]["tmp_name"], "img/" . $_FILES["upload"]["name"])) {
  //chmod関数を使って最初の引数で画像の場所を指定して、次の引数でパーミッションを変更している。
  chmod("img/" . $_FILES["upload"]["name"], 0644);
  echo $_FILES["upload"]["name"] . "をアップロードしました。";
  //DBに接続
  $dsn="mysql:dbname=img;host=localhost;charset=utf8";
  $user="root";
  $pass="root";
  try{
    $pdo=new PDO($dsn,$user,$pass);
  }catch(Exception $e){
    echo 'error' .$e->getMesseage;
    die();
  }
  //エラー文の発行
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
  //DBに登録するSQL文の発行
  $sql="INSERT INTO upload (img) VALUES(?)";
  $stmt=$pdo->prepare($sql);
  $stmt->execute(array($_FILES["upload"]["name"]));
} else {
  echo 'ファイルをアップロードできません。';
}
?>
```


今回使った関数
=
・move_uploaded_file関数
アップロードされたファイルを別のフォルダに移動させる関数。
第１引数でアップロードされているか確認する。第２引数で指定した場所に移動させる。
似た関数にis_uploaded_file関数がある。これは、HTTP POSTでアップロードされているか確認する関数である。ほとんど同じ処理を行っているのでどちらかでいいらしい。
mpywさんのhttp://qiita.com/mpyw/items/db12ce86b15f3b0b3c19 を参考にさせてもらいました。

・chmod関数
ファイルのパーミッションを変更する関数。
第１引数でファイルの場所をしていして、第２引数でパーミッションを変更している。

追記
=
コメントにもあるように$_FILES["upload"]["name"]はあまり使わずにサーバーで名前をつけるようにしよう。
JSONのISO8601形式の日付をbashのdateコマンドで整形する

JSONから出力される日付がISO8601形式だったので、dateコマンドで日本時間に整形した時のメモ。

```bash
date -d "`echo '2014-07-16T01:23:45Z' | sed 's/T/ /'`" +%Y/%m/%d_%H:%M:%S
2014/07/16_10:23:45
```

`'2014-07-16T01:23:45Z'`この部分は、REST APIとかで引っ張ってくる感じで使うと色々と便利。
jsTreeの使い方②


昨日書き忘れましたが、このプログラムは[github](https://github.com/ShihoYumura/fuel_samples)に全て上げてあります。
[jsTree](http://www.jstree.com/)の元ファイルと見比べると何を変更してあるかが見えるかと思いますので、参考までに。
richui/jstreeが今回の対応分です。

さて本題。

## fs.phpの設定

jstreeでデータを表示する場合、id/id/idなどの形でツリーを書かなくてはなりません。
今回は 親カテゴリID/小カテゴリID/孫カテゴリID のかたちで取得します。とはいえこれはpath()でやってくれてるのでほとんど書き換える必要がありません。
is_dirやis_fileは使いませんので、必要のない操作だけをガシガシ削ります。

ツリー表示のためのデータの取得はlst()がメインになります。

### lst()

```php
	public function lst($id, $with_root = false) {
		// $dir = $this->path($id);
		$lst = DB::select ()->from ( 'categories' )->where ( 'parent', $id )->execute ()->as_array ();
		$res = array ();
		foreach ( $lst as $item ) {
			if ($item['grade'] == 0 || $item['grade'] == 1) {
				$res [] = array (
						'text' => $item['name'],
						'children' => true,
						'id' => $item['id'],
						'icon' => 'folder'
				);
			} else {
				$res [] = array (
						'text' => $item['name'],
						'children' => false,
						'id' => $item['id'],
						'type' => 'file',
						'icon' => 'file file-txt'
				);
			}
		}
		return $res;
	}
```

カテゴリを三層までに絞りたかったので、親カテゴリと子カテゴリはフォルダ扱い、孫カテゴリをファイル扱いにしました。
children=>boolで「子要素を作成できるかどうか」が設定されるようなので、ここをそれぞれtrueとfalseに分けてます。
idにはDBから取得してきたカテゴリIDを。

このカテゴリIDが今度はツリー要素がクリックされた時にデータ取得に利用されます。textには表示文字列が入ります。

データ取得はdata()で行います。
### data()

```php
	public function data($id) {
		$dirs = DB::select()->from('categories')->where('id',$id)->execute()->as_array();
		$dir=$dirs[0];
		if ($dir['grade'] <=1) {
			// 小カテゴリでなければ下位項目を追加できる
			return array (
					'type' => 'folder',
					'content' => json_encode($dir)
			);
		} else {
			// 小カテゴリは下位項目の追加ができない
			return array (
					'type' => 'txt',
					'content' => json_encode($dir)
			);
		}
		return $dat;
		throw new Exception ( 'Not a valid selection: ' . $dir );
	}
```

ソースが汚いのはご愛嬌。
ifの条件分くらいlst()側と合わせればいいのに。

## そのほか
create/renameはmkdirとfile_put_contentsをinsertとかupdateに書き換え、deleteはdelete書き込み、あとは正規表現で弾いたりしてるところを適宜書き換え。
この辺複雑な作業はないです以上！

githubのコードでわからないところがあればwikiとかは潰してあるのでここか前の記事まで。
変数名の語彙がほしい。
AOJ 0179 Mysterious Worm(結果：Wrong Answer)

　幅優先探索の練習にと思い、AOJ0179 Mysterious Worm(http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0179)
に挑戦しました。ですが、サンプルすらまともに合わないという悲惨な結果となってしまいました。ソースコードについて、何か悪い点、考え方が間違っている点などご指摘頂けたら幸いです！m（T^T）m

```java:
import java.util.*;
public class Main {

	char node(char a, char b) {
		char[] chr = {'r', 'g', 'b'};
		for(int r = 0; r < chr.length; r++) {
			if(chr[r] != a && chr[r] != b) return(chr[r]);
		}
		return('E'); //恐らく無いが、エラー回避のため
	}

	boolean ok(char[] wormc) {
		for(int r = 0; r < wormc.length - 1; r++) {
			if(wormc[r] != wormc[r + 1]) return(false);
		}
		return(true);
	}

	void doIt() {
		Scanner stdIn = new Scanner(System.in);
		while(stdIn.hasNext()) {
			Queue<String> wormq = new LinkedList<String>();
			Queue<Integer> time = new LinkedList<Integer>();
			String worm = stdIn.next();
			if(worm.length() == 1) break;
			time.add(0);
			wormq.add(worm);
			while(!time.isEmpty()) {
				int now = time.poll();
				boolean flag = false;
				for(int k = 0; k < wormq.size(); k++) {
					String nowW = wormq.poll();
					char[] wormc = nowW.toCharArray();
					for(int r = 0; r < wormc.length - 1; r++) {
						int next = now + 1;
						if(ok(wormc)) {
							flag = true;
							if(time.isEmpty()) time.add(now);
							break;
						}
						if(wormc[r] != wormc[r + 1]) {
							char a = wormc[r], b = wormc[r + 1];
							wormc[r] = wormc[r + 1] = node(a, b);
							//System.out.println(new String(wormc));
						}
						time.add(next);
						wormq.add(new String(wormc));
						//System.out.println(next);
					}
					if(flag) break;
				}
				if(flag) break;
			}
			System.out.println(time.poll());
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Main().doIt();
	}

}


```
Postgres.appを使ってPostgreSQLを使う場合に、gem 'pg'を入れる方法


# はじめに

MacにPostgreSQLをインストールするときに、[Postgres.app](http://postgresapp.com/)というソフトウェアがあります。インストールが簡単で、プロセス制御もメニューバーのアイコンで制御できるので気楽に試せます。

この文章では、[Postgres.app](http://postgresapp.com/)を使ってRubyのgemであるpgをインストールする方法を記します。

# バージョン

使ったバージョンは以下のとおりです。

- Postgres.app : 9.3.4.2
- Mac : 10.9.4
- Ruby : 2.1.2

# 何が起きるか

何も設定を行わずに、pgをgem installすると、次のようなエラーが出てしまいます。

```shell
Fetching: pg-0.17.1.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing pg:
	ERROR: Failed to build gem native extension.

    /Users/miyohide/.rbenv/versions/2.1.2/bin/ruby extconf.rb
checking for pg_config... no
No pg_config... trying anyway. If building fails, please try again with
 --with-pg-config=/path/to/pg_config
checking for libpq-fe.h... no
Can't find the 'libpq-fe.h header
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/miyohide/.rbenv/versions/2.1.2/bin/ruby
	--with-pg
	--without-pg
	--with-pg-config
	--without-pg-config
	--with-pg_config
	--without-pg_config
	--with-pg-dir
	--without-pg-dir
	--with-pg-include
	--without-pg-include=${pg-dir}/include
	--with-pg-lib
	--without-pg-lib=${pg-dir}/lib

extconf failed, exit code 1
```

# 解決するにはwith-pg-configを設定する

これを解決するには、`with-pg-config`オプションを設定します。シェルによって`--`が解釈されないように`--`を追加します。

`with-pg-config`に設定する値ですが、Postgres.appアプリの内部にある`pg_config`へのフルパスを指定します。バージョンによっては違う場所にあるかもしれません。

```shell
[~/work/]$ gem install pg -- --with-pg-config=/Applications/Postgres.app/Contents/Versions/9.3/bin/pg_config
Building native extensions with: '--with-pg-config=/Applications/Postgres.app/Contents/Versions/9.3/bin/pg_config'
This could take a while...
Successfully installed pg-0.17.1
invalid options: -f fivefish
(invalid options are ignored)
Parsing documentation for pg-0.17.1
Installing ri documentation for pg-0.17.1
Done installing documentation for pg after 3 seconds
1 gem installed
```

# Gemfileに書いている時には環境変数`CONFIGURE_ARGS`を設定する

Railsアプリでは直接シェル上でgemをインストールすることはせず、Gemfileに書くことが多いかと思います。その場合は、環境変数`CONFIGURE_ARGS`を設定するとうまく動きます。

```shell
[~/work]$ export CONFIGURE_ARGS="with-pg-config=/Applications/Postgres.app/Contents/Versions/9.3/bin/pg_config"
[~/work]$ bundle install                                                                   Fetching gem metadata from https://rubygems.org/...........
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies...
Using rake 10.3.2
Using i18n 0.6.9
Using json 1.8.1
Using minitest 5.3.5
（中略）
Using jquery-rails 3.1.1
Using kaminari 0.16.1
Installing pg 0.17.1
Using puma 2.8.2
Using tilt 1.4.1
Using sprockets 2.11.0
（中略）
Using turbolinks 2.2.2
Using uglifier 2.5.1
Your bundle is complete!
It was installed into ./vendor/bundle
[~/work]$
```
GitLab API | gitlab gem で Issue を別のプロジェクトにコピーする

# GitLab API | gitlab gem で Issue を別のプロジェクトにコピーする
## 概要
gitlab gem で Issue を別のプロジェクトにコピーします。

## サンプル

~~~ruby
require 'gitlab'

Gitlab.configure do |config|
  config.endpoint       = 'http://some_path/api/v3' 
  config.private_token  = 'your token'
end

def find_project_id_from_project_name(name)
  Gitlab.projects(per_page: 100).select { |e|e.name == name }.first.id
end

def copy_issues(from_project_id, to_project_id)
  Gitlab.issues(from_project_id, per_page: 100).each do |issue|
    assignee_id = issue.assignee ? issue.assignee.id : nil
    milestone_id  = issue.milestone_id  ? issue.milestone_id.id : nil
    Gitlab.create_issue(to_project_id, issue.title,
      description: issue.description,
      assignee_id: assignee_id,
      milestone_id: milestone_id,
      labels: issue.labels)

    # closeされたIssueの場合はステータスをclosedに変更する
    to_issue = Gitlab.issues(to_project_id, per_page: 100).select { |e|e.title == issue.title }.first
    if to_issue && issue.state == 'closed'
      Gitlab.edit_issue(to_project_id, to_issue.id, state_event: 'close')
    end
  end
end

from_project_id = find_project_id_from_project_name('from_project')
to_project_id = find_project_id_from_project_name('to_project')
copy_issues(from_project_id, to_project_id)
~~~

## 参照
* GitLab gem RubyGems
https://rubygems.org/gems/gitlab

* GitLab gem GitHub
https://github.com/NARKOZ/gitlab
GitLab API | gitlab gem で 任意のプロジェクトの全ての Issue を疑似削除する

# GitLab API | gitlab gem で 任意のプロジェクトの全ての Issue を疑似削除する
## 概要
gitlab gem で 任意のプロジェクトの全ての Issue を疑似削除します。

GitLabの Issue は物理削除も論理削除もありません。
そのため疑似的な削除方法として、

* タイトル : delete
* ステータス : close
* ラベル : deleted

に設定してみます。

## サンプル

~~~ruby
require 'gitlab'

Gitlab.configure do |config|
  config.endpoint       = 'http://some_path/api/v3' 
  config.private_token  = 'your token'
end

def find_project_id_from_project_name(name)
  Gitlab.projects(per_page: 100).select { |e|e.name == name }.first.id
end

project_id = find_project_id_from_project_name('project_name')
Gitlab.issues(project_id).each do |issue|
  Gitlab.edit_issue(project_id, issue.id, title: 'delete', state_event: 'close', labels: 'deleted')
end
~~~

## 参照
* GitLab gem RubyGems
https://rubygems.org/gems/gitlab

* GitLab gem GitHub
https://github.com/NARKOZ/gitlab
[SystemVerilog]Sublime Textでパースする。

##はじめに。
GitHubを検索していたら、[svparse](https://github.com/eriklovlie/svparse)いうSystemVerilog向けパーサーが、
一か月ほど前に頻繁にCommitされていたので使ってみることにした。

むろん環境はSublime Text 3で、出力されたファイルをパースして、SystemVerilogコード群を読み込ませてみる。

##svparseって？
SystemVerilog 2012に準拠したパーサーらしい。
パーサー自身はJava、周りのユーティリティはPythonで実装されている。
SystemVeilogなので、対象はVerilogファイルでもオッケー。

README.mdに記述されている通り、目指すところと目指していないところが明確になっている。
目指すところは、SystemVerilogのパーサーと、シミュレーターのオプションやターゲットファイルをパースできるフォーマット(今現在はXMLのみっぽい)のテキストファイルを出力させることである。

##必要な動作環境
[How to Run](https://github.com/eriklovlie/svparse/wiki/Build)にある情報と、実際にインストールさせた
ところ、以下の通り。

* Oracle and OpenJDK 7
* Python 2.6(2.7以降が望ましい)

中のPythonコードをちょっと覗いたら、str.format関数を使っているので、2.6以降が必須で、いろいろ調べると、2.7が無難。
こういう環境がデフォでそろっているLinuxホストって、企業のセルベースLSIの開発環境にあまりないんだよね…。

今回も、Ubuntu 14.04 LTSでやってみた。

##コンパイルとインストール
コンパイルは記載されている通りに行う。

```sh
./regen.py
./gradlew installApp
```

`./build/install/svparse`に`bin`と`lib`ができているので、`/usr/local/bin`等、PATHが通っているところにコピーすれば、インストールはオッケー。

##パースするXMLファイルを作成する
`tools/simshim.py`で作成することができる。
このスクリプトの中を覗くと、`+incdir+`とか`+define+`とか`-f`とか、Verilogシミュレーターにはおなじみのオプションがある。これらを指定すればよい。
ここでは、UVMの1.1dのサンプルコードである`$UVM_HOME/examples/simple/hello_world`で作成してみる。
なお、ここで`$UVM_HOME`は`/tmp/svparse/uvm-1.1d`に設定してある。

XML作成は以下のように実行する。

```sh
tools/simshim.py +incdir+$UVM_HOME/src \ 
                 +incdir+$UVM_HOME/examples/simple/hello_world \  
                 $UVM_HOME/examples/simple/hello_world/hello_world.sv
```

すると、カレントディレクトリに以下のようなXMLファイルが生成される。

```xml:stylecheck.xml
<project>
  <incdir>/tmp/svparse/uvm-1.1d/src</incdir>
  <incdir>/tmp/svparse/uvm-1.1d/examples/simple/hello_world</incdir>
  <source>/tmp/svparse/uvm-1.1d/examples/simple/hello_world/hello_world.sv</source>
</project>
```

##ここからSublime Text

[以前書いた](http://qiita.com/tethys_seesaa/items/1676b19e7f276e94f826)感じで、XML用のビルド設定をJSONで記述し、ビルドシステムでXMLを指定する。

```json:XML.sublime-build
{
	"cmd":["svparse", "${file}"]
}
```

そして、Sublime Textから`stylecheck.xml`開く。
`ctrl`+`b`を実行すると、svparserがSublime Textから呼び出され、以下のような感じでSystemVerilogファイルをパースしてくれる。

![svparse0.png](https://qiita-image-store.s3.amazonaws.com/0/32925/4bfbda2b-b1e3-e998-a126-6d06439ee0cc.png)


##ModelSim-ASEとの違い
[以前書いた](http://qiita.com/tethys_seesaa/items/1676b19e7f276e94f826)ModelSim-ASEと組み合わせたのと比較すると、**違いは特にない** (笑)。
むろん、`tools/simshim.py`を使用することで、コードの依存関係をパースしてくれるXMLファイルを出力する分だけ、
Sublime Textのビルドファイルの内容はシンプルになるし、コマンドもワンステップで済むし、
大量のSystemVerilogファイルをコンパイルしていくとなると、svparseを使うメリットが出てくる。

ただし、現状のsvparseはシンタックスエラーがあった場合、メッセージがModelSim-ASEとあまり変わらない。
つまり、メッセージからシンタックス違反箇所を追うのが **ちょっと大変である。**

IncisiveとかVCSとか商用ツールと組み合わせるならば、[Scons](http://www.scons.org/)でやった方がまだいいかなぁ…。
Javaは不要でPythonだけだし。
ああ、今だとそれにバージョン管理ツールのCommitと組み合わせて[Jenkins](http://jenkins-ci.org/)ですかね。

##今後に期待
**またそれかよ** って感じだが、実際まだ開発中(0.1)だし、
手持ちのSystemVerilogコードでModelSim-ASEで通るコードがエラーになったりするので、致し方なし。
継続的にウォッチしておこうかと思う。

##おわりに
svparseのjarファイルを[JD-GUI](http://jd.benow.ca/)で覗いてみると、こんな感じ。
普通にANTLRをベースにしているようだ。
![svparse1.png](https://qiita-image-store.s3.amazonaws.com/0/32925/556fcc27-0cb0-39a1-c4de-a4d92b83fa88.png)
【勉強会告知】Phalcon Night　最速フレームワーク　Phalconを使い倒せ！【東京・丸の内】

Phalconの勉強会を開催します。

現在PHP最速のフレームワークと言われるPhalcon。
使ってみたい。興味がある。でも情報がなくてわからない。そんな方のために、実際に開発でPhalconを導入しているエンジニアに開発事例を公開してもらいます。
Phalconを使いこなすことで何が可能になるか。何が苦労するポイントだったか、工夫したポイントは何か。そんな超実戦ノウハウを手に入れる場にしたいと思っています。

開始日時：
2014/08/05(火)19:00〜22:00
開催場所：
株式会社インテリジェンス　丸の内第二オフィスセミナールーム
住所：
東京都千代田区丸の内2-5-2　三菱ビル8階

タイムスケジュール：
18:30－19:00	受付
19:00－19:05	主催者より『ご挨拶』
19:05－19:20	『Phalconでの開発事例共有』
株式会社インテリジェンス　サービス開発部　テクノロジーグループマネージャー　
大谷祐司氏
19:20－19:50	『プロダクト開発におけるPhalconの全容』
株式会社ソニックムーブ　新規事業推進部システムグループマネージャー　
岩井裕士氏
19:50－20:05	『受託開発のPhalcon』
株式会社ソニックムーブ　ソリューション事業部テクニカルディレクター　
平岡雅俊氏
20:05－20:20	『WISP de Phalcon』
株式会社モーションピクチャー　山本寛人氏
20:20－20:50	『Phalcon+AngularJSで作る動画プラットフォーム』
アシアル株式会社 宇都宮諒氏
20:50－22:00	懇親会

参加受付はこちら⇒　http://eventdots.jp/event/79800
Rails の Routing でパラメータを残してリダイレクトする

`/old?a=3` を `/new?a=3` にするような場合です。

```ruby
get '/old' => redirect('/new')
```
だと、`/old?a=3` が `/new` になってしまいます。

これを解決するには、キーワード引数形式で `redirect` メソッドを呼びます。

```ruby
get '/old' => redirect(path: '/new')
```

なお、レスポンスコードは、デフォルトで 301 になります。

# サンプル

/tokyo/food?a=3 を /food?a=3 にするような場合です。

```ruby
area_path = Regexp.union(Area.pluck(:name))
category_path = Regexp.union(Category.pluck(:name))

get(':area/:category' => redirect(path: '/%{category}'),
  area: area_path, category: category_path)
```
boot2dockerでulimitを変更する

※`docker restart`すると戻っちゃうんですが誰か永続化する方法知りませんか？

追記（2014/07/17）

コメント or 記事を書いてくださいました。

http://qiita.com/tukiyo3/items/07f1eb77b5ffd9031e30

追加終わり。

起動

```
boot2docker up
```

ログイン

```
boot2docker ssh
```

入ったら以下のコマンドを実行

```
sudo /etc/init.d/docker stop
sudo sh -c "ulimit -n 65535 && exec su $LOGNAME"
sudo /etc/init.d/docker start
```

確認（Mac側）

```
docker run ubuntu sh -c 'ulimit -n'
```

macの方で65535と表示されていたら終了。