Gulpを使ってみる

はじめに

Gulpは、Javascriptの圧縮やSassのコンパイル等を自動化するための、タスクランナーツールです。各種OS上で動作をし、主にWebアプリケーションのクライアントサイドのファイルの処理に利用されています。同様なツールとして先発のGruntがありますが、Gulpの方が設定ファイルが書きやすいと言われており、より人気を集めています。

Gulpのインストール

Node.jsの導入

GulpはNode.js上で動作するため、Node.jsとそのパッケージマネージャーであるnpmを事前にインストール必要があります。インストールの方法は多くのサイトで説明されていますので、ここでは割愛します。Windowsへのインストールに関しては、こちらを参照ください。

npmを利用したインストール

GulpはNode.jsのパッケージとして提供されているため、npmコマンドを利用して簡単にインストールすることができます。npmでは、インストールしたパッケージをマシン全体で利用できるグローバルインストールと、特定のフォルダ内でのみで利用できるローカルインストールの両方をサポートしています。ただし、Gulpを利用するには、その両方にインストールをする必要があります。

グローバルインストール

Gulpをグローバルインストールするには、-gオプションをつけてnpm installコマンドを実行します。

$ npm install -g gulp

ローカルインストール

まず、プロジェクトフォルダに移動して、npm initコマンドを実施することで、そのプロジェクトをnpmによるパッケージ管理の対象とさせます。プロンプト上で、いくつか設定情報の入力を求められますが、後から変更も可能ですので、不明であればすべてEnterで大丈夫です。

$ cd /path/to/project
$ npm init

コマンド実行後、フォルダ内にpackage.jsonというnpmの設定ファイルが作成されていることが確認できると思います。次に、npm installコマンドを実行し、Gulpをインストールします。この際、–save-devオプションをつけることで、開発用パッケージとしてインストールすることができます。

$ npm install gulp --save-dev

先ほどのpackage.jsonにdevDependenciesとしてgulpが追加されます。

{
...
  "devDependencies": {
    "gulp": "^3.9.0"
  }
}

設定ファイルの作成

タスクの追加

gulpfile.jsという名前のファイルを作成し、その中に実行させたいタスクを記述していきます。例えば、Hello, World!と表示させるタスクhelloを定義するには、以下の様に記述します。先頭のrequire文は常に必要となります。

var gulp = require('gulp');

gulp.task('hello', function() {
    console.log('Hello, World!');
});

これを実行するには、gulp helloコマンドを実行します。

$ gulp hello

複数のタスクをまとめる

一度に複数のタスクを実行したい場合があると思います。その場合は、複数タスクを実行するためのタスクを定義し、taskメソッドの第二引数に対象のタスクを配列で指定します。gulp helloコマンドを実行すると、指定した順にタスクが実行されます。

var gulp = require('gulp');

gulp.task('hello1', function() {
    console.log('Hello, Tokyo!');
});

gulp.task('hello2', function() {
    console.log('Hello, Japan!');
});

gulp.task('hello3', function() {
    console.log('Hello, World!');
});

gulp.task('hello', ['hello1', 'hello2', 'hello3']);

デフォルトタスクを指定する

taskメソッドの第一引数に’default’と指定したタスクを作成すると、そのタスクはgulpコマンドを引数なしで実行した場合に呼び出すことができます。

var gulp = require('gulp');

gulp.task('hello', function() {
    console.log('Hello, World!');
});

gulp.task('default', ['hello']);

プラグインの利用

Gulpで利用できる多くのプラグインが公開されています。ここでは、Javascriptのコードを圧縮するためのgulp-jsminというプラグインを例にとって説明したいと思います。

プラグインのインストール

プラグインのインストールには、gulp本体のインストールにも利用したnpmコマンドを利用します。

$ npm install gulp-jsmin --save-dev

プラグインの読み込み

gulpfile.js内でプラグインを読み込むにはrequire関数を利用します。

var gulp = require('gulp');
var jsmin = require('gulp-jsmin');

タスクの定義

以下は、src/javascripts内にあるJavascriptファイルを圧縮し、public/javascriptsに配置するためのタスクの例です。

var gulp = require('gulp');
var jsmin = require('gulp-jsmin');
var rename = require('gulp-rename');

gulp.task('js', function() {
    gulp.src('src/javascripts/*.js')
        .pipe(jsmin())
        .pipe(rename({suffix: '.min'}))
        .pipe(gulp.dest('public/javascripts'));
});

srcメソッドで対象となるファイルを指定し、pipeを連ねることで、その対象に対して順次処理を実行します。ここでは、gulp-renameプラグインも利用することで、圧縮後のファイル名にminという文字列を入れ込んでいます。一般に、この例のように、

  1. srcで対象のファイルを指定
  2. pipeでそのファイルに対して複数の処理を実行
  3. destで処理後のファイルを出力

といった流れで、タスクを定義する場合が多いと思います。

タスクの自動実行

実際の開発において、編集のたびにgulpコマンドを実行するのは不便です。そのため、Gulpにはファイルを監視し、そのファイルに変更があった場合に自動的にタスクを実行するwatchという枠組みが備えられています。以下は、src/javascriptsフォルダ以下を監視し、ファイルに変更があった場合に上記のjsタスクを自動的に実行するための設定となります。

var gulp = require('gulp');
var jsmin = require('gulp-jsmin');
var rename = require('gulp-rename');

gulp.task('js', function() {
    gulp.src('src/javascripts/*.js')
        .pipe(jsmin())
        .pipe(rename({suffix: '.min'}))
        .pipe(gulp.dest('public/javascripts'));
});

gulp.task('watch', function() {
    gulp.watch('src/javascripts/*', ['js']);
});

この例の場合、実際に監視を開始させるためにはgulp watchコマンドを実行します。

$ gulp watch

 

Ansibleを使ってみる

AnsibleはChefやPuppetと同じく構成管理ツールですが、管理対象のサーバーにエージェントアプリケーションをインストールしなくていい点や、YAMLを利用したシンプルな設定ファイルに特徴があり、最近人気を集めています。ここでは、CentOS7に対するAnsibleのインストール方法と基本的な使い方をお伝えしたいと思います。

Ansibleのインストール

CentOS7にAnsibleをインストールするのに一番簡単な方法はyumを利用することです。

EPELリポジトリの追加

AnsibleはCentOS7の標準リポジトリには含まれていないため、まずyumでEPELリポジトリを利用できるようにします。そのための設定もyumでインストールすることができます。

$ sudo yum install epel-release

yumを利用してAnsibleをインストール

EPELのリポジトリからAnsibleをインストールします。特にリポジトリ名の指定は必要ありません。

$ sudo yum install ansible

 

Perlの基本文法

はじめに

備忘録の意味も含めて、Perlの基本文法をまとめたいと思います。Perlでは、同じ目的を達成するために様々な書き方が存在します。ここでは、標準的(と私が考える)なものを極力選びました。

スクリプトの実行

Perlで書かれたスクリプトを実行するには、コマンドライン上でperlコマンドを利用します。

$ perl test.pl

構文チェックのためにコンパイルのみを行うには-cオプションを付けます。

$ perl -c test.pl

デバッガを利用するには-dオプションを付けます。

$ perl -d test.pl

また、スクリプトの先頭のシバン(Shebang)でperlインタプリタを指定すれば、スクリプト名だけで実行できます。ファイルに実行権限を与えることをお忘れなく。

#!/usr/bin/perl
...
$ chmod u+x test.pl
$ ./test.pl

コメント

一行コメント

一行をコメントアウトするには#を利用します。行の途中から利用することもでき、#から行末までがスクリプトの実行中に無視されます。

# Comment here
if ($x > 50) {
...
}

my $x = 100; # Comment here

複数行コメント

複数行を同時にコメントアウトするには、対象の行を=podと=cutで囲みます。ただ、通常は複数行であっても#を利用する場合が多いと思います。

=pod
Multiple lines
can be commented
like this.
=cut

変数

スカラー変数

スカラー変数とは、文字列や数値など、一つの値を格納するために使う変数です。変数名は必ず「$」で始め、半角英数および「_」(アンダースコア)が利用できますが、命名規則としてスネークケース(小文字の英語と数字だけを使用し、文字間の連結にアンダースコアを利用する方法)にするのが一般的です。

$number = 10;
$site_url = 'http://blog.codebase.co.jp';

配列変数

配列変数とは、複数の値を順番に格納するために使う変数です。変数名は「@」で始め、それ以降はスカラー変数と同様です。

@fruits = ('Apple', 'Orange', 'Banana');

上記のように、複数の値を同時に格納することもできますし、以下のように何番目に格納するか番号で指定することも可能です。

$fruits[0] = 'Apple';
$fruits[1] = 'Orange';
$fruits[2] = 'Banana';

この場合は、変数名の先頭が「$」になることに注意してください。

ハッシュ変数

ハッシュ変数とは、連想配列変数とも呼ばれ、複数の値をキーを指定して格納するために使う変数です。変数名は「%」で始め、それ以降はスカラー変数と同様です。

%profile = ('Name' => 'Taro', 'Gender' => 'Male', 'Tel' => '090-xxxx-xxxx');

配列と同様、個別にキーを指定して代入することもできます。

$profile{'Name'} = 'Taro';
$profile{'Gender'} = 'Male';
$profile{'Tel'} = '090-xxxx-xxxx';

制御構文

条件分岐

if – elsif – else

条件分岐にはifを使います。

my $fee;
if ($age >= 20) {
    $fee = 1800;
} elsif ($age >= 12) {
    $fee = 1000;
} else {
    $fee = 0;
}

繰り返し

for (foreach)

指定した回数分繰り返すにはforが便利です。

for (my $i = 0; $i < 10; $i++) {
    print $i;
}

また、配列の中身を展開する場合にも利用することができます。

my @fruits = ('Apple', 'Orange', 'Banana');
foreach my $fruit (@fruits) {
    print $fruit;
}

ちなみに、forもforeachも文法上区別はありませんが、私は上記のような使い分けをしています。

YAMLで改行

Ansibleを利用してビルドスクリプトを書いている際に、長くなったコマンドをどう改行するか小一時間悩みました。AnsibleのPlaybookはYAML形式を採用しており、YAMLでスペース区切りの文字列を複数行に渡って書くには「>」を利用するようです。

- command: command option1 option2 option3

と一行で書いていたものは、「>」を利用して以下のよう表現できます。

- command: >
    command
    option1
    option2
    option3

ちなみに、「>」の代わりに「|」を利用すると、各行がスペースではなく改行コードで連結されるようです。

AnsibleのCopyモジュールでワイルドカードを使用する

AnsibleのCopyモジュールでは、srcにワイルドカード(*)を使用することはできません。アスタリスクという文字として解釈されてしまいます。

ファイル名が未確定の場合や、条件に一致した複数のファイルをコピーしたい場合は、with_fileglobを利用します。

- name: Copy files whose name start with a
  copy: src={{ item }} dest=/path/to/dest_dir
  with_fileglob:
    - "/path/to/src_dir/a*"

with_fileglobに指定したパスに該当するファイルが、イテレーティブに{{ item }}変数に代入されコピーが行われます。

Gitでリモートリポジトリを移行する方法

Gitでリモートリポジトリを他のサーバーに移行するには、以下の様に行います。

まず、既存のリポジトリから–bareオプションを指定してcloneします。

$ git clone –-bare ssh://user@oldserver/repo.git

次に、新しいリモートリポジトリに対して–mirrorオプションを指定してpushします。

$ cd repo
$ git push –-mirror ssh://user@newserver/repo.git

以上で、全てのブランチとタグを含んだ、リポジトリの移行が完了します。上記の例では通信プロトコルとしてsshを選択していますが、他でも同様です。

Dockerコマンドのまとめ

コンテナ内からホストへファイルをコピー

$ docker cp <ContainerId>:/path/to/file/in/container /target/path/in/host

起動中のコンテナにログイン

$ docker exec -it <ContainerId> bash

ログ(コンテナからの標準出力)の確認

$ docker logs <ContainerId>

gitコマンドのまとめ

過去のリビジョンにタグを付ける

タグの作成

$ git tag -a <Tag> <Revision> -m <Message>

作成したタグをリモートにプッシュ

$ git push origin --tags

リモートリポジトリを変更

$ git remote set-url origin ssh://user@server:/path/to/repo.git

リモートリポジトリのリビジョンを取得

$ git ls-remote ssh://user@server:/path/to/repo.git <Tag>

ブランチの削除

ローカルリポジトリにあるブランチを削除

$ git branch -d <BranchName>

対応するリモートリポジトリにあるブランチを削除

$ git push --delete origin <BranchName>

変更の取り消し

コミット前の変更を取り消す

$ git checkout .

Dockerを使ってみる

はじめに

Dockerはオープンソースのコンテナ型仮想化ソフトウェアです。VirtualBoxやVMWare等のサーバー仮想化技術とは異なり、一つのOS上に独立したユーザー空間を作ることによって仮想化を実現するため、リソースの使用量が少なくて済むという特徴を持ちます。

導入

DockerをCentOS7上にインストールします。(ちなみにv1.8以降はCentOS6のサポートはされない模様です。)

リポジトリの登録

まず、Dockerの公式リポジトリをyumに登録します。

$ sudo vim /etc/yum.repos.d/docker.repo

[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg

Dockerのインストール

yumを利用して、docker-engineパッケージをインストールします。

$ sudo yum install docker-engine

SELinuxが有効の場合は、docker-selinuxもインストールします。

$ sudo yum install docker-selinux

自動起動設定

dockerサービスがサーバー起動時に自動起動されるよう設定します。

$ sudo systemctl enable docker

起動

dockerサービスを起動します。

$ sudo systemctl start docker

コンテナの作成

コンテナイメージのダウンロード

準備が整ったのでコンテナを作成します。コンテナの作成には、その基となるコンテナイメージを利用します。各Linux OSのコンテナイメージはDocker Hubというリポジトリで公開されています。例えば、CentOSのコンテナイメージをダウンロードする場合は、以下の様にします。

$ sudo docker pull centos

ダウンロードしたコンテナイメージはローカルリポジトリに保存されます。保存されているイメージの一覧を確認するには、imagesコマンドを実行します。

$ sudo docker images

コンテナの作成

コンテナイメージを利用してコンテナを作成するにはrunコマンドを実行します。使用するイメージと作成したコンテナ上で実行するコマンドを引数として与えます。

$ sudo docker run centos echo "Hello World"

また、コンテナ作成後にログインをしたい場合は、-i(標準入力を開け続ける)と-t(疑似端末を割り当てる)のオプションを与えた上で、コマンドとしてシェルを指定します。

$ sudo docker run -it centos bash
[root@xxxxxxxxxxxx /]#

コンテナから抜けるにはexitコマンドを実行します。その際、コンテナは自動的に停止します。

[root@xxxxxxxxxxxx /]# exit
$

また、コンテナを作成する際に、コンテナに名前を設定するには–nameオプション、ホスト名を設定するには–hostname(または-h)オプションを利用します。

$ sudo docker run --name test-container --hostname test-host centos

コンテナの削除

存在しているコンテナの一覧を確認するにはpsコマンドを利用します。オプション-aによって、停止しているコンテナを含めて全てが表示されます。

$ sudo docker ps -a

削除したいコンテナを確認したら、IDまたはNAMEを指定してrmコマンドを実行します。実行中のコンテナを削除する場合は-fオプションを付与します。

$ sudo docker rm de3d1454fd9e

 

firewalldによるファイアウォール設定

はじめに

CentOS7からはiptablesではなくfirewalldというファイアウォールが導入されました。(iptablesも利用できるようですが、firewalldが標準となっています。)

起動

起動しているか確認するには、systemctlのstatusコマンドを実行します。

$ sudo systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
   Active: active (running) since Tue 2015-11-03 22:27:20 JST; 2h 3min ago
 Main PID: 605 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─605 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

上記のようにactiveという表示が出ていれば起動しています。起動していなければstartコマンドで起動させることができます。

$ sudo systemctl start firewalld

また、自動起動サービスとして登録するには、enableコマンドを実行します。

$ sudo systemctl enable firewalld

ゾーンという概念

 

Top