OmniAICreator/Qiita-1.07M huggingface dataset:
Python で継承 しようとして TypeError: must be type, not classobj と言われてつらかった思い出

Python で継承しようとして super と init したけど、
TypeError: must be type, not classobj
とか言われてつらかった時の思い出

まず、Pythonのバージョン

```lang:shell
$ python -V
Python 2.7.10
```


以下のクラスを継承して、別のクラスを作ろうとしていた。
継承元クラス

```lang:hogehoge.py
class Client():
    def __init__(self, url, **kwargs):
```

継承先クラス

```lang:manager.py
import hogehoge

class Manager(hogehoge.Client):
    def __init__(self, url, *kwargs):
        super(Manager,self).__init__(url, *kwargs)
```

使ってみる

```lang:shell
$ python
>>> import manager
>>> cl = manager.Manager("https://example.jp")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "manager.py", line 10, in __init__
    super(Manager,self).__init__(url, *kwargs)
TypeError: must be type, not classobj
```

ググってもよくわからなかった。

最終的にたどり着いたstackoverflowが以下。

python - super() raises "TypeError: must be type, not classobj" for new-style class - Stack Overflow
http://stackoverflow.com/questions/9698614/super-raises-typeerror-must-be-type-not-classobj-for-new-style-class

？？オブジェクトに新しいのと古いのがある？？
Pythonの型とクラスの関係については以下参照

>python の型とクラスの関係 — ぱいそんにっき
>http://pydiary.bitbucket.org/blog/html/2013/10/12/type.html

Pythonには、2種類のクラス ~~オブジェクト~~ がある。
1. classobj
2. type

上記の hogehoge.py で作られているインスタンスは、古い classobj で type ではないので、super できないよ。というエラーのようだ。

解決策は以下。~~継承先クラスで 親クラスを object として読み込む~~
Clientとobjectの両方を多重継承する
@shiracamus さんありがとうございます。

```lang:manager.py
import hogehoge

class Manager(hogehoge.Client, object):
    def __init__(self, url, *kwargs):
        super(Manager,self).__init__(url, *kwargs)
```

Python 初心者なので間違いなどあればご指摘ください。
<meta http-equiv="X-UA-Compatible" content="foo">について

IEはバージョンによってレンダリング方法が異なる。そこで、以下ようにmetaタグを指定することでレンダリング方法を指定できる。```"IE=edge"```とすれば、使用しているIEの最新の標準モードでレンダリングするようになる。

~~~html:
<meta http-equiv="X-UA-Compatible" content="IE=edge">
~~~

以上
htmlの条件付きコメント

# 条件付きコメント
以下のタグは、IE7未満のIEだけが非コメントとして解釈する。それ以外のブラウザはコメントとして解釈する。

~~~html:条件付きコメント
<!--[if lt IE 7]>
<foo></foo>
<![endif]-->
~~~

上例の「IE7未満」という条件部分は他にも次のようなものがある。

~~~html:条件の例
<!--[if lt IE 7]> IE7未満 <![endif]-->
<!--[if IE 7]> IE7 <![endif]-->
<!--[if IE 8]> IE8 <![endif]-->
<!--[if gt IE 8]> IE8 以上 <![endif]-->
~~~

# 使い道
これを利用した次のようなテクニックがある。

- IEのバージョンごとに異なるクラスを与える

~~~html:異なるクラス
<!--[if lt IE 7]>
<html class="no-js lt-ie9 lt-ie8 lt-ie7">
<![endif]-->
<!--[if IE 7]>
<html class="no-js lt-ie9 lt-ie8">
<![endif]-->
<!--[if IE 8]>
<html class="no-js lt-ie9">
<![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
~~~

- 低いバージョンのIEに警告を出す

~~~html:警告を出す
<!--[if lt IE 7]>
<p class="browserupgrade">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->
~~~

- es5-shim.jsなどでES5対応させる

IE8以前ではECMAScript5の機能が実装されていない。そういう場合、その機能を提供するes5-shim.jsを読み込ませて対応する必要がある。

~~~html:es5-shim.jsやjson3.jsをロード
<!--[if lt IE 9]>
  <script src="bower_components/es5-shim/es5-shim.js"></script>
  <script src="bower_components/json3/lib/json3.min.js"></script>
<![endif]-->
~~~

以上
Elixirでハッシュ関数を扱う。


MD5とかSHA1、SHA256とかのやつです。

Elixirには、標準モジュールに用意されていない為、
Erlangの`:crypto`モジュールを使用します。

## 寄り道 - Rubyの場合

Elixirの前にRubyでの結果を比較するために、Rubyでハッシュ値を求めてみます。

RubyではDigestモジュールを使用すると以下のようなハッシュ値を得られます。

```
irb(main):016:0> Digest::SHA256.hexdigest("hogehoge")
=> "4c716d4cf211c7b7d2f3233c941771ad0507ea5bacf93b492766aa41ae9f720d"
```

## crypto単体で使った場合

`:crypto`モジュールでは、戻り値の値が、バイナリで返却されます。
扱いやすくするために文字列にエンコードする必要があります。

```
pry(6)> :crypto.hash(:sha256, "hogehoge")
<<76, 113, 109, 76, 242, 17, 199, 183, 210, 243, 35, 60, 148, 23, 113, 173, 5, 7, 234, 91, 172, 249, 59, 73, 39, 102, 170, 65, 174, 159, 114, 13>>
```

## エンコードをした場合

エンコードには、Baseモジュールの`encode16`ファンクションを使用します。
これを行なうことで、Rubyやその他ハッシュ関数を求めるライブラリと同じ結果を得られるようになります。

```
pry(7)> :crypto.hash(:sha256, "hogehoge") |> Base.encode16(case: :lower)
"4c716d4cf211c7b7d2f3233c941771ad0507ea5bacf93b492766aa41ae9f720d"
```

実際に使う場合は以下のようなモジュールにして使っています。

```
defmodule Digest do
  def sha256(data) do
    :crypto.hash(:sha256, data) |> Base.encode16(case: :lower)
  end
end
```

参考

https://gist.github.com/10nin/5713366

おわりです。
コマンドプロンプトでタイムゾーンとアカウントと設定

## timezone

* [Windows AzureのTimezoneとその設定の変更方法 | Azure Fan](https://azurefan.wordpress.com/2011/09/28/windows-azure%E3%81%AEtimezone%E3%81%A8%E3%81%9D%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%AE%E5%A4%89%E6%9B%B4%E6%96%B9%E6%B3%95/)

```bash:JST9に設定
tzutil /s "Tokyo Standard Time"
```

* [Tech TIPS：Windowsのコントロールパネルの各アイテムをコマンドラインから起動する - ＠IT](http://www.atmarkit.co.jp/ait/articles/0507/02/news016.html)

```bash:地域と言語のオプション
intl.cpl
```

## RDPのポート変更

* 3389->9100の例

```rb:firewall通信許可
netsh advfirewall firewall add rule name="tcp9100" localport=9100 dir=in action=allow protocol=TCP
```

```registry:9100.reg
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]
"PortNumber"=dword:0000238c
```

```bash:バッチファイルの場合
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d
 0x0000238c /f
```

![rule.png](https://qiita-image-store.s3.amazonaws.com/0/25728/46a99880-397c-39ec-713b-011b97bf79a0.png)


```rb:firewall通信許可を削除したい場合
netsh advfirewall firewall delete rule name="tcp9100"
```

## chocolatey

* [Chocolatey Gallery](https://chocolatey.org/)

> @powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin

```
cinst -y firefox
cinst -y filezilla.server
cinst -y 7zip
```

* FileZilla Serverを起動時、"could not load TLS network. Aborting start of administration interface"エラーが出る場合
    * [KB2533623](https://support.microsoft.com/en-us/kb/2533623)
    * [windows7用](https://www.microsoft.com/en-us/download/details.aspx?id=26764)


![スクリーンショット_2016-06-17_05-16-44.png](https://qiita-image-store.s3.amazonaws.com/0/25728/70868f1e-c6bd-031c-9dc3-e7371525589e.png)


## アカウント作成

* [Tech TIPS：Windowsのnet userコマンドの使い方 - ＠IT](http://www.atmarkit.co.jp/ait/articles/0609/02/news014.html)

```bash:アカウント作成
net user user01 /add
```

```bash:パスワードの指定(*でパスワード入力を求められる)
net user user01 *
```

```bash:グループに追加
net localgroup administrators user01 /add
```

```bash:所属グループの確認
net user user01
```

## その他

```bash:自動ログインの設定
control userpasswords2
```

```bash:再起動
shutdown -r -t 1
```
CloudatCost API v1を使ってreset(強制再起動)する

## 参考

* [CloudatCost API v1](https://panel.cloudatcost.com/api-details.php)

## 準備

* Settings > API KEYの生成
* API Access IPの指定 (指定しないとerrorになる)

## スクリプト

```bash:reset.sh
C_KEY="xxxxxxxxxxxxxxxxxxxxxxxxx"
C_LOGIN="xxxxxxx@xxxx.com"
C_SID="111111111"
C_URL="https://panel.cloudatcost.com/api/v1/powerop.php"

curl --insecure --data "key=${C_KEY}&login=${C_LOGIN}&sid=${C_SID}&action=reset" ${C_URL}
```

```bash:error
{"status":"error","time":1462604146,"error":104,"error_description":"invalid ip address connection"}
```

```bash:ok
{"status":"ok","time":1462604226,"api":"v1","serverid":"111111111","action":"reset","taskid":1111111111111,"result":"successful"}
```
ActiveRecordの使い方

#はじめに
Railsで開発をするとき、RDBへのデータ操作はActiveRecordを介して実施する。DBデータの変更がオブジェクトの変更に抽象化されるため、SQLを知らなくてもデータベースへのデータの書き込み、取り出し、上書き、削除といった操作ができることができるのだけど、SQLをある程度知っている人には辛かったりする。（このSQLを書くためには、　ActiveRecordでどう書けばいいんだ？的な）なので、ここの記事にまとめておく。

#前提

扱うモデルは下のようなテーブルとする。

usersテーブル

```
mysql> desc users;
+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| id              | int(11)      | NO   | PRI | NULL    | auto_increment |
| organization_id | int(11)      | YES  |     | NULL    |                |
| name            | varchar(255) | NO   |     | NULL    |                |
| address         | varchar(255) | NO   |     | NULL    |                |
| created_at      | datetime     | NO   |     | NULL    |                |
| updated_at      | datetime     | NO   |     | NULL    |                |
| retired         | tinyint(1)   | NO   |     | 0       |                |
+-----------------+--------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)

```
#確認方法

User::ActiveRecord_Relationクラスのインスタンスメソッド(to_sql)
で確認できる。
例)

```rb
pry>User.all.to_sql
=> "SELECT `users`.* FROM `users`"
```

#CRUD系操作
## SELECT
###１テーブルの検索

|目的  |SQL  |ActiveRecord  |
|---|---|---|---|
|全件取得<br>(すべてのカラム)  |select * from users;  |User.all  |
|全件取得<br>(カラム指定)  |select id, name from users;  |User.all.select('id,name') <br> User.all.select([:id,:name]) |
|ソート<br>(昇順)|select * from users order by name;|User.all.order(:name)|
|ソート<br>(降順)|select * from users order by name desc;|User.all.order("name desc")|
|条件指定<br>(=)|select * from users where id = 2;|User.all.where(id: 2)|
|条件指定<br>(<, >)|select * from users where id > 5;|User.all.where('id > 5')|
|条件指定<br> (IN句)|select * from users where id in (2,3,4);|User.all.where(id: [2,3,4])|
|条件指定<br>(like句)|select * from users where  address like a%';|User.all.where("address like 'a%'")|
|件数カウント(count)|select count(*) from users|User.all.count|
|重複排除(distinct)|select distinct name from users |User.all.uniq(:name)|
###複数テーブルのJOIN,検索
WIP
##INSERT
WIP
##UPDATE
WIP
##DELETE
WIP
#ヒント句
#サニタイズ
WIP
#bind変数
WIP
CentOS7でnginx入れたらハマったのでメモ

# 環境
vagrant on mac

```
[vagrant@localhost ~]$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
```

# 問題
```
sudo yum install nginx
sudo systemctl start nginx
```

nginxインストールして起動したが、ブラウザからnginxページを参照できない

# 解決
```
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload
```

firewall設定を変更したらブラウザからnginxページを参照できるようになった
via http://qiita.com/yanagikouta/items/6c2b0cbd02876e61c71c

# ansible task
```
- name: Install epel
  sudo: yes
  yum: name=epel-release state=latest

- name: Install nginx
  sudo: yes
  yum: name=nginx state=latest

- name: Firewall
  sudo: yes
  firewalld: service=http permanent=true state=enabled immediate=true

- name: Start nginx
  sudo: yes
  service: name=nginx state=started enabled=yes
```

# 経緯
CentOS6で使っていたansibleをそのまま流したらハマった
"chmod -x /bin/chmod"をどうやって直しますか？

こんなワイルドなコマンドを実行したことはありませんが、問題はこうです。

```bash
chmod -x /bin/chmod
chmod +x /bin/chmod
bash: /bin/chmod: Permission denied
```

賢い解決方法はこうです。

```bash
cp /bin/touch /bin/changeme
cat /bin/chmod > /bin/changeme
changeme +x /bin/chmod
```

僕は目からうろこでした。

ちなみにLinuxに詳しい人の回答はこうなります。

```
/lib64/ld-linux-x86-64.so.2 /bin/chmod +x /bin/chmod
```

## 参考リンク

- [reddit - I guess I broke Linux? I ran "chmod 400 chmod" and now if I run chmod I get permission denied. Help?](https://www.reddit.com/r/linux/comments/1p3bk6/i_guess_i_broke_linux_i_ran_chmod_400_chmod_and/)
fluent-plugin-has-keys を作ってみた


## 背景
Fluentd 運用中、レコードに指定した key がないとランタイムエラーを起こしてしまうプラグインを利用する場合、先に key がないレコードを破棄したいという要求がありました。

調査不足かも知れませんが、既存のプラグインに key の有無でフィルターするものが無かったため [fluent-plugin-has-keys](https://rubygems.org/gems/fluent-plugin-has-keys) を作成しました。今回初めて rubygems のアカウント登録したような私のプラグインなので、動作の保証はできないですが、もし全く同じことで困られた方がいらっしゃれば参考になると幸いです。

## fluent-plugin-has-keys とは
[fluent-plugin-has-keys](https://rubygems.org/gems/fluent-plugin-has-keys) は、fluentd.conf で指定された keys がレコード内に含まれない場合、そのレコードを破棄するプラグインです。

利用する場合には、fluentd.conf に以下の様な filter 節を追加します。

```fluent-plugin-has-keysの設定例
<filter test>
  @type has_keys
  keys  hoge, foo
</filter>
```
この節を追加すると、test タグを持つレコードは hoge と foo 両方の key を含まないと破棄されます。具体的には、上記の設定のもと、下記の入力があった場合、

```
2016-05-03T11:22:33 test {"hoge" => "fuga", "foo" => "bar"}
2016-05-03T11:22:34 test {"hoge" => "fuga"}
2016-05-03T11:22:35 test {"foo" => "bar"}
2016-05-03T11:22:36 test {"spam" => "ham"}
2016-05-03T11:22:37 test {"hoge" => "fuga", "foo" => "bar", "spam" => "ham"}
```

hoge と foo の key を含む、以下の 2 レコードだけが出力されます。

```
2016-05-03T11:22:33 test {"hoge" => "fuga", "foo" => "bar"}
2016-05-03T11:22:37 test {"hoge" => "fuga", "foo" => "bar", "spam" => "ham"}
```

## まとめ
fluent-plugin-has-keys は key がないためにプラグインがランタイムエラーを起こし、Fluentd の動作も停止させてしまうことを回避するために作りました。ランタイムエラーに依る動作の停止は deep_copy などの機能で防げる場合もありますが、エラーそのものも起こしたくない場合、このプラグインが役に立つのではないかと思っています。

これから、このプラグインが日々の運用に耐えうるのかを検証し、より安心して使っていただけるようにしたいと思っています。反対に、この記事を見られた方で、このプラグインがなくとも同じことができるという場合はコメント頂けると幸いです。
【 Hubot】Mac OSX環境でHubotの初期設定ができない時の対処方法

Mac OSXでHubotをセットアップしようとしたら詰まったのでメモです。

# Hubotのインストール
Hubotが動作する環境をセットアップするのは、各種ネットのページに記載があるので、説明はそちらに譲ります。

尚、公式のドキュメントは、<a href="https://github.com/github/hubot/tree/v2.9.3/docs#getting-started-with-hubot" target="_blank">こちら</a>です

# Hubotの初期設定
環境が出来たら、ドキュメントの通り早速、 `sudo yo hubot`を実行しました。
```
$sudo yo hubot
===省略===
? Owner xxxx@gmail.com
? Bot name xxxx
? Description xxxx xxxx
? Bot adapter (campfire) slackgot back false



/usr/local/lib/node_modules/yo/node_modules/rx/dist/rx.js:77
    throw e;
    ^
true
```

ん？ コケた。
どうやらMacだけでなく、UbuntuやCentOSでも同じような事象が起きているようで、Issueがありました(2016/05/07時点)。
https://github.com/github/hubot/issues?utf8=%E2%9C%93&q=rx.js%3A77


# 暫定的な解決方法
Issueの中であった解決方法は、以下のようなワンライナーで実行する方法です。
```
yo hubot --owner="OWNER <owner@example.com>" --name="TestBot" --description="Test Bot" --adapter=slack
```
各オプションでつけているのは適宜ご自身の環境で実行したいものへ変換してください。
尚、以下の環境で成功したのを確認しております。
- Mac OSX ElCapitan 10.11.4
- node v6.0.0
- npm 3.8.6
- yo 1.7.1
- hubot 2.18.0

上記の私の環境でもうまくいきました。

同じような事象で困っている方の一助になれれば幸いです。
Realm Fine-Grained Notifications を利用する際の追加読み込み処理の Tips


[Realm 0.99](https://realm.io/jp/news/realm-objc-swift-0.99.0/) からリストに対するオブジェクトの追加・変更・削除情報それぞれをコールバックの引数として得られるようになりました :tada: 


そこで上記を利用したリストの追加読み込み処理を実装した際に遭遇した現象をメモします。

# 現象

リストの変更通知は監視したスレッド（基本的にはメインスレッド）の現在の Runloop が終了した後に通知が届くようです。
そのため `UIScrollView` がスクロール中は Runloop が終了しないため、リストをスクロールしながら追加表示するということができませんでした。


# 対応

オブジェクトの保存後に強制的にメインスレッドの Runloop を動かしてあげるとスクロールしながら追加表示がうまくいきました。

```swift
func tick() {
    dispatch_async(dispatch_get_main_queue()) {
        NSRunLoop.currentRunLoop().runUntilDate(NSDate(timeIntervalSinceNow: 0.1))
    }
}
```

```swift
// API レスポンスなどの別スレッドでの処理
try! realm.write {
    // オブジェクトの保存
}

tick()  // メインスレッドの Runloop を動かす
```


# 確認用サンプル

`ViewController.doTick` を変更してビルドすると挙動が確認できます。

https://github.com/sora0077/RealmObserverTest
使用しているテーマを崩さずに透明なActivityを作る方法

訳あってAlertDialogをメインとは別のActivityに表示し、かつ透過して裏のActivityが見えるように表示しなければならない時があった。

一番簡単な方法としてAndroidManifest.xmlに1行追記する方法があるが、これだとスタイルや文字色が使っていたテーマとは変わってしまう。
styles.xmlを編集して同じテーマで透過する方法を記載する。

#アプリケーション詳細
Target Sdk Version : API 19:Android 4.4(KitKat)


#AndroidManifest.xmlに追記する方法

AndroidManifest.xmlの透過したいActivityに次の1行を追記する。

```AndroidManifest.xml
android:theme="@android:style/Theme.Translucent"
```

これにより透過はされる。
しかし昔のデザインっぽく見える。

![device-2016-05-07-151850_s.png](https://qiita-image-store.s3.amazonaws.com/0/122141/b752c721-7b29-c6cc-628e-6ea5dcc6c694.png)


#styles.xmlを編集して使用中のテーマと同じテーマで透過する方法

app>res>values>style.xmlのファイルを編集する。

自分の環境だと、デフォルトでBase.Theme.AppCompat.Light.DarkActionBarを使っていた。

```styles.xml
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
</resources>
```

透過するには以下の3行をstyle内に追記する。

```xml
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowTranslucentNavigation">true</item>
```

デフォルトのスタイルに追記してもいいし、新たなスタイルを作っても良い。
自分はデフォルトのスタイルは別のActivityで使用していたので、新しく作ることにした。
style nameは重複しないようにTransparencyThemeと記述。

```styles.xml
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <style name="TransparencyTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowTranslucentNavigation">true</item>
    </style>

</resources>
```

これでAndroidManifest.xmlのactivity内で以下のように指定すれば透過されたテーマを使用できる。

```AndroidManifest.xml
<activity
android:name=".SampleActivity"
android:theme="@style/TransparencyTheme"></activity>
```

![device-2016-05-07-151949_s.png](https://qiita-image-store.s3.amazonaws.com/0/122141/c7b90127-4d68-4750-67ee-366458834681.png)

これでBase.Theme.AppCompat.Light.DarkActionBarのテーマのまま透過したActivityを表示することができた。

以上
Vagrant(CentOS7) + Rails環境でホストのブラウザからサーバ接続できなかった時の対処


##大まかな流れ
Vagrantの中にRails環境を導入
↓
Mysql,Railsの導入はできた
↓
いざRailsを走らす
↓
ローカル環境ではアクセスすることができたが,ホストOSでのブラウザ接続が出来なかった← __これが問題__

> ※環境構築について:[Vagrant 1.8 + CentOS 7 + VirtualBox 5 + Ruby on Rails + Mysqlで開発環境構築](http://qiita.com/SanoHiroshi/items/892a8516f4a6445e1e05)を参照しながら行いました.(すごくわかりやすい説明でやりやすかったです.)

##問題点について
- Railsが動いているにもかかわらずローカルのみで動き,ホストサーバに接続できなかった.

実際の画面はこんな感じ
<img width="1280" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/27126/565aa9dd-cfde-37ef-9aea-6ba8a49e4ea4.png">



##解決方法

###行った解決方法①
__Railsの起動方法を変えてみた.__
Rails var4.2以降では通常の起動ではローカルのみの起動となってしまうので
オプションで `-b`とIPアドレス(基本的に0.0.0.0)
`rails s -b 0.0.0.0`

__結果__
<img width="1280" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/27126/2869ec0d-43eb-1429-813c-dc63faf932f5.png">


ダメでした...
####原因
そもそも3000番ポートが空いてなかった.

###行った解決方法②
__VagrantFileを書き換えてみる.__
まずゲストの3000番ポートとホストの3000番ポートを開くように設定ファイルをvagrantfileを編集する.


```Vagrantfile22行目〜26行目
  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine. In the example below,
  # accessing "localhost:8080" will access port 80 on the guest machine.
  # config.vm.network "forwarded_port", guest: 80, host: 8080
  #以下にこの文章を付け足す
  config.vm.network :forwarded_port, guest: 3000, host: 3000
```

次にVagrantfile に適当なIPアドレスの割り当て設定をしてみる.

```Vagrantfile30行目〜32行目
  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  #以下にこの文章を付け足す
  config.vm.network :private_network, ip: "192.168.33.10"
```

Vagrantfileを編集したあと`vagrant reload`で設定を読み込む`

>参考サイト:[Vagrantの仮想環境でrails serverで動いているアプリケーションにMacのブラウザからアクセスしてみる](http://fuzz-jpn.com/blog/vagrant_rails_server_browser/)

__結果__
<img width="1280" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/27126/1c480fac-5a85-4baf-73df-2475fcbf9f0b.png">

ダメでした...
サイトで調べてみると,ほとんどの人がここまででちゃんとホスト側のブラウザからアクセスできているみたいです...

###行った解決方法③
サイトを次々調べていくうちに1つだけ違った方法があったので紹介.
__Firewalld(iptablesのCentOS7用)をオフにする.__

vagrant ssh内で

```vagrant-ssh後に行うコマンド
$ sudo systemctl stop firewalld.service
# firewalld を無効にする
$ sudo systemctl mask firewalld.service
$ sudo systemctl list-unit-files | grep firewalld
# OS 起動時もfirewalldが起動しないようにする
```
を実行し,Railsを走らせる...

>参考サイト:[開発のわだち（３）：自分の開発環境を作る【２】](http://neutligen.hatenadiary.com/entry/2016/03/14/170016)


__結果__
![rails_first_view.png](https://qiita-image-store.s3.amazonaws.com/0/27126/759c66b7-84d9-e275-2cd4-16af793f8116.png)


!!!!
ついにホストのブラウザからサーバアクセすることが出来ました!

__解決方法①と解決方法②,解決方法③__を組み合わせることでサーバアクセスが出来ました.

おしまい.
FuelPHPでindex.phpを省略する

誰もが調べるであろう「index.phpの省略」・・・
（例えば http://localhost/blog/public/index.php/post を http://localhost/blog/public/post でアクセスしたい）
ここでえらくハマっていたので覚え書き。

## 調べたら出てくる変更
調べたらすぐに出てくる3つの変更。

```fuel/app/config/config.php
/**
 * index_file - The name of the main bootstrap file.
 *
 * Set this to 'index.php if you don't use URL rewriting
 */
- //'index_file' => false,
+ 'index_file' => false,
```
```PROJECT_NAME/public/.htaccess
#Remove index.php from URL
- #RewriteCond %{HTTP:X-Requested-With} !^XMLHttpRequest$
- #RewriteCond %{THE_REQUEST}               ^[^/]*/index\.php [NC]
- #RewriteRule ^index\.php(.*)$         $1 [R=301,NS,L]

+ RewriteCond %{HTTP:X-Requested-With}  !^XMLHttpRequest$
+ RewriteCond %{THE_REQUEST}                ^[^/]*/index\.php [NC]
+ RewriteRule ^index\.php(.*)$          $1 [R=301,NS,L]
```
```httpd.conf
- AllowOverride None
+ AllowOverride All
```
## これをやってなかった
apacheの設定。mod_rewrite読み込み有効にしてなかった…！

```httpd.conf
- #LoadModule rewrite_module libexec/apache2/mod_rewrite.so
+ #LoadModule rewrite_module libexec/apache2/mod_rewrite.so
```

### 参考サイト
おかげさまで解決いたしました。ありがとうございました。
http://pilomen164.hatenablog.com/entry/2013/09/23/191957
負荷テストツールいろいろ


* ApacheBench
* [JMeter](http://jmeter.apache.org/)
 * Java
 * X11
* [Locust](http://locust.io/)
 * Python
* [Tsung](https://www.process-one.net/en/tsung/)

## JMeter
 * CentOS 7.x
 * Gnome

```
# wget http://ftp.riken.jp/net/apache//jmeter/binaries/apache-jmeter-2.13.tgz
# tar xvfz apache-jmeter-2.13.tgz 
# cd apache-jmeter-2.13
# ./bin/jmeter
_java=`LANG=C type java | awk '{print $ NF}'`
```

## Locust
* CentOS 7.x
 * Python 2.7

```
# yum install python-pip --enablerepo=epel
# pip install pip --upgrade
# pip install awscli --user
# yum install python-dev*
# pip install locustio
```

## 参照
* [[Linux][CentOS6.7]Python-2.7.9をインストール](http://www.infology.jp/noknowit/view/platform/2015/11/linux_centos6_7_install_and_uninstall_python_2_7_9_from_source.xhtml)
Nokogiriを使って天気をスクレイピングしてみた


[Nokogiri を使った Rubyスクレイピング [初心者向けチュートリアル]](http://morizyun.github.io/blog/ruby-nokogiri-scraping-tutorial/)を先に読みましょう。

### 実行環境
- OS X El Capitan バージョン 10.11.4
- ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]
- Nokogiri (1.6.7.2)



## 今回スクレイピングするページ
[岩手県の天気 - 日本気象協会 tenki.jp](http://www.tenki.jp/forecast/2/6/)

[![https://gyazo.com/e403ed6a66a8a7b0677139df84c91869](https://i.gyazo.com/e403ed6a66a8a7b0677139df84c91869.png)](https://gyazo.com/e403ed6a66a8a7b0677139df84c91869)


岩手県の各地域の天気をスクレイピングしてみます。

###実装

```weather.rb

# URLにアクセスするためのライブラリの読み込み
require 'open-uri'
# Nokogiriライブラリの読み込み
require 'nokogiri'

# スクレイピング先のURL
url ='http://www.tenki.jp/forecast/2/6/'

charset = nil
html = open(url) do |f|
  charset = f.charset # 文字種別を取得
  f.read # htmlを読み込んで変数htmlに渡す
end

# htmlをパース（解析）してオブジェクトを作成
doc = Nokogiri::HTML.parse(html, nil, charset)

# 日付
puts doc.xpath('//p[@id="forecast_public_date"]').inner_text

doc.xpath('//a[@class="forecast_map_entry"]', '//ul[@id="forecast_list_entries"]/li[position()<8]/a').each do |node|
  # 場所
  place = node.child.inner_text

  # 天気
  weather = node.css('img').attribute('title').value

  # 降水確率
  probability = node.css('span.probPrecip').inner_text

  puts "#{place}の天気は#{weather}で降水確率は#{probability}です。" 
end

```

###実行結果

```

05月08日(日)
盛岡市の天気は晴で降水確率は0%です。
宮古市の天気は晴で降水確率は0%です。
大船渡市の天気は晴で降水確率は0%です。
花巻市の天気は晴で降水確率は0%です。
久慈市の天気は晴で降水確率は0%です。
一関市の天気は晴で降水確率は0%です。
北上市の天気は晴で降水確率は0%です。
釜石市の天気は晴で降水確率は0%です。
二戸市の天気は晴で降水確率は0%です。
八幡平市の天気は晴で降水確率は0%です。
奥州市の天気は晴で降水確率は0%です。
雫石町の天気は晴で降水確率は0%です。
遠野市の天気は晴で降水確率は0%です。
滝沢市の天気は晴で降水確率は0%です。
紫波町の天気は晴で降水確率は0%です。
平泉町の天気は晴で降水確率は0%です。
岩手町の天気は晴で降水確率は0%です。
岩泉町の天気は晴で降水確率は0%です。
軽米町の天気は晴で降水確率は0%です。

```

無事スクレイピングできました！

##XPathに頼らない方法

ここでは、遠野市から軽米町までをスクレイピングしてみます。

###実装

```weather2.rb

# URLにアクセスするためのライブラリの読み込み
require 'open-uri'
# Nokogiriライブラリの読み込み
require 'nokogiri'

# スクレイピング先のURL
url ='http://www.tenki.jp/forecast/2/6/'

charset = nil
html = open(url) do |f|
  charset = f.charset # 文字種別を取得
  f.read # htmlを読み込んで変数htmlに渡す
end

# htmlをパース（解析）してオブジェクトを作成
doc = Nokogiri::HTML.parse(html, nil, charset)

# 日付
puts doc.xpath('//p[@id="forecast_public_date"]').inner_text

doc.xpath('//ul[@id="forecast_list_entries"]/li/a')[0, 7].each do |node|
  # 場所
  place = node.child.inner_text

  # 天気
  weather = node.css('img').attribute('title').value

  # 降水確率
  probability = node.css('span.probPrecip').inner_text

  puts "#{place}の天気は#{weather}で降水確率は#{probability}です。" 
end

```


###実行結果

```

05月08日(日)
遠野市の天気は晴で降水確率は0%です。
滝沢市の天気は晴で降水確率は0%です。
紫波町の天気は晴で降水確率は0%です。
平泉町の天気は晴で降水確率は0%です。
岩手町の天気は晴で降水確率は0%です。
岩泉町の天気は晴で降水確率は0%です。
軽米町の天気は晴で降水確率は0%です。

```

## 参考
[Nokogiri を使った Rubyスクレイピング [初心者向けチュートリアル]](http://morizyun.github.io/blog/ruby-nokogiri-scraping-tutorial/)

[[Ruby]スクレイピングのためのNokogiri利用メモ](http://d.hatena.ne.jp/otn/20090509/p1)

[position - XPath | MDN](https://developer.mozilla.org/ja/docs/XPath/Functions/position)
関数合成：lengthとshowの場合

# はじめに
私は現在Haskell勉強中なのですが、備忘録＆理解を深めるために書いてみたものです。

# 例文
[『関数プログラミング実践入門』](http://www.amazon.co.jp/%E9%96%A2%E6%95%B0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E2%94%80%E2%94%80%E7%B0%A1%E6%BD%94%E3%81%A7%E3%80%81%E6%AD%A3%E3%81%97%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AB-WEB-PRESS-plus/dp/4774169269)には関数合成の例として、以下のような例文が載っています。

```hs
Prelude> let digits :: Int -> Int; digits = length . show
Prelude> :t digits
digits :: int -> Int
Prelude> digits 9
1
Prelude> digits 10
2
Prelude> digits 100
3
Prelude> digits 12345
5
```

このdigitsという合成関数は非負10進整数の桁数を求めるもので、計算過程は以下のようになっています。

```hs
digits 12345
=> (length . show) 12345
=> length (show 12345)
=> length "12345"
=> 5
```

# では・・・
では、**show . length**というように合成してみるとどうなるんだろう……。
気になったので試してみました。

```hs
Prelude> let hoge = show . length
Prelude> hoge "12345" -- 色々引数を試した結果これがうまく入った
"5"
```

文字列の"5"が返ってきました。やっていることはなんとなくわかりそうですが、ちゃんと分解してみます。

```hs
hoge "12345"
=> (show . length) "12345"
=> show (length "12345")
=> show 5
=> "5"
```

なるほど、**リストの要素数を文字列で返す関数**ができあがったのですね。
ということは、hogeに渡してあげる引数は、文字列じゃなくてもよさそう。

```hs
Prelude> hoge [1..10]
"10"
```

一つ一つ分解していくことで、合成関数の理解が少し深まったような気がします。[^1]

[^1]: [『ウメハラ』4巻](http://www.amazon.co.jp/%E3%82%A6%E3%83%A1%E3%83%8F%E3%83%A9-FIGHTING-GAMERS-4-%E3%82%AB%E3%83%89%E3%82%AB%E3%83%AF%E3%82%B3%E3%83%9F%E3%83%83%E3%82%AF%E3%82%B9%E3%83%BB%E3%82%A8%E3%83%BC%E3%82%B9/dp/4041042844)の巻末マンガで、コンボができないという作者に対しウメハラが「そういう時はコンボを分解して練習する」と言っていたのを思い出しました(/・ω・)/
[Go]Goインストールからツイート投稿まで3分クッキング


Goの環境がない状態から、Goツイートするまでを3分間でやってみましょう。

※コンシューマキーやアクセストークン等は既にあることを前提にしています。
 未取得の場合は、https://apps.twitter.com/ にいって設定&取得しましょう。

* Goの環境設定
* anacondaインストール
* ツイート投稿コード作成

Goの環境設定
-

Goはこれだけで簡単に入っちゃいます

    brew install go

Goが入ったことを確認

    go --version

次に、.bashrc等でPATHを設定しましょう

``` .bashrc
export GOROOT=/usr/local/opt/go/libexec
export GOPATH=$HOME/.go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
```

anacondaインストール
-
anacondaはTwitter 1.1 APIが扱えるライブラリーです。

```
go get github.com/ChimeraCoder/anaconda
```

ツイートコード作成
-
コード中のコンシューマキーやアクセストークンは、自分のものと置換してください。

```tweet.go
package main

import (
        "fmt"
        "github.com/ChimeraCoder/anaconda"
        "log"
        "os"
)

func main() {
  anaconda.SetConsumerKey("your-consumer-key")
  anaconda.SetConsumerSecret("your-consumer-secret")
  api := anaconda.NewTwitterApi("your-access-token", "your-access-token-secret")
 
  text := os.Args[1]
  tweet, err := api.PostTweet(text, nil)
  if(err != nil){
    log.Fatal(err)
  }
  fmt.Println(tweet.Text)
}
```

ビルドしましょう。

```
go build tweet.go
```
同じディレクトリにtweetというバイナリファイルが生成されているはずです。
では実行してみましょう。

```
./tweet "進捗どうですか？"
```

これでツイートが投稿できるはずです。
実際にTwitterで確認してみてください。


参考
-
Go言語の開発環境セットアップ http://qiita.com/awakia/items/7bf03fd96a74502073b8
情弱だがGoで画像付きツイートしたい http://qiita.com/stenpel/items/01f6ef20c4691564faa5
tutum/wordpressでwordpressをアップグレードする

```console
# find /var/www/html/ -type d -exec chmod 750 {} \;
# find /var/www/html/ -type f -exec chmod 640 {} \;
# chown -R www-data:www-data /var/www/html/wp/
```

とりあえず、wp-content以下がwww-dataとなっていたのでそれに習った

権限設定の参考
[WordPressディレクトリのパーミッションをセキュアに | VPSサーバーでWebサイト公開　備忘録　~Linux、MySQLからAJAXまで](http://wordpress.honobono-life.info/wp-config/wordpress%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AE%E3%83%91%E3%83%BC%E3%83%9F%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2%E3%81%AB/)
dockerで立ち上げたコンテナにログインする

```
docker exec -it [コンテナ名] /bin/bash
```
これで、rootでログインできる。

root以外でログインしたい時は

```
docker exec -it [コンテナ名] --user [ユーザー名または UID] /bin/bash
```
でログインする。

コンテナ名でログインできないときは、以下コマンドで一覧を参照してコンテナIDを指定するとうまくいった。

```
docker ps
```

取得したコンテナIDを使って

```
docker exec -it [コンテナID] /bin/bash
```

とすることでログインできる。
購入直後のMacでGitコマンドを使えるようになるまで

**やっと念願のMacを買ってもらえた！これで開発がバリバリ進められるぞ！
でも「git インストール」でググってもhomebrewでのインストール方法しか出てこないじゃないか！
homebrewはどうやって入れるんだよったく！**

と思った皆さん、こんにちは。

# Gitをインストールする方法
1. [公式サイト](https://git-scm.com/downloads)からポチポチとダウンロードしてインストールする**（homebrewは不要）**
2. homebrewを使ってインストール

## 公式サイトからインストールする方法
[https://git-scm.com/downloads](https://git-scm.com/downloads)へアクセスし、ダウンロードをクリック。

インストーラのダウンロードが完了したら実行しましょう。
インストールまで完了すると、gitコマンドが使えるようになっています。

```lang:terminal
$ git --version
git version 2.8.1
```

## homebrewでインストールする方法
```lang:terminal
$ brew install git
```

これだけです。

### そもそもhomebrewをインストールする方法
以下コマンドを実行しましょう。
※コマンドはrubyですがrubyが入っていなくても走ります。深く考えず突き進みましょう。

```lang:terminal
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

Xcodeが入っていない場合、実行するとメッセージが出ます。
**「"xcrun"コマンドを実行するには、コマンドライン・デベロッパ・ツールが必要です。ツールを今すぐインストールしますか？」**
「インストール」を選択して次に進みましょう。
※Xcodeを入れていただいても構いません。

下記コマンドでメッセージが返ってくるとインストール完了です。

```lang:terminal
$ brew doctor
Your system is ready to brew.
```


# その他
## Gitをアップデートする方法
### 公式サイトの場合
最新版のインストーラをダウンロードして実行しましょう。

### homebrewからの場合
下記コマンドを実行しましょう。

```lang:terminal
$ brew upgrade git
```
SoftEtherを使ってVPN接続 (仮想DHCPサーバ利用）

# 目的
自宅にあるパソコン（サーバ）にインターネット上のパソコンからアクセスできるようにする。
VPN接続したときのIPアドレスを自動に設定されるようにするところを悩んだのでメモしておく

# 構成概略
インターネット網を隔てた場所にパソコン１やパソコン２がある。
自宅パソコンサーバはインターネットルータを介して、インターネット網に接続している。

![vpn構成.png](https://qiita-image-store.s3.amazonaws.com/0/102236/0a425565-d05b-3884-8e4f-1c4e7edc828c.png)
パソコン１やパソコン２から自宅パソコンサーバへアクセスを行うための中継局としてVPNサーバを用いる

パソコン１，パソコン２にはIPアドレスが自動的に割り振られるようにする。
自宅パソコンサーバのIPアドレスは固定値を手動で設定する。


# VPNサーバ

VPNサーバにはDTIの月額500円のVPSを利用する(サーバのOSはCentOS7 )。このサーバにSoftEtherをインストールしてVPNサーバ（およびDHCPサーバ）として機能させる

## SoftEtherのインストールおよび設定

下記サイトに導入方法などについてはまとまっているので割愛する

http://ja.softether.org/


## IPアドレスを自動的に割り当てる(DHCP)ための設定

VPNサーバへ接続したときにIPアドレスが自動的に割り当てられるようにSoftEtherの仮想DHCPサーバ機能を使う。

この機能を使う場合には”Virtual NAT and Virtual DHCP Server(SecureNAT)"ボタンを押し、"Enable SecurityNAT"ボタンを押します。

![Screenshot from 2016-05-07 13:07:44.png](https://qiita-image-store.s3.amazonaws.com/0/102236/aee19b8e-8dba-73d6-ae3b-9aa62a4c3a91.png)

![Screenshot from 2016-05-07 13:07:51.png](https://qiita-image-store.s3.amazonaws.com/0/102236/18e68a40-8791-6822-e666-af6d9f5785b5.png)


その後 "SecurityNAT Configuration"を押して下記のように設定します。

![Screenshot from 2016-05-07 08:54:56.png](https://qiita-image-store.s3.amazonaws.com/0/102236/70f96817-4838-b3d5-b9b8-bb9eb1b5e226.png)

"Virtual NAT Function"はチェックを外すところと、”Virtual DHCP Server Functions"をチェックする。
IPアドレスは "10.xx.xx.xx"に設定。(192.168.xx.xxではうまく動作しなかった）
また、Default Gaeway Addressなどは空白に設定。
コンソールから Yahoo や Huffington Post などの News に飛ぶ

[TopHeadlines](https://github.com/zachnewburgh/top-headlines-cli-gem)

コンソールで様々なニュースの見出しを見る事ができ、興味のあるニュースを選択するとブラウザで表示してくれる Gem。おもしろい！

# 使ってみる

Gem を入れて

```zsh
$ gem install top-headlines
```

実行ファイルを用意してくれているので、実行する

```zsh
# gem の場所に移動
$ cd ~/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/top-headlines-0.2.4
# 実行
$ bin/top-headlines
```

すると、こんな感じでいっぱいメディア名が出てくるので、

![image](https://qiita-image-store.s3.amazonaws.com/0/41416/be5f11c8-fb20-c7cb-3c71-21614ac2d02f.png)

試しに YAHOO と入力すると

![image](https://qiita-image-store.s3.amazonaws.com/0/41416/89fa1210-2a4f-47b9-871a-7b4c09dd5985.png)

ニュース見出しが番号付きで出てきます！
そこで、2 を選択すると、、、

![image](https://qiita-image-store.s3.amazonaws.com/0/41416/a31ec3e4-bb6e-5eae-ef7b-174588836c88.png)

ブラウザで該当のニュースが開きます。
すごい！

おもしろいな。あとでどうやってるかソース見よ。

# どこからでも呼べるようにする

おもしろい Gem なので、どこからでも呼べるようにします。

```zsh
# /usr/local/bin に移動して
$ cd /usr/local/bin

# シンボリックリンクを作成
$ ln -s ~/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/top-headlines-0.2.4/bin/top-headlines
```

これで OK

```zsh
$ top-headlines
/Users/Shohei/.rbenv/versions/2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- ./lib/top-headlines (LoadError)
	from /Users/Shohei/.rbenv/versions/2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /usr/local/bin/top-headlines:3:in `<main>'
```

と思ったら落ちた。`require` で出来ないみたいので、コードをちょっとだけ変更。

```rb:top-headlines
#!/usr/bin/env ruby

# 元々 require './lib/top-headlines'
require_relative '../lib/top-headlines'

TopHeadlines::CLI.new.call
```

できたー

![image](https://qiita-image-store.s3.amazonaws.com/0/41416/742d1bad-f968-12f7-aeea-94d2f01d808f.png)
gulp-jade で JSON ファイルを変数に読み込む方法（gulp-pug v2 対応追記）

jade でサイトを作成していると、共通情報は外部ファイルにまとめて記述したくなります。やはり jade なので、外部ファイルは JSON 形式にまとめておきたいところですね。

# 先に結論
[gulp-data](https://www.npmjs.com/package/gulp-data) を使いましょう。
[gulp-jade](https://www.npmjs.com/package/gulp-jade) に使い方も紹介されてます。

# gulp-data を使わない方法
公式の方法に辿り着く前に、ろくすっぽ調べずに自己流で JSON データをパースしてました…。
果たしてこの方法に需要があるのかどうか分かりませんが、試行錯誤の時間を無為にするのも悔しいので、まあ、こんな方法もあるよーということで、晒しておきます。


```json:site.json
{
  "name": "サイトタイトル",
  "root": "/"
}
```

```jade:demo.jade
//- パースしたJSONデータを格納するグローバル変数
- var data = {}

//- JSON 構文をパースしてグローバル変数の data にデータを格納する mixin
mixin json(name)
  - var oldbuf = buf
  - buf = []
  block
  - data[name] = JSON.parse(buf.join(''))
  - buf = oldbuf

//- 外部 JSON 情報の読み込み
+json('site')
  include site.json

//- 呼び出し
h1: a(href=data.site.root) #{data.site.name}
```
# 解説
jade 標準出力を横取りして JSON をパースしてます。
最後に読み込んだ JSON が標準出力されないよう、バックアップしていた `buf` を書き戻してます。 `buf` は jade の mixins で使われている内部変数ですので、あまり行儀の良いやり方ではありませんが…

強いてこの方法の利点を挙げれば

- gulpfile.js に 設定ファイルの記述なしに jade の構成ファイルの記述内で完結できる
- gulp-data が何らかの理由により使えない環境の代替となる

と言ったところでしょうか。

# gulp-pug v2 対策（2016年6月23追記）

[jade](https://github.com/jadejs/jade) は商標の問題から、[pug](https://github.com/pugjs/pug) に名前が変わりました。また、2016年6月23時点で v2.0 がベータ版リリースされていますが、v1.11から いろいろと内部構成が変わっていて、前述の mixin で横取りする方法が使えなくなりました。

素直に [gulp-data](https://www.npmjs.com/package/gulp-data) を使った方が良さそうですが、ページ毎に適用する JSON ファイルを変更するような運用にしたいので、JSON ファイルの指定は gulpfile.js ではなく、pug ファイル側で指定したいところです。
pug 自体に外部 JSON ファイルをパースする機能があれば良いのですが、残念ながら現時点では自前で用意するしかなさそうです。

## タスク側から pug に記述した JSON ファイルを取得する

pug 本体に手を加えるのは時間がかかりそうなので、手っ取り早く gulpfile.js のタスク処理側でカバーします。
ページ側に特定書式コメントの JSON ファイルのパスを指定しておき、タスクの gulp-data 経由で JSON ファイルを読み込むようにします。

pug コメントの後に続けて `data path/to/filename.json` と記述するルールとします。

```jade:demo.pug
//-data site.json

//- 呼び出し
h1: a(href=data.site.root) #{data.site.name}
```

pug コンパイルのタスクで、前述の JSON パスコメントを検知して、オブジェクトとして取り込むように、以下のように記述します。

```js:gulpfile.js
'use strict';

var gulp = require('gulp');
var pug  = require('gulp-pug');
var data = require('gulp-data');

gulp.task("pug", function(){
  return gulp.src("./*.pug")
    .pipe(data(function(file) {
      var json = {};
      String(file.contents).split("\n").forEach(function(line) {
        if(line.match(/^\/\/\-\s*?data\s+?((\w+)\.json)$/)) {
          json[RegExp.$2] = require("./" + RegExp.$1);
        }
      });
      return { data: json };
    }))
    .pipe(pug({
      pretty: true
    }))
    .pipe(gulp.dest("./"))
   ;
});
```

これで 指定した JSON ファイルの内容を `data.[ファイル名]` のデータとして pug から参照できるようになりました。
【Eddystone-URL × iOS】Eddystone-URL受信アプリをリリースする場合のリジェクト例

### 今回はEddystone-URLを受信し、そのURLをタップするとブラウザが起動するアプリをAppleStoreに申請してみたが、リジェクトを食らった。その内容をメモ書きに残しておく。
---
## リリースした機能

Eddystone-URLを受信すると、tableViewにURLを表示させ、タップすると外部ブラウザを起動させる。


## リジェクトの経緯
今回のアプリは受信専用なので、データがないとtableViewが空の状態。iTunesConnectの審査担当は空データを嫌う傾向にあり、そのせいかメタデータリジェクトくらった。

## リジェクトに関する詳細

指摘されたのは、
1. 「デモビデオを用意しろ」
2. どういったユーザをターゲットにしているのか
3. このアプリを使う用途は何？

＜対応＞
デモビデオに関してはアプリの動作確認用動画を撮影しYOUTUBEにアップロードしたものをアピールメッセージに記述した。

2.と3.については、このアプリがなぜ便利なのかという理由とイベント会場などで使えます、的な内容をアピールメッセージに記述した。

## 苦労した点
1. 仕様に関するものが英語のものが多く、日本語ドキュメントを読み慣れていた自分には読解に苦労した
2. Eddystone-URLを送信する機能も検討したが、GoogleのGithubのドキュメントだけしか情報がない。送信の仕組みの設計を行う際の情報が圧倒的に不足していたのもあり、今回は見送った

結果として以下のリリースを行うことができた。
https://itunes.apple.com/us/app/eddystone-url-on-browser/id1107369528?l=ja&ls=1&mt=8

---
+ 所感

アプリの内部に説明ページを実装していたが、「アプリの用途」と「ターゲット層」を確認してくるということは、審査の際に説明画面を見てないな、と感じた。審査者が日本語を読めないからかもしれないが、基本的に申請時に手順等のメモ書きを書く欄に明確に記述しておかないと通らない。今回のようなデータソースが無い状態のアプリの審査では、デモビデオを初段で用意し、動画URLを貼りつける等やっておくと良い。
技術英語 > all [the reams of] people that were involved. / fair amount of code

How Many People Does It Take To Ship Software?
http://thecodist.com/article/how-many-people-does-it-take-to-ship-software

Projectにどれくらいの人員が必要かという話。

管理に関わる人が増えることで、生産性が低下していくことが書かれている。

> Some of this may be necessary sometimes (I haven’t ever written code for a nuclear plant) but given all the projects I seen with large teams most of them never really justified all <font color=red>the reams of</font> people that were involved.

http://eow.alc.co.jp/search?q=ream
http://eow.alc.co.jp/search?q=reams&ref=sa

(プロジェクトに関わる）大量の人員全て、という意味なのだろう。

<hr>
関連して思い出したのは

http://eow.alc.co.jp/search?q=fair+amount+of

fair amount of code
Windows環境下でbundle installしたら詰まった話

あるプロジェクトでbundle installしたらこけて、しばらく詰まった時の話

# 環境
Windows8.1
cygwin 64bit

# 起きたエラー
eventmachineが入らない。

`/home/ユーザ名/throb-jaico-app/.bundle/ruby/2.3.0/extensions/x86_64-cygwin/2.3.0/eventmachine-1.2.0.1/mkmf.log`にログがあると出たので確認
(エラーをキャプチャし忘れてました)

ログを見るとopensslについての記述が・・・
<b>あれ？opensslなんて入れてないな (^^;)</b>

調べるとopensslをWindows用にしてくれたのがあるようなので、下記を参考に導入した。
http://www.atmarkit.co.jp/ait/articles/1601/29/news043.html

```
$ bundle install
Installing eventmachine 1.2.0.1 with native extensions
```

インストールできた！！
AWS DynamoDBのキー

DynamoDBはNoSQLのマネージドサービス
サクッと使うのにはとても便利だが、考えて使わないととても値段が高い。
アクセス数が多い場合危険
データは3箇所のAZに保存されるため、可用性が高い。気にしなくて良い。

主キーのようなキーについて記録

##Hashキー
-単体でプライマリキーとして利用
-順序を指定しないハッシュインデックスを構成

##Hash-Rangeテーブル
列でHashキー、Rangeキーを指定して、この２つでプライマリキーとする
Rangeキーは並びを保証するため、RangeKeyが使われる

LSIがよく分からない
NVIDIA@Ubuntuのドライバインストール手順

Ubuntuにおいて、NVIDIAのグラフィックボードのドライバをインストールする手順を整理した。

1. [NVIDIA](http://www.nvidia.co.jp/Download/index.aspx?lang=jp)のサイトでドライババージョンを検索。（例：361.42）
2. Ubuntu上でドライバを検索。（例：`apt-cache nvidia-361`）
3. Ubuntu上でドライバインストール（例：`sudo apt-get install nvidia-361`）
4. Ubuntuを再起動（例：`shutdown -r now`）
5. NVIDIA X Server Settings アプリケーションのX Server Informationタブで、NVIDIA Driver Versionを確認。
RailsでIDを露出させないようにする②


[以前の記事](http://qiita.com/dtaniwaki/items/6da4a5672f4ee5029dd8)で[obfuscatable](https://github.com/dtaniwaki/obfuscatable)というgemを作ったのですが、ハッシュ風にエンコードしたIDをデコードしつつレコードを取得する時に、`ActiveRecord`の`find`をうまくoverrideできずにやむなく`find_obfuscated`という別のメソッドを定義していました。
（理由は[後述](#findオーバーライドの課題)）

最近、[hashids.rb](https://github.com/peterhellberg/hashids.rb)という別の方法でIDを変換するgemを発見したため、今回は`find`をオーバーライドして完全に透過的にIDをエンコードするgemを作りました。

https://github.com/dtaniwaki/acts_as_hashids

<img width="691" alt="xxx.png" src="https://qiita-image-store.s3.amazonaws.com/0/22653/3382b186-f6a0-fee4-2e7c-d927c983c6a1.png">

# 使い方

使い方はいたって簡単。

```bash
gem "acts_as_hashids"
```

Gemをインストールして、以下のように`acts_as_hashids`と`ApplicationRecord`に書くだけです。

```rb
class ApplicationRecord < ActiveRecord::Base
  acts_as_hashids
end

class Foo < ApplicartionRecord
end

foo = Foo.create
# => #<Foo:0x007feb5978a7c0 id: 3>

foo.to_param
# => "ePQgabdg"

Foo.find(3)
# => #<Foo:0x007feb5978a7c0 id: 3>

Foo.find("ePQgabdg")
# => #<Foo:0x007feb5978a7c0 id: 3>

Foo.with_hashids("ePQgabdg").first
# => #<Foo:0x007feb5978a7c0 id: 3>
```

こんな感じでエンコードしたIDにも`find`がそのまま使えます。

# findオーバーライドの課題

`find`をオーバーライドしようとした時に最初に思いつくのは、

```rb
class Foo < ActiveRecord::Base
  def self.find(ids)
    # Do whatever
    puts 'Yay'
  end
end

Foo.find('something')
# => "Yay"
```

しかし、このオーバーライドは以下のような場合に失敗します。

```rb
# `bar.foos`は`has_many`でfooを取得すると仮定
bar.foos.find('something')
# ActiveRecord::RecordNotFound: Couldn't find User with 'id'="something"

Foo.where(nil).find('something')
# ActiveRecord::RecordNotFound: Couldn't find User with 'id'="something"
```

なぜかというと、同じ`find`を使っているように見えて、実は関数の定義されている場所が違います。

```rb
bar.foos.class
# => Foo::ActiveRecord_Associations_CollectionProxy

Foo.where(nil).class
# => Foo::ActiveRecord_Relation
```

これらのクラスにmixinされているモジュールをMonkeyパッチすれば簡単なのですが、そこを弄ってしまうと汎用性がなくなってしまいます。

# 解決策

そこで、オーバーライドしたいロジックの`find`を含んだモジュール`FinderMethods`を作成し、各所に動的に`extend`してみます。

## ActiveRecord_Associations_CollectionProxy

これは`has_many`の定義時に生成されるため、

```rb
class Foo < ActiveRecord::Base
  def self.has_many(*args, &block)
    options = args.extract_options!
    options[:extend] = (options[:extend] || []).concat([FinderMethods])
    super(*args, options, &block)
  end 
end

Base.foos.find('something')
# => "Yay"
```

成功です！

## ActiveRecord_Relation

これは`ActiveRecord::Base.relation`として動的に生成されるため、

```rb
class Foo < ActiveRecord::Base
  def self.relation
    r = super
    r.extend FinderMethods
    r   
  end
end

Foo.where(nil).find('something')
# => "Yay"
```

成功です！

-----------------

ということで、このあたりをうまく吸収して、既存のコードに一切手を入れずにIDをエンコードできるgemが`acts_as_hashids`になります。

https://github.com/dtaniwaki/acts_as_hashids
WEBサイトをスクレイピングしてAPI化するimport.ioを使ってみた

# import.ioとは
* https://www.import.io/
* 海外のツール
* WEBコンテンツをスクレイピングして解析し、CSVなどのデータで取得させてくれる
* APIとしてデータ取得も可能。

# 利用方法
## 対象サイトの指定
* 試しにamazonの検索結果を利用
    * http://www.amazon.co.jp/s/ref=nb_sb_noss?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&url=search-alias%3Daps&field-keywords=%E6%A4%85%E5%AD%90
* https://www.import.io/ にアクセスし、窓に解析したい対象URLを入れてtry it outを押すだけ
![import.io_001.png](https://qiita-image-store.s3.amazonaws.com/0/58973/d5296a18-c738-054e-ba74-9984cba38379.png)

## データの分析
* tyr it outが押されるとWEBページが解析され、それがテーブル形式で表示される。
* Save Extractorでデータを保存
![import.io_002.png](https://qiita-image-store.s3.amazonaws.com/0/58973/ad54a414-1ab5-6ca0-98e0-a0a9470ba9b6.png)

## データの追加
* 不要なカラムの削除だけでなく、WEBサイト上の要素を指定してカラムを増やすことも可能。
* Add columnを押す
![import.io_007.png](https://qiita-image-store.s3.amazonaws.com/0/58973/7534e4aa-6964-01fa-7c53-73cbe39ad866.png)
* 解析対象のサイトが表示されるので追加したい要素を選択する
![import.io_008.png](https://qiita-image-store.s3.amazonaws.com/0/58973/4f86bff6-9c8a-252d-c8e8-353a980bd1d9.png)
* 右のウィンドウに指定した要素が絡む情報として表示される
![import.io_009.png](https://qiita-image-store.s3.amazonaws.com/0/58973/55538c2f-5168-8ea8-3a88-49ac49362227.png)
* カラムを保存すると元のテーブルに追加されている。
![import.io_010.png](https://qiita-image-store.s3.amazonaws.com/0/58973/3d670a29-b638-cfe4-bbc1-7c1bcd172ab0.png)


## データの更新タイミングの指定
* 管理画面でデイリー、ウィークリー、マンスリーの単位で自動データ更新の頻度を指定可能
![import.io_003.png](https://qiita-image-store.s3.amazonaws.com/0/58973/78114004-15dc-a477-cb44-136bcfa0589f.png)

## APIによるデータ取得
* Integrateタブを押すとAPIのURLが表示される。
* APIの結果はJSONで返却される。
![スクリーンショット 2016-05-07 2.21.44.png](https://qiita-image-store.s3.amazonaws.com/0/58973/6804cea0-13b0-0751-3111-73dca2e21595.png)

![スクリーンショット 2016-05-07 2.22.10.png](https://qiita-image-store.s3.amazonaws.com/0/58973/e7e9c5f0-c266-7a88-a38e-32dbe6c567df.png)

# 感想
* だいぶ簡単に、ポチポチするだけ少なくともamazonの検索結果で欲しい情報は取得可能
* amazonの検索結果ならamazonから提供されているAPIの方が当然利便性は高い
* APIを提供していないコンテンツの情報取得なら非常に便利。
    * ただしデイリー以上の更新はされないので情報更新の頻度が激しいコンテンツには不向き。
* 無料版ではどうやら扱えるデータ量に限界があるらしい。デイリーで使ったらすぐ限界を迎える可能性あり。
git diffをlessで見たかった。


## やったこと
```sh:.gitconfig
[color]
	diff = always
	diff-highlight = always
```

```bash:bash
$ git diff | diff-highlight | less -R
```

## 説明
単純に `git diff` をパイプで `less` に渡しても、色が付かない状態で表示されてしまうので、 `.gitconfig` でカラーリングの設定をしています。  
`diff-highlight` は変更行に加えて変更箇所もハイライトしてくれる便利ツールです。  


## デフォルトのpagerはless
`git` はデフォルトで `less` が `pager` として設定されているようなので、`git diff` 等は基本的に `less` で見れるはずです。  
ただ、私の環境だけかもしれませんが、表示結果がスクリーンに残ってしまうのは期待する結果ではなかったので、今回は設定し直しました。

## gitconfigでpager設定

```sh:.gitconfig
[pager]
	diff = diff-highlight | less -R
```

上記のような設定にしても、やりたいことは概ね可能だと思います。ただ、やはりスクリーンに結果が残ってしまうので今回は外しました。

## まとめ
`.gitconfig` の設定でなんとか出来ないか探してましたが、難しそうだったので基本的な形で落ち着きました。
Twitterはメモ帳

#前書き

**twitterはメモ帳？は？頭おかしいなこいつ。**

と、思った方。よくタイムラインを眺めてみてください。

時々見るハッシュタグでさかのぼれるようにして、自分の個人的なメモをつぶやく人を！

今、「あ、俺や。」となった人もいるでしょう。

でも、そのツイートを実際、見返しているでしょうか。

忘れるからtwitterを使いメモをしているのに、**そのメモのツイートすらも忘れるのが人間です。**

と同時に、そのメモを見るためだけにTwitterを開くのも面倒くさい時があると思います。

僕は、ツイートしても忘れる派の人間なので、もっとメモを管理しやすくしたいと思いました。

##自己紹介

Twitter [@konojunya](https://twitter.com/konojunya/)

じゅんじゅんというニックネームで、関西を拠点に活動しているフロントエンドエンジニアです。

HAL大阪の新2回生です👍 (2016.5.7現在)

よくstart up系イベントに行くので、大阪らへんの方は会いましょう！

では、早速。

#TwiMemo

そこで作ったのがこちら！

![twimemo.gif](https://qiita-image-store.s3.amazonaws.com/0/90347/cae9bd3b-7c05-0ae2-7f0f-ba5075006dbf.gif)

*「Twitterに特定のハッシュタグをつけてつぶやくことで、WEBアプリにストックされていく」*というものです。

製作時間は3時間ほどで、Twitter Stream APIでハッシュタグをもとにツイートを取得→milkcocoaへpush→WEBアプリでstream()を使い取得。

本当に単純な構造ですね。

フロントエンドエンジニアなので、少しWEBアプリ側にこだわりを入れました。

![image.jpg](https://qiita-image-store.s3.amazonaws.com/0/90347/59dd590b-1e8f-7860-53a4-57ab6028f08e.jpeg)

このように、iphoneで、ホーム画面に追加すると単体のアプリのように動作してくれます。

iconも自作のものをつけているので、良ければ使ってみてください！

タスクには、`touchend`イベントをバインドしていて、打ち消し線を追加してみたり、headerをしたにスライドすると、更新できたりします。

なお、サーバサイドはNodeで書いていて、[Twit](https://github.com/ttezel/twit)というライブラリを使っています。

詳しくコードを見ていきましょう。

```twimemo.js
var milkcocoa = new MilkCocoa('あなたのmilkcocoa id'); //milkcocoaのid
var ds = milkcocoa.dataStore('memo'); //memoというデータストアを登録します。
var userTimeLine = twitter.stream("statuses/filter",{track: '#じゅんメモ'});//じゅんメモというハッシュタグでツイートを検索します。
var text;
userTimeLine.on("tweet",function(tweet){
  if(tweet.user.screen_name == TwitterName){//発信元が自分のIDである場合にのみpushするようにします。今後、サブアカウントを追加するとかになった場合に、ifの方が拡張しやすいです。
    text = tweet.text.replace(/#じゅんメモ/,"");//タスク本文だけを正規表現で抜き取ります。
    ds.push({memo: text,done: false});//memoにタスクを、doneはwebアプリ内で使う値になっています。
  }
});
```

今回は、フロントエンドにフレームワークを使っていません。ライブラリにjQueryを使いました。

```main.js
var milkcocoa = new MilkCocoa('あなたのmilkcocoa id');//フロントでもインスタンスを生成します。
var ds = milkcocoa.dataStore('memo');
function readMemo(){
  $(".item").remove(); //タスク１つ１つにitemというクラスをつけています。
  ds.stream().next(function(err, data){
    data.forEach(function(item){
      if(item.value.done){ //doneがtrueのものはもう出来ているので、データストアから消します。
        ds.remove(item.id);
      }else{
        el = '<li class="item" name="'+item.id+'">'+item.value.memo+'</li>'; //doneがfalseのままのものを追加していきます。
      }
      $("#memo").append(el);
    });
  });
}
readMemo();
ds.on('push', function() {
  readMemo(); //pushがあれば先ほどの関数を読みます。
});
```

コードの全貌は[https://github.com/konojunya/TwiMemo](https://github.com/konojunya/TwiMemo)にあります！

twitterみたいな僕の生活時間の4割を占めそうなものを活用できたら、より便利になるな〜と思いました。

まぁ最後に言えることは、milkcocoa is 神。
railsでGrapeを使ってAPI作成、プラス例外処理

## Grapeとは
APIを簡単に作ることができるライブラリの一つです。

## GrapeでAPIを作成
#### 1. データベースにAPIで使用するデータを入れる。
今回使用するテーブル Prefecture

| id | name | capital |
|:----------:|:-----------:|------------:|
|1|北海道|札幌市|
|2|青森県|青森市|
|3|岩手県|盛岡市|


#### 2. routes.rbとapplication.rbを編集
```routes.rb
Rails.application.routes.draw do
  mount API => "/"
end
```

```application.rb
module GrapeSampleApi
  class Application < Rails::Application
    config.active_record.raise_in_transactional_callbacks = true
    config.autoload_paths += %W(#{config.root}/lib/api)#←追記
  end
end
```

#### 3. grapeのベースを作成
全体のエラー処理もここに書ける。

```api.rb
# lib/api/api.rb
# coding: utf-8
class API < Grape::API

  # APIアクセスに接頭語を不可
  # ex) http://localhost:3000/api
  prefix "api"

  # APIアクセスにバージョン情報を付加
  # ex) http://localhost:3000/api/vl/
  version 'v1', :using => :path

  # 未指定の場合にJSONで返すように変更（URLで指定可能）
  format :json

  # 例外ハンドル 404
  rescue_from ActiveRecord::RecordNotFound do |e|
    rack_response({ message: e.message, status: 404 }.to_json, 404)
  end

  # 例外ハンドル 400
  rescue_from Grape::Exceptions::ValidationErrors do |e|
    rack_response e.to_json, 400
  end

  # 例外ハンドル 500
 rescue_from :all do |e|
   if Rails.env.development?
     raise e
   else
     error_response(message: "Internal server error", status: 500)
   end
 end

  mount Prefectures_API
end

```

#### 4. データのやり取りを行う部分を作成
```prefectures.rb
# lib/api/prefectures.rb
# coding: utf-8
class Prefectures_API < Grape::API
  resource "prefectures" do

    # ex) http://localhost:3000/api/v1/books
    desc "returns all prefectures"
    get do
      Prefecture.all
    end

    desc "return a prefecture"
    params do
      requires :id, type: Integer, values: 0..47 #0~47までを許容する。
      # optional :prefecture, type: String
    end
    # http://localhost:3000/api/v1/books/{:id}
    get ':id' do
      Prefecture.find(params[:id])
    end
  end
end
```

## レスポンス
```result.json
[
 {
  "id":1,
  "name":"北海道",
  "capital":"札幌市"
 },
 {
  "id":2,
  "prefecture":"青森県",
  "capital":"青森市"
 },
 {
  "id":3,
  "prefecture":"岩手県",
  "capital":"盛岡市"
 }
]
```

## 最後に
サクッと簡単にAPIが作ることができました。

宣伝になりますが、場所で起こす目覚ましアプリ[MapMe](https://play.google.com/store/apps/details?id=com.takusemba.mapme&hl=jp)をリリースしました。
その他、Netflixの映画レビューサイト[WhatchaSee](https://whatcha-see.herokuapp.com/)もリリースしていますので、ぜひ使ってみてください！！
sphinx 翻訳環境の構築方法

なかなか手順を覚えられないのでメモ。

# sphinx-intl コマンドのインストール

```bash
pip install sphinx-intl
```

# conf.py への設定追加

```py:conf.py
locale_dirs = ['翻訳用ファイルを配置するディレクトリのパス']
gettext_compact = False
language = '翻訳後の言語'
```

# 翻訳用ファイルの生成

```bash
# build/locale_dirs 配下に pot ファイルを生成する。
make gettext
# source/locale_dirs 配下に po ファイルを生成する。
sphinx-intl update -p build/locale_dirs -l language
```

# 翻訳する
``source/locale_dirs/language/LC_MESSAGES`` 配下の po ファイルへ訳文を入れていく。

# ドキュメントをビルドする

```bash
sphinx-intl build
make html
```