OmniAICreator/Qiita-1.07M huggingface dataset:
injectionできない(null pointer exception)

ちゃんと勉強していれば当たり前なのだが、ちょっとハマったのでメモ

なんとなく、@Injectを使っていたら、何故か、injectionできないときがある。(null pointer exception)
そもそもinjectionとはインスタンスの管理をアプリケーション・サーバーに任せる機能なので、
自分でnewしたオブジェクト内で@Injectを定義してもinjectionされない。
injectionするにはinjectionされている必要がある。
コンパイルエラーとかにはならないので注意が必要。
self.propertyと_propertyの違いと、使い分け方

基本的に、

**getter/setter/init/deallocメソッドの中でだけ`_property`を使い、**

**それ以外のときはすべて、`self.property`を使う** 

のが良いでしょう。

（以下、[uasi](http://qiita.com/uasi)さんのアドバイスです）

    getter/setter の呼び出しコストは微々たるものですので、コストと副作用を考えて _property と self.property を使い分けるより、一律で self.property を使った方が楽です。

`_property`は、値を直接割り当てたり取得することしかできません。

これに対し、`self.property`は`[self property]`を呼ぶことと同じです。このやり方だと、独自のgetterやsetterをつくることができます。

（以下、[uasi](http://qiita.com/uasi)さんのアドバイスです）

	独自の getter/setter を作ることで、あるプロパティを読み書きする際に必要な追加の操作を強制できます。たとえばあるプロパティに値をセットするとき何かのカウンタを必ずインクリメントしなければならないなら、呼び出し側でカウンタを操作するのではなく独自の setter の中で操作する、ということができます。

	また、そのプロパティを持つ（＝インスタンス変数を含み、それを直接操作できる）クラスについても、インスタンス変数を触るのではなく常にプロパティを経由するようにすれば、この制約を守ることができます。

`object.property`を呼ぶことは、本質的には`[object property]`を呼ぶことです。このメソッドをいじることで、独自のgetterやsetterメソッドを使うことができます。

### 独自のgetterの例

```objc
- (Type)property{
    return 2*_property;
}
```

### 独自のsetterの例

```objc
- (void)setProperty:(Type)property
{
    _property = 2*property;
}
```

### usaiさんの独自setterの例

```objc
- (void)setProperty:(Type)property
{
    _property = property;
    _howManyTimesPropertySetted++;
}
```

さらに、`self.property`形式を使うと、単純に変数の値をsetしたりgetしたりすること以外にも良い点があります。

それは、`@property`宣言の中で適用させた属性（`weak`や`strong`など）に基づいて`@synthesize`が自動的にメモリ・カウンタの増減の有無などを処理してくれることです。

「細かいことは、おまかせ」できるわけです。

（以下、[uasi](http://qiita.com/uasi)さんのアドバイスです）

	ここで言わんとしていることも同じで、自分でカスタムの getter/setter を書いた場合は self.property に追加の効果があるかもよ、ということです。 @property と @synthesize で getter/setter を自動生成した場合も、 @property に指定する属性の内容によっては追加の効果があります。

[uasi](http://qiita.com/uasi)さん、アドバイスありがとうございました！
Xcodeを触る上で知っておいた方が良いTips

Xcodeの便利ツールとかじゃなくて、Xcodeを触る上で知っておいたほうが有利なこと
これからも追加してく


## Double Click Navigation
誰か１度はやるかもしれない
Xcodeを起動したらToolbarもAssistant Editorもない、この画面
まさに絶望、やる気をすべて奪う悪魔のウィンドウ
![xcode1.jpg](https://qiita-image-store.s3.amazonaws.com/0/33505/63a96db7-508b-8d76-5044-7635f5a3f6c7.jpeg)
原因はProject Navigatorのファイルをダブルクリックで新しいウィンドウを開いたままXcodeを閉じてしまうこと。
解決には`Prefarence... > Navigation > Double Click Navigation`を`Uses Separate Tab`にすること
これで、ファイルをダブルクリックしたときは、タブで表示される。


## ショートカット
私がよく使うのだけ、他にもいくつかあるけど
![key_bind.jpg](https://qiita-image-store.s3.amazonaws.com/0/33505/763d5116-2ed5-b970-5862-c673be7b8304.jpeg)

### 編集
`Esc` 補完機能の呼び出し
`Cmd + /` コメントアウト（または解除
`Cmd + ¥` ブレークポイントの設置（または削除

### ファイル操作
`Cmd + T` タブ
`Cmd + Shft + [` 後ろのタブを開く
`Cmd + Shft + ]` 前のタブを開く
`Cmd + W` タブを閉じる
`Cmd + Shft + F` ワークスペースから検索
`Cmd + G` 次の検索対象を開く
`Cmd + Shft + G` 前の検索対象を開く
`Cmd + Shft + Opt + F` ワークスペースから置換

### ビルド
`Cmd + R` 実行
`Cmd + B` ビルド
`Cmd + .` 実行、ビルドを停止
`Cmd + Shft + K` クリーン

### その他
`Cmd + Shft + 2` Organizarを開く


## Function Menu
### #pragma mark -
メソッドをグルーピングする時にコード内に`#pragma mark`と記述することができる
また、`#pragma mark - `と記述することで、ラインを引く事ができる

```objective-c:AppDelegate.m
#pragma mark グルーピングA
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    return YES;
}
							
- (void)applicationWillResignActive:(UIApplication *)application
{
}

#pragma mark - グルーピングB
- (void)applicationDidEnterBackground:(UIApplication *)application
{
}
```
結果
>![xcode2.jpg](https://qiita-image-store.s3.amazonaws.com/0/33505/9c220c39-4736-b5ad-7c3a-72507e45c40b.jpeg "xcode2.jpg")

また、`#pragma mark`はXcode4.4からソースエディタジャンプができるので、次のようにClassNameを指定することで飛ぶ事ができるようになった

```objective-c:AppDelegate.m
#pragma mark - ClassName
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    return YES;
}
```

### // TODO:
コメントアウトに`TODO: `を書く事で、それを強調することができる

```AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // TODO: Override point for customization after application launch.
    return YES;
}
```
結果
>![xcode3.jpg](https://qiita-image-store.s3.amazonaws.com/0/33505/45693708-07d4-8438-c8c7-bfd3e4eec611.jpeg "xcode3.jpg")

### #warning
ビルド時に警告として表示させる

```objective-c:AppDelagate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
#warning 警告ですよー
    return YES;
}
```
結果
>![Xcode4.jpg](https://qiita-image-store.s3.amazonaws.com/0/33505/7a9920b4-9200-be00-67ca-16882a906aab.jpeg "Xcode4.jpg")


### FIXME: !!!: ???:
あんまりつかわない気がする
[Excel]VBAを使わずに、フルパスからファイル名のみ・パスのみを取得する

VBAでしかファイル名のみ、パスのみは取得できないのか？！と嘆いていた同胞に捧げます。


# unix ver.

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/36476/314e4d05-5b01-1676-924e-ba5825ce93e3.jpeg)

## (1) ファイル名のみ

```
=RIGHT(A1, LEN(A1)-FIND(">",SUBSTITUTE(A1,"/",">",LEN(A1)-LEN(SUBSTITUTE(A1,"/","")))))
```
## (2) パスのみ
```
=LEFT(A1,FIND(">",SUBSTITUTE(A1,"/",">",LEN(A1)-LEN(SUBSTITUTE(A1,"/",""))),1)-1)
```

# win ver.

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/36476/7ae091d9-eb21-f3d6-33cd-2b26c9de4289.jpeg)

## (1) ファイル名のみ

```
=RIGHT(A1, LEN(A1)-FIND(">",SUBSTITUTE(A1,"\",">",LEN(A1)-LEN(SUBSTITUTE(A1,"\","")))))
```
## (2) パスのみ

```
=LEFT(A1,FIND(">",SUBSTITUTE(A1,"\",">",LEN(A1)-LEN(SUBSTITUTE(A1,"\",""))),1)-1)
```

# こめんと

+ 数式の中にある「>」は、中間的に利用しています。パス中に出てこない文字列であればなんでもOKです。
+ 一部の探しもとめていた人に喜ばれるTipsです。

# 参考
+ 式の仕組みについては以下URLに記載しています
+ http://www.works4life.jp/excel-getting-filename-from-full-path/

# 変更履歴

## 2017/10/10

+ 中間的に利用している文字を「★」から「>」に変更しました。
+ 元記事追加

## 2016/01/05
（２）のファイル名のみ取得の関数を更新しました。短くなりました。以前の関数は以下のような感じ。

```
=MID(A1,FIND(">",SUBSTITUTE(A1,"/",">",LEN(A1)-LEN(SUBSTITUTE(A1,"/",""))),1)+1,LEN(A1)-FIND(">",SUBSTITUTE(A1,"/",">",LEN(A1)-LEN(SUBSTITUTE(A1,"/",""))),1))
```

一番最初のMID関数を実施するのに、（２）のパスのみの文字列の長さを取っていましたが、以下のようなことをしています。
 
1. A1からパスのみの文字列をSUBSTITUTEで空白に変換する
2. MID関数で1文字目以降の文字列を取得する
Amazon Linuxのログインメッセージを編集する（MOTD）

## 背景
/etc/motdを編集すれば、Linuxのログインメッセージを変更できる。
しかし、Amazon Linuxでは、OSを再起動するとシステムが書き換えてしまう。
その解決方法。

## 解決方法その一
誰が更新しているのか？
/etc/motdはシンボリックリンクで、実体は/var/lib/update-motd/motd。

```bash
ls -la /etc/motd
lrwxrwxrwx 1 root root 25  5月  9 20:03 2013 /etc/motd -> /var/lib/update-motd/motd
```
このファイルの更新しているのが、以下のスクリプト達。

```bash
$ ls -la /etc/update-motd.d
合計 20
drwxr-xr-x  2 root root 4096 11月  5 09:01 2013 .
drwxr-xr-x 76 root root 4096 11月  5 09:02 2013 ..
-rwxr-xr-x  1 root root  220 10月 16 22:51 2013 30-banner
-rwxr-xr-x  1 root root  441 10月 16 22:51 2013 70-available-updates
-rwxr-xr-x  1 root root 2103 10月 16 22:51 2013 75-system-update
```

各スクリプトをみると、30-bannerを編集することでログインメーセージをカスタマイズ可能なことが判る。

## 解決方法そのニ
/etc/update-motd.d/*は編集したくない、という場合はこちら。
/etc/bashrcで独自のメッセージを流すようにしてやれば良い。

```bash
$ diff /etc/bashrc.old /etc/bashrc 
43a44,50
> 
>   if [ -f /etc/motd.d/custom ]; then
>     echo
>     cat /etc/motd.d/custom;
>     echo
>   fi
85a93
> 
```
Ubuntuのbootが途中で止まってログインできなくなった時の対処メモ


今朝Ubuntuのbootが途中で止まったときに、会社の人が助けてくれました。その時やったときのメモ

なんか、ドライバとかを変更したりするとこういう現象がおこるらしい

# コマンドラインで起動する。
bootし直す。そのとき、Shiftキーを連打してGrubを立ち上げるようにする。
GrubからGUIではなくコマンドラインで立ち上げる。

# gdmをインストールする

```
# apt-get install gdm
```

でgdmをインストールする。
gdmをインストールをすると、ディスプレイマネージャー選択する画面がでてくるので、gdmを選択する。

gdmがインストールされているときは、

```
# dpkg-reconfigure gdm
```

とするらしい。

その後、

```
# reboot
```

でrebootしたら、無事GUIが起動してログインできました！
Scala xsbt-web-plugin で Jetty を扱う際のTips

ScalaでWebアプリケーションコンテナを扱うためのプラグインxsbt-web-pluginについて。
sbtを0.13.1にして使用するとJettyの起動/終了で以下のエラーが発生していた。

起動時
`java.lang.ClassNotFoundException: javax.servlet.jsp.JspPage`

終了時
`java.nio.channels.AsynchronousCloseException`

0.13.0ではこれは起こらない。
「0.7.0で直したよ」というもののいまだエラーが出ていたのだが、issueにこんなコメントが。

```
"org.eclipse.jetty" % "jetty-webapp" % "9.1.2.v20140210" % "container",
"org.eclipse.jetty" % "jetty-plus" % "9.1.2.v20140210" % "container"
```

「jetty-plusを入れれば回避できるみたい」だそうだ。
まだ試していないが、0.7.0とこの対応で何とかなりそう。

しかしstart/stopを繰り返していると異常に重たくなる(リークが起きているのか？)のだが、それも例外が発生しなくなれば解消するのか・・・試してみたい。

＜参考issue＞
[Exceptions on start and stop with sbt 0.13.1](https://github.com/earldouglas/xsbt-web-plugin/issues/142#issuecomment-35021903)

GitHubのissueをストックしておく機能がほしいところだ。APIもあるので検討。
HDFS Snapshotの備忘録


### snapshotのsnapshotを取得しようとするとどうなるのか?

* 取得できない
* snapshot可能なディレクトリはネストできない
  * 例えば、/user/rootがsnapshot可能だとすると
  * /userや、/user/root/testはsnapshot可能にできない
* また、あるスナップショット可能なディレクトリをスナップショット不可にするためには、そのディレクトリのsnapshotを全て消去しなければならない

### snapshotを保持した状態でHDFSをアップグレードできるか?

* 2.2.0から2.3.0-rc0はできた
* 他は知らない

### snapshot一覧を確認するには

snapshot可能なディレクトリを全て表示

```bash:
$ hdfs lsSnapshottableDir
drwxr-xr-x 0 root supergroup 0 2014-02-13 03:09 3 65536 /user/root/snapshots
```

表示されたディレクトリ配下の.snapshotを確認

```bash:
$ hdfs dfs -ls /user/root/snapshots/.snapshot
Found 3 items
drwxr-xr-x   - root supergroup          0 2014-02-13 03:08 /user/root/snapshots/.snapshot/s20140213-030839.081
drwxr-xr-x   - root supergroup          0 2014-02-13 03:08 /user/root/snapshots/.snapshot/s20140213-030845.880
drwxr-xr-x   - root supergroup          0 2014-02-13 03:09 /user/root/snapshots/.snapshot/s20140213-030908.224
```

### ドキュメント

http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsSnapshots.html

* タイトルがHFDS Snapshotになっていますが・・・
  * 2.4リリースで修正予定
  * 参考: https://issues.apache.org/jira/browse/HDFS-5709

### 日本語記事

HDFSのスナップショット

 * http://sinchii.hatenablog.com/entry/2013/12/21/161145
最近のPCでLinuxのインストーラが動かない場合、別のPCでインストールを済ませよう

SecureBootを無効にしたり、EFIで色々いじったがインストーラが起動しない。

```bash:試したメディア
・OK : Windows 8.1
・OK : VMWare ESXi 5.5
・ダメ : CentOS6.5 (syslinuxの起動に成功するもメニューを出すところでエラーなのかPC再起動がかかる。)
・ダメ : Ubuntu13.10 (同上)
```

Linuxの起動が可能なPCでインストールをすませたSSDを問題のPCに接続したところ起動出来た。

CentOS6.5だと /etc/udev/rules.d/70-persistent-net.rules にMACアドレスとethの対応が
書かれるので、そこだけ注意。
Redmineの運用で役に立った情報ソース

#はじめに
Redmineの導入、運用をする中で役に立った情報ソースです。
と言っても、今のところ各公式ドキュメントを読みつつRails関係のコマンドや引数について調べたらだいたい解決しているので結果的に一次情報へのリンク集になっています。
自分はBitnami版で運用をしているため、内容もBitNami版に偏っています。通常版の運用に対してはここに挙げた情報では不足している部分もあると思います。
BitNami版に限れば新規インストール,プラグインの追加,プラグイン/本体のバージョンアップについては大体いけると思います。
そのうち細かいトラブルシューティングの記事とか周辺ツールの情報も追記すると思います。

#公式ドキュメント
##Railsドキュメント
Railsの基礎知識　http://railsdoc.com/rails_base
Rake http://railsdoc.com/rake
Gem http://railsdoc.com/gem
bundle http://railsdoc.com/references/bundle
マイグレーションの実行(rake db:migrate) http://railsdoc.com/references/rake%20db:migrate
設定ファイル(config) http://railsdoc.com/config

##Redmine
Redmine Wiki http://www.redmine.org/projects/redmine/wiki/Guide
Redmine Wiki(日本語訳)http://www.redmine.org/projects/redmine/wiki/JaGuide
Redmine本体のdocディレクトリ内のドキュメント(INSTALL,UPGRADING)

##BitNami
**BitNami Redmine**
http://wiki.bitnami.com/Applications/BitNami_Redmine
BitNami Redmineのドキュメントトップページ
インストールやアップデート手順はここに従うのが吉

**BitNami console**
http://wiki.bitnami.com/Components/BitNami_console
Redmineの場合はuse_redmineという名前のやつです。
Win/Linux/Mac関係なくBitNamiのアプリに共通の環境変数設定用のスクリプト。
コマンドラインで操作する時には必ずこれを実行。

**BitNami MySQL(バックアップ/レストア手順)**
http://wiki.bitnami.com/Components/MySQL#How_to_create_a_database_backup.3f
定期バックアップやRedmineのVerUPの時に必要

#コミュニティ
BitNami(Redmineカテゴリ)
http://community.bitnami.com/category/redmine/

#その他情報サイト
##Redmine.jp
http://redmine.jp/
http://slides.redmine.jp/
【Python】@ってなんぞ？（デコレータについて）

pyramidのチュートリアルを進めてるんだけど、知らないことがたくさん出てくる。

とりあえず、しょっぱなに@のついたソースが出てきた。
Java使ってると、どうしてもアノテーションかと思ってしまうわけだけど、
そんなわけもなく、調べてみると、デコレータだそうです。

デコレータっていうのは、オブジェクトをラップするために使用するもの。
[デザインパターン](http://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3_%28%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%29)にあったね、そんなの。

んで、Pythonではそのデコレータが機能として提供されているみたい。
デコレータを使用した簡単なソースを書いてみた。

```py3

# デコレータ（デコレートする関数の前に"before"、後ろに"after"を出力する）
def deco_test(func):
    def wrapper(arg):
        print("before")
        func(arg)
        print("after")
    return wrapper


# デコレータを使用した関数@を使ってデコレータを呼び出す。
@deco_test
def hello(arg):
    print("Hello, " + arg)

hello("world!")
```

実行結果は下のようになる。
before
Hello, world!
after

ちなみに、デコレータを使用したhello関数は下の関数に置き換えることができる

```py3
def hello(arg):
    print("Hello, " + arg)
hello = deco_test(hello)
```

最初はよくわからなかったけど、いろいろ試してみて、
Pythonは関数もオブジェクトってのを強烈に覚えた。
関数が引数になっている。それで、関数を格納した変数に()をつけて実行すると。

すごく柔軟にプログラム書けそうだけど、
動的型付けだし、命名しっかりやらないと、
とっても分かりづらいコードが出来上がりそう。

ちなみに、pyramidのチュートリアルで出てきたコードは以下の通り

```py3
@view_config(route_name='home', renderer='templates/mytemplate.pt')
def my_view(request):
    try:
        one = DBSession.query(MyModel).filter(MyModel.name == 'one').first()
    except DBAPIError:
        return Response(conn_err_msg, content_type='text/plain', status_int=500)
    return {'one': one, 'project': 'tutorial'}
```

このview_configってのがクラス名だったから、少し悩んだけど、
@の部分はインスタンス作成となり、__init__に引数を渡す。
デコレートする関数のmy_viewはインスタンス呼び出しの__call__でラップされる。

ってことだと思うけど、検証はまた今度。
GitでcommitするたびSEを流す

前にどっかで読んだような気がしたんだけどな〜？

Gitは管理ディレクトリ下の.gitの下にhooksてディレクトリがあって，そこでcommit前とか後とか，色々なイベントごとに起動させるスクリプトを定義できる．フックできるイベントは[公式ページ](http://githooks.com/ "Git Hooks")参照．

以下手順．
1. どっかから好みのSE（効果音）を拾って来る．
2. .git/hooks/post-commit にSE再生のスクリプトを配置する．
3. post-commit にchmodで実行権限を付加する．
4. コミットするたびしあわせなきぶんになる．

post-commitの例

```sh:post-commit
#!/bin/sh
afplay ~/Music/se/coin.mp3
```

いじょ．
fs によるファイル上書きと追記の例


```CofeeScript
fs = require('fs');
data = "上書き";
fs.writeFile 'ufufu.txt', data , (err) ->
    console.log  err
```

```CofeeScript
fs = require('fs');
data = "追記";
fs.appendFile 'ehehe.txt', data ,'utf8', (err) ->
    console.log err
```

<div class="booklink-box" style="text-align:left;padding-bottom:20px;font-size:small;/zoom: 1;overflow: hidden;"><div class="booklink-image" style="float:left;margin:0 15px 10px 0;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4048703676/suvenesthat-22/" name="booklink" rel="nofollow" target="_blank"><img src="http://ecx.images-amazon.com/images/I/511TIB5mncL._SL160_.jpg" style="border: none;" /></a></div><div class="booklink-info" style="line-height:120%;/zoom: 1;overflow: hidden;"><div class="booklink-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/asin/4048703676/suvenesthat-22/" name="booklink" rel="nofollow" target="_blank">サーバサイドJavaScript Node.js入門</a><div class="booklink-powered-date" style="font-size:8pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://yomereba.com" rel="nofollow" target="_blank">ヨメレバ</a></div></div><div class="booklink-detail" style="margin-bottom:5px;">清水俊博,大津繁樹,Jxck,小林秀和,佐々木庸平,篠崎祐輔,高木敦也,西山雄也 アスキー・メディアワークス 2012-10-26    </div><div class="booklink-link2" style="margin-top:10px;"><div class="shoplinkamazon" style="margin-right:5px;background: url('http://img.yomereba.com/yl.gif') 0 0 no-repeat;padding: 2px 0 2px 18px;white-space: nowrap;"><a href="http://www.amazon.co.jp/exec/obidos/asin/4048703676/suvenesthat-22/" rel="nofollow" target="_blank" title="アマゾン" >Amazonで見る</a></div><div class="shoplinkkindle" style="margin-right:5px;background: url('http://img.yomereba.com/yl.gif') 0 0 no-repeat;padding: 2px 0 2px 18px;white-space: nowrap;"><a href="http://www.amazon.co.jp/gp/search?keywords=%83T%81%5B%83o%83T%83C%83hJavaScript%20Node.js%93%FC%96%E5&__mk_ja_JP=%83J%83%5E%83J%83i&url=node%3D2275256051&tag=suvenesthat-22" rel="nofollow" target="_blank" >Kindleで見る</a></div><div class="shoplinkrakuten" style="margin-right:5px;background: url('http://img.yomereba.com/yl.gif') 0 -50px no-repeat;padding: 2px 0 2px 18px;white-space: nowrap;"><a href="http://hb.afl.rakuten.co.jp/hgc/0ad351e7.0c19bedd.0ad351e8.0b782a71/?pc=http%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F12072215%2F%3Fscid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2Fev%2Fbook%2F" rel="nofollow" target="_blank" title="楽天ブックス" >楽天ブックスで見る</a></div>                  	  	  	  	</div></div><div class="booklink-footer" style="clear: left"></div></div>
シェルでNcFTPを使ってリモートのファイルをリネームして差し替える


```sh:NcFTPでリモートのファイル名を変更する
#!/bin/bash

echo 'open -u ${USER} -p ${PASS} ${HOST}
cd ${BASE_DIR}
ls
rm -rf ${BACKUP_FILE}
rename ${CURRENT_FILE_NAME} ${BACKUP_FILE}
rename ${NEW_FILE_NAME} ${CURRENT_FILE_NAME}
ls
quit'|ncftp
```

ファイルを切り替える際に、Jenkinsから叩こうと思って書いたけど、結局却下して、下のpythonに変更した。

```py:Pythonでリモートのファイル名を変更する
#!/usr/bin/env python
# -*- coding: utf-8 -*-

print 'python >>>'

import sys, os, datetime, re
from ftplib import FTP

ftp_host = 'ホスト名'
ftp_user = 'ユーザー名'
ftp_pass = 'パスワード'
ftp_base_dir = 'リネームするファイルのあるディレクトリ'
ftp_from_dir = '新しく公開するファイル'
ftp_to_dir = '現在公開中のファイル'
ftp_backup_prefix = '_'

def main(arg_user='', arg_pass='', *args):

	if arg_user == '' or arg_pass == '':
		print '  Rename directory failed'
		print '    Error: User or Password is not input.'
		return

	ftp_user = arg_user
	ftp_pass = arg_pass
	
	dt = str(datetime.datetime.utcnow())
	dt = dt.replace(':', '-')
	dt = dt.replace(' ', '_')
	dt = re.sub(r'\.\d+', '', dt)

	print '  Rename directory start >>> ' + dt

	try:
		ftp = FTP(ftp_host)
		ftp.login(ftp_user,ftp_pass)
		ftp.cwd(ftp_base_dir)
		file_list = ftp.nlst()
		if ftp_from_dir in file_list:
			ftp.rename(ftp_to_dir, ftp_backup_prefix+dt)
			ftp.rename(ftp_from_dir,ftp_to_dir)
		else:
			print '  Rename directory failed'
			print '    Error: NotFound New Directory'
		ftp.close()
		print '  Rename directory finished'

	except Exception as e:
		print '  Rename directory failed'
		print '    Error: ' + e.message


if __name__ == '__main__':
	sys.path.append(os.path.dirname(__file__))
	sys_args = sys.argv
	args = sys_args[1:] if len(sys_args) > 1 else []
	main(*args)
```

```sh:上のpythonを実行
python file_rename.py UserName Password
```

バックアップは、アップロードの時にすればいいから
古いファイルは削除でいい気がする。
ipaファイルをWebからインストールする時のdownload-manifest用plistの作り方


AIRで作った時、Xcodeでplistが作れないのでメモ。
チームのメンバーが登録済みならTestFlight使った方が早い。

ローカルサーバー立てて複数端末でチェックしたい時とかに。

##manifestファイル

アプリのダウンロード用のplistを作る。
ファイル名は何でもいい。

```xml:manifest.plistを作る
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>items</key>
  <array>
    <dict>
      <key>assets</key>
      <array>
        <dict>
          <key>kind</key>
          <string>software-package</string>
          <key>url</key>
          <string>http://example.com/test.ipa</string>
        </dict>
      </array>
      <key>metadata</key>
      <dict>
        <key>bundle-identifier</key>
        <string>com.example.test</string>
        <key>bundle-version</key>
        <string>1.0.0</string>
        <key>kind</key>
        <string>software</string>
        <key>subtitle</key>
        <string>Company Name</string>
        <key>title</key>
        <string>AppName</string>
      </dict>
    </dict>
  </array>
</dict>
</plist>
```

##ダウンロード用HTML

ダウンロード用HTMLに上記plistへのリンクを設定する。

```html:ダウンロードページにplistへのリンクを設定する
<a href="itms-services://?action=download-manifest&url=http://example.com/manifest.plist">install app</a>
```

##ContentType

ファイルのContentTypeは以下の設定になってないとダメらしい。

```htaccess:htaccessでファイルのタイプを設定する
AddType application/octet-stream .ipa
AddType application/x-plist .plist
```
【誤りでした】EasyMockでfinalメソッドをモック化

**できたと思ってたのはEasyMockをうまく騙せて、Partial Mockインスタンスを作成できたというだけでした。デバッグしてみると実際のfinalメソッドが呼ばれてしまうのでダメでした。誤解を与える記事を書いてしまい、すみませんでした。**
----

ネタ感満載。
finalメソッドをモック化したい場合。PowerMock使えないけどなんとかしたいとかそんなときに。

```java:Sample.java
public void hoge() {
    finalMethod();
}

public final void finalMethod() {
    // do something
}
```

final修飾子をなかったことにすればいい。

```java:SampleTest.java
public class SampleTest extends EasyMockSupport {
    private Sample testee;
    @Test
    public void testHoge() throws Exception {
        Method finalMethod = Sample.class.getMethod("finalMethod");
        Field modifiers = finalMethod.getClass().getDeclaredField("modifiers");
        modifiers.setAccessible(true);
        modifiers.set(finalMethod, Modifier.PUBLIC.ordinal());
        modifiers.setAccessile(false);
        testee = createMockBuilder(Sample.class).addMockedMethod(finalMethod).createMock();
        testee.finalMethod();
        replayAll();
        testee.hoge();
        verifyAll();
    }
}
```

FW開発ならまだしも、通常のアプリ開発でfinalって見ないなー。
ジェムストリング問題


```ruby:gemstring.rb
# 渡された文字列からパターンを律儀に洗い出し数をカウントする
# ただし、まともにやると時間がかかりすぎるため以下の最適化を行う
# ・渡された文字列が同じものはパターン数をメモしておき再利用する
# ・同じ文字が連続している場合は丸ごと飛ばす（重複排除のため）
# 一度カウントを出力してみたところメモ数は2千数百程度だった

def gemstring(str, target)
	out = ""
	cash = {} 
	count = gemstring_main(str, target, out, cash)
	return count
end

def gemstring_main(str, target, out, cash)
	pres = ""
	count = 0

	# 文字列の長さが0なら終了
	if str.length == 0
		return [count, false]
	end

	array = str.split("")
	# 頭から順に1文字ずつ取得する
	array.each_with_index do |s, idx|
		# 同じ文字が続いた場合はスキップ
		if s == pres
			next
		end

		# 前回分の文字を更新
		pres = s

		# カウントに+1する
		count = count + 1

		# 出力文字列を生成
		newOut = out + s

		# 目標の文字列ならカウントを返して終了
		if newOut == target
			return [count, true]
		end

		# 残った文字を渡して再帰する
		newArray = str.split("")
		newArray.delete_at(idx)
		newStr = newArray.join("")

		# 目標の文字列の前方一致していたらメモは使わない
		if cash.has_key? newStr and out != target[0, out.length]
		then
			# メモから取得
			result = cash[newStr]
			count = count + result
		else
			# メモにない場合は再帰的にカウントを取得
			(result, flg) = gemstring_main(newStr, target, newOut, cash)
			count = count + result
			if flg
				# 目標に辿り着いた場合は処理を切り上げる
				return [count, true]
			end
		end
	end

	# 今回の結果をメモ
	cash[str] = count
	return [count, false]
end

# こんなかんじで使う
#gems = ARGV[0]
#target = ARGV[1]

#(result, flg) = gemstring(gems, target)
#if flg
#	puts "目標到達 total = [%d]" % result
#else
#	puts "その文字列には到達しません"
#end
```
私の答え：5578864439
大体0.17秒くらい
Rubyはかじっただけなので色々おかしいかも。
再帰は一時期ゴリゴリやってたのでそれを思い出しながら。
【誤りでした】EasyMockでprivateメソッドをモック化

**できたと思ってたのはEasyMockをうまく騙せて、Partial Mockインスタンスを作成できたというだけでした。デバッグしてみると実際のprivateメソッドが呼ばれてしまうのでダメでした。誤解を与える記事を書いてしまい、すみませんでした。**
----
ネタ的な感じで振られたので、思い付きでやってみた。PowerMockとかいうEasyMock拡張ライブラリでも同様のことができるみたい。需要はそこそこあるのかしら。

以下のようにpublicメソッド内でprivateメソッドを呼び出している。

```java:Sample.java
public void hoge() {
    fuga();
}
private void fuga() {
    // do something
}
```

このときに、fuga()メソッドをモック化したい場合、通常のEasyMockの使い方ではprivateメソッドはモック化できないけど、以下のようにすれば一応モック化できる。

```java:SampleTest.java
public class SampleTest extends EasyMockSupport {
    private Sample testee;
    @Test
    public void testHoge() throws Exception {
        Methog fuga = Sample.class.getDeclaredMethod("fuga");
        testee = createMockBuilder(Sample.class).addMockedMethod(fuga).createMock();

        // 可視性を強制的にpublicにする
        fuga.setAccessible(true);
        fuga.invoke(testee);

        replayAll();
        testee.hoge();
        verifyAll();
    }
}
```
奥の手だから、本来はこんなハックはするべきじゃない。
[Objective-C] UIViewの座標と座標変換について


UIViewはそれぞれ座標系を保持しています。
自身のView座標系の値は`view.bounds`、親ビューからの相対位置は`view.frame`が保持しています。
言葉だと分かりづらいので、図にすると以下のような値をそれぞれ保持していることになります。
（cview1、cview2ともにUIView）

![cap.png](https://qiita-image-store.s3.amazonaws.com/0/5616/69f07861-9c76-2625-0f13-4422c8fe5c85.png "cap.png")


実際に上記の状態で以下のログを出力してみます。

```objc
//cview1のframeとboundsを出力
NSLog(@"cview1.frame : %@", NSStringFromCGRect(self.cview1.frame));
NSLog(@"cview1.bounds: %@", NSStringFromCGRect(self.cview1.bounds));

//cview2のframeとboundsを出力
NSLog(@"cview2.frame : %@", NSStringFromCGRect(self.cview2.frame));
NSLog(@"cview2.bounds: %@", NSStringFromCGRect(self.cview2.bounds));
```

```log
cview1.frame : {{0, 0},   {320, 240}}
cview1.bounds: {{0, 0},   {320, 240}}
cview2.frame : {{0, 240}, {320, 240}}
cview2.bounds: {{0, 0},   {320, 240}}
```

ログを見ると一目瞭然ですね。
`frame.origin`は親ビューからの相対位置が保持されているのに対し、`bounds.origin`は自身の座標系になっているのが分かります。

以上を踏まえた上で。
とある位置（例えばタッチされた位置など）が与えられたとして、それぞれの座標系ではどの位置なのかというのを取得したい場合があります。
そのときに使うのが、UIViewのインスタンスメソッド`convertPoint:toView`や`convertPoint:fromView`というメソッドになります。

これはそれぞれレシーバ(※)から対象（あるいはその逆）の座標変換を行うメソッドです。
簡単なテストをしてみましょう。以下のように指定し、ログに出力してみます。

*※…上記メソッドを実行しているインスタンス*


##`convertPoint:fromView:`サンプル

```objc
//touchオブジェクトを取得
UITouch *touch = [touches anyObject];

//タッチ位置が、該当のView上のどこかを取得
CGPoint touchpoint1 = [touch locationInView:self.cview1];

//cview1からcview2の座標系に位置を変換
CGPoint touchpoint2 = [self.cview2 convertPoint:touchpoint1 fromView:self.cview1];

NSLog(@"touchpoint1: %@", NSStringFromCGPoint(touchpoint1));
NSLog(@"touchpoint2: %@", NSStringFromCGPoint(touchpoint2));
```

```log
touchpoint1: {93.5, 184.0}
touchpoint2: {93.5, -56.0}
```

サンプルでは、`touchesBegan:withEvent:`メソッドで得られたタッチ位置を元に、`self.cview1`と`self.cview2`のそれぞれの座標系での位置を出力しています。

3D系に詳しい人であれば、 **ワールド座標系とモデル座標系の座標変換をイメージ** すると分かりやすいと思います。

##convert***系メソッド

上記のメソッドにはいくつか類似のメソッドがあります。

| メソッド | 型 | 説明 |
|---------|----|-----|
| convertRect:toView: | CGRect | レシーバの座標系を`toView`座標系に変換 |
| convertRect:fromView: | CGRect | `fromView`座標系をレシーバの座標系に変換 |
| convertPoint:toView: | CGPoint | レシーバの座標系を`toView`座標系に変換 |
| convertPoint:fromView: | CGPoint | `fromView`座標系をレシーバの座標系に変換 |

上記メソッド、なにをどう変換するかをしっかり把握しておくことが大事です。

```objc
// aView座標系の座標`aView.bounds`を、`toView`座標系に変換
[aView convertRect:aView.bounds toView:otherView];
```

上記ポイントは、`aView.bounds`を変換している点です。これを`aView.frame`にすると違った結果になってしまうので注意が必要です。
拡張子を省略してPHPアプリを呼び出す。

PHPでフレームワークとかみたいなルーティングをindex.phpでするようなwebアプリ **ではない** webアプリで呼び出すときに拡張子(`.php`)を省略して呼び出せる方法。

Apacheで使ってたんだけどWebmatrixのIIS expressで走らせようとしたときにデフォルトで設定されていなかったみたいなのでメモ。

## Apacheの場合

```apache:.htaccess
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
```


## IISの場合

```xml:Web.config
<configuration>
  <system.webServer>
      <rewrite>
          <rules>
              <rule name="omitted extension" stopProcessing="true">
                  <match url="^(.*)$" ignoreCase="false" />
                  <conditions>
                      <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
                      <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
                      <add input="{REQUEST_FILENAME}.php" matchType="IsFile" ignoreCase="false" />
                  </conditions>
                  <action type="Rewrite" url="{R:1}.php" appendQueryString="true" />
              </rule>
          </rules>      
      </rewrite>
  </system.webServer>
</configuration>

```


rewriteの書き方がちょっと違うだけでやってることは一緒。(Apacheの方は`RewriteCond %{REQUEST_FILENAME} !-f`飛ばしてるけどw)

別にphp以外の拡張子にも同じようにかけば省略できる。

#参考
http://technet.microsoft.com/ja-jp/library/dd647603.aspx

----
#追記

Nginxの場合はこんな感じ？(と言ってもPHPだとfpm辺り使うだろうからお決まりのアレが必要なのは言うまでもないけど)→http://dev.hinaloe.net/2014/07/nginx-extension-less-call/
App申請前Validate時の「the bundle identifier cannot be changed from the previous version」回避メモ

### error
>the bundle identifier cannot be changed from the previous version

これから始まるBundle identifier+provisioning関連のエラー回避

1. Bundle identifierの間違いを疑う
1. プロビジョニングファイル(mobileprovision)の新旧、証明書との関連付けミスを疑う
1. itunes Connect側のアプリ管理画面にて「Waiting for upload」状態になっているかを疑う
1. Precompile Prefix Header の項目がYESになっているかを疑う。

##### Precompile Prefix Header：YES　の罠
Cleanでも残るっぽい。
昔のPrefixが残り、これがArchiveされてプロビジョニングファイル側のPrefixと衝突してエラーが出ているか確認する。プロビジョニングファイルの期限切れ更新を挟むと起こりやすい。
NOにしてArchiveするべし。
画像の一部を切り取って使う

![$Actor_etc2.png](https://qiita-image-store.s3.amazonaws.com/0/37417/485817f9-62ec-caea-6374-b27e8da93882.png)

こういうスプライト画像の

![20140213-235211.png](https://qiita-image-store.s3.amazonaws.com/0/37417/2d8f53ef-abe5-d400-fa70-b15647842a53.png)

この部分だけ切り取る時とかに使います。

```objc:UIImage+Custom.m
#import "UIImage+Custom.h"

@implementation UIImage (Custom)

- (UIImage *)partialImageOfRect:(CGRect)rect
{
	CGPoint	originDrawPoint	= CGPointMake(rect.origin.x * -1, rect.origin.y * -1);
	
	UIGraphicsBeginImageContextWithOptions(rect.size, NO, [UIScreen mainScreen].scale);
	[self drawAtPoint:originDrawPoint];
	UIImage* partialImage = UIGraphicsGetImageFromCurrentImageContext();
	UIGraphicsEndImageContext();
	
	return partialImage;
}

@end
```

使う時は

```objc
// 元のスプライト画像を取得
UIImage*  sourceImage = [UIImage imageNamed:@"tono.png"];
// 切り取る枠を指定
CCRect    rect  = CGRectMake(0, 0, 32, 32);
// トリミング画像を取得
UIImage*  createdImage = [sourceImage partialImageOfRect:rect];
```

こんな感じ。

もっと良いやり方があったら教えて下さい。
grunt-este-watchで特定フォルダを監視対象から外す方法

基本的には全フォルダを監視対象にしたいけど、Yeoman,Grunt,Bower,etc... が生成するフォルダを監視対象から外したい。

# `node_modules/`を監視対象から外す場合

```coffeescript
module.exports = (grunt) ->

  grunt.initConfig

    ...

    esteWatch:
      options:
        dirs:['*/','!node_modules/','*/**/','!node_modules/**/']

    ...
```

# `node_modules/` `hoge/` `fuga/`を監視対象から外す場合

```coffeescript
module.exports = (grunt) ->

  grunt.initConfig

    ...

    esteWatch:
      options:
        dirs:['*/','!{node_modules,hoge,fuga}/','*/**/','!{node_modules,hoge,fuga}/**/']

    ...
```
王女様の宝石パターンを見つけよう！ を、ruby で

CodeIQ に @hyuki さんが出した「王女様の宝石パターンを見つけよう！」を、ruby で解いてみた。
問題は
http://www.hyuki.com/codeiq/#c14
と
https://codeiq.jp/ace/yuki_hiroshi/q684
のあたり。問題文は読めないけど。

```ruby
#!ruby

class Array
  def remove_one( c )
    r=self.clone
    r.delete_at(self.index(c))
    r
  end
end

def normalize( list )
  m=Hash[ *list.uniq.sort.zip( ?a..?z ).flatten ]
  list.map{ |c| m[c] }
end

def count_all( list, memo )
  return 1 if list.empty?
  list = normalize( list )
  memo[ list.inspect ] ||= list.uniq.inject(1){ |a,c|
    a+count_all( list.remove_one(c), memo )
  }
end

def index( s, list, memo )
  return 0 if s.empty?
  pre = list.uniq
      .select{ |c| c<s[0] }
      .inject(0){ |a,c| a+count_all( list.remove_one(c), memo ) }
  pre + index( s[1..-1], list.remove_one( s[0] ), memo ) + 1
end

gems = open( "./gemstring/gems.txt" ){ |f| f.read.strip }.chars.sort
goal = open( "./gemstring/princess.txt" ){ |f| f.read.strip }

p index( goal, gems, {} )
```

アルファベットを数字とみなし、0.baccaa のような小数を小さい順に並べたものと考えた。
再帰呼び出しの引数を正規化した上でメモ化することで計算量を削減した。

順当な実装のつもりなんだけど、どうだろう。

しかし。Array に「ある値に該当するものをひとつだけ撤去」というメソッドがないのが意外だった。
逆に言うと。必要そうなものは全部あるような気分でいつも ruby に接しているということではある。
iOSでposition:fixedした要素がスクロール中だけz-indexを無視して前面に表示されてしまうバグ

ブラウザの表示領域に対して要素の位置を固定してくれる``position: fixed;``は、表示領域が限られるスマートフォンでこそ使いどころがたくさんあるのだが、（特にAndroidで）バグが多くて実用にはまだまだ慎重にならざるを得ない。

今回は、iOSで遭遇したバグについて記述しておく。

#症状

``position: fixed``を指定した要素が``z-index``を無視する。
精確に説明すると、``position: fixed``を指定した要素が、表示領域外にある部分が、スクロールされて表示領域に入ってきたときに、スクロールされている間だけ、``z-index``が無視されて、より大きな``z-index``が指定されている（即ちより手前の）要素より前面に表示される。

実際のコードをご覧いただこう。

```html
   <div class="contents">ここに通常のコンテンツ</div>
   <div class="bg"></div><!-- 背景表示のための要素 -->
   <div class="footer">
      iPhoneだと通常スクロールしなければ見えない要素
   </div>
```
```css
   .contents {
      position: relative;
      z-index: 10;
      height: 500px;
   }
   .bg {
      position: fixed;
      z-index: 1;
      top: 0px;
      left: 0px;
      width: 100%;
      height: 100%;
      background-image: url(bg.jpg);
   }
   .footer {
      position: relative;
      z-index: 10;
      height: 200px;
      background-color: #fff;
   }
```

``div.footer``は、スクロールしなければ見えない位置にある。
スクロールすると見えるはずなのだが、なぜか``div.bg``の下に隠れて見えないのだ。そしてこの現象が発生するのは、 __スクロールしている間だけ__ であり、スクロールが停止した段階で、前面に正しく表示される。
また、``div.footer``がスクロール前に表示領域内に一部でも見えていれば、この現象は発生しない。

現象を確認した環境

- iOS7 Safari, Chrome
- iOS6 Safari, Chrome

iOS版 Operaではこの現象は見られなかった。


### ``position:fixed``を使った理由
なぜ、``div.contents``に``background``を設定するのではなく、``div.bg``という要素をわざわざ用意しているかというと、背景画像をスクロールさせずに固定位置に配置したかったからである。
背景画像を固定にするためのプロパティ``background-attachment: fixed``は、スマートフォンではうまく機能しないケースが多いため、このようなハックが出回っているが、そのために別のバグにでくわしたというわけだ。

#対応策
下に隠れてしまう``div.footer``に以下のcssを指定することで解消される。

```css
.footer {
   -webkit-transform: translate3d(0,0,0);
}
```

ただし、``translate3d``を設定することによって、Androidでは全く別のバグを誘発しうるので注意を要する。
必要に応じて、JavaScriptでユーザーエージェントで判定してclass属性を出し分けるなどして、このCSS記述がiOSのときだけ反映されるように工夫してやる。

---

``position:fixed``くらい、そろそろ普通に使いたい。``background-attachement:fixed``も。
JavaScript の変数宣言を最初にした方がいいなあと思わせる例


JavaScript の変数宣言はスコープの最初にまとめてした方がいいと言われていますが、個人的には使う直前に宣言したい派です。

そんな人でも、やっぱり最初に宣言した方がいいのかな、と思わせる例を考えてみました。

```js
var a = 12;
(function () {
  a = 23;
  var a;
  console.log(a);
})();
console.log(a);
```

普通に考えると 23, 23 と表示されそうですよね。

ところが実際は 23, 12 と表示されます。不思議ですね。

これはどうしてかと言うと、JavaScript の変数宣言は「スコープの最初でしたのと同じ」になるからです。つまり、以下と同じ意味です。

```js
var a = 12;
(function () {
  var a;
  a = 23;
  console.log(a);
})();
console.log(a);
```

[hoisting](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var#var_hoisting) というやつですね。

・・・というような予想外なことが起きるので、変数を最初に書いておけば間違いはない、ということですね。

まあ、そもそも同じ変数名使うなよ、という話もありますが。
C++11 STL Container Efficiency その４（探索)

[その２（範囲挿入）](http://qiita.com/temoki/items/c2e44b852fea9bf94d7f)後の状態の各コンテナ内100万要素を探索(std::accumulate()使用)。

##調査コード
対象コンテナは vector, deque, list, set, unordered_set の5つ。

```cpp
// vector<int> v;
int sum = std::accumulate(v.cbegin(), v.cend(), 0);
```

```cpp
// deque<int> d;
int sum = std::accumulate(d.cbegin(), d.cend(), 0);

```

```cpp
// list<int> l;
int sum = std::accumulate(l.cbegin(), l.cend(), 0);
```


```cpp
// set<int> s;
int sum = std::accumulate(s.cbegin(), s.cend(), 0);
```


```cpp
// unordered_set<int> us;
int sum = std::accumulate(us.cbegin(), us.cend(), 0);
```

##結果

|コンテナ|時間|
|:--|--:|
|vector|0 ms|
|deque|0 ms|
|list|3 ms|
|set|13 ms|
|unordered_set|3 ms|

測定環境: Intel Core i7-4850HQ 2300 MHz (4 cores), Apple LLVM version 5.0
ハイブリッドアプリのパフォーマンスを向上する

# ハイブリッドアプリのパフォーマンスを向上する
ハイブリッドアプリ開発の勉強会に参加しました。
http://www.zusaar.com/event/2967003
その中で、ハイブリッドアプリのパフォーマンスを向上させるテクニックを聞いたのでまとめます。

ハイブリッドアプリをパフォーマンスを意識せずに作った場合、ネイティブアプリと比べて動作が遅くなってしまいます。
パフォーマンスを上げて、いかに軽快に動作させるかがハイブリッドアプリ開発では重要だと思いました。


## 1. クリックイベントを使わない
クリックイベント、a要素を使わず、touchイベントで処理する。
tappableやfastclickなどのライブラリを利用すると良い。
クリックイベントでは、ダブルクリックでない事の確認を行っている分レスポンスが遅い。


## 2. CSSアニメーションを使う
アニメーションにCSSTransitionを使う。
JavaScriptでやるよりもはるかに早い。


## 3. jQueryではなくZepto.jsを使う
jQueryはPCのWebブラウザ向けライブラリであり、モバイル向けに使うには余計な処理が多い。
zepto.jsはモバイル向けに最適化されたライブラリ。
jQueryの互換APIが提供されている。


## 4. 動作確認は遅い方で行う
WebViewはAndroidよりもiOSの方がはるかに早い。
動作確認は遅い方のプラットフォームで行った方が良い。
iOSで動作確認を行いながら開発を進めて、開発終了後にAndroidで使い物にならないというケースがあり得る。


## 5. なるべくリフローを起こさない
リフローするごとに、画面全体のレイアウトの再計算処理が走る。
以下がリフローを起こす原因。

*  内部テキストの変更、iput要素への入力
*  DOMツリーの操作
*  width,height,marginなどの変更


## 6. リフローのコストを下げる
要素のwidth,heightは固定で指定する。
フローベースのレイアウトを避ける。
position,absolute,fixedを積極的に使う。
要素位置や大きさを変えるには、transformを使う。
DOMDocumentFragmentsを使って、DOM要素の繰り返し挿入を避ける。
jQueryのDeferredで並列処理を直列処理

Deferredでajaxの処理を直列つなぎにするときのTips。
ajaxの処理はsetTimeoutで代用したけど、ajaxでも同じことができる。
ソースをコピペするとdivの中にexec1 exec2 exec3 と表示される。
ajaxで取得したデータをもとにまたajaxといった時に使える（はず）。

```html:test.html
<div id="content">
    
</div>
```

```javascript:deferredTest.js
exec1().then(exec2).then(exec3);

function exec1(){
    var def = new $.Deferred();
    
    //ajaxの処理と仮定
    setTimeout(function(){
        $('div#content').append('<p>exec1</p>');
        def.resolve();
    },3000);
    
    return def.promise();
}

function exec2(){
    var def = new $.Deferred();
    
    //ajaxの処理と仮定
    setTimeout(function(){
        $('div#content').append('<p>exec2</p>');
        def.resolve();
    },2000);
    
    return def.promise();
}

function exec3(){
    var def = new $.Deferred();
    
    //ajaxの処理と仮定
    setTimeout(function(){
        $('div#content').append('<p>exec3</p>');
        def.resolve();
    },1000);
    
    return def.promise();
}
```
tmuxのwindowモードをviにする


以前[tmuxの文字列コピーがめっちゃ便利！！](http://qiita.com/shoma2da/items/4ec3496806b8faba17a4)でtmuxの文字列コピーできる説明をしました。

ここでのカーソル移動がvimのキーマッピングと書きましたが、環境によっては設定が必要だったようです。（設定してあったのかな...？）

設定は以下です。

```Bash:~/.tmux.conf
set-window-option -g mode-keys vi
```
Node.jsで現在時刻を取得


Javascriptの標準関数でやろうとすると案外めんどくさいのでNode.jsのモジュールで良いものが無いか探したらdate-utilsというのがあったので使ってみました。

[JerrySievert/node-date-utils](https://github.com/JerrySievert/node-date-utils)


##npmでインストール
```
$ npm install date-utils
```
すぐに入ります。

##使いたい場所で呼び出す
これだけ。
めっちゃ簡単でした。

```index.js
require('date-utils');

var dt = new Date();
var formatted = dt.toFormat("YYYYMMDDHH24MISS");
console.log(formatted);
```

```結果(2014年2月13日22時19分33秒です)
20140213221933
```

ちなみに自由に区切り文字を入れられるので
`dt.toFormat("YYYY/MM/DD HH24時MI分SS秒");`とかにすれば，`2014/02/13 22時29分06秒`と出力されます．

使ってる(サーバー)マシンで指定されている時間を呼び出すので，表示される時間がおかしい時はマシン設定を見てみると良いと思います．

###指定の仕方
`toFormat()`というメソッドで割と色々な形で時刻を取得できます．

```date-utilsのREADME.mdより
d.toFormat(format); // returns date formatted with:
  // YYYY - Four digit year
  // MMMM - Full month name. ie January
  // MMM  - Short month name. ie Jan
  // MM   - Zero padded month ie 01
  // M    - Month ie 1
  // DDDD - Full day or week name ie Tuesday 
  // DDD  - Abbreviated day of the week ie Tue
  // DD   - Zero padded day ie 08
  // D    - Day ie 8
  // HH24 - Hours in 24 notation ie 18
  // HH   - Padded Hours ie 06
  // H    - Hours ie 6
  // MI   - Padded Minutes
  // SS   - Padded Seconds
  // PP   - AM or PM
  // P    - am or pm
```

参考[日付型をフォーマットしたりする - dunno logs ](http://d.hatena.ne.jp/dany1468/20111008/1318050210)
MTAppjQueryでテキスト(複数行)のカスタムフィールドにリッチテキストエディタを適用する


#### 手順.1
***
Movable Type に MTAppjQuery プラグインをインストール
https://github.com/tinybeans/mt-plugin-MTAppjQuery


#### 手順.2
***
テキストエリア用のカスタムフィールドを作成

	システムオブジェクト: (ブログ)記事
	種類	: テキスト(複数行)

ここでは、(ブログ)記事の編集画面に追加されたテキストエリアを想定。

#### 手順.3
***
/mt-static/plugins/MTAppjQuery/user-files/user.js を編集

	(function($){
		// ブログ記事編集画面
		if( mtappVars.screen_id == 'edit-entry' ){

			// カスタムフィールドで追加したテキストエリアにTinyMCEを適用
			var _esm = MT.App.EditorStrategy.Multi;
			var _create = _esm.prototype.create;
			var _set = _esm.prototype.set;

			_esm.prototype.create = function(app, ids, format) {
				jQuery('textarea[id^="customfield_"]').each(function(i) {
					ids.push(this.id);
				});
				_create.apply(this, arguments);
			};

		}
	})(jQuery);

任意のテキストエリアのみを対象にする場合は「jQuery('textarea[id^="customfield_"]')」のセレクタ指定部分を調整。

「mtappVars.blog_id」による分岐・・・などは、お好みで。

#### 手順.4
***
/mt-static/plugins/MTAppjQuery/user-files/user.css に追記

	#sortable > .field > .field-content > .mt-editor-manager-wrap { display: block !important; }

デフォルトでは「本文」以外の「.mt-editor-manager-wrap」にインラインスタイルで「display:none;」が指定されているため。

#### 手順.5
***

ブログ > 設定 > 投稿 の「テキストフォーマット」を「リッチテキスト」または「改行を変換」で指定
ejsやectテンプレートでのfor文メモ


いつも忘れるからメモ

Express(Node.js)で利用出来るテンプレートエンジンでectを最近使っていますが，ejsのようにforEach文を書こうとすると失敗したのでメモ

##ejs
itemsという変数がコントローラー側から渡された値です．

```hoge.ejs 
	<% items.forEach(function(item){ %>
	  <li>
	  	<%= item.name %>
	  	<%= item.comment %>
	  	<%= item.slide %> 	
	 	<%= item.created %>
	 	</li>
	<% }) %>
```

##ect
ectテンプレートで上記の書き方ではエラーが出ました．
上記の記述をect風に直すとこんな感じです．

```hoge.ect
	<% for item in @items : %>
	  	<%= item.name %>
		<%= item.comment %>
		<%= item.slide %>
		<%= item.created %>
	<% end %>
```

###ちなみにif文は
こんな感じみたいです．for文もだけどCoffeeScriptライクですね。

```
<% if @links?.length : %>
	<ul>
		<% for link in @links : %>
			<%- linkHelper link %>
		<% end %>
	</ul>
<% else : %>
	<p>List is empty</p>
<% end %>
```
参考: [ECTのページ](http://ectjs.com/)
AWS SDK for PHPをPEARで入れる

現在最新のAWS SDKはcomposerで入れるようになっています。最新バージョンは[こちら](https://packagist.org/packages/aws/aws-sdk-php)で確認して、composer.jsonのrequireに追加してやってください。

# 古い内容
[公式ドキュメント](http://pear.amazonwebservices.com/)の通りに実行するだけだと

```text
$ sudo pear channel-discover pear.amazonwebservices.com
Adding Channel "pear.amazonwebservices.com" succeeded
Discovery of channel "pear.amazonwebservices.com" succeeded
$ sudo pear install aws/sdk
Unknown remote channel: guzzlephp.org/pear
aws/sdk requires package "channel://guzzlephp.org/pear/Guzzle" (version >= 3.0.3)
No valid packages found
install failed
```

と怒られる。

ので、オプション1個追加するだけだがコピペ用に以下をメモしておく。

```bash
sudo pear channel-discover pear.amazonwebservices.com
sudo pear -D auto_discover=1 install aws/sdk
```

そしてAwsをuseする前に以下を書いておく。

```php:
<?php
require_once 'AWSSDKforPHP/aws.phar';
```
HTML5で円の軌跡を描く


canvasの勉強がてら

```index.html
<!DOCTYPE HTML>
<html>
<head>
<title>円</title>
</head>
<body>
<script type="text/javascript" src="./circle.js"></script>
<canvas id="canvas" width="400" height="400">
</canvas>
</body>
</html>
```

円の軌跡はは三角関数を使用すれば描けるっぽい

```cirle.js
(function(){

var
w = window,
d = document,

COLOR_RED = '#FF0000',

// 円の半径
RADIUS = 100,
// 軌跡を描く円のサイズ
LOCUS_CIRCLE_SIZE = 5,

Circle;

proxy = function(a,b){return function(){return a.apply(b, arguments)}};

Circle = function(){

	d.addEventListener('DOMContentLoaded', proxy(this.init, this));
};

Circle.prototype = {

	/**
 	 * 初期処理
 	 */ 
	init: function(){

		var
		self  = this,
		canvas = d.getElementById('canvas');

		if (!canvas || !canvas.getContext){
			return false;
		}

		// 三角関数に渡す角度
		self.angle = 1;
		self.point = {
			x : 50,
			y : 50
		};

		self.canvas = canvas;
		self.center = {
			x : canvas.width  / 2,
			y : canvas.height / 2
		};

		self.timer = null;

		self.ctx = self.canvas.getContext('2d');

		// 処理を実行(タイマーで)
		self.setTimer();
	},

	/**
 	 * アニメーションを実行
 	 */
	animate: function(x, y){

		var
		self = this,

		ctx    = self.ctx,
		center = self.center,
		width  = self.canvas.width,
		height = self.canvas.height;

		// アニメーションを実行(clear -> draw)
		ctx.clearRect(0, 0, width, height);

		// ベースとなる円
		ctx.beginPath();
		ctx.arc(center.x, center.y, RADIUS, 0, Math.PI * 2, false);
		ctx.stroke();

		// 軌跡
		ctx.beginPath();
		ctx.fillStyle = COLOR_RED;
		ctx.arc(x, y, LOCUS_CIRCLE_SIZE, 0, Math.PI * 2, false);
		ctx.fill();
	},

	/**
 	 * 描画に必要なパラメータを設定
 	 */
	setParam: function(){

		var
		self   = this,
		center = self.center;

		// 三角関数で円の軌跡を描く
		self.point.x = RADIUS * Math.cos(self.angle * Math.PI/180) + center.x;
		self.point.y = RADIUS * Math.sin(self.angle * Math.PI/180) + center.y;

		// アニメーションの実行
		self.animate(self.point.x, self.point.y);

		// 角度を加算
		self.angle++;
	},

	/**
	 * タイマー
	 */
	setTimer: function(){

		var
		self  = this,
		delay = 10;

		clearInterval(self.timer);
		self.timer = setInterval(function(){
			self.setParam();
		}, delay);
	}

};

new Circle();

})();
```

できたー
[実行結果](http://mtdev.jp/samples/circle/)
Ruby メタプログミングめも

## define_method
動的にメソッドを追加する。
ポイントは１つのメソッドで複数のメソッドを定義できる所にある。

```rb

# １から１０００までのxの倍数を返す。
def multiple_method(x)
  (1..1000).each_with_object([]) do |number, array|
    if number % x == 0
      array << number
    end
  end
end

(2..5).each do |x|
  define_method("multiple_of_#{x}") do
    multiple_method(x)
  end
end

print multiple_of_2
print multiple_of_3
print multiple_of_4
print multiple_of_5

## 下記改良版
def multiple_method(multiple, range=1000)
  block_method = proc { |argument|
    (1..range).each_with_object([]) do |number, array|
    if number % argument == 0
      array << number
    end
  end
  }
  (1..multiple).each do |x|
    define_method("multiple_of_#{x}") do
      block_method.call(x)
    end
  end
end
```

## send
レシーバの持っているメソッドを引数にして呼び出す。

```rb
["upcase", "downcase", "capitalize"].each do |method_name|
 puts "toKYo".send("#{method_name}")
end

```

## class_eval
classの外からでもメソッドを定義できる。

```rb

class MyClass
  def sum_value_1
    puts "a" * 100
  end
end

MyClass.class_eval do
  def sum_value_2
    puts "i" * 100
  end
end

```

## instance_eval
ブロック内で変数を利用する

```rb

class MyClass
  attr_accessor :tokyo, :osaka

  def initialize(tokyo="tokyo", osaka="osaka")
    @tokyo = tokyo
    @osaka = osaka
  end
end



aaa = MyClass.new
aaa.tokyo

aaa.instance_eval do
  puts "#{@tokyo} と #{@osaka}は大都市です。"
end


```

##Procオブジェクト
ブロックをオブジェクトに格納する。

```rb
array = ["asakusa", "ginza", "shibuya", "ikebukuro", "sinjyuku", "ueno"]
aaa = proc { |b|
  b.detect{ |a| a =~ /^asa/}
}

bbb = Proc.new{ |b|
  b.detect{ |a| a =~ /^gin/}
}

ccc = lambda{ |b|
  b.detect{ |a| a =~ /^ue/}
}

puts aaa.call(array)
puts bbb.call(array)
puts ccc.call(array)

```
単一要素の上下左右中央配置

ティーザーサイト等で、ページの上下左右中央に画像1枚だけ配置したい時

# html
```html
<html>
<body>
<div class="container">

<p class="img"><img src="img.jpg" alt="hoge" /></p>

</div>
</body>
</html>
```

# css
```css
html ,
body ,
.container {
  margin:0;
  padding:0;
  width:100%;
  height:100%;
}

.container {
  display:table;
}

.img {
  display:table-cell;
  text-align:center;
  vertical-align:middle;
}

```
scoptでコマンドラインオプションを解析

パターンマッチで解析でもある程度事足りるけど、ライブラリを使ってみることに。
[scallop](https://github.com/scallop/scallop)では、util-evalと併用したらEvalでexceptionが発生したので※、[scopt](https://github.com/scopt/scopt)を使うことにした。

```java:※exception
java.lang.NoSuchMethodException scala.reflect.internal.TreeInfo.firstArgument
```

# 解析結果を保持するcase classを用意する
コマンドラインで期間指定したい時。指定なしは前日とする。

```scala:caseclass
case class CommandLineArgs(
  from: DateTime = DateTime.now.minusDays(1),
  to: DateTime = DateTime.now.minusDays(1))
```

# parserを作る
文字列をorg.joda.time.DateTimeに変換する。

```scala:parser
   val parser = new scopt.OptionParser[CommandLineArgs]("your program name") {
      val dtf = DateTimeFormat.forPattern("yyyyMMdd")
      opt[String]('f', "from") action { (x, c) =>
        c.copy(from = DateTime.parse(x, dtf))
      } text ("from is date")

      opt[String]('t', "to") action { (x, c) =>
        c.copy(to = DateTime.parse(x, dtf))
      } text ("to is date")
      
      help("help") text("print this usage text.")
    }
```

# parse
Option[CommandLineArgs]が返ってくる。

```scala:parse
parser.parse(args, CommandLineArgs())
```
[JavaScript]MobileSafariやUIWebView上でスクロールさせない


iPhoneやiPadのMobileSafariでWebアプリなどを作る際、
ページのスクロール(バウンド)にイベントを取られて、
タップイベントが使えない場合の対処方です。

```javascript
document.ontouchmove = function(event){
    event.preventDefault();
}
```

【動作】
スクロール : しない
バウンド : しない
[Objective-c]UIWebViewでバウンドさせない


UIWebViewでバウンドさせない方法です。

以下のコードをUIWebViewを使っているクラスに記述します。
やっていることは。UIWebViewからUIScrollViewを探して、bouncesオプションをfalseにします。

```objective-c
    for (id subview in _webView.subviews) {
        if ([[subview class] isSubclassOfClass: [UIScrollView class]]) {
            ((UIScrollView *)subview).bounces = NO;
        }
    }
```

【動作】
スクロール : する
バウンド : しない
[git] gitで libcurl.so.4 が No such file or directory


gitを使っていると以下の様なエラーが表示されました。

```bash
git-remote-http: error while loading shared libraries: 
libcurl.so.4: cannot open shared object file: No such file or directory
```

原因は分かりませんが、いつの間にか環境変数が抜けていたようです。

以下をrcファイルに追記するなどして下さい。

```bash
LD_LIBRARY_PATH="/usr/local/lib"
```
[Objective-C]UISplitViewController のスワイプジェスチャーを無効にする


iPadでUISplitViewControllerを使用している場合、横にスワイプするとchildViewControlerが左から出てきて邪魔な場合があります。

そういった場合は、UISplitViewControllerのpresentsWithGestureオプションをNOに設定します。

```objective-c
self.presentsWithGesture = NO;
```

[UISplitViewController Class Reference](https://developer.apple.com/LIBRARY/IOS/documentation/UIKit/Reference/UISplitViewController_class/Reference/Reference.html#//apple_ref/occ/instp/UISplitViewController/presentsWithGesture)
[Objcetive-C]UITableViewCellの削除ボタンのラベルを変更する


UITableViewCellの削除ボタンをカスタマイズする方法です。

UITableViewDelegateのtitleForDeleteConfirmationButtonForRowAtIndexPathメソッドを実装して、ラベル名を返せばOK

```objc
- (NSString *)tableView:(UITableView *)tableView 
    titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    return @"さくじょ";
}
```

![image](http://blog.o24.me/wp-content/uploads/2012/06/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2012-06-06-9.53.30.png)
アプリから複数回、safariでURLを開くときの注意

# アプリから複数回、safariでURLを開くときの注意

テストを作成するために、アプリから複数回URLを開くという処理を書いていた。
そのとき、ハマったのでメモ。

URLを開く時、Safariの場合 **同じURLで開いたタブがある場合、新しいタブでアクセスせず、そのタブを表に出すだけ** でした。

アクセスを何度もしているのに、ログが上がらないと思って調べていたらわかりました。

# 解決法

解決法は単純でURLの最後に、適当な乱数をつめればOK

```Objective-c
NSString *url = [NSString stringWithFormat: @"%@?nocache=%d","http://www.google.com",((int)arc4random()) % 128];
[[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]]
```

arc4random()を使うときは、2の累乗がよいらしい。
→http://tanukichi566.blog.fc2.com/blog-entry-57.html
NSTextView にドラッグ＆ドロップしたときのキャレットの位置を取得する

`NSTextView` のキャレットの位置は通常 `[aTextView selectedRange].location` で取得できる。キャレットの位置は幅0の選択範囲と同義だからである。

しかし、 _テキストを選択した状態で_ `NSTextView` の上で何かをドラッグしたとき表示されるキャレットの位置はこの方法では取得できない。この場合、 `NSDraggingInfo` からマウスカーソルの位置を取得し、キャレットの位置に変換すればよい：

```objc
- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender {
    NSPoint dropPoint = [self convertPoint:[sender draggingLocation] fromView:nil];
    NSUInteger caretLocation = [self characterIndexForInsertionAtPoint:dropPoint];
}
```

参考：[nstextview - Set the cursor to a pointing hand over a text view - Stack Overflow](http://stackoverflow.com/questions/13658424/set-the-cursor-to-a-pointing-hand-over-a-text-view)
adbのforwordで詰まった件

## 事象
- adb forwardしたらerror

```bash:forwarding
$ adb -s hogehoge forward tcp:8080 tcp:8080
error: cannot bind to socket
```

## 原因
- 8080がすでに使われてる

```bash:netstat
netstat -na | grep 8080
```

- Jenkinsおじさんが8080を使ってた

## 対処方法
- 8080以外でforwardする

```bash:forwarding
// 一例
$ adb -s hogehoge forward tcp:9002 tcp:8080
```

or

- Jenkinsを一度停止してから、forwardingして、その後にJenkinsを立ち上げる

```bash:forwarding
// Jenkins停止
$ sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
// 8080にフォワード	
$ adb -s hogehoge forward tcp:8080 tcp:8080
// Jenkins起動
$ sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist
```

## 参考
- [AndroidDriverのポートフォワーディング設定でcannot bind to socketがでたら](http://qiita.com/mamoida/items/89b0d2c2087a5864ed7a)
- [Jenkins の起動と停止とその設定](http://www41.atpages.jp/toatsushi/wp/archives/83)