OmniAICreator/Qiita-1.07M huggingface dataset:
NetCDF / NCL > link > NCL quick reference card > "->" の使い方など

NetCDFファイルを描画するためのNCLについて。
NCAR Command Language (NCL)。
http://www2.mmm.ucar.edu/wrf/OnLineTutorial/Graphics/NCL/NCL_examples.htm

文法的によく分からないNCLの記載に関してquick referenceというのを見つけた。
https://www.ncl.ucar.edu/Document/Reference_Cards/

A4二枚にざっとした文法の紹介がある。

とくに以下のようなSyntax charactersが記載されているのは好感が持てる。

|  |  |
|:-:|:-:|
| = | assignment syntax  |
| ...  | ...  |
| -> | used to im/export variables from/to supported file formats |
Mew で Office365 のメールを送信する

Mew から stunnel 経由で Gmail は送信できるけれど、 Office365 のメールは、送信できずに苦しんだのでメモ。

[一般法人向け Office 365 用の Outlook POP および Outlook IMAP の設定](https://support.office.com/ja-jp/article/%25E4%25B8%2580%25E8%2588%25AC%25E6%25B3%2595%25E4%25BA%25BA%25E5%2590%2591%25E3%2581%2591-Office-365-%25E7%2594%25A8%25E3%2581%25AE-Outlook-POP-%25E3%2581%258A%25E3%2582%2588%25E3%2581%25B3-Outlook-IMAP-%25E3%2581%25AE%25E8%25A8%25AD%25E5%25AE%259A-7fc677eb-2491-4cbc-8153-8e7113525f6c?ui=ja-JP&rs=ja-JP&ad=JP) を見ると、SMTP を使用する場合は、

- ホスト名 - smtp.office365.com
- ポート - 587
- SSL (TLS) が必要 - はい

となっています。 POP3 や IMAP4 の場合は、 **SSL (TLS) が必要 - あり** となっており、 **はい** と **あり** の違いがよくわかりません。。。

とりあえず、 ポート 587 の SSL 経由で送信すれば良いのかなと思い、以下のような設定にしてみました。

```el
(setq mew-smtp-server "smtp.office365.com")
(setq mew-smtp-auth t)
(setq mew-smtp-ssl t)
(setq mew-smtp-ssl-port 587) 
```

が、 `Creating an SSL/TLS connection...` というところから進まず、送信できません。
ホスト名を `outlook-japan.office365.com` にすると良いような記事もありましたが、こちらも送信できませんでした。

[mew-ja の過去ログ](https://groups.google.com/d/msg/mew-ja/T1xIYfcpfac/VysO8cecAgAJ) を調べていると、 [Mew 6.7 マニュアル - 9.5 Transport Layer Security] (http://www.mew.org/ja/info/release/mew_9.html#TLS) を見なさいというログを発見。

> すなわち、SSL のポート番号と保護したいプロトコルのポートが同じであれば TLS、異なれば SSL が利用されます。

ということですので、 `mew-smtp-port` と `mew-smtp-ssl-port` を **同じポート番号に設定することにより、 無事送信できるようになりました**。

```el
(setq mew-smtp-server "smtp.office365.com")
(setq mew-smtp-auth t)
(setq mew-smtp-ssl t)
(setq mew-smtp-port 587)
(setq mew-smtp-ssl-port mew-smtp-port)  ;; use for TLS
```
NetCDF / NCL > addfile() > ファイルを開くようだ

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
```

NetCDFファイルを描画するためのNCLについて。
NCAR Command Language (NCL)。
http://www2.mmm.ucar.edu/wrf/OnLineTutorial/Graphics/NCL/NCL_examples.htm

関連 http://qiita.com/7of9/items/5c949f781a4474d4c726

ファイルを開く処理は以下のようだ。

```
a = addfile("wrfout_d01_2000-01-24_12:00:00.nc","r")
```

大半のプログラマはaddfile()という関数を見て、「追記するのか？」と思うだろう。
そうではなくファイルを開く処理のようだ。

https://www.ncl.ucar.edu/Document/Functions/Built-in/addfile.shtml
> Opens a data file that is (or is to be) written in a supported file format.

read onlyで開くこともできる。
先想怎麼用再來實作

這是今天早上稍微翻一下這本書 - [高效程序員的45個習慣︰敏捷開發修煉之道](http://www.books.com.tw/products/CN10429675)

看到一小段覺得很有共鳴，
因為自己也是這樣走過來的，
就把心得記下來。

*（原標題是第五章的 - 20 先用它在實現它）*

## 專注於設計介面

當先想該怎麼用的時候，就會開始思考該開怎麼樣的介面會比較好用。
這時候就會思考在目前碰到的情境、思維會拉的比實作層級更高，
比較容易釐清什麼才是需要的、什麼是不需要的。

## 使用者的角度思考

當會考慮到情境時，可以把自己放在使用者的角色，
這樣就會更容易設計出 **好用** 、 **易讀**以及 **一致** 的介面。

## 測試

測試同時也可以幫忙思考前面列出來的項目，
同時也可以在動手實作之前釐清使用情境，避免做出冗余的設計。

## 心得

昨天碰到設計資料模型不太一致的 Web API ，
就有和朋友在討論如何訓練一個人或是團隊達到高品質的接口，

這說不定就是解決方法的其中之一。
yarnでグローバルにインストールした実行ファイルのパスを通す

yarnでグローバルな実行ファイルをインストールするには、例えば`yarn global add eslint`とすればよい。
しかし、そのままだとパスが通っていないので通す必要がある。

雑だけど、.zshrc(or .bashrc)で

```shell-session
export PATH=$(yarn global bin):$PATH
```

すればOK！

参考: https://github.com/yarnpkg/website/pull/142
RTX1200と0simで冗長構成を組む話

#とりあえず0simで通信できるように
##今回の機材
ルーター:RTX1200
USBLTEモデム:LG L-02C
sim:so-net 0SIM(標準sim)
##とりあえずGUIで設定
[固定費0円！0 SIMとYAMAHA RTX1200で回線冗長化してみる](https://matsu.teraren.com/blog/2016/02/14/0sim-rtx1200/)
を参考に色々設定

とりあえずLANケーブルを引っこ抜いて設定がうまく行ってるか確認

```logos
2016/11/08 09:46:57: LAN2: link down
2016/11/08 09:47:47: PP[02] IP Commencing: UDP 192.168.0.1:51333 > 111.221.77.169:40014
2016/11/08 09:47:47: PP[02] Calling so-net.jp with usb1
2016/11/08 09:47:47: USB[1] SEND [ATD*99***1#]
2016/11/08 09:47:47: USB[1] RECV [CONNECT]
2016/11/08 09:47:47: USB[1] Connected
2016/11/08 09:47:48: PP[02] PPP/IPCP up  (Local: 100.66.251.104, Remote: None)
2016/11/08 09:48:47: LAN2: link up (1000BASE-T Full Duplex)
2016/11/08 09:50:58: PP[02] Disconnecting, cause [Data transaction timer (SEND) expired]
2016/11/08 09:50:58: USB[1] SEND SIGNAL [DTR=OFF]
2016/11/08 09:50:58: USB[1] RECV [NO CARRIER]
2016/11/08 09:51:02: PP[02] Disconnected, cause [Data transaction timer (SEND) expired]
2016/11/08 09:51:02: [MOBILE] Signal Strength (0-5): 5 [|||] (usb1)
```

問題なさそうですね、回線を戻すと勝手に切れてくれます

##追加の設定
さーて、月1でリミットをリセットしないといけないのと3ヶ月通信がないと勝手に解約されるのでそれ用にluaを書きます

```lua:monthly_kirikae.lua
--------------------------##  設定値  ##--------------------------------
-- メールの設定
mail_tbl = {				-- ★
	smtp_address = "example.com,
    smtp_auth_name = "hoge",
    smtp_auth_password = "hogehoge",
    smtp_auth_protocol = "適切に",
	from = "hoge@example.com",
	to = "hogehoge@example.jp",
}

-- メールの送信に失敗した時に出力する SYSLOG のレベル（info, debug, notice）
log_level = "お好きに"		-- ★

----------------------##  設定値ここまで  ##----------------------------
-- 現在の日時を取得する関数                               --
------------------------------------------------------------
function time_stamp()
	local t

	t = os.date("*t")
	return string.format("%d/%02d/%02d %02d:%02d:%02d", 
		t.year, t.month, t.day, t.hour, t.min, t.sec)
end

------------------------------------------------------------

----------------------## メインルーチン ## ----------------------------

str, rtn = rt.command("lan shutdown lan2") --メイン回線がつながってるI/Fをshutdown
while (loss ~= 0) do --loss率が0％になるまでうち続ける
   rtn, str = rt.command("ping -c 1 8.8.8.8") --とりあえず１回googleのPublicDNSへ
    if (rtn) and (str) then
	    loss = string.match(str, "(%d+)%.%d+%%")      -- パケットロス率（NNN.N%）の整数部を抽出
	    if (loss ~= nil) then
		    loss = tonumber(loss)
        end
    end
end
rtn, str = rt.command("no lan shutdown lan2") --メイン回線がつながってるI/FをUp
 rtn, str = rt.command("clear mobile access limitation") --モバイル回線の使用量をリセット

---------------------------##メール送信部##----------------------------------------
       mail_tbl.subject = string.format("monthly reset (%s)", time_stamp())
		mail_tbl.text = string.format("マンスリーの通信料リセットが成功しました")
       rtn2 = rt.mail(mail_tbl)
		if (not rtn2) then
			rt.syslog(log_level, "failed to send mail. monthly_kirikae.lua")
		end
```

あとは設定に毎月させるように書き込んで終わりです

```
schedule at 1 */1 03:00 * lua monthly_kirikae.lua
```

#終わりに
syslogを監視して切り替わったらメールを送るようなluaを書いたのですが動作しません
ヘルプ！

とりあえず緊急的に繋げられるようになったので良しとします
QNAPのパッケージマネージャ

#ipkgが無い！

久々にQNAPの環境を構築しようとAppCenter行ったらipkgが無くなってました。どうやらもうメンテされずに、現在はopkgというものに変わっているということです。

#opkgのインストール

~~[App Repository](https://apps.qnap.community/)から「opkg」で検索して[Entware-ng](https://apps.qnap.community/11-community/10-entware-ng)をダウンロード。~~
App RepositoryからApp Centerに変わってEntware-ngは登録抹消されたようです。
今は直接[Entware-ngのページ](https://github.com/Entware-ng/Entware-ng/wiki/Install-on-QNAP-NAS)からqpkgを持って来るようになりました。
ダウンロードしたqpkgファイルを手動でインストール。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/109103/9c37e991-5ff8-052c-69f9-6b1bd2fa5c86.png)

これで端末からopkgが使えるようになります。
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/109103/2f3803ca-c5d0-7bf8-79ef-0e9cf3282562.png)
gitもrubyもメンテされているようで安心ですね。

#最後に

今のQNAPは基本的に仮想環境で遊ぶようにできていますが、NASにあるファイルを加工したいときはQNAP謹製環境に入るのが一番手っ取り早いです。この環境のパッケージマネージャーは optware → entware → entware-ng と変わっていて今後も変わる可能性があると思いますが、App Repositoryから検索して手動でインストールという手順を覚えていれば容易に追従できるので記事にしました。

#参考記事
QNAP にパッケージマネージャを入れる　http://qiita.com/qurage/items/7d97ad870db2b7b661f1
QNAP firmware 4.1.4以降にgccを入れる　http://qiita.com/efee/items/5da74eb7e7423e61823c
高速Androidエミュレーター「Genymotion」をEclipseで利用 for Mac

#標準のエミュレーターを高速化するより速い
爆速らしいのでこれは使うしかないですね！
作業効率も大幅アップ！

※EclipseでAndroidアプリの開発環境を整えた上でご覧ください。

##Genymotionを利用する
###Oracle VM VirtualBoxをインストール
Genymotionを利用するにはOracle VM VirtualBoxが必要になります。
1.[VirtualBox](http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp)のサイトへアクセスしてMacに対応しているものをインストール。

2.展開し、ダンボールのアイコン「.pkgファイル」を開きます。あとは手順に沿ってインストール。

![スクリーンショット 2016-11-08 1.27.31.png](https://qiita-image-store.s3.amazonaws.com/0/85550/4d021665-3952-75c7-ece9-2eea1947253a.png)




###Genymotionへの登録
1.[こちら][link-1]よりGenymotionのサイトへアクセスしてください。
[link-1]:https://www.genymotion.com/#!/
2.画面右上の「Sign in」をクリックして「Create account」を選択。

3.必要事項を記入、「I accept terms 〜」にチェックを入れる。
![スクリーンショット 2016-11-08 0.56.15.png](https://qiita-image-store.s3.amazonaws.com/0/85550/77229ca6-a9b3-6224-bfe8-28a20b7773ef.png)

4.登録するとメールが届くので「Click here」をクリックして登録完了です。

###Genymotionのダウンロード
1.登録後、Genymotionのサイトへ行き、「FunZone」をクリック。

2.画面中央の「Download Genymotion 〜」をクリック。

![スクリーンショット 2016-11-08 1.09.55.png](https://qiita-image-store.s3.amazonaws.com/0/85550/ca13c420-1bcf-0f9c-b8d2-dde5910c912f.png)

3.「Download for Mac OSX」をクリックしてダウンロード。

![スクリーンショット 2016-11-08 1.11.10.png](https://qiita-image-store.s3.amazonaws.com/0/85550/f903bbac-d2b5-b745-1cc2-8c23703353ac.png)

4.ダウンロードしたファイルを起動。とりあえずApplicationsフォルダにドラックします。

![スクリーンショット 2016-11-08 1.15.55.png](https://qiita-image-store.s3.amazonaws.com/0/85550/0421ae03-dab4-52e0-1552-efc3f456865f.png)

5.丸いアイコンの方を開きます。

![スクリーンショット 2016-11-08 1.32.36.png](https://qiita-image-store.s3.amazonaws.com/0/85550/59c5c5ad-5047-8f46-a522-4d1205999ddf.png)

こういう画面が出てくると思うので「Yes」→「Accept」でデバイスを作成にかかります。

6.こういう画面が出てきたら先ほど登録した内容を入力します。
![スクリーンショット 2016-11-08 1.36.26.png](https://qiita-image-store.s3.amazonaws.com/0/85550/614dcbf8-aa65-03fe-94f4-95f48edca912.png)

7.次に使用したいデバイスを選択します。ここでは一番上のものを選択します。

![スクリーンショット 2016-11-08 1.38.09.png](https://qiita-image-store.s3.amazonaws.com/0/85550/ca7810d5-2a3b-3e3b-9eeb-1eae5d88cbec.png)

8.「Next」をクリックして次の画面で名前をつけます。ここでは「TestDevice」とします。「Next」をクリックして作成開始です。終わったら「Finish」をクリックして完了です。

![スクリーンショット 2016-11-08 1.41.43.png](https://qiita-image-store.s3.amazonaws.com/0/85550/f7902198-20cd-8938-ffea-29b02f101564.png)

9.早速作成したデバイスを起動してみましょう。「TestDevice」を選択して「Start」で起動できます。
 初めは環境によっては少し時間がかかりますがエミュレータを起動できます。
 ひとまずこれでGenymotionを利用できるようになりました。続いてEclipse側でも動かしてみましょう。


##Eclipseで使用する
他のサイト様ではEclipseにGenymotionのプラグインを入れて使うと書いていますが、僕のPCではプラグインが見つからなかったのでプラグイン無しで利用していきます。

1.Eclipseを起動してAndroid7.0のプロジェクトを作成しましょう。HelloWorldで構いません。

2.Genymotionから先ほどのエミュレータを起動後、Eclipse側からプロジェクトを実行しようとするとこんな画面が出てきます。

![スクリーンショット 2016-11-08 2.02.52.png](https://qiita-image-store.s3.amazonaws.com/0/85550/96ad0006-72b1-f101-ab89-5280a66a0f3a.png)

3.あとはエミュレータを選択してOKを押すだけであら高速。

![スクリーンショット 2016-11-08 2.05.11.png](https://qiita-image-store.s3.amazonaws.com/0/85550/33d704cd-fa3d-639f-d193-d52c6c632d94.png)
スーパークラスとサブクラスについての最低限のまとめ

スーパークラスとサブクラスについて、最低限覚えておきたいまとめました。
コード内の ... は、以下に続くものが省略されているのだとお考え下さい。

## スーパークラスとサブクラス

下記のコードを例に見ていきます。

```java:inheritance.java
class NamedRectangle extends Rectangle {
  ...
}
```

- Rectangle はスーパークラス
- NamedRectangle はサブクラス
- サブクラスは一つのスーパークラスしか持てない
- 全てのクラスは Object クラスのサブクラスである
- final クラスはサブクラスを作れない

## 継承

```java:inheritance.java
class Rectangle {
  int width;
  int height;
  ...
  
  void setSize(int width, int height) {
    ...
  }
}

class NamedRectangle extends Rectangle {
  ...
}
```

- サブクラスはスーパークラスのフィールドとメソッドを受け継ぐ
- NamedRectangle では width と height が宣言されていないが、どちらも保持している
- NamedRectangle でも setSize() を呼び出すことが出来る

### コンストラクタは継承されない
- スーパークラスのコンストラクタが呼び出せてしまうと、サブクラスで新たに宣言されたフィールドが初期化されない可能性が出てしまうため禁止されている
- 一方でスーパークラスで宣言されているフィールドに関しては、サブクラスでもスーパークラスの引数なしコンストラクタが自動的に挿入されるため、初期化式をサブクラスに記述する必要はない
- super() を使えばスーパークラスのコンストラクタを明示的に呼び出せる
- this() を使えばサブクラスのコンストラクタを明示的に呼び出せる

### アクセス制御

- private のフィールドやメソッドはサブクラスに継承されない
- 基本的にフィールドは private にし、ゲッターセッターを書いて情報隠蔽することが推奨される

## オーバーライド

```java:inheritance.java
class Rectangle {
  ...
  void setSize(int width, int height) {
    ...
  }
}

class NamedRectangle extends Rectangle {
  ...
  @Override
  void setSize(int width, int height) {
    ...
  }
}
```
- サブクラスで、スーパークラスと同名及び引数列の数が等しいメソッドを宣言すると、そのメソッドを書き換えて宣言することができる
- @Override の記述は無くてもコンパイルは通るが、可読性の観点から常に記述されることが通例となっている
- final メソッドはオーバーライドできない


## 多態性

```java:inheritance.java
class Rectangle {
  ...
}

class NamedRectangle extends Rectangle {
  ...
}
```

- 下記のように、サブクラスのインスタンスはスーパークラスのインスタンスとみなすことができる


```java:inheritance.java
NamedRectangle nr = new NamedRectangle("Steve Aoki");
Rectangle r = nr;
```

- しかし、r からはサブクラスで宣言されたフィールドを参照することはできない
- メソッドを呼び出す際は、もしそれがサブクラスでオーバーライドされていたら、サブクラスのメソッドが呼び出される
- r に対してキャストを使えばスーパークラスのメソッド呼び出すことができる


## 抽象クラス

```java:inheritance.java
abstract class Player {
  public abstract void play();
  public void loop(int n) {
    for (int i = 0; i < n; i++) {
      play();
    }
  }
}
```

- 抽象クラスとは、メソッドの名前と引数の型が決まっていて、実装がない抽象メソッドを含んだクラスのこと
- 自ら実装はしないが、サブクラスに対し、どのような実装をするかを強制する
- Byte, Integer などのクラスのスーパークラスである Number クラスが代表例
Pythonのクロージャ、イテレータ、ジェネレータでフィボナッチ数を生成する

Pythonのクロージャ、イテレータ、ジェネレータを使ってそれぞれフィボナッチ数を生成するコードを書いてみる。

まずはクロージャ。

```py:Python
def fibonacci_closure():
    values = []
    def fibonacci():
        if not values:
            values.append(0)
            return values[0]
        elif len(values) == 1:
            values.append(1)
            return values[1]
        else:
            next_fib = sum(values)
            values[0], values[1] = values[1], next_fib
            return next_fib
    return fibonacci

next_fibonacci = fibonacci_closure()

for i in range(17):
    fib = next_fibonacci()
    print fib,
```

```:結果
 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
```

次はイテレータ。

```py:Python
class FibonacciIterator(object):
    def __init__(self):
        self.values = []
    def __iter__(self):
        return self
    def next(self):
        if not self.values:
            self.values.append(0)
            return self.values[0]
        elif len(self.values) == 1:
            self.values.append(1)
            return self.values[1]
        else:
            next_fib = sum(self.values)
            self.values[0], self.values[1] = self.values[1], next_fib
            return next_fib

for fib in FibonacciIterator():
    if fib > 1000:
        break
    print fib,
```

```:結果
 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
```

最後にジェネレータ。

```py:Python
def fibonacci_generator():
    values = [0, 1]
    yield 0
    yield 1
    while True:
        next_fib = sum(values)
        values[0], values[1] = values[1], next_fib
        yield next_fib

for fib in fibonacci_generator():
    if fib > 1000:
        break
    print fib,
```

```:結果
 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
```

ジェネレータは非常に簡潔に書けて良い。

ただし、ジェネレータをこのように書くと思わぬハマりどころがあるのでコンテナ化した方が良い。

```py:Python
class FibonacciGenerator(object):
    def __iter__(self):
        values = [0, 1]
        yield 0
        yield 1
        while True:
            next_fib = sum(values)
            values[0], values[1] = values[1], next_fib
            yield next_fib

for fib in FibonacciGenerator():
    if fib > 1000:
        break
    print fib,
```

```:結果
 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
```

これについてはまた別記事で。

- [Pythonのジェネレータ作成時の注意点](http://qiita.com/hoxo_m/items/b4c8073e50d119fcab57)

Enjoy!
sqliteインストールからいってみよう#002


##記述する動機
私、とある専門学校でPGを教えています。ついに１０年超えました。いまだにSEもやってます。
主に現役学生さんたちに読んでもらうために書いているのですが、悩めるPG,SEにも何かのヒントにはなると思い、公開していきたいと思います。

##どこでも使えて便利ですね。
普通に手に入るコンピュータのどこでも動きます。

##オフィシャルサイト
https://sqlite.org/download.html

##brewによるインストール
```brew
brew install sqlite3
```
Homebrewについては各自よろしく。
Winの人はごめんね。別途起こす予定ですが、手元にWinがないんだ

##.mode
参考
http://www.dbonline.jp/sqlite/sqlite_command/index1.html

色々なモードが指定できます。
![スクリーンショット 2016-11-08 6.28.25.png](https://qiita-image-store.s3.amazonaws.com/0/33317/d469b308-cf71-904f-4868-95cc859edbe1.png "スクリーンショット 2016-11-08 6.28.25.png")

![スクリーンショット 2016-11-08 6.28.39.png](https://qiita-image-store.s3.amazonaws.com/0/33317/b6f05fb3-8f2f-a84d-d8b9-5166bdb47775.png "スクリーンショット 2016-11-08 6.28.39.png")

書式は
.mode MODE ?TABLE?
なのだけど、
.mode MODE
でもいいですね。
select * from sqlite_master;
の結果で確認してください。
突然MacでPINコードを要求されるようになった場合の対処法

##はじめに
中古で購入し、２年ほど問題なく使っていたMac Book Air 2011 midが突然おかしくなった。設定していないはずのPINコード（ファームウェア・パスワード）を要求されるようになった。この対応によってまるまる１週間潰すことになった。

私のような方が２度と出ないよう、問題点と対処法を記載する。
##問題の状況

- Mac Book Air 2011midはドス●ラで購入した中古品
- 電源ボタンを押すとpinコードを要求される
- PINコードは自分で設定していない

##原因
Appleサポートや販売業者、Appleストアなどで奔走した結果、以下の原因が判明。

1. 前の所有者が元々iCouldで当該機器を関連付けていた
2. ドス●ラに販売する際にその関連付けを解除しなかった
3. 最近になって前の所有者がiCloud上で「Macを探す」を設定し、その際PINコードを設定した

PINコードは設定した者しかわからない。４桁の数字なので、はじめは適当に打ち込んで試したが、次第に次回打ち込むまでの待ち時間が長くなり、最終的に数時間になった。４桁なのでPINコードは約１万通り。１日１０回試せるとしても、５千回目で解除できたと考えると５００日かかってしまう。話にならない。
##PINコードの解除方法
このような場合におけるPINコードの解除方法は2010以前の場合と2011年以降で違う。2010年以前のヴァージョンだと以下のサイトのように楽に解除できる。
http://weboo-returns.com/blog/macbook-firmware-password/

しかし私のMac Book Airのように2011年以降のヴァージョンだと簡単ではない。以下のサイト
http://www.nextro.com/directworld/cms/411/
のように面倒な手続きが必要。これをまとめると以下。

1. ハードディスクにあるロック情報を記録したファイルを利用し、パスワードを見つけ出す
2. パスワード自動入力するUSB装置で、自動的にパスワードをひたすら試し、時間かけて正しいパスワードを見つける
3. 専用ハードウェアで、フラッシュメモリにあるパススワード情報をクリアーする。
4. アメリカアップルが提供したサービスとして、あるコマンドの組み合わせで、ロック画面から、一組のコードが現れ、そのコードをアップルに提供すると、アップルから、パスワード解除用コートファイルを送られてくる。そのファイルをUSBメモリに入れて、起動すると、パスワードがクリアーされる。

４番目の手続きが味噌で、結局個人ではこの手続きができない。よって業者に頼むしかない。日本国内においては千葉に以下の業者があり、対応してくれる。
https://t-nagu.jp/pc/pcrepair/shop/25591/

しかし、パソコンは初期化されてデータが取り出せない。取り出すには別の手法が必要である。
##PINコードのかかったMacからデータを取り出す
PINコードのかかったMacからデータを取り出すにはこういった機器
http://store.shopping.yahoo.co.jp/pc-parts-239/239hkn-068.html
![pc-parts-239_239hkn-068.jpeg](https://qiita-image-store.s3.amazonaws.com/0/116706/eb096a86-0053-8dbc-458a-9135ed4e6e96.jpeg)
や同種のMacが必要である。面倒なので以下の業者に頼むことにした。
http://www.smaphodock24.jp/
しかしSSDのデータをまるごとコピーするだけなので、それを新しいMacに入れるにはコツが必要である。
##メモアプリのデータを取り出す
Documentsなどはそのままコピーして問題ないが、メモ・アプリに重要なデータを載せてる場合、取り出しが困難である。そこで以下のようにした。まずデータが保存されているHDDなどにアクセスし、以下のディレクトリに移動する。

```
cd Target HDD/Users/UserName/Library/Containers/com.apple.Notes/Data/Library/Notes
ls
NotesV6.storedata NotesV6.storedata-shm NotesV6.storedata-wal
```

目的のファイルはNotesV6.storedataというデータベースである。ここで元々Macにインストールされているsqlite3を使う。

```
sqlite3 NotesV6.storedata
sqlite> .tables
ZACCOUNT ZFOLDER ZNOTEBODY Z_METADATA Z_PRIMARYKEY ZATTACHMENT ZNOTE ZOFFLINEACTION Z_MODELCACHE
```

メモの中身はZNOTEBODYに格納されている。

```
sqlite> select * from Z_NOTEBODY;
```

とすれば、HTML形式のデータが表示される。あとは対象の部分をhtml形式で保存などして、閲覧すればいい。
scikit-learnでDBSCAN(クラスタリング)

クラスタリングアルゴリズムの一つであるDBSCANの概要や簡単なパラメータチューニングについて，
日本語記事でまとまっているものがないようでしたのでメモしました。
DBSCANの概要は，[wikipedia](https://en.wikipedia.org/wiki/DBSCAN)の(雑な)和訳ですのでご容赦ください。
## DBSCANとは
* `Density-based spatial clustering of applications with noise`の略
* クラスタリングアルゴリズムの一つ

## アルゴリズムの概要
* 1.点を３つに分類する
	* Core点 : 半径ε以内に少なくともminPts個の隣接点を持つ点
	* Reachable点(border点):半径ε以内にminPts個ほどは隣接点がないが，半径ε以内にCore pointsを持つ点
	* Outlier : 半径ε以内に隣接点がない点
* 2.Core点の集まりからクラスタを作成し，Reachable点を各クラスタに割り当てる.
![Screen Shot 2016-11-08 at 04.53.46.png](https://qiita-image-store.s3.amazonaws.com/0/99549/d8a12f10-1abb-7424-ddd8-aa840e5efdc0.png)

[図[wikipedia](https://en.wikipedia.org/wiki/DBSCAN)より]

## 長所
* k-meansと違って，最初にクラスタ数を決めなくてよい
* とがったクラスタでも分類できる。クラスタが球状であることを前提としない
* outlierに対してrobustである。
* パラメータがεとminPtsという二つでよい。また，パラメータの範囲も判断しやすい。

## 短所
* border点の概念が微妙で，データによりどのクラスタに属するか変わる可能性がある。
* 距離の計算方法により，精度が変わる。
* データが密集していると適切にεとminPtsを決めるのが難しい。ほとんどの点を一つのクラスタに分類してしまう場合も
* データがわからないとεを決めるのが難しい。
* (DBSCANに限った問題ではないが)次元が大きくなると次元の呪いの影響を受ける


## 他のアルゴリズムとの違い

[scikit-learnのデモページ](http://scikit-learn.org/stable/auto_examples/cluster/plot_cluster_comparison.html)にある各手法の比較した図なのですが，右から2番目がDBSCAN。densityに基づいてクラスタリングされていることが直感的にわかる。
![sphx_glr_plot_cluster_comparison_001.png](http://scikit-learn.org/stable/_images/sphx_glr_plot_cluster_comparison_001.png)



## εとminPtsのチューニング
二次元だと可視化させてうまく分類できているか判別できるのだが，3次元以上になると可視化して判断するのは難しい。
以下のようにしてoutlierやクラスタ数をデバッグして調節した。
(scikit-learnを利用)

```Python
from sklearn.cluster import DBSCAN

for eps in range(0.1,3,0.1):
    for minPts in range(1,20):
        dbscan = DBSCAN(eps=eps,min_samples=minPts).fit(X)
        y_dbscan = dbscan.labels_
        print("eps:",eps,",minPts:", minPts)
        # outlier数
        print(len(np.where(y_dbscan ==-1)[0]))
        # クラスタ数
        print(np.max(y_dbscan)))
        # クラスタ1に含まれる点の数
        print(len(np.where(y_dbscan ==0)[0]))
        # クラスタ2に含まれる点の数
        print(len(np.where(y_dbscan ==1)[0]))



```

## DBSCAN関連のリンク
* wikipedia
	* https://en.wikipedia.org/wiki/DBSCAN
* 公式ドキュメント
	* http://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html
* 公式デモページ
	* http://scikit-learn.org/stable/auto_examples/cluster/plot_dbscan.html
* Qiita
	* http://qiita.com/ynakayama/items/46d5f2e49f57c7de98a4
	* http://qiita.com/yamaguchiyuto/items/82c57c5d44833f5a33c7

## 追記
[日本語版Wikipedia](https://ja.wikipedia.org/wiki/DBSCAN)が更新され、記述が追加されていました。わかりやすいです。
機械学習論文読みメモ_13

[Hawkes Processes with Stochastic Excitations](http://jmlr.org/proceedings/papers/v48/leea16.pdf), ICML2016
ある事象が発生した時に、それが発端となって他の事象を次々誘発していく現象は色々な場所で観測される。
このような過程はHawkes process、あるいはself-excitation processと呼ばれる。
この過程のモデル化には２つの方向があり、１つは個々の実例を模倣できるようなモデルを研究するもの、もう１つは簡潔で学習可能なモデルを研究するもの、がある。
本論では後者を考え、特に事象の誘発のしやすさに関するパラメータを確率微分方程式（SDE)を用いて調整可能にしたモデルを提案する。
従来誘発レベルは一定値が用いられたのに対して、提案モデルではそれを確率変数として扱う事で、各事象間の誘発に関する共分散構造を取り入れる事が可能になる。

[Gauss quadrature for matrix inverse forms with applications](http://jmlr.org/proceedings/papers/v48/lig16.pdf), ICML2016
正定値行列Aとベクトルu,vで表せられるbilinear inverse from(BIF)であるu^{T}A^{-1}vの計算を要求するような機械学習アルゴリズムの高速化を実現する。
Aが大きいとき、その逆行列をまとめて計算するよりも、u^{T}A^{-1}vを逐次的に計算する方が効率が良い。
しかしその際には近似精度が重要になってくる。
その近似手法の１つとしてgauss quadratureがある。
gauss quadratureとは、積分近似の手法から生まれ、ある多項式fの積分計算に対して、積分ではなく決められた点の値の重み付き和で近似する手法で一定の次数までの多項式ならば正確に置き換える事が出来る。
このgauss type quadratureはまたBIFにも適用可能な事が知られている。
しかし、逐次計算していくにつれ、どのように収束していくかについては不明であった。
そこで本論ではgauss quadratureに基づいた新たな手法を構成し、これは大きくスパースな行列に対してもスケール可能で、BIFのupper, lower boundも計算可能、またboundがまた線形スケールで逐次的にtightになっていきconvergeする事を示した。
初心者が始めるiOSアプリ入門ーhello wolrd表示

#1.プロジェクトの作成

**下記画面から「Create a new Xcode project」を選択。**
![スクリーンショット 2016-11-08 1.10.47.png](https://qiita-image-store.s3.amazonaws.com/0/15564/9b18ceda-7b3c-d954-a83a-4f13d66f187a.png "スクリーンショット 2016-11-08 1.10.47.png")

**Xcodeが立ち上がり、Project作成ダイアログが表示されます。「Single View Application」を選択して「Next」をクリック。**
![スクリーンショット 2016-11-08 1.12.41.png](https://qiita-image-store.s3.amazonaws.com/0/15564/050549f7-e7ce-a4f1-4fd6-0d9ceba52039.png "スクリーンショット 2016-11-08 1.12.41.png")

**作成するProjectの情報を入力します。**
![スクリーンショット 2016-11-08 1.54.47.png](https://qiita-image-store.s3.amazonaws.com/0/15564/ea08132e-14ae-6843-cbc4-383c3e54bcaa.png "スクリーンショット 2016-11-08 1.54.47.png")

- Product Name
	 アプリの名前を入力
- Organization Name
	 組織名を入力。空欄でもOK
- Organization Identifier
	 その組織が持っているドメインを入力。
	 「sample.net」を持っていた場合は「net.sample」
- Language
	 利用言語を選択
- Devices
	 利用デバイスを選択
	 
**プロジェクトを保存する場所を選択します**
![スクリーンショット 2016-11-08 2.04.52.png](https://qiita-image-store.s3.amazonaws.com/0/15564/29bae213-0a58-ccca-4823-fc1f3c800d49.png "スクリーンショット 2016-11-08 2.04.52.png")

一旦、ここまででプロジェクトが作成されます。

#2.Hello wolrd 出力
ナビゲータエリアにある「ViewController.swift」を選択します。
中央のエディタエリアにある「viewDidLoad()」中に下記コードを追加します。
その後、左上にある「スタートボタン」をクリックします。
>print("Hello world.")

![スクリーンショット 2016-11-08 1.27.37.png](https://qiita-image-store.s3.amazonaws.com/0/15564/641f039d-130c-2ea5-0623-5ea0f13b6bdc.png "スクリーンショット 2016-11-08 1.27.37.png")

シミュレーターが立ち上がり、プログラムが実行されます。
エディタエリアの下にあるデバッグ(コンソール)エリアに「Hello world.」と表示されます。
<img width="1503" alt="スクリーンショット 2016-11-08 1.30.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/15564/eb661641-54f6-e934-f8e4-9071b4e62f53.png">


#3.シミュレーターに Hello world を表示
「Main.storyboad」を選択するとエディタエリアに「View Controller」が表示されます。
<img width="1503" alt="スクリーンショット 2016-11-08 1.34.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/15564/2fd89c68-22af-15da-47d1-a6d8243651b5.png">

次に、右側のユーティリティエリアから「◎」マークを選択し、その下から「Label」を探しView Controllerの中にドラッグ＆ドロップします。
<img width="304" alt="スクリーンショット 2016-11-08 1.34.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/15564/e3b5af1f-c2cb-d7b0-c02a-278e956df88e.png">

ラベルをダブルクリックして「Label」を「Hello world」に書き換え、左上にある「スタートボタン」をクリックします。
<img width="411" alt="スクリーンショット 2016-11-08 1.36.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/15564/4b042be2-217e-cb38-1f75-4b14137618c8.png">


シミュレーター上に「Hello World」と表示されます。
![スクリーンショット 2016-11-08 1.38.33.png](https://qiita-image-store.s3.amazonaws.com/0/15564/cf90614d-3ef0-486f-e88d-7ddd66af5611.png)


以上。Hello wolrd。
CIImageをData型に変換したときにハマった時の対処法(Swift3.0)

iOSでCoreImageを用いてQRコードを生成し, 生成したQRコードをOpenURLで別アプリに送ろうとした際にData型に変換しようとした時にハマったのでメモ


# 状況

```swift:before.swift
import UIKit
import CoreImage

// String から　QRコードを作成(CIImage)
let str = "Hello, playground"
guard let strData = str.data(using: String.Encoding.utf8) else { fatalError() }
let sizeTransform = CGAffineTransform(scaleX: 10, y: 10)
let params:[String:Any] = ["inputMessage":strData,"inputCorrectionLevel":"M"]
let ciImage = CIFilter(name: "CIQRCodeGenerator", withInputParameters: params)?.outputImage?.applying(sizeTransform)
guard let ciImage = ciImage else { fatalError() }


// CIImage -> UIImage -> Data
let uiImage = UIImage(ciImage: ciImage)
let imageData = UIImagePNGRepresentation(uiImage) // nil

```


# 解決方法
CIImageを一度CGImageに変換し，UIImageに変換してData型にすれば良いようです


```swift:after.swift
import UIKit
import CoreImage

// String から　QRコードを作成(CIImage)
let str = "Hello, playground"
guard let strData = str.data(using: String.Encoding.utf8) else { fatalError() }
let sizeTransform = CGAffineTransform(scaleX: 10, y: 10)
let params:[String:Any] = ["inputMessage":strData,"inputCorrectionLevel":"M"]
let ciImage = CIFilter(name: "CIQRCodeGenerator", withInputParameters: params)?.outputImage?.applying(sizeTransform)
guard let ciImage = ciImage else { fatalError() }


// CIImage -> CGImage -> UIImage -> Data　
let context = CIContext()
let cgImage = context.createCGImage(ciImage, from: ciImage.extent)
let uiImage = UIImage(cgImage: cgImage!)
let imageData = UIImagePNGRepresentation(uiImage) // 6120 bytes

```
byobu のロゴに記号を使わない

```bash:.byoburc
export BYOBU_CHARMAP=x
```

`/usr/local/lib/byobu/include/toggle-utf8` を実行するといいというのもあるけどこれは全ての utf-8 文字をトグルするのでなんかやばくなる。これ実行すると上の環境変数が定義されてるっぽいのが見える。
java.utilまとめ2（Properties、LinkedList）

## Propertiesクラス
このクラスはプロパティファイルと呼ばれる、拡張子が.propertiesのファイルからキーと値（HashTable形式）を取り出して扱うためのクラス。

まず、プロパティファイルは

```properties:sample.properties
key1 = value1
key2 = value2
```

で、キー = 値を設定する。

そして、これを読み込んで新たにセットするには

```java:PropertiesSample.java
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class PropertiesSample {

	public static void main(String[] args) throws IOException{
		Properties properties = new Properties();
		
		properties.load(new FileInputStream("./Property/sample.properties"));
		
		System.out.println(properties.getProperty("key1"));
		System.out.println(properties.getProperty("key2"));
		
		System.out.println(properties.getProperty("element"));
		
		properties.setProperty("element", "element1");
		
		System.out.println(properties.getProperty("element"));
	}
}
```

実行結果は

```
value1
value2
null
element1
```

のように、propertiesファイルを読み込んでgetPropertyでそのキーの値を取得して、新たにsetPropertyでキーと値を加えることもできる。

### getPropertyメソッド
キーで検索して、そのキーがあればそのキーの値を取得する。

### setPropertyメソッド
第1引数にキー、第2引数に値を入れてプロパティにセットできる。

## LinkedListクラス
ArrayListとよく比べられることがあるが、それは用途によっては早くなったりならなかったり...。

ちょっとした例で、LinkedListに入れた要素をMapに移してみる。

```java:LinkedListSample.java
import java.util.LinkedList;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class LinkedListSample{

	public static void main(String[] args){
		LinkedList<String> linkedlist = new LinkedList<String>();
		Map<String, String[]> map = new ConcurrentHashMap<String, String[]>();
		String[] source;
		
		for(int i = 0; i < 5; i++){
			linkedlist.add("element" + i);
		}
		
		System.out.println("LinkedList: " + linkedlist);
		
		source = linkedlist.toArray(new String[linkedlist.size()]);
		
		if(source != null){
			map.put("key", source);
		}
		
		System.out.println("Map<String, String[]>: " + map);
	}

}
```

実行結果は、

```
LinkedList: [element0, element1, element2, element3, element4]
Map<String, String[]>: {key=[Ljava.lang.String;@2a139a55}
```

Mapの値にはString型の配列を入れてみた。

### addメソッド
リストを指定する方法と指定しない方法がある。指定する場合は第1引数に数値をいれて、その数値に1加算されたものがインデックスとなり、第2引数で指定した要素が指定されたインデックスに追加される。指定しない場合は尻尾の方に要素が追加される。

### sizeメソッド
要素数を返すメソッド。

### toArrayメソッド
リストのすべての要素を配列として返すメソッド。配列の型を指定する方法もある。

### ArrayListクラスとLinkedListクラスとの相違点
LinkedListは隣の要素でつながりがあり要素を探す時は順番に頭から尻尾まで探っていく。ArrayListは要素を配列で管理しており、インデックスがわかれば一発で検索が可能。要は、真ん中のあたりから順番に検索すると結果が早い。

こういった相違点から、ArrayListは変更が少ない処理に有効で、LinkedListは変更が頻繁に行われる処理に有効となる。

## おわり
Propertiesクラスで取り出せるファイルはPropertiesファイルだけでなく、XML形式でも取り出すことができる（loadFromXMLとかstoreToXMLとか）。
リリース版Firefox48以降でjpm runが実行できなくなるため、開発者向けFirefoxが必要


## 問題
Firefox47だと問題なく実行できていた`jpm run`が急に動かなくなった。

```
$ jpm run
JPM [info] Starting jpm run on firelink
Creating XPI
JPM [info] XPI created at /var/folders/.../addonName-2.3.3.xpi (216ms)
Created XPI at /var/folders/.../addonName-2.3.3.xpi
JPM [info] Creating a new profile
1478532021486	addons.xpi	WARN	Add-on addonName is not correctly signed.
1478532021487	addons.xpi	WARN	Add-on addonName is not correctly signed.
```

同じような問題が起きている人はそこそこいるようだ。

- [cant execute the addon on firefox v.48.0.2 - Stack Overflow](http://stackoverflow.com/questions/39472093/cant-execute-the-addon-on-firefox-v-48-0-2)
- [jpm run does NOT work with Firefox 48, or later - Stack Overflow](http://stackoverflow.com/questions/38887048/jpm-run-does-not-work-with-firefox-48-or-later/38903632)

## 解決策
ざっと読んだ感じ、Firefox48で`xpinstall.signatures.required`が強制的にtrueになったため、 **リリースビルドのFirefox48以降ではjpm runができない**。代わりに[Firefox Developer Edition](https://www.mozilla.org/en-US/firefox/developer/)や[Firefox Nightly](https://nightly.mozilla.org/)を使うのがおすすめのようだ。

Nightlyビルドをインストールすれば以下のコマンドで実行できるようになるらしい(未検証)

```
$ jpm run -b Nightly
```

あとでもう少し調べてみる予定。
ruby fork background

http://stackoverflow.com/questions/2504445/spawn-a-background-process-in-ruby

fork combine daemon

```rb
a = 12

fork do
	Process.daemon(true,true)
	sleep 10
	puts Process.ppid
	puts a
	puts "lalalala"
end

fork do
	Process.daemon(true,true)
	sleep 5
	puts "gagagaga"
end

puts Process.pid
puts "quit"
```


```rb
require 'spawnling'

a = 12

Spawnling.new do
	# Process.daemon(true,true)
	sleep 10
	puts Process.ppid
	puts a
	puts "lalalala"
end

Spawnling.new do
	# Process.daemon(true,true)
	sleep 5
	puts "gagagaga"
end

puts Process.pid
puts "quit"
```

```rb
a = 12

job1 = fork do 
    # Process.daemon(true,true)
    sleep 10
    puts Process.ppid
    puts a
    puts "lalalala"
end

job2 = fork do
    # Process.daemon(true,true)
    sleep 5
    puts "gagagaga"
end

Process.detach(job1)
Process.detach(job2)
puts Process.pid
puts "quit"
```
【Ruby】getsの使い方

<b>【環境】</b>
ruby 2.3.0(プログラミング学習サイトpaizaの環境）

<b>【やりたいこと】</b>
キーボードで入力した値(数値)からポイント(1%)を計算する。
1000円以上だと追加で10ポイント付与する。


<b>【失敗例】</b>

```ruby
money = gets
point = money / 100
if money >= 1000
    puts point + 10
else
    puts point
end

800
=>Main.rb:3:in `<main>': undefined method `/' for "800":String (NoMethodError)
```

キーボードで800を入力するとエラーが返ってきました。

<b>【原因】
gets</b>メソッドはキーボードで入力した値を取得しますが、<b>文字列</b>で取得します。
そのため計算ができずエラーが出力されてしまいました。
という訳で数値で取得しましょう。

<b>【成功例】</b>

```ruby
money = gets.to_i
point = money / 100
if money >= 1000
    puts point + 10
else
    puts point
end

800
=>8

2000
=>30
```

【解説】
><b>gets</b>メソッドで得られる入力は文字列（改行付き)

><b>.chomp</b>  改行を外す
例）name = gets.chomp

><b>.to_i</b>  数値オブジェクトに変換してくれる
例） age = gets.to_i
getsで文字列が返り　→　to_i　で文字列を整数に変換した値が返る

><b>参考</b>
>[IT女子のHappy × IT日記　-getsとgets.to_iの違い-](http://itgirl.hatenablog.com/entry/2016/05/25/212505)
ショートカットキーとそのイメージ

いろんなサイトで紹介されているものとそうでないものがある。
(単純に自分の打ち間違えで発見したものがほとんど)

自分的に一般的すぎるCtrl+xとかは省略
あとよく使うのだけ厳選

※TeratermはAlt+XXXがショートカットだったりするので
　ソフトによっては違う場合ばあります。
　いきなり本番環境で試さないでくださいね(笑)
　余談ですがTeratermのTeraがどこから来たのか分かった時個人的に面白かったです。
  (結構有名なソフトなのにそこからとったんだ的な)

# 大体のソフトで使えるショートカットキー

#### 新しいファイルを開く(エクセル等で新しいシートを開く)
Ctrl + n

#### 検索を呼び出す
Ctrl + f

#### 置換を呼び出す
Ctrl + h もしくは Ctrl + r

#### 上書き保存
Ctrl + s

#### アクティブウィンドウを閉じる(便利だけど危険。サーバシャットダウンできる)
Alt + F4

#タブ機能を持つソフトで使えるショートカット
###IE、Chrome、Firefoxで使えたのでメモ

####新しいタブを開く
Ctrl + t

####検索バーにカーソルを移動(あとは文字を打ってEnter押すだけ)
Ctrl + e

####アクティブタブを閉じる
Ctrl + w

#### アクティブタブを再読み込み(厳密にはF5と違う)
Ctrl + r

#### アクティブタブで開いたページをブックマーク
Ctrl + d

#### ダウンロードの表示
Ctrl + j

### デバッガー
F12


# 特殊キー(ctrlとかshift)のイメージ
テキストエディタやword、excel等では特殊キーは自分的に下記のイメージ。
大体このイメージを持っておくと「こんなことやりたい」と思った時に役に立つ。
組み合わせればイメージでカーソル移動できる。
(格ゲーみたいなイメージで。自分は格ゲー苦手・・・)

CtrlキーやShiftキーだけでは何も実行されないのでEnterキーを押さない限りは安全かと思います。
(自分が体験したことないだけかな・・・)

#### Ctrlキー
・ソフトごとに割り当てられているショートカットキーに使われる。
　殆どの方はこの用途でしか使いませんね。

・今のカーソル位置を移動させるときに使う。
　例) Ctrl + →キー・・・今のカーソル位置から次の字句区切りにカーソルを移動する
　　　Ctrl + Endキー・・今のカーソル位置の行末にカーソルを移動する
　　　Ctrl + Homeキー・ 今のカーソル位置の行頭にカーソルを移動する

　　　エクセルだとCtrl + 矢印キーは本当によく働いてくれます(笑)
　　　次の文字が入ったセルに移動してくれるので
　　　Shiftを組み合わせるとさらに便利

#### Shiftキー
・今のカーソル位置を起点に何かする
　例) Shift + Endキー・・・・今のカーソル位置から行末までを選択する
　　  Shift + Homeキー・・・ 今のカーソル位置から行頭までを選択する

　格ゲーっぽくすると
　　　Shift + Endキーでカーソル位置から行末まで選択、
　　　　　　　　その状態で↓キーを押す・・・・カーソル位置から1行下の行末までを選択

　　　説明：「Shiftキー+ Endキーの効果を下の行まで維持する」的な感じ。
　　　　　　 フワフワしていてすいません。

#### CtrlキーとShiftキーを組み合わせると・・・
・今のカーソル位置を起点に改行を無視した選択ができる
　例) Ctrl + Shift + Homeキー・・今のカーソル位置から「文頭まで」を選択
　　　Ctrl + Shift + Endキー・・・今のカーソル位置から「文末(EOF)まで」を選択
　　　Ctrl + Shift + →　・・・・・今のカーソル位置から「行末まで」を選択
　
　　　エクセルだと扱いが違います。試してみてください。
　　　値入りセルが連続している場合で使った場合と
　　　そうでない場合とで比べていただけるとわかると思います。
Vue.jsで10万件のリストを表示する

#はじめに
Vue.jsは軽量ですが、数万件のリストを並べるとそりゃ普通につらい。
だから目に見えるとこ以外はdom描いてもらうのやめるってコードです。

#デモ
[デモ(jsfiddle)](https://jsfiddle.net/tf0aLybk/)

#コード
```html:html
<div id="app">
 <div style="overflow:auto;height:170px;"
      @scroll="getScrollParam">
  <ul :style="listStyle">
    <li style="height:17px" 
        v-for="num in displayList">{{num}}</li>
  </ul>
 </div>
</div>
```
```javascript:javascript
new Vue({
    el: '#app',
    data: function(){
      return {
      	list:list,
        scroll:0,//スクロール量
        scrollMax: (list.length - displayRowNum) * listItemHeight //最大のスクロール量
      }
    },
    computed:{
      displayList:function(){
        //ユーザーの目に映るところだけリストを描画する
      	var startIndex = parseInt(this.scroll/listItemHeight,10);
        return this.list.slice(startIndex,startIndex+displayRowNum);
      },
      listStyle:function(){
        //domを並べる代わりにpaddingでダミーの高さを出す
      	return {
         'padding-top':this.scroll + 'px',
         'padding-bottom':(this.scrollMax - this.scroll) + 'px',
         'margin':0
        }
      }
    },
    methods:{
    	getScrollParam:function(e){
      	  this.scroll = e.target.scrollTop;
        }
    }
})
```

#おわりに
わかりやすさのために見えてる長さちょうどのリストを表示しましたが、
2,3倍の長さにしたほうがスクロール時にちらつかなくて良いです。
あと実際使う時はクロスブラウザのためにスクロール量や高さの取得に調整が必要です。
namespaceとclassをGUIで表示するソフトを作った。 

namespaceとclassをGUIで表示するソフトを作った。
なかなか満足。
![2016_1107_2346_16.jpg](https://qiita-image-store.s3.amazonaws.com/0/147863/8f01e514-41eb-77f4-162a-cf2a5116df17.jpeg)
[日々]HHKBを分解したらメモ書きが出てきた

HHKB Liteの隙間にゴミが溜まったり、スペースキーが押しにくくなったので、本格的に掃除するため分解したついでに部品の裏側を見たら、メモ書きが出てきました。

![DSC_0387.jpg](https://qiita-image-store.s3.amazonaws.com/0/34605/f0b33294-89a2-4a37-fccc-bd1465f876e8.jpeg)
左は何かのサイン？
右は「Jody」って書いてあるのかな？

![DSC_0392.jpg](https://qiita-image-store.s3.amazonaws.com/0/34605/d997a522-b7c8-bb3a-15a8-b233d8d4fa98.jpeg)
「0-24-2」って読める。

上の刻印を見ると、製造年月日は2000/01のようだ。
15年以上経ってもまだ現役で使えることが、とてもありがたい。

HHKB Liteを再販してくれないかなぁ。
カーソルキーなんて要らないんだけどな。
matplotlibで色をグラデーション的に選択

- いちいち変えるの面倒だけどパラメータが多い
- グラデーション的に変えたい

```python
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np
x =np.linspace(0,2*np.pi,100)
for i in range(30):   
    plt.plot(x,i*np.sin(x),color=cm.hsv(i/30.0))
plt.xlim(0,2*np.pi)
plt.savefig("cm.png")
plt.show()
```
### 色の参考にcmリスト
- さっきのcm.hogeの所を色々変えてみたものを図示
- [0,1]のグラデーションになっていて，一番平らなのが0,盛り上がっているのが1

可視化の参考にどうぞ

#### 王道カラフル系

- hsv

![hsv.png](https://qiita-image-store.s3.amazonaws.com/0/146563/8679bc8a-b3ef-8e90-ce97-0c32c056869d.png "hsv.png")


- jet

![jet.png](https://qiita-image-store.s3.amazonaws.com/0/146563/32df25a1-b7bb-edbd-e434-93afb0114033.png "jet.png")


- spectral

![spectral.png](https://qiita-image-store.s3.amazonaws.com/0/146563/de7c4c34-c92a-02c1-df83-c85fc0f3ca45.png "spectral.png")


#### 単色濃淡(っぽい)
- bone

![bone.png](https://qiita-image-store.s3.amazonaws.com/0/146563/14a4d7b3-7974-0e80-ce78-0d97875a8ddd.png "bone.png")


- gray

![gray.png](https://qiita-image-store.s3.amazonaws.com/0/146563/17ff08c0-394a-e88b-ae74-8394977d88de.png "gray.png")


- pink

![pink.png](https://qiita-image-store.s3.amazonaws.com/0/146563/6c19e90b-8c72-5bb9-5d8e-4c82af7e443c.png "pink.png")


- copper

![copper.png](https://qiita-image-store.s3.amazonaws.com/0/146563/b35291a8-459b-432c-58f2-4a60275f6a14.png "copper.png")

#### 複数色グラデーション系
- cool

![cool.png](https://qiita-image-store.s3.amazonaws.com/0/146563/04b6f138-2d2a-4657-b9b7-17b908638bd7.png "cool.png")


- hot

![hot.png](https://qiita-image-store.s3.amazonaws.com/0/146563/7229f5d4-c8c0-df19-cbb2-dc842d52a82f.png "hot.png")




#### 季節の色たち

- spring

![spring.png](https://qiita-image-store.s3.amazonaws.com/0/146563/4651d7ae-7e5e-608f-ae48-03d79974cb84.png "spring.png")

- summer

![summer.png](https://qiita-image-store.s3.amazonaws.com/0/146563/8dd9c53d-2240-55c7-9ed2-d0ce309f70eb.png "summer.png")


- autumn

![autumn.png](https://qiita-image-store.s3.amazonaws.com/0/146563/4317fd27-5b32-ab9b-4ef3-2e608e59a877.png "autumn.png")

- winter

![winter.png](https://qiita-image-store.s3.amazonaws.com/0/146563/bea406dc-7c09-1424-94ea-c9654e21f9ad.png "winter.png")


#### グラデーションにならない系
- flag

![flag.png](https://qiita-image-store.s3.amazonaws.com/0/146563/bb05f884-1880-234b-7785-dd21418e73f9.png "flag.png")

- prism

![prism.png](https://qiita-image-store.s3.amazonaws.com/0/146563/d5d38186-e983-7b3e-ff77-fe95cf45caf5.png "prism.png")

- その他 : http://matplotlib.org/examples/color/colormaps_reference.html
aws networkの設定などをjqで出力

ネットワーク関連の設定をバーーって出したいとき

```

aws ec2 describe-instances | jq '.Reservations[].Instances[].InstanceId'


```


ホスト名とパブリックIPの一覧を出力

```jq
 aws ec2 describe-instances | jq '.Reservations[]|.Instances[]|[.Tags[].Value ,.PublicIpAddress] |  @csv'
```

ホスト名とプライベートIPの一覧を出力

```
aws ec2 describe-instances | jq '.Reservations[]|.Instances[]|[.Tags[].Value ,.NetworkInterfaces[].PrivateIpAddresses[].PrivateIpAddress]|@csv'

```

一緒に出力

```
aws ec2 describe-instances | jq '.Reservations[]|.Instances[]|[.Tags[].Value ,.NetworkInterfaces[].PrivateIpAddresses[].PrivateIpAddress,.PublicIpAddress]|@csv'

```

セキュリティグループ出力

```
 aws ec2 describe-instances | jq '.Reservations[]|.Instances[]|[.Tags[].Value ,.NetworkInterfaces[].Groups[].GroupName]| @csv'

```


Inbound

```
 aws ec2 describe-security-groups  | jq -r '.SecurityGroups[]|{key1:.Tags[0]["Value"], key2:.IpPermissions[]}|[.key1,.key2.FromPort,.key2.ToPort,.key2.IpRanges[].CidrIp,.key2.UserIdGroupPairs[].GroupId] |@csv' > Inbound.csv


```

Outbound

```

aws ec2 describe-security-groups  | jq -r '.SecurityGroups[]|{key1:.Tags[0]["Value"], key2:.IpPermissionsEgress[]}|[.key1,.key2.FromPort,.key2.ToPort,.key2.IpRanges[].CidrIp,.key2.UserIdGroupPairs[].GroupId] |@csv' > Outbound.csv

```

SecurityGroup Id list

```
aws ec2 describe-security-groups  | jq -r '.SecurityGroups[]|[.GroupName,.GroupId]|@csv'

```
Volume情報

```
aws ec2 describe-volumes | jq  -r '.Volumes[]|[.Attachments[].InstanceId,.VolumeType , .Iops]|@csv' > vlumeinfo.csv
```

http://qiita.com/toshiro3/items/37821bdcc50c8b6d06dc

```
aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | [(.Tags[] | select(.Key=="Name").Value),.InstanceId, .InstanceType, .PrivateIpAddress] | @csv'
````
sqliteインストールからいってみよう


##記述する動機
私、とある専門学校でPGを教えています。ついに１０年超えました。いまだにSEもやってます。
主に現役学生さんたちに読んでもらうために書いているのですが、悩めるPG,SEにも何かのヒントにはなると思い、公開していきたいと思います。

##どこでも使えて便利ですね。
普通に手に入るコンピュータのどこでも動きます。

##オフィシャルサイト
https://sqlite.org/download.html

##brewによるインストール
```brew
brew install sqlite3
```
Homebrewについては各自よろしく。

![スクリーンショット 2016-11-07 23.30.40.png](https://qiita-image-store.s3.amazonaws.com/0/33317/c176fec7-feba-0a54-e944-adbd141c4d1f.png "スクリーンショット 2016-11-07 23.30.40.png")
ansibleでモジュール実行(簡易疎通確認)

今日のお題：サーバ側とクライアント側に必要最低限の設定が出来たためモジュールを実行する

#### 前提条件

- サーバ側にansibleのインストールを行っていること。 ※[ここでやりました。](http://qiita.com/azuki19770922/items/b10672d95ba4dac82b97)
- クライアント側の設定とサーバ間のSSH設定を行う ※[ここでやりました。](http://qiita.com/azuki19770922/items/c00b9cc04c85e2834e7e)

#### 手順

```txt:実行コマンド
ansible [クライアント側IP] -m ping
```


```txt:pingモジュール確認結果
openstack@Ubuntu16041Server:~/.ssh$ ansible 192.168.56.101 -m ping
192.168.56.101 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
```

明日のお題：playbookを作成して何か無害なパッケージをクライアントにインストールする

#### おまけ
色々設定しない場合のエラーパターンです。
てきとうにやった結果以下の順番でチェックしている?模様

1. hostsファイルチェック(ここはconfigの参照先config設定依存。何もしてなければ/etc/ansible/hosts)
2. sshの認証状況確認
3. 実行後のチェック

```txt:「/etc/ansible/hosts」にクライアント側の情報を入れていない場合
openstack@Ubuntu16041Server:~$ ansible 192.168.56.101 -m ping
 [WARNING]: provided hosts list is empty, only localhost is available

 [WARNING]: No hosts matched, nothing to do
```

```txt:SSH鍵設定をしていない場合(hostsファイルは設定済)
openstack@Ubuntu16041Server:~$ ansible 192.168.56.101 -m ping
The authenticity of host '192.168.56.101 (192.168.56.101)' can't be established.
ECDSA key fingerprint is SHA256:0iR9bUQBi9xSFYsTvTkLDDaBdQ7jbsHwZJNhs2ZQ8KY.
Are you sure you want to continue connecting (yes/no)? yes
192.168.56.101 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: Warning: Permanently added '192.168.56.101' (ECDSA) to the list of known hosts.\r\nPermission denied (publickey,password).\r\n",
    "unreachable": true
}
```

```txt:python2.7が入っていない場合
openstack@Ubuntu16041Server:~/.ssh$ ansible 192.168.56.101 -m ping
192.168.56.101 | FAILED! => {
    "changed": false,
    "failed": true,
    "module_stderr": "Shared connection to 192.168.56.101 closed.\r\n",
    "module_stdout": "/bin/sh: 1: /usr/bin/python: not found\r\n",
    "msg": "MODULE FAILURE"
}
```
terraform で GCE のインスタンス別SSH認証鍵の設定をする

ちょっとわかりづらかったので後進のためにメモ

## やりたいこと

Web UI で言うところの
![image](https://qiita-image-store.s3.amazonaws.com/0/9641/26584df8-b2fa-7085-67b3-3b723b2d8b61.png)
を Terraform で設定したい。

特に「プロジェクト全体のSSH認証鍵をブロック」して、ホストに登録したつもりのない認証鍵が勝手に配置されるのを止めたい※

terraform のドキュメント https://www.terraform.io/docs/providers/google/r/compute_instance.html にはそれっぽい項目がないが、実は metadata を設定するとできる。

※プロジェクト全体のSSH認証鍵がブロックされていないと、Compute Engine > メタデータ > 認証鍵で表示される、プロジェクト全体のSSH認証鍵が自動配置されてログインできてしまう。

## やり方

```
resource "google_compute_instance" "test" {
  name         = "test"
  machine_type = "n1-standard-1"
  zone         = "asia-east1-a"

  metadata {
    "block-project-ssh-keys" = "true"
    "ssh-keys" = "seo.naotoshi:ssh-rsa XXXXXXXXXXXX seo.naotoshi@MAC.local\nsonots:ssh-rsa XXXXX sonots@MAC.local\n"
  }
}
```

「プロジェクト全体のSSH認証鍵をブロック」するには `block-project-ssh-keys` を true に設定すれば良い。

SSH認証の公開鍵を設定するには、ssh-keys にいつもの公開鍵フォーマットの先頭に「ユーザ名:」をつけて記述し、複数指定したい場合は改行区切りで指定する。

## 参考文献

* https://cloud.google.com/compute/docs/instances/ssh-keys#metadatavalues

ちなみに gcloud compute instances describe を打つと

```
$ gcloud compute instances describe ホスト名
metadata:
  fingerprint: AikYwVsA9XE=
  items:
  - key: block-project-ssh-keys
    value: 'true'
  - key: ssh-keys
    value: |-
      seo.naotoshi:ssh-rsa XXXXXXXXXXXX seo.naotoshi@Mac.local
      sonots:ssh-rsa XXXXXXXXXXXX sonots@Mac.local
```

のように出てくるのでキー名がわかる。

## 追記

なお、[gcloud compute ssh でのSSH認証鍵の自動配置を無効化する](http://qiita.com/sonots/items/85d9028d8456fb4d3b3f) を行うと、プロジェクト全体のSSH認証鍵の自動配置も同時に無効化された。
Pythonで色々やってみた:スクレイピング（Beautiful Soup+Selenium+PhantomJS）とか形態素解析とか

かれこれ、平日夜と週末とでPythonプログラミング歴3ヶ月くらいになってきたわけですが、楽しく引き続きやっています。

最近やったことは、

１，形態素解析
・データをMecabに放り込んで、名詞のみで絞り込んで頻度算出、その後ユーザー辞書追加して再度やってみるという流れを掴んでおきたかったのでちょっとやってみた
・すぐに出来たので特に内容は記載しません。。。

【参考にさせていただいたサイト】
http://qiita.com/fantm21/items/d3d44f7d86f09acda86f
http://qiita.com/naoyu822/items/473756fb8e8bbdc4d734
http://www.mwsoft.jp/programming/munou/mecab_command.html
http://shimz.me/blog/d3-js/2711

２，スクレイピング
・テキストや画像など、スクレイピングは業務に関係することが非常に多いので、ある程度勉強したいなと思い今回は書籍から入ってみた
https://www.amazon.co.jp/dp/4873117615

・まずはPython+Beautiful Soupで単ページで構造が分かりやすいものはさくっととれるということがよく分かった

・次いで、JSで生成されてるサイトは単に上記組み合わせでは難しく、PhantomJS、CasperJSってのがあってJSで書いてスクレイピングすることで、これまたさくっととってこれるということが分かった

・その後、PythonでもSelenium+PhantomJSという組み合わせで、JSで生成されるwebサイトをスクレイピングできることが分かった

・とりあえず最後のコードのPandasのDataframeでcsv化しようとした時に、UnicodeEncodeErrorが出続けてはまりまくったけど、Dataframeでcsv化するところにencodeの指定を入れて解決というなんだかなという結末で、とりあえずやりたいことが実現出来た

【参考にさせていただいたサイト】
http://doz13189.hatenablog.com/entry/2016/08/21/154219
http://zipsan.hatenablog.jp/entry/20150413/1428861548
http://qiita.com/okadate/items/7b9620a5e64b4e906c42

単に参考にさせていただいたサイトのソースをコピペで組み合わせさせていただいてるだけですが、以下のようなソースでやりました。。。

```scraping.py
import lxml.html
from selenium import webdriver
from bs4 import BeautifulSoup
import pandas as pd
import time

aaa = []
bbb = []
ccc = []

for page in range(1,2): # ページの上限は適宜設定
	driver = webdriver.PhantomJS()
	driver.get("https://www.～～=page=" + str(page))
	data = driver.page_source.encode('utf-8')
	soup = BeautifulSoup(data, "lxml")

	for o in soup.findAll("h3", class_="hoge"):# よく見かけるけど、なんでみんなhogeってするんだろう？
		aaa.append(o.string)

	for o1 in soup.findAll("h3", class_="hoge"):# なんでhoge？
		bbb.append(o1.string)

	for o2 in soup.findAll("div", class_="hoge"):# なん...？
		ccc.append(o2.get_text())
	time.sleep(3)

df = pd.DataFrame({"aaa":aaa, "bbb":bbb, "ccc":ccc})

print(df)
df.to_csv("hogehoge.csv", index=False, encoding='utf-8')

driver.quit()
```

よく分からず書いてるところ多々ありますが、とりあえず動いた。

引き続き勉強していきます。
【Swift】YouTube動画アプリのサンプルコード（カテゴライズ）

# 概要
YouTubeの動画検索と動画再生のサンプルコードです。

# [前回](http://qiita.com/menomoto/items/a43f9f672278795a371b)からの変更箇所
* タブバーを追加（UITabBarController）
* 動画をカテゴライズしたページを追加（CategoryViewController）
* 画像取得は[SDWebImage](https://github.com/rs/SDWebImage)を利用

# 次回以降のタスク
* タブバーのアイコン作成、タイトル変更
* カテゴリをツリー構造に変更
* 動画のお気に入り登録と一覧表示（UserDefault or Realm）
* 検索結果の並び順の調整

# github
https://github.com/menomoto/Sample_Apps/tree/master/fishingVideos

* 利用する場合は[APIキー](https://github.com/menomoto/Sample_Apps/blob/master/fishingVideos/fishingVideos/Components/Constants.swift#L3)を変更してください。

# 結果
![サンプル](http://i.imgur.com/ow5NQI3.gif)
Facebook Platformのステータスチェックをするmackerelのプラグインを作ってみた

# これはなに？

FacebookのAPIが生きている、死んでいるとかの確認を見に行くのが億劫になったのでmackerelのプラグインを作って監視してみようと思いました。
ここでは、作成したmackerelのプラグインの概要について記載します。

# 今までFacebookのステータスをどう確認していたか

FacebookのAPIが生きている、死んでいるとかの確認を以下のURLで見ることが出来ます。
https://developers.facebook.com/status/

<img width="1009" alt="スクリーンショット 2016-11-07 23.35.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/29458/7f4a21c7-e295-a07c-04d4-0402546e7264.png">


ステータスについてはAPIも提供されているようでした。
https://www.facebook.com/platform/api-status/

```json
{
   "current": {
      "health": 1,
      "subject": "Facebook Platform is Healthy"
   },
   "push": {
      "status": "Complete",
      "updated": "2016-11-03T16:22:04-07:00",
      "id": 61782248
   }
}
```

このAPIは使わない手はないと思ったので、これを使って監視するようにしました。

# どんなコードを書いたの？

書いたコードはgithubに上げてみました。
https://github.com/yuji0602/mackerel-plugin-facebook-platform-api-status

プラグインの作成については、以下のURLを見つつコードをほとんど流用して作ってみました。
https://mackerel.io/ja/docs/entry/advanced/go-mackerel-plugin-helper
https://github.com/mackerelio/mackerel-agent-plugins/blob/master/mackerel-plugin-uptime/uptime.go

実行するとこんな感じで動きます。

```bash
$ go run facebook_platform_health_check.go
Facebook Platform.health        1.000000        1478086831
```


# 作ってみた感想

まだGoをよく理解していないので、もう少し読みながら理解していけたらと思います。
プラグインを書いてみて、改めてmackerel便利だなと思いました。
再帰的に親をたどって、検索したい文字を含むフォルダのフルパスを返すメソッド。

再帰的に親をたどって、検索したい文字を含むフォルダのフルパスを返すメソッド。

```csharp
private string FixPath(string folderpath, string keyword) {
    if (Directory.Exists(folderpath + @"\" + keyword))
        return folderpath + @"\" + keyword;
    else
        return FixPath(Path.GetDirectoryName(folderpath),keyword);
}
```