OmniAICreator/Qiita-1.07M huggingface dataset:
GLPI操作手順

![image](https://qiita-image-store.s3.amazonaws.com/0/55845/0eee4373-ded5-f1cc-b762-7bc65836cd1f.png)
ID:glpi　PW:glpi　でログイン。TOP画面が表示される。
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/2f6ab3a8-2bb1-dcbc-0b1a-2d8f03a75ec2.png)

【OCSNGとの連携】
プラグイン→OCS Inventory NGを選択
新規追加の場合は「新しいコンピュータをインポート」を選択
既存の情報を更新する場合は「インポートされたコンピュータを同期」を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/fb4bb8ae-ed9d-31bb-f16d-60c162c4c88f.png)
「新しいコンピュータをインポート」
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/093085df-146e-2424-10fa-3c824fdae283.png)
GLPI上で管理されているPCとの差分が無い場合は、上記の画面が表示される。差分がある場合は、以下の画面が表示されるので「インポート」を実行する。
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/b77575d8-1c64-249d-a311-a01285e8e3f2.png)
「インポートされたコンピュータを同期」
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/d90f0081-48a4-1689-05a2-a69e6b05b397.png)
GLPI上で管理されているPCとの差分が発生した場合は、差分があるPCの一覧が表示される。「同期を取る」を実行すると、差分データのマージ処理が実行される。処理完了後には一覧よりPC名が表示されなくなるので、GLPI側でのデータ加工を実施する。

【ソフトウェア情報更新】
「情報資産」→「ソフトウェア」を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/c6d9846d-2897-1e4e-4b74-2290f0c64749.png)
一覧画面より「アイテム表示」のドロップダウンリストより「カテゴリ」を選択し、「条件」ドロップダウンを「一致する」に設定して検索を実行（値が設定されていない一覧を検索）
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/e81fdc0e-7f32-ee61-73d1-7164ff51569e.png)
対象の名前をクリックし、詳細画面を表示する（複数一括更新は未実装）
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/ef4cb315-5dbb-1ff1-60b4-22736036f258.png)
内容が不明な場合は、名前をコピペしてGoogle検索。判明している場合には、コテゴリのドロップダウンより、正しい値を設定して保存する。上記の例の場合、内容はWindowsのセキュリティアップデートなので、カテゴリは「アップデータ」となる。

「情報資産」→「コンピュータ」を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/4f9f072b-0daa-39fd-279a-24dc9d4a6039.png)
対象のPC名称をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/3555c12a-94e4-d59c-096d-e6aed0df79d2.png)
修正が必要な項目を選択して実行

【新規ユーザ追加】
設定→ユーザを選択。「GLPIユーザ追加」ボタンを実行
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/d08df499-2f44-dbf6-536f-3b9013dc01b4.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/da9b1a7a-2101-33bd-f8f2-620cf93d5508.png)
ユーザ名は対象ユーザのメールアドレスの@より前を設定、PWは8文字以上を設定。必要な項目を入力して追加。

【新規グループ作成】
設定→グループを選択。「グループ作成」ボタンを実行
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/d79f93b4-ac27-479e-e789-50350d8cf426.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/55845/4c6b9ecf-6468-cd93-1c7e-e714d79711ad.png)
名称を入力し「追加」を実行
TwilioとRubyで電話でメッセージを流してみる

TwilioとRubyを使って電話でメッセージを流すのをやってみた。
だいたい公式のドキュメント通りでいけたがはまりどころもあったのでメモしておく。

# 事前準備

## Twilioの準備

 * Twilioアカウントでaccount sidとaccount sidを確認しておく
 * Twilio電話番号を取得しておく

Trialアカウントの場合は電話の掛け先が検証済電話番号のみになるが実施可能

## テキスト読み上げのためのXML配置

以下のXMLをWEBサーバーに配置しGETで取得できるようにしておく。
(試した環境ではAWS S3に配置してアクセスできるようにした)

```xml
<?xml version="1.0" encoding="UTF-8"?>                                          
<Response>
    <Say voice="alice" language="ja-JP">Testログインで障害が発生しています</Say>
</Response>
```

# コード実行

以下のコードを実行すると電話がかかってきてテキストを読み上げてくれる。

* Gemfile

```rb                                                             
source "https://rubygems.org"

gem "twilio-ruby"
```

* 本体コード

```rb
require 'twilio-ruby'                                                           

account_sid = "[account sid]"
auth_token = "[auth token]"

client = Twilio::REST::Client.new(account_sid, auth_token)
client.account.calls.create(from: '[Twilio電話番号]', 
                            to: '[掛け先の電話番号]', 
                            method: 'GET',
                            url: '[配置したXMLへのURL]')

```

# はまった

Twilio側からXMLを取りに行くのがデフォルトPOSTでAWS S3に弾かれていた。
このため電話がかかってくると「アプリケーションエラーが発生しました」と言われてしまっていた。
Twilioアカウントのログを確認して原因がわかり、methodでGETを指定するようにして対応した。

# 参照サイト

* 通話API
 * [Twilio User - Account Developer Tools API Explorer Call Create](https://jp.twilio.com/user/account/developer-tools/api-explorer/call-create)
 * [REST API: 通話を開始する [Twilio Cloud Communications - APIs for Voice, VoIP, and Text Messaging]](https://jp.twilio.com/docs/api/rest/making-calls)
* XML仕様
 * [TWIML 音声通話 : <Say> [Twilio Cloud Communications - APIs for Voice, VoIP, and Text Messaging]](https://jp.twilio.com/docs/api/twiml/say)
* 無料トライアルアカウントの制限
 * [無料トライアルアカウントの制限事項は何ですか? : Twilio for KDDI Web Communications](https://twilioforkwc.zendesk.com/entries/53884648-%E7%84%A1%E6%96%99%E3%83%88%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%AB%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E5%88%B6%E9%99%90%E4%BA%8B%E9%A0%85%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B-)
* 音声でエラーを言われた場合のQ&A
 * [アプリケーション エラーが発生しました。どうすればよいですか ? : Twilio for KDDI Web Communications](https://twilioforkwc.zendesk.com/entries/23706367-%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F-%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B-)
[iOS]SpriteKitのパーティクルに期待し過ぎてはいけない

SpriteKitを使用すればとても簡単にiOSアプリにパーティクルを実装出来ます。
これはちょっとした演出には最適ですが、それ以上のことを実装しようとするなら別の手段を考えた方が懸命です。

SKEmitterNodeで生成されたパーティクルのNodeは、Nodeとして存在はしますが、剛体やcollisionは設定できません。
どういうことかと言うと、このgifの通り。
![SpriteKitParticleNodes.gif](https://qiita-image-store.s3.amazonaws.com/0/78827/f7e4b597-61b6-99c4-a3eb-96908d6a23c4.gif)

Nodeとして扱われてるし、イケる！と思ってたら爆死したのでここに供養しておきます。
OS X 10.11 El Capitan beta 2 にしてXcode正式版(6.3.2)が起動できなくなったときの対処法

**7月28日リリースのbeta 5で直りました(　´･‿･｀)**


![Screen Shot 2015-06-24 at 08.26.12.png](https://qiita-image-store.s3.amazonaws.com/0/19398/2f800198-0257-fcab-2bf1-968ab74371a7.png "Screen Shot 2015-06-24 at 08.26.12.png")

![Screen Shot 2015-06-24 at 08.28.42.png](https://qiita-image-store.s3.amazonaws.com/0/19398/607a92df-56be-5614-e396-e25c2f15e8d7.png "Screen Shot 2015-06-24 at 08.28.42.png")


これはつらい(´・︵・｀)
Xcode 7は問題なく起動できますが、まだβなのでそれでビルドしたアプリはまだ申請できません。

ただ、メッセージ内容的に、意図的に弾いているというより、バグで間違えて弾いちゃっているようにも見えます(　´･‿･｀)

## 解決策

`/Applications/Xcode.app/Contents/MacOS/Xcode` のコマンドでターミナル経由で起動すれば問題無く起動・実行出来ます(　´･‿･｀)

AlfredのWorkflowで`xcode` のみで起動出来るようにもしたら、良い感じです(　´･‿･｀)

あるいは、こんなの作った人も。
<blockquote class="twitter-tweet" lang="en"><p lang="en" dir="ltr">I wrote a simple Xcode-launcher.app to fight OS X 10.11 El Capitan beta 2 Xcode problem <a href="http://t.co/ij0CokSgOS">http://t.co/ij0CokSgOS</a> <a href="http://t.co/Oy2URntwJr">pic.twitter.com/Oy2URntwJr</a></p>&mdash; Sash Zats (@zats) <a href="https://twitter.com/zats/status/613464620997570560">June 23, 2015</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
proxmox 4.0 でlxcコンテナから一つのIPでインターネットに出る


* CentOS7は対応していない。

## vmbr0:0を作成しておく

* [一つのIPでproxmox上の仮想OSからインターネットに出る(iptables) - Qiita](http://qiita.com/tukiyo3/items/be421b7c1957f543dfcf)を参考に、`vmbr0:0`を作成

```bash:/etc/network/interfaces
auto vmbr0:0
iface vmbr0:0 inet static
        address 192.168.101.1
        netmask 255.255.255.0
```


  * iptablesでMASQUERADE設定

```bash:
MASQUERADE  all  --  192.168.101.0/24     anywhere
```

## ネットワーク設定

![スクリーンショット 2015-06-24 7.51.11.png](https://qiita-image-store.s3.amazonaws.com/0/25728/21960737-4558-c164-c97c-bd6428bb9387.png "スクリーンショット 2015-06-24 7.51.11.png")

* インターネットに接続できることを確認。
Rubyでtailってみた(ついでにheadも作ってみた)。


元記事

[Rubyでファイルの末尾n行を表示するtailっぽい何かを作った](http://qiita.com/NagominHotMotto/items/b9e62d2c6e88ac6624cc)
[tailっぽい何かをレビューしてみます。](http://qiita.com/ymmtmdk/items/2e75ffec0ca39b38e475)
[tailを実装する](http://qiita.com/ymmtmdk/items/10cf80ec2fc7962ff9fc)

ということで、自分もやってみたら、なぜかこうなった。

```tail.rb
#!/usr/bin/env ruby
class IO
  # 現在のposからn行だけ配列で返す。
  # posは読み込んだところまで。
  def head(n)
    lazy.first(n)
  end

  # 現在のposからeofまでのうち終わりn行だけ配列で返す。
  # posはeofになる。
  def tail(n)
    reverse_each.lazy.first(n).reverse
  end
end

if $0 == __FILE__
  filename = ARGV[0]
  size = ARGV[1].to_i
  open(filename) do |io|
    io.tail(size).each do |line|
      print line
    end
  end
end
```

どんな感じかというと。

1. `tail`だけなんてかわいそう、`head`も実装してあげないと！
2. やっぱ、オブジェクト指向っぽく`IO#tail(n)`って感じで呼び出したいよね！
3. 時代は関数型プログラミング！ということでlazy。tailの方の実装でlazyする意味は？とか聞かないで。たぶん、lazyのほうがちょっとだけ速い(気がする)。
4. シークとかファイルサイズとか調べるの面倒だから、全部読み込んでもいいんじゃね？そもそも`IO#size`ないし。メモリ喰い過ぎじゃ無いかって？Rubyでメモリを気にしたら、負けだと思っている。

と、なっております。

ファイルシステムやサイズによりますけど、ファイルのシークは結構高コストです。それに比べて、シーケンシャルアクセスだとバッファとかもあってかなり高速ってのもあるので、数MB程度なら何も考えずに全部取った方が速いかもです。でも、さすがにGB級だと上では対応できないので、`io.tail(n)`する前に`io.seek(-(n * 1024), IO::SEEK_END)`とかすべきかな。
mistake > "bit >>= 1"

引用: C++プログラミングの落とし穴 by Steve Oualline

http://ideone.com/wcbiLA

```c
#include <iostream>
/*
input: 0x55AF
output: "-X-X-X-XX-X-XXXX" 
*/
void bit_out(const short int value) 
{
	short int bit = (1<<15);
	int count; // loop counter

	for(count=0; count<16; ++count){
		if ((bit & value) != 0) {
			std::cout << "X";
		} else {
			std::cout << '-';
		}
		bit >>= 1;
	}
	std::cout << std::endl;
}


int main() 
{
	bit_out(0x55AF);	
	return 0;
}
```

上記は以下の部分が問題である。

    short int bit = (1<<15);
    bit >>= 1;

intがsinged int型となる環境においては、 >>=1は「符号付き右シフト」となり、符号ビットはコピーされる。

例として

0x8000 >> 1 は 1000 0000 0000 0000 >> 1となり
0xC000 (1100 0000 0000 0000)となる。

問題の修正としては

    unsigned short int bit = (1<<15);

とすればいい。
技術英語 > Make sure that you check [nominal paths] and endpoints and all exception conditions.

引用: Code Complete (No. 7790) > Check the Code

> Make sure that you check <font color=red>nominal paths</font> and endpoints and all exception conditions.

nominal pathが何かというと、if文やswitch文などで一般的に実行される経路のこと。

nominalでないというのはexceptionや、たまに実行される経路のこと。

Code Completeなどでif文を書く順番として、nomical caseを一番最初にしておくと、ソースリーディング時にどれが一番実行される処理かわかりやすい、という説明があった。

関連して以下のリンクを思い出した。
[ガード節を用いた if-then-else 文の置き換え](http://blog.livedoor.jp/lalha/archives/50472164.html)
proxmox 4.0 でdocker動いた


## 作業用ディレクトリ作成

```bash:
mkdir /var/lib/vz/docker
ln -s /var/lib/vz/docker /var/lib/docker
```

```bash:
wget -qO- get.docker.com | sudo sh
```

## 起動

```bash:
systemctl start docker
systemctl enable docker
```

```bash:
docker run -d -p 8080:80 -it nginx
```

動作することを確認。
Proxmox 4.0 Beta1 変更点


## lxcでのCentOS7は対応していない

* [Proxmox 4 container: unsupported redhat release](http://forum.proxmox.com/threads/22871-Proxmox-4-container-unsupported-redhat-release)

## 特徴

* [Roadmap - Proxmox VE](http://pve.proxmox.com/wiki/Roadmap#Proxmox_VE_4.0_beta1)

> Debian Jessie 8.1
> kernel 4.1.3 (インストール直後は3.19.8)
> new HA manager, see High_Availability_Cluster_4.x
QEMU 2.3
> include LXC (and removed openvz)
> DRBD9

## lxc

* [Linux Container - Proxmox VE](http://pve.proxmox.com/wiki/Linux_Container)

> Coming soon: snapshot, rollback, clone, linked clone (all these features need storage support)
> Support of local directories, NFS, ZFS, LVM (future support for Sheepdog, Ceph, iSCSI, DRBD and GlusterFS is planned)

## lxcコンテナ作成

```bash:
pct create 112 /var/lib/vz/template/cache/debian-7.0-standard_7.0-2_i386.tar.gz \
 -description LXC \
 -disk 4 \
 -hostname pvecontainer01 \
 -memory 1024 \
 -nameserver 8.8.8.8 \
 -net0 hwaddr=52:4A:5E:26:58:D7,ip=192.168.15.83/24,gw=192.168.15.1,bridge=vmbr0 \
 -storage local \
 -password xxxxxx
```

```bash:起動、停止
pct start 100
pct stop 100
```

```bash:コンテナに接続
pct enter 100
```

## OpenVzからlxcに移行方法(成功していない)

* [Convert OpenVZ to LXC - Proxmox VE](http://pve.proxmox.com/wiki/Convert_OpenVZ_to_LXC)

```bash:バックアップ(tar形式)
vzdump 100 -storage local
```

```bash:リストア(tarであること)
pct restore 101 /var/lib/vz/dump/vzdump-openvz-307-2015_09_13-07_52_37.tar
```


### エラー

```
root@:/var/lib/vz/dump# pct restore 307 `pwd`/vzdump-openvz-307-2015_09_13-07_52_37.tar
Formatting '/var/lib/vz/images/307/vm-307-disk-1.raw', fmt=raw size=4294967296
mke2fs 1.42.12 (29-Aug-2014)
Discarding device blocks: done                            
Creating filesystem with 1048576 4k blocks and 262144 inodes
Filesystem UUID: 21d3724c-f71e-4a8e-b123-fba4e7a4a76e
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Multiple mount protection is enabled with update interval 5 seconds.
Writing superblocks and filesystem accounting information:      
Warning, had trouble writing out superblocks.TASK ERROR: command 'mkfs.ext4 -O mmp /var/lib/vz/images/307/vm-307-disk-1.raw' failed: exit code 144
```

```bash:
root@:/var/lib/vz/dump# rm -r /var/lib/vz/images/307
```

* [Convert OpenVZ to LXC failed. (PVE4 Beta 2)](https://forum.proxmox.com/threads/23558-Convert-OpenVZ-to-LXC-failed-%28PVE4-Beta-2%29) Forumで質問しておいた。
【俺メモ】Linuxmint(Ubuntu可)でMicrosoft Onedriveを利用する

Windowsなら、MS純正のOnedriveアプリがあるけど、
Linuxにはないんかと、探したらあったやん。
んなわけで、やってみた。
これで、いちいちブラウザ起動しなくても同期とれるで。

サイトはこちら
[onedrive-d - GitHub](https://github.com/xybu/onedrive-d)

作ってくれた人に感謝やわ。

(2020/1/13追記)今はこちら
https://github.com/xybu/onedrive-d-old
https://github.com/xybu/onedrived-dev

# 前準備

必要なものはこれね

- Git：GitHubからCloneするときに必要やで。
- Onedriveアカウント：もちろん利用するためのアカウントや。

# インストール

$ git clone https://github.com/xybu92/onedrive-d.git
$ cd onedrive-d
$ ./install.sh

# Ondriveアプリ設定

以下のコマンドで設定開始
$ onedrive-pref

## 認証設定

①認証設定するかと聞かれるのでYを入力してターンっとする
(STEP 1/4) Do you want to authorize sign in with your OneDrive account? [Y/n] y

②認証用のアドレスが生成されるのでコピペでブラウザに貼り付け
The callback URL is the URL where the sign-in page finally goes blank.
Please visit the sign-in URL in your browser:
https://login.live.com/oauth20_authorize.srf?display=touch&locale=en&client_id=****************&response_type=code&scope=wl.skydrive+wl.skydrive_update+wl.offline_access&redirect_uri=https%3A%2F%2Flogin.live.com%2Foauth20_desktop.srf

③上の長いアドレスをコピーしておく。

④ブラウザでアカウントを入力
③のアドレスに移動するとアカウントの入力画面が出てくるので、入力する。
入力後、真っ白な画面が表示されるので、この画面のアドレスをコピーしておく。

⑤ターミナルにもどりアドレスを貼り付け

Please paste the callback URL:
https://login.live.com/oauth20_desktop.srf?code=**********

貼り付け後、ターンっとする。

onedrive-d has been successfully authorized.
とでればOK。

## Onedrive同期するパスを設定
①設定をするか聞かれるのでYを入力
(STEP 2/4) Do you want to specify path to local OneDrive repository? [Y/n] y

②パスの指定
Please enter the abs path to sync with your OneDrive
デフォルトは/home/[username]/OneDrive
変更がなければターンっすればOKや。

## 数値、回数設定
①設定をするか聞かれるのでYを入力。
(STEP 3/4) Do you want to change the numeric settings? [Y/n] y

②ネットワークエラー時のリトライ回数
How many seconds to wait for before retrying a network failure (current: 10)?
デフォのままでええやろ。

③ブロック単位でのアップロードに変更するファイルサイズ
Files larger than what size (in MiB) will be uploaded blocks by blocks? (current: 4.0)?
これもデフォでええかな。

④ファイルアップロード時のブロックサイズ
When a file is uploaded blocks by blocks, what is the block size (in KiB)? (current: 512.0)?
これもデフォのままでええやろ。

## 無視リストを作成
①設定するか聞かれるが、特に思いつかなかったのでNを入力
(STEP 4/4) Do you want to edit the ignore list file? [Y/n] n
Skipped. You can manually edit "/home/[username]/.onedrive/ignore_v2.ini" at your convenience.

# 起動
インストール確認
$ onedrive-d --help

起動
$ onedrive-d start

終了
$ onedrive-d stop

再起動
$ onedrive-d restart

ステータス確認
$ onedrive-d status
docker buildでFATA[0011] unexpected EOFのエラーになるとき


何度もDockerfileのbuildを繰り返していると、それまでうまくいってたbuildがうまくいかなくなることがあった（昼ぐらいから夜中まで数十回くらい試行錯誤してたと思う）。

エラーは次の通り

```
FATA[0011] unexpected EOF
```

とりあえず使ってないタグ無しimages（none）を全て削除するとbuildできるようにはなった。

```
$ docker rmi -f $(docker images | grep '<none>' | awk '{print$3}')
```


ただしdocker runできない。

エラーは次の通り（見やすさのために改行している）

```
FATA[0000] Error response from daemon: Cannot start container
962e965251403fd2d9854ad33e8b166fbf715e42c480806a827606700e3cf193: 
pipe2: too many open files
```

念のため各コンテナをstopし、dockerをrestartして解決した。

```
$ sudo service docker restart
```
Kotlin + Realm Java がさらに使いやすくなった件について


## はじめに

Realm Javaが0.81.1にアップデートされ、ついについにKotlinがサポートされました。
KotlinがKaptをリリースしたのでRealmがフルことりんで使える日が来るのは時間の問題だろうと(勝手に)思っていましたがついにです！

[Realm Java 0.81.1 - Realm is a mobile database: a replacement for SQLite & Core Data](https://realm.io/news/realm-java-0.81.1/)

## 準備

KotlinでAnnotation Processorを使うにはbuild.gradleでkaptの指定が必要です。
公式の[Kotlinサンプル](https://github.com/realm/realm-java/tree/master/examples/kotlinExample)のbuild.gradleを参考にしつつ、ローカルのjarを使っている箇所をMavenから取得するように変更します。

```groovy
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'io.realm:realm-android:0.81.1'
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

    kapt 'io.realm:realm-android:0.81.1'
}
```

## モデルクラスをKotlinで書く

今までもKotlinでRealmを使うことはできていましたが、唯一出来なかったのがモデルクラスをKotlinで書くことです。
まずは既存のJavaのモデルクラスをKotlinに変換してみます。

例えば、次のようなモデルをKotlin変換にかけてみます。

```java
public class Cat extends RealmObject {
    public String name;
    public int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

```

変換結果は次のようになるはずです。

```kotlin
public class Cat : RealmObject() {
    public var name: String
    public var age: Int = 0
}
```

Kotlinではフィールドのgetter/setterは内部的に作成されているのでかなりスッキリですね！最高ですね！
ただ、これで万事オーケーかというと残念ながら修正が必要です。
ポイントとしては

1. Kotlinでは基本的にはフィールドに初期値を入れる必要がある(但しRealmでは使われない)
2. クラスおよびフィールドに`open`アクセス修飾子が必要
	- Kotlinではデフォルトでクラスの継承が許可されていない(final) → Realmがプロキシクラスを作れない
3. クラスに`RealmClass`アノテーションを付ける必要がある

上記を踏まえて修正すると次のようになります。
今回`name`はNullableにしていますが`String?`を`String`にすれば当然Nullが許容されなくなります。

```Kotlin
RealmClass
public open class Cat : RealmObject() {
    public open var name: String? = null
    public open var age: Int = 0
}
```

## Kotlinらしいモデルクラス

公式サンプルにもあるのですが、Kotlinのデフォルトコンストラクタのプロパティを使った書き方が出来ます。

```kotlin
RealmClass
public open class Cat(
        public open var name: String = "Mike",
        public open var age: Int = 6
) : RealmObject() {}
```

このような書き方をすることでStandaloneオブジェクト経由にはなってしまいますが、初期値を指定&コンストラクタの名前付き引数で必要な場所だけ値を変更ということができるようになります。

## 使用例

ここまで来れば次のように使うことができます。

```kotlin
    // closable なインスタンスは use ブロックを使えば勝手にcloseしてくれる！
    Realm.getDefaultInstance().use { realm ->
        realm.executeTransaction {
            // Tamaを作る(通常の作り方、どちらのパターンのモデルでも可)
            val cat1 = realm.createObject(javaClass<Cat>())
            cat1.name = "Tama"
            cat1.age = 3
            // Mikeを作る(Standaloneオブジェクト経由の作り方、2番目のパターンのモデルでのみ可)
            val cat2 = Cat(age = 2)
            realm.copyToRealm(cat2)
        }
        // Catテーブルを全件取得して名前と年齢をログに出力
        realm.where(javaClass<Cat>()).findAll().forEach {
            Log.d("RealmWithKotlin", "${it.name} is ${it.age} years old.")
            // Tama is 3 years old.
            // Mike is 2 years old.
        }
    }
```



## おわり

いままでもモデルだけJavaで書いて残りはKotlinという構成でもかなり使い勝手の良かったRealmですが、今回のKotlinサポートでモデルまでまるっとすべてKotlinでスッキリと書けるようになりました。最高です。

Kotlinかわいいよかわいいよ！Realmいいよ！
【Photon】RPCの使い方


# RPC

**remote procedure call**
ネットワーク上の別の端末の関数等を呼び出す仕組み。

Unityドキュメントより
「RPC は高い信頼性で送信され、順序付けられます」
http://docs.unity3d.com/ja/current/Manual/class-NetworkView.html


## 呼び出し方

### GameObjectの構成

```
GameObject
    PhotonView … RPC呼び出しの橋渡し
    Photon.MonoBehaviour継承のクラス … RPCメソッドを実装する
```


### RPCメソッドの実装

```csharp
public class TestRPC : Photon.MonoBehaviour
{
	[PunRPC]
	public void RPCFunc(string msg, byte[] data, PhotonMessageInfo info)
	{
		Debug.Log("Message : " + msg);
		string dataStr = "";
		foreach(byte b in data) dataStr += b + " ";
		Debug.Log("Data : " + dataStr);
	}
}
```

※PUN ver1.56からは [RPC] が使えなくなっています。代わりに[PunRPC]を使います。
http://forum.unity3d.com/threads/photon-unity-networking.101734/page-17

>v1.56 (16. June 2015)
Changed: The RPC attribute got replaced by PunRPC. 
Search and replace your code for [RPC] and replace it with [PunRPC] (in JS: @RPC and @PunRPC). 
The change is necessary, because the RPC attribute is obsolete in Unity 5.1 and that causes a large amount of warnings at compile time. 
The new PunRPC must be used in all versions of Unity, starting with this PUN version.


### RPCメソッドの呼び出し

マスタークライアントは即座にメソッドが呼び出されるが、
ネットワーク越しのプレイヤーには当然呼び出されるまでにラグが発生する。

```csharp
// RPCを呼び出す
{
	PhotonView view;	// TestRPC ＋ PhotonViewを持つGameObjectから取得する
	
	// RPCメソッドの引数 object[] の配列にする
	object[] args = new object[]{
			"RPC message",			// 第1引数 : string msg
			new byte[] {1, 2, 3}	// 第2引数 : byte[] data
			};
	
	// RPCメソッドの名前、引数を合わせる
	view.RPC(
		"RPCFunc",					// メソッド名
		Photontargets.All,			// ネットワークプレイヤー全員に対して呼び出す
		args);						// 引数
}
```


## RPCの引数に使える型

* byte, int, float 等の値型
* byte[], int[], float[] 上記値型の配列
* string, string[]
* Vecter3, Quaternion

また、以下のドキュメントにPhotonでシリアライズ可能な型の一覧があります。
確認してないですが、おそらく可能だと思われます。
http://doc.exitgames.com/ja/realtime/current/reference/serialization-in-photon
Raspberry Pi2にMongoDB(2.1.1)をインストールする

#####Mongodb debパッケージインストール
RaspberryPi用のdebパッケージがあるのでそれを使う。

```bash
cd /usr/src
wget https://github.com/tjanson/mongodb-armhf-deb/releases/download/v2.1.1-1/mongodb_2.1.1_armhf.deb
aptitude install libboost-dev
dpkg -i mongodb_2.1.1_armhf.deb
```

参考:[MongoDB package for Raspbian](https://github.com/tjanson/mongodb-armhf-deb)

次：[MongoDB覚書](http://qiita.com/toru2220/items/c2b75b52a5213716cd5a)
Crystal - Array - Class Method - build #crystal

## <i class="fa fa-diamond" style="font-size:1em;"></i> 概要
CrystalのArrayクラスのクラスメソッド`build`について

## <i class="fa fa-check-circle" style="font-size:1em;"></i> シグネチャ
`build(capacity : Int, &block)`

任意の`capacity`のサイズの配列を作成し、ブロック内で配列に設定下値を返します。

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
### <i class="fa fa-code" style="font-size:1em;"></i> プログラム
~~~ruby
size = 10
ary = Array(Int32).build(size) do |buffer|
  size.times { |i|buffer[i] = i+2 }
  size
end
p ary
~~~

### <i class="fa fa-file-text" style="font-size:1em;"></i> 出力
~~~ruby
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
~~~

## <i class="fa fa-code" style="font-size:1em;"></i> コードリーディング
`Array.new(size, &block : Int32 -> T)`の処理中でArray.buildが利用されています。

<i class="fa fa-external-link" style="font-size:1em;"></i> [Array.new - array.cr - Crystal - GitHub](https://github.com/manastech/crystal/blob/bf72b077bc91a9a1d19db56fede684ae8a9347c2/src/array.cr#L108-L115)

### <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
~~~ruby
size = 10
p Array.new(size) { |i|i+2 }
~~~

### <i class="fa fa-file-text" style="font-size:1em;"></i> 出力
~~~ruby
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
~~~

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Array.build - Crystal API Library](http://crystal-lang.org/api/index.html#http%3A//crystal-lang.org/api/Array.html)
RPi2 setup w/o keyboard,display,etc.

##概要。
HDMIやキーボードなどを使わずにRPi2をセットアップします。
別途Linuxのマシン*(BeagleBone Blackで作業しました）*を利用していますが主にOSをSDにコピーする部分のみ違うだけなので読み替えてもらえれば。

WiFi接続で使えるようにするのが目的です。

##用意するもの。
* USBシリアルアダプタ
* USB microSDアダプタ
* microSD (4G以上)
* USB WiFiアダプタ

*※USBシリアルアダプタは秋月で販売している**[FT232RL](http://akizukidenshi.com/catalog/g/gK-01977/)**を3.3V設定で、USB WiFiアダプタはBUFFALOの**WLI-UC-GNM**を利用しました。*

##OSイメージのダウンロード・書き込み。
[RaspberryPi公式](https://www.raspberrypi.org/)よりRaspbianのイメージファイルをダウンロードして展開します。
`unzip -x イメージファイル名.zip`

USB microSDカードアダプタにmicroSDを差し込んで接続します。*Raspberry Piに接続するのではなく現在作業中のPCです*
`ls /dev/sd*`
この様にしてどこに接続されたのか把握しておきます。

仮にmicroSDがsdaに接続されていたとしたらこの様にして書き込みを行います。
`dd if=イメージファイル名 of=/dev/sda`

しばらく待つとRPiを起動するためのmicroSDの完成です。

##シリアル接続でWiFiアダプタを利用出来る状態にする。
* RPi2にmicroSDとUSB WiFiアダプタを挿します。
* USBシリアルアダプタを作業側のコンピュータに接続し、RPiに配線します。

接続方法は以下のとおり。
**RPi pin6 -> FT232RL GND**
**RPi pin8 -> FT232RL RXD**
**RPi pin10 -> FT232RL TXD**

シリアルターミナルを立ち上げます。
ここではminicomを使います。
`minicom -D /dev/ttyUSB0 -b 115200`

ここまで出来たらRPiに電源を供給して立ち上げます。
起動シーケンスなどが一通り流れたのを見届けてログインします。
`ID: pi / PASS: raspberry`

WiFiアダプタを使えるようにします。
`sudo vi /etc/network/interfaces`
または
`sudo nano /etc/network/interfaces`
*※viやnanoについては別途調べてみてください。コンソールエディタに慣れていない方であれば、nanoの方が馴染みやすいと思います。*

以下の部分を編集します。

```vim
allow-hotplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_suppliccant/wpa_supplicant.conf
```

これを

```vim
auto wlan0
iface wlan0 inet dhcp
wpa-ssid "ネットワークのSSID"
wpa-psk "ネットワークのパスフレーズ"
```

この様に書き換えます。
保存してエディタを終了したら接続します。

```bash
sudo ifdown wlan0
sudo ifup wlan0
```

うまく接続できたらシリアルコンソールでの作業はここまでとなります。一応ここでIPアドレスを控えておくと名前で接続出来なかった場合に利用できて便利です。

#SSHでログインし、日本語化などをする。
次はSSHによる接続をします。
`ssh pi@raspberrypi.local`
もしこれで接続出来なかった場合はIPアドレスにて。
`ssh pi@IPアドレス`

**パッケージリストのアップデート及びRaspberry Piのアップデートを行う。**

```
sudo apt-get update
sudo apt-get upgrade
sudo rpi-update
```

**SDカードの領域拡張、ロケール、タイムゾーンの設定など**
`sudo raspi-config`
1.Expand FilesystemでSDカードの未使用部分を使えるように拡張。
4.Internationalisation OptionsのChange LocaleでJP-UTF8的なものを選び、Change TimezoneでASIA>TOKYOを選択。

**日本語デスクトップ環境にして、日本語入力の準備だけしておく。**

```
sudo apt-get install task-japanese
sudo apt-get install ibus-anthy
```

**キーボードレイアウトを変更する。**
`sudo vi /etc/default/keyboard`
以下のように編集

```vim
XKBMODEL="jp106"
XKBLAYOUT="jp,jp"
XKBVARIANT=""
XKBOPTIONS=""
BACKSPACE="guess"
```

ここで一旦RPiを再起動します。
`sudo shutdown -r now`

#仕上げ
Xリモートします。

```bash
ssh -C -Y pi@raspberrypi.local
pcmanfm &
```

アプリケーション＞設定＞iBusの設定
インプットメソッドタブから
「インプットメソッドの選択」で「日本語＞Anthy」を選び「追加」

`vi .bashrc`
最後の行に

```vim
ibus-daemon &
XMODIFIERS=@im=ibus
```

などとしてibusが起動するようにしておく。

*※もしHDMIでディスプレイをつないで使う場合.bashrcへibus-daemon &を記述してしまうとデスクトップ環境で日本語入力が出来なくなります。
この場合、ibus-daemonを自動起動させず、必要に応じてibus-daemonを手動で起動させるなどの工夫が必要となります。*

以上でセットアップは完了です。
C-kでターミナルの行丸ごとクリップボードにコピー｡C-yで別窓でコピーしたクリップボードの中身をターミナルに貼る方法｡

##Linux上でターミナルで作業してるとあること
ターミナルからC-k して行を切り取り(じつは削除)したあと､ブラウザにC-Vとかで貼り付けて別のところでコピーペーストした文章が入ってしまって苛立ったことはありませんか?

##クリップボードみたいなものが幾つかあるんだって
LinuxではどうもC-kやC-yが使うところと､C-cとかC-wで使うところが違うんですと｡  
  
ややこしい｡　(;´Д`)  
そういうところはゲイツOSのほうが楽だった


#じゃーどうしよう
これをどうぞ｡中身をそのままBashrcにコピペしてください｡
(よくわかんないけど動いてるから多分問題ない｡)

####[tavisrudd / readline_clipboard.sh](https://gist.github.com/1169093/4312ed38fab576f3c801903d9b68198a5336db0c)

キー定義がM-yとかになってるので

```
bind -m emacs -x '"\C-u": _xdiscard' # backwards kill from point
bind -m emacs -x '"\C-k": _xkill'
bind -m emacs -x '"\C-y": _xyank'
```
とするとC-k,C-y,C-u に上書きできます

#参考
詳しく知りたい人は

これとか
http://stackoverflow.com/questions/994563/integrate-readlines-kill-ring-and-the-x11-clipboard

これ
http://unix.stackexchange.com/questions/18701/how-to-share-the-clipboard-betwen-bash-and-x11
Oh-My-Zshをアップデートできない問題


## 問題

Oh-My-Zshをアップデートしようとすると以下のエラーメッセージが出て、アップデートできなくなりました。

```zsh
$ upgrade_oh_my_zsh
Upgrading Oh My Zsh
Cannot pull with rebase: You have unstaged changes.
Please commit or stash them.
There was an error updating. Try again later?
```


## 解決方法

https://github.com/robbyrussell/oh-my-zsh/issues/1991
によると、
.oh_my_zshディレクトリ以下のリポジトリの変更をコミットすれば直るらしい。
(後々冷静にエラーメッセージを見たら、「変更点があってrebaseしてpullできないからcommitするかstashして」って書いてあったけど、問題発生時にはよく分からなかった)


git statusで確認すると、

```zsh
$ cd ~/.oh_my_zsh
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   custom/example.zsh

no changes added to commit (use "git add" and/or "git commit -a")
```

custom/example.zshに変更点があるっぽい。
(イジった記憶なし)


というわけで、変更をコミットすると、

```zsh
$ cd ~/.oh_my_zsh
$ git add .
$ git commit -m "適当なコミットメッセージ"
```

```zsh
$ upgrade_oh_my_zsh
```

Oh-My-Zshをアップデートできるようになりました。


## 参考サイト

[Can't update using upgrade_oh_my_zsh · Issue #1991 · robbyrussell/oh-my-zsh
](https://github.com/robbyrussell/oh-my-zsh/issues/1991
)
Code For Kobe #6


https://www.facebook.com/events/1647803332105475/
参加人数：30人ぐらい？

議事録を私（川井）が書くことに指名されました。

SNS 投稿や web サイト作れる人募集。サイト作りたい。

コーポレートフェローシップ
-----------------------------
コミュニティリンク松村さんより。[神戸市でのコーポレートフェローシップ](http://code4japan.org/post/120673887158/codeforjapan-more)。

仕事の様子を写真で紹介：神戸市のネットワークには入れないので、wifi 持参で仕事。

* 産業振興局経済企画課
* 6/1-8/31
* スタートアップを育成するエコシステム作り

「行政実務研修生」という肩書き。code for americaは「フェローシップ」で、1年間という仕組みだが、現状の日本の仕組みに合わないので、code for japanでは「コーポレートフェローシップ」という短縮バージョンにしてある。「コーポレート」がついているのは、人件費が会社持ちで、「研修を受けている」という建付けになっている。

浪江町では「フェローシップ」が1回行われ、「コーポレートフェローシップ」は鯖江市で1例目が行われていて、神戸市は2例目。浪江町は事情が特殊だった。

業務の内容：行政がスタートアップのアクセラレータをやるという形。

神戸市 田辺さんより。[シリコンバレー若手育成プログラム](http://www.kobe-siliconvalley.net/)。募集中。案内用紙の説明。適切なターゲットに絞りたいので新聞には出稿していない。適切そうな展開先があれば、紹介いただけるとありがたい。

[kobe startup news という facebook](https://www.facebook.com/kobestartupnews)をやっているので、今後企画も出していくのでフォローしてください。

Yahoo Japan 宮崎さんより。Treasure Dataとか面白い訪問先を用意しているので、お楽しみに！

宮崎さんの業務について。検索エンジン回りのPMをやっている。検索エンジンの開発はグローバルで、シリコンバレー周りでのコネクションが沢山ある。

質疑：
* Q:フェローとコーポレートフェローの違い A:人件費の負担
* Q:トーマツ「運営」の内容。めずらしいですよね。 A: 現地アレンジや事後報告会など

神戸市 中野さん
---------------------
bluemix 勉強会 7/15 18:30- で開催されるので、来てください！ [bluemix challenge](http://www.ibm.com/developerworks/jp/bluemix/contest/) というコンペもやっているのでどうでしょうか。

オープンデータ進捗。前回リクエストのあった、メタデータ（更新日など）を追加して行っている。それとは別に「オープンデータサイト」というのをつくっている。データを地図上にプロットする、データのexport（geojson等）ができるものを作っている。

[github kobe-city-opd](https://github.com/kobe-city-opd) をやっている。使いづらい利用規約になっていないか、見てもらえるようにアップロードしている。pull request 歓迎。geojson をアップロードするとgithubが地図上にプロットしてくれたりと、予想以上に高機能だった。

ホームページ上でデータを管理しているものが意外と多かった。元データあるんでしょ？というのが通らないケース。excel マクロとかでやりくりしてるけど、そういうのを相談するのにも、github の issue などでできるといいな、と思っている。

サンフランシスコ視察報告
------------------------
榊原さんより。

キーワードは「シェアリングエコノミー」。「エコシステム」でスタートアップや実験が進んでいて、注目されている。[airbnb](https://www.airbnb.jp/), [UBER](https://www.uber.com/)

サンフランシスコ 空港ハッカソン。企画はほぼほぼ詰められた状態からハッカソン開始するチームもあり。賞金が1000ドルが複数組に配られたり。出たアイディア：![c4a.png](https://qiita-image-store.s3.amazonaws.com/0/41883/2c1605f4-56a4-3646-c009-b4bfec62643d.png)

Brian Communcation : ITコンサルタント Brain さんとのミーティング。SFのオープンデータを進めてきた方。元SFの広報官。

Beighborhood Empowerment Network : 中間支援NPO？市役所職員でもありNPO職員でもあるかたが進めている。hazard系。市からデータを出す側。スタートアップ支援はしていない様子。

福岡じゃナイト in サンフランシスコ。国家戦略特区の雇用創出特区をとっている関連で。

日経電子版 x codeforkobe で何かやります？という話もあり。

[TUMML](http://www.tumml.org/)の仕組みは面白い。kobe でもこんなのができるといいな。

サンフランシスコ市長 CDO/CIO。味方が多い状態が整っていると、実行力を持って進められて良い。

CodeforAmerica。寄付金が潤沢にある。指針が掲げられていて、参加者はそれを共有している。

Peter Hirshbergと会談。医療産業都市として神戸市を売り込む話をしようという相談をしていた。一人暮らしの老人に対してなどから始めるという話。

[city innovation sammit](http://summit.cityinnovate.org/)。[神戸市長喋ってる動画](http://www.cctv-america.com/2015/06/18/mayors-gather-at-city-innovate-summit-in-san-francisco)もあります。

* CodeforAmerica。CodeforJapan brigadeの紹介。TUMMLと比べると、こちらの方が社会貢献性が高い。
* サービス展開プロセスの変化について行政の視点から話がされていた。行政職員が一番輝くはず。

Evernote。大変お世話になっている。

今年も 9 月に codeforamericaサミットがあります。行くと熱量が伝わるので、おすすめ！

その他
-----
[NEC iEXPO KANSAI](http://jpn.nec.com/uf-iexpo/kansai/) ＠グランフロント。展示とセミナーやります


後記
-----
今回はずっと聞き役で書きやすかったナー

間違い指摘・補足など各種ツッコミ歓迎
VBAで文字列を結合する関数を作った

vbaにはJoinという関数があるが、配列にしか使えない。
そこで汎用的なjoinを作成した。


```vbnet:join
' rng 結合したい範囲
' delim 結合文字
Function join(rng As Range, Optional delim As String = ",") As String
    Dim result As String
    Dim cell As Variant

    result = ""
    For Each cell In rng
        result = result & delim
    Next

    join = chop(result, Len(delim))
End Function
```

ついでに、末尾を削除する関数

```vbnet:chop
' str 入力文字列
' num 末尾から削除したい文字数
Function chop(str As String, Optional num As Integer = 1) As String
    chop = Left(str, Len(str) - num)
End Function
```

ワークシート上で以下のように使用してもいいね
=join(A1:A5)
Ruby 正規表現でタグの中を回避する

正規表現をすこし書く機会があり、結構調べたのでメモします。ちなみに結局問題は解決していませんが参考までに。

##正規表現とは
初めての方もなんとなくわかっていると思いますが改めて言葉にすると正規表現(regular expression)は文字列のパターンを記述するための言語らしいです。 また、この言語で記述されたパターンも正規表現になります。これらによって、ある文字列が指定したパターンを含んでいるかどうかを判定し、また含んでいるならばそれが文字列中のどの場所であるかを知ることができます。


##特殊文字
以下のURLを参考にしていただければ幸いです。特殊文字扱いしなければならないものです。これらを一致させるには、円記号 (\) を先頭に指定して、最初にこの文字を "エスケープ" する必要があります。
https://msdn.microsoft.com/ja-jp/library/cc427958.aspx


##背景
前置きはこの程度にしておきます、さて今回僕が行いたかったこと。それは「メッセージの中にリンクを入れる」です。[以前書いたものの続き](http://qiita.com/katsuyuki/items/1422bb66f869ba2ea6ac)です、以前のものだとちょっとおかしな挙動をすることがわかったので書き直した次第です。


```
URI.extract(text, ['http','https']).uniq.each do |url|
  if (URI.parse(url).host == "www.hogehoge.com")
    sub_text = ""
    sub_text << "<a href=" << url << " >" << url << "</a>"
    text.gsub!(url, sub_text)
  end
end

```

どこがおかしいのかというとコードをよく追ってみてみると、、、、```
https://www.hogehoge.com/hoge```のようなリンクがあるします。
```<a href = "https://www.hogehoge.com/hoge">https://www.hogehoge.com/hoge</a>```というふうになるのは問題ないと思います。urlをみていくと```
https://www.hogehoge.com/```もあり、そこもaタグにしようとすると先ほどaタグに書き換わったところが

```
<a href = <a href = "https://www.hogehoge.com/">https://www.hogehoge.com/</a>hoge">https://www.hogehoge.com/hoge</a>
```

になってしまいます。。。。
なのでこれらを解決しようと思い、調べました。

##肯定先読み、否定先読み、肯定戻り読み、否定戻り読み
このリンクを参考にしました。http://d.hatena.ne.jp/satosystems/20100519/1274237784
みやすくまとまっているので個人的には良かったです。
あとレファレンスですね！http://ref.xaio.jp/ruby/classes/string/gsub
ここでは置換が主な挙動なので　gsubのレファレンスをのっけました。
ということで
```text.gsub!(/#{url}/) {|url| "<a href=#{url}>#{url}</a>" }```
とりあえずこれでaタグを回避することができたので、テスト！！！しっぱい笑
aタグの表示もurlなのでそこで置換が起こってしまっていた。。。

```
 text.gsub(/(?<!href=|>)(http:\/\/www.hogehoge.com\/([\x21-\x7e]+)?)/, "<a href=#{$1}>#{$1}</a>")
```
ごりごりやってみたが直らず。

そのあとも色々試したが結局直らず。そもそものメッセージのロジックやら諸々を変更することで対応する予定です、未熟な僕が即対応できるものではなかったみたいですね...
Ansible firewalldを使ってみた

Ansibleでfirewalldを使ったのですが、今後も結構使いそうなのでメモもかねて投稿。

#firewalld
名前の通り、firewalldの操作に使います。

[firewalld - Manage arbitrary ports/services with firewalld](http://docs.ansible.com/firewalld_module.html#id2)

##Options
| parameter  | required    | default      | choices        |
|:-----------|------------:|:------------:|:--------------:|
|immediate<br>(added in 1.9)   |no           |              |
|permanent   |yes          |              |                |
|port        |no           |              |                |
|rich_rule   |no           |              |                |
|service     |no           |              |                |
|state       |no           |              |enabled/disabled|
|timeout     |no           |              |                |
|zone        |no           |system-default|                |


###例
公式ページには以下の例がある。
1.httpsのポートを開ける
`- firewalld: service=https permanent=true state=enabled`
2.8081のtcpポートを閉じる
`- firewalld: port=8081/tcp permanent=true state=disabled`
3.161から162までのudpポートをあける
`- firewalld: port=161-162/udp permanent=true state=enabled`
4.dmzゾーンのhttpポートを開ける
`- firewalld: zone=dmz service=http permanent=true state=enabled`
5.rich-ruleの適用(ftpのポートを開け、1分ごとにauditを使ってロギングする)
  原文:Allow new IPv4 and IPv6 connections for service ftp and log 1 per minute using audit
`- firewalld: rich_rule='rule service name="ftp" audit limit value="1/m" accept' permanent=true state=enabled`

###困った点
firewall-cmdはpermanentオプションを付けた場合と付けなかった場合で以下の違いがある。
permanentを付けない:一時的に適用。reloadすると適用から外れる。
permanentを付ける:継続的に適用。reloadすると適用される。

そのため、1番の例だと
継続的に適用したい+すぐに適用したい場合、
`- firewalld: service=https permanent=true state=enabled
 - service: name=firewalld state=restarted`
 とか書かなきゃいけないのかな、と思っていたのですが
immediate(added in 1.9)を付けるとすぐに適用されるみたい。

だからこう書ける。
`- firewalld: service=https permanent=true state=enabled immediate=true`

かなり綺麗に記述できるようになりますね。


####ちなみに
ちなみに、firewallを変えると、そのホスト上で動いている
Dockerコンテナのネットワークがおかしくなるんですが、
バグなんでしょうか。。。
よく使うCordovaコマンド

# 前提
Cordova コマンド ライン インターフェイス (CLI)
Cordova開発でよく使うコマンドたちをメモ。
Android SDK など開発環境がそろっていること。

## CLI のバージョン確認
```bash
$ cordova --version
```

## プロジェクトを作成
```bash
$ cordova create /path/to/your/dir com.example.hello HelloCordova
# cordova create ディレクトリー 識別子 アプリ名
```
識別子： 逆引きドメインスタイル識別子 (アプリ申請時にも必要)

## プラットフォームを追加
```bash
$ cordova platform add android    # Android
$ cordova platform add ios        # iOS
# バージョンを指定する場合
$ cordova platform add android@3.7.2
```
その他：amazon-fireos, blackberry10, firefoxos, wp8 など

## プラットフォームの確認
```bash
$ cordova platform ls
Installed platforms: android 3.7.2, ios 3.8.0
Available platforms: amazon-fireos, blackberry10, browser, firefoxos
```
プラットフォーム (Cordova Android や iOS) のバージョン確認もこれで。

## プラットフォームの削除
```bash
$ cordova platform rm android
```

## アプリをビルド
```bash
$ cordova build            # 全部のプラットフォームを
$ cordova build android    # 個別で
$ cordova build --release  # リリースビルド
```

cordova build は、以下のコマンドをいっぺんにやってくれている。

```bash
$ cordova prepare
$ cordova compile
```

## ブラウザで動作確認
```bash
$ cordova serve android
Static file server running on port 8000 (i.e. http://localhost:8000)
CTRL + C to shut down
```

## エミュレーターで動作確認
```bash
$ cordova emulate android
# AVD Manager のデバイスを指定する場合
$ cordova emulate --target=Nexus_5_API_22_x86 android
```

iOSの場合は、iOSシミュレーターのインストールが必要。

```bash
$ brew install ios-sim    # homebrewでインストール
```
Android Virtual Device (AVD) Manager のデバイス確認

```bash
$ android list avd
```

## 実機で動作確認
```bash
$ cordova run android
```
PCに実機をつなげておく。

## プラグインの追加
```bash
$ cordova plugin add org.apache.cordova.geolocation
# バージョンを指定する場合
$ cordova plugin add org.apache.cordova.geolocation@0.3.12
# リポジトリを直接指定することも可能
$ cordova plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation.git
```

## プラグインの確認
```bash
$ cordova plugin ls
org.apache.cordova.geolocation 0.3.12 "Geolocation"
```

## プラグインの削除
```bash
$ cordova plugin rm org.apache.cordova.geolocation
```
「ansible」github private repository clone 時の「はまりポイント」解決

githubのprivateリポジトリを引っ張ってくる時にハマったのでメモ
private repositoryの情報がうまく見つけられなかったのでメモっておこうと思う。後で見直すかもしれない

# 以下のエラーが出て先に進めなくなった
* no file
* no directory
* permission denied


# 解決策
* Vagrantfileに以下を追加して調査する(変数名は何でも可)

```.sh
  config.vm.provision "ansible" do |anchan|
    anchan.verbose = "vvvv"
  end
```

以下の様にファイルに修正や追加を加える

#### ~/.ssh/config
* `StrinctHostKeyChecking`をnoにする
* `ForwardAgent`をyesにする

```.sh
Host github.com
  HostName github.com
  User git
  Port 22
  #IdentityFile ~/.ssh/work_private_rsa
  #IdentityFile ~/.ssh/work2_private_rsa
  #IdentityFile ~/.ssh/work3_private_rsa
  #IdentityFile ~/.ssh/master_private_rsa
  #IdentityFile ~/.ssh/sinsnk_private_rsa
  IdentityFile ~/.ssh/id_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes
  StrictHostKeyChecking no
  ForwardAgent yes
```

### ansible.cfg
* `ForwardAgent`をyesにする

```.sh
[defaults]
private_key_file=~/.ssh/id_rsa

[ssh_connection]
ssh_args = -o ForwardAgent=yes
```

### hosts

```.ssh
[servers]
192.168.1.10 ansible_ssh_user=vagrant ansible_ssh_private_key_file=/Users/sinsnk/workspace/hogechan/.vagrant/machines/default/virtualbox/private_key
```

### playbook.yml
* 以下のように設定する
* 特にハマったのは、`sudo: false`←これないとpermission deniedが出続ける

```.sh
- hosts: all
  user: vagrant
  sudo: yes
  vars:
    work_dir: /home/vagrant
    repos_dir: "{{ work_dir }}/hogechan"
    branch: master
  tasks:
    - name: clone hogechan
      git: repo=git@github.com:sinsnk/hogechan.git dest={{ repos_dir }} version={{ branch }} accept_hostkey=yes key_file=/Users/sinsnk/workspace/hogechan/vagrant/.vagrant/machines/default/virtualbox/private_key
      sudo: false
```

今回僕のように設定は書いたはずなのにうまくいかない時は、ログをverboseレベルにして追って、原因を見るのがよいでしょう
VBAで全オートシェイプをグループ化解除できなくなるまでグループ化解除する

対象のエクセルの１枚目のシートに存在する全オートシェイプについて
グループ化解除できなくなるまでグループ化解除する。

```
Function ungroopAllMsoGroup()

  Dim grp_flg As Boolean
  Dim shp As Shape
  Dim mwbk As Workbook
  
  Set mwbk = ThisWorkbook

  grp_flg = True

  Do While grp_flg = True
    grp_flg = False
    
    For Each shp In mwbk.Sheets(1).Shapes
      If shp.Type = msoGroup Then
        shp.Ungroup
        grp_flg = True
      Else
      End If
    Next shp
  Loop

End Function
```

ループ処理に入った段階でグループ化フラグをfalseにしています。
ひとつでもグループ化されたオブジェクトがあればフラグをtrueにし、
次のループ処理でグループ化されたオブジェクトが残っているかを判定しています。
bundle installを並列で実行するための設定

## bundle install

おなじみの`bundle install`
特に初回は非常に遅いですね。
そんなときには試してみると良いかもしれません。

## [--jobs=NUMBER]

これで並列に実行してくれる。

```zsh
bundle install --path=vendor/bundle --jobs=4
```

こうしておけばいつでも並列で実行してくれる。

```zsh
bundle config --global jobs 4
```

設定確認

```zsh
% bundle config
Settings are listed in order of priority. The top value will be used.
jobs
Set for the current user (/Users/hoge/.bundle/config): "4"
```
tailっぽい何かをレビューしてみます。


[Rubyでファイルの末尾n行を表示するtailっぽい何かを作った
](http://qiita.com/NagominHotMotto/items/b9e62d2c6e88ac6624cc#comment-535db493f34718c055f0
)

こちらのコードですが、アルゴリズムとは別の部分で気になる部分がいくつかあったので、まことに僭越ながらレビューしてみたいと思います。とつぜんなので辻斬みたいに感じられたらすみません。

```ruby:tail_orig.rb
#! env ruby

file_path = ARGV[0]
row_limit = ARGV[1]

def get_offset(file_path, row_limit)
  file = File.open(file_path)
  cr_counter = 0
  offset = 0
  until cr_counter > row_limit.to_i
    offset -= 1
    begin
      file.seek(offset, IO::SEEK_END)
    rescue
      file.seek(0, IO::SEEK_SET)
      break
    end
    cr_counter += 1 if file.read(1) == "\n"
  end
  file.close
  offset + 1
end

def get_tail(file_path, row_limit)
  offset = get_offset(file_path, row_limit)
  file = File.open(file_path)
  file.seek(offset, IO::SEEK_END)
  file.each_line do |line|
    puts line.chomp
  end
  file.close
end

get_tail(file_path, row_limit)
```

まず全部引用させていただきました。それでは早速気になった部分を指摘していきます。

## openはブロック付きで使う

```ruby:
File.open(file_path) do |file|
  # do something
end
```

File.openはブロックとともに使うことにより、明示的にcloseをする必要がなくなります。closeのし忘れを防げますし、予期せぬ例外が起きた場合にもちゃんとcloseしてくれます。元のコードは例外の起き方によってはcloseされません。リソースリークを防ぐローンパターンと呼ばれるこのパターンが綺麗に書けるのは、rubyの優れた特徴の一つです。

## 例外は正常フローでは使わない
例外はその名の通り例外的なケースを取り扱うための仕組みです。使う必要のないところでは使うべきではありません。理由は、
* 意図が読み取りにくい。
* 意図せず例外を握りつぶしかねない
* パフォーマンスが悪くなりがち

などがあります。元コードではrescueに例外クラスを指定していません。意図よりも広く例外が拾われているため、貴重な例外情報が発見できず握りつぶされてしまうかもしれません。

この部分はおそらくファイルの先頭より前にシークされることを例外をつかって検出されているのでしょう。この場合はシークする前にファイルのサイズとoffsetを比較すればこの意図は表現できるはずです。

```ruby:
  offset -= 1
  break if offset < -file.size

  file.seek(offset, IO::SEEK_END)
```

## メソッドの引数の型を意識する
get_offsetは引数のrow_limitをStringとして受け取り、row_limit.to_iとして使用しています。しかし、row_limitは行数の上限を表す数字ですから、get_offsetはメソッドの仕様としてNumberを受け取るのが自然でしょう。ARGVから受け取っているので#to_iしているのでしょうが、それはあくまでも呼び出す側の都合です。つまり不必要な結合が生まれています。呼び出す側で#to_iしてから渡しましょう。get_tailメソッドもNumberを受け取るべきなのでその大元で変換してしまいましょう。

```ruby:
row_limit = ARGV[1].to_i
```

## get_fooは返り値を取得するメソッドにつける
get_何々という名前はなにか値を取得するメソッドにつけるべきです。get_offsetはいいと思うのですが、get_tailは副作用に期待したメソッドであり、意味ある値を返していません。print_tailなどでいいのでは。

## その他
```ruby: 
file.each_line do |line|
  puts line.chomp
end
```

ここの部分がchompで改行コードを削っておきながら、putsで再度改行を付与する意図がよくわかりませんでした。lineが改行で終わらないケースをケアしてる？

crはcarriage return、日本語では復帰の意味で、"¥r"で表現されます。改行はlf(line feed)で"¥n"ですね。詳しくはhttps://ja.wikipedia.org/wiki/改行コード

## 修正したコード
最後に全部入りのコードを（別の記事を書く都合でtailコマンドの仕様により近づけてます）

```ruby:tail.rb
#! env ruby

def get_offset(file_path, row_limit)
  offset = 0
  File.open(file_path) do |file|
    lf_counter = 0
    until lf_counter > row_limit
      offset -= 1
      break if offset < -file.size

      file.seek(offset, IO::SEEK_END)
      chr = file.read(1)
      lf_counter += 1 if (chr != "\n" && offset == -1) || chr == "\n"
    end
  end
  offset + 1
end

def print_tail(file_path, row_limit)
  offset = get_offset(file_path, row_limit)
  File.open(file_path) do |file|
    file.seek(offset, IO::SEEK_END)
    file.each_line do |line|
      print line
    end
  end
end

file_path = ARGV[0]
row_limit = ARGV[1].to_i
print_tail(file_path, row_limit)
```
tailを実装する


[Rubyでファイルの末尾n行を表示するtailっぽい何かを作った
](http://qiita.com/NagominHotMotto/items/b9e62d2c6e88ac6624cc#comment-535db493f34718c055f0
)

をまねてみる。

# シンプル版
```ruby:tail_simple.rb
 file_path = ARGV[0]
row_limit = ARGV[1].to_i

buffer = []
File.foreach(file_path) do |line|
  buffer << line
  buffer.shift if buffer.size > row_limit
end

puts buffer
```

まず、元の記事のコメント欄より。Rubyでやるならこれでいい気がする。この特徴は

* シンプル
* ファイルを全部読む
* メモリ使用量は表示する分

など。試してみると意外と早い。

# バッファー版

```ruby:tail_buffered.rb

def reverse_chunks(file, size)
  n = file.size / size
  n -= 1 if file.size == n * size
  len = file.size - n * size
  until n < 0
    file.seek(n * size)
    yield file.read(len)
    n -= 1
    len = size
  end
end

def offset_of_nth_chr_from_tail(file, count, target)
  offset = 0
  reverse_chunks(file, 1024*16) do |chunk|
    chunk.size.times do |i|
      chr = chunk[chunk.size - i - 1]
      if chr == target || (offset == 0 && i == 0 && chr != target)
        count -= 1

        if count < 0
          offset += i
          return offset
        end
      end
    end
    offset += chunk.size
  end

  offset
end

def tail(fname, n_lines)
  open(fname) do |file|
    offset = offset_of_nth_chr_from_tail(file, n_lines, "\n")
    file.seek(file.size - offset)
    print file.read
  end
end

tail(ARGV[0], ARGV[1].to_i)
```
  次に自分で書いたRubyによるtail。ファイルをある程度のサイズの塊に分割して、後ろの塊のその後ろから改行の数を数える方式。

* 実装が複雑
* メモリー使用量は塊のサイズ
* 後ろから読むのででかいファイルも大丈夫

あんまり早くない。

# mmap版
次はtailを書けって言われたらこの方向にするだろうという実装。

```c:tail_mmap.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>

void tail(char *fname, int n_lines) {
  int fd = open(fname, O_RDONLY);
  struct stat st;
  fstat(fd, &st);
  int fsize = st.st_size;

  char *map = mmap(0, fsize, PROT_READ, MAP_PRIVATE, fd, 0);
  char *cursor = map+fsize;

  if (fsize > 0 && cursor[-1] != '\n') n_lines--;

  for (int i = 0; i < fsize; i++){
    cursor--;

    if (*cursor == '\n') n_lines--;

    if (n_lines < 0){
      cursor++;
      break;
    }
  }

  write(1, cursor, fsize-(cursor-map));

  munmap(map, fsize);
  close(fd);
}

int main(int argc, char *argv[]){
  if(argc != 3)  exit(EXIT_FAILURE);

  tail(argv[1], atoi(argv[2]));

  exit(EXIT_SUCCESS);
}
```


mmap使って普通に後ろから数える方式。

* 割とシンプル
* mmapが環境依存
* mmapのメモリ使用量はどうなるんだろう？多くはないと思う
* 後ろから読むのででかいファイルも大丈夫

とメリットが多い。あとすごい早い。オリジナルのtailより早い。
GithubのWikiで画像を使用する

# 前提
GithubのWikiやREADME.mdで画像を表示させたい。
でも、画像はどこに保存すれば良いのか。

# 結論
Wikiリポジトリで管理する。

# 手順
### Wikiリポジトリで画像を管理

1. GithubのWikiリポジトリ(※)をクローンする。
1. 適当にimagesフォルダを作成したり、画像を入れたり、なんだりかんだり。
1. コミットしてプッシュする。

(※)Wikiページのここ！
![Wiki repository](https://qiita-image-store.s3.amazonaws.com/1348/52940/d39eba59-a0d1-e65c-fab2-1ad5ea4023b3.png "Wiki repository")

### 画像を表示させる

(直下にimagesフォルダを作成した場合)
`![リンクテキスト](images/hogehoge.png "タイトル") `

ただ、このパスの指定だとプレビューでは画像が表示されない。
プレビューでも表示させたいなら、パス部分にまるっとURLを入れればOK。
`https://github.com/ユーザー/リポジトリ/wiki/images/hogehoge.png`
Bootstrap Datepickerを使ってみた

Bootstrapの魅力として、システマティックになっていることもあって、各種のプラグインが充実していることがあります。今回は、[Bootstrap Datepicker](https://github.com/eternicode/bootstrap-datepicker)を取り上げてみます。

# 導入
Railsであればgemにもなっているのですが、後述の理由によりソースを書き換えている部分があるので、手動でのインストールを行いました。とはいっても、GitHubからまとめてダウンロードしてきて、

* 本体のJavaScript
* 日本語訳のJavaScript
* デザイン用CSS

を適切な場所に置いてリンクさせるだけという簡単な設置作業で終わりました。なお、CSSはBootstrap2用と3用で分かれています。

# 機能
初期状態で`date-provide="datepicker"`と書いておいたinput要素は自動でdatepickerが適用されますが、それ以外でも`$(要素).datepicker();`とすれば適用することができます。表示フォーマットや日付の書式、指定できる日付の範囲など、いろいろ指定が可能です。詳しくは[公式ドキュメント](http://bootstrap-datepicker.readthedocs.org/en/stable/options.html)をごらんください。

# 引っかかった点
## 位置が合わない
そのまま表示してみたところ、上に数十ピクセルずれて、しかも間の悪いことにちょうど上の欄を指すような位置に出てしまいました。[Issueによれば](https://github.com/eternicode/bootstrap-datepicker/issues/1372)マージンが入る場合にうまく合わなくなるとのことで、とりあえずJavaScriptに少し手を入れて調整することにしました。

## 書式が変わらない
最初に`$.fn.datepicker.defaults.format="yyyy-mm-dd";`としたのですが、どうしても書式が`2015/05/13`のようになってしまって変わらない、ということが起こってしまいました。ソースを追いかけてみると、ロケールを指定した場合は**ロケールのデフォルトが優先される**、という仕様だったのが原因でした。ということで、読み込み後にロケール側の`$.fn.datepicker.dates.ja.format="yyyy-mm-dd";`として一件落着しました（1時間弱戸惑いましたが）。
【一覧&例付き】inputのtype属性で日時を自在に扱えるようにする

#datetimeだとpickerにならないんだけど？
inputで日付だけではなく時間も一括で指定したい時のtypeの指定方法。
結論から言うと**typeにdatetime-localを指定する**だけなのだけど、localというワードがしっくりこなくて戸惑った。

ちなみに、**type="datetime"はChrome, FirefoxやInternet Explorerでは[対応していない](http://www.w3schools.com/html/html_form_input_types.asp)。**紛らわしい。
datetimeはHTMLのスタンダードから外れ、datetime-localを使うようになったとのこと。

#目的別にinputのtypeについて列挙してみる
HTMLに備わっているのは以下の5つ。
[Bootstrapのdatepicker](https://eonasdan.github.io/bootstrap-datetimepicker/)など外部のdatepickerを使えば表現の幅は増えるけど、この5つを使えればひとまず困ることはないはず。

##日付、時間を選択する
```html:datetime-local
<input type="datetime-local">
```
<form>
  日付、時間を選択する:
  <input type="datetime-local">
</form>

##日付を選択する
```html:date
<input type="date">
```
<form>
  日付を選択する:
  <input type="date">
</form>
##年月だけ選択する
```html:month
<input type="month">
```
<form>
  年月だけ選択する:
  <input type="month">
</form>

##週だけ選択する
```html:week
<input type="week">
```
<form>
  その年の第何週目か指定できる:
  <input type="week">
</form>

##時間だけ選択する
```html:time
<input type="time">
```
<form>
  時間だけ選択する:
  <input type="time">
</form>

##スマホにも対応している
この記事をスマホで見てみると分かるが、スマホでは自動で表示が切り替わる。
どこまでも便利。
xib利用 - (id)initWithCoder:(NSCoder *)aDecoder

Objective-CでXibから初期化するとき
*- (id)initWithCoder:(NSCoder *)aDecoder*を利用した

Swiftでは
*required init(coder aDecoder: NSCoder)*を利用する。

**違いはよく分からない、分かってる事は**
Swiftだとreturnがないのと
required init(coder aDecoder: NSCoder)じゃなく
init(coder aDecoder: NSCoder)だと　errorになるという事