OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby on Rails チュートリアル(Rails v5.1.0)でBootstrapが適用できない問題

Ruby on Rails チュートリアル（第５章 レイアウトを作成する）の5.1.2 BootstrapとカスタムCSSでつまずいたので共有します。
多分もう少ししたらRails 5.1版のチュートリアルが作成されるとは思うんですが、その前に同じようにつまずいた人のために書いておきます。

## 参考にした記事たち
多分チュートリアルでつまずく人は、エラーが発生してそのまま闇に葬り去ってしまうからなんだろうな、と今回はじめてみて思いました。
一応参考にした記事をいくつか挙げておきます。

「RailsにBootstrapをカスタマイズ可能な形で導入する」
http://qiita.com/iguchi1124/items/e8aca47b111bb52f94a5

「Rails Bootstrap-Sassを導入する」
http://keruuweb.com/rails-bootstrap-sass%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B/

「Can't run bootsrap : couldn't find file 'bootstrap-sprockets' with type 'application/javascript'」
http://stackoverflow.com/questions/31371040/cant-run-bootsrap-couldnt-find-file-bootstrap-sprockets-with-type-applica

まあどれも僕のコードに適応してもダメだったんですけどね。


## そもそも手順が足りない
チュートリアルの`リスト 5.6: Bootstrap CSSを追加する`まで終えた状態です。
足りない手順

* application.jsの編集

これですね。
僕の場合、何度やっても `Sprockets::FileNotFound in StaticPages#home `が出ていて、bootstrapが読み込めていませんでした。
検索した結果、 `application.js`に記述する手順が抜けている。
とある記事には、 `//= require jquery`をいれなければダメですみたいなことが書いてあって、僕は正直に入れてやってみたんですが、 `//= require jquery`でエラーが出ていたので、これは削除しました。

```application.js
// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's
// vendor/assets/javascripts directory can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// compiled file. JavaScript code in this file should be added after the last require_* statement.
//
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
// about supported directives.
//
//= require rails-ujs
//= require turbolinks
//= require_tree
//= require bootstrap-sprockets
```

最後の一行( `//= require bootstrap-sprockets`)を追加する(だけだったと思う・・・)。

## 手順に逆らってみた
チュートリアルでは `custom.scss`を作成してやっていましたが、僕の場合は `application.js`に編集を加えたので、 `custom.scss`は作成せずに、元からあった `application.css`を編集しました。
`application.css`を `application.css.scss`へリネームします。

```application.css.scss
@import "bootstrap-sprockets";
@import "bootstrap";
```

手順にあった `custom.scss`の中身をここへ記述。 `bootstrap-sprockets`は `bootstrap`の上に記述しなければならない、らしいです。

## 無事解決
![スクリーンショット 2017-05-13 16.21.34.png](https://qiita-image-store.s3.amazonaws.com/0/145671/6fd93196-1235-1dd9-4467-e7bad069986d.png)

ちゃんと表示されました！
`custom.scss`を作成してから `application.js`に変更を加える場合は、上に貼った記事を参考に `application.css`にも変更が必要になると思います。
僕の場合それが面倒臭かったので、直接`application.css`をかきかえました。
参考にしてみてください。


## 追記
`application.css`を書き換えずとも`custom.scss`を作成して`application.js`に変更を加えて上の画面が表示されました。
なので、チュートリアルの`リスト 5.6: Bootstrap CSSを追加する`まで終えた状態で、`application.js`に変更を加えれば無事解決します。
Oracle Preinstall RPMは何をしているのか？

# Oracle PreInstall RPMとは？
  Oracle Databaseのインストールを成功させるには多くの前提条件をクリアする必要があります。主なものだけでも以下のような設定が必要です。
- インストール要件に合うハードウェア／OSを準備する
- パッケージのインストール
- カーネル・パラメーターの設定
- OSリソース制限の設定
- 管理ユーザーの作成
- ユーザー制限の設定

　上記を手作業で行うことも当然できますが、かなり大変な作業です。Linux環境で、できるだけ簡単にかつ確実に実施できるようにするため、Oracleは事前設定（=Preinstall）ツールとしてrpmパッケージを提供しています。
　このPRMパッケージはOracle DatabaseのバージョンとLinuxのバージョンの組み合わせで異なるファイルが提供されいます。インストール・メディアは[Oracle Public Yum](http:\/\/public-yum.oracle.com\/)から最新版を入手すると良いでしょう。このページではOracle Linux 7 Update 3 / Oracle Database 12c Release 2を前提に記述しています。

# インストール
使用している環境がOracle Linuxの場合、インストール作業は簡単です。単純にrpmコマンドを実行するだけです（またはインターネット接続環境であればyum install oracle-rdbms-server-12cR2-preinstallコマンド）。依存パッケージとして事前にcompat-libstdc++-33とkernel-uakのインストールが必要です。

```
# rpm -ivh oracle-database-server-12cR2-preinstall-1.0-2.el7.x86_64.rpm
```
実行ログは/var/log/oracle-database-server-12cR2-preinstall/results/orakernel.logファイルに出力されます。

# 実際には何をしているのか？
ではこのパッケージをインストールすることで実際にどのような処理が行われているかを調べてみます。

## カーネル・パラメーターの変更
下記のような複数のカーネルパラメーターを変更しています。/etc/sysctl.confを書き換えています。

|パラメーター|設定値|
|:---|---:|
|fs.file-max|6815744| 
|kernel.sem|250 32000 100 128| 
|kernel.shmmni|4096| 
|kernel.shmall|1073741824| 
|kernel.shmmax|4398046511104| 
|kernel.panic_on_oops|1| 
|net.core.rmem_default|262144| 
|net.core.rmem_max|4194304| 
|net.core.wmem_default|262144| 
|net.core.wmem_max|1048576| 
|net.ipv4.conf.all.rp_filter|2| 
|net.ipv4.conf.default.rp_filter|2| 
|fs.aio-max-nr|1048576| 
|net.ipv4.ip_local_port_range|9000 65500| 

## /etc/security/limits.confの変更
ユーザーの制限を指定しています。rpmインストール時点ではOracle Database管理ユーザーは指定されていないので、domainは指定されていません。

|domain|type|item|value|
|:---|:---|:---|:---|
|*|soft|nofile|1024|
|*|hard|nofile|1024|
|*|soft|nproc|16384|
|*|hard|nproc|16384|
|*|soft|stack|10240|
|*|hard|stack|32768|
|*|soft|memlock|134217728|
|*|hard|memlock|134217728|

## Network設定
/etc/sysconfig/networkファイルに以下を追加します。

```
# oracle-database-server-12cR2-preinstall : Add NOZEROCONF=yes
NOZEROCONF=yes
```

## Kernel設定
Kernelのブート・パラメーター（grubまたはefiの環境に応じて）に以下の指定が行われます。
- numaを使用しない指定（numa=off）
- Transparent Huge Pages を使用しない設定（transparent_hugepage=never）

## ユーザー／グループの作成
oinstallグループ（GID=54321）、dbaグループが存在しなければ作成します。
oracleユーザー（UID=54321、プライマリ・グループ=oinstall、セカンダリ・グループ=dba）が存在していなければ作成します。

# 何をしてくれないのか？
逆にこのパッケージをインストールしただけでは以下の項目についてはチェックしてくれないことがわかります。データベースのインストール前なので仕方ないといえば仕方ないですが。
- SE-Linuxの設定
- Firewalの設定
- SGAに応じたHuge Pages設定
- ファイル・システムやASMに関する推奨設定
- ネットワークやストレージの冗長化設定
- Oracle管理ユーザーやOracle Grid Infrastructure管理ユーザーの環境変数設定

# 終わりに
PreInstall RPMが実際に行っている処理について簡単に記述しました。インストール作業を楽にするためにOracle Linuxを使っている環境ではインストールをお勧めします。またRed Hat Enterprise Linuxを使っている環境でも上記設定を行うことでOracleが推奨する値を使った環境を構築することができます。
FactoryGirlで「多対多」や「複数の1対多」のアソシエーションを設定する

FactoryGirlでインスタンスの作成時にアソシエーションを設定する方法は色々ありそうですが、一番簡単だと思った方法を書いておきます。

## 前提条件
#### バージョン
- Rails 5.0.2
- Rspec 3.5.4
- factory_girl_rails > 4.4.1

#### アソシエーション
今回設定するアソシエーションは以下の通り。

```user.rb
class User < ApplicationRecord
  has_many :groups, through: :group_users
  has_many :group_users
  has_many :messages
end
```
```group.rb
class Group < ApplicationRecord
  has_many :group_users
  has_many :users, through: :group_users
  has_many :messages
end
```
```group_user.rb
class GroupUser < ApplicationRecord
  belongs_to :group
  belongs_to :user
end
```
```message.rb
class Message < ApplicationRecord
  belongs_to :group
  belongs_to :user
end
```
userとgroupがgroup_userを介して多対多の関係、
user,groupはそれぞれmessageと１対多の関係です。

#### factory_girlの記法の省略
spec/rails_helper.rbに下記を追加し、インスタンス作成時にFactoryGirlという記述を省略しています。
```rails_helper.rb
  config.include FactoryGirl::Syntax::Methods
```
## 「１対多（has_many）」の設定
「多対多」の設定をする前に「１対多」の場合のhas_manyの設定をみておきます。
例えば、user has_many messagesの場合、userインスタンス作成時にafter(:create)を用いて関連したmessagesを作成することができます。

```user.rb
FactoryGirl.define do
  
  factory :user do
    name                    "komekami"
    email                   "komekami@mail"
    password                "12345678"
    password_confirmation   "12345678"

    after(:create) do |user|
      create_list(:message, 3, user: user)
    end
  end
end
```
これでuser_idに作成されたuserインスタンスのidを持つmessageインスタンスが3つ作成できます。create_listは第一引数に作成したいインスタンス名、第二引数に作成したい個数、それ以降に「カラム名: 値」の形で値の上書きができるので、作成したuserのidをmessageのuser_idカラムに上書きしますよー、ってことですね。
## 「多対多」の設定
続いて「多対多」の設定です。
例えば、user has_many groupsの場合、userインスタンス作成時に関連したgroupsインスタンスを作成します。

```user.rb
FactoryGirl.define do
  
  factory :user do
    name                    "komekami"
    email                   "komekami@mail"
    password                "12345678"
    password_confirmation   "12345678"

    after(:create) do |user|
      create_list(:group, 3, users: [user])
    end
  end
end
```
「１対多」のhas_manyの場合とほとんど同じです。create_listのuserの受け渡しが複数形と配列の形になっているのがポイント。user_ids[]に入るからですね。中間テーブル（group_users）を用いずに設定できました、すっきり。

## 「複数の１対多」の場合
これでuserとgroupの多対多の関係が設定できました。しかし、今回はさらに、userとgroupがそれぞれ多数のmessagesを持っている、という関係があります。これをafter(:create)で全て紐付けようとすると、少し複雑そうな気がします。
そこで、Rspec側で値をセットするやり方を考えます。

```messages_controller_spec.rb
  let(:user) { create(:user) }
  let(:message) { create(:message, user: user, group: user.groups.first) }
```
例えば、messages_controllerのテストの際、let(:user)を使ってuserを定義し、前述したafter(:create)で同時にgroupを作成します。その後、let(:message)でmessageを定義する際に、createの引数にuserとgroupを記述することにより、let(:user)が読み込まれて上書きされるようになります。

```message.rb
FactoryGirl.define do
  
  factory :message do
    body      "hello world!"
    image     "sample.jpg"
    user
    group
  end
end
```
messageのFactoryGirlにはuserとgroupを置いておけばよいですね。

以上で、アソシエーションの設定ができました。
ご指摘等ありましたら、コメントお願いします！

参考にしたサイト
[factory_girl/GETTING_STARTED.md](https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md)
[FactoryGirlで関連データを同時に生成する方法いろいろ](http://qiita.com/metheglin/items/47116ccbdb26aa00e034)
[factory_girl で最低限知っておきたい4つの使い方](http://blog.livedoor.jp/sasata299/archives/51931175.html)
HTML内のJavaScriptで browserify で require を行ったモジュールを使う

## まずはじめに
ブラウザ側で require を使いたい場合にbrowserify を使っていると思います。
このbrowserifyのサンプル、よくみかけるのですが、HTMLを含まずJavaScript内だけで話が終わるサンプルも多く、また、gruntやgulpと組み合わせて使う、みたいなサンプルも多く、タイトルどおりのシンプルな使い方をしたいときにやり方がわからず、かなり調べるはめになってしまいました。

もっとシンプルに browserify だけの動きについて理解したいなと思い、自分のため、また、同じ疑問をもつ人のために、まとめておきます。

たどりにたどってたどり着いたのは、Qiitaではなく、stack overflow 日本語版でした。

[browserify - browserifyでまとめたモジュールをHTMLのインラインスクリプトから実行したい - スタック・オーバーフロー](
https://ja.stackoverflow.com/questions/5086/browserify%E3%81%A7%E3%81%BE%E3%81%A8%E3%82%81%E3%81%9F%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92html%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%8B%E3%82%89%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%9F%E3%81%84)

あと、gulpは、一瞬使いましたが、タスクランナー使うのは今後やめようと思います。
理由は、この素晴らしい記事が教えてくれました。解決するために複雑なものを導入すると苦労します。なるべくシンプルな解決策を選びたいと思ってます。

[[意訳]私がGulpとGruntを手放した理由 - Qiita](http://qiita.com/chuck0523/items/dafdbd19c12efd40e2de)


## コード
自分がやりたいことも、ここ(スタックオーバーフロー)の方の質問の方と同じく、browserify で作成したものを HTML内のインラインスクリプトから使いたいというものです。

リンク先の質問者の方は Coffee Script を使っているらしく、解決自己レスのCoffeeScript コードは意味がわからないのでスルーします。(自分はCoffeeScriptは使わないです。素のJavaScriptやBavelやTypeScriptの方が望ましい気がします)

ento♦さん、という方の解答が大変すばらしく、結局このまま使えばいいのですが、ここで自分ははまったので、試した結果を書きます。

```JavaScript:mymodule.js
module.exports = 'hi';
```

```:コマンド1
>browserify -r ./mymodule.js:mymodule > appplication.js
```

```:コマンド2
>browserify -r ./mymodule.js:mymodule -o appplication.js
```
コマンド1とコマンド2は同じ機能になります。

```html:runhtml.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title></title>

<script src="application.js"></script>
<script>
  var mymodule = require('mymodule');
</script>

  </head>
  <body>
    <!-- page content -->
  </body>
</html>
```

## はまらないために

ここで動作確認に大事だったのは、broserify の -r オプションと、そこで指定されるrequire用の名前でした。

-r オプションのあるものは、生成後のファイルに
[require=]の記述があり、
-r オプションのないものはそれがありません。
なので、-r オプションを指定することで、HTML内のインラインスクリプトで require が使えるということになります。
-r がないと、動きません。

また、わかりにくいのは、require用の名前を省略することができるということです。

```:コマンド3
>browserify -r ./mymodule.js -o appplication.js
```
これは動作してrequire用の名前がつきますが、
これがなぜか、[/mymodule.js]となります。
なので、HTML内のJavaScriptは次のようになります

```html:runhtml.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title></title>

<script src="application.js"></script>
<script>
  //NG	var mymodule = require('mymodule');
  //NG	var mymodule = require('/mymodule');
  //NG  var mymodule = require('./mymodule.js');
  var mymodule = require('/mymodule.js');
</script>

  </head>
  <body>
    <!-- page content -->
  </body>
</html>
```
コメントでNGと書いてあるものは、全て動きません。
一字一句あわないと動きません。動きそうで動かないので、ずいぶん、はまりこんでしまいました。

## コマンドエラー

さらには、つぎのコマンドはエラーになります。
ファイル指定の先頭に ./ がないからです。

```コマンド4
>browserify -r mymodule.js -o appplication.js
Error: Cannot find module 'mymodule.js'

>browserify -r mymodule.js:mymodule -o appplication.js
Error: Cannot find module 'mymodule.js'

```
パスは通っているような感じなのになぜかコマンドがエラーになります。これもはまってしまいました。しかも、エラー表示が、Cannot find module って、ファイルは見えているのに...と思ってしまいました。

ということで、browserify を使う時は、-r オプションと、require用の名前指定、おすすめします。
VSCodeでrbenv環境のrubyのデバッグ、コードコンプリートができない


たぶん次に環境を作ろうとした時には忘れてると思うのでメモ。

# 問題

rbenv環境のrubyのプログラムをvscodeで書きたい。デバッグ、コードコンプリートしたい。　　
[VSCode ruby拡張の拡張のページ](https://github.com/rubyide/vscode-ruby)を見ながら設定したが、デバッグ、コードコンプリートができない。

デバッグしようとすると

`Debugger terminal error: Process failed: spawn rdebug-ide ENOENT`

とエラーになる。

# 原因

ググって調べてみると、どうもこのエクステンションはユーザシェルのpathを考慮してくれないらしい。つまり、ユーザのrbenv環境を参照せずに/usr/binや/usr/local/binからデバッグツール(rdebug-ide)、コードコンプリートツール(rct-complete)を起動するっぽい。

[参考:Getting error "Debugger terminal error: Process failed: spawn rdebug-ide ENOENT" on Ubuntu 16.04. Any help? ](https://www.reddit.com/r/vscode/comments/5w1acs/getting_error_debugger_terminal_error_process/)

# 対応方法

方法は以下の2つ。

- /usr/binや/usr/local/binにrdebug-ide、rct-completeのシンボリックリンクを貼る。
- rdebug-ide、rct-completeの場所をVSCodeの設定ファイルに書く。

ここではVSCodeの設定ファイルに書く方法を説明する。

前提

- osはmac os 10.12.4。(linuxやwindowsはパス等を適宜変更すること。)
- vscodeインストール済み(確認したバージョンは 1.12.1)
- vscodeにruby拡張をインストール済み(確認したバージョンは 0.12.1)
- rbenvでruby環境が/Users/<ユーザ名>/.rbenv/以下にインストール済み。
- 以下のgemをインストール済み 
  - ruby-debug-ide -v 0.6.0
  - debase -v 0.2.2.beta10
  - rcodetools

ユーザ設定のsettings.jsonを以下の通り修正する。

    {
      ...
    + "ruby.rctComplete.commandPath": "/Users/<ユーザ名>/.rbenv/shims/rct-complete"
      ...
    }


launch.jsonを以下の通り修正する。

    {
      ...
      "configurations": [
        {
          ...
    +     "pathToRDebugIDE": "/Users/<ユーザ名>/.rbenv/shims/rdebug-ide",
          ...
        }
    }
gulpの起動を簡単にする方法

ふと「gulpってどうやって起動するんだっけ？」となったので、メモします。

## 起動方法

作業ディレクトリに移動し、以下を実行します。

```bash:
$ node_modules/.bin/gulp
```

ただし、毎回、上記のように打つのは面倒なので、package.jsonを変更し、

```bash:
$ npm run gulp
```

でgulpを起動できるようにしました。

変更内容はこちら。
（"scripts"の定義を追加しました。）

```json:package.json
{
  "name": "xxx",
  "version": "1.0.0",
   
  ~　（中略）~

  "devDependencies": {
    "gulp": "^3.9.0"
   
    ~　（依存ファイルを列挙）~

  },
  "scripts": {
    "gulp": "gulp",
    "start": "gulp"
  }
}
```

## 停止方法
gulpを停止するコマンドは、```Ctrl+C```です。

## 参考ページ
こちらにわかりやすくまとまっていました。

* [gulp.js を今一度キチンと！gulp.js 導入基礎](https://h2ham.net/gulp-basic)
Ansibleできる環境をbash on Windowsで構築する

# 追記
拡張リポジトリを追加してアップデートすると、ansible2.3.0.0にバージョンアップしました。

参考：[ansible,Inc](https://launchpad.net/~ansible/+archive/ubuntu/ansible)

# はじめに
Macだとターミナル上からそのままsshでサーバに入ってもストレスないし、ローカルで書いたコードをAnsible使ってサーバプロビジョニングしたりするので、業務中も自分のMacを使って検証したりしてました。（業務で使ってるのはWindow10です）

ところが、私含めて所属しているSREチームの半分以上はWindows10を使用して業務をしています。
自分はMacでAnsibleの検証ができるかもしれないが、他の人はどうする。
みたいなことになり、やっぱりWindows10でAnsibleが使えるようになるのが一番いい。
そういうわけで、[Windows10でもストレスなくターミナルが使えるようにした](http://qiita.com/VTRyo/items/67f68deeac5b49ab2f88)のですが・・・

# bash on windowsでAnsibleをインストールするとバージョンが古い問題
シンプルにapt-get install ansibleでAnsibleをインストールしたら終わりです。
が、なぜか何度やってもバージョンが古い（v1.5）のしか入らなくて困りました。
ymlファイルにbecomeの記述をしたので、このバージョンだと困りました（1.9以降にしないと、Ansibleがbecome関連でエラーを吐いてきます）。

apt-getをアップデートしてもアップグレードしても意味ナシ。
やっぱりWindowsじゃだめなのかよと思った矢先、起死回生の記事発見。

> [Ansible(2系) インストール方法まとめ](http://sv.hateblo.jp/entry/2016/06/03/Ansible%282%E7%B3%BB%29_%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95%E3%81%BE%E3%81%A8%E3%82%81)

```
$ apt-get install software-properties-common
$ apt-add-repository ppa:ansible/ansible
$ apt-get update
$ apt-get install ansible
```

どうやらppaという拡張リポジトリが必要だったようです。
これで解決！

# 参考
* [ansible](http://docs.ansible.com/ansible/become.html)
* [Ansible(2系) インストール方法まとめ](http://sv.hateblo.jp/entry/2016/06/03/Ansible%282%E7%B3%BB%29_%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95%E3%81%BE%E3%81%A8%E3%82%81)
HerokuではSQLite3が使えない？！

# ■ 結論
**SQLiteは使えません。**
なので、 **PostgreSQL** を使用するよう設定します。

# ■ 経緯

Herokuにデプロイ時、エラーが出た。

```terminal:terminal
remote:        An error occurred while installing sqlite3 (1.3.13), and Bundler cannot
remote:        continue.
remote:        Make sure that `gem install sqlite3 -v '1.3.13'` succeeds before bundling.
remote:  !
remote:  !     Failed to install gems via Bundler.
remote:  !     Detected sqlite3 gem which is not supported on Heroku:
remote:  !     https://devcenter.heroku.com/articles/sqlite3
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
remote:
remote:  !     Push failed
remote: Verifying deploy...
remote:
remote: !	Push rejected to hoge-hoge-00000.
remote:
To https://git.heroku.com/hoge-hoge-00000.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/hoge-hoge-00000.git'
```


**SQLite3** 周りでエラーが出る。。。

# ■ 原因・解決

heroku だと、 sqlite3 がビルドできないので、開発環境でだけ使うよ、っていう宣言が必要
　(heroku では、 production の gem だけビルドされる)

↓を削除し

```ruby:gemfile


gem 'sqlite3'

```

代わりに↓を挿入する

```ruby:gemfile


gem 'sqlite3', groups: %w(test development), require: false

gem 'pg', groups: %w(production), require: false

```

上記のようにGemfileを修正後、 `bundle install && git push heroku master` で完了！

# ■ 参考

http://d.hatena.ne.jp/EnnuimaZ/20120407/1333806290
eZ Platform 1.9.0 インストール手順

## eZ Platform
https://ezplatform.com/

## インストール
### CentOS
CentOS 7.3.1611 minimal

```bash
yum clean all && yum -y update && reboot
```

### MySQL
```bash
yum -y install https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm && yum -y install mysql-community-server
echo -e '\ncharacter-set-server = utf8mb4' >> /etc/my.cnf
systemctl start mysqld && systemctl enable $_
grep "temporary password" /var/log/mysqld.log | awk '{print $11}'
mysql_secure_installation --use-default
```
#### DB 作成
```bash
mysqladmin --user=root --password create ezplatform
```
#### DB ユーザー作成
```bash
cat << "_EOQ_" | mysql -u root -p
CREATE USER 'ezplatform'@'localhost' IDENTIFIED BY 'P@ssw0rd';
GRANT ALL PRIVILEGES ON ezplatform.* TO 'ezplatform'@'localhost';
_EOQ_
```

### PHP / Apache / Memcached
```bash
yum -y install http://p80.jp/remi-release-7.rpm
yum -y install yum-utils && yum-config-manager --enable remi --enable remi-php71
yum -y install php php-{gd,intl,mbstring,mysqlnd,opcache,pecl-{apcu,memcached},process,xml} memcached
sed -i.org 's|;date.timezone =|date.timezone = Asia/Tokyo|' /etc/php.ini
```
#### firewalld
```bash
firewall-cmd --permanent --add-service=http{,s} && firewall-cmd --reload
```

### Composer
```bash
curl -sS https://getcomposer.org/installer | php && mv composer.phar /usr/local/bin/composer
yum -y install git unzip && composer config -g repos.packagist composer https://packagist.jp && composer global require hirak/prestissimo
```

### eZ Platform
```bash
mkdir /var/www/ezplatform && curl -LO https://ezplatform.com/content/download/158/file/ezplatform-1.9.0.tar.gz | tar zx --strip=1 -C /var/www/ezplatform
```

### Apache の VirtualHost の設定
```bash
cp /var/www/ezplatform/doc/apache2/vhost.template /etc/httpd/conf.d/ezplatform.conf
sed -i /etc/httpd/conf.d/ezplatform.conf \
-e 's/%IP_ADDRESS%:%PORT%/*:80/' -e 's/%HOST_NAME%/localhost/' \
-e '/ServerAlias/d' -e 's|%BASEDIR%|/var/www/ezplatform|' \
-e 's/%BODY_SIZE_LIMIT%/0/' -e 's/%TIMEOUT%/42/' \
-e '/#Require all granted/ s/#//';
systemctl start httpd memcached && systemctl enable $_
```

### eZ Platform
```bash
yum -y install git unzip && cd /var/www/ezplatform && composer install
secret (ThisEzPlatformTokenIsNotSoSecretChangeIt): $(curl -sS http://nux.net/secret | grep lead | cut -c17-56)
php app/console ezplatform:install clean
chown -R root. /var/www/ezplatform && chown -R apache. $_/{app/{config,logs,cache},web} && chmod -R 664 $_ && chcon -R -t httpd_sys_script_rw_t $_
find {app/{cache,logs},web} -type d | xargs chmod -R 775
```

#### 日本語化
```bash
composer require ezplatform-i18n/ezplatform-i18n-ja_jp
```

### Vim の Twig シンタックス追加
```bash
yum -y install vim-enhanced
curl -o twig.vim.tar.gz -L https://github.com/nelsyeung/twig.vim/archive/master.tar.gz
mkdir ~/.vim
tar xf twig.vim.tar.gz --strip=1 -C ~/.vim
```
Reactで3つのコンポーネントをstateとpropsで行き来する書き方

## これから書くこと

- 親のコンポーネントと2つの子のコンポーネントをpropsとstateを使って行き来する
- 子のコンポーネント1つはFormタグで住所を入力するUI
- 子のコンポーネント1つはそのFormに入力した値を元にGoogleMapを表示するUI

※React初心者なので間違っている書き方もしれません。
ご指摘くださいますとうれしいです。

## なぜ投稿しようと思ったのか

- 自分の備忘録のため
- 1つのコンポーネントにform系とその入力した値を表示させる参考サイトはたくさんあるが、それらを切り離した参考サイトがなかったので

## 環境

- React
- es6
- Meteor(フレームワーク)
- jsxに記述

## 親のコンポーネント

- 入力された値を取得する
- その入力された値をGoogleMapに返す

``` javascrpit:Parent.jsx
import React, { Component, PropTypes } from 'react';
import InputForm from './InputForm.jsx';
import GoogleMap from './GoogleMap.jsx';

export default class Parent extends Component {

  constructor(props) {
    super(props);
    this.state = {
      inputText: '',
    };
    this.textChange = this.textChange.bind(this);
  }

  textChange(text) {
    this.setState({ inputText: text });
  }

  render() {
    return (
      <div className="google_map">
        <InputForm onChangeAddress={this.textChange} />
        <GoogleMap address={this.state.inputText} />
      </div>
    )
  }
}
```

## 子コンポーネント（Form）

- 入力した値を親のコンポーネント「Parent」に返す(propsに返す)
- 入力する値をstateで監視

``` javascript:InputForm.jsx
import React, { Component } from 'react';

export default class InputForm extends Component {
  constructor(props) {
    super(props);
    this.state = {
      text: '',
    };
  }

  render() {
    return(
      <div>
        <input type="text" id="address" value={this.state.text} onChange={e => this.setState({ text: e.target.value })} />
        <button onClick={() => this.props.onChangeAddress(this.state.text)}>表示</button>
      </div>
    )
  }
}
```

## 子のコンポーネント(GogoleMap表示)

- 親の「Parent.jsx」から入力した値をpropsとして受け取る
- その値によってGoogleMapの表示が変わる

``` javascript:GoogleMap.jsx
import React, { Component, PropTypes } from 'react';

export default class GoogleMap extends Component {

  constructor(props) {
    super(props);
  }

  // フォームに入力した地域をMapに表示
  addressClick() {
    const geocoder = new google.maps.Geocoder();
    geocoder.geocode({
      'address': this.props.address
    }, (result, status) => {
      if (status === google.maps.GeocoderStatus.OK) {
        map.panTo(result[0].geometry.location);
        const marker = new google.maps.Marker({
          position: result[0].geometry.location,
          map: map
        });
      } else {
        console.log('エラーです。')
      }
    });
  }

  componentDidMount() {
    const latlng = new google.maps.LatLng(35.66, 139.69);
    const options = {
      zoom: 15,
      center: latlng,
      mapTypeId: 'roadmap'
    };
    map = new google.maps.Map(document.getElementById('map'), options);
  }

  render() {
    this.addressClick()
    return (
      <div>
        <div id="map"></div>
      </div>
    )
  }
}
```
Swift3でUIViewを拡大縮小させる方法 

# animateWithDurationを使うとビュイーン!とアニメーションできます

```swift
//ボタンアクション
@IBAction func btnUp(sender: AnyObject) {

//変数で使いたければCGRectの引数へどうぞ
 let xPosition = DynView.frame.origin.x
 let yPosition = DynView.frame.origin.y - 20
 let height = DynView.frame.size.height
 let width = DynView.frame.size.width

//アニメーション処理
 UIView.animateWithDuration(1.0, animations: {

  //拡大縮小の処理
  dynView.frame = CGRect(x:10, y:10, width:10, height:10)

 })
}
```

# 参考

[UIView changing its position in swift](http://stackoverflow.com/questions/25694388/uiview-changing-its-position-in-swift)

[Swift3でUIViewを拡大縮小させる方法 ](http://off.tokyo/blog/2017/05/13/swift3%E3%81%A7uiview%E3%82%92%E6%8B%A1%E5%A4%A7%E7%B8%AE%E5%B0%8F%E3%81%95%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95/)
別のクラスのボタンアクションで他のクラスを動かす方法。

ボタンのイベントの中身を

```java
public void actionPerformed(ActionEvent e){
           a.kae();
  }
```

としておき、別のクラスを作る。

```
class a{
	public int test = 0;

	public void kae(){
		test=1;
		if(test==1){
			System.out.println("成功");}
	}
}
```
とでもしておけば、ボタンのイベントが起こったときに
class aの数値が変わり、ifを通ってくれる。
スマートコントラクトの開発

環境構築についての設定
--

概要
-
Ethereumの開発ではクライアントとしてGethを用いる


Ⅰ.はじめに
-
Gethのインストールを実行

【MacOSの場合】

MacでGethをインストールする場合はHomebrewを使うと簡単です。
なお、Homebrewは以下のサイトでインストールをすることができます。

- https://brew.sh/

上記のサイトにログインすると、インストールに必要なコマンドがでてくるので、
それをターミナルへ直接入力します。

>/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Homebrewをインストールした状態で、ターミナルで以下のコマンドを打ち込む。

>$ brew tap ethereum/ethereum
>$ brew install ethereum

インストールを完了後
>geth account new

これでnodeを作成することができる。「Gethの準備が完了」
ターミナルで
>geth　

と打ち込めばGethが立ち上がる。(現時点では実行不要）

Ⅱ.ソースからビルドする
-
任意のディレクトリに以下のレポジトリをクローンする

>$ git clone https://github.com/ethereum_go-ethereum

すると、

>Cloning into 'go-ethereum'...
remote: Counting objects: 61884, done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 61884 (delta 3), reused 0 (delta 0), pack-reused 61876
Receiving objects: 100% (61884/61884), 84.04 MiB | 775.00 KiB/s, done.
Resolving deltas: 100% (41112/41112), done.
Checking connectivity... done.
Checking out files: 100% (2810/2810), done.

とでてくるので、これが出て来ればクローン完了です。

なお、homebrewにおけるヘルプコマンドは

>brew -h

上記のコマンドで確認することができます。
その際に確認できる内容は以下の通りです。

>Example usage:
  brew search [TEXT|/REGEX/]
  brew (info|home|options) [FORMULA...]
  brew install FORMULA...
  brew update
  brew upgrade [FORMULA...]
  brew uninstall FORMULA...
  brew list [FORMULA...]

>Troubleshooting:
  brew config
  brew doctor
  brew install -vd FORMULA

>Developers:
  brew create [URL [--no-fetch]]
  brew edit [FORMULA...]
  http://docs.brew.sh/Formula-Cookbook.html

>Further help:
  man brew
  brew help [COMMAND]
  brew home


なお、Homebrewの公式HPには、
各種バイナリがありますので、必要に応じて確認してください。
tensorflowのQueueを試す

Tensorflowの[TreadhingとQueue](https://www.tensorflow.org/programmers_guide/threading_and_queues)を使うと学習データの読み込み処理を並列処理させることができる．ランダムな２次元マトリックスを入力データとして，バッチとして返す処理を作ってみた．

```python:queue.py
import tensorflow as tf
import numpy as np
import threading

# parameters
data_shape = [2,3]
batch_size = 10
num_threads = 1
epoch = 10

def get_np_data():
    """
    Returns random matrix as input data
    """
    return np.random.rand(*data_shape).astype(np.float32)

def load_and_enqueue(sess, enqueue_op, coord):
    """
    Function to be called in thread
    """
    while not coord.should_stop():
        np_data = get_np_data()
        sess.run(enqueue_op, feed_dict={plf: np_data})

# placeholder of input data
plf = tf.placeholder(tf.float32, shape=data_shape)

# initializes queue
queue = tf.FIFOQueue(batch_size, [tf.float32], shapes=[data_shape])
enqueue_op = queue.enqueue([plf])
batch = queue.dequeue_many(batch_size)

# defines calculation, input_data * 10
y = batch * 10

# initializes session
sess = tf.InteractiveSession()

# initializes coordinator of threads
coord = tf.train.Coordinator()

# starts threads to load input_data
for _ in range(num_threads):
    thread = threading.Thread(target=load_and_enqueue, args=(sess, enqueue_op, coord))
    thread.start()
    coord.register_thread(thread)

# calculates y many times
try:
    for e in xrange(epoch):
        print sess.run(y).shape

finally:
    # finalizes threads
    coord.request_stop()
    coord.join()
```

実行結果は

```shell-session
$ python queue.py
(10, 2, 3)
(10, 2, 3)
(10, 2, 3)
(10, 2, 3)
(10, 2, 3)
(10, 2, 3)
(10, 2, 3)
(10, 2, 3)
(10, 2, 3)
(10, 2, 3)
```
のようになる．
Hugoで新規記事を作成するときにエラー発生

新規ポストを作成するために`hugo new`を実行

```
$ hugo new post/newpost.md
ERROR 2017/05/13 14:15:04 Error processing archetype file /Users/d_ojima/Documents/hugotest/themes/sometheme/archetypes/default.md: Unable to Cast <nil> to map[string]interface{}
Error: Unable to Cast <nil> to map[string]interface{}
```

archetypeがなんちゃらとかで怒られる。

### 原因

`/themes/<なにかしらのテーマ>/archetypes`にarchetypeが定義されていないのが原因のようです。
今回使用していたテーマではarchetypeが定義されていませんでした...

本来は次のように投稿タイプごとのarchetypeが定義されている必要があります。

```
 archetypes
  ├── default.md
  ├── page.md
  └── post.md
```

### 解決方法

archetypeを定義すればオッケーです。
`/themes/<なにかしらのテーマ>/archetypes`以下にdefault.mdを作成しました。

```:default.md
date = ""
description = ""
tags = ["", ""]
title = ""
```

### 参考

* https://gohugo.io/content/archetypes/
* http://qiita.com/n0bisuke/items/4701481c3bca4df81b0b
MacとWindowsのコマンド対比表

仕事で手順書を作る際、MacとWindows両方のコマンドを掲載することがあるので、メモです。
オプションにはよく使うものを指定しています。

## よく使うコマンド対比表
||Mac|Windows|memo|
|:----|:----|:----|:----|
|現在地のディレクトリとファイルを表示|ls -la|dir|[Mac]-laで詳細をリスト表示|
|ファイルやディレクトリを移動|mv [*from*] [*to*]|move [*from*] [*to*]||
|ディレクトリ名を変更|mv [*old*] [*new*]|move [*old*] [*new*]|移動と同じ|
|ファイル名を変更|mv [*old*] [*new*]|ren [*old*] [*new*]|[Mac]移動と同じ|
|ディレクトリをコピー|cp -R [*from*] [*to*]|xcopy /e [*from*] [*to*] |[Mac]-R[Win]/eで、ディレクトリを再帰的にコピー|
|ファイルをコピー|cp -p [*from*] [*to*]|copy [*from*] [*to*]|[Mac]-pで、権限やタイムスタンプを含めてコピー|
|ディレクトリを作成|mkdir [*dir*]|mkdir [*dir*]||
|ファイルを作成|touch [*file*]|copy nul [*file*]||
|空のディレクトリを削除|rmdir [*dir*]|rmdir [*dir*]||
|ディレクトリを再帰的に削除|rm -Rf [*dir*]|rmdir /S [*dir*]||
|ファイルを削除|rm [*file*]|del [*file*]||
|パーミッション変更|chmod -R [*auth*] [*target*]|cacls [*target*] /G [*auth*]||
|ディレクトリにシンボリックリンクを貼る|ln -s [*dir*] [*link_name*]|mklink /D [*link_name*] [*dir*]|MacとWinで、実体とリンク名が逆順なので注意|
|ファイルにシンボリックリンクを貼る|ln -s [*file*] [*link_name*]|mklink  [*link_name*] [*file*]|[Mac]ディレクトリと同じ|
|ディレクトリのシンボリックリンクを削除|unlink [*link_name*]|rmdir [*link_name*]||
|ファイルのシンボリックリンクを削除|unlink [*link_name*]|del [*link_name*]|[Mac]ディレクトリと同じ|


## よくお世話になるIT Proさんのコマンド一覧
* [Linux](http://itpro.nikkeibp.co.jp/article/COLUMN/20060224/230573/)
* [Windows](http://itpro.nikkeibp.co.jp/article/COLUMN/20060221/230144/)
UbuntuのPHP開発環境

# Ubuntu 16.04 Desktop AMD64でPHP開発環境の構築

用途：PHP勉強の為本を買ってきたからとにかくPHPの勉強をする環境が欲しい時

本当は全部Dockerでやりたかったのだけど、とりあえずPHPの勉強したいだけの環境構築をしてみました

勉強目的なのでIDEも使うしデバッグもやりたい

環境は下記の通り、Apacheを入れずにPHP 5.4.0 から組み込まれたビルトインウェブサーバーを使ってみる
- VirtualBox上のUbuntu 16.04 Desktop AMD64
- PHP7.0
- NetBeans8.2
- MySQL5.7
- Xdebug-PHP 2.4.0

VirtualBoxにUbuntuが入っていること前提

## 1.PHP
```
$ sudo apt-get update
$ sudo add-apt-repository ppa:ondrej/php
$ sudo apt-get install php7.0 php7.0-mysql php7.0-dev
```

## 2.MySQL

```bash
$ sudo apt-get install mysql-server-5.7
```



## 3.NetBeans
まずJavaをインストール

```bash
$ sudo apt-add-repository ppa:openjdk-r/ppa
$ sudo apt-get update
$ sudo apt-get install openjdk-8-jdk
```
NetBeansのダウンロードとインストール

[NetBeansの公式](https://netbeans.org/downloads/)で「PHP」か「すべて」をダウンロードしてシェルを実行

```bash
$ bash ~/Download/netbeans-8.2-linux.sh
```

## 4.Xdebug

```bash
$ sudo apt-get install php-xdebug
```
Xdebugを読み込ませる

```bash
$ sudo vi /etc/php/7.0/cli/php.ini
```
一番最後の行に

```bash
zend_extension = "/usr/lib/php/20151012/xdebug.so”
xdebug.remote_enable=on
```

## 実行
こんな感じ
![10.png](https://qiita-image-store.s3.amazonaws.com/0/151648/be2f1023-3927-3bc0-7f01-233e21a7ad30.png)
![20.png](https://qiita-image-store.s3.amazonaws.com/0/151648/3ba93eb2-4192-feab-1048-9cbcd53b034e.png)
忘れがちなpug変数の書き方まとめ

こんにちは、@pompom0c0 です。Pugに触り始めて2週間くらい。
CMS化するほどでもないけど、ちょいちょいnewsとかいじって更新したいサイトを構築する際に、
変数を使うと便利...!だけど書き方忘れちゃった、、って時のために頭の整理をします。

## 環境

### version
- Mac OS Sirra 10.12.3
- npm 3.8.6
- node 5.12.0
- gulp CLI/Local 3.9.1

### 環境構築
こちらの記事をベースに環境構築をしています。
 
- 開発しやすい環境の作り方~Web系~

http://qiita.com/ferretdayo/items/47937cfb38babcf17a20

### フォルダ構成
pugやsassから生成されるhtml,cssデータとjs,画像ファイルをまとめてhtdocsに入れています。
一つのファイルにまとめることで、納品の際に漏れがなくすことができます。

```フォルダ構成
root/
 ├ htdocs/
 |  └ css/
 |  └ img/
 |  └ js/
 |  └ index.html
 ├ node_modules/
 ├ pug/
 |  └ index.png
 ├ sass/
 |  └ style.scss
 |  └ _base.scss
 |  └ _conponent.scss
 |  └ _project.scss
 |  └ _reset.scss
 |  └ _utility.scss
 |  └ _variable.scss
 ├ package.json
 └ gulpfile.js
```

## 変数指定

### 配列と連想配列それぞれの書き方

```配列
- var array = ['aaa', 'bbb', 'ccc']
```

```連想配列
-
  var dictionary = [
  {
    'date':'2017.xx.xx',
    'img':'img/img-01.png',
    'title':'タイトル01'
    'class':['tag__border-red','tag__label-red'],
    'tags':['ライフスタイル','カフェ']
  },
  {
    'date':'2017.xx.xx',
    'img':'img/img-02.png',
    'title':'タイトル02',
    'class':['tag__border-blue','tag__label-blue'],
    'tags':['ミュージアム','表参道','散歩']
  },
];
```
1つのキーに対して複数の値を入れたいときは、[]でくくってその中に値を書きます。

## 出力方法

繰り返し文を使って出力しています。
まとめるとこんな感じです。

```
section.article
  each item in dictionary
    div.article__item
      img(src=`${item.img}` alt="img")
      h2 !{item.title}
      p !{item.date}
      // 1. 複数の値を順番に出力
      div.tag.tag__border(class=`${item.class[0]}`)
	div.tag__label(class=`${item.class[1]}`)
        // 2. 複数の値を連続して出力
        ul.article__tag
          each i in item.tags
            li: p # !{i}
```

### 1.　複数の値を順番に出力

連想配列内で、1つにキーに対して入れた複数の値は配列と同じように、0から番号順にストックされています。
なので書き出しの際は0から番号を指定して書き出します。

### 2. 複数の値を連続して出力

連想配列内に指定した、複数の値を連続して出力したいときは、もう1度繰り返し文を使います。
liタグを使うときは、繰り返し文の後もインデントをズラさないと、htmlで出力した時にulタグの中に入らないので注意しましょう。

```入れ子になる
ul.article__tag
  each i in item.tags
    li: p # !{i}
```

```入れ子にならない
ul.article__tag
each i in item.tags
  li: p # !{i}
```


## まとめ

ほんとにちょっとしたtipsですが、周りにpug使いがいないと困りますよね。
CMS化する前の業務効率化に少しでも貢献できれば嬉しいです:)
Ruby の Symbol#to_proc に引数を渡す拡張

[ブログ記事](http://secret-garden.hatenablog.com/entry/2016/10/06/000000)からの転載です。
『`[1,2,16].map(&:to_s(16))` みたいにかきたいよねー』というやつ。

```ruby
class Symbol
	def call *args, &block
		proc { |myself|
			myself.send self, *args, &block
		}
	end
end

p [1, 2, 16].map(&:to_s.(16))
# => ["1", "2", "10"]
```

`#call` を定義してこういう風に書くことはできるけどもさて。

## [おまけ]

iolite を使用するとこういう風に書くことは出来ます。

```ruby
require "iolite"

include Iolite::Placeholders

p [1, 2, 16].map(&arg1.to_s(16))
# => ["1", "2", "10"]
```

## [元ネタ]

[このあたり](https://bugs.ruby-lang.org/issues/12115)
Nginx + Unicorn + Rails

サーバを再起動（起動/停止）するコマンドはシェルスクリプトに追記してまとめて実行できるようにすることをお勧めする。
## Railsを入れる

## Unicornを入れる
gemでインストール（bundleでも出来るそうな）
RailsのGemfileでコメントインあるいは追記してからbundle installするでも良い。
` $ gem install unicorn `
Railsのルートディレクトリ下にunicornの設定ファイルを作成

```config/unicorn.rb
Unicornのログ出力先を指定
#File.expand_pathはパスを絶対パスに解決するメソッド File.expand_path: https://ruby-doc.org/core-2.2.0/File.html#method-c-expand_path
rails_root = File.expand_path('../../', __FILE__)
#ワーカー数を指定する
worker_processes 2
working_directory rails_root

listen "#{rails_root}/tmp/unicorn.sock" #？？「Unicornのプロセスをlistenするアドレストポートを指定」らしいが…
pid "#{rails_root}/tmp/unicorn.pid" #pid fileの位置を指定する

#ログの出力先を指定
stderr_path "#{rails_root}/log/unicorn_error.log"
stdout_path "#{rails_root}/log/unicorn.log"

```
起動と停止。以下の順で再起動となる

```server_restart.sh
# 停止
kill -QUIT `cat tmp/unicorn.pid`
# デーモンとして起動
unicorn_rails -c config/unicorn.rb -E development -D
```
## Nginxを入れる
インストールと設定ファイルの編集

```
$ brew install nginx
$ cd /usr/local/etc/nginx
$ cp nginx.conf.default nginx.conf
$ cp nginx.conf nginx.conf.YYYYMMDD
$ vi nginx.conf
```
confファイルに以下を追加する。http{}の中に記述すること。

```nginx.conf
upstream unicorn {
        # nginxとunicornの連携
        # unicorn.rbで設定したunicorn.sockを指定
        server unix:{RAILS_PROJECT_ROOT}/tmp/unicorn.sock;
    }

server {
        listen 8081;
        server_name {PROJECTDOMAIN_FOR_LOCAL};

        root {RAILS_PROJECT_ROOT}/public;

        access_log /usr/local/var/log/nginx/{PROJECT_NAME}_access.log;
        error_log /usr/local/var/log/nginx/{PROJECT_NAME}_error.log;

        client_max_body_size 100m;
        error_page 500 502 503 504 /500.html;

        try_files $uri/index.html $uri @unicorn;

        location @unicorn {
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_pass http://unicorn;
        }
    } 
```
## NginxとUnicornの設定ファイルをいじる
エラーの原因
rootの文法
tmpの利用法　新利用法？
http://serverfault.com/a/464025

## サーバを再起動するシェルスクリプトを用意する

```server_restart.sh
nginx
nginx #sudo必要
```

## 参考
＊よく参照した：　http://qiita.com/itosho/items/e0c2290f8079e740030b
bundle installからunicorn。Unicornの詳細もある：http://qiita.com/Salinger/items/5350b23f8b4e0dcdbe23
（＾見ておきたい）
NginxとPHP： http://qiita.com/makotok7/items/2ca1c50d37cb2f8f3972
参考になりそうだが、他の方法で実行できてしまった：http://qiita.com/larufa/items/00ec6802ab7c1377114d
node.jsでcsvを同期読み込み(csv-parseを使用)

npmで`csv`で検索すると、真っ先に表示されるのが[csv](https://www.npmjs.com/package/csv)というモジュール 
今回はこのcsvに含まれる[csv-parse](https://www.npmjs.com/package/csv-parse)を使ってcsvを同期読み込みしてみた。

### 読み込むCSV

```:input.csv
tanaka,100,F
itou,150,M
kobayashi,200,M
suzuki,120,F
noda,80,M
doi,120,F
```

### モジュールのインストール
[csv](https://www.npmjs.com/package/csv)をインストールしても良いが、今回は読み込みのみをしたかったので[csv-parse](https://www.npmjs.com/package/csv-parse)をインストール。　　

`$ npm install --save csv-parse`

### やってみる
以下の例ではオプション無しで使用していますが、第二引数にはデリミタやヘッダー行のオプションを指定できる。

```js:read-sync.js
'use strict';

const fs = require('fs');
const csvSync = require('csv-parse/lib/sync'); // requiring sync module

const file = 'input.csv';
let data = fs.readFileSync(file);

let res = csvSync(data);

console.log(res);
```

### 出力

```
$ node read-sync.js 
[ [ 'tanaka', '100', 'F' ],
  [ 'itou', '150', 'M' ],
  [ 'kobayashi', '200', 'M' ],
  [ 'suzuki', '120', 'F' ],
  [ 'itou', '80', 'M' ],
  [ 'doi', '120', 'F' ] ]
```

ちょっとしたツール作成の際にはStream APIやcallbackを使って1レコードずつ読み込む方法よりも扱いやすいかと思います。
thriftでRubyからPythonを呼び出してみる

## install

```bash:mac
brew install thrift # thrift
gem install thrift # ruby
pip install thrift # python
```


## example

https://www.ibm.com/developerworks/jp/opensource/library/os-cloud-apache-thrift/　を参考にする

注意：まずはPython2で試す

ほぼページ通りにやる

### thriftファイルの定義

```proj.thrift
# proj.thrift

namespace py demoserver
namespace rb demoserver

/* All operands are 32-bit integers called a Value */
typedef i32 Value
typedef i32 Result

/* Math service exposes an some math function */
service MyMath
{
  Result add( 1: Value op1, 2: Value op2 ),
  Result mul( 1: Value op1, 2: Value op2 ),
  Result min( 1: Value op1, 2: Value op2 ),
  Result max( 1: Value op1, 2: Value op2 )
}
```

### RubyとPythonのファイルを作成

```
thrift --gen py proj.thrift
thrift --gen rb proj.thrift
```

### server.pyを作成
この中で処理部分を書く

```python:server.py
#!/usr/bin/python

import sys

sys.path.append('./gen-py')

from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer
import demoserver.MyMath

class MathImpl( demoserver.MyMath.Iface ):
    def add( self, op1, op2 ):
        return op1 + op2
    def mul( self, op1, op2 ):
        return op1 * op2
    def max( self, op1, op2 ):
        return max([op1, op2])
    def min( self, op1, op2 ):
        return min([op1, op2])

if __name__ == '__main__':

    processor = demoserver.MyMath.Processor( MathImpl() )
    transport = TSocket.TServerSocket( port = 18181 )
    tbfactory = TTransport.TBufferedTransportFactory()
    pbfactory = TBinaryProtocol.TBinaryProtocolFactory()

    server = TServer.TThreadedServer( processor, transport, tbfactory, pbfactory )

    print('Starting the Math Server...')

    server.serve();
```

### rubyのclientを書く

```ruby:client.rb
# Make thrift-generated code visible
$:.push('./gen-rb')

require 'thrift'
require 'my_math'

begin

    # Build up the Thrift stack
    transport = Thrift::BufferedTransport.new(Thrift::Socket.new('localhost', 18181))
    protocol = Thrift::BinaryProtocol.new(transport)
    client = Demoserver::MyMath::Client.new(protocol)
    transport.open()

    # Try an add operation
    result = client.add( 1, 5 )
    puts result.inspect

    # Try a max operation
    result = client.max( 9, 7 )
    puts result.inspect

    transport.close()
```

### 実行する

参考リンクの中の

```
python server.py
```

```
ruby client.rb
6 ## 1+5の答え
9 ## 9と7の最大値の答え
```
『メルカリアッテ』 の Androidライブラリ集

『メルカリアッテ』のAndroidでは、どんなライブラリが使われているのかが気になったので列挙してみました:coffee:   (2017/5/12時点)

使ったこと無いライブラリも多かったので、便利そうなやつは導入検討したいなーと思ってます:saxophone: 

## 計測
### Adjust Android SDK
https://github.com/adjust/android_sdk
>This is the Android SDK of http://www.adjust.com

広告の計測、他社でもAdjustの話聞きました。

## データ
### データベース ORM
https://github.com/gfx/Android-Orma
> Orma is a ORM (Object-Relation Mapper) for Android SQLiteDatabase. 

Realmを使っているので、お世話になることはありませんでした。

### SharedPreferences 関連
https://github.com/rejasupotaro/kvs-schema
> KVS Schema is a library to manage key-value data for Android. This library generates accessor methods of SharedPreferences from schema class in compile time.

これは初めて見ました、 `SharedPreferences` 結構煩雑になるので使ってみたい。

## 通信
### json
https://github.com/google/gson
> Gson is a Java library that can be used to convert Java Objects into their JSON representation.

### 王道
https://github.com/square/okhttp
https://github.com/square/retrofit

## Rx
https://github.com/ReactiveX/RxAndroid
https://github.com/JakeWharton/RxBinding
https://github.com/ReactiveX/RxJava

## その他便利系
### OnActivityResult を便利に
https://github.com/vanniktech/OnActivityResult
>Generates boilerplate code for OnActivityResult callbacks and lets you focus on what matters.
Generated code is fully traceable and debuggable.

### Parcelable を簡単に
https://github.com/johncarl81/parceler
>Parceler is a code generation library that generates the Android Parcelable boilerplate source code. No longer do you have to implement the Parcelable interface, the writeToParcel() or createFromParcel() or the public static final CREATOR. You simply annotate a POJO with @Parcel and Parceler does the rest.

### Mパーミッションへの対応
https://github.com/hotchemi/PermissionsDispatcher
> PermissionsDispatcher provides a simple annotation-based API to handle runtime permissions in Android Marshmallow, 100% reflection-free.

### 画像の取り扱い
https://github.com/square/picasso
> A powerful image downloading and caching library for Android

### 日付の取り扱い
https://github.com/JakeWharton/ThreeTenABP
> An adaptation of the JSR-310 backport for Android.


### Log
https://github.com/JakeWharton/timber
>This is a logger with a small, extensible API which provides utility on top of Android's normal Log class.


## 終わり
他社のアプリのライブラリとか覗くのおもしろかったので、また時間見つけてやってみたいです:rocket: 
間違いとかコメントください:bow:
raspberry pi でSiriからIR-KITを制御しようとしたときのトラブルメモ

raspberry pi でSiriからIR-Kitを制御して家電を操る。
この接続までではまったトラブル対処のメモ

（一年近く穴にはまってばかりでしたが、ようやくうまく繋がったのでご紹介）

---
#1.iOS アクセサリとシーンの読み込み中。から進まない。

↓以下の表示から進まない。

<img width="375" alt="IMG_6261.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/168808/5f553ad5-7aa4-3514-1679-839d2f43185d.png">


初めて立ち上げたときから、ホームがこの画面から進まず。
アクセサリの検索にすら行けなかった。

→ituneで携帯のバックアップをとって、初期化。
これでアクセサリの検索ができるようになりました。

---


#2.Raspberry pi からIR-KITに直接アクセスできるのにhomebridgeからつながらない

ホスト名からIR-KITを探せていない様子。
avahiで見てみるとIR-KITがリストに出てこない。

どうも、家庭内LANの設定次第で見えなくなるみたい。

ルータの設定でMulticast Rate を下げてみたら、リストに出るようになった。
（今回はとりあえず、1Mbpsに設定。参考にしたサイトでは6Mbps以下ならうまくいったとのこと）

![gamen.jpg](https://qiita-image-store.s3.amazonaws.com/0/168808/ad2dde00-d592-1466-2bfa-77c9c4473de9.jpeg)


【参考】
http://y-naito.ddo.jp/index.php?categ=6&year=2016&month=9&id=1474687634

---

#4.IOSのホームにhomebrigeが出なくなった

一度homebridgeで表示されるようになったのに、しばらくすると表示されなくなった。

→~/.homebridge/以下にある　accessories persist のフォルダの中身を全部消したら表示されるようになった。

---
VirtualBoxに仮想マシンを作成してSSH接続する

#目標
VirtualBoxに入れたCentOSにMacからssh接続する。

#はじめに
仮想化ソフトを使って開発環境をつくることくらいサクッとできなければなりません（自戒）。

#環境
- MacOS Sierra バージョン10.12.4

#必要なもの
- VirtualBox
- CentOS

#手順
##ゲストOSを入手する
[ここ](http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1611.iso)の任意のURLからOSのイメージファイルをダウンロードしてください。
今回はゲストOSとしてCentOS7(minimal)を選択しています。
##VirtualBoxのインストールと初期設定
[VirtualBox公式サイト](https://www.virtualbox.org/wiki/Downloads)から最新のVirtualBox（platform packages）をダウンロードします。インストール後ファイルを開くと画面が出るので、「Double click on this icon」をダブルクリックしてインストールを開始します。

#仮想マシンの初期設定
VirtualBoxを起動します。
水色の「新規」ボタンを押すと名前やディスクサイズの設定画面が開くので、ゲストOSの種類や開発環境の要件に合わせて設定を行います。私は以下のような設定にしました。

- 名前：CentOS7-minimal 
- タイプ：Linux
- バージョン：Red Had(64-bit)
- ファイルサイズ：4GB
- ハードディスクのファイルタイプ：VID
- 物理ハードディスクにあるストレージ：固定サイズ

「作成」ボタンを押して初期設定は完了です。

##ネットワーク設定①
###VirtualBoxの環境設定
VirtualBoxの環境設定 > ネットワーク > ホストオンリーネットワーク を選択します。 画面右に3つあるアイコンのうち、一番上の「追加」ボタンを押すと、新しいホストオンリーネットワークが追加されます。次に一番下の「編集」ボタンをクリックしてIPアドレスなどの設定画面を開きます。
ここでIPv4アドレスをメモしておきます。通常は192.168.56.XXXになっているようです。さらにDHCPアダプターのタブを開き、サーバーを無効化します。

###仮想マシンの設定
先ほど作成した仮想マシンの設定画面を開きます。
ネットワーク > アダプター1のタブを開き、「割り当て」を「ホストオンリーアダプター」に変更し、「名前」として上で追加したホストオンリーネットワークを選択します。

##ゲストOSインストール
仮想マシンを起動します。起動すると起動ハードディスク設定画面が出るので、最初にダウンロードしたCentOSのファイルを指定し、OSのインストールを開始します。rootのパスワード設定もここで行います。インストール後にrootユーザーでロングインできればOSのインストールは完了です。

##CentOSのネットワーク設定
MacとCentOSを接続するための設定を行います。
###NetworkManagerを開く
CentOSにrootでログインしている状態で次のコマンドを実行します。
`nmtui`

###アドレスを設定する
Edit a connection > enp0s3 を選択します。enp0s3というのが、VirtualBoxでいうところの「アダプター1」に該当します。 以下のように設定します。

- IP4v Configuration : Manual
    - Addresses : 上でメモしたIP4vアドレス（192.168.56.XXX/24）。XXXに任意のホストアドレス。
- IP6v Configuration : ignore
- [x]Automatically connect
- [x]Available to all users

###変更反映と確認
設定後、以下のコマンドでNetworkManagerの設定反映とネットワークの再起動を行います。
`service NetworkManager restart`
`service network restart`

`ip address show`でenp0s3のアドレスが設定通りに変更されていることを確認します。

###接続確認
Macのターミナルから`ssh root@設定したIP4vアドレス`でCentOSに接続できれば成功です。

#さいごに
仕事で開発環境の構築に手間取ってしまったため、備忘録として書きました。間違いなどあれば指摘してくれると嬉しいです。
PHPでワードプレスを投稿するときにエラー

### やろうとしたこと
- 自作の入力フォームからWordPress記事をPHPで投稿
- 投稿にはIXR_Library.php　を利用

### エラー内容
    +error: IXR_Error {#478 ▼
      +code: -32300
      +message: "transport error - could not open socket"
- **ローカルマシンでは投稿に成功。ただし、AWSではエラー**
- AWSでは上記のエラー

### 結論

#### xmlrpc.phpにアクセスできていなかった。
公開中のマシンからドメイン名でアクセスができていなかったことが原因らしい。
[ローカル・ループバック・アドレス](http://www.atmarkit.co.jp/ait/articles/0610/14/news021.html)でアクセスしたら解決

- ダメ　new IXR_Client("***サーバー名***/WPディレクトリ/xmlrpc.php");
- OK　　new IXR_Client("***127.0.0.1***/WPディレクトリ/xmlrpc.php");

### 調査

| No |   環境    |   投稿先       |  結果   |
|:---|----------:|:-------------:|:-------:|
|  1 | ローカル  | ローカルのWP    | OK     |
|  2 | ローカル  | AWSのWP        | OK     |
|  3 | AWS       | ローカルのWP   | アクセス不可  |
|  4 | AWS       | AWSのWP       | NG     |




### ーーーー以下、おまけーーーー
#### 環境
- Laravel 5.1.45 (LTS)
- PHP 7.1.2-3

#### ステージング環境（AWS）
- Laravel 5.1.35 (LTS)
- PHP 5.5.38 (cli)

#### ぐぐってみた
[【PHP】XML-RPCで「-32300:transport error - could not open socket」エラーが出る](http://sadakitchen.blogspot.jp/2012/03/phpxml-rpc-32300transport-error-could.html)
⇒php5.2.3以上かどうか or Basic認証をかけているとダメらしい

https://disqus.com/home/discussion/hurricanesoftwares/wordpress_xmlrpc_8211_posting_content_from_outside_wordpress/
⇒wordpressを更新 or php.iniの"memory_limit" を拡張



#### 自動投稿の参考サイト
- [XML-RPCでWordPressに自動投稿する](https://itlog.info/web/wordpress-xml-rpc-post)

- [IXR_Library.phpの入手元](https://github.com/lsmonki/php-ixr/blob/master/IXR_Library.php)

### つまづいたこと
- laravelで実装。インスタンス生成時に「物理ファイル名」＝「クラス名」でないとインスタンスが生成できず、困った。配布元のIXR_Libraryにクラス：IXR_Library　を作成して、コンストラクタで各クラスを呼び出して対応した
MacにMySQLをインストールする


とっても簡単だけど、メモということで。

##環境
|OS/モジュール|バージョン|
|:----|:---:|
|Mac OS X |10.12.4|
|MySQL|5.7.18|




##インストール手順
###1. brewを一旦アップデートする。
``` bash:brewのupdate
$ brew update
```

###2. MySQLのバージョンを確認する。
インストールされるMySQLのバージョンを先に調べたい場合は、以下のコマンドで。

``` bash:MySQLのバージョン確認
$ brew tap homebrew/versions
$ brew info mysql
```

###3. MySQLをインストールする。
``` bash:MySQLのインストール
$ brew install mysql
```

##インストール後の手順
###1. 先ずは起動
``` bash:MySQLの起動
$ mysql.server start
```

###2. 初期設定
rootパスワードや、テストDBを残すか否かなどを設定する。

``` bash:MySQLの初期設定
$ mysql_secure_installation
```

###3. mysqlを実行
``` bash:mysql実行
$ mysql -uroot -p
```

###4. 停止
``` bash:MySQLの停止
$ mysql.server stop
```
【Unity】PhotonNetwork.OnEventCallをAsObservableにする【PhotonRx】

[UniRx（github）](https://github.com/neuecc/UniRx)
[UniRx（アセットストア）](https://www.assetstore.unity3d.com/jp/#!/content/17276)
[PhotonRx](https://github.com/TORISOUP/PhotonRx)

# なさそうだったから書いた
[PhotonRx](https://github.com/TORISOUP/PhotonRx) 使い始めたけど [PhotonNetwork.OnEventCall](https://photonengine.jp/pun-api/class_photon_network.html#a81af9e901341d6b647df1f6d7f2d7583) をObservable<T>にする機能が見当たらなかったから自分で書いた。

```PhotonExtensions.cs
namespace UniRx
{
    public static class PhotonExtensions
    {
        public static IObservable<Tuple<byte, object, int>> AsObservable(this PhotonNetwork.EventCallback eventCallback)
        {
            return Observable.FromEvent<PhotonNetwork.EventCallback, Tuple<byte, object, int>>(
                h => (x, y, z) => h(Tuple.Create(x, y, z)),
                h => PhotonNetwork.OnEventCall += h,
                h => PhotonNetwork.OnEventCall -= h
            );
        }
    }
}
```

```csharp
// 使い方
PhotonNetwork.OnEventCall
    .AsObservable()
    .Subscribe(tuple =>
    {
        var eventCode = tuple.Item1;
        var content = tuple.Item2;
        var senderId = tuple.Item3;

        Debug.Log("OnEventCall");
    });
```

`PhotonNetwork.OnEventCall`になってる箇所は最初`eventCallback`って書いてたけどそれだとなぜかイベントが飛んでこなかった。なんでだ。

プルリクは…まぁ、そのうち。。

# 参考資料
* [【Unity】僕もPhotonを使いたい #10 RaiseEvent](http://www.urablog.xyz/entry/2016/09/22/220312)： Photon使う上でこのシリーズの記事が一番良かった
* [UniRxのObservable.FromEventを使う](http://qiita.com/ShirakawaYoshimaru/items/4071aad0937ecbdc7fe9)：毎回`FromEvent`の使い方忘れてこの記事見てしまう
debの取扱いクイックリファレンス

## aptからdebを落とす
```bash
$ apt-get download <package>
```

## debをcontrolなど含めて展開する
```bash
$ dpkg-deb -R <deb> <dst>
#   -R|--raw-extract <deb> <directory>
#                                   Extract control info and files.
```

## debをパッケージングする
詳細は https://www.debian.org/doc/manuals/maint-guide/build.ja.html

```bash
$ sudo apt-get install devscripts
$ cd <path_to_extracted_deb>
$ debuild -us -uc
```

## debに含まれるファイルを一覧表示
```bash
$ dpkg-deb --contents <deb>
```

## パッケージによってインストールされているファイルを一覧表示
```bash
$ dpkg-query -L <package>
```

## ファイルがどのパッケージによってインストールされているかを調べる
```
$ dpkg -S <path>
```

## ファイルがリポジトリ上のどのパッケージでインストールされるかを調べる
https://superuser.com/questions/179353/how-do-i-find-out-which-package-owns-a-file

```bash
$ sudo apt-get installl apt-file
$ sudo apt-file update
$ apt-file search <regex>
```

逐次追記予定