OmniAICreator/Qiita-1.07M huggingface dataset:
Sassのコードをドキュメント化できるSassDocが便利すぎる

![687474703a2f2f692e696d6775722e636f6d2f356938515942382e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/5559/7094946a-1525-a081-b25a-f7c761a67db4.png)

最近多くの人達がプロジェクトの中で`Sass`もしくは`Scss`を使用していると思います。変数などの便利な機能があってそれぞれを別ファイルにして管理できるなど便利な点がありますが、ファイルの数やコード数が多くなってきてそれぞれがどういった動きをするのかが分かりにくくなっていると思います。そこで便利なのがこの <b>SassDoc</b> です。これは変数や@mixinを見つけてそれらのドキュメントを作成してくれます。

## インストール

```bash
$ npm install -g sassdoc 
```

## 使い方

```bash
$ sassdoc <src> <dest> [options]
```

- `<src>`はSassフォルダのパス
- `<dest>`は生成されるHTMLファイルを置くフォルダのパス
- `[options]`は`-v`でverboseモードになります

例えば：

```bash
$ sassdoc examples/stylesheets example/dist --verbose
```

実行結果：

```
2014-07-01 19:21:17 Folder `examples/dist` successfully removed.
2014-07-01 19:21:17 Folder `examples/dist` successfully generated.
2014-07-01 19:21:17 Folder `examples/stylesheets` successfully parsed.
2014-07-01 19:21:17 Documentation for folder `examples/stylesheets` successfully generated.
2014-07-01 19:21:17 Process over. Everything okay!
```

その後、`examples/dist/index.html`というものができていてそれをブラウザで開くと以下のようになっています。

![1404307414sassdoc.jpg](https://qiita-image-store.s3.amazonaws.com/0/5559/3c253f0d-b97c-39f8-c7b1-56e4c9642f9d.jpeg "1404307414sassdoc.jpg")



## 最後に

これによってScssの構造が分かりやすくなり新しく入ってきた人たちに説明する手間が省けたりと保守性が高まっていいと思います。


## 参照

- [SassDoc: A Documentation Tool for Sass](http://www.sitepoint.com/sassdoc-documentation-tool-sass/?utm_content=buffer24531&utm_medium=social&utm_source=facebook.com&utm_campaign=buffer)
- [Github/sassdoc](https://github.com/SassDoc/sassdoc/)
PHPでExceptionを簡潔に書く

Exceptionを吐くことのあるメソッドを使う場合は、呼び出し元ですべてtry catchしないといけないと思っていたが、そんなことしなくていいみたい。

## 綺麗に直したバージョン

実行結果

```
error
```

コード

```
try {
    Hoge::hoge_func();
} catch (Exception $e) {
    print $e->getMessage();
}

class Hoge{
    public static function hoge_func(){
        Fuga::fuga_func();
    }
}

class Fuga{
    public static function fuga_func(){
        throw new Exception("error");
    }
}

```


## 冗長に書いてしまっていたバージョン

実行結果は同じですが、無意味にhoge_funcの中でtry catchしてました。

```
error
```


```
try {
    Hoge::hoge_func();
} catch (Exception $e) {
    print $e->getMessage();
}

class Hoge{
    public static function hoge_func(){
        try {
            Fuga::fuga_func();
        } catch (Exception $e) {
            throw $e;
        }
    }
}

class Fuga{
    public static function fuga_func(){
        throw new Exception("error");
    }
}

```
json_encode()でjsonをUTF-8に変換する方法（サロゲートペア対応）

json_encode()で出力したjsonってユニコードエスケープされているのですが、出力したjsonを手でメンテしたりすることを考えると、utf-8になっている方がうれしいわけです。
PHP6だとunicode_encode()なるステキ関数が用意されているみたいですが、PHP5だと自前で変換するしかない。
http://d.hatena.ne.jp/iizukaw/20090422 というすばらしい記事があったのでここのunicode_encode()を使ってjsonのutf-8化をしていたのですが。

##問題
サロゲートペアという、1つの文字をunicode文字2文字分（4バイト）で表現する文字があって、上のunicode_encode()だとこれらの文字をうまいこと変換できませんでした。
正規表現`"/\\\\u([0-9a-zA-Z]{4})/"`でユニコード文字をひとつずつ取り出してpack()してutf-8への変換をしているので、ユニコード2文字で1文字を表現するサロゲートペアがうまいこと変換できないんでしょうね。

##解決
もうちょっとキレイなやり方がありそうな気がするのですが、こうやって直しました。
まずは正規表現を`"/((?:\\\\u[0-9a-zA-Z]{4})+)/"`にしてユニコード文字をひとまとめにしてゲットできるようにします。
で、受け取った文字を変換するところで

```php
function encode_callback($matches) {
  // \uいらない
  $tmp = preg_replace("/\\\\u/", "", $matches[1]);
  $fields = str_split($tmp, 4);
  $s = "";
  // 連結
  foreach ($fields as $field) {
    $s .= pack("H*", $field);
  }
  // ひとつながりのユニコード文字列をutf-8に変換
  // ！これだとサロゲートペアもうまいこと解釈してくれるみたい！
  $char = mb_convert_encoding($s, "UTF-8", "UTF-16");

  return $char;
}
```

とすることで無事変換できるようになりましたとさ。

## 2016.03.01追記

ものすごく長い文章をこの方法で変換すると、なんと php 自体がクラッシュしました。

```php
// ものすごく長い日本語テキスト
$str = "";
for ($i = 0; $i < 100000; $i++) {
	$str .= "あいうえお";
}

$jsonStr = json_encode($str);
$jsonStr2 = unicode_encode($jsonStr); // ★ ここで死亡
```

おとなしくPHPのバージョンをあげるのが良さそうです。
CasperJSをnpmでローカルにインストールして使う

[CasperJSを試してみる](http://qiita.com/sasaplus1/items/6b5835297b709785756e)なんて記事を書いたんですが、casperjs以外にphantomjsをローカルにインストールしてあげればグローバルにインストールする必要がないことがわかったのでメモです。

```bash:Terminal
$ npm install casperjs phantomjs
```

```json:package.json
{
  "private": true,
  "scripts": {
    "start": "casperjs --version"
  }
}
```

```bash:Terminal
$ npm start
1.1.0-beta3
```

頻繁に使うわけではない人はこちらの方が楽なのかもしれません。
CakePHPのShellから別のShellを呼び出す


dispatchShellをメソッドを使ってHogeOneShellからHogeTwoクラスのメソッドを呼ぶ

```PHP:HogeOneShell.php
<?php
	class HogeOneShell extends AppShell{
		public function main(){
			// HogeTwoShell.phpのmainメソッドを呼び出す
			$this->dispatchShell('HogeTwo');

			// HogeTwoShell.phpのhogeMethodメソッドを呼び出す
			$this->dispatchShell('HogeTwo', 'hogeMethod');
		}
	}
?>

<?php
	class HogeTwoShell extends AppShell{
		public function main(){
			echo "HogeTwo main";
		}

		public function hogeMethod(){
			echo "HogeTwo hogeMethod";
		}
	}
?>

```
MATLAB-Sample 【基礎】フロー制御

関数やスクリプトファイル内で分岐や繰り返しの処理を行いたい時があるのでそれらについて。

# 準備
本稿ではフロー制御のロジックを関数内で試してみることを想定するので、まずは**[こちらの記事](http://qiita.com/oicawa/items/1ba37c9d441e2f036f42 "こちらの記事")**を参考に関数（mファイル）を作っておく。

# 分岐（`if`, `elseif`, `else`）
いきなり文法から。

```matlab
if 評価式0
   評価式0がTrueだった場合に実行
elseif 評価式1
   評価式1がTrueだった場合に実行
else
   全ての評価式がFalsedだった場合に実行
end
```
ま、よくある書き方。よくある書き方だけに、`elseif`と`else`は省略可能。

では試してみよう。
上述のリンクで紹介した関数`calc_4patterns`は、0除算についてケアがされていない。
（本当は、MATLABの方でInfが返るようになっていておかしな挙動になったりはしないけど、それはとりあえず置いといて。。）

というわけで、引数`b`がゼロだった場合の処理を分岐してみる。
こんな感じに除算のところのロジックを変更してみよう。

```matlab
function [add, sub, mul, div] = calc_4patterns(a, b)
    add = a + b;
    sub = a - b;
    mul = a * b;
    % bが0だった場合は文字列'ZeroDivide'を返却値としてdivにセットする。
    if (b == 0)
        div = 'ゼロ除算です';
    % bが0でなかった場合は通常の除算を行う。
    else
        div = a / b;
    end
```


```matlab
--> [a, s, m, d] = calc_4patterns(3, 4);
--> d
ans =
    0.7500
--> [a, s, m, d] = calc_4patterns(3, 0);
--> d
ans =
ゼロ除算です
--> 
```

ちゃんと分岐できている。
他の分岐方法として、`switch`/`case`/`otherwise`があるがここでは割愛。



# 繰り返し（`for`）

# 繰り返し（`while`）
[Rails]requestの情報をモデルで扱えるようにしておくと何かと便利


UserAgentとかsessionの情報とかモデルから直接参照できない。引数で渡す事は出来るけどそれを毎回指定するのは面倒。

下記コードをcontrollerに書いておくとモデルから直接requestの情報を参照できて何かと便利です。

```app/controllers/application_controller.rb
before_filter :set_request_filter

def set_request_filter
  Thread.current[:request] = request
end
```

```rb:モデル内で
user_agent = Thread.current[:request].user_agent
session = Thread.current[:request].session
```
URLセーフのBase64

#Javaのエンコード/デコード
今回は、Java8のBase64のエンコードについてです。

##URLセーフとは
URLで使用できない文字があります。
今回、自分が学んだ例でいくと、"="は予約語として利用されています。
なので、エンコードして"="を含んでいると違う解釈をされることになると思います。

##Java Base64クラスについて
Java でBase64エンコードする場合、Javaの標準系のBase64クラスを使用すると
URLセーフのエンコードされた文字列を作成することができません。
URLセーフのエンコードをするには、import文で
```lang:java
import org.apache.commons.codec.binary.Base64;
```
を使います。
これをつかうとURLセーフのエンコードが使用できます。

エンコーダー/デコーダーを作成する為に、Base64クラスのオブジェクトを生成します。
この時、
```lang:java
Base64 base = new Base64(true);
```
として宣言します。
これで、URLセーフのエンコード/デコードができます。
第23回オフラインリアルタイムどう書く「くねくね増加列」の C言語による実装


問題 http://nabetani.sakura.ne.jp/hena/ord23snakemoinc/
解答リンク集 http://qiita.com/Nabetani/items/7ba11167ea28c929fcf2
イベント http://yhpg.doorkeeper.jp/events/12339

たまには C 言語でも書かなきゃね。
と思い、書いてみた。

```c
// CC_OPTS="clang -std=c99 -Wall"
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

enum{ MAP_W = 5 };
enum{ MAP_H = 5 };
enum{ MAPSIZE = MAP_H * MAP_W };

int cell_value( char const * src, int x, int y )
{
  if ( 0<=x && x<MAP_W && 0<=y && y<MAP_H ){
    return src[ x+y*(MAP_W+1) ]; // +1 は、デリミタの "/"。
  } else {
    return INT_MAX;
  }
}

int max_2( int a, int b ){  return a<b ? b : a;  }
int max_4( int a, int b, int c, int d )
{
  return max_2( max_2( a, b ), max_2( c, d ) );
}

struct kune{
  char const * src;
  int distmap[ MAPSIZE ];
};

int nei_dist( struct kune const * kune, int x, int y, int digit )
{
  int v = cell_value( kune->src, x, y );
  return v<digit ? kune->distmap[ x+y*MAP_W ] : 0;
}

int neibour_max_dist( struct kune const * kune, int x, int y )
{
  int digit = cell_value( kune->src, x, y );
  return max_4(
    nei_dist( kune, x-1, y, digit ),
    nei_dist( kune, x+1, y, digit ),
    nei_dist( kune, x, y-1, digit ),
    nei_dist( kune, x, y+1, digit ) );
}

int solve( char const * src )
{
  struct kune kune = { src };
  int r=0;
  for( char digit='0' ; digit<='9' ; ++digit ){
    for( int y=0 ; y<MAP_H ; ++y ){
      for( int x=0 ; x<MAP_W ; ++x ){
        if ( cell_value( src, x, y ) == digit ){
          int nei=neibour_max_dist( &kune, x, y );
          kune.distmap[ x+y*MAP_W ] = nei+1;
          r=max_2( nei+1, r );
        }
      }
    }
  }
  return r;
}

void test( char const * src, char const * expected )
{
  int e = atoi( expected );
  int a = solve( src );
  printf( "%s %s -> %2d ( %2d )\n", (a==e ? "ok" : "**NG**" ), src, a, e );
}

int main()
{
/*0*/ test( "01224/82925/69076/32298/21065", "6" );  
/*50*/ test( "02489/77571/84873/03879/84460", "7" );
return 0;
}
```

いつも通り、テストデータの大半は省略。

ruby で書いた
http://qiita.com/Nabetani/items/abce08a153b2fbfa6e36#2-1
をそのまま移植した。

いやしかし。
何度書いても Cで書くと長くなってびっくりする。
Pecoを使ってgitignore.ioから好きなように.gitignoreを取得する


以下を~/.zshrcに追記します

```zsh:~/.zshrc
function _gi() { curl -s https://www.gitignore.io/api/$1 ;}
alias gi='_gi $(_gi list | sed "s/,/\n/g" | peco )'
```

Macの場合はsedがBSD版なのでGNU sedを使う
```brew install gnu-sed``` でインストール

その後に以下を追記

```zsh:~/.zshrc
function _gi() { curl -s https://www.gitignore.io/api/$1 ;}
alias gi='_gi $(_gi list | gsed "s/,/\n/g" | peco )'
```





```gi >.gitignore```で.gitignoreを取得できるようになりました。

まだzshを使って間もないですのでもっと簡易に書ける方法があればご教示くださいm(_ _)m
MATLAB-Sample 【基礎】関数を定義する

ひとかたまりのロジックを繰り返し使いたい場合に関数化すると便利。

**！注意！**
関数化する場合は、MATLABの検索パスが通っているディレクトリか、現在のディレクトリ（※）にファイルを作成するのだが、その際**「ファイル名」と「関数名」を同じ名称にする必要がある。**
（※：MATLABの左側にFileBrowserという小窓があると思うが、今まさに表示されているディレクトリの事。）

# 関数宣言のフォーマット

関数宣言のフォーマットは次のようになっている。

```matlab
% 【case.0】返り値なし
function function_name(in0, in1, ...)
    ...;
    ・
    ・
    ・

% 【case.1】返り値一つ
function out0 = function_name(in0, in1, ...)
    ...;
    ・
    ・
    ・

% 【case.2】返り値が多値（複数）
function [out0, out1, ...] = function_name(in0, in1, ...)
    ...;
    ・
    ・
    ・
```
トークンの意味をご紹介。

|項目|説明|
|:---|---|
|`out0`, `out1`, `...`|返り値|
|`function_name`|関数名。これをファイル名と合わせること。|
|`in0`, `in1`, `...`|関数の引数。|


# 関数を実装

では、今回は四則演算のすべての結果を返すという、いまいち使いどころが分からない関数を作ってみよう。

|項目|説明|
|:---|---|
|`add`, `sub`, `mul`, `div`|`add`が加算、`sub`が減算、`mul`が乗算、`div`が除算の結果となる。|
|`calc_4patterns`|関数名。これをファイル名と合わせること。|
|`a`, `b`|四則演算対象となる値。|


まずは現在のディレクトリに、**関数名と同じファイル名のmファイル**「**calc_4patterns.m**」を作成する。
そのファイルの中に次のようなコードを記述する。

```matlab
function [add, sub, mul, div] = calc_4patterns(a, b)
    add = a + b;
    sub = a - b;
    mul = a * b;
    div = a / b;
```
これで全ての準備は整った。Matlabのインタラクティブシェルから`calc_4patterns`関数を呼び出してみよう。

```matlab
> %calc_4patterns関数を呼び出す。
> [a, s, m, d] = calc_4patterns(3, 4);
```

当然のことながら、返り値の変数名は関数定義と同じにする必要はなく、好きな名前を使っていい。
では、返り値の中身を確認してみよう。

```matlab
> a
ans =
 7
> s
ans =
 -1
> m
ans =
 12
> d
ans =
    0.7500
> 
```

ちゃんとそれぞれの四則演算ができている。
Git 忘備録その２

#Git 忘備録その２
##リモートブランチからローカルに引っ張ってくる
リモートブランチに存在するブランチをローカルに引っ張ってくる場合です。
チーム開発だとよくあるパターンですね。
コマンドをよく忘れてしまいがちなので、メモしがてら共有します。

`git branch <ローカルブランチ> origin/<リモートブランチ>`

です。
よくあるブランチの作成です。
ローカルブランチ名はリモートブランチ名と一致させた方がいいと思います。
ローカルブランチ名とリモート先がひもづくので一致してなくても大丈夫（なはず）ですが、
しばらくして対応関係を思い出す作業はめんどくさいと思います。
それなら、originがついてればリモート先、ついてなければローカルって見分けられれば、
効率的だと思います。
ScalaのRegexParsersで書いたパーサのチューニング方法 #2

#例
適当なパーサを2つ例に取ります。

```Parser.scala
//適当なCSVパーサの定義
//lazy val field = "[a-z]+".r
lazy val A = field ~ ( rep( "," ~ field ) ).? 
lazy val B = ( rep( field ~ "," ) ).? ~ field
```

AもBも意図するところは同じです。`a`、`a,b`、`a,b,c`のような入力を、CSVの行としてパースします。
このAとBを見て、どちらがより優れたパーサなのかすぐに分かりますか？　答えはAなのですが、なかなかパッと見ただけでは判断し辛いです。

# 入力文字列へのアクセス回数でパーサを評価する
適当な入力に対する実行時間を計測するのもよいのですが、別の手法として、入力した文字列へのアクセス回数を数えるという方法だと、バックグラウンドのプロセスやCPUクロックの変動などのノイズの影響を受けず、高速にスコアを求められます。

もちろん、実際のパフォーマンスと差異がありますが、Parserのパフォーマンスは、概ねこのスコアに比例します。

```ParserTest.scala

var count = 0
class DebugCharSequence(seq: CharSequence) extends java.lang.CharSequence {
  def charAt(n: Int) = { count += 1; seq.charAt(n) }
  def subSequence(s: Int, e: Int) = new DebugCharSequence(seq.subSequence(s, e))
  def length = seq.length
  override def toString = seq.toString
}
val dseq = new DebugCharSequence("a,b,c")
parser.parse(parser.A, dseq)
println("access count: A", count)
count = 0
parser.parse(parser.B, dseq)
println("access count: B", count)
```

```
(access count: A,31)
(access count: B,40)
```
Tomcatのポートを変える単純な方法


```xml:server.xml
        <!-- Normal HTTP -->
        <Connector className="org.apache.tomcat.service.PoolTcpConnector">
            <Parameter name="handler"
                value="org.apache.tomcat.service.http.HttpConnectionHandler"/>
            <Parameter name="port"
                value="8080"/>
        </Connector>

        <!-- Apache AJP12 support. This is also used to shut down tomcat.
          -->
        <Connector className="org.apache.tomcat.service.PoolTcpConnector">
            <Parameter name="handler"
       value="org.apache.tomcat.service.connector.Ajp12ConnectionHandler"/>
            <Parameter name="port" value="8007"/>
        </Connector>
```

8080番ポート
Webサーバーがリクエスト、レスポンスに使うポート

8007番ポート
Tomcatを制御するため

server.xmlの該当箇所を変えてTomcatを再起動
MacBookAirを再インストールしたときの備忘録 (一般設定編)


# Safariの設定
![Safariの設定](https://qiita-image-store.s3.amazonaws.com/0/28352/d285a00a-63a7-0927-37dc-90a06e77e6f8.png "Safariの設定")


# Flash Player

# 共有ドライブで.DS_Storeを作成しない

```bash
$ defaults write com.apple.desktopservices DSDontWriteNetworkStores true
```

設定を反映するため一回ログアウト。

# Dashboardの無効化

使わないので。

```bash
$ defaults write com.apple.dashboard mcx-disabled -boolean YES
$ killall Dock
```

# スクリーンショットの保存場所の変更

デスクトップだとすぐファイルだらけになるので。

```bash
$ defaults write com.apple.screencapture location ~/Pictures/ScreenShots/
$ killall SystemUIServer
```
MacBookAirを再インストールしたときの備忘録 (開発環境編)


# Xcodeのインストール

AppStoreからインストール。

## Xcode Command Line Toolsのインストール

```bash
$ xcode-select --install
```

コマンドを実行したら、あとは適当にダイアログに答えるだけ。

# RVMのインストール

[RVM公式サイト](https://rvm.io)に書いてあるコマンドを実行してインストールする。

```bash
$ \curl -sSL https://get.rvm.io | bash -s stable
```

## Ruby 2.1のインストール

とりあえず2.1を入れとく。

```bash
$ rvm install 2.1
```

homebrewもついでにインストールされる。

インストール終わったら、デフォルトで2.1が動くようにしておく。

```bash
$ rvm use 2.1 --default
```

# nodebrewのインストール

[nodebrew公式サイト](https://github.com/hokaccha/nodebrew)に書いてあるコマンドを実行してインストールする。

最後にパスをexportする文が表示されるので、.bashrcに追記してsourceで読み込み直す。

## Node.js最新版のインストール

```bash
$ nodebrew install latest
```

.bashrcに以下を書いたんだけど、もっとエレガントな方法があるかも。

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

## bowerのインストール

```bash
$ npm install bower -g
```

## Javaのインストール

[Oracleのダウンロードサイト](http://www.oracle.com/technetwork/java/javase/downloads/index.html)のインストーラーでインストール。

# VirutalBoxのインストール

[VirtualBox公式](http://www.vagrantup.com/)のインストーラーでインストール。

# Vagrantのインストール

[Vagrant公式](http://www.vagrantup.com/)のインストーラーでインストール。

# Ansibleのインストール

[以前書いた記事](http://qiita.com/circled9/items/55c92dad0e0ffcbac2f5)参照
PHPで最後に評価した値を返す論理関数を作ってみる

# **前書き**

@38kun さんの **[「JavaScript の a || b || c と PHP の $a || $b || $c は動作が異なる」](http://qiita.com/38kun/items/73473612495684d6b98f)** より、これをもしPHPで実現するんだったらどう書くかなーと。ただ、可能であればこうするよりも **[「PHPに演算子オーバーロードを実装する」](http://d.hatena.ne.jp/anatoo/20120718/1342567404)** のようにC言語レベルで演算子自体を書き換えてしまったほうが便利かもしれません。これはあくまで簡単に実装したい人のための関数です。

# **実装例**

命名はVisualBasicより。

```php
function orelse() {
    foreach (func_get_args() as $value) {
        if ($value) {
            return $value;
        }
    }
    return null;
}
```

```php
function andalso() {
    foreach (func_get_args() as $value) {
        if (!$value) {
            return $value;
        }
    }
    return isset($value) ? $value : null;
}
```

至って変わったところはないですねｗ

# **使い方**

```php
var_dump(orelse(0, 10, 20));
// 出力結果：int(10)
var_dump(orelse(false, '', null);
// 出力結果：null
var_dump(andalso('あ', '', 'う');
// 出力結果：string(0) ""
```
Javaで単純なサニタイズ

```java:
private String replaceInput(String inputData){
    String outputData = inputData;
    
    outputData = outputData.replace("&", "&amp;");
    outputData = outputData.replace("\"", "&quot;");
    outputData = outputData.replace("<", "&lt;");
    outputData = outputData.replace(">", "&gt;");
    outputData = outputData.replace("'", "&#39;");
    
    return outputData;
}
```
Tomcat Webアプリケーションマネージャの設定

## tomcat-users.xmlを探す

```
sudo find / -name tomcat-users.xml
```

## tomcat-users.xmlを編集

Webアプリケーションマネージャのユーザ名、パスワードが以下のとき

ユーザ名：admin
パスワード：pass

```
sudo /usr/local/tomcat8/conf/tomcat-users.xml
```

以下のように追加

```xml:
<tomcat-users>
<!-- ↓追加-->
<role rolename="manager-gui"/>
<user username="admin" password="pass" roles="manager-gui"/>
<!-- ↑追加-->

<!--
  NOTE:  By default, no user is included in the "manager-gui" role required
  to operate the "/manager/html" web application.  If you wish to use this app,
  you must define such a user - the username and password are arbitrary.
-->
<!--
  NOTE:  The sample user and role entries below are wrapped in a comment
  and thus are ignored when reading this file. Do not forget to remove
  <!.. ..> that surrounds them.
-->
<!--
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="role1" password="tomcat" roles="role1"/>
-->
</tomcat-users>
```

## Webアプリケーションマネージャを使う

以下のアドレスにアクセス

```
http://localhost:8080/manager/html
```

BASIC認証のダイアログが出るので指定した
ユーザ名、パスワードを入力
CentOS 7 の Hostname を変更する

## 概要

CentOS 7 の Hostname の変更方法です。

## 一時的に Hostname を変更する

```bash:bash
$ sudo hostname hogehoge.example.com
```

* hostname コマンドで変更した場合再起動すると元に戻ります。


## 恒久的に Hostname を変更する (hostnamectl 使用)

(2017/4/23 コメントでアドバイスをいただいたので追記) 

```bash:bash
$ sudo hostnamectl set-hostname <HOSTNAME>
```

* 再起動不要
* 一度セッションを抜けて再度ログインするとホスト名が変更されている

## 恒久的に Hostname を変更する (/etc/hostname を直接変更)

```bash:bash
$ sudo vim /etc/hostname
```

```bash:/etc/hostname
hogehoge.example.com
```

* `/etc/hostname` のファイル内の値がそのまま Hostname に反映されます。
* CentOS 6 とは編集するファイルが違うので要注意

## 参考URL
* 3.3. hostnamectl を使ったホスト名の設定 - https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Networking_Guide/sec_Configuring_Host_Names_Using_hostnamectl.html
* CentOS 7 : ホスト名を設定する ： Server World http://www.server-world.info/query?os=CentOS_7&p=hostname
[社内向け]ぼくらの開発環境がベターになる（であろう）ツールたち

## 社内チャットや連携
- [Slack](https://slack.com/)
[Integration](https://slack.com/integrations)と呼ばれるDockerhubリポジトリ的なものがユーザー間で流通していて、webhookなど使わずに簡単操作でサービス連携が可能っぽい。モダンなtodo管理環境などのイメージが沸いたらすぐ実行できるのでとても良い。

- [Qiita team](https://teams.qiita.com/relogin?redirect_to=%2F)
マサカリ飛び交う世の中にではなくチーム内に散文を投げるときなどに良く、チャットに投下すると流されてしまったりノイズになったりする事例に対する解決策として良いと思われる。本来この駄文もQiita:teamに書かれるべきである。

## 継続的インテグレーション
- [CircleCI](https://circleci.com/)
説明は[ココ](http://qiita.com/camelmasa/items/924430ffa6f9fbea44c8)に譲る

- [Wercker](https://app.wercker.com/)
モダンなUIのOSSである。とにかく使いやすさと見た目の美麗さがある。そしてJenkinsのようにスクリプトを様々な場所に散在させず、ymlで設定できる点が強み。
参考：[Githubのプライベートリポジトリでも無料で使えるCI、Werckerを使ってrails newからHerokuのデプロイまでやってみる](http://blog.mah-lab.com/2014/01/08/rails-wercker-heroku-deploy/)

## 鯖関係

- [Google BigQuery](https://cloud.google.com/products/bigquery/?hl=ja)
[Googleの虎の子「BigQuery」をFluentdユーザーが使わない理由がなくなった理由](http://qiita.com/kazunori279/items/10ac0066ac9b0b5aaaf3)をじっくり読むと良い感じです。ElasticSearchやS3でログを解析しようと試みていたが、BigQueryに移りたい機運が高まっている。

- [GCP(HTTP Load balancing, instances, DataStore)](https://cloud.google.com/?hl=ja)
[AWSよりGoogle Compute Engineを選びたくなる10の理由](http://yoshidumi.blogspot.jp/2014/01/awsgoogle-compute-engine10.html)
[GoogleのHTTPロードバランサーの破壊力があり過ぎる](http://qiita.com/kazunori279/items/8d2417c8510021c697e7)をじっくり読もう。

## その他安価なVPS
[AWSのインスタンス高過ぎワロタ。探せば安くて美味いところはあります。](http://qiita.com/kaiinui/items/da47c9850dc09b3cf091)に譲る
VBAやVBScriptで形態素解析を行う方法

このドキュメントではVBAやVBScriptを使用して形態素解析を行う方法について説明します。

単語の分割だけでいい場合は下記を参考。

 __VBScriptで分かち書きを実行（MS標準機能のみで実装）__ 
http://qiita.com/nezuq/items/2e4e0cc63316474b630d

#NMeCab
NMeCabは形態素解析エンジンMeCabの解析処理部分を、.NETライブラリとして移植したものであり、下記からダウンロードできます。

http://sourceforge.jp/projects/nmecab/releases/p11745

今回は、NMecabをCOMでラッパーするNMecabComを作成し、そこを経由してVBA,VBScriptから形態素解析を行います。

![b0232065_21104163.png](https://qiita-image-store.s3.amazonaws.com/0/47856/df53d91d-4ed3-e1b1-20a0-9548afd4389c.png)

具体的な作成方法については下記を参考の事。
[VBAまたはVBSからCOM経由で使用できる.NETのライブラリの作成方法](http://qiita.com/mima_ita/items/efcd1a6ea86f09047984 "VBAまたはVBSからCOM経由で使用できる.NETのライブラリの作成方法")


作成したNMeCabComは下記からダウンロードできます。
http://needtec.sakura.ne.jp/release/NMeCabCom.zip


#環境
・Visual Studio2008 Pro
・.NET Framework 2.0 を対象とする。
・32ビットのOffice2010


#使用方法
##インストール方法
１．下記からファイルをダウンロードします
http://needtec.sakura.ne.jp/release/NMeCabCom.zip

２．NMeCabCom\binにあるsetup.batを管理者権限で実行してください。

もし、Excelの64ビットのプロセスで使用したい場合は、NMeCabCom.dllとLibNMeCab.dllを64ビットでビルドしなおしてください。

また、アンインストールを行い対場合はuninstall.batを管理者権限で実行してください。

##Excel VBAからの使用方法
インストールが適切に終了していれば、参照設定にNMecabComが追加されるのでチェックを入れてください。

![1w04banj.png](https://qiita-image-store.s3.amazonaws.com/0/47856/f501ff58-5826-38db-e82f-03270ac5298f.png)

その後以下のような実装をします。

```vb

    Dim t As New NmcTagger
    Dim c As NmcNodeCollection
    Dim p As New NmcParam
    p.dicdir = "C:\back\NMeCabCom\bin\ipadic"
    Call t.Create(p)
    Set c = t.Parse("私の名前はLです")
    Dim i As Long
    For i = 0 To c.Count - 1
        Debug.Print c.GetItem(i).Surface & " " & c.GetItem(i).Feature
    Next
```

##作成例


NmcTaggerに渡すNmcParamにはシステム辞書とユーザ辞書を指定できます。
ユーザー辞書の作成については、[本家のMecab](http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html "本家のMecab")のホームページを参考に作成してください。

##VBScriptからの使用方法

CreateObjectで遅延バインディングする場合は以下のようになります。

```vb

dim t
dim ret
dim i
dim p
dim node
set t = CreateObject("NMeCabCom.NmcTagger")
WScript.Echo TypeName(t)

set p = CreateObject("NMeCabCom.NmcParam")

p.dicdir = "./ipadic"
p.userdic = ""
t.Create(p)

set ret = t.Parse("This is a pen.")
WScript.Echo TypeName(ret)

For i = 0 To ret.Count- 1
  WScript.Echo TypeName(ret.GetItem(i))
  WScript.Echo ret.GetItem(i).Surface
Next
```

##応用例
bin/NicoMsgAnalyze.xlsm はニコニコ動画のコメントを集計して解析するサンプルです。

 __ExcelVBA を使ったニコニコ動画のコメントの分析__ 
http://www.nicovideo.jp/watch/sm22332042
Eclipseでjavaアプリケーションを生成したとき、コマンドでwarファイルを生成する方法

WindowsのeclipseでJavaアプリを作成し、
ワークスペースが以下のようになっているとする

```
C:\Users\ユーザ名\workspace\アプリ名
```

ワークスペースのアプリケーションのフォルダにcd

```
cd C:\Users\ユーザ名\workspace\アプリ名
```

以下のコマンドでwarファイルが生成される

```
jar cvf アプリ名.war *
```
TCPの状態遷移

## TCPの状態一覧
**LISTEN（聴取）**
TCPモジュールはリモートホストからのコネクション要求を待っている。パッシブオープンの後で入る状態と同じ。
  
**SYN-SENT（SYN送信済み）**
TCPモジュールは自分のコネクション要求の送信を終え、応答確認と対応するコネクション要求を待っている。

**SYN-RECEIVED（SYN受信済み）**
TCPモジュールは同期（SYN）セグメントを受信し、対応する同期（SYN/ACK）セグメントを送って、コネクション応答確認を待っている。

**ESTABLISHED（確立済み）**
コネクションが開かれ、データ転送が行える通常の状態になっている。受信されたデータは全てアプリケーションプロセスに渡せる。

**FIN-WAIT-1（FIN待機1）**
TCPモジュールはリモートホストからのコネクション終了要求か、すでに送った終了要求の応答確認を待っている。

**FIN-WAIT-2（FIN待機2）**
この状態に入るのは、TCPモジュールがリモートホストからの終了要求を待っているときである。

**CLOSE-WAIT（閉鎖待機）**
TCPモジュールはアプリケーションプロセスからのコネクション終了要求を待っている。

**CLOSING（閉鎖処理中）**
TCPモジュールはリモートホストからのコネクション終了要求を待っている。

**LAST-ACK（最終ACK）**
リモートホストに送ったコネクション終了要求について、TCPモジュールがその応答確認を待っている

**TIME-WAIT（時間待機）**
コネクション終了要求応答確認をリモートホストが確実に受取るのに必要な時間が経過するまで、TCPモジュールは待機している

**CLOSED（閉鎖）**
コネクションは全く存在せず、確立段階にも入っていない

## TCPの状態遷移図
![TCP状態遷移図.002.jpg](https://qiita-image-store.s3.amazonaws.com/0/2813/2169c473-a7d3-56fd-d748-282c14a84674.jpeg)


#### アクティブオープンの場合
1. **CLOSED** : SYNを送信し、SYN-SENTへ遷移
2. **SYN-SENT** : SYN-ACKを受信。応答確認のACKを送信し、ESTABLISHEDへ遷移
3. **ESTABLISHED** : コネクション確立完了

#### パッシブオープンの場合
1. **CLOSED** : LISTENへ遷移
2. **LISTEN** : リモートホストから接続確立要求を受け取り、SYN-RECEIVEDへ遷移
3. **SYN-RECEIVED** : 対応する同期（SYN/ACK）セグメントを送信、コネクション確立要求（ACK）を待つ。ACKを受信したらESTABLISHEDへ遷移
4. **ESTABLISHED** : コネクション確立完了

#### アクティブクローズの場合
パターン１
1. **ESTABLISHED** : FINを送信し、FIN-WAIT1に遷移
2. **FIN-WAIT1** : 送信したFINのACKを受信し、FIN-WAIT2へ遷移
3. **FIN-WAIT2** : リモートホストからFINを受信し、ACKを送信。TIME-WAITに遷移
4. **TIME_WAIT** : コネクション終了要求応答確認（送信したACK）がリモートホストが確実に受取るのを待つ。待機時間が終了したらCLOSEDに遷移。
5. **CLOSED** : コネクション閉鎖完了
  
パターン2
1. **ESTABLISHED** : FINを送信し、FIN-WAIT1に遷移
2. **FIN_WAIT1** : FINを送信したが、リモートホストからもFINを受信したので、これに応答確認をする。その後CLOSINGへ遷移
3. **CLOSING** : 送信したFINの応答確認を待つ。応答確認を受信し次第、TIME-WAITに遷移。
4. **TIME_WAIT** :  コネクション終了要求応答確認（送信したACK）がリモートホストが確実に受取るのを待つ。待機時間が終了したらCLOSEDに遷移。
5. **CLOSED** : コネクション閉鎖完了

#### パッシブクローズの場合
1. **ESTABLISHED** : FINを受信し、ACKを送信する。CLOSE-WAITに遷移
2. **CLOSE-WAIT** : FINを送信する。LAST-ACKに遷移
3. **LAST-ACK** : ACKを受信したらCLOSEDに遷移
4. **CLOSED** : コネクション閉鎖完了
Heroku+Firebase で無料+簡単ツイート収集

イイ感じに Tweet を収集したい。

というわけで何も考えずに Tweet を収集出来る Heroku-ready アプリを作りました。
キーワードを指定し、合致する Tweet を収集することが出来ます。

https://github.com/kaiinui/tweet_collector

使い方
---

1. `git clone git@github.com:kaiinui/tweet_collector.git`
2. `config/keys.yml` に Twitter App のキーと Firebase の Base URI を書く（下記参照）
3. `config/words.yml` にトラッキングしたいワードを書く。(`"xvideo"`とか面白いと思います。)
4. `./push`

これでたくさんツイート収集してツイートコレクターの称号をゲットしましょう！

####注意点

1. 日本語ワードを使うと上手く取れません。（TwitterのAPIの都合）
2. 1つの Twitter App につき1つの`tweet_collector`しか使えないので注意） 


僕はこれでxvideosとかxhamsterとかのツイートを集め、botが頑張ってつぶやいてるのを楽しく観察してます。

![スクリーンショット 2014-07-13 3.06.46.png](https://qiita-image-store.s3.amazonaws.com/0/19168/d99f2028-2c60-8e50-5209-88384505463d.png)

https://github.com/kaiinui/tweet_collector_viewer

Twitter App のキー
---

![](https://raw.githubusercontent.com/kaiinui/tweet_collector/master/tweet_collector_SS_1.png)
![](https://raw.githubusercontent.com/kaiinui/tweet_collector/master/tweet_collector_SS_2.png)

Firebase BASE URI
---

https://www.firebase.com/
にsign upし、新しいアプリを作ると
`https://YOUR_APP_NAME.firebaseio.com/`
というドメインになります。これが`firebase_baseuri`です
`require_once`でのファイル読み込みを改善した[メモ]


`require_once`でファイルを読み込む時に普段はファイルのパスを
そのまま直書きしてたがパスを変更すると読み込まない（当然www）のが不満で
改善してみた。。。
(この場合、読み込んでるファイルと読み込まれるファイルは同じディレクトリにないといけないけど)

```php:失敗例
require_once($_SERVER['DOCUMENT_ROOT']. dirname($_SERVER['PHP_SELF']). '/define.php');
```

こんな感じで書いてみた・・・
後に`var_dump`してみると
`string(33) "/DocumentRoot//hoge/fuga/hoge.php"`と
表示され・・・あれスラッシュが1個多い！！
ファイル自体は読み込んでくれたけど気持ち悪かったので改善。

先に`preg_replace`で/DocumentRoot/の最後のスラッシュを省く処理をする。

```php:ドキュメントルートの最後のスラッシュを省く
$hoge = preg_replace('|/$|', '', $_SERVER['DOCUMENT_ROOT']);

echo $hoge //\/DocumentRoot
```

あとは`require_once`で読み込ませるだけ

```php:require_onceで読み込み
$hoge = preg_replace('|/$|', '', $_SERVER['DOCUMENT_ROOT']);
require_once($hoge. dirname($_SERVER['PHP_SELF']). '/define.php');
```
上記は問題ありとコメントいただいたので下記を参考に

```php:
require_once __DIR__ . '/define.php';
```

でやっておこう。

以上です・・・
ちょっとした事をメモに残しておく。。。
Nginx環境でのphpMyAdminに対する外部ホストからのアクセス制限でハマった部分

結果的にNginxでのlocationの書き方が問題で起こった事です。

phpMyAdmin/のフォルダに対するアクセス制限が成功したのに、
phpMyAdmin/index.phpにアクセスすると見れてしまう。

ネットを探していた時によく見かけたのが下記の形


```nginx:nginx.conf

    listen       80;
    server_name  [公開ドメイン];

        root   /var/www/html/;
        index  index.php index.html index.htm;

	location /phpMyAdmin {
		allow [接続許可したいIP];
		deny all;
	}

	location ~ \.php$ {
		fastcgi_keep_conn on;
		fastcgi_pass   127.0.0.1:9000;
		fastcgi_index  index.php;
		fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
		include        fastcgi_params;
	}

```


まずローカル内[許可しているIP]で
  http://hoge/phpMyAdminに接続
...成功

次にiphone[許可していないIP]で
　http://hoge/phpMyAdminに接続
...失敗403


結果的にアクセス制御出来てるようなので、一見大丈夫なように見えたのですが・・・


今度はiphone[許可していないIP]から
　http://hoge/phpMyAdmin/index.phpに接続
...成功

ん？

・・・んん？

なんで繋がるんだ！？

「ネットに書いてある通りなんだが！」とよくあることを叫びつつ、試行錯誤を繰り返しながら結果的には下のコードでうまくいきました。


```nginx:nginx.conf

    listen       80;
    server_name  [公開ドメイン];

        root   /var/www/html/;
        index  index.php index.html index.htm;

	location /phpMyAdmin {
		allow 127.0.0.1;
		deny all;
		location ~ \.php$  {
			fastcgi_pass   127.0.0.1:9000;
			fastcgi_index  index.php;
			fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;        
			include        fastcgi_params;
		}
	}

	location ~ \.php$ {
		fastcgi_keep_conn on;
		fastcgi_pass   127.0.0.1:9000;
		fastcgi_index  index.php;
		fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
		include        fastcgi_params;
	}

```


いろいろ試した結果
最初の設定はphpMyAdminのフォルダはアクセス制限をかけたが、そのフォルダ内の.phpファイルに対するアクセス自体は
　
location ~ \.php$ {
}

の方が優先されてしまって
.phpファイルのみ参照できるようになっていたみたいです。

なので

location /phpMyAdmin {　
の中に
location ~ \.php$  {
をネストとして

phpMyAdmin内の.phpファイルにアクセスしたときはphpMyAdminのネストを通るように優先順位を変更しました。

iphoneでアクセスしても無事アクセス制限がかかり、めでたし。
新しいブラウザ、Breachを試してみた

## 試した環境
Ubuntu14.04 64bit
Breach v0.3.20

## ダウンロード
[Breach - A browser for the HTML5 era](http://breach.cc/)

## 起動
アーカイブ解凍後、おもむろに起動してみる

```bash
$ tar zxvf breach-v0.3.20-alpha.5-linux-x64.tar.gz
$ mv breach-v0.3.20-alpha.5-linux-x64 breach
$ cd breach
$ ./breach
[xxx:xxx:xxx/xxx:xxx:FATAL:browser_main_loop.cc(172)] Running without the SUID sandbox! See https://code.google.com/p/chromium/wiki/LinuxSUIDSandboxDevelopment for more information on developing with the sandbox on.
./breach: 6 行: 18856 中止                  (コアダンプ) $SRC_DIR/__AUTO_UPDATE_BUNDLE__/exo_browser/exo_browser --raw $SRC_DIR/__AUTO_UPDATE_BUNDLE__/breach_core
```

怒られた。
どうやらsandboxで起動しないといけないっぽい。

ググって見ると、[chromiumのファイルが必要らしい](http://zaka-think.com/linux/ubuntu/ubuntu-ash-chromium/)のでchromiumを落とす。

[Download Chromium](https://download-chromium.appspot.com/)

```bash
$ unzip chrome-linux.zip
$ cd chrome-linux
$ sudo cp ./chrome_sandbox /usr/local/sbin/chrome-devel-sandbox
$ sudo chown root:root /usr/local/sbin/chrome-devel-sandbox
$ sudo chmod 4755 /usr/local/sbin/chrome-devel-sandbox
```

改めて起動。

```bash
$ ./breach
[2014-07-12T15:56:50.983Z] [index] Breach v0.3.20-alpha.5 Starting...
:
:
```

お、起動したっぽい。

----
[以下超訳でお送りします]

![起動直後画面](https://qiita-image-store.s3.amazonaws.com/0/19605/bc2919c7-b903-ae54-cbd1-036ffb92e97d.png)
Breachはモジュールで動くけど、モジュールが何もないよ。`mod_strip`追加するね。
URLバーとタブを追加するものだよ。
デベロッパならあとでハックしてね。

![mod_stripインストール画面](https://qiita-image-store.s3.amazonaws.com/0/19605/530cd7f9-8e55-4d09-5fe6-a7264acbcd62.png)
`github:breach/mod_strip`追加中。

![注意事項](https://qiita-image-store.s3.amazonaws.com/0/19605/ee14fa0f-f5c0-5cb9-a2e9-d3d7748cbbc6.png)
Google Analyticsで情報送ってるよ。
嫌なら`breach/mod_stats`を消せばいいよ。

![mod_stripについて](https://qiita-image-store.s3.amazonaws.com/0/19605/376a2508-5d7e-eb0e-0334-2ecd335d5220.png)
**Stacked Tab**: 一番最近見たやつを最初に表示するよ。
**Tab Filtering**: URLボックスにタイプするとマッチしたタブを表示するよ(日本語も大丈夫でした)
**Color Sniffing**: それぞれのサイトっぽい色でタブを表示するよ。

![その他情報](https://qiita-image-store.s3.amazonaws.com/0/19605/d052c390-a255-1fde-27ef-f75e7ed90179.png)
**Module management**: 右クリでいつでもモジュール画面が開けるよ(サイトの画面に戻れない…)
**It's only the beginning**: ウェブに革新を！Breachの未来はあなたのhackっぷりにかかっている！
**Developer or designer?**: あなたは何を作る？[breach.cc/hack](breach.cc/hack)をチェック！

----

今までのブラウザに慣れていると、アクティブになったタブが先頭に来るっていうのがなれないかも…。
いずれにせよ、これからの動向が楽しみです。
はじめてのGo

>最終更新日 2014年7月13日

# Goの環境構築

## Goをダウンロード

![Screen Shot 2014-07-13 at 2.21.56.png](https://qiita-image-store.s3.amazonaws.com/0/5559/29aca518-b745-4c5e-0e1e-8fdae5ca58ca.png "Screen Shot 2014-07-13 at 2.21.56.png")

公式サイト、[Donloads](http://golang.org/dl/)から自分の環境に合ったものをダウンロードします。

## Goの`$PATH`を通す

公式サイトだと以下のようになっています。

```bash
export GOROOT=$HOME/go
export PATH=$PATH:$GOROOT/bin
```

しかし、これだと動かない場合があるので `/go` がある場所を探してパスを通します。自分の場合は以下のようになっています。

```bash
export GOROOT=/usr/local/go/
export PATH=$PATH:$GOROOT/bin
```

## インストールが無事にできたか確認

`hello.go`というファイルに以下のように書きます。

```go
package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}
```

そして無事にインストールが出来ていれば以下のようになります。

```bash
$ go run hello.go
hello, world
```

---
<br>

# Goデバック方法

## Go便利なツール

Debugには **GDB** というデバッカーが使えます。

![Screen Shot 2014-07-13 at 2.18.41.png](https://qiita-image-store.s3.amazonaws.com/0/5559/ba6bc32f-7737-88e6-3cc4-fee60daba160.png "Screen Shot 2014-07-13 at 2.18.41.png")

## GDBのインストール

GDB : http://www.gnu.org/software/gdb/

```bash
$ cd ~/path/to/gdb-7.7
$ ./configure
$ make 
$ make install
```

## CDBの使い方チュートリアル

Debugging Go Code with GDB : http://golang.org/doc/gdb

---
<br>

# 参考になるサイト


- [Go言語の初心者が見ると幸せになれる場所](http://qiita.com/tenntenn/items/0e33a4959250d1a55045)
clip-pathプロパティで画像を好きな形にくりぬく


画像にclip-パスプロパティとSVGのclipPath要素を使えば、
SVGのpathを使って任意の形で切り抜けます。
clipPath要素の子要素は circleだったりpathだったりで、すきな図形を記述し、clip-pathのurl()でidを指定すればできます。

以下のサンプルはChrome/Safariでしか動きません。
(画像は例によってCANDY GO!GO!の菜月アイルさん)

````cliping.html
<!DOCTYPE html>
<html>
<head>
<title>クリッピング</title>
<style type="text/css">
img {
    -webkit-clip-path: url(#clipping);  //for Safari,Chrome
}
</style>
</head>
<body>
<img src="hello.jpg">

<svg>
  <defs>
    <clipPath id="clipping">
      <!-- 切り取りたい形を表すpath -->
      <path d="M20,20 L250,50 300,350  50,300 Z" />
    </clipPath>
  </defs>
</svg>

</body>
</html>
````

結果は以下です。

![cliping.png](https://qiita-image-store.s3.amazonaws.com/0/4044/6c277a2d-16a3-3783-1e87-a0e08b504807.png "cliping.png")
JavaScript の a || b || c と PHP の $a || $b || $c は動作が異なる

異なる言語間で一見同じように見えても実は挙動が異なるというのはよくある話で、たとえば論理演算子 **||** （PHP の場合は **or** も同義）は、JavaScript と PHP では仕様が異なります。

サンプルコード
===

```test1.html
<script>
alert(0 || 10 || 20);
// アラート内容：10
alert(false || '' || null);
// アラート内容：null
</script>
```

```test1.php
<?php
var_dump(0 || 10 || 20);
// 出力結果：bool(true)
var_dump(false || '' || null);
// 出力結果：bool(false)

// 余談ですが、ここで echo (0 || 10 || 20); とすると 1 と出力されます。
// PHP では真偽型の true を出力しようとすると 1 に型変換されるんです。
// ちなみに false だと何も出力されません。
```

解説
===

JavaScript の論理演算子 **||** は「最初に見つかったtrueっぽい値」をそのまま返します。「true っぽい」とは何かについて話すと長くなりますが、0とか空文字とか null とか false とか undefined とかじゃない系の値のことです。
上記の例でいうと、最初の 0 は false っぽい（← true っぽいの逆）ので飛ばされて、2番目の b の値 10 が true っぽいので、それが返ってくるわけですね。
そして、もしどれも true っぽくない場合は、一番最後の値が返ってきます。
（上記を一言で言えば「最後に評価された値を返す」と言えます）

一方、PHPはというと、「ひとつでも true っぽいものがあったら true を返す。そうでなければ false を返す」という感じ。こっちのほうがわかりやすいかもしれません。

論理和（||）ではなく論理積（&&）だとどうなのか
===

もちろん、**&&** も **||** と同じくJavaScript の場合は「最後に評価された値」を返しますし、PHPの場合は真偽値を返します。

他の言語だとどうなのか
===

上記では例としてよくウェブ系で使われる JavaScript と PHP を使いましたが、他の言語だとどうなの？って疑問が当然出てくると思います。
結論だけ言うと、Perl とか Python とか Ruby とかは JavaScript と同じで、C とか Java とかは PHP と同じです。
もちろん、「true っぽい」の定義がそれぞれの言語で異なるので、そのあたりの違いはあります（たとえば Ruby では 0 は true っぽいほうに入ります）。
ちょっと調べてみたところ、<a href="http://www.rubylife.jp/ini/if/index4.html" target="_blank">こんな感じ</a>で、間違って説明しているサイト結構あるみたいですね。こまったものです。

使い道（JavaScript的仕様の場合）
===

たとえば、以下のように値が false っぽい場合に別の値を設定することができます。

```test2.html
<script>
function test(a) {
  var hoge = a || 'default';
  // 色々処理
  return hoge;
}
alert(test('abc'));
// アラート内容：abc
alert(test());
// アラート内容：default
</script>
```

JavaScript なので 0 とかも false っぽいと判断されることは注意が必要。
厳密に undefined だけを判定してやるなら typeof a が 'undefined' と同じかどうかを判定しないといけないですね。
（`typeof a === 'undefined'` と `a === undefined` の違いはなにか、という話もありますが、本筋と逸れるので略）

【補足】上記の例だけだと「（PHPみたいに）引数のデフォルト値が設定できればいいだけの話じゃん」となりそうですが、**||** の場合は、3つでも4つでもいくつでも「最初に true っぽいやつ」を代入できる、というのがミソです。
（ちなみに JavaScript の最新版といえる ECMA Script 6 では `function hoge(foo, bar = 1) {...}` といった感じでデフォルト値を設定できるようになっていますね）

まぁ覚えていれば、そのうち役に立つことがあるかもしれないし、ないかもしれない……。

ちなみに論理演算子の結果を true か false で欲しい場合もあると思いますが、そういう場合は `Boolean(a || b || c)` といった感じで真偽型に変換してやればいいだけです。

【補足】PHP 5.3 から三項演算子（`式 ? 式がtrueっぽい場合の値 : 式がfalseっぽい場合の値`）の省略形「?:」が使えるようになっているらしく、これで JavaScript の **||** と同じことができるみたいです。例：`var_dump(0 ?: 10 ?: 20)` → `int(10)`
エンジニアサイドから提案したいSEO対策チェックリスト+α

エンジニア視点から出来るSEO対策のチェックリストについてまとめました。他にもあれば追加していきたいと思います。

### 1.ページネーションはクローラビリティの肝
サイトのクローラビリティはSEO上特に重要。たとえページが10000件あるようなサイトでも5クリック以内で全部のページに遷移できないか考えましょう。探索木的な発想でページネーション組むと可能っちゃ可能です。

### 2.schema.orgを指定する
タグに意味を持たせるschema.org。パンくずはもちろんその他指定したいタグは全部指定したいですね。
http://schema-ja.appspot.com/docs/gs.html

### 3.サイト内検索ワードはデータベース化
サイトに検索機能があれば検索されたワードはすべてデータベース化しておきましょう。Google Analyticsなどを使ってサイトへの流入ワード分析もいいですが、それだと既に対策されたワードの分析しかできないので実際にサイト内で検索されたワードを分析する事は重要です。

### 4.ページ内テキスト解析してリンクを作成
対策したいワードリストが決まったら、各ページでそのワードがどれくらい使われているかを分析してせっせとリンクを作りましょう。対策ワードへの内部リンクをうまく作っていく事が大事です。

### 5.APIを使って新たにページが作れないか検討
例えば住所が登録されたページが多数あるとして、そこから最寄り駅や緯度・経度を取得する事ができます。そうすると最寄り駅のまとめページを作る事ができ、サイトへの流入増が期待できます。

### 6.sitemap.xmlを作成して送信
サイトのすべてのページはsitemap.xmlを作成して送信しましょう。

### 7.インデックスの不要なページはnoindex, follow指定
サイトマップページなどインデックスする必要のないページにはnoindex, followを指定するようにしましょう。

### 8.速度改善にこだわる
SEOのランクにサイトの速度の影響があるようです。速度改善を徹底しましょう。

### 9.canonicalで同一URLとみなされないように
wwwのありなし、httpかhttpsかなど、同じページだけど違うページとして認識されないよう注意しましょう。

### 10.画像にalt属性を入れる
当然対策すべきですね。

### - 追記 -

### 11.titleタグ最適化のテンプレート化

titleタグは全ページ個別化しましょう。コンテンツページとか手が回ってないと疎かになりがちです。テンプレート的に「個別ページ名 - サービス名」といった形で個別ページ名を設定するだけでtitleタグが動的に変更できる仕組みを作っておきましょう。

### 12.titleタグにサービス名を入れる

titleタグにサービス名を入れるのは賛否両論ありそうですが、Qiitaのようなユーザ投稿型サイトの場合ユーザがブログなどの内容を転載して書いてしまうとコピーコンテンツとみなされる可能性もあるので、titleタグにサービス名を入れて違いを出しましょう。

### 13.titleになる部分の文字数validationを設定する

ユーザ投稿サイトの場合、titleになる部分の文字数って結構大事になってくると思います。最低文字数、最大文字数をユーザの不満のない範囲で設定してあげる事で適切な長さの、凝縮されたtitleをつけてもらう事が可能になります。

### 14.meta descriptionをカスタマイズ

meta descriptionの内容も検討しましょう。単に内容を出すだけじゃなくてページ内の基本情報含めてカスタマイズできないか検討しましょう。

### 15.同じ記事の投稿がされない仕組みを作ろう

これもユーザ投稿サイトの場合の話ですが、同じ内容のコンテンツをユーザが投稿しないような導線が必要です。サイト内に複数同じ記事が上がってくるとネガティブな評価を食らいます。ユーザが投稿する前に他にこんな事あるけど大丈夫？的なアラートをさり気なく出して上げる事が大事ですね。

### 16.検索結果からのクリックレートも意識する

SEOは検索順位が上がった下がったで喜ぶものではないです。検索結果一覧ページからクリックするかどうかも意識しましょう。titleタグが一番大事になってきますし、descriptionでユーザが興味を持つ内容をカスタマイズして表示してあげましょう。

### 17.OGPも忘れずに

今や非常に大事ですね。

### 18.twitter cardも設定する

OGPだけじゃなくtwitter cardも設定してtwitterからの流入を増やしましょう。

### 19.social shareボタンを最適化

デフォルトのsocial shareボタンは小さくてあまりクリックされません。適度なボタンの大きさと「シェアしたいと思った時にそこにいる」ボタンの配置を心がけましょう。

### 20.エンジニアもユーザヒアリングしよう

最後に。エンジニアもユーザヒアリング大事です。Google検索からの導線でユーザに使ってもらいましょう。思ってもみないワードでの検索や動きをする事があります。

みなさんもぜひこれ以外に対策してるマニアックな事などあればコメントもらえると大変うれしいです。
SwiftでShare Extensionを使う際のポイント


## 概要
Share Extensionはまず通常通りにプロジェクトを作成したあと、新規ターゲットの追加でShare Extensionを選択することで作成できます。
ターゲットを作成すると`SLComposeServiceViewController`を継承した`ShareViewController`が自動生成されます。
このControllerにユーザーがコンテンツをポストした際の処理を実装することになります。

UIはデフォルトで用意されているものがあるのでそちらを使うか、自分で作ることもできます。

## 使い方
ユーザーがポストしたタイミングで`ShareViewController`の`didSelectPost()`が呼ばれるのでここにデータの保存やサーバーへの送信処理などを実装します。
このコードではNSExtensionItemにユーザーが入力したテキストを設定しています。

```swift
override func didSelectPost() {

    var inputItem : NSExtensionItem = self.extensionContext.inputItems[0] as NSExtensionItem
    var outputItem : NSExtensionItem = inputItem.copy() as NSExtensionItem;

    // 入力されたテキストを設定する
    outputItem.attributedContentText = NSAttributedString(string:self.contentText, attributes:nil);

    // ここに処理を書く

    self.extensionContext.completeRequestReturningItems([outputItem], completionHandler: nil)
}
```

`SLComposeServiceViewController`には入力チェクをする仕組みが用意されているので、`isContentValid()`をオーバーライドして入力チェックを実装できます。

```swift
override func isContentValid() -> Bool {
    // ここに入力チェックを書く

    return true
}
```

Share Extensionの呼び出しはこれまで通り`UIActivityViewController`を行います。

```swift
@IBAction func shareAction(sender: AnyObject) {
    let firstActivityItem = "test message"
    let secondActivityItem : NSURL = NSURL.URLWithString("http://www.mocology.com/");
    let activityViewController : UIActivityViewController = UIActivityViewController(
        activityItems: [firstActivityItem, secondActivityItem], applicationActivities: nil)
    activityViewController.completionWithItemsHandler = {(activityType, completed:Bool, returnedItems:Array!, error:NSError!) in
        if (completed) {
            // ここに完了後の処理を書く
        }
    }

    self.presentViewController(activityViewController, animated: true, completion: nil)
}
```

## 補足

Share Extensionでサポートするデータを指定することができます。
例えばターゲット作成時に自動生成されるinfo.plist内の`NSExtensionActivationRule`に定義します。

```xml
<key>NSExtensionAttributes</key>
    <dict>
        <key>NSExtensionActivationRule</key>
        <dict>
            <key>NSExtensionActivationSupportsImageWithMaxCount</key>
            <integer>10</integer>
            <key>NSExtensionActivationSupportsMovieWithMaxCount</key>
            <integer>1</integer>
            <key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
            <integer>1</integer>
        </dict>
    </dict>
```

現状では下記の６つの項目をサポートしています。

- NSExtensionActivationSupportsTextWithMaxCount
- NSExtensionActivationSupportsImageWithMaxCount
- NSExtensionActivationSupportsMovieWithMaxCount
- NSExtensionActivationSupportsFileWithMaxCount
- NSExtensionActivationSupportsWebURLWithMaxCount
- NSExtensionActivationSupportsWebPageWithMaxCount

## まとめ
Share Extensionについては情報が多くないので、簡単にまとめた部分だけを書いてみました。
今後も情報を追加していきたいと思います。

Today Extensionについてブログに書いていますのでこちらもあわせてどうぞ。

http://sakahara.hatenablog.jp/entry/2014/07/11/014033
Ansibleパフォーマンスチューニング

Ansileシンプルで好きで使ってますが、たまにパフォーマンスが気になってました。
つい先日Ansibleの公式ブログに[パフォーマンスチューニングのtips](http://www.ansible.com/blog/ansible-performance-tuning)が書かれてたので自分が知らなかったところを中心に紹介します。
常識的なものも多いかもですがご容赦ください。

# パッケージインストールを効率化する
* yumとかでパッケージインストールとかするならローカルのMirrorレポジトリを使おう。
* [reposync](http://yum.baseurl.org/wiki/RepoTools)とか使うと簡単にMirrorが作れて良い。
* 複数パッケージのインストールは[with_items](http://docs.ansible.com/playbooks_loops.html#standard-loops)を使って一つのトランザクションにしよう。

# forksで並列度を設定する
* 同時にAnsibleのタスクが走るのは[forks](http://docs.ansible.com/intro_configuration.html#forks)で決まる。
* デフォルトは5だけど保守的なので増やした方が良い。50とかでも良いし、500以上にしてるケースもある。
* Ansible1.3からはどんなに増やしても設定対象ノード数を超えることはない。
* local_actionとかがあると詰まるから別のplaybookにする等しよう。
* ちなみにforksの設定は以下のどこかに書く。
 * ANSIBLE_CONFIG (環境変数)
 * ansible.cfg (カレントディレクトリ)
 * .ansible.cfg (ホームディレクトリ)
 * /etc/ansible/ansible.cfg
* forksを絞るケースは[ローリングアップデート](http://docs.ansible.com/playbooks_delegation.html#rolling-update-batch-size)するときとかがある

# sshを速くしよう
## OpenSSH
* デフォルトだとネイティブなOpenSSHでControlPersistを使って接続する。
 * ControlPersistは[この辺](http://d.hatena.ne.jp/tmatsuu/20120707/1341677472)が参考になります。
 * ControlPersistソケットはファイルシステム上にソケットファイルが書かれるけど、ホスト名とかが長いとLinuxのファイルパスの長さの制約(大体108文字)に引っ掛かるので[control_path](http://docs.ansible.com/intro_configuration.html#control-path)変数で変える。
* [設定可能なタイムアウト値](http://docs.ansible.com/intro_configuration.html#ssh-args)でAnsibleのコネクションを開きっぱなしにできる。
 * デフォルトは60秒だけど、増やした方が良い。30分くらいが適切。
 * ただし1コネクションあたり1MBくらいメモリ使うから気をつけよう。
* [pipelining](http://docs.ansible.com/intro_configuration.html#pipelining)を有効にすると倍速くらいにはなるので有効にしょう。
 * デフォルトで有効になってないのは、全ての設定対象ノード上で/etc/sudoerのrequirettyをオフにしないとsudo操作するときに問題になるから。

## paramiko
* EL6以前のOSからAnsibleを実行するとOpenSSHじゃなくてpure-pythonのSSHクライアントであるparamiko使う。
* paramiko使うときはアクションのたびに各ホストに再接続してしまう。
* これを防ぐには[accelerated mode](http://docs.ansible.com/playbooks_acceleration.html)を使うと良いって書いてあるけどリンク先見るとpipelining使った方がよさ気なことが書かれてる。

# pull mode
* ここまでのことをやっておけばいらないと思うけど、[ansible-pull](http://docs.ansible.com/playbooks_intro.html#ansible-pull)を使うのも良い。
* ansbile-pullはgitレポジトリのファイルを各ノードが定期的に読みに行って処理を実行するモードで、通常のpush型からpull型のアーキテクチャになるのでいくらでもスケールできる。
* ただし、ログの集約ができなくなるので、そんなときは[AnsibleTower](http://www.ansible.com/tower)を使おう。

***

こんな感じです。間違ってたらご指摘いただければと思います。
実際に試して計測したらどれくらい変わったか数字載せるかもです。
CentOSにJDK、Tomcatをyumでインストールしてしまったものを最新にするとき

# yumでインストールしたtomcatを削除する


## tomcatを停止する

```
sudo service tomcat6 stop
sudo /etc/rc.d/init.d/tomcat6 stop
```

## tomcatの自動起動をoff

```
sudo chkconfig tomcat6 off
```

## インストールしたTomcatを確認

```
yum list installed | grep tomcat
```

## tomcatをアンインストール

関係ありそうなものを削除

```
sudo yum remove -y tomcat6 tomcat6-webapps tomcat6-admin-webapps apache-tomcat-apis.noarch tomcat6-el-2.1-api.noarch tomcat6-jsp-2.1-api.noarch tomcat6-lib.noarch tomcat6-servlet-2.5-api.noarch
```

# yumでインストールしたJDKを削除する

## インストールしたJDKを確認

```
yum list installed | grep jdk
```

## JDKをアンインストール

関係ありそうなものを削除

```
sudo yum remove -y java-1.7.0-openjdk.i686 java-1.7.0-openjdk-devel.i686
```

# JDKを最新にする

## JDKのダウンロード

以下のアドレスからJDKのtarファイルをダウンロードして転送

http://www.oracle.com/technetwork/java/javase/downloads/index.html


## 転送したtarファイルを展開

```
tar xvf jdk-8u5-linux-i586.gz
```

## ディレクトリを移動

sudo mv jdk1.8.0_05 /usr/local/java/jdk1.8.0_05

## 移動したディレクトリにcd

cd /usr/local/java/

## バージョン名を削除したシンボリックリンクを作成

```
sudo ln -s jdk1.8.0_05 jdk
```

## JAVA_HOMEの環境変数を設定

```
export JAVA_HOME="/usr/local/java/jdk"
```

プリインストールされているjavaとjavacのシンボリックリンクを削除

```
cd /usr/bin
sudo rm java
sudo rm javac
```

シンボリックリンクをダウンロードして設定した場所に指定して作成

```
sudo ln -s $JAVA_HOME/bin/java java
sudo ln -s $JAVA_HOME/bin/javac javac
```

## javaのバージョンを確認

```
java -version
javac -version
```

最新になっていたらOK

# Tomcatを最新にする


## 最新のtomcatをダウンロードする

tomcat8のダウンロードページ
http://tomcat.apache.org/download-80.cgi

バイナリディストリビューションのtarファイルをダウンロード



## ダウンロードしたバイナリディストリビューションを展開

```
tar -xvzf apache-tomcat-8.0.9.tar.gz
```

## 解凍してできたディレクトリを移動

```
sudo mv apache-tomcat-8.0.9 /usr/local/tomcat8
```

## tomcatを起動

```
sudo /usr/local/tomcat8/bin/startup.sh
```

## ブラウザでアクセス

http://localhost:8080


起動スクリプトに起動コマンドを記述しておくとよい

```
sudo vim rc.local
```
```
sudo /usr/local/tomcat8/bin/startup.sh
```
Tera TermにSolarizedカラースキームを適用する

* 本記載内容を実施するにあたり以下を参考にしました。詳しくは以下を参照してください。
    * [TeraTermのカラー設定をSolarized Darkにする](http://orangeclover.hatenablog.com/entry/20130601/1370069597 "TeraTermのカラー設定をSolarized Darkにする")

# ターミナル画面を目に優しくしたい

## モチベーション
* コードとか見る認知負荷を下げたい
* 目にも優しい色合いにしたい


## Solarizedを使うことにした

![Solarized](https://lh3.googleusercontent.com/-nXtHAfCz9EU/U_8s1i8rrVI/AAAAAAAAAB0/Gqfg4W_t7ok/w633-h670-no/Solarized.png "Solarized")

* 「dark」と「light」の2種類
* どんなものかは本家サイト[Solarized]を見てね
* 説明文を以下引用しとく

> Solarized is a sixteen color palette (eight monotones, eight accent colors) designed for use with terminal and gui applications. It has several unique properties. I designed this colorscheme with both precise CIELAB lightness relationships and a refined set of hues based on fixed color wheel relationships. It has been tested extensively in real world use on color calibrated displays (as well as uncalibrated/intentionally miscalibrated displays) and in a variety of lighting conditions.

## Tera TermにSolarized

* 適用は簡単、Tera Term設定ファイル（`TERATERM.INI`）の該当箇所をコメントインするだけ

```:TERATERM.INI
;	ANSI color definition (in the case FullColor=on)
;	* UseTextColor should be off, or the background and foreground color of
;	  VTColor are assigned to color-number 0 and 7 respectively, even if
;	  they are specified in ANSIColor.
;	* ANSIColor is a set of 4 values that are color-number(0--15),
;	  red-value(0--255), green-value(0--255) and blue-value(0--255).
;ANSIColor=0,0,0,0, 1,255,0,0, 2,0,255,0, 3,255,255,0, 4,128,128,255, 5,255,0,255, 6,0,255,255, 7,255,255,255, 8,64,64,64, 9,192,0,0, 10,0,192,0, 11,192,192,0, 12,64,64,192, 13,192,0,192, 14,0,192,192, 15,192,192,192    ←：コメントアウト

; Solarized (http://ethanschoonover.com/solarized)
ANSIColor=0,7,54,66, 1,203,75,22, 2,88,110,117, 3,101,123,131, 4,131,148,150, 5,108,113,196, 6,147,161,161, 7,253,246,227, 8,0,43,54, 9,220,50,47, 10,133,153,0, 11,181,137,0, 12,38,139,210, 13,211,54,130, 14,42,161,152, 15,238,232,213    ←：コメントイン

;  	Text and background colors
;		for Normal characters
;VTColor=255,255,255,0,0,0    ←：コメントアウト
;	Solarized Dark
VTColor=131,148,150,0,43,54    ←：コメントイン
;	Solarized Light
;VTColor=101,123,131,253,246,227
;
;		for Bold characters
EnableBoldAttrColor=on
;VTBoldColor=255,255,0,0,0,0    ←：コメントアウト
;	Solarized Dark
VTBoldColor=147,161,161,0,43,54    ←：コメントイン
;	Solarized Light
;VTBoldColor=88,110,117,238,232,213
;
;		for Blink characters
EnableBlinkAttrColor=on
;VTBlinkColor=255,0,0,0,0,0    ←：コメントアウト
;	Solarized Dark
VTBlinkColor=133,153,0,0,43,54    ←：コメントイン
;	Solarized Light
;VTBlinkColor=133,153,0,253,246,227
;
;		for Reverse characters
EnableReverseAttrColor=on
;VTReverseColor=0,0,0,255,255,255    ←：コメントアウト
;	Solarized Dark
;VTReverseColor=0,43,54,131,148,150
VTReverseColor=101,123,131,253,246,227    ←：コメントイン
;	Solarized Light
;VTReverseColor=253,246,227,101,123,131
;VTReverseColor=131,148,150,0,43,54
;
;		for URL(hyper link) text color
EnableURLColor=on
URLUnderline=on
;URLColor=0,255,255,0,0,0    ←：コメントアウト
;	Solarized Dark
URLColor=181,137,0,0,43,54    ←：コメントイン
;	Solarized Light
;URLColor=181,137,0,253,246,227
;
```
---
[Solarized]: http://ethanschoonover.com/solarized "Solarized"