OmniAICreator/Qiita-1.07M huggingface dataset:
TypeScript の async/await をいますぐ使う


基本的な考え方

- `tsc --target es6` で変換する
- 出力したjsをさらにbabel に通して実行

```
$ npm install -g typescript@next
$ tsc -v
message TS6029: Version 1.6.0-dev.20150907

$ npm install -g babel
```

コードは [Babelのasync/await試してみた(+中の処理をちょっと追ってみた) - Qiita](http://qiita.com/mizchi/items/46dfe1c3ad2e6d9c9007 "Babelのasync/await試してみた(+中の処理をちょっと追ってみた) - Qiita") をちょっと修正。

```javascript:foo.ts
"use strict";
let wait = function(n: number){
  return new Promise(done => setTimeout(() => done(n), n));
};

let main = async function(){
  await wait(50);
  console.log('await done');
}

// async promise nomally
wait(100).then(() => console.log('promise normally done'));
main();
```


```shell
$ tsc -t es6 foo.ts
$ babel-node foo.js
await done
promise normally don
```


## おまけ: typescriptの出力コードを読む

```javascript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promise, generator) {
    return new Promise(function (resolve, reject) {
        generator = generator.call(thisArg, _arguments);
        function cast(value) { return value instanceof Promise && value.constructor === Promise ? value : new Promise(function (resolve) { resolve(value); }); }
        function onfulfill(value) { try { step("next", value); } catch (e) { reject(e); } }
        function onreject(value) { try { step("throw", value); } catch (e) { reject(e); } }
        function step(verb, value) {
            var result = generator[verb](value);
            result.done ? resolve(result.value) : cast(result.value).then(onfulfill, onreject);
        }
        step("next", void 0);
    });
};
let wait = function (n) {
    return new Promise(done => setTimeout(() => done(n), n));
};
let main = function () {
    return __awaiter(this, void 0, Promise, function* () {
        yield wait(50);
        console.log('await done');
    });
};
// async promise nomally
wait(100).then(() => console.log('promise normaly done'));
main();
```

babelのasync/awaitのregeneratorはyieldがない環境向けにCPS変換するが、typescriptのasync/awaitはgenerator前提で`__awaiter`ヘルパを使って(babelのと比べて)比較的単純なコードを生成する。

## 私見

TypeScriptは全体的に C# 感があるがMSは自分の環境に似せるための努力は怠らないという気概を感じる。とはいえ ecmascript の世界では stage: 1 なので, Object.observeを先行実装したGoogleと同じように皆自分が欲しいものを先走って作っていて若干複雑な気持ちはある。

とはいえ便利なので自分は今すぐにでも使う。

## 追記: 既に stage:2 になってた

https://github.com/rwaldron/tc39-notes/blob/master/es7/2015-07/july-30.md#64-advance-async-functions-to-stage-2

thx @azu_re https://twitter.com/azu_re/status/640812872537276416
railsでtaskを作成

###参考サイト
- [Rakeタスクをつくる](http://qiita.com/mosson/items/9a9b0703ac4c76ebfd4e)

##タスクファイルの作成

```
rails g task  task_name

```

lib/task/task_name.rake が作成される


#####lib/task/task_name.rake
```
desc "Sample です" #=> 説明
task :sample => :environment do
	print 'hello sample.'
end
```

##実行
```
rake task_name:sample
```

##確認
```
rake -vT
```
wheneverでRailsのタスクをcronで実行する

###参考サイト
- [WheneverでRailsのバッチ処理](http://higelog.brassworks.jp/?p=1548)

##登録内容の確認

```
bundle exec whenever
```

を実行するとcrontabの内容をコンソール出力。
この時点ではまだcrontabに登録されてはいない。

##Crontabへ登録

```
bundle exec whenever --update-crontab
```

–update-crontabオプションをつけるとcrontabに登録する。
Whenever以外で登録されていたジョブが上書きされることはない。

##Crontabから削除

```
bundle exec whenever --clear-crontab
```

Cronを止めたい場合は–clear-crontabですべて削除。
登録の場合と同様にWhenever管理外のジョブが削除されることはない。
unicornのインストール

##Gemでユニコーンをインストールすろ

```
gem install unicorn-rails

gem install unicorn

```

##ユニコーンの設定ファイルを作成
```
vim RAILS_ROOT/config/unicorn.rb
```

#####RAILS_ROOT/config/unicorn.rb

```
APP_PATH = "/var/www/ruby/rss"

worker_processes 2

working_directory "/var/www/ruby/rss"

listen 3000

pid APP_PATH + "/tmp/pids/unicorn.pid"
stderr_path APP_PATH + "/log/unicorn.log"
stdout_path APP_PATH + "/log/unicorn.log"


preload_app true

```

##ユニコーンでRailsを起動
```
bundle exec unicorn_rails -E development -c config/unicorn.rb
```

##Nginxの設定ファイルを作成
```
vim /etc/nginx/nginx.conf
```

#####/etc/nginx/nginx.conf
```
upstream abgata.org {
    #server 127.0.0.1:3000;
	server unix:/var/tmp/rss.sock;
}

server {
    listen 80;
    server_name abgata.org;

    root /var/www/ruby/rss/public;

    access_log /var/log/rss_access.log;
    error_log  /var/log/rss_error.log;

    location / {
      if (-f $request_filename) {
        break;
      }

      proxy_set_header X-Real-IP  $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_pass http://abgata.org;
    }

    location ~* \.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ {
      # expires 1y;
    }
}

```

##ヴァーチャルホストの設定
```
sudo vim /etc/nginx/sites-avalable/default
```


#####/etc/nginx/sites-avalable/default
```
server {
        listen 80 default_server;
        server_name _;
        deny all;
}

```


## 設定を反映させるファイルのシンボリックリンクを作成
```
sudo ln -s /etc/nginx/sites-avalable/default /etc/nginx/sites-enabled/

```

## Nginxを再起動して設定を反映
```
chkconfig nginx on

service nginx start

service nginx reload
```
docker-machineのGCEドライバでstopすると危険

docker-machineにはGCE用のドライバ (`-d google`) があって、これを使うと簡単にGCE上にVMインスタンスを立ち上げてdockerもインストールしてくれるので大変便利です。しかし、インスタンスを停止しようとして

```
docker-machine stop <name>
```

すると、現状ではなぜかVMインスタンスを停止ではなく**削除**します。これはとんでもないのですが、ソースコード（[これ](https://github.com/docker/machine/blob/master/drivers/google/google.go#L238)や[これ](https://github.com/docker/machine/blob/master/drivers/google/compute_util.go)）を見る限り、`stopInstance`がそもそも実装されておらず、とりあえず削除しておけというような事になっているようです。

現状インスタンスの停止は`docker-machine stop`を使わずに`gcloud`やWeb UIから行うのが良いでしょう。また、致命的なリソース操作に関してはドライバのソースコードを見てから実行したほうが良さそうです。幸いソースコードは短くて読みやすいです。

この危ない実装を修正する[PRはすでに送られていて](https://github.com/docker/machine/pull/1631)、おそらく近いリリースで取り込まれるのではないかと思います。
gbでginをrunする

[前回](http://qiita.com/wataru420/items/a0a7cd1e218013bb03b8)はgomを使ってパッケージ管理してみたのを、新たに[GB](http://getgb.io/)というのがあると聞いて、そっちも試してみました。

GBの特徴はプロジェクトに必要なコードを全てvendoringする事。
いわゆるプロジェクトベースと呼ばれるツールな事。くわしくは[ここ](http://deeeet.com/writing/2015/06/26/golang-dependency-vendoring/)を見るといいかも？

さっそくGBをインストールしましょう。

```
$ go get github.com/constabulary/gb/...
```

GBはプロジェクトのディレクトリ構造が独特です。
ソースは必ずsrcディレクトリに、さらにsrc直下は実行できず、かならずパッケージディレクトリを作る必要があります。

```
~/code/demo-project $ tree -d .       
.                                                                   
├── src                               
│   └── hello
```

こんな感じでディレクトリを作ります。

次にginをインストールしましょう。
GBでは`go get`のかわりに`gb vendor fetch`を使います。

```
$ gb vendor fetch github.com/gin-gonic/gin
```

すると`vendor`というディレクトリができ、中にgin関連のsrcが配置されます。
このvendorはブランチを指定したり、updateするなど、様々な機能があります。
詳しくは[ここ](https://godoc.org/github.com/constabulary/gb/cmd/gb-vendor)を見るといいです。

その際に`vendor`ディレクトリには`manifest`ファイルが生成されます。
json形式でbranchやrevisionが記述されているファイルで、他の人はこのファイルを元に`gb vendor restore`を行うと同じ環境をつくれるという仕組みです。

では実際にmain.goを作ってhelloディレクトリに格納しましょう。

``` main.go
func main() {
    router := gin.Default()

    // This handler will match /user/john but will not match neither /user/ or /user
    router.GET("/user/:name", func(c *gin.Context) {
        name := c.Param("name")
        c.String(http.StatusOK, "Hello %s", name)
    })

    // However, this one will match /user/john/ and also /user/john/send
    // If no other routers match /user/john, it will redirect to /user/join/
    router.GET("/user/:name/*action", func(c *gin.Context) {
        name := c.Param("name")
        action := c.Param("action")
        message := name + " is " + action
        c.String(http.StatusOK, message)
    })

    router.Run(":8080")
}
```

GBは単体の.goのファイルの実行やビルドはサポートしていません。
なので実行するには一度ビルドをする必要があります。

```
$ gb build
$ bin/hello
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET   /user/:name               --> main.main.func1 (3 handlers)
[GIN-debug] GET   /user/:name/*action       --> main.main.func2 (3 handlers)
[GIN-debug] Listening and serving HTTP on :8080
```

こんな感じで実行できます。
ブラウザから http://localhost:8080/user/oresama 等と打って動作確認してみましょう。
rmagickのインストール

###参考
- [CentOS に ImageMagick, RMagick のインストール](http://akkunchoi.github.io/imagemagick-rmagick-centos.html)


##Yumでインストール
```
sudo yum install ImageMagick ImageMagick-devel -y
```

##gemでライブラリをインストール

```
gem install rmagick
```

※sudoじゃなきゃだめかも


ライブラリ名が異なる？？らしくRubyやRailsから呼び出す際には、

```
require 'RMagick'
```

やら

```
gem 'rmagick', :require => 'RMagick'
```

のような書き方が必要
剰余なしFizzBuzz

# 剰余なしFizzBuzz

特に意味はないけどなんとなく再帰で書きたくなったので。

```rb
#!/usr/bin/env ruby

def a(j)
  v = {
    3  => "Fizz",
    5  => "Buzz",
    6  => "Fizz",
    9  => "Fizz",
    10 => "Buzz",
    12 => "Fizz",
    15 => "FizzBuzz",
  }

  b = lambda { |i, l|
      k = i+15*l
      print v[i] || k
      (i >= 15 ? b.call(1, l+1) : b.call(i+1, l)) if j > k
  }

  b.call(1, 0)
end

a(100)
```
Django: モデルシグナルをCelery経由で非同期に処理する


## デリゲートタスク

- `pydoc.locate` でモジュールをみつけて、 関数名で呼び出すタスクを定義
- モデルインスタンスをシリアライズできないので id で渡してもらうからそれで復元する
- 関数を呼ぶ際に `delayed=True` の引数を付与する

~~~py
from celery.task import task
import pydoc

@task
def async_delegate(modname, funcname, instance_id=None, sender=None,
               *args, **kwargs):
    if sender and instance_id:
        instance = sender.objects.get(id=instance_id)
        mod = pydoc.locate(modname)
        getattr(mod, funcname)(instance=instance, delayed=True,
                               *args, **kwargs)
~~~


## デコレータ

- シグナルからの呼び出しをインターセプトする
- `signal` 引数は無視して、 呼び出しを`async_call` にデリゲートする
- `instance` の代わりに `instnace_id` を渡す
- `async_delegate` から代理呼び出しされると`delayed=True` になっているので、実際のシグナルレシーバーを呼ぶ

~~~py
from functools import wraps

def async_signal(*args, **kwargs):
    def _wrapper(decorated, *wargs, **wkwargs):
        def _decorator(instance,
                       delayed=False, signal=None, *dargs, **dkwargs):
            if delayed:
                return decorated(instance, *dargs, **dkwargs)
            else:
                async_delegate.delay(
                    decorated.__module__, decorated.func_name,
                    instance_id=instance.id,
                    *dargs, **dkwargs)

        return wraps(decorated)(_decorator)

    return _wrapper
~~~    

## シグナルレシーバ

-  `@async_signal` デコレートした関数を `@recevier` で登録する

~~~py
from django.dispatch import receiver
from django.db.models.signals import post_save
from django.contrib.auth.models import User


@receiver(post_save, sender=User)
@async_signal()
def on_user_saved(instance, **kwargs):
    print instance, "is saved."
~~~
Alfred Qiita WorkflowをGoで書き直した

![Cover](http://randompaper.co.s3.amazonaws.com/alfred-qiita-workflow/alfred-qiita-workflow.png)

Rubyで書かれている [Alfred Qiita Workflow](https://github.com/uetchy/alfred-qiita-workflow) を[バグ修正](https://github.com/uetchy/alfred-qiita-workflow/issues/3)のついでにGoで書き直した。

Qiita API v2にも対応し、ユーザー名とパスワードの代わりに[Personal Access Token](https://qiita.com/settings/tokens/new)を使うようにした。これで、ストックした記事や自分で書いた記事を検索することがより気軽に出来るようになった。

Alfredに返却するXMLの生成には[go-alfred](https://github.com/pascalw/go-alfred)というライブラリを利用した。

## go-qiita

Alfred Qiita Workflow の APIクライアント部分を切り出して [go-qiita](https://github.com/uetchy/go-qiita) としてリリースした。Workflowで必要だった部分しか実装してないが、記事の検索など基本的なことは出来る。

設計はGoogleの [go-github](https://github.com/google/go-github) を参考にしており、クライアントの初期化時に、以下のようにhttp.Client互換のインターフェースを渡してやれば、それを経由して通信するようになっている。

```go
// Personal Access Tokenを使ったOAuth2クライアントを作る
ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: "personal access token"})
tc := oauth2.NewClient(oauth2.NoContext, ts)

// OAuth2クライアントをgo-qiitaに引き渡す
client := qiita.NewClient(tc)

// 今までに書いた記事を取得
items, _, _ := client.AuthenticatedUser.Items()
```

このようにすることで、APIクライアントは認証系を気にせずAPIサーバーとのやりとりを考えることが出来る。このやり方はかなりスマートだと思うのでもっと流行って欲しい。

ちなみに認証をしない場合は`NewClient()`に`nil`を渡せばよい。

```go
client := qiita.NewClient(nil)
```
rbenvでRubyをインストール

###参考サイト
- [https://github.com/sstephenson/rbenv](https://github.com/sstephenson/rbenv)


###依存ライブリをインストール
- yum
```
sudo yum -y install gcc make openssl openssl-devel gcc-c++ mysql-devel readline-devel libxml2-devel libxslt-devel bzip2
```

- apt-get
```
sudo apt-get install -y libreadline-dev git build-essential libssl-dev zlib1g-dev libyaml-dev libffi-dev zlib1g-dev
```

##全ユーザーで共通のrbenvを利用

###rubyグループを作成

```
sudo groupadd ruby
sudo usermod -aG ruby myuser
sudo groups myuser
```

###rbenvをインストール

```
cd /usr/local
git clone https://github.com/sstephenson/rbenv.git rbenv
mkdir rbenv/shims rbenv/versions rbenv/plugins

cd rbenv/plugins
git clone https://github.com/sstephenson/ruby-build.git ruby-build
cd ruby-build
./install.sh

cd /usr/local

chgrp -R ruby rbenv
chmod -R g+rwxX rbenv

echo 'export RBENV_ROOT="/usr/local/rbenv"'     >> /etc/profile.d/rbenv.sh
echo 'export PATH="/usr/local/rbenv/bin:$PATH"' >> /etc/profile.d/rbenv.sh
echo 'eval "$(rbenv init -)"'                   >> /etc/profile.d/rbenv.sh

source /etc/profile.d/rbenv.sh

echo $PATH
```

###rubyをインストール

```
rbenv install --list-all

rbenv install -v 3.2.2

rbenv versions

rbenv global 3.2.2

rbenv rehash

rbenv versions

ruby -v
```

###折角なのでgemをアップデート
```
gem update
gem install bundler
```


---

##ユーザー別のインストールする場合

###rbenvをインストール

```
cd ~
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile

echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

exec $SHELL -l
```

###確認

```
rbenv -v
```
Webminをインストール

###参考：
- [Webminインストール](http://www.server-world.info/query?os=CentOS_6&p=webmin)

##インストールに必要なパールモジュールをインストールする

```
 yum -y install perl-Net-SSLeay
```

###最新版を入手

[公式サイト](http://download.webmin.com/download/yum/)

```
mkdir /downloads
cd /downloads

wget http://download.webmin.com/download/yum/webmin-1.630-1.noarch.rpm

rpm -Uvh webmin-1.630-1.noarch.rpm

# アクセス制限を掛ける場合
cp /etc/webmin/miniserv.conf /etc/webmin/miniserv.conf.org
vim /etc/webmin/miniserv.conf


 # 最終行：アクセス許可するIP追記
allow=127.0.0.1 10.0.0.0/24
```

###再起動

```
service webmin restart
```
サーバーの初期設定

##yumを最新状態にする
```
sudo yum update -y
```

##使用言語を日本語に設定
```
sudo cp /etc/sysconfig/i18n /etc/sysconfig/i18n.org
sudo vim /etc/sysconfig/i18n
```

#####/etc/sysconfig/i18n
```
LANG="ja_JP.utf-8"

SYSFONT="latarcyrheb-sun16"
```

##サーバーに時間変更（日本時間）
```
sudo mv /etc/localtime /etc/localtime.org
sudo ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

再度ログインで日本語化(dateで確認)

### タイムゾーンを変更したらcrondを再起動しないと反映されない
```
-sudo service crond restart
```


##サーバーのホスト名を変更する

```
sudo cp /etc/sysconfig/network /etc/sysconfig/network.org
sudo vim /etc/sysconfig/network
```

#####/etc/sysconfig/network
```
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=sample.abgata.org
```


##hostsの設定
```
sudo cp /etc/hosts /etc/hosts.org
sudo vim /etc/hosts
```

#####/etc/hosts
```
127.0.0.1 sample.abgata.org localhost.localdomain

```

###設定後はネットワークを再起動

```
sudo /etc/rc.d/init.d/network restart
```

##ユーザーを追加
```
useradd myuser
passwd myuser

usermod -G wheel myuser
```

##ユーザーにsudo権限を付与
```
cp /etc/sudoers /etc/sudoers.org

visudo
```

#####visudo
```
# %wheel ~~
# ↓
%wheel ~~
```
※一番最初のもの

##sshの設定を変更

```
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org

vim /etc/ssh/sshd_config

```

#####/etc/ssh/sshd_config

```
Port YOUR_PORT_NUMBER
PasswordAuthentication yes
PermitRootLogin no
PubkeyAuthentication yes
```



##sshdを再起動して設定を反映
```
service sshd restart
```

##SSH接続してみる
```
ssh -p YOUR_PORT_NUMBER myuser@192.168.10.10
```
iptablesの設定

##設定ファイルを作成
```
sudo vim /etc/sysconfig/iptables
```

#####/etc/sysconfig/iptables

```
*filter
:INPUT    DROP    [0:0]
:FORWARD  DROP    [0:0]
:OUTPUT   ACCEPT  [0:0]
:SERVICES -       [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4  -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -j SERVICES
-A INPUT -p udp --sport 53 -j ACCEPT
-A INPUT -p udp --sport 123 --dport 123 -j ACCEPT

-A SERVICES -p tcp --dport 25 -j ACCEPT
-A SERVICES -p tcp --dport 110 -j ACCEPT
-A SERVICES -p tcp --dport 587 -j ACCEPT
-A SERVICES -p tcp --dport 80 -j ACCEPT
-A SERVICES -p tcp --dport 443 -j ACCEPT

-A INPUT -p udp -m udp --dport 137:138 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 139 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 445 -j ACCEPT


COMMIT

```

##設定を反映
```

sudo service iptables restart

sudo iptables -L

sudo chkconfig iptables on

sudo chkconfig --list iptables

```
apache php mysqlをインストール(yum)

##apache
```
sudo yum install httpd
sudo chkconfig httpd on
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
vim /etc/httpd/conf/httpd.conf
```

##### /etc/httpd/conf/httpd.conf
```
ServerTokens Prod
ServerSignature Off
Options Indexes → Options -Indexes FollowSymLinks
※var/www/html内のもの
ServerName www.example.com:80
NameVirtualHost *:80
```

###設定を反映
```
sudo service httpd configtest
sudo service httpd start
chkconfig httpd on
```

###※ヴァーチャルホストの設定を別ファイルに記載でもOK

```
cd /etc/httpd/conf.d
vim vhost.conf
```

###バーチャルホスト用にフォルダを作成

```
mkdir -p /var/www/vhosts/default/public
```

##php

```
yum install -y php php-devel php-mysql php-mbstring php-gd php-pear httpd-devel
php -v
cp /etc/php.ini /etc/php.ini.org
vim /etc/php.ini
```

#####/etc/php.ini

```
error_log = /var/log/php.log
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED
display_errors = On
mbstring.language = Japanese
expose_php = Off
date.timezone = Asia/Tokyo
max_execution_time = 300
magic_quotes_gpc = Off
upload_max_filesize = 200M
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = pass
mbstring.detect_order = auto
;mbstring.substitute_character = none;

max_file_uploads = 100
post_max_size = 100M
upload_max_filesize 100M

```


###設定を反映

```
service httpd restart
```


##mysql

```
yum install -y mysql-server
cp /etc/my.cnf /etc/my.cnf.org
vim /etc/my.cnf
```

#####/etc/my.cnf

```
[mysqld]以下に追加
character_set_server=utf8
default-storage-engine=InnoDB
innodb_file_per_table
group_concat_max_len=10000000

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

```

###設定を反映

```
service mysqld start
chkconfig mysqld on
```

###mysqlの初期設定

```
mysql_secure_installation
mysql -u root -p
```
SSHの公開鍵認証

###参考サイト
- [CentOS で公開鍵暗号方式を使用した SSH ログイン設定](http://fnya.cocolog-nifty.com/blog/2012/03/centos-ssh-8291.html)

##秘密鍵と公開鍵を作成
```
	ssh-keygen -t rsa -b 4096 -C "sample@sample.com"
```

##公開鍵を転送
```
	scp -P 22 id_rsa.pub user@hostname/.ssh
```

##公開鍵を設定
```
	mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
	chmod 600 ~/.ssh/authorized_keys
```

## 権限設定が必要
```
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 400 ~/.ssh/id_rsa
```
##SSHで公開鍵認証を設定
```
	sudo vim /etc/ssh/sshd_config
```



#####/etc/ssh/sshd_config
```
	PubkeyAuthentication yes
```

##sshdを再起動
```
	sudo service sshd restart
```

##公開鍵でSSH接続する
```
	ssh -i ~/.ssh/id_rsa user@hostname
```
~/.ssh/id_rsa であれば省略可能
FTPサーバーの設定

###参考サイト
- [FTP サーバー（vsftpd）のインストールと設定 〜 CentOS6](http://easyramble.com/install-setup-fsftpd.html)
- [vsftp設定 ～ SSL接続/PASV接続](http://www.geocities.co.jp/SiliconValley-PaloAlto/3626/server_setting/vsftpd/20070126_vsftpd.htm)
- [セキュアFTPサーバの構築(vsftpd+SSL/TLS:SuSE編)](http://www.aconus.com/~oyaji/suse/vsftpd_ssl_suse.htm)

##FTPサーバー導入の経緯
最近は、GitもしくはSFTPでのファイルのやりとりが多く、

普段、FTPってあんまり使わないのでFTPサーバーをインストールしていなかったのだが、

クライアント様のサーバーでFTPを利用したいとの事だったので設定した。

折角なので、備忘録として記載しておくことに


##vsftpd のインストール
```
sudo yum -y install vsftpd

sudo service vsftpd start

sudo chkconfig vsftpd on
```

で、後はポート開放して完了。


結構あっさりですね。

ただ、このまま使うにはあまりにも無防備すぎるのと、

今回のクライアント様のご要望は、SSL通信での利用を想定との事だったため、もう少し設定する。


##一般設定

```
sudo vim /etc/vsftpd/vsftpd.conf
```

#####/etc/vsftpd/vsftpd.conf
```
anonymous_enable=NO
# Anonymous FTP接続の禁止。

local_enable=YES
# ローカルユーザのログインを許可。

write_enable=YES
# 書き込み(Upload)許可。公開専用の場合はNOにすると書き込み禁止にできる。

local_umask=022
# ローカルユーザのumask値。

listen_port=10021
# FTP制御チャンネルの接続待ち受けポートの指定。
# デフォルトポートの利用には抵抗がある

connect_from_port_20=NO
# Activeモード時のデータコネクションポートの指定。
# 今回はpasv接続にするのでNO。

nopriv_user=ftp
# vsftpが利用する非特権ユーザ名の指定を ftp に指定。

chroot_local_user=YES
# ローカルユーザの操作範囲を自身のホームディレクトリ内のみに行動を制限(chroot)する。

chroot_list_enable=NO
# 「chroot_local_user=YES」とした場合にchrootしない例外ユーザを許可しないに指定。
# YESにした場合「chroot_list_file=/etc/vsftpd.chroot_list」を登録

ftpd_banner=Welcome to blah FTP service.
# クライアントソフト名が表示されるのを変更

```


##SSL関係設定

```
sudo vim /etc/vsftpd/vsftpd.conf
```

#####/etc/vsftpd/vsftpd.conf

```
rsa_cert_file=/etc/ssl/certs/vsftp.pem
# vsftpd用の証明書ファイルの指定。SSL証明書の発行方法は省略

rsa_private_key_file=/etc/ssl/certs/vsftp.key
# vsftpd用の秘密鍵ファイル

rsa_cert_file=/etc/ssl/certs/ftp.pem
# vsftpd用の証明書ファイルの指定。SSL証明書の発行方法は省略

use_localtime=YES
# 時刻の扱いをローカルタイムにする。

userlist_enable=YES
# ユーザリストによる規制をかける。

userlist_deny=YES
# ユーザリストをログイン不可ユーザの一覧とする。（NOだとログイン可のユーザ一覧になる）

userlist_file=/etc/ftpusers
# ユーザリストの指定。

pasv_min_port=30000
# Pasv接続で外部からのコネクション利用を許可するポート範囲の最小値。

pasv_max_port=30100
# Pasv接続で外部からのコネクション利用を許可するポート範囲の最大値。

ssl_enable=YES
# SSL接続の有効化

ssl_tlsv1=YES
# vsftpd はSSLのプロトコルとして、SSL v2(ssl_sslv2)、SSL v3(ssl_sslv3)、TLS v1(ssl_tlsv1)の3種類をサポートしているが、デフォルトはTLS v1であり、多くの場合、この設定で問題ないのでデフォルトのままとする。

force_local_logins_ssl=YES
# 制御チャンネル（ログイン等）でSSL接続しか許可しない。

force_local_data_ssl=YES
# データチャンネルでSSL接続しか許可しない。

```


##再起動で反映

```
sudo service vsftpd restart
```

##FTPS接続の種類

【FTP over SSL には Explicit、Implicitの2種類がある】

違いはコネクションを張る際にクライアントが明示的にSSL化を要求するか、暗黙でSSL化するか。

###Explicit
Conntct直後にSSLに切り替える要求をクライアントから明示的に送信する（ここは平文）。

この際にポートは平文時と同じポート21等を使う（参考：RFC2228）。
その後Login及びデータはSSL化される。

従来の平文運用との併用は比較的し易そう。別途SSL用にポートも使わないので。

ただしSSL切り替えのオーバーヘッドが少しあるが余程のトラフィックがなければ気にならない程度だとは思う。

###Implicit

Conntct直後以降クライアント/サーバは自動的に暗黙でSSL化する。
この際ポート990などのSSL用に設けたポートを使う。

SSLでしか接続させない仕様。

ポート990はクライアント/サーバの設定次第なので変更できるだろうが、このポートを使って従来の平文接続はできないのが大きな違いか。


いずれの場合もデータのセキュアさには差は無いと思う。
SSL証明書の発行方法

##SSL証明書の発行
```
cd /etc/pki/tls/certs
# 鍵ファイル作成用の乱数を発行
openssl md5 * > my_rand.dat

# 鍵ファイルを作成
openssl genrsa -rand my_rand.dat -des3 2048 > my_key.pem

# 鍵ファイル内にパスプレーズを埋め込む
openssl rsa -in my_key.pem -out my_key.pem

# ssl認証局提出用のcsrファイルを作成※このままでは使えません
openssl req -new -key my_key.pem -out my_csr.pem

# オレオレ証明書を作成
openssl req -new -x509 -days 3650 -key my_key.pem -out my_crt.pem


アクセス権変更
chmod 400 my_key.pem
chmod 400 my_crt.pem


vim /etc/httpd/conf.d/ssl.conf
```

#####/etc/httpd/conf.d/ssl.conf
```
SSLCertificateFile /etc/pki/tls/certs/my_crt.pem

SSLCertificateKeyFile /etc/pki/tls/certs/my_key.pem

```

apacheを再起動して設定を反映

```
service httpd restart
```
Node.jsのデーモン化ツールpm2をインストール

##npmでグローバルにインストール
```
npm install -g pm2
```

##スクリプトを登録
```
pm2 start sample001.js
```


##スクリプトを確認
```
pm2 list
```

##スクリプトを止める
```
# listで確認して、appで登録されたスクリプトを止めたい場合
pm2 stop app
```

##ログを参照
```
pm2 logs
```

##モニタリング
```
pm2 monit
```
Node.jsをnodebrewでインストール

##nodeユーザーでnodebrewをインストールする

```
# ユーザーディレクトリにインストールされるので、全ユーザーで利用する場合はノードユーザー作ってインストールして共通パス通すのがいいかも

useradd node

cd /home/node

chmod -R 777 /home/node

su node

curl -L git.io/nodebrew | perl - setup

exit

# ユーザー権限でも実行したい場合は実行グループ作って登録すれば大丈夫。
```
## PATHをとおす
```
echo 'export PATH="/home/node/.nodebrew/current/bin:$PATH"'     >> /etc/profile.d/nodebrew.sh
# echo 'export PATH="/home/node/.nodebrew/current/bin:$PATH"'     >> /etc/profile.d/nodebrew.sh

source /etc/profile.d/nodebrew.sh

echo $PATH
```

##nodeグループを作成
```
groupadd node
usermod -G wheel,node myuser
# usermod -G wheel,node,ruby myuser
groups myuser
```

##.nodebrewの所有グループを変更

```
cd /home/node
chgrp -R node .nodebrew
chmod -R g+rwxX .nodebrew
```

##/home/nodeへの閲覧権限がなかったのでグループをwheelに変更

```
sudo chgrp wheel /root
```

##インストール可能なバージョンの確認
```
nodebrew ls-all
# 奇数バージョンは開発版、偶数バージョンが安定版らしい
```


##インストール(バイナリからインストールしたほうが速い)
```
nodebrew install-binary v0.10.20
# インストールはユーザーディレクトリにされるっぽいのでノードユーザーでインストールする
```

##利用するバージョンを変更
```
nodebrew use v0.10.20
```

##現在のバージョンを確認
```
node -v
```


##サーバーサンプル
```
var http = require('http');

http.createServer(function (request, response) {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Hello Node.js');
}).listen(8124);

console.log('Server running at http://localhost:8124');
```
nginxとapacheの共存

###参考URL:
- [Nginxでリバースプロキシを設定し、Apacheと共存させる](http://abeerforyou.com/?p=430)

##nginxでリバースプロキシした際にIP情報を正しく取れるようにモジュールを追加
```
sudo yum install httpd-devel

cd /root/tmp
wget http://www.openinfo.co.uk/apache/extract_forwarded-2.0.2.tar.gz
tar zxf extract_forwarded-2.0.2.tar.gz
cd extract_forwarded
apxs -i -c -a mod_extract_forwarded.c
```


##apacheの実行ユーザーとポートを変更

```
vim /etc/httpd/conf/httpd.conf
```
#####/etc/httpd/conf/httpd.conf
```
Listen 8080

#####
User nginx
Group nginx
#####
ServerName sample.jp:8080

# 最終行に追加
MEForder refuse,accept
MEFrefuse all
# Nginx（リバースプロキシ）のIPアドレス
MEFaccept 127.0.0.1


# ヴァーチャルホスト使っている場合はヴァーチャルホストのポートも変更
```

apacheを再起動して設定を反映

```
service httpd restart
```

##nginxでの転送設定

```
cd /etc/nginx/conf.d
vim default.conf
```
#####default.conf
```
#デフォルトサーバー
server {
    listen       80;
    server_name  backend;

    # このサーバへの全てのアクセスを転送
    location / {
            proxy_pass http://127.0.0.1:8080;
            proxy_redirect                         off;

            # この設定がなくても.htaccessでの制限は可能。
            # ただし、cgi等から参照した際にNginxのIPアドレスになる。
            proxy_set_header Host                   $host;

            proxy_set_header X-Real-IP              $remote_addr;

            # 以下は、cgi等で明示的に利用していなければ、有効にする必要なし。
            proxy_set_header X-Forwarded-Host      $host;
            proxy_set_header X-Forwarded-Server    $host;

            # この設定がなくてもcgi等から正しいIPを確認可能。
            # ただし、.htaccessでの制限は不可。
            proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
    }
}


```


最初に↓入れたほうがいいかも？？


```
# キャッシュ関連設定
proxy_cache_path  /var/cache/nginx levels=1:2 keys_zone=czone:4m max_size=50m inactive=120m;
proxy_temp_path   /var/tmp/nginx;
proxy_cache_key   "$scheme://$host$request_uri";
proxy_set_header  Host               $host;
proxy_set_header  X-Real-IP          $remote_addr;
proxy_set_header  X-Forwarded-Host   $host;
proxy_set_header  X-Forwarded-Server $host;
proxy_set_header  X-Forwarded-For    $proxy_add_x_forwarded_for;

# バックエンドサーバ−（Apache）設定
upstream backend {
    # ip_hash;
    server 127.0.0.1:8080;
}

```

nginxを再起動して設定を反映

```
service nginx restart
```
nginxのインストール

```
vim /etc/yum.repos.d/nginx.repo
```

#####/etc/yum.repos.d/nginx.repo
```
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1
```

```
sudo yum install -y nginx

cd /etc/nginx
sudo mkdir sites-avalable
sudo mkdir sites-enabled
# sudo rm -f conf.d/*.conf

cd conf.d
cp default.conf default.conf.org
cp example_ssl.conf example_ssl.conf.org


cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org

sudo vim /etc/nginx/nginx.conf
```
#####/etc/nginx/nginx.conf

```
# 下から二行目に追加

include /etc/nginx/sites-enabled/*;

```

### アップロードできるファイルサイズを上げて置く

```nginx.conf


```



# 自動起動をON

```
service nginx start

chkconfig nginx on

```
select_for_updateについて(並列処理の運用)

###参考サイト
- [ActiveRecord::Locking::Pessimistic](http://api.rubyonrails.org/classes/ActiveRecord/Locking/Pessimistic.html)
- [MySQL MySQL 5.1 リファレンスマニュアル (オンラインヘルプ) ](http://dev.mysql.com/doc/refman/5.1-olh/ja/innodb-locking-reads.html)
- [SELECT FOR UPDATEとロックの挙動](http://d.hatena.ne.jp/walf443/20130829/1377788440)


##サンプル
```
begin;

select * from t_sample where id > 1 AND flg = 0 order by id asc limit1 for update;

commit;
# コミットするまでは、同一のレコードへ処理（select文を含む)をロックする

```


###注意点

- トランザクションの効くストレージエンジン(innodb)でのみ有効
- for update をつけていないクエリはロックされない
- 同一のレコードへの処理をロックするため別条件で別レコードへの処理はロックされない

```
where id = 1

```
と

```
where id = 2

```

であればロックされない

```
where id > 1

```
と

```
where id = 2

```

であればロックされる


##ActiveRecordでの利用方法

```
Sample.transaction do
	# select * from table where flg = 0 limit 1 for update
	@target = Sample.where("flg = 0 ").lock(true).first

	@target['flg'] = 1
	@target.save

end


```
MySQLのレプリケーション設定

##マスター側設定

###レプリケーション用のユーザーを作成

```
GRANT REPLICATION SLAVE ON *.* TO repl@% IDENTIFIED BY 'password';
```

###my.cnf(winの場合はmy.ini)を修正（追加）

```
[mysqld]
log-bin = mysql-bin
server-id = 1001
```

###mysqlを再起動
```
service mysqld restart
```

###mysqlのスナップショットを作成

####mysqlにて
```
# DBロック
FLUSH TABLES WITH READ LOCK;

# 現在のバイナリポジションを取得
SHOW MASTER STATUS;

# File、Positionはスレーブ側の設定に必要なので控えておく

```


### 別ターミナル等でDBのバックアップを取る(mysqldumpを利用)

```
mysqldump -u user -p --all-databases --lock-all-tables > snapshot.db
```

###DBロックを解除

####mysqlにて
```
UNLOCK TABLES;
```




##スレーブ側設定

###my.cnfを修正(追加)

```
[mysqld]
log-bin=mysql-bin
log_slave_updates #このスレーブを他のマスターとして使いたい場合追加
server-id=1002
```

###マスタで作成したスナップショットを復元

```
mysql -u user -p  < snapshot.db
```
###mysqlを再起動

```
service mysqld restart
```

###マスタ情報を登録

```
CHANGE MASTER TO
MASTER_HOST='sample.com',
MASTER_USER='rep-user',
MASTER_PASSWORD='passwd',
MASTER_LOG_FILE='mysql-bin.000001', #マスターのFIle
MASTER_LOG_POS=98; #マスターのPosition
```

###スレーブをスタート

```
START SLAVE;
# STOP SLAVE;RESTART SLAVE;RESET SLAVE;
```

###起動確認

```
SHOW SLAVE STATUS\G
```
mysqlサーバーの設定(mroonga)

###参考URL:
- [MySQLでgroongaを利用して高速に日本語の全文検索を行う](http://linuxserver.jp/%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89/db/mysql/%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2-groonga.php)
- [2.5. CentOS &mdash; Groonga v4.0.1ドキュメント](http://groonga.org/ja/docs/install/centos.html#centos-6)




```
rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm
# --forceで強制的に上書き
yum makecache
yum -y update

yum -y install mysql-server
# version5.1.67を指定しないとだめかも

yum install -y groonga groonga-devel groonga-tokenizer-mecab mecab-ipadic mecab-jumandic
```


##MySQLの設定
```
cp /etc/my.cnf /etc/my.cnf.org
vim /etc/my.cnf
```

##MySQLの初期設定

```
mysql_secure_installation
```

##MySQLを起動

```
service mysqld start
yum -y install mysql-groonga
service mysqld restart
chkconfig mysqld on
mysql -u root -p
```

###利用可能なストレージエンジンを確認
```
mysql> SHOW ENGINES \G
```
Apache SparkのDataFrameでrow_numberを実行する方法

SQLのWindow関数の `row_number` 便利ですよね。
Apache Sparkの `DataFrame` でも `1.4.0` 以降なら `row_number` 使えます :smiley: 

### DataFrameのサンプル

|version|name|
|-------|----|
|1.0| Apple Pie |
|1.1| Banana Bread |
|1.5| Cupcake |
|1.6| Donut |
|2.0| Eclair |
|2.1| Froyo |
|2.3| Gingerbread |
|3| Honeycomb |
|4.0| Ice Cream Sandwich |
|4.3| Jelly Bean |
|4.4| KitKat |

### row_number
`org.apache.spark.sql.expressions.Window` をimportして `rowNumber().over()` に渡します。

```scala
import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._

val identified = df.select(
    rowNumber().over( Window.partitionBy().orderBy() ) as "id",
    $"version",
    $"name",
)
```

↑みたいに `partitionBy` に引数を渡さないと全データに対して通番がふられます。

```js
identified.take(5)
res1: Array[org.apache.spark.sql.Row] = Array([1,"1.0","Apple Pie"], [2,"1.1","Banana Bread"], [3,"1.5","Cupcake"], [4,"1.6","Donut"], [5,"2.0","Eclair"])
```
MySQLのバックアップを自動化


```
cd

mkdir backup
mkdir backup/mysql

vim mysql_backup.sh
```
#####mysql_backup.sh

```
#!/bin/sh

# バックアップファイルを何日分残しておくか
period=1
# バックアップファイルを保存するディレクトリ
dirpath='/root/backup/mysql'
cd $dirpath

#mysql_password
mysqlpassword="passwd"

# ファイル名を定義(※ファイル名で日付がわかるようにしておきます)
mydate=`date +%y%m%d%H%M%S`
filename="mysql_$mydate.sql"
zipfilename="mysql_$mydate.sql.tar.gz"
# スレーブ停止
mysql -uroot -p$mysqlpassword -e "flush tables;"
mysql -uroot -p$mysqlpassword -e "stop slave;"

# mysqldump実行
mysqldump -uroot -p$mysqlpassword -A -E > $filename

# スレーブ開始
mysql -uroot -p$mysqlpassword -e "start slave;"

#backup実行
tar -zcvf $zipfilename $filename

# 圧縮前のファイルを削除
rm -f $filename

# パーミッション変更
chmod 700 $zipfilename

# 古いバックアップファイルを削除
find $dirpath -type f -daystart -mtime +3 -exec rm {} \;

```

###実行権限を付与
```
chmod 700 mysql_backup.sh
```

##cronをインストール

```
yum install cronie-anacron
# cron.dailyをランダム実行したくない場合は yum -y install cronie-noanacron

chkconfig --level 2345 crond on
chkconfig --list crond  

crontab -e

```

```
0 3 * * * bash /path/to/mysql_backup.sh
```
###設定済みのクーロンを確認

```
crontab -l
```
ruby2.2で引数省略の警告対応

# warning: circular argument reference警告対応

> vendor/bundle/ruby/2.2.0/gems/activesupport-4.1.0/lib/active_support/values/time_zone.rb:285: warning: circular argument reference - now

という出力が毎回出るのが鬱陶しいので調査した。

## 参考

* [warning: circular argument reference を回避する - コバログ](http://cobachie.hatenablog.com/entry/2015/05/13/134200)

## 対策

* vendor/bundle/ruby/2.2.0/gems/activesupport-4.1.0/lib/active_support/values/time_zone.rb

```diff:
-   def parse(str, now=now)
+   def parse(str, now=now())
      parts = Date._parse(str, false)
      return if parts.empty?

      time = Time.new(
        parts.fetch(:year, now.year),
        parts.fetch(:mon, now.month),
        parts.fetch(:mday, now.day),
        parts.fetch(:hour, 0),
        parts.fetch(:min, 0),
        parts.fetch(:sec, 0) + parts.fetch(:sec_fraction, 0),
        parts.fetch(:offset, 0)
      )
```

これで出なくなりました。

# warning: circular argument reference - reflection

* 参考: [引数省略時の値を引数と同名のメソッドで設定していると Ruby 2.2 で動かなくなる場合がある - Qiita](http://qiita.com/labocho/items/35220ad2607b6d488ee0)

> vendor/bundle/ruby/2.2.0/gems/activerecord-4.1.0/lib/active_record/associations/has_many_association.rb:101: warning: circular argument reference - reflection

## 対策

* vendor/bundle/ruby/2.2.0/gems/activerecord-4.1.0/lib/active_record/associations/has_many_association.rb

```bash:
sed -i -e "s/reflection = reflection/reflection = reflection()/g" \
  vendor/bundle/ruby/2.2.0/gems/activerecord-4.1.0/lib/active_record/associations/has_many_association.rb
```
mongodbの設定手順

###参考URL
- [公式サイト](http://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat-centos-or-fedora-linux/)

- [ドットインストール](http://dotinstall.com/lessons/basic_sakura_vps/8021)

####※2ヶ月ほど前と内容が少し変わっていたので、毎回確認したほうがいいかもしれないです。

##yumでインストールできるようにリポジトリを追加

```
sudo vim /etc/yum.repos.d/mongodb.repo
```

#####/etc/yum.repos.d/mongodb.repo

```
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
```

##yumでmongodbをインストール

```
sudo yum update -y
sudo yum install mongodb-org -y
```

##mongodbを起動

```
service mongod start
```

##起動時に自動起動設定

```
chkconfig mongod on
```

##バージョンを確認

```
mongo --version
```

##シェルを起動

```
mongo
```

##シェルを終了

```
exit
```

##ユーザー認証をONにする
※mongod起動時にオプション指定でも可能ですが、毎回指定するの面倒なので設定ファイルを変更しています。

##設定ファイルをバックアップ

```
cp /etc/mongod.conf /etc/mongod.conf.org
```

##設定ファイルを変更

```
sudo vim /etc/mongod.conf
```

#####/etc/mongod.conf
```
auth = ture
```


##mongodbを再起動

```
service mongod restart
```



##管理者ユーザーの作成

```
use admin
db.addUser("admin","master_passpass")
```



##ユーザー認証

```
db.auth("admin","master_passpass")
```

##管理者ユーザーの確認

```
db.system.users.find()
```


##DBの切り替え

```
use test
```

##ユーザーの作成

```
db.addUser("test_user","test_passpass")
```

##ユーザーの確認

```
db.system.users.find()
```

##ユーザーの削除

```
db.system.users.remove({user:"test"})
```


##ユーザー認証

```
db.auth("test_user","test_passpass")
```

##テストデータの登録

```
db.test.save( { a: 1 } )
```

##テストデータの閲覧

```
db.test.find()
```
PHPでmongodbを使えるようにする

##依存パッケージをインストール

```
sudo yum -y install php-pear
sudo yum -y install php-devel
sudo yum -y install httpd-devel
sudo yum -y install gcc
sudo yum -y install make
```

##pcelでインストール

```
pecl install mongo
```

##mongodb用の設定ファイルを追加

```
vim /etc/php.d/mongo.ini
```


#####/etc/php.d/mongo.ini

```
[mongo]
extension=mongo.so

```


##apacheを再起動して設定を反映

```
service httpd restart
```
MacBookPro が頻繁にフリーズするのでディスクを修正してみた

##MacBookPro Early 2013

ディスクユーティリティで __ディスクを検証__ をクリック

![ディスクユーティリティ](https://abgata.s3-ap-northeast-1.amazonaws.com/bdbb85050a068740ccbe117e7ac18115.png)


待つこと数分、

「ディスクが壊れているのでRecorvery HD でディスクを修復してください」といった感じのメッセージが出てきた。


再起動してappleマークが表示されている間 __cmd + R__ を長押しして
ディスクユーティリティを選択

ディスクを検証して、エラーが出たら、ディスクを修正

10分強くらいでディスクが修正されました。


これで治ったらいいな。
GitのプッシュでHPの更新(反映)

##gitのグローバル設定

```
git config --global user.name "abgata20000"
git config --global user.email "abgata@abgata.jp"
git config --global color.ui true
```
##gitの設定確認
```
git config -l
```

##現在のディレクトリを共有リポジトリにする

```
git init --bare --share
```

##レポジトリをクローンする

```
git clone /git/smaple.git
```

##pushされた際のhooks(post-receive)

```
cd hooks
vim post-receive
```


#####post-receive

```
#!/bin/sh
cd /var/www/vhosts/
git --git-dir=.git pull origin master
```

実行権限を付与

```
chmod +x post-receive
```
graphicsmagicをインストール

###参考URL：
- [GraphicsMagick-1.3.12-1.el6.x86_64.rpm](http://pkgs.org/centos-6-rhel-6/naulinux-school-x86_64/GraphicsMagick-1.3.12-1.el6.x86_64.rpm.html)

```
vim /etc/yum.repos.d/naulinux-school.repo
```

#####/etc/yum.repos.d/naulinux-school.repo
```
[naulinux-school]
name=NauLinux School
baseurl=http://downloads.naulinux.ru/pub/NauLinux/6.2/$basearch/sites/School/RPMS/
enabled=0
gpgcheck=1
gpgkey=http://downloads.naulinux.ru/pub/NauLinux/RPM-GPG-KEY-linux-ink

```

##インストール

```
sudo yum --enablerepo=naulinux-school install GraphicsMagick -y
```
fffmepgをYumでインストールする

###参考URL：
- [Cent OS 6.3にffmpegをインストールする方法](http://hrysim.hatenablog.jp/entry/2013/02/05/101411)

##yum-prioritiesプラグイン導入

```
sudo yum -y install yum-plugin-priorities

# 標準リポジトリとRPMforgeリポジトリの両方で提供されるパッケージについて、yum-prioritiesプラグインを導入して標準リポジトリのパッケージがRPMforgeリポジトリのパッケージで上書きされてしまわないようにするという設定をする。

sudo vi /etc/yum.repos.d/CentOS-Base.repo

```

各セクションの末尾に

```
priority=1
```

を追加。


##RPMforgeリポジトリ導入

```
cd ~/tmp
sudo wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.i686.rpm
sudo rpm -ivh rpmforge-release-0.5.2-2.el6.rf.i686.rpm
sudo rm -f rpmforge-release-*
sudo yum -y update rpmforge-release
```

##ffmpegをインストール
```
sudo yum --enablerepo=rpmforge install ffmpeg
```
Vagrant共有フォルダをnfsを使って高速化する

先日、Vagrantの共有フォルダがデフォルト設定だと遅くて使いものにならないという話を聞き、nfsを使って高速化してみた時の話


nfsd が起動しているかを確認

```
sudo nfsd status
```


起動していなければ起動する
```
sudo nfsd enable
```

/etc/exports が必要らしいので作成

```
sudo touch /etc/exports
```



あとは、設定ファイルで :type に nfs を指定するだけでよさそう

#####Vagrantfile
```
config.vm.synced_folder ".", "/vagrant", type: "nfs", :mount_options  => ['nolock,vers=3,udp']
```


簡単ですね。

と思ったのですが

マウント時に何やらエラーが出ているみたいです。



rpc.statd を起動させるか オプションで nolockを指定しろと言っているみたいなので、

マウント時のオプションに nolock 渡すようにしたら出来ました。 

#####Vagrantfile
```
config.vm.synced_folder ".", "/vagrant", type: "nfs", :mount_options  => ['nolock,vers=3,udp']
```


確かになん速い気がします。


今度計測してみよう。
Vagrantでpackage作成した際にVirtualBoxのVersionが異なる場合の対処法

###そもそも Vagrant 使おうと思いたった経緯
以前 [ドットインストール](http://dotinstall.com) さんにレッスンがあったので

試してみたことはあったのですが、

自分の環境で利用している「pallarels desctop」と相性が悪いのか、

同時に立ち上げるとMacが落ちるという現象があったため利用はしていなかったのです。

がしかし

先日アホなミスをしてしまい、Macを初期化するハメになってしまい、

データや環境の復旧はだいたいできたのですが、

Rubyの環境がどうしてもうまく構築できなくなってしまったため、

これまで、スクリプトの実行をMacで行っていたのを

「Vagrant」を使って仮想環境を構築してそこで実行するようにしようと思いったたのがことのはじめです。


###vagrant の box を作成してみる

折角環境を作ったのでboxを作ってみました。

```
vagrant package
```

少し時間はかかりましたが問題なく package.box が生成されました。

生成された package.box を vagrant に登録して

```
vagrant box add myImage package.box

```

#####Vagrantfile
```
config.vm.box = "myImage"
```

新しく仮想環境を作成してみようとした所、エラーが発生してしまいました。

```
vagrant up
```


![エラー](https://abgata.s3-ap-northeast-1.amazonaws.com/8f79b7a3b5a86bb518825b25f0dee47c.png)


仮想環境自体は作成されて ssh接続は出来るのですが、どうやら共有フォルダがマウントされていないようです。


###共有フォルダを利用できるようにする

少し調べていた結果、
VirtualBox のバージョンがbox作成時と現在とで異なっているのが原因らしいです。


[Vagrantの共有ディレクトリ設定でものすっごい躓いた！](http://qiita.com/harapeko_wktk/items/72985bfccaae60c69384)
を参考に問題を解決してみることに


####VirtualBoxのバージョン違いを解決するプラグインをインストールする

```
vagrant plugin install vagrant-vbguest
vi ~/.vagrant.d/Vagrantfile
```

#####javascript:~/.vagrant.d/Vagrantfile
```javascript
Vagrant.configure("2") do |config|
  config.vbguest.auto_update = false
end
```


バージョンが異なっているかどうかを確認
```
vagrant vbguest --status

 GuestAdditions versions on your host (4.3.10) and guest (4.2.16) do not match.
```

やはりバージョンが違うらしい

```
vagrant vbguest --auto-reboot
```

で修正してくれるらしいので実行してみた。


無事終了したっぽいので確認


```
vagrant vbguest --status

GuestAdditions 4.3.10 running --- OK.
```

解決したらしい。

Vagrant をリブートしてみる

```
v reload
~~~
==> default: Configuring and enabling network interfaces...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

ARPCHECK=no /sbin/ifup eth1 2> /dev/null

Stdout from the command:

Device eth1 does not seem to be present, delaying initialization.


Stderr from the command:

```

ダメみたい。

IPアドレスがうまく振り当てられていないみたいなので、

[ここ](https://github.com/mitchellh/vagrant/issues/3341)を参考に少し修正してみる


Vagrant にSSH接続して後に

```
sudo ln -s /opt/VBoxGuestAdditions-4.3.10/lib/VBoxGuestAdditions /usr/lib/VBoxGuestAdditions
sudo ln -s /opt/VBoxGuestAdditions-4.3.10/lib/VBoxGuestAdditions /usr/lib64/VBoxGuestAdditions
```

を実行


リブートしてみる

```
vagrant reload
```

解決した。


なかなか大変でした。
Dropbox で Sublime Text 3 の設定を共有

##参考サイト
- [WindowsのSublimeText3の設定ファイルをDropboxで共有する](http://p-toro.com/web/?p=137)
- [Windowsでsublime text 3の設定をDropBoxで共有うんたら。](http://isiz.hateblo.jp/entry/2013/07/17/Windows%E3%81%A7sublime_text_3%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92DropBox%E3%81%A7%E5%85%B1%E6%9C%89%E3%81%86%E3%82%93%E3%81%9F%E3%82%89%E3%80%82)
- [SublimeText3のセットアップ](http://qiita.com/FiNGAHOLiC/items/6981424cf59a6d46788d)


##設定ファイルをDropBoxに移す
###本来の設定ファイルがある場所

- Windows： C:\Users\(ユーザー名)\AppData\Roaming\Sublime Text 3\
- Mac： /Users/(ユーザー名)/Library/Application Support/Sublime Text 3/


今回はDropBoxの直下に「SublimeText3」フォルダを作成してその中に設定ファイルを配置




##DropBoxの設定ファイルからシンボリックリンクを貼る

###mac

```
ln -s /Users/(ユーザー名)/Dropbox/SublimeText3/Packages /Users/(ユーザー名)/Library/Application\ Support/Sublime\ Text\ 3/Packages


ln -s /Users/(ユーザー名)/Dropbox/SublimeText3/Installed\ Packages /Users/(ユーザー名)/Library/Application\ Support/Sublime\ Text\ 3/Installed\ Packages
```



###win

```
cd C:\Users\(ユーザー名)\AppData\Roaming\Sublime Text 3\

mklink /D "Installed Packages" "C:/Users/(ユーザー名)/Dropbox/sublime Text 3/Installed Packages"

mklink /D "Packages" "C:/Users/hogehoge/(ユーザー名)/sublime Text 3/Packages"

```
nova-computeにCPU Passthroughさせるための設定

Live Migrationが、同じCPUモデルのホスト間でしかできなくなるので注意。

```ini:nova-compute.ini
[libvirt]
cpu_mode = host-passthrough
```

QEMU/KVMでOpenStack Novaを使っている場合、デフォルトではドメイン定義時に`/usr/share/libvirt/cpu_map.xml`を見て、最もそれっぽいCPUモデルがlibvirtのドメインXMLに書き込まれる。

`ps`などでQEMUの引数を見ると、CPUのモデルと機能が長々と指定されているのが分かる。

```
/usr/bin/qemu-system-x86_64
-name instance-000000ea
-S
-machine pc-i440fx-trusty,accel=kvm,usb=off
-cpu Westmere,+rdtscp,+pdpe1gb,+dca,+pcid,+pdcm,+xtpr,+tm2,+est,+smx,+vmx,+ds_cpl,+monitor,+dtes64,+pclmuldq,+pbe,+tm,+ht,+ss,+acpi,+ds,+vme
-m 4096
-realtime mlock=off
-smp 1,sockets=1,cores=1,threads=1
(snip. 余談だけどQEMUの引数ってめっちゃ長いよね)
```

パススルーを設定すると、

```
/usr/bin/qemu-system-x86_64
-name instance-000000eb
-S
-machine pc-i440fx-trusty,accel=kvm,usb=off
-cpu host
-m 4096
-realtime mlock=off
-smp 1,sockets=1,cores=1,threads=1
(snip.)
```

`-cpu`オプションが変わる。

ゲスト内からは、`/proc/cpuinfo`なんかを見るとCPUのCapabilitiesが変わったりキャッシュサイズが増えたりしていることが確認できると思う。

ところでNested VMXのおかげで`vmx`なんかもExportされるから、OpenStack on OpenStack on OpenStack ... とかできるんじゃないだろうか。
Sublime Text 3 の設定

##参考サイト
- [Installation - Package Control](https://sublime.wbond.net/installation)
- [SublimeText3のセットアップ](http://qiita.com/FiNGAHOLiC/items/6981424cf59a6d46788d)
- [SublimeText2/3 環境設定とか（基本3）](http://qiita.com/tatsuoSakurai/items/cd9e22a9dc4e10ea6deb)

##パッケージインストールできるようにする

View > Show Console でコマンドライン入力欄を出して以下を実行


```
import urllib.request,os; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); open(os.path.join(ipp, pf), 'wb').write(urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ','%20')).read())

```

cmd + shift + p でパッケージインストールを実行可能に



## インストールするもの
AngularJSの注意点

###参考サイト

##POSTでパラメータを送信する際は、設定が必要
```
	@testApp.config ($httpProvider) ->
  		$httpProvider.defaults.transformRequest = (data = {}) ->
    		$.param(data);
  		$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'

 	 @
```
 そのままPOST送信するとパラメータがJSON文字列？で送信されるらしく、

 うまくデータを送れないので通常のForm送信の方式に合わせる必要がある

 ただ、 __rails__ で __angularjs-rails-resource__ を使っていると大丈夫な模様



##$resourceでPOST or PUT する際のURLパラメータの渡し方。

```
	url = '/api/action/:id'

	model = $resource url, null ,
		get: {method: 'GET', isArray: false}
		post: {method: 'POST', isArray: false, params: {id: "@id"}
		put: {method: 'PUT', isArray: false, params: {id: "@id"}}
		delete: {method: 'DELETE', isArray: false}

	param =
		id: 1
		name: 'myName'

	model.put param, (res, e) ->
	 		console.log res

```


GET と DELETE は そのままで __param__ の __id__ が __action/:id__
に反映されるが、
PUT と POST の場合は、モデルのメソッド作成の際に指定しておく必要がある模様

```
	model = $resource url, {id: "@id"} ,
		get: {method: 'GET', isArray: false}
		post: {method: 'POST', isArray: false}
		put: {method: 'PUT', isArray: false}
		delete: {method: 'DELETE', isArray: false}
```

これでも大丈夫そう。
SElinuxの設定(停止？)

##動作状態の確認
```
getenforce
# > Enforcing
# Enforcing　　　 SELinux機能は有効でアクセス制御も有効。
# permissive　　　SElinuxはwarningを出すが、アクセス制限は行われません
# disabled　　　　SElinux機能・アクセス制御ともに無効
```

##SELinuxを一時的に無効化
```
setenforce 0
# SELinuxを復活
setenforce 1
# SELinuxの完全無効化
```

```
vim /etc/sysconfig/selinux
```
#####/etc/sysconfig/selinux
```
# SELINUX=enforcing
#　　　↓
SELINUX=disabled
```
設定ファイルを変更したら、あとはrebootすればOK

```
cp /etc/sysconfig/selinux /etc/sysconfig/selinux.org
vim /etc/sysconfig/selinux
```

#####/etc/sysconfig/selinux
```
#SELINUX=enforcing
#　　　↓
SELINUX=disabled
```
sambaでネットワークフォルダを作成


##sambaをインストール
```
yum -y install samba system-config-samba samba-common samba-client
```

##設定ファイルを変更
```
cp /etc/samba/smb.conf /etc/samba/smb.conf.org
vim /etc/samba/smb.conf
```

#####/etc/samba/smb.conf
```
;ワークグループ編集(windowsのものと同じにする。macは関係なし？)
workgroup = workgroup

;日本語設定
unix charset = UTF-8
dos charset = CP932
display charset = UTF-8

;受け付けるipを設定
;127.で、127.xx.xx.xxを許可
;hosts allow = 127.192.168.1など

;パスワードをunixパスワードと同じに。
unix password sync = yes
load printers = no

;ホームディレクトリの設定
[homes]
        comment = Home Directories
        browseable = no
        writable = yes
        create mask = 0664
        directory mask = 0755
        create mode = 0775
        directory mode = 0755
		;valid users = user1,user2,user3,user4,user5
		share modes = yes
  		dos filetimes = yes

;共通のpublicフォルダも設定
[public]
        comment = Public Stuff
        path = /home/public
        create mask = 0666
        directory mask = 0755
        guest only = no
        guest ok = no
        public = yes
        writable = yes
		share modes = yes
  		dos filetimes = yes

```




##sambaにユーザ追加

```
adduser myuser
passwd myuser
pdbedit -a -u myuser

pdbedit -L
```

##samba起動
```
service smb start
service nmb start
```

###問題なければ、自動起動に。
```
chkconfig smb on
chkconfig nmb on
```


##samba用にiptables編集(下記を追加)
```
-A INPUT -p udp -m udp --dport 137:138 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 139 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 445 -j ACCEPT
```

##iptables再起動
```
service iptables restart
```
最新版PHPをインストール

##インストール可能なバージョンの確認

```
sudo yum info --enablerepo=remi,epel php56-php
```

※執筆時点では5.4.19

##利用しそうな依存ライブラリも一緒にインストール
```
# sudo yum --enablerepo=remi install -y php php-devel php-mysql php-mbstring php-gd php-pear httpd-devel
sudo yum --enablerepo=remi,epel install php56-php -y
sudo yum --enablerepo=remi,epel install php56-php-mbstring -y
sudo yum --enablerepo=remi,epel install php56-php-pdo php56-php-mysqlnd -y
# sudo yum --disablerepo=* --enablerepo=remi-php56 install php
```


##バージョンの確認
```
php -v
```

##設定ファイルを変更
```
cp /etc/php.ini /etc/php.ini.org
vim /etc/php.ini
```

#####/etc/php.ini
```
error_log = /var/log/php.log
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED
display_errors = On
mbstring.language = Japanese
expose_php = Off
date.timezone = Asia/Tokyo
max_execution_time = 300
magic_quotes_gpc = Off
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = pass
mbstring.detect_order = auto
;mbstring.substitute_character = none;

max_file_uploads = 100
post_max_size = 100M
upload_max_filesize 100M

```

##apache再起動で反映
```
service httpd restart
```
Schemeのインタプリタ

JavaScriptでSchemeのインタプリタを実装しました。JavaScriptで実装しているのでブラウザ上でSchemeが実行可能です。
基本的な構文しかまだ対応していませんが、暇な時に少しづつ機能を追加して行こうかと思っています。

githubで公開しています。

[Github](https://github.com/nsas454/scheme.js "scheme.js")
最新版MySQLをインストール

##インストール可能なバージョンの確認
```
yum info --enablerepo=remi mysql mysql-server mysql-devel
```
※執筆時点では5.5.53

##利用しそうな依存ライブラリも一緒にインストール

```
sudo yum install -y --enablerepo=remi mysql-server mysql-devel

```

###設定ファイルの変更

```
cp /etc/my.cnf /etc/my.cnf.org
vim /etc/my.cnf
```

#####/etc/my.cnf

```
[mysqld]以下に追加
character_set_server=utf8
default-storage-engine=InnoDB
innodb_file_per_table
group_concat_max_len=10000000

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

```

###設定を反映

```
service mysqld start
chkconfig mysqld on
```

###mysqlの初期設定

```
mysql_secure_installation
mysql -u root -p
```