OmniAICreator/Qiita-1.07M huggingface dataset:
SSH のポート転送で家から会社の管理画面を見られるようにする

#問題と条件

1. 管理画面の admin.example.com には社内からしかアクセスできない。
3. 自宅から管理画面を見たいがアクセスの許可はできない。
2. 会社の外から社内の fumidai.example.com へは ssh ログインできる。

このような場合には SSH のポート転送を使うとなんとかなる。

## 手順

1. 自宅のパソコンで以下のコマンドを実行する
```
ssh -L 8081:admin.example.com:80 foo@fumidai.example.com
```
2. ブラウザで `http://localhost:8081` を開く
3. 管理画面が見えると思う

**リンクなどが絶対パスで書かれているとそのURLへは到達できないので動きません。**

## 図
![https://i.gyazo.com/71cc73f2a9af1994933a5de7e75e5830.png](https://i.gyazo.com/71cc73f2a9af1994933a5de7e75e5830.png)

## 参考

↓ がわかりやすかった。

https://www.kmc.gr.jp/advent-calendar/ssh/2013/12/09/tunnel2.html
[memo]gitのコミットで自動でissue番号をメッセージに入れてくれる様にする。

コミットの度にブランチ名のissue確認して入れるのは入れ忘れもするし、面倒なので、（色んなパターン用意するのは面倒なので）簡易的なものを作成したので、メモ。

# ブランチ名のルール
ブランチ名のどこにissue番号を入れてもいいけど、ブランチ名に数字はissue番号のみ

# git hooksの修正

```:.git/hooks/prepare-commit-msg
#!/bin/bash

PREFIX=${PREFIX:-#}

message_file=$1
mode=$2

if [ "$mode" = "" ] || [ "$mode" = "message" ] ; then
  ticket_number=`git branch | grep "*" | awk '{print $2}' | sed -e 's/[^0-9]//g' `
  if [ "$ticket_number" != "" ]; then
    mv $message_file $message_file.tmp
    echo "$PREFIX$ticket_number `cat $message_file.tmp`" > $message_file
  fi
fi
```

`$ chmod +x prepare-commit-msg`

# 編集履歴
2017/09/30 : issue番号とコメントの間に改行が入ってしまうので、繋げるだけにしました。
rspec3でメソッドが呼び出されたかテストする


### TL/DR

rspecのテストを書いてる時
メソッドが呼び出されているかどうかだけ
確認したい時、ありませんか？

そんな時のやり方です。

### <i class="fa fa-hand-o-right"></i> rspec-mocksのSpyという機能を使います
Test Spies
https://github.com/rspec/rspec-mocks#test-spies


```rb
# メソッドを監視するコード
allow(オブジェクト).to receive(:メソッド名)
# テストコード
expect(オブジェクト).to have_received(:メソッド名).once
```

のような感じ。

### <i class="fa fa-code"></i> code 

例えばこんなメソッドがあって、
振る舞いのテストを作成したい時に


```rb
class Order
  def create(order)
    if order.save
      Bill.create(order)
      NoticeMailer.new(email: order.email).send()
      'success!'
    else
      'error!'
    end
  end
end
```

Bill.create(order)や
NoticeMailer.new(email: order.email).send()は
別のとこでテストしているから、もういいんだよ。
でもちゃんと呼ばれているかだけ
確認しときたいって時。


```rb
  describe '#create' do
    let(:new_order){ build(:new_order) }

    before do
      allow(Bill).to receive(:create)
      allow(NoticeMailer).to receive_message_chain(:new, :send)
    end
    context 'no user' do
      it do
        Order.create(new_order)
        expect(Bill).to have_received(:create).once
        expect(NoticeMailer.new).to have_received(:send).once
      end
    end
  end
```

こんな感じになります。

### <i class="fa fa-desktop"></i> environment

```bash
$ rails -v
Rails 4.2.6
$ bundle exec rspec -v
3.4.4
```

### thank you ..<i class="fa fa-heart"></i>
http://journal.sooey.com/254
HTTPレスポンスステータスには、600番台がほしかった

HTTPレスポンスで、特に失敗の場合のステータスには400番台と500番台があります。
大きく分けて、

- 「呼んだ側が悪い」のが400番台。権限違反から書式違反からいろいろ。
- 「呼ばれた側が悪い」のが500番台。裏方が落ちてるのも何だかわからないけど処理がうまく動かなかったのも。

この分類自体は普遍的と言えます。例えばJavaの例外を検査例外にすべきかどうかは、「呼んだ側が悪い」系だったら注意深いプログラミングで完全に発生を回避できるんだから非検査例外で良いよねと判断すればいい、という話を別記事でまとめたことがあります。

でもこの分類以外にもう一つ、失敗の類型はあるはずなのです。

- 「誰も悪くない」⋯ 同名のユーザーがすでに存在した、など。

ユーザー作成をリクエストする側はリクエストしてみるその瞬間まで同名のユーザーが存在しないかどうかわかりませんし、サーバー側はもちろん粛々と制約に従ってリクエストをはじいただけだから悪くありません。

「どちらが悪い」とかいうと責任のなすりつけあいの話みたいですけど、プログラミング上の実践的な話で言うと**リクエスト側は注意深くプログラミングしても避けられず、かといって正常なサーバーから返されうるので正常な処理ルートの一部として処理しないといけない失敗**であると言えます。

こういうのに400番台でも500番台でもない、別の名前がほしかった。600番台とかね。

ここでまた例外の話に戻るのですが、アプリケーションプログラミングの世界においても「呼ぶ側が悪かった例外」「呼ばれた側が悪かった例外」に加えて「誰も悪くない例外」が有り得るわけです。よく例外の取り扱いの常識として「正常系の処理フローに例外キャッチを使ってはいけない」というのがありますが、「誰も悪くない例外」はそれに該当しないのではないか、と提言します。
UnicornでSO_REUSEPORTを使う

# はじめに

Dockerでホットデプロイをする際にコンテナの入れ替えを単一サーバで実現したい。
SO_REUSEPORTを使うことで簡単に実現できそうです。

# 動作環境

Linuxカーネル: 3.9以上
Unicorn: 4.7.0以上

SO_REUSEPORTに対応したバージョンは以上となっています。

# WEBアプリ構成

```
+ app
  - Gemfile
  - config.ru
  - unicorn.ru
```

```ruby:Gemfile
source "https://rubygems.org"

gem 'sinatra'
gem 'unicorn'
```

```ruby:config.ru
require 'sinatra/base'

class SampleApp < Sinatra::Base
  get '/' do
    "hello\n"
  end
end
run SampleApp
```

Sinatraアプリの作成。識別用にhelloというメッセージが表示されるようにしときます。

```
dir = File.expand_path(".")

worker_processes 2
working_directory dir

listen 3000, :reuseport => true
```

ポートの待受にreuseportオプションが使えるので指定します。


# WEBアプリの起動

```sh
$ unicorn -c unicorn.rb
```

次にWEBアプリの内容を変更して、別アプリとして起動します。

```ruby:config.ru
require 'sinatra/base'

class SampleApp < Sinatra::Base
  get '/' do
-    "hello\n"
+    "hello world\n"
  end
end
run SampleApp
```

起動します。

```sh
$ unicorn -c unicorn.rb
```

# 動作確認

```
$ curl http://localhost:3000/
hello
$ curl http://localhost:3000/
hello world
```

同じポートで起動したアプリにそれぞれアクセスできています。
最新のマイルストーンの自分にアサインされている issue の一覧のページを開く

## 概要

最新のマイルストーンの自分にアサインされている issue の一覧ページを開くコマンド `yarukoto` を作りました。

ブックマークでも同じようなことが出来ますが、マイルストーンが変わると URL も変わってしまうので、ときどき作りなおす必要がありました。

`yarukoto` コマンドではリポジトリの最新のマイルストーンを取得して URL を生成し、ブラウザでページを開きます。

コンソールに一覧を出力してもいいのですが、内容を確認したかったり、Toggle や ZenHub などの連携ツールを使ったりしているのでブラウザで見たかった感じです。

朝会の前に叩くと良い感じでした。

## コード

CoffeeScript と ghi を使っています。

```coffee:yarukoto
#!/usr/local/bin/coffee
execSync = require("child_process").execSync

getMilestone = (path) ->
  ghiOutput = execSync("ghi milestone -v", {
    "cwd": path
  }).toString "utf8"

  # #<issue number>: <milestone name> にマッチさせて <issue number> でソート
  matches = ghiOutput.match(/^#[0-9]+: .+$/mg)
    .map (m) -> m.match(/^#([0-9]+): (.+)$/)
    .sort (a, b) -> parseInt(b[1]) - parseInt(a[1])

  # 最新の milestone の名前を返す
  matches[0][2]

openRecentMilestone = (assignee, repo, path) ->
  nextVersion = getMilestone path
  queries = [
    "is:open"
    "is:issue"
    "assignee:#{assignee}"
    "milestone:#{nextVersion}"
  ]
  url = "https://github.com/#{repo}/issues?q=#{queries.join("+")}"
  execSync "open #{url}"
  console.log "#{path}: #{nextVersion}"

openRecentMilestone "YOUR GITHUB USERNAME", "YOURCOMPANY/REPONAME1", "/path/to/repository"
openRecentMilestone "YOUR GITHUB USERNAME", "YOURCOMPANY/REPONAME2", "/path/to/repository2"
```

`/usr/local/bin/yarukoto` として保存して出社時に `yarukoto` します。
GETとPOSTの使い分け ついでにPUTとDELETE


PHP 5.5.31
CakePHP 2.8.0

GETとPOSTの違いをよく忘れるので、CakePHPの時の使い分けとともにまとめます。

以下を参考に、ところどころ引用しています。
http://techtipshoge.blogspot.jp/2012/08/getpost.html

# GETとPOSTの役割
入力フォームのデータをサーバへリクエストするときに使用する。

# 定義
## GETの定義
- リクエストとして送信されるデータはURLに含まれる
(「URL?パラメータ名=値」という形式)
「?」パラメータのはじまり
「&」パラメータの切れ目
「=」挟んだ左側がGETの変数名、右側が渡される値

- データを取得したい時に使用
データベースの書き換えが必要ない場合。

## POSTの定義
- リクエストとして送信されるデータはメッセージボディ部に含まれる
メッセージボディは、HTTPリクエストのパラメータ内容を渡す場所。

- データを変更したい時に使用
データのソート、更新、削除、新規登録などで使用する場合。
パスワードのような秘匿情報をURLに表示したくない場合。
データ量が多い場合。
バイナリデータを送信したい場合。

# 実用的な違いと留意点
以下、参考サイトから文章を引用しつつ具体例を書いて理解を深める。

## 不用意にデータを消去されたり更新される可能性について
GETは、検索エンジンのクローラーがページを見に来る可能性があるため、データベースにアクセスするような内容は書かないようにする。
クローラーが来るたびにデータの追加、変更、削除をされないように、意図的に見に来ないPOSTで処理する必要がある。

## キャッシュできるかどうか
- GETリクエストに対するレスポンスはキャッシュする場合が多い
- POSTリクエストに対するレスポンスはキャッシュしない場合が多い

POSTがキャッシュしない場合が多い理由は、レスポンス(結果画面)だけをキャッシュして次回以降表示するだけでは、サーバ側で行うデータの追加、変更、削除の処理ができないためである。

## URLのブックマーク
- GETはURLをブックマーク保存できる
- POSTはURLをブックマーク保存できない

POSTでブックマークできない理由は、実行すると影響が出る処理（購入処理やデータの更新など）をPOSTで処理することが多いので、ブックマークを開くだけでそのような処理が走らないようにするため。
また、POSTの場合はブックマークから開くときにパラメータを含めることができないため、パラメータを必須とするリクエストに対応できないため。
※GETはURLにパラメータを含めることができるためブックマークから開いても正常に処理ができる。

## Webサーバやプロキシサーバのログ
- GETはログが残る。
URLにデータが含まれるためである。
リンク先へ移動するとrefererが残る。

- POSTはログが残らない。

## リクエストする文字について
- GETはASCII文字を使用したほうが良い

マルチバイト文字を使うとエラーが出る場合があるため。

- POSTは使用する文字に注意しなくてもよい

## 情報量
- GETは2,048文字
- POSTは無制限

## 更新、ブラウザの戻るボタンによって出るダイヤログ
- GETはダイヤログによる警告が出ない。
- POSTはダイヤログによる警告が出る。

データベースを更新するときや秘匿情報の送信でPOSTを利用するため、危険な情報を送信しているか確認する必要があるため。
例）ダイヤログが出ないと、知らない内にオンラインショップの購入を何度も行っているということが起きる。

# CakePHPで利用可能なPUTとDELETE
- PUT
データの変更（記事の内容やユーザー名を変更）

- DELETE
データの削除（記事を削除やユーザーを削除）

# CakePHPでリクエストパラメータの取得方法
- GETの場合

```
$this->request->query();
```

```
(CakePHP3.4以降)
$this->request->getQuery();
```

- POSTの場合

```
$this->request->data();
```

```
(CakePHP3.4以降)
$this->request->getData();
```
c++ builder XE4, 10.2 Tokyo > debug > ソフト終了時にTMemoの内容をクリップボードに送る

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

ソフト終了時にTMemoの内容をクリップボードに送る。

FormClose()処理ではクリップボードに送られなかった。
以下のようにフォームのデストラクタにて処理したらクリップボードに送られた。

```
__fastcall TForm1::~TForm1()
{
	Memo1->SelectAll();
	Memo1->CopyToClipboard();
}
```

Memo1のアドレスがNULLにならないかのプロテクトはかけて方がいいかもしれない。
Oracleで文字列型のDate文字列をYYYY年MM月DD日形式に直す

# やりたい事
- 文字列でYYYYMMDD形式の８文字がデータとして入っている
- SQLだけで、日付型として認識したい
- 日付型以外はNULLをとする
- フォーマットは `YYYY年MM月DD日` にしたい

# やること 
SQL芸

```sql
SELECT
    TO_CHAR(TO_DATE(CASE 
        WHEN date_value IS NULL THEN NULL
        WHEN NOT RegExp_Like(date_value,'^[0-9]{4}[0-9]{2}[0-9]{2}$') THEN NULL
        WHEN TO_NUMBER(SUBSTR(date_value,5, 2)) NOT BETWEEN 1 AND 12 THEN NULL
        WHEN TO_NUMBER(SUBSTR(date_value,7, 2)) >
            30+ CASE WHEN TO_NUMBER(SUBSTR(date_value,5 ,2)) IN(4, 6, 9, 11) THEN 0 ELSE 1 END
            THEN NULL
        WHEN TO_NUMBER(SUBSTR(date_value,5, 2)) = 2
            AND TO_NUMBER(SUBSTR(date_value,7, 2)) >
            28+ DECODE(TO_CHAR(TO_DATE(SUBSTR(date_value, 1, 4) || '1231','yyyymmdd'),'ddd'),'366', 1, 0)
            THEN NULL
    ELSE date_value END, 'YYYYMMDD'), 'YYYY"年"MM"月"DD"日"') as prefix 
FROM (
    SELECT '20170331' as date_value from dual
);

```

# 結果
```
2017年03月31日
```

# 参考:bow:

http://d.hatena.ne.jp/cloned/20060124
http://www.geocities.jp/oraclesqlpuzzle/10-41.html
外部サービスAPIを使用している場合の負荷試験方法

前回、負荷試験の全体の概要について書きましたが、今回はその時に行った外部APIの負荷試験について行った内容を書こうと思います。
今回の記事は、前回の記事[【はじめてのAPIサーバー負荷試験で得た最低限の負荷試験知識】](http://qiita.com/kinpira/items/66d8f07f9425cb81cf59)の「ここがむずかしいよ負荷試験」の「外部サービスのAPIを叩いている」という項目に値します。

負荷試験を行ったサーバー構成
-
今回作成したAPIサーバーは、API内部で外部サービスのAPIを叩いています。
<img width="443" alt="スクリーンショット 2016-03-21 23.19.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/93763/e8e807fb-fc24-6084-4055-cb878c94207b.png">

今回は外部サービスのsundboxは存在しなかった為、直接外部サービスを含んだ負荷テストは出来ないという状況でした。
しかも、今回の仕組みは初回時に外部サーバーで認証を行い、認証が通って初めて他のAPIが叩けるという構成になっていた為、ここで問題が発生してしまうと、新規ユーザーが一切処理が行えなくなってしまう程、重要な役割を占めていました。

外部サービスに行う負荷試験の目的
-

- 外部サービスのAPIの性能がどの程度影響を及ぼすのかを調べる  
 - 外部のサービスが絡んでいる場合、外部サービスのパフォーマンス状況に自社サーバーのパフォーマンスが大きく左右される事になります。
 問題時に対応する為には、どの程度の影響力があるのかを事前に知っておく必要があります。

どうやって試験をするか
-
冒頭でも言いましたが、今回は外部サービスのAPIにsundbox環境が存在しなかった為、負荷試験時に直接外部サービスに繋げて試験を行う事が出来ませんでした。

そこで、ダミーサーバーを用意し、今回はダミーサーバーに接続する事で、負荷試験を行う事にしました。
では、どのようにダミーサーバーでテストするのかという事なのですが、今回ダミーサーバーに1つだけ便利機能を付けて、その機能を使用する事で外部サーバーの影響度を計る事ができました。

ダミーサーバーの条件
-

- 通常の外部APIと同じリクエストを受付け、 同じ型のレスポンスを返す。
  - まずは、当たり前の事ですが、実際に使用する外部APIと同じ振る舞いをする事が最低条件です。

- レスポンスタイムを指定できる。
 - これが今回使用した便利機能です。レスポンスタイムを調整出来る事により、外部サーバーのパフォーマンスを何パターンか想定し、負荷試験を行う事が出来ます。

例を書くと、下記の様にヘッダーの<b>X-Sleep</b>の値によってレスポンスタイムが調整出来るようにしています。

```bash
curl -d '{"user":"hoge"}' https://dummy-server.jp/test/api -H "Content-type: application/json" -H "X-Sleep: 2000"
```

負荷試験の方法
-

- CPU使用率50%以下を正常値とします。
- locasutで外部APIと連動しているAPIのみのシナリオを作成し、負荷をかけます。
- ダミーサーバーのAPIのレスポンスタイム100ms から 3000msの間で固定した数パターンで計測し、ダミーサーバーのAPIのレスポンスタイムによってどのように影響するのかを計測します。
 - タイムアウトの設定時間等によって計測するレスポンスタイムは変えた方が良い。
- Medianが安定しなくなる、又は502エラーが置き始めた所を限界値して、そこまでのRPSをとCPU使用率を計測します。  
 - Median(中央値)が一気に跳ね上がった時は負荷によってパフォーマンスが劣化した事が考えられる  

<img width="1029" alt="スクリーンショット_2016-03-22_0_37_02.png" src="https://qiita-image-store.s3.amazonaws.com/0/93763/b99cbd53-9971-e31b-519a-7699bcf3fbda.png">




試験結果
-
下記が負荷試験結果の例です。

| レスポンスタイム | RPS | CPU使用率 |
|:-----------|--------:|:--------:|
| 100ms      |     230 |   90%    |
| 200ms      |     220 |   80%    |
| 300ms      |     200 |   75%    |
| 400ms      |     200 |   72%    |
| 500ms      |     190 |   65%    |
| 600ms      |     185 |   60%    |
| 700ms      |     175 |   60%    |
| 800ms      |     170 |   55%    |
| 900ms      |     155 |   50%    |
| 1000ms     |     140 |   45%    |
| 1500ms     |     110 |   30%    |
| 2000ms     |      85 |   20%    |
| 3000ms     |      60 |   15%    |

この結果から、レスポンスタイムが1000ms以上になった場合にCPU使用率が50%を越え、パフォーマンスが劣化している事が分かります。

この結果で導きだされる内容は、<b>外部サーバーのレスポンスタイムの平均が約1000ms以上だった場合に自社APIサーバーに影響をもたらす可能性があるという事です。</b>

負荷試験結果に添った考えられる対応
-
- サービスINした時に外部サーバーAPIのレスポンスタイムを計っておいて、レスポンスタイムの平均が1000ms以上だった場合はサーバー台数を増やす等の対応を行い、パフォーマンスを維持する事をいち早く判断できます。
- また、外部サービスAPI接続時のTimeOutの時間設定や、リトライを行うかどうか等の判断も上記の結果を元に選定できます。

さいごに
-
今回はこの様なアプローチで試験をしましたが、もっと他に良い方法があるかどうかは調べないとなーと思います。
ただ、何もしないよりは数字として、何か情報を持っていると安心感が違いますね。
CSV形式で成果物納品する場合の、テスト項目例 [備忘用メモ]


##要件：文字コードUTF-8、カラム内改行削除、カラムはダブルクオートで囲む

受け取り側もシステムで受け取るようなケース

###対応方法(Ruby)

```ruby:to_csv.rb
class Item < ActiveRecord::Base; end

CSV.open(outfile + "/output.csv", "w", force_quotes: true) do | writer |
  header = Item.attribute_names.dup

  writer << header

  Item.find_each(:batch_size=>1) do |item|
      row = item.attributes.values      
      writer << row.map{ |e| e.to_s.gsub(/(\r\n|\r|\n)/, "") }
  end
end

```


###実施テスト項目

vimでutf-8形式のまま開いて、以下を確認。

- \r\nが存在しない
	* [ ] 正規表現 /\r\n/ の検索結果が0個であることを確認
- \r改行が存在しない
	* [ ] 正規表現 /\r/ の検索結果が0個であることを確認
- \n改行は、各行の末尾以外に存在しない
	* [ ] 正規表現 /[^\"]\n/（"の直後以外の改行）の検索結果が0個であることを確認  
（/\"\n/（"の直後の改行）であれば全行末尾にマッチする）
	* [ ] 文章中の改行を含むcsvでは /[^\"]\n/（"の直後以外の改行）で、不正改行を検出できる。
- 文章内の"（ダブルクォート）はエスケープ「""」されている
	* [ ] 正規表現 /[^\,\"]\"[^\,\"]/ （「,」or「”」に隣接しない孤立した「"」）の検索結果が0個であることを確認
	* [ ] 正規表現/[^\,]\"[^\,]/ （「,」に隣接しない「"」）でエスケープされたダブルクオート「""」にマッチすることも確認

※ UTF-8版だけだとExcelなどで最終データの確認ができないため、できれば下記のShift_JIS版も作成して出力データの確認を行うほうがよい。


##要件：文字コードShift_JIS、カラム内改行削除、カラムはダブルクオートで囲む

受け取り側がWindows（Excel）で閲覧するようなケースはShift_JISで出力する。
もしくはUTF-16LEのタブ区切りファイルでもExcelで閲覧可能。

###対応方法(Ruby)

```ruby:to_csv.rb
class Item < ActiveRecord::Base; end

CSV.open("/output.csv", "w", :encoding => "Windows-31J", :row_sep => "\r\n", force_quotes: true) do |writer|

  header = Item.attribute_names.dup

  writer << header

  Item.find_each(:batch_size=>1) do |item|
      row = item.attributes.values      
      writer << row.map{|e| e.to_s.sjisable }.map{|e| e.gsub(/(\r\n|\r|\n|\f)/,"") }
  end
end
```

`String.sjisable` メソッドは[コチラを参照](http://qiita.com/yugo-yamamoto/items/0c12488447cb8c2fc018)


###実施テスト項目

- [ ] 上記、UTF-8版の確認と同様の項目を確認
- [ ] nkf -guess で文字コードがshift-jisであること  

```bash
$ nkf --guess rentalcars_new.csv
Shift_JIS (CRLF)
```

####SJISに変換し、Excel上でカラムずれが発生していないことを確認。

- [ ] 目視で左右、上下の末端行に凸凹がないことを確認
- [ ] 全カラム選択し、行の境をダブルクリック（セルの高さを改行にあわせて表示）し、  
高さが広がった行（改行を含む行）が存在しないことを目視確認

####ファイルのデータに問題が無いかExcelで確認

- [ ] カラムヘッダ（見出し）とデータがズレていないか、数点サンプリングして、CSVデータとデータ取得元（Webサイトなど）を目視で比較して最終確認。
	* ここで、同一値が多いレコード(データが「1」の列だらけなど）をサンプルに選ぶと、見出しがズレていても数値が元データと同一になり間違いを見落とす。  
	（1と1は入れ替わっても気づけない）
	* [ ] カラムヘッダのズレに気づくために、各カラムの数値がバラけたレコードをサンプルとして選択する。
		* 1 or 0 のセルがずらりと並ぶようなデータ項目の場合、入れ替わりによる見逃しの確立が高まるので、各カラム単位で1と0両方のレコードをサンプリングし、元データとの比較を行う。  
	（ただし、カラム数 x 2回の確認が必要になるので、工数は増える）
- [ ] オートフィルタを使用し、データに空白・nilが無いか？異常値が含まれていないか確認
- [ ] いくつかの項目を&で文字連結しユニークなidを作成し、idの重複が無いか確認  
	* ブランド「uniqro」、商品名「ストライプシャツ」、カラー「ホワイト」、サイズ「M」などの項目を文字連結して、「uniqroストライプシャツホワイトM」という文字列の新規カラム列をエクセル内に作成する。  
	* この列で重複するセルが無いか、countif関数などを利用して確認する。重複行があれば、データの二重登録が起きていないかなどを確認する。
	* 多くの場合、元データを見ると、重複行を分ける新規のデータ項目があることが多い。  
	 （「会員価格」「非会員価格」の価格の異なる「uniqroストライプシャツホワイトM」、など）
今日のクソコード

仕様書も何もないので直接プログラムをみて、ある機能の修正しなければいけない
そこで遭遇した今日のクソコード

``` $this->searchForm['search']['month'] ``` は「201603」などの検索月がはいるのだが。。。

```php
$target_month = $this->searchForm['search']['month'];

$tt = explode(',', date('t,j,Y-m-,t,Y-m-,w', strtotime("${target_month}01")));
```

このあと``` $tt ```を使っているのだが。。。
``` $tt ```で検索してもらいたい

```php
～～～～
if($target_month != date('Ym')){
	//過去日の場合
	$tt[1] = $tt[0];
	unset($tt[2]);
}else{
	$tt[1] = date('j') - 1;
	$tt[2] .= $tt[1];
}

$rday = 0;
if($tt[2]){
	$i = 1;$j = 0;
	while(($dd = $tt[1] + $i++) <= $tt[0]){
		$__w = ($dd - 1 + $tt[5]) % 7;
		if($this->ckDeliveryDate($delivery_schedule, $__w, $dd))$rday++;
	}
}

$line['budget_rate'] = $this->divide($re['cost'], $r['budget_operation']);
if(!$isDevice && $tt[2] && isset($re['daily_cost'])){ //if(isset($re['avg'])){
	$i = 0;$j = 0;
	$_avg = 0;
	while(($dd = $tt[1] - $i++) > 0){
		$d = sprintf("%s%02d", $tt[4], $dd);
		$__w = ($dd - 1 + $tt[5]) % 7;
		$flg = $this->ckDeliveryDate($delivery_schedule, $__w, $dd);
		if(!$flg && (!isset($daily_map) || !isset($daily_map[$dd])))continue;
		$_avg += $re['daily_cost'][$d]['cost'];
		if(++$j >= 7)break;
	}
	$line['forecast'] = $line['actual'] + $this->divide($_avg * $rday, $j, 1, 0);	//$re['avg']['cost']
}else{
	$line['forecast'] = $this->divide($re['cost'] * $tt[0], $tt[1], 1, 0);
}

～～～～
```

``` $tt[0] ```ってなんの日付！？ ``` $tt[1] ``` ってなんの日付！？
怖くてリファクタできません。。

あとで気づいたんだけど``` "${target_month}01" ```←これって動くんだ
ResearchKitを使ったアプリ案件をやってみて思ったこと

# 案件の概要
某医大と共同でAppleさんの協力のもとResearchKitを使った特定の病気に関する調査を行うアプリの開発を担当しました。

#ResearchKitって
ResearchKitは医療関係の研究者が研究のために、必要なデータを集めるためのアプリを作ることができるAppleが提供しているオープンソースのフレームワークです。オープンソースなので、誰でも利用できますが、基本的には医者や研究者が開発者と組んでアプリを作ることになると思います。今回の案件もそのような形で進んでいきました。

（参考記事：[Appleが先日発表した「ResearchKit」が非常におもしろい理由](http://www.lifehacker.jp/2015/03/150317apple_researchkit.html)）

# ResearchKitを使ったアプリを開発してみて思ったこと
## ResearchKitはあくまでテンプレート
ResearchKitはアンケートや加速度センサーなどを用いた計測などを行うためのUIやそのデータの統計をグラフで表示する機能を提供してくれます。つまりResearchKitは医療に関して直接的に何かを提供してくれるわけではなく、医療関係の研究に必要なデータを何らかの形でユーザまたは端末内のデータから入力させるためのUIなどを提供してくれるテンプレートのようなものなのです。

## 情報を入力させるためのUIおよび、入力されたデータを取得するなどのコードを簡単に実装できる
ResearchKitを使えば文字列や数値の入力や項目を選択させるアンケートのような画面を作ること、また、それら各入力画面を一まとめにして順番に表示させていくなどのUIを簡単に作成できます。
また、各処理に対してコールバックがあるため、細かく制御することが可能です。また入力された各情報をグラフ表示するためのフレームワークが備わっています。

## 少し凝ったUIやデザインをしたり、トリッキーな実装だと途端に扱いづらくなる
確かに単純なアンケートアプリのようなものならResearchKitを使えば、少ない労力でアプリが作れそうですが、少しUIやデザインを変えたくても、簡単に変えられない場合が多いです。全体のTintカラーを変える程度なら問題ないですが、単純に何かUI部品を追加しようとするなら、基のクラスを継承して自力で作るか、基のクラスを書き換える必要が出てきます。

また、少し変則的な仕様にしようとすると途端に実装の難易度があがります。例えば、一つ前の質問に答えに応じて、次の質問をスキップさせたいような場合、そもそも、ResearchKitでは、ひとまとまりになった複数の質問（画面）を予め生成してセットすることでUIが生成されていく仕様になっているため、途中である条件のときだけ、間の質問を無くすなどのようなことができません。ただ、無理やり次の質問に飛ばすことはできるため、そのように対応することはできますが、それでも前の質問に戻って再度答え直すこともできる仕様になっており、そのままだと、無理やり飛ばした質問を戻ることで表示できてしまうのです。

逆に言えば、ResearchKitを使うなら提供しているUIデザイン、機能でやってくれよということなのだと思います。

#まとめ
実際、この案件のアプリがResearchKitがなければ作れないわけではありません。ですが、Appleさんからすると、自分たちが提供しているResearchKitを使ってこのアプリは作られていて、そのアプリが医療の発展に役立つということをアピールしたわけです。ただ、ResarchKitがらみの案件は、基本の医療のために役立つ可能があるものですから、とてもよいことだと思いますので、積極的に関わっていきたい分野だと個人的には思っております。
ルンバ622　最初のシリアル通信　忘備録

#はじめに
PCとルンバの通信がうまくいかなかったので、行き始めるまでの記録

#使用機器
Windows　8.1
Visual Studio 2013
Roomba622(新品の状態）
USB-Serialコンバータ(AE-UM232R および　SparkFan　BOB-12731でチェック）

#メモ
###当初の現象
ルンバからの受信は問題なくできていたが、送信がダメ。
ルンバ2台、USB-Serialコンバータ2台で確認したが、同じ現象

###うまく行き始めたパターン
1）ソケットを物理的に接続
2）Reset（Opcode：7）を送り再起動
3）ルンバの事が書かれている色々なページを参考に送信

#まとめ
なぜうまくいき始めたかわからない。。
RESETを使ったらか。。。

#メモ

OIの命令(Start(Opcode：128)？)を送ると真ん中のクリーン・電源ランプが消えてスイッチ類を受け付けなくなる。

STOP（Opcode：173）を送ると、クリーン・電源ランプが点灯し、通常状態になる。

OIでつかんでいる状態でルンバを一旦持ち上げるとStopと同等の様子

命令途中だと何しても受け付けなくなるので、バッテリーを外して再起動が必要



#参考

https://www.adafruit.com/datasheets/create_2_Open_Interface_Spec.pdf

(下のPDFではResetが書かれていない気がする）
http://irobot.lv/uploaded_files/File/iRobot_Roomba_500_Open_Interface_Spec.pdf
ログインしていないとアクセスできないActivityの実装とログアウト処理

タイトルの通りログインしていないとアクセスできないActivityの実装とログアウト処理について試行錯誤したので共有します。前提としてActivityの設定において都度破棄・生成をする設定になっていないといけないです。

# ログイン状態の定義

- SharedPreferenceにuserIdがセットされている (またはAccessToken)

# 実装

AppCompatActivityを継承したBaseActivityを作成し、利用するActivityは全てBaseActivityを継承します。

BaseActivityはそのActivityが認証が必要かどうかを決めるフラグ (isAuthorizationRequired) を持ちます。子Activityは `#allowGuestAccess` を呼ぶことによりログインしていないユーザによるアクセスを許可できます。

ログインしていないとアクセスできないようにするにはそのフラグをチェックするだけです。

ログアウト処理は、IntentをBroadcastできる仕組みを使います。BaseActivityの `#logout` を実行すると全体に "ログアウトしたよ" というイベントを発行し、存在するActivityはそれを受け (ActivityはすべてBaseActivityを継承しているからレシーブできる） 自身の生命を絶ちます。

認証に関するさまざまなアクションを発行できるようになっているので、ログインした瞬間に各Activityに何かさせたいってケースにも対応できますね。

BaseActivity

```java
public class BaseActivity extends AppCompatActivity implements AuthEventsReceiver.Receivable {
  private boolean isAuthorizationRequired = true;
  private int userId;
  private BroadcastReceiver broadcastReceiver;

  // readable setter
  public void allowGuestAccess() {
    this.isAuthorizationRequired = false;
  }
  // define getter for isAuthorizationRequired

  // define accessor for userId
  // set null if the userId is a negative number

  protected void onCreate(Bundle savedInstanceState) {
    // 略

    if (getIsAuhorizationRequired()) {
        registerReceivers();
        ensureAuthorized();
    }
  }

  private void ensureAuthorized() {
    setUserId(getDefaultSharedPreferences(this).getInt(USER_ID, -1));
    if (getUserId == null) {
      // do that what you want to do with unauthorized user
    }
  }

  protected void logout() {
    // ensure nullify the userId on the shared preferences
    
    Intent broadcastIntent = new Intent();
    broadcastIntent.setAction(AuthEventsReceiver.ACTION_LOGOUT);
    sendBroadcast(broadcastIntent);

    startLoginActivity();
  }

  @Override
  protected void onLogout() {
    finish();
  }

  protected void startLoginActivity() {
    // start your activity
  }

  private void registerReceivers() {
      IntentFilter intentFilter = new IntentFilter(AuthEventsReceiver.ACTION_LOGOUT);
      broadcastReceiver = new AuthEventsReceiver(this);
      registerReceiver(broadcastReceiver, intentFilter);
  }

  @Override
  protected void onDestroy() {
      super.onDestroy();
      unregisterReceiver(broadcastReceiver);
  }
}

public class AuthEventsReceiver extends BroadCastReceiver {
  public static final String ACTION_LOGOUT = "com.example.sozu.hoge.action_logout";
  private Activity activity;
  
  public AuthEventsReceiver(Activity activity) { this.activity = activity; }

  @Override
  public void onReceive(Context context, Intent intent) {
    try {
      AuthReceiver receiver = (Receivable) activity;
      switch (intent.getAction()) {
        case ACTION_LOGOUT:
          receivable.onLogout();
          break;
        case default:
          break;
      }
    } catch (ClassCastException e) {
      throw new ClassCastException("Activity must implement AuthEventsReceiver.AuthReceivable");
    }
  }

  public interface Receivable {
    void onLogout();
  }
}
```
MySQLで連番の歯抜けを取得する

# 対象テーブル(SeqTbl)
* idは一意

|seq|name|
|:-:|:--|
|1|ヤマダ|
|2|サトウ|
|3|スズキ|
|5|キムラ|
|6|マエダ|
|8|アオキ|
|10|タナカ|

# 歯抜けが存在するかどうかのチェック
データ総数とseqの最大値が同じなら歯抜けなしなので

```mysql
/* sql */
SELECT '歯抜けあり' AS gap
  FROM SeqTbl
HAVING COUNT(*) <> MAX(seq);

/*　結果　*/
gap
-
'歯抜けあり'
```

# 歯抜けの最小値を取得
※ 歯抜けがなければ最大値の次の11が返る

```mysql
/* sql */
SELECT MIN(seq + 1) AS gap
  FROM SeqTbl
 WHERE (seq+ 1) NOT IN (SELECT seq FROM SeqTbl);

/* 結果　*/
gap
-
4
```

# 全取得
## Digitsテーブルを作る
0~9までの数字を格納した`Digits`テーブルを作成

```mysql:Digitsテーブルを作る
CREATE TABLE `Digits` (
  `digit` tinyint(1) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `Digits` (`digit`) VALUES
(0),
(1),
(2),
(3),
(4),
(5),
(6),
(7),
(8),
(9);
```

## シーケンス・ビューを作る（0～999までをカバー）
ほしい桁数分だけ作ります。
ここでは３桁まで作成。

```mysql:シーケンス・ビューを作る

CREATE VIEW Sequence (seq)
AS SELECT D1.digit + (D2.digit * 10) + (D3.digit * 100)
FROM Digits D1, Digits D2, Digits D3;

```

## 比較して値を取り出し
```mysql
/* sql */
SELECT seq
  FROM `Sequence`
 WHERE seq BETWEEN 1 AND 10
   AND seq NOT IN (SELECT seq FROM SeqTbl);

/* 結果 */
seq
-
4
7
9
```

# 参考
[HAVING句の力](https://codezine.jp/article/detail/652)
[SQLで数列を扱う](https://codezine.jp/article/detail/1076)
c++ builder XE4, 10.2 Tokyo > マウス座標を取得する

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

マウスの位置を取得してみる。


関連 [stackoverflow](http://stackoverflow.com/questions/826914/how-do-i-get-the-coordinates-of-the-mouse-when-a-control-is-clicked)


## code

TStatusBar を用意して以下を実行してみる。

```Unit1.cpp
void __fastcall TForm2::StatusBar1DblClick(TObject *Sender)
{
	TPoint pt;

	pt = Mouse->CursorPos;

	String msg = IntToStr((int)pt.X) + L"," + IntToStr((int)pt.Y);
	OutputDebugString(msg.c_str());
}
```

TStatusBar をダブルクリック時に座標情報が得られる。
Nexus端末のNFC搭載位置

#NFCはどこだ!?

Nexusシリーズは端末の背面にNFCマークがないので、事前に確認しておかないと搭載位置がわかりません。

事前確認を怠ったうっかりさんが、NFCやAndroid Beamが動かないのは自分のコードのせいと思っていたら、それ以前にタッチする場所が違っていて反応していないという事態に。

特にAndroid Beamは端末の背面を合わせるのが一般的な認識ですが、素直に従うと機種の組み合わせ（例: 4と6P）によっては反応しないため注意が必要です。

#NFC搭載位置
4〜6は背面の中央にありますが、5Xと6Pは従来と異なる位置です。

- Nexus 4
背面の中央。NexusロゴからLGロゴの間。

- Nexus 5
背面の中央。Nexusロゴのあたり。

- Nexus 6
背面の中央（やや下）。Nexusロゴの"xus"あたり。

- Nexus 5X
背面カメラと同じ位置。

- Nexus 6P
指紋センサの斜め上（フラッシュの右下）あたり。

# 参照リンク
Googleのサポートサイトを見ると、画像で場所が確認できます。

Nexus のハードウェア
https://support.google.com/nexus/answer/6102554?hl=ja&ref_topic=3415518
laravel の scaffold パッケージを作ってみた。（複製登録、多対一リレーション、一覧ページでの絞り込み、含む）

# dogears/CrudDscaffold パッケージ

> **注1：この記事はパッケージバージョン1のものです。現在は、バージョン2になっています。**

> バージョン2の記事はこちら
> ■laravel5.4用に、以前作ったscaffoldパッケージをバージョンアップした。
> http://qiita.com/dog-ears/items/384b30c4d18c2f333d01

> githubのリンク先を書いてなかった・・・。ということで追記
> https://github.com/dog-ears/crud-d-scaffold

## 概要
laravelで基本的な**CRUD-dアプリケーション**を生成するパッケージを開発してみたので、使い方について、簡単に紹介します。（※-dはduplicate（複製）の意）
## 準備するもの
- laravel v5.2
- laravelcollective/htmlパッケージ（公式ページ：https://laravelcollective.com/docs/5.2/html）

あらかじめインストールしておきましょう。

## （１）インストール
(i)composer.json の require-devにパッケージ追加

```
#/composer.json
"require-dev": {
"dog-ears/crud-d-scaffold": "1.*"
}
```

## （２）サービスプロバイダの追加

```
#/config/app.php
'providers' => [
dogears\CrudDscaffold\GeneratorsServiceProvider::class,
]
```

Artisanを実行すると、以下コマンドが追加されてます。

- 'make:scaffold' : スキャフォールド アプリ作成
- 'delete:scaffold' : スキャフォールド アプリ削除
- 'make:relation' : 1対多関係作成
- 'delete:relation' : 1対多関係削除

## （３）HTMLリソースのパブリッシュ

```
php artisan vendor:publish --tag=public --force
```

## （４）[AppleType]モデルと[Apple]モデルの作成。

```
php artisan make:scaffold AppleType --schema="name:string" --seeding
```
```
php artisan make:scaffold Apple --schema="name:string,apple_type_id:integer:unsigned" --seeding
```

## （５）マイグレーションとシーディング

```
php artisan migrate
```
```
php artisan db:seed
```

## （６）[AppleType]モデルと[Apple]モデルを多対一関係でつなぎます。

```
php artisan make:relation AppleType Apple
```

これで、2つのアプリができました。
/apples/または、/appleプレビューして確認してください。


ちなみに削除する場合は、以下で。

■ リレーションシップ削除

```
php artisan delete:relation AppleType Apple
```

■ アプリ削除

```
php artisan delete:scaffold AppleType
php artisan delete:scaffold Apple
```

マイグレーションファイルや、
各アプリ共通で使うものについては、削除されません。
必要であれば、手動で削除してください。

## さいごに
つっこみどころとか、多々あると思いますが、
コメントもらえると、うれしいです。
では。

## キャプチャ画面

![cap01.jpg](https://qiita-image-store.s3.amazonaws.com/0/103767/9e95b0ba-9b44-94af-8562-b4d9c5df4d54.jpeg)

![cap02.jpg](https://qiita-image-store.s3.amazonaws.com/0/103767/769883e3-9a21-bb41-aeb9-6cb35a441fd5.jpeg)

![cap03.jpg](https://qiita-image-store.s3.amazonaws.com/0/103767/f9e6acca-e1ac-b546-c054-f200c4931e99.jpeg)
Vagrant 共有ディレクトリ　権限　変更方法

# Vagrant 共有ディレクトリ　権限　変更方法

少々検索することになったので備忘録。

１、Vagrant の共有ディレクトリは**chownやchgrpでは変更が出来ない**ようになっている。

２、変更するには**Vagrantfileを編集**する必要がある。

３、設定の書き方は**バージョンによって多少異なる**ため、変更方法は公式リファレンスを参照するほうが手っ取り早い。


今回はVagrant 1.8.1における共有ディレクトリの権限変更を行った。

 

公式リファレンス

https://www.vagrantup.com/docs/synced-folders/basic_usage.html

によると、（以下スクリーンショット）

![modify own grp.jpg](https://qiita-image-store.s3.amazonaws.com/0/119345/aafc7e90-d809-6f5b-24bd-8efef408e0d9.jpeg)

となっているため、実際に

```:Vagrantfile
config.vm.synced_folder "./", "/vagrant",
 owner: "root", group: "root"
```

と書いて保存、vagrant reloadする。（共有ディレクトリの場所は変えたくなかったのでそのままにしてある。）

 

権限の確認（以下スクリーンショット）

<img width="444" alt="Screen Shot 2016-03-31 at 10.51.56 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/119345/9942982c-1812-151b-083a-94a592c3aa11.png">

権限がvagrant->rootに変わったことが確認できた。

 

以上。
文系のためのweka 入門（クラスタリング編）

こんにちは、数学が出来なかったから文系というダメな文系の典型な私です。


機械学習はずっとやりたくてウズウズしているけど、プログラミングはサッパリだしGUIでサクッとなんか出来ないの？という方向けの wekaを使ったクラスタリングのやり方。

＊あくまで今回はwekaをざっくり触ろうというテーマです！

wekaについてはwikipediaなんかで見ていただいて、サクッとやり方だけ行きます。
https://ja.wikipedia.org/wiki/Weka


今回はMacを想定してGUI自体のキャプチャもMacでのものとなります。
以下URLからwekaをダウンロードして段取り。
http://www.cs.waikato.ac.nz/ml/weka/downloading.html



起動するとこんな感じ。

<img width="364" alt="スクリーンショット 2016-03-31 10.46.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/71585/0b991c4d-cbf5-f693-40d8-acaedaa67563.png">


今回はもっともシンプルにwekaで遊ぼうということなので、クラスタリングをやります。
元にしたデータはCSVファイルでこんな感じになっています。

<img width="432" alt="スクリーンショット 2016-03-31 10.52.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/71585/f4b37e7a-23fc-dde9-7e7b-19a207d677d6.png">

物凄くシンプルですね。
CSVを作るときの注意事項としては項目を "" とかでくくらないこと、UTF-8で保存しておくことくらいでしょうか。データがちゃんとできていない場合はエラーが出ますので修正しましょう。


さて、wekaのメニューから「ナレッジフロー」をクリックして起動させます。


<img width="994" alt="スクリーンショット 2016-03-31 10.46.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/71585/652bbd90-c1fb-076f-0874-68c893a8e214.png">


すでに色々配置していますが、クラスタリングをする場合はこの3つだけ配置すればそれなりに「あ、出来たかも」が実感できるので良いと思います。より細かく分析したい場合はなんとか勉強してください。


フローレイアウトの説明ですが、CSVを読み込むので「CSV Loader」を配置します。クラスタリングをしたいわけなので、読み込んだデータを処理するために「Add Cluster」を配置。可視化しないといけないのでビューワーを最後に配置する、という流れ。


各モジュール（？といっていいのか）を右クリックすると 「dataset」とか出てきますのでこれを選択し、各モジュールをつなげていきます。

<img width="499" alt="スクリーンショット 2016-03-31 10.58.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/71585/2a1fb29d-d42a-3862-4099-5e9e3caa09ba.png">


あとは読み込み開始でスタート。


<img width="520" alt="スクリーンショット 2016-03-31 10.58.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/71585/2e19fdf2-c39c-d4f4-bc07-478ca9a89b3e.png">

処理が完了したらビュワーの「Show plot」をクリックします。


<img width="484" alt="スクリーンショット 2016-03-31 10.59.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/71585/9c675758-e5db-7e16-dc5f-8f9ff7ccdcb5.png">


出来上がりました！　まぁこれでどうするんだという話なんですが、今回は触りですしこの辺で・・・。
EclipseでPHPを使い、ソースをコピーするのにリファクタリングを使ってはまった話

初歩的な話かも知れませんが、備忘録。

###背景
元のソースをそのままに、改良版を作ろうとしてコピーして編集。
空ファイルを作って全コピーするのも手間なので、リファクタリング->名前変更で済まそうとした
すると実行->PHP Webアプリケーションで旧URLを表示してしまう

###解決策
実行->実行構成で、左側のペイン、PHP Web アプリケーションに、旧ファイル名の項目が残っているので、それを選択する。
名前、ファイル、URLを確認して、旧ファイル名のままなら新ファイル名に変更してやる。
Visual Studio 2015のIIS Expressにlocalhost以外からアクセスできるようにする方法

# はじめに
IIS Expressにlocalhost以外からアクセスする方法はググると結構なサイトが引っかかります。
しかしVisual Studio 2015の場合は一部設定が異なっており、調べるのに少し時間がかかったので、行った作業をまとめます。

# 背景
Visual StudioではデフォルトのホスティングとしてIIS Expressが使用されます。しかし、このIIS Expressでホスティングされた場合、LAN内の他のPCからhttp://[IPアドレス]:[ポート番号]/の形で指定してもアクセスすることが出来ません。
しかし、以下の手順を行うことでLAN内の他のPCから繋ぐことが出来るようになります。

# ローカル環境
Windows 10
IIS Express 8.0
Visual Studio Professional 2015

# 手順
1.IIS Expressの設定を変更する
2.URL Access Control List(以降ACL)の設定を変更する
3.ファイアウォールの設定を変更する

# IIS Expressの設定を変更する
まずはIISの**applicationhost.configファイル**を編集します。
Visual Studio 2015はそれ以前のVisual Studioとファイルの配置されている場所が異なります。

- Visual Studio 2015以前
C:\Users\[ユーザ名]\Documents\IISExpress\config\applicationhost.config

- Visual Studio 2015
[ソリューションのディレクトリパス]\\.vs\config\applicationhost.config

ソリューションを一度でもVisual Studioで実行している場合、applicationhost.configファイルにそのソリューションの情報が追記されているので、ファイルを開いてソリューション名で検索すると**name属性**がソリューション名の**siteタグ**が引っ掛かります。
下記はソリューション名の「hogehoge」場合の例です。

```
            <site name="hogehoge" id="3">
                <application path="/" applicationPool="Clr4IntegratedAppPool">
                    <virtualDirectory path="/" physicalPath="c:\users\[ユーザー名]\documents\visual studio 2015\Projects\hogehoge\hogehoge" />
                </application>
                <bindings>
                    <binding protocol="http" bindingInformation="*:58147:localhost" />
                </bindings>
            </site>
```

siteタグの子要素にある**bindingsタグ**内に**bindingタグ**が既にあるので、コピーして**bindingInformation要素**の内容を書き換えます。
ポート番号については好きな番号を指定できますが、競合を避けるために49152番～65535番から選択するのが無難です。
下記はIPアドレスが「192.168.1.162」、ポート番号を「55555」とした場合の設定です。

```
            <site name="hogehoge" id="3">
                <application path="/" applicationPool="Clr4IntegratedAppPool">
                    <virtualDirectory path="/" physicalPath="c:\users\[ユーザー名]\documents\visual studio 2015\Projects\hogehoge\hogehoge" />
                </application>
                <bindings>
                    <binding protocol="http" bindingInformation="*:58147:localhost" />
                    <binding protocol="http" bindingInformation="*:55555:192.168.1.162" />
                </bindings>
            </site>
```

# URL ACLの設定を変更する
対象のポート番号経由でhttp通信出来るようにする為にURL ACLに設定を追加します。
まずは**管理者権限**でコマンドプロンプトを立ち上げて、以下のコマンドを実行します。

```
netsh http add urlacl url=http://[IPアドレスまたはホスト名]:[ポート番号]/ user=everyone
```

今回の例では以下になります。(IPアドレス:192.168.1.162、ポート番号:55555)

```
netsh http add urlacl url=http://192.168.1.162:55555/ user=everyone
```

IPアドレスやポート番号は前手順で**applicationhost.config**ファイル内で指定したものにします。
もしURL ACLの設定を削除したい場合は以下のコマンドを実行します。

```
netsh http delete urlacl url=http://[IPアドレスまたはホスト名]:[ポート番号]/
```

ここまでの設定が終われば、Visual Studioでソリューションをデバック実行し、ローカルPCからIPアドレスやホスト名を指定することでアクセスすることができます。

# ファイアウォールの設定を変更する
最後にファイアウォールの設定を変更して前手順で指定したポート番号が通るようにします。
ファイアウォールのポート開放は手順をすべて書くと長くなってしまうので、今回は割愛します。「ファイアウォール ポート開放」等でググッてもらえば多くのサイトが引っかかります。
一時的であれば、ファイアウォールを無効にするという手もありますが、自己責任でお願いします。

# 最後に
設定自体は簡単ですが、Visual Studio 2015では設定ファイルの配置場所が異なるのがネックになります。
Qiita で見出しアンカーへのページ内リンクを作る方法

ページ内へから見出しにリンク張りたいと思っていてこちらの記事を見つけたのですが、なかなかうまくいきませんでした。
[Markdown記法 サンプル集](http://qiita.com/tbpgr/items/989c6badefff69377da7#gfm%E3%83%9A%E3%83%BC%E3%82%B8%E5%86%85%E3%83%AA%E3%83%B3%E3%82%AF)

見出しにスペースがある場合や、大文字がある場合、ピリオドなどある場合は注意です。

さて、以下のMarkdownの書き方で有効なのは、どれでしょう？クリックしてみてください。
`[WebLogic 12.1.3をインストール](#WebLogic 12.1.3をインストール)`
[WebLogic 12.1.3をインストール](#WebLogic 12.1.3をインストール)

`[WebLogic 12.1.3をインストール](#weblogic 12.1.3をインストール)`
[WebLogic 12.1.3をインストール](#weblogic 12.1.3をインストール)

`[WebLogic 12.1.3をインストール](#weblogic-12.1.3をインストール)`
[WebLogic 12.1.3をインストール](#weblogic-12.1.3をインストール)

`[WebLogic 12.1.3をインストール](#weblogic-1213をインストール)`
[WebLogic 12.1.3をインストール](#weblogic-1213をインストール)

# 見出し１
# 見出し２
# WebLogic 12.1.3をインストール

# リンク文字列の取得の仕方
一番簡単なのは、一度投稿済みの画面を見ると、左側に見出しの目次が表示されるので、そのリンクをコピーすることですね。
ブラウザの「リンクのコピー」だと日本語がエンコードされるので、リンククリック後のアドレスバー上の文字列をコピペするのがやりやすかったです。このときもURL全体をコピーすると自分のFirefoxではエンコードされてしまうので、「\#」以降のアンカー文字列を部分的にコピペをする必要があります。
[Rails] JSONを返すWebAPIに翻訳済み文字列を含める

たぶん典型的にはActiveRecordにはenum型で入れていて、viewレイヤでI18nで翻訳してから表示する設計のとき。

erbと同じようにI18n.tが使える。

```ruby:index.json.jbuilder
json.array!(@users) do |user|
  json.kind t("enums.user.kind.#{user.kind}")
end
```

なお、そもそもJSONにはenum値をそのまま入れておいて、使うときJS側で翻訳するという方法もある。
その方法だとJSONが言語依存しないので、WebAPI単体としての設計は良いのかもしれない。

ただ今回は下記の理由からWebAPIに翻訳済みの文字列を含める設計とした。

- JS側で翻訳する方法だとI18nが使いにくい
- WebAPIとして一般に公開する予定がない（特定のWebアプリケーションからのみ使う）
league/flysystem-aws-s3-v3 への移行時のつまった話

Laravel環境で `league/flysystem-aws-s3-v3` のドライバーを使用して、ファイルアップロードをする処理への変更を試みた。

# 元の処理

```
Input::file( 'file_name' )->move( 'save_path' );
```
こんな感じ。

# league/flysystem-aws-s3-v3 移行後の処理
```
$disk = Storage::disk( 's3' );
$file = Input::file( 'file_name' );
//$optionはメタデータや、ACL等を登録する場合
$disk->write( 'save_path' , file_get_contents( $file->getRealPath() ), $option );
```

こんな感じ（ configの設定等々は省略します ）

# 問題
新しい処理によって作成されたファイルがこれ
`---------- 1 user group 11111  1月  1 ００:００ file.jpg`
何も権限が付与されてない。
これがどう問題かというと、現在画像の表示の仕組みが `nginx` を利用していて、

 1. 画像のget処理の中でkeyを発行
 1. viewのimgタグのパラメーターにkeyとその他必要パラメーターをつける
 1. nginx側でkeyの中身と他のパラメーターとの整合生をチェック
 1. 問題なければ静的インスタンスにデータを見に行く

こんな感じになってる。
そのため、パーミッションが最低でも444になっていないとパーミッションで弾かれ表示できない。という状態。
作成後、パーミッションを書き換えるか、権限つけてアップロードできないかを調べてみるも、 `league/flysystem-aws-s3-v3`の処理では見つけられなかった。かといってchmod()を使うにもその権限がない状況なので、エラー。

とりあえず、移行を一旦中断し、前の処理に戻すという一時撤退を選択。

# 解決
CloudFront導入を行った際、対象のバケットにCloudFront用のポリシーが付与されるという事を知る。
そこでふと過去の撤退を思い出す。

「nginxからCloudFrontを通しての読み込みになったのなら、`league/flysystem-aws-s3-v3`でぶち当たった問題が解消されるのでは？」

思惑は的中し、パーミッションの書き換え等々する手間も発生させることなく解決。

# 最後に
そもそもCloudFrontの設定でRestrict View Access と Forward Query Strings　を利用すれば、nginxを使わなくてもいいのでは？と思ったけども、現行の仕組みはkeyの期限チェックだけでなく、keyの中身のデータとimgタグのパラメーターとの整合生をチェックしているので、まだ難しそう。
GearVRで普通の動画を見る

GearVRで自作した360度動画を見る方法はよく見るのですが、普通の自作動画を映画館っぽいところで見る方法がなかなか見つからなかったため、まとめておきます。
結論から言うと、GalaxyのOculusフォルダにMoviesフォルダを作ってそこに入れるだけです。
また、360videosフォルダを作ってそこに動画を入れると、再生時は自動的にパノラマ動画になります。

360videos:360度動画
Movies:通常動画

# 準備
GearVRをPCにつないで、GearVRのフォルダを見ます。
以下のようになっていると思うので、Oculusフォルダに移動。

![スクリーンショット 2016-03-31 09.53.37.png](https://qiita-image-store.s3.amazonaws.com/0/111912/dc29826e-5047-6245-45cf-8da51ae444f7.png)

その後、Moviesフォルダを作成します。
360度動画も再生するなら360videosフォルダを作成。

![スクリーンショット 2016-03-31 09.53.45.png](https://qiita-image-store.s3.amazonaws.com/0/111912/e886bc02-c762-b88d-970d-145a132188f9.png)

あとはここに見たい動画を入れるだけです。

# 動画再生
GearVRを起動し、Oculus Videoを開く。
下のほうのマイ動画から見たい動画を選択。
通常動画なら映画館風の場所で見ることができます。
また、自分で作成した360度動画もここで見ることができます。
cssのfont-familyの書き方の調査

#私の環境
Mac OS X El Capitan

# 英語のフォント名の調べ方
ＯＳを英語表記にして「Font Book」アプリを開く。

> 【参考】OS Xの言語を日本語から英語に変更する方法
> http://wayohoo.com/mac/beginners/how-to-change-language.html

# 游ゴシックはwindowsとmacでフォントが異なる
そもそも違うフォントとして考えてよいかもしれない。

|windows|Mac|
|---|---|
|游ゴシック Yu Gothic|ない|
|ない|游ゴシック体 YuGothic|

windowsの「游ゴシック」フォントは若干細め、だから同じ游ゴシックでも印象が変わる。

# 日本語のフォント名と英語のフォント名の順序と併記

## 順序
候補順ということで、日本語のウェブサイトを作ることが多いから日本語を先にした方が良いと予想・・・。
明確な理由はわからない。

## 併記
どうやら、ブラウザによって日本語のフォント名と英語のフォント名どちらかしか認識しないパターンがあるようで、併記したほうがベターと思われる。

> 【参考】CSSでのフォント指定について考える（2014年）
> http://www.dtp-transit.jp/misc/web/post_1881.html

したがって、游ゴシックを採用したい場合は、４つフォント名を記述する必要がある。

```css:css
body{
  font-family: "游ゴシック", "Yu Gothic", "游ゴシック体", "YuGothic";
}
```

> 【参考】font-familyに游書体(游明朝/游ゴシック)を指定する
> https://w3g.jp/blog/use_yufamily
【Gem管理】bundle install先をrbenv配下からvendor/bundler配下へ変更する

Railsでは```bundle install```でgemがインストールができます。gemsはiOSでいうところのPodsみたいなものかなって思っています。さて、Rails Tutorialを進めていると、rbenvを利用するためインストールしたgemのパッケージ群が下記フォルダ内に入ります。

```
/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems
                /2.2.0/・・・
                /2.1.0/・・・
```

この場合、プロジェクトフォルダとは別にあるRubyのバージョン管理共通部分にgem群がインストールされるため、他プロジェクトで異なるgemインストールを実行した場合に影響します。例えば、プロジェクトA・Bでそれぞれv2.3.0を利用していた場合に、片方が追加したパッケージがもう一方のプロジェクトにもインストールされていることになります。


#プロジェクトごとにgemインストール
そこで、各プロジェクトフォルダごとにgemインストールができる方法を紹介します。下記のようにvendor配下を指定すると、パッケージ群が```プロジェクトフォルダ/vendor/bundler```配下にインストールされます。Railsではこのフォルダ配下に設置することがお作法なようです。

```
bundle install --path vendor/bundler
```

これを実行することによって、プロジェクトAとBの依存関係はなくなります。

#プロジェクトが参照中のgemを確認
両方の設定をしていた場合にどちらを参照しているか分からなくなります。そこでrubyMineでの確認方法を明記します。

Preference -> Languages & Frameworks -> Ruby SDK and Gems 

を開きます。右ウィンドウにそのプロジェクトで実際に参照しているgem一覧が表示されています。gemfileに定義していたのにgemが読み込まれていない時、vendor/bundlerを参照せずrbenv配下を読み込みドツボにハマることがあるのでお気をつけください。

![11.png](https://qiita-image-store.s3.amazonaws.com/0/59560/031c51a8-f3a2-427e-009c-69bacc4bb02e.png)


#（おまけ）プロジェクトごとに特定のrubyバージョンを利用
gemインストールはプロジェクトごとにできたけど、rubyのバージョンもプロジェクトごとにできないでしょうか。rbenvだと下記フォルダで管理されています。

```
/.rbenv/versions/2.3.0/・・・
                /2.2.0/・・・
                /2.1.0/・・・
```

ターミナル（プロジェクト内）で確認してみると.rbenv配下を参照しrubyバージョンを設定しということがわかります。

```
$ rbenv versions
* system (set by /Users/[Username]/.rbenv/version)
  2.3.0
```
そこで、プロジェクトフォルダ直下に```.ruby-version```を下記のように作成します。そして、ファイル内にバージョンを明記するだけ。

<img width="344" alt="スクリーンショット 2016-03-31 2.07.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/59560/9fe51a61-f306-1c9f-71c1-2811db2df0f8.png">



再度、ターミナル（プロジェクト内）で確認してみるとプロジェクトフォルダ配下を参照しrubyバージョンを設定していることがわかります。

```
$ rbenv versions
  system
* 2.3.0 (set by /Users/[Username]/Development/workspace/[プロジェクト名]/.ruby-version)
```
IFrameの中に<script>を実行する

```
<script type="text/javascript">
    function runScript() {
        var s = document.createElement("script");
        s.type = "text/javascript";
        s.src = "http://somedomain.com/somescript";
        var iframe = document.getElementById("iframeid");

        var iframeDoc = iframe.document;
        if (iframe.contentWindow)
            iframeDoc = iframe.contentWindow.document;
        iframeDoc.body.appendChild(s)
        iframeDoc.open();
        iframeDoc.writeln(content);
        iframeDoc.close();
    }
</script>
```
Fragmentにクラスを渡す方法


Fragment間で値を受け渡しをする場合
Bundleにセットするだけで簡単にできます。

```java
Bundle bundle = new Bundle();
bundle.putString("hoge", "hoge");
bundle.putString("fuga", "fuga");

Fragment fragment = new Fragment();
fragment.setArguments(bundle);

//onCreateView内
Bundle bundle = getArguments();
String hoge = bundle.getString("hoge"); 
String fuga = bundle.getString("fuga"); 

```

ただクラスの受け渡しをしたい場合がありますよね

```java
public class Clazz{

	private String hoge;
	private String fuga;
}
```

その方法ですが、
まず、ClazzクラスにSerializableインターフェースを実装します。

```java
public class Clazz implements Serializable{
        //略...
}
```

あとはClazzクラスをputSerializableでBundleにセットして渡すだけです。

```java
Clazz clazz = new Clazz();
clazz.setHoge("hoge");
clazz.setFuga("fuga");
        
Bundle bundle = new Bundle();
bundle.putSerializable("CLASS", clazz);
        
Fragment fragment = new Fragment();
fragment.setArguments(bundle);

//取り出し onCreateView内で
Bundle bundle = getArguments();
Person person = (Person)bundle.getSerializable("CLASS");
Log.d("HOGE",String.valueOf(class.getHoge()));
Log.d("FUGA",String.valueOf(class.getFuga()));
````
FreeRADIUSでプロキシ認証した際に付与された余計な属性値を落とす

# はじめに

radius認証機能の一つとして他のradiusサーバに認証を委託するプロキシとしての機能がありますがそこで余計な属性値が付与されるといろいろ不具合が生じます
例えば違うネットワークでradius認証してそのネットワークのVLAN番号が付与されたりすると意図せず自分のネットワークのそのVLANに接続されてしまいます

# 設定方法
attr_filterモジュールのpost-proxyでフィルタします

```config:/etc/raddb/sites-enabled/{default,inner-tunnel}
post-proxy {
        attr_filter.post-proxy
}
```

``/etc/raddb/modules/attr_filter``をみると分かりますが``/etc/raddb/attrs``以外をフィルタしているようです
LXDEでAltキー＋マウス右クリック、左クリックをWinキー＋マウス右クリック、左クリックに変更

LXDE上でVirtualboxを使うとAltキー＋マウス右クリック、左クリックが
Virtualbox側で使えず困っていた。

## 関連

* Unity7の場合: [Ubuntu16.04 (Unity7)の環境設定をcliで設定 - Qiita](http://qiita.com/tukiyo3/items/4c495b33acd1912b758e#_reference-c8225e7ef0e65c960e43)
* XFCE4の場合: [Xubuntu15.10をvirtualboxにインストールメモ - Qiita](http://qiita.com/tukiyo3/items/e964adc587d6c808d143#alt%E3%82%AD%E3%83%BC%E3%81%AE%E6%A8%AA%E5%8F%96%E3%82%8A%E3%82%92%E9%98%B2%E3%81%90)
* [LXDE default keyboard shortcuts memo](http://kernhack.hatenablog.com/entry/20110824/1314115532)

## 設定

```
cd ~/.config/openbox/
sed -i -e 's/"A-Left"/"W-Left"/g' lubuntu-rc.xml
sed -i -e 's/"A-Right"/"W-Right"/g' lubuntu-rc.xml
```

再ログインすると反映。
ShinobiLayer: Blue Box Dedicatedのメンテナンス通知を受ける方法

#はじめに
Blue Boxは、OpenStackを活用したIBMのホステッド・プライベート・クラウドです。マネージドタイプのクラウドなので、ハイパーバイザーの管理やOpenStackのメンテナンス・バージョンアップは全部IBMがやってくれます。また、シングル・テナントなので、セキュリティ、コントロール、パフォーマンスの観点で安心して利用することができます。ちなみに、**Blue Boxの正式名称は、BlueとBoxの間に半角スペースがはいります。BlueBoxではありません。**
本記事では前者において、どうやってメンテナンス通知を受けるかを紹介します。

#方法1. 
Twitterにて、@BlueBoxStatus (https://twitter.com/BlueBoxStatus) をフォローする。

#方法2.
https://blueboxstatus.com/ にてメールでSubscription設定をする。（2016/3/31頃の新機能として、DCとかを選択できるようになった）。

a) https://blueboxstatus.com/ にて、左上の"Subscribe to Updates"を選択し、メールアドレスを入力
![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/9d90c74e-9a0c-c99b-9bf5-d31c54478368.jpeg)
b) 通知を受けたい環境を選択し、
![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/e047b0d8-2748-2b29-9eea-6974a288211f.jpeg)
c) 最後にページ下段にある"UPDATE REFERENCES"を押下する
![003.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/94f05781-a370-e301-f65a-b91049f07c84.jpeg)
Vimの折り返し行を右寄せして表示したい（未解決）

Vim で wrap された行を右寄せして表示したい。

```c
int hogehoge( CHO_NAGAI_NAMAE_NO_TYPE fugafuga, TOO_LONG_NAME_TYPE piyopiyo );
```

とかのちょっと長い行の折り返し時に、`o );`だけ次の行に表示させれた時にちょっとみにくい。

現在、`breakindent`と`breakindentopt`と`linebreak`オプションでそれっぽくする設定でなんとかしているけど、根本的な解決はできるのかな。

# やりたいこと

少しの行の折り返しの時に、視線を左にUターンさせるのではなく、斜め右下に動かすだけにしたい。

![image](https://qiita-image-store.s3.amazonaws.com/0/72083/1b9e2d6c-3f8c-2eea-f2e6-1d9bc0bf1fbf.png)

を

![image](https://qiita-image-store.s3.amazonaws.com/0/72083/05d611b6-dcfa-e8d1-ba5d-faf4529d1358.png)

に。

`linebreak`オプションだと

![image](https://qiita-image-store.s3.amazonaws.com/0/72083/d2d501cb-2299-6cac-6e86-5e8d3cf05cec.png)

を

![image](https://qiita-image-store.s3.amazonaws.com/0/72083/85dff7f1-061e-5b8a-9100-c43b999e2e2d.png)
（カーソルの位置はミスってます。）

こんな感じに。

# 暫定対処

`breakindentopt`の`shift`を`1000`とかにする。

こうすると、`breakindentopt`の`min`の値だけ右に取るようになる。

![image](https://qiita-image-store.s3.amazonaws.com/0/72083/c6e884b3-dacd-499b-f5c8-c13a528a06aa.png)

右寄せはできないけど、視線移動は楽になる。
でもすべての行で共通だし、まだちょっとみにくい。

`showbreak`を設定してみたのが以下。

![image](https://qiita-image-store.s3.amazonaws.com/0/72083/99521b45-6bf1-6a2b-39f6-1c9851e8902d.png)

うーん。
Build GPSBabel 1.5.3 on Mac OS X

**You can stop reading now if you are trying to build GPSBabel from the latest code on the [GitHub repository](https://github.com/gpsbabel/gpsbabel)**. This issue has been already fixed on it.

# ;tl;dr
You need to set ``EXTRA_LDFLAGS`` to build GPSBabel 1.5.3 on Mac OS X. Please adjust the ``/Library/Qt`` in the path accordingly.

```sh
export EXTRA_LDFLAGS="-Xlinker -rpath -Xlinker /Library/Qt/5.6/clang_64/lib"
```


# Intro
[GPSBabel](http://www.gpsbabel.org/lists.html) is a command line tool to manage GPS data: downloading data from GPS devices, converting data format. An executable package is available for Mac OS X, but I needed to build it from source to work on some issues on the latest version (1.5.3 currently).

# Versions
I used the following versions to build GPSBabel 1.5.3.

* Mac OS X 10.10
* Xcode 7.2
* [GPSBabel 1.5.3](http://www.gpsbabel.org/download.html)
* [Qt 5.6](http://www.qt.io/)

# Setup
GPSBabel 1.5 requires Qt to be built. You can download it from [Qt](http://www.qt.io/) site. I installed it under ``/Library/Qt`` directory, and added it to the ``PATH``.

```sh
export PATH=${PATH}:/Library/Qt/5.6/clang_64/bin/
```

# Build
It could be compiled simply as follows:

```sh
./configure && make
```

But the binary doesn't run. It failed with the following error. The ``dyld`` couldn't resolve the ``@rpath`` at runtime.

```sh
./gpsbabel 
dyld: Library not loaded: @rpath/QtCore.framework/Versions/5/QtCore
  Referenced from: /Users/miz/Downloads/gpsbabel/./gpsbabel
  Reason: image not found
Trace/BPT trap: 5
```

In order to fix the error,  the ``EXTRA_LDFLAGS`` needs to be set. It specifies the run-path search path for ``ld``.

```sh
make clean
# or simply 
rm gpsbabel

export EXTRA_LDFLAGS="-Xlinker -rpath -Xlinker /Library/Qt/5.6/clang_64/lib"
make
```

Then, it works :)

```sh
./gpsbabel 
GPSBabel Version 1.5.3.  http://www.gpsbabel.org
...
```

# Tips
You can check the ``dyld`` name expansion at runtime if you set ``DYLD_PRINT_RPATHS``.

```sh
export DYLD_PRINT_RPATHS=1

./gpsbabel
RPATH successful expansion of @rpath/QtCore.framework/Versions/5/QtCore to: /Library/Qt/5.6/clang_64/lib/QtCore.framework/Versions/5/QtCore
GPSBabel Version 1.5.3.  http://www.gpsbabel.org
...
```

For more detail about the run-path, please refer to [Run-Path Dependent Libraries](https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/RunpathDependentLibraries.html).
成長に差が出る日報駆動開発(DRDD)について

4月から新人エンジニアになる皆さん、おめでとうございます。
<del>新人プログラマ応援タグをつけたポエムを書けばcontribution稼げると聞いたので投稿いたします。</del>
開発現場ではその日の作業を日報形式で提出するところが多いです。
1ヶ月目から差がつく日報の書き方のコツについてご説明します。

### 日報を書く理由について
日報を書く理由については様々あります。
その日の作業を記録したり、かかった時間を計測したり、進捗を報告したり、疑問や問題点を共有したりなどです。
もちろんどれも正しいですが、それらの多くは日報を読んで得られる副次的な効果に過ぎません。

日報を書く理由はたった1つです。
それは**「PDCAを回すため」**ということです。

日報でPDCAを回すとはどういうことか説明していきます。


### ダメな日報
まず、日報を書く上で最悪なパターンを説明します。
それは「就業前にその日の作業を振り返って書く」ということです。
（残念ながら全ての日報の80％以上はこの方法で書かれています）

人間の記憶力は全く当てになりません。
就業前の時間帯にその日の午前中にやった作業を思い出せる人はほとんどいないでしょう。

「今日は　作業Aをやった　＋作業Bをやった　＋　作業Cもやった」という積み上げ（加点方式）の書き方をする場合、
「日報を書く（ためにその日の作業を思い出す）」という無駄な作業が発生してしまうのです。
<del>往々にして彼らは日報を書くのに30分も（しかも毎日）かかるそうです。</del>

### 素敵な日報
ダメな日報から脱却するにはどうしたらよいでしょうか。

答えは簡単で「今日は　作業Aをやる　作業Bをやる　作業Cもやる　作業Dもやる」という日報を前の日に用意しておき、
就業前にその日できなかった部分を削って「今日は　作業Aをやる　作業Bをやる　作業Dもやる」の部分を提出する逆算（減点方式）の書き方にすればよいのです。

この書き方のメリットは「早く書ける」「詰まった時に軌道修正しやすい」など様々です。

これができるようになるだけで義務で日報を書いている
日報奴隷な人たちとは一ヶ月で差がつきます。

### 日報のコツ
PDCAの話から少しそれてしまいました。

PDCAを回すには、日報に**必ず**（御社のフォーマットになかったとしても）
その日の良い点、悪い点を**毎日**書いてください。

良い点も悪い点もなかったら、その日一日進化も退化もしていない素晴らしい1日です！
直訳すると給料泥棒です。

悪い点はたくさん出てくると思います。どんどん書きましょう。
・時間がかかった
・○○ができなかった
・遅刻した

良い点も頑張って書きます。
・▲▲が上手くいった
・今月の目標達成できた

エンジニアの世界は毎日大成功するわけではないので、良い点が書けない日も出てきます。
そんな時は、以前の日報で書いた「悪い点」の改善に挑戦して結果を書いてみてください。

先ほどの悪い点を改善した場合
・以前は時間がかかったが、やり方を■■のように変えて短縮できた
・前回の手順を残したので○○が簡単にできるようになった
のようになります。
とにかく小さな改善を毎日続けるのがコツです。 

**結局のところ小さなPDCAを回すことでしか大きなPDCAは回せないのです。**

### まとめ
前日に、その日の日報を完成させておこう
良い点と悪い点を**毎日必ず**書き続けよう
良い点には悪い点を改善したことを書いて**小さいPDCAをたくさん回そう**
AD2 > Link > reference manual > 9.7. Network Analyzer > Available diagrams:	Bode, Nichols, or Nyquist

@ [reference manual](https://reference.digilentinc.com/analog_discovery_2:refmanual#network_analyzer) 9. Features and Performances > 9.7. Network Analyzer

> Available diagrams:	Bode, Nichols, or Nyquist 53).

Network Analyzerの機能は未使用。

上記の図がどのようなものかは今後、測定対象が決まってから調べる。
AD2 > Link > reference manual > 9.6. Power Supplies > Output impedance: 50mΩ (typical)

@ [reference manual](https://reference.digilentinc.com/analog_discovery_2:refmanual#power_supplies) 9. Features and Performances > 9.6. Power Supplies

> - Output impedance: 50mΩ (typical)

電圧供給において出力インピーダンスがどう影響するのかが未消化。
技術英語 > to [climb up a ladder to the third-story roof] of Cypress Semiconductor in San Jose. / five-storeyed pagoda

@ LOE > February 21, 2003

http://loe.org/shows/shows.html?programID=03-P13-00008
> The only way to see the largest solar array in Silicon Valley is to <font color=red>climb up a ladder</font> to <font color=blue>the third-story roof</font> of Cypress Semiconductor in San Jose.

はしごで3階の屋根部分に上がる


http://eow.alc.co.jp/search?q=story&ref=sa
> story
> 1. 〔建物の高さを表す〕階

<hr>

https://en.wikipedia.org/wiki/Japanese_pagoda
> five-storeyed pagoda

上記スペルミスだろうか
five-storied pagoda なのだろう。