OmniAICreator/Qiita-1.07M huggingface dataset:
ビットコインのアドレス生成の仕方

# ビットコインのアドレス

ビットコインのアドレスは公開鍵と秘密鍵のペアです
ビットコインの公開鍵は特に暗号化するのに使うわけでもなくビットコインアドレスという支払い受付用の他人に見せてもよいアドレスにするためだけに使われます

秘密鍵はデジタル署名として使いトランザクションスクリプトを用いてビットコインの残高を動かすのに使います。
一般的な用途の公開鍵（暗号化）と秘密鍵（複合化）という使い方とは違った使い方をします。
（ただし、このアドレスは俺のものだと証明するのにｋ）


普段見かける1xxxxxxxxxx や 3xxxxxxxxxxxなどの形式はビットコインアドレスといい公開鍵にHash160とBase58Checkというチェックサム付きのエンコードをかけて表示しています

## ビットコインアドレス生成の一連の流れ

bitcore-libというjavascriptのライブラリを用いてコードを記載します。
以下のコマンドでインストールできます

```:console
npm i bitcore-lib
```

秘密鍵->公開鍵->ビットコインアドレスと順番に生成していきますが逆にはたどれません。

※注意事項としてここでは秘密鍵を気軽にハードコードしてますがそれはかなり危険な行為です。

### まずはランダムに秘密鍵の生成から

```:javascript
var bitcore = require('bitcore-lib');
var network = 'livenet';
var privateKey = new bitcore.PrivateKey(network);
console.log(privateKey.toString());
```

```:console
 69a97488152a6db9efe3f5c3d96b397cc09114c8267f4e0269830b47c9c04b69
```

### 生の秘密鍵からWIF形式の生成

* WIFはウォレット間で秘密鍵を移動する場合に考案された方式

```:javascript
var bitcore = require('bitcore-lib');
var network = 'livenet';
var privkey = '69a97488152a6db9efe3f5c3d96b397cc09114c8267f4e0269830b47c9c04b69';
var privateKey = new bitcore.PrivateKey(privkey, network);
console.log(privateKey.toWIF());
```

```:console
 cR86SboG3dmS2u43hENCT2xfhtu8UkBcAqLFvJU55LvPw8CAjkFj
```

### WIFから秘密鍵の取り込み

```:javascript
var bitcore = require('bitcore-lib');
var wif = 'cR86SboG3dmS2u43hENCT2xfhtu8UkBcAqLFvJU55LvPw8CAjkFj';
var privateKey = bitcore.PrivateKey.fromWIF(wif);
console.log(privateKey.toString());
```

```:console
 69a97488152a6db9efe3f5c3d96b397cc09114c8267f4e0269830b47c9c04b69
```

### 秘密鍵から公開鍵の取得

```:javascript
var bitcore = require('bitcore-lib');
var network = 'livenet';
var privkey = '69a97488152a6db9efe3f5c3d96b397cc09114c8267f4e0269830b47c9c04b69';
var privateKey = new bitcore.PrivateKey(privkey, network);
var publicKey = privateKey.toPublicKey();
console.log(publicKey.toString());
```

```:console
 02c8fa0c8d1edefcd78177af0d834cba9f49fd1396a214a204aaca81561eea02de
```

### 公開鍵からビットコインアドレスの取得

```:javascript
var bitcore = require('bitcore-lib');
var network = 'livenet';
var pubKey = '02c8fa0c8d1edefcd78177af0d834cba9f49fd1396a214a204aaca81561eea02de';
var publicKey = new bitcore.PublicKey(pubKey, network);
var address = publicKey.toAddress();
console.log(address.toString());
```

```:console
 1HGxskriFLBsnQcG2zb6LyZybJC97b3EZe
```

### ビットコインアドレスを取得

```:javascript
var bitcore = require('bitcore-lib');
var network = 'livenet';
var btcAddr = '1HGxskriFLBsnQcG2zb6LyZybJC97b3EZe';
var address = new bitcore.Address(btcAddr, network);
console.log(address.toString());
```

```:console
 1HGxskriFLBsnQcG2zb6LyZybJC97b3EZe
```

### ビットコインアドレスのバリデーションかける

```:javascript
var network = 'livenet';
var btcAddr = '1HGxskriFLBsnQcG2zb6LyZybJC97b3EZe';
var error = bitcore.Address.getValidationError(btcAddr, network);
if (error) {
  // 無効なアドレス
  var message = error.messsage;
}
```

# 参考ページ

[技術者向けビットコイン講座 第2回 ビットコインアドレスと秘密鍵のフォーマット](http://btcnews.jp/btc-address-privkey-format/)

[ビットコインとは何か? 第3回:ビットコインの仕組み(アドレスの作成から送金まで)](http://jpbitcoin.com/about/whatisbitcoin3)
EC2上のApacheでHTTPとHTTPSを両方やりたい[SSL]


###Apacheは敵だ！
最近ハマりまくっててハゲそう・・・

サイタマ先生はハゲる代わりに人間やめたしハゲるまでは追い込めってことですね。頑張ります。

---

###0.目標
ApacheをインストールしたEC2にHTTP/HTTPSで接続を行います。

```:HTTP(DocumentRoot）
/var/www/html/http_root
```
```:HTTP(DocumentRoot）
/var/www/html/ssl_root
```
こんな感じにそれぞれのDocumentrootを指定します。

---

###1.セキュリティグループ

|プロトコル|ポート|ソース|
|:-----|:-----|:-----|
|TCP|443|0.0.0.0/0|
|TCP|80|0.0.0.0/0|
|TCP|22|0.0.0.0/0|

---

###2.Apache・mod_sslのインストール
ssl通信を利用するためにはmod_sslモジュールを追加します。
これをインストールすると __ssl通信用のhttpd.conf__ である __ssl.conf__ が作成されるので、sslはそれをメインに弄っていきます。

```bash:httpd/mod_ssl_install
suod yum update -y
sudo yum install httpd -y
sudo yum install mod_ssl -y
```

---

###3.オレオレ証明書の作成
[ELBにサーバ自己証明書をインストールしWEBサーバにHTTPS通信をしてみた](http://qiita.com/Yuki_BB3/items/fd410ef29935169aad9d)
で以前証明書の作り方を書いているのでそちらを参考にしてください。

- pribate-key.pem --> SSLCertificateFile（サーバ証明書）
- pribate-key.crt --> SSLCertificateKeyFile（秘密鍵）

この2つのファイルを使用します。

---
###4./etc/httpd/conf.d/ssl.confの編集
先ほども書きました、要はhttpd.confです。
下記設定をバーチャルホストタブの中に記述します。

```
SSLCertificateFile /etc/pki/tls/certs/pribate-key.crt
SSLCertificateKeyFile /etc/pki/tls/private/pribate-key.pem
```
証明書までのパスを指定します。

```
DocumentRoot "/var/www/html/ssl443"
```
Port443で待ち受けるDocumentRootを指定します。
指定したDocumentRoot以下に接続できたことが確認できるページを何か用意しましょう。

---
###SSL接続テスト
この状態でEC2のパブリックIPに対して

```
https://IP-address
```
でアクセスしてみてください。
セキュアじゃないよと怒られhttpsに赤線で打ち消し線が入ると思いますが、用意したページが見れるはずです。

---

###5. /etc/httpd/conf/httpd.confの設定

最後にHTTP(Port80)で接続した際の待受けを設定します。

```
NameVirtualHost *:80
<VirtualHost *:80>
    DocumentRoot /var/www/html/nossl
    ServerName dummy-host.example.com
    ErrorLog logs/dummy-host.example.com-error_log
    CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>
```

デフォルトのhttpd.confに上記の設定を追加（#外しと修正）をしました。
バーチャルホスト設定で:80で受けた際の挙動を示し、/var/www/html/nosslをDocumentrootとしています。
/var/www/html/nossl配下にHTTP通信とわかるようにページを作りましょう。

---
###6. HTTP接続テスト
サーバーのパブリックIPに接続してHTTP接続ができ、先ほど作成したHTTPページがデフォルトで表示されることを確認しましょう。

---

以上でSSLとHTTPの共存設定が完了しました。
これ出来なくてハゲそうだったけど出来て良かった。これで明日も頑張れる。

---
###参考
http://weblabo.oscasierra.net/apache-httpd22-ssl-centos6/
http://www.maruko2.com/mw/Apache/SSL%E8%87%AA%E5%B7%B1%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8mod_ssl%E3%81%AE%E8%A8%AD%E5%AE%9A
Androidでグラフを描写する（MPAndroidChart）

Androidでグラフを描写したい。
Webだと、色々なライブラリの情報があるけど、Androidネイティブだと経験もなく、あまり知りません。Androidでは「MPAndroidChart」が標準のようですね。

##利用準備
1.GradleScriptに追記
2.SyncGradle
3.View（XML）ファイル追加
4.クラスの修正

###1.GradleScriptに追記

```build.gradle
（Module:app）
・・・
・・
//ファイル末尾にに以下を追加
repositories {
    maven { url "https://jitpack.io" }
}
dependencies {
    compile 'com.github.PhilJay:MPAndroidChart:v2.1.0'
}
```

###2.SyncGradle
IDEの上部にある、Syncを押下する。
↓一番左のボタン押下して、５分待ちます。
![syncgradle.png](https://qiita-image-store.s3.amazonaws.com/0/110457/f0fcc961-bea3-dde3-2b7c-10d68cd9c5e9.png)

###3.View（XML）ファイル追加
ファイル名はなんでも良いので、作る

```chart.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.github.mikephil.charting.charts.BarChart
        android:id="@+id/bar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</LinearLayout>
```

###4.クラスの修正
クラスにて、グラフで表現したいデータを投入する

```MainActivity.java
BarChart CObj;
@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.chart);
  CObj = (BarChart) findViewById(R.id.bar);
  CObj.getAxisLeft().setAxisMaxValue(10000f);
  CObj.getAxisLeft().setAxisMinValue(1000f);
  CObj.getAxisLeft().setStartAtZero(false);
  entry();
}

private void entry() {
  List<BarEntry> entry = new ArrayList<>();
  List<String> value = new ArrayList<>();
  value.add("" + (1 + 1));
  value.add("" + (2 + 1));
  value.add("" + (3 + 1));
  value.add("" + (4 + 1));
  value.add("" + (5 + 1));
  value.add("" + (6 + 1));
  value.add("" + (7 + 1));
  value.add("" + (8 + 1));
  value.add("" + (9 + 1));
  value.add("" + (10 + 1));

  entry.add(new BarEntry(1000f, 1));
  entry.add(new BarEntry(2000f, 2));
  entry.add(new BarEntry(3000f, 3));
  entry.add(new BarEntry(4000f, 4));
  entry.add(new BarEntry(5000f, 5));
  entry.add(new BarEntry(6000f, 6));
  entry.add(new BarEntry(7000f, 7));
  entry.add(new BarEntry(8000f, 8));
  entry.add(new BarEntry(9000f, 9));
  entry.add(new BarEntry(10000f, 10));

  BarDataSet data = new BarDataSet(entry, "データ表示");
  data.setColor(Color.BLUE);
  List<BarDataSet> dataset = new ArrayList<>();
  dataset.add(data);
  BarData data = new BarData(value, dataset);
  CObj.setData(data);
  CObj.invalidate();
}
```

実機で確認した結果

![graph.png](https://qiita-image-store.s3.amazonaws.com/0/110457/a2c8ea90-ec2f-1dac-eeca-d955e914639a.png)

縦軸、横軸の表示・感覚も細く設定できるようです。Gradleまわりも含めて、きちんと勉強しよう。。
Doorkeeperで認可エラーをハンドリングしたい時


Doorkeeperで`before_action :doorkeeper_authorize!`の自動で出力される認可エラーを変更したい時はメソッド`doorkeeper_unauthorized_render_options(error: nil)`をControllerでオーバーライドしhashを返す。

doorkeeper-gemのwikiに書いてある
https://github.com/doorkeeper-gem/doorkeeper/wiki/Customizing-the-response-body-when-unauthorized

ただ、これが分かりづらかった。Wikiにあるコードは↓


```ruby:
class ApplicationController < ActiveController::Base
  def doorkeeper_unauthorized_render_options(error: nil)
    { json: { error: "Not authorized" } }
  end
end
```

このhash部分、

```
 { json: { error: "Not authorized" } }
```
 
キーjsonは必須でかつシンボルでないとダメ。


自分の場合はjbuilderでエラー時のjsonを決めていて、それを呼び出しているので次のようにした

```ruby:
class Api::V1::ApiController < ApplicationController
  def doorkeeper_unauthorized_render_options(error: nil)
    @error = WebAPIError.error_authorize(error.description) # WebAPIErrorは自作のクラスなのであまり考えないように

    error_str = render_to_string(template: 'api/v1/error') # render_to_stringで文字列としてjbuilderから取得
    json = "{ \"json\": #{error_str} }" # json:の形に
    JSON.parse(json, {symbolize_names: true}) # symbolize_namesでシンボル化
  end
end
```

.jbuidlerファイルは次のようにしている

```ruby:
json.error do
  json.code @error.code
  json.message @error.message
  json.developer_message @error.developer_message
end
```
 
これは`doorkeeper_authorize`以外でも呼び出して使いまわすためわざわざファイル.jbuilderとしている。
Mac OSX Octaveでhist()でコケた時の解決方法

$ octave
で起動します。

octave:1> w = 10 + sqrt(10)*(randn(1,10000));
octave:2> hist(w)

hist(w)とした時にWARNINGが出たりしてプロットできませんでした。

ちなみにOctaveをMacに入れる際は、
$ brew tap homebrew/science
$ brew install octave
で入ると思います。

で解決は、
http://stackoverflow.com/questions/27172680/dyld-library-not-loaded-usr-local-lib-liblua-5-1-5-dylib
を参考に、
$ brew install lua51
実行しインストールしただけです。

![スクリーンショット 2016-01-26 0.04.41.png](https://qiita-image-store.s3.amazonaws.com/0/105887/6351da35-db14-1633-a74d-f5541f57d3a3.png)

自分の場合は lua51をインストールしただけでプロットできました。
[C++]Singleton

<p>前回、Swiftでシングルトンの実装が楽になった件を発表したが、C++だとどうなるのか試してみた。</p>

<pre><code>class Singleton {
    Singleton* sharedInstance;
    static mutex mtx;
    static atomic<bool> flag_init;
    Singleton* getInstance();
};
mutex Singleton::mtx;
atomic<bool> Singleton::flag_init {false};
Singleton* Singleton::getInstance()
{
    if (! flag_init) {
        mtx.lock();
        if (! flag_init) {
            sharedInstance = new Singleton();
            flag_init = true;
        }
        mtx.unlock();
    }
    return sharedInstance;
}
</code></pre>

<p>もっと簡易に書ける機能があるようだが、基本はこうなるようだ。</p>

関連情報
<a href="https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html">Adopting Cocoa Design Patterns</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk</a>note<br />
<a href="http://qiita.com/m_yukio">Qiita</a><br />
Githubでアカウントを晒した事故に対する対処

この記事ではGithubの公開リポジトリに大切なアカウント情報をアップロードしてしまった時の対処方法と未然に防ぐ方法について紹介します。この記事を読んでAPIKeyなど開発に必要だが機密性が高い情報に対する扱いをどうするかを決める際の参考になれば幸いです。


# そもそもGithubにアカウント情報をアップロードするとなぜ問題？
この記事をご覧になっている方はリテラシが高い方が多いので説明不要かと思いますが一応。

アカウントが公開されると以下のようなトラブルが起きます。
- 不特定多数のユーザから自分のアカウントを使って自分の情報を閲覧・操作できる。それにより悪さをすることができる（本人の知らぬ間に退会してたり…）
- 特にAmazonS3などのAPIKeyを他人に悪用された場合は、気づかないうちに手元に何百万円クラスの請求が行くことがある。

なんというか、例えて言うなら「キャッシュカードに暗証番号書いた付箋をはりつけたまま道端に落としてそのまま放置した」と同じレベルの大問題です。


# 対処方法
具体的な２つの対策を記載します。

## 1. 公開しているアカウント情報を無効にする。
解約する、というのもありますが、アカウントとして利用しているメールアドレスやパスワードを変更していきます。また、APIKeyを使っている場合は、変更できる場合には変更処置を施しましょう。

## 2. githubのcommit情報を削除する
※ここで紹介する対処法は「個人で使っているリポジトリ」に限ります。チームでやっている場合には決して適用しないでください。

リモート上にアップロードしている情報をずばり削除していきます。その手順を以下に記載します。
(1) master以外のブランチを全て削除します。
masterブランチ上で
・git branch -d [ローカルブランチ名]
・git push origin :[リモートブランチ名]
を実行します。

(2) masterブランチのHEADをアカウントcommit前まで戻してリモートにも反映。
・git reset --hard [戻したいcommitのハッシュ値]
・git push -f origin master　　※
(もし、アカウントcommit後に変更した変更内容を反映させたい場合はgit resetで戻した後力技で反映させる…)

※もし以下のようなエラーが出たら、Githubリポジトリ側の設定でmasterブランチがprotected branchとして指定されている可能性があります。指定から外してもう一度行ってください。

```
To https://github.com/LyricalMaestro/AccountSample.git
 ! [remote rejected] master (refusing to delete the current branch: refs/heads/master)
eerror: failed to push some refs to 'https://github.com/LyricalMaestro/AccountSample.git'
```

## 注意点
このような方法をすればリポジトリのページからcommit一覧をたどってアカウント情報にアクセスされる、ということはありませんが、commitの中身自体はGithubに上がったままです。アカウント情報をcommitしたときのハッシュ値がバレてしまえば簡単にアクセスできてしまいます。
このような「ゴミcommit」をなくすためには「git gc」というコマンドがありますが、githubでは定期的にしかこのgit gcを実行しません。一定期間過ぎれば完全にcommit情報そのものが消えますが、消えるまでの間アクセスできてしまう可能性がほんのわずかですがある、ということは肝に銘じておいてください。

# この事故を未然に防ぐには?
上記のような対応はチーム開発では是非したくはないので、事故を未然に防ぐような仕組みを作っておく必要があります。

Androidの場合、解決策の一つとしてassetsフォルダを活用する方法があります。
具体的には
・assetsフォルダ内にアカウント情報を記載したファイル(例えばaccount.txt)を配置。
・account.txtを.gitignoreファイルに追記する。
という方法をとります。

![スクリーンショット 2016-01-25 23.31.26.png](https://qiita-image-store.s3.amazonaws.com/0/14989/e05c4d30-478e-c153-e2c1-3dc18d4a2f26.png)
パワポから抜粋しました。(これは[ソラコムサンプルアプリ](https://github.com/LyricalMaestro/SoracomSampleApp)のコードの一部です。)

(2016/2/2追記)
上記と同じような方法でgradleを使ったやりかたでも実現可能です。
https://gist.github.com/curioustechizen/9f7d745f9f5f51355bd6

# まとめ
アカウント情報を公開リポジトリにアップロードすることは非常にまずいことです。
もしこうなってしまった場合は早急に対処する必要があります。
さらに、このような不測の事態が発生する前にアカウント情報をアップロードしない仕組みづくりを心がけることをおすすめします。

# 参考サイト
Githubでアカウントを晒した事故に対する対処（SlideShare）
http://www.slideshare.net/LyricalMaestro/github-57410067
<- ここで記載している回避方法はgit push -fを使わないめんどくさい方法が記載されています。。。

日本Androidの会埼玉支部2016年1月定例会に参加してきました 
http://lyricalmaestrojp.hatenablog.com/entry/2016/01/25/005213
  <- ここで発表して得たフィードバックが今回の記事に反映されています。

Githubのmasterブランチを削除して、masterを置き換えた (^o^;)
http://qiita.com/pugiemonn/items/34b56b1aa757e33133e4

反則技 git push -f
http://qiita.com/ppworks/items/94c0107d98e55f903ea9
Capistrano ですぐにデプロイできる Rails 環境を Ansible で自動構築する

### はじめに

最近 **Ansible 2.0** がリリースされました。ちょうどバイト先の方でも Rails の開発環境用のサーバを構築する機会があったので、毎回構築するのは面倒ということも有り、Ansible で自動化してみることにしました。[コードはGithubに公開](https://github.com/travelist/ansible-rails) してます。Ansible のスクリプトに加えて、**Capistrano や Unicorn の設定ファイルもおいてある** ([このへん](https://github.com/travelist/ansible-rails/tree/master/rails_config)) ので、コピペすればすぐに Rails をデプロイできる環境が作れる。。。はず！

( **追記**: 自動化せずに手でやる場合は [Ruby on Rails を Capistrano を用いて Ubuntu サーバ (with MySQL, Nginx) にデプロイした時のメモ](http://qiita.com/shimashima/items/2ed08e6e3e54a24b7e8c#_reference-20efe9263b9a82a7beca) が参考になるとおもいます。ここに書いてあるようなことが今回は Ansible 化されています。 )

**Ansible 力(?)** がまだ未熟なのでコードはリファクタリング出来そうだなーと思ったりしつつ、ここでは作ったコードの使い方を書きます。サポートしている OS は **さくらVPS の Ubuntu 14.04** のみで(笑)、以下のものに関する環境が構築されます。

- **Ruby on Rails**
- **Unicorn**
- **MySQL**
- **Nginx**
- **Rbenv**

あとは今後の必要に応じて追加すると思われる。ただ、あまり複雑怪奇なものにはしたくなくて、 staging 環境くらいの**そんなに重要じゃない環境構築をサクッと作りたい時に使う**くらいを意図しています。デプロイしたけど Unicorn が更新されない、Nginx が 502 エラーを返す、のような部分に今後時間を浪費をしないことが目標。

### 使い方

- **コードのダウンロード**

```
git clone https://github.com/travelist/ansible-rails.git
```

- **Ansibleのインストール**

```
pip install -r requirements.txt
```

- **デプロイ先のIPの指定**
 - `ansible/hosts` のなかにあるIPアドレスを編集する

```ansible/hosts
[rails]
000.000.000.000 # ここを編集してください

[vagrant]
192.168.33.3 # こっちは Vagrant 使ってデモ用なので無視で。
```

- **設定ファイルの編集**
 - `ansible/group_vars/rails` を編集する

```yaml:ansible/group_vars/rails
---
rails:
  application: hello_world # アプリケーション名 (/var/www/hello_world ←)

ruby:
  version: 2.2.3 # Rbenv で指定した Ruby をインストールします

nginx:
  url: www.hello_world.com # URL 以外はテンプレートに書いてあります。

mysql:
  root_password: 123456789 # MySQL のインストール時に root パスワード決めるので。
  rails_username: rails # Rails 用にユーザ作ります
  rails_password: 123456789
  rails_database: rails_db # Rails 用にデータベース作ります
```

- **パスワードなしで sudo が可能か確認**
 - SSHでデプロイするサーバーにログイン。 sudo がパスワードなしで実行できない場合は以下のコマンド実行

```
echo "username ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
```

- **Ansible の実行**
 - 気長に待ちましょう。

```
ansible-playbook -i hosts rails.yml -u username
```

**以上で Rails のデプロイができる最低限のサーバが構築されたとおもいます。(たぶん！)**

裏では `group_vars/rails` に書いた設定ファイルを元に、**rbenv を用いて指定した Ruby のバージョンのものをインストール**、**Nginx の設定**、**MySQL の設定**、**各種Rails を実行するのに必要なパッケージを`apt-get`**しています。
この後は Capistrano や Unicorn の設定をすればデプロイができるはず。

`rails_config` ディレクトリ以下に **Unicorn や Capistrano のサンプル設定ファイルがあるので、コピペして少し編集すればいろいろ設定する時間も短縮できる**はず。

### まとめ

Ansible を用いて Rails 環境の構築を自動化しました。
これまで(そしてこれからも) Rails のサーバ設定をすることがあったので、ここで自動化したおかげで今後の作業時間を減らすことが出来たと思います。
今後は必要に応じて修正したり、サーバの設定を変えるようなタスクを追加していこうとおもいます。
AWSでPublic DNS(パブリックDNS)が割り当てられない時の解決法

#AWSでPublic DNS(パブリックDNS)が割り当てられない時の解決法
右も左もわからないまま、入門記事通りにAWSでインスタンスを作成してもパブリックDNSが割り当てられないここがしばしば。
パブリックDNSが割り当てられていないとsshでアクセスできません。
意外とググっても日本語の情報がひっかからなかったのでメモ。

#コンソールを使用してVPCの設定を更新
1.Amazon VPCコンソール(https://console.aws.amazon.com/vpc/ )にアクセス。
2.画面左枠の「Your VPCs(VPC)」より対象のVPCを選択。
3.「Summery(概要)」タブの情報を確認。
DNS resolution(DNS 解決):
DNS hostname(DNS ホスト名):
の値をそれぞれ確認。
4.値を更新
「no」または「いいえ」になっている場合。
「Actions(アクション)」バーを開き「Edit DNS 〜」を選択。
該当の箇所を「yes」または「はい」に変更し、保存。

以上でEC2コンソール(https://console.aws.amazon.com/ec2/ )からpublic DNS nameが確認できると思います。
3Dプリンター出力後の表面処理(パテ編)

最近、3Dプリンタでつくった、おきあがりこぼしを展示しました。その際に、表面処理をしたので、使用したパテをメモとして残します。自分の感想なので、違うところもあるかもしれません。また、写真は今回使用した様子と違うものもあります。

## 作ったものの詳細
![KOBOSHI](https://goo.gl/ZD00AY "Koboshi")

* PLA
* 全体の大きさ 約70*70*140 (みかん3つ分くらいの大きさ)

## 3D出力後の積層
![3D出力後の積層](https://goo.gl/qOpyvB "3D出力後の積層")
上の画像のように、3Dプリンタで出力したままだと、表面に積層跡がのこります。この積層を消して、表面をつるつるにして塗装したいと思いました。

## いろんなパテ
今回試しに使用したパテは、タミヤ製ポリエステルパテとセメダインのエポキシパテ(プラ用)の２種類です。それぞれに特徴があって、使いどころが重要だと感じました。

### タミヤ製ポリエステルパテ
![パテ塗り後](https://goo.gl/DsWrWd "パテ塗り後")

#### 感想
3Dプリンタとの相性は抜群だと思います。まず全体的にぬって、1日放置します。その後サンドペーパーなどのヤスリで全体をやすれば、かなりの積層が消えます。この工程を2回繰り返せば、かなり綺麗になると思います。今回は、２回のパテ盛りをし、その後サーフェーサーをスプレーして、塗装に入りました。

#### 備考
全体に塗るときに少しコツがあります。このポリエステルパテは5分くらいで硬化が始まり、硬化し始めると、少しパテが塗りにくくなったり、だまになったりして、あまり綺麗に塗れません。すこしずつ出して、すこしずつ塗るのが、一番のコツだと思います。やすりが手作業なので、出力した形を崩さないように、あまり盛りすぎないことが大切でした。

* __硬化時間__ 6時間以上
* __研磨のしやすさ__ そんなに硬くない。研磨しやすい。
* __色__ うすい黄色
* __購入場所__　ロフトのプラモデルコーナー

### セメダイン エポキシパテ(プラ用)
#### 感想
これは、使いどころが限られました。3Dプリンターの表面処理に使うには、あまり向いていないように思いました。このパテが真価を発揮するのは、一部分だけが欠けている場所に、使用する場合でした。表面全体に塗ることは、あまり得意ではありません。このパテが実際に役立ったのは、内部の見えない部品の強度が足りずに折れてしまったところに、補強と接着の用途として、使用したときです。

#### 備考
使用方法については、動画が参考になりました。
>  [エポキシパテ使用動画](https://www.youtube.com/watch?v=bUmAOGsp16E "エポキシパテ")

リンク先の動画のように、水を使わないと、全く扱えなかったです。付属の手袋にエポキシパテがまとわりついて、混ぜるどころではなかったので、きちんと __水を使いましょう__ 。

* __硬化時間__ 6時間以上
* __研磨のしやすさ__ すこし硬い。研磨できないほどではない。
* __色__ 水色
* __購入場所__ 東急ハンズ

### 溶きパテ (Mr.SURFACER 500)
今回は使用していないですが、以前使用したものに、溶きパテというものがありました。
![溶きパテ]( https://goo.gl/Tv8HNZ "溶きパテ")

#### 感想
これは、かなり仕上げに近い段階で使うといいと思います。例えば最初に取り上げたポリエステルパテの研磨2回目後に、最後の細かい傷を消すために使用するのがベストだと思います。液体なので、薄く全体に塗れます。

#### 備考
最初は薄めて、筆塗りで使用していました。その後、スプレーに入れて使用しました。パテというよりサーフェーサーに近いかもしれません。

* __硬化時間__ 3時間以上
* __研磨のしやすさ__ 簡単に削れます。
* __色__ 灰色と白の種類を見かけました。
* __購入場所__ ロフトのプラモコーナー


### 光硬化パテ
もう一つ、いいパテがあって、それが光硬化パテです。とても使い勝手がよかったです。
> タミヤ製光硬化パテ
> ![光硬化パテ](http://goo.gl/WiXNGF "光硬化パテ")

#### 感想
たしか、すこし値段が他のより高かったんですが、3Dプリンタで出力した際に、再出力するほどでもないんだけど、かなり凹んでいるところ、穴の空いてしまったところ、などに使用しました。硬化時間もポリエステルパテに比べてかなり早く、一部を埋めたいときには、かなりお世話になったパテです。

#### 備考
これは、光で硬化するパテです。デスクライトで硬化していました。

* __硬化時間__ 30分程度
* __研磨のしやすさ__ 簡単に削れます
* __色__ 固まると、半透明の黄色になります。
* __購入場所__　ロフトのプラモコーナー

## 最後に
### ABSとPLAでの違い
よく3Dプリンタで使われるフィラメント素材にPLAとABSの2つが挙げられると思います。私はいつもABSを使って研磨、塗装していたのですが、今回はPLAを使用してみました。塗装して仕上げるためには、どちらが適しているのかというと、手でやすって、塗装するだけであれば、正直どちらも __大差ないな__ というのが感想です。以前PLAが硬くて削りずらいと聞いたことがありますが、手で削ってみる分には、PLAが明らかに硬いとは今回思いませんでした。

__耐熱や強度などの観点でみるとABSのほうが優れているとか、出力後の変形が少ないのはPLAとか、そういう観点でこの２つは使い分けたほうがよさそうです。__

### 3Dプリンタの情報共有はどこでしよう。。。
プログラミングとは関係ないですが、markdownで情報共有しやすいのがQiitaだったのと,3Dプリンタというタグが少し使用されていたので、Qiitaを利用しました。
GNU screen チートシート

# Why screen

screenはオワコン、時代はtmuxだと言われて久しいですが、tumuxにはシリアルコンソールに接続する機能がありません。
マイコンやらシングルボードコンピュータやらシスコルータやらをいじってるとシリアルコンソールを触る機会が多いので、同種のツールを2つ使うのもなんかだるいなあ・・・ということでscreenを使ってます。


# .screenrc

```
vim ~/.screenrc
```

とかで編集する。

```.screenrc
startup_message off 
vbell off 
caption always "  %n %t  $USER@%H"
termcapinfo xterm* ti@:te@
term xterm-color
shell bash
```

# ローカルからワンコマンドでリモートのセッションにアタッチする

sshでログイン
↓
`screen -r` あるいは `screen -x`
↓
ウィンドウ移動

とやるのがだるいので、以下のようにしてみた。

```bash
ssh hostname.io -t "screen -x -p 0"
```

`-p ウィンドウ番号`でウィンドウを指定して一気にアタッチできる。

ここまでやって気づいたんだけど、sshでいきなりscreenにアタッチするなら、ウィンドウ複数開かなくても、Terminalのほうでタブ複数開いたらよいんではないか？
そしたらローカルのシェルを操作するのと同じ使い勝手になる。

以下のようにしてみた。

```bash
ssh hostname.io -t "screen -D -R session_name"
```

`-D -R セッション名`でセッション名を指定してセッションにアタッチ、該当する名前のセッションがなければセッションを作成になるようだ。
これをそれぞれ別のセッション名で、Terminalの各タブから実行する。

http://serverfault.com/questions/38417/reattach-or-create-a-named-screen-session-or-persistent-screen-sessions

# ウィンドウの操作

## ウィンドウの上下分割

```
Ctrl-a S
```

## ウィンドウの左右分割

```
Ctrl-a |
```

## ウィンドウ間の移動

```
Ctrl-a <TAB>
```

## ウィンドウの分割をやめる

```
Ctrl-a Q
```

## ウィンドウを閉じる

- ウィンドウ内のシェルはkillされます

```
Ctrl-a k
```



# 参考

- https://qiita.com/zenpou/items/7355092be95d65a43282
タイムアウト設計

# タイムアウト設計なんて怖くない
エンタープライズなシステムでは、タイムアウト設計についてドキュメント化されていることが多いでしょう。タイムアウト設計、というと私の会社ではできる人が限られています。その理由は「難しいから」ではなく「何だか得体がしれないから」なのだと、私は思っています。そこで、どんな人でもタイムアウト設計ができるように、私なりの考えをまとめておきたいと思います。

## 処理に上限時間を設けるのはなぜ？
タイムアウト設計では、各ポイントに上限時間を設けます。なぜ上限時間を設けるのでしょうか？一般的な理由はこうでしょう。

 * 異常な事態のため、異常に時間がかかっている処理があった場合、その処理がいつまでもシステムの資源（DB接続、HTTP接続、APサーバーのスレッド、など）を占有してしまう。この結果、正常に処理できるはずの要求が処理できず、スループットが低下する。システムの資源を速やかに解放することでこのような事態を回避するため、各ポイントで上限時間を定める。
 * 上記のような**異常**を検知するため、各ポイントで上限時間を定める。
 * エンドユーザー(PCを操作するオペレータ、スマホを操作する一般ピープル)を待たせ過ぎないようにする。

なのですが、素朴な疑問がいくつか浮かびます。

 1. 正常に処理できるはずの処理に資源を譲る、といっても、異常が発生しているような状況では他の処理も正常に処理できない場合が多いのではないか？
 2. エンドユーザーに早く応答を返したとしても、エンドユーザーはリトライしてくるだけではないのか？

 * 1.については、確かにその通リですが、そうでない場合もあります。そうでない場合に、せめて正常な処理だけはうまくいくようにしたい、巻き込みたくない、というのが上限時間を設ける目的なんですね。
 * 2.についても、その通リです。異常が一時的なサーバー負荷の高騰なのであれば、リトライすることでうまくいく可能性は高いでしょう。そのような場合は特に問題はありません。そうでない場合は、障害として何らかの形で検知され、SEが（死ぬような思いで）障害対応をすることで解決を目指すことになります。

極端な話、上限時間を設けなかったらどうなってしまうのでしょうか？本当に、困るのでしょうか？

 * 資源が占有され続けた場合、資源が定常的に少ない状態となりますから、SLAの通リのスループットが出ず顧客に怒られるかもしれません。
 * 資源を占有するような要求が次々とやってきた場合、資源はどんどん占有され、スローダウンを引き起こしてしまうでしょう。正にセキュリティ攻撃、という感じですね。一方、何らかの不具合が原因なのであれば、最悪の場合、上限時間を設定したととしても、次々と上限を超過してエラーが多発するでしょうから、どのみち大騒ぎということになりますが・・・。まあ、スローダウンしてシステム停止、よりはマシでしょう。不具合が発生したとしても、上限時間を設けるのはベターなのです。
 * 処理量が少ないうちはエンドユーザーからの苦情なく処理できるかのように見えたとしても、もっと量が増えれば破綻する可能性があります。早いうちに「何だか遅いな」と気付ければ早めの対処ができるでしょう。これができなければ、処理量が増えてきた場合にエンドユーザーが「遅いな、使いにくいな」と感じてしまい、人気がなくなってしまうかもしれません。

少しそれましたが、先に進みましょう。
上限時間を設けるのがどうやら良さそうなのですが、闇雲に上限時間を設定すればOKというものではありません。

## タイムアウトを設計する、とは？
更新系の処理では上限時間が不適切に設定されていると、色々な「不整合」が発生し得ます。例えば、以下のようなシステム構成だとしましょう。




このような不整合が発生しないように、システムの上限時間は適切に設定する必要があります。
ここに「設計」という概念が入ってくるわけです。
そもそも入り口の上限時間をどうするか、というのも「設計」なのですが。

ただし、このような不整合を完全に防ぐことはできません。可能な限り不整合を防ぎましょう、というのがタイムアウト設計なのです。
ViewやヘルパーやControllerにおいて、コントローラ名やアクション名で条件分岐する方法

Viewやヘルパーで、コントローラー名やアクション名で条件分岐する方法ないのかなー、と思って調べてみたらありました。 :laughing: 
rails(ruby)の便利さには、びっくりですね。

## （View・ヘルパー）コントローラー名で条件分岐する方法

railsにおいてコントローラー名は``` controller.controller_name```で取得することができます。なんと便利なんでしょう。

【使用例】
例えば、contactsコントローラーに使うとしたら、こんな感じ

```rb
if controller.controller_name == "contacts"
  puts "お問い合わせありがとうございます。"
else
  puts "ご利用ありがとうございました。"
end
```

## （View・ヘルパー）コントローラーのアクション名で条件分岐する方法

同様に```controller.action_name```で取得できます。

【使用例】
こちらもcontactsコントローラーで使用してみます。contactsコントローラーには、newアクションとcreateアクションがあります。

```rb
case controller.action_name
when "new"
  puts "まだお問い合わせは完了していません"
when "create"
  puts "お問い合わせありがとうございました。"
else
  puts "申し訳ございませんが、最初からやり直してください"
end
```

## （Controller）コントローラー名で条件分岐する方法

コントローラーでは、```controller_name```で取得できます。



## （Controller）アクション名で条件分岐する方法

コントローラーでは、```action_name```で取得できます。


何か修正点・改善点・疑問点などありましたら頂けると嬉しいです。 :smile:
シェルスクリプト　その６

今回は[前回](http://qiita.com/woolon/items/6366dd6dac12387d84b7)出てきた"sed"コマンドについてのメモです。
例：$sed -e "s/abc/def/g"

・"s/abc/def/"で行の一番最初の文字列"abc"を"def"に置き換え。

・"s/abc//"で行の一番最初の文字列"abc"を削除。

・"s/^abc//"で行頭だけを文字列"abc"とマッチングすれば削除。

・"s/abc\$//"で行末だけを文字列"abc"とマッチングすれば削除。

・"s/abc/abcdef/"で文字列"def"を"abc"の後に追記。

・"s/^/def/"で文字列"def"を行頭に追記。

・"s/\$/def/"で文字列"def"を行末に追記。

・クォテーション内のドット(.)は任意の一文字で、アスタリスク(\*)は直前の文字の繰り返し(０個も含む)。この２つを組み合わせた(.*)結果は行全て。

・文字列の切り取り
　-"s/abc.\*//"で文字列"abc"以降を消去。
　-"s/abc.\*def//"で文字列"abc"~"def"までを消去。

・大文字と小文字の入れ替え "$cat file | tr '[A-Z]' '[a-z]' > lowerfile"

・タブは"<tab>"、スペースは"<space>"と表記する。 

・"/abc/d"で文字列"abc"を含んだ行を削除。

・""n,ms/abc/def/g" file"でfileのn~m行目の文字列"abc"をすべて"def"に置き換え。

・""1d" file"でfileの一行目削除。

・""1,nd" file"でfileの1~m行目の削除。

・'\$d'で最終行削除。注：シングルクォート内はすべて文字と認識されるので'$'の前の'\'は必要ない。

・"sed -n 'mp' file"でfileのm行目をプリント。

・'n,mp'でn~m行目をプリント。

・'nq'で最初からn行目までプリントできるが、'q'はquitで"sed"コマンドが終了されるので続けて他の処理をできない。

・'!'をクォテーション内の処理コマンド('d'や'q')の直前に置くと逆の操作をさせる。

・"grep -n '.*'"でファイルの行すべてに表示するとき行番号をつける。

参考資料：入門UNIXシェルプログラミング　改訂第２版　第６，７章（発行所：SBクリエーティブ株式会社）

[シェルスクリプト　その１](http://qiita.com/woolon/items/7bcfa18320f0abd74ca0)
[シェルスクリプト　その２](http://qiita.com/woolon/items/c69482474ba1564d5057)
[シェルスクリプト　その３](http://qiita.com/woolon/items/59c26dcb040adefae0f3)
[シェルスクリプト　その４](http://qiita.com/woolon/items/514db422f8ccea0ca94c)
[シェルスクリプト　その５](http://qiita.com/woolon/items/6366dd6dac12387d84b7)
[シェルスクリプト　その７](http://qiita.com/woolon/items/4e3c986587f428742b79)
CoreOSの固定IPアドレス設定


CoreOSで固定IPアドレスを設定する方法には二つある。
　1.cloud-confgで設定
　2./etc/systemd/network下に設定ファイルを置く

ここでは2の方法を示す。

/etc/systemd/network下にstatic.networkというファイルを置くことでIPアドレスの設定を行う。
とはいえ、いきなりstatic.networkを編集するのではなく、まずネットワークインタフェース名をifconfigで確認することから始める。

以下は実行例
```
$ ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.42.1  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:fbff:fea9:2f7f  prefixlen 64  scopeid 0x20<link>
        ether 02:42:fb:a9:2f:7f  txqueuelen 0  (Ethernet)
        RX packets 181357  bytes 139012109 (132.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 188634  bytes 21561698 (20.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.211  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::20c:29ff:fea8:30d  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:a8:03:0d  txqueuelen 1000  (Ethernet)
        RX packets 16395876  bytes 1498915601 (1.3 GiB)
        RX errors 1  dropped 1397005  overruns 0  frame 0
        TX packets 286603  bytes 149610630 (142.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 19  base 0x2000
```

ens33がターゲット。
では改めて``/etc/systemd/network/static.network``を作成。
```
[Match]
Name=ens33

[Network]
Address=192.168.1.5/24
Gateway=192.168.1.250
DNS=192.168.1.1
```
ここまで終わったら、再起動してもよいし、以下のコマンドを叩いてもよい。
```
sudo systemctl restart systemd-networkd
```
以上
Python初心者がScikit-imageの例題を自分用に使うためのヒント6　Pythonのコードを改善する

　これまでに[scikit-image](http://scikit-image.org/)のPythonのコードを改変してきました。しかも、とりあえず動けばいいというレベルで紹介してきました。いつまでもそれではあんまりなので、Spyder統合環境を使いながらPythonのコードを改善していく方法を紹介します。
　今回の記事は、特に初心者向きの記事です。既にPythonを使いこなしている人には何も有益な情報は含まれていません。


###**Spyder統合環境を利用してコードを改善する**
 Spyder統合環境を利用してコードを改善する方法は、次のブログ記事に詳しい。そこから、よくチェックする部分を記します。

ブログ記事　[【シリーズ】「pythonとOpenCVを用いたCVプログラミング」 第5回：SpyderのGUI操作](http://gyao.yahoo.co.jp/player/00220/v12056/v1000000000000001123/?auto=1&rep=2)

####**" 未使用のモジュールやオブジェクトの警告"**

がでるので、不要なimportを削除したり、未使用のオブジェクトを計算しているコードを削除します。

####**"後端の余分なスペースの除去(source > remove trailing spaces)"**
をしておくことで、SVNなどでバージョン管理する際に、意味のないdiffを生じることを抑制できます。
"pylintによるコード解析 (soucer > run pylint code analysis)"
を実行することで、Pylintで出てくるコーディングスタイルのチェックを行うことで、読みやすくすることができます。

####**代入演算子、比較演算子の前後に１つだけスペースを入れる。**
####**","の後には１つだけスペースを入れる。**
####**if文の条件式に不要な()をつけない。**
ようにコーディングスタイルをそろえるようにチェックできます。

###**ドキュメンテーション文字列を書こう**
Python チュートリアル [ドキュメンテーション文字列](http://docs.python.jp/2/tutorial/controlflow.html)
ドキュメンテーション文字列は

```.py
def square(x):
    """return square value"""
    return x**2
```

などのように書きます。
`"""`もしくは`'''`3重引用符を用いると複数行にまたがる文字列を扱うことができます。
そのようにしてドキュメンテーション文字列を書いておくと、次のようにhelpを実行して使い方を表示させることができます。


\>>>help(square)
square(x)
    return square value

\>>> 
などとして、他のライブラリと同じようにhelpが使えます。


unicodeを使っている場合には
u"""ドキュメンテーション文字列"""
のようにuの文字を使います。
 Python 標準ライブラリ　[シーケンス型 — str, unicode, list, tuple, bytearray, buffer, xrange](http://docs.python.jp/2.7/library/stdtypes.html#str-unicode-list-tuple-bytearray-buffer-xrange)
> Unicode 文字列はほとんど文字列と同じですが、 u'abc' , u"def" といったように先頭に文字 'u' を付けて指定します。

ファイル中にunicode文字列を含む場合には、スクリプトの冒頭に文字コードを指定を追加しておきます。(追加がない場合、pythonインタプリタが文字列の処理に失敗してエラーを生じることがあります。)

```.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
```

####**pylintが出すwarningを抑制するには**
Pythonソースコードの文字コードの指定の後に以下の行を追加します。
\#pylint:disable=C0103

文字コードは、スクリプトをテキストファイルに保存する際の文字コードにもきいてきます。

####**名前空間を使って出所を明らかにしよう**
from pylab import *
のようなモジュールを名前空間抜きで全てimportする書き方は推奨されていません[注1]。
import pylab
のようにモジュール名を明記するやり方を使ってください。


####**C++化するのはアルゴリズムをきれいにしてから**
　C++で実装しなければならないことは多いことでしょう。アルゴリズムを試行錯誤しなければならないときには、データ構造はむちゃくちゃ、変数名はimg2とかtmpとか推奨しかねるでたらめのもの。最初思いついたときとは別の役割をしているので、変数や関数名が、実際のしていることと乖離してしまっているなどということは、言語の種類によらず起こりがちです。使っていない変数が残っていたりとか、不要なimportもしくは不要な#inculdeが残っていたりとかしがちです。
　同じ処理をする場合だったら、Pythonの方が行数が少なく、処理の見通しがよいため、リファクタリングがしやすいはずです。Spyder統合環境やpylintなどは、Pythonでのリファクタリングをしやすくしてくれるでしょう。そうして十分明快なコードを書く。そしてテストしたうえで、プロファイルし、精度を損ねないで実行時間を短縮する方法を確かめる。そういった作業は、pythonの方がC++よりも数倍以上やりやすいと感じています。そうして、十分洗練されたアルゴリズムにしてからの方がC++実装の時間が短縮されるはずです。



注１：from pylab import *
と書くと、あたかもMATLABっぽい使い方ができるという利点はありますが、
from cv2 import *
と一緒に書くと
imshow()
がどちらのimshow()なのかわからなくなるので危険です。




[ヒント7　モジュールの作り方](http://qiita.com/nonbiri15/items/0307b8328de5c6e6c255)
ruby on rails を使い始めました

Ubuntu 14.04にruby on rails を入れて使い始めてみました。

http://openbook4.me/projects/92/sections/485
の、「小学生でもわかるRuby on Rails入門」を読みながら試しています。

関係ありませんが、
Qiitaでの書き込みもはじめてなので、ちょっとドキドキです。
Qiitaって、サイトがスッキリしたデザインで、書いていても楽しいですね。なんだか書きやすい。

勉強を頑張ります。
Webを使った新人研修　～Linuxコマンド編～

##はじめに
新人研修で、Linuxコマンドを新人に覚えさせたいというニーズがあると思います。
ex. インフラ系・開発・サーバ監視業務・オペレータ等
そのLinuxコマンドをコストを掛けずに、Web上のサービスを使って行う方法を提案したいと思います。

###前提条件・環境
・インターネットに繋がるパソコン (or スマホ・タブレット)
・ブラインドタッチができ、基本的なネットリテラシーのある1年目社員

###学習させたい内容
・Linuxコマンド

###所要時間
Linuxコマンド：1コマにつき20分程度を想定

##Webを使った Linuxコマンド の学習
第１回として、上記「Linuxコマンド」の学習方法を考えて見ます。

###Linuxコマンドの必要性の意識付け
最初に右も左もわからない新人には、必要性を感じさせる為に簡単に説明します。
（新人の立場としては、「最短経路で即戦力になりたい」と考えているはずです。）
基本的には、[クライアントサーバモデル](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%82%B5%E3%83%BC%E3%83%90%E3%83%A2%E3%83%87%E3%83%AB)の説明と
「サーバがLinuxで構成されることが多く、その操作をするのがLinuxコマンドである。どのような現場でも役に立つ知識である。」
という趣旨の説明で良いと思います。

######覚えるべきコマンド
基本的に下記のコマンドを覚えれば、お役に立てるのではないでしょうか？

| コマンド | 概要 |
|:------------|:------------------------------------------------|
| `ps` | プロセスを一覧表示 |
| `pwd` | 現在のディレクトリ（カレントディレクトリ）を確認 |
| `ls` | ディレクトリの内容を表示 |
| `cd` | ディレクトリを移動 |
| `mkdir`・`rmdir` | ディレクトリの作成・削除 |
| `cp` | ファイル、ディレクトリのコピー |
| `mv` | ファイル、ディレクトリ名の変更 |
| `rm` | ファイルを含むディレクトリの削除 |
| ~~`shutdown`~~ | ~~サーバをシャットダウン~~ |
※jor1kが`shutdown`をサポートしていない？為、割愛


###実践する
それでは、「実践する」をしましょう。
JavaScript関連の発展は目覚しいものがあり、Linuxマシンのエミュレートがされています。
・jor1k
http://s-macke.github.io/jor1k

以下に、関連性の高いコマンド単位でスケジュールしました。実際の研修の際は、前日の復習を織り交ざると良いと思います。
1日目：[Webを使った新人研修　～Linuxコマンド編 - psコマンド～](http://qiita.com/fujisystem/items/aff729ca5ae0ba106e4a)
2日目：[Webを使った新人研修　～Linuxコマンド編 - pwd・ls・cdコマンド～](http://qiita.com/fujisystem/items/4af9fbacd5554db07a56)
3日目：[Webを使った新人研修　～Linuxコマンド編 - mkdir・rmdirコマンド～](http://qiita.com/fujisystem/items/6b55bfbad1de88e2058a)
4日目：[Webを使った新人研修　～Linuxコマンド編 - cp・mv・rmコマンド～](http://qiita.com/fujisystem/items/f71b9ae04f2ca9922856)
5日目：[Webを使った新人研修　～Linuxコマンド編 - viコマンド～](https://qiita.com/fujisystem/items/6d7739ccaa661cff43ee)

～ここまで
『Microsoft主催のDevOpsハッカソン in 大阪』に参加してきました！

#概要
2016年1月23日(土)～2016年1月24日(日)の２日間、マイクロソフト開催支社で行われたDevOpsハッカソンに参加してきました。#DEVOPSJP

ハッカソン初参戦でしたが、とても楽しかった！！
DevOpsって難しそうだなー。コード書いたことないけど大丈夫かな？
などと参加をためらっている方！大丈夫です！

マイクロソフトのエバンジェリストが手厚くサポートしてくれるのでご安心ください。
Microsoft Azure＋DevOpsの知識が深まるので、ぜひ参加してみてください。

[DevOpsハッカソン](http://blogs.msdn.com/b/devamm/archive/2015/09/07/10640057.aspx)


#参加した目的
最近エンタープライズクラスのお客様にAzureを始めとするクラウド基盤を採用したいとお話が増えてきています。そんな中でIT Professionalの目線でお客様へDevOpsの良さを伝えていけたらと言う思いがあり、今回のDevOpsハッカソンに参加することで理解を深めたかった。


#ハッカソンの内容
初日の午前中は、DevOpsとはなんぞや！？Infrastructure as Codeとはなんぞや！？という座学
講師は、
　・DevOps：米国マイクロソフト所属DevOpsエバンジェリスト牛尾さん
　・Infrastruchere as Code：日本マイクロソフト 小塚さん
です。

主な内容は
　・DevOpsなんてものは売っていない！考え方が大切だ！
　・DevOpsの定義ってなくて今は色んな人が色んなことを言っている状態。
　・何かツールを使えばDevOpsではない(これ使えばDevOpsでっせーと言ってる会社もあるが。。。)
　・DevOpsは考え方が大切。

#いよいよハッカソンの開始！
今回のDevOpsハッカソンのテーマの内容は、
　・チーム構成：インフラ技術者と開発者の組み合わせ
　・条件：Infrastructure as Codeと別のDevOps手法(１つ以上)をアプリに実装
　・テーマ：クリエイティブなソリューションを生み出すこと！
　・プレゼン時間は５分。２日目に優勝チームを発表！
です。

##ソリューション概要：私たちのチームのミッション
ハッカソン当日は、西日本地方に大寒波が来ていたので、
「すべての帰宅難民を生まれるまえに消し去りたい。すべての宇宙、過去と未来のすべての帰宅難民をこの手で！というのがテーマ」
<img width="261" alt="001.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/104698/db892547-dc2a-d606-97db-a85835c25284.jpeg">

そしてチーム名もそれにちなんで『帰宅難民チーム』としました！笑
＝＞帰宅経路を『駅すぱーと」のAPIで検索して、帰宅時間の天気を調べるという構想で始めました。


##会場での充実した手厚いサポート
会場にはMicrosoftエバンジェリストの手厚いサポートがありました。
DevOps：牛尾さん
IoC　　：小塚さん
Azure　：安納さん、松崎さん
Java　  ：寺田さん

参加者にはAzureを触ったことがない方も多数いたのですが、エバンジェリストの方々の手厚いサポートがあったため、DevOpsに集中して学べたのではないかなーと思います。

##プレゼン＆結果！
私たちのチームの発表で使用したプレゼン資料をあげておきました。
[DevOpsハッカソンin大阪 『帰宅難民チーム』]
(https://doc.co/RqEjy9)

###悪かった点
欲張りすぎた。。。
ハッカソンということで普段やっていないことに挑戦しよう！ということで、いろいろなことにチャレンジし過ぎてしまい時間がオーバーしてしまった。
実際にはあまり時間がないのでもっとシンプルな構成にした方が良かったと反省。。。

###良かった点
・他チームにはない斬新なソリューションだった！
メンバーの一人がディスプレイ付きのRaspberryPI2を持参してたので、その画面に帰宅予想的な結果を表示できるように出来た！？こと。(実際は時間がなくできませんでした。。。(笑))

・DevとOpsが融合した！
初日は、Dev(3名)、Ops(3名)でそれぞれ座る位置も分かれて作業をし話し合うことをあまりしていなかったが、2日目はDevとOpsで座る位置も隣合わせで、歩調をとって進めることができた。

#今回参加したことで得られた知識
##

##製品知識
　Visual Studio Team Services
　・５ユーザーまで無料で使用可能
　・バックログとカンバン ボード(看板方式)を使用して、作業のキャプチャが出来たり、優先順位付けや追跡を行える優れものなツール。

>Visual Studio Team Service
https://www.visualstudio.com/ja-jp/products/visual-studio-team-services-vs.aspx

私が気に入ったのは、オジサンが好きそうなテスト結果のレポートが出力が出来るという点です！
DevOpsを採用するにあたって、不要なドキュメントの削減もしていきたいですね。
そんな私たちの思いをハッカソン終了後に牛尾さんがブログに書いてくれています。
>Live DevOps in Japan!
「自動化対象のユニットテスト（単体テスト）の仕様書を書くことは完全なる無駄である」
http://blogs.technet.com/b/livedevopsinjapan/archive/2016/01/24/3659493.aspx



#感想とまとめ
結果私たちのチームは優勝することはできませんでした、チームワークは良かったです。
ハッカソン終了後メンバーのみんなで懇親会を開催し、熱い議論が交わされました！

私はまた機会があれば参加して、必ずリベンジすることを誓いました！(笑)

###DevOpsの良書
牛尾さんからDevOpsを学習するのによい本を紹介いただいたのでさっそく購入しました。
日本語版は日本マイクロソフトのCTO榊原彰さんが監修しています。
まずはこの本を読んでDevOpsについての理解を深めて行こうと思います。
>「The Phoenix Project: A Novel About IT, DevOps, and Helping Your Business Win
http://www.amazon.co.jp/Phoenix-Project-DevOps-Helping-Business/dp/0988262509/ref=sr_1_sc_2?ie=UTF8&qid=1453705604&sr=8-2-spell&keywords=The+Phoneix+Project
Security Software Personal impressions

本来ならここにコードを書くべきなんだが、
まあそこは後日に、今日は自分が使っているセキュリティソフトとその所感を書こうと思う。
メインPC　こちらはすべてが最強、つまり重い作業をするとき、例を挙げると映像やDTMである。
入っているソフトは後日紹介するとして、このようなメモリ、GPUを必要とされるソフトで使用している。
こちらに入れているのはESET、動作は軽く、ウイルス対策ソフトにありがちなアップデート時に凄く重たくなる現象も他製品と比べてかなり軽い。
常駐してる時も同様である、スキャンしているときはディスクの帯域を食われアクセスが遅くなることがあるがメモリは殆ど食べないので、レンダリング時の間にするのもいい。
微妙な点としては、誤検出率を低くするためにウイルスの判定を甘くしているところである。
といってもちゃんと完全に黒な物は隔離してくれるので心配はしなくていい。
ちなみにエンジンはBitdiffenderと同じである。

ノンパ１号　こちらはDTMの作業を外でる時用に購入したものでありメモリとCPUは最強
こちらは殆どインターネットにも接続しないので何を思ったか最近できたソフトMr.Fを導入している
すまぬが、こちらはあまり検証していません。

ノンパ２号　こっちはバッテリーを重視したプログラミング用のPC、会社でも使うPCであり、かなりセキュリティが強化されている、BIOSのパスワード、ストレージの暗号化、カードの認証などすごい面倒である。
導入しているソフトは会社から導入されるSymantecである。
こちらはアップデートにかなり重たくなるがウイルス探知に関してはカスペルスキーにも引きを取らないように感じる、誤検出も比較的少ない。

ノンパ３号　こちらも同じくプログラミングPC、ぶっちゃけると予備である、鯖を通じてノンパ２号と完全同期している、普段は家で24時間省電力充電である。導入しているのは趣味でカスペルスキーです。

ノンパ４号　完全お遊び用である、世界中からウイルスを取ってきてぶちこんだりされているかわいそうなPC、BIOSが感染されたりと散々な目にあっているが、導入しているのはネタでトレンドマイクロ。ソフト自体に脆弱性が見つかったりしているあれである。
EMISOFTも入れているがこちらはちゃんと検出してくれるが誤検出がひどい、怪しいものだと片っ端から隔離している。黒を放置しているよりはましだが。こちらもエンジンはbitdefender


自宅鯖はSymantecです。（ここは闇なので内緒
TengineでHTTP/2とSPDYを両方サポートする

## nginxのHTTP/2サポート開始とSPDYサポート停止

nginxは1.9.5からHTTP/2をサポートするようになりましたが、一方で同時にSPDY/3.1のサポートを打ち切っています。以下はnginx-1.9.5のChangeLogの抜粋です。(nginxの変更履歴は[こちら](http://nginx.org/en/CHANGES))

```
    *) Feature: the ngx_http_v2_module (replaces ngx_http_spdy_module).
       Thanks to Dropbox and Automattic for sponsoring this work.
```

1.9.4までは`--with-http_spdy_module`というオプションが用意されていましたが、1.9.5以降ではこのオプションおよびSPDY/3.1の実装自体が削除されてかわりに`--with-http_v2_module`というオプションとHTTP/2の実装が入りました。

ばっさり切られるとそれはそれで困るのですが、昨年のはじめの段階でSPDYの提唱元であったGoogleはすでにSPDYの将来的なサポートの停止を宣言するとともにHTTP/2への移行を促していましたし、これはある程度仕方がないことでしょう。

http://googledevjp.blogspot.jp/2015/02/http2-spdy.html

## SPDYサポートの需要について

殊スマートフォンではHTTP/2のサポートはまだ十分ではない状況ですし、HTTP/2はしゃべれないけどSPDYはしゃべれるという端末(e.g. iOS8.x)は今後しばらく残るだろうと思われます。そのため将来的にはHTTP/2一本になっていくとしてもHTTP/2とSPDYの両方をサポートしたサーバの需要はまだそれなりにあるでしょう。

実際、CloudflareのようにHTTP/2とSPDYの両方をサポートしているCDNもあります。

https://blog.cloudflare.com/introducing-http2/

## TengineでHTTP/2とSPDYを両方ともサポートする

Tengineはnginxの有名なフォークです。モジュールの動的組み込みやアップストリームのヘルスチェックなど、nginx本家にはない機能が実装されてたりします。で、昨年末に新しいバージョン(2.1.2)がリリースされましたが、[公式サイトの説明](http://tengine.taobao.org/)に下記の一文があります。

```
support for both HTTP v2 protocol and SPDY v3 protocol, be able to use them together.
```

どうやらTengineではHTTP/2とSPDY/3.1の両方が利用出来るようです。実際こんな感じで`listen`ディレクティブに`spdy`と`http2`両方のパラメータを渡すことができます。

```nginx
listen 443 ssl spdy http2;
```

SPDYとHTTP/2両方サポートしたいなぁ、どうしようかなぁと考えてたのですが、さっとやるならTengineを利用するのが良さそうです。
MarkdownのWikiエンジンGollumをMacにインストール手順

GitHubプロジェクトのWikiページをローカルPCで編集するために、markdownで記述するWikiエンジンのGollumをMacにインストールしてみました。

## 参考にしたサイト
[【GitHub】GitHubのWikiを書く](http://tech.admax.ninja/2014/10/08/how-to-write-wiki-of-github/)
[githubのwikiエンジン"gollum"の導入と細かい設定](http://yukke.hateblo.jp/entry/2013/05/02/224859)

## インストール
参考サイトにインストール手順が書いてあるのですが、そのままだとMacに入れられなかったので、公式サイトのMacのインストール手順を試します。
https://github.com/gollum/gollum/wiki/Installation

```
brew install icu4c
sudo gem install charlock_holmes -- --with-icu-dir=/usr/local/opt/icu4c
sudo gem install gollum
```

1行目　brew install icu4c
brewコマンドは、OS X 用パッケージマネージャーのHomebrew。
icu4cはUnicodeのライブラリのC版らしいです。icu4jというのもあってそっちはJava版らしい。
/usr/local/Cellar/icu4c/56.1 ここにインストールされます。

2行目 gem install charlock_holmes
シャーロックホームズはRubyから先ほど入れたICU様のライブラリらしいです。配布サイトはここでしょうか。https://github.com/brianmario/charlock_holmes
gemはRubyのパッケージ管理システムです。


3行目
やっとgollumをインストールします。
gemはsudoをつけないとPermissionエラーになりました。

## 起動
gollumコマンドで起動します。

```
cd [ローカルのgitプロジェクトのROOTディレクトリ]
gollum
```

RubyのHttpサーバのWEBrickが起動します。

## 使い方
ブラウザから http://localhost:4567 にアクセスすると http://localhost:4567/create/Home にリダイレクトされて最初のページの編集画面が表示されます。ここで編集したページを保存すると、git上でもHome.mdファイルのコミットが行われます。

## 追記
普通に起動すると、masterブランチにそのままコミットされるので、--refオプションで作業用のブランチで立ち上げた方が良さそうです。

```
gollum --ref [ブランチ名]
```
GitBucketのバックアップ方法

[【東京】JJUGナイトセミナー Git入門](https://jjug.doorkeeper.jp/events/37249)が盛況だったみたいですね！

[@syobochim](https://twitter.com/syobochim) が紹介したGitBucketは簡単に導入できますが、ちゃんとバックアップの運用も考えないとえらいことになります。

GitBucket, backupでググると[@koudaiiiのメモ](https://gist.github.com/koudaiii/bc4547b83cbc52bf3aa1)
が一番最初に見つかったけど、ちょっと古そうだったので調べてみました。

ってことでバックアップ方法の紹介です。

# GitBucketのバックアップ方法

基本的には以下のWikiの通りなので以下を参照してください。

* [Backup · gitbucket/gitbucket Wiki](https://github.com/gitbucket/gitbucket/wiki/Backup) 

バックアップには[Wikiに記載されているbackup script](https://github.com/gitbucket/gitbucket/wiki/Backup#backup-script)をそのまま利用します。

## 事前準備(オプション)

DB(H2)のバックアップを取る場合は[gitbucket-h2-backup-plugin](https://github.com/gitbucket-plugins/gitbucket-h2-backup-plugin)をインストールしておきましょう。

プラグインの画面を見ると、以下の通り`/gitbucket/database/backup`にHTTP GETリクエストを送ればバックアップ処理が動くことが書かれており、上記のbackup script内でも引数で渡されたDBバックアップ用のURLに対してHTTP GETリクエストを送るようになっています。
![h2-backup](https://cloud.githubusercontent.com/assets/1474900/12002218/47d4912e-ab3c-11e5-8f3c-78654a3f9932.png)

## バックアップ
[Wikiに記載されているbackup script](https://github.com/gitbucket/gitbucket/wiki/Backup#backup-script)をコピーし、任意の場所に配置します。
自分の場合は`$GITBUCKET_HOME/backup.sh`として配置しました。

backup scriptはコマンド引数として第一引数にGitBucketのホームディレクトリ、第二引数にバックアップ先のディレクトリ、第三引数はオプションとして上記事前準備で説明したDBバックアップ用のURLを指定します。

tomcatで動かしているので、自分の環境の場合は以下のとおり。

```bash
$ bash /var/lib/tomcat7/data/.gitbucket/backup.sh $GITBUCKET_HOME $GITBUCKET_HOME/backup  http://localhost/gitbucket/database/backup
```

実行すると、指定したバックアップディレクトリに`$GITBUCKET_HOME/data`のアーカイブ(`data.tar.gz`)、各リポジトリのバックアップ(--mirrorオプション付でcloneしたもの)、GitBucketの設定ファイル(`gitbucket.conf`)、第三引数まで指定した場合はデータベースのバックアップ(`gitbucket-database-backup.zip`)が出力されます。

### cronで定期的にバックアップ

手動で実行するのはさすがに面倒なので、cronで定期的に実行するように設定しておきます。

`/etc/crontab` を以下のように設定します。

```bash
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
GITBUCKET_HOME=/var/lib/tomcat7/data/.gitbucket
BACKUP_FOLDER=/var/lib/tomcat7/data/.gitbucket/backup


# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

00 3 * * * root bash /var/lib/tomcat7/data/.gitbucket/backup.sh $GITBUCKET_HOME $BACKUP_FOLDER http://localhost/gitbucket/database/backup
```

これでH2がぶっ壊れても安心ですね！
RubiniusのArray#productをブロック付きで呼んだら…

自作Gemのテストをしている過程で、Rubiniusのバグを掘り出してしまうハメになりました。

# Rubiniusって？
Rubiniusは、Rubyの実装の1種です。特徴としては「スピード志向」ということと、「大半の部分がRubyで書かれている」ということがあります[^1]。標準実装のMRI（CRuby）、Java上での実装のJRubyと並んで、そこそこメジャーなRuby処理系の1つです。

# `Array#product`とは
[`Array#product`](http://docs.ruby-lang.org/ja/2.3.0/method/Array/i/product.html)は、複数の配列について要素同士の組み合わせを全生成するメソッドです。ブロックを渡した場合、組み合わせの1つ1つについてブロックを実行する、というようになっています。

# 気づいたきっかけ
自作のGemが完成に近づいてきたため、もともと開発に使っていたRuby 2.2以外に、古いバージョンやJRuby、Rubiniusでもテストを回していました。そして、このGemは内部にいくつかのクラスを含んでいて、そしてそれら同士の演算についても定義していたので、組み合わせでテストしようと`Array#product`を使って組合わせを展開するようなテストコードを書いていました。

```rb:some_class_spec.rb
describe SomeClass do
  terms1 = [a, b, c, ...]
  terms2 = [d, e, f, ...]
  terms3 = [g, h, i, ...]
  
  terms1.product(terms2) do |term1, term2|
    context "#{term1} and #{term2}" do
      # 略
    end
  end

  terms1.product(terms3) do |term1, term3|
    context "#{term1} and #{term3}" do
      # 略
    end
  end
end
```

MRIでは問題なくテストを通過したので、Rubiniusで動かしてみたのですが、一気に赤字でエラーを連発しだしてしまいました。調べてみると、そもそも`context`の時点で余計なものが現れていることに気づきました。RSpecとRubiniusの組み合わせで起こる問題かと思ってさらに追いかけてみたのですが、試しに`terms1`を`freeze`してみたところ、MRIは何事も起こらなかったのに対して、Rubiniusは`Array#product`内部でfrozenな配列を書き換えようとして`RuntimeError`となってしまいました。

##最低限の再現コード
```rb:issueにも載せたコード
arr = [1,2,3].freeze
arr.product([4,5,6]){ 1 }
# MRIでは無問題、RubiniusではRuntimeError
```

# 原因の追求
スタックトレースにRubinius内のRubyのコードも出ていたので、追いかけるのはそこまで困難ではありませんでした。で、[実際のコード](https://github.com/rubinius/rubinius/blob/fa397f821d96bfe2384ae9c4aa6a53b76c4993d0/kernel/common/array.rb#L1118)を見てみると、なぜか返り値として`self`に書き込みを始めるし、ブロックを取るときにもいったん配列を生成するようになっている（動作はするのですが）など、これでいいのか感満載の実装となっていました。

そのままの勢いで[Issueを立てて](https://github.com/rubinius/rubinius/issues/3587)、とりあえず様子見中です。

# まとめ
オープンソースプロダクトを使っていろいろ構築していくと、時折バグに出くわすことがあります。プルリクエストを作るにはハードルが高くても、Issueは事象をまとめればいいので、ぐっと立てやすいものです。せっかく万人に開かれているオープンソースの世界ですから、飛び込んでみたほうが、きっと新たな局面が開けます。

[^1]: このため、Rubyの標準メソッドについて「Ruby内で書くにはどうすればいいか」という事を調べるにも便利です。
emacs 自分用設定メモ（編集中）@ubuntu15.10

#emacs24のインストール
sudo apt-get install emacs24 emacs24-el

#Caskでパッケージ管理
Emacs標準のpackage.el経由でプラグインをインストールすると、エラーが多発するので、Caskにてプラグイン管理することに。
インストール方法参照：http://cask.readthedocs.org/en/latest/guide/installation.html
github:https://github.com/cask/cask


#インストールするプラグイン
flycheck
helm
auto-complete
Python3系におけるデフォルト引数値指定時に注意

http://www.amazon.co.jp/dp/4873117380 のP115よりメモ

pythonの関数定義の際、引数にデフォルト値を設定することができるが、デフォルト値の値が計算されるのは、関数が実行された時ではなく、<b>定義されたとき</b>。

そのため次のように関数定義すると、リストは空ではなく、2回目以降では、前回呼び出した時の値が残る

```
In [32]: def buggy(arg, result=[]):
   ....:     result.append(arg)
   ....:     print(result)
   ....:

In [33]: buggy('a')
['a']

In [34]: buggy('b')
['a', 'b']
```

できるだけ、デフォルト値にはイミュータブルなものを指定することがバグを防ぐポイント。

これを回避するには、いろいろあるが、次のように最初の呼出であることを明示的にするなど。

```
In [35]: def nonbuggy(arg, result=None):
   ....:     if result is None:
   ....:         result = []
   ....:     result.append(arg)
   ....:     print(result)
   ....:
In [36]: nonbuggy('a')
['a']

In [37]: nonbuggy('b')
['b']
```
AWS EC2(Amazon Linux)で、PHP7+NginXを環境を、yumを使ってサクッと実装

#概要

##システム構成
AWS EC2(t2.nano)
何もまだ手動でインストールされていない状態を前提とする。
##インストール
```
$ sudo rpm -Uvh ftp://ftp.scientificlinux.org/linux/scientific/6.4/x86_64/updates/fastbugs/scl-utils-20120927-8.el6.x86_64.rpm
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
$ sudo yum install -y nginx php70 php70-php-fpm
```

###各行の説明

scl-utilsをインストール。後述のremiレポジトリでインストールする時に必要。
CentOSならyumでインストール可能だが、amazon linuxではインストールできなかったため、
これは、rpmでインストールする。
今回は、scientific linux 6用のものをインストールした。

```
sudo rpm -Uvh ftp://ftp.scientificlinux.org/linux/scientific/6.4/x86_64/updates/fastbugs/scl-utils-20120927-8.el6.x86_64.rpm
```





remiのレポジトリをインストール。phpの新しいのが使える。

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





nginx, php7, php7のphp-fpmをインストール

```
sudo yum install　-y --enablerepo=epel,remi,remi-php70 nginx php70 php70-php-fpm
```



##Nginxの設定
確認用に。他のバージョンのPHPと変わらない。
今回は/var/www/というディレクトリを作成。
/var/www/index.phpにphpinfo()を記述した。

ユーザnginxに対して、/var/www/へ実行権限、
/var/www/index.phpにread権限をつけておくのを忘れずに。

その後、nginxの設定ファイルを変更する。

```/etc/nginx/nginx.conf
server {
        listen      80;
        server_name localhost;
        root        /var/www/; #ドキュメントルート
        index       index.php index.html;
        location ~ \.php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_script_name;
            include fastcgi_params;
        }
    }
```

##サービス起動
```
$ sudo service php70-php-fpm start
$ sudo service nginx start
```

これで、アクセスすると、phpinfo()の内容が表示されるはず。

![スクリーンショット 2016-01-25 21.47.17.png](https://qiita-image-store.s3.amazonaws.com/0/85797/923c9d83-83db-cddf-b499-1326b8b77343.png)
あとは、お好きに料理すれば良いかと思います。

###おまけ
yumでphp関連のものを追加でインストールする時は
```
yum list | grep php70
```

とかで引っかかったものの、それらしいのをインストールしてください。
(php70-php-mysqlとか)
`git ls-files -o` に `--directory` をつけて見やすく

- [Git - git-ls-files Documentation](https://git-scm.com/docs/git-ls-files)

---

<blockquote>
<dl>
<dt>--directory</dt>
<dd>If a whole directory is classified as "other", show just its name (with a trailing slash) and not its whole contents.</dd>
</dl>
</blockquote>

```bash
$ git ls-files -o
.bundle/config
log/development.log
vendor/bundle/ruby/2.2.0/bin/byebug
vendor/bundle/ruby/2.2.0/bin/erubis
...
```

```bash
$ git ls-files -o --directory
.bundle/
log/development.log
tmp/
vendor/bundle/
```
【c++】明日、昨日、指定した日付を取得する

[元ブログ - 【c++】明日、昨日、指定した日付を取得する - 技術は熱いうちに打て！](http://blog.dalt.me/1248)

c++で明日とか昨日とか指定した日付とか取得する方法が分かりそうで分からなかったので簡単に書きたいと思います。

### 現在時刻の取得

```c++
time_t now = std::time(nullptr);
```

まず、一番基本形です。
time関数にnullptrを渡すと、1970年1月1日からの経過秒がtime_t型変数で返ってきます。
ちなみにtime_tは、longのエイリアスです。

### 指定日付の取得

```c++
// yearh since 1900なので1900をマイナス
// tak0kadaさん、ありがとうございます
struct tm birthdayStruct = { 0, 23, 13, 3, 10, 1987 - 1900 };
time_t birthday = std::mktime(&birthdayStruct);
```

さて、1行目にtm構造体が出て来ました。
これは暦時刻の要素を格納する構造体です。

```c++:time.h
struct tm {
	int  tm_sec;    /* seconds after the minute [0-60] */
	int  tm_min;    /* minutes after the hour [0-59] */
	int  tm_hour;   /* hours since midnight [0-23] */
	int  tm_mday;   /* day of the month [1-31] */
	int  tm_mon;    /* months since January [0-11] */
	int  tm_year;   /* years since 1900 */
	int  tm_wday;   /* days since Sunday [0-6] */
	int  tm_yday;   /* days since January 1 [0-365] */
	int  tm_isdst;  /* Daylight Savings Time flag */
	long tm_gmtoff; /* offset from CUT in seconds */
	char *tm_zone;  /* timezone abbreviation */
};
```

この構造体にアクセスすることで、具体的な年月日などを取得出来ます。
ここでは時間指定をしてtm構造体を作成しています。

<strong>
{ 秒, 分, 時, 日, 月, 年 }
</strong>

の順で指定しています。
ここでは、1987年10月3日 13時23分0秒を表すtm構造体が返ってきます。
最後に、この構造体のポインタをstd::mktime関数に渡してやることでtime_t型で返ってきます。

### 明日/昨日の取得

※ここで言う明日/昨日とは0時ジャストを考えてください。

```c++
time_t now = std::time(nullptr);
struct tm* localNow = std::localtime(&now);

struct tm tomorrowStruct = { 0, 0, 0, localNow->tm_mday + 1, localNow->tm_mon, localNow->tm_year };
time_t tomorrow = std::mktime(&tomorrowStruct);
```

2行めのlocaltimeはtime_t型ポインタを渡すと、現地時間のtm構造体のポインタを返してくれる関数です。

先ほどのtm構造体の作り方で明日の0時0分0秒を作成したいのでday + 1としています。
昨日であれば、day - 1としてやれば出来ます。
簡単ですね。

誰かのお役に立てば。