OmniAICreator/Qiita-1.07M huggingface dataset:
一瞬でシェルスクリプト作れるシェル関数作った

# なぜ

シェルスクリプトを書く時のボイラープレートが面倒になった。

あとはヘルプやオプションの形式の統一のとれたスクリプトのテンプレートを用意しておくことでチーム内でのレビューや野良スクリプトの扱いが楽になる。

# コード

これを .profileなり.bashrcなり.zshrcなりに貼っておく。zshでしか確認してないがPOSIX互換シェルならどれでも動く筈。

2017-06-13: オプションの処理を若干更新した

```bash
new-script() {
    cat <<'SHELLSCRIPT' > "$1"
#!/bin/sh
# templated by http://qiita.com/blackenedgold/items/c9e60e089974392878c8
usage() {
    cat <<HELP
NAME:
   $0 -- {one sentence description}

SYNOPSIS:
  $0 [-h|--help]
  $0 [--verbose]

DESCRIPTION:
   {description here}

  -h  --help      Print this help.
      --verbose   Enables verbose mode.

EXAMPLE:
  {examples if any}

HELP
}

main() {
    SCRIPT_DIR="$(cd $(dirname "$0"); pwd)"

    while [ $# -gt 0 ]; do
        case "$1" in
            --help) usage; exit 0;;
            --verbose) set -x; shift;;
            --) shift; break;;
            -*)
                OPTIND=1
                while getopts h OPT "$1"; do
                    case "$OPT" in
                        h) usage; exit 0;;
                    esac
                done
                shift
                ;;
            *) break;;
        esac
    done

    # do something
}

main "$@"

SHELLSCRIPT
    chmod +x "$1"
}
```


# 使い方

```bash
$ new-script path/to/scriptname.sh
```

ディレクトリは事前に作っておく必要がある。

他のオプションやヘルプはない。これ以上複雑なことをするならファイルに切り出す必要がある(POSIX Shellだと関数ローカルな変数を作れないため)。
そうすると手軽さが失われるのでこのままにしてある。

# 中身

まあ、やっていることはテンプレートをファイルに書き出して実行権限付けているだけなので大したことはしてない。
吐き出されるファイルはこうなる。

```bash
#!/bin/sh
# templated by http://qiita.com/blackenedgold/items/c9e60e089974392878c8
usage() {
    cat <<HELP
NAME:
   $0 -- {one sentence description}

SYNOPSIS:
  $0 [-h|--help]
  $0 [--verbose]

DESCRIPTION:
   {description here}

  -h  --help      Print this help.
      --verbose   Enables verbose mode.

EXAMPLE:
  {examples if any}

HELP
}

main() {
    SCRIPT_DIR="$(cd $(dirname "$0"); pwd)"

    while [ $# -gt 0 ]; do
        case "$1" in
            --help) usage; exit 0;;
            --verbose) set -x; shift;;
            --) shift; break;;
            -*)
                OPTIND=1
                while getopts h OPT "$1"; do
                    case "$OPT" in
                        h) usage; exit 0;;
                    esac
                done
                shift
                ;;
            *) break;;
        esac
    done

    # do something
}

main "$@"

```

ポイントは[オプションをパースする時の必勝法](http://keens.github.io/blog/2014/02/19/option-parse-for-shell/)を組み込んだ点とヘルプにもスクリプトのドキュメントにもなる `usage` 関数を組み込んだ点。

`main`はただのディスパッチャで処理は別の関数に切り出すつもりで作ってある。

usageは `man` っぽい形式にしてある。 `{}` で囲まれている部分を埋めればそれっぽい体裁は整う筈。

綺麗なシェルスクリプトで満たされる世の中であれ
Hyper-V Server 2012 R2の私的初期設定まとめ

Hyper-V Server 2012 R2をリモートから管理できるようにするための設定＋αです。

# 初期メニューから設定

ログイン後の最初のメニューから設定します。

- タイムゾーン
- コンピュータ名
- リモートデスクトップの有効化
- 管理ユーザの追加

# パスワードポリシーの変更

パスワードに対する複雑さへの要件が有効になっているので無効にします。お好みで。

→ http://qiita.com/sengoku/items/5de27e00ec5ffa8b76a9

# ファイアウォールの無効化

いろいろ面倒なので、無効にしてしまいます。ドメイン環境へ参加する場合は、無効にしなくてもよいかと思われます。

```
netsh advfirewall currentprofile state off
netsh advfirewall domainprofile state off
netsh advfirewall privateprofile state off
netsh advfirewall publicprofile state off
```

# WINRMを初期化

```
winrm qc -force
```

# WSMan接続時のCredSSPを有効化

PowerShellから

```ps1:
Enable-WSManCredSSP
```

# Primary Dns Suffixを設定

`ipconfig /all `コマンドを実行したときに表示されるPrimary Dns Suffixを設定します。

レジストリへ直接書き込みます。

```
reg add HKLM\System\currentcontrolset\services\tcpip\parameters /v “NV Domain” /d “example.com” /f
```

# proxyを設定

netshコマンドで設定できるproxyと、IEからじゃないと設定できないproxyがあります。

PowerShellは後者の設定を使うみたいです。なんとも面倒なことになっていますね。 :disappointed: 

```
netsh winhttp set proxy proxy.my.domain:8080 bypass-list=<local>
```

```ps1:
cd 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings\'
Set-ItemProperty -Path . -Name ProxyEnable -Value 1
New-ItemProperty -Path . -Name ProxyServer -Value proxy.my.domain:8080
New-ItemProperty -Path . -Name ProxyOverride -Value '<local>'
```
Python 基礎文法（雑）めも (3)


2.7ベース。
(1) は[こちら](http://qiita.com/kazoo/items/762c98bb3d1491105bb1)。
(2) は[こちら](http://qiita.com/kazoo/items/a4fbd3ab5832b71aae82)。

## 関数
def キーワードを使って宣言。

```python
>>> def test(arg):
...    print(arg)
...
>>> test('hoge')

hoge
```

### 引数のキーワード指定

```python
>>> test(arg="hogehoge")

hogehoge
```

### 可変引数
引数の前にアスタリスクを付けると、キーワード指定しない引数をいくつでも受け付けることができる。

```python
>>> def test(a, b, *args):
...     print(a, b, args)
...
>>> test(1, 2, 3, 4, 5)

(1, 2, (3, 4, 5))

# 空でもOK
>>> test(1, 2)

(1, 2, ())

# キーワード指定はできない
>>> test(1, 2, args = 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: test() got an unexpected keyword argument 'args'
```

### 未定義のキーワード引数
アスタリスクを2個付けた引数を定義すると、キーワード指定された未定義の引数を取れるようになる。

```python
>>> def test(a, b, **args):
...    print(a, b, args)
...
>>> test(1, 2, c=3, d=4)

1, 2, {'c' : 3, 'd' : 4} # ディクショナリとして代入される

# キーワード無しは NG となる
>>> test(1, 2, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: test() takes exactly 2 arguments (3 given)

```

*val や **args のような引数は、引数リストの最後に置くようにする

### デフォルト引数

```python
>>> def test(arg="hogehoge"):
...    print(arg)
...
>>> test()

hogehoge
```

## ファイル操作
### ファイル型
組み込み関数 `open()` を使う。引数は C の fopen() とほぼ同じ。

```python
>>> f = open("foo.txt", "r")
>>> s = f.read()  # ファイル内容をすべて読み込む
>>> f.close

# python3系では、ファイルのエンコード/デコードに使われる text encoding を指定する引数を持つ
# f = open("foo.txt", "r", encoding='utf-8')
```

Python2系のopen:
http://docs.python.jp/2/library/functions.html?highlight=open#open

Python3系のopen:
http://docs.python.jp/3/library/functions.html?highlight=open#open

ここでは省略するが、Python3 での Unicode 対応についてはあちこちに情報がある。例えばこれ。
http://postd.cc/why-python-3-exists/

#### モード
第2引数の意味。

| 記号 | 意味 | 
|:-----------:|:------------|
|'r'	|読み込み用に開く (デフォルト)|
|'w'	|書き込み用に開き、ファイルはまず切り詰められる|
|'x'	|排他的な生成に開き、ファイルが存在する場合は失敗する|
|'a'	|書き込み用に開き、ファイルが存在する場合は末尾に追記する|
|'b'	|バイナリモード|
|'t'	|テキストモード (デフォルト)|
|'+'	|ディスクファイルを更新用に開く (読み込み／書き込み)|

### 読み込み
	f.read(size)

指定したサイズ（省略するとファイルの終わりまで）をファイルから読み込み、文字列を返す。

	f.readline(size)

指定した行数（省略すると1行）を読み込み、文字列を返す。

	f.readlines(size)

指定した行数を上限（無ければファイルの最後まで）にファイルから複数行を読み込み、文字列を要素としたリストを返す。

sample:テキストファイルを1行ずつ処理

```python
>>> f = open("test.txt", 'r')
>>> for line in f:
...    print(line, end=" ")   # 1行ずつ表示

```

### 書き出し
	f.write(str)
	
文字列を指定してファイルに書き込む。

	f.writelines(sequence)

文字列を要素に含むシーケンス（リストなど）を引数に取り、ファイルに書き込む（要素ごとに改行文字は追加されない）。
net-snmp関連のコマンドで出てくるであろうエラーメッセージ一覧

net-snmpのコマンド、snmpgetやsnmpwalkを実行したときに、
出てくるであろうエラーメッセージの一覧。

net-snmpの、snmp_client.cに書いてある。

http://www.net-snmp.org/dev/agent/snmp__client_8c_source.html


```c

const char     *
snmp_errstring(int errstat)
{
    const char * const error_string[19] = {
        "(noError) No Error",
        "(tooBig) Response message would have been too large.",
        "(noSuchName) There is no such variable name in this MIB.",
        "(badValue) The value given has the wrong type or length.",
        "(readOnly) The two parties used do not have access to use the specified SNMP PDU.",
        "(genError) A general failure occured",
        "noAccess",
        "wrongType (The set datatype does not match the data type the agent expects)",
        "wrongLength (The set value has an illegal length from what the agent expects)",
        "wrongEncoding",
        "wrongValue (The set value is illegal or unsupported in some way)",
        "noCreation (That table does not support row creation or that object can not ever be created)",
        "inconsistentValue (The set value is illegal or unsupported in some way)",
        "resourceUnavailable (This is likely a out-of-memory failure within the agent)",
        "commitFailed",
        "undoFailed",
        "authorizationError (access denied to that object)",
        "notWritable (That object does not support modification)",
        "inconsistentName (That object can not currently be created)"
    };

    if (errstat <= MAX_SNMP_ERR && errstat >= SNMP_ERR_NOERROR) {
        return error_string[errstat];
    } else {
        return "Unknown Error";
    }
}

```
rbenv | global と local と .ruby-version の微妙な関係

## $ rbenv global x.x.x

システム全体で使う ruby のバージョンを指定する。
だが実は、 `~/.rbenv/version` ファイルを書き出すだけのコマンド。

```bash
$ rbenv global 2.2.0 # => ~/.rbenv/version に 2.2.0 と書き出される
```

なので他の方法で `~/.rbenv/version` を作ったり、削除したりしても。ruby バージョンが変わる。

## $ rbenv local x.x.x

プロジェクトごとに使う ruby のバージョンを指定する。
だが実は、カレントディレクトリに `.ruby-version` ファイルを書き出すだけのコマンド。

```bash
$ rbenv global 2.3.0 # => ./.ruby-version に 2.3.0 と書き出される
```

なので他の方法で `.ruby-version` を作ったり、削除したりしても。ruby バージョンが変わる。

## rbenv の挙動

先に述べたとおり、`rbenv global / rbenv local` はファイルを作るだけだ。
実際には rbenv の挙動が ruby のバージョンを決めている。

### 順序

rbenv は、まずカレントディレクトリの `.ruby-version` を見る。あればそれを使う。

もし無ければ、ひとつ上のディレクトリの `.ruby-version` を見る。あればそれを使う。
これをホームディレクトリ `~/` にたどりつくまで繰り返す。

ホームディレクトリまで辿っても `.ruby-version` がなければ、 `~/rbenv/version` を見る。あればそれを使う。

つまり、ホームディレクトリに `.ruby-version` を作ってしまうと、global はどこからも参照されなくなる。

# 環境

- rbenv 0.4.0
- Mac OS X Yosemite




<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
【備忘録】Excel強引並び替え

例えば
A        B       C
1/1      1       OK
1/1      1       NG
1/1      2       OK
1/1      2       NG


というデータがあった場合、普通にソートしても
1 OK
1 NG
2 OK
2 NG

か

1 OK
2 OK
1 NG
2 NG

にしかならないと思う

だけど、特殊な状況で、どうしても
1 OK
2 NG

とさせたい場合
ちょっと強引だけどできなくもない。

【やり方】
・D列を追加
・フィルタ機能で「1 OK」を抽出し
・「1 OK」の行のD列に、「1」を入力
・フィルタ外す
・フィルタ機能で「2 NG」を抽出し
・「2 NG」の行のD列に、「1」を入力
・ほかのやつらを適当に大きな数字にする
・全てのフィルタリングを外し、あとはD列を昇順にソートしてやれば
できるはず！！！！


自分はこのやり方でどうにかできた（無責任）
shellでSQLの出力をCSVに変換する方法

便利だったのでメモします。

# 説明

mysqlのコマンドを打つと下記のような出力になります。

```sh:コマンド
mysql -u root --execute="select user, host from mysql.user where host=\"127.0.0.1\";"
```

```text:出力
+------+-----------+
| user | host      |
+------+-----------+
| root | 127.0.0.1 |
+------+-----------+
```


trというコマンドを下記のように使うと、csv形式に変換できます。

```sh:コマンド
mysql -u root --execute="select user, host from mysql.user where host=\"127.0.0.1\";" | tr '\t', ','
```

```text:出力
user,host
root,127.0.0.1
```

もっと良い方法があれば、情報を共有して頂けると嬉しいです。

# 参考

http://stackoverflow.com/a/12843017/3774895
Mix Config - Elixir プロジェクトの設定管理

Ruby 脳のおかげで、YAML にでも必要な設定を書こうと思ったら、[偉い人がそれはダメって言ってました。](https://twitter.com/josevalim/status/626131275150065665)

良い感じの config ファイルが既にあるとのこと。使い方の詳しいことは[Mix.Config](http://elixir-lang.org/docs/stable/mix/Mix.Config.html) を見てもらえればと。

よくわからなかったので、コンソールでちょっとだけいじってみました。Elixir の書き方を知らないので、基本はドキュメントからコピペで動かしてます。

## 準備：プロジェクトからコンソールを起動

プロジェクトを新規作成して、

```
% mix new ex
* creating README.md
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/ex.ex
* creating test
* creating test/test_helper.exs
* creating test/ex_test.exs

Your Mix project was created successfully.
You can use "mix" to compile it, test it, and more:

    cd ex
    mix test

Run "mix help" for more commands.
```

プロジェクトをコンパイルして、

```
% mix compile
Compiled lib/ex.ex
Generated ex app
Consolidated List.Chars
Consolidated String.Chars
Consolidated Collectable
Consolidated Enumerable
Consolidated IEx.Info
Consolidated Inspect
```

コンソールを起動する

```
iex -S mix
```

## プロジェクトに設定されたすべての設定内容を読み取る

`Application.get_all_env` を使うと読み込めるらしい。引数にプロジェクト名を表す atom (symbol) を指定するらしい。

```
iex> Application.get_all_env(:ex)
[included_applications: []]
```

何も設定していないので、空です。 `config/` 以下に実行環境に応じて設定を書くのがお作法みたいです。

## 設定を追加する

`Mix.Config.persist` を使うと設定を追加できるみたい。

```
iex> Mix.Config.persist(ex: [author: :yulii, type: :qiita])
[:ex]
iex> Application.get_all_env(:ex)
[included_applications: [], author: :yulii, type: :qiita]
```

## 特定の設定を読み取る

`Application.fetch_env` すると読み取れるっぽいです。`!` の取り扱いがよくわかりませんので、両方やってみました。

### 設定されているキーを読み取る

```
iex> Application.fetch_env(:ex, :author)  
{:ok, :yulii}
iex> Application.fetch_env!(:ex, :author)
:yulii
```

### 設定されていないキーを参照する

```
iex> Application.fetch_env(:ex, :unknown) 
:error
iex> Application.fetch_env!(:ex, :unknown)
** (ArgumentError) application :ex is not loaded, or the configuration parameter :unknown is not set
    (elixir) lib/application.ex:203: Application.fetch_env!/2
```

## 他の使い方を調べる

タブを叩くと候補が出てくるので、適宜ドキュメント見ながら試してみると良さそう。

### Application の関数

```
iex> Application.
app_dir/1                 app_dir/2                 delete_env/3              
ensure_all_started/2      ensure_started/2          fetch_env!/2              
fetch_env/2               format_error/1            get_all_env/1             
get_application/1         get_env/3                 load/1                    
loaded_applications/0     put_env/4                 spec/1                    
spec/2                    start/2                   started_applications/1    
stop/1                    unload/1         
```

### Mix.Config の関数

```
iex> Mix.Config. 
Agent               LoadError           config/2            
config/3            import_config/1     merge/2             
persist/1           read!/1             read_wildcard!/1    
validate!/1   
```

Elixir 初めて触ったので、用語とか違ってたらゴメンナサイ。。
すぐに使えるTomcat8のserver.xml

## はじめに
Tomcat8.5.9をベースにしました。
http://tomcat.apache.org/

## 設定例
以下の点に注意して無駄なものを省いてあります。

- ポート8009でApacheと連携できる
- ポート8080で単体で稼働(主に状態確認用)できる
- HttpServletRequest#setCharacterEncodingがGETパラメータにも適用される(useBodyEncodingForURI)
- ユーザのホストをlookupできる(enableLookups)
- POSTのデータサイズを10Mに制限(maxPostSize)
- appBaseを/home側に移動(Tomcat本体の配置場所から遠ざけ、アプリケーション配置時の事故等を防止)

```xml:server.xml
<?xml version='1.0' encoding='utf-8'?>
<Server>
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" useBodyEncodingForURI="true"
               enableLookups="true" />
    <Connector port="8009" protocol="AJP/1.3"
               redirectPort="8443" useBodyEncodingForURI="true"
               enableLookups="true" maxThreads="600" maxPostSize="10485760" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost" appBase="/home/wwwuser/data/webapps"
            unpackWARs="true" autoDeploy="true">
      </Host>
    </Engine>
  </Service>
</Server>
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

Webツールも公開しています。
[Web便利ツール@ツールタロウ](http://tool-taro.com/)
ループバックデバイスを使ってDRBDを構築

HA構成を構築する際、オープンソースだとpacemakerとDRBDによる構成が良く使われるが、DRBDを動作させるためにはサーバにDRBD専用のディスクを追加する必要がある。
IaaSなどの環境を利用しておりディスクを簡単に追加できないような場合は、ループバックデバイスを用いることでDRBDを動作させることが出来る。

**注意：この方法はデッドロックの問題から公式には推奨されていません。ミッションクリティカルな用途には使わない方がいいかと思われます。**
[The DRBD User’s Guide : Chapter 5. Configuring DRBD](http://drbd.linbit.com/users-guide/ch-configure.html)

## ループバックデバイスとは？

> 一般的なファイルを，あたかもハード・ディスクなどのブロック型デバイスであるかのように扱うための機能です。パソコン上でイメージ・ファイルを直接操作したい場合などに使います。「ループ・デバイス」とも呼ばれます。」

出典：[Linuxキーワード - ループバック・デバイス：ITpro](http://itpro.nikkeibp.co.jp/article/Keyword/20080118/291396/)

今回はループバックデバイスをDRBD用のディスクとして利用する。

## 環境

今回はVagrant上の仮想マシン二台で構築した。以前の記事 [Vagrantを使ってDRBD+pacemaker+corosyncによるHA構成を構築する (その1: DRBDのインストール～設定)](http://qiita.com/k-awa/items/5a6a974edf1fb10882da) ではディスクを追加したが、今回はディスクを追加せずに行う。

### ホスト
- Vagrant 1.8.1
- VirtualBox 4.3.26

### ゲスト1
- OS：CentOS7.1
- ホスト名：node01
- IPアドレス：192.168.33.101

### ゲスト2
- OS: CentOS 7.1
- ホスト名: node02
- IPアドレス: 192.168.33.102

## DRBDのインストール

以前の記事 [Vagrantを使ってDRBD+pacemaker+corosyncによるHA構成を構築する (その1: DRBDのインストール～設定)](http://qiita.com/k-awa/items/5a6a974edf1fb10882da) と同様に実行する。前述の通りディスクは追加しないので、Vagrantfileへのディスク追加の記述は不要。

## ループバックデバイスの作成

ループバックデバイスを作成する。以下ではディスクサイズを1000Mとしているが、必要に応じ設定する。

```
$ sudo dd if=/dev/zero of=/var/disk bs=1M count=1000
```

作成したループバックデバイスを接続する。

```
$ sudo losetup /dev/loop0 /var/disk
```

## DRBDの設定ファイルを作成する。

接続したデバイスの情報を元に、設定ファイルを記述する。

```
$ sudo vi /etc/drbd.d/disk.res
resource r0 {
        protocol C;

        startup {
                wfc-timeout 120;
        }
        disk {
                on-io-error pass_on;
        }
        on node01 {
                device /dev/drbd0;
                disk /dev/loop0;
                address 192.168.33.101:7788;
                meta-disk internal;
        }
        on node02 {
                device /dev/drbd0;
                disk /dev/loop0;
                address 192.168.33.102:7788;
                meta-disk internal;
        }
}
```

## DRBDの起動と動作検証

これまでの操作を二台のホスト両方に対して行う。
これ以降は以前の記事 [Vagrantを使ってDRBD+pacemaker+corosyncによるHA構成を構築する (その1: DRBDのインストール～設定)](http://qiita.com/k-awa/items/5a6a974edf1fb10882da) と全く同様に行う。

このように、サーバにディスクを追加しなくてもDRBDを構築することが出来る。
自分の起動したプロセスのPIDを全て知りたい

たくさんプロセスを起動したけど、
間違いに気づいて全部終了したいときって、
ありますよね。。。

ps aux | grep ^user | sed -e "s/\s\+/\t/g" | cut -f 2

参考：
http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231171/?ST=oss
http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230879/?ST=oss
Java 文字列が正しい日時を表しているかの判定

## はじめに
事前に準備する外部ライブラリ等はありません。
JavaSEに含まれるjava.text.SimpleDateFormatクラスを使用します。

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。

```java:DateChecker.java
import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 *
 * @author tool-taro.com
 */
public class DateChecker {

	public static void main(String[] args) {

		//判定したい文字列
		String source = "2016/02/02 12:34:56";
		//判定したいパターン
		String pattern = "yyyy/MM/dd HH:mm:ss";

		//判定処理
		boolean result = false;
		try {
			SimpleDateFormat formatter = new SimpleDateFormat(pattern);
			//存在しない日(例 2017/02/29)の場合はfalseとする
			result = source.equals(formatter.format(formatter.parse(source)));
		}
		catch (ParseException e) {
		}
		//標準出力
		System.out.format("判定結果=%1$b", result);
	}
}
```
## 動作確認

```
$ javac DateChecker.java
$ java DateChecker
$ 判定結果=true
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

Webツールも公開しています。
[Web便利ツール@ツールタロウ](http://tool-taro.com/)
Java 文字列が正しい数値を表しているかの判定(少数対応)

## はじめに
事前に準備する外部ライブラリ等はありません。

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。

```java:DoubleChecker.java
/**
 *
 * @author tool-taro.com
 */
public class DoubleChecker {

	public static void main(String[] args) {

		//判定したい文字列
		String source = "12345.6";

		//判定処理
		boolean result = false;
		try {
			Double.parseDouble(source);
			result = true;
		}
		catch (NumberFormatException e) {
		}
		//標準出力
		System.out.format("判定結果=%1$b", result);
	}
}
```
## 動作確認

```
$ javac DoubleChecker.java
$ java DoubleChecker
$ 判定結果=true
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

Webツールも公開しています。
[Web便利ツール@ツールタロウ](http://tool-taro.com/)
Java 文字列が正しい数値を表しているかの判定(整数のみ)

## はじめに
事前に準備する外部ライブラリ等はありません。

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。

```java:LongChecker.java
/**
 *
 * @author tool-taro.com
 */
public class LongChecker {

	public static void main(String[] args) {

		//判定したい文字列
		String source = "12345";

		//判定処理
		boolean result = false;
		try {
			Integer.parseInt(source);
			result = true;
		}
		catch (NumberFormatException e) {
		}
		//標準出力
		System.out.format("判定結果=%1$b", result);
	}
}
```
## 動作確認

```
$ javac LongChecker.java
$ java LongChecker
$ 判定結果=true
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

Webツールも公開しています。
[Web便利ツール@ツールタロウ](http://tool-taro.com/)
Webサイトのタイトル・テキスト取得

## はじめに
事前に以下のライブラリを用意します。

- jsoup
    - http://jsoup.org/download
    - ※"jsoup-1.10.3.jar"のリンクからダウンロード

今回のサンプルは以下のjarがあれば動作します。

- jsoup-1.10.3.jar

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。
結果だけを確認したい場合は、この記事の一番下のリンク先で使えるようにしてありますのでご覧ください。

```java:Wget.java
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 *
 * @author tool-taro.com
 */
public class Wget {

	public static void main(String[] args) throws IOException {

		//取得したいURL
		String url = "http://tool-taro.com";
		//ユーザエージェント(ある程度最新のブラウザを指定しないとコンテンツを返してくれないサイトがある)
		String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36";

		//取得・パース処理
		Document document = Jsoup.connect(url).userAgent(userAgent).get();
		Elements elements = document.body().getAllElements();
		StringBuilder builder = new StringBuilder();
		for (Element element : elements) {
			if (element.ownText() == null) {
				continue;
			}
			builder.append(element.ownText()).append("\n");
		}
		//標準出力
		System.out.format("タイトル=%1$s, 本文=%2$s", document.title(), builder.toString());
	}
}
```
## 動作確認

```
$ javac Wget.java
$ java Wget
$ タイトル=Web便利ツール@ツールタロウ, 本文=Web便利ツール@ツールタロウ
ツールタロウのブログ
Web便利ツール一覧
Web制作やシステム開発に便利な無料ツール集。
...(省略)
```
実際に使う際には、Webサイトの著作権等に充分ご注意ください。
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_144
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.3
	- JDK 1.8.0_144

上記の実装をベースにWebツールも公開しています。
[WebサイトのHTMLテキスト取得｜Web便利ツール@ツールタロウ](http://tool-taro.com/wget/)
[Webサイトのクロール｜Web便利ツール@ツールタロウ](http://tool-taro.com/crawl/)
文字数・バイト数カウント

## はじめに
事前に準備する外部ライブラリ等はありません。

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。
結果だけを確認したい場合は、この記事の一番下のリンク先で使えるようにしてありますのでご覧ください。

```java:StringCounter.java
import java.io.UnsupportedEncodingException;

/**
 *
 * @author tool-taro.com
 */
public class StringCounter {

	public static void main(String[] args) throws UnsupportedEncodingException {

		//カウントしたい文字列
		String source = "タロウ\n タロウ ";
		//カウント方法(Count/UTF-8/Shift_JIS/JIS/EUC_JP)
		String method = "Count";

		//カウント処理
		int stringCountWithSpace;
		int stringCountWithoutSpace;
		int returnCount = 0;

		//スペースあり＋改行なしの文字
		String stringWithSpace = source.replaceAll("\n", "");
		//スペースなし＋改行なしの文字
		String stringWithoutSpace = source.replaceAll("\\s|　", "");

		//行数カウント
		for (int i = 0; i < source.length(); i++) {
			switch (source.charAt(i)) {
				case '\n':
					returnCount++;
					break;
			}
		}
		returnCount++;

		//文字数・バイト数カウント
		switch (method) {
			case "Count":
				stringCountWithSpace = stringWithSpace.length();
				stringCountWithoutSpace = stringWithoutSpace.length();
				break;
			default:
				stringCountWithSpace = stringWithSpace.getBytes(method).length;
				stringCountWithoutSpace = stringWithoutSpace.getBytes(method).length;
				break;
		}
		//標準出力
		System.out.format("文字数/バイト数(スペース込み)=%1$d, 文字数/バイト数(スペース無視)=%2$d, 行数=%3$d, ", stringCountWithSpace, stringCountWithoutSpace, returnCount);
	}
}
```
## 動作確認

```
$ javac StringCounter.java
$ java StringCounter
$ 文字数/バイト数(スペース込み)=8, 文字数/バイト数(スペース無視)=6, 行数=2
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

上記の実装をベースにWebツールも公開しています。
[文字数・バイト数カウント(String Count)｜Web便利ツール@ツールタロウ](http://tool-taro.com/string_count/)
簡単なセッション保持

location.href=URL で飛ばす時に値もっていきたい事は多々ありますよね

hiddenをごそっと

```js
function getval(){
	var d = new Date();
	var a = ["_gt=" + d.getTime()];
	var input = document.getElementsByTagName('input');
	for(var i=0; i < input.length; i++){
		if(input[i].type != 'hidden') continue;
		a.push(input[i].name +'='+ input[i].value);
	}
	console.log(a.join('&'));
	return a.join('&');
}

location.href='?' + getval();
```

時間を貼りつけるのはキャッシュ防止です。

```js
function getval2(keys){
	var d = new Date();
	var a = ["_gt=" + d.getTime()];
	for(var i=0; i < keys.length; i++){
		var e = document.getElementsByName(keys[i]);
		a.push(e[0].name+'='+e[0].value);
	}
	console.log(a.join('&'));
	return a.join('&');
}

location.href='?' + getval2(['a', 'b', 'c']);
```
必要なとこだけください。

document.getElementsByName()は配列で来るのでe[0]を取るのです。
アクセス元のIPアドレス確認

## はじめに
事前に準備する外部ライブラリ等はありません。

## 実装例
サンプルでは、動作確認しやすいようにjspで実装しています。
結果だけを確認したい場合は、この記事の一番下のリンク先で使えるようにしてありますのでご覧ください。

```jsp:request_info.jsp
<%-- 
    Author     : tool-taro.com
--%>

<%@page contentType="text/html" pageEncoding="UTF-8" session="false" %>
<!DOCTYPE html>
<html>
    <head>
        <title>tool-taro.com</title>
    </head>
    <body>
        REMOTE_HOST: <%= request.getRemoteHost()%><br>
        REMOTE_ADDR: <%= request.getRemoteAddr()%><br>
        HTTP_REFERER: <%= request.getHeader("Referer")%><br>
        HTTP_ACCEPT_ENCODING: <%= request.getHeader("Accept-Encoding")%><br>
        HTTP_ACCEPT: <%= request.getHeader("Accept")%><br>
        HTTP_USER_AGENT: <%= request.getHeader("User-Agent")%><br>
        HTTP_ACCEPT_LANGUAGE: <%= request.getHeader("Accept-Language")%><br>
        HTTP_HOST: <%= request.getHeader("Host")%><br>
        HTTP_CONNECTION: <%= request.getHeader("Connection")%><br>
        HTTP_CACHE_CONTROL: <%= request.getHeader("Cache-Control")%><br>
    </body>
</html>
```
## 動作確認
実際にTomcatなどのサーブレットコンテナに設置して実行してみてください。
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

上記の実装をベースにWebツールも公開しています。
[IPアドレス確認｜Web便利ツール@ツールタロウ](http://tool-taro.com/request_info/)
URLデコード

## はじめに
事前に準備する外部ライブラリ等はありません。
JavaSEに含まれるjava.net.URLDecoderクラスを使用します。

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。
結果だけを確認したい場合は、この記事の一番下のリンク先で使えるようにしてありますのでご覧ください。

```java:MyURLDecoder.java
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

/**
 *
 * @author tool-taro.com
 */
public class MyURLDecoder {

	public static void main(String[] args) throws UnsupportedEncodingException {

		//デコードしたい文字列
		String source = "%E3%82%BF%E3%83%AD%E3%82%A6";
		//デコード後に文字列に置き換える際のエンコーディング
		String encoding = "UTF-8";

		//デコード処理
		String result = URLDecoder.decode(source, encoding);
		//標準出力
		System.out.format("デコード結果=%1$s", result);
	}
}
```
## 動作確認

```
$ javac MyURLDecoder.java
$ java MyURLDecoder
$ デコード結果=タロウ
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

上記の実装をベースにWebツールも公開しています。
[URLデコード(URL Decode)｜Web便利ツール@ツールタロウ](http://tool-taro.com/url_decode/)
URLエンコード

## はじめに
事前に準備する外部ライブラリ等はありません。
JavaSEに含まれるjava.net.URLEncoderクラスを使用します。

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。
結果だけを確認したい場合は、この記事の一番下のリンク先で使えるようにしてありますのでご覧ください。

```java:MyURLEncoder.java
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

/**
 *
 * @author tool-taro.com
 */
public class MyURLEncoder {

	public static void main(String[] args) throws UnsupportedEncodingException {

		//エンコードしたい文字列
		String source = "タロウ";
		//エンコード前にバイト配列に置き換える際のエンコーディング
		String encoding = "UTF-8";

		//エンコード処理
		String result = URLEncoder.encode(source, encoding);
		//標準出力
		System.out.format("エンコード結果=%1$s", result);
	}
}
```
## 動作確認

```
$ javac MyURLEncoder.java
$ java MyURLEncoder
$ エンコード結果=%E3%82%BF%E3%83%AD%E3%82%A6
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

上記の実装をベースにWebツールも公開しています。
[URLエンコード(URL Encode)｜Web便利ツール@ツールタロウ](http://tool-taro.com/url_encode/)
QRコード読み取り

## はじめに
事前に以下のライブラリを用意します。

- ZXing
    - jarファイルをMaven Repositoryから取得すると使いやすいです。
    - https://mvnrepository.com/artifact/com.google.zxing/core/3.3.0
    - https://mvnrepository.com/artifact/com.google.zxing/javase/3.3.0
    - ※"Download ( JAR ) "のリンクからダウンロード

今回のサンプルは以下のjarがあれば動作します。

- core-3.3.0.jar
- javase-3.3.0.jar

読み取る画像は以下のファイルを使います。
![qr_code.png](https://qiita-image-store.s3.amazonaws.com/0/111947/c3255d18-d789-aaaf-ca4a-6af9b7a7dce8.png)

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。
結果だけを確認したい場合は、この記事の一番下のリンク先で使えるようにしてありますのでご覧ください。

```java:QRCodeReader.java
import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.FormatException;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.Reader;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

/**
 *
 * @author tool-taro.com
 */
public class QRCodeReader {

	public static void main(String[] args) throws IOException, NotFoundException, ChecksumException, FormatException {

		//読み取りたい画像ファイルの保存場所
		String filePath = "qr_code.png";

		//読み取り処理
		BufferedImage image = ImageIO.read(new File(filePath));
		LuminanceSource source = new BufferedImageLuminanceSource(image);
		BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
		Reader reader = new MultiFormatReader();
		Result decodeResult = reader.decode(bitmap);

		//デコード処理
		String result = decodeResult.getText();
		//標準出力
		System.out.format("読み取り結果=%1$s", result);
	}
}
```
## 動作確認

```
$ javac QRCodeReader.java
$ java QRCodeReader
$ 読み取り結果=タロウ
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.3
	- JDK 1.8.0_112

上記の実装をベースにWebツールも公開しています。
[QRコード読み取り(QR Code Reader)｜Web便利ツール@ツールタロウ](http://tool-taro.com/qr_code_encode/)
QRコード生成

## はじめに
事前に以下のライブラリを用意します。

- ZXing
    - jarファイルをMaven Repositoryから取得すると使いやすいです。
    - https://mvnrepository.com/artifact/com.google.zxing/core/3.3.0
    - https://mvnrepository.com/artifact/com.google.zxing/javase/3.3.0
    - ※"Download ( JAR ) "のリンクからダウンロード

今回のサンプルは以下のjarがあれば動作します。

- core-3.3.0.jar
- javase-3.3.0.jar

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。
結果だけを確認したい場合は、この記事の一番下のリンク先で使えるようにしてありますのでご覧ください。

```java:QRCodeEncoder.java
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import javax.imageio.ImageIO;

/**
 *
 * @author tool-taro.com
 */
public class QRCodeEncoder {

	public static void main(String[] args) throws WriterException, IOException {

		//QRコード生成したい文字列
		String source = "タロウ";
		//QRコード生成時のエンコーディング
		String encoding = "UTF-8";
		//サイズ(ピクセル)
		int size = 100;
		//画像ファイルの保存先
		String filePath = "qr_code.png";

		//生成処理
		ConcurrentHashMap hints = new ConcurrentHashMap();
		//エラー訂正レベル指定
		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
		//エンコーディング指定
		hints.put(EncodeHintType.CHARACTER_SET, encoding);
		//マージン指定
		hints.put(EncodeHintType.MARGIN, 0);
		QRCodeWriter writer = new QRCodeWriter();
		BitMatrix bitMatrix = writer.encode(source, BarcodeFormat.QR_CODE, size, size, hints);
		BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);

		//ファイルへの保存処理
		ImageIO.write(image, "png", new File(filePath));
	}
}
```
## 動作確認

```
$ javac QRCodeEncoder.java
$ java QRCodeEncoder
```
以下のような画像が出力されているはずです。
![qr_code.png](https://qiita-image-store.s3.amazonaws.com/0/111947/bf61b8f0-5db1-b461-2b8d-f39b02484e1f.png)
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.3
	- JDK 1.8.0_112

上記の実装をベースにWebツールも公開しています。
[QRコード生成(QR Code Generator)｜Web便利ツール@ツールタロウ](http://tool-taro.com/qr_code_encode/)
Punycodeデコード

## はじめに
事前に準備する外部ライブラリ等はありません。
JavaSEに含まれるjava.net.IDNクラスを使用します。

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。
結果だけを確認したい場合は、この記事の一番下のリンク先で使えるようにしてありますのでご覧ください。

```java:PunycodeDecoder.java
import java.net.IDN;

/**
 *
 * @author tool-taro.com
 */
public class PunycodeDecoder {

	public static void main(String[] args) {

		//デコードしたい文字列
		String source = "xn--gck6bth.com";

		//デコード処理
		String result = IDN.toUnicode(source);
		//標準出力
		System.out.format("デコード結果=%1$s", result);
	}
}
```
## 動作確認

```
$ javac PunycodeDecoder.java
$ java PunycodeDecoder
$ デコード結果=タロウ.com
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

上記の実装をベースにWebツールも公開しています。
[Punycodeデコード(Punycode Decode)｜Web便利ツール@ツールタロウ](http://tool-taro.com/puny_code_decode/)
Mac OS X から Node.js をアンインストールする方法

***アンインストール***

下記リンク先の StackOverflow で回答されているコマンドを使用してアンインストールします:

```sh
lsbom -f -l -s -pf /var/db/receipts/org.nodejs.pkg.bom \
| while read i; do
  sudo rm /usr/local/${i}
done
sudo rm -rf /usr/local/lib/node \
     /usr/local/lib/node_modules \
     /var/db/receipts/org.nodejs.*
 ```
上記コマンドをコピーしてターミナルに貼り付け実行します。これでインストーラーでインストールした Node.js がシステムから削除されます。

How do I uninstall nodejs installed from pkg (Mac OS X)?

***NPM の削除***
Node.js は削除されましたが npm コマンドでインストールしたグローバルモジュールはそのままです。

これも削除します:

```
sudo rm -rf ~/.npm
````
これでシステムにインストールされた Node.js 関連のファイル全てが削除できます。

Node.js は開発途上のプラットフォームですので、頻繁にアップデートされます。これに柔軟に対応するために以下のようなバージョンマネージャーがあります:

```
Homebrew
nodebrew
nenv
```
個人的にはこのようなバージョンマネージャーを使用して Node.js をインストールするのがオススメです!
Hadoop系サービスの一括起動・停止ワンライナー

意外とよく使うのでメモとして残します。

・起動

```bash
for x in `cd /etc/init.d ; ls hadoop*` ; do sudo service $x start ; done
```

・停止

```bash
for x in `cd /etc/init.d ; ls hadoop*` ; do sudo service $x stop ; done
```
Punycodeエンコード

## はじめに
事前に準備する外部ライブラリ等はありません。
JavaSEに含まれるjava.net.IDNクラスを使用します。

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。
結果だけを確認したい場合は、この記事の一番下のリンク先で使えるようにしてありますのでご覧ください。

```java:PunycodeEncoder.java
import java.net.IDN;

/**
 *
 * @author tool-taro.com
 */
public class PunycodeEncoder {

	public static void main(String[] args) {

		//エンコードしたい文字列
		String source = "タロウ.com";

		//エンコード処理
		String result = IDN.toASCII(source);
		//標準出力
		System.out.format("エンコード結果=%1$s", result);
	}
}
```
## 動作確認

```
$ javac PunycodeEncoder.java
$ java PunycodeEncoder
$ エンコード結果=xn--gck6bth.com
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

上記の実装をベースにWebツールも公開しています。
[Punycodeエンコード(Punycode Encode)｜Web便利ツール@ツールタロウ](http://tool-taro.com/puny_code_encode/)
gulp+mocha+istanbulでnode.jsのカバレッジを取りつつJenkinsでテスト結果を表示する

gulp-mochaとistanbulを使ってローカルでコンソールにテスト結果を表示しつつ、カバレッジも取るといったことはすごく簡単にできたが、JenkinsでJUnit形式で出力されたテスト結果ファイルをパースして結果を表示しようと思ったら困ったのでメモ。

mochaの標準のRepoterでは標準出力にしか出力してくれなくて、ファイルに出せなかった。なので `npm install xunit-file` を追加して、 gulp-mochaのオプションを `mocha({repoter: "xunit-file"})` のように指定することで `xunit.xml` に出力される。
(gulpで標準出力をそのままファイルに落とす方法無いの？？)

``` gulpfile.js
var gulp = require("gulp"),
    mocha = require("gulp-mocha"),
    istanbul = require('gulp-istanbul');

// テストのカバレッジを取得するための準備
gulp.task('pre-test', function () {
  return gulp.src(['routes/*.js'])
    .pipe(istanbul())
    .pipe(istanbul.hookRequire());
});

// テスト
gulp.task("test", ["pre-test"], function() {
  return gulp.src(["test/*.js"], {read: false})
    .pipe(mocha({reporter: "xunit-file", timeout: "5000"}))
    .pipe(istanbul.writeReports('coverage'))
    .pipe(istanbul.enforceThresholds({ thresholds: { global: 90 } }));
});
```

istanbulを使って `coverage/lcov-report/index.html` にカバレッジ結果を出力しているので、これを JenkinsのPublish HTML Reportプラグインを使って表示する
![スクリーンショット_020316_100945_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/16612/0a76ddaa-86c9-efeb-125d-9b4dcacea7f2.jpeg)



テスト結果をxunit.xmlに出力しているのでJUnitテスト結果の集計で表示する
![スクリーンショット_020316_100809_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/16612/bf5eb4d0-351c-52aa-87e3-80a06381ae00.jpeg)

これでJenkinsでカバレッジの結果とテスト結果の両方が表示できる。
パスワード生成

## はじめに
事前に準備する外部ライブラリ等はありません。
JavaSEに含まれるjava.util.Randomクラスを使用します。

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。
結果だけを確認したい場合は、この記事の一番下のリンク先で使えるようにしてありますのでご覧ください。

```java:PasswordGenerator.java
import java.util.Random;

/**
 *
 * @author tool-taro.com
 */
public class PasswordGenerator {

	public static void main(String[] args) {

		//パスワード桁数
		int length = 16;
		//記号使用有無
		boolean useSign = true;
		//アルファベット大文字小文字のスタイル(normal/lowerCase/upperCase)
		String style = "normal";

		//生成処理
		StringBuilder result = new StringBuilder();
		//パスワードに使用する文字を格納
		StringBuilder source = new StringBuilder();
		//数字
		for (int i = 0x30; i < 0x3A; i++) {
			source.append((char) i);
		}
		//記号
		if (useSign) {
			for (int i = 0x21; i < 0x30; i++) {
				source.append((char) i);
			}
		}
		//アルファベット小文字
		switch (style) {
			case "lowerCase":
				break;
			default:
				for (int i = 0x41; i < 0x5b; i++) {
					source.append((char) i);
				}
				break;
		}
		//アルファベット大文字
		switch (style) {
			case "upperCase":
				break;
			default:
				for (int i = 0x61; i < 0x7b; i++) {
					source.append((char) i);
				}
				break;
		}

		int sourceLength = source.length();
		Random random = new Random();
		while (result.length() < length) {
			result.append(source.charAt(Math.abs(random.nextInt()) % sourceLength));
		}
		//標準出力
		System.out.format("生成結果=%1$s", result);
	}
}
```
## 動作確認

```
$ javac PasswordGenerator.java
$ java PasswordGenerator
$ 生成結果=gHa(hL8ImJW/VIR)
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

上記の実装をベースにWebツールも公開しています。
[パスワード生成(Password Generator)｜Web便利ツール@ツールタロウ](http://tool-taro.com/password/)
HTMLエンティティ化

## はじめに
事前に準備する外部ライブラリ等はありません。

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。
結果だけを確認したい場合は、この記事の一番下のリンク先で使えるようにしてありますのでご覧ください。

```java:HTMLEntityEncoder.java
/**
 *
 * @author tool-taro.com
 */
public class HTMLEntityEncoder {

	public static void main(String[] args) {

		//エンティティ化したい文字列
		String source = "taro@tool-taro.com";

		//エンティティ化処理
		StringBuilder result = new StringBuilder();
		for (int i = 0; i < source.length(); i++) {
			result.append("&#");
			result.append((int) source.charAt(i));
			result.append(";");
		}
		//標準出力
		System.out.format("エンティティ化結果=%1$s", result);
	}
}
```
## 動作確認

```
$ javac HTMLEntityEncoder.java
$ java HTMLEntityEncoder
$ エンティティ化結果=&#116;&#97;&#114;&#111;&#64;&#116;&#111;&#111;&#108;&#45;&#116;&#97;&#114;&#111;&#46;&#99;&#111;&#109;
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

上記の実装をベースにWebツールも公開しています。
[HTMLエンティティ化(HTML Entity Encode)｜Web便利ツール@ツールタロウ](http://tool-taro.com/html_entity_encode/)
SHA2/SHA1/MD5ハッシュ生成

## はじめに
事前に準備する外部ライブラリ等はありません。
JavaSEに含まれるjava.security.MessageDigestクラス、およびjavax.xml.bind.DatatypeConverterクラスを使用します。

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。
結果だけを確認したい場合は、この記事の一番下のリンク先で使えるようにしてありますのでご覧ください。

```java:HashGenerator.java
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.xml.bind.DatatypeConverter;

/**
 *
 * @author tool-taro.com
 */
public class HashGenerator {

	public static void main(String[] args) throws NoSuchAlgorithmException {

		//ハッシュを生成したい元の文字列
		String source = "タロウ";
		//ハッシュ生成前にバイト配列に置き換える際のCharset
		Charset charset = StandardCharsets.UTF_8;
		//ハッシュアルゴリズム
		String algorithm = "SHA-512";

		//ハッシュ生成処理
		byte[] bytes = MessageDigest.getInstance(algorithm).digest(source.getBytes(charset));
		String result = DatatypeConverter.printHexBinary(bytes);
		//標準出力
		System.out.format("生成結果=%1$s", result);
	}
}
```
## 動作確認

```
$ javac HashGenerator.java
$ java HashGenerator
$ 生成結果=CD38D28414D89B204A1145F6AF6CDEEF36422302B7E93B345E4665CE7708633E43F78D851D1FAFB3E66885814BB4655AD2D5C4439216EA7D3FED862B3C414557
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

上記の実装をベースにWebツールも公開しています。
[SHA2/SHA1/MD5ハッシュ生成(Hash Generator)｜Web便利ツール@ツールタロウ](http://tool-taro.com/hash/)
position: fixed; が効かない！ヘッダーを固定させてくれ...


Webサイト作成中に、あれ？ヘッダーが固定されなくなったぞ？
と困ったので調べてみると、`transform: translate;`
を設定している要素とその子要素に対して、`position`の指定が`relative`になってしまうらしい。

fixedが効いてないなと思ったらまず、`transform: translate;`の行を削除して動きを確認してみよう。
Base64デコード

## はじめに
事前に準備する外部ライブラリ等はありません。
JavaSEに含まれるjava.util.Base64クラスを使用します。

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。
結果だけを確認したい場合は、この記事の一番下のリンク先で使えるようにしてありますのでご覧ください。

```java:Base64Decoder.java
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

/**
 *
 * @author tool-taro.com
 */
public class Base64Decoder {

	public static void main(String[] args) {

		//デコードしたい文字列
		String source = "44K/44Ot44Km";
		//デコード後に文字列に置き換える際のCharset
		Charset charset = StandardCharsets.UTF_8;

		//デコード処理
		byte[] bytes = Base64.getDecoder().decode(source.getBytes());
		String result = new String(bytes, charset);
		//標準出力
		System.out.format("デコード結果=%1$s", result);
	}
}
```
## 動作確認

```
$ javac Base64Decoder.java
$ java Base64Decoder
$ デコード結果=タロウ
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

上記の実装をベースにWebツールも公開しています。
[Base64デコード(Base64 Decode)｜Web便利ツール@ツールタロウ](http://tool-taro.com/base64_decode/)
Base64エンコード

## はじめに
事前に準備する外部ライブラリ等はありません。
JavaSEに含まれるjava.util.Base64クラスを使用します。

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。
結果だけを確認したい場合は、この記事の一番下のリンク先で使えるようにしてありますのでご覧ください。

```java:Base64Encoder.java
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

/**
 *
 * @author tool-taro.com
 */
public class Base64Encoder {

	public static void main(String[] args) {

		//エンコードしたい文字列
		String source = "タロウ";
		//エンコード前にバイト配列に置き換える際のCharset
		Charset charset = StandardCharsets.UTF_8;

		//エンコード処理
		String result = Base64.getEncoder().encodeToString(source.getBytes(charset));
		//標準出力
		System.out.format("エンコード結果=%1$s", result);
	}
}
```
## 動作確認

```
$ javac Base64Encoder.java
$ java Base64Encoder
$ エンコード結果=44K/44Ot44Km
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

上記の実装をベースにWebツールも公開しています。
[Base64エンコード(Base64 Encode)｜Web便利ツール@ツールタロウ](http://tool-taro.com/base64_encode/)
Androidのスクリーンショットを撮るスクリプト



複数端末（エミュレータ含む）から選びつつ、スクリーンショットを撮って、画像を開くまでやってくれる君。（adb導入済み前提）

接続端末が１つなら、その接続端末のスクリーンショットを撮ってくれる。

```
#!/bin/zsh

adb_devices_result=`adb devices | sed -e '1,1d'`
echo $adb_devices_result | while read line
do
    line_elements=(`echo ${line}`)
    devices+=($line_elements[1])
done

if [ $#devices[*] -eq 0 ]; then
    echo "ERROR: No connected devices."
    exit
elif [ $#devices[*] -eq 1 ]; then
    target_device=$devices[1]
else
    echo "Choose a device..."
    select target_device in $devices
    do
        if [ -z $target_device ]; then
            continue
        else
            break
        fi
    done
fi

echo "Now taking a screenshot..."

filename=`date +"%Y%m%d-%H%M%S"`$DATETIME.png
adb -s $target_device shell screencap /sdcard/$filename
adb -s $target_device pull /sdcard/$filename $TMPDIR
adb -s $target_device shell rm /sdcard/$filename
open $TMPDIR/$filename

echo "Done."
```

## 参考
> [コマンドラインからAndroidのスクリーンショットをPCデスクトップに取得する方法](https://android.benigumo.com/20130802/screencap_adb_resize/)
CakeboxでCakePHPのローカル開発環境を構築する

CakePHP3.2が出ましたね。
3.2はPHP5.5.9以上がrequiredになっています。が！私のローカル環境(Mac)のPHPは5.4！ :scream: 
というわけで、どうにかすることにしました。。。

phpenvというので複数バージョンのPHPを入れてみようと思ったけどうまくいかず挫折し、前に使ってみたのが残ってたVagrantのVirtualBoxのCentOSなやつに入れようと思ったらintlが入ってなくてpecl installしようと思ったけどうまくいかず挫折し、Cakeboxというのを見つけたので、これを使うことにしました。
https://github.com/alt3/cakebox

# Cakeboxのインストール

書いてある通りにやればいいのですが、VagrantとVirtualBoxはすでに入れてあったので割愛。

```bash
git clone https://github.com/alt3/cakebox.git
cd cakebox
cp -pi Cakebox.yaml{.default,}
```

ローカルにあるworkspaceディレクトリを共有させたいので、Cakebox.yamlファイルを編集して追加します。

```yaml:Cakebox.yaml
synced_folders:
  - local:  Apps
    remote: /home/vagrant/Apps
  - local:  /Users/ran/workspace
    remote: /home/vagrant/workspace
```

仮想マシンを起動します。

```bash
vagrant up
```

初回は時間がかかります。
完了したら仮想マシンにsshします。

```bash
vagrant ssh
```

# 設定

仮想マシンで`cakebox application add アプリケーション名`とするとアプリケーションを作って諸々設定してくれますが、ソースはすでにあるので、バーチャルホストとDBの設定だけをします。

## バーチャルホストの設定

```bash
cakebox vhost add cakebox-myproject /home/vagrant/workspace/myproject/app/webroot
```

サーバー名(cakebox-myproject)とドキュメントルートを指定します。
`cakebox-myproject`の部分は何でもいいのですが、プロジェクト名の頭にcakebox-を付けることにしました。
これで `/etc/nginx/sites-available/`以下にNginxの設定ファイルが作成され、`/etc/nginx/sites-enabled/`以下からシンボリックリンクが張られている状態になります。

ローカルマシンの`/etc/hosts`に以下を追加します。

```txt:/etc/hosts
10.33.10.10 cakebox-myproject
```

ローカルのブラウザから`http://cakebox-myproject/`でアクセスできるようになりました。

## データベースの設定

```bash
cakebox database add -u dbusername -p dbpassword mydbname
```

CakePHPがアクセスするユーザー名(dbusername)とパスワード(dbpassword)を指定してmydbnameというデータベースを作成します。

必要なテーブルをCakePHPのmigrationsで作成します。

```bash
cd workspace/myproject/app
bin/cake migrations migrate
```

## おまけ

私は環境変数CAKE_ENVを設定して、各種設定値を開発と本番で読み分けたりしているので、バーチャルホストでも同様の設定をしました。
`/etc/php5/fpm/pool.d/www.conf`に以下を追加します。

```conf:/etc/php5/fpm/pool.d/www.conf
env[CAKE_ENV] = local
```

`sudo /etc/init.d/php5-fpm restart`とか(stopとかstartとか)やってみたんですが、どうも再起動されないようなので、`vagrant halt` して `vagrant up` しなおしました。
なんでrestartできないのか…。

# まとめ

というわけで、割とスムーズに環境構築できました。:smile: 
cakeboxコマンドでnginxの設定ファイルができたり、DBが作れたりするのは便利ですね。

ちなみに `http://10.33.10.10/` を開くと、設定されているものの一覧が見れます。betaなので見るだけっぽいですが…。
でもそれぞれのアプリケーションのCakePHPのバージョンが一覧できるのはちょっと嬉しいかも。
【備忘録】PowerShell　指定したフォルダ以下の全てのファイルの絶対パスを取得する

特定フォルダ以下の状態を知りたい時などに有用

【これだけやれば】
まず
「cd 指定フォルダ名」
でディレクトリ移動

次に
「Get-ChildItem -Recurse | select-object fullname」
で一覧を取得できる

【+α】
ファイルに出力したい場合は
例えば
出力先が同ディレクトリのsample.txt とすると
「Get-ChildItem -Recurse | select-object fullname | out-file "sample.txt" 」
で出力できる

出力先ディレクトリは、絶対パス、相対パス両方使えるはず
だが、絶対パスの方がややこしくなくて良い気もする。（自分は絶対パスユーザ）

Get-ChildItem は Dir で代用可能？？　（試していないが。）

【出力先の幅を変更したい場合】
絶対パス名が長すぎて、途切れてしまう場合がある。
その時は-widthを変更すれば良い
「Get-ChildItem -Recurse | select-object fullname | out-file "sample.txt" -width 500 」
「500」は好みに合わせて

【追記する】
確か、デフォルトだと上書きだったかな？
だから、-append　を追加すると追記になるはず
コマンドを二回に分けて実行するときなどは、使えるかもしれない
「Get-ChildItem -Recurse | select-object fullname | out-file "sample.txt" -width 500 -append」

随時追加していきます。
ILMergeの使い方

ILMergeは、dllとexeをまとめて一つの実行ファイルにするコマンド。
[ILMerge](https://www.microsoft.com/en-us/download/details.aspx?id=17630)からダウンロードできる。

# 使用方法

```
ILMerge /out:piyo.exe hoge.exe foo.dll bar.dll foobar.dll
```

# pdbファイルを生成したくない場合
/ndebug をつける。

```
ILMerge /ndebug /out:piyo.exe hoge.exe foo.dll bar.dll foobar.dll
```

# An exception occurred during merging: が表示される場合
/targetplatform をつける。
v4の場合は

```
ILMerge /ndebug /targetplatform:v4 /out:piyo.exe hoge.exe foo.dll bar.dll foobar.dll
```

# ワイルドカードを使いたい場合
/wildcards をつける。

```
ILMerge /ndebug /targetplatform:v4 /wildcards /out:piyo.exe hoge.exe *.dll
```

# 参考
[アプリケーションのEXEファイルやDLLファイルを1つにまとめるには？](http://www.atmarkit.co.jp/fdotnet/dotnettips/426ilmerge/ilmerge.html)
[ILMergeのエラー回避](http://blog.livedoor.jp/eigh8_t/archives/52012013.html)
[実行ファイルとDLLを一つにまとめる](http://qiita.com/krsak/items/75a257cc0866a7e8e4aa)
vagrant一発でansibleを使って色々初期設定してしまおう(ansible provisioner)

# はじめに

* [vagrant 1.8.0からansibleのプロビジョナが追加されました。](https://www.vagrantup.com/docs/provisioning/ansible.html)
* ansibleプロビジョナはvagrantでOS起動するときにansibleが入っていなければゲストOSにインストールしたうえで、指定されたplaybookを実行してくれます。
* 今回はvagrant起動時にlocaleとtimezoneの設定を行ってくれるものを作りましたが、みんな多分似たようなことやってんだろうと思って[ソースは公開](https://github.com/uzresk/centos-basic-pre-configured.git)しておきました。

# 使用方法

## 1.VirtualBoxとVagrant1.8.0以降をインストールする。

* vagrantのバージョンだけ気を付けましょう。

## 2.ソースを取得する

* vagrantfileの中身はお好みに合わせてhost名やIPアドレスなどを編集してください。
* ちなみに今対応しているOSはCentOS6系と7系です。

```
git clone https://github.com/uzresk/centos-basic-pre-configured.git
```

## 3.起動する

* timezoneとlocaleの設定を行ったうえでcentosが起動してくれます。便利っすね

```
vagrant up
```

# ちょっと工夫が必要だった点

* さらっといくと思ったんですが、うまくいかない点が一点ありました。
* vagrant up時にansible_localはうまく動いてくれるのですが、起動したOSを停止・削除しようとしたときに以下のエラーが発生し、停止、起動ができなくなってしまいました。
* https://github.com/mitchellh/vagrant/issues/6740

```
C:\vagrant\centos-basic-pre-configured>vagrant destroy
    base: Are you sure you want to destroy the 'base' VM? [y/N] y
There are errors in the configuration of this machine. Please fix
the following errors and try again:

ansible local provisioner:
* `playbook` does not exist on the guest: C:/vagrant/site.yml
```

* なのでvagrant upする時だけansible_localを呼ぶように変更しました。（恐らく1.8.2では解消される模様です）

```
  if ARGV[0] == 'up'
    config.vm.provision "ansible_local" do |ansible|
      ansible.playbook = "site.yml"
    end
  end
```