関連オブジェクト

2006年04月13日(木) 11:09

ホスティングや重さの問題でCOREBlog2をあきらめてDjangoでへっぽこblog&CMSを作っているわけですが、どうしても欲しい機能があります。
それは関連コンテンツです。
Plone2に由来する関連コンテンツですが、COREBlog2の関連オブジェクトはPlone2のそれと違い、オブジェクトのタイプによってはコンテンツ内にインライン表示することが出来ます。COREBlog2の人たちがブログに画像を表示していたらそれはきっと関連コンテンツです。
画像ファイルをアップしてイメージタグを用いて表示するのに比べてなにがイイかというと、画像を削除すると関連させていたエントリの表示からも消えるとか、イメージ以外のオブジェクトもインライン表示できたりとか、そんなところです。

なので、野望としては関連コンテンツをこのblogに実装してやるぞ、と。

Djangoにはcontent_typesというModelが備わっていて、各アプリケーションのModelが自動的にそこにしまわれます。
関連コンテンツ用のモデルは次のようにすればブログのエントリと別のモデル(エントリを対象にも出来るけど)に関連を持たせることが可能です。

class RelatedItem(models.Model) :
    content_type = models.ForeignKey(ContentType)
    main_object_id = models.IntegerField(_('main object ID'))
    related_object_id = models.IntegerField(_('related object ID'))
    pub_date = models.DateTimeField(auto_now_add=True)

    class Admin :
        list_display = ('content_type', 'main_object_id', 'related_object_id', 'pub_date')
    class Meta :
        ordering = ("-pub_date",)

    def get_related_object(self):
        try:
            return self.content_type.get_object_for_this_type(pk=self.related_object_id)
        except ObjectDoesNotExist:
            return None

ContentTypeのget_object_for_this_typeというファンクションは対象のContentTypeのテーブルから正しい型でデータを取得してくれます。このModelの場合は、元のコンテンツタイプはblogのEntryであると規定してしまっていますが、もう一つContentTypeをForeignKeyフィールドにとれば、逆から辿ることも出来るようになるでしょう。
こんな調子でとりあえずは画像のModelとダウンロード用ファイルのModelを作りました。
まだアップロードとか関連づけがDjangoの管理画面からしかできませんが、比較的簡単に新しいModelとModel専用の小さなテンプレートの追加が出来るようになっているので、そのうち整理して公開してみようかな。
関連させるModelもDjangoのモデルなので、「最近追加されたなんとか」も簡単に実現可能(ただしModelごちゃまぜは「最近関連させたなんとか」みたいなもの以外は大変そう)。

ローカルの現状動作はこんな感じ(画像と、下の方のファイルへのりんくっぽいやつ)。

 Move to COREBlog2

2005年12月02日(金) 11:46

サーバ移転に伴い、COREBlogをCOREBlog2に移行してみました。

なかなか面白そうですが、いままでカスタマイズした部分は移行し切れていないものが結構あります。
なぞも沢山ありますが、CMS/Blog EXchangeに行くといろいろ学べるかもしれないと期待。

今のところ困っているのは、

  1. ページングしているとだんだんURLが長くなる現象発生中
  2. 全角の数字が文字化けしてる(ソース上では化けてない)
  3. エントリ毎にAdsを貼る方法がわからない(1ページに3つまでしか出してはいけないので)
  4. rdf10_xmlにdescriptionを出力しようとすると文字化けする
  5. 別スキンで複数のCOREBlog2を入れたい(メーリングリストにもあがっているようなので待ち)
  6. Extendが無いのに、続きを読むのリンクが出てしまう
  7. デザインのカスタマイズ
  8. amazonの関連づけが消えてしまった(これはATBookshelfで解決しよう)


他にも、tracも0.82から0.9にバージョンをあげた(0.9でのGoogleSitemaps対応もメモを作成しよう)。

 COREBlogのアーカイブリンクをシンプルにする

2005年11月17日(木) 08:32

COREBlogのアーカイブリンクをシンプルにする。

アーカイブへの月毎リンクが結構な数になってしまったので、シンプルにしてみた。
いつも通りDTMLをごにょごにょしてごまかそうとした所、DTMLは変数をぐりぐりすることが出来ないことに気づく(今頃かい・・・)。

ついにCOREBlogのソースコードをいじってしまった。
※COREBlog1.2を対象にしています。
 参考にして壊れても知りません。
 またZopeのコード記述に関する定石も知らないので、いい加減なコードです。

まず、modulesのarchivesをZMI上でコピーペースとしてarchives2というDTMLMethod?を作る。

archives2
<dtml-unless module_item_count>
<dtml-call "REQUEST.set('module_item_count',15)">
</dtml-unless>
<dtml-let prev_year="0">
<h3><dtml-if "_.len(document_title)>0"><dtml-var document_title><dtml-else>ARCHIVES</dtml-if></h3>

<ul>
<dtml-in prefix="year_loop" expr="month_archive_items2(count=36)">
<dtml-if year_loop_odd><li class="odd">
<dtml-elif year_loop_even><li class="even">
</dtml-if>
<dtml-in prefix="month_loop" expr="year_loop_item" mapping reverse>
<dtml-if expr="month_loop_number == 1">
<dtml-var year>:
</dtml-if>
<a href="<dtml-var blogurl>/monthlist_html?year=<dtml-var year>&month=<dtml-var month>"><dtml-var month></a> 
</dtml-in>
</li>
</dtml-in>
</ul>
</dtml-let>


COREBlogのCOREBlog.pyを修正する。
def month_archive_items(self,count=1,start_year=0,start_month=0):のメソッドの下あたりに追記する。

    security.declareProtected(View, 'month_archive_items2')
def month_archive_items2(self,count=1,start_year=0,start_month=0):
""" Return list of year/month archive. """
count = r2i(count,1)
start_year = r2i(start_year,0)
start_month = r2i(start_month,0)
if start_year == 0 or start_month == 0 or start_day == 0:
#Base date is today
t = localtime(time())
year = t[0]
month = t[1]
else:
year = year
month = month

ret_l = []
ret_d = {}
cnt = 100 #limitter
while cnt > 0 and count > 0:
if not self.datemap.has_key(year):
cnt = cnt - 1
month = 12
year = year - 1
continue
year_s = self.datemap[year]
if year_s.has_key(month):
if ret_d.has_key(year):
ret_l = ret_d[year]
else:
ret_l = []
ret_d[year] = ret_l
ret_l.append({"year":year,"month":month})
count = count - 1
month = month - 1
if month < 1:
month = 12
year = year - 1
cnt = cnt - 1
ret_x = []
for k in ret_d:
ret_x.append(ret_d[k])

return ret_x
COREBlog.pyへの変更を反映するために、リフレッシュかZopeの再起動をする。
modulesのindex_htmlにあるdtml-varをarchiveからarchive2に変更する。
終わり

 カテゴリ別RSS

2005年08月07日(日) 10:13

結局、Django関連ブログのfeed一覧に、日本語で問題なければ追加してもらえるように依頼してみた。
ただ、現状のままだと流石に問題がある(djangoなんてほんの一部しか登場しないでしょ)ので、カテゴリ別RSSのdtmlを作って(もともとある?発見できず)、登録の依頼をした。
依頼をしたURLは下記:
  • http://www.everes.net/category_rdf10_xml?cat_id=18

一応、wikiにCOREBlogのカテゴリー別RSSのコードをメモした。
RSSのコードをコピペして書いただけだけど、気になる人→「これ(リンク)」です。

さて、登録されるか?

 白井ヴィンセント

2005年07月06日(水) 06:21

白井ヴィンセント登場!


Z56が仕方ないことにったのは諦めて、白井ヴィンセントの活躍を楽しみにしてみる。
Z56のいない時代のサクサクを知らないので、強烈にきもかわいいZ56がいなくなったショックはやはりでかいけど。


で、試しに今日のSakusakuのメニューを右側のサイドバーに表示してみた。

PythonとZopeで今週のSakusakuを無理矢理RSS化して、RDFSummaryで再読み込みをしています。
ちょっとおもしろいので、PHP/Python/Ruby/Javaで同じ事をしたらどういうコードになるかをやってみようと思います。
PHPはHTMLパーサが無いので、知人がお手製のパーサを使って作成済み。
PythonはZopeのパッケージにした(テスト運用中)。
Rubyは若いのが学習中(遠い)。
Javaはデータの解析まで終了(Web化が面倒)。

さて、Ruby版は完成するか!?

 Google Sitemaps

2005年06月19日(日) 11:09

超手抜きな COREBlog用のGoogle SitemapsDTMLMethodを追加。


 きちんとCOREBlogのソースを追って、きちんとしたものを作成すべきだけど、思い立ってから嫁に寝ると宣言した時間まで30分しかないので、手抜きになりました。

DTMLMethodとしてgoogle_sitemapsというファイルを追加して、次のような内容にしました。
とりあえず、google sitemapsにサブミットしましたが結果が出るのは数時間後だそうで。
#サブミット時にエラーがでないということはパースエラーはないということか?

googleに怒られました!

ので、一部改修

ここから<br>

<br>

&lt;dtml-comment&gt;<br>

##########################################<br>

google_sitemaps.dtml<br>

<br>

for google sitemaps 0.8.4<br>

<br>

Copyright 2005 everes.net <br>

Licensed under the Apache License, Version 2.0 (the "License");<br>

you may not use this file except in compliance with the License.<br>

You may obtain a copy of the License at<br>

&nbsp;&nbsp;&nbsp; http://www.apache.org/licenses/LICENSE-2.0&nbsp; <br>

Unless required by applicable law or agreed to in writing, software<br>

distributed under the License is distributed on an "AS IS" BASIS,<br>

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<br>

See the License for the specific language governing permissions and<br>

limitations under the License.<br>

##########################################<br>

&lt;/dtml-comment&gt;<br>

&lt;dtml-call
"RESPONSE.setHeader('content-type','text/xml')"&gt;&lt;?xml
version="1.0" encoding="&lt;dtml-var management_page_charset&gt;"?&gt;<br>

&lt;urlset xmlns="http://www.google.com/schemas/sitemap/0.84"&gt;<br>

&nbsp;&nbsp; &lt;url&gt;<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;loc&gt;&lt;dtml-var blogurl&gt;&lt;/loc&gt;<br>

&lt;dtml-in "rev_day_entry_items(count=1)" size=1&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;lastmod&gt;&lt;dtml-var
"date_created().HTML4()"&gt;&lt;/lastmod&gt;<br>

&lt;/dtml-in&gt;<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;changefreq&gt;always&lt;/changefreq&gt;<br>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;priority&gt;1.0&lt;/priority&gt;<br>

&nbsp;&nbsp; &lt;/url&gt;<br>

&lt;dtml-in "entry_items()"&gt;<br>

&nbsp;&nbsp; &lt;url&gt;<br>

&nbsp;&nbsp;&nbsp;&nbsp; &lt;loc&gt;&lt;dtml-var blogurl&gt;/&lt;dtml-var id&gt;&lt;/loc&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;
&lt;lastmod&gt;&lt;dtml-var "date_created().HTML4()"&gt;&lt;/lastmod&gt;<br>

&nbsp;&nbsp;&nbsp;&nbsp; &lt;changefreq&gt;never&lt;/changefreq&gt;<br>

&nbsp;&nbsp;&nbsp;&nbsp; &lt;priority&gt;0.5&lt;/priority&gt;<br>

&nbsp;&nbsp; &lt;/url&gt;<br>

&lt;/dtml-in&gt;<br>

&lt;/urlset&gt;<br>

 RDFSummaryでdeliciousのRSSを表示

2005年05月18日(水) 05:53

deliciousのブックマークRSSをCOREBlogのサイドボックスに追加してみた。
毎度の事ながら、Zopeには欲しいな・作ろうかな、という物が既に作られている。
COREBlogの再度ボックスに他サイトRSSを表示する方法を二つ確認しましたので、
二つともやってみました。
おのおのメリットデメリットがあります。
方法1はcronとスクリプトを配置・実行する権限をサーバに有している必要があります。
しかし、クライアントからのアクセスに依存せずにシステムが定期実行するので、クライアントの表示時に余計な時間を費やしません。
方法2はZopeのみで完結します。また、アクセスが全くなければネットワークトラフィックを使用しませんし、delicious以外のrssにも使用可能です。
しかし、クライアントからのアクセス時にキャッシュの有効期限が切れていた場合には、その時点でdeliciousにアクセスし、最新の状態を取得しま す。この際deliciousとの間でネットワーク的な問題が起きた場合、自サイト自体の表示に時間がかかってしまいます(このあたりは、ajaxを使用 して自サイトサーバをプロキシにしてRSSを取得するか、方法1の用にクライアントアクセスとは別のキック方法にするしかないでしょうけど)。
以下、やってみた方法。

方法1:
Local File Systemプロダクトとdelicious-pyを使用し、cron等で定期実行する方法。
blogSetomitsさんのやりかたをほぼそのまま(poloneスキン用に書き直してあります)。

1.Local File Systemを持っていない場合は、Zopeにインストールします。
 持ってないかどうかの判断は、ZMIでオブジェクトを追加しようとしたときの一覧を見ればわかります。
 一覧に表示された場合は2へ飛びましょう。
1.1Local File Systemのインストール方法
 ここからLocalFS-1.3-andreas.tar.gzをダウンロードして、Zopeインスタンスのプロダクトディレクトリに配置します。
 配置したら(権限に気をつけて)、Zopeを再起動します。
 以上。
2.delicious-pyをインストールする。
 delicious-pyはdeliciousのAPIをpythonで使用できるようにしたものです。
 インストールといっても、次に作成するpythonのスクリプトで正しくインポートできればよいので、
 サーバの好きな場所に置きましょう。
3.delicious-pyを使用するpythonスクリプトを書く。
 これ(blogSetomitsさんのコードにほんの少し手を入れたもの)のuserとpasswdを自分のdel.cio.usのものに書き換える。
 pathも好きな場所に書き換える。
 countは最大表示件数を指定。
4.cronで3を定期実行する。
5.COREBlogインスタンスのmodulesにLocalFileSystemオブジェクトを作成。
 IDは任意のものを使用し、pathには3のpathのディレクトリ部分を設定。
6.COREBlogインスタンスのmodulesにDTMLMethodオブジェクトを作成。
 次のように記述をする(dtml-widh tmpのtmpは、5で追加したオブジェクトのID)。
    <h3><a href="http://del.cio.us/user"
target="_blank">My del.icio.us</a>
</h3>
<dtml-with tmp>
<dtml-var mydelicious.list>
</dtml-with>
7.COREBlogインスタンスのmodulesのindex_htmlの任意の場所に次の行を追加(dtml-var my_deliciousのmy_deliciousは6で追加したDTMLMethodのID)
    <dtml-var my_delicious>

方法2:
RDFSummaryを利用する方法。
JuNyaさんの方法そのまま。

1.RDFSummaryのインストール。
 ここからRDFSummary-2-4p1.tgzをダウンロードして、Zopeインスタンスのプロダクトディレクトリに配置します。
 配置したら(権限に気をつけて)、Zopeを再起動します。
 以上。
2.COREBlogのmodulesディレクトリにRDFSummaryオブジェクトを追加する。
 IDはdeliciousRDFとでもしてください。
 URLはhttp://del.cio.us/rss/user(userはあなたのdeliciousのユーザ名)にします。
3.COREBlogのmodulesディレクトリにDTMLMethodオブジェクトを作成。
 次のように記述する(2でIDをdeliciousRDF以外にした場合は、置換してください)。
    <dtml-try>
<dtml-if "(ZopeTime() - deliciousRDF.lastupdated())*24*2 > 1">
<dtml-call "deliciousRDF.update()">
</dtml-if>
<dtml-except>
<dtml-call "deliciousRDF.update()">
</dtml-try>

<h3><a href="<dtml-var "deliciousRDF.channel()['link']">" target="_blank">
<dtml-if "_.len(document_title)>0">
<dtml-var document_title>
<dtml-else>
my delicious
</dtml-if></a></h3>
<ul>
<dtml-in "deliciousRDF.items()" mapping size=module_item_count>
<dtml-if sequence-odd><li class="odd">
<dtml-elif sequence-even><li class="even">
</dtml-if>
<a href="<dtml-var link>" target="_blank"><dtml-var title></a>
</li>
</dtml-in>
</ul>
4.COREBlogインスタンスのmodulesのindex_htmlの任意の場所に次の行を追加(dtml-var deliciousのdeliciousは3で追加したDTMLMethodのID)
    <dtml-var delicious>


 コメント権限

2005年05月16日(月) 09:14

コメントがつけられない権限設定になっていました。
たいていログインした状態でコメントつけてたから気づかなかった。。。

ZMIからSecurityタブを開いて、Add COREBlog Comments権限にAnonymousを追加。
それだけ。いや、知らなかったわけでは・・・

というわけで、コメントつけられます。
#だれか見てるかというのはおいておこう

 用途別レンタルサーバ

2005年04月16日(土) 10:09

このblogはZope上で動作するCOREBlogで運用しています。
COREBlogを動作させるために超えるべきハードルは結構高いので、僕がブログを始めたころは、自宅サーバをわざわざたててZopeとCOREBlogを乗せていました。
子供が生まれて、サーバが危険にさらされるようになったため、外にブログのスペースを借りることを考えました。
驚いたことに、つい数年前は英語のサポートのみで5000円位していたサービスが日本のサービスでも250円程度で借りられる時代になっていました。
サービス
種別 価格(最低月額) 特徴
専用サーバ ¥10290 ハード一台を借り切ってしまうタイプ。
このタイプでこの値段はあり得ない。
別途初期費用が必要。また、アダルト等は禁止。
月間転送量が制限されていないようなので、アダルト禁止は妥当かな。
Webで管理できるツールがデフォルトでインストールされている。
簡単なエンタープライズ用途に向いていると思います。
OSはFedoraかRHが選択できるようです。
vps7
VPS ¥980 ハード一台に48人が別のOSインスタンスで収容される。FreeBSDのjailという機能でroot権限が付与され、シャットダウンさえも可能となっている。
殆ど共用ハードウェアであることを意識することはありません。
基本的にはシェルで管理する必要があるので、素人はお断りのようです。
また、支払いはPayPalを利用しており、個人情報は全くvps7にはわたりません。
自己責任でどのようなサービスでもかまわないようです。
容量は5G(うちシステムで1G弱使用)、月間転送量は15Gです。
※Zope/COREBlogは、Portsで簡単に入ります
OSはFreeBSDのVPSです。

追記(2005/08/08) 規約が変更になり、価格等変更されています。
バーチャルホスト ¥263 この値段で、200MBのスペース(WEBとメールで)が利用できて、MySQL・CGI・php・rubyが使用できます。
ドメインを持っていればバーチャルホストができます。
ただし、このページで紹介しているサーバの中で唯一自由がききません。
Movable TypeやXOOPSが使いたいだけであり、容量も200MB程度で問題なければ最強です。
※Zope/COREBlogは使用できません

追記(2005/08/08) 容量300MBのタイプで月額315円のプランも登場しています。
自宅サーバ
専用サーバ ¥1000 実は意外とコストがかかります。
関東の電気代は1kwで23.5円かかります。
マシンパワーのない停電力動作のマシンでひとつき稼働した場合には、60w*24*30=43.2kw。
43.2kw*23.5=1015.2円ですね。
また、夏は発火の危険にさらされ、停電時にサーバが止まる悲しさもあります。

 flickr

2005年04月09日(土) 02:39

flickrの自分の最新画像を一番上にいれてみました。
flickr自体、ちょっと前に登録したまま全然使ってなかったんだけど、Yahooに買われたニュースで気になってちょっと使ってみた。

こんな感じのスライドショーも自動的にできるし、最新サムネイル画像もきちんと四角にしてくれる等こまい部分が使い勝手いい!無料版なので、月に10MBまでしかアップできないけど、どうせWEB用なんて1枚200kb程度だから大丈夫だろう。

flickrの自分の画像からblogを書くこともできるみたいだけど、blogツールはCOREBlogを使いたいから(参照すりゃいいんだけど)blog用の画像はZMIからちこちこアップして使う予定。flickrだけでフォトログとしては十分だし。

OSX用の画像アップツールもいかすぞ!

 
ponybadge

Powered by

Feedbacks

Tweets

Tags

Calendar

1 2