OmniAICreator/Qiita-1.07M huggingface dataset:
外部ファイルのjsonを読み込んで使う


長いリストなどローカルに持ってるけど、外部ファイルに置いておくときなど、そのファイルを読み込むときに使う。



```js:hoge.js
		httpObj = new XMLHttpRequest();
		httpObj.open("get", "./js/group.json", true);
		httpObj.onload = function(){
				var myData = JSON.parse(this.responseText);
				var txt = "";
				for (var i=0; i<myData.length; i++){
                   var option = document.createElement("option");
                    option.innerText = myData[i].name;
                    option.value=myData[i].value;
                    document.getElementById("group_select").appendChild(option); 
				}

			}
	   httpObj.send(null);
```


openメソッドは`open(HTTPリクエストメソッド,発行URL,非同期リクエストをするかどうか)`
sendメソッドは`send(リクエストボディーの文字列)`


```js:ex)
httpRequest.send('param1=value1&param2=value2');
```

このようなかんじで使うみたい。

参考:http://webos-goodies.jp/archives/50548720.html



ちなみに、Chromeでデバッグをするときはローカルであれなんであれ外部jsonファイルを読み込もうとすると怒られるので、


```bash:terminal
open -a Google\ Chrome --args --allow-file-access-from-files

```


外部ファイルをアクセスできる設定をつけてchromeを開いてデバッグする。
Framework内でCライブラリをmoduleとして使う方法


SwiftからCライブラリを使いたい場合、
アプリプロジェクトではbridging headerでヘッダーをincludeしてライブラリをリンクすれば使えますが
Frameworkプロジェクトではbridging headerが使えません。
そのため必要なヘッダーファイルをプロジェクトにコピーしてアンブレラヘッダーでincludeする必要があります。
(更にコピーしたヘッダーをpublicにしないとエラーが出ます。)

最近、Cライブラリをmodule化してもいけると知ったので手順を書きます。

ここでは例としてlibxml2を使う場合を書きます。

## 設定手順
### module.modulemapを用意する
#### 1.プロジェクトファイルがあるディレクトリに `module.modulemap` を作成

```module.modulemap
module libxml2 [system] {
    link "xml2"
    umbrella header "umbrella-libxml2.h"
    export *
    module * { export * }
}
```

#### 2.アンブレラヘッダーを作成

```
// 使いたいライブラリのヘッダーを書く
#import <libxml2/libxml/HTMLtree.h>
#import <libxml2/libxml/xpath.h>
#import <libxml2/libxml/xpathInternals.h>
```

### プロジェクトを設定する
#### ヘッダーのパスを設定

`Build Settings > Search Paths > Header Search Paths` に `$(SDKROOT)/usr/include/libxml2` を追加。


#### module.modulemapファイルへのパスを設定

`Build Settings > Swift Compiler - Search Paths > Import Paths` に `$(SRCROOT)` を追加。

### 使う
ここまで設定してswiftファイルに `import libxml2` と書けば
フレームワーク内でCライブラリが使えるようになります。

## もう少し良くする
上記までで使えるようになりますが、
このままでは作成したフレームワークをインポートするアプリプロジェクトでも
ヘッダーのパスを設定する必要があります。
これはヘッダーをフルパスで指定すれば解決します。

## 参考リンク
[Getting Started Using C Libraries from Swift](http://spin.atomicobject.com/2015/02/23/c-libraries-swift/)

[Importing CommonCrypto in a Swift framework](http://stackoverflow.com/questions/25248598/importing-commoncrypto-in-a-swift-framework) - stackoverflow
「JAWS-UG広島　第５回勉強会」に参加したよ

https://jawsug-hiroshima.doorkeeper.jp/events/35125

JAWS-UG広島に参加しました。

裏話的な内容がいろいろと散りばめられていて面白かったです。
スライドだけではわからない面白さがありました。

![20151205_JAWS_UG広島5.png](https://qiita-image-store.s3.amazonaws.com/0/53620/74ccf524-d466-e4bb-85bb-6a1d3fbe7c87.png)

「安全に使うための知識」は重要ですね。
自分は違うとは思わずにきちんとする必要があると思いました。
発表を聞いているとき、すごく気になってマネジメントコンソールから請求額を確認しました。

発表を聞いたあと、個人の AWS アカウントに対しても MFA, IAM を設定しました。

「スケーラブル」「セキュリティ」のセミナーは、一度受けてみたいと思いました。
Cycript debugging


この記事は [iOS Jailbreaking Advent Calendar 2015](http://qiita.com/advent-calendar/2015/ios-jailbreaking) の6日目の記事です。

[cycript](http://www.cycript.org/)はObjective-C++とJavaScriptのSyntaxで記述出来るiOS, OSX上で実行出来るObjective-C++のREPLおよびプロセスにアタッチしLLDBのように変更が出来るツールです。

ちなみに[GPL3のOSS](http://gitweb.saurik.com/cycript.git)です。

### for debug

その性質上、プロセスにアタッチし

* このタイミングでこの型のインスタンスが取れると良いんだけどなあ
* ここでどうにかしてこんな状態にもっていきたい

とかいった状況の時によく利用しています。

#### get instance
tweak上でNSLogでオブジェクトについてログを吐かせておけばそのアドレスがわかります。
そのインスタンスから試行錯誤する際に`#<Address>`でインスタンスを取得出来ます。

````
cy# var a = #0x12fd509c0
#"<Application: 0x12fd509c0>"
````

#### ObjC message send

Objective-Cのメッセージ送信、プロパティへのアクセスはそのまま書けます

````
cy# [a keyWindow]
#"<MobileSafariWindow: 0x12fef5c70; baseClass = UIWindow; frame = (0 0; 375 667); opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0x12fef7a40>; layer = <UIWindowLayer: 0x12fef61b0>>"
cy# a.keyWindow
#"<MobileSafariWindow: 0x12fef5c70; baseClass = UIWindow; frame = (0 0; 375 667); opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0x12fef7a40>; layer = <UIWindowLayer: 0x12fef61b0>>"
````

cycriptでdebugする上で素晴らしいのはunrecognized selectorにメッセージ送信してもプロセスがクラッシュしない点です。

````
cy# [a hoge]
Error: unrecognized selector hoge sent to object 0x12fd509c0
````

#### ivar
ivarへはCにおける構造体ポインタ書式`->`でアクセス出来ます。

````
cy# a->_backgroundHitTestWindow
#"<_UIBackgroundHitTestWindow: 0x12fd451d0; frame = (0 0; 375 667); gestureRecognizers = <NSArray: 0x1311059f0>; layer = <UIWindowLayer: 0x12fdc1720>>"
````

#### choose(Class)
`choose(Class)`でメモリ上からいい感じにインスタンスをゲットしてきてくれます。べんり。

````
cy# choose(BrowserController)
[#"<BrowserController: 0x12fe56f50>"]
````

### まとめ
私がよく使っているのは上記程度。詳しくは公式ドキュメントの方が詳しいです。
同梱されているスクリプトをimportする事でsubstrateの`MSHookMessageEx()`を呼び出して動的かつインタラクティブにswizzleする事も出来ますが、swizzle部分はtweak側で書いた方が楽な気がします。アドレスとれるし、利用するなら最終的に書かないといけないので。
Macの隠しファイル表示を切り替えるスクリプト


El Capitan にバージョンアップしたら、なんだか隠しファイルが隠れてしまった。
ちゃんと表示するように設定していたんだけど、まあデフォルトに戻ったということなんでしょうね。
ただ、Web開発とかしていると結構隠しファイルを弄ることも多くて、いちいちターミナルでコマンドを打つのも面倒くさい・・・ということで、ネットで調べて切り替えようのスクリプトを書いてみました。

###HiddenFileVisible.scpt
```
display dialog "隠しファイルを表示しますか?" buttons {"表示する", "隠す"} with icon 2 with title "Switch to Hide mode" default button 1
set switch to button returned of result
if switch is "隠す" then
	do shell script "defaults write com.apple.finder AppleShowAllFiles FALSE;killall Finder"
else
	do shell script "defaults write com.apple.finder AppleShowAllFiles TRUE;killall Finder"
end if
```

上記のように適当な名前をつけて、ユーザスクリプトフォルダに保存すると、あとはこれを選ぶだけで隠しファイルの表示・非表示の切り替えが簡単に行えますよ。
C++でtemplate使ってカバレッジとったらnot executed

lcov使ってカバレッジとったら## not executedになっていたので調査。

当初は以下の対処で直るのかなと思っていたが違った。
http://d.hatena.ne.jp/yupo5656/20051215/p2

原因はlcovの実行の仕方だったみたい。
templateクラスを同じtemplate引数でインスタンス化しているcppファイルが複数あったため、lcovでカバレッジ取得すると最後のファイルの分だけでカバレッジの結果が上書きされていた。

lcovの実行方法直すのはやり方がよくわからなかったので、呼び出しを1ファイルからだけにして解決した。
知ってると絶対トクする、MovableTypeのグローバルモディファイア

こんばんわ、しょごです。

今回はMovableTypeのグローバルモディファイアを紹介します。

#グローバルモディファイアとは

元来MTタグにはタグそれぞれ専用のモディファイア（HTMLタグでいうアトリビュート、imgタグでいうaltみたいなもの）
が存在しますが、それ以外にどのタグでも使えるグローバルモディファイアというものが存在します。

こいつが実はなかなか使えるものが多いんですが、あまり知られていません。
なので今回はそのグローバルモディファイアとその効果を紹介します。

##_default

ファンクションタグが空だった場合、ここに設定されたものが出力されます。

```
<$MTEntryTitle _default="タイトルが無いぜウェーイ"$>

```

## cat

設定すると、タグ出力で格納されている文字列の末尾に設定した文字列を付与することができる。
下記のようにすると語尾ににゃんがつく。例：記事のタイトルにゃん
見た目だけみると文字をカットするようにも見えるが実は違うので注意

```
<$MTEntryTitle cat="にゃん"$>
```

## count_characters

1を設定したMTタグで出力される文字列の空白を含んだ文字数が出力される。

```
<$MTEntryTitle count_characters="1"$>
```

## encode_html

1を設定したMTタグをHTMLエンコードして出力する。
<や>は&lt;、&gt;となる

```
<$MTEntryBody encode_html="1"$>
```

## encode_url

1を設定したMTタグをURLエンコードして出力する。

```
<$MTEntryPermalink encode_url="1"$>
```

## lower_case

1を設定するとMTタグ内の値を小文字に変換する

```
<$MTEntryBody lower_case="1"$>
```

## upper_case

1を設定するとMTタグ内の値を大文字に変換する

```
<$MTEntryBody upper_case="1"$>
```

## nl2br

1を設定すると空白行を<br>に変換してくれる（カスタムフィールドのテキストエリアを使った場合改行されない場合はこれをつける）
xhtmlを付与すると<br />が出力される。

```
<$MTEntryBody nl2br="1">
<$MTEntryBody nl2br="xhtml">
```

## remove_html
1を設定するとMTタグ内のHTMLタグを除外する

```
<$MTEntryBody remove_html="1"$>
```

## replace
検索対象の文字列(AAAA)と変換後の文字列(BBBB)を設定することでMTタグ出力の際に置換してくれる。
例えばテストサーバのURLを本番用に変換したいときなどに使用する。

```
<MTEntryPermalink replace="AAAA","BBBBB">
```

## regex_replace

replaceの正規表現バージョン。

```
<MTEntryBody regex_replace="/twaintail/","meidofuku">
```

## setvar
このモディフィアを利用すると出力はされず、指定した値に変数として格納されます。
<MTSetVarBlock>を利用したものと同じ効力が得られます。

```
<$MTEntryBody setvar="moemoe"$>
```

## trim_to
指定した文字数のみ出力します。

```
<$MTEntryTitle trim_to="20"$>
```

## zero_pad

指定した文字数になるように0で埋めます
例えば5と指定した場合、出力される文字が2の場合は「00002」となります。

```
<$MTprice zero_pad="5"$>
```


他にもグローバルモディファイアはあるので、用途によって使い分けてみてください。
今までMTタグでわさわさかかなきゃいけなかったものがぐんと楽になるものもある、かもしれませんよ。
internal vs MobileSubstrate


この記事は [iOS Jailbreaking Advent Calendar 2015](http://qiita.com/advent-calendar/2015/ios-jailbreaking) の5日目の記事です。

なんのことかというとtheosを使った際にtweakのキモであるMethod swizzleをする手法をどちらにするかという話。

### internal
ObjC黒魔術の源 `objc/runtime.h` より`method_getImplementation()`と`method_setImplementation()`を使ったswizzle
メソッドの追加には`class_addMethod()`が使用されます。

### MobileSubstrate
substrate.hより`MSHookMessageEx()`を使用したswizzle
メソッドの追加にはinternalと同様に`class_addMethod()`が使用されます。

## Theos generator
swizzleやaddMethodをするこの2種類を設定によって簡単に変更出来ます。
ファイル毎に変更が可能で、これがsubstrate。

````LOGOS:Tweak.xm
%config(generator=MobileSubstrate)
````

これでinternalで生成されます。

````LOGOS:Tweak.xm
%config(generator=internal)
````

またMakefileで記述する事も可能です。

````Makeifle:Makefile
XXXX_LOGOSFLAGS = -c generator=internal
とか
ADDITIONAL_LOGOSFLAGS = -c generator=internal
````

このFLAGSは最終的にlogos.plの引数として渡され[configに設定されます](https://github.com/DHowett/theos/blob/master/bin/logos.pl#L36)。

````perl:logos.pl
GetOptions("config|c=s" => \%main::CONFIG);
````

上記の通り、long value `--config generator=internal` 形式でも可。

デフォルトは[MobileSubstrate](https://github.com/DHowett/theos/blob/master/bin/logos.pl#L31)で、その後にFLAGSの設定があれば上書きされます。
ちなみにこのデフォルトは様々なtheos forkでは変わっていたりします。

### で、どっちがいいの
その昔、saurik氏は有名なforkにおいてデフォルトが`generator=internal`になっている話の流れで「tweak側でアップデートをしなくともsubstrate側のアップデートでバグの修正等を得られる」（たしか）と言っていました。
それはそれで真実ですが、iOS 9から最近のアップデートがなされるまでsubstrateはなかなかバギーな状況で

* generatorをinternalにしたらバグがなおる
* substrate.dylibへのリンクをやめるとバグがなおる

私が経験しただけでこの2種類程の症状がありました。

どっちが正解という事もないと思いますが、これまでの開発のなかで「internalだとバグるけどMobileSubstrateにするとなおる」という事態には遭遇したことがないので、最近はinternalの方が良いのではないかなと感じています。
CafeSnapで使用しているライブラリ（iOS版）

オールアバウト Advent Calendar 6日目です。

オールアバウトで開発しているiPhoneアプリ[CafeSnap](http://cafesnap.me/)で使用しているライブラリの紹介です。
写真投稿アプリを作る場合、どんなライブラリを使えば作れるかの参考になればと。

Android版のライブラリ紹介は、以下でやっています。
http://qiita.com/wrbss/items/6acd1daff0d82d7f9165

## 使用しているライブラリ

### [AFNetworking](https://github.com/AFNetworking/AFNetworking)
もう説明もいらない感じの、定番通信系ライブラリ。
Objective-Cで書くなら、まず初めに入れてます。

### [BlocksKit](https://github.com/zwaldowski/BlocksKit)
コールバック処理をdelegateせずにBlockで書けるようにするためのライブラリ。
単純なコールバック処理はこれで書いてます。
やり過ぎるとよく分からなくなるので、大きすぎるBlockはちゃんとdelegateしましょう。

### [MBProgressHUD](https://github.com/jdg/MBProgressHUD)
読み込み中インジケータを出すためのライブラリ。

### [SDWebImage](https://github.com/rs/SDWebImage)
サーバー上の画像を表示するための定番ライブラリ。
キャッシュもいい感じにやってくれる。

### [EAIntroView](https://github.com/ealeksandrov/EAIntroView)
初回起動時にアプリのチュートリアルを出すためのライブラリ。

### [SSPullToRefresh](https://github.com/soffes/sspulltorefresh)
Pull to Refreshを実装するためのライブラリ。
一覧系画面の更新などに使用しています。

### [Crashlytics](https://try.crashlytics.com/)
クラッシュレポートを取得するためのツール。
[Fabric](https://fabric.io/)に統合されましたね。

### [TwitterKit](https://fabric.io/kits/ios/twitterkit)
こちらもFabricの一部。
Twitterログインや投稿をアプリ内に実装するために使っています。

### [TOWebViewController](https://github.com/TimOliver/TOWebViewController)
ちょっとリッチなアプリ内WebViewライブラリ。
iOS9になったら、SafariWebViewControllerに置き換わりそう。

### [FBSDCoreKit, FBSDLoginKit](https://github.com/facebook/facebook-ios-sdk)
Facebook APIを使うためのFacebook公式ライブラリ。
Facebookへのログイン、投稿に使っています。

### [iVersion](https://github.com/nicklockwood/iVersion)
アプリの新しいバージョンがストアにあがっている場合、
新しいバージョンが存在することをアプリ内で通知するためのライブラリ。
アプリのバージョンアップをしない人が結構いるので、導入しました。

### [RDVCalendarView](https://github.com/robbdimitrov/RDVCalendarView)
カレンダーViewを実装するためのライブラリ。

### [HMSegmentedControl](https://github.com/HeshamMegid/HMSegmentedControl)
Androidぽいスワイプで移動できるセグメントを実装するためのライブラリ。

### [CHTCollectionViewWaterfallLayout](https://github.com/chiahsien/CHTCollectionViewWaterfallLayout)
Pinterestみたいな段ズレがあるCollectionViewを実装するためのライブラリ。
アプリのタイムラインに使用しています。

### [ActionSheetPicker](https://github.com/skywinder/ActionSheetPicker-3.0)
ActionSheetにUIPickerViewを表示するためのライブラリ。
入力項目を隠さずにPickerを表示するために、入力が多い画面に使用しています。

### [MTDates](https://github.com/mysterioustrousers/MTDates)
NSDateのラッパーライブラリ。
日付操作が簡単にできます。カレンダーViewと組み合わせて使っています。

### [SwipeView](https://github.com/nicklockwood/SwipeView)
デフォルトのフォトアプリみたいな、スワイプによるページング操作を可能にするライブラリ。
写真の一覧表示に使っています。

## さいごに
以上、iOS版CafeSnapで使用しているライブラリの紹介でした！
カフェなどに興味ございましたら、ぜひダウンロードしてみてくださいね。

http://cafesnap.me/
[*Cordova*] カメラプラグインを使ってみる

# はじめに
カメラプラグインの動作テスト。

# プラグインの追加
プロジェクトを作成してプラットフォームを追加し、カメラプラグインを追加。

```bash
$ cordova create camera
$ cd camera
$ cordova platform add ios
$ cordova plugin add cordova-plugin-camera
```

# コード

```html:index.html
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">
		<meta name="format-detection" content="telephone=no">
		<meta name="msapplication-tap-highlight" content="no">
		<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
		<link rel="stylesheet" type="text/css" href="css/index.css">
		<title>Hello World</title>
	</head>
	<body>
		<div class="app">
			<h1>Camera</h1>
			<div>
				<button id="take_pictures">写真撮影</button>
				<div>
					<img src="" id="image" width="500px" />
				</div>
			</div>
		</div>
		<script type="text/javascript" src="cordova.js"></script>
		<script type="text/javascript" src="js/index.js"></script>
	</body>
</html>
```

```js:index.js
var app = {
	initialize: function() {
		this.bindEvents();
	},
	bindEvents: function() {
		document.addEventListener('deviceready', this.onDeviceReady, false);
	},
	onDeviceReady: function() {
		var button = document.getElementById("take_pictures");
		button.addEventListener("click", takePictures);
	}
};

app.initialize();

// 写真撮影ボタンを押した時に呼ばれる
function takePictures(){
	navigator.camera.getPicture(cameraSuccess, cameraError, { quality: 80, destinationType: Camera.DestinationType.DATA_URL });
}
// 写真撮影が成功した時
function cameraSuccess(image){
	var img = document.getElementById("image");
	img.src = "data:image/jpeg;base64," + image;
}
// 失敗した時
function cameraError(message){
	alert("Failed!!: " + message);
}
```

# カメラプラグイン概要
デバイスのカメラを起動して写真が撮れたり、デバイス内のギャラリーから写真を検索できる。
撮影した写真はBase64でエンコードされた文字列か、ファイルのURIのどちらかで返す。

# オプション指定

|値|説明|
|:--|:--|
|quality|写真のクオリティを0〜100で指定。|
|destinationType|戻り値のフォーマットの指定。<br>Camera.DestinationType.DATA_URL<br>Camera.DestinationType.FILE_URI|
|sourceType|ソースタイプ指定。<br>Camera.PictureSourceType.PHOTOLIBRARY（写真ライブラリから画像選択）<br>Camera.PictureSourceType.CAMERA（端末のカメラで写真撮影）<br>Camera.PictureSourceType.SAVEDPHOTOALBUM（アルバムから画像選択）|
|allowEdit|画像を選択する前の簡単な編集を許可。|
|encodingType|画像ファイルのエンコードタイプ。|
|targetWidth|画像スケールのためのピクセルでの横幅指定。|
|targetHeight|画像スケールのためのピクセルでの縦幅指定。|
|mediaType|sourceTypeでPHOTOLIBRARYまたはSAVEDPHOTOALBUMを指定した時のみ有効。<br>Camera.MediaType.PICTURE<br>Camera.MediaType.VIDEO<br>Camera.MediaType.ALLMEDIA|
|correctOrientation|画像を写真撮影した時と同じ向きにするかどうか。|
|saveToPhotoAlbum|写真撮影後に端末に画像を保存するかどうか。|
|popoverOptions|iOSのみの設定。iPadでポップオーバー位置を明示するかどうか。|
|cameraDirection|背面のカメラか正面のカメラどちらを使うか。|

# 実行結果
写真撮影ボタンを押すと以下が表示され、許可するとカメラが起動。
![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/48912/4d7c2b9e-730d-6dc6-b592-218e11ff4b7a.png)

写真を撮って「Use Photo」を押すとボタンの下に画像が表示される。
![s_IMG_0219.png](https://qiita-image-store.s3.amazonaws.com/0/48912/3e8726a3-852f-de18-eb2a-79514c1a00ba.png)

# まとめ
カメラ簡単に使えるので便利だった。

# 参考
* [cordova-plugin-camera](https://www.npmjs.com/package/cordova-plugin-camera)
【Swift】特定のカスタムViewController内でステータスバーを隠す設定を書く【メモ】

`prefersStatusBarHidden`をオーバーライドして設定する。

```swift

class MyCustomViewController: UIViewController {

// ~略~
    
    override func prefersStatusBarHidden() -> Bool {
        return true
    }

// ~略~

}
```
ttygifでターミナル操作ログのgifアニメ化

`ttyrec`と`ttygif`っていうツールを使ってターミナルの操作をgifアニメにする。
こんな感じ
![tty.gif](https://qiita-image-store.s3.amazonaws.com/0/76240/886c8a68-4249-3cd1-6437-c5c3b7b6f641.gif)


# ttyrec
ターミナルの操作ログを録画・再生することができる。
ttyrec内ではscriptコマンドを利用してマイクロ秒単位で情報を埋め込んでいる、らしい。
http://0xcc.net/ttyrec/

## ttyrec導入
以下からダウンロード、makeして、`ttyrec`, `ttyplay`, `ttytime`をPATHの通った場所にコピーする。
http://0xcc.net/ttyrec/#download

```sh
$ wget http://0xcc.net/ttyrec/ttyrec-1.0.8.tar.gz
$ tar zxf ttyrec-1.0.8.tar.gz
$ cd ttyrec-1.0.8
$ make
$ cp ttyrec ttyplay ttytime /usr/local/bin
```

# ttygif
`ttyrec`コマンドで録画したデータをもとにそれをgifアニメにしてくれるツール。
他にもいくつか同様のツールがいくつかあるらしいが、これはPure Goで書かれているのでImageMagick等への依存がない。
[ターミナル操作の記録(ttyrec)からGIFアニメを生成するツールを作った - すぎゃーんメモ](http://d.hatena.ne.jp/sugyan/20140719/1405729672)
https://github.com/sugyan/ttygif

## ttygif導入
以下から各自の環境のものをダウンロードして`ttygif`をPATHの通ってる場所へコピー
https://github.com/sugyan/ttygif/releases

自分は64bit Macなので`ttygif_darwin_amd64.zip`をダウンロード

```sh
$ wget --no-check-certificate https://github.com/sugyan/ttygif/releases/download/0.0.1/ttygif_darwin_amd64.zip
$ unzip ttygif_darwin_amd64.zip
$ cp ttygif_darwin_amd64/ttygif /usr/local/bin
```

# 使い方

* 録画

```sh
$ ttyrec output.tty
```
Ctrl+Dもしくは`exit` するまで引数で指定したファイル(ここではoutput.tty)に録画する。

* 再生

```sh
$ ttyplay input.tty
```
引数で指定した録画ファイル(ここではinput.tty)を再生

* 時間

```sh
$ ttytime input.tty
```
引数で指定した録画ファイル(ここではinput.tty)の録画時間を秒単位で出力

* gif化

```sh
$ ttygif -in input.tty -out output.gif
```
引数で指定した録画ファイルを指定したgifファイルに出力

再生速度などのオプションもあるので詳しくは本家サイトやgithubを参照してください。

---
無視できるレベルだけど、vimを使うと何か変な文字列が出現する... （実際に操作している時には表示されていない）
![tty.gif](https://qiita-image-store.s3.amazonaws.com/0/76240/c3176eb8-ff2a-819b-dc33-0bfefeb7c24a.gif)
年末に向けて大掃除！ Flash内のお掃除tipsの紹介


2015年もついに終わりに近づいていて、今年の大掃除ももうすぐ始めなきゃ―。と思う時期ですね。今日のFlash Advent CalenderではFlashファイル内のお掃除・お片づけにまつわるtipsを紹介します！

## 使用していないシンボルが増えてきた

- ライブラリ内を整頓したいけど、どれを削除していいかわからない＞＜

使用数が0のアイテムは使用していないので、今後使われることがないなら削除しましょう。

![Flashライブラリパネル-使用数.png](https://qiita-image-store.s3.amazonaws.com/0/1423/51d78a96-b1ad-e47b-367a-c66bf78f92e4.png "Flashライブラリパネル-使用数.png")

- 使用数0のアイテムばかりでゴミ屋敷になっている

ライブラリパネルの右上にある小さな設定ボタンを押しましょう。ボタンを押すとメニューが表示されます。その中にある[未選択のアイテムの選択]を選択すると、「リンケージされていない」「メインタイムラインレイヤーから辿れない」アイテムが選択されます。その状態でデリートキーを押すと一括削除できます。

![Flashライブラリパネル-未使用アイテム.png](https://qiita-image-store.s3.amazonaws.com/0/1423/9a8cd4ed-dbec-fd29-28b0-73c67833c7c1.png "Flashライブラリパネル-未使用アイテム.png")



## タイムラインレイヤーが汚い
作業に夢中になっていると「レイヤー1」「レイヤー2」...etc なんてレイヤーが増えていて何が何だかわからなくなることはありませんか？ 以下のJSFLは**空のレイヤーを片付けや色付け**などをしてくれる便利なJSFLです。「レイヤーに配分」(シンボルを選択後右クリック or [Command]+[Shift]+[D])と合わせて使うと便利です。

- [[Flash Pro] タイムラインのレイヤーをいい感じにする君.jsfl - Qiita / clockmaker](http://qiita.com/clockmaker/items/a0fb72f833bd64263634)


## リンケージアイテムがどこに行ったのかわからなくなる
特に大量のFlashファイルを扱っている場合、ライブラリパネルからリンケージされているアイテムを探すのは困難ですから、わからなくなる前に最低限リンケージは**シンボルと同名にする**。複数人・複数個のFlashファイルを扱う場合は**Flashファイル名と同名のパッケージ名をつけ、パッケージ名と同階層のディレクトリに分ける**のがおすすめです（後者はリンケージ被りも防げますね）。


- [リンケージ用プロジェクトディレクトリを作成する.jsfl - GitHub / ics-nohara](https://github.com/ics-nohara/JFSL/blob/master/%E3%83%AA%E3%83%B3%E3%82%B1%E3%83%BC%E3%82%B8%E7%94%A8%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B.jsfl)


ネストされているフォルダを作るのがFlashでは面倒くさいのですが、上記のJSFLを叩くと「project/assets/Flashファイルの名前」フォルダ（ダイアログが出てきて名前は適当に変えられます）を作成できます。ここにリンケージ用のシンボルファイルを集めておくと、どこにファイルがあるのか一目瞭然ですし、命名規則なんかもチーム内でコンセンサスが取れます。

- 階層・シンボル名と同名のリンケージを作成する.jsfl （[Flash ProでJSFLを使って指定フォルダ以下のファイルをライブラリにimport - itouhiroはてなブログ](http://itouhiro.hatenablog.com/entry/20130113/flash) を参考にさせていただきました。 ）

```
var items = fl.getDocumentDOM().library.getSelectedItems();
for(var i=0; i<items.length; i++){
  if(items[i].itemType == 'folder') continue;

  //名前から拡張子を除く
  var symbolName = items[i].name;
  if(items[i].name.match(/\./)){
    symbolName = items[i].name.slice(0,items[i].name.lastIndexOf('.'));
  }
  //リンケージ「ActionScript用に書きだし」「最初のフレームに書き出し」
  items[i].linkageExportForRS = false;
  items[i].linkageExportForAS = true;
  items[i].linkageExportInFirstFrame = true;
  //fl.trace(items[i].name);
  symbolName = symbolName.replace(/\s/g,"_"); // スペースをアンダーバーに置換
  symbolName = symbolName.replace(/\//g,"."); // ディレクトリをパッケージ名として置換
  
  items[i].linkageClassName = symbolName;
}

```
上記JSFLを使用すると、選択したシンボルのリンケージをライブリのディレクトリと同名のパッケージ名、シンボル名と同じクラス名に設定できます。


## おわりに
大掃除してすっきりして新年を迎えましょう！
RPGツクールMVのプロジェクトをnw.jsで実行する

はじめまして。ネットの片隅でひっそり暮らすへっぽこPGのRaTTiEと申します。

さて、もうすぐ発売(2015/12/06現在)されるRPGツクールMVですが、今作からゲームエンジンは従来のRGSS(Ruby)ではなく、JavaScriptで実装されることになりました。
これで作ったゲームをローカルで動かす場合のバックエンドは、昨今話題のJavaScript環境・Node.jsのパッケージのひとつである、nw.jsで動いてます。

- Node.js  
  https://nodejs.org
- nw.js  
  http://nwjs.io/

ツクールのインストールフォルダを参照すると、確かに、nwjs-winとかnwjs-macとかいうフォルダがあったり。
っていうことは、nw.jsさえあれば、ツクール本体からではなくコマンドラインからとかでもテストプレイできるのでは…？
という訳で、Node.jsの勉強がてら試してみることにしました。まあ、実際にはほとんどすることなかったりするけど…。
あ、事前にNode.jsはインストールしといてください。

#Node.jsのプロジェクト作成
とりあえず、Node.jsのプロジェクトを作成します。
ここでは「rpgmv-test」という名前のプロジェクトとします。
以下のようなフォルダ構成を想定します。

```
rpgmv-test
  +--www
  |  +--js
  |     +--libs
  |     |    :
  |     +--plugins
  |     +--main.js
  |  +--Game.rpgproject
  |  +--index.html
  |       : (ここにツクールのプロジェクトファイルを配置)
  +--package.json
```

(2015/12/10修正・追記)
当初、プロジェクトファイルを配置するフォルダはbinとしていましたが、実際にツクールからデプロイした場合、フォルダはwwwになります。
binでも問題ないと思っていたのですが、どうやらwwwにした場合はセーブデータをwww直下ではなく実行パス直下(package.jsonのある場所)へsaveフォルダを作成するようです。
ゲームエンジンにもそういう意図の処理が書かれており、これが想定された正しいパスと判断しましたので、フォルダ構成を訂正します。

フォルダを作成したら、フォルダへ移動してnpm initしましょう。

```bash
npm init
  :
entry point: (index.js) www/index.html?test
  :
```

概ね適当でいいですが、エントリポイントの指定だけ、「www/index.html?test」とします。ここで指定したファイルが、nw.jsで実行されるファイルとなります。index.htmlの末尾に「?test」を付けることで、テストモードで起動できるようです。
npmの初期化が終わったらbinフォルダを作成し、ツクールのプロジェクトを放り込んでおきます。エントリポイントの設定を適宜入れ替えれば、フォルダ外のプロジェクトを起動することもできます(ただし、相対パスじゃないと怒られる模様)。

#nw.jsのインストール
nw.jsが入ってない場合はnpmからインストールします。

```bash
npm install -g nw
```

上記の例だとグローバルにインストールしてますが、ローカルに入れたい場合は適宜オプションを読み替えてください。

#package.jsonの編集
package-jsonに以下の項目を追加します(js-flags以降)。

```json:package.json
{
  "name": "rpgmv-test",
  "version": "1.0.0",

     :

  "main": "www/index.html?test",
  "js-flags": "--expose-gc",
  "window": {
      "title": "",
      "width": 816,
      "height": 624,
      "icon": "www/icon/icon.png",
      "toolbar":false
  }
}
```

#nw.js起動
package.jsonの編集が終わったら、package.jsonのある階層でnw.jsを実行します。

```bash
nw
```

うまくいけば、ツクールでテストプレイを起動したとき同様、ゲーム画面が開きます。

#え、こんだけ？
まあ、これだけだと正直あまり意味はなかったりします。ただテストプレイするだけならツクールから起動してもあまり変わらないですし。
ただ、もうゲームエンジンをがっつりカスタマイズするとか、そういう用途だとこれができた方が都合がよかったりするケースもあるんではないかなぁと思います。

あと、linuxでもその気になればテストプレイできたり。ライセンス買わない状態でそこら辺ごにょごにょするのは普通にKADOKAWAから怒られそうなんで推奨しませんが。やるなら自己責任で。
メソッド→ActionかFunc→ラムダ式

しょっちゅうパニクるのでまとめ。
UnityのC＃で動作するもの

もうちょっと色々できそうな気がする、
ジェネリックとかLINQとか追加したいなあ

# メソッド→ActionかFunc→ラムダ式に変換

```
void OnEnable()
{
	// NonArgumentNonReturn
	NonArgumentNonReturn();

	Action NonArgumentNonReturnAction = NonArgumentNonReturn;

	Action NonArgumentNonReturnRambda = () => Debug.Log("NonArgumentNonReturnRambda");

	// OneArgumentNonReturn
	int x = 1;
	OneArgumentNonReturn(x);

	Action<int> OneArgumentNonReturnAction = OneArgumentNonReturn;
	
	Action<int> OneArgumentNonReturnRambda = (_) => {
		int y = 2;
		Debug.Log("OneArgumentNonReturn=" + (_ + y).ToString());
	};

	// NonArgumentOneReturn
	bool returnValue = false;
	returnValue = NonArgumentOneReturn();

	Func<bool> NonArgumentOneReturnAction = NonArgumentOneReturn;

	Func<bool> NonArgumentOneReturnRambda = () => {return true;};

	// OneArgumentOneReturn
	returnValue = false;
	returnValue = OneArgumentOneReturn(1);

	Func<int,bool> OneArgumentOneReturnAction = OneArgumentOneReturn;
	
	Func<int,bool> OneArgumentOneReturnRambda = (_) => 
	{
		return _ > 0;
	};
}
```

##　■引数無し戻り値なし
```
/// <summary>
/// Nons the argument non return.
/// </summary>
void NonArgumentNonReturn()
{
	Debug.Log("NonArgumentNonReturn");
}
```

##　■引数１つ戻り値なし
```
/// <summary>
/// Raises the argument non return event.
/// </summary>
/// <param name="x">The x coordinate.</param>
void OneArgumentNonReturn(int x)
{
	int y = 2;
	Debug.Log("OneArgumentNonReturn=" + (x + y).ToString());
}
```

##　■引数なし戻り値１つ
```
/// <summary>
/// Nons the argument one return.
/// </summary>
/// <returns><c>true</c>, if argument one return was noned, <c>false</c> otherwise.</returns>
bool NonArgumentOneReturn()
{
	Debug.Log("NonArgumentOneReturn");
	return true;
}
```

##　■引数１つ戻り値１つ
```
/// <summary>
/// Raises the argument one return event.
/// </summary>
/// <param name="numericalValue">Numerical value.</param>
bool OneArgumentOneReturn(int numericalValue)
{
	Debug.Log("OneArgumentOneReturn");
	return numericalValue > 0;
}
```
AzCopyでAzure Storageへデータをコピー


BLOBへファイルをアップロードするツールとしては、いくつかのクライアントが知られていますが、MSがよく紹介しているのがAzCopy。
マルチスレッドに対応していて高速ということでその使い方。

基本は[MSさんのサイト](https://azure.microsoft.com/ja-jp/documentation/articles/storage-use-azcopy/)を参考に。

###ダウンロード

[ここ](http://aka.ms/downloadazcopy)でダウンロード。

###ディレクトリ以下をアップロード

AzCopy /Source:ローカルのフォルダ・ファイル /Dest:ブロブ /DestKey:ブロブのキー

```bash
AzCopy /Source:C:\Users\hoge\Desktop\data /Dest:https://hoge.blob.core.windows.net/data /DestKey:key
```

###ディレクトリ以下のファイルをしてしてアップロード

AzCopy /Source:ローカルのフォルダ・ファイル /Dest:ブロブ /DestKey:ブロブのキー /Pattern:ファイル名

```bash
AzCopy /Source:C:\Users\hoge\Desktop\data /Dest:https://hoge.blob.core.windows.net/data /DestKey:key /Pattern:test.txt
```

###エラーへの対応

AzCopyはコア数に応じて並列処理を行うそうです。が、プアな通信環境で過度な並列処理が行われると帯域を専有してしまい、結果として処理が失敗するようです。。。私の環境ではtimeoutが頻発しました。

並列数は、/NC:n オプションで指定することができるので、エラーが発生する場合は、NC値を小さくしてみると良いでしょう。

私のPCは4コアだったので、それ以下の2にしてみるととりあえずエラー無く動きました。

```bash
/NC:2
```
これをおしり等に付け加えます。
ownCloud を Google Cloud Storage に接続した話

この記事は、ownCloud Advent Calendar  2015 12月1日の内容です。
http://qiita.com/advent-calendar/2015/owncloud

ご用意いただくもの
・どこかで動いているownCloud インスタンス
・Google Cloud Storage


接続方法は、2種類あります。
1. Simple Migration
2. Full Migration

1 でやってみましょう。

##Google Developer Consoleにログイン

## バケット管理画面へ移動
![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/15176/ba2e28d2-1d06-1cc4-9bf6-4fac4f1d4ff9.png)

## 「ストレージ」 をクリック
![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/15176/f27891ee-85d0-40c0-3824-aec05f6425d6.png)

## 「バケットを作成」をクリック
![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/15176/848725a1-32e6-d18d-c52c-0a8007b64628.png)

## バケットの設定を入れます。
![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/15176/d2387512-3b56-1193-1afb-4687022c49fb.png)
「作成」をクリックします。

## バケット一覧まで戻ります。
![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/15176/600e0c20-12ac-fb87-0698-f7a3e8594c61.png)

## 設定画面
![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/15176/97574a8f-6cf8-20a3-51e5-6f7ec9a17716.png)

## 相互接続をクリック
![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/15176/eec6f09b-60d7-735e-7e69-91b4cc1cf71d.png)

## 新しい鍵を作成
![skitch.png](https://qiita-image-store.s3.amazonaws.com/0/15176/efe1cd5c-9031-536f-b675-9d52f74e1e73.png)
S3と同じように接続のアクセスキーとシークレットキーを作成します。

## ownCloud に設定
アクセスキーとシークレットキーが手に入れば、あとは通常のownCloudの外部ストレージ接続と設定方法は同じです。

ホストは、
storage.googleapis.com
にしてください。

SSL有り無しどちらでも動きます。
Unity uGUIs -ウグイス- コンポーネント装飾編その２

# Unity uGUIs -ウグイス- 1人でがんばりますカレンダー Advent Calendar 2015

この記事は[Unity uGUIs -ウグイス- 1人でがんばりますカレンダー Advent Calendar 2015](http://qiita.com/advent-calendar/2015/unity-uguis)の5日目の記事です。

6日目に投稿になってしまった・・・・。すいません。。。
がんばります・・・がんばります・・・（白目

# 2つの地味で大事な機能

基本的なお話を前回しているので、今回は地味ですが便利な機能について説明しますね。

* 条件付け
* 入れ子対応

いや、当たり前だろ？て感じの機能ですが、前回の状態であれば全てのTextや全てのButtonに対して装飾されてしまって細かい部分が対応できませんでした。

しかしConditionクラスによる条件付けとHierarchyの入れ子に対応しているので細かい調整も可能になります！

Conditionは現状オブジェクト名にたいする正規表現のマッチングを提供しています。
他にも何か必要な物があれば対応していきたいとは思いますが、今のところですと思いついていません。

## 条件付け

まずは条件付け（Condition）の使い方から。
使い方はコンポーネント装飾用のコンポーネントと同じオブジェクトに使いたいConditionコンポーネントを設定します。
今回の場合は正規表現用のConditionコンポーネントを付与し正規表現を設定します。
すると、正規表現にマッチした対象のみが装飾の対象となります！！

## 入れ子

条件付けがあってはじめて機能するのが入れ子です。
コンポーネント装飾のコンポーネントがアタッチされているオブジェクトを入れ子にすることでCSSと同じような入れ子のような感じで適用ができます。

例えば全てのテキストのサイズを設定したのち、一部だけフォントを変えたい場合などや、そこからさらに対象を絞るなどする際に利用できますね。


# 終わりに

簡潔な内容でしたがこれで5日目の記事としておきたいと思います・・・・。
もう何を書けば良いのやらわからないですが6日目の記事も書かなければ！
1分でわかる、デバッグ効率を上げるための関数型プログラミング入門

##ハイライト
1.関数型プログラミングを覚えるとどうなるのか
2.関数型プログラミングをどう実践するのか
3.関数型プログラミングとオブジェクト指向の共通点と違いは？

##関数型プログラミングを覚えるとどうなるのか
次のような悩みが減り、デバッグの効率が上がります。

「このフラグ、trueになるはずがfalseになってる！」
「どこにバグの原因があるかわからねえ」
「修正したらまたどこかで問題が出るかも」

##関数型プログラミングをどう実践するのか
次の2つの関数をきっちり分けて設計し、かつ、ピュアな領域を増やしてダーティな領域を小さくします。
###1.ピュアな関数
同じ引数に対して常に同じ結果を返し、かつ関数の外のスコープに影響がない関数のこと
###2.ダーティな関数
同じ引数でも違う結果を返す、または関数の外のスコープに影響がある関数のこと


##もっと具体的に教えて
下記は一例です。パッケージ分けるとファイルをわけるとか、命名で分けるとか、とにかくピュアなものとダーティなものが簡単かつ明確に区別できて、ピュアな領域を相対的に太らせることさえできれば何でもいいです。

```python

class Pure:
	"""
	ピュアな関数をまとめたクラス
	こっちを太らせます
	"""
	def plus(self,a,b):
		return a + b
	def minus(self,a,b):
		return a - b


class Dirty:
	"""
	ダーティな関数まとめたクラス
	=状態の変更を行う関数を持つクラス
	こっちを減らします
	"""
	def __init__(self):
		self.my_number = 0
	def plus(self,a):
		self.my_number = self.my_number + a
		return self.my_number
	def minus(self,b):
		self.my_number = self.my_number - 1
		return self.my_number


```

##どうしてピュアな領域を太らせるとデバッグ時間を減らせるの
理由は4点あります。
	1.ピュアな関数は意図しない変数の変更をおこしません
	2.ピュアな関数を修正する際に他への影響を考慮する必要がありません(その関数を正しくかけばいいだけ)
	2.ピュアな関数であれば一つの関数が肥大化してもピュアであることを保てば分割及びその再利用が容易にできます
	3.バグを生みやすいのはダーティな領域なので、これを小さく保てばあたりがバグのあたりがつきやすくなります


##関数型"言語"ってなに
関数型プログラミングを行うのが容易な言語です。
関数を取り扱う言語が豊富だったり、ピュアな関数で書くことに向いています。
関数型プログラミング自体はVBだろうがなんだろうができます。

##関数型プログラミングとオブジェクト指向の共通点及び違いは？
共通点のうち最も具体的な点は目的で、ある領域が他の領域に及ぼす影響を最小化することです。
オブジェクト指向は、カプセル化、ポリモフィズム、継承によってこれを実現しようとしています。
関数型プログラミングは、上記のようなピュアな関数を太らせて状態変更による問題を最小化しようとしています。
>以下は極めて個人的な見解でバイアスがかかっている可能性があります
両者は背反な概念ではなく、共存可能な概念ですが、オブジェクト指向は、慣習的に、多くのオブジェクトの状態を変更することを前提としたつくりになりがちなので、上記の目的である「ある領域が他の領域に及ぼす影響を最小化すること」が達成しにくいです。
また、関数型プログラミングに比べてオブジェクト指向は学習コストや設計コストの割に成果を生みにくいと感じます。なので、時間とのトレードオフを意識して、ある程度のクラス分けはしつつも、私はほとんどPureかDirtyかにしか気を払いません。


##まとめ
関数型プログラミングの肝は、ピュアな領域を太らせること。
関数型プログラミングは、学習コストが爆安な割に効果が高く汎用的なおいしい技術です。
Unity Solution Conference 2015に行ってきたよ

# はじめに
[Unity Solution Conference 2015](http://japan.unity3d.com/events/usc2015/
 )に参加した感想を書きます。
全体のまとめというより、一部心に響いたことなどに焦点あてます。

# 聞いた講演
1.基調講演：Unity最新情報と産業向け機能の紹介
2.基調講演：OculusによるVRの今とこれから
3.基調講演：ハコスコによるVRビジネスの可能性
4.アニメ・アイドル・Unity
5.宇宙・LED / 稲・プロジェクター
6.Unityで開発するIoT機器連携アプリ
7.人、医療、音楽。「感情に直撃する」プロダクトでほんの少し世界を動かす
8.研究分野におけるUnity活用～メディアアート作品「シェアログ」を例に～

# Unity Graphicsの強化！
スクリ−ンスペース・レイトレース・リフレクション(SSRR)搭載したよって話(Unity 5.3にはないらしい)
超綺麗ｽｹﾞ━━━━━━ヽ(ﾟДﾟ)ﾉ━━━━━━!!!!
[デモ動画](http://blogs.unity3d.com/jp/2015/11/10/bedroom-demo-archviz-with-ssrr/)

# Unityの産業進出
Unityってゲームエンジンですよね。だからゲーム機能中心に改善してきていますが、最近はちょっと違う分野もやってますというお話。

映画とか映像業界のハイエンドの人たちも利用してきているみたいで
fbxではなくてもっと大規模なフォーマットを使えるようにする必要が出てきたみたいです。
その結果、Alembic Importer作ったそうです。githubで公開されていて無料で利用できるそうです。
また、CAD Importerも作って、CADをIGES形式でエクスポートしてUnityにインポートするだけで良くなったそうです。今までは、fbxに変換とかしてたらしい。

# Oculus社のRift
Oculus Riftってずっと聞いてたし言ってたけど、Oculus社のRiftという製品ですって言ってました。
来年の1~3月に製品版を出荷予定です。
Rift以外にもTouch(片手に一つずつ持って操作するコントローラー)を来年の中頃から夏に出す予定。

# すべては快適な体験のために
Oculusでは、"すべては快適な体験のために"日夜頑張って開発してくださっているそうです。
映画館のような視聴型コンテンツOculus Videoや、3D空間内で直感的に作業できるmedium、バーチャル空間内でみんな一緒に遊べるToyBoxなど
とても魅力的なコンテンツを早く体験したいですね。

# 安価でみんなが楽しめるVR体験
数千万とかする軍事研究用でもなく、数万してしまう民生用でもないピラミッドの最下層をハコスコは狙う。
確かになぜだかかなりの人がスマートフォンを持っていますからね。ハコスコを数千円で手に入れば、簡単にVRが体験できるのは嬉しい。

# コアなファンとアーティストをつなぎ高い価値を提供
タイトルの通り、アーティスト用のハコスコとアプリを提供したら反響良かったらしい。

# 絶対領域拡張計画
Unity関係ないですが、名前が良かったので。
[光るスカート](http://hikaruskirt.tumblr.com/)

# DOMINATOR MAXI
アニメ「PSYCO-PASS サイコパス」に出てくるドミネーターを再現。
ドミネーター自身をアクセスポインタとして、提供するスマートフォンアプリからドミネーターにアクセス。
ドミネータの先にカメラが付いていて、その映像がスマートフォンに映し出され
人の顔の横に犯罪係数が表示されます。
アプリのUIをいわゆるスマホアプリっぽくしたくなくUnityにしたそうです。
2015年度中に発売予定らしいです。
http://dominator.cerevo.com/ja/

# 全体の感想
いわゆるUnityっぽい使い方をしないソリューソンの話で面白かったです。
カヤックやチームラボさん、その他の方々など、Unity単体ではなくその他の技術と組み合わせることで、多彩な表現を実現していました。
個人的には、まずはスマホやPCではなくチームラボさんのLEDのように、別のものにディスプレイするなどを遊んでみたいです。




"ハイエンドPCというのは切ない"
[シェルコマンド]Catのメモリ使用量

この記事
====
catコマンドのファイル読込がバッファ読込かどうか調査した。

結論
====
catはファイルシステムのブロックサイズに基づいて、Buffer読み込みをしてくれる。

調査
====
1. catのソースを読む
1. 実際の処理のメモリ使用量を確認

## catのソースを読む
``` catソース(抜粋)
// ブロックサイズの取得
if (fstat (input_desc, &stat_buf) < 0){
    error (0, errno, "%s", infile);
    ok = false;
    goto contin;
}
insize = ST_BLKSIZE (stat_buf);

~(略)~

if (fstat (STDOUT_FILENO, &stat_buf) < 0)
    error (EXIT_FAILURE, errno, _("standard output"));
outsize = ST_BLKSIZE (stat_buf);

~(略)~

// insizeをバッファサイズに指定
insize = max (insize, outsize);
inbuf = xmalloc (insize + page_size - 1);
ok &= simple_cat (ptr_align (inbuf, page_size), insize);

~(略)~

// バッファ読込
n_read = safe_read (input_desc, buf, bufsize);
```

上記のように、ファイルシステムのBLOCK_SIZEを取得して、Bufferの大きさを設定している。

### ブロックサイズの確認コード
``` blksizeChk.c
#include <stdio.h>
#include <sys/stat.h>

int main(int argc, char **argv) {
  struct stat stat_buf;
  stat( *(argv + 1), &stat_buf);
  printf("ファイルシステムのブロックサイズ : %d\n", stat_buf.st_blksize);
  return 0;
}
```

上記のコードを下記のように実行する。

``` テスト実行
$ gcc blksizeChk.c
$ ./a.out hoge.dat
ファイルシステムのブロックサイズ : 4096
```

## 実際の処理のメモリ使用量を確認
適当に大きなサイズのファイルを作成して、catで開いた。

topで確認すると、
コンソールに標準出力する場合：500kb
パイプで他コマンドにつなげた場合：384kb
メモリ使用量だった。

参照
====
[C言語入門講座](http://www.c-lang.net/stat/index.html)
[ボクノス GNU catを読む - 全体的な流れ](http://d.hatena.ne.jp/tanakaBox/20070808/1186538057)
[catコマンドのソース](http://cvs.savannah.gnu.org/viewvc/coreutils/coreutils/src/cat.c?revision=1.113&view=markup)
Angular Meteor 1.2.0がリリースされてたのでその更新点について

## 今回の内容
本当はMeteorでモバイルアプリをうまくつくるときにどうしようか的な記事を書くつもりでしたが、少し煮詰まってしまったので割りと最近アップデートが入ってたAngularMeteorの話でお茶を濁させてください。

## Angular Meteorとは
MeteorでAngularJSを使用するためのパッケージです。基本的なAngularのAPIにあたる項目を含んでいるので、Angularでやりたいことはだいたい実現できます。
ただ、いくつか不足しているものもありますがそれらは別のパッケージで補うことができます。
(例: `ui-router`と同様の機能を実現する[`meteor-angular-ui-router`](https://github.com/Urigo/meteor-angular-ui-router/)など)

Meteor公式が紹介している、Meteor + ionicでモバイルアプリを作成するサンプルでも使用されています。

## 変更点
詳細は[Meteor公式ブログ](http://info.meteor.com/blog/angular-meteor-1.2.0)を参照。

 - 1.2.0でのアップデートの主な内容は、`ng.js`や`ng.html`の代わりに通常のHTMLやJSをAngularに使用するようになったこと
 - `ng.html`を`html`に変更する際はクライアントの負荷を減らすために、`blaze-html-temlplate`を削除することが推奨されるようになった
 - `ng.js`を`js`に変更する際に`ecmascript`パッケージを削除するすることが推奨されるように

## 変更の内容について
`ecmascript`などを削除したことで、プレーンなAngularを書ける状態までかなり近づいたのではないでしょうか。
これによってAngularJSを使用したモバイルアプリをMeteor上で動作させるのも、やりやすくなるのではと期待しています。

上記にも書いたとおり、AngularMeteor 1.2.0では通常のhtmlを使用するために`blaze-html-templates`を削除することが推奨されるようになりましたが、BLAZEテンプレートを使用したいという人向けに、AngularMeteor向けのBLAZEテンプレートのパッケージが追加されているようです。
BLAZEテンプレートによるUIが気に入っている人はこちらを使用することで、従来どりのUIを実現できます。

おおまかな内容については以上です。

あとは1.3に向けてのモチベーションとして、

 - MeteorのAPIにData APIを追加する
   - Angular Meteor 1.3.0より$meteor.collectionなどのコレクションを扱うAPIがdeprecatedとなり、1.4.0では削除されることが決定されました。
 - 機能向上のために`autobind`を削除する

といった項目が書かれてありました。
Meteorでコレクションを扱うとき、面倒だなあと思うことが多かったのでAngular Meteorの`$meteor`を多用していたのですが、
```「MeteorのコレクションなんだからMeteorのAPIからさわろうや。な？」```
って気持ちでData APIの追加が決まったのかなと思います。

Angular Meteor 1.3.0から順次移行する形かと思いますが、手元で動作が確認できるまでは`ver. 1.2.x`でバージョンを合わせておくのが身のためでしょう。
僕はちょっと人身御供してくる予定です。

# 圧倒的謝罪
日付一日間違えてまるまる一日遅刻しました・・・。ごめんなさい。
R Markdownで標準で組み込まれてるテーマ切替

## この記事の目的
私が大好きなRMarkdownについて、Tipsを集中的に連載しようという思いつきの企画です。あと自分の中で進めている別企画のメモという位置づけでもあります。なので**大した中身はありません**。

### R Markdownとは
Markdown記法をベースに、チャンクという形でRのコードを記述して評価・出力することができるものです。RStudioのクイックリファレンスでは以下のように説明してあります:

> R Markdown is an easy-to-write plain text format for creating dynamic documents and reports. 

## R Markdownで標準に組み込まれているテーマ
実はあまり知られてない気がしますが、R Markdownには標準でテーマ切替機能があります。[R Markdown Reference(pdf)](http://www.rstudio.com/wp-content/uploads/2015/03/rmarkdown-reference.pdf)には、以下の記載があります:

> Bootswatch or Beamer theme to use for page. Valid bootswatch themes include
"cerulean", "journal", "flatly", "readable", "spacelab", "united", and "cosmo".

つまり、[Bootswach](https://bootswatch.com/)のテーマのうち、上述のテーマを利用可能だというわけですね。導入するにはRmdファイルの冒頭にあるyamlに以下のように記述すればOKです:

```
---
title: "Untitled"
output:
  html_document:
    theme: flatly
---
```

どんな感じになるかは、ぜひ自分で試してみてください。

Enjoy!
lifactoring のススメ

Prolog なんてなかった。

# Lifactoring のススメ

　普段の私の仕事では、全くゼロからソースコードを書くということがほとんどありません。大抵はバグの修正であったり、既存のコードベースにちょっとした新機能を追加したりという作業が主となります。その際には、自分以外の様々なプログラマが書き、保守してきたコードを読むこととなります。

　長年運用されてきたソースコードは、まぁ、大抵の場合はひどいものです。廃れてしまった当時のベストプラクティス、まさかこんなに長期間残ると思わなかった暫定ソリューション、仕様変更に次ぐ変更で複雑にネストしてしまった制御構造など、コードの臭いがいたる所に立ち込めています。

　優秀で勇敢な若手エンジニアたちはリファクタリングという名の「全面的な作り直し」に走りがちですが、長年運用されたコードを作り直すのはとても勇気と根気がいる作業です。ユニットテストに包んで改良していければ良いですが、大抵の場合この手のコードはテストがほとんどないか、全くないか、全くない上に複雑すぎてもはやテストの書けない代物とかしています。

　きちんとしたリファクタリングの難易度が高い時に提案したいことこそ、「マージ担当者が一目で安全と分かるほど Light な Refactoring」=「Lifactoring」です。

　制御構造の全面的な変更は、テストなしではとても怖くてマージできません。しかし、例えば下記のようなコミット一つづつならマージする時の不安感が幾分か減らせるはずです。

 * ただインデントが揃えられただけのコミット
 * ただコメントが付与されただけのコミット
 * 複雑な条件式がひとつだけ、ただメソッドに切り出されただけのコミット（そして条件式部分がユニットテストに組み込まれる）
 * ひとつのネストした `if` ブロックが、ひとつ上の `else if` に移動することでネストがひとつだけ解消されたコミット

　この手の非常に小さな改良は、ひとつづつならほとんど意味のない改良ですが、例えば毎日ひとつづつでもリリースすれば１年後にはとても綺麗なコードに生まれ変わります。幾分かマシになれば、いわゆる「全面的なリファクタリング」にもチャレンジしやすくなるのではないでしょうか？

　リファクタリングやボーイスカウトルールはとても良いものですが、「秘伝のタレ」のようなソースコードの場合は一筋縄では行きません。それでも、ほんのすこしずつ lifactoring を繰り返していけば、タレの秘伝をとかほぐしていけるのではないでしょうか。ぜひすこしずつの改良を試してみてください。
【Swift】classとstaticの挙動の違いを整理する

Swiftの型メソッドや型プロパティー(クラスメソッドやクラス変数のようなもの)を作る際はclassかstaticを使います。
この2つの挙動の違いをまとめてみました。

```swift
class MyClass {
    static var value = ""
    static func method() {}
}

_ = MyClass.value
MyClass.method()
```

## struct/enum
メソッド/プロパティーの両方に言えますが、structとenumではclassを使う事ができません。
structとenumではstaticを使う必要があります。

```swift
struct MyStruct {
    static var staticProperty: String { return "" }
    class var classProperty: String { return "" } // エラー
    
    static func staticMethod() {}
    class func classMethod() {} // エラー
}
```

```swift
enum MyEnum {
    static var staticProperty: String { return "" }
    class var classProperty: String { return "" } // エラー
    
    static func staticMethod() {}
    class func classMethod() {} // エラー
}
```

## 型メソッド
通常の宣言と実行では差異なく使えます。

```swift
class MyClass {
    static func staticMethod() {}
    class func classMethod() {}
}

MyClass.staticMethod()
MyClass.classMethod()
```

staticはオーバーライドできないという制限があります。

```swift
class MyClass {
    static func staticMethod() {}
    class func classMethod() {}
}
class SubClass: MyClass {
    override static func staticMethod() {} // エラーになる
    override class func classMethod() {}
}
```

## クラス変数
classは`class let classProperty = ""`のような`Stored Property`で使う事ができません。

```swift
class MyClass {
    static let staticProperty = ""
    class let classProperty = "" // エラーになる
}
```

`Computed Property`はどちらでも使えます。

```swift
class MyClass {
    static var staticProperty: String { return "" }
    class var classProperty: String { return "" }
}
```

staticはメソッド同様にオーバーライドできません。

```swift
class MyClass {
    static var staticProperty = ""
    class var classProperty = ""
}
class SubClass: MyClass {
    override static var staticProperty = "" // エラー
    override class var classProperty = ""
}
```

## 相互の呼び出し
classとstaticは相互に呼び出す事ができます。

### class → static へのアクセス

```swift
class MyClass {
    static var staticProperty: String { return "" }
    static func staticMethod() {}
    
    class func classMethod() {
        print(staticProperty)
        staticMethod()
    }
}
```

### static → class へのアクセス

```swift
class MyClass {
    class var classProperty: String { return "" }
    class func classMethod() {}
    
    static func staticMethod() {
        print(classProperty)
        classMethod()
    }
}
```

## まとめ
表にしてみました。

||static|class|
|:--|:--|:--|
|オーバーライド|できない|できる|
|struct/enum|使える|使えない|
|Stored Property|使える|使えない|

機能的なところはまとめたのですが、内部的な動きやどう使い分けたら良いかはまだ分かってないので後々勉強していこうと思います。
Twilio API 勉強会 Vol.28 - サーバーレスアーキテクチャで Twilioを安全に運用しよう！ ハンズオンメモ


https://twiliojp-ug.doorkeeper.jp/events/35301


## AWS Lambda Functionの作成
AWS にログインし、AWS Lambdaを選択

Welcome画面から新規作成

blueprint で HelloWorld

- Name: TwilioFallback
- Description: Twilioエラー時に実行
- Role: lambda_basicを作成


## AWS Lambda Functionの設定
console.log('Received event:', JSON.stringify(event, null, 2));
console.log('Received event:', JSON.stringify(context, null, 2));
にコードを変更して Save & Test

ページ下の実行結果を確認

Add event sourceをさっと見

Add API Endpoint 選択し、作成

## Amazon 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/xml
- Input Path ThroughからMapping Templateへ

```
<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Say language="ja-jp">今は回線混んでるよ〜</Say>
</Response>
```

#### Method Response
200を展開

Add Response Model

- contenttype:  application/xml
- Models: Empty

#### 最終確認
![スクリーンショット 2015-12-05 13.27.00.png](https://qiita-image-store.s3.amazonaws.com/0/11103/535ba33c-0aa9-614b-4c76-1002dbdec7f3.png "スクリーンショット 2015-12-05 13.27.00.png")


## Deploy API

Deploy API で prod でデプロイ

Stagesにて左ナビでTwilioFallbackのGETへ行って、そのURLをクリック

AWS LambdaにあるMonitoringよりCloudWatchへ行って確認。

Twilio のfallbackURLに適当なurlをセット

その電話番号へ電話をかける

再度CloudWatchで確認

event.param.~ で Twilioの情報を取ってこれたことを確認。
あとはSlackに投げるなり、Twilioで管理者に電話したり、お好きなようにNode.jsで書く。

## Slack 通知サンプル

```
var https = require('https');
var fs = require('fs');

exports.handler = function(event, context) {
  param = {
    text: "電話エラー発生！！\nAccountSid: " + event.param.AccountSid + ",\n ErrorUrl: <" + encodeURIComponent(event.param.ErrorUrl) + "|Link>,\nFrom: " + event.param.From + ",\nTo: " + event.param.To,
    icon_emoji: ":ghost:"
  };
 var post_data = "payload=" + JSON.stringify(param);

 var path = "your slack incoming-webhook path";

 var post_options = {
      host: 'hooks.slack.com',
      port: '443',
      path: path,
      method: 'POST',
      headers: {
          'Content-Type': 'application/x-www-form-urlencoded',
          'Content-Length': Buffer.byteLength(post_data)
      }
  };

  // Set up the request
  var post_req = https.request(post_options, function(res) {
      res.setEncoding('utf8');
      res.on('data', function (chunk) {
          context.done();
      });
  });

  // post the data
  post_req.write(post_data);
  post_req.end();
};
```
iOSデバイスでの位置情報の取り扱いで気を付けたい事

#良くみかける説明
「iOSで`CLLocationManager`を使う際に気を付ける事」等と言う記事をインターネットで良く見かけます。

大概は`info.plist`に`NSLocationAlwaysUsageDescription`と`NSLocationWhenInUseUsageDescription`を追加して、`CLLocationManager`を使いたいクラスに`CLLocationManagerDelegate`を追加して、目的に応じて`[locManager requestWhenInUseAuthorization];`か`[locManager requestAlwaysAuthorization];`を呼び出して`[locManager startUpdatingLocation];`を呼び出していますが、これで本当に大丈夫でしょうか？
#実はその前に調べる事が…
最も気を付けなくてはならないのは、この手前です。つまり、iOS端末の設定で位置情報サービスがそもそもオフになっていた場合です。この時は上記の手続きを行っても、そもそもサービス自体がオフになっていますので`CLAuthorizationStatus status = [CLLocationManager authorizationStatus];`は常に`kCLAuthorizationStatusDenied`となります。
##位置情報サービスがONかOFFか調べよう
調べ方はとても簡単で
```[CLLocationManager locationServicesEnabled];```
を呼び出すだけです。結果はYES/NOで返却されます。NOだった場合は、位置情報サービスが使えないと言う事になりますが、アプリの補助機能として位置情報サービスを利用しているならともかく、位置情報がメインの場合はこれを放置していては困ります。
##位置情報サービスがOFFだったら、iOS端末の設定をしよう！
つまり`[CLLocationManager locationServicesEnabled];`がNOだった場合は設定画面を開いて、位置情報サービスをONにしてもらう事が大事です。

前提条件として、`CLLocationManagerDelegate`が`@interface`のdelegateとして登録されている、とします。

```
- (void)locationManager:(CLLocationManager *)manager
didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
	if(![CLLocationManager locationServicesEnabled])
	{
		UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil
													message:@"iOSの設定>プライバシー>位置情報サービスをONにしてください。"
											 preferredStyle:UIAlertControllerStyleAlert];
		[alert addAction:[UIAlertAction actionWithTitle:@"OK"
												  style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
                                                      [self openSettingLocation];
												  }]];
		
		[self presentViewController:alert animated:YES completion:nil];
	}
	else
	{
		// もし、ステータスが未定だった場合は再設定を促す
		if(status == kCLAuthorizationStatusNotDetermined)
		{
            [locManager requestWhenInUseAuthorization];
		}
		else
		{
			// 位置情報取得開始
			// startUpdatingLocationを呼んだ時の日時をメンバ変数に保存
			startUpdatingLocationAt = [NSDate date];
			[locManager startUpdatingLocation];
		}
	}
}
```

このdelegateメソッドである`didChangeAuthorizationStatus`は、`CLLocationManager`オブジェクトにdelegateを設定した時と、`CLLocationManager`の管理している認証状態が変化した時に呼び出されます。

ですから、設定を自分のアプリから開いて位置情報サービスをONに変えて「MyAppに戻る」をタップした場合は認証状態が変化したので呼び出されます。

しかし、OFFのまま戻られた場合はこのdelegateメソッドは呼び出されませんので、当該アプリで位置情報サービスを使う事ができないと言う事になります。
werckerでgh-pagesへのデプロイが失敗するときの対応

ブログをwerckerでgh-pagesにデプロイしようとしたら以下のようなエラーが発生。

```
...
/pipeline/gh-pages-e2a3eb58-25ad-4d1d-866d-57a97d37dd73/run.sh: line 56: git: command not found
/pipeline/gh-pages-e2a3eb58-25ad-4d1d-866d-57a97d37dd73/run.sh: line 60: warning: command not found
failed: failed pushing to github pages
```

Hugoのフォーラムでこの[対処法](https://discuss.gohugo.io/t/automated-hugo-deployments-anywhere-using-wercker/539/41)がコメントされており、`wercker.yml`の`deploy: steps:`の直後に以下を追加すればOKとのことだった。

```
- install-packages:
    packages: git ssh-client
```

最終的な`wercker.yml`は以下の通り。

```
box: debian
build:
  steps:
    - arjen/hugo-build:
      version: "0.14"
      theme: customTheme
      flags: --buildDrafts=true
deploy:
  steps:
    - install-packages:
      packages: git ssh-client
    - lukevivier/gh-pages@0.2.1:
      token: $GIT_TOKEN
      domain: my.domain
      basedir: public
```

これで無事デプロイ成功するようになった。
SoftLayerで使われているＣＰＵをまとめてみて(2015年12月)

 SoftLayerで使えるインテルCPUのV2やv3ってどのコードネームだったかなーと思い、ちょっとこれまでのインテルCPUのロードマップなども簡単にまとめてみました。さてＣＰＵの型番はメニューから選ぶことができます。
https://store.softlayer.com/configure
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/057a52b3-04ec-b79f-dbc6-f1a0798154bf.jpeg)
　１ソケット、２ソケット、４ソケットごとにまとめてCPUのコードネームでまとめると
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/3fd125b3-2b83-ff4c-2d31-a3e0b1829d8c.jpeg)

さて一方でインテルCPUをコードネームで古い順に並べるとこんな感じです。
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/59741/accb7e58-0457-cbab-185c-e88434d1757f.jpeg)

インテルのCPUは２０００年前半に登場したNetBurstアーキテクチャーを採用したPentium4 プロセッサーから2000年代半ばにCoreアーキテクチャーになりさらに高性能化を目指しNehalemアーキテクチャーベースのCPUが2008年に登場しました。このあたりからCPUはTick-tockモデルと呼ばれる開発ペースで新しいＣＰＵが投入されました。アーキテクチャーの改良とプロセスルールの微細化を交互に行うものです。上記ではNehalem, SandyBridge, Haswell, Skylakeが新しい命令セットなどを追加しています。一方Westmere, Ivy Bridge, Broadwellではプロセスルールが微細化しています。また右のほうにSoftLayerで使われている先ほどのCPUと同じものを色分けしてみました。
　これを見ると次に１，２ソケットCPUはSkylake, 4ソケットはBroadwellかな？
Rubyistから見たScalaの世界

僕はもともとRubyが好きで3年くらい書いており、Scalaはまだ始めて3ヶ月くらいなのですが、今回はそんなRubyistから見たScalaについて書こうかと思います。

Rubyはかなり自由な言語で、あらゆること(メタプログラミングを含む)が簡単にできるようになっているのですが、もしかして頑張ればScalaでもできるのでは!?と思いここ最近調べてみました。

なお、今回の内容は以前Kawasaki.rbで発表した以下のスライドがベースとなっています。
http://www.slideshare.net/yutomatsukubo/rubyistscala

# オープンクラス

Rubyにはオープンクラスがあり、既存のクラスを簡単に拡張することができます。

```rb
# 既存のStringクラスを拡張
class String
  def add_scala
    self + "scala"
  end
end

puts "ruby is like ".add_scala # => ruby is like scala
```

Scalaでこれを実現する場合、拡張メソッドを使います。

値クラスと汎用トレイト
http://docs.scala-lang.org/ja/overviews/core/value-classes.html

```scala
object MyApp extends App {
  implicit class MyString(val s: String) extends AnyVal {
    def addScala = s + "Scala"
  }
  
  println("Ruby is like ".addScala) // => "Ruby is like Scala"
}
```

Rubyに比べると大分おまじない要素が増えたように見えますが、なんとこれだけの記述で実現することができてしまいました。

なお、Rubyでは既存のメソッドすらオーバーライドできてしまいますが、

```rb
puts "Ruby".size # => 4

class String
  def size
    -1
  end
end

puts "Ruby".size # => -1
```

さすがにScalaではそこまでサポートはされていませんでした。(できても困るが)

```scala
object MyApp extends App {
  implicit class MyString(val s: String) extends AnyVal {
    override def size: Int = -10
  }

  println("Scala".size)
  // Note that implicit conversions are not applicable because they are ambiguous
  // both method augmentString in object Predef of type (x: String)scala.collection.immutable.StringOps
  // and method MyString in object MyApp of type (s: String)MyApp.MyString
  // are possible conversion functions from String("Scala") to ?{def size: ?}
}
```

# method_missing

Rubyには、存在しないメソッドを呼び出した時の挙動を指定できる`method_missing`メソッドがあります。

method_missing
http://ref.xaio.jp/ruby/method_missing

```rb
#!/usr/bin/env ruby

class MyClass
  def foo
    "foo"
  end

  def method_missing(name)
    "#{name} is missing!!"
  end
end

my = MyClass.new
puts my.foo # => "foo"
puts my.bar # => "bar is missing!!"
```

Scalaでこれを実現するにはDynamicトレイトが使えます。

Dynamic
http://www.scala-lang.org/api/current/index.html#scala.Dynamic

```scala
import scala.language.dynamics

class MyClass extends Dynamic {
  def foo = "foo"

  def selectDynamic(name: String): String = s"${name} is missing!"
}

object MyApp extends App {
  val my = new MyClass
  println(my.foo) // => foo
  println(my.bar) // => bar is missing!
}
```

静的言語でこれが可能というのは正直驚きでした。

# ダックタイピング

Rubyは動的型付け言語なので、型が適切かの判断はメソッドが呼べるかどうか(ダックタイピング)で決まります。
Scalaでは**Structural Subtyping**を使えばこれが実現できます。

```scala
// hogeメソッドを持つクラス
class MyClass {
  def hoge: String = "hoge!"
}

// hogeメソッドを持たないクラス
class MyClass2 {
  def piyo: String = "piyo!"
}

object MyApp extends App {
  // hogeメソッドを持つ型を定義
  type Hoge = {
    def hoge: String
  }

  // Hogeタイプを受け取るメソッド
  def addFuga(t: Hoge): String = {
    t.hoge + "fuga!"
  }

  val my = new MyClass
  println(addFuga(my)) // => "hoge!fuga!"

  val my2 = new MyClass2
  println(addFuga(my2)) // => コンパイルエラー: type mismatch;
}

```

かなり頑張る形になりましたが、MyClassは`hoge`メソッドを持つだけでコンパイルが通り、MyClass2はコンパイルが通りません。

どういった用途でこの機能を使うのかは今のところ僕にはわかっていません。

# おわりに

Scalaは静的型付けと関数型プログラミング言語のイメージがあり、硬い言語なのだろうと思っていたのですが、意外に動的で自由な一面を持つ面白い言語だということに気づけました。

Rubyistとしては、今後は是非メタプログラミングの発展も願っています!