OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScript で Chrome のウィンドウを閉じる方法

以前リリースしたとあるサービスで、「一部の入力フォームを別ウィンドウをポップアップして入力させ、終わったらリンクをクリックして閉じる」という JavaScript の処理を入れていたのですが、なぜか2015年頃から Chrome で画面が固まってしまう不具合が発生しました。2014年の春にテストした時は問題なく動いていたのですが。

どうやらブラウザーのバージョンアップに伴い、正しく子ウィンドウを閉じるための方法が変化してしまったようです。今ならどう実装するべきなのかを、少し検証してみました。


再現方法
--------
不具合は以下の流れで発生します。確認したブラウザは Chrome 39.0.2171.99m (Windows) です。

1. 親ウィンドウにある `<a onClick="window.open()">` リンクを叩き、子ウィンドウをポップアップさせる。
1. 子ウィンドウにある `<a onClick="window.open('about:blank','_self').close()">` リンクを叩く。
1. 親・子ウィンドウ両方が固まってしまう。

ウィンドウを閉じるために `window.close()` ではなく `window.open('about:blank','_self').close()` と書いているのは、IE/FF/Chrome いずれのブラウザーでも綺麗に閉じるための有名な Hack だったからです。詳細は [JavaScriptでWindow.closeする時のブラウザ別対応まとめ - TechNote](http://kojikoji75.hatenablog.com/entry/2013/12/15/223839) がわかりやすいです。


<!--more-->


検証
----
以下の2つの HTML を用意します。
 
```html:popup_parent.html
<html lang="en">
<head>
    <title>Parent</title>
</head>
<body>
    <!-- 子ウインドウをポップアップする -->
    <a href="#" onClick="window.open('popup_child.html', 'child', 'width=300,height=300');">Open popup window</a>
</body>
</html>
```

```html:popup_child.html
<html lang="en">
<head>
    <title>Child</title>
</head>
<body>
    <!-- 子ウインドウ（自分自身）を閉じる -->
    <a href="#" onClick="window.open('about:blank', '_self').close()">Close (ハック版)</a>
    <a href="#" onClick="window.close();">Close (単純版)</a>
</body>
</html>
```


検証手順は以下の通り。

1. popup_parent.html にアクセスし、`Open popup window` リンクを叩く。
1. 子ウィンドウが開くので、`Close (ハック版)` と `Close (単純版)` の2つのリンクをそれぞれ叩き、正しく閉じられるかどうかを記録する。

検証結果は次のようになりました。「o」は閉じられた場合、「x」は閉じられなかった場合です。

| ブラウザー           | ハック版       | 単純版         |
|----------------------|----------------|----------------|
| IE 10                |              o |              o |
| Chrome 39.0.2171.99m |              x |              o |
| FireFox 34.0.5       |              o |              o |
| Safari 5.1.7         |              o |              o |

Chrome だけハック版がうまく動かないという結果になりました。

悪さをしているのは WebKit なのかと思い、一応 Safari でも実験しましたが、問題はありませんでした。よって、今のところは Chrome だけ処理を分けるようにすれば良さそうです。ただし、Safari の WebKit は若干バージョンが古い (Safari = WebKit/534.57.2, Chrome = Webkit/537.36) ので、今後のバージョンアップでどうなるかは不明です。


解決策
------
検証結果から、全て単純版の書き方にすれば解決するように見えますが、一応古いブラウザーとの互換性を考えて、Chrome だけ単純版に分岐するような JS にしました。
 
```html
<a href="#" onClick="if (/Chrome/i.test(navigator.userAgent)) { window.close(); } else { window.open('about:blank', '_self').close(); }">閉じる</a>
```

これでどのブラウザーでも閉じられるようになりました。


参考
----
- [javascript - window.close and self.close do not close the window in Chrome - Stack Overflow](http://stackoverflow.com/questions/19761241/window-close-and-self-close-do-not-close-the-window-in-chrome)
- [javascript - How to detect chrome and safari browser (webkit) - Stack Overflow](http://stackoverflow.com/questions/12625876/how-to-detect-chrome-and-safari-browser-webkit)
- [JavaScriptでWindow.closeする時のブラウザ別対応まとめ - TechNote](http://kojikoji75.hatenablog.com/entry/2013/12/15/223839)
Windows で Jetty で GitBucket (任意ディレクトリ編)

Windows での GitBucket のインストールの仕方はいくつかページがあるが、C:\GitBucket にデータを保存する設定するばかりであった。
ので、任意ディレクトリに保存する方法を調べた。

てきとーにJettyの展開をして、C:\Jetty\base\webappsを掘ってそこにgitbucket.warを置く。
で、以下のバッチを作って管理者で実行する。肝は`++Environment`で環境変数を設定しているところ。

Jenkinsと同居も試したのだけど、LoginServiceの設定とか色々面倒なので書かないことにした。（Jenkinsは単体でも良いか、という判断）

```bat:install-jetty-service.bat
@echo off
set SERVICE_NAME=JettyService
set JETTY_HOME=C:\jetty
set JETTY_BASE=C:\jetty\base
set STOPKEY=secret
set STOPPORT=50001
 
set PR_INSTALL=C:\jetty\prunsrv.exe
 
@REM Service Log Configuration
set PR_LOGPREFIX=%SERVICE_NAME%
set PR_LOGPATH=C:\jetty\logs
set PR_STDOUTPUT=auto
set PR_STDERROR=auto
set PR_LOGLEVEL=Debug
 
@REM Path to Java Installation
set JAVA_HOME=C:\Program Files (x86)\Java\jre1.8.0_31
set PR_JVM=%JAVA_HOME%\jre\bin\server\jvm.dll
set PR_CLASSPATH=%JETTY_HOME%\start.jar;%JAVA_HOME%\lib\tools.jar

@REM JVM Configuration
set PR_JVMMS=128
set PR_JVMMX=512
set PR_JVMSS=4000
set PR_JVMOPTIONS=-Duser.dir="%JETTY_BASE%";-Djava.io.tmpdir="C:\jetty\temp";-Djetty.home="%JETTY_HOME%";-Djetty.base="%JETTY_BASE%";-Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle
@REM Startup Configuration
set JETTY_START_CLASS=org.eclipse.jetty.start.Main
 
set PR_STARTUP=auto
set PR_STARTMODE=java
set PR_STARTCLASS=%JETTY_START_CLASS%
set PR_STARTPARAMS=STOP.KEY="%STOPKEY%";STOP.PORT=%STOPPORT%
 
@REM Shutdown Configuration
set PR_STOPMODE=java
set PR_STOPCLASS=%JETTY_START_CLASS%
set PR_STOPPARAMS=--stop;STOP.KEY="%STOPKEY%";STOP.PORT=%STOPPORT%;STOP.WAIT=10

@REM Application Configuration
set GITBUCKET_HOME=C:\Gitbucket


%PR_INSTALL% //IS/%SERVICE_NAME% ^
  ++Environment=GITBUCKET_HOME=%GITBUCKET_HOME% ^
  --DisplayName="%SERVICE_NAME%" ^
  --Install="%PR_INSTALL%" ^
  --Startup="%PR_STARTUP%" ^
  --LogPath="%PR_LOGPATH%" ^
  --LogPrefix="%PR_LOGPREFIX%" ^
  --LogLevel="%PR_LOGLEVEL%" ^
  --StdOutput="%PR_STDOUTPUT%" ^
  --StdError="%PR_STDERROR%" ^
  --JavaHome="%JAVA_HOME%" ^
  --Jvm="%PR_JVM%" ^
  --JvmMs="%PR_JVMMS%" ^
  --JvmMx="%PR_JVMMX%" ^
  --JvmSs="%PR_JVMSS%" ^
  --JvmOptions="%PR_JVMOPTIONS%" ^
  --Classpath="%PR_CLASSPATH%" ^
  --StartMode="%PR_STARTMODE%" ^
  --StartClass="%JETTY_START_CLASS%" ^
  --StartParams="%PR_STARTPARAMS%" ^
  --StopMode="%PR_STOPMODE%" ^
  --StopClass="%PR_STOPCLASS%" ^
  --StopParams="%PR_STOPPARAMS%"
 
if not errorlevel 1 goto installed
echo Failed to install "%SERVICE_NAME%" service.  Refer to log in %PR_LOGPATH%
goto end
 
:installed
echo The Service "%SERVICE_NAME%" has been installed
 
:end
pause
```
boot2docker でエラー x509: certificate is valid for 127.0.0.1, not 192.168.59.103 の対処

※2015/07/15追記
v1.7.1で修正されたと、コメントで教えていただきました。
boot2docker upgradeをしましょう。

※2015/06/27追記
コメント欄の方法を試したところ、発生しなくなりました。
最初に書いた方法では、一度イメージなどが初期化されるため、不都合です。


dockerコマンドを入れても、以下のエラーで接続できなくなった。

```
$docker ps
FATA[0000] An error occurred trying to connect: Get https://192.168.59.103:2376/v1.18/containers/json: x509: certificate is valid for 127.0.0.1, 10.0.2.15, not 192.168.59.103
```

boot2dockerを再作成してあげて、解決。

```
$boot2docker delete
$boot2docker init
$boot2docker up
Waiting for VM and Docker daemon to start...
..........................ooooooooooooooooooooooooooo
Started.
Writing /Users/nanashi/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/nanashi/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/nanashi/.boot2docker/certs/boot2docker-vm/key.pem

To connect the Docker client to the Docker daemon, please set:
    export DOCKER_HOST=tcp://192.168.59.104:2376
    export DOCKER_CERT_PATH=/Users/nanashi/.boot2docker/certs/boot2docker-vm
    export DOCKER_TLS_VERIFY=1
$export DOCKER_HOST=tcp://192.168.59.104:2376
$docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
```

ただし、IPアドレスが変わるので、.bashrcに書いてあったら、それも書き換えなければならない。
[メモ]Node.jsのインストール手順



Nodeの環境を準備していきます。

- node.jsのバージョン管理ツールの「nodebrew」の導入
- Node/パッケージモジュール管理ツールのNPMをインストール


### 1.nodebrewのインストール

Homebrewを使ってインストールします

``` 
brew install nodebrew
```

nodebrewコマンドでインストールが正常になされている確認できます。

```
nodebrew
```


```
nodebrew 0.8.1

Usage:
    nodebrew help                         Show this message
    nodebrew install <version>            Download and install a <version> (compile from source)
    nodebrew install-binary <version>     Download and install a <version> (binary file)
    nodebrew uninstall <version>          Uninstall a version
    nodebrew use <version>                Use <version>
    nodebrew list                         List installed versions
    nodebrew ls                           Alias for `list`
    nodebrew ls-remote                    List remote versions
    nodebrew ls-all                       List remote and installed versions
    nodebrew alias <key> <version>        Set alias to version
    nodebrew unalias <key>                Remove alias
    nodebrew clean <version> | all        Remove source file
    nodebrew selfupdate                   Update nodebrew
    nodebrew migrate-package <version>    Install global NPM packages contained in <version> to current version
    nodebrew exec <version> -- <command>  Execute <command> specified <version>

Example:
    # install from binary
    nodebrew install-binary v0.10.22

    # use a specific version number
    nodebrew use v0.10.22

    # io.js
    nodebrew install-binary io@v1.0.0
    nodebrew use io@v1.0.0

```

次に、~/.bashrcに以下を追加します。


```.bashrc
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

追加が完了したら再読み込みして設定を反映します

``` 
source .bashrc
```

以上でnodebrewのインストールが完了しました。
続けてnodebrewでnode.jsのインストールを進めていきます。


### 2.node.jsのインストール

以下のコマンドでnode.jsの安定版をバイナリからインストール可能です。 installコマンドのほうだと時間がかかってしまうようです。

```
nodebrew install-binary stable
```

もし過去にnodebrewを使ってnode.jsをインストールしていた場合は、以下でインストール済みのバージョンを確認し、最新版を使うように設定することが可能です。


```
nodebrew ls
```

```
v0.11.16
v0.12.3
v0.12.4
```

最新版のv0.12.4を使いたいので以下となります。

```
nodebrew use v0.12.4
```

node.jsをインストールすると、パッケージ管理ツールのNPM(Node Package Manager)も同時にインストールされているはずです。

```
npm -l
```

とすると使用方法を確認できます

```


Usage: npm <command>

where <command> is one of:

    access      npm access public [<package>]
                npm access restricted [<package>]
--
```

ここまででnode.jsの準備が完了しました。
Pebble Time Watchface 事始め

#PebbleTime 購入
Kickstarter Backer版のカラー化したPebble「[PebbleTime](https://getpebble.com/pebble_time)」が届きました。
さっそく[日本語化して](http://netafull.net/pebble/050533.html)セットアップ。

#Watchfaceを作ってみよう
折角だからなにか作ってみようと、OSX上のhomebrewでSDKをセットアップ。
> brew install pebble/pebble-sdk/pebble-sdk

…した後「[CLOUDPEBBLE](https://cloudpebble.net/)」というサービスで、ブラウザ上での開発が用意されていることに気がつきました。
こちらを試してみます。
![スクリーンショット 2015-06-21 14.12.59.png](https://qiita-image-store.s3.amazonaws.com/0/4668/89b33b58-aedd-675e-75f3-19c031321eed.png)
試したのは、「[GETTING STARTED - WATCHFACE TUTORIAL](https://developer.getpebble.com/getting-started/watchface-tutorial/part1/)」というWatchface（オリジナル時計盤面）作成のチュートリアルです。
初代モノクロPebble向けですが、カラー版でも問題ありませんでした。
注意点は、モノクロ版とカラー版で色関係の定義が変わる所です。

CLOUDPEBBLEのプロジェクトの「SETTING」にある「BUILD BASALT」にチェックを入れて「BUILD APLITE」のチェックを外すとBASALT(カラー版)でビルドされるようになります。

![スクリーンショット 2015-06-21 14.24.55.png](https://qiita-image-store.s3.amazonaws.com/0/4668/3acec9d4-7ae5-0356-1f73-0f51810964f4.png)

こうしてからチュートリアルの時計の文字色の定義を、
> text_layer_set_text_color(s_time_layer, GColorRed);

とすると文字色を赤になりました。

さらに、リソースとしてカラー写真を背景に貼ってみます。
Pebble Timeのカラーは固定64色パレットとのこと。

[IMAGE RESOURCES - Color Palettes](http://developer.getpebble.com/guides/pebble-apps/resources/image-resources/) に、Photoshop、GIMP、ImageMagick向けのパレット定義ファイルが用意されているのでこれをダウンロードします。

![スクリーンショット 2015-06-21 14.18.40.png](https://qiita-image-store.s3.amazonaws.com/0/4668/28270553-717d-ad29-5ec8-9803bc60cd97.png)

適当な写真[^1]をPhotoshop上でPebbleTimeの画面サイズ「144x168」に縮小し、上記のパレットを適用して減色。pngファイルとして保存します。
これをCLOUDPEBBLEのRESOURCESに「ADD NEW」からアップロードしました。

![スクリーンショット 2015-06-21 14.17.54.png](https://qiita-image-store.s3.amazonaws.com/0/4668/08735321-c1a3-625a-9c54-c1d57e333931.png)

チュートリアルにあるモノクロビットマップの表示をこのカラー画像に差し替えてビルド。

![スクリーンショット 2015-06-21 15.12.12.png](https://qiita-image-store.s3.amazonaws.com/0/4668/461cf0bc-34f5-a800-fd89-9abfdab9228f.png)

さすがに固定64色だと減色したディザが気になります。
ブラウザ上のエミュレータで確認するだけではなく、PebbleTime本機を開発モードにするとこのCLOUDPEBBLEからアプリを転送することができます。
まずは、「CLOUDPEBBLE - COMPILATION」をEMULATORからPHONEへ変更。

![スクリーンショット 2015-06-21 15.11.02.png](https://qiita-image-store.s3.amazonaws.com/0/4668/9e06497f-7d41-c589-bfd7-e49ff8ef5f72.png)

iPhoneのPebbleTimeアプリを「SETTING」で開発者モードに、

![18821101420_8dba1c5803_z.jpg](https://qiita-image-store.s3.amazonaws.com/0/4668/9c9087d8-5b10-d6c8-eff3-9e585206b1b6.jpeg)

開発者モードメニュー「DEVELOPER」の「Enable Developer Connections」を有効にします。

![18821133778_cb22c29417_z.jpg](https://qiita-image-store.s3.amazonaws.com/0/4668/9b088120-a7cb-6594-e76c-4e480a7b805d.jpeg)

ちょっと淡い色合いですが、意外と64色へ減色したディザは気になりませんでした。

![19002616312_086d78e6f9_z.jpg](https://qiita-image-store.s3.amazonaws.com/0/4668/d8b3f8b8-8ec5-14cc-4637-42e99d611de2.jpeg)

なお天気と気温を表示しているWatchfaceが多いなと思ったら、このチュートリアルの最終章にはチュートリアルにPebbleKitJSというライブラリを利用した情報取得まで指南されていました。至れり尽くせりです。
「Pebble appstore」にあるようなオリジナルのWatchfaceは結構簡単に作ることができます。

#PebbleTimeのバッテリー
長らく空きスペースになっていた手首にPebbleTimeを装着してから丸一日、
iPhoneのバッテリーの消費が結構あがったような気もしますが、PebbleTime側のバッテリーは80%を示しています。
1週間とはいかずとも、充電無しで4〜5日は保ちそうです。

[^1]: 乗鞍高原、岐阜側のくだり。
HTMLの基本


HTMLの基本を説明していきます。構成、タグの種類など。HTML5を基本として明記します。

# HTMLの基本構成
```html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>

</body>
</html>
```

- DOCTYPEは宣言
- ```<html></html>```で囲む
- ```<head></head>```はページ上に表示させない情報
- ```<head></head>```には最低meta charset="UTF-8", titleを書く
- ```<body></body>```の中にページ上に表示させる情報を書く

# タグ

```html
<p>あいうえお</p>
```
- 情報、文字はタグで囲う

# タグの種類

## 必ず使うタグ
HTMLファイル作成時に必要になります。

### html
```html
<html></html>
```
- すべてを囲う

***

### head
```html
<head></head>
```
- 情報を入れる

***

### body
```html
<body></body>
```
- ページ上に表示させる部分

***

## よく使うタグ
ページを作っていく上で、使用頻度の高いタグです。

### h1
```html
<h1>見出し</h1>
```
- 見出しを囲う
- h1〜h6まである

***

### p
```html
<p>段落</p>
```
- 段落

***

### ul > li
```html
<ul>
	<li>リスト</li>
	<li>リスト</li>
	<li>リスト</li>
</ul>
```
- リスト

***

### dl > dt, dd
```html
<dl>
	<dt>定義されたもの</dt>
	<dd>定義されたものの詳細・内容</dd>
	<dd>定義されたものの詳細・内容</dd>
	<dd>定義されたものの詳細・内容</dd>
</dl>
```
- 定義リスト

***

### a
```html
<a href="http://codershigh.jp">codershighのサイトを見る</a>
```
- リンク
- 囲まれた要素をクリックするとhrefに挿入されているURLに移動する

***

### img
```html
<img src="/img/example.jpg" alt="海">
```
- 画像の挿入
- ```src="画像のパス"```
- ```alt="画像の代替テキスト"```

***

### header
```html
<header>
	<a href="/"><img src="logo.png" alt="ロゴ"></a>
</header>
```
- ヘッダー部分を囲う


***

### footer
```html
<footer>
	<ul>
		<li><a href="info.html">お知らせ</a></li>
		<li><a href="contact.html">お問い合わせ</a></li>
		<li><a href="about.html">このサイトについて</a></li>
	</ul>
</footer>
```
- フッター部分を囲う

***

### section
```html
<section>
	<h1>見出し</h1>
	<p>説明</p>
</section>
```
- 見出し > 説明などの構文を囲う
- hタグ（見出し）と内容（pタグに限らない）が必要

***

### main
```html
<main>
	<section>
		<h1>見出し</h1>
		<p>説明</p>
		<section>
			<h2>見出し</h2>
			<p>説明</p>
		</section>
	</section>
</main>
```
- メインコンテンツを囲う

***

### div
```html
<div>
	<p>説明</p>
	<p>説明</p>
	<p>説明</p>
</div>
```
- 見出し > 説明などの構文にならないとき、ブロックを作るために使う

***

### span
```html
<p>今回の金額は<span class="price">1,000円</span>になります。</p>
```
- その箇所のスタイルを設定したいときに使うことが多い

***

### table
```html
<table>
	<thead>
		<tr>
			<th>会場名</th>
			<th>金額</th>
			<th>人数</th>
			<th>合計</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>A会場</td>
			<td>1,000円</td>
			<td>20</td>
			<td>20,000円</td>
		<tr>
	</tbody>
</table>
```
- 表の作成などに使う
- ```th```が種類名、```td```が内容
- ```tr```で一行になる

***

## フォーム関連
フォームを使って情報を送るときなどに使用します。

### form
```html
<form action="xxx" method="post">

</form>
```
- 情報を送りたい部分全体を囲います。

*** 

### input
```html
<input type="text">
<input type="checkbox">
<input type="radio">
```
- ```type="text"``` = テキスト入力部分の作成
- ```type="checkbox"``` = チェックボックスの作成
- ```type="radio"``` = ラジオボタンの作成
- 最新ではこれら以外にも色々な種類が使えます。

***

### 他、formでよく使う要素
```html
<select>
	<option value="1">1人</option>
	<option value="2">2人</option>
	<option value="3">3人</option>
</select>
```
- プルダウンの作成
- select > optionで構成する

```html
<textarea></textarea>
```
- テキストエリアの作成

*** 

## その他

### small
```html
<small>Copyright (C) 2015 ○○○○ All Rights Reserved. </small>
```
- コピーライトなどを囲う

***
Windows で Redmine と Subversion の認証連携をする　ついでにLDAP設定も少し

# 前提

セキュリティ的にあんまりうるさくないところ（イントラの中とか）

* Bitnami Redmine などで Redmine がセットアップされている
* ApacheはBitnami付属ではなく、2.2を入れ直すのでBitnamiのredmineApacheサービスを停止しておく

# 入れるもの

* Apache 2.2 http://www.apachelounge.com/download/additional/ ここの32bit版が色々ついてて良い・・・か？
* [Strawberry Perl](http://strawberryperl.com/) 5.16.3.1 32bitにしておくこと。5.18でもうまくいくかもしれないけど試してない。5.20はなんか駄目だった
* http://redmine.rubyforge.org/svn/trunk/extra/svn/ から Redmine.pm と reposman.rb

# Apache 2.2の準備
てきとーにBitnamiのapache2ディレクトリを別名にリネームし、先に落としてきたApache2.2をapache2ディレクトリに置き換える。
httpd.confとかを2.2のディレクトリにコピーして、動かないモジュールを外していく
ついでにmod_svnを入れておく。
`LoadModule php5_module "C:/Bitnami/REDMIN~1.0-0/php/php5apache2_4.dll"`は動かないので、`LoadModule php5_module "C:/Bitnami/REDMIN~1.0-0/php/php5apache2_2.dll"`に書き換えておく。
`Require all denied`や`Require all granted`はApache-2.4の設定方法なので、`Order allow,deny` `allow from all`に書き直していく

Apache-2.2の設定ファイルを元にBitnamiのRedmineやらを登録していく方が楽かもしれない。

# Strawberry Perl の準備(mod_perl)

http://people.apache.org/~stevehay/ から mod_perl-2.0.8-strawberryperl-5.16.3.1-32bit.zip を落としてくる
C:\Strawberryと＜Redmine Apacheの場所＞にStrawberry, Apache2の中身を置く

# httpd の確認

管理者権限でcmd.exeを立ち上げて、Redmine Apache の場所に移動、bin\httpd.exe で実行してエラーが出ないことを確認する

# Redmine.pm の準備

C:\Strawberry\perl\site\lib\ApacheにRedmine.pm を置いておく

httpd.conf に以下の設定を追加する
```
LoadFile "D:/Perl/bin/perl510.dll" 
LoadModule perl_module modules/mod_perl.so

PerlLoadModule Apache::Redmine
<Location /svn>
    DAV svn

    SVNParentPath "C:\Svn" 
#    SVNListParentPath On

    AuthType Basic
    AuthName "Subversion repository" 
    Require valid-user

    PerlAccessHandler Apache::Authn::Redmine::access_handler
    PerlAuthenHandler Apache::Authn::Redmine::authen_handler

    RedmineDSN "DBI:mysql:database=xxxxxx;host=localhost" 
    RedmineDbUser "xxxxxx" 
    RedmineDbPass "xxxxxx"
    AuthUserFile htpasswd
</Location>
```

xxxxxの部分はredmineのdatabase.ymlから適当にコピー
htpasswdは無いとなぜか動かないのでダミーで置いておく

なんか、SVNの読み込みは誰でもできるようになってる気がするので、後で会社の設定を確認してこよう・・・

# Redmine の設定

管理→リポジトリの
「リポジトリ管理用のWebサービスを有効にする」をチェックし、APIキーをキーの生成で生成する

# reposman.rb の設定

まず、reposman.rb実行用のバッチファイルを作成する

```bat:reposman.bat
@echo off

set REDMINE_HOST=http://localhost/redmine
set SVN_DIR=C:\Svn
set SVN_URL=http://localhost/svn
set KEY=＜上で生成したキー＞

set OLD_CD=%CD%
cd /D %~dp0


rem 環境変数のセット
call C:\Bitnami\redmine-2.5.0-0\scripts\setenv.bat

ruby reposman.rb --svn-dir %SVN_DIR% --redmine-host %REDMINE_HOST% --key %KEY% --url %SVN_URL% --test

cd %OLD_CD%
```

まずは--testでテスト実行してみる。成功したら--testを外す
このバッチをタスクスケジューラで数分置きに実行するようにしておく
これでRedmineのプロジェクトと一対一でSVNリポジトリができるようになる


# LDAP認証に対応してみる・・・？

cpanからAuthen::Simple::LDAPをインストールしたいが、まずは ppm から Digest-MD5 をインストールする
その後おもむろにcpan install Authen::Simple::LDAPする

これで、RedmineでLDAP認証が設定されていれば、それを使ってSVNも認証してくれる。
RailsでRedis 〜0章〜

## はじめに
初投稿しないと画像アップロード上限が100MBにならないっぽいのであまり中身のない記事
Railsでと書いたが今回はまだRails関係ないRubyで閉じてるおはなし。

# 使うgem

## gem 'redis'
Redis本来のまま扱っていきたいんだ！という場合にはコレのみ。

expireとか全部自分で都度設定していく必要がある。
ちゃんと文字列型を扱うときにはget, setを使わないといけない。
リスト型のときにはlpushとかlpopを使わないといけない。

Redisがどんな操作を可能としているかを必然的に知ることになるので、
一回くらいはこのままで簡単な仕組みくらいは作ってもいいかもしれない。

## gem 'redis-objects'
いわゆるgem 'redis'のラッパー。もちろん内部的にはredis gemを使っている。
rubyでRedis使うならこちらを使ってredisデータをいじっていく方が使用コストが圧倒的に低い。

例えば、

- redisデータに値を代入するときにはexpireをかけてくれるようになっていたり
- rubyデータの扱いがruby記法に合わせてあったり
c++ builder > TDateTime > SecondOfTheDay(TDateTime dt) > 1日の累積秒数を返す

DateUtils.hppにある関数。

1日の累積秒数を返す。

ある１日の範囲において、同じ時分秒となるかのチェックに使えそう。
異なる日の場合、時分秒が同じだと同じ結果になる点には注意。

他に
- SecondOfTheHour
- SecondOfTheMonth
- SecondOfTheMinute
などがある。

SecondOfTheMinuteはSecondOfと同じ値を返す。
Windows+VagrantでRails・ファイル共有が激遅

Windows + Vagrantで快適なRails開発がスタート！。。するはずだった。
現実は、Railsアプリの応答が遅すぎてページを開くだけで数十秒かかる始末。
どうやらvagrantが使用しているファイル同期が遅いのが原因らしい。

# ■挫折　プロトコル変更
だったらファイル同期のプロトコルを変更しよう！
nfsは、Windowsではできない。
rsyncも基本できないけど、導入の解説してくれてる人いるじゃん！！
え、rsyncって双方向同期してくれないの。。
ゲストOSでファイル追加、編集できないのは困る。。

# ■解決策 ネットワーク経由でゲストOSのファイルを直接編集
ゲストOSにフォルダ(/home/vagrant)を公開してもらいます。
ファイルサーバ機能はSambaを利用。
Sambaのインストールは、ほぼ下記のサイトを参考にしています。
[どうにかブログやってるよ: windowsとvagrant間のファイル共有はsambaを使う](http://taropohci.blogspot.jp/2014/03/windowsvagrantsamba.html)

# ■設定手順

●ゲストOSにログイン
コンソールでログイン。

●Samba インストール
`yum install samba`

●Sambaユーザーの登録
`pdbedit -a vagrant`

●設定ファイルのオリジナルをバックアップした上で空ファイルに
`cp -p /etc/samba/smb.conf /etc/samba/smb.conf_org && cp /dev/null /etc/samba/smb.conf`

●設定ファイルを編集する
`vi /etc/samba/smb.conf`

```lang:/etc/samba/smb.conf


#======================= Global Settings ==================
[global]
    # 文字コード設定 CentOS
    unix charset = UTF-8
    
    # 文字コード設定 Win
    dos charset = CP932
    display charset = UTF-8

# ----------------------- Network Related Options ----------
    # Widnows グループの設定 コンピュータのプロパティから調べる
    workgroup = WORKGROUP
    
    # Allow within local network
    # Vagrantfile に設定してあるゲストOSのIP(デフォだと192.168.33.10)
    hosts allow = 192.168.33. 127.

#============================ Share Definitions ==============
[homes]
    comment = Home Directories
    # ホームディレクトリをSAMBAで共有する
    path = %H
    browseable = no
    writable = yes
```
>ちなみにこのsmb.confはfuturismoさんが作成した設定ファイルがベースらしいです。

●Samba/NMBの起動
`/etc/init.d/smb start`
`/etc/init.d/nmb start`

●vagrant起動時にsambaを起動する設定
`chkconfig smb on
chkconfig nmb on`

●ホストOS（Windows）からアクセスするためにiptableを変更
`vi /etc/sysconfig/iptables`
以下の内容を"追記"

```lang:/etc/sysconfig/iptables
# samba
-A INPUT -p tcp --dport 139 -j ACCEPT
-A INPUT -p udp --dport 137 -j ACCEPT
-A INPUT -p udp --dport 138 -j ACCEPT
-A INPUT -p tcp --dport 445 -j ACCEPT
# samba end
```
●iptablesを再起動
`/etc/init.d/iptables restart`

●SELinuxがオフか確認
` getenforce`
上記を実行して【disabled】と出てればOK
でなければ、SELinuxをdisabledにしてください。

●ゲストOSから公開したいRailsプロジェクトのフォルダを移動する
/home/vagrantに編集したいRailsプロジェクト（例　rails_project）のフォルダを移動する。

`mv /vagrant/[rails_project] /home/vagrant/[rails_project]`

●動作確認１　ファイルが編集可能か
ホストOS側からエクスプローラの下記を入力する。
\\\192.168.33.10\vagrant
rails_projectが見れたら、ネットワーク越しに編集可能になってます。

●動作確認２　Railsが爆速か
ゲストOSからRailsプロジェクト（[rails_project]）を起動。
ホストOSのブラウザから動作確認。
きっと爆速になってます。
（なってなかったら/home/vagrant/がファイル"同期"対象になってるかも。対象から外してください。）

Windows + Vagrantで快適なRails開発を！
Railsのbetter_errorsがVM経由だと動かない場合

そもそもgitに書いてあった
https://github.com/charliesome/better_errors#security

が、制限を外すIPを探そうとifconfigや、ipconfigとかしてたが
結局以下で簡単にできた。

railsのビューのどこかに

```rb
<%= request.remote_ip %>
```
と書いて、作ったアプリにアクセス。出てきたIPをapp/config/environments/development.rbに追加

```rb
BetterErrors::Middleware.allow_ip! "上で出たIP"
```
lambdaで使う時にそのまま使いたい時memo

pythonは扉を態々閉扉する必要がないので書きやすい

##lambdaで使う時にそのまま使いたい時
### 普通に書く
```.py
>>> text = "Which is Kinoko SaMpLE ?"
>>> text.lower().replace("sample", "takenoko")
'which-kinoko-takenoko-?'
```

### lambdaを使い書く
```.py
>>> text = "Which is Kinoko SaMpLE ?"
>>> (lambda x: x.lower().replace("sample", "takenoko"))(text)
'which-kinoko-takenoko-?'
```

実際にそのまま使いたい場面があるのかはわからない

3項演算子のif〜elseはpython上使えるようになったが、その場合処理を入れ込めない
`[x if x < 100  else 'kinoko' for x in A]`
値を持ってくることはできる
Sublime Textの自動保存で、Cmd+Sから解放される方法

# まだ、COMMAND+Sとか押してんの？

もうね、時代は（っていつの時代？）、自動保存ですよ。。。
IntelliJ Ideaとかになれた体には、Command+Sとか面倒くさすぎ。

## というわけで、Auto-Saveプラグインの紹介

リアルタイムで保存してくれるプラグインです。

## インストール
Sublime Package Control から、「install」でプラグインリストを表示して、
「auto-save」を探してインストールして下さい。

## インストール後は、キーバインドを有効にします。

「Preferences」->「Key Bindings - User」で次を追加
`{ "keys": ["ctrl+shift+s"], "command": "auto_save" }`

## 自動保存の有効無効の切り替え

「Ctrl + Shift + S」で有効・無効が切り替わります。
下部のメッセージ欄に状態が表示されます。

素敵なテキストエディタライフを！
Swift+StoryBoardでiOS用の50行未満で出来るとてもシンプルな電卓

![iOS Simulator Screen Shot 2015.06.21 10.32.39.png](https://qiita-image-store.s3.amazonaws.com/0/62043/1161450e-c06f-7ec9-d63e-ff74755f3cd0.png)

# 機能は本当にシンプルな計算のみです。

四則演算ができます。

以下Githubにてソースコードを公開しています。
https://github.com/hisohiso3b/SuperSimpleCalculator

とてもシンプルですが大雑把にSwiftアプリケーションについての感覚が掴めると思います。

##制作環境
Xcode 6.3.2
Swift 1.2

##制作手順

1.ボタン15個、ラベル3つを上記SSのように配置し、
　オートレイアウトをReset suggested constraintsに設定します。

2.ラベルをアウトレット接続。

3.ボタンをアクション接続。
　具体的に、
　数字は全てnum_button_pushedへ
　"="以外の記号は全てcalc_sign_pushedへ
　"="はequal_pushedへ

4.数字ボタンが押された時、真ん中のラベルに数字ボタンに書かれた数字を追記。

5.四則演算ボタンが押された時、真ん中のラベルの文字列を左上に移動し、
　ボタンのラベルの四則演算記号を右上のラベルに代入。

6.イコールが押された時、右上のラベルの記号から判断し、
　真ん中のラベルと左上のラベルを記号のとおりに演算実行。

7.答えを真ん中のラベルに代入。


```swift:ViewController.swift

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var text_label: UILabel!
    @IBOutlet weak var prev_num_label: UILabel!
    @IBOutlet weak var calc_label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        text_label.text = ""
        prev_num_label.text = ""
        calc_label.text = ""
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    @IBAction func num_button_pushed(sender: UIButton) {
        text_label.text! += sender.titleLabel!.text!
    }
    
    @IBAction func calc_sign_pushed(sender: UIButton) {
        calc_label.text = sender.titleLabel!.text!
        prev_num_label.text = text_label.text
        text_label.text = ""
    }
    
    @IBAction func equal_pushed(sender: AnyObject) {
        if prev_num_label.text!.toInt() != nil && text_label.text!.toInt() != nil {
            if calc_label.text == "+" {
                text_label.text = String(prev_num_label.text!.toInt()! + text_label.text!.toInt()!)
            }else if calc_label.text == "-" {
                text_label.text = String(prev_num_label.text!.toInt()! - text_label.text!.toInt()!)
            }else if calc_label.text == "*" {
                text_label.text = String(prev_num_label.text!.toInt()! * text_label.text!.toInt()!)
            }else if calc_label.text == "/" {
                text_label.text = String(prev_num_label.text!.toInt()! / text_label.text!.toInt()!)
            }
        }
    }
}

```
ドコモの雑談対話APIとお話してみた。

前回はドコモのOAuthSDKforiOSをSwiftで書き直しました。
今回は、同じくドコモから提供されている雑談対話APIを試してみました。
[雑談対話API](https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=dialogue&p_name=api_usage_scenario)
>雑談対話APIは、ユーザの発話テキストを受け付け、その入力に対して自然な会話となる雑談を提供します。

このAPIにもiOS用SDKが用意されているのでそれを使っています。
また、AVSpeechSynthesizerを使ってAPIからの返答を読み上げるようにしました。

```swift:ViewController.swift
    //質問文問い合わせリクエスト
    var param: DialogueRequestParam!
    //雑談対話問い合わせ処理
    var dialogue: Dialogue!
    //回答データ
    var resultData: DialogueResultData!
    //エラー情報
    var sdkError: SdkError!
    var talker: AVSpeechSynthesizer!
```

初期化

```swift:ViewController.swift
        //認証情報初期化
        //docomo Developer supportから取得したAPIキーを設定
        AuthApiKey.initializeAuth("APIキー")

        param = DialogueRequestParam()
        dialogue = Dialogue()
        sdkError = SdkError()
        talker = AVSpeechSynthesizer()
```

会話リクエスト


```swift:ViewController.swift
        //発話を設定
        param.utt = "こんにちわ"
        //APIのキャラクタ設定(デフォルト:ゼロ,20:桜子,30:ハヤテ)
        param.character = 20

        /*
          雑談対話問い合わせ処理にデータを渡す.
          APIからは音声合成用情報が「resultData.yomi」に返ってくるので
          AVSpeechSynthesizerで読み上げる.
          コンテキストID(resultData.context)を使うことで継続した会話ができる.
        */
        dialogue.request(param, onComplete: { (resultData) -> Void in
            self.param.context = "\(resultData.context)"
            let utterance = AVSpeechUtterance(string: "\(resultData.yomi)")
            utterance.voice = AVSpeechSynthesisVoice(language: "jp-JP")
            utterance.rate = 0.2
            utterance.pitchMultiplier = 1.4
            self.talker.speakUtterance(utterance)
        }) { (sdkError) -> Void in
            println("\(sdkError)")
        }
```

動作テストの動画をアップしました。
YouTube
[docomoの雑談対話APIとお話してみた。 ](https://www.youtube.com/watch?v=6WaW8bEM_aM)
ニコ動
[ネットの中に住む「女子高生 桜子 16歳」（公式設定）とお話してみた。](http://www.nicovideo.jp/watch/sm26532303)

個人的に、AVSpeechSynthesizerの読み上げは味気ない感じがしました。
ドコモからは音声合成APIも提供されているのでそっちに置き換えてみようと思っています。
RancherOS のWebUIから ホストを追加、コンテナ起動

## 参考

* [Rancher Labs | Launch Your Private Container Service](http://rancher.com/)
* [Rancher Documentation](http://docs.rancher.com/rancher/quick-start-guide/)

## rancher/server起動

```rb:起動
srv:
  image: rancher/server
  restart: always
  ports:
    - "8080:8080"
```

```bash:
docker-compose up -d
```

* 2分ほど待った後、 http://server-ip:8080/ にアクセス。

もしくは

```bash:
docker run -d --restart=always -p 8080:8080 rancher/server
```


## ホストの追加

* rancher/server を稼働しているサーバー(この例では192.168.100.70)自身をホストの追加することができない(？)ので注意！
* ホストのIPアドレスを`ADMIN > SETTINGS > `から設定しSave

![1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2609d740-7e2b-df9d-879d-4840da49a690.png)


* dockerをインストールしている他のホストを追加。
* 追加対象のホストのIPアドレスを`INFRASTRUCTURE > HOSTS > Add`

![2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/abdeb9a6-f7d0-839b-09c1-2fc47d606299.png)

* `Copy, paste, and run the command below to register the host with Rancher: `内を追加対象のホスト(この例では192.168.100.61)で実行

![bb.png](https://qiita-image-store.s3.amazonaws.com/0/25728/f2eed1a3-ecf1-b65f-cabb-25b834f43ef9.png)

* 今回は5秒ほど待つとホストが追加された。

## コンテナの追加

* CATALOGから動かしたいアプリケーションを選択し`Launch`
    * portマッピングを自動でしてくれるため便利かも

![3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/6f605de1-a9e3-fd1f-92cf-fea8b87484d4.png)

![スクリーンショット_2016-03-30_16-06-14.png](https://qiita-image-store.s3.amazonaws.com/0/25728/bc2eefc4-e40a-cd17-d61b-16d6268ecd2c.png)

* http://192.168.100.61:10080 にアクセスしコンテナが起動していることを確認

![4.png](https://qiita-image-store.s3.amazonaws.com/0/25728/eab5633a-4234-a73a-534c-eaa4f5bf84e3.png)
git > tag > 使える文字列


#コロンはダメ

gitのタグにて以下のようにしたらタグ名が不正のエラーになった。

    Test:v0.1

タグに使える文字列は以下にルールが記載されている。
https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html

上記タグで引っかかったのは以下の部分
> 4. They cannot have <font color=red>ASCII control characters (i.e. bytes whose values are lower than \040, or \177 DEL), space, tilde ~, caret ^, or colon : </font>anywhere.

いくつかgithubのプロジェクトを見てきた中で以下のようにTestというパッケージに対するコミットメッセージでは「:」を使うものがある。
 
   Test:add XXX

これにならってgitのコミットメッセージを「パッケージ名:メッセージ」としてきたが、これがtagになると「:」は受け付けないので、書き方の統一感が保てない。


#スラッシュは可能

    A/B/C
のようなタグはいいようだ。

    A / B
というタグにSourceTreeですると

    A_/_B
というタグになっていた。
技術英語 > [substitutes for] named constants

引用: Code Complete (No. 11353) > Reasons to Use Global Data

> You can use global variables as substitutes for named constants when your language doesn't support them.

substituteで思い出したのがreplacement。２つの比較についての議論は以下にある。
http://english.stackexchange.com/questions/216188/replace-vs-substitute
guard malloc, malloc_historyを使って、addressで何が起こったのかを調べる

Xcode を ベースに表題について語ります。

* memory系のcrashは原因がよくわからないことがよくある
* guard malloc = on にすることで、どの番地で問題が起きたのかトラップできるようにする
* MallocStackLogging = on にすると、 memory allocationのhisotryをlogするようになる
* それができたら、addressと process 番号を引数に malloc_history を叩く
* その番地のhistoryがでるので、気になる履歴を探る

以上を行うために

* xcode edit scheme.. -> diagnostics -> Guard Malloc, Malloc Stack に check
* 開発物をdebug 起動 -> crash を起こす
* debug window から 問題があるaddressと process number を得る
* Terminal を開く
* $malloc_history process address

以上
Apache起動時に他のプロセスのポートと被ってエラーが出た場合

apacheを起動しようとして

```
service httpd start
```
すると以下のようなエラーが

```
 httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
(98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
```

他のプロセスがそのポート(上記の場合80)を使ってるので、
そのプロセスをkillしてやる。
以下のコマンドで被っているプロセスを特定

```
netstat -lnp | grep :80  
```
結果

```
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      1531/nginx
```
最後にあるのがプロセス番号なので

```
kill -9 1531
```

これで大丈夫なはずだが、もう一度netstatで確認しておく。
そして

```
service httpd start
```
で無時起動
Androidのデータベースの種類

Androidでデータを保存したい場合があると思います。
その種類について説明させていただきます。
<hr>

###*主に３つあります*
##プリファレンス

SharedPreferenses preference にて宣言
##ファイル
FileOutoutSteream streamにて宣言
##データベース(SQlite)
Sql文を書いてデータを保存する
応用しようとするとなるとSQliteが一番難しい
UnityでParseを使ってみる


職場でサーバサイドの面倒を見ていて、散々な目にあった為、プライベートのアプリでは絶対にサーバ周りはいじらない！！って決めていて、サーバ周りの情報を集めていなかったのですが、、

標題の通り、ParseってBasS(mBaaS)に出会って、非常に感動し、勢いでがちゃがちゃいじったのでその備忘録です。

**一番最後に宣伝をしてます**、内容自体は、「Codeから取得する。」で完結しておりますので、不愉快な方がいらっしゃいましたら、最後は読み飛ばしてくださいｍｍ

# ここでやること

* Parseにユーザ登録をする
* お知らせの情報をParseに登録する
* Unity上でParseの設定を行う
* Unity上からParseで登録したお知らせ情報を取得する。

# Parseへ登録する

とりあえず

https://www.parse.com/

上記サイトから登録を行います。

# Parseにお知らせ情報を登録する。

**OtherApplications**というクラスを登録します。

![03.png](https://qiita-image-store.s3.amazonaws.com/0/64588/68c26138-28ee-5912-3463-5d62436504ad.png "03.png")

③のAdd Class時に追加したいクラス(イメージは新規テーブル)を登録。
(画面は、既にクラスを登録したものです。)

④で新規Colum追加を行います。
⑤のようなダイアログが出るので、追加したいColumを登録します。

ここでは、以下を登録しました。

* applciationName
	* アプリケーション名
* applicationDescription
	* アプリの説明
* appStoreURL
	* AppStoreのURL


# ParseのUnity SDKを取得する

次にUnityへの設定を行います。

https://www.parse.com/docs/downloads

上記から、Unity用のSDKを取得します。

または、Asset storeにもあるので、そちらか入手してもOKです。
(Unity4.6.3等、１つ前のバージョンの場合は、Asset Storeで入手した方が良いです。)

# Unity上でBehavior登録

適当に空のオブジェクトを配置して、Add ComponentでParseを登録します。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/64588/89abd674-7491-070f-fc04-0b68ebe9544f.png "01.png")

ここに、Application IDと.Net Key(Dotnet Key)を登録します。
Application IDと、.Net Keyは、ParseのWebコンソール上から取得します。
(↓を参照)

![02.png](https://qiita-image-store.s3.amazonaws.com/0/64588/ff411071-d3eb-9c77-bc3c-4b56a3216807.png "02.png")

# Codeから取得する。

なんでも良いManagerクラスを登録追加して、以下のコードを埋め込みます。
単純にデータをParseから取得して、Logに出力するコードです。

```
public void Load(){
		ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("OtherApplications");
		query.FindAsync().ContinueWith(task =>
			{
					IEnumerable<ParseObject> results = task.Result;

					foreach(ParseObject parseObject in results) {
						string applicationTitle = parseObject.Get<string>("applicationTitle");
						string applicationDescription = parseObject.Get<string>("applicationDescription");
						string applicationAppStoreURL = parseObject.Get<string>("appStoreURL");
						Debug.Log(applicationTitle);
						Debug.Log(applicationDescription);
						Debug.Log(applicationAppStoreURL);
					}
			});
	}
```

これで無事ログに出力する事が出来ました。

![04.png](https://qiita-image-store.s3.amazonaws.com/0/64588/cb318aec-1cc2-6a49-f7b6-3ec8fd70049e.png "04.png")

# 最後に

Parseを利用することで、バックエンドの構築などを行わなくても簡単にサーバを利用したシステムの構築を行うことが出来ます。

これは、今までバックエンドに掛けていた時間を最小限に抑えて、アプリの開発に集中できるので、非常に強力な武器となりそうです。

----

ところどころ個人アプリ名をスクショ等で宣伝してすいませんでしたｍｍ
最後に追加して宣伝ですｗ スクショで名前が出ているAppは[こちら](http://project-unknown.hatenablog.com/entry/2015/04/18/201907)で紹介していますので、お時間のあるときに是非是非。
Cobblerで「netboot=Falseの時に生成される設定ファイル」を変更する方法


## ２行で、What is Cobbler
Cobblerを使えば、PXEブート環境が簡単に構築することができる。
さらにはサーバに応じて、適用するKickstartファイルの内容を変更することもできる。


## Cobblerはマシンのインストール完了を検知する仕組みを持っている
CobblerではOSインストール後に適用するscript(Kickstartで言う[%post],Preseedで言う[late_command])でcobblerサーバのAPIを叩くようにし、インストールの正常終了をCobblerサーバに通知してOSインストール完了を検知することができる。
そうすることで、rebootして再びpxebootしても、ローカルディスクからブートする設定ファイルに変更/適用することができるようになる。（もし、この機構がなかった場合、BIOSブートオーダでPXEブートを最優先にしていると、OSインストールの無限ループになってしまう。）


実際に、cobblerの2.0以上では、
OSインストールが完了したサーバには、下記のpxe設定ファイルを適用して、ネットブートではなくディスクからブートするように変更している。（chain.c32のブートローダを使用して、チェインロードし、ディスクからブートする）

```/etc/cobbler/pxe/pxelocal.template
DEFAULT local
PROMPT 0
TIMEOUT 0
TOTALTIMEOUT 0
ONTIMEOUT local

LABEL local
        KERNEL chain.c32
```


んで今回は、
## このOSインストールした後に適用するPXE設定の内容を変更したい
言い換えると、netboot=Falseの時に生成される設定ファイルの内容を変更したい

**結論から言うと、直接 */etc/cobbler/pxe/pxelocal.template* を変更すればよいみたい。**


ちなみに、なんで僕がlocalbootの方法を変えたかったかというと、うまくチェインロードできないサーバがあったので、チェインロードしないでlocalbootを使いたかったからである。なのでこんな感じに変更した。

```/etc/cobbler/pxe/pxelocal.template
DEFAULT local
PROMPT 0
TIMEOUT 0
TOTALTIMEOUT 0
ONTIMEOUT local

LABEL local
        localboot 0
```

でも、この逆にlocalbootがうまくいかないサーバーもあるので、サーバによってチェインロードするかlocalbootするかを変更しようと思う。この辺はTemplateエンジンでCheetahが使われているので、簡単にできると思う。
If ... Then ... End ってどういう風に書いてる？？

# If ... Then ... End ってどういう風に書いてる？？


自分は最初に覚えた言語がC言語だったり、その後に覚えたのがPerlだったりしたせいか、
VisualBasic的な `If ... Then ... End ` という書き方に中々馴染めません。

だからやむを得ずVBを書かなきゃいけない時にストレスが溜まってくると、
  
  
`Then`ってなんだよ、たかが条件文の終端に４文字もタイプさせんなよ！！

そもそも `If` と `While` で条件分の書き方違うって言語仕様がブサイクすぎだろ。
このクソカスがっ！！！
  
  
って心の超絶にdisりながらコーディングしてます。
いや、していました。もうそんなことしません。


いや、俺の脳みそがクソカスだって話です。
マジすみませんでした。


でも、`Then`ってIfの条件文の終端を表しているんだと思いませんでしたか？
僕はそう思っていました。

なぜなら、入門書やネット上で見つかるコードでは大抵は次のように書かれているからです。

``` VBScript
IF Selector == NULL Then
	Selector = "hogehoge"
End
```


自分はこの書き方しか知らなかったので、記号化・視覚化されている`If ( ... ) { ... } `の方が分かりやすく可読性が高いと考えていました。






次のコードを見るまでは。


``` VBScript
IF Selector == NULL
Then
	Selector = "hogehoge"
End
```


どこば変わったか分かりますか？

そうです。`Then` の位置です！


僕はこのコードを見た時に、この言語設計をした人は見やすく分かりやすい言語にしたいという気持を、もの凄く素朴な感覚で表現したら`If ... Then ... End `という形式になったんだろうなっ思いました。
  
  
  
だって、これ、英文そのままじゃないですか！！
  
  
  
例えば実現したいことをまず文章で表すと、

`If Selector is null, then set to the default value "hogehoge".`

こんな感じの文章になって

論理構造や意味で分けると

``` VBScript
If Selector is null, 
then set to the default value "hogehoge"
.
```

となって、これをプログラムちっくに記号化すれば自然と

``` VBScript
IF Selector == NULL
Then
	Selector = "hogehoge"
End
```

となります。
ほら！　さっきのコードと同じ(*´∀｀)


さらにさらに、この書き方は文章的に読みやすくなる、という効果も与えます。

どういうことかと言うと、横書きの文章をザッと読むときって、左上から右下に向かって視線が移動しますよね。もう少し正確には、文の先頭部分を拾い読んでいって、視線が細かく移動しながら全体としては左上から右下に向かって流れている、という感じじゃないでしょうか。

読むのがソースコードだったら、それはもう殆ど左上から真下に落ちていく感じで視線が移動するはずです。

つまり、文字を読むときの性質として、文頭の方が文末より読む優先度が高いんだから、重要な言葉を文頭に持ってきた方が素早く意味を把握できるようになるということです。



例えば、ごちゃごちゃしていて分かりにくいコードの内容を急いで把握しないといけなくなったとします。

実際に次のコードをザッと上からなめてみてください。

``` VBScript
If 複雑で分かりにくい条件文

Then
	# update table
    .
    .
    .
    (ごちゃごちゃしたコードがつらつらと)
    .
    .
    .
    .
Else If
	# create table
    
    .
    .
    .
    (こっちもごちゃごちゃしたコード)
    .
    .
    .
    .
    
End
```

サンプルコードが思いつかなかったので中身スカスカのサンプルですが(^o^;)
左上から左下に向かって視線が動いて、制御文とかコメントとかがあれば拾い読むという感じだったんじゃないでしょうか。

そして 拾い読んだ文を繋げると`If ○○ , then update table.  Else if create table` となり、文章としてスッと頭に入って来ませんでしたか？

コードを置かっけてるつもりが文章を読んでいるような、そんな不思議な感覚になると思います。


今回この記事を書こうと思ったのは、可読性を高める新しい視点を教えてもらったような気がしたからです。

インデントや改行位置など構造的、視覚的に読みやすくする工夫であったり、命名規則であったりはそこら中で語られていると思います。
が、これらは機械的で無味無臭なアプローチとも言えます。


それに対して、今回のように文章的に読みやすくするというアプローチはあまり見かけませんし、VB系以外の言語でもこの発想は役に立つと思います。
それにとっても人間くさくて愛着が湧いてきます(*´∀｀)


どうでしょう。
今日から`Then`の前で改行するスタイルにしてみませんか？
Processingで実行中の画像をお手軽にデスクトップ保存する


# 動機
Processingを動かしている最中に、さっと画像を保存できたら便利なでは？と思いってやってみたらすごく捗ったので共有を。
仕込みはひじょーーーに簡単です。

# やりかた

Processingでおそらく最も有名な日本人向け入門サイトである[Processing基礎最速入門 - catch.jp-wik](http://www.catch.jp/wiki/index.php?Processing)で紹介されている[衝突する複数のボール](http://www.catch.jp/wiki/index.php?Processing%B4%F0%C1%C3%BA%C7%C2%AE%C6%FE%CC%E7#a825d5a3)のコードを例に試していきます。

```P``` のキーをタイプすると画像がデスクトップに保存される仕様にします。

以下のコードをpdeの最後に追記します。

```java:multibubble.pde
//--------------------------------------
// 最後に以下のコードを追加して下さい
//--------------------------------------

// ファイル名の連番で利用
int count = 1;

void keyPressed() {
  
  // Pのキーが入力された時に保存
  if(key == 'p' || key == 'P') {
    
    // デスクトップのパスを取得
    String path  = System.getProperty("user.home") + "/Desktop/screenshot" + count + ".jpg";

    // 保存
    save(path);
   
    // 番号を加算
    count++;
    
    // ログ用途
    println("screen saved." + path); 
  }
}
```

# 実行

（▶）ボタンを押してProcessingを実行します。
実行中に```P``` のキーを押すと以下のようにコンソールに保存された旨が出力されます。
連打しても大丈夫です。

![実行例.png](https://qiita-image-store.s3.amazonaws.com/0/6463/e9b55a2e-54df-1260-6735-8afb6a77c09e.png)

実際にデスクトップに画像が出力されてます。
これは捗る！
![gomi.png](https://qiita-image-store.s3.amazonaws.com/0/6463/74bf341d-4ff5-4518-b284-ebc34260ebc2.png)


# コード説明
見たまんまなのであまりいうことないですが…

* コードの説明デスクトップのパスは``` System.getProperty("user.home") + "/Desktop"```で取得できます。
* 2回目の起動をした場合、同一ファイル名があった場合は上書きされるのでもう少しロジック入れた方が良いかもです。

# おしまい

簡単にスナップショット取れると想像以上に捗ります！
是非お試し下さい！
[Intellij]追加されたIndent自動認識のオプションについて

Intellij 14のあるバージョンからIntellijで初めて開いたファイルのインデントフォーマットを自動認識する機能が追加された。
この機能の動作が少しわかりづらいので、詳細を書き残しておく。

## 現象(Intellijの動作)

1. Intellijで作成していないファイルをIntellijで開く
2. ファイルへ改行を追加
3. Intellijで設定しているインデント設定とそのファイルのインデントが違う場合、以下のようなメッセージが出る
  * ```This file is indented with 4 spaces instead of 2```

## するべき操作

* 上のメッセージが出たとき
  * このファイルでもIntellijで設定しているインデント設定を適応したい場合(上のメッセージの場合は2spaces) → **Indent with 2 spaces**
  * このファイル自身のインデント設定を特別にこのファイルでのみ維持したい場合(上のメッセージの場合は4spaces) → **OK**
* ファイルごとのインデント設定が一切不要な場合は**Settings | Editor | Code Style | Default Indent Options | Detect and use existing file indents for editing**のチェックを外す

## 蛇足

特定のファイル固有のインデント設定を行ってから(OKを押してから).ideaディレクトリ内でそれがどこへ保存されているかを調べたが残念ながら見つけることはできなかった。
もし間違ってOKを押してファイル固有のインデント設定をしてしまった場合、一度ファイルを移動してもう一度戻すのが簡単。

## 関連リンク

* [IntelliJ IDEA 14 Will Detect Code Styles on the Fly | JetBrains IntelliJ IDEA Blog](http://blog.jetbrains.com/idea/2014/10/intellij-idea-14-will-detect-code-styles-on-the-fly/)
Rustとlazy static

　やっはろー。[lazy-static.rs](https://github.com/Kimundi/lazy-static.rs) が便利っぽい、という話をします。

　設定ファイルや辞書データなどの適当なファイルをあらかじめ読んでおき、その内容をグローバルに置きたい、という場面はそれなりにあると思います。Rust では、`static` でグローバル変数をつくることができますが、初期化に使う式はコンパイル時に評価できるものでなくてならないため、先のような場面では使えません。

```rust
// ✔
static SETTING: Setting = Setting { ... };

// ✗
static SETTING: Setting = {
  // ファイルを読んだり
  // デシリアライズしたり
};
```

ではどうするかというと、`static mut` な変数を置いて、適当な関数から適当なタイミングで初期化することになります。とてもつらい。

　というのを解決するのが `lazy-static.rs` です。

```rust
#[macro_use]
extern crate lazy_static;

lazy_static! {
  static ref SETTING: Setting = {
    // ファイルを読んだり
    // デシリアライズしたり
  };
}

fn do_something() {
  // 使うときは deref
  *SETTING ...
}
```

実装が気になるので、マクロを覗いてみます。

```rust
// 切り貼りしているので、元のコードとは多少異なります
// https://github.com/Kimundi/lazy-static.rs/blob/master/src/lib.rs

// `$N` は変数の名前
// `$T` は変数の型
// `$e` は初期化に使う式
struct $N {__private_field: ()}
static $N: $N = $N {__private_field: ()};

impl ::std::ops::Deref for $N {
  type Target = $T;
  fn deref<'a>(&'a self) -> &'a $T {
    #[inline(always)]
    fn __static_ref_initialize() -> Box<$T> { Box::new($e) }

    unsafe {
      use std::sync::{Once, ONCE_INIT};
      use std::mem::transmute;

      #[inline(always)]
      fn require_sync<T: Sync>(_: &T) { }

      static mut DATA: *const $T = 0 as *const $T;
      static mut ONCE: Once = ONCE_INIT;
      ONCE.call_once(|| {
        DATA = transmute::<Box<$T>, *const $T>(__static_ref_initialize());
      });
      let static_ref = &*DATA;
      require_sync(static_ref);
      static_ref
    }
  }
}
```

`Deref` トレイトの実装に `static mut` な変数を持ち、初めて `deref` した際に渡された式で初期化する、といった感じのようです。発想が天才のそれっぽい。

> [Kimundi / lazy-static.rs - GitHub](https://github.com/Kimundi/lazy-static.rs)
Facebook連携でFBSDKProfileがnilになる問題の解決方法


## 状況
- [Facebook for iOS SDK](https://github.com/facebook/facebook-ios-sdk)を使用
- `FBSDKLoginButton`にてログインはできる
- `FBSDKLoginButtonDelegate`の`loginButton:didCompleteWithResult:error`で値を設定しようと試みる
	- `FBSDKProfilePictureView`にはプロフィールイメージが表示される
	- にもかかわらず何故か`FBSDKProfile`が`nil`となり名前が取得できない

ちなみに最初delegateメソッドが呼ばれなくて焦っていたんですがdelegateの登録し忘れるという初歩的なミスをしてました。


## 原因
[Facebook SDK v4.0 for iOS - FBSDKProfile currentProfile not being set](http://stackoverflow.com/questions/29292371/facebook-sdk-v4-0-for-ios-fbsdkprofile-currentprofile-not-being-set)が大変参考になりました。

### 原因その1: 取得のタイミングが悪かった
名前取得を行うタイミングは`loginButton:didCompleteWithResult:error`ではなく、Observerの`FBSDKProfileDidChangeNotification`でした。

```objectivec:viewDidLoad内
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(observeProfileChange:) name:FBSDKProfileDidChangeNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(observeTokenChange:) name:FBSDKAccessTokenDidChangeNotification object:nil];
```

```objectivec:呼ばれるメソッド
- (void)observeProfileChange:(NSNotification *)notfication {
    if ([FBSDKProfile currentProfile]) {
        self.nameLabel.text = [FBSDKProfile currentProfile].name;
    }
}

- (void)observeTokenChange:(NSNotification *)notfication {
    if ([FBSDKAccessToken currentAccessToken]) {
       [self observeProfileChange:nil];
    }
}
```

### 原因その2: `enableUpdatesOnAccessTokenChange`を`YES`にしていなかった
[Facebook SDK v4.0 for iOS - FBSDKProfile currentProfile not being set](http://stackoverflow.com/questions/29292371/facebook-sdk-v4-0-for-ios-fbsdkprofile-currentprofile-not-being-set)にあるように、AppDelegate.mで設定する必要がありました。

```objectivec:AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [FBSDKProfile enableUpdatesOnAccessTokenChange:YES];
    return [[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];
}
```

以上で無事`[FBSDKProfile currentProfile]`を取得することができました。
HerokuにHaskellのアプリを公開する

2020年にはもっと便利な方法があるのでこちらの記事を参照してください
[HerokuにHaskellで作ったWebサービスを公開する簡単な方法 - Qiita](https://qiita.com/lotz/items/1cf6f620c9fd02f82070)

----

[Haskell on Heroku](https://haskellonheroku.com/)を使ってHerokuにHaskellのアプリを公開する方法を残しておきます。Haskell on Heroku は [Halcyon](https://halcyon.sh/)を利用したHerokuの buildpack です。

Haskellのアプリは依存ライブラリのビルドに時間がかかってしまい、Herokuへデプロイする時は15分制限に簡単に引っかかってしまうので工夫が必要です。Halcyonは別のサーバー(Amazon S3)に環境を保存しておくことでインクリメンタルビルドを可能にしてくれます。

始めに新しくHerokuのアプリを作り buildpack を設定しておきます。


$ heroku create -b https://github.com/mietek/haskell-on-heroku


```bash
$ heroku buildpacks:set https://github.com/mietek/haskell-on-heroku
```

##環境設定
* ghc 7.10.1
* cabal 1.22.6.0

を使用したいのでHerokuの環境変数に以下のように設定します。

```bash
$ heroku config:set HALCYON_GHC_VERSION=7.10.1
$ heroku config:set HALCYON_CABAL_VERSION=1.22.6.0
```

Haskell on Heroku はHerokuのデプロイ時の制限のためデフォルトで依存ライブラリのビルドを行わないようになっています。しかしこれだと sandbox を別に作る必要があって少し面倒くさいのでビルドを行うように修正します。この場合ビルドされたアプリはHalcyonのpublicサーバーに置かれるのでそれが嫌な場合はS3を使って[private storage](https://haskellonheroku.com/tutorial/#set-up-private-storage)を設定しましょう

```
$ heroku config:set HALCYON_NO_BUILD_DEPENDENCIES=0
```

##アプリを公開する
ここまで設定できたら単純なアプリでうまく行ってるかどうかを試してみましょう。`.cabal`ファイルもちゃんと作成しましょう。

```hs
{-# LANGUAGE OverloadedStrings #-}

import System.Environment
import Web.Scotty

main = do
    env <- getEnvironment
    let port = maybe 8080 read $ lookup "PORT" env
    scotty port $ do
        get "/" $ html $ "Hello Heroku!"
```

```bash
$ tree .
.
├── Main.hs
└── app.cabal
```

```
$ git push heroku master
...
$ heroku ps:scale web=1
$ heroku open
```

うまく行きましたか？
JavaScriptで配列をシャッフルする方法

調べていて多かったもの。  

# Array.prototype.sort()を用いる方法
例: 

    array.sort(function() { Math.random() - .5; });
- 最小計算量は$O(n)$だが最悪計算量は$O(n^2)$である
- シャッフルの結果に偏りが見られる  

# Fisher–Yatesアルゴリズムを用いる方法
例:

    for(var i = array.length - 1; i > 0; i--){
        var r = Math.floor(Math.random() * (i + 1));
        var tmp = array[i];
        array[i] = array[r];
        array[r] = tmp;
    }
- 計算量は常に$O(n)$である
- シャッフル結果にほとんど偏りが見られない  

# 参考
[Array#sort実装のshuffleは偏る](http://qiita.com/minodisk/items/94b6287468d0e165f6d9)
chainerを使って回帰してみると、ちょっとはまる

#概要
* はじめまして、qiitaに初投稿です。至らぬところが多いと思います。
* ニューラルネットワークのフレームワークのサンプルコードは大体分類問題で、回帰の例があまりないのでトライしてみました。
* はまる箇所がありました。上手な書き方を知りたいので、投稿します。

* **theanoだと同等の事をするのに1000行以上書きましたが、chainerだと98行でした。**chainerに移行します。
* GPUでも問題なく動きました。
* _**結論: chainerすごい**_

#
##ソースコード

* [chainer/example/train_mnist.py](https://github.com/pfnet/chainer/blob/master/examples/mnist/train_mnist.py)をちょっと変えたらできました(変更点は後ろに挙げました)。
* [Gist](https://gist.github.com/mottodora/a9c46754cf555a68edb7)に挙げました。

##はまった箇所

* 回帰問題の場合、正解データのshapeが(データ数,)だと,batchsizeが2以上の時になぜかnumpyのbroadcastingがうまくいきません。
* reshapeで(データ数,1)にするとbroadcastingできるようになりました。
* theanoでも全く同じ現象が起こるのでnumpyの問題だと思います。

```python:
#targetは正解データ
#mnist.pyだと↓のような書き方になっている 
target = diabetes['target'].astype(np.float32) #これだとミニバッチの数が2以上だと動かない
```
↑だと↓のようなValueErrorがでます(13というのはbatchsize)。

```
ValueError: non-broadcastable output operand with shape (1,30) doesn't match the broadcast shape (13,30)
```
試行錯誤した結果これで動きました。

```python:
#reshapeしないといけない
target = diabetes['target'].astype(np.float32).reshape(len(diabetes['target']), 1)
```

* 醜いかつ、相関係数が計算しにくいなど、不便な点があります。
* もう少しうまく書けないでしょうか？

#example/mnist.pyからの変更点
##環境

* [pyenv](https://github.com/yyuu/pyenv)
* anconda-2.1.0
	* conda update pythonでpythonのversionを2.7.10に
* CUDA6.5
* 後は[chainerのRequirements](https://github.com/pfnet/chainer)のライブラリ

###chainerのインストールに関して
* 最初はpip install chainerでインストールした(6月19日)chainerを使ってましたが、GPU上でadadeltaが動きませんでした(一文抜けてた)。
* github上では修正されていたので、git cloneして、python setup.py install
* pip install chainer-cuda-deps




##変更点
###データセット
* scikit-learnの[diabetesデータセット](http://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_diabetes.html)を利用しました。
* 入力データ: 10次元で442サンプル(小さい上に少なくてごめんなさい)

###モデル

* ネットワークのアーキテクチャ
	* 10(input)-30-30-1(output)

```python:
n_units   = 30
model = FunctionSet(l1=F.Linear(10, n_units),                                 
                    l2=F.Linear(n_units, n_units),
                    l3=F.Linear(n_units, 1)) 
```

###学習率の調整
* Adadelta(Adamよりも良かった)

```python:
optimizer = optimizers.AdaDelta(rho=0.9)
```

###誤差関数と評価手法
* 誤差関数は(ミニバッチ内の)平均二乗誤差

```python:
# Neural net architecture
def forward(x_data, y_data, train=True):
    x, t = Variable(x_data), Variable(y_data)
    h1 = F.dropout(F.relu(model.l1(x)),  train=train)
    h2 = F.dropout(F.relu(model.l2(h1)), train=train)
    y  = model.l3(h2)
    # 平均二乗誤差と予測結果を返す
    # 予測結果を返すのは、後で予測結果と正解データで相関係数を計算するから
    return F.mean_squared_error(y, t), y
```

* 正解率は出せないので、分類と同じ評価はできません。
* 誤差だけだとわかりにくいので、普通はR<sup>2</sup>値を利用する?
* 個人的事情で、予測値と正解データの相関係数で評価しました。

* はまった箇所(上参照)のせいで相関係数を計算する行が超絶汚くなります。

```python:
pearson = np.corrcoef(np.asarray(preds).reshape(len(preds),), np.asarray(y_test).reshape(len(preds),))
```

##感想
* theanoに比べてデバッグが本当に楽でした(theanoはどこでエラーが起きているのか本当わかりにくい)。
* 感動するレベルでコードが短くなりました。
* weight decayはできるみたいですけど、lassoは実現できるのでしょうか？