OmniAICreator/Qiita-1.07M huggingface dataset:
vagrant ユーザでプロビジョニングする

root ユーザではなく、vagrant ユーザでシェルスクリプトを利用したプロビジョニングをしたい場合

起動用のシェルスクリプトとは別のスクリプトを用意し、
別ユーザで実行します。

良い例
==========
```bootstrap.sh
# vagrant ユーザとしてセットアップする
sudo -u vagrant sh /vagrant/setup.sh
```

```setup.sh
# 初期化処理
```


ダメな例
==========
```bootstrap.sh
su vagrant

# 初期化処理
```

スクリプトの中で su しても反映されないのはなぜ？
==========
> Running a program (such as /bin/sh, sudo or su) in a shell script cannot change anything in the context (working directory, running user etc) in which it runs, only set the context for the process it creates (and only change the running uid if running as root - uid 0). This is also why cd is a builtin command in shells. su is a setuid program (note the "s" when you try the command "ls -l which su") which means that it will run as the user owning the program (root) rather than as the user running it.


参考
==========
- [Adam Fields (work stuff) - Some tips on getting started with Vagrant and Chef](http://workstuff.tumblr.com/post/50911984233/some-tips-on-getting-started-with-vagrant-and-chef)
- [Can I switch user in Vagrant bootstrap shell script? - Stack Overflow](http://stackoverflow.com/questions/16768777/can-i-switch-user-in-vagrant-bootstrap-shell-script)
【メモ】tomcatの管理ユーザ設定

`conf/tomcat-users.xml`の設定例

`manager-gui`, `admin-gui`の両方の権限を１つのユーザ(admin)にさせたい場合

```
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="admin" password="" roles="manager-gui,admin-gui"/>
```

↑このような感じでrolesにCSV形式で渡す。


```NG例
<user username="admin" password="" roles="admin-gui"/>
<user username="admin" password="" roles="manager-gui"/>
```
↑のように２行に渡って書くと、最後の行しか有効にならなくてハマります。

あと、XMLを修正したらtomcat再起動が必要。
grub:0を手動インストールする

KVMゲストとかで `grub --install` が上手くいかない場合、手動インストールで大抵なんとかなる。

----

```shell-session

    GNU GRUB  version 0.97  (640K lower / 9216K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename. ]

grub> device (hd0) /dev/vda

grub> root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83

grub> setup (hd0)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot/grub/e2fs_stage1_5 (hd0)"...  20 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd0) (hd0)1+20 p (hd0,0)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded
Done.

grub>
Xcode5で自分のコードをAPIリファレンス的にまとめていく話


いつのまにかもう一年の25分の1が過ぎてしまいました。すっかり更新が途絶えてしまいましたが今年もよろしくお願い致します。
今回の記事は普段からきっちりappledoc等で自分の書いたコードを整理している人にはほとんどお役にたちませんのでご了承いただくか読み飛ばして下さい。

##なにをやるのか

去年やろうとしてやれなかったことを今年は地道に片付けていきたいと思います。
まずは、APIリファレンスをなんとかしたいと思います。で何をやるかというと以下の通りです。

- Xcode上でもクイックヘルプできるようにする
- APIリファレンスのドキュメントをちゃんと更新する
- 普段からリファレンスを書くのを意識する

##前提

以下のすばらしい記事を見て、先に`appledoc`をインストールしておいてください。

[appledocでドキュメント生成](http://qiita.com/mtgto/items/c97c59d93fe67d748055)


##Xcode上でもクイックヘルプできるようにする（Xcode5標準機能）

Xcode5より前のバージョンではappledocの`--install-docset`を指定する必要などがありましたが、Xcode5からはappledocの書式にしたがって記述すれば何もしなくてもクイックヘルプとして表示されるようになります。

[Documentation in Xcode 5](http://confusatory.org/post/63488534619/documentation-in-xcode-5)

こんな感じです。(option+クリックで)

![](http://cl.ly/TNWf/2014-01-16%208.01.23.png)
![](http://cl.ly/TNuu/2014-01-16%208.01.08.png)


##APIリファレンスのドキュメントをちゃんと更新する

appledocでプロジェクトをまるっとリファレンス化しようと思ったのですが、何故かコケてしまいました。
（おそらくどこかのファイルに記述しかコードがappledocのパターンにそぐわなかったのかと…）

よくよく考えると全部のクラスファイルをドキュメントする必要も無いかなと思い、公開用のクラスファイルだけをリファレンスのドキュメントを作成するためのディレクトリにコピーするという運用にしました。

###アーカイブした後にドキュメントも生成する
この記事が参考になりました。
[appledocのドキュメント作成を自動で行うようにする](http://safx-dev.blogspot.jp/2012/06/appledoc.html)

![](http://cl.ly/TNnZ/2014-01-16%2010.42.03.png)

運用上、リファレンスドキュメントが必要になるクラスを`$REFERENCE_DIR`に自動的にコピーするようなshellを必要に応じて付け足しています。

<script src="https://gist.github.com/somtd/8448286.js"></script>

```
YOUR_PROJECT="プロジェクト名"
YOUR_COMPANY="会社名"
REFERENCE_DIR="ドキュメント生成の元になるディレクトリ"
DOCUMENTATION_DIR="ドキュメント生成先のディレクトリ"
 

#GENERATE_REFERENCE_HTML
if [ -e /usr/local/bin/appledoc ] ; then
/usr/local/bin/appledoc --project-name “$YOUR_PROJECT” --project-company “$YOUR_COMPANY” --create-html --no-create-docset --no-repeat-first-par --output $DOCUMENTATION_DIR $REFERENCE_DIR
fi
```

これでアーカイブした後に指定したドキュメントのアウトプット先にHTMLで書き出すようになります。


##普段からリファレンス書くのを意識する

これが一番大変なんだと思いますが、捗るXcodeのプラグインを教えていただいたのでこれを使ってみなさんもどんどんリファレンスを書きましょう。

[onevcat / VVDocumenter-Xcode](https://github.com/onevcat/VVDocumenter-Xcode)

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

```
git clone git@github.com:onevcat/VVDocumenter-Xcode.git
```
でクローンしてきたプロジェクトの`VVDocumenter-Xcode.xcodeproj`を立ち上げて、`VVDocumenter-Xcode`にビルドターゲットを設定し、ビルドするだけです。
Xcodeを再起動すると、以下のGifのように`///`と打つだけでappledocの書式にあわせて、ある程度のところまでリファレンスの記述を補完してくれます。

![https://raw.github.com/onevcat/VVDocumenter-Xcode/master/ScreenShot.gif](https://raw.github.com/onevcat/VVDocumenter-Xcode/master/ScreenShot.gif)
[https://raw.github.com/onevcat/VVDocumenter-Xcode/master/ScreenShot.gif](https://raw.github.com/onevcat/VVDocumenter-Xcode/master/ScreenShot.gif)

これは捗りますね。諸岡さんありがとう！

##まとめ
リファレンスを整備してappledocの書式になるだけで何故かコードを（見栄え的に）キレイに書こうという気になりますね。ヘッダーファイルにごちゃごちゃ書くのは好かん！という人にはオススメできませんが。今のところいい感じにできております。
第17章：Scalaの演算子

今回は __演算子__ だ。
プログラミングの中では基本的なとこみたいだよ。
サラッと見てみよう！

# 演算子の種類
Scalaにはこれだけ演算子があるぞ！

- 算術演算子
- 関係演算子
- 論理演算子
- ビット演算子

これを1個ずつ見てみよう。

## 算術演算子

いわゆる四則演算ってやつだから大丈夫だよね？

| 演算子 | 例 | 意味 |
|:-----------:|:------------|:------------|
| + | x + y | 加算 |
| - | x - y | 減算 |
| * | x * y | 乗算 |
| / | x / y | 除算 |
| % | x % y | 剰余 |

動かしてみるよ！

```scala
scala> 1 + 2
res0: Int = 3

scala> 3 - 1
res1: Int = 2

scala> 4 * 2
res2: Int = 8

scala> 6 / 3
res3: Int = 2

scala> 7 % 2
res4: Int = 1
```

## 関係演算子

関係性を調べる演算子だ！
ここも他の言語を知っていれば、すんなりいけるね。

| 演算子 | 例 | 意味 |
|:-----------:|:------------|:------------|
| > | a > b | aがbより大きいか |
| >= | a >= b | aがb以上か |
| < | a < b | aがbより小さいか |
| <= | a <= b | aがb以下か |
| == | a == b | aとbが等しいか |
| != | a != b | aとbが等しくないか |

これも動かしてみるよ！

```scala
scala> 2 > 1
res0: Boolean = true

scala> 2 >= 2
res1: Boolean = true

scala> 3 < 1
res2: Boolean = false

scala> 3 <= 2
res3: Boolean = false

scala> 1 == 1
res4: Boolean = true

scala> 1 != 1
res5: Boolean = false
```

### == について
`==`はJavaとはちょっと違うんだ。
以下で書いているので見てね！

[第16章：Scalaの等価性](http://qiita.com/f81@github/items/a90c16419645be5d7008)

## 論理演算子

| 演算子 | 例 | 意味 |
|:-----------:|:------------|:------------|
| && | a && b | 論理AND |
| ｜｜| a  ｜｜ b | 論理OR |
| ! | !a | 論理否定 |

※論理ORの __パイプ(|)__ は、本当は半角です。

```scala
scala> ( 2 == 2 ) && ( 1 == 1 )
res0: Boolean = true

scala> ( 2 == 2 ) && ( 1 > 1 )
res1: Boolean = false

scala> ( 2 == 2 ) || ( 1 > 1 )
res2: Boolean = true

scala> ( 2 < 2 ) || ( 1 > 1 )
res3: Boolean = false

scala> !( 2 == 2 )
res4: Boolean = false

scala> !( 2 > 2 )
res5: Boolean = true
```

## ビット演算子

| 演算子 | 例 | 意味 |
|:-----------:|:------------|:------------|
| & | a & b | AND演算 |
| ｜ | a ｜ b | OR演算 |
| ^ | a ^ b | XOR演算 |
| ~ | a ^ b | 補数演算 |
| << | a << b | 左シフト |
| >> | a >> b | 右シフト |
| >>> | a >>> b | 符号なし右シフト |

※論理ORの __パイプ(|)__ は、本当は半角です。

```scala
scala> 5 & 6
res1: Int = 4

scala> 5 | 6
res2: Int = 7

scala> 5 ^ 6
res3: Int = 3

scala> ~3
res4: Int = -4

scala> 5 << 1
res5: Int = 10

scala> 5 >> 2
res6: Int = 1

scala> -1 >>> 31
res7: Int = 1
```


# 優先順位と結合性
他の言語と同様に、Scalaでも演算子の優先順位があるんだ。
月並みだけど、纏めておくね。 __優先度が高い順__ だよ。

| 優先順位 |
|:-----------|
| その他全ての特殊文字 | 
| * / %|
| + - |
| : |
| = !|
| < > |
| & |
| ^ |
| ｜ |
| 全ての英字 |
| 全ての代入演算子 |

ただし、末尾が等号になっている代入演算子は扱いが異なる。
`+=`とか`*=`とかだ！

優先度が高い`*`で見てみよう。
以下の2つの式は同じ意味になる。

`a *= 4 + 1`、`a*= (4 + 1)`

実際に動かしてみるとわかるよ。

```scala
scala> var a = 3
a: Int = 3

scala> a *= 4 + 1

scala> a
res2: Int = 15
```

```scala
scala> var a = 3
a: Int = 3

scala> a *= (4 + 1)

scala> a
res4: Int = 15
```


# 演算子の正体

演算子は __メソッド__ なんだ！
何を言っているかわからない？

例えば、`1 + 1`は実は`1 .+(1)`と同じなんだ。

Scalaの世界では全てがオブジェクトだから
演算子もメソッドというのは、すんなり入ってくるよね。

上記で記述したけど、メソッドの引数が1つの場合は
`.`と括弧を省略することができるんだ。

ちなみに`1 + 1`のような書き方を、 __中値記法__ と呼ぶんだよ。

# まとめ
今回は、演算子だったけどどうだった？ 
本だと割と最初の方に出てくるから 
遅くなってゴメンな。

今回も 
__体で感じてくれたかな？__
ラジアンを度（0~360）に変換

ラジアンを0~360度に変換したい。

```as3:
public static function rad2deg(rad:Number):Number {
	var deg:Number = rad / Math.PI * 180;			
	deg = deg % 360;
	if (deg< 0) {
		deg= 360 + deg;
	}
	return deg;
}
```
auto negotiateをやめてLink速度を指定する

[Red Hatのインターフェース設定ファイル » gmt-24.net](http://gmt-24.net/archives/238)さんに感謝。
Debianで転送速度が300kb/sしか出なくて半年原因不明だった。
ethtoolで確認すると`100M Half`になっていたので、以下設定で`100M Full`にしたところ1.8Mb/s出るようになって改善した。

Debianの場合
--------

```diff:/etc/network/interfaces
 auto eth0
 iface eth0 inet static
+  pre-up /usr/sbin/ethtool -s eth0 autoneg off speed 100 duplex full
   address 192.168.12.2
   netmask 255.255.255.0
   gateway 192.168.12.1
```

CentOSの場合
--------

```diff:/etc/sysconfig/network-scripts/ifcfg-eth0
 DEVICE=eth0
 BOOTPROTO=static
 IPADDR=192.168.12.2
 NETMASK=255.255.255.0
 ONBOOT=yes
+ETHTOOL_OPTS="autoneg off speed 1000 duplex full"
```


--------

その後、ネットワーク機器側にて100Full固定になっていたのをautoに変更
サーバー側でもautoに変更することで8.9MB/s出るようになった。

```bash:
/usr/sbin/ethtool -s eth0 autoneg on
```
【Twitter】Twitter 仕様変更(2014-01-15)で、OAuth認証（scribe-java）が動かなくなってしまった。【Scala(Java)】


scribe-java（OAuthライブラリ）
https://github.com/fernandezpablo85/scribe-java


仕様変更について
https://dev.twitter.com/discussions/24239

概要は、「APIは全部httpsで叩けよ」ってことのようです。

いろいろと悩みましたが、ライブラリのソースコードを読んでいたら解決しました。

```scala
    val service = new ServiceBuilder()
//      .provider(classOf[TwitterApi])
      .provider(classOf[TwitterApi.SSL]) //HTTPS用のクラスが用意されてました。
      .apiKey(consumerkey)
      .apiSecret(consumerSecret)
      .build()

```

PINコード入力画面が出てしまいますが、コールバックでさせたいならこちら

```scala
    val service = new ServiceBuilder()
      .provider(classOf[TwitterApi.SSL])
      .apiKey(consumerkey)
      .apiSecret(consumerSecret)
      .callback("") //空文字指定
      .build()
```

以上
RailsのActiverecordでGroup By句を使う


where句 や order by句 を使いながらgroup by するサンプル

```rails
@order = Order.select('max(seq) as seq, max(price) as price')
@order = @order.where('price >= ?', 5000)
@order = @order.group('group1, group2')
@order = @order.order('max(price) desc')
```
インストールしているソフトウェア

 - クリップボード管理
   * ClipMenu
 - 仮想環境
  * VirtualBox
  * Vagrant
 - Android
  * ADT
  * Android File Transfer
 - IME
  * Google日本語入力
 - 便利
  * BetterTouchTool
  * CheatSheet
  * HyperSwitch
  * Quicksilver
 - ウィルス検知
  * ClamXav
 - SCP,SFTP
  * Cyberduck
 - ブラウザ
  * Google Chrome
  * Firefox
 - ターミナル
  * iTerm
  * oh-my-zsh

 - フォルダ管理
  * Path Finder
 - 簡単
  * Server
 - 画像
  * Skitch
 - Gitクライアント
  * SourceTree
 - エディタ
  * Sublime Text 2
  * TextWrangler
  * Xcode
 - メーラー
  * Thunderbird
 - 圧縮、解凍
  * The Unarchiver
 - 構成管理
  * chef-solo
  * chef Berkshelf

 - Homebrew
   * ruby-build
   * rbenv

 - その他
   * nodejs
お手軽にGhostを試してみる


***

> 2014/2/14追記
> Ghostホスティングサービスに転向したようで
> 下記のような使い方はできなくなってしまったようです

http://runkite.com/
まずはこちらのサイトで会員登録。

django, RoR, Node.js, Ghost Blogの環境を簡単構築してくれる。
無料で1アプリのみ使用する事ができる。
テスト用途なら消して、他のアプリを作る事も可能。

Node.jsから構築もできるだろうけど
簡単そうな「Ghost Blog」でやってみる。

ローカル環境は `Mac OS X 10.9`

#### Dashboard

![Dashboard](https://qiita-image-store.s3.amazonaws.com/0/31990/8a6fe962-537b-cd6b-e7b1-cff33c6e7e19.png "kite_dashboard.png")

New Appで新しいアプリを作る。

***

#### Create New App

![CreateApp](https://qiita-image-store.s3.amazonaws.com/0/31990/1615c077-4100-a179-7c23-5a61f2caba27.png "kite_createapp.png")

Ghostを選ぶ。
Your app’s nameはURLの一部になる。
一度使用したものを削除して、再作成しても大丈夫。

***

#### Start Ghost

これでとりあえずブログができた。
Viewボタンを押せばブログに。
Editボタンを押すと設定画面に。
初回は管理者アカウントを作る必要があるのでEdit

名前とメアドとパスワードを入れて完了。
メール設定でアラートが出ると思うけど、とりあえずは気にしなくてok

***

#### Upgrade

コレを書いている現在
公式は0.4.0バージョンになっていて
Kiteで作ったGhostは古い。
アップデートする為にSSH接続する

![Download Client](https://qiita-image-store.s3.amazonaws.com/0/31990/daee4760-d1e5-62ef-a57d-3734c2d02d13.png "kite_client.png")

クライアントをインストールする。
MacとWindows用があるが、Macしか試していない。


![Terminal](https://qiita-image-store.s3.amazonaws.com/0/31990/c13a03bb-c66d-c935-13f1-2c4e4e91dad0.png "kite_terminal.png")
Terminalのボタンを押すとターミナルが起動してSSH接続してくれる。
作成したアプリがGhostだと接続先がわからなかったので
クライアントを導入するしか無いのかな。
一度接続すればわかるから良いんだけども。

```kite-shell
cd
wget http://ghost.org/zip/ghost-latest.zip
rm -rf ~/workspace/core
unzip -uo ghost-latest.zip -d ~/workspace
cd workspace
NODE_ENV=production forever restart index.js
```

http://docs.ghost.org/installation/upgrading/
更新の手順は公式を参考にしました。
indentをCSSできっちり合わせる

字下げのindentの
・こんなかんじの
　なかぐろを使ったインデント
や
※1 こんなかんじの
　 半角を含むインデント
や
（※）こんなかんじの
　　　かっこを含むインデント
の場合、（たぶんフォントの関係で）Win/Macでインデントずれてしまうことがあります。

#解決方法（IE7△CSSハック）

左にはみ出る部分をspanに突っ込んでごにょごにょする。
はみ出る部分の中身によって微調整が必要です。
なお、IE7が対象でなければ、ハック部分は全て消してよいのでだいぶ短くなります。

```html
<p class="indent"><span>（※）</span>インデントを指定したい<br>
あたり</p>
```

```css
p.indent {
	padding-left: 3em;
	/padding-left: 2em;
	text-indent: -3em;
}

p.indent span {
	display: inline-block;
	/display: inline;
	width: 3em;
	text-indent: 0;
	/text-indent: -2em;
}
```

デモ：http://jsrun.it/Ituki/4llI
他のindentのコードサンプル：http://jsdo.it/Ituki/4llI
networkxでグラフを描く

=
pythonのnetworkxを使ってグラフを作ってみたのでメモ


```py:make_graph.py

# -*- encoding:utf-8 -*-

import networkx
import pylab
from matplotlib import font_manager
from itertools import combinations
from random import randint

# ノードをkey、エッジをはるノードのlistをvalueとするdict
vector = {}
persons = [u"田中", u"鈴木", u"山田", u"木村", u"吉岡"]
edge_labels = {}

for person in persons:
    # defaultdict(list)ではなく、ノードを作成するためにこうする
    vector[person] = []

for man_pair in combinations(persons, 2):
    man1, man2 = man_pair
    # 適当にエッジに値を付ける
    r = randint(1, 10)
    if r % 2:
        continue
    else:
        vector[man1].append(man2)
        edge_labels[(man1, man2)] = r

graph = networkx.Graph(vector)  # 無向グラフ
# graph = network.DiGraph(vector)  # 有向グラフ (to_undirectedで無向グラフに変換可）
pylab.figure(figsize=(3, 4))  # 横3inch 縦4inchのサイズにする
pos = networkx.spring_layout(graph)  # いい感じにplotする
# pos = networkx.random_layout(graph)  とでもすれば高速にplot出来る



# フォントを変更する（font_pathは適宜変更する）
font_path = "/usr/share/fonts/japanese/TrueType/sazanami-gothic.ttf"
font_prop = font_manager.FontProperties(fname=font_path)
networkx.set_fontproperties(font_prop)

# 見た目をいじる
networkx.draw_networkx_nodes(graph, pos, node_size=100, node_color="w")
networkx.draw_networkx_edges(graph, pos, width=1)
networkx.draw_networkx_edge_labels(graph, pos, edge_labels=edge_labels)
networkx.draw_networkx_labels(graph, pos, font_size=16, font_color="r")

pylab.xticks([])
pylab.yticks([])

pylab.show()
pylab.savefig("graph_networkx.png")

```

ここで、networkxのバージョンが1.5以上でなければ日本語は表示できません。
おそらく、
>ValueError: matplotlib display text must have all code points < 128 or use Unicode strings

というエラーが出るかと思います。
日本語を表示させるためには[ここ](https://gist.github.com/yamakk/1247256)のパッチをnetworkx/drawing/nx_pylab.pyに適用してください

##結果
こんな感じに

![graph_networkx.png](https://qiita-image-store.s3.amazonaws.com/0/280/78fbc942-064b-9230-5cbb-bd8255178033.png "graph_networkx.png")


*** 参考
http://d.hatena.ne.jp/nishiohirokazu/20111121/1321849806
http://antibayesian.hateblo.jp/entry/20110828/1314491180
SSH経由でmysqlにアクセスしてクエリ実行結果をTSVに出力するShellサンプル

__【注意】初めてまともに作成したshellスクリプトです。__
SSH経由でmysqlにアクセスしてクエリ実行結果をTSVに出力します(たぶん)

下記について __調べながら__ 実装しています
> 変数・コマンドライン引数
> if文
> 外部ファイルの読み込み
> コマンドの実行
> 配列＆配列を動的に参照

参考にさせていただいたサイト

* [Using Configuration Files With Shell Scripts](http://lcorg.blogspot.jp/2010/06/using-configuration-files-with-shell.html)
* [ステップ・バイ・ステップ・シェルスクリプト(5)：シェルの変数に慣れる](http://www.atmarkit.co.jp/ait/articles/0010/19/news003.html)
* [Bashで覚えておくとよいデータ構造 - 配列](http://d.hatena.ne.jp/nattou_curry_2/20091104/1257346587)
* [evalで変数名を変数にする＠bash](http://www.mazn.net/blog/2009/01/20/177.html)

```shell:fetch_query.sh
#!/bin/sh
PATH_TO_OUTPUT_DIR="/xxxx/yyyy/zzzzz/"

## (SSH経由でmysqlにアクセスしてクエリ実行結果をTSVに出力するサンプル)

if [ $# -ne 3 ]; then
 echo "[ERROR]Set parameter [param1], [param2], [output tsv file prefix]"
 exit 1
fi

param1=$1
param2=$2
tsv_prefix=$3
tsv_ymd=`date "+%Y%m%d"`

## Load setting files
## (各種設定ファイルを読み込む)
CONFIG="dblist.conf"
FETCH_QUERY="fetch_query.sql"

if [[ ! -f ${CONFIG} ]]; then
  echo "[ERROR] Not found file ${CONFIG}"
  exit 1
fi
if [[ ! -f ${FETCH_QUERY} ]]; then
  echo "[ERROR] Not found file ${FETCH_QUERY}"
  exit 1
fi

. ./${CONFIG}
. ./${FETCH_QUERY}

echo "[INFO] === START === (`date`)"

result_data_tsv="${tsv_prefix}_${param1}_${param2}_${tsv_ymd}.tsv"
query=${FETCH_TARGET_SQL}

## Import from remote.
## (配列の参照)
param2_db_con_str=$(eval echo '${LIST_'${param1}'_CON_LIST['${param2}']}')

echo "[INFO] Import data to ${result_data_tsv} from connection (${param2_db_con_str})"
echo "${query}" | ssh ${SSH_STR} mysql -N -B ${param2_db_con_str} > ${PATH_TO_OUTPUT_DIR}${result_data_tsv}
echo "[INFO] === END === (`date`)"

exit 0
```

```dblist.conf
## (ssh接続※config管理してる場合※)
SSH_STR="ssh-tool"

## (接続文字列リスト)
LIST_1_CON_LIST=()
LIST_1_CON_LIST[0]="'-uuser' '-ppass' '-hlocalhost' '-P3306' 'sample_db'"
LIST_1_CON_LIST[1]=""
LIST_1_CON_LIST[2]=""
LIST_1_CON_LIST[3]=""

LIST_2_CON_LIST=()
LIST_2_CON_LIST[0]=""
LIST_2_CON_LIST[1]=""
LIST_2_CON_LIST[2]=""
LIST_2_CON_LIST[3]=""
```


```fetch_query.sql
# 文字列を動的に埋め込むなら
FETCH_TARGET_SQL="select ${param1}, ${param2}, user_id from hogehoge"
```

*上記『文字列を動的に埋め込むなら』がなぜか赤枠で囲まれているのは原因不明です*
SafariでURLや検索語を入力中に勝手に確定されてしまう問題の対応方法(Mac OS X)

(2014.4.8 編集)
どうやら Safari のバグだった模様。
![safari6.0.3update.png](https://qiita-image-store.s3.amazonaws.com/0/24450/9799b6bb-e7ca-0bc2-33f5-94684d10f36f.png)
Safari 6.1.3 もしくは Safari 7.0.3 にアップデートすることで直ります。

http://support.apple.com/kb/HT1222?viewlocale=ja_JP
新しくリモートブランチをローカルに持ってこようとしたらエラーになる場合の対処


下記コマンドでリモートブランチをローカルに・・・と思ったら、エラーが。

```
$ git checkout -b [newbranch] [origin/newbranch]
```

```
fatal: Cannot update paths and switch to branch ‘[newbranch]’ at the same time.
Did you intend to checkout '[newbranch]' which can not be resolved as commit?
```

一旦、リモートブランチのリストを確認。

```
$ git branch -r
```

あ、つくろうとしていたブランチがない。

リストを更新するコマンドを調べて実行。

```
$ git fetch --prune
```

もう一度最初のコマンドを実行するとできた。

- - -
> Blog URL : http://www.utano.jp/ (Syntax Error.)
画像の代わりにフォントを使用

iOSは組み込みのベクトル形式がないので、アイコン画像等を複数用意するのは割と面倒です。
さらに、サイズや色の微調整の度に画像を作り直すのは不毛な作業としか思えません。

そんなときに便利なのがフォント。OS標準サポートで、サイズも色も自由に変えられます。
NSAttributedStringとして生成することで、UILabelやUIButtonにそのまま設定できます。UIButtonの場合にはsetAttributedTitle:forStateを使うことで、ステートごとにアイコン色を変えることもできます。

さらに文字列ではなく画像として使いたい場合のために、UIImageのカテゴリとしてNSAttributedStringから画像を作るメソッドを作っておくと良い感じです。

安くて、組み込みやすいアイコンフォント

- http://symbolset.com/icons

自社ロゴ等のその他データは、適当にフォントにまとめちゃいましょう。

- http://icomoon.io
Vagrant1.4.3とLaravel4.1で開発環境構築


Laravel4.1系とLAMP環境を使えるようにする。


##VirtualBoxとVagrantのインストール
[VirtualBox](https://www.virtualbox.org/)と[Vagrant](http://www.vagrantup.com/)をインストールしておく。

##Laravelのインストール

[bryannielsen/Laravel4-Vagrant](https://github.com/bryannielsen/Laravel4-Vagrant)を参考にする。

リポジトリをcloneする。

```
$ git clone https://github.com/bryannielsen/Laravel4-Vagrant.git
```

cloneしたディレクトリに移動する。

```
$ cd Laravel4-Vagrant
```

タイムゾーンを変えておく。

```
$ vim VagrantFile
↓
 lv4_config.vm.provision :shell, :inline => "echo \"Asia/Tokyo\" | sudo tee /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata"

```

VagrantFileの修正が終わったら、Vagrantを立ち上げる。

```
$ vagrant up
```

立ち上がったら[http:://localhost:8888](http:://localhost:8888)へアクセスして確認する。

![スクリーンショット 2014-01-16 5.15.19.png](https://qiita-image-store.s3.amazonaws.com/0/18573/9fc4a1b1-aa80-efb0-58ba-1e5f746bc606.png "スクリーンショット 2014-01-16 5.15.19.png")

最後にapp/stroageのパーミッションを変えて終了。

```
chmod -R 777 www/app/storage/
```

ホスト側(Mac,Windows)のLaravel4-Vagrant/www/以下を編集するとVM上のソースも連動して変更される。

##参考
[bryannielsen/Laravel4-Vagrant](https://github.com/bryannielsen/Laravel4-Vagrant)
javascriptのsplitで1文字ずつ分割してアニメーションさせる


“abcde”.split(‘’);の結果
![スクリーンショット 2014-01-15 21.17.24.png](https://qiita-image-store.s3.amazonaws.com/0/5472/bd71865f-ac7d-ef33-a052-cfdad213bc9f.png "スクリーンショット 2014-01-15 21.17.24.png")

こんな感じの何かが出来るのではないかと。
![2624d02542e1abea7634ede7034ea468.gif](https://qiita-image-store.s3.amazonaws.com/0/5472/74320310-4be8-a68b-1484-d3fbbc63cc3c.gif "2624d02542e1abea7634ede7034ea468.gif")

文字がランダムで降ってくるとか出来そうですね。
※ つくれぽお待ちしております←


```javascript:split.js


(function(){

    var text = 'Now Loading...';
        arrReceive = [];

    arrReceive = text.split('');

    console.dir(arrReceive);

    var arrLength = arrReceive.length;

    for(var i=0; i<arrLength; i++) {
        arrReceive[i] = '<span class="str-animate">'+ arrReceive[i] +'</span>';
    }


    var htmlText = arrReceive.join("");

    // アニメーション処理
    $('body').append(htmlText);


    var loop = function() {
        $('.str-animate').each(function(_idx) {
            var that = $(this);

            setTimeout(function() {
                that
                    .css({
                        position: "relative"
                    })
                    .animate({
                        top: -30
                    }, 300, function() {
                        that.animate({
                            top: 0
                        }, 300);
                    });
            }, 60*_idx);
        });
    };


    setInterval(loop, 2000);

})();


``` 



// ----------------- 参考URL
・ Myth Busting: CSS Animations vs. JavaScript
http://css-tricks.com/myth-busting-css-animations-vs-javascript/
・ CodePen Source
http://codepen.io/GreenSock/pen/AwCKp
Windows Azure モバイルサービスでHelper関数（共通処理）を作る方法


## 概要
- モバイルサービスのサーバスクリプトで使えるHelper関数（共通処理）を作成する。
- 現時点（2013/01/16）では、モバイルサービスの管理画面からは作成できないので、`azure-cli`を使ってアップロードする。（英語版ではsource controlという機能を使ってもアップロードできるようなので、日本語版でも近々対応されるかもしれません）

## 方法
### Helper関数の作成
- ローカル開発環境にsharedフォルダを作成し、その中にJavaScriptファイルを作成する。
- スクリプトの書き方としては、Node.jsのexportsと同じ。
- Helper関数からはサーバスクリプトの各種関数やオブジェクトを呼び出せないので、関数の引数として渡す。（下記のサンプルではtableオブジェクトを引数として渡している）

```JavaScript
// サンプルコード：user_idからuser_nameを取得する

exports.username = function(table, user_id, callback){
    
    table.where({
        user_id: user_id
    }).read({
        success: function(results){
            if(results.length === 1){
                callback(null, results[0].user_name); 
            }
            else{
                callback(“User not found.”);
            }
        },
        error: function(error){
            callback(error);
        } 
    });
};
```

- コードが完成したら、azure-cliのコマンドでモバイルサービスにアップロードする。コマンドの使用方法については[以前の記事](http://qiita.com/bisque33/items/ec8506acd56df094599d)に記載しました。

```Console
# azure mobile script upload <サービス名> shared/helper.js
```

### サーバスクリプトからの使用例
- サーバスクリプトから使用方法もNode.jsと同じ。
- APIやテーブル、スケジューラなどのサーバスクリプトから使用できる。

```JavaScript
// サンプルコード：APIのサーバスクリプトから使用する

var helper = require("../shared/helper);
var table = request.service.tables.getTable(“users”);

helper.username(table, <ユーザID>, function(error, result){
    if(error){
        response.send(500, { message : error });
        return;
    }
    response.send(200, { message : result });
});
```

## その他
Node.jsのexportsを使っているので、関数以外にも変数やオブジェクトを設定することも可能です。

## 参考
[公式ドキュメント（英語）- How to: Use helper functions](http://www.windowsazure.com/en-us/documentation/articles/mobile-services-how-to-use-server-scripts/#helper-functions)
Unity,C#の個人的命名規約キーワードメモ



```csharp
//こんな感じ
using UnityEngine;
using System.Collections;

//クラス 
public class Example : MonoBehaviour
{    

//関数
    void Start()
    {
//変数
		int i = 3;
//キーワード
		HelloClass hello = new HelloClass();

    	print(i);
    	hello.Say();
    }
}

public class HelloClass : MonoBehaviour
{
	public void Say()
	{
		print("Hello!");	
	}
}
```

#命名規則

##クラス
###アッパーキャメル記法（CamelCase）
MonoBehaviour
WebCamTexture
Debug

##関数
###アッパーキャメル記法（CamelCase）
AddComponent();
OnMouseUp();
Start();

##変数
###ローワーキャメル記法（camelCase）
myNumber
deltaTime
int

##キーワード
###全て小文字
audio
abstract
var


#C#のキーワード一覧
参照
キーワード（予約語）一覧 C# によるプログラミング入門
http://ufcpp.net/study/csharp/ap_reserved.html
C# のキーワード
http://msdn.microsoft.com/ja-jp/library/x53a06bb(v=vs.90).aspx

##キーワード
abstract
event
new
struct
as
explicit
null
switch
base
extern
object
this
bool
false
operator
throw
break
finally
out
true
byte
fixed
override
try
case
float
params
typeof
catch
for
private
uint
char
foreach
protected
ulong
checked
goto
public
unchecked
class
if
readonly
unsafe
const
implicit
ref
ushort
continue
in
return
using
decimal
int
sbyte
virtual
default
interface
sealed
volatile
delegate
internal
short
void
do
is
sizeof
while
double
lock
stackalloc
else
long
static
enum
namespace
string

##コンテキストキーワード
from
get
group
into
join
let
orderby
partial (型)
partial (メソッド)
select
set
value
var
where (ジェネリック型制約)
where (クエリ句)
yield
AutoLayoutのTips：UIScrollView編


-

####大事なこと
scrollView.contentSizeは中に配置された制約で決定される。
Storyboard上のviewサイズはあくまで見た目のみ（実際のサイズは制約その他から決定される。）

##初めに

Storyboard上にViewControllerを設置したら`Simulated Metrics` > `Size`から`Freeform`を選択する。そして配置するコンテンツが収まるサイズにビューサイズを変更する

![Tips01.png](https://qiita-image-store.s3.amazonaws.com/0/8508/1a4ca349-05b9-9a5e-18ee-c133e4d42f33.png)

次にscrollViewを設置する。このときScrollViewの制約にWidth, Heightを使ってしまうとそのサイズで固定されてしまうので、それ以外の制約を利用する。

##ビューの設置
今回はデモ用にこのような配置にした。
このとき各色のviewの制約は以下の制約を設定した。
　 　|
— (view) -
　　 |
また黄色以外のviewにはWidth, Heightの制約も指定した。
※黄色のviewに関しては従属的に幅、高さが決定されるため制約の必要がない。
これらの制約で端から端までのサイズが一意に決まり、それがscrollView.contentSizeのサイズになる。


![Tips02.png](https://qiita-image-store.s3.amazonaws.com/0/8508/26435fad-c0d9-74f5-f5ab-082a19a8b56c.png)


##終わりに

以上の設定のもと実行するとcontentSizeはStoryboard上の見た目と同じになりつつ、scrollViewのサイズはデバイスサイズになる。

このようにAutoLayoutを用いるとコードを一行も書かずにこれらのことを実現できる。また、Storyboard上でscrollView内に配置したUI全体を確認しつつ開発を行うことが可能になる。


##おまけ
scrollView.contentSizeは常に制約に従うため、制約が変わるとそれに合わせてcontentSizeも変化する。そのため動的にviewのサイズを変更しても、それ以外の煩雑な計算が要らなくなる。

![ss](https://raw.github.com/sora0077/AutoLayoutTips1/master/images/ss_animation.gif)

今回例示したデモアプリはここからダウンロード出来ます。
https://github.com/sora0077/AutoLayoutTips1
Mac OS Xでsshでサーバーへ接続

# 書いてる人
プログラミング学習サービスやら、ペットサロン予約サービス、風俗検索サービスなど色々とやっている「かずきち」です。
■運営サービス一部
http://crazy-wp.com/
http://webukatu.com/
新宿のホストから不動産・保険の営業を経て、HTMLって何？という状態から３ヶ月独学でプログラミングやデザインを学び、IT業界で１年間実務経験を積んで年収は１本超え。現在は起業家としてサービス運営やら不動産運営をしています。
Qiita内にそれ系の記事も書いてます。
<a href="http://qiita.com/kazukichi/items/7379b75fba2f90d3cf45" target="_blank">エンジニアで稼ぐために大切な１３のコト</a>
<a href="http://qiita.com/kazukichi/items/aeba286c2a750081e5c0" target="_blank">WEBサービスで起業したい人に読んで欲しい１８のコト</a>

Mac OS X の場合、標準で ssh クライアントソフトがついている。

1.「Terminal」 を開く
UNIX 系のシステムではおなじみの、tcsh シェルが起動する。
　
2.次のように入力することで ssh 接続をすることが出来る。

```
ssh -l login_user hostname
```

ここで、-l オプションに続く` login_user `の部分は、ssh で接続する際に使用するログインアカウント名。
また、そのあとの` hostname `の部分には、接続先のコンピュータ名を IP アドレスやドメイン名で指定する。
特に指定しなければ通常は 22/tcp ポートを使用するが、変更する必要がある場合は、-p オプションを追加。
その場合、`ssh -l login_user -p 1000 hostname `というような感じになる。
この例の場合は 1000 番ポートの ssh サーバに接続するということ。
　
はじめて接続するホストの場合、

```
Are you sure you want to continue connecting (yes/no) ?
```

というようにたずねられるので、yes と入力して [return] キーを押す。

```
login_user@hostname 's password:
```

とたずねられる。
ここで、`login_user `に設定されているパスワードを入力して [return] キーを押せば接続完了！！

#sshでサーバーへファイルをアップロード
※デスクトップにあるファイルをサーバーへアップロードする場合
sshでサーバーに接続していたら、一旦exitで切断。
自分のPCに戻ったら、デスクトップへ移動。移動したいファイルをデスクトップに置いた状態で

```
scp [コピーするファイル名] [接続先のユーザ名@接続先のホスト名:ディレクトリ(またはファイル)]
```

```:例
scp sample.txt [接続先のユーザ名@接続先のホスト名:ディレクトリ(またはファイル)]
```

#WEBプログラミングから起業までを一貫して学べるオンライン動画総合学習サービス『ウェブカツ！！』
様々なプログラミング学習サイトやサービスでは正直な所、自分でWEBサービスを作れるようにはならないため、「自分でWEBサービスを作れるようになる！」をゴールとしたオンライン動画総合学習サービス『ウェブカツ！！』を立ち上げました。興味ある方は登録よろしくお願いいたします。
http://webukatu.com/
CakePHPでscriptStart/Endで囲まれたところでjs補完をする不完全な方法

CakePHPのコードブロックを使うと、ビューの中にjsコードを書いて、layoutの管轄上にある末尾（body閉じタグの直前など）に吐き出すことができるので、画面に依存する処理などでよく使う。

しかし不便なこともある。

	<?php $this->Html->scriptStart(array('inline' => false));?>
	…JavaScriptのコード…
	<?php $this->Html->scriptEnd();?>

といった感じで書くのだが、Netbeansなどのエディタではこの中身がJavaScriptだと認識することができない。そのため補完が行われないので、生産効率が悪い。

scriptタグで囲めればよいのだが、CakePHPのヘルパーがscriptタグを生成するので、二重になってしまう。（当然動かない）

そこで若干卑怯ではあるが、独自のヘルパーを作って、scriptタグを除去する仕組みを作ってみる。

	class ScriptwrapHelper extends AppHelper {
		var $helpers = array('Html');
		protected $_scriptBlockOptions = array();

	    public function scriptStart($options = array()) {
			$options += array('safe' => true, 'inline' => true);
			$this->_scriptBlockOptions = $options;
			ob_start();
			return null;
	    }
    	public function scriptEnd() {
			$buffer = preg_replace('/<script>(.*?)<\/script>/s', '\1', ob_get_clean());
			$options = $this->_scriptBlockOptions;
			$this->_scriptBlockOptions = array();
			return $this->Html->scriptBlock($buffer, $options);
	    }
	}

基本的には、元々のHtmlヘルパーの中にあるものをそのまま頂いてきて、自分が書いたscriptタグを除去するようにする。
ヘルパーではscriptBlockメソッドを使って処理をしているが、これはHelper内でHtmlヘルパーを使えるようにすることで、$this->Html->scriptBlockでアクセスできるので、移してはこなかった。これで、

	<?php $this->Html->scriptStart(array('inline' => false));?>
	<script>
	…JavaScriptのコード…
	</script>
	<?php $this->Html->scriptEnd();?>

こういう書き方をすることで、自分が書いたscriptタグは除去され、ソースコードでは（少なくともNetbeansは）Javascriptと認識してくれるので、生産性は向上。

ちなみに、HtmlHelper自体を改変しなかったのは、第一に面倒臭い。
そして、これはどう考えても正しい対策ではないので、Netbeansなどで正しく認識できるようになったら、使うのを辞めたい。そうすると、ビュー上で正規版と改造版の違いが分からないと困るので、独立したヘルパーにしておいた方が区別がつきやすい。

ちなみに、Netbeans用にすばらしいCakePHPプラグインを作って下さっている @junichi_11 さんが取り組んでは下さっているそうです。

<blockquote class="twitter-tweet" lang="ja"><p><a href="https://twitter.com/macchaka">@macchaka</a> NBの場合はプラグインで該当箇所をjsのmimeを埋め込んでいるのですが、残念ながら上手くいきません。。。（補完の候補は微妙に表示されたかと思います） いつになるかはわかりませんが、中の人に聞いてみます。</p>&mdash; じゅん (@junichi_11) <a href="https://twitter.com/junichi_11/statuses/422729372014239744">2014, 1月 13</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

本当にこの方は神。
RubyMotionでNiftyCloudを使う


国産のmBaaSバンザイ。という事で[Parse](https://parse.com/)ではなくて[NiftyCloud MobileBackend](http://mb.cloud.nifty.com/)を使おうとおもった...けど、うまくいかなくて試行錯誤の結果使えるようになったのでその記録。

[クイックスタート(iOS)ニフティクラウド](http://mb.cloud.nifty.com/doc/quickstart_ios.htm)を参考にします。

##1.RubyMotionプロジェクトを作成する

> motion create NCMBTest

##2.SDKダウンロード及びインストール

###2-1.SDKをダウンロードしてインストールする

[iOS SDKダウンロード](http://mb.cloud.nifty.com/sdk/ios/NCMB_latest.zip)

2-1で得られた「NCMB.framework」をvendor/ディレクトリを作成してコピーします。

###2-2 JSONKitは自分でframework化する

また、JSONKitについてはcocoapodではうまく組み込めませんでしたので、以下のように自分でJSONKit.frameworkを作成して利用しました。

[独自Frameworkの作り方(&RubyMotionでのテスト)](http://qiita.com/bellx2/items/b6f0a6aa7a618aa6f1b2)

これで作成したJSONKit.Frameworkをvendor以下にコピーします。

##3.プログラム

###3-1.Rakefileを変更する
GemfileとRakefileを以下のように変更して依存するFrameworkを読み込むように設定します。FacebookのSDKはcocoapodsで読み込みます。

```rb:Gemfile
gem 'rake'
gem 'motion-cocoapods'
```

```rb:Rakefile

Motion::Project::App.setup do |app|
  # Use `rake config' to see complete project settings.
  app.name = 'NCMBTest'

  app.frameworks += [
    "SystemConfiguration","MobileCoreService","AudioToolbox"
  ]
  
  app.pods do
    pod 'Facebook-iOS-SDK'
  end

  app.vendor_project(
    'vendor/NCMB.framework',
    :static,
    :products => ['NCMB'],
    :headers_dir => 'Headers'
  )

  app.vendor_project(
    'vendor/JSONKit.framework',
    :static,
    :products => ['JSONKit'],
    :headers_dir => 'Headers'
  )

end
```

※FacebookのSDKも入れないとリンクエラーが出て動きませんでした。

###3-2.コードを記述する

クイックスタートのサンプルコードはRubyMotionで書くと以下のようになります。

```rb 

    NCMB.setApplicationKey([APP_KEY], clientKey:[CLIENT_KEY])

    query = NCMBQuery.queryWithClassName("TestClass")
    query.whereKey("message", equalTo:"test")
    query.findObjectsInBackgroundWithBlock(lambda do |objects, error|
        if error == nil
            if objects.size > 0
                p "[FIND] #{objects[0]['message']}"
            else
                obj = NCMBObject.objectWithClassName("TestClass")
                obj['message'] = "Hello RubyMotion!"
                saveError = Pointer.new(:object)
                obj.save(saveError)
                if saveError[0] == nil
                    p "[SAVE] done"
                else
                    p "[SAVE-ERROR] #{saveError[0].localizedDescription}"
                end
            end
        else
            p "[ERROR] #{error.localizedDescription}"
        end
    end)
```

※errorはNSErrorで返ってきているのだが、saveErrorは実際にテストができなかったので怪しいかも。このあたりのRubyMotinoに変換した場合のblockとかpointerの扱いはまだ勉強中です。

###2-5.実行する

>bundle install
>rake pod:install
>rake

で実行します。

##メモ

+ JSONKitでハマったので次のバージョンは非依存にしてほしいなぁ（希望）
+ やる気がでてきたら他のAPIもRubyMotionで書いてみる
+ もっとやる気ができたらアプリをNiftyCloudを使うように書きなおす:-)
@antimon2氏の整数問題

```rb
#!/usr/bin/ruby
require 'prime'

#[2013]
#Q1
def comb(n,k)
	r=1
	k.times{|i|
		r=r*(n-i)/(i+1)
	}
	r
end
x=Prime.each.lazy.each_cons(2).take(100).find{|a,b|comb(b,a)==1121099408}
#p x # => nil
x=Prime.each.lazy.each_cons(3).take(100).find{|a,b,c|comb(c,a)==1121099408}
p x # => [31, 37, 41]

#Q2
p (1..1/0.0).find{|n|
	a,b=n/11,n%11
	a>0&&b>0&&(a**3-b**3).abs==n
}
# => 37

#[2014]
#Q1
#左辺について、5を底とする対数を取り、(Floatの誤差を防ぐため)移項する
p (1..1/0.0).find{|n|5**(5**5)/n**(n*n)<Math.log(n,5)}
# => 38
#右辺について、800を底とする対数を取り、(Floatの誤差を防ぐため)移項する
p (1..1/0.0).lazy.take_while{|n|Math.log(n,800)<800**800/n**(n*n)}.to_a.last
# => 38

#Q2
def sq?(n)
	x=Math.sqrt(n)
	x.to_i==x
end
p (1..1/0.0).find{|m|[m,38-m,38+m].map{|e|e*e}.all?{|e|
	sq?(e/10)&&sq?(e%10)
}}
# => 19

#Q3
p (1..1/0.0).lazy.select{|d|(1..d).reduce(:*).to_s.index('1111')}.take(2).to_a
# => [38, 169]

#[2015]
p [*2..6].permutation.count{|_a|
	t=2
	a=[1]+_a
	c=0
	(a.size+t-1).times.all?{|i|
		c=a[i%a.size]>a[(i+1)%a.size] ? c+1 : 0
		c<t
	}
}
# => 39
#追加問題：上記はA080635(5)に該当する。よってn=39のときはA080635(38)
#すなわちPARI/GPで、n=38; if( n<1, n==0, A = O(x); for( k=1, n, A = intformal( 1 + A + A^2)); n! * polcoeff( A, n)) # 317029010310200031444965610148232355333309
```
独自Frameworkの作り方（＆RubyMotionでのテスト）


RubyMotionを使っていてcocoapodsではソフト的にうまく組み込めないものがあったので、iOSで独自のFrameworkを作成して組み込む事にしてみます。

[iOS-Universal-Framework](https://github.com/kstenerud/iOS-Universal-Framework)を使った方法です。

## iOS-Universal-Frameworkの組み込み

> git clone https://github.com/kstenerud/iOS-Universal-Framework.git

> cd iOS-Universal-Framework/
> cd cd Real\ Framework/
> ./install.sh

Xcodeの場所を聞かれてテンプレートのインストールディレクトリーを確認して[y]を押します。（基本的には/Users/[ユーザー名]/Library/Developer/Xcode/Templates/Framework & Library）に入るようです。

Xcodeを立ち上げるとFramework&Libraryに「Static iOS Framework」が追加されています。これを利用します。

![スクリーンショット_2014_01_15_23_04.jpg](https://qiita-image-store.s3.amazonaws.com/0/14768/ef371a4a-a161-9e26-2355-ecdece3ccdc4.jpeg "スクリーンショット_2014_01_15_23_04.jpg")

# 実際にオレオレFrameworkを作ってみる

JSONを扱うライブラリーは数多くありますが、（個人的な都合で）JSONKitをFramework化してみます。

## 1.プロジェクトを作成

iOS-Universal-Frameworkが組み込み済みであれば「Static iOS Framework」を選択し、JSONKitという名前でプロジェクトを作成します。

![JSONKit_xcodeproj.jpg](https://qiita-image-store.s3.amazonaws.com/0/14768/650cc160-7e5f-1625-7380-6d33993666a2.jpeg "JSONKit_xcodeproj.jpg")

## 2.JSONKitのファイル取得

[JSONKit](https://github.com/johnezang/)からファイルをダウンロードします。

> git clone https://github.com/johnezang/JSONKit.git

で取得したJSONKit.hとJSONKit.mをプロジェクトの中のファイルと置き換えます。別の名前で作ってしまった場合は、元のファイルをサクッとプロジェクトか取り除いてJSONKitのファイルを追加してください。

## 3.プロジェクトの設定

プロジェクトのBuildPhasesを選択します。

JSONKit.mのコンパイルオプションに「-fno-objc-arc」を追加します。
また、CopyHeadersのPublicにJSONKit.hを追加します。（これはJSONKitがARCに対応していないため行う作業です）

![JSONKit_xcodeproj.jpg](https://qiita-image-store.s3.amazonaws.com/0/14768/f5c4a366-9af8-d121-f596-0f9ec35ab62d.jpeg "JSONKit_xcodeproj.jpg")

##4.エラー修正

JSONKitはXCode5でコンパイルするとエラーが２つ表示されますが、ポップアップで表示されたアドバイスにしたがって「Fix-it」を選択します。

![JSONKit_xcodeproj_—_JSONKit_m.jpg](https://qiita-image-store.s3.amazonaws.com/0/14768/d6d8d5b1-114b-f7f1-fa06-c12a37bab9fa.jpeg "JSONKit_xcodeproj_—_JSONKit_m.jpg")

##5.コンパイル
Products->Archiveを選択すると、JSONKit.fremworkが作成されます。これでiOS用のframeworkの完成です。

##6.組み込み

### 6-1 RubyMotionプロジェクト作成

> motion create JSONTest
> mkdir JSONTest/vendor

作成したvendorディレクトリーの中にJSONKit.frameworkを入れます

### 6-2 Rakefile書き換え

Rakefileにframeworkの組み込みを行います。

```ruby:Rakefile
Motion::Project::App.setup do |app|
  # Use `rake config' to see complete project settings.
  app.name = 'JSONTest'

  app.vendor_project(
    'vendor/JSONKit.framework',
    :static,
    :products => ['JSONKit'],
    :headers_dir => 'Headers'
  )
end
```
### 6-3 テスト

組み込む程でもないのでrakeでシュミレーターを実行し、コマンドプロンプトよりテストを行います。

> (main)> ['one'=>1,'two'=>2,'three'=>3].JSONData
=> [{"one":1,"two":2,"three":3}]

ArrayやHashに対してJSONDataを呼ぶとJSON形式でデータが取得できればOKです。

ダメな場合はJSONDataを呼ぶと「undefined Method」が返ってきます。

>JSONTest[5159:80b] undefined method `JSONData' for [...]:Array (NoMethodError)
=> #<NoMethodError: undefined method `JSONData' for [...]:Array>
MongoDBの起動コマンド


いつも忘れるのでメモ
プロジェクトフォルダ内にdbフォルダを作りそのdbフォルダを保存先にしていして起動


```
$ cd (プロジェクトフォルダ)
$ mkdir db
$ mongod --nojournal --noprealloc --dbpath db
```

##mongodコマンドで永続的に使う方法
`--fork`オプションを付けるといいみたい．
ただしログの出力を設定する必要があり`--fork has to be used with --logpath or --syslog`と注意されます． node.jsのプロジェクト内にmongologというフォルダを作成し，その中にlog.txtを作成してそこにログを記録するようにしてみます．

```
$ mkdir mongolog
$ touch mongolog/log.txt
$ mongod --fork --logpath mongolog/log.txt --nojournal --noprealloc --dbpath db
```
これでターミナルで待ち受け状態じゃなくてもmongodbが使えます．
Google Closure Library On Firefox With XSLT

# どーゆーこと？
XSLTするならXHTMLで出力するとよい。

# Firefox + Closure Library + XSLT + HTML = NOT WORKING!!

次のようなXML文章とXSL文章を組み合わせて、Firefoxで表示すると
Closure Libraryのbase.jsがInvalidStateErrorを出してしまい動かない。

```xml:document.xml
<?xml verions="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="html.xsl"?>
<root/>
```

```xml:html.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" indent="yes" encoding="UTF-8" doctype-public="-//W3C//DTD HTML 4.01//EN" doctype-system="http://www.w3.org/TR/html4/strict.dtd"/>

  <xsl:template match="/root">
    <html>
      <head>
        <script src="closure-library/closure/goog/base.js"></script>
      </head>
      <body>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>
```

```
InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable
```

# Firefoxはdocument.write & XSLTをサポートしない
https://developer.mozilla.org/en/docs/XSL_Transformations_in_Mozilla_FAQ#What_about_document.write.3F

Closure Libraryはbase.jsで文書がHTMLの場合にdocument.writeを使っている。
上のようなXSLを使うと、出力はHTMLになるのでClosure Libraryはdocument.writeをこころみる。
しかし、FirefoxはXSLTが絡んだ場合document.writeすることは禁じられていて、実際挙動が不安定になる。
だから、Closure LibraryとHTMLを出力するXSLはそのままでは同時に使用できない。

# XHTMLなら万事OK
XHTMLとして出力すれば、Closure Libraryはdocument.writeを使わなくなるので問題なくなる。

```xml:document.xml
<?xml verions="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xhtml.xsl"?>
<root/>
```

```xml:xhtml.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
  <xsl:output method="xml" indent="yes" encoding="UTF-8" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>

  <xsl:template match="/root">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <script src="closure-library/closure/goog/base.js"></script>
      </head>
      <body>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>
```
複雑なメソッドチェインを使うとき

メソッドチェインは使いやすく便利です。
ですが複雑になると途中でどうなっているかイメージしづらくなってきます。
その時にtapというメソッドが非常に便利です。
例えば下のようなコードがあるとします。

```ruby:methodchain.rb
nums = [*(1..4)]
p nums.select { |num| num.even? }.map { |num| num * 3 }.zip([1, 2])

# >> [[6, 1], [12, 2]]
```

この例は特に複雑ではありませんがtapを使って途中でどうなっているかを見てみます。

```ruby:tap.rb
nums = [*(1..4)]
nums.select { |num| num.even? }.tap { |x| p "even    ：   #{x}" }.
  map { |num| num * 3 }.tap { |x| p "even * 3：   #{x}" }.
  zip([1, 2]).tap { |x| p "zip     ：   #{x}" }


# >> "even    ：   [2, 4]"
# >> "even * 3：   [6, 12]"
# >> "zip     ：   [[6, 1], [12, 2]]"
```

途中結果が表示されているのが分かると思います。
便利な機能なのでこれから使っていきたいです。
どうやってコードを書けばいいのかな? というときに役立つかもしれない howdoi

コードを書いているときに とりあえず動くけどきれいな書き方かはわからない というときに便利そう

# install 
`pip install howdoi`

いろいろインストールされてきます

## requirements
Pygments==1.5
argparse==1.2.1
cssselect==0.7.1
lxml==3.2.4
pyquery==1.2.6
requests==2.0.1
requests-cache==0.4.4

# HOWTO
```bash
% howdoi format dict python
geopoint = {'latitude':41.123,'longitude':71.091}
print('{latitude} {longitude}'.format(**geopoint))

%howdoi install homebrew
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"

%howdoi print golang
return fmt.Sprintf("at %v, %s", e.When, e.What)

%howdoi print lisp
CL-USER> (format t "~{~{~A ~}~%~}"
                 '((X X X) (X X X X X X) (X X X X X X X X X)))
X X X 
X X X X X X 
X X X X X X X X X
```

という感じで 英文法っぽくかけばそれなりに返ってくるみたいです  


cf.
[https://github.com/gleitz/howdoi](https://github.com/gleitz/howdoi)
組み込み関数append()のパフォーマンス

# この記事はもう古い
goのバージョンアップでこの辺の動きは変わっているようです。
以下のエントリで解説されています。
https://qiita.com/tanaton/items/e0bbd83e9b7158cd19c9

# 以下はもう正確じゃないかもしれません
@yosida95と@KOBA789とgolangでのslice実装について話していた。
これはそのメモと整理。

# 先に結論
sliceを作るときは、make()する時点で十分な領域を確保したほうが良い。
appendのメモリ確保はそんなに賢くなく、呼び出しの度に必ず確保を行うため、パフォーマンスは悪い。
以下の簡単なベンチでは約4倍のパフォーマンス差がある。

```go:faster.go
package main

const SIZE = 1e8
func main() {
	s := make( []int, 0, SIZE )
	for i:=0; i<SIZE; i++ {
		s = append( s, 1 )
	}
}
```

```shell-session:faster.goを実行
umisama-ubuntu{umisama}% time ./faster
./faster  0.36s user 0.22s system 98% cpu 0.586 total
```

```go:slower.go
package main

const SIZE = 1e8
func main() {
	s := make( []int, 0, 0 )
	for i:=0; i<SIZE; i++ {
		s = append( s, 1 )
	}
}
```

```shell-session:slower.goを実行
umisama-ubuntu{umisama}% time ./slower
./slower  1.14s user 1.01s system 99% cpu 2.152 total
```

# 経緯
コンパイラの実装を読んで、どういう動きをしているのか確かめている。
goのスライスは、runtime.hで以下のように定義されている。

```c:src/pkg/runtime/runtime.h
struct	Slice
{				// must not move anything
	byte*	array;		// actual data
	uintgo	len;		// number of elements
	uintgo	cap;		// allocated number of elements
};
```

スライスがmake()されるとき、その第二引数capの量のメモリを確保される。

```c:src/okg/runtime/slice.c
static void
makeslice1(SliceType *t, intgo len, intgo cap, Slice *ret)
{
	ret->len = len;
	ret->cap = cap;
	ret->array = runtime·cnewarray(t->elem, cap);
}
```

ここまでは良い、まぁ予想通り。
で、append()はどう実装されているかというと、こんな感じ(コメントに付いている擬似コード、Cは省略)

```c:src/cmd/gc/walk.c
// expand append(l1, l2...) to
//   init {
//     s := l1
//     if n := len(l1) + len(l2) - cap(s); n > 0 {
//       s = growslice(s, n)
//     }
//     s = s[:len(l1)+len(l2)]
//     memmove(&s[len(l1)], &l2[0], len(l2)*sizeof(T))
//   }
```

呼ばれるgrowsliceへは、必要な長さのみが指示される。
growsliceは毎回、先のmakeslice1()で全く新しくメモリ領域を確保し、そこへ内容をコピーする。（一部略）

```c:src/pkg/runtime/slice.c
void
runtime·growslice(SliceType *t, Slice old, int64 n, Slice ret)
{
	int64 cap;
	cap = old.cap + n;

	//略

	growslice1(t, old, cap, &ret);

	//略
}

static void
growslice1(SliceType *t, Slice x, intgo newcap, Slice *ret)
{
	intgo m;

	m = x.cap;
	
	// Using newcap directly for m+m < newcap handles
	// both the case where m == 0 and also the case where
	// m+m/4 wraps around, in which case the loop
	// below might never terminate.
	if(m+m < newcap)
		m = newcap;
	else {
		do {
			if(x.len < 1024)
				m += m;
			else
				m += m/4;
		} while(m < newcap);
	}
	makeslice1(t, x.len, m, ret);
	runtime·memmove(ret->array, x.array, ret->len * t->elem->size);
}
```

最初のmake()の契機以降で呼ばれたappend()は、毎回必ずメモリの再確保と、内容のフルコピーを行うようだ。

# 所感
多めに獲得してくれると、毎回呼ばれなくてパフォーマンスが上がりそうな気がした。
そういうappend()的関数を自作するのも良いかもしれない。
Rack middlewareを一時的に外す比較的楽な方法

[公式に書いてある](http://guides.rubyonrails.org/rails_on_rack.html#configuring-middleware-stack)のを参考に以下のようにする。

```rb:config/application.rb
    config.middleware.delete "ActionDispatch::DebugExceptions"
```

例外発生したときに、デバッグページを飛ばした処理が見たかったときに役立った。Production で起動するのが億劫なときに助かりそう。

## 追記
`better_errors` と合わせて使うと上手くいかなかった。better_errors が`ActionDispatch::DebugExceptions`依存の処理を行っているため。
適当に config/initialize/xxx.rb みたいなのを作って、delete すると一先ずできた。

```rb:config/initializer/xxx.rb
    Rails.application.config.middleware.delete "ActionDispatch::DebugExceptions"
    Rails.application.config.middleware.delete "BetterErrors::Middleware"
```

## SEE ALSO
公式: http://guides.rubyonrails.org/rails_on_rack.html
Django：参考資料

主に自分用（見つけ次第追加していく）

## Djangoドキュメント（日本語）
http://docs.djangoproject.jp/en/latest/contents.html

たいていのことはここで調べれば分かる（日本語だし便利）。

#### みんなのPython Webアプリ編
https://lindoc.jp/docs/1163

無料で公開されている電子書籍。DjangoというよりPythonだが、勉強にはよさそう。

#### PythonとDjangoを使うときに押さえとくと良いもの
http://d.hatena.ne.jp/nullpobug/20110411/1302506265

暇な時に試そうと思っている。

#### South
http://south.aeracode.org/
###### 既存のプロジェクトにsouthを追加する方法
http://yu-write.blogspot.jp/2014/01/django-south.html

DBの管理簡略化モジュール。デフォルトだとモデルクラスをいじったとき少し面倒なので導入するといいかも。

#### Salt
http://docs.saltstack.com/topics/tutorials/quickstart.html
###### python 版 Chef の Salt ってどんなもの？
http://infra.makeall.net/archives/1988
###### saltをちょっと試してみる（１）
http://infra.makeall.net/archives/2002

ちょっと気になったから貼っとく。

#### Djangoライブラリについての投稿
http://qiita.com/GRUGA7348/items/129f69706c85da92d14f

Qiitaの記事をそのまま持ってこさせてもらいました。

#### Django 開発初心者に送る 10 の Tips (超訳？)
http://d.hatena.ne.jp/namaco35/20100201/1264961617

Djangoにおけるお作法みたいなもの。
Linuxで物理NICを使わずに仮想ブリッジを作る方法

dummy net driverを使うとLinuxで物理NICを消費せずに仮想ブリッジを作れます。
NICが1つしかない物理マシンでOpenVPNやLXCを使うとき便利♪
_続きを書きました！：[Linuxでdummy net driverを使った仮想ブリッジを複数作る方法](http://qiita.com/mazgi/items/7f691646229c0e0c8c64)_

----

dummy net driverを使ってdummy0というダミーNICを作ります。
Gentoo Linuxなら `/etc/conf.d/net` にこんな感じで書いて、 `/etc/init.d/` の下にNIC名でsymlinkを張ります。

```shell-session
# cat /etc/conf.d/net
config_dummy0=(null)
bridge_br0="dummy0"
config_br0="null"
# ls -al /etc/init.d/net.*
lrwxrwxrwx 1 root root     6 Jan 14 05:10 /etc/init.d/net.br0 -> net.lo*
lrwxrwxrwx 1 root root     6 Jan 14 05:13 /etc/init.d/net.dummy0 -> net.lo*
-rwxr-xr-x 1 root root 17412 Dec  5 06:05 /etc/init.d/net.lo*
```

物理NICを消費せずに仮想ブリッジを起動できました♪

```shell-session
# /etc/init.d/net.br0 start
 * Bringing up interface br0
 *   Creating bridge br0 ...
 *   Adding ports to br0
 *     dummy0 ...                                                         [ ok ]
 *   Waiting for IPv6 addresses ...                                       [ ok ]
```

`ifconfig` はこんな感じ。

```shell-session
# ifconfig br0
br0: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 1500
        inet6 fe80::d472:abff:febb:536b  prefixlen 64  scopeid 0x20<link>
        ether d6:72:ab:bb:53:6b  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 19  bytes 4308 (4.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# ifconfig dummy0
dummy0: flags=195<UP,BROADCAST,RUNNING,NOARP>  mtu 1500
        inet6 fe80::d472:abff:febb:536b  prefixlen 64  scopeid 0x20<link>
        ether d6:72:ab:bb:53:6b  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 137  bytes 30835 (30.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

```
proxy環境下でのnpm config設定

proxy環境下でnpm install しようと思ったらハマったのでメモ。
まずは現在の設定を確認する。

```
$ npm config list
```

もっと詳しく見たい場合は以下を実行する。

```
$ npm config ls -l
```

### proxyの設定

デフォルトでは環境変数の`HTTP_PROXY`か`http_proxy`の値を見に行く。(設定していなければnull)
環境変数に設定せず、npmだけproxyを経由したい場合は以下のコマンドでproxyを設定する。もし環境変数を設定してある場合は、npm configで設定した値で上書きされる。

```
$ npm config set proxy http://proxy.example.com:8080
```

HTTPSの場合も同様。

```
$ npm config set https-proxy http://proxy.example.com:8080
```

詳細は以下を確認

* [npm-config](https://www.npmjs.org/doc/misc/npm-config.html)

### レジストリ設定

以下のようにSSL関連でエラーが出た場合は

```
$ npm install express
npm http GET https://registry.npmjs.org/express
npm http GET https://registry.npmjs.org/express
npm http GET https://registry.npmjs.org/express
npm ERR! network tunneling socket could not be established, cause=7252:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:openssl\ssl\s23_clnt.c:766:
npm ERR! network
npm ERR! network This is most likely not a problem with npm itself
npm ERR! network and is related to network connectivity.
npm ERR! network In most cases you are behind a proxy or have bad network settings.
npm ERR! network
npm ERR! network If you are behind a proxy, please make sure that the
npm ERR! network 'proxy' config is set properly.  See: 'npm help config'

npm ERR! System Windows_NT 6.1.7601
npm ERR! command "C:\\nodejs\\\\node.exe" "C:\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "install" "express"
npm ERR! cwd C:\Users\tenten0213\Documents\develop
npm ERR! node -v v0.10.24
npm ERR! npm -v 1.3.21
npm ERR! code ECONNRESET
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     C:\Users\tenten0213\Documents\develop\npm-debug.log
npm ERR! not ok code 
```

registryを`https`から`http`に変更する。

```
$ npm config set registry http://registry.npmjs.org/
```

これでproxy環境下でもnpm install出来る。