OmniAICreator/Qiita-1.07M huggingface dataset:
Shapefile を node.js だけで GeoJSON にして GitHub で確認するまで

# はじめに

この記事では node.js で Shapefile を GeoJSON に変換するライブラリである [shapefile](https://www.npmjs.com/package/shapefile) の使い方を紹介します。
shapefile ライブラリは GDAL や iconv などのネイティブライブラリに依存しない pure javascript なライブラリなので導入が簡単です。あと GeoJSON のプロパティをいじったりするのもあまり悩まずに済む、というのもメリットかもしれません。

# 1. シナリオ

青森県の市区町村行政区域ポリゴンの shapefile を GeoJSON に変換、境界線を黒、中身を黄色で塗りつぶすようにプロパティを設定して、GitHub にアップして表示してみましょう。

行政区域ポリゴンの入手は <http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03.html> よりどうぞ。以下の例では **N03-150101_02_GML.zip** という2015年版を使います。

GitHub がサポートしている、GeoJSON のスタイリングプロパティは <https://help.github.com/articles/mapping-geojson-files-on-github/> よりどうぞ。今回はポリゴンを扱うので **fill** と **stroke** の関連をプロパティを使いますが、ポイントデータの場合には **marker** 関連のプロパティを使うこともできます。

# 2. インストール

以下の手順で環境を準備します

```bash
$ unzip N03-150101_02_GML.zip
Archive:  N03-150101_02_GML.zip
   creating: N03-20150101_02_GML/
  inflating: N03-20150101_02_GML/KS-META-N03-15_02_150101.xml
  inflating: N03-20150101_02_GML/N03-15_02_150101.dbf
  inflating: N03-20150101_02_GML/N03-15_02_150101.prj
  inflating: N03-20150101_02_GML/N03-15_02_150101.shp
  inflating: N03-20150101_02_GML/N03-15_02_150101.shx
  inflating: N03-20150101_02_GML/N03-15_02_150101.xml

$ npm install frogcat/shapefile
shapefile@0.3.1 node_modules/shapefile
├── d3-queue@1.2.3
├── iconv-lite@0.4.13
└── optimist@0.3.7 (wordwrap@0.0.3)

$
```

1. 入手した zip ファイルを展開します
2. npm を使って shapefile をインストールします

なお、ここでは筆者が fork した [frogcat/shapefile](https://github.com/frogcat/shapefile) をインストールしています。本家のライブラリだと Shift_JIS でエンコードされた Shapefile をうまく扱うことができないためです。

# 3. コーディング

以下のような node.js スクリプトを作成します

```main.js
"use strict";
var shapefile = require("shapefile");
shapefile.read(process.argv[2], "shift_jis", function(error, geojson) {
  geojson.features.forEach(function(feature) {
    feature.properties["stroke"] = "#000";
    feature.properties["stroke-opacity"] = 0.8;
    feature.properties["stroke-width"] = 2;
    feature.properties["fill"] = "#ff0";
    feature.properties["fill-opacity"] = 0.5;
  });
  console.log(JSON.stringify(geojson, null, ""));
});
```

`shapefile.read(filename,encoding,callback)` によって、指定された SHP を指定されたエンコーディングでパースしつつ、変換された geojson をコールバック関数に渡す、という仕組みです。

コールバック関数の中では、geojson の各 feature に対してストロークとフィルのプロパティを設定しています。

最後に `console.log` を使って、geojson を標準出力に吐きます。

# 4. 実行

以下の手順で実行します

```bash
$ node main.js N03-20150101_02_GML/N03-15_02_150101.shp > out.geojson
```

できあがった geojson を Gist にアップロードするとこんなかんじになります。うまくいきました。

![image](https://qiita-image-store.s3.amazonaws.com/0/82494/872834ab-cb92-ca54-fc44-edf56fe68d14.png)

* Gist はこちらから <https://gist.github.com/frogcat/84a0c4cbd71b7ff09c7945a2cfbced7e>

# 5. まとめ

npm の shapefile ライブラリを使って Shapefile を GeoJSON に変換する方法を紹介しました。GitHub のユーザであれば node や npm はだいたい導入されているでしょうから、結構手軽に shape2geojson の環境を用意できます。

<http://turfjs.org/> の加工を挟むなど、応用もききます。

ただ、shapefile ライブラリはまだ開発途中なので文字化けや一部未サポートの機能があるなど問題もあります。その場合にはおとなしく GDAL を使って GeoJSON にしたものを処理するのがいいと思います。
[Node.js]Node.jsをnodistを使ってインストールしてみる

# Node.jsのインストール
Node.jsのインストールは公式サイトからインストーラーをダウンロードし、インストールを行えば完了する簡単な物になっています

公式サイト：https://nodejs.org/en/
日本ユーザグループ：http://nodejs.jp/

![1.png](https://qiita-image-store.s3.amazonaws.com/0/110087/13135568-3c37-06b8-5de1-10857581b28a.png)

しかしNode.jsは更新速度が速く、バージョンによっては動作しないモジュールも存在するため素の状態でインストールを行うと管理が面倒になってきます

今回は本体をそのままインストールするのではなく、Node.jsのバージョン管理ソフトをインストールし、そこからNode.jsをインストールしたいと思います。

# Node.jsのバージョン管理ソフト

以下のようなバージョン管理ソフトがあるようです

- nodist
- nodebrew
- ndenv
- nvm
- nave

今回はnodistを使ってWindowsにNode.jsをインストールしようと思います。

# nodistのインストール

nodistのインスーラ―があるようなのでそれを使用します

https://github.com/marcelklehr/nodist に移動して以下の部分のhereというリンクを選択します
 
> Installing with the official installer
> 　1. Download the installer here
> 　2. Run the installer and follow the install wizard

インストーラーを起動してそのままインストールを完了させます

# nodeのインストール

コマンドプロンプトを開き以下のコマンドを入力し、最新のNode.jsをインストールします

```bash:
$ nodist update
```

インストールされたNode.jsのバージョンを確認

```bash:
$ node -v
v5.10.0
```

---

これでnodistを使ったNode.jsのインストールが完了しました
ZendFramework2でDoctrine2を使うならEntityは手作りしないで自動生成させよう



Doctrine2をインストールしているのに、entityを最初から手作りするだなんて…いけてないよね。
データベースの中にテーブルを作ったら、自動生成してエンティティを作ってもらうほうが正確だしバグもでないんだからツールに頼ろう。

コマンド①は、データベースの中のテーブルからバサッと一気にエンティティらを生成します。

```latex:コマンド①

./vendor/doctrine/doctrine-module/bin/doctrine-module orm:convert-mapping --namespace='Application\Entity\' --force  --from-database annotation ./module/Application/src/

```

続いてコマンド②を実行すると、生成されたエンティティらにGetterやSetterを追加してくれます。

```latex:コマンド②

./vendor/doctrine/doctrine-module/bin/doctrine-module orm:generate-entities ./module/Application/src/ --generate-annotations=true

```

だからといって、生成したものが自分の期待にそっていなければ適宜修正がいるはずですよ。
参考：[リレーションシップに関する情報を更新する](http://www.ibm.com/developerworks/jp/opensource/library/os-doctrine-php-zend/#N10248)

例えば私の場合、idはRedis側で生成してそれを渡してレコード書き込みたかったので、その部分をいじったりしました。

#データを出力する

クラスはこんな感じで。とりあえずデータが取れます。あくまでもとりあえず…

```php:
public function indexAction()
{
    $em = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
    $articles = $em->getRepository('\Application\Entity\Article')->findAll();
    $viewModel =  new ViewModel();
    $viewModel->articles = $articles;
    return $viewModel;
}
```
ビューには、

```html:index.phtml
<h2>Articles</h2>
<ol>
<?php foreach($articles as $article): ?>
<li>
<a href="<?=$article->getUrl()?>">
<?=$article->getTitle()?></a><br>
<?=$article->getDate()->format('d M Y')?> | <?=$article->getPublisher()->getName()?><br>
</li>
<?php endforeach;?>
</ol>
```

##テストコードなのでエラー出るかも

```latex:error_message

Deprecated: You are retrieving the service locator from within the class Application\Controller\IndexController. 
Please be aware that ServiceLocatorAwareInterface is deprecated and will be removed in version 3.0,
along with the ServiceLocatorAwareInitializer. You will need to update your class to accept 
all dependencies at creation, either via constructor arguments or setters, 
and use a factory to perform the injections. 
in /var/www/zf2/vendor/zendframework/zend-mvc/src/Controller/AbstractController.php on line 258

```

平たく言えば、
「Controllerでデータ取得やめておけ。そんなの誰にもすすめてないし。3.0になって廃止されてて動かんようになっても知らんからな。」ということ。これはZendFramework2.5からでてるのか？Doctrine２から出ているのかわからないけど、
 …自分もこの過程でちびっとはリビジョンアップしまして、ZendFramework2がDependency Injectionっていう素敵な作りがあってトレンドなんですが、ここはFactoryな感じでDIを実装してしまってやっちまった感があって、それで3.0で廃止するよってことみたいですね。

でもねこれだけは日頃の不満。
スキャフォールディングの悪しき慣習に慣らされて、Model側に実装すべきデータベースとのやり取りを直接コントローラに書いて本番稼働なんてあかんよ。スキャフォールディングは素敵だけど、それはモックに過ぎずデザイナーさんとかフロントエンドエンジニアさんらが頑張って動くようにして、開発に回す前のもの。これを真に受けてコントローラーにビジネスロジックガンガン実装したらあかんよ。ホンマに…でもそんなのばっかり。ったく。


#参考記事
ZendFramework2 : [Generate Doctrine Entities from Existing Database using DoctrineModule and DoctrineORMModule](https://samsonasik.wordpress.com/2013/04/10/zend-framework-2-generate-doctrine-entities-from-existing-database-using-doctrinemodule-and-doctrineormmodule/)

IBM : [ZendFrameworkとともにDoctrineを使用する](http://www.ibm.com/developerworks/jp/opensource/library/os-doctrine-php-zend/#N101AA)

Symfony : [既にあるデータベースからエンティティを生成する方法](http://docs.symfony.gr.jp/symfony2/cookbook/doctrine/reverse_engineering.html)
Zabbixエージェントの設定 (Windows Server編)

Windows Server 2012にZabbixエージェント入れて監視するまでの設定方法です。Zabbixサーバは3.0です。

# ダウンロード
[Zabbixダウンロードページ](http://www.zabbix.com/jp/download.php)からエージェントをダウンロードしてきて展開しておきます。

# 設定
- 「confフォルダ」内の`zabbix_agentd.win.conf`をコピーしてファイル名を`zabbix_agentd.conf`に変更します。
- `zabbix_agentd.conf`と「binフォルダ」内の`zabbix_agentd.exe`, `zabbix_get.exe`, `zabbix_sender.exe`をCドライブ直下に移動します
- `zabbix_agentd.conf`を状況に合わせて修正します

```text:zabbix_agentd.conf
Server=(Zabbix server IP)
ServerActive=(Zabbix server IP)
#Hostname=[Hostname] (コメントアウトもしくはZabbixで表示するホスト名を設定)
HostnameItem=system.hostname (Hostnameをコメントアウトする場合はコメントアウト外す)
```

ServerActiveと、Zabbixの自動登録アクションを設定しておくと監視対象ホストに自動で追加することも可能です。

# インストール
- `zabbix_agentd.exe`のプロパティの互換性タブから、「□管理者としてこのプログラムを実行する」にチェックを入れます (忘れるとこの後のコマンド実行時にエラーが出ます)
- コマンドプロンプトで`C:\>zabbix_agentd.exe --install`と入力します
- 「サーバーマネージャー」->「ツール」->「サービス」を開くと、サービスが並んでいる中に「Zabbix Agent」という項目があるはずですので、これを右クリックして「開始」を選択し、状態の表示が「開始」になればエージェントとしての起動は成功です

# ファイアウォール
「サーバーマネージャー」->「Windowsファイアウォール」->「詳細設定」->「受信の規制」から、右側のペインの「新しい規則」でポート10050を追加します

# 監視設定
Zabbixの「設定」->「ホスト」から`ホストの作成`でホストを追加できます。Windows用のテンプレートが用意されているので、それを設定しておけばとりあえずは良いと思います。

# 参考
- [Zabbix Agentd を Windows にインストール – katz+](http://katzplus.com/centos-6/zabbix/zabbix-agentd-%E3%82%92-windows-%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)
- [Windows7にZabbix agentをインストール：びぼうろぐ：So-netブログ](http://bibo-log.blog.so-net.ne.jp/2012-04-13)
Maya Python FPSを変更する

#MayaのFPSを変更する

## GUIで変更
[ウィンドウ]->[設定/プリファレンス]->[プリファレンス]
![160405_mayafps.png](https://qiita-image-store.s3.amazonaws.com/0/111261/eaf33634-04af-50fc-0e21-13e29e7ce889.png)

[設定]->[作業単位]->[時間]
![160405_mayafps_002.png](https://qiita-image-store.s3.amazonaws.com/0/111261/07df0d25-940d-a5ce-3215-dbddb3f8900c.png)

## Python

### Reference
[FPSを変更する場合：currentUnit](http://help.autodesk.com/cloudhelp/2015/JPN/Maya-Tech-Docs/CommandsPython/currentUnit.html)


### Source

FPSを取得する場合
MelのcurrentTimeUnitToFPSを呼び出して取得する

```py:GetFPS.py
import maya.cmds
import maya.mel as mel

fps = mel.eval('currentTimeUnitToFPS')
print fps

```

FPSを設定する場合

```py:SetFPS.py
import maya.cmds
import maya.mel as mel

import maya.cmds
import maya.mel as mel

cmds.currentUnit( time='ntsc' )
fps = mel.eval('currentTimeUnitToFPS')
print fps
# 30.0

cmds.currentUnit( time='250fps' )
fps = mel.eval('currentTimeUnitToFPS')
print fps
# 250.0

```

currentUnitに設定する文字列はよく使用するFPSは文字列を設定する
- game: 15 fps
- film: 24 fps
- pal: 25 fps
- ntsc: 30 fps
- show: 48 fps
- palf: 50 fps
- ntscf: 60 fps


関数を作成した

```py:DefGetFPS.py
import maya.cmds
import maya.mel as mel

def SetFPS(fps):
    unit = 'ntscf'
    if fps == 15:
        unit = 'game'
    elif fps == 24:
        unit = 'film'
    elif fps == 25:
        unit = 'pal'
    elif fps == 30:
        unit = 'ntsc'
    elif fps == 48:
        unit = 'show'
    elif fps == 50:
        unit = 'palf'
    elif fps == 60:
        unit = 'ntscf'
    else:
        unit = str(fps)+'fps'
        
    cmds.currentUnit( time=unit )
    fps = mel.eval('currentTimeUnitToFPS')
    print fps
        
SetFPS(15)
SetFPS(24)
SetFPS(25)
SetFPS(30)
SetFPS(48)
SetFPS(50)
SetFPS(60)
SetFPS(250)

```

## 参照

[[mel] fspを調べたりしてみる](http://sproutmel.blogspot.jp/2012/07/mel-fsp.html)
[fps設定。](http://junkithejunkie.cocolog-nifty.com/blog/2014/06/fps-5f5c.html)
サーバの引っ越しなどの時に、特定のネットワークからつながらない現象

あるWebサイトの、レンタルサーバ間の引っ越しを行った際にハマったことと、その際にいろいろ試した事の備忘録

# ある特定のネットワークからのみ閲覧できない

いつものように、データやファイルを移行させて、ドメインのネームサーバを変更。
しばらく待つと見れるようになると思ったが、なかなか閲覧できるようにならない。
クライアントからは「うちでは見れるようになってるよ」との報告をもらったが、私の仕事場のネットワークからは相変わらず見れない。

## DNSが見つかりません的なエラー

- nslookup すると、server can't find ってでる。
- chrome で開くと　このサイトにアクセスできません。●●.com のサーバー DNS address が見つかりませんでした。ERR_NAME_NOT_RESOLVED

### どうやら仕事場のネットワークからのみ接続できないらしい。

試しに、スマホのテザリングで接続して確認したら問題なく開く
自宅のネットワークなどからためしてみても問題なく開く。

ああ、これはうちのネットワークに原因があるのか・・・と思っていろいろ試し始める。

## 結果、解決した方法
ルータに指定されているDNSを「[Google Public DNS](https://developers.google.com/speed/public-dns/)」に変更することで解決できた。
おそらく、プロバイダのDNSのキャッシュの問題なのかな？というところ。

##　解決までに試したこと
うちのネットワークのみ繋がらないということで、DNSのキャッシュ的な何かが原因だなと思ったのですが、そっち方面に明るくないので、一つ一つ試すことに。。。最終的に上記の方法で解決できましたが、その過程でいろいろ試したのが、今後役に立つかもと思ったのでメモ。
ブラウザのキャッシュクリアやプライベートウインドでの接続など一般的なのはもちろん試しました。

### MacのDNSを初期化
(https://support.apple.com/ja-jp/HT202516)

### ルータの再起動
一般的に１５分くらい電源切ったままにしておくとキャッシュ的なのがクリアされることが多いらしいです。

### MacのローカルDNSを設定
(https://support.apple.com/kb/PH18499?locale=ja_JP&viewlocale=ja_JP)
Macのネットワーク設定をみるとプロバイダのDNSぽいのが設定されていたので、それをGoogleのに変更

## 解決方法の詳細
上記試したけど、うまくいかなくて、最後にルータに設定したら解決しました。

1. ルータの設定画面を開く
2. プロバイダ情報が設定されている画面
3. DNSが自動取得になっているので、手動に変更
4. GoogleのDNSのアドレス　「 8.8.8.8 」　「 8.8.4.4 」 を設定
5. これでルータの設定を完了させる

上記でうまくいきました。

というわけで、おそらくプロバイダのDNSが原因だったのかな？と思う次第。
ちなみに、しばらくしたらDNS設定を戻してもちゃんと開きました。

## 参考サイト
GoogleのPublic DNS
(https://developers.google.com/speed/public-dns/)
gulp.spritesmithとpostcss

## postcss用のspritesmithテンプレートを作成する。

> css.template.handlerbars

```
{{#sprites}}
@define-placeholder {{name}} {
  background-position: {{px.offset_x}} {{px.offset_y}};
  size: {{px.width}} {{px.height}};
}
{{/sprites}}

```

> gulpタスク

```
gulp.task('sprite', () => {
  const spriteData = gulp.src('/src/img/sprite/*.png')
    .pipe(spritesmith({
      imgName: 'sprite.png',
      cssName: '_sprite.css',
      algorithm: 'binary-tree',
      cssTemplate: '/src/css.template.handlerbars'
    }));

  const imgStream = spriteData.img
    .pipe(buffer())
    .pipe(imagemin())
    .pipe(gulp.dest('/dist/img/sprite/'));

  const cssStream = spriteData.css
    .pipe(gulp.dest('/src/css/'));

  return merge(imgStream, cssStream);
});
```

## postcssファイル

> _sprite.css

```
@define-placeholder icon-40-book {
  background-position: -44px 0px;
  size: 44px 44px;
}
```
SSEで符号拡張

SSEやAVX2で符号拡張をする時に、アンパックのゼロと対象の変数の順番を忘れるので覚書として。
8->16以外も基本的にやり方は同じなのであとはご自分でどうぞ。

```cpp:u8x16_to_u16x8x2.cpp
#include <stdio.h>
#include <emmintrin.h>

void main()
{
    __declspec(align(16)) unsigned char u8[16];
    __declspec(align(16)) unsigned short u16[16];

    // テストデータとして1～16を入れる。
    for(int i = 0; i < 16 ; ++i) {
        u8[i] = i + 1;
    }

    // ゼロの入ったレジスタの用意
    __m128i zero = _mm_setzero_si128();

    // SSEレジスタに転送
    __m128i src1 = _mm_load_si128((const __m128i*)u8);

    // 1,0,2,0,3,0,4,0,5,0,6,0,7,0
    __m128i lower = _mm_unpacklo_epi8(src1, zero);

    // 8,0,9,0,10,0,11,0,12,0,13,0,14,0,15,0
    __m128i higher = _mm_unpackhi_epi8(src1, zero);

    // u16にコピー
    _mm_store_si128((__m128i*)u16, lower);
    _mm_store_si128((__m128i*)(u16+8), higher);

    // 結果の確認
    for(int i = 0; i < 16 ; ++i) {
        printf("%d, %d, %d, %s\n", i, u8[i], u16[i], (u8[i] == u16[i]) ? "同じ" : "違う");
    }
}

```

#参考
こちらをかなり参考にさせて頂いています。--> http://www.officedaytime.com/tips/simd.html
GASからContactsApiを使用して読みがなをつける

#背景
GoogleAppsScriptで連絡先を操作することになり、こんなの簡単だーと思っていたらGASのAPIではフリガナを扱うことができませんでした…orz

#参考
https://groups.google.com/forum/#!topic/google-apps-api-japan/4h2okev-vQA

ググってみると同じ内容でハマっている人の投稿がありました。（soundTrickerさんの記事にはいつもお世話になっております）
GASのAPIではなくUrlFetchを使用してContact APIを使用するとのこと。
サンプルコードは取得だけだったので、これを参考に新規に登録するコードを書きました。

#APIの叩き方
この手のAPIで一番きつい（と思ってる）のは認証部分ですが、これは上記のサンプルコードをそのまま流用します。

新規連絡先の作り方は下記のリンク先のPROTOCOLタブのものを使用します。
https://developers.google.com/google-apps/contacts/v3/?hl=ja#creating_contacts

##リクエスト情報詳細
ヘッダーに書く情報とリクエストするテンプレートが記載されています。
フリガナ情報はgd:givenName、gd:familyNameにyomiという属性情報で付加されています。

HeaderはUrlFetchのオプションに記述します。
BodyはXmlServiceで作るよりは、雛形のhtmlをGASプロジェクト内に作ってそれを呼び出して必要部分を置き換える形を取りました。
このBodyはUrlFetchのpayloadとして記述します。

UrlFetchApp.fetchのAPIドキュメント。payloadの項に「the payload (e.g. POST body) for the request. 」と記載されています。
https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app#fetchurl-params


#コード

新規に作成するパターンです。
resには作成された連絡先のxmlが返されます。このxmlには作成されたidなどが付与されています。

```js:コード.gs
function sampleCode() {
  //以下は魔法のコメントです。GASの機能で認証して、ScriptApp.getOAuthToken()でTokenを取得するために書いてあります。
  //ContactsApp.getContacts()
  
  //AccessTokenの取得
  var token = ScriptApp.getOAuthToken();
  var newEntry = HtmlService.createHtmlOutputFromFile("entry").getContent();

  ///////////////////////////////////////////////////////////////////////////////
  // ここに必要部分を置換する処理を書く
  ///////////////////////////////////////////////////////////////////////////////
  
  //APIの呼び出し
  var res = UrlFetchApp.fetch("https://www.google.com/m8/feeds/contacts/default/full",{
    contentType: 'application/atom+xml',
    method : "post",
    payload: newEntry,
    headers : {
      "GData-Version" : "3.0",
      "Authorization":  "Bearer " + token
    }
  });
}
```


ファイル→新規作成からhtmlを選択しentryという名前で作っておきます。
\<gContact:groupMembershipInfo deleted='false' href='http://www.google.com/m8/feeds/groups/hoge%40gmail.com/base/6'/> を追加することでMyコンタクトに追加することができます。（メールアドレス部分を自分のものに変更してください）

```html:entry.html
<atom:entry xmlns:atom="http://www.w3.org/2005/Atom"
    xmlns:gd="http://schemas.google.com/g/2005"
    xmlns:gContact="http://schemas.google.com/contact/2008">
  <atom:category scheme="http://schemas.google.com/g/2005#kind"
    term="http://schemas.google.com/contact/2008#contact"/>
  <gd:name>
     <gd:givenName yomi='なまえ'>名前</gd:givenName>
     <gd:familyName yomi='みょうじ'>苗字</gd:familyName>
     <gd:fullName>名前 苗字</gd:fullName>
  </gd:name>
  <atom:content type="text">Notes</atom:content>
  <gd:email rel="http://schemas.google.com/g/2005#work"
    primary="true"
    address="" displayName="名前 苗字"/>
  <gd:email rel="http://schemas.google.com/g/2005#home"
    address=""/>
  <gd:phoneNumber rel="http://schemas.google.com/g/2005#work"
    primary="true">
    99999999
  </gd:phoneNumber>
  <gd:structuredPostalAddress
      rel="http://schemas.google.com/g/2005#work"
      primary="true">
  </gd:structuredPostalAddress>
<gContact:groupMembershipInfo deleted='false' href='http://www.google.com/m8/feeds/groups/hoge%40gmail.com/base/6'/>
</atom:entry>
```
S3からRedshiftにJSONでCopyする時の小さなサンプル

* JSONファイル、JSONPathファイルはS3にアップロードしておく
* JSONファイル中ではJSONオブジェクトを並べた構成とする（間に「,」等はいらない）


```lang:JSONPathファイル
{
  "jsonpaths":
  [
    "$['id']",
    "$['userid']",
    "$['text']",
    "$['ts']"
  ]
}
```


```lang:JSONファイル
{
"id":"_sky365",
"userid":"hogeA",
"text":"kkkk",
"ts":"1459832718.001258"}
{
"id":"_sksy365",
"userid":"hogeB",
"text":"ddddd",
"ts":"1459832718.00s1258"
}
```

```lang:Copyコマンド
copy message from 's3://<bucket>/<JSONファイル>' credentials 'aws_access_key_id=<key>;aws_secret_access_key=<secret>
f' json as 's3://<bucket>/<JSONpathファイル>';
```
[C言語][Linux] 環境変数の値を取得する

特定の値を取得するには、以下のように getenv() 関数を使えば良い

```c
        const char *val;
        val = getenv("PATH");
```

定義されている値を取得したい時は、environ の値を取り出す

```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> /* environ */

int main(int argc, char **argv)
{
    extern char **environ;
    char **env = environ;

    while(*env) {
        const char *val;

        val = *env;
        if (val) {
            printf("%s\n", val);
        }
        env++;
    }

    return 0;
}
```

valは "TERM=xterm" の形で名前と値が"="で連結されているので、使う時にカットする必要がある
nginxの向き先がwordpressのディレクトリに行っていないとき


Wordpressを/var/www/wordpressに設置して、
/etc/nginx/conf.d/wordpress.conf
も設置したのに、nginxの標準ページが表示されてしまう。

そんなときは、
/etc/nginx/conf.d/default.conf
が存在していないか確認すると良いでしょう。
このファイルが置かれていると、wordpress.confよりも優先的に読まれてしまうので同一ポートだった場合wordpress.confの設定が無効化されてしまいます。

default.confをdefault.conf.bkなどにリネームしておくことで解決できます。
(winscp)スクリプトでの特殊記号処理

WinSCPのコマンドでパスワードにスラッシュ等の特殊記号が入っている場合の対応。エスケープではなく、記号を変換する。

>space: %20 or +
>%: %25 (percent sign)
>+: %2B (plus sign)
>/: %2F (slash)
>@: %40 (at sign)
>:: %3A (colon)
>;: %3B (semicolon)


http://winscp.net/eng/docs/session_url
Zabbixエージェントとの通信をPSKで暗号化する

Zabbix3.0の新機能として暗号化できるようになったようです。PSK以外には証明書による暗号化が可能です。
エージェント側はCentOSです。

# 設定する前に
暗号化の設定をする前に、Zabbixサーバに対象ホストの監視設定を追加しておきます。同時に設定するとエラーが出てしまいました。

# 共有鍵の生成
今回はOpenSSLを使用します。

```
# openssl rand -hex 32 > /etc/zabbix/zabbix_agentd.psk
```

# Zabbixエージェントの設定変更

```text:/etc/zabbix/zabbix_agentd.conf
TLSConnect=psk
TLSAccept=psk
TLSPSKIdentity=(一意な文字列)
TLSPSKFile=/etc/zabbix/zabbix_agentd.psk
```

`TLSPSKIdentity`は一意な文字列を指定する必要がありますが、これ自体は暗号化されないので重要な情報は含めないように注意してください。
設定したら`zabbix-agent`を再起動します。

# Zabbixサーバの設定変更

管理画面の「設定」->「ホスト」から対象のホストを選択し、『暗号化』タブを表示します。

- [ホストへの接続]：`PSK`
- [ホストからの接続]：`暗号なし`のチェックを外し`PSK`をチェックする
- [PSKアイデンティティ]：`TLSPSKIdentity`で設定した値
- [PSK]：`TLSPSKFile`で設定した値

![スクリーンショット 2016-04-05 14.54.22.png](https://qiita-image-store.s3.amazonaws.com/0/48446/581aa8c7-22e5-cfbd-3f20-821f7932b498.png)

正常に通信できていれば[エージェントの状態]と[エージェント暗号化]が緑で表示されます。

![スクリーンショット 2016-04-05 14.55.00.png](https://qiita-image-store.s3.amazonaws.com/0/48446/2077ec35-1a3f-807c-71f9-78981c4198c8.png)

# 参考
- [Zabbix-Agentとの通信を暗号化してみる. (3.0の機能) - フロッピーディスクの残骸](http://328.hateblo.jp/entry/2016/02/27/194430)
- [2 Using pre-shared keys [Zabbix Documentation 3.0]](https://www.zabbix.com/documentation/3.0/manual/encryption/using_pre_shared_keys)
[Git]SourceTree(+Git)をインストールしてみる

![hero_win_all.png](https://qiita-image-store.s3.amazonaws.com/0/110087/e73f746f-051c-d182-446b-b6d9d0c4c75f.png)

今回はGitのクライアントソフトであるSourceTreeをインストールしてみます
公式サイト：https://www.sourcetreeapp.com/

---

- 公式サイトTOPページにソフトのダウンロードリンクボタンがあるので選択します
![1.png](https://qiita-image-store.s3.amazonaws.com/0/110087/04824c94-8beb-7816-4f15-118730935d85.png)
<font color="gray">※記事時点でのバージョンは1.8.3でした</font>
<br>

- ダウンロードした実行ファイルを起動します
- 進めていくとインストール場所を聞かれます（今回はそのままインストールを行います）
<img src="https://qiita-image-store.s3.amazonaws.com/0/110087/6d123810-96a7-0cd5-10ec-fadf45025e1f.png" width="60%" height="60%">

- SourceTreeのインストールが完了し、SourceTreeを起動すると規約同意画面になりますので、同意して続行ボタンを選択します
<img src="https://qiita-image-store.s3.amazonaws.com/0/110087/e39e79d1-e5b5-e708-ae83-731f41b89da7.png" width="80%" height="80%">

- Atlassianのアカウントを求められます。すでに持っている場合は「Use an existing account」を選択してください。なければ「Go to My Atlassian」を選択しアカウント作成を行ってください
<img src="https://qiita-image-store.s3.amazonaws.com/0/110087/7070d9c6-d159-b7c5-b11b-c67aa0542ee0.png" width="80%" hegiht="80%">

- その他のツールとアカウントと紐づけるかどうかを聞かれます。ここでは必要ないのでスキップしています
<img src="https://qiita-image-store.s3.amazonaws.com/0/110087/b62e136b-f094-7610-3f19-d9e45eb83cb0.png" width="80%" height="80%">

- SSHキーを読み込むか確認されます。これも今は必要ないのでNoを選択します
<img src="https://qiita-image-store.s3.amazonaws.com/0/110087/74182218-2bca-07d1-9577-70da6740eec7.png" width="80%" height="80%">

- Git本体をインストールするか選択します。今回はダウンロードをする選択をしています
<img src="https://qiita-image-store.s3.amazonaws.com/0/110087/ec1a78b8-12e9-7e17-ec51-c52c0ba6d9dc.png" widht="80%" height="80%">

- インストールが完了すると、SourceTreeが起動します
![8.png](https://qiita-image-store.s3.amazonaws.com/0/110087/7668cf4a-41ba-097d-f17e-59be385399bb.png)

---
これでSourceTreeとGit本体のインストールが完了しました
女性声優TVアニメ出演数集計プログラム

[2015年女性声優TVアニメ出演数ランキング](http://qiita.com/takezoux2@github/items/05257084513fa550f489)の続きです。

ランキング集計に使ったプログラムの公開準備出来たので公開します。
[voice-actor-data](https://github.com/takezoux2/voice-actor-data)

とりあえず、
[2015年のランキング](https://github.com/takezoux2/voice-actor-data/blob/master/output/female2015.csv)
[総出演数ランキング](https://github.com/takezoux2/voice-actor-data/blob/master/output/female-total.csv)
は作っておきました。


プログラムはscalaで書かれています。
実行前に、データベースの準備が必要です。詳しくはgithubのREADME.mdを見て下さい。
新しいVMソフトウェアVeertuの使い方（4/6更新）

##はじめに
立ち上げはチュートリアルに従ってインストールしてください。今回はUbunts15Desktopのインストール後を説明します。

なぜ、serverからDesktopに変えたかというとNATの設定が良く分からず、固定IPを割り振れない状態ではHostsに書くしかないのでちょっとめんどいなということで、Webricを立ち上げた時のLocalhostにどう接続するのかを考えた際に、DesktopでFirefoxを立上げてアクセスしたらどうかという発想からこの様にしました。

##キーボード
Veertuが持つコンソールで日本語キーボードを使うと｜が入力できません。これはUbuntsのキーマップをいくら指定しても無理でした。
そこでUSキーボードを使いますが、

```
$sudo apt-get dpkg-reconfigure keyboard-configuration
```

を入れて、AppleAluminumKeyboardを選択します。
しかし、もっと簡単なやり方がありました。

##ssh接続をする
sshでローカルサーバにアクセスします。

openssl-serverがインストールされていないので、

```
$sudo apt-get install openssh-server
```

でインストールします。その後、

```
$ ifconfig
```

と入力して、IPアドレスを探ります。

そしたら、ターミナルやハイパーターミナル（コマンドプロンプトは多分ダメ）を起動し

```
$ ssh -p 22 xxxxxx@192.168.xx.xx
```

と入力します。xxxxxxは自分で作ったアカウント名です。@192〜はIPアドレスを指定します。
そうするとパスワードを要求されるのでログインIDのパスワードを入力してください。
ちなみにrootのパスワードでも良いですがあまりおすすめしません。

これでログインするとserverの設定がすべて端末で設定されたキーバインドの状態で入力できますので捗ります。

##Ubunts15 DesktopでLocalHostで起動する
Ubunts15 Desktop上のFirefoxでhttp://localhost:3000/を叩くとRails アプリケーションが立ち上がります。

そんじゃーね。
Hexoで画像投稿と大きさや位置の変更

# 画像を挿入する

下記ページを参考にした
http://pagent.github.io/2014/12/03/hexo-image/
http://saucer-jp.github.io/2015/04/29/how-to-put-images-in-a-post/

が、asset_imgの機能では画像の大きさや位置の変更方法がわからなかったので
おとなしくimgタグを使った方法で行う

下記ページを参考にして
http://qiita.com/in_silico_/items/31c2c0bc1cf061c86250


_config.ymlの設定で

post\_asset\_folderをtrueにした状態で

```
$ hexo new "xxxxxx"
```

で作成されたフォルダに画像を入れておく

投稿記事のpermalinkが `:year/:month/:day/:title/` で、投稿記事のtitleが`test-page`だとしたら

例えば2016年4月5日に投稿した記事に関しては

```
<img src="/2016/04/05/test-page/example.jpg" width="300px" height="200px">
```

としてやれば画像の大きさが設定できます

# 画像を左寄せしたい場合

imgタグ内にaline設定を入れて、終わったら文章の回り込みを防ぐために clearしてあげます


```
<img src="/2016/04/05/test-page/example.jpg" width="300px" height="200px" align="left">
<br style="clear:left;">
```

これで画像の投稿、大きさの変更、位置の変更ができるはずです

右寄せにしたい場合は align と clearのところをrightにしてあげればよいです


ブログのほうにはもう少し詳しく載せてます
[Hexoで画像を投稿する方法](http://yoheikoga.github.io/2016/04/05/Hexo%E3%81%A7%E7%94%BB%E5%83%8F%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%95%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95/)
Slack | 自分専用のプライベートチャンネルを探しやすくした


自分は一人用のプライベートチャンネルを活用している。
メモとしてかなり便利。

ただ普通のチャンネルと名前がまじると、見つけづらい。そこで。
自分専用のチャンネル名には、先頭にハイフンを使うことにした。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/4e5a54f1-ed0c-4891-3c15-6b84dbf3fea6.png)

# 効用

こうすると、 `Ctrl+k` でクイックスイッチャーを立ち上げた時に。
ハイフンを打つだけで自分のチャンネルが一覧できるので、便利だ。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/a83548eb-28a6-8030-668d-05e4fec7ba80.png)

もちろん普通のチャンネルで「ハイフン始まりの名前」が使われている場合は、効果がない。
各自状況にあわせて、衝突しないプレフィックスをつけると良い。

# 環境

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/7d673e56-cf10-63ee-e9f8-0b82a5d47bdb.png)



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
世界のAngular開発者はどんなトランスパイラー・エディター・ビルドツールを使っているのか？

Angularの公式ブログの記事「[Angular 2 Survey Results](http://angularjs.blogspot.jp/2015_09_01_archive.html)」では、Angular開発者向けにAngular 2を使う上でのアンケートを取っています。世界のAngular開発者がどんなトランスパイラー、エディター、ビルドツールを好んでいるのかが興味深い結果だったので、一部を引用して紹介します。Angular開発者のみならず、フロントエンドエンジニアにとっても参考になる情報ではないかと思います。

#人気のトランスパイラーはTypeScript
トランスパイラー(Transpiler)とは、あるコードを別のコードに変換する技術を指します。記事によると、2100人の開発者に「どのトランスパイラーをAngular 2で使いたいか？」というアンケートを取った結果、1位が[TypeScript](https://www.typescriptlang.org/)とのことでした。[Babel](https://babeljs.io/)と変わらないくらいかと予想していたので少々意外でした。

*1位：TypeScript 45.0%*
*2位：Babel 33.2%*
(3位以降は記事を参照のこと)

※ 「[Angular 2 Survey Results](http://angularjs.blogspot.jp/2015_09_01_archive.html)」内「 Transpilers」より引用


#人気のエディターはWebstorm
記事によると、2100人の開発者に「Angular 2を使うときにどのエディターを使いたいか？」というアンケートを取った結果、下記のように[Webstorm](https://www.jetbrains.com/webstorm/)が1位でした。

*1位：Webstorm 43.0%*
*2位：Sublime 39.0%*
*3位：VS Code (Visual Studio Code) 30.1%*
(4位以降は記事を参照のこと)

※ 記事「[Angular 2 Survey Results](http://angularjs.blogspot.jp/2015_09_01_archive.html)」内「Editors」より引用

Googleトレンドで見ると、WebStormはこの中で3位になるので、Angularのように大規模なJavaScript開発するユーザーにはWebStormが好まれるのかもしれません。

#  人気のビルドツールはGulp
記事によると、2100人の開発者に「どのビルドツールをAngular 2で使いたいか？」というアンケートを取った結果、下記のようにGulpが大差をつけて一位でした。WebPackも伸びているようですね。

*1位：Gulp 72.4%*
*2位：Grunt 39.5%*
*3位：Webpack 23.6%*
(4位以降は記事を参照のこと)

※ 記事「[Angular 2 Survey Results](http://angularjs.blogspot.jp/2015_09_01_archive.html)」内「Build Tools」より引用

# 最後に
Angularの開発者は比較的JavaScriptを深く使い込んでいる開発者が多く、その人達がどんなツールを好んでいるのかは参考になるのではないでしょうか？ 記事「[Angular 2 Survey Results](http://angularjs.blogspot.jp/2015_09_01_archive.html)」では、他にもAngular特有の技術（Template Syntax、Template Location、Server Rendering）等のアンケート結果もありますので、興味のある方はご覧くださいませ。
Zabbixのアラートをチャットワークで通知する

Zabbixサーバにスクリプトを配置してアラートをチャットワークで通知する設定です。

# スクリプトの配置
通常は`/usr/lib/zabbix/alertscripts`以下に配置すると思いますが念のため確認します。

```text:/etc/zabbix/zabbix_server.conf
AlertScriptsPath=/usr/lib/zabbix/alertscripts
```

```chatwork
#!/bin/sh

TOKEN="CHATWORK_TOKEN"
ENDPOINT="https://api.chatwork.com/v1/rooms/${1}/messages"
SUBJECT=${2}
MESSAGE=${3}

/usr/bin/curl -X POST -H "X-ChatWorkToken: ${TOKEN}" -d "body=[info][title]${SUBJECT}[/title]${MESSAGE}[/info]" ${ENDPOINT}
```

作成したスクリプトに実行権限付けるのを忘れずに。

# メディアタイプの作成
Zabbixの「管理」->「メディアタイプ」を選択し、`メディアタイプの作成`から作成します。
[タイプ]と[スクリプトパラメータ]を下記のように設定します。特に、[スクリプトパラメータ]を設定するようになったようですので忘れずに。

<img width="649" alt="スクリーンショット 2016-04-05 13.49.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/48446/9628dad6-8e6e-809e-ac90-eb62e62189d1.png">

# ユーザ設定
任意の管理者ユーザにメディアの設定を追加します。「管理」->「ユーザ」から任意の管理者を選択します。
『メディア』タブを選択し、`追加`を押すと設定画面が開きます。タイプと送信先以外は状況に合わせて設定します。

- タイプ：(作成したメディアタイプ名)
- 送信先：通知に使いたいchatworkの部屋ID

<img width="1014" alt="スクリーンショット 2016-04-05 13.54.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/48446/71ee9d56-c82b-e31f-4429-5f67a026274b.png">

# アクションの設定
「設定」->「アクション」で[イベントソース：トリガー]を表示します。デフォルトで`Report problems to Zabbix administrators`が設定されていると思いますので、これを選択します。
ここで設定した件名、メッセージで通知が届きます。
リカバリメッセージは、障害から復旧した際のメッセージです。

<img width="629" alt="スクリーンショット 2016-04-05 14.01.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/48446/d588ebf7-6bff-8bd7-56a5-b591ae12eb7b.png">

# 参考
- [Zabbix を使ったサーバー監視 (3) - チャットワークへの通知 | Viblo](https://viblo.asia/johnny/posts/3ZabG9X4MzY6)
- [5 Custom alertscripts [Zabbix Documentation 3.0]](https://www.zabbix.com/documentation/3.0/manual/config/notifications/media/script)
MondoRescueでバックアップ

# MondoRescueでバックアップ

1.さくらＶＰＳに作成した環境をバックアップする
2.ソフトウェア個別でなく、ＯＳ全体のバックアップ
3.さくらＶＰＳが落ちている場合に移転できるよう、ISO形式でバックアップ


## MondoRescueのインストール



```
# wget ftp://ftp.mondorescue.org/rhel/5/x86_64/mondorescue.repo
# mv mondorescue.repo /etc/yum.repos.d/
# yum -y install mondo
```

## 圧縮ソフト（LZO)をインストール
```
# vi /etc/yum.repos.d/dag.repo

[dag]
name=Dag RPM Repository for Red Hat Enterprise Linux
baseurl=http://ftp.riken.jp/Linux/dag/redhat/el$releasever/en/$basearch/dag
gpgcheck=1
gpgkey=http://dag.wieers.com/packages/RPM-GPG-KEY.dag.txt
enabled=0
```

```
# yum -y install lzop lzo --enablerepo=dag
```

## バックアップ先ディレクトリを作成
```
# mkdir /backup
```


## バックアップの実行
```
# mondoarchive -Oi -L -N -s 5000m -d /backup -E /backup
```


### cronに登録して自動バックアップさせる場合
適宜修正

```
# vim /root/server-backup.sh
　　#!/bin/bash
　　mondoarchive -Oi -L -N -s 5000m -d /backup -E /backup

# chmod 700 server-backup.sh
# echo "0 7 * * * root /root/server-backup.sh" >> /etc/cron.d/backup
```


## バックアップファイルをリストア
- VPSコントロールパネル→ISOイメージインストールに従ってISOを指定
- Mondo Rescueメニュ→Interactively
- パーティション設定画面で/dev/vdaをすべて/dev/sdaにする

```
Initialize the boot loader?→Yes
You will now be abele to re-generate... →mkinitrd -f -v initrd-2.x.y.img 2.x.y
 exit
```

- /dev/vdaや/dev/hdaをすべて/dev/sdaに変更



参考リンク
[さくらＶＰＳ上のＯＳを丸ごとバックアップする](
http://tryerror.net/tryerror/wordpress/%E3%81%95%E3%81%8F%E3%82%89%EF%BD%96%EF%BD%90%EF%BD%93%E4%B8%8A%E3%81%AE%EF%BD%8F%EF%BD%93%E3%82%92%E4%B8%B8%E3%81%94%E3%81%A8%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%81%99%E3%82%8B)
SpriteStudio3rdParty/Ss5ConverterForUnity2D をアレコレしたメモ

## これはなに？

> https://github.com/SpriteStudio3rdParty/Ss5ConverterForUnity2D

で公開されている、SpriteStudioのデータをuGUIに変換するスクリプトが素の状態だと

- 問題１：Unity5.2/5.3で動かない
- 問題２：手動作業大杉
- 問題３：プロジェクトのAssetsを汚染する

と色々問題があって使えなかったので、いい感じに使えるようにしたメモ

## 問題１：Unity5.2/5.3で動かない

- Animator周りの変更とEditor側のAPIが大きく変更してるので直す。
	- Animator周りは移行先APIがなかったりするのがあり、ちょっと調べないとダメ。
		- そのうち直したやつをブランチでGithubに投げます。

## 問題２：手動作業大杉、問題３：プロジェクトのAssetsを汚染する

### そもそものフロー 

- sspj/ssae をプロジェクトにAssetとして配置する
- 右クリックでコンバートを選択
- コンバート後に、別途AnimationControllerを作成
- AnimationControllerに、コンバートで追加されたAnimationを登録
	- Animation遷移を適宜設定
- AnimationControllerをコンバートで生成されたPrefabに設定
- Prefabをヒエラルキーに追加

やってられるか！

### 改善後のフロー

- sspjをドラッグ＆ドロップで、必要なPrefab,Material...etcのみがプロジェクトに追加される。

#### どうやっているのか？

基本的なアプローチは

- オリジナルの拡張をbatchモードで呼べるように改造した上で、別プロジェクトにセットアップ。
- メインプロジェクトからサブプロジェクトをバッチモードで呼び出して必要な成果物をメイン側にコピー

追加した処理とかなんか色々は下記の通り

- Assets/Work/ 以下に、指定した sspj/ssae をコピー
- batchモードでコンバート
- さらにbatchモードで
	- AnimationControllerをUnity2D/{sspj名}/ に生成
	- animを取得して紐付け
	- Prefabを取得して、AnimationContollerを設定
- batchのPostProcessで、 Unity2D/{sspj名}/ を共有フォルダにコピー
- Work, Unity2Dフォルダをクリア
- メインのプロジェクトからは、共有フォルダを参照して、ディレクトリ指定でコピーしてAssetReloadするエディタ拡張を作っておく。 > 共有ディレクトリを、プロジェクト直下に作っておくと吉か。
	- とりあえず、めんどいのでMakefile拡張で処理した
		- この時の注意として、更新時にヒエラルキーのPrefabが死ぬ。
			- いろいろ弊害はあるが、更新時には、AnimationController/Prefabは上書きしないように。
			- ディレクトリを切っているので、rsyncが差分は放置してくれるし手っ取り早い。更新時はexcludeで除外すればよい。

> TODO: Animationの遷移の自動化


## その他

- Canvasに配置するが、Overlayだとスケールがおかしいことになる。（SpriteStudioではよくあること。。
	- ScreenSpace Camera に設定して、Canvas 描画用のカメラを設定するとよい。
		- うちはこのあたり変なことをやってるけど...
- そもそもCanvas配下におかないてでいいのでは？
	- スケールがめんどくさくなるので、Canvas配下への設置奨励
- 重ね順は優先度ののプロパティで決まるので、確実に設定する事。（Default - 0 なので確実に設定しないとUIと被る
	- UIのLayer設計によっては、変換する段階で別のレイヤー参照させておいた方がいいかも
- SpriteStudioより上にUI被せたい
	- CanvasのLayerをより上位のLayerに指定してやるのが無難。


<!--
Local variables:
compile-command: "make SsToUnity2d.html && open SsToUnity2d.html"
End:
-->
Spring BootでJettyのログを有効にする

参考先 http://wiki.eclipse.org/Jetty/Tutorial/RequestLog

```java
@Configuration
public class WebConfig {
    @Bean
    public EmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory() {
        JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory();
        factory.addServerCustomizers(new JettyServerCustomizer() {
            @Override
            public void customize(Server server) {
                HandlerCollection handlers = new HandlerCollection();
                RequestLogHandler requestLogHandler = new RequestLogHandler();
                for (Handler handler : server.getHandlers()) {
                    handlers.addHandler(handler);
                }

                NCSARequestLog requestLog = new NCSARequestLog("/var/log/jetty-yyyy_mm_dd.request.log");
                requestLog.setRetainDays(90);
                requestLog.setAppend(true);
                requestLog.setExtended(false);
                requestLog.setLogTimeZone("GMT");
                requestLogHandler.setRequestLog(requestLog);
                handlers.addHandler(requestLogHandler);
                server.setHandler(handlers);
            }
        });
        return factory;
    }
}
```
よく使う英単語の読み方を統一したい

人によって読み方が違ってモヤモヤする英単語がいくつかあったのでまとめです。
Androidアプリのコーディングで出てくる単語が多めです。

***

+ __linear__（例：LinearLayout）
    + 誤：ライナー
    + __正：リニアー__
+ __relative__（例：RelativeLayout）
    + 誤：リレイティブ
    + __正：レラティブ__
+ __height__
    + 誤：ヘイト
    + __正：ハイト__
+ __width__
    + 誤：ワイズ
    + __正：ウィドゥス__
+ __identifier__（例：Resources#getIdentifier()）
    + 誤：アイデンティファー
    + __正：アイデンティファイア__
+ __none__
    + 誤：ノン
    + __正：ナン__


※ 「正」としている発音は[Camblidge Dictionaries Online](http://dictionary.cambridge.org/dictionary/)で確認しています。
***

、、、まとめてみたらあんまりなかったですね。。。
まあ出現頻度が高い単語、ということで。

個人的には「正しい英語」とか「ネイティブの発音」とかって言葉は好きではないのですが（英語なんて地域によっていろんなバリエーションがあるので）、とはいえ人によって読み方が違うのも無用な誤解を生みそうでモヤモヤしていたので「エンジニアはこう読む」みたいな感じで統一したいところです。
RSpec で render(layout: false) をテストする

# 目的

`app/views/layouts/application.html.erb` が描画されないことをテストしたい。

# 方法

[render_template](https://www.relishapp.com/rspec/rspec-rails/docs/matchers/render-template-matcher) マッチャを使用します。

```spec/controllers/users_spec.rb
subject { get(:show, id: 1) }

it 'layout が描画されないこと' do
  expect(subject).not_to render_template(layout: :application)
end
```

`layout: false` を指定しない場合は、テストが正しく失敗することも確認しました。

```
Failures:

  1) UsersController GET show layout が描画されないこと
     Failure/Error: expect(subject).not_to render_template(layout: :application)
       expected not to render {:layout=>:application}, but did
```


# 参考

<i class="fa fa-fw fa-stack-overflow"></i> [Rspec test to render no layout](http://stackoverflow.com/questions/16592551/rspec-test-to-render-no-layout)
PhpStormでCoffeeLintを使う。

# PhpStormにCoffeeLintのプラグインを入れる手順。(Mac OS X)

## 1. メニュー左上 PhpStorm -> Preferences
## 2. Pluginsの下部のBrowse repositories...を選択

<img width="1040" alt="スクリーンショット 2016-04-05 12.58.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/9907/819fcbd5-bf18-3e18-a202-a086c0b582ff.png">

## 3. coffeeで検索してCoffeeLintを選択してInstall pluginボタン押下

<img width="824" alt="スクリーンショット 2016-04-05 12.59.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/9907/f8b39422-9674-d44f-85f1-6be278616a62.png">

# 4. Other SettingsでCoffeeLint設定
- Enableにチェック入れる
- Node のパス入れる
- CoffeeLintのパス入れる

<img width="1037" alt="スクリーンショット 2016-04-05 12.59.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/9907/99652d3e-608a-13b1-2480-585419a40329.png">


プロジェクトにcoffeelint.jsonが置いてあれば効くはず。
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 102


homebrew 経由で mysql をインストールし利用しているのですが、先日アップグレードを行いました。
その後 mysql サーバに接続しようとしたら、下記エラーが発生し接続ができなくなりました。

```
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 102
```

調べてみると原因は、`/etc/hosts.allow` に記載がないためのようでした。

`/etc/hosts.allow` で接続を許可するホストを記述します。

```
mysqld: ALL: allow
```

あとは、反映させるために再起動をかけて完了です。

```
$ mysql.server restart
Shutting down MySQL
.... SUCCESS!
Starting MySQL
.. SUCCESS!
```

## References

* http://stackoverflow.com/questions/21091850/error-2013-hy000-lost-connection-to-mysql-server-at-reading-authorization-pa
5分で始める、Anugular2のquickstartを試してみた


そろそろAngular2を試してみようと思い、リファレンスサイトを覗いたところ、「5 MIN QUICKSTART」とあったので試しに５分で導入してみました。

## 導入

![054d67924ab46cc4ff3f695843496d2a.png](https://qiita-image-store.s3.amazonaws.com/0/74237/aa3a4c1c-5163-de1c-553c-f35680f4a9be.png "054d67924ab46cc4ff3f695843496d2a.png")


 [リファレンスページ](https://angular.io/docs/ts/latest/quickstart.html)からダウンロードに移動します。jsのタイプをtypscriptかjsかdartの選択肢があったのですが、個人的にtypescriptが使いやすかったのでtypescriptを選択しました。


![cfa884407aaae59775710d329c2b8863.png](https://qiita-image-store.s3.amazonaws.com/0/74237/815e5236-5218-17a5-c230-e26f728813bd.png "cfa884407aaae59775710d329c2b8863.png")

このページに書かれている通りに導入。

```
git clone  https://github.com/angular/quickstart
cd quickstart
rm -rf .git
npm install
```

あとは実行

```
npm start
```

お、出た！

![2c9ed65214271c89aa5b72d33c25d971.png](https://qiita-image-store.s3.amazonaws.com/0/74237/2b4e5c91-9fb6-3b4c-65c2-5f0716f4d159.png "2c9ed65214271c89aa5b72d33c25d971.png")

ここまで確かに５分！！

ディレクトリ構成は以下のような感じです。
![ae3e510d4e8d3e93f6e2b6df7d5986de.png](https://qiita-image-store.s3.amazonaws.com/0/74237/293e3524-b09a-3dc4-5050-218e4d3a39ed.png "ae3e510d4e8d3e93f6e2b6df7d5986de.png")

appの中にcomponentたちがあるシンプルな構成です。
実際触っていくのは、main.ts、app.component.ts、index.htmlあたりですかね。


しかしタイトルが出ただけだったので、物寂しさを感じます。。
せっかくなので、勉強がてらこの土台を応用してtodoぽいアプリをってみようと思います。


### 実装サンプル
- https://github.com/yhikishima/Angular2/tree/master/angular2-js
- https://github.com/yhikishima/Angular2/tree/master/angular2-ts-quickstart
Mac & UNIX シェルで「.」とか「.DS_STORE」とか「.php」とか一定の法則のファイルを削除する方法

シェルで、一定のファイルとかを削除する方法

## Mac OS X システムファイルの .DS_Store と ._ ファイル

```
cd [希望のディレクトリ]
find . -name ".DS_Store" -delete; find . -name "._*" -delete
```

## PHP拡張子のファイルとか

```
cd [希望のディレクトリ]
find . -name "*.php" -delete
```

## おまけ: .DS_Store を作成しない設定

```
defaults write com.apple.desktopservices DSDontWriteNetworkStores true
killall Finder  // Finderの再起動コマンド
```

## 参考:
-  [Mac で自動で作成される「.DS_Store」「._」ファイルを削除する.](http://qiita.com/eru_tndl/items/632b227466b904365967)
-  [よく使うコマンド（自分用メモ）](http://qiita.com/redamoon/items/72fbc01c2a5460820bb0)
Railsプロジェクト作って、後悔しないために真っ先にやるべき5つのこと

## 概要

Ruby on Railsのプロジェクトに携わり、前任者がいないプロダクトを引き継ぐ際に、
「最初から〜〜しておいて欲しかった」と思うことが多い。

今まで思った、「最初から〜〜しておいて欲しかった」ということを自分なりにまとめてみた。

## 真っ先にすべき5つのこと
### CIツールの導入
Githubを使っているなら、[CircleCI](https://circleci.com/)あたりが良いと思われる。
bitbucketなら、どうやら[MagnumCI](https://magnum-ci.com/)というのがあるらしい。

とにかく、真っ先にCIツールを入れましょう。

### 静的解析ツール([Rubocop](https://github.com/bbatsov/rubocop))の導入

静的コード解析ツール。
コードの一定レベルの綺麗さを保つなら、最初から入れないとダメ。
そして、大事なのが、Rubocopでwarningやerrorが出たらCIツールで失敗するようにすること。

これは本当に初めからやらなきゃ後悔するもの。

### セキュリティチェックツール（[Brakeman](https://github.com/presidentbeef/brakeman)）の導入

これも真っ先に導入すべき。
あとから、セキュリティ・ホールが大量に見つかっても直すの本当に大変。
これも同様だが、必ずセキュリティチェックが失敗したら、CIツールで失敗するようにすること。

これも、はじめからやらなきゃ後悔する。

### N+1クエリの検出ツール（[bullet](http://github.com/flyerhzm/bullet)）の導入

モデル周りの最適化とか、通常のバックエンドエンジニアなら本当に怖くてやりたくない。
それでも、パフォーマンスチューニングしようとしたら必要な時が必ずある。

後からチューニングするのではなく、そもそも作る段階から綺麗に作っておく教訓にもなるので、はじめから入れるべし。

### テストコードを書く基盤を作る
rspec-rails, factory_girl_rails, capybara, simplecov...などを中心としたテストのためのgemがあるが、この辺を入れてテストコードを素早く書ける状態を整えること。

テストコードが一行もないプロダクトを引き渡されると、本当に怖くてなにもできない。
なので、常にテストのカバレッジを気にした開発をすべし。

## まとめ

上記で書いた5つは本当に最低限、Railsのプロダクトを作ったらまず初めにやるべきことだと思う。
後々やると必ず後悔するので。

リファクタリングに使えるgemとか様々あるが、基本的に上記のことをすべてやれば最低限気持ちいい開発はできるはずなので、これからRailsプロジェクト作るならぜひ。
MySQL：トラブル対応：バイナリログが削除できない

# 現象
更新を伴うDDL、DMLを受け付けない。実行したままいつまでも応答が帰ってこない。

# 原因
バイナリログの専用パーティションを設けており、ディスク使用率が100%になってしまっていた。

    $ df -h /binlog_data
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/sdc1             8.0G  7.6G  4.0K 100% /binlog_data

# 対応
`purge`もできない（※実行結果が帰ってこない）ので、バイナリログファイルを一つ`mv`コマンド等で別場所に退避させ、ファイルシステム空き領域を作った状態で`purge`を実行する。

    $ mv /tmp/mysql-bin.000015 /mydatalog/binlog/

* 気になっている事
バイナリログ削除するときも一時領域が必要なのかは未調査のため不明。
応答のない`purge master logs to`をDBからセッション`kill`したとき以下の様なエラーが出た。
あとで調べよう。


        ERROR 3 (HY000): Error writing file '/binlog_data/binlog/mysql-bin.index_crash_safe' (Errcode: 28 - No space left on device)
CentOS7:KickstartでKVM設定

何かとCentOS７だとKVMの設定がCentOS6と微妙に違う。
ブリッジ作ったり、Diskイメージ作ったりは他を参照

```
[prompt ~]# pwd
 /root
[prompt ~]# cat guest01.cfg
#version=RHEL7

install
cdrom
text
cmdline
skipx

lang en_US.UTF-8
keyboard --vckeymap=jp106 --xlayouts=jp
timezone Asia/Tokyo --isUtc --nontp

network  --bootproto=dhcp --device=eth0 --nameserver=8.8.8.8 --noipv6 --hostname=bs-lrepo

zerombr
bootloader --location=mbr

clearpart --all --initlabel
part / --fstype=xfs --grow --size=1 --asprimary --label=root

rootpw --plaintext B1tsurfS$G
auth --enableshadow --passalgo=sha512
selinux --disabled
firewall --disabled
firstboot --disabled

%post
## virsh console　ハング回避対応
/bin/echo GRUB_CMDLINE_LINUX=\"vconsole.keymap=jp106 crashkernel=auto vconsole.font=latarchrheb-sun16 console=tty0 console=ttyS0,115200n8r\" > /etc/default/grub
/sbin/grub2-mkconfig -o /boot/grub2/grub.cfg
%end

reboot

%packages
%end


[prompt ~]# virt-install --name guest01 --hvm --virt-type kvm --ram 4096 --vcpus 2 --arch x86_64 --os-type linux --os-variant rhel7 --boot hd --disk path=/var/lib/libvirt/disk/bs-lrepo.qcow2 --serial pty --console pty --location /var/lib/libvirt/iso/CentOS-7-x86_64-Minimal-1503-01.iso --graphics vnc,port=5902,listen=0.0.0.0,keymap=ja --initrd-inject bs-lrepo.cfg --extra-args "inst.ks=file:/guest01.cfg console=tty0" --noautoconsole
```
Oracle：表領域拡張関連メモ

### 表領域拡張

    SQL> desc dba_data_files;
    名前                       NULL?    型
    ------------------------- -------- --------------
    FILE_NAME                          VARCHAR2(513)
    FILE_ID                            NUMBER
    TABLESPACE_NAME                    VARCHAR2(30)
    BYTES                              NUMBER
    BLOCKS                             NUMBER
    STATUS                             VARCHAR2(9)
    RELATIVE_FNO                       NUMBER
    AUTOEXTENSIBLE                     VARCHAR2(3)
    MAXBYTES                           NUMBER
    MAXBLOCKS                          NUMBER
    INCREMENT_BY                       NUMBER
    USER_BYTES                         NUMBER
    USER_BLOCKS                        NUMBER
    ONLINE_STATUS                      VARCHAR2(7)

    SQL> select FILE_NAME from dba_data_files where TABLESPACE_NAME='tablespace_name';

    FILE_NAME
    ----------------------------------------------------
    /path/to/dbfile_name.dbf

    SQL> alter database datafile '/path/to/dbfile_name.dbf' resize 128M;
    データベースが変更されました。

### 一時表領域拡張

    SQL> select NAME,BYTES from  v$tempfile;
    NAME                                                BYTES
    ----------------------------------------------      ----------
    /oradata/TESTDB/datafile/file_name.tmp              2213543936

    SQL>  alter database tempfile '/oradata/TESTDB/datafile/file_name.tmp' resize 2560M;
    データベースが変更されました。

    SQL> select NAME,BYTES from  v$tempfile;
    NAME                                                BYTES
    ----------------------------------------------      ----------
    /oradata/TESTDB/datafile/file_name.tmp              2684354560

### 表領域自動拡張
    SQL> alter database tempfile '/oradata/TESTDB/datafile/file_name.tmp' autoextend on maxsize 30G;
    データベースが変更されました。
    
    SQL> alter database tempfile '/oradata/TESTDB/datafile/file_name.tmp' autoextend off;
    データベースが変更されました。
Oracle：容量調査

スキーマ毎の容量調査(Mbytes)

    select sum(bytes)/(1024*1024) "SIZE[M]" from dba_segments where owner='<スキーマ名>';

表領域毎の容量調査(Mbytes)

    select tablespace_name, sum(bytes)/(1024*1024) "SIZE[M]" 
    from dba_data_files group by tablespace_name;

表領域毎の空き容量調査(Mbytes)

    SELECT tablespace_name, trunc(SUM(bytes)/(1024*1024)) "Free[M]" 
    FROM dba_free_space GROUP BY tablespace_name;

表領域毎の調査(Mbytes)

    select 
	    d.tablespace_name, 
	    SIZE "SIZE[MB]", 
	    round(SIZE-空き容量) "使用量[MB]",
	    round((1 - (空き容量/SIZE))*100) "使用率(%)",
	    空き容量 "空き容量[MB]"
    from
    (SELECT tablespace_name, round(SUM(bytes)/(1024*1024)) "SIZE"
    FROM dba_data_files GROUP BY tablespace_name) d,
    (SELECT tablespace_name, round(SUM(bytes)/(1024*1024)) "空き容量"
    FROM dba_free_space GROUP BY tablespace_name) f
    where d.tablespace_name=f.tablespace_name
    /
Ubuntu 14.04でcgroupsを使ってリソース制限


# インストール

```
apt-get install cgroup-bin
```

# 設定

```/etc/cgconfig.conf
group group1 {
  cpu {
# デフォルト値は1024
    cpu.shares = 256;
  }
  memory {
    memory.limit_in_bytes = 4G;
  }
}
```

# 設定の反映

```
sudo cgconfigparser -l /etc/cgconfig.conf
sudo service cgroup-lite restart
```

# cgexecを使った実行

/etc/cgconfig.confの設定を適用してコマンドを実行するにはcgexecコマンドを使う。

```shell
# CPU制限の適用
cgexec -g cpu:group1 stress --cpu 4
# メモリ制限の適用
cgexec -g memory:group1 stress --vm 1 --vm-bytes 8G 
```

# cgrulesengdによるルールの適用

cgroup-binパッケージにはcgrulesengdというコマンドが含まれている。
cgrulesengdは/etc/cgrules.confの内容に従ってプロセスをcgroupに移動する。
Ubuntu 14.04ではcgrulesengdのinitスクリプトが含まれていないので、以下のファイルを作成する。

参考: http://frank2.net/cgroups-ubuntu-14-04/


```/etc/init/cgrulesengd.conf
description "cgrulesengd"
author "Serge Hallyn &lt;serge.hallyn@canonical.com&gt;"

start on started cgroup-lite
stop on stopped cgroup-lite

pre-start script
test -x /usr/sbin/cgrulesengd || { stop; exit 0; }
end script

script
  # get default options
  OPTIONS="--syslog"
  CGRED_CONF=/etc/cgrules.conf
  if [ -r "/etc/default/cgrulesengd" ]; then
    . /etc/default/cgrulesengd
  fi

  # Don't run if no configuration file
  if [ ! -s "$CGRED_CONF" ]; then
    echo "Cgred unconfigured"
    stop
    exit 0
  fi

  # Make sure the kernel supports cgroups
  # This check is retained from the original sysvinit job, but should
  # be superfluous since we depend on cgconfig running, which will
  # have mounted this.
  grep -q "^cgroup" /proc/mounts || { stop; exit 0; }

  exec /usr/sbin/cgrulesengd --nodaemon $OPTIONS
end script
```

# ルールの設定

ルールの設定ファイルを記述する。
以下はtd-agentをtd-agentという名前のcgroupに移動してCPUとメモリ制限をかける例。

参考: https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/sec-Moving_a_Process_to_a_Control_Group.html


```/etc/cgrules.conf
td-agent  cpu,memory  td-agent/
```

# ルール設定の適用

```
sudo service cgrulesengd restart
```
staticなデータを ActiveRecord で扱う

`ActiveRecord` をstaticなデータに対しても使えると嬉しいけど、
`ActiveModel` とかよくわからないので、
インメモリに展開したsqlite3を `ActiveRecord` で扱えばいいじゃんっていう話。

一応、`ActiveHash` とかのgemはあるらしけど完全互換じゃなかったので。

※注意
たぶんプロセスのメモリに展開するので、`sinatra` とか `rails` でやると残念なことになると思う

```rb
#!/usr/bin/env ruby
# coding:utf-8

require "active_record"

class InmemoryAR < ActiveRecord::Base
  self.abstract_class = true
  self.establish_connection(
    adapter:   'sqlite3',
    database:  ':memory:'
  )

  class Migration < ActiveRecord::Migration
    def connection
      @connection = InmemoryAR.connection
    end
  end
end

class TestMigration < InmemoryAR::Migration
  def change
    create_table :users do |t|
      t.string :name
    end

    create_table :items do |t|
      t.string :name
    end
  end
end

ActiveRecord::Migration.run(TestMigration)


data = YAML.load(DATA.read)
data.each { |table_name, records|
  model = Class.new(InmemoryAR) {
    self.table_name = table_name
  }
  self.class.const_set(model.table_name.classify, model)

  records.each { |record|
    model.create(record)
  }
}

require "pp"
pp User.all
pp Item.all

__END__
---
users:
  - name: foo
  - name: bar
  - name: baz
items:
  - name: aaa
  - name: bbb
  - name: ccc
```
[Mac]OS起動時に、スクリプトを実行する


launchctlで、OS起動時にスクリプトを実行させます。
システムワイド環境変数を設定する際に便利です。

# 手順

## 1. スクリプト作成

OS起動時に自動で実行するスクリプトを作成します。

/Users/XXXX/.system.enviroment

```bash
#! /bin/sh

/bin/launchctl setenv REDMINE_ACCESS_TOKEN XXXX
/bin/launchctl setenv REDMINE_URL https://redmine.XXXX.co.jp
/bin/launchctl setenv GITHUB_TOKEN XXXX
/bin/launchctl setenv QIITA_ACCESS_TOKEN XXXX
/bin/launchctl setenv BACKLOG_ACCESS_TOKEN XXXX
/bin/launchctl setenv BACKLOG_URL https://XXXX.backlog.jp
```

## 2. plistファイルを作成

launchctlにloadするplistファイルを作成します。
plistで、スクリプトをロード時に実行するように設定します。
実行スクリプトのPATHはチルダ(~)が使えないようです。

/Users/XXXX/Library/LaunchAgents/system.environment.plist

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>system.environment</string>
    <key>Program</key>
    <string>/Users/XXXX/.system.enviroment</string>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>
```

## 3. plistファイルをロード

plistをlaunchctlにloadします。

```bash
launchctl load ~/Library/LaunchAgents/system.environment.plist
```

# おわり

上記の手順で、OS再起動時に設定したスクリプトが実行されます。
`launchctl load`に実行されるのでOS再起動しなくても
`unload`して`load`しなおせば動作確認可能です。