tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

【redis】redisを超おさらい。CentOS 6.2にかんたんにインストールから起動、set、getを確認

はじめに

いまさらのいまさらですが、redisを入れてみてから起動して確認するまでをかんたんにおさらい。
redisは入れるのも確認も簡単ですね╭( ・ㅂ・)و ̑̑ グッ

今回入れるのはCentOS 6.2です。

$ cat /etc/redhat-release 
CentOS release 6.2 (Final)

アジェンダ

  1. redis入れる
  2. 設定する
  3. 起動&確認してみる
  4. 起動スクリプト作成

1. redisとは

いまさらですが一応ブログの入りぽく、ということで。。。
説明下手なので参考サイトをまんま拝借させて頂きました。

  • データはメモリ上に入っている。インメモリデータベース。
  • ディスクにデータを適当なタイミングで書き込み可能(永続化できる)。
  • Key-Valueストア。キーと、それに対応したValueから構成される。ValueにはStringやListなど様々な型が使える。
  • Github、stackoverflow、ニコ生などで採用実績がある。
  • 初めて登場したのは2009年4月。ネット上の記事は2011年頃のをよく見る。
  • API一覧はここ。Command reference – RedisまたはKOSHIGOE学習帳 - [KVS][Redis] Redis コマンド一覧。

1. redis入れる

これはまんまやるだけですね

$ cd /usr/local/src/
$ sudo wget http://download.redis.io/releases/redis-2.8.12.tar.gz
$ sudo tar xzf redis-2.8.12.tar.gz
$ cd redis-2.8.12/
$ make make
$ sudo make install

補足

他のサイトなど参考にするとredisの前に下記もいれる必要があるかもです。
自分はすでに入っていたので今回にはいれてません

$ sudo yum -y install gcc make

2. 設定する

設定ファイルはredisを展開したディレクトリにいるのでコピーして使います。

設定ファイル編集
# confファイルを確認
$ pwd
/usr/local/src/redis-2.8.12

$ ls -al re*
-rw-rw-r-- 1 root root 31209 Jun 23  2014 redis.conf

# オリジナルは残しつつconfファイル作成
$ sudo mkdir /etc/redis
$ sudo cp -ap redis.conf /etc/redis/6379.conf

# 設定編集
# 設定項目のそれぞれの意味は下記に書いたのでそちらを参考に。
$ sudo vi /etc/redis/6379.conf
---- vi編集 ----
daemonize no

# daemonize yesにしたとき忘れないように念のため
pidfile /var/run/redis_6379.pid

port 6379

timeout 60

loglevel debug

logfile "/var/log/redis/6379.log"

databases 16
---------------


# 設定ファイルに合わせてディレクトリつくっておいたり
$ sudo mkdir /var/log/redis
設定補足

設定について書いておきます。最初はこのあたりだけで良いかと。

項目 説明
daemonize [yes/no] デフォルトはno。デーモンとして動作させたい場合はyes。またその場合はpidファイルのしても忘れずに daemonize no
pidfile [filepath] デーモンとして起動するときにpidを書き出すファイル pidfile /var/run/redis_6379.pid
port [portnumber] コネクションを受け付けるポート。デフォルト6378 port 6379
timeout [N秒] N秒数間コマンドが送信されなければクライアントとの通信を切断。0を指定するとタイムアウト無し設定 timeout 60
loglevel [level] サーバのログの情報量をdebug/verbose/notice/warningのいずれかで設定。値を見たらなんとなくわかるかと。 loglevel debug
logfile [filepath] ログファイルの指定。stdoutを指定すると標準出力に。stdout指定&daemonize中は /dev/null行きなので注意 logfile "/var/log/redis/6379.log"
databases [num] RedisはDB名というものがなく番号で管理されている。そのデータベースの番号。databases 16と指定した場合はデフォルトで0〜15のDB番号を使用できる。デフォルトのデータベースは0 databases 16

スナップショットの設定など、他も参考にしたい場合は下記が参考になりました。

3. 起動&確認してみる

redisの起動と確認にはserverとclientを立ち上げます。
background起動(daemonize)ではなくそのまま立ち上げてみるため
serverとclientをそれぞれ別のターミナルで立ち上げて確認します。

redis-server起動

$ sudo redis-server /etc/redis/6379.conf
補足1

daemonize yesで起動した場合にredis-serverを終了するには、
psなどでプロセスを確認してkillで落とすか、pidfileも指定してるはずなので下記のようにします。

$ sudo kill `cat /var/run/redis_6379.pid`
補足2

当たり前ですがログファイルの場所に権限がない場合なんかはsudoやrootで行ってください

$ redis-server /etc/redis/6379.conf 
*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 103
>>> 'logfile "/var/log/redis/6379.log"'
Can\'t open the log file: Permission denied

redis-cliでの対話モード確認

確認は主にclientから確認します。
key-valueのデータの確認に簡単なset-getをします。

# 起動
$ redis-cli 
redis 127.0.0.1:6379> 

# set-getを確認してみる
redis 127.0.0.1:6379> set test hoge
OK

redis 127.0.0.1:6379> get test
"hoge"

# 複数setしてkeyの一覧を見てみる
redis 127.0.0.1:6379> set name fuga
OK

redis 127.0.0.1:6379> keys *
1) "name"
2) "test"

# setした値に有効期限(10秒)をつけてみる
redis 127.0.0.1:6379> setex name 10 piyo
OK

redis 127.0.0.1:6379> get name # 10秒未満
"piyo"

redis 127.0.0.1:6379> get name # 10秒経過
(nil)


# 終了
redis 127.0.0.1:6379> exit

redis-cliでのコマンドライン確認

$ redis-cli -p 6379 set test fuga
OK

$ redis-cli -p 6379 get test
"fuga"

4. 起動スクリプト作成

起動スクリプトを作成します。
daemonizeしていればbackgroundで起動します。

# 起動スクリプトをutilからコピー
$ cd /usr/local/src/redis-2.8.12/
$ sudo cp -ap utils/redis_init_script /etc/init.d/redis_6379

# 起動してみる
$ sudo /etc/init.d/redis_6379 start
Starting Redis server...

まとめ

redisって何度か入れてますが、ほんと簡単で試しやすくて良いですよねー!
いろいろ勉強すると奥が深いミドルウェアですがちょっと試すにもすいすいです
( ・ㅂ・)و ̑̑ グッ

【git】リモートのブランチそのものや1ファイルのみをローカルにチェックアウトするメモ

はじめに

タイトルまんまですが、既にあるブランチを手元で動かしたいときはよくやる操作です。
特にファイルだけのほうが忘れてしまうことが多いのでメモ。

アジェンダ

  1. チェックアウトする前に必要な操作(後述の2,3共用)
    • リモートのブランチを確認したり
  2. リモートのブランチをチェックアウトする
  3. リモートのブランチからファイルのみチェックアウトする

1. チェックアウトする前に必要な操作(後述の2,3共用)

リモートのブランチを持ってくるにせよ、ファイルをもってくるにせよブランチ名を確認したいですよね。

リモートのブランチを確認したり
# ローカルのリポジトリ情報を更新
$ git fetch

# ブランチが多過ぎて遅い場合は特定のブランチだけfetch
$ git fetch origin [取得したいブランチ名]

# 目的のブランチが含まれてるか確認
git branch -r | grep [取得したいブランチ名]
補足

リモートや追跡ブランチの確認については下記も参考に

2. リモートのブランチをチェックアウトする

コマンド

リモートのブランチ持ってくるコマンドはこんな感じ

git checkout -b [取得したいブランチ名] origin/[取得したいブランチ名]

一連のコマンド例

1. チェックアウトする前に必要な操作(後述の2,3共用) とかぶるけど一連って意味で1のコマンドも書いておきます

# 更新&確認
$ git fetch
$ git branch -r | grep [取得したいブランチ名]

# ローカルにブランチもってくる
$ git checkout -b [取得したいブランチ名] origin/[取得したいブランチ名]

3. リモートのブランチからファイルのみチェックアウトする

コマンド

リモートのブランチのファイルのみ持ってくるコマンドはこんな感じ

git checkout [取得したいリモートブランチ名] -- [取得したいファイルパス]

取得したいファイルパスについては、ちょっと癖があったので後述します。

一連のコマンド例
# 更新&確認
$ git fetch
$ git branch -r | grep [取得したいブランチ名]

# 取得したいブランチの取得したいファイルの内容を確認
# ※ 具体的に何を指定するかは後述します
git show origin/[取得したいブランチ名]:[取得したいファイルパス①]

# ファイルのみチェックアウト
$ git checkout origin/[取得したいブランチ名] -- [取得したいファイルパス②]
[取得したいファイルパス]についての補足

①②としているくらいなので若干指定するパスが違っています。
こんな感じ

  • [取得したいファイルパス①]
    • git showで確認したいときの[取得したいファイルパス①]は、リポジトリのルートからのパス
  • [取得したいファイルパス②]
    • チェックアウトするときの[取得したいファイルパス②]は、現在いるディレクトリからの相対指定のパス

まとめ

たまにしかやらない操作ってどうしても忘れちゃいますよね(><)

【Mojolicious】MojoliciousでのGET|POSTのリクエストパラメータを取得するメモ - ルーティングキャプチャとかMojo::Message::RequestとかMojo::Parameters

はじめに

Mojoliciousアプリでリクエストパラメータを取得するときのメモ。

初歩的な内容ですがMojoliciousコントローラ内で
GETやPOSTされてきたパラメータを取得する際はいくつか方法があります。

今回はよく使われる3つの方法を書いてみました。

アジェンダ

  1. ルーティングでキャプチャされたパラメータの取得
  2. Mojo::Message::Requestからのパラメータの取得
  3. Mojo::Parametersからのパラメータの取得

前提

plenv x carton x mojoアプリで記事を進めます。

以下、今回説明に使用するアプリの構成やらです

生成したアプリ

$ carton exec mojo generate app RequestParamSample::web

# githubのプロジェクト名を変更したかったので生成後に名前を変えてます
$ mv request_param_sampleweb mojolicious-request-param-sample

# ごにょごにょしたあとの構成
$ tree -L 3 mojolicious-request-param-sample
├── README.md
├── lib
│   └── RequestParamSample
│       ├── web
│       └── web.pm
├── public
│   ├── css
│   │   └── common.css
│   └── index.html
├── script
│   └── request_param_sampleweb
├── t
│   └── basic.t
└── templates
    ├── layouts
    │   └── default.html.ep
    ├── message_request
    │   └── index.html.ep
    └── parameters
        └── index.html.ep

# 起動&確認
$ carton exec morbo script/request_param_sampleweb 
Server available at http://127.0.0.1:3000

plenv carton x mojoあたりは下記を参考にしてみてください

ルーティング

今回のルーティング(lib/RequestParamSample/web.pm)はこんな感じの前提です

package RequestParamSample::web;
use Mojo::Base 'Mojolicious';

# This method will run once at server start
sub startup {
  my $self = shift;

  # Router
  my $r = $self->routes;

  # 1. ルーティングでキャプチャされたパラメータの取得
  $r->get('/capture/:name/:age')->to('url_capture#index');

  # 2. Mojo::Message::Requestからのパラメータの取得
  $r->get('/request')->to('message_request#index');
  $r->post('/request/sample')->to('message_request#sample');

  # 3. Mojo::Parametersからのパラメータの取得
  $r->get('/parameters')->to('parameters#index');
  $r->post('/parameters/sample')->to('parameters#sample');
}
1;

実際のソース

今回のソースはgithubにあげてあります。
実際にみながらのほうがわかりやすいかもしれません。

https://github.com/tweeeety/mojolicious-request-param-sample

1. ルーティングでキャプチャされたパラメータの取得

mojoを使ってパラメータを受け取る一番単純な方法がこれです。

http://127.0.0.1:3000/capture/hoge/25にアクセスした際のパラメータの取得ですね。
ルーティングにて$r->get('/capture/:name/:age')->to('url_capture#index');と指定することでurlに含まれる任意の文字列をキャプチャして取得できます。

ソース
  • lib/RequestParamSample/web/Controller/UrlCapture.pm
package RequestParamSample::web::Controller::UrlCapture;
use Mojo::Base 'Mojolicious::Controller';

sub index {
  my $self = shift;

  $self->render('text' =>
        # urlはurl_forで取得できる
        "url  : " . $self->url_for . "<br>" .

        # キャプチャされたパラメータは$self->paramで取得できる
        "name : " . $self->param('name') . "<br>" .

        # キャプチャされたパラメータは$self->stashでも取得できる
        "age  : " . $self->stash('age')
  );
}

1;
出力結果
url : /capture/hoge/25
name : hoge
age : 25
参考

詳しくはこのあたりが参考になります

2. Mojo::Message::Requestからのパラメータの取得

コントローラの$selfにはいろいろなオブジェクトが含まれていますが
コントローラ内で$self->reqとすることで Mojo::Message::Request にアクセスできます。

POSTする画面

formからPOSTする想定で
http://127.0.0.1:3000/requestで表示される画面にてformにこんな感じで入力した、
というていで話を進めます。
submit先はrequest/samplef:id:tweeeety:20160221101315p:plain

ソース

ルーティング的には
$r->post('/request/sample')->to('message_request#sample'); のソースですね。

  • lib/RequestParamSample/web/Controller/MessageRequest.pm
package RequestParamSample::web::Controller::MessageRequest;
use Mojo::Base 'Mojolicious::Controller';
use Data::Dumper;

sub index {
  my $self = shift;
  $self->render(msg => 'mojo message request sample');
}

sub sample {
  my $self = shift;

  # $self->req->paramでget|postされたパラメータが取得できる
  my $name = $self->req->param("name");
  my $age  = $self->req->param("age");
  my $tel  = $self->req->param("tel");

  # $self->paramは$self->req->paramのショートカットなのでこれでもok
  my $name2 = $self->param("name");

  # 出力
  $self->render('text' =>
    'name  : '  . $name  . "<br/>" .
    'age   : '  . $age   . "<br/>" .
    'tel   : '  . $tel   . "<br/>" . 
    'name2 : '  . $name2 . "<br/>"
  );
}
1;
出力
name : hoge
age : 25
tel : 09011112222
name2 : hoge
参考

詳しくはこのあたりが参考になります

3. Mojo::Parametersからのパラメータの取得

さきほどの$self->reqMojo::Message::Requestオブジェクト)に
->paramsを指定してやることで今度はMojo::Parametersが取得できます。

ひとつひとつパラメータを取得するのではなくhash的に取得したい場合はこちらのほうが便利です。

POSTする画面

formからPOSTする想定で
http://127.0.0.1:3000/parametersで表示される画面にてformにこんな感じで入力した感じで話を進めます。
submit先はparameters/samplef:id:tweeeety:20160221101329p:plain

ソース
  • lib/RequestParamSample/web/Controller/Parameters.pm
package RequestParamSample::web::Controller::Parameters;
use Mojo::Base 'Mojolicious::Controller';
use Data::Dumper;

sub index {
  my $self = shift;
  $self->render(msg => 'mojo parameters sample');
}

sub sample {
  my $self = shift;

  # $self->req->paramsでMojo::Parametersオブジェクトが取得できる
  my $params = $self->req->params;

  # $self->req->params->to_hashでMojo::Parametersが
  # パラメータをhash形式で返却してくれる
  my $params_hash = $self->req->params->to_hash;

  # 出力
  $self->render('text' => '$params_hash : ' . Dumper $params_hash);
}
1;
出力
$params_hash : $VAR1 = { 'tel' => '09011112222', 'name' => 'hoge', 'age' => '25' };
参考

詳しくはこのあたりが参考になります

まとめ

簡単にですがMojoliciousでのパラメータ取得をまとめてみました!
自分的には$self->req->params->to_hash;が一番使いやすいです\(^o^)/

【git】既存のディレクトリやソースをgit管理化にしてリモートに紐づける流れメモ - git init、git remote add origin

はじめに

リモート(githubなど)にはリポジトリがある、
ローカルにはgit管理されてないディレクトリやソースがある、な状況で
そのローカルディレクトリをgithubリポジトリに紐づけるというだけのメモ

たまにはこういうおさらいネタを、と。

アジェンダ

アジェンダ作るほどでもないですが一応

  1. 対象ディレクトリをリポジトリ化する
  2. commitするユーザ情報を追加しておく
  3. リモート情報を取得する
  4. testブランチ作ってカラcommitで追加確認

1. 対象ディレクトリをリポジトリ化する

※ 紐づけたいディレクトリに移動
$ cd /path/to/dir

※ リポジトリ化する
$ git init

※ この時点で`.git`というディレクトリができてリポジトリとして管理すべき情報などが作られます
$ ls -al 
drwxr-xr-x  10 hoge  hoge  340  2  9 12:11 .git

※ また、この時点でconfigに最低限のリポジトリ情報が追加される
$ cat .git/config 
----
[core]
  repositoryformatversion = 0
  filemode = true
  bare = false
  logallrefupdates = true
  ignorecase = true
  precomposeunicode = true
----

※ リポジトリ情報追加
$ git remote add origin git@github.com:ユーザ名/リポジトリ名.git

※ このときにリモートリポジトリの情報が追加される
$ cat .git/config 
----
[core]
  repositoryformatversion = 0
  filemode = true
  bare = false
  logallrefupdates = true
  ignorecase = true
  precomposeunicode = true
[remote "origin"]
  url = git@github.com:ユーザ名/リポジトリ名.git
  fetch = +refs/heads/*:refs/remotes/origin/*
----

補足

今回はすでにディレクトリやソースがある前提なので
最初にcdコマンドで対象ディレクトリへ移動しましたが、
新規でディレクトリから作る場合、git init ディレクトリ名とすることで
ディレクトリを新規に作成しつつgit管理化に置くこと(.gitも作られる)もできます

2. commitするユーザ情報を追加しておく

新規のときくらいにしかやらないので忘れがちですが、念のため最初にauthor情報も登録しておきます。
これを忘れると意図しないユーザ名でpushしちゃう時が多いんですよね。

※ 全体の設定をしたいとき
$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"

※ リポジトリ(ディレクトリ)ごとにauthorを登録したいとき
$ git config user.name "Your Name"
$ git config user.email "you@example.com"

※ --globalつけずに設定したときのconfig
$ cat .git/config 
[core]
  repositoryformatversion = 0
  filemode = true
  bare = false
  logallrefupdates = true
[remote "origin"]
  url = git@github.com:ユーザ名/リポジトリ名.git
  fetch = +refs/heads/*:refs/remotes/origin/*
[user]
  name = tweeeety
  email = tweeeety@tweeeety.com

3. リモート情報を取得する

いきなりカラcommit&pushして試してみてもいいんですが、その際にbranchを切りたいですよね。
branchを切るためには元になるbranch(masterなど)が欲しいところ。
そのためにまずはリモート情報を取得します

※ 試しにgit branchしてみると何も出てきません
$ git branch

※ git statusはこのタイミングでディレクトリにあるファイルがすべて差分として表示されます
$ git status
- いろいろでてくる -

$ git fetch
remote: Counting objects: 60272, done.
remote: Compressing objects: 100% (18523/18523), done.
remote: Total 60272 (delta 38835), reused 57467 (delta 36274)
~ 省略 ~ 

$ git pull origin master
From git@github.com:ユーザ名/リポジトリ名.git
 * branch            master     -> FETCH_HEAD
Already up-to-date.

$ git branch
* master

testブランチ作ってカラcommitで追加確認

ブランチを切ってから、カラのcommit&pushしてpullrequest出してみることで確認します。
masterにも影響ないですしpull req消せばいいだけですしね。

※ 適当なブランチを切る
※ カラのcommitをしてpull req出す
$ git commit --allow-empty -m 'created PR'
$ git push -u origin master

まとめ

簡単なメモを書きたくなったので書いてみた

【mysql】ソースから入れるmysql関連でlibtoolやautomakeが入ってなくてコンパイルエラーなときのメモ

はじめに

centosにソースからのmysqlmysql-pluginな環境を作っているときにコンパイルエラーになったのでメモ

エラーと対処法

主にHandlerSocketを入れたときって感じですね。
対処法というかまんま入れるだけです。

libtool

エラー
$ ./autogen.sh
Searching libtoolize...
  FOUND: libtoolize -> libtoolize
Searching aclocal...
which: no aclocal in (/home/hoge/perl5/perlbrew/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/hoge/bin)
  WARNING: Cannot Found aclocal... input aclocal command
入れる
$ cd /usr/local/src
$ sudo wget http://ftp.gnu.org/gnu/libtool/libtool-1.5.26.tar.gz
$ sudo tar xvzf libtool-1.5.26.tar.gz
$ cd libtool-1.5.26
$ sudo ./configure --prefix=/usr
$ sudo make
$ sudo make install

automake

エラー
$ sudo ./autogen.sh
Searching libtoolize...
which: no libtoolize in (/home/hoge/perl5/perlbrew/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/hoge/bin)
  WARNING: Cannot Found libtoolize... input libtool command
入れる
# 入ってないことを確認
$ rpm -ql automake
package automake is not installed
 
# インストール
sudo yum -y install automake

【git】git cloneで作成するディレクトリ名を指定したりリビジョンを指定したり

はじめに

git cloneはリポジトリをローカルに複製したいときに使いますが
git clone リポジトリのパスみたに行うとリポジトリのパスで指定したまんまディレクトリが作成されます。
まぁ当たり前ですね。

しかし、落としてきたリポジトリのディレクトリ名を変更したいときも結構あるんですよね。
そんなときのメモ

やりかた

やりかたは簡単。下記のように打つだけです。

$ git clone [取得したいリポジトリのURL] [指定したいディレクトリ名]

補足

また、git cloneではリポジトリの履歴情報含めて複製しますが、
もし最新のソースのみ取得して使えればいいや的なときは--depthオプションでリビジョン数を指定してあげます。

$ git clone --depth 1 [取得したいリポジトリのURL]

おわり

こんな些細なことも忘れちゃうのでメモっておく。。

【vim】vimでvimrcを読み込まずにデフォルト設定で起動する方法 - `-u NONE`や`-u NORC`や`-noplugin`

はじめに

タイトルの通りですがvimrcを読み込みたくないときに使える方法(オプション)です

どんなときに使うの?

たとえば、こんなとき

  • vimについて何か読んで試そうと思ったら動かない
  • これって自分の設定のせいかな?いったんoffって試してみよう
  • でも.vimrcをわざわざ名前やパスを一次変えてとかはさすがに面倒だし...

みたいなときに使えます

やりかた

やりかたは状況によって少し違うんですが鉄板のものをまずは載せておきます

$ vim -u NONE -N ファイル名

これでvimrcやプラグインの設定を読み込まずに起動できます。

説明

簡単に説明です

  • -u NONE フラグ
    • Vim起動時にvimrcを読み込まないように伝えるもの
    • プラグインも無効化される
    • ③ vi互換モードに退行して便利な機能の多くも利用できなくなってしまう
  • -N フラグ
    • ① compatibleをオフに設定する
    • ② つまり、上記の-u NONEの③によってcompatibleになってしまうのを nocompatible (Vimの拡張を有効)にする

他にもある?

やりかたの項で状況によって少し違う と書きましたがもう少し細かく見てみます。

vimの起動時の設定に関しては大きく下記の2つにわける事ができます

↑に出てきた vim -u NONE -N は上記2つともをOFFにするものです。
なので、両方、片方のそれぞれをON/OFFにするやり方という意味だと下記のような感じにわけられます

引数 vimrc プラグイン
無し ON ON
-u NONE OFF OFF
-u NORC OFF ON
-noplugin ON OFF

参考

まとめ

vimの機能を一時切ってデフォルトで表示したいときってたまーにあるので
忘れたらまた自分の記事を見返します(><)