OmniAICreator/Qiita-1.07M huggingface dataset:
CoreTextのバグ


```
❗️文字列??❗️
```

上記の文字列をUILabelに貼ると正しく表示されない。
iOS7.0.4（jailbreaked）で確認。入獄でも出来るのかな…？（脱獄限定ならバグじゃないか…。）
iOS7.1で直ってるかも。


公式Twitterクライアント
feather
Tweetbot2
TheWorld
Twitterlator
で確認（❗️文字列❗️文字列❗️）と表示される

ついっぷる
夜狐八重奏＋
では確認（❗️文字列）と表示される


...調査中

追記：6/18 01:19
再現性はあったのでAppleにバグレポ出しました。(iOS7.1で直ってたりして

追記２：
文字列が繰り返されるということは……ということなので乱用は絶対やめ。（マジで）

追記３：
検証ページ作りました。
http://noppelab.com/WebApp/iOSUILabelIssueTest/index.html
express.js 4をCoffeeScriptで開発できるようにする(改)

[以前書いた記事](http://qiita.com/koki_cheese/items/4cbacecf293f5c869be2)をわりとコピペで使っていたのですが

今日、突然気づきました

**めんどくさい！**

ということに。

というわけでexpress-generatorを改造しました。

```shell-sessionl
$ npm install -g https://github.com/k2wanko/express-generator/tarball/5f7db390aeeec76876e3fc645cf3a07130af881c
```

でインストールできます。

ヘルプを見てみると

```shell-session
$ express --help

  Usage: express [options] [dir]

  Options:

    -h, --help          output usage information
    -V, --version       output the version number
    -l, --lang <lang>   Coding language support (js|coffee) (default to js)
    -e, --ejs           add ejs engine support (defaults to jade)
    -H, --hogan         add hogan.js engine support
    -c, --css <engine>  add stylesheet <engine> support (less|stylus|compass) (defaults to plain css)
    -f, --force         force on non-empty directory
```
-l, --lang オプションが追加されました。

使い方は

```shell-session
$ express -l coffee project
```

これで　毎回　めんどくさい手順を省略できました。

コードは[こちら](https://github.com/k2wanko/express-generator/tree/coffee)にあります。

今度はYeomanのGeneratorで作ってみたいですね(既にあると思うので勉強的な意味で)
gitでpermissionが変わってしまったファイルを元に戻す方法


下記を参考にしました。
> [git でパーミッションだけ変更されてしまったファイルが大量にあるときに元に戻す方法 - bearmini's blog](http://bearmini.hatenablog.com/entry/2013/04/13/001531)
> [Git tip: resetting file permissions — Built In Bruges](http://www.builtinbruges.com/2013/03/git-tricks-permission-reset/)

# permissionを元に戻す
下記のコマンドで、テキスト、バイナリファイル共に元に戻る。
あくまでもpermissionだけが変わったファイルが元に戻る。

```
git diff --numstat | awk '{if (($1 == "0" && $2 == "0") || ($1 == "-" && $2 == "-")) print $3}' | xargs git checkout HEAD
```

# 差分のあるファイルも含めてpermissionを元に戻す
変更もあって、permissionも変わったファイルのpermissionだけを元に戻す方法。
下記をaliasとして登録。

```
git config --global --add alias.permission-reset '!git diff -p | grep -E "^(diff|old mode|new mode)" | sed -e "s/^old/NEW/;s/^new/old/;s/^NEW/new/" | git apply'
```

これで `git permission-reset` とすると、permissionだけが元に戻る。これは便利。


# permissionの変更を差分としない方法

下記を設定

```
git config core.filemode false
```

# おまけ(注意)
そもそもなぜ大量のpermission変更が発生したのか。それは、macに刺したUSBメモリがNTFSフォーマットであったことに起因しています。gitの作業ディレクトリをそのUSBにコピーすると、permissionがきれいに777になってしましました。USBメモリは最初にディスクユーティリティでMac OS 拡張　ジャーナリングでフォーマットしましょう。それから作業ディレクトリをコピーしましょう。
#jsとclj->jsの違いについて

ClojureScriptのオブジェクトからJavaScriptのオブジェクトに変換する方法として`#js`と`clj->js`がありますが、その違いは何でしょうか？

```clj
(identity #js [[[1 2]]])
(clj->js [[[1 2]]])
```


`#js`はvectorとmapのみ変換可能で、再帰的には適用されません。
`clj->js`はlistやsetも変換可能で、再帰的に適用されます。

コードを見るとそれがよくわかります。
`#js`は以下の`read-js`が本体です。

https://github.com/clojure/clojurescript/blob/master/src/cljs/cljs/reader.cljs

```clj:reader.cljs抜粋
(defn ^:private read-js
  [form]
  (cond
    (vector? form)
    (let [arr (array)]
      (doseq [x form]
        (.push arr x))
      arr)

    (map? form)
    (let [obj (js-obj)]
      (doseq [[k v] form]
        (aset obj (name k) v))
      obj)
    
    :else
    (reader-error nil
      (str "JS literal expects a vector or map containing "
           "only string or unqualified keyword keys"))))
```

`clj->js`は以下です。keywordやsymbolも変換されるようです。

https://github.com/clojure/clojurescript/blob/master/src/cljs/cljs/core.cljs

```clj:core.cljs抜粋
(defn clj->js
   "Recursively transforms ClojureScript values to JavaScript.
sets/vectors/lists become Arrays, Keywords and Symbol become Strings,
Maps become Objects. Arbitrary keys are encoded to by key->js."
   [x]
   (when-not (nil? x)
     (if (satisfies? IEncodeJS x)
       (-clj->js x)
       (cond
         (keyword? x) (name x)
         (symbol? x) (str x)
         (map? x) (let [m (js-obj)]
                    (doseq [[k v] x]
                      (aset m (key->js k) (clj->js v)))
                    m)
         (coll? x) (let [arr (array)]
                     (doseq [x (map clj->js x)]
                       (.push arr x))
                     arr)
         :else x))))
```
Bourbon x gulp.js


Bourbon 依存の Sass(SCSS)ファイルを gulp.js でCSSにコンパイルする手順
サンプルのディレクトリ構造は以下の通り

プロジェクトディレクトリ
　├ gulpfile.js
　├ scss
　│　├ style.scss
　│　└ test.scss
　└ dist（公開用）
　　　└ css
　　　　├ style.css
　　　　└ test.css

## 設定の手順

### npm で node-bourbon をインストール

`npm install node-bourbon`

### gulpfile.js

bourbon.with()に、Bourbon を使う Sass(SCSS) をもれなくセットする必要がある
それを、sass()関数のオプション includePaths にセットする

```gulpfile.js
var gulp = require('gulp'),
  sass = require('gulp-sass'),
  bourbon = require('node-bourbon');

bourbon.with('./style.css', './scss/test.scss');/*bourbon.includePathsに入る*/

var paths = {
  dist: './dist/',
  scss: './scss/*.scss'
};

gulp.task('css', function() {
  return gulp.src(paths.scss)
    .pipe(sass({includePaths: bourbon.includePaths}))
    .pipe(gulp.dest(paths.dist + 'css/'));
});
```

### Sass(SCSS)

Bourbonをインポートするだけ
サンプルとして各SCSSファイルにミックスインを一つ書いてみる

```scss/style.scss
@import "bourbon";

button {
  @include button;/*bourbon mixin*/
}
```

```scss/test.scss
@import "bourbon";

.triangle-down {
  @include triangle(12px, gray, down);/*bourbon mixin*/
}
```

### gulp でタスクを実行

ターミナルで、プロジェクトルートで
`gulp css`

コンパイルされ、公開ディレクトリに以下のCSSが生成される
Bourbon のミックスインを自在に使えるようになった

```dist/css/style.css
button {
  border: 1px solid #0772e4;
  border-radius: 3px;
  box-shadow: inset 0 1px 0 0 #8ebef1;
  color: white;
  display: inline-block;
  font-size: inherit;
  font-weight: bold;
  background-color: #4294f0;
  background-image: -webkit-linear-gradient(#4294f0, #0779f3);
  background-image: linear-gradient(#4294f0, #0779f3);
  padding: 7px 18px;
  text-decoration: none;
  text-shadow: 0 1px 0 #0068d7;
  background-clip: padding-box;
  /*bourbon mixin*/ }
  button:hover:not(:disabled) {
    box-shadow: inset 0 1px 0 0 #60a3ec;
    cursor: pointer;
    background-color: #2f89ea;
    background-image: -webkit-linear-gradient(#2f89ea, #0872e3);
    background-image: linear-gradient(#2f89ea, #0872e3); }
  button:active:not(:disabled), button:focus:not(:disabled) {
    border: 1px solid #0772e4;
    box-shadow: inset 0 0 8px 4px #086ad3, inset 0 0 8px 4px #086ad3; }
  button:disabled {
    opacity: 0.5;
    cursor: not-allowed; }
```

```dist/css/test.css
.triangle-down {
  height: 0;
  width: 0;
  border-left: 6px solid transparent;
  border-right: 6px solid transparent;
  border-top: 6px solid grey; }
```


### 参考用：実際のタスクは他に様々な処理が入る

やりたい処理を数珠つなぎ
すっきり見やすいのが gulp.js のいいところですね

```
gulp.task('css', function() {
  return gulp.src(paths.scss)
    .pipe(plumber())
    .pipe(sass({includePaths: bourbon.includePaths}))
    .pipe(mediaQueries())
    .pipe(autoprefixer('last 1 version'))
    .pipe(csscomb())
    .pipe(concat('style.css'))
    .pipe(minifyCss())
    .pipe(gulp.dest(paths.dist))
    .pipe(gzip())
    .pipe(gulp.dest(paths.dist))
    .pipe(connect.reload());
});
```


## 参考記事

* [node-bourbon](https://www.npmjs.org/package/node-bourbon)
* [Using Bourbon & Neat with Gulp](http://laravel-news.com/2014/03/using-bourbon-neat-with-gulp)
iPhone実機で開発中アプリが起動しない時

# iPhone実機に開発中のアプリを転送したものの、なぜか起動直後に落ちる

ってことがありました。

# エラーログ
```
backboardd[28] <Error>: HID: The 'Passive' connection 'AppliName' access to protected services is denied.
AppliName(1369,0x5783000) malloc: *** mmap(size=516096) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
```
ログは実際のものではなく、覚えてるエラー文面をWEBから引いてきました（雑

# クラッシュレポート
Macにつなげても、なぜかiPhoneのクラッシュレポートに記録されない...

# 解決
色々試した結果、実機のOS再起動をしたらちゃんと起動するようになりました。

# 原因
まったく同じBundle Indentifierで別のアプリを転送したことがあったため、変なキャッシュが残ってしまっていたのかも...
エラー見てもまったく解決できなかったし、ググっても解決しなかったので、一応簡単にまとめておきます。
libGDXの基礎の基礎

# はじめに

libGDXは

* Windows
* Mac
* Linux
* Android
* iOS
* HTML5

に対応したクロスプラットフォームなゲーム用フレームワークです。

setup用ツールも用意されていますが、シンプルではない上に、環境によっては開発もしづらいのでまずは一番シンプルな形を作ってみます。


ここではPC向けとAndroid用の設定を説明します。セットアップはとっても簡単です。


#libGDXのダウンロード

ファイルはここからダウンロードします。
http://libgdx.badlogicgames.com/releases/

2014/6/15時点で1.1.0を落とすとよいでしょう。

zipは展開しておいてください。



# Windows/Linux/Mac用のセットアップ

クラスパスに以下のファイルを加えます。

* gdx-backend-lwjgl-natives.jar
* gdx-backend-lwjgl.jar
* gdx-natives.jar
* gdx.jar


メインクラスを作ります。Libgdxtest.javaは共通部で、あとに書きます。

```java:Main.java
public class Main{
    public static void main(String[] args) {

        new LwjglApplication(
            new MainListener(),
            "Game",
            320,
            320
        );
    }
}
```

# Android用のセットアップ

libsフォルダに以下のファイル/フォルダをコピーします。

* armeabi
* armeabi-v7a
* gdx-backend-android
* gdx.jar

アクティビティクラスを作ります。設定ファイルは適当に合わせておいてください。

```java:MainActivity.java
import android.os.Bundle;
import com.badlogic.gdx.backends.android.AndroidApplication;

public class MainActivity extends AndroidApplication {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        initialize(new MainListener());
    }

}
```

# 最小限のロジック部分

ApplicationListenerインターフェースを実装します。

```java:MainListener.java

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;


public class MainListener implements ApplicationListener{
  
    @Override
    public void create() {
        System.out.println("create");
    }

    @Override
    public void resize(int w, int h) {
        System.out.println("resize"+w+","+h);
    }

    @Override
    public void render() {
        Gdx.gl.glClearColor(0, 0, 0.2f, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        
    }

    @Override
    public void pause() {
        System.out.println("pause");
    }

    @Override
    public void resume() {
        System.out.println("resume");
    }

    @Override
    public void dispose() {
        System.out.println("dispose");
    }

}

```

# 実行
PCでの実行結果は以下のようになります。

![libgdx.png](https://qiita-image-store.s3.amazonaws.com/0/46371/45f4b546-0f61-36ee-7788-9c26d005c30b.png)

ライフサイクルメソッドが実行されたタイミングでそれぞれログが出ていることでしょう。それぞれ予想通りの動きだと思いますが、PC版だけはウインドウが最前面ではなくなった時、pauseが実行されますが、そのあともrenderメソッドが呼ばれ続けるのだけに注意してください。


320x320の描画エリアを持つウインドウが生成されました。暗い青で塗りつぶされていますね。

色はここで指定しています。

```java:
Gdx.gl.glClearColor(0, 0, 0.2f, 1);
```

引数の先頭から赤、緑、青、αとなっています。値は０から１の間でfloatで指定します。この順番で色を指定することよくあるので覚えておきましょう。

`Gdx.gl`でGLを取得、OpenGLの命令を発行できます。OpenGLさえ動けばどうでもいいという人はこれで十分でしょうか。

<br>
とっても簡単ですね。
<br>

これだけだと、JOGLを直接使っているのとあまり変わらないですね。クロスプラットフォームなのはいいのですが、Androidにしてもありがたみも薄いかもです。

次回からはもう少し高レベル、便利な機能を紹介していきたいと思います。
zshのcontrol-rの過去コマンド検索でglobを使う

## 結論
以下を.zshrcに追加すればおｋ

```
zle -la history-incremental-pattern-search-backward && bindkey "^r" history-incremental-pattern-search-backward
zle -la history-incremental-pattern-search-forward  && bindkey "^s" history-incremental-pattern-search-forward
```

## 解説
何も設定していないzshでcontrol-rを押すと`history-incremental-search-backward`というwidgetが発動します。これはglobが使えません。で、これとは別に`history-incremental-pattern-search-backward`というwidgetが存在し、これはglobが使えます。と言うわけでcontrol-rに`history-incremental-pattern-search-backward`をバインドするのが↑の設定です。あとcontrol-sで逆向きに検索出来るようにします。

で、`history-incremental-pattern-search-backward`はzsh v4.3.9から追加されていて、それ以前のzshを使ってる場合そのままだと死ぬので、`history-incremental-pattern-search-backward`がある時だけ設定してます（`zle -la ~~ &&`のところ）。そんな古い環境とは縁のない人はここ書かなくていいです。

globが使えると普通のファイル名展開と同じく`?`(任意の一文字)、`*`(長さ0以上の任意の文字列)とかが使えるようになるわけです。あとデフォルトのglobと違って`^`が行の先頭の意味で使えたりします。
RubyやJavaScriptでの配列の差集合・和集合・積集合

ruby の場合、配列の和集合、差集合、積集合は演算子で扱える。

```ruby
a = [1,2,3,4,4]
b = [3,4,5,6,7]

p  a | b  # 和集合 [1,2,3,4,5,6,7]
p  a - b  # 差集合 [1,2]
p  a & b  # 積集合 [3,4]
``` 

JavaScriptだと[lodash](http://lodash.com/)に、それぞれの関数があったりする。

```js
var _ = require('lodash');

var a = [1,2,3,4,4]
var b = [3,4,5,6,7]

console.log(_.union(a, b));        // 和集合(union) [1,2,3,4,5,6,7]
console.log(_.difference(a, b));   // 差集合(difference set) [1,2]
console.log(_.intersection(a, b)); // 積集合(intersection) [3,4]
```

英単語をキチンと覚えておくの大事。
vSphere ESXi の仮想マシンのシリアルコンソールを使う

# 概要

vSphere ESXi (4.1 以降?) はネットワーク経由でゲストのシリアルポートに接続できるが、ライセンスが必要になる。

無償ライセンスでもゲスト間をシリアルで接続することはできるので、ゲスト OS から他のゲスト OS のシリアルコンソールを使う。


# 仮想マシンの設定

ハードウェアの追加からシリアルポートを追加する。

![add_hardware.png](https://qiita-image-store.s3.amazonaws.com/0/44206/30e2dcb8-67a3-d2ef-524c-5316a555917c.png)

名前付きパイプを選択する。

![serial_port_type.png](https://qiita-image-store.s3.amazonaws.com/0/44206/0d1c5191-72fe-3e83-2528-92b62a35b43c.png)


何が正しいか分かっていないが、サーバ・クライアントの組み合わせは逆になっても動作した。
(クライアント・クライアント や サーバ・サーバ はダメだった)

![serial_config.png](https://qiita-image-store.s3.amazonaws.com/0/44206/9880afe7-6044-64f8-c2ee-5056e7bf6d94.png)

接続したい 2台のゲストの間で、パイプ名を合わせる。

![serial_config2.png](https://qiita-image-store.s3.amazonaws.com/0/44206/0b31f95b-6022-9de0-e9c8-e4776fc6611f.png)


どんなゲストが、どんな時に シリアルポートをポーリングモードで使うのか分からないが、OFF にしてみた。


# ゲストOSの設定
ゲストOSでも設定が必要だが、割愛する。
CentOS 6 での設定例は以前書いた。
http://qiita.com/albatross/items/8404215ada12f562fe35#2-5

# シリアルコンソールを使ってみる

ゲスト OS で ttyS0 に接続する。

```console:シリアルポートに接続
# screen /dev/ttyS0

<Enter を叩く>

CentOS release 6.5 (Final)
Kernel 2.6.32-431.el6.x86_64 on an x86_64

test.local login: root
Password:
Last login: Tue Jun 17 13:54:29 on tty1
[root@test ~]#
```

無事にシリアル接続できた。

# 参考資料

無償ライセンスではリモートシリアルは使えないが、
設定する場合は以下の KB を読めばできそう。

* [VMware KB: 2004954 - 
Configuring Serial Port Communication over Network between two virtual machines](http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2004954)
* [VMware KB: 2020669 - Troubleshooting network and TCP/UDP port connectivity issues on ESX/ESXi ](http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2020669)
FireFoxで「このWebサイトとのすべての通信が暗号化されていません」と表示される件について

#現象
FireFoxであるページA(http)からページB(https)に遷移する際に標題のメッセージが表示される。


```
このWebサイトは認証されていません。

このWebサイトとのすべての通信が暗号化されていません。
画像などの暗号化されていない要素が含まれています。
```

なお再現性は100%ではなく起きない時もある。
(しかもFireFox以外では起きない)

#原因
FireFoxのバグ。(ソースがないので微妙だけど、FFしか発生しないから多分あってると思う)
ちなみに私の方で再現したバージョンは30.0。

#詳細
発生条件がかなり微妙なので書いておく。

　【前提】
　　・httpのページA
　　・httpsのページB
　　・ページAからページBにリンクがあり、かつページ内にmouseoverイベントの実装がある
　　　＃mouseoverイベントがページAとページBの片方か両方のどっちにあるのが悪いか微妙だけど、
　　　　ページA(http)とページB(https)に共通ヘッダーがあって、ページAのメニューはimgタグで
　　　　マウスオーバーすると色が変わって、ページBへのリンクになってるみたいなページを
　　　　思い浮かべてもらえれば。

　【操作】
　　①ページA(http)でリンク(例えばimgタグ)をクリック
　　②ページBのロード中にimgタグの上でマウスを動かして画像を何回か切り替える
　　　↓↓↓
　　　ページBに遷移するとhttpsだけど最初に書いたメッセージが出る。

#補足
ページA→ページB時のリクエストを見てたら、jsとかcssとか全部httpsになるはずなのにたまにhttpがいる。
しかもhttpになってるリクエストは毎回変わる。
いろいろ調べてったら恐らくFireFoxのバグだろうって落ちだった。。。
ちなみにマウスオーバー時の画像がhttpだったとかそんなオチではない。

たぶんページBのリクエスト送るときに、本来入らないはずのページA内のhttp通信が混在してるのかなぁ
っていう想像。

類似の現象報告されてる。
http://forum.mozilla.gr.jp/cbbs.cgi?mode=al2&namber=57727&KLOG=
SwiftでSiriに喋ってもらった

AVSpeechSynthesizerを使ってSwiftでSiriを喋らせてみました。
ただ喋らせるだけのところまでではObjective-Cと書き方の違いはありませんでした。
今までSiriに触ったことのない方はSwiftを機会にやってみてはいかがでしょうか。面白いです。
サンプルコードをgithubにあげておきましたので、参考にしてみてください。[SwiftSiri](https://github.com/ktanaka117/SwiftSiri)
![2014-06-17 22.07.56.png](https://qiita-image-store.s3.amazonaws.com/0/46597/d00ab6b9-49b4-6a23-9856-f5bd11fbcdcf.png)

なお、動作検証の結果シミュレーターではSiriが動かないようなので実機で実行してみてください。
Comparison of Tuple

You cannot operator `==` for tuple.

```swift
1 == 2 //  false

(1, 2) == (1, 3) // Could not find an overload for '==' that accepts the supplied arguments
```

However you can write same code in Scala.

```scala

1 == 2 // false

(1, 2) == (1, 3) // false
```

Though, the most use case of tuple is returning multiple values from some function. I think if I can compare tuple data in more simple way, it will be nice feature of Swift.
AutoItからDLLを使う

AutoItからdllを呼び出して使ってみる。
サンプルとして、user32.dllの関数を呼び出して、アクティブウインドウのサイズを取得してみる。

##サンプルコード
```autoit:CallUser32.au3
;---------------------------------------------
;アクティブウインドウのサイズを取得してみる
;---------------------------------------------

$user32 = DllOpen("user32.dll")

;座標値を入れる構造体を作成
$srect = "long left; long top; long right; long bottom"
$testrect = DllStructCreate($srect)

;初期化
DllStructSetData($testrect, "left", 0)
DllStructSetData($testrect, "top", 0)
DllStructSetData($testrect, "right", 0)
DllStructSetData($testrect, "bottom", 0)

;アクティブウインドウのハンドルを取得
$activehwnd = DllCall($user32, "HWND", "GetForegroundWindow")

;アクティブウインドウのウインドウサイズを取得し$testrectに
$rect = DllCall($user32, "bool", "GetClientRect", "HWND", $activehwnd[0], "ptr", DllStructGetPtr($testrect))

;画面に座標を表示
$right =  DllStructGetData($testrect, "right")
$bottom = DllStructGetData($testrect, "bottom")
MsgBox(0, "CallUser32.dll", "右下の相対座標は(" & $right & "," & $bottom & ")")

;公式で推奨されているのでClose
DllClose($user32)

```
ここでは左上端と右下端の座標値を取得しているが、
座標値は相対座標になっている。つまり左上端の座標値は常に(0,0)。
ということは、アクティブウインドウの右下端の座標値がアクティブウインドウの大きさですね。

##参考
* [Function DllCall](http://open-shelf.appspot.com/AutoIt3.3.6.1j/html/functions/DllCall.htm)
* [GetClientRect関数](http://msdn.microsoft.com/ja-jp/library/cc364604.aspx)
ファイル名と同じディレクトリを作って中にファイルを移動する

```ps1
function Get-Basename($filename) {
   #ファイル名から拡張子を取り除く
   $filename = $filename.Replace(".tif","")

   #ファイル名からカッコを取り除く
   $idx = $filename.LastIndexof("(")
   if ( $idx -ge 1) {
      $filename = $filename.Remove($idx)
   }

   #拡張子とカッコを除いたファイル名を戻り値として返す
   return $filename
}

function Create-Surveyname($filename) {
   #初期値設定
   $i = 1
   $basename = "sokuryouzu"
   $ex = ".tif"
   $n = "0" + $i.ToString()
   $svname = $basename + $n + $ex

   #sokuryouzu01から同じファイル名が存在しなくなるまで数字を大きくする
   while (Test-Path(".\" + $filename + "\" + $svname)) {
      #カウンターを上げる
      $i++

      #カウンターが1桁だった場合は2桁になるようにゼロ埋めする
      if ( $i.Length -ne 2 ) {
         $n = "0" + $i.ToString()
      }else{
         $n = $i.ToString()
      }

      #新しい番号で名前を作り直す
      $svname = $basename + $n + $ex

   }

   return $svname

}

Get-ChildItem -Name *.tif | Sort-Object | ForEach-Object {
   #ファイル名から拡張子とカッコを取り除く
   $basename = Get-Basename($_)

   #ファイル名のディレクトリを確認して存在しなければディレクトリを作成する
   if ( (Test-Path($basename)) -eq $False) {
      New-Item -Type Directory $basename
   }

   #新しいファイル名を設定
   $svname = Create-Surveyname($basename)
   $svname = ".\" + $basename + "\" + $svname

   #TIFFファイルを所定のファイル名に変更して移動する
   Move-Item $_ $svname

   echo $svname
}
```

`%地番%.tif`というTIFFファイルがあるディレクトリで実行すると、`%地番%`ディレクトリを作ってからTIFFファイルを`sokuryouzu##.tif`という名前に変更して移動するスクリプトです。

例によって<a href="http://www.moj.go.jp/MINJI/minji101.html">不動産登記規則第73条第１項の規定により法務大臣が定める土地所在図等の作成方式</a>で定められたファイル名に変更しています。

1つの地番が複数枚になっていた場合、ファイル名がカッコ番号で順番に並んでいれば`sokuryouzu##.tif`の`##`を順に大きい数字にしていきます。

たとえば、`100-1(1-3).tif` `100-1(2-3).tif` `100-1(3-3).tif`という図面があったら、`100-1`というディレクトリを作成し、その中にそれぞれ`sokuryouzu01.tif` `sokuryouzu02.tif` `sokuryouzu03.tif`というファイル名に変更して移動されるはずです。

たぶんこれで大丈夫…。


##ファイル名が正しく変更できないバグがあったので修正

```ps1
-      if ( $i.Length -eq 1 ) {
+      if ( $i.Length -ne 2 ) {
```

```ps1
-Get-ChildItem -Name *.tif | ForEach-Object {
+Get-ChildItem -Name *.tif | Sort-Object | ForEach-Object {
```
vimからdbにアクセスするためのplugin作りました

https://github.com/kamichidu/vim-vdbc

Relational DataBaseに対して、低レベルなクエリ実行系を提供するためのpluginです。
現状サポートしているRDBMSは、PostgreSQLとSQLite3です。

特定のdbに依存しない作りになってるはずなので、driverというモジュールを追加することによって、対応dbを増やせます。
標準添付のdriverは、

* pg

    * psqlコマンドに依存

    * vimprocに依存

* pg\_libpq

    * コンパイルが必要

* sqlite3

    * sqlite3コマンドに依存

    * vimprocに依存

* sqlite3\_libsqlite3

    * コンパイルが必要

        win64用のコンパイル済バイナリを同梱しているので、win64環境ならばコンパイルせずに最初から利用できます。
        またsqlite3のソースを同梱しているため、\*nix環境でのコンパイルも、コンパイラがあればOKです。

です。
sqlite3サポートは、mattnさんが即座にpr送ってくれました。ありがとうございます。

mysqlや他のdbについては、patches wellcomeなスタンスです。

使い方について少しだけ。
細かいところは `:help` から参照してください。

```vim
try
    " コネクションの取得
    " 文字列のみで接続情報を渡すためには、↓
    " sqlite3* というのは、ドライバ名称をワイルドカードで指定可能でかつ、driverが持つ優先度の設定に従ってドライバを自動で選択します
    let C= vdbc#connect_by_dsn('vdbc:sqlite3*:dbname=:memory:')
    " または、辞書で接続情報を渡すこともできます
    " この方法だと、ドライバのワイルドカード指定はできません
    let C= vdbc#connect({
    \   'driver': 'sqlite3_libsqlite3',
    \   'dbname': ':memory:',
    \})

    " prepared statementを実行する
    " まず、statement handleを構築します
    let stmt= C.prepare('insert into a_table (column1, column2) values (?, ?)')

    " prepared文に対して、パラメータを渡して実行します
    call stmt.execute(['value1', 'value2'])
    call stmt.execute([1, 'value2'])

    " 使い終わったら、開放します
    call stmt.finish()

    " select結果をリストで取得します
    " この書き方はprepared文を作成し、その後パラメータを渡して実行、最後に開放という、↑で行ったやり方の簡易版です
    echo C.select_as_list('select * from a_table') " => [[value1, value2], [value1, value2], ...]
    " なので、パラメータを渡すことができます
    echo C.select_as_list('select * from a_table where column1 = ?', ['value1'])
    " select結果を辞書で取得します
    echo C.select_as_dict('select * from a_table') " => [{'column1': value1, 'column2': value2}, {'column1': value1, 'column2': value2}, ...]
    " こちらも同様に、パラメータを渡すことができます
    echo C.select_as_dict('select * from a_table where column1 = ?', ['value1'])
finally
    " 切断します
    " vim終了時に自動的にすべてのコネクションは開放されますが、明示的にやったほうが良いです
    if exists('C')
        call C.disconnect()
    endif
endtry
```
Git の commit-msg hook でコミットメッセージにチケット番号が含まれるかチェックする

# Git の commit-msg hook でコミットメッセージにチケット番号が含まれるかチェックする

## 概要

ここ最近のBTSのチケットとバージョン管理ツールは  
コミットコメントによる連携機能が標準で搭載されているものが多いです。  

しかしコミット時にチケット番号を記述し忘れて連携できず・・・などと言うことがあると思います。  
git は履歴の改ざんができるので後から修正することもできますが、少し手間がかかります。  
そこで、フックを利用してチケット番号を含んでいないコミットを拒否するようにします。  

## commit-msg フック

commit-msg入力後に処理を挿入できます。  
下記ファイルに処理を記述します。  

~~~
./.git/hooks/commit-msg
~~~

記述する言語は好みで。  
私はRubyが好きなのでRubyで書きました。

## commit-msg コード

Rubyで書きました。  
BTSが要求するチケット番号は シャープと数字の書式だとします。  
例えば「#9」や「#25」。  

.git\hooks\commit-msg  

~~~ruby
#!/usr/bin/env ruby
message = File.read(ARGV[0])

$regex = /#\d+/

if !$regex.match(message)
  puts "[POLICY] No Ticket No Commit!!"
  exit 1
end
~~~

## チケット番号なしでコミット

~~~bash
$ git commit -m 'no ticket No'
[POLICY] No Ticket No Commit!!
$ echo $?
1
# コミットがキャンセルされたことを確認
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   hoge.txt
#
~~~

## チケット番号ありでコミット

~~~bash
$ git commit -m '#23 fix hoge.txt'
[master 2b98dfa] #23 fix hoge.txt
 1 files changed, 1 insertions(+), 0 deletions(-)
$ echo $?
0
# コミットされたことを確認
$ git status
# On branch master
nothing to commit (working directory clean)
~~~

## 備考
フックを利用してこんなことをすると良いかも

* README.mdなどドキュメントしか変更していない場合はコミットコメントを改ざんして [ci skip] を付与し、  
  Travis CIをスキップする
* コミットコメントが1行目に見出し、2行目に空行、3行目以降に詳細、のフォーマットになっているかチェックする
RuboCop | Style/AlignHash | EnforcedLastArgumentHashStyle

# RuboCop | Style/AlignHash | EnforcedLastArgumentHashStyle

## 概要

RuboCopの「Style/AlignHash EnforcedLastArgumentHashStyle」警告について。
メソッドの最後の引数がHashで、複数行で記述する場合の位置スタイルについて。

### 設定値一覧

|設定対象|設定値|内容|デフォルト|
|:-------|:-----|:---|:--------:|
|EnforcedLastArgumentHashStyle|always_inspect|常に検査する|○|
|EnforcedLastArgumentHashStyle|always_ignore|常に無視する|--|
|EnforcedLastArgumentHashStyle|ignore_implicit|暗黙のHashだけ無視する|--|
|EnforcedLastArgumentHashStyle|ignore_explicit|明示のHashだけ無視する|--|

## EnforcedLastArgumentHashStyle

always_inspect, always_ignore, ignore_implicit, ignore_explicit  
の各値での rubocop 実行結果をまとめます。

### 検証プログラム

enforced_last_argument_hash_style.rb

~~~ruby
def implicit(options = {})
  'implicit' + options
end

def explicit(options = {})
  'explicit' + options
end

implicit(key1: 1,
  key2: 2)
explicit({ key1: 1,
  key2: 2 })
~~~

### EnforcedLastArgumentHashStyle always_inspect(デフォルト) でチェックした場合

.rubocop.yml

~~~yaml
AlignHash:
  EnforcedLastArgumentHashStyle: 'always_inspect'
BracesAroundHashParameters:
  Enabled: false
~~~

暗黙、明示双方のHashが警告対象になります

~~~bash
$ rubocop enforced_last_argument_hash_style.rb
Inspecting 1 file
C

Offenses:

enforced_last_argument_hash_style.rb:10:3: C: Align the elements of a hash literal if they span more than one line.
  key2: 2)
  ^^^^^^^
enforced_last_argument_hash_style.rb:12:3: C: Align the elements of a hash literal if they span more than one line.
  key2: 2 })
  ^^^^^^^

1 file inspected, 2 offenses detected
~~~

ちなみに下記のようにすると警告が消えます

~~~ruby
def implicit(options = {})
  'implicit'
end

def explicit(options = {})
  'explicit'
end

implicit(key1: 1,
         key2: 2)
explicit({ key1: 1,
           key2: 2 })
~~~

### EnforcedLastArgumentHashStyle always_ignore でチェックした場合

.rubocop.yml

~~~yaml
AlignHash:
  EnforcedLastArgumentHashStyle: 'always_ignore'
BracesAroundHashParameters:
  Enabled: false
~~~

暗黙、明示双方のHashが警告対象外になります

~~~bash
$ rubocop enforced_last_argument_hash_style.rb
Inspecting 1 file
.

1 file inspected, no offenses detected
~~~

### EnforcedLastArgumentHashStyle ignore_implicit でチェックした場合

.rubocop.yml

~~~yaml
AlignHash:
  EnforcedLastArgumentHashStyle: 'ignore_implicit'
BracesAroundHashParameters:
  Enabled: false
~~~

明示のHashのみ警告対象になります

~~~bash
$ rubocop enforced_last_argument_hash_style.rb
Inspecting 1 file
C

Offenses:

enforced_last_argument_hash_style.rb:12:3: C: Align the elements of a hash literal if they span more than one line.
  key2: 2 })
  ^^^^^^^

1 file inspected, 1 offense detected
~~~

### EnforcedLastArgumentHashStyle ignore_explicit でチェックした場合

.rubocop.yml

~~~yaml
AlignHash:
  EnforcedLastArgumentHashStyle: 'ignore_explicit'
BracesAroundHashParameters:
  Enabled: false
~~~

暗黙のHashのみ警告対象になります

~~~bash
$ rubocop enforced_last_argument_hash_style.rb
Inspecting 1 file
C

Offenses:

enforced_last_argument_hash_style.rb:10:3: C: Align the elements of a hash literal if they span more than one line.
  key2: 2)
  ^^^^^^^

1 file inspected, 1 offense detected
~~~

## 補足
この警告は `rubocop -a` で修正可能です。
Scalaにおけるプライベートコンストラクタの定義方法について

シングルトンを表現する場合や自身のファクトリメソッド経由でのみ生成を強制させたい場合などの利用シーンにおいてコンストラクタを隠蔽するということがよく行われる。

Javaだと以下の様にコンストラクタにprivate宣言するだけだ。

```java:java
private Foo(String name) {
```

Scalaの場合はコンパニオンオブジェクトがあるため、コンパニオン経由で生成をするようにしている場合もやはり直接のnewを防ぎたい。
しかしながら、Javaと同じように以下のようにしてしまうとコンパニオンからもアクセス出来なくなってしまうという困った問題がある。

```scala
private class Foo(name: String) {
```

以下の様に書けばパッケージプライベートになり、コンパニオンからアクセスできるようになるもののスコープが不必要に広がってしまう。

```scala
private[pkg] class Foo(name: String) {
```

スコープを不必要に広げることなく、自身とコンパニオンからだけアクセスできるようにする定義方法は以下のように記述する。

```scala
class Foo private (name: String) {
```
Swiftでもカテゴリー的なクラス拡張したいよね.

extension使えば良いだけですね.
シンプルになりましたね.

    extension NSString {
        func toURL() -> NSURL {
            return NSURL.URLWithString(self);
        }
        ...
    }

良かった良かった.
出来なくなったらどうしようかと.
[SystemVerilog]svlibがバージョンアップしてた。

##はじめに
なんとなくVerilab社のサイト眺めてたら、10日強前に[svlibが0.3バージョンアップしてた。](http://www.verilab.com/resources/svlib/)
ちょっと試してみることにした。

##前のバージョンとの差異
けっこうなメソッドが盛られている。ただし、ドキュメントに履歴が無いのでよくわからない。以前紹介した記事は[こちら。](http://qiita.com/tethys_seesaa/items/f4d10976677cdc8a63c0)
ここではドキュメントで新規に追加された「Simlation Environment Queries」を試してみる。

##Simlation Environment Queries
クラスはこんな感じで定義されている。

```sv
class Simulator extends svlibBase;
  static function string getToolName();
  static function string getToolVersion();
  static function qs getCmdLine();
endclass
```

functionの名前にある通り、シミュレーターの名前やバージョン、今走っているコマンドの引数とかをゲットすることができる。
「qs」という型はsvlibで定義されているもので、string型のqueueである。

でかいチップの開発だと、シミュレーションコマンドはシェルスクリプトやperlでラップされててわからないときがあるかもしれないこので、getCmdLine()は重宝するかもしれない。

##サンプル

```sv:tb.sv
`timescale 1ns/1ps

`include "svlib_macros.svh"

module tb ();

  import svlib_pkg::*;

  string  c[$];

  initial begin

    $display("%s", Simulator::getToolName());
    $display("%s", Simulator::getToolVersion());

    c = Simulator::getCmdLine();

    do
      $display("%s", c.pop_front());
    while(c.size()!=0);

    $finish(1);

  end

endmodule
```

これを実行すると、シミュレータ名、バージョン、コマンドオプションが出力される。

##おわりに
getToolVersion()は、シミュレーターのバージョンによって処理を替えるとか使えるかもしれない。でも返してくるのはstringなのでatoiとかいろいろ付け加える必要があるかも。
~~あと、コードをざっと拝見すると即時アサーションが入っているので、ModelSim-ASEだと動かないかも？？~~

ウソでした。EDA Playgroundで動くので、Modelsim-ASEでもいけます。


<blockquote class="twitter-tweet" lang="ja"><p>svlib 0.3 and ClueLib 0.2.0 SystemVerilog utility libraries are now on EDA Playground.</p>&mdash; EDA Playground (@EDAPlayground) <a href="https://twitter.com/EDAPlayground/statuses/479308827830276097">2014, 6月 18</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
Titanium TableView#scrollToIndex() の挙動がよくわからない件


ちょっとわからなかったのでメモ。

はっきりさせておきたかったのは、以下の２つ。

1. `TableView#scrollToIndex()`を使った時にscrollイベントは発火するのか。
2. `TableView#scrollToIndex()`の第一引数に、入っているデータの数より大きいインデックスを与えるとどうなるのか。


## `TableView#scrollToIndex()`を使った時にscrollイベントは発火するのか

結論： _発火しません_

画面上では普通にスクロールしますが、scrollイベントは発火しませんでした。
scrollイベントに基づいて動作するロジックのテストなどを行いたい場合は、`fireEvent()`を使って自力でscrollイベントを発火させるしかないようです。

自力でscrollイベントを発火させる場合、[イベントオブジェクトとして渡すオブジェクトのプロパティはリファレンスに書いてあります](http://docs.appcelerator.com/titanium/3.0/#!/api/Titanium.UI.TableView-event-scroll)。

```javascript
table.fireEvent("scroll", {(scrollイベントオブジェクトめいた何か)})
```

## `TableView#scrollToIndex()`の第一引数に、入っているデータの数より大きいインデックスを与えるとどうなるのか

結論： _何も起きません_

例えば

```javascript
var table = Ti.UI.createTableView({
	data: [(要素が30個入った配列)]
});
```

としてTableViewを作成した場合。
要素のインデックスは`0 - 29`であって、`30`はありません。
そこで

```javascript
table.scrollToIndex(30);
```

とすると、TableViewはぴくりとも動きません。
最後の行までスクロールさせたい場合は、

```javascript
table.scrollToIndex(table.data.length - 1);
```

とすることで最終行までスクロールさせることができます。
ただし`TableViewSection`だとかが混じると上手く行きません。
[TableViewの`data`プロパティのリファレンス](http://docs.appcelerator.com/titanium/3.0/#!/api/Titanium.UI.TableView-property-data)を見ると戻り値は

```
Dictionary/Titanium.UI.TableViewRow[]/Titanium.UI.TableViewSection[]
```

とありますが、参照した結果がDictionaryだった経験がないので、以下のコードで最後までスクロールできるのではと思います。

```javascript
var totalRowCount = 0;
if(!!table.data[0].rowCount){
    table.data.forEach(function (section, i) {
        totalRowCount += section.rowCount;
    });
} else {
    totalRowCount = table.data.length;
}

table.scrollToIndex(totalRowCount - 1);
```

メソッド化するならこんな感じ。

```javascript
var tableViewScrollToBottom = function (table, animation) {
    if(table.data.length === 0) return;

    var totalRowCount = 0;
    if(!!table.data[0].rowCount){
        table.data.forEach(function (section, i) {
            totalRowCount += section.rowCount;
        });
    } else {
        totalRowCount = table.data.length;
    }

    table.scrollToIndex(totalRowCount - 1, animation);
};

// オブジェクトにメソッドを生やすならこんな感じで。
// (Appcelerator的には非推奨のようですが)
table.scrollToBottom = function (animation) {
    tableViewScrollToBottom(this, animation);
};
```

Titaniumのオブジェクトはprototype拡張ができないのがつらい。
祝日をWebAPIから取得するシェルスクリプト

# 平日・休日ログを自動的に仕分けしたい

ある仕事で、土日祝日のログを自動的に休日扱いしたいという要望があった。

> 土日だったらすぐにわかるけど、祝日ってどうすりゃいいのよ。
> 月日固定の日付や振替休日はいいとして、春分の日と秋分の日は調べようがないでしょ。
> (註:春分と秋分は、毎年天文観測によって二年後の月日が決められます)

休日設定ファイルでも作って毎年打ち込んでもらうしか……、と思っていたら **Google先生が囁いた。**

> Google Calendar APIを使いなさい。

# Google先生への質問状

というわけで、さらに詳しくGoogle先生に聞きつつ、ささーっと作ったのが下のシェルスクリプト。

```sh:holidays.sh
#! /bin/sh

# このURLは
# Googleカレンダーの「カレンダー設定」→「日本の祝日」→「ICAL」から取得可能
# (2017/01/12現在)
url='https://calendar.google.com/calendar/ical/ja.japanese%23holiday%40group.v.calendar.google.com/public/basic.ics'

curl -s "$url"                           |
sed -n '/^BEGIN:VEVENT/,/^END:VEVENT/p'  |
awk '/^BEGIN:VEVENT/{                    # iCalendar(RFC 5545)形式から
       rec++;                            # 日付と名称だけ抽出
     }                                   #
     match($0,/^DTSTART.*DATE:/){        # DTSTART行は日付であるから
       print rec,1,substr($0,RLENGTH+1); # 「レコード番号 "1" 日付」に
     }                                   #
     match($0,/^SUMMARY:/){              # SUMMARY行は名称であるから
       s=substr($0,RLENGTH+1);           # 「レコード番号 "2" 名称」に
       gsub(/ /,"_",s);                  #
       print rec,2,s;                    #
     }'                                  |
sort -k1n,1 -k2n,2                       | # レコード番号>列種別 にソート
awk '$2==1{printf("%d ",$3);}            # # 1レコード1行にする
     $2==2{print $3;       }             #
     '                                   |
sort                                     # 日付順にソートして出力
```

ソースコードの中にもメモしているが、祝日一覧を返してくるWebAPIのURLは次のように辿れば見つけることができる。(2014/11/29現在)

1. ログインしてGoogleカレンダーを開く（ただし最終的に得られたURL自体はログインせず利用可能）
2. （歯車マークアイコンの中の）「設定」メニュー
3. 画面上部に「全般」「カレンダー」とある「カレンダー」タブ
4. 「日本の祝日」リンク
5. 「カレンダーのアドレス」行にある"ICAL"アイコン

また、例えGoogleがiCalendar形式の配信やカレンダーサービスを止めたとしても、iCalendarはRFCで標準化された規格なので、どこかしらがやっているはず。（Google先生に聞いてみよう）

# 実行してみる

```shell-session:実行例
$ holidays.sh
20130101 元日
20130114 成人の日
20130211 建国記念の日
20130320 春分の日
20130429 昭和の日
20130503 憲法記念日
20130504 みどりの日
20130505 こどもの日
20130506 こどもの日_振替休日
20130715 海の日
20130916 敬老の日
20130923 秋分の日
20131014 体育の日
20131103 文化の日
20131104 文化の日_振替休日
20131123 勤労感謝の日
20131223 天皇誕生日
20140101 元日
20140113 成人の日
20140211 建国記念の日
20140321 春分の日
20140429 昭和の日
20140503 憲法記念日
20140504 みどりの日
20140505 こどもの日
20140506 みどりの日_振替休日
20140721 海の日
20140915 敬老の日
20140923 秋分の日
20141013 体育の日
20141103 文化の日
20141123 勤労感謝の日
20141124 勤労感謝の日_振替休日
20141223 天皇誕生日
20150101 元日
20150112 成人の日
20150211 建国記念の日
20150321 春分の日
20150429 昭和の日
20150503 憲法記念日
20150504 みどりの日
20150505 こどもの日
20150506 憲法記念日_振替休日
20150720 海の日
20150921 敬老の日
20150922 国民の休日
20150923 秋分の日
20151012 体育の日
20151103 文化の日
20151123 勤労感謝の日
20151223 天皇誕生日
$ 
```

Google先生は、当年とその前後1年の祝日一覧を教えてくれる。ご覧のとおり、振替休日が発生する場合は元の日付に加えて振替日も示してくれる。日付だけが欲しくて名称が邪魔な場合は最後のsortコマンドの後に、`| awk {print $1}`などを付け足せばよいので簡単だ。

ちなみに以前は「クリスマスも祝日だ」とGoogle先生はお答えになっていたが、それはなくなったようだ。
Wordpresの".gitignore"を考える。

WordpressのプロジェクトをGithubにPushする前に

// 本番環境とローカル環境のURLは違うので除外
.htaccess

// データベース設定とか、環境依存の内容なので除外
wp-config.php

// 管理画面から画像とかアップロードしたときの保存先
wp-content/uploads/

// ログ関係は必要ないので除外
*.log

ひとまずここまで
nodebrewを使ってNode.jsをインストールする

:warning: nodebrewがインストールされている前提でのお話となります :warning: 

## nodebrewがインストールされているか確認する

- nodebrewが入っているかを以下のコマンドで確認できます

```sh:check_nodebrew
nodebrew -help
```

nodebrewがインストールされていない場合は、[コチラ](http://qiita.com/kentana20/items/05f1a4af9812398863fa)から、nodebrewをインストールしてから、以下を実施してください。

# nodebrewを使ってNode.js（安定版）をインストールする

```sh:node.js_install
nodebrew install stable # バージョンを指定したい場合はstableをバージョン番号に変更する
```

- インストールが完了したら、以下のコマンドで利用するバージョンを指定します

```sh:set_use_version
nodebrew use 0.10.29 # 利用するバージョンを指定
```

- Node.js の動作確認

```sh:check_node.js
node -v
```

これで

```sh 
v0.10.29
```

と出力されれば、Node.jsが使用できます :star:
ゲスト用VLANを構築してみる

社内ネットワークに直接影響を与える事ができない、隔離されたゲスト専用VLANを構築してみます。

# 設定概要
大まかな設定内容は下記の通りです。

* ゲスト用VLAN追加
 * ゲスト用VLANを追加します。 
* DHCP設定
 * ゲスト用VLANから、既存の社内ネットワーク上のDHCPサーバへの通信はさせない為、ゲスト用VLANに対するDHCP設定をスイッチ側に追加します。
 * DNSも社内ネットワーク上のものではなく、インターネット上のものを参照させます。
* ACL(アクセスリスト)設定
 * 既存の社内ネットワークへの通信はさせず、インターネット通信のみが可能になるようなアクセスリストを作成し、ゲスト用VLANへ適用します。

# 設定例(CISCOの場合)
設定はL3スイッチで行います。
今回の設定に必要な部分のみを抜粋しています。
他社製のスイッチでも、記述や用語は異なりますが同様の設定は可能です。


```shell-session:CiscoIOS
!-------------------------------------------------
!- DHCP設定 
!-------------------------------------------------
ip dhcp excluded-address 172.16.99.1 172.16.99.99
ip dhcp excluded-address 172.16.99.200 172.16.99.255
!
ip dhcp pool GUEST
   network 172.16.99.0 255.255.255.0
   default-router 172.16.99.254 
   dns-server 8.8.8.8 8.8.4.4 
   lease 0 4
!-------------------------------------------------
!- Interface設定
!- Trunc接続(タグVLAN)、ACL適用
!-------------------------------------------------
interface GigabitEthernet1/0/1
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 1-254
 switchport mode trunk
 ip access-group acl_GUEST in
　　　　：
　　　　：
!-------------------------------------------------
!- VLAN設定
!- Vlan10は一般用(DHCPリレー)
!- Vlan99はGUEST用
!-------------------------------------------------
interface Vlan10
 ip address 172.16.10.254 255.255.255.0
 ip helper-address 172.16.XXX.XXX
!
interface Vlan99
 ip address 172.16.99.254 255.255.255.0
!
ip default-gateway 172.16.254.1
ip classless
ip route 0.0.0.0 0.0.0.0 172.16.254.1
!-------------------------------------------------
!- ACL設定
!- デフォルトゲートウェイへの通信のみPermit
!- その他通信は全てDeny
!-------------------------------------------------
ip access-list extended acl_GUEST
 permit ip 172.16.99.0 0.0.0.255 host 172.16.99.254
 deny   ip 172.16.99.0 0.0.0.255 172.16.0.0 0.0.255.255
 permit ip any any
!
```
以上です。

ゲストのPCを一時的にネットワークへ参加させる場合や、会議室等にゲスト用無線LANアクセスポイントを提供する場合に、このようなVLANを適用すれば社内ネットワークを守ることができます。
Travis CIとxcprettyを併用すると正しくレポートされないときの対処


## xcpretty
https://github.com/supermarin/xcpretty

コマンドラインからiOSのテストを実行すると長々とログが出るのでキレイに整形してくれるツール

```xcpretty
$ gem install xcpretty
$ xcodebuild [flags] | xcpretty -c
```


## Travis CI
https://travis-ci.org/

CIのホスティングサービス。自分でjenkins管理するのは辛いけどきちんとテストしたい！といったときに使う。
githubのプルリクエストとかにそのブランチの最新のテスト結果を表示してくれる。

実行したいコマンドは`.travis.yml`というyamlファイルをgitリポジトリのルートに配置する。
例えば上記のxcprettyを使ったコマンドの場合

```
script:
  - xcodebuild [flags] clean build test | xcpretty
```

上記のように記述します。


## xcprettyとTravis CIを併用する
このTravis CIとxcprettyを併用すると、レポート結果がうまく出力されないことがあります。
具体的にはテスト自体はこけているのにtravisからはsuccessとしてレポートされてしまいます。


この点についてはこちらの記事
http://qiita.com/radioboo/items/bb3bba734a68f0c25c81

やxcprettyのgithub
https://github.com/supermarin/xcpretty#usage

などで言及されているようにPIPESTATUSを引き継いでexitすればよいとされています。

## それでも直らない場合
上記の様に.travis.ymlを

```
script:
  - xcodebuild [flags] clean build test | xcpretty -c && exit ${PIPESTATUS[0]}
```

としてもテストが失敗する場合があります。
travisの中の人に問い合わせたところ、exitコマンドを直接使うのはTravisと相性がよくないようです。
それを回避するために一枚ラッパスクリプトをかますと良いとのアドバイスを頂きました。

そこで

```run_test.sh
#!/bin/bash

xcodebuild [flags] clean build test | xcpretty -c && exit ${PIPESTATUS[0]}
```

のようなスクリプトを一段用意してやり、`.travis.yml`には

```.travis.yml
  - bash ./run_test.sh
```


としてやれば、テストの実行結果とレポート結果が同じになります。
CentOSにnodebrewをインストールする

# CentOSにnodebrewをインストールする

CentOSにnodebrewをインストールする方法を記します。

## nodebrewをダウンロードする

```sh:download_nodebrew
# 証明書のエラーが出る場合は --no-check-certificateオプションを付ける
wget git.io/nodebrew
```

## nodebrewをインストールする

```sh:install_nodebrew
perl nodebrew setup
```

:star: インストールが完了すると、~/.nodebrew/ ができています :star: 

## pathを通して、.bashrc/.zshrcを読みなおす

```sh:path
export PATH=$HOME/.nodebrew/current/bin:$PATH
source ~/.bashrc #zsh使ってる人は source ~/.zshrc
```

## nodebrew動作確認

```sh:check_nodebrew_help
nodebrew help
```

nodebrewのヘルプが表示されればインストール完了です :+1: 

```
nodebrew 0.7.4

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:
    nodebrew install v0.10.22     Install a specific version number
    nodebrew use v0.10.22         Use a specific version number
```
Omnibus InstallerでインストールしたChefにknife-soloを入れる


Chefをワンクリックでインストールするソリューションとして"Omnibus Installer"というものがあります。Linuxだとワンライナーでインストールができます。

Omnibus Chef Packaging | Chef Blog http://www.getchef.com/blog/2012/06/29/omnibus-chef-packaging/
Install Chef | Chef http://www.getchef.com/chef/install/

から取得できます。


# 結論

さて、結論から言うと

    # /opt/chef/embedded/bin/gem install knife-solo

でインストールができます。もちろん```sudo```とか```--no-ri --no-rdoc```とかは必要に応じて付ける必要があります。

簡単に言うと、Omnibus Installerはシステムを汚さないように自前のRuby環境を作るのですが、それが```/opt/chef/embedded/bin```に入っているという、それだけなんですけどね。

もちろん```/opt/chef/embedded/bin/ruby```にrubyがあります。

簡単ですね！
「うわー、コードハイライトの先頭に変な空白入っちゃってるよ、どうするのこれ」という事態がhamlを使っているときに起こったとき


## 起こりえるケース

hamlを使っていて、かつMarkdownのレンダラーを使っているとき。preタグの中にhamlが変なスペースを突っ込んでくるのでつらい。

## 解決方法

config/initializer/haml.rbといったファイルを作成し、以下のように書く。

```ruby
Haml::Template.options[:ugly] = true
```

hamlがインデントに応じた綺麗なhtmlを吐かなくなるけど、別にインデントなくて良くね？とも思う。
tmux起動時に画面分割してサイズ調整させる

サーバにsshで接続してターミナルで作業とかに必須のtmux。
万一ネットワークが切断しても作業再開できるし、一つのターミナルで複数画面を表示できる。
ただそのままだと新規にセッションを立ち上げた際に、画面を分割してその後にサイズ調整してってめんどくさいよね。
だったら、毎回手動で行わずに自動で行えるようにしてしまおうぜ！

今回は画面上側をメインの作業領域としてエディタなどを起動して使用。
下側のウィンドウを左右に分割して左側をコマンドなどを実行する領域。
右下はデーターベース接続などサブでコマンドを実行する領域としたい。
なので、上側のウィンドウをどどーんと大きくし、右下より左下のほうが大きくする。

## 画面を分割してサイズを指定する

tmuxを起動時に分割表示してサイズ調整も行う方法を明記。
セッションを新規に作成する際に読み込むように以下のファイルを作成する。
ホームディレクトリに.tmuxディレクトリを作成し、分割＆リサイズ処理を明記したファイルをnew-sessionと命名したテキストファイルに作成する。
環境や好みによって高さや幅は変更するといい。
内容は以下の通り。

```bash:~/.tmux/new-session
# 一番初めのpaneを選択
select-pane -t 0
# 上下にウィンドウを分割する
split-window -v
# 1番目(下側)のウィンドウを選択
select-pane -t 1
# 左右にウィンドウを分割
split-window -h

# メインとなるウィンドウの高さを35行に設定
setw main-pane-height 35
# 上下分割レイアウトを反映
select-layout main-horizontal
display-panes

# 2番目(右下)のpaneの横幅（境界)を右に22文字幅移動する
resize-pane -R -t 2 22
```



## 自動で分割処理を行うエイリアス設定

``tmux new-session \; source-file ~/.tmux/new-session`` コマンドを実行する様にすればok！
tmuxが起動していない場合にtmuxコマンドが実行され、かつattachできない場合に新規にセッションを立ち上げて分割設定処理を反映させる。
あと ``tmux -2`` とする事で、tmux上のvimとかもろもろ256色表示で使えちゃう！！
~/.bashrcに以下の通りに設定すれば反映される。zshで使う場合も ~/.zshrc に同じ内容で。

```bash:~/.bashrc
# tmuxが起動していない場合にalias設定を行う
if [ $SHLVL = 1 ]; then
    # tmuxにセッションがなかったら新規セッションを立ち上げた際に分割処理設定を読み込む
    alias tmux="tmux -2 attach || tmux -2 new-session \; source-file ~/.tmux/new-session"
fi
```

これで ``source ~/.bashrc`` なりを実行して反映させれば自動化完了だ。
``tmux`` コマンド実行だけで復帰または分割画面で新規起動を勝手にしてくれる！！
Ruby On Rails Gemまとめ -gon-


##gonとは
「gon」はRailsで定義した変数をJavascript内で利用できるようにする。（コントローラからデータの受け渡しが可能になる。）

##インストール・設定
Gemfileに以下を追加。

```bash:
gem "gon"
```


ターミナルで` $ bundle install `を実行。

bundle install後、ヘッダー（app/views/layouts/application.html.erb）に以下の１行を追加。

```:application.html.erb
...
...
<title>TITLE</title>
<%= include_gon %> ←追加！！
<%= stylesheet_link_tag  "application", media: "all" %>
<%= javascript_include_tag  "application" %>
...
...
```

##使い方

コントローラ内で「gon.*****」と設定します。

```ruby:app/controllers/users_controller.rb
class UsersController < ApplicationController
  def index
    gon.user_name = "user_name"
    gon.user_age = 24
    gon.user_favorite_food = ["curry", "sandwich", "steak"]

	#すべての変数を参照
	gon.all_variables  # => {"user_name", 24, ["curry", "sandwich", "steak"]} 

	#クリア
	gon.clear  # => {}

  end
end
```

Javascriptファイルでは、「gon.*****」でアクセスできます。

```Javascript:app/assets/javascripts/users.js.coffee
alert(gon.user_name)  // => user_name
alert(gon.user_age)  // => 24
alert(gon.user_favorite_food)  // => ["curry", "sandwich", "steak"]
```
Time.nowをここだけUTC時間で使いたい

他システムとの連携でここだけUTC表示にしたい時につかった
なおシステムでは日本標準時間になっているものとする


before

```ruby
base_time = Time.now
```

after

```ruby
base_time = Time.now.utc
```

なおこうするとfluentd先生がイミフなエラーを起こしたが原因まで調べてない

```ruby
base_time = Time.now.gmtime
```
iOSのプラグにヘッドフォンがささっているか確認

出回っている情報がわりと古くなっていて、アプリの起動時からイヤフォンがささっているとうまく認識されなかったりするので、最新の情報を共有しておきます。

```objc
- (BOOL)headphonesArePlugged
{
  AVAudioSession * session = [AVAudioSession sharedInstance];
  
  __block BOOL plugged = NO;
  
  AVAudioSessionRouteDescription * routeDesc =  session.currentRoute;
  [routeDesc.outputs enumerateObjectsUsingBlock:^(AVAudioSessionPortDescription * desc, NSUInteger idx, BOOL *stop){
    if ([desc.portType isEqualToString:AVAudioSessionPortHeadphones]) {
      plugged = YES;
    }
  }];
  return plugged;
}
```

これで端末にヘッドフォンがささっているかを取得できます。
チャットワーク等にコピペで使える電話メモ

# チャットワーク等にコピペで使える電話メモ

下記の文章をコピペして使う。

```
【電話メモ】
・日時：2014年xx月xx日 xx時xx分頃
・会社名・名前：
・用件：
・電話番号：

以上です。
ご確認をお願いいたします。
```

## 例

```
【電話メモ】
・日時：2014年6月17日 17時10分頃
・会社名・名前：◯◯株式会社の△△様
・用件：▽▽の件でお電話したとのことでした。折り返しのお電話をいただきたいとのことでしたので、折り返しのお電話をお願いいたします。
・電話番号：000-0000-0000

以上です。
ご確認をお願いいたします。
```

## 注意事項

- 電話番号は可能な限り聞くこと。
    - この電話メモを見た人が、この電話メモを見ただけで折り返し電話できるようにする。
    - 折り返しの電話は不要と言われても、電話番号は聞くこと。
        - 折り返しが不要かは自分だけで判断しない。
    - 相手が電話番号を言いたくないような場合は、無理に聞かなくても良い。
テキストファイルへの出力

```java
try{
	File newfile = new File("/Users/shyu/Documents/test.text/");
	newfile.createNewFile();

	if (checkBeforeWritefile(newfile)){
		PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(newfile)));

		pw.println();
// ↑テキストファイルに書きたい内容

		pw.close();
	}else{
		System.out.println("ファイルに書き込めません");
	}
}catch(IOException e){
	System.out.println(e);
}
private static boolean checkBeforeWritefile(File file){
	if (file.exists()){
		if (file.isFile() && file.canWrite()){
			return true;
		}
	}

	return false;
}
```
HubotでJenkinsジョブを実行する時のメモ

HubotでJenkinsジョブを実行する時のメモ


* VirtualBox 4.3.6 + vagrant 1.6.3 + CentOS 6.5
* node.js,npm,redisはyumでインストールします。

```
# nodejs,npm,redisをインストール
sudo yum install -y nodejs npm redis

# redisを起動しておく
sudo /etc/init.d/redis start

# hubotをインストール
sudo npm install -g coffee-script inherits hubot

# hubotを作成
hubot --create myhubot
cd myhubot
npm install

# jenkinsのスクリプトを読み込み
vim hubot-scripts.json
→"jenkins.coffee"を追加

# jenkinsのURLを環境変数に設定
echo 'export HUBOT_JENKINS_URL="http://example.com/jenkins"' >> ~/.bash_profile

# hubotを起動
bin/hubot
Hubot>

# jenkinsのジョブを起動する
Hubot> hubot jenkins build <ビルドジョブの名前>
```
Perlで配列をソートした後で先頭からn個の要素がほしかった

# Perlで配列をソートした後で先頭からn個の要素がほしかった

## 単純にsortとspliceで書くと2行になって嫌だった

こんな感じです。

```pl
use strict;
use warnings;
use Data::Dumper;

my $array_ref = [5,8,3,10,50,4,68,41,11];
my $array_ref2 = [];

@{$array_ref2} = sort { $b <=> $a } @{$array_ref};
splice @{$array_ref2}, 5;

print Data::Dumper::Dumper $array_ref2;

exit;
```

何がしたいのかはわかるのですが、2行も使うような内容でもないかな、という気持ちでした。
意外とこういう処理ってよくやるような気がするので、もっとすっきりしたかったのです。


## いろいろ試したら、こんな風にもかけました。

```pl
use strict;
use warnings;
use Data::Dumper;

my $array_ref = [5,8,3,10,50,4,68,41,11];
my $array_ref2 = [];

@{$array_ref2} = ( sort { $b <=> $a } @{$array_ref} )[0..4];
print Data::Dumper::Dumper $array_ref2;

```


結果は、両方同じで

```
$VAR1 = [
          68,
          50,
          41,
          11,
          10
        ];
```

なんとなく、すっきりしました。


## 速度的にはどうなの？

両方を100万回くらい回してみました。



```pl
use strict;
use warnings;
use Time::HiRes qw(gettimeofday tv_interval);

my $array_ref = [5,8,3,10,50,4,68,41,11];
my $array_ref2 = [];
my ( $t0, $t1, $et );

$t0 = [gettimeofday];
do{
	@{$array_ref2} = sort { $b <=> $a } @{$array_ref};
	splice @{$array_ref2}, 5;
} for 0..1000000;
$t1 = [gettimeofday];
$et = tv_interval($t0,$t1);
print "splice: $et\n\n";


$t0 = [gettimeofday];
do{
	@{$array_ref2} = ( sort { $b <=> $a } @{$array_ref} )[0..4];
} for 0..1000000;
$t1 = [gettimeofday];
$et = tv_interval($t0,$t1);
print "not splice: $et\n\n";

exit;
```


```:結果
splice: 1.048066

not splice: 0.759474

```

2行使って処理するより早いみたいですね。
ただ、100万回でこの差であればそんなに気にしないでもいいかな、と思ったり。
でも、`splice`使ってやるほうだと、代入する配列が巨大であれば、さらに重たくなるような気がします。


## 配列の要素数を増やしてみた

```pl
use strict;
use warnings;
use Time::HiRes qw(gettimeofday tv_interval);

my $array_ref = [1..100];	#面倒なので、単純に1～100の連続した数値を代入しました
my $array_ref2 = [];
my ( $t0, $t1, $et );

$t0 = [gettimeofday];
do{
	@{$array_ref2} = sort { $b <=> $a } @{$array_ref};
	splice @{$array_ref2}, 5;
} for 0..1000000;
$t1 = [gettimeofday];
$et = tv_interval($t0,$t1);
print "splice: $et\n\n";


$array_ref2 = [];

$t0 = [gettimeofday];
do{
	@{$array_ref2} = ( sort { $b <=> $a } @{$array_ref} )[0..4];
} for 0..1000000;
$t1 = [gettimeofday];
$et = tv_interval($t0,$t1);
print "not splice: $et\n\n";

exit;
```


```:結果
splice: 6.424075

not splice: 1.541562

```

予想通り、大幅に差が開きました。


## 結論

元の配列が大きい場合は、代入する前に要素数を絞れるといいですね、ということですね。
Node.js と NPM セットアップの冪等な自動化


Node.js 環境の整備は [ndenv](https://github.com/riywo/ndenv) で。想定は OS X 環境。

- `nenv` から `ndenv` に乗り換えました。

```bash
CWD=$(pwd)

NDENV="${HOME}/.ndenv"
NDVER='v4.1.1'

if ! which ndenv &> /dev/null
then
    if [ ! -d ${NDENV} ]
    then
        git clone git://github.com/riywo/ndenv.git ${NDENV}
        git clone git://github.com/riywo/node-build.git ${NDENV}/plugins/node-build
    fi
    export PATH="${NDENV}/bin:${PATH}"
    eval "$(ndenv init -)"
else
    cd ${NDENV}
    git pull
    cd ${NDENV}/plugins/node-build
    git pull
    cd ${CWD}
fi

if ! ndenv versions | grep ${NDVER} &> /dev/null
then
    ndenv install ${NDVER}
fi

ndenv global ${NDVER}
ndenv rehash

unset NDENV NDVER

if which npm &> /dev/null
then
    NPMS=(
        'LiveScript'
        'coffee-script'
        'coffeelint'
        'csslint'
        'eslint'
        'generator-hubot'
        'grunt-cli'
        'gulp'
        'js-yaml'
        'jsonlint'
        'mocha'
        'pulp'
        'wzrd'
        'yo'
    )

    for NPM in "${NPMS[@]}"
    do
        if ! npm list -g | grep ${NPM} &> /dev/null
        then
            npm install -g ${NPM}
        else
            npm update -g ${NPM}
        fi
    done

    ndenv rehash

    unset NPMS NPM
fi

unset CWD
```

インストール後 ${HOME}/.bash_profile とかに下記行を追記の事:

```
export PATH="${HOME}/.ndenv/bin:${PATH}"
eval "$(ndenv init -)"
[ -f "${HOME}/.ndenv/completions/ndenv.bash" ] && source "${HOME}/.ndenv/completions/ndenv.bash"
```