OmniAICreator/Qiita-1.07M huggingface dataset:
./activator eclipse でエラーしたとき

少し引っかかったのでメモ
eclipse用プロジェクトにする時

```shell-session
>>> activator eclipse
[info] Loading project definition from /path/to/project
[info] Updating {file:/path/to/project/}playapp-build...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Set current project to playapp (in build file:/path/to/project/)
[error] Not a valid command: eclipse (similar: help, alias)
[error] Not a valid project ID: eclipse
[error] Expected ':' (if selecting a configuration)
[error] Not a valid key: eclipse (similar: deliver, licenses, clean)
[error] eclipse
[error]        ^
```

なんでだ？
プロジェクトを作成するときのテンプレート指定が間違っていたようだ
minimal-java だとダメっぽい

```shell-session
>>> activator new playapp

Fetching the latest list of templates...

Browse the list of templates: http://typesafe.com/activator/templates
Choose from these featured templates or enter a template name:
  1) minimal-akka-java-seed
  2) minimal-akka-scala-seed
  3) minimal-java
  4) minimal-scala
  5) play-java
  6) play-scala
(hit tab to see a list of all templates)
> 5
OK, application "playapp" is being created using the "play-java" template.
```

こちら(minimalじゃない奴)を選択したらうまく行った
Ansibleでよく使ってるタスクとかちょっとしたTips

Ansibleで少し調べないとわかんない事とか、普段よく使うのとかをなんとなく書いてみる。

Ansibleは入門程度の知識でも、かなり効果あると思うのでおすすめです。大規模の場合でもロールや冪等性、Gathering Factsの内容活用するとか少し気にするだけじゃないでしょうか。

# タスク

Ansibleのタスクはたくさんあり、サーバ構築に関わる大半の作業が網羅されているが、ミドルウェアのインストールまではインフラ担当が行う事が多いので、自分が実際良く使うのは数種類。

## テンプレートからファイルを生成する

設定ファイルの生成とか。srcに指定したファイルに変数埋め込むと、タスク実行に展開してくれる。backupをyesにすると、バックアップを取ってくれる。

```
# Example from Ansible Playbooks
- template: src=/mytemplates/foo.j2 dest=/etc/file.conf owner=bin group=wheel mode=0644
```

[http://docs.ansible.com/template_module.html:title]

## ディレクトリやシンボリックンクを作成する

stateをdirectoryやlinkにすることで、作成するものを変えられる。

```
- file: src=/file/to/link/to dest=/path/to/symlink owner=foo group=foo state=link
```

[http://docs.ansible.com/file_module.html:title]

## シェルやコマンドを実行する

シェルやコマンド実行は、commandやscriptでもできるが挙動やできることが微妙に違う。私はshellを使うことが多い。

```
# You can also use the 'args' form to provide the options. This command
# will change the working directory to somedir/ and will only run when
# somedir/somelog.txt doesn't exist.
- shell: somescript.sh >> somelog.txt
  args:
    chdir: somedir/
```

[http://docs.ansible.com/shell_module.html:title]

## 圧縮ファイルを解凍する

これはタイトルのまま。.tar.gzの解凍とか。

```
# Example from Ansible Playbooks
- unarchive: src=foo.tgz dest=/var/lib/foo
```

[http://docs.ansible.com/unarchive_module.html:title]

# 実行オプション

Ansibleではplaybook実行時、オプションを指定することで実行内容が変わる。

## タスクを部分的に実行する

タスクにタグを付け、オプションでタグを指定する。タスクのまとまり毎に同じタグを付ける感じ。

タスク

```
tasks:

    - yum: name={{ item }} state=installed
      with_items:
         - httpd
         - memcached
      tags:
         - packages

    - template: src=templates/src.j2 dest=/etc/foo.conf
      tags:
         - configuration
```

タグを指定して実行

```
ansible-playbook example.yml --tags "configuration,packages"
```

[http://docs.ansible.com/playbooks_tags.html:title]

## パスワードを聞く

sshのパスワード聞かない設定できない時とか。playbook実行直後にパスワードを入力する。

```
ansible-playbook example.yml --ask-pass
```

[http://docs.ansible.com/intro_getting_started.html#remote-connection-information:title]

## チェック

playbookを実行せずに、実行したとしたらどんな変更が行われるかチェックする。いわゆるドライラン。playbookの文法チェックとしても使える。

```
ansible-playbook example.yml --check
```

[http://docs.ansible.com/playbooks_checkmode.html:title]


# 変数

Ansibleでは変数を使うことで、playbookのコーディング量を減らせる。Tips的に思いつくのを書く。

## itemをハッシュ風に使う

値をセットでループさせたいときに便利

```
- name: add several users
  user: name={{ item.name }} state=present groups={{ item.groups }}
  with_items:
    - { name: 'testuser1', groups: 'wheel' }
    - { name: 'testuser2', groups: 'root' }
```

[http://docs.ansible.com/playbooks_loops.html#standard-loops:title]

## 対象サーバのホスト名を変数にセットする

inventory_hostnameを使うことで、playbookのhostを変数として使える。

```
{{ inventory_hostname }}
```

[http://docs.ansible.com/playbooks_variables.html#magic-variables-and-how-to-access-information-about-other-hosts:title]
テスト用ダミーデータや例示用ドメインのリンク

自分の備忘録がてら、テスト用ダミーデータ、例示用ドメインやIPアドレス一覧へのリンクを記載しました。

テスト用ダミーデータ一覧
===

テスト用ダミーデータの参考ページです。

日本の全エンジニアに捧ぐ！現在公開されているテスト用ダミーデータ一覧
http://www.find-job.net/startup/dummy-2013

ダミー文章、ダミーデータ、ダミー画像を作ってくれるジェネレータまとめ【WEB制作】
http://matome.naver.jp/odai/2133396164637378001

テスト環境で使用できるクレジットカードの情報
https://webpay.jp/docs/mock_cards

テスト用ダミーデータ生成
http://tm-webtools.com/Tools/TestData

例示用のドメインやIPアドレス一覧
===

RFC 6761(example.com)、RFC 6890(198.51.100.0/24、192.0.2.0/24)等の例示用のドメインやIPアドレスの参考ページです。

文書に記述する際の説明用/例示用のドメイン名、IPアドレス、MACアドレス RFC6890,RFC5737,RFC3849,RFC2606,RFC6761,RFC7042 IANAなどなど
http://kana.me/entry/18

http://tools.ietf.org/html/rfc6890
http://tools.ietf.org/html/rfc6761
循環複雑度を測定してくれるツールを作りました #Golang


# 背景
僕はGoを書く前はPythonを書いていました。
Pythonにはflake8という色々便利なやつがいて、自分のコードがPython界の流儀に従っているかチェックしてくれます。
Goだとgofmtとかがほぼ同等の機能を提供してくれています。

ですが、flake8にあってgofmtにないもの。それはコードの循環複雑度を指摘する機能です。

[循環複雑度とは](http://ja.wikipedia.org/wiki/%E5%BE%AA%E7%92%B0%E7%9A%84%E8%A4%87%E9%9B%91%E5%BA%A6)

これがあるとついつい長く書いてしまった関数なんかを洗い出してリファクタするための手がかりになったりします。
これをGoで使うためにGoで書きました。

すでにあるかどうかは知りません。

# 使い方
[リポジトリ](https://github.com/knsh14/go-cyclomatic-complexity)

ビルドしてパスの通った場所に配置して実行すると

```
(go:go-cyclomatic-complexity) kenshikamata% ./gocc  -path ./complexity
complexity/ast.go :Line 21 func BuildAst is too complex 27 > 12
complexity/ast.go :Line 102 func Attrs is too complex 13 > 12
```

こんな感じで出力してくれます
パラメータは

-limit
	複雑度のしきい値。デフォルトは12

-path
	調べるコードがあるディレクトリのパス。デフォルトはカレントディレクトリ

こんな感じです

# 感想
これを作成するにあたって、標準パッケージのASTライブラリを利用したのですが、どうにもこうにも使い勝手がわからなくて以下の記事とコードを参考にしました。
とてもわかり易かったです。ありがとうございました。
http://yuroyoro.hatenablog.com/entry/2014/06/30/220356
https://github.com/yuroyoro/goast-viewer

初めてGoでまともにツールを作ってみたのですが、すごく簡単に書けていい感じだなーって思いました。

ロジックをかなりゴリゴリ書いてしまったり、ツールの名前がイケてなかったりと色々修正点があるので今後直していく予定です。
Linux - シェルスクリプトメモ

業務中に書いたシェルスクリプトの中で、役にたちそうなものをメモしておきます。
今後も適宜追記していきたいと思います。
（CentOS 6.5で動作確認を行っています）

***
### テキストファイルに記載された大量のコマンドを並列で実行する
例えば以下のように、テキストファイル（ここではcommand.sh）の1行1行に同様の処理が数万回記載されているとします。

```command.sh
echo "hoge"; echo "foo"; echo "bar"
×10000
```
※ここでは説明を簡単にするためにechoコマンドを使っていますが、実際にはより複雑な処理を想定しています。

このまま
```sh command.sh```
と実行すると、1行ずつ直列的に処理されていくため、場合によってはものすごく時間がかかってしまう可能性があります。

しかし以下のやり方であれば、並列で処理が実行され、かなりのスピードアップが期待できます。
```cat command.sh | xargs -P4 -i sh -c '{}'```

※xargsの-PにはCPUのコア数、ロードアベレージ等の状況に応じて、適切な値を設定します。

***
### ディレクトリAにある、名前が"hoge_"で始まるCSVファイルをディレクトリBへコピーする
よくありがちなfindとcpを組み合わせたものですが、業務で頻出のパターンなのでメモしておきます。

```find /usr/local/A -name "hoge_*.csv" | xargs -i cp {} /usr/local/B ```
小さなお友だちの為の　MacOsXでBASIC #1


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

#BASIC
名前は「beginner's all-purpose symbolic instruction code」（「初心者向け汎用記号命令コード」を意味する）の頭字語である。

18歳以上はLinux,Macでc,Javaやりましょう。GCCを使えるようになりましょう。
14歳から18歳はOS問わず、IDEを使って、言語は何でもいい。
10歳から14歳は lua or BASIC おまけでscratch
10歳未満はコンピュータなんかやらんで良し。言語能力、身体能力を鍛えましょう。

#Mac向けBASIC
作者に感謝。
http://www.vector.co.jp/soft/mac/prog/se437389.html
![スクリーンショット 2015-02-01 1.30.56.png](https://qiita-image-store.s3.amazonaws.com/0/33317/2cbfcfe7-a779-4a0e-3773-07271582f326.png "スクリーンショット 2015-02-01 1.30.56.png")

##ダウンロード
BASIC0642Ja_Mac.zipを展開するとこんな感じ。
![スクリーンショット 2015-02-01 1.39.22.png](https://qiita-image-store.s3.amazonaws.com/0/33317/5dfc05ca-d7ea-17d1-6e74-3fc4726b5d26.png "スクリーンショット 2015-02-01 1.39.22.png")

##実行
BASIC.appをダブルクリックすると起動します。
で、ちょいとコードを書いてみます。
Runしてみるとこんな感じ。懐かしい。
![スクリーンショット 2015-02-01 1.48.14.png](https://qiita-image-store.s3.amazonaws.com/0/33317/c02e70da-ab05-def5-2b47-2c7b57ddf38b.png "スクリーンショット 2015-02-01 1.48.14.png")
Markdownでスライドを作るためのツールをJavaFXで

Markdown を使ってスライドを作るツールを JavaFX で作った。

![slidedown.JPG](https://qiita-image-store.s3.amazonaws.com/0/28302/c23386d1-a95c-5fe7-e628-935fd487f945.jpeg)

#必要な環境
- Java 8 以上

#インストール
##Zip で落とす
[こちら](https://github.com/opengl-8080/slidedown/blob/master/build/distributions/slidedown.zip) から zip をダウンロードして解凍。

##Gradle でビルドする（要 JDK8）
[こちら](https://github.com/opengl-8080/slidedown) からソース一式を落としてきて、 `gradlew distZip` する。
すると、 `build/distributions` の下に `slidedown.zip` ができあがる。

#使い方
##基本
[File] -> [New] or [Open] で Markdown ファイルを開く。

ウィンドウの左側がエディタで、右側がプレビュー。

エディタには JavaFX の TextArea を使っているが、なんか動きが~~きもい~~。

##Markdown の記法
スライドの作成には [Remark](https://github.com/gnab/remark) というライブラリを使用している。

なので、 Markdown の記法はこの Remark に合わせることになる。

Remark の使い方については [Remark使い方メモ（Markdown でスライドを作るやつ） - Qiita][] を参照のこと。

[Remark使い方メモ（Markdown でスライドを作るやつ） - Qiita]: http://qiita.com/opengl-8080/items/d44aec7c6c643996916b

##CSS エディタ
エディタ部分はタブになっていて、左のタブが Markdown 用のエディタ、右のタブが CSS 用のエディタになっている。

CSS の方で、スタイルの調整をすることができる。

###Markdown と CSS は２つで１セット
このツールでは、 Markdown と CSS のファイルを常に１セットで扱う。

CSS は、 Markdown と同じフォルダにあって、同じ名前（拡張子除く）であることが前提となっている。

もし Markdown を開いたときに、該当する CSS ファイルが存在しない場合は、自動でファイルを生成します。

##スライドの操作
`Alt + PageUp` で前のスライドへ、 `Alt + PageDown` で次のスライドへ移動できる。

プレビューにフォーカスを当ててから、普通に `PageUp` `PageDown` だけで移動することも可能。

##全画面表示
`F11` でスライドの全画面表示を切り替えできる。

##HTML で出力
作成したスライドを、単一の HTML ファイルで出力できる。

[File] -> [Export HTML] を選択し、出力先を指定する。

##縦横比の指定
[Settings] -> [Ratio] で、スライドの縦横比を指定できる（`4:3` or `16:9`）。

デフォルトは `4:3`。

これは Markdown ファイルごとの設定ではなく、グローバルな設定になる。

##エディタのフォント設定
[Settings] -> [Editor] でフォントの設定を変更できる（ファミリとサイズ）。
iptables(v4)初期設定

初期中の初期設定用スクリプト。
とりあえずSSH/NTP/HTTP/HTTPS+αだけ通す感じで。
(作成したスクリプトに実行権限つけるの忘れたらアカンで)

```lang:hoge.sh
#Stop iptables
/etc/rc.d/init.d/iptables stop

#Set default
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

#Set rules
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
iptables -A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 123 -j ACCEPT

#Save rules
/etc/rc.d/init.d/iptables save

#Start iptables
/etc/rc.d/init.d/iptables start
```
GitLab CE OmnibusバンドルのnginxにIPアクセス制限機能を付ける

[GitLab CE Omnibus](https://about.gitlab.com/downloads/)(以下gitlab)にバンドルされているnginxは/etc/gitlab/gitlab.rbファイルで適度にカスタマイズができるようになっていますが、痒いところに手が届かない場合もあります。

例えばIPによるアクセス制限がかけられなかったり。
ということで、成功法ではないと思いますが、IPアクセス制限を仕掛けられるようにちょこっといじってみました。試した環境はCentOS6.6 + GitLab7.7.2です。

gitlab-ctl reconfigureで作成されるnginxの設定ファイル、

* /var/opt/gitlab/nginx/conf/gitlab-http.conf

のテンプレートは、

* /opt/gitlab/embedded/cookbooks/gitlab/templates/default/nginx-gitlab-http.conf.erb

これです。このファイルをエディタで開いて、

```erb
  location / {
    ## Serve static files from defined root folder.
    ## @gitlab is a named location for the upstream fallback, see below.
    try_files $uri $uri/index.html $uri.html @gitlab;
  }
```

このlocationブロックを、

```erb
  location / {
    <% if @ip_access_control %>
      <% @allow_ips.each do |allow_ip| %>
    allow <%= allow_ip %>;
      <% end %>
      <% @deny_ips.each do |deny_ip| %>
    deny <%= deny_ip %>;
      <% end %>
    <% end %>
    ## Serve static files from defined root folder.
    ## @gitlab is a named location for the upstream fallback, see below.
    try_files $uri $uri/index.html $uri.html @gitlab;
  }
```

こんなふうに修正して保存します。
次に/etc/gitlab/gitlab.rbをエディタで開いて、

```rb
nginx['ip_access_control'] = true
nginx['allow_ips'] = ["アクセス許可したいIPその1","アクセス許可したいIPその2" ....]
nginx['deny_ips'] = ["アクセス拒否したいIPその1","アクセス拒否したいIPその2" ....]
```
ip_access_controlをtrueにして、allow_ips、deny_ipsにアクセス許可/拒否したいIPを列挙して保存します。
例えば、

```rb
nginx['ip_access_control'] = true
nginx['allow_ips'] = ["172.16.1.0/24"]
nginx['deny_ips'] = ["all"]
```

こんな設定をしてgitlab-ctl reconfigure && gitlab-ctl restartをすれば172.16.1.0/24からのアクセスを許可し、それ以外は拒否するようになります。

この修正方法でBasic認証も付けられそうな気がします。

GitLab CIを使う場合はそっちのテンプレートもそれ相応に修正すればいいのかもしれません(使ってないのでよくわからないです)。


~~ところでエンタメ系Webサービス開発に興味がある方はぜひ連絡をおねがいｓ(略)~~
UITableViewCellの選択色をStoryboard上で設定する


UITableViewCellの選択色って何気にStoryboard上では設定できませんよね。[Side-Menu.iOS](https://github.com/Yalantis/Side-Menu.iOS)というOSSのソースを読んでいてうまいやり方だなと思ったので紹介します。

# ソースコード

まず、`UITableViewCell`のextensionを作ります。そこで新しい
`@IBInspectable`な`UIColor`のプロパティを宣言して、セッターで`selectedBackgroundView`を書き換えてます。


```swift
import UIKit

extension UITableViewCell {

    @IBInspectable
    var selectedBackgroundColor: UIColor? {
        get {
            return selectedBackgroundView?.backgroundColor
        }
        set(color) {
            let background = UIView()
            background.backgroundColor = color
            selectedBackgroundView = background
        }
    }

}
```

# Storyboard上

Storyboard上では、こんな風にいつものカラーピッカーで変えるだけです。


![スクリーンショット 2015-02-01 0.45.24.png](https://qiita-image-store.s3.amazonaws.com/0/7994/65777d3e-9d8c-8bad-7694-2a42d775e01e.png "スクリーンショット 2015-02-01 0.45.24.png")


# 結果

![スクリーンショット 2015-02-01 0.47.38.png](https://qiita-image-store.s3.amazonaws.com/0/7994/0cd01157-a288-ba32-77de-b7792395be0e.png "スクリーンショット 2015-02-01 0.47.38.png")
Leafletを使ったWebGIS始めました。

JavaScriptライブラリ『Leaflet』を使ったWebGISを始めました。

試行錯誤で進めていますが、何とか自分が使えるツールにはなってきたかと。

『地理院地図 on Leaflet』
http://www.shirado.jp/gis/leaflet/

![スマホ画面01.jpg](https://qiita-image-store.s3.amazonaws.com/0/67836/e30f9aa9-3aeb-0f3d-660e-dfe2acc13da2.jpeg)

画面を９分割したエリアにダブルクリック・ダブルタップの機能を配置しました。

![スマホ画面02.jpg](https://qiita-image-store.s3.amazonaws.com/0/67836/506753a0-042c-73c3-5011-4d6b641e7572.jpeg)
BeagleBone Blackのファームウェアを入れ直す - Part2: SDカードのUbuntu14.04.1へPuttyからシリアル接続する

[前回](http://qiita.com/masato/items/0189adbad303d7dd2688)、BeagleBone BlackのファームウェアをDebian 7.5に戻しました。この環境でSDカードからUbuntu 14.04.1を起動してみます。USBシリアル変換ケーブルでBBBとWindows7をつなぎ、Puttyからシリアル接続します。BBBのリビジョンA5BのSDカードからUbuntu 14.04.1を起動する場合、USBネットワーク接続がデフォルトで使えませんでした。


## Ubuntu 14.04.1のイメージを用意

Cygwin64 Terminalを管理者として起動します。今回はイメージをeMMCにフラッシュせずにSDカードに焼いてから起動します。[Embedded Linux Wikiのページ](http://elinux.org/BeagleBoardUbuntu#BeagleBone.2FBeagleBone_Black)にある、[bone-ubuntu-14.04.1-console-armhf-2015-01-06-2gb.img.xz](https://rcn-ee.net/rootfs/2015-01-06/microsd/bone-ubuntu-14.04.1-console-armhf-2015-01-06-2gb.img.xz)をダウンロードします。


``` bash
$ cd /cygdrive/c/Users/masato/Downloads/
$ wget https://rcn-ee.net/rootfs/2015-01-06/microsd/bone-ubuntu-14.04.1-console-armhf-2015-01-06-2gb.img.xz
$ md5sum bone-ubuntu-14.04.1-console-armhf-2015-01-06-2gb.img,xz
9d602fdcaa350181c90bc90de15fd184 *bone-ubuntu-14.04.1-console-armhf-2015-01-06-2gb.img.xz
```

イメージをunxzコマンドで解凍して、SDカードに焼きます。

``` bash
$ unxz bone-ubuntu-14.04.1-console-armhf-2015-01-06-2gb.img.xz
$ dd if=./bone-ubuntu-14.04.1-console-armhf-2015-01-06-2gb.img of=/dev/sdc
```

## USB-シリアル変換ケーブルのピンを刺す

Prolific社製のPL-2303チップセットの採用している[USB-シリアル変換ケーブル](http://www.amazon.co.jp/dp/B00L8SP7U6)をアマゾンから650円で購入しました。4ピンケーブルのBlack、Green、Whiteの3本をBBBに刺します。

![usb-serial-4pin.png](https://qiita-image-store.s3.amazonaws.com/0/43745/bc69b87c-e90f-8e67-d172-9118b19af3ac.png)


## Puttyからシリアル接続

### Puttyの設定

USB-シリアル変換ケーブルをWindows7に接続すると自動でドライバがインストールされます。デバイスマネージャーでCOMポートを確認すると7を使っています。


![device-manager-com7.png](https://qiita-image-store.s3.amazonaws.com/0/43745/e88730cd-951c-9fa5-3e99-1e76515eca0f.png)

Puttyの新しいセッションの作成をします。

* 左カテゴリ > 接続 > シリアル

以下の値を入力して、セッション一覧に名前を付けて保存します。

* 接続先のシリアルポート: COM7
* 通信速度(ボー): 115200
* データ長(ビット): 8
* ストップビット: 1
* パリティ: なし
* フロー制御: なし

![putty-serial-port.png](https://qiita-image-store.s3.amazonaws.com/0/43745/ccc30f27-529e-38d7-086e-86409abed570.png)

### USB-シリアル接続

最初に電源供給用にBeagleBone Blackのmini USBケーブルを[USB急速充電器](http://www.amazon.co.jp/dp/B00GTGETFG)などに接続して電源を入れます。その後に3ピンを刺したUSB-シリアル接続をWindows7に接続します。


![serial-ubuntu-14.04.png](https://qiita-image-store.s3.amazonaws.com/0/43745/3d378721-064a-79a0-4486-3eb016e279e6.png)

USB-シリアル接続を使い、PuttyからSDカードから起動しているUbuntu 14.04にログインすることができました。
1からnまでの数値を合計するという命題を


与えられたときに、何も考えずにループで書いたんですが、
「100000000みたいな大きな数値を与えられたら、使い物にならない糞みたいなコードだぜ！」という意味合いの事を限りなくソフトな言い方でたしなめられつつ解を教えてもらったんですが、その内容を今から実行して体感してみたいと思います。


ループで記述

```php
$n = 100000000;
$sum = 0;
for ($i = 1; $i <= $n; $i++) {
    $sum += $i;
}
var_dump($sum);
```

教えてもらった方

```php
$n = 100000000;
$sum = $n * ($n + 1) / 2;
var_dump($sum);
```

関数化して時間を確認

```php
$n = 100000000;

$time_start = microtime(true);
$sum = sumOneToLimit($n);
var_dump($sum);
var_dump(microtime(true) - $time_start);

$time_start = microtime(true);
$sum = calOneToLimit($n);
var_dump($sum);
var_dump(microtime(true) - $time_start);

function sumOneToLimit($n) {
    $sum = 0;
    for ($i = 1; $i <= $n; $i++) {
        $sum += $i;
    }
    return $sum;
}

function calOneToLimit($n) {
    return $n * ($n + 1) / 2;
}
```

実行結果

```
int 5000000050000000

float 16.202419042587

int 5000000050000000

float 1.0013580322266E-5
```

ぐはぁっ
iTunes connectでRouting App Coverage Fileを要求されてハマった

初めてアプリをiTunes Connectに提出した時に、Routing app coverage fileを要求されてハマったのでメモ。

MapKitとCoreLocationを使ったアプリで、XCODEプロジェクトCapabiltyタブからMapを有効にしてBikeにチェックを入れてしまっていた。本来、このチェックは経路検索をするアプリの場合に使用するようだ。

MapKitを使っているのでどれかにチェックを入れないといけないと思ってチェックしたのが誤りで、経路検索せず地図を表示しているだけなら、Mapを有効にしても個々のチェックは不要。

チェックを外してビルドし直して（ビルドナンバーも変更）、SubmitしたらちゃんとRouting app coverage fileは要求されなくなり、レビュー開始となった。
iOSアプリ開発でGoogle Analyticsを使うには

iOSアプリでGoogle Analyticsを導入した時に
ほんの少しだけハマったのでメモ。

基本的には下記のページに従って導入すればOKだけど、
情報が一部足りていないので注意。
https://developers.google.com/analytics/devguides/collection/ios/v3/


ちなみにGoogle Analyticsを使うと、
　どれぐらいのユーザが、どこでアプリを起動していて、どの画面を表示しているのか
　OSのバージョンは何なのか
　デバイスは何なのか
などが把握できるので、
今後のアプリの展開を考えるといったマーケティングに役立つ。

Google Analyticsを導入する全体の流れとしては、

1. Google AnalyticsのSDKをダウンロード（https://developers.google.com/analytics/devguides/collection/ios/resources?hl=ja）
2. ダウンロードしたファイルを解凍して、適当なディレクトリにコピー
　（例えばGoogle Analyticsを導入したいプロジェクトのディレクトリに）した上で、必要なヘッダーファイルをプロジェクトに追加
3. リンクするライブラリを追加
4. 取得したい情報に応じて、各所にGoogle AnalyticsのSDKのメソッドを呼ぶコードを追加　（各画面が表示されていることを取得するなら、各View ControllerのViewWillAppearに追加するイメージです。）

となる。

1,2,4は割りとスムーズに（Googleが公開している情報の通りに）できるけど、
今回ハマったのは3番。

3番についてGoogleが公開している方法は下記の通り。
>
>Google アナリティクス SDK では CoreData と SystemConfiguration のフレームワークが使われるため、アプリの対象リンク ライブラリに次のファイルを追加する必要があります。
>
>libGoogleAnalyticsServices.a
>AdSupport.framework
>CoreData.framework
>SystemConfiguration.framework
>libz.dylib
>

実際やってみると、上記ファイルをリンクするだけだとビルド時にエラーが出まくる。
調べてみたらライブラリが一つ足りないらしい。

というわけで下記をリンクに追加する。
>libsqlite3.0.dylib

これだけでエラーが無くなりました。

そもそもGoogleの説明が間違っているのか、
別の所に説明が書いているのかは分からないけど、
調べてみたら他の人もハマっているみたいです。。
Macの（BSD版）sed での上書き保存


Macに入っているsedはBSD版sedとかいうやつで、Linuxなどに入っているGNU版sedとは様々な点で仕様が異なります。

中でも引っかかりやすいのがファイル上書きオプションの`-i`についてです。あんまりちゃんと説明した記事が見当たらないのでまとめておきます。

以下のようなコマンドを実行すると、BSD sedでは意図通りに実行されません。

```bash
$ echo aaabbbcc > hoge.txt
$ sed -i 's/aaa/zzz/' hoge.txt # BSD sed
sed: 1: "hoge.txt": extra characters at the end of h command
$ gsed -i 's/aaa/zzz/' hoge.txt # GNU sed
$ cat hoge.txt
zzzbbbcc
```

ここで`man sed`の該当部分を読んでみます。

```man
i extension
Edit files in-place, saving backups with the specified extension.
```

「saving backups with the specified extension.」とあります。つまり、**BSD sedでの上書き保存には、バックアップ用拡張子の指定が必須なのです。**先ほどのコマンドでは、`'s/aaa/zzz/'`がバックアップ用拡張子として認識されてしまいます。

つまり、正しいコマンドは以下のようになります。

```bash
$ sed -i '.bak' 's/aaa/zzz/' hoge.txt # 拡張子'.bak'でバックアップ
$ cat hoge.txt
zzzbbbcc
$ cat hoge.txt.bak
aaabbbcc
```

拡張子を**「なし」に指定する場合**、バックアップされません。

```bash
$ echo aaabbbcc > fuga.txt
$ sed -i '' 's/aaa/zzz/' fuga.txt # バックアップファイルは生成されない
$ cat fuga.txt
zzzbbbcc
```

まとめると、Macに最初から入っているsedで上書き**のみ**をする場合、オプションは`-i ''`と覚えておけばよいでしょう。
BacklogでWebhookが追加されたよ!!!Hubot経由でSlackに連携してみた

## Backlog が Webhook に対応した！
つい昨日、[Backlog が Webhook に対応したというお知らせ](http://www.backlog.jp/news/release/release-201502.html)がありました！！！

今まで、Backlog の課題更新をお知らせをSlackで受け取るには、RSS フィードや Backlog API を使う方法があったようです。今回の Webhook を使ってみたら、リアルタイムに通知が飛んでくるので大変便利になりました。

## 参考にしたもの
Hubot と Slack の連携は、ネットでいろいろ調べたら出来ました。
Backlog API の更新情報を Slack に投げる部分は、いつかやろうと以前からストックしていた Qiita の記事「[Backlog API V2 を使って、課題を Slack に連携させる](http://qiita.com/matsuoshi/items/eb8479df3c10cf43269a)」を大いに参考にしています。

## 手順
+ Hubot をインストールする
+ Hubot-Slack アダプタのバージョンを確認
+ Hubot に Script を設置
+ Backlog の Webhook を設定

## Hubot に Script を設置
以下のコードを、Hubot の Script フォルダに置きます。

```coffeescript:backlog-notification.coffee
# Description:
#   Backlog to Slack
#
# Commands:
#   None

backlogUrl = 'https://xxxx.backlog.jp/'

module.exports = (robot) ->
  robot.router.post "/yoursecreturl/:room", (req, res) ->
    { room } = req.params
    { body } = req
    try

      switch body.type
          when 1
              label = '課題の追加'
          when 2, 3
              # 「更新」と「コメント」は実際は一緒に使うので、一緒に。
              label = '課題の更新'
          else
              # 課題関連以外はスルー
              continue

      # 投稿メッセージを整形
      url = "#{backlogUrl}view/#{body.project.projectKey}-#{body.content.key_id}"
      if body.content.comment?.id?
          url += "#comment-#{body.content.comment.id}"

      message = "*Backlog #{label}*\n"
      message += "[#{body.project.projectKey}-#{body.content.key_id}] - "
      message += "#{body.content.summary} _by #{body.createdUser.name}_\n>>> "
      if body.content.comment?.content?
          message += "#{body.content.comment.content}\n"
      message += "#{url}"

      # Slack に投稿
      if message?
          robot.messageRoom room, message
          res.end "OK"
      else
          robot.messageRoom room, "Backlog integration error."
          res.end "Error"
    catch error
      robot.send
      res.end "Error"
```
## Backlog 側の設定
Backlog のほうでは、「プロジェクト設定」ページにいくと「Webhook」という項目が増えています。
ここに「https://（Hubotの場所）/yoursecreturl/（つぶやかせたいチャンネル名）」というようなURLを登録すると、動きます。

更新の種類を切り替える番号の部分はBacklog APIの[「最近の更新の取得」](http://developer.nulab-inc.com/ja/docs/backlog/api/2/get-activities)というところにあります。「課題の更新」と「課題のコメント追加」の番号は別なのですが、実際に使う場面を考えると「コメント付きの更新」が多いので、一緒にしてしまいました。

繰り返しますが、CoffeeScriptについてまったくよくわからず書いてますので、間違ってるところがあったらぜひご指摘ください。
YosemiteでWeb共有


# 手順

## 設定

下記ファイルの当該箇所をコメントアウトする。

```apache:/etc/apache2/httpd.conf
LoadModule userdir_module libexec/apache2/mod_userdir.so
Include /private/etc/apache2/extra/httpd-userdir.conf
```

```apache:/etc/apache2/extra/httpd-userdir.conf
Include /private/etc/apache2/users/*.conf
```

下記ファイルを作成。%USER%は、適宜ユーザ名に置き換える。

```apache:/etc/apache2/users/%USER%.conf
<Directory "/Users/%USER%/Sites/">
	AllowOverride All
	Options Indexes MultiViews FollowSymLinks
	Require all granted
</Directory>
```

## Apache起動

```console:
$ sudo apachectl start
```

# 謎（解決）

Includeのパスが`/etc/apache2/...`でなく、`/private/etc/apache2/...`なのは、`/etc`が`/private/etc`のシンボリックリンクだから。
class_evalの第１引数に文字列を渡したときの挙動についてメモ


## class_eval(code, file, lineno)

```ruby:eval.rb
class Shino
  def self.shino
    class_eval <<-RUBY, __FILE__, __LINE__ + 1
      def name
        puts 'fumi'
        raise
      end
    RUBY
  end
end

Shino.shino
s = Shino.new
s.name
# => fumi
# eval.rb:6:in `name': unhandled exception
#	from eval.rb:14:in `<main>'
#
# shell returned 1
```

第１引数に渡された文字列は、クラス定義の中のコードであるように実行される。上記の例だとShinoクラスのインスタンスメソッドnameが定義される。
第２引数と第３引数はstacktraceのときに利用される。
第２引数に`__FILE__`、第３引数に`__LINE__ + 1`としておくとわかりやすい。

### 参考)

http://ref.xaio.jp/ruby/classes/module/class_eval


### 利用例)
ActiveSupport::Callbacks::ClassMethods#define_callbacksで利用されている。

```ruby:activesupport/lib/active_support/callbacks.rb
module ActiveSupport
  module Callbacks
    module ClassMethods
      def define_callbacks(*names)
        options = names.extract_options!

        names.each do |name|
          class_attribute "_#{name}_callbacks"
          set_callbacks name, CallbackChain.new(name, options)

          module_eval <<-RUBY, __FILE__, __LINE__ + 1
            def _run_#{name}_callbacks(&block)
              _run_callbacks(_#{name}_callbacks, &block)
            end
          RUBY
        end
      end
    end
  end
end
```
ฅ(・ω・ฅ){ Ruboty の脳を辞書化する ruboty-brain_dictionary を作ったよ } #ruboty

## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
Ruboty の脳を辞書化する ruboty-brain_dictionary を作ったよ

## <i class="fa fa-cube" style="font-size:1em;"></i> 用途
定型文を登録したい時。
辞書ツールでもいいのかもしれないが、 Slack など Ruboty がいる場所だけで使いたい場合に使う。
また、辞書を Ruboty で管理することで、辞書の内容を共有したい。

例えば、「日光東照宮」というキーに対して以下の Emoji を返す。
:see_no_evil::speak_no_evil::hear_no_evil:

「ぬるぽ」というキーに対して以下の顔文字を返す。
`(#ﾟДﾟ)ﾉ┌┛)д)ﾟﾟｶﾞｯ`

ちょっとした キーワード に反応して 固定メッセージ を返すだけなら、この gem があれば
Plugin を作るまでもない。

## <i class="fa fa-cube" style="font-size:1em;"></i> Installation

Add this line to your application's Gemfile:

```ruby
gem 'ruboty-brain_dictionary'
```

And then execute:

    $ bundle

## <i class="fa fa-terminal" style="font-size:1em;"></i> Commands

|Command|Pattern|Description|
|:--|:--|:--|
|learn|/learn\s\{1\}?(?&lt;key&gt;.+)?\s\{\1}(?&lt;value&gt;.+)?\z/|learn key-value|
|remember|/remember\s\{0,1\}?(?&lt;key&gt;.+)?\z/|remember your ruboty brain_dictionary that match your keys.|
|dict|/dict\s\{1\}?(?&lt;key&gt;.+)?\z/|show your value from brain.|
|forget|/forget\s\{0,1\}?(?&lt;key&gt;.+)?\z/|forget your ruboty brain_dictionary that match your key.|

## <i class="fa fa-file-text-o" style="font-size:1em;"></i> Usage
### learn
* learn key-value

~~~
>ruboty learn tu ka
>ruboty remember tu
tu,ka
~~~

### remember
* remember your ruboty brain_dictionary that match with your keys.

~~~
>ruboty learn hoge hoge-value
>ruboty learn hige hige-value
>ruboty learn hage hage-value
>ruboty learn hoo bar

# remember all
>ruboty remember
hage,hage-value
hige,hige-value
hoge,hoge-value
hoo,bar

# remember match keys
>ruboty remember ge
hage,hage-value
hige,hige-value
hoge,hoge-value

# remember match key
>ruboty remember hoo
hoo,bar
~~~

### dict

~~~
>ruboty learn hoge hoge-value
>ruboty learn hige hige-value
>ruboty learn hage hage-value
>ruboty learn hoo bar
>dict hoge
hoge-value
>dict hoo
hoo-value
>dict hogea
>
~~~

### forget
* forget your ruboty brain_dictionary that match with your key.

~~~
>ruboty learn hoge hoge-value
>ruboty learn hige hige-value
>ruboty learn hage hage-value
>ruboty learn hoo bar

# remember all
>ruboty remember
hage,hage-value
hige,hige-value
hoge,hoge-value
hoo,bar

# forget hoo & confirm
>ruboty forget hoo
success delete key 'hoo'

>ruboty remember
hage,hage-value
hige,hige-value
hoge,hoge-value

# forget hoo ( not exist )
>ruboty forget hoo
no key 'hoo'
~~~

## <i class="fa fa-gears" style="font-size:1em;"></i> ENV

|Name|Description|
|:--|:--|
|--|--|

## <i class="fa fa-puzzle-piece" style="font-size:1em;"></i> Dependency

|Name|Description|
|:--|:--|
|--|--|

## :memo: Memo
* Ruboty の brain を利用しています。デフォルトだとメモリ保存なので再起動すると値は消えます
* ruboty-redis を利用していれば、永続化されます

## <i class="fa fa-arrow-circle-right" style="font-size:1em;"></i> 参照
* <i class="fa fa-external-link" style="font-size:1em;"></i> [ruboty-brain_dictionary GitHub](https://github.com/tbpgr/ruboty-brain_dictionary)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [ruboty-brain_dictionary RubyGems](http://rubygems.org/gems/ruboty-brain_dictionary)
VMPlayerにCentOS7.0入れました

セットアップの流れ

##VMWarePlayerのインストール
http://www.vmware.com/jp/products/player/playerpro-evaluation.html

ここから無償評価版をDLしてインスコ
Proとか書いてあるけど無償なのでありがたく使わせていただく

インストール時の設定はよく覚えてないけど多分デフォルト


##CentOS7.0のインストール
ここからイメージファイルをDL
http://www.centos.org/download/

あとはVMで新規仮想マシンの作成→後でOSをインストール→以下そのまま流れで
簡易セットアップだと英語だったりするので。

インストール時は必要最低限のセットアップで何も選択せず。

![567ece9314993e51dfe778bee2710e71.png](https://qiita-image-store.s3.amazonaws.com/0/54872/451b5b63-2467-577b-a5c6-fa91168d9918.png)

はい。


IPアドレスの設定はこの記事を参考にさせていただきました。
http://qiita.com/HirofumiYashima/items/8984aeddf04cd58b4c1a

設定できてるかどうか確認するためにifconfigしようとしたら出来なかったので調べてみたら・・・

####Red Hat EL 7(CentOS 7)のifconfigとかレガシーなnet-toolsがなくなった
http://goo.gl/C8VG4D

>###ifconfig

>Shell
\# ifconfig # ↓ # ip addr show # ifconfig eth0 192.168.0.100 netmask 255.255.255.0 # ↓ # ip addr add 192.168.0.100/255.255.255.0 dev eth0
	
>\# ifconfig
>\# ↓
>\# ip addr show
 
>\# ifconfig eth0 192.168.0.100 netmask 255.255.255.0
>\# ↓
>\# ip addr add 192.168.0.100/255.255.255.0 dev eth0


・・・とのことらしいのでip addr showで確認したアドレスにping打って設定を確認。

ついでにSSHクライアントでつなげることも確認してセットアップを終わり。
次は開発環境を整備しようかなと思います。
Siv3Dで透過PNGテクスチャの上端に線が入る

## 問題提起
Siv3D(Jan,2015)で透過PNGテクスチャを使ってキャラクタを動かすと，なぜか上端に線が入る．テクスチャを動かすと線が入ってしまうので消したい．

## 解決方法
SetSamplerState関数を使い，テクスチャのアドレスモードをClampに切り替えると，上端に線が入らなくなる．

```cpp
# include <Siv3D.hpp>

void Main()
{
	Graphics2D::SetSamplerState(
		SamplerState(TextureAddressMode::Clamp, TextureFilter::MinMagMipLinear));

	while (System::Update())
	{
		// hogehoge
	}
}
```

## 注意点
Siv3D(2014,Nov)以前だと，SetSamplerState関数がGraphics名前空間に入っているので，見つからない時はそちらのほうを探してみるといいかもしれません．
Angular.jsのvalueとfactoryの違いを考える


次のようなHTMLがあったとする。

```index.html
<!doctype html>
<html lang="jp" ng-app="App">
<head>
  <meta charset="utf-8">
  <script src="bower_components/angular/angular.js"></script>
  <script src="app.js"></script>
</head>
<body>
<div ng-controller="Ctrl">
  Value:{{answer}}
</div>
</body>
</html>
```

## valueとfactoryの違いを考える
valueもfactoryもcontrollerから利用する値やfunctionを登録しておくのに使う。そのようなcontrollerの外部に登録されているfunction等を`サービス`と呼ぶ。たとえば、下記のように`plus`や`minus`といった`サービス`があったとする。

```app.js
angular.module('App',[])
  .value('plus', function(a,b){ return a+b; }) //plusサービス
  .value('minus', function(a,b){ return a-b; }) //minusサービス
  .controller('Ctrl',
    ["$scope", "plus", "minus",
      function($scope, plus, minus){
        $scope.answer = minus(plus(3,2),1); // 4
      }
    ]
  );
```
下記のように、`plus`と`minus`を組み合わせた`plus_minus`という`サービス`を作りたいが、`plus_minus`内から`plus`や`minus`は参照することができない。

```app.js
angular.module('App',[])
  .value('plus', function(a,b){ return a+b; })
  .value('minus', function(a,b){ return a-b; })
  .value('plus_minus',function(a,b,c){
    return minus(plus(a,b),c); // minusやplusが参照できない
  })
  .controller('Ctrl',
    ["$scope", "plus_minus",
      function($scope, plus_minus){
        $scope.answerValue = plus_minus(3,2,1); // エラー
      }
    ]
  );
```

このように、登録されている`サービス`を利用するときに`factory`を使う。

```app.js
angular.module('App',[])
  .value('plus', function(a,b){ return a+b; })
  .value('minus', function(a,b){ return a-b; })
  .factory('plus_minus', ["plus","minus",function(plus, minus){ // ここで明示的に参照
    return function(a,b,c){
      return minus(plus(a,b),c);
    };
  }])
  .controller('Ctrl',
    ["$scope", "plus_minus",
      function($scope, plus_minus){
        $scope.answer = plus_minus(3,2,1); // 4
      }
    ]
  );
```

次回は[factoryとserviceの違いを考える](http://qiita.com/daei/items/892efc82502009ef5c42)。
Mongoid::Slug を使うときに slug という名前のフィールドを使用してはいけない

[digitalplaywright/mongoid-slug](https://github.com/digitalplaywright/mongoid-slug) について。

[lib/mongoid/slug.rb L253 付近 (執筆時点 master)](https://github.com/digitalplaywright/mongoid-slug/blob/master/lib/mongoid/slug.rb#L253-L256) で、インスタンスメソッドとして `slug` が定義されています。普通に `@page.slug` などと getter 風に動くのでなんとなく使える気持ちになるのですが、ソースを見ればわかる通りコレはふつうの getter とは違います。そしてなんと、インスタンスが `save` されていないと nil を返してきます。

これがどういう場面で悪影響を及ぼすかというと、バリデーションです。はじめて `save` する時のバリデーションでは `slug` は当然 nil を返すので、`slug` という名前のフィールドに対して行ったバリデーションはことごとく nil に対する判定が結果として返ってきてしまいます。

一番穏当な解決策は、`slug` という名前のフィールドを作らないことでしょう。何か別の名前を選びましょう。
slackにweb apiでpostしてみる

# hubot-slack縛り

やんごとなき事情で、hubot-slack を使ってはならないことってありますよね？ (え..)
そんなわけで、web apiを使ってできるかshellscript書いて試した。

- https://gist.github.com/mattak/af5a9d6790b1e5c5a175

# 手順

channels (公開) / groups (非公開) のリストを取得する

- https://api.slack.com/methods/channels.list
- https://api.slack.com/methods/groups.list

これにより CHANNEL_IDを取得.

CHANNEL_IDをもとにpostすればおｋ

- https://api.slack.com/methods/chat.postMessage

## 追記

CHANNEL_IDを取得しなくても普通にチャンネル名を記述しても行けるっぽいです。。。
Android StudioでAndroid SDK Managerを開いて、ライブラリをアップデートする

### 概要

- Android SDKに入っているライブラリが古いと、以下のようなエラーが出ることがあります

```
Error:Failed to find: com.android.support:support-v4:21.0.3
```

### 解決策

- 上記のようなエラーになる原因は、ライブラリが古い以外にもいろいろあるかと思います
- バージョンが古いのは、あくまで原因の一つです
- Android Studioでライブラリバージョンを上げてください


- と、言われてもAndroid Studioを初めて使う人は、ライブラリのバージョンの上げ方なんてよく分かりませんよね

### Android Studioでのライブラリのバージョンの上げ方

- Android Studioでは、ライブラリは「Android SDK Manager」を使うことでアップデートすることができます

- 開き方は、```Tools > Android > SDK Manager```です

![dd056534-acf0-11e4-8e92-4605b6eccd33.png](https://qiita-image-store.s3.amazonaws.com/0/61162/a3ba5240-ddda-c3b4-1250-779db4cb3852.png)

- アップデートする対象のファイルが既に選択されています
- 「Install 8 packages…」(ライブラリ数に応じて数字は変わります)を押します


- すると、ライセンスに同意するか聞かれるので、「Accept License」を選択してから、「Install」ボタンを押します

![75ae5eda-acf1-11e4-832c-326f6e7924e9.png](https://qiita-image-store.s3.amazonaws.com/0/61162/317886b1-0d1c-4783-2e5e-e142c6d271cf.png)


- 「ライセンスをアップデートしたら、もう一度SDK Managerでアップデートを確認してね」という意味（意訳）の文言が表示されるので、OKを押します

![bdceb764-acf1-11e4-8645-7497f4d689d7.png](https://qiita-image-store.s3.amazonaws.com/0/61162/c4e7e68a-8fd5-c968-e3b7-a10a9ba07307.png)


## 完了
- これで作業はアップデートは完了です
- 本当にアップデートできたか確認したい人は、もう一度SDK Managerでアップデートを確認してください
XMLHttpRequestをもちいて、数値データを読み込もうpart1

#通信
通信...マシーンとマシーンでデータのやりとりを行うことです。
通信には色々ありますが、基本的なサーバーと自分のパソコンとの通信を考えてくださるといいと思います、
通信規格には２つの規格があります。(これ以外に通信規格があるよといいうかたはご教授ください)
##同期通信
１つ、同期通信...サーバーにリクエストを送って、レスポンスがかえってくるまで、他の動作に移行しません。データ量が少ないものにたいしてはこのような規格が使われます。
##非同期
２つめ、非同期通信...サーバーにリクエストを送ってレスポンスかえってくる、レスポンスがかえってくるまでに、他の作業が可能です。つまり、webページをリロードしなくとも、必要な時にリクエストをおくってレスポンスをもらっているのです。google mapなんかは移動する度に必要な情報を自動で取得しています。


#http通信
HTTP通信には、通信方式として主なものにGETメソッドとPOSTメソッドというものがあります。 GETメソッドは、サーバからデータを受信することが目的である場合に使用します。 POSTメソッドは、サーバへデータを送信することが目的である場合に使用します。
GETメソッドでは、URLにリクエスト情報が含まれたものになります。
そのため、サーバへ多量のデータを送信することはできません。
また、パスワード等の個人情報をサーバへ送信する際、URLにその情報が丸見えになってしまうため、セキュリティの観点からGETメソッドを使用する訳にはいきませんね。
対してPOSTメソッドでは、通信するデータそのものにリクエスト情報が含まれます。
そのため、多量のデータを通信する際やパスワード等の個人情報を送信する際にはPOSTメソッドを使用します。
以上の理由から、サーバからデータを受信する際にはGETメソッド、サーバへデータを送信する際にはPOSTメソッドを使用します。

###google chromeのローカルファイルに関する設定
widowsでは、google chromeで、ローカルファイルを読み込むときには
"--allow-file-access-from-files"
をリンク先に設定しなくてはなりません。
Macの場合も同様にgoogle chromeの設定しなくてはなりません。
ターミナルで--allow-file-access-from-filesのフラグ(?)をいれて実行しなければなりません。
自分はAutomatorで自動化させています。


##XMLHttpRequestオブジェクト
```lang:javascript
var xml = new XMLHttpRequest();
```

これでXMLHttpRequestオブジェクトは生成されます。
###openメソッド
オープンメッソドでは、通信方式、通信先、非同期通信するかのフラグが立てられます。
すなわち、通信方式の設定を指定いるのです。

```lang:javascript
xml.open(通信方式,通信先のurl,非同期通信のフラグ);
```

例

```lang:javascript
xml.open("GET","test.txt",true);
```

など

####URL
URLっという単語を自分は曖昧につかってしまっていました。
URLはUniform Resource Locatorの略です。日本語にすると、統一資源位置指定子といいます。
Resource(情報資源)を特定する文字列です。
ですので、インターネット上にかぎったものではありません。
ファイル構造の中にある情報を指定するもの、ディレクトリのなかのディレクトリにあるもの。
macでいう、情報を視るから記述されている場所もurlなのです。

##リクエストの送信

sendメソッドというものがあります。

```lang:javascript
xml.send();
```

これで、リクエストの送信ができます。


レスポンスの処理に関しては次の記事に書こうと思います。

次の記事
[part2](http://qiita.com/klme_u6/items/00ced4877ce80cd56e8f)
jQueryのtriggerとtriggerHandlerの違い

jQueryにはDOM要素のイベントハンドラーを呼び出すためのメソッドとして `.trigger()` と `.triggerHandler()` があるが、これらのメソッドには下記のような違いがある。

* `.triggerHandler( "event" )` は対象要素の `.event()` メソッドを**呼び出さない。**例えばフォーム要素で `.triggerHandler( "submit" )` を呼び出しても、 `.submit()` は呼び出されない。
* `.trigger()` は複数要素を対象としたjQueryオブジェクトでは全ての要素に対してイベントハンドラーを実行する。`.triggerHandler()` は最初のオブジェクトのイベントハンドラーのみ呼び出す。
* `.triggerHandler()` で発生したイベントは**DOM階層を辿らない。**対象要素でイベントが処理されなければ、何も起こらない。
* `.triggerHandler()` はイベントハンドラーで最後に `return` された値を戻す。何もイベントハンドラーがなければ、 `undefined` を返す。 `.trigger()` はjQueryオブジェクトを返す。

詳しくは[ドキュメント](http://api.jquery.com/triggerHandler/)を参照。
Docker run を使ってターミナル画面共有

偶然発見して、これはめっちゃ簡単で便利と思ったので共有します。

## 作業者側

```bash
$ export DOCKER_HOST=tcp://common-docker:2375
$ docker run --name common_sample -ti centos:7 /bin/bash
[root@7763c2d8651e /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var
[root@7763c2d8651e /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var
[root@7763c2d8651e /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 10:46 ?        00:00:00 /bin/bash
root        19     1  0 10:47 ?        00:00:00 ps -ef
```

## 見る側

```bash
$ export DOCKER_HOST=tcp://common-docker:2375
$ docker logs -f common_sample
[root@7763c2d8651e /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var
[root@7763c2d8651e /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var
[root@7763c2d8651e /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 10:46 ?        00:00:00 /bin/bash
root        19     1  0 10:47 ?        00:00:00 ps -ef
...
# ここで、作業者側が何か叩くと何か起こる
```

これだけ!!!

言われてみれば「確かに〜」感がある。

見る人は何人増えても（常識の範囲なら）大丈夫で、ほぼリアルタイムにターミナルの様子が共有される。すごいのは `less` とかそういうターミナルがばーっと切り替わる系のコマンド（雑な説明...）でも大丈夫というところ。

docker内部で実作業ってあまりなさそうだけど、コマンドラインツールの作業の様子の共有とか、研修やチュートリアル、勉強会での共有みたいな場合にも簡単にできる。

まあ...tmuxとかscreenでも良いけど、docker logsなら見る側が完全にリードオンリーなのが良さそう。
autoconf/automake


その昔（20130920）に、 git 版 `gnu screen` を入れようとしたら、`automake` のバージョンが古くてコケる事態に会った。
で、その時のアンインストール、インストールのメモ

### アンインストール
/usr/local 以下にインストールしてたもののアンインストール記録

```shell-session:
$ tar zxf automake-1.12.1.tar.gz
$ cd automake-1.12.1/          
$ ./configure
$ sudo make uninstall            

$ tar zxf autoconf-2.69.tar.gz
$ cd autoconf-2.69/ 
$ ./configure
$ sudo make uninstall
```

\# automake => autoconf の順に uninstall しないと
\# 二度手間となる。
\# /usr/local/share などのファイルが削除されないものが出た

今（20150220）でもこの挙動を取るのかどうかは知らない。

### 新規インストール
ローカルにインストールするには、PATH に /usr/local が含まれてる必要がある。

```shell-session:
$ export PATH=${HOME}/cmd/bin/usr/local/bin:${PATH}
$ cd autoconf-2.69
$ ./configure --prefix=${HOME}/cmd/bin/usr/local
$ make
$ make install

$ tar zxf automake-1.14.tar.gz                        
$ cd automake-1.14/                                   
$ ./configure --prefix=${HOME}/cmd/bin/usr/local
$ make
$ make install
```

アンインストールは前述の要領 + `rm -rf cmd/bin/usr`

### 今は。
上記の場合は、環境変数（ MANPATH 含む）が、あまりにも見栄えが悪い。
ってんで、 `brew` で入れなおしてた。

```shell-session:
$ brew install automake
$ brew install autoconf
```
homebrew のインストール


~~昔入れた時のメモ。~~

2019/02/02 mojave へインストール

gnuplot を手元に入れたくて。

-----

* 基本的には、`/` も `/usr/local` も汚したくないんで `${HOME}/cmd/` に入れる。
* それで入らないコマンドは別の手を考える。

## インストール
ユーザーディレクトリにて運用
`${HOME}/cmd/homebrew`

### ディレクトリ作成

```shell-session:
$ cd
$ mkdir -p cmd/homebrew
```

### Homebrew インストール

```shell-session:
$ curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C ~/cmd/homebrew
```

### .*shrc 編集


```.bashrc:
export PATH=${HOME}/cmd/homebrew/bin:$PATH
```


### doctor

半ば、お約束になってたので、とりあえず実行。

```shell-session:
$ brew doctor
```

で、gnuplot を入れた

```shell-session:
$ brew install gnuplot
```
androidでXMLをパースするライブラリ「Simple」をgradleで入れるとビルドエラーになる

### 忙しい人のための、簡単な回答
- SimpleがAndroid標準で入っているライブラリとは別のバージョンのライブラリを入れようとして競合しているのが原因です
- build.gradleのsimpleを読み込んでいる部分を下記のように書き換えることにより、Simpleが入れようとしてくる競合ライブラリを除外することができます。

```
dependencies {
    ...
    compile('org.simpleframework:simple-xml:2.7.1'){
        exclude module: 'stax-api'
        exclude module: 'xpp3'
    }
}
```

### 概要
はじめまして。
新人プログラマの、らべねこです。

Qiitaで記事を書くのは初めてです。

最近、業務でAndroid開発を始めましたので、開発をする上でハマったことをqiitaに記録していこうと思います。よろしくお願いします。

今日記録することは、androidでXMLをパースするライブラリ「Simple」をgradleで入れるとビルドエラーになる件です。

### 確認
- appのbuild.gradleに下記のようなコードで入れてビルドします

```
dependencies {
    ...
    compile 'org.simpleframework:simple-xml:2.7.1'
}
```

- ビルドしてみます

```
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:preDexDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
  	/Applications/android-sdk-macosx/build-tools/21.1.2/dx --dex --output /Users/labeneko/AndroidStudioProjects/TestApp/app/build/intermediates/pre-dexed/debug/stax-api-1.0.1-274b7d75adc0b395e6751c495dd2fd3492053aea.jar /Users/labeneko/.gradle/caches/modules-2/files-2.1/stax/stax-api/1.0.1/49c100caf72d658aca8e58bd74a4ba90fa2b0d70/stax-api-1.0.1.jar
  Error Code:

(中略)

BUILD FAILED
```

### 検証
- 原因はSimpleが入れようとしている```stax-api```というライブラリがAndroid標準のライブラリと競合しているからです。
- エラー文中にある、```stax-api```をSimpleのライブラリを読み込む時に除外してしまいます

```
WARNING: Dependency xpp3:xpp3:1.1.3.3 is ignored for debug as it may be conflicting with the internal version provided by Android.
         In case of problem, please repackage it with jarjar to change the class packages
WARNING: Dependency xpp3:xpp3:1.1.3.3 is ignored for release as it may be conflicting with the internal version provided by Android.
         In case of problem, please repackage it with jarjar to change the class packages

(中略)

BUILD SUCCESSFUL

Total time: 10.609 secs
```

- ビルドは通りました！
-  しかし、warningが2件出ているのが気になります。
- ```Dependency xpp3:xpp3:1.1.3.3```と書いてあるように、xpp3も競合しているようです
- そこで、xpp3も除外します


```
dependencies {
    ...
    compile('org.simpleframework:simple-xml:2.7.1'){
        exclude module: 'stax-api'
        exclude module: 'xpp3'
    }
}
```

- これでもう一度ビルドします

```
BUILD SUCCESSFUL

Total time: 10.023 secs
```

- ビルドが無事通りました！
- これでエラーもwarningも無しにSimpleを使うことができます
Vim に惚れるシーン（エディタ内で ちょっとした計算をする）

# シーン 4

今回は小技の紹介です。（「実践 Vim」にまんま載ってたりします...）

文書を書いている途中で、ちょっとした計算をしたいケースって、ありませんか？例えば...

```
りんごが 15個 あります。3人で仲良く分けると、
650MB のファイルを 1分 でダウンロードした場合の回線速度は、
定価 2,800 円の「実践 Vim」の税込価格は、
```

こんな場合に、あなたはどうしていますか？

 - 机の中の電卓を出して、計算する。
 - パソコンの電卓アプリを起動して、計算する。
 - スマホの電卓アプリを起動して、計算する。
 - 戸棚の中のそろばんを出して、パチパチ...
 - 暗算！

# どうする？

Vim なら、エディタ上で計算できてしまいます。

挿入モードのままで、`Ctrl-r` `=` としてやると、計算式が入力できるようになります。試しに「実践 Vim」の税込価格を計算してみましょう。

```
定価 2,800 円の「実践 Vim」の税込価格は、|
```

カーソルが `|` の位置で挿入モードになっているとすると、`Ctrl-r` `=` `2800 * 1.08` と入力して Enter キーをおしてみましょう。（最下行に `=` が表示されて、そこに計算式を入力するようになります）

```
定価 2,800 円の「実践 Vim」の税込価格は、3024.0|
```

あとは四捨五入したり、少数点以下を消してやれば OK ですね。

計算式には、四則演算、商や余り、だけではなく、Vim に用意されている関数も使用できます。基数変換などできるのも、知っていると便利かもしれません。

```
=round(123.456)
=pow(5, 3)
=0x9b
=printf("0x", 155)
```

余談ですが、税込価格の計算で、四捨五入や小数点以下除去までを計算式で書いてやることもできますが...

```
=printf("%.0f", round(2800*1.08))
```

何事もやり過ぎはよくありません。手でやった方が早いところは、パパっと手を動かして片付けてしまいましょう。

# まとめ

挿入モードでの `Ctrl-r` は、その後に入力されたレジスタを挿入してくれる機能です。そこで `=` という特殊なレジスタ（Expresson レジスタ）を使って計算をさせているわけですね。

ちょっとした計算が **キーボードから手を離さず** に **マウスを握らず** に **引き出しを開けず** に **席を立たず** にできてしまう Vim って、なんか凄く良くないですか。
【AWS】MarketplaceのGitlabのリポジトリURLを変更手順

AWSのMarketplaceにあるbitnamiのAMIをインストールしてみました。

デフォルトでインストールするとホスト名が、ec2-XX-XX-XX-XX.ap-northeast-1.compute.amazonaws.comになります。

今回は、ドメイン名に変更する手順のメモになります。
（よくわかっていないですが、忘れないためのメモ）

# 参考サイト

インストールは、以下の参考サイトから行いました。

* [GitLabを導入しようとしてみた](http://hack.sonix.asia/archives/tag/gitlab)

# 設定手順

* ホスト名の変更（ymlファイルの変更）
* スクリプトの変更（020_update_ipのif文を変更）
* シェルスクリプトの変更
* Gitlabの再起動

## ホスト名の変更（ymlファイルの変更）

viで下記ファイルを編集
host: ec2-XX-XX-XX-XX.ap-northeast-1.compute.amazonaws.comの部分をドメインに変更

```
# vi /opt/bitnami/apps/gitlab/htdocs/config/gitlab.yml

  ## GitLab settings
  gitlab:
    ## Web server settings (note: host is the FQDN, do not include http://)
    host: ec2-XX-XX-XX-XX.ap-northeast-1.compute.amazonaws.com
    port: 80 # Set to 443 if using HTTPS, see installation.md#using-https for additional HTTPS configuration details
    https: false # Set to true if using HTTPS, see installation.md#using-https for additional HTTPS configuration details
```

gitユーザ側のgit-shellのconfig.yml変更
（なぜか、これをドメインに変更したらGitlabの各ユーザで設定したSSHが読み込みできた。。）

```
su git
cd /home/git/gitlab-shell
vi config.yml
```

configファイルを開いたら、gitlab_url:部分のEC2ドメインを各自のドメインに変更する


## スクリプトの変更（020_update_ipのif文を変更）

viで下記ファイルのif文を編集

```
# vi /opt/bitnami/var/init/post-start/020_update_ip

if [ "x$1" != "x" ]; then
    PUBLIC_IP=$1
elif [ -n $GITLABHOST ]; then
    PUBLIC_IP=$GITLABHOST
else
    PUBLIC_IP=`get_server_domain`
fi
```

## シェルスクリプトの変更

viで下記ファイルを開き、最後の行に下記を追加する

```
# vi /opt/bitnami/scripts/setenv.sh

GITLABHOST="gitlab.your.hostname"
export GITLABHOST
```

## Gitlabの再起動

設定ファイルの変更が終わったら、再起動を行なう

```
# /opt/bitnami/ctlscript.sh restart
```
AWSの請求情報を攻めてみた


# 動機

Hubotに過去のAWS料金なんかの問い合わせが出来るようにしたい。
そのためにはなにが必要なのか？

# 事前情報

CloudWatchから取得するかCSVから取得するという手段があるようだ。
SDKから直接この情報は取り扱えないらしい(?)

CloudWatchの情報は見たところ知りたい情報が揃ってなかったので、CSVとしてS3に吐出される情報をソースにしたい。

# Lambdaは使えないのか？

S3にそのファイルがアップされたらRDSに保存するっていうのも考えたのだが、請求詳細を解凍してみたら100MB超えてたので(うちはいっぱいAWS使っている)60秒でちゃんと入れ終わるかは微妙すぎた。

# 請求詳細ファイルについて

<a href="http://blog.cloudpack.jp/2013/02/09/aws-detailed-billing-reports/">AWS Detailed Billing Reports で時間単位の利用量をチェック！</a>

クラウドパックさんの記事でかなり分かりやすく説明されている。

この記事でも触れられているが

|謎カラム一覧|
|---|
|RateId|
|SubscriptionId|
|PricingPlanId|

この3つが謎だ。
PricingPlanIdについてはちょっと気になったのでCSVをDBに流し込んで調べてみた。

| PricingPlanId | プロダクト名 | 内容 |
|---|---|---|
|376398|Amazon Elastic Compute Cloud|t1.micro リザーブドインスタンス(ap-northeast-1a)|
|376404|Amazon Elastic Compute Cloud|m1.medium リザーブドインスタンス(ap-northeast-1a)|
|376413|Amazon Elastic Compute Cloud|m1.small リザーブドインスタンス(ap-northeast-1a)|
|447227|Amazon Elastic Compute Cloud|m1.medium リザーブドインスタンス(ap-northeast-1c)|
|454149|Amazon RDS Service|リザーブドインスタンス|
|482457|Amazon Route 53||
|495777|Amazon Simple Queue Service||
|495869|Amazon Simple Notification Service||
|495936|Amazon Simple Storage Service||
|495948|Amazon RDS Service||
|497930|AWS Lambda||
|504635|Amazon CloudFront||
|505699|(なし)|全体的な通信に関わってる部分?||
|506835|AWS Key Management Service||
|511298|Amazon CloudWatch||
|519022|Amazon Virtual Private Cloud||
|520642|Amazon ElastiCache||
|524619|Amazon Glacier||
|524834|Amazon Elastic Compute Cloud|EC2に係る従量分?|

一部の請求から抜粋しただけでもこれだけのコードが確認出来た。
Hubotで問い合わせは期間とサービス名に絞ろうと思うのでこのコードが分かると素敵かもしれない

CSVファイルの形式だが、1行目はラベル、実際のデータはRecordTypeに"LineItem"となっているもの、あと"Rounding"にコンソリデーションに伴って出た誤差の料金が出ているようなので計算にはこれも含める必要がある

# いろいろ費用が見えて感じたこと

自分が試験環境で使っているAWSの料金が出てくると止め忘れてたものとか放置でも課金が続いているものなども分かってきて結構ドキドキする。

経理担当の人はこれに為替問題が絡んだり、いろいろして大変なのだろうな。感謝してます。
Objective-Cのクラス初期化



# Objective-Cのクラス初期化

1. `+ (void)initialize`を利用
2. `+ (void)load`を利用
3. `__attribute__((constructor))`を利用

*＊こちらの説明は動的ロードなどによる挙動は考慮してないです*

### 1.`+ (void)initialize`を利用

#### 呼ばれるタイミング

- クラスが最初に利用される直前

#### 注意点

- サブクラスで`+ (void)initialize`を実装しないとスーパークラスの`+ (void)initialize`が呼ばれるので複数呼ばれる前提で実装する

``` objc
@interface Parent : NSObject
@end
@implementation Parent
// このinitializeはParentクラスとChildクラスが最初に使われる時に
// 呼ばれるので２回呼ばれることになる。
// なのでクラスを確認するかdispatch_onceなどを利用して初期化する
+ (void)initialize
{
    if (self == [Parent self]) {
        NSLog(@"initialize %@", [self class]);
    }
    
//    dispatch_onceを利用
//    static dispatch_once_t onceToken;
//    dispatch_once(&onceToken, ^{
//        NSLog(@"initialize %@", [self class]);
//    });
}
@end

@interface Child : Parent
@end
@implementation Child
@end
```

- `+ (void)initialize`は各クラスで一度しか呼ばれないのでクラス本体でのみ実装してカテゴリでは実装しない

``` objc
@implementation Parent
+ (void)initialize
{
    NSLog(@"initialize %@", [self class]);
}
@end

@implementation Parent (category)
// NG !!
+ (void)initialize
{
    NSLog(@"initialize %@", [self class]);
}
@end
```

- クラスがプログラム内で利用されなければ呼ばれない

### 2. `+ (void)load`を利用

#### 呼ばれるタイミング

- クラスがメモリにロードされた直後、main関数が呼ばれる前

#### 注意点

- 他のクラスはまだロードされてない可能性があるので他のクラスは利用しない

``` objc
@implementation Parent
+ (void)load
{
    // NG !!
    OtherClass *otherClass = [OtherClass new];
}
@end
```

- クラス本体とカテゴリで複数実装すると全て呼ばれる

``` objc
@implementation Parent
+ (void)load
{
    NSLog(@"load");
}
@end

@implementation Parent (category)
+ (void)load
{
    NSLog(@"load by category");
}
@end

@implementation Parent (category2)
+ (void)load
{
    NSLog(@"load by category2");
}
@end
```


### 3. `__attribute__((constructor))`を利用


#### 呼ばれるタイミング

- main関数が呼ばれる直前、全クラスがロード済み

``` objc
@interface Parent : NSObject
@end

__attribute__((constructor))
static void initialize_class()
{
    NSLog(@"initialize_class");
}

@implementation Parent
+ (void)initialize
{
    if (self == [Parent self]) {
        NSLog(@"initialize %@", [self class]);
    }
}

+ (void)load
{
    NSLog(@"load");
}
@end

int main(int argc, char * argv[]) {
    @autoreleasepool {
        
        Parent *p = [Parent new];
        NSLog(@"%@", p);
    }
}

// ログは以下のように表示される
// load
// initialize_class
// initialize Parent
// <Parent: 0xXXXXXXXXXXX>
```

#### 注意点

- これは正確に言うとObjective-Cの機能ではなくGCC提供の関数属性機能です。

  [GCC - Declaring Attributes of Functions](https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html)


- 複数の`__attribute__((constructor))`は優先度を指定して呼ばれる順番を指定可能

``` objc
__attribute__((constructor(2)))
static void initialize_class2()
{
    NSLog(@"initialize_class 2");
}


__attribute__((constructor(3)))
static void initialize_class3()
{
    NSLog(@"initialize_class 3");
}


__attribute__((constructor(1)))
static void initialize_class1()
{
    NSLog(@"initialize_class 1");
}


// ログは以下のように表示される
// initialize_class 1
// initialize_class 2
// initialize_class 3
```