OmniAICreator/Qiita-1.07M huggingface dataset:
Mastodonの開発環境の構築まとめ

Mastodonの開発環境の構築方法をざっくりまとめました。
対象は2017/05/04以降のmasterブランチです。

# Vagrantを使う
Vagrantを使う場合は非常に簡単に開発環境を構築できます。
[Vagrant-guide.md](https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Vagrant-guide.md)に詳しく書かれているので読むといいでしょう。

まずは、あらかじめVirtualBoxやVagrantが使えるようにしておきます。
Vagrantを使った開発環境では、`mastodon.dev`というホスト名でアクセスできるようにhostsファイルを書き換えます。そのため、hostsファイルを書き換えるためのプラグインをインストールしておく必要があります。

```bash
$ vagrant plugin install vagrant-hostsupdater
```

次にcloneしてきたMastodonのディレクトリで以下のコマンドを実行して仮想マシンを起動します。

```bash
$ vagrant up
```

するとUbuntuのダウンロードやパッケージのインストールなどが実行されます。
`vagrant up`だけではアプリケーションサーバは起動しないので、以下のコマンドを実行します。

```bash
$ vagrant ssh -c "cd /vagrant && foreman start"
```

すると、Railsのサーバとストリーミングサーバ、webpack-dev-serverがforeman経由で起動します。
http://mastodon.dev (または http://localhost:3000 )にアクセスすることでページを見ることができます。

ローカルのMastodonのディレクトリは仮想マシン内の`/vagrant`にマウントされています。
そのため、Rails関連のコードを変更した場合は自動的に読み込まれるため、基本的にはforemanの再起動などは必要ありません。
しかし、データベースのマイグレーションや、gemやnpmのパッケージの更新が必要な場合は、
`vagrant ssh`で仮想マシン内に入ってコマンドを実行する必要があります。


# ローカルで開発環境を構築する
ローカルで開発環境を構築する場合、PostgreSQLとRedisが必要になります。
ローカルにこれらのサーバを立てたくない場合は、Dockerを使うと便利です。

以下の`docker-compose.dev.yml`をローカルに作成して起動します。

```yaml:docker-compose.dev.yml
version: '2'
services:
  db:
    restart: always
    image: postgres:alpine
    ports:
      - "5432:5432"

  redis:
    restart: always
    image: redis:alpine
    ports:
      - "6379:6379"
```

```bash
$ docker-compose -f docker-compose.dev.yml up -d
```

これでPostgreSQLとRedisが立ち上がります。


次に、RailsやストリーミングサーバからPostgreSQLとRedisのサーバを指定するために`.env`ファイル作成します。
ローカルのPostgreSQLとRedisを使用する場合は適宜値を変更してください。

```text:.env
DATABASE_URL=postgres://postgres:@localhost:5432
REDIS_HOST=localhost
REDIS_PORT=6379
```

設定が終わった後はデータベースのセットアップを行います。
通常であれば`bin/rails db:setup`を実行するだけなのですが、testデータベースを作成するときに`DATABASE_URL`が反映されないため途中で落ちてしまいます。([rails/rails/issues/28827](https://github.com/rails/rails/issues/28827))
なので、以下のように一つづつコマンドを実行します。(testデータベースに関してエラーが出ますが、無視しましょう)

```bash
$ bin/rails db:create
$ bin/rails db:schema:load
$ bin/rails db:seed
```

最後に、以下のコマンドを実行してアプリケーションを起動します。
(foremanをインストールしてない場合は`gem install foreman`でインストールしましょう。)

```bash
$ foreman start
```

Vagrantを使用する場合と同様に、Railsのサーバとストリーミングサーバ、webpack-dev-serverがforeman経由で起動します。
ページは http://localhost:3000 にアクセスすることで見ることができます。(http://mastodon.dev にはアクセスできません。)

# あとがき
Vagrantを使用する方法と、ローカルで動かす方法を紹介しました。
個人的におすすめするのは、PostgreSQLとRedisをDockerで動かしつつ、アプリケーションをローカルで実行する方法です。
VagrantだとCPUやメモリの制限もありますし、マイグレーションやパッケージの更新を行うために`vagrant ssh`を実行する必要があるので、少し面倒だと思っています。
ローカルで実行する場合はそういった面倒な部分はないのでオススメです。
Bash On Ubuntu On Windowsに最新のrubyを入れる

# Rubyのバージョンが古い
Bash On Ubuntu On Windowsを入れた後で以下のコマンドを入力するとrubyが入る。

```Bash:
sudo apt-get install ruby
```
ただし、バージョンは1.9.3

```
ruby -v
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]
```

# 新しいRuby、入れたくない？
デフォルトで入っているリポジトリが古いRubyしか提供していないので
以下のコマンドでリポジトリを追加する。

```Bash
sudo apt-add-repository ppa:brightbox/ruby-ng
sudo apt-get update
```
リポジトリが追加されたら以下のコマンドで好きなバージョンのRubyを入れる。
現在(2017/05/05)安定している最新版は2.4.1なのでそれを入れる。

```Bash
sudo apt-get install ruby2.4 ruby2.4-dev
```

```Bash
ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux-gnu]

```
:dancer::dancer::dancer::dancer::dancer::dancer:
haskellでBayes

stackでHackageにないパッケージの管理

haskellで[monad-bayes](https://github.com/adscib/monad-bayes)パッケージを使おうと思ったらうまく行かなかった。haskell-platformでインストールされるcabalを用いてインストールする場合

```
apt-get install haskell-platform
cabal update 
cabal install hmatrix

git clone https://github.com/adscib/monad-bayes
cd monad-bayes

cabal configure
cabal sdist
cabal install dist/monad-bayes-0.1.0.0.tar.gz
```

```:Prelude
Prelude> import Control.Monad.Bayes.Class
Prelude Control.Monad.Bayes.Class> 
```

しかし、コメント頂いた様にstackで管理するほうが良い。この場合、プロジェクトごとにパッケージを指定する。githubにアクセスする方法とローカルのリポジトリを指定する方法がある。

githubにアクセスする方法

```:stack.yaml
packages:
    - '.'
    - location:
        git: git@github.com:adscib/monad-bayes.git
        commit: "1a9fc60cf9f8529b336667e3878e7d853be291cc"
    extra-dep: true
```

ローカルのリポジトリにアクセスする方法(プロジェクトディレクトリの直上にローカルリポジトリがある場合)

```:stack.yaml
packages:
    - '.'
    - location:
        "../monad-bayes"
    extra-dep: true 
```
OGPの設定(SNSでシェアしたときの見せ方)とデバッガーについて

#　きっかけ

仕事でも少し触れる機会があったのですが、プライベートの方で真面目に設定することになったので、調べてみました。

# OGPとは

Open graph protocolの略です。 [こちらが本家のサイト](http://ogp.me/)です。

ざっくりと、FacebookなどのSNSにリンクをのせたときに、下記のように専用の画像と説明文などを見せる仕組みのことです。

![スクリーンショット 2017-05-05 0.59.02.png](https://qiita-image-store.s3.amazonaws.com/0/9880/08a36505-1af3-3c42-edfe-9f14a7e27676.png)

これをうまく利用して、商品やチラシの画像・説明をのせて、興味をよりもたせやすくするという寸法です。
もう方法が確立しているので、HPなりECサイトなりをつくった場合はもはや必須といえるかもしれません。

# サンプルソース 

ここでは、facebookとtwitter cardのついてのサンプルを出します。

```
<head>
        <meta property="og:type" content="website" />
        <meta property="og:url" content="http://examle.com">
        <meta property="og:title" content="">
        <meta property="og:description" content="home">
        <meta property="og:image" content="http://examle.com/sample.png">
        <meta property="fb:app_id" content="[15桁の数字]" />
        <meta name="twitter:card" content="summary">
        <meta name="twitter:site" content="‎@[ツイッターのアカウント名]">
        <meta name="twitter:title" content="home" />
        <meta name="twitter:description" content="説明文" />
        <meta name="twitter:image" content="http://example.com/test.png" />
</head>
```

LINEもog:xxxに対応しているので、上記の設定でいけるようです。

# デバッガーサイト

設定したことによって、実際どういう風に見えるかを確認するには、デバッガーサイトが便利です。
設定不足がある場合はそれも警告だしてくれるので、その意味でとてもありがたいです。
使うためには、それぞれ、facebook,twitterへのログインが必要です。

* [Facebook] https://developers.facebook.com/tools/debug/sharing
* [Twitter] https://cards-dev.twitter.com/validator

## facebookの場合

![スクリーンショット 2017-05-05 1.11.03.png](https://qiita-image-store.s3.amazonaws.com/0/9880/e68981f6-5bb8-8efe-931c-654348cafa8a.png)

## twitterの場合

![スクリーンショット 2017-05-05 1.12.54.png](https://qiita-image-store.s3.amazonaws.com/0/9880/d854046b-7f03-c573-3340-8e74b6c26d1d.png)


## 画像サイズ

それぞれの公式サイトに、画像サイズの最大・最小の仕様があります。
metaタグに設定したものが、その条件にあわない場合、そのページ内で条件に合致する画像がどうも表示されるようです。（おそらく最初の方？）

例えば、facebookの場合は、200×200が最小です。
og:imageで指定した画像のサイズが100×100だと、条件にあわないので表示されません。
そうすると、そのページ内のimgタグのうち、200×200を超えたものが表示されるようです。クローラーが最初に見つけたものとかしれませんが、ちょっと規則が読めないです。

# 参考サイト

* http://qiita.com/naogify/items/5def39c2290b75c355cc
* http://qiita.com/moroi/items/cc1ab014aa654cdd3c90
* http://qiita.com/rettytak/items/8e0177f9d4788e1f1b54
* https://ferret-plus.com/610
* http://webdesign.practice.jp/ogp-facebook-twittercards
* http://cocoa-inc.jp/2011
* http://qiita.com/mo4_9/items/671d164cb48314d70d28
macに rbenvで ruby開発環境構築

sinatraを勉強したくなったので、rubyに手を出してみることにした。

## ruby開発環境構築

#### rbenv（ruby本体のバージョン管理ツール）のインストール

```bash
$ brew install rbenv ruby-build
$ rbenv install -l # インストールできるバージョンの確認
$ rbenv install 2.3.4
$ nano ~/.bash_profile
```

```bash:.bash_profile
[[ -d ~/.rbenv  ]] && \
  export PATH=${HOME}/.rbenv/bin:${PATH} && \
  eval "$(rbenv init -)"
```

ここまでで環境構築は完了です。

#### sinatra関連ライブラリのインストールとサンプル実行

```bash
$ gem install sinatra
$ gem install sinatra-contrib
$ gem install activerecord
$ gem install sqlite3
```

```ruby:main.rb
require 'sinatra'
require 'sinatra/reloader'
 
get '/' do
    "<h1>Hello Sinatra<h1>"
end
 
get '/login' do
    "<h1>Hello from login<h1>"
end
```

```bash
$ ruby main.rb
```

## おまけ: bundler（ライブラリを特定のディレクトリに入れるためのツール）

#### bundlerのインストール

```bash
$ gem install bundler
$ rbenv rehash
$ bundler init
```

#### Gemfile(入れたいライブラリを記述するファイル）の生成 

```bash
$ bundler init
$ ls
Gemfile
```

#### Gemfileの編集

>参考: [Gemfileの書き方](http://railsdoc.com/references/gemfile)

```
$ nano Gemfile
```

```ruby:Gemfile
# frozen_string_literal: true
# A sample Gemfile
source "https://rubygems.org"

gem 'cocoapods' , '0.39.0'
```

#### 記述したライブラリのインストール

```bash
$ bundle install --path vendor/bundle
```
オレオレLinux Mint

# about
オレオレ流LinuxMintカスタマイズ
基本的にデスクトップPCとして使う人向けです。
Linux Mint 18を想定しています。
Linux Mint 17だとphp7のインストール方法がまた違うので注意

# LinuxMintのインストール
https://www.linuxmint.com/
チュートリアルに沿って

# 基本的なソフトのインストール
## vim
`sudo apt-get install vim`

カスタマイズ
`~/.vimrc`を開く
```
set number
set tabstop=4
```

## firefox
デフォルトで検索エンジンがDuckDuckGoなのでGoogleの犬になるべくGoogleに変えます。
検索 -> 検索エンジンの変更 -> 検索エンジンを追加 -> 「Commercial engines」のGoogleアイコンをクリック -> 検索 -> Googleの追加
ここは非常にわかりにくいのでここを参考に
https://itneko.blogspot.jp/2014/06/linux-mint-17-matefirefoxgoogle.html

## Slack
https://slack.com/downloads/linux

## ソフトウェアの管理よりインストール
* geany
* mikutter
* gFTP
* Dropbox

## node.js関連
# nvm
`git clone https://github.com/creationix/nvm.git ~/.nvm`
`source ~/.nvm/nvm.sh`

Node.js公式を参考にして最新安定版を取得
https://nodejs.org/

`nvm install ***`
`nvm use ***`

ログイン時に自動的に有効化する。
`~/.bash_profile`を開く
```
source ~/.nvm/nvm.sh
nvm use ***
```
を記述

# LAMP（Apache,Mariadb,PHP5）インストール
## Apache2
`sudo apt-get install apache2`
ブラウザのURLバーに`localhost`と入れてデフォルトページが出ることを確認

## mariadb
`sudo apt-get install mariadb-client`
`sudo apt-get install mariadb-server`
初期設定
`sudo mysql_secure_installation`
ログイン確認
`sudo mysql -u root -p`

## php7
`sudo apt-get install php7.1 php7.1-fpm php7.1-mysql php7.1-gd php7.1-mbstring libapache2-mod-php7.1 libcurl3 php7.1-curl`
PHPのバージョン確認
`php --version`
ApacheでPHPを動かせるようにする。
テストコードを貼り付けてブラウザで確認
`<?php phpinfo(); ?>`

# サーバとして使用する際
## samba
https://qiita.com/msrks/items/1385cf13258dd1a0da08
・ portの解放方法
http://wiki.samba.gr.jp/mediawiki/index.php?title=Samba_%E3%82%92%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB%E8%B6%8A%E3%81%97%E3%81%AB%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B
## mail
## DLNA
## owncloud
```
sudo mysql -u root -p
create database owncloud
create user 'ownclouduser'@'localhost' identified by pass;
grant all n owncloud.* to 'ownclouduser'@'localhost' identified by pass with grant option;
flush privileges;
```

# その他
## Libre Office 日本語化
`apt-get install libreoffice-help-ja`

## SSHサーバ
`sudo apt-get install openssh-server`
クライアントの方で公開鍵・秘密鍵を作成して、公開鍵をMintに送る。
LAN内で完結するなら公開鍵はいらないかも
詳しくは
http://qiita.com/ir-yk/items/af8550fea92b5c5f7fca

## FTPサーバ
### 今はSFTPがあるので不要かもしれないが、一応残しておく
`sudo apt-get install vsftpd`
でインストール
`/etc/vsftpd.conf`
で設定変更

## man日本語化
`sudo apt-get install manpages-ja`
## compiz
CompizConfigマネージャのインストール
`sudo apt install compizconfig-settings-manager compiz-plugins-extra`
`compiz --replace`で有効化
学習メモ：コンポジションと集約

## 概要
『オブジェクト指向における再利用のためのデザインパターン』を読んでいたら、「クラス継承よりもオブジェクトコンポジションを多用すること。」(P.31)とあった。

「コンポジション」についてあまり分かっていなかったので調べた。

## コンポジション
前述の本には、コンポジションについて下記の記述がある。

> 　オブジェクト指向システムにおいて、機能を再利用するためのよく知られた２つの技法に、クラス継承とオブジェクトコンポジションがある。（中略）
　オブジェクトコンポジションはクラス継承の代替案である。こちらの場合は、オブジェクトをまとめる、あるいは合成することによって、より複雑な新しい機能を得ることができる。オブジェクトコンポジションは、合成の対象となるオブジェクトが的確に定義されたインタフェースを有することを必要とする。（P.30）

> （コンポジションによって参照される）オブジェクトはインタフェースを通してのみアクセスされるので、カプセル化の概念を壊すことはないのだ。（中略）さらには、オブジェクトのインタフェースによってオブジェクトを実装できるので、実装依存度は低くなる。(P.31、()内引用者)

理解が正しいのかわからないのが、１つの巨大なクラスに機能を詰め込むよりも、小さな部品に分解してクラスとし、そのクラスをフィールドに持つほうが良い、という指針だと感じた。

１度巨大なクラスを作ってしまうと、その機能を再利用したいときには継承をするしかない。

だから、始めからそうならないように、分割してクラスを作っておく必要がある。

## コンポジションと集約

コンポジション（composition）と集約(aggregation)は、いずれもクラス間の関連を表現する用語だが、区別がつかなくなるときがある。

『オブジェクト指向のこころ』にわかりやすい例が書いてあった。

### コンポジション
> 保持されているものが保持しているものの一部である場合（自動車とそれを構成するエンジン等）。(P.29)

### 集約
> 独立して存在できる何かのコレクションがある場合（空港とそこに駐機されている飛行機等）(P.29)

## 参考文献
 * エリック ガンマ、ラルフ ジョンソン、リチャード ヘルム、ジョン プリシディース（1999）『オブジェクト指向における再利用のためのデザインパターン　改訂版』本位田　真一 / 吉田　和樹 監訳、ソフトバンククリエイティブ
 * アラン・シャロウェイ、ジェームズ・R・トロット（2014）『デザインパターンととともに学ぶ　オブジェクト指向のこころ』村上雅章訳、丸善出版
vagrantのcentos/7にguest additionsをインストール

# Overview
CentOS7の公式が出しているVagrant ImageにはGuest Additionsが入っていません。
このままではホストOSとゲストOS間で共有ディレクトリが同期されません。
これでは開発時に使い物にならないのでGuest Additionsをインストールしてあげます。

# Action

## 仮想マシンを初期化し必要なパッケージをインストール

```
vagrant init centos/7
vagrant up
vagrant ssh
sudo yum -y update
sudo yum -y install gcc kernel-devel bzip2
sudo reboot
```

## VirtualBoxのGUIで共有フォルダーを作成
* 設定->共有フォルダー->新規共有フォルダーを追加  
共有フォルダーのパスにはホストマシン側のディレクトリを指定  
永続化するにチェックをする

## 仮想マシンの光学ドライブにVBoxGuestAdditions.isoをマウント
  1. VirtualBoxのGUIから対象の仮想マシンを選択
  2. 設定->ストレージ->ストレージツリーの光学ドライブにVBoxGuestAdditionsをセット
  3. 仮想マシン内で以下のコマンドを実行

```
vagrant ssh
sudo su
mkdir /media/cdrom
mount /dev/cdrom /media/cdrom
cd /media/cdrom
sh ./VBoxLinuxAdditions.run
```

これでGuest Additionsがインストールされます

## Vagrantfileを編集

```
vi Vagrantfile
config.vm.synced_folder ".", "/vagrant", type:"virtualbox"
vagrant up --provider virtualbox
```

以上を実行し、仮想マシンを再起動すればGuest Additionsがインストールされているはずです。
SQL ServerのFileTablesでファイル格納先のルートパスを取得する方法

最近、SQL ServerのFileTablesを使う機会があって、ファイルを追加したい場合の格納先のルートディレクトリを取得する方法を調べました。

## 取得方法
下記のSQLを実行することで取得できます。
```select FileTableRootPath('対象のFileTable名');
```

## 参考
[SQL Server開発の利便性を向上させるFileTable／シーケンスオブジェクト／ページング機能-CodeZine](https://codezine.jp/article/detail/6602)

[Load Files into FileTables-docs.microsoft.com](https://docs.microsoft.com/en-us/sql/relational-databases/blob/load-files-into-filetables)
TiddlyWikiで記事を自動リンク

[TiddlyWiki](http://tiddlywiki.com/)はHTMLでできた個人用wikiです。

単語の自動リンク機能は、大文字から始まる英単語にリンクを貼るという仕様となっています。
しかし英単語にしか使えないし、対応する記事が無くてもリンクを貼ったりして使い勝手が悪いです。

そこで、英語であろうと日本語であろうと自動でリンクを貼ってくれて、対応する記事が存在する時のみリンクを貼られるように改造します。

1. 右側の「More」タブを選択。
2. 「System」タブを選択。
3. 「$:/core」タブを選択。
4. 「contentsタブを選択」。
![image](https://qiita-image-store.s3.amazonaws.com/0/176811/3c7addce-136a-d51c-6103-b48c17645de0.png)

5. 「$:/core/modules/parsers/wikiparser/rules/wikilink.js」を選択。
![image](https://qiita-image-store.s3.amazonaws.com/0/176811/ef79af6c-3869-8502-c105-4518f377fd00.png)
6. wikilink.jsの編集ボタンを押下。
何か警告がでますが、たぶん「これを編集してもアップグレード時に上書きされるよ」的な内容なので無視します。
![image](https://qiita-image-store.s3.amazonaws.com/0/176811/63f13061-238c-4731-da0e-55de3ffd84ee.png)
7. 26行目～30行目の記述を以下のように書き換えるます。

```
exports.init = function(parser) {
	this.parser = parser;
	// Regexp to match
	this.matchRegExp = new RegExp($tw.config.textPrimitives.unWikiLink + "?" + $tw.config.textPrimitives.wikiLink,"mg");
};

```
↓↓↓↓↓↓↓↓↓↓↓

```
exports.init = function(parser) {
	var tiddlerNames = $tw.wiki.getTiddlers().toString();
	this.parser = parser;
	// Regexp to match
	this.matchRegExp = new RegExp($tw.config.textPrimitives.unWikiLink + "?" + tiddlerNames.replace( /,/g , "|" ) ,"mg");
};
```

これで右上のチェックマークからwikiを保存してファイルを開き直せば、これで記事中に記事が存在する単語が入っていた場合に自動でリンクを貼ってくれるようになります。
![image](https://qiita-image-store.s3.amazonaws.com/0/176811/3fd0c302-9b8d-a7c7-2e23-d38d8a7c52e9.png)

ただし記事のタイプがデフォルトである「text/vnd.tiddlywiki」でないと自動リンクが貼られないので注意です。
【C言語】ログはファイルに出力したい

大きな開発になればなるほどログって本当に大事。
超簡単にだけどログ出力するソースどーん。

【ソース】
※定義とか出力用関数とかはヘッダや別ファイルに
 分けたほうがより良い。今回はめんどいので一つに。
※LOGディレクトリは作成済みの前提。

```test.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define TEST_OK  0     /* テスト関数戻り値(正常)*/
#define TEST_NG -1     /* テスト関数戻り値(異常)*/
#define LOG_FILE     "LOG/log.txt"        /* ログディレクトリ(通常)  */
#define ERR_LOG_FILE "LOG/err_log.txt"    /* ログディレクトリ(エラー)*/

FILE *log_file;        /* 通常ログ */
FILE *err_log_file;    /* 異常ログ */

/* 関数プロトタイプ宣言 */
int test_function(int num);                    /* テスト関数        */
void LOG_PRINT(char log_txt[256], ...);        /* 通常ログ出力関数  */
void ERR_LOG_PRINT(char err_txt[256], ...);    /* エラーログ出力関数*/

int main(void)
{

        int ret = TEST_OK;
        int num = 0;

        LOG_PRINT(">>> TEST START !!! \n");

        /* テスト関数起動 */
        ret = test_function(num);
        if(ret != TEST_OK)
        {
                ERR_LOG_PRINT("test_function() NG!\n");
                LOG_PRINT("<<< TEST NG END !!!\n");
                return TEST_NG;
        }

        LOG_PRINT("<<< TEST END !!!\n");

        return TEST_OK;
}

int test_function(int num)
{

        int ret = TEST_OK;
        LOG_PRINT(">>>>>> test_function() START !!! \n");

        if(num <= 0)
        {
                ret = TEST_NG;
        }

        LOG_PRINT("<<<<<< test_func() END !!!\n");
        return ret;

}

void LOG_PRINT(char log_txt[256], ...)
{

        time_t timer;
        struct tm *date;
        char str[256];

        /* 時間取得 */
        timer = time(NULL);
        date = localtime(&timer);
        strftime(str, sizeof(str), "[%Y/%x %H:%M:%S] ", date);

        if ((log_file = fopen(LOG_FILE, "a")) == NULL) {
                ERR_LOG_PRINT("file open error!!\n");
                exit(EXIT_FAILURE);        /* エラーの場合は通常、異常終了する */
        }

        /* 文字列結合 */
        strcat(str,log_txt);

        fputs(str, log_file);
        fclose(log_file); 

        return;

}

void ERR_LOG_PRINT(char err_txt[256], ...)
{
        time_t timer;
        struct tm *date;
        char str[256];

        /* 時間取得 */
        timer = time(NULL);
        date = localtime(&timer);
        strftime(str, sizeof(str), "[%Y/%x %H:%M:%S] ", date);

        if ((err_log_file = fopen("LOG/err_log.txt", "a")) == NULL) {
                printf("ERROR !!\n");
                exit(EXIT_FAILURE);        /* エラーの場合は通常、異常終了する */
        }

        /* 文字列結合 */
        strcat(str,err_txt);

        fputs(str, err_log_file);
        fclose(err_log_file); 

        return;

}
```

【結果】

```LOG/log.txt
[2017/05/05/17 00:05:00] >>> TEST START !!! 
[2017/05/05/17 00:05:00] >>>>>> test_function() START !!! 
[2017/05/05/17 00:05:00] <<<<<< test_func() END !!!
[2017/05/05/17 00:05:00] <<< TEST NG END !!!
```

```LOG/err_log.txt
[2017/05/05/17 00:05:00] test_function() NG!
```
複数のSFTPユーザで編集するときに注意したいこと

# きっかけ

複数ユーザで、あるwebサイトのドキュメントルートを編集することになり、そのときに気づいたことを整理してみました。。

# SFTPとファイルパーミッションとumask

状況として、共通のユーザグループXに属している複数ユーザが、SFTPで特定ディレクトリ以下を編集するというものです。

## ポイント1. グループ所有者の権限

この場合、グループ所有者に対する権限を常に適切に設定されてることが重要です。
新規作成時には、読み書きの権限（必要なら実行権限も）があり、既存のものに対してもその権限を維持する必要があります。

グループ所有者の書き込み権限が落ちると、他のユーザは編集も削除もできなくなります。

## ポイント2. ログインシェル + umaskでは対応できない

上の話からすると、デフォルトのパーミッションを決めるumaskでなんとかしようとなります。
今回のケースでは `umask 0002` とすることで、グループ所有者に、rw(x)の権限が付与されます。

まずはやるのは、ログインシェルでの対応です。
bashなら、.bashrcに `umask 0002` を追加すれば、ログインの度にデフォルトのパーミッションが設定されるので、sshログインの場合なら今回の目的は達成されます。

ですが、残念なことにsftpについてはこれではだめです。

## 結論. sftp-serverで対応 

ではどうするかというと、sshd_configに、sftpコマンドの実体を決めている箇所があり、それがsftp-serverです。

`Subsystem sftp /usr/libexec/openssh/sftp-server`

これには、umaskを設定するオプションがあるので下記にようにすればOKです。


`Subsystem sftp /usr/libexec/openssh/sftp-server -u 002`

これだと全ユーザに対して有効になるので、対象を絞りたい場合は、

```
Match User X
# Subsystem sftp /usr/libexec/openssh/sftp-server -u 002 ← Matchに使えるものが限定されているのでこれはできない

ForceCommand /usr/libexec/openssh/sftp-server -u 002
```

を追記すれば、対象のユーザグループに対してのみ、設定が上書きされます。
あるいは、シェルスクリプトでラップして、そっちでユーザグループの判定をするとかです。


# 参考サイト

* http://dev.classmethod.jp/etc/sftp_and_apache_write/
* http://qiita.com/idacchi/items/22d360932bb43fecee88
* http://hacknote.jp/archives/11289/
* http://sig9.hatenablog.com/entry/2016/10/26/120000
* http://qiita.com/incep/items/7e5760de0c2c748296aa
* http://kazmax.zpp.jp/linux_beginner/default_permission.html
* http://qiita.com/kawaz/items/53d1c837dd762337eb3b
yoでhubot作成時のエラーの対処

hubot構築に伴い、環境は AWS EC2 Amazon linux を選択しました。

構築は、下部の参考サイトにある通り、Amazon linuxの場合は、順々にインストールを進められました。

```
#mkdir ichigo
#cd ichigo
#yo hubot
```
が、`yo hubot` で下記エラーになりました。

```
Native thread-sleep not available.
This will result in much slower performance, but it will still work.
You should re-install spawn-sync or upgrade to the lastest version of node if possible.
Check /usr/lib/node_modules/yo/node_modules/yeoman-environment/node_modules/inquirer/node_modules/external-editor/node_modules/spawn-sync/error.log for more details
Native thread-sleep not available.
This will result in much slower performance, but it will still work.
You should re-install spawn-sync or upgrade to the lastest version of node if possible.
Check /usr/lib/node_modules/yo/node_modules/tabtab/node_modules/inquirer/node_modules/external-editor/node_modules/spawn-sync/error.log for more details

Error: EACCES, permission denied '/root/.config'
    at Object.fs.mkdirSync (fs.js:654:18)
    at sync (/usr/lib/node_modules/yo/node_modules/configstore/node_modules/mkdirp/index.js:71:13)
    at Function.sync (/usr/lib/node_modules/yo/node_modules/configstore/node_modules/mkdirp/index.js:77:24)
    at Object.create.all.get (/usr/lib/node_modules/yo/node_modules/configstore/index.js:38:13)
    at Object.Configstore (/usr/lib/node_modules/yo/node_modules/configstore/index.js:27:44)
    at new Insight (/usr/lib/node_modules/yo/node_modules/insight/lib/index.js:37:34)
    at Object.<anonymous> (/usr/lib/node_modules/yo/lib/cli.js:172:11)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
```

エラーの原因は、`root`ユーザで行なっていた為でした。
`ec2-user` でやり直して、hubot構築完了となりました。
本来であれば、`hubot`ユーザを作ってやるべきですね。


下記サイトがとても参考になりました。
[【初心者向け】AWS+Hubot+Slackで自動返信するBOTの作り方(後半)](http://qiita.com/ShirakawaYoshimaru/items/2823a00ceb0bc1b3ef9f)
xcodeのシュミレーターの動画をとる 又は　QuickTime Playerの使い方

:bow:技術系じゃないとは言わないでください！xcodeの動画撮ってるのでお願いします！
これとれると開発はかどりますから、、、、、、、。

案外簡単にできるのだとついさっき気づいたので書いてみます:hatching_chick:
<img width="435" alt="スクリーンショット 2017-05-04 23.18.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/08387936-226c-ddd1-cca1-a990b619868b.png">
mac →　アプリケーション　→　QuickTime Player
で開きます。開いたからと行って最初、なにこれ？ってなったのですが、開いた段階で上のバーを見れば……(ここからは画像の方がわかりやすと思うので)

このファイルをクリック:shamrock:
<img width="493" alt="スクリーンショット 2017-05-04 23.20.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/292e92a4-e067-99c3-4e53-2ab077b7ed99.png">

ファイルの中の新規画面収録をクリック:herb:
<img width="226" alt="スクリーンショット 2017-05-04 23.20.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/af9b453f-6909-d5c5-7fd5-002548c586c3.png">

そうすると以下のものが出てくるので迷わず…:four_leaf_clover:
<img width="289" alt="スクリーンショット 2017-05-04 23.21.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/c97f113e-f199-00ee-5191-e769bf0a97c9.png">

この赤いポチョンをクリック:palm_tree:
<img width="46" alt="スクリーンショット 2017-05-04 23.21.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/bee22964-58c2-2c6e-7986-0d2c7633b0e3.png">

と以下の内容が出てくるのでシュミレたーをいい感じに選択します:ear_of_rice:
<img width="964" alt="スクリーンショット 2017-05-04 23.21.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/1961b841-291b-8134-b101-5567fe0d173f.png">

こんな感じ:sunny:
<img width="318" alt="スクリーンショット 2017-05-04 23.28.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/68851ce9-5c83-7508-60c5-3494f4067c0e.png">

あとは……お察しの通り収録を開始ボタンクリックで再生始まります。

この再生を止めるには…
またまた上のバーの右の方に出ているこの子をクリック:seedling:
<img width="63" alt="スクリーンショット 2017-05-04 23.28.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/021470da-c595-2572-bf57-e4382730c2b5.png">

あとはみたり、保存したりな感じでいけると思います:turtle:

今日はたくさん緑の絵文字使いました:evergreen_tree:
chkconfigを使用したサービス登録


仮にopt配下に置いたプログラムを登録する場合

* /etc/init.d/にリンクを貼る
 `$ ln -s /opt/example /etc/init.d/`

* プログラムに起動設定を記述する
 
```
#!bin/bash
(snip)
# check it out => /etc/rc[0-6].d/
# chkconfig: 345 <suitability> <suitability>
# description: <suitability>
# processname: <suitability>
(snip)
```

* 登録
 `# chkconfig --add <processname>`


* 確認
 `# checkconfig --list`
TiddlyWikiで自動生成される目次をトップページ表示する

[TiddlyWiki](http://tiddlywiki.com/)はHTMLでできた個人用wikiです。
簡単に記事の作成ができて、記事に独自にタグ付けなどもできます。TiddlyWikiでは記事のことをtiddlerと呼びます。


タグ毎のtiddler一覧が表示できれば目次として利用できてさらに便利です。tag managerというそれっぽい機能がデフォルトであるのですが、それよりもトップページとして表示できた方が見やすくて良いです。という訳でトップページを自動生成した目次を表示してくれるようにします。

まずは目次というtiddlerを作って以下の内容を記述します。

```
<table>
<tbody>
<!-- ヘッダーの記述 -->
<tr height="20">
<th width="50">タグ</th>
<th>用語</th>
</tr>
<!-- 全タグからシステムタグを除いたリストを作成 -->
<$list filter="[tags[]!is[system]sort[title]]">
<tr>
<!-- 左列にリストのアイテム（タグ）を順に取り出し -->
<td><$transclude tiddler="$:/core/ui/ListItemTemplate"/></td>
<!-- 右列に現在のアイテム（タグ）をタグ付けしている用語を取り出し -->
<td width="100%"><<list-links filter:"[all[current]tagging[]]" ol>></td>
</tr>
</$list>
<!-- タグ無しの用語は上記のリストで取得できないので別途取り出し -->
<tr>
<!-- 左列に「タグ無し」のテキストを記述 -->
<td><div class="tc-menu-list-item">タグ無し</div></td>
<!-- 右列タグ無しのtiddlerからシステムtiddlerを除いたリンクリストを作成 -->
<td width="100%"><<list-links filter:"[untagged[]!is[system]]" ol>></td>
</tr>
</tbody>
</table>
```
これを保存すると以下のような表示になります。
![image](https://qiita-image-store.s3.amazonaws.com/0/176811/098ec3da-6f79-fc9b-dc8d-dc608e13ac54.png)

他のtiddlerを作成すると自動的にここに追加されていきます。
![image](https://qiita-image-store.s3.amazonaws.com/0/176811/ee8be22a-044a-edac-25ce-b847124e0e0d.png)

目次をトップページとして表示させるためにデフォルトのトップページであるGettingStartedにあるDefault tiddlersの欄を[[目次]]に書き換えます。書き換えたら右上のチェックマークを押してファイルを保存しましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/176811/66b038a8-cb9f-de1c-322d-ee6f48d28e64.png)

これで目次がトップページとして表示されるようになります。
Anaconda on Raspberry PI 3

#Installing Anaconda on Raspberry PI 3

get http://repo.continuum.io/miniconda/Miniconda3-latest-Linux-armv7l.sh
sudo md5sum Miniconda3-latest-Linux-armv7l.sh
sudo /bin/bash Miniconda3-latest-Linux-armv7l.sh

#Change default dir installation from /root/miniconda3 during the installation

<img src="https://content.screencast.com/users/kamao/folders/Jing/media/ef946463-ccfb-46da-b73e-cee547f7e591/2017-05-04_2350.png">
/home/pi/miniconda3


#Edit the .bashrc file

sudo nano /home/pi/.bashrc

#Add the following line to the end of the file

export PATH="/home/pi/miniconda3/bin:$PATH"

#Save and close this file & reboot Raspberry pi

sudo reboot -h now
Let'sChat構築時のnpm installのエラーに悩まされた話

色々できるチャットが欲しいということで、本当はSlackが良いのですが、セキュリティ的に難しい面もある為、評価用にLet's Chatを構築してみました。

環境は、AWS EC2 Redhat を選択しました。

色々インストールしつつ、いざLet's Chatをインストールしようとしましたが、

```
# git clone https://github.com/sdelements/lets-chat.git
# cd lets-chat
# npm install
```
ここで下記エラーが発生。。

```
> typechecker@2.0.8 preinstall /home/ec2-user/lets-chat/node_modules/i18n/node_modules/messageformat/node_modules/watchr/node_modules/extendr/node_modules/typechecker
> node ./cyclic.js

sh: node: command not found
 
> typechecker@2.0.8 preinstall /home/ec2-user/lets-chat/node_modules/i18n/node_modules/messageformat/node_modules/watchr/node_modules/extract-opts/node_modules/typechecker
> node ./cyclic.js

sh: node: command not found
npm ERR! Linux 3.10.0-514.el7.x86_64
npm ERR! argv "/root/.nodebrew/current/bin/node" "/root/.nodebrew/current/bin/npm" "install"
npm ERR! node v0.12.4
npm ERR! npm  v2.10.1
npm ERR! file sh
npm ERR! code ELIFECYCLE
npm ERR! errno ENOENT
npm ERR! syscall spawn

npm ERR! typechecker@2.0.8 preinstall: `node ./cyclic.js`
npm ERR! spawn ENOENT
npm ERR! 
npm ERR! Failed at the typechecker@2.0.8 preinstall script 'node ./cyclic.js'.
npm ERR! This is most likely a problem with the typechecker package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node ./cyclic.js
npm ERR! You can get their info via:
npm ERR!     npm owner ls typechecker
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     /home/ec2-user/lets-chat/npm-debug.log
```

色々調べた挙句、node.jsのバージョンを上げたらうまくいきました。
※まだ、 `node.js` と `npm` 周りがよくわかってません。

```
# nodebrew install-binary v7.10.0
Fetching: https://nodejs.org/dist/v7.10.0/node-v7.10.0-linux-x64.tar.gz
######################################################################## 100.0%
Installed successfully
# nodebrew use v7.10.0
use v7.10.0
```

主に下記サイトを参考にさせて頂きました。
[How to Deploy a Let's Chat Server on CentOS 7](https://www.vultr.com/docs/how-to-deploy-a-lets-chat-server-on-centos-7)
nvm使い方（仮）

* nvmインストール
```git clone https://github.com/creationix/nvm.git ~/.nvm
source ~/.nvm/nvm.sh```

* 使用可能なバージョン一覧表示 
`nvm ls -remote`

* 指定したバージョンをインストール
`nvm install ****`

* 例）v5.0.0インストール
`nvm install v5.0.0`

* 指定したバージョンを使用する。
`nvm use ****`

* 例)v5.0.0使用
`nvm use v5.0.0`

https://nodejs.org/en/
UbuntuにPythonの環境構築

# Python環境構築
環境: Ubuntu 16.04.2 LTS

pyenv + Anacondaを使って環境を構築する。

## パッケージインストール

	% sudo apt-get install -y make build-essential \
	  libssl-dev zlib1g-dev libbz2-dev wget curl llvm \
	  libncurses5-dev libncursesw5-dev libpng-dev

##pyenvとプラグインをインストール
	% git clone git://github.com/yyuu/pyenv.git ~/.pyenv
	% git clone https://github.com/yyuu/pyenv-pip-rehash.git ~/.pyenv/plugins/pyenv-pip-rehash
	% echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
	% echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
		% echo 'eval "$(pyenv init -)"' >> ~/.bashrc
	% source ~/.bashrc

##Anacondaインストール
	% pyenv install anaconda3-4.3.1
	% pyenv global anaconda3-4.3.1
	% echo 'export PATH="$PYENV_ROOT/versions/anaconda3-4.3.1/bin:$PATH"' >> ~/.bashrc
	% source ~/.bashrc

	% python --version
	Python 3.6.0 :: Anaconda 4.3.1 (64-bit)

## Python2環境の導入
	% conda create -n py27con python=2.7 anaconda
	% source activate py27con
	$ python --version
	Python 2.7.13 :: Anaconda 4.3.1 (64bit)
	$ source deactivate
		
##ライブラリインストール
	% conda update -y conda
	% pip install --upgrade pip
	
###kerasインストール
	
	% pip install keras
		
### MeCabインストール
	% sudo apt-get -y install libmecab-dev mecab mecab-ipadic mecab-ipadic-utf8
	% pip install mecab-python3	

### Gensimインストール
	% pip install gensim
Gitの使い方

投稿テストを兼ねて

* http://www.backlog.jp/git-guide/

## 基本
* ローカルリポジトリへの追加 
`git add "ファイル名"`

* ローカルリポジトリに現在のディレクトリ構造を反映
`git add ./ -A`

* ローカルリポジトリへのコミット 
`git commit -m "コメント"`

* リモートリポジトリアドレスの追加
`git remote add "リポジトリ名" "アドレス"`

* リモートリポジトリへの反映
`git push "リポジトリ名" master`

* リモートリポジトリ一覧を表示する
`git remote`

* リモートリポジトリからファイルを持ってくる
`git clone "URL"`

* リモートリポジトリの変更を反映させる
`git pull "リポジトリ名"`

## ブランチ関連
* ブランチ一覧の表示
`git branch`

* ブランチの生成
`git branch (ブランチ名)`

* ブランチの切り替え
`git checkout (ブランチ名)`

## ブランチの削除
* マージ済みブランチの表示  
`git branch --merged`
* マージ済みブランチの削除
`git branch -d (ブランチ名)`

* マージしてないブランチの削除
`git branch -D (ブランチ名)`
【Raspberry Pi】GPIOで出力するメモ（コマンド）

# 概要
GPIO21ピンから電圧を出力

# コマンド

```
root@raspberrypi:~# echo 21 > /sys/class/gpio/export
root@raspberrypi:~# ls /sys/class/gpio/
export  gpio21  gpiochip0  unexport
root@raspberrypi:~# echo out > /sys/class/gpio/gpio21/direction
root@raspberrypi:~# echo 1 > /sys/class/gpio/gpio21/value
root@raspberrypi:~# echo 0 > /sys/class/gpio/gpio21/value
```

# 結果
テスターで計測。ちゃんと3.3V出力されてる

![ファイル 2017-05-04 22 43 22.jpeg](https://qiita-image-store.s3.amazonaws.com/0/50690/f2dca604-3d37-8706-7513-5aba01112505.jpeg)


# 参考
ツール・ラボ » 第24回 Raspberry PiのGPIOを制御する(コマンド編) https://tool-lab.com/make/raspberrypi-startup-24/
Fetch APIを使ってjQuery.ajaxみたいにデータをpostする

# まとめ
URLSearchParamsを使うとできる

# jQueryの場合
以下のように`hoge`と`foo`を送りたいとする。

```js:jquery.js
$.ajax({
      url: '/api/tasks',
      type: 'POST',
      data: {hoge: 'fuga', foo: 'bar'},
});
```

![jq.png](https://qiita-image-store.s3.amazonaws.com/0/152858/43c3c861-e5ab-424a-adeb-9ebbd799f4d3.png)

# Fetch APIの場合
## URLSearchParamsを使う
以下のようにbodyに`URLSearchParams`を入れると、`Content-Type`も適切に設定される

```js:fetch1.js
let params = new URLSearchParams()
params.set('hoge', 'fuga')
params.set('foo', 'bar')
fetch('/api/tasks', {
    method: 'POST',
    credentials: 'include',
    body: params,
})
```

![fetch1.png](https://qiita-image-store.s3.amazonaws.com/0/152858/a5dc005b-70b9-7568-e983-b095a274fdd4.png)

## 直接文字列として書く
ヘッダを設定する必要があるので注意

```js
fetch('/api/tasks', {
    method: 'POST',
    credentials: 'include',
    headers: {
        "Content-Type": "application/x-www-form-urlencoded"
    },
    body: 'hoge=fuga&foo=bar',
})
```

![fetch2.png](https://qiita-image-store.s3.amazonaws.com/0/152858/920ca50e-16f3-3bba-f9d7-6a346e799c81.png)
babel-plugin-module-resolver を使ってパッケージ名のエイリアスを張る + flowtype/eslint で対応する

## やりたいこと

`import bbb from 'aaa/bbb'` の解決先を、`src/aaa/bbb` にしたい。

## やりたくないこと

Webpackに依存したくない。Babelのレイヤーで解決したい。Babel側に寄せておけば、Webpackが腐ったときも巻き込まれずに済む。

## babel-plugin-module-resolver

```
yarn add babel-plugin-module-resolver -D
```

.babelrc に追記

```json:.babelrc
  "plugins": [
    ["module-resolver", {
      "root": ["./src"],
      "alias": {
        "aaa": "./aaa"
      }
    }]
  ]
```

## flow

このままだとFlowが参照を解決できないので, module.name_mapper オプションで参照を変更してやる

```:.flowconfig
[options]
module.name_mapper='^aaa\/\(.*\)$' -> '<PROJECT_ROOT>/src/aaa/\1'
```

## eslint

eslint-plugin-import の参照解決も壊れるので、次の2つのルールを無効にした。参照名が正しく解決されるかは、一旦Flow側に任せる。

```
rules:
  # Use flow resolver
  import/no-extraneous-dependencies: 0
  import/no-unresolved: 0
```

https://www.npmjs.com/package/eslint-import-resolver-babel-module-alias を使えば正しく認識できそうだが、自分の設定が悪いのか、babelと同じ設定を渡しても、うまく動かなかった。あとでちゃんと倒したい…
ホスト名を正引きして逆引きするコマンド

# ptrhost()
このホスト、どこでホスティングされているんだろうと気になることがあると思います。
正引きをして逆引きをするとどこのVPSだったりIaaSだったりわかるわけなんですが、それを知るコマンドがなかったので関数をつくりました。
コマンドではなく関数を実装したのでタイトルは釣りです。

```zsh
ptrhost () {
  host $1 | grep -v mail >&2 | rev | cut -d' ' -f1 | rev | xargs -I{} host {}
}
```

# 使用例

```zsh
% ptrhost itochan.jp              
itochan.jp has address 160.16.234.100
itochan.jp has IPv6 address 2001:e42:102:1819:160:16:234:100
100.234.16.160.in-addr.arpa domain name pointer hatsukoi.itochan.jp.
0.0.1.0.4.3.2.0.6.1.0.0.0.6.1.0.9.1.8.1.2.0.1.0.2.4.e.0.1.0.0.2.ip6.arpa domain name pointer 160.16.234.100.v6.sakura.ne.jp.
```

あら便利。
LambdaでのEC2起動停止にタグを利用する

Pyhoneを使って、LambdaでEC2の起動停止をタグで制御する覚書です。

以前は、インスタンスIDを直接指定してしまっていたのですが、
インスタンスが増えてきたという理由もあり、管理も大変になってきた為に、
タグで制御するようにしてみました。

Lambdaで言語は`Python2.7`を選択して下記スクリプトを記載。

```
import boto3

def lambda_handler(event, context):

    # リージョンを指定
    ec2 = boto3.client('ec2', "ap-northeast-1")
    resp = ec2.describe_instances()
    targets = []
    for reservation in resp['Reservations']:
      for instance in reservation['Instances']:
        if 'Tags' in instance:
            for tag in instance['Tags']:

                # タグが isSchedule の場合に、値が true を対象
                if tag['Key'] == 'isSchedule' and tag['Value'] == 'true':
                    targets.append(instance['InstanceId'])
    
    if len(targets) > 0:
        ec2.start_instances(InstanceIds=targets)
        print 'started instances: ' + str(targets)
```
例外とかはきちんと処理してログ出したほうがいいのかな。

終了させる場合は、最後から２行目を下記に変更。
```ec2.stop_instances(InstanceIds=targets)
```
Gitリンク集

Git関連の自分用メモ

#Git操作関連
[Git ユーザマニュアル (バージョン 1.5.3 以降用)](https://img.atwikiimg.com/www8.atwiki.jp/git_jp/pub/git-manual-jp/Documentation/user-manual.html)

[【翻訳】Gitをボトムアップから理解する](http://keijinsonyaban.blogspot.jp/2011/05/git.html)

[ぼっちプログラマがチームに入る前に知っておきたい６つの git コマンド](http://blog.layer8.sh/ja/2013/04/08/best-git-commands-for-the-lonely-programmer/)

[Gitでよく使う21コマンドまとめ(1)](http://web-k.github.io/blog/2012/11/08/git/)

[Gitでよく使う21コマンドまとめ(2)](http://web-k.github.io/blog/2013/03/18/git2/)

[git logのオプションあれこれ](http://heart-shaped-chocolate.hatenablog.jp/entry/2013/07/16/035104)

[gitリポジトリの複製](http://qiita.com/syuji-higa/items/e380289502c7896daf0f)

#Gitコミット関連
[Shiny new commit styles](https://github.com/blog/926-shiny-new-commit-styles)

[eclipse Linux Tools Project/Git](https://wiki.eclipse.org/Linux_Tools_Project/Git)

[【翻訳】Gitのコミットメッセージに関する注意点](http://keijinsonyaban.blogspot.jp/2011/01/git.html)

[Gitのコミットメッセージの書き方](http://postd.cc/how-to-write-a-git-commit-message/)

[git commit するまえに考えるべき10のこと](https://hiroki.jp/2012/09/05/5523/)

[レビューしやすいコミット履歴でバグ削減](https://moneyforward.com/engineers_blog/2015/11/30/reviewable-commit-log/)

#プルリクエスト関連
[How to write the perfect pull request](https://github.com/blog/1943-how-to-write-the-perfect-pull-request)

[より良いプルリクエストのための10のヒント](https://yakst.com/ja/posts/1625)

[git pull と git pull –rebase の違いって？図を交えて説明します！](http://kray.jp/blog/git-pull-rebase/)
unityでエディターでは正常でもビルドすると文字化けする不具合

#unityでエディターでは正常でもビルドすると文字化けする不具合

unityからプロセスを起動してメッセージを受け取ってる時に
エディターでは正常に二バイト文字を受け取れているのに
ビルト後のexeでは文字化けしてしまって動かせないという不具合がありました。

それがまた、プロジェクトによって起きたり起きなかったり…。

で、探してみるとunityのヘルプデスクにありました。
[System.Text.Encoding で Shift JIS を使いたい](http://helpdesk.unity3d.co.jp/hc/ja/articles/204694010-System-Text-Encoding-%E3%81%A7-Shift-JIS-%E3%82%92%E4%BD%BF%E3%81%84%E3%81%9F%E3%81%84)
>エディタ上では使うことができるため、ビルド後のみエラーが発生するという挙動になります。

**おい！**

確かに他の解決法でプロセス起動情報で文字コード入れるといいよとあったんですが

```proces.cs
Import System.Text;
（略）
process.StartInfo.StandardOutputEncoding = Encoding.GetEncoding("Shift_JIS");
```
で、ビルド後に実行したらサポートしてないって怒られたんですよね。

ヘルプデスクの通りに
>Unity のエディタに含まれる I18N.dll および I18N.CJK.dll をプロジェクトの Assets へインポートする

で解決しました。
これ使わなくても正常に動いてるプロジェクトもあって、そっちは謎…
何かのアセットに入ってたのかな
1分で完成するNode.jsを使ったWebページの雛形

# 概要
簡単なサイトを作ったりWebツールを作ったりするときに諸々の設定をするのに以外と時間がかかったりするので、簡単な雛形を作って使い回しできるようにしました。

# 完成イメージ
こんな感じのWebページが一瞬でできるようなイメージです。
<img width="1218" src="https://qiita-image-store.s3.amazonaws.com/0/110485/fd72e606-b547-44fd-5891-0c3af68f71ae.png">

# 使い方
※Node.jsとnpmが動く環境が前提です。

1.gitのリポジトリをクローンします。

```
$ git clone https://github.com/hikarut/NodeWebSkeleton.git
```

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

```
$ npm install
```

3.ビルドします。

```
$ npm run build
```

4.スタートします。

```
$ npm run start
```

5.ページを開きます。

* http://localhost:8080/

以上です。

# ざっくり解説
全体のディレクトリ構成はこんな感じです。
https://github.com/hikarut/NodeWebSkeleton

```
|--src
| |--lib
| | |--lib.js
| |--model
| | |--model.js
| |--routes
| | |--index.js
| |--server.js
|--template
| |--bundle.js
| |--client.js
| |--css
| | |--custom.css
| |--views
| | |--index.ejs
|--test
| |--example.js
```

`src`以下にサーバ側の処理を書き、`template`以下にhtml,css,jsなどのクライアント側のファイルを起きます。`test`以下はテストコードを置きます。

サーバ側は`server.js`をエントリポイントにしてExpressを使ってルーティングします。
ディレクトリ構成はどうゆうのが良いのか悩みますが、、`lib`と`model`を置くシンプルな形にしてあります。

クライアント側は`client.js`をエントリポイントにしてWebpackでビルドして`bundle.js`の1ファイルにまとめます。



# 使っているもの
## Node.js
サーバサイドはNode.jsを使います。簡単なページを作るくらいならサクッとできるのでおすすめです。

## Express
Node.jsのサーバサイドフレームワークにExpressを使います。もちろん何を使っても良いのですが、Nodeのフレームワークはいっぱいある中でExpressが一番有名なフレームワークだと思うので今回はこちらを使っています。

## EJS
Expressとよく一緒に使われるテンプレートエンジンです。テンプレートエンジンもいっぱいあってどれを使っても良いですが、個人的にはhtmlと同じような書き方ができるEJSを使っています。

## Bootstrap
テンプレートといえばやっぱりBootstrapが便利かなと思います。自分みたいにhtmlとかcssとかがっつり書けない人にとっては特に便利です。Webツールを作るならグラフとかラベルとかもいっぱいあるのでかなりそれっぽいのが作れると思います。カスタマイズもできるのでプラスでアレンジすることもできます。

参考

* [Bootstrap](http://getbootstrap.com/)
* [Bootstrap Editor](http://www.venezia-works.com/bst/index.html)
* [エンタープライズ向けBootstrap：PatternFlyの紹介](http://qiita.com/tadayosi/items/839029700b6a576ec1a5)

## AVA
テストコードを書くようにテストフレームワークも入れてあります。こちらもいっぱいあってなんでも良いですが、何となくAVAがシンプルで書きやすそうなきがするので今回はAVAを使っています。

参考

* [JavaScriptのテストフレームワークはAVAが流行り気味らしいので調べてみた](http://qiita.com/niisan-tokyo/items/000db7cd0e995c802334)

## Webpack2
クライアント側で使うcssやjsを1つのファイルにまとめるようにWebpackを使ってビルドしています。`client.js`をエントリポイントにして`bundle.js`を出力させ、クライアント側ではこの`bundle.js`を1つ読み込むだけで完結するようにしてあります。その方がテンプレート側もシンプルになっていいかなーと思っています。またそのためにstyle-loaderやcss-loaderを使ってjs内でcssを読み込めるようにしたり、ビルド時にESLintをかけたりしています。Webpackは1系と2系で多少書き方が変わっていますが、今回は2系を使っています。

## ESLint
jsファイルのチェックに使っています。ルールのカスタマイズもできるのでその場合は`.eslintrc`を修正してカスタマイズします。今回はWebpackのビルド時にESLintをかけていますが、現状だとクライアント側の`client.js`しかチェックできない状態です。。本当はサーバサイドで使うjsファイルもチェックしたいのですがうまいやり方がわからなかったので、一旦はクライアント側のjsのみのチェックにしてあります。。

# 終わりに
こんな感じに雛形があるとさくっとWebページのプロトタイプを作ったり、ツールを作ったりが簡単にできるかなと思います。また今回はEJSとかBootstrapとか入れてますがテンプレート系のパッケージを外せばAPIの雛形としても使えると思います。(その場合Expressとちょっとしたルーティングだけなので雛形という程でもないですが。。。)
またハッカソンなど限られた時間で何か作る場合とかにも割とこの辺のセットアップ系に時間を取られたりすることがあるので、ある程度雛形があると便利かなぁと思います。
IMSの概要（FP、DEDB)

多くの銀行の勘定系システムでは、IBMメインフレーム上でIMS/SAILを使用してアプリ開発を行っている。ここでは、IMSの中で銀行システムを構成する際によく使用されているFP(FastPath)とDEDBを記載する。

#IMSとは
IMSとは、Informaition Management Systemの略称で階層型のデータベース管理システムである。IMSはトランザクション処理システムであるIMS TM(IMS Transaction Manager)と、階層型のデータベース管理システム (DBMS) であるIMS DB(IMS Database Manager)から構成される。

IMS　アドレース・スペース構成
![IMSアドレス構成.jpg](https://qiita-image-store.s3.amazonaws.com/0/179688/3ece7965-2360-3a42-75be-dd66e1e16eee.jpeg)


#FP(FastPath)とは
FPとは、高速拡張機能（FastPath)の略称で、1977年に日本の銀行などの要求により、最初は作られました。従来のIMSと違い、パフォーマンスを追及した製品である。次のような特徴をFastPathはもつ。

 ・ 資源の事前割当て
 ・ 外部I／Oの削除
 ・ 簡素化された機能
 ・ 並行処理の促進

多くの銀行の勘定系システムのオンラインでは従属リージョンとしてIFPリージョンを適応していることが多い。
なお、バッチ処理でIMS-DBにアクセスする場合は、BMPリージョンでアクセスすることが多い。

#DEDBとは
FPでは、ディスク上の管理する「DEDB」及びディスクとメモリ上で管理する「MSDB」とに分かれる。銀行システムは複数のマシーンで稼働しており、MSDBはマシーンごとにデータを保有する必要があり、DEDBは複数のマシーンで共有して使用できるため、銀行システムでは通常DEDBが使用されることが多い。
ここでは、階層型データベースであるDEDB（Data Entry DataBase）について記載する。

システムのデータベースイメージ
（IMS/ESA オンライン適用業務開発/ 運用支援プログラム　概説書より）
![システムのデータベースイメージ.jpg](https://qiita-image-store.s3.amazonaws.com/0/179688/9eba8073-6d67-b9cd-62fe-2527fec5f937.jpeg)

階層型データベース
![階層型データベース1.jpg](https://qiita-image-store.s3.amazonaws.com/0/179688/4f04cdb5-2a0a-040e-d11f-d886ab61e89e.jpeg)







#＜参考資料＞
　Wikipedia IMS　　　　　　  　　　https://ja.wikipedia.org/wiki/IMS
　メインフレームで遊ぼう　　　　　http://www.arteceed.net/?p=805
　進化する銀行システム　　　　星野 武史

IMS/ESA オンライン適用業務開発/ 運用支援プログラム　概説書
TensorFlow実行時AttributeError: module 'tensorflow' has no attribute 'constant'が出るときにまず疑うこと

TensorFlowを試してみることになり、実行したところ以下のエラーになりました…

```
AttributeError: module 'tensorflow' has no attribute 'constant'
```

実行したファイルは以下。

```tensorflow.py
import tensorflow as tf

node1 = tf.constant(3.0, tf.float32)
node2 = tf.constant(4.0) # also tf.float32 implicitly
print(node1, node2)
```

１行目に
`import tensorflow as tf` とあります。
ファイル名が`tensorflow.py`となっているため、
ライブラリのtensorflowではなく自ファイルをインポートしていたため'constant'なんてものはないとエラーになっていたようです。

なので
**ファイル名を変更すれば動くようになります！**

```
$ python tensorflowrun.py
Tensor("Const:0", shape=(), dtype=float32) Tensor("Const_1:0", shape=(), dtype=float32)
```

tensorflow.py以外の名前に変更しましょう。

初めてPython触る人や久しぶりにPython触る人はこんなことがあったらファイル名を疑ってみるといいかもしれません。
MySQLでカラムの順番を変更する

よく忘れるので、メモ

以下のようなテーブルがあったとします。

````mysql
id
title
description
user_id
```

以上を以下のようにしたい

```mysql
id
user_id
title
description
```

`alter table テーブル名 modify 移動したいカラム名 text after 移動したいカラム名の上にくるカラム名;`例えば以上のように`user_id`を`id`の下に持ってきたい場合。
`alter table テーブル名 modify user_id text after id;`とする
Windows7にVirtualBoxとVagrantで仮想環境を構築する

Windows7にVirtualBoxとVagrantで仮想環境を構築する手順です。

#1. 背景
新しく開発環境を構築しようと思いました。
その際、VirtualBoxとVagrantでの仮想環境が使いやすいと聞き、採用。
情報を検索すると比較的多くヒットしたので、これを参考にすればすんなり行くかと思ったのですが、ゲストOS起動段階で、以下のエラーが発生。

```
The executable 'cygpath' Vagrant is trying to run was not
found in the %PATH% variable. This is an error. Please verify
this software is installed and on the path.
```


メッセージの通り、単にCygwinが入ってなかったことが原因だっただけなので、特に難しいことはありませんでした。しかし、Cygwinが必要という情報は日本語では出てこなかったので一応、私の環境で行った手順を記述します。

#2. 前提条件
* ホストOS：Windows 7 Professional(64ビット)
* ゲストOS：CentOS 7.0 x64 
* VirtualBox：5.1.22
* Vagrant：1.9.4

#3. 各種インストール
##3-1 VirtualBoxのインストール
以下から、Windows用のインストーラをダウンロードする。
https://www.virtualbox.org/wiki/Downloads
普通に「Windows hosts」を選べばOK。

ダウンロード完了後、実行してインストールする。
いろいろ聞かれるけど、通常はそのまま進めていけば問題なし。

不要かもしれないけど、念のためエクステンションパックも導入。
Oracle VM VirtualBox Extension Pack　の横にある
「All supported platforms 」を選択してダウンロード＆インストール。

##3-2 Vagrantのインストール
以下から、Windows用のインストーラをダウンロード。
https://www.vagrantup.com/downloads.html
「Universal (32 and 64-bit)」をクリックしてダウンロード。

こちらもダウンロード完了後、実行してインストール。
こちらも特に変更せずにインストールすれば問題なし。

##3-3. Cygwinのインストール
以下から、インストーラをダウンロード。
https://www.cygwin.com/

こちらもダウンロード後、実行してインストールするだけなのですが、
少し複雑なので、わからない方は他の記事等を検索して、インストールしてください。
また、パスを通しておく必要もあるので、ご注意。

#4. 仮想マシンの作成
##4-1. ゲストOSをVirtualBoxへ登録する

コマンドプロンプトを起動し、以下のようなコマンドを実行する。
vagrant box add {登録名} {ファイルURL}

私の場合、CentOS7.0なので、以下のコマンドを実行。

```
vagrant box add CentOS70 https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box
```

なお、別のゲストOSを登録する場合は、以下を参照。
http://www.vagrantbox.es/

##4-2. vagrantfileの編集
まず、任意の場所にフォルダを作成する。
ここでは、C:¥Users¥userにCentOSフォルダを作成したものとして進めます。

続いて、以下のコマンドを実行して、vagrantファイルを作成する。
ただし、2行目の"CentOS70"は、4-1での登録名に適宜修正して実行すること。

```
C:¥Users¥user> cd CentOS
C:¥Users¥user¥CentOS> vagrant init CentOS70
```

CentOSディレクトリ内に作成されたvagrantファイルを以下のように編集する。

```:vagrantfile
#コメントアウトを外す
config.vm.network "private_network", ip: "192.168.33.10"
```

#5. ゲストOSの起動・停止
##5-1. 起動
以下のコマンドを実行して、ゲストOSを起動する。

```
C:¥Users¥user¥CentOS> vagrant up
```

※なお、ここでCygwinが入っていないorパスが通っていないと、記事冒頭に記載したエラーが発生しました。

##5-2. ゲストOSへの接続
TeraTerm等を使ってゲストOsへSSH接続する。
接続情報は以下の通り。

* 接続先：192.168.33.10
* ポート：22
* SSHバージョン：SSH2
* ユーザ名：vagrant
* パスワード：vagrant

##5-3. 停止
以下のコマンドを実行して、ゲストOSを停止する。

```
C:¥Users¥user¥CentOS> vagrant halt
```

#6. その他の環境設定
vagrantファイルを編集することで、様々な設定を行えます。
以下に例を挙げます。

```:vagrantfile
#ホストOSとゲストOSでディレクトリを共有する
#複数共有した場合は、そのまま複数行記述するだけ
config.vm.synced_folder "ゲストOS側のパス", "ホストOSのパス"

#ゲストOSの使用メモリを変更する
#コメントアウトを外して、値を変更する
   vb.memory = "1024"
```

ゲストOS起動中の場合は、以下のコマンドでリロードする。

```
C:¥Users¥user¥CentOS> vagrant reload
```

#余談
今回、CentOS 7.0を選択したのですが、どうやらCentOS 7.0では
serviceコマンドとchkconfigコマンドが非推奨らしく、systemctlコマンドが推奨されているようです。

chkconfigコマンドは
systemctl {enable/disable} {service name}

serviceコマンドは
systemctl {start/stop/restart/status} {service name}

のように実行するみたいです。

例えば、Apacheの起動は以下のようになります。

```
#systemctl enable httpd
#systemctl start httpd
```
メインフレームのノウハウ

≪趣旨≫
数年前に新入社員として銀行の勘定系システムを開発することになり、初めてメインフレームを関わることになった。少しづつ、IBMのメインフレームのことが分かり始めてきたので、ブログを更新する中でさらにスキルアップを図りたい。


≪学習対象≫
　・メインフレーム（MVS、JES2、IMS、DB2など）
　・銀行システム

≪参考文献≫
　メインフレームで遊ぼう　　http://www.arteceed.net/
　メインフレーム実践ハンドブック　 神谷 俊也
今さら聞けないWebSocket~WebSocketとは~

#WebSocketとは
Webにおいて双方向通信を低コストで行うための仕組み。プロトコルの一種。


#WebSocketの必要性

###Web通信といえば
HTTP。
主にHTMLで書かれた文書を転送するためのプロトコル。
HTTPの規格が制定された当時のWebは、遠隔地にいる人同士が知識を共有するためにあった。

###Webの用途は変わってきた
SNS等の登場によって、**リアルタイム**なやりとりが求められるようになった。
だれかのアクションがリアルタイムで他のユーザーに伝わり、ほかのユーザーもリアクションすることができる。
このリアルタイムなやり取りを実現するには、サーバ上の情報の更新が行われたらクライアントの画面等を更新する必要などがある。
これをHTTPで実現しようとすると難しい。

###HTTPのボトルネック
- 1つのコネクションで1つのリクエストしか送ることができない
- リクエストはクライアントからしか送ることができない
    - サーバーから通信を始めることができない
- ヘッダーが冗長
    - 情報量が多くなってしまう

などなど


###HTTPを使って頑張ってきた
それでもHTTPを使ってクライアントとサーバ間の**双方向通信**を行おうとしてきた。
HTTPを使用してクライアントが一定間隔でサーバに問い合わせをし続けたり(ポーリング)、Cometという手法を用いることによって、サーバ側から通信を開始するサーバプッシュ機能を疑似的に実現していた。
しかし、無駄が多かったり、HTTP自体のボトルネックは解決されることがなかった。

※Comet
問い合わせを受けたサーバは、新着情報がなければレスポンスを返すのをしばらく保留する。新着情報ができればその時点でレスポンスを返し、新着情報ができないようであれば一定時間経過した後にレスポンスを返す。

###そこで生まれたWebSocket
これらの問題を解決するために、WebSocketという新しいプロトコルがうまれた。


#WebSocketプロトコル

もともとはHTML5の仕様の一部として策定されていたが、現在は単独のプロトコルとして進められている。
WebSocketプロトコルは、サーバとクライアントが一度コネクションを確立すると、その後の通信を専用プロトコルで行う。

- サーバプッシュ機能
    - 一度コネクションを確立したあとは、サーバとクライアントのどちらからも通信を行うことが可能
- 通信量削減
    - 一度コネクションを確立するとそのコネクション上で通信を行う(HTTPのように、通信のたびにコネクションを作らない)
    - ヘッダのサイズが最小2byte、最大14byteと小さい

WebSocketプロトコルではまずコネクションの確立(**ハンドシェイク**)を行うことで、双方向通信の実現がされる


###通信の仕組み①　-ハンドシェイク-
ハンドシェイクはHTTP通信によって行われる。

**リクエスト**
HTTPのUpgradeヘッダを使用し、プロトコルの変更を行う。

**レスポンス**
ステータスコード101「Switching Protocols」が返る。
ハンドシェイクによってコネクションが確立し、これ以降はHTTPではなくWebSocketのプロトコルで通信が行われることになる。

###通信の仕組み②　-双方向通信の実現-
ハンドシェイクによってコネクションが確立すると、双方向通信をWebSocketプロトコルで行うことができるようになる。
送信データはフレームという単位で扱われる。


#よく聞く「socket.io」とは何か
リアルタイムな双方向通信を可能にするNode.jsライブラリとブラウザ用ライブラリのセット。
Javascriptだけでなく、java用ライブラリやC++用ライブラリも出ている。
socket.ioを使うことで、簡単にリアルタイムな双方向通信を実装できる。
c言語_constで注意すべきこと


```c:func1.h
#define FUNC1
#ifdef FUNC1
    extern int function1(const char **p);
#endif
```

```c:func1.c
#include <stdio.h>
#include "func1.h"
#include "func2.h"

int function1(const char **p)
{
        function2(p);
        return (0);
}
```

```c:func2.h
#define FUNC2
#ifdef FUNC2
    extern int function2(char **p);
#endif
```

```c:func2.c
#include <stdio.h>
#include "func2.h"

int function2(char **p)
{
    printf("*p=%p\n", *p);
    *p = *p + 1;
    printf("*p=%p\n", *p);
    return(0);
}
```

```c:main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "func1.h"
#include "func2.h"

int main(int argc, const char *argv[]) {

    const char *name = "tanaka";

    printf("name=%s\n", name);
    function1(&name);
    printf("name=%s\n", name);
    return(0);

}
```

コンパイル結果：

```c:

% gcc -c func1.c -Wall

func1.c:7:12: warning: passing 'const char **' to parameter of type 'char **' discards
      qualifiers in nested pointer types [-Wincompatible-pointer-types-discards-qualifiers]
        function2(p);
                  ^
./func2.h:3:33: note: passing argument to parameter 'p' here
    extern int function2(char **p);
                                ^
1 warning generated.

```

実行結果：

```c:main.o
name=tanaka
*p=0x106215f9e
*p=0x106215f9f
name=anaka
```

function2がfunction1から呼ばれている場合、function1の引数をconstとしてしまうと、function2の引数もconstにしなければならなくなる。下手をするとfunction2が使えないという状況も出てくる。

function1とfunction2が別の開発者により開発されている場合、function1の開発者からの指摘がなければfunction2の引数がconstされない可能性がある。

コンパイルするとwarningは出るが、main.oは普通に動いてしまう。
関数が深くネストする場合には、constの使用は控えるのがよい。
　　
参考：
> [C言語入門書の次に読む本](http://gihyo.jp/book/2011/978-4-7741-4612-6)

　
　
　
　どやっ！