2011年10月24日の日記
と、いっても下の写真は2011年10月21日の寒かった日の写真。今日は暖かいです。私の部屋は軽くクーラーが必要です。
寒くなるととたんに猫が私をホットカーペットがわりにするために乗っかってきてうっとおしいので猫を引き離すために電気ストーブをつけました。計画通り猫はストーブの前に釘付けになりましたw。
あーあったけー。
おしりを温め中。
このリラックスぶり。
携帯電話のカップリング機能というのを使って撮って見ました。使ったことがなかったので試しに。フレームもつけてみました。このフレーム機能カップリング機能の時しか使えないみたいなのがなんだかなーと思いました。W43CAです。年末あたりにスマホにしたいです。
パソコン弄ってるとすぐ邪魔をしにきます。
凛々しいなー。
何かを覗いています。タマタマが丸出しです。人間の男のタマタマなんか触りたいともおもいませんが、猫のタマタマ(ねこのふぐり)は毛むくじゃらで可愛らしくて触りたくなる不思議。
水色のメッシュでできた夏用ベッドの下の本棚の本をどけて普通のベッドを設置して段ボールで暗がりにしてあげました。ここによく潜り込んで寝ています。
みたなー。
ちょっとアンニュイな感じで監視中。
本気で寝る時はこっちにおしりを向けて潜り込んでいます。
ローリングかまってよー
浅草の駅の方まで行ってきました。
新仲見世通りを歩いているとアーケードの切れ間からスカイツリーが見えました。てっぺんの方が雲で隠れています。
東武鉄道の浅草駅のところでチラシ配りのおねーさんからもらったコンタクト屋さんのチラシです。うまい棒がついてました。ラッキー。帰りにまたもらおうと思ってたのに忘れましたw。
駅近くのリンガーハットで長崎ちゃんぽんと餃子のセットを食べました。美味しかったです。
ダイソーで色々お買い物しました。
- コインランドリーで使おうと思って買った洗剤(12回分)
- セロテープ5個セット
- ステンレス取付金具2個入り×2個
- 耳栓2セット
- ネジセット
- 歯ブラシ2本セット
- パインジュース
- 洗濯クズとり網
買ってきたステンレス金具で自作のキャットウォークを補強しました。真ん中の色違いの部分が補強した部分です。
なんという適当な施工でしょう。まあ用をなしているのでいいです。
上下左右補強しました。
大体床から2メートル強の高さの所にあるのですが最近猫も大きくなったのと、ものすごいスピードでこの上を行き来して4本の木をつなぎとめている釘が抜けてきたので補強してみました。横の補強はネジ穴が4つあるタイプの物を買ってこないと意味がなかったなーとちょっと後悔してます。
このキャットウォーク適当な幅の板が売ってなかったので4本の棒を又釘というか絶縁ステップルで無理やり板状につないで作ったものなので元々かなり強度に不安がある出来です。
猫だけならまだしも洋服掛けにしてしまう人が居るためにだいぶつなぎ目が弱ってきてましたw。
釘の参考画像
絶縁ステップル
あと買ってきた洗剤をと洗濯くず取り網と猫のベット3つとケージの中に敷いているひざ掛けっぽいものをもってコインランドリーで洗濯してきました。
[Perlメモ]PHPで書いた掲示板をMojolicious::Liteで書いてみる
この間PHPで書いた掲示板みたいなものをMojolicious::Liteで書いて見ました。
[PHPメモ]PHP覚えたので掲示板作ってみた – KUMA TYPE
PHPで書いたソースとほぼ同じような感じです。こっちはデータベースファイルもなければ自動で作成するようになってます。
ソース bbs.pl
#!/usr/bin/env perl
package Model;
use strict;
use ORLite {
file => ‘bbs2.db’,
create => sub {
my $dbh = shift;
$dbh->do(
‘CREATE TABLE bbs (
no INTEGER NOT NULL PRIMARY KEY,
pno INTEGER,
name VARCHAR(128),
title VARCHAR(128),
comment VARCHAR(2000) NOT NULL,
hp VARCHAR(256),
email VARCHAR(128),
ip VARCHAR(40) NOT NULL DEFAULT "",
timestamp TIMESTAMP NOT NULL
)’
);
# just use $dbh->do(…) if you need more
# tables
return 1;
}
};
package main;
use utf8;
use Mojolicious::Lite;
my $cur_page = 1;
my $entry_per_page = 5;
my $cur_page = 1;
my $start_point = 0;
#get ‘/’ => ‘index’;
#get ‘/’ => sub {
# my $self = shift;
# $self->render(‘index’);
#};
get ‘/’ => sub {
my $self = shift;
#総記事数取得
my $total_entrys = Model::Bbs->count;
#ページ指定あり
if(defined $self->param(‘page’)){
$cur_page = sprintf("%d",$self->param(‘page’));
$cur_page = 1 if($cur_page < 1);
$start_point = ($cur_page – 1) * $entry_per_page;
}
$self->stash(
cur_page => $cur_page,
entry_per_page => $entry_per_page,
total_entrys => $total_entrys,
bbs => [Model::Bbs->select(‘order by no desc limit ?,?’,$start_point,$entry_per_page)]
);
} => ‘index’;
post ‘/’ => sub {
my $self = shift;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
my $now = sprintf("%04d-%02d-%02d %02d:%02d:%02d",$year+1900,$mon+1,$mday,$hour,$min,$sec);
Model::Bbs->create(
name => $self->param(‘name’),
comment => $self->param(‘comment’),
ip => ‘0.0.0.0’,
timestamp => $now
);
$self->redirect_to(‘/’);
};
app->start;
__DATA__
@@ index.html.ep
% use Encode qw/decode_utf8/;
% layout ‘default’;
<div id="header">
<h1>掲示板</h1>
</div>
<div id="body">
<form name="form1" method="post" action="">
<p>名前 :
<input type="text" name="name" id="name" maxlength="128">
</p>
<p> 本文:<br>
<textarea name="comment" cols="50" rows="6" id="comment"></textarea>
</p>
<p>
<input type="submit" name="submit" value="送信" id="submit">
</p>
</form>
<p>
総記事数:<%= $total_entrys %> 件
</p>
% foreach my $oneline(@{$bbs}){
<div class="entrys">
<p class="entry_header">
<%= sprintf("[%05d] %s %s さん",decode_utf8($oneline->no),decode_utf8($oneline->timestamp),decode_utf8($oneline->name)) %>
</p>
<p class="entry_body">
<%= decode_utf8($oneline->comment) %>
</p>
</div>
% }
<p class="page">
% if ($cur_page > 1) {
<a href="?page=<%= ($cur_page-1) %>">[next]</a>
% }else{
[next]
% }
% if ($total_entrys > ($cur_page * $entry_per_page)){
<a href="?page=<%= ($cur_page+1) %>">[prev]</a>
% }else{
[prev]
% }
</p>
</div>
@@ layouts/default.html.ep
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="content-style-type" content="text/css">
<meta http-equiv="content-script-type" content="text/javascript">
<meta name="description" content="掲示板">
<meta name="keywords" content="掲示板">
<title>掲示板</title>
<link rel="stylesheet" type="text/css" href="css/bbs.css">
</head>
<body>
<%= content %>
<div id="footer">2011 KUMA TYPE</div>
</body>
</html>
参考
- ORLite – search.cpan.org
- Mojolicious::LiteでData::Modelを使ってみた – 日曜プログラマのそゞろ事
- Working with ORLite inside Mojolicious – GitHub
メモ
[kumacchi@localhost bbs]$ mojo generate lite_app bbs.pl
[exist] /home/kumacchi/mojo/bbs
[write] /home/kumacchi/mojo/bbs/bbs.pl
[chmod] bbs.pl 744
[kumacchi@localhost bbs]$
perl -MCPAN -e shell
cpan[2]> install ORLite
久しぶりに電車に乗ったらみんな普通にスマホを使っていた件
いやー久しぶりに電車に乗ったらみんな普通にスマホ使っててビビりました。私の隣に座った女性はGLAXY TABらしきものを触ってたし、向かいの席の女性も何らかのスマホを一生懸命弄ってた。他にも女性がガラゲーを弄っていたのですが、それを見たときに思ったことはガラゲー使っている人が何となくダサく見えてしまう事でした。これって私だけでしょうか?多分そういうわけでスマホが急速に普及した理由が便利だという理由以外にもガラゲーがださいと感じるようになってしまったことも一因としてあるのではないかと思います。ガラゲーもガラゲーだとばれない形のガラゲーが出来れば生き残れるかも知れませんねw。逆にガラゲーみたい形のスマホをどこかが出してたと思いますが、電車の中で向かい側に座った人に(あの人今時ガラゲーとか使ってるワロス)とか思われているかも知れませんねw。
久しぶりにドトールとか行ったりしたんですが、そこでもスマホを使ってる人が沢山いました。時代も変わったなーとおじさんは思ったのでした。
私も元々モバイルは大好きで昔(1997年前後)良くモスでペルソナやザウルスに携帯電話つないでメールチェックとかして白い目で見られていたのにみんながそういう事を当たり前に普通に出来る便利な世の中になったものだなーとノスタルジックな気分に。
HITACHI ハンドヘルドPC「PERSONA(ペルソナ)」
ペルソナは日立製のWindows CEマシンでWindows系OSのイ ンターフェース。違いはOSがROMに入っているので電源ONで一瞬で使えるのが特徴。1999年前後に10万強で購入。
ZAULUS(ザウルス)
ザウルスはシャープ製のPDAでFAXの送信なんかも出来たりするしパソコン通信の端末にもなったりした。ニンテンドーDSみたいにペン入力で手書きメモを書いたり手書きの文字認識が出来たりする優れものでした。高かったけど。スケジュール管理が良く出来てた。
私が持っていたのはPI-7000(1996年発売)
Addin機能があってパソコンにつないでソフトや機能転送して追加したりできました。Addin開発ソフトが別売で売ってたので買って色々弄ったけど特に作りたいものがなかったので適当に弄っただけで結局なにも作らなかった。赤外線の制御がもっと細かくできたら万能赤外線リモコンでもつくろうと思ったけどそこまで細かく制御出来なかった。(と思う。)
シャープさんはGALAPAGOSで大爆死してしまったみたいですけど、こんな事ならザウルスを作り続けてたらよかったのにね。ガラパゴスもザウルスも似たようなネーミングセンスだけどw。
で、オチですが、、、もちろん私は今現在ガラゲーを使ってます。なんとなくポケットから出すのが恥ずかしくなりましたw。
今月末から働くことになったので再来月あたりスマホにするかも。
参考資料
光る画面の製作
[PHPメモ]PHP覚えたので掲示板作ってみた
2009年11月に楽天ブックスで上記の「はじめてのPHPプログラミング(基本編)(ISBN:9784798020822)」を購入してずっと机の片隅で眠ってましたが最近一念発起してちまちま読んで10日ほどで一応読破しました。
感想としてはPHPはよく言われているようにC言語に近い文法でそれにperlの様な文字列操作方法を搭載した感じのわかりやすい言語だなと思いました。あとWEBアプリ作るのに色々捗る感じになってるなーと思いました。perlだと必要な手続き端折れたり、sqlite2フォーマットのdbを使う分には何のライブラリも必要なかったりと慣れた人ならちょっとしたWEBアプリケーションをチョチョイのチョイで作れそうです。
$i = (int)$value;
みたいな感じでキャスト出来るのがC言語っぽくていいですね。なにか懐かしい気持ちになりましたw。
PHPには500以上の便利な関数があるそうで、全部覚えることは不可能ですがどんな関数があるのかを暇な時にでもひと通りPHPサイトのリファレンスでも眺めておけばいざというときに捗るかも知れません。
まあそういうわけで上記の書籍を参考に簡単な掲示板など作ってみました。
こんな感じです。
実際の動作サンプル(今のところ一応書き込めるようにしています。)
掲示板
一応ソースコードも公開しておきます。(セキュリティー的にまずい所があったら識者の方ツッコミお願いします。)
ソースコード:index.php
<?php
//
// BBS
//
// 2011.10.11
// ・新規作成
//
//
$entry_per_page = 5;
$cur_page = 1;
$start_point = 0;
$dbf = "../../../dbs/bbs/bbs.db";
$dbh = sqlite_open($dbf,0666,$error);
if($dbh === false){
die($error);
}
if($_SERVER["REQUEST_METHOD"] === "POST"){
if(!isset($_POST["comment"]) || strlen(trim($_POST["comment"])) === 0){
}else{
$sql = "BEGIN ";
$resul = sqlite_exec($dbh,$sql);
if(result === false){
die("BEGIN 失敗");
}
$name = trim($_POST["name"]);
$comment = trim($_POST["comment"]);
$now = getdate();
$nowstr = sprintf("%04d-%02d-%02d %02d:%02d:%02d",$now[year],$now[mon],$now[mday],$now[hours],$now[minutes],$now[seconds]);
# $sql = "INSERT INTO bbs (name,comment,ip,timestamp) VALUES(‘{$name}’,'{$comment}’,’0,0,0,0′,’2011-10-11 01:01:01′)";
$sql = "INSERT INTO bbs (name,comment,ip,timestamp) VALUES(?,?,?,?)";
$sql = dbEscape($sql,array($name,$comment,’0,0,0,0′,$nowstr));
$result = sqlite_exec($dbh,$sql);
if($result === false){
$sql = "ROLLBACK ";
$result = sqlite_exec($dbh,$sql);
if($result === false){
die("ROLLBACK 失敗");
}
}
$sql = "COMMIT ";
$result = sqlite_exec($dbh,$sql);
if($result === false){
die("COMMIT 失敗");
}
header("Location: index.php");
exit(0);
}
}
#総記事数取得
$sql = "SELECT COUNT(*) FROM bbs";
$result = sqlite_query($dbh,$sql);
$total_entrys = (int)sqlite_fetch_single($result);
//ページ指定なし
if(!isset($_GET["page"]) || strlen(trim($_GET["page"])) === 0){
}
//ページ指定あり
else{
$cur_page = (int)sprintf("%d",$_GET["page"]);
if($cur_page < 1){
$cur_page = 1;
}
$start_point = ($cur_page – 1) * $entry_per_page;
}
//記事取得
$sql = "SELECT * FROM ‘bbs’ ORDER BY no DESC LIMIT ?,?";
$sql = dbEscape($sql,array($start_point,$entry_per_page));
$result = sqlite_query($dbh,$sql);
$list = array();
while($row = sqlite_fetch_array($result,SQLITE_ASSOC)){
$list[] = $row;
}
//
// プレースホルダ的な関数
//
function dbEscape($sql,array $params){
foreach($params as $param){
switch(gettype($param)){
case "integer":
case "double":
$replacement = $param;
break;
case "string":
$replacement = sprintf("’%s’",sqlite_escape_string($param));
break;
default:
die("params error = $param");
}
$sql = substr_replace($sql, $replacement,strpos($sql,"?"),1);
}
return $sql;
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="content-style-type" content="text/css">
<meta http-equiv="content-script-type" content="text/javascript">
<meta name="description" content="掲示板">
<meta name="keywords" content="掲示板">
<title>掲示板</title>
<link rel="stylesheet" type="text/css" href="css/bbs.css">
</head>
<body>
<div id="header">
<h1>掲示板</h1>
</div>
<div id="body">
<form name="form1" method="post" action="">
<p>名前 :
<input type="text" name="name" id="name" maxlength="128">
</p>
<p> 本文:<br>
<textarea name="comment" cols="50" rows="6" id="comment"></textarea>
</p>
<p>
<input type="submit" name="submit" value="送信" id="submit">
</p>
</form>
<p>
総記事数:<?php echo $total_entrys ?> 件
</p>
<?php foreach($list as $oneline): ?>
<div class="entrys">
<p class="entry_header">
<?php echo htmlspecialchars(sprintf("[%05d] %s %s さん",$oneline["no"],$oneline["timestamp"],$oneline["name"]),ENT_QUOTES); ?>
</p>
<p class="entry_body">
<?php echo htmlspecialchars(sprintf("%s",$oneline["comment"]),ENT_QUOTES); ?>
</p>
</div>
<?php endforeach; ?>
<p class="page">
<?php if ($cur_page > 1) : ?>
<a href="?page=<?php echo ($cur_page-1) ?>">[next]</a>
<?php else: ?>
[next]
<?php endif; ?>
<?php if ($total_entrys > ($cur_page * $entry_per_page)) : ?>
<a href="?page=<?php echo ($cur_page+1) ?>">[prev]</a>
<?php else: ?>
[prev]
<?php endif; ?>
</p>
</div>
<div id="footer">
2011 KUMA TYPE
</div>
</body>
</html>
DB定義
調子に乗って色々項目を作ったのですが実際にはno・name・comment・timestampしか使っていませんw。今後拡張するときのためのリザーブですw。
CREATE TABLE ‘bbs’ (
‘no’ INTEGER NOT NULL PRIMARY KEY,
‘pno’ INTEGER,
‘name’ VARCHAR(128),
‘title’ VARCHAR(128),
‘comment’ VARCHAR(2000) NOT NULL,
‘hp’ VARCHAR(256),
’email’ VARCHAR(128),
‘ip’ VARCHAR(40) NOT NULL DEFAULT "",
‘timestamp’ TIMESTAMP NOT NULL
);
上記で紹介した書籍を読めばとりあえず誰でもこれくらいは作れるようになるはずです。たぶん。
これを踏まえて次に作成するウェブアプリはもうちょっと勉強してPHPで作成してみようかと思います。
SQLiteManagerで初期のテストデータを登録したのですがデフォルトの文字コードがEUCなので文字化けしてしまいました。EUCにしか対応していないのかなと思ったら、さっきWikipediaを見たら設定ファイルJpanese.inc.phpをUTF-8に書き換えればいいらしいです。今度つかうときは試してみようとおもいます。
タグ : SQLite
[Apacheメモ]httpd.confにOption Indexesを設定したにもかかわらずnoindex.htmlが表示される。
CentOS 5.7上のApacheでhttpd.confを編集してバーチャルホストを追加しました。
[kumacchi@rad-xen-vweb7 movie.kumacchi.com]$ sudo vi /etc/httpd/conf/httpd.conf
[sudo] password for kumacchi:
[kumacchi@rad-xen-vweb7 movie.kumacchi.com]$
<VirtualHost *:80>
ServerAdmin example@kumacchi.com
DocumentRoot /home/kumacchi/www/example.kumacchi.com
ServerName example.kumacchi.com
ErrorLog logs/example.kumacchi.com-error_log
CustomLog logs/example.kumacchi.com-access_log common
</VirtualHost>
しかし最初の画像の様にApache Test Pageが表示されてしまいます。ディレクトリの中身を一覧したかったのでOption Indexesを設定したら直るかなと思い。他の設定箇所からコピペで持ってきて設定してみましたが変わりません。
<VirtualHost *:80>
ServerAdmin example@kumacchi.com
DocumentRoot /home/kumacchi/www/example.kumacchi.com
ServerName example.kumacchi.com
ErrorLog logs/example.kumacchi.com-error_log
CustomLog logs/example.kumacchi.com-access_log common
<Directory /home/kumacchi/www/example.kumacchi.com>
AllowOverride All
Options MultiViews Indexes SymLinksIfOwnerMatch ExecCGI IncludesNoExec
</Directory>
</VirtualHost>
表示されているページがどこにあるのかは探してみると/var/www/error/noindex.htmlだという事は分かりました。
しかし/etc/httpd/conf/httpd.conf内を探してもそれを表示しようとしている設定がどこにもありません。
仕方が無いので検索してみると以下の記事を発見。
noindex.html @ ハイメ・予定は未定であって決定ではない・アルゲルスアリ
なるほど、/etc/httpd/conf.d/welcome.confでマッチするファイルがない場合はnoindex.htmlを表示するように設定されていました。
# This configuration file enables the default "Welcome"
# page if there is no default index page present for
# the root URL. To disable the Welcome page, comment
# out all the lines below.
#
<LocationMatch "^/+$">
Options -Indexes
ErrorDocument 403 /error/noindex.html
</LocationMatch>
そういうわけで
welcome.confをwelcome.conf.stopとリネームして
[kumacchi@rad-xen-vweb7 ~]$ sudo mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.stop
httpdを再起動して解決。これでちゃんとディレクトリの一覧がリストされるようになりました。
[kumacchi@rad-xen-vweb7 conf.d]$ sudo service httpd restart
[sudo] password for kumacchi:
httpd を停止中: [ OK ]
httpd を起動中: [ OK ]
[kumacchi@rad-xen-vweb7 conf.d]$
で、この記事を書いているときに最初の画像を見ていると、おもいっきりそれらしいことが英語で書いてあるっぽいのが目に入りましたw。
英語圏の人や普通に英語読めることだとこんな事で躓いたりしないんだろうなーと思ったり。
[MySQLメモ]MySQLのインストールと基本的な使い方
MySQLをインストールしてテーブルの作成からINSERTとSELECTまでやってみた。
OSはCentOS 5.6でyumを使ってインストールした。インストールされたMySQLのバージョンは5.0.77だった。基本的に後述の参考サイトの内容を参考にして作業を行った。
MySQLのインストール
yumからMySQLをインストールするには以下の様にする。途中[y/n]で質問された場合yと答えた。
[root@localhost etc]# yum install mysql-server
/etc/my.cnfを編集
以下のコマンドで編集。
[root@localhost etc]# vi /etc/my.cnf
以下の様に追記した。(以下は文字コードをutf8で利用する場合の設定)
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
default-character-set=utf8
skip-character-set-client-handshake
# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
default-character-set=utf8
default-character-set=utf8
[mysqldump]
default-character-set=utf8
MySQLを自動的に起動
起動時にMySQLを自動的に起動させるには下のコマンドで
[root@localhost etc]# ntsysv
mysqldにチェックをいれて[OK]を選べば大丈夫なはず。
MySQLの起動と終了
MySQLの起動と終了にはserviceコマンドを利用する。
起動
[root@localhost etc]# service mysqld start
MySQL を起動中: [ OK ]
[root@localhost etc]#
終了
[root@localhost etc]# service mysqld stop
MySQL を停止中: [ OK ]
[root@localhost etc]#
パスワードの設定
初期状態ではMySQLにrootアカウントが作成されているがパスワードが設定されていないのでパスワードの設定を行う。
下のコマンドでmysqlに接続する。 下はアカウント:rootでデータベース:mysqlに接続するという意味。
パスワードを聞かれるが初期はパスワードは設定されていないのでそのままエンターを押す。
[root@localhost etc]# mysql -u root -p mysql
ルートのパスワードを設定
mysql> SET PASSWORD FOR root@localhost=PASSWORD(‘new_password’);
初期作成される匿名ユーザーを削除します。userがrootのみになればOK。
mysql> delete from user where user=”;
Query OK, 0 rows affected (0.00 sec)
mysql> select host,user,password from user;
+———————–+——+——————+
| host | user | password |
+———————–+——+——————+
| localhost | root | xxxxxxxxxxxxxxxxx|
| localhost.localdomain | root | |
| 127.0.0.1 | root | |
+———————–+——+——————+
3 rows in set (0.00 sec)
mysql>
テーブルを作成する
データベースの一覧を表示する。
mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| test |
+——————–+
3 rows in set (0.00 sec)
mysql>
テスト用のデータベースtestに接続する。
mysql> connect test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Connection id: 19
Current database: test
mysql>
テーブルの一覧を表示する。
mysql> show tables;
+—————-+
| Tables_in_test |
+—————-+
| tab1 |
+—————-+
1 row in set (0.00 sec)
mysql>
テーブルを作成する。
mysql> create table tab2 (number int(10) unique not null, name char(40) not null);
Query OK, 0 rows affected (0.01 sec)
mysql>
データをインサートする。
mysql> insert into tab2 values(1,’山田花子’);
Query OK, 1 row affected (0.02 sec)
mysql> insert into tab2 values(2,’山田太郎’);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tab2 values(3,’田中一郎’);
Query OK, 1 row affected (0.00 sec)
mysql>
データをSELECTしてみる。
mysql> select * from tab2;
+——–+————–+
| number | name |
+——–+————–+
| 1 | 山田花子 |
| 2 | 山田太郎 |
| 3 | 田中一郎 |
+——–+————–+
3 rows in set (0.00 sec)
mysql>
MySQLを抜ける
mysql> quit
Bye
[root@localhost etc]#
参考サイト
船の科学館に行ってきた その3
ここからは羊蹄丸の写真です。羊蹄丸はどこかに譲渡されるみたいですね。船の科学館自体も休館とはあっても無期限みたいなので事実上閉館に近いのかな?
そういえば船が貰えるみたいな記事をどこかのコピペブログで前に見た気がしたので検索してみたらしたの記事を見つけた。羊蹄丸の事だったんだなーと今頃気がついた。
【乞食速報】 最後の青函連絡船(8311トン)がタダでもらえる 引き取り手ゼロなら解体
羊蹄丸の中は面白かった予想していた船の中とは全く違いとても船の中とは思えないような感じになっていた。
青森の市場が再現されている。
ピンぼけでなにがなんだかわからないが何かを売るお店を再現したもの。
青森駅の待合室が再現されている。
駅の売店等も再現されている。新聞なども昭和初期の物がならんでたり、商品も三ツ矢サイダーみたいな物や昔のタバコが並んでいて凝っていた。
駅長さんが見守ってます。昔は行商の人達が多かったようだ。
貨物列車の展示。横で青函連絡船の記録映画を見ることが出来る。羊蹄丸のしたの方でも記録映画を見ることができた。空気がかび臭くってきつかった。
本当はもっとゆっくり見てじっくり写真も撮りたかっただが行った時間が遅くて終了間際だったので駆け足で見て回ったので慌ただしかった。
羊蹄丸の外
なんか変な船がやって来た。水上バスらしい。調べてみると御座船 安宅丸らしい。
羊蹄丸の船首。
羊蹄丸の船首から艦橋に掛けて。
羊蹄丸本体。右下にスクリューが展示されている。
羊蹄丸の向こう側には南極観測船宗谷が展示されている。更にその向こうに見えているのは船ではなく船の科学館本館である。クイーンエリザベス二世号をかたどったものらしい。ちなみに私の義弟は南極にいきました。すごいね。南極というと先日亡くなられた小松左京氏の『復活の日』を思い出す。原作も読んだけど映画も日本の映画にしてはよく出来てたほうだと思う。
羊蹄丸の前はこんな感じで立派な建物が並んでいる。手前にあるのは水上バス乗り場らしい。
羊蹄丸のスクリュー。
羊蹄丸の説明パネル。
説明の金属パネルはスクリューの根元にあった。
安宅丸接岸中。
羊蹄丸腹の部分。立派な階段が作られて乗り降りしやすくなっていた。内部もロビーの部分は普通のフェリーの様な感じになっていて懐かしい感じがする。
最後に船の科学館の入館券の写真。
船の科学館 公式ホームページ(Museum of Maritime Science)
船の科学館 – Wikipedia
タグ :
船の科学館に行ってきた その2
船のエンジンって基本的に一度出港したら返ってくるまでエンジンを止めないと聞いたことがある。理由は忘れたけど止めてかからなかったら困るからかな?
若いころ実際2週間くらいの航海を何度かしたことがあるけどエンジンが止まったことはなかった。エンジンがずっと動いてるとかなりうるさいんだけどずっとなってる音っていうのは慣れて無音と同じになる。
これは何だったかなー
タグ :
船の科学館に行ってきた その1
8月末、木場にトランスフォーマーの映画を見に行ったときに実は「船の科学館」にも行きました。もうすぐ休館になるから行っておいたほうがいいよと弟が連れていってくれたのでした。
閉館になるのかと思ってたら一応リニューアルの為の休館なんですね。
感想としては面白かったけど、とにかく激しくかび臭かった。マスクを持っていくのをおすすめするレベル。これはリニューアルするのも仕方がないと思う。
タグ :
【perlメモ】Mojolicious::Lite+WebSocketでのチャットプログラム
アニメの『デュラララ!!』を見たことがある人なら分かると思うんですが、主人公が開設しているサイトにチャットがあるんですが、誰かが発言するとリアルタイムに更新されるんですね。普通cgiのチャットだとこうはいかないわけでタイマーで一定時間ごとにリロードするようにしてたりしてたわけですが、それだと発言から画面に反映されるまでにタイムラグがあるんですね。デュラララ!!を見ていた技術者の人なら「高校生の個人運営のサイトなのになにこの高機能なチャット」と気になったはずです。リアルタイム更新のチャットは昔だと普通のアプリケーションとしてTCP/IPとかでソケットを制御して実現してたわけです。IRCプロトコルを使うチャットソフトなどが代表的です。あと大手各社のIM(インスタントメッセンジャー)がそうですね。
今だと比較的簡単にリアルタイム通信なウェブチャットを作れたりします。ここではWebSocketという技術を使います。ただまだ仕様策定中のためブラウザの対応はまちまちで規格統一されていないようです。とりあえずここでの動作条件は以下の通り。
- Google Chrome 14.0.835.186 m
- Mojolicious 1.97
- perl 5.14
- CentOS 5.6
WebSocketサーバーをMojolicious::Liteの機能で実現しています。常駐プログラムなので共用サーバには設置できませんけどね。そういうわけで私はVMware Player上にCentOS 5.6で構築しているサーバー環境で試しました。
基本的に下記の参考サイトのプログラムのコピペです。
Mojolicious::Lite で WebSocket を使ったチャットを作る – naoyaのはてなダイアリー
詳細は上記のサイト様をご覧下さい。大変参考になります。
ただコピペしてもつまらないのでチャット参加者の名前も指定できるように拡張してみました。誰が発言したのかわからないと悲しいですしw。また元のプログラムだと日本語が文字化けするのでその対策もしてあります。
$json->encodeするとutf8flagが落ちるようで文字化けするので前にdecode_utf8をつけてutf8フラグをonしてあげています。これで文字化けしなくなりました。
名前部分の拡張は名前とメッセージ部分をTABコードで区切って送ったものをサーバー側のプログラムでsplitしているだけです。はっきり行って手抜きです。ちゃんと作るならJavaScript側でもJSON化にして送るといいと思います。
あとMojoliciousのバージョンが上がってメソッドの名前が変わっていて元のサンプルは動かなくなっていたので新しいメソッド名に変更しています。具体的には以下の通り変更しました。
- receive_messageをon_message
- finishedをon_finish
Mojoliciousの変更点は下記のサイトで確認できます。
あと勉強がてらにテンプレートを最近のMojoliciousが吐き出すテンプレートの形式にあわせて弄ってます。
#!/usr/bin/env perl
use utf8;
use Mojolicious::Lite;
use DateTime;
use Mojo::JSON;
use Encode qw/from_to decode_utf8 encode_utf8/;
get ‘/’ => sub {
my $self = shift;
# return $self->render(j => $j, f => $f);
} => ‘index’;
my $clients = {};
websocket ‘/echo’ => sub {
my $self = shift;
app->log->debug(sprintf ‘Client connected: %s’, $self->tx);
my $id = sprintf "%s", $self->tx;
app->log->debug("id:".$id);
$clients->{$id} = $self->tx;
# $self->receive_message(
$self->on_message(
sub {
my ($self, $msg) = @_;
my ($name,$message) = split(/\t/,$msg);
unless($name){
$name = ‘名無し’;
}
my $json = Mojo::JSON->new;
my $dt = DateTime->now( time_zone => ‘Asia/Tokyo’);
for (keys %$clients) {
$clients->{$_}->send_message(
decode_utf8($json->encode({
hms => $dt->hms,
name => $name,
text => $message,
}))
);
}
}
);
# $self->finished(
$self->on_finish(
sub {
app->log->debug(‘Client disconnected’);
delete $clients->{$id};
}
);
};
app->start;
__DATA__
@@ index.html.ep
% layout ‘main’;
%= javascript begin
jQuery(function($) {
$(‘#msg’).focus();
var log = function (text) {
$(‘#log’).val( $(‘#log’).val() + text + "\n");
};
// var ws = new WebSocket(‘ws://localhost:3000/echo’);
var ws = new WebSocket(‘ws://192.168.1.5:3000/echo’);
ws.onopen = function () {
log(‘Connection opened’);
};
ws.onmessage = function (msg) {
var res = JSON.parse(msg.data);
log(‘[‘ + res.hms + ‘] (‘ + res.name + ‘) ‘ + res.text);
};
$(‘#msg’).keydown(function (e) {
if (e.keyCode == 13 && $(‘#msg’).val()) {
ws.send($(‘#name’).val() + "\t" + $(‘#msg’).val());
$(‘#msg’).val(”);
}
});
});
% end
<h1>Mojolicious + WebSocket</h1>
<p>name<input type="text" id="name" />msg<input type="text" id="msg" /></p>
<textarea id="log" readonly></textarea>
<div>
</div>
@@ layouts/main.html.ep
<html>
<head>
<meta charset="<%= app->renderer->encoding %>">
<title>WebSocket Client</title>
%= javascript ‘https://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js’
<style type="text/css">
textarea {
width: 40em;
height:10em;
}
</style>
</head>
<body><%= content %></body>
</html>
ブラウザを二つ立ち上げて一人二役でチャットしてみたんですが発言するとどちらの窓にも瞬時に発言が反映されてスゲーー!ってなりました。わびしーww。
#WebSocketとAjaxで夢がひろがりんぐwww
#このサンプルプログラム実はちょっと前に試してみて放置してました。なぜか動かなかったんですね。
最初はメソッド名が変更になっているのがわからずエラーが出るので挫折しかけたんですが検索してみると上の最近の主な変更点のページにたどり着いてメソッド名が変更になったことがわかったのでソースに反映してみたんですがサーバーに接続できるもののサーバー側から応答がないので挫折しました。
今日試してみたらなぜか動きましたw。Google Chromeが14系になったからなのかPCを再起動したからなのかは不明。
他にもMojoliciousの導入からやったので最近はCentOSもインストールすると最初からiptablesでポートを絞っているようでポートを開けてあげないと接続出来なかったりとかで一瞬「うごかねー」とか思ったり。