OmniAICreator/Qiita-1.07M huggingface dataset:
無料でFreeBSD上でクラウドCIする方法

FreeBSDのCI環境を無料で構築したいけどサーバの管理はしたくない、という場合の選択肢について調べてみました。

## 前提

筆者はCで書かれたOSSを5年ほどメンテしているのですが、FreeBSDで動かない、というissueを受け取ることがあります。また、他のプロジェクトでも環境依存のissueというのは珍しくありません。

環境の差を吸収してくれるような言語を利用しているプロジェクトであれば、環境依存のバグに悩まされることは滅多にないのかもしれません。一方で、Cとシェルスクリプトは環境の差が大きく影響するので、様々なOS上でCIしたいというニーズがあるはずです。

しかし、[Travis CI](https://travis-ci.org/)をはじめとする大半のCIサービスでは、LinuxとmacOSはサポートしているものの、他のOSはあまりサポートされていません。有料プランを含めても、FreeBSDを公式にサポートしているCIサービスは見つかりませんでした。


## Travis CIで頑張る方法

筆者と同じ悩みを持つ人は他にも居るようで、FreeBSDをTravis CI上で動かそうと頑張っている人がネット上でチラホラ見つかります。

失敗パターンから先に紹介しますと、Travis CI上でVirtualBox+Vagrantで任意のOSを動かそうとしてもうまくいきません。Travis CIが現在採用しているコンテナ型の仮想化技術OpenVZの環境ではvboxdrvカーネルモジュールのロードができないため、そもそもVirtualBoxが動作しないということのようです。

唯一Travis CI上でFreeBSDを動かした事例が次の記事です。

- [Geo tips & tricks: Running FreeBSD in Travis-CI](http://erouault.blogspot.jp/2016/09/running-freebsd-in-travis-ci.html)

この記事ではQEMU上でFreeBSDを動かしています。QEMUはハードウェアのレベルで仮想化を行うので、仮想化環境上でも期待通りに動作するというわけです（その代わり速度面では不利になります）。

実際、下記のTravis CIのログを見ると期待通りに動作しているようです。

- https://travis-ci.org/rouault/gdal_coverage/builds/160959790

## AppVeyorで頑張る方法

別の方針として、仮想化技術の違いに着目したアプローチが考えられます。コンテナ型の仮想化環境でVirtualBoxを動かすのが難しいなら、ハイパーバイザー型の仮想化環境であればどうだろうか？というわけです。

[AppVeyor](https://www.appveyor.com/)というWindows環境に特化したCIサービスがあるのですが、ここではHyper-Vというハイパーバイザー型の仮想化技術が使われています。この環境ではVirtualBoxが制限付きながら動作します。

実際にVirtualBox+Vagrant+FreeBSDを動かした事例が下記になります。

- [リポジトリ](https://github.com/hnw/vagrant-appveyor-testing/tree/run-freebsd-box)
- [AppVeyorのログ](https://ci.appveyor.com/project/hnw/vagrant-appveyor-testing/build/43-run-freebsd-box)

ただし、この環境では32bit OSしか動作しません。つまり、FreeBSDも32bit版しか動かせないというわけです。64bit OSを動かすには「Nested Hyper-V」が有効でないといけないのですが、AppVeyorの無料プランでNested Hyper-Vをサポートする予定は無いそうです。

## まとめ

- FreeBSDを公式サポートしているCIサービスは無さそう
- QEMUを使えばどこでもFreeBSDが動かせそう、でもむっちゃ遅い
- AppVeyorならVagrantでFreeBSDが動かせそう、ただし32bit限定

楽をするためにCI環境を探してるのに、むっちゃ苦労してFreeBSDを動かして何になるんだよ！という気持ちになりました。
ざっくばらんメモ_1：kaggle、脳科学とAI、ゲームとAI

###kaggle zillow challenge
ーtruncation
logerrorに対してtruncation、1, 99 percentileでの切り捨てを行う。
結果0.0762954。
続いて他の変数にもtruncationを追加。
追加したのは（finishedsquarefeet12、calculatedfinishedsquarefeet、taxamount）
精度は大きく下がってしまった（0.0762954 -> 0.1232041）
truncationを全く行わない場合：0.2457573。ますます悪くなる。
適度なtruncationが重要？ひとまずlogerrorのみにtruncationを行う。

ーnormalization
normalizationを追加：0.0762954 -> 0.0699197へ改善。normalizationはデフォで追加に。

ーextreme treeとのアンサンブル
extreme treeを使った結果との平均を取るアンサンブルを利用
結果：0.0699197 -> 0.0677271へ改善。
アンサンブルはやはり効果があると思われる。
今後もモデルの追加とstacking, blendingなどのテクニックを追加していくと良さそう。
しかしまだまだ最下位に近いので大きな改善を目指さないときつそうである。

###Neuroscience-Inspired Artificial Intelligence

DeepMindのDemis Hassabisが主著者の論文。
ニューロサイエンスとAIの関係性と将来性について述べたもの。
しっかりと読んではいないが、主にDeepMindの研究紹介になっているもよう。
結論の部分が唯一印象に残っていて、
「ニューロサイエンスそれ自体はAIに解を与えるものではないが、そこで観測された現象に対する
アルゴリズム的な興味を与え、AI分野における研究指針を与えるという意味で有用」
というような事を書いているのが面白く感じた。

関連する話として、最近ではCVPR2017であった講演
James J. DiCarlo, The Science of Natural intelligence (NI): Reverse Engineering Primate Visual Perception
にて、画像を一瞬見せてそれが何か分類させるタスクを人にさせた所、
タスクの難易度が上がるほど分類精度を上げるために画像を見せる時間を上げる必要がある事が分かったそうである。
この事実は聴衆をインスパイアしたそうで質問者が殺到していた。
今後はこれに関する研究が増えるのかもしれない。
ただ、すでに幾人かの研究者が同じCVPRで関連研究を提案していた。
例えばアルゴリズムにフィードバック構造をつける事でタスク（の難易度等）に応じて
適応的に推論プロセスを発展させていける構造が提案されている。
ーFeedback Networks、http://feedbacknet.stanford.edu/

###ゲームとAIとヒューマンインタラクション

現状のゲームベースの研究でメインなのはAIと環境とのインタラクションな気がしている。
実際学習モデルも環境からのフィードバックを元に行動を決定したりしている。
この環境の部分をもっと直接的に人に変える事はまだまだ難しいのだろうか。
例えばデータに関していえばMMOなどのたくさんの人とAIが入り混じる環境を用いればもっと効率よく
正解データが作り出せる期待がある。
正解データが大量に作り出せる土壌がそろえば、研究はかなりやりやすくなるので、
AIのヒューマンインタラクションをもっと広い土壌で学習できないだろうか。
現状は文書ベースの会話のみに終始しており、ゲーミフィケーションもあまり
聞いたことがない（知らないだけだと思うが）。
PG::GroupingError: ERROR:  column "users.id" must appear in the GROUP BY clause or be used in an aggregate function

# はじめに

Ruby on Railsを使ってAPIを開発していたときに遭遇したPostgreSQLに関するエラーとその対処法をご紹介します。

## やりたいこと

ある条件を満たすユーザに関する何らかの値の「平均値」、「合計値」、「合計ユーザ数」を返すメソッドを実装したい。

今回は年齢 (`age`) が20歳のユーザの得点 (`score`) の「平均値」、「合計値」、「合計ユーザ数」を返すメソッドを例にご紹介します。

## 仕様

### 対象のメソッド

```ruby
class User < ActiveRecord::Base

  .
  .
  .

  def self.parameters()
    parameters = User.where(age: 20)
                     .select('COUNT(*) AS total_user,
                              ROUND(AVG(score), 1) AS average,
                              SUM(score) AS total_score')
    {
      average: parameters.first.average || '0.0',
      total_user: parameters.first.total_user,
      total_score: parameters.first.total_score || 0
    }
  end

  .
  .
  .

end
```

### スキーマ

```ruby
# == Schema Information
#
# Table name: users
#
#  age        :integer
#  created_at :datetime         not null
#  id         :integer          not null, primary key
#  score      :integer
#  updated_at :datetime         not null
#
```

# どんなエラー？

```

PG::GroupingError: ERROR:  column "users.id" must appear in the GROUP BY clause or be used in an aggregate function

```

`id`で`GROUP BY`しろ？

# 対処法

`.order(nil)`を追加すれば解決した。

```rb
class User < ActiveRecord::Base

  .
  .
  .

  def self.parameters()
    parameters = User.where(age: 20)
                     .select('COUNT(*) AS total_user,
                              ROUND(AVG(rate_score), 1) AS average,
                              SUM(rate_score) AS total_score')
                     .order(nil) # これを追加
    {
      average: parameters.first.average || '0.0',
      total_user: parameters.first.total_user,
      total_score: parameters.first.total_score || 0
    }
  end

  .
  .
  .

end
```

# 原因

`parameters`は要素が1つの配列になり、その後`.first`でその要素を取得しています。
しかし、Railsは賢いため、`parameters`を取得する際に、`.first`までを1つのクエリとして最適化して処理してしまいます(多分)。
よって、「`.first`をするにはオーダーされていないからダメだよ！」ということになっていました。
ということで、`order(nil)`を追加することでオーダーするつもりはないことをRailsに知らせてあげる必要があったみたいです。

# 結論

Railsは賢い()ので理解が微妙なまま開発を進めてはいけません。
JavaScriptでハッシュの変更に応じて外部jsファイルを動的に読み込む

ハッシュが変わると、そのハッシュ名のjsファイルを読み込む。
サーバ側を作りたくなくて、最初にすべてのjsファイルを読み込みたくない場合に利用できるはず。

```html
<!DOCTYPE html>
<html>
<head></head>
<body>
<a href="#test">test</a>
<script>
window.addEventListener('hashchange', () => {
  const hash = window.location.hash,
        src = "./" + hash.slice(1) + ".js";
  loadScript(src);
});

function loadScript(src) {
  const script = document.createElement('script');
  script.onload = () => {
    console.log(`"${src}" has loaded.`);
  };
  script.src = src;
  document.body.appendChild(script);
}
</script>
</body>
</html>
```

```js:test.js
console.log('"./test.js" is being loaded.');
```
CSSスプライトアニメーションをGPUレンダリングさせる


（2020/03/20: 追記）

codepenのデモつきの記事をこちらに移行しました。

https://takumifukasawa.hatenablog.com/entry/css-sprite-animation-gpu-rendering

↓↓ 以下、元記事です。

---

最終的なデモはこちら。
http://jsdo.it/takumifukasawa/QWj9

## 概要

CSSでスプライト画像の連番アニメーションを実装する場合、background-positionをずらす方法を使っていた。しかし、同じ画面内で、サイズの大きい画像のスプライトアニメーションをいくつも動かしたい場面があり、パフォーマンスがネックになってしまった。

実際、background-positionのcss animationはGPUレンダリングではないので、再描画処理が走ってしまう。chromeのデバッガーツールで、「Rendering」の「Paint Flashing」を見ると、このように再描画処理が走っているのがわかる。

デモはこちら [http://jsdo.it/takumifukasawa/8wb2](http://jsdo.it/takumifukasawa/8wb2)

<img width="840" alt="スクリーンショット 2017-07-30 15.02.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/6873/442dd259-6f95-e404-75ba-d3c49ded548e.png">

```css
@keyframes sprite-image {
  0% {
    background-position: 0 0;
  }
  100% {
    background-position: 0 -1064px;
  }
}

.sprite {
  width: 400px;
  height: 266px;
  background-image: url(http://jsrun.it/assets/M/6/J/N/M6JN2.jpg);
  background-size: 400px 1064px;
  animation: sprite-image 1s steps(4) infinite;    
}
```

## css transformを使う

そこで、GPU処理が適用されるcss transformを使った方法を試してみた。before要素に背景画像を当ててanimationさせることで、DOM構造を変えない形にできた。

先ほどと同じようにchromeのデバッガーツールを見てみると、再描画が走っていないことがわかる。これで、background-positionの時よりも負荷を軽減することができた。

デモはこちら[http://jsdo.it/takumifukasawa/QWj9](http://jsdo.it/takumifukasawa/QWj9)

<img width="829" alt="スクリーンショット 2017-07-30 15.12.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/6873/98e7620a-5c00-aafa-6267-319cab87b459.png">

```CSS
@keyframes sprite-image {
  0% {
    transform: translate(0, 0);
  }
  100% {
    transform: translate(0, -100%);
  }
}

.sprite {
  position: absolute;
  overflow: hidden;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  margin: auto;
  width: 400px;
  height: 266px;
    
  &:before {
    content: "";
    display: block;
    width: 400px;
    height: 1064px;
    background-image: url(http://jsrun.it/assets/M/6/J/N/M6JN2.jpg);
    background-size: 400px 1064px;
    animation: sprite-image 1s steps(4) infinite;
  }
}
```
macOSのターミナルで最後に実行したコマンドをクリップボードにコピーする方法

macOSのターミナルにて、前回実行したコマンドをサクッとメモるためのコマンド `pbcc` です。

`pbcc` は最後に実行したコマンド文字列をクリップボードにコピーします。
(コピーされるのは実行結果ではなくコマンドです)

以下の記述を `~/.bash_profile` に追加します。

```bash:~/.bash_profile
### Copy last command to clipboard
function pbcc() {
  local HISTIGNORE=*
  history -p \!\! | pbcopy
  history -d $(history | awk '{a=$1}END{print $1}')
}
```

その後、以下のコマンドを叩くか、ターミナルを再起動します。

```bash
exec $SHELL -l
```

適当なコマンドを実行後に `pbcc` コマンドを実行します。

```bash
echo "hogehoge"
pbcc
```

するとクリップボードに直前に実行したコマンドがコピーされます。

```txt:クリップボード
echo "hogehoge"
````

これでコマンドのメモをとるのが簡単になりました！ :-)

ついでにエイリアスを作っておくとさらに便利です。

```~/.bash_profile
alias c=pbcc
```

その後ターミナルを再起動し、あとはコマンドをコピーしたいところで `c` と叩くだけで pbcc が実行されます。
各自お好みのエイリアスを設定してください。
slimフレームワークを動かしてみた

友人に紹介されたslimフレームワークを動かしてみました。
今回は、PhpStormを使いました。
手順を説明します。

まず、メニュー→File→New Projectで、新しくプロジェクトを作る。
で、PhpStormの左下のTermnalボタンから、ターミナルを起動する。
まずは、composerをインストールする必要があります。
composerは、PHPの依存管理ツールで、これなしで、PHPで開発するのはありえないぐらい、普通に出回っているものです。
https://getcomposer.org/
このサイトを参考にして、インストールのためのコマンドを、「プロジェクトが入るべきディレクトリにて」実行します。
これは、ちゃんと、プロジェクトが入るべきディレクトリにてやってください。色々ファイルが生成されると思います。

（コマンドは、「再配布するな」と書いてあるので、削除しました。）

このコマンドは、以下のサイトに載っています。時間が経って変わる可能性があるので、ソースを参照してください。
https://getcomposer.org/download/
一個一個コマンドを実行するのではなく、全部切り取って、ターミナルで実行すると簡単です。ミスも少ないと思います。

以降は、このサイトに則って、ことを勧めます。
https://www.slimframework.com/

以下のコマンドを実行することにより、slimフレームワークがcomposerによってインストールされます。

```
php composer.phar create-project slim/slim-skeleton [my-app-name]
```
[my-app-name]は、ちゃんと自分のアプリ名に書き換えてくださいね。例えば、僕は、アプリ名をHello_nameにしたので、コマンドは以下のようになります。

```
php composer.phar create-project slim/slim-skeleton Hello_name
```

では、composerとslimのインストールが終わったので、コードを記述していきましょう。
/Hello_name/public/index.phpのディレクトリに、以下のようなコードを記述してください。

```
<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

require 'vendor/autoload.php';

$app = new \Slim\App;
$app->get('/hello/{name}', function (Request $request, Response $response) {
    $name = $request->getAttribute('name');
    $response->getBody()->write("Hello, $name");

    return $response;
});
$app->run();
```

そして、アプリのディレクトリに移動し、以下のようなコマンドを実行してみてください。

```
php -S localhost:8080 -t public public/index.php
```

そして、ブラウザを開き、以下のサイトにアクセスしてください。

```
http://localhost:8080/hello/daisukeoka
```
Hello, daisukeokaと出力されましたね。

これで、簡単なslimアプリケーションが構築できました。
参考にしてくれれば幸いです。
WordPressで親カテゴリーを再帰的に取得

よく書く処理なので。

WP_Termオブジェクトを配列で返す場合

```php
function find_ancestor_categories($category_id, $categories = []) {
  $category = get_category($category_id);
  $categories[] = $category;
  if($category->parent) {
    $categories = find_ancestor_categories($category->parent, $categories);
  }
  return $categories;
}
```

term_idを配列で返す場合

```php
function find_ancestor_category_ids($category_id, $category_ids = []) {
  $category = get_category($category_id);
  $category_ids[] = $category->term_id;
  if($category->parent) {
    $category_ids = find_ancestor_category_ids($category->parent, $category_ids);
  }
  return $category_ids;
}
```
drone.ioを使ってCI環境を構築したので、色々整理してみた___<基本編>

# 初めに
![drone.png](https://qiita-image-store.s3.amazonaws.com/0/117156/5917e0c7-2e76-238d-d960-d7556e3f7390.png)

参加している開発プロジェクトでは、CIツールdroneを使っています。

私はdroneの知識がほぼゼロで、CI環境構築をスタートしたので、ハマリまくりました。
相当苦戦しましたが、先日やっとデプロイパイプラインを作れたので、droneについて、色々整理して書きたいと思います。
※ 使っている<font color="red">droneはversion 0.7.3</font>になります。 
※ つい先日に、droneのversion 0.8がリリースされましたので、興味ある方は[【release-0.8.0】](http://docs.drone.io/release-0.8.0)を確認してください


詳細なアーキテクチャなどは説明できませんが、
こんな感じでdroneを使っています。
① **Github Enterprise → drone → AWS**
　　**↑**
② **Slack**
![5Fodx3O8rDVwXltL-855CD.png](https://qiita-image-store.s3.amazonaws.com/0/117156/6c25fe5d-54aa-965d-a812-678fc5e1d44b.png)

今回はとりあえず下記２点について、まとめました。
① **droneの仕様**
② **GithubのWebhook送信から、droneのジョブ実行までの流れ**

droneについて、まだまだ理解が足りていないところがたくさんありますので、間違いとかありましたら、ご指摘ください。

# droneの仕様
## 構成

1. droneには**drone server** と **drone agent**があります。 
  - drone server: 管理画面、認証、githubなどとの連携
  - drone agent: ジョブの実行
1. droneが利用するデフォールトのデータベースはSQLiteで、Docker HubにあるdroneイメージにSQLiteが入っています。ビルド履歴、ユーザ情報、シークレット情報などすべてdatabaseに格納しています。
1. droneはデフォルトでDocker Hubからイメージを取ってきますが、プライベートのレジストリも利用できます。

## ビルドジョブの実行
1. **.drone.yml**にdroneにやって欲しいこと(どの条件でどういったこと)を定義します。
1. drone serverはやってほしいジョブをキューに入れ、drone agentは順番にキューからジョブを取得し、実行します。
1. drone serverとdrone agentは指定されたシークレットキー(任意の文字列)でお互いに認証を行い、WebSocketで通信する。  

# GithubのWebhookから、droneのジョブ実行までの流れ
Github側の設定は、drone公式ページの[【GitHub】](http://docs.drone.io/install-for-github/)に記載されています。
GithubのWebhook送信から、droneのジョブ実行までの流れを自分なりに整理しました。間違っていたら、是非ご指摘ください。
<img width="698" alt="スクリーンショット 0029-07-30 12.38.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/117156/66b21027-8032-2567-b0aa-d882d7a816de.png">


1. GitHub上何かしらのイベントが発生したら、GithubがdroneへWebhookを送信します。
Webhookの詳細内容は**Github → Settings → Webhooks**にて確認できます。   

2. drone serverはGithubからのWebhookを確認し、Githubへレスポンスを返信します。
  - Webhookから送られたeventが.drone.ymlに書かれたeventであれば、drone serverがジョブをキューに入れます。
  - 対象ブランチに.drone.ymlがないと、drone serverはGithubにエラーを返します。   
  ※ 具体的な動作について、(Goで書かれた)ソースコードを見てもよく分からなかったので、ご存知の方がいれば、是非教えてください。  
Webhook例:  
.drone.ymlがなく、drone serverから404が返された例
<img width="523" alt="01.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/117156/da20b982-24b7-8a55-e907-88a978a0e51d.jpeg">

3. drone agentはキューから順番にジョブを取得します。
4. drone agentは.drone.ymlに書かれたジョブを実行します。
4-1: gitのコンテナーを起動して、ソースコードを取得します。
4-2 ~ 4-n: .drone.ymlに書かれたタスクを順番に実行します。

# 最後

今回下記２点について、自分なりに整理しました。
① **droneの仕様**
② **GithubのWebhook送信から、droneのジョブ実行までの流れ**

時間がありましたら、<font color="red">SlackでのChatOps</font>とか<font color="red">自分がハマったところ</font>とかについて整理して共有したいと思っています。
Expo XDEでReact Native入門

## はじめに
React Nativeで開発を始めるにあたっていくつか選択肢がありますが、今回はExpo XDEというReact Native用のXDEを使ってプロジェクトの作成を行います。

[元記事](http://ykubot.com/react-native-expo/)

## 動作環境
* mac Sierra Version 10.12.5
* Expo XDE Version 2.19.3
* Expo v19.0.0

## Expo XDEで新規プロジェクト作成

### Expoアカウントの作成

まずはアプリ開発用のアカウントを作成します。
[Create your account](https://expo.io/signup)

Githubアカウントでも作れます。このアカウントにアプリケーションを紐付けることでExpoコミュニティに公開することが出来ます。Apple Developerアカウントのようなものです。

### Expoデスクトップアプリをインストール

デスクトップアプリはMac、Windows、Linux用が用意されています。  
尚、デスクトップアプリでもシミュレーターは用意されていますが、実機でも動作確認したければExpoアプリを端末にインストールしてください。
[Start your project with Expo XDE](https://expo.io/tools)  
インストールが完了したら自身のアカウントでサインインしてください。
![expo.png](https://qiita-image-store.s3.amazonaws.com/0/88890/139a5631-fde3-bfd3-af97-459ece912792.png)

### 新規プロジェクト作成

ProjectアイコンからNew Projectを選択。
![new-project.png](https://qiita-image-store.s3.amazonaws.com/0/88890/633a2229-3e06-d52d-2ea3-942cfb36bbdd.png)


テンプレートを選択し、新規プロジェクトを任意の場所に作成します。今回はBlankで作成します。
![create-project.png](https://qiita-image-store.s3.amazonaws.com/0/88890/2f602aae-f26c-9811-2a5b-01f7bc9cfa8a.png)


ダウンロードが開始されます。(結構時間がかかります)  
Expoの良いところはボイラーテンプレート(ベストプラクティスのようなもの)を予め初期環境として用意してくれるところです。  
ただし、バージョンによって結構テンプレートが変わったりするので、古いリポジトリを扱う時は注意が必要です。

ダウンロードが完了すると、新規プロジェクト画面が開きます。
![open-project.png](https://qiita-image-store.s3.amazonaws.com/0/88890/25aeaa62-78ea-da4b-a7c1-8048befdb0a8.png)


## iOSシミュレーター起動

DeviceアイコンからiOS Simulatorを起動。  
初回起動時はシミュレーターにExpoアプリがインストールされます。
![simulator-expo-install.png](https://qiita-image-store.s3.amazonaws.com/0/88890/f2c3d119-d9d6-e3eb-85ba-c297441e4ad1.png)


テンプレートアプリが起動します。
![simulator-expo-exe.png](https://qiita-image-store.s3.amazonaws.com/0/88890/408d007b-803e-8d66-4727-7c14c4645c23.png)


Command + Dでメニュー画面が開きます。
![simulator-expo-menu.png](https://qiita-image-store.s3.amazonaws.com/0/88890/7726e87a-b491-c394-5d87-a4186866981c.png)


## 実機での動作確認

まずExpoアプリをインストールします。
さらに開発PCと端末を同ネットワークに接続する必要があります。  
ShareアイコンをクリックするとQRコードが表示されるので、それをexpoアプリで読み込むと実機で動作確認することが出来ます。

デスクトップアプリでQRコードを表示。
![qrcode.png](https://qiita-image-store.s3.amazonaws.com/0/88890/ec99ffcb-6c39-0093-876e-181499bfbaac.png)


実機のアプリでQRコードを読み込む。
<img width="375" alt="iphone-expo.png" src="https://qiita-image-store.s3.amazonaws.com/0/88890/b1d65197-7744-ed7e-c356-ffa4bda4a101.png">


デフォルトだと実機をシェイクするとメニュー画面が表示されます。
ジェスチャー設定を変える場合は、ProfileタブのOptionsから変更出来ます。

ここまでExpo XDEを使ったReact Nativeアプリの新規プロジェクトの手順を説明しましたが、環境やバージョンによってはエラーになる場合もあるので、ハマったら公式のissueをあたるか[公式のブログ](https://blog.expo.io/)などを当たってみて下さい。

* [Expo.ioブログ](https://blog.expo.io/)
* [Expo.ioドキュメント](https://docs.expo.io/versions/v19.0.0/index.html)
【備忘録】nginx, Rails連携時に「502 Bad Gateway」となる場合のSELinux設定

# はじめに
nginx, Rails連携させている環境において、SELinuxが原因でアクセス時に「502 Bad Gateway」となる場合があるので解決方法をメモしておきます。

**環境**
CentOS 7.3.1611
Rails 5.1.2
nginx 1.10.2

**事前準備**
Rails : 3000ポートでサーバ起動しておく
nginx : アクセスを3000ポートへ転送する

# 問題点
ブラウザでアクセスした際に`502 Bad Gateway`が表示される

<img width="504" alt="selinux01.png" src="https://qiita-image-store.s3.amazonaws.com/0/141934/c91f2767-ade2-a394-35ba-29566ca2fd70.png">

# 調査
nginxのエラーログを確認すると「connect() to 127.0.0.1:3000 failed」と出力されている

```
$ sudo tail /var/log/nginx/hello-app_error.log

2017/07/30 04:04:02 [crit] 2239#0: *152 connect() to 127.0.0.1:3000 failed (13: Permission denied) while co
nnecting to upstream, client: xxx.xxx.xxx.xxx, server: hello-app, request: "GET /favicon.ico HTTP/1.1", ups
tream: "http://127.0.0.1:3000/favicon.ico", host: "xxx.xxx.xxx.xxx", referrer: "http://xxx.xxx.xxx.xxx/"
```

# 原因
nginxからRailsへの通信が遮断されている

# 暫定対処
SELinuxを無効にする

```
# SELinuxの無効化
$ sudo setenforce 0

# SELinuxの状態確認
$ sudo getenforce

Permissive
```

# 解決方法
SELinuxにモジュールを追加して、nginxからRailsへの通信を許可させる

## 準備
モジュールの作成に必要な`audit2allow`をインストールする
（audit2allowは`policycoreutils-python`に含まれている）

```
# audit2allowインストール
$ sudo yum install -y policycoreutils-python

# バージョン確認
$ audit2allow --version
```

## 作成されるモジュールのポリシー確認
audit.logから作成されるポリシーを確認する

```
# ポリシー確認
$ sudo cat /var/log/audit/audit.log | grep nginx | audit2allow -m nginx

module nginx 1.0;
require {
        type httpd_t;
        type ntop_port_t;
        class tcp_socket name_connect;
}
#============= httpd_t ==============
#!!!! This avc can be allowed using the boolean 'httpd_can_network_connect'
allow httpd_t ntop_port_t:tcp_socket name_connect;
```

## モジュール作成
モジュールを作成する

```
# ディレクトリを作成
$ cd ~
$ mkdir selinux
$ cd selinux

# モジュール作成
$ sudo cat /var/log/audit/audit.log | audit2allow -M nginx

# モジュールが作成されたことを確認
$ ls 

nginx.pp  nginx.te
```

## モジュールインストール
作成したモジュールをインストールする

```
# インストール
$ sudo semodule -i nginx.pp

# モジュールがインストールされたことを確認
$ sudo semodule -l | grep 'nginx'
```

## SELinux有効化

暫定対処のためにSELinuxを無効にしていた場合は有効にする

```
# SELinuxの有効化
# sudo setenforce 1

# SELinuxの状態確認
$ sudo getenforce

Enforcing
```

## アクセス確認
Railsのページにアクセスできるようになってることを確認

<img width="504" alt="selinux02.png" src="https://qiita-image-store.s3.amazonaws.com/0/141934/7ff48e45-8101-a1d4-09f5-06e143a3396e.png">

# 備考

## SELinux 基本コマンド

```
# 有効化
$ sudo setenforce 1

# 無効化
$ sudo setenforce 0

# 状態確認
$ sudo getenforce

```

## audit2allow 基本コマンド

```
# モジュール内容確認
$ sudo cat /var/log/audit/audit.log | grep nginx | audit2allow -m nginx

# モジュール作成
$ sudo cat /var/log/audit/audit.log | audit2allow -M nginx

# 備考
「nginx」の部分は必要に応じて修正
```

## setmodule 基本コマンド

```
# モジュール追加
$ sudo semodule -i nginx.pp

# モジュール削除
$ sudo semodule -r nginx

# モジュール有効化
$ sudo semodule -e nginx

# モジュール無効化
$ sudo semodule -d nginx

# モジュール一覧
$ sudo semodule -l

# 備考
「nginx」の部分は必要に応じて修正
```
WordPress（ワードプレス）をテスト環境->本番環境(ドメイン変更)へ移行：データベース内のURL書き換え後リンク先が表示されない場合

WordPress（ワードプレス）をテスト環境->本番環境(ドメイン変更)へ移行する際の手順についてメモ。

## ① WordPress（ワードプレス）のファイルを新サーバへ移動
## ② DBをエクスポートし、新サーバのDBへインポート

```
mysqldump --single-transaction -u root -p --all-databases > db.sql
```
## ③ wp-config.php の設定を新DB用に変更

```
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', '変更');

/** MySQL database username */
define('DB_USER', '変更');

/** MySQL database password */
define('DB_PASSWORD', '変更');

/** MySQL hostname */
define('DB_HOST', '変更');

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');
```

## ④ DBの設定変更
wp_optionsテーブルの
site_url
home
を http://127.0.0.1/wordpress/ から新サーバドメインへ変更

ここでサイトのTOP表示される。

## ⑤ ドメイン変更した場合、データベース内のURL書き換えも必要

下記サイト参考：
[WordPressサイトのドメインを変更したいときの注意。データベース内のURLを書き換える]
(http://websae.net/search-replace-db-master-20160112/)

## ⑥ (リンク先が表示されない場合)URLのパーマリンク設定の更新

ここまでやってもリンク先が表示されないケースあり。

その原因として、以前設定されていたURLのパーマリンク設定が残った状態のままで、新しいURLでページを参照したときに正常にアクセスできないケースがあるようで、URLのパーマリンク設定の更新をかけたら表示されました。

これで、移行完了！
Ruby on Rails DBへのアクセス

#始めに
DBへの問い合わせ結果をHTML上に表示します
ORマッパーにAciveRerodは使いません、Sequelを使います

#やりたいこと
英次郎の辞書データをOracleDBに挿入する part2
http://qiita.com/triple4649/items/dc0fd2bb3cdbcd4a4bdb
で作った辞書データ(約33万レコード)に対してブラウザから入力された文字列を条件に該当データを取得し、取得したデータを画面に表示します
具体的には

![image.png](https://qiita-image-store.s3.amazonaws.com/0/136860/5ff0bec8-9fee-fee0-3776-aa8fddda4aa4.png)
で検索対象文字列をいれると

![image.png](https://qiita-image-store.s3.amazonaws.com/0/136860/39e84779-4a7d-fe4e-e7b9-a4127d8df60c.png)

のように入力文字列に対して前方一致で一致した単語を表示します

#実装
ここからは実装部分に移ります
##View
[Ruby on Rails のルーティングについて WebAPIについて](http://qiita.com/triple4649/items/09834e62e99892afeacc)で使ったソースをそのまま流用します
##contorller
[Ruby on Rails のルーティングについて WebAPIについて](http://qiita.com/triple4649/items/09834e62e99892afeacc)で使ったソースで、
sample_controller.rbの「SampleController#sayhelloasynpost」
の呼び出しをModelクラスに実装したクラスを呼び出すようにします

```sample_controller.rb
class SampleController< ApplicationController
protect_from_forgery :expect  => ["create"]
def sayhello
     @msgToNikkyusan = '２９３、hello!';
     @msgToPerorisan = 'ペロリさん、hello!';
  end
  #初期表示で呼ばれるメソッド
  def sayhelloToNyukkyusan
     @msgToNikkyusan = '２９３、hello!';
  end
    
  #Ajaxから呼ばれるメソッド
  def sayhelloasynpost
    render text:Worddictionary.belongs(params[:name])
  end
end
```

##Model
require されている"db"については後述します
SequelはSQLをべたで使ってもいいし、使わなくてもいいという設計は私のように
「ActiveRerodのモデル操作メソッドはいらない(⁼DBへの問い合わせは自前でSQLを実行したい）」
「O/Rマッパーは手軽に使いたい」
人には便利です
JavaでいうところのStreamAPIに相当する関数を使えば、DBの戻り値に対する編集も宣言的にかけループやIFがいらないので、コーディングが楽ちんです
ただし、ModelクラスでDBから受け取った値をContorller側の都合に合わせて編集していいかどうかはかなり微妙なところ。
まぁ、その場合も、modelクラスのメソッドにラムダ式を渡せる用意して、Contorllerの編集仕様をラムダ式に渡せるようにしてあげれば、汎用度は上がると思う

```worddictionary.rb
require "db"

class Worddictionary  
  def self.first(str)
    result=DB.fetch("select WORD, SHORT_VER,WORD_LEVEL from WORD_DICTIONAY ")
    .where(:search_word =>["#{str}"]) 
    .first
    return "単語{result[:word]} <br>
            単語の意味：#{result[:short_ver]} <br>
            単語レベル：#{result[:word_level]}#"
  end
  
  def self.count(str)
    result=DB.fetch("
      select word,count(*) as kensuu 
      from WORD_DICTIONAY
      where search_word = '#{str}'
      group by word"
    ).first
    return "単語：#{str} 単語件数：#{result[:kensuu]}"
  end
  
  def self.belongs(str)
    DB[:WORD_DICTIONAY]
    .where{search_word.ilike "#{str}%"} 
    .all
    .map{|m| "
        -----------------------------
        単語：#{m[:word]} 
        単語の意味：#{m[:short_ver]} 
        単語レベル：#{m[:word_level]}
        -----------------------------" }
    .reduce{|x,y|x+y}
  end
end  
```
##DB
libs配下にdb周りの設定を記載したrbファイルを置いています
簡単なアプリの例なので、コネクションの記述は結構適当です
SequelはJDBCのthin接続をサポートしているので、コネクション取得の記述が楽チンでした

```db.rb
require "sequel"

DB = Sequel.connect('jdbc:oracle:thin:triple/triple@//localhost:1521/triple_pb.co.jp')

##テーブル情報を表示する
def fetchUserTables 
  DB.fetch("select table_name from user_tables ")
  .all do
    |x|puts x 
  end
end
```
##gemファイル
Sequelがralisから使えるようにGemファイルに
`gem 'sequel'`
の一行を追加し、railsのカレントフォルダでコマンドラインからbundle installを実行した
Ralisにあまり詳しくないので、もっといいやり方があるかも


#最後に
Worddictionaryでブラウザから入力した値をそのままSQLの条件として埋め込んでいる。
これはSQLインジェクションというセキュリティホールになるので、SQLインジェクションが起こらないようになっているか、railsもしくはSequel側で対応しているか調べてみようと思う
jQueryを使わずにスムーズなスクロールを実装

[合同会社kumanote](http://kumano-te.com/)のTanakaです。
最近`vue`を使ってクライアントサイドを構築することが増えてきました。
今回は、よくある、アンカーリンクをクリックした時にスムーズにスクロールするやり方を
jQueryを使わずに実装するTipsをご紹介します。

[smoothScroll](https://github.com/alicelieutier/smoothScroll)というライブラリがMITライセンスで作られていますので
こちらを利用しました。

## install

```
$ npm install --save smoothscroll
```

npmを使わなくても[smoothscroll.min.js](https://github.com/alicelieutier/smoothScroll/blob/master/smoothscroll.min.js)をローカルにもってきて参照しても使えるはずです。

## 使い方

### 汎用的な使い方

```js
// たとえば、#hogeというid属性の要素に飛びたい時
import smoothScroll from 'smoothscroll'             // ライブラリ呼び出し
const target = window.document.querySelector('#hoge') // hogeのnodeを取得
smoothScroll(target)                                // スクロール実行
```

これだけです！便利ですね。

### vue-routerの場合

現在のpathと比較して、同一ページであれば、スクロールする実装が有用です。

```html
<template>
  <a href="/#hoge" @click="move('/', '#hoge')"><span>hoge</span></a>
</template>
<script>
import smoothScroll from 'smoothscroll'
export default {
  methods: {
    move: function (path, selector) {
      if (path === this.$route.path) {
        const target = window.document.querySelector(selector)
        smoothScroll(target)
      }
    }
  }
}
</script>
```
laravelプロジェクトを新規追加

laravelプロジェクトを新規追加

### gitHubにリポジトリ作成
### Develop配下にプロジェクト作成
`composer create-project --prefer-dist laravel/laravel [project-name]
`
### DB作成
`CREATE DATABASE db_name;`

### DBユーザー作成

`mysql -u root -- rootでログイン`
`create user {user名}@localhost identified by {パスワード} -- ユーザー作成`

### DBユーザーの権限付与
grant {権限内容} on {権限対象} to {ユーザー名}@{ホスト名} identified by {パスワード}
`-- test_dbのselect権限をtestユーザーに追加`
`grant select on test_db.* to test@localhost identified by {パスワード};`

`-- test_dbの全権限をtestユーザーに追加`
`grant all on test_db.* to test@localhost identified by {パスワード};`


`-- 全DBの全権限をtestユーザーに追加`
`grant all on *.* to test@localhost identified by {パスワード};`

### .env書き換え
`
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE={dbname}
DB_USERNAME={user_name}
DB_PASSWORD=secret
`
MacのSeleniumでフルスクリーンショットを撮ると画面の一部しか撮影されない問題

ひとまず自分用。


```selenium.java
System.setProperty("webdriver.gecko.driver", "/Applications/geckodriver");
	    WebDriver driver = new FirefoxDriver();
	    driver.manage().window().setSize(new Dimension(3400, 5810));

	    int scrollTimeout = 500;
	    int header = 0;
	    int footer = 0;
	    float dpr = 2;

	    driver.get(URL);
	    driver.findElement(By.xpath("xpath")).click();;
	    Screenshot screenshot = new AShot()
	    .shootingStrategy(ShootingStrategies.viewportRetina(scrollTimeout, header, footer, dpr))
　　　　　.takeScreenshot(driver);


	    ImageIO.write(screenshot.getImage(), "PNG", new File("/Users/masalennon/Pictures/SeleniumPics/fullSizePic.png"));
	    driver.close();



```


MacでやるならviewPortRetinaを使う必要あり。
gitコマンドのメモ

## 概要
gitコマンドをすぐ忘れて検索するので書き留めておく。

## 基本操作
### 初期化（新規リポジトリ）
リポジトリを新規に作成する

```sh:コマンドプロンプト
# 通常のリポジトリ
$ git init

# ベアリポジトリ(共有リポジトリ) ※作業ディレクトリを持たないリポジトリ
$ git init --bare
```

### コード配置
リモートリポジトリからコードをクローンする

```sh:コマンドプロンプト
# ssh (秘密鍵・公開鍵)
$ git clone git@github.com:{ユーザー}/{リポジトリ}.git .

# https
$ git clone https://github.com/{ユーザー}/{リポジトリ}.git .
```

## Git設定
### 設定確認
現在の設定を確認する。

```sh:コマンドプロンプト
$ git config --list
user.name=Hoge Fuga
user.email=hoge@example.com
...
```

### 識別情報 (name,email)
ユーザー名とE-mailアドレスを設定する。

```sh:コマンドプロンプト
$ git config --global user.name "Hoge Fuga"
$ git config --global user.email hoge@example.com
```

### エディター (vi,vim,emacs)
標準のテキストエディタを設定する。
※ 標準は、システムのデフォルト・エディター(Vi,Vimなど)を使います。
※ Emacsのような違うテキスト・エディターを使いたい場合は次のように指定する。

```sh:コマンドプロンプト
$ git config --global core.editor emacs
```

### diffツール (vimdiff)
衝突を解決するために使う、標準のdiffツールを設定します。

```sh:コマンドプロンプト
$ git config --global merge.tool vimdiff
```

※参考資料： [diffをみるならvimdiffがはっきり言って便利すぎる件](http://d.hatena.ne.jp/yamazakiccs/20090314/1233466554)

**利用例)**

```sh:コマンドプロンプト
$ vimdiff old.txt new.txt
```

## 未追跡ファイル
### ファイルの確認
追跡対象外のファイルを一覧表示します。
※ステージされたファイル、ステージされていないファイルも表示されるので注意

```sh:コマンドプロンプト
$ git status
```

### 事前確認（ドライラン）
追跡対象外のファイルを削除したい場合、事前に対象を確認する。

```sh:コマンドプロンプト
# パス指定なし
$ git clean -dn

# パス指定あり
$ git clean -dn <path>
```

### 一括削除
追跡対象外のファイルを全て削除する。

```sh:コマンドプロンプト
# パス指定なし
$ git clean -df

# パス指定あり
$ git clean -df <path>
```
fastlaneを使ってGoogle Playのベータ版にアップする

http://qiita.com/mapyo/items/41d9e7310ad9dc31859e

この辺で日々のビルドをするためにfastlaneを使ったので、次はGoogle Playにアップするところで使ってみる。

いきなり本番は流石に辛いのでベータ版にアップする部分を自動化して、手元で確認してから、Developer Console上で操作して本番に公開という流れをとりたい。

fastlane的なbetaとFabricのBetaとデベロッパーコンソールのBetaといろいろ混同しそうなので注意。



基本的な導入周りはこの辺でいい感じに出来てる

http://qiita.com/gupuru/items/9ddeff0906b02d779ed9

公式ドキュメントも参照
https://docs.fastlane.tools/getting-started/android/setup/



## 認証情報の設定
https://docs.fastlane.tools/getting-started/android/setup/#collect-your-google-credentials

この辺を見ればOK。内容的には同じだけど、僕のメモを書いとく


1. Google Play Consoleにアクセス https://play.google.com/apps/publish/
2. 左上のハンバーガーメニューをクリック
3. 設定→APIアクセス
4. サービスアカウントを作成をクリック
5. ダイアログが表示されて、説明に書いてある通りにGoogle Api コンソールに移動
6. サービスアカウントを作成
7. サービスアカウント名を入れる。役割はプロジェクト→サービスアカウントアクターを選択
8. 新しい秘密鍵の提供にチェックを入れる。キーのタイプはJSON(デフォルトでそうなってた気がする)
9. 作成をクリック
10. 秘密鍵が作成されてダウンロードされるので、大事に保存しときましょう
11. Google Play Consoleに戻って、出てたダイアログの完了をクリック
12. 新しいサービスアカウントが出来てる事を確認
13. 新しく出来たやつの、アクセスを許可をタップ
14. 権限で、「アルファ版とベータ版の APK の管理」以外の権限すべてをOFFにする。これで安心。
15. ↑と思ったら、「表示設定」の権限は最低限必要だった。アプリ個別に設定するか、全体に設定するかが必要そう。
16. 終わったらユーザを追加をクリック（しかし、何で権限の変更をしたつもりがユーザの追加になるんだ？権限の設定が終わって初めてユーザを追加するという意味なのかな。）


という感じでもろもろ設定が終わり。権限を絞っているので、何か起きたとしてもアルファ版かベータ版がどうにかなるだけなので、ある意味安心出来る（笑）


ダウンロードしたjsonを好きな場所に置いて、

```
fastlane/Appfile
```

ここに追記すればOK


## fastlane側の設定
https://docs.fastlane.tools/getting-started/android/beta-deployment/#supported-beta-testing-services

この辺を見て設定する


今回追加したlaneはこちら

```
  lane :googleplay_beta do
    gradle(task: "clean assembleRelease")
    supply(track: 'beta')
  end
```

ハマったところは、ここの設定じゃないんだけど、サンプル用にGoogle Play上にアプリを作ったんだけど、公開するために必要なものを一通り設定して、１回でも公開（ベータ版でも可）しないとapiでアップする事が出来なかった。。。



## mapping.txtとかどうするの？
BITRISEを使っていると、
deploy-to-bitrise-ioというstepをとりあえず実行しとけば
apkとかも含めてそのビルドに保存してくれるので楽。


## 所感
これでgoogle playのベータにアップするところが自動化出来て最高。という感じ
ethereum nodeをたててみる

Ethereumのノードをたてて、Smart Contractをデプロイする予定があったので
まずは、ノードをたてた時のやり方と、その時の注意点をメモ用としてまとめてみました。
尚、環境は`Ubuntu16.04`上で構築しています。

## gethのインストール

gethはEthereumのクライアントソフトウェアです。
gethのコマンドをたたくことによって、Ethereumのネットワークへの操作を行うことができるようになります。

[ここ](https://github.com/ethereum/go-ethereum/wiki/Installation-Instructions-for-Ubuntu#installing-from-ppa)を参考にしました。

```
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository -y ppa:ethereum/ethereum
$ sudo apt-get update
$ sudo apt-get install ethereum
```

## gethのtestnetでの起動

Ethereumのテストネットワークには何種類かあり（IDで識別されています）代表的なものは、以下です。

https://testnet.etherscan.io/

1. ROPSTEN (Revived) - Proof Of Work
1. KOVAN - Proof Of Authority (Parity only)
1. RINKEBY - Clique Consensus (Geth only)

今回は `ROPSTEN (Revived) - Proof Of Work`を選択しました。

以下のコマンドで起動しました。

```
$ geth --testnet --fast --cache=1024 console
```

初回起動時には、ブロックチェーンのデータの同期が始まります。これがものすごく時間がかかります。（かなり誤算でした。）
いろんなサイトで「数時間でおわる」と言っていたのですが・・・僕の環境がいけてないせいか半日くらいかかりました。

なので、`--fast`オプションや`--cache`オプションをつけて高速同期化しています。

尚、最近`--light`オプションもでたらしいのですが、なるべくデータをローカルに保持したいこともあり、選択しませんでした。

### 同期の確認

基本的には console中で、今どのblock numberを処理しているのかがでてくるのですが・・
以下のコマンドをうつことで同期の進捗状況を確認することができます。

```
$ eth.syncing
{
  currentBlock: 処理が完了したblock,
  highestBlock: ネットワーク上の最大block,
  /* 以下略 */
}
```

### testnetでのetherの取得

主に2つのやり方があるようです。

1. 頑張ってminingする
1. だれかから送金してもらう

今回は2を採用しました。
`ropsten.faucet.b9lab.com`にリクエストを出すと、任意のアドレスに 1eth 送金してくれるサービスを使って
ethを取得しました。
apiが公開されており、以下のようなリクエストを出すと送金されます。（便利ですね！）
※ ただ、一度に1ethまでの制約があります。

```
$ curl -X POST  -H "Content-Type: application/json" -d '{"toWhom":"your address here"}' https://ropsten.faucet.b9lab.com/tap
{
  "txHash" : "transaction hash here"
}
```

このトランザクションがマイニングされると、はれて自分のアドレスに1ethが着金されます。

### データサイズの確認

- [ディスク容量がいっぱいの時にやる事 - Qiita](http://qiita.com/oshou/items/2630f9f1c1131beb748e)を参考にさせていただきました。

```
$ cd .ethereum
$ du -sh ./*
```

ROPSTEN testnetではだいたい2.7Gを使用していました。
（fastオプションつけないともう少し大きくなると思われます。）


## gethのmainnetでの起動

以下で起動できます。

```
$ geth --fast --cache=1024 console
```

おそらくしょぼいネットワーク環境がボトルネックになっているのでしょうが・・同期が全然おわりません。
想定では2日くらいかかってしまいます。。。（絶賛同期中です^^）
何か原因わかったら追記しようかと思います。


以上になります。
CircleCI 2.0 でクロージング処理を実現する

CircleCI では、処理の途中でエラーが検出されると、後続処理は実行されず、CI がそこで中断してしまいます。CI の多くは、そのような挙動であると思いますが、ここでは途中でエラーが発生しても、処理を最後まで継続して、最後にエラーを報告する方法について書いてみます。

表現に迷ったのですが、クロージング、Finally、Teardown そういった感じの、最後にかならず実行される処理を表現する方法についてです。

# 環境

- CircleCI 2.0 (2017-07-30 執筆時点)

# 書き方

書き方さえ分かってしまえば難しくないので、最初に書き方から。

```yaml:.circleci/config.yml
version: 2
jobs:
  build:
    machine: true
    steps:
      - run:
          name: 後始末をしなければならない処理
          command: |
            # ACL 変更など
      - run:
          name: エラーで終了する可能性のある処理(1)
          command: |
            command_not_found || echo "export TEST_RESULT_1=${?}" >> $BASH_ENV
      - run:
          name: エラーで終了する可能性のある処理(2)
          command: |
            command_not_found || echo "export TEST_RESULT_2=${?}" >> $BASH_ENV
      - run:
          name: 後始末の処理
          command: |
            # ACL 変更のなど
      - run:
          name: エラー報告
          command: |
            echo "TEST_RESULT_1 [${TEST_RESULT_1:-0}]"
            echo "TEST_RESULT_2 [${TEST_RESULT_2:-0}]"
            exit $(expr ${TEST_RESULT_1:-0} + ${TEST_RESULT_2:-0})
```

# 解説

CircleCI 2.0 では、`run` のなかで表現された各行のいずれかが 、`exit 0` 以外を返す場合に、CI を中断し、エラーを報告します。最終行が `exit 0` だったとしても、途中でエラーが発生していたら、その時点で中断されます。

そのため、エラーで終了する可能性のある処理については必ず、エラーで終了しないよう、ハンドリングを施す必要があります。ここでハンドリングと表現しているのは以下です。

`|| echo "export TEST_RESULT_1=${?}" >> $BASH_ENV`

直前のコマンドを OR でつなぐことにより、行を終了させず、処理を継続しています。

また CircleCI 2.0 では、`run` をまたぐと、作成した変数などが共有されず、参照することができません。一方、各 `run` の最初では、`$BASH_ENV` が自動的に展開されるため、ここに退避しておくことで、後続処理から参照したい変数などを残しておくことができます。

今回は、途中で発生したエラーを最後に報告したいので、これを `$BASH_ENV` に退避しています。

以上のように CircleCI 2.0 では、一手間を加えるだけで、エラー報告を最後に回して、クロージングが必要な処理も比較的簡単に表現できるようになっています。

# 参考

https://circleci.com/docs/2.0/env-vars/#interpolating-enviroment-variables-to-set-other-environment-variables
IHS で defalte 設定

DockerHub の [ibmcom/ibm-http-server](https://hub.docker.com/r/ibmcom/ibm-http-server/) をベースに deflate の実験をした時のメモ

# 前提
.htaccess を使ってディレクトリーごとの設定として実験する。
コンテナー起動

```command
  docker run -name ihs -h ihs -it -v "$PWD":/opt/IBM/HTTPServer/htdocs/s ibmcom/ibm-http-server bash
```

bash の画面になったらサーバー起動

```command
/opt/IBM/HTTPServer/bin/apachectl start
```

# 設定ファイル、開くhtml文書の場所
http.conf  :  /opt/IBM/HTTPServer/conf
.htaccess  :  /opt/IBM/HTTPServer/htdocs/s
a.html     :  /opt/IBM/HTTPServer/htdocs/s

# 準備
コンテナで vi が使えないのでインストールする。

```command
apt-get update
apt-get install vim
vim ~/.vimrc  # set number など設定をして保存
vim ~/.bashrc # bash の設定もついでにどうぞ
```

この状態をコンテナー再起動後も使いたいなら、ここで一旦コンテナーを止めてイメージを作成する。

(例)

```command
docker commit ihs myihs
```

保存したら run する際に、ibmcom/ibm-http-server の代わりに保存したイメージ(myihs)を起動対象としてコンテナーを起動する。

# ディレクトリごとの設定を有効にする
http.conf を編集。
<Directory "/opt/IBM/HTTPServer/htdocs"> セクションの中の AllowOverride を None から All に変更

```http.conf
#    AllowOverride None
    AllowOverride All
```

# mod_mime, mod_deflate を有効にする

viで開いて、モジュール名で検索して、下のようにコメントアウト行をコピーしてコメントを外す。

```http.conf

#LoadModule mime_module modules/mod_mime.so
LoadModule mime_module modules/mod_mime.so

#LoadModule deflate_module modules/mod_deflate.so
LoadModule deflate_module modules/mod_deflate.so
```

### モジュールの意味

mod_mime は AddOutputFilterByType ディレクティブを使用するのに必要。
mod_deflate は gzip する機能そのもの。

# .htaccess を作る
一旦コンテナーから ^p^q で抜けてファイルを作る。

```command
^p^q
### ここでホストに戻っている ###
vi .htaccess 
```

中身は次のような内容。
`DirectoryIndex a.html`を指定しているのはこのファイルが IHS に認識されているかどうかの確認用に、ファイル名省略時の URL で開くファイル名をデフォルトの`index.html`から変更している。あとで実際に deflate が効くかどうかを試すための html をその名前(a.html)で作成する。

```:.htaccess
DirectoryIndex a.html

<IfModule mod_deflate.c>
     SetOutputFilter DEFLATE

     # Mozilla4系などの古いブラウザで無効、しかしMSIEは除外
     BrowserMatch ^Mozilla/4\.0[678] no-gzip
     BrowserMatch ^Mozilla/4 gzip-only-text/html
     BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

     # gifやjpgなど圧縮済みのコンテンツは再圧縮しない
     SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico)$ no-gzip dont-vary
     SetEnvIfNoCase Request_URI _\.utxt$ no-gzip

     # htmlやcssなどは圧縮
     AddOutputFilterByType DEFLATE text/plain
     AddOutputFilterByType DEFLATE text/html
     AddOutputFilterByType DEFLATE text/xml
     AddOutputFilterByType DEFLATE text/css
     AddOutputFilterByType DEFLATE application/xhtml+xml
     AddOutputFilterByType DEFLATE application/xml
     AddOutputFilterByType DEFLATE application/rss+xml
     AddOutputFilterByType DEFLATE application/atom_xml
     AddOutputFilterByType DEFLATE application/x-javascript
     AddOutputFilterByType DEFLATE application/x-httpd-php
</IfModule>
```
(参考：[Apacheのmod_deflateでコンテンツを圧縮してサイトを高速化する方法](http://oxynotes.com/?p=6519) )


# 終わりに

世の中の情報は Apache なり Apache2 の情報が多いが、一応 IHS のベースが Apache HTTP Server らしいので、同じように設定できたの巻、でした。
Kaggleのデータからbag of wordsを作ってみた(3/3)

#初めに
この記事はKaggleのデータ「Bag of Words Meets Bags of Popcorn」のデータでbag of wordsを作り、Random Forestで予測するまでを説明する初心者向けの記事です。
英語記事でいいものを見つけたので、英語が苦手な方向けに和訳+初心者向けに補足したものになっております。
また、投稿自体が初めてのなのでアドバイスをいただければ幸いです。
[Kaggleのデータからbag of wordsを作ってみた(1/3)](http://qiita.com/nanay/items/7421bb0f4414fdee5e8c)
[Kaggleのデータからbag of wordsを作ってみた(2/3)](http://qiita.com/nanay/items/1eaadca32349a1314cb4)
#環境
- Python 3.6.0 :: Anaconda custom (x86_64)
- Mac OS X 10.12.5


#この章で行うこと
- 前回作成したレビューデータからのbag of wordsを用いてのRandom Forestの学習と予測

```Python
#Random Forest
print("Training the random forest...")
from sklearn.ensemble import RandomForestClassifier
# 初期化
forest = RandomForestClassifier(n_estimators = 100) 
#Random Forestの学習
forest = forest.fit( train_data_features, train["sentiment"] )
```
#次にテストデータのクリーニングを行います。

```Python
#テストデータの読み込み
test = pd.read_csv("testData.tsv", header=0, delimiter="\t", \
                   quoting=3 

# ここで25,000 rows and 2 columnsのデータだと確認
print (test.shape)

#テストデータのクリーニング
for i in range(0,num_reviews):
    if( (i+1) % 1000 == 0 ):
        print ("Review %d of %d\n" % (i+1, num_reviews))
    clean_review = review_to_words( test["review"][i] )
    clean_test_reviews.append( clean_review )

#ここでテストデータを単語ベクトルの形に変換する
test_data_features = vectorizer.transform(clean_test_reviews)
test_data_features = test_data_features.toarray()

#学習した　Random Forestを用いて予測
result = forest.predict(test_data_features)

#予測結果をcsvファイルに変換(kaggleでは予測結果をcsvで提出することが一般的であるため)
output = pd.DataFrame( data={"id":test["id"], "sentiment":result} )
output.to_csv( "Bag_of_Words_model.csv", index=False, quoting=3 )
```

#参考文献
[Part 1: For Beginners - Bag of Words](https://www.kaggle.com/c/word2vec-nlp-tutorial/details/part-1-for-beginners-bag-of-words)
OrderedDictのコンストラクタの挙動


最近、OrderedDictを久しぶりに使おうと思ったときに、
「コンストラクタの挙動に注意しないといけないんだっけ」っていうのが頭にあって、
ググるとそんな風な日本語の記事を多く見かけたが、
念のためにドキュメントを読んだら、3.6でその挙動が変更されていた。

> Changed in version 3.6: With the acceptance of PEP 468,
> order is retained for keyword arguments passed to
> the OrderedDict constructor and its update() method.

引用:[python3.6ドキュメント](https://docs.python.org/3.6/library/collections.html#ordereddict-objects)


## コード

```python
from collections import OrderedDict

od = OrderedDict(
    a=0,
    b=1,
    c=2
)
print(''.join(od))
```

期待する出力は `abc`

## 実行結果

### 3.6.2
```sh
~/G/B/o/3.6 ❯❯❯ python od_constract.py
abc
~/G/B/o/3.6 ❯❯❯ python od_constract.py
abc
~/G/B/o/3.6 ❯❯❯ python od_constract.py
abc
~/G/B/o/3.6 ❯❯❯ python od_constract.py
abc
~/G/B/o/3.6 ❯❯❯ python od_constract.py
abc
```

`abc`の順序で出力される

### 3.5.3
```sh
~/G/B/o/3.5 ❯❯❯ python od_constract.py
cab
~/G/B/o/3.5 ❯❯❯ python od_constract.py
bca
~/G/B/o/3.5 ❯❯❯ python od_constract.py
acb
~/G/B/o/3.5 ❯❯❯ python od_constract.py
abc
~/G/B/o/3.5 ❯❯❯ python od_constract.py
acb
```

`abc`以外の並びが出力される

### 2.7.13
```sh
~/G/B/o/2.7 ❯❯❯ python od_constract.py
acb
~/G/B/o/2.7 ❯❯❯ python od_constract.py
acb
~/G/B/o/2.7 ❯❯❯ python od_constract.py
acb
~/G/B/o/2.7 ❯❯❯ python od_constract.py
acb
~/G/B/o/2.7 ❯❯❯ python od_constract.py
acb
```

なぜか`acb`の並びで出力される

> The OrderedDict constructor and update() method both accept keyword arguments,
> but their order is lost because Python’s function call semantics pass-in
> keyword arguments using a regular unordered dictionary.

引用:[python2.7ドキュメント](https://docs.python.org/2.7/library/collections.html#ordereddict-objects)

## まとめ

***3.6を使いましょう!***
Kaggleのデータからbag of wordsを作ってみた(1/3)

#初めに
この記事はKaggleのデータ「Bag of Words Meets Bags of Popcorn」のデータでbag of wordsを作り、Random Forestで予測するまでを説明する初心者向けの記事です。
英語記事でいいものを見つけたので、英語が苦手な方向けに和訳+初心者向けに補足したものになっております。
また、投稿自体が初めてのなのでアドバイスをいただければ幸いです。

[Kaggleのデータからbag of wordsを作ってみた(2/3)](http://qiita.com/nanay/items/1eaadca32349a1314cb4)
[Kaggleのデータからbag of wordsを作ってみた(3/3)](http://qiita.com/nanay/items/752896e47f0817adbaa3)
#環境
- Python 3.6.0 :: Anaconda custom (x86_64)
- Mac OS X 10.12.5



#データの読み込み

```Python
import pandas as pd       
train = pd.read_csv("labeledTrainData.tsv", header=0, \
                    delimiter="\t", quoting=3)
```
これで、"labeledTrainData.tsv"がtrainに読み込まれます。
細かい補足
- header=0, 最初の一列目は各行の名前であることを示している。
- delimiter="\t", データはタブによって別れていることを示す。
- quoting=3, Python用のエラー防止


```Python
train.shape #学習データのデータ数と次元数の確認
```
```Python
(25000, 3)
```
これでこのデータはデータ数25000,次元数3であることがわかります。
以下のようにtrainと打ち込むだけでも見ることもできます。

```
train
```

![スクリーンショット 2017-07-11 15.22.49.png](https://qiita-image-store.s3.amazonaws.com/0/187028/c9fc6d73-e66c-2278-987f-dc4784ce8d2d.png)


#データのクリーニング
まずは一番最初の人のレビューを見てみます。

```Python
print (train["review"][0])
```
![スクリーンショット 2017-07-11 15.31.18.png](https://qiita-image-store.s3.amazonaws.com/0/187028/043c42ba-7f1e-374d-30dd-d1c96f793d6d.png)

実はこのデータは汚い状態(扱いにくい)にあります。
これから、このデータを綺麗にしていきます。具体的には以下のことをします。
- タブの消去
- 文字以外(?,.,')の処理
- 大文字、小文字の処理

*BeautifulSoupを使ったタブの消去*
 

![スクリーンショット 2017-07-11 15.45.33.png](https://qiita-image-store.s3.amazonaws.com/0/187028/541e731c-87bc-ba4f-782f-0c93d3a4b61d.png)

ちゃんとタブが消えているのが確認できます。

*reを使った文字以外の処理*
ここからは、(?,.,/,#,",')のような文字以外のものを処理していきます。

```Python
import re
letters_only = re.sub("[^a-zA-Z]",           #この条件に合致するものを
                      " ",                   #これ(今回は空白)に置換する
                      example1.get_text() )  #対象とするテキストデータ
print(letters_only) 
```

ちょっと見えにくいですが、「.」や「"」が消えているのが確認できます。
![スクリーンショット 2017-07-11 15.55.49.png](https://qiita-image-store.s3.amazonaws.com/0/187028/2db7caab-3e51-8c6c-97ad-bf941c197ead.png)

*大文字、小文字の処理*
最後に全ての文字を小文字にします。このままだた、Withとwithが別の文字として処理されてしまうためです。

```Python
lower_case = letters_only.lower()        #全て小文字に変換する
print(lower_case)
```
![スクリーンショット 2017-07-11 16.02.29.png](https://qiita-image-store.s3.amazonaws.com/0/187028/b4317d81-2035-7469-70b4-d61f3137839f.png)

ちゃんと小文字になっていますね。
今回はこれで終わりです。
次回から本格的にbag of wordsを作っていきます。


#参考文献
[Part 1: For Beginners - Bag of Words](https://www.kaggle.com/c/word2vec-nlp-tutorial/details/part-1-for-beginners-bag-of-words)
Cloud9 環境でTensorflowをインストールしてみる

#cloud9上の開発環境にてtensorflowをインストールしました。

cloud9環境には予め、minicondaをインストールしてあります。
anaconda(miniconda) python3.5.3,jupyter notebookのインストール方法はこちら
http://qiita.com/KenjiKitagawa/items/e0225d9be10ea3dbdafc


参考にさせてもらったサイト
http://qiita.com/tomochiii/items/fe4c791b313ddcef4cd7

##コマンド
cloud9のコマンドプロンプトから実行

conda create -n tensorflow python=3.5 anaconda
pip install --upgrade tensorflow



##インストール確認
```
kitaken:~/workspace $ python
Python 3.5.3 |Continuum Analytics, Inc.| (default, Mar  6 2017, 11:58:13) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
2018-02-22 01:31:36.045539: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
2018-02-22 01:31:36.045607: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
2018-02-22 01:31:36.045628: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
>>> print(sess.run(hello))
b'Hello, TensorFlow!'
>>>
```
ロフテッド軌道

#概要
ロフテッド軌道をシュミレーションしてみた。
ライブラリーは、PyRockSim。

#写真


![rock.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/487fe80e-0dbe-7b4d-c242-4c0e3c212bee.jpeg)


#成果物

http://jsdo.it/ohisama1/chf1
RubyでDynamoDBからデータを取得する時の注意点

# データ取得時の注意
DynamoDBからデータ取得(scan,query)を行う場合、一回のリクエストで最大1MBしか取得できない様です。

__さらに、1MB以上のデータをリクエストした場合切り捨てられエラーにもならない！__
(全件取得できてるか判別するステータスはありますが)

# 解決策
#### レスポンスをページングして取得。

##例えば、

```ruby:sample.rb
 def client
   Aws::DynamoDB::Client.new
 end

def get_date
   id = XXX
   from = DateTime
   to = DateTime 

   resp = client.query(
     table_name: XXX, #テーブル名
     scan_index_forward: true or false, #order
     key_condition_expression: #ハッシュキー
       'id = :id AND created_at BETWEEN :from AND :to' 
     expression_attribute_values: {
       # ハッシュキーにてプレースホルダとして利用
       :id = id,
       :from = from,
       :to = to
     } 
   )
end
```

とあった時に

```diff

 def client
   Aws::DynamoDB::Client.new
 end

def get_date
+ resp_array = []
   id = XXX
   from = DateTime
   to = DateTime 

   resp = client.query(
     table_name: XXX, #テーブル名
     scan_index_forward: true or false, #order
     key_condition_expression: #ハッシュキー
       'id = :id AND created_at BETWEEN :from AND :to' 
     expression_attribute_values: {
       # ハッシュキーにてプレースホルダとして利用
       :id = id,
       :from = from,
       :to = to
     } 
   )

+  resp.each_page do |page|
+    resp_array.concat(page.items)
+  end
end
```

とすることで１MB以上のレスポンスでも取得できる。

#解説
1行目　`resp_array = []`で配列を作成。
17行目以下３行でデータをページングして取得。
→取得しきるまで繰り返しresp_arrayへ格納。