OmniAICreator/Qiita-1.07M huggingface dataset:
Debian wheezy の Tomcat 6 が起動しない問題

`unattended-upgrades` の自動更新でトラブルって起きるんだね。
2016-12-17の更新からエラーでTomcatが起動しなくなった。

```
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: java.lang.ExceptionInInitializerError
        at org.apache.catalina.core.NamingContextListener.lifecycleEvent(NamingContextListener.java:262)
        at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
        at org.apache.catalina.core.StandardServer.start(StandardServer.java:752)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
        ... 6 more
Caused by: java.util.MissingResourceException: Can't find bundle for base name org.apache.naming.factory.LocalStrings, locale ja_JP
        at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:1499)
        at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1322)
        at java.util.ResourceBundle.getBundle(ResourceBundle.java:721)
        at org.apache.naming.StringManager.<init>(StringManager.java:68)
        at org.apache.naming.StringManager.getManager(StringManager.java:213)
        at org.apache.naming.factory.ResourceLinkFactory.<clinit>(ResourceLinkFactory.java:44)
        ... 10 more
```


この辺に報告がある。
https://lists.debian.org/debian-user/2016/12/msg00480.html
超意訳
> やあ。
> Debian 7.11 の tomcat6 が今日から壊れているよ。

https://lists.debian.org/debian-user/2016/12/msg00483.html
> 君は一人ではない。私にも同じ問題が起きている。


https://lists.debian.org/debian-user/2016/12/msg00484.html
> `unattended-upgrades` を無効にして、/var/cache/apt/archives から前のバージョンをインストールするんだ。
> 私はそれで解決したよ。

https://lists.debian.org/debian-user/2016/12/msg00485.html
> `libtomcat6-java`をdeb7u3にダウングレードしたら起動するよ。

https://lists.debian.org/debian-user/2016/12/msg00486.html
> バグ報告が無かったら修正されないよ。

https://lists.debian.org/debian-user/2016/12/msg00487.html
> tomcat6は古すぎる。サポートされたバージョンにすることを勧めるよ。
> どうしようもないなら、バグレポートを書きなよ。


うーん。
すぐに修正される雰囲気ではない…？

```
dpkg -i /var/cache/apt/archives/libtomcat6-java_6.0.45+dfsg-1~deb7u3_all.deb

service tomcat6 start
```

とりあえずこれで起動する。

念の為関連パッケージをまとめてダウングレードしてholdする。

```
dpkg -i /var/cache/apt/archives/*tomcat6*_6.0.45+dfsg-1~deb7u3_all.deb 
apt-mark hold libtomcat6-java
```
Pythonのエラー（スタックトレース）を色付けして分かりやすくする

`Pygments`を使ってスタックトレースをちょっと美しくします。

```py3:sample_code.py
def funcA():
  funcB()

def funcB():
  funcC()

def fucnC():
  1/0  # error!

funcA()
```

↓生だとこんな感じ

```
Traceback (most recent call last):
  File "test.py", line 10, in <module>
    funcA()
  File "test.py", line 2, in funcA
    funcB()
  File "test.py", line 5, in funcB
    funcC()
NameError: name 'funcC' is not defined
```

↓これぐらい綺麗にしたい

```py
Traceback (most recent call last):
  File "test.py", line 10, in <module>
    funcA()
  File "test.py", line 2, in funcA
    funcB()
  File "test.py", line 5, in funcB
    funcC()
NameError: name 'funcC' is not defined
```

## 1. Pygmentsのインストール
`pip`でも`easy_install`でも`port`でも。

```bash
pip install Pygments
```

## 2. Pythonコードの最初に以下を追加
`sys.excepthook`を利用します。

```py3:coloring.py
import sys

def myexcepthook(type, value, tb):
    import traceback
    from pygments import highlight
    from pygments.lexers import get_lexer_by_name
    from pygments.formatters import TerminalFormatter

    tbtext = ''.join(traceback.format_exception(type, value, tb))
    lexer = get_lexer_by_name("pytb", stripall=True)
    formatter = TerminalFormatter()
    sys.stderr.write(highlight(tbtext, lexer, formatter))

sys.excepthook = myexcepthook
```
参考: [Coloring exceptions from Python on a terminal](http://stackoverflow.com/questions/14775916/coloring-exceptions-from-python-on-a-terminal)

とりあえずこれで出力されたスタックトレースの文字列や数値が色付けされます。

## （発展） 3. Pythonコード実行時に自動で上記のコードを実行する
全てのコードに上を追加するのは面倒なので、勝手に実行してくれるようにします。
_（意味不明なバグに繋がりかねないので、何をしているか理解してから試すのをおすすめします。）_

`usercustomize`を利用します。
参考: [16.1.4. カスタマイズ用モジュール](http://docs.python.jp/3/tutorial/appendix.html#the-customization-modules)

`python -c "import site; print(site.getusersitepackages())"`で出力されるディレクトリに`usercustomize.py`を作成して、上述のコード`coloring.py`を書けば完了です。

## 感想
やってみた感じ、分かりやすさはあまり変わらないですね！！
dumpsys activity activitiesとpecoでゴニョゴニョして端末からapkを簡単に引っこ抜く

昔々に「**端末からapkを引っこ抜きたいけど、それどこにあるん？**」というネタを書いたんだけど、それの応用編。

[端末からapkを引っこ抜きたいけど、それどこにあるん？](http://qiita.com/operandoOS/items/18ab78093528395c1095)

**※zshでは動いてますが、他は知らん**

## apkの場所がわかったら、さくっと端末から引っこ抜きたいやん

それできますよ:muscle:

以下のような感じでいくつかのコマンドをパイプつなぎで渡して、pecoとか使ってあげればいい感じに引っこ抜ける！

```bash
adb shell dumpsys activity activities | grep apk | sed -e 's/ *baseDir=//g' | peco | xargs adb pull
```

## Demo

こんな感じ:relaxed:いい感じ:relaxed:

![apk_pull.gif](https://qiita-image-store.s3.amazonaws.com/0/43637/7f56cc1a-0747-30b6-896b-3526498699ec.gif)

pecoなのでfilterも選択も簡単だねーさいこー:thumbsup_tone1::thumbsup_tone2::thumbsup_tone3::thumbsup_tone4::thumbsup_tone5:

## aliasとかにしておくと楽

自分はこんな感じでaliasしてま:sushi:

```bash
alias apkpull="adb shell dumpsys activity activities | grep apk | sed -e 's/ *baseDir=//g' | peco | xargs adb pull"
```

## 引っこ抜きたいアプリを起動した上で、コマンドを実行するといいよ！

`dumpsys activity`の出力からゴニョゴニョしているということは、**フォアグラウンド or バックグラウンドにActivityが存在するアプリのapkしか出てこない**という点があるよ！

端末にインストールされてるすべてのアプリのapk出されても困るからね！

**引っこ抜きたいアプリを起動した上で、紹介したコマンドを実行する**といいよ:dagger:
Create.jsで異様にタップの反応が悪いときはTouch.enableが有効になってない

# タイトルで全部いってんじゃん

- うむ。

# 症状

- WebView内にiframeでcreate.jsのコンテンツを置いたときに、タップの反応がちょう悪い。
- 特にiOS。
- 連続タップすると「全選択」とか「コピー」とかでる。
- リリースが近くてきんたまがきゅってなる。

# 原因

```
createjs.Touch.enable(stage);
```

が抜けてる。
Parallel.ForEachの内側でコントロールを制御するとフリーズする

# はじめに
以下の例のように、Parallel.ForEachの内側でコントロールを制御すると、フリーズすることがあります。


```c#:フリーズする例
private void button1_Click(object sender, EventArgs e)
{
    var range = Enumerable.Range(1, 100);
    this.progressBar1.Value = 0;
    this.progressBar1.Maximum = 100;

    var result = Parallel.ForEach(range, num =>
    {
        //重い処理
        System.Threading.Thread.Sleep(1000);
        
        //コントロールの制御
        this.Invoke(new Action(() =>
        {
            lock(this.progressBar1) {
                this.progressBar1.Value += 1;
            }
        }));
    });
    while(!result.IsCompleted) ;
}
```

#対処法
[MSDN](https://msdn.microsoft.com/ja-jp/library/dd997392.aspx)によると、「UI スレッドでの並列ループの実行は避ける」と説明されています。
そこで、以下の様にTaskを使ってParallel.ForEachをUIスレッド以外で実行すると、フリーズしないで動作するようです。
**2017/01/06 追加**
コメントでlaughterさんが、原因について詳しい解説をして下さっています。

```c#:フリーズしないように修正
private async void button1_Click(object sender, EventArgs e)
{
    var range = Enumerable.Range(1, 100);
    this.progressBar1.Value = 0;
    this.progressBar1.Maximum = 100;
    
    await Task.Factory.StartNew(() =>
    {
        var result = Parallel.ForEach(range, num =>
        {
            //重い処理
            System.Threading.Thread.Sleep(1000);
            
            //コントロールの制御
            this.Invoke(new Action(() =>
            {
                lock(this.progressBar1) {
                    this.progressBar1.Value += 1;
                }
            }));
        });
        while(!result.IsCompleted) ;
    });
}
```
ScriptableObjectことはじめ

# ScriptableObjectとは？
端的にいうとUnityのゲームの設定を保存できるものです。
自分の作業環境で簡単なテストを行うときなどに使用すると便利です。またGUIからゲームの設定などを行えるのでテストデータのファイルを更新・保存を繰り返さなくてすむのも利点です。

↓例としてゲームの演出をテストするとしてこんな感じのものを作りました
![ScriptableObjectGui.png](https://qiita-image-store.s3.amazonaws.com/0/148273/ab436653-7143-351c-e9ce-8e153cc2991b.png)

# ScriptableObjectの作り方
一番簡単なScriptableObjectを作成する際に必要なファイルは「ScriptableObject」を継承したクラスを含むC#ファイルのみです。下記のような簡単な記述でScriptableObjectを作成することができます。

```csharp:LocalEffectSetting.cs
using UnityEngine;
using UnityEditor;
using System.Collections;

public class LocalEffectSetting : ScriptableObject {
	public bool UseLocalEffectResource = false;
	public GameObject EffectResource;
	[Range(0,100.0f)]public float DelayTime = 0.0f;
	public string EffectName = "";
	
	[MenuItem ("Assets/Create/LocalEffectSetting")]

	static void CreateLocalEffectSetting ()
	{
		LocalEffectSetting localEffectSetting = CreateInstance<LocalEffectSetting> ();
		string path = AssetDatabase.GenerateUniqueAssetPath("Assets/Resources/ScriptableObject/LocalEffectSetting.asset");
		AssetDatabase.CreateAsset(localEffectSetting, path);
		AssetDatabase.Refresh ();
	}
}
```

まず下記抜粋部で設定したい値を定義しました。Unityエディタの拡張機能も使用することができます。

```csharp
public bool UseLocalEffectResource = false;
public GameObject EffectResource;
[Range(0,100.0f)]public float DelayTime = 0.0f;
public string EffectName = "";
```
↓Unityエディタの拡張機能を使用して入力をスライダーにした
![ScriptableObjectDelayTime.png](https://qiita-image-store.s3.amazonaws.com/0/148273/8e8f8332-e735-8b05-2aad-c680643f6f50.png)

次にScriptableObjectを作成するメソッドです。作成した「LocalEffectSetting」のインスタンスを作成し、指定したパスにAssetデータとして保存しています。

```csharp
	static void CreateLocalEffectSetting ()
	{
		LocalEffectSetting localEffectSetting = CreateInstance<LocalEffectSetting> ();
		string path = AssetDatabase.GenerateUniqueAssetPath("Assets/Resources/ScriptableObject/LocalEffectSetting.asset");
		AssetDatabase.CreateAsset(localEffectSetting, path);
		AssetDatabase.Refresh ();
	}
```

このままでは作成用のメソッド「CreateLocalEffectSetting」を実行できないので下記のように記述し、Unity上から実行できるようにします。

```csharp
[MenuItem ("Assets/Create/LocalEffectSetting")]
```
![ScriptableObjectCreate.png](https://qiita-image-store.s3.amazonaws.com/0/148273/b94b8202-14f2-1c12-bf07-6131a942110b.png)

実行するとScriptableObjectが作成されます。あとは値の中身を設定して使用するだけです。前述のソースで作成した場合は下記のようにすることで使用することができます。

```csharp
LocalEffectSetting localEffectSetting = Resources.Load<LocalEffectSetting>("ScriptableObject/LocalEffectSetting");
```

# 終わりに
ScriptableObjectを上手に使用することでゲームのテストを容易に行うことができるようになります。またScriptableObjectだけでなくUnityエディタの拡張機能を使いこなすことでゲーム開発を円滑に進めていくことができると思います。これらを使いこなして快適なゲーム開発ライフを送りましょう！！
D3.jsで子要素ごとコピーして追加する

D3.js(ver4)を使っており、Selection(D3.jsでラッパーしたDOM要素)をコピーしたいと思っていたところ、[「D3.jsで要素をコピーして追加する」](http://qiita.com/_shimizu/items/3f7bfdfc3c8b989654a7)の記事が参考になりました。

上記の処理を少し拡張することで子要素も含めてSelectionをコピーする事ができます。（jQueryだと要素コピーするためのclone関数があるけど、D3.jsには無さげ...？）

```javascript:Selectionをコピーする関数
// 第一引数はコピーの対象Selection、第二引数はコピーの追加先Selection
function copySelection( $target, $to ) {
	let node = $target.node();
	let {nodeName, attributes, children} = node;
	let $copy = $to.append(nodeName);

	Object.keys(attributes).forEach((key) => {
		$copy.attr(attributes[key].name, attributes[key].value);
	});
	$copy.html($target.html());

	return $copy;
}
```

```javascript:関数を実行
let $copy = copySelection( d3.select('g'), d3.select('svg') );
```

一応、実際に動くものも[こちら](http://codepen.io/osumi/pen/NbJxde)に用意しました。
ドローン操縦の実際とプログラム、そして未来

この記事はフロムスクラッチ Advent Calendar 2016の20日目の記事です。


#１．想定読者
・ドローンを使ってできることに興味がある人
・ドローンを使って空撮していた人の体験談に興味がある人
・ドローンとプログラミングの関係性に興味がある人

#２．自己紹介
はじめまして。フロムスクラッチ関連会社のTechJINに所属しているものです。
ネットワーク系の会社に勤めた後、ジャマイカで国際協力活動を行っていたという異色の人間です。
ジャマイカでは、自腹で購入したドローンで観光ビデオを作り、某地方自治体（日本）に納入したりしていました。


#３．この記事で伝えたいこと
この記事では、ドローンを1年以上操縦していたものとして、以下3点を大まかに伝えることができればと思います。

・ドローンを使ってできること
・ドローンを実際に操縦し、空撮して感じたこと
・ドローンとプログラミングの関係、そして未来


#４．ドローンを使ってできること
さて、一般の方でもドローンとは何かを知っている時代です。では、ドローンを使って実際に何ができるのでしょうか？

1.空撮
2.橋や発電所などのインフラの点検
3.配達
4.その他（レース、広告など）

###1.空撮
空から映像や写真を撮ることです。今までの空撮はヘリコプターを使っていましたが、ドローンに代替することで、コストが格段に安くなりました。建設中の高層ビルを空撮しディベロッパーに提供することで、収入を得ている人がいるなんて話も聞きます。
ジャマイカでは、メディアがドローンを使って映像を撮り、テレビで放送していました。

###2.橋や発電所などのインフラの点検
ドローンにセンサーを搭載することで、インフラの非破壊検査（と推測）ができます。
電力会社に勤める私の知人も、ドローンを点検用途に使用しているようです。

###3.配達
Amazon社がドローンを使った配達を構想しています。離島への配送コストを抑えるため、ドローンを使うという話も聞きますね。
[アマゾン、英国で初のドローン配送を完了。Prime Airサービス発表から3年で実現](http://japanese.engadget.com/2016/12/15/prime-air-3/)

刑務所にいるボスのために怪しいものをドローンを使って配達する組織があるという話も。。

###4.その他（レース、広告など）
日本では大々的に開催されていませんが、世界ではドローンを使ったドローンレースなんてものがあります。そのほか、ドローンにLEDを搭載して広告に利用するという新しい流れもあります。
[【動画】ドバイで開催された「ドローンレース」が美しすぎる件 / 完全に『F-ZERO（エフゼロ）』の世界](http://rocketnews24.com/2016/03/16/723953/)
[マイクロアド、ドローンによる次世代サービス「Sky Magic」を発表](http://ja.catalyst.red/articles/sky-magic-live)

技術的には、自動航行ができます。つまり、あらかじめGPSの座標を設定すると、操縦者が操縦しなくともドローンが予定経路を飛行することが可能です。また、"Follow me"という機能もあり、操縦者が動くと勝手にドローンが操縦者についてきます。これは最初本当に驚きました。


#５.ドローンを実際に操縦し、空撮して感じたこと
私はジャマイカで1年以上ドローンを飛ばしていましたが、ドローンは楽しい！というのがまず言えることです。子どものころ飛行機のパイロットになりたいと思われた方もいるかもしれませんが、今ならその夢が叶います。
そして、空からの写真や映像は想像以上に魅力的なものです。写真好きな方は試してはいかがでしょうか。

逆に神経を使っていたことは次の2点、必ず法律を守ることとバッテリーの持続時間に注意することです。
まず、法律の話。日本を含めた各国はドローンが人々の社会生活に悪影響を与えないよう法律を制定して、ドローンに飛行制限を与えています。ジャマイカの法律の例で言えば、400フィート（122m）以上高度を上げてはいけない、1640フィート（500m）以上操縦者から距離をとってはならないなどです。ドローンは落ちるもの、落ちたら人や家屋に損害を与えるものという意識が重要です。
次に、バッテリーの話。ドローンはバッテリーを動力として飛行します。動力源が尽きたら落ちます。落ちたら誰かがケガをするかもしれません。残バッテリー量を把握して飛行計画を立てることが大事です。バッテリー量が少なくなると自動帰還する機能がありましたが、私は信じていませんでした。。


#６．ドローンとプログラミングの関係、そして未来
突然ですが、ドローンはハードウェアも大事ですが、ハードウェアを制御するフライトコントローラなどのソフトウェアも大事です。オープンソースの**ドローンコード**というものがありまして、これを利用して事業に活用していく流れができています。ドローンコードを利用することで、1．機体制御　2．センシングデータの加工　3．飛行ログ解析のカスタマイズが可能になるようです。私自身まだドローンコードを触ったことがないので、中身についてお話しできず恐縮です。。趣味として、触る機会を作っていけたらなと思っています。
[ドローンのオープンソース化の流れと産業利用に与える影響](http://dronemedia.jp/open-source-drone-code/)

最後に、ドローンの未来についての話ですが、今後ドローンにはsimカードが搭載されてリアルタイム通信可能な空飛ぶデータ取得マシン・配達マシンとなっていくのではないでしょうか。先日もNTTドコモ社が実験をしておりました。
[報道発表資料「ドコモ・ドローンプロジェクト」を本格開始](https://www.nttdocomo.co.jp/info/news_release/2016/10/19_06.html)

昨今、データ活用の重要性が話題に上がっています。ただ、今までは**”オンライン”**のデータしか取得・活用できていませんでした。今後、様々なセンシング装置を搭載したドローンが**”オフライン”**のデータを取得しそれを活用するシステムが拡充していくことで、新たなビジネスの機会創出、ひいては社会へ素晴らしいインパクトを与える、なんてこともあるかもしれません。


#７．終わりに
今回はドローンについて私が知っていること、体験からの教訓の一部を簡単に書かせて頂きました。ご覧の皆様が少しでも記事を楽しんで頂ければ幸いです。
VirtualboxにCentOS7を構築する

##前提
- Virtualbox 5.1.10
- CentOS 7

##VirtualboxにCentOS7をインストールする

1.まずCentOS7を下のダウンロードサイトからどれでもいいので選んで、
次に表示される画面で「CentOS-7-x86_64-DVD-1511.iso」を選択する。
(勝手にダウンロードが始まる)
[CentOS Mirror](http://isoredirect.centos.org/centos/7/isos/x86_64/)

2.CentOS7 isoのダウンロードが終わったらVirtualboxを立ち上げて、[新規]を押す。

3.名前/タイプ/バージョンを以下のように設定して[次へ]。

|        |         |
|:-----------------|:------------------|
| **名前**            |         CentOS7|  
| **タイプ**           |          Linux |    
| **バージョン**           |     Red Hat(64-bit) |       


4.次の画面からはトントンと行きます。以下のように設定して仮想マシンが作成されていることを確認。

|        |         |
|:-----------------|:------------------|
| **メモリサイズ**            |        4096|  
| **仮想ハードディスク**           | 仮想ハードディスクを作成する|    
| **ハードディスクのファイルタイプ**           |VDI（VirtualBox Disk Image）|
|**物理ハードディスクにあるストレージ**|可変サイズ|
|**ファイル名**|CentOS7||
|**仮想ハードディスクのサイズ**|16GB|

5.作成した仮想マシンを選択し、画面上の[起動]を押すと、
「起動ハードディスクを選択」という画面が出るので
先ほどダウンロードしてきたCentOS-7-x86_64-DVD-1511.isoを選択する。

6.選択されたのを確認後、[起動]を押すとCentOS7のインストーラーが起動する。
「ほにゃららほにゃららTroubleshooting」など表示されたら[Enter]を押す。

7.**言語**･･･次の画面で言語を日本語に選択する。

8.**インストールの概要**･･･日付設定は全て日本になっていると思うので、他の箇所の設定をします。

| |    |      
|:-----------------|:------------------|
| **ソフトウェアの選択** | サーバ(GUI使用)   |    
| **インストール先**   | 何もせずに[完了]  |  
|**ネットワークとホスト名**|右上を[オン]にして[完了]|
ソフトウェアの選択はデフォルトで「最小限のインストール」になっているので注意。  
設定が終わったら[インストール開始]を押す。

9.**ユーザ設定**･･･rootのパスワードを設定し、ユーザの作成をする。
ユーザの作成画面では、「このユーザを管理者にする」にチェックを入れて[完了]。
設定が完了したらインストールが完了するのを待る。

10.インストールが完了したら画面右下の[再起動]をクリック。

11.再起動が終了したら誓約書画面的なのが現れるので同意して進む。
意味がわからなければ「c」と「1」を適当に押して進んでいけば大丈夫。←

12.しばらく待つと先ほど作成したユーザが表示されるのでクリック。
パスワード入力画面ではユーザ作成時に設定したパスワードを入力して[サインイン]。

13.これでインストールからCentOS7へのログインが完了し、このあとまたCentOS側から
言語の設定画面などが表示されますが、デフォルトで日本語になっていると思うので
そのまま進んでサービスなどの選択画面はとりあえず[スキップ]で。

14.設定完了

##まとめ
CentOS7では6と比べてだいぶ設定画面が変わっていたので面倒かと思いましたが全然簡単でした。
字だけの説明だからわかりにくいかもしれませんが自分の備忘録として。
ホストPCとマウス統合やコピペできないのが不便だなあ
初めてVSCodeのEditor拡張を作った

## Smile Editor

今回、Smile EditorというEditor拡張を作って公開しました。
[https://marketplace.visualstudio.com/items?itemName=ItalangMong.smile-editor](https://marketplace.visualstudio.com/items?itemName=ItalangMong.smile-editor)

githubでソースコードを公開しています。
[https://github.com/MizoTake/SmileEditorExtension](https://github.com/MizoTake/SmileEditorExtension)

javascriptも初めてで、なるべくライブラリを使ってでも実装をしていきました。
また、英語はきっと…なんちゃって英語になっているでしょう…(気をつけましたが…)

さて、今回作ってみた拡張は、エディターを普通に使っているとたまにWebCamで撮影が行われます。そこで顔の撮影を行います。撮影をした写真をMicroSoftのEmotino APIに投げて、感情の数値を取得します。そこで、笑っているかどうかの数値を取得して一定以上でなかったら操作しているファイルの文字を全て消すという…ちょっとブラック感あるエディター拡張ですw
ちなみに、顔が写ってなくても全部消します。

![demo.gif](https://raw.githubusercontent.com/MizoTake/SmileEditorExtension/master/resources/demo.gif)

今回、初めてjavascriptを使用してみたのですが、メリットデメリットをだいぶ感じながらプログラミングをしてました。
そして、ajaxというのを使ってapiを叩こうとしていたのですが、うまくいかず…断念してnpmにあったEmotion APIを叩く専用のライブラリを使わせていただきました。

…ajaxでapplication/octet-streamを使ってうまくいった人に、気をつける部分等をご教授願いたいです。

使える拡張機能より、少しでも面白くする拡張エディタを今後考えて行こうと思います。

Emotion API
[https://www.microsoft.com/cognitive-services/en-us/emotion-api](https://www.microsoft.com/cognitive-services/en-us/emotion-api)

node-oxford-emotion
[https://www.npmjs.com/package/node-oxford-emotion](https://www.npmjs.com/package/node-oxford-emotion)
Drupal 最短インストール

コンソールコマンドの Drush を使って、コマンドラインだけで **Drupal** のインストールを完了させる手順です。

## 環境構築
必要に応じて実施してください。
ここでは例として以下のものをインストールしています。

* CentOS 7.2.1511 (minimal)
* Apache 2.4.6 (base)
* PHP 7.0 (remi-php70)
* MariaDB 5.5.52 (base)
* Drush 8.1.7 (epel)

### ミドルウェアのインストール
```bash
yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum -y install yum-utils && yum-config-manager --enable remi-php70
yum -y install drush httpd php mariadb-server php-mysqlnd
cat << "_EOF_" > /etc/httpd/conf.d/drupal.conf
<Directory "/var/www/html">
    AllowOverride All
</Directory>
_EOF_
systemctl start httpd mariadb && systemctl enable httpd mariadb
```
Drupal 8 のシステム要件が PHP 5.5.9 以上なので、 remi リポジトリ等を導入します。
Drush は EPEL リポジトリに含まれます。ここでは remi リポジトリをインストールしているため、依存関係で EPEL リポジトリは自動的にインストールされることから明示していませんが、そうでない場合は `yum install epel-release` と指定してインストールしましょう。

### データベース
```bash
mysqladmin create [db_name]
cat << "_EOQ_" | mysql -u root -p
CREATE USER '[db_user]'@'localhost' IDENTIFIED BY '[db_pass]';
GRANT ALL ON [db_name].* TO '[db_user]'@'localhost';
_EOQ_
```
ここでは例として MariaDB にデータベースとユーザーを作成しています。
SQLite を利用する場合は不要です。

## Drush による Drupal のインストール
### ファイルのダウンロードと展開
```bash
cd /var/www
drush dl drupal --drupal-project-rename=html --yes
```
`--drupal-project-rename` はカレントディレクトリーに指定された値を加えたものでディレクトリーを作成してファイルをダウンロード、展開されます。
`grep` で確認した限りでは展開パス以外でこの値は使用されていないようです。
また絶対パスは効きません。（例えば /root で `--drupal-project-rename=/var/www/html` などと指定すると /root//var/www/html というパス指定で処理される）
未指定の場合は drupal-8.2.4 などのディレクトリー名になります。

### セットアップ
```bash
cd /var/www/html
drush site-install standard --yes \
install_configure_form.site_default_country=JP --locale=ja \
install_configure_form.date_default_timezone="Asia/Tokyo" \
--db-url='mysql://[db_user]:[db_pass]@localhost/[db_name]' \
--site-name=[site_name] \
--site-mail=[site_mail] \
--account-name=[admin_name] \
--account-pass=[admin_pass]
chown -R apache:apache /var/www/html/*
```

`drush site-install` は `drush si` と省略可能です。 [^drush-si]
最後にファイルの所有者を変更しないとうまく動作しないので注意が必要です。

[^drush-si]: https://drushcommands.com/drush-8x/core/site-install/
UnityでF#を使う （アップデート）

# はじめに

こんにちは、やのせん(@yanosen_jp)と申します。 普段は、教育用のアプリを作っており、F#は初心者です。以前に[Unity で F#を使う 導入編 メモ](
http://qiita.com/yanosen_jp/items/74fe2b279aa2ff51858a)というのを書いたのですが、それから一年ほどたち、補足したい事も出来たので、アップデートとしてちょっと書いてみることにしました。

#Unity
Unityというと、F#界隈の皆さんはDependency Injection用のコンテナを想像されるかもしれませんが、そちらの方ではなく、いわゆるゲームエンジンの方です。Unity（[ホームページ](https://unity3d.com/jp/)）を使うことで、PC、スマホ、コンソールなど、幅広いプラットフォームでゲームやアプリを制作することが可能です。最近では、VR（バーチャルリアリティ）アプリの開発環境としても注目されています。

![image](https://qiita-image-store.s3.amazonaws.com/0/58503/ff240aba-cf80-00a8-111d-466cdafc30a7.png)


#UnityでのF#使用環境

UnityはMono 2.6を使用しているため、.NET Framework 3.5相当のC#でスクリプトをVisual Studio Tools for Unity やMonodevelopで書くことが可能です（[参考](http://www.buildinsider.net/small/multitarget/02)）。

さらに、.NET Frameworkなので、C#だけでなくF#も使えます。ただ、付属のエディタでそのままF#スクリプトを書くことはできず、別にF#プロジェクトを作って、ビルドしたdllをUnityプロジェクトを読み込ませることになります。

.NET Framework 3.5のため、F# 2.0までしか使えない、というのが結構な制約なのですが、現在**.NET 4.6 (C#6.0相当) へのアップグレード作業が進められており**、2017年のどこかには利用可能になる予定です （[参考1](https://forum.unity3d.com/threads/upgraded-mono-net-in-editor-on-5-5-0b4.433541/)）。そうすれば、F# 3.0を利用できるようになるでしょう（ベータ版では動作確認済み）。海外のF#本は多くが3.0前提になっているので、これはありがたいですね。

#Unity向けのF#プロジェクトの作り方

標準的なやり方は、[Unity で F#を使う 導入編 メモ](
http://qiita.com/yanosen_jp/items/74fe2b279aa2ff51858a)に記載した通りです。つまり

* Visual StudioでF#プロジェクトを作り、Output先をUnityのAssetフォルダ以下におく（これで、Unity側でコンパイルされる）
* F#プロジェクトにUnityEngine.dllへの参照を加え、スクリプトを作成してビルドする。

もう一つのやり方は、前の記事を出した後にリリースされたF# kitというUnity用のアセット（プラグインみたいなもの）を使う方法です。

![image](https://qiita-image-store.s3.amazonaws.com/0/58503/b12e3d1e-d479-a898-ac68-ea31f7996199.png)

こちらの方は、Unityのエディタ拡張スクリプトが付属しており、Unityのエディタ内で新規のF#スクリプト（ソースファイル）の作成ができるようになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/58503/16bb412a-b2c7-2578-47b9-dee1fa85b2f1.png)

スクリプトの編集はVisual Studioで行えます。スクリプトに変更を加えると、自動的にUnity上でコンパイルが走り、プロジェクトがアップデートされます。

#F#側から見た、Unityの使い道

F#を使ってデータ解析をしている方々にとって、Unityを使う利点は「データをインタラクティブにする」ことではないかと思います。特に、データをVRでインタラクティブにするのには、Unityはとても良いと思います。Oculus Rift（ヘッドマウントディスプレイ）を使っていろいろな視点からデータを見たり、Oculus Touch（VR内に自分の位置を表示させる入力デバイス）を使ってデータを見え方を変えられると、とても楽しいです。

![image](https://qiita-image-store.s3.amazonaws.com/0/58503/43102c8a-4b78-8aec-395f-6feda2cc88c4.png)

下に示すのは、私が普段F#で解析してる、学生の得点データをUnity内で3Dで表示し、Oculus Riftで見ながらOculus Touchで操作している様子です。Touchは親指、人差し指、中指を伸ばしているか曲げているかを判定できるので、その組み合わせでグラフの移動、拡大縮小、回転などを行います。

![VRGraph.gif](https://qiita-image-store.s3.amazonaws.com/0/58503/b9334698-2645-9d8c-6545-7a01dde7c1fd.gif)


ただ、残念ながら現時点ではUnityにはF#のXPlotに相当するようなグラフ描画ライブラリがないので、かなりの部分を自作することになってしまいますが。UnityでData Visualizationをする人が増えてくれば、誰かがアセットを作ってくれるんじゃないかなーと勝手に期待しています。

私からは以上です。次は、zeclさんの「TypeProviderに関するちょっとした小ネタを書く予定」です！
Token based authentication for Rails JSON APIs. Designed to work with jToker and ng-token-auth. 


https://github.com/lynndylanhurley/devise_token_auth

```
Cache-Control →max-age=0, private, must-revalidate
Connection →Keep-Alive
Content-Type →application/json; charset=utf-8
Date →Tue, 20 Dec 2016 08:04:57 GMT
ETag →W/"f5911975e82c99ba1dcfc444e9774f70"
Keep-Alive →timeout=5, max=100
Server →Apache/2.4.7 (Ubuntu)
Status →200 OK
Transfer-Encoding →chunked
X-Content-Type-Options →nosniff
X-Frame-Options →SAMEORIGIN
X-Powered-By →Phusion Passenger 5.0.30
X-Request-Id →04cacfb6-2e0e-4e10-8cc2-586dd1665ea1
X-Runtime →0.236133
X-XSS-Protection →1; mode=block
access-token →5Jd8vUNRtdgPMulkuDyfVw
client →XWEF6FyhnYtRAJdOWScoUw
expiry →1483430698
token-type →Bearer
uid →nakajiman@example.com
```
（ネストした）recordの更新でエラーが出る

こんなエラーが出るんです。

>I ran into something unexpected when parsing your code! - I am looking for one of the following things:
>
>    "'"
>    "|"
>    an equals sign '='
>    more letters in this name
>    whitespace

もしくはこれ

>I ran into something unexpected when parsing your code! - I am looking for one of the following things:
>
>    a closing bracket '}'
>    a lower case name
>    whitespace

## この記事の内容

recordを更新していて上記のようなエラーが出た理由

## エラーになるコード

ネストしたレコードや他モジュールからrecordとってきて更新しようとしたときにエラーになります

```.elm
type alias Point =
  { x : Int
  , y : Int
  }


type alias Model =
  { point : Point
  , something : String
  }


moveX : Int -> Model -> Model
moveX dx model =
  { model | point = { model.point | x = model.point.x + dx }}
```

これはネストしている場合です。PointとPointが入ったModelを作って、moveXでPointのxを変更しているコードです
特に問題ないように見えますが、このコードはコンパイルが通りません

`model.point`の位置に一番上のエラーが出ます。コンパイルエラーなんですけど、最初なんでそうなるのかわかりませんでした。合法に見えるでんすよね

## 理由
recordのupdate構文には制限が掛かっていて、`{`と`|`の間には値（？）しか置けません
正確な用語はわからないんですけど1トークンしか置けない感じです

```.elm
{ model | -- Ok

{ modelPoint | -- Ok

{ model.point | --　関数適用はだめ

{ toRecord 1 "something" | -- 関数適用はだめ

{ AModule.record | -- 修飾名もだめ
```

[Elm Discuss](https://groups.google.com/forum/#!topic/elm-discuss/WjVON6keZ7s/discussion)を読んでみたんですが、
- あいまいさが残る
  - `{ model.point |`の返却値はmodelとも読めるし（中のpointだけ更新する構文にも見える）、pointとも読める
- パースがちょっと大変
- 制限なくすとちょっと便利になるけど、言語の方向としてそっちが正しいか確信を持てないので変えません
- プロジェクトでやっぱりないとつらいってなったら報告してね

みたいな感じで、[8日目のjinjorさんの記事](http://qiita.com/jinjor/items/f208d99ff8c41450384a)で触れられている通りの雰囲気です

## 解決方法
上で言及したdiscussや関連するissueなどを読んでいただくのがいいと思うんですけど、いくつか解決策をあげておきます

```.elm
moveX : Int -> Model -> Model
moveX dx model =
  let
    point = model.point
  in
    { model | point = { point | x = model.point.x + dx }}
```

letで定義し直してしまう方法です。
簡単に置き換えるだけですが、ちょっとダサい気もしますね

```.elm
moveX : Int -> Model -> Model
moveX dx model =
  { model | point = updatePoint model.point }
```

別の関数をかまします。そもそもネストしたものをその場で一気に変更するのは見づらいしやめようって感じです

あとは使い方わかっていないんですが、[Lensってライブラリ](http://package.elm-lang.org/packages/arturopala/elm-monocle/1.4.0/Monocle-Lens)を使ってみるとか

追記
[elm-monocleを使ってみた方](http://qiita.com/4245Ryomt/items/0e7293a4f7a2fbd432a9#_reference-c10740024f7b640024e7)がいるのでそちらをご参照ください

## 終わり

終わり。Elm Advent Calendar、今年は盛りだくさんなのでElm始めるにはいいタイミングかもしれませんね。
土曜も担当します
Kubernetesをしゃべらせてみる

# 概要
この記事は[Kubernetes Advent Calendar 2016](http://qiita.com/advent-calendar/2016/kubernetes)の12/21の記事です。

kubernetesは分散アプリケーションをうまく管理することができる素敵なソフトウェアです。
仕事でもちょこちょこ触っているのですが、今回はAdventCalendarということでkubernetesの紹介がてら、ちょっとおもしろいものを作ってみようと思います。

kubernetesはユーザの操作とは非同期に動いていて、ユーザが指示を出しても、その結果が完全に反映されるまでに少し時間がかかります。
また、ユーザが操作していなくても、障害などがあれば勝手にシステムを正しい状態に戻してくれます。

この挙動は分散アプリケーションを扱う上ではとても良いのですが、利用者からすると、「いつ、何が起きているのか?」がわかりにくいことがあります。

ということで、「今kubernetesの中で何が起きているのか」を表示するWebアプリケーションを作ることにします。
ただ、画面に表示するだけでは、面白くないので「しゃべるkubernetes」というのを作ってみようと思います。


# Event
kubernetesのリソースの中にEventと呼ばれるものがあります。
これは``kubectl get events``するとみることができますので、知ってる人もいるかと思います。

今回はこのリソースを監視して、kubernetesで起きていることをしゃべらせることにします。

# 作ったもの

https://github.com/kubernetes/client-go/tree/master/examples/in-cluster
ここにclient-goというkubernetesのAPIをうまいこと扱うことができるライブラリのサンプルがあります。
これを参考にEventリソースをWatchします。

そして、しゃべらせるためにWebページを配信するようにします。
図にするとこんな感じ。

![image](https://qiita-image-store.s3.amazonaws.com/0/100375/68fb5c17-baf1-2836-1c7c-b8f633f47501.png)



# 英語で読み上げてみる

[![kubernetes speaking](http://img.youtube.com/vi/Aop0khBHZd4/0.jpg)](http://www.youtube.com/watch?v=Aop0khBHZd4)



いい感じですね。
作っていて発見しましたが、バックグラウンドでもしゃべってくれるので、オペレーションの邪魔にならず、案外まともに運用業務で使えるかもしれないのでは　と感じました。

# 日本語で読み上げてみる
やはり日本人なので、日本語で話すようにしたい

[![しゃべるkubernetes](http://img.youtube.com/vi/4WYKN83TEXg/0.jpg)](http://www.youtube.com/watch?v=4WYKN83TEXg)

といっても、kubernetesのEventには英語のメッセージしか入ってこないので、英語 → 日本語の変換テーブルを作って無理やり日本語にすることにします。

# ちょっとした解説
## EventsをWatchする

https://github.com/kubernetes/client-go/tree/master/examples/in-cluster
こちらを参考にしています

お作法的にclientsetを作成した後は

```
        eventInterface, err := clientset.CoreV1().Events("").Watch(v1.ListOptions{})
        eventCh := eventInterface.ResultChan()
```

このようにEventリソースに何かあったら通知が飛ぶようなチャンネルを作成して、、

```
        for {
                select {
                case event := <-eventCh:
                        ev, ok := event.Object.(*v1.Event)
                        if ok {
                                switch event.Type {
                                case watch.Added:
                                        fmt.Println("## Added:")
                                        printEvent(ev)
                                        emitEvent(ev, msgCh)

```

やってきたイベントによって実行する処理を書くだけ！
今回はwebsocketでブラウザにメッセージを送っています。



## WebSocketで配信する
今回ここはとてもテキトーに作ってしまったので、一度に複数のブラウザで閲覧するとどれか一つにしか通知が飛ばないです。。

ブラウザではサーバからのEventリソースの変更通知を受け、Web Speech Synthesis APIを利用してしゃべらせます。

こちらの記事を参考にしました
http://qiita.com/kyota/items/da530ad22733b644518a

## ソースコード
これをそのまま使うことはないだろうけど、一応こんな感じですということで、、
https://github.com/inajob/kube-sniff

# まとめ

このようにkubernetesは非常に簡単に拡張ができ、kubernetesと連動した”なにか”を作ることができます。
分散アプリケーションの運用というのは、シチュエーションごとに様々な要件がありますが、難しいことはkubernetesに任せつつ、追加の要件をこの記事のようにアドオンで開発することで、運用のための開発を最小限にすることができます。
Python > listの値を取り出す (unpackする) > *をつける > print (*mylist) / print()に関してPython 2とPython 3の違いについて教えていただきました

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
```

```
sc_N = array.array('i')
sc_N.fromfile(rfp,1)
sc_sizes = array.array('i')
sc_sizes.fromfile(rfp, sc_N)
```

上記はエラーとなる。

> TypeError: an integer is required

sc_Nが値(integer型)でなく、リストになっているから。

１つの要素のリストから値を取るにはunpackすることになりそう。

参考 http://stackoverflow.com/questions/3480184/unpack-a-list-in-python

実装してみた。(追記: 以下のideoneではPython 3環境です)
http://ideone.com/1VUh3O

```py
mylist = [ 3 ]
print (mylist)
 
print (*mylist)
```

```txt:実行
[3]
3
```

取れた。

### Python2とPython3

print()の例でPython2とPython3の違いについて @knoguchi さんと @shiracamus さんに教えていただきました。

今後のことを考えてPython3で実装するように検討してみます。
技術英語 > try to [factor out] measurement overhead and program-startup overhead

@ Code Complete (No. 19602 / 36077)

> Likewise, try to **<font color=red>factor out</font>** measurement overhead and program-startup overhead ...

https://www.merriam-webster.com/dictionary/factor
> to exclude as a factor —used with out

意訳「同様に、測定によるオーバヘッドとプログラム開始によるオーバーヘッドを取り除くようにしなさい」

処理時間の計測時の留意点。
PowerShellメモ　ADユーザー・グループの参照、作成

# <i class="fa fa-file-text-o" style="font-size:1em;"></i> コード

```PowerShell:ユーザー情報表示
Import-Module ActiveDirectory

# 全ユーザーを表示
Get-ADUser -Filter * -Properties * | 
    Select-Object displayName,name,enabled,sAMAccountName,userPrincipalName,emailAddress,canonicalName | 
    Out-GridView

# "User"で始まるユーザーを表示
Get-ADUser -Filter {sAMAccountName -like "User*"} -Properties * | 
    Select-Object displayName,name,enabled,sAMAccountName,userPrincipalName,emailAddress,canonicalName | 
    Out-GridView
```

```PowerShell:グループ情報表示
Import-Module ActiveDirectory

# 全グループを表示
Get-ADGroup -Filter * -Properties * | 
    Select-Object displayName,name,sAMAccountName,GroupCategory,GroupScope,mail,member | 
    Out-GridView
```

```PowerShell:ユーザー作成
Import-Module ActiveDirectory

<#
ユーザー「ADUser001」の作成
　　□ユーザーは次回ログオン時にパスワード変更が必要
　　□ユーザーはパスワードを変更できない
　　■パスワードを無期限にする
　　□アカウントは無効
#>
$password1 = ConvertTo-SecureString -AsPlainText "akuD3!%fjzi0lnQ#" -Force
New-ADUser -Name ADUser001 -DisplayName ユーザー1 -ChangePasswordAtLogon $false -CannotChangePassword $false -PasswordNeverExpires $true -Enabled $true -AccountPassword $password1 -Description "○○用のユーザー"


# OU作成
New-ADOrganizationalUnit -Name TestOU -ProtectedFromActidentalDeletion $true
# 大量にユーザー作成（TestUser_00001～TestUser_15000）
$password2 = ConvertTo-SecureString -AsPlainText "test#pswd123%zo0Ol1i" -Force
1..15000 | ForEach-Object {
    [string]$userName = "TestUser_{0:D5}" -f $_
    [string]$dispName = "テストユーザ―_{0:D5}" -f $_

    New-ADUser -Name $userName -DisplayName $dispName -Path "OU=TestOU,DC=testDc,DC=local"  -ChangePasswordAtLogon $false -CannotChangePassword $false -PasswordNeverExpires $true -Enabled $true -AccountPassword $password2 -Description "テスト用のユーザー"
}
```

```PowerShell:グループ作成
Import-Module ActiveDirectory

# グループの作成
New-ADGroup -Name Group001 -DisplayName グループ1 -GroupScope Universal -GroupCategory Security -Description "ユニバーサルセキュリティグループ"
New-ADGroup -Name Group002 -DisplayName グループ2 -GroupScope Global -GroupCategory Distribution -Description "グローバル配布グループ"
New-ADGroup -Name Group003 -DisplayName グループ3 -sAMAccountName SAM_Group003 -OtherAttribute @{'mail'='group003mail@hoge.piyo.jp'; 'mailNickName'='nnGroup003'} -GroupScope Universal -GroupCategory Security

# グループへのメンバ追加
Add-ADGroupMember -Identity Group001 -Members User_A, User_B
```

# <i class="fa fa-book" style="font-size:1em;"></i> 参考サイト
* [Get-ADUser - TechNet](https://technet.microsoft.com/ja-jp/library/ee617241.aspx)
* [Get-ADGroup - TechNet](https://technet.microsoft.com/ja-jp/library/ee617196.aspx)
* [New-ADOrganizationalUnit - TechNet](https://technet.microsoft.com/ja-jp/library/ee617237.aspx)
* [New-ADUser - TechNet](https://technet.microsoft.com/ja-jp/library/ee617253.aspx)
* [New-ADGroup - TechNet](https://technet.microsoft.com/ja-jp/library/ee617258.aspx)
* [Add-ADGroupMember - TechNet](https://technet.microsoft.com/ja-jp/library/ee617210.aspx)
クソアプリアドベントカレンダー2016 20日目やりました

# 今年もクソアプリつくったよ
自身が立ち上げている[クソアプリアドベントカレンダー2016](http://qiita.com/advent-calendar/2016/kusoapp)の20日目のアプリを作りました。
レポートが1日遅くなってしまいましたが、制作記録を書きたいと思います。

## 何を作ったのか
http://hokanona.com

文章内の名詞・動詞を類語に置き換えするウェブアプリです。
流行りモノから何をやるか連想して、取ってつけたような名前にしたら一体何なのかが大変にわかりづらいけどクソアプリだから気にしない。
あと、元ネタは観たことがありません。パクってるのにリスペクトがなく本当すみません。

## どういう動きをするのか
文章をこんな感じで変換します

**君の前前前世から僕は君を探し始めたよ**
↓
**殿様の前前上世から下郎は国主を探し序盤たよ**

こんなテンションで探されても見つからなさそう。そりゃ不器用な笑い方にもなるわ。

## このクソアプリの処理の流れ
1. 変換元の文章を受けとる
2. 受けとった文章をmecabで形態素解析
3. 単語単位で分割し、名詞・動詞を対象に類語を検索
    4. 類語を辞書に問い合わせ。データがなければweblio類語辞典からスクレイピングして取得
        5. 類語が見つかればキャッシュしておく
        6. 類語が見つからなければ類語無し名詞・動詞として単語自身を類語としてキャッシュしておく
7. 単語に対応する類語と置き換え。単語に対して複数の類語候補がある場合はランダム選択

ほか、他所様へのスクレイピングという手段を使ってしまっているので、リクエスト速度を調整したり、受け付ける文章の文字数自体を50文字までに制限したりしています。

<img width="594" alt="スクリーンショット 2016-12-20 14.16.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/7193/5a97639e-301a-7f64-b978-c0f71b38521e.png">

こういう仕組みなので単に1個の単語だけ入力すると類語検索ツールとして使えます。

## つくるとき参考にした記事まとめ　Qiitaが神すぎる
今回のアプリ、ほとんどがQiitaのナレッジから出来上がってます。参考にした記事をまとめておきたいと思います。
全部神記事でした、参考にさせていただいた記事の作成者様ありがとうございました。八百万の神ってこういうことですね。

### MeCabのインストール
mecab をcentosにyumでインストール
http://qiita.com/abgata20000/items/c6c15839c25472273f3e

### nodeで楽にスクレイピングを実装する
Node.jsのスクレイピングモジュール「cheerio-httpcli」が第3形態に進化したようです
http://qiita.com/ktty1220/items/72109a6419e23a26002c

関連： Node.js用のスクレイピングモジュール「cheerio-httpcli」の紹介
http://qiita.com/ktty1220/items/e9e42247ede476d04ce2

### MongoDBのインストールと使い方
Node.js+Express+MongoDBでREST APIをつくる
http://qiita.com/itagakishintaro/items/a1519998a91061cbfb1e

### JSでのパラレルな処理の方法
[JavaScript] 非同期処理のコールバック地獄から抜け出す方法
http://qiita.com/LightSpeedC/items/7980a6e790d6cb2d6dad

### お名前.comで取ったドメインを設定する方法
お名前.com で取ったドメインを使う
http://qiita.com/megane42/items/df84f87c0bdcdd015eb6

# 総括
Qiitaを調べながら作ればクソアプリが半日足らずで作れました。Qiita最高。
正しい知識としてのSOAP

##SOAPってぶっちゃけなんなの？
よく説明されている言い方だと、Webサービスの一種で、RESTなどと比較されています。
しかしながら、実際に使用してみると、そのカテゴリ分けは非常に乱暴で大雑把だと感じます。

ざっくり使い方を見て説明してみましょう。

**SOAPの使い方一例(クライアント側)**

- プロジェクトに SOAPサーバーの[WSDL](https://www.w3schools.com/xml/xml_wsdl.asp)というサービス定義用のXMLを返すURIを登録します。(WSDLはUPnPなどネットワークデバイスにも使用されています)
- IDE(EclipseやVisualStudio)はWSDLからAPIを読み取り、裏でそのサービスをクラスオブジェクトとして定義してくれます。
- ユーザーは普通のクラスライブラリと同じように利用できます。

```Java
//Webサービスを初期化
SOAPSample objSoap = new SOAPSample();

//APIを使う
objSoap.setHoge( 100, "あひゃ" ); //登録系

String name = objSoap.getHoge( 100 ); //読み込み系
```

**SOAPサービスの建て方の一例(サーバ側)**
これはJavaのSOAPサーバーの代表的なソフトウェア「AXIS2」のイメージで書いています。

- プロジェクトにSOAPライブラリを追加します。
- SOAPライブラリをオーバーライドしたクラスを作り、その中に普通に関数を書きます。<br>(その関数が自動でAPIメソッドになる)
- コンパイルしたバイナリファイルをSOAPサーバのモジュールフォルダに放り込みます。
- SOAPサーバーを起動します。
- おしまい。

##じゃあRESTってなんなのさ？
最近はRESTとか言わなくなってきましたが、RESTはプロトコルや手続きを自前で書いてHTTP通信のPOSTなどを利用してデータのやり取りを行うものです。

**よくある、POSTメソッドを使ってJSONを受け取ったりする、アイツです。**

昔CGIでjavascript型のハッシュ定義をテキストで返してevalで受け取る 的なものを書いてた方は、え？！と思うかもしれません。
あなたは知らないうちにRESTを使っていたのです。(私も知らないでそういうことしてた)

**なんか比較される筋合いなくね？！！**

私はRESTの説明文を読んだ瞬間にそう叫びました。あんな便利なSOAPを作った人たちに申し訳ない。そんな気持ちになる。

##設計思想の違い
SOAPとRESTの一番の違いは、最初の設計思想が SOAP=同期通信バンザイ、REST=非同期バンザイであったところかもしれません。

```Java:C#でSOAP関数を同期呼出
SoapApp objSoap = new SoapApp();
String result = objSoap.getTopSalesShopList(DateTime.Now.toString("yyyy-MM-dd"));
this.setServMsg(result);
```

非常にシンプル。
しかし、非同期でやろうとすると、Ajaxのような無名コールバック関数を使うことができないのでこんなふうになる。

```Java:C#でSOAP関数を非同期で呼ぶ例
SoapApp objSoap = new SoapApp();
///コールバック関数定義
objSoap.getTopSalesShopListCompleted += ((getTopSalesShopListCompletedEventHandler)
delegate(object sender, getTopSalesShopListCompletedEventArgs e)
{
    this.setServMsg(e.Result);
});
///非同期呼出
objSoap.getTopSalesShopListAsync(DateTime.Now.toString("yyyy-MM-dd"));
```

IDEがいろいろお世話して各API関数毎に非同期用のクラスを作ってくれたらしい。

解説すると、
コールバック関数の定義名が「＜関数名＞CompletedEventHandler」となっていて
それをデリゲート関数にして、イベントハンドラの「＜関数名＞Completed」に突っ込む
これで準備完了。
あとは非同期専用にカプセル化された「＜関数名＞Async」を呼び出す。
すると、完了時にデリゲート関数が呼び出される仕組み。

これは地味に面倒で、可読性も非常に悪い。本来お手軽なはずのSOAPの取り回しを不便にさせてしまっている。

なのでIDEには悪いけど、私は可読性のためにこっちを使っている

```Java:System.Threading.Threadを使ってシンプルに書く方法
Thread thread = new Thread(
    delegate()
    {
		SoapApp objSoap = new SoapApp();
		String result = objSoap.getTopSalesShopList(DateTime.Now.toString("yyyy-MM-dd"));
		this.setServMsg(result);
    }
);
thread.Start();
```

##SOAPがあまり使われなくなった原因
あくまで憶測です。

- SOAPの内部プロトコルが、XMLで通信するのでデータ量が多い。(プリンタやルータが使ってるUPnPだってXMLじゃん！)
- オブジェクトが使われるたびにソケットが大量に作成されるのでサーバー負荷がかかる？(らしい)
- 当初XMLによる容易な手続きを実装していなかった、Javascriptと相性が悪かった。
- SOAPは利用するのにライブラリが必要なこともあって、「なんか難しそう」というイメージがあった。
- Googleが使わなかった。(代わりに独自のサービスをGoogle API として公開していたが、それがいわゆるRESTだった)
- Webサービス ≒ Web API ≒ REST という認識が定着していった。
 
こんな感じだと思っています。

##まとめ
サーバー内のモジュールに関数を定義するだけでクラスライブラリのように利用できるSOAPは、通信量をそこまで気にすることのない、業務向けのGUIアプリなどの開発に適していると思います。

SOAPは確かにプロトコルレベルで考えると、冗長なXMLを採用していることから敬遠されがちですが、ケースによっては非常に強力な助っ人になるものです。

「もはや古い技術だ」「一般的じゃない」と頭ごなしに切り捨てず、よくよくSOAPの利便性を理解して見直して欲しいと思うのです。
Multiversion Concurrency Control(MVCC) その1

次のような実行スケジュールを考える。T1がxを読んだらコミット前にT2がやってきてxの値を書き換えてしまった。

![read_invalid.png](https://qiita-image-store.s3.amazonaws.com/0/1716/ab6af9b1-d6cb-d671-1c35-7c80f07a83e3.png)

このトランザクションの挙動は

- **S2PL**であればT1がxを読んだ時点でロックされるのでT2はロックが取れず停止する
- **OCC**であれば、T1がコミットしようとしてValidateする段階でAbortする

というように、通常であれば走りえない。しかし、このT1の実行はT2がコミットした後であってもコミットできてもT1→T2の順に動作が完了したという形に**Serialize**できるので、本当はAbortする必要がない。つまりこの実行は**Serializable**だが**CSR**の外にある実行スケジュールという事になる。

1983年のTODSのPhilip A. Bernsteinらによる[Multiversion concurrency control-theory and algorithms](http://dl.acm.org/citation.cfm?id=319998)では、この手の問題を解決するためのアルゴリズムであるMultiversion concurrency control(以後MVCC)が紹介されている。

## マルチバージョンスケジュールの意義

例えば以下のようなスケジュールはCSRを満たさない。

![mv_no_csr.png](https://qiita-image-store.s3.amazonaws.com/0/1716/ff1ccde9-faa2-a961-ea79-c6d4ce0334d1.png)


Tx2はTx1のWrite結果に基づいてyを更新したにも関わらず、Tx1はTx2のWrite結果を読んでしまっているのでSerializeできる順序が存在しない。
しかし、同一の内容を実行するトランザクション列であっても、**Tx1の最後の`Read(y)`がマルチバージョンの力で代わりに`y0`を読めるなら**

![mv_ok_csr.png](https://qiita-image-store.s3.amazonaws.com/0/1716/169653d9-ad6a-a829-66d1-e6ba80d8d303.png)

このようにスッキリとしたCSRとして整理できる。これと同じような効果を、複数のバージョンの値を保持することで実現しようというのがMVCCの基本的なアイデアである。
最終的に達成されるスケジュールは**Serializable**でありながらただの**CSR**より広いモノになる。それによってより多くの**Serializable**な実行スケジュールが許容されるのでアボートの割合が減ってシステムがより高い実効スループットを実現できるようになる。

明日はそれをどのように実現していくかを解説する。
【Ruby】Hashで遊んでみた

#はじめに
Rubyのhashで遊んでいたら思っていたより高機能だったのでメモ
そんな面白いものじゃありません
hashを使ったことない人向けです

#ソース
```ruby:hashtest.rb
myhash = Hash.new(0)

gets.split(" ").map{|d| myhash[d.to_i]+=1}

p myhash
p myhash.to_a
p myhash.size
puts "== max/min key (pair)"
p myhash.max
p myhash.min
puts "== max/min values =="
p myhash.values
p myhash.values.max
p myhash.values.min

puts "== each values=="
p myhash.each{|key,hash| puts"#{key}:#{hash} times"}

puts "== imidiate increment =="
p myhash[100] += 5

puts "== recursive access =="
p myhash[myhash[myhash[100]]]

puts "== set =="
p myhash.update({4=>5})

puts "== key searched from values =="
p myhash.key(1)

puts "== sum of the values=="
p myhash.values.inject(:+)

#ダメな例
puts " ##== this is NOT sum ==## "
p myhash.inject(:+)

```
teratailの可哀想な質問にBluemixで想定回答してみる試み1

この記事はteratail:miyamiyaの [IBM Blumix Adventカレンダー](https://teratail.com/Bluemix#2016-12-01)の１７日目の記事です。

bluemixを使って、teratailの質問に最適な回答が提案できるかやってみたいと思います。
サーバとか用意してられないし、ローカル環境も用意してられないので、
全部 bluemix だけでやってみたいと思います。

作りながらnode-redでサービスをプチプチ繋ぎながら書いているので、
作りたいものがブレブレですが、参考程度にどうぞ。

(本当は)想定は以下です。

1. 答えられるか判断する(クラス分類系API)
2. 質問を理解する(Research)
3. 情報の検索(Retrive)
4. 最適な質問を回答する(Ranker)

が、試み１回目は、bluemixで何ができるかなので、かなーり湾曲省略して、以下で試したいと思います。
(watsonの本領が発揮できてないが気にしない)

1. teratailAPIから質問を取ってくる
2. 英語に変換
3. stackOverflowにAPIで質問をぶん投げる
4. それっぽい結果を日本語に翻訳
5. 結果を表示する。

#構成
- node-red
 - 環境構築がいらないすごいやつ。
 - YahooPipesに似ているけど、それ以上のサービス連携を持っている。
- bluemixの各サービス
 - Watsonが強力

#基本的な使い方を知る
1. bluemixのアカウントを作る。
2. ボイラーテンプレートからred-nodeを押す
3. カタログから面白そうなサービスを探してくる
4. 作成を押した後に、接続でred-nodeを選択すると、node-redで使えるようになってる
5. node-redでノードをポチポチ繋げていく
6. 右上のデプロイを押すと更新される
7. ノードの一番左端を押すと実行される。(これに気づくのに時間がかかった)

#node-redのfunctionの使い方を知る
基本的にmsg.payloadが入ったmsgで受け取って、returnでmsgを返せばノードがつながりました。
teratailのAPIで質問を取る場合は以下にこうする。

```
var id =  msg.payload.questions[0].id;
msg.url = "https://teratail.com/api/v1/questions/" + id;
return msg;
```

繋げ方は、teratailの動画が参考になった。
https://www.youtube.com/watch?v=Kwec1HVxqGY

ここまで出来た結果をみてみる。

![スクリーンショット 2016-12-21 2.48.37.png](https://qiita-image-store.s3.amazonaws.com/0/104300/459c2457-7b7c-9834-b151-758daa9acce1.png)
![スクリーンショット 2016-12-21 2.48.49.png](https://qiita-image-store.s3.amazonaws.com/0/104300/a486562c-b59f-585c-303a-2c0e48644af0.png)

teratailから取ってきた質問が取得できて、タイトルが英語に翻訳されていますね。
あとは、stackoverflowがAPIを提供しているので投げれば回答が幾つか見つかりそうです。

stackoverflowのAPI
https://api.stackexchange.com/2.2/search/advanced?order=desc&sort=activity&q=convert%20json%20to%20csv&tagged=ruby&site=stackoverflow


ここまで作ったところで、疑問が出てきました。
質問している人はどれくらい困っているんだろうか？
いまにも泣きそうな人がいるのではないか？

回答そっちのけで興味が出てきたので、作戦変更です。
カタログにwatson-tone-analyzer-v3というズバリ感情がわかるAPIが用意されていました。

タイトルだけだと悲しみに暮れているのかわからないので、質問内容をとってきて、感情APIに繋いでみます。

![スクリーンショット 2016-12-21 3.24.14.png](https://qiita-image-store.s3.amazonaws.com/0/104300/0af236af-9488-a32b-c1c6-63f97606e907.png)
![スクリーンショット 2016-12-21 3.25.22.png](https://qiita-image-store.s3.amazonaws.com/0/104300/69830079-70b6-eb99-c510-7b3f42a0ffec.png)

返ってきたmsg.responseの中に、Sadness(悲しみ)とそのscoreが含まれていますね。
この値でソートして、優先的に回答すれば効率良く助けることが出来るはずです。

お粗末さまでした。

#これからの参考


##R&Rを使う

ノードに対応しているみたいだけれども、初期設定のやり方がわからず調べ中です。

カタログ
https://console.ng.bluemix.net/catalog/services/retrieve-and-rank/?taxonomyNavigation=services

参考RRのチュートリアル
皆ここを参照しているらしい
http://www.ibm.com/watson/developercloud/doc/retrieve-rank/tutorial.shtml

・コンフィグ サンプル
http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/doc/retrieve-rank/resources/cranfield_solr_config.zip

http://qiita.com/VegaSato/items/6d2d03d6a8b42adcf87e

#参考

タグの質問を取得するAPI
https://teratail.com/api/v1/tags/ruby/questions

teratailのリミット制限をノードを前に付けて回避する方法

```
msg.headers = { "Authorization": "Bearer aXXXXXXXXXXXXXXXXXXXXXXXX"};
return msg;
```

qiitaから引っ張ってくるのも面白そう
http://qiita.com/api/v2/items?page=1&per_page=20&query=ruby+sort
phpで継承している場合に親クラスに属するか調べる

## きっかけ

子クラス、孫クラス、ひ孫クラスと継承していったときに親クラスに属するかを判別したかった。
明示的にその旨が記載しているドキュメントがすぐに見つからなかったのでメモ

is_a()は対象のクラスと同じクラスでもOK、is_subclass_of()はその名の通りNGです
あと、is_a() と is_subclass_of() で第一引数の文字列許容がデフォルトで違うのがちょっと厄介です

PHP: is_a - Manual
http://php.net/manual/ja/function.is-a.php

PHP: is_subclass_of - Manual
http://php.net/manual/ja/function.is-subclass-of.php

### ソースと結果


```php
<?php
class A {

}

class B extends A {

}

class C extends B {

}

$a = new A;
$b = new B;
$c = new C;

var_dump(is_a($a, 'A'));   // true
var_dump(is_a($b, 'A'));   // true
var_dump(is_a($c, 'A'));   // true
var_dump(is_a($c, 'B'));   // true

var_dump(is_a('B', 'A'));  // false
var_dump(is_a('A', 'A'));  // false
var_dump(is_a('C', 'A'));  // false


var_dump(is_subclass_of($a, 'A'));  // false
var_dump(is_subclass_of($b, 'A'));  // true
var_dump(is_subclass_of($c, 'A'));  // true
var_dump(is_subclass_of($c, 'B'));  // true

var_dump(is_subclass_of('A', 'A')); // false
var_dump(is_subclass_of('B', 'A')); // true
var_dump(is_subclass_of('C', 'A')); // true
?>
```
AutoLayout超基礎編

#はじめに
21日目は、スマートテック・ベンチャーズの奥寺(@okuderap )が担当いたします。

今回は、AutoLayoutについてです。
私自身AutoLayoutにはいつも頭を悩まされているので
基礎からまとめてみたいと思います。

#そもそもAutoLayoutとは
iPhone SEにiPhone 7, iPhone 7 Plusといった
異なる画面サイズに対して自動的にレイアウトを調整してくれるヤツ。
画面回転によって縦横に比率が変わった場合にも対応してくれるヤツ。
なかなか扱いに困るヤツ。

#Constraint(制約)について
AutoLayoutは、各要素に制約を設定してレイアウトを決めていきます。
制約の種類として、今回は以下の2種類について書きます。
・Pin: 要素の大きさや位置を**固定**する
・Align: 要素を画面の中央に**揃え**たり、複数の要素を等しい高さに**揃え**たりする

※Pin, AlignだけでなくStackも重要ですが
　今回は超基礎編ということでカットします(>人<)

#Pin
要素の大きさや位置を固定します。
![pin.png](https://qiita-image-store.s3.amazonaws.com/0/103695/f33347ac-e601-937e-6b3b-147f538f0768.png)



Spacing to nearest neighbor (A-1 ~ A-4)
中心にある□マークの周りの赤色の点線を選択して
実線にするとそのPinが有効になる。

A-1: top
要素の上端を固定

A-2: leading
要素の左端を固定

A-3: bottom
要素の下端を固定

A-4: trailing
要素の右端を固定

###▼で制約の基準を選択
topの▼マークを選択すると、以下のように表示されどこを基準にピン留めするか選択できる。

![スクリーンショット 2016-12-21 2.44.48.png](https://qiita-image-store.s3.amazonaws.com/0/103695/6b3cd4ee-4d98-f92d-9587-d29257e00c0f.png)

例えば、
ステータスバーのスペースを空ける場合は
「Top Layout Guide」を選択し、ステータスバーの下を基準とする。

ステータスバーのスペースを空けたく無い場合は
Viewを選択し、Viewの上端を基準とする。

A-5: Constrain to margins
画面左右のマージン(デフォルトはチェックが付いていてマージン有)

B-1: Width
要素の幅を固定

B-2: Height
要素の高さを固定

C-1: Equal Widths(複数要素選択時のみ)
複数の要素の幅を等しくする

C-2: Equal Heights(複数要素選択時のみ)
複数の要素の高さを等しくする

C-3: Aspect Ratio
要素の縦横比を固定

C-4: Align(複数要素選択時のみ)
複数の要素を揃える

#Align
要素を画面の中央に揃えたり、複数の要素を等しい高さに揃えたりします。
![align.png](https://qiita-image-store.s3.amazonaws.com/0/103695/28c67aeb-ba32-53be-1404-064a5e442895.png)

A-1: Leading Edges
複数の要素の左端を揃える

A-2: Trailing Edges
複数の要素の右端を揃える

A-3: Top Edges
複数の要素の上端を揃える

A-4: Bottom Edges
複数の要素の下端を揃える

B-1: Horizontal Centers
複数の要素の水平方向の中心を揃える

B-2: Vertical Centers
複数の要素の垂直方向の中心を揃える

B-3: Baselines
複数のLabelなどのテキストの下を揃える

C-1: Horizontally in Container
画面の水平方向の中心に揃える

C-2: Vertically in Container
画面の垂直方向の中心に揃える

#最後に
今回は、AutoLayout超基礎編ということでPinとAlignについて
それぞれどんな制約を設定できるのかまとめてみました。


スマートテック・ベンチャーズでは、未経験だけどiOSの開発をやりたい！という人を募集しています。
Advent Calendarのスマートテック・ベンチャーズページに会社およびWantedlyのURLをのせていますので、興味のある方は是非ご覧ください。
http://qiita.com/advent-calendar/2016/stv

明日は@KentaKudoさんです。
お楽しみに！
OpalでElectronのアプリをつくる(その5)

この記事は[Opal Advent Calendar 2016](http://qiita.com/advent-calendar/2016/opal)の20日目の投稿として書いています。

あいかわらず間に合っていませんが気にしないでいきたいと思います。

今日はhtmlファイルをhamlから変換して生成するようにします。
前回の記事で気がついたのですが、タイトルの「OpalでElectronのアプリをつくる」というのがすでに「OpalでElectronのアプリをつくるためのgemをつくる」に内容が変ってしまっています。
まあ、気にせずにつづけていきたいと思います。

今回の修正のコードは[v0.0.2](https://github.com/youchan/electron_opal/releases/tag/v0.0.2)としてタグづけしてあります。

    $ git show 8f2c1ab

してみます。
ダイジェストで変更点を紹介しましょう。

*lib/electron_opal/default.haml*というファイルが追加されています。既存の処理と同じようにhamlファイルがなければデフォルトのhtmlファイルを生成するようにします。

hamlからhtmlへ変換するために`Haml::Engine`を生成します。

```ruby
def haml(pathname)
  haml = pathname.parent + "#{pathname.basename('.rb')}.haml"
  haml = Pathname.new(File.expand_path('../default.haml', __FILE__)) unless haml.exist?
  Haml::Engine.new(haml.read)
end
```

`javascript_include_tag`メソッドはそのまま使いたいので、`Haml#render`に渡すコンテキストとして、`Index`のインスタンスを渡すようにします。

```ruby
html = haml(pathname).render(Index.new(asset_name, server.sprockets, true, "http://localhost:8080/"))
write_to("#{asset_name}.html", html)
```

これでhamlファイルからhtmlファイルを生成するようにできました。

*app/main_window.haml*ファイルを置くとhtmlファイルに変換されてそちらが使われるようになります。

```haml
!!!
%html
  %head
    %title Hello world
  %body
    %h1 Hello world
    = javascript_include_tag
```

デフォルトのhtmlファイルと違って'Hello world'という文字が表示されます。

![スクリーンショット 2016-12-21 3.03.09.png](https://qiita-image-store.s3.amazonaws.com/0/15093/58b6200e-1a23-e91b-d0c2-7602510bccb5.png)

さて、hamlファイルを書けば自由に表示されるhtmlを変更することが出来るようになりました。
debugタスクはDebugServerを使って`.rb`ファイルを書きかえたときにリロードすればすぐに画面に反映されるようになっています。
せっかくなので、hamlファイルの変更についても追従できるように変更したいと思います。

    $ git show d1f2ef7

すれば変更点を確認することができます。

*Gemfile*を見れば分るとおり、[fssm](https://github.com/ttilley/fssm)というgemを使っています。fssmはファイルシステムをモニタリングするgemです。

つかいかたはこんな感じです。

```ruby
def haml(pathname, &block)
  haml = pathname.parent + "#{pathname.basename('.rb')}.haml"

  if haml.exist? && block
    EM.defer do
      FSSM.monitor(haml.parent, haml.basename) do
        update { block.call(Haml::Engine.new(haml.read)) }
      end
    end
  end

  haml = Pathname.new(File.expand_path('../default.haml', __FILE__)) unless haml.exist?
  engine = Haml::Engine.new(haml.read)
  block.call(engine) if block
  engine
end
```

`haml`メソッドを変更して、`block`が渡されたときにはファイルをモニタリングするようにしました。
ファイルに更新があった場合は`block`を呼び出します。

これで、hamlファイルを変更したときにもリロードするだけで変更が反映されるようになりました。

今回はOpalというより、Hamlに変換する話とかfssmでファイルをモニタリングする話になってしまいました。
次回はElectronの最終回として、ElectronのAPIを使えるようにWrapperを書くことにします。
【Fuse】staticなUXマークアップ

staticって便利ですよね。一度その便利さを知ってしまったら手放せない、static。名前の響きもいい、static。ユーティリティ的なクラスを作って、staticな関数をいれたりとか、誰もが通る道なのではないかと思います。乱用は良くないけど！

さて、Fuseでもstaticな変数を設定することができます。それが[ux:Global](https://www.fusetools.com/docs/ux-markup/globals)です。

###ux:Global

`ux:Global`はひとつの属性で、この属性がつけられた要素は、staticでglobalなリソースになります。早速使い方を見てみましょう。

```sample.ux
<type ux:Global="resource_key" [ux:Value="value"] ... />
```

`type`はUXマークアップで使用可能な任意の要素で、`resource_key`の部分に参照する際に使用するkeyを指定します。

`type`にfloat4やintのような値をもつ型を指定した場合は、`ux:Value`を同じ要素につけることが必須となります。

###サンプル

サンプルというか、なんというか、Fuseが元々定義しているリソースもあります。例えば`red`や`blue`などがそうです。下記のように指定すれば、カラーコードを取得することができますね。

```sample.ux
<Panel Color="Blue" />
```

自分でグローバルを定義するときは、下記のように指定します。

```sample.ux
<float4 ux:Global="MyProject.WarmBlue" ux:Value="#18f" />
```

これを参照するときは、

```sample.ux
<Rectangle>
    <Stroke Width="3" Color="MyProject.WarmBlue" />
</Rectangle>
```

このようにすれば、上で定義した、`ux:Value`の値、つまり`#18f`を指定することができるというわけですね。

ここで注意したいのが、名前の付け方です。名前の重複などを避けるため、プロジェクトの名前などを使って、適切にグルーピングするようにしてください。また、`ux:Global`で指定した値はコンパイル時に解決され、動的に変更することはできませんので注意してください。

中身うっすいですが以上！！