OmniAICreator/Qiita-1.07M huggingface dataset:
Googleスプレッドシート メソッドまとめ

## はじめに
簡単なデータ管理を、スプレッドシート + スクリプトでささっと済ませたい
けど公式ドキュメントを読むのも面倒
そんなときのために、よく使いそうなAPIをまとめておきました

※ドキュメントはこちら
https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app

## 基本的な操作
`Cmd + R`で実行
`Cmd + Enter`でログを確認
`Logger.log(log)`でログを格納

## オブジェクトの作成
```sample.js
// オブジェクトの作成とアクセス
var spreadSheet  = SpreadsheetApp.create("Finances");
var spreadSheet2 = spreadSheet.copy("Copy of " + spreadSheet.getName());
// 2つめに差し込み
var sheet        = spreadSheet.insertSheet('piyo', 1)
// テンプレートから作成
var templateSheet = ss.getSheetByName('hoge');
var sheet        = spreadSheet.insertSheet('hoge2', 1, {template: templateSheet})
```
## 各オブジェクトへのアクセス
```sample2.js
var spreadSheet  = SpreadsheetApp.openById(spreadSheet.getId('hogehoge'));
var sheet        = spreadSheet.getSheets()[0];
var sheet        = spreadSheet.getSheetByName(name);

var cell         = sheet.getRange('A1');
var range        = sheet.getRange('A1:A3'); 
var cell         = sheet.getRange(1,1); // range object
var fullRange    = sheet.getDataRange();  //データが入ってるレンジ全部
```
## プロパティの取得
```sample3.js
var numSheets    = spreadSheet.getNumSheets()
var sheetName    = sheet.getIndex()
var sheetName    = sheet.getName()
var sheetParent  = sheet.getParent()
var sheetVlalues = sheet.getSheetValues(1,1,3,3) // List[value]
var lastColumn   = sheet.getLastColumn()
var lastRow      = sheet.getLastRow()
var rangeValue   = range.getValues("B1:B3")      // List[value]
var rangeFolmula = range.getFormulas("A1:B3")
```

## データの変更
```sample4.js
sheet.insertColumnBefore(2);
sheet.insertColumnBefore(2);
sheet.deleteColumns(2, 2); //Columns & Rows start at "1"
sheet.sort(1);
sheet.clear();
cell.setValue("=A1")
range.setvalue([[1],[2],[3]])
range.setFontColors([["red"], ["black"], ["blue"]]);
range.clear()
```

## データバリデーション
```validation.js
//いずれかの値をとる
var cell = sheet.getRange('A1:A3');
var rule = SpreadsheetApp.newDataValidation()
                         .requireValueInList(['Yes', 'No'])
                         .build();
cell.setDataValidation(rule);
//ある文字を含まない
var cell = sheet.getRange('A1');
var rule = SpreadsheetApp.newDataValidation()
                         .requireTextDoesNotContain('@')
                         .build();
cell.setDataValidation(rule);
//他のセルの値のどれか
var cell = sheet.getRange('A1');
var range = SpreadsheetApp.getActive().getRange('B1:B10');
var rule = SpreadsheetApp.newDataValidation().requireValueInRange(range).build();
cell.setDataValidation(rule);
```
新しくなったStartSSLを使ってSSLサーバ証明書を発行する

# 概要
無料でSSLサーバ証明書を発行できるStartSSLを使おうとしたところ、公式サイトがネットで調べたものと大分変わっていました。
というわけで、新しくなったStartSSLで証明書を発行するまでの手順をメモしておきたいと思います。

# 手順
## ユーザー登録
まずは[StartSSL](https://www.startssl.com/)へアクセスして、メニューバーのSign-upからユーザー登録へ飛びます。

![image](https://qiita-image-store.s3.amazonaws.com/0/55804/98a9f1ea-2145-6158-9ecb-3c0ba93f19ab.png)

メールアドレスを入力して、届いたコードを入力して認証を完了させます。
クライアント証明書が作成されるので、選択の上コントロールパネルへ進みます。

![image](https://qiita-image-store.s3.amazonaws.com/0/55804/9598257c-5b26-e6ad-80bd-55211df79b51.png)

次に、右下のFREEな`Click here`からサーバー証明書作成へと進みたい…ところですが、

![image](https://qiita-image-store.s3.amazonaws.com/0/55804/23ddca96-799f-9231-5186-bee5374b3712.png)

> Make sure you have already validated a domain name or email address before using this tool!

と言われるので、隣のValidations Wizardでドメイン認証を行います。

## ドメイン認証
![image](https://qiita-image-store.s3.amazonaws.com/0/55804/bedc2338-f4fc-77b6-0a32-85bc6266e05b.png)

Domain Validationを選択して進み、**トップレベルドメイン**を入力します。

![image](https://qiita-image-store.s3.amazonaws.com/0/55804/f59788fd-9067-1ece-7b5c-f207f7fe5dd8.png)

メールの送信先を聞かれるので、自ドメインで受信可能なアドレスを選択してから`Send Verification Code`をクリックします。
この時点から60秒以内に受け取ったメール内のコードをValidationボタンで送信してください。

![image](https://qiita-image-store.s3.amazonaws.com/0/55804/57379db9-f72c-16e8-30dd-8bc8353e7760.png)

認証が終わったら、`To "Order SSL Certificate`で証明書作成へ進みます。

## 証明書の作成
![image](https://qiita-image-store.s3.amazonaws.com/0/55804/77bfcacf-1537-565c-ad07-f33ac54fb48a.png)

まずは証明書を作成するホスト名を入力します。

その次にあるのはCSRの入力ボックスです。
説明文のリンクにあるStartComTool.exeにお任せしました。

**4/27追記**
**コメントにてCSRの生成ツールに[変更が加わった](https://blog.horiuchi-ryouta.jp/?p=107)との情報を頂きました。利用される際にはこちらを御覧ください。**

![image](https://qiita-image-store.s3.amazonaws.com/0/55804/fc55c539-8349-353e-37a3-844d80e12fb7.png)

(ってよくよく考えたらモザイクかけなくて大丈夫ですねこれ…)

Common Nameが、ブラウザで入力したホスト名と同一であることを確認して生成します。
この出力を先ほどのボックスに貼り付けてsubmit。

![image](https://qiita-image-store.s3.amazonaws.com/0/55804/3c1fbc6a-2cff-39b2-7c82-baa4c92116b3.png)

click here～ のリンクから証明書がダウンロードできます。

![image](https://qiita-image-store.s3.amazonaws.com/0/55804/5967dcc6-3430-5911-6dbc-042ec4137310.png)


nginxユーザーの私はこのzipファイル内のNginxServer.zipにある証明書を使いましたが、すでに中間証明書とサーバー証明書が連結されていたのでコピーするだけで大丈夫でした。

![image](https://qiita-image-store.s3.amazonaws.com/0/55804/245c5275-beda-0e2d-d41f-a457a2584e01.png)

各種サーバーへの設定は他の記事にお任せするとして、ブラウザからはこんな感じに。
晴れてSSLによるセキュアな通信ができるようになりました。

# おわりに
個人的な話ですが、自ドメインのメール受信設定に3日ほど費やしました。疲れました。
証明書発行はとんとん拍子で進んだので気持ちよかったです。

~~また以前とは違いStartSSL側の担当者によるチェックがなくなったようで、より手軽に導入することができました。~~
100%なくなったとは限らないようです。
StartSSL側のチェックが必要な場合に遭遇しましたらご一報いただければと思います。(1/25)

# 追記
[SSLTest](https://www.ssllabs.com/ssltest/)でSSL対応を評価したところ、評価Cとされてしまいました。
[こちら](http://postd.cc/https-on-nginx-from-zero-to-a-plus-part-2-configuration-ciphersuites-and-performance/)を参考に設定して安全な域まで持って行きましたが、きちんと知識として入れていかないとダメですね……とほほ
direnvからSCLを利用する

# はじめに：SCLの説明と利用方法

RHELや、CentOSなどのRHELクローンは標準リポジトリから提供される一部のパッケージのバージョンが古いことで知られるが、しばらく前よりSoftware Collections(SCL)リポジトリから標準リポジトリよりは多少新しいバージョンのパッケージが提供されるようになった。
SCLから提供されるバイナリは最新というわけではないが、公式に提供されyumでインストールできるので利用はし易いだろう。
CentOSでは6および7のx86_64版でSCLリポジトリを利用することができる。

SCLリポジトリから供給されるパッケージは標準のものとは違うディレクトリ/opt/rhにインストールされ、scl enableコマンドなどで環境変数を切り替えることにより利用する形を採る。

例えばPython 3.4は以下のようにインストールする。

```
# yum install centos-release-scl
# yum install rh-python34
```

rh-python34はパッケージ名だが、SCLの場合特にコレクション名と呼んだりする。
インストールしているコレクション名の一覧は「scl -l」で取得できる。
また、SCLパッケージのインストール先は"/opt/rh/(コレクション名)"である。

環境変数を切り替えてコマンドを実行するには「scl enable (コレクション名) (実行したいコマンド)」とする。

```
$ scl enable rh-python34 'python -V' # 環境変数を切り替えてコマンドを実行する
Python 3.4.2
$ scl enable rh-python34 bash # 環境変数を切り替えたbashを起動して実行しても良い
$ python -V
Python 3.4.2
```

大元のシェル起動時からSCLから提供されるバイナリを使用したい場合は、 https://access.redhat.com/solutions/527703 に書かれている通り「source scl_source enable (コレクション名)」を/etc/profile.d内のシェルスクリプトから呼び出すようにしておけば良い。

```
# cat <<EOD > /etc/profile.d/enablepython34.sh
#!/bin/bash
source scl_source enable rh-python34
EOD
```

source scl_source enableコマンドはその場で環境変数を切り替えるのにも使用できる。

```
$ source scl_source enable rh-python34
$ python -V
Python 3.4.2
```

scl enableコマンドやsource scl_source enableコマンドがセットする環境変数は以下である。

* /opt/rh/(コレクション名)/enable に書かれたもの
* X_SCLS（値はコレクション名）

なお、複数のSCLリポジトリからのパッケージをインストールしている場合、複数回scl enableコマンドやsource scl_source enableコマンドを実行すれば、実行したすべての分使用可能となるような仕組みになっているようだ。

# direnvからSCLを利用する

SCLの利用方法が上記の通り環境変数を用いるものであるため、cdなど（pushdやautojumpなどでも良い）で特定のディレクトリに入った時に環境変数をセットし、出た時に環境変数をアンセットして元に戻してくれるdirenvとSCLとは相性が良い。

direnvのインストール。

```
# curl -L https://github.com/direnv/direnv/releases/download/v2.6.0/direnv.linux-amd64 -o /usr/sbin/direnv
# chmod +x /usr/sbin/direnv
```

direnvを使用したいユーザは、bashでcd等をフックさせるために.bashrcに以下のように1行を追加してやる必要がある。bash以外にもzsh, fish, tcshで似た方法で利用できる。

```
$ echo 'eval "$(direnv hook bash)"' >> $HOME/.bashrc
```

追加した行を反映させるため「exec bash -l」を実行しておく。
（一旦ログアウトしてログインし直す、とかでも良いが）

ディレクトリを作ってdirenvにセットさせたい環境変数などを"(ディレクトリ)/.envrc"に書いて「direnv allow (ディレクトリ名)」するとdirenvの準備完了である。
ここでは環境変数のセットに前述のsource scl_source enableコマンドを使用してやれば良い。

```
$ mkdir p34
$ cat <<EOD > p34/.envrc
source scl_source enable rh-python34
layout python3 /opt/rh/rh-python34/root/usr/bin/python
EOD
$ direnv allow p34
```

ちなみに、layoutで呼んでいるpythonバイナリのあるディレクトリ /opt/rh/rh-python34/root/usr/bin/ は /opt/rh/rh-python34/root/bin/ にシンボリックリンクが張られているが、includeディレクトリを../includeで探しているっぽく前者で指定しないとエラーになった。
（つまり、 /opt/rh/rh-python34/root/usr/include/ は /opt/rh/rh-python34/root/include/ にシンボリックリンクがないのである）

ディレクトリに出入りすればこの通り、想定通りに動いてくれる。

```
$ python -V
Python 2.7.5
$ cd p34
direnv: loading .envrc
Already using interpreter /opt/rh/rh-python34/root/usr/bin/python3
Using base prefix '/opt/rh/rh-python34/root/usr'
New python executable in /home/test1/p34/.direnv/python-3.4.2/bin/python3
Also creating executable in /home/test1/p34/.direnv/python-3.4.2/bin/python
Installing setuptools, pip...done.
direnv: export +LD_LIBRARY_PATH +MANPATH +PKG_CONFIG_PATH +VIRTUAL_ENV +XDG_DATA_DIRS +X_SCLS ~PATH
$ python -V
Python 3.4.2
$ cd
direnv: unloading
$ python -V
Python 2.7.5
```
JavaでJSONオブジェクトを扱う

APIなどにアクセスして情報を取得する場合、レスポンスにJSONの形で入ってくることがあります。その場合、Java言語では以下のような手順で扱います。

###JSON受け取り
1.レスポンス受け取り
2.レスポンス文字列をJSONオブジェクトに変換
3.JSONオブジェクトをパースする

以下に例を示します。
####レスポンスで受け取る文字列

```JSON
[
  {
    "id": 1,
    "name": "post1",
    "price": 1501,
    "kind": 3,
    "kind_value": "ランチ",
    "user_value": null,
    "play": "2016-01-24T00:01:12.000Z",
    "lon": null,
    "lat": null,
    "created_at": "2016-01-24T12:25:52.000Z",
    "updated_at": "2016-01-24T12:25:52.000Z"
  },
  {
    "id": 2,
    "name": "post2",
    "price": 1502,
    "kind": 4,
    "kind_value": "ブランチ",
    "user_value": null,
    "play": "2016-01-23T00:01:12.000Z",
    "lon": null,
    "lat": null,
    "created_at": "2016-01-24T12:26:05.000Z",
    "updated_at": "2016-01-24T12:26:05.000Z"
  }
]
```

####Javaのソースコード

```java
//レスポンスの文字列をJSONオブジェクトに変換
JSONArray jsonArray = new JSONArray(レスポンス文字列);
for (int i = 0; i < jsonArray.length(); i++) {
  //JSONオブジェクトをパースして、レコードのname属性をログ出力
  JSONObject jsonObject = jsonArray.getJSONObject(i);
  Log.d("HTTP REQ", jsonObject.getString("name"));
}
```

Log.dで、JSONのレコード毎にname属性を出力しています。
Zybo > 電源 > at least 2.5A of current (i.e., at least 12.5W of power).

ZYBO用にスイッチングACアダプターを購入しようとしている。

ZYBO_RM_B_V6.pdfによると

> The supply must use a coax, center-positive 2.1mm internal-diameter plug, and deliver 4.5VDC to 5.5VDC and at least 2.5A of current (i.e., at least 12.5W of power).

という記載がある。2Aでなく2.5A品を購入しておく方がよさそうだ。


## ACアダプター
(2016/01/30追記)

以下を購入した

- Linkman
- スイッチングACアダプター5V/3A 2.1mm プラグ
- 880円
- 送料: 486円

コンセントに挿したときに、横方向に伸びているので上下のコンセントをふさがないと思う。
【PythonのSeabornグラフライブラリ】axes.color_cycle is deprecated and replaced with axes.prop_cycleのUserWarningについて

# Seabornでaxes.color_cycle is deprecated and replaced with axes.prop_cycleのUserWarningについて

##発生タイミング
公式サイトのGalleryのコードをコピペして実行したらUserWarning。

## UserWarningが出た原因
Seabornはmatplotlib 1.5にはまだ対応していない。
>Seaborn hasn't caught up to matplotlib 1.5 yet.
[参照元](http://matplotlib.1069221.n5.nabble.com/Warning-message-on-quot-import-seaborn-quot-td46522.html)

## 暫定対応
Seabornは今修正中なので待つ
Seabornの開発版をpipからインストールする
pip install git+git://github.com/mwaskom/seaborn.git#egg=seaborn
matplotlibは1.5を使わない

私は開発版をインストールしたら公式のサンプルが動きました :smile:
Sublime Textのハイライトカラー変更でハマった

#ハイライトカラーを変更する
SublimeTextのハイライトカラーをいじった時に上手く反映されなかったときのこと。

SublimeTextのハイライトや選択範囲の色はデフォルトだと非常に見にくいので、ネット上の先輩達からヒントを貰いつつ、自分なりに色の定義を変更してみた。
<br>

***
####１、現在のテーマを確認して開く
SublimeTextの設定ファイルであるPreference.sublime-settings(```⌘ + .```で開ける)を開いて、```color_scheme```に現在のテーマが定義されているので確認。
確認した```*.tmTheme```ファイルを開く。(```/Users/ユーザー名/Library/Application Support/Sublime Text 3/Packages/User/Color Highlighter/Themes/*.tmTheme``` にて発見)
<br>
***
####２、変更したい箇所を検索
自分の場合、開いたテーマファイルの中から```lineHighlight```を検索
<img width="738" alt="スクリーンショット 2016-01-24 20.38.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/110584/9658392b-7a7a-6769-2233-a37d98536ab3.png">
見っけ。
<br>
***
####３、カラーコードの変更
すぐ下の行のカラーコードを自分の好きな色に変えて保存。
<img width="738" alt="スクリーンショット 2016-01-24 20.43.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/110584/92fac522-58d8-5056-f69f-11fa4a1d919a.png">
これで終わり、ではない。

<img width="740" alt="スクリーンショット 2016-01-24 20.46.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/110584/1829f6a1-1b10-d4be-df13-b634cf852228.png">
変わらない。なぜ。
<br>
***
####４、テーマ(カラースキーム)を指定
どうやらSublimeTextのPreferencesから変更したテーマを指定しなければならなかった模様。
![scsho.png](https://qiita-image-store.s3.amazonaws.com/0/110584/c00c64ff-a7d9-5b12-2d5f-88b911116655.png)
変更！！

<img width="732" alt="スクリーンショット 2016-01-24 21.50.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/110584/0b398377-13a7-89d4-6f8f-2fceb4da2418.png">
いい感じ。
<br>

###結び：色の変更について
ハイライトカラー以外にも、すぐ下の```selection```を変更すれば選択範囲、```comments```の```foreground```を変更すればコメントアウト等、色系統は大体自分の思い通りに出来る印象を受けました。
<br>
SublimeTextで良く使うコマンド

#Web初心者である俺のためのSublimeTextコマンド

####・単語選択：```⌘ + D```
...カーソル上の単語を選択。続けて押せば押した分だけ同じ単語を選択する。
####・行選択：```⌘ + L```
...カーソル上の行を選択。
####・行コピー：```⌘ + Shift + D```
...カーソル上の行を次の行にコピーして貼り付け。
####・スマート改行：```⌘ + Enter```
...行途中であっても右側の文字達を連れて来ずに改行して移動してくれる。(日本語むずい)
####・スマート前改行：```⌘ + Shift + Enter```
...スマート改行の１行前バージョン
####・コメントアウト：```⌘ + /```
...カーソル上あるいは選択範囲内の行全部コメントアウト。もっかいやれば解除。
####・アンドゥー：```⌘ + U```
...```⌘ + Z```と同じだけど、こっちの方がもうちょい細かい操作もアンドゥー(カーソル移動等)。
####・アドバンス検索：```⌘ + Shift + F``` または ```⌘ + alt + F```
...Shiftの方はお開き中の全ファイルから、altの方は現在のファイルから検索。altは普通の```⌘ + F```よりもadvancedな感じ。
####・復活の"T"：```⌘ + Shift + T```
...最後に閉じたタブを開く。


おわり。
自作のコマンドをrpmパッケージ化 - specファイルの編集

specファイルを編集して、
自作のコマンドをrpmパッケージにする方法をざっくりと調べました。

#環境
- fedora21 3.17.4-301.fc21.x86_64

#事前準備

必要なもの：

- rpmbuildコマンド

```
# sudo yum install rpm-build
```

でインストールします。

- 自作のコマンド

今回はサンプルとして、以下を用意しました。
端末上に"hello, world!"を出力するプログラムです。

```hello.c
#include <stdio.h>

main(void)
{
	printf("hello, world!\n");
}
```

コンパイルします。

```
$ gcc -o hello hello.c
$ ./hello
hello, world!
```

これでコマンドは完成です。(ﾟ∀ﾟﾉﾉﾞﾊﾟﾁﾊﾟﾁﾊﾟﾁﾊﾟﾁ

#rpmパッケージ化

作成したコマンドをまずアーカイブ化します。
今回作ったコマンドのバージョンは1.0なので、
アーカイブ名はhello-1.0.tar.gzにしました。

```
$ tar czvf hello-1.0.tar.gz hello
```

作業するディレクトリを作成します。

```
$ mkdir -p rpmbuild/{SOURCES,SPECS}
```

先ほど作成したアーカイブを作業ディレクトリ配下のSOURCESに移します。

```
$ cp hello-1.0.tar.gz rpmbuild/SOURCES
```

カレントディレクトリを作業ディレクトリへと変更し...

```
$ cd rpmbuild
```

specファイルをざっくりと記述します。
各項目の意味は色々な所で解説されているので、ここでは割愛します。

```
$ vim SPECS/sample.spec
```

```sample.spec
%define name hello
%define version 1.0
%define unmangled_version 1.0
%define release 1
%define _binaries_in_noarch_packages_terminate_build 0

Summary: sample hello world program
Name: %{name}
Version: %{version}
Release: %{release}
License: GPL2
Source0: %{name}-%{unmangled_version}.tar.gz
Group: Applications/File
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
Prefix: %{_prefix}
BuildArch: noarch

%define INSTALLDIR %{buildroot}/usr/local/bin

%description
This is a sample program to learn how to make a rpm package.

%prep

%build

%install
rm -rf %{INSTALLDIR}
mkdir -p %{INSTALLDIR}
cp -R * %{INSTALLDIR}

%clean
rm -rf %{buildroot}

%files
/usr/local/bin
%defattr(-,root,root)

```

specファイル記述後、
rpmbuildコマンドを実行して、いざ、rpmパッケージを作成！

```
$ rpmbuild -bb SPECS/sample.spec
```

成功した場合、RPMSディレクトリ配下にrpmパッケージが作成されています。

```
ls RPMS/noarch/
hello-1.0-1.noarch.rpm
```

パッケージをインストールします。

```
$ sudo rpm -ivh RPMS/noarch/hello-1.0-1.noarch.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:hello-1.0-1                      ################################# [100%]
```

インストール後、試しに自作コマンドを実行します。

```
$ hello
hello, world!
```

無事、実行されました。

rpm -qaの一覧にもしっかりと表示されます。

```
$ rpm -qa | grep hello
hello-1.0-1.noarch
```

以上です。
underscoreコードリーディング（defer）

underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##deferとは


###[underscorejs.orgのdefer](http://underscorejs.org/#defer)

こんな説明。
>####_.defer(function, *arguments) 
>Defers invoking the function until the current call stack has cleared, similar to using setTimeout with a delay of 0. 
>Useful for performing expensive computations or HTML rendering in chunks without blocking the UI thread from updating. 
>If you pass the optional arguments, they will be forwarded on to the function when it is invoked.


```javascript
_.defer(function(){ alert('deferred'); });
// Returns from the function before the alert runs.

```
------------- 

0の遅延でsetTimeoutを利用するのと同様で、現在のコールスタックがクリアされるまで関数の呼び出しを遅延させます。
高等な計算をする場合や、大量のhtmlレンダリングをUIスレッドのupdateをブロックせずに行う場合に使いやすいです。
もしargumentsを渡した場合、functionが呼び出される際に受け渡されます

###[underscore.](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L772)
コード的にはこのあたり。

```javascript
 // Defers a function, scheduling it to run after the current call stack has
  // cleared.
  _.defer = _.partial(_.delay, _, 1);

```

_.particalと_.delayを用いて1ミリセカンド遅らせる。
Evernoteで空（ノート数が0）のノートブックを取得するAppleScriptハンドラ



* ノートが1つもないノートブックのリストを返す
* 引数を`false`にすると、反対に、ノートが1つでも存在するノートブックのリストを返す


```AppleScript:emptyNotebooksOfEvernote.scpt
tell application "Evernote"
	set emptyNotebooks to my emptyNotebooksOfEvernote(true)
	--> {notebook "EmptyNotebook" of application "Evernote"}
	
	notes of item 1 of emptyNotebooks
	--> {}
	
	set notEmptyNotebooks to my emptyNotebooksOfEvernote(false)
	exists notes of item 1 of notEmptyNotebooks
	--> true
end tell

on emptyNotebooksOfEvernote(isEmpty as boolean)
	tell application "Evernote"
		if isEmpty then
			return notebooks whose class of notebook of note 1 of it ≠ notebook
		else
			return notebooks whose class of notebook of note 1 of it = notebook
		end if
	end tell
end emptyNotebooksOfEvernote
```


## 更新履歴

* 2016-01-24: フィルタ機能を使って作成
Zybo > Link > ZYBOボード用LEDテストのVivado 2013.4プロジェクト


FPGAの部屋の人が公開されているファイル。
[ZYBOボード用LEDテストのVivado 2013.4プロジェクト](https://github.com/marsee101/Vivado_ZYBO_LED_test2)

関連ページ
http://marsee101.blog19.fc2.com/blog-entry-2754.html


## やってみた


- プロジェクトの実行場所は以下とした
  - `C:\ZyboDev\160124_LED_test2-marsee`

http://marsee101.blog19.fc2.com/blog-entry-2754.html
> ・led4_axi_lite_slave を展開して、src を展開し、\ZYBO_LED_test\system\SDK フォルダにある led_axi_lite_slave.c を src フォルダにドラッグアンドドロップする。

という記載については

`C:\ZyboDev\160124_LED_test2-marsee\Vivado_ZYBO_LED_test2.sdk\SDK\SDK_Export\led4_axi_lite_slave\src`
にある`led4_axi_lite_slave.c`をSDKのsrcフォルダ(下の画像)にドラッグした。そうすると[Copy File?]のような確認があるので、Copy Fileを選択した。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e0dbdcc4-d664-dc05-7af7-b57be61941bb.png)


参考のページにRun Configurationをするように書いているので、わからないなりに以下のようにしてみた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/7863d098-5411-0867-1056-a8b111e39e0c.png)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/2cba2e7f-65dd-bc10-109f-ceb77d44330d.png)

これでRunを実行。

TeraTermにてメニューが表示された。メニューの2「to set LED4 Enable or Disable(Toggle, Command Register)」を実行するとLD0..LD3が点灯や消灯になった。


![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a19c2adf-1d05-1910-6673-effed517ee8c.png)
Ubuntu15.04インストール後に発生した問題への対策


主に自分が引っかかった、次の3つについて忘備録代わりに簡単にまとめました。

1. NVIDIAのグラボ端子からディスプレイに表示されない問題
2. 英語の文字化け
3. キーボードの設定がおかしい問題


## ACPI PPC Probe failedと表示される

最初からこうなる場合もありますし、cudaをインストールしてrebootしたらこうなる場合もあると思います。
英語やキーボードの設定がおかしい場合は、先に後続の設定をしてしまいましょう。


### 何はともあれログイン

Nvidiaのグラフィックボードではない、マザーボード側の方に端子を接続する。
Ctrl+Alt+F1で端末にログイン。


### ドライバーの削除

自分には必要なかったですが、[この作業](http://qiita.com/aoinu/items/7f3f85a9190ffe809736)が必要な人がいるかもしれません

### 設定

[ここ](http://askubuntu.com/questions/383636/12-04-3-can-start-only-after-press-resume-in-rescue-mode-every-boot-proble)に解決法が示されていました。

`/etc/default/grub` をスーパーユーザ権限で次のように編集すればいいらしいです。

``` /etc/default/grub
#GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nomodeset"
```

nomodesetを加えただけですね。
編集が終わったら、`sudo update-grub` を実行。
そして `sudo reboot` 等で再起動すれば、グラフィックボードの端子でモニターに表示されるようになります。

## 英語文字化け

日本語環境で普通にインストールを進めていたと思うのですが、デフォルトで日本語が文字化けしていました。

[こちらの記事](http://www.alb.jp/%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF/ubuntu%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%8C%96%EF%BC%8D%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%81%AB%E5%AF%BE%E5%87%A6%E3%81%99%E3%82%8B%EF%BC%81/)を参考にさせていただきました。
「3.2)日本語でインストールした後、サーバーパソコン側の文字化けに対処する場合」の作業を行えば、なんとかなりました。

要約すると、ホーム以下の.bashrcの最後に、次の文を加えるだけです。

```  ~/.bashrc
case $TERM in
     linux)LANG=C ;;
     *)LANG=ja_JP.UTF-8 ;;
esac
```

キーボードがおかしい場合は入力が大変だと思います。
ちなみに"*"はテンキーの方を活用するなどできます。
自分の場合は、"_"は[Shift + -]、"="は^と対応していました。

編集が終わったら`source .bashrc`で反映してください。



## キーボードの設定がおかしい

'\'や'|'の文字がなぜが入力できない問題も発生していました。

[ここ](http://superuser.com/questions/326908/no-pipe-symbol-in-ubuntu-11-04-running-in-windows-7-x64-virtualbox)に情報がありましたが、次のコマンドで設定できます。

`sudo dpkg-reconfigure keyboard-configuration`

自分もDELLのキーボードだったので、上記のリンクの例にあるように、てきとーにSK-7100を選択しましたが、これで動くようになりました。
AndroidでGETリクエストを送付する（HttpURLConnection利用）

Android(Java)にて、HTTPリクエストを送付します。
今回は純正APIのHttpURLConnectionを利用します。

```java
try {
  HttpURLConnection con = null;
  URL url = new URL("URL");
  con = (HttpURLConnection) url.openConnection();
  con.setRequestMethod("GET");
  con.setInstanceFollowRedirects(false);
  con.setRequestProperty("Accept-Language", "jp");
  con.connect();
  con.getResponseCode();
  if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
    BufferedReader reader = new BufferedReader(
      new InputStreamReader(con.getInputStream(), "UTF-8")
    );
    String buffer = reader.readLine();
    while (null != buffer) {
      Log.d("HTTP REQ", buffer);
      buffer = reader.readLine();
    }
  }
  con.disconnect();
} catch (MalformedURLException e) {
    e.printStackTrace();
} catch (ProtocolException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} catch (Exception e) {
    e.printStackTrace();
}
```

レスポンスの出力は、以下の記述を参考にしました。
後ほど内容を確認したいと存じます。

（参考）
ライトニングJava
HTTP通信の基礎(1) - URIとURL、URLConnection
→http://news.mynavi.jp/column/java/054/

上の例ではレスポンスで指示があれば、リダイレクトするように
なっているので、以下のオプションを設定してください。
（setInstanceFollowRedirectsなど）
React.cloneElementでpropsを追加する

# tl;dr
Reactのchildrenに特定のpropsを追加したい時は、`React.cloneElement`を使う。

# やりたいこと
```
<Dialog closeEvent='onFinish'>
  <RegistrationForm/>
</Dialog>
```

`Dialog`はモーダルダイアログっぽく表示するコンポーネントで、中の`RegistrationForm`は登録フォームでいろんなところで使える再利用可能な感じに仕上がってるものとする。`Dialog`自体としては標準で閉じるボタンを表示するものの、登録フォームでの処理が終わったら自動で閉じたい、なんてこともあるはず。

とはいえ、`RegistrationForm`自体は`Dialog`内で使われることを意識してないので、処理が成功したらモーダルダイアログを閉じる処理を`RegistrationForm`自体に入れるわけにもいかない。

`Dialog`の`children`として渡されたコンポーネントの特定のイベントに対して、モーダルダイアログを閉じる処理を設定すればよさそうだが、`children`のpropsにどうやって後から指定すれば良いのか。

# React.cloneElement
で :ok: 
https://facebook.github.io/react/docs/top-level-api.html#react.cloneelement

既存のpropsに新しいpropsをマージすることができる。

```
render() {
  return React.cloneElement(
    this.props.children,
    {マージしたいprops}
  );
}
```

てな感じである。

こちらのfiddleに実装してみた。細かい制御はないが、`Content`自体に一切Dialog内にあることを意識させずに、Dialogを閉じる処理を追加できている。
https://jsfiddle.net/hokuma/1mu5opr4/
非管理者でもnode.js+npmを導入したい


背景
----
node.jsをWindowsに導入する場合、MSIで簡単に導入できるが、「管理者」でないとインストールできなかった。
「非管理者」でも入れられないか調べたところ、とりあえずできたので。

- node.js(v5.5.0)
- npm(2.10.1)

node.jsのダウンロード
----
MSIインストーラではなく、Windowsのバイナリが配布されているのでそれをダウンロード

http://nodejs.org/dist/latest/win-x86/node.exe


npmのダウンロード
----
https://github.com/npm/npm/releases からzipをダウンロードしておく

ファイルを配置する
----

- ファイルの置き場所を決める。ここでは `C:\path\to\nodejs` としておく。
- `C:\path\to\nodejs` に `node_modules` を作る。(npmの置き場所)
- `node.exe`を置き場所に置く。
- npmは展開し、`npm-x.yy.zz`を、`npm`へリネームし、 置き場所に作った`\node_modules`の中に置く。
- `npm.cmd`を`npm\bin`からコピーして、node.exeと同じ場所に置く
    - `npm.cmd`へのPATHを通してもダメ。

ツリーで言うと、こんな感じになる

- `C:\path\to\nodejs`
    - `node.exe`
    - `npm.cmd`
    - `\node_modules`
        - `\npm`
            - ...

PATHを設定する
----
上記で決めた置き場所をPATHに設定する。今回は `C:\path\to\nodejs` になる。

WindowsでのPATHの設定の仕方は各自でお調べください。

確認する。
----
コマンドプロンプト`cmd`から`npm -v` と鬱と、それらしいバージョンが出てくることを確認する。

付録1. proxyの設定
----
npmの環境変数に設定する。

- https://docs.npmjs.com/misc/config#proxy
- https://docs.npmjs.com/misc/config#https-proxy
MacにAndroidの開発環境を構築する

MacにAndroidの開発環境を構築します。

###環境を整える
**1.Android Studioをダウンロード**
http://developer.android.com/intl/ja/sdk/index.html

**2.インストールする**

**３.プロジェクト作成**
自分は、SonyのXPERIA Ray（Androidバージョン2.3.4）を持っているので、それをテスト用に使用します。
OSに合わせて、APIレベルは９を指定します。Activityは、Blankを設定して作成。

**４.実機で動かす**
プロジェクトのビルドが終わった段階で、IDE上部の緑再生ボタンを押下すれば、動かす機器一覧にEXPERIAが表示されて、テストアプリを選択します。

**５.結果**
無事動作しました。
以下のような画面が、実機に表示されています。

![device-2016-01-24-195411.png](https://qiita-image-store.s3.amazonaws.com/0/110457/c8dd0063-874b-c6c1-7f03-3a88e77f7693.png)

IDEや、APIなど自身がアプリ開発していた頃とは、大きく変わっているように思いますが、少しずつ慣れていきたいです。最近良く話題になるGradleなども、必須の知識となっているようで勉強する必要がありますね。
【Rails】生成sitemap


### 安装

```ruby:Gemfile
gem 'sitemap_generator'
```

### 生成config/sitemap.rb

```
bundle exec rake sitemap:install
```
修改SitemapGenerator::Sitemap.default_host

```ruby:config/sidemap.rb
SitemapGenerator::Sitemap.default_host = 'http://example.com'
```

### 在public/下生成sitemap文件
```
# Development/Test环境
bundle exec rake sitemap:refresh:no_ping

# Production环境
bundle exec rake sitemap:refresh
```

结果如下：

```
rake sitemap:refresh:no_ping
> In /app_path/to/public/
> + sitemap1.xml.gz                                          1 links > /  340 Bytes
> + sitemap_index.xml.gz                                  1 sitemaps > /  241 Bytes
> Sitemap stats: 1 links / 1 sitemaps / 0m00s
```

### 修改Robots.txt
```Robots.txt
Sitemap: http://www.example.com/sitemap.xml.gz
```

### Deployments & Capistrano

```Capfile
require 'capistrano/sitemap_generator'
```
可使用的命令：

```
deploy:sitemap:create   #Create sitemaps without pinging search engines
deploy:sitemap:refresh  #Create sitemaps and ping search engines
deploy:sitemap:clean    #Clean up sitemaps in the sitemap path
```

### 参考网站 

http://morizyun.github.io/blog/meta-tags-sitemap-generator-rails-seo/

https://github.com/kjvarga/sitemap_generator
Google Apps ScriptからTrello APIを使ってみる

仕事でのタスク管理にTrelloというツールを使っているので、最近はじめた「Google Apps Script」の勉強がてら触ってみます！

# 事前準備
## API Keyの取得
[Trello](https://trello.com/)にログインしている状態で、以下のURLにアクセスします。
https://trello.com/app-key

すると、以下のように、API KeyとAPI Secretが表示されます。
![APIKeys.png](https://qiita-image-store.s3.amazonaws.com/0/53215/a0c1e6b3-6dca-b9e1-2ff5-cc3b51edb2ce.png)

## API Tokenの取得
以下のURLにアクセスすると、以下のような認証画面が表示されますので、ログインしているアカウントを確認して、「Allow」をクリックします。

失効期限無し、有効範囲がread,write,accountのAPI Tokenを発行する場合
https://trello.com/1/authorize?key=[APIKey]&expiration=never&response_type=token&scope=read,write,account
※各パラメーターの説明は、[Trello Developersを参照](https://developers.trello.com/authorize)

![Authorize.png](https://qiita-image-store.s3.amazonaws.com/0/53215/7e20d370-168b-6179-4de7-cb7e221bdbe6.png)

以下のように、API Tokenが表示されます。
![APIToken.png](https://qiita-image-store.s3.amazonaws.com/0/53215/77c17cd9-fd9f-d796-ac17-d74296aa4de8.png)

取得したAPI Tokenについてはこちらの「Applications」から確認することができます。
https://trello.com/[username]/account

# Boardの情報を取得する
ここまで準備が整ったら、さっそく動かしてみましょう！

```コード.gs
function getBoard() {
  var scriptProp =  PropertiesService.getScriptProperties().getProperties();
  var trelloKey = scriptProp.TRELLO_API_KEY;
  var trelloToken = scriptProp.TRELLO_TOKEN;
  var userName = scriptProp.TRELLO_USERNAME;

  var url = 'https://trello.com/1/members/' + userName + '/boards?key=' + trelloKey + '&token=' + trelloToken + '&fields=name';
  Logger.log(UrlFetchApp.fetch(url, {'method':'get'}))
}
```

コードを実行すると、以下のように、Bordの名前とIDが取得できました！

```
{
    "id": "56a4a687a4e7ec9ab91da1d2", 
    "name": "Sandbox"
}
```
プログラマ脳を鍛える数学パズル『Q01 １０進数で回文』をCrystalで


https://carc.in/#/cr で実行しました。

version: 0.10.2

```crystal
require "benchmark"

time = Benchmark.measure do
  num = 11

  while true
    if num.to_s == num.to_s.reverse && \
        num.to_s(2) == num.to_s(2).reverse && \
        num.to_s(8) == num.to_s(8).reverse
      puts num
      break
    end
    num += 2
  end
end

puts time

```

```sh
585
  0.000000   0.000000   0.000000 (  0.000240)
```

Rubyと全然変わらないのでネタバレ感ひどいですけど・・・。
コマンドプロンプト起動時にPATHを通す

社用端末や仮想デスクトップを使用していると、PATHの編集が許可されていない場合がある。便利なコマンドを自作したとしても、PATHが通っていなければ宝の持ち腐れである。

そこでこの記事では、コマンドプロンプト起動時に一時的なPATHを設定することによって、端末管理者に負担をかけずに自作コマンドを活用する方法を示す。

# 前提として

あなたの自作コマンド群は、端末管理者が気にしないフォルダ(C:\temp\batなど)にまとめて格納されているものとする。以下では、C:\temp\bat を PATH に追加することにする。

# まずコマンドプロンプトを起動する

コマンドプロンプトは起動時に %USERPROFILE% が作業フォルダに設定されている。

```bat:コマンドプロンプト
C:\User\hogehoge> echo %USERPROFILE%
C:\User\hogehoge
```

# PATHの追加をコマンド化する

%USERPROFILE% に、PATH を設定するコマンドを配置する。init.bat など、入力しやすく既存のコマンドと重複しないファイル名が良い。

```bat:コマンドプロンプト
C:\User\hogehoge> echo set PATH=C:\temp\bat\;^%PATH^% > init.bat
C:\User\hogehoge> type init.bat
set PATH=C:\temp\bat\;%PATH%
```
キャレット(^)はエスケープ文字

# コマンドプロンプト起動時に init.bat を実行する

次回からコマンドプロンプトを起動するたびに、init を実行するだけで、PATH を通す作業が完了する。

```bat:コマンドプロンプト
C:\User\hogehoge> init
C:\User\hogehoge> echo %PATH%
C:\temp\bat\;C:\...
```

ポイントは init.bat が %userprofile% に配置されている点と、bat ファイルは拡張子を省略できる点である。

# 補足

init.bat の本体を C:\temp\bat に置いておくと、ポータビリティ（持ち運びやすさ）が上がり、端末交換の際などに便利である。具体的には以下の通り。

```bat:コマンドプロンプト
C:\User\hogehoge> type init.bat
@C:\temp\bat\init.bat
C:\User\hogehoge>
C:\User\hogehoge>
C:\User\hogehoge> type C:\temp\bat\init.bat
@echo off
set PATH=%~dp0;%PATH%
...
...
C:\User\hogehoge>
```

`%~dp0` は、init.bat 本体の格納されているフォルダのパスを示す(変数展開)。
init.bat に、他の初期化コマンドをまとめて記述しておくと更に便利になる。

---

更に便利とか言いつつ、普段使ってる init.bat は以下のようなシンプルな感じです。
やはり PATH 通すことが一番重要......

```bat:init.bat
@echo off
set PATH=%~dp0;%PATH%
prompt [%username%@%computername%]$G$s
color 3f
```
.bat（バッチファイル）で配列式変数の中身をシフトする

　複数の変数の中身をずらしたい時、ありませんか？
　そんな時にこのラベルがあれば、万事解決！

　…というわけで、変数のシフトをするバッチラベルです。
　引数を左シフトするコマンドには**shift**というものがあるのですが、変数ではできませんし右シフトもできません。
　それをできるようにしてみました。

　ここでは、以下の変数をシフトする例として用います。

```text
num[1]=1
num[2]=2
num[3]=3
num[4]=4
num[5]=5
```

#使用法

```bat
call :dShift 引数１ 引数２ 引数３ 引数４
```
　引数１には**シフトする変数の数字以外の部分**を入力します。**ここではnumです。**
　引数２には**シフトする変数の数字の初項**を入力します。
　引数３には**シフトする変数の数字の公差**を入力します。**正の値だと左シフト、負だと右シフトです。**
　引数４には**シフトする変数の数字の末項**を入力します。

　引数２～４は、そのまま```for /l``のカッコ内の数字だと考えると分かりやすいかもしれません。


　具体例を挙げて説明します。

#例１：全部を左シフトする

```bat
call :dShift num 1 1 5
```

```text:結果
num[1]=2
num[2]=3
num[3]=4
num[4]=5
num[5]=5
```
　この例に限りませんが、シフトされた端のデータ（ここではnum[5] ）は**そのまま残ります。**
　もしリングバッファ的に扱いたい（num[1]の値をnum[5]に持ってきたい）場合は、あらかじめ別の変数に保存しておいて、シフト後に代入する必要があります。**この場合の例も後ほど紹介します。**

#例２：３～５番目を右シフトする

```bat
call :dShift num 5 -1 3
```

```text:結果
num[1]=1
num[2]=2
num[3]=3
num[4]=3
num[5]=4
```

#例３：奇数番目だけ左シフトする

```bat
call :dShift num 1 2 5
```

```text:結果
num[1]=3
num[2]=2
num[3]=5
num[4]=4
num[5]=5
```

#実際のラベル

　変数の数字の部分を[ ]で括っていない方は、ラベル内から[ ]を消してください！

```bat:通常のシフト（非リングバッファ）
:dShift
	set str=
	for /l %%i in (%2,%3,%4) do set str=!str! %1[%%i]
	call :dShift2%str%
	exit /b
	:dShift2
		set /a %1=%2
		shift
		if "%2" == "" exit /b
		goto dshift2
```

```bat:シフトで押し出された数字を逆側に代入（リングバッファ）
:dShift_r
	set str=
	for /l %%i in (%2,%3,%4) do set str=!str! %1[%%i]
	set temp=!%1[%2]!
	call :dShift2_r%str%
	set %1[%4]=!temp!
	exit /b
	:dShift2_r
		set /a %1=%2
		shift
		if "%2" == "" exit /b
		goto dshift2_r
```
CentOSにPostgreSQLをインストールするコマンドメモ


# PostgreSQL
```
wget http://yum.postgresql.org/9.6/redhat/rhel-6-x86_64/pgdg-redhat96-9.6-1.noarch.rpm

rpm -ivh pgdg-redhat96-9.6-1.noarch.rpm

yum install postgresql96

yum install postgresql96-devel

yum install postgresql96-server
```
JUnit4.4以降で動的に@Ignoreみたいなことをする


JUnitで`@Ignore`をメソッドにつけると、テストは実行されずにスルーされます。
開発中に一時的に無視させておきたい場合なんかに便利ですね。

```java
@Test
@Ignore
public void サンプル() {
    assertTrue(false);
}
```

こうした「テストを無視する」ようなことを動的に行う場合は`org.junit.Assume`を使います。
データベースや通信のテストのような結合テストを行う場合に便利でしょう。

実装はこんな感じです。（データベースが有効だったらテストを実行するようなイメージ）

```java
@Test
public void サンプル() {
    org.junit.Assume.assumeTrue(db.isValid());
    assertTrue(db.isEmpty());
}
```

[org.junit.Assume](http://junit.sourceforge.net/javadoc/org/junit/Assume.html)のメソッドはいくつかあるので、色々なチェックができますね。
`@Before`に設定しておいて複数のテストの事前条件チェックもできたりして便利そうです。

![Kobito.szzULB.png](https://qiita-image-store.s3.amazonaws.com/0/6061/ef2fa055-0e3b-42b7-d856-e9ae1cab2046.png "Kobito.szzULB.png")
Nginx + Unicorn + RailsでWebアプリを構築する

**Nginx**

```/etc/nginx/conf.d/nginx.conf
upstream unicorn {
    server unix:/opt/app/tmp/sockets/unicorn.sock;
}
server {
    listen 80;
    server_name  localhost;
    root /opt/app/public;
    try_files $uri/index.html $uri @unicorn;

    location @unicorn {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_pass http://unicorn;
    }

    error_page 500 502 503 504 /500.html;
    error_page 404 /404.html;
}
```

**Unicorn**

```/opt/app/config/unicorn.rb
# -*- coding: utf-8 -*
application = "app"
working_directory = "/opt/app/"

worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
timeout 15
preload_app true

listen "/opt/app/tmp/sockets/unicorn.sock"
pid "/opt/app/tmp/sockets/unicorn.pid"

# ログの出力
stderr_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
stdout_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
```

今回、問題となったのはuniconのsockファイルを/tmp直下に配置していました。てアクセスすると502エラーとなります。原因は以下で言及されています。
http://blog.tnantoka.com/posts/49/versions/current

CentOS7では、NginxとUnicorn間で/tmpに配置したファイルを共有できないようです。ファイルのパスを変更したら、問題なく動作しました。
Worldize で世界地図を書く

世界地図を描画してくれるおもしろい Gem

```rb:sample_worldize.rb
require 'bundler/setup'
require 'worldize'

worldize = Worldize::Countries.new
img = worldize.draw
img.write('world_map.png')
```

こういう感じで `draw` メソッドを呼ぶだけで、世界地図を出力してくれる。

![blank.jpg](https://qiita-image-store.s3.amazonaws.com/0/41416/7e13af9a-8c13-88ce-9e3d-7eb64ce6f285.jpeg)


おー！

色も付けれる

```rb:sample_worldize.rb
img = Worldize::Countries.new.draw(
    ocean: '#b0e0e6',
    land: '#faebd7',
    border: 'black',
    'Japan' => '#008000',
    'USA' => 'red'
  )
```

![world_map2 copy.jpg](https://qiita-image-store.s3.amazonaws.com/0/41416/a02af6c5-65be-c31e-5ed7-112deb3fb666.jpeg)

色は直接指定以外にも、比率で色分けも出来る。

```rb:sample_worldize.rb
worldize = Worldize::Countries.new
values = {
  'Afghanistan' => 0,
  'Albania' => 1,
  'Algeria' => 2,
  'Angola' => 3,
  ...
}

# draw_gradient(from_color, to_color, {country => val, ...})
worldize.draw_gradient('#D4F6C8', '#247209', values).write('world_map.png')
```
![world_map copy.jpg](https://qiita-image-store.s3.amazonaws.com/0/41416/50bc530c-b791-de70-3807-fd4fc1f1d19f.jpeg)



こんなに世界中いらないよーという人は、こうすれば

```rb:sample_worldize.rb
require 'bundler/setup'
require 'worldize'

module Worldize
  class Countries
    def select_countries!(selected_countries)
      @countries.select! {|country| selected_countries.include?(country.properties.name) }
    end
  end
end

worldize = Worldize::Countries.new

worldize.select_countries!('Japan')
worldize.draw.write('world_map.png')
```

![world_map2.jpg](https://qiita-image-store.s3.amazonaws.com/0/41416/0f088a7f-cc94-ae6b-9fcb-3f5b154b84a6.jpeg)

なんかゴミみたいになったけど、日本だけ取り出せますね！

うん。
サーバ初心者に捧ぐ、サーバを立てたらまずすべきセキュリティの設定

普段アプリのコードを書いていて
サーバはあまり詳しくないというエンジニアに向けて、
サーバを新しく立てたらまず最初にすべきセキュリティ関連の設定をまとめました。

ここで説明する設定は以下になります。
※rootユーザでsshでログインできること、OSはCentOSを前提とします。

1. 作業用ユーザの作成
2. rootユーザのログイン禁止
3. sshのポート変更
4. ファイアウォールの設定変更
5. アクセス元IPの制限
6. 鍵認証でログイン

# 設定の前に気を付けること
作業用に張ったsshのセッションは、設定が正しく反映されるのを確認するまで切らないでおくこと！
でないと設定を間違えたときにログインできなくなる可能性があります。。
面倒でも設定変更のたびに別にログインして確認するのをオススメします。

# 1. 作業用ユーザの作成
まずは作業用ユーザを作成します。
wheelグループに追加して、rootユーザになれるようにします。

```bash:
> useradd saitoxu -G wheel
> passwd saitoxu
```

作業後、作成したユーザでログインできるか確認してみてください。

# 2. rootユーザのログイン禁止
次に、sshの設定を変更してrootユーザでのログインを禁止します。

```bash:/etc/ssh/sshd_config
# rootユーザでのログインを禁止
PermitRootLogin no
```

# 3. sshのポート変更
sshのポートをデフォルトの22から適当に変更します。

```bash:/etc/ssh/sshd_config
# ポートの変更
Port 10022
```

ここまで終えたらsshを再起動します。

```bash:
> service sshd restart
```

rootユーザでログインできないことと、ポートが変更されていることを確認してください。

# 4. ファイアウォールの設定
次にファイアウォールの設定を行います。iptablesコマンドでルールを設定していきます。
以下に[こちら](https://help.sakura.ad.jp/app/answers/detail/a_id/2423/~/iptables%E3%81%AE%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95)から拝借した設定例を載せておきます。
詳しくはリンク先を見ていただく方がいいかなと思います。

```bash:
# 1. サーバへの攻撃に対する対策
> iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
> iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
> iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

# 2. localhostからの通信とpingを許可
> iptables -A INPUT -i lo -j ACCEPT
> iptables -A INPUT -p icmp -j ACCEPT

# 3. ssh, http, httpsを許可（サーバーの用途による）
> iptables -A INPUT -p tcp -m tcp --dport 10022 -j ACCEPT
> iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
> iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

# 4. 確立済みの通信を許可
> iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 5. 許可した通信以外は拒否
> iptables -P INPUT DROP

# 6. 送信するパケットは全て許可
> iptables -P OUTPUT ACCEPT

# 7. 設定をファイルに保存
> service iptables save

# 8. サービスを再起動
> service iptables restart

# 9. 設定を確認
> iptables -L
```

# 5. アクセス元IPの制限
さらにセキュリティを強化するため、アクセス元IPを制限します。
`hosts.deny`と`hosts.allow`をそれぞれ以下のように編集します。

```bash:/etc/hosts.deny
sshd : all
```

```bash:/etc/hosts.allow
sshd : 123.123.123.123 # 自宅や会社のIP
```

これは再起動する必要などはなく、即時に反映されます。
これで許可されたIPから以外のアクセスは弾けるようになりました。

# 6. 鍵認証
最後にログイン方法を鍵認証にして、パスワード認証を無効にします。

```bash:
# クライアントで鍵の作成
> ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/saitoxu/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/saitoxu/.ssh/id_rsa.
Your public key has been saved in /home/saitoxu/.ssh/id_rsa.pub.
The key fingerprint is: ...

# 公開鍵をscpでサーバーに上げる
> scp id_rsa.pub ~/.ssh/

# 鍵の登録
> cat id_rsa.pub >> authorized_keys
> chmod 600 authorized_keys
```

これでもう鍵認証でログインできますが、クライアントのconfigに設定を登録しておきます。

```bash:~/.ssh/config
Host hoge
    HostName 123.123.123.123
    IdentityFile ~/.ssh/id_rsa
    Port 10022
    User saitoxu
```

あとはサーバの方でパスワード認証を無効にします。
sshdの再起動を忘れずに！

```bash:/etc/ssh/sshd_config
PasswordAuthentication no
```

以降、以下のコマンドを打つだけでログインできるようになります。

```bash:
> ssh hoge
```

以上
node.js 8.x をyumでインストールする(centos7.x)

# node.jsをyumでインストールする(centos7.x)

## はじめに

nodejsをyumからインストールするのにnodesourceというサードパーティリポジトリからのインストールを紹介します
この方法でamazon linuxにもインストールできます。
プロダクション環境ではnvmを使うよりyumで管理したほうがセキュリティアップデートを扱いやすいです

## リポジトリ追加

```
curl -sL https://rpm.nodesource.com/setup_8.x | bash -
```

リポジトリ単位でインストールするバージョンをコントロールします
8.xを6.xに変更すると6.xもインストール可能
(4.xを使いたい場合は4.xと指定すればインストール可能)

## インストール

```
yum install -y nodejs gcc-c++ make
```


## そのた

* ~~nodesourceという企業情報~~
* ~~サードパーティなのでリスク評価してから使いましょう~~
* ~~http://jp.techcrunch.com/2015/02/10/20150209nodesource-raises-3-million-to-build-new-programming-tools/~~
* NODE.JS公式インストール方法になってました。安心して使ってください。
* https://nodejs.org/en/download/package-manager/#enterprise-linux-and-fedora
再帰CTEによるデータ投入

再帰CTEを使用したINSERT文。性能確認用などで大量データを投入する際に使用する。他の方法と比べてないので、使い勝手はわからない。あと、適当に作ったので、改良の余地あり。

```sql:empテーブル
create table emp (
    empid char(10)
  , empname varchar2(50)
  , primary key(empid)
);
```

```sql:再帰CTEを使用したinsert文
insert into emp (empid, empname)
  with
    input(f, t) as (
      select 1, 10000 from dual
    )
  , seq(n) as (
      select f from input
      union all
      select n + 1 from seq where n + 1 <= (select t from input)
  )
  select lpad(n, 10, '0'), 'aaaa' from seq;
```
dyld: Library not loaded: /usr/local/opt/ruby/lib/libruby.2.2.0.dylib を治した時の記録

#症状

```
~/src/********** (******** ✔) ᐅ vim Vagrantfile 
dyld: Library not loaded: /usr/local/opt/ruby/lib/libruby.2.2.0.dylib
  Referenced from: /usr/local/bin/vim
  Reason: image not found
[1]    37759 trace trap  vim Vagrantfile
```

#改善に影響を与えたと思われるコマンド群（順不同）

```
brew update
brew uninstall --force ruby
brew uninstall --force openssl
brew install openssl
brew link openssl --force
brew install rbenv
rbenv install 2.2.0
rbenv global 2.2.0
echo 'export PATH=/usr/local/bin:$PATH' >> ~/.zshrc
echo 'export PATH=$HOME/.rbenv/shims:$PATH' >> ~/.zshrc
CONFIGURE_OPTS="--disable-install-rdoc --enable-shared" rbenv install 2.2.0
sudo ln -s ~/.rbenv/versions/2.2.0 /usr/local/opt/ruby
```
mysqldumpで文字コードのエラーが出た時の対処

wordpressサイトのDBをmysqldumpでコピーしようとした時に下記のエラーが出たので対処。

```
Unknown collation: 'utf8mb4_unicode_ci'
```

参考
[WordPress 4.2、MySQL 5.5.3及びutf8mb4について](http://pc.thejuraku.com/wordpress-4-2%E3%80%81mysql-5-5-3%E5%8F%8A%E3%81%B3utf8mb4%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
[【WordPress】DBの文字コードをのエラーがでたときの対処法メモ](http://qiita.com/ituki_b/items/04585c27e5ecdc426005)



dumpファイルの
```utf8_general_ci```を```utf8_general_ci```へ変更
```utf8mb4```を```utf8```へ変更

以上で無事ダンプ出来ました。
centos7で標準のsystemdを使いnode.js製サーバーをデーモン化する

# centos7で標準のsystemdを使いnode.js製サーバーをデーモン化する

## はじめに

node.jsをデーモン化するにはforever、pm2、supervisorなどいろいろありますが
centos7になってから標準のスタートアップスクリプトでもとくに問題がでていないので紹介します

## プロセスマネージャーに一般に必要とされる機能

以下の機能は標準のsystemdで満たしています

* ターミナルからプロセスの切り離し
* マシン再起動による自動起動
* プロセスダウンによる自動再起動

## systemdではやってくれない機能

* マルチコアスケールアウト（PM2）

## 設定ファイルサンプル

* サーバー名称:sample-server
* 実行ユーザー:centos

ディレクトリ /etc/systemd/system/ の下に サーバー名称.serviceというファイルを作ります

```:/etc/systemd/system/sample-server.service
[Unit]
Description=sample server
After=syslog.target network.target

[Service]
Type=simple
ExecStart=/usr/bin/node /home/centos/server/app.js
WorkingDirectory=/home/centos/server
KillMode=process
Restart=always
User=centos
Group=centos

[Install]
WantedBy=multi-user.target
```

## 起動、終了、再起動コマンド

以下のコマンドが使えるようになります。
起動と終了が問題なくできれば自動起動登録すればマシン起動時に自動で立ち上がります

```:自動起動登録
systemctl enable sample-server
```

```:起動
systemctl start sample-server
```

```:終了
systemctl stop sample-server
```

```:再起動
systemctl restart sample-server
```

# その他

foreverはそのまま置き換え可能です
pm2はクラスタ化によるhttpのロードバランス機能が必要な時に選択すればよいと思います

# ログについて

systemdをつかって標準出力に出力した場合、journalctlコマンドで内容を確認できる
標準ではlessが使われるがtailを使いたい場合は-fオプションを使うとログを目視で監視できる
複雑なExcelをテキストファイルから生成。Windows,Mac,Linuxの実行ファイルなので、どの言語でも使用可能

[excel-by-text https://github.com/mikeshimura/excel-by-text](https://github.com/mikeshimura/excel-by-text)  

複雑なExcelも作成可能です。　例えば下記のサンプルの様なものも出来ます。  

プログラムから、テキストファイルを作成し、子プロセスで、当プログラムを実行すれば、どの言語でも使用出来ます。  

## 下記のExcelを作成するテキストファイルの最初の部分は下記の通りです。
各エレメントは、タブ(\t)で、区切らなければなりません。

```go
STA	Sheet1
SN	base	Verdana	10
CS	base	TBLR
SB	TBLR	TBLR	Thin
SF	TBLR	Solid	Blue:20	Yellow
CS	TBLR	TBLR_R
SH	TBLR	Right
SN	TITLE	Arial	24	TBLR	Double
SF	TITLE	Gray125	Black:50	CCCCFF
SI	TITLE	T
SH	TITLE	Center
SN	DATE	Arial	11
SC	DATE	Black:60
CS	TBLR	HEADER
SBL	HEADER	T
SF	HEADER	Solid	Blue:40	Yellow
SB	HEADER	TB	Medium
```

生成された Excel サンプル
![Simple1](https://bytebucket.org/mikeshimura/goreport/wiki/image/simple1text.jpg "Simple1")
[text](https://bytebucket.org/mikeshimura/goreport/wiki/excel-by-text/simple1.txt)
[excel](https://bytebucket.org/mikeshimura/goreport/wiki/excel-by-text/simple1.xlsx)

## プログラムの実行
excel-by-text(.exe) -e encoding inputfile

-e は省略可  
encoding の省略値は UTF8.  ShiftJIS, EUCJPが使用出来ます。
LdaModel実行時に「too few updates 〜」と怒られた場合

なんすかこれ...
passesかiterationsをいじればいいっぽいけど
数値計算のパラメタ調整とか中身知らないので本当に怖い.

```py3:エラーのとこ
model_lda = LdaModel(corpus=corpus, num_topics=30, id2word=corpus.id2word)
WARNING:gensim.models.ldamodel:too few updates, training might not converge; consider increasing the number of passes or iterations to improve accuracy
```

[ソースコード](https://github.com/piskvorky/gensim/blob/develop/gensim/models/ldamodel.py)を見てみる
問題はinit最後に実行されるupdateメソッド

```py:updateメソッド内_616行付近
if updates_per_pass * passes < 10:
    logger.warning("too few updates, training might not converge; consider "
                   "increasing the number of passes or iterations to improve accuracy")
```

passesは LdaModelのinitパラメタpassesをそのまま使ってる.
デフォルトで1が代入されている.
updates_per_pass... むむむ...

```py:updateメソッド内_607行
updates_per_pass = max(1, lencorpus / updateafter)
```

lencorpusはupdateメソッドの585行目付近で len(corpus)の値が代入されている.
要は文書数.この警告が出ている時の文章数は4019.
updateafter...

```py:updateメソッド内_599行目あたり
if update_every:
    updatetype = "online"
    updateafter = min(lencorpus, update_every * self.numworkers * chunksize)
else:
    updatetype = "batch"
    updateafter = lencorpus
```

updateメソッドの引数指定が無いなら,
update_everyには,initパラメタupdate_everyと同じものが代入される.初期値は1.
なんにもしてなかったらupdatetypeはonlineになる.
self.numworkersには,initパラメタdistributedがFalseのままなら1が入っている.

chunksizeは...

```py:updateメソッド内_595行
chunksize = min(lencorpus, self.chunksize)
```
self.chunksizeはinitパラメタchunksizeとおなじ.デフォルトは2000.


つまり...
updateafter = min(4019, 1*1*2000) = 2000
updates_per_pass = max(1, 4019 / 2000) ≒ 2
で,ifの左の評価式は 2*1 になる.アウト.

対策は
・passesを増やす.今回の場合ではpasses=5で怒られなくなる.
・updateafterを小さくする=update_everyかchunksizeを小さくする.
_今回の場合でchunksizeだけを変えるなら400ぐらいにしたら怒られなくなる.

このパラメタについては疲れたので別の日に調べます.
001-プロキシ経由でWindows updateができないときは。

# 結論。
## Windows update エラー「0x80072EFD」が出たら
「netsh winhttp import proxy source=ie」
としましょう。
[ヘルプ](https://support.microsoft.com/en-us/kb/2894304/ja)は、あるにはあるのだけれども「0x80072EFD」で検索すると[違うページ](http://windows.microsoft.com/ja-jp/windows-8/windows-update-error-0x80072efd)が表示されるトラップががが。
※恐らく有効な場合もあると思うのですが、それにしてはなんだかなぁという気分。

## 環境
+ Windows 7 Professional
+ プロキシサーバを介してインターネットへ接続できる
+ プロキシ設定はインターネットオプションで設定済み
+ ウイルス対策ソフト（VB Corp）インストール済み…だけど本件とは無関係だった
+ Windowsの時刻同期がうまくいかない（最初はこれが問題なのかと思い時間を食った）けどずれは1分未満
pythonではインクリメント・デクリメントに++や--は使えない

まー、そのまんまタイトルの通りなのですが、
C#とかJavaとかでプログラミングしていると
num++とかnum--とかを使う事が有ると思います。

よくあるのは、forやwhileのループ条件に
num<=10などと指定して
実行文の末尾にnum++とか書くとかだろうか

まぁ、++とか--で1減らしたり増やしたりしてる訳だ
これをpythonでやるとエラーを吐く

単純にインクリメント、デクリメント演算子が無いからだ
それが分かればする事は単純
num+=1と書き換えてやれば普通に動作する
説明する必要はないかとも思うが、+=は
num=num+1と書かなければいけない所を短縮してくれる
素敵な演算子なのである。

```py:inc.py
num=0
while num<=10:
# YOUR CODE HERE #
   num+=1
   num-=1
```
球面の法線ベクトルの計算


あまり使うことはなさそうですが、極座標において中心を減点とする球面の法線ベクトルを推定し、任意のベクトル(この場合は直交座標系で(0,0,1)のベクトルとのなす角を計算する手順を示します。

##1 法線ベクトルの計算

$r,\theta,\varphi$で定義される球における位置ベクトル$\mathbf{x}$
 の法線ベクトルは下記の様に表される。
 
 ```math
 \mathbf{x}	\equiv	r\left(\sin\theta\cos\varphi,\ \sin\theta\sin\varphi,\ \cos\theta\right)\\
\mathbf{n}\left(\mathbf{x}\right)=\mathscr{N}\left[-\frac{\partial\mathbf{x}}{\partial r}\right]	=	\mathscr{N}\left[-\left(\sin\theta\cos\varphi,\ \sin\theta\sin\varphi,\ \cos\theta\right)\right]
 ```
 
 ただし、$\mathscr{N}\left[\right]$
 は括弧内を規格化することを意味する。

##2 xとyの値からz軸を計算
 $z$が未知で$x,y,r,\theta,\varphi$が既知の場合、下記の関係

```math
x	=	r\sin\theta\cos\varphi,\\
y	=	r\sin\theta\sin\varphi,\\
z	=	r\cos\theta.\\
```

から、z の座標が以下の様に求まる。

```math
z=r\cos\theta	=	\pm r\sqrt{1-\sin^{2}\theta},\\
	=	\pm r\sqrt{1-\left(\frac{x}{r\cos\varphi}\right)^{2}},\\
\frac{x}{r\cos\varphi}	=	\sin\theta,\\
\sin\theta	=	\begin{cases}
\frac{x}{r\cos\varphi} & y=0\\
\frac{y}{r\sin\varphi} & x=0,\ {\rm otherwise}
\end{cases}.
```

##3 角度の計算

球の平面の法線ベクトル$\mathbf{n}$と、カメラの視線ベクトル$\left(0,0,1\right)$とのなす角$\theta$は以下ので示される。

```math
\theta	=	\arccos\left(\frac{\mathbf{n}\cdot\left(0,0,1\right)}{\left|\mathbf{n}\right|\left|\left(0,0,1\right)\right|}\right)
```
Karabiner で Finder がアクティブのときに空のテキストファイルを作成するショートカットを作る

## はじめに
BetterTouchTool が有料になったのをきっかけとして、BetterTouchTool で設定していたキーボードの設定部分を [Karabiner](https://pqrs.org/osx/karabiner/index.html.ja) に移行した。ついでに 「Finder 上で Command + N を押すと、空のテキストファイルを作成する」というものも Karabiner でできる感じだったのでやってみた。

## やり方

Open Karabiner > Misc & Uninstall > Custom Setting > Open private.xml の流れでファイルを開く。あとは以下のように書く。

```xml
<?xml version="1.0"?>
<root>
  <list>
    <item>
      <name>Control_L+Command_L+N to create a new text file</name>
      <identifier>private.create_new_file</identifier>
      <vkopenurldef>
        <name>KeyCode::VK_OPEN_URL_CREATE_NEW_FILE</name>
        <url type="shell"><![CDATA[
          cd $(osascript -e '
            tell application "Finder"
              get POSIX path of (target of window 1 as alias)
            end tell
          ')
          touch newfile.txt
        ]]></url>
      </vkopenurldef>
      <autogen>
        __KeyToKey__ KeyCode::N, ModifierFlag::CONTROL_L | ModifierFlag::COMMAND_L,
        KeyCode::VK_OPEN_URL_CREATE_NEW_FILE
      </autogen>
      <only>FINDER</only>
    </item>
  </list>
</root>
```

ファイルを保存後、Change Key > Reload Xml な流れでたどっていき、新たに作成したカスタムなアイテムにチェックを入れる。これで OK 。Finder 上で Control + Command + N を押すと `newfile.txt` が作られるはず (Control, Command はすべて左に配置されているものを押す) 。Command + N だとディレクトリ作成のショートカットに影響が出るみたいなので変更した。`<url type="shell">` 部分にシェルスクリプトを書いていく感じになっているが、長いなら `<url type="file">` として適当な場所に置いたファイルを実行させることもできる。詳しくは [公式のドキュメント](https://pqrs.org/osx/karabiner/xml.html.ja#vkopenurldef) が参考になる。
メソッドチェーン可能な設計のstructを拡張するには

例えば [container/list](https://golang.org/pkg/container/list/) の拡張を考える。

シンプルにstructの埋め込みで実装してみた場合、

```go
// https://play.golang.org/p/2-eVlADzDu

package main

import (
	"fmt"
	"container/list"
)

type Element struct {
	*list.Element
}

func enhanceElement(e *list.Element) *Element {
	return &Element{e}
}

func (e *Element) Advance(n int) *Element {
	if n == 0 {
		return e
	}
	forward := n > 0
	if !forward {
		n = -n
	}
	r := e
	for i := 0; i < n; i++ {
		if forward {
			r = enhanceElement(r.Next())
		} else {
			r = enhanceElement(r.Prev())
		}
		if r == nil {
			return nil
		}
	}
	return r
}


func main() {
	l := list.New()
	l.PushBack(1)
	l.PushBack(2)
	l.PushBack(3)
	l.PushBack(4)
	l.PushBack(5)
	e := enhanceElement(l.Front()).Advance(3)
	fmt.Println(e.Value)
	e = enhanceElement(l.Back()).Advance(-3)
	fmt.Println(e.Value)
}
```

このような感じにすることで、一応動くものは作れるが、埋め込み元のメソッドを呼び出す場合、

```go
enhanceElement(l.Front()).Next().Advance()
```

とはできず、

```go
enhanceElement(enhanceElement(l.Front()).Next()).Advance()
```

とする必要があり、イケてない。


…わけであるが、良いアイデアが浮かばなかったので諦めた。。。

---

よくよく考えたら、普通のOOP言語でもupcastが必要なシナリオだった。

素直に

```go
func AdvanceElement(e *list.Element, n int) *list.Element {
	// ...
}
```

とするか、あるいは操作機能専用と割りきってラップstructを作るのが、筋が良さそうだろうか。