OmniAICreator/Qiita-1.07M huggingface dataset:
SquashFSの圧縮形式


[SquashFSをマウントするまで](http://qiita.com/stc1988/items/41d9da92ea02fc3d15a3)の続きです。
mksquashfsによるイメージ作成時の圧縮形式オプションを変更し、圧縮率や展開速度のパフォーマンスを見ていきます。

## 圧縮形式

squashfsの圧縮形式はgzip(標準)/lzo/xzの３種類を使用することできる

一般的に３種類ぞれぞれの圧縮率と展開速度の関係は以下の通りで、
バランスの良さからgzipが標準になっているようである。

高<---　　圧縮率　　--->低
xz　　　　gzip　　　　lzo

高<---　　展開速度　--->低
lzo　　　 gzip　　　　xz

圧縮形式は`-comp`オプションで指定する。
前回に引き続いて/usr/share/docをlzoとxzで圧縮したイメージを作成します。

```shell-session
$ mksquashfs /usr/share/doc doc_lzo.sfs -comp lzo
$ mksquashfs /usr/share/doc doc_zx.sfs -comp xz
```

## 圧縮率

それぞれの圧縮形式で作成したイメージのサイズおよび元々のサイズ(origianl)は以下の通り。


| original| gzip |   lzo|    xz|
|--------:|-----:|-----:| ----:|
|  77.1MB |37.3MB|37.8MB|36.5MB|


## 展開速度

展開速度(ファイル読み込み速度)をいくつかの観点で比較を行う。
originalのファイルシステムはext4である。

また、各計測間の速度に影響が出ないように以下コマンドでキャッシュを毎回クリアする。

```console
# echo 3 > /proc/sys/vm/drop_caches
```

### ディレクトリ情報の参照
以下コマンドを対象（マウント）ディレクトリ配下で実行する。

```console
$ time ls -lR | cat > /dev/null
```

| original|  gzip|   lzo|    xz|
|--------:|-----:|-----:|-----:|
|   4.834s|2.942s|3.060s|3.101s|


###ファイル読み込み
以下コマンドを対象（マウント）ディレクトリ配下で実行する。

```console
$ time tar cf - . | cat > /dev/null
```

| original|  gzip|   lzo|     xz|
|--------:|-----:|-----:|------:|
|  15.782s|9.199s|8.829s|18.879s|


##まとめ
一般的なパフォーマンスの関係は最初に書いた通りになるが、圧縮対象次第で変わることもあるので、
計測を行った上でバランスを見ながら圧縮形式を選択するとよいでしょう。


## 参考サイト
Squash Fs Comparison(http://elinux.org/Squash_Fs_Comparisons)
突然chefが通らなくなったメモ 〜yum cookbookのversion編〜


## 経緯

 - Marvericksにした時Rubyがいろいろ死んだので、berkshelfも動かなくなってたけど、放置してた
 - ちゃんといれなおした
 - 次にchef(```knife solo cook```)走らせた時に、動かなくなった
   - php-fpm cookbookがエラー吐いて止まる!
   - *「yum_keyなんてResourceないよ!!」*ってなメッセージ
   - cookbookの自分で書いてる部分には、特に変更なし

## 原因

 - berkshelfが動き出したので、最新のyum cookbookが落ちてきた
 - yumのcookbookは3.0.0以降、けっこうAPIが変わったみたい

> [yum Lightweight Resources — Chef Docs](http://docs.opscode.com/lwrp_yum.html)
> The yum cookbook, version 3.0.0 (and above) contains breaking changes that are not compatible with previous versions.

 - `Berksfile.lock` 見て確認すると、php-fpmは依存する yum cookbookのバージョンを指定していない(`yum >= 0.0.0`) みたい
 - **けど実際は、3.0.0以降のAPIには対応してないんじゃね?**

## 対策

 - php-fpmの対応を待つのも面倒なので、yum cookbookのバージョン下げていただく
 - ついでに、 `Berksfile` を更新してーみたいなwarningも出てたので、こんな感じにした

```Berksfile
source "https://api.berkshelf.com"
cookbook 'yum', '2.4.4'
cookbook 'php-fpm'
```

 - これで今までどおり動くようになった。めでたし。

## まとめ

 - berkshelfうごいてないとこまる
 - もっとイケてる解決策知ってる人は教えてください
 - いまchefいじってる場合じゃない気がする
svnで最終変更リビジョンの取得方法



```bash:バージョン取得方法
Last_Changed_Rev=`LC_ALL=en_US.UTF8 svn info "SVNのURL" | grep 'Last Changed Rev' | grep -o "[0-9]*"`
```

##解説
取得しやすくするため英語でinfoを出力。

```bash
LC_ALL=en_US.UTF8
```

URLの情報を出力

```bash
svn info "SVNのURL"
```

infoで出力されたもののうち、「Revision: 822」の数値部分を抜き出す。

```bash
grep 'Last Changed Rev' | grep -o "[0-9]*"
```
malloc〜中級編〜

一応前回初級編だったので名目上タイトルを中級編にしましたが、中級編かなぁ……。まだ初級編のような気はします。

最初で書くべきことではあったのですが、今回の勉強は小崎資広さんがThe 67th Yokohama Kernel Reading Partyという怪しげな(褒めてます)集まりで発表した「mallocの旅」を参考にしています。結構図とか真似したりしてますし、本家のほうを参照したほうがいいかもしれませんね。色々省略とかしてますし。
[動画](http://shelby.tv/video/youtube/0-vWT-t0UHg/the-67th-yokohama-kernel-reading-party)
[資料](http://www.slideshare.net/kosaki55tea/glibc-malloc)

というか、前回のブログは図に間違いが少しあります。まあ崩壊するほどじゃないので気にしないことにします。

じゃあまず、前回のおさらいでも。

K&R malloc、すげえフラグメンテーション頻発する！

- K&R mallocが主流だった頃は「メモリはプログラムの最初に一気に確保するもの」だった
- メモリが充分に空いている状態で必要なメモリを一気に確保するなら、当然フラグメンテーションは起きにくくなる
- 今はJava・C++みたいなオブジェクト指向言語、Rubyのようなスクリプト言語等があり、小さいmallocが頻発→フラグメンテーション
- それをfirst fitでやるのはよくない

こんな感じかな？本当はこっから少しずつmallocが改良されていくんですが、一気に飛びます。

##「そもそも、一つのfree litsで管理すること自体無理があるんじゃね……？」

一つのリストで頑張って管理するのではなく、複数のリストを用意してやればフラグメンテーションはマシになるのではないか、という発想です。フラグメンテーションは小さいブロックと大きいブロックが連続したりすることで起きます。だったらsizeごとにリストを分けて管理してしまおう！ということで、サイズ16Byte用のリスト、サイズ24Byte用のリスト……というようにリストを複数作ります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/28491/45b2fc6c-e364-2358-77ac-54bb879ede4f.png" width="500">

- mallocで要求されたsizeを8で割れば自分が使用するindexになる
- 無限にリストを増やすわけにはいかないので、このリストは512Byteのみにする
- 512Byte以上の大きいデータは特殊な管理を行う
- 大きいデータと小さいデータを一緒に管理するからフラグメンテーションが進むんだ<br>→大きいデータ用の領域がもう一個欲しい<br>
→そうだ、mmapを使おう

##mmapってなんだっけ…？

- ファイル(fdで指定したリソース)をメモリにマップする
- fdで"/dev/zero"を指定することでmmapをメモリ確保用のAPIとして使用できる
- このAPIを使ってHuge Block(sizeの大きいブロック)はkernelから直接取得する

コード書くとしたらこんな感じ？compileしてないのでわかんないけど……。


```
void *alloc_mmap(size_t size) {
    int fd    = open("/dev/zero", O_RDONLY);
    void *ret = mmap(addr, length, prot, flags, fd, offset); 
    return ret;
}
```

一応引数の復習ー。

|引数|説明|
|:--|:--|
|addr|mapするメモリアドレス。NULLを渡せばkernelがアドレスを選択する。|
|length|addrから何バイトマッピングするか。|
|prot|マッピングのメモリ保護の指定。Read Write Exec None等がある。|
|flags|マップを要求された時、共有するかコピーを渡すか。|
|offset|ファイルの何バイト目からをメモリにマップするか。|

## HugeBlock
このHuge Blockはmmapで確保するので、free listからは独立しています。図にするとしたらこんな感じ。
<img src="https://qiita-image-store.s3.amazonaws.com/0/28491/a46a9c30-94cb-8e92-b98f-1c12ac7c5b75.png" width="600">

listからは独立しているので、当然listをたどったりしなくて良い。
メモリが欲しくなったらmmapして、いらないならaddressを指定してmunmapするだけ。

- free list上でフラグメンテーションが起きにくくなった(当たり前)
- メモリの無駄が少ない<br>
大きなメモリは同じサイズでもう一度mallocされる可能性は低いので、使わなくなったらすぐにOSに返却する、というのは正しい。

Huge Blockをmmapで管理するのは確かに手っ取り早いし効率も良いのですが、何ByteからHugeBlockとみなすかを動かすプログラムや実行環境からちゃんと考えてあげないといけない……らしい。
大きいmallocがたくさん呼ばれるとき……かな？多分。大きいmallocが多いならmmapじゃなくてリストの方が良いんじゃないかなあ。

HugeBlockのサイズは環境変数で宣言されてるので、そこをいじる感じですね。


まあ、mallocの勉強はこんなもんでいいかなあ。本当はこれからarenaという機構を導入した、mallocの並列化とかもあるんですけど一旦mallocの勉強はやめてソース読むなり別の勉強するなりしようかと思ってます。

今回のmallocお勉強では結構簡単なとこだけ触れたんですが中々にbrain damegedでした。

freelistのヘッダーに一個フラグをつけたいが、メンバ変数増やしたくない→ポインタの下位2bitは絶対０だからそこをフラグとして扱おう！

freelistのこのメンバ変数ってfreeされてる時は使うけど、mallocされたらいらないんじゃね？→じゃあ破壊してもいいや

的な。僕程度から見たら危なっかしいんですが、これで大丈夫らしいです……。まあ確かに動いてはいますし。

malloc結構奥が深くて面白かったです。機会があったらarenaの勉強もしてみようかな。
Sprayでログの設定をする

[Spray](http://spray.io/)を利用したアプリケーションの実装を行う際、ログ出力は必須となりますが、そのあたりに関する設定のメモ。

日本語でSprayの記事って少ないですね。

[LoggingContext](http://spray.io/documentation/1.2.1/spray-util/#loggingcontext)にありますが、AkkaのLoggingAdapterをラップしてるようです。したがって、Akkaと同じ設定で利用できます。

ちなみに、ビルドにはsbtを利用している前提です。

## logback.xml

`logback.xml`を`src/main/resources`に置きます。内容は[Logback](http://logback.qos.ch/)のための設定なので、詳細については別の資料とかを見たほうが良いかと。

サンプルで、以下のを用意しました。

```xml
<configuration>

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>application-debug.log</file>
        <append>true</append>
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
            <pattern>%d{yyyy/dd/MM HH:mm:ss.SSS} %-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy/dd/MM HH:mm:ss.SSS} %-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="DEBUG">
        <appender-ref ref="FILE" />
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>
```

## build.sbt

依存関係を追加します


```scala
libraryDependencies ++= {
  val akkaV = "2.3.0"
  Seq(
    "ch.qos.logback" % "logback-classic" % "1.1.2",
    "com.typesafe.akka" %% "akka-slf4j" % akkaV
  )
}
```

バージョンについては適当なものを設定します。

## application.conf

`application.conf`でAkkaの設定をします。

```
akka {
  loggers = ["akka.event.slf4j.Slf4jLogger"]
  event-handlers = ["akka.event.slf4j.Slf4jEventHandler"]
  loglevel = DEBUG
}
```

## ログ出力

Actorにサブクラスなどで


```scala
import spray.util.LoggingContext


val logging = LoggingContext.fromActorRefFactory
logger.debug("This is log")
```

とりあえずログの出力ができました。

便利ですね。
FactoryGirlでランダムな値がほしいとき


Seleniumを使ってフォームのテストを作ってて擬似的にランダムな値をセットしてほしいとき、

```
class User
	attr_accessor :name, :position, :age
end
```


``` factories/user.rb
FactoryGirl.define do
	factory :user do
		sequence(:name){|n| "太郎#{n}"}
		position ['課長','係長','部長'].sample
		age	[*1..100].sample
	end
end
```

これをこうしても

```
users = FactoryGirl.build_list(:user, 10)
```

名前が違っても中身が同じくなる。

### 取り敢えずこうしてみた

``` factories/user.rb
FactoryGirl.define do
	factory :user do
		sequence(:name){|n| "太郎#{n}"}
		sequence(:position){ ['課長','係長','部長'].sample }
		sequence(:age){ [*1..100].sample }
	end
end
```

中身が揺れてくれた。本当はどうするんだろ？
懐かしの CoreOS の motd を復活させることに成功

```
$ vagrant ssh
   ______                ____  _____
  / ____/___  ________  / __ \/ ___/
 / /   / __ \/ ___/ _ \/ / / /\__ \
/ /___/ /_/ / /  /  __/ /_/ /___/ /
\____/\____/_/   \___/\____//____/
(alpha 317.0.0)
core@localhost ~ $ 
```

https://vagrantcloud.com/yungsang/coreos-alpha
Lua でイタレータを作ってみる(enumerate)

Python みたいなジェネレータはないけど、コルーチンがあるから簡単。

試しに、pair 等の結果に序列をつけるイタレータ(enumerate)を作ってみよう。

```lua
itertools = itertools or {}
local unpack_=(unpack or table.unpack)

function itertools.enumerate(func,stat,var0)
    return coroutine.wrap( function()
        local vars = { func(stat,var0) }
        local count = 1
        while vars[1] do
            coroutine.yield( count , unpack_(vars) )
            count = count + 1
            vars = { func(stat,unpack_(vars)) }
        end
    end)
end
```

```lua
for i,key,val in itertools.enumerate(pairs(foo)) do
    print(i,key,val)
end
```

初出：http://nyaos.org/d/index.cgi?p=%282012.12.12%29
JMeterでWebSocketのパフォーマンステスト

いくつか記事があったけど、使うまでに結構苦労したのでメモ


### WebSocketを扱えるJMeterのプラグイン

ぱっと見つかったのは以下の2つ。

* [jmeter-websocket](https://github.com/kawasima/jmeter-websocket/)
* [JMeter-WebSocketSampler](https://github.com/maciejzaleski/JMeter-WebSocketSampler)

前者はポートの指定がうまく認識されず「ポートが0番になっている」というようなエラーで止まってしまった（※あまり深く調査してない）ため、後者を使用する。

### プラグインのインストール

基本的にはJMeterのインストールディレクトリ以下にプラグインのjarを配置するだけなのだが、実は依存関係にある他のjarも一緒に置かなければいけないという制約を見落としていて苦労した。また、プラグインのpom.xmlを見ると分かる通りJMeterのバージョンは2.10以上にしておく必要がある。

* [ここ](https://github.com/maciejzaleski/JMeter-WebSocketSampler/releases)から「JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar」をダウンロードし、lib/ext以下に配置
* [Dependencyのページ](https://github.com/maciejzaleski/JMeter-WebSocketSampler/wiki/Dependencies)に記載のあるjarを探してダウンロードし、lib/ext以下に配置。基本はMaven Repositoryで見つけられる。
* jarを揃えた後、JMeterを再起動するとWebSocket Samplerが使えるようになっている。
![websocketsampler.png](https://qiita-image-store.s3.amazonaws.com/0/16444/2fa5348e-3923-248a-15cf-4729ffbf0904.png)

### 基本的な使い方

使い方はHTTP Samplerと似ており、

* Server Name or IP
* Port Number
* Protocol (wsかwss)
* Path

を入力する。

次に、「Request data」にクライアントから送るテキストを記載し、「Response pattern」にレスポンスとして受け付ける文字列を正規表現（.*など）で記載する。WebSocketはHTTP通信と違ってリクエストとレスポンスが一対一対応ではないため、この正規表現を使って実際にパフォーマンス計測したい通信を特定する。

次のSamplerでもWebSocketの接続を引き続き利用したい場合は、「Streaming connection」にチェックを入れ右上の「Connection Id」にSampler間で同じ値を入れる。
これを使う場合は、「Close connection pattern」を指定しておくとそのパターンに合致したところで接続が完了するので、いずれか1つのSamplerで合致した時点で接続が切れる。

### ヘッダ・Cookie情報を使う

通常のHTTPサンプラーを使う場合は、HTTPクッキーマネージャやHTTPヘッダマネージャをスレッドグループに登録しておくと
・Cookieの保持
・指定したヘッダ情報の送信
を行うことができる。

WebSocket通信も、初回の接続はHTTPで接続しに行ってWebSocketが確立したらそちらに切り替えるという形を取るので認証などでヘッダ・Cookie情報が必要になることがある。しかし2013年5月15日現在リリースされているWebSocket Samplerでは、実装が入っていないため情報を取り込むことができない。

困って「websocketsampler cookie」でググったところ、なんとちょうど該当機能のpull requestを出している人が[いた](https://github.com/maciejzaleski/JMeter-WebSocketSampler/pull/22)。残念ながらまだ本体にマージはされていないようだが、これを利用することに。

Pull requestを出した方のリポジトリでも特にリリースはされていないようなので、試しにcloneしてビルドしてみたがコンパイルエラーとなった。Fork元の本家の方でも同じエラーが出るため、諦めて

* [現在の最新リリース版のソース](https://github.com/maciejzaleski/JMeter-WebSocketSampler/archive/version-1.0.2.zip)をダウンロード
* Pull requestの内容を参考にsrc/main/java/JMeter/plugins/functional/samplers/websocket/WebSocketSampler.javaを修正
* ```mvn package``` で再ビルド

という手順を踏んでヘッダマネージャ・クッキーマネージャサポートつきのjarを入手した。

新しいjarを使ってJMeterを起動したところ、見事Cookieの保持に成功！長い道のりだった…
plistのエラーチェック方法

備忘録

macでplistのエラーをチェックする方法

ターミナルで、以下を入力
`plutil plistファイルのパス`

問題がなければ、
`OK`
と表示されます。

問題があれば、
`Encountered unexpected character d on line 6 while looking for close tag`
のようにエラーの行と内容が表示されます。
複数問題があれば、一番上のエラーが表示されます。
.net で、フォームの Load メソッド内で Me.Close すると死ぬ

**フォームのプロパティーの TopMost が True の時だけ！**

こんなスタックトレースが出るよ！

```
ystem.ObjectDisposedException はハンドルされませんでした。
  Message=破棄されたオブジェクトにアクセスできません。
オブジェクト名 'EnglishTest' です。
  Source=System.Windows.Forms
  ObjectName=EnglishTest
  StackTrace:
       場所 System.Windows.Forms.Control.CreateHandle()
       場所 System.Windows.Forms.Form.CreateHandle()
       場所 System.Windows.Forms.Control.get_Handle()
       場所 System.Windows.Forms.ContainerControl.FocusActiveControlInternal()
       場所 System.Windows.Forms.Form.SetVisibleCore(Boolean value)
       場所 System.Windows.Forms.Control.set_Visible(Boolean value)
       場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       場所 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
       場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
       場所 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
       場所 GENEPORTAL.My.MyApplication.Main(String[] Args) 場所 17d14f5c-a337-4978-8281-53493378c1071.vb:行 81
       場所 System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       場所 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       場所 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       場所 System.Threading.ThreadHelper.ThreadStart()
  InnerException: 
```

偶然にも、TopMost = True にしたタイミングと、 IDisposable なクラスを初めて作ったタイミングが重なったのが同じだったので、 明後日の箇所ばかり調べてて、原因が全然分からず、1日悩んでしまった。

* [FormLoadでFormCloseを行いたい: DOBON.NETプログラミング掲示板過去ログ](http://dobon.net/vb/bbs/log3-10/5704.html)

この記事がなければ死んでいた。

暫定的に TopMost = False にするけど、 そもそも Load で Close することがアウトっぽいので、 タイミングを見て、直さなくては…。
Xserver(レンタルサーバー)でLaravelを動かす

## 使用するPHPのバージョン変更

[Xserver](http://www.xserver.ne.jp/)のPHPはデフォルト状態だと5.1系のため、artisanコマンドが動かないので設定を変更する

```shell-session
user@sv000$ php -v
PHP 5.1.6 (cgi-fcgi) (built: Mar 24 2014 04:38:12)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
```

### $HOME/bin 以下にPHPのシンボリックリンクを作成

今回は5.4系の最新を指定してみた

```shell-session
user@sv000$ find /opt/php-*/bin -type f -name 'php'
/opt/php-5.4.13/bin/php
/opt/php-5.4.25/bin/php
/opt/php-5.4.26/bin/php
/opt/php-5.5.0/bin/php
/opt/php-5.5.10/bin/php
/opt/php-5.5.9/bin/php
```

```shell-session
user@sv000$ mkdir $HOME/bin
user@sv000$ ln -s /opt/php-5.4.26/bin/php $HOME/bin/php
```

### $HOME/bin が優先して読み込まれるようにする

.bash_profile に $HOME/bin のPATHが設定されていたので、先に読み込まれるよう変更した

```diff
*** .bash_profile.bak	2014-04-09 19:12:40.225561022 +0900
--- .bash_profile	2014-04-09 19:39:25.764561022 +0900
***************
*** 7,12 ****

  # User specific environment and startup programs

! PATH=$PATH:$HOME/bin

  export PATH
--- 7,12 ----

  # User specific environment and startup programs

! PATH=$HOME/bin:$PATH

  export PATH
```

## composerをインストール
```shell-session
user@sv000$ curl -sS https://getcomposer.org/installer | php
user@sv000$ mv composer.phar $HOME/bin/composer
```

## Laravelのプロジェクトを作成
```shell-session
user@sv000$ cd $HOME/example.jp
user@sv000$ composer create-project laravel/laravel --prefer-dist
```

## .htaccessの設定

5.4系のPHPを使用するように.htaccessを設定

```apache:public/.htaccess
AddHandler x-httpd-php5.4 .php .phps
AddHandler server-parsed .html .htm

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
```

## publicディレクトリのシンボリックリンクを作成

[Xserver](http://www.xserver.ne.jp/)は $HOME/example.jp/public_html 以下にサブドメインの公開ディレクトリが存在しているため
http://laravel.example.jp で公開する場合は下記のようにする

```shell-session
user@sv000$ ln -s $HOME/example.jp/laravel/public $HOME/example.jp/public_html/laravel
```

## 動作確認

```shell-session
user@sv000$ cd $HOME/example.jp/laravel
user@sv000$ ./artisan -V
Laravel Framework version 4.1.28
```
git である行の修正コミットを特定する

# git である行の修正コミットを特定する

直近の変更コミットから、さらに遡りたいことがあったので調べた結果。

blame -L で指定行の変更コミットを確認

```
$ git blame -L 736,736 autoload\unite\kinds\file.vim

d484e113 (Shougo Matsushita 2012-02-11 23:51:30 +0900 736)       if unite#util#is_windows() && path =~ '^//'
```

変更内容確認（任意の場所を表示するコマンドはあるのかな？）

```
$ git log -p d484e113 autoload\unite\kinds\file.vim

@@ -486,7 +486,7 @@ function! s:kind.action_table.vimfiler__execute.func(candidates)"{{{
   try
     for candidate in a:candidates
       let path = candidate.action__path
-      if unite#util#is_win() && path =~ '^//'
+      if unite#util#is_windows() && path =~ '^//'
         " substitute separator for UNC.
         let path = substitute(path, '/', '\\', 'g')
       endif
```

本質的な変更はさらに過去みたいなので、さらに遡る。
このコミットの親 d484e113^ から 489 行目の内容が追加されたコミットを探す。
（表示を開始している行が 486 行目なので、対象の行は +3 の 489 行目。もっとスマートな方法がありそう）

```
$ git blame -L 489,489 autoload\unite\kinds\file.vim -r "d484e113^"

8f6d596c (Shougo Matsushita 2011-11-28 19:00:16 +0900 489)       if unite#util#is_win() && path =~ '^//'
```

変更内容確認。こいつみたい。

```
$ git log -p 8f6d596c autoload\unite\kinds\file.vim

commit 8f6d596c4afc60fe6fd02d4c5dedbcda7fa5146c
Author: Shougo Matsushita <Shougo.Matsu@gmail.com>
Date:   Mon Nov 28 19:00:16 2011 +0900

    - Fixed for UNC.

diff --git a/autoload/unite/kinds/file.vim b/autoload/unite/kinds/file.vim
index 46f34cd..8496432 100644
<後略>
```
Dockerで/etc/hostsファイルが操作出来ない対策

# 追記 2015/08/17
現在はrun時に `--add-host=[]` オプションでホストを注入出来る。

```bash
docker run -t -i --add-host=test.example.co.jp:127.0.0.1 --add-host=test2.example.co.jp:127.0.0.1 test/hoge /bin/bash
```
dnsmasqとかもういらないので注意
バージョンが古くて使えない場合はdnsmasqで頑張ってください

長いことメンテナンスサボってすいません

------------

コンテナの中の/etc/hostsはRead-Onlyのファイルになっており、決して操作出来ないため、hostsにドメインを追加したい時に困った

[githubのissueにあった解決策](https://github.com/dotcloud/docker/issues/1951#issuecomment-24960347)を試す
ただしコンテナの環境がScientific Linuxだと、このままでは使えなかったため、userをrootに設定する
Cent OSでも同様の設定が有効

環境はCoreOSでコンテナがScientific Linux 6.4を使っている

```bash:Dockerfile
RUN yum -y install dnsmasq

# /etc/hosts values
RUN echo 'address="/test.example.co.jp/127.0.0.1"' >> /etc/dnsmasq.d/0hosts
RUN echo 'address="/test2.example.co.jp/127.0.0.1"' >> /etc/dnsmasq.d/0hosts
RUN echo 'address="/test3.example.co.jp/127.0.0.1"' >> /etc/dnsmasq.d/0hosts

# dnsmasq configuration
RUN echo 'listen-address=127.0.0.1' >> /etc/dnsmasq.conf
RUN echo 'resolv-file=/etc/resolv.dnsmasq.conf' >> /etc/dnsmasq.conf
RUN echo 'conf-dir=/etc/dnsmasq.d' >> /etc/dnsmasq.conf
RUN echo 'user=root' >> /etc/dnsmasq.conf

# dns setting
RUN echo 'nameserver 8.8.8.8' >> /etc/resolv.dnsmasq.conf
RUN echo 'nameserver 8.8.4.4' >> /etc/resolv.dnsmasq.conf
```
```bash
docker build -t test/dnsmasq .
docker run -t -i --dns 127.0.0.1 test/dnsmasq /bin/bash
```

これで名前解決できた
設定した上で、Dockerfileで設定してrunなりstartなりした時にdeamonをスタートさせたいんだけれど、今のところ方法がわからないので保留

### 追記

この記事大分ほったらかしにしていたが、今は `--add-host` オプションを使ってhostsに相当するものを編集できる
https://docs.docker.com/reference/run/#network-settings

つまりrun時に

```shell-session
docker run --add-host test.example.co.jp:127.0.0.1 --add-host test2.example.co.jp:127.0.0.1 -t -i test /bin/bash
```
なりをすれば良い。

runの時一々指定するのめんどいので、build時に設定したいって思って検索したら
https://github.com/docker/docker/issues/10324
http://jasonincode.com/customizing-hosts-file-in-docker/
が引っかかった

どうやらコミュニティ的には回避策があるので放置に向かう方向？(15/05/08時点)
としたらちょっと微妙。
NetworkXでラベル付きグラフ


なぜかノードにラベルを付けるのが微妙にめんどくさい

- ラベル付きノードを一括で追加する

```python
>>> G = nx.Graph()
>>> G.add_nodes_from([(1,{'color':'red'}),(2,{'color':'blue'}),(3,{'color':'red'})])
>>> G.nodes(data=True)
[(1, {'color': 'red'}), (2, {'color': 'blue'}), (3, {'color': 'red'})]
```

- （ノード）ラベル付きグラフをファイルから読み込む

できない

- （ノード）ラベル付きグラフをdictやlistから作る

できない

　

エッジにラベルがついてるグラフはファイルとかdict, listから作れるのになんでノードにラベルがついてるグラフは作れないんだ？
コマンドラインで複数ファイルから特定の文字列を検索する


あまりによく使うのでメモ。


# 例

~~~terminal
$ find . -type f -name "*.js" | xargs grep 'keyword' -n 
~~~

# 結果


カレントディレクトリからのファイルのパス:行数　検索文字列を含む行

~~~
./app/assets/javascripts/form.js:20:			var keyword = "opp";
./app/assets/javascripts/form.js:211:			var result = keyword + "test";
~~~
↑適当に書いたけどこんな感じに出力される。

# 解説

## find
http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230777/
ファイルやディレクトリを検索するコマンド

~~~
.
~~~
カレントディレクトリ配下全てを指定している。
もちろんpathをしぼることも可能。

~~~
-type f
~~~
指定したファイル・タイプを検索する。
cはdがディレクトリを、fが通常ファイルを、lがシンボリック・リンクを表す。
今回は通常ファイルなのでfを指定。

~~~
-name "*.js"
~~~

ファイル名がpatternと同じファイルを検索する。ワイルド・カードを用いることができる。
例ではjsファイルのみに絞っている。


##　|

前のコマンドの出力結果を後ろのコマンドに渡すやつ。
読み方がわかんないんで誰か教えてください。

####### 追記(2014/05/16)
パイプですね。
[_heco](http://qiita.com/_heco)さんありがとうございます。
http://ja.wikipedia.org/wiki/%E3%83%91%E3%82%A4%E3%83%97_%28%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%29

## xargs
http://itpro.nikkeibp.co.jp/article/COLUMN/20140331/547143/
指定されたコマンドと初期引数に、標準入力から読み込んだ引数をつけてコマンドラインを生成し、実行するコマンド。
コマンドが指定されなかった場合はechoに送られる。


## grep
http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230786/
文字列を検索するコマンド

~~~
'keyword'
~~~
検索したい文字列

~~~
-n
~~~
行数を表示する。

#まとめ
複数ファイルをまとめて置換なんかも簡単にできる。
たまにしかしなくても忘れないようにしたい。
brabioの使い方

---

## shortkey (編集モード)
```
	ツールバー	操作
Shift＋クリック		連続した複数選択
Ctrl+クリック		複数選択
Ctrl+C		選択タスクのコピー
Ctrl+V		コピーしたタスクのペースト
U		選択タスクの上に挿入
L		選択タスクの下に挿入
右カーソル（→）		1段下げる
左カーソル（←）		1段上げる
上カーソル（↑）		選択を上に移動
下カーソル（↓）		選択を下に移動
Ctrl+<		選択タスクを上に移動する
Ctrl+>		選択タスクを下に移動する
Ctrl+F2		リンクする
Ctrl+Shift+F2		リンクを解除する
Ctrl+0		期間をクリアする
Delete		選択したタスクを削除する
Esc		選択を解除する
F2		タスク名を変更
Home		選択したタスクの開始日にスクロール
```
tmlib.jsで簡単アニメーション

# [tmlib.js](http://phi-jp.github.io/tmlib.js/)で簡単アニメーション

[tmlib.js](http://phi-jp.github.io/tmlib.js/)には、オブジェクトを簡単にアニメーションさせるtweener機能がついてます。

## tweener

連続で指定すると、アニメーション終了後に次のアニメーションにすすみます。

```js
tm.display.RectangleShape(100,100)
    .addChildTo(this)
    .setPosition(0, 0)
    .tweener.clear()
        .to({x: 300, y: 200, alpha: 0.5}, 1000)
        .to({x: 500, y: 600, alpha: 1.0}, 1000)
        ;

// 変化させる値,アニメーションする時間(ミリ秒),イージングの順番で指定する
```

## timeline

timelineはtweenerと違い、開始する時間を指定できます。

```js
tm.display.RectangleShape(100,100)
    .addChildTo(this)
    .setPosition(0, 0)
    .timeline.clear()
        .to(0,   {x: 300, y: 200, alpha: 0.5}, 1000)
        .to(300, {x: 500, y: 600, alpha: 1.0}, 1000)
        ;

// 開始する時間,変化させる値,アニメーションする時間,イージングの順番で指定する
```

### そもそもイージングって何

イージングは、アニメーションをなめらかに行うためのものです。
[ここらへんみると分かりやすいかと。](http://easings.net/ja)

こんな感じで書きます。

```js
tm.display.RectangleShape(100,100)
    .addChildTo(this)
    .setPosition(0, 0)
    .tweener.clear()
        .to({x: 300, y: 200, alpha: 0.5}, 1000, "easeInOutQuad")
        .to({x: 500, y: 600, alpha: 1.0}, 1000, "easeInOutQuad")
        ;

// 変化させる値,アニメーションする時間(ミリ秒),イージングの順番で指定する
```

一時変数も使わず一気にかけるチェーンメソッドすばらしいすなぁ。
EC-CUBEテンプレート制作


# EC-CUBEテンプレート制作

## テンプレートデータの保存場所

EC-CUBEのテンプレートデータは

```
/user_data/packages/default/
/data/Smarty/templates/default/
```

にあります。

## Smarty

拡張子が `.tpl` のファイルはSmartyのファイルです。


※ 問い合わせがあったのでメモとして残しておきます。時間に余裕のある時にでも加筆修正します。
[VirtualBox 4.3] 複製したゲストOS (CentOS) がネットワークに繋がらない: Device eth0 does not seem to be present, delaying initialization が表示された際の対応

VirtualBox にて CentOS6.4 の vdi ファイルをつかって、仮想マシンを立ち上げ（複製）ました。

とりあえず、ifconfig してみても、ちゃんとIPがふられず、当然 ping をwww.google.comとか外に打っても、通らないという状況になりました。

VirtualBoxのネットワーク設定をいじっても状況は変わりませんでした。

# 対応

## eth0 の存在確認

```shell-session
$ /sbin/ifconfig -a
```

これを打って、eth0 に関する表示が出てくるか確認。
 => 出てこないと思います。つまり eth0 が存在していないということ。

## 複製元の旧設定を変更

### MACアドレスの確認

VirtualBoxマネージャー > ネットワーク > アダプター1 > 高度 > MACアドレス
ここに表示されている文字列をメモ。
これが新たに複製する仮想マシンのMACアドレスになります。

### MACアドレスの修正

```shell-session
$ vim /etc/sysconfig/network-scripts/ifcfg-eth0
```

HWADDR欄の文字列が先ほどメモしたものと違うものになっているかと思います。
複製元のMACアドレスなので、先ほどメモしたものに書き換えます。

### 再起動

```shell-session
$ service network restart
```

おそらくエラーが発生するはずです。

```shell-session
device eth0 does not seem to be present, delaying initialization
```

要するに eth0 なんてないですよーって言ってるわけです。
なので、その辺を修正します。

### ネットワークデバイス名などの設定変更

```shell-session
$ vim /etc/udev/rules.d/70-persistent-net.rules
----
# PCI device 0x8086:0x100e (e1000) (custom name provided by external tool)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="zz:zz:zz:zz:zz:zz", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
----
```

同じ PIC device 0x8086:0x100e (e100) が2つ存在しているかと思います。
ATTR{address}の値を見ると、上のほうが複製元の古いMACアドレスになっていて、下のほうが複製後の新しいMACアドレスになっているかと思います。

なので、 **上の行を削除します。**

次に、 **下の行のNAME="eth1"をNAME="eth0"に変更します。**

また、もしMACアドレスが現在のものと違っていたら、 **ATTR{address}=の値を現在のMACアドレスに書き換えます。**

そして、 **再起動します。**

```shell-session
$ reboot
```

すると、ifconfig でちゃんとアドレスが割り当てられている表示がされ、pingも疎通するようになります。

## 参考

http://edo.blog.jp/archives/1534719.html
http://qiita.com/circled9/items/5d9ba21e21e4ddd33bac
http://www.linuxmaster.jp/linux_blog/2011/09/vmwaredevice-eth0-does-not-seem-to-be-present-delaying-initialization.html
Unity（Mac）でOculus Riftコンテンツ作成時のモニタ設定について


## モニタの設定は`ミラーリング`よりも`拡張`のが良いとされる

しかしながら、MacだとUnityのGameビューをOculus Rift側に全画面表示させるのが難しい。
それを少しでも簡単にする方法です。

\* もっと、良いやり方があるかもしれませんし、根本的に間違っているかもしれません。


## 必要なアプリ

#### RightZoom

http://www.macupdate.com/app/mac/30591/right-zoom

ウィンドウの `+` アイコン押下で全画面表示にしてくれる。
ショートカットキーも設定できるが、Unity本体のウィンドウでしか機能せず、
各タブにショートカットキーは効かない。


## やり方

### 前提条件

- 左にメインモニタ、右（右上）に拡張でOculus Riftを配置するものとする
- RightZoomがインストール、設定済であること


### 手順

1. UnityのGameビュー（タブ）を独立させる

2. Gameビューの横幅を狭くする

3. Oculus Rift側のレンズで確認しながら、Gameビューの横幅の半分以上をメインモニタからOculus Rift側に出す。

4. Oculus Rift側で`+`ボタン押下

これで、Oculus Rift側にGameビューが全画面で表示される。

`3.〜4.`の操作がスマートじゃないのが、頂けない…。


## Oculus Riftを覗かずに設定する方法もあるにはあるが…

- Unity本体のアプリにGameビューをセットし、`Maximize on Play`をONにする
- Scene、Hierarchy、Project、inspectorなど必要なビューはメインモニタ内に独立させる
- GameビューをメインモニタからOculus Rift側へ移動し、`RightZoom`で設定したショートカットキーでウィンドウを最大化する

これで、Oculus Riftを覗くことなくGameビューを全画面表示できる。

が、

Unity本体のアプリが全てOculus Rift側にいってしまっているので、実行ボタンなどが押せなくなる。
実行などはショートカットキーで全て行う事になる。

また、各ビューを独立させる作業が面倒。

## まとめ

どっちがいいかと、恐らく前者。
どの道、スマートに配置するのは難しい。
ただ、メインモニタを1280x800で（モニタの複製で）やるより開発は捗ると思います。

各タブの配置が完了したら`Save Layout...`しておきましょう。
demo用、Oculus開発用などと分けて置くと便利です。


以下、おまけ。


## あると便利なアプリ

#### Cinch

http://www.irradiatedsoftware.com/cinch/


- シェアウェア $7
- Demo（無料で使える）あり

Windowsの画面端の上下左右にウィンドウ当てると拡大するやつ
ただし、UnityのGameビューなどは機能しない。Unity本体のアプリには機能する



#### Display Menu

https://itunes.apple.com/jp/app/display-menu/id549083868

ディスプレイの設定をメニューバーからいじれる


#### Window Wrangler

http://mindflow.dk/software/windowwrangler/

- カンパウェア？ $5
- 無料で使えます

アプリウィンドウをキーボードで操作する
マウスポインタ見失った際にウィンドウ操作したい時に使える
ウィンドウ操作はウィンドウの拡大、縮小と上下左右の移動が可能


-----

以上。
何かありましたら、ご指摘ください。
Installing CMake on Linux


CMakeのインストールに必要だったもの．

* cmake-2.8.12.2
* cURL-7.36.0
* libarchive-3.1.2
* [expat-2.1.0](http://sourceforge.net/projects/expat/)

cmake以外のものをインストールして，cmakeのディレクトリで以下のようにコンパイルしようとすると．．．

```bash
$ ./configure --prefix=$HOME/local/bin
$ make VERBOSE=1
...
/usr/bin/gcc   -I/csc/home2/kobayashi/src/octave-installation/cmake-2.8.12.2/Utilities -I/csc/home2/kobayashi/local/include/ncurses -I/csc/home2/kobayashi/src/octave-installation/cmake-2.8.12.2/Source/CursesDialog/form    -o CMakeFiles/cmForm.dir/fld_arg.c.o   -c /csc/home2/kobayashi/src/octave-installation/cmake-2.8.12.2/Source/CursesDialog/form/fld_arg.c
/csc/home2/kobayashi/src/octave-installation/cmake-2.8.12.2/Source/CursesDialog/form/form.priv.h:34 から include されたファイル中,
                 /csc/home2/kobayashi/src/octave-installation/cmake-2.8.12.2/Source/CursesDialog/form/fld_arg.c:33 から:
/csc/home2/kobayashi/src/octave-installation/cmake-2.8.12.2/Source/CursesDialog/form/form.h:46:31: error: ncurses/ncurses.h: そのようなファイルやディレクトリはありません
```

というエラーで止まってしまった．

http://comments.gmane.org/gmane.comp.programming.tools.cmake.user/42902
を見ると，どうもCMakeCache.txtのCURSES_INCLUDE_PATHが，
$HOME/local/include/ncurses
となっており，
$HOME/local/include
となっていないことが問題だった．CMakeCache.txtを書き換えたらコンパイルが通った．
C#erのためのVBチートシート(俺々版)

例えば学校で習わされてる辛い人とか見ればいいと思う  
俺とか俺とか俺とか  
赤四角でエラー出てるけど気にしない  
なお、自分はVB嫌いなのでVB好きな人は見ないこと

- コメント

 ```vbnet
 'The cake is a lie...
 ```

- 変数宣言

 ```vbnet
 Dim 変数名 As 型名
 Dim 変数名A, 変数名B As 型名 '複数同時宣言
 Dim 変数名 As 型名 = 値 '宣言と初期化 複数同時宣言かつ初期化はできない?
 Dim 変数名 = 値 'var
 ```

- if文

 ```vbnet
 If 条件式 Then 真単一実行文 Else 偽単一実行文 '単一行 Elseを含んだ以降は省略可
 
 If 条件式 Then '複数行
     実行文
 ElseIf 条件式 Then
     実行文
 Else
     実行文
 End If
 ```

- while文

 ```vbnet
 Do While 条件式 'WhileじゃなくてUntilでもいい
     実行文
     Continue Do 'continue
     Exit Do 'break
 Loop
 ```

- do-while文

 ```vbnet
 Do
     実行文
 Loop While 条件式 'こっちもUntil使える
 ```

- for文
 
 ```vbnet
 For Dim カウンタ変数 = 0 To 4 '4になるまで
     実行文 '5回処理される
     Exit For 'break
     Continue For 'continue
 Next カウンタ変数 '最後の変数指定は省略可
 ```
Androidでラムダ式を使いたい


Java 8が正式リリースされ早2か月。
やっとJavaでラムダ式が正式に使えるようになって嬉しい限り。

とはいえ、AndroidはAPI 19でJava 7がやっとサポートされたばかり。
でも諦めるのは早い。[Retrolambda](https://github.com/orfjackal/retrolambda)がある！

Retrolabmdaとは

* ラムダ式をJava 7, 6, 5で使えるようにしたバックポートツール
* Java 8でコンパイルされたバイトコードをJava 7以下の環境で動作するように変換
* バックポートするのはラムダ式だけ。ほかのJava 8の機能はなし。
* [gradle-retrolambda](https://github.com/evant/gradle-retrolambda)というgradleのプラグインがある。

## Retrolambdaを使うための設定

### JDK 8をインストールする

[Oracleのサイト](http://www.oracle.com/technetwork/java/javase/downloads/index.html)からJDK 8をダウンロードする。

環境変数`JAVA8_HOME`を設定する。
Macの場合`/usr/libexec/java_home`でインストールされているJDKのパスがわかるので、これを使って環境変数を設定しておくといい。

```sh
JAVA8_HOME=`/usr/libexec/java_home -v "1.8" -F`
if [ $? -eq 0 ]; then
    export JAVA8_HOME
fi
```

のようにしておくといいかも。

### gradle-retrolambda

```groovy:build.gradle
buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'me.tatarka:gradle-retrolambda:+'
    }
}

repositories {
  mavenCentral()
}

apply plugin: 'android'
apply plugin: 'retrolambda'

retrolambda {

}

```

### IntelliJ/Android Studioの設定

```groovy:build.gradle
android {
    ....
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

```

のように設定すると、

[File]-[Project Structure]-[Project]で

* [Project SDK]が1.8に
* [Project language level]が`8.0 - Lambdas, type annotations etc.`

に変わる。

## ラムダ式の使いどころ

ラムダ式のありがたみについては、ここではあんまり書かないけど、
抽象メソッドが1つだけのインターフェースに使えるので以下のようなことができる。

### リスナー

```java
Button b = new Button(this);
b.setOnClickListener((View view) -> {
  // 処理
});
```
引数の型を省略できるので

```java
b.setOnClickListener((view) -> {
  // 処理
});
```

引数が一つだと括弧も省略できるので

```java
b.setOnClickListener(view -> {
  // 処理
});
```

と書ける。

### Runnable

```java
Handler handler = new Handler();
handler.post(() -> {
  // 処理
});
```
Jenkinsでwebhookに失敗する


# 現象
gitプラグインを使って、gitlabサーバからwebhookを受けてビルドするジョブを作っていたのですが、ある日突然pushしてもビルドしてくれなくなった。

ジョブ内のポーリングログを見るとこんな記述が

```
We need to schedule a new build to get a workspace, but deferring 1,149ms in the hope that one will become available soon (all_suitable_nodes_are_offline)
Done. Took 1 ms
No changes
```

# どうやら
https://issues.jenkins-ci.org/browse/JENKINS-22750

このリンクで議論されているように、バグみたいです。

とりあえずバージョンを1.559に下げ、自動更新を停止して様子を見ているところ。。。
セミホスティングを無効にする

mbedLPC1768を使ってTCPEchoをいじってたんだけど、MDK-ARM上では止まってしまってデバッグ出来ず。
あちこち調べて教えてもらって解決しました。
http://nora66.com/mbed/lan.html#2014/05/15
どうも色々と有り難うございます。

2018/02/07 追記
mbed-os-example-blinkyをULINK2で動かすと、semihost_disabledebugで止まってしまうので、追加のパッチにて解決しました（上記URLに追記）。
Linuxでexeをつくるのが簡単だった。

```bash:mingw32をインストール
$ sudo apt-get install -y mingw32
```

```bash:exe作成
$ i586-mingw32msvc-gcc a.c
```

これでa.exeが作成される。
ソースはsjisで書くこと。

外部exeの実行
-----------

今まで.batや.vbsで頑張ってきたけど、exe化するとwebで配布する際都合が良い。
.batや.vbsだとそのままテキストとして表示されたりしてた。

```bash:a.c
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    system("UserAccountControlSettings.exe");
    return 0;
}
```

* 次は[C言語はじめました1(添削希望) - Qiita](http://qiita.com/tukiyo3/items/5569398e59ea183c5cb9)

Win32 APIも使えます
------------------

* [よしいずの雑記帳　MinGWでWindowsプログラミングを行う方法](http://yoshiiz.blog129.fc2.com/blog-entry-208.html)
* [MinGWでWindowsソフト開発(ウィンドウ編)](http://doremi.s206.xrea.com/c/window.html)
* [猫でもわかるプログラミング](http://hp.vector.co.jp/authors/VA010523/)
* [Windowsプログラミング超入門](http://homepage1.nifty.com/nogue/wincho.htm)
Docker でSerf コンテナを起動させるまでメモ

「Docker でSerf が動いた、よかったね！」までをメモ。

# 大まかな手順
* Serf をインストールしたDocker イメージの作製
* ローカルにserf agent を待機させる
* コンテナをたくさん起動して、ローカルのserf メンバーに加わるのを眺める
* ユーザイベントを発行してみる
* あとしまつ

前提として、
* ローカルの環境はUbuntu。Docker, Serf インストール済み

```shell-session:ラクしたいひと向け準備
docker pull innocentzero/serf:0.6.0 # 以降 イメージ名はこれに置き換えて
```

## Serf をインストールしたDocker イメージを作製する

Dockerfile を書いたほうがいいけども、今回は手作業で。

### コンテナの起動
```shell-session
docker run -i -t ubuntu:trusty /bin/bash
```

### Serf のセットアップ
```shell-session
apt-get update && apt-get -y upgrade
apt-get install -y wget unzip
wget --quiet https://dl.bintray.com/mitchellh/serf/0.6.0_linux_amd64.zip
unzip -f 0.6.0_linux_amd64.zip
mv serf /usr/local/bin/
rm 0.6.0_linux_amd64.zip
exit
```

### コンテナのコミット(イメージの作製)

```shell-session
docker ps -a # で一番新しいコンテナがたぶんそれ。コンテナID をメモ。

# コンテナID は一意に決定できれば先頭数文字で充分
docker commit -m "Installed Serf" -a myusername 19a myusername/serf:0.6.0

docker images | head # でserf のイメージが登録されているのが確認できるはず。
```

## ローカルでSerf の起動

前準備が出来たので 新しいウィンドウで`serf agent`を叩いてエージェントを起動させる。
そのまえに、```ifconfig eth0``` なコマンドで、ローカル環境のIP アドレスを調べておくといい。

```shell-session
if config eth0 #=> 192.168.10.3
serf agent
==> Starting Serf agent...
==> Starting Serf agent RPC...
==> Serf agent running!
         Node name: 'ubuntu-local'
         Bind addr: '0.0.0.0:7946'
          RPC addr: '127.0.0.1:7373'
         Encrypted: false
          Snapshot: false
           Profile: lan
```

## Serf イメージをたくさん起動させる

先ほど調べておいたIP アドレスを、コンテナ起動コマンドと一緒に打ち込む。打ち込む。

```shell-session
docker run mysername/serf:0.6.0 serf agent -join 192.168.10.3
docker run mysername/serf:0.6.0 serf agent -join 192.168.10.3
docker run mysername/serf:0.6.0 serf agent -join 192.168.10.3
...
```

`docker run` するごとに、ローカルのSerf が新規メンバーの参加を検知してログに出力しているはず

```shell-session
==> Log data will now stream in as it occurs:

    2014/05/15 05:46:20 [INFO] agent: Serf agent starting
    2014/05/15 05:46:20 [INFO] serf: EventMemberJoin: ubuntu-local 192.168.10.3
    2014/05/15 05:46:21 [INFO] agent: Received event: member-join
    2014/05/15 05:46:45 [INFO] serf: EventMemberJoin: c6467948559c 172.17.0.2
    2014/05/15 05:46:46 [INFO] agent: Received event: member-join
    2014/05/15 05:47:29 [INFO] serf: EventMemberJoin: c39e76e589b3 172.17.0.4
    2014/05/15 05:47:30 [INFO] agent: Received event: member-join
```

### イベントの発行をしてみる
また新たにSerf イメージを、今度は対話モードで起動させて、`serf event` を叩いてみる

```shell-session
docker run -i -t myusername/serf:0.6.0 /bin/bash
```

```shell-session
serf agent -join 192.168.10.3 & # バックグランドで起動
serf event "hello serf"
exit
```

ローカルのserf agent に"user-event: hello serf" ログが記録されているのが確認できると思う。
(直接確認は出来ないが、バックグランドで起動させているSerf コンテナにもこのメッセージは届いている。)

## あとしまつ

バックグランドで起動しているDocker コンテナをすべて停止させて、コンテナもぜんぶ削除する。

```shell-session
docker stop $(docker ps -q) # 起動しているコンテナの停止
docker rm $(docker ps -a -q)# コンテナの削除
```

## Links

* [yungsang/coreos - Vagrant Cloud](https://vagrantcloud.com/yungsang/coreos)
* [serfとDockerでクラスタを組んでみる - $shibayu36->blog;](http://shibayu36.hatenablog.com/entry/2013/12/08/170547)

---
(Serf ってなんだろう...)
DevToolsのパネルが左側に表示できる！

__version: 35.0.1883.0 dev__ にて確認

まだExperimentsな機能だけど、DevToolsのパネルが左側に表示できるようになってた。

![スクリーンショット 2014-05-15 5.32.47.png](https://qiita-image-store.s3.amazonaws.com/0/17969/02f126df-51d7-ad5d-233a-e205438fbef3.png)

__Enable dock to left mode!!__

![スクリーンショット 2014-05-15 5.31.48.png](https://qiita-image-store.s3.amazonaws.com/0/17969/68b18a7f-75d0-d6b5-fec5-cd40b214cc68.png)

ディスプレイ2枚の環境で作業するときだいたい  __左：ブラウザ 右：エディタ__ なレイアウトなんですがDevTools使うときに

* エディタ <-> ブラウザ間 で視線を頻繁に動かしたいとき
* DevTools <-> エディタ間 で視線を動かしたいとき

でレイアウト変える必要があったのが非常に煩わしかった。
DevToolsのウィンドウを外に出して左右に並べるやり方だと、他のウィンドウの下に入ったときわざわざフォーカスあてなきゃならないのもめんどくさかった。

レイアウトの自由度があがって作業が捗りそうな予感がします。よい。
while文を使って「任意に繰り返しを止める」


実際に以下

## 2012年2月の日付を表示してみる。

① 2つの括弧()と{}をもつwhile文のテンプレートをよういする。

```PHP
<?php
while () {
}
?> 
```


② {}の中に日付($d)を改行しながら表示するコードを記述する

```PHP
<?php
while () {
	echo $d . "<br />";
}
?> 
```

③ checkdate関数を使って、while分の終了条件を()の中に記述。$dが１、２、３・・・の時は妥当な日付としてtrueが返されるので、()の中もtrueとなり、while文による日付表示が繰り返される。$dが30(2012年2月30日)になると、「checkdate(2,30,2012)」という日時チェックがfalseを返し、while文が終了する。

```PHP
<?php
$d = 1;

while (checkdate(2, $d, 2012)) {
	echo $d . "<br />";
	$d++;
}
?> 
```

以下実行結果↓
![php_008.png](https://qiita-image-store.s3.amazonaws.com/0/35975/0ed2e6df-6973-61a6-9657-7f43051ca796.png "php_008.png")
lgtm-for-firefox を作ってみました


githubのコメントに面白画像を貼って、
日々の開発を少しだけ楽しくする
http://www.lgtm.in/

というサービスがあるのを知り、しかも
https://github.com/monochromegane/LGTM

なるchrome extesionがあるのを知りました。
「UI変わってChromeみたいになったよね。」
と言われようがFirefox派の僕としてはfirefox addonも作らねばと思い、@kasaharu 君にアイコンを書いてもらって、
とりあえず仕事終わりからのプチハッカソンしてでできたところまでで
いったんv0.1としてアドオン登録しました。

[アドオンページ](https://addons.mozilla.org/ja/firefox/addon/lgtm-for-firefox/)
 [ソース](https://github.com/kumabook/lgtm-for-firefox)
![panel.png](https://qiita-image-store.s3.amazonaws.com/0/15815/493b3980-1c23-7802-dff3-ea8e8ba9ba5c.png "panel.png")

現状はアイコンをクリックするとランダムで３つ画像を拾ってきて、
画像をクリックすると、クリップボードにマークダウン用のテキストがコピーされます。
表示された３枚が気に入らない場合、一回閉じて開き直したらまた別の３枚を拾ってきます。
githubのpull requestのページが開いていれば、自動的にテキストが入力されます。
公式のブックマークレートと同じ挙動のはずです。


日々の開発を少し楽しくしたい人、firefox派の方はお試し下さい。
Go言語で一時的にカレントディレクトリを変更する。


```go
package main

import (
	"os"
	"path/filepath"
)

func main() {
	.
	.

	// 現在のディレクトリを保存してからcd
	prevDir, _ := filepath.Abs(".")
	os.Chdir(root)

	// ここでやりたい処理を書く		
	// ….

	// 元に戻す
	os.Chdir(prevDir)

    .
	.
}

// 関数スコープなら defer を使った方が綺麗に書ける
func cd(dir string) {
	// あらかじめ戻り先を絶対パスに展開しておく
	prev, err := filepath.Abs(".")
	if err != nil {
	  	return // ERROR
	}
	defer os.Chdir(prev)

	// ディレクトリ移動
	os.Chdir(dir)

	.
	.
	if xxxx {
		return // ここでも呼ばれるし
	}
	
	.
	.
	// ここでも呼ばれる
}
```
シンプルな SFINAE

あちこちに記事が書かれてたりしますが、あえて自分も書いてみます。

SFINAE とは Substitution Failure Is Not An Error の略で、
「テンプレートの置き換えに失敗してもエラーにならない」という、C++ の仕組みのことです。

どういうこっちゃ？って話ですが、
実際にコードと実行結果を見てもらったほうが早いでしょう。

```cpp:test.cpp
#include <iostream>

struct Custom
{
	struct Element {
		int value;
	};
};

template <typename T>
void Func(typename T::Element* = 0)
{
	using namespace std;
	cout << "custom" << endl;
}

template <typename>
void Func(...)
{
	using namespace std;
	cout << "default" << endl;
}

int main()
{
	Func<Custom>();
	Func<int>();

	return 0;
}
```

```:output
custom
default
```

Element を持つ Custom クラスをテンプレート引数にすると上の Func で、
Element を持たない int をテンプレート引数に指定すると下の Func で置き換えられます。

このように、型の特性などで処理を分けたい場合に使えます。

と言っても、現在「これだ！」と思いつくものはありませんが……。
(巷でよく聞く enable_if も有効活用できる気がしないです……。)


ちなみに、今回のサンプルプログラムは以下のサイトを参考にさせていただきました。

**SFINAE(substitution failure is not an error) - Faith and Brave - C++で遊ぼう**
http://faithandbrave.hateblo.jp/entry/20071108/1194519897
Julius/音声認識関連 超入門用自分用まとめ

Juliusという神ソフトウェアがこの世の中にあったことに驚いたので、これに関する神記事群をあつめてる途中マン。（音声認識…深い…（ｺﾞｸﾘ。））

#Julius
Julius
  http://julius.sourceforge.jp

連続音声認識ソフトウエア Julius Open-Source Speech Recognition Software Julius
      http://www.ar.media.kyoto-u.ac.jp/lab/bib/review/KAW-JSAI05.pdf

凹みTips
http://tips.hecomi.com/
http://tips.hecomi.com/archive/category/Julius


##チュートリアル
JuliusとJulian
http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/24.html

Juliusで連続音声認識
http://aidiary.hatenablog.com/entry/20130706/1373093810


音声認識実験マニュアル
http://www.ii.is.kit.ac.jp/araki/experiment/spjikken/spjikken.html

Juliusの使い方
http://www.f.waseda.jp/kikuchi/tips/julius.html

Qiita
Juliusタグ
http://qiita.com/tags/julius


##OSごと
###Raspberry Pi
Raspberry Piに大語彙連続音声認識エンジン Juliusをインストールして、日本語の音声認識
http://cubic9.com/Devel/%C5%C5%BB%D2%B9%A9%BA%EE/RaspberryPi/%C6%FC%CB%DC%B8%EC%B2%BB%C0%BC%C7%A7%BC%B1/

###Windows
音声認識エンジンのJulius を呼び出すアプリケーション（Windows版）
https://staff.aist.go.jp/y-furukawa/memo_mz_app_speech.html

###iPhone
iPhone Julius
http://www.moongift.jp/2011/01/20110129-2/

音声認識エンジン Julius を iPhone 上で利用するサンプルアプリケーション
https://github.com/FLCLjp/iPhone-julius

###Android
Julius for Android
http://tech-sketch.jp/2012/11/juliusandroid-1.html

###Mac
音声認識エンジンjuliusをLionで試してみた
http://about-digital.ldblog.jp/archives/458338.html

MacOSX 「音声認識エンジン」Julius インストール
        http://nero.blog.com/2012/11/02/macosx-「音声認識エンジン」julius-インストール/

Mac OS X Lionに大語彙連続音声認識エンジン "Julius" をインストールする
http://fimbul.hateblo.jp/entry/2012/06/04/041449

Snow Leopard で Julius 動かしてみた
http://milanista224.blogspot.jp/2012/08/snow-leopardo-julius.html

##ライブラリ
###Unity
Julius-Client-for-Unity
https://github.com/SavantCat/Julius-Client-for-Unity
###Node.js
スライド
http://www.slideshare.net/hecomi/node-2012
Julius を用いて簡単に音声認識を JavaScript で実現するための Node.js モジュール
https://www.npmjs.org/package/julius
###ruby
音声認識システム Julius を使って twitter に投稿する ruby スクリプト
http://kenkiti.hatenadiary.jp/entry/20091224/p1

###processing
Juliusで音声認識してprocessingで表示する
http://chokula.com/chokulog/processing-julius/

###RaSC
RaSCとJuliusを用いた音声認識サーバーの構築
http://blog.bonprosoft.com/814

##音声認識特集

インターフェース
2012年10月号　研究音声認識＆合成 PDF
http://www.kumikomi.net/interface/contents/201210.php

NTT技術ジャーナル　2004 Vol.16 No.1
http://www.ntt.co.jp/journal/0401/special.html

科学技術動向
２００２年　３月号
文部科学省　科学技術政策研究所　科学技術動向研究センター
http://www.nistep.go.jp/achiev/ftx/jpn/stfc/stt012j/feature3.html

音声認識技術の実用化への取り組み
http://www.lvcsr.com/static/pubs/ijsp_10_onishi.pdf


##学会
言語処理学会
http://www.anlp.jp


##参考
音声認識ソフト医療分野他
http://www.jeita-speech.org/report/content/NewApplications_v0.5.pdf

音声合成・認識・入力Tips
http://ikekou.jp/blog/archives/2298

知識の森
http://ieice-hbkb.org/portal/doc_514.html
2章 音声認識
執筆者:河原達也[2009 年 8 月 受領]
http://www.ieice-hbkb.org/files/02/02gun_07hen_02.pdf
C言語でCSVファイルをお手軽にパースしてみた (C++からも使えるはず)

CSVファイルはいろいろ亜種がありますが、こういうのを想定します。

* 文字コードはUTF-8
* 改行はLF
* カラムはダブルクォーテーションで囲んでも囲まなくてもよい
* ダブルクォーテーションで囲んである中に改行を入れることができる
* ダブルクォーテーションの中にダブルクォーテーションを入れるときは、ダブルクォーテーションを２回重ねることでエスケープする（"a""b"は「a"b」の意味になる）

このルールをFlexで実装しました。
ルール部分はたった８行なので、お手軽だと思うのですがいかがでしょうか。

```text:csv_parser.l
%option noyywrap nounput noinput nodefault
%x quoted

%{
#include <stdio.h>

int row = 0, col = 0;
%}

%%

\" BEGIN(quoted);
, col++;
\n col=0; row++;
[^,\n"]+ printf("[%d,%d] %s\n", row, col, yytext);

<quoted>{
    ([^"]|\"\")+ printf("[%d,%d] %s\n", row, col, yytext);
    \" BEGIN(INITIAL);
}

%%

int main()
{
    yylex();
    return 0;
}
```

入力としてこんなファイルを渡すと

```
aa,bb,
cc
"dd","ee","ff"
"gg
gg","hh""hh",,

i
```

こんな出力になります。

```
[0,0] aa
[0,1] bb
[1,0] cc
[2,0] dd
[2,1] ee
[2,2] ff
[3,0] gg
gg
[3,1] hh""hh
[5,0] i
```

よく見ると、""を"に置き換える処理が必要そうですが、大体あってそう？


作成にあたっては、こちらのリファレンスを参考にしました。

http://flex.sourceforge.net/manual/
mkfifoコマンドって使ってますか？

# Macを含むUNIXユーザーの皆さん

[mkfifoコマンド](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/mkfifo.html)って普段どのくらい使ってますか？

技術的にはとてもオモシロいんですけど、かく言う私も普段はベタなシェルスクリプトばかり書いているので使いどころがなかなか無いんですよねー。

# mkfifoコマンド入門

mkfifo。聞き慣れない方のために、軽く解説しておきます。

まずは同じホストでターミナルを2つ開いておいてください。そして片方のターミナル(#1)で次のように打ち込んでおきます。これで`hogepipe`という名のちょっと不思議なファイルが出来ます。

```shell-session:ターミナル#1
[richmikan@myhost ~]$ mkfifo hogepipe
```

そしたら、`ls -l`コマンドで内容を確認してみましょう。行頭を見ると、"-"(通常ファイル)でもない、"d"(ディレクトリー)でもない、珍しいフラグが立っていますよ。

```shell-session:ターミナル#1
[richmikan@myhost ~]$ ls -l hogepipe
prw-rw-r-- 1 richmikan staff 0 May 15 00:00 hogepipe
↑
"p"とは一体……
```

これは一体何物か？とりあえず中身を見てみましょうか。ということで、cat して中身を見てみましょう。

```shell-session:ターミナル#1
[richmikan@myhost ~]$ cat hogepipe

(あれ? 応答が返ってこない!)
```

そうなんです。まるで引数ナシでcatコマンドを実行したかのように(=どこにも繋がっていない標準入力を読もうとしているかのように)固まってしまいました。

でも[Ctrl]+[C]で止めるのはちょっと待ってください。ここで先程立ち上げておいたもう一つのターミナル(#2)から、今度は`hogepipe`に対して何かechoで書き込んであげてください。こんなふうに……

```shell-session:ターミナル#2
[richmikan@myhost ~]$ echo "Hello, mkfifo." > hogepipe
[richmikan@myhost ~]$ 
```

すると何も無かったかのように終わりましたが、ターミナル#1を見てみてください。

```shell-session:ターミナル#1
[richmikan@myhost ~]$ cat hogepipe
Hello, mkfifo.
[richmikan@myhost ~]$ 
```

いつの間にかcatが終了していて、先程ターミナル#2に打ち込んだ文字列が表示されています。

実はこれがmkfifoコマンドで作った不思議なファイル、「名前付きパイプ」の挙動です。

1. **名前付きパイプから読み出そうとすると、誰かがその名前付きパイプに書き込むまで待たされる。**

2. **名前付きパイプへ書き込もうとすると、誰かがその名前付きパイプから読み出すまで待たされる。**

という性質があるのです。今は1の例を行いましたが、ターミナル#2のechoをターミナル#1のcatより先に打ち込めば今度はechoがcatの読み出しを待ちますので試してみてください。

# 応用例

これがなかなか無いんですけど、例えばこういうのはどうでしょう。

* 外部Webサーバー上に、定点カメラ映像を **プログレッシブJPEG** 画像ファイル(最初はぼんやり表示されて読み進めるほどクッキリ表示されるアレ)として配信するサーバーがある。
* ただしそのWebサーバーは人気があって帯域制限が激しく、JPEG画像を最後まで **ダウンロードするのには相当時間がかかる。**
* 上記のファイルがダウンロードでき次第、3人のユーザーのpublic_htmlディレクトリーにコピーして共有したい。でもできれば **ボンヤリした画像の段階から見せられるように** したい。

まぁこんな要求があったとして、次のようなシェルスクリプトを書けば解決してあげられるかな、と思うわけです。

```sh:画像を読み込んでくるシェルスクリプト
#! /bin/sh

[ -p /tmp/hogepipe ] || mkfifo /tmp/hogepipe # 名前付きパイプを作る

# 30分ごとに最新画像をダウンロードする
while [ 1 ]; do
  curl 'http://somewhere/beautiful_sight.jpg' > /tmp/hogepipe
  sleep 1800
done
```

```sh:せっかちな3人に画像をシェアしてあげるシェルスクリプト
#! /bin/sh

# 名前付きパイプからデータが到来し次第、3人のディレクトリにコピー
while :; do
  cat /tmp/hogepipe                                      \
  | tee /home/user_a/public_html/img/beautiful_sight.jpg \
  | tee /home/user_b/public_html/img/beautiful_sight.jpg \
  > tee /home/user_c/public_html/img/beautiful_sight.jpg
done
```

先のシェルスクリプトは30分毎にループしますが、後のシェルスクリプトはsleepせずにループします。ただし、大半はcatコマンドのところで先のシェルスクリプトがデータを送り出してくるのを待っているというわけです。

**名前付きパイプを使わず、テンポラリーファイルで同じことをしようとするとちょっと大変** です。なにせ後のシェルスクリプトは、画像ファイルが最後までダウンロードし終わったことを何らかの手段で確認しなければならないのですから。いやぁmkfifoって、便利ですねー。

# 使用上の注意もいくつかある

気をつけなければならないこともあります。(2つ)

１つは、書き込む側のシェルスクリプトが

```sh:
echo 1 > /tmp/hogepipe
echo 2 >> /tmp/hogepipe
echo 3 >> /tmp/hogepipe
```

のように、1つのデータを間欠的に(=オープン・クローズを繰り返しながら)送ってくる場合には使えません。クローズされた段階で、読み取り側は読み取りを止めてしまうからです。

もう1つは、何らかのトラブルで読み書きを終える前にプロセスが終了してしまった時です。ファイルなら途中経過が残りますが、名前付きパイプだと全て失われてしまいます。

まぁそんなこんながあって、面白い仕組みなんですけどなかなか使い道が無いんですよね。
VMware PlayerでゲストOS間のLANセグメントを構成してpingを通すまでにやったことメモ(Windows Server 2012)

# 何やるか
Windows Server 2012の仮想PCを2台作成して、それぞれのNICを同一LANセグメント上に構成して、ping疎通する。
# 環境
## ホストOS
1. Windows 7 Professional SP1 64bit
2. VMware Player 6.0.2 build-1744117

## ゲストOS
1. Windows Server 2012 評価版

## 構成するネットワーク
### ゲストOS 1
|仮想ネットワークアダプタ|IP |
|:--------------------|:--|
|NAT|192.168.211.178/24|
|LANセグメント|169.254.38.158/16|
### ゲストOS 2
|仮想ネットワークアダプタ|IP |
|:--------------------|:--|
|NAT|192.168.211.128/24|
|LANセグメント|169.254.50.70/16|

## やったこと
### Windows ファイアウォールで pingの受信を許可する
1. セキュリティが強化された Windows ファイアウォールを開く
 PowerShellで `wf.msc` した。コントロールパネルからたどってもよい。
![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/18719/36b812d4-9558-4608-8c6a-ea617bc6807f.jpeg)
2. `受信の規則` から`ファイルとプリンターの共有(エコー要求 -ICMPv4 受信-)` を有効にする
 該当の項目を右クリックして `規則の有効化`を選択
![WS000010.JPG](https://qiita-image-store.s3.amazonaws.com/0/18719/03db9aa1-4059-3aab-f316-0b95a37e0b63.jpeg)

### LANセグメントで構成したアダプタの接続を「識別されていないネットワーク」から「プライベートネットワークに変更する」
1. `ローカル セキュリティ ポリシー` を開く
 コントロールパネル > システムとセキュリティ > 管理ツール の順に辿って ローカル セキュリティ ポリシー を実行
![WS000012.JPG](https://qiita-image-store.s3.amazonaws.com/0/18719/bec55351-1c32-a26a-8cd2-e5ced555bd78.jpeg)

2. 「識別されていないネットワーク」に割り当てるプロファイルを変更する
 ローカル セキュリティ ポリシー の 左ペインから ネットワーク リスト マネージャ ポリシー を選択し、
 右ペインから「識別されていないネットワークを」右クリック、「プロパティ」を選択
![WS000014.JPG](https://qiita-image-store.s3.amazonaws.com/0/18719/fa33c07f-11a2-c308-1fe9-819f5c5f53e7.jpeg)

 「場所の種類」を「プライベート」に変更
![WS000011.JPG](https://qiita-image-store.s3.amazonaws.com/0/18719/2e4f74f3-72b1-2ecd-66f6-90e831f1b9a2.jpeg)


## ping 

# 参照マニュアル類
- プロトコルのバインドの順序を変更する
  http://technet.microsoft.com/ja-jp/library/cc732472(v=ws.10).aspx
- 「識別されていないネットワーク」の種類を「パブリックネットワーク」から「プライベートネットワーク」に変更する
   http://www.atmarkit.co.jp/ait/articles/1012/24/news127.html
AVRをクリスタル(=水晶発振器)で動かす



fuseの計算
---------
http://qiita.com/takeru@github/items/b852bb3052053355f9fe

ArduinoISPのデフォルトで動いているmega88pを
20MHzのクリスタルで動作するようにfuseを書き換えます。

efuse=0x07,hfuse=0xDDはそのまま。

lfuse=0xE2を

bit7:CKDIV8 = 1 8分周しない
bit6:CKOUT = 1 クロック出力しない
bit5:SUT1 = 1 
bit4:SUT0 = 1 => 遅い起動(=安定)
bit3:CKSEL3 = 0
bit2:CKSEL2 = 1
bit1:CKSEL1 = 1 => 0.4-20MHz 全振幅発振器
bit0:CKSEL0 = 1 => 外部クリスタル

lfuse=0xF7 にする。


クリスタルを接続する
----------------
クリスタル20MHzと12-22pHのコンデンサを接続。
(とりあえず、コンデンサなしでも動いてはいる)


fuseを書く
---------

http://qiita.com/takeru@github/items/8f9f3b44daf30c6c34aa

avrdudeでやってもいいが、boards.txtに定義を追加すればArduinoIDEから書けるはず。


```
###########################################
avr88p20.name=ATmega88P / Ext.20MHz
avr88p20.upload.maximum_size=8192
avr88p20.bootloader.low_fuses=0xf7
avr88p20.bootloader.high_fuses=0xdd
avr88p20.bootloader.extended_fuses=0x07
avr88p20.bootloader.path=dummy
avr88p20.bootloader.file=dummy.hex
avr88p20.bootloader.unlock_bits=0x3F
avr88p20.bootloader.lock_bits=0x3F
avr88p20.build.mcu=atmega88p
avr88p20.build.f_cpu=20000000L
avr88p20.build.core=arduino:arduino
avr88p20.build.variant=standard
```

これを追加して、選択して、"ブートローダ書き込み"でfuseが書かれる。
その後、スケッチを再度送信する。

delay(1000)で1秒なことをかくにん。

クリスタルを抜いて、動作がとまればクロックの変更大成功。

シリアル通信が115200 baudでも文字化けしない。やったぜ。