OmniAICreator/Qiita-1.07M huggingface dataset:
HSP3.5 HGIMG4 で複数カメラ視点描画

HSP3.5 HGIMG4 ではオフスクリーンを応用して複数カメラ視点描画ができます。
通常のまま gpdraw を実行してしまうとイベントなどの自動移動がその回数分反映されてしまうため、gpdraw に引数を指定して自動移動反映と描画を分けるところがポイントです。
サンプルコードは以下のようになります。

```
#include "hgimg4.as"

#const EG_CALC GPDRAW_OPT_OBJUPDATE
#const EG_DRAW2D (GPDRAW_OPT_DRAW2D | GPDRAW_OPT_DRAW2D_LATE)
#const EG_DRAW3D (GPDRAW_OPT_DRAWSCENE | GPDRAW_OPT_DRAWSCENE_LATE)


	sx = ginfo(26)
	sy = ginfo(27)

	gpreset
	setcls CLSMODE_SOLID, 0x000033

// 上下往復運動
	newevent ev
	event_addpos ev, 0, -0.002, 0
	event_wait ev, 120
	event_addpos ev, 0, 0.002, 0
	event_wait ev, 120
	event_jump ev, 0

	gpload id, "res/duck"
	setangr id, 0, -64, 0
	setevent id, ev
	duck_id = id

// ちらつき防止用
	buffer 1, 32,32, 0

	ow = sx / 4
	oh = sy / 4

	dist = 4

// メインカメラ
	gpnull id
	gpcamera id, 45, double(sx) / double(sy), 0.5, 768
	setpos id, 2, 2, 3
	gplookat id, 0, 0, 0
	cam_id = id
// サブカメラ
	dim cams,4
	foreach cams
		gpnull id
		gpcamera id, 45, double(ow) / double(oh), 0.5, 768
		if cnt == 0 {
			setpos id, 0,0, dist
			gplookat id, 0,0,0
		}
		if cnt == 1 {
			setpos id, 0,dist,0
			setangr id, -64, 0, 0
		}
		if cnt == 2 {
			setpos id, -dist,0,0
			gplookat id, 0,0,0
		}
		if cnt == 3 {
			setpos id, dist,0,0
			gplookat id, 0,0,0
		}
		cams.cnt = id

		buffer cnt + 2, ow,oh, screen_offscreen
		celdiv cnt + 2, ow, oh, ow/2, oh/2
	loop

	repeat
		getreq ts, SYSREQ_TIMER
		getreq fps, SYSREQ_FPS
// 移動の反映
		gsel 1
		gpdraw EG_CALC
// サブカメラでのオフスクリーン描画
		foreach cams
			gsel cnt + 2
			redraw 0

			gpusecamera cams.cnt
			gpdraw EG_DRAW2D | EG_DRAW3D
			redraw 1
		loop
// メインカメラ
		gsel 0
		gpusecamera cam_id
		gpdraw EG_DRAW2D | EG_DRAW3D
// サブカメラのオフスクリーンを可視描画
		color 224,224,224
		foreach cams
			x = ((cnt & 1) * 10 + 3) * ow / 4
			y = ((cnt / 2) * 10 + 3) * oh / 4
			grect x, y, 0, ow+8, oh+8
		
			pos x, y
			celput cnt + 2
		loop

		pos 16, oh * 2
		color 224,224,224
		font "",36
		mes strf("%2d [fps]", fps)

		redraw 1
		await 1000/60
	loop
```

|実行結果|
|:-:|
|![z09four1.png](https://qiita-image-store.s3.amazonaws.com/0/213145/d4752bd1-d5d4-dc4e-249d-a5c15b675d34.png)|
|通常のメインカメラと正面、上、左右のサブカメラ|

描画の回数だけ1フレームあたりの処理負荷は上がりますが、自キャラ位置視点や第三者視点と俯瞰視点との同時描画などが実現できます。
メンバーが「自分事感」を持てるチームであるためにチャット運用で気をつけていること

こんにちは。
この記事はLivesense Advent Calendar 2017-学- 14日目です。

自分が転職ドラフトというプロダクトの立ち上げにアサインされてからあっという間に2年が経ちました。
少しずつチームも大きくなってきた中で気をつけている事として「メンバー誰もが自分事感を持てるチームであり続ける」というものがあります。何故かと言うと

* 天才が1人いればいいけれど、大抵はそうではないので多くの見識があった方が強力だ（多数決をするわけではない）
* 小さなチームでは明確な役割分担よりも相互協力できる体制が強さになりやすい
* なによりも各々がそれぞれの経験やバックボーンから課題を感じて、どうしたら良いか考えて、実際に作ったものが世の中の役に立つ、というプロセスに関われることが、プロダクト作りの醍醐味だと思っている

まぁ最後が一番大きい理由なのですが、そういうチームは良いものを作れると思っているし、僕はそういうチームで働きたい。だからこれをとても意識しています。

で、意識の仕方は色々ありますが、今日はチャット運用にフォーカスして気をつけていることを書いてみたいと思います。

# よくわからないモノの課題感は把握できない

個人的にビジネスチャットあるあるだと思っているのですが、チームのチャット部屋って細分化していて、結構な数があったりしませんか？

あれを止めて、うちのチームは部屋を1つだけにしました。
（ゴメンナサイちょっと盛りました。正確には数個ありますが、開発ログを流しているだけの部屋やお問い合わせの対応の際に個人情報を扱うために鍵が必要だった部屋など、特殊な部屋だけです）

部屋を1つにした理由は『チームメンバー間の情報格差を無くすため』です。

メンバーが『自分事感』を持って色んな分野に意見をだして行きたいのに、部署や役職毎に情報が分割されていると、キャッチアップが大変です。知らない部屋だってあるかもしれない。知らない部屋の話が必ずしも共有されるとは限らないから、わからないことも増えてくる。そうなれば、わからないことに対しての課題感は、わかってる人に比べて当然低くなる。
そうならないために、部屋を1つにして、すべての情報を集約しました。これによりこんな感じのメリットがありました

* ここだけ見ていればほぼすべての情報が手に入る（別手段での共有ももちろんあるけど、できるだけチャットに流しているので）
* 「自分が知らない情報」がほぼ無い（事が約束されている）から、自信を持って発言できる
* 役職の違う人たちの行動が見えるので、早めのキャッチアップや協力がしやすい
* 他部署の人から見た時にも「このチームにはこの部屋で共有すれば良い」ことが分かりやすい
* 少なくとも、部屋の存在を忘れることはない（1つしか無いので）
* 新しく部屋ができることもないので、キャッチアップし損ねて入りそこねることもない

以下のようなデメリットもありますが、だいたい大丈夫した。

### 情報が多い
身もふたもないけど、人間は案外情報処理能力が高いんですよね。。
数百ポスト/日 くらいあっても、あまり問題なく処理可能でした。
少々見落とすことや、数日の休暇の間に話が進むこともありますが、それは別途コミュニケーションを取ればいいだけかなと。

チャットはログが流れていくというツールの特性上、完璧でミスのない情報共有みたいなものを求めて使わないほうが幸せに使えると思います。

### 自分に関係ない話が多くて効率が悪い
この問題についての解答は『効率を重視しないでも良いと考えている』です。
この2年間、ものづくりと効率化について色々考えてみた結果「必ずしも効率化が正義ではない」という気持ちが強くなりました。
例えばこんな感じです。

* コミュニケーションは分量が必要な場合もある
* ゆとりがないと作業に忙殺される
* 神は細部に宿る
* 考えるという行いには相応に時間がかかる
* 時間に縛られると取りづらい選択肢がある

ただ課題感が無いわけではないので、ここはもうちょっとうまいやり方があるのかもなーと思っています。

# 安全な場所と、小さなキッカケ

次に、この部屋のルールはありません。何しても構いません。
ボットの通知なんかも結構分量多く流してます。

* 出社や帰社時間の通知（肯定ペンギンの画像つき）
* ランダムな時間に連れタバコに誘う通知
* KPIはユーザー行動周り（会員登録、審査開始、指名、返答、等（個人情報に配慮してコメントなども記載して通知））
* ネット上のエゴサ結果

などなど、冗談も含めて色々流しています。ユーザーの行動が分かるくらい多く流れているので気がつくことも日々あります。
「ユーザーからこういう要望がでてるのか」とか「ユーザーはこういう動き方するんだね」とか「じゃあこうしようか」とか。
自然と会話が弾み、新たな施策が生まれ、更にチャットは速度を増していきます。

ここで狙っていることは言うまでもなく『何を言っても大丈夫な空気の部屋作り』です。
心理的安全性みたいなものですね。（部屋自体の特性の問題なので心理的安全とはちょっと違うなと思っています）
良い所はこの辺です。

* 会話があるので部屋の空気が読めて入りやすい（会話がないと空気すら読めないので入りづらい）
* 発言の縛りがないから発言しやすい（ルールがあると「自分の発言がルールに抵触しているか否か？」を検討する必要があり、特にルールが面倒くさいほど発言自体が面倒になる）
* そこそこ流れのあるチャットルームだから、多少の失言もすぐに流れる（1票の格差ならぬ1発言の重みが過度に大きくなり過ぎない）
* キッカケが多いから会話を始めやすい（リアルタイムでKPIやエゴサ結果を流すのでちょっとした動きの変化やユーザの要望がキャッチしやすい）

自分の挨拶に誰からもレスがなく、それが全く流れず放置される地獄のようなのチャット部屋には誰も書き込みたくないですよね。

# まとめ

まとめると

* 情報格差を無くすことで課題感が共通認識とズレにくくなるので、解決方法を考えるためのベースができ
* コミュニケーションがしやすくキッカケが多い場所を用意することで
* みんなが自発的に意見を出し、活発に議論がなされる自分事感の高いチームになる

というのをチャット運用でも気にしてるよ！というお話でした。

みんなが自分事感を持っているチームは本当に強くて、どんどん前に進みます。
何よりそういうチームでプロダクトを作ることが、僕はとても楽しいです。

というわけでウチのチームのチャット運用で気をつけていることでした。
何かの参考になったら嬉しいです。
【MarkLogic Server】XQueryチューニングメモ～データベース設定

はじめに
========
今回は、MarkLogicのデータベースの基本設定について見ていきましょう。本稿では、特にドキュメントのロードや挿入に影響するパラメータを扱います。詳細は[こちら](https://help.marklogic.com/knowledgebase/article/View/166/18/performance-settings-checklist "こちら")もご参照ください。

データベース設定
========
管理者画面(ポート8001番)から、Configure→Databases→[対象のデータベース]→Configureタブを見るとディレクトリやドキュメントに対するプロパティの設定などに関わるパラメータが出てきます。これらについて特に断りが無ければ以下のように設定しましょう。(大部分はデフォルトで推奨値となっています。)

| パラメータ | 推奨値 |
|---|---|
| directory creation | manual | 
| maintain last modified | false |
| maintain directory last modified | false |
| inherit permissions | false | 
| inherit collections | false |
| inherit quality | false |

これらのパラメータは、オンにしておけばいくつかの有用な機能を提供します。しかし、ドキュメント挿入時にプロパティ情報を追加するなどひと手間加えてしまうため書き込み性能の低下を招くことになります。よって「基本的にはオフ」とすることをお奨めします。

以下は、よく議論になるパラメータについて触れます。

パラメータ「directory creation」
========
directory creation=automaticとすると、ドキュメント挿入時のURIに対してディレクトリが無かった場合は自動的にディレクトリを1個のフラグメントとして作成します。1ドキュメントごとに確認を行わなければならないので性能に影響を与えます。

試しに100万行のCSVをContent Pumpでロードしてみました。

| directory creation | ロード時間[秒] | ロード成功数 |
|---|---|---|
| manual | 2,576 | 1,000,000 |
| automatic | 3,908 | 999,281 |

なんとautomaticではロード時間が大幅にかかった上に、以下のようなエラーメッセージを出して、一部がロードされないという事態となりました。

```
・・・
WARN mapreduce.ContentWriter: Failed document /dataSize/load.csv-0-281719 in file:/C:/work/dataSize/load.csv at line 281720
ERROR mapreduce.ContentWriter: SVC-EXTIME: Time limit exceeded
WARN mapreduce.ContentWriter: Failed document /dataSize/load.csv-0-281720 in file:/C:/work/dataSize/load.csv at line 281721
ERROR mapreduce.ContentWriter: XDMP-NOTXN: No transaction with identifier 12425419326357809800
・・・
```

明らかにmanualとした方が良いですね。

一方でdirectory creation=manualとすることのデメリットは以下の通りです。
・WebDAVによって、DB内のファイルにアクセスすることができなくなる。
・cts:uri-match関数などURI検索関数でディレクトリを検索対象にできなくなる。

WebDAVの利用は、XQueryファイルのみを入れるモジュールDBだけにしましょう。大量のデータを入れるDBには避けるべきです。
cts:uri-match関数の利用については、そのような前提のデータベース設計・プログラム設計を避けるべきです。ディレクトリURIをcts:directory-queryのように完全一致条件に使うことは良いのですが、検索対象そのものにすることはたとえautomaticにしてもコストの大きなものになります。そういった情報は必ずドキュメント内に配置するようにしましょう。

パラメータ「inherit permission」
========
特定のディレクトリに対するアクセス権などを、その内部に挿入されたドキュメントすべてに遺伝させる設定です。これをtrueとしておけば、ドキュメント挿入時に権限付与をしなくても、事前に設定されたアクセス権がドキュメントに設定されます。逆に言えば、ドキュメント挿入時にディレクトリを辿って権限の確認を行い、ドキュメントのプロパティに反映しなければならなくなるため、書き込み性能の低下を招きます。

inherit permission=falseとした場合のアクセス権の対応方法は以下の2通りです。
・挿入ユーザ/ロールのdefault permissionにアクセスさせたいロールを設定しておく。
　Configure→Security→UsersまたはRolesにdefault permissionがあります。
・MLCPやxdmp:document-insertなどの関数の引数に、付与する権限を記述する。

後者は、シェルやクエリなど修正が広範囲に及ぶかと思います。

おわりに
========
大量のデータを投じることを前提に考えると、これらの設定はオフにしたまま開発を進めることをお奨めします。オンにすると書き込み性能低下を招くことは必至です。性能試験段階でパフォーマンスを改善しようとオフに変更したとしても、資材の大幅な修正に直面することになります。



```math
\def\textsmall#1{%
  {\rm\scriptsize #1}
}
```

------------------------------------------------------------------------

**免責事項**

​​​​​$\textsmall{当ユーザ会は本文書及びその内容に関して、いかなる保証もするものではありません。}$
​​​​​$\textsmall{万一、本文書の内容に誤りがあった場合でも当ユーザ会は一切責任を負いかねます。}$
​​​​​$\textsmall{また、本文書に記載されている事項は予告なしに変更または削除されることがありますので、予めご了承ください。}$
Chrome開発者ツールのスマホ表示から消えたiPhone5を復活させる

# 概要
Chrome Developer ToolからiPhone5が消えた...
iPhone SE現役の人向けの対応どうしよう...
<img width="409" alt="chrome_dev_tool.png" src="https://qiita-image-store.s3.amazonaws.com/0/53950/ab6458cb-12d1-946d-e032-75d531ffd9d2.png">
そんな人は、以下の操作手順で過去のスマホをメニューに追加できます。

# Chrome開発者ツールのメニューに過去のスマホを追加する
## `Edit...` をクリック
![edit_chrome.png](https://qiita-image-store.s3.amazonaws.com/0/53950/af8e48c5-16d0-5ed4-3f3a-445e773b6a86.png)

## Emulated Devices から、 iPhone5 を追加
<img width="507" alt="Emulated_Devices.png" src="https://qiita-image-store.s3.amazonaws.com/0/53950/82435636-f498-178c-531c-beeac08ac47b.png">

## iPhone5がリストに追加されます
![iphone5_chrome.png](https://qiita-image-store.s3.amazonaws.com/0/53950/2eb72ee1-4f56-e745-727f-13efa8f95393.png)

以上!
みなさま快適な開発者ライフを。
SQLServerのトラブルシューティングフローを勝手に定義してみた

#はじめに
みなさん、トラブルシューティングしてますか^^
簡単なもの、やっかいなもの、多々ありますが見るポイントを知っておくと
いざという時に役立ちます。
今回は私なりの
Windows + SQLServerに関するトラブルシューティングフローを情報提供したいと思います。
#★DB接続出来ねぇ!!!
###サービス起動してますか?
たまにOSの再起動時のスタートアップでタイムアウトしてしまう事があります。
まずは起動確認！
###プロトコル有効ですか?
接続情報に沿ったプロトコルが有効か構成マネージャーなどで確認しましょう。
###ポート番号あってますか?
動的ポート割り当ててると番号かわりますよね。
###別名邪魔してませんか?
意図しない別名定義されていたりして邪魔してるケースがあります。
SQL クライアント設定ユーティリティ見てみましょう。
暗号化ON/OFFも一緒にチェック。
#★なんか安定しない。。。
###容量の空きありますか?
そもそもストレージ空いてますか?
無償版使っている場合はmdfのサイズ、上限付近でないかも確認したいですね。
<参考>
 - 2016 = 10GB
 - 2014 = 10GB
 - 2012 = 10GB
 - 2008R2 = 10GB
 - 2008 = 4GB
 - 2005 = 4GB
 - 2000 = 2GB 
###エラー発生してないですか?
SQLServerのエラーログ見てみましょう。
Program Files\Microsoft SQL Server～\ERRORLOG　を確認。
ついでにOSのログ(イベントビューワー)も見てみましょう。
DISKの不良ブロックエラーなど致命的なやつがあれば早めに交換検討を。
###メモリ食いつぶしてないですか?
Webサーバーなんか一緒に起動してたりするとメモリの取り合いになりそうですね。
適切な上限値(max server memory)を設定してみてもよいかもです。
###自動拡張サイズ適切ですか?
ある程度大きなトランザクションログが発生する処理で不安定な場合は、
自動拡張時にタイムアウトしているケースがあります。
拡張サイズの見直し(FILEGROWTH)をしてみてもよいかもです。
#最後に
少しでも読んでくれた方の参考になればHAPPYです。
最後までお付き合い頂きありがとうございました!
日程調整の多重割り当て支援ツール

スケジュールがそれぞれ違う学生に対して，スケジュールがそれぞれ違う学生から実験協力を依頼する・・・という多対多の日程調整を効率化するために作った．
こんなの本来はbotの仕事であって人間の仕事じゃない（半ギレ）

GitHub→[https://github.com/sh141/Multiple-Schedule-Adjuster](https://github.com/sh141/Multiple-Schedule-Adjuster)
※MITライセンス．Windows用にexeも置いたが，詳細な動作確認はしてない

# こんなときに使える
使うとこんな感じ．
![msa01.jpg](https://qiita-image-store.s3.amazonaws.com/0/201962/0e6edfdd-2f3f-d67a-ee70-cbd67745438d.jpeg)

北海道さん～神奈川さんまでの14人に，Aさん～Jさんまでの10人が実験協力依頼をする，という構図．

- A～Jは実験内容が様々で，「3人同時にやりたい」とか「1週間空けて2度やりたい」とか条件がある
- 一方の北海道～神奈川も全日出られるわけではなく，日によって講義やバイトがある
- 「何日の何限に誰が空いてるか」は整理できた．が，依頼する側とされる側の条件を満たしつつ実験協力を割り当てるのはつらい

例えば依頼する側のA～Jが全員「4人欲しい！」と要求したら，必要な回数は40回．

北海道～神奈川に理想的な割当ができても，1人平均3回以上の協力をしなければいけない．

# 楽になること
以下の恩恵を受けながら，アプリ上で割当表を編集・試行錯誤できる．
#### ★被割当者（北海道～神奈川）の負担数計算
アプリの「負担表」には，被割当者ごとの負担数が計算される．  
上図では北海道の負担数が4, つまり割当者A～Jのうち4人分の実験に協力するということ．  
「できる人が何人分でもやればいいじゃん」の環境なら不要だが，
「できるだけ負担を平等にしたい」とか「低負担にすることで確実に協力させたい」という場合は役立つ．  

#### ★重複割当の回避
上図の割当日程表（割り当て日程の一覧）には，「何日の何限に誰が協力するのか」がまとめられている．   

同日程に割当が重複しないように頑張らねばならないが，人間なので手動ではどうしてもミスる．  

そこで，もうアプリ側で重複者を出させている．上図なら，11/28の5限にある東京がA,F両方から割り当てられており，ダブルブッキング状態なのがすぐわかる．

# 欠点
- 割当表で名前を書き間違えると，負担表にカウントされない（別人扱い）
- 割当表では「時間帯」を考慮できない：例えば9:00～11:00の中で30分はA, 1時間はBに割当・・・は無理
- CSVで「何か書いてある列」までしか使えない：何日程も使いたい場合は，上図の「割当1」みたいに，1行目に何か書いておく必要あり
- 一時保存・上書き保存は無い：逐一CSV出力しとかないと，頑張ってる途中で落ちたらパー

# 使い方
##①
上図のような形式で「割当表」，「負担表」それぞれのCSVを用意して読み込む（文字コードはShift-JIS?）  
例えばこんなの↓

【割当表】

|割当者|割当1|割当2|割当3|
|---|---|---|---|
|A||||
|B||||
|C||||
|D||||

【負担表】

|被割当者|負担数|
|---|---|
|北海道||
|青森||
|岩手||
|宮城||

##②
割当表の準備ができているなら「割当実行」ボタンを押す．負担表には負担数の計算結果が追記され，割当日程表が表示される．必要ならこの割当日程表を保存できる  
割当表をこれから編集する場合は，割当表に直接書き込める．上図のように「日付，時間，名前，名前，...」と書いていく

##③
割当表を編集→割当実行→負担数や日程重複を確認しながら，完成するまで試行錯誤

実際に試行錯誤してみるとこんな感じ．
![msa.gif](https://qiita-image-store.s3.amazonaws.com/0/201962/36c379c8-56db-49b6-230f-f274a451706d.gif)

# おまけ（仕事にも使える？）
やったことはないが，割当パターンを「人×人」でなく「仕事×人」にすることもできそう．
（日程を順番通りにしてほしいな・・・）
![msa02.png](https://qiita-image-store.s3.amazonaws.com/0/201962/09c56d07-55c0-8990-bf34-96b10921c649.png)


# 感想
ICT利用の目的は自動化，という基礎概念をいい感じに使えたと思う．
恐らく「全員の日程や希望人数をもとに総当たりで最適な割当案を出す」ツールも実現できそうだが，作るのがつらすぎて無理．
Dockerメモ


## Dockerfile


https://qiita.com/pottava/items/452bf80e334bc1fee69a

https://qiita.com/soushiy/items/0945bcbc7ecce4822985

### COPY/ADD

https://qiita.com/miumas/items/4a3b6183f2e3fb8e4e53

COPYやADDで指定する、ホストOS側のディレクトリパスはDockerfileからの相対パスを指定する。
絶対パスを指定するとエラーとなる。

### ARG

`docker build`コマンド実行時に、コマンドラインパラメータから受ける値を設定します。

```dockerfile
# コマンドパラメータから受付ける変数
ARG MYMESSAGE

# 変数の値を出力
RUN echo $MYMESSAGE
```

コマンドラインパラメータの指定方法は次の通り。

```bash
docker build --build-arg MYMESSAGE="Hello!"
```

## dockerコマンドメモ

https://qiita.com/curseoff/items/a9e64ad01d673abb6866

### 複雑化するDockerfile

    気がつくと、なんで複雑になってるんでしょうか

https://qiita.com/port-development/items/8ab04aee45dc7f5f96ab

最近は、MultiStageビルドができるようになったので、Dockerイメージの再利用がしやすくなっている。

## Kafka

### Kafkaのイメージを使う方法。

https://qiita.com/jagaximo/items/511a83fe23000a559c25

### KafkaとzookeeperをDockerComposeを使って動かす。

https://qiita.com/masato/items/a13277842c245745c29b

## AspNetCore

https://www.maherjendoubi.io/asp-net-core-2-0-in-docker/
chrootとDockerの使い分け

## chrootとDocker(LXC)の違いって？
### chroot
#### メリット
 * ホストからファイルシステムが隔離される。（パッケージが分離できる。）
 * ルートを移動するだけなので、ホストからはそのまま参照できる。
 * 固めれば、容易に環境が移動できる。（環境の共有が可能）
 * 導入が簡単 or 初期で導入されてる。

#### デメリット
 * ユーザーランドがすべて隔離されるわけではない。(プロセスなどがホストと共有)
 * Linuxでしか使えない。（BSDはJail）

### Docker
#### メリット
 * ユーザーランド全体が隔離できる。
 * Exportで容易に環境が移動できる。(環境の共有が可能)
 * 仮想化技術との連携でLinux以外で動かせる。 (※ WindowsはWindows Containerができたのでそのまま使える。

#### デメリット
 * Dockerを導入しないといけない。
 * Version/Distributionによっては導入できない。


## 運用案
### 開発環境はchrootで簡単に
 * 開発初期段階など、構成変更が激しいタイミングなどはchrootでやると楽？
 * 一時的な開発参入はchrootでお手軽に？
 * データのやり取りが激しい時はchrootで意識せずに開発？

### 評価環境/本番環境はDockerで厳密に
 * ユーザランドが完全に隔離されるDockerを本番では使う。
 * 評価環境は本番環境に合わせる。
 
## chrootとDockerの切り替え
### Dockerからchrootへの切り替え
1. DockerのImageをexportする。
2. exportしたImageを展開する。
3. 展開先にchrootでアクセスする。

``` bash
docker save > [filename.tar]
tar -xvfp [filename.tar] -C [path]
chroot [path]
```
### chrootからDockerへの切り替え
1. chrootのディレクトリをtarに固める。
2. Dockerでインポートする。

```bash
tar -cvfp [filename.tar] [path]/*
cat filename.tar | docker import - [filename.tar] REPOSITORY[:TAG]
```
何も知識無くエンジニアになって一年半の記憶

#はじめに
私が昨年四月にエンジニアの門を叩いて早一年半が経ちました。
元々完全なゼロ知識で飛び込んだ世界で、何とか今まで底辺でもエンジニアとして歩み続けています。

私のように社会人からエンジニアを始める方はこれからも多くいると思います。
そんな人たちへ少しでも勉強や教育の助けになれば良いなぁとか思いながら経験や感想などをお伝えできれば。
#経歴
最初に簡潔に今までの経歴を説明します。
###入社前
大学は農学部生命科学科、研究室は食品機能科学領域
勿論PCは論文用にOfficeを使う以外では全く活用せず
研究でも機械類は少なく、針で線虫をひたすらに突いておりました。
そんな中、偶然が多重に重なった結果昨年の四月に就職し、エンジニアとして働き始める事となりました。

###四月～九月
当然研修から始まります。
同じエンジニアの同期と共に先輩に付きながらPHPの勉強とITパスポートの資格取得を並行して約五ヵ月。
PHPはお馴染みHello Worldをechoで出力する所から始まり、最終的にfuelPHPを使った軽いサイト作成まで。

###十月～一月
社内インフラのお手伝いとして勉強していました。
Gitのお掃除、監視ツールの設定等々。
合間に社内のセキュリティソフトや在庫の管理を行っていました。

###二月～現在
再びPHPでプログラミングをしています。
初めてプロジェクトにアサインして、管理画面を弄りながら今この記事を記入中です。

#役立った経験
経験してきた中で今私の役に立っていると思う経験を幾つか紹介します。

###ITパスポート
かなり初歩的な資格です。
持っていて当たり前、持っていても注視されない資格であまり取得するのにお勧めされないかもしれません。
ですが、PCの知識が全くない状態でこの資格を勉強するともれなく基礎的な単語を殆ど知ることができます。
実際に入社当時の私はメモリ、CPUといった単語でさえも良く分かっていませんでした。
そんな人にとってITパスポートの勉強はエンジニアの初動として知識を得るためにとても良い資格だと思います。

~~まぁ、先に取っておけば良いじゃんと言われたらそれまでなんですが…~~
###インフラ
完全に自分の主観になりますが、この期間が無いと今でもターミナル画面での操作に忌避感を抱いていたと思います。
勉強として何度かサーバーを建ててmysqlやnagios,grafana等のツールのインストール、設定を弄るうちに少しずつですが忌避感が無くなっていきました。

ターミナルでの操作はプロジェクトに入ってからも様々な箇所で関わっています。
そんな中で忌避感無くすらすらと触れることは作業の効率を上げるうえでも大事なものです。
最初はあの黒い画面がとても怖いですが、少しずつでも触れる事が後程大きく役立つと思います。
###PC管理等の雑用
こちらも自分の主観が強いですが、社内のPCの管理で私は社内の人の把握ができました。
只でさえ椅子に座ってPCとにらめっこする時間が長いのに、勉強期間となるとどうしても周りと関わる事がありません。

そんな中、色々と社内中を歩き回り他の方と話す機会が増えたことで、相手にも私を覚えてもらい私も色々と頼られる事が多くなりました。
新卒かつ初心者にとって会社で人の役にたっていると感じる事はとても難しい事です。
役立たずだと自分で思い続ける中で少しでもプラスの感情を向けて貰える機会はとても貴重なものとなります。

#終わりに
最後になりますが私の環境はとても恵まれていると思っております。
何も知らない私に基礎を教えてくれた方々、色々と迷惑をかけながらも教えて下さる先輩方、気軽に話せる同期等々...
私が未だにエンジニアとしているのもこのような人たちが周りにいる環境があってからこそだと思っています。

社会人からエンジニアになる人は多くが第一希望としてなったわけではないと思います。
就きたい職業につけなかったと悲観している上に周りとの格差ですぐに諦めて辞める人も多いのだと思います。
そんな心が折れそうなときに偶然自分の記事を見て、同じ境遇でもまだ生き残ってる人がいるんだと感じて少しでも元気になってくれたら幸いです。

#追記
余りにも只のエッセイになってたので技術的な事も色々…
##使用ツール
###NetBeans
IDE(総合開発環境)の一種です。
使ってる人をあまり見かけないツールですが、導入が楽だったので使っています。
よく固まる以外は特に不満点はないです。

IDEは殆どの場合先輩たちのお勧めが存在します。
則っていない自分が言うのもなんですが、**正直周りの人が使ってるIDEを使用するのをお勧めします。**
使い方とか、設定とかもの凄くめんどくさいです。
###MySQL Workbench
DB用の統合ビジュアルツールです。
こちらはNetBeansと違い使ってる人も多いツールです。
クリック操作で簡単select！データの確認も楽々安心！
今年の6月ぐらいに導入した時は感動したものです。(それまではコンソール画面)
##ツールの設定
正直慣れない、知識もない時に設定を弄るのはお勧めしません。
変に設定を触るよりも自分がデフォルトの状態に慣れていく方が良いと思います。
変に弄ると元に戻したくても、何が要因でそうなってしまったか分からなくなり戻せなくなります。
足りなくなったら随時追加、変更していくのをお勧めします。
[Ruby]後読みを使ったsplitで句点(。)を残したまま文に分割

初投稿になります。

#  はじめに
Rubyで文章を一文ずつに分割して配列にしたい場合、
`String#split`を使って句点`'。'`で区切ってやればいいですが、区切り文字として使った`'。'`が消えてしまいます。

後ろにまた付け直すこともできますが、面倒です。

```Ruby
text = 'おはよう。こんにちは。こんばんは。'

text.split('。')
# => ["おはよう", "こんにちは", "こんばんは"]

text.split('。').map{|s| s + '。'}
# => ["おはよう。", "こんにちは。", "こんばんは。"]
```
# 正規表現で後読みを使う
これには、`String#split`に正規表現で「肯定的後読み」`(?<= )`を使ってやれば、区切り文字`"。"`を消さずに分割できます。

```Ruby
text = 'おはよう。こんにちは。こんばんは。'

text.split(/(?<=。)/)
# => ["おはよう。", "こんにちは。", "こんばんは。"]
```

# scanメソッドでもできる
ちなみに`String#scan`を使ってもできます。

```ruby
text = 'おはよう。こんにちは。こんばんは。'

text.scan(/.*?。/)
# => ["おはよう。", "こんにちは。", "こんばんは。"]
```
こちらのほうが簡単ですね。
# 参考にしたサイト
[正規表現の先読み・後読みを極める！](https://abicky.net/2010/05/30/135112/)
2017年11月度 勉強会で取り組んだ事項


[Nagoya.Swift+ 11月度勉強会 - connpass](https://nagoyaswiftplus.connpass.com/event/53943/)で取り組んだ事項についての紹介記事です。

# 内容

1. Swift
2. Web開発

# Swift

これが一番楽しかった内容になるとはそのとき誰も思っていなかったのです…。

チュートリアル
------------------------------------------

アップル公式のものをいくつか。[Guides and Sample Code](https://developer.apple.com/library/content/navigation/#section=Resource%20Types&topic=Guides)には莫大な量がありますよね…。

* [The Swift Programming Language (Swift 4.0.3): A Swift Tour](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.html)
* [Start Developing iOS Apps (Swift): Jump Right In](https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/)

日本語のものもiBooksでたくさん出ていました。

* [Swiftによるアプリケーション開発:入門編”（著者: Apple Education）]( https://itunes.apple.com/jp/book/swift%E3%81%AB%E3%82%88%E3%82%8B%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-%E5%85%A5%E9%96%80%E7%B7%A8/id1209648719?mt=11)

* [0からはじめる Swiftで作るクイズアプリケーション”（著者: 岳野研究室） ](https://itunes.apple.com/jp/book/0%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B-swift%E3%81%A7%E4%BD%9C%E3%82%8B%E3%82%AF%E3%82%A4%E3%82%BA%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3/id1272971482?mt=11)

ライブラリ
------------------------------------------

iOS向けのフォーム作成ライブラリを紹介いただきました。見た目が本当にいい感じ。

* [xmartlabs/Eureka: Elegant iOS form builder in Swift](https://github.com/xmartlabs/Eureka)

RxSwiftを利用されていたのは正直驚きました。Reactive Programingを協力にサポートするライブラリです。

* [ReactiveX/RxSwift: Reactive Programming in Swift](https://github.com/ReactiveX/RxSwift)

設計
------------------------------------------

クリーンアーキテクチャとは何か議論になりました。これが一番熱い内容になりました。

* [持続可能な開発を目指す ~ ドメイン・ユースケース駆動（クリーンアーキテクチャ） + 単方向に制限した処理 + FRP - Qiita](https://qiita.com/kondei/items/41c28674c1bfd4156186)

* [The Clean Architecture | 8th Light](https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html)

* [まだMVC,MVP,MVVMで消耗してるの？ iOS Clean Architectureについて - Qiita](https://qiita.com/koutalou/items/07a4f9cf51a2d13e4cdc)

* [[iOS] コードで覚えるクリーンアーキテクチャ 〜VP部分を書いてみよう〜 ｜ Developers.IO](https://dev.classmethod.jp/etc/getting-used-to-ios-clean-architecture-vp-pattern-with-code/)

* [iOS CleanArchitectureを使ってみた感想 - hachinoBlog](http://hachinobu.hateblo.jp/entry/2016/10/13/222316)

「結局どういう実装になるのか？」については次回取り組んでみようと思います。


JavaでのWebアプリ開発
==========================================

Java (JSP) + MySQL + HTML(HTML + JS + CSS)の構成でのWebアプリ開発に取り組まれてました。

MySQLのインストール
------------------------------------------

上記の環境を構築するために、MySQLをmacOSにインストールしていくときにハマりました。DBへのログインができなくなり、アンインストール不可になり、Homebrewでインストールしなおしても呼び出せなくなり…。結果的にはVagrantで仮想マシンを立ち上げてインストールしていました。仮想環境強い。


# 次回予告

次回は12/16(土)の予定です。

* [Nagoya.Swift+ 12月度勉強会 - connpass](https://nagoyaswiftplus.connpass.com/event/53945/)
FileMaker の API (Web API) の使いどころ

※私はまだ FileMaker 16 に触れられていません[^1]

# FileMaker API (Web API) の使いどころ
FileMaker には API が用意されています。ここではそのうちいわゆる Web API に的を絞って話を進めることにします。以降、この Web API を単に API と記述します。

API を利用することで HTTP を用いてデータを取得することが可能になります。直接 Web ブラウザでリクエストをしてもブラウザ内に返り値が表示されるだけでそれを利用することは難しいですから、一般的には裏側（サーバサイド）でデータ取得のために使用することが考えられます。

それを踏まえて、API はどこでどのように使えば効果的なのでしょうか。

#### FileMaker Server にあるデータを外部に出す場合
FileMaker Server にあるデータベースからデータを取り出す場合に API を使うことが考えられます。特定の検索条件に一致するデータを CSV で書き出すような場合ですね。

……🤔

それ、FileMaker 単体でできませんか？

今年のアドベントカレンダーなどを見てみると、FileMaker のデータを API を用いずに柔軟にエクスポートする手法はいくつか存在するようです。そしてそれらは API に比べて以下のようなメリットを持っています。

- PHP やら Ruby やら XML やらの知識が不要
- 上記の環境を構築することも不要
- 処理速度が速い
- 開発コストも（相対的に）低い


#### FileMaker を Webブラウザ で操作したい
API を用いて最近流行りの Rails やら Laravel やら Vue やら React やらのフレームワークを使えばオシャレなウェブアプリが作れて、Webブラウザ 経由で FileMaker が操作できますね！

……🤔

それ、[FileMaker WebDirect](https://fmhelp.filemaker.com/docs/16/ja/fmwd/) でできませんか？[^5]

#### 「REST API」を用いずに「カスタム Web 公開」の API を用いる
この項は少し趣旨が異なります。

FileMaker 16 では [REST API がサポートされましたが](https://fmhelp.filemaker.com/docs/16/ja/restapi/)、旧来の「[カスタム Web 公開（PDF に直リンク注意）](https://fmhelp.filemaker.com/docs/16/ja/fms16_cwp_guide.pdf)」も利用できます（＝PHP や XML で API を扱う）。

……🤔

あえて、「カスタム Web 公開（＝PHP や XML で API を扱う）」を使う必要はありますか？[^2]

# ではどこで API を使えば？
これまで挙げた内容を見ると、API を使わなくても代替手段がありそうで、しかもそちらの方がコストが低そうです。

では API はどのようなときに使うと良いのでしょうか。私は、2つの場合があると考えています。

1. FileMaker 内のデータを用いて、一定以上の複雑なことをリアルタイムで行う場合
2. FileMaker 内のデータを用いた処理の開発を継続的に行う場合

それぞれ見ていきます。

#### 1. FileMaker 内のデータを用いて、一定以上の複雑なことをリアルタイムで行う場合
例えば、一分おきに売上データを取得し、それを加工して集計し、さらにその結果を Slack にポストするような場合です[^3]。これを FileMaker 内で完結させるのは少々面倒でしょう。

#### 2. FileMaker 内のデータを用いた処理の開発を継続的に行う場合
開発が継続的に行われる場合はリソースの「バージョン管理」が必須です。FileMaker のスクリプトは外に出すことが（今のところ）できませんので、継続的な開発が行われる場合は FileMaker から独立して利用できる API を用いて Git でリソースのバージョン管理を行う方が生産性が高くなるでしょう。

# 結論
ここまで書いてて何ですが、やはり状況に応じて使い分けることが最適ですね。どれが良い悪いではなく、必要なコスト（お金、時間、人数……）を考慮して最善な方法を選択するのが大切だと思います。そしてそのためには選択肢を多く持っておくということは大事なことでしょう[^4]。

# 余談
この記事のようなネガティブな要因があるために、API についてはあまり盛り上がっていないのかなと思ってます。

[^1]: ここ結構大事です
[^2]: これについては、過去の資産の問題や、そもそもバージョンが 16 でないと REST API が使えない、などがあると思うので、少々複雑かとは思います
[^3]: 一分おきはやりすぎかもしれませんが、例として
[^4]: 選択肢がないと一つの手法に依存して固執してしまうので危険です
[^5]: オシャレではないかもしれないけれど
テキストコンソール上に簡易的なグラフを書く

分解能は荒いし、車輪の再発明感がすごいが、Windowsでも動く

![image.png](https://qiita-image-store.s3.amazonaws.com/0/191114/32d71932-73f3-a142-aa95-4991072668d7.png)

```python
# -- coding: utf-8 --
import math
import time

ymax = 20

max_points = 100
max_value = 3000.0
min_value = 500.0

def TextChartShow(pdat,max_value,min_value,ymax):
    print(max_value)
    for y in range(ymax):
        for xd in pdat:
            if(xd < ymax-y):
                if(y==ymax-1):
                    print("_",end='')
                else:
                    print(" ",end='')
            else:
                print("█",end='')
        print("")
    print(min_value)

def TextChartMake(plots,max_value,min_value,ymax):
    pdat = []

    for point in plots:
        pdat.append(int(((point-min_value)*(ymax/(max_value-min_value)))))
    return pdat;

def TextChartPlotsAdd(point_in,plots,max_points):
    plots.append(point_in)
    if(len(plots) > max_points):
        plots.pop(0)
    return plots


##リアルタイムに正弦波を書くサンプル
plots = [0]
i=0
while True:
    i=i+1
    point_in = math.sin(i*0.1)*1000+2000
    print(point_in)
    plots = TextChartPlotsAdd(point_in,plots,max_points)
    pdat = TextChartMake(plots,max_value,min_value,ymax)
    TextChartShow(pdat,max_value,min_value,ymax)
    time.sleep(0.1)
```
私の好きなGUの靴

![kutu.png](https://qiita-image-store.s3.amazonaws.com/0/215615/5122c4fd-6472-5875-cea8-73cb8792d525.png)

この靴は、数か月前にGUで買った靴です。
なんと1480円！（しかも私は免税で買いました。）
私が普段買っている靴は3000円前後なので、なんと半額です。
昔はユニクロによく行っていたのですが、最近高く感じて、GUにシフトしました。
（ちなみにグレーのズボンはユニクロ製）

見た目は(1480円にしては）悪くないと思うし、履き心地も悪くありません。
ただ、、
少し足が汗をかきやすく、通気性が他の靴より少ないかもしれません。

しかし、1480円の靴に全てを求めるのはむりな話です。
そこそこの見た目と履き心地なので、
使い方を選べば十分使える靴だと思います。

-寒いところで履く
-短時間の外出
-自転車に乗るとき用
など

エキサイトはフィリピンのマニラに開発子会社を持っていて、私は現在フィリピンのマニラでブリッジSE兼開発マネジャーをしています。
フィリピンの平均年齢は23歳。平均年齢45歳の日本とは全く違う、若者の国、これからの国です。 
フィリピンの強みは英語が出来ることと、若者がたくさんいることです。 
逆に、課題の一つは若者はたくさんいるけど、職が十分に無いことです。 
私たちはソフトウェア会社の立場から、若者にスキルを与えて優秀なエンジニアに育て、そのことを通じてフィリピンの社員とフィリピン社会とクライアントに貢献することを目標にしています。

マニラでは大卒初任給は日本の2割弱です。
ただソフトウェアエンジニアはフィリピンでは高度専門職で、同年齢の総合職/営業/会計士などより高い給料を得ることができます。
そのため、数年も経験すると、あっというまに倍以上の給与になるのですが、
それでも日本よりはずっと人件費の安い国です。

この若者の溢れる国に、私は5年前に来ました。
人の能力に国によって、そんなに違いがあるはずはないから、地頭のよい若者を採用して鍛えれば、よい開発チームが作れるに違いないと、、当時は思っていました。

実際、そんな甘くはありませんでした。
フィリピンでソフトウェアエンジニアになる人は全員情報系の学部を出ています。
ですのでプログラミングの基礎は知っていますし、学ぶ力もあります。
英語の技術資料も読めます。

では何が難しいのかというと自走する力、品質管理、生活指導に関する部分と、
曖昧な仕様から製品を作らないといけない部分です。（これが必要能力かは議論の余地があるかとは思います）
日本の企画職の人から、サービス仕様を正確に資料に落とされてくることがあまりないのですが、
多分日本では、それでも開発ができてるのだと思うので、そこをなんとかするのは難儀しています。

このへんを語ると、すごく長くなるので、割愛しますが、
日本の開発マネジャーの仕事を実業団のコーチとすると、私は中学のサッカー部のコーチをしているような感じと思っています。

私は5年たっても、いまだ四苦八苦していますが、
1480円の靴を履きながら、自分も、この靴のように安価でも、まずまずの製品を提供できるようマニラで開発を続けていきたいと思います。




ちなみに、オフショア開発に向くのは、こんな仕事を出したい時です。
-管理・運用ツールの開発（非重要部分を安めの外注に）
-大きな開発が終わった後の、小規模改修が続く運用フェーズ（自社の技術者にさせたら飽きて辞めちゃう）
-中難易度までの新規開発（日本より安く作れやすい）
-プロトタイプ版の作成（完全じゃなくても安く）
-英語の技術資料を参照して作ってほしい時（フィリピンオフショアの場合です）
-ソースだけあるけど、調べてドキュメント化してほしい

逆に向かないのはこんなケース
-短納期での制作
-頻繁な仕様変更/更新にすぐに対応してほしい
-セキュリティ要件が高い
-指示ドキュメントは作りたくない
-おおまかな指示で、細部はよろしくうまく作ってほしいケース

ちなみに人月単価は月29万円位～　（エンジニアランクによる）
オフショア開発の発注に興味がありましたら、
[こちら](http://ja.excite.ph/)からお問い合わせください。
現在はPHPとionicのエンジニアに多少空きがございます。
正規表現関連の便利メソッド


## はじめに

この記事は書籍「[プロを目指す人のためのRuby入門](http://gihyo.jp/book/2017/978-4-7741-9397-7)」に掲載できなかったトピックを著者自らが紹介するアドベントカレンダーの14日目です。
本文に出てくる章番号や項番号は書籍の中で使われている番号です。

今回は正規表現関連の便利メソッドを紹介します。

### 必要な前提知識

「プロを目指す人のためのRuby入門」の第6章まで読み終わっていること。

## 正規表現関連の便利メソッド

Regexpクラスにも便利なメソッドがあります。ここでは以下の2つのメソッドを紹介します。

- `Regexp.union`
- `Regexp.escape`、`Regexp.quote`

### Regexp.union

`Regexp.union`メソッドは2つ以上の正規表現をOR条件（`|`）で連結し、1つの正規表現として返します。

```ruby
zip_code_regexp = /\d{3}-\d{4}/
phone_number_regexp = /\d+-\d+-\d+/
date_regexp = /\d+年\d+月\d+日/

# 3つの正規表現をOR条件で連結する
regexp = Regexp.union(zip_code_regexp, phone_number_regexp, date_regexp)
#=> /(?-mix:\d{3}-\d{4})|(?-mix:\d+-\d+-\d+)|(?-mix:\d+年\d+月\d+日)/

text = <<-TEXT
郵便番号は123-4567です。
電話番号は03-1234-5678です。
生年月日は1977年7月17日です。
TEXT

text.scan(regexp)
#=> ["123-4567", "03-1234-5678", "1977年7月17日"]
```

### Regexp.escape、Regexp.quote

`Regexp.escape`メソッド（エイリアスメソッドは`Regexp.quote`）は文字列中のメタ文字をバックスラッシュでエスケープして、メタ文字の意味を打ち消します。

```ruby
# +や*は正規表現のメタ文字なのでエスケープする
pattern = Regexp.escape('1+2=3,2*3=6')
pattern
#=> "1\\+2=3,2\\*3=6"

# 上で作った文字列を変数展開した正規表現を使う
'1+2=3,2*3=6' =~ /#{pattern}/
#=> 0
```

## 次回予告

次回はprivateメソッドとインデントのスタイルについて議論します。
stanにBurr Type Xii Distributionを実装してみる

タイトル通り、stanにBurr Type Xii Distributionを実装してみる。
(以下簡略化のためBurr分布と略する。また話の都合の上、{actuar}パッケージの表記に従うものとする)
Burr分布[0,+∞)にて連続かつ単調減少の裾の重い分布。
三つのパラメータ$\alpha$,$\gamma$,$\theta$からなっており、その確率密度関数$f(x;\alpha,\gamma,\theta)$は

$$
f(x;\alpha,\gamma,\theta)=
\frac{\alpha\gamma(\frac{x}{\theta})^{\gamma}}
{x[1+(\frac{x}{\theta})^{\gamma}]^{\alpha+1}}
$$

となっている。
n個の観測値がこのBurr分布より得られたものとすると、その対数尤度を$l$とすれば、
$$
l=n(log(\alpha)+log(\gamma)-log(\theta))+(\gamma-1)\sum_{i=1}^n log(\frac{x_i}{\theta})-(\alpha+1)\sum_{i=1}^n log(1+(\frac{x_i}{\theta})^\gamma)
$$
となる。
このBurr分布をstanに実装してみる。


#

```
burr_code <- "
functions{
 real Burr_type12_lpdf(real y, real alpha, real gamma, real theta){
  return( log(alpha)+log(gamma)+gamma*log(y/theta)-log(y)-(alpha+1)*log(1+(y/theta)^gamma) );
 }
}

data { 
  int<lower=0> N; 
  real y[N]; 
} 
parameters { 
  real<lower=0> alpha;
  real<lower=0> gamma;
  real<lower=0> theta;
} 
model { 
  for(t in 1:N){
   y[t] ~ Burr_type12(alpha,gamma,theta); 
  }
} 
"
```

このコードを使って実際に{actuar}パッケージrburrから得られたデータを基に各パラメータを推定してみよう。

```
install.packages("actuar")
set.seed(3141592)
y<-rburr(500,2,3,1)
data<-list(y=y,N=length(y))

burr<-stan(model_code=burr_code,data=data,seed=3141592,chains=4,warmup=1000,iter=3500)

print(burr)
```
![burr.PNG](https://qiita-image-store.s3.amazonaws.com/0/218987/4d9aa6b2-f93d-f5a8-49fe-605f240077b4.png)

まずまず良い結果が得られたのではないだろうか。

#参照
・<a href="https://en.wikipedia.org/wiki/Burr_distribution">wikipedia Burr Distribution</a>
・<a href="https://cran.r-project.org/web/packages/actuar/actuar.pdf">Package 'actuar' - CRAN.R-project.org</a>
文系大学生エンジニアのススメ

# はじめに
これは今年の4月に大学に入学して、とある学生団体に入ったことがきっかけで、プログラミングを始め、８ヶ月経った男の話である。この記事は同じく学生でエンジニアをしており、もしくはエンジニアになりたい人向けの話である。
　
学生エンジニアをする上で一番大事だと感じたことは、
### **とにかくアウトプットをすることである。**
~~あえて言おう、アウトプットしない奴はクズであると。~~
これは学生エンジニアに限ったことではないが、学生エンジニアはその機会に特に乏しく、軽視しがちである。夏までの自分はまさしくそれで、それに気づいて以降は割と楽しくも様々な刺激を受けながらエンジニアリングしてくることができたからである。
#８ヶ月エンジニアをしてやったこと

- gitの使い方を覚えた
- 色々な言語の環境構築をした（してもらった）
- 色々な言語でhello worldを何も見ずにかけるようになった
- 自分のHPを作った
- 様々なイベント、勉強会に参加した（計十五回ぐらい？）
- bootstrap,jqueryを使ってものを作った
- githubの使い方を覚えた
- rails tutorialを３周した
- 色々なエンジニア（学生、社会人）、社長と出会い、知り合いになった
- railsでものを作った
- emacs keybindを覚えた
- プレゼンの資料作り、話し方がめちゃうまくなった
- ハッカソンに出て審査員賞×２もらった
- インターンに受かった
- 業務のエンジニアリングを体験した（している）
- githubのcontributionが４００いった
- qiitaに記事５本投稿した
- 直にmasterにpushする経験をした（戦犯）
- 企業の際１０００万の投資の権利を頂いた
- 彼女と別れた

#ありがちな例
基本的にプログラミングを始めるときに、[progate](https://prog-8.com/)や、言語のチュートリアルをやる、bootcampに参加する、その他のプログラミングの通信教材的なものを使って学ぶことが多いと思う。これ自体は非常に素晴らしいことだし、やるべきことだが、それに１ヶ月、２ヶ月、３ヶ月あるいはそれ以上をかける、またはそこから何一つ進まないのは問題である。
**問題点**
- 時間がかかっている分、最初にやったことがあやふやになる
- やった気になる（正確にはやっている最中はやってる感バリバリだけど、終わったら身についていない）
- 不特定多数に公開することができない（場合が多い）
#結論：やっぱりアウトプットを常日頃からしていく
- **何かをやったらなるべくgithubにあげよう**
- **githubの草を生い茂させる**
- **何かをやったらqiitaに記事を書こう**
- **何かを学んだらなるべく、それを応用して何かを作ろう（特にwebサービス、ゲーム系）**

###　目に見えて何かできるだけでだいぶ周りの評価は変わります！

この記事の内容は私が私の先輩から毎日のように言われてきた言葉です。その先輩方に感謝を込めてこの記事を終わりたいと思います。いつもありがとうございます。
Selenium Continuous Integration with Jenkins [Selenium – Maven – Git – Jenkins] – Step By Step Guide

**Selenium Continuous Integration with Jenkins [Selenium – Maven – Git – Jenkins] – Step By Step Guide**

http://www.softwaretestingmaterial.com/selenium-continuous-integration/

In this post, I am trying to keep complete guide of Selenium Continuous Integration (End to End Integration) with Jenkins. This is a guide to implementing Continuous Integration with Jenkins, Maven, and TestNG with GitHub. There are lots of tools and techniques that can be integrated in a CI environment. Here I am using Selenium WebDriver, Java, TestNG, Maven, and I integrate these with Jenkins. To implement continuous integration, follow the 9 steps which I mentioned below.

What is Continuous Integration?
Continous Integration is abbreviated as CI. Continuous Integration is a development practice which aims to make sure the correctness of a software. After each commit, a suite of tests run automatically and tests a software to ensure whether the software is running without any breaks. If any test fails, we will get immediate feedback say “build is broken”.

In simple words, continuous integration is a process of verifying the correctness of a software.

Continuous Integration

Some of the continuous integration tools are Jenkins, TeamCity, Bamboo, Travis, CircleCi, Bitbucket, CruiseControl

What is Maven?
Maven, a Yiddish word meaning “accumulator of knowledge”. Maven is a build automation tool used primarily for Java projects. It helps in building software, it describes how software is built and it describes its dependencies. It dynamically downloads Java libraries and Maven plug-ins from one or more repositories such as the Maven 2 Central Repository, and stores them in a local cache. We use maven in Selenium as a build tool or project management tool. It helps in managing all project dependencies and ensure an easy build process.

Main Objectives of Maven are as follows:

Making the build process easy
Providing a uniform build system
Providing quality project information
Providing guidelines for best practices development
Allowing transparent migration to new features
So far we have learned what is Continuous Integration and what is Maven. If you are sitting at your system and trying to implement then let’s get started to implement the below mentioned 9 Steps.

STEP 1: Open your Eclipse IDE to start building a maven project
STEP 2: Installing Maven in Eclipse
STEP 3: Create a new Maven Project in Eclipse
STEP 4: Install GIT in Eclipse and Adding (Uploading) Maven Project to GitHub
STEP 5: Install Jenkins
STEP 6: Configuring Jenkins for a Maven Project
STEP 7: Configuring GIT Plugin in Jenkins
STEP 8: Create Maven Project in Jenkins and build a job from Git Project 
STEP 9: Executing Maven Project From Jenkins

Read the complete article here: http://www.softwaretestingmaterial.com/selenium-continuous-integration/
Docker for Windowsでマウントする

#目的
Docker for Windows をWindows10で利用しており、
ubuntuのコンテナを利用中。
ローカルからubuntuコンテナ内のファイルを直接操作したいので、
Dockerのubuntuコンテナ内のディレクトリと
ホストのディレクトリを共有する。

#方法
ホスト側のディレクトリを、コンテナ側のディレクトリにマウントする。
docker runでコンテナを作成する際に、-vオプションでマウントできる。

docker run -v {ホスト側ディレクトリ}:{コンテナ側ディレクトリ} -itd --name {コンテナ名} {イメージ名}


#実行
```
$ docker run -v /c/Users/{ユーザディレクトリ}/Documents/workspace:/data/workspace -itd --name ubuntu-aaa ubuntu-image

```


#できない
Kitenaticからコンテナを見ていて、設定はできていそうなのに
ホスト側のファイル（test.txt）がコンテナに現れない。
コンテナ側でファイルを作成してもホスト側に表示されない。

#DockerのSettingsを確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114697/c4bce234-364c-ae0b-4a26-179d3e57d16b.png)
Shared Drivesで、Cドライブにちゃんとチェックが入っているのを確認し、
もう一度「Apply」をクリック。
Docker自体再起動する。

#コンテナ確認

```
$ docker attach ubuntu-aaa
root #  ls /data/workspace
test.txt
```
マウントできた！


#参考：
[Docker for Windowsでホストにマウントできないときの対処法](https://mosapride.com/index.php/2017/02/16/post-70/)
Unityエディタ拡張で、Componentを削除する。



## 下記AnimationコンポーネントをUnityエディタ上で削除する場合

```extension.cs

if (gameObj.GetComponent<Animation>()) //Animationコンポーネントが存在するか
{
	// Destroy(gameObj.GetComponent<Animation>());  // -> 消せず、、
	// GameObject.Destroy(gameObj.GetComponent<Animation()); // -> 消せず

	Animation animComponent = (Animation)gameObj.GetComponent<Animation>();
	GameObject.DestroyImmediate(animComponent); // -> 消せた
}

```

DestroyImmediateを使うと即座に消える。
Tutorial: On-Demand Test Environments With ANSIBLE and Shippable

One of the biggest challenges to implementing an end-to-end Continuous Delivery pipeline is making sure adequate test automation is in place. However, even if you have automated across your entire Test Suite, there is a second challenge: How do you manage Test infrastructure and environments without breaking the bank?

If you want to move towards Continuous Delivery, you need to execute a majority of your tests for each code change in a pristine environment that is as close to your production environment as possible. This ensures that code defects are identified immediately and every code change is therefore 'shippable'. However, creating these environments and updating them with each new application version or every time the config changes adds a lot of overhead. If you're testing an application with many tiers or microservices, the complexity increases since each tier might need to be tested indepedently in its own environment against specific versions of other tiers.

The utopia of Test Automation is the following:

Environment definitions are represented by infrastructure-as-code tools like Ansible, Terraform, Puppet, or Chef. The provisioning scripts are committed to source control and versioned, so you can go back to an earlier state if needed. 
All (or at least a good majority) of your tests are automated and either committed to source control or hosted on services such as Nouvola, Sauce, etc.
You have a completely automated deployment pipeline that automatically spins up a production-like Test environment for every code change, triggers your automation, and if all tests succeed, destroys the environment. If tests fail, the right folks are notified and the environment is kept live until someone can debug the failures.
The first step is already happening in most organizations. The DevOps movement encouraged Ops teams to start writing scripts to provision and manage environments and infrastructure, and multiple vendors support this effort quite effectively. The second step is still a challenge in many organizations, but this is really something that needs executive buy-in and a commitment to automation, even if it slows down product development for a while.

This whitepaper presents a method of implementing the third step - spinning up test environments on-demand and destroying them automatically after the automated test suite is executed.

Read the full blog [here](http://blog.shippable.com/how-to-create-on-demand-test-environments)
DialogPlayとWatsonNLCによる社内ルール回答チャットボットを作った話

#はじめに

TISの社内ポータルにチャットボットが登場してからはや一ヶ月。
一つのシナリオをリリースするまでの裏話です。
チャットボットの対話制御として[DialogPlay](https://www.dialogplay.jp/)を活用。
社員からの問い合わせには[Watson Natural Language Classifier](https://console.bluemix.net/docs/services/natural-language-classifier/natural-language-classifier-overview.html#about)を用いたチャットボットを作成し、社内ポータルサイトへ公開しています。

#社内チャットボット「ティボンヌ」
TIS社内の社内ポータルのトップページにチャットボット。
社内ルール検索や社員情報の検索に日々、汗を流してくれています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105945/c6c1344a-7779-b652-f834-91f287a4d509.png)


#DialogPlay
[DialogPlay](https://www.dialogplay.jp/)
TIS株式会社より提供されているチャットボットプラットフォームです。
業務向けチャットボット作成ができるということで、現場担当者がノンプログラミングでシナリオが作成でき、様々なAPI連携も可能です。

#Watson Natural Language Classifier

[Natural Language Classifier](https://console.bluemix.net/docs/services/natural-language-classifier/natural-language-classifier-overview.html#about)
言わずと知れたIBMCloudより提供されているコグニティブサービスAPIの一つ。
多岐に渡る社員の問い合わせから社内ルールを引き当てるために利用しました。

#チャットボットの構造
社内ルール検索における構造イメージはこのようになっています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105945/e8f60246-b2c8-0b1f-73fa-cd98a3cfd00f.png)

#勤務ルールの分類器作成
社内ルールの分類を実現するためには、NLCに社員の問い合わせ文とその分類先となる社内ルールのペアを学習させなければなりません。

Q.「フレックス勤務に変更したい」
A.「AとBとCの申請をしてください」
のような、[FAQ](https://ja.wikipedia.org/wiki/FAQ)ページがあるようならばそれを基に作成する。
しかし、弊社の社内ルールにFAQなんてものは存在しない。

#学習データ構造
NLCへ入れる学習データの構造はこのようになっています。

| テキスト | クラス |
|:-----------|:------------|
|（入力文）|（分類先）|

社内ルールを答えさせる場合、社内ルールごとにFAQを作成しました。
- 入力：社内ルールそのものへの質問文、状況ごとの対応方法を問う質問文
- 出力：社内ルールのURL

| 質問文 | 社内ルールURL |
|:------------|:------------|
| 個人情報取り扱いについて教えて|TISの個人情報の取り扱いはこちらです。http://example.com|
| フレックス勤務ってなんですか？|勤務形態はこちらです。http://example.com|
| 転勤時にすることを教えて|家賃補助はこちらです。http://example.com|

###チャットボットのリリースまでに作成した学習データ件数はこちら
- 対象にした社内ルール:約100件
- 学習データ件数:約1000件

#実際にやってみることでの課題

###サイトの親子関係を考慮した学習データ作成
社内ルールの構造上、一覧とその詳細で親子関係が作られています。
下の例で言うと、休暇ルールの一覧ページを見たい場合と各休暇ルールのページを見たい場合では、
クラスを分けて作成する必要がありました。

---（例）---
休暇
　└ 年次休暇
　└ 半日休暇
　└ 介護休暇

###質問文がわからない
　学習データ作成にあたり、係員クラスが目にするような勤務時間や休暇の取得に関するページへの質問文は作成できました。しかし、社内ルールによっては上級の役職者しか普段参照しないようなルールも存在しました。どのような質問文となるのかは、実際にルールを使う人でしかわからないため、上から下まで巻き込んでの学習データ作成となりました。

#あとがき
チャットボットの公開後は、ユーザの問い合わせログから、
学習データとして採用できる文言をピックアップし、追加しています。
我々のチームのコードレビューガイドラインを共有します

![1513179323.png](https://qiita-image-store.s3.amazonaws.com/0/66421/a3dc66f4-a710-26da-3634-66a3a8baba1f.png)

この記事は [Nifty Advent Calendar 2017](https://qiita.com/advent-calendar/2017/nifty) 16日目の記事です。昨日は @nokiyu_oO さんの「非エンジニアがフロントエンドの研修を受けてガチャを作れるようになるまで」でした。

------

# まえがき

## なぜ作ったか

この「コードレビューのガイドライン」を作ったきっかけは、とあるスプリントのふりかえりでした。とあるスプリントで、本来ならコードレビューの時点で潰しておきたかったレベルのバグを、うっかり埋め込んでしまったのです。これに対する改善アクションとして、チームでコードレビューをするときのガイドラインを明文化することになりました。明文化によってコードレビュー時に意識すべきことが明確になり、レビュー精度の向上が期待できます。

タイムリーだったのでこれを Qiita で共有してみようと思い、この記事を書きました。

## どうやって作ったか

ふりかえりのアクティビティの1つである「555 (トリプルニッケル) 」を参考にしました。

1.  紙とペンをチームメンバーに配る
2.  「コードレビュー時に心がけていること」を書き出す (5分)
3.  隣の人に紙を回す
4.  隣の人が書いた内容を読んで、意見・感想・思いついたアイデアなどを自由に追記する (5分)
5. 最初に書いた紙が自分に戻ってくるまで 3 と 4 を繰り返す
6. 全員の紙を並べて眺めて、意見を集約させていく

記事冒頭の画像が、このときに実際に書き出された意見達です。

前書きが長くなりましたが、以下が最終的にまとめられたガイドラインです。

# コードレビューガイドライン

## 読み手が気にすべきこと

### 文字表現

####  変数名、関数名はわかりやすいか

* 英文として意味の通じる表現になっているか
    * × : `s1`
    * ○ : `user_id`
* いわゆる「カラフルな」表現になっているか
    * × : `data`
    * ○ : `num_of_unique_users`

####  コメントは適切に書かれているか

* 正しい文法の日本語で書かれているか
    * ×: `ここまで流れて認証エリア以外は、API接続して終了します`
    * ○: `ここまで処理が到達して、かつアクセス先が認証エリア以外だったら、○○APIに接続して終了`
* 初見で処理内容がわからなかった箇所にコメントがちゃんとあるか
    * もしなければ、「ここにコメントがあってもいいのでは？」と提案する

#### マジックナンバーが使われていない

* いわずもがな

### 設計・実装

####  DRY かどうか
* 同じ処理が何度も出てきていないか
    * もし重複が激しければ、メソッドの切り出しを提案する
* 標準機能でできることを自力で実装してないか
    * それを指摘するためには、レビュワーがその言語にそれなりに詳しい必要がある

#### 最適化を求めるあまり読みやすさが損なわれていないか

* DRY を追求しすぎてかえって複雑なコードになってないか
* 汎用性を求めて YAGNI の原則に背いていないか

####  ネスト地獄になってないか

* 深いネストは読みづらい
* if 文のネスト
    * 1つにまとめられる if 文はまとめてもらう
    * [ガード節](https://www.google.co.jp/search?q=ガード節) を導入して、エラー時にすぐ return するようにしてもらう
* ループのネスト
    * 多少は仕方ない

#### 定数は正しいか

* 例
    * URL
    * ファイル名
    * 設定値
* 環境ごとに設定すべき値が変わる場合、それが考慮されているか

####  typo はないか

* 動作に影響のあるレベルの typo は動作確認で検出可能なので、血眼になって探す必要はない
* 何も指摘事項が見つからなくてもせめて typo くらい指摘してやろう、くらいのテンションが重要（精神論）

### 動作確認

* レビュワー側でも動作確認 or テスト実行する

## 書き手が気にすべきこと

* プルリクの説明に下記のことを書くとよい
    * 動作確認手順
    * 自分のコードの不安な箇所

## 人間が気にすべきでないこと (= ツールでやるべきこと)

* コーディング規約のチェック
    * if 文のフォーマット
    * インデント

## その他

* よいコードを書くためにも、よい指摘をするためにも「リーダブルコード」は必読

# あとがき

実際に書き出してみると、一般的に言われていること以上のものは特に出てきませんでした。それでも先述のとおり、明文化すること自体に価値があったのではないかと考えています。特に新人エンジニアのレビュー精度の向上が期待できます。

唯一、我々のチームならではの思いが表れたのが「最適化を求めるあまり読みやすさが損なわれていないか」という項目でしょう。今、我々のチームは10年来の技術的負債に日々苦しめられています。例えば、「データベースからレコードを取得してファイルに吐くだけのバッチ」が平気でC言語で実装されています。そんな歪んだシステムを相手にする中で、シンプルさへの憧れが自然と表出してきたのです。極端に言えば、100行のコードでレスポンスを0.5秒早められるとしても、実装の複雑さを嫌って導入を見送るような文化が今の我々にはあります。

このバランスの取り方は一概に良い悪いを決められるものではなく、チームの求めるものに応じて適切なポイントを見つける必要があると思っています。

------

明日は @ikaiman さんがなにか書くようです。余談ですが私は来週も登場予定です。
マラソン記録を秒にする変換する関数

マラソン等の記録データ（例：3:53:20、2:08:20など）を秒に変換するというニッチケースな関数を書いてみました。

```
def second(time):
    import re

    time_ref = re.split(':|：' , time)
    time_ref = list(filter(lambda n: n != '', time_ref))[::-1]
    
    second = 0
    for e ,i   in enumerate(time_ref) :
        second = second + int(i) * 60 ** int(e)
    
    return second
```

本当は日本語表記にありがちな「時分秒」の含まれる時間表記を数値化したかったのですが「２時間３０秒」と「分」が抜けたケースをif文以外で回避できる方法を思いつかず。。


もっと良いやり方知っていましたら、ご教授いただけますと幸いです。
世界中で大流行のマッチングアプリ、「t○nder」のAPIを用いて遠隔サイバーナ○パをしてみた

**前提（保身）・・・**

**:warning:1.普段はこのようなことはしておりません:sweat:**
**:warning:2.普段忙しい方たちへ、出会いにおける機会損失防止のための実験という大義名分:point_up:**


→t◯nderとは・・・https://ja.wikipedia.org/wiki/Tinder

t◯nderの意義や詳しい使い方などは今回の目的から外れるので省略。



## 今回試したいこと
PythonのT◯nder API Pynderを使って~~遠隔サイバーナンパ~~をする。

## 方法
Pynderをインストールする
Facebookのアクセストークンの取得
~~遠隔ナンパ~~を行いたい場所の緯度と経度を指定（東京周辺じゃつまらないので、今回はなんとなくドイツのベルリンを指定）
自動スワイプ:point_up_2:


さっそく準備を始める。

### Pynderの用意
PythonでAPIをいじるためにPynderをインストール。

`sudo pip install pynder`

インストール完了。
確認してみる。

`python -m pip freeze`

いた。
![スクリーンショット 2017-12-13 12.24.33.png](https://qiita-image-store.s3.amazonaws.com/0/212851/e50e4c62-52c5-91fa-322a-5f6dc2ed7c24.png)


**requestsの更新**
念のため、以下のコマンドを実行する。

`sudo pip3 install --upgrade requests`

### アクセストークンの取得
T◯nderはFacebook認証が必要なので以下を参考にアクセストークンを取得する。

https://tinderface.herokuapp.com/

Facebook認証するところで検証を開き、Networkタグを開く。
**confirm?dpr=2**というレスポンスの中に、アクセストークンが入っているので取得する。

`for (;;);{"__ar":1,"__sf":"iw","payload":null,"jsmods":{"require":[["ServerRedirect","redirectPageTo",[],["fb464891386855067:\/\/authorize\/#signed_request=[ここにアクセストークンがある]&amp;expires_in=6415",true,false],[]]]},"js":["kzs9X"],"bootloadable":{},"resource_map":{"kzs9X":{"type":"js","src":"https:\/\/www.facebook.com\/rsrc.php\/v3i-F-4\/yz\/l\/en_US\/oS3FMOV7Adn.js","crossOrigin":1}},"ixData":{},"lid":"6498942658397335857"}
`

正しくアクセストークンが設定されていないと、Unauthlized 401(認証エラー)になる。

### 自動スワイプLIKEスクリプトを作成
適当なワークスペースにPythonのファイルを作成する。

```Python:auto_liker.py
# coding: UTF-8

import pynder

facebook_auth_token = 'XXXXXX' # 取得したFBアクセストークンを入力

session = pynder.Session(facebook_auth_token)
session.matches()  # 既にマッチしたユーザー情報を取得
# session.update_location(LAT, LON) # 位置情報を更新（緯度、経度）
session.profile  # 自分のプロフィール。更新すると本体の方も更新される。
users = session.nearby_users()  # 近くにいるユーザーを取得。

for user in users:
    print('画像'),
    print(user.photos)

    print('名前'),
    print(user.name)

    print('年齢'),
    print(user.age)

    print('BIO'),
    print(user.bio)

    print('誕生日'),
    print(user.birth_date)

    print('最終ログイン時刻'),
    print(user.ping_time)

    print('距離'),
    print(user.distance_km)

    print('学校名'),
    print(user.schools)

    print('職業'),
    print(user.jobs)

    print('共通の友人数'),
    print(user.common_connections)

    if user.common_connections == []: # 共通の知り合いがいるユーザーはLIKEしないようにしてます。
        user.like()
        print('LIKE!!!!!')

    print('==============================================================================')

```

ファイルの存在するディレクトリに移動して、
`python auto_liker.py`
コマンドを実行すると、認証ができる。


Let's get to know Berliner!:flag_de:


緯度と経度はここで調べた。
http://www.geocoding.jp/?q=%E3%83%99%E3%83%AB%E3%83%AA%E3%83%B3

`LAT:52.520007 LON: 13.404954`

```Python:auto_liker.py
#緯度と経度を指定
LAT = 52.520007
LON = 13.404954
session.update_location(LAT, LON)

```
これを追記して再度、
`python auto_liker.py`
で実行！



:airplane:



・・・ほぼ全員プロフィールがドイツ語で書かれていて何を言っているのか全くわからなかったが、無事目的の~~遠隔サイバーナンパ~~がこれでできるようになった。

※女性のみなさん、くれぐれも変な男性にはお気をつけください。


〜Ende〜
↑ドイツ語
[UnityEditor]TextFieldをクリアする方法

# TextFieldをクリアしたい

UnityEditorを使っていて、TextFieldやTextAreaに入力された値をクリアしたい場合があります。

ところが、素直に下記のように書いてもクリアできず、テキストが残ったままとなります。

```CSharp
string textFieldValue ="";

void OnGUI()
{
	textFieldValue = EditorGUILayout.TextField(textFieldValue);
	if(GUILayout.Button("クリア"))
	{
		textFieldValue = "";
	}
}
```
![qiita1.PNG](https://qiita-image-store.s3.amazonaws.com/0/31032/f846be98-f3c7-70e4-4722-21ce697f9550.png)

これは、Editorでは、フォーカスが当たっているコントロールは、一度フォーカスを外さないと更新されないためとなります。なので、選択されて色が青くなっているSelectableLabelなどでも同様の現象が発生します。

# 対処方法

フォーカスを別のコントロールに当ててあげれば変更されます。今回はTextAreaからButtonにフォーカスを変更します。

```CSharp
string textFieldValue ="";

void OnGUI()
{
	textFieldValue = EditorGUILayout.TextField(textFieldValue);
	//次のコントロールに名前をつける
	GUI.SetNextControlName("ClearButton");
	if(GUILayout.Button("クリア"))
	{
		textFieldValue = "";
		//名前をつけたコントロールにフォーカスを当てる
		GUI.FocusControl("ClearButton");
	}
}
```
![qiita2.PNG](https://qiita-image-store.s3.amazonaws.com/0/31032/02922401-ad7e-4228-f6f3-eb22139b075a.png)

GUI.SetNextControllNameでコントロールに名前をつけて、GUI.Focusでフォーカスを移動しています。
ただ、これだとボタンが反転した状態になるので、気になる場合は別のコントロールを作成してそこにフォーカスを当てるなどしてみてください。

以上です！
CDSW上のセッションで、PyArrowからHDFSに接続する

Cloudera Data Science Workbench (以下CDSW) 上で、PyArrowからHDFSに接続するための方法をまとめておく。

# PyArrowからHDFSに接続するための基礎知識
PyArrowは `libhdfs.so` を使ってHDFSに接続する。
そのため、このライブラリが正しくロードされるかどうかが重要となる。

PyArrowは、デフォルトでは `$HADOOP_HOME/lib/native` 以下を参照して `libhdfs.so` を検索するが、存在しない場合は `ARROW_LIBHDFS_DIR` 以下を検索する。

# インストール

以下のファイルを作成しておく。

```txt:requirements.txt
pyarrow
```

セッション起動時に以下のコマンドを実行する。

```python3
!pip3 install -r requirements.txt
```

# 環境変数の設定

`libhdfs.so` は、デフォルトでは `/opt/cloudera/parcels/CDH-5.13.0-1.cdh5.13.0.p0.29/lib64` 以下に存在するので、これを `ARROW_LIBHDFS_DIR` に指定する。

*Settings* → *Engine* を選択すると、セッション起動時に読み込む環境変数を指定できるので、以下のように入力する。

| 変数 | 値 |
|:-:|:-:|
|ARROW_LIBHDFS_DIR|/opt/cloudera/parcels/CDH-5.13.0-1.cdh5.13.0.p0.29/lib64|

Addするだけでなく、Saveしなければいけないことに注意。
また、セッションは再起動する必要がある。

![CDSW12 Project Settings - Engine.png](https://qiita-image-store.s3.amazonaws.com/0/17749/23d340a3-2d58-b68f-1243-8c9cfa7091d1.png)

 


# Kerberosのチケットの場所の確認

`!klist` を実行することで簡単に確認できる。

```shell
!klist
Ticket cache: FILE:/tmp/xxxxxx
```

# 接続する

```python
import pyarrow as pa
fs = pa.hdfs.connect(host, port, user=user, kerb_ticket='tmp/xxxxxx')
```

これで、HDFSのデータをPyArrow上で取り扱えるようになる。

# 参考

- [PyArrow公式ドキュメント: Hadoop File System (HDFS)](https://arrow.apache.org/docs/python/filesystems.html#hadoop-file-system-hdfs)
【Swift4.0】loadHTMLString()を使う場合、baseURLを指定しないと外部jsのインクルードに失敗する【WKWebView】

takuto3712さんから指摘をいただいて記事を更新しました(2017.12.14)

旧タイトル：
【Swift4.0】WKWebViewのloadHTMLString()だと外部jsのインクルードが失敗する【WKWebView】

WKWebViewのloadHTMLString()でローカルのHTMLをロードした際、参照パスが合ってるにもかかわらずなぜか外部jsファイルのインクルードがうまくいかなくて時間を取られたのでメモ

### index.htmlの一部

```html
<script type="text/javascript" src="sample.js"></script>
```

## 外部jsファイルのインクルードがNGなコード

Bundle.main.path() → webView.loadHTMLString()

```swift
    var path = Bundle.main.path(forResource: "index", ofType: "html")
    var htmlStr:String = ""

    do {
        htmlStr = try String(contentsOfFile: path! ,encoding:.utf8)
    } catch {
        //エラー処理
    }

    // baseURLを指定なし
    webView.loadHTMLString(htmlStr,baseURL: nil)
```
これだとウェブページとしてロードできるが、sample.jsの読み込みが失敗する。


## 外部jsファイルのインクルードがOKなコード

Bundle.main.path() → webView.loadHTMLString()

```swift
    var path = Bundle.main.path(forResource: "index", ofType: "html")
    var htmlStr:String = ""

    do {
        htmlStr = try String(contentsOfFile: path! ,encoding:.utf8)
    } catch {
        //エラー処理
    }

    // baseURLを指定する
    webView.loadHTMLString(htmlStr,baseURL: URL(fileURLWithPath:path!))
```
baseURLを指定した場合はsampl.jsのインクルードができる.


## 外部jsファイルのインクルードがOKなコード
Bundle.main.url() → webView.load()

```swift
    let url = Bundle.main.url(forResource: "index", withExtension: ".html")!
    let urlRequest = URLRequest(url: url)
    webView.load(urlRequest)
```
こちらもsampl.jsのインクルードができる...

## まとめ

ローカルのHTMLをloadHTMLString()でロードするときは、第2引数のbaseURLを指定しないと外部jsファイルが読み込めない