OmniAICreator/Qiita-1.07M huggingface dataset:
objdumpでARM-v7Mのバイナリを逆アセンブル

GNU の objdumpでCortex-M3やCortex-M4用のARM-v7Mのバイナリを逆アセンブルする方法を調べてみました。

ELFなオブジェクトは下記のコマンドで逆アセンブルできますが、生バイナリのやり方が分かりませんでした。

```
arm-eabi-none-objdump -D example.o
```

参考のページを見て、下記コマンドで逆アセンブルできました。

```
arm-none-eabi-objdump -D -b binary -m arm  -M force-thumb  example.bin
```

-b でファイルフォーマットを指定する。
-m でアーキテクチャを指定する
-M でアーキテクチャのオプションを指定する。

force-thumbだと、無理矢理なので上手くいかない部分もあるみたいですが、それなりに逆アセンブルしてくれています。

# 参考
* objdump doesn't seem to support armv7m architecture
 * https://answers.launchpad.net/gcc-arm-embedded/+question/242626
Inventory / unity > code v0.6 > Row:Next/Prev, Column:Next/Prev実装

```txt:動作環境
Unity 5.3.5-f1 on MaxOS X El Capitan
```

在庫表示システム。
関連: v0.1 http://qiita.com/7of9/items/076cf5aaff7095bb876d

### v0.6

以下の機能を実装した。

- Row: Prev/Nextボタン
- Column: Prev/Nextボタン

これで、shelf内を移動できるようになった。

[v0.6 @ github](https://github.com/yasokada/unity-160820-Inventory-UI/releases/tag/v0.6)

### 実行例

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/69579a4d-d0bd-61a4-633c-0b33834317aa.png)

Column Prev押下後

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/630a7f8b-c0b0-d8c4-2a1a-c129be9d49d5.png)

Row Next押下後

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/3c4ad044-6447-1883-5efd-28c86b55a757.png)

とりあえず希望通り動いた。

### TODO

- row: nextした時に次の番号がない時、終端までnextをする
- column: 同上
- 本棚番号(00010000: Rowとcolumnが0)での検索
- checkdate表示
- amount項目追加
- 項目内の","混入対応

現在までの作業時間: 4h + (20m * 5) + (10m * 3)
React + rollup.js + Babel (ES2015 + stage-2)

## モチベーション
- [webpack](https://webpack.github.io)の全部のせ感が肌に合わない
- [Browserify](http://browserify.org/)のシンプルさが好きで，特に文句もない
- [rollup.js][rollup]だと生成物が軽いと聞いた
    - [Rollupがちょうどいい感じ - Qiita][qiita-cognitom-rollup]
    - [browserify から rollup.js に乗り換えてる - やってる][yatteru-rollup]


## 設定
### 依存モジュール

```bash
$ npm install --save-dev \
    rollup \
    rollup-watch \
    rollup-plugin-node-resolve \
    rollup-plugin-commonjs \
    rollup-plugin-babel \
    rollup-plugin-env \
    babel-preset-es2015-rollup \
    babel-preset-stage-2 \
    babel-preset-react

$ npm install --save \
    react \
    react-dom
```

- rollup plugins
    - `rollup-plugin-node-resolve`
        - `node_modules`以下もモジュール検索対象になる
    - `rollup-plugin-commonjs`
        - CommonJSなモジュールも読めるようになる
    - `rollup-plugin-babel`
        - バベる
        - rollupが吐くのはES2015以降のナニかなのでバベる必要がある
    - `rollup-plugin-env`
        - 環境変数をいい感じに展開する（React.js対策）
- babel presets
    - `babel-preset-es2015-rollup`
        - [<q>This is babel-preset-es2015, minus modules-commonjs, plus external-helpers.</q>]ﾄﾉｺﾄ(https://github.com/rollup/babel-preset-es2015-rollup)

あとはいつもどおり

### `.babelrc`
特筆すべきことなし．

```json:.babelrc
{
  "presets": ["es2015-rollup", "stage-2", "react"]
}
```

### `rollup.config.js`
雑にconfig file．[JSのAPIでゴリゴリやる](http://qiita.com/cognitom/items/e3ac0da00241f427dad6#2-javascript-api%E7%B7%A8)のもアリ．

```js:rollup.config.js
import nodeResolve  from "rollup-plugin-node-resolve";
import env          from "rollup-plugin-env";
import commonjs     from "rollup-plugin-commonjs";
import babel        from "rollup-plugin-babel";

export default {
  entry:    "src/scripts/app.js",
  dest:     "dist/bundle.js",
  plugins:  [
    nodeResolve({ jsnext: true, main: true }),
    env({ NODE_ENV: process.env.NODE_ENV }),
    commonjs(),
    babel()
  ]
};
```

### 罠
- `rollup-plugin-env`でReactが内部に持ってる`process.env.NODE_ENV`を置換
    - `rollup-plugin-replace`つかってもOK
- `rollup-plugin-npm`はdeprecatedなので，`rollup-plugin-node-resolve`を利用
- Rollup.jsをBabel.jsのES2015 presetと併用する場合，`babel-preset-es2015`ではなく`babel-preset-es2015-rollup`を利用


## 所感
細かい感想はちゃんとしたなんか作ってからにしたい気もするが，とりあえずザッとしたやつ．

### よさそう
- とくに文句はない
- [gulp-rollup](https://github.com/mcasimir/gulp-rollup)を使ったときの`gulpfile`の感じはシンプルで好き
- watchすればビルドも遅くない
    - 大規模になったときにどうなるかは知らない
- ガワを使うだけの学習コストならbrowserifyとも大差ないし，置き換えコストも高くない気がする（どっち向きについても）

### きびしそう
- [licensify](https://github.com/twada/licensify)的なのが無くて厳しい
- スーパー大規模になったJSアプリの知見あまり持ってないので，そのへんに詳しい人の意見とか聞きたい:ear:


## References
- [rollup.js][rollup]
- [Rollupがちょうどいい感じ - Qiita][qiita-cognitom-rollup]
- [browserify から rollup.js に乗り換えてる - やってる][yatteru-rollup]

[rollup]: http://rollupjs.org/
[qiita-cognitom-rollup]: http://qiita.com/cognitom/items/e3ac0da00241f427dad6
[yatteru-rollup]: http://hadashia.hatenablog.com/entry/2016/08/08/131046
技術英語 > Remember that names [matter] more to the reader of the code than to the writer.

@ Code Complete (No. 9698 / 36077)

> Remember that names <font color=red>matter</font> more to the reader of the code than to the writer.

http://ejje.weblio.jp/content/matter
> 動詞 自動詞
[しばしば否定・疑問文で] 問題となる，重要である 《★【用法】 進行形・命令文にはならない》.

意訳「プログラムを書くときよりは読むときに「名前」が重要となる」。

<hr>
関連して思いだしたのは

Does size matter?
サイズは重要なのか?

https://andyschwartz.wordpress.com/2008/10/13/does-size-matter/

<hr>
他には

- It's a matter of time before ...
    - http://eow.alc.co.jp/search?q=a+matter+of+time
    - ～するのは時間の問題である、遅かれ早かれ～することになる
- a matter of life and death
    - 生死にかかわる問題
    - http://eow.alc.co.jp/search?q=a+matter+of+life+and+death
Travis CIからLambda Functionをシュッとデプロイする

## TL;DR
- やりかた
  1. IAMつくる
  2.  `.travis.yaml`の`deploy.provider`を`lambda`にする
  3. 設定を適当に書く
  4. pushする
  5. 便利
        - がんばってzipしてuploadして…みたいなのがないから便利
        - Lambdaだとcron的な定期処理も雑に扱えるし安いから便利
- さんぷる: [izumin5210/kusa-store][kusa-store]
    - GitHubのユーザページから草状況を拾ってS3に保存するやつ


## やりかた
### IAM Roleつくる
マジメにやらないといけないやつならCloudFormationとか使ってイイカンジにやる（「[AWS Lambdaのデプロイフロー管理 - Qiita][qiita-lambda-deploy-flow]」が参考になる）．
雑でいいならAWSのweb consoleから雑に作る．

最低限だとたぶん以下の5つが許可されてればOK．DynamoDBやS3等を利用する場合は適宜追加しておく．

- `lambda:createFunction`
- `lambda:updateFunctionCode`
- `lambda:updateFunctionConfiguration`
- `lambda:deleteFunction`
- `iam:PassRole`

### `.travis.yml`書く
`YOUR_AWS_*`を自分のやつに置き換えるだけ．

```yaml
language: node_js
node_js:
- "4.3.2"

deploy:
  provider: lambda
  function_name: YOUR_LAMBDA_FUNCTION_NAME
  region: ap-northeast-1
  module_name: index
  handler_name: handler
  runtime: nodejs4.3
  role: YOUR_AWS_ROLE
  access_key_id: YOUR_AWS_ACCESS_KEY_ID
  secret_access_key: YOUR_AWS_SECRET_ACCESS_KEY
```

#### 注意点
- **required**なのは以下3つ
    - `role`: IAM Role
    - `function_name`: lambda functionの名前
    - `handler_name`: exportしてるhandler functionの名前
      - Travis CIのドキュメント見て`index.handler`とか書いちゃうと`index.index.handler`とかにされてつらくなる
      - https://github.com/travis-ci/dpl/blob/v1.8.18/lib/dpl/provider/lambda.rb#L47-L52
- `access_key_id`や`secret_access_key`も実質required
    - ベタ書きするのは流石にまずいので，[Travis CLIのencryption][travis-encryption]を利用して暗号化しておく
    - （roleって暗号化したほうがいいのかな？）
- `region`: [デフォルトは`us-east-1`](https://github.com/travis-ci/dpl/blob/v1.8.18/lib/dpl/provider/lambda.rb#L17)
- `module_name`: エントリポイントになる`.js`ファイルの名前？
    - [デフォルトは`index`](https://github.com/travis-ci/dpl/blob/v1.8.18/lib/dpl/provider/lambda.rb#L130-L132)
- `runtime`: [デフォルト`nodejs`](https://github.com/travis-ci/dpl/blob/v1.8.18/lib/dpl/provider/lambda.rb#L110-L112)だが，これは0.10.12になる
    - Node.jsで書きたいなら`nodejs4.3`にすべき
    - Travis CIのNode.js（`node_js`）もあわせて`4.3.2`にしとくとlintやtestが捗る

### trigger設定する
雑でいいならweb consoleから適当に．`CloudWatch Events - Schedule`とか使えばcronっぽいアレもシュッと作れちゃう．


## References
- [izumin5210/kusa-store][kusa-store]
- [AWS Lambdaのデプロイフロー管理 - Qiita][qiita-lambda-deploy-flow]
- [Lambda Deployment - Travis CI][travis-deploy-lambda]
- [Encryption keys - Travis CI][travis-encryption]
- [travis-ci/dpl#lambda][dpl-lambda]

[kusa-store]: https://github.com/izumin5210/kusa-store
[qiita-lambda-deploy-flow]: http://qiita.com/kinzal/items/046a848a9f0829f87670
[travis-deploy-lambda]: https://docs.travis-ci.com/user/deployment/lambda
[travis-encryption]: https://docs.travis-ci.com/user/encryption-keys/
[dpl-lambda]: https://github.com/travis-ci/dpl#lambda
ページ内に複数の GoogleMap を表示するサンプル


```html
<!DOCTYPE HTML>
<html lang="ja-JP">
    <head>
        <title></title>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
        <style type="text/css">
            .maps{
                height: 400px;
                border: 1px solid #ccc;
            }
        </style>
    </head>
    <body>

        <div class="container">
            <div class="row">
                <div class="col-md-6 maps" data-lat="35.348504" data-lng="136.164551">
                </div>
                <div class="col-md-6 maps" data-lat="38.097546" data-lng="140.180298">
                </div>
            </div>
        </div>

        <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true&v=3.9"></script>
        <script src="//code.jquery.com/jquery.min.js"></script>
        <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
        <script type="text/javascript">
            $(function () {
                var maps = $('.maps');
                maps.each(function (i, map) {
                    var lat = $(this).attr('data-lat');
                    var lng = $(this).attr('data-lng');
                    new google.maps.Map(map, {
                        center: new google.maps.LatLng(lat, lng),
                        mapTypeId: google.maps.MapTypeId.ROADMAP,
                        zoom: 10
                    });
                });
            });
        </script>
    </body>
</html>
```
React.jsでグラフを描いてみたかったのでrechartsを試してみた

どうもこんにちは、ヒロです！
今回は~~たまたまgithubトレンドを眺めていたら面白そうなライブラリがあったので~~React.jsでグラフを描いてみたいなと思っていたところ偶然良さそうなライブラリを見つけたので試してみました！

recharts
http://recharts.org/
github
https://github.com/recharts/recharts

React + D3でグラフを描画する為のライブラリです。API documentを参考にして実装するとササっと実装出来そうな気がしたので、documetのexample codeを模写しつつ、サンプルを作ってみました。

今回作った物はこちら
サンプルページ
https://react-recharts-sandbox.firebaseapp.com/
github
https://github.com/takahiro-saeki/react-recharts-sandbox

サンプルイメージ1
![exam1.png](https://qiita-image-store.s3.amazonaws.com/0/79274/5ca423b7-1f64-e770-17c7-f2ddcee2851d.png)

サンプルイメージ2
![exam2.png](https://qiita-image-store.s3.amazonaws.com/0/79274/cf918536-96ee-5b2f-03cf-a23d94f14d82.png)

##試してみた感想
今までデータビジュアライゼーションに関心はあった物の、中々縁がなく触ることがなかったのですが、昨今注目されているビックデータだったり、こちらのキータの記事にあるような-[日本の行政機関が公開中のAPIについてのまとめ（2016年8月17日暫定版）](http://qiita.com/kimuraya/items/3cc6c84bf6eac30851f1)- 行政機関のデータを使って何かを作ろうと考えると、視覚的に表現出来た方がUX的にも良いと思います。 その為にもD3.jsだったり、データビジュアライゼーションに特化したライブラリを知っておく、扱えるようにしておくのは得策だと思います。

僕は普段React.jsを好んで使っているので、rechartsのようなライブラリがあると非常に助かります。実際、実装(模写)してみて、何かの機会に使ってみたいな改めて思いました。

もし触ってみたいなと、試してみたいなと思う方がいればこちらのexampleのcodeを見ておくと良いと思います。
http://recharts.org/examples

簡単な内容ですが、以上です！
AnsibleでMySQLインストール・ユーザ作成・データベース作成


- Ubuntu 16.04 server LTS
- MySQLサーバインストール
- ユーザ作成
- データベース作成
- LAN(192.168.10.%)からのリモート接続を許可

```:mysql.yml
- hosts: all
  user: hoge
  become: yes
  vars:
    mysql_user: test_user
    mysql_password: test_password
    mysql_database: test_database
  tasks:
    - name: install MySQL packages
      apt: name={{ item }} state=installed
      with_items:
        - mysql-server
        - mysql-client
        - libmysqld-dev
        - libmysqlclient-dev
        - python-mysqldb
    - name: create mysql database
      mysql_db: name={{ mysql_database }} state=present
    - name: create mysql user
      mysql_user: name={{ mysql_user }} host={{ item }} password={{ mysql_password }} priv={{ mysql_database }}.*:ALL,GRANT state=present
      with_items:
        - localhost
        - 192.168.10.%
    - name: uncomment a line bind-address = 127.0.0.1
      replace: >
        dest=/etc/mysql/mysql.conf.d/mysqld.cnf
        regexp='^bind-address'
        replace='#bind-address'
    - name: start mysql
      service: name=mysql state=restarted enabled=yes

```

## 実行

リモートホスト"mysql-server"に対してPlaybookを実行する。Playbookを hosts: allにして、-iオプションで","をつけるとInventoryファイル無しで実行できる。

```
$ ansible-playbook -i "mysql-server," mysql.yml 
```

## 確認

"mysql-server"にリモート接続できることを確認。

```
$ mysql -h mysql-server -u test_user -p
Enter password:***** <test_passwordを入力>

mysql>use test_database;
Database changed

mysql>quit;
Bye
$

```
Amazon Linux apache2.2にPHP5.6入れようとしてphp-gdが入らなかったのでメモ

なんかうまくいかなかったのでメモ。
要求　libt1.so.5()
要求　libwebp.so.5()
などなど言われてgd-lastがyum installできなかった。
下記でおそらく上手くいった。

# remiの導入

```
sudo rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```

# インストール
```
yum clean all

yum update -y

yum install httpd

yum install --disablerepo=amzn-main  --enablerepo=epel libwebp

yum install libmcrypt libtool-ltdl libtidy libXpm libtiff gd-last autoconf automake

yum install --enablerepo=remi,remi-php56 t1lib

yum install --disablerepo=amzn-main --enablerepo=remi-php56 php php-opcache php-devel php-mbstring php-mcrypt php-phpseclib-crypt-blowfish php-pecl-apc php-gd php-mysqlnd php-xml
```

# 参考サイト
http://nob-log.info/2014/08/25/centos6-yum-install-php56/
http://qiita.com/Ikumi/items/8f76d074134b7080d102
http://iamapen.hatenablog.com/entry/2015/04/14/233123
lvmではないLinuxのdumpバックアップおよびリストアに使うコマンドメモ


##　バックアップ＆リストア
今日作業でLinuxサーバのバックアップとリストアを実施したので
後日のためにメモを残す。

バックアップに使用したコマンド
sfdisk -d /dev/sda(デバイス名）
xfsdump -l 0 <バックアップファイル名> -r <対象ファイルシステム>
dd if=<バックアップ元デバイス>　of=<バックアップ先ファイル>

## レスキューブート
今回バックアップリストアを行ったのはpower systemだったため、
SMSを起動し、インストールメディアからレスキューブートを実施。

…レスキューブートとは、バックアップ・リストア用に最低限の環境をメモリ上に
ブートさせて作業するモードである。
RHELのマニュアルページをリンクしておきます。
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/ap-rescuemode.html

### リストアに使用したコマンド
mkfs.xfs
xfsretore
vi /etc/fstab
dd

### GRUB2の再作成
デバイス自体を再作成したら、最後にブートローダを再作成します。
power systemではprepboot領域と言います。

grub-mkconfig -o <ブートローダ作成先>　#boot領域があった
パスを指定する。

これ以降は後でまたまとめます。
ドットインストール　PHP学習　ビンゴゲーム　学び

どっとインストールで学んだこと　メモ

・PHP 学習時のビンゴゲームを学ぶ
学習時、気づいた点、コメントを記載。
コメントを記載することで、ソースの中身を理解するのが目的

<H1>以下、ビンゴゲーム内容</H1>

<?php

/*
ビンゴゲーム
phpのため、動作させるには、クラウド9等上で動作させないと動かせない。

  $nums[][]
  B: $nums[0] 1-15
  I: $nums[1] 16-30
  N: $nums[2] 31-45 、真ん中は無し
  G: $nums[3] 46-60
  O: $nums[4] 61-75

  上記のnumsと数字の関係は、以下の関係にある。これをシステムで表現できれば良い。
  $nums[$i] $ix15 +1 〜　$ix15 +15
  ※仕組みを考えることで、自動生成が出来る

*/

$nums = [];
   //numsの初期化

for ($i = 0; $i < 5; $i++){
    /*for文で、ランダムな１５個数字を作って、
    上から５つ取り出す形を作る*/
  $col = range($i *15 +1, $i *15 +15);
    //range関数で数字を取り出す
  shuffle($col);
    //取り出した数字をシャップル
  $nums[$i] = array_slice($col, 0, 5);
    /*
    nums iを取り出すのに、array_sliceを使って上位１つを取り出す
    array_slice( 配列, 削除を開始する位置 )
    配列＄colの0個目から5つ目までを取り出すの意味
    */
}

$nums[2][2] = "FREE";
//ビンゴの真ん中をfreeにする

// var_dump($nums);
// exit;

function h($s) {
  return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
 // phpを動作させる際には、必ず初期化が必要、ルール
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>BINGO!</title>
  <link rel="stylesheet" href="styles.css">
  <!-- スタイルシート呼び出し -->
</head>
<body>
  <div id="container">
    <table>
      <tr>
        <th>B</th><th>I</th><th>N</th><th>G</th><th>O</th>
      </tr>
      <?php for ($i = 0; $i < 5; $i++) : ?>
      <tr>
        <?php for ($j = 0; $j < 5; $j++) : ?>
        <td><?= h($nums[$j][$i]); ?></td>
        <?php endfor; ?>
      </tr>
      <?php endfor; ?>
    </table>
  </div>
</body>
</html>


<H1>CSSファイル</H1>

body {
  font-family: Arial, sans-serif;
  text-align: center;
  font-size: 16px;
}

#container {
  margin: 0 auto;
  width: 322px;
}

td, th {
  width: 60px;
  height: 45px;
}

td {
  background: #F06292;
  color: #fff;
}

th {
  color: #F06292;
  font-size: 22px;
}
Firebase Notificationは開発者ではなくマーケターが使うもの

ほぼ自分用のメモ。

すでに多くの記事が書いているが、Firebase Notificationは、基本的に開発者が使うものではない。

Firebaseコンソール(https://console.firebase.google.com/project/プロジェクト名/notification) からポチポチやるのがFirebase Notificationと思っていたけど、そうではなくて、

こういうのもFirebase Notification

```
{
   "to": "APA9・・・WhfB",
   "priority": "high",
   "sound": "default",
   "time_to_live": 3600,
   "collapse_key": "new_message",
   "notification": {
      "title": "test4",
      "body": "0:37です！",
      "icon": "ic_notification"
   },
   "data": {
      "url": "https://crowdworks.jp/xx/yy/5"
   }
}
```


Notificationじゃないのはどんなの？っていうと、そもそも以下のように `notification` キーがないもの。

```
{
   "to": "APA9・・・WhfB",
   "priority": "high",
   "sound": "default",
   "time_to_live": 3600,
   "collapse_key": "new_message",
   "data": {
      "url": "https://crowdworks.jp/xx/yy/5"
   }
}
```

## Firebase Notificationが「マーケターがつかうもの」な理由

* アプリがちゃんと実装をしないかぎり「バックグラウンドでしかプッシュ通知を受信・表示しない」ということ
* Firebase Notificationがバックグラウンドで出した通知を、アプリがフォアグラウンドで上書きしたりキャンセルしたりできないこと

とくに後者が決定的。
Androidは「通知をまとめる」のが推奨されているのだから、複数プッシュしてまとめられないような通知はおそらく開発者が使うべきではない。

|                                             |      Notification     |  Messaging |
|---------------------------------------------|:---------------------:|:----------:|
| プッシュを受ける主体                        | Google Playサービス？ |   アプリ   |
| プッシュを受けたら 通知パネルに通知が出る？ |      無条件に出る     |   出ない   |
| **通知をまとめる**                              |      **できない**     | アプリ次第 |
| BigText/BigPictureスタイル のプッシュ通知   |        できない       | アプリ次第 |
| collapse_key                                |           ○           |      ○     |


## まとめ

* 新着メッセージ通知など、機能を実装するのはFirebase Cloud Messagingをつかおう
* 機能実装に関係のないプッシュを送りつけるには、Firebase Notificationを使って、アプリをまさに使ってくれてるユーザの邪魔をしないようにしよう
NetCommons3 (Github版)導入〜インストールまでの手順

# はじめに
NetCommons3とは、国立情報学研究所の開発するCMS（コンテンツマネジメントシステム）です。

NetCommons3は2016/8末に公開が予定されているため、現在(2016/8/26)のところ、zipやtar+gz形式での提供はありません。ただし、Github (https://github.com/NetCommons3/NetCommons3) に公開されているもの（以下Github版）をcloneして試すことは可能です。

以下は、Github版によるNetCommons3の導入〜インストールまでの手順になります。

# 動作環境

動作環境として、CentOS7を想定しています。
また、以下に示す手順は、CentOS7の環境へ導入する場合の手順になります。

ただし、CentOS7以外でも同様の環境（構成）を用意することができれば、動作可能なはずです。（PHP5.4以上、MySQL5.5/MariaDB5.5以上で動作します）

なお、CentOS6はSCLあるいはRemi等のサードパーティリポジトリが必要になります。（標準リポジトリではPHPのバージョン等、動作要件を満たさないため動作させることはできません）

※上記はあくまでも私の手元環境での検証結果であり、オフィシャルで保証されている動作環境ではありません。正式な動作環境については、今後公表されると思われるオフィシャルの動作環境を参照してください。

# インストール方法

以下のコマンドおよび設定を順番に進めてください。

## RPMパッケージのインストール

```shell-session
# yum install -y tar wget php php-cli php-devel php-mysql php-mbstring epel-release php-gd httpd mariadb mariadb-server
# yum install php-mcrypt php-xml nodejs npm git
# npm install -g bower 
```

## Composerのインストール

```
# wget https://getcomposer.org/installer
# php ./installer
# mv composer.phar /usr/local/bin
# cd /usr/local/bin
# ln -s composer.phar composer
```

## NetCommons3リポジトリを/var/www以下にcloneする

- /var/www以外でも結構ですが、その際は以後の説明を変更後のディレクトリに読み替えて対応ください。
- 以下はrootで進めていますが、rootでなくてもかまいません。

```shell-session
# cd /var/www
# git clone https://github.com/NetCommons3/NetCommons3
```

## composer updateを行う

- 以下はrootで進めていますが、rootでなくてもかまいません。

```shell-session
# cd /var/www/NetCommons3
# composer update
```

## NetCommons3ディレクトリ以下への空ファイル追加、パーミッション設定を行う

- 以下はrootで進めていますが、rootでなくてもかまいません。

```shell-session
# cd /var/www/NetCommons3
# touch app/Config/database.php
# touch app/Config/application.yml
# chmod -R 666 app/Config/database.php
# chmod -R 666 app/Config/application.yml
# chmod -R 777 app/webroot/files
# chmod -R 777 app/tmp
```

## Apacheの設定

※以下は最低限の設定になりますので、必要に応じて適宜変更してください。

```apache:/etc/httpd/conf/httpd.conf
# DocumentRootを以下の通り書き換える
DocumentRoot "/var/www/NetCommons3/app/webroot"

# 以下の記述を追加する
<Directory "/var/www/NetCommons3/app/webroot">
    AllowOverride All
    Options FollowSymLinks
    Require all granted
</Directory>
```

## PHPの設定

- 以下は最低限の設定になりますので、必要に応じて適宜変更してください。

```ini:/etc/php.ini
; date.timezoneを以下の通り変更する
date.timezone = Asia/Tokyo
```

## MariaDBのパスワード設定

- rootのパスワードは適切なものに変更してください。
- ここでは検証環境を想定しrootユーザーで進める（新たなユーザーを作成しない）ことを想定していますが、運用環境でお使いの場合は、ユーザーを追加する等、状況に応じた対応を行ってください。

```shell-session
mysqladmin -u root password root
```

## サービスの起動

```
# systemctl enable httpd 
# systemctl start httpd
# systemctl enable mariadb
# systemctl start mariadb
```

## Webブラウザでインストール環境へアクセス

インストール環境に対してWebブラウザへアクセスし、以下の画面が表示されればNetCommons3がインストール可能な状態となります。画面の指示に従い、操作を進めることで、NetCommons3が利用できるようになります。

![スクリーンショット 2016-08-26 01.15.58.png](https://qiita-image-store.s3.amazonaws.com/0/64876/e38aee95-16f6-82f3-9a09-046b1f5294f0.png)
RaspberryPiをSORACOMでつなぐまでに意外と悩む(かもしれない)、MicroSDカード挿す場所とOSインストールとUSBドングル利用設定

## よくわかってないことたくさんあったけどやってみた
ネットワークのスキルもなければ電子工作もしたことありません。
なので当然ラズパイもSORACOMも初めて触れました。
ラズパイを動かすLinuxも、多少触ったことある程度です。

わからないところにぶつかっては調べて大丈夫そうなこと確認して、そしてまた分からないところにぶつかって、というふうに恐る恐る進めてました。
AWS経由の接続確認まではできたので、解決するのに時間がかかった3点について書き留めておきます。

1. MicroSDカード挿す場所
2. OSインストール
3. USBドングル利用設定


## RaspberryPiの準備とSORACOMの接続
### 使ったラズパイとSORACOM

* ラズパイ ： Raspberry Pi 3 Model B
* SORACOM Air SIM モジュールタイプ ： ナノ

SORACOMのキャンペーン期間中に販売していた、植物観察キットで手に入れました。
https://pages.soracom.jp/20160713.html

### 手順
ハンズオン資料がGitHubで見られます。
https://github.com/soracom/handson/blob/master/setup/setup.md

大まかな流れは以下のとおりです。

1. SORACOM Airの利用登録
2. RasberryPiのセットアップ
3. SORACOM Airを使った通信設定と通信確認

ハンズオン資料を見てもらえれば、大きな問題なく進められると思うので、
ここでは詳細について触れません。

では、悩んだ3点について。

### RasberryPiのMicroSDカード挿すところはどこだ
OSのインストールのためにMicroSDカードにデータ（イメージファイル）を保存し、ラズパイに挿す必要がある。
でも日常的にMicroSD抜き挿しする機会ないし、ラズパイ実物見るのも初めてで、どこにどうやってMicroSD挿せば良いのかなかなか発見できなかった。

で、挿すところ、裏側にありましたよ。（MicroSDカードの右側にある灰色の部分）

![写真 2016-08-18 15 30 52.jpg](https://qiita-image-store.s3.amazonaws.com/0/43489/d62ab71e-31fc-195d-27a6-53e14f1236a3.jpeg)

表側のどっかにMicroSD挿す用のアダプタとか繋ぐ必要あるのか、とか無駄に色々調べるハメに。

### OS(Raspbian)のインストール
ハンズオンではRaspberryPi用のモニターとキーボード、マウスの準備が不要なように、CUIベースのRaspbianというOSをインストールします。

RaspberryPiは起動スイッチがなく、電源をつなぐとそのまま起動します。
ここで、「あれ？まだOSインストールされてない状態で電源繋いでも、起動できないのでは？」という疑問が出てくる。


悩む必要はなく、OSのイメージファイルの入ったMicroSDカードをRaspberryPiに挿したら、そのまま電源に繋いでOKです。

自動でOSのインストールが始まり、別のPCから操作できるようになります。
（もちろん、接続可能なネットワークに繋がっている必要があります）


GUIベースでOSをインストールしているブログは結構ありましたが、CUIのものは見つけにくかった。。。

### USBドングルの利用設定
あと多分ちゃんと処理結果のメッセージ読めばわかったんだろうけど、ちょっとだけ悩んだのが、USBドングルの利用設定のための接続スクリプト実行。

接続用スクリプトを実行しても、ハンズオン資料と同じメッセージが出なかった。
rebootか〇〇しろ（覚えてない）的なメッセージ出てきたと思うが、ラズパイをrebootしただけだとAWSに接続できなくて、reboot後にもう一回スクリプト実行したら、ハンズオンと同じようなメッセージが出て、ちゃんとAWSに接続できた。

##　AWSに接続できた我が家のラズパイ
無事にSORACOM Airを使って、AWSに接続できるようになった、我が家のラズパイです。
畳の上の空き箱に配置しました。（上に置いただけ）

![写真 2016-08-18 23 31 02.jpg](https://qiita-image-store.s3.amazonaws.com/0/43489/c80003c6-c1ed-fbf2-65aa-8b95d74bbb85.jpeg)

これでようやく植物観察のハンズオンに進める！！
Geth: "Error: Insufficient funds for gas * price + value"

以下に移行しました<br><a href="http://block-chain.jp/tech/geth-error-insufficient-funds-for-gas-price-value/" title="Geth: &quot;Error: Insufficient funds for gas * price + value&quot;">Geth: &quot;Error: Insufficient funds for gas * price + value&quot;</a>
JavaScriptにおけるFunctionについて

# はじめに
はじめまして
去年まで専門学校に通っていたゆとりの新社会人、ポンコツエンジニアです。
まだまだ、駆け出しなので間違った事を書いている可能性があります。

何かお気付きの点などがございましたら、ご指導のほどよろしくお願いします。
また、この記事は「備忘録」といったスタンスで学習した内容を記録に残そうという意図を持って書いているので、**参考にしたい方はちゃんと理解している人のサイト**を見た方が時間的にも無駄がなく効率的かと思います。

それでは、本題に入ります。

## `Function`とは

`Function`とは、関数のオブジェクトです。
つまり、何かの一連の処理を記述しているオブジェクトということになります
`Java`でいう所のクラスなども`Function`オブジェクトで疑似的に表現します。
(`ES6`ではちゃんと`class`があるらしいですが、まだ学習していません)

グローバルな`Function`の書き方としてはこんな感じになります。

```js:Function1.js
function funcAlert(){ // <- 関数名

    alert("Hello World");// <- 処理内容
}
funcAlert();// <- 関数呼び出し元
```

## リファレンスを参考にしようとしたら。。。

説明の箇所に下記の記述がありました

>Function コンストラクタで生成された Function オブジェクトは、関数が作成されたときにパースされます。これは、関数を宣言し、それをコード内で呼び出すよりも効果的ではありません。なぜなら、function 文で宣言された関数はコードの他の部分と一緒にパースされるからです。
関数に渡された実引数の全ては、それらが渡された順番に、生成された関数内における仮引数の識別子の名前と同等に扱われます。

[JavaScript|MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function)より引用

ん？？
説明の意味が全くわからん。。。
やっぱこういう所の説明は正直わかりずらいですね。。。
しかも、曖昧でしか覚えていない言葉が出てきたのでそこも整理していきたいと思います

## まずは、知ったかぶりのコンストラクタから

今までコンストラクタってワードを聞いた時なんとなく知ったかぶりして
「あぁ～！コンストラクタね。うんうん。なるほどね。。。」って感じで受け流してました(笑)
今まで黙っててごめんなさいｗ

(だから、これを機会にちゃんと覚えるよ！)

コンストラクタって要するに
1. オブジェクトの生成する
2. 生成したオブジェクトを初期化する
上記２点を行ってくれる関数のことを**コンストラクタ**と呼びます


```js:function2.js
var func = function()
{                                   // <-'生成するオブジェクトの初期化内容'
    var val;
    this.setVal = function(val){  
        this.val = val;
    }
    this.getVal = function(){
        return this.val;
    }
}
var target = new func;//　<- 'targetオブジェクトをfuncオブジェクトで生成'

target.setVal('Str');
console.log(target.getVal());

```
コードで表現した方がわかり易いかも知れないのでゲッター・セッターを書いてみました

ちなみに`this`は[前回](http://qiita.com/xeting/items/3c70f6bcc1060641cdee)学習したワードです。

さらっと`new`と言うキーワードをスルーしてますが、
`new`とは、一言で表すなら「***～を新しく生成してね***」って意味です。
まぁ細かい所では、それだけじゃないんですが今回は割愛します。
今度、細かいところも学習してまとめてみます。

さて、話を戻しますがつまり
`var A = new B;`であれば、「`B`（コントラクタ）を利用して`A`を新しく生成してね」っ意味になります。
なんとなく、わかったかと思います


そして、初期化の際に**プロトタイプオブジェクト**と言うものが暗黙的に生成されてます。
実はこのプロトタイプオブジェクトがある事によって、
コンストラクタから生成されたオブジェクトはコンストラクタと**同じ関数**や**プロパティ**を持つことができるんですね！

ちなみに’パース’も意味がわからなくて調べたんですが、しっくりきませんでした。
唯一これかな？って感じたものは「**構文解析**」ですかね

# 最後に

いやー
今まで普通にコンストラクタを使っていたのに単語と処理内容が結びついてなくて混乱したｗ
処理内容と単語の結びつきも今後学習していく上で必要なスキルになるんですね。。。
そんな事を感じた記事になりました。


次回は`AngularJS`,`プロトタイプオブジェクト`,`new`のどれかを学習したいと思います。
sql

delete from intermediate.users where intermediate.users.email not in ( SELECT  email FROM ultrax.common_member where emailstatus = 0 and avatarstatus = 0 and email NOT LIKE '%163%' and email NOT LIKE '%qq%' and  email NOT LIKE '%126%' and email NOT LIKE '%gmail%' and email not like '%sina%' and email not like '%sohu%' and email not like '%21cn%');






select *  from intermediate.users where intermediate.users.email  in ( SELECT  email FROM ultrax.common_member where emailstatus = 0 and avatarstatus = 0 and email NOT LIKE '%163%' and email NOT LIKE '%qq%' and  email NOT LIKE '%126%' and email not like '%sina%' and email not like '%sohu%' and email not like '%21cn%' and email not like '%zzjp%' and email not like '%szql26%'); 




delete  from intermediate.users where intermediate.users.email  in ( SELECT  email FROM ultrax.common_member where emailstatus = 0 and avatarstatus = 0 and email NOT LIKE '%163%' and email NOT LIKE '%qq%' and  email NOT LIKE '%126%' and email not like '%sina%' and email not like '%sohu%' and email not like '%21cn%' and email not like '%zzjp%' and email not like '%szql26%');
「モンティ・ホール問題」の簡単なシミュレーションプログラムを書いてみる

[モンティ・ホール問題](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%BB%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C)は「主観的な答えと確率論にのっとった答えが一致しない」という不思議な問題です。今回はこの「モンティ・ホール問題」の簡単なシミュレーションプログラムを書いてみました。経験主義万歳! 

```py3

import random

def monty_hall():
    # 0,1,2の扉からランダムに正解が選ばれる
    answer = random.randrange(3)

    # 解答者は0,1,2から好きな扉を選ぶ
    first_choice = random.randrange(3)

    # 司会者であるモンティははずれの扉をひとつ開く
    monty_choice = random.choice(tuple({0, 1, 2} - {answer, first_choice}))
    
    # 解答者は2回目の選択として、最初に選んだ扉とは違う扉を選択する
    second_choice = ({0, 1, 2} - {first_choice, monty_choice}).pop()
    
    # 2回目に選んだ扉は正解なのか?
    return answer == second_choice

if __name__ == '__main__':
    for x in (10, 100, 1000, 100000):
        # x回の試行中、monty_hall()がTrueを返した回数を記録する。
        win = sum(1 for _ in range(x) if monty_hall())
        print("試行回数{0}回のときの確率 : {1}".format(x, win / x))

# 試行回数10回のときの確率 : 0.7
# 試行回数100回のときの確率 : 0.58
# 試行回数1000回のときの確率 : 0.673
# 試行回数100000回のときの確率 : 0.66657
```
「モンティ・ホール問題」最大の論点は「司会者がはずれの扉を見せた後、挑戦者は最初の選択を変えるべきか」というところにありますが、「変えたほうが正解である確率が高い」ということが確かめられました。

ちなみに上記のコードはわかりやすいよう、やや冗長な書き方をしていますが、次のようにリファクタリングすることもできます。

```py3
def refactoring_month_hall():
    # 0,1,2の扉からランダムに正解が選ばれる
    answer = random.randrange(3)

    # 解答者は0,1,2の扉から好きなものを選ぶ
    first_choice = random.randrange(3)

    # 最初に選んだ扉が正解ではない => もう一つの扉が正解
    return answer != first_choice

if __name__ == '__main__':
    for x in (10, 100, 1000, 10000, 100000):
        win = sum(1 for _ in range(x) if refactoring_month_hall())
        print("試行回数{0}回のときの確率 : {1}".format(x, win / x))

# 試行回数10回のときの確率 : 0.8
# 試行回数100回のときの確率 : 0.65
# 試行回数1000回のときの確率 : 0.678
# 試行回数10000回のときの確率 : 0.6676
# 試行回数100000回のときの確率 : 0.66585

```

こちらでも「最初の選択ではない扉をえらぶほうがよい」ということがはっきりわかります。不思議ですね(´・ω・`)
【Oracle 12Cのお勉強】varchar2の最大サイズを4000バイト→32767バイトに拡張


## 内容
12cより、以下の作業を行うことで、varchar2の最大サイズを4000バイトから32767バイトに拡張できる。
**※一度拡張すると、元に戻せないので注意。**

- 初期化パラメータmax_string_sizeをEXTENDに設定。
- utl32k.sqlを実行。

## 検証

▼初期化パラメータ"max_string_size"の確認

``` sql
SQL> show parameter max_string_size;
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
max_string_size                      string      STANDARD
```

▼4000バイト以上のサイズを指定して、テーブルを作成してみる

``` sql
SQL> create table ts (v varchar2(4001));
create table ts (v varchar2(4001))
                            *
行1でエラーが発生しました。:
ORA-00910: 指定した長さがデータ型に対して長すぎます
```

▼初期化パラメータmax_string_sizeの値をextendedに変更

``` sql
SQL> shutdown immediate
プラガブル・データベースがクローズされました。

SQL> startup upgrade
プラガブル・データベースがオープンされました。

SQL> select status from v$instance;
STATUS
------------
OPEN MIGRATE

SQL> alter system set max_string_size=extended;
システムが変更されました。
```

▼utl32k.sqlスクリプトの実行

``` sql
SQL> @?/rdbms/admin/utl32k.sql

セッションが変更されました。

DOC>#######################################################################
DOC>#######################################################################
DOC>   The following statement will cause an "ORA-01722: invalid number"
DOC>   error if the database has not been opened for UPGRADE.
DOC>
DOC>   Perform a "SHUTDOWN ABORT"  and
DOC>   restart using UPGRADE.
DOC>#######################################################################
DOC>#######################################################################
DOC>#

レコードが選択されませんでした。

DOC>#######################################################################
DOC>#######################################################################
DOC>   The following statement will cause an "ORA-01722: invalid number"
DOC>   error if the database does not have compatible >= 12.0.0
DOC>
DOC>   Set compatible >= 12.0.0 and retry.
DOC>#######################################################################
DOC>#######################################################################
DOC>#

PL/SQLプロシージャが正常に完了しました。


セッションが変更されました。


1行が更新されました。



…（省略）…



パッケージが変更されました。


パッケージが変更されました。

```

▼再起動

``` sql
SQL> shutdown immediate
プラガブル・データベースがクローズされました。
SQL> startup
プラガブル・データベースがオープンされました。
```

▼再度、4000バイト以上のサイズを指定して、テーブルを作成してみる

``` sql
SQL> create table ts (v varchar2(4001));
表が作成されました。
```

拡張できた。
初めてGitHubリポジトリにpushしたらrejectedエラーになったときの対応メモ

## はじめに
GitHub初心者の僕が、初めてGitHubリポジトリにpushしたら、rejectedエラーになったので、ちゃんとpushできるようになるまでの対応をメモしました。

## Gitバージョン
    % git --version
    git version 2.9.2

## 作業の流れ
##### GitHubからリポジトリを作成
「Initialize this repository with a README」にチェック

##### ローカルリポジトリに追加

    % git add -A

##### ロカールリポジトリにコミット

    % git commit -m "xxxxx"

##### リモートリポジトリ（GitHub）の情報を追加

    % git remote add origin https://github.com/xxxx/xxxxx.git

##### ローカルリポジトリをリモートリポジトリへ反映させる → <font color="red">rejectedエラー</font>

    % git push origin master
    To https://github.com/xxxx/xxxxx.git
     ! [rejected]        master -> master (fetch first)
    error: failed to push some refs to 'https://github.com/xxxx/xxxxx.git'
    hint: Updates were rejected because the remote contains work that you do
    hint: not have locally. This is usually caused by another repository pushing
    hint: to the same ref. You may want to first integrate the remote changes
    hint: (e.g., 'git pull ...') before pushing again.
    hint: See the 'Note about fast-forwards' in 'git push --help' for details.

##### ググってみたら「git fetch && git merge origin/master」してからpushすればOKと書いてあったので試してみる → <font color="red">mergeエラー</font>

    % git fetch && git merge origin/master
    fatal: refusing to merge unrelated histories

##### さらにググってみたらmergeのオプションに「--allow-unrelated-histories」をつければOKと書いてあったので試してみる → <font color="blue">merge OK!</font>

    % git merge --allow-unrelated-histories origin/master
    Merge made by the 'recursive' strategy.
     README.md | 2 ++
     1 file changed, 2 insertions(+)
     create mode 100644 README.md

##### 再度、ローカルリポジトリをリモートリポジトリへ反映させる → <font color="blue">push OK!</font>

##### 一件落着

## 「--allow-unrelated-histories」について
ちゃんと調べてみたところ
Git 2.9から mergeコマンドとpullコマンドでは，--allow-unrelated-historiesを指定しない限り，無関係なヒストリを持つ２つのブランチをマージすることはできなくなった。
とありました。

## 考察
まだ、GitHub、Gitの理解が浅いので見当違いなことを言っているかもしれませんが、GitHub上でリポジトリを作成したタイミングで、README.mdがコミットされているのに、それをローカルリポジトリに取り込まずに、ローカルのソースをコミットしてしまったのが原因と思われる。
結果、それぞれが別ヒストリとなり、mergeエラーになったのかなと。
DNSの間違った理解

DNSは分散型の名前解決サービスです。
例えば「www.example.com」のIPアドレスを問い合わせる場合、クライアントからの問い合わせを受け付けたプロキシDNSサーバはまず「ルート」ネームサーバに問い合わせ、次に「com」ネームサーバ、次に「example.com」ネームサーバというように階層的に段階を追って問い合わせ、最後に手に入った回答をクライアントへ返送します。

![20160825-dns-1.gif](https://qiita-image-store.s3.amazonaws.com/0/99231/7d6a73a4-8a62-95de-b73b-e4e459a1ea8b.gif)

ここまではいいのです。問題はプロキシDNSサーバとネームサーバの間の通信の内容。

![20160825-dns-2.gif](https://qiita-image-store.s3.amazonaws.com/0/99231/6c4c920f-55fc-f556-a750-9dc53be45831.gif)

こんな感じだと思っている人がいますが__違いますから！__

正しくはこう。

![20160825-dns-3.gif](https://qiita-image-store.s3.amazonaws.com/0/99231/23ac07de-43c2-d0a7-f366-63841d950af9.gif)


上の図はディテールをごっそり省いて大まかな説明になっていますが、要は、プロキシDNSサーバが投げるクエリの内容そのものは、どのネームサーバに対しても同じだということです。違うのはネームサーバからの回答のほうで、それによってプロキシDNSサーバの次の行動が決まります。
Oracleで0サイズの表領域は作成できるのか？


できませんでした。
できたら面白かったのに…。

```sql:
SQL> create tablespace test01 datafile '/u01/app/oracle/oradata/TTT/test01.dbf' size 0;
create tablespace test01 datafile '/u01/app/oracle/oradata/TTT/test01.dbf' size 0
                                                                                *
行1でエラーが発生しました。:
ORA-02009: ファイルのサイズには0を指定できません。
```
8/25 今日の学習内容 ～CODEPREPでRubyの基礎を復習!～

###今日の学習内容
***
今日も移動時間に先日ご紹介した、スキマ時間の学習にピッタリな**「CODEPREP」**でRubyの復習を行いました。
>CODEPREP　https://codeprep.jp/ja/

Rubyの基礎についてはProgateのRuby基礎編をクリアすることで学びましたが、CODEPREPで復習をしていると、より詳しい説明（というより、Progateにない説明）がありました。


- **Progateに無かった情報**

 - ~~　Rubyにおいて「等しい」と表すには「==」を使いますが、数値と文字列を厳密に区別するには「===」を使うということ。~~
 　←JavaScriptと混同しておりました(;´･ω･)ご迷惑をお掛けして申し訳ありませんでした。
scivola様、ご指摘ありがとうございましたm(__)m
　
 - Rubyでは「ローマ字の大文字」から始まるものが定数として認識されるということ。
 - while文の対となる、until文という構文があるということ。
 - x**2と書くことでｘの二乗を表すことができるということ。
 
↑ついでに調べたのですが、x = 2**(1/2.0)と書くことで、√２と表せるそうです(-ω-)/
>Rubyで指数や平方根、立方根の計算　
http://blog.codebook-10000.com/entry/20140319/1395158565


上記のように、ProgateのRuby基礎編をクリアしただけでは得られなかった知識がいくつもありました。

（決してProgateが悪いと言っているわけではありません。私は、分かりやすいProgateを使って基礎を固めていたおかげで、CODEPREPをスラスラと進められました(*'▽')）

自分の気に入ったサイトで学習するのはとても大切だと思います。
ですが、知識を増やすためにも、たまには違うサイトで学習してみるのもいいかもしれませんね(-ω-)/

###あとがき
***
さて、ここ数日でProgateやCODEPREPを活用してRubyの基礎を学習してきましたが、本日**「改訂３版 基礎 Ruby on Rails」**が届きました(*'▽')
Kindle版でもいいかな、とも思いましたが、紙の本が好きなので、持ち運びを考えずに紙で読むことにしました(笑)

ここ数日、ProgateやCODEPREPを利用して学習して、ある程度、Rubyの基礎について知れました。これからは、分からないところはその都度調べつつ、この「改訂３版 基礎 Ruby on Rails」を使ってRuby on Railsについて学習していきたいと思います。

![alt](https://images-na.ssl-images-amazon.com/images/I/41AkxXsz%2B5L.jpg)
>改訂３版 基礎 Ruby on Rails　https://www.amazon.jp/dp/4844338153

###参考にさせていただいたサイト
***
>CODEPREP　https://codeprep.jp/ja/
Progate　https://prog-8.com
Rubyで指数や平方根、立方根の計算　http://blog.codebook-10000.com/entry/20140319/1395158565
Atomのinit.coffeeをinit.cljs（ClojureScript）で置き換える方法

エディタのほうのAtomのお話です。
AtomのInit FileをClojureScriptで書きたいなと思って調べたらできたのでメモします。

まずは、ホームディレクトリ/.atom に移動して`npm install clojurescript`を実行することで
[clojurescript-npm](https://github.com/nasser/clojurescript-npm) をローカルインストールします。
（ホームディレクトリ/.atom/node_modules/clojurescript ができればOK）
そうすることでinit.coffeeの中で`require 'clojurescript'`ができるようになります。

次にinit.coffeeに以下の記述をします。

```init.coffee
os = require 'os'
path = require 'path'
fs = require 'fs'
cljs = require 'clojurescript'
cljs.context.atom = atom
cljs.context.protoRepl = protoRepl

initCljs = path.join os.homedir(), '.atom/init.cljs'
fs.readFile initCljs, 'utf8', (err, data) ->
  throw err if err
  cljs.eval("(do #{data})")
```

これで準備が整いました。あとはホームディレクトリ/.atom/init.cljsファイルを作ってClojureScriptで設定を記述できます。
例えば以下のように

```init.cljs
(.log js/console global.atom)
(.log js/console global.atom.commands)
(.. global.atom.commands
    (add "atom-text-editor" "cljs:sample-linefirst"
         #(.. global.atom.workspace
              getActiveTextEditor
              getLastCursor
              moveToFirstCharacterOfLine)))

```

これで、Proto REPLパッケージのSelf Hosted ClojureScript REPLを使ってAtom自身の操作を試しつつ、その結果をinit.cljsに反映できてハッピーになれそうです。

init.coffeeの中身の解説を少しすると
`cljs.context.XXX`に代入するとinit.cljsのほうでは`global.XXX`で参照できます。
cljs.evalの引数は単一のフォームでないとエラーになるのでdoで囲っています。
ここでは使ってませんが、cljs.newContext()を使うとadm-zipがないと怒られてなぜかダメでした。
PHP internals の RFC や ML をウォッチする


## PHP internals とは？

PHP 処理系の開発者の集まりです。長期間にわたって活動する人や特定の問題のみに取り組む人などさまざまです。

## PHP internals と企業組織の違いは？

学校の文化祭や町内会のお祭りを想像するとよいかもしれません。PHP internals は非営利組織だということです。何かを実現するためには誰かの力を借りる必要があります。信頼関係や合意形成に時間をかける必要があります。利害関係者との協力関係を構築することをステークホルダーマネジメントと呼びます。PHP 作者の Rasmus Lerdorf 氏は PHP のコミュニティは何がしたいのか？何ができるのか？どんな問題を解決できるのか？といったことに対して常に向き合っていることを述べています ([PHPは「利己的」な開発者の集まり](http://gihyo.jp/news/interview/2010/rasmus))。

## RFC とは？

Request for Comments の略称です。PHP に新しい標準機能を導入する場合、RFC をもとに投票をする必要があります。投票権を得るにはソースコードの改善をはじめ、さまざまな形で PHP に貢献する必要があります。curl や mbstring などの拡張モジュールであれば、投票なしで機能が導入されます。intl 拡張モジュールでは投票が行われました。

## RFC の投票状況をウォッチするには？

Twitter で PHPRFCBot を定期的に見るとよいでしょう。https://php-rfc-watch.beberlei.de では誰が投票したのかが示されます。

## ML (メーリングリスト) をちょっと見るのに便利なサービスは？

http://externals.io があります。興味をもった RFC についてよりくわしいことを知りたいと思ったときに見るとよいのではないでしょうか。


## 根拠を示していますか？

読む価値のメールかどうかを判断する基準はきちんとした根拠を示すことができているかどうかです。思いつきの議論にかなりのエネルギーを費やされている残念な状況があります。医療や学術関係では根拠は「エビデンス」とも呼ばれます。

stackoverflow での質疑応答、有名な CMS やフレームワークのコードベース、PHP 自身のテストケースなどでの用例や改善例を示すことができるのであればよい提案です。テストケースは意外と見落としがちです。ライブラリやフレームワークの開発者が ML で賛成、反対の意見を示すことがあります。

ほかの言語に存在するからというのはよい根拠になるとはかぎりません。ほかの言語で用例があっても PHP では用例がないこともあるからです。

## 非営利組織の運営を学ぶための書籍

ピーター・ドラッカーの著作「非営利組織の経営」や「経営者に贈る５つの質問」を挙げます。「経営者に贈る５つの質問」に掲載されている質問は次のとおりです。

  * われわれのミッションとは何か
  * われわれの顧客は誰か
  * 顧客にとっての価値は何か
  * われわれにとっての成果は何か
  * われわれの計画は何か

Jonathan Rasmusson は「アジャイルサムライ」でドラッカー風エクササイズを紹介しています。

 * 自分は何が得意なのか？
 * 自分はどうやって貢献するつもりか？
 * 自分が大切に思う価値は何か？
 * チームメンバーは自分にどんな成果を期待してると思うか？

## 提案の評価を学ぶための書籍

さまざまな RFC がつくられるものの、多くは却下される運命にあります。却下された RFC をまとめた[記事](http://qiita.com/rana_kualu/items/644def9847b116c8f108)があります。

RFC が投票で通るためには ML でさまざまな人からの質問に答えて、文字通り一票一票積み重ねてゆく必要があります。よい質問ができるかどうかがよい RFC をつくれるかどうかともつながっているわけです。

どのような質問を想定すればよいのかについての参考資料としては「政策立案の技法」を挙げます。この本はカリフォルニア大学バークレー校公共政策大学院で使われています。機能を提案する前にまず考える必要があることは専門知識がない人からの素朴な質問 (「それは何だい？」、「で、どうするんだい？」) に対して手短に答えることができるかどうかです。本書では「ベッシーおばさんのテスト」(p82)と呼んでいます。

もう1つ考えることはあなたの提案するすばらしい機能がこれまで実現できなかったのはなぜだろうかということです。本書では「20ドル札テスト」(p81)と呼ばれています。

### PHP の言語デザイン

Rasmus はあるべき姿として次の要件を述べています。

  * Web にフォーカスしたプラグマティックな言語
  * ゆるい型づけの言語
  * 幅広いスキルとプラットフォームのユーザーに対応する言語

くわしくは [RFC](https://wiki.php.net/rfc/request_response) をご参照ください。PHP の作者の一人の Zeev 氏の見解も引用されています。
Ansible2 変数の優先度

# Ansible2 変数の優先度
意外と「Ansible 変数　優先度」とかでググッても出てこないので、こちらにメモします
内容は、ドキュメント[Variables — Ansible Documentation](http://docs.ansible.com/ansible/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable)で説明されてるものを逆順にして日本語化しただけです。
逆順にしたのは、単純にそのほうが自分にとって見やすいからです。

## Ansible2 変数の優先度ランキング

つよい(確信)
- extra vars
- タスクのvars
- ブロックのvars
- ロールのvars/includeした変数ファイル
- set_facts
- 処理でregisterした変数
- 処理内vars_filesで指定のファイルで定義された変数
- 処理内vars_promptでプロンプトから渡された変数
- 処理内のvarsで定義された変数
- ファクト(setupで拾ってきた値)
- Playbookで定義されたhost_vars
- Playbookで定義されたgroup_vars
- インベントリで定義されたhost_vars
- インベントリで定義されたgroup_vars
- インベントリで定義された変数
- ロールのデフォルト(/roles/*/defaults/main.yml)



## まとめ
例外はありますが、

- 要素で定義した変数は要素の集合で定義した変数より強い
- タスク > vars > 処理(Play) > Playbook > インベントリ > デフォルト

って印象です。

## そんなわけで
「あれ？varsで定義した変数、group_varsで上書きしてるのにな〜」
みたいなことにならない様に、しっかり頭に入れておきたい所です。
goでのtypeの一括宣言

#typeの一括宣言
今の今まで気づきませんでしたが
constやvarのようにtypeも一括宣言できるようです。

```go
package main
//const宣言
const GO = "go"
const GOLANG = "golang"

//constは以下のようにも書ける
const (
  GO = "go"
  GOLANG = "golang"
)

//type宣言
type Go struct{
  gopher string
}
type Golang int

//実はtypeも同じことが可能
type (
  Go struct{
    gopher string
  }
  Golang int
)
```
constの一括宣言は周知されているものと思いますが
typeの一括宣言は知らない方も多いんじゃないでしょうか。
https://golang.org/ref/spec
もちろん普通に仕様には載っているんですが
仕様をまともに読まないカスのような人は、中々気づかないか忘れているはずです。
自分だけではないことを祈ります。

基本的にメソッドがtype宣言の下に書かれることが多く、
使い時が少なそうですが覚えておいて損はないと思います。
idのデフォルトをunsigned bigintに

# 環境
Rails5.0 環境での話です。

# idカラムはデフォでbigintにしたい
最初はmigrationのcreate_tableにオプションで渡して対応していました。

```rb
create_table :entries, id: :bigint, unsigned: true do |t|
end
```

こんな感じで書いてました。

レビューしていても抜け漏れは防げないのでinitializerでデフォルト値を上書きすることにしました。

もちろんbigintにする必要のないテーブルも多いのですが、そういうテーブルがbigintに変わったところでデメリットも少ないと判断しました。

idをbigintにする必要があるような大きなテーブル内に含まれる外部キーに使われるidに関してはintegerとbigintでテーブル容量に大きな差が出てきてしまう可能性等はあります。

そういう場合は明示的にid: :integer を指定することで防ぐことが可能です。

```ruby:mysql_migration_ext.rb
ActiveSupport.on_load(:active_record) do
  require 'active_record/connection_adapters/mysql2_adapter'

  module ActiveRecord
    module ConnectionAdapters
      module MysqlMigrationExt
        def create_table(table_name, options = {})
          super(table_name, options.reverse_merge(id: :bigint, unsigned: true))
        end
      end

      class Mysql2Adapter
        include MysqlMigrationExt
      end
    end
  end
end
```

こんな感じです。

# 注意点
これは全てのテーブルのIDがunsigend bigintに既になっているもしくはmigration時に明示的にidの型を指定してあることが前提です。

なっていない場合初期値の上書きをおこなっているので、今後新たにmigrationした環境とその前からある環境でテーブルの状態に差異が発生します。

新たな環境でこれを導入した後に、rails db:migrate で新規にmigrationを行った後schema.rbに差異がでている場合は見なおしたほうが良いと思います。
Assert の使い方メモ

* テストとは違いますが・・・

# Assert とは？

* ある式・値が想定したものになっているかを確認する関数。
* 引数が `true` の時何もせず、`false` の時異常を出してプログラムを終了させる。
* 一般的にはある変数が期待した値になっているかを判定する式を引数として食わせる。
* デバッグビルド時には動作し、リリースビルド時には実行されない。（確認作業も含めて）

```csharp
int i = 0;
Debug.Assert(0 <= i);
// OK

i = -1;
Debug.Assert(0 <= i);
// Error !!
```



# [C での Assert](http://www.c-tipsref.com/reference/assert/assert.html)

```c
#include <assert.h>

void assert(
    expression
);
```

* `NDEBUG` マクロが定義されていない時は処理されて、定義されているときには処理されない。
* `expression` が `0` [偽] の場合、どこで問題があったのかを表示して、プログラムを停止させる。
* プログラムを殺すという機能から、組み込み環境でも提供されているかは環境によると思います。


# [C# での Assert](https://msdn.microsoft.com/ja-jp/library/kssw4w7z(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1)

```csharp
namespace System.Diagnostics {
    public static class Debug {

        [ConditionalAttribute("DEBUG")]
        public static void Assert(
            bool condition
        );
    }
}
```

* Debug ビルドの時は処理されて、それ以外では処理されない。
* 引数 `condition` が `true` の時何もせず、 `false` の時異常を出す。
    * Windows アプリケーションの場合は、メッセージボックスが出て `中止`, `再試行`, `無視` を選べる。

## 例外との違い

* 例外は、その後処理することを前提としているが、`Assert` はプログラムの終了を前提としている。
* なので、その状況が想定の範囲内の異常値の場合は例外、設計上ありえない場合は `Assert` を使用する。
    * 外部からの入力値の異常を示すときは `ArgumentException` を利用する。
    * 内部の設計上、『そこにその値が入っている時点でバグ』といった場合には `Debug.Assert` を利用する。
* `Assert` は問題があった時点でプログラムが終了するので、『待っていたらそのうちおかしな値になる』場合には不向き（この場合はログを取った方がいい）
NSLOOKUPでDNS登録がホントに上手くいっているのか確認する

# NSLOOKUP　で確認してみる

手元のDNSサーバ（ルータとか）のDNS更新が遅くて困ったら、
　http://blog.halpas.com/archives/2938
ココに書いてあるような公開DNSサーバで試してみるとよい

> nslookup　解決したいドメイン名　問い合わせたいDNSサーバ

具体的に、yahoo.co.jpの名前解決ができるか試してみます。

```
>nslookup yahoo.co.jp 8.8.8.8

サーバー:  google-public-dns-a.google.com
Address:  8.8.8.8

権限のない回答:
名前:    yahoo.co.jp
Addresses:  183.79.135.206
          182.22.59.229
```

でOK。
今回は、yahoo.co.jpの名前解決をしてみましたが、
本来であれば「自分がDNS設定したドメイン名」にして試してみて下さい。

ちなみに「8.8.8.8」は、超高速と言われるGoogleのDNSサーバのIPアドレスです。
　→　こんなグローバルIPあるのね
git clean

`git clean`の使い方をメモ。

**作業ディレクトリから追跡対象外のファイルを削除するコマンド**



`git clean -n`

これで対象外ファイルを確認する。(実行はされていない。)

`git clean -f PATH`

PATHのファイルを削除。

`git clean -f`

カレントディレクトリの*ファイル*を削除。

`git clean -df`

ディレクトリも削除。
gitの管理を避けるためのあれやこれ

定期的にググってるのでメモ。

## gitで管理されているファイル
### update-index --skip-worktree
gitの操作の影響を受けない。gitの操作で変更されない。大抵こっちを使ってる。

```sh
# 登録
$ git update-index --skip-worktree <pathToFile>
# 解除
$ git update-index --no-skip-worktree <pathToFile>
```

### update-index --assume-unchanged
reset等のgitの操作の影響を受ける。

```sh
# 登録
$ git update-index --assume-unchanged <pathToFile>
# 解除
$ git update-index --no-assume-unchanged <pathToFile>
```
skip-worktreeとassume-unchangedの解説や利用シーンは
http://qiita.com/usamik26/items/56d0d3ba7a1300625f92
が詳しい

## gitで管理されていないファイル
### gitignoreに追記する
`.gitignore`にパスを追記
git管理のrootからのパス

```sh
./path/to/file
```

### gitignoreに追記出来ない場合
`.git/info/exclude`にパスを追記
こちらもgit管理のrootからのパス

```sh
./path/to/file
```
Mac内蔵のApacheのPHPのバージョンを変更する


Mac OSXでApache + PHPを使う場合、OS内蔵のものをそのまま使っていることが大半だと思います。
しかしライブラリの追加やPHPのバージョンアップなどで、OS内蔵のPHPでないバージョンを使うこともあると思います。

今回はOS内蔵のPHPのバージョンを変更し、Apacheに反映する方法を紹介します。

## 前提条件

今回は以下の前提で説明します。

* PHPのインストール方法は割愛する
* 変更対象のバージョンのPHPはインストール済みとする

## 変更方法

「/etc/apache2/httpd.conf」を以下のように変更することで反映できます。

```httpd.conf
LoadModule php5_module libexec/apache2/libphp5.so

↓

#LoadModule php5_module libexec/apache2/libphp5.so
LoadModule php5_module /usr/local/Cellar/php55/5.5.38/libexec/apache2/libphp5.so

```

そう、libphp5.soのモジュールのパスの変更のみです。
変更後は、Apacheの再起動もお忘れなく。
意外に簡単でしたね。。。

## 関連リンク
* [Macの内蔵のApacheにPHPのバージョンを切り替えて適用する](https://qiita.com/SRAUFactory/items/47246d041418a0997002)
* [Mac内蔵のApacheにシステム環境変数を反映する](https://qiita.com/SRAUFactory/items/7222c20d36b5b81d497b)
FreeBSD 10.3-RELEASE ntpd 閏秒ファイル更新

FreeBSD 10.3-RELEASE では、ntpd デフォルト設定ファイルで閏秒ファイルを読み込むようになっています。
しかし、10.3-RELEASEの閏秒ファイルの有効期限が2016年6月1日となっているため、以下のようなエラーメッセージが出力されます。

```console
May 31 09:03:20 freebsd10 ntpd[987]: leapsecond file ('/var/db/ntpd.leap-seconds.list'): will expire in less than one day
```
```console
Jun  1 20:13:15 freebsd10 ntpd[983]: leapsecond file ('/var/db/ntpd.leap-seconds.list'): expired less than 1 day ago
```

1日1回、閏秒ファイルをチェックして自動更新する仕組みもありますが、正しく動作しません。

ここでは、手動で閏秒ファイルを更新する手順を書きます。

閏秒ファイル手動更新
------------------

FreeBSD-CURRENT の閏秒ファイルを取得して ntpd を再起動します。
サーバ証明書でエラーが出る場合は、`sudo pkg install ca_root_nss` でルートCA証明書をインストールします。

```shell-session
$ cd /tmp
$ svnlite export https://svn.FreeBSD.org/base/head/etc/ntp/leap-seconds
$ sudo cp leap-seconds /var/db/ntpd.leap-seconds.list
$ sudo service ntpd restart
```

ログメッセージを確認して、期限切れとなっていない有効な閏秒ファイルが読み込まれていることを確認します。

```console
Aug 25 17:14:10 freebsd10 ntpd[9743]: ntpd 4.2.8p8-a (1): Starting
Aug 25 17:14:10 freebsd10 ntpd[9744]: leapsecond file ('/var/db/ntpd.leap-seconds.list'): good hash signature
Aug 25 17:14:10 freebsd10 ntpd[9744]: leapsecond file ('/var/db/ntpd.leap-seconds.list'): loaded, expire=2017-06-01T00:00:00Z last=2017-01-01T00:00:00Z ofs=37
```

自動更新の仕組み
----------------

`$daily_ntpd_leapfile_enable` が `YES` なら、1日1回 `periodic daily` により `/etc/periodic/daily/480.leapfile-ntpd` から `service ntpd fetch` が実行されます。
`service ntpd fetch`は以下のような動作を順にします。

1. `$ntp_db_leapfile` より `$ntp_src_leapfile` が新しければ、`$ntp_db_leapfile` を `$ntp_src_leapfile` で置き換える。
2. `$ntp_db_leapfile` の有効期限が近づいたら、`$ntp_leapfile_sources` から最新ファイルを取得し、`$ntp_db_leapfile` より新しければ置き換える。

変数のデフォルト値は以下のように設定されています。

```sh:/etc/defaults/periodic.conf
daily_ntpd_leapfile_enable="NO"                         # Fetch NTP leapfile
```

```sh:/etc/defaults/rc.conf
ntp_src_leapfile="/etc/ntp/leap-seconds"
                                # Initial source for ntpd leapfile
ntp_db_leapfile="/var/db/ntpd.leap-seconds.list"
                                # Working copy (updated weekly) leapfile
ntp_leapfile_sources="https://www.ietf.org/timezones/data/leap-seconds.list"
                                # Source from which to fetch leapfile
```

自動更新が動作しない理由
------------------------

FreeBSD 10.3-RELEASE の `/etc/ntp/leap-seconds` より https://www.ietf.org/timezones/data/leap-seconds.list の方がタイムスタンプが古いため、ダウンロードしたファイルで置き換えられません。

2016年8月25日時点では以下のようになっています。

source              |last update            |file expires
--------------------|-----------------------|-----------------------
FreeBSD 10.3-RELEASE|3660508800 (2015-12-31)|3673728000 (2016-06-01)
FreeBSD 12.0-CURRENT|3676752000 (2016-07-06)|3705264000 (2017-06-01)
www.ietf.org        |3629404800 (2015-01-05)|3691872000 (2016-12-28)

また、ca_root_nss パッケージがインストールされていない場合は、www.ietf.org アクセス時にサーバ証明書の検証に失敗し、ダウンロードされません。
Mac内蔵のApacheにシステム環境変数を反映する


Mac OSXでApacheを使う場合、OS内蔵のApacheを使っていることが多いと思います。
今回はApache起動時に定義した環境変数を反映する方法を紹介します。

## apachectrlによるApacheの管理

Mac OSXでApacheを使う場合、大半の方がapachectrlで起動/停止を行っていると思います。
Apacheの設定を変えずに使うのであれば、それでも問題ないのですが、今回のように起動時に環境変数を反映する場合には少し注意が必要です。
apachectrlの起動時に以下のファイルから環境変数を設定しています。

```
/System/Library/LaunchDaemons/org.apache.httpd.plist
```

しかしこのファイル見てわかる通り、rootdでしたか編集できないのです。。。

```
$ ls -lt /System/Library/LaunchDaemons/org.apache.httpd.plist
-rw-r--r--  1 root  wheel  554  8 23  2015 /System/Library/LaunchDaemons/org.apache.httpd.plist
```

sudoなど色々な権限を駆使しましたが、結局このファイルの変更は難しそうなので、違う方法を模索することに。

## 自作のシェルでのApacheの管理

そこで自作のシェルで以下を対応することにしました。

* exportコマンド環境変数を設定
* httpdコマンド実行

これであれば、割と自由に設定が可能です。

```myhttpd
#!/bin/sh
export ACCESS_KEY_ID=*****************
export SECRET_KEY=****************************

HTTPD='/usr/sbin/httpd'
$HTTPD "$@"
```

ここでは「ACCESS_KEY_ID」と「SECRET_KEY」という二つの環境変数を設定しています。
シェルの実行方法は以下のような感じです。

```
# 起動
$sh myhttpd -k start
# 停止
$sh myhttpd -k stop
```

シェルの引数はhttpdの引数の仕様に合わせました。

## まとめ

自前のインフラ管理の場合はapachectrlよりもシェルを実装した方が柔軟に対応できそうです。

## 関連リンク
* [Macの内蔵のApacheにPHPのバージョンを切り替えて適用する](https://qiita.com/SRAUFactory/items/47246d041418a0997002)
* [Mac内蔵のApacheのPHPのバージョンを変更する](https://qiita.com/SRAUFactory/items/2589ed9c72684ab0af7d)