linuxへようこそ
linuxシステムにログインするとマシンの名前が左の方に書かれた画面が表示されます。
linuxではこの名前の横に命令を入力することで様々な処理を行います。
WindowsやMacのようにアイコンがありそれをクリックすることで処理をするものをGUIとよびますが、このように文字で処理を行うものをCUIといいます。
このCUI上で操作を行うために基本的なコマンドを覚えてもらいます。
出て来たコマンドは必ず手を動かして実行してください。
全般
ここにあるファイルが見たい
finderを選択して書類フォルダをクリックすると
そこにはwordファイルなどのいくつかのファイルが入っているはずです。
CUIにおいてこのようにディレクトリの中に含まれるファイルを調べるためのコマンドがlsです。
lsはlistの略です。
使用法
ls
また他にもlsの後ろに-(オプション)をつけて
ls -l
や
ls -a
などのコマンドもあります。
ls -lはlong形式と呼ばれる、ファイルの詳細な情報が表示されます。この表記の意味は後々。
ls -aは.から始まる隠しファイルも表示します。隠しファイルは設定ファイルなど普段いじられないようにしてあるファイルです。
ファイル関係
ファイルの作成
ファイルを作成する際には後述するエディタの使い方で説明するようにファイル内に何かを書いて保存するのが普通ですが,ここではまずファイルを作ることだけを考えて別の方法でファイルを作ってみます。
echo hoge
と入力してみてください。
そうすると
hoge
という返事が返ってくるはずです。
では次に
echo hoge > test.txt
と入力してlsをしてみてください。
するとtest.txtというファイルができているはずです。
cat test.txt
と入力すると中身を確認できます。
ファイル名の変更
ファイル名を変更するにはmvを使います。
またこのコマンドはファイルを移動するときにも使います。
mv test.txt test_new.txt
と入力しlsするとtest.txtが消えてtest_new.txtができています。
catで中身を確認してみてください。
ファイルのコピー
ファイルをコピーするにはcpを使います。
cp test_new.txt test_new.txt.bak
と入力しlsするとtest_new.txt.bakというファイルができます。
ファイルの消去
ファイルを消去するにはrmを使います。
rmで削除したファイルは復元できないので注意してください。
rm test_new.txt
と入力してlsするとtest_new.txtが消えています。
バックアップファイルよりtest_new.txtをもう一度作ります。
cp test_new.txt.bak test_new.txt
と入力してください。
ディレクトリ関係
ディレクトリの作成
作成するファイルをホームディレクトリ内にすべて配置するとディレクトリ内がどんどん汚くなってしまいます。
そこで新しいディレクトリを使ってファイルを整理しましょう。
mkdir work
と入力しlsしてください。するとworkディレクトリができています。
では今まで作成したファイルをこのworkディレクトリに移動してください。
mv test_new.txt work mv test_new.txt.bak work
ディレクトリの移動
今作ったworkディレクトリの中で作業をしましょう。
ディレクトリの移動にはcdを使います。
Change Directoryの略です。
cd work
と入力しpwdすると、確かにworkディレクトリの中にいることがわかります。
workに対するホームディレクトリのように上位のディレクトリのことを親ディレクトリとよび、コマンドでは ..(ピリオド2つ)で表されます。
現在いるディレクトリのことをカレントディレクトリとよび、コマンドでは .(ピリオド)で表されます。
cd <ディレクトリ名> が基本的な使い方ですが以下のようなものもよく使います。
cdは講義中でも頻繁に使うのですぐに使えるようにしましょう。cd .. 親ディレクトリへ移動 cd ~ ホームディレクトリへ移動 cd ホームディレクトリへ移動
ディレクトリのコピーと消去
ディレクトリのコピーにはファイルと同様にcpを使いますが、
cp -r <ディレクトリ名1> <ディレクトリ名2>
というように-rオプションをつけます。
-rはrecursive(再帰的に)を意味します。
ディレクトリの消去はrmdirを用いますが、rmdirは空のディレクトリにしか使えません。
中にファイルの入っているディレクトリを中身ごと削除したい時は
rm -r <ディレクトリ名>
のようにここでも-rをつけます。
一連の流れで使ってみましょう。
mkdir child1 <= child1ディレクトリを作成 cp -r child1 child2 <= child1ディレクトリをコピーしてchild2を作成 rmdir child2 <= child2を消去 cp test_new.txt child1 <= test_new.txtをchild1にコピー rm -r child1 <= child1を消去
お疲れさまです。
以上で基本的なlinuxコマンドはおしまいです。
どれも開発していく上で必要不可欠なので必ず手を動かして覚えましょう。
送信フォームを持った簡単な提示版の作成
今回はSQLiteを使って簡単な掲示板を作ってみます。SQLiteとは、データベース管理システムであり、サーバーとしてではなくアプリケーションに組み込んで利用される軽量のデータベースです。今回の例ではWeb上で書き込んだデータが送信され、SQLiteのデータベースに書き込まれ、今度はそれを読み取ってWeb上で表示をするという処理を行います。
まずはSQLiteのインストールから...;
sudo apt-get install php5-sqlite
sudo apt-get install sqlite3
それではインストールしたSQLiteを使ってデータベースの作成をします。
keisei@ip-10-150-187-196:~$ sqlite3 db/ bbs.db /*sqlite3 作りたいファイル名*/
SQLite version 3.7.4
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
次にテーブルを作ります。
sqlite>
CREATE TABLE messages (id INTEGER PRIMARY KEY,content TEXT,created_at TEXT
);
上の操作はmessagesというテーブルを作り、その中にデータとして、INTEGER(整数)型のidという変数、TEXT型のcontent,created_atという変数の値が入るんだよという操作を行っています。ちなみにINTEGERの後のPRIMARY KEYというのはidにNULLが入ったときに前回の数字の連番が入るという制約を与えるものです。
それではデータベースを実際に利用してみます。
~/dev$ vim www/index2.php //index2.phpの作成
setAttribute(
PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION
);
$result = $pdo->query('SELECT * FROM messages');
?>
最初のまでは、PDOインスタンスを作り、エラー処理をしながらbbs.dbのデータを$resultに書き込んでいます。要はbbs.dbに書き込まれているデータを取ってくる操作を行っています。
setAttribute(
PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION
);
$content = $_POST['content'];
$pdo->query(
"INSERT INTO messages VALUES
(NULL, '$content', DATETIME('NOW'))");
header(“Location:index2.php”);
post.phpでは掲示板に書き込んだデータがindex2.phpの処理によって$contentに入り、その値を NULL,DATETIMEと供に bbs.dbのテーブルの中に書き込むという操作を行っています。
最後のheader(“Location:index2.php”); というのは、web上で送信ボタンを押した後、別のページにとぶのではなく元のページに戻ってくるんだよという処理を行います。
あとはindex.phpを実行して、それが表示されるwebページまで行ってもらえると送信フォームをもった掲示板がみられます。ただ最後に6/4日のブログのアクセス権限の記事を参照していただきたいのですが、実行しているファイルとそれがあるディレクトリの書き込みの権限がonになっていないとERRORが表示されるので注意してください。
今回はこれで終わります。間違っているところがあったらご指摘ください。(松本@keisei3434)
twitter APIを使ったtwitterクライアント作成
twitterではAPI(Application Programming Interface)が公開されており、APIを使うことで容易にtwitterクライアントを作成することができます。
ここではPHPを使ったtwitterクライアントの作成方法について記します。
一例として、指定したユーザーのタイムラインを取得して表示させるtwitterクライアントを作ってみましょう。
まず指定したユーザーのタイムラインを取得する方法について説明します。
タイムライン情報はtwitter APIという命令を利用して取得することができます。
試しに以下のURLをブラウザのURL欄に入力してアクセスしてみましょう。
http://api.twitter.com/1/statuses/user_timeline.json?screen_name=kensk8er
(URLの最後のkensk8erの部分はタイムライン情報を取得したいユーザーのアカウント名を入力してください)
そうすると何だかよく分からない文字列が大量に表示されているページを閲覧できると思います。これがtwitter APIによって取得されたタイムライン情報です。
これらの文字列が指定したユーザーのタイムライン情報を表しているので、このファイルの情報をプログラム中に取り込むことで指定したユーザーのタイムラインを取得することができます。
ファイルの情報を取得する方法として、file_get_contents()という便利な関数がPHPには用意されています。使い方は簡単で、file_get_contents()の引数にデータを読み込みたいファイルのフルパスを入れてやるだけです。実際のソースコードの例を以下に記します。
<?php $user = 'hoge'; $contents = file_get_contents('http://api.twitter.com/1/statuses/user_timeline.json?screen_name=' . $user);
ここでは$userという変数を定義することによって、$userの中身を変えることでタイムラインを取得したいユーザーを変更することができるようにしています。
次に所得したタイムライン情報をPHPで処理できる形式に変更する方法について説明します。
先程のURLは取得する文字列の形式をJSON(JavaScript Object Notation)で指定したため、このままではPHPで処理することができません。よってこれらをPHPが扱える文字列データ(オブジェクト)に変換してやる必要があります。
そこでJSONで書かれた文字列データをPHPの変数に変換する便利な関数として、json_decode()を使います。
使い方は簡単で、json_decode($contents)のように変換したいJSON形式の文字列データ(ここでは$contents)をjson_decode()の引数として渡してあげるだけです。こうすることでjson_decode()は返り値としてPHPの処理できる形式となった文字列データを返します。実際のソースコードの例を以下に記します。
<?php $json = json_decode($contents);
これで指定したユーザーのタイムライン情報をPHPの処理できる形式で取得することができました。最後に取得したデータを出力する方法について説明します。
まず先ほど取得したデータはツイートの内容以外にも様々な情報(ユーザー名、位置情報、リツイートされた回数、etc.)を含んでいるので、自分の表示したい情報だけを抜き出してやる必要があります。
ここでは例として以下のようにタイムライン情報を取得したい場合についてを説明します。
twitter APIで取得したタイムラインに関する様々な文字列情報は、JSONの規則に従っていくつかの項目毎に分類されて記されています。上の写真の例では取得したい情報はユーザーの名前、ツイートの中身の2つです。
ユーザーの名前情報はuserという項目のなかの更にnameという項目に格納されています。よってPHPでこの情報を参照するには、
->user->name
のように記述します。同様にツイートの中身情報はtextという項目に格納されているので、PHPで参照するには
->text
と記述します。またそれぞれのツイート1つ1つが上で述べた2つの情報を含んでいるので、全てのツイートについてこれらの情報を参照・出力するには以下のように記述します。
<? foreach($json as $row){ echo '<font color="red">'; echo $row->user->name; echo ': '; echo '</font>'; echo $row->text; echo '<br>'; }
上から2番目と5番目のechoで$row($jsonに含まれる各ツイート情報)の中のそれぞれname(ユーザーの名前)とtext(ツイートの中身)部分を出力しているのがわかります。1,3,4,6行目のechoはhtmlの形式に合わせるための出力です。
以上で指定したユーザーのタイムラインを取得して表示させるtwitterクライアントの完成です。最後に全体のソースコードを載せます。
<?php $user = 'kensk8er'; $contents = file_get_contents('http://api.twitter.com/1/statuses/user_timeline.json?screen_name=' . $user); $json = json_decode($contents); foreach($json as $row){ echo '<font color="red">'; echo $row->user->name; echo ': '; echo '</font>'; echo $row->text; echo '<br>'; } ?>
自分自身も勉強中でよく分からない事だらけなので、なにか間違いなどありましたらご指摘ください。
(村木@kensk8er)
SSH接続の方法
PSIウェブアプリ勉強会では、AmazonのUbuntuマシンにSSH接続し、それを利用して勉強を行っています。
ではSSH接続とはなんなのか?
SSHは、リモートコンピュータと安全に通信するためのプロトコルです。全てのネットワーク上の通信が暗号化されることによって安全性を高めています。
この暗号化には、"公開鍵", "秘密鍵"という技術が利用されています。
公開鍵とは情報の暗号化に使われる鍵であり、秘密鍵とは情報の復号に使われる鍵です。また、名前の通り公開鍵はその内容を公開して良い鍵であり、秘密鍵は公開してはならない鍵でもあります。
実際にSSH接続を行う方法は、コマンドライン上で
ssh -i xxx.pem ubuntu@IPアドレス(まはたドメイン)
として接続が完了します。このxxx.pemというファイルはAmazonからダウンロードしたファイルであり、
接続のために必要です。詳しいダウンロード方法は以下のURLに書かれています。
http://www.studio-fix.com/blog/kaoru/2009/04/01/post154/
また、最後のIPアドレスあるいはドメインは、接続するUbuntuマシンのIPアドレス、ドメイン名です。
是非Ubuntuマシンを利用してみましょう。
(斉藤@masall2)
UNIX系OSにおけるファイルのアクセス権限について
アクセス権
UNIX系OSは複数のユーザからアクセスされることを前提に作られています。
そのためユーザごとに各ファイル(コマンドも含めて)に対するアクセス権限を適切に与えなければなりません。
このアクセス権には、
の3つがあります。
ディレクトリにも上記の3つの権限があり、
を表します。
では実際にファイルの権限を見てみましょう。
現在のディレクトリで
$ ls -l
とコマンドを入力($はコマンドラインを表します)。
drwxrwxrwx 1 user group 20 6 4 testfile
というような結果が返ってくるはずです。
最初の10文字(drwxrwxrwx)の2文字目以降の9つの文字がアクセス権限を表し、userとgroupが所有するユーザとグループをそれぞれ表します。
まず最初の10個の文字列の2文字目以降に着目します。
最初の3文字がファイルの所有者のアクセス権、次の3文字がグループのアクセス権、最後の3文字がその他のユーザのアクセス権を表します。rやwなどの英字で表されていればその権限を持っており、-(ハイフン)が書かれていればその権限を持っていないという意味です。
それぞれのユーザやグループがどの権限を持っているのかをこのように確認できます。
グループ
UNIXではすべてのユーザがグループに所属します。ユーザは複数のグループに所属することもあります。
自分の所属しているグループは
$ groups
で確認できます。
$ groups <ユーザ名>
でユーザ名の所属するグループも確認できます。
このグループ情報は/etc/groupに記述してあります。
アクセス権の変更
アクセス権を変更するにはchmodコマンドを用います(change modeの意味)。
rwxのそれぞれの権限を2進表記に見立てて
r = 4
w = 2
x = 1
として、与えたい権限をこの数の和で表します。
例)
この数を所有者、グループ、他のユーザに与える権限の順に並べます。
実際に変更するコマンドは以下のようになります(#はコマンドラインでsuperuserが実行しているという意味)。
# chmod 755 filename
ここでは所有者にrとwとx、グループにrとx、他のユーザにrとxの権限を与えています。
所有者/所有グループの変更
所有者/所有グループを変更するにはchownコマンドを使います(change ownerの意)。
使い方は以下のように
# chown username:groupname filename
とします。これでfilenameの所有者がusername、グループがgroupnameに変更されました。
# chown -R username:groupname dirname
とします。
アクセス権、所有者を変更する例
あるユーザがphpファイルを作成し、コマンドラインからそのファイルを実行し、DBにinsertすることを考えてみましょう。
この時ファイルの実行者は所有者なので、ユーザ権限にwがあれば実行できます。
しかし、ブラウザ上からこのphpファイルを実行することを考えてみてください。
この時のファイルの実行者はapacheでありapacheはwww-dataグループに所属しています。
この時、グループ(あるいは他のユーザ)のw権限がなければこの書き込みプロセスはpermissionがないので失敗してしまいます。
そこで、ブラウザ上からもこのファイルを実行できるようにするために、
# chown user:www-data filename
# chmod 664 filename
としてファイルの所有グループとグループのアクセス権限を変更する必要があります。
参考:
- 作者: ケビン・リチャード,エリック・F・ジョンソン,武藤健志,トップスタジオ
- 出版社/メーカー: 翔泳社
- 発売日: 2007/02/22
- メディア: 大型本
- 購入: 1人 クリック: 6回
- この商品を含むブログ (2件) を見る
何か間違いがあれば指摘してください。
(文責: 篠塚@shinofumi_jp)
Vimではじめよう!
Introduction
Vimは多くのLinuxマシンにプリインストールされているため、Amazon EC2でインスタンスを立ち上げればすぐに使えて手軽な上に、軽く、非常に高機能なエディタです。しかし、WinやMacにインストールされているメモ帳やテキストエディタとは操作が異なる点も多く、初めて使う方は戸惑うところが多いかと思います。そこで今回は、Vimの基本的な使い方を紹介したいと思います。
※()内の英単語は僕が覚え易いように意識しているものです。
モードの切り替え
一般的なテキストエディタは、キーボードをタイプすればそのままテキスト入力されますが、Vimはそうではありません。Vimには4種類のモードが用意されており、テキスト入力を行うことがきでるのは、そのうちのINSERT(入力)モードだけなのです。下に、Vimに用意されているモードと、それぞれの機能を示します。
各モードへは、それぞれのコマンドを打つことで移ることが出来ます。逆にノーマルモードへ戻る際は、esc(またはCtrl + c)を打てば戻ることが出来ます。
INSERTモード
文字の入力はINSERTモードで行います。NORMALモードからINSERTモードに移るには、以下のような方法があります。
- i: カーソルの直前から入力開始する。(insert)
- I: 文頭から入力開始。
- a: カーソルの直後から入力開始する。(append, add)
- A: 文末から入力開始。
Shiftを押すと1行単位の操作になるということを覚えておいてください。
他にも、
- s: カーソル位置の文字を消して入力開始
- S: カーソル位置の1行を消して入力開始
- o: 下に1行開けて入力開始
- O: 上に1行開けて入力開始
などがあります。
VISUALモード
ノーマルモードでvと打つと、VISUALモードになり、範囲を指定することが出来るように成ります。Vと打つことで、行単位の範囲選択も可能になります。
NORMALモード、COMMANDモード
切り取りや貼りつけなどの編集処理はNORMALモードで行います。
また、NORMALモードで:や/を打つと、COMMANDモードに入ります。
たくさんコマンドが用意されているのですが、私が知っている代表的なものだけを紹介します。
システム系
- w 保存(write)
- q 終了(quit)
- q! 強制終了
※ -wqのように、組み合わせて使うことも出来ます。
カーソル系
- h(左), j(下), k(上), l(右) ホームポジションから手を動かすことなく移動することが出来ます。
- Ctrl + f 1画面分下へ(forward)
- Ctrl + b 1画面分上へ(back)
- G 一番下へ移動 (Ground)
- gg 一番上へ移動
- :213 213行目へ移動
編集系
- y コピー(yank)
- d 切り取り(delete)
- c 切り取り+切り取り後INSERTモードへ(cut)
- p 貼りつけ(put, paste)
- = 自動インデント
※編集系コマンドは以下のいずれかのようにして使います。
- VISUALモードで予め範囲選択をして、タイプする→範囲選択された箇所に編集が適用される。
- Shiftと合わせてタイプするか、二回連続でタイプする→カーソルのある行全体に編集が適用される。
- y2y, p3p というように、数字を挟んでタイプする→カーソル行から指定された行数に渡って編集が適用される。
便利系(COMMANDモード)
- :!
そのままシェルコマンドを打つことが出来るようになります。
- /find
"find"という文字列を検索します。次の候補に移るにはn(next)を、前の候補に移るにはNをタイプします。
- :s/before/after/g
"before"という文字列を"after"に置換します。/gを抜かすと、一番初めてに検索された候補だけが置換されます。
- :tabe path/to/file
:tabeのあとにファイルパスを入力すると、新たなファイルをタブ表示することが出来るようになります。タブの切り替えはノーマルモードで gt と入力します。
ブラウザが正しく表示されないときの対処法
Introduction
おそらく、殆どの人が一度はこのような画面を目にしたことがあるでしょう。
普通ならば、「あー調子わりー」と言ってよく原因がわからないままパソコンを再起動させたり、ルータの線を繋ぎ変えたり、辛抱強く待ったりするのではないかと思います。
今回はそんな時に「ここに問題がある!」とスマートに突き止めるためのステップを紹介します。
問題がはっきりすれば、ネットワーク管理者にも相談しやすくなりますし、解決に要する時間も短くなるはずです。
ネットワーク概要図
図のように、パソコンからウェブまでの道のりを5つのSTEPでチェックしていきましょう。
1. ルータとパソコン間に問題はないか?Part 1
まず、ルータとパソコンの間の通信に問題が無いかを確かめます。
早速、ルータが割り当てたIPアドレスをパソコンが取得できているかどうかを確かめましょう。
ルータって?
ざっくり言うと、ネットとパソコンの中継地点のようなものです。複数のパソコンとのデータのやり取りをコントロールします。
IPアドレスって?
パソコンのネット上での住所みたいなものです。世界で一つだけの番号が割り振られます。
そのために、コマンドラインを開いて以下のコマンドを打ちます。(コマンドはOSによって異なるので注意!今記事はLinuxを想定しています。)
$ ifconfig
すると、各インターフェイスの稼働状況、設定されているIPアドレス、ブロードキャストアドレスなどが表示されます。そしてethやenから始まるのがあなたのパソコンに搭載されているイーサネットワークインターフェイスを表しています。これらを中心に見て、
- errorがない
- UP(起動中)とRUNNING(動作中)が表示されている
ことを確かめてください。
2. ルータとパソコン間に問題はないか?Part 2
次に、ルータにパソコンからのリクエストが届くかを確かめてみましょう。コマンドラインで以下のコマンドを打ってください。
$ netstat -nr
すると、defaultと書かれた列があるのがわかります。ここに書かれているのが、ルータ自身のIPアドレスです。
このIPアドレスに対してリクエストを投げて、ちゃんと反応が帰ってくるか確かめてみましょう。以下のコマンドを打ちます。
$ ping <ルータのIPアドレス>
どうですか?上手く行けばレスポンスが帰ってきて行が増えていくはずです。確認できたらCtrl + Cで終了しましょう。
上手くいかないときは?
- 「ルータに繋がりません!」とネットワーク管理者に相談してみましょう。何はともあれルータに問題がありそうです。
3. ウェブにリーチ出来るか?
それでは、社内・家庭内ネットワークから外界に出ることが出来るか確かめてみましょう。以下のコマンドを打ってください。
$ ping 8.8.8.8
8.8.8.8はかのGoogleのDNSサーバを表しています。ここにリクエストを送ることで、Googleと自分のパソコンが交信できるかどうかを確かめます。
上手くいかないときは?
- 「外に出られません!」とネットワーク管理者に相談しましょう。とにかくルータより外側を疑えばいいことがわかります。
4. 名前を解決できているか?
先程もちょっと触れたように、すべてのパソコンは自身にIPアドレスを持ってネットワークにつながっています。GoogleやYahooのサーバも例外ではありません。実は私たちのパソコンは、Yahooなどのサイトに接続するとき、www.yahoo.co.jpというホスト名をIPアドレスという数字の列に変換して通信を行っているのです。そしてこの変換(「名前解決」と呼びます)を担っているのが、DNSサーバなのです。それでは、この名前解決が正しく行われているのかを確かめましょう。たとえばYahoo!のサイトのIPアドレスを確かめるには、以下のコマンドを打ちます。
$nslookup www.yahoo.co.jp
すると、こんな感じになりました。
なるほど、つまりYahoo!のIPアドレスは203.216.251.233だと。そこでアドレスバーにこのIPアドレスを入力してみると・・・
つながりました\(^^)/正しくYahoo!のIPアドレスを解決することが出来ました。
5. 相手のサーバが落ちていないか確かめる
最後に、相手のサーバがダウンしているか否かを確かめましょう。以下のコマンドを打ってください。
$ telnet www.yahoo.co.jp(または nslookupでとれたIPアドレス) 80
GET/HTTP/1.0
(2回Enter)
どうでしょう?Yahoo!のソースが帰ってきましたか?もしここでソースがとれたならば、繋ごうとしているサイトのサーバは正常に稼動しています。そのサイトは正常にブラウジングできます。おめでとうございます!
上手くいかないときは・・・
- 自分のファイヤウォールの設定がおかしい。
- セキュリティ関連で設定変更した点はありませんか?80番ポートが空いているか等、設定を見直しましょう。
- 相手のサーバがダウンしている。
- これに関しては復旧を待つしかありません。
お疲れさまでした
以上で全ステップ終了です。お疲れさまでした!
今回はパソコンからウェブまでの道のりを分解して、ひとつひとつチェックしてきました。
原因がどの段階に潜んでいるのかが分かるだけで、解決への効率が断然変わってきます。詳しいところは関連ワードを各自ググって対処してみてください。(飯塚 @tushuhei)