OmniAICreator/Qiita-1.07M huggingface dataset:
VMware上でcloneしたCentOSのNICが認識されない時の対処法

# 原因
OSのNIC設定ファイルに元VMのMACアドレスが残っていることが原因
*CentOS6の話です*

```
cat /etc/udev/rules.d/70-persistent-net.rules 
# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

# PCI device 0x15ad:0x07b0 (vmxnet3)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:50:56:b6:70:61", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
```

MACアドレス"00:50:56:b6:70:61"は元VMのものだが、新しいVMのMACアドレスは"00:50:56:B6:70:61"になっている。」

```
cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="dhcp"
HWADDR="00:50:56:B6:70:61"
IPV6INIT="no"
MTU="1500"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"
UUID="e45dad38-c8ee-41ec-b381-820d4531799d"
```


# 対処法
1. "70-persistent-net.rules"を空ファイルにする

```
rm -f /etc/udev/rules.d/70-persistent-net.rules
ln -s /dev/null /etc/udev/rules.d/70-persistent-net.rules
```

2. NICの設定ファイルの編集

before

```before
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="dhcp"
HWADDR="00:50:56:B6:70:61"
IPV6INIT="no"
MTU="1500"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"
UUID="e45dad38-c8ee-41ec-b381-820d4531799d"
```

after 

```
cat /etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE="eth0"
BOOTPROTO="dhcp"
IPV6INIT="no"
MTU="1500"
NM_CONTROLLED="no"
ONBOOT="yes"
TYPE="Ethernet"
```



## 確認

```
ll
total 16
-rw-r--r--. 1 root root 316 Oct 15  2014 60-raw.rules
-rw-r--r--. 1 root root 803 Jan  4 16:49 70-persistent-cd.rules
lrwxrwxrwx. 1 root root   9 Jan  4 17:17 70-persistent-net.rules -> /dev/null
-rw-r--r--. 1 root root  54 Dec  8  2011 99-fuse.rules
-rw-r--r--. 1 root root 341 Jan  4 16:56 99-vmware-scsi-udev.rules
```

# Tips
このVMを元にクローンするとこの問題は二度と発生しない
Play Scala で BASIC 認証ありのURLにHTTPリクエストを送信する


Play には [WS API](https://www.playframework.com/documentation/2.4.x/ScalaWS) というAPIがあり、これでHTTP関係の処理が行えます。

BASIC認証をやりたい場合は、リクエストに「withAuth」をつけるのがポイントです。[APIドキュメント](https://www.playframework.com/documentation/2.4.x/api/java/play/libs/ws/WSAuthScheme.html)を見る限りでは、DIGEST認証など他の認証方式にも対応しているようです。

```
package controllers

import play.api.libs.ws.WSAuthScheme.BASIC
import play.api.libs.ws.WS
import play.api.mvc._

import play.api.libs.concurrent.Execution.Implicits.defaultContext

class Application extends Controller with AdminSecure {

  def auth = Action.async {
    import play.api.Play.current
    WS.url("http://xxx:yyy/zzz").withAuth("admin", "password", BASIC).get().map(
      response => Ok(response.body)
    )
  }
}

```
React Native - ScrollViewで内容を追加しても常に最下部を表示する方法

ScrollViewの内容を追加していくと
後に追加したものが隠れて見えなくなってしまいます。

デフォルトで勝手にスクロールするよってStack Overflowにあったりもしましたが
自分はうまくいかなかったのでソースで書いて頑張りました。

#手順
①ScrollViewの高さを取得
②ScrollViewの中身の高さを取得
③上の2つの差を出してscrollToを実行

#サンプルソース
```lang:main.js
・・・
  handleContentSizeChange: function(ctwidth, ctheight) {
    var height = this.state.scrollAreaHeight;
    if (height == 0) {
      return;
    }
    if (height < ctheight) {
      this.refs.scrollView.scrollTo(ctheight-height);
    }
  },
・・・
  render: function() {
    return (
・・・
        <ScrollView style={styles.scrollArea}
                    onLayout={(event) => {
                      var {x, y, width, height} = event.nativeEvent.layout;
                      this.setState({scrollAreaHeight: height});
                    }}
                    onContentSizeChange={this.handleContentSizeChange}
                    ref="scrollView">

・・・
```

こんな感じです。

onLayoutでコンポーネントがセットされた時の高さが取得できるので
onContentSizeChangeで中身のサイズが変わった時に
scrollToしてあげます。
リアクティブ プログラミング：ほん"ニャァ"くコンニャク

# Reactive programming

[原文:](https://en.wikipedia.org/wiki/Reactive_programming)　(英訳はむずい... いや、英語ができないのがヤバイ ...)

リアクティブプログラミング(以下 "RP")は、データフローと変化の伝播を志向とするプログラミングのパラダイムです。

これは、プログラムで、『静的または動的なデータフローを楽に実装できなければいけない事』と
『実行モデルが自動でデータフローに合わせて変化の伝播をできなければいけない』ものです。

例）

* a := b + c の式があった場合, aは b+c の結果を、式の評価があった時に格納をします。評価後で、b,cは a には影響を与えずに変更できます。そして、a の値は、関数型プログラミングとは反対で、新しいb,cの値で自動的に更新(破壊的代入)します

* 最近のスプレッドシートは"RP"の一つの例です。"=B1+C1"の式は自動的に更新をします
もう一つは、ハードウェア記述言語のVerilogは回路の伝播のモデルを記述できます

* "RP"は、ユーザーインターフェイスやリアルタムアニメーションで使われているが、一般的なプログラミングのパラダイムとなります

* MVCでは、"PR"によってModelの変更をViewに通知（その逆も）しているとも挙げられます。

## コンセプト
### 明示の程度

"PR"は、矢印でデータフローを明示化できます。
データフローは、命令型や関数型言語の構造に暗黙的に似た形に成ります。

アーキテクチャレベルでは、データフローグラフの独立したノードの相互通信プログラムを表す時もあります。


### Static or Dynamic

"PR"は純粋な静的なデータフロー形成と実行中のデータフローの動的な変更が可能です

### Higher-order "PR"

別のデータフローからデータフローを構築可能な時、上位"Hight-order"と言えます。
結果は、最初のデータフローと同じ評価モデルで、もう一つのデータフローの結果を出力します。


### データフローの識別/差別

理想では、データの変更は即座に全て伝播したいが、現実的には難しい。
その代替えで、データフローの識別/差別をし、評価の優先度を決める必要があるかもしれません。
データフローの識別/差別は複雑な設計を招きます

例）

* ワードプロセッサのスペルチェックが挙げられます



### "PR"のモデルの評価

"PR"の評価は、必ずしもスタックベースのプログラムの評価と同じになりません。
それよりも、いくつかのデータ変更があった時に、すべてのデータに部分的または完全に伝播されます。
変換の伝播は、多分、一番自然な方法では無効化/遅延有効化計画で行われます。

それは、もし不確定なデータ形式だと指数関数的な複雑な更新のため、スタックを使った自然な伝播では問題となります。
一つのそのようなデータ形式"repeat diamond shape" (An → Bn → An+1、An → Cn → An+1 n=1,2...)があります。
この問題は、データが無効でないものへの伝播を無効化し、後で必要なものを遅延評価で有効化することで、解決できます。

この"PR"固有の問題は、主要な計算です。通常のプログラミング言語は評価し、問題を考えません。
また、データがメモリを使用し"PR"では多くのメモリを占有します。研究によってこの問題は解決しました。

一方で、"PR"は"明示的な並列"の記述と並列にハードウェアのパワーを利用するものとして使用できます。


#### オブザーブパターンとの類似について

"PR"はOOPでのオブザーブパターンと類似しています。
けれども、プログラム言語の中でのデータフローの統合は、表現を容易にして、データフローの粒度として扱えるようにしています。
例えば、オブザーブパターンでは、オブジェクト/クラスの間のデータフローを記述すしますが
”OOPR”では オブジェクト/クラスのメンバーをターゲットにできます。

スタックベースの一般的なオブジェクト志向のデータフローの伝播は不完全です。
"tree feedback edges" のデータ構造は指数関数的な問題に直面します。
しかし、比較的限られた使用と小さな粒度のため、オブザーブパターンで大きな問題とし扱われません。

## アプローチ

### 命令型

リアクティブデータ構造で動作するように記述します。それは、制約命令プログラミングと似ています。
注意事項として、制約命令プログラミングは双方向の制約ですが、"PR"は一方向の制約になります。

### オブジェクト志向

オブジェクトにリアクションを設定して、リアクションによって再評価が行われて自動的に更新する

### 関数型

Functional reactive programming (FRP) というパラダイムになります。

----
ここまで

<反省>  英語を勉強せねば・・・ (;o;)
CloudAtCostにArchLinuxをインストール

## 準備

* VMWareにArchLinuxをインストール
* DiskはSCSIを選びました。
    * diskサイズは1GB
    * ext4でフォーマット
* ddでdump、cloudatcostに転送しddでrestore

```bash:圧縮イメージからリストア
gzip -dc < arch1gb.dump.gz | dd of=/dev/sda
```

* 再起動しネットワーク設定を行い完了。

## /dev/sda1の拡張

```bash:
fdisk /dev/sda
d 1 n p 1 Enter Enter Enter w
reboot

resize2fs /dev/sda1
```

----

## ファイアウォール(ufw)

* [CloudAtCostにRancherOSをインストール - Qiita](http://qiita.com/tukiyo3/items/6fad97c7390ec6827b4f)

```bash:
pacman -Sy ufw
```

```diff:/etc/default/ufw
- IPV6=yes
+ IPV6=no
```

### 設定

```bash:
ufw default deny
ufw allow 22
ufw enable
```

```bash:
systemctl enable ufw
```

### 状態

```
# ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing)
New profiles: skip

To                         Action      From
--                         ------      ----
22                         ALLOW IN    Anywhere
```

----

## SimpleHTTPServerがない

* [/usr/bin/python: No module named SimpleHTTPServer · Issue #1 · garrett/magicmockup · GitHub](https://github.com/garrett/magicmockup/issues/1)
* python3にはないのでhttp.serverを使う

```bash:
python -m http.server 8888
```
AWSのLambdaを使ってみた


AWSのサービスの一つであるLambdaを使用してみたので、使い方等のメモ。

# Lambdaとは
簡単に言うと、サーバを用意することなくコードをアップロードしてトリガを設定しておくだけでコードを実行してくれるプラットフォーム。

# トリガ
以下のリソースへのアクセスをトリガとして設定できる。

- S3
- DynamoDB
- Kinesis
- SNS

また、cronのような設定や、「API Gateway」と組み合わせることも可能。

# 言語について
Lambda上で実行できる言語は、以下の通り。

- Node.js
- Python
- Java

Java以外の言語については、コードをアップロードするだけでなくてAWSのコンソール上で直接コードを書くことができる。

# 作り方
言語には「Node.js」、トリガに「S3」を使用したサンプルをやってみる。

1. AWSコンソールから「Lambda」を選択して、「Create a Lambda function」をクリック
1. 「Select blueprint」という画面が表示されて、おそらくテンプレートを選べるのだろうけど、ここでは、何も選択せずに「skip」をクリック
1. 「Name」「Description」に適当なものを入力し、「Runtime」には「Node.js」を選択
1. 「Lambda function code」のテキストエリアにコードを書いていく（コード例は後述）
1. 「Role」の個所では、今回はS3を使用するので、「S3 execution role」を選択する。すると、別ウインドウが開くので、特に変更せずに「許可」をクリック
1. 「Memory」や「Timeout」は特に問題なければそのまま
1. 「Next」をクリック
1. 「Create function」をクリック
1. 作成したfunctionの詳細画面が表示されるので、トリガの設定を行っていく
1. 「Event sources」のタブをクリック
1. 「Add event source」をクリック
1. ダイアログが表示されるので、「Event source type」に「S3」を選択
1. さらに細かい設定が表示されるので設定する
 - Bucket: 監視するバケットを選択
 - Event type: トリガとなるイベントを選択
 - Prefix: ファイル名のPrefixを設定できる
 - Suffix: ファイル名のSuffixを設定できる
1. 「Submit」をクリック

# コード例

S3にアップロードされたファイル名を表示するコードはこちら。

```
// 開始ログ出力
console.log('Loading event');

exports.handler = function(event, context) {

  // 引数のeventにはトリガに応じたObjectが渡ってくる。
  // それぞれどんな形式かは、コードの編集画面の「Actions」→「Configure test event」
  // で確認できる
  console.log(event.Records[0].s3.object.key);

  // 終了
  context.succeed('handler complete');

};
```

# おまけ

コード内でhttp通信したい場合は以下のような感じで。
LambdaというかNodeのサンプルみたいな感じですが。。。

```
var http = require('http');
var querystring = require('querystring');
var https = require('https'); // https用

console.log('Loading event');

exports.handler = function(event, context) {

// 「GET」の例
  http.get('${url}', function(res) {
    res.setEncoding('utf8');
    res.on('data', function(str) {
      console.log(str);
      context.succeed('handler complete');
    }).on('error', function(e) {
      context.done('error', e);
    });
  });
    
// 「POST」の場合
//    パラメータの組み立て
//    var data = querystring.stringify({
//        name: 'sugasawa',
//        email: 'hoge121@example.com'
//    });

//  var options = {
//    hostname: '${host}',
//    port: ${port},
//    path: '${path}',
//    method: 'POST',
//    headers: {
//      'Content-Type': 'application/x-www-form-urlencoded',
//      'Content-Length': Buffer.byteLength(data)
//    }
//  };

//  var req = http.request(options, function(res) {
//    res.setEncoding('utf8');
//    res.on('data', function (body) {
//      console.log(body);
//      context.succeed('handler complete');
//    });
//  }).on('error', function(e) {
//    context.done('error', e);
//  });

//  req.write(data);
//  req.end();

};
```
自宅にあるRaspberry Piをセキュリティ設定してWebサーバー化

Raspberry Pi をwebサーバ化するための設定方法です。
なお、サーバー公開にあたっては自己責任でセキュリティ対策を十分に行ってください。  

モデル : Raspberry Pi model B
OS : Raspbian GNU/Linux 8
ルータ : WHR-1166DHP2(Buffalo)

## 今回やること
- Apache2のインストール
- Rootへのパスワード設定
- Piユーザを削除し新たなユーザの追加
- SSHポート番号の変更
- ポートフォワーディング

Raspberry PiにSSHで接続している状態からスタートします。

## Apache2を導入
apache2をインストールして起動します

```
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install apache2
$ sudo /usr/sbin/apachectl start
```

ローカルIPから、無事にapacheが起動していることが確認できました。


## rootにパスワードを設定する
簡単です。

```
$ sudo passwd root

# password update successfully!
```


## 新しいユーザーを追加する
```
# sudo adduser [username]
```

すると下記のメッセージがでました。
かっこいいこと言ってます。

```
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

  #1) Respect the privacy of others.  
  #2) Think before you type.  
  #3) With great power comes great responsibility.  
```

新しいユーザーをsudoグループに加えます。

```
$ sudo usermod -G sudo [username] 
```

`$ cat /etc/group/` で確認したところ、sudoグループにしっかり入っている様子。

よって、piユーザからログアウトし、新しいユーザでログインします。
その状態でpiユーザの削除を実行します。

```
$ sudo userdel -r pi
```

これで削除完了しました。

## sshのポート番号を変更
設定ファイルを開いて、書き換えます。

```
$ sudo vi /etc/ssh/sshd_config

# 以下設定ファイル
# What ports, IPs and protocols we listen for
Port [ここに入れる]
```

sshを再起動します。

```
$ sudo service ssh restart
```

ログアウトして再接続し、接続確認が完了しました。

```
ssh [username]@[IP address] -p [new port no.]
```

## ポートフォワーディング
各自のルータ設定に従うと良いと思います。
BuffaloのWHR-1166DHP2という機器を使用しているので、公式HPを参考にしました。
[BUFFALO / ポートを開放する方法](http://faq.buffalo.jp/app/answers/detail/a_id/15022)

ポート設定画面
![スクリーンショット 2016-01-04 16.03.28.png](https://qiita-image-store.s3.amazonaws.com/0/87650/c2e4a9c0-180e-39e2-a91d-04e924e4c927.png)


グローバルIPは、Buffalo設定画面の「ステータス」→「システム」→「Internet」から見れます。


## 参考
[Qiita- Raspberry Piで自宅ウェブサーバ構築](http://qiita.com/yh2020/items/d287712f8a91357ef05b)
[Raspberry Piのセキュリティー設定 for Webサーバー用 パート1](http://denshikousaku.net/raspberry-pi-security-for-web-server-part1)
rhelにjenkinsをインストール ver.[基本設定]

### 土台

+ rhel 6

```
$ cat /etc/redhat-release 
CentOS release 6.7 (Final)
```
```
$ arch
x86_64
```


### インストール方法

+ javaのインストール

```
# wget --no-check-certificate --no-cookies - --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u45-b14/jdk-8u45-linux-x64.rpm
# rpm -Uhv jdk-8u45-linux-x64.rpm 
```

+ jenkinsのrepo取得

```
# wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
# rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
```

+ jenkiknsのインストールと起動

```
# yum install jenkins
# service jenkins start
```

+ 確認
    + 初期設定はport8080で起動している

```
# curl -I http://127.0.0.1:8080
```

+ jenkinsのversion確認
    + ブラウザでアクセス(e.g. http://192.168.33.12:8080)
       + ブラウザの右下に「jenkins ver. XXX」
       + もしくは  Jenkins > Manage Jenkins > About Jenkins
    + CLIでの確認方法が知りたい…

+ 自動起動設定

```
# chkconfig jenkins on
```


### 基本説明

+ Jenkins本体

```
/usr/lib/jenkins/jenkins.war
```

+ 設定ファイル

```
/etc/sysconfig/jenkins
```

+ 設定ディレクトリ(ホームディレクトリ)

```
/var/lib/jenkins
```

+ 起動スクリプト

```
/etc/rc.d/init.d/jenkins
```
### 追記

http機能がjenkinsにあるため、別個でnginx等をたてる必要はないらしい。
Swiftのenumで定義した値を順番に取得する

enumで定義した値を順番に使用したいときがたまにあります。

デフォルトではこれを実現するメソッドが用意されていないため、独自にenumにメソッドを追加します。

```swift
enum Fruit: Int {
    case Apple = 0
    case Orange
    case Banana

    static let values = [Apple, Orange, Banana]

    mutating func next() {
        let val = (self.rawValue + 1) % Fruit.values.count
        self = Fruit(rawValue: val)!
    }
}
```

このように実装することで、Apple -> Orange -> Banana -> Apple -> ... の順に値を使用できます。

この実装では要素数を取得するために、enumの値一覧をvaluesで定義しています。(Javaではデフォルトで用意されているので、若干不便。。。)

ちなみに、自身の値を変更する操作をしているため、メソッドにmutating修飾子を付与する必要があります。


## おまけ

要素数が分かれば良いので、下記のようにenumの値の末尾にcounterを定義する方法でも大丈夫です。
(enumの要素としてcounterが定義されてしまうので微妙な感じですが。)

```swift
enum Fruit: Int {
    case Apple = 0
    case Orange
    case Banana
    case counter

    mutating func next() {
        let val = (self.rawValue + 1) % counter
        self = Fruit(rawValue: val)!
    }
}
```
引き続きES6でテストを書く。


とりあえず必要なものをnpmでインストール。


```bash
npm install power-assert --save-dev
npm install babel-plugin-espower --save-dev
npm install karma --save-dev
npm install karma-browserify --save-dev
npm install karma-fixture --save-dev 
npm install karma-html2js-preprocessor --save-dev
npm install karma-nyan-reporter --save-dev
```


で、karmaの設定ファイルを初期化して、

```bash
./node_modules/.bin/karma init
```




さらに編集する。
 
```bash
vim karma.conf.js
```

```js:karma.conf.js
    // frameworks to use
    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
    frameworks: ['mocha', 'browserify', 'fixture'],


    // list of files / patterns to load in the browser
    files: [
        'lib/jquery.min.js',
        'test/fixtures/**/*.html',
        'test/test.js'
    ],


    // preprocess matching files before serving them to the browser
    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
    preprocessors: {
        'test/**/*.html': 'html2js',
        'test/test.js': 'browserify'
    },
    browserify: {
      debug: true,
      transform: [
        ["babelify", {plugins: ["babel-plugin-espower"]}]
      ]
    },
    reporters: ['nyan'],

```

あと、package.jsonに以下を入れておく。


```json:package.json
  "scripts": {
    "test": "karma start"
  },
```


で、フィクスチャー用のしこみ。


```bash  
mkdir test/fixtures
touch test/fixtures/index.html
vim test/fixtures/index.html
```

divだけ書いておく。


```html:test/fixtures/index.html
<div id="fixture"></div>
```

で、以下のようなテストを書いて、

```js:test/test.js
import assert  from 'power-assert';
import BPlusA  from '../src/BPlusA.js';
import OneForm  from '../src/OneForm.js';

describe('test b plus a', () => {
  it('1+2は3である', () => {
    const sum = BPlusA.doCalc(1, 2);
    assert(sum === 3);
  });
});


describe( 'test set mode', () => {
  before(() => {
    document.body.innerHTML = window.__html__["test/fixtures/index.html"];
  });
  after(() => {
    document.body.innerHTML = "";
  });

  it('hiddenのmodeのvalueはconfirmである', () => {
    var fixture = $("#fixture");
    fixture.append("<input type=\"hidden\" name=\"mode\" value=\"\">");
    OneForm.setMode('confirm');
    assert( 'confirm' === $('input[name=mode]').val());
  });
});
```


以下で実行。

```bash
npm test
```

結果。

 
```bash
 2   -__,------,
 2   -__|  /\_/\ 
 0   -_~|_( ^ .^) 
 0   -_ ""  "" 

     2 total   2 passed   0 failed   0 skipped
```
久々にbrew updateしたらbrew doctorで brew-caskがconflictしているとWarningが出た


年が代わりましたのでお作法として

```sh
brew doctor
```

したところ、out of dateというありがたいお告げを受けましたのですかさず

```sh
brew update
```

しかし、その後の``brew doctor``でWarningが。

```sh
Warning: You have external commands with conflicting names.

Found command `brew-cask` in following places:
/usr/local/bin/brew-cask
/usr/local/Library/Taps/caskroom/homebrew-cask/cmd/brew-cask.rb
```

調べてみると、どうやらHomebrew-CaskはHomwbrewに一体化された模様
https://github.com/caskroom/homebrew-cask
の冒頭から引用

> Homebrew-Cask
> Important December update: Homebrew-Cask will now be kept up to date together with Homebrew (see #15381 for details). If you haven’t yet, run brew uninstall --force brew-cask; brew update to switch to the new system.
> Important: At some point in the future Homebrew-cask will change its behaviour from linking apps to moving them. See issue #13201 for details.

そんなわけで指定されたコマンドを実行

```sh
brew uninstall --force brew-cask; brew update
```

これで無事Warningが出なくなりました。


参考
http://apple.stackexchange.com/questions/218999/how-to-deal-with-commands-of-conflicting-names-listed-in-brew-doctor
React Native - Mac,Windows環境それぞれで開発して困ったこと

去年の秋頃にAndroidに対応したReact Nativeで勉強も兼ねて
Android,iPhoneアプリを作成しました。

・公式ページ
http://facebook.github.io/react-native/

今回は開発の中で困ったことなどを少しだけ書こうと思います。

#開発環境など
・ソース管理
GitHub

・OS
Mac
Windows

・開発ツール
SourceTree
Atom
Genymotion

・ReactNativeのバージョン
0.16

#Mac,Windows両方で開発
メイン端末でDELLを使っています。
MacはMacBookAirを持っています。
昔からWindowsを仕事で使っていたために開発スピードに雲泥の差があります 笑

ということでGitHubでソース管理しながら家ではWindows、
外ではMacで開発しようとしていましたがここで少し困ったことに。

#MacとWindowsでプロジェクトのファイルが少し違う
ReactNativeのプロジェクトを作成する場合には以下のコマンドを使用します。
（react-native-cliがインストールされていることが前提です）
`react-native init AwesomeProject`

Androidアプリから作成していました。
この問題にぶつかった時はReactNativeが0.15の時だったので今は違うかもしれませんが
WindowsとMacでプロジェクトを作成した時に最初に準備されるファイルが少し違いました。
そのため、Windowsで作ったファイルをそのままGitHubにpushして
Macでpullして動かそうとするとそのままではうまくいきません。

仕方ないのでGitHubにWindows、Macそれぞれプロジェクトを作成してGitHubにpushして
メインソースを片方で編集したらもう一つの方にもマージするという少し面倒くさい形になってしまいました。

#パッケージの中でWindows、Macどちらかしか動かない場合もある
これは作成者側の環境によるかもしれません。
まだ成長中のため、こういったことに何度もぶつかります。
どこが悪いか見つけて作成者側に連絡してあげると喜ばれます。
一緒に作ってる感がでて楽しいところでもあります。

また、まだ開発に足りないものがあったりするので
自分で作って名をあげるチャンスでもあるかなと感じました。

#WindowsでAndroidのapkを作成するコマンドでエラー
Androidフォルダ直下で以下のコマンドでapkの作成を行えます。
`./gradlew assembleRelease`
しかし、Windows環境ではサーバー起動に失敗してエラーになるなどの問題にぶつかりました。
エミュレーターでのテストは問題なく行えます。
色々調べてみると回避策が載っていたり、現在修正中とのIssueが上がってたりしました。
（version0.16で修正したとありましたが未確認です。）

#結果として
ReactNativeの出荷作業等、メインになるところはMacで行う。
（iPhoneアプリもありますし、FaceBookの方々もメインはMacで開発してそうなので）
出先などでちょこっと修正したり機能追加したりする場合に
Windows用のプロジェクトも作っておくと便利。
M-x cider-connect で再接続しようと思ったけどポート番号が分からない。。

# ~/.lein/repl-port か .nrepl-port
を見る
と、コメントで教えてもらいました


.nrepl-port は、lein new で作った
プロジェクトのrootです


以下、前に書いた内容
↓みたいなメンドい事はしなくていいです

# 結果からいくと…
    $ lsof -p  $(jps -m | grep form-init | cut -f1 -d' ') | grep -e 'TCP.*LISTEN'
    java    26244    a  169u  IPv6           11296162      0t0      TCP localhost:39191 (LISTEN)

この場合ならポート番号は 39191

Linux でやってますけど、
MacとかBSD系なら lsof じゃなくて fstat かも
使ってないので分かりません

# なんで `cider-jack-in (C-c M-j`) 使わないの？
emacs と心中する事件があったので、
`cider-jack-in` はやめて
`cider-connect` を使う様にしています。

# 手順は…
専用の端末を作って

    $ lein repl :headless
    nREPL server started on port 50480 on host 127.0.0.1 -  nrepl://127.0.0.1:50480

↑みたいに出たら
emacs から `M-x cider-connect` or `C-c M-c` で
で、`Host`と`Port`を聞かれるので…

この場合なら
`Host` は `localhost`
`Port` は `50480`
を入れる

でも、この方法だとずっと repl に入っていると
最初に出てきたポート番号が流れちゃって
端末のどこに行ったか分かんなくなるので
後から調べたいという話でした。
Browsersync は body タグが無いと動かない

## 概要

今年もよろしくお願いします。

Browsersync の紹介とハマったところを書きます。

## Browsersync

```bash
browser-sync start --server --files "*.js,*.css,index.html",
```

このようなコマンドを実行すると、ローカルに HTTP サーバーが立てられ、そのページがブラウザで開かれます。

`--files` で指定したファイルが変更されると自動的にページがリロードされて便利です。

### インストール

```bash
npm install browser-sync --save-dev
```

`-g` を付けずにインストールして、package.json の run script の `start` に書いておくとたいへん便利です。

### pacakge.json

```json:package.json
 {
  "name": "hogefuga",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "browser-sync start --server --files \"*.js,*.css,index.html\"",
    "compile": "browserify -t coffeeify main.coffee > main.js",
    "watch": "nodemon --watch *.coffee --ext coffee --exec \"npm run compile\""
  },
  "author": "ryohey",
  "license": "MIT",
  "devDependencies": {
    "browser-sync": "^2.10.1",
    "browserify": "^12.0.1",
    "coffeeify": "^2.0.1",
    "nodemon": "^1.8.1"
  }
}
```

`npm run compile` では browserify と coffeeify で   CoffeeScript をコンパイルして js を1つにまとめてます。

`npm run watch` では coffee ファイルに変更があったら `npm run compile` を走らせるようにしています。

監視には coffee コマンドの `-w` オプションや watchify を使ってもいいのですが、nodemon で監視を行うことで、コンパイルする仕組みが変わったりしたときにも watch の方を変更しなくて済むので便利です。

nodemon は coffee を監視、browser-sync は js を監視という関係で、次のような流れでページがリロードされます。

1. coffee を変更
1. js が更新される
1. リロードされる

## ハマったところ

```html
<!DOCTYPE html>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="style.css">
<canvas id="canvas" width="960" height="640"></canvas>
<script src="main.js"></script>
```

そしてやっとタイトルの内容ですが、browser-sync は `body` タグの後に `script` タグを挿入して何やらやっているらしく、こういう `body` が省略された html では動きません。

[Google HTML/CSS Style Guide](https://google.github.io/styleguide/htmlcssguide.xml) を見てから body と html を省略してきたので、思わぬハマりどころでした。
JMX + Jolokia + collectd で Casasndra をモニタリングする

# 概要
Cassandra の 各メトリクスの値を collectd で取得する際の設定メモ。

- [Jolokia](https://jolokia.org/)  ： HTTP 経由で JMX にアクセスできるようにする 
- [collectd](https://collectd.org/) ： Jolokia より cassandra の各メトリクス値を取得する

# 設定手順

**Jolokia を Cassandra に設定**

まずは Jolokia のライブラリをダウンロードして適当な場所に配置

```
# wget http://labs.consol.de/maven/repository/org/jolokia/jolokia-jvm/1.2.0/jolokia-jvm-1.2.0-agent.jar
# mv jolokia-jvm-1.2.0-agent.jar /usr/local/lib/
```


Cassandra に組み込む

```
# vi /etc/cassandra/conf/cassandra-env.sh

JVM_OPTS="$JVM_OPTS -javaagent:/usr/local/lib/jolokia-jvm-1.2.0-agent.jar=config=/etc/cassandra/jolokia/jolokia.properties"
```

```:/etc/cassandra/jolokia/jolokia.policy
<?xml version="1.0" encoding="utf-8"?>

<restrict>
  <http>
    <method>get</method>
    <method>post</method>
  </http>

  <commands>
    <command>read</command>
    <command>list</command>
    <command>version</command>
    <command>search</command>
  </commands>
</restrict>
```

```:/etc/cassandra/jolokia/jolokia.properties
host=0.0.0.0
port=7777
agentContext=/jolokia
backlog=100

# executor=fixed
# nrThreads=5

# user=bragg
# password=secret

policyLocation=file:///etc/cassandra/jolokia/jolokia.policy

historyMaxEntries=10
debug=false
debugMaxEntries=100

maxDepth=15
maxCollectionSize=1000
maxObjects=0
```

設定反映したら http でメトリクス取得できるか確認

```
# curl http://localhost:7777/jolokia/read/org.apache.cassandra.metrics:type=Storage,name=Load
{"request":{"mbean":"org.apache.cassandra.metrics:name=Load,type=Storage","type":"read"},"value":{"Count":147127},"timestamp":1451887795,"status":200}
```
※Load 値取得する場合


**collectd 側の設定**
プラグインは curl_json を使用


(Load値を取得する場合の例)

```:/etc/collectd.conf
LoadPlugin curl_json

<Plugin curl_json>
    <URL "http://localhost:7777/jolokia/read/org.apache.cassandra.metrics:type=Storage,name=Load">
      Instance "cassandra"
      <Key "value">
        Type "frequency"
      </Key>
    </URL>
</Plugin>
```

**その他監視例**

|metrics|JMX パス|Attribute|
|---|---|---|
|Latency(read)|org.apache.cassandra.metrics:type=ClientRequest,scope=Read,name=Latency|OneMinuteRate|
|Latency(write)|org.apache.cassandra.metrics:type=ClientRequest,scope=Write,name=Latency|OneMinuteRate|
|Load|org.apache.cassandra.metrics:type=Storage,name=Load|Count|
|TotalDiskSpaceUsed|org.apache.cassandra.metrics:type=ColumnFamily,keyspace=｛Keyspace名｝,scope=｛ColumnFamily名｝,name=TotalDiskSpaceUsed|Count|
|Pending tasks(各Stage)|org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=CounterMutationStage,name=PendingTasks|Value|


取得できる JMX の一覧は [Command-line JMX Client](http://crawler.archive.org/cmdline-jmxclient/) を利用すると便利


**使用例**

```
$ wget http://crawler.archive.org/cmdline-jmxclient/cmdline-jmxclient-0.10.3.jar
$ java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:7199
$ java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:7199 org.apache.cassandra.metrics:type=Storage,name=Load
```
社内webシステムのあんぽんたんSelect要素に絆創膏を貼る。

先に書いておきますがバッドノウハウかつ解決しきっていないです。あくまでもしたことは絆創膏です。

#やったこと（まとめ）
内容が非常に多いselect要素を、
とりあえずブラウザの検索が可能になるように
地の文に転写するスクリプトを書いた。


#諸悪の根源
***要素が100個近いセレクトボックス***
しかも内容は全部漢字。いじめ以外の何物でもない。
そこから目的のものを見つけて選択するのが辛くてしょうがない。
セレクトボックスの中身はブラウザでは検索できないので、
どこらへんに選択したい要素があるのかがわからないのがポイント。
UIとはなんぞや。

#やりたかったこと
検索付きセレクトボックスにしたかった。
[本当はこんなふうにしたかった](http://jsearchdropdown.sourceforge.net/)

#実際に出来たこと
とりあえず地の文として転写して、
ブラウザ検索でおおよその場所だけでも解るようにした。

#書いたコード
Greasemonkeyで下記のコードを書いた。
う～ん、雑い
未来の自分が困るところといえば、良いところにidやclassが振られていなかったので、eqの擬似セレクタ使ったぐらいか。あとGreasemonkeyでjQuery使いたかったら＠requireすればいいよ。
[greasemonkey内でjQueryを使う](http://blog.shibayu36.org/entry/2012/12/06/222435)

```
// ==UserScript==
// @name        hogehogeName
// @namespace   fugafugaName
// @description 説明文
// @include     https://動かしたいサイトのURL/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js
// @version     1
// @grant       none
// ==/UserScript==
$(".box:eq(1)").append($("select[name*='selectGroup']").text());
```

#結果
ブラウザ検索でその要素の場所がある程度直ぐにわかるようになった。
あと地味にセレクトボックスの中に選択肢が無い事を直ぐにわかるようになったのは大きい。

#とりあえず伝えたかったこと
- 自分が開発していないシステムでも、無理やり絆創膏を貼ることは出来る。
- セレクトボックス要素を使うときは人への優しさを思い出して欲しい。
linux標準教科書より touch tail sort uniq tr diff


# touch

更新情報を更新できる
空ファイルを作成したい時にも使える

```書式
touch [オプション] ファイル
```
オプションでは日時を指定して表示できる

# head tail
ファイルの表示

## head
ファイルの先頭から表示

```書式
head [オプション] ファイル
```
| オプション | 概要 |
|----------|--------|
| -n       | 先頭からn行表示 |
| -c       | 先頭からcバイト表示 |

## tail

ファイルのけつから表示
更新されるログファイルをけつから追うなどもこれを使ってやったりするよね

```書式
tail [オプション] ファイル
```
| オプション | 概要 |
|----------|--------|
| -n       | けつからn行表示 |
| -c       | けつからcバイト表示 |
| -f       | ファイルのけつを表示、ファイルが更新されるたびに表示も変更      |

# sort
ファイルの中身をソートする

```書式
sort [オプション] ファイル
```

| オプション | 概要 |
|----------|--------|
| -r       | 逆順でソート      |
| -k n     | n列目でソート     |
| -n       | 数字でソート      |

# uniq

直前の行と同じ行があった場合に対象業を出力しない

```書式
uniq ファイル
```

# tr
文字列の置き換え 標準出力のものに使えるお

```書式
tr 文字列１ 文字列２
```

# diff

ファイルの差分を表示

```書式
diff ファイル1 ファイル2
```
オプションに関してはこちらも参照 http://itdoc.hitachi.co.jp/manuals/3020/30203S3530/JPAS0247.HTM

| オプション | 概要 |
|----------|--------|
| -c       | 削除行に'-'を追加行に'+'をつけて表示      |
| -u     | 削除行に'-'を追加行に'+'をつけて表示  差異は一つのセクションとして表示   |
ZabbixWeb監視で2回以上のレスポンス異常で発火するトリガーを作る。

# 目標
2回以上レスポンスが異常だった場合のみ発火するトリガーを作る。

## 変更前
```
{Zabbix server:web.test.rspcode[シナリオ名].last()}<>200
```
意味:レスポンスが200じゃない時に発火

## 変更後

```
{Zabbix server:web.test.rspcode[シナリオ名].count(#2,200,"ne")}=2
```
意味：2回のデータ計測中、レスポンスが200じゃない回数が2回の時に発火

## 結論
countは単純なトリガー計測値を数えることだけでなく、
集計した値の比較も行える。
また、集計したい計測期間(#無しだと秒、#有りだと計測回数)を設定してトリガーを設定することもできる。
countは便利。
献立を組合せ最適化で考える

# <i class='fa fa-graduation-cap' /> 問題
医者から1週間の食事のカロリー制限をしなさいと言われました。
また、必要な栄養素A、栄養素Bの最低取得量も指示されました。
なるべく、好きなものを食べるにはどうしたらいいでしょうか？

# <i class='fa fa-graduation-cap' /> 定式化
[組合せ最適化問題](http://qiita.com/Tsutomu-KKE@github/items/bfbf4c185ed7004b5721)の中の割当問題になります。
料理の候補は与えられているものとし、その中からどれを選ぶかを0-1変数$x$で表すことにしましょう。

<table>
<tr><td>変数</td><td>$x_i \in \{0, 1\}$</td><td>$i$番目の料理を選ぶかどうか</td></tr>
<tr><td>目的関数</td><td>$\sum_i{好み_i x_i}$</td><td>$\rightarrow$ 最大</td></tr>
<tr><td>制約条件</td><td>$\sum_i{x_i} = 7 $</td><td>7日分を選ぶ</td></tr>
<tr><td></td><td>$\sum_i{カロリー_i x_i} \le 90 $</td><td>カロリー制限</td></tr>
<tr><td></td><td>$\sum_i{栄養素A_i x_i} \ge 95 $</td><td>最低取得量</td></tr>
<tr><td></td><td>$\sum_i{栄養素B_i x_i} \ge 95 $</td><td>最低取得量</td></tr>
</table>

# <i class='fa fa-graduation-cap' /> pythonで解いてみる
最適化ライブラリは、[pulp](http://qiita.com/Tsutomu-KKE@github/items/bfbf4c185ed7004b5721#%E3%82%BD%E3%83%95%E3%83%88%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)を使います。
まず、ダミーデータを作成してみましょう。

```py3:python
import numpy as np, pandas as pd
from pulp import *
menu = ['牛丼', '親子丼', 'カツ丼', '鉄火丼', 'ねぎとろ丼', 'ちらし寿司',
        '麻婆茄子', 'ドリア', 'オムライス', 'チャーハン', 'カレーライス']
n = len(menu)
np.random.seed(1)
a = pd.DataFrame({
        '料理名': menu,
        'カロリー': np.random.randint(10,20,n),
        '栄養素A': np.random.randint(10,20,n),
        '栄養素B': np.random.randint(10,20,n),
        '好み': np.random.randint(10,20,n),
    })
print(a)
```

 |料理名|好み|カロリー|栄養素A|栄養素B
:--|:--|--:|--:|--:|--:
0|牛丼|18|15|14|10
1|親子丼|13|18|15|16
2|カツ丼|19|19|12|19
3|鉄火丼|18|15|14|19
4|ねぎとろ丼|17|10|12|17
5|ちらし寿司|13|10|14|16
6|麻婆茄子|16|11|17|19
7|ドリア|15|17|17|11
8|オムライス|11|16|19|10
9|チャーハン|19|19|11|11
10|カレーライス|13|12|17|18

解いてみましょう。

```py3:python
m = LpProblem(sense=LpMaximize) # 最大化問題
a['x'] = [LpVariable('x%d'%i, cat=LpBinary) for i in range(n)] # 選択する/しない
m += lpDot(a.好み, a.x) # 好みを最大化
m += lpSum(a.x) == 7 # 1週間分の献立
m += lpDot(a.カロリー, a.x) <= 90
m += lpDot(a.栄養素A, a.x) >= 95
m += lpDot(a.栄養素B, a.x) >= 95
m.solve()
if m.status == 1: # Optimal
    a['val'] = a.x.apply(lambda v: value(v)) # 結果
    print(a[a.val == 1].料理名)
>>>
0         牛丼
3        鉄火丼
4      ねぎとろ丼
5      ちらし寿司
6       麻婆茄子
7        ドリア
10    カレーライス
```

# <i class='fa fa-graduation-cap' /> Docker
Dockerでちょっと試してみたい場合、下記を実行してブラウザでホストを開くと、Jupyterが起動します。ライブラリも[いろいろインストール](https://hub.docker.com/r/tsutomu7/jupyter/)しています。

    docker run -d -p 80:8888 tsutomu7/jupyter

以上
docker-machineを使ってローカルとAWSでhello worldする


# ゴール
パブリックなnginxのイメージを使って、ローカルのVirtualBoxとAWSのEC2それぞれでhello, worldできる

# 前提
MacOSXユーザ
AWSコマンドでEC2が立つくらいにはアカウントとか権限の設定が完了している

# Docker関係の前準備
[こちら](http://qiita.com/hshimo/items/e24b1fbfbf775ec7c941)の記事を参考にDocker Toolboxを入れておく。
ついでにQuickstartアプリケーションも実行しておきましょう。VirtualBox上にDockerホストのインストールまでやってくれるので楽です。

# ローカルでhello worldする

適当なディレクトリでDockerfileとhello world用のhtmlを用意します

```
$ mkdir hello
$ cd hello
# コンテンツを用意
$ mkdir contents
$ echo "hello world" >> ./contents/index.html
# 以下のようなDockerfileを用意
$ less Dockerfile
FROM nginx
ADD ./contents /usr/share/nginx/html
```

## ビルドする

```
$ docker build -t assaulter/web .
$ docker images
REPOSITORY                            TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
assaulter/web                         latest              2ac70d1df768        2 days ago          133.9 MB
```

イメージができている

## 起動する

```
$ docker run -d -p 80:80 assaulter/web
4010baedc76bfd587671dfb5eef4a94f3e72b01e29bbab7b8b13fae242cad20e
```

-pオプションでポートの対応を設定
-dオプションでデタッチモードとして起動

確認する

```
# docker-machine lsして出てきたマシンのIP
$ curl http://192.168.99.100
hello world
```

# AWSでhello worldする

## EC2にDockerホストを立てる

```
docker-machine create --driver amazonec2 --amazonec2-access-key AKI****** --amazonec2-secret-key ***** --amazonec2-vpc-id vpc-*** --amazonec2-region ap-northeast-1 --amazonec2-ami ami-936d9d93 --amazonec2-security-group default aws01
```

よしなに書く
確認

```
$ docker-machine env aws01
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="EC2のパブリックなIP"
export DOCKER_CERT_PATH="ローカルのよしななパス"
export DOCKER_MACHINE_NAME="aws01"
# Run this command to configure your shell:
# eval "$(docker-machine env aws01)"
```

最後に出てきたコマンドでdockerコマンドの向き先をAWSにしておく

## 起動

向き先が変わっただけで、local編とやることは同じ

```
$ docker run -d -p 80:80 assaulter/web
```

あとはcurlしてハロワが見れれば完了。

# まとめ
個人で遊ぶにはこのレベルのデプロイでも良いかもしれない。
が、複数人で弄るときにはElastic BeanstalkがDocker対応してるっぽいので、そちらを利用する感じでしょうか？
telnet を使った VirtualHost の動作確認

#DNS書き換え前に VirtualHost の動作を確認する方法#

DNS 書き換え前でも、hosts ファイルを書き換えてブラウザでアクセスすればいいのですが、もっと簡単に確認する方法です。

名前ベースの VirtualHost は、HTTP の Host ヘッダの文字列を見てVirtualHost を判定します。

##VirtualHost側設定##

たとえば、以下のような VirtualHost 設定を行ったとします。
```
<VirtualHost 192.168.1.1:80>
    ServerName "www.example.com"
    :
</VirtualHost>
```

##telnetでアクセス##
192.168.1.1 の 80番ポートに telnet で接続します。
```
% telnet 192.168.1.1 80
```

###リクエスト###
GET でコンテンツを取得します。この時 Host ヘッダを付与します。
(空行が必要なので、\n を記載しておきます)
```
GET / HTTP/1.0\n
Host: www.example.com\n\n
```

VirtualHost が正しく動作すれば、VirtualHost に定義されたコンテンツが表示されます。
もし設定が正しくない場合は、defaultのコンテンツが表示されます。
Keychain Access.app (キーチェーン)が起動しなくなった

あけましておめでとうございます。
年が明けて仕事を始めようとしたら keychain が起動しないではありませんか。CPUを100%使ったままウィンドウが現れません。困りました。
OS X El Capitan (10.11.2)、Keychain Access (Version 9.0) での話です。

https://discussionsjapan.apple.com/thread/10169080 を参考にして復旧できたのでメモを残しておきます。

まず Keychain のデータをバックアップして、消します。データは `$HOME/Library/Keychains` の下にあります。

```bash
$ cd $HOME
$ tar czf Library_keychains.tgz Library/Keychains
$ rm -rf Library/Keychains
```

次に Keychain Access.app を起動します。
起動しますが、全ての鍵が消えている状態です。

Keychain を起動した状態のまま、バックアップから鍵を書き戻します。

```bash
$ tar xzf Library_keychains.tgz
```

次に Preferences > Reset My Default Keychain を押します。
パスワードを聞かれるので入力します。
この操作で、古い login keychain は `Library/Keychains/login_renamed_1.keychain` という名前で保存されます。

Keychain を終了します。

古い login keychain で新しい空の keychain を上書きします。

```bash
$ mv Library/Keychains/login_renamed_1.keychain Library/Keychains/login.keychain
```

Keychain Access.app を起動します。

やった。元通り。
bashスクリプトで引数とパイプ経由の両方から情報を取得できるようにする。

## 内容
`＜スクリプト名＞.sh abc`または`echo 'abc' | ＜スクリプト名＞.sh`のどちらでも情報をできるようにする。

## テスト用スクリプトファイル作成

▼ test.sh

``` sh
#!/usr/local/bin/bash
data=''
if [ -t 0 ] ; then
  data="$1"
else
  data="$(cat -)"
fi
echo "$data"
```

## 動作確認

``` sh
$ chmod 755 ./test.sh
$ ./test.sh 'abc'
abc
$ echo 'def' | ./test.sh 
def
```
メモ：Rの関数にデフォルト引数があるか無いかを判定する3つの方法 #rstatsj


R の関数の各引数に対してデフォルト引数があるか無いかを判定したい。
例えば、次のような関数があったとする。

```r:R
func <- function(x=1, y) x + y
```

この関数の引数 `x` にはデフォルト引数があるが、`y` にはデフォルト引数が無い。
関数のデフォルト引数を見るには、`formals()` 関数を使う。

```r:R
default_args <- formals(func)
default_args
```

```:結果
$x
[1] 1

$y

```

こんな感じで、デフォルト引数があるかどうかは、人目で見れば一目瞭然である。
しかし、プログラム上で判定するには少し工夫がいる。

## 1. `missing()` を使う

関数内で引数に値が与えられたかどうかを判定する関数 `missing()` を使う。
ただし、そのままでは判定できず、いったん変数に代入する必要がある。

```r:R
missing(default_args[["y"]])
```

```:結果
Error in missing(default_args[["y"]]) : invalid use of 'missing'
```

```r:R
miss_arg <- default_args[["y"]]
missing(miss_arg)
```

```:結果
[1] TRUE
```

## 2. `quote(expr = )` と比較する

`quote(expr = )` によって引数なしの値を作ることができる。
これと同じかどうかで判定できる。

```r:R
default_args[["y"]] == quote(expr = )
```

```:結果
[1] TRUE
```

`missing()` のときとは逆で、この方法では代入を行ってはならない。

```r:R
miss_arg <- default_args[["y"]]
miss_arg == quote(expr = )
```

```:結果
Error: argument "miss_arg" is missing, with no default
```

## 3. よく見かける方法

R のコードを読んでいるとよく見かけるのが、次の方法である。

```r:R
eval(substitute(missing(.), list(. = as.name("y"))), envir = default_args)
```

```:結果
[1] TRUE
```

R のコア関数内ではよくこの方法が使われている気がする。
この方法より、上で紹介した 2 つの方が簡単だと思うのだけど、これを使うメリットが何なのかはよく分かってない。

以上。
μITRONについて

μITRONをよく使うので、メモ程度にまとめます。

# μITRONとは
μITRON(マイクロアイトロン)はTRONプロジェクトのサブプロジェクトであるITRONにおいて作成された、「組み込み用リアルタイムOSの**仕様**」です。μITRONという**OS**があるわけではありません。μITRONに準拠しているOSとして、

+ NORTi
+ TOPPERS
+ PrKERNEL

などがあります。

μITRONはITRONに比べて小型で小規模な8～16ビットのMCU(microcontoller unit)に適用するための機能を含んだ仕様として作成されましたが、その後32ビットの大規模MCUにおいてもμITRON仕様のOSが実装されるようになったため、現在はμITRON仕様がITRON仕様を吸収する形で開発が進んでいます。

国産のオープンソースなリアルタイムOSで、現在RTOS使用のものの半数以上を占めているといわれています。組み込み系製品だけでなく、教育や学習にもよく使用されています。

μITRONの特徴としては、次の点が上げられます。

+ リアルタイム性
+ リソースをあまり消費しない
+ 互換性を考慮している(ハードに依存しない)

上記により性能の低いCPUでも動作する事を可能にしています。 

# リアルタイムＯＳとは
リアルタイムOSとは処理をリアルタイムに実行することを目的としていて、決められた時間内に処理を終えるような処理性能を背負ったOSです。車のエンジンなどのように、決められた時間内に処理を終了させることが必要なシステムを構築可能なOSのことです。高速な動作が必要なわけではありません。
複数のターゲットに同じPodをインストールする場合のBest Practice


新年仕事始めしたらcocoapodsの新しいのが出てたのでインストールしてみたら怒られた。

```[!] The dependency `Google` is not used in any concrete target.```

[Stackoverflow](http://stackoverflow.com/questions/34556991/pod-install-displaying-error-in-cocoapods-version-1-0-0-beta-1)曰く、ちゃんとTargetsを書かないとイカンらしい。(考える前にググる派)

さて、私のプロジェクトは同じコードベースで複数のTargetにビルドしているので、バカっぽく書くと

```
target "A" do
  # 20行ぐらいのpods
end

target "B" do
  # 上と同じpods
end

target "C" do
  # 上と同じpods
end
```

みたいな感じで馬鹿っぽい。

どうしたもんかな、と思ってたのだけど、PodfileはただのRubyなので、podのところは関数にしてまとめちゃえる。
Python脳なので、Ruby感がわからなかったが、[Natashaさんのブログ](http://www.natashatherobot.com/cocoapods-installing-same-pod-multiple-targets/)を参考にした。

```
def install_pods
  # 20行ぐらいのpods
end

target "A" do
  install_pods
end

target "B" do
  install_pods
end

target "C" do
  install_pods
end
```

これでちょっとはましになった。
OSXのapacheをSSLリバースプロキシとして使う

# 前提
OSX El Capitan

# 設定ファイルの準備
```ini:/etc/apache2/httpd.conf
# 89行目あたり(SSLを有効にするならこれが必要ぽい)
LoadModule socache_shmcb_module libexec/apache2/mod_socache_shmcb.so

# 143行目あたり
LoadModule ssl_module libexec/apache2/mod_ssl.so

# 168行目あたり(SSL云々には関係ないが，http→httpsへリダクレクトさせたいため)
LoadModule rewrite_module libexec/apache2/mod_rewrite.so

# 516行目あたり
Include /private/etc/apache2/extra/httpd-ssl.conf
```

```ini:/etc/apache2/extra/httpd-mpm.conf
# 20行目あたり(SyntaxErrorだと怒られるのでコメントアウトする)
<IfModule !mpm_netware_module>
#LockFile "/private/var/log/apache2/accept.lock"
</IfModule>
```

```ini:/etc/apache2/extra/httpd-ssl.conf
# 68行目あたり(SyntaxErrorだと怒られるのでコメントアウトする)
#SSLMutex  "file:/private/var/run/ssl_mutex"

# 110行目以降あたり(鍵は適当に作成しておく)
SSLCertificateFile      "/private/etc/apache2/server.crt"
SSLCertificateKeyFile   "/private/etc/apache2/server.key"
SSLCertificateChainFile "/private/etc/apache2/server-ca.crt"
```

`other`以下に`*.conf`という名前で設定ファイルを置くと勝手に読みこまれる．

```ini:/etc/apache2/other/dev.conf
SSLProxyEngine on

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

ProxyPass / https://test.foobar.com/
ProxyPassReverse / https://test.foobar.com/
```

# apache再起動
```bash
sudo apachectl -k restart
```

あとは`http://<<macのIP>>`にアクセスすれば良い
【2016年版】非デザイナーがひとりでWebサービスつくるときの考え方



# はじめに

非デザイナーでもひとりでWebサービスをつくりたいときがあります。
けっこうよくあります。

もちろんいいデザイナーがデザインしてくれればうれしいですが、
個人開発のプロジェクトなんて、なかなかそうもいきません。

そんな自分がサービスを作るときに
心がけていることを簡単にまとめてみました。

## 事例

ちょうどお正月につくったサービスがあるので、
これを事例として振り返りながら書いてみたいと思います。

![スマホde百人一首](http://karta.notsobad.jp/og.png)
[スマホde百人一首](http://karta.notsobad.jp/og.png)

みんなのスマホを百人一首の取り札にして、
ふつうのカルタみたいにバシバシ叩くというおばかコンテンツです。

新年会のネタにどうぞ。


## エクスキューズ
偉そうにデザイン記事とか書いてるけどこの程度かよ、、というご指摘もあるかと思いますが、同じく非デザイナーでがんばっている誰かの参考になればという趣旨で駄文をさらしてますので、大目に見てもらえるとうれしいです。

またデザイナーの方からの、もっとここに気をつけたほうがいいよなどの有益なフィードバックも大歓迎です。


# メインコンテンツ

## めざすのは60点
まず最初に。
いきなり身も蓋もないですが、非デザイナーのデザインは
60点くらいをめざしましょうという話。

非デザイナーが超絶いけてるデザインをつくるなんて（ふつうは）ムリです。
そんなことできるならデザイナーは要りません。

とはいえ何とかがんばって60点くらいを目指そうと個人的には考えているのですが、
これはサービスの企画やシステムの足を最低限引っ張らないレベルだと思っています。

- せっかくおもしろい企画を考えたのにデザインがひどすぎて見る気にならない
- 本当はちゃんとした世界観のあるサービスなのに、このデザインでは全然伝わらない

という状態をクリアするのが60点の目安です。


※もちろんデザインがひどくても本当におもしろい企画はバズるでしょうが、ほとんどの企画はその中間にあるはずです。
非デザイナーだからってデザインが足を引っ張っちゃうのはもったいないという話です。



## 一点豪華主義
続いてはこちら。一点豪華主義。
非デザイナーがサービスのすみからすみまで
いい感じにデザインするなんて大変です。

そして悲しいことに、大抵の個人開発プロジェクトは
そんなにサービスの隅々まで見られません。

というわけでいつも意識しているのは、当たり前ですが
とにかくトップページのデザインだけに集中してがんばること。


スマホde百人一首の場合は「出オチ」感の強いコンテンツだったのと、
サービスのコンセプトを説明するのが難しかったので、そこを伝えられるように気を付けました。

具体的には、

- タイトルとキャッチをわかりやすいようにして、大きく配置する
- まじめにあほなことをやってる雰囲気を出す
- あとはとにかくお正月感！




## 極力カスタムCSSは書かない
これは前項の一点豪華主義とも通じる点ですが、
とにかくトップページだけがんばって、他のページは極力CSSすら書かない。

じゃあどうするかというと、
いわゆるCSSフレームワークに完全に乗っかるという話です。

非デザイナがデザイン/コーディングのルールを統一しながら
自分でCSS書ききるなんて大変なので、ここはできるだけ楽をします。


今回のスマホde百人一首でも、後ろの方のページは
ほとんどCSS書いてません。

そのなかでもちょっと気をつけたのは、

- BootStrapをやめてSemanticUIを使ってみた
- 見出し帯などにトップと共通の素材を使って、最小限の労力でデザインしてる感を出した

という感じです。


今回はじめてつかったけどSemanticUIおすすめです！
[Semantic UI](http://semantic-ui.com/)


Bootstrapよりも細かいパーツが充実しているイメージです。
ボタンの種類とか[Divider](http://semantic-ui.com/elements/divider.html),[Dimmer](http://semantic-ui.com/modules/dimmer.html)とか。

いろいろてんこ盛りなフレームワークを嫌う人も多いけど、
非デザイナが極力自分でCSS書かずにサービス作ることを考えると、
こうやって選択肢が多いのは魅力です。



## ベンチマークするサイトを探す
順番前後するけど、そもそもデザインの大枠を決める前に
非デザイナーこそこのプロセスは絶対やったほうがいいと思います。

残念ながら非デザイナーはゼロから新しいデザインを生み出すなんて無理ですし、そもそもそんなことを目指さないほうがいいと思っています。

なのでできるだけ自分が今回つくってるサービスに雰囲気、コンセプトが近いサイトを探して、ベンチマークするのが有効です。

それだけだと他のサイトと一緒になっちゃうので、
ベースをベンチマークしたうえで、さっきの一点豪華なところで
ちょっとでも独自性を出せるといいなと思ってやっています。



## 色決めは妥協しないでがんばる
ベンチマーク探しの中に含まれる要素ではありますが、
サービスの色を決めるというのは相当大事な要素だと思います。

トップページでほぼサービスの印象が決まるという中でも、
とくに色の組み合わせで印象は大きく左右されます。

なのでここは妥協せずに、しっくりくるものが見つかるまで
がんばろうと思っています。


スマホde百人一首のときは、最初から和風の文様を使いたいなーと
思っていたものの、色については二転しました。

最初は白黒の文様をメインにしようかなーと思っていたのですが、
インパクトが弱くてもごもごしていたときに、金の市松文様を見つけて変更。

お正月感もすごく出て個人的には気に入っています。

並べてみると雰囲気だいぶ違うのがわかりますね。
![old.png](https://qiita-image-store.s3.amazonaws.com/0/11704/4e57bbb1-d121-25b4-11ce-a6bfdcae2cb9.png)




## 早めにコーディングする
最後に。
ぼくはデザインはSketchを使ってやっていましたが、
ある程度できたらどんどんコーディングしちゃったほうがいいと思っています。

エンジニアなら細かい調整するのもSketchよりCSSいじったほうが早いし、
何よりものができてくるとテンションがあがります。


色は妥協しないとか言ったものの、
行き詰まったらひとまずコーディングしてみるっていうのもありだと思います。
色変えて比べるのも楽ですしね。




# おわり
というわけで、だれの役に立つんだかわからないですが
正月から駄文を連ねてしまいました。

非デザイナーでWebサービス作ってる人がいたら
ぜひご意見きけるとうれしいです。

今年もいろいろ作ろうと思っているので、
何かおもしろいもの作りたいっていう人もぜひお声がけくださいー。


それでは、本年もどうぞよろしくお願いいたします。
数分で Redmineサーバを立ててみる

# はじめに

Docker、破竹の勢いですね。

Redmineは手順はいろいろネットに落ちているのですが、色々と嵌まりどころも存在し、意外と手間なサーバという認識です。
sameersbnさんのDockerのredmineイメージを利用させて頂いて（感謝です！）数分で Redmineを構築できました。
Redmineの添付ファイルや、データベースのストレージなどは、別コンテナに分離して運用するスタイルが王道のようです。

## 検証環境

以下の環境で構築作業を行い、動作検証を行いました。

```
[hoge@localhost bin]$ cat /etc/redhat-release 
CentOS Linux release 7.1.1503 (Core) 
[hoge@localhost bin]$ uname -a
Linux localhost.localdomain 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[hoge@localhost bin]$
```

## イメージのPULL（やりかた１：２分程度）

最初に利用するイメージをPULLしてきます。
それほど大きなイメージではありません。（ですがイメージのダウンロードが発生することは認識しておいてください。）

```
docker pull hidetarou2013/redmine-storage:latest 
docker pull hidetarou2013/mysql-storage:latest 
docker pull sameersbn/redmine:latest 
docker pull sameersbn/mysql:latest
```

## ローカルマシンでbuild するやりかた（やりかた２：１５分程度）

直接githubに上がっているDockerfileからビルドするやり方です。
ネットワーク負荷は小さい代わりに、buildでCPU負荷はかかります。

```
docker build -t sameersbn/mysql github.com/sameersbn/docker-mysql
docker build -t sameersbn/redmine github.com/sameersbn/docker-redmine
docker build -t hidetarou2013/mysql-storage github.com/hidetarou2013/mysql-storage
docker build -t hidetarou2013/redmine-storage github.com/hidetarou2013/redmine-storage
```

## いよいよ構築、ストレージ類は別コンテナ

共有フォルダとしてストレージ類は別コンテナで作成する必要があります。ですが、runまでは必要ないです。
次にDBのコンテナを先に起動し、
次にRedmineのコンテナを起動し、linkさせます。

```
docker create --name redmine-storage hidetarou2013/redmine-storage
docker create --name mysql-storage hidetarou2013/mysql-storage
docker run --volumes-from mysql-storage --name=myredmine1_mysql -d -e 'DB_NAME=redmine_production'  -e 'DB_USER=redmine' -e 'DB_PASS=password' sameersbn/mysql:latest
docker run --name=redmine -d -t -p 10080:80 --link myredmine1_mysql:mysql --volumes-from redmine-storage sameersbn/redmine
```

## Redmine URL

ブラウザで以下にアクセスして終了です。


http://dockerhostname:10080/
admin/admin


## Redmine Information

```
Environment:
  Redmine version                3.2.0.stable
  Ruby version                   2.1.7-p400 (2015-08-18) [x86_64-linux-gnu]
  Rails version                  4.2.5
  Environment                    production
  Database adapter               Mysql2
SCM:
  Subversion                     1.8.8
  Darcs                          2.8.4
  Mercurial                      2.8.2
  Cvs                            1.12.13
  Bazaar                         2.7.0
  Git                            2.6.4
  Filesystem                     
Redmine plugins:
  no plugin installed
```

## ワンライナーでRedmineサーバ構築起動（これが最速構築）

上記のような手順です。これをシェルスクリプトにしておきましたので、ワンライナーでRedmineサーバ構築起動できます。。。

```
curl -fsSL https://github.com/hidetarou2013/ConstructionRedmineServer/raw/master/create_start_redmine.sh | sh
```

手元の時計で、１分５０秒で構築完了。

## ヴァージョン指定して起動

redmine 3.3.0 を使いたい場合

```
$ time curl -fsSL https://github.com/hidetarou2013/ConstructionRedmineServer/raw/master/create_start_redmine1.sh | sh -s -- myredmine33016 33016 latest
```
あとは、NAPTの設定をして

アクセス
http://192.168.xxx.xxx:33016

## まとめ

下手をして躓くと、インストールだけで、数時間ははまってしまったりしていたのですが、これだとそうした手間がいりません。


以上です。
[Sublime Text2]レポート作成テンプレート(LaTeXスニペット)

Sublimeでレポート書くとき用

```report.sublime-snippet
<snippet>
	<content><![CDATA[
\documentclass[12pt, a4j]{jsarticle}
\usepackage{natbib,amsmath,booktabs,setspace}
\usepackage[cm]{fullpage}
\usepackage[dvipdfmx]{graphicx}
 
\title{${1:Title}}
\author{${2:Your Name}}
 
\begin{document}
 
\maketitle
 
\begin{abstract}
\end{abstract}
 
\section{Introduction}
 
${3:Start typing here}
 
\bibliographystyle{junsrt}
\bibliography{all}{}
\end{document}
]]></content>
	<tabTrigger>report</tabTrigger>
	<scope>text.tex</scope>
</snippet>

```
Herokuにmasterブランチ以外をdeployする方法

# Herokuにmasterブランチ以外をdeployする方法

` remote: Pushed to non-master branch, skipping build. `
masterブランチでないとbuild(deploy)してくれないと表示される

⬇️

例えば、heroku-stagingというブランチをdeployしたい場合、
下記のようにコマンドを実行する

```
git push heroku heroku-staging:master --force
```

heroku-stagingというブランチをHerokuのmasterへ
強制的にpushし、deployしてくれる
Linux標準教科書読んだ cat


# cat
ファイル内容表示コマンド

```書式
cp ファイル名
```

| オプション | 概要 |
|--------|--------|
|-n      |行番号を付加して表示|

## catでファイル作成

catをリダイレクトすることでファイルに内容を書き込んで作成できる。
書き込みを終了するときはEOF。下の例だとCtrl+Dで書き込みを終了する

```catでファイル作成
cat > hello.txt
hello
```
Linux標準教科書読んだ cp


# cp
copyコマンド 

```書式
cp [オプション]コピー元　コピー先
```

| オプション | 概要 |
|--------|--------|
|-i      |上書きコピーする際に確認        |
|-p      |コピー元の情報（例：更新日時など）を保持してコピー |
|-r      |ディレクトリコピー|
KDDI CPI（シェアードプラン）で躓いたところをメモ

# 環境

シェアードプラン（共有型）
（個人的感想）採用しているFreeBSDが古い？FreeBSDが正しく運用されていない？

```lang:csh
% uname -a
FreeBSD example.secure.ne.jp 10.1-RELEASE-p19 FreeBSD 10.1-RELEASE-p19 #0: Sat Aug 22 03:55:09 UTC 2015     root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC  amd64
```

# メモ
- 使えるコマンドに[制限](http://acesr.document.secure.ne.jp/tools/sshkeys/)があるため、~~Composerはマニュアルインストールする~~KDDI CPI（シェアードプラン）では、composerはプロバイダーの仕様で使用不可。
- [Composer](https://getcomposer.org/)サイトにwgetで接続できない。*--no-check-certificate*オプションが必要。
- iconvコマンドが使えないので、wgetで常時エラーが発生する。

```lang:csh
% wget --no-check-certificate https://getcomposer.org/composer.phar
Conversion from 'US-ASCII' to UTF-8 isn't supported
--2016-01-04 14:11:10--  https://getcomposer.org/composer.phar
idn_decode failed (9): 'System iconv failed'
Resolving getcomposer.org... 87.98.253.108, 2001:41d0:a:7b19::1
idn_decode failed (9): 'System iconv failed'
```
- vi で常時エラーが発生する
```lang:csh
vi example
ex/vi: Input encoding conversion not supported
```
- intl extensionがなく、makeコマンドも使えないので、CakePHP3が動作することはない。
- （個人的感想）composerが使用できないので、PHPのフレームワークとKDDI CPI（シェアードプラン）は相性が悪い。（水と油とか？）
Rubyを新しいバージョンでインストールする

# Ubuntu 14.04にRuby2.2をインストールする
単純にapt-getでインストールするとRuby1.9.3が入ってしまったのでメモ。

```
$ sudo add-apt-repository -y ppa:brightbox/ruby-ng
$ sudo apt-get update
$ sudo apt-get -y install ruby2.2
```
テトリスをつくってみました　説明１２　クロージャとは？　tetris2.js

クロージャとは？
はっきりしりません。ことわっておきます。


その１、

```js

kansu1 = new function () {
	var i = 0;
	
	this.kansu2 = function () {
		return i++;
	}
}

kansu1.kansu2();   //1
kansu1.kansu2();   //2
```

クロージャー（closer）
ポイントは、変数iを、kansu2関数
からしか参照できない。
これをプライベート変数というようです。
クロージャーでプライベート変数をつかえる。
さて、kansu2はオブジェクトメソッドですね。メソッドは、クロージャーと言える。

その２、

```js

function kansu1 () {
	var i = 0;
	
	return function kansu2 () {
		retrun i++;
	}
}

obj1 = kansu1();
obj1();	//1
obj1();	//2
```

obj1は、iの値を保持しています。それは、iへの参照が誰かが持っているからです。
それは、returnされた関数オブジェクトkansu2です。return i++」この箇所で、iを参照しています。
iへの参照を誰かが持っている限り、iは保持されます。
この特性を、クロージャといいます。とどこかでいわれている気がします。
これは、間違いと感じますね。

その２+（その２プラス）

```js

function kansu1 () {
	var i = 0;
	
	return function kansu2 () {
		retrun i++;
	}
}

obj1 = kansu1();
obj1();	//1
obj1();	//2

さらに、

obj2 = kansu1();
obj2();	//1
```

kansu1()　は、都度別のfunctionオブジェクトkansu1()をnewするわけです。
つまり、それが持つ変数iも別物です。（obj1のオブジェクトがもつ変数iとは違うものです。名前は同じです。）
obj1 === obj2	//false　です。メモリ上の違う場所にそれぞれがあるわけです。
これは、そうできているわけで、javascriptの仕様です。そのまま受け入れるだけのものです。

これは、まったくクロージャーと関係がありません。（newすると違うオブジェクト（メモリ上の違う場所にあるが、
保持する変数名などは同じもの）がつくられるというだけ）しかし、独習javascriptではクロージャーの説明にこの切り口でも書かれていました。まったく初心者を混乱させてしまうだけです。


結論

closureクロージャーとは、関数のなかに定義された関数である。
そして、その使用するときに、上に述べたような一見おかしな振る舞いが見られる。


ポイントは、定義が何かなどという不毛なことにつっこまないで、ここであげた例の理解につとめることでしょうか。
Linux標準教科書読んだ ls


# ls
listの略で、ディレクトリやファイルの一覧を見れる

```書式
ls [オプション][ファイル] 
```

| column | column |
|--------|--------|
|-a      |.で始まる隠しファイルも含めて表示        |
|-l      |long形式で表示        |
|-t      |ファイルの更新時間順で表示|
|-r      |逆順ソートして出力|