OmniAICreator/Qiita-1.07M huggingface dataset:
Reactを勉強しようとして、yarnを知り、その前にnpmを知ろうして、node.jsに辿り着き、CommonJSが関係し、CommonLISPを経て、LISPをちょっとかじったら、ポーランド記法にたどり着いた話

# Reactを勉強しようとした経緯
在席している会社でReactの資料があったので、Reactをほとんど知らない私が勉強しようと思いたったのが始めた経緯。
## Reactのインストール方法に、yarnとnpmの2種類があります。
yarnもnpmも良く知らないので、npmの歴史から調べてみることにする。

と言ったここまで、事が始まるまでの経緯。

## npmを調べる。
googleでnpmで調べると比較的上位に、以下の記事が表示される。

[npm とか bower とか一体何なんだよ！Javascript 界隈の文脈を理解しよう ...](http://qiita.com/megane42/items/2ab6ffd866c3f2fda066)

> 「CommonJS」誕生 - Javascript は汎用プログラミング言語へ

**npmを知ろうとしてQiitaの記事を開いたら、なんでCommonJSの話になるんだよ！！！**

> CommonJS はあくまで仕様であり、CommonJS というライブラリが存在するわけではありません。Common Lisp みたいなものです。

**Common Lisp？？？**
**もういい、Common Lispから調べる！**

## *Common Lisp[（wikiペディア参照）](https://ja.wikipedia.org/wiki/Common_Lisp)*

> Common Lisp（コモン・リスプ、CL と略記される）は関数型プログラミング言語で LISP方言の一種。

やっぱりLISPに関係するのか。
でも、LISPは聞いたことあるけど、どんな言語なんだろう。

## *LISP[（wikiペディア参照）](https://ja.wikipedia.org/wiki/LISP)*

> LISPは、長い歴史を持ち、特徴的で完全に括弧で囲われたポーランド記法[1]によるプログラミング言語である。

*ポーランド記法*ってなんだよ！！！

## ポーランド記法[（wikiペディア参照）](https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%BC%E3%83%A9%E3%83%B3%E3%83%89%E8%A8%98%E6%B3%95)

例えば、「1 と 2 を加算する」という演算を、一般的に数式の表記に用いられる中置記法で記述すると、以下のようになる。

```
1 + 2
```

一方、ポーランド記法では、加算を表す演算子 + を、被演算子である 1 と 2 の前（左）に置いて、以下のように記述する。

```
+ 1 2
```

中置法はいつも使ってるやつで、ポーランド記法って、こんな感じに書くんか、はー勉強になりました。
Reactはどこにいったのだろう。

ポーランド記法は、一見、理解しずらそうだけど、以下のように（）括弧を省けるというメリットがあるとか。
中置法

```
(1 + 5) * (2 + 3)
```

ポーランド記法

```
* + 1 5 + 2 3
```
Scrapyでクロール実行した時にSpider not foundが出る

Scrapyでクロール実行するかなってときに謎のエラーに遭遇して詰まったのでメモしておく。

##状況
コマンドプロンプト上から以下を実行
`scrapy crawl websiteCrawl.py`

```
raise KeyError("Spider not found: {}".format(spider_name))
KeyError: 'Spider not found: websiteCrawl.py'
```

なエラーが出力。
別に変な設定していないんだけどSpiderがないってどういうことだ？


##対応
.pyを外して実行するとエラーは出ない。
`scrapy crawl websiteCrawl`

情けないケアレスミスではあったけど、tab保管すると.pyつくので、この手のエラーでやすいのかなーとか。
macOS 10.12 Sierra で SSH のパスフレーズを憶えてくれない問題への workaround

# 概要

macOS 10.12 (Sierra) で、キーチェーンが SSH のパスフレーズを憶えてくれず、毎回入力しなくてはいけなくて煩雑。

```
shao-01:~/dev/ % git clone git@github.com/some-organization/some-repository.git
Enter passphrase for key '/Users/shao/.ssh/id_rsa':
```

ああ、イライラ。

# 対処法

`~/.ssh/config` (なければ作る) に以下の記述をする。

```~/.ssh/config
Host *
   UseKeychain yes
   AddKeysToAgent yes
```

便利。

# おまけ

「都度入れたくはないが、定期的に確認はしたい」というむきには、キーチェーンアクセスの「キーチェーン設定」がおすすめ。

"キーチェーンアクセス.app" を開き、編集→ キーチェーン"ログイン" の設定を変更…

![image](https://qiita-image-store.s3.amazonaws.com/0/2108/c5057f23-ef56-b1f8-1294-2ea29f1b1b39.png)

無操作時やスリープ時にキーチェーンをロックしておけば、SSH の公開鍵もロック中はパスフレーズを聞かれるようになる。

# 参考文献

[difficulties with ssh-agent in macOS Sierra : osx - Reddit](https://www.reddit.com/r/osx/comments/52zn5r/difficulties_with_sshagent_in_macos_sierra/)
Windowsのhostsファイルの保存先


windowsのhostsファイルの場所をよく忘れてしまうので、備忘録として。

```
C:\WINDOWS\system32\drivers\etc\hosts
```

編集には管理者権限が必要です。
メモ帳などのテキストエディタで編集して、保存してください。
非エンジニアでも高速でティザーサイトを作るテクニックス（当たり前シリーズ）

めりーくりすます、めりーくりすます。
こんなにも一人で過ごすのが苦痛な日は、他人の幸せのために使います。
どうも山下です。

さて、アドベントカレンダー最終日を**非エンジニア**の僕が飾るというなんとも稀有な感覚ですが、初めて行きましょう。

今回は僕みたいな**HTMLとかCSSとかかじった程度で、JSとかPHPなんてもうかすったくらいのど素人**でも高速でティザーサイトを作る方法なんかを書いちゃおうかと思います。
３パターンでお送りしますね、めりーくりすます。

#事前準備
まずはじめに、ある素材を全てデザイナーの方からもらっておきます。
ロゴやサービスに使った素材など、すべて。
クリエイティブの全て。
この世の全て。

基本はロゴだけで大丈夫かと思います。

##ピクトグラムも集めておくと便利
ピクトグラムはフリー素材も多く、汎用性があるので最高。
下記のサイトをはじめとした海外サイトがたくさんあるので、サイトだけでもピックアップしておくと◎

#パターン①:ツールで頑張る (難易度:低)
![header_muse_post.jpg](https://qiita-image-store.s3.amazonaws.com/0/51623/6e50be6e-dea2-718d-7729-ed41060f03fd.jpeg)
[Adobe Muse](http://www.adobe.com/jp/products/muse.html)
ツールで頑張るパターンは一番簡単、昔でいうとホームページビルダー的なツール、AdobeMuseを駆使！
**画像をほいほいドラッグして行って、ほいほい設置して、動きも設定できて神**。
ちなみにこの[Drips](https://drips.d-9.tokyo)のティザーサイトはMuseで制作しております。

公式が出しているチュートリアルもわかりやすいので、誰でも使えちゃうと思います。
[Adobe MuseでWebサイトを制作する | Adobe Muse CC tutorials](https://helpx.adobe.com/jp/muse/how-to/create-website.html)

本当、便利になったものですねぇ…。

#パターン②：テンプレートで頑張る (難易度:中)
はい二個目、こっちはHTML/CSSやJSなんかの知識が少し必要。
とはいえチート的手段ですが、有料テンプレートを利用して作成！

有料テンプレって嫌煙されがちな気がしますが、**人が稼働する時間を考えるとだいぶ安い、コスパ最高**。
日本語のものが少ないのが難点ですが、下記の海外サイトなんかはすごく使いやすくて英語がわからなくてもなんとか行けるレベル！

[ThemeForest](https://themeforest.net/)

ちなみにWordPressのテンプレはプラグインがどうとか色々面倒なので、HTMLの方がオススメどす。

#パターン③：フレームワークで頑張る (難易度:高)
これはもうエンジニアさんにとっては基本的なアレですが、一応。
ここまで出来ればこんな当たり前的な記事はいらないと思いますが、**一番自由度が高い**のでパターンとして載せました。

こんな記事でも読んで、選定してくださいな。（筆者はここまで出来ないから説明が拙くてすみません）
[Bootstrapだけじゃない！おすすめCSSフレームワーク6選まとめ！
](http://www.cloudot.co.jp/blog/4124/)

~~つかここまできたらもうフロントエンジニアとして稼げるよね。~~

#デザイナーにもエンジニアにも頼らず、やれることをやる事が正義（ジャスティス）
いや頼っても良いんだけどね？
専門職の人たちの手が空かないから進まないとかはよくないなーって事です。

助け合いでプロジェクトは回して行きまっしょい！
配列を展開して可変長引数に引き渡す


メモがてら。リストの先頭に何か足したリストを生成するのを、いみゅーたぶるにどうしたら良いのかな、
listOfに配列を展開して渡せるものだろうか、と思っていたら、


さらりと **spread** operator って書いてあった。

> When we call a vararg-function, we can pass arguments one-by-one, e.g. asList(1, 2, 3), or, if we already have an array and want to pass its contents to the function, we use the spread operator (prefix the array with *):
> 
``` kotlin
val a = arrayOf(1, 2, 3)
val list = asList(-1, 0, *a, 4)
```
> [Functions - Kotlin Programming Language](https://kotlinlang.org/docs/reference/functions.html#variable-number-of-arguments-varargs)

コンスタラクタで受け取った可変長引数のリストの先頭に固定のprefixを足したくて探したのだけど、

```kotlin
class Sample(vararg components: String) {
  private val PREFIX = "prefix"
  private val components = listOf(PREFIX, *components)
}
```

で、いけた。なるほど。
NSLogでNSObject継承じゃない変数名も出力

もう完全に自分用メモ

こちらの記事を参考にNSObjectを継承してないやつも表示させるマクロ
http://qiita.com/calmscape/items/5c6f035aa9fa2a91d001

#マクロ定義
```objc
//参考記事そのまま
#define LogWithVarName(var) [NSString stringWithFormat:@"%s = %@", #var, var]
//数値
#define LogWithVarNameInt(var) [NSString stringWithFormat:@"%s = %d", #var, var]
#define LogWithVarNameFloat(var) [NSString stringWithFormat:@"%s = %lf", #var, var]
//CGRectとか
#define LogWithVarNameCGRect(var) [NSString stringWithFormat:@"%s = %@", #var, NSStringFromCGRect(var)]
#define LogWithVarNameCGPoint(var) [NSString stringWithFormat:@"%s = %@", #var, NSStringFromCGPoint(var)]
#define LogWithVarNameCGSize(var) [NSString stringWithFormat:@"%s = %@", #var, NSStringFromCGSize(var)]
```

#使い方
```objc
int i = 10;
NSLog(@"%@", LogWithVarNameInt(i));

CGRect r = (CGRect){10, 20, 30, 40};
NSLog(@"%@", LogWithVarNameCGRect(r));

UIImage hogeImg = [UIImage imageNamed:@"hogehoge.png"];
NSLog(@"%@", LogWithVarNameCGSize(hogeImg.size));
```

#出力
```
i = 10
r = {{10, 20}, {30, 40}}
hogeImg.size = {100, 100}
```
laravelで.envのpathを変える

laravelでは環境に依存するデータを`.env`に追い出すけど、デフォルトだとアプリのルートディレクトリにある`.env`を読み込むので、デプロイの方法としてアプリのルートディレクトリをまるっと入れ替えると`.env`がなくなってしまう。そこで`.env`のパスをアプリの外側に変えてみた。

 *本番では環境変数に設定すべき*とのことなので、個人の開発環境での話になります。(すごく限定的な話ですね)

`/bootstrap/app.php`で`Illuminate\Foundation\Application`のインスタンスを作った直後に`useEnvironmentPath`メソッドを呼ぶだけ。

```/bootstrap/app.php
$app = new Illuminate\Foundation\Application(
    realpath(__DIR__.'/../')
);
// ここで.envのパスを設定する
$app->useEnvironmentPath(realpath(__DIR__ . '/../../'));
```

案外と簡単でした。
Google Apps Scriptで退勤時刻を知らせ打刻を促す

## 概要

Google Apps Scriptを使い退勤時刻と打刻を促すことで打刻漏れを減らす。

## 実現したいこと
- 毎日決まった時間に帰れるようになりたいため、時間をトリガーにする
- 退勤時間を19:00 - 20:00に設定
	- 時間主導型、日タイマー、午後7時~午後8時に設定
- 一番気づきやすいのでMention付きでSlackに通知
- 出来る限り簡単に実現する

## 開発環境
- Google Apps ScriptをGoogle Drive上で実行
	- JavaScriptと見た感じ変わらない
- ブラウザ上で開発
	- Google DriveにGoogle Apps Scriptアプリを追加

![apps_script_1.png](https://qiita-image-store.s3.amazonaws.com/0/43438/f8fed096-901f-1235-a56f-e68e7349a0dc.png "apps_script_1.png")


## 開発方法

### Google Apps Scriptファイルの作成

- Google Driveの「新規作成」から「その他」-> 「Google Apps Script」を選択

![apps_script_2.png](https://qiita-image-store.s3.amazonaws.com/0/43438/e5eb6363-c3a1-c450-d904-64444ca45431.png "apps_script_2.png")

### コードを書く

Spreadsheets、Documentsの要領でエディタが開くのでコードを書く。ファイルの作成からコードを書いて実行するまでの流れは[こちら記事](http://inside.pixiv.net/entry/2016/11/14/150000)がとても参考になります。

![apps_script_3.png](https://qiita-image-store.s3.amazonaws.com/0/43438/b8edb1bd-8ae2-db36-2124-29c11ff59cbc.png "apps_script_3.png")

### SlackのAPIを叩いてみる

Slackへの通知はSlack APIを利用します。
	- https://api.slack.com/methods/chat.postMessage

Google Apps Scriptの組み込みのメソッド`UrlFetchApp`を使うとHTTPリクエストが発行できます。リファレンスは[こちら](https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app)。`token`は[ここらへん](https://api.slack.com/docs/oauth-test-tokens)から入手しましょう。`channel`は指定すると特定のchennel宛にメッセージを遅れます。channel名ではなく`C0123456ab`のようなIDになっています。[channels.list](https://api.slack.com/methods/channels.list/test)で確認するのが簡単です。

```javascript
function myFunction() {

  var options = {
    "method" : "POST",
    "payload" : {
      "token": "YOUR_SLACK_TOKEN",
      "channel": "CHANNEL_NAME",
      "text": "@horie 退勤しましょう。\nhttps://hoge.html",
      "mrkdwn": true,
      'link_names': 1
    }
  }

  var url = "https://slack.com/api/chat.postMessage"
  UrlFetchApp.fetch(url, options);
}

```

`myFunction`を選択して実行ボタンを押すとSlackに通知されるはずです。

![apps_script_4.png](https://qiita-image-store.s3.amazonaws.com/0/43438/5e75a570-d3d0-cb5d-c32c-c656c8ee05c8.png "apps_script_4.png")

うまくいくと↓のように通知されます。

![apps_script_5.png](https://qiita-image-store.s3.amazonaws.com/0/43438/6cb83025-d0a5-8a40-edc8-6a8a40071472.png "apps_script_5.png")


### 実行時間のスケジューリング

メニューの「リソース」から「現在のプロジェクトのトリガー」を選択します。するとダイアログが表示されるのでトリガーを追加します。時間主導型、日タイマー、午後7時~午後8時を選択し保存します。これで毎日午後7時~午後8時に通知されるようになります。

![apps_script_6.png](https://qiita-image-store.s3.amazonaws.com/0/43438/fe8667d3-d97b-ebdb-11df-b8ae9e4e338e.png "apps_script_6.png")


## まとめ
- Google DriveとGoogle Apps Scriptを利用することでサーバーレスで定期実行ができました。
- 打刻を忘れないようにしましょう！

## 参考資料
- https://developers.google.com/apps-script/
- http://libro.tuyano.com/index2?id=638001
- http://inside.pixiv.net/entry/2016/11/14/150000
JavaScriptの非同期処理を並列処理と勘違いしていませんか？


##この記事を書くにあたり..
いわゆるカメラアプリをブラウザで実装するにあたり，canvas要素をpng形式に変換する処理が150msほどかかってしまっていて，その間にブラウザに映し出される映像がカクついてしまったという問題が発生しました．
その問題を解決する中で，Web上で色々な記事を読んでいると，JavaScriptの非同期処理を並列処理と勘違いしている人が結構いたので，今回はそんな初心者から中級者になろうとしている人のための記事です．
＊JavaScript上級者の方は．何か間違っていることがあればコメントください．
##そもそも非同期処理とは
プログラムが記述された通りに実行されるものを同期処理と言います．
しかし，同期処理だと，1行のプログラムに時間がかかったら，全体が重くなってしまいます．
(例えば，サーバーにリクエストしてそれが何秒もかかって，UIまでもがフリーズしたら，何だこのページは！ってなりますよね)

そこで考え出されたのが非同期処理で，処理が実行できるようになるのを待ち，実行できるようになってから実行するといった処理です．
例えば，イベント処理などが非同期処理にあたりますね．ボタンがクリックされたら実行するといった具合です．
setTimeout()やsetInterval()なども非同期処理にあたります．

##JavaScriptにおける非同期処理
さて，ここからが本題です．
非同期処理はメインスレッドではなく別のスレッドで実行しているイメージがあるかもしれません．
<strong>その認識は間違っています．</strong>
基本的には,JavaScriptはシングルスレッドの実装しかできません.
非同期処理を実装せずにプログラムを書くとメインプログラムが単一スレッドを独占してしまいます．非同期処理を実装すると，実行を待っている関数待ちの行列にコールバック関数が割り込みされます．
下図を参照してください．発火してすぐにコールバックが実行されるのではなく，実行中の関数が実行終わってから実行されるようです．(処理は関数単位で実行される)

![非同期処理.png](https://qiita-image-store.s3.amazonaws.com/0/68536/e80ebbf4-87a8-efde-9279-306918bc260a.png)


##並行処理と並列処理
並<strong>列</strong>処理とは，まさに<strong>マルチスレッド</strong>でプログラムを実行し計算負荷を分散させる処理です．
似たような単語に並<strong>行</strong>処理というものがあります．
並行処理は，あくまで処理を順不同に行う処理です．人間にとってみればあたかも同時に行われているように見えてしまう処理のことです．
<strong>JavaScriptの非同期処理、</strong>イベント処理やpromise等は並行処理に当たるのです．</strong>
しかし,並行処理では私の作成しているカメラアプリで画像を書き出している途中で映像が止まってしまいます．

##JavaScriptでマルチスレッドを実行するには..
JSをマルチスレッドで実行するにはWebWorkersというAPIを使うと実装できます．
ここでは，詳しく書きませんが，このAPIを用いるとマルチスレッドで実装できます．
しかし，WebWorkersAPIでは，DOMを取得できないのでcanvas要素を取得できません．
困った...
そこで私は,iframeを用いて...という話は今回の話題とずれるのでこの辺で．


非同期処理が並列処理と勘違いしていた人が一人でも救済されることを願っています．

おすすめ
[今回の話題のようなことをまとめてあるブログをまとめてある方のリンク](http://chuckwebtips.hatenablog.com/entry/2015/08/19/070000)
pagent起動時に秘密鍵の読み込みを自動化

sourcetreeで、bitbucketとgithubで別々のssh鍵を登録している場合。
pagentに登録すれば通信できるのですが、毎回手動でやるのが面倒になったときのメモ。

pagentのショートカットのプロパティから、起動コマンドに秘密鍵へのパスを半角スペース区切りで渡せばOK
。

`C:\Program Files\putty\pageant.exe "C:\sshkey\myserver01.ppk" "C:\sshkey\myserver02.ppk`

# 参考サイト

* http://bashalog.c-brains.jp/09/06/12-122357.php
* http://fakeyakuza.hatenablog.com/entry/20110726/1311686076
C++ Builder XE4, 10.2 Tokyo > TStringGrid > セルの位置を変更する > プロパティRowとColを設定する

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

TStringGridにおいて、セルの位置を変更したい。

参考 http://forum.lazarus.freepascal.org/index.php?topic=9413.0

プロパティRowとColを設定するようだ。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::B_homeClick(TObject *Sender)
{
	StringGrid1->Row = 1;
	StringGrid1->Col = 1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::B_downClick(TObject *Sender)
{
	StringGrid1->Row += 1;
}
//---------------------------------------------------------------------------
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d28ded4d-107b-a081-4b13-1a97c31be9fb.png)
Docker-composeの起動と終了(Windows)

Docker Quickstart Terminalから以下のコマンドを適宜使って起動、終了します。

###アプリの置いてあるディレクトリに移動する
```
$ cd docker-compose.ymlのある場所のフォルダパス
```

###アプリの起動確認
`$ docker-compose ps`と入力実行すると以下のような表示が出ます。
db_1やweb_1が表示されていてStateがUpになっていたら起動されています。
Name Commandなどの下に何も表示されていないかStateがExit 0になっていたら起動されていません。

```
$ docker-compose ps
$ Name           Command                  State    Ports
$ db_1    /docker-entrypoint.sh postgres   Up      5432/tcp
$ web_1  bundle exec rails s -p 3000       Up      0.0.0.0:3000
```

### アプリの起動
```
$ docker-compose up
```
ブラウザからプロジェクトのURLにアクセスしてローカル環境でサイトを確認できます

### プロジェクトのURLを調べる
```
$ docker-machine ip
```
このコマンドで192.168.99.100と出たとします。
そうしたら、アプリの起動確認のところで見たweb_1のポートが3000なのでhttp:/192.168.99.100:3000にアクセスするとdocker-composeで作成したwebイメージのページが見られます。

###アプリの終了
```
$ docker-compose down
```

----
ごくごく基本のところですがデザイナー向けドキュメントとして作成したものを一般向けにアレンジして出しました。

関連記事：
DockerでWindows機のメンバーのRails環境セットアップ（Herokuプロジェクト）
http://qiita.com/tomomomo1217/items/3e9664fd5290934f0815
window関数で移動平均を求めてみたら幸せがおとずれた

##はじめに
postgresのwindow関数を使って移動平均を求めてみた。サブクエリを使って移動平均を求めているソースコードを書き直してみたら、書きやすいしパフォーマンスは良いし、感動したのでメモ。

##window関数とは？
window関数とは、GROUP BYのように行を区切って集計できる機能。GROUP BYとの違いは、GROUP BYが行をグループごとに一つにまとめてしまうのに対し、window関数はグループ内のそれぞれの行のデータを使った集計ができる。例えば、グループ内の最初の行の値を求める`first_value`のような関数が使える。加えてGROUP BYと同じように、avgのような集計関数も使える。

例えば、ある行の前３行から後ろ５行を選択したいときは、`ROWS BETWEEN 3 PRECEDING AND 5 FOLLOWING`のように書ける。

以下のSQLでweightカラムの過去５項目の移動平均を求められる。

```sql
SELECT avg(t.weight) OVER w AS moving_avg
FROM my_table AS t
WINDOW w AS (ORDER BY t.created_at DESC
             ROWS BETWEEN 1 FOLLOWING AND 5 FOLLOWING)
ORDER BY created_at DESC;
```

##weightカラムの値が移動平均の2倍以上の行だけを抽出する

weightカラムの値が移動平均の2倍以上の行だけを抽出したい。元のサブクエリを使ったSQLが以下。1000行ほどのテーブルで30秒以上かかっていた。

```sql

SELECT *
FROM my_table t_a
WHERE weight / 2 >
      (SELECT avg(t_b.weight) FROM my_table t_b
       WHERE (SELECT count(*) FROM my_table t_c
              WHERE t_c.created_at between t_b.created_at and t_a.created_at)
       BETWEEN 1 and 5)
       ORDER BY created_at DESC;
```

window関数を使って書き直したSQLが以下。1000行ほどのテーブルなら一瞬で終わる。

```sql
SELECT *
FROM
  (SELECT *, avg(d.weight) OVER w AS moving_avg
   FROM my_table AS t
   WINDOW w AS (ORDER BY t.created_at DESC
                ROWS BETWEEN 1 FOLLOWING AND 5 FOLLOWING)
  ) AS t
WHERE t.weight / moving_avg > 2
ORDER BY created_at DESC
```

##おわりに
ちょっとした工夫で大幅にパフォーマンスが改善するのは、幸せ。
SQLチューニング基礎(Oracle)

#Oracle　DBパフォーマンスチューニング：

１、システムチューニング　※今回は割愛
　　主にOSまたはOracleの設定の変更により、DB性能を改善すること

２、SQLチューニング
　　性能の悪いSQLを見つけて改善すること（性能の悪いSQLとは：SQLを実行する際、効率の悪い索引アクセスを
   して、 無駄なリソー ス＊を大量に消費するSQLのこと。表現が難しいくらい猛烈な実行時間がかかってしまうSQL。
   ＊CPUとメモリー

![image](https://qiita-image-store.s3.amazonaws.com/0/133314/29e24100-456a-5f99-8bf6-0cb8765f9800.png)

   １、開発担当者がSQL文を作成時に性能を意識しにくい
　実装段階では、機能の実現が優先される傾向にあり、開発者はSQL文の効率に対する意識が疎かになってしまいがちです。実行結果でも、SQL文にはいくつ通りもの記述方法があり、開発者の性能への意識が疎かになると性能の悪いSQL文が生み出されます。


２、実装段階ではSQL文のアクセスパスが最適か分からない
　実装段階では、本番で想定されるよりも極端に少ないデータ量でテストすることが多いため、実装時は索引を使ったアクセスパスであったSQL文が、カットオーバー後ではテーブルの全件スキャンに変わってしまうといったことが起こり得ます。

**作成したSQLの性能は、 SQLを実行する時のアクセスパス（どのように表に対して検索を行う）で判断することが一般的によく使われている手法の一つです。**

**SQLを実行する時のアクセスパスを調べる方法 ⇒（SQL)実行計画で確認する**

**`SQL実行計画 ` とは、アクセスパスが書かれた、いわゆる“SQLの実行手順書”です。Oracleでは、SQL文を実行する際、先にSQL文を解析して最も効率的な実行計画を生成します。
過去に同じSQL文が実行されていれば、その実行計画が格納されているので、それ以降は解析を行なうことなくSQL文が実行されます。解析されない分、実行時間は短縮されます。**

1.統計情報とは？
表や索引、また使用している領域、データの種類や分布などのデータ特性を表す情報です。

2. 具体的にどんな値があるのか？
統計情報には大きく分けて、表統計、列統計、索引統計、システム統計が存在します。それぞれの統計情報は、主に以下のような項目で構成されます。

表統計：行数、ブロック数、平均行長
列統計：列値の種類、NULLの数、データ分布
索引統計：リーフ・ブロック数、階層数
システム統計：CPUパフォーマンスと使用率、I/Oパフォーマンスと使用率

2. 具体的にどんな値があるのか？
統計情報には大きく分けて、表統計、列統計、索引統計、システム統計が存在します。それぞれの統計情報は、主に以下のような項目で構成されます。

表統計：行数、ブロック数、平均行長
列統計：列値の種類、NULLの数、データ分布
索引統計：リーフ・ブロック数、階層数
システム統計：CPUパフォーマンスと使用率、I/Oパフォーマンスと使用率

実行計画の取得方法：使うツール（SQLPLUS,A5-MK2,SQL-DEVELOPER etc..)　によって、取得方法（手順）は異なりますが、実行計画の結果は同じになります。
MSP430F5507で38K

以下のブログを参考にMSP430で赤外線リモコンで使う38Kの信号を作ってみた。

http://bird.dip.jp/mt/archives/2007/03/17/2121.html

http://blazeazuki.blog.shinobi.jp/msp430関係/msp430g2%20launchpad買った

使ったgccはplatformioに入っていた4.6.3です。

P1.5に出力する。

```c
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P1DIR |= BIT5;                            // P1.5 output
  P1SEL |= BIT5;                            // P1.5 options select
  TA0CCR0 = 26;                             // PWM Period
  TA0CCTL4 = OUTMOD_7;                      // CCR4 reset/set
  TA0CCR4 = 18;                             // CCR4 PWM duty cycle
  TA0CTL = TASSEL_2 + MC_1 + TACLR;         // SMCLK, up mode, clear TAR

  __bis_SR_register(LPM0_bits);             // Enter LPM0
  __no_operation();                         // For debugger
}
```

P1.5はTA0.4なので、TA0CCTL4,TA0CCR4を設定する。

![MSP430-38K.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/157c4740-6660-e811-b347-3150de3a0bd8.jpeg)

[さるのこしかけ](http://hp.vector.co.jp/authors/VA009278/monkey/)でキャプチャしたんですが時間の指標間違えています。いつか直します。

TA0CCR0を26にしてワンオクじゃなくてワンクロックが26uSで38Kくらいで、HIが18で18uSくらいになる。

P1.4もいっしょに出力すると、ワンクロックは同じ38KになるがTA0CCTL3,TA0CCR3でデューティ比は代えられる。
最初のLチカ

やっとこさ、Lチカにたどり着いたのでチカチカしてみましょう。手元の Raspberry Pi 3 であれこれやろうと思っていたのですが、キュレーションメディアっぽくひと様のふんどしで相撲をとります。

[World Map of Makers - Hackster.io](https://www.hackster.io/windows-iot/internet-connected-led-445551 "World Map of Makers - Hackster.io")

これは世界地図を表示してLチカする例なのですが、最初のところは入門編なので、良い教材になります。

![](https://hackster.imgix.net/uploads/cover_image/file/78137/WebBlinkyMakerMap.jpg?auto=compress%2Cformat&w=900&h=675&fit=min)

# 配線例
慣れてくると回路図を使うのですが、こんな風に実体の配線図を使うと便利です。ジャンプワイヤーの色は、赤と青を使っていますが、何の色を使っても構いません。通例としては、マイナス極（GND）のほうを寒色（黒とか青とか緑とか）を使って、プラス極のほうを暖色（赤とかオレンジとか）を使うことが多いです。

![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/32488/5feb1309-cf1c-d276-d4e8-a1d205451efb.jpeg)


ここでは、

- 赤色のLED
- 560Ωの抵抗

を付けています。実は、この抵抗値もおおざっぱでよくて（輝度を調節するためには正確に計算する必要がありますが）、100Ωから1kΩ程度のものを挟んでおけば、ひとまずLチカだけはできます。場合によっては、抵抗なしで直結でもokです。抵抗がない場合は、長く点灯するとLEDが壊れてしまうので注意してください。

# コードを見る

このサンプルは https://github.com/ms-iot/adafruitsample/tree/master/Lesson_201 にあります。 adafruitsample/Lesson_201/FullSolution/MainPage.xaml.cs を見ていく...のが筋なのですが、結構ややこしいので前回のサンプルを元に解説をします。

https://github.com/ms-iot/samples/tree/develop/HelloBlinky/CS 

参照設定で「Windows IoT Extension SDK」を追加します。
 
![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/32488/3f1c03a3-6099-945b-0ea5-b94e75802732.jpeg)


先頭で、Windows.Devices.Gpio を追加します。GpioController クラスが使えるようになります。

```csharp
using Windows.Devices.Gpio;
```

初期値です。LED のピン（LED_PIN）は5番になっています。

```csharp
private const int LED_PIN = 5;
private GpioPin pin;
private GpioPinValue pinValue;
private DispatcherTimer timer;
```


起動時に GPIO の初期設定をします。

```csharp
private void InitGPIO()
{
    var gpio = GpioController.GetDefault();

    // Show an error if there is no GPIO controller
    if (gpio == null)
    {
        pin = null;
        GpioStatus.Text = "There is no GPIO controller on this device.";
        return;
    }

    pin = gpio.OpenPin(LED_PIN);
    pinValue = GpioPinValue.High;
    pin.Write(pinValue);
    pin.SetDriveMode(GpioPinDriveMode.Output);

    GpioStatus.Text = "GPIO pin initialized correctly.";

}
```

1. GpioController.GetDefault で gpio を取得
1. gpio.OpenPin で指定のピン LED_PIN(5) をオープンします。
1. pin.Write で High に初期化
1. pin.SetDriveMode で出力モードへ

Low で電流が流れて、High で止まります。Low で LED の明かりがついて、High で消えるということですね。

タイマーループで呼び出されるのが、Timer_Tick メソッドで、チカチカさせる部分です。

```csharp
private void Timer_Tick(object sender, object e)
{
    if (pinValue == GpioPinValue.High)
    {
        pinValue = GpioPinValue.Low;
        pin.Write(pinValue);
        LED.Fill = redBrush;
    }
    else
    {
        pinValue = GpioPinValue.High;
        pin.Write(pinValue);
        LED.Fill = grayBrush;
    }
}
```

ピンの状態を pinValue で保持しているので、これを見て Low と High を切り替えます。

こんな仕組みで Windows IoT Core の Lチカができるようになります。
PHPでHTMLをXML(SimpleXMLElement)に変換したい

ちょっとはまったのでメモ

# 失敗例

ググったら出る方法。
これだと正しく変換できない。

```php:badsample.php
<?php
$html = file_get_contents("/path/to/html/file.html");

$dom = new DOMDocument();
@$dom->loadHTML($html);
$xml = simplexml_load_string($dom->saveHTML());

var_dump($xml); // Output: bool(false)

```

# 成功例

こうすればうまくいく。

```php:goodsample.php
<?php
$html = file_get_contents("/path/to/html/file.html");

$dom = new DOMDocument();
@$dom->loadHTML($html);
$xml = simplexml_import_dom($dom);

var_dump($xml); // Output: SimpleXMLElements

```

# 所感

DOMDocumentをそのまま使えよっていうツッコミはなしの方向でお願いします
Raspberry Pi 3 Model BにopenFrameworksをセットアップ

- 基本的には[openFrameworks公式の説明](http://openframeworks.cc/ja/setup/raspberrypi/raspberry-pi-getting-started/)に沿ってインストールしただけです。
- インストール作業しながらTweetしていた記録が[ここ](https://twitter.com/search?f=tweets&vertical=default&q=from%3Anariakiiwatani%20since%3A2016-12-22_11%3A44%20until%3A2016-12-26_11%3A44&src=typd)にあります。
- [クロスプラットフォームコンパイルの設定に挑戦した記録もかきました](http://qiita.com/nariakiiwatani/items/1f9364f048976637b2fb)

# この記事のゴール
Raspberry Pi 3 Model B上でopenFrameworksのサンプルをひとつ動かす

# 環境
実行環境 - Raspberry Pi 3 Model B（以下RPi）
インストールに使用するマシン - Mac OSX 10.10.5
openFrameworks 0.9.8

# 目次
[RPi SDカードのセットアップ](#RPi SDカードのセットアップ)
[RPiのセットアップ](#RPiのセットアップ)
[openFrameworksのセットアップ](#openFrameworksのセットアップ)
[openFrameworksサンプルのビルドと実行](#openFrameworksサンプルのビルドと実行)

## RPi SDカードのセットアップ
1. SDカードをフォーマットしとく。[このソフト](https://www.sdcard.org/downloads/formatter_4/eula_mac/index.html)をつかいました。
1. [ここ](https://www.raspberrypi.org/downloads/raspbian/)からOSイメージをダウンロード。遅い場合は[ここ](http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/)から。
1. イメージがダウンロードできたら[このツール](http://wakaba.c3.cx/s/apps/unarchiver.html)で解凍。Macについてるアーカイバユーティリティでは正しく解凍できない。
1. [このページ](https://www.raspberrypi.org/documentation/installation/installing-images/mac.md)の説明に沿ってSDカードにイメージを書き込み。
    2. SDカードを挿した状態でターミナルに`diskutil list`を打ち、対象SDカードのらしき`/dev/disk#`をチェック。
    3. `diskutil unmountDisk /dev/disk#`でマウント解除。（マウント状態だと次のコマンドで書き込みできない）
    4. `sudo dd bs=1m if=image.img of=/dev/rdisk#`で書き込み。image.imgはOSイメージのパス、#はチェックしたSDカードの番号。
    5. 数分で終了。`Ctrl+T`で進捗をチェックできる。

## RPiのセットアップ
1. SDカード、ディスプレイ、キーボード、マウスをRPiに接続して電源ON。[電源について注意](https://twitter.com/nariakiiwatani/status/811802386117246976)
2. `username : pi``password : raspberry`でログイン。
3. ターミナルで`sudo raspi-config`と打ち、RPiの設定。
    1. `Expand Filesystem`でSDカードの容量をフルに使えるよう拡張。
    2. `Interfacing Options`からSSHを有効化。
    3. `Advanced Options`から`Hostname`を設定しとくと後で便利。デフォルト(多分`raspberrypi`）のままでもOK
1. `sudo apt-get clean`
2. `sudo apt-get update`
3. `sudo apt-get upgrade`

※以降の作業はMacからSSH接続で行っても良い。
LANケーブルをつないで`ssh pi@raspberrypi.local`で接続できるはず。

## openFrameworksのセットアップ
[ここ](http://openframeworks.cc/ja/download/)からarmv6版をダウンロード。
armv7版にするか迷った過程は[こちら](https://twitter.com/nariakiiwatani/status/811766533772877824)
あとは[公式ガイド](http://openframeworks.cc/ja/setup/raspberrypi/raspberry-pi-getting-started/)の`Download openFrameworks`の項に従えばOK。

## openFrameworksサンプルのビルドと実行
[公式ガイド](http://openframeworks.cc/ja/setup/raspberrypi/raspberry-pi-getting-started/)の`Compile your first app`の項に従えばOK。
超初心者の2016年振り返り

今年から、やっとプログラミングを書き始めました。
最初perlでバッチを作りまして、Javaをちょっと触ったり（社内フレームワーク）、CakePHPも使ったりしていました。
Git、Git bash、SourceTree、Workbench、WinSCPなどいろんなツールを使って、Slackも登場！

でも自分で書くより、大半は既存のものを真似して、なんとなく作っただけです。実は、理解できていなかった部分が多くて、ゼロから絶対かけないと思います…:rolling_eyes:

プログラミングが難しいですが、やはりもうちょっと上達になりたいです。来年もうちょっとひとつの言語を集中して勉強できればなぁと思います。 最も難しいデバッグも自立でできるようにしたい！
自分が納得できることを目指します！:star2:

　

今年後半、開発が少なくなり、ちょっとバッチを作りましたぐらいでしたが、見事に障害もいくつ起こしました…
rm コマンドでサーバにある重要なディレクトリー以下のファイルを全部削除しちゃったこと:scream:もありました。（テスト環境でやってしまいは、運が良かった！という結論...:arrow_heading_up:）

ほかにもいろいろ面倒くさい障害を起こしましたが、チームの皆さん、時間をかかって一緒に対応していただきました。泣きたいぐらいの申し訳ないとありがたいでした…

先日研修＋忘年会で、笑い声をずっと心から出てる一日で、（笑いすぎで疲れました）。仲間がいって、幸せだなぁ:heart_exclamation:

　

今年あっという間に終わりました。いろいろ経験できで、すごく充実の一年でした。教えていただいた皆さんに本当に感謝満杯です。:beers:
2017年もがんばります！よろしくお願いいたします！:sunflower:
Androidアプリでmiracast接続してみた

hidden APIとシステム署名でmiracast接続できたのでやったことをメモしておく。

## 開発環境

* Android Studio 2.2.3
* target Android API 23

## 事前準備

### hidden APIの利用

とりあえず[anggrayudi/android-hidden-api](https://github.com/anggrayudi/android-hidden-api)からAPI 23のandroid.jarとってきてSDKのを置き換えて使っている。

### システム署名

miracast接続にはCONTROL_WIFI_DISPLAYあたりの権限が必要で、signatureOrSystemの権限が必要。

AOSPのビルド結果(build/target/product/security/)からplatform鍵(platform.pk8,platform.x509.pem)を取得してアプリに署名した。

[Android Studioでシステムアプリをビルド(2) - 社員のブログ | 株式会社スリーエース(関西 京都 iOS/Android/.NET/Web開発)](http://www.3ace-net.co.jp/blog/201505160845.html)の「2.apkにplatformの署名する。」参照

また、システム署名とは別にAndroidManifest.xmlに以下の追記が必要。

```xml
android:sharedUserId="android.uid.system"
```

## miracast接続するサンプルコード

ひとまずこんな感じで接続できる。
実際はすでにスキャン状態だと状態変化がなくてBroadcastReceiverでイベント受け取れなかったり、スキャン止めてなかったりするので対応する処理が必要。

```java
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		final DisplayManager displayManager = (DisplayManager)getSystemService(Context.DISPLAY_SERVICE);
		BroadcastReceiver receiver = new BroadcastReceiver() {
			@Override
			public void onReceive(Context context, Intent intent) {
				String action = intent.getAction();
				if (action.equals(DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED)) {
					WifiDisplayStatus wfdsatus = displayManager.getWifiDisplayStatus();
					WifiDisplay[] devices = wfdsatus.getDisplays();
					if (wfdsatus.getActiveDisplayState() != WifiDisplayStatus.DISPLAY_STATE_NOT_CONNECTED) {
						return;
					}

					for (int i = 0; i < devices.length; i++) {
						WifiDisplay display = devices[i];
						if (display.isAvailable() && display.canConnect()) {
							displayManager.connectWifiDisplay(display.getDeviceAddress());
							break;
						}
					}
				}
			}
		};

		IntentFilter filter = new IntentFilter(DisplayManager.ACTION_WIFI_DISPLAY_STATUS_CHANGED);
		registerReceiver(receiver, filter);
		displayManager.startWifiDisplayScan();
	}
```
ownCloud 9.1.xで remiレポジトリPHP 7.0.14 のphp-pecl-redis-3.1.0-1.el6.remi.7.0.x86_64 を使うとセッションが効かなくなる件について

ownCloud/Nextcloud Japan Advent Calendar 2016 - Qiita
http://qiita.com/advent-calendar/2016/owncloudjp
の12日目です。

Stylez Advent Calendar 2016 - Qiita
http://qiita.com/advent-calendar/2016/stylez
の12日目です。

表題の通りである。

# 1. 前提条件

1. CentOS 6系を使っている。(CentOS 7で発生するかどうかは未検証)
2. ownCloud/Nextcloud 9.1 系を使っている。(他のバージョンで発生するかどうかは不明)
3. Remiレポジトリのphp7.0系を使っている。(他のバージョンで発生するかどうかは不明)
4. ログインセッション情報をRedis上に保管している。

# 2. 現象

ログインしようとしても、ログイン画面に戻ってしまう。

# 3. 対策

1. php-pecl-redisのダウングレード  

php-pecl-redis-3.1.0-1.el6.remi.7.0.x86_64
のバージョンをダウングレードする。

```lang:bash
$ yum remove php-pecl-redis
$ yum install ftp://fr2.rpmfind.net/linux/remi/enterprise/6/remi/x86_64/php70-php-pecl-redis-3.0.0-1.el6.remi.x86_64.rpm
```

2. PHPのセッションストアをredisではなく、filesにする。
Cognos Report Authoring 逆引き辞典 B2 チャートのX軸/Y軸の項目を動的に変更したい

![B2.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/343de2cc-98a5-9d78-dfb8-296499cd95b2.png)

■詳細手順
http://www.slideshare.net/ShinsukeYamamoto/cognos-reportauthoring-b2axisitemchange

**Cognos Report Authoring 逆引き辞典 - 目次一覧**
http://qiita.com/shinyama/items/756cb4a40d31f6cee9f8
AWS Lambdaで退勤時刻を知らせ打刻を促す


# 概要

AWS Lambdaを使って月~金の19:00にSlackへ退勤時刻を通知し、打刻を促すメッセージを投稿する。

# AWS Lambdaでの定期実行

[チュートリアル: スケジュールされたイベントでの AWS Lambda の使用](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-scheduledevents-example.html)を参考にすると実現できそうなので、このチュートリアルを参考に進めます。

# Lambda関数を作成

- Select blueprintで「lambda-canary」を選択します。

![lambda_1.png](https://qiita-image-store.s3.amazonaws.com/0/43438/1e971049-540d-59c6-ed23-ba6434095cd2.png "lambda_1.png")

- **Configure triggers**の各項目を記入します。
	- Schedule expressionの記入方法については[こちら](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/tutorial-scheduled-events-schedule-expressions.html)を参考に指定。

![lambda_2.png](https://qiita-image-store.s3.amazonaws.com/0/43438/ba2b4da1-c9d3-00ff-554d-2143a2e115a0.png "lambda_2.png")

- **Lambda function handler and role**では、`Role*`、`Policy templates`などはチュートリアルに沿って入力していきます。

![lambda_3.png](https://qiita-image-store.s3.amazonaws.com/0/43438/ed8020fc-015a-5b49-265b-ea8f113ca6a1.png "lambda_3.png")

- **Next**をクリックし、Reviewで設定を確認後「Create function」をクリックしLambda関数を作成します。

# Lambda 関数をテスト

- 作成した関数を選択し、 **Test**を選択します。
- ダイアログが表示されるので、 **Sample event template**から **Scheduled Event**を選択し、 **Save and test**をクリックします。
- **Execution result**セクションで成否を確認します。

![lambda_4.png](https://qiita-image-store.s3.amazonaws.com/0/43438/33fdef65-78c2-a261-0b8c-314ce4b8f375.png "lambda_4.png")

# Slackへ通知するコードを書く

Environment variablesにSlackのAPI tokenを`SLACK_API_TOKEN`として登録し、`process.env.SLACK_API_TOKEN`で参照します。

```javascript
var https = require('https');
var qs = require('querystring');

exports.handler = (event, context, callback) => {
    
    var query = qs.stringify({
        'token': process.env.SLACK_API_TOKEN,
        'channel': "CHANNEL_NAME",
        'text': "@horie 退勤しましょう！\nhttps://hoge.html",
        'mrkdwn': true,
        'link_names': 1
      });
    
    var options = {
        host: 'slack.com',
        port: '443',
        path: '/api/chat.postMessage?' + query,
        method: 'POST',
        headers: {
            'Content-Type': 'application/json; charset=utf-8"'
        }
    };
    
    var req = https.request(options, function(res) {
        res.setEncoding('utf8');
        res.on('data', function(res) {
            callback(null, res);
        });
    });
    req.on('error', (e) => {
        callback(null, 'error' + e.message);
    });
    req.write('');
    req.end();
};
```

Testで関数を実行すると以下のようにSlackに通知されます。

![lambda_5.png](https://qiita-image-store.s3.amazonaws.com/0/43438/053ee98d-3640-4dea-17b5-8cad26e00fce.png "lambda_5.png")

問題が無ければCloudWatch Events - ScheduleをEnableにして完了です。

![lambda_6.png](https://qiita-image-store.s3.amazonaws.com/0/43438/1e4351e8-9708-4003-ef07-543b16765ea6.png "lambda_6.png")

# まとめ
- AWS Lambdaを利用することでサーバーレスで退勤時刻の通知と打刻を促してみました。
- 打刻を忘れないようにしましょう！

# 参考
- https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-scheduledevents-example.html
- http://dev.classmethod.jp/cloud/aws/aws-lambda-env-variables/
ハッカソンで勝つための『3Cチェック』

2016年はいくつかのハッカソンに出場し、最優秀賞含め多くの賞を受賞しました。
＃「おおさき 同好会」あたりでググったら出てくると思います。

その際、闇雲に突き進むのではなく、色々考えながら作品を作っています。

その思考プロセスをまとめてみました。
皆さんのハッカソンLIFEの参考になれば幸いです。

#ハッカソン3Cチェック(品質チェック)
このチェックは凡人向けです。天才は見なくて良いです。

溢れんばかりのアイデアや凄い技術力が毎回あるわけではありません。
じゃあ何で勝ってるかっていうと、いくつかの要素で**成果物の品質をチェック**しながら進めているところが強いかなと思っています。
どういう観点でチェックしているか整理したら、フレームワークの『3C』ぽかったので
**『ハッカソン3Cチェック』**と呼ぼうと。

![3Ccheck.png](https://qiita-image-store.s3.amazonaws.com/0/135000/bade3db2-588e-5f7c-0d5c-28de8e126c1a.png)

##Customer(審査員など)
ここでは審査員として定義します。

**・審査項目を高いレベルで満たしているか**
多くのハッカソンでは、いくつかの審査項目が設定されていると思います。
ひとつでも取りこぼすといい成績は望めません。
全て1位とはいかなくても、各項目で取りこぼしがないと良いです。

例えば、審査項目が「技術力、課題解決度、新規性」だとしたら

*「今のアイデアだったら、技術力はアピールできるな。
　課題解決力も大丈夫そうだ。
　新規性足りないかも。UI工夫して新規性アピールしないと」*

のようなアプローチです。
主観でいいんです。

審査項目がない大会は、自分達で項目を類推してチェックします。
また、審査項目以外にもポイントとなりそうなところも考えて項目として追加します。
（協賛企業うんぬんとかAPI多く使うとか）


##Competitor(他チームなど)
ここでは他チームや市場として定義します。

**・同じようなサービスはないか**
他チームと被るとだいたい負けます。
使っている技術も、自チームだけ違う方がベターですね。
また、世の中に既にあるサービスだと見透かされた時も、状況はツライでしょう。

以下の様な方法で競合チェックします。

   - (あれば)中間発表などで他チームの情報収集をする。
   - 同じようなサービスが世の中にないか、考えてみるandネットで調べてみる。

要するにオリジナリティは大事ってことですね。

##Company(自チーム)
ここでは自チームとして定義します。

**・見たことがないか(新規性)**
**・ネタで終わらないか(実用性・実現性)**

企画段階で特に意識する事として、サービスのコンセプトですね。
上記の2点は必ずチェックします。
両方を兼ねているのが大事ですね。
両者は概ね相反するので、両方兼ねているアイデアは大抵素晴らしいです。

#さいごに
**・審査項目を高いレベルで満たしているか**
**・同じようなサービスはないか**
**・見たことがないか(新規性)**
**・ネタで終わらないか(実用性・実現性)**

このチェックを期間中何度もやります。
企画の段階、開発中、プレゼンの前などなど。
振り返って軌道修正しながら、品質を高めていきます。

時間的に追い込まれて来たら、この項目は"捨てる"という判断もありです。
作品の品質の全体感が見えてると、判断も取りやすいです。


皆様の思考プロセスや方法論もぜひ教えてください。
Enjoy Hack!!
VSCodeでCodeigniterをデバッグ

**2017/01/15追記**
このやり方だと、`function index()`しかデバッグできませんね＾＾；
parameter の渡し方がわからないので、とりあえず`Launch currently open script`モードを使用してますorz



# 初稿はここから
そろそろ初心者を抜け出したくて、デバッグ環境を整えることにした。
既存環境のメンテナンスから始めようと思い、CodeIgniter のデバッグ環境を VSCode 上に構築します。

# 環境
Windows7
VSCode 1.8.1
CodeIgniter 3.1.2
xdebug 2.5.0-7.0

# xdebug の導入

https://xdebug.org/wizard.php
で導入すべき xdebug を確認。導入。
php.ini へ以下を追記。

```
zend_extension = C:\xampp\php\ext\php_xdebug-2.5.0-7.0-vc14.dll
xdebug.remote_enable=1
xdebug.remote_host="127.0.0.1"
xdebug.remote_port=9000
xdebug.remote_autostart = 1
```
zend_extension の設定は、xdebug 導入時にメッセージとして記載があったため、スンナリ行ったけど、それ以外の設定は、実はあんまり理解できていない＾＾；動かなかったので、ググって追加したおまじない。

# VSCode の設定

VSCode のデバッグボタンを押し、設定ボタンをさらに押して、lunch.json を開く。
CodeIgniter 用の設定を追加。

```
        {
            "name": "for codeigniter",
            "type": "php",
            "request": "launch",
            "program": "${workspaceRoot}\\public\\index.php",
            "args": [
                "/${fileBasenameNoExtension}"
            ],
            "stopOnEntry": true,
            "port": 9000
        },
```
あ、ディレクトリの設定は、
https://github.com/kenjis/codeigniter-composer-installer
でインストールした前提になってます。
Controller 配下にディレクトリを作って、スクリプトを書いている場合、"args" を`"/hoge/${fileBasenameNoExtension}"`みたいにすれば動くけど、スマートな方法模索中＾＾；

xdebug の導入に思った以上に時間がかかってしまった。。。
技術英語 > Let's leave these stand-ins. / Leave it to the expert.

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 143 / 12833)

> Let's leave these stand-ins.

http://ejje.weblio.jp/content/stand-in
> (映画・テレビ俳優の)代役、吹き替え、スタンドイン、代理人

上記で思い出したのが以下。
> Leave it to the expert. (専門家にまかせろ)
http://qiita.com/7of9/items/613aa9bb7153f1e573d9

なので、
意訳「それらを代理にまかせておこう」

下の例ではtoがあり、上の例ではtoがない。
クリーンアーキテクチャ+DDDでAndroidアプリを作る（序）

# はじめに

　これは、アーキテクチャや技術要素に対して個人的な思想を示す記事です。
　技術的な問題の解決策を提示するものではありませんので予めご了承ください。
　また、記事内容に誤り等がございましたら、お手数ですがコメントにてご指摘いただけると幸いです。

# 背景

　結構前にEric Evans先生のDDD本を読んだけど、全く身についた気がしない。
　その後、クリーンアーキテクチャの図を見て、わりとピンときた気がした。
　クリーンアーキテクチャとDDDは似たような考え方であるらしく、趣味で作っているアプリやなんやで、これを活かしていきたいと思ったので試しに何かを作る。（何を作るかは決めてない。）

　本記事では、（何をつくるかも決めてないけど）アプリの設計に入る前に、
　クリーンアーキテクチャのポイントについて考える。

# クリーンアーキテクチャのポイント

## The Clean Architecture - [Link](http://blog.tai2.net/the_clean_architecture.html)

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/32537/b3672b9d-6682-3144-35b1-2d4332260be3.png)

　これが上記のピンときた図（をトレースしたもの）。
　矢印は依存の関係性を示しており、内部の層は外部の層を知らない。
　図自体の説明をしている人は他に沢山いると思うので割愛。


## インフラ層は外に置くもの
　
　僕が「なるほど」と思ったのが、DBが矢印の始点になっているところ。
　今まで面倒くさいと思っていた部分の１つが、アプリとDBが密に結合していることだったので、これである程度解決することができるのかと納得できた。
　また、思想としてインフラ（手段）がドメイン（目的）に依存している形が美しいと思う。

| アーキテクチャ | 1層 | 2層 | 3層 | 4層 | 4→1層参照 |
|:-------------:|:---:|:-:|:-:|:-:|:-:|
|ﾚｲﾔ化ｱｰｷﾃｸﾁｬ|ｲﾝﾌﾗｽﾄﾗｸﾁｬ|ﾕｰｻﾞｲﾝﾀﾌｪｰｽ|ｱﾌﾟﾘｹｰｼｮﾝ|ドメイン| 可能  |
|ｸﾘｰﾝｱｰｷﾃｸﾁｬ|Framework&Drivers|Interface Adapters|Application Business Rules|Enterprise Business Rules| 不可  |
|ﾍｷｻｺﾞﾅﾙｱｰｷﾃｸﾁｬ|任意(特に定義されていない)|Port&Adapter|Application|Application| 不可  |
|ｵﾆｵﾝｱｰｷﾃｸﾁｬ|Infrastructure/UserInterface/Tests|Application Services|Domain Services|Domain Model| 不可  |

　レイヤ化アーキテクチャでは、インフラ層の参照はどこからでも可能であるので、この考え方よりクリーンアーキテクチャの方が制約が厳しくなっている。
　この考え方は、ヘキサゴナルアーキテクチャやオニオンアーキテクチャでも同じような感じらしい。


## 制御の流れを単一にすること
　
　Fluxアーキテクチャでも言われているみたいだが、クリーンアーキテクチャでも単方向の制御について言及されている。
　クリーンアーキテクチャでは、必ず以下の流れで制御しなければならない。

　コントローラー -> ユースケース -> プレゼンター

　これをAndroidで考えたとき、ActivityやViewなんかからコントローラを呼び出すことになると解釈した。
　この概念を自分なりに考えてクラス図・シーケンス図に落としてみた。

![登場人物.png](https://qiita-image-store.s3.amazonaws.com/0/32537/d091dc17-2917-8471-cfc9-57b63c994a3f.png)

![制御の流れ（flow of control）.png](https://qiita-image-store.s3.amazonaws.com/0/32537/7007e5f5-488d-ac98-78a2-a47fe9615aec.png)

　あえて図上には表現していないが、これを実現するためにはフレームワークによるDIP（ 依存関係逆転の原則）の適用が必要になる。
　最も重要なのが、ユースケースオブジェクトへのOutputPortおよびRepositoryインターフェースのインジェクション機能だと思われる。

　まずは、これを解決するためのフレームワークを考えることにする。
　今回はここまでとして、次回は適用するフレームワークについて考えたい。

# 参考

　・[エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)](https://www.amazon.co.jp/%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A8%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%B9%E3%81%AE%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88-Architects%E2%80%99Archive-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%81%AE%E5%AE%9F%E8%B7%B5-%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A8%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%B9/dp/4798121967)
　・[The Clean Architecture](https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html)
　・[クリーンアーキテクチャ(The Clean Architecture翻訳)](http://blog.tai2.net/the_clean_architecture.html)
　・[Hexagonal Architecture](http://alistair.cockburn.us/Hexagonal+architecture)
　・[ヘキサゴナルアーキテクチャ(Hexagonal architecture翻訳)](http://blog.tai2.net/hexagonal_architexture.html)
　・[The Onion Architecture](http://jeffreypalermo.com/blog/the-onion-architecture-part-1/)
　・[Flux](https://facebook.github.io/flux/)
NCMB(Unity,C#)でカウントの複数検索

NCMBでは、自分のスコアを元にランキングの順位を検索出来る。
やり方は以下に書いている。

「(自分のスコアよりも大きなものがいくつ存在するのかカウント)＋1」というやり方だ。


http://mb.cloud.nifty.com/doc/current/tutorial/unity_leaderboard.html

	  // 現プレイヤーのハイスコアを受けとってランクを取得 ---------------
	  public void fetchRank( int currentScore )
	  {
	    // データスコアの「HighScore」から検索
	    NCMBQuery<NCMBObject> rankQuery = new NCMBQuery<NCMBObject> ("HighScore");
	    rankQuery.WhereGreaterThan("Score", currentScore);
	    rankQuery.CountAsync((int count , NCMBException e )=>{

	    if(e != null){
	      //件数取得失敗
	    }else{
	      //件数取得成功
	      currentRank = count+1; // 自分よりスコアが上の人がn人いたら自分はn+1位
	    }
	      });
	  }


では、別の条件でカウントしたい場合はどうするのか。
答えはここに書かれている。

http://mb.cloud.nifty.com/assets/sdk_doc/unity/Help/html/18c107f1-7c61-f87a-9a70-716580780a40.htm

WhereXXXXXX()関数がたくさんあって、それぞれの通りに書けばＯＫ

では、複数の条件でカウントしたい場合はどうだろう。
実はその場合はWhereXXXXX()を複数個書けばよいらしい。

	    rankQuery.WhereGreaterThanOrEqualTo("Score", currentScore);
	    rankQuery.WhereLessThan("Score2", Score2);

これで両方の条件に当てはまるものを持ってきてくれる。

しかし、AND条件で持ってくるために、以下のルールではちょっと問題が起きる。

ハイスコアの決め方が、以下のルールならどうだろう。

-点数の高いものがより良い順位(500点と1000点なら1000点の勝ち)
-点数が同じ場合は死亡数の少ないものが勝ち(2回死んだ場合と1回死んだ場合は1回死んだ側の勝ち）

以下のように書いてみる。

	  // 現プレイヤーのハイスコアを受けとってランクを取得 ---------------
	  public void fetchRank( int currentScore )
	  {
	    // データスコアの「HighScore」から検索
	    NCMBQuery<NCMBObject> rankQuery = new NCMBQuery<NCMBObject> ("HighScore");
	    rankQuery.WhereGreaterThanOrEqualTo("Score", currentScore);
	    rankQuery.WhereLessThan("Death", currentDeath);
	    rankQuery.CountAsync((int count , NCMBException e )=>{

	    if(e != null){
	      //件数取得失敗
	    }else{
	      //件数取得成功
	      currentRank = count+1; // 自分よりスコアが上の人がn人いたら自分はn+1位
	    }
	      });
	  }

実はコレは思ったとおりに動作しない。

(自分のスコア)Score=100 , Death=2
(他人のスコア)Score=100 , Death=1
(他人のスコア)Score=500 , Death=3
(他人のスコア)Score=200 , Death=3

自分のスコアは、本来は4位であるが、2位となってしまう。

検索条件が

2 <= currentScore && currentDeath < 100

となっているためである。

「Ａで並び替えた後に、Ｂで並び替え」という方法ではなく
「Ａに該当　かつ　Ｂに該当」という絞込み。

複数条件によるカウント方法を用いた順位は、この方法では上手くいかないようだ。
2016年も終わりだし自分のモバイル開発について振り返ってみる

#はじめに
※一個人としての感想なので組織などの思惑とは関係ありません
※一個人のポエムです。
年末なので自分のモバイル開発について振り返ってみる

##もともと
Android+Objective-Cを専門学校で学んでいた
ー暇な時に自分で何か作ったりはしていたけど人に見せる方ではなかった

・卒業後Sierに入社して社内でObjective-Cを教えてもらったけど
　むしろ嫌いになった
　
##Swift

・Objective-Cとくらべてソースが少なかった
　ーObjCにあまり良い印象も持っていなかったけど好きになった

##勉強会

###Swift愛好会

経緯
・~.apkみたいにAndroidだと個人が勉強を開いたりJAGが勉強会を主催したり
はあるけどiOSの勉強会は少なかった（あっても上級者向け）

・iOS関連の知見を深めたかった

参加した結果
・iOSの知見が高められた
・同じ技術に興味ある知人が増えた
・何かアウトプットしろっていってくる人種が湧いた？
・ReproSDKについて関心を持った

###free-Styleもくもく会

言語未指定もくもく会
同じ言語をやってる人以外もいるので知らない人に伝える
アウトプットの練習になる
　

###まとめ

・Swiftはいいぞ
・Swift愛好会は優しい
・アウトプットは大事
ETロボコンプロジェクトを円滑にすすめるために④

# あらすじ

[ETロボコンプロジェクトを円滑にすすめるために①][]
[ETロボコンプロジェクトを円滑にすすめるために②][]
[ETロボコンプロジェクトを円滑にすすめるために③][]を読め

[ETロボコンプロジェクトを円滑にすすめるために①]: http://qiita.com/erutaso/items/323ca6f89c97b161d83d
[ETロボコンプロジェクトを円滑にすすめるために②]: http://qiita.com/erutaso/items/7b5ac7ac1bd8eafbd11b
[ETロボコンプロジェクトを円滑にすすめるために③]: http://qiita.com/erutaso/items/7ef872a34ca5228f62ae

# ETロボコンの活動を終えたあなたへ

ここまで長く険しい道のりを歩んできたあなたに、最後の重大な任務が待っている。
それは活動の振り返りだ。
活動中に学んだことを来年度以降に活かすため、良かった点や悪かった点を振り返ってもらいたい。

# そもそもなぜ振り返りが必要なのか

来年度以降はETロボコンに参加しないのに反省をする必要がないという人もいるだろう。
活動中に悪かった点を見直したのだから問題はないだろうと思うかもしれない。

しかし、実はあなたが振り返りの重要さをよく思い知っているのではないだろうか。

ちょっとした資料がなかった。
意外な協力者の存在を知らなかった。
そんなことが活動中になかっただろうか？
すべての情報が充足した状態だっただろうか？

もし、一つでも思い当たることがあるなら、それは先人が振り返りを怠っていた可能性がある。
あなたはそれのしわ寄せをもらっていたのだ。

もしかすると、誰かの責任に押し付けて、チームの問題として見ていなかったのかもしれない。

そんなことが来年度以降に発生しないように、そしてあなたの振り返りを行う能力を身につけるために時間を割いてでも振り返りを行ってもらいたい。

ここではKPTとYWTMという手法を紹介する。

ここで注意してもらいたいのが、両手法とも「問題 VS 私達」の構図にしてもらいたいことだ。
問題を起こした人の責任とするのは振り返りとは言わない。責任のなすりつけ合いとなり無意味なものとなる。
全てはチームとして想定できていなかった問題とし、何をすれば解決するのかについて審議してもらいたい。

# 振り返り手法

* KPT

非常に有名なので知っている方が多いと思うが、プロジェクトの振り返り手法の一つである。

K（Keep）で良かったこと、継続すべきことを挙げる
P（Problem）で悪かったこと、問題だったことを挙げる
T（Try）で挑戦すること、改善案を挙げる

フォーマットがとても単純であるため、その場に参加できなかったメンバへの展開も非常に楽である。
良かった点はノウハウに、悪かった点と挑戦することは次への改善案になるため、次のKeepとなる。
このサイクルが組織の地力となるため、あらゆるプロジェクトの振り返りに適応されている。

* YWTM

Y（やったこと）
W（わかったこと）
T（次にやること）
M（次にやることのメリット）

このフォーマットでは、行動して得られた結果から次にやることとそのメリットを明確にする。
もちろん、KPTで振り返りをしている最中に出てくるとは思うがYWTMではフォーマットとしてそれを明文化する。

Mをチームで合意している場合、次のYにTが必ず入る。そういう意味で、Tが「できたらいいな」ではなくなり無駄を省くことが出来る。

プロジェクト中の細かな振り返りをKPTで行い、一つの区切り（地区大会、チャンピオンシップ大会）でYWTMを行うと効果的かもしれない。

# チームに合う方法で振り返りを行おう

本記事ではKPTとYWTMについて紹介したが、チームに合う合わないは出てくるだろう。
あくまで手法の一つであるため、使いやすい方法を選ぶといい。
ただし、問題の分析だけではなく次に何をするべきかまで考えなくてはならない。
問題の責任については個人ではなくチームとして取り組むべきだが、改善は誰がいつまでに何をすると決めておかないと宙に浮いてしまうだろう。

# 最後に

ETロボコンプロジェクトを円滑にすすめるために①～④を通して、ETロボコンをより楽にするための方法を紹介した。

* プロジェクトのゴールを明確にしよう
* ゴールに至るまでのプロセスを明確にしよう
* 作り込みを重要だが異常事態の対策も忘れずに
* 振り返りは問題 VS 私達と捉えて議論しよう

上記4つについて説明してきた。
この記事を読んで何か思うところがあり、チームに持ち寄ってもらえると嬉しい。

ETロボコンというコンテンツは教育機会の提供が目的である。
様々なツールや手法を使いながらものづくりの砂場として活用してもらいたい。
そして、それを学業や業務に役立てて欲しい。
願わくば、学んだことを後輩へ引き継ぎ、組織の継続的な発展へと結びつけてもらいたい。
chibi:bit(micro:bit)間通信

# 的当てゲーム的な物

chibi:bitの特筆すべき事の一つにchibi:bit間通信が簡単に出来てしまう事が挙げられると思っています。片方で振動を検知したら、もう片方にbluetoothで当たった旨を通知するプログラムのテストをしてみました。

# PCレスでトライ...が

私は、プログラミング初心者の子供達にはパソコンを使わないでスマホやタブレットで教えるのが主流になると思っているのですが、ipadのsafariでhttp://chibibit.io/ide/ でhexファイルを作成した後、micro:bit iOSアプリのflashモードに渡す方法が判りませんでした。
micor:bitのBlockEditorだと綺麗に連携ができるのですが、何方かやりかたご存知の方がいらっしゃいましたら教えてください。

仕方がないので以下はPC+USBでテストです。（この方が100倍早いのですが...）

#画像のscroll image でエラー

受信した文字列をLEDに表示するべくscroll imageブロックを使おうとすると「変換することができませんでした」になってしまいました。

![chibi1.jpg](https://qiita-image-store.s3.amazonaws.com/0/44523/20632684-bcd5-5b46-1c29-134cb2a89956.jpeg)

根本的に使い方が違うのか、http://chibibit.io/ide/ の [Microsoft PXT](https://github.com/Microsoft/pxt-microbit) のバージョンの問題なのか未調査になります。
試しに、「変換できませんでした」と言っているプログラムをダウンロードしてセットアップしたところ、shakeすると、悲しそうな顔のイラストと共に030というエラーが表示されました。

取り急ぎ、なんでも良いのでメッセージを受信したら"Hit!"と文字を表示するように変更しました。(^^ゞ

![chibi2.jpg](https://qiita-image-store.s3.amazonaws.com/0/44523/7633c31e-4abe-04e6-09f5-35fab306b768.jpeg)


#テスト動画

[![](http://img.youtube.com/vi/0Slyx-iOABg/0.jpg)](https://www.youtube.com/watch?v=0Slyx-iOABg)
https://www.youtube.com/watch?v=0Slyx-iOABg

これをラズパイやArduinoで子供達とやろうとすると事前の準備をいろいろと考えなければならないのですが、これなら、子供達がお家に帰ってから続きが出来そうです。
chibi:bit楽しすぎというか、こんなのがタダで貰えるイギリスの子供達が羨ましい限りです。

#追記

##画像のscroll image でエラー問題

本家の Microsoft PXT https://pxt.microbit.org/?lang=en でもダメでした。ちなみに、2017/1/2現在、本家が0.6.36で、chibibit.ioが0.7.9でになります。対策として普通に「A 文字列を表示」ブロックを使えばよかったようです。

訂正版はこちら。
![名称未設定 3.jpg](https://qiita-image-store.s3.amazonaws.com/0/44523/36c63baf-96b0-ec69-4b7c-171ae6c42e73.jpeg)

訂正版を複数のchibi:bitで動かしてみた動画がこちら。
[![](http://img.youtube.com/vi/3TkRavHvq8w/0.jpg)](https://www.youtube.com/watch?v=3TkRavHvq8w)
https://www.youtube.com/watch?v=3TkRavHvq8w

子供達が一人ひとり異なるradio set group にすれば教室で複数のchibi:bitが稼働しても問題ないですね。
Vue.jsのサーバーサイドレンダリングをGAE/Goでやる #vuejs #golang

メリークリスマス！（昨日） これはVue.jsアドベントカレンダーの記事です。
代打です。

僕は初日にサーバーサイドレンダリングについて書きましたが 今回もサーバーサイドレンダリングです。

今回の内容は本当は初日に書きたかったのですがずっとうまくいかずに悩んでいたけどつい昨日できたGoサーバでのSSR（サーバーサイドレンダリング）です。

GoでSSRをするメリットとしてまず一つにポータビリティです。
Node.jsもポータビリティはありますが、Goであればアセットもワンバイナリにまとめることができるのでバイナリを配置するだけでWebUIがあるツールも作ることもできるかもしれません。

そして、僕にとって１番のメリットであるApp Engine(GAE)でSSRができるようになります！

SSRについては[初日の記事](http://qiita.com/koki_cheese/items/ce5f16111e8ca251838d)を見てください！

# サンプルの実行

[https://github.com/k2wanko/appengine-go-ssr-example](https://github.com/k2wanko/appengine-go-ssr-example/tree/7fff5eec2006b6a617696b5db3403dd27e6a8dfe)

サンプルのコードはGitHubにあげてあります。
これをベースにGoでSSRを実現するためにやったことを書いていきます。

動かし方は以下の手順です。

```bash
$ git clone https://github.com/k2wanko/appengine-go-ssr-example.git
$ git checkout -b vue2.1 7fff5eec2006b6a617696b5db3403dd27e6a8dfe
$ npm install # or yarn
$ go get -v ./...
$ npm run dev
```

`npm run dev`を実行するとで開発サーバが立ち上がります。`http://localhost:8080`にアクセスすると確認ができます。

# webpack.config.js

まずはwebpackの設定です。
基本は初日の記事のやつと同じですがGoで動かすために少し変えています。

まずGoでJSを実行するランタイムは[goja](https://github.com/dop251/goja)を使いました。
gojaはottoのようにGo実装のJavaScriptパーサです。
ottoよりもGoとのやり取りがやりやすいので使いました。
gojaについてはドワンゴのアドベントカレンダーに書いたのでそっちを見てください。
[gojaを使ってGoでJavaScriptの実行を試してみた - Qiita](http://qiita.com/koki_cheese/items/8744d5d7c23c31501e9e)

まずコードをgojaで動かせるようにする必要があります。
gojaはES5.1を実装しているのでそこの変換はbabelでやります。
次にNode.jsを前提にしているコードのためにwebpackの`NodeSourcePlugin`を利用します。
webpackでは`target: 'node'`にすると`NodeSourcePlugin`が使われないので`webpack.config.js`に追加します。
でもそれだけではまだだめで`NodeTargetPlugin`の効果を無効にする必要があります。
`NodeTargetPlugin`はnativeモジュールを外部から取ってくるようにするためのプラグインです。
`process.binding`を置き換えて対処しました。
もっとスマートなやり方があればいいのですが... そのためにはPRが必要かもしれません。

以下がserver用のコードの設定です。

```js
var NodeSourcePlugin = require('webpack/lib/node/NodeSourcePlugin')
webpackModule.rules[1].exclude = null

var binding = process.binding
process.binding = function (name) {
  if (name === 'natives') return {}
  return binding.apply(process, arguments)
}
var server = Object.assign({}, client, {
  entry: './src/server.js',
  target: 'node',
  devtool: false,
  output: Object.assign({}, client.output, {
    filename: 'server-build.js',
    libraryTarget: 'commonjs2'
  }),
  plugins: [
    new NodeSourcePlugin(
      {
        console: true,
        process: true,
        global: true,
        Buffer: true,
        setImmediate: true,
        module: 'empty',
        __filename: 'mock',
        __dirname: 'mock'
      }),
  ],
  module: webpackModule,
})
```

# setTimeout

ES5の仕様にはsetTimeoutの仕様が含まれていないのでgoja_nodejsのeventloopを使いました。

https://github.com/dop251/goja_nodejs/tree/master/eventloop


# 今後の予定

- VuexとVue Routerを使う
- 実践的なアプリケーションを作ってみる

# まとめ

というわけで、GAE/GoでSSRができました！
ETロボコンプロジェクトを円滑にすすめるために③

# あらすじ

[ETロボコンプロジェクトを円滑にすすめるために①][]
[ETロボコンプロジェクトを円滑にすすめるために②][]を読め

[ETロボコンプロジェクトを円滑にすすめるために①]: http://qiita.com/erutaso/items/323ca6f89c97b161d83d
[ETロボコンプロジェクトを円滑にすすめるために②]: http://qiita.com/erutaso/items/7b5ac7ac1bd8eafbd11b

# チャンピオンシップ大会へ進出したあなたへ

Congratulation! Congratulation!

あなたは今、地区の代表として日本一を決めるチャンピオンシップ大会に出場することが決定してる。
多くの障害を乗り切り、11月のパシフィコ横浜行きを決定した後もできることはたくさんある。
本記事では、チャンピオンシップ大会までにやっておいたほうがいいことをいくつか紹介する。

# 地区の実行委員を活用する

地区大会時は平等に接していた実行委員もチャンピオンシップ大会となると話は別である。
地区から優勝チームを出したいという気持ちにシフトし、積極的な協力をしてくれるだろう。

モデルの再提出がある部門において、地区大会時のレビュはとても貴重である。
チームの意向に沿う範囲で、全て取り入れてもよいはずだ。

もちろん、締切を厳守することは忘れてはならない。

また、地区大会と会場が異なるため、勝手がわからないところもあるだろう。
そのようなときは地区のメーリングリスト等も活用すると良い。
不安要素を消すために、利用できるものはすべて利用するべきだ。

人事を尽くして天命を待て。

# データのバックアップは必ずとること

チャンピオンシップ大会は地区大会以上に緊張するだろう。
もしかしたらふとした操作ミスでソースコードが吹き飛んでしまうこともある。
データ類のバックアップは念入りにとろう。

# 移動手段を確保しておくこと

公共交通機関の遅延はいくらでも起こりうる。
それのせいで受付に間に合わなくなってしまったらすべての努力が水の泡になってしまう。

# 当日のマニュアルを作成しておくこと

スタートの方法、パラメータの設定方法などを属人化させてしまうと僅かな試走時間を無駄にしてしまうことがある。
すべてのメンバが同じことをできるようにしておこう。

# 名刺を準備しておこう

これは学生も同じである。
せっかく全地区の参加者が集結するのに懇親会で喋るだけではもったいない。
是非とも積極的な交流をして欲しい。

私はETロボコンを通じて知った企業に就職した。
自身を売り込む場としては非常に有効な場所だろう。

# 最後に

チャンピオンシップ大会までにやることは入念な異常事態への対策である。
パラメータの調整やうまく動作しなかったソースコードへの修正も重要だが、それ以上に気をつけて欲しい。
ライントレース時の左右を間違えたなんてことがあったら悔いても悔いきれないだろう。

次の記事では、チャンピオンシップ大会後の過ごし方について説明しよう。