ラベル Wordpress の投稿を表示しています。 すべての投稿を表示
ラベル Wordpress の投稿を表示しています。 すべての投稿を表示

2008年3月6日木曜日

Nucleus サムネイル付きで画像アップロード

Nucleusのチューンナップ

だんだん動き始めたNucleusだけど、少し欲が出てきた。
WordPressではdafaultでサムネールを使うことが組み込まれているけど、自分で好きな機能を追加するのが Nucleus流なのだ。
というわけで、欲しいものリストは、
・サムネイル付きで画像アップロードのプラグイン
・アクセス解析のプラグイン
なのだ。

「NP_Analyze.php 多機能かつインストールが容易なアクセス解析プラグイン」を、入れようとしたら、
現在、セキュリティチェックのため配布を停止しています。配布再開の見通しは立っていません。
だった。残念。

本家にいってみてもアクセス解析はなさそう。データベースから読むのをトリガーにして、Apacheの情報とページ情報をしまうような簡単のがあるかと思ったんだけど。
もっとも集計画面とかは面倒だろうけど。いや MySqlのSQLで一発かも。
なければ Analogの出番かなぁ。
とりあえず画像関係のは、
NP_PopupImageGD.php
A modified version of PopupImageNetPBM based on GD grahpic library version 2 or more (it also works with GD version 1 but you will have to modify the plugin yourself).
があった。

日本のpluginsも覗くと、NP_Thumbnail.php、NP_CustomThumbnail.phpがあった。
NP_Thumbnail.phは、ページ表示の都度動的に生成するバージョンと、DB内に保存して呼び出すバージョンでサムネイル画像を扱うらしい。リクエストの都度、生成したりデータベースを動かすのもどうかなぁ。フォルダに入れといて管理するのが簡単なんだけど。

NP_CustomThumbnail.phpは、サムネイル画像をmedia/thumbnailに保存するとのこと。いいじゃないの。
ダウンロードして一応コードを覗いてみる。
プラグインの仕様ってのはまだ解らないけど、画像の転送は昔やってことがあるので様子はわかるかも。やっぱり、gifとjpegとpngを別に処理してる。
いやー、大変そうだということだけわかった。

早速入れて、画像アップロードをテストしてみる。
わかったことは、
サムネールの指定寸法が、実寸法より大きいときは、画像は実寸法で埋め込まれる。ポップアップしない。
サムネールの指定寸法が、実寸法より小さいときは、画像はサムネールの寸法に縮小されて、ポップアップのリンクがつけられる。
おー、お利口だ。
ごきげんじゃん。

サンガツさんありがとう。ありがたく使わせていただきます。m(_ _)m

これで早速ブログがかけます。
あーっ、その前にブログ用のスキン作らねば。

まずいなっ。同じスキンをコピーして展開しようとするとファイル内のスキン名が同じだから、
次のスキン名がぶつかります: enlighten
次のテンプレート名がぶつかります: enlighten/index and enlighten/item
とでる。うー、マイナーチェンジでお茶を濁そうとしたのけどだめそう。
新しいスキンを入れてそれを変更することにする。

画像右配置、文字流し込み

一つ気になっているのが、右側に画像をおいて文字を回り込ませるのができないこと。

<div class="rightbox"><%image(20080221-dummy80cu.gif|80|77|これは右にいれる)%></div>

defaultのスキンと、Grey Gradientは問題なく右に表示されるんだけど、そのほかのスキンは単に左に画像が表示され、文字の回り込みも起こらない。

試しにスタイルシートの
.rightbox {
float: right;
border-left: 2px solid #ccc;
}
と同じことを、
<div class="rightbox"></div>
に追加してみたら期待通りに動いた。

<%image(20080221-dummy80cu.gif|80|77|これは右にいれる)%>


当面はこれでいけばいいんだけど、原因はなんなんだろう。
でも気になる。構成が複雑でブラウザが解釈できないとか、最初にスタイルシート読んでも使うときになったら忘れちゃってるとかだったりして。

2008年3月5日水曜日

Nucleus 管理ページを隠す

Nucleusの管理ページを隠す

www.example.com/blog/にNucleusを置くと、管理ページの入り口は defauletでお約束の、
http://www.example.com/blog/nucleus/
になる。
これじゃ、Nucleusを
http://www.example.com/blog/
でブログを動かしてるのがわかったら、「入り口はこの下 -> nucleus/」ってバレバレではありませんか。

あんまり危機意識がないと見られるのも困るので、せめて
http://www.example.com/blog/abc0001/index.php
みたいに、見つかりにくいURLにしたいもんだ。

確か、config.phpにディレクトリを指定した場所があったので変更する。

// mySQL connection information
$MYSQL_HOST = 'localhost';
$MYSQL_USER = 'sampleadmin';
$MYSQL_PASSWORD = 'sampleadmin';
$MYSQL_DATABASE = 'Nucleus';
$MYSQL_PREFIX = '';

// main nucleus directory
$DIR_NUCLEUS = '/home/example/public/abc0001/'; <- ココ変える

// path to media dir
$DIR_MEDIA = '/home/example/public/media/';

// extra skin files for imported skins
$DIR_SKINS = '/home/example/public/skins/';

// these dirs are normally sub dirs of the nucleus dir, but
// you can redefine them if you wish
$DIR_PLUGINS = $DIR_NUCLEUS . 'plugins/';
$DIR_LANG = $DIR_NUCLEUS . 'language/';
$DIR_LIBS = $DIR_NUCLEUS . 'libs/';

// include libs
include($DIR_LIBS.'globalfunctions.php');
if (!extension_loaded('mbstring')) {
include($DIR_LIBS.'mb_emulator/mb-emulator.php');
}
?>

管理画面にアクセスすると、なんと、画面が崩れてしまった。

ソースを見てみると、
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Test001 - Admin</title>
<link rel="stylesheet" title="Nucleus Admin Default" type="text/css" href="http://www.example.com/blog/nucleus/styles/admin.css" />
<link rel="stylesheet" title="Nucleus Admin Default" type="text/css"
href="http://www.example.com/blog/nucleus/styles/addedit.css" />
<script type="text/javascript" src="http://www.example.com/blog/nucleus/javascript/edit.js"></script>
<script type="text/javascript" src="http://www.example.com/blog/nucleus/javascript/admin.js"></script>
<script type="text/javascript" src="http://www.example.com/blog/nucleus/javascript/compatibility.js"></script>

スタイルシートのパスが通っていない。これじゃ崩れるはず。
config.php以外にURLを設定する場所があるらしい。

ファイルのぞいたがすぐには見つからないので、アプローチをかえる。
nucleuのデータベースを見ると nucleus_configが怪しそう。(phpmyadmin)

早速、ここを http://www.example.com/blog/abc0001/に書き換える。
注意:PluginURL http://www.example.com/blog/nucleus/plugins/
も変えないと、プラグインのリストがでなくなる。

これで、
http://www.example.com/blog/abc0001/
にアクセスすると、いつもの管理画面が表示された。


さて、動いたことは動いたんだけど、一応ファイルでも調べておきたいもんだ。

ADMIN.phpにURLを決めている場所があった。
<meta http-equiv="Content-Type" content="text/html; charset=<?php echo _CHARSET ?>" />
<title><?php echo htmlspecialchars($CONF['SiteName'])?> - Admin</title>
<link rel="stylesheet" title="Nucleus Admin Default" type="text/css" href="<?php echo $baseUrl?>styles/admin.css" />
<link rel="stylesheet" title="Nucleus Admin Default" type="text/css"
href="<?php echo $baseUrl?>styles/addedit.css" />
<script type="text/javascript" src="<?php echo $baseUrl?>javascript/edit.js"></script>
<script type="text/javascript" src="<?php echo $baseUrl?>javascript/admin.js"></script>
<script type="text/javascript" src="<?php echo $baseUrl?>javascript/compatibility.js"></script>

4955: $baseUrl = htmlspecialchars($CONF['AdminURL']); <- これで設定しているようだ
4963: <link rel="stylesheet" title="Nucleus Admin Default" type="text/css" href="<?php echo $baseUrl?>styles/admin.css" />
4964: <link rel="stylesheet" title="Nucleus Admin Default" type="text/css"
4965: href="<?php echo $baseUrl?>styles/addedit.css" />
ほかにも、showlist.phpにあったけど、こっちは見るからにハズレ。

207: $baseUrl = 'index.php?plugid=' . intval($current->pid) . '&action=';

さらに
ADMIN.phpをみると
<td><input name="AdminURL" tabindex="10040" size="40" value="<?php echo htmlspecialchars($CONF['AdminURL']) ?>" /></td>

これみたい。ここで入力してデータベースに入れているのだ。
なんだ、「グローバル設定」の「管理者領域のURL (最後にスラッシュ "/" を付けてください)」じゃあ、ありませんか。(- -);

というわけで、良い子の皆さんは、最初に「グローバル設定」をやって、次にconfig.phpを書き換えてください。

2008年3月3日月曜日

NucleusとWordPressとBlogger.com

三つのブログのシステム

Googleが買収した Blogger.com(このブログが動いてるサイト)の、ブログシステムのインターフェイスは良くできていてなかなか使いやすい。

Blogger.comのユーザ・インターフェースのレイアウトはWordPressに似ているけど、テンプレート(=Nucleusのスキン)がHTMLなところは Nucleus似だ。しかし、HTMLで書かれたテンプレートにページ要素(=Nucleusのテンプレート)をはめ込むデザインは、Blogger.comの方が Nucleusよりシンプルに見える。

Blogger.comのページ要素はこんなのだ。
<b:widget id='Header1' locked='true' title='ブログタイトル (Header)' type='Header'/>
<b:widget id='Blog1' locked='true' title='ブログの投稿' type='Blog'/>
<b:widget id='AdSense1' locked='false' title='' type='AdSense'/>
<b:widget id='BlogArchive1' locked='false' title='ブログのアーカイブ' type='BlogArchive'/>
<b:widget id='Profile1' locked='false' title='自己紹介' type='Profile'/>

Blogger.comでは、スタイルシートは Nucleus/skins/defaultのdefault_left.css、nicetitle.css、default_right.cssみたいな外部スタイルシートではなくて、テンプレート自体の最初の方にダーッと書いてある。[HTMLの編集]で表示されるテンプレートファイル400行のうち、スタイルシートの部分が 350行、 <body></body>の部分は50行しかない。( [HTML の編集]ページの「テンプレートをダウンロード」で得た template-99999999999999999.xmlは、スタイルシートの部分は同じだけど <body></body>の部分は550行だった。)
blogger.comのtemplate-99999999999999999.xmlはこんな。
<?xml version="1.0" encoding="UTF-8" ?/>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
<html expr:dir='data:blog.languageDirection' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'/>
<head>
  <b:include data='blog' name='all-head-content'/>
  <title><data:blog.pageTitle/></title>
 <b:skin><![CDATA[/*
 ....css350行......
 ]]></b:skin>
</head>

<b:includable id='title'>
<b:if cond='data:imagePlacement == "REPLACE"'>
 ..........
<b:else/>
 ..........
</b:if>
</html/>
Nucleusのdefault/navigation.incはこんな。
<nucleusskin>
 <meta>
  <skin name="default" />
  <template name="default/index" />
  <template name="default/item" />
  <info><![CDATA[Nucleus CMS Default Skin]]></info>
 </meta>

<%if(skintype,archivelist)%>
 ..........
<%endif%> //....elseはないんだろうか

記述方法は違うがBlogger.comのテンプレートは skinbackup.xmlとイメージが似ている。考え方が近いんだろうけど、実現の仕方で違いが出たという感じみたい。でも、ページ要素(Nucleusのテンプレート)をドラッグして並べ替えられるとかインターフェイスに気合い入れてる。

Blogger.comのページは、WordPressやNucleusみたいにリクエストのたびに組み立てるのではなく、MovableTypeのようにスタティックのページを生成するように見える。スタティック生成のシステムはアクセスが多い時有利だ。だけど、そうだとするとテンプレートを変えたとき全ページの生成が行われることになるから、ユーザが沢山いてせっせとブログを更新するときは負荷が高まる。cssや js、includeなどの読み込む外部ファイルが沢山あると不要なオーバーヘッドが増えるから、ファイルをまとめてサーバーの負荷を減らしてるみたいだ。自前で作るとこういうとこまで対応できていいよね。
シンプルな構成で、使うファイルが少なければ、ファイルの読み込み時間からして少なくてすむよね。gzipでページを圧縮してるし、レスポンスの向上のためにできることはなんでもやるつもりみたいだ。ヘッドのシーク1回で準備が整うなら実行時間もHDDの消耗も電力消費もも少なくてすんで、エコでいいんじゃないかなぁ。

WordPress、Nucleus、Movable Typeの 動きを Google Trendで見てみた。

Movable Typeはどんどん利用者が減っているようでグラフでは0をめざしてるけど、日本ではWordPressより人気らしい。日本の標準、世界の非標準かな。携帯みたい。それにしても東アジアはすごいな。インドもWordPress、Nucleusを同じくらい使ってるぞ。

.....elseはないんだろうか
nucleus/libs/PARSER.phpのfunction doAction()中に、
107: if (!$this->handler->if_currentlevel && ($actionlc != 'else') && ($actionlc != 'elseif') && ($actionlc != 'endif') && ($actionlc != 'ifnot') && ($actionlc != 'elseifnot') && (substr($actionlc,0,2) != 'if'))
というのがあったから使えそうだ。

「バージョンアップで else が使えるようになった」とどっかで読んだんだけど、wordpressかと思った。 ... 混乱してる。caseだっけ。

2008年2月29日金曜日

Nucleus アーカイブをリスト表示 + NP_ListArticlesByNameプリフィックス対応

Nucleusでもアーカイブのリスト表示

wordPressでできたんだから、Nucleusでもアーカイブをリストで表示したい。

プラグインを探しにいこう。
プラグイン一覧(機能カテゴリー別)iには無いらしい。本家にいってみる。
「プラグイン・カテゴリ別」の中にanandさんが作った
NP_ListArticlesByName.php
   A plugin which will allow you to list recent articles by name.
があった。フォーラムに置いてあると書いてある。
フォーラムにはphpのコードと説明が載っている。「(コード)をコピーして、『NP_ListArticlesByName.php』という名前でセーブしろ」と書いてあった。
早速その通りにしてファイル「NP_ListArticlesByName.php」を作る。

ftpで nucleus/plaginにNP_ListArticlesByName.phpアップロードして、[サイト管理][プラグイン管理]で「プラグインのインストール」をすると、エラーがでた。
Parse error: syntax error, unexpected '"', expecting ',' or ';' in /home/nucleususer/www/nucleus/plugins/NP_ListArticlesByName.php on line 40

40: echo "<a href=¥"".$itemlink."¥">".$row['title']."</a>";
UTFで保存したので、¥がだめそう。
40: echo '<a href="'.$itemlink.'">'.$row['title'].'</a>';
に変更し、他の場所も同じように直す。
「プラグインの管理」ページを再読み込みすると、「List articles by name」のプラグインが増えた。

スキンの書き換え

サイドバーにArchiveのタイトルを表示したい。
「NP_ListArticlesByName」はスキン変数だから、スキンにいれるんだろう。
[プラグイン]の[スキンファイル]で、今使っているスキン grey_gradient の sidebar.incにコードを挿入してみる。

作者のanandは挿入するコードを、
  <%plugin(ListArticlesByName(50))%>...(50アイテム表示なら)
と書いていたが、あとで Trentが
  <%ListArticlesByName(50)%>
がいいと書いていた。Trentのコードを使うことにする。

「ファイルの編集 sidebar.inc」でコードを見るけど、Navigationという場所が沢山あってどこにいれたらいいか迷ってしまう。
<!-- search: navigation -->
<%if(skintype,search)%>
<dd><a href="<%todaylink%>" title="Today's entry">Today</a></dd>
<dd><a href="<%archivelink%>" title="Archives">Archives</a></dd>
<%endif%>

<dd><%ListArticlesByName(50)%></dd>//ここに入れてみる。

<!-- admin link, only visible if logged in -->
<%if(loggedin)%>
<dd><a href="<%adminurl%>" title="Admin Area">Admin</a></dd>
<%endif%>
</dl>
</div>

「保存」を押す。
....「メッセージ: ファイル sidebar.inc を保存しました。」と表示された。

最初はこんな。


さて、ページを再読み込みすると、
おーっ! リストだぁ。やったね。

まだローカルのテストマシンで動かしているので、実際に見てもらえなくてごめんなさい。

「NP_ListArticlesByName」は55行のプラグインなのでコードが一目瞭然だから、Nucleusの動きが少しわかったような...。
「プラグインのインストール」を押すと、プラグインを追加するプログラムがコードを確かめて、NP_を外した「ListArticlesByName」をどっかの定義場所に追加しているみたいだ。プラグインは、MySqlのnucleusのデータベースのテーブルnucleus_pluginに登録されてるらしい。Nucleusのタグを解釈しながらページを組み立ててるんだ。きっと。
ページを表示するとき、<%ListArticlesByName(50)%> があったら、NP_ListArticlesByName.phpをIncludeするとかそういうことかな。
登録してあるNP_ListArticlesByName.phpを無理矢理削除すると、アーカイブリストが表示されなくなるから、nucleus/plagin/NP_ListArticlesByName.phpを、表示のたびに読んでいるらしい。

今後の課題:
wordPressでやったように、NP_ListArticlesByName.phpに <select>要素を書けば、ドロップダウンで表示できるかも。

不具合発見:
「grey_gradient」の「Navigation」の「Previous Item」と「Next Item」は表示が逆みたいだ。
「Previous Item」をクリックすると、次のアイテムが表示されちゃう。
後で直さなきゃ。

あれ?:
www2.blogger.comは昨日の11:40ごろ(日本時間2008.02.28 11:40)サーバーが反応なかったけど何かあったのかな。気のせいかその後動きが少し悪いような気がして。


追加:プリフィックスをつけたテーブルがあると不具合
別のマシンでNP_ListArticlesByName.phpをテストをしたら、
Error!

プラグインが読み込めませんでした。もくは、使用中の Nucleus 上で動作させるために必要な機能が、プラグインでサポートされていません。(管理操作履歴に詳細があります。)
というエラーが出てプラグインとして組込めない。

管理操作履歴には
2008-03-01 20:14:43 [sample1] Plugin NP_ListArticlesByName was not loaded (does not support SqlTablePrefix)
と書かれていた。
NP_ListArticlesByName.phpは プリフィックスに対応していないらしく、プリフィックスチェックが行われていないようだ。

NP_ListArticlesByName.phpに
function supportsFeature($feature) {
switch($feature) {
case 'SqlTablePrefix':
return 1;
default:
return 0;
}
}
を挿入する。
これでエラーが消え、NP_ListArticlesByName.phpがインストールされた。

実行時(表示時かな)すると、プリフィックスをつけたテーブルにより不具合がでる。
mySQL error with query SELECT i.inumber as itemid, i.ititle as title FROM nucleus_item as i WHERE i.iblog=1 and i.idraft=0 and i.itime<="2008-03-01 21:31:07" ORDER by itime DESC LIMIT 0,50: Table 'nucleus.nucleus_item' doesn't exist <- ホントは'nucleus.nc1_nucleus_item'

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/sample1/web/nucleus/nucleus/plugins/NP_ListArticlesByName.php on line 45
 35: . ' FROM nucleus_item as i'

 35: . ' FROM '.$MYSQL_PREFIX . 'nucleus_item as i'
に変更し、

 global $MYSQL_PREFIX;

を追加してupload。「登録リストのアップデート」をクリックして、登録し直す。



追加:プリフィックスをつけたテーブルがあると不具合を増やしたので、
以前このページに置いていた調べたついでは、いずれ別ページに掲載の予定。