コンテンツにスキップ

Recent Posts

Ruby on Railsで初めてアプリを作ってみる #3 -scaffoldジェネレータ-

railsには scaffold という単純なリソースを一気に生成するコマンドが存在する。 今回はこのコマンドを使ってみる。

Usersリソースの生成

今回は scaffold コマンドを使ってリソースを生成する。 ここでは以下の要素をもつUsersリソースを生成する。

  • id int
  • name string
  • email string

rails generate スクリプトに scaffold コマンドを指定し、リソースの単数系と要素の情報を渡す

$ rails generate scaffold User name:string email:string

id要素はRailsが主キーとしてデフォルトで設定する

DBにusersのセットアップを行う

rake コマンドを使ってDBをmigrate(更新)する。

$ bundle exec rake db:migrate
== 20141111170736 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0012s
== 20141111170736 CreateUsers: migrated (0.0014s) =============================

出力から users テーブルが作られたことがわかる

ブラウザで確認

rails server コマンドの短縮版である rails s を使って3000番portにアプリを立ち上げる

$ rails s

http://xx.xxx.xxx.xxx:3000

にブラウザでアクセスすると #1 railsのセットアップ で見たデフォルトのRailsページが表示される

次に以下のエンドポイントにアクセスしてみる

http://xx.xxx.xxx.xxx:3000/users

すると既にUser一覧ページができあがっているのがわかる。この他に

  • 新規ユーザーを作成するページ
  • 特定のidのユーザー情報を表示するページ
  • 特定のidのユーザー情報を編集するページ

が作られている。

Micropostsリソースの生成

Usersリソースと同様に scaffold コマンドと rakemigrate タスクで生成する

$ rails generate scaffold Micropost content:string user_id:integer
$ bundle exec rake db:migrate
== 20141112174234 CreateMicroposts: migrating =================================
-- create_table(:microposts)
   -> 0.0029s
== 20141112174234 CreateMicroposts: migrated (0.0031s) ========================

config/routes.rb にmicropostsリソースの設定が追加された

参照

Ruby on Rails チュートリアル

Ruby on Railsで初めてアプリを作ってみる #2 -Herokuのセットアップ-

Ruby on Railsのアプリケーション構築に適したPaaSであるHerokuのセットアップをする。

Herokuに必要なgemのインストール

Herokuで使用するDBであるPostgreSQLと通信するための pg とHerokuで画像やスタイルシートなどの静的アセットを提供するための rails_12factor を本番(production)環境にインストールするための内容をGemfileに追記する

group :production do
  gem 'pg', '0.15.1'
  gem 'rails_12factor', '0.0.2'
end

production環境用のgemをインストールしないオプションをつけて bundle install を実行する。 これによりGemfile.lockが更新され、production環境に備えることができる。

$ bundle install --without production
Your bundle is complete!
Gems in the group production were not installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.

ここまでできたらgitにcommitしておく。

$ git commit -a -m "Update Gemfile.lock for Heroku"

git commit-a は変更のあったファイルを自動で add するオプション。

herokuコマンドが使えるようにする

まずは以下のURLからHerokuにアカウント登録をする。

https://signup.heroku.com/identity

アカウント登録が完了したら heroku コマンドをインストールする。 今回はAWSのLinux環境へのインストールなので以下のURL( Heroku Toolbelt のStandalone)を参照して以下の手順を得る。

https://toolbelt.heroku.com/standalone

$ wget -qO- https://toolbelt.heroku.com/install.sh | sh
This script requires superuser access to install software.
You will be prompted for your password by sudo.
[sudo] password for sojiro: 
Add the Heroku CLI to your PATH using:
$ echo 'PATH="/usr/local/heroku/bin:$PATH"' >> ~/.profile
Installation complete

自動で sudo をつけて実行してくれる。インストールが完了したら出力にあるようにPATHを通す。

$ echo 'PATH="/usr/local/heroku/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
$ heroku version
heroku-toolbelt/3.15.2 (x86_64-linux) ruby/2.0.0

Herokuのセットアップ

heroku コマンドがインストールされたことを確認できたらコマンドラインからHerokuの認証を行う。

$ heroku login
Enter your Heroku credentials.
Email: your.account@email.com
Password (typing will be hidden): 
Your Heroku account does not have a public ssh key uploaded.
Could not find an existing public key at ~/.ssh/id_rsa.pub
Would you like to generate one? [Yn] Y
Generating new SSH public key.
Uploading SSH public key /home/user/.ssh/id_rsa.pub... done
Authentication successful.

認証が完了したらHerokuのセットアップをする

$ heroku create
Creating infinite-peak-4923... done, stack is cedar-14
https://infinite-peak-4923.herokuapp.com/ | git@heroku.com:infinite-peak-4923.git
Git remote heroku added

これでgitのremoteにherokuが追加される

$ git remote -v
heroku  git@heroku.com:infinite-peak-4923.git (fetch)
heroku  git@heroku.com:infinite-peak-4923.git (push)
origin  https://github.com/sojiro14/first_app.git (fetch)
origin  https://github.com/sojiro14/first_app.git (push)

Herokuへデプロイ

追加されたremoteに push をすればHerokuへのデプロイが完了

$ git push heroku master

https://infinite-peak-4923.herokuapp.com/

heroku create 時に出力された上記URL(アプリケーションごとに異なる)にアクセスするとHerokuにデプロイしたアプリケーションが確認できる。Rails 4.0ではこの時点で The page you were looking for doesn't exist. と表示されてしまう模様。

参照

Ruby on Rails チュートリアル

Ruby on Railsで初めてアプリを作ってみる #1 -railsのセットアップ-

Ruby on Railsで初めてアプリを作ってみます。 今回はRailsの立ち上がりを確認するところまで。

アプリのセットアップ(rails new)

railsのアプリ作成は rails new コマンドで始まる。

$ mkdir rails_projects
$ cd rails_projects

今回のアプリ作成の為にディレクトリを作成し、早速コマンドを実行。

$ rails new first_app
...
An error occurred while installing sqlite3 (1.3.10), and Bundler cannot continue.
...

いくつかのディレクトリやファイルが作成されるが、最後にこのようなエラーが出てbundle失敗。 そこでGemfileを編集してbundleをやり直す。

$ cd first_app/

Gemfileを編集。内容はRuby on Rails #Bundlerを参照。

$ bundle update
...
Building native extensions.  This could take a while...
ERROR:  Error installing sqlite3:
    ERROR: Failed to build gem native extension.

    /home/sojiro/.rvm/rubies/ruby-2.0.0-p594/bin/ruby extconf.rb
checking for sqlite3.h... no
sqlite3.h is missing. Try 'port install sqlite3 +universal'
or 'yum install sqlite-devel' and check your shared library search path (the
location where your sqlite3 shared library is located).
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
...

またも失敗。よく見るとsqlite-develが足りていないらしい

$ sudo yum install sqlite-devel

sqlite-develをインストール後再度bundleによるgemのインストールを試みる

$ bundle update
Installing sqlite3 1.3.8
Installing turbolinks 1.1.1
Installing uglifier 2.1.1
Your bundle is updated!
$ bundle install
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.

インストール成功。

サーバーの立ち上げ(rails server)

ローカルでrailsを立ち上げるコマンド rails server を実行。

$ rails server
...
Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
...

Node.jsのインストール

rails server コマンド実行でエラーが出てしまう。JavaScript runtimeがインストールされていないことが原因のよう。メッセージ通り https://github.com/sstephenson/execjs に行ってみるとJavaScript runtimeとしてNode.jsが有効と書いてあるのでNode.jsをインストールする。

$ sudo rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo yum install nodejs npm --enablerepo=epel

今回はyumでインストールした。そして再度 rails server

$ rails server
=> Booting WEBrick
=> Rails 4.0.5 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server

ローカルでサーバーが立ち上がる。 今回はAWS上で作業しているので、AWS該当インスタンスのSecurity Groupで3000番portを空ける。

http://xx.xxx.xxx.xxx:3000

にブラウザでアクセスして以下の画面が見えればOK

{% img /images/rails/rails_starting.png %}

GitHubに上げておく

$ git init
$ git remote add origin https://github.com/sojiro14/first_app.git

GitHubでリポジトリ作成

$ git add .
$ git commit -m 'Initialize repository'
$ git push -u origin master

参照

LinuxにRuby on Railsをインストールする

Ruby on Railsを使ってみたいと思い、AWSにインストールした手順。

Ruby version 2.0.0 を RVMを使ってインストール

Linuxに最新のRubyをインストールするを参照

gemsetの作成

Rubyをインストールしたら、Railsのアプリケーションを実行するために必要な他のソフトウェア向けにシステムを構成する必要があります。通常、これはgemのインストールに関連します。gemとは自己完結型のRubyコードのパッケージです。バージョン番号の異なるgem同士がコンフリクトすることがあるため、一連のgemを自己完結的にまとめたgemsetというものを作成してバージョンを使い分けるのが便利です。 (引用: Ruby on Rails チュートリアル

以下のコマンドでgemsetを作成する。

$ rvm use 2.0.0@railstutorial_rails_4_0 --create --default

上のコマンドを実行すると、Ruby 2.0.0に関連付けられたrailstutorial_rails_4_0というgemsetを作成し (--create)、その場でgemsetを有効にし (use)、gemsetをデフォルトに設定 (--default) します。これにより、ターミナルウィンドウを開いたときに2.0.0@railstutorial_rails_4_0というRubyとgemsetの組み合わせが常に選択されるようになります。 (引用: Ruby on Rails チュートリアル

RubyGemsのインストール

AWSには始めからgemがインストールされていて、PATHは以下。

$ which gem
/usr/bin/gem

RVMでRubyをインストールするとPATHが上書きされる。

$ which gem
~/.rvm/rubies/ruby-2.0.0-p594/bin/gem

今回はチュートリアルに合わせてgemのバージョンを更新する

$ gem update --system 2.0.3

gemの設定ファイルである .gemrc に自動生成されるドキュメントである rirdoc の自動生成を抑制する設定をする

$ vim .gemrc
$ cat .gemrc
install: --no-rdoc --no-ri
update:  --no-rdoc --no-ri

Railsをインストールする

いよいよRailsをインストールする

$ gem install rails --version 4.0.5

インストール完了。 以下のコマンドで確認する

$ rails -v
Rails 4.0.5

Railsがインストールされたことを確認できた

参照

Ruby on Rails チュートリアル

Linuxに最新のRubyをインストールする

Ruby on Railsを使ってみたいと思い、調べてみるとRails4ではRubyのバージョンは1.9以降が必須のようである。

自分がさくらで借りているサーバーではRubyのバージョンが1.8.7だったのでこれを新しくしてみた。

RVMのインストール

新しいRubyをインストールする前にRVM(Ruby Version Manager)をインストールする。これはRubyをバージョンごとに管理するツール

$ curl -L https://get.rvm.io | bash -s

このコマンドで自分のホームディレクトリ以下に .rvm/ が作られ、ここにRVMがインストールされる。

そして .profile .bashrc .zshrc にPATHを通す記述が追加される。

また、 .bash_profile .zlogin にRVMをロードする記述が追加される。

RVMのインストールが完了したらロードする。ここではbashを使っているので以下のようにする。

$ source .bash_profile

Rubyのインストール

さくらのレンタルサーバーでの失敗

まずはRubyのインストールに必要なパーツを調べ、無ければインストールする。 以下のコマンドで必要なものをピックアップしインストールまで行ってくれる。

$ rvm requirements
/your/home/directry/.rvm/scripts/functions/support: line 314: rvm_debug: command not found
Checking requirements for freebsd.
Installing requirements for freebsd.
Updating system.
Installing required packages: automake, bison, readline, libyaml...
Error running 'requirements_freebsd_libs_install automake bison readline libyaml',

ここでErrorが発生。内容は必要なパッケージがインストールできなかったということ。 そこでFreeBSDのパッケージ管理コマンドである pkg コマンドを使ってインストールを試みる。

が、サーバーの設定的に自分でパッケージを追加することができなかったのでさくらのサーバーを断念してAWSに移行した。

AWSに移行

AWSに移行して $ rvm requirements までを実行する。(AWSは始めからRubyのバージョンが2.0.0だったが構わず実行) ここでも $ rvm requirements が転ける。

そこで今度はCentOSだったので yum を使ってインストールを試みる。以下のコマンドは $ rvm requirements が教えてくれる。Errorの原因が sudo で実行していなかったことなので sudo 付きで実行する。

sudo yum install -y patch libyaml-devel libffi-devel glibc-headers autoconf gcc-c++ glibc-devel patch readline-devel zlib-devel openssl-devel automake libtool bison

これで成功。

$ rvm requirements
Checking requirements for amazon.
Requirements installation successful.

$ rvm requirementsも成功。

このサーバーではすでにバージョン2.0.0のRubyがインストールされていたが、RVMの配下に新たにバージョン2.0.0のRubyをインストールする。

$ rvm install 2.0.0 --with-openssl-dir=$HOME/.rvm/usr

インストール完了。

参考

Ruby on Rails チュートリアル

MySQLにおけるNOT NULLカラムへのインサート時の挙動

MySQLでカラムにNOT NULLを指定した際、そのカラムに対するインサート操作による挙動が特殊なのでまとめる。

単列インサートと複数列インサートで挙動が変わる

NOT NULLを指定したカラムを含むテーブルへのインサートでは、一度に1行のみ挿入する単列インサートと、一度に複数行を挿入する複数列インサート(バルクインサート)で挙動が変わる。

MySQLマニュアルからの抜粋

Inserting NULL into a column that has been declared NOT NULL. For multiple-row INSERT statements or INSERT INTO ... SELECT statements, the column is set to the implicit default value for the column data type. This is 0 for numeric types, the empty string ('') for string types, and the “zero” value for date and time types. INSERT INTO ... SELECT statements are handled the same way as multiple-row inserts because the server does not examine the result set from the SELECT to see whether it returns a single row. (For a single-row INSERT, no warning occurs when NULL is inserted into a NOT NULL column. Instead, the statement fails with an error.)

単列インサートの場合はNOT NULLが指定されたカラムにNULL値が挿入されるとそのクエリはエラーとなって失敗するが、複数列インサートの場合は警告(warning)を発するものの、クエリは正常に受け付けられる。

その際、NULL値が指定された各カラムにはそれぞれのカラムのデータ型の暗黙的なデフォルト値が挿入される。(数値型なら0、文字列型なら空文字''、etc...)

検証

  • MySQLのバージョンは5.1.69
    • ただしマニュアルの該当箇所はバージョン5.7まで変更がないため、どのバージョンでも同じ挙動と思われる
  • テーブル定義は以下
CREATE TABLE `not_null_test` (
  `id` int(10) unsigned NOT NULL,
  `test_score` int(10) unsigned NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

単列インサート

mysql> insert into
not_null_test
(id, test_score, created_at)
values
(1, NULL, NULL);

ERROR 1048 (23000): Column 'test_score' cannot be null

複数列インサート

mysql> insert into
not_null_test
(id, test_score, created_at)
values
(1, NULL, NULL),
(2, NULL, NULL);

Query OK, 2 rows affected, 2 warnings (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 2 

mysql> select * from not_null_test;
+----+------------+---------------------+
| id | test_score | created_at          |
+----+------------+---------------------+
|  1 |          0 | 2014-10-18 13:35:10 |
|  2 |          0 | 2014-10-18 13:35:10 |
+----+------------+---------------------+
2 rows in set (0.00 sec)

※ timestampにテーブル定義で設定したデフォルト値'0000-00-00 00:00:00'ではなく、型のデフォルト値である現在時刻が入っている点に注意

RESTとはなにか

APIを実装することになり、今更ながらWebのアーキテクチャスタイルであるRESTとはなにか理解するためにまとめてみた。

Webのアーキテクチャスタイル

Webのアーキテクチャスタイルはクライアント/サーバーというスタイルを中心に、いくつかの制限(アーキテクチャ)を複合的に組み合わせたREST(Representational State Transfer)を理想としている

RESTはどのようなスタイルなのか

RESTは以下のスタイルを複合的に組み合わせたアーキテクチャである

  • クライアント/サーバー
  • ステートレスサーバー
  • キャッシュ
  • 統一インターフェース
  • 階層化システム
  • コードオンデマンド

クライアント/サーバー

WebではHTTPでクライアントとサーバーが通信する、クライアント/サーバーアーキテクチャを採用している。クライアントはサーバーにリクエストを送り、サーバーはそれに対してレスポンスを返す。

ユーザーインターフェースはクライアントに任せればよく、サーバーは処理に専念できるので様々なデバイス(PC・携帯電話・ゲーム機)に対応でき、サーバーの冗長化も容易である。

ステートレスサーバー

ステートフル/ステートレスという考え方があるが、サーバーがステートレスなやり取りを前提としていること。

ステートフル/ステートレスに関しては以下のエントリを参照

キャッシュ

一度取得したリソースをクライアント側である程度の期間保持して使い回すこと。

  • メリット
    • 同じリソースを取得するためにその都度クライアント/サーバー間で通信する必要がなくなる
    • これによりネットワークの帯域節約や処理の高速化を実現できる
  • デメリット
    • 適切に制御しないと意図せず古いリソースを参照してしまうことがある
    • 特に大規模なシステムではどこで何がキャッシュされているか正確に把握するのは容易ではない

統一インターフェース

リソースに対する操作を統一したインターフェースで行う。

HTTP/1.1ではリソースに対するメソッドが8つのみ定義されている。このようにインターフェースを限定することで様々なコンポーネントが生まれても統一された仕様としてリソースへの操作が行われ、それぞれの独立性が保たれることで多様性を受け入れることができる。

階層化システム

統一インターフェースを採用することにより、クライアント/サーバー間にプロキシなどのコンポーネントを設置してもクライアントはそのままリクエストを送ることができる。

これにより大規模システムではロードバランサーを導入したり、HTTPインターフェースを持たないコンポーネントに対してHTTPインターフェースをもつサーバーを返して処理をするなどの階層化が可能となる。

このようなアーキテクチャを階層化システムと呼ぶ。

コードオンデマンド

プログラムをサーバーからクライアントが受け取り、それをクライアント上で実行するアーキテクチャスタイル。JavaScriptやFlashがこれに該当する。

  • メリット
    • サーバーと都度通信することなくクライアント側のみで処理できることが増える
    • これによりユーザーのアクションに対する処理の速度が向上する
  • デメリット
    • クライアント/サーバー間でやり取りされるリソースが不明確になる
    • クライアント側の裁量が増える分、サーバーとやり取りされるリソースの内容が明確ではなくなる

RESTful

RESTの思想に忠実に設計されていることをRESTfulである、と言う。

RESTは上記の通り分散ネットワークを効率的に、可用性・冗長性高く利用するための理論であり、Webが理想とするアーキテクチャスタイルである。

この思想に則った設計がされることで多様なシステムの中にも仕様の統一感が生まれ、Webの世界が広がったと言える。

参考

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

ステートフル ステートレスとはどういうことか

コンポーネント間のやり取りにはステートフル/ステートレスという考え方がある。FTPではステートフルなやり取りが、HTTPではステートレスなやり取りが採用されいるが、それぞれの特徴についてまとめてみる。

セッション状態(アプリケーション状態)

システムにログインしてからログアウトするまでの一連の操作をセッションと呼ぶ。その一連の操作の中のそれぞれの状態をセッション状態と呼ぶ。

ステートフル

ステートフルなやり取りではサーバーはクライアントのセッション状態を保持している。

  • メリット
    • やり取りが完結に済む
    • それによりネットワークの帯域を節約できる
  • デメリット
    • クライアントの状態を都度把握しておかなければいけないのでクライアントが増えると負荷も増える
    • サーバーを複数台設置する場合にはそれぞれのサーバー間でクライアントの状態を同期しなければいけない
    • これらの理由によりスケールアウトには向かない

ステートレス

ステートレスなやり取りではサーバーはクライアントのセッション情報を保持しない。

  • メリット
    • クライアントのリクエストは状態に依存せず、常にリソースに対する操作に必要十分な情報となる
    • よってサーバーが増えてもそのままのリクエストでいつも同じリソースに対する操作ができる
    • このためスケールアウトに向いている
    • また処理がクライアントの状態に依らないので処理がシンプルになる
  • デメリット
    • やり取りが冗長になりがちである
    • またリソースへの操作が必要になる度にそのやり取りを繰り返す必要がある
    • これによりネットワークの帯域を消費し、処理も遅くなる
    • サーバーが状態を保持していないのでエラーが起きたときのハンドリングが複雑になりがちである

参考

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

reveal.jsを使ったプレゼンテーションの作成

YAPC::Asia 2014のLTに登壇させていただいた。その際、サクッとオシャレなプレゼンテーションを作ることができるということでreveal.jsを使って作ったのでメモ。

reveal.jsとは

htmlやmarkdown形式で簡単にリッチなプレゼンテーションを書くことができるjsやcssを中心としたライブラリ

reveal.jsの入手

GitHubのreveal.jsリポジトリからzipをダウンロードする。右下のDownload ZIPボタンを押すだけで完了。

プレゼンテーションの作成

基本的にindex.htmlを編集していく。特に以下の部分を編集していけば良い。

<div class="slides">
<!---...
ここを編集
...-->
</div>

デフォルトでは本家Demoの仕様となっている。

ページの追加

<section></section>タグを追加することで新しいページを追加することができる。新しいページは右側に追加されていく。

さらに<section></section>タグの中に<section></section>タグをネストすることで、縦方向にスライドを追加することができる。

スライドの動きの設定

<section>タグにdata-transitiondata-background-transitionを指定することでスライドの動きを設定できる。

デフォルトではスライドが回転するように動いていくが、例えば以下のように設定することで横方向にスライドが流れるようになる。

<section data-transition="linear" data-background-transition="slide">
  • data-transition
    • スライドに載っているコンテンツの動きを指定
  • data-background-transition
    • スライド自体の動きを指定

背景の設定

<section>タグにdata-backgroundを指定することでスライドの背景を設定できる。

<section data-background="#000000">  <!--背景色を指定-->
<section data-background="img.jpg">  <!--背景画像をパスで指定-->

コードブロックを設定

コードブロックを挿入するには<pre><code></code></pre>タグを挿入する。

<code>タグのclassに言語を指定することで適切なハイライトが適用される。

<section>
    <pre><code class="html">
        <body>
            <div class="example">
                test
            </div>
        </body>
    </code></pre>
</section>

スライド内コンテンツの動きの設定

スライドのページ内でいくつかの動きを設定したいときは

  • sectionタグのidにfragmentsを指定する。
  • ページ内のコンテンツのclassにfragmentを指定する。
<section id="fragments">
    <h2>example</h2>
    <ol>
        <li class="fragment">test1</li>
        <li class="fragment">test2</li>
        <li class="fragment">test3</li>
    </ol>
</section>

上記のように設定するとリストの要素が一つずつ出現する。

fragmentclassにはオプションを設定することができ、オプションによって動作をが変わる。

  • class="fragment current-visible": 要素が出現する(デフォルト)
  • class="fragment grow": 要素が大きくなる
  • class="fragment shrink": 要素が小さくなる
  • class="fragment roll-in": 要素が回転しながら出現
  • class="fragment fade-out": 要素が消える
  • class="fragment highlight-green": 要素が指定した色になる(red, blueなども指定可能)
  • class="fragment highlight-current-blue": 要素が指定した色で出現する(red, greenなども指定可能)

マークダウンでの記述

reveal.jsではプレゼンテーションをマークダウンで記述することもできる

  • sectionタグにdata-markdownを指定
  • <script type="text/template"></script>ブロック内に記述
<section data-markdown>
<script type="text/template">
    # ここにmarkdown形式で記述
    ```
    echo "you can also write code.";
    ````
</script>
</section>

コードブロック内でも</script>タグが出現するとマークダウンの終了と誤解されるので注意

参考

Amazon Linux AMIにagをインストールした手順

AWSでWebサーバーを借りた。このサーバーにagをインストールした際の手順。

agとは

ソースコードから特定のwordを検索する際に使うコマンドgrepがより賢く改良されたのがackコマンド。

このackをさらに改良し、検索を高速化させたのがagコマンド(正式名称:The Silver Searcher)である。

Amazon Linux AMIへのインストール

MacにはHomebrewを使ってbrew install the_silver_searcherとするだけで簡単に入れることができた。

AWSで借りたサーバーはAmazon Linux AMIという独自のイメージだったが、yumが使えるのでCentOSと同じ以下の手順で入れることができた。

ディレクトリの作成とソースのダウンロード

ソースをダウンロード、インストールするディレクトリを作成し、gitからagのソースを持ってくる

$ mkdir -p $HOME/local/source
$ cd $HOME/local/source
$ git clone https://github.com/ggreer/the_silver_searcher

ソースをmakeするための準備

対象のサーバーはまっさらな状態でコンパイラなどもなかったため、それぞれインストールする。

前述の通りAmazon Linux AMIではyumを使うことができる

$ sudo su -
yum -y groupinstall "Development Tools"
yum -y install pcre-devel xz-devel
exit

インストール

コンパイルしてインストールする

$ cd $HOME/local/source/the_silver_searcher
$ ./build.sh
$ sudo make install

パスを通す

$ cd
$ vim .bashrc
$ cat .bashrc
...
export PATH=$HOME/local/bin:$PATH
...
$ source .bashrc

これでagが使えるようになった

参考