OmniAICreator/Qiita-1.07M huggingface dataset:
HTMLメールを作成したらレイアウトがダダ崩れした話

[株式会社LITALICO](http://litalico.co.jp/)でWebエンジニアをしています、 @negi です。

本記事は『[LITALICO Advent Calendar 2016](http://qiita.com/advent-calendar/2016/litalico)』5日目の記事となります！

HTMLメールをRailsのActionMailerを使って送る際に困ったこと、注意点について書こうと思います。

# 前提

## 開発環境
* Ruby 2.2.3
* Rails 4.2.5

## やったこと
1. Railsの [Action Mailer Previews](http://api.rubyonrails.org/v4.2/classes/ActionMailer/Base.html) を使ってプレビューを見ながらHTMLメールを作成
1. このとき、[roadie-rails](https://github.com/Mange/roadie-rails)を使っているので、view（*.html.erb）とCSS（*.scss）は別ファイルで管理
1. 実際に配信してみる
1. プレビューでは綺麗に見えてたのに、スタイルが崩れている

確かにプレビュー上では綺麗にスタイルが組まれていたものが、いざメールを送信してみるとスタイルが崩れてしまっていることに悩まされました。


# 原因と対策
## 原因
一番ネックなのが、メールクライアント毎にCSSの挙動が異なるということです。

詳細は下記にまとまっているようですが、各メーラーによって対応していないStyleがあります。
[The Ultimate Guide to CSS](https://www.campaignmonitor.com/css/)
例えば、

* `postion: absolute` が効かない
* `<head>` `<body>` に指定したスタイルが効かない
* `<a>` の色を指定しても効かない

など、キリがなくてうんざりします。

## 対策
ちょっとググったら出てくる情報だと思いますが改めて、下記に注意する必要があります。

### 画像のpathなどは絶対path（`http://`, `https://`）で記載する
当然なんですが、メールは外部からリソースを読み込みますので、絶対pathで記載しないと表示されません。


### テーブルレイアウトで組む
「何年前のコーディングの仕方だろう…」と嘆きながら組みました。
テーブルレイアウトなら、CSSが効かなかったとしても大きくスタイルが崩れることはなさそうです。
テーブルレイアウトの組み方は[ここ](http://qiita.com/drasky1132/items/7beb80589ae1cef7f5e6)が参考になります。


### インライン要素の中にブロック要素を書かない
例えば、`<a>` タグの中に `<table>` とか入れちゃうと、Gmailで見たときにリンクが効かなくなります。

これが

```html
<a href="hoge">
  <table>
  	<tr>
  	  <td>ほげ</td>
  	</tr>
  </table>
</a>
```
Gmailだとこうなってしまいました

```html
<a href="hoge"></a>
<table>
  <tr>
    <td>ほげ</td>
  </tr>
</table>
```


### CSSはインラインとして書く
先に上げた [roadie-rails](https://github.com/Mange/roadie-rails) を使うと、外部ソースとして書いたCSSをインラインに変換してくれるので便利です。


### 実際に送って確認してみる（大事）
当たり前っちゃ当たり前（普通にWebサイト作ってても各ブラウザで確認しますよね）ですが、
各メールクライアントによって挙動が違うので、対象とするクライアントを決めた上で、各クライアントで表示が崩れないか確認するしかないでしょう。

明日の『[LITALICO Advent Calendar 2016](http://qiita.com/advent-calendar/2016/litalico)』は @takish さんの記事です。お楽しみに！

# 参考リンク

[The Ultimate Guide to CSS](https://www.campaignmonitor.com/css/)
[Outlookに勝てるHTMLメールコーディング vol.1「table構成編」](http://qiita.com/drasky1132/items/7beb80589ae1cef7f5e6)
[いまどきHTMLメールを作るにはどうするの？](http://qiita.com/nantekkotai/items/fb4f5e2b93acd9d4a463)
[初めてのHTMLメールコーディング](http://coding-laboratory.com/article/a141020.html)
Atomの環境設定

* コア設定
    * Atom チームに遠隔測定結果を送信する：遠隔測定結果を送信しない
* エディタ設定
    * 最終行を超えてスクロール：ON
    * 不可視文字を表示：ON
* パッケージ
    * 無効化
        * wrap-guide
        * spell-check
    * インストール
        * file-icons
* テーマ
    * インターフェーステーマ
        * One Light
    * シンタックステーマ
        * One Light
* ようこそ
    * スタートアップを表示：OFF
【Unity拡張】正規表現の練習ができるツールを作ってみた

#はじめに
正規表現の練習ができるツールを探してもなかなか良いものが見つかりません。
無いなら作ってしまえということで、Unity上で正規表現の練習ができるウィンドウを作ってみました。

Unityのバージョンは**Unity5.5.0b7**です。

#つくったものについて
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/84e71e7b-8429-5730-b401-734eb360119b.png)
Textにチェックしたい文字列、Patternに正規表現を入力してcheckボタンを押すと正規表現にマッチする文字列がConsoleに出力されます

![image](https://qiita-image-store.s3.amazonaws.com/0/44288/5cd28e78-23fd-1ccf-62c5-c498ec1dacd6.png)


#コード
以下のスクリプトをプロジェクトのEditorフォルダ以下に入れてください

```RegexWindow.cs
namespace hoge
{
    using UnityEngine;
    using UnityEditor;
    using System.Collections;
    using System.Text.RegularExpressions;

    public class RegexWindow : EditorWindow 
    {
        private string text;
        private string pattern;

        [MenuItem("EditorWindow/RegexWindow")]
        private static void Open()
        {
            var window = ScriptableObject.CreateInstance<RegexWindow>();
            window.titleContent.text = "RegexWindow";
            window.Show();
        }

        private void OnGUI()
        {
            var option = GUILayout.Width(80f);

            GUILayout.Label("Text", option);
            this.text = EditorGUILayout.TextArea(this.text);

            GUILayout.Space(6f);
            GUILayout.Label("Pattern", option);
            this.pattern = EditorGUILayout.TextArea(this.pattern);

            if (GUILayout.Button("check"))
            {
                // マッチする文字列をConsoleへ出力
                var matches = Regex.Matches(this.text, this.pattern);
                for (int i = 0; i < matches.Count; i++)
                {
                    Debug.Log(matches[i].Value);
                }
            }
        }
    }
}

```
npmのhttp-serverがポート番号重複で起動できない問題への対処

npmの `http-server` を実行すると次のようなエラーになることがあり、これは http-server が使用するポート8080番が他のプロセスによって既に使用されていることが原因として考えられる。これの対処として、ポート8080番を使用しているプロセスを特定して強制終了させる方法を本記事で紹介する。

```
C:\Users\anonymous\dev>http-server
events.js:141
      throw er; // Unhandled 'error' event
      ^

Error: listen EADDRINUSE 0.0.0.0:8080
    at Object.exports._errnoException (util.js:837:11)
　 （省略）
    at node.js:951:3
```

筆者はWin環境を使用しているため、ここではWin環境での対処を記す。

```
netstat -aon | find "8080"
```
このコマンドでは、ポート8080番を使用しているプロセスを調べる。

```
TCP    ***.***.***.***:* 0.0.0.0:8080             LISTENING       (数字)
```
この一番右の(数字)は、ポート8080番を使用しているプロセスのIDである。
次のコマンドでは、このIDを指定してそのプロセスを強制終了する。

```
taskkill /PID /F (数字)
```
もう一度 `netstat -aon | find "8080"` を実行すると空の行が出力される（＝ポート8080番を使用しているプロセスが存在しない）ので、再度 `http-server` を実行すると今度はうまく立ち上がるはずである。
`http-server` の起動成功時には次のように出力される。
※ルートディレクトリを示す引数に `./static/pages` を指定している。

```
Starting up http-server, serving ./static/pages
Available on:
  http://192.168.24.52:8080
  http://192.168.56.1:8080
  http://127.0.0.1:8080
Hit CTRL-C to stop the server
[Fri Dec 02 2016 15:11:10 GMT+0900 (東京 (標準時))] "GET /" "Mozilla/5
.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chro
me/54.0.2840.99 Safari/537.36"
```

他環境での対処を知りたい読者は、以下を調べることで代替可能と思われる。

- 「指定のポート番号を使用しているプロセスを調べるコマンド」
- 「特定のプロセスを強制終了するコマンド」

以上。
RaspberryPiを使って現在の天気を教えてくれるものを作る

# はじめに
研究室生活をしていてよくあることが、今雨降っているのかわからない！！
研究室の窓から外を見ても、わからない。というかブラインドあるから窓から見るのもめんどくさい。
ということで、現在の天気を簡単に教えてくれるものがあればいいなって思って作り始めました。

# 喋らせる

RaspberryPiを使って喋らせる方法は[ここ](http://qiita.com/sngazm/items/c27b7745fb68139213c2)を参考にしました。
適当にsay.shを作成し、用意しておきました。

```sh:
$ ./say.sh テスト
```

上記コマンドで喋るようにします。

# 天気を調べる
上の記事では天気を調べるのに[openweathermap](https://openweathermap.org/)を使用していますが、知りたいのは現在の天気なのでこれでは駄目です。
そこでtenki.jpのアメダス観測には10分毎の観測データがあるのでこれを取得して喋らせることにします。

ここはスクレイピングを用いて必要なデータを持ってきます。今回は直近の時間と降水量を取得することにしました。

```php
<?php
	# DOMやXPathの準備
	$dom = new DOMDocument;
	@$dom->loadHTMLFile('http://www.tenki.jp/amedas/5/26/51106.html');
	$xpath = new DOMXPath($dom);

	$weatherData = [];

	// アメダス実況から直近のデータを取得する
	$node = $xpath->query('//table[@class="amedas_table_entries"]')->item(0);
	// 各種データを取り出す。
	$time = $xpath->query('.//td[position()=2]',$node)->item(0);
	$precipitation = $xpath->query('.//td[position()=4]',$node)->item(0);
	$weatherData[] = [
		'time'						=> substr_replace($time->nodeValue,"時",2,1),
		'precipitation' 	=> $precipitation->nodeValue,
	];
	
	var_dump($weatherData);

	// say.shを用いて喋らせる
	$command = '/home/pi/Documents/say.sh '.$weatherData[0]['time'].'分時点の降水量は'.$weatherData[0]['precipitation'].'です';
	exec($command);
?>
```

loadHTMLFileのURLを別の県にすれば、その県の直近の降水量を入手できるはずです。

# 遠隔から天気を喋らせる

いい方法が思いつきません。誰か教えてください

現在は下の方法で喋らせていますが、研究室の各員の端末からパスワードなしで喋らせたいなぁ
もしくはボタンをつけるか....

```sh:
$ ssh pi@raspberrypi.**** "php weather.php"
```


#　参考にしたところ

## Webスクレイピング
[PHPネイティブのDOMによるスクレイピング入門](http://qiita.com/mpyw/items/c0312271819baee09132)

## 今回の発想元
[引っ越し祝いに大きめのエジプト神像を送りつけられたのでラズパイを仕込んで喋れるようにした]
(http://qiita.com/sngazm/items/c27b7745fb68139213c2)

## RaspberryPiでスピーカーを使う際の注意点
[Raspberry Pi | 合成音声をUSBスピーカーから出力したい！（ハマったポイント）](http://www.tapun.net/raspi/raspberry-pi-usb-speaker)
AWS CLIでよく使うコマンド集

# 前提
- aws cliのインストール
[awscliインストール](http://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html)


- jqのインストール

```console:
$ sudo curl -o /usr/local/bin/jq -L https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64 && sudo chmod +x /usr/local/bin/jq
```

- aws configureでアクセスキーを登録

```console:
$ aws configure
AWS Access Key ID [****************]:
AWS Secret Access Key [****************]:
```

# EC2

## 一覧取得

- インスタンスID・タグ名(Key=Name)を一覧出力<br>
※--queryオプションを使うと、返却する要素のselectと、フィルタ条件を付けられる。
  ここでは、ResourceTypeが "instance" の インスタンスIDとNameタグを取得。

```console:
$ aws ec2 describe-tags --query 'Tags[?ResourceType==`instance`] | [?Key==`Name`].{ResourceId:ResourceId,ResourceName:Value}' --output table
```

- インスタンスID・パブリックIP・プライベートIPを一覧出力<br>
※インスタンスIDがNULLの物は除外

```console:
$ aws ec2 describe-addresses --query 'Addresses[?InstanceId!=`null`].[InstanceId,PublicIp,PrivateIpAddress]'  --output table
```

- インスタンスID・インスタンスタイプ・タグ名(Key=Name)を一覧出力<br>
※インスタンスの状態がrunningの物だけを対象

```console:
$ aws ec2 describe-instances --filter "Name=instance-state-name,Values=running" --query 'Reservations[].Instances[].[InstanceId,InstanceType,Tags[?Key==`Name`].Value]' --output text
```

## 条件指定

- 特定のインスタンスIDからパブリックIP・プライベートIP・タグ名(Key=Name)・インスタンスタイプを一覧出力

```console:
$ INSTANCE_ID=XXXXX
$ aws ec2 describe-instances --instance-ids ${INSTANCE_ID} --query 'Reservations[].Instances[].[PublicIpAddress,PrivateIpAddress,Tags[?Key==`Name`].Value,InstanceType]' --output table
```

- 特定のタグ名からパブリックIP・プライベートIP・タグ名(Key=Name)・インスタンスタイプを一覧出力

```console:
$ INSTANCE_TAG="XXXXX"
$ aws ec2 describe-instances --filter "Name=tag:Name,Values=${INSTANCE_TAG}" --query 'Reservations[].Instances[].[PublicIpAddress,PrivateIpAddress,Tags[?Key==`Name`].Value,InstanceType]' --output table
```


# セキュリティグループ

## 一覧取得

- セキュリティグループ名とグループIDを一覧出力

```console:
$ aws ec2 describe-security-groups --query "SecurityGroups[].[GroupName,GroupId]" --output table
```

- セキュリティグループ毎に関連付いたEC2インスタンスの一覧を出力

```console:
declare -a SECG=$(aws ec2 describe-security-groups | jq '.SecurityGroups[].GroupName')
for secg in ${SECG[@]}; do
  echo "### SecurityGroupName: "$secg" ###"
  aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | select(.SecurityGroups[].GroupName=='$secg') | [.InstanceId, .Tags[].Value] | @csv'
  echo "-----"
done
```

# ALB(Application Load Balancer)

## 一覧取得

- ロードバランサー名・DNS名・ARNを一覧出力

```console:
$ aws elbv2 describe-load-balancers --query "LoadBalancers[].[LoadBalancerName,DNSName,LoadBalancerArn]"
```

## 条件指定

- 特定のロードバランサーの情報を出力

```console:
$ LB_NAME="XXXXX"
$ aws elbv2 describe-load-balancers --names ${LB_NAME}
```

# RDS

## 一覧取得

- RDS名・DBエンジン・インスタンスのクラス・エンドポイントを一覧出力

```console:
$ aws rds describe-db-instances --query "DBInstances[].[DBInstanceIdentifier,Engine,DBInstanceClass,Endpoint.[Address]]"
```


# S3

## 一覧取得

- S3バケット一覧を出力

```console:
$ aws s3api list-buckets --query Buckets[].Name --output table
```
あなたのお家をスマートハウスにしてみませんか？　エアコン編

第4回目となりましたスマート家電シリーズですが、皆さんはどうお過ごしでしょうか？
もう秋に入り空気も乾燥し寒くなってきましたね:persevere:
今回紹介する家電はこれからの季節に大切な家電製品であるエアコンです！
エアコンといっても様々な種類のものがありますが今回は4つご紹介いたします。


#1.商品紹介
・SHARP｢AY-D22SX-W｣
・富士通｢AS-Z22D-W｣
・東芝｢RAS-221GDRH(W)｣
・家電ワイヤレスアダプタ

![RIMG0022.JPG](https://qiita-image-store.s3.amazonaws.com/0/130490/9e085837-b1c0-c4d5-3722-e181dbf318e2.jpeg)
(図1－1)東芝｢RAS-221GDRH(W)｣
![RIMG0023.JPG](https://qiita-image-store.s3.amazonaws.com/0/130490/a8ddb0d9-7f9b-86bb-af28-8aaca3744383.jpeg)
(図1－2)富士通｢AS-Z22D-W｣
![RIMG0024.JPG](https://qiita-image-store.s3.amazonaws.com/0/130490/c1f64d40-c62f-0441-7692-3f444298b467.jpeg)
(図1－3)SHARP｢AY-D22SX-W｣
![RIMG0059.JPG](https://qiita-image-store.s3.amazonaws.com/0/130490/6a4139f1-b859-a8ba-4d05-2c34222981ee.jpeg)

![RIMG0025.JPG](https://qiita-image-store.s3.amazonaws.com/0/130490/858685ed-0c14-edb7-fe8d-eb9fb497d968.jpeg)
(図1－4)家電ワイヤレスアダプタ


#2.機器の接続手順
エアコンを接続した後、エアコンに付属しているネット回線を家電ワイヤレスアダプタに接続しSSNGをインストールする。
下記のサイトからアプリケーションをインストールする。
http://qiita.com/sugi05/items/500aa560d3202ebf4530

#3.操作方法
SSNGは様々な数値を入力することで温度や風量など細かい設定が出来るようになります。
今回はその機能をご紹介したいと思います。
SSNGは16進数(0～F)を使用しているため表記は10進数ではありません。
次に表記の解説をしていきたいと思います。
下の図のように赤色の四角で囲まれているのがEPCといって動作状態を設定する場所で、青色の枠で囲まれているのはEDTといって細かい動作を設定します。

![SSNG01.png](https://qiita-image-store.s3.amazonaws.com/0/130490/e337d64e-0545-188b-7b84-9f3cc2996f58.png)
(図3－1)遠隔操作時のSSNG画面

![image](https://qiita-image-store.s3.amazonaws.com/0/130490/377c0057-b61f-3f30-dbd0-e605acd95989.png)
(図3－2)コマンド表

操作例
https://youtu.be/xp_zPVFM9yM
富士通 エアコン　動作実験1

https://youtu.be/Svs8kTDdrFE
DAIKIN エアコン　動作実験2

https://youtu.be/5UGq9YM729E
SHARP エアコン　動作3

https://youtu.be/CEFU7907jqI
TOSHIBA エアコン　動作実験4
PhpStormでSilexのコード補完(2)

以前、[PhpStormでSilexのコード補完](http://qiita.com/chihiro-adachi/items/4fd0f3c4e19f322b6b16)という記事を書きましたが、[Symfony Plugin](https://plugins.jetbrains.com/plugin/7219)を導入することで、$appのキーだけでなく、様々なコード補完ができるようになります。

EC-CUBE(silex)とsymfony frameworkでは設定ファイル等が異なるため、Symfony Pluginの全ての機能が使えるわけではないのですが、利用できるものを紹介していきたいと思います。

# 環境

PhpStorm 2016.3 を使ってます。

# インストール方法
Settings＞Plugins＞「Browse repositories」で、「Symfony Plugin」で検索するとでてきます。選択してインストールしましょう。

![install.png](https://qiita-image-store.s3.amazonaws.com/0/72858/70e8aaf9-0a05-d8ef-08d2-0046fba5e6a8.png)

インストール後、PhpStormの再起動が必要になります。

# 設定
Settings＞Languages & Frameworks＞PHP＞Symfonyで設定画面が表示されます。
Enable Plugin for this Project(change need restart)をチェックし、PhpStormを再起動します。
![settings.png](https://qiita-image-store.s3.amazonaws.com/0/72858/20a4d8bc-3363-a281-fa15-fbbc46ee463e.png)

以上で導入は完了です。

# 使い方

設定完了後、いくつかのコード補完が効くようになりました。

フォーム

![form.gif](https://qiita-image-store.s3.amazonaws.com/0/72858/2e8307e5-4a38-defb-f53f-108b17e5d9e7.gif)


クエリビルダ

![query.gif](https://qiita-image-store.s3.amazonaws.com/0/72858/f96e8cd8-ee94-c029-a011-f9aeb83f4a43.gif)


いかがでしたでしょうか。

フォームの設定や、エンティティのフィールドを補完できるようになりました。

現状ではtwigの補完や、doctrineのyamlファイルの補完は動きませんでしたが、内部的には`app/cache/dev/appDevDebugProjectContainer.xml`を見ているようなので、silex用に修正してあげれば使えるかもしれません。

もう少し試してみて、使いこなせれば追記していきたいとおもいます。

[EC-CUBE Advent Calendar 2016](http://qiita.com/advent-calendar/2016/ec-cube)、次回は @kiy0taka さん、よろしくお願いいします！
[obsolete] sendmail で発信元 IP アドレスを隠匿させる

http://www.yk.rim.or.jp/~george/freebsd_soft_mail.html#CF
より抜粋

ファイヤーウォール（防火壁）の内側のマシンからメールを送信する際や、自分のマシン名を恥ずかしい名前にしているとき、メールを送信したホスト名やIPアドレスを隠しておきたい場合がある。

（この設定をしないと、メールの先頭付近に、隠しておきたいホスト名が Received: localhost.nerv.jp (127.0.0.1) などと出てしまうのだ。）
この場合は、上記の設定に加えて 

```text:sendmail.cf
FORMAT_RECEIVED=Simple-Proto-Dest
```
	
という行を追加すると良いらしい。


<ぼそ>wide版CFの入手先は ftp://sh.wide.ad.jp/WIDE/free-ware/CF/ のよう</ぼそ>
Pelican で github pages にブログを公開できなかったときにつまづいたやつ

google で pelican github pages で検索 -> いろいろつくる。
までできたのだけど公開でつまづいた。

github pages の user page site では `master` にあるファイルだけが公開される。https://help.github.com/articles/user-organization-and-project-pages/  
はじめはよくわからなくて `ghp-import output` してブランチを `gh-pages` に切り替えたりしててだいぶ混乱したのだけど  

1. `master` で執筆、py css html などのファイルの設定
2. `make html` -> `ghp-import output` -> `git push origin gh-pages:master` で `gh-pages` に出力された html をリモートの `master` にプッシュ。これで公開される。
3. リモートリポジトリに `setting` とかをプロテクトでつくって `git push origin master:setting` で設定を保存。

という感じの運用にした。`master`じゃなくてもいいです。
Sonatyp Nexus 3.0を3.1にアップグレードする

# 始めに

今時のJavaの開発を行う際、Apache MavenやApache Ivy、Gradleはたまたsbtなどを利用することでしょう。これらのツールは単純にビルドを自動化するだけなく、依存性管理を行ってくれます。これは極めて強力ですが。

ですが、外部公開されているライブラリはともかく自社で開発したライブラリを他でも使いたいと思った際、インハウスリポジトリがないとこれらのツールを生かせません。

そのインハウスリポジトリを構築するツールには[Apache Archiva](https://archiva.apache.org/index.cgi)や[Artifactory](https://www.jfrog.com/open-source/)がありますが、ここでは[Sonatype Nexus OSS](https://www.sonatype.com/nexus-repository-oss)を取り上げます。

Nexusは
- 2.x系
- 3.x系
があり、それぞれ2.14.1_01、3.1.0_04 が現時点(2016/12/03) が最新です。

ここでは3.0.1-01系から最新の3.1.0_04 へのアップデート方法を書いていきます。

# 公式手順書

公式の手順書は以下にあります。
https://books.sonatype.com/nexus-book/reference3/upgrading.html#upgrade-version-three
が、ここにはポインタだけでその先は
https://support.sonatype.com/hc/en-us/articles/217967608
になります。が、ここにも3.0から3.1へのアップグレードは書かれていなくてさらにその先の
https://support.sonatype.com/hc/en-us/articles/231723267
にようやく手順がでてきます。
基本的にこの通りに行えば問題ありません。

# 手順

公式手順書を参考に実際におこなったことを書いていきます。(基本的に翻訳ですね)

## 3.0系のデータディレクトリの位置を確認する

既存のNexusデータディレクトリを確認します。
[リンク先](https://support.sonatype.com/hc/en-us/articles/218707647)にあるように、
> ps -ef | grep NexusMain

として、Nexusの起動プロセスの引数を見て、
> -Dkaraf.data 

で指定されているディレクトリを確認します。
これがデータディレクトリです。

## 3.0系のアプリケーションディレクトリを確認する。

Nexus3.0系導入時に展開した場所を調べます。
/etc/init.d/ 配下の起動スクリプトなどから追っていくとよいでしょう。

## Nexus 3.1.0_01 のアーカイブダウンロードと展開

[Nexus OSSのダウンロードページ](https://www.sonatype.com/download-oss-sonatype)からOSを指定して、適切なアーカイブをダウンロードしインストール先で展開します。

## Nexus3.0 のデータディレクトリをバックアップ

最初の手順で調べたNexus3.0のデータディレクトリのバックアップをとります。
普通にcpなどで問題ありません。

## Nexus3.0 のデータディレクトリをNexus3.1へ上書き

Nexus3.0データディレクトリを Nexus3.1 の同種のディレクトリである sonatype_work/nexus3/ 配下へコピーします。
デフォルトではNexus3.1の展開ディレクトリと並列にできるようです。

## Nexus3.1 の設定プロパティ作成

Nexus3.0データディレクトリの etc/org.sonatype.nexus.cfg ファイルを、Nexus3.1 の sonatype-work/nexus3/etc/nexus.properties としてコピーします。
その上で、
> ${karaf.etc}

のようにかかれている部分を
> ${jetty.etc}

と、karafをjetty に置換していきます。

## Nexus3.1 の起動

これで移行作業は終わったので、起動スクリプトでNexus3.1を起動させます。
初回起動時に移行が始まり、既存データの取り込みと変換がおこなれます。

# 終わりに

さて、極めてニッチなNexusのアップグレード手順を書きました。
実はこの作業、私は並行して動いていたNexus2.8.1とNexus3.0.1 を統合してNexus3.0.1に寄せる目的の作業過程で行ったものです。
なぜ3.0.1へ統合する過程で3.1.0になるのか？それは2.x から 3.x へのアップグレードは、それぞれ2.14.1/3.1.0 以上のみサポートあったため、以下の手順を踏む必要がでたのです。

0. まず、2.8.1を2.14.1 へ移行する。
0. 3.0.1を3.1.0へ移行する。
0. 2.14.1を3.1.0へ 移行する。

最初と二番目は直交しているので、まずデータ量のすくなかった二番目からとりかかったのです。

皆さんも移行作業の際はくれぐれも手順書をよく読んで、計画立てて行いましょう。
チャットワークで未読が消えない場合の対処法(PC、スマホ両方で利用してる人向け)

PCでチャットワークを使用していると、未読が消えない という状況によく遭遇します。
今回は公式サイトに書かれている方法だけでは解決しなかったので、qiitaに書いてみることにしました。
※PC、スマホ両方で利用してる人向けです。

解決方法１
公式サイトに書かれている方法↓

未読の表示（数字）が消えません
http://help.chatwork.com/hc/ja/articles/203352640)

解決方法２
スマホ側のアプリ で未読となっているところを開いてみましょう。
すると、未読表示が消えます。
Drone.ioのOSS版をAWS ECSに構築（ALB+SSL）

この記事は[WHITEPLUS Advent Calendar 2016](http://qiita.com/advent-calendar/2016/whiteplus) 3日目になります。

インターネットから申し込める宅配クリーニングサービスの開発基盤やインフラをよく触っている[kai-zoa](https://github.com/kai-zoa)です。

いままで、私がいる開発チームではCircleCIを使ってきましたが、ワケあって今[drone.io](https://drone.io/)の利用を検討しています。

# 今回のCIサーバーの要件
なぜいまdrone.ioかってのは微妙なところですが‥、今回の要件は下記。

1. 当然だけど単体テストを実行できる
2.  開発時と同じバージョンの環境でビルドとテストを行う
3.  テスト完了後に本番にデプロイする

3つめがワケあってと書たところで、デプロイの処理はAWS上の本番と同じVPC内で行のがベストでした。

そこでOSS版が公開されていて好きな環境に構築できるdrone.ioに目をつけました。
また、drone本体やプラグインのほとんどが普段読み書きしてるGoで実装されているので、なにかあればコード読めるところが導入に前向きな理由だったりもします。

# 公式のCloudformationテンプレートを使用してECSに構築する
下記に公式のテンプレがあるので実はこれを使えば瞬殺です。
https://github.com/drone-demos/drone-on-ecs

githubと連携する場合の例です。
あらかじめOAuthアプリケーションとして登録しておいてクライアントIDとシークレットをパラメーターに指定します。

```bash
git clone https://github.com/drone-demos/drone-on-ecs.git
cd drone-on-ecs
cat <<EOF > params.json
[
    {
        "ParameterKey": "VPC",
        "ParameterValue": "vpc-hoge"
    },
    {
        "ParameterKey": "Subnets",
        "ParameterValue": "subnet-hoge,subnet-piyo"
    },
    {
        "ParameterKey": "KeyName",
        "ParameterValue": "aws-hoge"
    },
    {
        "ParameterKey": "DroneRemoteDriver",
        "ParameterValue": "github"
    },
    {
        "ParameterKey": "DroneRemoteConfig",
        "ParameterValue": "https://github.com?client_id=...&client_secret=..."
    },
  {
    "ParameterKey": "DroneInstanceType",
    "ParameterValue": "t2.small"
  },
  {
    "ParameterKey": "IncomingHttpCidr",
    "ParameterValue": "0.0.0.0/0"
  }
]
EOF

aws cloudformation create-stack --stack-name drone-ci \
        --template-body file://template.json \
        --parameters file://params.json \
        --capabilities CAPABILITY_IAM
```

はいできました。

コンテナに割り当てるメモリーサイズが既定値の場合、インスタンスタイプがt2.small相当以上の必要がありました。

# ALB対応してSSLを使う
これで終わるのも寂しいので…ちょっとテンプレをいじります。

公式のテンプレだと、ELBはいわゆるClassic LoadBalancerを構築するのでこれをALBにして、リスナーもHTTPSにしてCertificateManagerの証明書を利用するようにしてみました。
https://github.com/WHITEPLUS/advent-calendar2016-drone-on-ecs

変更の差分は[こちら](https://github.com/WHITEPLUS/advent-calendar2016-drone-on-ecs/commit/7825b95b88828c12f71af5cc16ae25b43cb3ec65#diff-523c608450b71aaa1b8b9574799fcd83)

### 参考にしたテンプレ
http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-ecs.html

# そして
でもまだテストを実行してません！（続くかも


明日の4日目はデザイナーのnimoni373です。

#ホワイトプラスではエンジニアを募集しています
ホワイトプラスでは、[新しい技術にどんどん挑戦したい！という技術で事業に貢献したいエンジニアを募集](https://www.wantedly.com/projects/69257)しております。!
テンプレートでJSONなどをスマートに出力するMovable Typeプラグイン

Movable Typeユーザーのみなさん、こんにちは。アイデアマンズの宮永です。

ちょっと遅くなりましたが、2016年のAdvent Calendar、2日目です。

## ちゃんとやるのは大変なJSONテンプレート

Movable TypeのテンプレートでJSONやXMLなどの構造体フォーマットを出力することってけっこうあるかと思います。

柔軟にテキストのテンプレートを記述できて、MT便利！と感じる部分ですが、JSONファイルを書き出したりするのはけっこう大変です。

* JSONフォーマットとMTタグが混在して見づらく、フォーマットが正しいか判断しにくい
* `encode`系や`escape`モディファイアを忘れてしまうと解析できないJSONになることがある
* (あまりないけど)「やっぱりYAMLになったわ」→「ギャー！」

確実に解析し利用できるJSONデータを出力するには、Movable Typeのことをよく理解している必要があります。

`encode_json`を忘れてしまい、テストデータでは大丈夫だったけどユーザーがダブルクオーテーション使ったりしてJSONが壊れてしまった…とかMTあるあるですね。

でも、こうは思いませんか？ データフォーマットの書式に気を使うのは人間の仕事だろうか、と。

## mt-plugin-structure-format

というわけで、これから仕事でも使う予定もあり、さくっと作ってみたプラグインがこちら。

mt-plugin-structure-format (MITライセンス)
https://github.com/ideamans/mt-plugin-structure-format

テンプレートから、JSONやYAMLなどの構造体フォーマットを出力するための支援プラグインです。

### BEFORE

通常、テンプレートでJSONファイルを出力しようとする場合はこんな感じです。

```html
{
  "title": "<mt:EntryTitle encode_json="1">",
  "body": "<mt:EntryBody encode_json="1">",
  "categories": [
    <mt:EntryCategories glue=",">
      "<mt:CategoryLabel encode_json="1">"
    </mt:EntryCategories>
  ]
}
```

ダブルクオーテーションとか付け忘れそうですし、encode_jsonもうっかり忘れそうですね。

### AFTER

```html
<mtsf:Object format="json">
  <mt:EntryTitle set_as="title">
  <mt:EntryBody set_as="body">
  <mtsf:Array set_as="categories">
    <mt:EntryCategories><mt:CategoryLabel set_as="_"></mt:EntryCategories>
  </mtsf:Array>
</mtsf:Object>
```

あれ…？
タグが多くて逆に重い感じもしますが…

まずは記号が一切不要になります。そして`format`モディファイアを`yaml`に変更するだけで、YAML形式で出力できます。

エスケープ処理は、出力フォーマットに応じて一括で行われます。

もちろん複雑にネストする場合も問題ありません。

## 拡張について

標準ではJSONとYAMLのみに対応しますが、MsgPackやBSONなど、構造体データのフォーマットには様々な形式があります。

その場合は別のプラグインで、決まったハンドラをレジストリに登録すると、`format`属性に指定できる形式を追加することもできます。

最近であればこういった処理はData APIを使うのが主流と思いますが、もし出番があれば使ってみてください。
【AWS】【SES】【PHP】SESで添付ファイル付きメールを送信

SesClientを利用して。sendEmailでは出来ないようなので。



```php
$client = SesClient::factory([
                                 'key'     => 'aws key',
                                 'secret'  => 'aws secret',
                                 'version' => 'latest',
                                 'region'  => '', // us-east-1など
                             ]);

$to = "xxx@xxx";
$from = "xxx@xxx";

$subject = "テストメール件名です";
$body = "テストメール\n本文です";

$message = createRawMessage($to, $from, $subject, $body, ["attach.pdf", "attach.jpg"]);

$result = $client->sendRawEmail([
                                    'Source'       => $from,
                                    'Destinations' => [$to],
                                    'RawMessage'   => [
                                        'Data' => base64_encode($message),
                                    ],
                                ]);



function createRawMessage($to, $source, $subject, $body, $filepaths)
{

    $charset = 'ISO-2022-JP';
    $finfo = finfo_open(FILEINFO_MIME_TYPE);

    $boundaryStr = uniqid(rand()); //バウンダリ文字列
    $subject = str_replace("\r", "", mb_encode_mimeheader($subject));
    $body = mb_convert_encoding($body, $charset);

    $message = "To: " . $to . "\n";
    $message .= "From: " . $source . "\n";
    $message .= "Subject: " . $subject = str_replace("\r", "", $subject) . "\n";
    $message .= "MIME-Version: 1.0\n";
    $message .= 'Content-Type: multipart/mixed; boundary="' . $boundaryStr . '"';
    $message .= "\n\n";
    $message .= "--" . $boundaryStr . "\n";
    $message .= 'Content-Type: text/plain; charset=' . $charset;
    $message .= "\n";
    $message .= "Content-Transfer-Encoding: 7bit\n";
    $message .= "Content-Disposition: inline\n";
    $message .= "\n";
    $message .= $body;
    $message .= "\n";
    foreach ($filepaths as $filepath) {
        $message .= "\n";
        $path_parts = pathinfo($filepath);
        $filename = $path_parts['basename'];
        $mimetype = finfo_file($finfo, $filename);
        $message .= "--" . $boundaryStr . "\n";
        $message .= 'Content-Type: ' . $mimetype . '; name="' . $filename . '"';
        $message .= "\n";
        $message .= "Content-Transfer-Encoding: base64\n";
        $message .= 'Content-Disposition: attachment; filename="' . $filename . '"';
        $message .= "\n\n";
        $message .= base64_encode(file_get_contents($filepath));
        $message .= "\n";
    }
    return $message;

}

```

謝辞 参考URL
https://www.codeproject.com/articles/786596/how-to-use-amazon-ses-to-send-email-from-php
Atomの設定をGit管理する方法

**:heavy_check_mark: コミットする対象ファイル**

* ~/.atom/config.cson
* ~/.atom/init.coffee
* ~/.atom/keymap.cson
* ~/.atom/snippets.cson
* ~/.atom/styles.less
* ~/.atom/packages.txt

**:heavy_check_mark: コミット手順**

:one: 無視リストに追加

`~/.atom/.gitignore`に下記を追加

* package

:two: パッケージリストを作成

```bash
touch ~/.atom/packages.txt
```

:three: まとめてコミット

```bash
git init
git add .
git commit -m "initial commit"
```

**:heavy_check_mark: パッケージリストの入出力**

```bash
// エクスポート
apm list --installed --bare > packages.txt
// インポート
apm install --packages-file packages.txt
```
mail/qpopper にて apop を使う

* スーパーユーザーにて、以下コマンドを実行

```console
# cd /usr/ports/mail/qpopper
# make install && make clean
```

* /etc/inetd.conf に以下の設定を追加

```text:/etc/inetd.conf
pop3 stream tcp nowait root /usr/local/libexec/qpopper qpopper -s -p 2
```

* inetd のリロード

```console
# service inetd reload
```

* apop パスワードデータベースの初期化
 
```console
# /usr/local/bin/qapopauth -init
```

* 各ユーザーのパスワード設定

プレーンテキスト認証時は PAM を使ったりするが qpopper 独自の管理となる為、通常ユーザーにて、以下のコマンドを実行

```console
% /usr/local/bin/qapopauth
```

スーパーユーザーで他のユーザーの設定をするときは、その変更するユーザー名を付け足すこと

```console
# /usr/local/bin/qapopauth -user <user name>
```
jetbrainsディスカウント

# ディスカウント

年末に安くなるんでしょうか？　ディスカウントサイトにも掲載ありました。

買うボタン押した遷移先が https://www.jetbrains.com/ruby/buy/?fromIDE#edition=commercial だ。ここは継続の人用です。


~~他にも http://www.dontpayfull.com/at/jetbrains.com がありますが、実際に買うときに安くなるのか見てみます。~~


```Woot!```

```
213 uses - in the last 30 days 50% Discount
Apply code at checkout to receive this offer.
1 Comment
Terms & Conditions
2% Success

Show Code Woot!
Expires Soon 
```
普段のしとりーが英単語をどうやって調べているか

私が普段、特にプログラミングとかコミットメッセージで使うような英単語を調べるときに、どのように調べているかをまとめてみました。  
英単語・熟語の意味は英英辞書で調べる程度の、英語の基礎的な"感覚"は必要な方法だと思うので、もしかしたら、日本のお受験で使うような非実用的な英語しかできない人には難しいかもです。

# 大体の流れ
いつも、以下のような流れでやってます。

1. とりあえず取っ掛かりが必要なので、[google 翻訳](https://translate.google.co.jp/?ie=UTF-8&hl=ja&client=tw-ob#ja/)で、調べたいと思った日本語の単語の英語を一つ調べる。
2. [dictionary.com](http://www.dictionary.com/)で、それを調べなおす
3. 大体の文法（各文型での意味）を把握したら、シノニムを同様に調べる
4. 感覚的に正しそうな単語が見つかるまで、2.～3.を繰り返す

# とっかかり探し

日本語ではなんていうかわかるけど、英単語が全然思いつかない！っていうことも多々あるので、そういうときは素直に[google 翻訳](https://translate.google.co.jp/?ie=UTF-8&hl=ja&client=tw-ob#ja/)に頼りましょう。

![google翻訳での画面](https://qiita-image-store.s3.amazonaws.com/0/29233/e03ea61e-2e44-c3c1-1fac-4537afaec3ac.png)

この時、左下の「関連項目」や右下のシノニムにも目を通しましょう。
日本語ネイティブである私ですら、正しく日本語の単語を選べている自信はないし、より明確で的確な日本語の単語が存在することも多いです。（この場合は、有効期限。）
再翻訳したらどうなるのかがわかるので、この中で一番よさげっぽいものから見ていきたいです。

![より明確な単語の訳に直したときの画像](https://qiita-image-store.s3.amazonaws.com/0/29233/865b72bc-8d2e-ea90-20ec-dd5d4796b221.png)

今回の場合は、「有効期限」のほうがより明確だったので、そうしました。

# [dictionary.com](http://www.dictionary.com)で調べ直す
「より明確な単語」を選んだとしても、Google翻訳が返してくる訳語が、そのまま意図通りの[コアイメージ](http://www.teacher.ne.jp/jiten/jiten/koa.html)の単語であることは少ないです。なので、[英英辞書を見ましょう](http://www.dictionary.com/)  。  
![dictionary.comで調べたときの画像](https://qiita-image-store.s3.amazonaws.com/0/29233/a879d109-9657-7de4-2303-73561989787a.png)
クラス名とかメソッド名に使う場合でも、文型くらいは確認しましょう。詳細は省きますが、ここで文型や品詞を見ることで、機械的に「クソなオブジェクト指向設計の回避」ができるようになります。

# シノニムを見てみる
多くの場合は、1回で的確な英単語にたどりつけないでしょう。そういうときは、同義語を見ます。dictionary.comとの相互リンクになっているので、各単語ごとに意味・イメージを確認しながら、良さげな単語にたどるつけるまでシノニムをあさると良いです。
![2016_12_02_14_25_01.png](https://qiita-image-store.s3.amazonaws.com/0/29233/22d76f83-5d35-d4d8-d8f3-8c6c538fe952.png)
[PHP] 指定した単位で、時間を切り上げ・切捨てる

## 入力された時間と分( hh:mm のような書式 )を5分単位にするという案件

そもそも、入力単位を5分単位にしておけばいいはずです。
が、いろいろ事情があって、5分単位で入力されるとは限らない状況のため、作成しました。

遠方のチームと連携したプロジェクトをやっていたりすると、ルール付けというのは大変です。


## 関数化した経緯

+ 切り捨て、切り上げの関数はあるけれど、指定した単位で行うのはちょっと工夫がいる
+ DateTime 関数では「分」のフォーマットは2桁のみ。1桁がない。
+ 切り上げ/切捨てするには、「分」を2桁フォーマットから整数に変換する必要がある。
+ 切り上げた「分」が60分だったら、1時間プラスしてあと、「分」を0に戻す
+ フォーマットはしょっちゅう変わりそうなので、Datetime オブジェクトを返し、後は好きにしてもらう

はじめに思ったよりも、処理が長く複雑になったので、関数にしました。
特に、日付フォーマットで「分」に1桁がないのは大きかったです。

切り上げ、切捨ての切替えを引数で切り替えようかと思いましたが、
1機能1関数で考えて分けています。

こういう場合、くっつけるのがいいのか、それともひとつの関数の機能はひとつと割り切るべきなのか。
個人的には後者と考えています。が、ご意見があればコメントお願いします。

```php
/**
 * 時間(hhmm)を指定した分単位で切り上げる
 * 
 * @param $time 時間と分の文字列(1130, 11:30など)
 * @param $per 切り上げる単位(分) 5分なら5
 * @return false or 切り上げられた DateTime オブジェクト(->fomat で自由にフォーマットして使用する)
 */
function ceilPerTime($time, $per=5){
	
	// 値がない時、単位が0の時は false を返して終了する
	if( !isset($time) || !is_numeric($per) || ($per == 0 )) {
		return false;
	}else{
		$deteObj = new DateTime($time);
		// 指定された単位で切り上げる
		// フォーマット文字 i だと、 例えば1分が 2桁の 01 となる(1桁は無い）ので、整数に変換してから切り上げる
		$ceil_num = ceil(sprintf('%d', $deteObj->format('i'))/$per) *$per;
		
		// 切り上げた「分」が60になったら「時間」を1つ繰り上げる
		// 60分 -> 00分に直す
		$hour = $deteObj->format('H');
		
		if( $ceil_num == 60 ) {
			$hour = $deteObj->modify('+1 hour')->format('H');
			$ceil_num = '00';
		}
		$have = $hour.sprintf( '%02d', $ceil_num );
		
		return new DateTime($have);
	}
}

/**
 * 時間(hhmm)を指定した分単位で切り捨てる
 * 
 * @param $time 時間と分の文字列(1130, 11:30など)
 * @param $per 切り捨てる単位(分) 5分なら5
 * @return false or 切り捨てられた DateTime オブジェクト(->fomat で自由にフォーマットして使用する)
 */
function floorPerTime($time, $per=5){
	
	// 値がない時、単位が0の時は false を返して終了する
	if( !isset($time) || !is_numeric($per) || ($per == 0 )) {
		return false;
	}else{
		$deteObj = new DateTime($time);
			
		// 指定された単位で切り捨てる
		// フォーマット文字 i だと、 例えば1分が 2桁の 01 となる(1桁は無い）ので、整数に変換してから切り捨てる
		$ceil_num = floor(sprintf('%d', $deteObj->format('i'))/$per) *$per;
		
		$hour = $deteObj->format('H');
		
		$have = $hour.sprintf( '%02d', $ceil_num );
		
		return new DateTime($have);
	}
}


$time = '13:51';

echo '元の時刻: ' . $time."<br>";

$ceilRes = ceilPerTime($time, 5);
echo '切り上げ: ' . $ceilRes->format('H:i')."<br>";

$florrRes = floorPerTime($time, 5);
echo '切り捨て: ' . $florrRes->format('H:i')."<br>";

/* 結果

元の時刻: 1351
切り上げ: 1355
切り捨て: 1350
*/
```
Paper Plane xUI(PPx)のListFileについて

この記事では仮想ディレクトリとして取扱えるListFileを紹介します。

# ListFileとは?

公式HELPからの引用です。
>先頭に「;ListFile」の一行があるテキストファイルは、その中身を仮想ディレクトリとして取扱うことができます。
>また、パスの末尾に「::listfile」が付いているときは、「;ListFile」が無くても仮想ディレクトリとして取扱うことができます。

中に「;」で始まるメタ情報が書かれたテキストファイルで、複数のエントリー情報をこのファイルにまとめる事が出来ます、ファイル/ディレクトリのブックマークという基本的な事や、findコマンドの標準出力をListFileとして吐き出し、エントリー[^1] として操作するpecoコマンドのような事も出来ます。
(peco代わりの活用法は改めて別記事として書きます)

また、ファイル/ディレクトリ以外にも文字列であれば良いので、スクリプトで拡張して様々な活用が出来る機能となっています。

[^1]: PPx上で操作できファイル/ディレクトリ1つ1つをエントリーと呼びます。

# ListFileのファイルフォーマット

フォーマットはシンプルです、テキストに幾つかのメタ情報が書かれているだけです。
以下のような内容が書かれたListFileの場合

```
;ListFile
;Base=C:\Users\taro\Desktop
;MyMetaData1=メメタァ
hoge.txt
foo.txt
hello world
```

開くとも、下記のようになります

![listfile.png](https://qiita-image-store.s3.amazonaws.com/0/51728/8d63c77b-51a7-8a32-f250-0508e2b02170.png)

「;ListFile」と「;Base」は公式のメタデータですが、独自メタデータも先頭に「;」を付ければ追加する事が出来ます、スクリプトなどで欲しいと思った時にこのメタデータを情報の仮置き場としても利用できます。

また、「hello world」のように単なる文字列もエントリーとして扱えますが、ファイルとして存在しないのでファイル操作系は失敗します、「hoge.txt」や「foo.txt」等の実際に存在するファイルはListFile上でもシームレスにファイルとして扱えます、ただし実際のファイルと内容の同期は自動でされないので、すでにListFile内のエントリーのファイルは存在してないって事もあります、その時はListFileを更新してあげましょう。

# 終わりに

ListFileは大変便利な機能です、PPxでもWhere is(組み込みの検索機能)でListFileが使われてたりします。
オーソドックスなブックマークとしてだけではなく、GitやLinuxコマンドとの連携にListFileを利用したりも出来ます、それらの例はこの記事以降で紹介したいと思います。
LINUX x AWK: AWKってなんじゃらほい。


シェル芸について調べてた時にAWK使えたほうがいいよAWK！
ってな情報に出会ったんだけどAWKってなに？おーく？豚なの？

みたいなレベルからとりあえずどんなものか触ってみようと思ってまとめてみました。

---

## AWKってなんやねん？ in wikipedia
https://ja.wikipedia.org/wiki/AWK

### (1)名前の由来は開発者の名前から。

アルフレッド・エイホ、ピーター・ワインバーガー、ブライアン・カーニハンの三人のLastName取ってAWK。
モンスターとか樫の木じゃないのね。

### (2)UNIX上で開発されたプログラミング言語
ぷ、プログラミング言語なの？ツールじゃないのか。

### (3)改行でレコードが区切られ、各レコードのフィールドは空白類で区切られているようなテキストファイルを扱えるがカスタマイズも可能。
なるほど、文字列操作のための言語なのね。デフォでCSVファイルとかを操作したい時に使うと。

### (4)文字列と数値を扱うプログラミングも可能である。
CUIでEXCEL関数とか使うイメージだろーか？
なんとなくわかった気分になったので一旦座学はおいといて手を動かすことにする。

---

## まずは慣れるためにAWKプログラミングのさわりをいくつか。

こちらを参考にさせていただきました。
https://hydrocul.github.io/wiki/commands/awk.html

### (1)とりあえずハローワールド。

```

awk 'BEGIN { print "Hello, AWK world!" }'

```
ほむほむ、ワンライナーで書く場合もBEGIN句で開始して中身を記述すると。
ちなみにBEGIN指定しないで以下のように記述すると、なんか延々ハローワールドが表示された。
どんな仕様だ？

```

awk '{ print "Hello, AWK world!" }'

```

### (2)CSVファイルの中身を単純にプリントしてみる。

#### サンプルcsv

```
# awk.txt
1 2 3 4 5
a b c d e
P P A P
```

```
awk '{print $1 $2 $3 $4 $5}' awk.txt

>12345
>abcde
>PPAP
```

ちなみに変数？間の空白は詰めても問題なかった。

### (3)四則演算してみる。
```
#加算:
awk '{print $1 + $2}' awk.txt

>3
>0
>0

#減算：
awk '{print $4 - $1}' awk.txt

>-1
>0
>0

#乗算：
awk '{print $5 * $3}' awk.txt

>15
>0
>0

#除算
awk '{print $4 / $2}' awk.txt

>2
awk: division by zero
 input record number 2, file awk.txt
 source line number 1

```

まずわかったのは文字列はゼロとして扱われること。
加減乗まではゼロが計算式に入ってもゼロが吐かれるだけで問題ないけど、
除算の場合ゼロディバイドになってエラーが出る。


### (4)区切り文字へんこう。
サンプルCSV

```
#awkd.txt
1,2,3,4,5
a,b,c,d,e
P,P,A,P

awk -F, '{print $1 $2 $5 $1*$3}' awkd.txt

>1253
>abe0
>PP0

```

区切り文字はカンマでもパイプでもいけるっぽい。
ちなみにパイプの場合はエスケープがいるようだった。

```
awk -F\| '{print $1 $2 $5 $1*$3}' awkd.txt
```

### (5)行番号を出力

```

awk '{print NR $1 $2 }' awk.txt

>112
>2ab
>3PP

# ゼロから始める
awk '{print NR-1 $1 $2 }' awk.txt 

>012
>1ab
>2PP

```

美しくないけどとりあえず。

### (6)検索

```
awk '/1/' awk.txt

#grepのこれと同じ。

grep 1 awk.txt

```

---

### オフィシャルから使いそうなコマンドを拾ってくるテスト。

http://www.gnu.org/software/gawk/manual/gawk.html

## Linuxコマンドと合わせてワンライナーコマンド

### (1)対象ファイルの各行のレコード長を表示


```
## こんなかんじのねろねろなサンプルテキストファイルを用意

aasdasffsanlfkas

asdlasfasdas
sadasdm
fas
sdlkvsfa
12321312rsdvmlsk
23dslks

#コマンド

awk '{print NR":"length($0)}' awk.txt

1:16
2:0
3:12
4:7
5:3
6:8
7:16
8:7

```

列番号が美しくなかったので : を挟んで見る。


### (2)for loop

まずはぐるぐる。

```

cat awk.txt | 
wc -l | 
xargs -Iline awk '
  {
  for (i=1; i<line ; i++)
    print $i
  }
' awk.txt

```

手順的には、
(1)awk.txtの中身をcatで展開
(2)wcで行数を取得（直接ファイルから取得するとファイル名が含まれてしまうためパイプ渡し）
(3)変数lineに行数を引数として渡す。
(4)forloopで行数分のレコードをprintする。

### (3)FizzBuzz

せっかくなのでFizzBuzzも書いてみる。

```

awk  '
  BEGIN {
  for (i=1; i<100; i++)
    if (i%3==0 && i%5==0)
      print "FizzBuzz!"
    else if (i%3==0)
      print "Fizz!"
    else if (i%5==0)
      print "Buzz!"
    else
      print i
  }

' 

```

こうしてみると普通のプログラミング言語なんですねぇ。
ってことでまた何かあれば書きます。
Linux : よく使うShellコマンド vol1

Linuxを仕事で使っていると

#### 「昨日実行したログだけ引っ張り出したいなぁ」
#### 「圧縮ファイルいちいち解凍して検索すんのだるいなぁ」

みたいなシチュエーションにぶつかることがよくある。

自前の検索性を高めるためにもシェル芸を身につけるのはかなり有益と目する。
と思ってシェル芸の記事を書こうと思ったんだけど、シェル芸ってほど長いものでもないやつしか出てこなかったため、「よく使うシェルコマンド」に命名変更しました。

まぁ、はじめからみんなフルマラソン走れるわけじゃないよね（いいわけ）

かんたんなワンライナーShellを上げてこうかと思います。
仕事でよく使ったり詰まる事が多いものを。

環境は概ねmac OSXでやってます。

---

## １:セレクト文を含むファイル名と該当レコード一覧を作成

```

ls ./* | xargs grep select 

-- 拡張子 / 再帰
ls ./*.txt -R | xargs grep select

-- 含まない
ls ./*.txt -R | xargs grep -v select

```

## 2:gzファイル内のテキストからfailを含むログを出力する(解凍しない)

```
zgrep "fail" *.gz > test.log

--該当文字列を含むレコードをカウント。
zgrep -o "2016/07/2" *.gz | uniq -c

```


## 3:tarで複数ファイルを圧縮

```
tar -cf tar02.tar *
```

## 4:tarの中身一覧を参照

```
--tar
tar -tvf *.tar
```

## 5:tar.gzの中身を直接参照
```
--tar.gz
tar -zxOf tar01.tar.gz
```

## 6: sedを使った文字列置換

```
cat foo.txt | sed 's/\.//g' > bar.txt 

-- タブ文字変換(macOSX限定)
sed -e 's/<Ctrl+v><tab>/\"<Ctrl+v><tab>\"/g' foo.csv > bar.tsv

```

## 参考：
http://qiita.com/b4b4r07/items/8c1911092002d0b457a6
http://d.hatena.ne.jp/m-hiyama/20080725/1216956895
http://qiita.com/kyanagimoto/items/37cc8e7a242ca2d1a29e
http://takuya-1st.hatenablog.jp/entry/2014/08/04/152101

いつもお世話になっております。

---


vol.2は気が向いたらアップするとおもいます。
Apache httpd で、なぜかこのファイルだけ公開できないときの失敗談

# 概要
apache httpd で、ファイルを公開しようとして、正しいディレクトリに配置しているはずなのにダウンロードできない。
他のファイルはダウンロードできる。
なぜか？

# 結論

```
chcon -t httpd_sys_content_t world.tar.gz
```


# 失敗談

いつも restorecon semanage selinux などで、調べてしまう
最近は「 restorecon ではないことはわかっている」ということを思い出してしまう。

# メモ

まず、ファイルのおいてあるディレクトリで

```
ls -Z
```

結果

```
-rw-r--r--. apache apache unconfined_u:object_r:httpd_sys_content_t:s0 hello.tar.gz
-rw-r--r--. manabu manabu    unconfined_u:object_r:user_home_t:s0 world.tar.gz
```

`hello.tar.gz` は、すでにダウンロードできているもの
`world.tar.gz` は、ダウンロードできないもの。


この `world.tar.gz` は、`/home/manabu` 以下にほかからもってきたもので、それを移動させたもの。

変更するために

```
chcon -t httpd_sys_content_t world.tar.gz
```

ワイルドカードも使える

```
chcon -t httpd_sys_content_t *.tar.gz
```
エンタープライズとDevOps

The DevOps Handbookが2016年10月に発売になりました。これを読んで、SIerが開発対象とするようなエンタープライズ領域において、DevOpsは価値があるのかどうか、考えてみます。

[![](https://images-na.ssl-images-amazon.com/images/I/51GspNFDWIL._SY344_BO1,204,203,200_.jpg)](http://shop.oreilly.com/product/9781942788003.do)

The DevOps Handbookでは、DevOpsの目的を以下のように定めています。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">開発者は生産性向上というとプロセスタイムの短縮にばかり目がいきがちだが、リードタイムをいかに短縮するかの方が、顧客にとっての価値であり、それがDevOpsの目的である。<a href="https://twitter.com/hashtag/DevOpsHandbook?src=hash">#DevOpsHandbook</a></p>&mdash; :SIer/kawasima (@kawasima) <a href="https://twitter.com/kawasima/status/788588963883802624">2016年10月19日</a></blockquote>

リードタイムとプロセスタイムの違いは、以下のような定義です。
![image](https://qiita-image-store.s3.amazonaws.com/0/8475/1f63dfe3-3535-3c33-339d-1c423006fd58.png)

実際にDevやOpsのタスクを実行している時間は、プロセスタイムです。それ以外の時間も短くする努力が必要です。

## SoRとSoE

SoRとSoEというシステム分類が、もとはSIerをターゲットとするソリューションベンダの間で使われていた用語なのに、なぜかWeb系エンジニアにも広まって、一般的なシステム分類みたいになっています。

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/f6e7db72-deb1-5b0c-8e66-4810afbf648d.png)

SoEはDevOpsに適していて、SoRは固いウォータフォールでやるんだ、と捉えられがちですが、ものごとはそう単純ではない、と私は思います。

## リードタイムを左右する要素

最大のキーファクターは、**案件がビジネスとしての失敗が許される(失敗を前提としたプロセス)かどうか**の度合いだと思います。

「ビジネスとしての」と前置いたのは、SoRであろうが、SoEであろうが、アプリケーション不具合によるシステム停止やデータ不整合が発生するのは許されないからです。
DevOpsを支える技術であるところのCI/CDやInfrastracture as Code、モニタリングもSoR/SoEに関わらず重要です。

ビジネスとしての失敗が許されないのであれば、案件が起案されてから、実際に開発着手にいたるまでに面倒な決裁ワークフローを回すことも、ピラミッド組織構造における責任のエスカレーション上、いたしかたのないことで、リードタイムも長くなってしまいます。

逆にあたるかどうか確信をもって言えないあたれば儲けもんな案件に、重厚長大な決裁プロセスを回すのはバカバカしいので、短いリードタイムでやることに注力するようになります。

## プロセスタイムへの影響

というように、ビジネス面での案件の性質が、リードタイムを左右しますが、これがプロセスタイムにも影響するのは、ここに案件規模の話が比例するように関わってくるからです。

ビジネスとしての失敗が許されないので、重厚長大な決裁プロセスを踏むが、そうするとちょっとした案件だと**もったいない**ので、多くの要求を詰め込みたくなるのが人間のサガです。

そうなるとバッチサイズが大きくなるため、DevおよびOpsの総タスク実行時間も伸びます。したがって一般論として、案件規模大きい → リードタイム長い → プロセスタイムも長くなる、というだけの話です。

## 一律リードタイムが長いエンタープライズの現場の改善

まぁ、実際のところ"一律"で、案件の特性・サイズにかかわらず同じビジネスプロセスというのは、いまどき見かけませんが、改善の余地は各所にあります。

- 案件が失敗が許されないのか、失敗前提でいくのかを起案時にハッキリさせ、
- それに応じたチーム体制を用意し、
- バッチサイズに応じた開発〜リリースプロセスを設計する

というあたりの整理やルール・仕組み作りが、エンタープライズ領域でDevOps的なことに取り組んでくれ、って言われたときにやるべきことかと思います。

## [閑話休題] ITILやSOX法あたりの開発と運用の分離への対応

これがあるから、SIerではDevOpsが出来ない(やる意味ない)し、スキルも身につかないという論調があります。

[SIerの「開発」と「運用保守」分離がまねく3つの弊害](http://paiza.hatenablog.com/entry/2014/10/29/SIer%E3%81%AE%E3%80%8C%E9%96%8B%E7%99%BA%E3%80%8D%E3%81%A8%E3%80%8C%E9%81%8B%E7%94%A8%E4%BF%9D%E5%AE%88%E3%80%8D%E5%88%86%E9%9B%A2%E3%81%8C%E3%81%BE%E3%81%AD%E3%81%8F3%E3%81%A4%E3%81%AE%E5%BC%8A%E5%AE%B3)

言わんとすることはわかりますが短絡的だとは思います。

The DevOps Handbookでも、FAQ的なところで、「開発と運用分けなきゃいけないから、ITILと両立できない」という論調についてはMythだと切り捨てています。

DevOpsのプラクティスはITILとも親和性高いし、ネックであるところの開発と運用(本番環境へアクセスする人)の分離は、Opsを自動化してしまえばいいんだ、という回答です。実際にデプロイの自動化や本番環境の監視・連絡の自動化、急激な負荷増ですら無人で対応できる技術が成熟してきているので、不可能な話では無くなっていますし、逆にそういうことが出来るようになったからDevOpsというムーブメントが起こっているとも言えます。

## まとめ

DevOpsがバズワードだからSIerが追いかけているわけではないし、食い散らかすつもりもありません。
そのあたりの話を聞きに、ぜひ明日12/3のJJUG CCC 2016 Fall 『SIerもはじめる、わたしたちのDevOps』セッションに参加してみてください。
http://www.java-users.jp/ccc2016fall/
Pythonでマイナス ゼロが出るときの対処法

## 0÷(負の数)=マイナス ゼロ
Pythonでは0÷負の数の計算を行うと結果が`-0.0`になります。

```python3
n = 0.0/-1
print(n)
# =>-0.0
```

##対処法
`0.0`を足すことで`-0.0`の符号を消すことができます。

```python3
n = 0.0/-1
print(n+0.)
# => 0.0
```

[デモ](http://ideone.com/TwBcD2)

[AOJの問0004](http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0004)でこの現象に遭遇して困った経験があります。
マイナス ゼロで困ってる人の助けになれば幸いです。
D7でテンプレートコーディングが楽になるテーマとモジュール（プラグイン）

Drupal 8もリリースされ1年が経過し要件によっては積極的にDrupal 8を採用していきたいですが、Drupal 7もプラグインが枯れて良い感じなので、まだまだ出番はあると思っています[^1]。そこで今回はDrupal 7でのコーディングを楽にする（かもしれない）方法を紹介します。

## [前提]できるだけコードを書かない

はい、できるだけ書きたくないです。書けばそこに**バグ**が入り込みますし様々な**コスト**が発生します。
そもそも、Drupalは一般的なサイトを構築するためのカスタムフィールドの追加やループが管理画面から設定可能で、テンプレートに`WP_Query`とか書いたり、`wp_reset_postdata`を書き忘れて頭を抱える必要がありません[^2]。つまり、うまくベースとなるテーマの選定を行えば、サイトの**ビジュアルデザインの為にPHPを触る必要がなくなります**。WYSIWYGエディタを活用すれば、書くのはCSSでのスタイリングだけでOK。


## [課題]CMSの出力するHTMLとCSSスタイリング

CMSを利用したサイト構築では出力されるHTMLは階層が深くなり見通しが悪くなりがちですが、Drupal 7も同じように人間が読みづらいHTMLを出力します。いくらスタイリングだけで良いとはいえ、把握しきれない入れ子や全体構造はストレスですね。

### 誘惑

もっとも簡単な解決法はテンプレートを書くことで、Drupalではサイト全体のテーマを書くのとは別に[Blocks](https://www.drupal.org/docs/7/theming/theming-blocks)、Views、Panelsとテーマとは別にそれぞれのモジュールのテンプレートを上書きすることができます。

ただし、前述の通りできるだけ書きたくないので別の解決策を探りました。

## 採用したテーマとモジュール

- [mothership | Drupal.org](https://www.drupal.org/project/mothership)
- [Clean Markup | Drupal.org](https://www.drupal.org/project/clean_markup)

使ってないけど、[Fences](https://www.drupal.org/project/fences)というモジュールもあります。

### Mothership

Mothershipは他の多くのテーマとは違い、導入すれば見た目が整うものではなく余分なdivタグの入れ子やクラス名などを取り除いてくれるテーマです。なのでこのテーマ自体をカスタマイズするのではなく子テーマとして目的のビジュアルを作り上げて行くことを強くおすすめします。そのほか、開発に役立つオプションや設定が豊富なので[ドキュメント](https://www.drupal.org/node/1536448)に目を通しておくと良いです。

### Clean Markup

Clean MarkupはPanelsとBlocksへクリーンなテンプレートを提供します。同時にオプションにより、任意のクラス名を指定したりラッパーを指定したりすることが可能です。

![Cursor_と__User_login__block___Drupal_7_52.png](https://qiita-image-store.s3.amazonaws.com/0/4319/14a7de4b-897c-92dd-1e04-09758a272fd3.png)


## まとめ

というわけで、Drupal 7でのウェブサイト制作ではこれらを導入すると効率的にサイト構築できるようになると思います。僕が関わったプロジェクトではこれらをベースにスタイリングは[Bourbon/Neat](http://neat.bourbon.io/)などのSassフレームワークを組み込んだりしました。

## おまけ

### 見てみようテーマ別階層の深さの変化

#### Bartik

![スクリーンショット_2016_11_28_22_49.png](https://qiita-image-store.s3.amazonaws.com/0/4319/20783789-221d-a11a-aa29-8b31f709a97f.png)

#### Mothership

![スクリーンショット_2016_11_28_22_45.png](https://qiita-image-store.s3.amazonaws.com/0/4319/71f01f32-70a9-6a99-3eef-8e837bf6efd3.png)


### お試しはこちら（少し慣れてる人向け）

https://simplytest.me/project/drupal/7.52?add[]=clean_markup&add[]=panels&add[]=mothership&add[]=ctools

1. 上記リンクから新規にSandboxを立ち上げて、admin/admin でログイン（24時間有効）
2. ModulesでPanelsやCleanMarkupを有効化
3. AppearanceでMothershipを有効化
4. お楽しみください

## 脚注

[^1]: Drupal 7からはLTS版もサポートされます。
[^2]: Viewsというモジュールでこれらのループが設定できます。Drupal 8からコアモジュールとなりました。
[ chef ] run_listの中身を確認する

### TODO

- 例えばcookbookAのレシピ001がrun_listにあったらcookbookBのレシピ001をインクルードし、cookbookAのレシピ002がrun_listにあったらcookbookBのレシピ002をインクルードするような条件分岐をcookbookCのレシピで書きたい


### example

```ruby:cookbookC/recipes/sample.rb
include_recipe 'cookbookB::001' if node.recipes.include?('cookbookA::001')
include_recipe 'cookbookB::002' if node.recipes.include?('cookbookA::002')
```

`node.recipes.include?`を使う。
Docker swarm modeでfluentdにログを集約する際の注意点

swarm + fluentdを試していた時にちょっとつまづいたのでメモ。

```Bash:予めfluentのサービスを起動
$ docker service create --name logger -p 24224:24224 fluent/fluentd
```

```Bash:続けてnginxを起動
$ docker service create --name nginx -p 80:80 \
  --replicas 2 --log-driver=fluentd \
  --log-opt=fluentd-address=localhost:24224 nginx
```

fluentdにログが集約されるはずが、記録されていない。

[こちらの情報](https://github.com/fluent/fluentd-docker-image/issues/58)によると、NAT64がサポートされていない模様。
127.0.0.1に書き換えてみる。

```Bash:変更後
$ docker service create --name nginx -p 80:80 \
  --replicas 2 --log-driver=fluentd \
  --log-opt=fluentd-address=127.0.0.1:24224 nginx
```

正常に記録されるようになった。

# 参考文献
https://github.com/fluent/fluentd-docker-image/issues/58
設定ファイルなどのコメント行と空白改行を削除させる方法

## # が行頭にあるテキストファイルの場合
```console
% grep -v ^# /etc/rc.conf
```

## # と改行のみが行頭にあるテキストファイルの場合
```console
% grep -Ev ^#\|^$ /usr/local/etc/apache24/httpd.conf
```
faster-titaniumの使い方とその裏側

Titaniumのアドベントカレンダー 2016の2日目。
今日は、私が1年ほど前に作って、使い続けているTitanium開発を爆速にするツールを
紹介させてください。


# 要約
[faster-titanium](https://github.com/CureApp/faster-titanium)は、Titaniumアプリを再ビルドすることなく即座にJavaScriptを差し替えることのできるツールで、インストールもコマンド一発。これで自分とその周囲の開発生産性は相当上がった。
内部技術はいろいろ難しいが、みんな使って、エラーを出して、いいものにしていこう。
いまのところiOSだけだけど技術的にAndroidは可能だし、実際手元ではAndroidでもうまくやれる感じだ。誰かそこまでやるの手伝って...


# 背景
Titaniumは原理的に、JavaScript部分だけ差し替えれば、長いビルドは要らないはずだ。
例えば類似技術のReact Nativeでは、Cmd + R だけでJavaScriptがリロードされる！！
これでは、実績のあるTitaniumも、押され放題なのだ。

**そこで[faster-titanium](https://github.com/CureApp/faster-titanium)だ**。
同様の技術にはLiveViewやTiShadowがあるが、
安定した接続や、native module対応などが売りだ。


## 特徴
- 安定した接続
- native module対応
- 実機対応
- 現時点では、iOS限定

# 使い方
## Requirements
最初に、以下がインストールされている必要がある。

- titanium
- alloy

あとは、↑のコマンドにパスが通ってる必要がある。

## インストール

```bash
npm install -g faster-titanium
```

終わり。

## 使い方
```
ti build -p ios --faster
```

`--faster` をつけるだけ。

こうすると、コマンドラインに

```

              ______                      __
             /_____/          _____   ___/ /_
  ______    /_____  _____    / ___ \ /__  __/ ___     /\___    _____\
 ______    /_____/  \__  \   \ \_ \/   / /   / __ \  / ___/   ______ \
______    / /        / __ \   _\  \   / /   | _ _/  / /      _________\
         /_/        (______/ /____/   \_\    \___\ /_/


```

と表示され、有効であることを知らせてくれる。

そして、
![x](https://camo.githubusercontent.com/8734598ea212b27a2e326f53e9704f08a8e27ab0/68747470733a2f2f637572656170702e6769746875622e696f2f6661737465722d746974616e69756d2f64656d6f2e676966)

このように、ファイルを修正するたびに、即座に変更が反映されるようになる。

### Webインターフェイス
内部的にサーバーを建てているが、

```
http://localhost:4157
```

にアクセスすると、諸々の設定ができる。
![x](https://camo.githubusercontent.com/0215058f9eb33232eee28075b840196c9b68987d/68747470733a2f2f637572656170702e6769746875622e696f2f6661737465722d746974616e69756d2f7765622d75692e706e67)

#### loading style
特に重要な設定項目は、`loading style`だ。
ここは、

- auto-reload
- auto-reflect
- manual

の3種類がある。
auto-reloadは、ファイル保存を監視してreloadするので、うんざりすることもあると思う。
そういうときは、manualにするとよい。
その場合、このWebインターフェイスの「Reload App」ボタンを押すとリロードされるようになる。

## トラブルシューティング

### 徐々に重くなる
simulatorのデバッガで確認したところ、リロードするたびに、徐々にメモリのゴミがたまっていくようです。いわゆるメモリリーク。
開発用なので、あまり気にせず使ってよいのですが、30回もreloadするとさすがに重くなってしまうので、
**適宜、アプリを落として、再起動**だ。

それだけで、ちゃんとサーバーに再接続して、通常どおり使えるようになる。


### その他
正直いってTitaniumのエラーっていろいろ手強い、経験が物を言うところがある。
だから**日本人ならtwitterとかで@shinout に連絡することが一番。**
もちろん八木さんなどのツワモノはご自身でソース読んで解決したほうが早いことも。。
**English speakers are also welcome**とか書いてみるが
そもそも彼らはここを読まないし彼らはすでにgithub issuesのほうで、
「さっさとAndroid対応してよ～」と言っている。しばし待たれいと言っておるだろうが。


# 内部実装
こっから先はとってもマニアックな内容。なので、
技術的なQ and Aと言うかたちにしてみた。

## どうやってtiコマンドに、独自コマンドオプションを入れた?
**A: hook。**
実は、titaniumにはhookという仕組みがあるのだ。
`~/.titanium/config.json`というファイルがあって、ここにhookを登録すると、
tiコマンドを走らせたときに、hookのスクリプトも実行されるのだ！


## どうやってアプリ側に、変更後のJavaScriptを渡すの？
**A: HTTP。**

1. 予めHTTPサーバーをたてておく
1. requireを上書き(後述)し、require('ファイル名')が来たら、ファイル名に対応するHTTPサーバー内のURLにアクセスして、新しいJSを得る
2. そのJSを実行

## どうやってサーバーからアプリを再起動させるの？
**A: TCP Socket通信。**

HTTPサーバーとは別に、TCPサーバーをたてて、アプリと常時接続しておく。
そして、再起動は、実は
`Ti.App._restart()`なるメソッドがあるので、それを使う。

# 結論
faster-titaniumで爆速開発すべし！

明日は、@mamosuba_jp さん、お願いします！
Cognos Analytics 新機能紹介 - 一覧

Cognos Analyticsの新機能を画面と共に紹介しています。

こちらにこれまでに投稿した記事を一覧化しましたので、興味のある新機能を参照下さい。

**Cognos Analytics 新機能紹介 - ポータル画面**
http://qiita.com/shinyama/items/625b26875ce112de11ae

**Cognos Analytics 新機能紹介 - レポート作成**
http://qiita.com/shinyama/items/fac74dce46dd4a709b9c

**Cognos Analytics 新機能紹介 - データ・モジュール**
http://qiita.com/shinyama/items/2c150ac6a14b866cbaa9

**Cognos Analytics 新機能紹介 - ダッシュボード**
http://qiita.com/shinyama/items/ca16c4595b1b36d5521d

**Cognos Analytics 新機能紹介 - ストーリー**
http://qiita.com/shinyama/items/73b9663fb8a490e4d64a

**Cognos Analytics 新機能紹介 - 管理機能**
http://qiita.com/shinyama/items/daa62e50cb50337d9f39


また、各バージョンでのさらなる新機能もこちらで紹介しています。

**Cognos Analytics 11.0.5 新機能一覧**
http://qiita.com/shinyama/items/a0f764020ce0a42eb555

**Cognos Analytics 11.0.4 新機能一覧**
http://qiita.com/shinyama/items/4279ac7d32f54362d2c8

Cognos Analyticsの簡単なAll in One構成のセットアップ手順です。
**Cognos Analytics 導入 & サンプルセットアップ手順書**
http://qiita.com/shinyama/items/9a913807c683bda1fef2