OmniAICreator/Qiita-1.07M huggingface dataset:
[symfony2.8] DiExtraBundleを使ってサービスをアノテーションで管理する

## インストール等々、セットアップはこちらから

http://jmsyst.com/bundles/JMSDiExtraBundle

## やっていること

ScheduleNotifierがSlackインスタンスを使って通知を行うようになっていると想定してください。
ScheduleNotifierが使うSlackインスタンスはDIされて使われます。

## Before

```php:service.yml
services:
    slack:
        class: AppBundle\Services\Slack
        arguments: ["%slack_name%", "%slack_channel%", "%webhook_url%"]

    schedule_notifier:
        class: AppBundle\Services\ScheduleNotifier
        arguments: ["@slack"]
```

```php:Slack.php
<?php

namespace AppBundle\Services;

use Maknz\Slack\Client;

class Slack
{
    /** @var Client  */
    private $client;

    /**
     * Slack constructor.
     *
     * @param string $slackName
     * @param string $slackChannel
     * @param string $webhookUrl
     */
    public function __construct(
        string $slackName,
        string $slackChannel,
        string $webhookUrl
    )
    {
        $settings = [
            'username' => $slackName,
            'channel' => $slackChannel,
            'link_names' => true
        ];

        $this->client = new Client($webhookUrl, $settings);
    }
}
```

```php:ScheduleNotifier.php
<?php

namespace AppBundle\Services;

class ScheduleNotifier
{
    /** @var Slack  */
    private $client;

    /**
     * ScheduleNotifier constructor.
     *
     * @param Slack $slack
     */
    public function __construct(Slack $slack)
    {
        $this->client = $slack;
    }
}
```



## After

### __service.ymlが不要になり、下記で同じ挙動をするようになります__

```php:Slack.php
<?php

namespace AppBundle\Services;

use Maknz\Slack\Client;
use JMS\DiExtraBundle\Annotation as DI;

/**
 * @DI\Service("slack")
 */
class Slack
{
    /** @var Client  */
    private $client;

    /**
     * Slack constructor.
     *
     * @DI\InjectParams({
     *     @DI\Inject("%slack_name%"),
     *     @DI\Inject("%slack_channel%"),
     *     @DI\Inject("%webhook_url%")
     * })
     *
     * @param string $slackName
     * @param string $slackChannel
     * @param string $webhookUrl
     */
    public function __construct(
        string $slackName,
        string $slackChannel,
        string $webhookUrl
    )
    {
        $settings = [
            'username' => $slackName,
            'channel' => $slackChannel,
            'link_names' => true
        ];

        $this->client = new Client($webhookUrl, $settings);
    }
}
```

```php:ScheduleNotifier.php
<?php

namespace AppBundle\Services;

use AppBundle\Services\Slack;
use JMS\DiExtraBundle\Annotation as DI;

/**
 * @DI\Service("schedule_notifier")
 */
class ScheduleNotifier
{
    /** @var Slack  */
    private $client;

    /**
     * ScheduleNotifier constructor
     *
     * @DI\InjectParams({
     *     "slack" = @DI\Inject("slack"),
     * })
     *
     * @param Slack $slack
     */
    public function __construct(Slack $slack)
    {
        $this->client = $slack;
    }
}
```

## 感想

定義ファイルが減るのはいいですね。

ただ、サービスが増えてくるとservice.ymlに一覧としてまとめて見れると
よかったりするのかなぁ。。

せっかくサービスとして切り離して再利用性を高めようとしているのに
使われなかったら意味ないですし。

Controllerへのinjectとかも設定できるようになるみたいなので
色々な用途がありそうです。

service.ymlに書いてたことはこちらで代替できそう、さらばservice.yml...
concrete5 で本番データからテスト環境を作る時のまとめ


## チェックリスト

- MySQL データベース
    - ちゃんとテスト環境 DB に変更されているか
- 自動実行ジョブ
    - 動かなくてもよいか
    - テストが必要な場合、設定がされているか
- アクセスコード削除
    - Google Analytics などのアクセス解析コードを外す
    - Mautic などの MA トラッキングコードを外す
    - ログ保存アドオンを別途用意している場合は設定を確認する
- 外部サービス API キー
    - 外部サービス API キーなどの設定をテスト用アカウントに変更しているか確認する
    - A/B テスト
    - 翻訳サービスなど
- 会員登録をしている場合は個人情報漏洩防止のため、一般会員情報を削除する
    - 大量にユーザーがある場合は MySQL よりユーザーデータを削除
    - アドオンを作成して一括削除
- メールの誤送信を防ぐ
    - config/concrete.php の設定を確認する
        - from メールアドレスをテスト用に変更する
        - email 設定を無効にする

## 設定サンプル

/application/config/concrete.php

### concrete5 メール配信設定方法

- concrete5 からのメール配信を一切停止する
- concrete5 からのメール差出人を変更する

```php="/application/config/concrete.php"
return array(
    'email'             => array(
        'enabled' => false, // ここでメール配信を停止
    ),
        // 差出人を変更
        'default' => array(
            'address' => 'concrete5-noreply@' . (isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'localhost'),
            'name'    => ''
        ),
        'form_block' => array(
            'address' => false
        ),
        'forgot_password' => array(
            'address' => null,
            'name' => null,
        ),
        'validate_registration' => array(
            'address' => null,
            'name' => null,
        ),
);
```

## 宣伝 & クレジット

この記事が役に立ったら、「 **CMS は concrete5 が一番**」と頭の中で10回唱えてください。

CMS は断然 [concrete5](https://concrete5-japan.org/)で決まり。[コンクリートファイブジャパン株式会社](https://concrete5.co.jp)がサポートできます。
LineBot(MessageApi)を試してみる-heroku版

# line botの会

----

## 今回の流れ

- 基本的な準備
- かんたんな返答Botを動かしてみる〜Heroku
- ~~かんたんな返答Botを動かしてみる〜Lambda~~
 - レンタルIAMユーザ作るの諦めました

----

## 基本的な準備
- ① LINE Business Centerに登録する
- ② Botアカウント登録
- ③ Bot設定
- ④ トークンゲット！

---

### ① LINE Business Centerに登録する
「Developer Trialを始める」を選択
https://business.line.me/ja/services/bot
※通常のlineアカウントが必要です

### 会社/事業者情報
個人名は本名じゃなくてもいいです
※個人名にしたらBotと友達登録するときの認証に表示されるので注意！

---

### ② Botアカウント登録
LINE Business Centerの<b>「アカウント一覧」</b>ポチッ

サービスは<b>「Messaging API」を選択</b>
アカウント名と業種を選択して登録！

※業種は「個人」「個人（架空）」がベターです！

---

### ③ Bot設定
登録完了画面->「LINE@MANAGER」

「Bot設定」->「APIを利用する」

Bot設定項目を設定
- Webhook送信 => <b>利用する</b>
- 自動応答メッセージ => <b>しない</b>
- 友だち追加時あいさつ => <b>しない</b>

---

### ④ トークンゲット！
「Bot設定」->「LINE Developersで設定する」 

以下の情報をメモ
- <b>Channel Secret</b>
- <b>Channel Access Token</b>(ISSUEを押すと生成)

<b>Webhook URL</b> は <b>あとで登録する</b>のでいったんおわり！

---


## かんたんな返答Botを動かしてみる〜heroku
- ① アカウントの準備
- ② 環境準備
- ③ デプロイ準備
- ④ デプロイ！！

---

## ① Herokuアカウントの準備
<b>「Sign up」から登録する</b>

https://www.heroku.com/

※Primary Development Languageは好きなのでOKです

---

## ② Heroku環境準備
<b>Heroku CLIをインストール</b>
``brew install heroku``

<b>ログイン(email&passを入力してください)</b>
``heroku login``

<b>鍵が登録されなかった人</b>
``heroku keys:add``

---

## ③ デプロイ準備①
<b>まずはHerokuでアプリ作成</b>
(APPNAMEは任意、未入力だと自動)
``heroku create APPNAME``

<b>Herokuの環境変数にトークン追加</b>
```heroku config:set LineMessageAPIChannelAccessToken={ChannelAccessToken} --app APPNAME
heroku config:set LineMessageAPIChannelSecret={ChannelSecret} --app APPNAME```

---

## ③ デプロイ準備②
<b>git clone</b>
今回は簡単なコードを用意したので任意の場所にgit cloneしてください
``git clone git@github.com:skycat-me/test-linebot.git``

<b>Herokuをリモートに追加</b>
``git remote add heroku git@heroku.com:APPNAME.git``

---

## ④ デプロイ！！
<b>デプロイ(push)</b>
``git push heroku master``

<b>Webhook urlをゲット</b>
``heroku open``

<b>LINE DevelopersでWebhook urlを設定<b>する。

作ったBotに話しかけて返ってきたら成功！


※社内でやったやつを公開
serposcope で mysql 使う

こっちに新しいの書き直しました。
http://qiita.com/ma7ma7pipipi/items/23dbdf733ba35d5d32c1

serposcope 使い方

//ポート開ける
firewall-cmd --add-port=7134/tcp --zone=public --permanent


とりあえず、起動を確認したら

ps aux | grep serposcope

でプロセスを確認しkill。
一旦終了しないとDBを使うようにならんので、必ず終了しておく。



こっからいよいよMYSQLを使う設定。
ここまでで実行完了。
つづいて、 mysql で serposcope DB を作成しておく。


/root/serposcope/serposcope.conf　のファイルに以下を記述

jdbc:mysql://localhost/serposcope?user=loginname&password=loginpass&allowMultiQueries=true



で以下のコマンドで読み込ませる。

nohup java -Dserposcope.conf=/root/serposcope/serposcope.conf -jar serposcope-2.6.0.jar

起動するたび、.confを読ませないと有効にならないので注意すること。



と、これでOK。
一応以下もやったんだけど。やらんくてもいいかも。
というか、やらなくてよかった。




wget http://ftp.iij.ad.jp/pub/db/mysql/Downloads/Connector-J/mysql-connector-java-5.1.40.tar.gz

tar zxvf mysql-connector-java-5.1.40.tar.gz
ls mysql-connector-java-5.1.40/mysql-connector-java-5.1.40-bin.jar
mysql-connector-java-5.1.40/mysql-connector-java-5.1.40-bin.jar

mv コマンドで mysql-connector-java-5.1.40/mysql-connector-java-5.1.40-bin.jar
を /usr/share/java/ に移動
ansible実行時にHomebrewをroot権限で実行して怒られたときの話

## 環境
* Python 2.7.10
* ansible 1.9.4

※ 現在Python3系 / ansible2系に移行中でありますが、今回はこんな環境

## 発生したエラーメッセージ
ansibleを実行していたらこんなエラーがでました。

```
...

TASK: [nkf/install | Install the nkf from homebrew] ***************************
failed: [127.0.0.1] => {"failed": true}
msg: Error: Running Homebrew as root is extremely dangerous and no longer supported.
As Homebrew does not drop privileges on installation you would be giving all
build scripts full access to your system.

...
```

意訳：homebrewをルートとして実行しちゃだめだよ（サポートもしないよ） = root権限にすんな！

## 対応

エラーメッセージに従って、root権限をやめます。
それらしきところを変更します。（ansibleディレクトリ構成のベストプラクティスとか踏まえると、roles配下にあるんじゃないでしょうか）

```
- name: Install the nkf from homebrew
    sudo: yes # ここがいらないので消す。
    homebrew: name=nkf state=present
```

もう一回ansibleを流したら問題なく動きましたとさ。
ansible2系になったら、sudoでなくbecomeですかね。
Nginxでmrubyを使ってredirectする時にログが出ない問題

```nginx.conf
    log_format redirect_local_ltsv 
        'domain:$host\t'
        'host:$http_x_forwarded_for\t'
        'time:$time_local\t'
        'etag:$http_etag\t'
        'etag?:$http_if_none_match\t'
        'msec:$msec\t'
    ;

    log_format redirect_absolute_ltsv 
        'domain:$host\t'
        'host:$http_x_forwarded_for\t'
        'time:$time_local\t'
        'etag:$http_etag\t'
        'etag?:$http_if_none_match\t'
        'msec:$msec\t'
    ;

    log_format redirect_google_ltsv 
        'domain:$host\t'
        'host:$http_x_forwarded_for\t'
        'time:$time_local\t'
        'etag:$http_etag\t'
        'etag?:$http_if_none_match\t'
        'msec:$msec\t'
    ;

    server {
        listen       80;

        location /index.html {
            root /Users/shinichiro/;
        }

        location ~ /redirect_local/ {
            access_log logs/redirect_local_ltsv.log redirect_local_ltsv;
            mruby_access_handler /Users/shinichiro/redirect_local.rb;
        }

        location ~ /redirect_absolute/ {
            access_log logs/redirect_absolute_ltsv.log redirect_absolute_ltsv;
            mruby_access_handler /Users/shinichiro/redirect_absolute.rb;
        }

        location ~ /redirect_google/ {
            access_log logs/redirect_google_ltsv.log redirect_google_ltsv;
            mruby_access_handler /Users/shinichiro/redirect_google.rb;
        }
    }

```

```redirect_absolute.rb
Nginx.redirect "http://sample.com/index.html" , Nginx::HTTP_MOVED_TEMPORARILY
```


```redirect_google.rb
Nginx.redirect "https://www.google.co.jp/?gws_rd=ssl" , Nginx::HTTP_MOVED_TEMPORARILY
```

```redirect_local.rb
Nginx.redirect "/index.html" , Nginx::HTTP_MOVED_TEMPORARILY
```

# 問題
redirect_absolute.rbを経由して、ホストを指定せずにローカル内でリダイレクトした時にログが出力されない。
他の2パターンはログに出力される。
Nginx + mrubyのバグだろうか。

# 解決策
とりあえずやっつける。

```redirect_local.rb
var        = Nginx::Var.new
req        = Nginx::Request.new
Nginx.redirect "http://" + var.host + "/index.html" , Nginx::HTTP_MOVED_TEMPORARILY
```
Shadertoy はじめました

![st1.png](https://qiita-image-store.s3.amazonaws.com/0/2585/0bf200ff-1b1f-74c0-8898-b248f3f02c0f.png)
https://www.shadertoy.com/view/MtGSWc （※音が出ます）

# [Shadertoy](https://www.shadertoy.com/) 楽しいデスネ！

去年(2016)末、javascript でも [SiON](https://sites.google.com/view/sion/) みたいなソフトウェアシンセを作れないかなと思って [GPGPU](https://ja.wikipedia.org/wiki/GPGPU) シンセサイザについて下調べをしていました。その際 [Shadertoy](https://www.shadertoy.com/) が GPU による音生成に対応している事を知り、裏側でどういう処理をしているのか調べていました。
残念ながら、GPGPU シンセサイザは汎用性を持たせるのは難しい、という結論に至ったのですが（この経緯については後日書きたいと思います）、先週 [GLSL 作曲入門](http://qiita.com/notargs/items/be2fa153e62e3554a773) という記事が投函され Shader Music が結構注目されているのを見て、せっかく勉強したので乗っかてみることにしました。

# どうせならちゃんと描きたい

とりあえず簡単な Shader Music を実装しようと思っていたのですが、せっかくなので Shader Art らしい絵も出したいと考えました。Shader Art の代表格である [Ray Marching](http://qiita.com/doxas/items/cafb2bd2e7cfe9ba323f) について、[Flash でガリガリ 3D してた](http://soundimpulse.sakura.ne.jp/category/3d/)頃から知識としては持っていたのですが、ちゃんと触るのは今回が初めてでした。
基本はレイトレーシングなので特に違和感なく実装できましたが、いざ触ってみると、レイトレやポリゴンでは表現の難しい様々な近似表現が簡単に実装できて、気が付けば描画の方にどっぷりハマってしまいました。

# とりあえず1週間

際限なくこだわり始めて結局何にも出さないパターンに陥りそうだったので、1週間でできたところまでで切り上げてアップしました。肝心の音楽がかなりおざなりですね。

[My First Shader Sound（※音が出ます）](https://www.shadertoy.com/view/MtGSWc)

この1週間いじってみて、記事にできそうなトピックスを書き出してみました(順不同)。基礎的な話は[doxas氏](http://qiita.com/doxas)や[notargs氏](http://qiita.com/notargs)にお任せして、隠し味みたいな位置づけで、ここら辺の話をいつか投稿できたらと思います。

### Shader Art 関連
- [角丸め六角柱](http://qiita.com/keim_at_si/items/74592439e76052c4f99f)
- [ハニカム構造](http://qiita.com/keim_at_si/items/856f995418192118bedc)
- Soft Shadow の調節
- 疑似 Ambient Occlution と、かなり疑似 Global Illumination
- [HSV2RGB 関数](http://qiita.com/keim_at_si/items/c2d1afd6443f3040e900)
- exponential でモーションにコク（笑
- １パス焦点ボケ

### Shader Music 関連
- 音楽シーケンスの構成
- ADSRエンベロープ関数
- sin波、saw波、FM合成

### Shadertoy 関連
- Shadertoyでできる事（意外と多い）
- Shadertoy 母体のソースを読む
- GPGPU シンセサイザの実装
PhantomJSでTwitterのフォロワーリクエストを自動で承認する

# コード
https://github.com/nullpos/CagedBird

追記
アプデしてblacklistとwhitelistを追加しました。
追記ココまで

```js

var page = require('webpage').create();

page.open('https://mobile.twitter.com/login', function(status) {
    if(status !== "success") {
        console.log("Unable to load url.");
        phantom.exit();
    }
    console.log('login...');
    page.evaluate(function() {
        document.getElementById("session[username_or_email]").value = "";
        document.getElementById("session[password]").value = "";
        document.forms[0].submit();
    });
    page.onLoadFinished = loggedIn
});

function loggedIn() {
    console.log('logged in.');
    page.onLoadFinished = null;
    page.open('https://mobile.twitter.com/follower_requests', function(status) {
        if(status !== "success") {
            console.log("Unable to load url.");
            phantom.exit();
        }
        console.log('fetch follower requests');
        var forms = page.evaluate(function() {
            return document.forms;
        });
        if(forms[0]) {
            console.log('requests found');
            approve();
        } else {
            console.log('no follower requests found');
            phantom.exit();
        }
    });
}

function approve() {
    var flag = page.evaluate(function() {
        if(!document.forms[0] || document.forms[0].action.indexOf("search") !== -1) {
            return false;
        } else {
            var ref = document.getElementsByClassName("fullname")[0].parentNode.href;
            document.forms[0].submit();
            return ref.replace(/.*\/(.*?)\?.*/, "$1");
        }
    });
    if(flag) {
        console.log('approve: ' + flag);
        page.onLoadFinished = approve;
    } else {
        page.onLoadFinished = null;
        console.log('approved requests');
        phantom.exit();
    }
}
```

ライセンスは適当にGPLv3
命名は適当になんかそれっぽく


# 使い方
```js
document.getElementById("session[username_or_email]").value = "";
document.getElementById("session[password]").value = "";
```
ここんとこにユーザーネーム/メールアドレスとパスワードを入れて

```
$ phantomjs ./main.js
```

とりあえず承認してくれる。

# 難点
ログインする度にTwitterから「New login to Twitter from ~~」とメールが来る
アカウントの設定でメール通知を全て無効にしてもメールが来る(当たり前だけど)
このあたりどうにかならないものか……

一応既存のものがないか調べたつもりですが、別にもっと良いものがあれば教えて戴けるとこれ幸い。。
特定条件の時特定の値をDataframeへ追加

こんな要件どこにあるんだ、とか要件に対して技術選定間違ってるだろとかそういうのは聞かなかったことにしていきたい。生きてれば色々あるさ…

### 要件
Dataframe中の特定の値が条件を満たすとき、値xを持つ列を追加。
条件を満たさない時は値xは空文字列。

### 条件とは
やんごとなき事情により、条件の持ち方はこう。

```scala
val ex:HashMap[String, HashMap[String, String]] = HashMap(
  "column_name_1" -> HashMap("columnName" -> "col1", "op" -> "EQ", value -> "value1", x -> "特定の値"),
  "column_name_2" -> HashMap("columnName" -> "col2", "op" -> "NE", value -> "value2", x -> "特定の値"),
)

```

### ぐたいてきに
exが上記の状態であるなら、
「Dataframe中のカラムcol1の値が value1 と EQ の関係である時、列column_name_1に特定の値を入れる」
「Dataframe中のカラムcol2の値が value2 と NE の関係である時、列column_name_2に特定の値を入れる」

こんなん。

### で

```scala
import org.apache.spark.sql.functions._
ex.foreach({ case(newColName:String, content:HashMap[String, String]) =>
  val udfIt = udf(decide)
  val co = ex.get(newColName).get("columnName")
  df= customerDatas.withColumn(newColName, lit(newColName))
  df= customerDatas.withColumn(newColName, udfIt(scala.Symbol(co), scala.Symbol(newColName)))
})

def decide: (String, String) => String = (dataValue:String, newColName:String) => {
  val op = ex.get(newColName).get("operator")
  val value = ex.get(newColName).get("value")

  op match {
      case "EQ" => if(dataValue.toString == value.toString) ex.get(newColName).get("x") else ""
      case "NE" => if(dataValue.toString != value.toString) ex.get(newColName).get("x") else ""
      case _ => "死"
    }
  }
```

udfにはcolしか渡せない様子。

exの要素を特定する方法が無くてかなり悩み、一旦keyをcolにしてしまうことで解決した。
同一カラム名を登録した場合後勝ちになる、ってことで良いんかねこれは。
要件が特殊な部類なのはあると思うが、もっと爽やかな解決策はないものかな…

### おまけ
javaやりこみ勢には「何お前当たり前のこといってるの？ばかなの？しぬの？」って話だろうけども、
dataframe処理内で

```scala
val numberStream = Stream.from(0).iterator
```

これをメンバ変数として持ってるclassを使おうとして、シリアライズできへんでってエラーでハマった。
(java.io.Serializable継承はしてる)
ちゃんとエラー見ればもっと早く気づけたんだろうけど、

```
org.apache.spark.SparkException: Task not serializable
```

↑にあまりに気を取られて

```
Caused by: java.io.NotSerializableException: scala.collection.immutable.StreamIterator
```

↑に気付きもしなかった。書いてあることはちゃんと読もうな、という良い教訓になった。
Twitter の特定アカウントのツイートをフィルタリングしてみる

ある人の発言
>「任意のアカウントのいいねとRTを集めて、さらにフィルタできるアプリがあったらすごく情報収集が捗りそうですね。」

たしかに、気になったアカウントがあっても、どんな人気のツイートをしているかはすぐにフィードからなくなるので確かめにくいですよね。

アプリの前にとりあえずエクセルでやってみました。同じやり方でPowerBI などのBI でフィルタリングしたTweet データを表示したり、アプリで同じことを行うことができます。

#CData Excel Add-in について
CData Drivers にExcel のUI を付けた製品です。80以上（2017/12現在）のデータソースに対応しています。Twitter は人気データソースの一つです。Excel 画面からSQL すら書くことなくクラウドサービスのデータをExcel テーブルにロードが可能です。ロードしたデータをExcel 上で更新、削除も可能です。新しいデータの挿入も可能ですので、例えばTweets というテーブルに挿入すると、、、Twitter に新しいTweet をすることもできます。
よくあるケース：
[庶民のBI](http://www.cdata.com/jp/blog/data_connectivity/20151211-excel-as-bi-tool)
[Salesforce などSaaS のデータクレンジングツール](https://www.youtube.com/watch?v=-nHy4k4sUek&t=72s)
[Excel データのDB への移ツール行](https://qiita.com/kasoorimethi/items/5d6b90479d388aea9a06)
[SaaS 間の手動ETL ツール](https://qiita.com/kasoorimethi/items/b3f858e17709f7d6bd82)

この記事では、BI・アナリティクスに近い使い方であるツイート分析の為のデータ作成をしてみます。

#準備
1. CData Excel Add-in をダウンロードします。30日の無償トライアルが使えます。
http://www.cdata.com/jp/drivers/twitter/excel/

2. Twitter のアプリを作成します
API を使用する為にTwitter アプリを作る必要があります。
    - https://dev.twitter.com/apps にログインします。
    - ［Create New App］をクリックします。
    - ユーザーが接続時に表示される［Name］、［Description］、［Website］を入力します。
    - コールバックURL をhttp://127.0.0.1/ に設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/116843/2071da38-30c5-7d1b-7255-a7071ac077f6.png)
- アプリ作成後に［Keys and Access Tokens］のタブで［Consumer Key (API Key)］、［Consumer Secret (API Secret)］、［ Access Token］、［Access Token Secret］を確認して、後で使うので取っておきます。



#Twitter から特定アカウントでフィルタ、Tweets をRT数でソートしてExcel に取り込む
1. Twitter アプリとの接続を確立
![ConnectionExcel.png](https://qiita-image-store.s3.amazonaws.com/0/116843/a205dba2-3455-9a41-0525-ea326d92dc96.png)
http://cdn.cdata.com/help/GTB/xls/pg_connectingtotwitterxls.htm

2. 取得したいアカウントのScreen_Name がわからないときは一度「Following」テーブルで確認
![スクリーンショット (214).png](https://qiita-image-store.s3.amazonaws.com/0/116843/d8efcb3d-bf5e-3031-fc22-c43527792062.png)
![スクリーンショット (215).png](https://qiita-image-store.s3.amazonaws.com/0/116843/1a0daf15-c32f-9512-8943-813e43cc5b3a.png)

3. 「Tweets」テーブルで取得したいアカウントのツイートを取得
とりあえず今回はアカウントを特定して、Retweet が多い順に100ツイートを取得します。
CData コンポーネントはWeb APIを直接叩かずに標準SQL で書けるのが素晴らしいです。
```
SELECT  *  FROM [Tweets] WHERE Screen_Name = 'Screen Name' ORDER BY Retweet_Count DESC LIMIT 100
```
Twitter API はリミット制限が結構厳しいのでリミットにヒットしたら、解除されるまで1時間待ちましょう。

5. これでExcel テーブルとして、ツイートが取得されます。
![スクリーンショット (222).png](https://qiita-image-store.s3.amazonaws.com/0/116843/2d27fc3d-42b0-dcdf-4462-3eb205d13847.png)

なんだか、Twitter UI からは覗けないものを除いた感じで楽しいですね。
Dockerの不要なimageやコンテナ消すのに変なスクリプトはいらないYO

1.13からはsystemコマンドがサポートされています。

```
$ docker system prune --help

Usage:  docker system prune [OPTIONS]

Remove unused data

Options:
  -a, --all     Remove all unused images not just dangling ones
  -f, --force   Do not prompt for confirmation
      --help    Print usage
```
H2DBで Table not found になって困ってたら大文字小文字の違いが原因だった⇒DATABASE_TO_UPPER=false を指定して解決

掲題で嵌ったので、取り急ぎ記録しておきます。

本番は mysql ですが、DBにアクセスするコードのテストは H2DB（in memory） を使用して書いています。

以下では、本番の mysql には sakanasakana テーブルが存在するとします。

テスト用の H2DB のセットアップは、 URL に INIT=RUNSCRIPT FROM 'schema.sql' として初期化処理を shema.sql に記述します。schema.sql ではテーブルの作成とテストデータの読み込みを行います。

```schema.sql
DROP TABLE IF EXISTS sakanasakana;
CREATE TABLE `sakanasakana` (
  `sakana` varchar(10) NOT NULL,
  `atama` varchar(10) NOT NULL,
  `yokunaru` double DEFAULT NULL
);

insert into sakanasakana select * from csvread('resources/sakanasakana .csv');
```

Query は slick 記法に則ります。そのため、Table を定義します。

```Tables.scala（一部です）
  class SakanasakanaTable(tag: Tag) extends Table[Sakanasakana] (tag, "sakanasakana") {
    def sakana          = column[String]("sakana")
```

こうして sakanasakana テーブルを参照するテストコードを書くと、Table not found になります。上記の (tag, "sakanasakana") を (tag, "SAKANASAKANA") というように大文字に変更するとテーブルを参照できるようになりますが、本番の mysql のテーブル名と異なるので、本番でエラーになってしまいます。

解決策ですが、
H2DB の URL に DATABASE_TO_UPPER=false; を追加したところ、参照できました。
Pythonの標準ライブラリとPillowで分散を画像のRGBの標準偏差を求めて、単色かどうかを判定する


画像が単色かどうかの判定をしたくって、いろいろ調べてたんですが、簡単に調べる方法がなさそうなんですよね

考えた結果、RGBの分散求めて0だったら単色と判断したら良いんじゃないかと

numpyとか使えばぱぱっと分散計算できるんですが、これだけのためにnumpyとか入れたくないなぁと思い、標準ライブラリとPillowだけで実装しました


```python
from PIL import Image
rgb = list(Image.open(que.image).getdata())
avg_rgb = [sum(x)/len(rgb) for x in zip(*rgb)]
var_rgb = [sum(map(lambda p: (p - a) ** 2, x)) / len(x) for x, a in zip([t for t in zip(*rgb)], avg_rgb)]
std = sqrt(sum(var_rgb))
```


これで、`sum(var_rgb)==0`で単色なはず

追記 : 分散が0だとちょっきり単色すぎて、使い物にならない。標準偏差まで計算して、使うのが良い。しきい値は判定したいものによるが、25ぐらいで実用的には良さそう


そういえば、PillowのImageからRGBを取得するところで`decoder jpeg not available`とうエラーが出まして

```
brew install libjpeg
pip uninstall pillow
pip install pillow
```

で治りました。libjpegが入ってなかった、pillowのバージョンが古かったっぽいですね。
Jupyterでサーバ管理( 1 )  import　

jupyter で、サーバ管理はじめました。
いろんなライブラリをつかうので、標準的に import しておくには
なにがいいかを手探りしています。

現時点(2017.2.7)時点ではとりあえずこれです。
最後に、'import' と書いてあるのがポイントです。
hide input で、セルそのものを見えなくするときに、
ここに、なんのセルがあったのかを示すためです。

```
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# routine work 用 import list
import os,sys,re,json,codecs,inspect,platform


# 表示関連
from pprint import pprint as pp
from IPython.display import display,HTML

# 日付時刻
import datetime
import time
from datetime import datetime as dt


# pandas 
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

#network
import requests
import socket,ssl
import lxml

# fabric
from fabric.api import env,sudo,get,run,put,local,execute,hosts 
from fabric.decorators import task,hosts 
from fabric.context_managers import hide

#  mysql データベース読み込み 
import pymysql
import sqlite3

# utility
import getpass
import difflib


# selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException

# excel
import openpyxl as px

'import'
```
CentOS7.xでPhantomJSの画面キャプチャに日本語を表示させる


# 始めに

CentOSでPhantomJSを使って画面キャプチャを撮ったら日本語が表示されなくて、調べてみたら先人の記事があった。

[CentOSからPhantomJSを実行すると画面キャプチャの日本語が表示されなくなる問題 - Qiita](http://qiita.com/n-takahashi/items/3dd810ebdf236fce6f13)

ところが、この途中で

```
$ sudo yum groupinstall "Japanese Support"
読み込んだプラグイン:fastestmirror
There is no installed groups file.
Maybe run: yum groups mark convert (see man yum)
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.riken.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Warning: Group japanese-support does not have any packages to install.
Maybe run: yum groups mark install (see man yum)
インストールまたは更新に利用できるいくつかの要求されたグループにパッケージがありません
```
となって日本語フォントがインストールされず詰まった...

# どうやら

日本語フォントのインストール方法がCentOS7.xで変わったらしい。
そのコマンドがこちら
`yum install ibus-kkc vlgothic-*`

この後
> フォント設定ファイルを修正

して、
> フォントキャッシュ更新

したら無事PhantomJSのキャプチャで日本語が表示されるようになった。

# ところで
試しに
> フォント設定ファイルを修正

の項目を元にもどして再度フォントキャッシュを更新してもう一度キャプチャを撮ってみたところ問題なく日本語が表示されたので、
もしかしたら
> フォント設定ファイルを修正

の項目はCentOS7.xではすっ飛ばしても良いのかも。

# 参考
[CentOSからPhantomJSを実行すると画面キャプチャの日本語が表示されなくなる問題 - Qiita](http://qiita.com/n-takahashi/items/3dd810ebdf236fce6f13)
[CentOS7の日本語化（日本語環境で利用する）- newsearch.okinawaの技術ブログ](http://vps-okinawa-blog.net/?p=97)
第10回つぶやき勉強会 ~SQLの世界~

## MySQLでやりたいとおもいます。まずは、テーブルとデータを用意します。

----

```sql
create table users (
  id int,
  name text,
  level float comment '0~1の間の少数'
);

insert users values 
(1, 'taro', 0.2),
(2, 'yuki', 0.2),
(3, 'ken', 0.5),
(4, 'tera', null)
;
```

----

```sql
mysql> select * from users;
+------+------+-------+
| id   | name | level |
+------+------+-------+
|    1 | taro |  0.20 |
|    2 | yuki |  0.20 |
|    3 | ken  |  0.50 |
|    4 | tera |  NULL |
+------+------+-------+
```

次の２つのコマンドの結果は何でしょう？

```sql
select count(*) from users where level != null;
select count(*) from users where level != 0.2;
```


----

# 答え

0
3

----

# 解説

0.2 は float だと、２進数世界において無限小数となる。 `decimal(x,y)` を使うことで回避できたりします。
Virtual Boxでクリップボードを共有する

### :large_blue_diamond:  ホストOS⇔ゲストOS間でクリップボード共有したい
* Guest Additionsのインストールが必要

### :large_blue_diamond:   環境 
* ホスト側 OS : Windows 7 (64-bit)
* ゲスト側 OS : CentOS7
* 仮想マシン： Virtual Box

### :large_blue_diamond:  下準備

* gcc、make、kernel-develのインストール

```
# yum install gcc
# yum install make
# yum install kernel-devel
```

### :large_blue_diamond:  インストール
* VirtualBoxでCentOSを立ち上げて、メニューバー＞＞デバイス＞＞Guest Additions CDイメージの挿入
![image](https://qiita-image-store.s3.amazonaws.com/0/161713/b60770ca-d452-1024-8d36-417f1bb919ac.png)

* ログインするとCDが出現
![image](https://qiita-image-store.s3.amazonaws.com/0/161713/b09c6487-4377-4e22-51ec-7919d691fbaa.png)

* マウント
 
```
# mkdir [newdir]
# mount -r /dev/cdrom [newdir]
```

* インストール  

```
# sh ./VBoxLinuxAdditions.run install
```



### :large_blue_diamond:  再起動
* 完了したら再起動

### :large_blue_diamond:  Virtual Boxの設定
* 仮想マシン＞設定  
 ![image](https://qiita-image-store.s3.amazonaws.com/0/161713/04d4c7fa-8ba5-fd67-7840-d1691e251eeb.png)
* 一般＞高度＞クリップボードの設定を「双方向」にする  
![image](https://qiita-image-store.s3.amazonaws.com/0/161713/da174e3b-7b5b-62f4-8d68-2d505b3da863.png)

以上。
vmware player上でcentosをたててteratermから接続する

# 1 vmware playerインストール
# 2 centosインストール
# 3 ネットワーク設定
## nmcliコマンドかファイルを直接修正する。
# 4 vmware playerの設定でブリッジモードにする

以上の設定でteratermからアクセスができるはず！！
git logでemojiを表示

<img width="619" alt="Screen Shot 2017-02-07 at 3.21.20 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/66521/5dcd15c4-c9be-76a5-cae7-d1c1ab771f89.png">

## 必要なものインストール

```
brew install homebrew/dupes/less emojify
```

## 例

```
git clone https://github.com/mrowa44/emojify/
cd emojify
git log —oneline |emojify
```

## lessを最新にする必要がある件

- [Displaying Emoji in git log – recursion by Luke Francl](http://www.recursion.org/2016/6/19/displaying-emoji-in-git-log)
visualstudioでpythonを扱う際の日本語出力

初投稿です。
また、pythonも初心者なので間違った知識を持っていたらすみません。

本題に入りますとVisualStudioにおいてPythonでコンソールに日本語出力をする際には、単に文字コードを「"あいうえお".encode('utf-8')」という様に変換したり 「u"あいうえお"」という様に記述するだけでは私の環境ではエラーがでてしまいました。

色々調べてみますとpythonファイルの文字コードをutf-8に設定しなければならないみたいです。

日本版のVisualStudioではpythoファイルを作った際の初期の文字コードがshift-jisになっているようで、pythonファイルの設定を「ファイル→保存オプションの詳細設定→エンコードをutf-8」に変更すると無事に日本語が出力できるようになりました。

しかしファイルの文字コードの初期設定をshift-jisからutf-8に変更ができないようなので日本語を扱う際には毎回上記の手順が必要みたいです。
Sinatra風のフレームワークの紹介とその使い方

#方針
ややこしいことをしない。
個人デベロッパー向け。
大雑把な記事にするよ。

#マイクロフレームワーク
小さいフレームワーク（そのまま）
ポイントはマイクロフレームワーク単体でWebサービスを立ち上げられること。

#使い方
個人的な使い方です。
Web的な部分は素直にNginxやApache,PHPに投げる。
マイクロフレームワークでローカルネットワーク向けのWebAPIを作り、フロントエンドにNginxやApacheを使うということ。

#各言語のマイクロフレーム紹介
##Sinatra(Ruby）
http://www.sinatrarb.com/intro-ja.html
インストールは

```bash:command
gem install sinatra
```

最小のコードは

```ruby:main.rb
require 'sinatra'

get '/' do
  'Hello world!'
end
```

公開は

```bash:command
ruby main.rb -p ポート番号 -o 0.0.0.0
```

##Spark(Java)
http://sparkjava.com/
インストールは

DLしてパスを通すだけです。Gradleなら

```gradle:script
Gradle : compile "com.sparkjava:spark-core:2.5.4" //add to build.gradle
```

最小のコードは

```java:main.java
import static spark.Spark.*;

public class HelloWorld {
    public static void main(String[] args) {
        get("/hello", (req, res) -> "Hello World");
    }
}
```

公開はコンパイルしてjart玉を実行してください。

##Bottle(Python)
http://bottlepy.org/docs/dev/
インストールは軽いので、DLするだけでも良いですし、パッケージマネージャーでもeasy_installでも良いです。pipを使うなら、

```Python:command
sudo pip install bottle  
```

最小のコードは

```python:main.py
from bottle import route, run, template

@route('/hello/<name>')
def index(name):
    return template('<b>Hello {{name}}</b>!', name=name)

run(host='localhost', port=8080)
```

公開は

```Python:command
python main.py
```

です。

#出来上がるもの
日本語ガンガン使える正規表現てんこもりのwebサービス
機械学習もガンガンできるwebサービス
どこでも移植できてそれなりの仕事をこなせるwebサービス
WebAPIをローカルネットワークに置けばセキュリティ的にもベターです。

#どこで楽をしたか？
tomcatもRailsもDjangoも勉強しなくてすむ（これは大げさ）。
配布・インストール・テストが楽。
サーバーアプリをAPIにしておけば各言語で連携できます。
フロントエンドとサーバーサイドの切り分けできる。
Cognos でDate列を扱う時の基本的なTips

Cognos BI & Analyticsのレポートで、Date列を扱う時の基本的な手順を最近質問を受けましたので、記載します。

Date列、以下のような日付の列の取り扱いです。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/3d37fa05-92e5-7de0-f137-7023020f86b8.png)

##年の抽出
以下のように、Date列から、「年」だけを抽出して、「年」のデータアイテムを作成したい場合です。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/6f8d2794-221c-cb21-9604-0d17cf2f2a1e.png)

「年」を表現するデータ・アイテムを作成し、以下のように記載します。
**extract (year,[日付])**
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/620fb670-8461-c978-f621-4d330091c82a.png)

日付やタイムスタンプから「extract関数」で抽出する事を覚えて頂ければ、month、day、hour、minute、secondでの抽出も可能です。

##年
「年」や「月」を単独で抽出するのではなく、下のように「年-月」のセットで抽出するパターンです。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/e798ace3-707e-fe6b-bed0-6b751e6eee0b.png)

substringを使用する事で可能です。
**substring([日付],0,8)**
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/639406a8-a7f0-78f8-bb3f-50758ff69201.png)

以下のように、extractを組み合わせて実装する事も可能です。
**extract(YEAR,[日付])||'/'||extract(MONTH,[日付])**
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/754366ec-75d0-ea45-fd62-54fcc1ff0865.png)

##月/日/年、という表現をしたい場合
以下のような場合です。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/d50cb389-6e15-8803-683f-269b7ddaba4a.png)

以下のように記載した、データ・アイテムを作成します。
**to_char([日付],'MM/DD/YYYY')**
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/b04219b4-d1b2-5c97-354e-526f42c5b107.png)

##日付プロンプトで選択した日にちより、5日前からフィルターしたい場合
このような話です。1/24を選択していますが、フィルターは1/20-1/24にかかっています。
![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/14eff345-e64d-e794-3eeb-b309b1da1497.png)

リストのクエリに対して、以下のような詳細フィルターを作成します。
_add_days()関数を覚えて頂ければと思います。
**[日付] between _add_days (?pDate?,-4) and ?pDate?**
![010.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/a588f505-eebb-6284-bd4d-f7e587c2ed7c.png)

他にも思いついたら、順次下に追加していきます。
Capybara で得た要素の innerHTML を取得する

Capybara の `find` 使ってて、以下のようなエラーに遭遇することってありますよね。

```
> find('li.userList')
=> Capybara::Ambiguous: Ambiguous match, found 2 elements matching css "li.userList"
```

セレクタが曖昧で、2件ヒットしちゃったワケです。

ひとつめを取得するにはこうすればいいです。

```
> find_all('li.userList')[0]
=> #<Capybara::Node::Element tag="li" path="/html/body/div/div[2]/section/div[7]/div/div[1]/ul/li[1]">
```

とはいえその html がどういうふうになっているのか、やっぱ知りたいですよね。曖昧なセレクタは良くない。

というワケで、html を取得するには `Capybara::Node::Element#native` を使えば良いですよ。というハナシ。

```
> find_all('li.userList')[0].native.to_s
=> "<li class=\"userList\">\n< ……略……
```

# 参考にしたページ

- [cucumber - How do I get the HTML in an element using Capybara? - Stack Overflow](http://stackoverflow.com/questions/4071937/how-do-i-get-the-html-in-an-element-using-capybara)
`display: inline-block`で最後の文字だけ落ちてしまう問題


`display: inline-block`や`position: absolute`で幅を明示的に指定していない場合、
かつ、内容が1行のテキストの場合、最後の1文字だけ落ちてしまうことがたまにあった。


だいたいiPhone Safariで困る現象だが、稀にMac Chrome や Safari でも発生する。

再現性が高くなく、原因がよくわからなかったのだが、
おそらく要素の幅が最適なサイズになっていないことで起こる模様。


下記でとりあえず解決した。

```css

width: max-content;

```

`max-content`という値を初めて見た。
定義は下記（デフォルトは`auto`）

> auto
> :    ブラウザにコンテンツ幅の計算を委ねる事を意味する指定
> 
> max-content 
> :    コンテンツエリア固有の望ましい幅です。

`auto`と`max-content`はどう違うのかいまいちピンとこないけど、とりあえず解決としておく。


参考: https://developer.mozilla.org/ja/docs/Web/CSS/width
eventReactive() と observeEvent() の違いを動作で理解する

なんとなくマニュアルを流し読みして理解していた気になっていたのですが、デバッグではまったりして分かったことがあったので記事にしておきます。

###概要
Shinyでイベントをモニタして発火する関数としてeventReactive() と observeEvent() があります。マニュアルには以下のように記載してあります。

> observeEvent returns an observer reference class object. eventReactive returns a reactive expression object.
> observeEventはオブサーバクラスオブジェクトを返し、eventReactiveはリアクテブエクスプレッションを返します

ここで注意なのがreactive valueを作るということはそのreactiveが伝播する範囲を調べ、UI上で使われなければ何も起こらないという動作になります。つまり例えば途中までコードを書いて、「ボタン押したら発火するかな～」的なテストすることはよくありますが、reactive valueがUI上で使われていなければ発火しません。なのでデバッグする時はprint()でコンソールに出すだけはダメで、modalDialogを出したりrenderTextを使用してShinyのUI側にreactiveの作用先を準備してデバッグしましょう。

###サンプルコード

6行目がコメントアウトされているとaction_buttonは一切発火しません。
action_button2は常に反応します。

```
library(shiny)
shinyApp(
  ui = fluidPage(
    actionButton("action_button", "Button1")
    ,actionButton("action_button2", "Button2")
    #,textOutput("text")
  ),
  server = function(input, output) {
    reactive_data <- eventReactive(input$action_button, {
      print("brabra")
      return("brabra_return")
    })
    observeEvent(input$action_button2, {
      print("brabra2")
    })
    output$text <- renderText({reactive_data()})
  }
)
```
ありそうでなかったSwiftでのPostリクエストの投げ方

先日出場したハッカソンで、その場で作成したAPIを叩くという機会があったのですが、その時POSTリクエストの投げ方について参考資料が少なく苦戦したので共有します。

この記事はあくまで普段GETリクエストである程度APIをiOSから叩くということに慣れている人対象なので登場するライブラリの基本的な使い方などは別の記事をご覧ください。
Swift3です。

## APIKit + Himotokiの場合
APIKitとHimotokiの場合はRequestプロトコルを継承している構造体の`method`プロパティで`.post`を返せば大丈夫です。
`parameters`プロパティに辞書を入れておけば自動でJSONに変換して送ってくれるようです。

ですが、この場合少し厄介な仕様があったのでつまりました。というのも普段は既存のAPIを叩くことしかないので遭遇することがほぼないと思うのですが、実はHimotokiはそもそも存在しないJSONのキーをとってこようとするとエラーを投げます。この時APIKitと一緒に使っているとそのエラーをライブラリの内部でキャッチしてしまうため、使っている側には謎のエラーコードを吐いたようにしか見えないのです。

同様にPOSTをする際も、形式が間違っていても使っている側にはそれとわかるようなエラーコードにならないので注意が必要です。

## Alamofireの場合
Alamofireの場合は内部での処理が少ない分デバッグが楽です。
例えばJSONを送るようなPOSTリクエストの場合以下のようになります。

```swift
var url: String?
var parameters: Parameters?
Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).response { response in
}
```

APIKitの場合とちがって、パラメーターを送る形式を自分で指定しなければいけないというところに注意が必要です。特にJSONの場合予測変換で出てくる型名のプロパティにJSONが含まれていなくて、`JSONEncoding`の方に存在しているので気をつけましょう。

## まとめ
基本的に普通は仕様の確定していないAPIを叩くという機会はほぼないと思うので、今回の僕のようなハマり方をする人は少ないと思うのですが、APIKitが結構パース時のエラーなどを中で処理してしまうのでAPIの仕様が確定するまではAlamofireで、その後APIKitに移行という使い分けもありなのかなと感じました。

APIKit+HimotokiとAlamofire+Himotokiという変換はそこまで難しくなくて、`baseURL`をURLにするかStringにするかというところと、Alamofireで受け取ったresponseをうまくHimotokiに投げてやればうまくいきます。一応最後にここのやり方を共有しておきましょう。

このためにはAlamofireから受け取る`response`の型に注意が必要になります。
まず`response.result`が`Result`型になります。これはAPIKitと同様Resultというライブラリを仕様しているので問題ないでしょう。
そして実際のJSONは`response.result.value`に入っています。これは`Any?`型になっているので基本的にはこれを`[String: Any]`にキャストしてからHimotokiの`decodeValue`メソッドに投げてあげればよいです。注意が必要なのはJSONの配列が返って来ている場合で、この時`[[String: Any]]`に直接キャストできなかった（たしか）ので今回は

```swift
if let jsonArray = response.result.value as? [Any] {
  let jsonObject = jsonArray.map {
    $0 as! [String: Any]
  }
}
```

というように書いて対処しました。
PopupWindowをBackKeyで消去！？

#PopupWindowをBackKeyで消去できるようにしよう！！

###以下コード
```javascript:galapagos.js
popup=new android.widget.PopupWindow(view,1920,1080);
popup.setFocusable(true);
popup.setOnDismissListener(function(){
  // 消えたときの処理
  print("消去しました");
});
popup.showAtLocation(ctx.getWindow().getDecorView(),android.view.Gravity.LEFT|android.view.Gravity.TOP,0,0);
popup.getContentView().setSystemUiVisibility(android.view.View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY|android.view.View.SYSTEM_UI_FLAG_FULLSCREEN|android.view.View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
```

##追記
`setSystemUiVisibility`でナビゲーションバーを隠しているので、表示させたい場合はこの部分を消してください
Raspberry Pi > SPI > SPIの有効化 (Raspbian Jessie) + SCLK(1MHz)を出力するまで / SPI1使用について

```txt:動作環境
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Tektronix TDS 2024C (200 MHz, 2GS/s)
```

```
$ cat /etc/debian_version 
8.0
$ cat /proc/version 
Linux version 4.1.7-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.8.3 20140303 (prerelease) (crosstool-NG linaro-1.13.1+bzr2650 - Linaro GCC 2014.03) ) #817 SMP PREEMPT Sat Sep 19 15:32:00 BST 2015
```

関連 http://qiita.com/7of9/items/caa10591069cd3a33c76#comment-0055b13b4b492c07c62d

RPiにてSPIを使おうとした。

いくつかのページを参考にした。

@soramimi_jp さん
http://www.soramimi.jp/raspberrypi/spi/
上記を実行してみたが、SPIは有効にならなかった。

@masato さん
http://qiita.com/masato/items/f089a17b1c9329eb7d03
カーネルのバージョンが異なっていた。実施は保留としました。

pusuke0418’s diary by pusuke0418さん
http://poosyche.hatenablog.com/entry/2015/04/03/000355
> なんやこれと思って調べていると、下記【参考】に記載した投稿を見つけた。どうやら仕組みが変わっていたらしい。
> $ sudo raspi-config から、
"8 Advanced Options"→"A6 SPI"→以降の項目でそれぞれ"<はい>"と"<了解>"→再起動
>
>で使えるようになった。ありがとうございます。

こちらの方法を実施しました。

### 設定

```
$ sudo raspi-config
8 Advanced Options
A6 SPI
Would you like the SPI interface to be enabled? にて Yes
The SPI interface is enabled にて Ok
Would you like the SPI kernel module to be loaded by default? にて Yes
SPI kernel module will now be loaded by default にて Ok
Finishを選択
```

> modprobe: ERROR: could not insert 'spi_bcm2708': No such device

上記のメッセージが少し気になる。

### 再起動後

参考 http://www.soramimi.jp/raspberrypi/spi/

```
$ ls -la /dev/spidev0.*
crw-rw---- 1 root spi 153, 0 Feb  7 12:20 /dev/spidev0.0
crw-rw---- 1 root spi 153, 1 Feb  7 12:20 /dev/spidev0.1
```

```
$ dmesg | grep spi
[    2.767104] systemd[1]: Set hostname to <raspi_yo>.
[    4.981019] spi spi0.0: setting up native-CS0 as GPIO 8
[    4.982401] spi spi0.1: setting up native-CS1 as GPIO 7
```

```
$ lsmod | grep spi
spi_bcm2835             7248  0 
```

有効化されたようだ。
(dmesgの1つ目(systemd...)はSPIとは無関係)

### spidevインストール

参考 https://hack-le.com/47361017-2/

```
$ sudo apt-get install python-spidev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package python-spidev
```

```
$ sudo apt-get update
$ sudo apt-get install python-spidev
```

### サンプルコード

参考 http://www.100randomtasks.com/simple-spi-on-raspberry-pi

以下のように実装した。

```spitest.py
import spidev
import time

usleep = lambda x : time.sleep(x/1000000.0)

spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1000000

while True:
	resp = spi.xfer2([0x00])	
	print(resp[0])
	usleep(1.0)

spi.close()
```

SPI0 SCLK(#23)とGND(#39)にてオシロスコープ(Tektronix TDS 2024C)で波形を計測した。

![F0002TEK.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/521723f1-7bc6-07aa-bcc9-6100fa08deea.jpeg)

1MHzでSPI SCLKを出力できた。


### SPI1の使用

以下にありますようにSPI1使用の設定が必要のようです。
https://www.raspberrypi.org/forums/viewtopic.php?f=82&t=167188

現在必要な機能はSPI0で確認できるため、SPI1使用は保留とします。
apache + PHP On Docker (ホームページ作成のお供に）

デザイナの方にとって、phpも編集できるホームページ作成環境を使われることがあるとおもうんですが、その際、WEBサーバの構築が必須になります。
しかし、敷居も高くなるのでDockerをつかってコマンド一発で準備を整える方法をご紹介します。

[埼玉越谷でこんなイベントもあるのでよろしければ](https://coderstable.com/spaces/halake/events/42)
 
## Docker Installation
 お持ちのPCに合ったものインストールしてください
 * [Install On Mac](https://docs.docker.com/docker-for-mac/ )
 * [Install On Windows](https://docs.docker.com/docker-for-windows/ )
 * [Install On Linux](https://docs.docker.com/engine/installation/linux/)

## プロジェクトルートを作成

```shell-session
mkdir sample
cd sample
touch Dockerfile
touch docker-compose.yml
mkdir public-html
cd public-html
touch index.php
```

## index.php編集
サンプルコードなので、ここはなんでもOK

```php:index.php
<?php
phpinfo();

```

## Dockerfile編集

```:Dockerfile
FROM centos:latest
RUN yum -y update && \
    yum -y install httpd php
WORKDIR /var/www/html
ADD ./public-html /var/www/html
EXPOSE 80

```

## docker-compose 編集

```yml:docker-compose.yml
version: '2'
services:
  web: &app_base
    build:
      context: .
      dockerfile: "Dockerfile"
    command: /usr/sbin/httpd -D FOREGROUND
    volumes:
      - ./public-html:/var/www/html
    ports:
      - "80:80"
    tty: true
    stdin_open: true

```

## イメージ（コンテナの雛形）作成

```shell-session
docker-compose build
```

## コンテナを起動
```shell-session
docker-compose up
```

## localhost :80 にアクセス
![スクリーンショット_2017-02-07_1.43.56_PM.jpg](https://s3-us-west-2.amazonaws.com/collabostarter/production/images/data/user/3/8.jpg?1486442709)
gitとGitHub

ローカルリポジトリからGitHub（リモートリポジトリ）に統合するとき怒られることがある．

```
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
Everything up-to-date
```

リモートリポジトリにmasterブランチがないのが原因らしいのでオプションつけてpushする．
http://vdeep.net/github

    $ git push -u origin master


---
別バージョンのPythonのconda環境をコマンド1行で作る

最新のAnaconda 4.3.0にはPython 3.6またはPython 2.7が含まれているが、それ以外のバージョンの環境が必要な場合はAnacondaをインストールした後にconda環境を作成する必要がある。

## インストールのコマンド
下のcondaコマンドを使うと、指定したバージョンのPythonでconda環境を作成してもろもろのパッケージも同時にインストールすることができる。

```bash
conda create -n Python35 anaconda python=3.5
```
- Python35: conda環境名（任意の名前）
- anaconda: たくさんのパッケージが含まれているメタパッケージ
- python=3.5: `=`に続いてPythonのバージョンを指定

## インストールされるパッケージ
コマンドラインから`conda info anaconda`を実行すると、インストールされるパッケージのリストを事前に確認できる。
MacVimでFiraCodeを使ったら遅くなった

https://s8a.jp/font-fira-code

上記の記事を見て導入してみたら、カーソルの動きが遅くなってしまって、いろいろ調べたところ
「リガチャ」を使うと遅くなるようでした。

https://github.com/tonsky/FiraCode/wiki/MacVim-instructions

上記のURLにある設定

```
set macligatures
set guifont=Fira\ Code:h12
```

の

```
set macligatures
```

を消すとカーソルの動きがなおりました。

まあ、リガチャを使うと綺麗に見えるけど、プログラムする上では必要ないかなと思います。
Qiita::Teamの記事をesa.ioに移行するアレ


こんな記事をQiitaに書いて良いのかという疑問がありつつも。。

# 概要
Qiita::Teamは記事をjson形式でエクスポート出来る機能があります。
その機能で落としてきたファイルを読み込んでesa.ioのAPIを叩いて登録します。

# 詳細

#### カテゴリ
本当はカテゴリマッピングとかやりたいところですが、それなりにドキュメント量があると無理ゲーなので/qiitaというトップカテゴリを作って、その下に時系列カテゴリで切って雑にぶち込んでます。移行と言っていますが、引き続き使われる記事は無しとして、ほぼアーカイブとして移行する考え方です。こういうところにこそ機械学習を使って良い感じの自動分類をやりたいですね。。

#### ユーザー
ユーザーマッピングは少ない労力で出来るじゃん！とも考えたのですが、長い間使ってると人の入れ替わりとかもあり、厳密にマッピングする意味が無さそうだったので、投稿ユーザーはesabotに集約して最低限の検索ビリティを確保（titleにqiitaのid文字列を入れる）するに留めています。

#### タグ
タグは完全にカオスだったので、全部捨ててやり直したい衝動にかられましたが、前述の通り人の入れ替わりを考慮するとタグ候補が見える事はコンテキストの把握につながるよなーと考えて、取り敢えず全部インポートする事にしました。

#### 画像やファイル
[こちらの記事](http://blog.kyanny.me/entry/2015/07/30/020046)を参考にしてファイルは別で取得してアーカイブしておく事にしました。そもそも社内の運用ルールとして、ファイルはQiita::Teamではなくファイルサーバー管理（記事内部からファイルパスへリンクする）する方針だったので、ここはあまり慎重に考えずサクッとやった感じです。

#### ポエム
「なんで移行したのか？」という事ですが、上に書いたトピックにも関連しますがタグ管理が結構限界きてるなーというのが理由です。ある程度カテゴライズしてカチっとまとめつつ、wikiみたいな感じでスナップショットというかある時点での情報を切り出して体系的にまとめる、というのがQiita::Teamだと思うように実現できなかったので移行しました。一言で表すと「フローの取り扱いは良いが、ストックの取り扱いがイマイチ」というような感じです。とは言えこの部分は永遠に悩める部分なので他社さんの方法も教えてほしいところです。

# コード
[gist参照](https://gist.github.com/yokozawa/cdd44efcd77b244be33cbffd5b94d905)

# 気になるところ
コメントPOSTは本文のidを引数に取るので本当はブロッキングしなきゃならないのだけど、どうせsleepするから大丈夫だろうという雑実装です。

# 参考資料 
- [esa.ioのAPIマニュアル](https://docs.esa.io/posts/102)
- [esa-ruby](https://github.com/esaio/esa-ruby)
- [franzプラグインも見つけました](https://github.com/upamune/franz-plugin-esa)
CentOS7 に yum で PHP5.6 を入れた話


現在稼働しているサーバの PHP が 5.4 だったのだけど、どうしても `password_hash`, `password_verify` を使いたかったので、入れ替えた時のお話。
`password_verify` は[タイミング攻撃](#タイミング攻撃とは)に対応していてパスワードクラック対策になるので、ぜひ使って見たかった (同じく `hash_equals` もある)。

## yum リポジトリを追加
### epel (もしなければ)
`yum install epel-release`

### rpm で remi を追加
`rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm`

## 古い php を削除
`yum -y remove php-*`

## php5.6 をインストール
`yum -y --enablerepo=remi,remi-php56 install php php-mysql php-mbstring php-gd php-pear php-mcrypt mod_ssl`
プラグインはお好みで。
`password_hash` 以外での暗号化することも考えて、 `mod_ssl` や `php-mcrypt` も入れておいた。

## バージョンを確認
`php --version` を発行し、

```
PHP 5.6.30 (cli) (built: Jan 19 2017 07:57:06) 
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
```
こんな感じで帰って来れば OK.

## apache 再起動
`systemctl restart httpd`
fast-cgi や Nginx はまた別の機会に。

## phpinfo() を実行する
![php56.png](https://qiita-image-store.s3.amazonaws.com/0/71497/39894e90-6d22-9774-33fa-8099b22731d2.png "php56.png")
こんな感じでヘッダに 5.6.xx となれば OK.
(黒塗りのところは host 名)

## 蛇足
### 本当は 7.0 とか使いたかったんだけど
大人の事情(笑)により頓挫。
宇宙船演算子とか使ってみたい。
Null 合体演算子は切実に使いたい。

### タイミング攻撃とは
ザクっというとパスワードの検証にかかる時間を調べることにより、処理内容を推測してパスワードをクラックする(パスワード検証に限らないが)。
我々はコードを書くときに「ネストを深くしない」「可能な限り早く return する」ことを心がけるけれど、そうすると処理する時間に僅かだが差が出るので、それを何度もやりその有意差から、「ああ、この辺りで処理を抜けてるな」みたいなことがわかってしまう。
よく文字列比較で使う `===` や `strcmp` なども内部的には、文字数を比較していたり、効率化のために「可能な限り早く return し」ているので、自分で記述した処理以外の部分でも攻撃対象となってしまう。
`password_verify` や `hash_equals` はどんな値が入力されても同じ時間で答えを返すように設計されているので、こういった攻撃の対策に役立つ。
Python > list > delete last insertion > del somelist[-1] > somelist.pop() / help([].pop) を教えていただきました。

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

> Let's undo that last insertion:

```py
>>> del marxes[-1]
```

実装してみた。
http://ideone.com/yRBduB

```py
TodoList = []
print(TodoList)

TodoList.append('Futon')
TodoList.append('Monitor desk')
TodoList.append('Internet')
TodoList.append('Electronic Line')
TodoList.append('Water Line')
TodoList.append('Gas Line')
TodoList.append('etc')

print(TodoList)

for loop in range(6):
	del TodoList[-1]
print(TodoList)
```

```txt:実行結果
Success	time: 0.01 memory: 9992 signal:0
[]
['Futon', 'Monitor desk', 'Internet', 'Electronic Line', 'Water Line', 'Gas Line', 'etc']
['Futon']
```

## 追加学習事項

@shiracamus さんの[コメント](http://qiita.com/7of9/items/1a519b8ac45b6ccda478/#comment-ad4f64e8889000048779)にて`pop()`と`help([].pop)`を教えていただきました。

情報感謝です。
PROMPTで変数が更新されない

# vcs_info の結果が変わらない

`.zshrc` に以下のような `PROMPT` を設定すると，`.zshrc` 読み込み時からバージョン管理システムの情報が更新されない．

```
PROMPT="${vcs_info_msg_0_}"
```

# シングルクォート使えばOK

上記のようにダブルクォートを使うと， `.zshrc` の読み込み時に変数が展開されてしまうため，`precmd` が呼ばれる等で変数の内容が変わっても更新されない．

よって，以下のようにシングルクォートを使って変数を展開せずに持っておく．

```
PROMPT='${vcs_info_msg_0_}'
```

# 参考

http://qiita.com/cocodrips/items/bb3640a9834c8978d48a
【小ネタ】fastlyで柔軟なログ出力をするための方法


fastly導入にあたり、アクセスログはfastly経由のものを使うようにしようと計画している。

今回は、かなり小ネタだが、柔軟なアクセスログを出力する為の基本設定について書く。

- LogFormatのバージョンアップ
- s3の保存先に日付フォーマットを入れる(Athena)

ログを柔軟に操れるのは、Akamaiでは出来ないのでかなり優位な点かと思っている。

fastlyログのs3への出力設定は下記投稿が詳しい。
http://qiita.com/Satoshi-Ishii/items/1ec701a5d823807a3a78

#LogFormatのバージョンアップ

##fastlyのログフォーマットについて

fastlyには、ログのformatとして、v1とv2がある。
[公式ドキュメント](https://docs.fastly.com/guides/streaming-logs/custom-log-formats)にあるとおり、デフォルトはv1になっており出力項目にかなり制限がありアクセスログとしてみた時に少し情報が少ない。。。

只、ログフォーマットを変更する事で、柔軟なログ出力が可能となるので今回はその手順を備忘録として書いておく。

- 変更は、API経由で行う。
- サービス毎に、設定を持っているので、service ID単位に設定を行う必要がある。

###更新手順

ServiceIDとlog type(s3,ftp,,,)毎にカスタムログのversionを持っている模様。
イメージとしては、fastly上で先にログの設定を投入し、そのログプロファイルのformatをバージョンアップするようなイメージ

```
curl -X PUT -H 'Fastly-Key: <your Fastly API key>' -H 'Content-Type: application/json' 'https://api.fastly.com/service/<your Fastly service ID>/version/<version number/logging/<log type>/<log name>' --data-binary '{"format_version":"2"}'

```

####現在の設定の確認

```
curl -X GET -H 'Fastly-Key: <your Fastly API key>'  'https://api.fastly.com/service/<your Fastly service ID>/version/<version number>/logging/<log type>/<log name>'|jq .
```

レスポンスをjqで表示するとざっくりこんな感じ

formatバージョンが変わっていれば成功!!

```
{
  "placement": null,
  "format_version": "2",  ##ここが2になっていればバージョンアップ成功
  "response_condition": "",
  "gzip_level": "0",
  "server_side_encryption_kms_key_id": null,
  "secret_key": "***",
  "public_key": null,
  "updated_at": "2017-02-06T08:22:42+00:00",
  "message_type": "classic",
  "period": "3600",
  "name": "ログプロファイル名",
  "server_side_encryption": null,
  "bucket_name": "s3のバケット名",
  "timestamp_format": "%Y-%m-%dT%H:%M:%S.000",
  "service_id": "***",
  "domain": "s3-ap-northeast-1.amazonaws.com",
  "redundancy": "standard",
  "version": "26",
  "path": "/***/",
  "deleted_at": null,
  "created_at": "2017-01-20T09:07:48+00:00",
  "access_key": "***",
  "format": "%t %m %U %q %a"
}

```

#s3バケットの保存先に日付フォーマットを入れる

s3には、Athenaというサービスがあり、バケットに保存したデータにそのままSQL発行が出来る。

只、データを溜めるだけだとスキャン量が膨大になるので、hiveフォーマットのディレクトリ構造にデータを保管しパーティショニングするのが定石となっている。

今回、fastlyのエンジニアの方に日付フォーマットがログの出力先に使える事を聞いたので、その方法も書いておく。

###設定

fastlyのログのAdvanced optons画面で下記のように書く事で日付毎のディレクトリ階層に出力が可能になる。

![Fastly__Configure__strestaurant_ikyu_com_.jpg](https://qiita-image-store.s3.amazonaws.com/0/40850/817e5f08-b2e6-1ac5-ac25-81da2944ea9a.jpeg "Fastly__Configure__strestaurant_ikyu_com_.jpg")

Hiveフォーマット

```
dt=yyyy-mm-dd(-HH-MM-SS)
```

AthenaでCREATE EXTERNAL TABLEする時に、下記のようにパーティションを設定すると良い。

```
CREATE EXTERNAL TABLE　
...
...
PARTITIONED BY (dt string)
```

↓パーティショニングする

```
MSCK REPAIR TABLE [テーブル名]
```

クエリには、where句でスキャン対象のパーティションを指定してあげると対象を絞ってのクエリ発行が可能になる。

```
where dt<'2016-12-12' and dt>='2016-12-13'
```

今回は、かなり小ネタだったが、最終的には、elastic cloudにログを持っていこうと思っているのでそれはまた別の機会に書こうと思う。
Google App Engine for Railsでコンテナに入ってrails c

```bash
sudo docker ps
container_exec XXX /bin/bash
export PATH=/rbenv/shims:/rbenv/bin:$PATH
export PATH=/nodejs/bin:$PATH
export RACK_ENV=production
export RAILS_ENV=production
export APP_ENV=production
export RAILS_SERVE_STATIC_FILES=true
bundle exec rails c
```