OmniAICreator/Qiita-1.07M huggingface dataset:
GO言語のクロスコンパイルを利用して、エージェントモードのvulsバイナリを用意する

# 概要

Vulsエージェントモードが実装された。これにより、スキャン対象サーバにバイナリを置く事で、SSH無しで脆弱性スキャンが出来るようになった。

この方式の問題点は「スキャン対象用のVulsバイナリが必要になる」事。スキャン対象ごとにgo langのセットアップが必要になるのは、それはそれで問題がある。

その為、go langのクロスコンパイル環境を利用して、スキャン対象サーバ用のバイナリを作ることにした。

# 下準備

面倒だから、rootで/usr/local/go の準備をしちゃいました。。
vulsのコンパイル等は、いつも通りvulsユーザでできます。


## まずは最新版のGOを入れる

Vulsのインストール指示通り、go言語を入れます
; 通常のgo言語の導入方法と同じ。

```bash:install_goLang
# wget https://storage.googleapis.com/golang/go1.7.1.linux-amd64.tar.gz
# tar -C /usr/local -xzf go1.7.1.linux-amd64.tar.gz
# mkdir $HOME/go
```

```bash:make_profile_d
# sudo vi /etc/profile.d/goenv.sh
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
# source /etc/profile.d/goenv.sh
```

## go1.4を入れる

クロスコンパイル用に、取りあえずgo1.4を入れます。
GOROOT_BOOTSTRAPはデフォルトで$HOME/go1.4を向いているらしいので、~/go1.4 に入れる

```
# mkdir $HOME/tmp
# wget https://storage.googleapis.com/golang/go1.4.2.linux-amd64.tar.gz
# tar zxvf go1.4.2.linux-amd64.tar.gz -C $HOME/tmp
# mv $HOME/tmp/go $HOME/go1.4
```

## make.bash

あとは、/usr/local/go/src で、各OS/Archtecture毎の準備。
今回はFreeBSDのバイナリを作りたいので、GOOS=freebsd, GOARCH=arm64を指定。

- Vulsで利用する場合は、GOOSはfreebsd位かも。windowsやdarwinはそもそもVulsが対応していない
- GOARCHはもしかしたら必要？386とか？

```
# cd /usr/local/go/src
# GOOS=freebsd GOARCH=amd64 ./make.bash
; 前述のgo1.4を入れていないと、ここでエラーになる。
; GOOS/GOARCHで対象のOS/アーキテクチャを指定する。
```

# vulsをクロスコンパイルする

## いつも通りmake installしてから作る

/usr/local/go に入れたgoがクロスコンパイル可能になったので、ここからは一般ユーザでよさげ。

一度、通常通りvulsバイナリを作ってからの方がいいみたい。

いつもの導入

- $HOME/go/bin に、当該サーバ用のvulsが出来ます

```
$ mkdir -p $GOPATH/src/github.com/future-architect
$ cd $GOPATH/src/github.com/future-architect
$ git clone https://github.com/future-architect/vuls.git
$ cd vuls
$ make install
```

ここからがクロスコンパイル

- go/src/.../vuls 以下に バイナリが出来ます

```
$ cd $HOME/go/src/github.com/future-architect/vuls
$ GOOS=freebsd GOARCH=amd64 go build main.go
$ mv main vuls.freebsd
```

## 自分用のVulsは要らない場合

make installだと go/bin/vuls が出来るけど、要らない場合は glide installでいいみたい。

```
$ mkdir -p $GOPATH/src/github.com/future-architect
$ cd $GOPATH/src/github.com/future-architect
$ git clone https://github.com/future-architect/vuls.git
$ cd vuls
$ go get glide
$ glide install
```

あとは前述のクロスコンパイルと同じ

```
$ GOOS=freebsd GOARCH=amd64 go build main.go
$ mv main vuls.freebsd
```

## 確認

CentOS68上でfreeBSD版作った。

```
$ cat /etc/redhat-release
CentOS release 6.8 (Final)
$ file vuls.freebsd
vuls.freebsd: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), statically linked, not stripped
$ ./vuls.freebsd -v
Segmantation fault (core dumped)
$
```

後は、これを実機のFreeBSDに転送してあげれば動きますね。

おわり。

## その他情報

https://vuls-github.slack.com/messages のSlackチームで色々助言頂きました。
AWS AthenaでPartitionを作る

## BigQuery破産ならぬAthena破産
クエリでスキャンした容量毎に課金されるAthena。同じ課金方式（値段も一緒）のBigQueryでクエリの投げ方間違えて１００万円溶かしたなどの話は有名ですよね。
Athenaでも同じことが起こりうる、というのでとても怖いです。
ちょっとしたミスがとんでもないことになる。 そこまでビビらなくてもいいですが、
とはいえ、怖いのは怖いものです。
とはいえ、使わないというのもどうかと思います。

ので、BigQueryと同じく、パーティションを作ってちゃんとスキャンされる範囲を制限してクエリを実行すれば
それなりに安全ということで、本家からも推奨されてます。

## Athenaのパーティション
EMRなどでHiveを使ってS3にごにょごにょしてたのであれば、すでにHiveフォーマットでパーティショニングできてることもあります。
が、
我々がよくAthenaで見ようとするのはどちらかというとELBのアクセスログとかCloudfrontのアクセスログだったりするわけで。
それらはパーティショニングはできてないです。

なので、HiveのパーティショニングDDLでパーティションを作る必要があります。

ELBのログは、バケット配下に日付毎にディレクトリ（prefix）を作って、ちゃんと別れて格納されるので、それを使ってパーティションを分けるのが簡単だそうです。

## テーブル作成
```
CREATE EXTERNAL TABLE table_name (
...
)
PARTITIONED BY (year string, month string, day string)
...
```
ここで設定したyear,month,dayを今後パーティションの条件として使っていきます。

## Query
```
ALTER TABLE database_name.table_name ADD PARTITION (year='2016',month='08',day='28') location 's3://elb-access-log/AWSLogs/00000000000000/elasticloadbalancing/ap-northeast-1/2016/08/28/';
```
HiveのPartition作成構文と同じです。
これでパーティション１日分が作られます。１日分。

で、数年分作らなければいけないので、いっぺんに投げようとしたのですがなぜか通らず。

調べたら複数のADD PARTITIONをまとめて投げれるのはHive0.8からで、その前は一個一個投げないといけないみたいです。
[参考-ApacheHive Language Manual DDL](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-AlterPartition)

ということはHive0.7以下の互換性ということなので、これ全部一個一個投げないと。。。
骨と心が折れます。
さてどうするか。

## Athena JDBC
Athenaは公式JDBCを提供してるので、
それを使ってDDLを流し込めばいいのです。

私は２パターンで試しました。

- 普通にJavaからループ文で投げる
- SQL WorkbenchとかJDBCで繋げられるツールを使って、JDBCを読み込んで投げる

数が多いまたは規則性が簡単なのであれば前者で、
数が少ないまたは規則性もあんまりないのであれば後者でいいのではないかと思います。

## 終わりに
今後もS3はAWSのサービスを使っていく中でログの蓄積場所として一番使われるところということは変わらないと思うので、
Athenaの基本的な使い方とコストを抑える努力はやっていけたらなと思います。

こういう意識はAthenaに限らず、クエリ一本作るエンジニアみんなが意識できたらなと思いますね。

それではまた！
spring-boot-starter-securityでログアウト前に処理を入れたい

お仕事でログアウト前に事前処理を入れる必要があったので、
対応した時のちょっとしたメモ。

##実装
```java:SampleConfiguration.java
public class SampleConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private MyLogoutHandler myLogoutHandler;

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http
            .logout()
            .logoutUrl("/auth/logout")
            .logoutSuccessUrl("/auth/")
            .addLogoutHandler(myLogoutHandler)
            .invalidateHttpSession(true)
            .deleteCookies("JSESSIONID", "SESSION", "remember-me")
            .permitAll();
　　　　　　　}
}
```

```java:MyLogoutHandler.java
@Component
public class MyLogoutHandler implements LogoutHandler{
	@Override
	public void logout(HttpServletRequest request, HttpServletResponse response,
			Authentication authentication){
        // 何かの処理
　　　　　　　　　　　　　　　　// authentication.getName() でログインIDが取れる
	}
}
```

##結果
どうにか出来ないかと思って、LogoutFilterのソース読んでたら、
そもそも複数受け入れるように出来てたってオチ。
LogoutHandlerもInterfaceだったので、意外とサクッと対応できてよかった。
「Rails5」でテキストエリアに入力した値を表示させてみる


# やったこと
* view
	* テキストエリア作成
	* 検索ボタン作成
	* インスタント変数にセットされた値を表示する
* routes
	* `get`メソッドでURLとコントローラ名#アクション名をマッチング
* controller
	* テキストエリアに入力された値をインスタント変数にセット
	* 描画する画面を`render`で指定する

# 環境
| 製品 | バージョン |
|:------------:|:------------:|
|        Ruby |     2.3.3p222     |
|      Rails |    5.0.1    |
| Model| なし|

# controller
$ rails generate controller home

```Ruby
  def search_index
    @hoge = params[:search]
    
    render action: :index
  end
```

# routes
```Ruby
Rails.application.routes.draw do
  root 'home#index'
  get '/search_index', to: 'home#search_index'
end
```

# view
```Ruby
<%= form_tag '/search_index', method: :get, class: "" do %>
  <%= label_tag 'name', 'キーワード：' %>
  <%= text_field_tag :search, params[:search], class: "form-control" %>
  <%= submit_tag '検索する' %>
<% end %>

<h1><%= @hoge %></h1>
```

# 困った
色々なタグを作るメソッド達はすごく便利なのだが、調べるサイトによって書き方が結構違うのでいつも悩む。
なので実際に自分でやって上手くいったものはまとめていこうと思った。
Arduinoでマルチタスクっぽく実行する方法

# Arduinoでマルチタスクっぽく実行する方法

## 検証環境
Arduino Leonard

## 用途
入力待ちをしつつ継続して動作させたい場合等

## 実装方法
protothreadというライブラリを用いてマルチタスクっぽく実装することができます。  
Arduinoのdelayで待ってしまうと全てのスレッドが止まってしまうので、PT_WAIT_UNTILのプリプロセッサマクロを組みましょう。
他のスレッドを待ちたいときはPT_WAIT_THREADです。

## サンプルコード
```cpp
#include <pt.h>

#define PT_WAIT(pt, timestamp, usec) PT_WAIT_UNTIL(pt, millis() - *timestamp > usec);*timestamp = millis();

static struct pt pt1, pt2, pt3;

static int thread1(struct pt *pt) {
    // スレッド内で基準となるタイムスタンプ
    static unsigned long timestamp = 0;
    PT_BEGIN(pt);

    while(true) {
        // thread1の中身
        PT_WAIT(pt, &timestamp, 1000);
        Serial.println("thread1");
    }

    PT_END(pt);
}

static int thread2(struct pt *pt) {
    // スレッド内で基準となるタイムスタンプ
    static unsigned long timestamp = 0;
    PT_BEGIN(pt);

    while(true) {
        // thread2の中身
        PT_WAIT(pt, &timestamp, 1000);
        Serial.println("thread2 - 1");

        // thread3を待つ
        PT_WAIT_THREAD(pt, thread3(&pt3));

        PT_WAIT(pt, &timestamp, 1000);
        Serial.println("thread2 - 2");
    }

    PT_END(pt);
}

static int thread3(struct pt *pt) {
    // スレッド内で基準となるタイムスタンプ
    static unsigned long timestamp = 0;
    PT_BEGIN(pt);

    while(true) {
        // thread3の中身
        PT_WAIT(pt, &timestamp, 1000);
        Serial.println("thread3 - 1");

        PT_WAIT(pt, &timestamp, 100);
        Serial.println("thread3 - 2");
        break;
    }

    PT_END(pt);
}

void setup() {
    Serial.begin(9600);
    // ptを初期化
    PT_INIT(&pt1);
    PT_INIT(&pt2);
    PT_INIT(&pt3);
}
 
void loop() {
    // スレッド開始
    thread1(&pt1);
    thread2(&pt2);
}
```

## 参考文献
- http://d.hatena.ne.jp/LaclefYoshi/20110129/1296310627
    - マルチタスクの章を参考にさせていただいております
- http://harteware.blogspot.jp/2010/11/protothread-powerfull-library.html
    - こちらからArduino用のprotothreadをダウンロードできます
- http://dunkels.com/adam/pt/examples.html
    - いろいろ載ってます
MacでiOS向けの"Build and Run"をするとUnityが落ちる！！

タイトルそのまんまです。Mac版UnityEditorでiOSの"Build and Run"をすると、UnityEditorが落ちます。Xcodeでのビルドはできるものの、何かあった時にログが見れない…。
<img width="560" alt="Unity_Sierra.png" src="https://qiita-image-store.s3.amazonaws.com/0/141731/cde51790-c054-6fc1-1a09-a29c9eeba914.png">
…と思ったら、macOS Sierra v10.12限定の既知の不具合のようです。

EDITOR CRASHES WHEN 'BUILD AND RUN' IS OPENING THE BUILT XCODE PROJECT WITH MACOS SIERRA
https://issuetracker.unity3d.com/issues/editor-crashes-when-build-and-run-is-opening-the-built-xcode-project-with-macos-sierra

**Status: Fixed in Unity 5.4.3**
と書いてあるとおり、5.4.3f1にアップデートすればいいようです。

*iOS: Fixed a crash when using Build and Run for iOS projects. (836165)*
https://unity3d.com/jp/unity/whats-new/unity-5.4.3

こんなんばっかりや…。

※ご参考
MacでiOS向けの"Build and Run"をするとUnityが終了できない！！
http://qiita.com/MARQUE/items/fd55153598b74aa5aa17
ChatWork APIをJavaで使うためのChatWork4j

[ChatWork4j](https://github.com/MasahiroSaito/ChatWork4j) は [ChatWorkAPI](http://developer.chatwork.com/ja/) を Java で使うためのラッパーライブラリです。
ChatWork4j 自体は Kotlin で書かれています。

ChatWork4j を使うには、直接ダウンロードしプロジェクトにパスを通す、
または、 Gradle や Maven プロジェクトの依存関係に追加します。

## <i class="fa fa-cog"></i> 現バージョン

| ChatWork4j | ChatWork API |
| :--------: | :----------: |
| 1.2        | v1           |
| 2.0        | v2           |

Javadoc: https://masahirosaito.github.io/ChatWork4j/

## <i class="fa fa-cubes"></i> ChatWork4jを依存関係に追加

| repository url                                              |
| :---------------------------------------------------------- |
| https://github.com/MasahiroSaito/ChatWork4j/raw/master/repo |

| dependency |                   |
| :--------- | :---------------- |
| groupId    | com.MasahiroSaito |
| artifactId | ChatWork4j        |
| version    | 2.0               |

### Gradle

#### repositories

```build.gradle
    maven {
        name = 'chatwork4j-repo'
        url = 'https://github.com/MasahiroSaito/ChatWork4j/raw/master/repo'
    }
```

#### dependencies

```build.gradle
    compile 'com.MasahiroSaito:ChatWork4j:2.0'
```

### Maven

#### repositories

```xml
  <repository>
    <id>chatwork4j-repo</id>
    <url>https://github.com/MasahiroSaito/ChatWork4j/raw/master/repo</url>
  </repository>
```

#### dependencies

```xml
  <dependency>
    <groupId>com.MasahiroSaito</groupId>
    <artifactId>ChatWork4j</artifactId>
    <version>2.0</version>
  </dependency>
```

## <i class="fa fa-play-circle-o"></i> Java使用例

1. 取得した自分の Token を引数にして ChatWork4j オブジェクトを作成する
2. 作ったオブジェクトから各 API メソッドを呼び出す
3. 結果がそれぞれのオブジェクトとして返ってくる


```java
public static void main(String...args) {
    ChatWork4j chatWork4j = new ChatWork4j("xxxxxxxxxxxxxxxxxxxxxx");

    System.out.println(chatWork4j.getMe());
    System.out.println(chatWork4j.getMyStatus());

    for (Task task : chatWork4j.getMyTasks()) {
        System.out.println(task);
    }

    for (Contact contact : chatWork4j.getContacts()) {
        System.out.println(contact);
    }

    for (Room room : chatWork4j.getRooms()) {
       System.out.println(room);
    }
}

```

## <i class="fa fa-check-circle-o"></i> 2017年1月27日 更新

[2017/01/26 - チャットワークAPIバージョンアップのお知らせ](http://help.chatwork.com/hc/ja/articles/115000019401)

チャットワークの API が v2 になったため、ChatWork4j も 2.0 にバージョンが上がりました。
FreeBSDでD言語を動かす

## 目標

なるべく省エネでやっていきたいと思います。

[公式](http://dlang.org/download.html)どおりに

```
curl -fsS https://dlang.org/install.sh | bash -s dmd
```

して Hello, World! するところまでをやってみます。

(追記: FreeBSDならportsでも入れられるのでは？ということを言われました。たしかにportsのlang/dmd2にありますが、2017/1/26日時点で最新のlang/dmd2にあるバージョンはdmd-2.071.1とやや古めなので注意)

## 作業ログ

環境構築にはvagrantを使います。FeeBSDは公式でboxを提供してくれているのでそれを使います。

```
$ vagrant init freebsd/FreeBSD-11.0-RELEASE-p1
$ vagrant up
$ vagrant ssh
```

FreeBSDのバージョンは以下のように確認します。

```
vagrant@:~ % freebsd-version
11.0-RELEASE-p7
```

次にインストールするために必要なものを確認します。

まず、install.shファイルをダウンロードしてくるためにcurlが必要になります。

またデフォルトのシェルはcshで、最初からbashは入ってないので入れる必要があります。

```
vagrant@:~ % echo $SHELL
/bin/csh
```

FreeBSDの場合、実行時にlibstdc++.soにリンクするためgccも必要になります。

これらをpkgを使ってインストールします。

```
% sudo -i pkg install -y gcc curl bash
```

activateするためにbashを起動してからviとかでファイルを編集します。

```
(dmd-2.073.0)[vagrant@ ~/dev/dlang]$ cat hello.d
import std.stdio;

void main()
{
    writeln("Hello, World!");
}
(dmd-2.073.0)[vagrant@ ~/dev/dlang]$ rdmd hello.d
Hello, World!
```

ここまででHello, World!が動きました。
JavaScript ベスト・オブ・ザ・イヤー2016

[![image](https://cloud.githubusercontent.com/assets/5546996/21958450/fceccf32-daf1-11e6-8913-a0fce9c4e7bf.png)](https://risingstars2016.js.org/ja/)

JavaScriptコミュニティは日々進化しています。今日のトレンドも数か月後には陳腐化しているなんてことは日常茶飯事です。

2016年は終わってしまいましたが、何か重要なことを見逃したのではないかと感じているそこのあなた！

2016年の主要なトレンドをおさらいして、そんな不安を払拭しちゃいましょう。

過去12か月に獲得された Github のスター数を比較して、2016年に支持を集めたプロジェクトを数値に基づいて評価していきます。

2015年はなんといっても [React](https://facebook.github.io/react/) でした。そして、[Flux](http://facebook.github.io/flux/) 実装を席巻したのは [Redux](http://redux.js.org/)でしたね。

2016年、JavaScript の人気プロジェクトはどのようなものだったのでしょうか？

### 目次

1. [2016年人気プロジェクトランキング](https://risingstars2016.js.org/ja/#all)
- [フロントエンドフレームワーク](https://risingstars2016.js.org/ja/#framework)
- [Node.jsフレームワーク](https://risingstars2016.js.org/ja/#nodejs-framework)
- [Reactボイラープレート](https://risingstars2016.js.org/ka/#react-template)
- [モバイル](https://risingstars2016.js.org/ja/#mobile)
- [コンパイラ](https://risingstars2016.js.org/ja/#compiler)
- [ビルドツール](https://risingstars2016.js.org/ja/#build)
- [テスティングフレームワーク](https://risingstars2016.js.org/ja/#test-framework)
- [統合開発環境（IDE）](https://risingstars2016.js.org/ja/#ide)
- [静的サイトジェネレータ](https://risingstars2016.js.org/ja/#ssg)

### 内容

つづきはこちらからどうぞ: https://risingstars2016.js.org/ja/

フィードバックはこちらからお願いします: [Github](https://github.com/michaelrambeau/risingstars2016)
pyenvのPythonでModuleNotFoundError: No module named '_bz2'のエラーが出る


```
ModuleNotFoundError: No module named '_bz2'
```

というエラーが出てまして、途方にくれていました。どうも、bzip2-develがないみたいなので、これをインストールして、さらにPythonを再インストールしたら動きました

```
sudo yum install bzip2-devel 
pyenv uninstall 3.6.0
pyenv install 3.6.0
```

Pythonを再インストールしないとダメなんですね。解決してよかった。
Amazon Linux 2016.09 にopngquant jpegoptim optipngをインストールする


## pngquant
yumはなかったので、githubからcloneしてコンパイル

事前にライブラリをインストールしておく
```
yum install libpng-devel
```

/usr/bin/配下にインストール

```bash
cd /usr/local/src
git clone git://github.com/pornel/pngquant.git
cd pngquant
./configure --prefix=/usr
make
make install
```

## jpegoptim
```bash
yum --enablerepo=epel install jpegoptim
```

##  optipng
```bash
yum --enablerepo=epel install  optipng
```

optipngは要らないかも....。
gmailでメルマガを送る

gmailは一日500件までSMTPでメール送信できる。
よって、その機能使ってcakephp3からメルマガを送ってみる。

今回は新規gmailアカウントを取得し、それをメルマガ送信専用とする。

今回取得した gmail アカウントは your@gmail.com とする。

・maga@mydomain.comのメアドを作成
・上記の転送先を your@gmail.com に指定 



・アプリのセキュリティを緩める
https://www.google.com/settings/security/lesssecureapps

オンにするを選択

・重要 上記じゃまだログインできないので (SMTP server did not accept the password. エラーが出るので。)

https://support.google.com/accounts/answer/6009563
にある
https://accounts.google.com/DisplayUnlockCaptcha

をクリック。

これで送信できるようになる。

gmailを追加してみる

gmailにログイン、> アカウントとインポート > 他のメールアドレスを追加

の順に。

TLS送信で、
SMTPサーバー smtp.gmail.com
ユーザー名 your@gmail.com
パスワード gmailpassword

これで、届いたコードを入力すれば gmail からも送受信できる。

あとは普通に送信するだけ。簡単ですね。
ディレクトリの中身のみを異なるディレクトリにコピーする方法

# ディレクトリの中身をコピーする

ディレクトリの中身だけを別のディレクトリにコピーする必要が生じました。

```
＄ cp  -pR home/hoge home/fuga
```

しかし、上記のようにコマンドを実行したところ、
`home/fuga/hoge`
fugaディレクトリ配下にhogeディレクトリが作成されてしまうことに。

今回はhogeディレクトリの中身をfugaディレクトリにコピーしたいので、ディレクトリを対象とするのではなく、ディレクトリ配下のファイルを対象とすることで無事にコピーすることができました。
実行したコマンドは下記になります。

```
$ cp -pR home/hoge/* home/fuga
```
cocos2d-xにFirebaseをpods経由でインストール for iOS

Firebase on cocos2d-x with cocoapods が2016年ごろはうまく行かなかった。

そのため今までは手動でFirebaseを導入していた（下記リンク参照）。
[Cocos2d-x v3.x プロジェクトにFirebaseのSDKをCocoapodsを使わずに導入する(iOS版)](http://qiita.com/takaoka_hide/items/71e3c6642e7267644ee4)

最近うまくいくようになったので手順を記す。

# TL;DR

バニラのcocos2d-xプロジェクトにpodsでFirebaseを
入れてイニシャライズまでできるようにする。

## 前提

* OSX 10.12.2
* cocos2d-x-3.14
* CocoaPods 1.1.1　（rbenvのruby2.3.3p222からインストール）
* Xcode 8.2.1

### コマンドラインで操作する箇所

1. `cocos new (以下略)` でバニラのプロジェクト(ここではSandboxFBCと仮称)を用意
2. `cd proj.ios_mac` 
3. `pod init` でPodfileを生成。その後下記の行を追加する。

```ruby:Podfile
#ファイルのトップに記載
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'

#target 'SandboxFBC-mobile'のスコープ内に記載
pod 'Firebase'
```

`pod install` でインストール
インストール後はSandboxFBC.xcworkspaceを開く。

###下記はXcodeで操作する。

* プロジェクト設定の 'Build Settings'から、下記図赤線の箇所[^2]に'$(inherited)'を追加してフラグを継承させる。

(反映されると値が継承されて図のようになる。値をポイントで指すことで全部の中身が観れる（スクロールなどは無さそう・・・）。-ObjCもそこで追加されている。)

![override-flags.png](https://qiita-image-store.s3.amazonaws.com/0/12975/f463f20a-587a-3792-13ea-40bf05bca396.png)

* Linked Frameworks and Libraries でライブラリを追加する。GameController.frameworkとMediaPlayer.framework[^1]を追加する。

![adding-fw3.png](https://qiita-image-store.s3.amazonaws.com/0/12975/b53a6a8c-c0a8-bcd6-3792-4082931dedc9.png)

* 最後に、FirebaseのコンソールからGoogleService-info.plistを追加し、ios/AppController.mm に configureなどを記述する。

* 起動すれば準備完了。

[^1]: つい最近必要になったと思われる。MPMoviePlayer関連でコンパイルエラーになった場合は必要。

[^2]: 検索フォームに"lib"と入れて絞り込んでいる
Amazon Linux (t2.micro)にMecab + mecab-ipadic-NEologdをインスールするとエラーが出る（解決した）


Amazon Linux (t2.micro)にmecab-ipadic-NEologdをインストールしようとしたらエラーが出て困りました

```
reading ./mecab-user-dict-seed.20170123.csv ... /home/webmanager/mecab-0.996/mecab-ipadic-2.7.0-20070801/mecab-ipadic-neologd/bin/../libexec/make-mecab-ipadic-neologd.sh: 466 行: 25644 中止                  ${MECAB_LIBEXEC_DIR}/mecab-dict-index -f UTF8 -t UTF8
```

こんな感じのエラーが出るんですよね。もともとmecabをyumでインストールしていて、UTF8の問題なのかなぁといろいろ調べていました。しあｋし、結局はファイルをコピーしている時にメモリ不足でエラーが起こるみたいです。

ですので、対処方法はスワップを作ってあげればオッケーです

```
sudo dd if=/dev/zero of=/swapfile1 bs=1M count=2048
sudo chmod 600 /swapfile1
sudo mkswap /swapfile1
sudo swapon /swapfile1
```

2048MBも必要かはわかりませんが、とりあえずこれでインストールできました。よかったよかった。
docker の CPU の使用量を設定及び変更する

# 概要

docker 1.13.0 からコンテナを実行するときに、```--cpus 1.0``` のような形で
CPUの使用量を制限できるようになった。
実行中のコンテナの値を変更できるか知りたかったので調べた

* [CPU Management in Docker 1.13 - Docker Blog](https://blog.docker.com/2017/01/cpu-management-docker-1-13/)

# 結論

変更できる

ただし
docker 1.13.0 での ```--cpus 0.5``` のような形で設定できる方法は見つかっていないが
 
[docker update](https://docs.docker.com/engine/reference/commandline/update/) で以下のオプションなどを使うと
変更が可能のようだ。


```
--cpu-period 	0 	Limit CPU CFS (Completely Fair Scheduler) period
--cpu-quota 	0 	Limit CPU CFS (Completely Fair Scheduler) quota
```

# 参考

## 参考にした、stackoverflow 及びリンクなど

* [Docker container CPU allocation - Stack Overflow](http://stackoverflow.com/questions/33423164/docker-container-cpu-allocation)
* [Marek Goldmann | Resource management in Docker](https://goldmann.pl/blog/2014/09/11/resource-management-in-docker/)
* [docker update - Docker](https://docs.docker.com/engine/reference/commandline/update/)

## kernel の文書
* [kernel sched-bwc](https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt)

## 日本語の説明 
* [3.2. cpu](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/sec-cpu.html)
猫とイカを眺めてまったりするためのコード on nodejs

猫とイカのAAを無限に眺めるためのコードを書きました。
実行するためにはnodejsが必要です。

### ソースコード
```js:loop.js
var cat = "";

setInterval(function () {
  cat += ' (ΦωΦ)';
  console.log(cat);
}, 1000);

setInterval(function () {
  console.log("くコ:彡");
}, 2000);

setInterval(function () {
  cat = "";
}, 10000);
```

### 実行方法
```
node loop.js
```
※終了するためにはCtrl-Cを押してください

### 参考
- [Node.jsで定期的に実行](http://qiita.com/tq_jappy/items/c5ebfdb30dc90617414f)
docker で実行中のコンテナの設定を変えるときのコマンド

# 概要

docker コンテナを起動した後、いくつかのオプションは、変更ができるのだが
それを変更するコマンドを毎回忘れるのでメモ

# 結論

```
docker update
```

# 参考

* [docker update - Docker](https://docs.docker.com/engine/reference/commandline/update/)
階層構造になったcmakeプロジェクトのコンパイルにはadd_subdirectory


こんな感じのプロジェクトがあったときに

```Text
- AAA --- bbb.cpp
 		|
 		|- CMakeLists.txt (1)
 		|
 		|- CCC --- ddd.cpp
 				 |
 				 |- CMakeLists.txt (2)
```

ddd.cppをコンパイルして作ったライブラリファイルをbbb.cppにリンクして使いたい場合は、(1)の中に以下のように書いてやるとうまくいく。

```CMake:CMakeLists.txt(1)
include_directories(CCC)
add_subdirectory(CCC)
```

こうしておくと、CCC内に出来る予定のライブラリファイルをリンクしようとするときに、後のtarget_link_libraryでライブラリが生成されるまで待ってくれる。

※　link_directoryとかを使うとCCCディレクトリ内のコンパイルが終わる前にリンクしようとしたりしてハマって不幸になるので注意
curlで同じURLをループして叩くshellスクリプト

```bash:curl_loop.sh
#!/bin/sh

URL="http://api.example.com/v1/hogehoge.json"; #接続先
HEAD="Content-Type:text/xml"; #リクエストヘッダー
DIR="."; #結果保存先ディレクトリ

for i in {0..100}
do
    SETDT=`date "+%Y%m%d%H%M%S"`
    curl -H $HEAD $URL > $DIR/$SETDT.txt;
    sleep 1;
done
```
Macのログイン画面でキーボードがきかずにログインできない時にやったこと

OS: X El Capitan

アップデートかけたら、キーボードが効かない上に、
2つ目のディスプレイが認識されなくなった。。。

#やったこと

1. 別のキーボードだと入力できたのでそれでログイン


2. Mac の SMC (システム管理コントローラ) をリセットする
https://support.apple.com/ja-jp/HT201295


これで直った！
キーボードも使えて、デュアルディスプレイに！

#おまけ01
最悪、以下もやるつもりだった

Mac の NVRAM をリセットする方法
https://support.apple.com/ja-jp/HT204063

#おまけ02
SMCリセットでも効かなかった事があって、
その時は別のBluetoothキーボードでつないで、セーフモード起動したら直った。
ただ、またデュアルからシングルディスプレイになっちゃったので、
またSMCリセットやったけど。

Mac の起動を完了できない場合にセーフモードを試す
https://support.apple.com/ja-jp/HT201262
railsでYouTube data API を利用する方法（search）

#1 　YouTube APIの登録とキーの取得
　 YouTubeAPIのガイドラインを参考にして認証キーとAPIのステータスをONにする。
　 https://developers.google.com/youtube/v3/getting-started?hl=ja

#2　Gemfileをインストールする
``` 
gem 'google-api-client', '<0.9'
gem 'trollop', '~> 2.1'
```
　
#3　コードサンプルを参考に改良する。
ガイドラインのコードを参考にファイルを作成する。

```youtube.rb
require 'rubygems'
require 'google/api_client'
require 'trollop'

DEVELOPER_KEY = 'google developerで取得したキー'
YOUTUBE_API_SERVICE_NAME = 'youtube'
YOUTUBE_API_VERSION = 'v3'

def get_service
  client = Google::APIClient.new(
    :key => DEVELOPER_KEY,
    :authorization => nil,
    :application_name => $PROGRAM_NAME,
    :application_version => '1.0.0'
  )
  youtube = client.discovered_api(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION)

  return client, youtube
end
```


```controller.rb
def main
  opts = Trollop::options do
    opt :q, 'Search term', :type => String, :default => '検索ワード' #defaoultの内容を検索したいワードにする。
    opt :max_results, 'Max results', :type => :int, :default => 25 #検索結果数を決める（最大50まで）
    opt :order, 'order', :type => String, :default => 'viewCount' #視聴回数の多い順にデータを取得する。
  end

  client, youtube = get_service

  begin
 
    search_response = client.execute!(
      :api_method => youtube.search.list,
      :parameters => {
        :part => 'snippet',
        :q => opts[:q],#上記の検索ワードを変換する
        :maxResults => opts[:max_results]#上記の取得数を変換する
        :order => opts[:order],#上記の取得順を変換する
      }
    )
  puts search_response

  rescue Google::APIClient::TransmissionError => e
    puts e.result.body
  end
end
```

検索条件の追加などはガイドラインのリファレンスを参照すれば自由に編集できる。


#　実際に使ってみる

具体的な例があった方がわかりやすいと思うので、実際に使用したコードを載せます。
もっとこうした方がリファクタリングの部分でもよいとかあれば是非助言お願いします。

```youtube_controller.rb

def index
  get_data("スポーツ")
end


def get_data(keyword)
  require 'youtube.rb'#先ほど上で準備したファイルを呼ぶ
  opts = Trollop::options do
    opt :q, 'Search term', :type => String, :default => keyword
    opt :max_results, 'Max results', :type => :int, :default => 50
    opt :order, 'order', :type => String, :default => 'date'
    opt :regionCode, 'region', :type => String, :default => 'JP'
  end

  client, youtube = get_service

  begin
 
    search_response = client.execute!(
      :api_method => youtube.search.list,
      :parameters => {
        :part => 'snippet',
        :q => opts[:q],
        :maxResults => opts[:max_results],
        :order => opts[:order],
        :regionCode => opts[:regionCode]
      }
    )
  
  @movies = search_response.data.items#Jsonの中身が多かったので必要な情報のみ受けれるようにしています。

  rescue Google::APIClient::TransmissionError => e
    puts e.result.body
  end
end
```

これで＠moviesのなかに取得したデータ（50件）が格納されました。
例えば1番目の動画のタイトルのみを抽出したい場合は、

```
puts @movies[0]["snippet"]["title"] =>動画のタイトル
```

このようにできると思います！
cx_Oracle でOracle接続

開発環境がWindowsで、Oracleデータベースの文字コードはSJIS。

cx_Oracleを使用して、Oracle接続をしてみたが、どうしても出力結果が文字化けしてしまう。
そこで、下記にて環境変数を指定してみた。

```
os.environ["NLS_LANG"] = "JAPANESE_JAPAN.JA16SJISTILDE"
```

``` oracle_connect.py
import cx_Oracle
import os

os.environ["NLS_LANG"] = "JAPANESE_JAPAN.JA16SJISTILDE"
db_user = 'user'
db_pass = 'xxxx'
db_host = '(DESCRIPTION=(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.1)(PORT = 1521)) (CONNECT_DATA =(SERVER = DEDICATED)(SID = HOGE)))'
con = cx_Oracle.connect(db_user, db_pass, db_host)

cur = con.cursor()
sql = 'select member_id, member_name from members order by 1'
cur.execute(sql)
rows = cur.fetchall()
for row in rows:
    member_id = row[0]
    member_name = row[1]
    print( member_name)
```

うまくいった。
Android プロジェクトで APT を使うためのGradle設定

##はじめに
[Butter Knife](http://jakewharton.github.io/butterknife/)を導入時に、Gradleの設定をしていて知ったこと。

##そもそもaptとは
aptは「Annotation Processing Tool」の略。
余談ですが、[いまだにAPTって言葉使ってるの日本人だけっぽい](http://yyyank.blogspot.jp/2015/05/apt.html)らしいです。

aptに関して詳しくは[こちら](http://qiita.com/rejasupotaro/items/b9b89f88348222b46708)へ。

##Gradleの設定
###Gradleプラグイン2.2未満

```:build.gradle
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

apply plugin: "com.android.application"
apply plugin: 'com.neenbedankt.android-apt'

dependencies {
    compile 'com.jakewharton:butterknife:8.5.1'
	apt 'com.jakewharton:butterknife-compiler:8.5.1'
}
```

上記の書き方をしている記事が多かったが、実際のところGradleプラグイン2.2以上でアノテーションプロセッサーが導入され、追加のライブラリをいれる必要がない。
[Android Plugin for Gradle Release Notes](https://developer.android.com/studio/releases/gradle-plugin.html)

###Gradleプラグイン2.2以上

```:build.gradle
dependencies {
    compile 'com.jakewharton:butterknife:8.5.1'
	annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}
```

```annotationProcessor``` を指定するだけでOK。
【Xcode】端末を接続して実行する時に"Could not find Developer Disk Image"というエラーが出た時の対処法

# エラー内容
Xcodeprojectを開いた状態で端末を接続し、Runボタンを押すと"Could not find Developer Disk Image"というエラーが出る
![スクリーンショット 2017-01-26 14.37.44.png](https://qiita-image-store.s3.amazonaws.com/0/41732/123a7010-bd57-5ce2-8f22-16457cc4410a.png)


# 再現した環境
>Xcode7.2.1 (7C1002)
>iOS 10.2(14C92)

# 原因と対処法

原因は
*/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport*
以下にこれからインストールしようとしているiOSに対応したフォルダがなかったからです

対処法はこちらの記事ですでに詳細に書かれています
>**【iOS】端末をアップデート後、Xcodeで実機に書き込めなくなった場合**
>http://qiita.com/Hakota/items/59b4247a203e2639f8c9

ただ今回のケースはやや特殊で、元々配置していたDeviceSupport以下のフォルダは*10.2 (14C89)*でした。
こちらのフォルダが入っていたXcodeはこの事象が発生した2017年1月24日時点で最新のバージョンです。

![スクリーンショット 2017-01-26 14.47.18.png](https://qiita-image-store.s3.amazonaws.com/0/41732/5d375ab2-738c-9a10-40f6-a07973445bf4.png)

この状態で対象の端末(iOS 10.2(14C92))にインストールしようとしたところ、依然として"Could not find Developer Disk Image"のエラーが出ました。

どうやらDeviceSupport以下にある10.2(14C89)のバージョンが対象のiOS 10.2(14C92)よりも古いとDeveloper Disk Imageを検知してくれないようです。

![スクリーンショット 2017-01-26 14.47.18 のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/41732/edbb7ff9-5ae2-27ef-1be0-e1b11cccc1e7.png)
こちらのカッコの中のバージョンですね。

それを以下のように変更

![スクリーンショット 2017-01-26 14.46.11.png](https://qiita-image-store.s3.amazonaws.com/0/41732/a35758f9-dc88-a255-4e2c-f0bd9d781b68.png)

こうすることで、無事に対象のiOSバージョンiOS 10.2(14C92)が入った端末にもインストールすることができました。

とはいえこちらは暫定的な対応で、わざわざフォルダにパッチバージョンが記載されているということは「このバージョン以下のiOSだったら正常に動作するよ」という意味だと思われます。
なので、今回の対応は

>xcode:最新バージョン
>iOS:Xcode最新バージョンが想定しているよりも最新のバージョン

という環境でエラーが起きた場合のみ試してみることを推奨します。

それ以外の場合は従来の対応どおり、
**最新のxcodeを落とすor最新のXcodeのDeiveceSupport以下のフォルダをコピーして持ってくる**
という対応がいいと思います。


何か不備、補足情報等ありましたらコメントをいただけますと幸いですm(__)m
TSQLで整数値の16進数表現を出力する

SQL Server 2016(13.0.1722) で。

```sql
declare @i int = -1

select convert(varchar(8), cast(@i as varbinary(4)), 2 )
```

出力はこんな感じ

```
FFFFFFFF

(1 行処理されました)

```

convert の type を 1 にすれば "0x"付きで出力される。
スクリーンショットを撮ってすぐにkobitoに貼り付ける方法


知らなかった。

1. 下のコマンドでスクリーンショットを撮る

	```
	cmd + shift + ctrl + 4
	```
	
	するとクリップボードに画像本体が保存される


2. kobitoの編集ページにペーストする

	```
	cmd + v
	```

3. アップロード上限を何とかする
	qiitaになにも記事をアップロードしないと月間の上限が２Mらしくすぐにこんな感じになる
	
	> "![アップロードに失敗しました Kobito.FfuwEo.png: 月間のアップロード上限を超えています]()

	アップロードすると100MBになるらしいので、とりあえずこの記事をアップロードして試してみる
	Markdownの形式でkobitoには貼り付けされるので便利
	
追記:
![Kobito.tA1MML.png](https://qiita-image-store.s3.amazonaws.com/0/9518/29a3fd46-2295-e38e-7f1a-b4a614290462.png "Kobito.tA1MML.png")

無事に上限が上がったらしい。

こんな感じで貼付けされた。
```
![Kobito.tA1MML.png](https://qiita-image-store.s3.amazonaws.com/0/9518/29a3fd46-2295-e38e-7f1a-b4a614290462.png "Kobito.tA1MML.png")
```

捗る。
渋谷LT1/25

#今日のLT
プレゼンター:kodukiさん
AWSでパケット量が問題になった話
<iframe src="//www.slideshare.net/slideshow/embed_code/key/MJvxXsiBF1Io8s" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/secret/MJvxXsiBF1Io8s" title="AWSpacket" target="_blank">AWSpacket</a> </strong> from <strong><a target="_blank" href="//www.slideshare.net/kumaco">kumaco</a></strong> </div>
プレゼンター:beta_chelseaさん
RSpecの便利なコマンド等の話
http://qiita.com/beta_chelsea/items/6914978bb48f732ac173

プレゼンター:hayashidaさん
webでの変更をiosやandroidデバイスなどに共有するときの処理の話
<iframe src="//www.slideshare.net/slideshow/embed_code/key/LJDisAHdapWBf9" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/secret/LJDisAHdapWBf9" title="Socket.ioについて" target="_blank">Socket.ioについて</a> </strong> from <strong><a target="_blank" href="//www.slideshare.net/kumaco">kumaco</a></strong> </div>

#ゼロから作るDeep Learning第四回
今日の範囲は3.6から３章の終わりまででした
###今日のメモ
書籍の中で解説されたコードは全部このgithubにおいてあるらしい
https://github.com/oreilly-japan/deep-learning-from-scratch
MNIST:
　手書き数字の画像のセットで機械学習で有名なデータセット
　28*28のピクセルで構成されているグレー画像
　各ピクセルは0~255の値をとる
Load_mnistはmnistファイルを「(訓練画像, 訓練ラベル), (テスト画像, テストラベ ル)」という形式で返す関数
バッチ処理とは入力データをまとめて処理すること
一番最初の入力データを行列データとして渡すことでファイル１つごとにループする必要がなくなり、処理時間が短くなるというメリットがある
今の段階では問題ないが学習時はバッチ単位か一個ずつ学習させるのかが重要になってくる
ニューラルネットワークは前処理が大事

###感想
今回で三章も終わり
この章ではまだ学習については触れず、判断基準がある前提でどのように判断を行うかという内容だったがこの段階でついていくのがいっぱいいっぱい・・・というかついて行けてないという現状
予習はともかく復習はしっかりやらないと勉強会が時間の無駄になりかねない　汗
STAR-CCM+ on Rescale ハンズオン@AWSJ Jan 27th, 2017



Rescale の実験計画法を使いパラメータスタディー機能を体験しよう
======================================================


計算実行までの Overview
------------------------

![Kobito.qRMZAh.png](https://qiita-image-store.s3.amazonaws.com/0/73207/48ee19d9-9a9a-7087-c93b-81bb14a482a9.png "Kobito.qRMZAh.png")

- [計算モデルとパラメータスタディーを行う変数](https://qiita-image-store.s3.amazonaws.com/0/73207/bc1f8ad3-b0da-7b5d-b3c8-86598d1ed6cf.png)
- [特性値](https://qiita-image-store.s3.amazonaws.com/0/73207/68693899-13a1-863e-f9dc-12ced9d381cd.png) 



計算実行方法
-------------------

- [STEP0: ジョブの作成と実験計画法の選択][STEP0]
- [STEP1: 入力ファイルのアップロード][STEP1]
- [STEP2: 並列設定(パラメータリストの定義)][STEP2]
- [STEP3: テンプレートの設定][STEP3]
- [STEP4: ソフトウェアの設定][STEP4]
- [STEP5: ハードウェアの設定][STEP5]
- [STEP6: ポストプロセッシング][STEP6]
- [STEP7: 計算の実行][STEP7]



[STEP0]:http://qiita.com/daikumatan/private/18c00c75ed68d5775bc0
[STEP1]:http://qiita.com/daikumatan/private/67da722d30c6161c2f48
[STEP2]:http://qiita.com/daikumatan/private/ee14638dd909f2920216
[STEP3]:http://qiita.com/daikumatan/private/a7832014dbb646390908
[STEP4]:http://qiita.com/daikumatan/private/d55f103154e6155f594b
[STEP5]:http://qiita.com/daikumatan/private/54f3d76b0fe1b55976b4
[STEP6]:http://qiita.com/daikumatan/private/c607f87688387cd6a2e8
[STEP7]:http://qiita.com/daikumatan/private/05649472ef2b46fb9c29


計算結果確認
-------------------

- [計算結果の確認: 3Dグラフを作成する][result1]
- [計算結果の確認: ある特定のファイルを確認/Downloadする][result2]


[result1]: http://qiita.com/daikumatan/private/2ffa7d255e1210413894
[result2]: http://qiita.com/daikumatan/private/b75311cca75abba46170
DataBindingでContextを引数として渡したい時（getResources()でNullになっちゃう対策）

# getResources()は困る
contextを渡さずにこんなことをやると、`android.content.res.Resources$NotFoundException`でクラッシュします。

```java:Hoge.java
public String getHoge() {
Resources resources = Resources.getSystem();
String str = resources.getString(R.string.hoge);
・・・
}
```
## クラッシュする理由
Resources.getSystem()は[Why can't I use Resources.getSystem() without a Runtime error?](http://stackoverflow.com/questions/8864015/why-cant-i-use-resources-getsystem-without-a-runtime-error)にも記載がある通り、利用できる場所が限られています。

# DataBindingでContextを引数として渡す方法
じゃぁContextを引数として渡してあげればいいんです。

```xml:layou.xml
<TextView
 ・・・
 android:text="@{hoge.getHoge(context)}"
/>
```


```java:Hoge.java
public String getHoge(Context context) {
// これは間違い
//Resources resources = Resources.getSystem();

// こうすればOK
Resources resources = context.getResources();
String str = resources.getString(R.string.hoge);
・・・
}
```
Netatmo Weather StationのAPIをPythonで触ってみる。#Python #Netatmo

#Netatmo Weather Stationとは
[Netatmo Weather Station](https://www.netatmo.com/product/weather/)は室内と屋外に設置して室内環境や屋外の気象情報を計測するIoT端末で[API](https://dev.netatmo.com/dev/resources/technical/introduction)も公開されています。このAPIをPythonで叩いてみたいと思います。

#準備
公式ではPythonのライブラリを公開していないので、サードパーティーのライブラリを使います。ライブラリはphilippelt氏が作成した[lnetatmo](https://github.com/philippelt/netatmo-api-python)が便利です。

##ライブラリのインストール
[lnetatmo](https://github.com/philippelt/netatmo-api-python)こちらからプロジェクトをcloneした後```setup.py```を使用し、ライブラリをインストールしてください。


```text:ターミナル
$python setup.py install
```

pipでもインストール可能です。

```text:ターミナル
$pip install lnetatmo
```

##ユーザー情報を準備
ユーザー情報を準備します。CLIENT_IDとCLIENT_SECRETは[こちら](https://dev.netatmo.com/dev/myaccount)にログインした後、確認可能です。

```text:           
"CLIENT_ID" :  "",     
"CLIENT_SECRET" : "",  
"USERNAME" : "メールアドレス",      
"PASSWORD" : "パスワード"                
```

#お天気情報を取得してみる
lnetatmoを使って最新のお天気情報を取得してみます。

```python:sample.py
#!/usr/bin/python3
# encoding=utf-8

import lnetatmo

#tokenを取得
authorization = lnetatmo.ClientAuth(
                clientId = "",
                clientSecret = "",
                username = "",
                password = "",
                scope = ""
)

#天気情報の取得
weather_station = lnetatmo.WeatherStationData(authorization)

#天気情報の表示
print(weather_station.lastData())
```

こんな感じに取得できれば成功です。
<img width="6000" alt="Screen Shot 0029-01-26 at 14.04.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/4b2fd680-94d0-d85a-ec80-916cdd40bdb0.png">
CakePHP3で楽天ブックス書籍検索APIを使う

CakePHP3にて、楽天ブックス書籍検索APIが繋がるまでのメモ。

## 前提
- CakePHP3がインストールしてある
- SearchControllerというコントローラがある


## 楽天APIの準備
1. 楽天にて`楽天ID`取得
1. [楽天 Web Service](http://webservice.rakuten.co.jp/) にて `アプリID`を取得

## CakePHP
### Rakuten Web Service SDK for PHP をインストール
- composer.json の`require`タグに追加する

~~~bash
{
    "require": {
        "rakuten-ws/rws-php-sdk": "1.*"
    }
}
~~~

- インストール

~~~bash
php composer update
php composer install
~~~

- composerの場所がわからない場合

~~~bash
which composer
~~~


### Controllerの記述

~~~PHP
require_once ROOT."/vendor/rakuten-ws/rws-php-sdk/autoload.php";

class SearchController extends AppController
{
    public function index()
    {
        $client = new \RakutenRws_Client();

        // アプリID (デベロッパーID) をセット
        $client->setApplicationId('[アプリID]');

        // 「うどん」を検索してみる
        $response = $client->execute('BooksBookSearch', array(
          'keyword' => 'うどん'
        ));

        // レスポンス確認
        if ($response->isOk()) {
            // とりあえず出力
            print("<pre>");print_r($response);print("</pre>");
        } else {
            // エラーを出力
            echo 'Error:'.$response->getMessage();
        }
        exit;
    }

~~~

### 確認してみる
- ビルトインサーバ起動

~~~bash
bin/cake server -H 0.0.0.0
~~~

- ブラウザでアクセスしてみる

~~~
http://[自分の環境]:8765/search/index
~~~
curl コマンドで Qiita API を試す方法

## やること
- `curl` コマンドで Qiita API を叩いてみる

## Qiita API を実行するトークンを発行する
- https://qiita.com/settings/applications でトークンを発行
- 以下トークンは `xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx` と表記

## `curl` で Qiita API を叩いてみる
- `curl` にオプションでヘッダーの設定が必要なので注意

```
$ curl -sSH "Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" https://qiita.com/api/v2/authenticated_user
{"description":"","facebook_id":"","followees_count":44,"followers_count":2,"github_login_name":"itooww","id":"itooww","items_count":2,"linkedin_id":"","location":"","name":"","organization":"","permanent_id":79267,"profile_image_url":"https://qiita-image-store.s3.amazonaws.com/0/79267/profile-images/1473701386","twitter_screen_name":"itooww","website_url":"","image_monthly_upload_limit":104857600,"image_monthly_upload_remaining":104857600,"team_only":false}
```

## レスポンスを見やすくする

```
$ curl -sSH "Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" https://qiita.com/api/v2/authenticated_user | jq -C .
{
  "description": "",
  "facebook_id": "",
  "followees_count": 44,
  "followers_count": 2,
  "github_login_name": "itooww",
  "id": "itooww",
  "items_count": 2,
  "linkedin_id": "",
  "location": "",
  "name": "",
  "organization": "",
  "permanent_id": 79267,
  "profile_image_url": "https://qiita-image-store.s3.amazonaws.com/0/79267/profile-images/1473701386",
  "twitter_screen_name": "itooww",
  "website_url": "",
  "image_monthly_upload_limit": 104857600,
  "image_monthly_upload_remaining": 104857600,
  "team_only": false
}
```

## 長いレスポンスを `less` で見る

```
$ curl -sSH "Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" https://qiita.com/api/v2/authenticated_user/items | jq -C . | less -R
```


## 検証環境
```

$ curl --version
curl 7.52.1 (i686-pc-cygwin) libcurl/7.52.1 OpenSSL/1.0.2j zlib/1.2.8 libidn2/0.11 libpsl/0.14.0 (+libidn2/0.11) libssh2/1.7.0 nghttp2/1.14.0
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: Debug IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy Metalink PSL

$ jq --version
jq-1.5

$ less --version
less 481 (POSIX regular expressions)
Copyright (C) 1984-2015  Mark Nudelman

less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Homepage: http://www.greenwoodsoftware.com/less

```

## Reference
- https://qiita.com/api/v2/docs
- https://curl.haxx.se/docs/manpage.html
- https://stedolan.github.io/jq/manual/

## 所感
- コマンドが長くなりすぎると入力とか面倒なので `curl` 以外で手軽な方法あれば知りたい・・・
    - API 試すアプリとかインストールするのは抵抗あるので cli で完結したいならスクリプト作れって話になりそう

EOF
jqueryでOGタグとTwitterタグを取得する

# metaタグの取得
とある案件で、metaタグをjQueryで動的に書き換える必要があったので、
その時の対応方法をメモ代わりに投稿します。
※　もっといいやり方あるって方は、ご教授のほど宜しくお願い致します。

## FacebookのOGタグ取得
```html
<meta property="og:title" content="テスト">
```
こちらのcontentの中身を取得する際は、jQueryで以下のようにする。
```$("meta[property='og:title']").attr('content');```
今回で言えば、「テスト」を取得できる。

こちらを書き換える際は以下。
```$("meta[property='og:title']").attr('content','書き換え後');```
こちらで書き換えることができる。

タイトルにかぎらず、OGタグは共通で、
```$("meta[property='og:<必要なタグ>']").attr('content');```
で操作できるようになる。

## Twitterカードタグのメタタグ取得
```html
<meta name="twitter:title" content="テスト">
```
こちらはのcontentの中身を取得する際は、jQueryで以下のようにする。
```$("meta[name='og:title']").attr('content');```
今回で言えば、「テスト」を取得できる。

こちらを書き換える際は以下。
```$("meta[name='twitter:title']").attr('content','書き換え後');```
こちらで書き換えることができる。

タイトルにかぎらず、OGタグは共通で、
```$("meta[name='twitter:<必要なタグ>']").attr('content');```
で操作できるようになる。
Android で BLE Peripheral 機能が使える端末を調べる

Android 5.0 から BLE peripheral に対応した Android ですが、OS のバージョンを 5.0 以上にしてもペリフェラル機能が使えない機種がありました。
その原因と見分け方、試してみた機種のリストをまとめます。

# 原因
本体に載っているチップセットが対応していないと使えないようです。
Broadcom の HCI コマンドに対応しているチップセットでないといけません。

# 判別方法
このコードによって対応しているかどうか調べることができます。
対応していなければ false が返ります。

```
bluetoothAdapter.isMultipleAdvertisementSupported(); 
bluetoothAdapter.isOffloadedFilteringSupported(); 
bluetoothAdapter.isOffloadedScanBatchingSupported();
```


# 試してみた機種
|機種|Peripheral への対応|
|:-----------:|:------------:|
|Nexus 5|×|
|Nexus 5X|○|
|Nexus 6|×|
|Nexus 6P|×|
|Nexus9|○|
jQueryを書く際に使っているテンプレート

#jQueryで実装する時に使ってるテンプレ
js,jQueryを書いてると汚くなる事が多いので、
記述する際は下記テンプレを使って書いてます。

```js:template
var hoge = function(){
    var self;

    this.init = function(){
        self = this;
    }
    
    this.init();
}
var Hoge = new hoge();
```
上記だけでは解りずらいので、使用例を記載します。

以下はradioボタン変更に応じてタグの挿入・削除をする処理となります。

```js:使用例
var tag = function(){
    var self;
    var $addpoint = $('#addpoint');//タグを追加する場所
    var tagclass = 'add_sample';//追加するタグのクラス名
    var ID = 1;//タグを追加するradioボタンのID
    var TAG = '<p class="add_sample">追加されたタグ</p>';//タグ
    
    this.init = function(){
        self = this;
        
        $('input[name="parts_type"]:radio').change( function() {
            if ($(this).val() == ID) {
                self.add();
            } else {
                self.remove();
            }
        });
    }
    
    this.add = function(){
        $addpoint.before(TAG);
    }
    
    this.remove = function(){
        $('.'+ tagclass ).remove();
    }
    
    this.init();
}
var Tag = new tag();
```
Cygwin上のrubyで共有ライブラリロードエラー

# 現象

ruby(2.3.3) 上 itamae を実行していて以下のエラーが発生するようになった。

```
$ itamae ssh ...
/c/Users/xxx/.rbenv/versions/2.3.3/lib/ruby/2.3.0/fiddle/import.rb:86:in `rescue in block in dlload': can't load user32 (Fiddle::DLError)
        from /c/Users/xxx/.rbenv/versions/2.3.3/lib/ruby/2.3.0/fiddle/import.rb:83:in `block in dlload'
        from /c/Users/xxx/.rbenv/versions/2.3.3/lib/ruby/2.3.0/fiddle
...
```

# 対応

回避策として、2つのファイルを修正した。
本来なら dlload の中身を直した方が良さそうだけど、取りあえず。
Ruby 2.4.0ではこの部分が修正されているので必要ないらしい（[情報源](http://qiita.com/shimarisu/items/38e06f5604e460f0b503)）。

* ~/.rbenv/versions/2.3.3/lib/ruby/2.3.0/win32/resolv.rb
* ~/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/net-ssh-4.0.1/lib/net/ssh/authentication/pageant.rb

## resolv.rb

### 前

```ruby:~/.rbenv/versions/2.3.3/lib/ruby/2.3.0/win32/resolv.rb
module Kernel32
  extend Importer
  dlload "kernel32"
end
```

### 後

```ruby:~/.rbenv/versions/2.3.3/lib/ruby/2.3.0/win32/resolv.rb
module Kernel32
  extend Importer
  dlload "kernel32.dll"
end
```
## pageant.rb

### 前

```ruby:~/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/net-ssh-4.0.1/lib/net/ssh/authentication/pageant.rb
        dlload 'user32.dll'
        dlload 'kernel32.dll'
        dlload 'advapi32.dll'
...
        dlload 'user32.dll','kernel32.dll', 'advapi32.dll'
```

### 後

```ruby:~/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/net-ssh-4.0.1/lib/net/ssh/authentication/pageant.rb
        dlload 'user32.dll'
        dlload 'kernel32.dll'
        dlload 'advapi32.dll'
...
        dlload 'user32.dll','kernel32.dll', 'advapi32.dll'
```

# 参考

* [CygwinにRubyのpryをインストールする。 - Qiita](http://qiita.com/shimarisu/items/38e06f5604e460f0b503)
Leaflet で map.on('load') が発火しない場合の処方箋

# 事象
以下の実装だと `load` イベントがうまく発火しない！？

```js:この実装はイベントが発火しない
  var map = L.map('map').setView([51.505, -0.09], 13);
  L.tileLayer('https://api.mapbox.com/styles/v1/k-nakamura/ciujeilwt003u2jqn47v2ozcs/tiles/256/{z}/{x}/{y}?access_token=pk.eyJ1Ijoiay1uYWthbXVyYSIsImEiOiJjaXVqZWd6OTMwMGhjMnlxaXZrcGhzczJtIn0.LQwDcl6aZFQRx8dPfneFHQ', {
    attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://mapbox.com">Mapbox</a>',
    maxZoom: 18
  }).addTo(map);

  map.on('load', function() {
    alert('The map load event is fired');
  });
```

[確認ページ](https://jsfiddle.net/kozy4324/dm0jv048/1/)

# 原因： load イベントのドキュメントを見るべし

> Fired when the map is initialized (when its center and zoom are set for the first time).

というわけで緯度経度とズームを最初にセットしたタイミングで発火する。
上記のコードでは初期化メソッドで渡しているので `load` イベントコールバックを渡せるタイミングがない。

# 解決策: イベント設定してから `.setView()`

```js:イベントが発火する
  var map = L.map('map');
  L.tileLayer('https://api.mapbox.com/styles/v1/k-nakamura/ciujeilwt003u2jqn47v2ozcs/tiles/256/{z}/{x}/{y}?access_token=pk.eyJ1Ijoiay1uYWthbXVyYSIsImEiOiJjaXVqZWd6OTMwMGhjMnlxaXZrcGhzczJtIn0.LQwDcl6aZFQRx8dPfneFHQ', {
    attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="http://mapbox.com">Mapbox</a>',
    maxZoom: 18
  }).addTo(map);

  map.on('load', function() {
    alert('The map load event is fired');
  });
  
  map.setView([51.505, -0.09], 13);
```

[確認ページ](https://jsfiddle.net/kozy4324/dm0jv048/3/)

# それでも発火しない場合

また別の原因だと思います :construction_worker:
CentOS 7 にyumでNode.js 4.x をインストールする

##リポジトリの追加
```sudo curl -sL https://rpm.nodesource.com/setup_4.x | bash -```
`setup_4.x`の部分を`setup_5.x` `setup_6.x` `setup_7.x` のいずれかにして実行すると、それぞれのバージョンに対応したものが追加されます。

## 必要なライブラリのインストール
```sudo yum install -y gcc-c++ make```
これは既にインストールされていれば不要です。

## Node.js 4.xのインストール
```sudo yum -y install --disablerepo="epel" nodejs```
epelリポジトリを有効にしている場合はそちらが優先されて、常に`6.x`がインストールされてしまうようです。
`--disablerepo="epel"`をオプションに指定して無効化するとうまくいきます。
MySql バイナリログ on Ubuntu

## How to enable

`my.cnf` の修正
 
```bash
$ locate my.cnf
/etc/mysql/my.cnf
..
$ sudo diff /etc/mysql/my.cnf /etc/mysql/my.cnf.backup
< log_bin                       = /var/log/mysql/mysql-bin.log  # コメントインする
< expire_logs_days      = 7 # 日付はお好みで。ディスクサイズや保持期間と相談してください
---
> #log_bin                      = /var/log/mysql/mysql-bin.log
> expire_logs_days      = 10
```

 MySQL restart

```bash
$ sudo /etc/init.d/mysql restart
```

## How to check

```bash
$ which mysqlbinlog # インストールされてるか確認
$ sudo ls -ltr /var/log/mysql/ # 最新のバイナリログを探す
$ sudo mysqlbinlog /var/log/mysql/mysql-bin.000001 # 見る
```


## References

* https://open-groove.net/mysql/mysql-binlog/
* http://d.hatena.ne.jp/omiyan/20110128/p1
ngrokを使って社内の人たちに、自分のローカル起動のRailsアプリを見てもらう方法

# 概要

サブドメイン運用を基軸にしているRailsアプリがあります。
favyですｗ
「www.favy.jp」や「page.favy.jp」などサブドメイン運用を基本としています。
しかも色々開発工程の都合から1つのRailsアプリでそれを運用していたりします(だからroutesも結構な記述量です)。

単一ドメインであればlocalhost:3000で見ればいいんだけども、サブドメインとなるとlocalhost:3000じゃ全然機能しないので、さて困った！という人たちは[puma-dev](http://qiita.com/cyborg__ninja/items/7bfbc9e9f1669e3eed02)を使えば良いというプラクティスがあります。

んでだ。
これを社内(とかdeployまでいかないレベルで見せたい！という)人たちに見せようとなったときにこれでも不十分となるため、そいつを解決しようぜ！が今回の全体概要です。

※なお、単一ドメインであればifconfigなどで調べた自分のIPアドレスを使って、192.168.1.100:3000みたいなIPアドレスで提供すればLAN環境内であれば見てもらうことは可能だね！

# ngrokをインストールしよう

便利なものがあります。ngrok。なんて読むのか知りませんが「えぬじーろっく」とか「んごろく」とか呼んでます。

## インストール方法

ngrokは2.0台と1.7台とがあるようですが、とりあえず最新入れよう。

```sh
brew cask install ngrok
```
でOKです。
(brew install caskroom/cask/ngrok2 とかでも)

&nbsp;

※上記のインストには<font color="#F00">homebrew-caskが必要</font>。入ってない人は、

```sh
brew install caskroom/cask/brew-cask
```
とかしてインストしとこう。

## 起動方法

```sh
ngrok http -host-header=rewrite www.favy.dev:80
```
こんな感じです。www.favy.devはpuma-dev使ってるURLです。

```shell-session
ngrok by @inconshreveable                                                                                                                                                                                                                                       (Ctrl+C to quit)

Session Status                online
Version                       2.1.18
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://16687cb4.ngrok.io -> www.favy.dev:80
Forwarding                    https://16687cb4.ngrok.io -> www.favy.dev:80

Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.00
```
うまくいくとこんなような画面が出てきます。

上記にある「Forwarding」の欄の**「 http://16687cb4.ngrok.io 」**を提供すれば、誰でも自分のPCの開発環境状態でプレビューしてもらうことができます。

なお、ngrokを使うと**https(SSL)環境**も同時にテストができるようになるので、オレオレSSLとかも手元環境には不要になるため、その点でも超便利です。

---
2019130追記：

## ngrokのログを見る

ログみたいなーと思ってたんですが、ざざーーと流れてしまうコンソールの標準使用では攻殻機動隊の人たちのような動体視力がないと見えないです。
それをウォッチするためになんかないかと思ったら公式にすごく便利な事が書いてあって、
`localhost:4040`
にアクセスすることで、ログやらインスペクトやらをGUIで見ることが出来ます。

> **Inspecting your traffic**
> ngrok provides a real-time web UI where you can introspect all of the HTTP traffic running over your tunnels. After you've started ngrok, just open `http://localhost:4040` in a web browser to inspect request details.

さらに便利。

参考： [ngrok公式: https://ngrok.com/docs](https://ngrok.com/docs)