OmniAICreator/Qiita-1.07M huggingface dataset:
ブロックストレージ on Bluemix を使ってみた

#きっかけ
BluemixにIBM Block Storage サービスがリリースされました！

>IBM Block Storage beta for Bluemix is now available!
https://developer.ibm.com/bluemix/2016/02/11/block-storage-beta-for-bluemix/

オブジェクトストレージ、仮想マシン（ベータサービス）に続き、PaaSがさらに進化を続けていますね！
これからどうなっていくのでしょう。
ということで早速使ってみましょう！

#使ってみた手順
##ブロックストレージサービスの追加
###ロンドンでのベータサービスを利用
以前はアメリカのデータセンターから順次サービス展開でしたが、最近はロンドンから始まるものもあるのですね
<img width="304" alt="スクリーンショット 2016-02-12 15.05.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/585c1a4c-458c-856f-0558-dd58a0efd708.png">

###サービス一覧から選択
おお、ありますね！
<img width="312" alt="スクリーンショット 2016-02-12 15.05.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/abce93ff-3b9b-2c9f-5295-46588791e8dc.png">

###サービスを追加
なるほど。。とりあえず作成！
<img width="814" alt="スクリーンショット 2016-02-12 15.10.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/a66bb78d-ddbd-2500-92eb-3fa4fb9de150.png">

###確認
自スペースのサービスに追加されていますね。さて、どんなものか。
<img width="189" alt="スクリーンショット 2016-02-12 15.12.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/249bc93f-57dc-1ef5-5bfd-7241af37f679.png">

###これがIBM Block Storage on Bluemix
<img width="968" alt="スクリーンショット 2016-02-12 15.14.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/492b50fb-29fb-26f3-20ab-750868033cb2.png">

##ブロックストレージサービスの使い方
###ストレージ作成
たったの10秒で作成されます！
<img width="394" alt="スクリーンショット 2016-02-12 15.14.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/7711e7d0-fe6a-9b38-a39b-1cf55ae2bec0.png">

###仮想マシンにアタッチ
簡単に仮想サーバーに付け外しができます。
<img width="396" alt="スクリーンショット 2016-02-12 15.16.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/50a3bf62-0224-8899-8aa8-b6dfa9ade4dd.png">

>仮想マシンがない人はこちらを参照してください
http://qiita.com/khayama/items/4228eaee1e7b6e8309a2

###スナップショット
こちら手動でスナップショットを作成できます
<img width="939" alt="スクリーンショット 2016-02-12 15.22.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/754cad26-fcaf-548e-47a4-65cb1e442f1c.png">

###サイズ拡張
アタッチされていないボリュームはサイズ拡張が可能です
<img width="397" alt="スクリーンショット 2016-02-12 15.41.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/101361/199c2e35-e75c-9924-b80e-fe9a31d6b18b.png">


#わかったこと
- OpenStack Cinderを使ったサービスである
- Attach後は各種変更不可
- Detach状態ではサイズ拡張とスナップショットが可能
- サイズの縮小は不可
- 4 IOPS/GB
fields_forを使いつつ複数画像を編集するサンプル

![スクリーンショット 2016-02-12 15.57.45.png](https://qiita-image-store.s3.amazonaws.com/0/45822/a3006b12-87a9-2aee-6437-c65fcf939742.png)


こんな感じで複数画像アップロードをやっております。

（記事が複数の画像を持っているとします。）
articlesテーブルがhas_manyで、article_attachmentsテーブルを持っているとします。

article_attachmentsに画像を保有しているとします。

ER図

| article_attachments |
|:----|
|id|
|image_file_name|
|title|
|article_id|
|created_at|
|updated_at|


carrierwaveを用いた基本的なことは他記事に委ねます。

最上部図のように記事（article）編集画面で、article_attachmentsのデータを編集するフォーム部分を記載します。<!-- ポイント -->の部分が本記事で書きたかったことです。

```_form.html.erb
<%= form_for(@article, :html => { :multipart => true }) do |f| %>
    <% if @article.errors.any? %>
        <div id="error_explanation">
          <h2><%= pluralize(@article.errors.count, "error") %> prohibited this exhibition from being saved:</h2>
          <ul>
            <% @article.errors.full_messages.each do |message| %>
                <li><%= message %></li>
            <% end %>
          </ul>
        </div>
    <% end %>

    <div class="field">
      <%= f.label :image_file_name %><br>

      <!-- ここからがポイント -->
      <%= f.fields_for :article_attachments do |a| %>
          <%= a.text_field :title %>
          <%= image_tag a.object.image_file_name, width: "100%" %>
          <%= link_to '削除',a.object, method: :delete, data: { confirm: "写真を削除します"} %>
      <% end %>
      <!-- ここまでがポイント -->

      <%= f.file_field :image_file_name, multiple: true, name: "article_attachments[image_file_name][]" %>
    </div>

    <div class="actions">
      <%= f.submit %>
    </div>
<% end %>
```

`<%= f.fields_for :article_attachments do |a| %>`の`a`の中を見たら`object`というのがあって、そこから情報を引っ張ってくるという感じでございました。
Datadogで長期間のグラフ表示でもピークがわかる設定

#要点
・[重要]Datadogのグラフは表示する時間の範囲に350データポイントまで表示する
・クエリの結果に対してrollup(method,time)を設定すると、複数のデータポイントをまとめて表示することが可能

##今回の設定するデータ
AWSのcloudwatchから取得されたメトリックス(RDS CPU使用率)

#困っていた点
短時間(1h,4h)で表示すると1分間隔のデータが表示されるのですが、長時間(1week,1month)で表示されると
時間平均されてしまい、データのピークが隠れてしまうことがあります。

図1:時間の範囲1monthでRDSのCPU使用率を表示した例
![時間の範囲1monthでRDSのCPU使用率を表示した場合.png](https://qiita-image-store.s3.amazonaws.com/0/58822/dcfba8d2-7562-df94-ecb2-46c7e0ee7ce8.png)

図2:上記の30%の部分を時間の範囲5hで表示
![時間の範囲5hでRDSのCPU使用率を表示した場合.png](https://qiita-image-store.s3.amazonaws.com/0/58822/61527356-e894-451f-1544-b1f56c77d1f7.png)

いちいち、時間設定を短時間にして調べるのは面倒なので、長時間のグラフ表示のときでもピークがわかるようにしたい。というのが、今回の要件です。

#公式ドキュメントで調べてみた
Datadog公式ドキュメント「グラフ表示入門」
http://docs.datadoghq.com/ja/graphing/

>上級者向けの関数の一つが.rollup()です。この関数をクエリに追記することで、複数のポイントを単一ポイントにまとめることができます。この関数は、”メ>ソッド”と”時間”の2つのパラメータを引数に指定することができます。(例: .rollup(method,time))

>“メソッド”の部分には、sum/min/max/count/avgを指定することができます。”時間”は、秒単位で指定します。 “メソッド”と”時間”は、個別に指定(例: >.rollup(20))したり、両方を組み合わせて(例: .rollup(sum,120))も指定できます。 この.rollup()には、チェック機構があります。 >しかしDatadogのグラフでは表示する時間の範囲に基づき350のデータポイントまでしか保有していないので、期間指定を一ヶ月にした場合は、20秒間隔以上?>の精度でデータポイントが保有されているため、20秒でのロールアップ.rollup(20)は、機能しません。

公式ドキュメントによると、**「Datadogのグラフでは表示する時間の範囲に基づき350のデータポイントまでしか保有していない」**とのことです。データポイントを350までしか表示しないから、時間の範囲によってグラフの表示が時間平均されてしまうみたいです。

そこで設定するのが、上記に書いてあるとおりrollup(method,time)です。
((僕もこれが設定できるということは上級者の仲間入りなのか........))
CPU上昇などのグラフで知りたいのは平均ではなく、最大ですのでmethodはmaxを選択します。

cloudwatchから取得されている値が60秒間隔なので、timeは60でよさそう。rollup(max)でも設定できるので、timeを設定するかは任意です。

#設定方法

1.対象グラフの鉛筆マークのEdit this graphを選択
図3:Edit this graph
![edit this graph.png](https://qiita-image-store.s3.amazonaws.com/0/58822/c19356fa-e673-d944-b417-bf04be767e78.png)


2.変更したいクエリーの[＋]のAdd functions and modifiersを選択
図4:Add functions and modifiers
![Add functions and modifiers.png](https://qiita-image-store.s3.amazonaws.com/0/58822/e5186d78-90fc-4e86-6a0e-c3cd4e72b85d.png)

3.rollupを選択、avgからmaxに変更します
図5:maxに変更
![maxに変更.png](https://qiita-image-store.s3.amazonaws.com/0/58822/1a362711-e1f0-62c0-5767-0152c7249931.png)


4.JSON設定からrollup(max,60)をrollup(max)に変更(任意)
図6:JSONファイルを修正
![JSONファイルを修正.png](https://qiita-image-store.s3.amazonaws.com/0/58822/3a274128-18e6-a44e-f842-a9248146b51f.png)

5.設定後のグラフの確認
図7:[rollup設定後]時間の範囲1monthでRDSのCPU使用率を表示した場合
![[rollup設定後]時間の範囲1monthでRDSのCPU使用率を表示した場合.png](https://qiita-image-store.s3.amazonaws.com/0/58822/431140db-58ae-aeec-fdbb-3b1055e460cb.png)

これで長時間スケールでいつ何が発生したかが見やすくなりました。

Datadogのグラフ表示はまだまだ設定のやりがいがありますので、工夫と知恵が必要ですね。
何か不明点・間違いがありましたら、コメント頂けますと大変ありがたいです。
Servlet StringBuffer()


▪️buffer 【英】
緩衝装置(かんしょうそうち)、やわらげるもの
緩衝→対立している物などの間にあって、衝突や不 和などを和らげること

▪️buffer 【IT】
データを一時的に蓄えておく記憶装置や記憶領域のこと

[API](https://docs.oracle.com/javase/jp/6/api/java/lang/StringBuffer.html)
Rspecでrake taskをテストする方法　


ほとんど定型文です。理解しないでもかけます。


lib/tasks/sample.rake

```ruby
task sample: :environment do
  user = User.first
  user.destroy!
end
```



spec/lib/tasks/sample_spec.rb

```ruby

require 'rails_helper'
require 'rake'

describe 'sample' do
  before(:all) do
    @rake = Rake::Application.new
    Rake.application = @rake
    Rake.application.rake_require('sample', ["#{Rails.root}/lib/tasks"])
    Rake::Task.define_task(:environment)
  end


  describe 'sample' do
    subject { @rake['sample'].execute }
    
    it 'returns hoge' do
      user = create(:user)
      expect{ subject }.to change(User, :count).by(-1)
    end
  end
end


```
composer で Could not delete エラーで先に進めなくなった場合の対処法

概要
=====

`composer install` で `Could not delete` というエラーで先に進めなくなった場合の対処とその原因について説明します。


問題の現象
===========

`composer install` で下記のようなエラーで中断してしまうことがあります。

```

  [RuntimeException]
  Could not delete /var/www/html/php-csv-file-iterator/vendor/phpoffice/phpexcel/.git/objects/pack/tmp_pack_Z4npdu:

```

その後は何度リトライしても、同じエラーが出て先に進めません。
`sudo rm /var/www/html/php-csv-file-iterator/vendor/phpoffice/phpexcel/.git/objects/pack/tmp_pack_Z4npdu` をしても `Text file busy` と言われて消すことも出来ません。


何が起こっているのか
=====================

前述の例でいえば、`phpexcel` を clone 中に composer がタイムアウトした可能性が高いです。
タイムアウトの後の処理としてディレクトリを削除しようとしますが、
裏ではまだ `git clone` が動いているのでディレクトリは消せず、エラーとなっています。

試しに、`ps aux | grep git` を実行してみると composer は終了しているのにプロセスが生きていることが判ると思います。

```
vagrant  16169  0.3  0.1  16220  1580 pts/2    S    14:59   0:01 git clone --no-checkout git://github.com/PHPOffice/PHPExcel.git /var/www/html/php-csv-file-iterator/vendor/phpoffice/phpexcel
vagrant  16170  0.5  0.0  16220   516 pts/2    S    14:59   0:01 git clone --no-checkout git://github.com/PHPOffice/PHPExcel.git /var/www/html/php-csv-file-iterator/vendor/phpoffice/phpexcel
vagrant  16171  2.2  0.2  11552  2424 pts/2    S    14:59   0:07 git index-pack --stdin --fix-thin --keep=fetch-pack 16169 on localhost.localdomain
vagrant  16201  0.0  0.0 103240   868 pts/2    S+   15:04   0:00 grep git
```

このプロセスを `kill 16169` で終了させれば composer は無事にディレクトリを消せるようになります。

ですが、このまま再実行してもまたタイムアウトする可能性は高いでしょう。


composer のタイムアウト時間を伸ばす
======================================

タイムアウトのデフォルトは 300 秒 (5分) です。
`vi ~/.composer/config.json` で設定ファイルを開き、下記のように `"process-timeout": 1200` を書き加えます。
こうすることでタイムアウト時間は 20 分にまで延長されます。

```json
{
    "config": {
        "process-timeout": 1200
    }
}
```

一時的に回線が遅い場合など、今回だけ伸ばしたいのであれば、

```
export COMPOSER_PROCESS_TIMEOUT=1200
```

を `composer install` の前に実行しても構いません。


こうして再実行
======================================

これで再度 `composer install` を実行すれば大丈夫なはず。

ただし、なんらかの原因で `~/.composer/cache` が壊れてしまっていて、再実行もエラーになることがあるようです。
その場合には、 ~~`rm -rf ~/.composer/cache`~~ `composer clear-cache` を実行してから、改めて `composer install` を実行すれば大丈夫です。(2016-02-16 sizuhiko さんの指摘で修正)
Excelで、同ブック内の他シートにリンク可能なハイパーリンクを数式で作る。


※すみません以前投稿した記事のデバッグ版になります。

Excelのハイパーリンク関数についてです。

    =HYPERLINK(リンク先,表示名）
で数式でリンクがはれて便利なのですが、
同じBook内だと、以下のような書き方をする必要があります。

    =HYPERLINK("#シート名!アドレス",表示名）

更に、シート名の頭の文字が、"（"などの記号だと、

    =HYPERLINK("#'シート名'!アドレス",表示名）

と書く必要があります。

この辺りの場合分けが面倒くさいので、
リンク先が、
①同じBook内の同じシート
②同じBook内の他シート
③同じBook内の他シート（シート名の頭が記号）
の３パターン全てに対応できるような数式を組んでみたら、こうなりました。
（※シート名、アドレスは編集して下さい。）

    =HYPERLINK("#" & SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(MID(CELL("address",シート名!$A$1),1+IFERROR(FIND("]",CELL("address",シート名!$A$1)),1)-1,200),"]","'"),"!$","'!$"),"''","'"),シート名!$A$1)

この数式の特徴は、リンク先のアドレスを「文字列」ではなく「セル参照」として持っているので、
リンク先が他のセル・他のシートに移動（カット＆ペースト）してもリンクが切れず、追従してくれます。
またシート名に変更があっても、リンクが切れません。

用途としては、
Excelをマニュアルとして使うとき、リンク先のアドレスがコロコロ変わるような場合に
便利かと思われます。動的な目次を作れるわけです。

さらにマクロではなく数式なので、
そのままお客様に納品しても、やっぱりリンクが切れることはありません。

また、上記の数式を入力するのは大変なので、
リンク先を選択すると自動で数式を入力するマクロも作りました。

    'Excelの数式Hyperlink関数で、他シートにもリンクを貼る
    Sub HyperLinking()
    
    'Hpyerlink関数のリンク先文字列には、３つのパターンがある。
    '①同じシート内。→シート名が不要で、$a$1のようにアドレスのみでOK
    '②他シート内。→ アドレスの前に、"#シート名!" の形でシート名が必要。
    '③他シート内（シート名の頭が記号）→アドレスの前に、"#'シート名'!" の形でシート名が必要。
    
    Dim TargetCell, LinkCell, strCell, strFileSheetCell, strSheetCell, strLink, strHyperLink
    
    '選択中のセルを、Hyperlink関数を挿入するターゲットとして設定。
    Set TargetCell = Selection(1, 1)
    
    'リンク先のセルを選択してもらう。（キャンセルはエラーになるので、エラー回避しておく。）
    '複数セルの時は、(1,1)で左上を対象とする。
    On Error Resume Next
        Set LinkCell = Application.InputBox("リンク先のセルを選んで下さい。（他シートもOK）", "リンク先選択", Type:=8)(1, 1)
        If LinkCell Is Nothing Then End
    On Error GoTo 0
    
    '*****ここから、数式の文字列を作成する。*****
    
    '「'シート名！セルアドレス'」という文字列を作成
    strCell = "'" & LinkCell.Parent.Name & "'!" & LinkCell.Address
    
    'ExcelのCELL関数で、数式上で「[ファイル名]シート名！セルアドレス」という文字列になる数式を作る
    strFileSheetCell = "CELL(""address""," & strCell & ")"
    
    '↑から[ファイル名]を除外したアドレス。「シート名！セルアドレス」になる。 ※"]"は後で"'"に変換するのでとっておく
    strSheetCell = "MID(" & strFileSheetCell & ",1+iferror(FIND(""]""," & strFileSheetCell & "),1)-1,200)"
    
    'シート名の前後に、"'"をつけて、リンク先文字列を完成する。
    strLink = """#"" & SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(" & strSheetCell & ",""]"",""'""),""!$"",""'!$""),""''"",""'"")"
    
    'HYPERLINK関数を完成する。表示文字列も、リンク先とする。
    strHyperLink = "=HYPERLINK(" & strLink & "," & strCell & ")"
    
    'ターゲットに数式を挿入して完了。
    TargetCell.Formula = strHyperLink
    
    End Sub
Play Framework でエンティティを使う際の注意点

# エンハンス
Play Framework でビルドすると、コードのコンパイルの後に、エンティティに対して「エンハンス」という操作が行われます。
EbeanをORマッパーとして使用する場合、

  (1)Play Frameworkのエンハンス
  (2)Ebeanのエンハンス

という順で行われます。
ここで、上記それぞれのエンハンスで何が行われるかを正しく理解していないとハマることになりますので要注意です。

## Play Framework のエンハンス
Play Framework では、ソースコードはプロジェクトホームディレクトリ直下の"app"配下にあることが想定されています。
そこで、"app"配下にあるソースコードを探索して、エンティティに対して、getterとsetterがついていないものはそれをつけるようにします。
その後で、エンティティのフィールド直接アクセスを、getter/setter経由になるように書き換えます。エンティティ内に限らず呼び出し元も書き換えてくれるので便利です。

## Ebean の エンハンス
`@Entity` がついているソースに対して、遅延ローディングや楽観的ロックの制御等の目的で、getterやsetterソースコードが改変されます。
また、Entity 内において、フィールドを直接参照しているコードを、getter/setter経由で呼ぶように改変します。 **エンティティ外からのフィールドアクセスについてはsetter/getter経由に呼び直すという書き換えは行いません。**

## 2つのエンハンスを経て何がどうなるか
"app"配下にあるものは何事もなく、フィールド直アクセスであっても遅延ローディングや楽観的ロックの恩恵を受けることができます。
しかし、"app"配下にないコード（別プロジェクトと共通で使うライブラリなど）で、同じ調子でフィールドへの直接アクセスをやっていると、存在するはずのフィールドが存在せず、結果、**NullPointerExceptionで落ちたりします**。
自分は未確認ですが、末尾参考文献によれば、Scalaコードからのアクセスも要注意のようです。
（Play Framework 2 は至る所にScalaコードがあるため、気づかないうちにハマる可能性もあります）

# ベストプラクティス
予期せぬ挙動を防ぐために、以下を守った方が安全です。
* **フィールドへのアクセスは**変数直アクセスではなく、**setter/getterを使う**ようにする。
* そのために、**エンティティのsetter/getterは明示的に宣言しておく**。（そうしないとコンパイルが通らない）

# その他

Play Frameworkのエンハンスでは、関連テーブルのfetchを自動でやってくれるようになります。
なので、エンティティのフィールドにある別のエンティティも、一番上の（外側の）エンティティをfindするだけで、内側のフィールドも値が入っています。Ebeanのエンハンスではそれが行われないため、明示的に内側のフィールドもfetchしておかないと、内側のフィールドはnullになります。
これもハマりポイントです。

# 参考文献
https://groups.google.com/forum/#!msg/play-framework/XaGlipnEgBc/wPdpB6Hm_4QJ
https://groups.google.com/forum/#!msg/ebean/6sM7_bCZoSc/Rwc354MIPTgJ
Google Chartsを使って，2つのy軸にプロットする

#やりたいこと
##CakePHP2から出てきたデータをGoogle Chartsでプロットする．
このときに左右の異なるy軸をもつようにプロットしたい．
例えばテスト結果をプロットするなら以下のようにしたい．
左y軸: 解答率
右y軸: 解答スピード
## Google Charts ?
Googleの提供するjavascriptのグラフ描画ライブラリ
https://developers.google.com/chart/interactive/docs/
#コード

```javascript:script.js
 <script type="text/javascript" src="https://www.google.com/jsapi"></script>
 <script type="text/javascript">
 google.load("visualization", "1", {packages:["corechart"]});
 google.setOnLoadCallback(drawChart);
 function drawChart() {
     var data = google.visualization.arrayToDataTable(<?php echo $data ?>);
     // CakePHPから出てくる配列は，以下のようになっている．
     // $data[0] = array('x label', 'y1 label', 'y2 label');
     // forで幾つかのデータを入れる
     // array_push($data, array('x data', 'y1 data', 'y2 data'))
     
     var options = {
         chartArea: {'width': '600', 'height': '450'},
         series: {
             0: {targetAxisIndex:0}, // 第1系列は左のY軸を使用
             1: {targetAxisIndex:1}, // 第2系列は右のY時を使用
         },
         hAxis: {title: 'Day', minValue: 0, maxValue: 32}, // x軸のラベル
         vAxes: {
             // Add labels to each y axis.
             0: {
                 title: 'y1',
                 minValue: 0
             },
             1: {
                 title: 'y2',
                 minValue: 0
             }
         },
     };

     var chart = new google.visualization.LineChart(document.getElementById('daily_chart'));
     chart.draw(data, options);
 }
 </script>
 
 <div id="daily_chart" style="width: 700px; height: 600px"></div>

```
S3のファイル一覧とファイルサイズを取得する

ちょっとした検索に使ったのでメモとして残しておく

基本的にJSONで出力できるので一覧さえとればサイズとか色々取得出来る。
ファイルサイズでフィルタかけるときとかGlacierに入ってる分とかフィルタ出来るするのに便利だった。
バケット単位で使用量を見たいのであればCloudWatchを参照すること。

過去同じようなことしてた
[Glacier化をしたS3を解凍、ダウンロードするメモ](http://qiita.com/kt_higa/items/6a6dcb967139856fbcda)

# S3のバケットからファイル一覧を取得する

```
aws s3api list-objects --bucket bucket --profile sample --output json >> s3-output.json
```

# 取得した一覧(JSON)から欲しいデータを取得
.Contents[]内のデータで取得するのでSizeやKey等を指定する。
StorageClassの指定でGlacierに入ってるものなども探せる。

```
cat s3-output.json | jq -c -r '.Contents[] | [.Size, .Key]'
```
PHPExcelでエクセルファイルを出力したい

データベースからデータを取得してそれをエクセルでダウンロードさせたい場合ってあると思います。

その時にデータベースから取得する処理ってクラス化されてて一旦配列なりに入れて処理するんですよね。
それが巨大なデータだった場合SQL側でLIMITで制限して小出しにして処理しなくちゃいけない、、、。

```php
$obj = PHPExcel_IOFactory::createReader('Excel2007');
$book = $obj->load('hoge.xlsx');
$book->setActiveSheetIndex(0);
$sheet = $book->getActiveSheet();
$sheet->setTitle('sheet1'); 
$writer = PHPExcel_IOFactory::createWriter($book, "Excel2007");

header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: inline;filename='hogehoge.xlsx'");

$sql = <<<SQL
SELECT COUNT(id) AS CNT FROM hoge;
SQL;

件数取得処理..$countに入れる

$page = ceil($count / 1000);
for($i=0; $i<$page; $i++) {
  $start = $i * 1000;
$sql =<<<SQL
SELECT id FROM hoge LIMIT {$start},1000
SQL;

  データ取得処理..
  エクセルにデータを入れる処理..

  $writer->save('php://output');  
}
```

このように繰り返しの中でsaveメソッドを実行すると最初のループのデータしか表示されず、、、
なんかいい方法ないものか、、、
GitHub 2段階認証環境におけるコミットなどの実行

２段階認証にすると通常のID/PWでアクセスると認証に失敗するので、アクセストークンを作成し、このトークンをパスワードとして使用する必要がある。

アクセストークンの作成方法は以下を参照
https://help.github.com/articles/creating-an-access-token-for-command-line-use/

```
$ git clone https://{ユーザ名}:{アクセストークン}@github.com/XXXXX.git
```
VirtualBox内のCentOSにGitLabをインストール


Windows内に仮想マシンを立ててGitLabをインストールしました。
そのときの手順、参照したものをまとめます。

# 到達点

Windows内にCentOSの仮想マシンを作りitLabをインストール、pushまで行ってみる。

# 環境

ホストOS: Windows7
仮想化ソフト: VirtualBox
仮想マシンOS: CentOS 7

# VirtualBoxのインストール

まずVirtualBoxをインストールするところからですが、
実はVirtualBoxのインストールとその後の仮想マシン(CentOS 7)の作成まで一連の手順が丁寧にまとめられている投稿がありました。

[VirtualBox (Windows) 上に CentOS 7 をインストールする](http://qiita.com/100/items/80a899fbaeb1e82b3f67)

## 大まかな手順

1. VirtualBoxのインストール
2. CentOSの仮想マシン新規作成
2-1 CentOSのディスクイメージをダウンロード
2-2 VirtualBoxで新規仮想マシンを作成する
2-3 細かい設定
3. 以上

基本的にはこちらの流れで仮想マシン作成までできましたが、進めるうちにいくつか不具合が出てきました。

## 新規仮想マシンの選択肢に64bitマシンがない

さあ仮想マシンを作るぞというときに64bitマシンが見当たりませんでした。
CentOSは64bitしかないわけで、選択できるようにこちらを参照しました。

[Virtual Boxで仮想マシン環境を作るときに引っ掛かりがちな？罠。](http://kitaeng.hateblo.jp/entry/2015/10/07/220650)

BIOSの仮想マシンの作成機能が無効になっていたようです。
(でも問題を修正する前でも32bitのマシンは選択できていました、何でだろう)

## 作成したOSでの日本語入力ができなかった

こちらですが拙稿があります(つまるところこれは当方のミスによる不具合でした)。

[VirtualBox環境におけるCentOSで日本語入力ができない](http://qiita.com/spr_noguchi/items/adee0497821ebda08b61)

# CentOSのインストール

本章は前の章にてパスしているのでそのまま次に進めます。

# GitLabのインストール

本題です、とはいっても10個ほどコマンドを打てばインストールが完了します。
GitLabの公式ページにて対応するOS(今回はCentOS 7)を選んで表示されるコマンドを打てばインストールが出来ます。

[GitLab公式ページ](https://about.gitlab.com/downloads/)

CentOS 7にGitLabをインストールする際のコマンドを以下に引用しておきます。

```bash
# GitLabインストールの前準備(HTTPとSSHのポートを開ける)
sudo yum install curl policycoreutils openssh-server openssh-clients
sudo systemctl enable sshd
sudo systemctl start sshd
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix
sudo firewall-cmd --permanent --add-service=http
sudo systemctl reload firewalld

# パッケージのダウンロードとインストールを行います
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
sudo yum install gitlab-ce

# 諸設定を行い、GitLabをスタートします
sudo gitlab-ctl reconfigure
```

ちなみに日本語で優しく解説してくださっているページもありました。

[CentOS 7にGitHubライクなGitLabを2分でインストールしてみた](http://urashita.com/archives/2870)

# GitLabを使う

GitLabをインストールできたのでpushまでやってみましょう。

localhostにアクセスするとGitLabのログイン画面が表示されるので、

>username: root 
>Password: 5iveL!fe

を入力してログインします。

GitLabトップページのヘッダメニューにある「＋」のボタンを押すと新規プロジェクト作成画面に移るので適当な名前をつけてプロジェクトを作成します(ユーザー作成は端折ります)。

プロジェクトが作成されると完了画面に移り、コマンドが表示されますが、このコマンド群がリポジトリを作成してpushするまでの例です。

```bash
# 識別情報を設定
git config --global user.name "Administrator"
git config --global user.email "admin@example.com"

# 新しいリポジトリを作って、新規ファイルをコミット
mkdir hoge
cd hoge
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin http://localhost/hoge/hoge.git
git push -u origin master
```

以上です、ローカルとはいえこれでGitLabを使ったバージョン管理を行えるようになりましたね！
Perlプログラムにsetuid


# setuid

まず、setuidというのが有ります。
あるコマンドをそのコマンドの所有者の権限で実行する場合に使用します。
例えばmkdirコマンドの所有者はrootです。

```sh
$ ls -la /bin/mkdir
-rwxr-xr-x 1 root root 44744  6月 22 20:46 2012 /bin/mkdir
```

このmkdirを適当にコピーしてsetuidします。

```sh
$ sudo cp -a /bin/mkdir .
$ ll
-rwxr-xr-x 1 root   root    44K 2012/06/22 20:46:14 mkdir*
$ sudo chmod +s ./mkdir
$ ll
-rwsr-sr-x 1 root   root    44K 2012/06/22 20:46:14 mkdir*
```

パーミッションのところに's'が付いたのがわかります。このmkdirを一般ユーザで使用すると、root権限で実行されます。

```sh
$ ./mkdir test
$ ll
-rwsr-sr-x 1 root   root    44K 2012/06/22 20:46:14 mkdir*
drwxr-xr-x 2 root   root   4.0K 2016/02/12 13:20:36 test/
```

作成したtestディレクトリの所有者がrootになってます。

# perlプログラムに実行する
setuidをperlプログラムにも付与してみます。

```sh
$ cat a.pl
$file = $ARGV[0];
system("touch $file");
```
↑引数でパスを指定して、そのパスにファイルを作るプログラムです。

所有者をrootにして、setuidします。

```sh
$ sudo chown root.root  ./a.pl
$ sudo chmod +s ./a.pl
```

一般ユーザで実行してみます。

```sh
$ ./a.pl /test
Can't do setuid (cannot exec sperl)
```

何かが足りない。 調べた結果、perl-suidperlをインストール。

```sh
$ sudo yum install perl-suidperl
```

改めて実行

```sh
$ ./a.pl /a
Insecure $ENV{PATH} while running setuid at ./a.pl line 3.
```

どうも"$ENV{PATH}"を指定しなくてはいけないようです。
セキュリティの為にも使うコマンドだけ集めてそのディレクトリを指定すべきでしょうが、
とりあえず/binに。

```sh
$ cat a.pl
#!/usr/bin/perl
$ENV{PATH} = "/bin";
$file = $ARGV[0];
system("touch $file");
```

改めて実行。

```sh
$ ./a.pl /a
Insecure dependency in system while running setuid at ./a.pl line 4.
```

またエラー。。。
外から指定される値を、そのままsystem()等で使う場合に上記の警告がでるようです。
以下のように適当なif文を入れました。
本来は不正なコードが指定されないようにチェックする必要があります。

```sh
$ cat a.pl
#!/usr/bin/perl
$ENV{PATH} = "/bin";
$file = $ARGV[0];

if ($file =~ /^([\/\w]+)$/) {
  $file = $1;
} else {
  print("error\n");
  exit(1);
}

system("touch $file");

```

改めて実行。

```sh
$ ./a.pl /a
$
$ ls -la /a
-rw-r--r-- 1 root root 0  2月 12 14:24 2016 /a
```
できました。
[AWS]CloudWatchを使ってEC2にアラートを設定する[awscli]


公式ドキュメントからひっぱってきたAlertならコレで設定できる。

###EC2テンプレート（公式）

```bash:CloudWatchアラーム作成（公式）
aws cloudwatch put-metric-alarm \
	--alarm-name  \
	--alarm-description  \
	--metric-name  \
	--namespace  \
	--statistic  \
	--period  \
	--threshold  \
	--comparison-operator   \
	--dimensions  Name=,Value= \
	--evaluation-periods  \
	--alarm-actions 
```

---
* __namespace__

|AWSの製品名|名前空間名|
|:-----------|:--------------|
|Auto Scaling|AWS/AutoScaling|
|AWS の請求|AWS/Billing|
|Amazon CloudFront|AWS/CloudFront|
|Amazon CloudSearch|AWS/CloudSearch|
|Amazon CloudWatch のイベント|AWS/Events|
|Amazon DynamoDB|AWS/DynamoDB|
|Amazon EC2 Container Service|AWS/ECS|
|Amazon ElastiCache|AWS/ElastiCache|
|Amazon Elastic Block Store|AWS/EBS|
|__Amazon Elastic Compute Cloud__|__AWS/EC2__|
|Elastic Load Balancing|AWS/ELB|
|Amazon Elastic MapReduce|AWS/ElasticMapReduce|
|Amazon Elasticsearch Service|AWS/ES|
|Amazon Kinesis|AWS/Kinesis|
|AWS Lambda|AWS/Lambda|
|Amazon Machine Learning|AWS/ML|
|AWS OpsWorks|AWS/OpsWorks|
|Amazon Redshift|AWS/Redshift|
|Amazon Relational Database Service|AWS/RDS|
|Amazon Route 53|AWS/Route53|
|Amazon Simple Notification Service|AWS/SNS|
|Amazon Simple Queue Service|AWS/SQS|
|Amazon Simple Storage Service|AWS/S3|
|Amazon Simple Workflow Service|AWS/SWF|
|AWS Storage Gateway|AWS/StorageGateway|
|AWS WAF|AWS/WAF|
|Amazon WorkSpaces|AWS/WorkSpaces|

---

* EC2 metric-name 

|メトリックス名|説明|単位|
|:---|:---|:---|
|CPUCreditUsage|（T2 インスタンスにのみ有効）指定した期間内に消費される CPU クレジット数です。|Count|
|CPUCreditBalance|（T2 インスタンスにのみ有効）インスタンスが累積される CPU クレジット数です。|Count|
|__CPUUtilization__|__割り当てられた EC2 コンピュートユニットのうち、現在インスタンス上で使用されているものの比率__|%|
|DiskReadOps|指定された期間にインスタンスで利用できるすべてのエフェメラルディスクでの、完了した読み取り操作。|Count|
|DiskWriteOps|指定された期間にインスタンスで利用できるすべてのエフェメラルディスクへの、完了した書き込み操作。|Count|
|DiskReadBytes|このインスタンスで利用できるすべてのエフェメラルディスクでの、読み取られたバイトの数|バイト|
|DiskWriteBytes|このインスタンスで利用できるすべてのエフェメラルディスクでの、書き込まれたバイトの数|バイト|
|NetworkIn|すべてのネットワークインターフェースでの、このインスタンスによって受信されたバイトの数。|バイト|
|NetworkOut|すべてのネットワークインターフェースでの、このインスタンスから送信されたバイトの数。|バイト|
|__StatusCheckFailed__|__StatusCheckFailed_Instance と StatusCheckFailed_System の組み合わせで、どちらかのステータスチェックが失敗したら報告します。__|Count|
|StatusCheckFailed_Instance|最近 1 分間にインスタンスが EC2 インスタンスステータスチェックに成功したかどうかを報告します。|Count|
|StatusCheckFailed_System|最近 1 分間にインスタンスが EC2 システムステータスチェックに成功したかどうかを報告します。|Count|

---
* EC2 dimensions

何を使ってフィルタリングするか

|ディメンジョンの名前|
|:---:|
|AutoScalingGroupName|
|ImageId|
|__InstanceId__|
|__InstanceType__|

---
* statistic (string)

|利用可能な項目|
|:---|
|SampleCount|
|Average|
|Sum|
|Minimum|
|Maximum|

---
* period (integer)

秒単位で指定
(ex.1日)
__1日＝24時間＝1440分=86400秒__

---
* threshold (double)

期間中で何発でか

---
* comparison-operator (string)

|判定式|
|:---|:---|
|GreaterThanOrEqualToThreshold|以上|
|GreaterThanThreshold|より大きい|
|LessThanThreshold|より小さい|
|LessThanOrEqualToThreshold|以下|

---
* alarm-actions
アラームに引っかかった際の実際の動き
＝＞リソースのARNを指定する。

---
参考：公式ドキュメント
FT232RLを使ったARMライターを組んで、mbedのCPUであるLPC1114FN28を動かしてみた


AVRマイコンもいいんですが、mbedでも使われているARMマイコンにも色々と魅力があります。ARMである事と、AVRの8bitマイコンよりもパワフルなのに、AVR8bitマイコンと同じくらい電子工作で使いやすいという点です。演算用に一ついかがでしょうか。

今回は、FT232RLを使ってARMライターを構築してLPC1114FN28に書き込んでLチカするまでを記事にします。プログラムのコンパイルをよく使われるオンラインコンパイラではなく手元で実現していたり、ライターソフトも糞みたいなGUIではなくCLIのツールを使っている点が特徴的でしょうか。

## プログラムをコンパイルする

まずはプログラムをコンパイルします。

```shell-session
$ platformio init --board lpc1114fn28
$ cat > src/test.cpp
#include "mbed.h"

DigitalOut myled(LED1);

int main() {
    while(1) {
        myled = 1;
        wait(1.0);
        myled = 0;
        wait(1.0);
    }
}
$ platformio run
```

拡張子がC++だったりccだったりするとコンパイルが通りません。Arduinoとはだいぶん書き方が違って違和感がありますね。これで、`.pioenvs/lpc1114fn28/firmware.bin` に bin がはき出されます。

## FT232RLを使ったARMライター

LPCマイコン(と呼ぶべき？)は、AVRマイコンに比べて素直な点が一つあって、最初からブートローダーが書き込まれてます。シリアルを使ってbinを流し込む事でプログラムが動作するようになります。

### 回路

[http://www.nxp-lpc.com/lpc_boards/mbed/note/note3.html](http://www.psakura.com/memo/?p=351) の記事の途中にある回路図そのままを組みました。VCCにLEDを入れたりという工夫はしています(電源が通ればLEDが光る)。

### ライターソフトウェア

FlashMagicとかいうツール、GUIだしインストールが面倒だったり色々糞いので、やはりCLIのツールが正義です。[morecat_lab » lpc21isp からLPC1114を使う](http://morecatlab.akiba.coocan.jp/lab/index.php/2014/01/lpc21isp-lpc1114/) を参考にして、lpc21isp を入手してコンパイルしましょう。(例によってPlatformIOでどうやればlpc21ispが使えるかがわからなかった…)

### 書き込み

```
lpc21isp -control -bin .pioenvs/lpc1114fn28/firmware.bin /dev/cu.usbserial-******* 115200 12000
```

/dve/cu.usbserial-**** は、OSに認識されたFT232RLのデバイス名です。次の数字は115200bpsで、最後の数字はKHz単位の周波数です。LPC1114FN28は、最大で50MHz位の外部クロックを取り付けることができます。今回は内部クロックでいきました。(内部クロック最大がいくつなのかは知らないけど、ググってたら12000の表記は見つけたからきっといけるはずと踏んでますｗ)。

## ピンの仕様

公式 [mbed LPC1114FN28 | mbed](https://developer.mbed.org/platforms/LPC1114FN28/) にピンのわかりやすい図がありました。

![](https://developer.mbed.org/media/uploads/asagin/mbedlpc1114fn28-01.png.pagespeed.ce.nWp3ppS4lv.png)

## まとめ

* ARMのLPCマイコンはAVRマイコンとほぼ変わらない値段で、高速・高性能
* ARMライターはAVRライターよりも簡単
* コンパイルもライターソフトも、CLIでいける
* Arduinoは情報量やライブラリやサンプルスケッチの多さが魅力だけど、mbedも面白い…かもしれない

演算用チップとして使うといいかもしれないなーなんて考えています。それではごきげんよう
プロキシ制限下でのフロントエンド環境構築メモ（mac）

## とりいそぎ最新の.bash_profile（随時更新）

### bash_profile（2016.05.10）

~~export ALL_PROXY=$http_proxy~~ // **ALL_PROXY（大文字）**だとNGになった？

```bash:.bash_profile
export http_proxy=http://proxy.myproxy.com:8080
export https_proxy=$http_proxy
export all_proxy=$http_proxy
export PYTHONPATH=/Users/username/.local/lib/python2.7/site-packages
export PATH=/usr/local/bin:$PATH
export ATOM_NODE_URL=http://gh-contractor-zcbenz.s3.amazonaws.com/atom-shell/dist
```

## 各種設定

### homebrew
環境変数にも

```zsh:.bash_profile
vi ~/.bash_profile
export http_proxy="http://proxy.myproxy.com:8080"
export https_proxy=$http_proxy
export ALL_PROXY=$http_proxy
```

### npm
```zsh:zsh
sudo npm -g config set proxy http://proxy.myproxy.com:8080
sudo npm -g config set https-proxy http://proxy.myproxy.com:8080
sudo npm -g config set registry http://registry.npmjs.org/
```

```bash:.npmrc
vi ~/.npmrc
proxy=http://proxy.myproxy.com:8080
https-proxy=http://proxy.myproxy.com:8080
```

### github
```zsh:.gitconfig
git config --global http.proxy http://proxy.myproxy.com:8080
git config --global https.proxy http://proxy.myproxy.com:8080
```

※globalの.gitconfigを以下のように。

```zsh:.gitconfig
[http]
	proxy = http://proxy.myproxy.com:8080
[https]
	proxy = http://proxy.myproxy.com:8080
[url "https://"]
	insteadOf = git://
```

### Sublime Text

> /Users/USERNAME/Library/Application Support/Sublime Text 3/Packages/User/Package Control.sublime-settings

上記設定ファイルへ以下のように追記する。

```
{
  "http_proxy": "http://proxy.myproxy.com:8080",
  "https_proxy": "http://proxy.myproxy.com:8080"
}
```

### Atom
```zsh:.apmrc
vi ~/.atom/.apmrc

https-proxy=http://proxy.myproxy.com:8080
http-proxy=http://proxy.myproxy.com:8080
proxy=https://proxy.myproxy.com:8080/
strict-ssl=false
```

### typing
```zsh:.typerc
vi ~/.typingsrc

proxy="http://proxy.myproxy.com:8080"
rejectUnauthorized=false
```

### bower
```zsh:.bowerrc
vi ~/.bowerrc
{
  "proxy" : "http://proxy.myproxy.com:8080",
  "https-proxy" : "http://proxy.myproxy.com:8080"
}
```

### curl

※brew doctorでwarning出るが、

```zsh:.curlrc
vi ~/.curlrc
proxy = "http://proxy.myproxy.com:8080"
```

### rubygem
```zsh:zsh
sudo gem install sass -r -p http://proxy.myproxy.com:8080
// のように毎度指定する。
```
vimscriptで開いたファイルが存在するディレクトリのパスを取得するやつ (symlinkも対応)

久しぶりに`.vimrc`をゴニョゴニョしてたときにやりかた調べたけど結局必要なくなったので
一応個人的備忘としてメモ。

```vim
" /path/to/file.vim
let current_dir = fnamemodify(resolve(expand('<sfile>:p')), ':h')
echo current_dir " /path/to
```
nginxでリバースプロキシキャッシュして、キャッシュを削除する機能を付ける


nginxでリバースプロキシかましてキャッシュさせることでパフォーマンスを稼ぐっていうのは、わりとよくあるシチュエーションなんですが、キャッシュ自体のコントロールっていうのが、案外忘れがちというか、置いてけぼりになることが多いので、キャッシュを削除できる環境を作るメモです。

# nginxのリバースプロキシ設定

まず、nginxはデフォルトでキャッシュする機能があるので設定するだけでいけます。下記の設定は、単なるWebサーバ https://example.com をバックエンドとして、全URLをキャッシュする設定です。

```nginx.conf
http {

    proxy_cache_path /var/cache/nginx/cache levels=1:2 keys_zone=zone1:4m inactive=7d max_size=50m;
    proxy_temp_path /var/cache/nginx/tmp;

}
```

```nginx:server.conf
server {

    proxy_redirect   off;
    proxy_set_header Host               $host;
    proxy_set_header X-Real-IP          $remote_addr;
    proxy_set_header X-Forwarded-Host   $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;

    proxy_ignore_headers Cache-Control;
    proxy_cache zone1;
    proxy_cache_key $uri;
    proxy_cache_valid 200 302 1m;
    proxy_cache_valid 404 10m;
    
    location / {
        proxy_pass https://example.com;
    }

}
```

## proxy_cache_path

ここのパラメータが毎回分からなくなるのでメモ。第1パラメータはキャッシュファイルを保存する場所です。

| キー | 値 |
|:-----------|------------|
|levels|キャッシュを保存するディレクトリ階層とディレクトリ名に使用される文字数になります。`1:2`だと`/1/01`に、`2:2:2`だと`/01/01/01`になります。ただし階層を増やしたり、文字数を増やすとその分ディレクトリが作成されることになるので、inode枯渇で死ぬケースもあるようです。参考 [nginxのキャッシュ階層を深くしすぎてinodeが枯渇した](http://qiita.com/najeira/items/cd197d230b1a3723c9b5)|
|keys_zone|proxy_cacheディレクティブで指定するキーです。コロン区切りで、共有メモリの容量指定ができます。1MBにつき約8000個のキャッシュメタデータを保存できるようです|
|inactive|指定した期間後、自動的にキャッシュが削除されます。デフォルトだと10分に設定されています|
|max_size|キャッシュのファイルサイズ上限です。keyz_zoneのメモリと、max_sizeどちらかが枯渇した時点でキャッシュが停止します|

# キャッシュを削除する

キャッシュを消したい場合は、`proxy_cache_path`の中にある該当ファイルを消せばOKなのだけど、いちいちそんな手動で消すの面倒くさいし、ログインしなきゃいけないのでありえんとなるわけです。下記コマンドの様にURLからキャッシュファイルを特定するコマンドもありますけど…。

```
find /var/cache/nginx/example.com -type f -exec grep -l "KEY: http://example.com/$" {} \; | xargs rm -f
```

- 参考 [Nginxで特定ページのキャッシュクリアする](http://qiita.com/osamu1203/items/57cd8f18dbe7f21589ec)

## キャッシュ可能なURLを作成する

本題です。nginxデフォルトだとキャッシュを削除する機能はありません。そこでnginxモジュール`ngx_cache_purge`を使用します。

- [ngx_cache_purge](https://github.com/FRiCKLE/ngx_cache_purge)

ngx_cache_purgeをnginxに組み込むには、nginxをソースからビルドして上げる必要があります。はい、面倒くさいですね。nginx自体パッケージからインストールしているし…という人には、nginxのビルドを自動化できるツール`nginx-build`を利用しましょう。モジュールも超簡単に導入できます。

- [nginx-build](https://github.com/cubicdaiya/nginx-build)

もしくは、Itamaeであれば僕が以前作ったItamaePluginがあるので、それを使っても良いと思います。

- [nginxソースビルドを自動化出来るnginx-buildをサクッと入れるItamaeプラグイン作った](http://qiita.com/zaru/items/77f6ed831e2f448ded5b)

`ngx_cache_purge`を導入したら、設定ファイルにキャッシュを削除する用のURLディレクティブを指定します。この例だと`/hoge/piyo`のURLをキャッシュしていたとしたら`/purge/hoge/piyo`にアクセスするとキャッシュが削除できます。

```nginx:server.conf
server {
    location ~ ^/purge(/.*) {
        allow              127.0.0.1;
        deny               all;
        proxy_cache_purge zone1 $1;
    }
}
```

アプリケーション側からは、データソースの変更があったタイミングで削除用のURLを叩くとキャッシュがクリアされるように出来ると思います。簡単ですね。
Windows7で既存のプログラムに設定出来ない時。

インストールしたプログラムが「規定のプログラム」に設定できなくなってしまったので、対処法のメモ。

# 1.レジストリエディタ（Regedit.exe）を開く
・[スタート]－[ファイル名を指定して実行]（Windowsキー + R）
  → 名前の欄に「regedit」と入力し「OK」をクリック
　
　「ユーザーアカウント制御」のメッセージウインドウが出た場合は許可して実行
# 2.目的のプログラムを削除
　レジストリエディタの
　HKEY_CLASSES_ROOT
　 └ Applications
　を開く。
「Applications」キー内に、目的のプログラム名があれば、右クリックメニューで「削除」します。 

# 3.再度ファイルの関連付けを行う。
　レジストリエディターを閉じ、もう一度ファイルの関連付けを作業を行う。
　
　自分の場合はこの時点で「規定のプログラム」で選択できるようになりました。

　それでもできない場合は、再インストールを試してみる。

参考
http://www.pasoble.jp/windows/7/08843.html
HHVM-3.12.0にしたWordpressをLoader.ioからベンチマーク


以前HHVM3.6がリリースされた頃、こんなことをやった。[Loader.ioを使ってWordPressのバックエンド構成を変えつつ性能を測ってみる、php-fpmとHHVM](http://qiita.com/sawanoboly/items/e422b366439f67bfb01c)

で、HHVMのLTSとされる3.12.0がリリースされたので、またベンチを取ってみようという試み。前回とはWordPressおよびMySQLのバージョンも違うので、直接参考にはならないけど。


## まず通常のベンチマーク

AMIはこちら。[WordPress Powered by AMIMOTO (HHVM)](https://aws.amazon.com/marketplace/pp/B00V5JYXTO) インスタンスはc3.large。


ルールは前回と一緒。トップページと、管理パネルの記事一覧表示。

### トップページ

![normal_top.jpg](https://qiita-image-store.s3.amazonaws.com/0/7454/bdc9370d-4e24-b575-458d-6b8b80098922.jpeg "normal_top.jpg")

前回と比較。

| - |HHVM3.6|HHVM3.12|(参考)Nginx Cache|
| ---- | ---- | ---- | ---- |
|平均レスポンスタイム | 1566ms | 1405ms | 25ms |
|リクエスト処理数 | 5387 | 5995 | 346791 |

ちょっとだけ速い。。？ 誤差程度かな。そもそもキャッシュするしこんなもんで。


### 管理パネル

ログイン状態でも比較してみる。これも条件は前回と同じ。

![Admin.jpg](https://qiita-image-store.s3.amazonaws.com/0/7454/2eed8313-9f71-71f0-20f5-1fd261d07ac1.jpeg "Admin.jpg")


| - |HHVM3.6|HHVM3.12|
| ---- | ---- | ---- |
|平均レスポンスタイム | 8866ms | 4652ms |
|リクエスト処理数 | 1429 | 3273 |

おや、倍くらい速いぞこれ。何かしら効率が上がったとか、WordPressがそもそも早くなったのかは不明だが良いことだ。
Failも無いしね。


## 補足:RepoAuthoritative

HHVM3.8以降でPHPのコードを事前にバイトコードに変換するRepoAuthoritativeという機能がついた。

- [Use RepoAuthoritative](https://github.com/facebook/hhvm/wiki/performance-tuning)

> Enabling RepoAuthoritative mode involves pre-compiling all of your source code into a bytecode repo.

通常はリクエストに応じて生成するバイトコードのを、ウォームアップ代わりに事前に生成したい時に使う。

変換には`hhvm-repo-mode`コマンドをつかう。

※ `hhvm-repo-mode`コマンド、ソースでは`hphp/tools/oss-repo-mode`に入っている。binに無い場合でも、大抵パッケージのどこかに入っています。

これ、HHVMを止めないといけないので注意。

```
$ time sudo hhvm-repo-mode enable /var/www/vhosts/
Stopping hhvm:                                             [  OK  ]
running hphp...
parsing inputs...

...中略

analyzeProgram...
analyzeProgram took 0'00" (786762 us) wall time
parsing inputs took 0'02" (2681877 us) wall time
pre-optimizing...
pre-optimizing took 0'00" (614471 us) wall time
creating binary HHBC files...
creating binary HHBC files took 0'17" (17448057 us) wall time
all files saved in /tmp ...
running hphp took 0'21" (21824534 us) wall time
Starting hhvm:                                             [  OK  ]

Success!

real	0m21.997s
user	0m36.008s
sys	0m1.400s
```

先日microでやったらいつまでも終わらなかったが、c3.largeでは21秒で終わった。リソースはに余裕が必要そうだ。


## おわりに

HHVM3.12は、以前からかわらない安定度が保たれていた。どうやら高速になった部分もあるのかなー。
roadworker - [ERROR] ArgumentError: invalid configuration option `:credential_provider' の対応方法


roadworkerのバッチ処理を別サーバに移行した時にエラーにハマったのでメモ
このバッチ処理は複数のAWSアカウントに対応するため「--profile」を使用している
その辺りでエラーがでているようす

#### 環境

* OS:Ubuntu 14.04.1 LTS

#### 対応

roadworkerのバージョンを比較すると前の環境では、roadworker (0.5.4)、新環境ではroadworker (0.5.5)だったので、合わせてみたらエラーが解消された

```
gem uninstall roadworker -v 0.5.5
gem install roadworker -v 0.5.4
```

#### gemバージョンの確認方法

これは便利

```
gem list
```

#### 参考
http://makaaso.hatenablog.com/entry/2016/02/12/134641
php7移行でソースの変更が必要だったところ２つ(silex)

##\Symfony\Component\Debug\ExceptionHandler::register()
ExceptionHandlerを登録していると落ちる。
Symfonyはphp7に完全対応したと聞いていたけど、コンポーネントによっては使えない。

##MeCab(php-mecab)
php7対応のphp-mecabはネームスペースを使ったバージョンしかインタフェースが登録されていない。

下記のような書き方に変更。
MeCab_Tagger => \MeCab\Tagger
MECAB_EOS_NODE => \MeCab\Node::EOS
gocode が動いてるか確認する

# emacs つかってて、たまに gocode が動かないのかなって思う時がある

```shell-session
# ps auxwww | grep gocode
```

ps してみて、gocode がいなかったら起動する、いたら

```shell-session
# gocode close
```

mac のサービスに登録してあったら、しばらく待てば起動する

これでもだめなら

```go
package x
import "fmt"
var a = fmt.
```

こんなファイル作って ac.go って名前にして

```shell-session
$cat ac.go | gocode autocomplete 36
Found 25 candidates:
  func Errorf(format string, a ...interface{}) error
  func Fprint(w io.Writer, a ...interface{}) (n int, err error)
  func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)
  func Fprintln(w io.Writer, a ...interface{}) (n int, err error)
  func Fscan(r io.Reader, a ...interface{}) (n int, err error)
  func Fscanf(r io.Reader, format string, a ...interface{}) (n int, err error)
  func Fscanln(r io.Reader, a ...interface{}) (n int, err error)
  func Print(a ...interface{}) (n int, err error)
  func Printf(format string, a ...interface{}) (n int, err error)
  func Println(a ...interface{}) (n int, err error)
  func Scan(a ...interface{}) (n int, err error)
  func Scanf(format string, a ...interface{}) (n int, err error)
  func Scanln(a ...interface{}) (n int, err error)
  func Sprint(a ...interface{}) string
  func Sprintf(format string, a ...interface{}) string
  func Sprintln(a ...interface{}) string
  func Sscan(str string, a ...interface{}) (n int, err error)
  func Sscanf(str string, format string, a ...interface{}) (n int, err error)
  func Sscanln(str string, a ...interface{}) (n int, err error)
  type Formatter interface
  type GoStringer interface
  type ScanState interface
  type Scanner interface
  type State interface
```

とかやると、ああ、動いてるなってわかって、諦められる。
private  な型をクラス外部のヘルパーで使う

もの凄くバッドノウハウ臭がしますが、思い付いてしまったのでつい。

## 動機

内部で `private` な型を定義しているクラスがあるとします。
このクラスのヘルパーを定義したいけれども、このヘルパー内でも上記クラスの `private` な型を使いたいといった場合を考えます。

この場合、ヘルパーが `private` な型にアクセスできるようにするためには、いくつか考えられますが、どうにも一長一短です。

 1. クラス内の型を `private` にするのを諦め、 `public` にする。
    無関係な所にまで公開したくないんだけどな……

 2. クラス内にヘルパーを定義する。
    公開する必要のない要素でヘッダが膨れ上がってしまう。

 3. ヘルパーを `friend` にする。
    ヘルパーを匿名名前空間に定義したい場合、この手が使えない。 `namespace detail` など、明示的に名前を付けると、他の単位との衝突が怖いし、ヘルパーか名前空間名の先頭に自クラス名を付けるなどして回避させると名前が長い。

そこで、ヘルパーをテンプレートとして宣言し、使いたい型を、元のクラスの方からテンプレート引数として渡す方法を思い付きました。

## 実装例

### ソース

```c++:hoge.hpp
#ifndef hoge_HPP_
#define hoge_HPP_

class hoge
{
private:
    enum struct internal_enum // private な型その1
    {
        AAA = 100,
        BBB = 200,
    };

    struct internal_type // private な型その2
    {
        internal_enum x;
    };

    internal_type v;

public:
    void f();
};

#endif // hoge_HPP_
```

```c++:hoge.cpp
#include "hoge.hpp"
#include <iostream>


// ヘルパーを匿名名前空間で定義したい。
namespace
{
#if 0
    // これだと、 internal_type, internal_enum が private だと怒られる。
    struct helper
    {
        const char *message;

        explicit helper(const hoge::internal_type &v)
        {
            switch(v.x)
            {
            case hoge::internal_enum::AAA:
                message = "AAA";
                break;

            case hoge::internal_enum::BBB:
                message = "BBB";
                break;

            default:
                message = "BUG!";
                break;
            }
        }
    };
#else
    // 怒られる型をテンプレートパラメータにして間接的に利用
    template<typename T, typename U>
    struct helper
    {
        const char *message;

        explicit helper(const T &v)
        {
            switch(v.x)
            {
            case U::AAA:
                message = "AAA";
                break;

            case U::BBB:
                message = "BBB";
                break;

            default:
                message = "BUG!";
                break;
            }
        }
    };
#endif
}


void hoge::f()
{
    v.x = internal_enum::AAA;
    // helper に、クラスから型を渡してあげる。
    helper<internal_type, internal_enum> h(v);
    std::cout << h.message << std::endl;
}


int main() // 試してみる
{
    hoge h;
    h.f();
    return 0;
}
```

### 出力例

```
$ g++ -std=c++11 hoge.cpp
$ ./a.out
AAA
```

## 実際使ってる？

使いたい場面があるのですが、冒頭にも書いた通り、あまりにもバッドノウハウ臭がひどいので使っていません (- -;
というか、利用する時に型名を渡すので、その分長くなってしまうわけで、それなら 3. ヘルパーを `friend` にする。 に書いた、元のクラス名を付けたヘルパーを定義すればいいじないか……

「ところでpimplパターンって知ってる？」
「……あー、うん……」
Windowsで karma start が落ちる！

[【npm + Karma + Jasmine】JavaScriptの単体テスト環境を構築する](http://qiita.com/tanakaworld/items/9561478c7e82ffe0b988)
上記投稿を参考にWindowsでもkarmaを実行させてみた。

mac環境であれば、まったく問題がなかったのだが、Windowsで実行すると、「The header content contains invalid characters」というエラーが出た。

エラーの内容から、setHeaderをしているとこでコケているのが分かった、該当箇所の部分を以下のように、とりあえずコメントアウト


```lang:common.js
var setNoCacheHeaders = function (response) {
  response.setHeader('Cache-Control', 'no-cache')
  response.setHeader('Pragma', 'no-cache')
  //response.setHeader('Expires', (new Date(0)).toString())
  // ↑これを、こう!!
}
```

この状態で、karma startすることで動きました！
バックアップツールbupのご紹介

python製のバックアップツール、bupというのを見つけたので、試しに使ってみました。

【github】
https://github.com/bup/bup


# インストール

githubに書いてある手順の通りに入れていきます。
自分の使っている環境がubuntuだったのでubuntuで。

とりあえずインストール準備

```bash
# bupソース落とす
$ git clone git://github.com/bup/bup

# 必要なライブラリをインストール
$ apt-get install python2.7-dev python-fuse
$ apt-get install python-pyxattr python-pylibacl
$ apt-get install linux-libc-dev
$ apt-get install acl attr

# tornadeはpipで入れてもOK
$ apt-get install python-tornado
```

make

```bash
$ make

$ make install DESTDIR=/opt/bup PREFIX=''
```

これでインストール完了のようです。

# バックアップしてみる

とりあえず、同じくgithubに載ってるのと同じ感じでetcディレクトリをbackup

```bash
# bup initで保存用の.bupディレクトリが作られるっぽい
$ bup init

$ bup index /etc 

# local-etcという名前で/etcディレクトリを保存
$ bup save -n local-etc /etc
```

これでよいっぽい。

# restoreしてみる

restoreで任意の場所に戻せるようなので、戻してみる

```bash
# ~/restディレクトリに戻す
$ bup restore -C ~/rest local-etc/latest/etc
Restoring: 1525, done.
```

戻った？？
一応確認

```bash
$ cd ~/rest

$ ls -ltr
etc

$ cd etc

$ ls -ltr
drwxr-xr-x. 4 root root    4096  2月 10 07:38 dpkg
drwxr-xr-x. 2 root root    4096  2月 10 07:38 dictionaries-common
drwxr-xr-x. 4 root root    4096  2月 10 07:38 dhcp
drwxr-xr-x. 4 root root    4096  2月 10 07:38 dconf
drwxr-xr-x. 4 root root    4096  2月 10 07:38 dbus-1
drwxr-xr-x. 3 root root    4096  2月 10 07:38 ca-certificates
drwxr-xr-x. 2 root root    4096  2月 10 07:38 bash_completion.d
.
.
.
```

ちゃんと戻っているようです！
試したもののかなり容量の小さいディレクトリだったので、高速なのかどうかいまいちわからなかった、、、
そのうちもうちょっと重たいディレクトリで試してみようと思います！
（備忘）Vagrantで作成したCentOS6.6に置いたnode.jsのWebサーバーにブラウザからアクセスする

#（備忘）Vagrantで作成したCentOS6.6に置いたnode.jsのWebサーバーにブラウザからアクセスする

ドットインストールさんでnode.jsの入門をやっていた時に「#05 Webサーバーを作ってみよう」でどうにもこうにもVMの1337ポートにアクセスできなかったので対応方法をメモ。

###環境
Vagrant 1.8.1
CentOS 6.6
node.js v0.10.29

###参考
[Vagrant上のCentOSにNode.jsをインストール](http://qiita.com/rana_kualu/items/d39fa29746ea1702a13b)

[Vagrantのネットワーク周りのあれこれ](http://labs.septeni.co.jp/entry/20140707/1404670069)

***
Vagrantfileを全く編集せずにifconfigで見えていた"eth0"のIPアドレスに、作成したserver.jsを接続しようとしたが繋がらなかったので困り果てた挙句Vagrantへのアクセス方法を勉強し直すことに。


勉強してみるとこの「#05 Webサーバーを作ってみよう」はVagrantfileで“パブリックネットワーク”の設定をしてるのではないかと想定。
早速やってみる。

```lang:Vagrantfile
Vagrant.configure(2) do |config|
config.vm.box = "test_guestOS"
config.vm.network "public_network"
end
```

これでゲストOSを再起動。
	`$ vagrant reload`
途中、ネットワークインターフェースを聞かれたので"1"と応える。
	`default: Which interface should the network bridge to? 1`
再起動後、ネットワークを確認してserver.jsの接続先IPアドレスを書き直し、サーバーオン。

該当のIPアドレスとポート番号にアクセスしたら、無事に"HelloWorld"に会えました。


![helloworld_from_nodejs.png](https://qiita-image-store.s3.amazonaws.com/0/95801/272e92f2-efeb-4310-5ac4-a9dc0d83be26.png)

ちなみに、node.jsのインストールにもだいぶ手間取ったのですがnodeBrewでなんとか動いてます。
Upverter > ICが黄色の意味 > Conciergeによる更新がある / 更新取り込みはユーザが決めれる

回路図編集中にICが黄色になった時の意味

動画
http://resources.upverter.com/h/i/135122855-how-to-edit-a-part/210809

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/32dd7968-6a68-9139-b617-c8750b393413.png)

(1:03-)

[意訳]

- 黄色の意味はConciergeが更新したということをあらわす
- Conciergeの更新は作業中の回路に勝手に反映されない
- 更新を取り入れるかはユーザが決めることができる
- 更新を取り入れるには以下をする
   - double click
   - click update
[自分メモ]vim 差分を目視しながらファイル間コピペ

# 違うファイルから内容を一部コピーして持ってきたいメモ
## 設定
　**今いる階層**: /common/hoge/piyo
　**コピペ元ファイルがある階層**: /common/geho/piyo
　**ファイル名**: file.txt　（適当）
## 普通に複数のファイルを開く方法
　vimではファイルを開くときに、引数を後ろに追加していくことが可能とのこと。
```vim file.txt file2.txt file3.txt```
　普通にfile.txtだけを開いたときと見た目が変わらないが、:nで次の引数、:prevで前の引数にと、vimを起動し直さずにファイルを移動することができます。設定の状況だとこう：
```vim ../../geho/piyo/file.txt file.txt``` 
vimは起動し直すと、ヤンク(コピー)が50行までしか保持されないので、広範囲をコピペしたいときはこのようにファイルを開くのがよさげです。参考：[teratail - Vimでヤンクした内容がファイルをまたぐと５０行までしか保持されていない。](https://teratail.com/questions/2053)
　*私は色々なことを知らなかったので、いちいちコピペ元を```:e file.txt```してからヤンクして、```:q!```とかで終わらせて、それからコピペ先を```:e file.txt```して挿入したいところに```p```で貼り付けようとしては、200行ぐらいコピったのになんで50行なのふえぇ……:pig2::sweat_drops:ということになっていました。*
## もっとわかりやすく作業したい
　隣で並べながら作業できたらいいなという願いと、差分を見られたらいいなという願いがありました。そこで、```:vsplit```のようなコマンドが便利だとわかりました。
　まずコピペ元を開きます。
```vim ../../geho/piyo/file.txt```
![image](https://qiita-image-store.s3.amazonaws.com/0/108174/1d9463de-4bca-742c-750c-5c9dfe8dd5fd.png)
　それから、画面を分割した上で、コピペ先のファイルを開きます。
```:vsplit file.txt```
![image](https://qiita-image-store.s3.amazonaws.com/0/108174/6260b3c5-de64-87d7-78bc-3d8168f773f7.png)
　このぐらい短い内容ならそのままでもコピペ作業して大丈夫そうですが、diffthisで差分にマークもできます。既存の記事に、vsplitの機能と共に紹介されています：[Qiita - vimですでに開いているファイルと別ファイルとの差分を表示する方法](http://qiita.com/isseium/items/36b54171c430f381e232)
　差分表示から抜けるときは、```:windo diffoff```です。
*　私は、前項のような複数ファイルを開く方法を覚えても、中身が長かったり部分的にコピペするとき、似たようなコンポーネントの記述が続いていたりすると、進んで戻ってしているときにどこからどこまでをコピペしたらよいのかの判断がつきにくくなり、テキスト/コードエディタから2つのファイルを開いて手作業でやった方が早いんじゃないの!?:thought_balloon:　となってしまいました。*
## 基礎的なところ：how to ヤンク
　ノーマルモードの状態で、コピりたい最初の行にカーソルを合わせて```ms```、最後の行で```me```とタイプ後、```:'s,'ey```でコピーができます。それからペーストしたい場所にカーソルを合わせてノーマルモードで```p```です。なお、範囲指定で削除の時は、```:'s,'ed```です。
## 基礎的なところ：how to 切替、同期
　ファイルの内容が長くなるとスクロールして見比べていく必要がありますが、通常は選択中のファイルの方だけがスクロール対象となります。スクロールを同期させるためには、分割して開いているファイルのすべてに対してスクロール同期のためのコマンドを与える必要があります。まず、現在選択されているファイルに対して、
```:set scb```
　それから、次のファイルを選択（Ctrl+w, w ※）してもう一度```:set scb```します。同期させたいファイルすべてでこのコマンドを打つことで完了です。同期をやめるときは```:set noscb```です。参考：[Qiita - vimの分割ウインドウのスクロールを同期させる](http://qiita.com/murayama/items/497b275b31a378921f6a)
　※コントロールwをタイプ後にもう一度wをタイプの2STEP
Upverter > Parts編集 > ピンの移動 > 1. 灰色四角選択 / 2. 矢印で移動

UpverterにてParts編集画面でのピンの移動の仕方

動画
http://resources.upverter.com/h/i/135122855-how-to-edit-a-part/210809

(00:45-)

- Select the square
- Then use your arrow keys on your keyboard to move it to up and down
- Then click [save] on the top left

灰色の四角を選択して、カーソルの矢印で移動できる。
グリッドにそって移動なので、おかしな場所に行くことはない。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/eb0630cc-383b-99eb-c854-c8570456665c.png)

慣れれば使いやすいかも。

<hr>
(追記 2016/02/12)

灰色の四角の選択は、マウスで領域を囲うことで複数の選択も可能だった。
例えば、５つのピンをまとめて下に移動する時は、マウスでその５つのピンの灰色四角を囲って、矢印キーの下を押すとまとめて移動できる。
DockerコンテナにSSHする際に環境変数を引き継ぐ

# はじめに
Dockerで起動したコンテナにSSHでログイン後に、コンテナ起動時に指定した環境変数は取得することができないようになっています。
下記コマンドの様にコンテナ起動時にシェルを立ち上げればいいだけの話ですが、
ホストOSログイン→コンテナ起動という手順を省きたいです。

```sh
$ docker run -e RAILS_ENV=production -it centos /bin/bash
```

# SSHでログインできるコンテナ作成
Dockerfileを以下の様に作成します。
※Dockerfile構造の簡易化のためパスワード無しでログインできるようにしてあります。

```sh:Dockerfile
FROM centos:7

RUN yum install -y openssh-server initscripts
RUN /usr/sbin/sshd-keygen

RUN echo 'PermitEmptyPasswords yes' >> /etc/ssh/sshd_config
RUN useradd suzuki
RUN passwd -u -f suzuki

CMD /usr/sbin/sshd -D
```

コンテナを起動します。

```sh
$ docker build -t sshtest .
$ docker run -p 23:22 -it sshtest
```

ホストOSのIPの23番ポートでSSH接続できるようになったので、
Teratermなどを使ってログインします。

# 環境変数を設定する

コンテナ起動時に環境変数を設定します。

```sh
docker run -e RAILS_ENV=production -p 23:22 -it sshtest
```

コンテナ起動後にSSHでログインして環境変数を確認してみます。

```sh
[suzuki@1d3c9ac47cb9 ~]$ env | grep RAILS_ENV

```

上記の様に何も出力されません…

そこで、コンテナ起動時にenvコマンドで出力される変数一覧を一時ファイルとして保存しておき、SSH接続時に読み込むようにします。
Dockerfileを以下の様に変更します。

```sh:Dockerfile
FROM centos:7

RUN yum install -y openssh-server initscripts
RUN /usr/sbin/sshd-keygen

RUN echo 'PermitEmptyPasswords yes' >> /etc/ssh/sshd_config
RUN useradd suzuki
RUN passwd -u -f suzuki
+COPY setenv.sh /tmp/setenv.sh
+RUN chmod 755 /tmp/setenv.sh && echo 'source /tmp/setenv.sh' >> /home/suzuki/.bashrc

+CMD /usr/bin/env | grep -E '.+_' > /tmp/environment && /usr/sbin/sshd -D
-CMD /usr/sbin/sshd -D
```

envコマンドの出力結果を/tmp/environmentに保存します。この際全て保存するとsourceコマンド読み込む際に不都合が生じるので、必要な分だけ読み込めるようにgrepで調整します。
環境変数読み込み用にシェルスクリプトを用意してSSH接続時に実行してやります。

以下が環境変数読み込み用のシェルスクリプトになります。

```sh:setenv.sh
#!/usr/bin/sh

while read line
do
  export $line
done < /tmp/environment
```

これで起動して確認してみます。

```sh
$ docker build -t sshtest .
$ docker run -e RAILS_ENV=production -p 23:22 -it sshtest
[suzuki@0fb134c7eb47 ~]$ env | grep RAILS_ENV
RAILS_ENV=production
```

# おわりに
開発環境でサーバに接続して作業したい場合は、この方法でやれば仮想環境を立ち上げるだけですぐに開発ができるようになります。

# 参考
https://github.com/docker/docker/issues/2569
Michael Abrash Interview 10

http://qiita.com/7of9/items/0adde38dc4361c98313e
の続き
Michael Abrash Interview:
https://www.youtube.com/watch?v=a7My8zbDNRI&list=PL_MJualihC5AxdlHgVUROYKbNAaPJ5PE4&index=2)

(4:30-)
...Because a lot of problems you can't tackle <font color=red>on the other way</font>. 

(4:31-)
The one thing I would say, is a lot of times now people <font color=blue>get talk</font> programming at very abstract level. That's great for doing big projects, Ah.

(4:42-)
Building things in modular way so that you can maintain them <font color=red>XXX (so forth?)</font>. But it takes you further way from how programs actually work when they <font color=red>XXX (write?)</font>.

(4:48-)
And the key to performance, which is my favorite part of programming is how programs interact with the hardware. In order to do somethings, you really have to understand that.


5分の計測を忘れてたがここでやめておく。

赤文字ははっきり聞き取れない部分。
青文字はそのように聞き取れるが、文法的にしっくりいかない部分。

カーマックの動画をやれるのはまだしばらくかかりそうだ。