OmniAICreator/Qiita-1.07M huggingface dataset:
WordPressのMedia LibraryをDrupalで再現する。



### 必要なモジュールをインストールする。

使用するのは以下の3つです。
モジュールのインストール方法はコチラ→http://qiita.com/s_s_k/items/4ae744d8173b8f278626

* Wysiwyg: https://www.drupal.org/project/wysiwyg

* Wysiwyg Field: https://www.drupal.org/project/wysiwyg_fields

* Media: https://www.drupal.org/project/media


### Text Formatの設定
Wysiwyg機能を使いたいText Formatの設定ページにアクセスします。
ここでは、"Full HTML"に設定してみます。
/admin/config/content/formats/full_htmlにアクセスし

<span style="color:#FF6600; font-weight:bold;">「Convert Media tags to markup」</span>

にチェックを入れてください。

![スクリーンショット 2014-10-22 20.15.22.png](https://qiita-image-store.s3.amazonaws.com/822/15535/05407e16-a546-f236-987a-c4a252dba80a.png "スクリーンショット 2014-10-22 20.15.22.png")


### Wysiwygモジュールの設定
admin/config/content/wysiwygに移動します。Wysiwyg化するText FormatのEditorを設定します。
ここではCKEditorを使用します。
<span style="color:#ff0000; font-weight:bold;">注意:CKEditorは3.xxx系しかDrupalでは使えないようです。</span>

Editorを設定すると、editボタンが表示されるので、設定画面に移動します。

![スクリーンショット 2014-10-22 20.28.32.png](https://qiita-image-store.s3.amazonaws.com/822/15535/e13f2bbd-70e9-cf0c-d3eb-09aafa5b170c.png "スクリーンショット 2014-10-22 20.28.32.png")

Button and Pluginsのチェックボックスをとりあず全部アクティブにします。

![スクリーンショット 2014-10-22 20.29.20.png](https://qiita-image-store.s3.amazonaws.com/822/15535/1e3de676-77bf-049f-d708-de5c647e0ed2.png "スクリーンショット 2014-10-22 20.29.20.png")

SAVEボタンで保存します。ここでエラーが出た場合は、上記のText Formatの設定を確認してください。


### wysiwyg-media.jsを修正する
このまま、使用すると、画像アップロードの最後でJSエラーで保存ができません。
これはJquery1.9以降は、Jquery.browserというメソッドが消えているので、undefinedが出ています。
jsファイルの記述を下記に変更してください。

修正前

```js
if ($.browser.msie && parseInt(jQuery.browser.version) == 6) {
```

修正後

```js
if (navigator.userAgent.match(/msie [6]/i)) {
```

これで完了です。
インフラエンジニアじゃないけど H/W の情報を見るために稀に使うコマンド集

`ls***` 系。後半２つは H/W とはちょっと違いますね。

|コマンド   |説明
|---        |---
|lspci      |PCI バスとそこにつながっているデバイス
|lsusb      |USB バスとそこにつながっているデバイス
|lscpu      |CPU の情報
|lsblk      |ブロックデバイスのリスト
|lsmod      |ロードされているカーネルモジュール

`dmidecode`。下記以外にもいろいろ表示させられます。詳細は `man dmidecode`。

|コマンド               |説明
|---                    |---
|dmidecode -t system    |システムの情報、型番とかが表示される
|dmidecode -t bios      |BIOS の情報
|dmidecode -t processor |CPU の情報
|dmidecode -t memory    |メモリの情報

その他。

|コマンド               |説明
|---                    |---
|smartctl -i /dev/sda   |ディスクの情報
|ethtool eth0           |NIC の情報
フルパスの調べ方

.htaccessの置き場所をフルパスで書こうとしたら、フルパスの情報がわかならかったので、
やり方を調べてみました。

phpを使って調べるという[記事](http://www.gesource.jp/weblog/?p=433 "レンタルサーバーでフルパスがわからないときに調べる方法 - 山本隆の開発日誌")があったので、参考にやってみました。

```

AuthUserFile /xxx/xxx/xxx/.htpasswd
AuthGroupFile /dev/null
AuthName "Secret Area"
AuthType Basic

require valid-user

<Files ~ "^.(htpasswd|htaccess)$">
    deny from all
</Files>

```

`AuthUserFile /xxx/xxx/xxx/.htpasswd`
この部分ですね。


#フルパスの調べ方

わからなくなったディレクトリに下記のコードを記述したphpを設置して、
そのディレクトリのURLをブラウザで開くとフルパスが表示されます。

```php

<?php
echo __FILE__;
?>

```

###参考

[レンタルサーバーでフルパスがわからないときに調べる方法 - 山本隆の開発日誌](http://www.gesource.jp/weblog/?p=433 "レンタルサーバーでフルパスがわからないときに調べる方法 - 山本隆の開発日誌")
[PHPでフルパス（絶対パス）を取得する。 | Ken's WEB](http://www.kens-web.com/2011/06/1190 "PHPでフルパス（絶対パス）を取得する。 | Ken's WEB")
yosemiteにしたらgitが動かなくなった時の対処法

以下の様なエラーが出るようになった

```
$ git pull
/usr/local/Cellar/git/2.1.0/libexec/git-core/git-pull: line 11: /usr/local/Cellar/git/2.1.0/libexec/git-coregit-sh-setup: No such file or directory
```

なんで急にnot foundになったのかはよくわからないが、とりあえず絶対パスでファイルを指定してあげるように変更することでうまく動く
以下のコマンドで一括で変更して対応した

```
$ cd /usr/local/Cellar/git/2.1.0/libexec/git-core
$ for f in `ls`; do sed -i -e "s/\. git-/. \$\(dirname \$0\)\/git-/g" $f; done
```
コマンドラインでCIDRの計算


CIDRはネットワーク関連で`192.168.1.0/24`とかで表記するアレです

でこの表記が暗算で計算できれば分けないのですが、暗算が苦手なのでコマンドに頼ろうってことで調べてみました.

## sipcalc

標準ではインストールされてるディストリビューションは無いようですが
`sipcalc`コマンドがあります.

MacOSでHomeBrewを使ってる場合は`brew install sipcalc`でインストールできます.


```text:sipcalc
$ sipcalc 192.30.252.0/22
-[ipv4 : 192.30.252.0/22] - 0

[CIDR]
Host address            - 192.30.252.0
Host address (decimal)  - 3223256064
Host address (hex)      - C01EFC00
Network address         - 192.30.252.0
Network mask            - 255.255.252.0
Network mask (bits)     - 22
Network mask (hex)      - FFFFFC00
Broadcast address       - 192.30.255.255
Cisco wildcard          - 0.0.3.255
Addresses in network    - 1024
Network range           - 192.30.252.0 - 192.30.255.255
Usable range            - 192.30.252.1 - 192.30.255.254
```

[GitHubのIPs](https://help.github.com/articles/what-ip-addresses-does-github-use-that-i-should-whitelist/)を調べたかっただけなので自力で計算したほうが早かったな

GitHubの`192.30.252.0/22`のIPの範囲は`192.30.252.1`〜`192.30.255.254`だった
HerokuとGithub使っていて、gistup使う場合

# gistupのインストール

```bash
npm install -g gistup
```

# エラーになってしまう

```
/Users/wjunichi/.nodebrew/node/v0.10.32/lib/node_modules/gistup/lib/gistup/unless.js:11
    throw error;
          ^
Error: Command failed: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

    at ChildProcess.exithandler (child_process.js:648:15)
    at ChildProcess.emit (events.js:98:17)
    at maybeClose (child_process.js:756:16)
    at Socket.<anonymous> (child_process.js:969:11)
    at Socket.emit (events.js:95:17)
    at Pipe.close (net.js:465:12)
```

ちなみに、自分の環境では、エラーとなっても、gistupの作業ファイルみたいなのが、アップされてしまった。

# 解決方法

## ~/.ssh/configにgistup用の設定が必要

以下のようにgithubとは別にgist.github.comの設定を追加することで、
無事、gistにアップ出来ました。

```
Host github.com
 User git
 port 22
 Hostname github.com
 IdentityFile ~/.ssh/github_id_rsa
 TCPKeepAlive yes
 IdentitiesOnly yes

Host heroku.com
 User git
 port 22
 Hostname heroku.com
 IdentityFile ~/.ssh/heroku_id_rsa
 TCPKeepAlive yes
 IdentitiesOnly yes

Host gist.github.com
 User git
 port 22
 Hostname gist.github.com
 IdentityFile ~/.ssh/github_id_rsa
 TCPKeepAlive yes
 IdentitiesOnly yes
```

# 関連記事

- [Raspberry PiにHerokuのツールを入れて/bin/dashを知った件](https://abrakatabura.hatenablog.com/entry/2014/01/22/064904)
- [Heroku logからアクセス元のIPアドレスを抽出してみた](https://abrakatabura.hatenablog.com/entry/2014/10/17/225355)
- [herokuでbotkitを動かしGoogle Calendar APIを使う](https://abrakatabura.hatenablog.com/entry/2016/02/08/095744)
- [IJuliaをHerokuの無料枠で動かした](https://abrakatabura.hatenablog.com/entry/2016/03/07/205816)
- [Herokuの無料枠を使い切り、tw使っていたら周りの目が気になったのでやったこと](https://abrakatabura.hatenablog.com/entry/2017/12/22/221506)
bashをつかったスクリプトの引数


# 起動プログラムを返す

```bash
#!/bin/bash
echo $0
echo 'ex) /usr/local/bin/hoge.sh aaa bbb ccc'
echo '「/usr/local/bin/hoge.sh」が表示される'
```

# 引数の数

```bash
#!/bin/bash
echo $#
echo 'ex) /usr/local/bin/hoge.sh aaa bbb ccc'
echo 「3」が表示される
```

# 引数を表示

```bash
#!/bin/bash
echo $1
echo 'ex) /usr/local/bin/hoge.sh aaa bbb ccc'
echo 「aaa」が表示される
```
[Node.js] ファイルの内容をビット反転させる

ファイルの内容を単純にビット反転させるプログラムを作った。

暗号化とも言えない、すごく単純なものだ。

最近 Gmail で .js などを含む .zip ファイルを添付して送れなくなった。
xxx.zip を xxx.zip_ などで以前は送れていたのだが、今はダメだ。
しかたがないので、パッと見で zip ファイルだとわからない様にしてみた。

以下の様に使用する。

```bash
$ node reverse-file.js ファイル名
または
$ node reverse-file.js ファイル名 ff
```

ファイル名.rev にビット反転されたファイルができる。
ファイル名の次の引数は 01～ff までの16進数だ。排他的論理和の素だ。

```js:reverse-file.js
#!/usr/env/bin node
// reverse-file.js / reverse-file.sh -- ファイル反転

  'use strict';

  var fs = require('fs');

  // command arguments
  var file = process.argv[2];
  if (!file) return console.log('ファイル名を指定してください。\n' +
    'Usage: %s %s {file-name}', process.argv[0], process.argv[1]);

  var xff = parseInt(process.argv[3], 16) & 0xff || 0xff;
  // console.log(xff.toString(16));

  // open
  var r = fs.createReadStream(file);
  var w; // for write stream

  r.on('readable', function () {
    var buf = r.read();
    if (!buf || !buf.length) return; // empty

    // bit reverse
    for (var i = 0, n = buf.length; i < n; ++i) {
      buf[i] ^= xff;
    }

    if (!w) w = createWriteStream(file + '.rev');
    w.write(buf);
  });

  r.on('end', function () {
    if (w) w.end();
  });

  r.on('error', function (err) {
    console.log('read: ' + err);
    if (w) w.end();
  });

  function createWriteStream(file) {
    var ww = fs.createWriteStream(file);

    ww.on('error', function (err) {
      console.log('write: ' + err);
    });

    return ww;
  }
```

npmjs にも [reverse-file](https://www.npmjs.org/package/reverse-file) として登録してみた。

おしまい。
fuelPHP勉強メモ


## 参考

* [FuelPHPことはじめ](http://qiita.com/redpanda/items/ac23794032197031d9dc)
* [マイグレーション - 概要 - FuelPHP ドキュメント](http://fuelphp.jp/docs/1.7/general/migrations.html)
* [FuelPHP開発入門_02 - Qiita](http://qiita.com/yumura_shiho/items/eb07f130270cee27717c)
* [FuelPHP開発入門_03 - Qiita](http://qiita.com/yumura_shiho/items/6650054e9f2911724e27)
* [FuelPHP開発入門_07 - Qiita](http://qiita.com/yumura_shiho/items/9fe0c09334a2870c107c)
* [ざっくりFuelPHPの使い方 - Qiita](http://qiita.com/kimriwon/items/2a6e242091c5f485b976)


## php.ini

* 以下を有効にしておく。

```bash:/etc/php/php.ini
extension=pdo_mysql.so
extension=phar.so
extension=openssl.so
```

## fuelphpインストール

```bash:インストール
curl get.fuelphp.com/oil | sh
```

## プロジェクト作成

```bash:
oil create report && cd report
mysqladmin -uroot create report
```

* fuel/app/config/config.php を編集

```diff:fuel/app/config/config.php
+ 'always_load' => array(
+     'packages' => array(
+     'auth',
+     'email',
+     'orm',
+ ),
```

```bash:ひな形コピー
cp fuel/packages/auth/config/auth.php fuel/app/config/
cp fuel/packages/auth/config/simpleauth.php fuel/app/config/
cp fuel/packages/email/config/email.php fuel/app/config/
```

```diff:fuel/app/config/auth.php
  return array(
        'driver' => 'Simpleauth',
        'verify_multiple_logins' => false,
-       'salt' => 'put_your_salt_here',
+       'salt' => 'PUT_YOUR_SALT_HERE',
        'iterations' => 10000,
  );
```

```diff:fuel/app/config/simpleauth.php
- 'login_hash_salt' => 'put_some_salt_in_here',
+ 'login_hash_salt' => 'PUT_SOME_SALT_IN_HERE',
```

* 文字化け対策

```diff:fuel/app/config/mail.php
  'setups' => array(
      'default' => array(),
+     'jis' => array(
+         'charset' => 'ISO-2022-JP',
+         'encoding' => '7bit',
+     )
  ),
```


## DB接続設定


```php:fuel/app/config/development/db.php
return array(
    'default' => array(
        'connection'  => array(
            'dsn'     => 'mysql:host=localhost;dbname=report',
            'username'=> 'root',
            'password'=> '',
            ),
        ),
    );
```

## モデル作成

```bash:モデル生成
oil generate scaffold users user:varchar\[20\] pass:varchar\[20\]

oil generate scaffold sales_report user_id:int purpose_id:int purpose_type_id:int money:int memo:string
```
認証情報はユーザ情報と分離すべきだった

DB構造の整理を怠ったがために、トラブルった話

# 出来上がった構造

![before.png](https://qiita-image-store.s3.amazonaws.com/0/42032/e41dd2e7-5f1d-64fa-932e-2161195f9f94.png)

## USER テーブル
- id
- name
- login_id
- password
- deleted

# あるべきであった姿

![after.png](https://qiita-image-store.s3.amazonaws.com/0/42032/7d248f21-1043-cc32-1329-d00c8887ca55.png)

## USER テーブル
- id
- name
- deleted

## AUTH_INFORMATION テーブル
- user_id
    - FOREIGN USER.id
- login_id
    - UNIQUE
- password

# 起こった問題
## 「別の人がログインしてるんだけど」
- ログインID、パスワードを間違いなく入力している
- 表示されるのは別人の名前
- deletedカラムで論理削除したデータとlogin_idが重複していた

### 運用回避
- もともと、ユーザではなくシステム担当者がinsertする運用だった
- データ追加前にlogin_idでselectしてチェックする運用に

# 結論：分けときましょう。
AUTH_INFORMAION にあるデータはすべて有効で、login_idがユニークであれば、Insert時に怒られるのでこんな問題が起こることはなかった。
pod installしたら自動的にghq getする

[naoty/cocoapods-src](https://github.com/naoty/cocoapods-src)を使う。

```bash
$ gem install coocapods
$ gem install cocoapods-src
```

```yaml:~/.cocoapods/.podrc
cocoapods-src_use_ghq: true
```

`pod install`するとインストールしたライブラリのソースコードを自動的に`ghq get`してくれる。
たくさんストックされた記事はたくさんはてぶも付くのか？・・「Qiita被ストック数」と「被はてぶ数」の相関を分析してみた

QiitaAPIv2のおかけで、Qiitaの記事をある程度取得出来るようになったので色々分析してみたいシリーズです。Qiitaだけでなく、はてぶとの相関も調べてみます。

感覚的にはたくさんストックされた記事は当然はてぶもたくさん付いておりますが、本当にそうなのか実際に分析してみました。

### 事前準備（データ取得）

Qiitaの記事はQiitaAPIv2で1万件取得しました。それについては、[以前の記事](http://qiita.com/kure/items/0895983c3e05bfdf8377)でも簡単に触れています。

はてぶは[はてなブックマーク件数取得API](http://developer.hatena.ne.jp/ja/documents/bookmark/apis/getcount)で取得しました。特に利用制限は無いのか、1万件についてすぐに取得できました。

### 分析結果

#### 散布図
以下、まず散布図を示します。大方、被ストック数が多い記事は被はてぶ数も多い気がします。

![散布図.png](https://qiita-image-store.s3.amazonaws.com/0/50690/73a1c851-08fc-023b-32ac-2676ab2b6ee0.png)

#### 相関係数

次に、相関係数を調べてみると、相関係数は「**0.89**」でした。
相関係数は、以下のように判断出来るようなので、**被ストック数と被はてぶ数の相関は強い**、と言えそうです。
（ちなみに相関係数はExcelの機能で調べました。）

| 相関係数 | 相関の強さ |
|:--------:|------------|
| 0.7>     |    強い（ここ！）    |
|  0.4-0.7 | 中間の強さ |
|  0.2-0.4 |    弱い    |
|   0.2<   |    ない    |

#### 各被ストック数（範囲）に対する被はてぶ数の平均

具体的に数値として、各被ストック数（範囲）に対する被はてぶ数の平均を出してみました。まあ感覚通りかなという気がします。

![ヒストグラム.png](https://qiita-image-store.s3.amazonaws.com/0/50690/af8d09f8-1918-a031-03a5-ef400c84f0cf.png)


※追記

両方のグラフの目盛を対数にしてみました。

![対数.png](https://qiita-image-store.s3.amazonaws.com/0/50690/bbe14ce5-6955-e836-e9a9-236646c5a757.png)
[解決&追記]Xcode6.1でThe app references non-public selectors

アプリを申請用にValidateしようとした時のエラーめも。  
Xcode 6.1特定で出るみたいです＞＜ 
 
![Xcode_error.png](https://qiita-image-store.s3.amazonaws.com/0/5941/a014c884-7458-2de6-817a-0dc62ff66448.png)

> iTunes Store operation failed.  
> Your app contains non-public API usage.Please review the errors, corrent them, and resubmit your application.
>
> ----  
>
> iTunes Store operation failed.  
> The app references non-public selectors in Palyload/[APP NAME].app/[APP NAME]:allocBatch:withEntity:coount:, allocWithEntity:, firstIndexForKnownKey:, indexForKey:
>
> ----
>
> iTunes Store operation failed.  
> If you think this message was sent in error and that you have only used Apple-published APIs in accordance with the guidelines, send the app's nine-digit Apple ID, along with detailed infomation about why you believe the above APIs where incorrectly flagged, to appreview@apple.com. ....


アプリ内に非公開APIは使っていません。  
参考：[Non-public selectors in Payload/](http://stackoverflow.com/questions/26369633/non-public-selectors-in-payload)  
現時点ではXcode6.0.1で申請を出すしかないみたいです。  

Xcode6.0.1では無事Validateできました。

古いバージョンのXcodeのダウンロードはここから→[https://developer.apple.com/downloads/index.action](https://developer.apple.com/downloads/index.action)


## [解決]古いものをインストールする以外で解決方法あったら誰か教えてください＞＜ → ありました

@chapayGhub さんにコメントで教えていただきました！！ありがとうございます!!  

```
/Users/{user_home_folder}/Library/Developer/Xcode/DerivedData
```

きっちりCleanする時にもよく削除したりしていますが、ここに古いバージョンのXcodeでbuildしたデータが残った状態で、新しいXcodeでArchive->Validationを行うとこのエラーが表示されてしまうみたいです。

DerivedData内のデータを念のため丸ごと削除して行うと無事Xcode6.1でもいけました！

![Xcode_success.png](https://qiita-image-store.s3.amazonaws.com/0/5941/726b118f-124e-dc3e-27ee-b6ff3ac17f2d.png)

PrivateAPIを使っていないのにこのエラーが出た場合はDerivedDataの削除を試してみてください！

## 追記
上記のエラーは結構一時的なものだったようで、現在の最新のXcodeだと、 [Application Loader 3.0](https://itunesconnect.apple.com/apploader/ApplicationLoader_2.9.1.dmg)が入っているため出ないようです。
つまり、Application Loaderのバージョンが古いと出るエラーのようでした＞＜！
UNIONで指定した値との差が小さいのデータを取得


mysql> select * from rates;

| ID   |   Type   |   Rate   |
|:-----|:---------|:--------:|
| 1    |    A     |    12    |
| 2    |    A     |    18    |
| 3    |    A     |    25    |
| 4    |    A     |    27    |
| 5    |    A     |    34    |
| 6    |    A     |    38    |
| 7    |    B     |    40    |
| 8    |    B     |    43    |
| 9    |    B     |    50    |
| 10   |    A     |    55    |
| 11   |    A     |    58    |
| 12   |    A     |    62    |

例えば、
rateは12を指定すると12,18,25を返しくれる。
rateは25の場合は18,25,27を返してくれる。

```sql:union.sql
SELECT id, type, rate
FROM
( ( SELECT id, type, rate, 25-rate AS diff
    FROM rates
    WHERE type = 'A'
      AND rate < 25
    ORDER BY rate DESC
      LIMIT 3
  ) 
  UNION ALL
  ( SELECT id, type, rate, rate-25 AS diff
    FROM rates
    WHERE type = 'A'
      AND rate >= 25
    ORDER BY rate ASC
      LIMIT 3
  ) 
) AS tmp
ORDER BY diff
LIMIT 3 ;
```
Yosemiteで動かないHomebrewをgitコマンドで治す

#偶然このエントリを読んだ、未だ Yosemite にしてないアナタへ
悪い事は言わないから今すぐ `brew update` しておきましょう。
もしかすると下の作業をしなきゃいけない羽目に遭うかも…。

#状況解説
Yosemite にアップデートしたために `brew` コマンドが使えなくなることがあります。
原因は Homebrew の大元ファイルである `/usr/local/Library/brew.rb` にあります。拡張子から分かるように Ruby で書かれています。ただし、 shebang で使用する Ruby を

```rb:brew.rb-old
#!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
```
と決め打ちしていました。
Yosemite では Ruby 1.8 の添付が廃止されたため、このままの shebang では `brew` コマンドが実行出来ません。
これは Yosemite のプレビュー版で判明していた問題なので、今年（2014年）の6/4に修正されています。
[Switch to "Current" Ruby framework symlink · 1bbcc4b · Homebrew/homebrew](https://github.com/Homebrew/homebrew/commit/1bbcc4b5110f5a0573dfc78175d05fe454bbbda0)

```rb:brew.rb-diff
-#!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
+#!/System/Library/Frameworks/Ruby.framework/Versions/Current/usr/bin/ruby
```
つまり、それ以前に Homebrew をインストールしている（＆その後 `brew update` していない）と `1.8` のままになっている、と思われます。
（わたしはしょっちゅう `brew update` していますし、 一度ミスって `/usr/local` を全部消してしまったりしたので `Current` になっていました。）
#治し方
Homebrew の更新は git で行っているので、 `git fetch` でリモートを取得し、 `/usr/local/Library/brew.rb` をチェックアウトすれば良いですね。

```bash
$ cd /usr/local
$ git fetch origin master:refs/remotes/origin/master -n
$ git checkout origin/master -- Library/brew.rb
```
そのあとはいつも通り `brew doctor` して `brew update` しましょう。
hamlでhashを複数行で書くときに綺麗に書く方法

## Bad

なんかhamlで使えるhashリテラルって改行すると死ぬところがあって、綺麗にかけないんですよね

```haml
- hash = { foo1: bar1,
  foo2: bar2,
  foo3: bar3,
}
```

## Good

こうしましょう

```rb
:ruby
  hash = {
    foo1: bar1,
    foo2: bar2,
    foo3: bar3,
  }
```
HerokuでNumpy, Scipy, scikit-learnを利用する

Pythonで機械学習を組み込んだアプリケーションを作成すると、大体scikit-learn、それでなくてもNumpyやScipyに依存することが多いです。

これらは様々なライブラリに依存しているため、Heroku上にデプロイするには一筋縄ではいきません。AWSなどで自前のサーバーがたてられる場合はそちらに立てれば良いですが、お金もかかるしHerokuでやりたい！という場合もあると思うのでそのための手法を紹介します。

## Docker Container

[HerokuでもDocker Containerを利用したデプロイが可能になった](https://devcenter.heroku.com/articles/container-registry-and-runtime)ため、buildpackをいそいそと編集するよりもこちらを利用するほうが便利です。以下に公式のサンプルがあるため、こちらをご参考にしていただければと。

[heroku-examples/python-miniconda](https://github.com/heroku-examples/python-miniconda)

これでもうapt-getでいろいろインストールしたりslag sizeが大きすぎると文句を言われることもありません！

## Conda buildpack
NumpyやScipyといったライブラリは普通に`pip`からインストール、つまりソースコードからビルドしようとするとかなり大変です。これを回避できる、つまりコンパイル済みバイナリをインストールできる[Miniconda](http://conda.pydata.org/miniconda.html)という実行環境があるのですが、これをHeroku上でも使えるビルドパックが提供されています。

[conda-buildpack](https://github.com/kennethreitz/conda-buildpack)

Herokuにビルドパックを設定するには、作成時に指定する方法と後で変える方法の2種類があります。

**作成時に指定**

```
heroku create --buildpack https://github.com/kennethreitz/conda-buildpack.git
```

**後から指定**

```
heroku config:add BUILDPACK_URL=https://github.com/kennethreitz/conda-buildpack.git
```

使用方法としては、condaでインストールするための`conda-requirements.txt`(condaにおける`requirements.txt`)を用意しておくだけです。condaでは提供されていないものはpipを使ってインストールすることもできるので、pipでインストールする必要があるものは今まで通り`requirements.txt`に書いておけばOKです。

※condaで[mkl最適化されたnumpy, scipyなどを使うようになって](https://www.continuum.io/blog/developer-blog/anaconda-25-release-now-mkl-optimizations)、ファイルサイズがかなり大きくなりました。これにより、Herokuのslug sizeのリミットを超えてしまうケースがあります。その場合はmkl最適化版を使わないよう`nomkl`を`conda-requirements.txt`に加えるようにしてください([#21](https://github.com/kennethreitz/conda-buildpack/issues/21))。

難点としては、condaで作成する環境はvirtualenvと競合するため、併用することができない点です。そのため、Herokuでのデプロイを見据える場合は仮想環境の作成にはcondaを使っておく必要があります。condaコマンドの簡単な使い方は[こちら](http://qiita.com/icoxfog417/items/02a80b93b5f1e95f2795)をご参照ください。

Herokuにビルドパックを設定し、conda用の設定ファイルを用意しておく。これで機械学習系ライブラリを搭載したアプリケーションもHerokuで動かすことができます。

実際にconda-buildpackを使ってみたリポジトリを作りましたので、参考にしてください。Heroku Buttonを付けているのでそのままデプロイできます。

[number_recognizer](https://github.com/icoxfog417/number_recognizer)

## Heroku buildpack
こちらは私が`conda-buildpack`の存在を知らなかったために作成した、通常通りpipベースでのデプロイを行うビルドパックです。

ただし、scipyのコンパイルには非常に時間がかかるため、Heroku上でタイムアウトになってしまいます(Numpyのビルドまでは通ることを確認)。これを克服するにはより良いDynoを使うしかないので、無償枠では難しいと思います。

[Heroku buildpack: Python with Numpy, Scipy, scikit-learn](https://github.com/icoxfog417/heroku-buildpack-python/tree/statistics)

NumpyやScipyだけに対応しているわけではなく、そのコンパイル環境を整備するような作りになっているので、似たようなライブラリに依存しているものには汎用的に効くはずです(そうしたものはcondaで提供されていると思いますが・・・)。Herokuデプロイ時にpipがうまくいかなくてあきらめていたものがあれば、それについてもうまく動くようになるかもしれないです。

ここで使っている、Heroku環境にapt-getでライブラリをインストールできる[heroku-buildpack-apt](https://github.com/heroku/heroku-buildpack-apt)や複数のビルドパックをつなげて使える[heroku-buildpack-multi](https://github.com/heroku/heroku-buildpack-multi)は、他のシーンでも利用できる可能性があるので覚えておくと得をするかもしれません。
heroku-buildpack-multiはbowerなどを利用している場合に使えます(Node.js用のビルドパックでbowerを処理し、その後本体用のビルドパックで処理を流す)。
Goでマルチバイトが混在した文字列を文字幅でtruncateする

元ネタ: [Goでマルチバイトが混在した文字列をtruncateする](http://qiita.com/hokaccha/items/3d3f45b5927b4584dbac)

さらに文字幅で切り落としたい、そんな場合は go-runwidth が使えます。

```go
package main

import (
	"fmt"
	"github.com/mattn/go-runewidth"
	"strings"
)

func main() {
	s := "ああaaああ"
	r := []rune(s)

	// 5文字目まで切りたい
	fmt.Println(string(r[0:5])) //=> ああaaあ

	// 半角5文字で切りたい
	fmt.Println(runewidth.Truncate(s, 5, ""))

	// 画面幅(80文字)で切り、途切れるなら ... を付けたい
	fmt.Println(runewidth.Truncate(strings.Repeat("あ", 60), 80, "..."))
}
```
シェルスクリプト内での作業ディレクトリ

# いろんなスクリプトの実行のしかた

シェルスクリプトを実行するときは、いろんなところから実行するパターンがあったりします。

* 相対パス `~/bin$ ./command.sh`
* 絶対パス `~$ /home/ika/bin/command.sh`
* cronから `10 * * * * ika /home/ika/bin/command.sh`

このとき、実行するところによってスクリプトが始まったときのカレントディレクトリがまちまちなので、スクリプト内で一時作業ファイルを出力する際に想定外のディレクトリに吐き出されてしまったりしますし、個々の環境へチェックアウトして各個人が実行する場合などは、実行ユーザの違い等によってパーミッションエラーになったりしてしまったりすることがあったりします。
cronから実行される場合に至ってはカレントやらなんやらがどうなってるのか正直よくわかりません。

# カレントディレクトリの統一

対策として、ファイル名等に絶対パスを使ったりもできます。
```
WORK_FILE="/tmp/command.sh.workfile"
```
が、これだけですと同時に複数実行されたとき等に予期せぬ動作をしたりする可能性がありますし、スクリプトから外れたディレクトリで作業するのもなんかキモいので、カレントディレクトリを常に実行したファイルの位置に持ってくるときっとわかりやすいともいます。
```
cd `dirname $0`
```
と、スクリプトの最初に書いておけば、どこから実行されても常に自分のスクリプトの位置にカレントディレクトリが来るので、作業ファイルや作業ディレクトリがどこかに行ってしまうこともなくなって快適なスクリプトが書けることうけあいです。

### $0 のせつめい
実行しているスクリプト名前です。

`~/bin/$ ./command.sh` と実行されたら *./command.sh* が、
`~$ /home/ika/bin/command.sh` と実行されたら */home/ika/bin/command.sh* が

それぞれ `$0` から取得できます。

### dirname のせつめい
ディレクトリ名を返します。

`dirname ./command.sh` だったら *.* (←ドットだけ) が、
`dirname /home/ika/bin/command.sh` だったら */home/ika/bin* が、

それぞれ返ってきます。

# おまけ
ちなみに、絶対パスでさくっとファイル名をかぶらないようにしたいだけでしたら、プロセス番号を以下のように使うと便利です。
```
WORK_FILE="/tmp/command.sh.workfile.$$"
```
`$$` と書くとスクリプトを実行した子プロセスのPIDが出てくるので、通常は被らないとおもいます。

`$RANDOM` というランダムな数値(0 ～ 32767) を返してくれる特殊な変数もありますが、こちらは完全にランダムな上にPIDよりも範囲が狭いのに対して、PIDは基本的にインクリメントして振られていく(Winは違うかも)ため、被りにくいという意味では `$$` の方が使い勝手がよいとおもいます。
divタグの前後で改行が入ってしまう: ブロック要素とインライン要素

#問題
`[ 1 ]`というカッコ囲みの表記を動的にしたいとき

`[ <div id="hoge"></div> ]`
などとして、`$('div#hoge’)`に値を入れて動的に出力したいときがあるが、
実際は

```
[
1
]
```

などとなってしまう。

#原因
divタグはブロック要素なので、改行が入る。

#解決策
## divタグの代わりにspanタグを使う
spanタグはインライン要素なので改行が入らず、1行の中で扱うことができる。
divとspanの2つが存在することからこちらのほうが自然な書き方である。

## CSSでインライン要素にしてしまう
どーーーーしてもdivにする必要がある場合、
CSSで`display:inline;`などと指定してやるとdivだけどインライン要素という設定ができる。(参考 2.参照のこと)


# 参考ページ
1. [ < DIV > と < SPAN > ](http://www.tg.rim.or.jp/~hexane/ach/fscs/fscs04.htm)
2. [html css divタグが改行されるのを改行させない](http://d.hatena.ne.jp/joydiv/20100705/1278333129)
[SEO対策] Railsでherokuapp.comを正しいFQDNへリダイレクトさせる

ブログより転機: http://konyu.hatenablog.com/entry/2014/10/22/165553

同一ドメインで
herokuをプラットフォームで利用している場合に、
ドメインを取得してアプリを使用しても、デフォルトのドメインである

xxx.herokuapp.comからでもアクセスできてしまう。

SEO的にxxx.herokuapp.comでインデクシングされてしまうのはよろしくない(らしい)

なのでxxx.herokuapp.comでアクセスされたら301でリダイレクトさせてあげる

つまりアクセスしてほしいドメインが
> www.example.com

だとすると

以下のように、ロボットにアクセスされた場合
> http://xxx.herokuapp.com/users/100

このようにFQDNより下は同じにしてリダイレクトするようにする
> http://www.example.com/users/100



### 修正ファイル

application_controller.rbで、ensure_domainを定義してやりbefore_filterで常に呼んであげる

```rb
before_filter :ensure_domain


# redirect correct server from herokuapp domain for SEO
def ensure_domain
 return unless /\.herokuapp.com/ =~ request.host

 # 主にlocalテスト用の対策80と443以外でアクセスされた場合ポート番号をURLに含める 
 port = ":#{request.port}" unless [80, 443].include?(request.port)
 redirect_to "#{request.protocol}#{FQDN}#{port}#{request.path}", status: :moved_permanently
end
```

### リダイレクト先の構成要素のメモ

* request.protocol => "https://" や　"http://"
* request.port => 80, 443とかlocalだと3000
* request.path => "/users/100"  
* FQDNはリダイレクトさせたい固定値
AngularDart v.s. AngularJS Benchmark

AngularDartとAngularJS、処理系の違いもあってあんまり比較された記事を見ないので、比較してみました。

## ベンチマーク方法
[こちら](http://jsfiddle.net/mhevery/vYknU/23/)のアニメーションでのベンチマークを参考に、少し改良を加えた物をAngularDart/JS両方で実装し、100個の円状のオブジェクトを色を変えつつ回転移動させるというアニメーションにかかる時間の100回の平均を取りました。ブラウザはDart 1.7に同梱のDartiumです。

ソースコードは[こちら](https://github.com/laco0416/angular_benchmark)です。Dartを使う都合上、デモサーバーを用意できなかったので、もし結果を自分の目で確かめたいというかたはリポジトリをクローンして動かしてください。



## 結果

### 1位 AngularDart 718ms
![Imgur](http://i.imgur.com/dqhEd6F.png)

### 2位 AngularDart(コンパイル後JS) 987ms
![Imgur](http://i.imgur.com/NRmyVqA.png)

### 3位 AngularJS 990ms
![Imgur](http://i.imgur.com/YwvhZvx.png)

## 考察
各所で「速い」と謳われるDartだけあって、Dartium上ではAngularJSに大きな差を付けて1位でした。dart2jsでコンパイルされた後のjsとAngularJSではほとんど違いがありませんので、altJSとしてのDartは十分に力を持っていると言っていいのではないでしょうか。

ただ気がかりなのはAngularDartを用いた2つのケースではどちらも1回目の計測値が異常に大きくなっており、何らかのオーバーヘッドがあるのではないかと思われます。また、**dart2jsはとても遅い**ので、`>pub serve`でのリアルタイムコンパイルはよほどのサーバーでないとまだ実用には耐えません。dart2jsを使う場合は予め`>pub build`したものをデプロイするのが得策です。
yosemiteでiTerm2が縦方向に最大化するにはタイトルバーをダブルクリック

今まで最大化ボタンを押して縦方向に最大化してたのですが、
yosemiteになってから全画面表示になってしまった。

![スクリーンショット 2014-10-22 16.58.32.png](https://qiita-image-store.s3.amazonaws.com/0/25728/d94122df-9950-770d-9b63-5d9412d7dc9e.png)

以下の赤枠部分をダブルクリックすることで縦方向に最大化になった。

![スクリーンショット 2014-10-22 16.56.12.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2b0e8538-b638-4486-7cfb-6b3dcd5bfe94.png)
Twitterの特定のユーザーのフォロワー数を取得する（だけ）PHP


## 1.アプリ登録
v1.1からOauthによる認証が必要なためアプリ登録して
consumerKey、consumerSecret、accessToken、accessTokenSecretの値をメモる

参考：
[PHPでOAuth認証して自分のつぶやきを表示する [Twitter API 1.1 対応版]
](http://www.webopixel.net/php/666.html)

## 2.ライブラリダウンロード

[abraham/twitteroauth](https://github.com/abraham/twitteroauth)
のライブラリを使うのでダウンロード

twitteroauthのフォルダのOAuth.php、twitteroauth.phpのみ使用する

## 3.実装

consumerKey、consumerSecret、accessToken、accessTokenSecretを以下に打ち込む


```php
require_once("twitteroauth/twitteroauth.php");
$consumerKey = 'xxxx';
$consumerSecret = 'xxxx';
$accessToken = 'xxxx';
$accessTokenSecret = 'xxxx';

$screen_name = "hoge";

$twObj = new TwitterOAuth($consumerKey,$consumerSecret,$accessToken,$accessTokenSecret);
$res = $twObj->get('users/show', compact('screen_name'));
if (isset($res->followers_count)) {
    echo $res->followers_count;
} else if (isset($res->errors[0]->message)) {
    echo $res->errors[0]->message;
} else {
    echo 'Unknown Error';
}
$oObj = json_decode($res,true);
echo $oObj['followers_count'];
```

screen_nameは取得したいユーザーID

以上
## 参考
公式API仕様
https://dev.twitter.com/rest/reference/get/users/show

Twitterのフォロワー数取得について
http://choice-site.com/2013/07/11/twitter%E3%81%AE%E3%83%95%E3%82%A9%E3%83%AD%E3%83%AF%E3%83%BC%E6%95%B0%E5%8F%96%E5%BE%97%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/

TwitterOAuthの正しい使い方
http://qiita.com/rana_kualu/items/357a031c0453a3538ad3

[PHP] ライブラリに頼らないTwitterAPI入門
http://qiita.com/mpyw/items/b59d3ce03f08be126000
ios開発で定期実行メモ


Swiftなこのご時世にObjective-cでJSのsetinterval的なアレ。

```

//
//  ViewController.m
//  timertest
//
//  Created by nobisuke on 2014/10/22.
//  Copyright (c) 2014年 nobisuke. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

NSTimer *timer = nil;

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
	//タイマー
    NSLog(@"start");
    [NSTimer
     scheduledTimerWithTimeInterval:1.0
     target:self
     selector:@selector(onTimer:)
     userInfo:nil
     repeats:YES];
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

//定期実行させる処理
- (void)onTimer:(NSTimer *)timer {
    NSLog(@"chick");
}

@end

```

##実行結果

```
2014-10-22 16:21:41.105 httptest3[409:98993] start
2014-10-22 16:21:42.105 httptest3[409:98993] chick
2014-10-22 16:21:43.105 httptest3[409:98993] chick
2014-10-22 16:21:44.105 httptest3[409:98993] chick
2014-10-22 16:21:45.105 httptest3[409:98993] chick
2014-10-22 16:21:46.104 httptest3[409:98993] chick
2014-10-22 16:21:47.105 httptest3[409:98993] chick
・
・
・
・
```
godoc コメントの書き方


## godoc サーバーの起動

以下のコマンドで godoc サーバーが起動する。
ブラウザから http://localhost:6060 にアクセスすれば、`GOPATH` 配下のソースのドキュメントを参照することができる。

```
godoc -http=:6060
```


## パッケージコメント

`package` の上に記述する。
http://godoc.org/-/index などの一部のページでは、コメントの先頭から句読点、ピリオドまでしか表示されない。
また、同一パッケージ内にパッケージコメントが記述されているファイルが複数ある場合は、ファイル名順でソートした際の先頭のファイルのコメントが採用されるよう。

```
// Package Overview.
// hogehoge...
package main
```

## 関数コメント

`func` の上に記述する。

```
// Function Overview.
func doSomething() string {
	...
}
```

## ソースコードの埋め込み

半角スペース2個以上のインデントでコードの埋め込みが可能。

```
// Example:
//     obj, err := doSomething()
//     handleError(err)
```
[Swift] メモ

#エラー
'A' is not conviertible to 'B'
AはBに変換できない

Expected Declaration
クラスに直接　処理を書いてはいけない
関数のなかで処理を書く

Use of unresolved '***'
'***'は定義されていない値、関数です

#継承
http://qiita.com/takkyun/items/ddacd2cd8fb5c56a66d9

#SwiftとObjective-C
http://blog.f60k.com/objective-cとswiftの組み合わせ方のまとめ/
http://blog.f60k.com/objective-cとswiftの組み合わせ方のまとめpart2/

#単語
Inheritance
継承

extension
拡張

declaration
宣言

#変数の宣言
```
var myVar = 100 //varは変数
let myLet = 999 //letは定数
```

#バックスラッシュ
option + ¥

#関数定義
```
func kakezan(int1: Int, int2: Int) -> Int {
     return int1 * int2
}
println( kakezan(2, 3) )
```
##println()
```
var num = 123
println("num = \(num) ")
```
iTerm2の設定をインポート・エクスポートする方法

# 2022 最近のiTerm2


設定を開いて、GeneralタブからのPreferencesタブを開く。その後Load preference from a custom folder or URL. にディレクトリを指定すると設定ファイルがなければ出力される。あればその設定が使われるようになる。

![CleanShot 2022-08-19 at 08.42.55 2@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7565/542f43aa-6733-097a-4d4d-4cd11d2fe21f.png)

# 過去のiTerm2

設定を開いて、Load preference from a custom folder or URL. にディレクトリを指定すると設定ファイルがなければ出力される。あればその設定が使われるようになる。

![Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/7565/d760f862-e597-e970-e89e-2afc228d6195.png "Preferences.png")
Crashlyticsの便利なクラスメソッド

Crashlyticsのクラッシュレポートが送られた時に、設定しておくと一緒に情報が送られる。

##定型

```objc

+ (void)setUserIdentifier:(NSString *)identifier; 
+ (void)setUserName:(NSString *)name; 
+ (void)setUserEmail:(NSString *)email; 

```

##カスタム

```objc

+ (void)setObjectValue:(id)value forKey:(NSString *)key; // calls -description on value, perfect for NSStrings! 
+ (void)setIntValue:(int)value forKey:(NSString *)key; 
+ (void)setBoolValue:(BOOL)value forKey:(NSString *)key; 
+ (void)setFloatValue:(float)value forKey:(NSString *)key; 

```

##意図的にクラッシュさせる

```objc

[Crashlytics sharedInstance].debugMode = YES;
[[Crashlytics sharedInstance] crash];


```
Ruby2.2.0-preview1速報(Matrix版)


##Matrix(行列)って何？
Matrix(行列)は、同じ長さの配列を配列の中に入れたような形式のデータで、下記のような形のものを言います。

    Matrix[
      [1,2,1,1],
      [2,4,5,2],
      [1,4,4,4],
      [5,4,1,1],
      [2,3,3,4]
    ]


__具体的なデータ例__
・本の購入履歴データ
・各ユーザーの映画の評価データ
など

ユーザーをu1,u2,u3として、映画をm1,m2,m3としたときの評価データは、

       m1 m2 m3
    u1  0  3  1
    u2  1  5  2
    u3  5  0  0

みたいな形で表すことができて、これをMatrix(行列)といい、様々な計算をしていきます。


##Rubyの弱点の一つだったMatrix
Rubyは標準でmatrixライブラリを用意していたものの、使いづらいしパフォーマンスがひどかった。
理由はこの投稿を見れば分かります。
http://qiita.com/catatsuy/items/c73c41f85832bff1dbc1

標準のMatrixライブラリがこんな状態なので、外部のライブラリでNMatrixなるものがあり、こちらは計算方法やデータの扱いが工夫されていて、パフォーマンスも高いけど、依存パッケージがあったり環境変数を設定しないといけなかったりと、扱いづらいのが欠点でした。


##標準のMatrixクラスが劇的に改善！！
Pythonにも負けない(?)行列計算ができるようになりそうです。

##Ruby2.2.0-preview1のインストール
ruby-buildに登録されているので、rbenvでインストールできます。

    #terminal
    CONFIGURE_OPTS="--enable-bundled-libyaml" rbenv install 2.2.0-preview1

##Ruby2.2のMatrixクラスでできること

__■基本演算__

    #irbを立ち上げて
    require 'matrix'

    #3×5のランダム行列の生成
    Matrix.build(2,2) { rand }
    => Matrix[[0.8571359857200008, 0.028076907386971994], [0.5420561909522512, 0.7052229658795479]]

	#行列の値とか行、列の取得とか
    Matrix[ [1,2], [3,4] ].each_with_index do |i, row, col|
      puts "#{i} at #{row}, #{col}"
    end

	#出力結果↓
    1 at 0, 0
    2 at 0, 1
    3 at 1, 0
    4 at 1, 1    
    =>
    Matrix[[1, 2], [3, 4]]

    #逆行列
    Matrix[[-1, -1], [0, -1]].inverse

    #転置
    Matrix[[1,2], [3,4], [5,6]].transpose

その他、複素数とか諸々の計算は色々できます。
http://ruby-doc.org/stdlib-2.1.3/libdoc/matrix/rdoc/Matrix.html

<br>
__■n次元連立方程式を解ける！？__

    m=Matrix[[1,1,1,0],[1,1,0,1],[1,0,1,1],[0,1,1,1]]
    m.lup.solve([3,3,3,3])  
    => Vector[(1/1), (1/1), (1/1), (1/1)] #a=1, b=1, c=1, d=1って意味です。

す、すげぇ〜！
<br>
__■特殊な行列計算
LU分解、ラプラス展開、余因子展開、余因子行列、スペクトル分解、複素数行列などはこちらを参考に。
http://bit.ly/1vKOZmD

ネットワーク解析とかレコメンド系とか統計解析系が、かなり便利になりますね。


____

<br>

というわけで、まだまだ需要が高まりそうな行列計算をRubyでいい感じに使えるようになったのは、
Rubyistにとっては朗報ですね。

もうちょっと色々いじってみたいと思います！
TypeScriptでJQueryを扱う方法

TypeScriptは静的型付け言語です。TypeScriptを扱ったプログラミングの中でJQueryの型やjqueryの関数を使用したくなると思います。しかし、標準のTypeScirptではJQuery型は対応しておりません。

#対応方法
型定義ファイルを使用してJQuery型を使えるようにします。

まず型定義ファイルをダウンロードします。

DefinitelyTypedからjqueryを型定義ファイルをダウンロード
https://github.com/borisyankov/DefinitelyTyped
様々なライブラリの型定義ファイルがありますがjqueryというフォルダーをダウンロードしてください。

ダウンロードしたフォルダーの中のjquery.d.tsというファイルを任意のディレクトリに移動してください。

今度はTypeScriptのコードの方で一番最初の行に型定義ファイルを宣言します。
(pathはjquery.d.tsが存在しているディレクトリ)

```ts:main.ts
/// <reference path="lib/jquery.d.ts" />
```

これだけで動きます。

```ts:main.ts
var jquery :JQuery = $("#id");

function hoge(jquery :JQuery){
}
```
このようにJQuery型や$が使用できます。

#注意
これはあくまでコンパイルを通るようしただけなので、実際にはhtmlにjqueryのライブラリを読み込む記述をしないと動きません。
Jsoupを使ってみる

```
String html = "<ul><li><a href='http://example.jp/' target='_blank'>other site</a></li><li><a href='./prev.html' class='inner'>prev page</a></li></ul>";
Document doc = Jsoup.parse(html);
Elements elm1 = doc.select("a[href]").select(".inner");
Elements elm2 = doc.select("a[href]").select("a[target=_blank]");
for (Element e : elm1) {
    // text  e.text()
    // hrefの値  e.attr('href')
    // hrefを絶対パスに変換  e.attr('abs:href')
}
```

最後の絶対パスがうまく取れない…
baseUriを設定しないといけないらしい

```
Document doc = Jsoup.parse(html, "http://example.com/hoge/");
```

あれ？ダメ？そう書いてあるのにな。

```
Document doc = Jsoup.parse(html);
doc.baseUri("http://example.com/hoge/");
```

やっと予想通りの出力に！

データとしてのhtmlはajaxで取ってきたりするだろうからこんな感じ。

```
Document doc = Jsoup.connect("http://example.com/hoge/data.html").get();
Elements elm = doc.select("a[href]");
for (Element e : elm) {
    //
}
```

本当にこれだけでいいの？って自分でも不安です。baseUriもきちんと設定されます。
ああ、HTTPUrlConnectionではTimeoutなし（永久に待つ）だったので調べてみましたが、jsoupでは既定値が3000msでした。さすが。
エラー処理も実装されているようなので大丈夫そう。

ステータスくらいは見てあげても良さそうだけど、そこはあまり気にせず「データが取れなかったら」くらいを想定しておけば十分そう。


※[本家サンプル](http://jsoup.org/cookbook/extracting-data/example-list-links)と[Qiitaの記事](http://qiita.com/opengl-8080/items/d4864bbc335d1e99a2d7)を参考にしました。
UICollectionViewCell.subViewのUnable to simultaneously satisfy constraintsが解決しない場合

どうやら、CellがcollectionViewLayoutで指定されたサイズにロードされる前に一度constraintsのチェックが行われるらしい。

そこで、もしこんな風にConstraintsを組んでいると、小さなサイズでロードされた時にheightがマイナス値になるビュー（ここでは赤いスペーサー）が出てきてUnable to simultaneously satisfy constraintsが出る…

![Screen_Shot_2014-10-22_at_2_16_59_PM.png](https://qiita-image-store.s3.amazonaws.com/0/25916/30ab1ad8-e131-3ffc-9e6d-b3f78fe29514.png)

別に指定のサイズで表示した時に改めてレイアウトしてくれればエラーメッセージくらい出てくれても構わないのだが、レイアウトされないことがある（この辺の条件がよくわからない）ので、そのときはスペーサー（赤いview）とコンテンツビュー（白いview）のvertical spacingのpriorityを下げてやると良い
[Java] String... vs String[] どちらが良いかな? 可変引数と配列

# String... vs String[] どちらが良いかな? 可変引数と配列

![ArgumentsWorkMain.png](https://qiita-image-store.s3.amazonaws.com/0/16128/850fb09f-d55f-3729-7fd4-4004997e30ff.png)

可変引数として受け取るか、配列として受け取るか。
どっちも同じ様だけど、どっちがいいんだろうか。

```java:ArgumentsWorkMain.java
public class ArgumentsWorkMain {
	public static void main(String... args) {
		ArgumentsWorkMain me = new ArgumentsWorkMain();

		// test1 は可変引数
		// test1(String str, String... args)
		me.test1("");
		me.test1("a", "a");
		me.test1("a b", "a", "b");
		me.test1("", new String[] {});
		me.test1("a", new String[] { "a" });
		me.test1("a b", new String[] { "a", "b" });
		me.test1("((null))", null);
		// ↑ この null は (String[]) null とみなされるが (String) null にもできる
		me.test1("((null))", (String[]) null);
		me.test1("(null)", (String) null);

		// test2 は配列
		// test2(String str, String[] args)
		me.test2("", new String[] {});
		me.test2("a", new String[] { "a" });
		me.test2("a b", new String[] { "a", "b" });
		me.test2("((null))", null);
		me.test2("((null))", (String[]) null);
		// me.test2("(null)", (String) null); // -> Error
	}

	void test1(String str, String... args) {
		StringBuilder buf = new StringBuilder();

		if (args != null)
			for (String e : args)
				if (e != null)
					buf.append(e).append(" ");
				else
					buf.append("(null)");
		else
			buf.append("((null))");

		if (!str.equals(buf.toString().trim()))
			System.out.println(str + " != " + buf);
	}

	void test2(String str, String[] args) {
		StringBuilder buf = new StringBuilder();

		if (args != null)
			for (String e : args)
				if (e != null)
					buf.append(e).append(" ");
				else
					buf.append("(null)");
		else
			buf.append("((null))");

		if (!str.equals(buf.toString().trim()))
			System.out.println(str + " != " + buf);
	}
}
```

わざわざ `null` を渡すことは通常無いよね。

結論：各自好きな方を選べ。

俺は可変引数の方が好きだけどね。

↓こういうコードも書いてるでしょ? いちいち `new String[] { }` はメンドイ!

```java
import java.util.Arrays;
import java.util.List;
...
	void test3() {
		List<String> list0 = Arrays.asList();
		List<String> list1 = Arrays.asList("a");
		List<String> list2 = Arrays.asList("a", "b");
		List<String> list3 = Arrays.asList(new String[] {"a", "b", "c"});

		test2("", (String[]) list0.toArray());
		test2("a", (String[]) list1.toArray());
		test2("a b", (String[]) list2.toArray());
		test2("a b c", (String[]) list3.toArray());
	}
```

終わり。
bashでlsの結果を配列に代入して、文字列として連結する

java -classpathオプションに指定したくなったので。

```bash
FILES=($(ls -1 /path/to/files/))
CONCAT_FILES=$(IFS=';'; shift; echo "${FILES[*]}")
echo ${CONCAT_FILES}
```

こんな感じに出力される。

```bash
a;b;c;d
```
[PHP] intval(), strval() より型キャストの方が速い

PHPの型変換関数に、`intval()`、`strval()` というのがありますが、それを使うより型キャストの方が実行速度が速いということを確かめるために、手元の MacBook Pro (Mountain Lion)で実行時間をはかってみました。

使ったPHPのバージョンは以下のようなものです。

```
$ php --version
PHP 5.4.32 (cli) (built: Aug 28 2014 06:57:23)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
    with Xdebug v2.2.5, Copyright (c) 2002-2014, by Derick Rethans
```

## 1. intval() vs (int)

### intval()の場合

以下で計測しました
```$ time php -r 'for ($i = 0; $i < 1000000; ++$i) { $a = intval("123456789"); }'```

1回目:

```
real 0m0.910s
user 0m0.893s
sys 0m0.013s
```

2回目:

```
real 0m0.962s
user 0m0.945s
sys 0m0.012s
```

3回目:

```
real 0m0.877s
user 0m0.860s
sys 0m0.012s
````

### (int)の場合

以下で計測しました
```$ time php -r 'for ($i = 0; $i < 1000000; ++$i) { $a = (int) "123456789"; }'```

1回目:

```
real 0m0.552s
user 0m0.200s
sys 0m0.012s
```

2回目: 

```
real 0m0.222s
user 0m0.207s
sys 0m0.011s
```

3回目:

```
real 0m0.212s
user 0m0.197s
sys 0m0.011s
```

## 2. strval() vs (string)

### strval()の場合
以下で計測しました。
```$ time php -r 'for ($i = 0; $i < 1000000; ++$i) { $a = strval(123456789); }'
```

1回目:

```
real 0m0.891s
user 0m0.874s
sys 0m0.012s
```

2回目:

```
real 0m0.901s
user 0m0.884s
sys 0m0.013s
```

3回目:

```
real 0m0.891s
user 0m0.875s
sys 0m0.012s
```

### (string) の場合

以下で計測しました。
```
time php -r 'for ($i = 0; $i < 1000000; ++$i) { $a = (string) 123456789; }'
```

1回目:

```
real 0m0.228s
user 0m0.213s
sys 0m0.011s
```

2回目:

```
real 0m0.232s
user 0m0.217s
sys 0m0.011s
```

3回目:

```
real 0m0.225s
user 0m0.210s
sys 0m0.010s
```
ホスト名やIPアドレスなどネットワーク関連の設定について　RHEL系Linux(/etc/sysconfig/)とFreeBSD(/etc/rc.conf) で比較した


# ホスト名やIPアドレスなどネットワーク関連の設定方法について

ざっくり言うと、

RHEL系Linux環境では

* /etc/sysconfig/network 　#自ホストのホスト名
* /etc/sysconfig/network-scripts/ifcfg-eth0   #eth0のIPアドレス
* /etc/sysconfig/network-scripts/ifcfg-eth1   #eth1のIPアドレス


FreeBSD環境では

* /etc/rc.conf   #自ホストのホスト名や複数のNICのIPアドレス

に設定を記述する。

## ホスト名の設定

### RHEL系Linux

* HOSTNAME=ホスト名

```bash:/etc/sysconfig/network
HOSTNAME=work01
#HOSTNAME=hostname
```

### FreeBSD

* hostname="ホスト名.ドメイン名"

ホスト名だけを変える場合は、ドメイン名はそのままにする。


```bash:/etc/rc.conf
hostname="work01.example.com"
#hostname="hostname.my.domain"
```

## IPアドレスの設定

### RHEL系Linux

NICの数だけ、設定ファイルを作成する。
/etc/sysconfig/network-scripts/ifcfg-[NIC名]

* eth0の設定例(DHCP)

```bash:/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 #デバイス名
BOOTPROTO=dhcp #DHCPを指定
ONBOOT=yes #マシン起動時にNICを有効化する
.
.
```

* eth1の設定例(固定IPアドレス)

```bash:/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1 #デバイス名
BOOTPROTO=static #固定IPを指定
ONBOOT=yes #マシン起動時にNICを有効化する
IPADDR=192.168.1.10 
NETMASK=255.255.255.0
GATEWWAY=192.168.1.1 #ルータのアドレス
.
.
```

ONBOOT=no　にした場合は

```bash
$ ifup eth0
```
で有効化する必要がある

### FreeBSD

rc.confにNICの数だけ項目を追加する。

ifconfig_[NIC名]="inet [IPAddr] netmask [NETMASK]"

```bash:/etc/rc.conf
defaultrouter="192.168.0.1" # DHCPだけの場合いらない
ifconfig_eth0="DHCP"
ifconfig_eth1="inet 192.168.0.16 netmask 255.255.255.0"

```

## 名前解決(/etc/hosts, /etc/resolve.conf)

### LinuxとFreeBSDで共通

/etc/hosts 
には、通常DNSサーバに登録されていない、プライベートなネットワーク上のサーバを登録する。
name listsにはスペース区切りで名前を複数登録できる。

* [IP Addr] [name_list] 

```bash:/etc/hosts
127.0.0.1    localhost localhost.my.domain
::1          localhost localhost.my.domain
192.168.0.10 work01 work01.my.domain  
```


/etc/resolve.conf
には、/etc/hostで名前解決ができなかった場合に検索対象となるDNSサーバの指定や、
work01などのホスト名を指定して/etc/hostsに記載がなかったときに、検索対象となるドメイン名を指定する。


* domain [domain_name]
* search [domain_name_list]   #domainの代わりにsearchを使うと、補完するドメイン名を複数(最大6)指定できる。
* nameserver [ip_addr]

domainとsearchは互いに排他的で、後に書かれたものが優先される。

```bash:/etc/resolve.conf
domain my.domain
nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 192.168.0.1
```

ちなみに8.8.8.8, 8.8.4.4はGoogleのpublic DNS。
キャッシュを利用して高速に名前解決が可能とのこと。


例）
work04が指定された場合、

1. /etc/hostsを見て、登録がないので /etc/resolve.confを見る。
2. domain my.domainが指定されているので、短縮名はwork04.my.domainに補完される。
3. work04.my.domainをnameserver 8.8.8.8に問い合わせる。

## NATやパケットフィルタリングの設定

NATやパケットフィルタリングをルータではなくサーバマシンで行うようにする。
既に市販のルータを使って接続している場合は不必要。

### Linux

/etc/iptablesに設定を記述する。
（説明は省略）

### FreeBSD

ipfwを使う。
（説明は省略）

# 参考資料

Man page of HOSTS
http://linuxjm.sourceforge.jp/html/LDP_man-pages/man5/hosts.5.html

Man page of RESOLV.CONF
http://linuxjm.sourceforge.jp/html/LDP_man-pages/man5/resolv.conf.5.html
Goでマルチバイトが混在した文字列をtruncateする


Goで日本語混じりのstringをそのままtruncateすると`[]byte`として切りだされるのでお察しの通りになる。

```go
s := "ああaaああ"

// 5文字目まで切りたい
fmt.Println(s[0:5]) //=> あ��
```

`[]rune`（`[]int32`のalias）に変換してから必要なぶんを切り出してstringにキャストすればよい。

```go
s := "ああaaああ"
r := []rune(s)

// 5文字目まで切りたい
fmt.Println(string(r[0:5])) //=> ああaaあ
```

http://play.golang.org/p/pc_pcCZSHa
Android HTTPで通信する（HTTPUrlConnection）

使わなくなってしまったんだけども備忘録で。
[こちら](http://d.hatena.ne.jp/m-kawato/20120911/1347378083)を参考にしました。

```java:onCreate
URL url = new URL("http://www.example.co.jp/index.html");
new HttpGetTask().execute(url);
```

```java
class HttpGetTask extends AsyncTask<URL, Void, String> {
	@Override
	protected String doInBackground(URL... url) {
		String result = "";
		HttpURLConnection conn = null;
		try {
			conn = (HttpURLConnection) url[0].openConnection();
			conn.setReadTimeout(10000);
			conn.setConnectTimeout(15000);
			conn.setRequestMethod("GET");
			conn.setDoInput(true);
			conn.connect();
			int resp = conn.getResponseCode();
			// respを使っていろいろ
			result = readIt(conn.getInputStream());
		} catch(IOException e) {
			e.printStackTrace();
		} finally {
			if(conn != null) {
				conn.disconnect();
			}
		}
		return result;
	}

	public String readIt(InputStream stream) throws IOException, UnsupportedEncodingException {
		StringBuffer sb = new StringBuffer();
		String line = "";
		BufferedReader br = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
		while((line = br.readLine()) != null){
			sb.append(line);
		}
		try {
			stream.close();
		} catch(Exception e) {
			e.printStackTrace();
		}
		return sb.toString();
	}

	@Override
	protected void onPostExecute(String resp){
		// onCreateとほぼ同じこと（Fragmentにデータを送る
		Bundle arguments = new Bundle();
		arguments.putString(ItemDetailFragment.ARG_ITEM_ID,
				getIntent().getStringExtra(ItemDetailFragment.ARG_ITEM_ID));
		arguments.putString("responseText", resp);
		ItemDetailFragment fragment = new ItemDetailFragment();
		fragment.setArguments(arguments);
		getFragmentManager().beginTransaction()
				.add(R.id.item_detail_container, fragment)
				.commit();
	}
}
```
ソフトウェアエンジニアからみた環境構築自動化ツールの比較、感想

## 対象ツール

- docker: https://www.docker.com
- chef: https://www.getchef.com/chef/
- ansible: http://www.ansible.com/home


## docker

immutable infrastructure.
つまり、使用済みのサーバーは捨てる。常に新しい環境を作るという思想ですね。
コンテナー型でホストOSから様々なプロセスを立ち上げて管理するのが特徴です。
但し、使用済みのプロセスのログ管理や運営の仕方など、初心者には難しいと思いました。

## chef

個人的にはchef-soloを好んで使用しています。
レシピを書いてローカル環境を簡単に作れるし、AWSのOPSWORKSでもレシピが使えるのはかなりメリットだと思います。
但し、chefを使用するために各種ツールをインストール必要があり、面倒くさい面もあります。

## Ansible

これいいですね！pythonで作られたツールでサーバーとssh通信を利用して環境構築を行う。なのでchefのように各種ツールをインストール必要もありません。pyshonさえあればOK。また、chefみたいに設定ファイルを書くのにrubyを覚える必要もないし、yamlで記述すればいいので簡単です！ travisの使用経験がある人には相性いいかもです。

## 感想

Ansible > chef > docker
Ansibleは導入が簡単。そしてpassbookの記述も簡単な理由から１番にしました。（あくまで個人的な意見、、）chefみたいに冪等性も保たれます。相当魅力的なツールだとおもいました。

他にも良いツールがありましたらコメントください！
Andoroid開発のTips

Android Studioでライブラリを追加する
---

今回試したライブラリ

- [active-android](http://www.activeandroid.com/)
 - ActiveRecord風 データベース
- [android-query](https://code.google.com/p/android-query/)
 - jquery風 ajaxとかイベント定義とか
- [jsoup](http://jsoup.org/)
 - HTML解析

（android-queryが本当にjqueryと同じように使えたらいいのになあ…）

1. File → Project Structure → 左上の＋をクリック
1. Import .JAR or .AAR Package → ファイルを選択 → Finish
1. （バックグラウンドで同期処理）
1. app の Dependencies → 右の＋をクリック → Module Dependency → 先ほど追加したライブラリを選択 → OK

- Active Android は AndroidManifest.xml の変更が必要
 - 既にある Application の属性として
```
android:name="com.activeandroid.app.Application"
```
 - Application 内に追記 （OPTION、バージョンは任意の数）
```
<meta-data android:name="AA_DB_NAME" android:value="mydatabase.db" />
<meta-data android:name="AA_DB_VERSION" android:value="2" />
```


Fragmentって結局？
---

納得できるまでにけっこう時間がかかりました。
画面の最小単位くらいに思っておけば大丈夫と思います。
Activityはそれらを集めて（1つだけでも可）実際に表示させる枠みたいなものかな。
Webアプリ経験者ならまあこんな感じの理解でも問題ないはず。

- Activity
 - ページの移動（読み込むcssやjsも変化する可能性あり）
- Fragment
 - ページは移動しない画面遷移（元の画面と共通点が多い、タブ等でのコンテンツ切替など）


Master/Detail Flow
---

これも日本語のわかりやすい説明が…なくはないんだけど、テンプレートから新規作成した後の状態がわからんのですよ。
（一度普通にFragmentで数画面のアプリを作ってみるといいのかな？）

要点としてはこんな感じ と思います。

2014.11変更
仕様が変わったようです。

* 最初の画面は次を表示する
  * 最小画面サイズが600dp以上なら activity_item_list.xml(sw600dp)（左にlistのFragment、右にdetailのFrame）
		* 左の画面をクリックすると、右の画面が書き換わる 
	* それ600dp未満なら activity_item_list.xml（listのFragment）
		* クリックすると activity_item_detail.xml（detailのFrame）に遷移する
* 600dp はどこで定義されている？
 * layout-sw600dp というディレクトリ名
		* swはSmallest Widthのこと、なので画面の向きを変えても変わらない
	* これを例えば layout-w1024dp に変更すると…
		* 画面の幅が1024dp以下の場合となるので、大抵のタブレットの縦に該当し、横には該当しない
		* うまく変わらない場合はClean Projectをする
vimで設定可能な色の種類を一覧で確認する方法


##はじめに
`vim`を使う上で色の設定は不可欠ですよね。でも`.vimrc`を設定する時、どういう色設定が現在されていて、どういう色が設定できるのか確認したいなーと思うことが多々あるので紹介します。

##何色が設定出来るか確認
以下のコマンドを`vim`で実行。

```bash:vim
:so $VIMRUNTIME/syntax/colortest.vim
```

設定できる色が一覧で表示されます。
色がどのエイリアスに割り当てられていてどんな色になるかを確認できます。
イメージ画像はこちら。

![スクリーンショット 2014-10-22 14.18.17.png](https://qiita-image-store.s3.amazonaws.com/0/30890/bd81779e-8b22-2b7b-e9c3-20322732c4ec.png "スクリーンショット 2014-10-22 14.18.17.png")

##現在設定している色の確認
以下のコマンドを同じく`vim`で実行。

```bash:vim
:so $VIMRUNTIME/syntax/hitest.vim
```

どのエイリアスがどの色を表示しているかを確認できます。
イメージ画像はこちら。

![スクリーンショット 2014-10-22 14.24.21.png](https://qiita-image-store.s3.amazonaws.com/0/30890/a968cfad-80ae-76ad-36f1-e0df1fa9f126.png "スクリーンショット 2014-10-22 14.24.21.png")

##おわりに
`vim`の色で困ったらご参考に。
今回は以下の記事を参考にさせていただきました。ありがとうございます。

>vimカラーの微調整時のまとめ
>http://d.hatena.ne.jp/connvoi_tyou/20080306/1204825179
PHP の strftime の文字長の制限

`strftime` は 1024 文字以上になると失敗します。

```php
var_dump(strftime(str_repeat("x", 1023), time())); // "xxx..."
var_dump(strftime(str_repeat("x", 1024), time())); // false
```

この制限は、引数の文字数ではなく **結果の文字数** です。

```php
var_dump(strftime("%F" . str_repeat("x", 1013), time())); // "2014-10-22xxx..."
var_dump(strftime("%F" . str_repeat("x", 1014), time())); // false
```

PHP 5.5 以降なら 4095 文字まで大丈夫です。

```php
var_dump(PHP_VERSION); // "5.5.18"

var_dump(strftime(str_repeat("x", 4095), time())); // "xxx..."
var_dump(strftime(str_repeat("x", 4096), time())); // false

var_dump(strftime("%F" . str_repeat("x", 4085), time())); // "2014-10-22xxx..."
var_dump(strftime("%F" . str_repeat("x", 4086), time())); // false
```

どうしても（PHP が許容できる）任意の文字長に対応する必要があるなら、次のように `preg_replace_callback` を使うとよいでしょう。

```php
function strftime_long($format, $time)
{
    return preg_replace_callback('/%(?:%|\w+)/', function ($m) use ($time) {
        $s = $m[0];
        return strftime(substr($s, 0, 32), $time) . substr($s, 32);
    }, $format);
}

var_dump(strftime_long(str_repeat("x", 10000), time()));            // "xxx..."
var_dump(strftime_long("%F%%%T" . str_repeat("x", 10000), time())); // "2014-10-22%19:26:00xxx..."
var_dump(strftime_long("%EcX", time()));                            // "Wed Oct 22 19:26:00 2014X"
```