OmniAICreator/Qiita-1.07M huggingface dataset:
sinatraでpostをリダイレクトする

## できませんでした。

http://kiririmode.hatenablog.jp/entry/20131202/p1
ここを参考に307でリダイレクトを試してみたけどダメだった。。

## alias urlでやりたいことはできた。

http://stackoverflow.com/questions/3384134/alias-url-with-sinatra-padrino
ここに書いてある通りに`PATH_INFO`書き換えてあげたらいけた！
むしろこっちのほうがいい。

```app.rb
post '/graph' do
  call env.merge('PATH_INFO' => '/graph/line')
end

post '/graph/line' do
  ## 処理
end
```

```
127.0.0.1 - - [27/Feb/2015:15:24:36 +0900] "POST /graph HTTP/1.1" 200 64 0.2178
```

ログは`/graph`で出るみたい。
unixtimeと日付の変換


# 日付 から unixtime への変換方法

    date コマンドに ‘+%s’ 引数をつけると unixtime で表示する。
    特定の日付を変換したいときは、’–date’ オプションで。

    $ date +%s
    1305730800


# unixtime から 日付 への変換方法

    $ date --date "@1305730800"
    2011年 5月 19日 木曜日 00:00:00 JST

    $ echo 1305730800 | awk '{print strftime("%c",$1)}'
    2011年05月19日 00時00分00秒
StreamAPIで Map<K, V1> --> Map<K, V2> の変換をする


Map&lt;K, V1&gt; --> Map&lt;K, V2&gt; の変換が、Java8のStreamAPIを使うと簡単にできました.

```java
// before
Map<String, String> before = new HashMap<>();
before.put("foo", "bar");

// after
Map<String, Object> after = before.entrySet().stream()
    .collect(Collectors.toMap(
        e -> e.getKey(),
        e -> (Object) e.getValue()
));
```
EC2上でSoftwareRAIDする奴


xvdb-e の4つのSSD EBSつけたインスタンス上でRAID10組む手順


# インストール
	yum install mdadm


# RAID10作成


	# mdadm --verbose --create /dev/md0 --level=10 --chunk=256 --raid-devices=4 /dev/xvd[b-e]
	mdadm: layout defaults to n2
	mdadm: layout defaults to n2
	mdadm: size set to 52395776K
	mdadm: Defaulting to version 1.2 metadata
	mdadm: array /dev/md0 started.



# readaheadの大きさ調整
SSDなんでreadaheadの大きさそんないらんので減らす

	blockdev --getra /dev/md0
	8192
	# 先読み (readahead) の大きさを 512 バイトセクタ単位で N セクタに設定する。
	blockdev --setra 512 /dev/md0
	blockdev --getra /dev/md0
	512

# RAID確認
	# mdadm --detail /dev/md0
	/dev/md0:
	        Version : 1.2
	  Creation Time : Wed Feb 25 15:19:18 2015
	     Raid Level : raid10
	     Array Size : 104791552 (99.94 GiB 107.31 GB)
	  Used Dev Size : 52395776 (49.97 GiB 53.65 GB)
	   Raid Devices : 4
	  Total Devices : 4
	    Persistence : Superblock is persistent
	
	    Update Time : Wed Feb 25 15:26:56 2015
	          State : active, resyncing
	 Active Devices : 4
	Working Devices : 4
	 Failed Devices : 0
	  Spare Devices : 0
	
	         Layout : near=2
	     Chunk Size : 256K
	
	  Resync Status : 28% complete
	
	           Name : ip-172-31-13-18:0  (local to host ip-172-31-13-18)
	           UUID : 02585115:bbb1adbe:100ef990:b6a8deeb
	         Events : 5
	
	    Number   Major   Minor   RaidDevice State
	       0     202       16        0      active sync   /dev/xvdb
	       1     202       32        1      active sync   /dev/xvdc
	       2     202       48        2      active sync   /dev/xvdd
	       3     202       64        3      active sync   /dev/xvde


# 起動時にRAIDの再作成されるように
	echo 'DEVICE /dev/xvd[b-e]' > /etc/mdadm.conf
	mdadm --detail --scan >> /etc/mdadm.conf


# おまけxfs作成
    mkfs.xfs -L "/data" -b size=4096 -i size=512 -l size=64m /dev/md0
    mount -t xfs -o noatime,nodiratime,nobarrier,logbufs=8 /dev/md0 /data
    echo "/dev/md0 /data xfs noatime,nodiratime,nobarrier,logbufs=8 0 0" >> /etc/fstab
rasbianにSquidをインストール

##インストール
```
$ sudo apt-get install squid
```
##設定ファイル編集
```
$ sudo vi /etc/squid/squid.conf

acl lan src xxx.xxx.xxx.0/24
http_access allow lan
```
自分のローカルネットワークを追加。

```
cache_dir ufs /mnt/usb1/spool/squid 1000 16 256
```
キャッシュフォルダを外部ディスクに作成。

```
cache_peer XXX.XXX.XXX.XXX parent XXXX 7 no-query
never_direct allow all
```
上位プロキシを使う場合の設定。

```
$ sudo service squid restart
```
サービスを再起動。

端末側のプロキシ設定にIPアドレスとポートを指定する。
Polymer で publish を使うときの注意


## attributes or publish

2way data binding をする変数を指定するのに`attributes`か`publish`を用いるが
`attributes`の宣言位置が好きでないので`publish`を使っていたらひっかかった。
ちゃんと[developer guide](https://www.polymer-project.org/docs/polymer/polymer.html)の[この項](https://www.polymer-project.org/docs/polymer/polymer.html#default-property-values)に注意がかかれていたけど汗

>
For property values that are objects or arrays, you should set the default value in the created callback instead. 

__配列かオブジェクトをデータバインディングする時の初期値は`publish`では指定しちゃ駄目。__

ざっと目を通したときに見た気がするけど最初とくに問題にならなかったので気にしなかった汗汗汗


## 検証

### 上記が問題になるようなケース。
自分は`node-list`や`link-list`というアイテムを表示する２種類以上のコンポーネントを作る際に
基本的な機能を実装した`item-list`を継承してつくるほどではなく、かといって別個につくるのは後で修正がめんどくさいので
`item-list`の`type`属性を指定して内部で場合分けして表示しようとしたときつまづいた。
具体的には

```
<item-list type="node" items="{{nodes}}"></item-list>
<item-list type="link" items="{{links}}"></item-list>
```

のように`item-list`を使い回そうとした時。

### テスト
http://jsdo.it/sosuke4cs/polymer-publish-test

### 結果

挙動としては`publish`での初期化だけでは全ての`item-list`の`items`がバインディングされてしまっている。
クラス変数てきな感じになってしまっているのだろうか？？？汗

まあこれはこれで便利かも。
VS2005とVS2008のプロダクトキーをレジストリから取得する

windowsボタン+R
regedit を入力


HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Registration\2000.0x0000
PIDKEYをダブルクリックしてコピー

2005
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Registration\2000.0x0000
2008
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Registration\2000.0x0000

※プロダクトIDはVSのバージョン情報に記載があるので一致したものを選ぶ



参考サイト
https://codered10.wordpress.com/2010/12/16/find-your-visual-studio-product-key-through-the-registry/
Chef12/Ohai8環境ではnode['current_user']の代わりにENV['SUDO_USER']を用いる

# 理由

同環境ではnode['current_user'] に root を設定するようになっているため、
chef実行中のユーザーを拾う場合は、ENV['SUDO_USER'] で代替する。

# 参考
https://github.com/chef/ohai/issues/451
コマンドラインからVisualStudioをビルドする

ソリューションがでかくなるとビルドが落ちるのでバッチファイルを作った。
バージョンやインストールした場所によって指定するフォルダーが変わったりするので適宜変更をお願いします。

```
rem　バッチファイルにしておくと定期的にビルドできる
rem ビルド個所に移動（VS2005の場合）
cd /D D:
cd D:\Projects\Sapporo\SVN-Source\Source
rem　devenv.exeのある場所を指定して実行。%~dp0/　はバッチファイルのある場所の意味。
"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv" /rebuild release /out %~dp0/build.log [ソリューション名].sln
```



■[VisualStudio]各プロジェクトのVisualStduioの開発バージョンがわからない


Microsoft Developer Studio Workspace File, Format Version 6.00→6.0

slnファイル

Microsoft Visual Studio Solution File, Format Version 8.00→2003

Microsoft Visual Studio Solution File, Format Version 9.00→2005

Microsoft Visual Studio Solution File, Format Version 10.00→2008

Microsoft Visual Studio Solution File, Format Version 11.00→2010

Microsoft Visual Studio Solution File, Format Version 12.00→2013

Microsoft Visual Studio Solution File, Format Version 14.00→2015


VC++のバージョン

6.00→6.0

7.10→2003

8.00→2005

9.00→2008
SQL Serverのビューの列情報を取得する



参考
https://msdn.microsoft.com/ja-jp/library/ms186816.aspx


decimal付近の型サイズを取得する為にxprecなど使いましたがサポートはされていない項目とのこと。


```
SELECT    o.name AS TableName --テーブル名
    ,
    c.name AS ColumnName --列名
    ,
    t.name AS ColumnTypeName --データ型
    ,
    case
        when t.name = 'nvarchar' then convert(varchar, c.length / 2)
        when t.name = 'nchar' then convert(varchar, c.length / 2)
        when t.name = 'datetime' then '-'
        when t.name = 'bigint' then '-'
        when t.name = 'money' then '-'
        when t.name = 'real' then '-'
        when t.name = 'int' then '-'
        when t.name = 'smallint' then '-'
        when t.name = 'decimal' then convert(varchar, c.xprec) + '.' + convert(varchar, c.xscale)
        when t.name = 'numeric' then convert(varchar, c.length * 2)
        else convert(varchar, c.length)
    end AS ColumnLength --データの長さ
    ,
    case
        when c.isnullable = 1 then 'null'
        else 'null以外'
    end AS ColumnNullOK --null許可=1
FROM
    syscolumns as c
    INNER JOIN
        (
            SELECT
                id,
                xtype,
                name
            FROM
                sysobjects
            WHERE
                xtype IN('U', 'V')
            and sysobjects.name = 'view_interface_purchase_item_sales_item'
        ) AS o
    ON  c.id = o.id
    INNER JOIN
        (
            SELECT
                xtype,
                xusertype,
                type,
                usertype,
                name
            FROM
                systypes
        ) AS t
    ON  c.xtype = t.xtype
    AND c.xusertype = t.xusertype
ORDER BY
    colorder
```

フォーマットツール
http://www-atl.blog.so-net.ne.jp/
MacBook Pro を壞して直した記録 (2)

MacBook Pro を壞して直した記録 (2)

# 2014年8月13日

Recovery 領域から復元した．Application や書類，picture は，5・6月ころまでのもののみ復元された．

# 2014年8月19日

Command + R を押しながら電源を入れ，Time Machine から復元しようとしたが，復元に失敗した．
AndroidアプリでTableRow内のlayout_widthが効かない場合がある

TableRow内のビューに対して`layout_gravity`を指定すると`layout_width`の設定がうまく効かない場合がありました。
LinearLayoutなどで同様にしても`layout_width`はちゃんと効きます。

ActivityのXMLを以下のようにすると、

```xml
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
    <TableRow>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TableRow" />
        <EditText
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_gravity="end" />
    </TableRow>
    <LinearLayout>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="LinearLayout" />
        <EditText
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_gravity="end" />
    </LinearLayout>
</TableLayout>
```

実行したときにこのようになります。
![tablelayoutcap.png](https://qiita-image-store.s3.amazonaws.com/0/28319/1eca588e-211b-8f3d-43f6-3b583598dc7b.png)

EditTextの中身は同じですが、TableRowのほうのEditTextはとても短いです・・。
（hintなどを入れると文字数分の長さになるので、`layout_width="wrap_content"`を指定したときのような動きになっていそうです）

* * *

なぜこうなるのかはよくわかりませんでしたが・・
TableRow内のビューに`layout_width`を設定しつつ右寄せしたい場合などは、ビューをLayoutで囲んで、Layoutに対して`layout_gravity`を指定するとうまくいくようです。

```xml
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
    <TableRow>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TableRow" />
        <LinearLayout
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:layout_gravity="end" >
            <EditText
                android:layout_width="100dp"
                android:layout_height="wrap_content" />
        </LinearLayout>
    </TableRow>
</TableLayout>
```
![tablelayoutcap2.png](https://qiita-image-store.s3.amazonaws.com/0/28319/dc78dd6f-e436-7f23-626f-ac560beacd79.png)
pushStateのstateObjでハマった。


どもども、フロントはそんなに得意じゃないのですが、かなりハマったバグだったので一応Qiitaに投稿しておこうとおもいます。

## pushStateすると、Chromeが謎の挙動
現象はちょっと説明しにくいので割愛しますが、pushStateするとChromeのブラウザバックの挙動が謎の動きをするようになった。

原因を調査していたら、pushStateのstateObjectの扱いが問題だったことがわかったので共有しておきたいと思います。

## pushStateとは

詳しくはリンク先を参照してください。

- [Manipulating the browser history - Web developer guide | MDN](https://developer.mozilla.org/ja/docs/Web/Guide/DOM/Manipulating_the_browser_history#pushState()_.E3.83.A1.E3.82.BD.E3.83.83.E3.83.89)

> state オブジェクト — state オブジェクトは pushState() によって作成される新しい履歴エントリに関連付けられる JavaScript オブジェクトです。ユーザーが新しいエントリに移動すればいつでも、popstate イベントが発火して、履歴エントリの state オブジェクトのコピーがイベントの state プロパティへと含まれることとなります。

> state オブジェクトは何であってもシリアライズされます。Firefox はユーザーのディスクに state オブジェクトを保存し、ユーザーがブラウザを再起動した際に state オブジェクトを復元するため、シリアライズされた状態での state オブジェクトの最大文字数は640000文字と、サイズの制限がされています。シリアライズ後にこの最大文字数を上回ることになる state オブジェクトを pushState() に渡した場合、pushState()は例外を投げます。これを上回るスペースが必要な場合、sessionStorage または localStorage の使用を推奨します。

今回重要なのはココ↓

`state オブジェクトは何であってもシリアライズされます。` 

## 実際にハマった部分

### 最初、stateObjをテキストにしていました。
```js
var stateObj = "bar";
history.pushState(stateObj, "page 2", "bar.html");
```

これでもね、一応期待する挙動は実現できるんですよ。なので特に違和感なくそのまま実装していたんですよね…。

### どうやらオブジェクト化しないとダメらしい
- ↑のところにも書いてあるので当たり前なのだけど、オブジェクトでないとダメみたいでした。
- オブジェクトならStringオブジェクトとかでもいいのかどうかは未確認

### 解決後

```js
var stateObj = { foo: "bar" };
history.pushState(stateObj, "page 2", "bar.html");
```

あー、スッキリ。
ドキュメントはちゃんと見ようね。というお話でした。
git add -p コマンド一覧

いつもわからなくなるので、自分用にメモ

### コマンド一覧

```
y - このハンクをステージングする
n - スキップする
q - 終了する
a - 以降のハンクをすべてステージングする
d - 以降のハンクをすべてスキップする
g - 指定したハンクへ移動
/ - 正規表現によるハンクの検索
j - 未確定な前のハンクへ移動する
J - 前のハンクへ移動する
k - 未確定な次のハンクへ移動する
K - ハンクへ移動する
s - ハンクを分割する
e - 手動で現在のハンクを修正する
? - ヘルプを表示する
```
GitHubリポジトリをMacのターミナルから新規ファイル追加する方法

# 手動でもええけど
黒い画面でやった方がなんか出来てる感あるじゃん。ということでほい！



```lang:project01
$ cd project01     * * *  Github内に作成したフォルダを指定。
```
```lang:project01
$ git init         * * *  ローカルにGitリポジトリが出来る。
```
```lang:project01
$ git add <追加したいファイル>     * * *  ファイルがコミット対象となる。
```
```lang:project01
$ git commit -m ‘First commit.’   * * *  ローカルのGitリポジトリにコミットできる。
```
```lang:project01
$ git remote add origin <githubで作ったリポジトリ>   * * *  リモート(GitHub)のリポジトリに紐づく。
```
```lang:project01 
$ git push origin master * * * ローカルのGitリポジトリのコミット内容がGitHub側に反映される。
```


参考
[ローカルのプロジェクトをgit initしてからGitHubにpushするまで](http://blog.urouro.net/entry/2012/12/22/164157
)
Project Euler 7 

素数を小さい方から6つ並べると 2, 3, 5, 7, 11, 13 であり, 6番目の素数は 13 である.

10 001 番目の素数を求めよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%207

以前作ったmymathを用いてサクッと求める。
http://qiita.com/cof/items/45d3823c3d71e7e22920

```
import mymath
def cof():
  max = 10**6
  target = 10001
  pri = mymath.get_primes(max)
  print pri['list'][target-1]

if __name__ == '__main__':
  cof()
```

約125ms maxが大きすぎたかな。
owncloudのインストール

##apache2,mysqlインストール
```
$ sudo apt-get -y install apache2 mysql-server
```
apt-get を実施

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/70042/22846ffc-506e-6c50-4f30-422eb19171f7.png)

パスワードを入力。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/70042/790c90e5-82c4-3e3b-efea-062f920eabee.png)

再入力。ちょっと待つと完了する。

##ownclooudのインストール
```
$ sudo apt-get -y install libapache2-mod-php5 php5 php5-gd php5-common php5-mysql php5-curl php5-intl php5-mcrypt php5-imagick php-apc
```
php関連が色々必要みたい。

```
$ wget https://download.owncloud.org/community/owncloud-8.0.0.tar.bz2
$tar xvjf owncloud-8.0.0.tar.bz2
```
owncloudのファイルをダウンロードし解凍。

```
$ sudo cp -r owncloud /var/www/
$ sudo chown -R www-data:www-data /var/www/owncloud
```
コピーして所有者を変更。

##ownclooudのセットアップ

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/70042/01483385-009b-f603-1bf5-890b21d4e364.png)

`http://[raspbianのアドレス]/owncloud/`にアクセスする。

・管理者ユーザー名、パスワードは任意
・データベースのユーザー、パスワードはmysqlインストール時に設定したもの
・データベース名は「owncloud」

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/70042/ba092c20-4361-af13-1759-83a8f97284bb.png)

セットアップが完了すると設定したユーザーでログインされる。

##設定変更
管理画面で警告表示に対する対応。

```
$ cd /etc/apache2/sites-available
$ sudo vi default
<Directory /var/www/owncloud>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    allow from all
</Directory>
```
apache設定ファイルを変更。

```
$ sudo vi /etc/php5/apache2/php.ini
; PHP's default character set is set to empty.
; http://php.net/default-charset
default_charset = "UTF-8"
```
default_charset = "UTF-8"のコメントアウトを外す。

```
sudo service apache2 restart
```
apacheを再起動。

以上。
Project Euler 6 

最初の10個の自然数について, その二乗の和は,

12 + 22 + ... + 102 = 385
最初の10個の自然数について, その和の二乗は,

(1 + 2 + ... + 10)2 = 3025
これらの数の差は 3025 - 385 = 2640 となる.

同様にして, 最初の100個の自然数について二乗の和と和の二乗の差を求めよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%206

等差数列の和の公式、平方数の和の公式を用いて以下のように実装。
https://www.shinko-keirin.co.jp/keirinkan/kosu/mathematics/kirinuki/kirinuki16.html
http://www2.ocn.ne.jp/~mizuryu/jyugyo/heihou.html

```
import mymath
def cof():
  (s,l,diff) = (1,100,1)
  ans = (mymath.sum_nums(s,l,diff)**2) - mymath.sum_squars(l)
  print ans
  
if __name__ == '__main__':
  cof()
```

mymathについては下記
http://qiita.com/cof/items/45d3823c3d71e7e22920
Project Euler 5 「最小の倍数」３つの回答方法を考えてみた。

2520 は 1 から 10 の数字の全ての整数で割り切れる数字であり, そのような数字の中では最小の値である.

では, 1 から 20 までの整数全てで割り切れる数字の中で最小の正の数はいくらになるか.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%205

「最小の倍数」 †
2520 は 1 から 10 の数字の全ての整数で割り切れる数字であり, そのような数字の中では最小の値である.

では, 1 から 20 までの整数全てで割り切れる数字の中で最小の正の数はいくらになるか.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%205


回答案1
ユークリッドの互除法を使用する。
http://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%83%E3%83%89%E3%81%AE%E4%BA%92%E9%99%A4%E6%B3%95

```py
def gcd(m,n):
  while n != 0:
    (m,n) = (n,m%n)
  return m

def lcm(m,n):
  return m*n/gcd(m,n)

def cof1():
  max = 20
  i = 6
  for j in range(5,max+1):
    i = lcm(i,j)
  #print i
```

回答案2
次のように素因数分解できる数m,nの最小公倍数は、
m = p1^n1 * p2^n2
n = p1^n3 * p3^n4

同一の素数を含む（上記だとp1)→指数n1,n3の大きい方をとったp1^(max(n1,n3)を因子にもつ。
一方にしかない素数(上記だとp2,p3)→p2^n2, p3^n4を因子にもつ。

→数を素因数分解して{素数:指数}という辞書で表し、上記の計算から最小公倍数を求める。

上記を以前作ったmymathを使って以下のように実装してみた。
http://qiita.com/cof/items/45d3823c3d71e7e22920

```
import mymath
def cof2():
  max = 20
  pri = mymath.get_primes(max)
  num1 = mymath.factor_dict(2,pri)
  for i in range(3,max+1):
    num2 = mymath.factor_dict(i,pri)
    num1 = mymath.lcm_dict(num1,num2)
  ans = mymath.dict2num(num1)
  print ans

```

回答案3
1からmaxまで連続する数の最小公倍数Lは、max以下の素数p1,p2,‥を用いて
L = p1^n1 * p2^n2 * p3^n3‥
と表せる。

ここで、各p1^n1はmax以下である。
これを求めるのに、以下の2つのアプローチがあるが、計算量を節減するため、後者をとった。
![pe5.png](https://qiita-image-store.s3.amazonaws.com/0/70480/5bd9e62a-b64a-031c-4a0b-2a49d5be7a2e.png)

```
import mymath
def cof3():
  max = 20
  #20までの素数列を生成
  pri = mymath.get_primes(max)
  ans = 1
  j=1
  i=-1
  while i!=0:
    i=0
    #素数それぞれを、その累乗数がmaxを超えない範囲で答えに掛け合わせる
    while i < len(pri['list']) and pri['list'][i]**j <= max:
      ans *= pri['list'][i]
      i+=1
    j+=1
    
  #print ans 
```

3つほど試すも、結果として　やはりユークリッドの互除法が最速。ユークリッド先生ぱないっす。(10,000回実行)
![pe5_2.png](https://qiita-image-store.s3.amazonaws.com/0/70480/936c9205-18bf-d950-b9dd-3838c2e87e45.png)
超初心者向け　Layoutでxml作ったけど、どうclassに反映させるのか。

基礎中の基礎です。
こんな事分からない人いないだろうなと思いながら、書きます。

XMLファイルで作成したレイアウトをclassの方にどう反映させるかですが
setContentViewメソッドを使います。

新しいプロジェクトを作った時に自動生成される setContentView(R.layout.main);の部分ですね。

```
public class Example extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}
```
classだけ作ると、最初 setContentView(R.layout.main);も書いてなかったりしますが、
 setContentView(R.layout.main);を書き足せば、そのxmlが参照されます。
なお、R.layout.~の、「~」の部分を作成したxmlのファイル名にしてください。
Nginxで特定ページのキャッシュクリアする

##１．ファイル内に書かれているKEYを元に検索し、削除する

```bash
find /var/cache/nginx/example.com -type f -exec grep -l "KEY: http://example.com/$" {} \; | xargs rm -f
```
この方法であれば、正規表現を使って削除対象を柔軟に指定できます。

例えばhttp://example.com/aaaa/ディレクトリ以下を削除したい場合は

```bash
find /var/cache/nginx/example.com -type f -exec grep -l "KEY: http://example.com/aaaa/.*$" {} \; | xargs rm -f
```

とすれば削除できます。


##２．URLからファイルパスを特定し、削除する

```bash
echo -n "http://example.com/" | md5sum | awk '{print "/var/cache/nginx/example.com/"substr($1,length($1),1)"/"substr($1,length($1)-2,2)"/"$1}' | xargs rm -f
```


こちらのページが大変役立ちました。
http://server-setting.info/centos/nginx-cache-remove2.html
Phalcon DevToolsでModelを作ろうとするとエラーが出る

# この記事は古いです
以下にPhalcon 2.0.1の時の解決法を記載しました。
[Phalcon DevToolsで何やってもエラーが出る](http://qiita.com/chiyoyo/items/36d1a7b124835b82ec16)

古いバージョンも同じ方法で解決できるかもしれませんが、念のため本記事を残しておきます。

# 以下過去記事
Phalcon DevTools (1.3.4)でModelを作ろうとしたら以下のエラーが出た。

```
$ phalcon model table-name

Phalcon DevTools (1.3.4)

  Error: Builder doesn't knows where is the models directory
```

もちろんプロジェクトディレクトリのトップで実行している。
config.phpにもmodelsDirの指定はある。
というか、DevToolsが作ってくれたものそのままだし。

そんな時はdirectoryオプションをお試しあれ。

```
$ phalcon model table-name --directory=BaseDirectoryPath

Phalcon DevTools (1.3.4)

  Success: Model "table-name" was successfully created.
```

まだまだ全然慣れていないので、なぜディレクトリがわからないのか不明だが、これで解決しました。
誰か根本解決方法知っている方いましたら教えてください。

▼参考URL
http://stackoverflow.com/questions/24168843/phalcon-dev-tools-builder-doesnt-knows-where-is-the-models-directory
Project Euler 4 新たなアプローチでコーディングするも失敗するの巻き。

左右どちらから読んでも同じ値になる数を回文数という. 2桁の数の積で表される回文数のうち, 最大のものは 9009 = 91 × 99 である.

では, 3桁の数の積で表される回文数の最大値を求めよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%204

自分の書いたコードを見直してみた。
割り算の余りが0にならないか否かを判定している点が、素数判定的に考えると、改善の余地がありそうに見える。

![pe4.png](https://qiita-image-store.s3.amazonaws.com/0/70480/d970dba8-aabc-8710-3ed5-1ae165c3f5af.png)

エラストテネスの篩に類似したアルゴリズムとして、次のようなアルゴリズムを考えた。

1. まず、3桁の数の積となる数のリストを作る。
[False,False, ‥,True,‥] 100万未満の夫々の数に対応、Trueが3桁の数の積となるところ
2. 回文数を`target = seed * 1000 + int(str(seed)[::-1])`で生成し、大きな数から上記リストをサーチ、Trueになる数が見つかった時点で終了。

上記を実装してみた。

```
def erat_approach():
  tl = [False]*(10**6)
  for i in range(800,1000):
    tl[i*800:i*1000:i] = [True]*200
  t = 999
  while 1:
    n = t*1000+int(str(t)[::-1])
    if tl[n]:
      break
    t-=1
  print n
```

結果　爆遅だった(100回実行)

![pe4_2.png](https://qiita-image-store.s3.amazonaws.com/0/70480/bed21f1f-72ce-fdae-880b-763791d529e4.png)
HerokuにRailsアプリをデプロイする手順

Herokuでアプリを動かそうと思って久しぶりに触ったら、思った以上に忘れててハマったので手順をメモしておきます。

# 前提条件
- gitコマンドをインストールしておくこと。
- heroku操作用のツール(heroku-toolbelt)を[公式サイト](https://toolbelt.heroku.com/)からインストールしておくこと。
- 今回はRailsアプリの場合の手順です。
- Macで動かしてますが、Windowsでも多分同じです。
- デプロイしたいプログラムがGitリポジトリ化してある事。
  - コミットしたくないデータ(パスワード等)は、ソースコード上では`ENV['ADMIN_PASSWORD']`みたいな形で、環境変数から読み取るようにしておくこと。

# 手順

## 1. 仮想マシンの作成 + Gitリポジトリとの紐付け
最初にHeroku上にデプロイ用の仮想マシンを作成し、gitリポジトリと紐付けておきます。
(Herokuへは、`git push remote`でデプロイする形になります)

```bash:
$ git checkout {あなたのアプリ}
$ cd {あなたのアプリ}
$ heroku login
$ heroku create
```
## 2. 仮想マシンの設定
仮想マシンの設定と、アドオンの形式で提供されるDB等をインストールしておきます。

```bash:
# 初期では仮想マシン名がランダムな名前のため、識別しやすい名前にしておく
# しておかないと、管理画面で見た時にわけがわからなくて悲惨。
$ heroku app:rename 適当なサーバー名   

# データベースのインストール(PostgreSQL以外は有料なので注意)
$ heroku addons:add heroku-postgresql

# cron的に使うスケジューラをインストール。
# cronいらない人は不要です。
$ heroku addons:add scheduler
$ heroku addons:open scheduler      # ブラウザ上の設定ページが開く

# Timezoneを日本にしておく
$ heroku config:add TZ=Asia/Tokyo
```

### 3. デプロイ
やっとプログラムをリリースします。
環境変数でコミット出来ない秘密の値をセットするのがポイントです。

```bash:
# 環境変数の設定
$ heroku config:set ADMIN_PASSWORD=secure_value

# デプロイ
# エラーなく終了することを確認
$ git push heroku master

# サーバサイズ(Dyno)を最小にしておく
# 初期が1のはずなので本来は不要だが、課金が怖いので念のため。
$ heroku ps:scale web=1

# データベース構築
$ heroku run rake db:schema:load   # db:migrateがこけなければ、そちらの方がベター
$ heroku run rake db:seed
```

以上です。
ブラウザでの動作確認を行うには以下のコマンドを実行してください。

```bash:
$ heroku open
```

URLが`https://仮想マシンの名前.herokuapp.com`となっていることが確認出来ますね。
なお、独自ドメインを振りたい場合は上記のURLにCNAMEしてあげればOKです。

# ハマったポイント
- デプロイ(`git push heroku master`)がコケまくります。
    - Gemfileに「Macのみにインストールする」みたいな設定が入ったGemfile.lockをコミットしていると、こけます。
    - 特定環境のみにインストールするgemを使いたい場合は、groupで指定するのが正しいみたいです。[参考](http://www.johnplummer.com/rails/heroku-error-conditional-rbfsevent-gem.html)
- `heroku run rake db:migrate`がうまく動かなかった。
    - [devise](https://github.com/plataformatec/devise)のせい？？ 
    - `db:scheme:load`で回避できるけど、最新のscheme.rbがコミットされていないとおかしくなるので要注意。
        - 後、migrationファイルでENGINEを設定したり、scheme.rbに残らない内容があるとかなりまずい。
- デプロイ後のログが見方がわからず、デバッグが進まなかった。
    - `heroku logs -t`で、tail出来るのがわかったので解決。
    - heroku-toolbeltを使いこなせないと辛い・・・ [このページ](http://morizyun.github.io/blog/heroku-postgresql-useful-commands/)のリファレンスが大活躍。
Array#product で多重ループを回避しよう

複数の配列があり、その全ての組み合わせでループしたいときってありますよね。
そんな場合に以下のようなコードを書いて、なんとなく悲しみにくれたりしていませんか？

```ruby
index = 1

(2010..2015).each do |year|
  (1..10).each do |number|
    ('a'..'z').each do |char|
      puts("(#{index}) year: #{year}, num: #{number}, char: #{char}")
      index += 1
    end
  end
end
```

そんなときに便利なのが [Array#product](http://ref.xaio.jp/ruby/classes/array/product) です。
これは、レシーバの配列の要素と引数で与えられた配列の要素の全ての組み合わせ ([デカルト積](http://ja.wikipedia.org/wiki/%E7%9B%B4%E7%A9%8D%E9%9B%86%E5%90%88)) を返してくれます。
しかも引数には複数の配列を指定できます。
※ Range オブジェクトのままでは product メソッドは利用できないので Array に変換しています。

```ruby
Array(2010..2012).product(Array(1..2), Array('a'..'c'))
# [
#   [2010, 1, "a"],
#   [2010, 1, "b"],
#   [2010, 1, "c"],
#   [2010, 2, "a"],
#   [2010, 2, "b"],
#   [2010, 2, "c"],
#   [2011, 1, "a"],
#   [2011, 1, "b"],
#   [2011, 1, "c"],
#   [2011, 2, "a"],
#   [2011, 2, "b"],
#   [2011, 2, "c"],
#   [2012, 1, "a"],
#   [2012, 1, "b"],
#   [2012, 1, "c"],
#   [2012, 2, "a"],
#   [2012, 2, "b"],
#   [2012, 2, "c"]
# ]
```

この Array#product を利用して最初のコードを書き換えてみましょう。
(最初のコードとループの返り値が違いますが、そこはご容赦ください。)

```ruby
Array(2010..2015).product(Array(1..10), Array('a'..'z')).each.with_index(1) do |(year, number, char), index|
  puts("(#{index}) year: #{year}, num: #{number}, char: #{char}")
end
```

✌ ('ω' ✌ )三 ✌ ('ω') ✌ 三( ✌ 'ω') ✌  スッキリ！
Jacksonでnullのときのシリアライズの設定方法

nullのときは空文字を返すための設定

nullのときのシリアライザークラスを作成

```lang:NullValueSerializer 
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;

public static class NullValueSerializer extends JsonSerializer<Object> {
        @Override
        public void serialize(Object t, JsonGenerator jsonGenerator, SerializerProvider sp)
        throws IOException, JsonProcessingException {
          jsonGenerator.writeString("");
        }
      }
```

あとはSerializerProviderに上記をセットしたものを、ObjectMapperのインスタンスにセットする。

```

import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializerProvider;
import org.codehaus.jackson.map.ser.StdSerializerProvider;

/ *  */

final ObjectMapper mapper= new ObjectMapper();

StdSerializerProvider serializeProvider = new StdSerializerProvider(); 
serializeProvider.setNullValueSerializer(new NullValueSerializer());

mapper.setSerializerProvider(serializeProvider);
```


* 参考

http://qiita.com/hikaruworld@github/items/0d629580584de1708b71
カスタマイズSNSシェアボタン設置方法 | Facebook,Twitter,はてぶ,LINE

オリジナル画像を用いたシェアボタンを実装した際に使ったもの。

```html
■ Twitter

<a class="twitter btn" href="http://twitter.com/share?url=[共有したいURL]&text=[任意のテキスト]&via=[ツイート内に含まれるユーザー名]&related=[関連アカウント]" target="_blank">tweetする</a>


■ Facebook

<a class="fb btn" href="http://www.facebook.com/share.php?u=[共有したいURL]" onclick="window.open(this.href, 'FBwindow', 'width=650, height=450, menubar=no, toolbar=no, scrollbars=yes'); return false;">Facebookでシェアする</a>

■ LINE

<a class="line btn" href="http://line.me/R/msg/text/?[任意のテキスト][共有したいURL]">LINEで送る</a>

■　はてぶ

<a href="http://b.hatena.ne.jp/entry/hoge.html[共有したいURL]" class="hatena-bookmark-button" data-hatena-bookmark-layout="simple" title="任意のタイトル">はてなブックマークに追加	</a>
Facebookシェア | OGP設定完全版 2015

OGPの設定を行なう際、様々な書き方があり躓いたので備忘録的に。

とりあえずこれらをheadの中に書けば問題なし。

```html
<!-- ogp -->
<meta property="og:title" content="タイトルはここ" >
<meta property="og:type" content="article"/>
<meta property="og:description" content="説明文はここ">
<meta property="og:url" content="http://www.hogehoge.html" >
<meta property="og:image" content="http://www.hogehoge/img1.jpg" >
<meta property="og:site_name" content="webサイトのタイトル" >
<!-- //ogp -->
はじめるJupyter Notebook

Jupyter Notebookは、Pythonのコードを含んだWebページ(ドキュメント)を作成できる機能です。

Pythonコードは単純なテキストではなくきちんとPythonコードとして実行されるため、実行可能なコードとその結果を併せて保存しておくことができます。その上Webページのリッチな装飾で解説を入れ、公開／共有できるという至れり尽くせりなツールなのです。

[nbviewer](http://nbviewer.ipython.org/)はGithub/Gistに上げたJupyter Notebookを参照できるサイトで、こちらを見ればどんな感じで仕上がるのかを見ることができるます。

これを使わない手はない、ということでその使い方について解説します。

# インストール
[Installing Jupyter Notebook](https://jupyter.readthedocs.io/en/latest/install.html)

```
pip install jupyter
```

これでインストールを行った後、以下のコマンドでJupyter Notebookのサーバーが起動しドキュメントを作成できるようになります。

```
jupyter notebook
```

なお、Numpyなどの計算系ライブラリとセットで扱う場合は、AnacondaかMinicondaを利用したほうがよいと思います(特にWindowsの場合)。手元の環境ではMinicondaからcondaを使ってセットアップしました。

基本的には`jupyter notebook`を実行したフォルダで作業を行うことになるので、ファイルを保管したいディレクトリで起動を行ってください。

# Notebookの作成

起動すると以下のような画面が表示されると思います。New Notebookからファイルを作成していきましょう(Python3を選択します)。

![image](https://qiita-image-store.s3.amazonaws.com/0/25990/ede76c28-b79b-4b9e-e481-d98111fd86f2.png)

Jupyter NotebookはCellという単位で文書を構築します。このCellにはPythonコードやMarkdownテキストといった種別があるので、適切なものを選択し文書を作成していきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/25990/1addc7f0-5d96-7a2e-0a0a-7a020114605b.png)

実行ボタンを押すことで、Pythonコードが実行されたりMarkdownが表示されたりします。

![image](https://qiita-image-store.s3.amazonaws.com/0/25990/a83946ae-0d6a-6b1b-8b60-cbd938e7b0b5.png)

保存を行うと`ipynb`形式で保存されます。後は、これでどんどんドキュメントを作成していく形になります。作成したBookはnbviewerで共有してもよいですが、GitHubの場合そのまま表示をしてくれます。

これで分析手法などを実行可能なPythonコードベースで、且つ解説付きで共有できるようになるのでノウハウ共有などにとても役に立つと思います。
特定のタグのついたセキュリティグループ内容を編集だけできるIAMポリシー


特定のタグのついたセキュリティグループの内容を「編集だけ」できるIAMポリシーです。

`{TagName}`,`{TagValue}` を任意のタグ名と値ものに置き換えてください。


```IAM-Policy
{
   "Version": "2012-10-17",
   "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:AuthorizeSecurityGroupEgress",
        "ec2:AuthorizeSecurityGroupIngress",
        "ec2:RevokeSecurityGroupEgress",
        "ec2:RevokeSecurityGroupIngress"
      ],
      "Condition": {
        "StringLike": {
          "ec2:ResourceTag/{Tagname}": "{TagValue}" 
        }
      },
      "Resource": [
        "*"
      ]
    }
  ]
}
```

## まとめ

AWSで好きなサービスはIAMです。

　
　
＃他のIAMの記事
http://qiita.com/simeji/items/3d59abdf0d3795438459
Google Cloud Datastore Masakari Talk

[Datastore Masakari Talks](http://connpass.com/event/11798/) で Google Cloud Datastore について話をしてきました。

その時のスライドの内容に多少の補足をいれつつ、ここにまとめておきます。

なお、Masakari Talk ということで弱点や注意点だけを取り上げてていますが、Google Cloud Datastore はスケーラブルな分散データストアでありつつ、単純な KVS にとどまらずクエリで検索できるし、 ACID トランザクションもあるしで、とても優秀なデータストアです。

## SQLっぽいけど、SQLではない

JOIN, GROUP BY, OR, 集計関数(MAX, MIN) などが無い。

基本的にインデックスを使って最小限にスキャンして、必要なエンティティを取ってくるデータベース。BigQueryと違ってフルスキャンではないので、集計やORなど出来ない。

## クエリにはインデックス必須

インデックス数の上限もある。

クエリの WHERE や ORDER BY などで複数のプロパティを使う場合は、その組み合わせの複合インデックスが必要になる。事前に必要となるインデックスを考えながら設計が必要。

## エンティティ1MB制限

無限のスケーラビリティと思いきや、1つのエンティティは1MB以下。

大きなデータは Google Cloud Storage に保存する必要がある。

## 結果整合性

強い整合性(Strong Consistency)のクエリが使える状況には制限があり、結果整合性(Eventual Consistency)のクエリを使う箇所が出てくる。

Strong Consistency が必要となる機能があるのであれば、パフォーマンスに注意しつつ Entity Group を設計する必要がある。

## トランザクションに制限がある

最大で 25 Entity Group までしか、トランザクションに参加できない。

これも要件によって Entity Group を設計する必要がある。ただ、Web系のユースケースではそこまで多くの Entity Group をトランザクションに参加させることは少ないと思われる。

## マイグレーションが面倒

新しいプロパティを追加しても、既存のエンティティは自動では更新されない。

実はスキーマレスなので、同じ Kind のエンティティが違うプロパティで保存されていても問題はない。プロパティの追加や変更をした時は、古いバージョンで保存したデータを読みだした時に問題が発生しないように実装する必要がある。

## スナップショットが難しい

書き込みを停止してバックアップしないと、ちゃんとしたスナップショットにはならない。

あとはネームスペースを上手く使うと出来るかも？

## まとめ

SQL風のクエリがあるからといって、RDBのように使えると勘違いして設計すると死ぬ。
【メモ】Hibernateでinsert時にprimary keyでauto incrementを指定している時

# 概要
```text
ERROR [2015-02-27 11:01:38,781] io.dropwizard.jersey.errors.LoggingExceptionMapper: Error handling a request: ef46ad41b77903a3
! com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'hoge.hibernate_sequence' doesn't exist
! at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_20]
```

こんな感じのエラーが出たので対応したい

# コード

```java:hoge.bean.hoge.java
package hoge.bean;


import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import org.joda.time.DateTime;

@Entity
@Table(name="hoge_table")
public class HogeTable {	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY) // これをつけて解決
	@Column(name="id")
	private Integer id;
	@Column(name="created")
	private DateTime created;
	@Column(name="modified")
	private DateTime modified;

	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}

	public DateTime getCreated() {
		return created;
	}
	public void setCreated(DateTime created) {
		this.created = created;
	}
	public DateTime getModified() {
		return modified;
	}
	public void setModified(DateTime modified) {
		this.modified = modified;
	}	
}

```

[元ネタのstackoverflow](org.hibernate.engine.internal.StatisticalLoggingSessionEventListener)
bugsnag APIをrubyから使ってみる

ログ収集にbugsnagを検討しているのですが、カスタム値などはウェブで見にくいのでAPIが必須です。ということでAPIを使ってみました。

が、まず叩くところでいくつかつまづきました

## APIドキュメント
https://bugsnag.com/docs/api/ruby

rubyの場合だと、bugsnag-apiというgemが提供されているのでこれを使用します。

## gemをインストール
```
$ gem install bugsnag-api
```

## require 'bugsnag-api'が通らない

requireで指定する文字列がどこにも書かれて無くてしばらく悩みました。。

```
x require 'bugsnag-api'
o require 'bugsnag/api'
```

## 401が返ってくる

```
irb(main):008:0> client = Bugsnag::Api::Client.new(auth_token: "your-account-api-token")
irb(main):009:0> client.accounts
Bugsnag::Api::Unauthorized: GET https://api.bugsnag.com/accounts: 401 - Error: Bad Credentials
```

サポートに問い合わせてみました。

>Hey Yoonchul,
>
>It looks like you're using your Project API key. Instead, you should be using your Account API key. You can find that on your Bugsnag "Account Settings" dashboard under the "API" section.
>
>Thanks,

僕が指定しているのはProject API kay（ログを送るサービスが指定するAPI key）だと。つまり指定しているAPI Keyが違うと。
そんなことだとは思って他のを探したのですが見つからず。
もう一度くまなく探してみることに。

Settingsが3つもある。。

![スクリーンショット_2015-02-27_10_29_15.png](https://qiita-image-store.s3.amazonaws.com/0/2569/923bd2b0-dd24-89d4-769f-b11d4d19d005.png)

Account Settingsに入るとAuth Tokenがあるのでこれを指定します。

![スクリーンショット_2015-02-27_10_47_56.png](https://qiita-image-store.s3.amazonaws.com/0/2569/39f41bf0-c7f0-d676-61e4-b0f1be97f36f.png)

## やっと叩くことが出来ました
```
irb(main):015:0* client = Bugsnag::Api::Client.new(auth_token: "your-account-api-token")
=> #<Bugsnag::Api::Client:0x007fd19348b5e0...
irb(main):016:0> client.accounts.length
=> [{:id=>"xxxxxxxxxxxxxxxxxxxx", :name=>"Toreta"...
```
（仮）サンプル集　リモートwindows情報を取得

Zabbixからエージェントレスでリモートwindows端末の情報を取得する。
windows情報はスクリプトからwmiを利用して取得したものを利用する。

# 前提条件
WMI クライアントがインストールされていること。

# zabbixへの登録手順
- 設定したいホストへitemを登録

　タイプを"外部チェック"、キーはスクリプト名にする。
　キー例）hoge.pl[引数1, 引数2]
　キー例マクロ指定時) hoge.pl[{$HOST}, 引数2]

- 作成したスクリプトを/usr/lib/zabbix/externalscriptsへ配置
　実行権限を付与する

- うまくいかない場合は、/var/log/zabbix/zabbix_server.logを確認する


# 前回の起動時間を取得
一部抜粋

```pl

my $txt = `wmic -U $domain/$user%password //$host "select LastBootupTime from Win32_OperatingSystem"`

```

# 稼働日数を取得

```pl

# ARGVでzabbixから引数を受け取る
my $host = ARGV[0];
my $domain = ARGV[1] || 'localhost';
my $user = ARGV[2] || 'yasu';
my $password = ARGV[3] || 'password';

my $txt = `wmic -U $domain/$user%password //$host "select LastBootupTime from Win32_OperatingSystem"`

# $data[0]: class, $data[1]: フィールド名, $data[2]: 起動時間
my @data = split("\n", $txt);

my ($yy, $MM, $dd, $hh, $mm, $ss) = $data[2] =~ /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/;

# 起動時間のunix time（秒）取得
my $last = timelocal($ss, $mm, $hh, $dd, $MM-1, $yy-1900);
# 現在のunix time(秒)取得
my $now = time;
# 差分
my $run_time = $now - $last;

my $day = int($run_time / (24 * 3600));
my $hour = int($run_time % (24*3600)/3600 );
my $minuts = int ($run_time % (3600)/60 );
my $seconds = int ($run_time % 60 );
#print $day, "日", $hour, "時間", $minuts, "分", $seconds, "秒";

print $run_time;
```

itemの追加時に単位をuptime　~~unixtime~~　にする。

# CPU使用率


```wmi_cpu_rate.pl
#!/usr/bin/env perl
use strict;
use warnings;

my $host = $ARGV[0];
die "usage wmi_drive.pl <host> <drive_name>" unless defined $host;

my $txt = wmi(
    host=>$host,
    user=>'ユーザー名',
    password=>'パスワード',
    #delimiter=>'',
    sql=>'select LoadPercentage from Win32_Processor'
    );


my @data = split("\n", $txt);

my $class = shift @data;
my @fields = split("\|", shift @data);

my @output = split('\|', shift @data);

print $output[1];

# wmicサブルーチン
sub wmi {
    my $args = {@_};
    croak("You must provide host") unless defined $args->{host};
    croak("You must provide password") unless defined $args->{password};
    croak("You must provide user") unless defined $args->{user};
    croak("You must provide sql") unless defined $args->{sql};
    
    my $domain = $args->{domain} || 'localhost';
    my $user = $args->{user};
    my $password = $args->{password};
    my $sql = $args->{sql};
    my $host = $args->{host};
    my $command = "wmic -U $domain/$user%$password //$host ".'"'.$sql.'"';
    $command = $command.' --delimiter='.$args->{delimiter} if defined $args->{delimiter};

    print $command, "\n" if defined $args->{debug};

    my $txt = `$command`;
    return $txt;
}


```

item登録プロパティ登録例

item名 CPU使用率
タイプ　外部チェック
スクリプト名1 wmi_cpu_rate.pl[192.168.56.100]


# メモリ
仮想メモリ（ページングファイル）


# itemに設定する単位
wmiの返却値がバイトなら単位にBを使用する。
KBなら単位にBを使用して、乗数にチェックを入れ1024を使う。
ES6 Template stringsの嬉しさ


ES6で追加される[Temlate strings](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/template_strings)の嬉しさを書きます。

JavaScriptでDOMElementを追加する方法を考えます。
次のHTMLをbodyに追加してみましょう。

```html
<div class="hoge">
	Hello world!
</div>
```

## ビフォー

### createElementを使う

```js
var div = document.createElement('div')
div.classList.add('hoge')
div.appendChild(document.createTextNode('HelloWorld!'))

document.body.appendChild(div)
```

長くて書くのが大変です。
元のHTMLから、API呼び出しに置き換えるのが手間です。

### insertAdjacentHTMLを使う

```js
var div = "<div class="hoge">Hello world!</div>"

document.body.insertAdjacentHTML('afterend', div)
```

簡単に書けます。
改行できません。
追加するHTMLが複雑になったら、`div`文字列の定義を無限に右に伸ばすのでしょうか？
それとも`+`演算子を使って、改行ごとに結合しましょうか？

こんな感じで

```
var div = '<div class="hoge">' + 
	'Hello world!' + 
	'</div>'
```

### jQueryを使う

```js
var $div = $('<div>')
	.class('hoge')
	.append('Hello World!')

$('body')
	.append()
```

メソッドチェーンで書けます。
複雑なHTMLもメソッドをつなげて書けます。
元のHTMLから、メソッド呼び出しに置き換えるのは手間です。
また、修正する際に、元のHTMLをイメージするのが大変です。

## アフター
```js
const div = `
	<div class="hoge">
		Hello world!
	</div>
`

document.body.insertAdjacentHTML('afterend', div)
```

なんと！そこには、入れたかったHTMLが、そのままあったのです！！！

デザインを決める時に使ったHTMLをそのまま使えます。
修正時にHTMLのどの部分を置き換えればいいかイメージしやすいです。

## 与太話

[ヒアドキュメント](https://ja.wikipedia.org/wiki/%E3%83%92%E3%82%A2%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88)や[逐語的文字列](https://msdn.microsoft.com/ja-jp/library/ms228362.aspx)などの改行を含む文字列を表現できるプログラミング言語があります。一方、改行を含む文字列を持たないプログラミング言語は、HTMLやSQLなどの長い文字列をソースコード中に持つのが苦手です。改行とインデントを維持できません。人間が読みやすい形式を維持できません。

JavaやVB.NETでのソースコード中のSQL文字列を思い出してください。
うう、頭が・・・

人類はそれを解決するために、外部ファイルに定義したSQLを読み込ませたり、SQLを構築するメソッド集ライブラリを作ったり、ModelからSQLを自動生成したり・・・

そうじゃない！そのまま書きたいんだ！

ユーザーが入力した値を埋め込む場合は、SQLインジェクションやXSS対策が必要です。お気をつけください。
AipoのスケジュールをGoogleカレンダーに同期表示する

# AipoのスケジュールをGoogleカレンダーに同期表示する

これ単体で動きます。  
PHP5.4から対応です。（Guzzle3使ってるので）

## Google Developer Consoleでの設定

### 新規プロジェクトの作成

https://cloud.google.com/console へアクセスして、Google Calendar 連携用のプロジェクトを作成します

 ![ss01.png](https://qiita-image-store.s3.amazonaws.com/0/18487/6e41482f-8a62-47da-2e92-bb8a4fe33432.png)

### Google Calendar APIの有効化

APIタブでプロジェクトでGoogle Calendar APIを有効化します  

![ss03.png](https://qiita-image-store.s3.amazonaws.com/0/18487/d700bc7b-10b1-3927-7e59-daabcc1c0aae.png)

### 認証情報の生成と取得

プロジェクトで利用するクライアントIDを作成します  

![ss05.png](https://qiita-image-store.s3.amazonaws.com/0/18487/c231cfe3-338e-24e5-b9b0-f4011241777e.png)

クライアントIDのタイプは「サービス アカウント」になります。

![Google_Developers_Console.png](https://qiita-image-store.s3.amazonaws.com/0/18487/59204fb7-1a08-0e7c-6186-e928cb83662c.png)

鍵ファイル（~.p12）がダウンロードされるので保存しておくこと。

## Google Calendarでの設定

### Aipo用カレンダーを追加

![スクリーンショット_2015-01-13_10.37.07.png](https://qiita-image-store.s3.amazonaws.com/0/18487/1e74ff09-dba6-e1a7-5878-5e4beac52ff1.png)

![Google_カレンダー.png](https://qiita-image-store.s3.amazonaws.com/0/18487/15e2a962-61f0-94e6-ebbc-b0d0fe39662e.png)

カレンダー名を使うので覚えておくこと。  
特定のユーザと共有に先ほど作ったクライアントIDのメールアドレスを入力。  
（~@developer.gserviceaccount.com）  
※[権限の設定]を「変更および共有の管理権限」または「予定の変更権限」に設定

## 同期ツールの設定


### インストール

```
git clone git@github.com:fantasista21jp/aipo_to_gcal.git
cd aipo_to_gcal
composer install
```

https://github.com/fantasista21jp/aipo_to_gcal

### 設定

configs.php の↓の部分を自分の設定に合わせて修正

```
$clientId = 'Your Client ID';
$authEmail = 'Your Auth Email';
$p12Key = 'Your P12 Key File Path';
$targetCalendar = 'Your Calendar Name';
$aipoUser = 'Your Aipo User';
$aipoPasswd = 'Your Aipo Password';
$aipoIcalUrl = 'Your Aipo Ical URL';
```

### 動かす

```
/usr/bin/php /pathto/upload.php
```

↑で動くのでシェルファイルを作って cron.daily, cron.hourly とかに突っ込めば幸せになれるよ。  

なお、とりあえず自分用に時間かけずに作ったので、ソースコードにはあんまりツッコミ入れないでね。

### 追記

PHP7 で使いたい人は、composer.json の guzzlehttp/guzzle, guzzlehttp/ringphp のバージョンをそれぞれ、6.2.2, 1.1.0 とかの新しいものに指定して、
composer update して下さい。

### 追記2

内容（説明）と場所も同期するようにしてみました。
https://github.com/fantasista21jp/aipo_to_gcal
Xcode開発環境下，C++でファイル読み込みをする際の覚書


C++でテキストファイルやcsvファイルを読み込むときの，ファイルを置くディレクトリについて

* とりあえず，current working directoryをコンソールに表示して，自分がどこにいるのかを探す

```*.c++
#include <unistd.h>
```

を追加include

```*.c++
main()
```
の下に以下を付け足す。

```*.c++
char *cwd ;
cwd=getcwd(NULL, 0);
printf("current working directory:%s\n", cwd);
free(cwd);
```

* current working directoryにファイルを移す

あるいは

* Preferences -> Locations -> Derived Dataに行って，Pathを変更する
IPFS(The InterPlanetary File System)まとめ



公式サイトの動画を見るのが、わかりやすいです。

## IPFSの概要

* P2Pなファイルシステム
* P2P上にWebサイトを置いたりできる
 * サーバがダウンしたり、消されたりしない

## 感想

* 大雑把な概要: P2P上に作るファイルシステムでP2PなWebが作れたりするもの
* 公式サイトのミラー、IPFSバージョンを見てみたが、数秒で表示される。思ったより早い
 * 公式のIPFS上のミラーサイト: [gateway.ipfs.io/ipfs/QmUwysxnfccA1mArjkzTxPRhMnJuLvA6CqgzAPJt9cwMsc/](http://gateway.ipfs.io/ipfs/QmUwysxnfccA1mArjkzTxPRhMnJuLvA6CqgzAPJt9cwMsc/)
* 作者自体がクレイジーと言うとおり、結構クレイジーなプロジェクト
* Filecoinと相互互換的で、インセンティブのあるシステムを作れる?

## IPFSが利用されているサービス・プロダクト

* Web作成サイトのNeoCitiesが、IPFSを利用
 * 公式サイト: [Neocities: Create your own free website!](https://neocities.org/) 
 * I説明記事(IPFS上のページ): [HTTP is obsolete. It's time for the distributed, permanent web](https://ipfs.io/ipfs/QmNhFJjGcMPqpuYfxL62VVB9528NXqDNMFXiqN5bgFYiZ1/its-time-for-the-permanent-web.html)
* Embarkのデプロイ先として利用されている
 *  [Embark - Framework for Ethereum DApps](https://iurimatias.github.io/embark-framework/)
* Erisもファイルストレージとして利用?
[Engineering DAPPs | Eris CLI Services Walkabout: IPFS](https://eng.erisindustries.com/tutorials/2015/08/05/ipfs-as-a-service/)
* iNationのunPassportが使っている?
 * [iNation's unPassport Will Let You Upload Your Passport In October, Full Interview - Coinjournal](http://coinjournal.net/inations-unpassport-will-let-you-upload-your-passport-in-october-full-interview/)
* FreeNASがIPFSに対応
 * [What's New with FreeNAS » Announcing FreeNAS-10 ALPHA](http://www.freenas.org/whats-new/2015/10/announcing-freenas-10-alpha.html)
* IPFSのpastbin
 * [VictorBjelkholm/ipfsbin](https://github.com/VictorBjelkholm/ipfsbin)


## 有用なリソース

* [ipfs/awesome-ipfs: Useful resources for using IPFS and building things on top of it](https://github.com/ipfs/awesome-ipfs)


## サマリー

### IPFSは、プロトコル

### IPFSは、ファイルシステム

### IPFSは、Web

### IPFSは、モジュラー

### IPFSは、暗号を利用

### IPFSは、P2P

### IPFSは、CDN

### IPFSは、ネームサービスを持つ


### 引用元

* [jbenet/ipfs](https://github.com/jbenet/ipfs)


## 公式サイト

* IPFS公式サイト: [ipfs.io](http://ipfs.io/)
* IPFSのGitHub: [jbenet/ipfs](https://github.com/jbenet/ipfs)

## 掲示板

* [IPFS Alpha Demo : Bitcoin](http://www.reddit.com/r/Bitcoin/comments/2wngte/ipfs_alpha_demo/)


## 日本語情報

* [IPFS (The InterPlanetary File System) について半日を費やして調べてみた - カラクリサイクル](http://the.nyarla.net/entry/2015/09/27/144852)
* [インターネットは過剰と過密による窒息死を防ぐためにHTTPからIPFSへ大改造すべきだ | TechCrunch Japan](http://jp.techcrunch.com/2015/10/06/20151004why-the-internet-needs-ipfs-before-its-too-late/)
* [IPFSをソースからインストールする方法 - Qiita](http://qiita.com/hshimo/items/82119b27d10109966a5e)



## IPFS関連記事

[IPFS Introduction by Example](http://whatdoesthequantsay.com/2015/09/13/ipfs-introduction-by-example/)

## ツール

* [ipfsd-ctl](https://www.npmjs.com/package/ipfsd-ctl)
* Firefoxアドオン: [IPFS Gateway Redirect :: Add-ons for Firefox](https://addons.mozilla.org/ja/firefox/addon/ipfs-gateway-redirect/)

## SWARMと違い

* [IPFS & SWARM · ethersphere/go-ethereum Wiki](https://github.com/ethersphere/go-ethereum/wiki/IPFS-&-SWARM)


## 関連用語

* 惑星間ファイルシステム
* Filecoin
* Git, BitTorrent, Kademila, Bitcoin
例外処理を使ってfizzbuzz

[とある記事](http://qiita.com/pondzu/items/b2ab4bc09406152621ea)を見て面白そうだったのでやってみました。

## 例外の遷移での特殊な所は、処理の継続？部分をスキップできるところ

個人的には例外での遷移の特殊な所は、処理の継続？の部分を捨ててexceptした所にjumpすることだと思います。

具体的には、以下の様な感じです。

```py
try:
    print(object() + 1)
except TypeError:
    print("hai")

# hai
```

通常の処理ならば `object() + 1` に対する継続？である `print()` 呼び出しをスキップすることはできないですが。エラーが発生したら例外が投げられる。例外を処理する部分(try-except)が存在したら、そこで投げられた例外をキャッチする。という仕組み担っているため、 `print()` 呼び出しをスキップすることができています。

## 例外発生が終了条件としてみても

また、iterable objectのStopIterationではないですが、例外が発生したら止まる。そういう仕様にすることでループの終了条件にすることもできそうです。

幸い、通常のfizzbuzzは「1~100」までとなっています。また100を文字列にしてその長さを取ると `len("100")` は3なので、3桁目の最初で例外を投げれば良いということになります。これには長さが3のリスト(xs)を作ってそれに対して `xs[len(str(i))]` とでもやってあげれば大丈夫そうです。

## そんなわけで

何か制約を付けて書いてみた方が良い気もしましたが特に良い物を思いつきませんでした。無駄にループではなく再帰してたりしてます。

```py
import sys

xs = ["fizz", "", ""]


def g(i, x, out):
    try:
        return out((i % 5) or "buzz")
    except TypeError:
        try:
            x = xs[i % 3] or (i % 5) / (i % 5) and i
            return out(i, int(x), out)
        except ValueError:
            try:
                x += g(i, x, lambda y: y)
            except TypeError:
                pass
        except ZeroDivisionError:
            x = "buzz"
        out(i, x, out)


try:
    g(1, None, lambda i, x, out: xs[len(str(i))][g(i + 1, sys.stdout.write("{}\n".format(x)), out)])
except IndexError:
    pass
```
あとは例外処理のエラーメッセージからfizzbuzzを作っても良さそうですが止めました。
Laravel5 HerokuでPostgreSqlを使う設定


## Heroku : PostgresSql addonを使えるようにする

アドオンの追加

```
heroku addons:add heroku-postgresql
```

アドオンが有効になったか確認したい場合

```
heroku pg:wait
```

アドオン追加で、Heroku環境変数に、 ```DATABASE_URL``` と ```HEROKU_POSTGRES_*COLOR*_URL``` が追加されている。同じ値。
（*COLOR*部分は色の名前が割当てられている）

### 割り当てられた環境変数の値確認

全部の環境変数のキー:値を知りたい時

```
heroku config
```

キーがわかっているもののみ知りたい時

```
heroku config:get DATABASE_URL
```

## Laravel用にHeroku環境変数をセットする

Database接続値を見極める

```
postgres://username:password@hostname:5432/database
```

- スキーマ : postgres
- ユーザー名 : username (//から:まで）
- パスワード : password (ユーザー名後の:から@まで）
- ホスト名 : hostname (パスワード後の@から:まで）
- ポート : 5432
- データベース名 : database (ポート後の/から最後まで）

それぞれLaravel5の環境変数値に割り当てる

- DB_HOST : hostname
- DB_USERNAME : username
- DB_PASSWORD : password
- DB_DATABASE : database

コマンドはこんな感じ。

```
heroku config:set DB_HOST=hostname
```

## 設定の確認

Laravelのマイグレーションやってみる。
one-off dynoでマイグレーションを実行する。

```
heroku run "php artisan migrate:install"
```

エラーが出なければ大丈夫。（成功したときのメッセージ、コピっとくの忘れた・・）

マイグレーションの状態を確認。

```
heroku run "php artisan migrate:status"
```

## HerokuのPostgreSqlに接続

同じホスト名に他の人のDatabaseも沢山あるので、自分のを指定して接続。

```
heroku pg:psql DATABASE_URL
```

※ ```DATABASE_URL```の所は、```HEROKU_POSTGRES_*COLOR*_URL```でも良い。

### PostgreSqlのテーブルを確認

テーブル一覧表示

```
DATABASE=> \d
```
Arduino入門メモ



# Arduinoについて

- [Arduino UNO](http://arduino.cc/en/Main/arduinoBoardUno)
- [Arduino リファレンス](http://arduino.cc/en/Reference/HomePage)
- [Arduino 日本語リファレンス](http://www.musashinodenpa.com/arduino/ref/)

# 参考リンク

- [これだけは抑えておきたい】Arduino入門まとめ](http://mosuke5.hateblo.jp/entry/2014/07/21/231946)
- [JavaScriptでも制御できる！ Arduinoの基礎知識 (1/2)](http://www.atmarkit.co.jp/ait/articles/1405/21/news033.html)
- [電子回路を作る基礎を学びNode.jsでボードを操ろう (1/2)](http://www.atmarkit.co.jp/ait/articles/1406/23/news026.html)

更新予定
LD_LIBRARY_PATHとPythonとPaiza.io問題あるいはpaiza.ioでmrubyを動かしhttp2通信する

# 背景

Paiza.ioはネットワークにアクセス出来たり、ファイルが扱える。

って事は、Pythonのctypes経由で[libtrusterd](https://github.com/trusterd/libtrusterd)が動かせるんじゃないか！

# 困ったこと

wgetっぽいことは案の定、Pythonで簡単に実装できた。

```py3
context = ssl.create_default_context()
conn = http.client.HTTPSConnection(host, 443, context=context)
conn.request('GET',path)
res = conn.getresponse()
f = open(libname, "wb")
f.write(res.read())
f.close()
```

たとえ、httpsでも簡単ですね™


## libeventがpaiza.ioに無い！

まぁ、libtrusterd.soと同様にこれも持ってくればOK。

## でも動かない。

tmlib.jsで有名な @phi さんがPythonの記事書いてたこと
この時初めて知ったけど、[この記事](http://tmlife.net/programming/python/python-environ.html)のお陰で、
無事LD_LIBRARY_PATHに意図したパスを追加することに成功。

```py3
os.environ["LD_LIBRARY_PATH"] = os.environ.get("LD_LIBRARY_PATH") + ":."
```

でも、相変わらず動かない。。

## じゃぁ、プロセス上げ直せばいいんじゃね

どうもdlopen時にはプロセスが起動された際の環境変数しか見てくれないっぽい。

さらに悪い事にpaiza.ioではプロセスを上げ直すと、少なくとも結果が出力されない！
もしかすると、子プロセスならうまくいく方法があるのかもだが、python経験の不足
の為、自分の書いたコードではNG。子プロセスの標準出力を親プロセスで吸い取れば
行けそうな気もしなくもないが。

## dlopenのmanを思い出す

何度でも共有ライブラリをOpenできるが、2度目以降は実際にはロードしない旨の
記述があった気がして、それって、openしたライブラリ覚えてるってことかぁ。


予め、見つからないと言われる共有ライブラリをctypes.CDLLで呼び出して、
libtrusterdを実行した。

```py3
dummy = ctypes.CDLL("./libevent-2.0.so.5")
dummy = ctypes.CDLL("./libevent_core-2.0.so.5")
dummy = ctypes.CDLL("./libevent_openssl-2.0.so.5")
```


##　大成功

- https://paiza.io/projects/sRsJB0EhFrtzjBhqEw0lMA

# まとめ

- LD_LIBRARY_PATHはコード中で書き換えてもdlopen時には時既に遅し
- 子プロセスや、プロセスの再立ち上げ出来ない状況下では、かたっぱしから、パスのとおっていない共有ライブラリをdlopenすればOK

# 関連記事

- [node-ffiをGoで入門してElectronを使って応用してみる](http://abrakatabura.hatenablog.com/entry/2015/12/11/000722)
- [WindowsでmrubyからGoで作ったライブラリを呼び出して、Webカメラの画像をコマンドプロンプトに表示した](http://abrakatabura.hatenablog.com/entry/2017/09/01/072123)
- [RustでGoのライブラリを使うときのCargoのbuild.rsの書き方](http://abrakatabura.hatenablog.com/entry/2017/10/22/110223)
Laravel4.2.x を使っていて laravel-debugbar も使っているなら「"barryvdh/laravel-debugbar": "1.8"」を忘れずに

タイトルのままですが。

先日 Laravel5 がリリースされました。

伴って、laravel-debugbar も更新されたらしい。

https://github.com/barryvdh/laravel-debugbar に書いてあった。

Laravel4.2.x を使っている場合は、 composer.json を "dev-master" から "1.8" にしないと `$ composer update` とかでコケる。

```composer.json
    "barryvdh/laravel-debugbar": "1.8"
```

とりあえず、メモ。