OmniAICreator/Qiita-1.07M huggingface dataset:
NightmareでE2E

# 概要

[Nightmare](http://www.nightmarejs.org/ "Nightmare")

segment.io社の「俺が考えた最強のe2e API」を備えたphantom.jsラッパー。スクレイパーにも使える。

casper.jsみたいなもん。試してみた。

# インストール

お使いのプロジェクトで `npm install nightmare` してください


URLを開く

```coffeescript
Nightmare = require 'nightmare'
new Nightmare()
  .goto 'http://localhost:3000'
  .evaluate (-> location.href), (url) -> console.log url
  .run()
```

.evalueate は第一引数関数でクライアントでevalした結果を、第二引数のコールバックとしてもらってくる。



mochaのテストならこんな感じ

test/nightmare_example.coffee

```coffeescript
Nightmare = require 'nightmare'
{ok} = require 'assert'

describe 'open', ->
  it 'should open localhost:3000', (done) ->
    new Nightmare()
      .goto 'http://localhost:3000'
      .evaluate (-> location.href), (url) -> console.log url
      .run()
```

`./node_modules/.bin/mocha --compilers coffee:coffee-script/register --timeout 30000`

タイムアウト多めに取っておいたほうがいい。

フォーム埋めてログインするならこんな感じ。

```coffee
Nightmare = require 'nightmare'
{ok} = require 'assert'

describe 'post', ->
  it 'should login', (done) ->
    new Nightmare()
      .goto 'localhost:3000/login'
      # login
      .type 'input[name=username]', 'username'
      .type 'input[name=password]', 'password'
      .click '.submit'
      .wait()
      .evaluate (-> location.href), (url) ->
        ok url is 'http://localhost:3000/'
      .run()
```

waitを挟んでページ遷移を待つ必要がある。
`.wait('.hoge')` でセレクターの出現をまったり、wait(3000) で3000msまったりできる。
gosh.interactiveがloadできない

#####先日gauche(ver.0.9.4)をダウンロード、インストールしました。
#####ターミナルでの起動自体はできるのですが、
#####couldn't load gauche.interactive
#####というメッセージが出てemacsから起動することができません。
#####interactiveのファイル自体はあるのでその読み込みなどに問題があるように思われます。
#####どなたか解決法をご教授頂けると幸いです。
ZabbixからSlackに通知を送る

---
# 方針
- Slackのincoming hookを利用して、メッセージを送るシェルスクリプトを使う
- Zabbixに新規にSlackユーザーを作成し、Mediaとして上記スクリプトを登録する
- slackユーザーを各種通知の通知先に設定されているユーザーグループに追加することで通知を流す


# 関連リソース
ericoc/zabbix-slack-alertscript
https://github.com/ericoc/zabbix-slack-alertscript

を使います。基本的にはこちらのreadme通りに設定します。

#実際の作業

## Zabbixサーバにスクリプトを置く
### まずはZabbixのAlertScriptPathを確認

```Bash
grep AlertScriptsPath /etc/zabbix/zabbix_server.conf
### Option: AlertScriptsPath
AlertScriptsPath=/usr/local/share/zabbix/alertscripts
```

### スクリプトをコピーして実行権限をつけておく

```Bash
cd /usr/local/share/zabbix/alertscripts/
wget https://raw.githubusercontent.com/ericoc/zabbix-slack-alertscript/master/slack.sh
chmod a+x slack.sh

ls -lh /usr/local/share/zabbix/alertscripts/slack.sh
-rwxr-xr-x 1 root root 1.4K Dec 27 13:48 /usr/local/share/zabbix/alertscripts/slack.sh
```

### slack.shの先頭部分の設定を変更

|設定項目|設定内容|
|:--------------------------|:--------------------|
|subdomain|hogefuga.slack.comのhogefuga部分を指定    |
|username|Slack上に通知するときに使われるユーザー名を指定|
|channel |通知を送る先のslackチャンネル名を#つきで指定  |
#### 例
```Bash
# Slack sub-domain name (without '.slack.com'), user name, and the channel to send the message to
subdomain='myorgname'
username='Zabbix'
channel='#alerts'
```

## Slack側の設定
https://my.slack.com/services/new/incoming-webhook 
からincoming web hookを作成し、"Your Unique Webhook URL"の"token="以下を確認しておきます。

Your Unique Webhook URLが
https://hogefuga.slack.com/services/hooks/incoming-webhook?token=HogehogeFugafuga
であれば、tokenは "HogehogeFugafuga"です。


## Zabbix側の設定
### "Slack"という名前のmedia typeを作成
web interfaceにsuper-administrator権限のあるユーザーでログインします。
"Administration"タブ -> "Media types"タブ -> "Create media type"ボタンを押して作成。


|設定項目|設定内容|
|:--------------------------|:--------------|
|media type                 | Script        |
|Script name                | Slack.sh      |
|Enabled                    | チェックを入れる |

Saveする。

### "Slack"という名前のユーザーを作成
"Administration"タブ -> "Users"タブ
"User groups"のドロップダウンからUsersを選択 -> "Create User"ボタン 
#### "User"タブ
|設定項目|設定内容|
|:--------------------------|:-------------------|
|Alias                       |Slack               |

#### "Media"タブ
"Add"ボタンをおして

|設定項目|設定内容|
|:--------------------------|:-------------------|
|Type                       |Slack                       |
|Send to                    |token(例：HogehogeFugafuga) |
|Use if severityのチェック項目|すべてチェック              |
|Status                     |Enabled                     |

Saveする。

### Actionの設定

"Configuration"タブ -> "Actions"タブの内容を確認

|Name | Conditions| Operations|Status|
|:--|:--|:--|:--|
|Report problems to Zabbix administrators|Maintenance status not in maintenance Trigger value = PROBLEM| Send message to user groups: Zabbix administrators via all media|Enabled|

といったエントリがあるならば、Zabbix administratorsグループにSlackユーザーを追加してしまえばOKです。
（via all mediaなのでユーザーSlackのSlackメディアから送られる）
# ハマりやすいポイント
to be added

# おわりに
Slack.shはとても短いスクリプトなので、自分でカスタムもしやすいと思います。

---
# 参考
 * [Slack incoming web-hook functionality](https://my.slack.com/services/new/incoming-webhook)
 * [Zabbix (2.2) custom alertscripts documentation](https://www.zabbix.com/documentation/2.2/manual/config/notifications/media/script)
BrowserSyncで勝手に立ち上がるブラウザを変更したり、localhost:8888とかでなく、192.168.1.1:8888とかで立ち上げちゃいたいときのGulp設定



# BrowserSyncにはいろいろオプションがある

APIオプションにいろいろ書いてある。ちょろっと見ておくと吉でしょう。

* [CLIドキュメント](http://www.browsersync.io/docs/command-line/)
* [APIドキュメント](http://www.browsersync.io/docs/api/)
* [APIのオプション](http://www.browsersync.io/docs/options/)

ここではgulpの設定で書いてますが、gruntでもだいたい同じなんじゃないかな！ウェーイ！！

# 勝手に立ち上がるブラウザを変更するとき

```gulpfile.coffee
gulp.task 'browser-sync', ->
  browserSync(
    port: 8888
    browser: 'Google Chrome Canary'  # ←ここ。winのときはこれでは動かんので、ググると吉。
    server: {
      baseDir: "./public"
    }
  )
```

# localhost:8888じゃなくて自分のIPで立ち上げる

**スマホで確認するときにいちいちipに打ち替えるのがめんどう**なので、こちらで！


npmで`my-ip` `gulp-open`をインストール

	npm install my-ip gulp-open -D


```gulpfile.coffee
ip = require('my-ip')(null, false) # ←自分のローカルIPが入る
PORT = 8888

gulp.task "open", ->
  options =
    url: "http://#{ip}:#{PORT}"
    app: "Google Chrome Canary" # winのときはこれでは動かんので、ググると吉。

  gulp.src("./gulpfile.coffee").pipe open("", options)
  return


# gulp server でビルド+browser sync → openする
gulp.task 'server', (callback) -> runSequence(['browser-sync', 'build'], ['open', 'watch'], callback)

```

だいたいこんな流れでウェーイ！！！フゥーーー！！！！
MongoDB の find がタイムアウトする


MongoDB から結果が大きめのデータを引っ張ろうとすると

```
cursor didn't exist on server, possible restart or timeout?
```

みたいなエラーがでますた．

Cursor の addOption を使ってタイムアウトを無効にしましょう．

```
db.collection.find().addOption(DBQuery.Option.noTimeout)
```

## 参考
ほかにもいくつかオプションあるみたいです

http://docs.mongodb.org/manual/reference/method/cursor.addOption/
Multi-dex Support を使おう

## Multi-dex とは

https://github.com/casidiablo/multidex

一個の dex に含められるメソッドの総数が 65,535 なのは有名な話ですが、Google Play Services や Guava などの大きなライブラリを使うと、わりとすぐにその数字に達してしまいます。

Guava の場合、ドメインに応じて dependency をつまみ食いできるので、不要なものは dependencies に記述しなければ良いだけで済みます。
しかし、Google Play Services は All in one なライブラリのため、つまみ食いができず、ProGuard で使わないものを無理やり削ぎ落とすなどの工夫が必要です。

それでも、ライブラリへの依存が増えれば、その分だけメソッドの総数も増えていきます。どうしても 65,535 を超える場合、Multi-dex Support を使うことで、この問題に対応することができます。

その名の通り、Multi-dex Support では、1 つの apk に dex ファイルを複数持たせることで、擬似的にアプリ全体としてのメソッドの総数を 65,535 以上持つことができるようにします。
Android Lollipop ではネイティブレベルでこのサポートが入るため、特別なことは何もありませんが、それより前の OS では、Dalvik は 1 つの dex ファイルしか読みに行かないため、パッチを当てる必要があります。Multi-dex Support はそのパッチを当てる役割を果たし、これによって、API Level 4 までを Multi-dex 対応することができるようになります。

## 準備

Multi-dex Support 専用の jar を導入します。

`/sdk/extras/android/support/multidex/library/libs` に `android-support-multidex.jar`があるので、これをコピペしてきます。

次に、Application クラスを魔改造します。

Application クラスがないのであれば、MultiDexApplication クラスを AndroidManifest の`<application>`に指定します。
Application クラスがあって、親が`Application`であれば、`MultiDexApplication`に変更するだけで済むでしょう。
何かしらの抽象Applicationクラスを継承しているのであれば、以下のように実装することで対応可能です。

```java

public class MyApp extends HogeApplication {
  @Override
  protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
  }
}
```

最後に、ビルドスクリプトをいじって Multi-dex を使うようにします。

```groovy

android {
  dexOptions {
    preDexLibraries = false
  }
}
 
afterEvaluate {
  tasks.matching {
    it.name.startsWith('dex')
  }.each { dx ->
    if (dx.additionalParameters == null) {
      dx.additionalParameters = []
    }
    dx.additionalParameters += '--multi-dex'
    dx.additionalParameters += "--main-dex-list=$projectDir/multidex.keep".toString()
  }
}
```

`multidex.keep`によって、クラスローダが最初に読み込む`classes.dex`に含まれてほしいものを宣言します。ほぼ決まり文句のようなものです。これを記述しないと、運悪く`classes.dex`に以下の中間コードが含まれなかった場合にエラーとなります。

```

android/support/multidex/BuildConfig.class
android/support/multidex/MultiDex$V14.class
android/support/multidex/MultiDex$V19.class
android/support/multidex/MultiDex$V4.class
android/support/multidex/MultiDex.class
android/support/multidex/MultiDexApplication.class
android/support/multidex/MultiDexExtractor$1.class
android/support/multidex/MultiDexExtractor.class
android/support/multidex/ZipUtil$CentralDirectory.class
android/support/multidex/ZipUtil.class
```

この他、`Application#onCreate`で直接いろいろなコンポーネントの初期化を行う場合、運悪く、対象のクラスが`classes.dex`に居ない時に、やはりクラスが見つからないエラーが出ます。回避策として、匿名の Runnable を用意し、`Runnable#run()`で初期化処理を動かす方法があります。

## ビルド

いつもどおりビルドするだけです。

## いいこと

65,535 を超えるメソッドを取り扱うことができるようになるので、モノリシックなライブラリも怖くないですね。

## よくないこと

当然ですが、アプリケーションの起動時に見るべきファイルが増えるので、その分だけ起動に時間がかかります。
たとえば、ブロードキャスト Intent が飛んできた時にアプリのプロセスが立ち上がると、その時に複数の dex からクラスをロードしようとするので、ブロードキャストの処理が終わるまでに時間がかかります。
Node.jsについて

#■ 概要

　いまアツいJavaScript。

　サーバーサイドで動作するJavaScript。

　![Nodejsの特徴.png](https://qiita-image-store.s3.amazonaws.com/0/27058/d38cf7d6-d728-1dff-4055-0cec45741bf2.png)

※引用元：ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20120725/411441/?SS=imgview&FD=55062768&ST=system

　"軽量で効率よく"を実現するための2つのモデル。

　・ノンブロッキングI/O

　　データの送受信（I/O）が完了を待たず（ブロックせず）に、
　　次の処理をうけつけ、それぞれを並列に実行できる。

　・イベントループ
　
　　１つしかないスレッドで大量アクセスに耐える。



#■ オフィシャルサイト

　http://nodejs.org/



#■ インストールから「helloworld」まで（Windows）

　①オフィシャルサイトからインストール
　（自動的にOSに対応してくれる）

　②任意のディレクトリに「helloworld.js」を用意する。

　　　　　![helloworldjs.png](https://qiita-image-store.s3.amazonaws.com/0/27058/24bbef1d-f7df-832e-9fe4-69bab235af2e.png)

　　　　　![中身.png](https://qiita-image-store.s3.amazonaws.com/0/27058/be757fed-fddd-8c09-9ca0-4bf7a2bdfc0f.png)

　③コマンドプロンプトを開いて実行

　　　　　　　　![コマンドプロンプト.png](https://qiita-image-store.s3.amazonaws.com/0/27058/43932f03-d097-b4fa-ac41-e3b88aa3e511.png)
CentOS7をインストール後、NetworkManager(nmtui)で固定IPをふる方法

固定IPの設定は、/etc/sysconfig/network-scripts/以下のifcfg-***のファイルを設定するのが一般的と思いますが、CentOS7では非推奨らしいので、NetworkManager付属の「nmtui」で固定IPを付与します。

といっても、やり方は非常に簡単です。

```lang:手順
（アドレスの確認（インストール直後はDHCPと思います））
#ip addr show
（固定IPの設定）
#nmtui
（GUIが起動します）
「Edit a connection」選択
「eth1」（例）選択
「IPv4 CONFIGURATION」
　→Manual
「Addresses」
　→192.168.1.1/24
「GATEWAY」
　→192.168.1.1
「DNS servers」
　→192.168.1.101
「OK」選択
「Quit」選択
（ネットワーク再起動）
#systemctl restart network.service
（アドレスの確認）
#ip addr show
```
Dockerコンテナ内で service iptables stop/status をエラーにしない

セントス6など前提で。

### `CAP_NET_ADMIN` ケーパビリティを与える

```bash
$ docker run --cap-add=NET_ADMIN --rm -ti hoge_image /bin/bash
```

### `IPTABLES_MODULES_UNLOAD=no` を `/etc/sysconfig/iptables-config` に書き込む

```bash
bash-4.1# echo 'IPTABLES_MODULES_UNLOAD=no' >> /etc/sysconfig/iptables-config
bash-4.1# service iptables stop
iptables: Setting chains to policy ACCEPT: nat filter      [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
bash-4.1# service iptables status
Table: nat
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination         

Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

```

Serverspec のお供にどうぞ。Docker内ではスキップしてる人が多そうだが。
Yahoo! JavaScriptマップAPI利用時のDIV分割について


スマートフォン用のwebページを作り、
上段にYahooマップを表示し、
下段に文章を書いたサイトを作成中です。
下段文章中のリンクをクリックすると、上段のマップカーソルが指定した位置に移動します。
上段画面はディスプレイ上に固定し、スクロールしないことを想定しています。

画面の分割はDIV要素＋css(head部に記述）により実行しています。

ここで問題ですが、
Yahooマップを上段に表示させるとDIVの段組みを無視し、
スクロールされてしまいます。
Yahooマップの出力は下記APIサンプルの通り実施しています。
http://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/js/#index1-2

Yahooマップを出力せず、DIV要素による上下の分割のみ実装した場合は問題なく分割表示されます。

何か解決方法はないでしょうか。
または、地図を全画面に固定表示し、各種ボタンを地図の上に重ねて配置したいのですが、サンプル等がないでしょうか。

よろしくお願いいたします。
EC2のpostfixでSESにリレーしてメールを送る設定

EC2からメールを送ると結構すぐにブロックされるらしいので、メールの送信をSES経由で行うようにする。
SESは設定済としてPostfixのリレー設定方法。

SMTP認証に必要なパッケージをインストール

```
yum -y install cyrus-sasl-plain cyrus-sasl-md5
```

/etc/postfix/main.cf に以下のような記述を追加。
relayhostはSESのSMTPエンドポイント

```
relayhost = email-smtp.us-east-1.amazonaws.com:25
smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/sasl_password
smtp_use_tls = yes
smtp_tls_security_level = encrypt
smtp_tls_note_starttls_offer = yes
smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt

# fix for CVE-2014-3556 (POODLE)
smtpd_tls_mandatory_protocols=!SSLv2,!SSLv3
smtp_tls_mandatory_protocols=!SSLv2,!SSLv3
smtpd_tls_protocols=!SSLv2,!SSLv3
smtp_tls_protocols=!SSLv2,!SSLv3
```

/etc/postfix/sasl_passwdを作成

```
echo "email-smtp.us-east-1.amazonaws.com:25 アクセスキー:シークレットキー" > /etc/postfix/sasl_password
```

ハッシュ化

```
postmap hash:/etc/postfix/sasl_password 
```

再起動

```
/etc/init.d/postfix restart
```

確認

```
mail hogehoge@hogehoge.com
```

/var/log/maillogの確認 & 実際にメールが届いたかを確認。
Support Package Library を v21 にする時にハマるポイント

Android Lollipop の API がファイナライズされ、サポートパッケージライブラリも提供が始まりました。最新バージョンは 21.0.0 です。

ここで、旧バージョンから新しいものに乗り換える場合に気をつけるポイントを残しておきます。

## Google Play Services との競合

http://stackoverflow.com/questions/26432123/lollipop-appcompat-v7-21-attribute-theme-has-already-been-defined

もし、Google Play Services を使っている場合、Support Package Library を v21 にするならば、Google Play Services のバージョンを 6.1.+ にする必要があります。そうしないと、`Attribute “theme” has already been defined`という謎のエラーに出くわしてビルドできなくなります。

## CompileSDK, TargetSDK の変更

もちろん、21 にします。でなければ、各種リソースが解決できずに悲しい目に合います。

## CompileOptions で JDK 7 を使う

21 になると、JDK 7 を要求するようになります。
11章 Phantom Files(幻のファイル)

# 11.1 目的：画像をはじめとする大容量メディアファイルを格納する

# 11.2 アンチパターン:物理ファイルの使用を必須と思い込む
*画像のデータを保存する時、どのように保存するか*
* 画像のバイナリデータとしてBLOB型でDBに保存する？
* 画像をファイルシステムにファイルとして格納し、ファイルパスをVARCHAR型でDBに保存する？
**筆者はバイナリ派。外部ファイルは大きなリスクを伴うので**

## 11.2.1 ファイルの削除時における問題
* DBで画像へのパスを含む行を削除しても、その指定先のファイルは自動で削除されない
* 行削除と同時に指定先のファイルも消さないといけない

## 11.2.2 トランザクション分離の問題
* DBのコミットとファイルの参照できる、できないは別のタイミングで変わる
* 現実的にそれほど問題にならない

## 11.2.3 ロールバック時における問題
* DELETE文をrollbackしようとしてもファイルを削除してしまっていれば元に戻せない

## 11.2.4 データベースのバックアップツール使用時における問題
* DBのバックアップを支援するクライアントツールとの連携
* ファイルのパスとは別に外部ファイルのバックアップも取る必要がある
* DB外部ファイルの同期はどうするのか

## 11.2.5 SQLアクセス権限使用時における問題
* 外部ファイルにはGRANTやREVOKEなど、SQLステートメントで割り当てるアクセス権限が適用できない
* DBで文字列で指定された外部ファイルのアクセス権までは管理できない

## 11.2.6 ファイルはSQLデータ型ではない
* 格納されたパスの文字列が正当であるとを、DBはを検証しない
* DBは指定されたパスにファイルが存在すること検証できない
* ファイル名が変更されたり、ファイルの移動削除が行われてもDBの文字列は自動で更新されない
* 文字列をパス名として扱うのはアプリケーションが保証することになる

## 11.3 アンチパターンの見つけ方
まあいいや。。。

## 11.4 アンチパターンを用いても良い場合
* データベースの容量を減らせる
* データベースのバックアップが短時間で終了し、かつバックアップファイルの容量も抑えられる
* 画像がデータベース外にあれば、プレビューの編集が容易になる

## で、結局どうなんでしょう
みんなで議論しましょう
CSS filter: alpha() 透明・半透明・グラデーションにする

filter: alpha()　画像やテキストを透明・半透明・グラデーションにする


使用例 filter: alpha(opacity=40)


Opacity 開始透明度を、0(透明)～100(不透明)の範囲で指定
FinishOpacity 終了透明度を、0(透明)～100(不透明)の範囲で指定
style0指定なし　1線形　2円形　3長方形
グラデーションは、Opacity FinishOpacity の範囲でかけます。
Python3の...（Ellipsisオブジェクト）について

# Ellipsisオブジェクトとは

Python3のREPLで `...` と入力してみる。

```pycon:Python3
>>> ...
Ellipsis
```

これがEllipsisオブジェクト。

`Ellipsis` または `...` で表されるシングルトンオブジェクトである。

[公式リファレンス](http://docs.python.jp/3/library/constants.html#Ellipsis "3. 組み込み定数 — Python 3.4.2 ドキュメント")では「主に拡張スライス構文やユーザ定義のコンテナデータ型において使われる特殊な値」とあるのみで、明確に用途を定義していない。

英語のellipsisは「省略」という意味なので、処理や引数を省略したい場合に使うものと考えられる。

# Noneやpassとの違い

## None

`None` は「値が存在しない」ことを表すが、`Ellipsis` は「何らかの値が存在するが省略されている」ことを表す。

`bool(Ellipsis)` の返り値が `True` である点から見ても、 `Ellipsis` が `None` よりも肯定的な意味をもつことがわかる。

```pycon:Python3
>>> bool(None)
False
>>> bool(Ellipsis)
True
```

## pass

`pass` は文であるが、`...` は式である。

つまり `...` は引数として関数に与えることができる。

```pycon:Python3
>>> str(Ellipsis)
'Ellipsis'
>>> str(pass)
  File "<stdin>", line 1
    str(pass)
           ^
SyntaxError: invalid syntax
```

# 使いどころ

## 実行可能な擬似コード

そもそもPythonは元祖「実行可能な擬似コード」と呼ばれる言語である。

これは、Pythonコードが単なる「実行可能なプログラム」ではなく「人間とコンピュータの双方が理解できる処理やアルゴリズムの表現」であるということ。

擬似コードでは処理などの省略部分を ... と表記することがあるが、Python3はこれを「省略」を表す値として認めることにより、より抽象的な表現を可能にしていると言える。

## NumPyでの多次元配列のスライス

より具体的な例。

NumPyでは、多次元配列のスライス記法で `...` を使用することができる。

この場合、 `...` は指定されていない次元のインデクスが任意であることを示す。

```pycon:Python3-NumPy
>>> import numpy
>>> a = numpy.array([[1, 2],
...                  [3, 4]]) # 2x2の多次元配列
>>> a[0, ...] # 0行目の任意の列の要素からなる配列
array([1, 2])
>>> a[1, ...] # 1行目の任意の列の要素からなる配列
array([3, 4])
>>> a[..., 0] # 任意の行の0列目の要素からなる配列
array([1, 3])
>>> a[..., 1] # 任意の行の1列目の要素からなる配列
array([2, 4])
>>> a[...] # 任意の行の任意の列の要素からなる配列
array([[1, 2],
       [3, 4]])
```

スライス記法なら `:` を使っても同じことができると思うかもしれない。

```pycon:Python3-NumPy
>>> a[0, :]
array([1, 2])
```

しかし、3次元以上の配列では `:` と `...` の動作が異なる。

`:` はあくまで特定のひとつの次元が任意であることを示すが、 `...` は指定されていない全ての次元について、インデックスが任意であることを示す。

```
>>> b = numpy.array([[[1, 2],
...                   [3, 4]],
...                  [[5, 6],
...                   [7, 8]]]) # 2x2x2の多次元配列
>>> b[..., 0] # 第1, 2次元は任意、第3次元のインデックスは0 ---(1)
array([[1, 3],
       [5, 7]])
>>> b[:, :, 0] # (1)と同義
array([[1, 3],
       [5, 7]])
>>> b[:, 0] # 第1次元は任意、第2次元のインデックスは0、第3次元のインデックスは任意 ---(2)
array([[1, 2],
       [5, 6]])
>>> b[:, 0, :] # (2)と同義
array([[1, 2],
       [5, 6]])
```

# 参考

* [3. 組み込み定数 — Python 3.4.2 ドキュメント](http://docs.python.jp/3/library/constants.html)
* [What does the Python Ellipsis object do? - Stack Overflow](
http://stackoverflow.com/questions/772124/what-does-the-python-ellipsis-object-do)
cocos2d-xにて、画像をマルチ解像度対応した際に、画像サイズがランダムに表示されてしまう場合の対応方法


# 環境
- xcode 5.1.1
- cocos2d-x 3.2

# 現象

画像をマルチ解像度に対応するため、異なる解像度の画像ファイルをリソースフォルダに以下の配置した。

```
Resource/big/box.png (100x100)
        /small/box.png (50x50)
```

アプリの表示域に応じて、探索パスを設定する。

```cpp
FileUtils::getInstance()->setSearchPaths("big" or "small");
```

```cpp
auto sprite = Sprite::create("box.png");
```

そうしたところ、アプリを起動するたびにbox.pngの参照が、bigだったりsmallだったりとランダムになってしまった。


# 原因

bigフォルダ, smallフォルダをxcodeに追加する際に、
「Create groups for any added folders」を選択していたため、ファイル階層が１階層として扱われ、Sprite::create("box.png");の結果がランダムになったっぽい？

# 対処

bigフォルダ, smallフォルダをxcodeに追加するときに
「Create folder references for any added folders 」を選択する。

# 余談

xcode上で正しくファイルを配置しているのに、画像が反映されない場合があった場合、CleanかiOSデバイス（又はシミュレータ）のアプリを削除してみるとうまくいくかもしれない...

# 参考

- [Stackoverflow](http://stackoverflow.com/questions/23692276/cocos2dx-3-0-use-setsearchpaths-adapted-to-screen-size-doesnt-work)
- [Xcodeグループとフォルダー参照](http://www.slideshare.net/tomohirokumagai54/xcode-32343329)
オブジェクト指向その①


プログラミングのお話の中でよく「オブジェクト指向」という言葉がでてきます。しかしどういう物なのかを調べるのがなかなか難しい物なのではないかと思います。
JavaScriptもまた、オブジェクト指向言語の１つです。

そこで、今回はJavaScriptという言語の中で「オブジェクト指向」について整理してみたいと思います。

## <オブジェクト指向とは>

プログラムの組み立て方のひとつであり↓
`操作の対象となる「モノ＝オブジェクト」を中心にプログラムを組み立てるやり方`であります。
もう一度言うと、、、「プロパティ」や「メソッド」を使って「オブジェクト」を変化させる方法ということです。

今、２つの言葉が出てきましたが、それについて説明します。

・`プロパティ`、、、、オブジェクトの状態や特性をあらわす情報
・`メソッド`、、、、、オブジェクトを操作するための命令

まとめると

```text
「プロパティ」や「メソッド」をつかって「オブジェクト」を変化させる

```
こういう事です。

文章だと分かりづらいかと思いますので下の絵にまとめました。
(本当はいつもの「あずまんが」でやりたかったですが絵はさすがにまずいと思って今回は車でやります。)

![キータ001.png](https://qiita-image-store.s3.amazonaws.com/0/35975/dbf7343a-7e3c-9b51-5394-309984f86fd5.png "キータ001.png")

## <オブジェクトの種類と実際の組み立て方(書き方)>

javaScriptでは、さまざまなオブジェクトを利用できますが、まず`document`という良く知られているオブジェクトを使って「オブジェクトの基本的な構文(書き方)」をまとめてみたいと思います。

以下の様に書きます↓

```js

document.write(' あたし美浜ちよ！これでも10才なんですよ。 ');

```

上の文の内訳は、、、、↓
![キータ002.png](https://qiita-image-store.s3.amazonaws.com/0/35975/35275788-6fc6-00fb-2755-a7e1a05d1799.png "キータ002.png")

ちなみに`document`オブジェクトは「ページ表示領域を操作する」ためのオブジェクトです。

それと`write`メソッドは指定された文字列を表示するメソッドです。

まとめると、、↓
まず
①「documentオブジェクト」は「wirteメソッド」に対して、「あたし美浜ちよ！これでも10才なんですよ。」という文字列をパラメーターとして渡します。
② その結果、javaScriptは、ブラウザの「documentオブジェクト＝ページ表示領域(※ 画面表示領域じゃ無いですよ、ブラウザソフトの中のページが表示されてる部分ですね)に指定された文字列を表示する」

という仕組みです。

## <プロパティの場合>

もう１つ、「プロパティ」を使った例を書いてみたいと思います。

```js
document.bgColor = "red";

```

結果は下で見れます↓
[http://m-uehara.com/object_001/](http://m-uehara.com/object_001/ "出来上がり")


内訳は

![キータ003.png](https://qiita-image-store.s3.amazonaws.com/0/35975/895d93b4-cf5e-6a33-d91a-3141ce76a000.png "キータ003.png")
Hexoテンプレートギャラリー

## テーマギャラリー
既存のテーマを一覧で確認できます。
Hexo導入、テンプレートに飽きた時はこちらでチェック
http://js.romareas.net/demo/

## What is Hexo.js?
Nodeベースで静的なブログサイトを構築するための環境。
Markdownで記事をかけるのでQiitaユーザーも快適！！

## 静的ブログで快適
よく考えてみましたが、やっぱりブログってDBへの接続や、
サーバーサイドの処理って必要ないと思ってます。
無駄にリソースを使えば速くはできますが。
それなら低コストで高速に表示できる静的サイトの方が圧倒的にいいはずです。
現在Wordpressから引っ越し中

## たくさんのテーマがある
60弱あります。Wordpressのそれとは比べられませんが、
選べる程はあります。個人的に好きな物もあります。

## ちょっとした欠点
日本語はデフォルトでは対応していません。
日本語対応したいのであれば請け負います。
Macのセグメントを変えたら繋がらなくなった件


どうやらFreeBSD時代からの名残らしい
どこからも接続がないと勝手にネットワークが休止になるとか
仕方ないので中からping飛ばすなりで対処

```
$ nohup ping localserver > /dev/null & 
``` 

# それだと手間なので自動起動したい
再起動の度に実行するのも面倒なのでMac 自動起動スクリプト

古い仕様がある。記述の通り、LaunchDaemonsを使うようにとのこと
Old [Daemons and Services Programming Guide](https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/StartupItems.html)
New [Daemons and Services Programming Guide](https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html#//apple_ref/doc/uid/10000172i-SW7-BCIEDDBJ)

# LaunchDaemons設定
設定は簡単。Lavelの名前が起動名になる。
/dev/nullを使う場合はStandardOutPathかStandardErrorPathを指定しろとのこと。

```
$ cd /System/Library/LaunchDaemons
$ sudo vi startnohup.plist
```
```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>startnohup</string>
    <key>ProgramArguments</key>
    <array>
        <string>/sbin/ping</string>
        <string>localserver</string>
    </array>
    <key>KeepAlive</key>
    <true/>
    <key>StandardOutPath</key>
    <string>/dev/null</string>
</dict>
</plist>
```
```
// デーモン登録
$ sudo launchctl load -w  startnohup.plist
// 起動
$ sudo launchctl start startnohup
// 停止
$ sudo launchctl stop startnohup
// デーモン登録解除
$ sudo launchctl unload -w  startnohup.plist
```

# その他

```
// 動いているか確認
$ ps -ax | grep ping
```
メモ/DynamoDBのCLIでのキャパシティ調整



小林製薬、バッチその前に。

```

$ aws dynamodb update-table --table-name TableName \
	--provisioned-throughput ReadCapacityUnits=10,WriteCapacityUnits=200

```

GSIとかはJSON形式にしないといけなくてエスケープとかめんどい。
処理時間計測

なんとなく時間計測ネタが目に入ったので

気が向いたら後で秒とか分で表すように修正します。

```clj

(defn run-fnc [function]
  ; 時間計測開始
  (let [start (java.lang.System/currentTimeMillis)]
    ; 処理実行
    (function)
    ; 時間計測終了
    (- (java.lang.System/currentTimeMillis) start)))

(defn hello [] 
  (Thread/sleep 1000)
  (println "hello"))

(run-fnc hello)

```
RenderScriptのv8 Support LibraryをAndroid Studioで使う

2015年1月7日時点では[公式ドキュメント](https://developer.android.com/tools/support-library/features.html#v8)によるとAndroid Studioではv8 Support Library (RenderScriptの下位互換ライブラリー)はサポートされていないことになっていますが、実は使えるようになってました！
方法は下のように、android.defaultConfigブロックに1行付け加えるだけ。

```groovy
android {
    ...
    defaultConfig {
        ...
        renderscriptSupportModeEnabled true
    }
}
```

これでビルドすれば android.support.v8.renderscript パッケージが使えるようになります。

## さくっと動作確認したい人のためのサンプル

### Activity

```java
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.v8.renderscript.Allocation;
import android.support.v8.renderscript.Element;
import android.support.v8.renderscript.RenderScript;
import android.support.v8.renderscript.ScriptIntrinsicBlur;
import android.view.View;
import android.widget.ImageView;


public class MyActivity extends Activity {
    RenderScript rs;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        rs = RenderScript.create(this);
    }

    public void process(View img) {
        Bitmap bmp = ((BitmapDrawable) ((ImageView) img).getDrawable()).getBitmap();
        Allocation alloc = Allocation.createFromBitmap(rs, bmp);
        ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, Element.RGBA_8888(rs));
        blur.setInput(alloc);
        blur.forEach(alloc);
        alloc.copyTo(bmp);
        ((ImageView) img).setImageBitmap(bmp);
    }
}
```

### res/layout/activity_my.xml

```xml
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_launcher"
    android:onClick="process"
    android:layout_gravity="center" />
```

![Before](https://qiita-image-store.s3.amazonaws.com/0/56668/d5eb76c8-cbe7-3d10-9264-ffbfc04746fe.png)
![After.png](https://qiita-image-store.s3.amazonaws.com/0/56668/d17b4300-32ae-25b2-f856-69e57feb994e.png)
migrateするときめも

migrateするときに確認しておきたいこと。
当たり前すぎることをめも。

***

###マイグレーションファイル作成

#####基本的なコマンド
```lang:基本的なコマンド
bundle exec rails generate migration [処理+テーブル名]
```
[処理+テーブル名の例]
あるテーブル(TestTables)
+ create:CreateTestTables
+ カラム(test_column)追加:AddTestColumnTestTables
+ drop:DropTestTables
…など。

※追加の場合は「AddColumn」とするのが一般的？
　あといっぱい追加するときはどうするんだろう？
　(4つぐらいカラム追加したときのメソッドがカオス)
　なんて疑問は残しつつ。

#####AddColumn自動化コマンド
```lang:これで自動的にソース生成してくれる
bundle exec rails generate migration Add[カラム名]To[テーブル名] [カラム名]:[型]
```
[Add[カラム名]To[テーブル名]の例]
あるテーブル(TestTables)
+ カラム(test_column)追加:AddTestColumnToTestTables
***

###マイグレーションファイル編集
マイグレーションファイルを編集する。
upメソッドに今回実施したい内容、
downメソッドにそれを打ち消す内容を記載する。
記載の仕方は[リファレンス](http://railsdoc.com/migration )参照。

主に迷うポイントは下記。
+ t.timestampsってなんだよ<br> ⇒create_at、updated_atを作成
+ lock_versionってどうすんだよ<br> ⇒t.integer :lock_version, :default => 0

***

###マイグレーションを試す

開発環境で試す。目的としては本番環境で問題なく動作することを確認しておきたい。
できればこの時点でデータバックアップを取得しておき、いつでも戻せるようにする。

```lang:migrateする
bundle exec rake db:migrate
```
```lang:rollbackする
bundle exec rake db:rollback
```

※rollbackは1つ前にしか戻れないので、複数マイグレーションファイルがある場合は注意！
ファイル数分rollbackするか、downメソッドで試すこと。
但し、schema_migrationsテーブルはmigrateコマンド実施前に戻る模様。

⇒この時点でバックアップを取得していた場合、一旦リストアして本当に戻るか確認する。

```lang:migrateする
bundle exec rake db:migrate
```
　
一旦rollbackしてdownメソッドが正常動作することを確認する。

この時点で全ての環境(test、production)には反映せず、マイグレーションファイルが確定した時点で他の環境に反映する。
(何回もマイグレートするのがかったるいから、なるべく確定後反映が望ましい気がする。)
　

```lang:反映時のコマンド
bundle exec rake db:migrate RAILS_ENV=test
bundle exec rake db:migrate RAILS_ENV=production
```


***

###マイグレーションを消す

作ったけどいらなくなったマイグレーションファイルを消したいとき。
うっかり消して整合性取れなくなってもやだなーみたいな。


```lang:削除コマンド
bundle exec rails destroy migration [作ったファイルのクラス名]
```

###もしもうっかりrmしてしまった場合
[参考]
[railsのrakeのmigrationファイルを削除しNO FILEとstatusに出た時の対処](http://joppot.info/2014/10/16/2104)

***

###マイグレーションの履歴を確認する

履歴見れたら便利だよね。
そういうの戻れたらいいよね。みたいな。


```lang:履歴コマンド
bundle exec rake db:migrate:status
```
※ついでに | grep なんか使うともっと効率的に探せる。


```lang:今のバージョンを確認
bundle exec rake db:version
```

***

###マイグレーションファイルのup/downを動かす

昔作ったカラムやテーブルがやっぱりいらなくなった。
前に作ったマイグレーションファイルのdownを使いたい。とか。
rollbackじゃなくてupメソッドだけ使いたい。とか。
そういうとき。

```lang:upしたい
bundle exec rake db:migrate:up VERSION=[バージョン番号]
```

```lang:downしたい
bundle exec rake db:migrate:down VERSION=[バージョン番号]
```

バージョン番号はマイグレーションファイルの先についている数字列。

※ちなみにdestroyしちゃった後、git checkoutして戻したファイルでも問題なく動く。(動いた)

***

###change
add_columnならup/downを自動でやってくれるらしい？
※聞いただけ。未調査＋未実施。
Load database config file from libraries in CodeIgniter

Sometime you will need load database config variables from your libraries.In this case, if you use `$this->_CI->config->load('database')`, you will get an error:

```
$this->_CI = &get_instance();
$this->_CI->config->load('database');
```

The error somthing like `Your application/config/database.php file does not appear to contain a valid configuration array.`

The source is in `system/core/Config.php#138`:

```

// CodeIgniter Version 2.1.4

if ( ! isset($config) OR ! is_array($config))
			{
				if ($fail_gracefully === TRUE)
				{
					return FALSE;
				}
				show_error('Your '.$file_path.' file does not appear to contain a valid configuration array.');
			}

```

You can find that the config will lookup an array with the name `$config`, but in your database's config file it contains array variable with the name `$db` defaultly.This is the reason you got the invalid configuration array error message.

To correctly load database configuration from libraries,you can you code below:

```
$this->_CI->load->database('default');

$db = $this->_CI->db;

Something::config(['driver'=> 'mysql','host'=> $db->hostname,
    'dbname'=> $db->database,
    'user'=> $db->username,
    'password'=> $db->password]);


```

Notice the `default` is the active group in your database configuration file.
Android勉強中に参考になっているもの


##Google公式

- [Android開発者用サイト]
(http://developer.android.com/index.html)

- [Android開発者用サイトAPIリファレンス](http://developer.android.com/reference/packages.html)

- [Material Design]
(http://www.google.com/design/spec/material-design/introduction.html)


## おすすめ本

### AndroidStudioに慣れる
* [かんたん７ステップ　JavaからはじめようAndroidプログラミング]
(http://www.impressjapan.jp/books/3087.php)
著者：大津 真

* [Androidアプリ開発 パーフェクトマスター]
(http://www.shuwasystem.co.jp/products/7980html/4161.html)
著者：金城俊哉

### SDKバージョン違いによる機能の違いを知りたい（上から時系列順）
* [Android Layout Cookbook　アプリの価値を高める開発テクニック]
(http://www.impressjapan.jp/books/2987.php)
著者：あんざいゆき

* [Android UI Cookbook for 4.0　ICS（Ice Cream Sandwich）アプリ開発術]
(http://www.impressjapan.jp/books/3174.php)
著者：あんざいゆき

* [Android Pattern Cookbook マーケットで埋もれないための差別化戦略]
(http://www.impressjapan.jp/books/1113101126)
著者：あんざいゆき


### SDK逆引き
* [改訂2版 Android SDK逆引きハンドブック]
(http://www.c-r.com/book/detail/885)
著者：中西葵、内村祐之、高橋良司


### 知識補強
* [Effective Android]
(http://www.impressjapan.jp/books/1113101088.php)
著者：TechBooster


## 知っ得
* [日本Androidの会]
(https://www.android-group.jp/)

* [日本Androidの会（Q&A)]
(https://groups.google.com/forum/#!forum/android-group-japan)

* [これから仕事でAndroidアプリを開発するための参考書籍]
(http://qiita.com/yanap/items/4480ec48c2d076d6c41a)

* [mixi-inc/AndroidTraining]
(https://github.com/mixi-inc/AndroidTraining)

- [Android 5.0 差分メモ]
(http://nein37.hatenablog.com/entry/2014/10/20/152155)

- [Android™ Drawables]
(http://androiddrawables.com/)

- [android-mvc-framework]
(https://code.google.com/p/android-mvc-framework/)
Salesforce Visualforce で 日本語PDF出力

```xml:apex
```xml
<apex:page 
   renderAs="pdf" 
   controller="PdfController" 
   showHeader="false" 
   sidebar="false" 
   action="{!init}" 
   applyBodyTag="false" 
   applyHtmlTag="false">
<html>
    <head>
        <style>
@page { 
    size: 8.27in 11.69in;
    margin: 10px; 
} 
body {
    font-family: 'Arial Unicode MS';
}
        </style>
    </head>
    <body>
        <!-- ここに表示内容 -->
    </body>
</html>    
</apex:page>
```
Appleが2015年2月1日から新規アプリ及びアプリのアップデートは64ビットをサポートしiOS8SDKで開発されたアプリのみ申請受付と発表


![64-bit_and_iOS_8_Requirements_for_New_Apps_-_News_and_Updates_-_Apple_Developer.jpg](https://qiita-image-store.s3.amazonaws.com/0/4943/1a1ada3d-f4b4-6326-a18d-33df6f25d217.jpeg "64-bit_and_iOS_8_Requirements_for_New_Apps_-_News_and_Updates_-_Apple_Developer.jpg")


アプリの開発はXcode6が必須になりますね。

# 64-bit and iOS 8 Requirements for New Apps

>October 20, 2014
>
Starting February 1, 2015, new iOS apps uploaded to the App Store must include 64-bit support and be built with the iOS 8 SDK, included in Xcode 6 or later. To enable 64-bit in your project, we recommend using the default Xcode build setting of “Standard architectures” to build a single binary with both 32-bit and 64-bit code.


https://developer.apple.com/news/?id=10202014a

## 追記：2014年10月25日

"新規アプリは"と記述してましたが Dev ForumsでAppleへの問合せの結果、更新も含む報告があったので訂正いたしました。
https://devforums.apple.com/message/1062587
outlook のVBAで日報提出

http://www.ken3.org/cgi-bin/group/vba_outlook.asp

ここは役に立つかな？

http://outlooklab.wordpress.com/2011/07/09/outlook-%E3%81%AE%E4%BA%88%E5%AE%9A%E8%A1%A8%E3%82%92-csv-%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E3%83%9E%E3%82%AF-2/

ここは役に立つかも。
PyCharm で Vagrant の共有フォルダに入れている Django プロジェクトをデバッグ実行


# 前提

環境

- Mac OS X 10.10
- PyCharm 3.4.1
- Vagrant 1.6.5
- VirtualBox 4.3.16

  ちなみに Vagrant の box は `ubuntu/trusty64`。pyvenv-3.4 で仮想環境作成

- ローカルのDjangoプロジェクトのパス
  `/Users/taro/git/my_django_project`

- ローカルのvirtualenv
  `/Users/taro/.virtualenvs/my_django_project_env`

- ローカルのVagrantfile
  `/Users/taro/git/my_django_project/Vagrantfile`

- VagrantのDjangoプロジェクトのパス(**共有フォルダなので中身は一番上の my_django_project**)
  `/vagrant_data`

- Vagrantfileにはこれ書いてupしておく

```Vagrantfile
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.synced_folder "/Users/taro/git/my_django_project", "/vagrant_data"
```

- Vagrantの方でどこかにvirtualenv作って`pip install`とかしておく。パスは仮に
  `/venv` 


# PyCharmで設定

## リモートPythonインタプリタ追加
`Preferences > Project Interpreter > 歯車ボタンのAdd Remote` で

ラジオは Vagrant を選択

Vagrant Instance Folder: `/Users/taro/git/my_django_project` (Vagrantfileあるとこ。今の前提ではDjangoのプロジェクトの中にあるのでここを指定している)
Python interpreter path: `/venv/bin/python`

## Run/Debug Configuration

Django server で設定

Host: `192.168.33.10`
Port: てきとう
Python interpreter: 上で追加したインタプリタ
Working directory: `/vagrant_data`
Path mappings:

  * `/Users/taro/git/my_django_project=/vagrant_data`
  * `/Users/taro/.virtualenvs/my_django_project_env=/venv`

設定できたらOKしてブレイクポイント指定していつものように虫ボタンでデバッグ開始。ブレイクポイントでちゃんと止まって変数の中身とか見えたらOK。ローカルにファイルが存在しないって言われたら Path mappings の設定を見直す。

# 注意
- なんか設定後、色々読み込んだりして時間がかかることもあるので落ち着いて待つ
- 最初、StackOverflow を適当に読んで pydevd の egg コピーしたり manage.py にその import 書くってやつをやったけどそれは必要なかった
Instagram APIから画像データ取得のメモ

InstagramのAPIは知っていたのですが、自分自身の投稿した画像データを取得する方法をやったことがなかったので、実践してみました。

今更ですが、よく使うと思うのでメモしておきます。

# アプリケーションの登録

![01.png](https://qiita-image-store.s3.amazonaws.com/0/34020/8f9b3526-2a60-621f-6e14-5aef8093bfbe.png)

自分のInstagramアカウントでログイン
アプリケーションの登録を行う。


* Applictaiton Nameは、登録するアプリケーション名を入力
* Dscriptionは、用途などを入力
* Websiteは、自分のサイト情報を入力
* OAuth redirect_uriは、アクセストークンを取得する際にリダイレクトされるURL（自分はサイトURLを入力しました）

# アクセストークンの取得

アプリケーションを登録したら、クライアントIDを取得することができます。

![03.png](https://qiita-image-store.s3.amazonaws.com/0/34020/1065a3b1-485d-e57c-1f87-b6e618432b8a.png)

```
https://instagram.com/oauth/authorize/?client_id=【CLIENT-ID】&redirect_uri=【REDIRECT-URI】&response_type=token
```

* 【CLIENT-ID】は、取得したクライアントIDを入力
* 【REDIRECT-URI】は、先ほど登録したリダイレクトURLを入力

上記のアドレスをブラウザで叩くと、アクセストークンが返ってくる
\#access_token=のコードが必要なので、メモしておきます。

```
http://hogehoge.com/#access_token=************************
```

# 取得したデータをウェブサイトで表示させる

取得したJSONデータから、WEBサイトに表示させる。
参考サイトのサンプルコードですが、どのようにデータを取得し表示するか次第ですが、案件ごとにカスタマイズができそうですね。

``` instagram.js
$(function() {
  $(".instagram").text("loading...");
    $.ajax({
      url: "https://api.instagram.com/v1/users/self/media/recent",
      data: { access_token: "【ブラウザで叩いて返ってきたコードを入力】" },
      dataType: "jsonp",
      error: function(jqXHR, textStatus, errorThrown) {
        $(".instagram").text(textStatus);
      },
      success: function(data, textStatus, jqXHR) {
        $(".instagram").text("");
        for (var i = 0, length = 5; i < length; i++) {
          var d = data.data[i];
          $(".instagram").append(
          $("<div>").addClass("image").append($("<a>").attr("href", d.link).attr("target", "_blank").append($("<img>").attr("src", d.images.thumbnail.url))));}
        }
    });
});
```

``` gallery.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>フォトギャラリー</title>
</head>
<body>
<div class="instagram"></div>
<script src="http://code.jquery.com/jquery.js"></script>
<script src="instagram.js"></script>
</body>
</html>
```

* jQueryバージョン：1.11.1

# 参考サイト

* [InstagramのAPIを使ってみる #2](http://blog.5ive.info/archives/1261)
* [instagramをjQueryで使う](https://sites.google.com/site/jqueryjavascript/instagramwojqueryde-shiu)
* [Instagram APIから画像データを取得する](http://fr-br.com/web/2012/30.html)
[MongoDB] CentOS6.4でmongo 2.6.5 を使ったらエラーが出過ぎたので、2.6.4に変更した際のメモ

# 現状

mongodb 2.6.5 を使っていたらエラーが多く、対応がいちいち面倒臭かったので、2.6.4にバージョンを下げました。

## エラー例

```rb
$ mongo
Failed global initialization: BadValue Invalid or no user locale set. Please ensure LANG and/or LC_* environment variables are set correctly.
```

↓のようにすれば一応shellから使える様になるが、めんどくさい。

```rb
$ export LC_ALL=C
```

# yum でインストールしたmongoのパッケージをチェックする

```rb
$ yum list installed | grep mongo
mongodb-org-mongos.x86_64
mongodb-org-server.x86_64
mongodb-org-shell.x86_64
mongodb-org-tools.x86_64
```

# yumでパッケージをアンインストール

上記パッケージをアンインストール。

```rb
$ sudo yum erase mongodb-org-mongos.x86_64 mongodb-org-mongos.x86_64 mongodb-org-server.x86_64 mongodb-org-shell.x86_64 mongodb-org-tools.x86_64
```

こんな感じでもアンインストールできる。（曖昧）

```rb
$ sudo yum erase mongo-10gen mongo-10gen-server mongo-10gen-shell mongo-10gen-tools
```

## アンインストールできたかチェック

何にも表示されなかったらOK.

```rb
$ yum list installed | grep mongo
```

コマンドを叩いてチェック。

```rb
$ mongo
zsh: command not found: mongo
```

# mongo 2.6.4 をインストール

```rb
$ sudo yum install -y mongodb-org-2.6.4 mongodb-org-server-2.6.4 mongodb-org-shell-2.6.4 mongodb-org-mongos-2.6.4 mongodb-org-tools-2.6.4 --enablerepo=10gen
```

[レポジトリに関してはこの辺を参考に](http://qiita.com/tsumekoara/items/5c3596872c9578e760ea)

# チェック

## mongodbのバージョンチェック。

```rb
$ mongod -version
db version v2.6.4
```

## mongo shellのバージョンチェック。

```rb
$ mongo
MongoDB shell version: 2.6.4
connecting to: test
```

# 参考

http://stackoverflow.com/questions/8766579/uninstalling-mongo
Ruby-Processingのインストール方法

## はじめに

[Processing](https://processing.org/) をRubyでラップした [Ruby-Processing](https://github.com/jashkenas/ruby-processing) というライブラリがある。
Rubyによる簡潔な表現で記述できるため生産性が高まるし書いていて楽しい。

ここではMacにRuby-Processingを導入する方法を紹介する。
基本的には本家の[wiki](https://github.com/jashkenas/ruby-processing/wiki/Getting-Started)に書いてあることの翻訳です。

## Ruby-processingのインストール手順

1. （大多数の人はすでにインストール済みだと思いますが）homebrew, wget, rbenv をインストールする。
1. Oracleのjavaを入れる
  - jrubyとruby-processingを実行するのに必要とのこと。
  - http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html
      - ページ上部の"Java SE Downloads"にある大きなアイコンをクリックしてインストーラ（"Java SE Development Kit 8u25"みたいなやつ）をダウンロードする
1. processingをインストールする
  - https://www.processing.org/download/?processing からダウンロード
  - Processingアプリケーション（アイコン）を自分のアプリケーションフォルダへ移動させればOK
1. jrubyをインストールする
  - `rbenv install jruby-1.7.13`
1. jruby用のディレクトリを作る
  - 例
     - `mkdir jruby-dev` （ディレクトリ名は任意）
     - `cd jruby-dev`
     - `rbenv local jruby-1.7.13`
     - `ruby -v` で `jruby 1.7.13 (1.9.3p392)` になっていることを確認
1. ruby-processingのインストール
  - `gem install ruby-processing && rbenv rehash` を実行
1. `~/.rp5rc` の作成と編集
  - 本家のwikiページには https://gist.github.com/monkstone/7438749 をProcessingで実行すればよいと書いてあるが、うまくrp5rcを作ってくれなかった。
      - ちなみにp5というのはProcessingの通称みたいなものらしい。昔processingのドメインが取れなかった時に、proce55ingというドメインを使っていたのが名前の由来とか。rp5はruby-processingのこと。
  - `touch ~/.rp5rc` でファイル作成後、以下のように手動で編集する。

      ```yaml:.rp5rc
      PROCESSING_ROOT: "/Applications/Processing.app/Contents/Java"
      JRUBY: 'true'
      ```

1. jruby-complete をインストールする。（jruby-completeってなんなのかよくわかってない...）
  - `rp5 setup install`
1. sampleを展開する
  - `rp5 setup unpack_samples`
1. sampleを実行してみる
  - `cd rp_samples && rake`
  - 次々にサンプルが実行されるはず
      - サンプルの終了は Command+Q 
      - いくつかうまく実行されないものもあるかも。レインボーマークがぐるぐるし続けるサンプルはCommand-Qで終了させる
      - サンプルの数が多いので、途中で終わらせたいときはコンソール上で Ctrl-C する
1. サンプルがうまく動けば完了です！

## 自作のプログラムを動かしてみる

- スクリプトのひな形を作る
  - `rp5 create my_sketch 800 600` を実行。`my_sketch.rb` が作られる。（もしくは `rp5 create my_sketch 800 600 --wrap` でもよい。）

```ruby:my_sketch.rb
def setup
  size 800 600
end

def draw

end
```

- この `setup` と `draw` メソッドを実装していくのが、Ruby-Processingプログラムの基本
- 以下のページに振り子のサンプルプログラムがあるので、今回はこれをコピー＆ペーストする
  - https://gist.github.com/ymurase/aec532a82f5862170356 
- 実行するときには `rp5 run my_sketch.rb` を実行する
  - 普通のRubyスクリプトに比べるとだいぶ起動が遅いかも。jvmの起動に時間がかかっているから？
- ウインドウ内で振り子が動けばOK！

## ProcessingプログラミングのTips、注意点等

- `setup` と `draw` という二つの関数を実装するのがProcessingの基本仕様
  - アプリの起動時に `setup` メソッドが呼ばれて、各フレームごとに `draw` メソッドが呼ばれる。
- Processingの関数は snake_case に変換して呼び出すことができる
  - 例えば Processing の `frameRate()` という関数は、Rubyからだと `frame_rate` で呼ぶことができる。（この関数名のマッピングはjrubyの機能）
- 自作のクラスの中でProcessingのAPIを呼ぶ場合は、`$app` というグローバル変数を経由して実行する
  - 例えば幅を取得したい場合は、`$app.width`とする。
- スクリプトを編集するたびに `rp5 run` を実行していると時間がかかりすぎるので `rp5 watch` コマンドを使うと良い
  - スクリプトの変更を監視して、スクリプトが変更されるたびにアプリを起動し直す
  - `rp5 watch my_sketch.rb` を実行しておきながら、`my_sketch.rb` を編集するのが良い
- ProcessingのAPIはこちらのページで参照できる
  - https://processing.org/reference/

## 参考
- https://github.com/jashkenas/ruby-processing/wiki/Installing-ruby-processing-on-the-mac
- http://hoshi-sano.hatenablog.com/entry/2013/12/24/235254
[解決] YosemiteでApacheの〜(チルダ)指定が動かなくなる。


Yosemiteにアップグレードすると、Apacheの設定が若干変更されている。特に困ったのが `userdir` の設定がはずれていて、~(チルダ)でのユーザサイトにアクセスできなくなっている。

次のように解決できたのでメモ。

```/etc/apache2/httpd.conf
# 166行目付近 コメントを外す
LoadModule userdir_module libexec/apache2/mod_userdir.so
# 492行目付近 コメントを外す
Include /private/etc/apache2/extra/httpd-userdir.conf
```

次に確認するのが、下記のファイル。`users`の下を読み込むようになっていれば正解。

```/etc/apache2/extra/httpd-userdir.conf
UserDir enabled
UserDir Sites
Include /private/etc/apache2/users/*.conf
<IfModule bonjour_module>
       RegisterUserSite customized-users
</IfModule>
```

最後に、usersの下のファイルを修正。`username`ところは、それぞれで変更。

```/etc/apache2/users/username.conf
<Directory /Users/*/Sites>
 DirectoryIndex index.html index.php
 AllowOverride All
 Options All
 Require all granted
</Directory>
```

Apacheが2.4系になっているので、allow,deny の記述方法が変わってるので注意。上の例は何でもありの設定なので、適宜変更した方が良い。

最後に httpd リスタート

```bash
apachectl -t
sudo apachectl restart
```

パーミッションの問題が出るならば、自分のディレクトリのパーミッションとかを確認。
[Swift]文字列のURLエンコーディングを行う

クエリを含むURLを作成したいとする。そのためにはURLエンコーディングを行う必要がある。

```swift
let query: String = "じばにゃん"
let encodedQuery: String = query.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!

println(encodedQuery)
//%E3%81%98%E3%81%B0%E3%81%AB%E3%82%83%E3%82%93
```

「じばにゃん」を無事エンコーディングできた。
centos6でpython2.6のssl3プロトコルを使用禁止にする

なぜ禁止する必要があるのかは、SSL POODLEを検索してみるといいです。
サーバからsslv23をtlsv1に置換すると、まだsslv23を使っているクライアントが接続できなくなりますので、
ここはpython自体にパッチを当てる必要があります。

### ステップ１
python2.6のソースパッケージをダウンロードおよび解凍

```
wget http://vault.centos.org/6.5/updates/Source/SPackages/python-2.6.6-52.el6.src.rpm
mkdir -p ~/rpmbuild/SOURCES
cd ~/rpmbuild/SOURCES
wget http://vault.centos.org/6.5/updates/Source/SPackages/python-2.6.6-52.el6.src.rpm
rpm2cpio python-2.6.6-52.el6.src.rpm | cpio -idmv
```


### ステップ２
パッチを当てる

```diff:disable-ssl3.patch
--- /dev/null
+++ b/SOURCES/python-2.6-disable-ssl3.patch
@@ -0,0 +1,17 @@
+--- Python-2.6.6.orig/Modules/_ssl.c
++++ Python-2.6.6/Modules/_ssl.c
+@@ -359,7 +386,12 @@ newPySSLObject(PySocketSockObject *Sock, char *key_file, char *cert_file,
+     }
+ 
+     /* ssl compatibility */
+-    SSL_CTX_set_options(self->ctx, SSL_OP_ALL);
++    long options = SSL_OP_ALL;
++    if (proto_version != PY_SSL_VERSION_SSL2)
++        options |= SSL_OP_NO_SSLv2;
++    if (proto_version != PY_SSL_VERSION_SSL3)
++        options |= SSL_OP_NO_SSLv3;
++    SSL_CTX_set_options(self->ctx, options);
+ 
+     verification_mode = SSL_VERIFY_NONE;
+     if (certreq == PY_SSL_CERT_OPTIONAL)
+
--- a/SOURCES.bak/python.spec
+++ b/SOURCES/python.spec
@@ -47,7 +47,7 @@
 Summary: An interpreted, interactive, object-oriented programming language
 Name: %{python}
 Version: 2.6.6
-Release: 52%{?dist}
+Release: 52%{?dist}_1
 License: Python
 Group: Development/Languages
 Provides: python-abi = %{pybasever}
@@ -453,6 +453,7 @@ Patch171: python-2.6.6-CVE-2013-4238-hostname-check-bypass-in-SSL-module.patch
 # (rhbz#1002983)
 Patch172: python-2.6.6-ssl-memory-leak-_get_peer_alt_names.patch
 
+Patch10000: python-2.6-disable-ssl3.patch
 
 # The core python package contains just the executable and manpages; most of
 # the content is now in the -libs subpackage.
@@ -790,6 +791,8 @@ mv Modules/cryptmodule.c Modules/_cryptmodule.c
 
 %patch172 -p1
 
+%patch10000 -p1
+
 # Don't build these crypto algorithms; instead rely on _hashlib and OpenSSL:
 for f in md5module.c md5.c shamodule.c sha256module.c sha512module.c; do
     rm Modules/$f
```

このファイルを~/に置いたあとこのコマンドを実行します

```
patch < ~/disable-ssl3.patch
```

### ステップ３
リビルトを行う

```
rpmbuild -ba python.spec
```

最後にできたrpmをインストールすればいいです。

### ssl3の使用が実際に禁止されたかどうかのテスト

```
openssl s_client -connect ip:port -ssl3
```

errorとかでハンドシェイクが失敗したら成功になります。
Linuxでファイルのパーミッションをコピーする方法

コピー元ファイルを file1 、コピー先ファイルを file2 とした時、
`chmod --reference file1 file2`
とします。  
  
2つののディレクトリ配下のすべてのファイルのパーミッションを合わせたい場合は、以下のようにします。
コピー元のディレクトリを dir1 、コピー先のディレクトリを dir2 として、dir1 に移動した状態で、以下を実行します。
`find . -type f | xargs -I {} chmod --reference {} ../dir2/{}`  

参考）
[Copy file permissions, but not files](http://stackoverflow.com/questions/15245144/copy-file-permissions-but-not-files)
GoをOSXにインストールする

# GoをOSXにインストール

Goの[ダウンロードページ](https://golang.org/dl/)からインストーラーをダウンロードします。

僕の環境はOS 10.8以上の64bitなので、go1.3.3.darwin-amd64-osx10.8.pkgをダウンロードしました。

ダウンロードしたインストーラーを実行して、手順にしたがってインストールを進めていきます。

インストールが完了すると、/usr/local/go ディレクトリ以下にgoのtoolが設置されています。

````
$ ls /usr/local/go
AUTHORS      LICENSE      README       api          blog         favicon.ico  lib          pkg          src
CONTRIBUTORS PATENTS      VERSION      bin          doc          include      misc         robots.txt   test

````

# PATHにGOを追加する

go コマンドを実行出来るようにPATHに /usr/local/go/bin を追加します。

僕はzshを使っているので、~/.zshrcに以下のように記述しました。

````.zshrc
export PATH="/usr/local/go/bin:$PATH"

````

shellで以下のコマンドを実行できればインストール成功です。

````
$ go version
go version go1.3.3 darwin/amd64
````


# GoでHelloWorld

hello.goに以下のように記述します。

````golang:hello.go
package main

import "fmt"

func main(){
     fmt.Printf("hello, world\n")
}
````

そして以下のようにコマンドで実行します。

````
$ go run hello.go
hello, world

````



参考URL
https://golang.org/doc/install
herokuでmatplotlibを動かす方法

# 簡単な方法

```
pip install matplotlib==1.1.1
pip freeze > requirements.txt
git commit requirements.txt -m "matplotlib"
```

# 解説

* matplotlib-1.4.1はpytz.tzinfoがおかしくなる（なぜかpandasのエラーとして報告されるので、pandasと共存してなければ使えるかも？）
* matplotlib-1.4.0はFreeTypeの2.5.0をなぜか2.3.0と認識して、Requirementsを満たさないとして失敗する
* matplotlib-1.3.1も同様
* matplotlib-1.1.1までさかのぼればOK
蓄積したブラウザ三国志データを使ったMongoDB アグリゲーション2例

[前回の記事](http://qiita.com/AsO@github/items/cc4cca4091164e4749d5)で作っているブラウザ三国志の地図情報データベースを mongoで集計してみます。

さて、ブラウザ三国志。2次元平面上でゲームが展開されてます。
新仕様のサーバでは フィールドサイズ1601*1601、座標表現では(±800,±800)。
以前は(±600,±600)でしたが、今年になって拡大されました。

mongoDB側には、この2563201マスそれぞれに対応しているレコードがあります。

## 土地タイプ集計
ブラウザ三国志では各マス(土地)の状態が各種あります。
城(ユーザ本拠)、村、砦、領地、NPC砦、空き地 です。
これをタイプ別に集計してみます。

```bash:mongo
> db.lands.aggregate([{$group:{_id: "$type", count:{$sum: 1 }}}]);
{ "_id" : "castle", "count" : 18428 }
{ "_id" : "village", "count" : 27460 }
{ "_id" : "fort", "count" : 11329 }
{ "_id" : "territory", "count" : 397602 }
{ "_id" : "npc_fort", "count" : 2653 }
{ "_id" : "vacant_land", "count" : 2105729 }
```
2014/10/20 11時にこの集計を行いました。
2105729+2653+397602+11329+27460+18428=2563201  という事で、レコード数も一致してます。

`castle`(城)は参加ユーザ各自に1つずつ割り当てられていますので、すなわちこれがユーザ数です。ゲーム内のランキングページ(2014/10/20 09:00集計)では 18423と表示されていますので、小一時間で5名増えたという事でしょう。

`vacant_land`が空き地で、全体の82%が未開拓という事です。プロットした図の印象よりもずっと空き地が多い様に感じます。

ゲーム開始でユーザは、城隣接の土地を攻撃して領地(`territory`)にし、さらにまた隣接地を手に入れてゆくという遠征スタイルで、各地に点在するNPC砦に隣接し、攻城・制圧する事で資源ボーナスを手に入れたりをします。

NPC砦はゲーム開始時から既に存在し、2653個固定です。

NPC砦を攻撃したり、ユーザ(君主)が寄合って作る 同盟 間の戦争等では敵地に拠点(Fort)を作り造兵したり、安全な場所で資源村(Village)を作ったり壊したりします。
拠点が38789個。ユーザあたりでは2.1個持っているという事になりますが、本拠地しか持っていない = アクティブではない君主も多いので平均2.1というのは当てになりません。

## 所有拠点数集計
という事で、拠点を持っている君主(ユーザ)はどのくらいいるのかを調べます。
拠点は上記の通り`fort`か`village`なので、まず全レコードで土地タイプが該当するものを`$match`で抽出し、これを`username`毎に`$group`集計してユーザ毎の拠点数`count`を得、さらにその`count`毎にユーザ数を集計したものが以下です。

```bash:mongo
> db.lands.aggregate([{$match:{$or:[{type:"village"},{type:"fort"}]}},{$group:{_id: "$username", count:{$sum: 1 }}},{$group:{_id:"$count", users:{$sum:1}}}]);
{ "_id" : 1, "users" : 862 }
{ "_id" : 3, "users" : 1230 }
{ "_id" : 4, "users" : 3232 }
{ "_id" : 2, "users" : 857 }
{ "_id" : 6, "users" : 205 }
{ "_id" : 7, "users" : 169 }
{ "_id" : 8, "users" : 299 }
{ "_id" : 5, "users" : 1762 }
{ "_id" : 9, "users" : 718 }
```
`$sort`してませんが…。`_id`が拠点数、`users`が該当ユーザ数です。

全ユーザ数18428 のうち、拠点数 1から最大所有可能数 9までのユーザは9334名居ました。
残りの9094名は本拠城だけで拠点を持たない、おそらく非アクティブな放置ユーザが大多数と、最近入ったばかりで拠点を作れるレベルに達していないユーザが少数含まれると考えられます。ほぼ半数が放置ユーザという事でしょう。もしかしたらコレクションしている武将カードを、毎日3回行われているデュエルという武闘会で鍛えるだけの遊び方をしているのかもしれませんが。

多数派は拠点数4ですので、一般的な遊び方だとゲームスタートの9月4日から7週間程で作れるのが拠点4個という感じだと思います。

…という風に使えます。インデックス無しで素の集計をすると時間が掛るので、頻繁に集計値を利用する場合はインデックスを作るなどした方が良いでしょう。