OmniAICreator/Qiita-1.07M huggingface dataset:
Twilioサーバーレス化作業記録 - Token生成サーバーレス化

# はじめに
Twilioサーバーレス化作業メモです。
今回はCapabilityTokenを取得するためのAPIをAWS API GatewayとLambdaで作成します。

# スクリプト生成

適当な場所に作業用フォルダを作成します。
そこにnpmにてtwilioインストール。

```
$ npm install twilio
```

index.js作成。

```js:index.js
console.log('Loading function');

exports.handler = function(event, context) {
    var twilio = require("twilio");
    var capability = new twilio.Capability('myAccountSid', 'myAuthToken');
    capability.allowClientOutgoing('myAppSid');
    var token = capability.generate();

    console.log('token =', token);
    context.succeed(token);
};
```

コマンドラインでzip作成。
```
$ zip -r twilio.zip index.js node_modules/
```

# AWS Lambda側
「Create a Lambda Function」にて新規作成。
blueprint選択せずskip。

Nameは「TwilioGenerateToken」としました。
Roleは「lambda_basic_execution」を選択。

作成後、「Code」タブ「Upload a .ZIP file」から先ほど作成したzipファイルをアップロードします。
Test実行して結果を確認しておきましょう。

#### 注意:
はじめ、index.jsへのアクセス権限が制限されていたことでスクリプト実行に失敗していました。

```
EACCES, permission denied '/var/task/index.js
```

今回はFinderの「情報を見る」「共有とアクセス権」でEveryoneに「読み出しのみ」を設定しました。

# API Gateway側
prodを新しいタブで開く
ページ上の右タブResourcesへ

#### Method Request
Method Execution の AuthenticationをNONE

#### Integration Request
- Mapping Templates を選択
- Content-Type を application/json

Input Path ThroughからMapping template へ変更。AWS lambdaに送ったパラメータを全て取得できるようにする

```
{
  "param": {
#foreach( $key in $input.params().querystring.keySet() )
    "$key": "$input.params().querystring.get($key)"#if( $foreach.hasNext ),#end
#end
  }
}
```

#### Integration Response
200を展開

Mapping Templates 

- Content-Type: application/json
- Input Path ThroughからMapping Templateへ

```
#set($inputRoot = $input.path('$'))
$inputRoot
```

ここは...要再確認です。


#### Method Response
200を展開

Add Response Model

- contenttype:  application/json
- Models: Empty

# 動作テスト
Testから叩いてみます。
Tokenが返却されました！

# おわりに
Deployまで確認できませんでした。
サーバーレス化に邁進していきたい。
rails server で There was an error while trying to load the gem 'uglifier'.と言われる解決方法。

`rails new` したばかりのプロジェクトを `rails new` できない問題の解決方法です。

# rails serverが失敗する

```bash:serverが立ち上がらない
bundle exec rails s -b 0.0.0.0

/home/vagrant/.rbenv/versions/2.2.4/lib/ruby/gems/2.2.0/gems/bundler-1.11.2/lib/bundler/runtime.rb:80:in `rescue in block (2 levels) in require': There was an error while trying to load the gem 'uglifier'. (Bundler::GemRequireError)
略
```
Vagrant 内なので `-b` オプションをつけています。

# therubyracer のコメントを外す

```bash:Gemfileを編集
vi Gemfile

gem 'therubyracer', platforms: :ruby
```
therubyracer を有効にします。

# bundle install
いくつか gem が入ります。

```
Installing libv8 3.16.14.13
Installing ref 2.0.0
Installing therubyracer 0.12.2 with native extensions
```

# 再度rails s

```
bundle exec rails s -b 0.0.0.0 -p 8888
=> Booting WEBrick
=> Rails 4.2.5 application starting in development on http://0.0.0.0:8888
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2015-12-16 23:58:36] INFO  WEBrick 1.3.1
[2015-12-16 23:58:36] INFO  ruby 2.2.4 (2015-12-16) [x86_64-linux]
[2015-12-16 23:58:36] INFO  WEBrick::HTTPServer#start: pid=16358 port=8888
```
今度はうまくいきました(☝ ՞ਊ ՞)
Watch Faceのアンインストール

AndroidStudioからインストールしたWatchFaceをアンインストールしようと思ったが、Wear側にもスマホ側にもそれをできる場所が見つからなかった。
調べてみるとadbコマンドからできた。

WearをPCにつないだ状態で

```
$ adb uninstall パッケージ名
```

これでコンパニオンアプリ上にも表示されなくなる。
簡単。
PythonでPalindrome checkerを作ってみようとしたけど（解決済み）

Freecodecampの課題#185より。
##Palindromeとは
逆さに読んでも同じ単語。

> word, line, verse, number, sentence, etc., reading the same backward as forward, as Madam, I'm Adam or Poor Dan is in a droop.

cited: [dictionary.com](http://dictionary.reference.com/browse/palindrome?s=t)

課題はこちら:

```
/*
Return true if the given string is a palindrome. Otherwise, return false.

A palindrome is a word or sentence that's spelled the same way both forward and backward, ignoring punctuation, case, and spacing.

You'll need to remove all non-alphanumeric characters (punctuation, spaces and symbols) and turn everything lower case in order to check for palindromes.

We'll pass strings with varying formats, such as "racecar", "RaceCar", and "race CAR" among others.
*/

function palindrome(str) {
  // Good luck!
  return true;
}

palindrome("eye");

```
ユーザーインプットを引数とした探してくれる逆さ文字判定をしてくれる関数を作ってください、というところでしょうか。

##流れ
上のガイドも参考にして恐らくこんな感じでやるのかと。
1. `replace(/\W/g, '')`でアルファベットだけに (ref: [Remove not alphanumeric characters from string...](http://stackoverflow.com/questions/9364400/remove-not-alphanumeric-characters-from-string-having-trouble-with-the-char))
2. `.toLowerCase()`で小文字変換 (ref: [JavaScript String toLowerCase() Method
](http://www.w3schools.com/jsref/jsref_tolowercase.asp))
3. ifで`(str === palindrome)`判定 

まずは引数`str`を後の`if`で必要な形にしてあげてから`if`で`true/false`判定をかけてあげる感じでしょうか。ひとまずこんな感じで書いてみました。

```
function palindrome(str) {
  // Good luck!
  str = str.replace(/\W/g, '').toLowerCase();
  if (str.split('').reverse().join('') === str) {
    return true;
  }
  else {
    return false;
  }
}



palindrome("eye");

```
しかしこれだと`palindrome("0_0 (: /-\ :) 0-0")`を`true`に返さないみたいです。ちょっと原因を探ってみます。

##追記
偶然にもまさにリアルタイムで質問している人を見つけたのでその人の答えを参考にすることにします。

![Screen Shot 2015-12-16 at 3.49.20 PM.png](https://qiita-image-store.s3.amazonaws.com/0/87666/18c4d1e3-43ae-bb3f-5446-50e07238a92a.png)

率直に言うとアンダースコア`_`を含めていなかったために`false`が出てしまったと分かりました。「`/\W/g`は文字と数字以外という意味だから、その他全ての記号はこれで含まれるだろ！」と思っていたのが勘違い。

`[a-zA-Z0-9_]` = `\w`なので正確には文字、数字とアンダースコアーを含んでいます。今回のPalindrome checkerではアンダースコアーを除外したいので`[\W_]`とする。まあアンダースコアーも`\W`の仲間として入れてあげようってことでしょうか。

![Screen Shot 2015-12-16 at 3.55.56 PM.png](https://qiita-image-store.s3.amazonaws.com/0/87666/dd4c08a8-18e8-436c-b2e5-45d8591f9f95.png)

ここでも書いてありますが、ここではちゃんと括弧`[]`の中にいれてあげる必要があります。

```
function palindrome(str) {
  // Good luck!
  str = str.replace(/[\W_]/g, '').toLowerCase();
  if (str.split('').reverse().join('') === str) {
    return true;
  }
  else {
    return false;
  }
}



palindrome("eye");
palindrome("0_0 (: /-\ :) 0-0")

```

再度実行すると、

![Screen Shot 2015-12-16 at 4.59.41 PM.png](https://qiita-image-store.s3.amazonaws.com/0/87666/9486ba99-a3f5-0f2f-e721-cace64b98734.png)
Spark-sqlでHiveのメタストアを使う


Amazon EMRとかだと最初から設定されているので手間が無いのですが、Azure HDInsightとかでは紐付けされてないので、その方法。

##設定

とは言え簡単です。

基本的には、\$HIVE_HOME/conf/hive-site.xmlの中のhive.metastore.urisプロパティをコピーして、\$SPARK_HOME/conf/hive-site.xmlとして保存するだけ。

情報によってはhive-site.xmlをまんまコピーすればよい的な記述もあるのですが、HDInsightではいろいろな記述がhive-site.xmlにされており、そのままコピーしただけでは、無理でした。

###hive.metastore.urisの確認

HDInsightで\$HIVE_HOMEは、/usr/hdp/current/hive-client/になりますので、/usr/hdp/current/hive-client/conf/hive-site.xmlを開き、hive.metastore.urisプロパティの内容を確認します。

```xml
<property>
  <name>hive.metastore.uris</name>
  <value>thrift://xxxx.cloudapp.net:9083,thrift://yyyy.cloudapp.net:9083</value>
</property>
```

のようにthrift経由で2つのサーバが設定されているようです。

###Sparkでの設定

root要素のconfigureと、この要素をコピーし、/usr/hdp/current/spark-client/conf/hive-site.xmlとして保存します。

##確認

上記の手順を実行したら、

```bash
spark-sql> show databases;
```
などとして、Hive側の設定が反映されているか確認してみてください。
Azure HDInsight(on Linix)でMahoutを使ってみる


Azureで機械学習したいなら、API化とかが簡単にできるAzure ML使うほうがいろいろ楽ですが、オーソドックスにMahoutを使う手順も確認してみます。とは言え普通のLinuxクラスタでMahout使うのと何も変わりません。

基本的には[ここ](https://azure.microsoft.com/ja-jp/documentation/articles/hdinsight-hadoop-mahout-linux-mac/)の通りやれば良い。

##HDInsightクラスタの作成

詳しくは[こちら](http://qiita.com/zaburo/items/134661f2bdb0a02d447a)をご覧下さい。2015年12月17日現在、利用できるMahoutのバージョンは0.9のようです。

また、各HDInsightのバージョンで利用できる各種ツールのバージョンは[ここ](https://azure.microsoft.com/en-us/documentation/articles/hdinsight-component-versioning/)で確認できます。

最新版の3.3を利用すれば0.9+が利用できるようになるようです。ニューラルネットとかに対応している？のでしょうかね。

##データの準備

データは、MSがテスト用に用意していてくれているものを利用します。

###テストデータのダウンロードと展開

コンソールにログインした状態で、

```bash
curl -O http://files.grouplens.org/datasets/movielens/ml-100k.zip
unzip ml-100k.zip
cd ml-100k
hadoop fs -put u.data /example/data/mahout/
```

>サンプルでは、/example/data/を利用していますが、ここには別のファイルが既に存在しているので、読み込みエラーになるかと思います。

###内容を覗いてみる

普通にcatすれば良いのですが、せっかくなのでHiveでテーブルを作成して内容を見れうようにしておきます。

```bash
CREATE EXTERNAL TABLE members(
    userID string,
    movieID string,
    userRating string,
    time string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
LOCATION 'wasb://<container>@<account>.blob.core.windows.net/example/data/mahout/';
```

>\<container>,\<account>は適宜変更して下さい。

##Mahoutの利用

###コマンドの実行

では、Mahoutを利用してみます。recommenditembasedをSIMILARITY_COOCCURRENCEオプションで実行しています。
いわゆるレコメンドです。強調フィルタリング。

```bash
mahout recommenditembased \
	-s SIMILARITY_COOCCURRENCE \
	-i /example/data/mahout/u.data \
	-o /example/data/output \
	--tempDir /temp/mahouttemp
```

10万人の処理をするのに、1ノードで20分くらいかかります。この量であればHadoopでMahout使わない方が効率がいいかもしれません。

###結果

結果は、/example/data/output/以下にpart-r-00000という名称で出力されます。

```bash
1	[234:5.0,347:5.0,237:5.0,47:5.0,282:5.0,275:5.0,88:5.0,515:5.0,514:5.0,121:5.0]
2	[282:5.0,210:5.0,237:5.0,234:5.0,347:5.0,121:5.0,258:5.0,515:5.0,462:5.0,79:5.0]
```

上記の場合、ID 1の会員さんへのオススメムービーはID 234のムービーで、スコアは5.0といった意味になります（オススメは複数あります）。

実際にECサイト等で利用する場合は、このファイルを取得し、RDB等に流し込んでユーザーを取得した後、ユーザーテーブルやムービーテーブルをJOINさせてレコメンドを見せる感じになります。
「FMC2Goスケジューラーにおけるスケジュールの自動アップデート機能」のつづき


[FileMaker Advent Calendar 2015](http://www.adventar.org/calendars/865)の17日目

# 「FMC2Goスケジューラーにおけるスケジュールの自動アップデート機能」のつづき

[FMC2Goスケジューラーにおけるスケジュールの自動アップデート機能](http://qiita.com/or2/items/cf1ec07bfaa6cb1735fd)の続きです

前回は「checkForUpdate」スクリプトを追いかけていたわけですが、今回はそこから呼ばれている「importUpdate( update_num )」というスクリプトを追いかけてみる

## 「importUpdate( update_num )」というスクリプトは、なにをしている？
スクリプトの名前から、取得しておいたアップデート版のファイルを取り込もうとしているのは容易に想像がつく

### 最初のブロック
![151217-01.png](https://qiita-image-store.s3.amazonaws.com/0/89027/bf9984d6-e7d3-a2c8-afc1-c44f5860dcb9.png)

ダウンロードしてきたアップデート版のファイルを保持しているグローバルフィールド「Utility::zgr_update_file」に入っているファイル名に拡張子".fmp12"が含まれているかを確認

```
Let ( [	$file_type = ".fmp12";
	$last_err =  not PatternCount( Utility::zgr_update_file; $file_type )] ;
	 $last_err)
```

PatternCount関数の戻り値をnotで反転しているので、

- ".fmp12"がファイル名に含まれる：0
- ".fmp12"がファイル名に含まれない：1

となる

ファイル名に拡張子".fmp12"が含まれていなければローカル変数「$err_msg」にエラーメッセージを設定してスクリプト終了

### その次のブロック
![151217-02.png](https://qiita-image-store.s3.amazonaws.com/0/89027/333339cc-6895-9531-b40c-1bd979ffeb13.png)
書き出すパス(テンポラリパス)を取得して、そこにアップデート版のファイルを書き出す

テンポラリパス
> テンポラリフォルダ名は S で始まり、操作が行われる間のデータベースエンジンのセッションを表す番号がそれに続きます。
> - FileMaker Pro では、テンポラリフォルダおよびそれに配置されているすべてのファイルは、FileMaker Pro を終了すると、削除されます。 
> - FileMaker Server では、それぞれのスケジュールは固有のセッションで実行されます。スケジュールが完了すると、セッションは終了してテンポラリフォルダは削除されます。

書き出すパス(テンポラリパス)を生成する

```
fnPlatformPathPrefix & Get( テンポラリパス ) & Utility::zgr_update_file
```

#### 「fnPlatformPathPrefix」というカスタム関数
「fnPlatformPathPrefix」というカスタム関数が定義されているようなので、ついでにそれも見ておきましょう

カスタム関数
> カスタム関数の機能を使用すると、作成したデータベースファイル内の任意の場所で再使用できるカスタム関数を作成することができます。FileMaker Pro ファイル間でカスタム関数をコピーおよび貼り付け（ペースト）したり、カスタム関数を他の FileMaker Pro ファイルからインポートできます。一度関数に対して計算式を作成すれば、他のフィールドに適用したり、他のスクリプトで使用する場合に式を作成し直す必要はありません。
カスタム関数とカスタム関数に含まれる式を一元的に維持および修正することができます。カスタム関数に適用された変更は、そのカスタム関数が使用されているすべてのインスタンスにコピーされます。
カスタム関数は、FileMaker Pro と FileMaker Pro Advanced の両方で使用できます。

fnPlatformPathPrefix関数(カスタム関数)

```
/*
*	PURPOSE: returns a file path prefix appropriate for the current system platform - "filemac:", "filewin:", or "file:"
*
*	DEPENDENCIES: built-in functiosn Abs() and Get( SystemPlatform ).
*
*	HISTORY: See end of code.
*/

Let ( [

	$cur_plat = Abs( Get( システムプラットフォーム ) )

] ; 

	Case(

		$cur_plat = 1;
			"filemac:";

		$cur_plat = 2;
			"filewin:";

		"file:"

	)

)

/* 
*	HISTORY:
*		20130312 - dsimerly - initial implementation.
*/
```

#### なぜ「fnPlatformPathPrefix」関数を使うのか？
FileMakerで外部のファイルを扱うためには動作するプラットフォームにあわせて

- MacOSX→filemac:
- Windows→filewin:

を付加してアクセスする必要があるため

詳しいことは
[ファイルパスの作成](http://www.filemaker.com/help/12/fmp/jp/html/create_db.8.39.html)
を参照


ということはFileMakerGoは"file:"を付加してテンポラリパスにアクセスしているんでしょうね
ちなみに"file:"はMacOSXでもWindowsでも相対パスなら使えるんですが、Get( テンポラリパス )では絶対パスが返ってくるので、ちゃんと環境によって切り分ける必要があります

そして正しく書き出せたかどうかを「Get( 最終エラー )」で確認して、エラーが検知されていたらローカル変数「$err_msg」にエラーメッセージを設定してスクリプト終了

Get( 最終エラー )
> 目的 
直前に実行したスクリプトステップでエラーが発生した場合は、そのエラー番号を返します。
構文 
Get ( 最終エラー )

忘年会がつづきお疲れモードなのと、ここから先は別スクリプトに処理も移るので、つづきはまた明日
技術英語 > [Out of] all the possible vice presidential candidates that were ... / In nine cases out of ten, / go in one ear and out the other

@ LOE > August 24, 2012
http://loe.org/shows/shows.html?programID=12-P13-00034
> Out of all the possible vice presidential candidates that were ...

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

In nine cases out of ten, ...
http://ejje.weblio.jp/content/in+nine+cases+out+of+ten

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

go in one ear and out the other
http://idioms.thefreedictionary.com/go+in+one+ear+and+out+the+other

右の耳から入ったものが左の耳からすぐ抜ける。

そうならないように毎朝交差点ゲームをして長期記憶力を高めようとしている。
Node.js 実践講座 〜基礎編〜 その6

# はじめに
この記事では、Node.jsの`module`や`exports`を使用して、ソースコードを複数のファイルに分割して記述する方法を学びます。

# ワークスペースの作成
下記コマンドを入力してワークスペースを作成します。

```
mkdir ~/workspace/js/basic/03-module

mkdir ~/workspace/js/basic/03-module/01-module-exports
touch ~/workspace/js/basic/03-module/01-module-exports/index.js
touch ~/workspace/js/basic/03-module/01-module-exports/print.js

mkdir ~/workspace/js/basic/03-module/02-exports
touch ~/workspace/js/basic/03-module/02-exports/index.js
touch ~/workspace/js/basic/03-module/02-exports/math.js
```

# module.exports

## ソースコードの内容
`01-module-exports`の`index.js`と`print.js`の内容を下記に示します。

```index.js
'use strict';

var print = require('./print')

if (require.main === module) {
  main()
}

function main() {
  print('Hello, world.')
}
```

```math.js
'use strict';

module.exports = print

function print(str) {
  console.log(str)
}
```

## 実行コマンド
実行コマンドを下記に示します。

```
node index
```

## 実行結果
実行結果を下記に示します。

```
Hello, world.
```

## 解説
読み込まれる側のファイルでは`module.exports`への代入により、関数や変数をエクスポートすることができます。一方、読み込む側のファイルでは`require`で相対パスを呼び出し、関数や変数をインポートすることができます。

# exports

## ソースコードの内容
`02-module-exports`の`index.js`と`math.js`の内容を下記に示します。

```math.js
'use strict';

exports.add = add
exports.sub = sub
exports.mul = mul
exports.div = div

function add(left, right) {
  return left + right
}

function sub(left, right) {
  return left - right
}

function mul(left, right) {
  return left * right
}

function div(left, right) {
  return left / right
}

```

```index.js
'use strict';

var math = require('./math')

if (require.main === module) {
  main()
}

function main() {
  console.log('1 + 2 = ' + math.add(1, 2))
  console.log('3 - 4 = ' + math.sub(4, 3))
  console.log('5 * 6 = ' + math.mul(5, 6))
  console.log('7 / 8 = ' + math.div(10, 3))
}

```

## 実行コマンド
実行コマンドを下記に示します。

```
node index
```

## 実行結果
実行結果を下記に示します。

```
1 + 2 = 3
3 - 4 = 1
5 * 6 = 30
7 / 8 = 3.3333333333333335
```

## 解説
読み込まれる側のファイルでは`exports`の任意のプロパティへの代入により、関数や変数をエクスポートすることができます。一方、読み込む側のファイルでは`module`の場合と同様に`require`で相対パスを呼び出し、関数や変数をインポートすることができます。なお、`modoule.exports.xxx`などに代入することによって`exports`を使用した場合と同じ効果を得ることができます。

# おわりに
次回はnpmを使用してパッケージをインストールし、インストールしたパッケージを使用する方法について解説します。
Travis CI で NoMethodError: undefined method `spec' for nil:NilClass と言われて bundle install できないとき

Travis CI に Ruby のコードを push したところ、以下のようなエラーが発生して `bundle install` がうまく完了しない。

```
NoMethodError: undefined method `spec' for nil:NilClass
```

https://travis-ci.org/woothee/woothee-ruby/jobs/97291038

ざっと調べた感じ、rubygems の修正が影響している模様。
https://github.com/rubygems/rubygems/commit/620910aa75c7446e8f8d5af1df5f981e4da86197
Bundler 側では 1.10.0 以降で修正されている。
https://github.com/bundler/bundler/commit/f4481a7e3dbaf7f563e32afbe2cbbb84e3091f16

Travis CI で Bundler が古すぎたときのために、`before_install` で `gem update bundler` しておくと解決できる。
こんな具合に。
https://github.com/google/google-api-ruby-client/pull/322

以上。
PNGのチャンクを読む


PNGファイルは、最初の8バイトを除けば

チャンク

データ長|名称|データ|CRC-32
---|---|---|---
4バイト|4バイト|(データ長に示すバイト数)|4バイト

で構成されているので[^1]、

```bash:parse_png.sh
#!/bin/bash
set -eu
pngFile=$1
headPtr=0
if [ "89504E470D0A1A0A" != $(xxd -ps -u -s $headPtr -l 8 $pngFile) ]
then
  echo "pngファイルではありません"
  exit 1
fi
headPtr=$((headPtr+8))

chunkName=""
while [ "IEND" != "$chunkName" ] 
do
  chunkLength=$((0x$(xxd -ps -u -s $headPtr -l 4 $pngFile)))
  chunkName=$(dd if=$pngFile ibs=1 skip=$((headPtr+4)) count=4 2> /dev/null)
  checkSum=$(xxd -ps -u -s $((headPtr+4+4+chunkLength)) -l 4 $pngFile)
  printf "%04x: %s %04x\n" $headPtr $chunkName $chunkLength
  recount=$(printf "%08X" 0x$(dd if=$pngFile ibs=1 skip=$((headPtr+4)) count=$((4+chunkLength)) 2> /dev/null | cksum -o3 | cut -d " " -f 1 | xargs -I ZZ dc -e "16oAi ZZ p"))
  if [ "$recount" != "$checkSum" ]
  then
    echo "ファイルが壊れています"
    echo $recount is not equal to $checkSum
  fi
  headPtr=$((headPtr+4+4+chunkLength+4)) #to next chunk
done
```
https://gist.github.com/nyango/6cd8441edc16c060763a
などと書いてやれば(pngファイルは必ずIENDという名前のチャンクで終わる)、


```shell-session
$ bash parse_png.sh hoge.png
0008: IHDR 000d
0021: pHYs 0009
0036: vpAg 0009
004b: IDAT 8000
8057: IDAT 68e7
e94a: tEXt 0025
e97b: tEXt 0025
e9ac: IEND 0000
```

pngを構成するチャンクの名称(4文字の英字)とデータ長(バイト数)を確認できる。

----
[^1]: http://homepage2.nifty.com/sophia0/png.html
[^2]: http://fujishinko.exblog.jp/7629968/
leJOSのTimerクラスで周期的な処理の実行

##はじめに
この記事は [ETロボコン Advent Calendar 2015](http://www.adventar.org/calendars/734) の17日目です。

香川大学ＳＬＰ－Ａというチームで中四国地区に参加した者です。
今年はTOPPERS環境のC++で出場しましたが、来年以降はJavaかC#で出場しようと考えています。
今回はleJOSを調べる過程で見つけたTimerクラスについて書きます。
##Timerクラス
leJOSには周期的な処理の実行を実現するために、[Timerクラス](http://www.lejos.org/ev3/docs/lejos/utility/Timer.html)が用意されているようです。
Javaに元々用意されている[Timerクラス](https://docs.oracle.com/javase/jp/6/api/java/util/Timer.html)と同じように使用することができます。
組み込みに詳しくない私としては違いがよくわかりませんが、用意されているものは使った方がいい気がするので試しに使ってみました。
##使用例
今回はTimerクラスを利用してカウンターを作成してみます。

Timerクラスのコンストラクタを見てみます。

```java
Timer(int theDelay, TimerListener el)
```

引数は実行する周期と、TimerListenerインターフェースを実装したクラスです。
では、TimerListenerインターフェースを実装するクラスとして、CountTimerクラスを作成します。
周期的に実行したい処理は、timedOutメソッドに記述します。
今回はカウンターの機能として、カウントと画面への表示を記述します。

```java
package test;
import lejos.hardware.lcd.LCD;
import lejos.utility.TimerListener;

public class CountTimer implements TimerListener {
	static int count;
	CountTimer(){
		count = 0;
	}

	public void timedOut() {
		count += 1;
		LCD.clear();
		LCD.drawString(String.valueOf(count),0, 0);
		LCD.refresh();
	}
}
```

Timerクラスを使用する準備は整いました。実際に使用します。

```java
package test;
import lejos.hardware.Button;
import lejos.hardware.lcd.LCD;
import lejos.utility.Timer;

public class TimerTest {

	public static void main(String[] args) {
		CountTimer count = new CountTimer();
		Timer countTimer = new Timer(1000, count);

		LCD.clear();
		LCD.drawString("Program Start",0, 0);
		LCD.refresh();
		while(Button.ESCAPE.isUp()){
			if(Button.RIGHT.isDown()) {
				countTimer.start();
			}
			if(Button.LEFT.isDown()) {
				countTimer.stop();
			}
		}
	}
}
```

実行すると、「Program Start」という文字が表示されます。
右ボタンを押すとタイマーが作動し、1秒ごとにカウントが増えることが確認できます。
左ボタンを押すとタイマーが停止します。

##感想
TimerクラスはThreadクラスの変わりに使用することができそうなので、ETロボコンでは使う機会があると思います。
余裕があれば、次はMonoBrick関係の記事を作ろうと思います。
Haxeでラムダ式を手短に描く

# Haxeとショートラムダ

Haxeは関数型プログラミング言語の影響下にあることを多くの点で指摘される言語ですが、シンプルなラムダ式(ショートラムダ)がありません。作者のNicolas Cannasseが可読性の低下などいくつかの理由から導入に前向きではないためです。

## ライブラリで解決する

言語自体はサポートしていませんが、サードパーティーライブラリを使えばさくっとショートラムダで書くことができます。Haxeでショートラムダを実現するためのライブラリとしては`slambda`, `tink_lang`の2つが選択肢に上がります。今回はシンプルなライブラリの前者を使ってショートラムダを書きます。

### Slambdaとは

Haxeでショートラムダを書くための小さめのライブラリ。スラムダと読みます。

https://github.com/ciscoheat/slambda

### Slambdaのインストールとhxmlの設定

こんな感じ。ここでは出力先にJavaScriptを指定していますが、特に出力先を限定するライブラリではありません。

```shell-session
haxelib install slambda
```

```build.hxml
-main Lambdashiki.hx
-js Lambdashiki.js
-lib slambda
```

### ショートラムダを書く

下記のようにショートラムダを書くことができるようになります。

```Lambdashiki.hx
using Slambda;

class Lambdashiki{
    static function main(){
        var hoge:Array<Int>, piyo:Array<Int>, fuga:Array<Int>;
        var arr = [1, 2, 3, 4, 5];
        
        // arr.filter(function(x) { return x % 2 == 0 })と同じ
        hoge = arr.filter.fn(_ % 2 == 0);
        trace(hoge); // [2, 4]

        // アロー関数もいける
        piyo = arr.filter.fn(x => x % 2 == 0);
        trace(piyo); // [2, 4]

        // 連結できる
        fuga = arr.map.fn(x => x * x).filter.fn(_ % 3 == 0);
        trace(fuga); //[9]

    }
}
```

`using`ではなく`import`を使うと下記のように書けます。

```hx
import Slambda.fn;

class Lambdashiki {
    static function main() {
        var hoge = [1, 2, 3].filter(fn(_ % 2 == 0));
        trace(hoge); // [2]
    }
}
```

上述のレポジトリでもう少しちゃんとしたサンプルを確認できます。

## まとめ

Haxeでは言語自体はサポートしていないものの、ライブラリを使えば簡単に出力を限定せずショートラムダが使えます。`function`と`return`につかれたときは思い出してください。
Bluemixでログ管理サービスPapertrailを使ってみよう


このエントリは、[Bluemix Advent Calendar 2015](http://qiita.com/advent-calendar/2015/bluemix)の17日目のエントリーです。
ここでは、Bluemixを例に挙げていますが、Cloud FoundryベースのPaaS (Cloudn, Pivotal Web Service, Pivotal Cloud Foundry, Cloud Foundryなど)であれば、同じように利用できると思います。  

---

みなさんはBluemixで展開したアプリのログを見たいときどうしてますか？一般的には下記の２つの方法があると思います。  

## Bluemix UIからログを確認する方法
 ![](https://qiita-image-store.s3.amazonaws.com/0/42406/dcd326fc-1d37-ae7e-97d0-0e5b6191dfb7.png)

## ``cf logs``でコマンドラインからログを確認する方法
### ログの設定 
 ```
$ cf logs kimiphp1217 
$ cf logs kimiphp1217 --recent

 ```

ここから``grep``かけてログを解析してもいいのですが、アプリの再起動時にログが消えてしまいます。そこで、サードパーティのログ管理サービスに出力する方法をとりたいと思います。ログ管理サービスは色々ありますが、Herokuで利用されている方も多い「papertrail」という**とってもイケてる**ログ管理サービスを使用したいと思います。

## Papertrailでログ管理
![](https://qiita-image-store.s3.amazonaws.com/0/42406/0c9e1dc1-eb18-0805-1622-57792d15dc48.png)

### ログの転送
- https://papertrailapp.com でメールアドレスを登録します
- Dashboardで、Add Systemsをクリックし、Sender requires port 514をクリックします。
- I use Heroku or Cloud Foundryを選択して、"What should we call it?"で、任意の名前を登録します。（例: kimibluemix）
- cfコマンドで、生成されたURLにログを転送する設定を行い、アプリを再ステージします。

```
cf cups papertrail-syslog -l syslog://logs3.papertrailapp.com:(port番号)
cf bs kimiphp1217 papertrail-syslog
cf restage kimiphp1217
```

これで、Papertrailのダッシュボードから登録した名前（例: kimibluemix）をクリックすると、ログが収集されているのがわかると思います。うーん、検索機能が使いやすいですね〜!! （下記スクリーンショットはサンプルのものです。）:smile: 
![](http://help.papertrailapp.com/assets/images/search-and-tail-02_normal.png)

### Slackにアラートを飛ばす
Papertrailは検索機能がとてもいけてるだけでなく、AlertをメールやSlackにも飛ばすことができます。試しにSlackに飛ばしてみたいと思います。

- 検索キーワードをいれて、Save Searchでその検索を保存し、Save & Setup an Aleartをクリックします。
- Slackを選択し、new Papertrail integrationをクリックします。
- Channelを選択し、ピンク色で生成されたURLをコピーしておきます。
- PapertrailのDashboardに戻り、保存した検索の右の編集アイコンをクリックし、FrequencyやSend messages with timestamps inを設定し、最後にIntegration's Webhook URLに先ほどコピーしたURLを設定します。
- Send Test Dataをクリックして正しくメッセージが届けば設定は終わりです。

いい感じに、お好みの検索キーワードでログをSlackに飛ばすことができました。:smile: 
![](https://qiita-image-store.s3.amazonaws.com/0/42406/906e3c95-0e69-d370-dfc6-b1a50960c12e.png)

他にも、S3にログをアーカイブしたり、Hadoopなどでログを解析させたりできるようです。時間があれば、[Xplrenty](http://help.papertrailapp.com/kb/analytics/log-analytics-with-xplenty)などを試してみたいです。

---

ご意見等あれば、[Facebook](http://facebook.com/kkitase) | [Twitter](http://twitter.com/kkitase) までお願いします。
TitaniumアプリをターミナルからiTunes Connectに登録する方法

普段Titaniumでコードを書くときにプロジェクトの作成からbuild等をする際にTitanium Studio（今はAppcelerater Studioですね）を使っていないので、ターミナルからiTunes Connectに登録する方法を紹介します。

やり方はとても簡単！

**iPhone/iPadの場合**
```$ti build -p ios -T dist-appstore```
**Androidの場合**
```$ti build -p android -T dist-playstore```

iPhone/iPadの場合のコマンド入力後は、Xcodeを起動し、Window/organizerに移動し、Upload to App Storeをクリック。*（このコマンドを入力する前には、プロビジョニングプロファイルのdistributionを作成しなければなりません。）*

Androidの場合はのコマンド入力後は、プロジェクトファイル/dist/~.apkが作成され、playストアにアップロードで申請できます。
Windows Server 2012 R2でvSphere Web Clientの起動時に「ビルトインAdministratorでは...」エラー

# 概要

Windows Server 2012 R2で[スタート]≫[アプリ]≫[vSphere Web Client]を起動するためには、Internet Explolerの"リンクの開き方"オプションを[常にデスクトップ上のInternet Explorerで開く]に変更しておきます。

# 詳細

## 発生手順

Windows Server 2012 R2上にvCenter Server for Windows 6.0 update 1を構築直後、[スタート]≫[アプリ]≫[vSphere Web Client]を選択しました。

![vSphere Web Client起動エラー_001.png](https://qiita-image-store.s3.amazonaws.com/0/55718/5d169bd0-3f34-0912-c110-6d24e02849d3.png)

すると「ビルトインAdministratorアカウントを使って、Internet Explorerを開けません」とのエラーが表示されました。

![vSphere Web Client起動エラー_002.png](https://qiita-image-store.s3.amazonaws.com/0/55718/e3203849-c951-027d-e194-e74c6d3259fd.png)


## 対応

1. Internet Explorerを起動し、「インターネットオプション」を開く。
2. "プログラム"タブ内の"リンクの開き方を選択"オプションを、[常にデスクトップ上のInternet Explorerで開く]に変更する。

![vSphere Web Client起動エラー_003.png](https://qiita-image-store.s3.amazonaws.com/0/55718/cecd8a3b-cc10-1eb9-1456-bc0df81721ff.png)

# 参考

解決にあたっては、以下を参考にしました。

* [Interstage Studio Standard-J Edition V11.0 Windows Server 2012 留意事項](http://software.fujitsu.com/jp/products/syskou/windows/winsv2012/r-std_sje.txt)
ディレクトリ内の一番大きな番号につづくように番号を振ってファイル名を生成する



表題のような場面にはよく出くわすかと思います。

なので，zshプラグインにしました。

* [ssh0/zsh-get_serialised_filename](https://github.com/ssh0/zsh-get_serialised_filename)

使い方
======

```
path
└── to
    └── save
        ├── 01_file
        ├── 02_file
        ├── 04_file
        ├── file_001.txt
        ├── file_002.txt
        └── file_003.txt
```

のようにディレクトリとファイルがあったときに，ディレクトリ名とマッチパターンを渡すことでそのディレクトリ内で一番大きな番号+1したファイル名を返す関数`get_serialised_filename`です。

たとえば

```
$ echo "$(get_serialised_filename -d "/path/to/save" -b "file_" -e "txt")"
/path/to/save/file_004.txt
```

や

```
$ echo "$(get_serialised_filename -d "/path/to/save" -n 2 -a "_file")"
/path/to/save/05_file
```

のようになります。

存在しないディレクトリを指定した場合でもエラーを出さず，

```
$ echo "$(get_serialised_filename -d "/path/to/other" -b "newfile_" -e "md")"
/path/to/other/newfile_001.md
```

となります。


オプションは，例をみてもらえれば分かるように，

|Options  | Arguments           |
|---------|---------------------|
|-b       | filename\_before    |
|-a       | filename\_after     |
|-e       | filename\_extension |
|-d       | root\_dir           |
|-n       | num\_of\_digits     |

のようになっています。

インストール方法
================

zshプラグインマネージャを使用する方法
-------------------------------------

インストールは、zshプラグインマネージャ([zplug](https://github.com/b4b4r07/zplug),[zgen](https://github.com/tarjoilija/zgen),[antigen](https://github.com/zsh-users/antigen)など)からでもできます。

`zshrc`に:

**antigen**

```
antigen bundle ssh0/zsh-get_serialised_filename
```

**zgen**

```
zgen load ssh0/zsh-get_serialised_filename
```

**zplug**

```
zplug "ssh0/zsh-get_serialised_filename"
```

手動でインストールする
----------------------

手動でインストールするのも簡単です。
ちなみにzshプラグインと言っていますが、bashでもdashでも使用することができます。


1: GitHubから(適当な場所に)クローンする

```
git clone https://github.com/ssh0/zsh-get_serialised_filename.git ~/.zsh/plugins/zsh-get_serialised_filename
```

2: `zshrc`(もしくは`bashrc`)で`source`する。

```
source $HOME/.zsh/plugins/zsh-get_serialised_filename/get_serialised_filename.sh
```

dashでは`source`コマンドが使えないので、

```
. $HOME/.zsh/plugins/zsh-get_serialised_filename/get_serialised_filename.sh
```

のようにすれば使えます。

まとめ
======

メモ取り用、ログ管理、スクリーンショット、その他決められたディレクトリ内に連番でファイルを保存していくという用途は多くあると思うので、活用してみてください。
【備忘録】Proxyサーバ経由でのhomebrewの利用

次のようにすると、Proxyサーバ経由で外部と繋がっている環境下でも、brewコマンドが利用できます。

httpで通信をするときは、
```
http_proxy=http://proxyサーバ名:ポート番号 brew install パッケージ名
```

httpsで通信するときには、

```
https_proxy=http://proxyサーバ名:ポート番号 brew install パッケージ名
```

とします。
Proxy Repositories(Nexus)利用時、SBT設定


## sbt version
```text
> sbt-binary-version
[info] 0.13
> sbt-version
[info] 0.13.9
```

## 経緯
Playframework検証のため、activatorとsbtを入れて `activator ...` `sbt ...` コマンドを実行したら、参照ライブラリーのダウンロード失敗

## Nexusに proxy repositoriesを追加
proxyタイプとして以下のように追加

| Repository Name | Remote Storage Location |
| :-- | :-- |
| maven-central | http://repo1.maven.org/maven2/ |
| typesafe-releases | http://repo.typesafe.com/typesafe/releases/ |
| typesafe-ivy-releasez | http://repo.typesafe.com/typesafe/ivy-releases/ |

## ~/.sbt/repositoriesを修正
修正前

```text
[repositories]
  local
  activator-local: file:////${activator.local.repository-C:/activator-dist-1.3.7//repository}, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
  activator-launcher-local: file:////${activator.local.repository-${activator.home-${user.home}/.activator}/repository}, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
  maven-central
  typesafe-releases: http://repo.typesafe.com/typesafe/releases
  typesafe-ivy-releasez: http://repo.typesafe.com/typesafe/ivy-releases, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
```

修正後

```text
[repositories]
  local
  activator-local: file:////${activator.local.repository-C:/activator-dist-1.3.7//repository}, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
  activator-launcher-local: file:////${activator.local.repository-${activator.home-${user.home}/.activator}/repository}, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
  maven-central: http://xxxxx/nexus/content/repositories/central
  typesafe-releases: http://xxxxx/nexus/content/repositories/typesafe-releases
  typesafe-ivy-releasez: http://xxxxx/nexus/content/repositories/typesafe-ivy-releasez, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
```

## sbtコマンドを実行し、問題ないことを確認
```text
c:\>sbt console
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
Getting org.scala-sbt sbt 0.13.9 ...
...省略...
[info] Set current project to root (in build file:/C:/)
[info] Updating {file:/C:/}root...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Starting scala interpreter...
[info]
Welcome to Scala version 2.10.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_65).
Type in expressions to have them evaluated.
Type :help for more information.
scala>
```
Go、Scala、Clojureで開発する3社が集結!!

「Go、Scala、Clojureで開発する3社が集結!!」に参加してきました。
http://hitomedia-night.connpass.com/event/23452/

メモ程度ですが何かの参考になればと。

| コンテンツ |発表者| 資料 |
|---|---|---|
|Golang in eureka|エウレカ 三津澤さん| -|
|Scala採用の背景とその謎|Demand Side Sience 平岩さん| -|
|サイボウズスタートアップス|サイボウズスタートアップス 落合さん| -|

# Golang in eureka
* エンジニア:50人 / 社員数:90人
	* エンジニアドリブンの文化
* pairs
	* 会員数: 2年 300万人
	* 急成長してます
* PHP から Go にフルスクラッチ
	* DBもマイグレーションも書き換えた
	
## フルスクラッチの背景 
* 大量の技術的負債
	* 密結合
	* スケールしないDB設計
	* 巨大なモノリシックなコードベース

## 移行先言語に求められるもの
* シンプルさ
	* キャッチアップに時間がかからないか
	* チーム開発向きか
* ハイパフォーマンス
	* 開発速度（ビルドの速さなど）
	* 並列処理がシンプルに記述可能
* チャレンジング
	* エンジニアリングのレベル向上につながる

## Why Go?

* 学習が容易
* さくっと書いても割と速度が出る
* goroutine / channel

## Goの欠点
* モダンなシンタックスはない
	* map /reduce
	* パターンマッチ
	* 例外
* 確立されたライブラリが少ない
	* WAF
	* 3rd party
* 数値計算系が不得意

## Go版pairs
* フロントサイド
	* AngularJS + Typescript
* 設計
	* Microservices
		* 決済 を完全に分けて別DBを参照している

## Goでアプリケーションを作る時の所管
* パフォーマンスは出る
* 罠はそれなりにある
	* 値の初期値でハマる
* LLのセキュアのものは若干扱いづらい

## まとめ
* やりたいこと/やるべきことが見えているならあり
* デファクトがないので 0 → 1は厳しい

# Scala採用の背景とその謎
* オプトのアドテク

## Scalaとは？
* オブジェクト指向と関数型

## 採用した理由
* やりたい人がいた
* 技術ベンチャーとしてアピールポイントになると思った
	* DSPとして技術をアピールしたかった
* なんかすごそうと思った（勢い）

## Scalaを採用している理由
* エコシステムやコミュニティの充実
	* Scala Matsuri
* エンジニアとしてのメリット
	* 型安全
	* ボイラープレートを減らせる
	* 関数型・オブジェクト型の両面による抽象化
* 採用にプラス
	* Scalaがキッカケで応募する
	* 量より質を上げる

## 改善点や課題
* 枯れていない
	* ベスト・プラクティスが確立されていない分野が多い
	* バグもたまにある
	* Scala本体のアップデートがよくある
* コンパイルが遅い
	* 最大の欠点
	* SPAでつくっている
		* AngularJS + Typescript
	* プロジェクトを適切に分割する
	* implicit conversion、マクロ
* 関数型プログラミングをどこまで推奨するか
	* scalazやshapelessの利用
	* 圏論などの前提知識が必要

## まとめ
* 新言語導入は打算と勢いで
	* メリットがないと
* 現場の人達が幸せになれる選択を
	* 使う人が幸せに慣れば

# サイボウズスタートアップス
* 会社説明

## Clojureの採用
* 会社の技術的な中心に Clojure をおいた

## 新しい言語を採用するにあたって
* 優秀なエンジニアを採用したい
	* 優秀なエンジニアが使いたいと思う言語
		* 関数型とか
* 採用で勝てる条件が揃ってる
	* 大手が採用していない
	* その言語で圧倒的なブランド力がある企業がない

## メリット
* Simple 
* LISP

## Simple Made Easy
* 経営陣の共通の考え

## CloureScript
* Reagent, Om

## 人材採用面で有利
* 能力の平均値が高い
* ブランドが築けそう

## まとめ
* 機械学習
* 人材採用の面で有利

# 感想
* 新しい言語の導入は最後は勢いかも
* 実際にその言語を使って開発する人が幸せになれるのは重要
* メリットがないと正直導入は難しい
* チャレンジすることによって技術力のアピールにはなる
* あえて競合がいない言語も選ぶのも、差別化という意味ではあり
* Go言語だったら◯◯社みたいになれるチャンスも

新しい言語にチャレンジするのは技術力アピールにつながるので全然ありだなと思う一方、
経営層の理解がないと結構辛いことになりそうな気がしますね。
Electronで勉強会で使えるプレゼンツールっぽいものを作った。 (Twitter Streaming API + Milkcocoa)


IPUアドベントカレンダーです！若干遅刻すみません！

Electronの勉強がてら、勉強会でのプレゼンに使えるツイッター連携ツールを作ってみました。

## 勉強会あるあるとやりたいことなど

* ハッシュタグ付きツイートがよく投稿されていて、リアルタイムにスライドに対するコメントがあがってくるけど反応できない
* 独自のツールつくってコメントをプレゼンター側の画面にリアルタイム反映していると、今度はツイッターが盛り上がらなくなる
* Keynoteなど既存のプレゼンツールは使いたい

## 作ったもの

ElectronでKeynoteなどのプレゼンツールより手前のレイヤーでツイッターの情報を取得してトースト表示してくれるツールを作りました。

### デモ
![](https://i.gyazo.com/d4c606365ea1ef112d83a8d3688efa1e.gif)

こんな感じでKeynote使いながらも、手前には設定したキーワードのツイートがリアルタイムに表示されます。

左下がツイートをリアルタイム取得してトースト表示してる部分です。

## 技術的なあたり

ソースコードは後ほど公開する予定です。

* Milkcocoa: 使わなくてもいいんですけど、情報の保存用とNode.js <-> フロントのJSとの連携に使ってます
* Twitter Streaming API : リアルタイムにツイートを取得します
* Electron: 透過、最前面固定 くらいを設定しました。
* トースト部分: https://github.com/kamranahmedse/jquery-toast-plugin/


### 参考
* http://qiita.com/n0bisuke/items/327e10da3eac09dd6985
* http://qiita.com/uiureo/items/0353e37bcffe94731c6b
* http://qiita.com/nyanchu/items/9a1c910bbca55e9d2f3c
* http://qiita.com/n0bisuke/items/f4e933e4cd0f7c68b097


## 感想

Electron以外と簡単に使えるなぁという印象です。
Keynoteと組み合わせて使えるこのツールは機能精査したらけっこう需要あるんじゃないかとおもってたり。。。笑
親のディレクトリもすべてさかのぼって権限を表示したい

## Why

* 権限がない系のエラーが出た際の調査に使いたい

## `namei`コマンドが入ってる場合

```
$ namei -l /home/kalibora/environment/README
f: /home/kalibora/environment/README
drwxr-xr-x root     root     /
drwxr-xr-x root     root     home
drwxr-xr-x kalibora kalibora kalibora
drwxrwxr-x kalibora kalibora environment
-rw-rw-r-- kalibora kalibora README
```

こんなコマンドがあるの今日の今日まで知らなかったよ・・。

## 入ってない場合

適当なワンライナーで

```
$ FILE="/home/kalibora/environment/README"; until [ "$FILE" = "/" ]; do stat -c "%A %G %U %n" $FILE; FILE=`dirname $FILE`; done
-rw-rw-r-- kalibora kalibora /home/kalibora/environment/README
drwxrwxr-x kalibora kalibora /home/kalibora/environment
drwxr-xr-x kalibora kalibora /home/kalibora
drwxr-xr-x root root /home
```

## 参考

* [command line - How do I recursively check permissions in reverse? - Unix & Linux Stack Exchange](http://unix.stackexchange.com/questions/5860/how-do-i-recursively-check-permissions-in-reverse)
ログの追跡方法の色々

# 経緯
Web開発の現場ではサーバサイドのログはWinSCPなどでローカルにコピーして、Windowsのエディタで解析していたりする光景を見ます。むしろそれが推奨されていたりする。

# 対象読者
Linuxなどでログをリアルタイムに追いかける初心者。

# 入門
1. 最も単純なケース。ログが追記されることに標準出力します。
``$ tail -f filename.log``

2. エラーが出た時だけ出力する。
``$ tail -f filename.log | grep ERROR ``

3. エラー行数のカウント
`` $ cat sample.log | grep ERROR | wc -l``

#最後に
sedやawkやegrepなどテキストの整形コマンドはたくさんあり、私もまだまだなので勉強して追記したいです。
またuniqやsortコマンドで一定のログの出力件数を統計しやすいように出力したりすることもできます。
そこまで行ったらまた更新します。
Web版でLive2DとFaceRigアルゴリズムの再現

先週あたりFaceRig SoftwareがLive2Dのモジュールをリリースしたのことで、自分も同じようなものをWeb版で作ってみようかと思いました。

Live2Dモジュール紹介動画：https://www.youtube.com/watch?v=IINyowbMqJI

以前にOpenGL版でLive2Dを動かしたことがあったので、それを元に作り上げていこうと思いました。
以下のものはLive2Dのウェブ版のサンプルから取り上げられたものです。

![image](https://qiita-image-store.s3.amazonaws.com/0/64623/4d5fed48-372d-c3b9-0a3f-ddbd5c633e93.png)

次に、顔のトラッキングを行うライブラリーもあったので、そのトラッキングアルゴリズムからでるパラメータでLive2Dのアバターを動かすように作ろうと考えた。
https://github.com/yutarochan/clmtrackr

![image](https://qiita-image-store.s3.amazonaws.com/0/64623/c37157ae-f985-0b30-3cdc-87a4f05e49ed.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/64623/f93cbf6a-e568-da2d-93cc-526ac90290c0.png)

元のLive2Dのアバターは、マウスやタッチなどといった方法で顔の角度を動かしていました。これを、トラッキングアルゴリズムからでた点を使う形でやってみました。鼻を基準にしてアバターを動かしてみることに・・・

![image](https://qiita-image-store.s3.amazonaws.com/0/64623/de76edbf-2b1c-fed4-8581-b7bf53667fe3.png)
６２番の点でマウスの位置とする。

そしてようやく、動くようになったが・・・動く範囲が小さい！（でもちょっとだけは、首の位置と反応します！）

![image](https://qiita-image-store.s3.amazonaws.com/0/64623/db700e2f-cacf-471a-bd4a-f7231af98e9a.png)

今回はここまでできましたが、次からは動かす範囲や、目、口のパラメータと色々してみたいので、またその時は投稿します。

Update: 利用規約のためソースは残念ながら載せることはできません。(´･ω･｀)
サイバー攻撃には多層防御で対抗！Trend Micro Deep SecurityとSOCの活用


このエントリは、SoftLayer Advent Calendar 2015の17日目のエントリーです。
鈴木 智明
#【概要】
昨今のセキュリティインシデントを踏まえ、クラウド環境のセキュリティ面も十分な考慮が必要とされています。
ここでは、SoftLayer上のサービスとして組込まれているセキュリティ機能についての課題と今後求められるセキュリティ対策について書きたいと思います。

![image](https://qiita-image-store.s3.amazonaws.com/0/59872/65aaa639-b4aa-130c-2bb1-f73313414e5d.png)

#【SoftLayerでのセキュリティサービスの課題】

SoftLayerでサービス提供されているウィルス・マルウェア対策、侵入検知/防御などは下記のような課題があります。

![image](https://qiita-image-store.s3.amazonaws.com/0/59872/91b7b87c-1782-ffc1-3564-8d23688ca9d6.png)
【課題】
・Windows Serverのみ提供で、Linux OSにおけるセキュリティ対策がとれない
・VM/ベアメタルともに月額課金モデルのみ提供
・一元管理のソフトウェアが標準バンドルされていない
・FortiGate は機能に制限
・NetScalerのWeb Application Firewallはライセンス次第で提供
・ログ監視やファイルやレジストリの変更監視のニーズに対応できない

#【多層防御の必要性】

**従来型の対策の限界**
従来型の対策とは、アクセス制御やパッチの適用、パスワードポリシーの強化といった予防的な対策になりますが、完璧な予防というのは困難であるという認識が必要です。

**今求められる対策**
いかに早く「気づき」、被害を最小限に留めるか、といった発見的な対策を強化していくことが強く求められています。
具体的には従来からある予防的な対策に加えて、発見的な対策を組み込み多層的な防御を行うことですが、守るべき情報を定義し、その情報の前に攻撃のプロセスに沿う形で多段に設け予防的な対策、発見的な対策を構築します。
これにより、攻撃者が予防的な対策を突破したとしても、後段の発見的な対策で、検知を行い攻撃を未遂に終わせる、万が一情報が盗まれてしまったとしても、最小限に抑えることが可能になると考えらます。

![image](https://qiita-image-store.s3.amazonaws.com/0/59872/0690a2a5-e77c-f2a0-640a-f7b4adba6da3.png)

#【Trend Micro Deep Securityとは】

サーバ保護に必要なセキュリティ対策のモジュールを1つのエージェントで実現したソフトウェア製品です。

セキュリティ対策のモジュールは下記が利用できます。
※ライセンスにより利用できるセキュリティ対策のモジュールが変わります。

**・ウイルス対策（Webレピュテーション機能付）**
**・侵入検知/防御(ホスト型IDS/IPS)**
**・ファイアウォール**
**・ファイルやレジストリなどの変更監視**
**・セキュリティログ監視**

![image](https://qiita-image-store.s3.amazonaws.com/0/59872/ea76ec1c-2a28-80df-a15d-335b5dd7b24c.png)

SoftLayerではベアメタルサーバ上のVMware ESX上で動作する仮想アプライアンス型保護モジュール Trend Micro Deep Security Virtual Applianceも利用可能。
Deep Security Virtual Applianceを各ESX上にインストールすることで、ハイパーバイザーレベルでのセキュリティ対策を実施することができます。
Virtual Applianceで提供するセキュリティ機能は下記の4つになります。

**・ウイルス対策**
**・侵入検知/防御(IDS/IPS)**
**・ファイアウォール**
**・ファイルの変更監視**

#【Security Operation Centerの必要性】

Deep Securityが持つ複数のセキュリティ対策モジュールを利用して導入できたとしても、その後の運用フェーズが最も重要になります。
そこでの課題として、例えば・・・

**・侵入検知/防御**
　検出モードで検知されたシグネチャや誤検出で検知されたシグネチャに対して、攻撃の有無や影響度が判断できない。
**・ファイル変更監視**
　検出されたイベント（ファイルの生成、変更、削除）がシステムの自動処理によるものなのか、攻撃者による意図的なものなのか判断できない。
**・セキュリティログ監視**
　検出されたイベントが、セキュリティ上問題のあるものなのか判断できない。

![image](https://qiita-image-store.s3.amazonaws.com/0/59872/b3c94206-7ad8-5e07-b6f2-83c354d90279.png)

検出したイベントに対して適切な判断、適切なアクションがなければ、セキュリティインシデントを防ぐことはできません。
また、単一モジュールのイベントを確認するだけでは、実際に発生している攻撃の有無、影響度を判断することはできません。

下記のような専門的なセキュリティ運用が求められています。

**・単一イベントを解析するのではなく、各モジュールのログを相関的に分析**
**・システム環境を把握した上での脆弱性情報、ナレッジベースや**
**　該当サーバのログとの付合せ、検出イベントからの判断**
**・セキュリティ専門のアナリストによる高度な対応**

#【サービスの導入効果】
Security Operation Centerによるマネージドセキュリティサービスを利用することで下記のように従来ユーザ側で行ったいた作業負担の低減と専門スキルが必要な運用負荷を軽減することが可能です。

![image](https://qiita-image-store.s3.amazonaws.com/0/59872/b68053b4-ae1e-101e-ace0-08626d2bb106.png)

#【まとめ】
・多層防御によるセキュリティ対策でリスク低減
　完璧な予防は困難と考え、いかに早く「気づき」て適切な対応を取るかが重要。
・SOC利用による専門家の支援と運用負荷軽減とコスト削減
　セキュリティ運用のアウトソース化により専門家の支援を受けることで、本来注力すべきコアビジネスに専念。
Pythonで簡単にJSONを整形表示する

# はじめに
最近JSONを扱うシーンが非常に多くなりました。
また、整形前の改行もされてない状況です。
pythonが全く書けない初心者でもLinuxやMacにはPythonが入っています。

# 前提
1. JSONファイルまたは文字列があること。
2. Linuxコマンドがそれなりに分かること。
3. 以下の例の場合だと、JSONファイルはsample.json

# お試し
```
$ python -mjson.tool sample.json
```

# さいごに
JSONとして誤っていたら、誤っていたら行数とカラム数が出ます。それをもとに修正してください。
tmux上でVimを開くときにpaneを分割する

2015/12/17追記
Macだとちゃんと動いたけどFedora22だとうまくいかない模様
何か方法考えます

2015/12/17さらに追記
tmux has-sessionでセッションが存在するかをチェックできるようなので、そちらを使うように修正しました。

おっきいディスプレイわーい！と思いながら使ってるわけですが、ターミナルを全画面で開いてるときにVimを起動すると余白が気になります。
サイドにタグバーとかファイル一覧とか出しててもやっぱり余白が大きい。
tmux使ってるんだし分割して動かせばいいかなと思ったんですが、いちいちスプリットしてから開くのも面倒なので自動でやってくれるように設定してみました。

tmuxはsplit-windowにコマンドを渡してあげると、分割した画面でそのコマンドを実行してくれるので

```
tmux split-window -h -p 70 "vim $1"
```
とします。
-hで水平分割、-p 70で横幅が全体の70%になります。
ちなみに-vを指定すると垂直分割になり、-pで指定した値が高さのパーセンテージになります。

これをvimのエイリアスにしてあげてもいいのですが、tmux上以外で実行するとエラーになるのでシェルの関数にしてみました。

```
split_vim() {
    tmux has-session &> /dev/null
    if [ $? = 0 ];
    then
    	tmux split-window -h -p 70 "vim $1"
    else
    	vim $1
    fi
}
```

これだけでもいいのですが、横幅が狭いときに分割されると今度は狭いのである程度幅があるときだけ分割するようにします。
$COLUMNSでカラム数がとれるのでこれをベースに

```
split_vim() {
    tmux has-session &> /dev/null
    if [ $? = 0 ] && [ $COLUMNS -ge 120 ];
    then
    	tmux split-window -h -p 70 "vim $1"
    else
    	vim $1
    fi
}
```

ついでに、すでに何かしらpaneの分割がされている場合には新たに分割したくない場合はlist-panesを使ってpaneの数を見る。

```
split_vim() {
    np=`tmux list-panes | wc | awk '{print $1}'`
    tmux has-session &> /dev/null
    if [ $? = 0 ] && [ $COLUMNS -ge 120 ] && [ $np = 1 ];
    then
    	tmux split-window -h -p 70 "vim $1"
    else
    	vim $1
    fi
}
```

この方法でtmuxの外でpaneの数を確認するとエラーメッセージが出るから数が1になるんだけど
あとのtmuxの存在確認で失敗するからまぁいいかなと妥協してます。
あとはこれをエイリアスにしてあげて

```
alias vim="split_vim $1"
```

としてあげると、vimと打ったときにpane分割してくれます。
横幅とかはお好みで指定するのがいいかと。

tmuxが起動してるか確認する方法とかpaneの数を確認する方法とか何か良い方法あればいいんだけど。
"map", "reduce", "filter"を書かない方法

SwiftではObjective-Cになかった`map`/`reduce`/`filter`が標準で提供され，お手軽にリスト操作ができるようになりました．
しかし，これらの関数は最近のモダンな言語なら大体用意されているものです．せっかくなのでSwiftらしいことがしたい！

ということで，やはりSwiftといえばその強固な型システムです．そこで上の3関数を振り返ってみると，当然ですが全て型が違いますね．
つまり，オーバーロードにより見かけ上一つの関数として提供することができるのです！

例えば，下のような`sin(1)`から`sin(100)`のうち正の数のみの和を求めるコードがあったとします．特に意味はありません．

```swift
let a = Array(0 ..< 100)
	.map { sin(Double($0)) }
	.filter { $0 > 0 }
	.reduce (0.0) { $0 + $1 }
```

Objective-Cに比べれば格段にスマートな感じで書けるわけですが，関数名の文字数が合っていなくて美しくないですし，まだ冗長に感じないでしょうか．
そこで，このようにSequenceTypeを拡張してあげます:

```swift
extension SequenceType {

	typealias Element = Self.Generator.Element

	func $<T>(@noescape transform: Element throws -> T) rethrows -> [T] {
		return try self.map(transform)
	}

	func $(@noescape predicate: Element throws -> Bool) rethrows -> [Element] {
		return try self.filter(predicate)
	}

	func $<T>(initial: T, @noescape combine: (T, Element) throws -> T) rethrows -> T {
		return try self.reduce(initial, combine: combine)
	}

}
```

すると，以下のように略記することができるようになります！

```swift
let a = Array(0 ..< 100)
	.$ { sin(Double($0)) }
	.$ { $0 > 0 }
	.$ (0.0) { $0 + $1 }
```

# まとめ
読みにくいですし，型推論に時間がかかりすぎるので使わない方がいいと思います．

標準の型を拡張すると初見の可読性が下がる一方で，思わぬ便利な使い方ができることもあるので，バランスをとりつつ積極的にextension書いていきましょう！
あるいはSwiftもFoundationもオープンソース化されたことですし，良いextensionが書けたら[プルリク](https://github.com/apple/swift-corelibs-foundation/) を送って標準ライブラリにしてしまうのも手かもしれませんね．
binlog_cache_sizeにメモリを食われた話

この記事は[MySQL Casual Advent Calendar 2015](http://qiita.com/advent-calendar/2015/mysql-casual)の17日目です。

# マスタのメモリが減っていく

MyISAM＋マスタ—スレーブ構成のMySQLを使っているサービスがあったんですが、さすがにMyISAMを使い続けるのもアレなので、InnoDBへバージョンアップすることになりました。

まずはスレーブをInnoDBにしてサービスに投入。問題がないことを確認してからメンテナンスに入れてマスタをInnoDBに変更。
サービスを再開してからしばらく様子を見ていたところ、一見が問題ないように見えたんですが、どうもじわじわメモリが減っている…

グローバルバッファを減らしたり、スレッドバッファを減らしたり、再接続してみたり、テーブルをクローズしてみたりといろいろしてみたんですが、全然メモリの減りが止まらなくて焦りながらいろいろと調査していました。

# binlog_cache_sizeが原因だった

検証環境を用意して、大量のコネクションをはってパラメータをいろいろといじってみたところ、なんでかかなり大きく設定されていたbinlog_cache_sizeののサイズを減らすと、メモリ使用量が減ることが分かりました。

ちなみに再現時のMySQL(`5.6.27`)の設定はこんな感じ。

```
[mysqld]
...
innodb_buffer_pool_size = 5G
max_connections = 5000
log-bin
binlog_cache_size = 16M
thread_cache_size = 0
```

検証用のRubyプログラムはこんな感じ。

```rb
#!/usr/bin/env ruby
require 'mysql2'
require 'thread'

options = {host: '10.0...', port: 3306, database: 'test', username: 'scott', password: 'tiger'}
data = 'X' * 255

4000.times.map {
  Thread.start do
    client = Mysql2::Client.new(options)
    loop do
      begin
        client.query("SELECT * FROM test LIMIT 10000")
        client.query("INSERT INTO test VALUES ('#{data}')")
        sleep 1
      rescue => e
        p e
      end
    end
    client.close
  end
}.each {|t| t.join }
```
※ちなみにこのプログラムを`mysql2 4.2`で動かすとなんでかSEGVします

# binlog_cache_sizeを変更してみた
[binlog_cache_size](https://dev.mysql.com/doc/refman/5.6/ja/replication-options-binary-log.html#sysvar_binlog_cache_size)は動的に変更できるので、稼働しているサーバで`set global binlog_cache_size=...`を実行して、コネクションを再接続してみました。

![15bffbde.JPG](https://qiita-image-store.s3.amazonaws.com/0/20100/f1fb391d-2c5e-6cb6-1993-406e4da7ffa1.jpeg)

メモリのじわ減りは止まらずっ………！

検証環境でも再現したんですが、`set global binlog_cache_size=...`でサイズ変更しても、じわじわ減っていくんですよね。`flush logs`したり、binlogをパージしたりすると少し回復するんですが、全体の傾向としてはメモリは増え続けたままでした。

# 結局

結局、待機系のMySQLの設定を変更して再起動して、そちらの方にフェイルオーバーするということをやりました。変更して再起動したあとのMySQLでは、同様の状況は発生していません。

すいません、この件原因を追い切れていません…
何かご存じの方がいましたらご教授ください :bow: 

あまり知見のない記事ですが、もし同様の状況で困っている方がいましたら、参考になれば幸いです。
[Swift] 再帰的な構造から特定プロパティの最大値や最小値を取得する

# はじめに
再帰的な構造から特定プロパティの最大値や最小値を取得することは簡単に可能。

# 環境

* Swift 2.1.1

# ポイント

* <ins>子のコレクションに対し</ins>`reduce`を使い、<del>必要な値以外は切り捨てる</del> <ins>欲しい値（最大、最小等々）を抽出する</ins>。
* 単にそれを再帰的に繰り返していく。
* 子のコレクション（下記の例では`children`）が`nil`の場合は気をつける。

# 最大値を取得するサンプルコード

```swift
import Darwin

class Foo<T where T: Comparable, T: Equatable> {
    var value: T
    var children: [Foo<T>]?
    init(_ value: T) {
        self.value = value
    }
}

extension Foo {
    var maximumValue: T {
        return children?.reduce(value, combine: { max($0, $1.maximumValue) }) ?? value
    }
}

// verification

var children = [Foo<UInt32>]()
var expected: UInt32 = 0

for _ in 0..<5 {
    // child0
    let value0 = arc4random_uniform(1000)
    let subchild0 = Foo(value0)
    expected = max(expected, value0)
    // child1
    let value1 = arc4random_uniform(1000)
    let subchild1 = Foo(value1)
    expected = max(expected, value1)
    // child2
    let value2 = arc4random_uniform(1000)
    let subchild2 = Foo(value2)
    expected = max(expected, value2)
    // child3
    let value3 = arc4random_uniform(1000)
    let subchild3 = Foo(value3)
    expected = max(expected, value3)
    // child4
    let value4 = arc4random_uniform(1000)
    let subchild4 = Foo(value4)
    expected = max(expected, value4)
    // child
    let value = arc4random_uniform(1000)
    let child = Foo(value)
    expected = max(expected, value)
    child.children = [subchild0, subchild1, subchild2, subchild3, subchild4]
    children += [child]
}

let value = arc4random_uniform(1000)
let foo = Foo(value)
foo.children = children
expected = max(expected, value)
print(expected == foo.maximumValue) // true
```
twitterでよくつぶやかれているさだまさしの名曲を集める

昨日に引き続き、25日間完走するための穴埋めです。察してください。

手軽に作れつつ、実際に役に立つものを何か作ってみようと思って、完全に俺得なのですが**「twitterでよくつぶやかれているさだまさしの曲」**を集めてみました。

# 動機
個人的な話なのですが、500曲以上曲を聴き続けているとどうしても趣味が偏ってしまい、自分が好きな曲と、世間的に知名度がある曲とのギャップが生まれてしまいます。
なので意外と、もしかしたらコアなファンあるあるかもしれませんが、「世間で受け入れられているさだまさしの曲」が分からなかったりします。

知人に尋ねてみても、**「さだまさしの曲？知ってる知ってる、「神田川」でしょ」**といった、憤怒のあまり卒倒してしまいそうな回答しか得られません。
なので、みんなだいすき twitter で、民意（？）を集めてみることにしました。

# デモサイト
<https://sadatech.herokuapp.com/youtube>

![image](https://qiita-image-store.s3.amazonaws.com/0/44364/b6d63233-680c-ee40-2ac5-e5c89f8937bb.png)

twitter で YouTube の URL とともに紹介されているさだまさしの歌を集めて、一応その場で動画を見れるようにしています。
左側の一覧は収集できた曲一覧で、バッジの数字はその曲についてつぶやいている人の数です。

データベースなどは用意せず、ページがリクエストされた度に twitter API を叩きにいっているゆとり設計です。
そして bot 判定は一応しているのですが、面倒なので一律で扱っています。

# どんな曲が多いか
時期的な影響も多少ありそうですが、概ね以下のような曲がつぶやかれる回数が多いようです。

* 関白宣言
* 主人公
* 遙かなるクリスマス
* 案山子
* 償い
* ...

「関白宣言」は言わずもがなですね。セールス的に最大のヒット曲です。

「主人公」は TV 番組の主題歌でもなく一般には知名度は低そうに思えますが、長年ファンの人気投票で１位を取り続けている、知る人ぞ知る名曲です。

「遙かなるクリスマス」もシングルカットもされてない曲ですが、紅白歌合戦で歌われた事もきっかけで多く人に認知された曲ですね。「クリスマス」という単語に似つかわしくない、さだまさしには珍しい情熱的で直情的な思いがぶつけられている曲です。
今が12月でクリスマスシーズンであるということも、この曲が多い理由のひとつでしょうね。

「案山子」も長年語り継がれている名曲です。「かかし」と読めない人も世代的には増えているのでしょうか...

「償い」もシングルカットされてないですが、[とある裁判官の振る舞い](http://spotlight-media.jp/article/179472428025532589)がきっかけで、世の中の多くのシーン（特に運転免許取得時など）で耳にする事が多くなった曲です。


と、特にオチも無いのですが、取り上げられる事が多い曲が「世間で受け入れられている曲なんだな...」と、ひとり納得をしています。

そして、僕が結構好きな「[8つ目の青春](https://www.youtube.com/watch?v=2Zwiuw77mPk)」などのようなマイナーでファンからも忘れられていそうな曲は、なかなかつぶやかれる機会も無いようです。

# 実装
こちらも昨日同様、実装としてはあまり大した事はしていません。
同一曲の同定の部分で、若干の自然言語処理的な処理を行っています。

## twitter search API 
前日同様、情報ソースとして、twitter search API を使用して情報を取得します。
クエリーは `"さだまさし" "youtube"`

## つぶやきから歌のタイトル情報の取得
あらかじめ、さだまさしの歌のタイトル一覧を辞書として用意し、それを元に trie 木を作ります。
そして、抽出したつぶやき文字列を先頭位置から終端までカーソル移動していき、common prefix search でマッチした文字列をタイトル候補として抽出します。

### 誤判定との戦い
しかし、いろいろ課題があり、たとえばさだまさしには「51」というタイトルの曲があり、ナイーブにやりすぎると数字の羅列をタイトルと誤認してしまいます(20151217など)

なので、つぶやき文字列を `kuromoji` などで形態素解析し、カーソルを1文字単位ではなく形態素単位で移動していくことで、先に述べたような単純な数字の羅列を誤認するようなことは減らせます。

それでも、やはりどうしても誤判定は無くせてません。たとえば「長崎から」という曲があるのですが、同名の「長崎から」という名前の野外コンサートをさだまさし氏は20年以上実施しており、多くの動画が YouTube にも存在します。こうなると、文字列だけでは曲の名前なのか、コンサートの名前なのか、判別できないケースが発生しやすくなります。

あと、「関白宣言」を「亭主関白の歌」と書いているつぶやきが非常に多い......これはリアルで話していてもよく遭遇するケースではあります。

この辺の名寄せ的な作業はやろうと思えば対応できそうですが、あまり細かくやり過ぎても辛いので、取り敢えず今回はゆとりな感じで対応しています。

# 次回
穴埋めのため軽め目の記事で寄り道をしましたが、次回は、一応完成版の**「さだロボ」**の話を書きます。