OmniAICreator/Qiita-1.07M huggingface dataset:
オタマートで使ってるライブラリ(iOS)

オタマートもObjective-cなのね
Swiftになってる所すくないのかな？

##1.AFNetworking
　いつもの
##2.Crashlytics
　クラッシュログ収集ライブラリ(Fabric)
　これも有名てか、使ってる。
##3.Flurry
　Analytics系
##4.MBProgressHUD
　ローディング
##5.nnimbus
　ってなってるけどnimbusKitかと
　　ラベルの中の文字色変えたりとかのオシャレ要素フレームワークかな？
##6.NSDate-RelativeDate
　NDAteの拡張で言語毎に合わせたりとか加算、比較とかできるみたい
　今は「DateTools」に統合されてるらしい。
　めっちゃ便利じゃんこれ！
##7.NYXImagesKit
　UIImageの加工ができる拡張らしい。
　これも開発者のモチベがないとある。
　Objective-cのライブラリはこうなってくなろうか？
##8.PEPhotoCropEditor
　画像切り抜き
　仕事で自作してしまった。。。。
##9.PromiseKit
　dispathみたいにpromiseが書ける
##10.PureLayout
　Autolayoutを簡単に書けるようにするやつ
##11.Reachability
　接続状況の管理ができるらしい。
　podにあるけど公式のコード使うのがいいらしい
##12.RMUniversalAlert
　UIAlertViewとAlertViewControllerを１つで書けるらしい。
　今後作るとしたらいろんな関係で8以降でやりたいよ基本。
　これももっと昔に知っていれば仕事で使った。。。
##13.SDWebImage
　いつもの
##14.TPKeyboardAvoiding
　キーボードに次が出るようになる。Collection，Table，Scrollの時らしい
##15.UIActionSheet-Blocks
　BlocksKit
##16.UIAlertController-Blocks
　BlocksKit
##17.UIAlertView-Blocks
　BlocksKit
##18.UIPhotoGallery
　フォトギャラリー
　２年更新されてないし、ググる限り使われる感じも薄い。
　よく見つけたなーこれ
　それとも別のやつ？

|ライブラリ名|pod|git|参考|
|---|---|---|---|
|AFNetworking|◯|[git](https://github.com/AFNetworking/AFNetworking)|いっぱい|
|Crashlytics|◯|[fabric](https://get.fabric.io/)|いっぱい|
|Flurry|◯|[git](https://github.com/flurry/Flurry-iOS-SDK)|[参考URL](http://blog.ideabb.jp/flurry-analytics-iphone-android-app/)|
|MBProgressHUD|◯|[git](https://github.com/matej/MBProgressHUD)||
|nimbus|◯|[git](http://nimbuskit.info/)|[参考URL](http://nimbuskit.info/catalog/)|
|NSDate-RelativeDate|◯|[git](https://github.com/kevinlawler/NSDate-TimeAgo)|[参考URL](http://qiita.com/tototti/items/0b3103c880ef4dee5917)|
|NYXImagesKit|◯|[git](https://github.com/Nyx0uf/NYXImagesKit)|参考URL|
|PEPhotoCropEditor|◯|[git](https://github.com/kishikawakatsumi/PEPhotoCropEditor)|[参考URL](http://blog.kishikawakatsumi.com/entry/20130523/1369245295)|
|PromiseKit|◯|[git](https://github.com/mxcl/PromiseKit)|[参考URL](http://qiita.com/appwatcher/items/7ed4c9da65ad0b53d417)|
|PureLayout|◯|[git](https://github.com/PureLayout/PureLayout)|[参考URL](http://www.masaplabs.com/autolayout-purelayout-swift/)|
|Reachability|◯|[apple](https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html)|[参考URL](http://atmarkplant.com/ios-reachability/)|
|RMUniversalAlert|◯|[git](https://github.com/ryanmaxwell/RMUniversalAlert)||
|SDWebImage|◯|[git](https://github.com/rs/SDWebImage)|いっぱい|
|TPKeyboardAvoiding|◯|[git](https://github.com/michaeltyson/TPKeyboardAvoiding)||
|UIActionSheet-Blocks|◯|[git](https://github.com/zwaldowski/BlocksKit)|いっぱい|
|UIAlertController-Blocks|◯|[git](https://github.com/zwaldowski/BlocksKit)|いっぱい|
|UIAlertView-Blocks|◯|[git](https://github.com/zwaldowski/BlocksKit)|いっぱい|
|UIPhotoGallery|◯|[git](https://github.com/ethan605/UIPhotoGallery)||

間違ってたらゴメンナサイ。ご参考までに

みんなどうやってライブラリー見つけるんだろうなー
今やってるのもとはPodも入ってなかったし、作るので精一杯で調査とかも仕事でできんし
周りからの情報共有ないし、チームもほぼずっと一人だったし。

**わからぬ！**
特にAndroid開発時に知っておきたいSketchExportAssetで画像を綺麗に書き出す為のコツ

#Sketchで画像を書き出す時にこまること

SketchでAndroid向けの画像リソースを全解像度一発でかき出してくれるプラグインのひとつで、「SketchExportAsset」があります。僕はこのプラグインでリソースの書き出しを行っています。
こちらを利用するときにこまる癖と対処方法を紹介します！

#スピカグロースチームにおけるデザインワークフロー
※大前提として弊社ではデザイナーさんがパートタイム1名となってまして各業務チームで融通しているという事情があります。
※デザイナー募集中！Sketchとお好きなPC、キーボード、ペンタブ、Sketch以外にもAdobe等の最新のツールも揃えます！(と書いてあるのでたぶん。詳しくは社長に聞いてくださいw) 下部にwantedlyのリンク張っておきました!

 - 基本的な方向性を考える。
 - 関係者で実装・デザイン方針打ち合わせ
 - ワイヤーをSketchで起こす
 - ワイヤーを関係者で検討
 - ワイヤーをデザイナーさんに回してラフを作成してもらう
 - ラフのレビューを行う
 - デザインの清書
 - 清書されたデザインから書き出し用リソースをまとめ書き出し
 
こんかいは特に最後の書き出し設定について説明します。

デザイン制作はmdpiで行っておくとよいと思います。

#書き出し設定時の流れと綺麗に書き出せない問題

##1.各画面のデザインから書き出し素材のステンシルとなるものを収集してひとつのシートにまとめる。

- 書き出しやすくする
- シンボル化とかやっておく

とかそういうもろもろのためにまとめてます。
 
まとめたシートver1.4.0の時

こちらはシンボル化用
<img width="693" alt="スクリーンショット 2015-12-05 1.26.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/43688/c618dd57-7c09-e70b-4857-1b2a67d924f4.png">

- 結局ボツ案になった灰色と茶色

選択しやすい用にさらに書き出すものだけまとめる
<img width="500" alt="スクリーンショット 2015-12-05 1.26.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/43688/8775ac07-ca78-5be7-36f3-26652a1740be.png">

##2.まとめたパーツ１個毎に書き出したいサイズの透明の四角形を配置してグループ化しておく

ここからが今回の要点です。
パーツのシャドーがoutsideで設定されている場合、アイコン画像単体で書き出しをおこなうと、マークが切れてしまう場合があります。それが原因でずれてるとか、切れている画像が表示されてしまいます。

<img width="91" alt="スクリーンショット 2015-12-05 1.32.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/43688/dfb7f4e1-31d7-32c3-b369-09a8a9f0239a.png">

こんな形で切れてしまう。

<img width="214" alt="スクリーンショット 2015-12-05 1.33.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/43688/04e17ad5-758a-d3c1-2910-87f88aa36e91.png">

このBordersの設定が原因。

<img width="307" alt="スクリーンショット 2015-12-05 1.31.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/43688/c5e3c30a-113f-763e-e6f9-23a79f323458.png">
このように透明の四角形を配置してグループ化しグループを書き出すようにする。

<img width="82" alt="スクリーンショット 2015-12-05 1.31.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/43688/2e0e7c44-8718-d545-8fb9-59d1ea97a99f.png">

綺麗に画像を選択できる。


##3.あとはいつも通りエクスポート

なお、グループ名はandroidでのリソース名にしておくと便利だと思います。

#まとめ
ちょっとした工夫ですが、知らないとイライラするところだと思います！
シンボルやスタイルも綺麗に定義できると再利用も楽だと思います。

[**僕らと一緒に世界で一番つかいやすいネイルアプリをつくってくれるデザイナーさん募集中です！**](https://www.wantedly.com/projects/35772)
[**Androidエンジニアも募集中です！**](https://www.wantedly.com/projects/36262)
Unity Shaderことはじめ３ マンデルブローフラクタル図

Unityでマンデルブローフラクタル図を書いてみた。

UV座標(0〜1)を複素数座標として、複素数座標を使った漸化式の結果が発散なら色を塗るとフラクタル図形がかけるみたい。シェーダーコードみると簡潔でびっくり。

漸化式を変えるといろんな図形になる様子。

フラクタル図形の解説は[ここ](http://yomotsu.net/blog/2014/03/31/fractal.html)

シェーダーはUnlit Shaderを生成して、下記のように記述。
2D描画を確認したいときは、
　UI > Panel
を配置してシェーダーを適用したマテリアルをつけると簡単かも。

```
Shader "Unlit/fractalShader"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
　　　　　　　　　　//フラクタル図形拡大縮小
		_Scale("Scale", Float) = 1.0
	}
	SubShader
	{
		Tags { "RenderType"="Opaque" }
		LOD 100

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};

			struct v2f
			{
				float2 uv : TEXCOORD0;
				float4 vertex : SV_POSITION;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			float _Scale;
			
			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				return o;
			}
			
			//漸化式計算回数。高速化のため途中で繰り返し止める
			static const int LIMIT = 256;
			//色付けのため
			static const float PI = 3.14159265f;
			static const float DEG2RAD = PI/180.f;
			
			//フラグメントシェーダー
			fixed4 frag (v2f i) : SV_Target
			{
				//フラクタル集合であれば黒
				fixed4 col = fixed4(0,0,0,1);
				
				//テクスチャ座標(x,y)を複素数(x, y)とする
				float2 c = i.uv.xy * _Scale;
				
				//いい感じに見えるようずらす
				c *= float2(2.0f,2.0f);
				c -= float2(1.0f,1.0f);
				
				// z1 = z0 + c
				//    =  0 + c
				// z2 = z1 + c
				//    =  c + c
				float2 z = c;
				
				int itr = 0;
				for(itr = 0; itr < LIMIT; itr++)
				{
					// z1 = z0^2 + c
					//    = x^2 - y^2 + 2xyi + c
					z = float2( z.x * z.x - z.y * z.y, 2 * z.x * z.y);
					z += c;
					
					//自ベクトルとの内積 d = |a||a|cos(0) = |a|^2
					//絶対値2を超えると発散=フラクタル集合ではない
					if( dot(z,z) > 4.0f )
					{
						break;
					}
				}
				
				if( itr < LIMIT )
				{
					//発散(フラクタル集合でない座標に色をつける
					col = fixed4(sin(itr*DEG2RAD),
								 _CosTime.x,
								 _SinTime.y*0.5+0.5,
								 1);
				}
				
				return col;
			}
			ENDCG
		}
	}
}
```
Java開発の性能改善！ その１ jstatによるヒープ/GCの確認

JavaのWeb開発の開発後期になると性能試験や負荷試験を実施することになると思いますが、

そのフェーズになると色々な問題が起こることが多い。

今まで起きた問題と調査・解決方法をいくつかの回に分けて紹介しようと思います。

まずはメモリリーク。

長時間サーバを起動して運用していたり、負荷試験を実施するとメモリリークを起こすことがある。


# ガベージコレクションのおさらい

Javaのヒープは大きくnew領域(young領域)とold領域に分かれます。

new領域には生成されてすぐのオブジェクトが格納されてマイナーGCにて未使用になった際に開放されます。

マイナーGCを何度も繰り返されても開放されない(長く参照されている)オブジェクトは

old領域へと移動され、こちらはメジャーGC(フルGC)で開放されます。(メジャーGCはnewとperm領域も開放。)

もう少し細かく説明すると・・・

![GC.png](https://qiita-image-store.s3.amazonaws.com/0/102999/35db2e3b-5aa9-a4b1-4136-267033e0493e.png)


new領域はeden、from、toに分かれます。

生まれたてのオブジェクトはedenに格納。

メジャーGC発生の際にまだ参照されている(生きている)オブジェクトは

eden領域からfrom領域へ移されます。

次のGCの際にfromにあったオブジェクトがまだ生きていたらto領域へ移されます。

厳密にはedenからtoへ移動、次のGCの際にfromとtoの名前が逆転するので

fromからtoへ移動・・・さらに次でまた逆転してfromからtoへ・・・という感じ。

from⇔toの移動が規定回数(デフォルト32回)繰り返したらold領域へ移動させられます。


マイナーGCに比べるとメジャーGCはコストがかかります。

GCは全スレッド停止(Stop the world)ことがあり、その間はプログラムも停止します。

なので頻繁なGCは避けたいし、GCで適切にヒープが開放されるかを気にする必要があります。

※パラレルGC、コンカレントGCなどなるべくコストをかけない仕組みもありますが、
　この辺りはググって下さい。


# jstatコマンドでヒープの利用状況やGCの頻度を確認

GCやヒープの状況を調べる方法は色々あるけど

まずはjstatで手軽に調べる方法を取ります。


- 対象のプロセスの特定

```
 jps -v | less -SN

```

![jps.png](https://qiita-image-store.s3.amazonaws.com/0/102999/0e1d9b3f-6302-9bd9-a0b2-767a3a74efd7.png)

jpsコマンドはjavaのプロセスを確認するコマンドです。jdkのbinをpathに通しておけば実行可能。

-vオプションをつけると起動オプションを表示されるのでサーバに複数のインスタンス(JVM)を

立ち上げている場合などはこれで対象を特定してプロセスIDを特定しておきましょう。

- jstatの実行

```

jstat -gcutil -h3 708 1000


```

jstat -gcutilでヒープやGCの状態をリアルタイムで確認できます。

-h3は３行ごとにヘッダを表示、

708はプロセスIDなので環境に応じたプロセスIDを指定してください。

最後の1000は１秒ごとに監視する(行を増やす)という意味です。

-gcoldに変更するとold領域に関してもう少し詳細な情報が表示されます。

![jstat.png](https://qiita-image-store.s3.amazonaws.com/0/102999/2644e56b-b38c-ff9a-9875-6ee0f339f4fc.png)

ヘッダがEの列がnew領域のメモリ使用率。

new領域なのでどんどん増えてはマイナーGCが発生して減って・・・を繰り返します。

YGCがマイナーGCの実施回数なのでこれのカウントアップと同時にnew領域の使用率が減るのが正常になります。

Oの列がold領域、FGCがメジャーCGの回数になります。

new領域が全然下がらず100に張り付きっぱなしになって、OutOfMemoryErrorが起きる場合は

どこかでいっきにオブジェクトを生成しているので処理を見直すか、

ヒープ(new領域)のサイズを増やす必要があるかなと。

また、マイナーGCを繰り返してold領域が増えていきメジャーGCが頻発する・・・

場合はメモリリークの疑いやnew領域のサイズまたはプログラムが適切ではない可能性があります。

old領域がなかなか開放されない場合もいずれOutOfMemoryErrorを起こす可能性があります。



今回はここまで。

次回はGCログから見るヒープの開放率やGC時間についてを予定しています。

その後はメモリダンプやスレッド滞留時の調査方法などなど。

- [Java開発の性能改善！ その１ jstatによるヒープ/GCの確認](http://qiita.com/i_matsui/items/4997ebedbdd7a6495509 "Java開発の性能改善！ その１ jstatによるヒープ/GCの確認")
- [Java開発の性能改善！ その２ GCログの解析とHeepの設定](http://qiita.com/i_matsui/items/aabbdaa169c6ae51ecb3 "Java開発の性能改善！ その２ GCログの解析とHeepの設定")
- [Java開発の性能改善！ その３ ヒープダンプを取ろう](http://qiita.com/i_matsui/items/0d1ae2c7e9d17b6c04e0 "Java開発の性能改善！ その３ ヒープダンプを取ろう")
Gitのチートシートを git ? で呼び出すコマンドを作ると作業が捗る


CLIでGit のコマンドやオプションを覚えれば、いろんな所で潰しが効きます。しかし、やりたい事がハッキリしているのに、コマンドが出てこない時、ありません？

いちいち調べるのはバカらしいし、エイリアスにすると他で潰しが効きづらくなるし、SourceTree などのGUIに逃げるのは、なんか負けた気がする……。

そこで、**"`git ?`と打ち込んだら、自分用のチートシートが出てくる Git のサブコマンドを書く"** ことにしたのですが、これが意外と捗るのでご紹介します。

## "git ?" の作り方

Git では、パスの通った所に `git-{コマンド}` という名前で実行ファイルを置くと、サブコマンドを独自に作ることができます。

試しに `git ?` コマンドを作ってみましょう。

```bash:コマンド作成
# $PATHを確認
$ echo $PATH

# パスの通った所に git-? を作成 (例: /usr/local/bin/)
$ sudo vi /usr/local/bin/git-?
```

```sh:/usr/local/bin/git-?
#!/bin/sh
cat ~/.git-cheatsheet
```

```bash
# 実行権限を付けておく
$ sudo chmod +x /usr/local/bin/git-?
$ git ?
cat: ~/.git-cheatsheet: そのようなファイルやディレクトリはありません
```

これでコマンドの準備はできました。
あとは `~/.git-cheatsheet` にチートシートの内容を書いていくだけ！

### チートシートの例

例えば私は始め、Gitに慣れるために 以下のような感じのチートシートを用意しました。

```text:.git-cheatsheet
---
Git cheatsheet
---
[基本]
* git init                      リポジトリを作成
* git checkout (branch)         ブランチを切り替え
* git branch (new_branch)       新規ブランチを作成
* git checkout -b (new_branch)  新規ブランチを作成して切り替え
* git add (file)                ファイルをインデックスに追加
* git add .                     現在のディレクトリ以下をインデックスに追加
* git commit                    ファイルをコミット
* git commit -m "message"       メッセージを指定してコミット
* git commit --amend            直前のコミットメッセージを修正

[stash]
* git stash save                スタッシュに一時的に保存
* git stash save -u             untrack なファイルも含めてスタッシュに保存
* git stash pop                 スタッシュから取り出し
```

作業中に Git でちょっと困ったら `git ?` を叩き、コマンドをカンニングするという訳です。もし新しいコマンドを覚えたくなったら、このチートシートに追記すればOK。

今でも `branch` と `checkout -b` のように、"似たような事なのに、コマンドが違う" という時なんかは、なかなか重宝します。

ちなみに私のカンペは、時間が経つにつれてコマンドが増えていき、現在では Git flow や、`prune`、`update-index` のような込み入ったコマンドも入ってます。学んでいくと共に、チートシートも進化しますね。

#### invalid key エラーが出る場合

```
error: invalid key: pager.?
```

環境によっては、チートシートの表示前に上記のエラーが出てくることがあります。手元では、Gitのバージョンによって出たり出なかったりしてました (例: 2.4.5 →出る、2.6.2 →出ない) 。

恐らく、設定を読み込む際に `?` 記号を解釈できるか否かに依るものかと思いますが、これのエラーが出てもチートシートが見られない訳じゃないので、「Gitのパージョンを変えてみる」「気にしない」などが解決策でしょうか。(ぇ

## 利点

かれこれ1年半ほど使ってますが、

- 初心者から上級者まで、幅広くカンタンに使える
- 迷ったら `git ?` と打つだけなので、覚えやすくお手軽 (深い話は `--help` で見る)
- 調べる手間が省け、作業がより捗る
- **コマンドを学んでいる実感がある**

自分専用のチートシートを書くのは正直手間ですが、**"チートシート ＝ コマンドの意味を学習するノート""**という位置づけでやってみると、結構効果があります。

よって、特に Git 初心者にはオススメです。小慣れてきて、`git ?` を叩く頻度が減ってきたら 一人前とか。
iTunes ディレクトリ（アーティスト一覧）

こんにちは
iTunes ディレクトリ（下記）内には、アーティスト毎のサブディレクトリが並んでいるようなので、一覧表示してみました。

```console
$ ls ~/Music/iTunes/iTunes\ Media/Music  | ruby -pe '$_.gsub!(/\s{0,1}(_|,|;|-|&)\s/, "\n")' |sort|uniq
Karl Böhm
Karl Leister
Karl Richter
Karl Suske
```

ただし、Compilations 内のアーティストは表示されません。
Unityで半円柱のMeshを生成するコード

自分用メモ

半円柱のColliderとか作りたい時用。
これで作ったMeshをMeshColliderに設定してあげると、半円状のColliderを作れます。

境界条件などは厳密にテストしておらずバグが確実にあるので、使用する場合は自己責任で


```csharp
using UnityEngine;
using System.Collections;

public class SemiCircularColumnMeshFactory{
        // 360度の時の、円周の頂点数
	const int MaxPerimeterVertexCount = 20;

	/// <summary>
	/// y軸方向の半円柱のMeshを生成する
	/// </summary>
	/// <returns>Mesh</returns>
	/// <param name="angle">扇の角度</param>
	/// <param name="height">半円柱の高さ</param>
	public static Mesh CreateMesh(float angle,float height) {

		if(angle < 0){
			angle = -angle;
		}
		angle = angle % 360;

		var perimeterVertexCount = (int)( (angle - 0.1f) / (360 / MaxPerimeterVertexCount)) + 2;

		// 頂点計算
		Vector3[] vertices = new Vector3[perimeterVertexCount * 2 + 2];

		var halfHeight = height / 2;

		var currentRadian = -angle / 2 * Mathf.Deg2Rad;
		var deltaRadian = (360 / MaxPerimeterVertexCount)* Mathf.Deg2Rad;

		vertices [0] = new Vector3 (0, halfHeight, 0);
		vertices [perimeterVertexCount + 1] = new Vector3 (0, -halfHeight, 0);

		for(int i = 1;i < perimeterVertexCount;i ++){
			vertices[i] = new Vector3(Mathf.Sin(currentRadian) ,halfHeight,Mathf.Cos(currentRadian));
			vertices[i + perimeterVertexCount + 1] = new Vector3(Mathf.Sin(currentRadian) ,-halfHeight,Mathf.Cos(currentRadian));
			currentRadian += deltaRadian;
		}
		
		vertices[perimeterVertexCount] = new Vector3(Mathf.Sin(angle / 2 * Mathf.Deg2Rad) ,halfHeight,Mathf.Cos(angle / 2 * Mathf.Deg2Rad));
		vertices[perimeterVertexCount * 2 + 1] = new Vector3(Mathf.Sin(angle / 2 * Mathf.Deg2Rad) ,-halfHeight,Mathf.Cos(angle / 2 * Mathf.Deg2Rad));

		var pvc = perimeterVertexCount;

		int fanCount = perimeterVertexCount - 1;
		int offset;
		int[] triangles = new int[ (fanCount * 4 + 4) * 3];
		for (int i = 0; i < perimeterVertexCount - 1; i++) {
			// 上面
			triangles[i * 3] = 0;
			triangles[i * 3 + 1] = i + 1;
			triangles[i * 3 + 2] = i + 2;
			// 底面
			offset = fanCount * 3;
			triangles[offset + i * 3] = pvc + 1;
			triangles[offset + i * 3 + 1] = pvc + 1 + i + 2;
			triangles[offset + i * 3 + 2] = pvc + 1 + i + 1;
			// 円周面1
			offset = fanCount * 3 * 2;
			triangles[offset + i * 3] = i + 2;
			triangles[offset + i * 3 + 1] = i + 1;
			triangles[offset + i * 3 + 2] = pvc + 1 + i + 1;
			// 円周面2
			offset = fanCount * 3 * 3;
			triangles[offset + i * 3] = i + 2;
			triangles[offset + i * 3 + 1] = pvc + 1 + i + 1;
			triangles[offset + i * 3 + 2] = pvc + 1 + i + 2;
		}
		// 側面
		offset = fanCount * 3 * 4;
		triangles [offset] = 1;
		triangles [offset + 1] = 0;
		triangles [offset + 2] = pvc + 1;
		
		triangles [offset + 3] = 1;
		triangles [offset + 4] = pvc + 1;
		triangles [offset + 5] = pvc + 2;
		
		triangles [offset + 6] = 0;
		triangles [offset + 7] = pvc;
		triangles [offset + 8] = pvc + 1;
		
		triangles [offset + 9] = pvc + 1;
		triangles [offset + 10] = pvc;
		triangles [offset + 11] = pvc * 2 + 1;


		Mesh mesh = new Mesh ();
		mesh.name = "SemiCircleCylinder(" + angle + ")";
		mesh.vertices = vertices;
		mesh.triangles = triangles;


		return mesh;

	}



}

```
エンジニアでもきれいなFormが書きたいの(｀･ω･´)

# エンジニアでもきれいなFormが書きたいの(｀･ω･´)

css？もちろん不得意ですよ。
でも、bootstrap使えばきれいになるらしいじゃないですかー。
じゃあ、使ってみようで使ってみた感じのまとめです。

## bootstrapってなに？
> BootstrapはWebサイトやWebアプリケーションを作成するフリーソフトウェアツール集である。 タイポグラフィ、フォーム、ボタン、ナビゲーション、その他構成要素やJavaScript用拡張などがHTML及びCSSベースのデザインテンプレートとして用意されている。
https://ja.wikipedia.org/wiki/Bootstrap

デザインのライブラリっていう感じ？
使ってから考えますかー。

## 実際使ってみた
RailsだとGemfileで簡単に入れられた。
↓書いてbundle installでOK！

```lang:Gemfile
source 'https://rubygems.org'
gem 'rails',                '4.2.2'
gem 'bootstrap-sass',       '3.2.0.0' #これ書けばOK
```

bootstrapを使う設定はscssに書いちゃえばOK

```lang:application.css.scss
@import "bootstrap-sprockets";
@import "bootstrap";
```

##### bootstrap入れる前
https://peaceful-ocean-4562.herokuapp.com/

##### bootstrap入れた後（細かい部分はcssで調整してあります）
https://frozen-dusk-4528.herokuapp.com/

整ったー、なんかすげー

## :squirrel: まとめ
結論、よくわかんない！
きれいになるけど、結局cssわかんないと辛い！

#### 詰まった点とか困った点とか
- クラスがわからん
  - ライブラリ化されてるから、ドキュメントなりサンプルないとどのクラスがどういうものなのかぱっとわからない。
- 微調整したいときが難しい
  - サンプルみつつ書いてみたものの、思った挙動にならないことがあってどれが影響してるのかっていうのかわからない。

## おまけ
bootstrapにすべて黄金比に整えてくれるやつがありますよー
是非とも使ってみてくださいー
http://www.goldbootstrap.com/
SwipeRefreshLayoutの注意点

[Gaiax Advent Calendar](http://qiita.com/advent-calendar/2015/gaiax) 6日目のエントリーです。１枠余っているということで急遽書くことになったので小ネタで失礼します。

## はじめに
AndroidではPull to RefreshのUIを実現するために、SwipeRefreshLayoutというViewコンポーネントが準備されています。

基本的な使い方については、こちらの記事が参考になります。
[SwipeRefreshLayout覚え書き](http://qiita.com/nein37/items/c9ae7c8e3489b1276c14)

SwipeRefreshLayoutはシンプルな機能ですが、配置によっては不可解な動きをするので、２点ほど注意点を紹介したいと思います。

## 1. SwipeRefreshLayoutの子要素を１つにする
以下のように SwipeRefreshLayout に複数の要素を入れた場合、２つめ以降の要素は表示されなくなります。
特にエラーも表示されないので、注意が必要です。

```
<SwipeRefreshLayout>
   <RecyclerView></RecyclerView>
   <TextView/>                         <--- 表示されない
</SwipeRefreshLayout>
```

そこで、LinearLayoutで囲って、SwipeRefreshLayoutの子要素が１つになるようにしてみます。

```
<SwipeRefreshLayout>
   <LinearLayout>
     <RecyclerView></RecyclerView>
     <TextView/>
   </LinearLayout>
</SwipeRefreshLayout>
```

一見これで動作するのですが、実は問題が発生します。リストをスクロールダウンして、元に戻るためにスクロールアップした時に誤ってリフレッシュされてしまいます。

## 2. スクロールするViewは極力SwipeRefreshLayoutの子要素にする
この問題が発生しないようにするためには、RecyclerViewをSwipeRefreshLayoutの直接の子要素になるように配置して、入れ子を組み替えます。

```
<LinearLayout>
  <SwipeRefreshLayout>
     <RecyclerView></RecyclerView>
  </SwipeRefreshLayout>
  <TextView/>
</LinearLayout>
```

こうすることで、スクロールアップしても最上部までいかないとリフレッシュされません。RecyclerViewがListViewやScrollViewの場合も同様です。

SwipeRefreshLayoutのサンプルではSwipeRefreshLayoutがルート要素にされていることが多いですが、確認した範囲ではSwipeRefreshLayoutに親要素があっても、兄弟要素があっても問題なく動作していました。

どうしてもレイアウトの要件上入れ子の組み換えで対応できない場合は、canChildScrollUpをオーバーライドして対応しましょう。
[SwipeRefreshLayout を上方向にスクロールできない](http://mizoguche.info/2015/03/swiperefreshlayout_scroll_up_not_work/)
vmware converter 5.5でCentOS7のP2Vに失敗する

vmware converter 5.5でCentOS7の物理サーバーをvSphere上に移行（変換）しようとしたところ、
どうしても「event.UnixP2VDiskPartitionFailedEvent.summary」のエラーが出てしまう。

LVMのボリュームをBasicに変更する設定が必要という情報もあったので、その情報に従ってやってもダメだった。

Source（変換元）のDisk情報を見てみるとファイルシステムがxfsになっていた。
もしかしたら？と思ってconverter 5.5のマニュアルを見てみると

>For FAT, FAT32, NTFS, ext2, ext3, ext4, and ReiserFS file systems,
Converter Standalone preserves the file system type during a volume-based
cloning at the file level.

xfsはまだサポートされていない。
そこで6.0をダウンロードしてconverter 6.0のマニュアルを見てみると

>For FAT, FAT32, NTFS, ext2, ext3, ext4, XFS, and ReiserFS file systems,
Converter Standalone preserves the file system type during a volume-based
cloning at the file level

xfsがサポートされていました。
というわけで、CentOS7が悪いわけではありませんが、CentOS7はxfsになっているかも？という所をチェックするといいかもしれない。
特定ホスト に対する HTTP リクエスト・レスポンスをコピーする proxy 類似 HTTPサーバ

特定ホストしか使えないので、http proxy ではない何か
Web API の、API Base を変えて遊ぶときに使えるかも (https の通信内容を見るよりは容易?)
以下の例では、mackerel.io の mackerel-agent で `apibase = "http://localhost:4567"` という設定をするとそのまま使える

```rb
require 'sinatra'
require 'net/http'
require 'uri'
require 'pathname'
require 'logger'
require 'pp'

mackerel = 'https://mackerel.io'
mackerel_url = URI.parse(mackerel)

logdir = Pathname.new(__FILE__).parent + 'log'
logdir.directory? || logdir.mkpath
logfile = logdir + Time.now.strftime('%Y-%m-%d')
logio = logfile.open('a')
logger = Logger.new(logio)

[:get, :post, :delete, :patch, :put, :head, :options].each do |method|
  send method, '*' do
    path_with_query = request.env['REQUEST_PATH']
    if request.env['rack.request.query_string'] && request.env['rack.request.query_string'] != ''
      path_with_query << '?' + request.env['rack.request.query_string']
    end

    server_req = Net::HTTP.const_get(request.env['REQUEST_METHOD'].downcase.capitalize).new(path_with_query)
    if body = env["rack.input"].gets
      server_req.body = body

      if request.env['CONTENT_TYPE'] = 'application/json'
        logger << [Time.now.strftime('%Y-%m-%d %H:%M:%S'), path_with_query, body].join("\t")
        logio.flush
      end
    end

    http_headers = request.env.select { |k, v| k.start_with?('HTTP_') }
    headers = http_headers.inject({}) do |a, (k, v)|
      a[k.sub(/^HTTP_/, "").downcase.gsub(/(^|_)\w/) { |word| word.upcase }.gsub("_", "-") ] = v
      a
    end
    headers.each do |key, val|
      server_req.add_field(key, val)
    end

    # special Header
    server_req['HOST'] = mackerel_url.host
    server_req['Content-Type'] = request.env['CONTENT_TYPE']

    http = Net::HTTP.new(mackerel_url.host, mackerel_url.port)
    if mackerel_url.scheme == 'https'
      http.use_ssl = true
    end

    server_resp = nil
    http.start do |h|
      server_resp = h.request(server_req)
    end

    server_resp.each do |key, val|
      response[key] = val
    end
    response.header.delete('content-length')

    status server_resp.code
    return server_resp.body
  end
end
```
NEURON導入ー中編:モデルのサイズ設定と作業の保存方法ー

中編


中編は前回の作業に続き，神経細胞のモデルのサイズ設定をします．

1.CellBuild->Geometryを選択します．
Geometryは各セクションの実際の大きさや詳細さの尺度を設定する場所です．設定の前に「Specify Strategy」の横のBoxにチェックを入れておきます．
2.「all」を選択し，「Spatial Grid」のリストにある「d_lambda」にチェックを入れます．
3.「soma」と「apical」，「basilar」，「axon」を選択し，「Constant value over subset」のリストにある「L」(コンパートメントの長さ)，「diam」(コンパートメントの直径)にチェックを入れます．
4.各項目を選択し終わったら，「Specify Strategy」のチェックを外して変数の値を設定する画面にします．それぞれに設定されている値は，各変数の持つ値でありユーザーが変更できるようになっています．
5.「soma」は「L」=「30」(μm)，「diam」=「30」(μm)に設定しなおします．somaは球形に近いと考えることができるためです．
6.「apical」は「L」=「600」，「diam」=「1」,「basilar」は「L」=「200」，「diam」=「2」,「axon」は「L」=「1000」，「diam」=「1」にそれぞれ設定します．
※上の代入値は下記のサイトを参考にしました.
http://www.nips.ac.jp/huinfo/documents/python/python03.html
7.次に，CellBuild->Biophysicsを選択します．
Biophysicsは生物物理的な細胞膜と細胞質の性質をサブセットや個々のコンパートメントに対して設定する場所です．設定の前にGeometry同様に「Specify Strategy」にチェックを入れておきます．
8.「all」のリストのうちの「Ra」と「cm」のボックス，「has_HH」のリストのうちの「hh」のボックス，「no_HH」のリストのうちの「pas」のボックスにそれぞれチェックを入れます．
9.各項目を選択し終わったら，Specify Strategy」のチェックを外して変数の値を設定する画面にします．Geometry同様に，それぞれに設定されている値は，各変数の持つ値でありユーザーが変更できるようになっています．
10.「all」の「Ra」を「100」(Ωcm)，「no_HH」の「g_pas」を「0.0002」(mho/cm2)，「e_pas」を「-65」(mV)に設定する．


以上でモデルのサイズ設定が完了します．


前回と今回で作成したモデルや今後行う作業内容は，session fileとして保存することができます．
NEURON Main Menu->File->save sessionを選択し，「(ファイル名).ses」の記述でsaveをクリックすると任意のフォルダに保存されます．

今回はここまでです．
趣味プログラマーのAnsible活用


Ansibleは仕事ではあまり使っておらず、どちらかと言えば趣味の領域です。
いまでは、Ansibleを関心のあるソフトウェアのインストールと起動確認に使用しています。

私のような趣味プログラマーがソフトウェアを構築していると次のような問題に直面します。

+ 週末や月一などでやっていると前回どこまで構築したか忘れていることがある。
+ 設定で躓いたところをEvernoteなどにメモしても、同じところで躓きがちになる。
+ よって、バージョンアップへの追随が段々と億劫になって一度作って終わりになりがちになる。

Ansibleに限った話ではありませんが、コード化しておくとこれらの点が解消されます。

+ 前回どこまで構築出来ていたかはコードやDiffを見れば分かる。
+ 設定で躓いたところはコード化されている。
+ バージョンアップに追随しやすい。  

さらに、GithubやCircleCI/Werckerを連携させることで、インストールと起動確認を自動化できます。

個人的にこれらがうまく行っているのは[ansible-Redmine](https://github.com/volanja/ansible-Redmine)です。
Redmineのバージョンはplaybook内に変数として書いています。
変数を変更してGithubへpushすると、数分後にはCircleCI/Wercker上でインストール確認までできているので、追随確認も簡単です。

なお、[ansible-Redmine](https://github.com/volanja/ansible-Redmine)では次の順序で進んでいきます。

1. AnsibleのPlaybookはGithubで管理
+ Githubにpushすると、Wecker/CircleCI上でDockerを起動
+ Dockerに対してAnsibleのPlaybookを実行して構築
+ Dockerに対してServerspecを実行して構築できたことを確認
+ (Webアプリなので)Dockerに対してInfratasterを実行してWeb画面が表示されることを確認


----

特別Ansibleの話でなくとも良かった気がしますが、趣味でもこのような形でAnsibleが活用ができるというお話でした。
A*の理論モチョットデキル - 無矛盾なヒューリスティクス

許容的なヒューリスティクスよりも少し強い仮定として、 **無矛盾** なヒューリスティクスというクラスのヒューリスティクスがあります。Consistentの訳ですが、Monotonicとも呼ばれるので、 **単調な** ヒューリスティックと訳してもいいのかもしれません。しかし、その意味するところは **無矛盾** のほうがわかりやすいかもしれません。個人的には、Consistencyの訳は 「一貫した」とか、「整合性」とか、いうのもあり得ると思うのですが、AIMAの日本語訳でこの訳が用いられているので、このバージョンを用います。

*無矛盾でない* (inconsistent) ヒューリスティクスを人間で例えると、**言うことがコロコロ変わる信頼の置けない奴**という意味です。ここを実感していただくために、まず、無矛盾なヒューリスティクスの定義と「単調」の意味を示して、それから「無矛盾」の意味を解説します。

# 「無矛盾」なヒューリスティクス : Consistent / Monotonic heuristics

Consistency of a heuristics $h$:

+ $\forall n \in V ; \forall m \in children(n) ;$
    + $h(n) \leq cost(n,m) + h(m)$

無矛盾なhは常に許容的です。証明は以下:

$n_0, n_1, ... n_g=v_g$ として、

+ $h(n_0) \leq cost(n_0,n_1) + h(n_1)$
+ $h(n_1) \leq cost(n_1,n_2) + h(n_2)$
+ ...
+ $h(n_{g-1}) \leq cost(n_{g-1},n_g) + h(n_g) = cost(n_{g-1},n_g) + 0$
+ $\therefore h(n_0) \leq \sum_{j=0}^{j=g-1} cost(n_j,n_{j+1}) = h^*(n_0)$

無矛盾性の意味するのは、最適経路の上でf値を計算した場合に、f値が単調増加してゆくということです。なぜなら

+ $h(n) \leq cost(n,m) + h(m)$
+ $g(n)+h(n) \leq g(n)+cost(n,m) + h(m)$
+ $g(n)+h(n) \leq g(m) + h(m)$
+ $f(n) \leq f(m)$

無矛盾性の意味するもうひとつのことは、このヒューリスティック関数が三角不等式を満たすということです。$h(n)$がゴールまでの距離だったことを思い出してください。これを、距離関数$dist(n_1,n_2)$、つまり引数を2つとる関数で表せば、$h(n)=dist(n,v_g), h(m)=dist(m,v_g)$ ですから、

+ $dist(n,v_g) \leq dist(n,m) + dist(m,v_g)$

となります。$cost(n,m)$が$dist(n,m)$である点にも気づけると思います。

# 近道があるのに教えてくれない

無矛盾でないヒューリスティクスを人間で例えると、**言うことがコロコロ変わる信頼の置けない奴**という意味です。f値が単調増加しないということは、つまり減る場合があるわけですが、要するに **実は近道があるのに隠して教えてくれない** ようなやつです。

![inconsistent](https://www.dropbox.com/s/m09o9b5wy99i6zq/inconsistent.png?raw=1)

無矛盾性は、A*の終了条件に実は大切な意味を持ちます。
仮に無矛盾でないヒューリスティック $h$ を用いるとします(そういうヒューリスティックはいっぱいあります)。すると、次のように意地悪に設計したグラフでは、最大 $O(2^N)$ 回も、同じノードをreopenする必要が出てきます。(reopen = $g$の値を更新してノードをOPENに再挿入する動作。Dijkstraの記事を参照) ここで、$N$の数はノードの総数、下の図のノードに書いてある数字はhの値、辺に書いてある数字は辺のコストです。(Martelli, 1977)これは、いわばA*を騙して騙して騙しまくることに特化したようなシチュエーションだと言えるでしょう。もしも自分の問題のために書いたA*が、許容的にも関わらず異常にに遅い場合は、それがconsistentかどうかを調べてみてください。

![martelli.png](https://qiita-image-store.s3.amazonaws.com/0/6090/d41adf84-8598-8cbc-a255-d9c71143b3db.png)

(図: Robert C. Holte, Common Misconceptions Concerning Heuristic Search (SoCS 2010) より。)

このお話の続きは、B と PathMaxの時にやります。Bは、このような条件で$O(n^2)$の展開しか行いません。ただし、Bはあまり実用には使われていません。
A*の理論チョットデキル - 許容性と実用性

[Edit] すみません、タグをつけ忘れていると自動投稿されないようです! 予約投稿で書き溜めてあるので、今後は気をつけて自動で公開されるようにします。

この記事では、Pearl (1984), AIMA 3rd ed. (2011) にならって、A*のより詳しい性質を少し紹介します。

前回チラリと触れたのは、$h$に関するdominanceやperfect heuristicsの議論です。前回話していなかったのですが、$h$の性質はA*にとって重要です。

# ヒューリスティクスの許容性 Admissibility

Admissibility とは、べつにヒューリスティクスの懐が深いとか、ロバストだとか、そういうことではありません。まあいわば、そのヒューリスティクスが人間にとって「許せるほど正確か」という意味です。許容性の定義は以下のとおり:

*Admissibility of h*:

* $\forall n \in V ; \quad 0 \leq h(n) \leq h^*(n)$

つまり、真のコスト h* を **控えめに見積もる(underestimate)** ような h は許容的なヒューリスティクスです。許容的なhを用いる限り、A*は__常に最適解__を返します。

前回用いた、地図におけるユークリッド距離ヒューリスティクス$h_e=||v_g-n||_2$は許容的です。三角不等式を用いて、hがh*を下回ることを証明したことを再確認してください。

## なんだ、じゃあ地図の探索問題なんて終わったも同然じゃん

勘違いしてはいけないのは、1つのグラフ探索問題のクラスについて、許容的なヒューリスティクスは1つではないということです。例えば、

+ 全ての非負コストグラフ探索問題において、 blind heuristics $h_0=0$ は許容的。
+ 地図において、 x座標の差の絶対値 $h_x=|v_{gx}-n_x|$ は許容的。
+ 地図において、 y座標の差の絶対値 $h_y=|v_{gy}-n_y|$ は許容的。
+ 地図において、 $h_{xy}=\max{(h_x,h_y)}$ は許容的。

この場合、 $h_0 \leq h_x \leq h_{xy} \leq h_e$ というdominance relationship があります。

もしかすると、ユークリッド距離よりも正確な見積りの出来るヒューリスティクスがあるかもしれませんよ。(実は、実際の実装は知らないものの、そういうものは**考えられます**。詳細は二日後)

## じゃあ、**実用においても** より正確なhをいつも使うのがいいんだよね?

じつはこれも正しくありません。なぜなら、正確なヒューリスティクスは計算に時間がかかるからです。
比較的小さいグラフなら、blind heuristics、つまりダイクストラ法が一番早い場合もあります。ただし、それは大規模な問題を解くことは出来ません。

## 非許容的なヒューリスティクスは使えない?

いえいえそんなことはありません。例えば:

+ 地図において、マンハッタン距離 $h_{man}=||v_g-n||_1=h_x+h_y$ は非許容的。

ですが、__解の最適性がそこまで重要でない問題ならば__、これらの関数も使うことが出来ます。なぜなら、これらは__ある程度__信頼できる見積もり値を与えてくれるので、最適ではないにせよ何らかの経路を返してくれるからです。

![inadmissible.png](https://qiita-image-store.s3.amazonaws.com/0/6090/d8a6c5e6-114b-5ae2-c0f1-697d7baddb28.png)


また、非許容的なヒューリスティクスには、過度な単純化により計算負荷が低いものがあります。例えば上のマンハッタン距離は、sqrtが必要になるユークリッド距離よりも計算が軽いです。


# まとめ

A*の性質にまつわる基礎的な話をしました まる
kintoneをAWS Lambdaでバッチ処理してみました（はじめてのキントーン)

# 免責
本投稿は、個人の意見で、所属する企業や団体は関係ありません。

# 対象
はじめてkintone / AWS Lambdaを触る方に向けのレベルです。

# 前提 & はじめに
IoTハンズオンで使われたkintoneデータがあったので、集計処理をしてみるlambdaを作ってみます。私の前提ですが、
・初めてkintoneを触ります
・nodejs初めて書きます(Lambda用)
・Qiitaへの投稿も初めてです
という状態、かつ、残り時間1日しかないぎりぎりでやってました（汗

# 狙い
Lambdaのスケジュールイベントでバッチ処理ができるようになったので、データ統計を日/月で統計データが作れるかなといった感じです。
IoTのデータベースで正規化しにくいDBだったのでレポート作成してみようと思った次第。

IoTの話は、ToshiakiEnamiの[このあたりの記事](http://qiita.com/ToshiakiEnami/items/c3b5b87a148a2fcf5ee4)をご参照ください。

#構成
やっぱりサーバレスでやりたいですよね！
Lambdaのみです。
![イメージ.JPG](https://qiita-image-store.s3.amazonaws.com/0/100893/167a8917-83d6-7f31-a39b-8cda1a07e625.jpeg)


元のデータ
多くのセンサー(ハンズオン受講者数分)とセンサータイプ(気温と湿度)、値、作成日時があります。

![data-source.JPG](https://qiita-image-store.s3.amazonaws.com/0/100893/a9b358fe-8ded-e38b-35fd-7f9d37e14ac6.jpeg)

# LambdaでkintoneAPI
一括のレコード取得方法、まずはまりました。　
テストで一件取得をやったがために、URIの違いに気が付かず。。

    url: "https://" + YOURDOMAIN + ".cybozu.com/k/v1/record.json",
    url: "https://" + YOURDOMAIN + ".cybozu.com/k/v1/records.json",

複数件取得の場合、record.json -> record[s].jsonに変わる。なまじ一件が動いてしまい、はげるほど悩む。。
queryパターンで日付などはkintoneのAPI側で関数が用意されています。便利。
kintone API getについては[こちら](https://cybozudev.zendesk.com/hc/ja/articles/202331474-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%8F%96%E5%BE%97-GET-)

今回の取得クエリ例

        request({
                method: 'GET',
                url: "https://" + YOURDOMAIN + ".cybozu.com/k/v1/records.json",
                headers: {
                        'X-Cybozu-Authorization': 'hoge',
                        'Authorization': 'Basic hoge',
                        'Content-Type': 'application/json'
                },
                json: {
                        'app': APP_ID,
                        'query': 'SensorType = ' KIND '
                        'fields': ['DeviceID', 'Value', 'Datetime']
                }

一括取得時には制限にお気を付けください。上記kintone apiより抜粋

    一度に取得できるレコードは 500件までです。
    リクエスト時にクエリで指定できる fields の添字は、0~99の範囲になります。
    リクエスト時にボディで指定できる fields数は 1000個までです。



# Lambda zip　ケアレスミス
nodejsはzip圧縮でLambdaへ。ここでもZipの方法を間違えて悩む。
スクラッチからLambdaの利用でど忘れでした。

開発環境
kintone 
├── main.js
└── node_modules
としてましたが、 kintoneの階層から zipしたために、module not found。ありがちですので、皆様気を付けてー
正しくは、 kintoneディレクトリで

zip -r kintone.zip main.js node_modules

としてzipファイル配下はフラットな構造である必要があります。

コード自体は、データソースに対して一括GET取得し、reportスペースにGETで登録とシンプルなコードです。
ここまででコードを書くのと、はまるのを含めて3時間ちょい位です。
非常に簡単です。

#Lambdaスケジューラーの設定例 
 毎日時刻1:00(JST)に起動する例
cron(0 16 * * ? *)
![schedule.JPG](https://qiita-image-store.s3.amazonaws.com/0/100893/668d8071-effc-8311-9cdd-9d90d57f7a69.jpeg)


# 振り返り
データ取得、投入は比較的容易にできました！
個人的には投入したデータをAPIでグラフ化、出力までできるようになると運用レポートが自動作成できていいのではないかなと思いました。
見落としていたらすみません、なのですが、グラフ作成、出力のAPIが欲しいですー


# 本当にやりたかったこと
時間があればデータは一度S3にputして、再度 Lambda起動後にreportスペースに入れたかったです。
意図としては、
・S3に残すことでバックアップ及びバルクでデータ投入が楽になる(はず）
・データ解析としてredshiftとかに用途を変更するとかフレキシビリティが上がる
かなと考えてました。

こんな感じです
![image2.JPG](https://qiita-image-store.s3.amazonaws.com/0/100893/8abf98c9-0c67-cc74-0580-cf08e6d6bef6.jpeg)

kintone要素少な目ですみませんー
北の国からモールス

枠があいていたのでやっつけでございます、すいません。

北の国からを見ていて、「アアー アアアア アー」の所で、「トンツー トントントントン　ツー」と口ずさんだ経験はみなさんお持ちだと思います[^1]。

[^1]: アマ無線技士免許取得系なら間違いなく。

ということで、今日は、イロハモールスに変換してみました。

```
kashi = "アアー アアアア アー
ンンー ンンンン ンーンン
ンンン ンンン ンン
アーア アアアア アーアー
アアー アアアア アー
ンンー ンンンン ンーンン
ンンン ンンン ンン
ラララララ ラー ララララー
ララララー ラララー ララ
ラララララ ラー ウウウ フフフ
ンンンンン ンンンン
ンンンン ン
アー アアアア アーアー
アアー アアアア アー
ンンー ンンンン ンーンン
ンンン ンンン ンン
アーア アアアア アーアー
アアー アアアア アー
アアー アアアア アーアア
ンンン ンンン ンン
ンンン ンンン ンン"

m_to_i_txt = "
イ .- 
ノ ..--
ロ .-.- 
オ .-...
ハ -... 
ク ...-
ニ -.-. 
ヤ .--
ホ -.. 
マ -..-
ヘ . 
ケ -.--
ト ..-..
フ --..
チ ..-. 
コ ----
リ --. 
エ -.---
ヌ .... 
テ .-.--
ル -.--.
ア --.--
ヲ .--- 
サ -.-.-
ワ -.- 
キ -.-..
カ .-.. 
ユ -..--
ヨ -- 
メ -...-
タ -. 
ミ ..-.-
レ --- 
シ --.-.
ソ ---. 
ヱ .--..
ツ .--. 
ヒ --..-
ネ --.- 
モ -..-.
ナ .-. 
セ .---.
ラ ... 
ス ---.-
ム - 
ン .-.-.
ウ ..- 
ヰ .-..- 
゛ ..
゜ ..--.
1 .---- 
2 ..---
3 ...--
4 ....-
5 ..... 
6 -....
7 --...
8 ---..
9 ----. 
0 ----- 
"

m_and_i = read.table(textConnection(m_to_i_txt), as.is = TRUE)
i_to_m = m_and_i[, 1]
names(i_to_m) = m_and_i[, 2]
morse = strsplit(gsub("[ア-ン]", ".", chartr("ー\n", "- ", kashi)), " ")[[1]]
paste(i_to_m[morse], collapse="")
```

```
[1] "ウヌイウヌカララ゛ナヌロウヌイウヌカララ゛5イ44ク゛5イララ5ヌヌヘイヌロウヌイウヌカララ゛ナヌロウヌイウヌカララ゛ララ゛"
```

なんか官能的・・・

本当にゴメンなさい。
タブ無しおよびタブ有りアプリにおいて、同じコードでWindowを開く方法(Titanium Alloy, iOS/Android)


## 問題点

iOSにおいて開いたWindowから戻りたい時は、一般的にタイトルバー左端のナビゲーションで戻ります。Androidにおいて開いたWindowから戻りたい時は、バックキーで戻ります。
これらの遷移を利用したい場合、タブの有無によって次のようなトップレベルビューを使い分けなければいけません。

各種アプリケーションのトップレベルビュー

|-|iOS|Android|
|---|---|---|
|no tabbed application|NavigationWindow(*1)|Window|
|tabbed application|TabGroup|TabGroup|

*1: iOSではtabBarHiddenプロパティをtrueとすると、代わりにTabGroupが使用できます。

補足：TabGroupに揃えられればいいのですが、残念ながらAndroidではTagGroupを使用してtabBarHiddenプロパティをtrueに設定しても不自然なスペースが表示されてしまいます。

例えばWindow AからWindow Xを開く場合を考えてみます。単にWindow Xを開きたいだけなのに、単純に呼び出すと次のようにコードを書き分けないといけなくなります。
**Windowを開くのに、このような断片化したコードは書きたくありません。**

|-|iOS|Android|
|---|---|---|
|no tabbed application|navWin.openWindow(winX)|winX.open()|
|tabbed application|activeTab.open(winX)|activeTab.open(winX)|


## 解決方法
裏技でTabGroupで統一する方法も有るのですが、SDKのバージョンが変わると動かなくなるなど安定しておらず、コードも複雑となりメンテナンス性が落ちます。そこで上記テーブルのトップレベルビューを素直に使用したままで、同じコードでWindowを開く方法を考えました。
index.jsファイルにAlloy.Globals.UI.openWindowというメソッドを用意し、Alloy.Globals.UI.openWindow('winX');といったコードでウィンドウを開けるようにしました。これによって次の４パターンにおいてWindowを開くコードが同じとなり、ソースがメンテナンスしやすくなり、iOS/Android両対応もスムーズとなります。

- iOS タブ無しアプリ
- iOS タブ有りアプリ
- Android タブ無しアプリ
- Android タブ有りアプリ

補足１：Alloy.Globals.UI.openWindowの中身は４パターンで違うのですが、ここはアプリが変わっても内容は変わりません。別Windowを開くコードはアプリ内で複数有ることが多く、今回のようにしてここが統一されるメリットは大きいです。

補足２：Alloy.Globals.openWindowでもいいのですが、他にもiOSとAndroidで同じように呼べるUIを増やして整理したいのでUIを付けています。


## コード
具体的なサンプルコードについてはタブ無しとタブ有りに分けて、GitHubで公開しています。

- iOS/Android タブ無しアプリ
https://github.com/papuujp/TiSampleNoTabbed
- iOS/Android タブ有りアプリ
https://github.com/papuujp/TiSampleTwoTabbed

[サンプル動作動画](https://youtu.be/xanEh02FKBo)



---


(English)
#How to open a window in same code on a tabbed or no tabbed application(Titanium Alloy, iOS/Android)


## Problem
Here are top level views on a tabbed or no tabbed application.

|-|iOS|Android|
|---|---|---|
|no tabbed application|NavigationWindow|Window|
|tabbed application|TabGroup|TabGroup|

If I open Window X from Window A, I have to write these code.
**I don't want to write these fragmented code!!!**

|-|iOS|Android|
|---|---|---|
|no tabbed application|navWin.openWindow(winX)|winX.open()|
|tabbed application|activeTab.open(winX)|activeTab.open(winX)|


## Solution
So I made Alloy.Globals.UI.openWindow in index.js. And I can open a window in the same code on the four pattern. 
Alloy.Globals.UI.openWindow('winX');

- no tabbed iOS application
- tabbed iOS application
- no tabbed Android application
- tabbed Android application

It's easy to maintenance and portable between iOS and Android.


## Code
Codes are on GitHub.

- no tabbed iOS/Android application
https://github.com/papuujp/TiSampleNoTabbed
- tabbed iOS/Android application
https://github.com/papuujp/TiSampleTwoTabbed

[Sample movie](https://youtu.be/xanEh02FKBo)
KPTのサイクルで実践する継続的チーム改善

[コミュニケーションアドベントカレンダー](http://qiita.com/advent-calendar/2015/communication) 5日目の記事です。

ソフトウェアの開発を行う上で1人開発であっても、チーム開発であっても様々な問題が発生します。最初は小さな問題だったとしても次第にそれは無視できない問題となり、放置することで成果物の品質が著しく下がったり、最悪プロジェクトが頓挫することがあります。

それを防ぐために[KPT](http://www.itmedia.co.jp/im/articles/0905/19/news143.html)という方法が提案、実践されています。

> ミーティングでは、ホワイトボードなどに「K：keep＝今後も続けること」「P：problem＝問題なので、やめること」「T：try＝今後、試してみたいこと」の項目を用意し、メンバーが行ってきた活動報告の内容を「K」と「P」に振り分けていく。その後、「P」に対する解決策や新しいアイデアや企画を「T」欄に書く。


今回は私達の組織で実践しているKPTの目的、手法、そして成果についてまとめます。

## KPTの目的とは

最終的な目的は、より良いソフトウェアを開発しクライアントに良い物を届けることです。また、その過程として効率的な開発ができるチームを作ることも挙げられます。

これらの目的に到達するための手段としてKPTを行っています。

## KPTの手法

それでは、私達の組織でどのようにKPTを実践しているか紹介しいます。

### 予定を立てる

まずは予定を立てます。いわゆる「見積もり」という奴です。具体的には、

 - 次回のKPTまでの間にやるタスクのリストを作る
 - 各タスクにかかる時間を見積もる
 
予定はプロジェクトメンバー全員で立てて共有をしましょう。また、時間の見積もりをするときには、可能な限りメンバーの意見を聞いて大きな数字を挙げた人の意見を注意深く聞くようにします。

私達はGithubと[ZenHub](https://www.zenhub.io/)を利用しています。ZenHubでは見積もりの時間を「ストーリーポイント」として表現しますが、まぁ時間みたいな物と思って差し支えないと思います。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/6756/ebf46108-4b44-ddd2-505f-61e8e33f0a35.png)
やる予定が `ToDo`、やっていることが `In Progress`、終わったことが `Done` として表現されます。

### 予定を計測しながら実践する

予定に挙げたタスクをこなしますが、このとき具体的にどれくらい時間をかけているのか計測をします。私達は[toggl](https://toggl.com/a)というWebサービスを利用しています。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/6756/e436ba2e-fb65-d8e6-5e3d-3039fae58ec1.png)
タスクを入力して `Start` すると時間が計測されて記録されていきます。

これは、タスクにかかった時間を計測するトラッキングツールで、サマリーとしてタスクにかかった時間を表示してくれます。

![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/6756/86b849a3-864d-f03c-d3de-6bcf89a65f8a.png)
サマリーとしてグラフを作ってくれます。PDFやCSVでダウンロードすることも可能です。

Chromeの拡張をインストールすることで、Githubを始め様々なWebサービスにtogglのトラッキングをスタートするボタンを表示してくれます。

また、プロジェクト以外のタスクが割り込んだ場合にもトラッキングをしておくと良いでしょう。

### 振り返る

さていよいよKPTの会議を行う時が来ました。私達は2週間に1回行っています。

ここでは予定と計測の結果をまず比較して、予定通りに物事が進んだかどうかを見てください。大抵の場合予定通りに行かないのではないでしょうか？

それが `Problem` です。なぜ予定通りに行かなかったのでしょうか、その理由を考えてください。それが `Try` です。

そして再び予定を立てます。今度は `Try` で修正される内容に期待をしつつ、とは言え計測をした結果を意識して。このサイクルを繰り返します。
![a8326864-9aae-11e5-80c2-beeccd75d197.JPG](https://qiita-image-store.s3.amazonaws.com/0/6756/9e05a4c5-1608-ad16-8f4c-1014d72c75de.jpeg)
ホワイトボードでガンガン書いていきます

### KEEPは？

`Try` をしてみて上手く行った内容を `Keep` として記録しましょう。KEEPがたくさん溜まったらチーム運営ガイドラインに昇華させましょう。今のチームメンバーに最適化されたガイドラインが完成するでしょう。

## 成果

なかなか定量的な評価は難しいのですが、[Android 版 feather](https://play.google.com/store/apps/details?id=com.covelline.feather) というTwitterクライアントは有料ソーシャルネットワークランキングで3位になっています。そんなに悪く無いのではないでしょうか？

## まとめ

KPTのサイクルをういまく回すことで組織を改善し、より良い製品を作ることができるようになるでしょう。そしてそのためには
	
	予定 -> 計測 -> 振り返り -> 予定 -> 計測 -> 振り返り -> 予定...
	
のサイクルが大切と言えます。
実行中のシェルスクリプトのパスの取得

いくつかのOSで実験したけれど、POSIX準拠ならこれで十分だった。

```
#!/bin/sh

case "$0" in
    ./*) SCRIPTNAME="$(pwd)/${0#./}";;
    /*)  SCRIPTNAME="$0";;
    *)   SCRIPTNAME="$(pwd)/$0";;
esac
SCRIPTDIR="${SCRIPTNAME%/*}"

echo $0
echo $SCRIPTNAME
echo $SCRIPTDIR
```

Solaris の /bin/sh は、おそらくSystem V 由来の、POSIX 以前の Bourne shell なので、これじゃないとだめだった。

```
#!/bin/sh

case "$0" in
    ./*) SCRIPTNAME="`pwd`/$0";;
    /*)  SCRIPTNAME="$0";;
    *)   SCRIPTNAME="`pwd`/$0";;
esac
SCRIPTDIR="`dirname \"$SCRIPTNAME\"`"

echo $0
echo $SCRIPTNAME
echo $SCRIPTDIR
```
猫のいる会社でプログラマとして働いてみて感じたこと

qnote Advent Calendar 2015 の 5日目を担当する横田です。

#ポエム書くよ

qnoteでAdventCalenderをやろうって話になったときに、「Qiitaにポエムってタグがある」ということを教えてもらって、いっちょ書いてやろうかと思って、勢いに任せて書いてみます。
読んだからといって特に得るものはないかもしれないですが、そこはポエムなので！

#猫のいる会社qnote

変わってますね、うん。
まず、当然ながら、毎日猫がいます。
そこら中に寝転んだりしてます。
かわいいです。

そんなのんびりした雰囲気の中、みんな集中して働いています。
最初は不思議でした。
でもいまは私もそんな感じで仕事できています。

なぜか。

「猫がかわいいから」

これに尽きます。
寝てるみるく部長を見ているだけで勤労意欲に繋がります。
みるく部長のイビキを聞きながらプログラミングしてると捗ります。
イライラしてたことなんて、みるく部長のいびきの大きさに比べたら小さいことです。

#技術力のある会社qnote

猫に注目されがちですが、qnoteは技術力も高いです。
あと古いこと、新しいこと関わらず、学ぶ意欲が高い人が多いです。
私自身はプログラマとしてまだまだですが、先輩たちのソースコードを読んだりしつつ、マイペースでスキルを磨いているところです。
「3分悩んだら人に聞け」とCTOによく言われるのですが、これもとても助かりますね。
人に聞くことのハードルが低いのはいいことだと思います。
あと、勉強会への参加、登壇も自由というところも嬉しいです。
先日、私も勉強会で登壇して、みるく部長のかわいさを語ってきました。

#仲のいい会社qnote

qnoteは社員の仲がとても良いです。
びっくりするくらい。
休日に先輩宅でボードゲームしたり、海行ったり、謎解きゲームに参加したり。
また、社長がご飯を作ってくれるプレジデントディナーというものがあって、社長の手料理が食べられます。
不思議な感覚です。

#まとめ

猫、かわいい。
Starling2.0がやってくる

harayokiです。前回に続いてStarlingがらみの投稿です。

![title-logo.png](https://qiita-image-store.s3.amazonaws.com/0/8302/e5ec0dbf-fb12-2fde-46d2-3c36f3b9e234.png)

# Starlingが初のメジャーバージョンアップ

AIRアプリで2Dゲームを作る際のデファクトスタンダードとなっているStarlingですが、現在のv1.7から次回のバージョンアップでついにv2.0となります。リリース時期は何も発表されていませんが、1年ほど前にオフィシャルブログで言及された2015年ロードマップには含まれていた事と、最近のフォーラムでダニエルさん(Starlingの開発者)が、もうそろそろ(あと数日!)でgithubにブランチをあげるといっている事から年内を目標としていたのではないかと筆者は思っています。ちょっと難航しているようですので年末にβリリース、年明けにリリースといった感じではないでしょうか。

＃このAdvent Calendarが終わらないうちに発表があると良いですね。

# メジャーバージョンアップの意味

v1系統の中でStarlingをバージョンアップした場合、基本的にStarlingを利用している側のコードに修正を入れる必要はありませんでした。しかし今回のバージョンアップでは一部のAPI仕様に変更があるとの事です。この互換性が崩れる事からメジャーバージョンをあげる事になったようです。

しかしAPIを初めから覚え直すような事は心配しなくてよさそうです。QuadやImageクラスなどは相変わらず健在ですし、影響をうけるのはレンダラーを自分で書くような高度な使い方をしている人だけとの事。ドラスティックな変更はなさそうなので、v2.0適用でコンパイルエラーになったとしても、簡単な修正で動作させる事ができそうです。

# 新機能１ ダイナミック ライティング

<img width="313" alt="詳しくは公式 wikiへ.png" src="https://qiita-image-store.s3.amazonaws.com/0/8302/3116a301-9e01-f08e-2860-dc8f37a07c25.png">

スプライト画像にノーマルマップを設定し、ライティングを施す事で簡易3D表現が行えるものです。先日フォーラムとwikiに投稿があり、実際にすでにデモを見る事ができます。
http://wiki.starling-framework.org/extensions/dynamic_lighting

drawコールは2しか使われていませんね。１つが光源用の白い点なので、立体感のあるキャラクター全員は１drawコールで描かれている事になります。iPhone 4Sでもそこそこのパフォーマンスで動くとの事(about 800 objects @30 fps)なので期待して良いのではないでしょうか。
ソースコードの一部(starling.swcは含まれず)も上記リンク先からダウンロードできますが、新しいコアクラスが継承して使われている以外は見慣れた感じのコードです。

# 新機能2 カスタムレンダラー/カスタムバッチャー
(なんと呼べばいいのかちょっと迷っていますが、) v2.0ではユーザーが独自の描画処理を行い、それを適用したDisplayObjectをまとめて描画(=バッチ処理)するのがv1.xと比べてずっと柔軟で簡単にできるようになったようです。上記のダイナミックライティングもこの機構を利用しています。ですので実際のメインの新機能はこちらで、ダイナミックライティングはそれを利用した１例とも言えそうです。文字で説明すると地味でわかりずらいですが、今までは難しかった派手な描画処理が比較的簡単で高速に実現可能になる、と考えれば良いかと思います。

# 新機能3 自動flatten
アーキテクチャが変わったためv1.xとの比較は難しいそうですが、単純なベンチマークテストではv2.0はv1.7より若干遅くなるようです。しかしながら実際のゲームなどでは早くなるだろうとの事です。flattenという静的なSproteの描画を早くする機能がstarling1.xではありますが、これがv2.0ではユーザ側で何も設定しなくても自動で適用されるようになるという事ですので、これがパフォーマンスの向上に効いてくるのでしょう。

# その他新機能？
噂にあったベクター図形の描画機能は、今後のバージョンで入るとの事ですので、2.0には入りません。他はまだよくわからないのですが、上記カスタムレンダラーを使った機能がなにかしら入るのではないでしょうか。しかし、カスタムレンダラーを使えば、Starlingユーザが独自の派手な(便利な)描画拡張機能を作る事ができますのでv2.0がリリースされた後にユーザ側から出てくる拡張機能にも期待できそうです。Enchant.jsでいうMap機能( http://enchantjs.com/ja/tutorial/lets-start-enchant-js/#ref_8 )のようなTileMap機能も公式もしくはユーザ製作で登場するんではないでしょうか。個人的にはSPINEのようなメッシュ変形機能に期待したい所です。（SPINEではアニメーションツール側がメッシュに対応しているのがミソなのですが。)

# おわりに
Starlingはバージョン1.0がでる前から注目していたのですが、それに比べるとだいぶ本格的になってきたな、と感じます。Stage3Dのシェーダー言語であるAGALも進化してきていますし、(最新バージョンは3)、OpenGL関連の技術に手をつけた事がない人がたわむれる入り口にStarling2.0を使って見る、というのもいいのではないでしょうか。

ではまた。
表計算ソフトによる KiCad コンポーネント・ライブラリの編集

4日目の [やましょうさん](http://qa65.blogspot.jp/2015/12/kicad.html) に続く [KiCad Advent Calendar 2015](http://qiita.com/advent-calendar/2015/kicad) の5日目です♪　

　*一昨日に投稿したばかりなので、急いで仕上げました。*
　*変なところがあっても生暖かい目で見逃して下さい。*:persevere:
　*（こっそり教えていただけたら、密かに修正します。。）*

# はじめに
CPLDやFPGAは、同じパッケージでも設計ごとに別部品としなければなりません。
KiCadのコンポーネント・ライブラリ・エディタを使って、ピン名称と電気的なプロパティをピン毎に設定するのは、ピン数が多いと大変面倒です。
この作業の煩わしさを軽減するため、KiCad コンポーネント・ライブラリを表計算ソフトを利用して編集する方法をご紹介します。

#１．KiCad コンポーネント・ライブラリのCSVファイルへの変換
表計算ソフトに読み込んで編集するためには、CSV形式へと変換するのが一般的です。
KiCadで使われているファイル・フォーマットは、[本家のHPで公開](http://kicad-pcb.org/help/file-formats/)されています。
しかし、現行のライブラリには、この説明から読み取れない下記のような部分があります。（PDFでのバージョンは2.0、KiCad 4.0.0で使われているバージョンは2.3）
　１．$で始まる文字列で囲まれたセクションがあり、この部分の行の先頭は空白文字となっている
　２．ダブルクォートをデリミタ（区切り文字）とした文字列にURLを含むことがある
　３．デリミタの空白文字が２個連続する場合がある
このため、デリミタを空白からカンマ等に置換しただけでは編集しやすいCSVファイルとはなりません。
これらに対応したC#のコード例を以下に示します。
(注：以前にDelphiで書いたものをC#へポーティングしてbug修正したものです)
![Captured_Code.jpg](https://qiita-image-store.s3.amazonaws.com/0/103199/64194fcb-2730-c1f9-2ec9-b315b9ebc80d.jpeg)
ピン定義のブロックだけをカンマ区切りに変更するだけでも十分なので、よりシンプルにしても良さそうです。

#２．CPLDコンポーネントの例
図１：オリジナルのCPLDコンポーネントです。
![Chip_Original.jpg](https://qiita-image-store.s3.amazonaws.com/0/103199/9f30df6b-3c85-9606-64e8-2312ae662f58.jpeg)

図２：ライブラリでの該当部です。
![Lib_Sample.jpg](https://qiita-image-store.s3.amazonaws.com/0/103199/bb61e9a5-ec4f-513e-b45d-d317458a5703.jpeg)

図３：このライブラリをCSVに変換して表計算ソフトで読み込んだものです。
![CSV_Sample.jpg](https://qiita-image-store.s3.amazonaws.com/0/103199/ef87d2d6-3c55-8d3f-fa03-f61566e3cd86.jpeg)

図４：このCPLDを使って設計した回路のピン定義レポートです。
![Pin_Sample.jpg](https://qiita-image-store.s3.amazonaws.com/0/103199/26b4f5fb-ba14-83d7-577f-2682aa2d8e48.jpeg)

図５：定義レポートの":"を","へ置き換えて表計算ソフトで読んだものです。
![PinCSV_Sample.jpg](https://qiita-image-store.s3.amazonaws.com/0/103199/38742fa2-a55e-9c36-5524-c23a06a3c067.jpeg)

ここで、図３と図５を比べると、ピン番号の順番が異なっていることが分かります。
このままでは単純にコピペできませんが、下図６のように双方の数列を並べたものを使ってソートすることでコピペで済ますことができます。
![PinTbl_Sample.jpg](https://qiita-image-store.s3.amazonaws.com/0/103199/07f6f56e-29e6-ac2c-8155-edcaf390ed84.jpeg)

図７：その結果です。
![CSV_Edited_Sample.jpg](https://qiita-image-store.s3.amazonaws.com/0/103199/1bf45cb0-cd1b-495b-0960-3499ded30e3c.jpeg)

図８：再度ライブラリ形式に変換することで希望するコンポーネントを作成できました。
![Chip_Edited.jpg](https://qiita-image-store.s3.amazonaws.com/0/103199/97093cee-56b9-64a1-263b-aacc8424b469.jpeg)                                                                                                                                          
#あとがき
上で引用したCSVに変換するプログラムの全ソースはGitHub上にあります。
ご興味がありましたら、どうぞご自由にご利用ください。
　  URL : https://github.com/starfort-jp/KiCad_LibUtil/
（ほぼ最低限の実装しかしてないので、実使用にあたっては多分コードの追加が必要です）

6日目は [miettalさん](http://qiita.com/miettal) の"スイッチサイエンスPCBへの発注を手助けするpython scriptを書いた話"です♪
実用的で面白そうな内容に期待大です！
発注が簡単にできたら、痛そぉな基版とか作っちゃいたくなるかも。:ghost:
　  *KiCadで痛い基板作ってる人、いるんだろうか? 作り方が知りたひ…*

[KiCad Advent Calendar 2015](http://qiita.com/advent-calendar/2015/kicad)
emacs で誕生日サプライズをする

emacs に標準で付属する package には面白いものがあります。

その面白い package を利用したプログラムを、知り合いの emacs 使いの .emacs を秘密裏に編集して挿入することで、誕生日のサプライズをする方法が見つかったのでメモっておきます。

```el
(if (string= (format-time-string "%Y-%m-%d" (current-time)) "2015-12-05")
    (animate-birthday-present "hogetaro"))
```

この例は hogetaro さんの誕生日が 2015-12-05 の時です。

もちろん自分の .emacs に仕込んどいて忘れてた頃に発動する、でも楽しいですね。

ぜひお試しください。

毎回出るとうざいので、出たら消してもらうのがよいです。



この機能は、個別に

```el
(animate-string "hogehoge" 0 0)
```

などと使うことが可能です。
Htmlメールを作った話。

[岩手県立大学 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/ipu)も5日目ですね。ここから3日間は91年生まれの3人([@her0m31](http://qiita.com/her0m31)、[@Dicrotect](http://qiita.com/Dicrotect)、[@omega999](http://qiita.com/omega999))がお届けします。
元コンビニ店長の[@Dicrotect](http://qiita.com/Dicrotect)と700以上のContributionを稼ぐ[@omega999](http://qiita.com/omega999))がどんな記事を書くのか注目ですね。

*こんな記事でした。
[@Dicrotect](http://qiita.com/Dicrotect) → [PHP初心者がつまづいた画像ファイルを上げる際に倒さねばならぬエラーたち](http://qiita.com/Dicrotect/items/1c76c14b9c7c91195fa8)
[@omega999](http://qiita.com/omega999) → [PsySHって知ってる？私は感動した。
](http://qiita.com/omega999/items/b9b75dc127053deea3a7) 

#安易にHtmlメールに手を出したら大変だった話
[Google Form -> SpreadSheet -> Calendar && Mailで簡単な予約フォームを作る。](http://qiita.com/her0m31/items/0a67d52179341380dd31)に引き続き、[学習支援コーナー](http://ichi.si.soft.iwate-pu.ac.jp/~lsc/)でのお話です。

[学習支援コーナー](http://ichi.si.soft.iwate-pu.ac.jp/~lsc/)では毎月の初めに、メールで学部の皆さんにお知らせを送っています。

何か変わったお知らせの方法がないかな？と思って、思いついたのがHTMLメールです。

今回は、HTMLメールを作った話と、思ったより大変だったという話です。

#大変なポイント
一番大変だったのは環境による違いです。

Webページのモバイル対応とかも、大変だと思いますが、それ以上なんじゃないかなと思います。
単純に注意しなければいけないところが増えることが原因なのかもしれません。
OS × ブラウザ × Webメーラーとか。
特にスマフォのキャリアメールについては、Htmlメールを表示できないキャリアもあるようで、対応できないものもあります。
auは表示できないみたいですね。

他に大変だったのは、CSSを埋めこまなければいけないとか、Webからは送れないとか、テーブルをめっちゃ組み合わせなきゃいけないとかは大変でした。

#基本的な作り方
今回は、上のような理由から、一から作る事は諦めて、テンプレートを調整していく形で作っていくことにしました。
([初心者でもお洒落なhtmlメールが作れる高品質テンプレート20選](http://blog.codecamp.jp/html_mail_template/)とか。知らなかっただけで結構ある)
テーブルを組み合わせる事、CssはインラインCssで書く事で作っていきます。

実は、このテーブルとCSSをインラインで書くというのは、Htmlメールを作成する時に必須になるポイントだったりもします。
上で話したような、環境の違いによる表示のずれなどを極力抑えるためです。
しかし、全てテーブルで組んだとしてもiPhoneなどでは隙間ができてしまうこともあるようなので注意が必要ですね。


今回は使わなかったんですが、Cssをインライン化してくれるサービスもあるので、それを使うと楽かもしれません。
[CSS inliner](https://inliner.cm/)

#作り方を調べていて思ったこと
みんな苦労してるんだな、、、という事と海外ではHtmlメールが多いという事です。

作成自体は、すぐにできるけど、検証が大変！という話は多かったです。
メールなので送ってから修正する！とはできないですから検証が大事なのかもしれません。

あと一つは、テキストのメールが多いのは日本だけだよ。みたいな話。
実際どうなのかは知らないですが、確かに、英語で来る迷惑メールとかはhtmlメールが多いなーとは思いました。

#作ったもの
こんな感じです。

![http://ipu-lsc.github.io/mail201512/html-mail.png](http://ipu-lsc.github.io/mail201512/html-mail.png)
![http://ipu-lsc.github.io/mail201512/html-mail2.png](http://ipu-lsc.github.io/mail201512/html-mail2.png)

ちなみに送り方はMacだと数クリックで送ることができます。

1. htmlを作成する。
1. ブラウザで開く
1. ファイルの共有からこのページをメールで送るを選択
2. MacのMail.app?が起動するので、送信する。

これで送ることができます。


![http://ipu-lsc.github.io/mail201512/mail.png](http://ipu-lsc.github.io/mail201512/mail.png)

今回は学内メールでGmailが使われているので、Gmailをメインにちゃんと表示できるように調整しています。
環境によってのフォントの違いとかで多少ずれたるするものの、大きな崩れはないみたいです。

ちなみに教員向けのメーラー(ActiveMail?)では表示できていないみたいです。

これが他にも対応したいとかになると大変ですね。

#おわり
送信済みになってるのに、だれも受信できてないみたいなんだけど、どういうことだ、、、

#おわり2
[PAKUTASO](https://www.pakutaso.com/)便利。
[ゆかちぃ](https://www.pakutaso.com/kawamurayuka.html)が可愛い。[@xmas_yk](https://twitter.com/xmas_yk)