引き続き「エコー機能」の話しですが。。。
結局、削除機能と返信機能をつけてみました。
2.12.3に組み込んだの図
メッセージの削除

返信機能

サーバーから非同期でメッセージを読み取っているので新着メッセージがあった場合でもページ移管なく更新されます、但しあまり大規模のサイトではDBへの負荷が高くなるためもう少し工夫(今は新着があろうが無かろうが全件検索を実行している)が必要かと思いますが、少人数のサイトでは「ショートメッセンジャー」として十分役に立つことと思います。
引き続き「エコー機能」の話しですが。。。
結局、削除機能と返信機能をつけてみました。


サーバーから非同期でメッセージを読み取っているので新着メッセージがあった場合でもページ移管なく更新されます、但しあまり大規模のサイトではDBへの負荷が高くなるためもう少し工夫(今は新着があろうが無かろうが全件検索を実行している)が必要かと思いますが、少人数のサイトでは「ショートメッセンジャー」として十分役に立つことと思います。
Twitterに始まり Wassr, mixiエコー(mixiボイス)等々、ゆるめの一言コミュニケーションツールが流行っているようですね、それに負けじと(もちろん負けてますが)OpenPNE上で使える「さらにゆるめのチャット機能」を試作してみました。動作は単純でブラウザーを使った自動リロード型のチャットボードのような感じ。OpenPNEコアのソースには変更を全く加えず(DBへのテーブル追加は必要)、管理画面からのテンプレートの挿入と、I/O用のPHPスクリプトをUPをするだけという比較的お気軽に設置ができます。
最初はテンプレへFlashを埋め込む形を考えていましたが とりあえずJavascriptで書いてみたらこれで十分な気がしてきました(いや実はもう書き直すのが面倒くさいんです)。
こんな単純ですがフレンド間でのチャットが楽しめます。
因にmixiエコーのようなレス機能や削除機能なんてありません!(それが売りです。笑)
ところで、Usagi ProjectさんのMyNETS-1.2.0の新機能として実装された一言発言「今日のひとこと」、これはmixi エコー(ボイス)の使い勝手を上回る至れり尽くせりな機能が満載ですね。
外部ログインページだけですが、iPhone用のお手軽カスタマイズ方法。

最小構成はこんな感じ
<?php
$ua = $_SERVER['HTTP_USER_AGENT'];
if (ereg("iPhone",$ua)) {
//iPhone用の処理
・・・ 省略 ・・・
exit;
}
//iPhone以外(標準のログインへとばす)
header('Location:http://OPENPNE_URL/?m=pc&a=page_o_login');
?>
※iPhone以外のエージェントと判定された場合index.phpへ飛ばすとループしてしまうため注意。
本体の向き(縦横)でスタイルシートを切り替えてみました
<?php
$ua = $_SERVER['HTTP_USER_AGENT'];
if (ereg("iPhone",$ua)) {
print <<<EOD
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0;">
<title>My iPhone Page</title>
<link rel="apple-touch-icon" href="iphone/images/myiphone_ico.png"/>
<link rel="StyleSheet" href="./iphone/css/iphone_portrait.css" type="text/css" media="screen" id="orient_css">
</head>
<body onorientationchange="orient();">
<form action="http://OPENPNE_URL/" method="post">
<div id="wrap">
<div id="header"></div>
<div id="content">
<p>Member Sign In</p>
<p>Please enter your ID and Password.</p>
<input type="hidden" name="m" value="pc" />
<input type="hidden" name="a" value="do_o_login" />
<ul>
<li class="myLabel">Email:</li>
<li><input type="text" name="username" id="username" value="" tabindex="1"></li>
</ul>
<ul>
<li class="myLabel">Password:</li>
<li><input type="password" name="password" id="password" tabindex="2"></li>
</ul>
<p><input type="checkbox" name="is_save" id="is_save" value="1" tabindex="3"><label for="is_save">次回から自動的にログイン</label></p>
<p><input type="submit" value="Sign In" tabindex="4"></p>
</div>
<div id="bottom"></div>
</div>
</form>
</body>
</html>
<script type="text/javascript">
function orient()
{
switch(window.orientation){
case 0: document.getElementById("orient_css").href="./iphone/css/iphone_port.css"; break;
case -90: document.getElementById("orient_css").href="./iphone/css/iphone_land.css"; break;
case 90: document.getElementById("orient_css").href="./iphone/css/iphone_land.css"; break;
}
}
window.onload = orient();
</script>
EOD;
exit;
}
header('Location:http://OPENPNE_URL/?m=pc&a=page_o_login');
?>
※ OPENPNE_URL は各自自分のサイトURLに読み換えて下さい。
iphone_land.css(横用レイアウト)
body
{
background-color:#333;
margin:0;
}
#wrap
{
overflow:auto;
width:480px;
height:350px;
}
#header
{
background:url(../images/header_land.jpg);
background-repeat:no-repeat;
height:100px;
}
#content
{
background:url(../images/middle_land.jpg);
background-repeat:repeat-y;
margin-top:-5px;
}
p
{
margin:5px;
padding-left:25px;
width:370px;
}
#bottom
{
background:url(../images/bottom_land.jpg);
background-repeat:no-repeat;
height:30px;
margin-top:-5px;
}
ul{
margin:5px;
padding-left:25px;
list-style:none; inside;
}
li.myLabel{
width:80px;
float:left;
text-align:right;
}
iphone_land.css(縦用レイアウト)
body
{
background-color:#333;
margin:0;
padding:0;
font-size:12px;
}
#wrap
{
overflow:auto;
width:320px;
height:480px;
}
#header
{
background:url(../images/header_port.jpg);
background-repeat:no-repeat;
height:100px;
}
#content
{
background:url(../images/middle_port.jpg);
background-repeat:repeat-y;
margin-top:-5px;
}
p
{
margin:5px;
padding-left:25px;
width:270px;
}
#bottom
{
background:url(../images/bottom_port.jpg);
background-repeat:no-repeat;
height:30px;
margin-top:-5px;
}
ul{
margin:5px;
padding-left:25px;
list-style:none; inside;
}
header
![]()
body
![]()
bottom
[public_html]
index.html
index2.html(今回追加したコード)
[iphone](以下今回追加したファイル)
[css]
iphone_land.css
iphone_port.css
[images]
header_land.jpg
header_port.jpg
middle_land.jpg
middle_port.jpg
bottom_land.jpg
bottom_port.jpg


Google社製インターネットブラウザー「Google Chrome」、公開から数時間後にブラウザーのクラッシュに繋がるセキュリティーの脆弱性が発見されてしまったそうですが、自分の周りの評価は中々好評なようです。あまりのシンプルさにBookMarkの出し方すらわからず戸惑っているアナタ、とりあえず、[Ctrl+B] でブックマークの表示/非表示が切り替わります。
後は、まもなく登場するであろうエクステンションAPIが楽しみです。
たかがブラウザーと侮る無かれ、確かに数年前まではホームページをビジュアル化して表示させるためのツールだったわけですが、今やオフィスアプリケーションから3DCADまで殆どのアプリがブラウザー上で動いています、今後は益々高機能化してこの傾向は更に加速していくのではないでしょうか?
そうなるともうWindowsだとかMacOSだとかあまり関係なくなってきて、極端な話OS無しでブラウザーが動くとか、ブラウザー上でMacOSXのエミュレータを動かすとか、そんな時代になるかもしれませんね。笑
ところでChromeのアドレスバーにはサイトのURLやローカルのフォルダー名やファイル名だけではなく、検索キーワードも打ち込めるのですが、更に以下のコマンドを打ち込むと様々な情報を確認することができます。
最近iPodの音が悪い、音圧が出ないし特に低域があまり聴こえない。iPod本体には、購入時から1年間のメーカー保障が付いていることは知っていたが、なんと付属アクセサリーにも適応されると聞いて即連絡!。数日後にはヤマト急便の人が、交換のため新品のイヤホンを持って来てくれました。
毎日使用していると大体一年前後で壊れます、自分の場合はこれで3個目、最初の2個は保障の事など頭に無くて自腹で購入、使えているうちは余り気にしないものの、いざ自分で選んで買うとなるとやはり高性能のものが欲しくなって一万円くらいの出費になります。(下手したら本体より高くつく!)
そして修理(交換)の手続きはWebから簡単に行えます。
オンライン修理サービス
Docomo携帯のバッテリーも「プレミアム会員(無料)」に入っていると2年以上から無料交換の対象です、自分の場合1年半くらいでも無料で交換してもらいました。
admin_user
| NAME | TYPE | NULL | DEFAULT | PRIMARY | UNIQUE | FLAG |
|---|---|---|---|---|---|---|
| id | int ( 11 ) | YES | auto_increment | |||
| username | string ( 64 ) | YES | unique_key | |||
| password | string ( 40 ) |
authentication_login_id
| NAME | TYPE | NULL | DEFAULT | PRIMARY | UNIQUE | FLAG |
|---|---|---|---|---|---|---|
| id | int ( 11 ) | YES | auto_increment | |||
| member_id | int ( 11 ) | YES | NULL | multiple_key | ||
| login_id | string ( 128 ) | YES | NULL | YES | unique_key | |
| password | string ( 32 ) | YES | NULL |
authentication_pc_address
| NAME | TYPE | NULL | DEFAULT | PRIMARY | UNIQUE | FLAG |
|---|---|---|---|---|---|---|
| id | int ( 11 ) | YES | auto_increment | |||
| member_id | int ( 11 ) | YES | NULL | multiple_key | ||
| password | string ( 32 ) | YES | NULL | |||
| register_session | string ( 32 ) | YES | NULL |
community
| NAME | TYPE | NULL | DEFAULT | PRIMARY | UNIQUE | FLAG |
|---|---|---|---|---|---|---|
| id | int ( 11 ) | YES | auto_increment | |||
| name | string ( 64 ) | YES | unique_key |
community_member
| NAME | TYPE | NULL | DEFAULT | PRIMARY | UNIQUE | FLAG |
|---|---|---|---|---|---|---|
| id | int ( 11 ) | YES | auto_increment | |||
| community_id | int ( 11 ) | multiple_key | ||||
| member_id | int ( 11 ) | multiple_key | ||||
| position | string ( 32 ) | YES | NULL | multiple_key |
friend
| NAME | TYPE | NULL | DEFAULT | PRIMARY | UNIQUE | FLAG |
|---|---|---|---|---|---|---|
| id | int ( 11 ) | YES | auto_increment | |||
| member_id_to | int ( 11 ) | multiple_key | ||||
| member_id_from | int ( 11 ) | multiple_key |
member
| NAME | TYPE | NULL | DEFAULT | PRIMARY | UNIQUE | FLAG |
|---|---|---|---|---|---|---|
| id | int ( 11 ) | YES | auto_increment | |||
| name | string ( 64 ) | |||||
| is_active | int ( 11 ) | |||||
| created_at | datetime ( 19 ) | YES | NULL | |||
| updated_at | datetime ( 19 ) | YES | NULL |
member_config
| NAME | TYPE | NULL | DEFAULT | PRIMARY | UNIQUE | FLAG |
|---|---|---|---|---|---|---|
| id | int ( 11 ) | YES | auto_increment | |||
| member_id | int ( 11 ) | multiple_key | ||||
| name | string ( 64 ) | |||||
| value | text | YES | NULL |
member_profile
| NAME | TYPE | NULL | DEFAULT | PRIMARY | UNIQUE | FLAG |
|---|---|---|---|---|---|---|
| id | int ( 11 ) | YES | auto_increment | |||
| member_id | int ( 11 ) | YES | NULL | multiple_key | ||
| profile_id | int ( 11 ) | YES | NULL | multiple_key | ||
| profile_option_id | int ( 11 ) | YES | NULL | multiple_key | ||
| value | text | YES | NULL |
navi
| NAME | TYPE | NULL | DEFAULT | PRIMARY | UNIQUE | FLAG |
|---|---|---|---|---|---|---|
| id | int ( 11 ) | YES | auto_increment | |||
| type | string ( 64 ) | multiple_key | ||||
| uri | text | YES | NULL |
navi_i18n
| NAME | TYPE | NULL | DEFAULT | PRIMARY | UNIQUE | FLAG |
|---|---|---|---|---|---|---|
| caption | text | YES | NULL | |||
| id | int ( 11 ) | YES | ||||
| culture | string ( 7 ) | YES |
profile
| NAME | TYPE | NULL | DEFAULT | PRIMARY | UNIQUE | FLAG |
|---|---|---|---|---|---|---|
| id | int ( 11 ) | YES | auto_increment | |||
| name | string ( 64 ) | YES | unique_key | |||
| is_required | int ( 11 ) | |||||
| is_unique | int ( 11 ) | |||||
| form_type | string ( 32 ) | |||||
| value_type | string ( 32 ) | |||||
| value_regexp | text | YES | NULL | |||
| value_min | int ( 11 ) | YES | NULL | |||
| value_max | int ( 11 ) | YES | NULL | |||
| is_disp_regist | int ( 11 ) | |||||
| is_disp_config | int ( 11 ) | |||||
| is_disp_search | int ( 11 ) | |||||
| sort_order | int ( 11 ) | YES | NULL |
profile_i18n
| NAME | TYPE | NULL | DEFAULT | PRIMARY | UNIQUE | FLAG |
|---|---|---|---|---|---|---|
| caption | text | |||||
| info | text | YES | NULL | |||
| id | int ( 11 ) | YES | ||||
| culture | string ( 7 ) | YES |
profile_option
| NAME | TYPE | NULL | DEFAULT | PRIMARY | UNIQUE | FLAG |
|---|---|---|---|---|---|---|
| id | int ( 11 ) | YES | auto_increment | |||
| profile_id | int ( 11 ) | YES | NULL | multiple_key | ||
| sort_order | int ( 11 ) | YES | NULL |
profile_option_i18n
| NAME | TYPE | NULL | DEFAULT | PRIMARY | UNIQUE | FLAG |
|---|---|---|---|---|---|---|
| value | text | YES | NULL | |||
| id | int ( 11 ) | YES | ||||
| culture | string ( 7 ) | YES |
sns_config
| NAME | TYPE | NULL | DEFAULT | PRIMARY | UNIQUE | FLAG |
|---|---|---|---|---|---|---|
| id | int ( 11 ) | YES | auto_increment | |||
| name | string ( 64 ) | YES | unique_key | |||
| value | text | YES | NULL |