OmniAICreator/Qiita-1.07M huggingface dataset:
Ganglia Monitoring Systemを導入する

#Gangliaの導入

- Ganglia is a scalable distributed monitoring system for high-performance computing systems such as clusters and Grids. It is based on a hierarchical design targeted at federations of clusters. It leverages widely used technologies such as XML for data representation, XDR for compact, portable data transport, and RRDtool for data storage and visualization. It uses carefully engineered data structures and algorithms to achieve very low per-node overheads and high concurrency. The implementation is robust, has been ported to an extensive set of operating systems and processor architectures, and is currently in use on thousands of clusters around the world. It has been used to link clusters across university campuses and around the world and can scale to handle clusters with 2000 nodes.

##1 apacheとphpを導入
~~~sh
yum -y install rrdtool
yum -y install httpd php
yum -y install --enablerepo=epel ganglia ganglia-gmetad ganglia-gmond ganglia-web
/etc/init.d/gmetad start
/etc/init.d/gmond start
/etc/init.d/httpd restart
~~~

##2 GangliaのフロントエンドへアクセスするためのApache用設定

- httpd.confについての詳細な説明は[こちらを参照](http://www.adminweb.jp/apache/allow/index1.html)

###2.1 /etc/httpd/conf.d/ganglia.conf
全てのホストからの接続を許可する。

~~~sh
sed -i -e 's/^ *Deny from all/#Deny from all/g' /etc/httpd/conf.d/ganglia.conf;
sed -i -e '/^#Deny from all/a Allow from all' /etc/httpd/conf.d/ganglia.conf;
/etc/init.d/httpd restart
~~~

~~~
  #
  # Ganglia monitoring system php web frontend
  #

  Alias /ganglia /usr/share/ganglia

  <Location /ganglia>
    Order deny,allow
    #Deny from all
    #Allow from 127.0.0.1
    #Allow from ::1
    # Allow from .example.com
    Allow from all
  </Location>
~~~

###2.2 デーモンプロセスの自動起動設定

~~~sh
chkconfig gmetad on
chkconfig gmond on
chkconfig --list
~~~

~~~
gmetad         	0:off	1:off	2:on	3:on	4:on	5:on	6:off
gmond          	0:off	1:off	2:on	3:on	4:on	5:on	6:off
~~~
Graphite - Scalable Realtime Graphing を導入する

#Graphiteの導入

##1 apacheとphpを導入
~~~sh
yum -y install rrdtool
yum -y install httpd php
yum -y install --enablerepo=epel ganglia ganglia-gmetad ganglia-gmond ganglia-web
/etc/init.d/gmetad start
/etc/init.d/gmond start
/etc/init.d/httpd restart
~~~

##2 GangliaのフロントエンドへアクセスするためのApache用設定

- httpd.confについての詳細な説明は[こちらを参照](http://www.adminweb.jp/apache/allow/index1.html)

###2.1 /etc/httpd/conf.d/ganglia.conf
全てのホストからの接続を許可する。

~~~sh
sed -i -e 's/^ *Deny from all/#Deny from all/g' /etc/httpd/conf.d/ganglia.conf;
sed -i -e '/^#Deny from all/a Allow from all' /etc/httpd/conf.d/ganglia.conf;
/etc/init.d/httpd restart
~~~

~~~
  #
  # Ganglia monitoring system php web frontend
  #

  Alias /ganglia /usr/share/ganglia

  <Location /ganglia>
    Order deny,allow
    #Deny from all
    #Allow from 127.0.0.1
    #Allow from ::1
    # Allow from .example.com
    Allow from all
  </Location>
~~~

###2.2 デーモンプロセスの自動起動設定

~~~sh
chkconfig gmetad on
chkconfig gmond on
chkconfig --list
~~~

~~~
gmetad         	0:off	1:off	2:on	3:on	4:on	5:on	6:off
gmond          	0:off	1:off	2:on	3:on	4:on	5:on	6:off
~~~
Windows環境に入れておくべきソフト

# Everything
Everythingはシンプル・軽量・高速・高機能なファイル検索のフリーソフト
http://www.voidtools.com/

# kobito
ソフトウェア開発者のためのMarkdownによる情報記録・共有ソフト
http://kobito.qiita.com/win

# FreeCommander
タブ型ファイラー
http://freecommander.com/en/summary/
SSHDを複数起動してSFTPとSSHを分けてみる

## About
前から気になっていたので、試してみました。sshdでsubsystemの指定でsftpサーバ利用できますが、sshのポートが同じになってしまいます。sftpサーバは社外に公開しつつも、セキュリティを考えるとsshログインできるユーザを絞りたい。proftpd等を使えばsftp機能があるみたいなのですが、シンプルにやりたかったので試してみました。

## 環境
* CentOS 7

## ssh側
特別な設定は必要ありません。


## sftp側

## 設定
もう1台sshdを起動するには、ポートやプロセスなどが重複しないように設定が必要です。

#### systemd用のファイル

```/etc/systemd/system/sshd_sftp.service
[Unit]
Description=OpenSSH server daemon only sftp
After=syslog.target network.target auditd.service

[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd_sftp
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

```

#### 設定ファイル

```bash
:/etc/ssh/sshd_sftp
Port 19321
Protocol 2
SyslogFacility AUTHPRIV


PermitRootLogin no
PasswordAuthentication no
ChallengeResponseAuthentication no


GSSAPIAuthentication yes
GSSAPICleanupCredentials yes

UsePAM yes

AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS

X11Forwarding yes
PidFile /var/run/sftp.pid

# ssh/sftpを利用できるグループを制限。
AllowGroups sftp-user

UseDNS no
GSSAPIAuthentication no

Subsystem	sftp	internal-sftp -f local5 -l INFO
Match group sftp-user
	PasswordAuthentication yes
	X11Forwarding no
	AllowTcpForwarding no
	ChrootDirectory /home/%u/chroot/

```

`sftp-user` グループに所属するはパスワード認証を許可しつつ、chrootを使って権限を閉じるようにしています。ここで重要なのが、AllowGroupsの設定です。`sftp-user`に所属するユーザのみがsshdサーバにアクセスできるため、22番ポートでSSHログインできるユーザもこちらのポートにはアクセスできないようにできます。

## まとめ
強引なやり方ではありますが、やりたいことはできました。
CentOSを初めてさわるときに知っておくとよいこと

VirtualBoxにCentOS7を入れて開発環境構築しています。
構築し始めて3日くらいで行ったこと=Linux初心者が知っているとよいだろうと思われることをまとめていきます。

**環境**
VirtualBox 5.0.12
CentOS7(GUI環境を構築)

また、今回はCentOS(RedHat系)で環境を構築するにあたってのまとめです。VirtualBoxには触れないです。
コマンドの説明には`*`マークを付けてます。


#システムのプロキシ設定
Proxyの設定です。
仮想マシンデスクトップの「アプリケーション」>「システムツール」>「設定」の中の「ネットワーク」
「ネットワークプロキシ」を選択し、入力。


#一般のユーザーもroot権限のコマンドを使えるようになる
sudoコマンドを使用することで、root権限のコマンドを使用できる。
しかし、このsudoコマンドを使用するためには設定が必要になる。

/etc/sudoers(CentOS)を修正することによって、sudoコマンドを一般ユーザーも使うことができる。
sudoersを修正するには、viコマンドではなくvisudoというコマンドを使用する。


##visudo*
sudoersを編集するコマンド。
この修正は、間違ったまま保存されてしまうとsudoコマンドが使用できなくなる可能性もあるため、visudoという特別なコマンドが準備されている。
viコマンドの保存の仕方とは異なるので注意が必要。


#パッケージ管理

##パッケージ管理とは
Linuxの場合、OSに新しいソフトウェアをインストールする際、パッケージ管理システムを使用する。
コンパイル済みのソースや必要なリソースがひとまとめになったものをパッケージとよぶ。
これらのパッケージはリポジトリと呼ばれるところに保存されている。
このパッケージをリポジトリからインストールしてくることで、様々な機能を使うことが可能になる。

##yum*
パッケージ管理システム。
yumというコマンドを使用することで、パッケージのインストールやアンインストール、バージョンアップなどを行うことができる。

##rpm*
yumと同様パッケージ管理システム。
rpmというコマンドでパッケージを扱う。

##yumとrpmの違い
yumの内部でrpmが使用されている。
また、yumのほうがrpmよりも高機能である。そのため、普段はyumを使用して、yumでできないことをrpmで行うとよい。

#各ツールのプロキシの設定
/etc/profile.dの下にXXX.shというファイルを作成し、このファイルにプロキシの情報を書きます。
このXXX.shはログイン時に実行されます。
私は、proxy.shというファイルを作成し、以下のように書きました。

```
# proxy configuration
 
USERNAME="username"　　　# usernameはご自身のユーザー名を
PASSWORD="XXXXXX"　　　　# XXXXXXはご自身のパスワードを

PROXY="$USERNAME:$PASSWORD@host:port/"　　　# hostとportはご自身の環境に合わせて

export http_proxy="http://$PROXY"
export https_proxy="https://$PROXY"
export HTTP_PROXY="http://$PROXY"
export HTTPS_PROXY="https://$PROXY"
```

このファイルを設置して、今のところyum、wget、gitは使えています。

# wget*
HTTP／HTTPSなどを介してデータをまとめて取得するできるコマンド。
`wget URL`でURLの情報を取ってくることができる。


# vi*
viエディタを使用するときのコマンド。
viエディタはUNIX系OSでの代表的なテキストエディタ。

```
vi ファイル名　# ファイル名が存在しなければ新規作成になる
```

「各ツールのプロキシ設定」でproxy.shを作成していますが、
`vi　/etc/profile.d/proxy.sh`で作成しています。

viエディタは「コマンドモード」と「編集モード」を切り替えながら文章を作成する。
初めて使うときには戸惑うかもしれない(少なくとも私は戸惑いました・・・)。

viエディタを開いた直後はコマンドモード。コマンドモードでは文書の編集は行えない。

コマンドモードから編集モードに切り替えるには、コマンドモードの状態で`i`と入力する。
現在のカーソル位置から入力できる。
編集モードへの切り替えは、`i`のほかにも`R`、`A`、`O`、`o`などのコマンドでも行うことができる。

編集モードからコマンドモードへは`Esc`キーで切り替えることができる。

編集内容の保存や、viエディタの終了コマンドは以下の通り。

| コマンド | 挙動 |
|:-----------|:-----------|
| :q|保存せずに終了(文書を変更していると警告がでる)|
| :q!|変更があっても保存をせずに終了|
| :wq|保存して終了|
文字列変数を含んだStringをNSURLに変換する

##はじめに
文字列に変数を付け足してNSURLを作成するときに手こずったので備忘録

##失敗例
```swift
// data: Dictionary<String, AnyObject>! = [:]
self.data["name"] = "hoge"
// 省略
let s_url = "http://google.com/#q=\(self.data["name"]! as! String)" // http://google.com/#q=hoge
let   url = NSURL(string: s_url)! // nil
```
s_urlでは`http://google.com/#q=hoge`と表示されるのに、urlでは`nil`になってしまいます

##対策
```swift
// data: Dictionary<String, AnyObject>! = [:]
self.data["name"] = "hoge"
// 省略
let s_url : NSString = "http://google.com/#q="
let  name : NSString = self.data["name"]!.stringByAddingPercentEncodingWithAllowedCharacters( NSCharacterSet.URLFragmentAllowedCharacterSet() )!
let   url :    NSURL = NSURL(string: url as String)!
```

とすれば`print(url)`で`http://google.com/#q=hoge`とでてきます。
めでたしめでたし

##注意点

```swift
// data: Dictionary<String, AnyObject>! = [:]
self.data["name"] = "hoge"
// 省略
let url = "http://google.com/#q=\(self.data["name"]!)"
url.stringByAddingPercentEncodingWithAllowedCharacters( NSCharacterSet.URLFragmentAllowedCharacterSet() )!
```
上記のようにしてしまうと`print(url) // http://google.com/%23q=hoge`となってしまう。
`NSCharacterSet.URLFragmentAllowedCharacterSet()`をすることによって`# -> %23`と置き換わってしまうためです。

`NSCharacterSet`には色々な設定値があるので自分の環境に応じて変更してください。

```swift
// 引用　http://stackoverflow.com/questions/8086584/objective-c-url-encoding
URLFragmentAllowedCharacterSet  "#%<>[\]^`{|}
URLHostAllowedCharacterSet      "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet  "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet      "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet     "#%<>[\]^`{|}
URLUserAllowedCharacterSet      "#%/:<>?@[\]^
```
Googleの祝日カレンダーデータをBASIC!で取得。（ BASIC プログラミング ）

BASIC!は、Androidで動くBASIC インタープリタです。詳しくは以下をどうぞ。

* [AndroidでBASICを使う](http://qiita.com/basictomonokai/items/25bcb21ec69c00e9ad23)

Googleの祝日カレンダーデータを取得する記事があちらこちらに出ていたので BASIC!でもできるか試してみました。

##1.カレンダーデータとは

以下のサイトの記事がわかりやすいと思います。

* [祝日のリストが欲しい](https://www.softel.co.jp/blogs/tech/archives/2912)

要は「 https://calendar.google.com/calendar/ical/ja.japanese%23holiday%40group.v.calendar.google.com/public/basic.ics 」のデータを取得して編集すればいいことになります。

##2.コード

さっそくコードです。ポイントは以下

* graburl命令でicsファイルは取得
* DTSTARTとSUMMARYを含む行のみ抽出
* 日付の昇順で並べ替え

``` サンプルコード
REM Start of BASIC! Program

graburl ics$,"https://calendar.google.com/calendar/ical/ja.japanese%23holiday%40group.v.calendar.google.com/public/basic.ics"

print ics$

split iya$[],ics$,"\n"
array.length liya,iya$[]

cls

outwk$=""

for vv=1 to liya 
   if IS_IN("DTSTART",iya$[vv])>0 then
      wk1$=replace$(iya$[vv],"DTSTART;VALUE=DATE:","")
   endif
   if IS_IN("SUMMARY",iya$[vv])>0 then
      wk2$=replace$(iya$[vv],"SUMMARY:","")
      outwk$=outwk$+wk1$+wk2$+"@x@"
   endif
next vv

array.delete iya$[]

split iyb$[],outwk$,"@x@"
array.length liyb,iyb$[]

array.sort iyb$[]

for vv=1 to liyb 
    print iyb$[vv]
next vv

array.delete iyb$[]


end
```

##3.実行結果

実行した結果は以下です。
BASIC!でも簡単に取得できます。

``` 実行結果
20150101
元日
20150112
成人の日
20150211
建国記念の日
20150321
春分の日
20150429
昭和の日
20150503
憲法記念日
20150504
みどりの日
20150505
こどもの日
20150506
憲法記念日 振替休日
20150720
海の日
20150921
敬老の日
20150922
国民の休日
20150923
秋分の日
20151012
体育の日
20151103
文化の日
20151123
勤労感謝の日
20151223
天皇誕生日
20160101
元日
20160111
成人の日
20160211
建国記念の日
20160320
春分の日
20160321
春分の日 振替休日
20160429
昭和の日
20160503
憲法記念日
20160504
みどりの日
20160505
こどもの日
20160718
海の日
20160811
山の日
20160919
敬老の日
20160922
秋分の日
20161010
体育の日
20161103
文化の日
20161123
勤労感謝の日
20161223
天皇誕生日
20170101
元日
20170102
元日 振替休日
20170109
成人の日
20170211
建国記念の日
20170320
春分の日
20170429
昭和の日
20170503
憲法記念日
20170504
みどりの日
20170505
こどもの日
20170717
海の日
20170811
山の日
20170918
敬老の日
20170923
秋分の日
20171009
体育の日
20171103
文化の日
20171123
勤労感謝の日
20171223
天皇誕生日
```

以上です。
【Docker 1.9】"Could not find container for entity id"というエラー

#概要
__Docker 1.9.*__ のみで見られるバグです

今まで動かしていたイメージを`docker run`で起動しようすると

```
$ docker run hogehoge
...

Error response from daemon: Could not find container for entity id {id}
```
とエラーを吐いて起動できないバグがある模様

#対処法
#### コンテナ内の `/var/lib/docker/linkgraph.db` を消す
<br/>

`linkgraph.db` はSQliteのデータベースでコンテナidとかのリレーションを記録してるやつです


   - これでも治らない場合は`/var/lib/docker/containers/`の中身も消してみる
   - `/var/lib`からdockerのディレクトリを移動した人はもちろん移動先で


あまり綺麗なやり方ではないので消す時は自己責任でお願い致します

###今後も同じエラーが続く場合

- 起きるたびに`linkgraph.db`その他を消す
- `1.8.*`にダウングレードする

あとはアプデを待つしか今のところなさそうです

#補足
すでに同様の症状がIssueで多数報告されてるようです
[Issue - Creating fail with Could not find container for entity id <id> after upgrading to 1.9.0 #17691 - Github.com](https://github.com/docker/docker/issues/17691)

見た感じ`1.10.0`で改善される予定っぽいですね

実行環境はあまり関係ないようで、バージョン1.9.*なら遍く起きる可能性がありそうです
念のため、自分の環境をあげておきます


> -  Mac OS X Yosemite 10.10.2 
- docker 
    - Version:      1.9.1
    - API version:  1.21
    - Go version:   go1.4.3
    - OS/Arch:      darwin/amd64
- Vertual Box 5.0.12
scanf(),fscanf()で数値を読み込みたいがスペースは無視する

#scanf,fscanfで実数を読み込む際に空白・スペースを無視する方法

##動機
データの数値の前後に空白・スペースがあるCSVファイルを扱う際に、scanfで実数（%f,%lfフォーマット）が読み込めない問題が発生しました。

##結論
読み込みのフォーマット指定の後にスペースを一つ入れると、csvの中の空白を無視してくれるようです。
まずは結論のコードから

```lang:スペースを無視するfscanf
fscanf( fp, "%lf ,%lf ,", &freq, &fft);
```
##サンプル
###src
以下は空白に対応できないコード

```lang:スペースがあるとうまく数値を取り込めないfscanf
fscanf( fp, "%lf,%lf,", &freq, &fft);
```

サンプルコードと空白含むデータのCSVサンプル

```正常動作サンプルコード
#include<stdio.h>
int main(){
FILE *fp;
if((fp= fopen("test.csv","r"))==NULL){
  printf("file open FAILED!\n");
}
double freq,fft;
int count = 0;
for(count;count<5;count++){
fscanf( fp, "%lf ,%lf ,", &freq, &fft);
printf("fscan%d %lf %lf\n",count,freq,fft);
}
fclose(fp);
return(0);
}
```

```test.csv
1,2,
 3,4 ,
5 , 6,
 3 ,   4 ,
5    ,6    ,
```

###実行結果
```lang:コンパイル・実行結果
$ gcc -o sample_scanf.exe sample_scanf.c
$ ./sample_scanf.exe
fscan0 1.000000 2.000000
fscan1 3.000000 4.000000
fscan2 5.000000 6.000000
fscan3 3.000000 4.000000
fscan4 5.000000 6.000000
```

##今回の環境
私の実行環境です。

```lang:shell
$ gcc -v
組み込み spec を使用しています。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-msys/4.9.2/lto-wrapper.exe
ターゲット: x86_64-pc-msys
configure 設定: /msys_scripts/gcc/src/gcc-4.9.2/configure --build=x86_64-pc-msys --prefix=/usr --libexecdir=/usr/lib --enable-bootstrap --enable-shared --enable-shared-libgcc --enable-static --enable-version-specific-runtime-libs --with-arch=x86-64 --disable-multilib --with-tune=generic --enable-__cxa_atexit --with-dwarf2 --enable-languages=c,c++,fortran,lto --enable-graphite --enable-threads=posix --enable-libatomic --enable-libgomp --disable-libitm --enable-libquadmath --enable-libquadmath-support --enable-libssp --disable-win32-registry --disable-symvers --with-gnu-ld --with-gnu-as --disable-isl-version-check --enable-checking=release --without-libiconv-prefix --without-libintl-prefix --with-system-zlib
スレッドモデル: posix
gcc バージョン 4.9.2 (GCC)
```

##参考URI
[「初心者のためのポイント学習Ｃ言語」＞第５章　標準入出力関数（１）](http://www9.plala.or.jp/sgwr-t/c/sec05.html)
JavaJavaした人がHHKBでvimvimするための.vrapperrc

## ■HHKBでEclipseライフを快適に

HHKBによるEclipse操作は、デバッグ系操作が結構ストレスです([Fn]+[5]とか)
Eclipseのキーバインドを変更しても良いのですが、Vrapperでキーバインドという方法があったので試してみました。

実は、そんなにVimmerじゃないのですが、Vimiumを試したらChromeライフが快適になったので、Eclipseも快適になることを狙っています。

## ■デバッグ系操作のキーバインド
単純に[Fn]無しでおｋにしただけです。

```vim
" ---デバッグ系---
" [5] ステップイン(F5)
eclipseaction StepInto org.eclipse.debug.ui.commands.StepInto
nnoremap 5 :StepInto<CR>

" [6] ステップオーバー(F6)
eclipseaction StepOver org.eclipse.debug.ui.commands.StepOver
nnoremap 6 :StepOver<CR>

" [7] ステップリターン(F7)
eclipseaction StepReturn org.eclipse.debug.ui.commands.StepReturn
nnoremap 7 :StepReturn<CR>

" [8] リジューム(F8)
eclipseaction Resume org.eclipse.debug.ui.commands.Resume
nnoremap 8 :Resume<CR>
```

## ■コンテキストメニュー表示のキーバインド
コンテキストメニュー表示を適当に割り当ています。

```vim
" ---右クリ系---
" [space] + [1] コンテキストメニュー
eclipseaction showContextMenu org.eclipse.ui.window.showContextMenu
nnoremap <space>1 :showContextMenu<cr>

" [space] + [2] ルーラー コンテキストメニュー
eclipseaction ShowRulerContextMenu org.eclipse.ui.edit.text.showRulerContextMenu
nnoremap <space>2 :ShowRulerContextMenu<CR>

" [space] + [3] コンテンツアシスト コンテキストメニュー
eclipseaction ContentAssistContextInformation org.eclipse.ui.edit.text.contentAssist.contextInformation
nnoremap <space>3 :ContentAssistContextInformation<CR>
```

## ■おまけ
```vim
" ---設定系---
" インクリメンタル検索
set incsearch
set hlsearch

" 検索時の大文字小文字無視
set ignorecase
set smartcase

" クリップボード共有
set clipboard=unnamed 

" insertモードを抜けた時にIME解除
set imd

" ---検索系---
" [s][r] 参照をプロジェクトから検索
eclipseaction SearchRef org.eclipse.jdt.ui.edit.text.java.search.references.in.project
nnoremap sr :SearchRef<CR>

" ---その他---
" [Esc] + [Esc] 検索のハイライトを消す
nnoremap <Esc><Esc> :noh<CR>

" [Shift] + [r] .vimrcのリロード
nnoremap <S-r> :source ~/.vrapperrc<CR>:noh<CR>

" [Space] + [j] 下スクロール
noremap <Space>j <C-f>
" [Space] + [k] 上スクロール
noremap <Space>k <C-b>

" [v][v] カーソル位置の単語をコピー
nnoremap vv vawy

" [Shift] + [h] 左のタブ
nnoremap <S-h> gT
" [Shift] + [l] 右のタブ
nnoremap <S-l> gt
```

## ■確認環境
* Windows
    * Eclipse Luna Release (4.4.0)
    * Vrapper 0.62.0
* Mac
    * Eclipse Luna Service Release 1(4.4.1)
    * Vrapper 0.62.0

## ■使い方
* ~/.vrapperrcを設置する


あ、今はHHKBじゃなくてREALFORCE使ってます。
はてブと同時にQiitaストックするサービスを作りました


その名も「はてブと同時にQiitaストック」です。
**[はてブと同時にQiitaストック - http://hb2qiita.com/](http://hb2qiita.com/)**

## What's はてブと同時にQiitaストック

名前の通り、はてなブックマークにQiita記事をブックマークすると、自動的にその記事をストックするサービスです。
どんなツール（Web/ブラウザ拡張/アプリ/ブックマークレット/ブックマークボタン/ツイート/メール/その他3rd-partyツール）からブックマークする場合でも、ブックマークしたURLがQiitaの記事であれば自動的にストックします。

以下のような特徴があります。

- Qiita記事をはてなブックマークへブクマすると自動でストック
- はてなブックマークから削除すると自動でストック解除
- ブクマ経路（Webから、アプリからなど）を問わず対応
- 非公開ブクマをストックすることもできる（しないこともできる）

## 使い方

### サービスへアクセス

[はてブと同時にQiitaストック - http://hb2qiita.com/](http://hb2qiita.com/)
![blog-toppage.png](https://qiita-image-store.s3.amazonaws.com/0/6368/b3c5a9cd-109a-c24f-3547-7b79cc8b919f.png "blog-toppage.png")

### Qiitaへログイン＆サービス連携

サービスから「Qiitaでログインして利用」をクリックすると、Qiita側のアクセス許可画面が表示されるので「許可」をクリックします。[^1]
![blog-qiita-auth.png](https://qiita-image-store.s3.amazonaws.com/0/6368/b82b3b3a-8194-d0c2-67f5-e40bafa64a8a.png "blog-qiita-auth.png")

### はてなブックマーク設定用のURLとキーをコピー

ログイン＆連携（許可）すると、あなた専用のURLとキーが発行されます。なお、キーは他人に教えたり公開しないでください。[^2]

これらの値をコピーしてはてなブックマークサイトの設定（Web Hook設定）へ登録します。

### はてなブックマークのWeb Hook設定[^3]

#### 設定用URL
下の画像のようにURLが表示されるのでコピーします。コピーボタンをクリック（タップ）するとクリップボードにコピーされます。[^4]
![blog-url.png](https://qiita-image-store.s3.amazonaws.com/0/6368/8e4ad040-28c3-1d61-2700-7aa50932f5d4.png "blog-url.png")

このURLを[はてなブックマーク Web Hook 設定](http://b.hatena.ne.jp/-/my/config/developer)ページの「イベント通知を受け取るURL」欄にペーストします。

#### 設定用キー
下の画像のようにキーが表示されるのでURLと同様にコピーし、同じくWeb Hook設定ページの「キー」欄にペーストします。
![blog-key.png](https://qiita-image-store.s3.amazonaws.com/0/6368/5c3ca27e-8349-86ca-c3ae-3403b5028dfb.png "blog-key.png")

#### イベントの種類
キー欄の下にある「受け取るイベントの種類」では、必ず「ブックマークの追加 / 更新 / 削除」にチェックを入れてください。
![webhook-hb-settings-event.png](https://qiita-image-store.s3.amazonaws.com/0/6368/c241a361-1577-2fd1-3ecb-9df9588776e7.png "webhook-hb-settings-event.png")

この際、「非公開ブックマークのイベント通知も送信する」へチェックを入れると、はてなブックマークの非公開設定でブックマークした場合でもQiita記事をストックします（チェックを入れなければストックしません）。

#### はてブWeb Hook設定を保存
最後に忘れずページ最下部の「変更を保存」をクリックします。
![blog-submit.png](https://qiita-image-store.s3.amazonaws.com/0/6368/9386155e-2c73-0a5a-6160-09b711242891.png "blog-submit.png")

おめでとうございます。これで設定完了です！
完了後、はてなブックマークへQiita記事をブクマすると、自動的にその記事をストックします。

サービスへ登録した後、おためしとして、この記事をはてなブックマークへブクマしてみてください。ブクマ後にページ再読み込みすると、ストックできていると思います。

**[はてブと同時にQiitaストック - http://hb2qiita.com/](http://hb2qiita.com/)**

[^1]: ストック有無のチェック（データ読み出し）とストック/ストック解除（データ書き込み）を行います
[^2]: 万が一悪意ある他人に知られた場合、Qiitaストックを勝手に追加/削除される可能性があります
[^3]: [はてなブックマーク Web Hook - Hatena Developer Center](http://developer.hatena.ne.jp/ja/documents/bookmark/apis/webhook)
[^4]: iOSでは、Safari以外のブラウザではクリップボードにコピーが動作しない（iOSの制限）ため、Safariからご利用ください
BibTex の導入方法

#はじめに
論文をLaTexで書くにあたり、色々と環境設定をしている。
そこで、参考文献のデータベースBibTexを導入しておこうと思ったら、意外とはまったので備忘録にしておく。

#事前準備
ミソは、文献スタイルファイル(*.bst)と文献データベース(以下文献DB)ファイル(*.bib)を使える状態にすること。
何も知らずに本やWebの通り設定しても、パスが通っていないとうまくいかないよう。

##環境変数にパスを追加
今後の全ての論文で共通で使える文献DBのフォルダを作りたいので、準備をしておく。
~/.bashrc に以下を追加

```Bash
export BIBINPUTS=$BIBINPUTS:/usr/share/texmf/jbibtex/bib:~/research/paper/bibtexDB
export BSTINPUTS=$BSTINPUTS:/usr/share/texmf/jbibtex/bst
```

/usr/share/texmf はLaTexのインストール先だとか。ユーザを超えて共通で設定したいものはここへ。
~/research/paper/bibtexDB 自分で任意で作る文献DB格納先。自分だけが使うならここ。基本はここで作業する。

##文献DBを作成する
~/research/paper/bibtexDB/reference.bib を作る。
フォーマット等は検索すれば出てくるので、そちらにお任せする。

#論文への反映
##test.tex の本文を書く
```tex
\documentclass{jsarticle}
\begin{document}
文献-\cite{xxx}. % reference.bib で登録したラベルを参照
文献-\cite{yyy} 
\bibliographystyle{jplain} % 文献番号の書式。$BSTINPUTS のパスが通ってないとエラー。
\bibliography{reference}&nbsp; %&nbsp; ここで文献DB 名 reference を入れる。拡張子は不要。$BIBINPUTS のパスが通ってないとエラー。
\end{document}
```

##コンパイルする
bibtex データベースに変更が加えられたら、コマンドを4回実行しないといけない。
これはめんどくさいが、文献リストを論文執筆毎に繰り返し作るよりはずっと手間は少ないだろう。

1. test.tex のあるディレクトリに移動
1. platex test
 - 不完全なtest.aux ができる。
1. pbibtex test
 - test.bbl ができる。
1. platex test
 - 参照リストが完成した test.aux ができる。参照リスト不完全のtest.dvi ができる。
1. platex test
 - 参照リストが完成した test.dvi ができる。
サービスを止めずにSWAP領域を追加する。



# 2019/08/11追記
@mogoyaさんからの編集リクエスト取り込み。

```
swapon: /var/swpfile: insecure permissions 0644, 0600 suggested. って言われたので、chmodの記述を追加
```

おそらく記事書いた当初はCentOS5/6系で試したからかと。(古すぎ)

# 拡張の流れ。
1. 余っているDisk領域をddでファイル作って確保。
2. mkswapコマンドでswapファイルに変換。
3. swap onコマンドで有効化。
4. freeコマンドとswaponコマンドで確認。 

# 拡張方法。
0.事前確認。

```
# free -m
             total       used       free     shared    buffers     cached
Mem:          7872       7728        143          0         15       3325
-/+ buffers/cache:       4386       3485
Swap:         4095          3       4092
# swapon -s
Filename                                Type            Size    Used    Priority
/dev/sda2                               partition       4194300 3548    -1
```

1.swap割当用にディスクを確保。

```
# dd if=/dev/zero of=/var/swpfile bs=1M count=2048
```

2.確保した領域をswapファイルに変換。

```
# mkswap /var/swpfile
# chmod 600 /var/swpfile
```

3.swapファイルを有効化。

```
# swapon /var/swpfile
```

4.freeコマンドとswaponコマンドで確認。

```
# free -m
             total       used       free     shared    buffers     cached
Mem:          7872       7728        143          0         15       3324
-/+ buffers/cache:       4388       3484
Swap:         6143          3       6140 
# swapon -s
Filename                                Type            Size    Used    Priority
/dev/sda2                               partition       4194300 3548    -1
/var/swpfile                            file            2097148 0       -2
```

5.fstabに追記し起動時に自動で有効化するように設定。

```
# echo "/var/swpfile         swap                    swap    defaults        0 0" >> /etc/fstab
```

# 拡張したSWAP領域を外すときは下記で。
~~※使用されてると…だった気がする。あとで確認のうえ追記します。~~
合ってました。

```
# swapoff /var/swpfile 
```
docker-composeでmysql & postgreSQL をサクッと起動

# DB docker-compose

随分前に書いてずっと下書きにに入れてた。

とりあえずDB使いたいに場合に気軽に起動できます。

mysql & postgresが`docker-compose up -d`で起動します。

不要なDBはコメントアウトすればOK

```docker-compose.yml
# mysql ---------------------------------------------
datastore:
  image: busybox
  volumes:
      - /opt/datastore:/var/lib/mysql
  container_name: mysql-datastore
mysql:
  image: mysql
  environment:
    MYSQL_ROOT_PASSWORD: password
  ports:
    - "3306:3306"
  volumes_from:
    - datastore
  container_name: mysql-db
# ---------------------------------------------------

# postgres ------------------------------------------
postgres-data:
  image: busybox
  volumes:
      - /var/lib/postgresql/data
  container_name: postgres-datastore

postgresql:
  image: postgres
  environment:
    POSTGRES_USER: hoge
    POSTGRES_PASSWORD: password
  ports:
    - "5432:5432"
  container_name: postgres-db
  volumes_from:
      - postgres-data
# ---------------------------------------------------
```
Hashのvalueの初期値をnil以外に設定

便利だったのでメモ。

Guavaのmultimap見たいなことをやる例。

```rb
h = Hash.new{|h,k| h[k] = []}
h[:key] << "value 1"
h[:key] << "value 2"
h[:key2] << "value 1"
h[:key2] << "value 2"
p h
#=> {:key=>["value 1", "value 2"], :key2=>["value 1", "value 2"]}
```

Hashの初期値がArrayになっている。
divタグで改行をしたくない

#divタグはブロック要素
```
A　テスト
B　テスト
C　テスト

D　テスト
```
あれ？改行されてるけどしたくねえ。
でもどうしてもspanタグでなくdivタグを使わないとダメってとき。。。

■html

```
<div class="test_area">
<span>A</span>　<span>テスト</span><br />
<span>B</span>　<span>テスト</span><br />
<span>C</span>　<div class="test">テスト< /div><br />
<span>D</span>　<span>テスト</span><br />
</div>
```

■CSS

```
.test_area div {
	display:inline!important;
}
```

上記の結果改行がなくなった。

```
A　テスト
B　テスト
C　テスト
D　テスト
```


##まとめ
spanタグはインライン要素
divタグはブロック要素
githubで他人のブランチをforce pushして消してしまった場合の復旧方法

# 原因

ブランチ名を指定せずに、以下のようにforce pushをした結果、他人のブランチまでforce pushされてしまった

```
git push -f
```

# 復旧方法

過去のPull Requestから、消したブランチの最新のコミット番号がわかれば、その状態に復旧することが出来ます。(githubは変更履歴を全部持っているので)

例えば、コミット番号がabcdefgの場合、以下のコマンドでそのコミット時点に戻せます。

```
$ git checkout -b others-topic-branch
$ git reset --hard abcdefg
```

その後、force pushすれば元の状態に復旧されます。

```
$ git push -f origin others-topic-branch
```


# 参考

- [Githubで間違えてgit push -f origin masterしてしまった時の対応](http://qiita.com/awakia/items/52b5900e801c3bfbab04)
Moqを使ってEntityframeworkのモックを作成するには？【単体テスト】


C#の単体テスト用モックフレームワークといえば、Moqがデフォルトですが、Entityframeworkとの相性があまりよくありませんでした。

DbContextのモック実装を用意したり、実コードと差し替えるためにインターフェースを作成する必要があるので、モックの規模が膨らみ、クラス設計にも影響します。

とは言え、単体テストフェーズでJavaのDBUnitのようなDBにデータを仕込むアプローチを取ると、テストデータが膨大になったり、仕様変更、リファクタリングのコストが大きくなってしまいます。

Entityframework6以降では、モック用のインターフェースやダミーを作成せずに、単体テストが組めるようになりました。

## DbContextの変更
```csharp 
public class MyDbContext : DbContext
{
     // Mockに差し替えるEntityはvirtualにしてオーバーライド可能に
     public virtual DbSet<MyEntity> MyEntitys { get; set; }
}
```

## モックの設定(SetUp)
```csharp
// Mock用のデータ
var dataEntity = new List<MyEntity>
{
    new MyEntity {Id = 1, Date = Datetime.Now },
    new MyEntity {Id = 2, Date = Datetime.Now }
}.AsQueryable();

// DbSetのMock
var mockMyEntity = new Mock<DbSet<MyEntity>>();
// DbSetとテスト用データを紐付け
mockMyEntity.As<IQueryable<Type>>().Setup(m => m.Provider).Returns(dataEntity.Provider);
mockMyEntity.As<IQueryable<Type>>().Setup(m => m.Expression).Returns(dataEntity.Expression);
mockMyEntity.As<IQueryable<Type>>().Setup(m => m.ElementType).Returns(dataEntity.ElementType);
mockMyEntity.As<IQueryable<Type>>().Setup(m => m.GetEnumerator()).Returns(dataEntity.GetEnumerator());

// DBContextにMockを設定
var mockContext = new Mock<<MyDbContext>();
mockContext.Setup(m => m.TestEntity).Returns(mockMyEntity.Object);
mockMyEntity.SetUp(f => f.Create()).Returns(new MyEntity());

// DBContextのMockをコンストラクタなどからテスト対象クラスに受け渡す
var target = new Target(mockContext);
```

エンティティの関連を使っている場合、自動では設定されないので、自力で設定する必要があります。

## 参照系のテスト
```csharp
// Mockに設定したデータが取得できる
Assert.AreEqual(1, target.List(1).Id);
```

## 更新系のテスト
```csharp
var ret = target.Save("xyz");
// Addが一回呼び出されること
mockMyEntity.Verify(m => m.Add(It.IsAny<MyEntity>()), Times.Once);
// 想定通りのエンティティが作成されていること
mockMyEntity.Verify(m => m.Add(It.Is<MyEntity>(t => t.Id.Equals(”1”))));
```

単体テストはそれなりに手間がかかりますが、仕様変更やリファクタリングがあっても心の平安が保てますし、デグレもないので結果的に早いです。

## 追記
MSDNでSQL LiteやLocalDBのInMemory Modeや使ったテスト方法が紹介されていました。
クエリのテストする場合、こちらの方がMoqに慣れていない人には分かりやすいかもしれません。

* [EntityFramework- Testing with SQLite](https://docs.microsoft.com/en-us/ef/core/miscellaneous/testing/sqlite)
* [EntityFramework- Testing with InMemory](https://docs.microsoft.com/en-us/ef/core/miscellaneous/testing/in-memory)
Androidでmarkdown(raw)を読み込む [Java / Kotlin]

# AndroidでMarkdownを読み込む

* JavaでMarkdownを読み込むには`res/raw/hoge.md`にmarkdownを配置して

```java
private String readMarkdown(@RawRes int rawId) {
        final Resources resources = getResources();

        BufferedReader bufferedReader = null;
        StringBuilder stringBuilder = new StringBuilder();
        try {
            try {
                InputStream inputStream = resources.openRawResource(rawId);
                bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                String string;
                while ((string = br.readLine()) != null) {
                    sb.append(string).append("\n");
                }
            } finally {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuilder.toString();
    }
```

これで読み込めます。

* Kotlinだとtry-with-resourceをuseという拡張関数で置き換えられます

```kotlin
private fun readMarkdown(@RawRes rawId: Int): String {
        val stringBuilder = StringBuilder()
        BufferedReader(InputStreamReader(resources.openRawResource(rawId))).use {
            var line = it.readLine()
            while (line != null) {
                stringBuilder.append(line).append('\n')
                line = it.readLine()
            }
        }
        return stringBuilder.toString()
    }
```

* ちなみにuseの中身
 
```kotlin
/**
 * Executes the given [block] function on this resource and then closes it down correctly whether an exception
 * is thrown or not.
 *
 * @param block a function to process this closable resource.
 * @return the result of [block] function on this closable resource.
 */
public inline fun <T : Closeable, R> T.use(block: (T) -> R): R {
    var closed = false
    try {
        return block(this)
    } catch (e: Exception) {
        closed = true
        try {
            close()
        } catch (closeException: Exception) {
            // eat the closeException as we are already throwing the original cause
            // and we don't want to mask the real exception

            // TODO on Java 7 we should call
            // e.addSuppressed(closeException)
            // to work like try-with-resources
            // http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html#suppressed-exceptions
        }
        throw e
    } finally {
        if (!closed) {
            close()
        }
    }
}
```

* さらにkotlinの拡張関数をうまく使うとこんなに短くなります。

```kotlin
private fun readMarkdown(@RawRes rawId: Int) = buildString {
        resources.openRawResource(rawId)
                .bufferedReader()
                .useLines { it.forEach { appendln(it) } }
    }
```

* さらにエバンジェリストたろうさんの助言により更に短くなりました。(1/21 追記)

```kotlin
private fun readMarkdown(@RawRes rawId: Int) = 
resources.openRawResource(rawId).bufferedReader().use { it.readText() }
```
アプリのスクリーンショットを取得する


下のスニペットでメインスクリーンのスクリーンショットが撮影できる。
アプリが複数の `UIWindow` を保持していたり、複数の `UIScreen` にまたがってUIが表示されるとしても対応可能なはず。

```Objective-C
    UIGraphicsBeginImageContext(_screenSize);
    UIScreen *mainScreen = [UIScreen mainScreen];
    for (UIWindow *windowItr in [UIApplication sharedApplication].windows) {
        if ([windowItr.screen isEqual:mainScreen]) {
            [windowItr drawViewHierarchyInRect:windowItr.frame afterScreenUpdates:YES];
        }
    }
    UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
```
WindowsでNode.jsを管理者権限なしでインストールする

素人の備忘録。
どこか間違っているかもしれないがとりあえず動いたので。
Windows7 (64bit)で確認。

# 動機
* 職場での簡単なメモはMarkdownで書いてPandocで変換している。
* [mermaid](http://knsv.github.io/mermaid/)を使いたくなった。
* Markdown内にmermaidを書いたらPandocで処理してくれる[mermaid-filter](https://github.com/raghur/mermaid-filter)を見つけた。

ということで何やら便利そうなmermaidを使おうと思ったら、Node.jsが必要とのこと。
[https://nodejs.org/](https://nodejs.org/)からインストーラをダウンロードしてみたが管理者権限が必要らしい。
そんなものはない。

# 解決策
## node.exeの入手
[https://nodejs.org/download/](https://nodejs.org/download/)からnode.exeをダウンロードし任意のフォルダ（例：`nodejs`）内に保存するだけ。
バージョンがいろいろあるが、動けばいい素人なので悩まずに[https://nodejs.org/download/release/latest-v5.x/win-x64/](https://nodejs.org/download/release/latest-v5.x/win-x64/)からダウンロードしてきた。

## npmの入手
1. [https://github.com/npm/npm/releases](https://github.com/npm/npm/releases)から最新版のzipをダウンロード。
2. node.exeと同じ場所（`nodejs`）内に`node_modules`というフォルダを作成し、ダウンロードしたnpmのzipを`nodejs/node_modules/`内へ解凍。
3. `npm-バージョン名`というフォルダ名になるので、`npm`へリネーム。
4. `nodejs/node_modules/npm/bin`内にある`npm`と`npm.cmd`を`nodejs`へコピー。
5. 以下の内容を`nodejs/node_modules/npm/npmrc`として保存。

```rc:npmrc
prefix=${APPDATA}\npm
```

## パスの設定
`nodejs`と`%AppData%/npm`へパスを通す。

# npmのproxy設定
こちらを参考に。
[参考：[Node.js] npm の proxy と registry 設定](http://qiita.com/LightSpeedC/items/b273735e909bd381bcf1)

# 参考文献
[How to install Node.js without admin rights](http://abdelraoof.com/blog/2014/11/11/install-nodejs-without-admin-rights/)
DB のデータを json 形式でエクスポートする

python で書かれている [pudo/dataset](https://github.com/pudo/dataset) を使います。

# インストール

```shell-session
$ pip install --local dataset
```

ここでは`--local` オプションを指定したことにより、ホームディレクトリの `~/.local/bin` に `datafreeze` コマンドがインストールされる。
適当にPATHを設定してください。

# 設定ファイルを用意 config.yaml

```yaml
common:

  database: "mysql://root@127.0.0.1/information_schema"

exports:

  - query: "SELECT * FROM COLLATIONS"
    filename: "collations.json"
    format: json
```

# 実行&結果

```shell-session
$ datafreeze config.yaml
```

`cat collations.json`

```json
[{"COLLATION_NAME": "big5_chinese_ci", "CHARACTER_SET_NAME": "big5", "ID": 1, "IS_DEFAULT": "Yes", ...
```

# もっと詳しく

## プログラミングインターフェイス
ライブラリとしてimport しても使えます。

```python
import dataset

db = dataset.connect('mysql://root@127.0.0.1/information_schema')

for table in db.tables:
    result = db[table].all()
    dataset.freeze(result, format='json', filename='{0}.json'.format(table))
```

## See also
かわいいキャラクターつき公式ドキュメントがあります。
[dataset: databases for lazy people](https://dataset.readthedocs.org/en/latest/)

内部的には [SQLAlchemy](http://www.sqlalchemy.org/) が使用されています。

dataset そのものの記事も書きました。
[Python - 怠惰な人のための超お手軽 ORマッパー dataset - Qiita](http://qiita.com/shoma/items/59c9c907e8f217ab7b14)
chef-provisioning-awsでEBSボリュームを追加してみた

なんかこう、READMEはあんまりなんも書いてなくて色々できないのかなと思ってたら
公式のリソースマニュアルにがっつり書いてあって色々できそうだったのでちょっとEBSボリュームをつくってみました。
https://docs.chef.io/provisioning.html

EBSつくるくらいなら意外と気軽にできました。
そのうちVPCとかroute53もやってみたい気がしてます。
（頻度がないと手でやったほうが早いけど記録残す見える化的にはいいかもくらい）

### installとクレデンシャル指定

```
gem install chef-provisioning chef-provisioning-aws
gem list chef

*** LOCAL GEMS ***

chef (12.2.1)
chef-config (12.5.1)
chef-provisioning (1.5.1)
chef-provisioning-aws (1.7.0)
chef-zero (4.3.2, 4.2.0)
cheffish (1.6.0)

export AWS_CONFIG_FILE=/root/.aws/credentials 
export AWS_DEFAULT_PROFILE=hoge
```

### recipe作成

```
cd ~/chef_repo
cat ./site-cookbooks/fluentd/recipes/create-ebs.rb
------------------------------------------------------------
## fluentd::create-ebs
## 実行するには２つgemが要ります（chef-provissioning,chef-provisioning-aws)
require 'chef/provisioning/aws_driver'

with_driver 'aws::ap-southeast-1'

aws_ebs_volume 'EBS_data_log1' do
  availability_zone             'a'
  device                        '/dev/xvdf'
  encrypted                     false
#  iops                          3072 ##gp2はiopsオプションをサポートしていない
#  machine                       '' ##特定のインスタンス指定方法が良くわかってない
  size                          1024
  volume_type                   'gp2'
#  aws_tags :Name => 'EBS_data_log1'
end

aws_ebs_volume 'EBS_data_log2' do
  availability_zone             'b'
  device                        '/dev/xvdf'
  encrypted                     false
#  iops                          3072 ##gp2はiopsオプションをサポートしていない
#  machine                       '' ##特定のインスタンス指定方法が良くわかってない
  size                          1024
  volume_type                   'gp2'
#  aws_tags :Name => 'EBS_data_log2'
end
------------------------------------------------------------
```

### 実行

```
cd ~/chef_repo
chef-client -z ./site-cookbooks/fluentd/recipes/create-ebs.rb
```

### attach以降は手動

```
sudo fdisk -l
sudo mkfs.ext4 /dev/xvdf

sudo vi /etc/fstab
/dev/xvdf /opt/data ext4 defaults 0 0

sudo service td-agent stop
mv /opt/data/systemlog /tmp/

sudo mount -a
df -h /dev/xvdf

sudo mv /tmp/systemlog /opt/data/
ls /opt/data/
sudo service td-agent start
sudo view /var/log/td-agent/td-agent.log
```

### わかったこととわからないこと

・aws_tagsでvolumeがもうないエラーでるのでコメント化（Nameタグはリソース名の後ろに指定した名前がつくっぽい）
・gp2はiopsオプションをサポートしてない（エラーでとまる）
・勝手にdata_bagsがつくられてリソースに指定した名前のjson内にvolume_idがかかれる（それにより冪等になるようで2度目の実行では作られない）
・勝手にknife.rbがchef-zeroっぽく上書きされるしダミー鍵が作られてた
・インスタンスIDはたぶんdata_bagsとかnodeに書く気がするけどよくわかってない
・マシン関連リソース見ると作った後になんか実行とかできそうだから初期化とマウントとかがんばればできるかもしれない（たぶん）

### 参考
http://blog.serverworks.co.jp/tech/2015/12/29/chef-provisioning-aws/
https://docs.chef.io/provisioning.html#aws-ebs-volume
https://docs.chef.io/provisioning.html
https://github.com/chef/chef-provisioning-aws
http://qiita.com/TsuyoshiUshio@github/items/1efa799733fae7675952
ストアアップロード時に「Cannot verify client」エラーが発生する

## 前書き

XcodeのOrganizerから新規アプリを「Upload to App Store...」したところ、
以下のようなエラーが出て何度繰り返してもアップロードできませんでした。

> iTunes Store operation failed
> Cannot verify client


いろいろ調べたところ、

* Xcodeを再起動する
* Cleanして再ビルドする
* 何度か繰り返してみる

などの解決方法がありましたが解消されませんでした。

## 解決方法

Xcode 7.1 “iTunes store operation failed you are not authorized to use this service”
http://stackoverflow.com/questions/33314221/xcode-7-1-itunes-store-operation-failed-you-are-not-authorized-to-use-this-serv

こちらの回答の一つとしてあった、Application Loaderを利用する方法でアップロードに成功しました。もしかすると、ipaのサイズが巨大過ぎたのが原因かもしれません。

> 1. Archive
> 2. Export
> 3. Xcode menu --> Xcode --> Open Developer Tool --> Application Loader
> 4. Double click "Deliver Your App" and choose the file exported in step #2
> 5. click next and follow the instructions until the end

まず通常通りにArchiveした後で、AppStore用にExportします。
![ss1.png](https://qiita-image-store.s3.amazonaws.com/0/34166/69bfa0e9-aa13-efa4-bdd7-17f4f40cf238.png)

![ss2.png](https://qiita-image-store.s3.amazonaws.com/0/34166/fe65ef8d-3055-69c0-09a5-dc12cb643720.png)

XcodeのメニューからApplication Loaderを起動します。

![スクリーンショット 2016-01-20 17.43.04.png](https://qiita-image-store.s3.amazonaws.com/0/34166/61bb6a38-82a9-6891-f7b1-93033d253bd9.png)

あとはExportしたipaを、「Deliver Your App」（App をデリバリ）から選択すればアップロードできます。
jQueryでDOMのappendを爆速化（１５０倍界王拳）

複数選択セレクトボックスを２つ並べて、未選択＜＞選択済　とやりとりするようなプログラムを作ってたんですよ

まあだいたいこんなかんじ

```html
<select id="#notSelected">
  <option value="1">りんご</option>
  <option value="2">ごりら</option>
  <option value="3">らっぱ</option>
</select>
<input id="buttonSelect" type="button" value="選択する" />

<select id="#selected">
</select>
<input id="buttonCancel" type="button" value="未選択に戻す" />
```

ほんでこんなかんじのjsかくよね　まあほんとは重複チェックとかいろいろ面倒な処理とかあるけどだいたいこんなかんじ

```js
$("#buttonSelect").on("click", function() {
  var options = $("#notSelected").find("option:selected");
  $("#selected").append(options);
});

$("#buttonCancel").on("click", function() {
  var options = $("#selected").find("option:selected");
  $("#notSelected").append(options);
});
```

ほんでこれがめっちゃ重いわけ　候補が数百件とか数千件とかあると、全件移動すると数分とかかかるわけ　具体的には４０００件で８０秒くらいかかる！　これさすがにお客さんに納品できないよね！　どうしよう！

```js
$("#buttonSelect").on("click", function() {
  var html = "";
  $("#notSelected").find("option:selected").each(function(i){
    html += '<option value="' + $(this).val() + '">' + $(this).text() + '</option>'
    $(this).remove(); // 移動元から削除
  });
  $("#selected").append(html);
});
```

０．５秒になった！　はやすぎ！！！！　富豪的プログラミングするほどセレブじゃなかった！　ぜんぜん圧倒的に貧乏人だったわ！！！！！！！

イジョーーーー！！！！！１１１１


　　　　　　　　　 ξ 
　　　　　　　　ξξξ 
　　　　　　　　ξ・・ξ 
　　　　　　　　ξ | ξ 
　　　　　　　　ξ o ξ　 
　　|￣￣￣￣.　￣　￣￣￣￣| 
　　.￣￣￣￣|　　　.|￣￣￣￣ 
　　　　　　　　|　 _　 | 
　　　　　　　／／ ＼＼ 
　　　　　　　|　|　　　|　| 
　　　　　　　|　|　　　|　| 
　　　　　　／　)　　 (　 ＼ 
　　　　　 ￣￣　　　 ￣￣
Qiitaっぽいpotmumのdockerイメージ作った

potmum(ぽっとまむ)

* @ru_shalm さんが作られた
    * [Qiitaっぽいメモアプリをつくってる話 - 鳥小屋.txt](http://torigoya.hatenadiary.jp/entry/potmum)
    * https://github.com/rutan/potmum

## 特徴

* 
開発が続いている

* Rails
* 全文検索に対応
* 画像のUPLOAD対応
    * ./public/attachment_files/1453(略)6d2.png のように保存される
* 編集履歴
* エディタ領域の自動インデント等

無い機能

* 自動保存
* 
下書き

* 自分の投稿のストック機能

## 動かし方

```bash:
git clone https://github.com/tukiyo/dockercompose-potmum.git potmum
cd potmum
cp -a db/production.sqlite3.empty db/production.sqlite3
docker-compose up -d

docker-compose exec potmum bundle exec rake db:migrate
```

## omniauth

2020年11月時点ではomniauthが使えなくなっているっぽいので、
`USE_DEVELOPER` でログインするのがよいです。

![スクリーンショット_2020-11-04_07-14-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/20b9f861-405d-d34d-dd9c-c1c44ef7b8a2.png)

ここで1個アカウントを作ります。

```go:docker-compose.yml
environment:
  USE_DEVELOPER: 1
```

アカウントを引き継ぐには、`authentications`テーブルを修正する必要があります。
Githubからdeveloperに変更するには以下。

* まず普通にpotmumの右上ログインから``

* `authentications.provider`
    * `github`から`developer`へ
* `authentications.uid`
    * `数値`から`ログインID`へ。（例: `admin1`）
* `users`テーブルに追加された分はdeveloperで作ったものは削除して良いです。

sqlite3を編集するには`sqlitebrowser`が便利です。
`apt install -y sqlitebrowser`で入れられます。


### 古い情報

ログインし投稿するためにはGithubかSlack,Twitter連携、もしくは`USE_DEVELOPER`が必要。

* https://github.com/settings/developers

![スクリーンショット_2017-04-13_08-19-31.png](https://qiita-image-store.s3.amazonaws.com/0/25728/023fb34c-91fc-cc98-2329-f9363a02467b.png)

* slack
    * [RailsでSlackのOAuth認証でログインしてみる - 動かざることバグの如し](http://thr3a.hatenablog.com/entry/20151204/1449240576)
    * [Slack API: Applications | Slack](https://api.slack.com/applications)
* twitter
    * [Twitter Application Management](https://apps.twitter.com/)

* http://localhost:30000/ にアクセスしログインできることを確認。


## バックアップ対象

* db/production.sqlite3
* attachment_files/


## テーブル説明

* articles : 記事のタイトル
* revisions : 記事の内容

```sql:記事の一括出力
SELECT
  a.id
, a.title
, a.created_at
, r.tags_text
, r.body
FROM articles AS a
LEFT JOIN (SELECT MAX(id), article_id, tags_text, body FROM revisions GROUP BY article_id) AS r
ON a.id = r.article_id
```

* `sqlitebrowser`を使うと便利。`apt install -y sqlitebrowser`

## 2020年現在、自分が使用しているイメージ

* `tukiyo3/potmum:20170807`
pythonコマンドラインで方向キーが使えないときの対応メモ

#はじめに
virtualenv等でpythonの環境を新しく構築するたびに「どうやるんだっけ？」と検索し直していたので、とりあえず自分用のメモ。

#前提条件
今回はvirtualenvは使わず、プリインストール版のpythonにinstallします。

#環境
mac os 

#インストール
`sudo pip install readline`
これだけです。

#注意点
ただ、注意点もあります。

例えば、自分の環境に複数のバージョンのpythonをインストールしていたとして
下記の場所にpythonが散らばっていたとします。
```
/usr/bin　
/usr/local/bin 
```
で、PATHの読み込み順番の関係で「/usr/local/bin」が優先で呼ばれる場合
readlineをインストールしてもその機能は反映されません。
pipでの通常installでは「/usr/bin」に対してインストールされるようです。

これ「usr/local/bin」のpythonにもinstallさせる方法ってあるのかな？
もしくは、こんな感じにpythonを色々インストールするのはだめなのかも。
解る人いたら教えて下さい。
[Vagrant]共有フォルダのマウントに失敗

vagrant up時の共有フォルダマウントで以下のエラーが出てマウントに失敗する場合がありました


>==> default: Mounting shared folders...
>    default: /vagrant => {ホストOSの共有フォルダ}
>Failed to mount folders in Linux guest. This is usually because
>the "vboxsf" file system is not available. Please verify that
>the guest additions are properly installed in the guest and
>can work properly. The command attempted was:
>
>mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
>mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant
>
>The error output from the last command was:

>/sbin/mount.vboxsf: mounting failed with the error: No such device


* 仮想マシンは起動出来ている
* ホスト側の共有フォルダにはファイル等は残っている状態

# 解決法

以下の２つの記事を参考にさせて頂きました

VirtualBoxの/vagrantがマウントに失敗
http://tech.withsin.net/2015/07/10/virtualbox-vagrant-mount-fail/

[Sy] 【解決した】Vagrantでvagrant-vbguestを使ってたら共有フォルダのマウントに失敗する
http://www.utano.jp/entry/2014/11/vagrant_guest_additions_update_error

---

Guest Additionsの再インストール

~~~
$ vagrant plugin install vagrant-vbguest
~~~

ゲストOSを再起動

~~~
$ vagrant reload
    失敗
~~~

シンボリックリンクを貼り直してみる

~~~
$ ls -l /sbin/mount.vboxsf
    /sbin/mount.vboxsf -> /usr/lib64/VBoxGuestAdditions/mount.vboxsf

$ ls -l /usr/lib/VBoxGuestAdditions/mount.vboxsf
    /usr/lib/VBoxGuestAdditions/mount.vboxsf

$ sudo rm /sbin/mount.vboxsf
$ sudo ln -s /usr/lib/VBoxGuestAdditions/mount.vboxsf /sbin/mount.vboxsf
~~~

ゲストOSを再起動

~~~
$ vagrant reload
    失敗
~~~

カーネルを再インストール

>The missing package can be probably installed with
>yum install kernel-devel-2.6.32-573.12.1.el6.x86_64
>
>Building the main Guest Additions module[失敗]

`kernel-devel-2.6.32-573.12.1.el6.x86_64`をインストール出来ないと言われていたので
ネット上からダウンロード出来るURLを探して来ました。

ゲストOSで次のコマンドを実行

~~~
sudo yum install ftp://ftp.pbone.net/mirror/ftp.scientificlinux.org/linux/scientific/6.7/x86_64/updates/security/kernel-devel-2.6.32-573.12.1.el6.x86_64.rpm
~~~

インストールされたか確認

~~~
$ ls /usr/src/kernels/
    2.6.32-573.12.1.el6.x86_64
~~~

Guest Additionsを再ビルド

~~~
$ sudo /etc/init.d/vboxadd setup
~~~

ゲストOSを再起動

~~~
$ vagrant reload
~~~

>    default: /vagrant => {ホストOSの共有フォルダ}
>==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
>==> default: flag to force provisioning. Provisioners marked to run always will >still run.

無事マウント出来ていることを確認
docker-machineでvirtualboxに仮想マシンを作って再起動したらdockerコマンドが外から実行できないとおもったとき

# 概要

docker-machineで作った仮想マシンの再起動後、
仮想マシンに対して次のような感じのコマンドが実行できない時がある

```sh
docker $(docker config testcontainer) ps
```

# 結論

docker stop, docker start したら、docker regenerate-certs もする。

# 記録

docker-machineで作った仮想マシンの再起動後、
次のような感じのコマンドが実行できない時がある

```sh
docker $(docker config testcontainer) ps
```

そのときのログはこんな感じ

```console
$ docker $(docker config testcontainer) ps
docker: 'config' is not a docker command.
See 'docker --help'.
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
```

調べたら次のようなかんじで、certsを作りなおせば良さそうだった

```sh
docker-machine regenerate-certs testcontainer
```

実際に特定のdocker-machineで作ったマシンを再起動するなると
つぎのような感じ

```sh
docker-machine stop testcontainer
docker-machine start testcontainer
docker-machine regenerate-certs -f testcontainer
```

再起動用のスクリプトがあってもよいかもしれない。

***docker-machine-reboot*** 仮想マシン名

```bash
#!/bin/bash
docker-machine stop $1
docker-machine start $1
docker-machine regenerate-certs -f $1
```
UITabbarControllerに配置した複数のWKWebViewをプリロードする

UITabbarControllerを使って、各タブにWKWebWiewを配置！


配置したはいいけれど、タブ切り替え時にwebviewをロードするのでは、タブ切り替えごとに待ちが発生しユーザーエクスペリエンスが損なわれること甚だしいです。

なんとか各タブをプリロードできないか頑張った結果、できました。

- 解決方法

AタブのViewController#viewDidLoad内でBタブを読み込む

```ATabViewController.swift
   override func viewDidLoad() {
        super.viewDidLoad()
      .
      .
      .
        let myViewControllers = self.tabBarController!.viewControllers
    _ = (myViewControllers![1] as! BaseController).view // 1...B TAB index
 
```

これでViewController初期化処理内でWKWebViewを初期化していればBタブのwebviewの内容がプリロードされます。

お試しあれ。
スパッと空のファイルを作成する

スパッとつくりたいとき専用。

- コメントでコンストラクタを使用するとワンライナーで書けるとのことで改訂しました。


## 改訂版

```cpp
#include <fstream>

// 一時変数もつくらないので最速っぽい。
std::ofstream(path_to_file);

```

みじかい！よい！

## 初回版

```cpp
#include <fstream>

std::ofstream strm;
strm.open(path_to_file);
strm.close();
```
写真をプレビュー表示する


##概要

###File API

input[type="file"]のfilesプロパティでFileListオブジェクトを参照することができる。

FileListオブジェクト

```javascript:FileListオブジェクト
FileList { 0: File, length: 1, item: function }
 
// FileListを展開
{
  0: File
  length: 1
}
 
// Fileを展開
{
  0: {
    lastModifiedDate: Sat Jun 22 2013 23:45 GMT+0900 (JST),
    name: "image.jpeg",
    size: 33792,
    type: "image/jpeg"
  },
  length: 1
}
```

###FileReader API

Fileオブジェクトのファイルを実際に読み込む為のAPI

使用手順

1. FileReaderコンストラクタをインスタンス化
2. readAsDataURLメソッドでファイルをDataURLとして読み込む
3. onload(読み込み完了)のタイミングでresultメソッドで取得

##例

```coffeescript
$ ->
	# 1.ファイルを選択したタイミングで実行する関数を設定
	$('.fileInput').change ->
		# 2. 選択されたファイルがない場合は何もせずにreturn
		if !@files.length
			return

		file = @files[0] # 3.files配列にファイルが入っています
		$_img = $(this).siblings('img') # 4. jQueryのsiblingsメソッドで兄弟のimgを取得
		reader = new FileReader() # 5. ファイルを読み込むFileReaderオブジェクト

		if file.type isnt 'image/jpeg'
    		alert('選択できるファイルは10KB以下のJPEG画像だけです。')
    		@value = ''
    		return

    	else
    		# 6. 画像読み込み
			reader.readAsDataURL(file)
			# 7. 読み込みが完了した際のイベントハンドラ。imgのsrcにデータをセット
			reader.onload = (e)->
				# 読み込んだデータをimgに設定
				$_img.attr('src', e.target.result)
				return
				
		return
```

##参考
https://app.codegrid.net/entry/file-api-filereader-api
画像をモーダルウィンドウで表示してDBに保存


##準備
bootstrap
carrierwave

##1. モーダルウィンドウの作成

注)モーダルから直接DBに保存するにはform_forの中に記述する

```html.erb
<%= form_for(@product) do |f| %>
  <!-- モーダル表示領域 -->
  <div id="auto_modal" class="modal fade">
    <div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
          <h4 class="modal-title">Modal title</h4>
        </div>
        <div class="modal-body" align="center">
          <img id="modal_img" src="" alt="" />
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
          <%= f.submit class: "btn btn-primary" %>
        </div>
      </div><!-- /.modal-content -->
    </div><!-- /.modal-dialog -->
  </div><!-- /.auto_modal -->
  
  ...
  
  <%= f.label :image %><br>
  <%= f.file_field :image, class: "fileInput" %>
  <%= f.hidden_field :image_cache %>
<% end %>
```


##2. jqueryでモーダルウィンドウ表示

```CoffeeScript
# 1.ファイルを選択したタイミングで実行する関数を設定
	$('.fileInput2').change ->
		
		# 2. 選択されたファイルがない場合は何もせずにreturn
		if !@files.length
			return
		file = @files[0] # 3.files配列にファイルが入っています
		$_img = $('#modal_img') # 4. 画像表示領域を取得
		reader = new FileReader() # 5. ファイルを読み込むFileReaderオブジェクト

		if file.type isnt 'image/jpeg'
    		alert('選択できるファイルは10KB以下のJPEG画像だけです。')
    		@value = ''

    	else
    		# 6. 画像読み込み
			reader.readAsDataURL(file)
			# 7. 読み込みが完了した際のイベントハンドラ。imgのsrcにデータをセット
			reader.onload = (e)->
				# 読み込んだデータをimgに設定
				$_img.attr('src', e.target.result)
				return
			
		# 8. モーダルウィンドウ表示
		$('#auto_modal').modal('show')
		return
```