OmniAICreator/Qiita-1.07M huggingface dataset:
勉強用に書く記事はqiitaとかブログに書くよりwiki化した方がいいかもしれない

と思って、gollumを導入してみた話。

# Qiita やブログじゃだめなのか？


- Qiita / ブログに向いている記事
 - ぐぐっても解決しなかった事象の共有
 - XXを実装してみた事をドヤる記事
 - 新しい技術についてのまとめ
 - 自分なりの挑戦

- 向いていない記事
 - 既知の事象
 - 備忘録
 - tutorial / getting started の焼き直し

Qiita / ブログに向いている記事と、向いていない記事があると思っており、毎回記事化するのもどうなんーって事で、勉強用に書くものや備忘録は、自分専用のwikiを立てて書けば良いんじゃないか。
wiki化するほうが体系化出来て後々見やすいんじゃないかと。

# 俺専用wikiを建てよう

ということで色々ぐぐって目をつけたのが[Gollum](https://github.com/gollum/gollum)でした。Github Wikiに近い感覚で書くことが出来、markdownで記事を書くことが出来ます。これを立ててしまおう。

環境としては、AWS上にEC2インスタンスを立て、nginx + unicorn でデプロイしています。

導入は以下の記事を参考にしました。

 - https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=gollum
 - http://qiita.com/tatzyr/items/5ea6328719d72135c6c3

公開用のディレクトリを作成し、以下のようなディレクトリ構成にしました。

```
wiki
|-Gemfile
|-config
  |-unicorn.rb
|-config.ru
```

config.ru にgollumの設定（というか拡張）を記載し、basic認証を追加します。
ポイントとしては、

 - 閲覧は誰でも出来る
 - 書き込みだけ自分しかしない。

という形にしたかったので、以下のような実装になりました。

```ruby
#!/usr/bin/env ruby
require 'rubygems'
require 'sinatra'
require 'gollum/app'

module Precious
  class App < Sinatra::Base
    ['/create/*', '/edit/*', 'uploadFile', '/deleteFile/*', '/rename/*', '/delete/*', '/revert/*'].each do |path|
      before path do
        authenticate!
      end
    end
    helpers do
      def authenticate!
        @auth ||=  Rack::Auth::Basic::Request.new(request.env)
        if @auth.provided? && @auth.basic? && @auth.credentials ==['admin','password']
          puts("authenticate!")
        else
          response['WWW-Authenticate'] = %(Basic realm="Gollum Wiki")
          throw(:halt, [401, "Not authorized\n"])
        end
        puts("test")
      end
    end
  end
end

gollum_path = File.expand_path(File.dirname(__FILE__))
wiki_options = {:universal_toc => false}
Precious::App.set(:gollum_path, gollum_path)
Precious::App.set(:default_markup, :markdown)
Precious::App.set(:wiki_options, wiki_options)

run Precious::App

```


# What's next
個人でしか使わないので、コレで満足しています。

認証機構をもちょっとどうにかしたい。
さくらのクラウドでVPCルータを使ってみる(1)

##VPCルータの概要
さくらのクラウドにはルータが2種類存在します。
一つがスイッチに追加するルータ、もう一つが今回使ってみるVPCルータです。
異なるネットワーク間を接続するという意味ではどちらも同じ機能を持ちますが、
一般的にいうルータに近いのはVPCルータの方になります。

- スイッチ+ルータ
グローバルIPをネットワーク単位で取得可能
追加のグローバルIPも取得可能
つまりグローバルIPを付与してもらうための機能
詳しくはこちら「[スイッチ／ルータ＋スイッチ – さくらのクラウドニュース](http://cloud-news.sakura.ad.jp/switch/)」

- VPCルータ
IPマスカレードとかポートフォワーディング可能
VPN接続やDHCPサーバ機能搭載
いわゆる一般的なルータが持つ機能を提供してくれる

こちらがVPCルータの機能説明になります。
[VPCルータ | さくらのクラウドニュース](http://cloud-news.sakura.ad.jp/vpc-router/)

ざっくり機能をかいつまむと、

- NAT機能搭載(IPマスカレード、ポートフォワーディング)
- VPN接続可能(サイト間、端末接続)
- DHCPサーバ機能
- 上流側ネットワーク選択可能(共有セグメントか別途用意するスイッチ+ルータ)

といった感じです。
上流側ネットワークはグローバルIPと帯域をどのように用意するかの選択肢になります。

エンドユーザーにサービスを提供する環境においてはVPCルータのような存在を導入するのは一般的ではないと思いますが、
せっかくクラウドサーバを利用するのであれば、
商用環境と開発環境を分離して開発環境にVPCルータを導入してVPN接続で開発する、
オフィスのローカルサーバをクラウド化してオフィスとクラウドをVPNで接続する、
など利用方法は沢山あると思います。

##VPCルータを作ってみる
まずはメニューからVPCルータを選択します。
一覧が表示されますが、まだ作成していないのでなにもありません。
「+追加」ボタンをクリックして作成します。
![VPCルータ一覧.png](https://qiita-image-store.s3.amazonaws.com/0/140995/c5c1b5b0-6adb-b3e2-3658-5a86770e0007.png)

##VPCルータ作成(スタンダード)
デフォルトでは「プラン」がスタンダードになっています。
これはグローバルIPアドレスが1つ付与されて共有セグメントに接続されます。
開発用接続環境など通信量が多くない場合に利用出来ると思います。
※後からプランや上位回線を変更することは出来ないので注意してください。
※変更したい場合は再作成になります。
スタンダードは名前をつけて「+作成」ボタンを押すだけで完了です。
ボタンを押してからコピーに多少時間がかかり、作成が完了すると電源が落ちた状態で提供されるので
実際に利用するには電源操作を行う必要があります。

![VPCルータ追加.png](https://qiita-image-store.s3.amazonaws.com/0/140995/a1aab949-26bd-6577-860a-de5b82c025be.png)

##VPCルータ作成(プレミアム、ハイスペック)
プレミアムもしくはハイスペックを選択すると接続先のスイッチ+ルータの選択肢が追加されます。
もし事前に作成していなかった場合は新規作成出来ます。
プレミアムとハイスペックの差はスループットだけ(400Mbpsか1200Mbps)みたいなのでここではプレミアムを選択しています。

![VPCルータ追加プレミアム.png](https://qiita-image-store.s3.amazonaws.com/0/140995/90a14c5f-76b3-32ee-2632-ed558c0219f5.png)

新規作成を選ぶとスイッチ+ルータを作成したときに示される選択肢が現れます。
帯域幅についてはこちら[[転送量に応じたトラフィック制限はありますか?](http://cloud-news.sakura.ad.jp/faq_top/faq/#Q007)]を参考に
VPCルータのスループットと他のアプライアンス(例えばロードバランサなど)やサーバ接続の利用有無を検討して選択するといいと思います。
「VRID」はプレミアム/ハイスペックを選択した時しか表示されないのですが、
同じ会員IDで作成しているアプライアンス同士で被らない様に調整すれば問題ないと思います。
ちなみに自動で割り振ってはくれないみたいですが、後で変更も可能です。

![VPCルータ追加プレミアム新規追加.png](https://qiita-image-store.s3.amazonaws.com/0/140995/fbe69397-2184-ec65-6941-bc9ff2614144.png)

次回は作成後のVPCルータをみてみたいと思います。
[Git] .gitignoreへの除外ルールを簡単に設定できるエイリアスの追加

毎回 `echo hoge >> .gitignore` と打つのが面倒なため、`.gitignore` へのちょっとした追加が簡単にできるgitのコマンドを設定する

# 設定方法

`.gitconfig` に以下のエイリアスを追加

```bash:.gitconfig
[alias]
ignore = "!f() { echo $1 >> \"${GIT_PREFIX}.gitignore\"; }; f"
```

# 使用方法

```console:使い方
$ git ignore <除外対象ファイル or 除外ルール>
```

# 実行例

```bash:実行例
$ mkdir test
$ git init
Initialized empty Git repository in /tmp/test/.git/
$ touch hoge.txt
$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       hoge.txt
nothing added to commit but untracked files present (use "git add" to track)
$ git ignore hoge.txt
$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       .gitignore
$ cat .gitignore
hoge.txt
```

# 参考
[bash - Creating a git alias to append to .gitignore - Stack Overflow](http://stackoverflow.com/questions/21945872/creating-a-git-alias-to-append-to-gitignore)
Angular2 定数を宣言 / 環境変数の利用

# 背景
サーバサイドアプリケーションでは環境によって動作を切替えたい場合、”環境変数”が利用される。
Angular2でもAPIの振り分けなど、利用したい場面があり、同様の実装ができるか調査した。。

【目的】
AngularJS 1.*では下記でできた様に、APIの接続先を変える実装にしたい。
http://qiita.com/Quramy/items/d460d6859187d3af34c1


## グローバル定数の利用
環境変数を利用するためには、まず該当の変数をグローバル定数とする方法を知る必要がある。

これはAppModuleで宣言して、利用するサービスにDIする方法で実現できる。
アプリケーション中で使用したい変数を provideで宣言すれば良い。

下記ではAPI接続先を 'ApiEndpoint'に設定している。

```
{provide: 'ApiEndpoint', useValue: 'http://localhost:3000/api/v1'}
```

利用例

```ts:app.module.ts
@NgModule({
  providers: [
    appRoutingProviders,
    {provide: APP_BASE_HREF, useValue: '/'},
    {provide: 'ApiEndpoint', useValue: 'http://localhost:3000/api/v1'},
  ],
....
..
})
export class AppModule { }
```

```ts:api.service.ts
import {Injectable, Inject} from '@angular/core';
import { Http, Headers, Request, Response } from '@angular/http';
import {Observable} from "rxjs/Observable";
import 'rxjs/add/operator/map';

@Injectable()

export class ApiService {

  constructor(
    private _http: Http,
    @Inject('ApiEndpoint') private api_path: string,
    @Inject('AnalyzeEndpoint') private analyze_path: string
  ) {

  }
  <省略>
}
```

## 環境変数を設定する

これはどうやらビルド時に工夫するのが一番良さそう。
開発環境と、本番環境で実行するビルド手順を分けて、違う設定ファイルを見るようにする。

たとえば下記のように、同名のファイルにコピーするで続きを環境によって振り分ければ良い。方法は gruntやgulpなど利用してるビルド環境にもよるのでここでは深掘りしないことにする。

開発用 ```app.setting.dev.js``` → app.setting.js
本番用 ```app.setting.js ``` → app.setting.js

利用例は下記に記載

``` ts:app.settings.dev.ts
export const  API_ENDPOINT = 'http://localhost:3000/api/v1';
```

``` ts:app.settings.prod.ts
export const  API_ENDPOINT = 'http://yourapp.com/api/v1';
```


```ts:app.module.ts

import {API_ENDPOINT} from "./settings/app.setting";

@NgModule({
  providers: [
    appRoutingProviders,
    {provide: APP_BASE_HREF, useValue: '/'},
    {provide: 'ApiEndpoint', useValue: API_ENDPOINT}
  ],
  <省略>
})
export class AppModule { }
```




```js:Gruntfile.js
module.exports = function(grunt) {
  // configure the tasks
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),

    copy: {
      prod: {
        expand: true,
        cwd: 'app/settings/',
        src: ["app.setting.prod.ts"],
        dest:  'app/settings/',
        rename:function(path,name){
          return path + "app.setting.ts";
        }
      },
      dev: {
          expand: true,
          cwd: 'app/settings/',
          src: ["app.setting.dev.ts"],
          dest: 'app/settings/',
          rename:function(path,name){
            return path + "app.setting.ts";
          }
      }
    },
    <省略>
  }

  //本番用ビルド
  grunt.registerTask(
    'build',[
      'clean:dist',
      'sass:dist',
      'copy:prod',
      'ts:default',
    ]
  );
 
 //開発用ビルド
 grunt.registerTask(
    'build-dev',[
      'clean:dist',
      'sass:dist',
      'copy:dev',
      'ts:default',
    ]
  );
};
```

参考記事
http://stackoverflow.com/questions/34986922/define-global-constants-in-angular-2
セールスとエンジニアのメンタルモデル

複数のセールスと少数のエンジニアしかいない組織構造なので，それを橋渡しするポジションをセールスから立てようとしていて，セールス向けに開発の進め方に関する座学を行った．
その中で，まず双方のメンタルモデルから話したほうが良いかもと思って，まとめてみた．
少しでも溝が浅くなる一歩になれば．

## 開発の進め方 の全体

1. **セールスとエンジニアのメンタルモデルの違い** // これから書く内容
2. 開発のオープンネス // 情報の一元化に関するお話
3. チケットの内容と正確性 // 各種テンプレートに関する説明
4. ロードマップと優先順位について // 何を基準に優先するのかというお話
5. 開発の落とし穴 // スパゲッティなプログラムや技術的負債を中心に
6. 検証 // やりっぱなしダメ，絶対ダメという話を中心に

こんなことを1時間ぐらいで座学形式で話をした．*動けばいいじゃん!!* という意識しかセールスには無いので，個人的には技術的負債を話せてよかったなぁ．

## セールスとエンジニアのメンタルモデルの違い

### エンジニアだけでなくセールスにも共通している美徳
- 怠惰
- 短気
- 傲慢  

エンジニアの美徳として挙げられがちだが，セールスもとっても怠惰で，競合に負けるとひどく怒り，自身のサービス・プロダクトに自信を持ち，顧客のニーズを満たすと考えている．
つまり，双方同じような美徳を持っているのではと経験則ながら思っている．

### セールスのメンタルモデル
- **1分でも短い時間で** 情報を伝えたい
    - だから長々とテキストを書くことには耐えられない
    - だからメールより電話，チャットより会話を優先する
- 口頭 / 表情 / 画面 / イメージ 使えるものはなんでも使って短い時間で伝えたい
- 正確性ではなく、どちらかと言うと **意図** を重視
    - "顧客からこんなことを言われているので，あとはよしなに" スタイル
- 理想: セールス「あっ!」-> 開発「うん!!」
    - 10年ぐらい一緒にやってると，こういう奇跡は起こりうる

### エンジニアのメンタルモデル
- **1分でも長い時間** 開発に集中したい // フロー状態は突然に
	- [フロー状態とは](https://ja.wikisource.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%8C%E7%9F%A5%E3%82%8B%E3%81%B9%E3%81%8D97%E3%81%AE%E3%81%93%E3%81%A8/%E3%83%AB%E3%83%BC%E3%83%81%E3%83%B3%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%92%E3%83%95%E3%83%AD%E3%83%BC%E3%81%AE%E3%81%8D%E3%81%A3%E3%81%8B%E3%81%91%E3%81%AB)
- なんでも非同期のコミュニケーションにして欲しい // チャット，DM
- 意図も含めて，**正確性が最も重要**
	- 意図は必須ではないが，意図がわかると別の解決方法を導くこともできる
- 理想: OSSのようにコミュニケーションする (??)
	- [GitHubでのコミュニケーションはこんな感じ](https://github.com/twbs/bootstrap/issues/3057)
	- 161人が非同期に **ワイワイ** やってる風

### どちらも正義
- ゴールは一緒
    - 1人でも多くのユーザーに使ってもらい，満足させたい
- お互い共通の美徳があること，それぞれの正義があることを認識することから始めよう
    - HRTの原則
        - 謙虚Humility / 尊敬Respect / 信頼Trust
        - [HRTの原則 ～ソフトウェア開発はバーでしっとり語り合うように ～](http://blog.livedoor.jp/lalha/archives/50496623.html)

## まとめ?

プロダクトマネージャが必要だよ，というのは分かっているのだが，そんな人は雇えないし，"ならばセールスがなるしかない，そのポジションに!!" ということで進める一環で話をした．
なお，これをやる最中，↓のような記事があり，とっても勇気がもらえるものだった．

[エンジニアと健全なバトルをしてますか？ Increments 及川卓也が語る優秀なPMの条件
](http://careerhack.en-japan.com/report/detail/724)

今やってるいる取り組みが上手くいきますように!!!!!!
アクセスキーを意識しないでawscliを使いたい

# 環境
```shell-session
uraura@rosemary$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G1004
```

# 概要
S3にあるファイルをローカルにダウンロードしたい，とかいう場合

1. S3のオブジェクトを公開設定にしてブラウザでダウンロード
2. IAMアクセスキーを発行し，ローカルマシンで適切に設定して `aws s3 ...`
3. 適当な(S3へのアクセスが可能な)EC2へsshし，そこでダウンロードしてscpでローカルへ

あたりが考えられますが，
(1)はデータによっては一番簡単ですが，システムのバックアップデータとかだとちょっと無理です．
(2)なら一度設定してしまえば他のコマンドもたたけるようになりますし良さそうですが，個人のマシンでアクセスキーが漏洩しないようきちんと管理しなければなりません．
(3)はssh/scpを毎度毎度やるのが面倒なうえに，EC2上にゴミが残りがちになります．

などなど，どれもめんどうです．もうちょっとイケてるやりかたを考えてみます．

# やりたいこと
- ローカルのawscliを使いたい
- アクセスキーを個人で管理したく／させたくない

# やったこと
## 適当なEC2(bastion)を用意
個人でアクセスキーを管理させたくないので，InstanceProfileを付けたEC2を利用します．
とりあえず以下，amazon linuxです．

```bash
yum install -y --enablerepo=epel tinyproxy

service tinyproxy start
```

これで，`bastion:8888`をHTTPプロキシとして利用できるようになります．


## ローカルマシンの設定
SecurityGroup等でIP制限ができるのであればそれでも良いでしょう．
とりあえず今回はSSHのローカルポートフォワードで設定します．

```:~/.ssh/config
Host bastion
  :
  LocalForward 8888 localhost:8888
  :
```

あとは，以下のように

```bash
ssh -fN bastion &> /dev/null
HTTP_PROXY=http://127.0.0.1:8888 HTTPS_PROXY=http://127.0.0.1:8888 aws s3 ls
```

ssh接続された状態，かつHTTP_PROXY/HTTPS_PROXYをセットした状態で，ローカルでawscliをたたけばokです．
これでEC2に付いた権限をローカルからも利用できるようになりました．おわり．
Elastic Beanstalkで環境変数の存在に応じてコマンド実行

# What
Elastic Beanstalkで環境変数が存在する場合のみ、特定のコマンドを実行したい

# How

`.ebextensions`に書く。

例えば、newrelicのキーが存在（production環境とか）によって設定をしたい場合、以下のようにする


```yaml:.ebextensions/newrelic.config
# newrelic
packages: 
  yum: 
    newrelic-sysmond: [] 
  rpm: 
    newrelic: http://yum.newrelic.com/pub/newrelic/el5/x86_64/newrelic-repo-5-3.noarch.rpm
container_commands: 
  "01": 
    command: test -v $NEWRELIC_KEY || nrsysmond-config --set license_key=$NEWRELIC_KEY
  "02": 
    command: test -v $NEWRELIC_KEY || echo hostname=$HOSTNAME >> /etc/newrelic/nrsysmond.cfg 
  "03": 
    command: test -v $NEWRELIC_KEY || /etc/init.d/newrelic-sysmond start
  "04": 
    command: test -v $NEWRELIC_KEY || sed -i -e "s/API_KEY/$NEWRELIC_KEY/" config/newrelic.yml
```

#Notes

- `test -v`でチェック
- `container_commands`を使わないとebextentions内で環境変数が取れない
Android 7.0 Nougatにおいて adb pull でapkを抽出できない問題の解決策

## apkの抽出方法

Nexus5X (Android7.0)でapkを抽出できない問題に遭遇したので、対応方法のメモです。
ちゃんと調べてないので、OS依存なのか端末依存なのか不明ですが、おそらく6.0の時は抽出できていたような気がします。

1.apkの保存場所を特定

```bash
> adb shell pm list packages -f | grep [取得したいapkのパッケージ名]
package:/data/app/com.burton999.notecal.pro.test-1/base.apk=com.burton999.notecal.pro.test
```

2.PCにダウンロード(失敗)

```bash
> adb pull /data/app/com.burton999.notecal.pro.test-1/base.apk
adb: error: remote object '/data/app/com.burton999.notecal.pro.test-1/base.apk' does not exist
```

## 解決策

```bash
> adb shell cp /data/app/com.burton999.notecal.pro.test-1/base.apk /storage/emulated/0/Download
> adb pull /storage/emulated/0/Download/base.apk
```

一度、アクセス権のあるディレクトリにコピーすることで、`pull`することができました。
おそらく権限の問題ようですが、コピーできるのに`pull`できないってのはよくわからんですね。
therubyracer がbundle install で入らない

Mac 10.9.5
ruby 2.2.2

# 突然bundle installが通らなくなった
リポジトリのディレクトリを変えようかなから始まった

既にGemfile.lockがあるので、bundle installするとそこに記述されたバージョンを取ってくる

therubyracer 0.12.2
libv8 3.16.14.15

# 解決

Gemfile.lockを削除しtherubyracer、libv8のバージョンを固定してbundle installしたら入った。
どのバージョンに固定したかは以下の記事を参考にしました。


http://ogawadaiki.com/blog/bundle-install%E3%81%8C%E3%81%86%E3%81%BE%E3%81%8F%E3%81%84%E3%81%8B%E3%81%AA%E3%81%84%EF%BC%9Fel-capitan%E3%81%A7%E3%81%AElibv8%E3%81%A8therubyracer%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88/


以下を実行した結果、私の場合`x86_64-darwin-13`が出力されました。

~~~sh
$ ruby -rubygems -e 'puts Gem::Platform.new(RUBY_PLATFORM)' - See more at: http://3.1415.jp/d3wpyqjr#sthash.kCD9jw8J.dpuf
~~~

なので、Gemfileに以下のようにバージョン固定
therubyracer 0.12.1
libv8 3.16.14.3

# 疑問

各環境でOSのバージョンが異なるけど、Gemfileの管理は一体どうすれば？？
API GatewayのS3プロキシを利用するときのつまずきポイント

ハマったポイントが沢山あったので、まとめてみました。

# 東京リージョンでテスト実行すると500エラー

## 問題

http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html#api-root-get-as-s3-get-service
上記を見ながらAPI Gatewayを触って見ていた。説明どおりに設定して、テスト実行！
すると、以下のエラーが。

~~~json
{
  "message": "Internal server error"
}
~~~

## 解決（？）

うーん、これ、バグなんですかね？
デプロイした先のエンドポイントを呼び出すと正常に動くから・・・
テストを行いたかったら、東京リージョン以外で作成するのが良いのかもしれません。

# デプロイ先から呼び出すとAccessDenied

## 問題

気を取り直して、東京リージョンではなく、バージニア北部に作り直してさくさく作成！
テスト実行して、問題なさそうだったので試しにデプロイして、生成されたエンドポイントからAPIGatewayを呼び出したら以下のエラーが。

~~~sh
$ curl "https://xxxx.execute-api.us-east-1.amazonaws.com/production"

~~~xml
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>xxxx</RequestId><HostId>xxxx</HostId>
</Error>
~~~

## 解決
cloudfrontのアクセス権限が必要みたいです。
統合リクエストで指定している「実行ロール」に、cloudfrontの権限を付加するとアクセス出来るようになります。


# PermanentRedirect

## 問題

http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html#api-items-in-folder-as-s3-objects-in-bucket
上記を試している時に。
設定完了して、テスト実行！存在するバケットを指定して、存在するファイル名を指定しているのに、以下のエラーが出てしまった。

~~~xml
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>PermanentRedirect</Code>
<Message>The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.</Message>
<Bucket>xxxxxx</Bucket>
<Endpoint>xxxxxx.s3.amazonaws.com</Endpoint>
<RequestId>xxxx</RequestId>
<HostId>xxxx</HostId>
</Error>
~~~

## 解決

* GUI上からだと、S3はリージョンが存在しないように見えるが、ちゃんとリージョンで分かれている。
* 各バケットのプロパティを見ると、バケットのリージョンが確認できる。
* 統合リクエストで指定するリージョンと同じ場所に存在するバケットを指定するとうまく行く。

![スクリーンショット 2016-10-20 19.13.05.png](https://qiita-image-store.s3.amazonaws.com/0/79577/b6666bb1-4b23-4291-9806-3490288d2ce2.png)


# リソースを作るときにパスパラメータが指定できない

## 問題

リソース作るじゃないですか。
パスパラメータが使えるから、**リソース名**に入力するじゃないですか。
![スクリーンショット 2016-10-20 19.50.06.png](https://qiita-image-store.s3.amazonaws.com/0/79577/87ca3d86-b967-0f0a-87a7-9aaaced8c553.png)

**リソースパス**が補完されるじゃないですか。
![スクリーンショット 2016-10-20 19.51.46.png](https://qiita-image-store.s3.amazonaws.com/0/79577/eda1f440-bb8a-a20a-b95e-e4b56ee039cd.png)

なんか`{username}`じゃなくて`-username-`になってるけどこれで設定できたと思うじゃないですか。
**意図した通りに動かないです。**

## 解決

リソース名に入力しないで、リソースパスに直接入力してください。
そのあとにリソース名も入力しましょう。

![スクリーンショット 2016-10-20 19.54.05.png](https://qiita-image-store.s3.amazonaws.com/0/79577/ed8e7ebe-bb4d-c862-0cbc-c36d63969542.png)
TensorFlowのチュートリアルを徐々に進めていく

# はじめに
TensorFlowの[チュートリアル](https://www.tensorflow.org/versions/r0.11/tutorials/index.html)を徐々に進めていきたいと思います。

# チュートリアル一覧
## Basic Neural Networks
- MNIST For ML Beginners
    - こちらの記事を参考にさせていただきました。
    - [TensorFlowチュートリアル - ML初心者のためのMNIST（翻訳）](http://qiita.com/KojiOhki/items/ff6ae04d6cf02f1b6edf)

- Deep MNIST for Experts
    - まだ

- TensorFlow Mechanics 101
    - まだ

## Easy ML with tf.contrib.learn
- tf.contrib.learn Quickstart
    - irisデータセットを元に、DNNのモデルを作ります。
    -  [TensorFlowのtutorial「tf.contrib.learn Quickstart」を試す](http://qiita.com/tackey/items/2886c569433d25619e88)

- Overview of Linear Models with tf.contrib.learn
    - まだ

- Linear Model Tutorial
    - まだ
- Wide and Deep Learning Tutorial
    - まだ
- Logging and Monitoring Basics with tf.contrib.learn
    - 試すもエラーで止まってしまう。
    - [TensorFlowのチュートリアル「Logging and Monitoring Basics with tf.contrib.learn」のエラー](http://ja.stackoverflow.com/questions/29731/tensorflow%E3%81%AE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB-logging-and-monitoring-basics-with-tf-contrib-learn-%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC)

- Building Input Functions with tf.contrib.learn


## TensorFlow Serving
- TensorFlow Serving
    - まだ

## Image Processing
- Convolutional Neural Networks
    - まだ
- Image Recognition
    - まだ
- Deep Dream Visual Hallucinations
    - まだ

## Language and Sequence Processing
- Vector Representations of Words
    - 単語をSkip-gram modelで学習し、言葉の意味が近いもの同士が視覚的に近づくようにグラフ化
     ![words.png](https://qiita-image-store.s3.amazonaws.com/0/82763/976f0ec3-234a-9e51-4c9b-2ae464beb72b.png)

    - こちらの記事が参考になりました。
    - [TensorFlow Tutorialの数学的背景 − Vector Representations of Words](http://enakai00.hatenablog.com/entry/2016/03/22/102437)
    - [TensorFlowチュートリアル - 単語のベクトル表現（翻訳）](http://qiita.com/KojiOhki/items/b0bf5f48ecdf513a7f5b)
- Recurrent Neural Networks
    - Penn Tree Bankデータセットを使い、文章において次に来る言葉を予測する。
    - 音声認識、機械翻訳、画像キャプションなどに応用されるそうです。
    - 個人的に興味のある[Magenta](https://github.com/tensorflow/magenta)がRNNモデルを用いています。
    - チュートリアルのままやるとエラーが発生するので、下記を参考にTensorFlowのレポジトリを修正する必要。
    - [Can't import reader.py correctly for rnn/ptb/](https://github.com/tensorflow/tensorflow/issues/4697#issuecomment-251629521)
    - Macで行うには重すぎる？
    - 下記が参考になりました。
        - [リカレントニューラルネットワークの概要と動作原理](http://wbawakate.jp/wp-content/uploads/2015/03/RNN%E3%83%95%E3%82%9A%E3%83%AC%E3%82%BB%E3%82%99%E3%83%B3.pdf)
    - またこちらの翻訳もご参照ください
        - [Recurrent Neural Networkの基礎（Peterさんのチュートリアルの翻訳）](http://qiita.com/tackey/items/cabea4babdbf668aee4d)
- Sequence-to-Sequence Models
    - まだ
- SyntaxNet: Neural Models of Syntax
    - まだ

## Non-ML Applications
- Mandelbrot Set
    - まだ
- Partial Differential Equations
    - まだ
tail -n+2 dat.txt > 2行目以降を表示

```txt:動作確認
CentOS 6.8 
tail (GNU coreutils) 8.4
```

```
tail -n+2 dat.txt 
```
という表記の理解。

```dat.txt
1
2
3
4
5
```

```
$ tail -n+2 dat.txt
2
3
4
5
```

2行目以降を表示するようだ。

man tailの表記。

```
 -n, --lines=K
              output  the  last  K  lines,  instead  of the last 10; or use -n +K to output lines
              starting with the Kth
```
middleman入門

# middleman入門

[middleman公式ドキュメント](https://middlemanapp.com/jp/basics/start_new_site/)

## 事前準備

Amazon Linuxの場合。

```
# 必要なパッケージインストール
sudo yum install -y ruby23 ruby23-devel gcc gcc-c++ nginx git
sudo yum install nodejs --enablerepo=epel

# Rubyのバージョンを変更
sudo update-alternatives --set ruby /usr/bin/ruby2.3

# nginxのドキュメントルートを作成
sudo mkdir -p /var/www/html
sudo chmod 777 /var/www/html
ln -s /var/www/html ~/html

# nginxの設定
sudo vi /etc/nginx/nginx.conf

# EC2起動時にnginxを起動するように
sudo chkconfig nginx on

# 今すぐnginxを起動
sudo service nginx start

# middlemanに必要なgemをインストール
gem install middleman middleman-livereload middleman-compass middleman-syntax redcarpet
```


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

```
mkdir m1
cd m1
middleman init
# Do you want to use Compass? などと聞かれるので、全て「y」でエンター。
```


## ビルド

```
$ middleman build
      create  build/stylesheets/site.css
      create  build/images/middleman-logo.svg
      create  build/javascripts/all.js
      create  build/index.html
Project built successfully.
```

ビルドしてできたhtmlをドキュメントルートへ移動:

```
$ mv -vf build/* ~/html/
```

ブラウザで`http://IPアドレス/`にアクセスしてちゃんと表示されたらOK。


## 編集してみる

`source/index.html.erb`、`layouts/layout.erb` を自由に編集してみよう。

これらのファイルはerbテンプレートだ。`<%= %>`で囲まれた部分には任意のRubyのコードが書けるぞ。

例えばこんなこともできる：

```
<%=
require 'net/http'
Net::HTTP.get('ipinfo.io', '/')
%>
```

```
<pre>
<%= `ls`.chomp %>
</pre>
```

編集したらまたビルドしてmvで~/htmlに配置してみよう。


## ローカルでサーバを立ち上げる

```
$ middleman s
```

でローカルにWebサーバが起動し、ポート4567で待ち受ける。

```
$ curl http://localhost:4567/
```

ソースを編集してアクセスすると反映されているぞ。

live-reloadという、ブラウザを自動的にリロードする機能までついている。


## レイアウトを変えてみよう

`source/layouts/layout.erb`をコピーして`source/layouts/my.erb`を作ってみよう。

`index.html.erb`の先頭で

```
---
layout: my
---
```

と書くとこのレイアウトが使われる。

## markdownを使ってみよう

`hoge.html.markdown.erb`を新規作成してみよう。
これはまずerbとして処理され、次にmarkdownとして処理される。

## YAMLを使ってみよう

ページ先頭の`---`で囲まれた部分をFrontmatterという。
この部分はYAMLで任意のデータを記述できる。そしてRubyから`current_page.data`で参照できる。

```
---
layout: my
hoge: abc
moge: 
  - 11
  - 22
  - 33
---

hoge = <%= current_page.data.hoge %>
moge = <%= current_page.data.moge %>
```

YAMLの書き方はこちらを参照：[Rubyist Magazine - プログラマーのための YAML 入門 (初級編)](http://magazine.rubyist.net/?0009-YAML#l3)

プロジェクトのルートに`data`ディレクトリを作り、`data/fruits.yml`を作ってみよう。

```data/fruits.yml
- name: apple
- name: banana
```

このデータは

```
<% data.fruits.each do |fruit| %>
- <%= fruit.name %>
<% end %>
```

のようにしてアクセスできる。
複数のページで共通に使うデータはこの方式で保存しよう。
ちなみにYAMLの代わりにJSONを使うこともできる。


## ソースコードをシンタックスハイライトしてみよう

これを`Gemfile`の末尾に追記：

```
gem 'middleman-syntax'
gem 'redcarpet'
```

これを`config.rb`の末尾に追記：

```
set :markdown_engine, :redcarpet
set :markdown, :fenced_code_blocks => true, :smartypants => true, :with_toc_data => true, :tables => true, :autolink => true, :gh_blockcode => true
activate :syntax
```

これを`index.html.erb`に追記：

```
<style>
<%= Rouge::Themes::ThankfulEyes.render(:scope => '.highlight') %>
</style>

<% code("ruby") do %>
def my_cool_method(message)
  puts message
end
<% end %>
```

[初めてのMiddleman：Middleman-Syntaxを使ったシンタックスハイライト](http://whiskers.nukos.kitchen/2015/03/21/middleman-syntax-syntaxhighlight.html)
[使える言語の一覧](
https://github.com/jneen/rouge/tree/master/lib/rouge/lexers)
ncdump -v lat mslp.nc > variable指定でデータサブセットを取得

```
ncdump -v lat mslp.nc
```

上記のコマンドでやっていること。

参考 https://www.unidata.ucar.edu/software/netcdf/workshops/2010/utilities/NcdumpExamples.html

variable "lat"を読取っているようだ。

実際のデータは`lat =`の行以降に表示されるようだ。
DBに保存されている文字を全置換してしまう方法(保存データ内のドメイン変更方法)

変更用のコードを書くのが正解だけど面倒なんで全置換しちゃえってやつ。

# 気持ち/環境

* [気持ち] 変更用のコードを書くなんて面倒. 事故ってもなんとかできる(色んな意味で).
* [環境] MySQL5.6, InnoDB, DB自体は3GB位、

```
character_set_client	utf8mb4
character_set_connection	utf8mb4
character_set_database	utf8
character_set_filesystem	utf8mb4
character_set_results	utf8mb4
character_set_server	utf8mb4
character_set_system	utf8
```

# やりたいこと

* ドメイン変更などの影響を受け、DBの中のドメインを変更したい


# 手順

## ① DBバックアップ

以下情報で、全テーブルか特定のテーブルか選んで実施。
特定の方が安全。でもチェックが面倒。

```サンプル情報.txt
ホスト: nikkiawsome.jp
User: writer
PW: （有り）
DB: Nikki
主に置換したいテーブル: Blog
置換前のドメイン:nikkiawsome.jp
置換後のドメイン:b1.nikkiawesome.jp
```

### 全テーブルの場合
```
$ mysqldump --default-character-set=utf8mb4 -h nikkiawsome.jp -u writer -p Nikki > backup.sql
```

### 特定のテーブルの場合
```
$ mysqldump --default-character-set=utf8mb4 -h nikkiawsome.jp -u writer -p Nikki Blog > backup.sql
```

## ② 全置換

```
$ cat backup.sql | sed -e 's/nikkiawsome.jp/b1.nikkiawesome.jp/g' > ./backup_after.sql
```


## ③ 戻す


```
$ mysql --default-character-set=utf8mb4 -h nikkiawesome.jp -u writer -p Nikki < backup_after.sql
```


## [おまけ] 置換具合チェック

```
$ diff backup.sql backup_after.sql > diff.txt
```




# リスク, 注意点

* DBのエンコードがutf8mb4とかのときはSequelProなどのGUIツール使ったSQL吐き出しはしないほうがいい
    * SequelProでバックアップとったら、SQL吐き出し時にUTF8mb4に対応してなくてデータ飛ばした（ ﾟᆸﾟ ）
        * エクスポートするときに、エンコード指定するところないと思う。
        * SJISでも同様の問題があったようなので、やっぱりちょっと怪しいかもしれないです。
            * SequelProのドキュメントや資料未確認なので怪しいかもー程度
* ランダムな文字列に置換前の文字列が含まれていると死ぬかも知れない
    * 特定のテーブルのみ置換すること
    * また事前に目視でいいのでチェックすると吉。
        * 以下SQLは、画像アップロード時にランダムな文字列をファイル名としてサーバーに保存している場合に目視するやつ。

```check.sql
SELECT
    id, photo
FROM
    Blog
WHERE
    photo REGEXP "google\.com"
ORDER BY date DESC
LIMIT 10;
```
ArduinoでOOP


正直、ArduinoでがっつりOOPで実装する機会とかあんまりないかもしれませんが、一応。。


まず、ファイル構成はこんな感じになります。

![sketch_oopTest.png](https://qiita-image-store.s3.amazonaws.com/0/41889/26bf29cb-924e-5bff-d446-d9bcc252ab33.png)

文字通りLEDをコントロールする部分をクラス化してみました。

コードは以下のとおり。

Arduinoでスケッチを新規作成すると、`*.ino`という拡張子のファイルが作られます。
`.ino`にはおなじみの`setup()`と`loop()`がいます。

Arduinoのプログラムはここからスタートしますね。

####sketch_oopTest.ino

```cpp:sketch_oopTest.ino

void setup() {
}

void loop() {
}

```

次に、クラス定義をC++で書いてみます。

####LedController.h

```cpp:LedController.h

#ifndef LedController_h
#define LedController_h

class LedController {

  public:
    LedController(int pin);
    void on();
    void off();
    
  private:
    int m_ledPin;
  
};

#endif

```

####LedController.cpp
(※)`Arduino.h`をインクルードし忘れないように注意してください！

```cpp:LedController.h
#include "Arduino.h"
#include "LedController.h"

LedController::LedController(int pin) {
  m_ledPin = pin;
  pinMode(m_ledPin, OUTPUT);
}

void LedController::on(void) {
  digitalWrite(m_ledPin, HIGH);
}

void LedController::off(void) {
  digitalWrite(m_ledPin, LOW);
}
```

クラス定義ができたので、先ほどの`.ino`から、クラスを使用してみます。

```cpp:sketch_oopTest.ino

#include "LedController.h"

LedController ledCont = LedController(10);

void setup() {

}

void loop() {
  ledCont.on();
  delay(100);
  ledCont.off();
  delay(100);
}

```

おわり。

[追記]
ちなみに、ArduinoIDEで、プロジェクト内に新規ファイルを作成する方法はちょっと変わってまして、最初とまどいました。。

以下参考

>[Arduino - ソースコードを複数ファイルに分割して記述する](http://keitetsu.blogspot.jp/2014/11/arduino.html)
[AWS][Lambda] S3に put object されたら自動的に Lambda で Expires ヘッダを追加する

元ネタは、以下の記事
[Amazon S3の画像をAWS Cloudfrontで配信するキャッシュコントロールをAWS Lambdaで自動化する ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/s3-cache-control-by-using-lambda/)

```js:index.js
console.log('Loading event');
var aws = require('aws-sdk');
var s3 = new aws.S3({apiVersion: '2006-03-01'});
 
exports.handler = function(event, context) {
   console.log('Received event:');
   console.log(JSON.stringify(event, null, '  '));
   // Get the object from the event and show its content type
   var bucket = event.Records[0].s3.bucket.name;
   var key = event.Records[0].s3.object.key;
   s3.getObject({Bucket:bucket, Key:key},
      function(err,data) {
        if (err) {
           console.log('error getting object ' + key + ' from bucket ' + bucket + 
               '. Make sure they exist and your bucket is in the same region as this function.');
           context.done('error','error getting file'+err);
        }
        else {
            console.log('logging Cache-Control : ',data.CacheControl);
            if  (typeof data.CacheControl != 'undefined'){
                console.log('cache control was already exists.');
                context.done(null,'skip execution.');
            }else {
                var Expires = new Date();
                var ContentType = data.ContentType ? data.ContentType : 'application/octet-stream';
                var CacheControl = 1;

                // set expires date
                switch( true ){
                case /html/.test(ContentType):
                    CacheControl = 1; // 1day
                    break;
                case /^(image|video|audio)\//.test(ContentType):
                    CacheControl = 365; // 1year
                    break;
                case /(javascript|css|text)/.test(ContentType):
                    CacheControl = 30; // 1month
                    break;
                case /^application/.test(ContentType):
                    CacheControl = 30; // 1month
                    break;
                }
                Expires.setDate(Expires.getDate() + CacheControl);

                var params = {
                  Bucket: bucket, /* required */
                  CopySource: bucket + "/" + key,
                  Key: key, /* required */
                  ContentType: ContentType,
                  Expires:  Expires,
                  CacheControl: "max-age="+(86400 * CacheControl).toString(),
                  MetadataDirective: "REPLACE"
                };

                console.log('replace object.');
                console.log('bucket : ' + bucket);
                console.log('CopySource : ' + bucket + "/" + key);
                 
                s3.copyObject(params, function(err2, data2){
                   if (err2){
                       context.done('error','error2 getting file'+err2);
                   }else{
                       console.log('replace done! Cache-Control : ',data2.CacheControl);
                        
                   }
                   context.done(null,'object meta-data changed.');
               });
            }
        }
      }
   );
};
```
おしゃれにシステム管理(2-1) PandoraFMS

前回のajentiに引き続き、おしゃれなシステム管理に役立つかもしれないPandoraFMSについて。
環境はCentOS 6.2。
# 事前準備・インストール
1.EPELの有効化

```/etc/yum.repos.d/CentOS-Base.repo
[EPEL]
Name = EPEL
baseurl = http://dl.fedoraproject.org/pub/epel/6/$basearch/
enabled = 1
gpgcheck = 0
```

2.PandoraFMSリポジトリの参照設定

```/etc/yum.repos.d/pandorafms.repo
[artica_pandorafms]
name=CentOS6 - PandoraFMS official repo
baseurl=http://artica.es/centos6
gpgcheck=0
enabled=1
```

3.リポジトリ情報の更新

```
$ yum makecache
```

4.PandoraFMS及びMySQLのインストール

```
$ yum install pandorafms_console pandorafms_server mysql-server
```

あとは、mysqlのrootにパスワードが設定されている事を確認すれば、プログラムの導入は完了です。
最後にapacheとmysqlが立ち上がっている事を確認し、立ち上がっていなければ起動しましょう。

# 設定

ここから先は、プログラムへブラウザからアクセスしての作業となります。
アドレスはhttp://[ipアドレス]/pandora_console/install.php でアクセス可能です。
アクセスすると、次のような設定画面が表示されるはずです。
表示されない場合は、iptableの設定が正しいか、またapacheが正しく起動して、ルートディレクトリが正しく設定されているか確認しましょう。
![pandorafms1.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/57633112-ffcd-a380-9c59-ca6a9f745501.jpeg)
内容をサッと確認して、Nextをクリック。

![pandorafms2.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/682f2039-1e18-b3a3-62fc-9ba3f1935a6a.jpeg)
続いて、使用条件についてよく確認し、"Yes,I accept licence terms"。

![pandorafms3.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/6e95aca1-8c4d-11b1-baa2-e26579a90f91.jpeg)
この画面で、依存関係のチェックを行ってくれます。便利ですね。
DB Enginesにレッドが２つありますが、今回はMySQLを利用するので、他が赤でも問題ありません。
次へ進みます。

![pandorafms4.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/813b4746-ac45-4715-9fd6-9aa329c6aa38.jpeg)
環境の設定を行います。
特に理由が無ければ、Hostnameはlocalhostで大丈夫でしょう。
設定したrootのパスワードを入力し、必要に応じて設定を変更したらNext。

![pandorafms5.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/870fd732-1dc6-978a-5a66-a14a397c8e3f.jpeg)
入力した内容に問題がなければ、このように全てグリーンで表示されます。
ここに表示されているランダムパスワード(この画像では"drxdirrg")は後々必要となりますので、しっかり控えておいてください。

![pandorafms6.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/4cbe90e8-01ad-e9c2-3dbb-bac2653cb255.jpeg)
というわけで、設定は終了。
最後に設定に利用したinstall.phpをリネームすれば、完了です。
![pandorafms7.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/dafc7c49-9b0b-8e53-6d91-52ac75f87382.jpeg)
※.自分はinstall.php自体を削除しています。（自己責任で）
"Click here to access to your Pandora FMS console"をクリックすると、コンソール画面の設定登録窓が表示されます。

![pandorafms8.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/7029abaa-33c1-2a80-425b-29ad26d410d3.jpeg)
ここを見ている人なら、基本的に「日本語」「アジア」「東京」で問題ないでしょう。
ここで入力したメールアドレスにはアラートの通知が飛ぶので、都合の良いアドレスを入力してください。

![pandorafms9.jpg](https://qiita-image-store.s3.amazonaws.com/0/131348/36aec170-99b4-d585-01e7-6609f77c8f72.jpeg)
Pandora FMSに関する情報がやり取りされているコミュニティへ参加するかどうか問われます。
必要に応じて選択し、「終了」をクリックすれば、すぐにサーバに関する情報の参照や各種設定を行う事が可能です。

長くなってしまったので、使い方などの続きはまたいつか別記事で。
Linux勉強情報　自分用メモ

#概要
Linux基礎勉強ために調べて参考になったサイトの自分用メモ。

##Linux全般

- [Linux Cross Reference]
(http://lxr.free-electrons.com/)
Linuxのソースコードがweb上で読める。

- [はじめてのカーネル・ソース]
(http://itpro.nikkeibp.co.jp/article/COLUMN/20071023/285284/)
カーネルソースの読み方のガイド

- [【組み込みLinux】Kernelの機能と周辺技術【Part1】]
(http://www.fisproject.jp/2013/02/%E3%80%90part1%E3%80%91%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BFlinux-%E3%80%90kernel%E7%B7%A8%E3%80%91/)

- [【組み込みLinux】DeviceDriverについて 【Part2】]
(http://www.fisproject.jp/2013/02/%E3%80%90part2%E3%80%91%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BFlinux-%E3%80%90devicedriver%E7%B7%A8%E3%80%91/)


- manコマンドの数字の意味

```
1   実行プログラムまたはシェルのコマンド
2   システムコール (カーネルが提供する関数)
3   ライブラリコール (システムライブラリに含まれる関数)
4   スペシャルファイル (通常 \/dev に置かれている)
5   ファイルのフォーマットとその約束事。例えば \/etc\/passwd など
6   ゲーム
7   マクロのパッケージとその約束事。例えば man(7), groff(7) など
8   システム管理用のコマンド (通常は root 専用)
9   カーネルルーチン [非標準]
```

- [Linux道場 入門編](http://www.lpi.or.jp/column/linux/index.shtml)
ブートフローの説明、ファイルシステムの考え方とか。

- [組み込み開発の基礎知識と開発の流れ](http://monoist.atmarkit.co.jp/mn/articles/0508/09/news112.html)
もやっと流れ。

- [Device Tree についてのまとめ]
(http://qiita.com/koara-local/items/ed99a7b96a0ca252fc4e)

- [Device Tree 入門]
(http://masahir0y.blogspot.jp/2014/05/device-tree.html)
「Device Tree を知らないと、SoCの移植はおろか、ドライバの開発もできない。」

- [コマンドラインオプションの処理]
(http://www.mm2d.net/main/prog/c/getopt-03.html)
getopt()とgetopt_long()の使い方。

- [UNIX におけるプロセス間通信と排他制御]
(http://ieice-hbkb.org/files/07/07gun_03hen_07.pdf)
上記ページ内で"pfd"を検索。


##boot関係
- [LinuxカーネルのuImageのフォーマット/作成手順/ブート開始]
(http://fowlrat.hatenablog.com/entry/2014/08/31/011056)

- [Ubuntuでネットブート]
(http://i.cla.kobe-u.ac.jp/murao/docs/NetbootLinux/index.html)


##Makefileの使い方
- [Makefileの書き方(C言語)](http://www.ie.u-ryukyu.ac.jp/~e085739/c.makefile.tuts.html)
あとで理解する。

- 代入参照

```
SRCS = main.cpp
OBJS = $(SRCS:%.cpp=%.o)
$(PROGRAM) : $(OBJS)
```

こうすると、依存ファイル名にSRCSで指定した.cppのファイル名がそのままに.oとして渡せる。
つまりOBJSには”main.o”が代入されている。
patsubst関数とか。下記参照。
[GNU make 日本語訳(Coop編) - 変数の利用法 - ecoop.net]
(http://www.ecoop.net/coop/translated/GNUMake3.77/make_8.jp.html#SEC76)


##Yocto関係
-[Yocto Project Quick Start](http://www.yoctoproject.org/docs/1.6/yocto-project-qs/yocto-project-qs.html)

-[SINBY Back Yard Report](http://www.sinby.com/backyard-report/)
Yoctoの全体像の説明。


##ハイパーバイザ関係
- [なぜ，組み込みシステムにハイパーバイザが必要か](http://www.kumikomi.net/archives/2011/02/rtos.php)

- [組み込みシステムに吹く“仮想化”の風 (1/2)]
(http://monoist.atmarkit.co.jp/mn/articles/0811/14/news132.html)


##Git
- [Git初心者が使い方を学習するためのおすすめサイトをまとめてみた]
(http://www.north-geek.com/entry/git)
Macのdateコマンドで前日の日付を取得する

Macのコンソールでは `date` に `--date` がないのでたまにハマる
目的が前日以外でも適宜読み替えるといいと思う

### Linuxで前日
`date --date 'yesterday'`
or
`date -d 'yesterday'`
`date -d '1 day ago'`

### Macで前日
`date -v -1d`
telnetでProxyに接続してwebsocketに切り替える(101 Switching Protocols)まで


telnetでProxy越しに http://websocketstest.com/ へwebsocketで接続してみる。
まずはtelnetに流し込むスクリプトを作成。ここではSSLなしのポート443を使っている。

```bash:websocket.sh
#!/bin/bash
sleep 1
echo CONNECT ws.websocketstest.com:443 HTTP/1.1
echo
sleep 2
echo GET ws://ws.websocketstest.com:443/service HTTP/1.1
echo Host: ws.websocketstest.com:443
echo Upgrade: websocket
echo Connection: Upgrade
echo Sec-WebSocket-Key: $(echo -n "1234567890123456" | base64)
echo Sec-WebSocket-Version: 13
echo
sleep 3
```

`Sec-WebSocket-Key`は[RFC6455](https://triple-underscore.github.io/RFC6455-ja.html)では

> 無作為に選ばれた 16 バイト値を base64 符号化した nonce でなければならない

となっている。

telnetで接続してみる。

```bash
$ ./websocket.sh | telnet <proxy host> <proxy port>
Trying <proxy ip>...
Connected to <proxy host>.
Escape character is '^]'.
HTTP/1.1 200 Connection established

HTTP/1.1 101 Switching Protocols
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Accept: +I6SyLIaWoDVyDga6eYd6AAeTAo=


connected,
```

接続できた。

`Sec-Websocket-Accept`の値は以下のように算出されている

```bash
$ echo -n "1234567890123456" | base64 | xargs -i echo -n "{}258EAFA5-E914-47DA-95CA-C5AB0DC85B11" | openssl dgst -sha1 -binary -c | base64
+I6SyLIaWoDVyDga6eYd6AAeTAo=
```
Xcode 7.3.1 Archive でipa作成できず

Xcode 7.3.1 (swift) でiPad用のアプリを作っています。
Enterprise版でしようしゃがわでダウンロードする形式をとっています。
すでに2回その方法で(別の担当者が)リリースしています。
今回は私がリリースをする担当になり、前回のリリース手順ににならって作業しているのですが、*.ipaファイルが作成されなくて困っています。
OrganizerからFinderを開くと、そこには *.xcarchiveファイルが作られているだけで、*.ipa ファイルが見当たりません。

いくつか記事を調べると、xcodebuildコマンドで xcarchiveファイル から ipaファイルを作成できることはわかったのですが、前任者はそのような手順は行っていないとのことでした。

なにか設定などが不足していることでしょうか。
心当たりのある方、ご教示ください。

手順は以下のとおりです。
1.[Product]-[Archive]クリック
2.Archives 画面で[Export]クリック
3.Select a method for export 画面で[Save for Enterprise Development]を選択し、[Next]クリック
4.登録されているProvisioning を確認して、[Choose]クリック
5.Device Support 画面で、Export one app for all compatible devices を選択し、[Next]クリック
6.Summary 画面で、Rebuild from bit code のみ選択し、[Next]クリック
7.Export As:他が表示される画面で、[Export]クリック
特にエラーなどなく終了しているようです。
logo > link > (powered by / 複数組織で協力) の例

複数組織のコラボレーションを明示するロゴの例。

googleで適当検索した結果。

1. [HPE Software UniversityとInfaum EDU TECH](
http://image.slidesharecdn.com/orientationweb-160810091740/95/orientation-program-on-automated-software-testing-powered-by-infaum-educational-technology-1-638.jpg?cb=1470820674)

2. [Wii Street powered by Google](https://cdn02.nintendo-europe.com/media/images/05_packshots/games_13/wiiu_download_software_2/PS_WiiUDS_WiiStreetUPoweredByGoogle.png)

3. [Umbrella powered by Agile Software](http://www.agilesoftware.co.za/wp-content/uploads/2012/04/umb.png)

4. [Association Management Software powered by salesforce paltform](http://www.nimbleams.com/images/NimbleAMSBanner.jpg)

「これだ」というものは見つからず。

5. [NASA and NEPP](http://slideplayer.com/19/5737366/big_thumb.jpg)
6. [JPSS : NASA, NOAA, と何か(読めない)](https://jointmission.gsfc.nasa.gov/images/jpss_article.jpg)

ロゴだけを並べるというのが一つの方法。

7. [OSIRIS-REx : Asteroid Sample return mission](https://4.bp.blogspot.com/-kv-jEZXwlxw/V9r3WTN2BzI/AAAAAAAA15I/Vyb7qnAkcDsRMDhtFhFeBhN9kPaSclFsQCLcB/s1600/OSIRIS-REx-Mission-Logo-with-Partners.png)
   - NASA/KSC
   - CNES
   - CSA/ASC
   - ULA
   - KINETX
   - MIT
   - NASA/JSC
   - ASU
   - University of Arizona/JPL
   - NASA/GSFC
   - Lochkheed Martin

これだ。
ルーター機器(NEC IX2015)によるネットワークの冗長構成

#背景
山間部のネットワーク構築で、天候が雨天や降雪で悪化すると無線のWiFiでは通信が途切れてしまうので、メタル回線によるバックアップで冗長構成をする場合があります。これを例にネットワークの基本的な冗長構成を紹介します。
IoTとか監視カメラでも今後も使われて行くので、構成機器や回線種類は違っても基本は同じでしょう。

#機器構成
- NEC IX2015 ２台

速度は100Mですが中古で安く入手出来るのでお勧めのルーター機器です。
相互接続する場合には、クロスケーブルでないとリンクアップしないので注意。

#冗長構成図
![ネットワークの冗長構成.png](https://qiita-image-store.s3.amazonaws.com/0/35898/34c9ae2f-eca8-675b-2cb9-4a324096dfc5.png)
サブネットは4つで構成します。
メインの接続回線がLink1の172.16.1.0/24になります。ここを無線WiFi接続と想定します。
バックアップの接続回線がLink2の172.16.2.0/24になります。ここをメタル回線接続を想定します。
利用するネットワークはNetwork1の192.168.1.0/24で、対向のネットワークであるNetwork2の192.168.2.0/24と相互接続を維持する冗長構成を構築します。
Link1の接続が途切れた場合にはLink2での接続ルートに切り替えて、復帰した場合にはLink1の接続に戻します。

#モニター設定
ネットワークのゲートウェイ設定でメトリック値で優先順位を付けただけでも出来ますが、モニター設定で応答がない場合に明確に該当ルーティングテーブルを止める設定をします。
ここで監視設定するIPアドレスは、対向のルーター側インターフェースにします。
Network1からは対向ルータの192.168.2.1
Network2からは対向ルータの192.168.1.1

#IX2015 Network1側設定
```
hostname ix2015tets_01

ip route 192.168.2.0/24 172.16.1.2
ip route 192.168.2.0/24 172.16.2.2 FastEthernet0/1.0 metric 10
ip dhcp enable
ip ufs-cache enable

watch-group main-watch 10
 event 10 ip unreach-host 192.168.2.1 FastEthernet0/0.0
 action 10 ip shutdown-route 192.168.2.0/24 172.16.1.2

network-monitor main-watch directed-response
network-monitor main-watch enable

ip dhcp profile lan1
  assignable-range 192.168.1.2 192.168.1.10
  default-gateway 192.168.1.1
  dns-server 192.168.1.1

interface FastEthernet0/0.0
  ip address 172.16.1.1/24 
  no shutdown

interface FastEthernet0/1.0
  ip address 172.16.2.1/24 
  no shutdown

interface FastEthernet1/0.0
  ip address 192.168.1.1/24 
  ip dhcp binding lan1
  no shutdown
```
設定コマンドの詳細については説明を省きますが、モニター設定の要点としては、
action 10 ip shutdown-route [止めるルーティングテーブル]
と明示する所で、インターフェースFastEthernet0/0.0を指定すると動作が違ってくるので注意。

#IX2015 Network2側設定
```
hostname ix2015tets_02

ip route 192.168.1.0/24 172.16.1.1
ip route 192.168.1.0/24 172.16.2.1 FastEthernet0/1.0 metric 10
ip dhcp enable
ip ufs-cache enable

watch-group main-watch 10
 event 10 ip unreach-host 192.168.1.1 FastEthernet0/0.0
 action 10 ip shutdown-route 192.168.1.0/24 172.16.1.1

network-monitor main-watch directed-response
network-monitor main-watch enable

ip dhcp profile lan2
  assignable-range 192.168.2.2 192.168.2.10
  default-gateway 192.168.2.1
  dns-server 192.168.2.1

interface FastEthernet0/0.0
  ip address 172.16.1.2/24 
  no shutdown

interface FastEthernet0/1.0
  ip address 172.16.2.2/24 
  no shutdown

interface FastEthernet1/0.0
  ip address 192.168.2.1/24 
  ip dhcp binding lan2
  no shutdown
```
Network1側と同じ考え方で設定します。

#検証環境
![IMG_2163.JPG](https://qiita-image-store.s3.amazonaws.com/0/35898/2d56f71c-2c8d-9112-6d4a-0bc00e50cee5.jpeg)
- IX2015 2台
- Network2側　ThinkPad X61s OS:Debian GNU/Linux 8 Xfce
- Network1側　ThinkPad X200s OS:Linux Mint 18 MATE
- FE0/0側はクロス変換アダプター使用
- FE0/1側はクロスケーブルを作成して使用
macOS 10.12 Sierraで⌘(Command)ボタンひとつで英かなをトグルさせる

# ⌘ボタンをトグルにしたい人向けガイド
macOS 10.12 Sierraでは、現時点でKarabinerが使えません。

もしあなたが英語キーボードを使用していて、
利用目的が「⌘ボタンを英かなのトグルにする」ことだけであれば、複雑なことをせず対応できます。

片方のコマンドをMac用のトグル、もう片方をParallelsのWindows用のトグルにすることも可能です。

## 1. 「⌘英かな」をインストールする
https://ei-kana.appspot.com/
![sc 2016-10-20 13.55.01.png](https://qiita-image-store.s3.amazonaws.com/0/1818/ea80b84d-0591-212c-ad0b-92c916a85508.png)
私の場合、Macでのトグルは右コマンドボタンで行います。
⌘英かなでは、⌘Spaceをoutputにします。

## 2. 入力ソースの切り替えを変更する
![sc 2016-10-20 13.58.14.png](https://qiita-image-store.s3.amazonaws.com/0/1818/de19bac8-b0ca-c7a1-caa1-e4ddc102c714.png)
先程設定した、⌘Spaceを入力ソースの切り替えに当てます。

トグルにならない場合は一度、⌘英かなやOS自体を再起動してみてください。

# ParallesのWindows10のトグル設定
※ もっとキレイなやり方があれば教えてください。。。

## 1. Parallelsの環境設定で⌘Space -> Ctrl+Spaceにする
![sc 2016-10-20 14.00.30.png](https://qiita-image-store.s3.amazonaws.com/0/1818/bd250b15-6c33-45d2-2051-cda20f9afeae.png)

## 2. Windows側でIMEのオン/オフを設定する
### Microsoft IMEの場合
![sc 2016-10-20 14.05.19.png](https://qiita-image-store.s3.amazonaws.com/0/1818/3cbcd5e5-5a76-e39e-4749-8d843a08bfdb.png)
IMEのキー設定で、Ctrl+SpaceをIMEのオン/オフに割り当てれば完了です。

### Google日本語入力の場合
![sc 2016-10-20 14.10.30.png](https://qiita-image-store.s3.amazonaws.com/0/1818/e5cecd9a-7c62-03fd-cfd5-0791f95cf221.png)
CentOS7にcode::blocksをインストール＋日本語化＋Makefileを使うプロジェクト作成


gdbでコマンドプロンプトからデバッグするのに苦痛を感じたのでc++で使いやすいGUI環境を探したところcode::blocksというGUIのツールを発見。
code::blocksはGUIのデバッガとしては結構使えます。
少なくともnetbeansよりはサクサク動きます。
linuxでc++開発している方は入れておいて損はないと思います。

### インストール
CentOS7のyumで取ってこれるのは13.12と古いバージョンとなりますがデバッグするのには全然問題ありません。
codeblocks-develとcodeblocks-contribの2つを入れます。

    sudo yum install codeblocks-devel codeblocks-contrib

### 日本語化
- http://algo13.net/codeblocks/
からcodeblocks.moをダウンロード
- /usr/share/codeblock以下にlocale/ja_JPフォルダを作りcodeblocks.moをその中に置く。
(/usr/share/codeblock/locale/ja_JP/codeblocks.moに置く)
- 起動後[Setting] > [Environment] > [View] > [Internationalization]にチェックを入れる。
- その横にあるプルダウンからJapaneseを選択。
- code::blocksを再起動。
以上で日本語化できます。

※キーショートカットを変更した後に日本語化したところ設定したショートカットが元に戻ってしまいました。
日本語化した後キーショートカットを設定した方が良さそうです。

### 既存のMakefileを使ったプロジェクトの作成方法

http://demura.net/misc/2999.html
の焼き直しのような記事なので詳しくは上記を見てください。
画像もあってここより見やすいです。

- [ファイル(F)]→[新規]→[プロジェクト…]を選択
- Console applicationを選びGoを押す。
- Console applicationのWelcome画面がでるので次へを押す。
  (このページを次回スキップにチェックを入れてしまうといいかも)
-  言語選択の画面になるので開発する言語を選択して次へを押す。
-  プロジェクト名入力画面になるので既存のメイクファイルが含まれたフォルダのさらに一つ上のフォルダを指定、名前をメイクファイルが含まれたフォルダ名にして次へを押す。
-  コンパイラ選択画面でbuildターゲットをMakefileに合わせて名前の変更とバイナリパスをMakefileとあったものにする。オブジェクト出力パスはできれば合わせておくとよいがあってなくても不都合はないはず。
  (ビルドターゲットが3つ以上ある場合はプロジェクト作成後追加することができます)
- 終了を押すとプロジェクトが作成されます。main.cppがプロジェクトフォルダに存在する場合は上書きしていいか聞かれますがいいえで上書きされないようにしてください。
- プロジェクト作成後、プロジェクトのプロパティを開きます。
- [プロジェクト設定]タブの[Makefile]項目の[This is a custom Makefile]にチェックを入れる。
  (このチェックを入れないとMakefileが使用されません)
- [ビルドターゲット]タブの [ビルドオプション]ボタンを押します。
- ターゲットを選択し[”Make”コマンド]タブを開きます。
- Makefileに合わせたコマンド引数を設定します。
以上でMakefileを使用してBuildができるようになります。
ただこの状態ではプロジェクト内のソースが追加されていませんので[プロジェクト]の[ファイルを追加]または[ファイルを再帰的に追加]で適宜ファイルを追加してください。
Optimus 構成ノートPCで、CUDAインストール 試行錯誤ログ

```bash

# 前準備
sudo apt-get install vim mesa-utils openssh-server build-essential

# bumblebeeのリポジトリ追加＋最新版へ更新
sudo add-apt-repository ppa:bumblebee/stable
sudo apt-get update

# bumblebee一式のインストール(公式ページでのubuntu14.04のインストール方法を参考)
sudo apt-get install bumblebee bumblebee-nvidia primus linux-headers-generic

# blacklist
sudo sh -c 'echo "blacklist nouveau\noptions nouveau modeset=0" > /etc/modprobe.d/blacklist-nouveau.conf'
cat /etc/modprobe.d/blacklist-nouveau.conf
echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf
sudo update-initramfs -u
sudo reboot -r now

wget https://developer.nvidia.com/compute/cuda/8.0/prod/local_installers/cuda_8.0.44_linux-run
sudo chmod a+x ./cuda_8.0.44_linux.run
./cuda_8.0.44_linux.run -extract=~/nvidia_installers

cd nvidia_installers
sudo ./cuda-linux64-rel-8.0.44-21122537.run --no-opengl-libs
sudo ./cuda-samples-linux-8.0.44-21122537.run --no-opengl-libs
sudo ./NVIDIA-Linux-x86_64-367.48.run --no-opengl-files
# "not apper to have an NVIDIA GPU supported by the 367.48..." --> OK
# "LICENSE" --> Accept
# "pre-install script failed!" --> Continue installation
# "register the kernel module source with DKMS?" --> Yes
# "32-bit compatibility libraries" --> No
# "NVIDIA X driver will be used when you restart x?" --> No
# "complete" --> OK
sudo shutdown -r now


$ sudo vim /etc/bumblebee/bumblebee.conf

# 次のように変更します
# 22行: Driver=nvidia
# 55行: KernelDriver=nvidia-367
# 58行: LibraryPath=/usr/lib/nvidia-367:/usr/lib32/nvidia-367
# 61行: XorgModulePath=/usr/lib/nvidia-367/xorg,/usr/lib/xorg/modules
# 
# vim コマンドだったら以下
# %s/Driver=/Driver=nvidia/gc
# %s/-current/-367/gc

$ sudo vi /etc/modprobe.d/bumblebee.conf

# 以下があることを確認
# blacklist nvidia-367
# blacklist nvidia-367-updates
# blacklist nvidia-experimental-367
```
OpenMediaVault 3 beta すごく良い

## 参考

* [[メモ] RasPi2でNAS (minibianベースにOpenMediaVault) - Qiita](http://qiita.com/mt08/items/85e502553d362a25660e)
* Download [openmediavault - Browse Files at SourceForge.net](https://sourceforge.net/projects/openmediavault/files/3.0beta/)


## 特徴

* Debianインストールした後にOMV3をインストール可能。
* メモリ使用量が少ない。150MB〜300MBくらい。(proxmoxが食い過ぎ？)
* OMV3 betaは Debian jessieベース。(OMV2はwheezy)
* backport kernel を使うと kernel 4.7.0 が入る。
* RAIDの構築が簡単だが、OSを入れたDISKはRAID対象にできなかった。
* DISKは1個では使えません。複数用意してください。

## extra plugin

* [OMV-Extras.org Plugin - Guides - openmediavault](http://forum.openmediavault.org/index.php/Thread/5549-OMV-Extras-org-Plugin/)を入れないと始まりません。
    * [OMV 3.x](http://omv-extras.org/joomla/index.php/omv-plugins-3)
* http://omv-extras.org/openmediavault-omvextrasorg_latest_all3.deb を入れて以下プラグインを追加。

![スクリーンショット 2016-10-20 16.11.40.png](https://qiita-image-store.s3.amazonaws.com/0/25728/9cdfe7e2-4d4a-000a-8032-e8a6fe3c747f.png)


## メニュー

* admin : openmediavault でログイン。
* 赤枠のものは追加でインストールしたプラグイン

![スクリーンショット 2016-10-20 15.57.53.png](https://qiita-image-store.s3.amazonaws.com/0/25728/8360a59a-7361-7a69-a200-ca965b694d5f.png)


## phpVirtualboxが簡単に利用可能

以下プラグインを追加

![スクリーンショット 2016-10-20 16.12.08.png](https://qiita-image-store.s3.amazonaws.com/0/25728/5100f2f2-0350-370b-21b1-638c91cd4e4d.png)


* 32bitしか選択できない場合は仮想化支援が有効になっていないのでBIOSなどで修正する。

![スクリーンショット 2016-10-20 16.54.05.png](https://qiita-image-store.s3.amazonaws.com/0/25728/bf8a03f4-64b0-b919-f5db-54e84c66e641.png)

* admin : openmediavault でログイン。

![スクリーンショット 2016-10-20 15.55.13.png](https://qiita-image-store.s3.amazonaws.com/0/25728/5f48ab1e-477f-1296-cae3-48795014f6ad.png)

## web shell

* port 4200

![スクリーンショット 2016-10-20 16.25.58.png](https://qiita-image-store.s3.amazonaws.com/0/25728/5307516c-c941-abf8-735b-953286d89519.png)

## ダウンローダー

![dl.png](https://qiita-image-store.s3.amazonaws.com/0/25728/0bd3f034-3fe7-ad9b-fa7d-2fa1c1fcfaf7.png)


## xrdp

![スクリーンショット 2016-10-20 16.36.45.png](https://qiita-image-store.s3.amazonaws.com/0/25728/d2b2e092-980a-dde9-2374-4a37007f6962.png)

![スクリーンショット 2016-10-20 16.36.38.png](https://qiita-image-store.s3.amazonaws.com/0/25728/5291c34d-99cf-67f3-b579-bcec47d0bf86.png)

* fonts-takao か fonts-mona を入れてOS再起動で解決します。
    * (xfonts-intl-japanese も入れたが必要なかったかも)

![スクリーンショット 2016-10-20 16.40.00.png](https://qiita-image-store.s3.amazonaws.com/0/25728/72253fef-2278-0b01-6241-c22ededfb358.png)

* もし`root`でログインして $PATH に /sbin/ が含まれない場合は `su -`すれば良い。


## docker GUI

* とてもいい感じにできている。Exposed Portを選べるのが楽。

![スクリーンショット 2016-10-20 16.45.06.png](https://qiita-image-store.s3.amazonaws.com/0/25728/63d35bd9-158a-40d0-be43-53dcd3f5f60e.png)