OmniAICreator/Qiita-1.07M huggingface dataset:
エラーダイアログと$A.error関数

Lightningの開発をしていると、予期しないエラーが発生した旨の怪しいダイアログを見ることがあるかと思いますが、自分でも表示することができます。

```:javascript
try {
    undefinedObj.refer();
} catch (e){
    $A.error('error', e);
}
```

![スクリーンショット 2014-12-16 0.41.02.png](https://qiita-image-store.s3.amazonaws.com/0/44645/b2c758fa-9047-fdb7-495d-a7536d6f655f.png)

第二引数は省略することもできます。

見栄えがかなりいまいちなのは、developer consoleを見て適当なクラスのcssを設定してあげれば良いとしても、タイトルも固定のようなので、ユーザーが呼び出すことを想定したメソッドではないかも知れませんね…。

似たようなメソッドで、`$A.warning`および`$A.log`というメソッドもあるようですが、中身を見た限り、現状ではどこにもログ出力されていないように見えます。当面、ブラウザーのコンソールに出力する場合は`console.log`を使う必要がありそうです。


##### 2014/12/16 15時追記
StackExchangeの投稿 [Salesforce1 Lightning Debug “log()” method not working](http://salesforce.stackexchange.com/questions/53831/salesforce1-lightning-debug-log-method-not-working) にあるように、やはりログメソッドは現在動作しないようです。
後で一括置換しやすいようにするには、console.logよりも自前のログ関数を呼び出すようにしておいた方が良いですね。

##### 2014/12/18 0時追記
errorもlogやwarningもドキュメントに載っていますが、記述が正しくないようですね。現在の実装だとerrorでスタックトレースは出ません・・・。下記のようなコードを実行しておくと、logやwarningの呼び出しでエラーオブジェクトやスタックトレースがコンソールに出力されるようになります。

```js
$A.$logInternal$ = function (type, message, error, trace) {
	console.log(type, message, error, trace);
};
```

##### 2014/12/18 1時追記

`$A.message('message')`でもerrorと同じダイアログを出力することができますね。また、`$A.trace()`ではconsole.trace()が実装されている環境なら実行します。これらを使うと、例えば現在空で定義されているassert関数は下記のように定義できますね。

```js
$A.assert = function(condition, msg) {
	if (!condition) { $A.error(msg||"Assertion failed"); $A.trace(); } 
};
```
KDG体験学習用cpp その6


KDG体験学習用cpp
13.12.2014 T.Nonka Written.

質問があればお受けいたします。多分ないと思います。（笑）
九州、博多の専門学校の体験学習用のノートです。
ggggnonaka@gmail.com

前提　Mac、Linuxの場合、gccがインストール済み。
学習用作業ディレクトリに移動済み。
確認コマンドは、pwd
必要であれば、学習用作業ディレクトリをカレントにすること.
Winの場合、ｂcc32がインストール済み。
学習用作業ディレクトリに移動済み。
確認コマンドは、dir
必要であれば、学習用作業ディレクトリをカレントにすること.

元記事
http://minadukisora.webcrow.jp/programming/calendar.html

```c++:Myc.cpp
//Million years calendar
#include <iostream>
using namespace std;
  
// プロトタイプ宣言
int dom(int y, int m);
int doy(int y);
int dow(int y, int m);
void showcal(int y, int m);
  
// メイン関数
int main()
{
    int year, month;
  
    // 年の入力
    cout << "年を入力してください\n";
    cin >> year;
    if(year <= 1582){
        cout << "年の入力が不正です。1583年以降を入力してください\n";
        return 0;
    }
  
    // 月の入力
    cout << "月を入力してください\n";
    cin >> month;
    if(month < 1 || month > 12){
        cout << "月の入力が不正です\n";
        return 0;
    }
  
    // カレンダーの表示
    showcal(year, month);
  
    return 0;
}
  
// dom関数(月の日数を返す)
int dom(int y, int m)
{
    if(m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12)
        return 31;
    else if(m == 4 || m == 6 || m == 9 || m == 11)
        return 30;
    else{
        if(y % 400 == 0) return 29;
        else if(y % 100 == 0) return 28;
        else if(y % 4 == 0) return 29;
        else return 28;
    }
}
  
// doy関数(年の日数を返す)
int doy(int y)
{
    if(y % 400 == 0) return 366;
    else if(y % 100 == 0) return 365;
    else if(y % 4 == 0) return 366;
    else return 365;
}
  
// dow関数(月の最初の曜日を返す)
int dow(int y, int m)
{
    int day = 6; // 基準2000年1月1日 = 6(土曜日)
  
    if(y >= 2000){
        for(int i = 2000; i < y; i++) day += doy(i);
        for(int i = 1; i < m; i++) day += dom(y, i);
        return (day % 7);
    }
    else{
        for(int i = 1999; i >= y; i--) day -= doy(i);
        for(int i = 1; i < m; i++) day += dom(y, i);
        day %= 7;
        return ((day + 7) % 7);
    }
}
  
// showcal関数(カレンダーを表示する)
void showcal(int y, int m)
{
    int youbi = dow(y, m);
  
    cout << "Su Mo Tu We Th Fr Sa\n";
  
    // 最初の曜日までの間隔を空ける
    for(int i = 1; i <= youbi; i++) cout << "   ";
  
    // 日付の表示
    for(int i = 1; i <= dom(y, m); i++){
        cout.width(2); // 整数の出力幅を2とする
        cout << i << ' ';
        if(youbi % 7 == 6) cout << '\n'; // 土曜日で改行
        youbi++;
    }
    cout << '\n';
}
```

コンパイルコマンド
g++ -o Myc Myc.cpp 

実行コマンド
./Myc 

![kobito.1418658652.332298.png](https://qiita-image-store.s3.amazonaws.com/0/33317/cdeaca8d-943f-b22d-3e9e-73f164c98b7e.png "kobito.1418658652.332298.png")

コマンドではこうなのです。
cal > cal.txt
cat cal.txt
![kobito.1418659078.904992.png](https://qiita-image-store.s3.amazonaws.com/0/33317/2778146d-5d02-f0a6-15d0-f7faeae97d71.png "kobito.1418659078.904992.png")

詳しくははman cal
![kobito.1418659253.284173.png](https://qiita-image-store.s3.amazonaws.com/0/33317/4ad619a6-9f84-7635-dd8e-5f4ed9ac64f6.png "kobito.1418659253.284173.png")
iOS8でプッシュ通知のデバイストークンが取れなかったり

iOS8になってからプッシュ通知のデバイストークンが取れないなーおかしいな～なんて思っていたり。
元々iOS7になったとき辺りで仕様が変わって、regiterFor〜〜を呼んだときにユーザーが拒否したら、
didRegisterFor〜〜とかdidFailed〜〜とかがどちらも呼ばれない、みたいな仕様変更があった気がして、
それに関係するのかなぁと思ったら、違った。

しかも、iOS8とかで新しく追加された関数？！と思って使ったものでうまく行ったと思って安心していたら、なんかの勘違いだった。

正しいやり方
http://qiita.com/peromasamune/items/90970e9f9d5c34d21cfd
http://stackoverflow.com/questions/24216632/remote-notification-ios-8


ちなみにぼくがやっていた間違ったやり方は

```objc:
        if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
            [[UIApplication sharedApplication] registerForRemoteNotifications];
        }
        else {
            [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound];
        }
```

単に「registerForRemoteNotificationTypes」の呼び出しを「registerForRemoteNotifications」に変えたらいいと思っていただけ、っていう圧倒的お⑨さんでした。

ちゃんと「registerUserNotificationSettings」呼ぼうって話です。
WPFでChartコントロールを使う

はじめに
=======
環境は
Visual Studio Community 2013 @ Windows8.1
です。

WPFにChartコントロールないの！？
=============================
昨日あたりから「WPF使ったことないから弄ってみるかー」と思ったのですが、どうも
WPFにはChartコントロールが標準で用意されていないのでグラフを描きたい場合は、
ネット上などで公開されているライブラリを別途用意し、それを使用する必要があるようです。

しかし、既にメンテされてなかったり、ドキュメントがあるんだか ないんだか、機能的に十分でなかったり、
などの問題があり、どれ使ったらいいんだか分かりません・・・

てか、Windows FormではChartコントロールあるんだから、それ使えるんじゃないの？？

使えました！
==========
て、ことで備忘録
ほぼほぼ、[ここ](http://support2.dundas.com/Default.aspx?article=1331)のサンプル通りです。
違いはChartコントロールのインスタンス作成をXAMLの方に書いてある点です。

さて
====
ここでは、プロジェクト名を`WpfChartDemo`とします。
プロジェクトを作成したら、以下を参照設定に追加します
1. WindowsFormIntegration
2. System.Windows.Forms
3. System.Windows.Forms.DataVisualization

MainWindow.xamlを以下のように編集します

```XML:MainWindow.xaml
<Window x:Class="WpfChartDemo.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:wfc="clr-namespace:System.Windows.Forms.DataVisualization.Charting;assembly=System.Windows.Forms.DataVisualization"
    Title="WPF Chart Demo" Width="431" Height="317">
    <Grid Name="grid1">
        <WindowsFormsHost>
            <wfc:Chart Name="Chart1"/>
        </WindowsFormsHost>
    </Grid>
</Window>
```

MainWindow.xaml.csを以下のように編集します。
今回はSin波形とCos波形を描写してみます。

```csharp:MainWindow.xaml.cs
namespace WpfChartDemo
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            var windowsFormsHost = (WindowsFormsHost)grid1.Children[0];

            var chart = (Chart)windowsFormsHost.Child;

            // ChartArea追加
            chart.ChartAreas.Add("ChartArea1");

            // Seriesの作成と値の追加
            Series seriesSin = new Series();
            seriesSin.ChartType = SeriesChartType.Line;
            seriesSin.MarkerStyle = MarkerStyle.Circle;

            Series seriesCos = new Series();
            seriesCos.ChartType = SeriesChartType.Line;
            seriesCos.MarkerStyle = MarkerStyle.Circle;

            for (double x = 0; x <= 2 * Math.PI; x = x + 0.1)
            {
                seriesSin.Points.AddXY(x, Math.Sin(x));
                seriesCos.Points.AddXY(x, Math.Cos(x));
            }

            chart.Series.Add(seriesSin);
            chart.Series.Add(seriesCos);
        }
    }
}
```
以上です。

こんなん出ましたけど
==================
![snapshot-14-12-16-004324.png](https://qiita-image-store.s3.amazonaws.com/0/52493/a3f7760b-c44e-6ffa-1bc9-dcdd17feb522.png)
Android Studio 1.Xの起動時に「Java not found」？


Androidの本命IDE、[Android Studio](http://developer.android.com/sdk/index.html)がついにbetaがとれて登場しました。
僕はAndroidでもIntelliJを使い、途中からAndroid Studioへ移行しました。

## Java not foundとか、「あ！？」って感じ

普段からAndroidを実装している環境であれば、去年までなら公式がJDK6だったし、今年の３月頃からJDK7サポートしたくらいなので、普通のAndroidユーザは気にもしていないのでしょうが。

__JDK8__しか入れていない場合に、たぶんこれが出ちゃうんでは？

![スクリーンショット 2014-12-15 23.55.07.png](https://qiita-image-store.s3.amazonaws.com/0/4107/b4b85a51-8425-6b2f-6744-5283f446e8cf.png "スクリーンショット 2014-12-15 23.55.07.png")

適当にググると、こんな対応が出てきませんか？

[本日公開されたAndroid Studio 1.0がMacで「Java not found」になり起動出来ない場合の対処法](http://gadget-shot.com/apps/mac-apps/23614)
[Android Studio was unable to find a valid Jvm (Related to MAC OS)](http://stackoverflow.com/questions/27369269/android-studio-was-unable-to-find-a-valid-jvm-related-to-mac-os)

特に日本語の記事は対処すれば起動はできますが、内容的には非推奨なので止めたほうがいいと思います。。
後者はよく読めば、より良い対処についてのリンクが見つかります。

なにはともあれ、間違った対応をサラッと説明してみます。


## オススメできない対応

* Android Studioのパッケージの内容を表示する

![スクリーンショット 2014-12-15 23.55.57.png](https://qiita-image-store.s3.amazonaws.com/0/4107/13369dd2-a2d9-dbb1-9692-5f3cc0cb1328.png "スクリーンショット 2014-12-15 23.55.57.png")

<br>
* Info.plistをみつけて開く

![スクリーンショット 2014-12-15 23.56.40.png](https://qiita-image-store.s3.amazonaws.com/0/4107/bf930951-48fa-8dec-408e-dd84ab2d7cf3.png "スクリーンショット 2014-12-15 23.56.40.png")

* JVMVersionの「1.6*」->「1.6+」に変更する（「1.8*」でも可）

![スクリーンショット 2014-12-16 00.26.10.png](https://qiita-image-store.s3.amazonaws.com/0/4107/3dacdf59-e165-1273-ccb5-ad0ac9e9ade0.png "スクリーンショット 2014-12-16 00.26.10.png")


### 公式ドキュメントによると、Info.plistを編集すんなボケがって

[Please note: Do not edit Info.plist to pick a different version. That will break not only the application signature, but also future patch updates to your installation.](http://tools.android.com/tech-docs/configuration/osx-jdk)

## オススメしたい対応

それでは、実際にどういう対応すべきかってことですが、[コイツ](http://tools.android.com/tech-docs/configuration/osx-jdk)に書いてあります。

例えば`STUDIO_JDK`を設定するとかでいいかなと思いますし、
JDK6をインストールしても良いし。

```
$ export STUDIO_JDK=/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk
$ open /Applications/Android\ Studio.app
```


__この最初の記事を書いた人は、いい加減、更新してくんないかな__
httpでgitで記号混ざりのidとpassを1行指定してclone

いろいろ残念な理由でhttpでgit cloneなどしなければいけない & privateで、ユーザー名とパスワードを指定する必要がある場合

```
git clone http://<id>:<pass>@git.httpserver.com/private/repository.git
```

とやればいいが、パスワードにスラッシュとか使っちゃった場合など、パースが上手にできないみたいでエラーになる。おそらく記号はダメだろう。

こういう場合にはpercent encodeしてあげればいいらしい。
たとえば私のIDが `p.kato@email.com` 、パスワードが `pass/word` だった場合以下のようでよいようだ。

```
git clone http://p.kato%40email.com:pass%2Fword@git.httpserver.com/private/repository.git
```

これは
```
$ git --version
git version 1.9.1
```
という環境で試した。
D3.js + Backbone.js + Require.jsで変更しやすいグラフを書いてみよう

# 要約
「D3.js + Backbone.js + Require.js」で再利用可能なグラフを作成するための準備をした

# 内容
かなり試行錯誤中ですが、
「D3.jsとBackbone.jsを組み合わせて、Webブラウザ上でよりストレスなくグラフを操作できるようになりたいなあ」
と思っていますので作成したデモを投稿してみます。

デモ(かなり糞なコードです。あとで整理します、あとで。。)
[D3.js + backbone.js + require.js](http://bl.ocks.org/keisuke-osone/raw/05ff9597a90c9b572171/)
githubは[こちら](https://github.com/keisuke-osone/d3_backbone)

「打率」、「本塁打」、「OPS」、「盗塁」をクリックするとそれぞれに対応してx軸、y軸を再描画します(本当はもっとおしゃれなアニメーションをさせたかった)。
※データは[プロ野球Freak](http://baseball-data.com/team/hitter.html)さんのデータを使わせていただいております。

D3.js + backbone.jsは[ここらへん](http://baseball-data.com/team/hitter.html)を参考にしました。

よくあるデータとして、一つのレコードに複数のメトリクスがあり、
相関をみたり、特殊なデータを探したりすることがあるかと思います。
「Excel」を用いるといちいちグラフの指定範囲を変更する必要があり、
なかなか大変です。

そこで、入力データにある項目をすぐに入れ替えて変更できるようにしてみました。
![スクリーンショット 2014-12-16 00.40.09.png](https://qiita-image-store.s3.amazonaws.com/0/17505/035a20be-95c6-3cb4-083d-98fd9542cd4e.png)

# 野球の話
今回はいわゆるセイバーメトリクスの話で
「[OPS](http://ja.wikipedia.org/wiki/OPS_%28%E9%87%8E%E7%90%83%29#OPS)って得点相関高いよね！」
みたいなのがうまく可視化できるといいなと思ったのですが、昨季だとイマイチですね。
得点と盗塁との相関はイマイチだけどOPSのがまだ相関ありそう、みたいな事がわかるかもしれません。
※ OPS = 出塁率 + 長打率 (On-base plus slugging)

![スクリーンショット 2014-12-16 00.40.20.png](https://qiita-image-store.s3.amazonaws.com/0/17505/100e6672-5fc5-93a3-39c3-a54531bd4d26.png)


# 今後
現在はx軸、y軸しか動かせませんがもっとスムーズにアニメーションなどで変化させるようにしたいと思います。
また、[機械学習の過程をD3.jsで可視化する](http://qiita.com/dr_paradi/items/dfd4442bd4122fb955a6)
で書いたようなクラスタリングと合わせても面白そうな気がします。

今後は、非同期通信などと併せて再利用可能かつ、インタラクティブなグラフ(かつメンテナブルだとなおよい)を作成して行こうかと思います。
アウトドアEdison開発のススメ

　そろそろネタ切れの今日この頃．
　お手軽Edison開発環境を構築したので，メモしておきます．

# 用意するもの
+ Edison
+ につなげる電池
+ iPad (Androidでもたぶん可)
+ SSHアプリ (私はzaTelnet使用)
+ Bluetoothキーボード
+ ポケットWifi (私はテザリングAndroid)

# 事前に準備しておくこと
　Edisonが起動時に自動的にポケットWifiに固定IPで接続するようにしておく．
　具体的には，以下のように */etc/network/interfaces* に記述しておく．

> auto wlan0
iface wlan0 inet static
address 192.168.43.170
netmask 255.255.255.0
gateway 192.168.43.1
    # For WPA
    wpa-scan-ssid 1
    wpa-ssid my_pocketwifi
    wpa-psk my_pocketwifi_pw

192.168.43.1がポケットWifiのIPアドレスで，192.168.43.170が，EdisonのIPアドレスになります．これらを **auto wlan0** としておくことで，起動時に自動的にポケットWifiに接続を試行するようになります．

# 外出してから
1. 上記の荷物を持って外に出る
2. ポケットWifiの電源を入れる
3. Edisonに電池を接続する
4. Edisonの電源を入れる
5. iPadのWifi設定でポケットWifiと接続する
6. SSHアプリで，EdisonのIPアドレスを叩く
7. Edisonのターミナルが見えたら満足する

　実際にやると，こんなかんじになります．まぁ，ナシじゃない．
![アウトドアEdison](https://pbs.twimg.com/media/B4zJtBmCMAIsTrQ.jpg "アウトドアEdison")
KDG体験学習用cpp その5


KDG体験学習用cpp
09.08.2010 T.Nonka Written.

質問があればお受けいたします。多分ないと思います。（笑）
九州、博多の専門学校の体験学習用のノートです。
ggggnonaka@gmail.com

前提　Mac、Linuxの場合、gccがインストール済み。
学習用作業ディレクトリに移動済み。
確認コマンドは、pwd
必要であれば、学習用作業ディレクトリをカレントにすること.
Winの場合、ｂcc32がインストール済み。
学習用作業ディレクトリに移動済み。
確認コマンドは、dir
必要であれば、学習用作業ディレクトリをカレントにすること.

```c++:Obp.cpp
//Oblique projection
#include <iostream>
#include <cmath>
using namespace std;

static const double G = 9.80665;
static const double TimeCount = 0.0001;

class Ball{
     private:
          double x, y, vx, vy;
          long count;
     public:
          Ball(double,double);
          void play();
          double getvy();
          double gety();
          double getx();
          long getcount();
};

Ball::Ball(double v, double a){
     double rad = a * M_PI;
     vx = v * cos(rad);
     vy = v * sin(rad);
     x = 0.;
     y = 0.;
     count = 0;
}

void Ball::play(){
     count += 1;
     x+= vx * TimeCount;
     vy = vy - (G * TimeCount);
     y += (vy * TimeCount);
     if(count % 1000 == 0){
          cout << "(" << x << "," << y << ")" << "　" << TimeCount * count << "s" <<endl;
     }
}

double Ball::getvy(){
     return vy;
}

double Ball::gety(){
     return y;
}

double Ball::getx(){
     return x;
}

long Ball::getcount(){
     return count;
}

int main(){
     double v, a;
     bool f = true;
     cout << "初速vを入力してください。v m/s" << endl;
     cout << "v = ";
     cin >> v;
     cout << "角度aを入力してください。aπ rad (0 < a < 0.5)" << endl;
     while(f){
          cout << "a = ";
          cin >> a;
          if(0 < a && a < 0.5){
               f = false;
          }else{
               cout << "0 < a < 0.5 で入力してください。" << endl;
          }
     }
     Ball ball(v,a);
     while(1){
          ball.play();
          if(ball.getvy() <= 0)
               break;
     }
     cout << "ボールは" << TimeCount * ball.getcount() << "秒後" << ball.getx() * 2 << "m地点で落ちました。" << endl;
}
```
![kobito.1418657680.927789.png](https://qiita-image-store.s3.amazonaws.com/0/33317/40a8a9f5-8c58-dc54-a95f-fd986c65522d.png "kobito.1418657680.927789.png")

![kobito.1418657750.027349.png](https://qiita-image-store.s3.amazonaws.com/0/33317/cefa5bbc-0fb5-1775-dff7-209b0c783992.png "kobito.1418657750.027349.png")
<aura:text />タグの使いどころがわからない

デベロッパーガイドの第4章冒頭に`<aura:text />`タグがひっそり説明されています。

```
<aura:text value="{!" />
```

`aura:textコンポーネントは{!を式の先頭と解釈しないため、プレーンテキストではこの構文が{!と表示されます。`

とは言っても、`{!`と出力したいだけならタグを使わずに単に{!と書いてもそのまま出力されるのですよね。

とは言え、`{!var}`のように書くと、変数の参照として解釈されてしまうので、それを避けるためなのかな、と思い、`<aura:text value="{!var}" />`と書くと、`null`と出力されました。予想と違う…。

式と解釈させないためには、`<aura:text value="{!" />var}`なら、`{!var}`と表示させることができます。ただ、`{!<!-- -->var}`のように書いても`{!var}`とコメントが入らない形で出力されるので、これで充分のような気がします。結論として、`aura:text`の使いどころは今の所よくわかりません…。

###まとめ

| 記述 | 出力 |
|:-----------|:------------|
{! | {!
{!undefinedvar} | (なし)
{!<!-- -->undefinedvar} | {!undefinedvar}
{<!-- -->!undefinedvar} | {!undefinedvar}
`<aura:text value="{!" />` | {!
`<aura:text value="{!undefinedvar}" />` | null
`<aura:text value="{!" />`undefinedvar} | {!undefinedvar}
シェルでいたずらするための小技

## 導入―いかに被害なくうざいいたずらをするか

PCをログアウトせずに席を立ってしまった人に対していたずらをするというのは、誰しも考えたことがあるでしょう。しかし、実際には被害を出さずにいたずらを完遂するのは以外と大変です（被害というのはファイルの増加等も含みます）。一方で、単に`ls`をエイリアスにする程度ではいたずらとしては面白くない。そこで、被害を出さずに如何にうざいいたずらをするか、というのが今回の話題です。

尚、プログラマに対して行ういたずらであるのと個人的な好みから、いたずらはシェルで行います。

## `say`コマンドと無限ループ

Mac限定ですが、`say`というコマンドがあります。これは引数を音読してくれるコマンドですが、これを無限ループと組み合わせるととてもうざいのではないか？と思いつきました。

```shell-session:ver1
while true; do say 'This is a joke.'; done;
```

## バッググラウンドジョブにする

しかし、この単純な方法ではフォアグラウンドでジョブが走ってしまうために見つかりやすく、またシェルで`Ctrl-C`で終了してしまうため、持続性にも欠けます。

そこで、コマンド末尾に`&`を付けることで、バッググラウンドで走らせます。

```shell-session:ver2
while true; do say 'This is a joke.'; done; &
```

## nohup

まだ問題があります。zshを使っている場合、バッググラウンドジョブがある状態でシェルを閉じることができません。これではシェルを閉じていたずらを隠蔽することができませんね。

そこで、`nohup`を使います。

```shell-session:ver3
nohup `while true; do say 'This is a joke.'; done; &`
```

ここでの注意点は、`nohup`の引数はバッククォートであるということです。

## シェルを閉じて完成

これでシェルが閉じられます。別タブでシェルを開いてそこでコマンドを実行後、タブを閉じれば証拠は残らず、後ろではひたすら'This is a joke.'の音声が流れ続けます。これはうざい。

## 対処法

プロセスを`kill`すればいいと思ったのですが、なんと無限ループのたびにPIDが変わるため、そう単純には行きません。ではどうすればいいのか…それはご自分で考えてくださいね。
KDG体験学習用cpp その4


KDG体験学習用cpp
09.08.2006 Ishii Written.

質問があればお受けいたします。多分ないと思います。（笑）
九州、博多の専門学校の体験学習用のノートです。
ggggnonaka@gmail.com

前提　Mac、Linuxの場合、gccがインストール済み。
学習用作業ディレクトリに移動済み。
確認コマンドは、pwd
必要であれば、学習用作業ディレクトリをカレントにすること.
Winの場合、ｂcc32がインストール済み。
学習用作業ディレクトリに移動済み。
確認コマンドは、dir
必要であれば、学習用作業ディレクトリをカレントにすること.

```c++:Fortune.cpp
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;

int main() {
    int money;     // 金運
    int study;     // 勉強運
    int love;      // 恋愛運
    int health;    // 健康運
    int synthesis; // 総合運

    srand((unsigned)time(NULL));

    money     = rand() % 101;
    study     = rand() % 101;
    love      = rand() % 101;
    health    = rand() % 101;
    synthesis = ( money + study + love + health ) / 4;
     
    cout << "今日の運勢" << endl;
    cout << "金運" << money << endl;
    cout << "勉強運"  << study << endl;
    cout << "恋愛運" << love << endl;
    cout << "健康" << health << endl;
    cout << "総合運" << synthesis << endl;

    return 0;
}
```
コンパイルコマンド
g++ -o Fortune Fortune.cpp

実行
./Fortune

![kobito.1418656913.432134.png](https://qiita-image-store.s3.amazonaws.com/0/33317/67fb4020-ea68-efad-22bb-ada83be0a42d.png "kobito.1418656913.432134.png")
MySQL基本コード

Macでの作業コマンドになります。
随時編集しています。（最終更新 2014年12月15日）
# インストール
- ```brew update```
- ```brew install mysql```

# 立ち上げと停止
- ```mysql.server start```
- ```mysql.server stop```

# ログイン
```mysql -u USERNAME -p PASSWORD```

# ユーザー作成
- ``` create user 'USERNAME'@'LOCALHOST' IDENTIFIED BY 'PASSWORD'```  
USERNAMEとLOCALHOST(HOST)とPASSWORD自由に設定してあげる。

# データベース操作
- データベース一覧 ```SHOW DATABASES;```
- 使うデータベースを選択 ```use DATABASENAME```
- 現在使用しているデータベースを確認```select database();```
- データベースの削除

## テーブル操作
- テーブル一覧 ```show tables;```
- テーブル作成 ```create table TABLENAME(カラム名 データ型,カラム名 データ型,カラム名 データ型〜);```
- テーブルのカラム構造を確認 ```desc TABLENAME;```
- テーブルにレコードを挿入 ```insert into TABLENAME values(データ,データ,データ,・・・);```

# 終了
- ```quit```
libgit2のbuffer関連の関数

libgit2の内部では、たまに生のメモリブロックを使います。 `git_buf` 構造体のポインタで関数間でデータを引き渡します。

* `buf->ptr` : データへのポインタ
* `buf->asize` : 割り当てられているメモリ領域の大きさ
* `buf->size` : データの量 (size <= asize)

ファイル名や、データのblobの読み込み、フィルタなどさまざまなところで登場します。ですが、ドキュメントに書かれてない関数も多数。ここでは関数の役割についての一覧しか書きませんので、詳しい関数定義はbuffer.hか、buf_text.hを参照してください。

C言語で文字列操作とかを実装するなら、これらの関数のコードをコピペすれば良さそうな気はします。GPLv2ですが。

パラメータ取得
-------------------

* `git_buf_len` : buf->sizeを返す
* `git_buf_cstr` : buf->ptrを返す

構造体の情報にアクセスします。が、libgit2内部のコードを見ると、直接値を参照してるコードもちらほら。

データの診断
------------------

* `git_buf_text_is_binary`
* `git_buf_text_contains_nul`

バッファがバイナリか、nullを含むか、の診断関数ですが、ドキュメントとは名前が変わってます。ドキュメントは_text_部がない名前で書かれてます。要注意。

* `git_buf_text_detect_bom`

Unicode的なBOMが含まれていればそのバイト数を返します。ドキュメントにない関数。

* `git_buf_cmp`

2つのバッファを比較します。

メモリ領域の拡張
-------------------

* git_buf_grow

必要な領域がasizeよりも大きければ、この関数で大きなブロックを取得しなおします。失敗したら-1が返り、既存の領域も「不正な領域」となります。このあたりを細かくコントロールできる `git_buf_try_grow` 関数もあります。3つめの引数にfalseを入れると、領域は拡大してないものの、既存のデータ領域も維持されます。4つめに引数にtrueを入れると、可能な限り既存のデータをコピーするとのことですが、どう考えてもこの詳細版の関数名、あんまり名は体を表してないですよね。メモリの拡大が失敗したかどうかは、 `git_buf_oom` 関数で後から調べることも可能です。

テキストの編集
-----------------

これらはドキュメントにない関数群です。

* `git_buf_sets` : バッファの先頭にC言語形式の文字列(const char *)を書き込みます。
* `git_buf_putc` : バッファの末尾にC言語形式の文字(char)を書き込みます。
* `git_buf_putcn` : バッファの末尾にC言語形式の文字を(char)を指定個数分書き込みます。
* `git_buf_put` : バッファの末尾にC言語形式の文字列(const char *)を指定バイト数分書き込みます。
* `git_buf_puts` : バッファの末尾にC言語形式の文字列(const char *)を書き込みます。
* `git_buf_printf` : 例のアレ
* `git_buf_vprintf` : 例のアレ
* `git_buf_clear` : バッファをサイズゼロに初期化します。
* `git_buf_consume` : バッファの先頭から、指定されたポインタのところまでを削除します。
* `git_buf_truncate` : バッファを指定サイズに縮めます。
* `git_buf_shorten` : バッファを指定サイズ分縮めます。
* `git_buf_rtruncate_at_char` : 特定の文字が出てくるところまでバッファを縮めます。
* `git_buf_rtrim` : バッファ末尾のスペースを削除します。
* `git_buf_cmp` : バッファの比較をします。
* `git_buf_splice` : JavaScriptでおなじみのアレ

データ変換
---------------

これもドキュメントにない関数です。

* `git_buf_encode_base64` : C言語文字列のデータをbase64にしてバッファに書き出します。
* `git_buf_decode_base64` : C言語文字列のBase64データをデコードしてバッファに書き出します。

パス名の編集
---------------

これもドキュメントにない関数です。

* `git_buf_join_n` : n個の任意個のバッファを結合します。結合時の文字を指定します。末尾に同じ文字が重ならないようにします。
* `git_buf_join` : 2個のバッファを結合します。結合時の文字を指定します。末尾に同じ文字が重ならないようにします。
* `git_buf_join3` : 上の関数の3個バージョン。
Go言語でMongoDB使う ②埋め込みとの相性

# Go言語でMongoDBを使う

前回

- [Go言語でMongoDB使う ①インストール的なところ - Qiita](http://qiita.com/otiai10/items/2c94bb53bf55266130c2)

でチュートリアル的なものを書きました.
今回は、具体的に使ってて気づいたことを書き留めます.

# Goには継承は無いが埋め込みがある

埋め込みについては@tenntennさんがとてもわかりやすい記事を書かれております.
いつもありがとうございます.

- [Go言語における埋め込みによるインタフェースの部分実装パターン - Qiita](http://qiita.com/tenntenn/items/e04441a40aeb9c31dbaf)

で、こんな感じで保存してみます

```go
package main

import (
	"fmt"
	"github.com/globalsign/mgo"
	"github.com/globalsign/mgo/bson"
)

// Personに共通なものはここにまとめたいですよね
type Person struct {
	ID    bson.ObjectId `bson:"_id"`
	Name  string        `bson:"name"`
	Level int           `bson:"level"`
}

func (p *Person) Greet() string {
	return fmt.Sprintf("My name is %s.", p.Name)
}

// 派生したstructもつくりたいですよね
type Admin struct {
	Person
	Password    string   `bson:"password"`
	Permissions []string `bson:"permissions"`
}

func main() {
	session, _ := mgo.Dial("mongodb://localhost/test")
	defer session.Close()
	db := session.DB("test")

	admin := &Admin{
		Person{
			bson.NewObjectId(),
			"otiai10",
			10,
		},
		"hoge",
		[]string{"write", "read"},
	}

	db.C("people").Insert(admin)
}
```

# 埋め込みをそのままInsertすると？

```json
> db.people.find().pretty();
{
	"_id" : ObjectId("548eeef9a82a1de844454bd0"),
	"person" : {
		"_id" : ObjectId("548eeef9b537115caa000001"),
		"name" : "otiai10",
		"level" : 10
	},
	"password" : "hoge",
	"permissions" : [
		"write",
		"read"
	]
}
```

埋め込んだ`Person`が`person`という名前のフィールドとしてドキュメントに保存されているのがわかります.
こともあろうかmongo的な_idが二つ作られちゃってて気持ち悪い状況です.

# これが嫌なとき

bsonには`inline`というタグキーワードがあります.

- [bson - GoDoc](http://godoc.org/labix.org/v2/mgo/bson#Marshal)

> inline　Inline the field, which must be a struct or a map,
> 　　　　causing all of its fields or keys to be processed as if
> 　　　　they were part of the outer struct. For maps, keys must
> 　　　　not conflict with the bson keys of other struct fields.
> 
> フィールドをインライン化します。プリミティブはダメです、structかmapじゃないとダメです。inlineフラグを使うと、そのstructのフィールドは、その外側のstructのフィールドとして処理されます。もしmapを使う場合は、外側のstruct含め、mapのkey名とフィールド名がかぶってはいけません。

とのこと

```diff
 type Admin struct {
-	Person
+	Person      `bson:",inline"`
 	Password    string   `bson:"password"`
 	Permissions []string `bson:"permissions"`
 }
```

そうすっと

```json
> db.people.find().pretty();
{
	"_id" : ObjectId("548ef20ab537115cef000001"),
	"name" : "otiai10",
	"level" : 10,
	"password" : "hoge",
	"permissions" : [
		"write",
		"read"
	]
}
```

埋め込んだ`Person`のフィールドがちゃんとトップレベルのフィールドになってドキュメントに保存されていることがわかります.

# これ結構便利なので

「`encoding/json`にも`inline`タグあったらよくね？」っていうディスカッションがこちらになります.

- https://github.com/golang/go/issues/6213
  - (https://code.google.com/p/go/issues/detail?id=6213)


# 次回があるなら

「RestAPIでリクエストの扱いとmongoの相性」か、もしくは「`database/sql`を使った場合との比較」みたいなものをば.


（Go+MongoDB、わりといいものに見えてきました）
CompoundJSで苦労した話

# はじめに
アドベントカレンダー初参加の@ABCanG1015です。
今回はCompoundJSでWebアプリ作った時に苦労した話を書きます。

# なぜCompoundJSにしたのか
初めてnode.jsを触るとき、多分フレームワークを探すと思います。
そして[MVC frameworks](http://nodeframework.com/index.html#mvc)を見て、SQLiteが使えるという理由と、日本語のドキュメントがあること、そしてフォルダ構造などがほぼRailsと同じからCompoundJSを選びました。
ちなみに、今ではGithubのStar数が表示されているため人気度がわかりますが、当時は表示されてなかったため、どれが人気かすぐには判断できなかったです。

# 苦労した点
## 資料が少なかった
公式のドキュメントとStackOverflowにちらほらあるぐらいで、日本語の資料はほぼ皆無と言っていいほどの量でした。(Qiitaにも全然なくてビックリ)
CompoundJSの元であるrailwayの資料もあまりなく、APIの動作とか自分で試さないとわからないことが多かったです。

## Twitter認証
Twitter認証したいが、サンプルが全く見つかりませんでした。
ほとんどがFacebookで、自分で設定を変えて試してみる以外方法がありませんでした。
その方法は一応[こちら](http://blog.abcang.net/?p=493)で記事にしてます。
しかし、アクセストークンを取得できないため、TwitterのAPIは全く叩けませんでした…
直接ライブラリを書き換えるしかなさそうだったので、一旦諦めることにしました。

## カスタム404ページ
Railsライクなフレームワークだからあるかと思いきや、そんなことはありませんでした。
もしかしたら探し方が悪かったのかもしれませんが、資料も見当たらなかったため、こちらも諦めるしかなかったです。

# まとめ
CompoundJSは簡単なアプリならRailsとおなじ感覚で作ることが出来るため結構良いと思います。
ただ、もっといろんなことをしようと思うと今回みたいに躓くことが多くなると思います。
CompoundJSを使う人のためにももっと情報増えて欲しいところです。

明日は@nyamadoriさんです。
Ruboty | Ruboty Plugin を RubyGems に公開せずに利用する #ruboty

# Ruboty | Ruboty Plugin を RubyGems に公開せずに利用する #ruboty

## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
Ruboty Plugin を RubyGems に公開せずに利用方法について説明します。

## <i class="fa fa-cloud-download" style="font-size:1em;"></i> 一般的な Plugin の利用時
おそらく最もメジャーな方法としては、 RubyGems に公開して Plugin を利用する方法です。
この場合、 RubyGems 公開後, ruboty の Gemfile には

~~~ruby
source "https://rubygems.org"

gem "your_ruboty_Plugin"
~~~

のように記述して利用します。

しかし、

* RubyGems に外部公開するほどでもない
* なんとなく敷居が高く感じるので RubyGems には公開したくない

などの理由によって、 RubyGems に公開せずに Plugin を利用したい場合があると思います。

## <i class="fa fa-github-alt" style="font-size:1em;"></i> GitHub を利用する
GitHub に Ruboty Plugin を公開している場合は、 Gemfile に下記のような設定を行うことによって
Ruboty Plugin を利用することが出来ます。

~~~ruby
source "https://rubygems.org"

gem 'your_ruboty_Plugin', :git => "git://github.com/your_account_name/your_ruboty_Plugin.git"
~~~

## <i class="fa fa-home" style="font-size:1em;"></i> ローカル環境の gem を利用する
GitHub に公開するのもちょっと・・・という場合は、 Gemfile に下記のような設定を行うことによって
ローカル環境の Ruboty Plugin を利用することが出来ます。

~~~ruby
source "https://rubygems.org"

# gem のプロジェクトルートを指定
gem 'your_ruboty_Plugin', :path => '/path/to/your_gem_dir'
~~~

## <i class="fa fa-plus-square" style="font-size:1em;"></i> その他
今回は説明しませんでしたが、その他にも

* Gist を利用する
* Bitbucket を利用する
* GitBreak を利用する
* Private な gem を管理できる <i class="fa fa-github-square" style="font-size:1em;"></i> [geminabox](https://github.com/geminabox/geminabox) サーバーを立てて利用する
* Cloud Package Repository サービスの <i class="fa fa-external-link-square" style="font-size:1em;"></i> [gemfury](https://gemfury.com/) を利用する

などの選択肢もあります。

## 関連
* [RubyKaigi2014の知見。geminabox gem で Private な Gem Server を構築](http://qiita.com/tbpgr/items/53794bfb2a7c0d7247eb)
* [geminabox の基本操作](http://qiita.com/tbpgr/items/a080a300268fe8f40aeb)
* [Gemfury | クラウドパッケージリポジトリ Gemfury の登録、疎通確認まで](http://qiita.com/tbpgr/items/7298faf1242370bde2ce)
* [Gemfury | クラウドパッケージリポジトリ Gemfury に build した gem を公開する方法 ](http://qiita.com/tbpgr/items/00daad487767dde1af62)

## <i class="fa fa-arrow-circle-right" style="font-size:1em;"></i> 参照
* <i class="fa fa-github-square" style="font-size:1em;"></i> [ruboty GitHub](https://github.com/r7kamura/ruboty)
* <i class="fa fa-external-link-square" style="font-size:1em;"></i> [るりま | Logger](http://docs.ruby-lang.org/ja/2.1.0/class/Logger.html)
KDG体験学習用cpp その3


KDG体験学習用cpp
12.16.2014 T.Nonaka Written.

質問があればお受けいたします。多分ないと思います。（笑）
九州、博多の専門学校の体験学習用のノートです。
ggggnonaka@gmail.com

前提　Mac、Linuxの場合、gccがインストール済み。
学習用作業ディレクトリに移動済み。
確認コマンドは、pwd
必要であれば、学習用作業ディレクトリをカレントにすること.
Winの場合、ｂcc32がインストール済み。
学習用作業ディレクトリに移動済み。
確認コマンドは、dir
必要であれば、学習用作業ディレクトリをカレントにすること.

```cpp:Grid.cpp
#include <iostream>
#include <string>

using namespace std;

int main(){
	for (int i = 0;i<10;i++){
		for(int j=0;j<i;j++){
			cout << "□";
		}
		cout << endl;
	}
}

```

Mac,Linux コンパイルコマンド
g++ -o Grid Grid.cpp

実行
./Grid

![kobito.1418656024.810647.png](https://qiita-image-store.s3.amazonaws.com/0/33317/249b4a1b-8810-e121-40fe-2bb391260eba.png "kobito.1418656024.810647.png")
入力チェックエラーの表示について

#入力チェックエラーの表示について

画面で入力チェックを行った際に、エラーメッセージ表示します。
表示にはデフォルトの「ui:inputDefaultError」を使用します。
ui:inputDefaultErrorは画面にタグを入れる必要なく、使用することができます。

```AdventCalendarCmp.cmp
<aura:component controller="TLP.AdventCal">

        <aura:attribute name="child" type="TLP.ChildObj__c"
             default="{ 'sobjectType': 'TLP__ChildObj__c',
                         'Name': '',
                      	 'TLP__Parent__c': 'a0Ci000000LubnS'}"/>

        <ui:inputText aura:id="parentId" label="parentId"
                      value="{!v.child.TLP__Parent__c}" 
                      class="form-control"  
                      placeholder="id"/>

    	<ui:inputText aura:id="childName" label="名前"  
                  value="{!v.child.Name}" 
                  class="form-control" 
                  placeholder="名前を登録してください"/>
        
    	<ui:button label="button" press="{!c.callApex}"/>    
</aura:component>
```

javascriptのコントローラに入力チェック処理を書きます。
入力チェック時にメッセージを追加する項目には、addError関数を使って、エラーメッセージを追加します。
赤く反転させる項目には、setValid関数を使用し、falseを設定します。

**エラーのイメージ**
![Aura 2.jpg](https://qiita-image-store.s3.amazonaws.com/0/6648/240fb4fb-05e4-ad1e-2b8a-8235ce609481.jpeg)

入力チェックでエラーとならないケースでは、ちゃんとsetValid関数を使ってtrueを設定する必要があります。
trueに設定しないと、正しく入力しても赤く反転された項目が赤のままとなります。

```AdventCalendarCmpController.js
        callApex :function(component, event, helper){    
        var nameInput,nameInputValue,parentIdInput;
        nameInput = component.find("childName");
        parentIdInput = component.find("parentId");
        nameInputValue = nameInput.get("v.value");

        if($A.util.isEmpty(nameInputValue)){            
            nameInput.setValid("v.value",false);
            parentIdInput.setValid("v.value",false);
            
            nameInput.addErrors('v.value',[{message:"必ず入力してください"}]);
            parentIdInput.addErrors('v.value',[{message:"こちらも入力は必須です"}]);
            console.log('error!');
        }else{
	        component.setValid("v.child.Name",true);
            parentIdInput.setValid("v.value",true);
	        helper.registerName(component);
        }
```

こんな感じで、ApexのAction呼び出し後のcallbackでもかけるので、チェックした内容を元に、エラーを表示することも可能です。

```
	registerName : function(component) {
        var action = component.get('c.registerChild');
		
        action.setParams({
            'child':component.get("v.child")
        });

        action.setCallback(this,function(a){
            if(a.error && a.error.length){
                var childNameInput = component.find("childName");
                childNameInput.setValid('v.value',false);
                childNameInput.addErrors('v.value',[{message:"callbackでもエラーをかける"}]);
            }
        });

        $A.enqueueAction(action);
	},
```
WatchKitミニマムサンプル


Watch画面にボタンを押すとボタンのタイトルと色が変わるだけのミニマムサンプル

### 準備

+ Xcode6.2以上でiOSアプリのプロジェクトを作成
+ File / New / Target / Apple Watch / WatchKit Appを選択してターゲット作成

### Controllerの編集

+ WatchKit Extension / InterfaceController.m（WKInterfaceControllerの派生クラス）を開く
+ 内容を以下のように書き換える

```objc
@interface InterfaceController()
@property(nonatomic, weak) IBOutlet WKInterfaceButton *okButton;
@end

@implementation InterfaceController

- (IBAction) onOk {
	self.okButton.title = @"Changed!";
	self.okButton.color = [UIColor blueColor];
}

@end
```

### Storyboardの編集

+ WatchKit App / Interface.storyboardを開く
+ Interface Controller Scene 上にButtonをD&Dで配置する
+ ボタンを右クリックしてSent Action / Selectorを引っ張ってInterface ControllerのonOKに紐付ける
+ ボタンを右クリックしてReferencing Outlets / New Referencing Outletを引っ張ってInterface ControllerのokButtonに紐付ける

### 起動

+ シミュレータで実行
+ ボタンを押して変わることを確認！

![iOS Simulator Screen Shot - Apple Watch 2014.12.16 0.00.38.png](https://qiita-image-store.s3.amazonaws.com/0/6527/d42f911a-f13a-1862-9d21-d96b36c729ed.png "iOS Simulator Screen Shot - Apple Watch 2014.12.16 0.00.38.png")

![iOS Simulator Screen Shot - Apple Watch 2014.12.16 0.00.44.png](https://qiita-image-store.s3.amazonaws.com/0/6527/ed2af934-81cf-7504-d957-52b772af2cea.png "iOS Simulator Screen Shot - Apple Watch 2014.12.16 0.00.44.png")
CMake: スクリプトモード

## はじめに

みなさん、こんにちは。今回は CMake に用意されているスクリプトモードなる動作モードについて書いていきます。

## スクリプトモードとは何か？

普段使用している CMake ファイル`CMakeLists.txt`は`cmake .`によって実行し、`Makefile`などのビルドシステムを生成するために使用していました。これに対して`hoge.cmake`といったスクリプトファイルは`cmake`コマンドに`-P`オプションを付与して`cmake -P hoge.cmake`といった形で利用します。このスクリプトファイルは、ビルドシステムの生成に特化したものではなく、シェルスクリプトのように汎用的に使用することができます。

```cmake:hoge.cmake
message(1)
```

```bash
$ cmake -P hoge.cmake # 1
```

また、ファイルの先頭に Shebang を記述し、実行権限を付与することで実行ファイルとして扱うことができます。

```cmake:hoge.cmake
#!/usr/bin/env cmake -P
message(1)
```

```bash
$ chmod +x hoge.cmake
$ ./hoge.cmake # 1
```

## スクリプトモードと通常の動作モードとの差異

このスクリプトモードですが、通常の動作と比較すると以下の違いがあります。

### ビルドシステムを生成するコマンドは使用できない

`add_executable()`や`target_link_libraries()`といったビルドシステムを生成するコマンドは使用できません。また、ほかのディレクトリの`CMakeLists.txt`を読み込む`add_subdirectory()`も使用できません。

```cmake:hoge.cmake
add_executable(hoge hoge.cpp)
```

```bash
$ cmake -P hoge.cmake
CMake Error at hoge.cmake:1 (add_executable):
  Command add_executable() is not scriptable
```

### キャッシュファイルを生成しない

`CMakeCache.txt`といったキャッシュファイルを生成しません。しかし、キャッシュ変数は普段と同様に使用できます。したがって、スクリプトモードにおけるキャッシュ変数はグローバル変数のようなものになります。

### ディレクトリスコープはひとつだけ

`add_subdirectory()`が使用できないので、ディレクトリスコープはスクリプト全体でひとつだけとなります。

## スクリプトモードの用途

このスクリプトモードの用途は様々ですが、ビルドの補助スクリプトとして利用すると便利です。

例えば、開発中にプロジェクトのビルドとテストを行う場合、ソースツリーが`CMakeCache.txt`などで汚染されたくないので、ビルドディレクトリを作って out-of-source ビルドをします。これには以下の手順を踏む必要があります。

```bash
$ mkdir build # なければ作る
$ cd build
$ cmake .. # ビルドシステムを生成してないなら実行
$ make all test ARGS='-V'
```

毎回これを行うのは少々めんどうです。かといって、この一連の作業をシェルスクリプトや Ruby スクリプトなどにすると、依存する環境やツールが増えてしまいます。そこで、以下のような CMake スクリプトを用意し、スクリプトモードで動作させることでこの問題を解決します。

```cmake:test.cmake
cmake_minimum_required(VERSION 3.0.2)

set(build_dir ${CMAKE_CURRENT_LIST_DIR}/build)

if(NOT EXISTS ${build_dir})
  file(MAKE_DIRECTORY ${build_dir})
  execute_process(
    COMMAND ${CMAKE_COMMAND} ..
    WORKING_DIRECTORY ${build_dir}
  )
endif()

execute_process(
  COMMAND make all test "ARGS='${CMAKE_ARGV3}'"
  WORKING_DIRECTORY ${build_dir}
)
```

```bash
$ cmake -P test.cmake -V
```

Shebang を記述し、実行権限を付与すれば、特定の環境でさらに便利に使用できます。

```bash
$ ./test.cmake -V
```

## おわりに

以上、スクリプトモードでした。CMake は意外といろんなことができるので、補助的なスクリプトは CMake スクリプトとして作成することによって、依存するツールを減らせ、ポータビリティにできます。

明日は、mrk_21 さんの『CMake: モジュール』です。
SCRIPTY #02 に行った

![6ff2dca0edfba60964ec868171eabf99.png](https://qiita-image-store.s3.amazonaws.com/0/20674/88acd608-8ca7-f5f8-5bbe-20518eac0fe8.png)

> **SCRIPTY#2　〜フロントエンド紳士・淑女のための勉強会〜**
> [http://scripty.connpass.com/event/10345/](http://scripty.connpass.com/event/10345/)

# セッション

- JSコードの品質 - platoの紹介 by @mwakkiy
- JavaScriptでトゥイーンアニメーション入門 by @wemra
- Flux + React.js入門 by @pirosikick
- Dockerを使ったWordPressテーマ開発、Selenium Serverについて by @moongift
- Meteorフレームワークについて @rukiadia
- ライブコーディングのすゝめ by @shamabe

僕は遅刻して「JSコードの品質 - platoの紹介」はちょっとしか聞けなかった。  
個人的に面白かったものをいくつか紹介します。

わかってない所とか多々ありそうなので、間違っているところは遠慮なくPicaxe投げてもらえると有りがたいです。
あと、一応ですけど、なにか問題があったら教えてください。

## JavaScriptでトゥイーンアニメーション入門

まずはCSS Transition、CSS Animation周りが辛いって話。

Transitionだと状態Aから状態Bへの直線的な変化しか表現できない(できないこともないけど)。  
かといって、`@keyframe`をポチポチ打ってanimation書くのは辛いねって話で、そういう仕事は、できれば機械にやってもらいたいと思っている(やってる人ごめんなさい)。

で、次が`jQuery.animate()`の話で、まあこれも死ぬ。
Javascript触りたての頃にjQueryでモバイル向けのWebサービスのJS書いたことあったけど、とくにモバイルだとパフォーマンスが悪い。

原因は2つあって、

ひとつは「レイアウトスラッシング」と呼ばれる現象が起こることで、DOMに対してリフローを伴うようなスタイルの変更をした時、強制的に同期レイアウトを行うらしい。
結果、スタイルの読み出し(算出)と変更を交互に繰り返した場合、スタイルの読み出しの際には前の「スタイルの変更」を待つので、パフォーマンスが悪いように見える。

もうひとつは、リクエストアニメーションフレームを使用していないということ。
jQueryのアニメーションは`setTimeout()`で表現されていた(`requestAnimationFrame()`が一時期入ったらしいけど、相性が悪い処理があったらしく、すぐ`setTimeout()`に戻ったって経緯があった。今はわからん)。

で、CSS Transition/Animationとか`jQuery.animate()`とかの問題を解決するには、そういうの対応してるライブラリ使えばいいって提案が話のひとつ。

- velocity.js : 多機能
- tween.js : シンプル・軽量
- TweenMax : Flasher向け・有料

まああと、Webkit系ブラウザのみならWeb Animation APIもあるよ、って感じ。

## Flux + React.js入門

ちょうどReact触ってたので、色々熱かった。

Reactの話は@mizchi先生あたりにでも聞いた方がよほど参考になるので、そちらを見てください。

> **なぜ仮想DOMという概念が俺達の魂を震えさせるのか**
> [http://qiita.com/mizchi/items/4d25bc26def1719d52e6](http://qiita.com/mizchi/items/4d25bc26def1719d52e6)

> **あなたがReactを使うべき理由**
> [http://mizchi.hatenablog.com/entry/2014/09/02/201728](http://mizchi.hatenablog.com/entry/2014/09/02/201728)

- VirtualDOM
	- JavascriptでDOMを仮想表現する
	- 差分を計算した上で、DOMに反映 (この辺を勝手にやってくれるのがVirtual DOM)
	- DOMの変更コストは高いので、単純なデータバインディングよりよい
- データフローの見通しがいい
	- 基本的に親子構造の親が子にデータを渡していく(`this.props`経由とか)ので、ぐちゃぐちゃしにくい
	- データを書く場所がHTMLのattributeっぽいので、どこに書いてるのかもルール化されている
- propTypesってオブジェクトの中で`this.props`のバリデーションが書ける
	- これも見ようによってはルール化されてよい
- ライフサイクルメソッドが豊富で、API的にもわかりやすい(`componentDidMount`とか)。
- 再renderされる前に呼ばれるライフサイクルメソッド(`shouldComponentUpdate`)もあるらしく、`return false`するとrenderingをキャンセルできるらしい。かっこいい。

けっこう駆け足だったのでメモが漏れた(Fluxの話とか完全に)。でもReact楽しい。

## ライブコーディングのすゝめ

このタイトル見た時に、ああもうこれ名物になるんだろうなと思った。

前回(#1)でも同じタイトルのセッションがあって、今回もなかなかのバケモノライブコーディングをしていた。

10分でWeb RTCを利用したニコ生的なものを作るって感じで、相変わらず守備範囲が広い。用意してきてるにしても。

そんな感じで、僕がReactにとり憑かれた一日でした。
Kotlin製の仕様記述フレームワークSpekの紹介

こっとり〜ん(挨拶)

これは[Kotlin Advent Calendar 2014](http://www.adventar.org/calendars/477)の 12/15分です。
昨日はうらがみさんの[Kotlinでstaticメソッドが定義できるようになったのでJAX-RSリベンジ — 裏紙](http://backpaper0.github.io/2014/12/14/kotlin_static_method.html)でした。

この記事ではKotlin製のJVM向け仕様記述フレームワークである(あってるかな…) [Spek](http://jetbrains.github.io/spek/index.html)について紹介します。

Spekとはオランダ語でベーコンである！！！以上。おわり。分厚いベーコン焼いて食べたい！

はい。

Spekを使うと、普段こんな感じでテストを書いていたテストコードに対し

```java

@Test
public void testCalculateTaxRate() {

    TaxRateCalculator calculator = new TaxRateCalculator();

    Int value = calculator.calculateRate(200, 10);

    assertEquals(300,value);
}
```

こんな感じでテストに仕様を記述することができます。

```kotlin

class TaxCalculatorSpecs: Spek() {{

    given("Tax rate calculator with default locale settings") {
        val taxRateCalculator = TaxRateCalculator()
        on("calculating the rate for an income of 200 and an average change of 10 per semester") {
            val value = taxRateCalculator.calculateRate(200, 10)
            it("should result in a value of 300") {
                assertEquals(300, value)
            }
        }
    }
}}
```

テストを実行すると、以下のように階層的にテスト結果が表示されます。
どのような仕様なのかが分かりやすくて良いですね！
(実際に手元で動かそうと思ったけどうまく行かなかったのでリベンジせねば…後で追記修正します…)

![assert_result.png](https://qiita-image-store.s3.amazonaws.com/0/6092/ceb2e3e8-d888-b891-8916-67557eecd51e.png)

Spekで記述出来る内容は以下の通りです。

* given: 与えられる状況。セットアップなどを記述する。1回だけ出現。
* on: 実行する処理を記述する。1回以上出現。
* it: アクションの結果、アサーションを記述する。1回以上出現。

見ての通り、Spekはテスティングフレームワークでは無くて、JUnitなどのテストに仕様を記述する機能を提供するものみたいです。

SpekはJavaでも利用できるみたいなので試してみたいですね。

まだドキュメントが少なかったり、ライブラリのArtifact Versionが間違っていたりと整っていない感じもありますが、JetBrainsが専用のサイトを作っていて、それなりに力を入れていると思うので、今後もチェックしていきたいと思います。
Mac OS X で Python 開発環境構築


# pyenv virtualenv virtualenvwrapper のインストール

```.bash
$ brew install pyenv pyenv-virtualenv pyenv-virtualenvwrapper
```

.zshrc に以下を追記

```.bash
$ vim .zshrc
export PYENV_ROOT="$HOME/.pyenv”
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)”

export PYENV_VIRTUALENVWRAPPER_PREFER_PYVENV="true"
pyenv virtualenvwrapper
```

# pyenv の使い方

## インストール可能バージョン一覧

```.bash
$ pyenv install -l
```

## インストール

```.bash
$ pyenv install 3.4.1
```

## 現在のシェルで使われるバージョンを指定

```.bash
$ pyenv local 3.4.1
```

## デフォルトで使用するバージョンを指定

未指定だと、system の python が使われる

```.bash
$ pyenv global 3.4.1
```

新しいシェルを開くと、global で設定した python が使われている

```.bash
$ python --version
Python 3.4.1
```

# mkvirtualenv  の使い方

## 環境作成

既存の pip の内容

```.bash
$ pip list
argparse (1.2.2)
pbr (0.10.2)
pip (1.5.6)
setuptools (2.1)
six (1.8.0)
stevedore (1.1.0)
virtualenv (1.11.6)
virtualenv-clone (0.2.5)
virtualenvwrapper (4.3.1)
```

mkvirtualenv [環境名] で環境が作られる


```.bash
/Volumes/kobayashi/work% mkvirtualenv test
Using base prefix '/Users/kasei_san/.pyenv/versions/3.4.1'
New python executable in test/bin/python3.4
Also creating executable in test/bin/python
Installing setuptools, pip...done.
```

プロンプトの左端に環境名が表示される
(pip の内容がクリアされている)

```.bash
(test)/Volumes/kobayashi/work% pip list
pip (1.5.6)
setuptools (3.6)
```

## 環境切り替え

```.bash
$ workon testenv 
```

## 環境一覧

```.bash
$ workon 
test
```

## 環境から抜ける

```.bash
$ deactivate
```

## 環境を削除

```.bash
$ rmvirtualenv test
```

## workon したら作業ディレクトリに移動するようにする

環境を作成する

```.bash
$ mkvirtualenv playlist_to_mp3
Using base prefix '/Users/kasei_san/.pyenv/versions/3.4.1'
New python executable in playlist_to_mp3/bin/python3.4
Also creating executable in playlist_to_mp3/bin/python
Installing setuptools, pip...done.
```

setvirtualenvproject で 現在の環境とカレントディレクトリを紐付け

```.bash
$ (playlist_to_mp3)/Users/kasei_san/Dropbox/work/playlist_to_mp3% setvirtualenvproject
Setting project for playlist_to_mp3 to /Users/kasei_san/Dropbox/work/playlist_to_mp3
```

## global と異なるバージョンの python で環境を作成する

```.bash
$ pyenv local 2.7.9rc1
$ python --version
Python 2.7.9rc1

$ mkvirtualenv test

$ (test) python --version
Python 2.7.9rc1
```

新しいシェルを開く

```.bash
$ python --version
Python 3.4.1

$ workon test
$ (test) python --version
Python 2.7.9rc1
```

バージョンが変わることを確認


## 参考

- [yyuu/pyenv](https://github.com/yyuu/pyenv)
- [Ruby と Python の仮想環境操作を統一する - Qiita](http://qiita.com/torufurukawa/items/d612e240ec2b577ff072)
- [Ansible - OSXでpyenvインストールメモ - Qiita](http://qiita.com/ryurock/items/c4065da9f16c1f6248b7)
- [Pythonのvirtualenvとvirtualenvwrapperをいれる - 技術野郎の復習](http://d.hatena.ne.jp/toromoti/20121123/1353636216)
- [PyenvをCentOS6.3でセットアップする（超かんたんリファレンス付き） - Qiita](http://qiita.com/yuta_h3/items/2988c4d0811bf8c344c0)
簡単！Material Design の Swipe to Refreshの実装とカスタマイズ


Material Designのデザインガイドラインの1つに[Swipe to Refresh](http://www.google.com/design/spec/patterns/swipe-to-refresh.html)があります。
GmailやNewsStandなどに実装されているこんな感じのやつです。

![ezgif.com-optimize.gif](https://qiita-image-store.s3.amazonaws.com/0/15267/0c18a668-4fd0-2747-bcbb-188946bb7a76.gif "ezgif.com-optimize.gif")

実装してみたら結構簡単に導入できました。上の画像を実装したリポジトリは[こちら](https://github.com/konifar/android-layout-performance/tree/master/app/src/main)。
以下手順です。

#build.gradleにdependenciesを追加
`support-v4:21.0`のライブラリを利用します。

```build.gradle
dependencies {
    compile 'com.android.support:support-v4:21.0.+'
}
```


#レイアウトにSwipeRefreshLayoutを記述
ListViewやRecyclerViewを囲うように`SwipeRefreshLayout`を記述します。

```xml
<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/swipe_refresh"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="@color/grey300"
        android:dividerHeight="@dimen/line_small"
        android:listSelector="@drawable/bg_feedback"
        android:scrollingCache="false" />

</android.support.v4.widget.SwipeRefreshLayout>
```

#OnRefreshListenerを実装
上記レイアウトをinflateしているクラスで、`OnRefreshListener`をセットします。

```java
// onCreate()などで初期化します。
mSwipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
        // 引っ張って離した時に呼ばれます。
        loadData();
    }
});
```

#リフレッシュ後にsetRefreshing(false)を呼ぶ

画面の更新が終わったら、`setRefreshing(false)`を呼ぶ必要があります。
これを呼ばないと、引っ張って更新が終わってもクルクルがずっと表示され続けます。

```java
if (mSwipeRefresh.isRefreshing()) {
    mSwipeRefresh.setRefreshing(false);
}
```

#色のカスタマイズ

ローディングのデフォルトの色は黒です。
Gmailみたいに、1周目は緑、2周目は赤、3周目は青、4周目は黄のようにローディングの色を変えたい場合は、初期化時に設定できます。
ちなみに、色はMaterial Designの[カラーパレット](http://www.google.com/design/spec/style/color.html)から選ぶのがよいです。

```java
mSwipeRefresh.setColorSchemeResources(R.color.green, R.color.red, R.color.blue, R.color.yellow);
```
heroku上のruby2.0、redmine2.5.3環境にテーマを入れるお話


2回めの投稿です。前回は [herokuにruby2.0、redmine2.5.3環境を構築するお話](http://qiita.com/ex_SOUL/items/b39fc001efb268be3084) でした。

今回はheroku上のredmineにテーマを入れるお話です。

## 前置き
* 既にheroku上にredmine環境が構築済みであるとして書いています
* ローカルにheroku上に構築したredmineのリポジトリがあるとしています
* Windowsマシンで操作しています
* コンソールはGiｔ Bushを使用しています。

## 手順

### テーマをダウンロード
redmineの規定のテーマはなんだかさみしいので、やる気の出るテーマを導入します。
個人的お気に入りはGitmikeです。
https://github.com/makotokw/redmine-theme-gitmike
名前の通り、redmineをGithubライクな外観にしてくれます。
redmine_backlogsとの親和性もバッチリです。

テーマなので`git clone`じゃなくてZIPでダウンロードして展開しても問題無いと思います。

`\public\themes` 直下へダウンロードもしくは `git clone` で取得したソースを配置します。
`git clone`で取得した場合、ディレクトリ内の.gitファイルは削除してください。
そうしないとredmineとは別リポジトリ管理ファイル群と認識されheroku上にpushできません。
私はこれで1時間ハマりました。gitの基礎を勉強する必要がありますね。

Gitmike以外のテーマでオススメとしては、[farend fancy](https://github.com/farend/redmine_theme_farend_fancy)なんかがいいと思います。
テーマの一覧サイトとして、以下のサイトが有ります。
http://www.redmine.org/projects/redmine/wiki/Theme_List

幾つかのテーマを試したのですが、日本語環境だとうまく日本語が表示されない(フォントの上下が見きれてしまう等)ので、日本語を表示する場合は、作者が日本人のものが確実だと思います。
何かおすすめがありましたら教えていただければ幸いです。

### .gitignoreファイルの編集

.gitignoreファイルの以下のコメントをコメントアウトします。

```
/public/themes/*
```

### herokuへ追加したファイルをPush

以下のコマンドを実行してテーマファイルをherokuへPushします。

```
git add .
```
```
git commit -m "add theme Gitmike"
```
```
git push heroku master
```

以上でGitmikeテーマの導入は完了です。

## こんな感じ

TOPページはこんな感じです。
![redmine.PNG](https://qiita-image-store.s3.amazonaws.com/0/62796/91be41ae-257d-64d1-cd93-743e24b9d50f.png)

* * *

後々記事として投稿する(と思う)redmine_backlogsのタスクボード画面だとこんな感じ。
![taskboard.PNG](https://qiita-image-store.s3.amazonaws.com/0/62796/09b39eb3-3a18-0a38-f9ab-c781f7c8d8e3.png)

* * *

バックログ画面はこんな感じ
![backlogs.PNG](https://qiita-image-store.s3.amazonaws.com/0/62796/00f9657d-bfa5-629b-0149-270160e86431.png)
Rubyインストールの後にしたいこと

Rubyをインストールしたら

> rub -v

でバージョンを確認。

その後、Rubyをインストールしたディレクトリを見てみると
docディレクトリがあります。この中にはいくつかドキュメントが。

その中でもおすすめは

**bookofruby.pdf**

一通りのRubyの解説とサンプルコードが書かれています。
いきなりタイピングもありですが、その前にじっくりと読んでみるのも悪くないかと。**なにしろ、無料ですものね。**
Qiita の記事の見出しに Font-Awesome を利用して見栄えを良くする #qiita

※Qiitaの仕様変更によりFont Awesomeのアイコンフォントが表示されなくなったようです。

# Qiita の記事の見出しに Font-Awesome を利用して見栄えを良くする #qiita
## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
Qiita の記事の見出しに Font-Awesome を利用して見栄えを良くする
## <i class="fa fa-cube" style="font-size:1em;"></i> Font Awesome
Font Awesome については、こちら。
<i class="fa fa-external-link-square" style="font-size:1em;"></i> [Font Awesome](http://fortawesome.github.io/Font-Awesome/icons/)

## <i class="fa fa-plus-square" style="font-size:1em;"></i> 利点
* 見栄えが良くなる
* 基本的なアイコンの利用法を統一しておくと、見た目で構成を理解しやすくなる
* 内容に合わせたアイコンを利用すると内容を理解しやすい
* 欲しい情報がどこにあるか、高速でスクロールしている時に目印にし易い

## <i class="fa fa-files-o" style="font-size:1em;"></i> 手順
### <i class="fa fa-location-arrow" style="font-size:1em;"></i> Icon 選び
<i class="fa fa-external-link-square" style="font-size:1em;"></i> [Font Awesome](http://fortawesome.github.io/Font-Awesome/icons/) からアイコンを選びます
ここでは、私が見出しによく利用している、 3Dキューブ（3個）を選ぶことにします。
フォント名は `fa-cubes` です。

`fa-cubes` を利用する場合は、以下のように記述します。

~~~html
<i class="fa fa-cubes" style="font-size:1em;"></i> 概要
~~~

上記の HTML を Markdown 中に記述しておくと、この記事の「概要」のように表示されます。

本来は、 Font Awesome の CSS を link タグで取得する必要があるのですが、
Qiita は元々内部で Font Awesome を利用しているため、記述する必要がありません。
実際に、 Qiita の HTML ソースを確認すると下記の記述があります。

~~~html
<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css" rel="stylesheet" />
~~~

## <i class="fa fa-cube" style="font-size:1em;"></i> 補足
Sublime Text を利用していて Markdown + Font Awesome の編集作業を円滑に行いたい方は
下記もあわせてご確認ください。

### <i class="fa fa-file-text-o" style="font-size:1em;"></i> Sublime Text Snippet
Sublime Text を利用していて、楽に Font-Awesome を利用した Markdown を記述したい方は
こちらの記事を参照してください。
[Sublime Text | Font Awesome のタグを snippet 化して楽に入力する](http://qiita.com/tbpgr/items/24dae69a1884d1a54daa)

### <i class="fa fa-file-text-o" style="font-size:1em;"></i> Sublime Text Markdown Preview
Sublime Text を利用していて、楽に Font-Awesome を編集しながら Markdown のプレビュー表示をしたい方は
こちらの記事を参照してください。
[Sublime Text | Markdown Preview Plugin で fontawesome を利用できるようにする](http://qiita.com/tbpgr/items/d224fd3154cd210800a8)

## <i class="fa fa-arrow-circle-right" style="font-size:1em;"></i> 参照
* <i class="fa fa-external-link-square" style="font-size:1em;"></i> [Font Awesome](http://fortawesome.github.io/Font-Awesome/icons/)
* [Sublime Text | Font Awesome のタグを snippet 化して楽に入力する](http://qiita.com/tbpgr/items/24dae69a1884d1a54daa)
* [Sublime Text | Markdown Preview Plugin で fontawesome を利用できるようにする](http://qiita.com/tbpgr/items/d224fd3154cd210800a8)