FC2ブログ

エラーの表示と入力の内容保持

エラーの表示と入力の内容保持

#08 エラーメッセージを表示しよう
http://dotinstall.com/lessons/contacts_php_v2/9808

を元に
エラー内容の表示と
入力内容の保持を実装

編集するのは index.php

HTMLのメールアドレスのところに
<?php if($error['email']) { echo h($error['email']); } ?>
を追記

また、内容のところにも
<?php if($error['memo']){ echo h($error['memo']); } ?>
とする

このままだと再入力になり面倒なので
入力内容の保持を実装

メールアドレスを 入力する input 要素の value を
value="<?php echo h($email); ?>"

として

内容を入力する textarea 要素も
<?php echo h($memo); ?>
とすれば
入力した内容が保持されるようになる
スポンサーサイト



テーマ : プログラミング
ジャンル : コンピュータ

投稿データのエラーチェック実装

投稿データのエラーチェック実装

#07 エラーチェックを行おう
http://dotinstall.com/lessons/contacts_php_v2/9807
を元に
投稿データのエラーチェックを実装

まず、index.php でセッションを使うので

session_start();
を追記

HTML部分に隠し要素として token を form に仕込んでおくため

<input type="hidden" name="token" value="<?php echo h($_SESSION['token']); ?>">

</form>
の前に書いておく

これで、 token 設定はできたので、
次に投稿後の処理を実装

まずPOSTで渡された数値を変数に格納
$name =$_POST['name'];
$email =$_POST['email'];
$memo =$_POST['memo'];

そして、次にエラーチェック
$error = array();
でエラーを入れる配列の準備

そして、エラー処理するけど、
もし、エラーがないのなら、DBに投稿内容を入れていく
if(empty($error)){
という条件式になる

エラー処理は、 if により複数のエラーチェックを行っていく
今回の条件式では
filter_var() を使い Email のチェックをする

filter_var() は
指定したフィルタでデータのフィルタリングを行う
http://php.net/manual/ja/function.filter-var.php
のマニュアルを参照

もし、Email の形式が正しくないのならという判定をするには
if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
とする

FILTER_VALIDATE_EMAIL
は、
値が e-mail 形式であるかどうかを検証する

この場合の処理として
$error['email'] ="メールアドレスの形式が正しくありません";
というようにして、
$error にエラー内容を格納する

また、メールアドレスが空欄なら
if($email ==''){
$error['email'] ="メールアドレスを入力してください";
}

メモが未記入場合の対処なら
if($memo ==''){
$error['memo'] ="内容を入力してください";
}

というようにして対処する

テーマ : プログラミング
ジャンル : コンピュータ

お問い合わせフォーラム作成

お問い合わせフォーラム作成

#05 お問合せフォームを作ろう
http://dotinstall.com/lessons/contacts_php_v2/9805

を参考に
投稿フォームを作成

編集するのは index.php

method="POST" action=""
というように
自ふぁいるに飛ばす

<form method="POST" action="">
<p>お名前; <input type="text" name="name" value=""></p>
<p>メールアドレス * :<input type="text" name="email" value=""></p>
<p>内容 * :
<textarea name="memo" cols="40" row="5"></textarea></p>
<p><input type="submit" value="送信"></p>
</form>

とする

そして、
#06 CSRF対策を施そう
http://dotinstall.com/lessons/contacts_php_v2/9806
を参考に
CSRF対策を施す

これはトークンチェック

PHP部分にソースを追加
if($_SERVER['REQUEST_METHOD'] !='POST'){
//投稿前の処理

//CSRF対策
setToken();

}else {
//投稿後の処理
checkToken();
}
という分岐になる

リクエストメソッドがPOSTか、そうでないかで分岐している

CSRF対策は
setToken()という function.php で作成するユーザ関数を使う

function setToken(){

//セッショントークンがセットされていないのならセット
if(!isset($_SESSION['token'])){
$_SESSION['token'] = sha1(uniqid(mt_rand(),true));
}
}


tokenが空、もしくはtoken の値が違うなら
エラーをだして終了
function checkToken(){
if(empty($_POST['token']) || $_POST['token'] != $_SESSION['token']){
echo "不正処理です";
exit;
}

テーマ : プログラミング
ジャンル : コンピュータ

ローカルPCの変更の自動的反映

ローカルPCの変更の自動的反映

rsync はファイルの変更差分だけデータ同期できる

差分だけ転送するから
ネットワーク経由のバックアップも可能

lsyncd は、Linuxカーネルの
inotifyというファイル変更のイベント通知機能を使い
ファイル更新を検出する

lsyncd から rsync を起動すれば
バックアップ用のミラーリングサーバー構築ができる

まず、
バックアップ用サーバーの設定

同期用ディレクトリの作成
sudo mkdir /data/

/dataを同期先ディレクトリへ設定するには
rsyncの設定ファイル
/erc/rsyncd.conf

source=""の設定をフルパスで指定

source="/home/snowpool/data/"
というようにする

次に、
rsyncがデフォルトデーモン、つまり常駐プロセスとして起動するように
設定

これは、
/etc/default/rsync
の中を
RSYNC_ENABLE=trueにする

そして、サービス起動
sudo /etc/init.d/rsync start

ここまでできたら、次はクライアントの設定をする

バックアップ元ディレクトリの作成
sudo mkdir ~/data

そしてlsyncdをインストール

sudo apt-get install lsyncd

lsyncdのサンプルファイルを元に設定ファイルの作成

sudo mkdir /erc/lsyncd

sudo cp /usr/share/doc/lsyncd/examples/lsyncd.1ua /erc/lsyncd/lsyncd.conf.1ua

コピーできたら設定ファイルの編集

hosts allow =
へアクセス可能にするpc のIPアドレスを記述
例えば
hosts allow = localhost 192.168.10.248

また、exclude =
へ同期対象にしない拡張子を記述

もし、subversionとかgitを非対象にするなら
exclude = .git .svn

ここまで設定ファイルできたら
クライアントマシンの
lsyncdを起動

sudo /etc/init.d/lsyncd start

ここまでできたら
適当に自動的反映できるディレクトリへ
ファイル作成

echo abcd > ~/data/abcd

これで、サーバー側にもデータ同期されているなら成功

関数ファイル作成とページのつくりこみ

関数ファイル作成とページのつくりこみ

#04 よく使う関数を登録しておこう
http://dotinstall.com/lessons/contacts_php_v2/9804
を元に
functions.php へ
ユーザ関数を作成していく

function connectDb(){
try{
return new POD(DSN,DB_USER,DB_PASSWORD);
}catch(PODException $e){
echo $e->getMessage();
exit;
}
}



try には、接続成功したときの処理

この catch 部分で例外発生したときに
エラーメッセージを表示する


try には、接続成功したときの処理

この catch 部分で例外発生したときに
エラーメッセージを表示する


htmlspecialchars() を略称で使うため
function h($s){
return htmlspecialchars($s,ENT_QUOTES,'UTF-8');
として UTF-8 文字コードを指定

これで保存して


次に、 index.php を作成して編集

ここで作成したファイルを
require_once() で読み込む

読み込むのは、
config.php
functions.php
になる

PHP部分の下にHTMLコードをつくってページをつくっていく

テーマ : プログラミング
ジャンル : コンピュータ

お問い合わせ管理システムの共有ファイル設定

お問い合わせ管理システムの共有ファイル設定

#03 アプリ共通の設定をしよう
http://dotinstall.com/lessons/contacts_php_v2/9803
を元に
共有するものを config.php にかいておいて
あとで require_once() で
必要なときに読み込むようにする

定数の設定は define()を使う

まずデータソースネーム
define('DSN','mysql:host=localhost;dbname=dotinstall_contacts_php');

次にDBユーザ
define('DB_USER','dbuser');

そしてDBパスワード
define('DB_PASSWORD','ddpk998Zacv');

そして、サイトのURL 今回はIPアドレス
define('SITE_URL','http://192.168.10.248/contacts_php/');

そして、管理画面
define('ADMIN',SITE_URL.'admin/');


エラー出力の設定は
error_reporting(E_ALL & ~E_NOTICE);
として、NOTICE以外を出力する

セッションの有効範囲が
session_set_cookie_params(0,'/contacts_php/');
として
contacts_php のみ有効になるようにする

テーマ : プログラミング
ジャンル : コンピュータ

お問い合わせ管理システムの作成

お問い合わせ管理システムの作成

必要な知識は

html
css
jquery

php
mysql

となる

contacts_php
が作業ディレクトリ

contacts_php/admin/
が管理画面になる

まず、DB作成

#02 データベースの設定をしよう
http://dotinstall.com/lessons/contacts_php_v2/9802
を元にDB作成

create database dotinstall_contacts_php;

grant all on dotinstall_contacts_php.* to dbuser@localhost identified by 'ddpk998Zacv';

use dotinstall_contacts_php;

エントリーテーブル作成
create table entries (
id int not null auto_increment primary key,
name varchar(255),
email varchar(255),
memo text,
created datetime,
modified datetime);

これらのSQLコマンドを
qa.sql
というようなSQLファイルにしておくと
他の環境でも簡単につくれるし
毎回コマンドをうたなくてもいいので効率的

sql ファイルができたら
mysql -u root -p < qa.sql
を実行して
mysql の root パスワードの入力することで
SQLが実行され、DBが作成される

mysql -u root -p
でログインして

use dotinstall_contacts_php;
desc entries;
で内要確認してできていることを確認

カラムの意味は

id int not null auto_increment primary key,
で主キー作成+自動連番


name varchar(255),
名前

email varchar(255),
メルアド

memo text,
メモ

画像掲示板に画像一覧を表示

画像掲示板に画像一覧を表示

#17 画像一覧を表示する (1)
http://dotinstall.com/lessons/upload_image_php/4517
を元に
配列に格納されたファイル名を元に画像を表示していく

編集するのは index.php

表示する画像は images[] の中に
サムネイル
元の大きさ
の画像が条件に基づき入っているので、あとは表示するだけ

表示は foreach() で表示する

<?php foreach($images as $image) ; ?>

そして、サムネイル画像だったときには
リンクをつけて、元画像が表示できるようにする

そして、サムネイル画像がないのなら、元画像を
そのまま表示する


サムネイル画像か、元画像かの判定には
strpos() を使う
http://php.net/manual/ja/function.strpos.php

$image の中から thumbnail という文字列を探し
位置が0文字目から始まる
つまり ===0 であるか判定する

注意点としては
strpos() は
対象文字列が見つからなかった場合に
false を返すため ==0 だと true になるので
0文字目という判定にしたいのなら
===0
とすること

なので、判定の条件式は
if(strpos($image, 'thumbnails/') === 0):
となる

そして、サムネイル画像だったときの処理で
元画像のリンクを作成するとき、その名前の表示には
basename() を使う

basename() はファイル名そのものの情報だけ引っ張ってくする
http://php.net/manual/ja/function.basename.php
を参照

<a href="/images/<?php echo basename($image); ?>">
<img src="<?php echo $image; ?>">
</a>
これでリンクを作成

元画像の表示については

<?php else : ?>
<img src="<?php echo $image; ?>">
<?php endif; ?>

となる

テーマ : プログラミング
ジャンル : コンピュータ

画像掲示板のデバッグ

画像掲示板のデバッグ

#14 デバッグをする
http://dotinstall.com/lessons/upload_image_php/4514
を参考に、サムネイル画像が保存できるようにデバッグ

まず、細かいエラーを表示するように、
config.php の
error_reporting(E_ALL & ~E_NOTICE);
をコメントアウト

index.php に戻ってしまうと、細かいエラーがでなくなるので
header()の処理の前に
exit;
を記述して、一度終了する

原因は、エラーコードをみながら修正していく

今回の動画の場合だと
imagecopyresampled() の
第1引数が、書き込むイメージのリソースでなかったこと
そして
書き込むディレクトリが
THUMBNAIL
ではなく
THUMBNAIL_DIR
だったことが原因だっと判明

エラーが特定できたら、
config.php のエラー表示を元に戻したいので
error_reporting(E_ALL & ~E_NOTICE);
のコメントアウトを外す

このように、一度詳細なエラーを表示して

どこかにとぶような処理の場合、その前に
一度 exit で終了して原因を追及するようにして
デバッグしていく

今回、うまく動作しなかったので、後で比較して理解するため
cp upload.php upload.php_error
として
保存し
http://dotinstall.com/lessons/upload_image_php/4513
のソースをコピペして
実行

そのときにいくつかエラーがでたので
そのメモ

Warning: imagecopyresampled() expects parameter 1 to be resource, double given in
これは
imagecopyresampled() の第1引数がリソースでないのが原因
$thumbHeight から
thumbImage にする

Notice: Use of undefined constant THUMBNAIL - assumed 'THUMBNAI

Warning: imagepng(): Unable to open 'THUMBNAIL/5190816f6d00cce6c8bb909ef954cc1840c50a0c.png' for writing: No such file or directory

これは
'THUMBNAI が見つからないとでているので

config.php で指定している
'THUMBNAI_DIR にする

また、
Warning: imagepng(): の原因は
config.php の
define('THUMBNAIL_DIR', dirname($_SERVER['SCRIPT_FILENAME']).'/thumbnails');
のスペルミスが原因だった

これらを修正すれば
サムネイル画像が保存されるようになる

CentOS へログインして
cd /var/www/html/upload_image_php
ll image/
で画像がアップロードされているのを確認し

ll thumbnails/
でサムネイル画像があるのを確認できれば
デバック完了

テーマ : プログラミング
ジャンル : コンピュータ

画像掲示板で縮小画像の保存

画像掲示板で縮小画像の保存

#13 縮小画像を保存する
http://dotinstall.com/lessons/upload_image_php/4513
を参考に、
縮小画像を保存フォルダに格納し、動作確認する

そのためには、まず画像形式を
switch() で識別する

switch($imagesize['mime']){
で判別し

case 'image/gif':

case 'image/jpeg'

case 'image/png'
ごとに分岐する

このときに使っている
imagegif()
http://manual.xwd.jp/function.imagegif.html

imagejpeg()
http://php.net/manual/ja/function.imagejpeg.php

imagejpeg()
http://php.net/manual/ja/function.imagepng.php
は、それぞれのファイル拡張子にあわせたものを使い
イメージをファイルに出力している

それぞれ、
第1引数に保存する画像
第2引数に保存するファイル名
を指定する

ソースにすると

gif なら

imagegif(
//対象ファイル
$thumbImage,
//保存先
THUMBNAIL . '/' . $imageFileName);

とする

最後に、index.php に戻すには
header() を使えばOK

header('Location :http://' .$_SERVER['SERVER_NAME'].'/upload_image_php');
とする

縮小画像の作成

縮小画像の作成

#12 縮小画像を作る (2)
http://dotinstall.com/lessons/upload_image_php/4512

を元に
元画像の縦横比率を保ったまま、縮小画像を生成

まず、サムネイル画像の高さを作る
縦横比をそのまま使う

$thumbheight = round($height * THUMNAIL /$width);

round() は浮動小数点をまとめる関数
http://php.net/manual/ja/function.round.php
を参考
小数点以下四捨五入と考えるとわかりやすい

これで、サイズ取得はできたので、次に画像作成

$thumbImage = imagecreatetuecolor(THUMBNAIL_WIDTH, $thumbnailheight);

imagecreatetruecolor() は
イメージを新規作成する関数
http://manual.xwd.jp/function.imagecreatetruecolor.html
に解説あり

imagecreatetruecolor() の引数には
横幅、高さを指定する

これらを使った事例としては
No29.大きさを変えようっ(サムネイル) ---- GDライブラリ[3]
http://masago.kir.jp/php20040218.php
をみると分かりやすい

imagecopyresampled()は
再サンプリングを行いイメージの一部をコピー、伸縮する

これは
http://phpspot.net/php/man/php/function.imagecopyresampled.html

を参考にする

今回は
imagecopyresampled(
$thumbnailheight,
$srcImage,
0,0,
0,0,
72,0,
$thumbnailheight,
$width,
$height
);

これを引数の解説つきにすると

imagecopyresampled(
//コピー先の画像
$thumbnailheight,

//コピー元の画像
$srcImage,

//コピー先のx、y座標
0,0,

//コピー元のx、y座標
0,0,

//コピー先の幅、
72,

//コピー先の高さ
$thumbnailheight,

//コピー元の幅
$width,

//コピー元の高さ
$height
);

となる

テーマ : プログラミング
ジャンル : コンピュータ

列セレクト、行セレクトの基本

列セレクト、行セレクトの基本

列のセレクトには
self コマンドを使う

今回使うのは
サンプルデータの
data01

使うスクリプトは shel01

self は、引数に対象となる列
最後に対象ファイル名を指定するだけ

data01 の中身をみたら
11111 22222 33333 44444 55555 66666 77777 88888
というのが30行並んでいる

で、self 2 5 8 data01
としたら、2列名、5列目、8列目
が表示された

最初、2ぎょうめ、5行目、8行目だと思っていたけど
間違いだったようだ

スペースで区切ると、列を指定して表示になる

次に、
self 3/8 data01
というように / で区切ると、
3~8行目の列を表示ということになる

self NF-5 NF data01
とすると
NFは最終列という意味なので
NF-5 なら最終列から5つ前の列
NFは最終列を表示
という意味になる

self 2.1.3 data01
だと、
2列目の
1文字目から
3文字
という意味になる


列をセレクトして表示する self 以外にも
列を削除して表示する delf がある

delf 3 data01
と実行すると
3列目以外が表示される

delf NF-3/NF data01
だと
NFは最終列なので
NF-3/NF
なら最後から4列目から最終列まで削除して表示
という意味になる

このように、列の表示なら
self
delf
というコマンドが便利

行を操作して表示するなら
head
tail
などのコマンドを使うことが多い

テーマ : Linux
ジャンル : コンピュータ

画像掲示板で縮小画像作成

画像掲示板で縮小画像作成

#11 縮小画像を作る (1)
http://dotinstall.com/lessons/upload_image_php/4511
を参考にサムネイル画像の作成を実装

まず、元画像の幅と高さを取得

$width = $imagesize[0];
$height = $imagesize[1];

縮小画像の作成は
ユーザ定数 THUMBNAIL_WIDTH と比較することで
判定して作成する

if($width > THUMBNAIL_WIDTH){
で比較できる

サムネイル画像をつくる手順は
元ファイルを画像タイプにより作成
新しいサイズを作成
縮小画像の作成
縮小画像を保存

という手順で行われる

元ファイルの画像タイプの判別は
switch の画像判定を使えばOK

switch($imagesize['mime']){
case 'image/gif':
$srcImage = imagecreatefromgif($imageFilePath);
break;

case 'image/jpeg':
$srcImage = imagecreatefromjpeg($imageFilePath);
break;

case 'image/png':
$srcImage = imagecreatefrompng($imageFilePath);
break;
}

とする

switch() の判定のところで使っている関数の

imagecreatefromgif()
http://phpspot.net/php/man/php/function.imagecreatefromgif.html

imagecreatefromjpeg()
http://phpspot.net/php/man/php/function.imagecreatefromjpeg.html

imagecreatefrompng()
http://manual.xwd.jp/function.imagecreatefrompng.html

は、画像タイプの自動判別に使える関数

テーマ : プログラミング
ジャンル : コンピュータ

画像掲示板のファイル保存

画像掲示板のファイル保存

#10 元画像を保存する
http://dotinstall.com/lessons/upload_image_php/4510
を参考に、画像掲示板に投稿するファイルの名前を決定し
一時保存された元ファイルを保存フォルダに格納する処理を実装

ファイル名は重複しないファイル名をつけていくので
乱数や暗号化を使うようにする

現在時刻を元にすれば、ほぼ重複しないので
$imagefilename = sha1(time().mt_rand()).$ext;
とする
$ext は switch で得た拡張子
time().mt_rand()は、現在時刻+乱数で
これを sha1() でハッシュしている

実行結果の動作確認のため
var_dump() を使う

var_dump($imagefilename);
で確認できたら、これはコメントアウト

これで、ファイル名はできたから
次に元画像の保存

これは添付ファイルをそこにコピーすればOK
$fileimagePath = IMAGES_DIR .'/'.$imagefilename;
とすればOK

IMAGES_DIR は cofig.php で決めたユーザ定数
PHPでは . で javascript の+みたいに文字列の連結ができる

これで、ファイルの保存パスもOK

次はファイルアップロード
アップロードには
move_upload_file() を使う
$rs = move_uploaded_file($_FILES['image']['tmp_name'],$fileimagePath);

アップロードが失敗することがあるので
そのときの処理を if で記述

if(!rs){
echo "could not upload !";
exit;
}
とする

ここまでできたら、動作確認

chmod 777 images/
でパーミッション変更

一度ファイルをアップロードして
images ディレクトリにファイルができれば成功

テーマ : プログラミング
ジャンル : コンピュータ

Open usb Tukubai

Open usb Tukubai

日経Linus を参考にシェルスクリプトの勉強です

今回は
Open usb Tukubai コマンドを使います


Open usb Tukubai に関しては
http://nlinux.jp/2013/08/article/
にアクセスし、
書籍に乗っているパスワードを入力することで
サンプルソースなどとともに
Open usb Tukubai
そして
ビジネス用の usb Tukubai がダウンロードできます

usb Tukubai に関しては
無料期間がきまっているため、今回は
Open usb Tukubai のみで行ってみます

まず、
tokukikaku_script/open-usp-tukubai-20130417.tar.bz2
をクリックして
Open usb Tukubai をダウンロード

cd ダウンロード
tar jxvf open-usp-tukubai-20130417.tar.bz2
で展開して
cd open-usp-tukubai-20130417/
sudo make install
でインストールできます

今回、インストールしたのは ubuntu 12/10 64bit

Open usb Tukubai はどのディストリビューションでも
うごくとのことなので、まずは Ubuntu で試してみました

また、サンプルが
tokukikaku_script/sample.tar.gz
にあるので、これを見ながら学習すると効率よく学ぶことができます



テーマ : Linux
ジャンル : コンピュータ

リソース状態推移のグラフ表示

リソース状態推移のグラフ表示

sysstat のデータをグラフ化してみることができるのが
isag

Ubuntu でインストールするには
sudo apt-get install isag

isag
で起動

起動したら
Data Source:
で見たいファイルを選択

次に、Chart から表示するシステム状況を選択

CPU Utilization を選ぶと
CPU使用状態をみることができる

いろいろとグラフ表示できるので
http://www.volny.cz/linux_monitor/isag/screens.html
のスクリーンショットも参考に

テーマ : Linux
ジャンル : コンピュータ

リソース状況の把握

リソース状況の把握

リソース不足を事前に検知することでトラブルを防止できる

リソースの使用率の推移を把握できているなら
ハードウェアの増設、交換も検討できる

このとき、抑えておくポイントは

リソース使用率の定期取得

リソース状態推移のグラフィカル表示

となる

リソース使用率の定期取得は
sysstat を使う
Ubuntu でのインストールは
sudo apt-get install sysstat

次に、定期取得設定
Ubuntu ではデフォルト設定で定期取得が無効なので
sudo vim /etc/default/sysstat

ENABLED="false"

ENABLED="true"
にして保存

sudo service sysstat start
で起動

定期取得された情報は
/var/log/sysstat/
に保存される

sa21
というように
sa日付
という形で保存されるのがバイナリーファイル

もうひとつsar日付というファイルが後でできるけど
こちらは、1日分のシステム状況をまとめた
テキストファイルになる

テキストファイルなので、エディタで確認可能

バイナリーファイルのほうは
sar コマンドに -r オプションをつければ確認できる

sar -f /var/log/sysstat/sa21
とすれば

Linux 3.5.0-36-generic (snowpool-Prime-Series) 2013年07月21日 _x86_64_ (8 CPU)

20時37分14秒 LINUX RESTART
というように内容をみれる

ファイル名を指定せず
sar -r
とすると
当日の情報が表示される

また、オプションで表示する時間の限定も可能

-s オプションで開始時刻
-e オプションで終了時刻
を指定可能

-u オプションを指定することで、
CPUリソース情報の取得もできる

CPUリソース取得のときに注意するべきは
その計算式
100 -(%idle + %iowait)
となる

各CPU情報の
(%user ~ %idle) は百分率の値で
合計すると100になる

そのうち $idle と %iowait

CPUが使用されていない時間の割合になる

このため、算出される値は、CPU使用率となる

この時間帯の平均使用率が低いなら
CPU負荷は少ないということになる

今回は
20:00~21:00のCPU使用率を見たいので

sar -u -f /var/log/sysstat/sa21 -s 20:00:00 -e 21:00:00

テーマ : Linux
ジャンル : コンピュータ

logwatch の定期レポート設定

logwatch の定期レポート設定

logwatch には
ユーザーに定期的にレポートを送信する機能がある

logwatch の定期レポートは
cron で実行されて
ユーザのメールボックスにおくられる

cron への登録は
apt-get でインストールしたときに自動で行われるので
これは設定する必要はない

この設定は
view /etc/cron.daily/00logwatch
で確認できる

ファイルの中の
#execute
/usr/sbin/logwatch --output mail
によって毎日メールがおくられてくる

この送られてくるレポートは、設定により
変えることができる

そのままの状態では設定ファイルがないので
sudo cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/
でファイルをコピーして

sudo vim /etc/logwatch/conf/logwatch.conf
でファイルを編集する

これは、情報がありすぎると逆にわかりにくくなってしまうから
Service のところに
- をつければレポート対象から除外できるようになる
除外方法の例については
http://vps.zok.jp/logwatch/
を参考にさせていただきました


TmpDir = /var/cache/logwatch
というように一時ファイルの置き場が指定してあるけど
元々は存在しないので
sudo mkdir /var/cache/logwatch
でディレクトリを作成

これで、設定ができたので
実行しようとしたけど
mail コマンドがなかったので
http://d.hatena.ne.jp/Fiore/20080227/1204110665
を参考に
sudo apt-get install mailutils
でインストール

which mail

/usr/bin/mail
となっていればOK

これで、ようやく実行可能
sudo logwatch --Output mail
sudo mail
とすると
"/var/mail/root": 4 messages 1 new 3 unread
U 1 Cron Daemon 日 7月 21 18: 29/1283 Cron
U 2 Cron Daemon 日 7月 21 19: 28/1258 Cron
U 3 Cron Daemon 日 7月 21 19: 28/1258 Cron
>N 4 logwatch@snowpool- 日 7月 21 19: 122/8506 Logwatch for snowpool-Pri
というように、メール一覧がでるので

Logwatch for
と書かれている4を入力

すると、メールになって送られたレポートを見ることができる

画面スクロールしたいのなら
スペースキーを押し
終了したいのなら q で終わらせることができる

テーマ : Linux
ジャンル : コンピュータ

log を整形して情報をまとめる logwatch

log を整形して情報をまとめる

Ubuntu の場合
log整形ツールの logwatch を使うことで
ログを集計し
結果を比較的見やすい状態に加工してレポートできる

また、期間
表示するレポートの種類指定も可能

期間と種類を指定すれば
トラブル時に必要な情報だけ絞り込んでレポートを表示できる

Ubuntu での インストールは
sudo apt-get install logwatch

途中でダイアログが出て、インストールするタイプを聞かれるので、今回はローカルのみを選択

まず、
sudo logwatch
を実行

デフォルトでは
logwatch は標準出力に、昨日のログを集計した
レポートを出力する

sudo ログのセクションをみると
sudo コマンドを使って root 権限で
どのコマンドを何回実行したのか確認できる

レポート作成期間、ログの種類の絞り込みは
logwatch のオプションを使う

レポート作成期間は、
--range オプションで指定
今日のログのレポートにするなら

sudo logwatch --range today

昨日のログレポートなら
sudo logwatch --range yesterday

2日前のログレポートなら
sudo logwatch --range '-2 days'
というように、-の後に何日前か指定

日付を指定するなら
sudo logwatch --range 2013/07/20
というように、直接指定でOK

取得できる全ての期間にしたいのなら
sudo logwatch --range all

3日前から今日まで、としたいのなら
sudo logwatch --range 'since -3 days'
というように、
since -遡りたい日数 days

詳細な日数などの指定については
sudo logwatch --range help
で確認できる

logwatch のレポートの見方に関しては
Logwatchのレポートの見方
http://ameblo.jp/itboy/entry-10051133432.html
を参考にさせていただきました

logwatch では、取得できるログの種類を
サービス単位で扱う

サービスの種類は
ll /usr/share/logwatch/scripts/services/
で確認可能

ここにあるファイル名がサービス名になる

logwatch で過去1週間の
pam_unix
sshd
のログレポートを表示するなら

logwatch --Service pam_unix --Service sshd --range 'since -7 days'

というようになる

テーマ : Linux
ジャンル : コンピュータ

有用なログをみつけるポイント

有用なログをみつけるポイント

まず、ログを絞り込むために使う情報は
ログの日時と出力元

トラブルあが発生した時間帯
問題のあるプログラム
ホストに検討がついているのなら、これらの情報で
ログを絞り込める

次に扱う情報が
ログのプライオリティ


プライオリティの種類は
debug
デバッグ情報

info
正常な状態で出力される情報

notice
正常だけど、重要な情報

warn
警告

err
エラー

crit
致命的エラー

alert
緊急に対応が必要なエラー

emerg
システムを使用不能

となる

err 以上のプライオリティのログの場合
トラブル原因に関係している可能性が高い
emerg > alert > crit > err >warn > notice > info > debug
という順番になり
一番深刻なのが
emerg

デフォルトでプライオリティが表示されるログファイル
そして
設定を変更してプライオリティを表示する設定にしたログファイルを使って、プライオリティで絞り込むことができる

そして、msg の情報からでも推測ができる

トラブルが発生している場合
msg の部分にもエラーメッセージが出力されることがある
error
fail(failure, faied) などのキーワードで
ログを絞り込むとエラー関連ログを絞り込みやすくなる

ログをキーワードで絞り込むには
エディタの機能を使うと便利

/ で検索してもいいけど
view コマンドでなら
:g/キーワード/
とすることで
キーワードに一致する行だけを表示することができる

もし、error というメッセージがある行だけを表示したいのなら
view /var/log/auth.log
で開いている場合、
:g/error/
とすれば、 error のある行だけ表示されるので見やすくなる
たくさんある場合、qを押すと元の画面に戻れる

テーマ : Linux
ジャンル : コンピュータ

ログの種類と書式について

ログの種類と書式について

トラブル発生時にログから情報を取得する手助けになるのは

ログファイルの種類

ログの書式変更

ログファイルから有用なログをみつけるポイント

これらを把握していることがより効率的な原因究明につながる

まず、ログファイルの種類

linux では、ログは
/var/log の下に出力される

Ubuntu なら
/var/log/
の下にたくさんあるので
ls /var/log/
で調べると、どんなファイルがあるのか確認できる

種類がたくさんあるので、その中の一部を紹介すると

syslog
システムの動作状態に関するログ

dmesg
カーネルのメッセージバッファのログ
OS起動時、動作時のカーネルメッセージが出力される

auth.log
認証関係のログ

boot.log
OS起動時のサービスメッセージのログ

dpkg.log
パッケージマネジャーの dpkg のログ

apt
パッケージ管理ツールのAPT のログが出力されるディレクトリ

wtmp
ユーザのログイン履歴ログ
who コマンドを使って開く

lastlog
ユーザが最後にログインした日時のログ
lastlogコマンドで確認

この中で、トラブル遭遇時に確認することが多いのが
syslog

ログを確認する時に注意することは
書き込み権限のあるユーザの場合なら
viewコマンド
http://www.linuxlic.com/command/view.html
とか
tail
less
などのコマンドを使い、読み込み専用で開くこと

これは、間違えてログの変更や削除をしてしまわないため

今回は
view コマンドで 認証関連ログファイル auth.log をみる
view /var/log/auth.log
で内容を確認


このときに出てくる書式が
ログ管理デーモンになるrsyslog の
RSYSLOG_TraditionalFileFormat
という書式

これは、
/etc/syslog.conf で

$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

と定義されている

syslog 形式のログは
TIMESTAMP
HOSTNAME
といった、いくつかのプロパティから構成される

例えば view /var/log/auth.log
で見てみると
Jul 21 10:17:01 snowpool-Prime-Series CRON[5106]: pam_unix(cron:session): session closed for user root
というログがあり

Jul 21 10:17:01
の部分がTIMESTAMPで
ログが出力された日時

snowpool-Prime-Series

HOSTNAMEで、ホスト名

CRON[5106]:

syslogtag で、ログメッセージの出力元
プログラム名の表示
今回なら、
プロセスID 5106 の cronデーモンがログを出力している

pam_unix(cron:session): session closed for user root
はmsg で、ログの内容になる

テーマ : Linux
ジャンル : コンピュータ

ファイル拡張子の取得

ファイル拡張子の取得

#09 ファイルの拡張子を取得する
http://dotinstall.com/lessons/upload_image_php/4509
を元に、投稿されたファイルの情報を取得して
拡張子を設定する

今回は、保存するファイル名を決めておく
これは、アップロードされたファイルの名前をそのまま使うと被ることもあるので、面倒になるから

最初に、拡張子を決め、名前をつけていく
拡張子をつけるのは、ほぼ決まり文句で

$imagesize = agetimagesize($_FILES['image']['tmp_name']);
これで、様々な情報が取得され
変数 $imagesize に格納される

中身を確認するには
var_dump() で
var_dump($imagesize);
で見ることができる

これにより、アップロードしたファイルの
縦横の幅
ファイルの種類などが解析される

これを使って、拡張子を決めていく
いろいろなファイルの拡張子があるので、
ここでは switch による分岐を行う

取得して比較する値は
["mime"]=>
string(9) "image/png"
というように
mime というところ

今回、対応拡張子は
gif
jpg
png
のみにする

コードは
switch($imagesize['mime']){
case 'image/gif':
$ext='.gif';
break;

case 'image/jpg':
$ext ='.jpg';
break;

case 'image/png':
$ext ='.png';
break;

default:
echo gif/jpg/png only !";
exit;
}

テーマ : プログラミング
ジャンル : コンピュータ

投稿ファイルのエラーチェック

投稿ファイルのエラーチェック

#08 エラーチェックを行う
http://dotinstall.com/lessons/upload_image_php/4508
を参考に、投稿されたファイルにエラーがないかチェックする

編集するファイルは、upload.php

ファイルの中にある error というフィールドがあり
この中にいろいろな値が入っているので
これを使ってエラーチェックする

条件式は if でつくる

if($_FILES['image']['error'] != UPLOAD_ERR_OK){
echo "エラーが発生しました";
exit;
}

とする

UPLOAD_ERR_OK
については
http://jp.php.net/manual/ja/features.file-upload.errors.php
に乗っているように
値は0で、エラーがなく、アップロード成功という意味

なので、 if の中で != となっているので error の値が0でない、つまりアップロード失敗したら、
echo でエラーメッセージを表示している

次に、ファイルサイズのチェック
ファイルサイズを調べるには
添付ファイルのサイズを調べる
$size =filesize($_FILES['image']['tmp_name']);
で、一時ファイルの大きさを調べて格納

これを if で判定する
これで、ファイルサイズが0 !size
もしくは
ファイルサイズが MAX_FILE_SIZE を
超える場合にはエラーを echo で表示する

if'!isze || $size > MAX_FILE_SIZE){
echo "ファイルサイズが大きすぎます";
exit;
}
とする

これで、大きいサイズのファイルをアップロードするとエラーが発生する

テーマ : プログラミング
ジャンル : コンピュータ

cron + async で定期差分バックアップ

cron + async で定期差分バックアップ

バックアップを毎日取得し
過去1週間分を保存する

対象とするのは設定ファイルとかコンテンツ

これらを毎日バックアップして
過去1週間分保存する

まずはわかりやすくコマンドで実行
rsync はフルパスにしてみた

実行環境は ubuntu12.10 64bit

sudo /usr/bin/rsync -a /var/www/ /backup/www-`/bin/date +%Y%m%d`
これを実行すると

/var/www/以下の内容が
/backup/www-バックアップした時の日付
という形式でバックアップされる

今回なら
www-20130720
となっている
このディレクトリの中には、
/var/www/ 以下のディレクトリがすべてコピーされている
`/bin/date +%Y%m%d`
は、バッククォートでかこっているため
実行結果を端末で入力したコマンドに渡すことができる
バッククォートの入力は
shift + @


これを cron で設定しておけば、バックアップが自動で行われる
大抵の例文だと深夜などにおこなうけど
ずっとパソコンをつけておけないという場合
食事やお風呂などの時間帯にしておくという方法もある

例えば、。
10 4 * * *
としてあると
毎日朝の4時10分にバックアップするけど

10 19 * * *
として夕方の7時ぐらいにバックアップという方法もある


また
バックアップを毎日取っていると、どんどんHDDやSSDの容量を使っていくので
必要に応じて削除することも必要

例えば、
sudo /usr/bin/find /backup/ -name www-* -mtime +6 -print0 | /usr/bin/xargs -0 /bin/rm -rf
とすると、古いファイルが消えるらしいけど
なぜか先ほどバックアップしたファイルも削除されていた

find コマンドのオプションに関しては
http://www.nxmnpg.com/ja/1/find

findコマンドを利用した便利なUNIXテクニック例
として
http://uguisu.skr.jp/Windows/find_xargs.html

があるので、このあたりをもう少し調べてみようと思います

テーマ : Linux
ジャンル : コンピュータ

ArrayListは、じぇねりくす

ArrayListは、じぇねりくす
これは色々な要素を格納できる

ArrayListにといように
<>で囲んでクラスを指定することで
Stringクラスだけが入るように限定できる

このジェネリクスを使うことで
想定外のデータが入ることを避けることができる

また、<>でクラス指定していないと
値を取り出すときに
キャストという型変換が必要になるので
面倒になる



--
から送られてきた高速メモ帳

cron を使った差分バックアップ

cron を使った差分バックアップ

cron と rsync を使って定期的に差分バックアップをとっていく

今回はテストなので
sudo mkdir /backup/
sudo mkdir /backup/snowpool
でバックアップディレクトリを作成して

/etc/cron.d/
の下に
vim /etc/cron.d/backup
でバックアップファイルを作成

10 2 * * * root /usr/bin/rsync -a /home/snowpool/ /backup/snowpool/
とすることで、
午前2時10分に自動的バックアップが取れるようになります

sudo chmod +x /etc/cron.d/backup
で実行権限もつけておきました

テーマ : Linux
ジャンル : コンピュータ

外付けHDDへバックアップ

外付けHDDへバックアップ

バックアップの考え方
コマンドでのバックアップ方法
継続的バックアップの設定

バックアップ対象となるのは
再作成が困難なデータ

/home以下のユーザーデータ
保存している写真や動画
OS やアプリの設定データなど

設定ファイルは再度設定でもどうにかなるけど面倒なためバックアップしたほうが無難 

バックアップの一般的な条件は
容量が十分あり、容量あたりの単価が安いこと 
バックアップに必要な時間が短くてすむもの
となる

たいていの場合、HDDになるけど
別のHDD
もしくは、外付けHDDになる

同じHDDへ保存してしまうと
メディア障害時にデータの復元ができないので
別のメディアへバックアップするのがベター

バックアップを取得する頻度、時間として
一般的なのは
ユーザーがシステムを利用しない夜間に
1日1回程度取得する

本来ならニーズにより、適切な方法でバックアップするけど
特にニーズがないなら
最新データのバックアップを毎回取得するようにする

コマンドからバックアップするので
今回は、rsync を使う

rsyncは、Linuxでよく使われるバックアップツール

rsyncは
前回のバックアップからの差分のみ複製したり
リモートホストへ複製することができる

外付けHDDは、以前Linux 用に
Linux での外付けHDD
http://heberekemaruhunihun.blog77.fc2.com/blog-entry-433.html
で用意してあるのでこれを使うことに

本来、日経Linux の記事を参考に行う予定だったけど
外付けHDDが /dev/sdb ではなく
/media/outhdd
となっているので

ubuntu:rsyncとcronを使って自動バックアップさせてみる。
http://tukaikta.blog135.fc2.com/blog-entry-33.html
を参考に
rsync で外付けHDDにバックアップ

全部ではファイルが多いし、バックアップの実験だけでよいので
今回は、ダウンロードしたファイルのみバックアップ

実験環境は Ubuntu 11.10 32bit
実行する時にsudo つけないとパーミッションエラーになるので注意

mkdir /media/outhdd/snowpool

sudo rsync -av /home/snowpool/ダウンロード/ /media/outhdd/snowpool
でバックアップ

これで、
/media/outhdd/snowpool
の中に
ダウンロードというディレクトリができて
中身がバックアップされている

そして、今度は新たに
touch rsynctest というファイルを
/home/snowpool/ダウンロード
で作成して


sudo rsync -av /home/snowpool/ダウンロード/ /media/outhdd/snowpool
を実行すると
あたらしく作った rsynctest というファイルだけが
バックアップされている

この rsync をつかうことで簡単に差分バックアップができる

画像掲示板のアップロード処理

画像掲示板のアップロード処理

#06 アップロード処理の流れを確認する
http://dotinstall.com/lessons/upload_image_php/4506
を元に、アップロード処理をする upload.php をつくり
実装していく
この動画では、実際のコードをかくよりも流れの解説

まず、require_once('confg.php');
で設定ファイルの読み込み

そこから先の流れとしては
エラーチェック
保存するファイル名を作成
元画像を保存し、画像が大きいなら、縮小画像をつくり保存
そして、index.php へ飛ばすという流れ

アップロードされたファイルのあつかい方については
#07 $_FILESの中身を確認する
http://dotinstall.com/lessons/upload_image_php/4507
を参照

いままでのように、通常のフォームから
画像や入力内容を扱うなら
$_POST['image']
というようにしていたけど

ファイルの場合では異なり
$_FILES[' 変数名'];
となる

この変数名は、form で送信したときの name の名前になる
例えば、
<input type="file" name="image">
なら、
$_FILES['image']
となる

アップロードされたファイルには
色々な情報が格納されていて
確認したいのなら、
var_dump() で中身を見てみるとわかりやすい

ソースにすると
var_dump($_FILES['image']);
exit;

として
index.php でファイルをアップロードしてみると
渡されたデータがみれる

そのままだと見にくいので
ブラウザでソースを表示するとわかりやすくなる
やりかたは、ブラウザで
右クリック > ページのソースを表示

name には元画像の名前

type には何のファイルか

tmp_name は
システムが一時的に保存したファイルの名前
これは後で保存先フォルダへ入れることになる

error は
エラーチェックに必要な情報が入ってくる
ちなみに、0だったら正常ということ

size は、ファイルのサイズ

エラーコードに関しては
http://jp.php.net/manual/ja/features.file-upload.errors.php
を参考にする

テーマ : プログラミング
ジャンル : コンピュータ

Linuxコマンドの定期自動実行

Linuxコマンドの定期自動実行

Linuxの管理ツールの多くは
自動実行機能の
cron
を使っている

cronを、使うときのポイントは

設定ファイルとディレクトリの構成
定期実行するコマンドのcronへの登録

cron によるコマンドや
スクリプトの定期自動実行の設定は
/etc
の下にある

cron,hourly
は毎時

cron.daily
は毎日

cron.weekly
は毎週

cron.montly
は毎月
というように指定したディレクトリごとにより自動実行される

管理ツールがインストール時に
スケジュール実行するスクリプトを配置するのも
これらのディレクトリになる

毎時実行するスクリプトは
/etc/crontab
の設定で起動される

/etc/cron.d は
/etc/crontab
と同じ書式の設定ファイルを配置するディレクトリ

コマンドやスクリプトの実行条件の詳細設定をするには
/etc/cron.d/
の下に設定ファイルを作成することになる

cronの書式は
分 時 日 月 曜日 実行ユーザ名 コマンド
という書式になる

分 時 日 月 曜日
については
分 0-59
時 0-23
日 1-31
月 1-12
曜日 0-7で7が日曜日
となる

数値ではなく * にするとすべてという意味になる
例えば
分のところを * にすれば、毎分という設定になる

あと、気をつけるべきなのがコマンドの設定
cron の環境変数はユーザシェルとは違うので
コマンドはフルパスで書くようにする

もし、NTPサーバーに10分おきに同期するなら
10 * * * * root /usr/sbin/ntpdate NTPサーバー
となる

テーマ : Linux
ジャンル : コンピュータ

画像投稿フォームの作成

画像投稿フォームの作成

#05 画像投稿フォームを作ろう
http://dotinstall.com/lessons/upload_image_php/4505
を元に index.php を作って
画像アップロードするためのフォームを作成する

vim index.php でファイルを作成し編集していく

require_once('config.php');
で設定ファイルを読み込み

HTMLソース部分でフォームを作成していく

フォームについては
画像をアップロードするには決まりがあり

<form action="" method="POST" enctype="multipart/form-data">
というように
enctype="multipart/form-data"
をつけるのを忘れずに

また、隠し要素として
input type="hidden" にして
<input type="hidden" name="MAX_FILE_SIZE" value="<?php echo MAX_FILE_SIZE;
?>">
として、最大投稿サイズを決めておく

このMAX_FILE_SIZE は
config.php で設定した値

これができたら、後は
画像選択ボタンと
アップロードのための送信ボタンを作成

画像選択ボタンが
<input type="file" name="image">

送信ボタンが
<input type="submit" name="アップロード">
となる

ここまでできたら、一度保存して
index.php を開いてみる

画面が作成できているのを確認できたら、
現在 action="" で index.php が対象になっているのを
action="upload.php" へ変更して

このファイルで処理するようにする
~

テーマ : プログラミング
ジャンル : コンピュータ

最新記事
検索フォーム
GREEハコニワ攻略サイト
リンク
カテゴリ
月別アーカイブ
フリーエリア
最新記事
FXプライムレート
最新コメント
最新トラックバック