OmniAICreator/Qiita-1.07M huggingface dataset:
clang-formatがProblem while looking for clang-format in Chromium source treeとか吐いて死ぬ場合の対処法

chromiumやskiaのビルド環境を整えた状態でそれらと関係ないプロジェクトでclang-formatを実行すると

```shell-session
% clang-format
Problem while looking for clang-format in Chromium source tree:
  Could not find checkout in any parent of the current path.
```

とか言われて死ぬことがある

https://bugs.chromium.org/p/chromium/issues/detail?id=558447

# 解決策1: direnvを使う

direnvでchromium系のディレクトリだけdepot_toolsを有効にすれば良い

# 解決策2

自前でネイティブのclang-formatを探せばいいじゃない

```bash
#!/bin/sh

set -eu

if ! which clang-format > /dev/null 2>&1; then
  exit 1
fi

clang_format=
for qdir in '' $(echo "$PATH" | sed -e 's|:|/" "|g' | sed -e 's|^|"|' | sed -e 's|$|/"|'); do
  dir=$(echo "$qdir" | sed 's/^"//' | sed 's/"$//')
  if (! which "${dir}clang-format" 2>&1 || ("${dir}clang-format" --version 2>&1 | grep "Problem while looking for clang-format")) > /dev/null; then
    continue
  fi
  clang_format="${dir}clang-format"
  break
done

if [ -z "$clang_format" ]; then
  exit 1
fi

"$clang_format" "$@"
```
(入門) CakePHP2 でdatabase接続

* [tukiyo3/php5.6-apache - Docker Hub](https://hub.docker.com/r/tukiyo3/php5.6-apache/)

## 手順

```rb:
git clone https://github.com/tukiyo/docker-php5.6-apache
cd docker-php5.6-apache

sh files/get_cakephp.sh
chmod -R 777 app/tmp
docker-compose up
```


```rb:docker-compose.yml
web:
  image: tukiyo3/php5.6-apache
  volumes:
      - ./files/apache.conf:/etc/apache2/sites-available/000-default.conf
      - ./files/php.ini:/usr/local/etc/php/php.ini
      - ./cakephp/:/var/www/html
      - ./logs/:/var/log/apache2/
  ports:
      - "8080:80"
  #restart: always
```

![aa.png](https://qiita-image-store.s3.amazonaws.com/0/25728/324a3eda-64d3-2b2f-f7ed-1c647b19b4b2.png)


## 以下CakePHP2のメモ

### 初期設定

* app/Config/core.php
    * Security.salt
    * Security.cipherSeed
* app/Config/database.php
* app/Config/routes.php

### クラスの追加

* app/Model/Phone.php (db)
* app/Controller/PhonesController.php ($this->Phone->findとか)
* app/View/Phones/index.ctp (view)

```php:app/Model/Phone.php
class Phone extends AppModel {
    var $useTable = 'phone';
    public $validate = array(
        'number' => array(
            'rule' => 'notEmpty'
        ),
    );
}
```

```php:app/Controller/PhonesController.php
class PhonesController extends AppController {
    public $helpers = array('Html', 'Form');
    public function index() {
        $this->set('phones', $this->Phone->find('all'));
    }
}
```

```html:app/View/Phones/index.ctp
<table>
    <tr>
        <th>Id</th>
        <th>Number</th>
        <th>Created</th>
    </tr>
 
    <?php foreach ($phones as $p): ?>
        <tr>
            <td><?php echo $p['Phone']['id']; ?></td>
            <td><?php echo $p['Phone']['number']; ?></td>
            <td><?php echo $p['Phone']['date']; ?></td>
        </tr>
    <?php endforeach; ?>
    <?php unset($g); ?>
</table>
```

```diff:app/Config/routes.php
- Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));
+ Router::connect('/', array('controller' => 'phones', 'action' => 'index'));
```

### 便利機能

* `alt + shift + f` : ソース整形

* table名を複数形ではなく任意のものを指定する

```php:app/Model/Phone.php(例)
class Phone extends AppModel {
    var $useTable = 'phone';
}
```
数学を学ぶのに最も重要なこと

こんにちは！N高等学校一期生のえむけーと申します！！

高校数学のアドベントカレンダーということで、現役高校生がトップバッターというのは、なかなか縁起がいいのではないでしょうか。そうでもないでしょうか。今年も残す所一ヶ月となりました。みなさん年賀状の準備はお済みでしょうか。今年もいろいろありました。Tポイントカードはお餅でしょうか。張り切って参りましょう。よろしくお願いしますm(_ _)m

##先生に聞いてきました
私は現役高校生なので、数学は勉強中の身です。なので、これと言ってタメになる話ができるわけではありません。

というわけで数学の先生に質問してきました！！！

![suugaku.png](https://qiita-image-store.s3.amazonaws.com/0/127134/7a51021d-3414-e4b4-440f-7f9f685bc07c.png "suugaku.png")

（数学の先生に直接質問することができないので、担任を通して質問しています）

これを送ったのが11月21日なのですが、11月30日現在、返信はありません…

***私はいらない子だったんだ！！！***

非常に悲しい気持ちになったので非行に走って先生を困らせてやろうと思います。本当にありがとうございました。

##教科書を読んでみました

先生は忙しそうなので教科書に答えがないか見てみました。

> 数学Ⅰを学ぶみなさんへ
>
> みなさんは小学校で算数を6年間、中学校で数学を3年間学んできました。
> その間に、同じ公式に何度も出あったと思います。
> たとえば、小学校で習った（底辺）×（高さ）÷2という三角形の面積の公式が、その後は文字を使った式に変わりました。
> 公式を文字式で表すことによって、文字式の世界とのつながりができました。
>
> 食事をする、食べる、めしあがるなど、同じことを表すのにも、言葉を変えるだけでずいぶんと見方や考え方が変わってきます。
> 数学を学ぶときも、見方や視点を変えてみることが大切です。
> 広い視野から考えることによって、ものごとを体系的にとらえる力も養われます。
> もうこれまで9年間でいろいろなものの見方が身につき、ものごとに対して、じゅうなんにとらえることができるようになっていると思います。
>
> 数式で与えられたものも、図形で表すことによって明快になることがあります。
> すっきりとわかったときのそう快な気分を味わってください。
> これから始まる高校数学の学習が見えない力となって、みなさんの生活を豊かに支えてくれることでしょう。
>
> この教科書で学ぶ「数と式」、「2次関数」、「三角比」、「集合と論証」、「データの分析」は、高校数学のなかで最も基本となる内容です。しっかり学習していきましょう。

東京書籍さんの新・数学Ⅰより引用してみました。
Amazonで1円で買えるので、興味のある人は購入してください。

https://amazon.jp/dp/4487187273

##見方や視点を変えてみることが大切
そしてよく読んだら教科書に答えがありました！数学を学ぶうえで大切なのは

***見方や視点を変えてみること***

です！

見方や視点を変えるために有効なのは、人の話を聞くことです。
大抵の場合、自分の認識と他の人の認識は＞＜（大なり小なり）異なっていて、その認識の差異のところに「自分の視界外の世界」があります。それにたくさん触れることで見方や視点を変えることが簡単にできるようになります。なので数学の話ができるお友達をたくさん作ることが大事です。1人や2人だとその人が忙しいときに相手をしてもらえない可能性があるので、24人くらい作っておくといいですね。
本をたくさん読めばいいのですが、商業誌は万人向けに書かれているしこっちから質問できないし読んでると眠くなってしまっていつの間にか寝てしまうので苦手です＞＜（顔文字）
本をたくさん読んで人の話をよく聞くことができれば最強です。本をたくさん読む人は得た知識を人に話したがる傾向があって、聞くのが苦手だし、人の話を聞くのが好きな人は「えっ自分で読むより読んだ人の話を聞いた方がいいじゃん」って思ってるので本を読むのが苦手です（ごめんなさい）
本をよく読む人は人の話を聞くだけで最強になれるし、人の話をよく聞く人は本を読むだけで最強になれます。あなたにできないわけがない。

#まとめ
数学を学ぶのに最も重要なことは、 **見方や視点を変えてみること** であり、そのためには人の話を聞いて自分の認識との差異を探すという方法が有用であるというお話をしました。
そのための一歩として、まずは私とお友達になってくださいお願いします！！（露骨なフォロー催促）

https://twitter.com/mktoho12
https://facebook.com/ishida.makot
http://com.nicovideo.jp/community/co3311047
LINE ID: mktoho
Sype ID: mktoho

##予告
明日は[seri_k](http://qiita.com/seri_k)さんです！よろしくお願いします！！

##追記
理科の先生ですがコメントをもらいました！！
ありがとうございます！m(_ _)m

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">数学ではなく理科ですが…<br><br>理数系の「計算」は、個人的には『パズル』だと思っています。「公式」という『枠組み』の中に、正しい順序で「数字」という『ピース』をはめていく。パズルって完成するまではもやもやするけど、完成したらスッキリするのも似てます。<br>返事がないのはちょっと辛いですね <a href="https://t.co/fhiJOPMBRr">https://t.co/fhiJOPMBRr</a></p>&mdash; N高について調べる垢 (@nkou_chousa) <a href="https://twitter.com/nkou_chousa/status/804180185830432768">December 1, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
Haskell 初心者が、stack でベンチマークテストにつまった話（RTS option）

# stack で+RTSオプションを使ってベンチマークをとりました。
Haskell 初心者です。1日くらい記事探し回ってようやく、stackでRTSオプションを使える方法を見つけたので、残しておきます。

きっかけは、「Haskellによる並列・並行プログラミング」 O'Reilly　。
読んだら、サンプルを走らせようと思うのは必然の流れ。ということでサンプルをstackでインストールしました。
stack本体のインストール、設定などは詳しく紹介してくださっている人がいらっしゃるのでそちらを参考に
[stackの紹介](http://qiita.com/tanakh/items/6866d0f570d0547df026)
[インストールから実行まで](http://qiita.com/igrep/items/da1d8df6d40eb001a561)

$stack install parconc-examples
$stack build 

さて、ここまででも紆余曲折ありましたが、そこはとりあえず置いておきます。

$stack exec parinfer < benchmark.in +RTS -s

ん？

不穏な空気がひしひしと伝わる。
結果から言うと、これはうまく行きませんでした。

いろいろ調べた結果、なるほど、ghcオプション で　--rtsoptを指定してやればいいのか。ふむふむ。とおもって、paraconc-examples.cabal でghcオプションに追加。
実行してみますが、またもうまく行きません。

今まで英語のため逃げ続けてましたが、stack のHPに飛んでRTSで検索してみます。


>The stack executable is no longer built with -rtsopts. Before, when -rtsopts was enabled, stack would process +RTS options even when intended for some other program, such as when used with stack exec -- prog +RTS. See #2022.

とのことで、-- progを付けなさいと。。。

$stack exec parinfer < benchmark.in -- prog +RTS -s

これはうまく行きました。、、、長い道のりだった。
自分のための覚書きです。

今回私が得た教訓は、わからなかったらとりあえず公式にいけ。　以上です。
メールキューの確認と削除・強制再送

# はじめに

久々にpostfixのキューを確認しようと思ったらど忘れしていたので関連事項をメモしておくことにした。

# コマンド列挙

キューの確認

```
# postqueue -p
```

特定のキューの削除

```
# postsuper -d <キューID>
```

全てのキューの削除

```
# postsuper -d ALL
```

強制再送

```
# postfix flush
```

# まとめ

メモ以外の何物でも無い。
slackに書き込まれたものをhubotでLINE Notifyで送る

# TL;DR
- slackの特定のchannelに書き込まれたテキストをLINE NotifyでLINEにおくる
- LINE Notifyのaccess_tokenは適宜取得する

# script

```line_notify.coffee

# Description:
#   Line Notify bot
#
# Commands:
#  target channel hear
#
# Author:
#   tknzk

module.exports = (robot) ->

  robot.hear /.*/, (res) ->
    room = res.envelope.room
    text = res.message.text
    console.log room
    console.log text

    if room == 'TARGET CHANNEL'

      request = res.http("https://notify-api.line.me/api/notify")
        .headers("Authorization": "Bearer " + process.env.HUBOT_LINE_NOTIFY_API_TOKEN)
        .headers("Content-Type": 'application/x-www-form-urlencoded')
        .post("message=" + text)
      request (err, resp, body) ->
        if err
          res.send err
        else
          if body.length == 0
            res.send "Failed "
          else
            res.send body
```
Ionic(v1.3)でネイティブアプリ(iOS、Android)を作ってみた。

で、Ionicって？
===

- **Cordova**を拡張して作られている、モバイルUIフレームワーク
- **AngularJS**を採用している
- **HTML5でクロスコンパイルなネイティブアプリが作れる！**

※ 1系と2系があるけど、今回は1系の1.3を使ってみた。


### **つまりクール！ :+1:**


どうやって作るの？
===

色々な方法の始め方があるけど、今回は

 **Ionic Creator**

を使ってスタートしてみた。

Ionic Creator
===

ProttみたいなプロトタイピングツールちっくなWebサービス
https://creator.ionic.io/

![ionic3.png](https://dl.dropboxusercontent.com/u/22810487/blog/images/ionic3.png)

- 登録して、UIパーツをドラッグしたりしてUIを作っていく
- 途中、プレビューでページ遷移の確認も出来る！
- UIの色などもCSSで結構好き勝手に変えられる！
- UIが出来たら、プロジェクトとしてダウンロード出来る！

→ **ダウンロードして実際に実装に使いました。**

ダウンロードしたプロジェクトはこんな感じの構成

![ionic4.png](https://dl.dropboxusercontent.com/u/22810487/blog/images/ionic4.png)

コレをこのままWebにあげるとWebアプリにもなる！

ローカルのIonic開発環境はコマンドでつくります。
http://ionicframework.com/getting-started/ に乗ってる手順通り。

![ionic5.png](https://dl.dropboxusercontent.com/u/22810487/blog/images/ionic5.png)

してIonicをインストールして

ローカルで一旦適当にプロジェクト作って

![ionic6.png](https://dl.dropboxusercontent.com/u/22810487/blog/images/ionic6.png)

今回はAndroid、iOSだったので

```ionic
xxxdir/$cd myApp
xxxdir/myApp$ionic platform add ios android
```

して、iOS・Androidプロジェクトを作って
ダウンロードしたプロジェクトで上書き

![](https://dl.dropboxusercontent.com/u/22810487/blog/images/ionic7.png)

こんな感じになる
あとはゴリゴリ書くだけ！


### **いっつクール！ :+1: :+1:**

　

"controllers.js"にゴリゴリ書いていく

![](https://dl.dropboxusercontent.com/u/22810487/blog/images/ionic8.png)

こんな感じ

# 出来たー！

ってなったら、ビルドする。

```ionic
xxxdir/myApp$ionic build ios
xxxdir/myApp$ionic build android
```

XCodeプロジェクトとapkが出来るので
iOSはこのあと更にXCode開いてXCodeから普通にビルドすればOK！

### **いっつイージー！！ :+1: :+1:**

実際にストアに今は出てます。
===

# iOS

![](https://dl.dropboxusercontent.com/u/22810487/blog/images/ionic9.png)
https://itunes.apple.com/us/app/k-3-tong-ren-ji-mai-hui-ying/id1133023112?l=ja&ls=1&mt=8

# Android

![](https://dl.dropboxusercontent.com/u/22810487/blog/images/ionic10.png)
https://play.google.com/store/apps/details?id=jp.digiq.k3app&hl=ja

---

使って感じたメリット
===

- やはりクロスプラットフォームなので開発が速い！

	- 3bkアプリはiOS、Android合わせて1ヶ月くらい 

- html・CSSでUIを書くの手慣れているので(ネイティブに比べて)速い！

使って感じたデメリット
===

- UIあんまり凝れなさそう アニメーションとか凝れなそう

- 端末機能を使うのにCordovaを使うのだけど、コイツで提供されてないと結構大変

ハマりポイント
===

- runコマンドで実行した場合Codeova-Authが動かない！
	- でもrunしないとログが見れないからどこでコケてるのは今度はわからなくなる！
	- → ひたすらalertすると言う原始的な方法でデバッグした・・・

- 端末ハードウェア機能を使う為のCordovaが古かったりして探すのが大変！

個人的な総評
===

とは言えとにかく開発スピードが速いので活用して行きたい。

ライバルのOnsenUIも気になるけど・・・
それは弊社エースエンジニアがこの後記事にしてくれてます！

　

###### Created by [株式会社デジタルクエスト](https://www.digiq.co.jp) 大野 修平 ( [@saimushi](https://twitter.com/saimushi/) )
ASP.NET Web APIで認証機能付きのAPIを作成する。

# ASP.NET Web APIで認証機能付きのAPIを作成

ここに詳細に書かれていました。
[Secure a Web API with Individual Accounts and Local Login in ASP.NET Web API 2.2](https://www.asp.net/web-api/overview/security/individual-accounts-in-web-api)

上記の記事を見れば完璧です。自分が動作確認で行ったことを補足的に記載します。

# 動作確認
記事に書かれていた内容をもとに動作確認してみました。

## 1.上記サイトからソースをダウンロードし、ローカルでビルドする。

詳細は省きます。

## 2.アプリケーションを立ち上げ、適当なメールアドレスでユーザーを作成する。
![NoName_2016-12-1_9-40-36_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/73772/2292cb50-675e-d7ca-4956-28808e8b7b20.png)

## 3.ログイン処理（access_tokenを発行してもらう。）
サンプル画面にてログインして、APIをCallしても良いが、分かりやすい様にcurlでCallしてみた。

```bash
$ curl -k https://localhost:44305/token -X POST --data 'grant_type=password&username=aaaa@aaaa.co.jp&password=Password1!'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   731  100   667  100    64   2245    215 --:--:-- --:--:-- --:--:--  2245
{
  "access_token":"-R6uUYvuby5ztGaIiYkIy5S3mQCtqYukU...", # 発行されたaccess_token
  "token_type":"bearer",
  "expires_in":1209599,
  "userName":"aaaa@aaaa.co.jp",
  ".issued":"Thu, 01 Dec 2016 00:51:33 GMT",
  ".expires":"Thu, 15 Dec 2016 00:51:33 GMT"
}
```

## 4. ヘッダーに発行されたaccess_tokenをセットして、APIをCallする。

```bash
$ curl -k  https://localhost:44305/api/values -X GET -H 'Authorization: Bearer -R6uUYvuby5ztGaIiYkIy5S3mQCtqYukU...'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    25  100    25    0     0    123      0 --:--:-- --:--:-- --:--:--   123
"Hello, aaaa@aaaa.co.jp." # APIから返却された値。
```

上記の様になる。

なお、access_tokenの値が誤っていた場合は、以下の通り処理が行われない。

```bash
$ curl -k  https://localhost:44305/api/values -X GET -H 'Authorization: Bearer -R6uUYvuby5ztrerewGaIiYkIy5S3mQCtqYukU...'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    61  100    61    0     0    279      0 --:--:-- --:--:-- --:--:--   300
{"Message":"Authorization has been denied for this request."}
```

これでOKだと思う。
コミュニケーションを活性化させる取り組み & ツール群

皆さんチーム内でコミュニケーションしてますか？

僕は基本的に黙々と作業をしてしまって何も会話をしないで終わってしまう日もある質です(数年前までは)。

僕に限らず皆さんにも同じよう経験をした人は多いのではないでしょうか？

集中できる環境が整っていてプロジェクトも万事順調に進んでいれば何も問題ないのですが、定期的に以下のような問題が発生しました。

- 頑張って作った機能が他の人がイメージしていたものと違った (作業の手戻り)
- 頑張って解決したバグだが隣の人が簡単に解決する方法を知っていた (時間の無駄遣い)
- 頑張って作った機能だが実は前の人が便利なライブラリを知っていた (時間の無駄遣い)

こういった問題を解決するにはチーム内でのコミュニケーションをもっと活性化させて個人が持っている知識やスキルをチーム内にどんどん展開していくことが大事です。

## コミュニケーションを活性化させる取り組み

我々の会社では `朝会(11:05〜、コーヒー付き)` と `夕会(16:30〜、コーヒー付き)` を毎日実施してそこで issue の確認や問題点の確認などの情報共有を行うようにしています。 メンバーは全員で4人です。

朝会は1人3~5分程度タイマーを使って前日やったことや今日やることを共有します。月曜日には土日にどんなことしたかをざっくり話しこともあります(旅行に行った、映画を観たなどなど)。

Chromecast を使って issue や ZenHub (後述) のバーンダウンチャートを出して進み具合を確認したります。

夕会はタイマーは使っていませんが1人5分程度で今日やったことと現在のところの困り事を共有します。

ここでも Chromecast を使って ZenHub を観たりしています。

更にメンタルチャート(後述)を使って今日発生したイベントと今日の気分を記録するようにしています。

## ツール群

毎日実施するミーティングなので効率よく行うため色々なツールを試しています。

### Chromecast & 大きめのディスプレイ

全員で同じ画面を見れるのは非常に便利です。 おもしろ動画とかも流せて最高です。

### ZenHub

https://www.zenhub.com/

Github を拡張してバーンダウンチャートやカンバンを追加するサービスです。

みんなでバーンダウンチャートを眺めると進捗状況がひと目で分かるので便利です。

有料版を使っています。

### メンタルチャート (mencha)

https://github.com/mironal/mencha

これは言葉で説明するより下の画面を見てもらうのが分かりやすいと思います。

僕らは真ん中の部分をイベントカレンダー、下の部分をメンタルチャートと呼んでいます。

元々はエッセンシャルスクラムという本に `感情セイスモグラム` という名前で紹介されていました。

弊社エンジニアの @numa08 がこの本を読んで実際に取り組んだのが始まりです。 最初の頃はホワイトボードを使ってやっていましたが、場所が有限なため2週間分しか記録できなかったりリモートワークする場合にはホワイトボードに書けないなどの問題があったためブラウザで使えるようにしました。

今日の気分とかをここで共有できるのでそれが話のきっかけになって会話が弾みます。

<img width="792" alt="スクリーンショット 2016-11-14 21.30.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/17704/3b88d4f2-e391-0ea9-0e18-d11675812146.png">

> [エッセンシャルスクラムの該当ページ](https://books.google.co.jp/books?id=h1UuBAAAQBAJ&pg=PT528&lpg=PT528&dq=%E6%84%9F%E6%83%85%E3%82%BB%E3%82%A4%E3%82%B9%E3%83%A2%E3%82%B0%E3%83%A9%E3%83%A0&source=bl&ots=jNhtaSyKvr&sig=tRyRHVJh_xt573LUm0c0O4AHYKM&hl=ja&sa=X&ved=0ahUKEwi_69Cx4NHQAhXCfLwKHZERCqAQ6AEIHTAA#v=onepage&q=%E6%84%9F%E6%83%85%E3%82%BB%E3%82%A4%E3%82%B9%E3%83%A2%E3%82%B0%E3%83%A9%E3%83%A0&f=false)

mencha はとりあえず自分たちで使う分には十分な機能が入っていますが、一般公開するにはまだチーム機能とかが整っていないため近いうちにちゃんと機能を追加して公開したいと思います。

Beta 段階で良ければ一応ここにデプロイしていますのでご覧ください。 https://mental-chart.firebaseapp.com/

### Slack

hubot を使って朝会と夕会の時間になると `@channnel` で全員に通知するようにしています。

Slack の標準機能として cron で特定の言葉を発する機能が欲しいです...

### その他色々

この他にも色々な事を試しては止めてというのを繰り返してきました。 現在の形になってのもここ数ヶ月のことなのでこれからも変化していくと思います。

## まとめ

朝会、夕会を行って困りごとなどを共有する機会を設けたところ1日中作業に没頭してしまうことが減ってコミュニケーションする時間が増えた。

その結果、問題点や進捗状況をみんなが把握できて開発効率が上がった。

コミュニケーションを活性化させるツールを導入したところ、朝会、夕会がよりスムーズに進むようになった。
特に Chromecast の導入は効果が大きかった。 メンタルチャートは話題の提供役となってくれた。

だらだらと話してしまうこともあるので改善が必要だと思います。

しかしちょっとした無駄話みたいなところからアイディアが出たりするので無碍にできないので塩梅が難しいところです。

これからも更に開発効率をあげるために改善にコミュニケーションの面からもアプローチし続けたいと思います。
MS-Accessのエクスポートで異常に時間がかかるようになった

MS-Accessのデータを、ODBC経由でMySQLにエクスポートしている業務があります。
先週の金曜日までは、その処理時間が5分程度だったのですが、
土曜日から、急に3時間ぐらいかかるようになってしまいました。
特に、Accessのデータが急激に増加したということもないし、
何かのプログラムをインストールしたという事もありません。

何かAccessの環境の変化により、パフォーマンスが異常に悪くなったようなのですが、
何か、考えられることあるでしょうか？
Access2016です。

以上。よろしくお願い致します。
PostCSSのやっていきはじめ

## このAdvent Calendarについて

[一人React.js Advent Calendar 2014](http://qiita.com/advent-calendar/2014/reactjs) のマネをして、PostCSSについてAdvent Calendar形式で説明していきます。「PostCSSとは何か」や、実行の方法のような基本的なところから、PostCSSプラグインの紹介、PostCSSのAPIを使ってプラグインやツールの作り方 といったところまで書いていこうと思います。

僕はPostCSSを開発当初から追いかけていて、自分でいくつかプラグインやツールを作ったり、[WEB+DB PRESS](https://www.amazon.co.jp/WEB-DB-PRESS-Vol-93-%E5%8E%9F%E7%94%B0/dp/4774182427/ref=sr_1_fkmr0_3) に寄稿したり、勉強会などで発表したりしています。このAdvent Calendarの大まかな流れは、[東京Node学園祭2016](http://nodefest.jp/2016/) での発表と同じで、基本的な使い方とPostCSSのプラグインとAPIを追加したものとなります。


「PostCSS: Build your own CSS processor」

- [スライド](https://speakerdeck.com/morishitter/postcss-build-your-own-css-processor)
- [動画](https://www.youtube.com/watch?v=c653hXcvm0s)

なお、このAdvent Calendarで使用するPostCSSのバージョンは現在最新の `v5.2.6` を使っています。

## PostCSSとは

- [公式サイト](http://postcss.org/)
- [GitHub](https://github.com/postcss/postcss)

PostCSSはNode.jsで書かれたCSSツールを作るための、そしてその実行をするためのフレームワークです。ロシア人の[Andrey Stnik](https://github.com/ai)という人が開発しています。

Webアプリを作る業務の中では、後者のPostCSS製ツールやプラグインを実行するために使用することが多いです。PostCSS製のツール、プラグインとしては、ベンダープリフィックスを自動で付与する [Autoprefixer](https://github.com/postcss/autoprefixer) と、モダンなCSSリンターである [stylelint](https://github.com/stylelint/stylelint) が有名です。Autoprefixerとstylelintについては後日詳細に説明します。また、これらのエコシステムを含めて、PostCSSと呼ばれることもあります。

PostCSSは2016年末、かなり広く使われており、GitHubではスター数が12000スターを超えています。PostCSSを使用している企業やサービスとして、Facebook, GitHub, Google等、日本では [Qiitaで導入](http://qiita.com/morishitter/items/c8773b6ca69b3576626a) しています。



## PostCSSの実行方法

1日目は、明日以降に説明していくPostCSSのプラグインの実行方法について説明します。

実行方法は、PostCSSのAPIを使って書いてJavaScriptのコードをNode.jsで実行することもできますが、このAdvent Calendarではコマンドラインから実行できるように [postcss-cli](https://github.com/postcss/postcss-cli) を使います。Node.js製のタスクランナー用のプラグインもあり、[gulp](https://github.com/postcss/gulp-postcss) や [Grunt](https://github.com/nDmitry/grunt-postcss) 向けのもの等あります。

まずは、次のコマンドでpostcss-cliをインストールします。

```bash
$ npm install -D postcss-cli
```

そして、以下の内容でpostcss-cli用の設定ファイルを作成し、ファイル名を `.postcssrc.json` とします。

```json
{
  "use": [
    "autoprefixer"
  ],
  "input": "input.css",
  "output": "output.css"
}
```

ここでは入力として `input.css` を受け取り、Autoprefixerを実行して `output.css` を出力します。プラグインを追加するときは、`"use"` の配列にプラグイン名を追加します。

---

1日目では、PostCSSの簡単な説明と実行方法について説明しました。明日はPostCSSの動作の仕組み、処理の流れについて書きます。
VBAのショートカット

# 起動
`Alt+F11`

# プロシージャ(関数)の移動
`Ctrl+↑`
`Ctrl+↓`

# モジュールの移動
`Ctrl+r`から選択


# 参考
http://span.jp/office2010_manual/excel_vba/reference/excel-vba-shortcut.html
windowsでMD5を求める

# コマンド
```
certutil -hashfile RStudio-0.99.903.exe MD5
```

# 出力結果
```
MD5 ハッシュ (ファイル RStudio-0.99.903.exe):
71 6f 28 f2 14 3c 5e 21 f4 ac ea 57 52 e2 84 f8
CertUtil: -hashfile コマンドは正常に完了しました。

```

# 参考
http://d.hatena.ne.jp/EijiYoshida/20150526/1432625482
http://tech.pjin.jp/blog/2016/02/09/security_tips_hash_4/
nginxにおけるmapとその応用

nginxの設定ファイルであるnginx.confでは変数が利用できます。

```nginx
set $x_hoge_header hoge;
proxy_set_header X-Hoge-Header $x_hoge_header;
```

また、ifディレクティブによる条件分岐処理も利用できます。

```nginx
if ($request_method = POST) {
    # ...
}
```

これらを利用すると例えばUser-Agent等のヘッダ情報を元に、変数の値を代入して利用することができます。

```nginx
set $device "pc";
if ( $http_user_agent ~ iPhone) {
    set $device "iphone";
}
if ( $http_user_agent ~ Android) {
    set $device "android";
}
proxy_set_header X-Device $device;
```

このように特定の条件毎に変数の値を代入して各種ディレクティブの動作を変更する、といったニーズは現実のシステムでは結構あります。ただ、ifディレクティブで分岐させるような設定はせいぜい数個くらいが限界でしょう。

また、nginxのifディレクティブはネストや条件の複数指定ができないのでちょっと凝ったことをしようとすると設定がかなり複雑になりますし、[If is Evil](https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/)という言葉があるくらいnginxではifを多用するスタイルはあまり推奨されていません。

こういった場合に便利なのがmapディレクティブです。

# mapディレクティブ

[mapディレクティブ](http://nginx.org/en/docs/http/ngx_http_map_module.html#map)は特定の変数の値を別の変数の値に応じて設定できる機能です。例えば、さきほどUser-Agentの値に応じて変数$deviceの値を動的にセットしていましたが、

```nginx
set $device "pc";
if ( $http_user_agent ~ iPhone) {
    set $device "iphone";
}
if ( $http_user_agent ~ Android) {
    set $device "android";
}
```

これはmapディレクティブを使うと次のように書けます。

```nginx
map $http_user_agent $device {
    default pc;
    ~iPhone iphone
    ~Android android;
}
```

大分シンプルになりました。ほかにもVPNのIPアドレスかどうかのフラグとして利用したり、

```nginx
map $remote_addr $vpn {
    default 0;
    203.0.113.125 1;
}
```

Hostヘッダに応じてアップストリームを切り替える、といった設定も容易に記述可能です。

```nginx
map $http_host $backend {
    default 192.0.2.10;
    ~storage1\d.example.com 192.0.2.11;
    ~storage2\d.example.com 192.0.2.12;
    ~storage3\d.example.com 192.0.2.13;
}

server {
    # ...
    server_name *.example.com;
    location / {
        proxy_pass http://$backend;
    }
}
```

このようにnginxではmapをうまく使うことでシンプルで柔軟な設定ファイルを作成できます。

なお、mapディレクティブはhttp、streamの両コンテキストで利用可能ですが、stream向けのmapディレクティブは比較的最新のnginx-1.11.2以降でないと使えない点に注意しましょう。

# mapを応用したモジュール

nginxには以下のようにmapを応用したモジュールがあります。

* [ngx_http_geo_module](http://nginx.org/en/docs/http/ngx_http_geo_module.html)
* [ngx_http_split_clients_module](http://nginx.org/en/docs/http/ngx_http_split_clients_module.html)

## ngx_http_geo_module

[ngx_http_geo_module](http://nginx.org/en/docs/http/ngx_http_geo_module.html)はIPアドレス(とサブネットマスク)を元に変数を生成するモジュールです。mapでは文字列と正規表現によるマッチングで変数を生成していましたが、geoだとIPアドレスとサブネットマスクを元に変数の値を割り当てることができます。こんな風に。

```nginx
geo $remote_addr $is_allowed_ip_range {
    default 0;
    127.0.0.1 1;
    192.0.2.0/24 1;
}
```

## ngx_http_split_clients_module

[ngx_http_split_clients_module](http://nginx.org/en/docs/http/ngx_http_split_clients_module.html)は特定のパラメータの割り振りをパーセンテージ単位で調節出来るモジュールです。A/Bテストなんかで使うのを想定しているみたいです。例えばURLのクエリストリングを元に振り分けるのであればこんな感じで書けます。

```nginx
split_clients "${arg_user_id}" $variant {
    10% special;
    * normal;
}
```

# さいごに

nginxの変数とifディレクティブはちょっとしたことをやる分には十分ですが、分岐や変数の代入が増えてくると設定ファイルがかなり汚くなります。mapやgeoを利用するとそれなりに大がかりな仕組みでも比較的シンプルに実現できたりするのでオススメです。
CodeIgniter Advent Calendar 2016 に寄せて

こんにちは。主催のアヤトです！
このAdvent Calendarは先日の [CodeIgniter Night](https://codeigniter-talk.doorkeeper.jp/events/52872) というイベントの<a href="https://speakerdeck.com/ayato/20161104-codeigniternight-lt" title="CodeIgniterと若者 // Speaker Deck">最後のLT</a>の最中で作った物です。
是非このAdvent Calendarに参加してみて下さい。

## ざっくりCodeIgniterの解説

CodeIgniterは軽量のフレームワークで、その設計は良くも悪くも3系まで変わらず、シンプルです。
学習コストはとても軽く、PHP5のクラスの継承を知っていれば後は公式ドキュメントを読むだけで使い始める事が出来るでしょう。（≠使いこなす）

MVCの概念に従って使う事を前提にしていますが、その縛りは緩いものです。
Web開発に必要な機能が全て揃っている、という訳ではなく、むしろフレームワークとしての役割は最低限に留まっています。
その為、他のフレームワークと比べると、素のPHPに近いパフォーマンスを発揮できるという利点を持っています。以下はパフォーマンス比較の記事です。

- [PHP MVC Framework Showdown: 7.0 Performance – Will Bowman – Medium](https://medium.com/@asked_io/php-mvc-framework-showdown-7-0-performance-ba0ed09c1f54#.r099kf111)
- [PHP Framework Benchmarks for 2015 &mdash; A Day in Serenity (Reloaded) &mdash; PHP, FuelPHP, Linux or something](http://blog.a-way-out.net/blog/2015/03/27/php-framework-benchmark/)

テストである事を忘れてはいけませんが、これは利点と捉えて良いでしょう。
反面、機能が足りていない部分もあるという事で、他のフレームワークの使用経験があれば、「◯◯が無くてつらい」と思うこともあるでしょう。

## もっとCodeIgniterの情報に触れてみたい

CodeIgniterは2系までライセンス関係で揉めた事があり、2015年4月に3系がMITライセンスでリリースされるまで、日本国内の情報がほとんど停滞していた様に思います。

以前、知り合いがちょっとしたツールを作ろうとした事がありました。
彼は素のPHPを使う事に慣れていましたが、それ故にフレームワークの助けを借りずに作る苦しさも知っていました。
これを機に某フレームワークの使い方を学ぼうと頑張っていましたが、その使い方やルールを覚えるだけで四苦八苦していました。  

作りたい物に対して学習コストが重いとモチベーションの維持が難しくなります。

一方、使う技術の選定にあたっては、困った時にリーチ出来る情報の多さが決め手になり得ます。
仕事でもプライベートでも、困った時にサッと誰かに聞く事が出来る物を使いたいですよね。周りにそういう人が居なければ、書籍やググった時の情報の多さが決め手になるでしょう。
実際、前述の知り合いは日本国内の情報の多さから某フレームワークを採用していました。学習コストがかかる事は織り込み済みでしたが、「本もあるし何とかなるだろうと思っていたが、実際つらい」と言っていました。

CodeIgniterは歴史の長さに比べ、肥大化する事なくシンプルなままでいるフレームワークです。
その学習コストの低さは大きなメリットであり、日本国内の情報がもっと増えれば良いなと思っています。
もしフレームワークやPHPそのものの学び始めであれば、CodeIgniterを選択肢に加えてみてください。
また、CodeIgniterに関する知見をお持ちの方であれば、是非このAdvent Calendarに参加してみて下さい。
SQL*PlusでTSV出力

# SQL

コツは、タブ`chr(9)`区切りでSELECT句を書くところ。`&from_date`は実行時の引数で条件加えたいときの例。

```sql:sample.sql
select col_a
||chr(9)||col_b
||chr(9)||col_c
from table_a
where col_a=1000
and col_date > TO_DATE('YYYYMMDDHH24MISS',&from_date)
/
```

# シェルスクリプト

- 第１引数：実行SQL
- 第2引数：実行SQLに渡すパラメータ(実行SQLで`&`で定義)

```bash:output_tsv.sh

USER=${固定ならべた書き、可変ならパラメータ化}
PASSWORD=${バレないように環境変数か何かで定義しておく}
SID=${固定ならべた書き、可変ならパラメータ化}

outfile=`date +"%Y%m%d%H%M%S"`.tsv

sqlplus -L -S > /dev/null << EOF
${USER}/${PASSWORD}@${SID}
def from_date=${2}
set verify off
SET LINE 10000
SET PAGES 0
SET ECHO OFF
SET TRIMS ON
SET FEEDBACK OFF
SET COLSEP '' -- これはいらなかも
WHENEVER SQLERROR EXIT FAILURE
ALTER SESSION SET NLS_DATE_FORMAT='YYYYMMDD HH24:MI:SS';
-- ALTER SESSION SET CURRENT_SCHEMA=xxxxx;
spool ${out_file}
@${1}
spool off
quit;

EOF

```

# 実行

```
> ./output_tsv.sh sample.sql 20161201082710
```
QiMessaging Javascript (qiSDK js bindings) を読む

## はじめに

### QiMessaging Javascript とは？

- JavaScript から NAOqi API を呼び、Pepper, NAO 等を操作できるライブラリです。

 - [PepperタブレットにおけるJavaScript活用コンテンツ(QiMessaging JavaScript) - Qiita](http://qiita.com/Atelier-Akihabara/items/716e88b306db12751c9b)
 - [aldebaran/libqi-js: qiSDK js bindings](PepperタブレットにおけるJavaScript活用コンテンツ(QiMessaging JavaScript))

### この記事は？

- そんなライブラリのソースコードを読んで、シーケンス図・やり取りされるデータの内容等を簡単にまとめています。ライブラリ自体は 151 行しかありません。

```bash:bash
$ wc -l libs/qi/2/qi.js
     151 libs/qi/2/qi.js
```

## シーケンス図

### 図について

- 大まかな流れが分かれば良いと思っているので、結構大雑把です。
- また、Promise について、UML ではどう書いたら良いのかを知らないので、何となく読めれば良いか、くらいの適当な感じで書いてます。

### 内容について

- 大きく「セッション作成」(create session)、「モジュールのオブジェクト取得」（create module object）、「モジュールのメソッド呼び出し」(call method)部分に分けて書いています。

![libqi-js.png](https://qiita-image-store.s3.amazonaws.com/0/20418/bfad2da1-8ee5-37b8-259d-4877774eba03.png "libqi-js.png")


## データ

- js - NAOqi 間のデータ送受信は Socket.IO (v0.9.11) が使われています。

### js -> NAOqi

- "call" イベントとして、以下のような形式のデータを送信します。

```json
{
  "idm": IDM(int),
  {
    "obj": OBJ(string),
    "member": MEMBER(string),
    "args": [
      ...
    ]
}
```

- idm: セッション内のオブジェクトを識別するための ID
- obj: モジュール名
- member: メソッド名
- args: メソッドの引数

### NAOqi -> js

- "reply" イベントで以下のような形式のデータを受信します。

```json
{
  "idm": IDM(int),
  "result": {
    "pyobject": PYOBJECT(string),
    "metaobject": {
      "methods": [
        { "name": NAME(string) }, 
        ...
      ],
      "signals": [
        { "name": NAME(string) }, 
        ...
      ],
      "properties": [
        { "name": NAME(string) }, 
        ...
      ]
    }
  }
}
```

- idm: セッション内のオブジェクトを識別するための ID
- result: リクエスト結果
- pyobject: 
- metaobject: モジュール情報
- methods: メソッド一覧
- signals: シグナル一覧？
- properties: プロパティ一覧？

## 感想

- Socket.IO でデータをやり取りするだけのようですね。
- Socket.IO (v0.9.11) というのが残念なところです。
SQLアンチパターン：キーレスエントリ(外部キー嫌い)

[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/)を読み始めたので、1つ１つ書いてのメモです

# 目的

- データベースのアーキテクチャを単純化する
 - 参照整合性は、データベースの設計と運用で大切
 - 仕事で使ってたDBがMyISAMだった...（外部キーが使えない...今はinnoDB）

# アンチパターン

- 完ぺきなコードを前提にしている
 - データの関連づけを維持するためのコードを書くことになり、完璧に動いていることが必要になるから
- ミスを調べなければならない

## アンチパターンの見つけ方

- 「あるテーブルには存在するけど、もう 1 つのテーブルには存在しない値を調べるクエリは、どう書けば いい?」
 - 聞いたことある...

## 用いてもいいパターン

MyISAM...

# 解決策

- 外部キー制約を宣言する
 -[ポカヨケ](https://ja.wikipedia.org/wiki/%E3%83%9D%E3%82%AB%E3%83%A8%E3%82%B1)
- カスケード更新
 - 親の行の更新や削除が可能になり、さらにその行を参照しているあらゆる子の 行もデータベースが適切に処理してくれる

# 感想

仕事で使ってたDBがMyISAMだった...

[![](https://images-na.ssl-images-amazon.com/images/I/41qHKrFZi0L._SX389_BO1,204,203,200_.jpg)](https://www.amazon.co.jp/dp/4873115892/)
ADDA > iterative.c > SaveIterChpoint() > scalars[i].size and vectors[i].size are not written in the Chpoint file

```txt:My_Environment
Ubuntu 14.04 LTS Japanese Remix
on VMWare Fusion v8.5.2 (4635224)
on OS X El Captian v10.11.4

GNU bash, version 4.3.11(1)-release

gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 
(also for g++)
ADDA v.1.3b6
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

Related: http://qiita.com/7of9/items/9537252c79f5318d8f55
Related: http://qiita.com/7of9/items/4966f131d405cd89ee07

I am writing a tool to read Chpoint file based on the code written in SaveIterChpoint() of `iterative.c`.
https://github.com/adda-team/adda/blob/master/src/iterative.c

In the writing code, `scalars[i].size` and `vectors[i].size` are used to write scalars[i] and vectors[i] in the file as follows:


```iterative.c
static void SaveIterChpoint(void)
{
    ...
    // write specific scalars
    for (i=0;i<params[ind_m].sc_N;i++) fwrite(scalars[i].ptr,scalars[i].size,1,chp_file);
    ...
    for (i=0;i<params[ind_m].vec_N;i++) if (fwrite(vectors[i].ptr,vectors[i].size,local_nRows,chp_file)!=local_nRows)
    ...
```

The problem in reading the Chpoint file is that both the `scalars[i].size` and `vectors[i].size` ARE NOT written in the file.

Therefore I have to come up with some idea to obtain the values of `scalars[i].size` and `vectors[i].size` from somewhere else in order to read the Chpoint file.

<hr>
(Update: Dec. 02, 2016)

At least, following values need to be written as auxiliary information to read the Chpoint file:

- params[ind_m].sc_N
- scalars[i].size
- params[ind_m].vec_N
- vectors[i].size
Okinawa.rb2016 振り返り

[Okinawa.rb Advent Calendar 2016](http://qiita.com/advent-calendar/2016/okinawarb) 1日目。早速行ってみましょう！

## 簡単に自己紹介

* 開発者としては基本Web系の人。仕事で使っている言語はPHP, Java, Javascriptなど
* 他にも、クラウドとか機械学習とかボットとか(詳しくは後述)
* 兼業ボードゲームデザイナー(これも後述)

今回は、2016年のOkinawa.rbにおける自分の活動を振り返ってみようと思います。

## 2016年参加実績

今年は結構参加した印象があったのですが、数えてみたら3/11回しか参加していませんでした。[参加率 約27%]

### 第174回 Okinawa.rb Monthly Meetup!
2016-05-18（水）
[PyData.Okinawa](https://pydataokinawa.connpass.com/)で機械学習について一通り学んだ後だったのでそれについて話をしてた記憶があります。オリジナルゲームのテストプレイに機械学習/強化学習を使おうとしていました。(遠い目
あと、[CELLO](http://www.cellocad.org/)からのVerilogとか。大学時代の専攻が生物学だったので非常に気になっていたのですが、スキルのギャップが大きすぎてイマイチ踏み込めないでいます。

### 第176回 Okinawa.rb Monthly Meetup!
2016-07-13（水）
Microsoft Bot Framework + LUISでボットを作ってみた後だったので、そのデモを見せたりしました。

あと、自分がデザインしたゲーム[『ダイスロードレース』](https://bodoge.hoobby.net/games/the-dice-road-race-postcard-edition)のポストカード版がゲームストア バネストより配布されていたのもこの頃。
[Okinawa.rbでもプレイ](https://twitter.com/fullkawa/status/753226714008780800)しましたね。
ちなみに、12月10日にゲームマーケットというイベント(@東京ビッグサイト)でその[製品版](http://gamemarket.jp/game/the-dice-road-race%E3%83%80%E3%82%A4%E3%82%B9%E3%83%AD%E3%83%BC%E3%83%89%E3%83%AC%E3%83%BC%E3%82%B9/)を販売する予定です！

### 第178回 Okinawa.rb Monthly Meetup!
2016-09-14（水）
この日は、開設を記念して[YassLab](http://yasslab.jp/ja/)沖縄オフィスでの開催でした。

私はこの頃ちょうど[Last Activity](https://last-activity-24877.firebaseapp.com/)というWebサービスを開発しており、その英文チェックを[@nanophate](https://twitter.com/nanophate)さんに手伝ってもらったりしました。

### 番外編
2016-10-27（木）

2016年以前からオリジナルボードゲームのコンポーネント(ボード、コマ)製作で[gFab](http://gfab-okinawa.github.io/)の3Dプリンターやレーザーカッターを利用させていただいていましたが、上にも書いた製品版のために本格的に量産することとなり、いつものMeetupとは別日程でお邪魔しました。その節はどうも、お世話になりました！

## 総括

というわけで見事にRubyのルの字もなかったわけですが、自分にとっては例年通り。
こんな私ですが、今年もお世話になりました＆来年もよろしくお願いします！
AWS Greengrassを使おうとした（まだ使えなかった）

AWS re:Invent 2016のキーノートにて新たなサービスとしてAWS Greengrassが発表されました。

[AWS Greengrass](https://aws.amazon.com/jp/greengrass/)

発表と同時にAWS Greengrassのセッションも追加されたのですが、自分は日時を勘違いして参加できず。。。~~腹いせに自分で使ってみます~~

# AWS Greengrassとは
AWS Lambdaに対応した、IoTデバイスに組み込み可能なソフトウェアです。デバイスにLambdaを組み込めるので、リアルタイムに何か処理をさせたい時なんかに非常に便利。

<img width="975" alt="スクリーンショット 2016-11-30 12.53.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/102769/3fabc79b-ecd5-29f5-5215-56c0b792f66f.png">

エッジ側で一時処理ができないか、という話をよくIoT関連の仕事の中でしたりしますが、Greengrassを使えエッジ側の一時処理が楽になりますね。センシングして一時的にデータをフィルタリングしてからデータを送る、という効率的なクラウドへのデータ送付ができそうです。

ちなみに料金表はこちら。どこかできちんと計算したいと思います。~~（きっとAWS IoTの時のように何か気をつけるべき点があるはず、と思ってます）~~

[料金表](https://aws.amazon.com/jp/greengrass/pricing/)

# 早速使ってみる
と思いましたが、Limited Previewのため、すぐに使えるわけではなさそうですね。申し込んでみましたが、返事が来るまでしばらく待つ必要がありそうです。

# というわけで他の説明
「Benefits」に書かれていることになりますが、要約するとこんなところでしょうか。

1. ローカルでの処理をほぼリアルタイムに実施できる
2. オフライン（クラウドとの接続が途切れ途切れな環境）でも動作し、再接続時にすぐ同期してくれる
3. AWS Lambdaでプログラムできるので、デバイスプログラミングがシンプルになる
4. デバイス側の一時処理でデータのフィルタリングが可能になるので、クラウドの利用料を削減できる

# 仕組み
公式ページにとてもわかりやすい仕組みの図が載っていました。ARM または x86 architecturesをサポートする、Linuxが動作可能なデバイスが「Greengrass Core」と呼ばれる、各デバイス（AWS IoT SDKインストール済）同士を接続するHUBの役割を担うようです。もしGreengrass Coreのクラウドとの接続が切断されても、各ローカルデバイス同士は接続を保つことができるようです。

<img width="1175" alt="スクリーンショット 2016-11-30 13.20.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/102769/af14ec1e-03c8-0c96-da1f-a9cf2eef9f12.png">
出典：https://aws.amazon.com/jp/greengrass/

AWS IoT Device Shadowsにも対応しているようです。

# 所感
ぱっと公式ページを見て見ただけですが、かなりデバイス側の処理がやりやすくなりそうな気がしています。IoT分野の開発がますますスピーディにできそうです。

あとは実際に手を動かせる日が来るまで楽しみにしています。

<img width="1190" alt="スクリーンショット 2016-11-30 13.02.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/102769/331f8708-4c30-ac08-f821-d5bfca4620c6.png">
FreeBSD/RaspberryPi での Xorg のインストール

*※FreeBSD の Raspberry Pi 対応は現在進行形で、すぐ話が古くなってしまうので、ここでの話はあくまで2016年12月時点での話ということを断っておきます。*

# FreeBSD / RaspberryPi で Xorg
長らく RaspberryPi上のFreeBSD では Xorg が動かなかったり、動いても pkg が揃ってなかったりで苦労する状態でしたが、現在は X 関連の pkg もかなり充実してきたので、環境構築は楽になりました。

# 現状動く RaspberryPi は？
記事は2016/12/01 時点での話です。
以下の話は RaspberryPi B(+) / RaspberryPi Zero(新/旧) / RaspberryPi 2(旧)
を想定します。

最近動くようになった RaspberryPi 3(arm64)はまだビルドできる pkg が充実してませんし、新しいRaspberryPi 2 (V1.2)では FreeBSD 自体がまだ動かない状態です。

FreeBSD のインストール自体は[過去記事:FreeBSD で Raspberry Pi インストール](http://qiita.com/s_mitu/items/ecfcab3826fee2c873d9) を参考にしてください。

# Xorg をインストール
pkg install のみでいけます。

ウィンドウマネージャとして fluxbox を使う場合は

x11-servers/xorg-minimal (Xorg サーバ)
x11-drivers/xf86-video-scfb (video ドライバ)
x11-wm/fluxbox (ウィンドウマネージャ）

あたりを入れれば、動くのに必要な pkg が依存関係で入ると思います。

あと、追加でterminal (x11/xterm, x11/mlterm など)やfluxboxの背景を変えるために Esetroot を使うためx11/eterm や、日本語フォント japanese/font-ipa などを入れないと不便だと思います。

Web ブラウザとしては midori や dillo が pkg にあります。midori はまだ不安定っぽいです。JavaScript が使えないdilloは使えています。firefox はまだビルドできないです。

さらに人気のtwitterクライアント mikutter もpkgでインストールできます。

日本語入力は、mozc の設定画面が core を吐いて落ちてる状況でまだうまく行ってません。

#xorg.conf
xorg.conf の設定は、[FreeBSD wiki](https://wiki.freebsd.org/FreeBSD/arm/Raspberry%20Pi)からリンクされてる[ブログの記事](http://blog.cochard.me/2013/03/xorg-for-freebsd-on-raspberry-pi.html)を参考にしましたが、古い情報なのでそのままでは動きません。変更していま動作を確認しているのが以下の内容です

```xorg.conf
Section "Files"
EndSection 
Section "Module"
    Load        "dbe"
    Load    "glx"
    SubSection  "extmod"
       #Option  "omit xfree86-dga"
    EndSubSection
EndSection


Section "ServerFlags"
    Option    "AIGLX"        "True"
EndSection


Section "InputDevice"
    Identifier  "Keyboard1"
    Driver      "kbd"
EndSection


Section "InputDevice"
    Identifier  "Mouse1"
    Driver      "mouse"
    Option      "Protocol"      "auto"
    Option      "Device"        "/dev/sysmouse"
EndSection


Section "Monitor"
    Identifier  "Monitor"
EndSection


Section "Device"
    Identifier  "Generic FB"
    Driver      "scfb"
    VideoRam	64000
EndSection


Section "Screen"
    Identifier  "Screen"
    Device      "Generic FB"
    Monitor     "Monitor"
    SubSection "Display"
    EndSubsection
EndSection


Section "ServerLayout"
    Identifier  "layout"
    Screen      0 "Screen" 0 0
    InputDevice "Mouse1" "CorePointer"
    InputDevice "Keyboard1" "CoreKeyboard"
EndSection
```
# デスクトップ画面
分かりづらい写真であれですが、起動画面です

dillo を起動しているところ。
![raspberrypi-xorg-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/103137/d7cd2ec2-4780-7cd2-2a55-2da1c89f91d3.jpeg)

mikutter を起動しているところ。
![raspberrypi-xorg-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/103137/032817b8-b6b0-f844-564c-80f27e107cf3.jpeg)
ExcelのアクティブセルをすべてA1にして最初のシートをアクティブにする

めんどくさいので公開

Excelが読み取り専用モードになる問題は

Excel：保護されたビューを解除（無効）するには
http://office-qa.com/Excel/ex161.htm

の「方法(2) フォルダを信頼できる場所として指定する」等で回避?

```powershell:Set-FirstCell.ps1
function Open-ExcelAndProcess($processMethod,$filename){
   try{
           # Excelオブジェクト作成
           $excel = New-Object -ComObject Excel.Application
           $excel.Visible = $false

           # 既存のExcel
           $book = $excel.Workbooks.Open($filename)

           # その他やりたい処理
           $ret = $processMethod.Invoke($excel)

           # 上書き保存
           if($ret){
              Write-Host "ファイルをセーブします"
              $book.Save()
           }

           # 閉じる
           $excel.Quit()

   } finally {
           $excel,$book,$sheet | foreach{
              if($_ -ne $null){
                 [Runtime.InteropServices.Marshal]::ReleaseComObject($_) > $null
              }
           }
   }
}
function Set-FirstCell($excel){
   $isChange=$false
   # 初期のアクティブシートを取得し、画面出力
   $activeSheet=$excel.ActiveSheet
   Write-Host ("アクティブシート："+$activeSheet.Name)

   # Sheet名一覧を取得します。Sheetの数の配列を作成し、それぞれの名前の配列に変換してます。
   $sheetNames=1..($excel.Worksheets.Count) | % {$excel.Worksheets.Item($_).Name}

   #シート名一覧ループ
   $sheetNames | % {
      # シート名からシートオブジェクトを取得
      $sheet = $excel.Worksheets.Item($_)
      # シートを選択
      $sheet.Activate() > $null

      # アクティブセルを取得
      $activeCell=$excel.ActiveCell
      # アクティブセル座標のハッシュオブジェクトを作成
      $activeCellArray=@{x=$activeCell.Column;y=$activeCell.Row}

      # シート名を画面出力
      Write-Host ("シート名："+$sheet.Name)

      if($excel.ActiveWindow.ScrollColumn -ne 1){
         Write-Host ("ScrollColumn set to 1")
         $excel.ActiveWindow.ScrollColumn = 1
         $isChange=$true
      }
      if($excel.ActiveWindow.ScrollRow -ne 1){
         Write-Host ("ScrollRow set to 1")
         $excel.ActiveWindow.ScrollRow = 1
         $isChange=$true
      }

      # 初期座標を画面出力
      Write-Host ("x:"+$activeCellArray.x+" y:"+$activeCellArray.y)
      # アクティブセルが1ではなかった場合、A1を選択
      if(-not($activeCellArray.x -eq 1 -And $activeCellArray.y -eq 1)){
         $excel.Range("A1").Activate() > $null
         $isChange=$true
      }
   }
   # アクティブシートの名前が、一番先頭のシート名と違った場合は、先頭シートをアクティブ化
   $excel.Worksheets.Item(1).Activate() > $null
   if($sheetNames -is [Array] -And $activeSheet.Name -ne $sheetNames[0]){
      $isChange=$true
   }
   # 関数の戻り値として、シートを変更したかをリターン
   $isChange
}

foreach($arg in $args){
   Open-ExcelAndProcess ${function:Set-FirstCell} $arg
}
```

```bat:Set-FirstCell.bat
@echo off
powershell -file %~pdn0.ps1 %*
```

参考：http://qiita.com/tomoko523/items/a70bfbe65fca0b547f5c
AWS版BigQuery ? Amazon Athena

[AWS re:Invent 2016](https://reinvent.awsevents.com/)にて、[Amazon Athena](https://aws.amazon.com/jp/athena/)という、S3にストアされたデータに対してSQLを投げられるサービスが発表されました。

[AWS Blog](https://aws.amazon.com/jp/blogs/news/amazon-athena-interactive-sql-queries-for-data-in-amazon-s3/)を読む限り、色々と`Google BigQuery`に似ています。

すでにUS East (Northern Virginia), US West (Oregon)リージョンで利用可能となっています。

## BigQueryとの比較

ブログや[FAQ](https://aws.amazon.com/jp/athena/faqs/)から得られる情報によれば、AthenaのSpecは、BigQueryと比較して以下のようになっています。

||Athena|BigQuery|
|:--|:--|:--|
|クエリエンジン|Presto|Dremel|
|ストレージ|S3|Colossus|
|SQL|ANSI SQL(バージョンは?)|SQL2011(Standard SQLの場合)|
|UDF|×|Javascript, SQL|
|JDBC|○|×|
|Web UI|○|○|

Web UIはこんな感じです

![athena.png](https://qiita-image-store.s3.amazonaws.com/0/38151/ab83543e-1560-e577-864f-7b4c7264fc20.png)

サンプルとして`elb_logs`というテーブルが初めから入っています。

## 料金
Athenaではクエリに対してのみ課金が行われるようです。（とはいえ、ストレージがS3なのでその分のコストは別途かかります）

> $5 per TB of data scanned. 

とのことで、料金体系もBigQueryと同様です。

ただし、Athenaでは、SELECTする列を絞ってスキャン容量を削減するためには、**自前で**列指向フォーマットでS3に置いておく必要があるようです。

今の所、BigQueryのBilling Tier的なものは見当たらず、純粋にスキャンした容量によって料金が決まるようです。

## 感想

- JDBCに対応しているのは嬉しい
- 大きなデータセットで試してみたい
- BigQuery並みの超性能が出るならかなり期待できそうな気がします
FileMaker 関連の最新情報を得るための Webサイト

# Advent Calendar 2016
今年も Advent Calendar の時期がやってきました。[他のカレンダー勢](http://qiita.com/advent-calendar/2016)が軒並み埋まっていく中[^1]、FileMaker のカレンダーは寂しい状態なので、思いついたことを書いてみます。まだ空きはあるので、ちょっとした Tips でもいいですから皆さんも投稿してみましょう。

# FileMaker 関連の現時点でのウェブ検索の状況
まずは現時点で Google で「FileMaker」というワードで検索した場合の検索結果（2ページ分）をご覧下さい。「1年以内」という条件付きです。

![FileMaker_-_Google_検索_2016-11-27_13-52-17.png](https://qiita-image-store.s3.amazonaws.com/0/72181/652cd899-a827-a8f5-9fe2-3ce64f9c6dfe.png)

![FileMaker_-_Google_検索_2016-11-27_13-52-43.png](https://qiita-image-store.s3.amazonaws.com/0/72181/5c24fccb-346d-8d8f-1a7d-f5c02039d9a5.png)

見事なまでにほとんど公式サイトで埋め尽くされています[^2]。公式以外も、ウェブ媒体の記事や法人の記事が並んでいます。2ページ目の終わりぐらいからようやく個人の記事（昨年の Advent Calendar の記事もありますね）が並び始めます。ただ、いずれも日付が古いです。

これが **Rails** とか **TensorFlow** なんかで検索すると[^3]、最近の Qiita の記事や個人ブログ、チュートリアルサイトが1ページ目から並びます。

# FileMaker の新しい情報を得るために
確かに Google の検索の結果は芳しくありませんが、ウェブ上から FileMaker の情報は得にくくなってしまったのでしょうか。そんなことはないと思います。新しい情報が少ないだけで、基本的な情報は出揃っていると考えることもできます。5年以上前のサイトやページが上位にヒットするのがその証拠でしょう。

「静的な」情報は出揃っているので、「動的な」情報がほしい。そういう場合には検索からではなく、特定のサイトを利用しましょう。

# 新しい情報が集まるサイト
具体的には以下のサイトを利用するのがよいと思います。これらのサイトは「静的な」情報を得るためにも役立つでしょう。

### FileMaker フォーラム（公式）
公式のフォーラムです。5つの言語のフォーラムが用意されていますが、やはり英語のフォーラムが情報量が多くおすすめです[^4]。時間があるときにただタイトルを眺めて、興味があるスレッドを流し読みするだけでも得るものがあるのではないでしょうか。

- [スペース: Discussions |FileMaker Community](https://community.filemaker.com/community/discussions/)
- [スペース: 日本語フォーラム |FileMaker Community](https://community.filemaker.com/community/international_discussions/ja)

### Stack Overflow
ご存知 **Stack Overflow** です。日本語版のベータサービスが最近開始されたようですが、日本では Qiita がすでにあるので今後どうなるかは未知数ですね。

さて、Stack Oveflow にて **FileMaker** で検索して最新の結果順でソートすると直近の情報が得られます[^5]。

- [Newest posts containing 'filemaker' - Stack Overflow](http://stackoverflow.com/search?tab=newest&q=FileMaker)

### FM Forums
[Invision Power Services, Inc.](https://invisionpower.com/) による FileMaker の非公式コミュニティサイトです。上記の2つのサイトと比較すると更新（投稿）のスピードは落ちますが、検索で情報を探す場合に有用でしょう。

- [Worldwide Filemaker Community](http://fmforums.com/)

### その他
[MacLane Nova](http://maclanenova.com/) による [FileMaker Today](http://www.filemakertoday.com/) という非公式のコミュニティサイトもありますが、フォーラムを閲覧するために登録が必要だったりして、敷居が高いです。現実的な時間を考えると、上記3つのサイトの情報を消化するだけで十分ではないでしょうか。

# 問題点
上記のサイトを実際に見てみると分かりますが、いずれもスレッド型の掲示板方式で、Q&A の方式で投稿が集まります。したがって、明らかになった有用な知見や情報が投稿されることはほぼありません。

また、使用されている言語はほぼ英語です。そのため、最低でも英語のリーディングができないとつらいものがあります。ただ、近年の状況を見ていると、英語による技術情報のやりとりというものの重要性は高まっていると思います[^6]。最初は抵抗感を無くすところからでもいいので、積極的に英語の情報をやりとりできるようになると開発の幅が広がることでしょう。

[^1]: [「クソアプリ」](http://qiita.com/advent-calendar/2016/kusoapp)に参加したかった……
[^2]: http://filemaker-jp.custhelp.com/ というサイトも公式です
[^3]: 比較対象としては適切ではないかもしれませんが
[^4]: まぁ日本語と英語しか分かりませんが……
[^5]: タグで検索するとひっかからないことがある（投稿時にタグを付けていない）ので、普通に単語検索するほうがよいです
[^6]: GitHub など
コンソールで動くエディタを作る(1日目) 環境構築・文字の表示

本稿は[自作エディタをつくる Advent Calendar 2016](http://qiita.com/advent-calendar/2016/make_editor)の1日目です、レポジトリは[こちら](https://github.com/tinyco/tiny_code_editor)

# はじめに

このアドベントカレンダーは、コンソール上で動くエディタを２５日間で１から自作することを目標としています。

基本的には1人で連続で書きます。

目標としては、普通に編集できて保存できるところまで行くといいなぁ、といったところです。

なんとなくコンソールと相性が良さそうなイメージがあるC言語で書こうと思っていますが、仕事で使ったことはないので初歩的なことがミスってるかもしれません。もし参考にする場合はその点に注意してください。

レポジトリは、 https://github.com/tinyco/tiny_code_editor で公開しています。

macの標準的なbashで動作確認しています。

# hello,world.

まず、gccを入れます。brew install gccか、xcodeを入れるか、xcode-select --installで入るようです。

つぎに、ソースコードを書きます。特に解説するところがないですね。

```main.c
#include <stdio.h>

int main(void) {
  printf("hello,world.\n");
}
```

`gcc main.c`でコンパイルして、`./a.out`で実行します。hello,worldが表示されれば成功です。

`gcc main.c -o hello`を実行すると、出力される実行ファイルがa.outからhelloになり、`./hello`で実行できます。
さらにパスを通すと./が不要になり、`hello`で実行できます。ちょっとコマンドっぽいですね。(パスは\$ export PATH=\$PATH:/ダウンロード先/tiny_code_editor/src等で通せます)

# 引数を取得する

`vi sample.txt`のように、エディタが開く対象を指定できるようにしたいです。そのために、実行したときに右につけた文字列を取得したいですね。

`int main(void)`を`int main(int argc, char *argv[])`に変えると、引数の数と文字列が取得できるようです。argcの数だけargvに文字列が入っていて、それを超える添字にアクセスするとランタイムエラーが起きます。

```main.c
#include <stdio.h>

int main(int argc, char *argv[]) {
  printf("hello,world.\n");
  for(int i=0; i<argc; i++) {
    printf("receive > %s \n",argv[i]);
  }
  printf("don't receive > %s \n",argv[100]);
}
```

を実行すると

```実行結果
$ gcc main.c
$ ./a.out sample1.txt sample2.txt
hello,world.
receive > ./a.out
receive > sample1.txt
receive > sample2.txt
Segmentation fault: 11
```
になりました。

気づいたこととしては、以下です。

- 変数をprintfするときには、文字列のときは%sを、整数のときには%dを入れたところに展開されます。

- argvにはコマンド自身(今回は./a.out)も入りました。argcが0の場合は考慮しなくて良さそうですね。

- Segmentation faultは、確保してない変数へのアクセスで起きるランタイムエラーっぽいです。11はなんですかね？エラー番号？？

- argv.sizeとかargv.length的なものは無さそうです。Segmentation faultが起きる位置を把握しているならあっても良さそうな気がするんですが。アクセスした瞬間に怒られるのでif(argv[100] != NULL)とかもできなさそうですね。

# コンソールの左上から表示したい

viにしてもemacsにしても、起動した瞬間に左上から文字が書かれていると思うのですが、上のmain.cはlsやcatコマンドのように今までのコンソールの続きから出力されます(伝わりますかね？)。コンソールの、見た目の左上の位置にprintfしたいです。

調べたところ、system("cls")を使う方法もあるようですが、自分の環境では`sh: cls: command not found`でした。Windows環境のみですかね。

[ここ](https://www.grapecity.com/tools/support/powernews/column/clang/047/page02.htm)を参考に、特殊な文字`\e[2J`と`\e[1;1H`とを出力すると、前者で画面をクリアして後者で左上の位置にカーソルを移動できました。画面のクリアだけをしてもカーソル位置が上に行くわけではなさそうです。


```main.c
#include <stdio.h>

int main(int argc, char *argv[]) {
  printf("\e[2J\e[1;1H");//clear
  printf("\e[31m\e[47m");//color
  printf("hello,world.\n");
  printf("\e[39m\e[49m");//reset
  for(int i=0; i<argc; i++) {
    printf("receive > %s \n",argv[i]);
  }
}
```

色も同様の方法で付けれました(๑•̀ㅂ•́)و✧
<img width="135" alt="スクリーンショット 2016-12-01 3.35.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/151926/70a02d3f-fbd1-de4d-bd6b-3ae3b7b54c4b.png">

この特殊な文字はC言語に用意されたものではなさそうです。試しにnode.jsで似たコードを書いても動作しました。(zsh等では試せていません。)

# 今日のまとめ

- 環境構築できた
- 引数が取得できた
- 画面をクリアできた
- 文字に色がつけれた

初日・初心者なので、初歩的な内容で申し訳ないです。

先は長そうですね・・・、25日までにエディタになるんだろうか！？
MAMP PROを使ってみてぶち当たったアレコレ

# はじめに

**MAMP PRO**が便利だと勧められて、まんまと購入して使ってみたのですが、中々に便利です。
ただ、使っていくうちに色々とぶち当たったこともあるので、そういうのを備忘録代わりにまとめてみました。


# 設定ファイルの書き換え編

通常の**MAMP**の時のように、手動で`httpd.conf`や`php.ini`を書き換えても、**MAMP PRO**では再起動時に設定が元に戻ってしまいます。
どうやら**MAMP PRO**では設定画面で行う設定を、起動時に動作環境へ上書きしている感じのようです。
なので、設定を変更する場合はターミナルから直接行うのではなく、設定画面から直接設定、もしくは設定画面から設定ファイルを開く必要があります。

以下、手順。

1. MAMP PROのメインウィンドウを表示します。
2. メニューバーから`ファイル` → `テンプレートを編集`を選択します。
3. 各設定ファイルを選択すると**テキストエディット**が起動して設定ファイルが編集出来ます。

こちらで選択した設定ファイルを上書き保存すると、きちんと設定が適用されます。


# 内臓MySQLのタイムゾーン情報の設定方法編

開発中、MySQLにタイムゾーンの情報が入ってないよと怒られたので、設定した際のメモ。

> `cd /Applications/MAMP/Library/bin/`
> `./mysql_tzinfo_to_sql /usr/share/zoneinfo | ./mysql -u root mysql -p`

```shell-session:実行結果
Enter password: <- パスワード入力
Warning: Unable to load '/usr/share/zoneinfo/+VERSION' as time zone. Skipping it.

Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
```

これでタイムゾーン情報が登録されます。


# iconv関数の文字コードの変換問題編

CSV出力の処理を作成中、**SJIS-win**指定でiconv関数を使った場合に**500 Internal Server Error**でどハマりした部分になります。
調べてみると、どうやら正確には**MAMP PRO**のというよりは**macOS**の問題で、**libiconv**が**SJIS-win**に対応してないために起こるエラーのようです。

以下、検証。

* ローカル環境(macOS)

> `cd /Applications/MAMP/bin/apache2/bin/`
> `./iconv -l | grep SJIS`

```shell-session:実行結果
MS_KANJI SHIFT-JIS SHIFT_JIS SJIS CSSHIFTJIS
```

* サーバー環境(CentOS6.7)

> `iconv -l | grep SJIS`

```shell-session:実行結果
SJIS-OPEN//
SJIS-WIN//
SJIS//
```

結果 : **macOS**には**SJIS-WIN**が無い！

ですので、**macOSX**環境でiconv関数に**SJIS-win**を使った場合、**500 Internal Server Error**を引き起こすようです。
回避策としては、開発中のみ通常の**SJIS**を指定するか、別の関数を使うなどして回避するなどしたほうがいいかもしれません。

**macOS**の**iconv**で**SJIS-WIN**を扱えるようにするパッチもあるにはあるみたいです。
参照: [OSX Lion で iconv を使って WINDOWS-31J のデータを扱いたい](http://koshigoeb.hateblo.jp/entry/2012/06/23/014341)


# さいごに

今回の記事のように、たまにぶち当たる部分はありますが、基本的に**MAMP PRO**は相当にハイスペックです。
色々便利な機能はありますが、特にバーチャルホストの設定が非常に簡単なのが非常に使い勝手が良いです。
以前は、**homebrew**と**phpenv**でバージョンを切り替えれられる環境を構築していましたが、**MAMP PRO**が便利すぎて、今ではもう以前のやり方に戻れなくなってしまいました…。

**MAMP PRO**はいいぞ。