2010年7月27日
いまさらながらtwitterやりはじめたよ
http://twitter.com/tatsuya_u
mixiとも連携しておいた。
2010年6月27日
picoスタイルが追加
いま、picoを適用しています。
率直な感想として、シンプルでいい!
ごちゃごちゃ情報が詰め込まれていない、伝えたい情報、つまりブログ記事が際立ってファーストビューに飛び込んでくるイメージです。
このまま継続してpicoを適用していくかは、まだ判断できませんが、おそらくこのpicoスタイルでブログを続けていくかなぁと今の段階では考えています。
MovableType5になって、テンプレート、モジュール構成もわかりやすくなってますし、自分でテンプレート改変も容易になったと思います。picoだとちょっと・・・というときには、テンプレートいじって要素を足してみてもいいかもしれません。
2010年6月26日
MovableType5にしました
なんかかっこよくなりましたね。
ということで、まずはテスト投稿です。
2008年12月20日
忘年会だとか新年会だとかに便利な日程調整・連絡網ツール
最近、こーゆーイベントをネットツール使って行うようになったので、ご紹介。
まず連絡網ツール。
このサイト、携帯専用のメーリスです。何がいいって広告とかうざったいものがない、すっきりしていて分かりやすい。
仲間内で利用してますが、気軽にポストできるのでネタ投稿だとかで楽しく活用してます。
だけど、このあつまろねっと。日程○×調整ツールがついてない。残念。
ぶっちゃけ、あつまろねっと以外にもこういったメーリスサービスはたくさんありますが、ほんとデザインだとかUI面であつまろねっとが一番なんです。○×調整は他で調達します。
携帯からでもおkな予定調整ツールで今使ってるのが伝助。
何がいいって、携帯から使えるだけとっても良い。パスワードも一応設定できる(しないこともできる)。
ここでイベント作成して、あつまろねっとでポストでおkって感じに使ってます。
2008年11月15日
PHPで明日の日付を簡単に取得
<?php
echo date("m/d",strtotime("tomorrow"));
?>
strtotime関数っての初めて使いました。簡単に取得できますね。
3日後だったら
<?php echo date("m/d",strtotime("+ 3day")); ?>
for文とかと組み合わせて今日から1ヶ月間の日付プルダウンメニューとかもできそうですね。
2008年11月 9日
CakePHPで携帯サイト。絵文字ヘルパーの設置
CakePHPで絵文字を使う方法
CakePHPで携帯サイト作ろうと考えてます。絵文字は欠かせません(やっぱりサイトに表情が出る)。
そこで今回は
ymknの日記さんのEmojiHelperを使うことにしました。
ダウンロード・詳細ページはymknの日記さんの
EmojiHelper - キャリアを意識せずに絵文字を出力できるCakePHPのHelperクラス
のページから。
このヘルパーはアシアル亀本さんが公開している携帯絵文字JSONデータのjsonデータを利用して作られています。
まずはjsonデータをもらってきましょう。http://blog.asial.co.jp/330
docomo,au,softbankと3キャリアごとに二つずつjsonファイルがあると思います。それらemoji_jsonフォルダをCakePHPのwebroot/filesフォルダにぶち込みます。
次にymknの日記さんのEmojiHelper - キャリアを意識せずに絵文字を出力できるCakePHPのHelperクラスのページからEmojiHelperをもらってきましょう。
ソースが記事に記載されているのでコピーしemoji.phpというファイル名で保存。
ソース冒頭のEMOJI_JSON_DIRという定数を環境に合わせましょう。emoji_jsonというフォルダ名でwebroot/filesフォルダに置いたなら
define('EMOJI_JSON_DIR', 'files/emoji_json/');
となるはずです。
あとはこのemoji.phpファイルをviews/helpersに配置。Controller側で
var $helpers = array('Emoji','Html','Form');
とお使いになるヘルパーさんと一緒にEmojiを記述。
これでviewファイルで
echo $emoji->d(11);
とかすれば絵文字がsjisコードで吐き出されます。詳しい使い方などは作者様のEmojiHelper - キャリアを意識せずに絵文字を出力できるCakePHPのHelperクラスのページをご覧になって下さい。
Smartyもプラスさせてみる
CakePHPでSmartyが簡単に使えます。携帯向けにsjisにすることもできます。ECworksさんのSmartyViewを使います。
使い方などは
CakePHPでSmartyを使う方法-tatsuyakun.jp
なんかをご覧いただけたら幸いです。
ロリポップなどPHP4環境でのEmojiHelper使用注意
EmojiHelperのソース内でemoji_jsonデータをパースするためにjson_decode関数なるものが使われています。
これをこのままロリポップやチカッパ、ヘテムルといったPHP5.2未満のバージョンで使用するとエラーが起きます。json_decodeはPHP5.2で装備された関数になりますので、json_decode関数を自ら定義しなくてはいけないんですね。
私はヘテムルを使っているのですが、PHP5.1で惜しくもjson_decodeが搭載されていない。そこで、過去にも紹介したupgrade.phpを利用します。詳しくは過去記事をご覧ください。
PHP4環境でjson_decodeでjsonを扱う-tatsuyakun.jp
さてさて、このupgrade.phpを利用しても問題は解決しません。upgrade.phpのjson_decodeが多元配列ではなく、オブジェクトで返ってきてしまうのです。本来ならば多元配列で返ってくるので、EmojiHelperはオブジェクトではなく多元配列を前提にソースが書かれています。
json_decode($json_data, true);と第二引数でTRUEを指定すれば本当は多元配列で返ってくるのですが、upgrade.phpのjson_decodeはオブジェクトで返ってきてしまいます。
困ってしまった僕ちんは結局EmojiHelperをちょっと改編することにしました。その方法をご紹介します。
PHP4でもEmojiHelper改編
最近まで「Linuxってなに?食えんの?」っていう文系大学生だったので私のソースを真に受けないように!参考程度で!
ちんぷんかんぷんなまま、手探りでソースをいじくりまくりました。
いじるのはout()メソッド部分です。
そもそもの元凶は、EmojiHelperが正規のjson_decodeの仕様に合わせて絵文字データを配列として扱っているのに対し、upgrade.phpのjson_decodeがオブジェクトで返ってきてしまっていることなのですから、このオブジェクトを配列に治してしまえばよいわけです。\
json_decodeでパース取得したデータはこんな感じです。
Array
(
[docomo] => stdClass Object
(
[1] => stdClass Object
(
[number] => 1
[sjis] => F89F
[sjis-10] => 63647
[unicode] => E63E
[title] => 4
[color] => 5$
[utf-8] => EE98BE
)
わざわざオブジェクトを配列になおす訳は、emoji_jsonデータの仕様で変数$1ってのが出てきてしまうから。$obj->docomo->1なんてエラーが起きますよね。変数名の頭に数値は使えない。
だから配列にする必要がある。でもそこ以外はオブジェクトでも良いので必要に応じて配列に変換していきます。配列への変換方法はとっても簡単で、(array)$objです。
上記のstdClass Objectってのが迷惑な奴らなのでこいつらを地道に配列になおしてあげましょう。
例えばEmojiHelperの114行目
引用:
$code = $this->emoji[EMOJI_CARRIER_DOCOMO][$this->convert_str[EMOJI_CARRIER_DOCOMO]][$number]['sjis'];
この$codeにドコモ絵文字jisコードが代入されます。
これを今回のようにupgrade.phpを使った際は
$tatsuya = (array)$this->emoji[EMOJI_CARRIER_DOCOMO][$this->convert_str[EMOJI_CARRIER_DOCOMO]];
$code = $tatsuya[$number]->sjis; //ここは配列に戻さなくても取得できるのでオブジェクトのまま
って感じでしょうか。
ソース中のout()メソッドのなかに
$this->emoji
$this->convert
という箇所をこのように配列になおしてあげてください。全部で4つか、5つの箇所。がんばれ!
と、ここで肝心なupgrade.phpですが、僕はjson_decodeが定義されている部分をemoji.phpの上部に貼り付けるという適当な対処をしました!
さて、以上!
オブジェクトを配列にする方法
オブジェクトを配列にする。というか、プロパティを配列で受け取る方法というか。
以前このブログでもご紹介したのですが、
PHP4環境でjson_decodeでjsonを扱う-tatsuyakun.jp
jsonを扱うのにとっても便利なjson_encode,json_decode関数、実はPHP4環境では装備されていない関数なんですね。
ロリポップとかチカッパとかだと使えません。ヘテムルでもPHP5.1で使えません(PHP5.2以上で装備)。
そこで登場するのがPHP5で装備された関数郡をそれ以下のバージョンでも補完するライブラリupgrade.phpなんですが(詳しくは過去記事をご覧ください)、このライブラリのjson_decodeを使った際困ったことが起きました。
json_decode関数はjson_decode($json_data, TRUE)といった具合に、第二引数にTRUEを指定しないとオブジェクトで返ってきます。
で、upgrade.phpのjson_decodeは第二引数にTRUEを指定しても最初だけ配列であとはオブジェクトで返ってきますwww多次元配列では返してくれません(PHP5.2では多次元で返してくれます)。
別に配列にしなくても$obj->var1->var2って値もらってくればよくね?とも思うのですが、変数が「1(int)」だと困りものです。僕はそれで困ったのです。はい。変数に$1なんてつけられませんから、$obj->1なんてやったらエラー起こします。
まぁ、とにかく配列にしたかったのですよ。
で、オブジェクトを配列にする方法ですが、ちょっと賢い人だと、get_object_vars($obj)で配列で受け取ればよくね?って思っちゃうんでしょうけど、
実は(array)$objで配列になります
逆に(object)$arrayでオブジェクトになります。
いやー知らんかった。
2008年11月 7日
お笑い興味ないけど俺が最近くそ笑った芸人
天津木村がくそ面白い
2008年10月 4日
PHPでタスク管理のようなToDo管理なようなものを1つのファイルで作ってみた
最近、知人がPHPの勉強にタスク管理アプリを作るというので僕もやってみた。
ToDo管理アプリをひとつのファイルで実現するToDo.phpというものがありますので、そこらへんを意識して僕も1ファイルに挑戦。
ToDo.phpはこちら。http://0-oo.net/sbox/php-tool-box/todo
ToDo.phpはcsv形式でデータをためていくんですが、僕はMySQLで。
タスク管理というか、なんつーか、ただのメモ帳になったけど満足したからこれで完成でいいや。
たぶん、自分でも利用しねーしwww
でも、一応ソースを公開してみる。くそソースです、はい。
完成イメージ

超ハイデザインなのは仕様。
データベースの構造も単純に、
CREATE TABLE `tasks` (
`id` int(11) unsigned NOT NULL auto_increment,
`content` text character set utf8 NOT NULL,
`status` enum('yet','done') character set utf8 NOT NULL default 'yet',
`created` datetime NOT NULL,
PRIMARY KEY (`id`)
)
ってとこで。
以下、ソース。
<?php
/*データベースホスト*/
define("HOST", "localhost");
/*データベースログインユーザー名*/
define("USER", "root");
/*データベースログインパスワード*/
define("PASSWORD", "pass");
/*使用データベース名*/
define("DATABASE", "task");
/*使用テーブル名(tasks推奨)*/
define("TABLE", "tasks");
#################################################
## taskクラス
#################################################
class task{
function _conn(){
$conn = mysql_connect(HOST,USER,PASSWORD);
mysql_select_db(DATABASE);
mysql_query("SET NAMES utf8", $conn);
return $conn;
}
//テーブルデータ取得メソッド
function findALL(){
$conn = $this->_conn();
$sql = 'SELECT * FROM ' . TABLE . ' order by id desc';
$res = mysql_query($sql, $conn) or die("dame");
while($row = mysql_fetch_array($res, MYSQL_ASSOC)){
//タスク完了、未完了に分類
if($row['status'] == 'yet'){
$data['yet'][] = $row;
}else{
$data['done'][] = $row;
}
}
return $data;
}
//新規タスク追加メソッド
function add($content){
$conn = $this->_conn();
$date_time = date("Y-m-d H:i:s");
$sql = "INSERT INTO " . TABLE . " (content, status, created) VALUES ('$content', 'yet', '$date_time' )";
mysql_query($sql,$conn) or die("新規タスク追加にしっぱいしますた");
}
//タスク完了メソッド
function done($id){
$conn = $this->_conn();
$sql = "UPDATE " . TABLE . " SET status = 'done' WHERE id = " . $id;
mysql_query($sql, $conn) or die("タスク完了に失敗しました");
}
//タスク削除メソッド
function delete($id){
$conn = $this->_conn();
$sql = "DELETE FROM " . TABLE . " where id = " . $id;
mysql_query($sql, $conn) or die("タスク削除に失敗しますた");
}
}
####################
##新規タスク追加
####################
if($_GET['action'] == 'add'){
if($_POST['content']){
$task = new task();
$task->add($_POST['content']);
}
//追加したのち、トップページにリダイレクト
header("Location: ./");
exit;
}
####################
##タスク完了
####################
if($_GET['action'] == 'done'){
if($_GET['id']){
$task = new task();
$task->done($_GET['id']);
}
//完了にしたのち、トップページにリダイレクト
header("Location: ./");
exit;
}
####################
##タスク削除
####################
if($_GET['action'] == 'delete'){
if($_GET['id']){
$task = new task();
$task->delete($_GET['id']);
}
//削除したのち、トップページにリダイレクト
header("Location: ./");
exit;
}
####################
##タスク完了
####################
if($_GET['action'] == 'delete'){
if($_GET['id']){
$task = new task();
$task->delete($_GET['id']);
}
//削除したのち、トップページにリダイレクト
header("Location: ./");
exit;
}
####################
##タスク一覧ページ(通常のページ)
####################
$task = new task();
//$dataに全タスクデータを格納
$data = $task->findAll();
?>
<html>
<head>
<title>なんちゃってタスク管理アプリ</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
<!--
h1{
background-color:orange;
color:white;
padding-left:30px;
}
h2.add{
color:blue;
float:left;
margin-left:10px;
margin-right:20px;
margin-bottom:30px;
}
h2{
color:orange;
margin-bottom:20px;
}
table{
margin-left:30px;
margin-bottom:50px;
}
th{
background-color:pink;
color:white;
}
td{
padding-right:20px;
}
a{
color:orange;
}
div.footer{
border-top:solid 2px orange;
text-align:center;
}
-->
</style>
</head>
<body>
<h1>なんちゃってタスク管理アプリ</h1>
<h2 class="add">新規タスク追加</h2>
<form action = "index.php?action=add" method="post">
<input type="text" name="content" size="35">
<input type="submit" value="新規追加">
</form>
<br clear="all">
<h2>未完了タスク</h2>
<table>
<tr>
<th>完了リンク</th>
<th>タスク内容</th>
<th>作成日時</th>
<th>削除リンク</th>
</tr>
<?php if($data['yet'] !== null): ?>
<?php foreach($data['yet'] as $value): ?>
<tr>
<td align="center"><a href="?action=done&id=<?php echo $value['id']; ?>">完了</a></td>
<td><?php echo $value['content']; ?></td>
<td><?php echo $value['created']; ?></td>
<td align="center"><a href="?action=delete&id=<?php echo $value['id']; ?>">削除</a></td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
</table>
<h2>完了済タスク</h2>
<table>
<tr>
<th>タスク内容</th>
<th>作成日時</th>
<th>削除リンク</th>
</tr>
<?php if($data['done'] !== null): ?>
<?php foreach($data['done'] as $value): ?>
<tr>
<td><?php echo $value['content']; ?></td>
<td><?php echo $value['created']; ?></td>
<td align="center"><a href="?action=delete&id=<?php echo $value['id']; ?>" onclick="check()">削除</a></td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
</table>
<div class="footer"><address>©tatsuyakun.jp</address></div>
</body>
</html>
defineで設定した定数部分だけ環境にあわせていじれば動くと思います。
2008年9月28日
CakePHPでSmartyを使う方法
CakePHP使って携帯サイト作るか⇒あ、なんとなくSmarty使いてぇ。
と思ったのでCakePHPをSmarty対応にしてみた。
ECWorks BlogさんのSmartyViewを使います。
ダウンロードは以下から。
http://ecw.seesaa.net/article/101503882.html
説明書やサンプルファイルも同封されているので分かりやすいと思いますが、ここでも簡単に説明させて頂きます。
まずはSmarty本体をVendorsに。
Smartyを使うので当然ながらSmarty本体が必要になります。
Smartyのダウンロードは以下から。
http://www.smarty.net/download.php
Latest Stable Releaseでおk。zipでもtar.gzでもお好きな方をダウンロードし解凍。
なかのlibsというフォルダをCakePHPのvendorsにコピー。(場所:CakePHP\vendors)
なお、appディレクトリにもvendorsディレクトリが存在するがどちらでも構わない。(と、思うw)
vendorsにlibsをコピーしたのち、「smarty」にリネーム。
CakePHP\vendors\smarty(libs)
ってなると思う。
以上で本体の設置は完了。
SmartyViewの設置
次にSmartyViewを設置する。
まだダウンロードしてない人はECWorks Blogさんのページから。
http://ecw.seesaa.net/article/101503882.html
ダウンロード解凍するとサンプルファイルがあり、そのままCakePHPにコピーしてあげれば動くようになっています。
Controllerディレクトリにはサンプルのコントローラー(mypages_controller)のみ。
tmpにはSmartyのキャッシュディレクトリ、コンパイルディレクトリ(templates_c)が中身が空の状態で作られています。
viewにはサンプルviewディレクトリ(mypages)の他、smarty.php、Smart用レイアウトファイルが入っていると思います。このSmarty.phpが要となるファイルです。
あとはサンプルを動かしてみてファイルをみてみればわかると思います。
Controllerにvar $view = 'Smarty';のプロパティを付け足してること、viewにはさらに下の階層にsmartyというディレクトリができていることなど。
例えばtests_controllerに対するviewを作る際、testsディレクトリの下にviewファイルを置くと思いますが、smartyを使う際はさらにその下にsmartyというディレクトリを作り、そこに.tpl拡張子でviewファイルを作ることになります。
携帯向けにするためにsiis対応にもしてみる
冒頭で述べたとおり、私は携帯向けコンテンツにSmartyを使おうと考えていました。
ご存じのとおり、携帯サイトはsjis推奨。でもSmartyはsjis非推奨。
そもそもなぜSmartyはsjisでは使えないのか?
Smartyのデリミタに問題があります。(「{}」←こいつら)
sjisのある文字のバイトが{}のバイトとかぶってしまう。
例えば、sjisでテンプレートファイルを作ってみてください。たぶんエラーは起こらないと思います。普通にやる分には特に問題ないんです。
「急」「宮」といった漢字を使ってみてください。これらのバイトがSmartyのデリミタのバイトとかぶって評価されてしまい、Smartyパースエラーが生じると思います。
ではどうしたら良いか。
一番手っ取り早いのがSmartyのデリミタをかえてしまうこと。
先ほどのSmartyViewのsmarty.php(app\views\smarty.php)を変更します。
70行目辺りに、$this->smartyと続く箇所があると思います。そこに以下を付け足しましょう。
$this->smarty->left_delimiter = '{{';
$this->smarty->right_delimiter = '}}';
これでデリミタが変更されました。
通常だと{$var}となりますが、上記の場合、{{$var}}となります。
<!--{$var}-->とかえる人もいるみたいです。コメントにするのは恐らく、tplファイルが覗かれたときのためなんでしょうかね?
まぁあなたの好きなようにデリミタをかえましょう。
以上。
次回はCakePHPでSmartyを使いつつ絵文字に対応させるヘルパーをご紹介いたします。
最近のコメント