OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS7を触る - IPアドレスの確認

そろそろ仕事でもRHEL7系が必要にになってきたので、CentOS7触ってみる。
今回は、ipアドレス確認したかったんだけどifconfigなくなってるんですが、という話。

# 環境
```console:
$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
```

OSインストールはCentOS-7-x86_64-Minimal-1503-01.isoを使用。

# 結論: ifconfigではなくipらしい
```console:
$ ifconfig
-bash: ifconfig: コマンドが見つかりません
```

ぅぉ。ifconfigコマンドがない。
ifconfigはデフォルトでは入っていなくて、デフォルトはipになったらしい。

```console:
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:66:5f:56 brd ff:ff:ff:ff:ff:ff
    inet 192.168.235.67/24 brd 192.168.235.255 scope global eno16777736
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe66:5f56/64 scope link
       valid_lft forever preferred_lft forever
```

ちなみに、オプションの'a'はmanによるとaddressの省略版らしい。

> ```console:
> IP - COMMAND SYNTAX
>    OBJECT
>        address
>               - protocol (IP or IPv6) address on a device.
> (中略)
>       The names of all objects may be written in full or abbreviated form, for exampe address can be abbrevi‐
>       ated as addr or just a.
> ```

# 参考
[RHEL7/CentOS7でipコマンドをマスター](http://enakai00.hatenablog.com/entry/20140712/1405139841)
[これからはifconfigではなくipを使う時代だ！ - Qiita](http://qiita.com/suzutsuki0220/items/dc72df23f1e1b1cda5f2)
Garage + Doorkeeper + DeviseによるDouble Molelの扱い方

## はじめに
garage + doorkeeperを使ってapiを作成する場面がよくあると思うのですが、userモデルが2つあるときはどうすれば良いのか自分なりに考えてやってみました。あくまで一例なので、他にあれば是非コメントして頂きたいです。

## 設計

- モデルはTeacherモデルとStudentモデルを作る

- garage + doorkeeper 

- deviseを使う

## 初期設定

では重要なのはgaraga.rbの設定ですね。まずはそちらの設定から見ていきましょう。
cookpadのサイト
http://techlife.cookpad.com/entry/2014/11/06/100000
を参考にして以下のように最低限は用意しました。


```rb:garage.rb

Garage.configure {}
Garage::TokenScope.configure {}

Doorkeeper.configure do
  orm :active_record
  default_scopes :public
  optional_scopes(*Garage::TokenScope.optional_scopes)

  resource_owner_from_credentials do |routes|
    User.find_by(email: params[:username])
  end
end
```

ではここからどうするか、まず問題点を幾つか挙げました。

## 問題点

- `resource_owner_credentials`をどう分けるか

- 権限関係


## 解決策

まず`resource_owner_credentials`ですがこれはscopeで分けることにしました。
garageのdefaultのscopeはpuclicですがそれとは別に特定のscopeを定義して分けることができるので、これを使って以下のようにしました。

```rb:garage.rb
  resource_owner_from_credentials do |routes|
    if params[:scope] == "student"
      Student.find_by(email: params[:email])
    elsif params[:scope] == "teacher"
      Teacher.find_by(email: params[:email])
    end
  end
```

これでどちらかを取得することができます。ポリーモーフィック関連使ってできるのかとか様々な方法を考えてみたのですが、これが一番楽に実装できそうなので、これに落ち着きました。


では権限系の設定は`Garage::TokenScope.configure`でできるのこちらで行います。こちらは以下のようにしました。

```
Garage::TokenScope.configure do
  register :student, desc: 'enable to access student authority' do
    access :read, Student
    access :write, Student
  end
  register :teacher, desc: 'enable to access teacher authority' do
    access :read, Teacher
    access :write, Teacher
  end
end
```

ただこれだとcontrollerでuserを権限問題で作れないので、これを解決するために、以下のようにコントローラーでかく必要があります。

```rb:students_controller.rb
class StudentController < ApplicationController
  include Garage::RestfulActions
  before_action except: :create do
    doorkeeper_authorize! :student
  end

  def require_resources
    @resources = Student.all
  end

  def require_resource
    @resource = Student.find(params[:id])
  end

  def create_resource
    @resources.create(student_params)
  end

  def update_resource
    @resource.update_attributes!(student_params)
  end

  def destroy_resource
    @resource.destroy!
  end

  private
  def studnet_params
    params.permit(:email, :password, :password_confirmation)
  end
end

```

このような感じで基本的にはscopeで分ければ良いのかなという結論になりました。
ここらへんは参考文献が少なく難しいところなので、もしこうしたほうが良いとかありましたらコメントよろしくお願いします。
GKEを便利にするGCPのサービス

## Google Container EngineとKubernetes

Google Container Engine (以下GKE) は Kubernetes (以下k8s) というコンテナ管理アプリケーションを載せた基盤を構築するサービスだ。GKEは Google Cloud Platform (以下GCP) の幾つかのサービスを使って構築されているので、GCPの各サービスの恩恵を受けることができる。このエントリでは、GCPの恩恵によってGKEがより便利になる事柄を紹介する。

## k8sとは

まずk8sとは何なのか。ここではk8sを使う為に理解すべき事柄を中心に紹介する。

### k8sにまつわるよくある勘違い

k8sはDockerコンテナを動かすための基盤ではない。Dockerコンテナは手段でしかなく、k8sの本質はコンテナをスケーラブルに運用するための基盤である。そのために様々な概念や設定がでてくるが、これは本質を実現するために避けて通れない事柄だ。

### k8sを構成する概念

#### k8sを構成する要素

- *Contianer*: Dockerなどのコンテナ。
- *Pod*: 複数の*Container*のホスト。
- *Cluster*: 全ての*Pod*を格納する為の基盤。

#### k8sの要素を操作する為の機能

- *Service*: 外部からの通信をロードバランシングをしてそのサービスに関連する*Pod*にリクエストを割り振る。
- *Replication Controller*: *Pod*を監視し何かしらの原因で*Pod*が死ぬと*Pod*を立ち上げ、指定した数の*Pod*を維持する。**ユーザーが複数の*Pod*の存在を意識する必要はない。**
  - *Horizontal Pod Autoscaler*: *Replication Controller* に対して*Pod*のオートスケールをする。
  - *Rolling Update*: *Replication Controller* の複数の*Pod*を順番に新しい*Container*で構成される*Pod*に入れ替える。

#### *Cluster*と*Node*の関係

まず、*Node*とは*Cluster*を構成するGCPインスタンスだ。*Cluster*は複数の*Node*から構成することができるが、**ユーザーが複数の*Node*の存在を意識する必要はない。**

### GKEにおけるk8sがもたらしてくれるもの

<img src="https://docs.google.com/drawings/d/1btxaNQijO1ZaHXaDuvTi9q3SrQsMKf_Xr2Mp_RQV0Qs/pub?w=1181&amp;h=1080">

- 負荷によって適切に*Pod*を増減することで、1つのアプリケーションを安定して動かしてくれる。
- 1つの*Cluster*で複数のアプリケーションを動かすことができる。1つのアプリケーションを*Service*として適切にグルーピングしてくれることによって、**ユーザーがネットワーキングについて意識する必要はない**。
- 1つの*Cluster*で複数の*Service*がインフラリソースを共有している状態になる。

### k8sのメリット

#### コストパフォーマンス

複数のアプリケーションが1つの*Cluster*でインフラリソースを共有しつつ動作するので、複数のアプリケーションを運用する場合コストパフォーマンスに優れる。例えば開発用に本番環境と同等の環境が欲しいといった場合にも、インスタンスを立ててデプロイするのではなく既に稼働している*Cluster*に新たな*Service*をデプロイしたらよいので、追加コストがほぼ発生しない。特にマイクロサービスをいくつも運用する場合などはこのメリットが顕著になるだろう。

#### デプロイに対するフットワーク

新しい*Service*を作る、新しい*Replication Controller*を作るということが、新たにインスタンスを立てることなく行えるので、新しいアプリケーションのデプロイが楽。また、開発環境やステージング環境も楽に構築できる。

### k8sのデメリット

#### 単一アプリケーションだと低コスパ

1つの*Cluster*で1つのアプリケーションを運用することも当然可能だが、ある程度スペックの良いインスタンスが必要なのでコストパフォーマンスが下がる。

## GKEを便利にするGCPのサービス

これらの前提を押さえた上でやっと本題。

### GCPのオートスケーラ

Google Compute Engine (以下GCE) のインスタンスグループにはオートスケーラ[^autoscaler]がある。GKEは*Cluster*生成時にGCEのインスタンスグループを作るので、そのグループに対してオートスケールの設定をすることができる。前述の*Pod*の水平オートスケールと合わせると次のようなシナリオが考えられる。

1. アクセスが増える
1. *Pod*に割り当てられたCPUリソース使用量が閾を超える
1. *Pod*がスケールして増える
1. *Pod*が増えたことで*Node*のCPUリソース使用量が閾を超える
1. *Node*がスケールして増える
1. アクセスが減る
1. *Pod*のCPUリソース使用量が閾以下になる
1. *Pod*が減る
1. *Node*のCPUリソース使用量が閾以下になった状態でクールダウン期間を経る
1. *Node*が減る

永久機関感ある。自分は実際にこの構成で運用し始めている。今後問題が生じたらまたエントリにしようと思う。

### Google Cloud Monitoring

GKE用のリソースをモニタリングする為のUIが用意されている。各*Node*や*Pod*や*Container*のリソース使用量がモニタできる。k8s標準の[kube-ui](https://github.com/kubernetes/kube-ui)ではモニタリングできないような細かな情報を得ることができる。

### Google Container Registry

Contaienerとして動かすDockerイメージをホストしてくれるプライベートな保管庫だ。差分プッシュをサポートしているのでビルドの度に大きなイメージを転送する必要はない。コマンド1つでイメージのプッシュが完了する。物理的な保存先として Google Cloud Storage を使用している。

## 最後に

素晴らしいk8sというアプリケーションを、周辺サービスの揃っているGKEで使ってみてはどうだろうか。

[^autoscaler]: [Autoscaling Groups of Instances - Compute Engine — Google Cloud Platform](https://cloud.google.com/compute/docs/autoscaler/)
rakeで悟る

この投稿は、[Dark - Developers at Real Kommunity Advent Calendar 2015](http://www.adventar.org/calendars/1169)の13日目のもの。


背景
----

Xcodeを使って開発をしているとしばしばXcodeが謎の挙動をすることがある。例えば次のようなもの。

- 補完が効かなくなる
- あるはずのメソッドが無いと怒られ、ビルドすると通るけどエディタ上では怒られ続ける
- CleanしてXcodeを再起動しても問題が治らない
- プロジェクトを一度全て消してリモートからcloneしなおしてきても治らない
- その他もろもろ(最近Androidの開発ばかりであまり覚えていない...)

DerivedDataというキャッシュがこれらの問題に大きく関わる。プロジェクト関連の全てのファイルを消したとしても、DerivedDataは別のディレクトリにあるため盲点になりやすい。
こいつは`~/Library/Developer/Xcode/DerivedData/PROJECT_NAME-hogehoge`にある。こいつを消してあげると謎のキャッシュが消えて動作がまともになることが多い。


rake satori
-------------

そこで生まれたのがこの`satori`タスク。

```ruby
# coding: utf-8

PROJECT_NAME = 'SomeProject'

desc 'Setup project'
task :setup do
  sh 'bundle', 'install', '--path', 'vendor/bundler'
  sh 'bundle', 'exec', 'pod', 'install'
end

desc 'Open workspace'
task :open do
  sh 'open', "#{PROJECT_NAME}.xcworkspace"
end

desc 'Remove caches'
task :remove_caches do
  dir = Dir.pwd
  workspace = dir + "/#{PROJECT_NAME}.xcworkspace"
  pods      = dir + '/Pods'
  cache     = Dir.glob("#{ENV['HOME']}/Library/Developer/Xcode/DerivedData/#{PROJECT_NAME}*").first || ""
  sh 'rm', '-rf', workspace, pods, cache
end

desc 'Force exit xcode'
task :kill_xcode do
  sh 'pkill', '-f', 'Contents/MacOS/Xcode' do |ok, status|
    puts ok ? 'Xcode has been killed' : "No Xcode's process exists"
  end
end

desc "Cleanup Xocde's cache and your mind"
task :satori => ['kill_xcode', 'remove_caches', 'setup', 'open']
```

とにかく怪しそうなファイルを消して、プロジェクトを再セットアップするという荒業。ひどい荒業だけども、挙動がおかしくなった時に「とりあえず悟る」ことで消耗しなくなった。悟りは素晴らしい。


他の方法
--------

Xcodeのプラグインで[DerivedData Exterminator](https://github.com/kattrali/deriveddata-exterminator)というものがある(悟りを実装してから気づいたｗ)。こちらは、GUIでDerivedDataを削除できる。


終わりに
--------

明日は誰も入っていないから、きっと [@ara_ta3](https://twitter.com/ara_ta3) が書くのだろう。
Openstack - Cinder Backup/Restore between Region

## What's this?

Cinder volume の Region 間の Backup/Restore

## Note

* 別 Region の Cinder backup を直接参照出来ない？(どうにかすれば可能かもしれない)
* 別 Region へ移動するには、rbd export/import なら出来るかもしれない。(試してない)

http://ceph.com/docs/master/man/8/rbd/

> * export (image-spec | snap-spec) [dest-path]
>> Exports image to dest path (use - for stdout).
>
> * import [–image-format format-id] [–object-size B/K/M] [–stripe-unit size-in-B/K/M –stripe-count num] [–image-feature feature-name]... [–image-shared] src-path [image-spec]
>>Creates a new image and imports its data from path (use - for stdin). The import operation will try to create sparse rbd images if possible. For import from stdin, the sparsification unit is the data block size of the destination image (object size).


>     format-id
>
>     * format 1 - Use the original format for a new rbd image. This format is understood by all versions of librbd and the kernel rbd module, but does not support newer features like cloning.
>     * format 2 - Use the second rbd format, which is supported by librbd and kernel since version 3.11 (except for striping). This adds support for cloning and is more easily extensible to allow more features in the future.


````
(e.g.)
    rbd export <mypool>/<myimage>@snap /tmp/img
    rbd import --image-format 2 /tmp/img <mypool>/<myimage2>
````

## Environment

* Openstack : Juno
* Ceph : Firefly


## Reference

[Blueprint:Ceph rbd support migrate volume][link-00]
[Cinder Backup/Restore][link-01]
[Cinder Backup/Restore between AZ][link-02]
[Cinder Backup/Restore between Region][link-03]

[link-00]:https://blueprints.launchpad.net/cinder/+spec/ceph-rbd-support-migrate
[link-01]:http://qiita.com/idzzy/items/ac163d0ce7cc9f036031
[link-02]:http://qiita.com/idzzy/items/caaa83de00abe78095e2
[link-03]:http://qiita.com/idzzy/items/fef77c7853eb6f6b1479
luigiはjobを細切れにしすぎてはいけない？

## Abstract
Yes.
（元ネタ：[論文のアブストは、突き詰めるとここまで短くなる](http://ggsoku.com/tech/world-shortest-paper-abstract/)）

## この話をする理由
研究でluigiを使っていて思ったのですが、明らかにjob数が数千単位になるとluigiの動きが悪くなります。線形なんてもんじゃない。
ということで、それを評価してみました。

## 用いるコード/普通に考えた場合の計算量
コードは[こちら](https://github.com/keisuke-yanagisawa/study/blob/20151213/luigi/jobs_test.py)。
入力するnumberをnとして考えると、
``simple_task``1つにかかる時間は$O(1)$、それをn回実行します。また、``main_task``のrunも$O(1)$ですので、全体としては$O(n)$になるはずです。

## 現実はそうもいかなくて
では、それを実際に計算してみた結果を以下に示します。あ、いつも通りtimeコマンドでの計測なので雑です。

|   n  |       1回目|        2回目|       3回目|
|-----:|-----------:|-----------:|-----------:|
|1     |  0.156 sec.|  0.169 sec.|  0.171 sec.|
|10    |  0.293 sec.|  0.303 sec.|  0.301 sec.|
|100   |  1.403 sec.|  1.578 sec.|  1.313 sec.|
|1000  | 16.718 sec.| 16.352 sec.| 16.868 sec.|
|2000  | 41.440 sec.| 43.607 sec.| 42.829 sec.|
|5000  |196.317 sec.|203.439 sec.|201.425 sec.|
|10000 |672.231 sec.|661.570 sec.|671.289 sec.|

うーん、明らかに線形以上のオーダーで時間がかかってます。
見る限り、計算は瞬時に終わるのですが、jobを実行するまでが時間かかるんですよね・・・

これ、ちょっとexcelでフィッティングさせてみると、ものの見事に$O(n^2)$です。
![スクリーンショット 2015-12-13 11.39.45.png](https://qiita-image-store.s3.amazonaws.com/0/84317/bd0f39e8-0a36-3804-c431-7ea652cc7423.png)
（後から考えてみると、切片0でフィッティングさせるのはおかしいですよね、n=0でもmain_taskは走るので・・・）

個人的には、jobの選択/実行に$O({\rm log}n)$かかって、$O(n {\rm log} n)$くらいかなーなんて思ってたんですが、、、思ったより効率が悪いです。
というわけで、luigiを使うときはjob数が無駄に多くなりすぎないように注意しましょう、ということでした。
…あれ、パラメータチューニングの話と逆行するような…
leafletとRでAEDの場所をプロットしてみる

#はじめに

leafletとは？
-> 雑に言うとmap描画のためのjsライブラリ

※kazutanさんの記事が分かりやすいです。（丸投げ）
https://rpubs.com/kazutan/leaflet_slide

# とにかくやってみよう！
###ライブラリのインストールと動作確認

```r
install.packages("leaflet")
library(leaflet)
#豊島区を中央として地図描画
leaflet() %>% 
     addTiles() %>% 
     setView(lng=139.715405,lat=35.732459,zoom=14)
```

![スクリーンショット 2015-12-13 0.15.01.png](https://qiita-image-store.s3.amazonaws.com/0/31156/d6966645-0d70-231a-acb0-ad5178ce0458.png)


###豊島区のAEDの場所をインポート＆プロットする
[LinkDataの豊島区AED設置場所][1]より
1-12行目を消去し、タブをカンマに置換後にインポート

```r
aed <- read.csv("AED_list_toshima.csv",header=F)
part_aed <- aed[c(2,3,4,13,14)]
#列名を変更する
colnames(part_aed) <- c("name","address","place","lat","lng")
#leafletにピンをプロットする
leaflet(part_aed) %>% addTiles() %>% addMarkers(lng=~lng,lat=~lat)
```

出来ました。簡単すぎる。
![スクリーンショット 2015-12-13 10.37.14.png](https://qiita-image-store.s3.amazonaws.com/0/31156/db2d14ce-8695-54a4-23de-d6efaebfa4c6.png)

### ポップアップを当ててみる

```r
leaflet(part_aed) %>%
  addTiles() %>%
  addMarkers(lng=~lng,lat=~lat) %>%
  addPopups(lng=~lng,lat=~lat,popup=~name)
```

![スクリーンショット 2015-12-13 10.56.38.png](https://qiita-image-store.s3.amazonaws.com/0/31156/4728f09a-5a29-2b81-338a-72e25ad9fa33.png)

もちろんズームもOK!
![スクリーンショット 2015-12-13 10.58.01.png](https://qiita-image-store.s3.amazonaws.com/0/31156/fad9f5d3-005c-eb54-5014-bdcf8840d069.png)

## 困った時のヘルプ
[leaflet公式のドキュメント][2]でもOKですが、
基本的にはrに組み込まれるヘルプで良いと思います。

```r
help(leaflet)
help(addPopups)
help(popupOptions)
#とかとか・・
```



以上！！

[1]:http://linkdata.org/work/rdf1s3616i
[2]:http://leafletjs.com/reference.html
実践ドメイン駆動設計の用語まとめ

「実践ドメイン駆動設計」本の用語をまとめていきます。

#DDD
>**ドメイン駆動設計**、略して**DDD**と呼ばれるソフトウェア開発手法がある。より高品質のソフトウェアモデルを設計する手助けとなる手法だ。これをうまく使いこなせば、**設計した結果が、そのソフトウェアの動作を明確に表す**ようにできる。...
>p.1

>DDDでは、ドメインエキスパートとソフトウェア開発者が力を合わせて、業務のエキスパートのメンタルモデルを反映したソフトウェアを開発する。これは決して、「現実世界」をそのままモデリングするということではない。DDDでは、現状をそのままモデリングするのではなく、業務により役立つモデルを作る。時には、使いやすいモデルと現状を反映したモデルとが食い違うかもしれない。しかし、そんな場合には使いやすいモデルを選択するのがDDDだ。
>p.9



#ユビキタス言語

>**要するにユビキタス言語って･･････
>業務で使う用語のことでしょ？**
>違うね。
>**ああ、業界で標準として定められている用語のことか。**
>それもちょっと違う
>**ドメインエキスパートがふだん使っている言葉のこと？**
>残念ながら、それも違う。
>**ユビキタス言語とは、ドメインエキスパートやソフトウェア開発者を含めたチーム全体で作り上げる共有言語のこと**。
>これが正解。わかったかな？
>p.20

#境界づけられたコンテキスト
>忘れてはいけない。境界づけられたコンテキストは明示的な境界であり、ドメインモデルがどこに属するのかを表すものである。ドメインモデルは、ユビキタス言語をソフトウェアモデルとして表したものだ。境界を設ける理由は、各モデルの内部的な概念やプロパティ・操作がそれぞれ特別な意味を持つからだ。...
>p.58

>境界づけられたコンテキストは明示的な境界であり、ドメインモデルがどこに属するのかを表すものである。境界の内部では、ユビキタス言語のあらゆる言語やフレーズが、特別な意味を持つ。そして、境界内のモデルは、その言語を正確に反映したものとなる。
>p.58

>境界づけられたコンテキストの主目的は、ユビキタス言語やそのドメインモデルをカプセル化することだ。...
>p.64

>境界づけられたコンテキストごとに、それぞれのユビキタス言語が存在する。
>p.23

#ドメインモデル

>忘れてはいけない。境界づけられたコンテキストは明示的な境界であり、ドメインモデルがどこに属するのかを表すものである。ドメインモデルは、ユビキタス言語をソフトウェアモデルとして表したものだ。境界を設ける理由は、各モデルの内部的な概念やプロパティ・操作がそれぞれ特別な意味を持つからだ。...
>p.58

#その他
>DDDでの設計方針は、いわばソフトウェアモデルをテストファーストで素早く洗練させていくようなものだ。...
>p.35

>各サブドメインを、境界づけられたコンテキストと一対一で対応させるのが、望ましいゴールである。...
>p.54

>DDDを実践する際には、個々の境界づけられたコンテキストについて、そのドメインモデルで使われる用語の意味を確実に理解しようと心がける。ソフトウェアをうまくモデリングするには、少なくともそうでなければいけない。特に、**言語の**境界を気にする。これらの概念的な境界が、DDDを実践する上での鍵となる。
>p.45


>... DDDを使うときには、境界づけられたコンテキストの内部でモデルを開発する。ドメインモデルを開発するということは、事業ドメイン全体の中で特定の部分にだけ注目するためのひとつの方法なのだ。...
>p.42


#軽量DDD
>軽量DDDとは、DDDの戦術的パターンの一部だけをつまみ食いする方法で、ユビキタス言語を見つけ出し育てていこうなどという気は毛頭ない。おまけにこの手法は、境界づけられたコンテキストやコンテキストマッピングを使わずに済ませることが多い。技術面だけに注目して、技術的な問題だけを解決したがっているのだ。この方法にはメリットもあるが、戦略的モデリングを併用したときのような大きな見返りは得られない。
>p.38
fluentdでAzure Storageにログを転送してみる


基本は、[ここ](https://github.com/htgc/fluent-plugin-azurestorage)の通りにやれます。
また、このプラグインは、[fluent-plugin-s3](https://github.com/fluent/fluent-plugin-s3)をベースにしているので、一般情報はs3で得てから触るほうがいいかもしれません。

##Plug-inのインストール

```bash
fluent-gem install fluent-plugin-azurestorage
```
WARNINGが出ますが、動くようです。ちょっと時間がかかるようです。

##設定

本家サイトの\<match>\</match>を参考にすればよい。
下記をベースにした場合、

* 指定したコンテナはなければ自動で作られます
* gzip圧縮されます。圧縮無しのテキストにしたいなら、store_asをtextにすればいいようです。
* 1時間に1回。10分遅れ(10:10とか）で20151213-08_0.gzというような形式のファイルが作成されます。
* 日付フォーマットはUTCベースになります。（JSTにしたいなら、utcを削除）

```bash
<match pattern>
  type azurestorage

  azure_storage_account    <your azure storage account>
  azure_storage_access_key <your azure storage access key>
  azure_container          <your azure storage container>
  azure_storage_type       blob
  store_as                 gzip 
  auto_create_container    true
  path                     logs/
  azure_object_key_format  %{path}%{time_slice}_%{index}.%{file_extension}
  buffer_path              /var/log/fluent/azurestorage

  time_slice_format        %Y%m%d-%H
  time_slice_wait          10m
  utc
</match>
```

##参考

多くの場合、下記で事足りるかと。Windows ServerなどからIISのログを転送したい場合は[こちら](http://qiita.com/okahashi117/items/65baac577bf73d1f64a6)を参考に。
GCPでMineCraft鯖のバックアップ

#はじめに
Qiitaでは初めて記事を書きます。あとそんなにGCP知らないです。
だから学びましょう。という記事を書こうと思っていたのですが1日目の方と、まるまる内容がかぶってしまいそうなので、MineCraftのサーバ建てることにしようとしたんですが、普通すぎてつまらないかなと思ったので、サーバのバックアップしてみることにしました。
[【2015年版】AWS ユーザが Google Cloud Platform に15分で入門する！](http://qiita.com/FumihikoSHIROYAMA/items/205fa3aebd20b3a1bace)

#GCPとは。
Google Cloud Platfromの略です。
Youtubeとかで使われてるインフラを提供してくれる感じですね。
似たようなサービスでMicrosoftのAzure、AmazonのAmazonWebService(AWS)がありますね！
という話も1日目でされています。

#料金
こういうのは、[Google Cloud 料金計算ツール](https://cloud.google.com/products/calculator/)で計算するといいです。
今回は、CloudStorageの中で最安であるNearlineを使います。大体1GB/1セントなので500GB保存しても5ドル＋ネットワーク使用料ということになりますね。
とはいっても、アップロードは無料なのでそこまでかからないでしょう。
#はじめてみる
早速やってみましょう。
##バケットを作る
GCPのダッシュボードからCloud Storageを選択しバケットを作成します
名前は適当にストレージクラスはNearlineを選択します。場所は好きなところを。

##gsutilコマンドを入れる
[Install gsutil](https://cloud.google.com/storage/docs/gsutil_install)を見ながら進めていきます。
ZIPとかからインストールするのはとてもじゃないですが面倒なので、コマンドで入れていきます。

```sh
$ sudo apt-get install gcc python-dev python-setuptools libffi-dev
$ sudo apt-get install python-pip
$ sudo pip install -U gsutil
```
インストール後、以下のコマンドを実行しOAuth認証を行います。

```sh
$ gsutil config
```
設定後、コマンドを実行して作成したバケットが出てくれば成功です。

```sh
$ gsutil ls
gs://backet-name/
```

##試しにアップロードしてみる。
試しに server.proptiesをアップロードしてみたいと思います。

```sh
$ gsutil cp server.properties gs://backet-name/
Copying file://server.properties [Content-Type=application/octet-stream]...
Uploading   gs://backet-name/server.properties:         755 B/755 B  
```

アップロードできたのか確認してみましょう。

```sh
$ gsutil ls gs://backet-name/
gs://backet-name/server.properties
```

しっかりアップロードされています。

##ワールドデータをバックアップする。

さっそく本題のスクリプトを書いていきましょう。

```sh:backup.sh
BACKUP_DATE=`date "+%Y%m%d_%H%M%S"`
COMMAND="gsutil cp -r world gs://backet-name/world_backup_${BACKUP_DATE}"
${COMMAND}
```

いい方法が思いつかなかったです。もっとスマートにかける気がします。
あとは適当にスクリプトをCronとかで動かせば自動的にバックアップされます。

##ライフサイクルを設定する
このまま動かし続けたら永遠にファイルはたまっていきます。料金もすごいことになってしまうので自動的に削除するようにライフサイクルを設定しましょう。
[lifecycle - Get or set lifecycle configuration for a bucket](https://cloud.google.com/storage/docs/gsutil/commands/lifecycle#set)

```json:lifecycle_config.json.json
{
  "rule":
  [
    {
      "action": {"type": "Delete"},
      "condition": {"age": 30}
    }
  ]
}
```

サンプルのままで、十分な気がするので日付を適切に設定して適用させます。

```sh
$ gsutil lifecycle set lifecycle_config.json gs://backet-name
```

#まとめ
たぶん、こういうのってMineCraft以外にも応用できますし、安いので頑張ってください。
わりとダメダメな記事で申し訳ないです。
Xamarin.tvOS の Early Preview 版を試す

## tvOS とは

Apple が 2015 年 9 月に発表した tvOS は、新しい Apple TV 向け OS です。サードパーティがアプリを作れるようになったのが最大の特徴です。

tvOS アプリの開発は、iOS アプリの開発が分かればある程度簡単に入っていけるかと思います。tvOS アプリは Xcode 7.1 以降で開発が可能です。

## Xamarin.tvOS

Xamarin の tvOS 向け対応は、現在 Early Preview 版が公開されている状態です。まだ制限事項が多く本格的な導入はできませんが、試しにさわってみることができます。

Xamarin.tvOS は Visual Studio での開発に対応しています。また、新しい Apple TV の実機があれば、実機で動かすことも可能です。

* [Xamarin.iOS 9.3 preview #3 for tvOS and WatchOS 2.0 in Visual Studio - Xamarin Forums](http://forums.xamarin.com/discussion/57111/xamarin-ios-9-3-preview-3-for-tvos-and-watchos-2-0-in-visual-studio)
* [Xamarin.iOS 9.3 preview #2 for tvOS 9.0 and watchOS 2.0 - Xamarin Forums](http://forums.xamarin.com/discussion/54753/xamarin-ios-9-3-preview-2-for-tvos-9-0-and-watchos-2-0)

## プレビュー版のインストール

この記事では、現時点で最新の Xamarin.tvOS Preview 3 を使います。また、Mac 版 Xamarin Studio と tvOS シミュレータを使います。

[Installing tvOS Support - Xamarin](https://developer.xamarin.com/guides/ios/tvos/getting-started/installation/) に従って、以下を行います。

* Xcode 7.1 をインストールします。
* Xcode を一度実行しておきます。
* Xamarin.iOS 9.3.1.63 をインストールします。
* Xamarin Studio 5.10.0.988 をインストールします。
* Xamarin Studio の Preferences で、Apple SDK の場所（Xcode のパス）を指定します。

なお、先日 Xamarin.iOS 9.4 がリリースされましたが、これは tvOS 未対応です。引き続き上記の Xamarin.tvOS Preview 3 を使う必要があります。

また、先日 Xcode 7.2 がリリースされましたが、Xamarin.tvOS Preview 3 はこれに対応しておらず、Xcode 7.1 を使う必要があるようです。

## サンプルプロジェクトを試す

上記のページから、「Hello, tvOS」というサンプルを取得してみます。

<img width="1042" alt="Hello-tvOS.png" src="https://qiita-image-store.s3.amazonaws.com/0/6204/6dfb073e-487f-7825-6bc0-cc53424e00b8.png">

構成が iOS アプリと同じであることが分かるかと思います。

では、ビルド・実行してみます。なお、Xamarin のライセンスによっては、プロファイル機能が使えないためビルドエラーになります。その場合はプロファイルオプションを外せばビルドできます。

無事にビルドできると、tvOS シミュレータが起動してアプリが実行されます。tvOS シミュレータの画面はとても大きいので、大きなモニタがあると良いですね。僕はモニタの大きさが足りなかったので、tvOS シミュレータの Scale を 75% に落として表示しました。

## その他のサンプルとドキュメント

Xamarin はサンプルとドキュメントが充実しているのが、相変わらず素晴らしいですね。

[Introduction to tvOS - Xamarin](https://developer.xamarin.com/guides/ios/tvos/) にサンプルとドキュメントがありますので、興味がある方は見てみると良いでしょう。

## まとめ

Xamarin.tvOS が使えるようになると、既存の C# の資産が Apple TV で活用できたりするかもしれません。今後に期待したいと思います。
Leaflet.jsを使って任意の画像の拡縮を行いたい

この記事は[FOSS4G Advent Calendar 2015](http://qiita.com/advent-calendar/2015/foss4g)の12日目の記事です。

![スクリーンショット 2015-12-13 10.23.21.png](https://qiita-image-store.s3.amazonaws.com/0/18599/7ee7a126-0d91-cf6c-0d8c-e858d480ef93.png)

# はじめに

こんにちは。[Code for Sapporo](http://www.codeforsapporo.org) のすずきゆうすけ ([@yuskesuzki](https://twitter.com/yuskesuzki)) と申します。

わたしは普段 PHP や Salesforce を用いて、主に業務アプリケーションの作成に関っているエンジニアですが、わたしが所属する Code for Sapporo でリリースした [「さっぽろ保育園マップ」](http://papamama.codeforsapporo.org) の開発を通じて、OpenLayers や Leaflet.js など、自分の本業外である地理位置情報を取り扱う機会が増えました。

しかし本業外だと思っていても気がつくと本業に交じってる事も多いので、なんでもやっておくべきだなーと思うことしきりであります。

今回は小ネタとなりますが、Leaflet.js のインタフェースを使って、地図以外の画像を取り扱ってみたいと思います。

# Leaflet.js で画像を取り扱う

Leaflet.js で地図タイル画像以外の任意の画像を取り扱う場合、Leaflet.js の L.Map の上に L.imageOverlay を用いて画像を重ねます。

その際、Leaflet.js の L.Map の CRS には、L.CRS.Simple を指定します。

```js:index.html
        var map = L.map('map', {
            maxZoom: 24,
            minZoom: 1,
            crs: L.CRS.Simple
        }).setView([0, 0], 1);

        var imageBounds = [[230,0], [0,345]]; //初期表示範囲

        var imageUrl = 'https://farm6.staticflickr.com/5495/9188725689_ac415ed0b5_h.jpg';
        var imageBounds = [[230,0], [0,345]]; //初期表示範囲

        L.imageOverlay(imageUrl, imageBounds, {attribution:''}).addTo(map);
```

これで Leaflet.js のズームスライダーを用いて画像の拡縮を行ったり、ドラッグして画像を動かすことができるようになります。

http://jsbin.com/gist/1c8c754f7237f06cac99?js,output
→[ソースコード](https://gist.github.com/yuskesuzki/1c8c754f7237f06cac99)

またある程度ズームしたときに別の画像を切替えることもできます。

http://jsbin.com/gist/5185ebbf7d5f48e806f0?js,output
→[ソースコード](https://gist.github.com/yuskesuzki/5185ebbf7d5f48e806f0)

こうすることで、

- 建物の図面を表示して、ズームすると店舗位置を示す図面に切り替えて表示
- 服を着た女の子イラストをズームすると、同じ構図の水着を着た女の子イラスト画像に切り替えて表示

といった応用も行うことができるかと。
特に２番めについてはサンプルを作ってましたが公開に間に合わす事ができず残念です。

こちらからは以上です。
あの秘蔵漫画が！

# Smalltalkで作られたiOSアプリ『[ピョンキー](http://www.softumeya.com/pyonkee/ja/)』の秘蔵漫画です。

![001hello-01.png](https://qiita-image-store.s3.amazonaws.com/0/105275/8b756f55-bfdd-eca1-599e-2a66f363ebdd.png)

初投稿でこれ以上アップできなくなったので、続きはまたこんど。乞うご期待。

盃　ちよ子
UML漫画は[こちら](http://www.atmarkit.co.jp/fcoding/index/futaba.html)
pyonpyon できる Docker イメージできました

<blockquote class="twitter-tweet" lang="en"><p lang="ja" dir="ltr">ls と pyonpyon を間違えた時にチノちゃんがコーヒーをいれてくれるコマンドも作ってます。よろしくお願いします。&#10;<a href="https://t.co/Ua6bDr8HIJ">https://t.co/Ua6bDr8HIJ</a> <a href="https://t.co/poHmbrT1S4">pic.twitter.com/poHmbrT1S4</a></p>&mdash; すぎやまたいち (@sgymtic) <a href="https://twitter.com/sgymtic/status/675332405327036418">December 11, 2015</a></blockquote>

ということなので [Docker イメージを作りました](
https://hub.docker.com/r/hkrn/pyonpyon/)。`docker pull hkrn/pyonpyon` して `docker run -t hkrn/pyonpyon` するだけで動きます。

Dockerfile も以下で全部

```docker
FROM alpine:3.4
MAINTAINER hkrn

RUN apk add --update g++ git make ncurses-dev && \
  git clone -b pyonpyon https://github.com/sgymtic/sl pyonpyon && \
  cd pyonpyon && \
  make && \
  apk del g++ git make ncurses-dev && \
  apk add ncurses && \
  rm -rf .git /var/cache/apk/*

ENTRYPOINT ["/pyonpyon/pyonpyon"]
```

 - 当初 `g++` ではなく `gcc` にしてたがビルドでエラーになる
   - `stdio.h` がないよと怒られる
     - http://forum.alpinelinux.org/forum/general-discussion/gcc-stdioh-no-such-file-or-directory
   - パッケージの依存関係から gcc より g++ をインストールしたほうがよいようだ
     - https://hub.docker.com/r/frolvlad/alpine-gcc/~/dockerfile/
 - Docker Hub の `Automated Build` つかったほうがよかったかもしれない
 - ビルド後は成果物と依存ライブラリ以外削除して軽量化 ※ 2016/6/4 追記
レガシーIEでのYouTube（iframe）対応

YouTube（を始めとするiframe系）関連のTips（随時更新）

# z-index問題
これはたぶんいちばん有名ですね。
IE9ぐらいまで、普通にiframeにzIndexを設定していても、値を無視して前面にでてきます。
対応は wmode=transparent を追加してあげるだけ

直接 HTMLに書くなら

```html
＜iframe src="http://www.youtube.com/embed/***?wmode=transparent" width="560" height="315"＞＜/iframe＞
```

YouTube Plyaer API経由なら

```js
player = new YT.Player('player', {
    height: '1920',
    width: '1080',
    videoId: '***',
    playerVars: {
        wmode: 'transparent'
    }
});
```

# 透明色すり抜け問題
これも種類的には上の重なり順問題に関連しているのですが、
よく背景動画として全画面でYouTubeを埋め込んで、手前でわちゃわちゃやるサイトがあると思います。
下のサンプルは例として、全画面でYouTubeが再生されて、マウスを動かしたらSKIPボタンがでるという想定です。

```html
<div class="container">
    <iframe src="***?wmode=transparent" class="player"></iframe>
    <div class="player-cover"></div>
    <a class="btn-skip">SKIP</a>
</div>
```

```scss

.container {
    position: relative;
}

.player {
    position: absolute;
    z-index:0;
    // etc...
}

.player-cover {
    position: absolute;
    z-index: 10;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
}

.btn-skip {
    display: none;
    position: absolute;
    z-index:20;
    // etc...
}
```

```js
// ie だと window.attachEvent('onmousemove', func);
window.addEventListener('mousemove', function () {
    document.querySelector('.btn-skip').style.display = 'block';
});
```

シンプルにするとこんな感じです。
キーとなるのは .player-coverです。
これがiframeに前に覆いかぶさるので、iframeの上でclickやmousemoveをしても、すべて.player-coverに巻き取られ、mousemoveイベントも問題なく発火するという仕組みです。


なにも難しいことはないですね。
単純明快。
そしてこれがレガシーIEだとうまくいきません。ふぁっきゅーです。


原因は、.player-coverに背景系のプロパティが指定されてないためです。
モダンブラウザだと、上記は「透明なガラス」状態になるので、透明ではありますが、突き抜けることはありません。
ただしレガシーIEだと「なにもない」状態になってしまうため、mousemoveやclickは.player-coverで巻き取られる事なく（イベントが発火することなく）iframeに流れていってしまいます。

```scss
.player-cover {
    position: absolute;
    z-index: 10;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    background-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
}
```

というわけで 1x1の透明色GIF画像を背景画像に設定してあげれば万事解決です。

＜追記：2015/12/14＞
もともと .player-cover でなく.containerのbefore要素に値を設定していたのですが、
IE7、IE8だと擬似要素の重なり順周りにバグがあるので、beforeからdivに変更しました。
std::chrono::steady_clock の精度 (スマホ編)

今回は ~~楽をするために~~ cocos2d-x 3.8.1 を用いて検証しました。
検証に使ったコードは以下のとおり。

```cpp:AppDelegate.cpp
AppDelegate::AppDelegate()
{
    std::thread th{[]{
        using clock = std::chrono::steady_clock;
        constexpr int64_t LOOP_COUNT = 100000;
        constexpr int64_t DIST_FREQ = 200;
        constexpr int64_t DIST_SIZE = 16;
        std::this_thread::sleep_for(std::chrono::seconds{10});
        
        int64_t min = std::numeric_limits<int64_t>::max();
        int64_t total = 0;
        int64_t max = std::numeric_limits<int64_t>::min();
        float total2 = 0;
        std::array<int, DIST_SIZE> dist{0};
        int overCount = 0;
        
        for (int i = 0; i < LOOP_COUNT; i++) {
            auto a = clock::now();
            auto b = clock::now();
            auto diff = std::chrono::duration_cast<std::chrono::nanoseconds>(b - a).count();
            if (diff < DIST_FREQ * DIST_SIZE) {
                dist[diff / DIST_FREQ]++;
            }
            else {
                overCount++;
            }
            total += diff;
            total2 += diff * diff;
            if (diff < min) min = diff;
            if (diff > max) max = diff;
        }
        
        float mean = (float)total / LOOP_COUNT;
        float sd = std::sqrt(total2 / LOOP_COUNT - mean * mean);
        CCLOG("min:%lldns, max:%lldns, mean:%f.2ns, sd:%f.2ns", min, max, mean, sd);
        for (int i = 0; i < DIST_SIZE; i++) {
            CCLOG("%5lld - %5lld : %d", DIST_FREQ * i, DIST_FREQ * (i + 1) - 1, dist[i]);
        }
        CCLOG("        %5lld+: %d", DIST_FREQ * DIST_SIZE, overCount);
    }};
    th.detach();
}
```

AppDelegate のコンストラクタを用いているのは、
既存のプロジェクトでも計測しやすくするためです。

Android では gcc4.9 を用い、指定したコンパイルオプションは以下のとおり

```
-std=c++14 -fexceptions -frtti -fsigned-char
-DCC_ENABLE_SCRIPT_BINDING=1
-DCC_USE_PHYSICS=0 -DCC_USE_3D_PHYSICS=0 -DCC_USE_TIFF=0 -DCC_USE_WEBP=0
-DCC_DIRECTOR_STATS_INTERVAL=0.5f
```

iOS では Xcode7.2 を用い、c++14 に設定した上で、以下のマクロを定義してあります。

```
COCOS2D_DEBUG=1
USE_FILE32API
USE_PHYSICS=0
CC_USE_TIFF=0
CC_USE_WEBP=0
```

なおどちらもデバッグビルド (-O0) です。

計測した結果は以下のとおり。
https://gist.github.com/mezum/0ff696d046da133663fa

~~執筆時ではまだ Android4.4, iOS7.0 の 2 端末でしか検証していないのですが、~~
~~約 1-2 マイクロ秒オーダーの精度は望めそうです。 (要検証)~~
少なくとも iOS なら 2 マイクロ秒前後、Android ならば 32 マイクロ秒前後の精度で値は取れるようです。

#考察
gnustl の実装を見てみると、clock_gettime を用いて CLOCK_MONOTONIC の時刻を取得して time_point に詰め替えています。
https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/src/c%2B%2B11/chrono.cc

また、libc++ の実装を見てみると、gnustl と同じく clock_gettime を用いるか、mach_absolute_time を用いて居るようです。
(CLOCK_MONOTONIC を使う場合の警告文から察するに iOS の場合はmach_absolute_time を用いている感じがします。)
https://github.com/llvm-mirror/libcxx/blob/master/src/chrono.cpp

clock_gettime を用いているのであれば、clock_getres で精度を取れるかもしれない。
JenkinsでXcodeのバージョン切り替えを行う

本記事は、モバイルDevOpsカレンダーの13日目です。

## やりたいこと
 - Jenkinsでjobを実行する際に利用するXcodeのバージョン切り替えたい。

Xcodeのメジャーアップデートが近づくと自身の環境なども含め、βのXcodeをダウンロードして動作確認をすることが多々あるかと思います。

### よくやる切り替え方
複数のXcodeをインストールした場合の、切り替え方としては以下があります。

 - 1) xcode-selectを使う
 - 2) DEVELOPER_DIR環境変数を使う

Jenkinsのような環境の場合、2)でおこなうのが一般的です。
ただし、1)にしろ、2)にしろXcodeのインストール先を指定する必要があります。


### 今回やったこと
インストール先を指定するのは面倒なので、インストールされているXcodeを動的にチェックし、DEVELOPER_DIR環境変数の値として指定できるようにする。


## やりかた
### プラグインのインストール
 - Jenkinsの管理のプラグインの管理から「Dynamic Parameter Plug-in」をインストール
    - https://wiki.jenkins-ci.org/display/JENKINS/Dynamic+Parameter+Plug-in

このプラグインを使うと、Groovyスクリプトの実行結果をパラメータとして使うことが出来ます。
他にも```Active Choices Plugin```などがあります。

### Jenkinsの設定
インストールした後の設定方法は以下のとおりです。

ビルドのパラメータ化から「Dynamic Choice Parameter」を選択。 
選択したら、以下のとおりに値を設定します。

#### Name
 - DEVELOPER_DIR

ここで指定した値が環境変数になります。

#### Choices Script
スクリプトを記述します。
Xcodeは全てApplications配下にあるものとします。

```groovy:サンプルコード
def targetPath = "/Applications/"

def xcodeList = []
"ls $targetPath".execute().text.eachLine({ list ->
 def result = list =~ /(Xcode.*)/         
 if (result) {
  xcodeList <<  "$targetPath" + result[0][1]
 }
})
xcodeList
```

#### Remote Script
 - チェック

これをチェックするとmasterではなくslave上で実行されます。
ただしslave環境が複数あった場合は、結果をまとめてくれるわけではないので注意が必要です。

```
Note: if the "Remote Script" check-box is checked, then the script will be executed on the slave where the build is started.
https://wiki.jenkins-ci.org/display/JENKINS/Dynamic+Parameter+Plug-in
```

上記、全ての設定が終わると以下の様な感じになります。

<img width="808" alt="設定画面" src="https://qiita-image-store.s3.amazonaws.com/0/37642/eb6d1558-ec09-05f3-3837-1f3abacd51ba.png">


### Jenkinsの実行画面
設定が終わり、パラメータ付きビルドを選択すると以下のように表示されます。

<img width="310" alt="実行画面" src="https://qiita-image-store.s3.amazonaws.com/0/37642/a13bdc15-1473-905f-625a-401aa39c1498.png">

これでビルドをすれば、指定したXcodeで実行されます。

## 蛇足
このプラグインの他の利用方法とし、自動テストで実機の端末を指定したい場合にも利用することが出来ます。

例えば、Android端末であれば```adb devices```を利用しserialNumberを取得して、パラメータとして表示させることも出来ます。

ただ、このプラグインを単に使うだけでは、以下の様な問題があります。

 - 指定した端末でテストが実行していてもパラメータとして指定出来てしまう。
 - 複数slaveが存在し、それぞれにAndroid端末が接続されている場合、全てのserialNumberが表示されるわけではない。
 - serialNumberだけではどの端末か分からない。

上記のような問題は運用でカバーになってしまいます。
※この問題に対する対応方法については、別途書きたいと思います。

## 最後に
本プラグインを今回の用途や蛇足の用途で利用する場合において問題点が何点かあります。
運用で多少カバーは出来ますが、あまりそこにコストをかけたくないです。

しかし、Jenkinsのプラグインは自身で開発することもできます。
従って、自身の環境に応じてプラグインを作るというのも1つの手だと思います。
※年末年始に作ってみようかなと思ってはいます(思ってはいる)。

## 参考
 - https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/xcode-select.1.html
 - 
https://wiki.jenkins-ci.org/display/JENKINS/Dynamic+Parameter+Plug-in
line monitor > /etc/rc.local (151213)

line monitor
http://qiita.com/7of9/items/028556c5a819a6a8de96

<hr>

2015年12月13日現在、/etc/rc.localに記載しているもの。

```
## for line monitor
cd /home/pi/lineMonitor/python-151113-lineMonitor
nohup ./linemonitor.py &

## IP address display (2015 Nov. 28)
cd /home/pi/lineMonitor/python-151127-7segLed_IPadrDisplay
nohup ./IPadrDisplay.py &

## shutdown (2015 Dec. 05)
cd /home/pi/lineMonitor/python-151205-shutdownButton
nohup ./shutdownButton.py &

## USB copy (2015 Dec. 12)
cd /home/pi/lineMonitor/python-151212-logFolderCopier
nohup ./logFolderCopier.py /home/pi/lineMonitor/python-151113-lineMonitor/Log/ &

exit 0
```

こういうのはgitで管理していないので、microSDがとんだら復旧が面倒。


### nohupでなく`sudo &`
(追記 2018/03/12)

上記の例ではnohupを使っているが、`/etc/rc.local`の設定例をいくつか見ると以下の書き方をするようだ。

```
...
## IP address display (2015 Nov. 28)
cd /home/pi/lineMonitor/python-151127-7segLed_IPadrDisplay
sudo ./IPadrDisplay.py &
...
```

.pyにchmodで実行権限をつけていない場合は`sudo python ファイル名.py &`とする。
line monitor > COM通信の選択肢 > 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200. / 115200より上も多くのデバイスで動く

RS-232C通信で使っているpython3-serialの通信速度について、どういう値を選択できるのか調べた。

http://pyserial.readthedocs.org/en/latest/pyserial_api.html

> The parameter baudrate can be one of the standard values: 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200. These are well supported on all platforms.

> Standard values above 115200, such as: 230400, 460800, 500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000, 2500000, 3000000, 3500000, 4000000 also work on many platforms and devices.


RPiでは上限はどこまで行けるのだろうか。

ノイズによって通信がダメになる限界はあるのだろうが。
MSXの投稿作品を遊びたかったのでGAMEBOYで自作した話

本記事は[MSX Advent Calendar 2015](http://www.adventar.org/calendars/920)の12日目の記事です。

# はじめに #

PV-7を買って、拡張BOXと64KB-RAMカートリッジまで行っちゃった人、mnagakuです。MSX2は、中古で譲ってもらったHB-F500でした。HB-F500は最終的に、オカンのテトリス専用機になってました。MSX2テクニカルハンドブックは無くしてしまいましたが、MSXテクニカルガイドブック（ASCAT）は、今も手元にあります。

今日は、中学生ぐらいの時に打ち込んで面白かった投稿作品が忘れられず、GAMEBOYで自作した思い出を書いてみます。ソースは[ここ](http://page.freett.com/gameboy/soft.html)にありますので、GBDKのビルド環境とGBエミュレータを用意すれば遊べます。

# REFRECTION GAME #

![ref.png](https://qiita-image-store.s3.amazonaws.com/0/42021/95628762-38ed-e02e-197a-5653da378ef6.png)

ベーマガに載っていたような気がしてたんですが、[MSXマガジン1985年1月号](http://www43.tok2.com/home/cmpslv/Typmsx/Typmsx.htm)とゆー情報をさっき見つけました。

スペースキーのみで遊べるシンプルなゲームで、ひたすらスペースキーを叩いてた記憶があります。

# うめき #

![umeki.png](https://qiita-image-store.s3.amazonaws.com/0/42021/1bb24a45-7bd5-5d8c-a225-402a1e5a7378.png)

[MSX・FAN1987年12月号に掲載された1画面プログラム](http://msx-fan-wiki.appspot.com/view/241)で、作者は「Beta.K」氏。とゆーのが、さっき分かりましたw GB版を15年前に作った時は分かんなかったんですよね。

GB版を作るにあたって、GBDKのline()のバグを見つけて、修正版を送ったのに無視されたり、懐かしい思い出です。

GGJ2015軽井沢会場では、ウェブテクノロジの某氏から借りたP/ECEで作品作ろうとして、古本でムックも揃えたりしてたのに、開発環境をインストールしようとしたらCD-ROMドライブがなくって断念し、急遽、[umeki ggj2015](http://globalgamejam.org/2015/games/umeki-ggj2015)を作ったりもしました。

# さいごに #

15年前に上記の2本を書いた時に思ったんですが、自分のスキル的な問題もあったかも知れませんが、MSXのオリジナル版の方が、コードが短かったなあ、と。MSX-BASICって良い環境だったんだなあ、と。万人が使えるものではなく、実際、あの頃にプログラミングしてた中高生は今より少なかったかも知れませんが、PCのアーキテクチャもシンプルで勉強し易かったという気がします。

BASICという開発環境は、今となっては古くて万人向けではないかと思いますが、あの頃のH/Wのアーキテクチャを題材にした教育利用とかは、今でもアリのような気がしますね。

ありがとう、MSX
line monitor > 付随Tool > USBメモリコピー(v0.2) > ファイル上書き / umount

line monitor
http://qiita.com/7of9/items/028556c5a819a6a8de96

```txt:動作確認
Raspberry Pi2 + raspbian
```

## v0.2

[v0.2 @ github](https://github.com/yasokada/python-151212-logFolderCopier/releases/tag/v0.2)

以下の対応をした。

1. ファイルを上書きできるようにした
2. ファイルコピー後、umountするようにした
python > umountする > cmd=["umount", dstpath] / subprocess.Popen(cmd, bufsize=0)

```txt:動作確認
Raspberry Pi2 + raspbian
```

ラインモニタのログフォルダのUSBコピー機能をテストしている中で、「フォルダ構造が壊れました。fsckしてください」のようなメッセージが出てきた。

やはりumountしないといけない。

umountの方法を色々試して、以下の実装に至った。


[commit @ github](https://github.com/yasokada/python-151212-logFolderCopier/commit/4063866d224f194802232fa2937894ca5a286897)

```
import subprocess

...
dstpath="/media/pi/COPYTO"
...

cmd=["umount", dstpath]
print cmd
subprocess.Popen(cmd, bufsize=0)
```

wait()がいるのかどうか未調査。

umountのみなので、サブプロセスはすぐに終了しているかと思うが。
python > shutil.copytree() > ファイルを上書きしない >  代わりに distutils.dir_util.copy_tree() を使う

```txt:動作確認
Raspberry Pi2 + raspbian
```

ラインモニタのログ・ファイルをフォルダ単位でコピーするため、以下のようにしていた。

```
shutil.copytree(srcpath, dstpath + "/Log/")
```

しかしながら、昨夜、連続通信試験をしながらログをとっても、昼の作業のログしか取れてなかった。ファイル上書きに失敗しているようだった。　

参考1. [上書きできないという質問 @ SO](http://stackoverflow.com/questions/12683834/how-to-copy-directory-recursively-in-python-and-overwrite-all)
参考2. [distutils.dir_util.copy_tree()を使うには @ SO](http://stackoverflow.com/questions/18908941/unable-to-import-distutils-dir-util-on-windows/33417555#33417555)


以下のように変更した。
[変更コミット @ github](https://github.com/yasokada/python-151212-logFolderCopier/commit/4ab55b3399664fd5058c24f7fb3de67866f6e0f4)

```
 #!/usr/bin/env python
 
 '''
+v0.2  2015 Dec. 13
+  - fix bug > did not overwrite files 
 v0.1  2015 Dec. 12
   - add USB memory insertion recognition
   - add folder copy feature
 @@ -20,6 +22,8 @@
 import os.path
 import sys
 import time
+import distutils
+from distutils import dir_util
 
 param = sys.argv
 
 @@ -36,7 +40,7 @@
 	if os.path.isdir(srcpath) and os.path.isdir(dstpath):
 		if chk1==False and chk2==False and chk3==True:
 			print "inserted"
-			shutil.copytree(srcpath, dstpath + "/Log/")
+			distutils.dir_util.copy_tree(srcpath, dstpath + "/Log/")
 			print "Copied"
 	time.sleep(0.5)

```
自身のホームページやWebサイトに独自のキーバインドを設定する方法

GoogleやHatenaのサイトでは、実は`vi`のキーバインドが有効になっています。つまり、`j`や`k`でコンテンツを選択できるようになっています。

今回は、このような機能を自身のホームページやWebサイトで設定してみようということで、この記事を書きます。

使用するのは、[jeresig/jquery.hotkeys](https://github.com/jeresig/jquery.hotkeys)です。使い方は、以下の様なコードを書けばOKです。

```js:js/hotkeys-vi.js
$(function(){
    $(document).bind('keydown', 'j', function(){      
        $(".move:focus").closest('li').next().find('a.move').focus();   
    })
});

$(function(){
	$(document).bind('keydown', 'k', function(){      
		$(".move:focus").closest('li').prev().find('a.move').focus();   
	})
});

$(function(){
	$(document).bind('keydown', 'g', function(){      
		document.location.href = '#';
	})
});

$(function(){
	$(document).bind('keydown', 'Shift+g', function(){      
		document.location.href = '#footer';
	})
});

$('.move').click(function() {
    this.focus();
});

$(function() {
    $('#first').focus();
});
```

```html:head.html
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="https://raw.githubusercontent.com/jeresig/jquery.hotkeys/master/jquery.hotkeys.js"></script>
<script type="text/javascript" src="js/hotkeys-vi.js"></script>
```

```html:index.html
<ul>
<li> <a id="first" href="#" class='move'>Link</a> </li>
<li><a href="#" class="move">Link</a></li>
<li><a href="#" class="move">Link</a></li>
<li><a href="#" class="move">Link</a></li>
</ul>
```

これで、`j`や`k`でコンテンツのフォーカスを移動できるようになります。
ArchLinuxのVimの扱いについて

##イメージにはVimが入ってる

まず、下の記事を読んでみてください。ArchLinuxのイメージに入ってるパッケージが詳しく紹介されています。

[Arch Linux のライブ起動イメージに入っているパッケージ (2015年12月版)](http://qiita.com/polamjag/items/7ec4012a4c34dffabdc5)

実は、Arch Linuxをインストールする際には`vim`コマンドが使えます。つまり、このイメージには、Vimはインストールされていますので、Vimが使えます。

##Arch LinuxにはVimが入ってない

次に、Arch Linuxをインストールする際、公式が用意するパッケージ群をインストールすると思いますが、具体的には以下のコマンドを実行する人が多いかと思います。

```bash:
$ pacstrap /mnt base base-devel
```

ここで、`base`にはコンピュータ操作のための最低限のパッケージが入っており、`base-devel`には開発に役立つと思われるパッケージが幾つかの一般的なコマンドとともに入っています。

これらをインストールすることで、一般的に使われているArch Linuxとして機能するわけですね。

しかし、いざArch Linuxをインストールしたコンピュータを起動させ、`vim`コマンドを実行しても、"そんなものはない"って言われます。ちなみに、`vi`はインストールされているようです。

「あれ、さっきは使えたはずなのになんで?」と思われる方がいるかもしれませんが、実は、Arch LinuxのイメージとArch Linuxのインストール(base, base-devel)では入ってるパッケージが違います。

つまり、Arch LinuxをインストールしてすぐにVimを使いたければ、Arch Linuxをインストールする際に、`pacstrap /mnt base base-devel vim`としなければならなかったのです!!!

##結論

Arch Linuxのイメージには`vim`は入ってるが、Arch Linuxのデフォルトには、`vi`しかはいってない。

最後に、Arch Linuxの理念を引用して終わりたいと思います。

> The Arch Way : シンプルであれ


###注意

※ あくまでネタです。あまり深く考えないようにしてください。Arch Linuxにはviしか入ってないと言われることがよくあるので。
fluentd最低限のメモ


###インストール

私の環境はCentOSなのでrpmを利用してインストール。

```bash
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
```
fluentdですが、実際のデーモンはtd-agentという名前です。
fluentdは開発版の名前で、安定版の名前がtd-agentなのだとか。

###バージョン確認

```bash
td-agent --version
td-agent 0.12.12
```

###実行ユーザー変更

fluentd(td-agent)はログを収集、書き込むという性質上、root権限が必要になることが多い。
テスト等であれば不要なトラブルを防ぐため、実行ユーザーはrootにしておくのが無難。

設定は、/etc/init.d/td-agentの中の、下記の箇所をtd-agentからrootに変更する。

```bash
TD_AGENT_USER=root
TD_AGENT_GROUP=root
```

###設定ファイル

設定ファイルは、/etc/td-agent/td-agent.confをいじる。

###実行

CentOS6.x系なので、

```bash
service td-agent start
```
その他、stop,status,restart諸々のコマンドが使えます。

>設定変えたら、restartもしくはreloadを忘れずに。

###fluent-cat

テストにfluent-catを利用する例が多く紹介されていますが、rpmインストールではPATHは通ってないようです。
fluent-catは、下記にあるようです。

```bash
/opt/td-agent/embedded/bin/fluent-cat
```
で、

```bash
export PATH=$PATH:/opt/td-agent/embedded/bin/

echo '{"status":"OK"}' | fluent-cat <tag.name>
```
などとする。

##設定

冒頭にも書きましたが、設定ファイルは/etc/td-agent/td-agent.confに設定します。

###単純な例

最も単純な例は下記のようなものです。

```xml
<source>
	type forward
</source>

<match log.**>
	type stdout
</match>
```

こんな感じにすると、

>設定を変更したらrestartとするかreloadが必要です。

```bash
echo '{"status":"OK"}' | fluent-cat log.hoge
```

/var/log/td-agent/td-agent.logに下記のように出力されます。

```bash
2015-12-13 07:02:52 +0900 log.hoge: {"status":"OK"}
```

>ローカルからはもちろん、この時点で、リモートからリクエスト？もリッスンしているようです。標準portは24224のようです。

sourceを、

```xml
<source>
  type forward
  port 24224
  bind 0.0.0.0
</source>
```
などと記述することもできます。

###ファイルへ出力

```xml
<source>
	type forward
</source>

<match log.**>
	type file
	path /var/log/fluentd/out
</match>
```

###ログを転送

####送信側

ログを転送したいサーバにもfluentdを入れて、下記のように設定します。

```xml
<source>
  type tail
  path /var/log/messages
  format syslog
  pos_file /var/log/fluentd/messages.pos
  tag log.foo
</source>

<match log.*>
  type forward
  <server>
    host 192.168.77.140
    port 24224
  </server>
</match>
```

####受信側

受信側はとりあえずそのまま。

```xml
<source>
	type forward
</source>

<match log.**>
	type file
	path /var/log/fluentd/out
</match>
```

送信側で、

```bash
logger hogehoge
```

などとし、/var/log/messagesにログを送ります。
ファイル（out)に反映されるまで少々かかります。

>出力までの時間をや設定するには flush_interval 10s とかにすればいい？

###参考

* いろいろありますが、[ここ](http://knowledge.sakura.ad.jp/tech/1336/)が最初に読むにいいかなと。
* ログ収集エージェントの性質場、一番気になるのはログの欠損。その可能性と対応は[ここ](http://blog.livedoor.jp/sonots/archives/44690980.html)を読んでおく。
Google for Mobile Tokyo ユーザーとコンテンツの距離を縮めよう - コンテキストウェアなアプリケーション

# Introduction
  * デベロッパーリレーションズ調べ
    * 49% の人は買うときにWebで比較する
    * 33% の人は調べるためにWebを使う
  * 気が利くアプリが求められている

# コンテンツまでの距離
  * ユーザーが何かをしたいと思ってから行動を終えるまでの時間
    * 何かを知りたい
    * どこかへ行きたい
    * 何かを買いたい

# お気に入りのアプリのみが使われる
  * モバイルの時間の72%を27個のアプリが占める
    * 月に1回以上利用するアプリは27個
    * 月に10回以上利用するアプリは9個
    * アプリはブラウザの2.5倍の利用時間

# コンテンツまでのステップと離脱率
  * ステップを1つ重ねる毎に20%のユーザーが離脱

# 各ステップの所要時間と離脱率
  * 各ステップに掛かる時間が伸びても離脱率は増加

# コンテキストをどう捉えるか

# ステップの省略・短縮
  * [SmartLock for
Passwords](https://developers.google.com/identity/smartlock-passwords/android/)
  * App Indexing -- 検索条件を何度も入力させない
  * Now on Tap -- そもそも入力不要
  * Eddystone + 関連API *[Beacon関連製品](https://developers.google.com/beacons/)
  * Service Worker
  * [Accelerated Mobile Pages (AMP)](https://www.ampproject.org/)
  * 通知とコンテンツ -- 通知がリッチになり通知だけで完結する
  * 通知と[Android
Wear](http://developer.android.com/intl/ja/wear/index.html) --
通知で完結するならスマホまでは要らずWearで十分では？

# 手順を短く素早く終わらせるためによりユーザーの状況を想定した実装を
Google for Mobile Tokyo スマートフォン体験を一歩先へ - プログレッシブウェブの作り方

# イベントサマリ
* Titlle: Google for Mobile Tokyo
* Date: 2015-12-09 10:00 - 17:30
* URL: https://events.withgoogle.com/google-for-mobile-tokyo/
* hashtag: #gfmtokyo https://twitter.com/hashtag/gfmtokyo
* スライド資料: [スマートフォン体験を一歩先へ 〜 プログレッシブ ウェブ アプリの作り方](https://docs.google.com/presentation/d/1VcXsKDaCUpf2SS35WNcrKslkK6PcXxWsnhcKiLfWCXs)

# Introduction
  * スマートフォンの月間利用時間 1.49
  * スマートフォンの月間利用時間 APP 1.28, Web 0.23
  * スマートフォンの時間 80%は，その人のトップ3アプリに費やされている
  * スマートフォンユーザーの平均月間利用アプリ数 25
  * Chrome for Androidユーザーの平均月間訪問サイト数 100+

# 提案
  * アプリのトップ3を目指すより，Webを使いやすくしたほうが使ってもらえるのでは？
  * インストールされないアプリより，Webを提供したほうが良いのでは？

# デモ
  * 実体験(アパレルショップ訪問>ユーザ登録すると5%off>並んでる間にできなくて面倒で断念)から
  * アプリインストールの壁，ユーザー登録の壁 を通じて，
  * [FlipKart](http://www.flipkart.com/)というインド最大のECサイトをデモで紹介。
  * Progressive Enhancement で， Reactで実装されておりオフラインにも対応している

# 技術
  * HTML5
    * Cache
  * アプリインストールバナー −− Chromeがサジェストしてくれる機能
  * Service Worker
  * Cache API -- オフラインのためだけではなく，パフォーマンスとしても意味あり
  * シングルページアプリケーション
  * [Application Shell](https://github.com/GoogleChrome/application-shell)
  * プッシュ通知
    * 過去： メール，いいね，アプリ通知
      * 過去はユーザーのアクションが必要だった。メルマガ登録，いいねする，アプリをインストールする
    * 未来： Webを訪問してくれて，通知の許可をOKしてもらうだけ
      * 例) チケットサイトに訪問し，まだ発売前なのでnotify meをタップ，ユーザが通知を許可，販売開始したら通知
    * FacebookのWeb版は既に対応しているので，ぜひアプリ版ではなくWeb版で試して欲しい
  * Background Sync -- Offlineでページを表示できなかった → Onlineになったら通知してくれる
  * One-off Sync
  * Periodic Sync
技術英語 > I have been walking [in circles] for the past 20 minutes, trying to get to the Engineering. / be in a virtuous circle

@ Star Trek > TWISTED

艦内の空間配置がおかしくなる症状により、思ったところへ辿りつけないクルーたち。
トレスが

> I have been walking <font color=red>in circles</font> for the past 20 minutes, trying to get to the Engineering.

機関室(the Engineering)へ辿り着くため、(壁沿いに)円を描くように歩いてきたということなのだろう。

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

virtuous circle
好循環

@ カシオの電子辞書からのメモ

> be in a virtuous circle
今日は関西フロントエンドUG年忘れLT大会の日です

 
安心してください、まだ間に合いますよ。

## 関西フロントエンドUG年忘れLT大会

本日12/13日は関西フロントエンドUG 年忘れLT大会の日です。
http://kfug.connpass.com/event/22377/

LTで喋ってタダ酒飲もう!! という趣旨のよくわからない勉強会ですが、
ようはまぁ1年間コミュニティで勉強会してきたので、年の瀬くらいみんなでパーッと盛り上がりましょう、みたいな趣旨です。

### LTってなに？

Lighting Talk の頭文字をとってLTです。

概ね５分程度の時間で、ざーっと何かしらを喋ります。

技術的な話でもOKですが、５分と短い時間ですので、
宣伝/宣伝的な内容、ネタに特化した内容、とりとめのない物、なんでもOKみたいな文化になっています。

勉強会で喋ってみよう!!という人にとっては、一番やりやすい枠でもあり、
また、それだけに一番奥の深い枠だったりします。


## エンジニアにとって喋るということ

エンジニアにとって喋るということはとても大事なことです。

よく稀に「IT系の仕事は人と喋らなくてすむから…」という話をする学生さんがイたりしますが、
それってほんとに正解でしょうか？

確かに営業や販売のように不特定多数とむやみに喋る、みたいな機会は無いかもしれません。

ただITの専門技術職という立ち位置につく以上、「喋る」という事自体から逃れるのはなかなか難しいように思います。

自分の技術や設計を、チームメンバーや非技術者の管理者に「説明する」事も、技術者の大切なオシゴトの１つです。

チーム内での責任が増してくると「説明する」だけでなく、「評価する」「支持する」「説得する」「誘導する」というコミュニケーションスキルが求められるようになってくるかもしれません。

### 現場とコミュニケーション

IT系はブラックだ、という話を聞くと、「それって現場内でのコミュニケーションできてないだけじゃね？」と思うことは多々あります。

まぁ政治的な理由でコミュニケーションがそもそも硬直してるってケースもあるんですが、
政治的な力関係も絶対的なものではなくて、コミュニケーションでなんとかできるものですよね？

現場の環境を悪化させるような、仕様認識のズレだったりスケージュールに関する認識、技術導入に関するやりとりなどって、
結構コミュニケーションの力でなんとか解決する事ができたりする事も多いんですよ。

現場がブラックだ…とぼやいていても始まらないので、
とりあえず技術を「説明する力」そして現場を「説得する力」を身に付ければ、
ブラックな現場も楽しい現場に(自分の力で)変えられるかもしれませんよ。

## 関西フロントエンドUGでは初めての登壇者を応援しています!!

毎月の勉強会等に参加してもらって、技術に関する関心を高めて行ってもらうのは
コミュニティの本旨でもあり非常に嬉しい事なのですが、そこからもう一歩踏み出して、コミュニティで喋るきっかけ作ってみませんか？

関西フロントエンドUGでは、毎回の勉強会で潤澤な登壇者枠を用意して、皆様の登壇をお待ちしております。

何を喋ればいいか不安…という方は、気軽にスタッフなどに相談してもらえれば、
発表資料の作成や、登壇時の練習等サポートさせてもらうことも可能です!!
[EventSpace.Aim](http://aim.osaka.jp/)という所では、
Web製作者のスキルアップ相談や、コミュニティでの登壇相談なども受け付けていますので、是非お気軽にご相談ください。

まぁとりあえず困ったときにはLTから初めて見るのが良いと思います。
5分くらいは意外となんとかなるもんです。自己紹介で１分くらいは稼げますし。
「私なんかが喋っても迷惑に…」とか考える人も居るみたいですが、
毎回の勉強会で登壇者集めに苦心している主催者からしてみると、どんな方でも発表で手を上げてもらえるのは非常に嬉しいものです。

### 2015年 何か喋りましたか？ 大丈夫、まだ間に合います。

繰り返しになりますが、本日12/13日は関西フロントエンドUG 年忘れLT大会の日です。
http://kfug.connpass.com/event/22377/

当日飛び込みLTの参加も全然OKです。参加枠いっぱいっぽく見えますが全然だいじょうぶです。
とりあえず申し込んで、[公式Twitter](https://twitter.com/frontkansai)とかに声掛けしておけば参加できると思いますよ。

会場では軽食とアルコールを取りながらのLT大会となるので、
きっと初めての登壇、とかでもみんなノリ良く対応してくれるはずです!!みなさん大人ですしね。

勉強会には参加してるけど、喋ったことはまだない…という方は
とりあえず喋ってみる経験づくりの第一歩として、是非KFUGで喋ってみるのはいかがでしょうか？

今日、5分喋ってタダ酒飲めるのはこのコミュニティだけ!!(多分)

====


コミュニティを通じて技術者のレベルアップだけでなく、
コミュニケーションを通じた現場改善を推進していける人材がたくさん生まれるといいなぁとか。
そういうまっとうな事を考えながら運営している時もたまにはあります、というお話でした。