そうなんですよ!

2005年03月30日(水) 01:57 この記事をクリップ!

 

そうなんですよ!
最近おもしろいスパムがこなくて寂しい思いをしていたところにこの機能。
絶対拒否にする物かと思っていたけど、702NKにしたら、細かい設定ができるのかできないのかよくわからず、結局全拒否設定。。。

ここに見に行けばいっかぁ

 ブラックホールSmtpサーバ

2005年03月28日(月) 11:52 この記事をクリップ!

 

テスト用メールサーバをpythonで作成してみました。

実はほぼマニュアルそのままではありますが、これから徐々にましにしてまこうと思います(1秒に1件までしか対応していないなんてありえないし)。


何がしたかったかというと、どんな宛先のメールでも(smtp的に問題が無ければ)全部受け取って、どこにも配送せずに保存してしまうメールサーバ(MTA)を作りたかったと。
メール送信を含むテストを行うと、メールの宛先に神経質になる必要があるし、メールアドレスが一意になるような制限なんかがあるとこれまた面倒でしょ(いっぱいメールアドレス作る?qmailとか自由に使えればドットでエイリアス作ればいいけど)。

・起動の仕方(BlackHoleSmtpd.pyを実行するだけ。25番で待ち受けるのでOSによってはroot権限が必要):
  # python BlackHoleSmtpd.py

・想定される使用方法
  自動テストで使用するメールサーバにBlackHoleSmtpdを実行しているマシンを指定する。
  テストをして、サーバの直下にあるdataディレクトリの中を確認する。ヘッダ、本文、添付ファイルが別々に保存されているはず。

  ひどいコードなので、ハックをしようとしてpythonのスゴさにびっくりする(^o^)

 Black Hole Smtpd

2005年03月28日(月) 11:52 この記事をクリップ!

 

テスト用メールサーバ

 ITパパから専業ママへ、COREBlog入門

2005年03月25日(金) 00:46 この記事をクリップ!

 

COREBlogとブログは何が違うの?
 ブログとは、Weblogと呼ばれていた物で、日常のこまごまとした記事をインターネット上にログ(記録)していくという概念で、COREBlogというのはブログを作成・公開するためのアプリケーション(道具)なんだ。
 ※ITパパへ。COREBlogはpython上で動作するZopeにのっかるProductです。

ブログと今までの掲示板は何が違うの?
 掲示板は、様々な内容を簡単にインターネット上に公開できるという点では、ブログと同じ。
 ただ、ブログがブログとして普及したのには、次に説明する「とらっくばっく」「ぴんぐ」「あーるえすえす」という仕組を用意したためだと思う。

とらっくばっくって?  トラックバックは、誰かのブログで気になった記事があった場合に何かもっと意見を書きたいとするよね。そして、意見を書いたときに誰か別の人が同じ記事を見たときに自分の意見も見てもらいたいよね。その仕組みを統一的に用意したのがトラックバックというもの。
 COREBlogを使っている人の記事以外にもCOREBlogからトラックバックをすることができるんだ。
 トラックバックをすると、元の記事の下の方にあるトラックバック一覧に自分の記事のインターネット上の住所(アドレス)と、記事の一部が掲載されるよ。
 これで気になった記事を見た他の人がママの記事にやってくることができるようになったよ。
 ※ITパパへ、重要なのは今までのリンクと方向が違うこと。気になった記事へのリンクは自動的には貼られず、気になった記事から自分の記事へとリンクが貼られる。

ぴんぐって?
 ママが何か記事を書いたとするよね。トラックバックを誰かの記事にしていれば、そこから人がやってくるかもしれないけど、それ以外には新しい人は殆どこないよね。
 ピングという仕組みを利用すると、いろんな人のブログの更新状況を一覧することのできるページに、自分のブログの更新を通知することができるんだ。
 これもトラックバックと一緒で、統一的に仕組みが決まっているからCOREBlogのピング受付の他にもいくつかピングをすればいいんだ。
 ※ITパパへ、COREBlogのピングサーバは、http://coreblog.org/ping 。ブラウザで表示すれば更新一覧が見られます。

あーるえすえすって?  ママの記事を読みたい人がいたとして、その人は毎日ママのブログを見に来るのが面倒だったとするよね。ママが毎日記事を書いていれば一日一回でいいかも しれないけど、一日複数回書いたりあるいは不定期に書いたりしているときっとその人は面倒になってたまにしかこなくなっちゃうよね。
 RSSっていう仕組みを利用すると、その人のインターネットを使用するタイミングに合わせてママの更新状況がわかるんだ。
 ぴんぐがあるって?ピングはいろいろな人が利用するから、ピングのページに表示されるのはすごく短い時間なんだ。
 つまり一見さんはトラックバックかピングからやってきて、常連さんはRSSからやってくるんだ。
 ※ITパパへ、RSSリーダはhttp://www.bloglines.com/が便利。ママに設定してあげてね。

COREBlogでぶろぐするにはどうすればいいの?  まず、パパにCOREBlogのインストールかレンタルをしてもらってね。
 その後、次のようにすればいいんだ。


1.管理画面(記事作成画面)にログインする

 パパから教えてもらった住所(アドレス)があるよね。
 たとえば、http://www.example.com/mamaだったとすると、管理画面はhttp://www.example.com/mama/manageになるんだ。Firefoxの住所欄に入力してね。

 ページを開こうとすると変なウィンドウが開くよね。ユーザ名とパスワードを入力してくださいってあるから、パパから教えてもらったユーザ名とパスワードをそれぞれ入力して「OK」ボタンをクリックしてログインしてみよう。


2.初めてのログイン

 ログインをすると、こんな画面がでるんだ(何度かユーザ名とパスワードを入力されられる場合もある。3回くらいは我慢してね)。 

これは、ログインできたという画面なんだけど作ったばっかりのCOREBlogだから、ママの興味のあるカテゴリ(記事のジャンル)を知らないんだ。

 記事には必ずカテゴリの指定が必要だから、まずはカテゴリの作成から。
 青字でhereと書いてあるところをクリックしてみよう。

3.カテゴリの追加

 hereを押すと、こんな画面が出てくる。

 実際には入力するところには文字は入っていないよ。ママが入力して決めるんだ。 

 Nameという項目は、カテゴリの名前。ブログに表示されるよ。
 Descriptionというのはカテゴリの説明文。カテゴリ毎に記事を一覧したりすると見えるんだ。
 Icon Pathというのはカテゴリ毎の小さな画像のことなんだけど、とりあえずは入力しなくていい。
 満足行く入力ができたら、Add Categoryボタンを押すんだ。


4.カテゴリの一覧確認

 カテゴリの追加に成功すると、こんな画面になる。これは今現在登録されているカテゴリの一覧だ。

 他の画面を表示してしまってからでも、Settingsというタブを押して、Categoriesという文字を押せばいつでも見ることができるよ。 

 もし、もっとたくさんカテゴリを用意しておきたかったら、Add Categoryというボタンを押せば新しいカテゴリの登録画面に戻るよ。
 言葉を間違えちゃった場合には、カテゴリの名前を押せば、修正画面がでる。

5. ブログの設定

 今度は、ママのブログについての設定をするよ。

 ママのブログのタイトルとか簡単な説明を設定するんだ。 

 Titleという項目は、ママのブログを表示したときにウィンドウの一番上に表示されるものなんだ。ママのブログ自体の呼び名を決めてね。
 Short descriptionというのはママのブログの簡単な説明文で、Long descriptionというのは詳細な説明文。はじめは入力しなくてもいいかもね。
 Description for footerというのは、ブログの一番下の方に小さく表示されることになるから、Titleと同じかその英語表記とかでもいいんじゃないかな。
 Blog URLというところにはパパに教えてもらったママのブログの住所(アドレス)を入力してね。
 そこまで終わったら、一度Save Changesを押して、パパに見てもらおう。
 ※ITパパへ。Item countはサイドバーの各モジュールに表示されるトピックの最大数。Day count ...はトップページに表示される日付の最大数(エントリーのない日は除く)。Charcode settingsはUTF-8にしておいた方が無難

6. ブログの入力設定

 ここはちょっと難しいからパパにやってもらおうね。

 ※ITパパへ、Allowed Tags for EntryはHTMLタグで許容する物に関する設定。Epozを使うので、基本的には未入力。Epoz settingsはママのPCの画面解像度に合わせて設定してあげてね。そもそもEpozっていうのは何かっていうとブラウザ上で動作するWYSIWYG エディタ。これ無しでママにきれいに入力しロッテ言うのは無理がある。IEかFirefoxで動くからブログの入力だけはSafariは使わないと説明し てあげてください。他の項目は適当に。 



7. いよいよ記事の登録

 書きたい内容が出てきたら、entryというタブを押したら出てくるAdd Entryというボタンを押してね。

 いよいよ記事を登録するよ。 

 Titleという項目にはその記事のタイトルを入力する。
 Authorは自分の名前に間違いないことを確認してね。
 SubtitleはTitleの周りに小さく表示されることになるから、Titleを補う内容を入力してね。無理に入力しなくてもいいよ。
 Categoryはさっき作っておいた物から選んでね。
 Bodyというのが記事の本文。Wordみたいに入力できるよ。
 Extendというのは、記事が長い場合に使う部分。トップページにはBodyの部分しか表示されないよ。こっちはWordみたいには入力できないから、そのうち使うことにしよう。
 Excerptというのは、トラックバックやピングをするときに送信される記事の概要を入力するところ。入力しなければ本文の一部が自動的に使用されるから、入力しなくてもいいよ。
 Trackback URL(s)というのはトラックバックする先の住所(アドレス)を入力してね。普段は空で、複数にトラックバックする場合は1行に1つ住所を書くんだ。
 あとは、Add Entryというボタンを押して記事の作成は完了(Preview Entryボタンを押した場合には、保存せずに入力内容が確認できるよ)。
 さぁ、パパに教えてもらった住所をFirefoxで表示してみよう。

 Super Shuffleはうそ

2005年03月24日(木) 00:03 この記事をクリップ!

 

すーぱーしゃっほーはうそ
だそうな。
それはそれで驚きだけど、うそついた会社の商品紹介ページにある日本語の方が驚き

 AjaxでできたTODO管理

2005年03月22日(火) 20:28 この記事をクリップ!

 

Ajaxテクノロジを利用したTODO管理ツール(とーどー)
phpのソースが1つとデータファイルが一つで配置は非常に簡単。
ロリポップへの配置は、「その他」にデータファイル(csv)への書き込み権限を追加するだけ。

ちょっと気づいた点
 同じ日に同じ名前のTODOを作ると、チェックボックスの動作がおかしい。
 同じ日に同じ名前のTODOっていうのがそもそもおかしいんだけど、残念!

操作感
 直感的ですばらしい。
 追加をクリックするとそのすぐ下に入力欄が出るし、TODO項目をダブルクリックすると名前の編集ができ、しかも名前を消すとTODO自体が消える。
 TODOが終わったことを示すためにチェックボックスにチェックを入れるようなのだが、ここだけはサブミットがないと不安になるかな(慣れだろうけど)。


 プロ系Webアプリはリッチクライアントへと移行中だが、移行している主な原因の一つにWebアプリの画面遷移がある。いちいち何かをする毎にサブミットして画面を読み直すというやつ。Ajaxを使うと必要なデータのみのやりとりで画面の一部を書き換えることができるため、ちょっと考え直す必要があるかもしれない(FlexやC#と比べて開発が用意かという点も重要だけど)。

 as2api

2005年03月19日(土) 10:20 この記事をクリップ!

 

こんなんでたらしい。
いずれ、Flexでアクションスクリプトをいっぱい書くだろうから、その時は必須かな?
メモメモ

 GeoURL

2005年03月17日(木) 09:18 この記事をクリップ!

 

GeoURLを導入。
あんまりそばにはいないみたい(なんだか変なサイトが一括登録しているみたいでキモイ)。
ちなみに、mapfanで出した緯度経度ではズレるので、いちどGeoにずれた状態で取得させてから世界地図で位置を直してみた。

 GoogleX閉鎖

2005年03月16日(水) 21:14 この記事をクリップ!

 

ガガーン。
Windowsしか持っていないのに、OSXのあの部分(ドック)に異常に惹かれている同僚に見せようと思っていた矢先に・・・。

Drift Dirty3さんが気にしているとおり、こんなこともあった模様。

みてくれだけaquaにしたいという人はやはりうちの職場にもいて、そのテーマエンジンのせいでかなり動作が重くなっているにもかかわらずはずそうとしません。
曰く、mEditorとObjectBrowser(ふつうのとER)があれば、OSXでもいいと。
そんなひとたちは、きっとGoogleXにも大喜びだったはずなのに。。。

 skypeのコンタクトリストが便利に

2005年03月16日(水) 10:26 この記事をクリップ!

 

10日(マックは15日)版から、コンタクトリストをネット上で管理できるらしい。
会社のskypeに皆をいれてあって、家でたまにログインすると誰もいなかったんだよねー。
ま、家でskypeすることはほとんど無いんだけどね。。。

 Zope系メモ

2005年03月15日(火) 02:13 この記事をクリップ!

 

プロダクト一覧
生きてまさん
lirisさん
mojixさん
atsさん
planet-zope

関係ない(Zopeを入れられるけど)けど、やすくていいVPS

関係ないけど、FOに便利エディタ

 宗教はいろいろな物を禁止しようとする

2005年03月15日(火) 00:55 この記事をクリップ!

 

サーフィンの歴史
サーフィンまで禁止したらしい。

 支那そばや、が・・

2005年03月13日(日) 09:37 この記事をクリップ!

 

片瀬ゴマで勝手にリンクを貼らせていただいた方のブログをたらたらと眺めていた所、支那そばやが閉店したとのこと。
娘が生まれてからは滅多に行かれなくなっていて、前を通るたびに食べたいねと嫁と話していた。
引っ越してからは余計あのあたりに行かなくなり、また、店がしまっていても、売り切れた結果閉めているだけ(もともとかなりの時間帯はシャッターがしまっていた)だと、勝手に思い込んでいたので、ショックがおおきい。
友達とよく自転車で通った知味斎もいつのまにか無くなっていた(まだある?)し、食べたいと思っている店に一度顔を見せておくかなぁ。
ラーメンビッグもオジさんおばさんがいつまで元気がつづくか。
大船のことぶき(非常に場所がわかりにくいが、私が一番好きなラーメン屋)もおばあちゃんの元気がいつまでつづくか。

ことぶきことぶき。食べたくなって来た。
ことぶきのチャーシュー麺もラーメンビッグと並ぶ位スゴかったなぁ。

 やったやった

2005年03月13日(日) 09:15 この記事をクリップ!

 

片瀬ゴマについて、スマップの中井と同じような事を言っていると同僚と若い同僚(21)に笑われました。
見ましたよ、今日のブラックバラエティ(日テレ)。嬉しそうにやっている喧嘩ゴマ(笑われたのは、ようは若い同僚に喧嘩ゴマを説明しただけ)。
たしかにあんな感じのコマも使っていた気がする(多分文頭のリンクを信じると大山ゴマだな)けど、20年位前はもうプラスチックのコマで芯にベアリングが入った物が最強でみんなそれは保持してました。
ただ、でっかい(大山)コマもはたきつづければかなり強かったのは事実。
最近はあんまり見掛けないけど、それでも3〜4年前に実家の近所の公園で遊んでいる子どもたちは目撃している。
湘南地域の伝統の遊びだったんだねぇ。

子ども時代(おおよそ20年前)に遊んだ、喧嘩ゴマ、釘挿し、ベーゴマ、ビーダマ、今の子どもたちはできるんだろうか?
あの時代でも、バケツに布を貼ってベーゴマをしていた子どもなんて数える程だったけどね。

 GentooにZopeをインストール

2005年03月13日(日) 02:35 この記事をクリップ!

 

今日も出先で困った事になった。
どこのスーパーに何が売っていてどこによれば今日の買いものが済むのかが分からない。
さっさと家計簿を作っていれば。。。

家計簿は、LaszloかFlexとJava/PostgreSQLによるWebServiceで作成しようと思っていた。
普段と違うO/Rを使おうと思って、Hibernateの設定までは済ませていた。
なまけていた言い訳をするとHibernateが面倒臭いからだ(完全にいいがかり)。Torqueはあんなに面倒ではないもん。

で、なぜこのエントリになったかというと、もう面倒だし今学ぶべきはZopeだろう(JavaとFlexは仕事で十分)と、
家デスクトップにZopeをいれてみたから。
あと、定期的に実装が変わる(Java/php/Zope/php)とともに消えていく覚書のひとつにリンクを貼っていただいているので、その復活も含め(http://www.everes.net/resource/Tech/zope/zopeCharset はこちらです)。

Gentooなので、インストールは簡単
  • emerge net-zope/zope
    Zopeのインストール(2.7.3が入った。pythonは2.3.4。あれ、このpythonはお金の計算やばい?)

  • emerge app-admin/zope-config
    Zopeインスタンスの設定に使うもの。

  • zope-config
    Zopeインスタンスの設定。
    インスタンスの名前(/etc/init.dの中にできるスクリプトの名前にもなる。こんかいはzope-homeにした)を決定。
    インスタンスを起動するユーザとグループ(今回は両方zopeにした。net-zope/zopeをいれたときに勝手に作られたみたいだし)を決定する。
    その後、初期ユーザとパスワードを入力する。

  • rc-update add zope-home default
    自動起動するための設定。zope-homeという部分がインスタンス名と同じになる

  • /etc/init.d/zope-home start
    今回は手動で起動

  • http://localhost:8080/
    ブラウザで確認。Zopeのページが表示されていれば良い

  • http://localhost:8080/manage
    初期ユーザ名とパスワードで管理画面へログイン(ベーシック認証)

  • Zopeの文字コード設定
    左側のツリーからRoot Folderを選択し、右側に表示されるページのPropertiesタブを選択。
    プロパティの追加をする(これがhttp://www.everes.net/resource/Tech/zope/zopeCharset)。

    Name: management_page_charset
    Type: string
    Value: UTF-8
とりあえず、以上

 plone本

2005年03月13日(日) 01:14 この記事をクリップ!

 

ハヤマッタらしい。
どうやら、Plone本の翻訳が出るらしい。
年末に洋書版を購入(結構高いので悩んだ)したのに、翻訳本がこんなに早く出るとは。
そもそもの本自体は、順を追っていけばPloneの基本(開発可能レベルの概要)が分かる位の本。
PloneはZopeというそれ自体特殊なCMSにのっているので、概念をとらえるまでが大変。
そんないみで、英語にある程度のパワーをとられてしまっていた洋書版よりも、純粋にPloneの事だけを考えられるこの翻訳本は魅力的。
もう一冊買うか…。合計1万円か……

 レ・ザンジュ

2005年03月13日(日) 00:46 この記事をクリップ!

 

小豆を使ったロールケーキは思いの外美味しかった。1260円
朝日新聞日曜版の全国美味しいケーキ屋で2位に選ばれたとかで(わが家は新聞をとっていないので真偽不明)、またホワイトデーの前日だったので駐車場に警備員までいた。中の喫茶スペースはがら空きなのに。

 海岸清掃

2005年03月12日(土) 20:20 この記事をクリップ!

 

今日は有志による片瀬西浜海岸清掃をしているみたい。ボードウォークに座っているひとが殆どいない

 現在の状況でNHKへの受信料に関する法律改正?

2005年03月12日(土) 08:22 この記事をクリップ!

 

NHK不払いへの罰則等の導入を検討?
麻生さん、ご存知ですよね?NHKが不払い者を訴えてこなかったのはそもそもの法律自体が裁判所で争われた場合に怪しいからだって。

しかも、昨今の公共性・公平性の保てなくなったNHKには存在異義は無いでしょう。
#フジの「テレビ・ラジオは公共性がある」というのも笑止

ただ、法律的にはテレビ受像機(NHKを映らなくしたテレビでも、PCのチューナでも)がある場合は支払わなければいけない。

 車のバッテリーがあがった

2005年03月12日(土) 08:00 この記事をクリップ!

 

車のバッテリーがあがってしまって、JAFを呼びました。
やって来たおじさんは、ノートパソコンくらいのバッテリーを取り出すと、マイサイファのバッテリにピンチみたいのでつないで、私にエンジンをかけるように指示をしました。
あっというまにエンジンがかかりました。作業時間は1分位(ボンネットの中の確認時間含む)。
JAFの会員なので作業料金無料。おじさんは1時間くらいはエンジンを切らないようにと指示をしてにこやかにさって行きました。

マンションの駐車場で1時間もアイドリングをするわけにもいかず、また娘が昼寝を始めたばかりだったので買いものに行くわけにもいかず、しかたなく一人でドライブ。
467号線が上り下りともに大渋滞だったので近所は避け、片瀬山/鎌倉山/裏道をスイスイと大仏まで20分。
帰りはちょこっと混んでてもいいかと136を戻ろうとしたのが間違い。大仏から1時間以上かかりました。
まだ3月なのになぁ。

 鎌倉五山

2005年03月12日(土) 07:52 この記事をクリップ!

 

北鎌倉から鎌倉方面に向かった踏切横の「鎌倉五山」という店のけんちん汁。
わかりにくいけど、豆腐がのっています。
炊き込みご飯、けんちん汁、山菜、沢庵で1050円。見た目よりすっきりした味。
車で行こうとしたところ、バッテリーがあがってしまっていて江ノ電と横須賀線でチャレンジ(-.-;)
今はJAF待ちだったりする・・

 GentooにBlenderをインストールしてみた

2005年03月11日(金) 10:59 この記事をクリップ!

 

家のデスクトップ(Gentoo君)にBlenderをいれてみました。
かなりのレベルの3DCGが頑張れば作れるはず。
まぁ、faviconを作るっていう用途は間違ってると思うけど。
まだ、オープンソースになる前にオランダからマニュアルを取り寄せ(これが彼らの活動資金だった)たこともあるし、
比較的馴染みのある3DCGのアプリケーションです(pythonが標準言語なのも熱い)。
インストール自体は、Gentoo君なのでWindowsにインストールするよりも簡単です。
# emerge media-gfx/blender
とするだけで、2.34がインストールされ、アプリケーションメニューに登録されました。

相変わらず操作方法が難しい(むかし取り寄せたマニュアルにはショートカット下敷が付いていたが…)

久々に面白そうなので、自作自演amazonでハウツー本を購入するか。
どっちがいいんだろう。値段が倍以上違うなぁ。

 cherryos

2005年03月11日(金) 00:45 この記事をクリップ!

 

cherryosがとうとうでたー!
ペーパーウェア化したと思っていたら、できてたみたい。
ウィンドウズを動かしているPCで、MAC OSXを動かすことのできるソフトウェアです。
今週末は、これを試そう。gentoo君HDDははずしてあまりに入れる。

 Laszloはまだいまいち?

2005年03月10日(木) 10:20 この記事をクリップ!

 

Wasting a lot of time with Laszlo
知らない方のために少し説明すると、Laszloというのはxmlベースで記述したものがjava(servlet)によって動的にflashへとコンパイルされる
最近はやりのRIA(Rich Interface Application?)の一つです。MacromediaのFlexと似たようなもの。Flexの登場のせいかどうかは知りませんが
元々商用だったものがオープンソース&無償での利用が可能なライセンスとなっているようです(Flexも個人の非商用では無料ライセンスあり)。

で、引用元の方が問題にしているLaszloの問題点は、下記のようなもののようです。
1.コンパイルが非常に遅い
2.満足なIDEが存在しない
3.サポートがほとんどない
4.ファイルアップロードができない
しかし、それはLaszloだけの問題ではありません。Macromediaが作っているFlexでも同様です。以下2GhzオーバーのCPUと1GBのメモリを積んだマシンでの開発実体験を元に。
1はやはり非常に遅く、開発時間の半分に近い時間をコンパイル時間にとられています。サンプルの動作スピード敵にはLaszloの方が早く感じることもあります。
2はGUIで作成することのできるFlexBuilderというものがありますが、実用に耐えません。動作は非常に重く、2時間に一度は再起動が必要です。Eclipseの5倍重い動作をすると言えばよいでしょうか。
3は不明。今のところ問い合わせをしたことはないが、未だFlexBuilderの値段さえも決まっていないところをみると怪しい。また、オンラインの概念説明等はLaszloの方が圧倒的に優れている。と思う。
4についてはFlashの仕様(サンドボックス)です。クライアントブラウザがIEであれば、隠しフレームのfileフィールドクリックを ActionScriptから呼ぶことができますが、FireFoxではお手上げです(イベントが起こせない)。アップロード系の実装は非常に面倒くさい です。Laszloは悪くない。

私が思うに、Laszloは見た目に問題があるくらいで、オープンソースなだけFlexよりもまし(ただし、業務で使用するならばFlexを選びますが)。
なんとなくLaszloを養護してみました。

 COREBlogの各エントリーにAWSを貼り付ける

2005年03月10日(木) 04:50 この記事をクリップ!

 

amazonのwebservice(以下AWS)を使うPluginsがないかと探していたところ、COREBlogAWSPlugin とういのを見つけた
このプラグインは、各エントリに対してamazonのASINを任意の個数設定をしてエントリ毎に表示をするというもの。
よそのサービスで、ページをパースした結果に基づいてAWSの検索結果を返してくれるというものがあったが、なんだかコンテンツ以外の場所の結果が利用されているのではないかという感じでイマイチ(COREBlogには対応していないためだと思われる)だった。
内容に即した物を表示したいという欲求を満たしてくれるCOREBlogAWSPlugin。
早速入れてみた。

  • プラグインをダウンロードする。
  • ZopeのProductsディレクトリに展開したファイル群(ディレクトリ毎)を配置
  • Zopeインスタンスを再起動
  • COREBlogの直下の「contents」タブをクリック、COREBlogAWSPluginを追加。
    IDは自動で降られるのでいじらず。
    Titleはどうでもいいので、どうでもいい。
  • 追加されたCOREBlogAWSPluginを選択すると、現在のエントリ一覧が表示される。
    まずは、settingタブをクリックして必要項目を入力。
    assosiate ID: amazonのアフィリエイトを申し込んだときにもらったもの(eg everes-22)
    Developer Token: amazonのWebServiceを申し込んだときにもらったもの(eg 1X2XXXXXXX)
    Server URL: http://xml.amazon.co.jp/onca/xml3
    locale: jp
    charset: COREBlogのものにあわせる
    type: よくわからないのでheavyを選んだ
    lifetime(sec): 商品の価格を表示する場合は1時間に一回はキャッシュをクリアする必要がある(規約)ようなので、よくわからなければ 3600
  • 再びCOREBlog直下のcontentsタブをクリック、DTMLMethodを追加。
    IDは何でも良いが、aws_viewとした。名前も何でも良い。
  • 追加されたaws_viewを編集(Poloneスキンを使っているので、テーブルを使用しています)
    <dtml-in "aws_plugin.getAsin(id)">
      <dtml-with "aws_plugin.getDetail(_['sequence-item'])" mapping>
        <dtml-try>
          <br>
          <table>
            <tr>
              <td>
                <dtml-if hasImage>
                  <a href="<dtml-var url>">
                    <img style="text-align:left" src="<dtml-var ImageUrlSmall>" border="0">
                  </a>
                </dtml-if>
              </td>
              <td>
                <a href="<dtml-var url>">
                  <strong><dtml-var ProductName></strong>
                </a>[<dtml-var Catalog>]<br>
                <dtml-if Authors>
                  <dtml-if "isinstance(Authors['Author'],str)">
                    <dtml-var "Authors['Author']"><br>
                  <dtml-else>
                    <dtml-var "'/'.join(Authors['Author'])" missing=""><br>
                  </dtml-if>
                <dtml-elif Artists>
                  <dtml-if "isinstance(Artists['Artist'],str)">
                    <dtml-var "Artists['Artist']"><br>
                  <dtml-else>
                    <dtml-var "'/'.join(Artists['Artist'])" missing=""><br>
                  </dtml-if>
                </dtml-if>
              </td>
            </tr>
          </table>
        <dtml-except>
          <dtml-var "aws_plugin.getDetail(_['sequence-item'])">
        </dtml-try>
      </dtml-with>
    </dtml-in>
  • cssを設定します。COREBlog直下にcssというディレクトリがあるので、そのなかにあるbase_cssを開き、最後に下記のようなcssを追加します。
    /* aws_plugin */
    .amazon{
        border: 1px solid #CCC;<br>
        background : white;
        color : black;
        float :right;
        padding : 1em;
        margin : 0 0 1em 0.5em;
        width : 300px;
        clear : all;
    }
  • あとは、COREBlog直下のentry_bodyの好きな位置に挿入すれば準備は完了です。
    わたしは、本文が終わった直後のPost情報前に置きました(<dtml-var aws_view>だけをどこかに配置)。
    ------ snip
    <dtml-var aws_view>

    </dtml-if>

    <div class="posted">
    Posted by <dtml-var author>
    ------ snipここまで
  • いよいよ、対象の商品の選択です。
    amazonで商品を検索して、商品をクリックした際のURLに「ASIN/0764548573/qid=」という部分があります。このURLの0764548573の部分がASINです。
    COREBlog直下にあるaws_pluginをクリックすると出てくるエントリの一覧からアフィリエイトを追加したいエントリを選択します。
    入力フィールド(テキストエリア)がありますので、関連する商品分のASINを改行で区切って入力しましょう。

 付箋じゃない?

2005年03月10日(木) 03:05 この記事をクリップ!

 

ケースを開けると、小さな付箋が入っていました。
よくわからんオマケがついているなぁと、そのへんに放置しました。
皆に笑われました。

 けんちん汁

2005年03月08日(火) 20:46 この記事をクリップ!

 

今朝、食卓にインスタントけんちん汁がでました。けんちん汁といえば豆腐だと思っていたのですが、驚いたことに豆腐系の具は油揚げしか入っていません! こらいかん、と思い「けんちん汁に豆腐が入っていない!」と嫁に報告。 もう一度驚いたことには、「私の作るけんちん汁にも入ってないじゃん。けんちん汁は油揚げだよ」とのたまうではないですか。 けんちん汁の起源は豆腐が絡んでいるにもかかわらず、です。 とりあえず、嫁のけんちん汁に豆腐が入るように週末は建長寺そばの「鎌倉五山(まだあるのか?」にけんちん汁を飲みに行く予定を無理矢理たてたのです。

 政治ニュースはラジオよりもネットでチェック

2005年03月07日(月) 21:01 この記事をクリップ!

 

ITmedia の記事によると、アメリカの調査では政治ニュース(大統領選等)に関する情報をチェックするのに用いたメディアの割合でネットがラジオを抜いたらしい。

ブロードバンド普及者においては、新聞さえも抜き去ったとのこと。
ホリエモンがラジオ・テレビをネットが置き換えるといったことに対して、フジテレビ社長が「ありえない」と反論したが、カテゴリによっては抜き去る可能性さえも見せているようだ。
しかしながら、ホリエモンがいいたかったのはテレビ、ラジオ、新聞という媒体と手法が通用しなくなる時代がやってくるということだけだったのではないかと推測される。テレビ、ラジオ、新聞の枠組みが少し変わるよ、とね。

 Suicaとメアドの関連付け

2005年03月07日(月) 09:39 この記事をクリップ!

 

高木浩光大先生のパンチは強烈だ。
先日の「俺俺証明書」といい今回の「マスゴミ」といい、併記されている言葉をむりやり脳裏に刻む羽目になる。

危惧している内容自体は、おそらく小田急線がやっているのと同様な定期券の位置をトラッキングすることによってその瞬間に最適なコンテンツをメールにて配信するというITおじさんが思い付きそうなネタ、をJRが私鉄の定期よりも強力なSuicaという非接触ビットマネーツールを用いて展開しようとすること、に関する「プライバシーポリシー」に対するサービス展開側の甘さ、だと思われる。
考えてみれば、サービスイン後すぐに入手したSuicaはチャージ済の金額で買物ができない物であった。
最近不便さを感じてペンギンマーク付きのSuicaに取り換えてもらったのだが、一切データの扱いに付いては説明を受けず(紙っぺらもなし)じまいだった。Suica定期なので、当然個人情報が埋まっているはずで、いつもNewDaysで貧乏臭くサービスサンド(150円でなかなかお買い得)を買っていることもJRのデータベースに記録されているはずだ。
IT業界の末席にいるにもかかわらず、ITおじさんと同程度の意識しか無い自分に反省。

#「マスゴミ」はパスポートネタに登場だったりする。

 KnowledgeTree2.0

2005年03月07日(月) 08:46 この記事をクリップ!

 

KnowledgeTree という文書管理Webアプリケーションの2.0が出たとのこと。
php4.3+MySql4.0で動作し、MS Word, MS Excel, PDF, TXT, HTMLの全文検索、バージョン管理、ワークフロー管理ができるみたい。
ワークフローは、フォルダ単位で承認フローが制御できるみたいなので、大抵の業務に適用可能か?
GPL

デモもある

 モブログのテスト (33$B%b%V%m%0$N%F%9%H33(B)

2005年03月06日(日) 09:20 この記事をクリップ!

 

新しい家(マンション)のベランダからの眺め。
真中ちょい右に富士山が見える(^O^)
(33$BIY;N;38+$($k33(B(^O^))

カッコ内は文字化けしたもの。
まだ、COREBLOGが0.4位のころにも同じく化けて困った覚えがある。
どうしようかなぁ。UTF-8でメールしないと行けないってことは無いだろうしなぁ。
やっぱりZope(というか、この場合はpythonでいいか)をやるかなぁ。

 確定申告

2005年03月04日(金) 11:05 この記事をクリップ!

 

昨年、住宅借入金等特別控除の駆け込みで住宅(集合住宅ですが)を購入しました。
昨年の所得税は全額還付されます(ローン残高の1%を限度とする所得税が戻ります)。
はりきって確定申告をしてみました。そのメモ

  • 住宅借入金等特別控除の確定申告
国税のサイトで必要項目を入力して行くと、PDFが出来上がります。
私は年末調整済だったので、いろいろな項目が抜けた(ある程度まとまって計算されてしまっている)申告書が出来上がりドキドキしましたが、提出前に税務署で見てもらっても名にも言われなかったので、問題なさそうです。
作成したデータの保存、再読込もできるので、非常に便利なページでした。
唯一の問題は、カラー印刷しなければいけない点でしょうか。
データ作成は、源泉徴収表・冬期簿謄本・ローンの年末残高証明書・電卓を用意して、望みましょう。

提出時、過去五年間にわたって自分もしくは配偶者の持ち家に済んでいなかったことの証明書が必要なので、証明できるものを用意しましょう。
私の場合、五年間に下記二通りの住みかたをしていたので、両方を添付しました。
  • 結婚前に実家(親の持ち家)に住んでいた → 実家の建物の登記簿謄本と自分の戸籍謄本(親の名前が書いてあります)
  • 結婚後、アパートを借りて住んでいたので、アパートの賃貸借契約書のコピー(日付と判子のあるページを選びました)

  • 住宅取得資金等贈与の特例
    550万まで贈与税が免除される歴年課税制度と、もっとたくさんオッケーだけど相続時に結局税金を払う相続時清算課税制度があります。
    はっきり言って相続時清算課税制度はありえない(だって、相続時にもらえる物がなくっても、既にもらってしまっているので、相続の放棄もできないだろう し、税金ははらわなけらばならないし詐欺に近い)ので、5年分の控除を一度に受けられる歴年課税制度です(つまり今後5年間は110万という控除が利用で きない)。
    こちらは、国税サイトに「タッチパネルで税額が分かる機械がある」と書かれていますが、住宅取得のための親からの贈与で550万以下だと0円と出るだけのようなので、あきらめて手書きです。
    住宅借入金等特別控除の申告(確定申告)で、購入した物件の価格が頭にこびり付いているので、贈与税申告書の一番上の欄に「財産の額」とある部分に物件価 格を当てはめてしまい、どうしても税額0円にならないなぁと悩んでしまいましたが、贈与税の申告書なので当然、「受贈した財産の額」ですね。
    また、受渡し場所か振り込まれた口座情報・日時を記入する必要があるので気を付けましょう。
  • 忘れやすいこと
    上記2つの申告をする場合には、購入した物件の登記簿謄本が2通必要になります。マンション購入後、税理士事務所から確定申告用に1通届いていたので、安 心していたら2通必要でした。実家の登記簿謄本を鳥に言ったついでにとれば良かったのに結局2度も法務局へ行ってしまいました。
    謄本をとる際には「地番」「家屋番号」「所有者」に関する情報が必要なので、法務局に行く前に権利書等で調べておきましょう。

 xplanner0.6.2のPDFエクスポートで日本語を出力する

2005年03月03日(木) 09:41 この記事をクリップ!

 

  • 必要な物
    xplanner0.6.2
    iTextAsian.jar
    iTextAsianCmaps.jar
    iText関連のjarは、下記の場所にあります。
    http://itext.sourceforge.net/downloads/

  • xplanner0.6.2を展開し、PdfExporter.javaを開きます。
    xplanner_0.6.2/xplanner/src/com/technoetic/xplanner/exportにあります。

    次のように修正をします(iTextAsian.jarとiTextAsianCmaps.jarにクラスパスが通るようにしておく必要があります)。

  • package com.technoetic.xplanner.export;

    import com.lowagie.text.Chunk;
    import com.lowagie.text.Document;
    import com.lowagie.text.DocumentException;
    import com.lowagie.text.Element;
    import com.lowagie.text.Font;
    //ここにBaseFontというものを追加
    import com.lowagie.text.BaseFont;

    import com.lowagie.text.PageSize;
    import com.lowagie.text.Paragraph;
    import com.lowagie.text.Phrase;
    import com.lowagie.text.Rectangle;
    import com.lowagie.text.pdf.PdfPTable;
    import com.lowagie.text.pdf.PdfWriter;
    import com.technoetic.xplanner.domain.Iteration;
    import com.technoetic.xplanner.domain.Person;
    import com.technoetic.xplanner.domain.Task;
    import com.technoetic.xplanner.domain.UserStory;
    import net.sf.hibernate.Session;
    import org.apache.commons.lang.StringUtils;

    import javax.servlet.http.HttpServletResponse;
    import java.io.ByteArrayOutputStream;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;

    public class PdfExporter implements Exporter {

        public static final int SCALE_FACTOR = 2;

        //んー、ちょっとひどいね。これジカ書きじゃ日本語でないよ。
        //ということで、改変(本当は、せっかくある各ローカライズファイル
        //に記述すべきだけど、やっぱりダメに書いてみる。。。)
    //    public static final Font NORMAL_TEXT_FONT = new Font(Font.HELVETICA, 14 * SCALE_FACTOR, Font.NORMAL);
    //    public static final Font BOLD_TEXT_FONT = new Font(Font.HELVETICA, 14 * SCALE_FACTOR, Font.BOLD);
    //    public static final Font TITLE_FONT = new Font(Font.HELVETICA, 24 * SCALE_FACTOR, Font.BOLD);

        public static final BaseFont jpGothicBase;
        public static final BaseFont jpMinchoBase;
        public static final Font NORMAL_TEXT_FONT;
        public static final Font BOLD_TEXT_FONT
    ;
        public static final Font TITLE_FONT
    ;

    static {
      try {
        //フォントのベース(ゴシック)を設定。フォントを埋め込まない
        jpGothicBase = BaseFont.createFont("HeiseiKakuGo-W5", "UniJIS-UCS2-H",false);
        //フォントのベース(明朝)を設定。フォントを埋め込まない
        jpMinchoBase = BaseFont.createFont("HeiseiMin-W3", "UniJIS-UCS2-HW-H",false);
        //普通の文字列は、明朝にしてみた
        NORMAL_TEXT_FONT = new Font(jpMinchoBase, 14 * SCALE_FACTOR, Font.NORMAL);
        //日本語はうまくボルドにならないので、ゴシックで我慢
        BOLD_TEXT_FONT = new Font(
    jpGothicBase, 14 * SCALE_FACTOR, Font.NORMAL);
        //同じく残念ながら
        TITLE_FONT = new Font(
    (jpGothicBase,, 24 * SCALE_FACTOR, Font.NORMAL);
       } catch (Exception e) {
          //適切に処理が必要
      }
    }


        public void initializeHeaders(HttpServletResponse response) {
            response.setHeader("Content-type", "application/pdf");
            response.setHeader("Content-disposition", "inline; filename=export.pdf");
        }

        public byte[] export(Session session, Object object) throws ExportException {
            ByteArrayOutputStream output = null;
            try {
                output = new ByteArrayOutputStream();
                exportToPdf(object, output);
                return output.toByteArray();
            } catch (DocumentException e) {
                throw new ExportException(e);
            } finally {
                if (output != null) {
                    output.reset();
                }
            }
        }

        public void exportToPdf(Object object, OutputStream output)
                throws DocumentException, ExportException {

            PdfWriter docWriter = null;

            Rectangle pageRectangle = PageSize.LETTER.rotate();
            Document document = new Document(pageRectangle, 10, 10, 22 * SCALE_FACTOR, 10);
            try {
                docWriter = PdfWriter.getInstance(document, output);
                if (object instanceof Iteration) {
                    write((Iteration) object, document, pageRectangle, docWriter);
                } else if (object instanceof UserStory) {
                    write((UserStory) object, document, pageRectangle, docWriter);
                } else if (object instanceof Task) {
                    write((Task) object, document, pageRectangle, docWriter);
                }
            } finally {
                if (document.isOpen()) document.close();
                if (docWriter != null) docWriter.close();
            }
        }

        private void write(Iteration iteration, Document document, Rectangle pageRectangle, PdfWriter docWriter)
                throws DocumentException {
            for (Iterator iterator = iteration.getUserStories().iterator(); iterator.hasNext();) {
                UserStory userStory = (UserStory) iterator.next();
                write(userStory, document, pageRectangle, docWriter);
            }
        }

        private void write(UserStory story, Document document, Rectangle pageRectangle, PdfWriter docWriter)
                throws DocumentException {

            Person customer = story.getCustomer();
            String customerName = "";
            if (customer != null) customerName = customer.getName();
            writeCard(document, pageRectangle, docWriter,
                      story.getName(),
                      story.getDescription(),
                      new Field[]{
                          new Field("Customer", customerName),
                          new Field("Estimate", Double.toString(story.getEstimatedHours()))
                      }, null);
            Collection tasks = story.getTasks();
            for (Iterator it = tasks.iterator(); it.hasNext();) {
                Task task = (Task) it.next();
                write(task, document, pageRectangle, docWriter);
            }
        }

        private void write(Task task,
                           Document document,
                           Rectangle pageRectangle,
                           PdfWriter docWriter)
                throws DocumentException {

            writeCard(document, pageRectangle, docWriter,
                      task.getName(),
                      task.getDescription(),
                      new Field[]{
                          new Field("Acceptor", ""),
                          new Field("Estimate", Double.toString(task.getEstimatedHours()))
                      }, task.getStory().getName());
        }

        private void writeCard(Document document,
                               Rectangle pageRectangle,
                               PdfWriter docWriter,
                               String title,
                               String description,
                               Field[] fields,
                               String containerTitle)
                throws DocumentException {
            document.resetHeader();

    //        Phrase       titlePhrase = new Phrase(title, new Font(Font.HELVETICA, 24 * SCALE_FACTOR, Font.BOLD));
    //        HeaderFooter header       = new HeaderFooter(titlePhrase, false);
    //        document.setHeader(header);

            if (!document.isOpen()) document.open();

            document.newPage();

            PdfPTable headerTable = newTable(pageRectangle, 1);
            if (containerTitle != null) {
                headerTable.getDefaultCell().setPaddingBottom(-5);
                //あうぅ。こんなところにもジカ書きが…
    //            headerTable.addCell(new Paragraph(containerTitle, new Font(Font.HELVETICA, 6 * SCALE_FACTOR, Font.BOLD)));
            }
                headerTable.addCell(new Paragraph(containerTitle, new Font(jpGothicBase, 6 * SCALE_FACTOR, Font.BOLD)));
            }
            headerTable.getDefaultCell().setBorderWidth(2);
            headerTable.getDefaultCell().setBorder(Rectangle.BOTTOM);
            headerTable.getDefaultCell().setPaddingBottom(15);
            headerTable.addCell(new Paragraph(title, TITLE_FONT));
            headerTable.getDefaultCell().setBorderWidth(0);
            headerTable.getDefaultCell().setPaddingBottom(0);
            headerTable.addCell(new Paragraph(StringUtils.defaultString(description), NORMAL_TEXT_FONT));
            headerTable.writeSelectedRows(0, -1, 10, pageRectangle.height(), docWriter.getDirectContent());

            PdfPTable table = newTable(pageRectangle, 2);

            for (int i = 0; i

    • package com.technoetic.xplanner.export;

      import com.lowagie.text.Chunk;
      import com.lowagie.text.Document;
      import com.lowagie.text.DocumentException;
      import com.lowagie.text.Element;
      import com.lowagie.text.Font;
      //ここにBaseFontというものを追加
      import com.lowagie.text.BaseFont;

      import com.lowagie.text.PageSize;
      import com.lowagie.text.Paragraph;
      import com.lowagie.text.Phrase;
      import com.lowagie.text.Rectangle;
      import com.lowagie.text.pdf.PdfPTable;
      import com.lowagie.text.pdf.PdfWriter;
      import com.technoetic.xplanner.domain.Iteration;
      import com.technoetic.xplanner.domain.Person;
      import com.technoetic.xplanner.domain.Task;
      import com.technoetic.xplanner.domain.UserStory;
      import net.sf.hibernate.Session;
      import org.apache.commons.lang.StringUtils;

      import javax.servlet.http.HttpServletResponse;
      import java.io.ByteArrayOutputStream;
      import java.io.FileOutputStream;
      import java.io.OutputStream;
      import java.util.ArrayList;
      import java.util.Collection;
      import java.util.Iterator;

      public class PdfExporter implements Exporter {

          public static final int SCALE_FACTOR = 2;

          //んー、ちょっとひどいね。これジカ書きじゃ日本語でないよ。
          //ということで、改変(本当は、せっかくある各ローカライズファイル
          //に記述すべきだけど、やっぱりダメに書いてみる。。。)
      //    public static final Font NORMAL_TEXT_FONT = new Font(Font.HELVETICA, 14 * SCALE_FACTOR, Font.NORMAL);
      //    public static final Font BOLD_TEXT_FONT = new Font(Font.HELVETICA, 14 * SCALE_FACTOR, Font.BOLD);
      //    public static final Font TITLE_FONT = new Font(Font.HELVETICA, 24 * SCALE_FACTOR, Font.BOLD);

          public static final BaseFont jpGothicBase;
          public static final BaseFont jpMinchoBase;
          public static final Font NORMAL_TEXT_FONT;
          public static final Font BOLD_TEXT_FONT
      ;
          public static final Font TITLE_FONT
      ;

      static {
        try {
          //フォントのベース(ゴシック)を設定。フォントを埋め込まない
          jpGothicBase = BaseFont.createFont("HeiseiKakuGo-W5", "UniJIS-UCS2-H",false);
          //フォントのベース(明朝)を設定。フォントを埋め込まない
          jpMinchoBase = BaseFont.createFont("HeiseiMin-W3", "UniJIS-UCS2-HW-H",false);
          //普通の文字列は、明朝にしてみた
          NORMAL_TEXT_FONT = new Font(jpMinchoBase, 14 * SCALE_FACTOR, Font.NORMAL);
          //日本語はうまくボルドにならないので、ゴシックで我慢
          BOLD_TEXT_FONT = new Font(
      jpGothicBase, 14 * SCALE_FACTOR, Font.NORMAL);
          //同じく残念ながら
          TITLE_FONT = new Font(
      (jpGothicBase,, 24 * SCALE_FACTOR, Font.NORMAL);
         } catch (Exception e) {
            //適切に処理が必要
        }
      }


          public void initializeHeaders(HttpServletResponse response) {
              response.setHeader("Content-type", "application/pdf");
              response.setHeader("Content-disposition", "inline; filename=export.pdf");
          }

          public byte[] export(Session session, Object object) throws ExportException {
              ByteArrayOutputStream output = null;
              try {
                  output = new ByteArrayOutputStream();
                  exportToPdf(object, output);
                  return output.toByteArray();
              } catch (DocumentException e) {
                  throw new ExportException(e);
              } finally {
                  if (output != null) {
                      output.reset();
                  }
              }
          }

          public void exportToPdf(Object object, OutputStream output)
                  throws DocumentException, ExportException {

              PdfWriter docWriter = null;

              Rectangle pageRectangle = PageSize.LETTER.rotate();
              Document document = new Document(pageRectangle, 10, 10, 22 * SCALE_FACTOR, 10);
              try {
                  docWriter = PdfWriter.getInstance(document, output);
                  if (object instanceof Iteration) {
                      write((Iteration) object, document, pageRectangle, docWriter);
                  } else if (object instanceof UserStory) {
                      write((UserStory) object, document, pageRectangle, docWriter);
                  } else if (object instanceof Task) {
                      write((Task) object, document, pageRectangle, docWriter);
                  }
              } finally {
                  if (document.isOpen()) document.close();
                  if (docWriter != null) docWriter.close();
              }
          }

          private void write(Iteration iteration, Document document, Rectangle pageRectangle, PdfWriter docWriter)
                  throws DocumentException {
              for (Iterator iterator = iteration.getUserStories().iterator(); iterator.hasNext();) {
                  UserStory userStory = (UserStory) iterator.next();
                  write(userStory, document, pageRectangle, docWriter);
              }
          }

          private void write(UserStory story, Document document, Rectangle pageRectangle, PdfWriter docWriter)
                  throws DocumentException {

              Person customer = story.getCustomer();
              String customerName = "";
              if (customer != null) customerName = customer.getName();
              writeCard(document, pageRectangle, docWriter,
                        story.getName(),
                        story.getDescription(),
                        new Field[]{
                            new Field("Customer", customerName),
                            new Field("Estimate", Double.toString(story.getEstimatedHours()))
                        }, null);
              Collection tasks = story.getTasks();
              for (Iterator it = tasks.iterator(); it.hasNext();) {
                  Task task = (Task) it.next();
                  write(task, document, pageRectangle, docWriter);
              }
          }

          private void write(Task task,
                             Document document,
                             Rectangle pageRectangle,
                             PdfWriter docWriter)
                  throws DocumentException {

              writeCard(document, pageRectangle, docWriter,
                        task.getName(),
                        task.getDescription(),
                        new Field[]{
                            new Field("Acceptor", ""),
                            new Field("Estimate", Double.toString(task.getEstimatedHours()))
                        }, task.getStory().getName());
          }

          private void writeCard(Document document,
                                 Rectangle pageRectangle,
                                 PdfWriter docWriter,
                                 String title,
                                 String description,
                                 Field[] fields,
                                 String containerTitle)
                  throws DocumentException {
              document.resetHeader();

      //        Phrase       titlePhrase = new Phrase(title, new Font(Font.HELVETICA, 24 * SCALE_FACTOR, Font.BOLD));
      //        HeaderFooter header       = new HeaderFooter(titlePhrase, false);
      //        document.setHeader(header);

              if (!document.isOpen()) document.open();

              document.newPage();

              PdfPTable headerTable = newTable(pageRectangle, 1);
              if (containerTitle != null) {
                  headerTable.getDefaultCell().setPaddingBottom(-5);
                  //あうぅ。こんなところにもジカ書きが…
      //            headerTable.addCell(new Paragraph(containerTitle, new Font(Font.HELVETICA, 6 * SCALE_FACTOR, Font.BOLD)));
              }
                  headerTable.addCell(new Paragraph(containerTitle, new Font(jpGothicBase, 6 * SCALE_FACTOR, Font.BOLD)));
              }
              headerTable.getDefaultCell().setBorderWidth(2);
              headerTable.getDefaultCell().setBorder(Rectangle.BOTTOM);
              headerTable.getDefaultCell().setPaddingBottom(15);
              headerTable.addCell(new Paragraph(title, TITLE_FONT));
              headerTable.getDefaultCell().setBorderWidth(0);
              headerTable.getDefaultCell().setPaddingBottom(0);
              headerTable.addCell(new Paragraph(StringUtils.defaultString(description), NORMAL_TEXT_FONT));
              headerTable.writeSelectedRows(0, -1, 10, pageRectangle.height(), docWriter.getDirectContent());

              PdfPTable table = newTable(pageRectangle, 2);

              for (int i = 0; i

 何度でも連絡します

2005年03月03日(木) 08:49 この記事をクリップ!

 

差出人アドレスとされているもの:"警告"info@falerii.jp
届いた時間:2005年2月21日5時ころ

件名:
何度でも連絡します
本文:
退会若しくは利用料金をお支払い頂けるまでは何度でもご連絡致します。
現在の連絡可能な状況が、意図的に連絡不可(携帯・アドレス変更,拒否)
になった場合は支払い拒否、退会不履行の意思表明と見なし、悪質利用者
として法的措置を執行致します。
http://erorist.jp/?num=ひみつ
※規約第15条に則り、弊社所在地所轄簡易裁判所に提訴し、督促状を送付させて頂きます。
引用ここまで:
「若しくは」が誤りだよね。正しくは、「退会をしようとすると素性が割れるし、端末からアクセスしてもらえるから、そしたらいっぱい請求するよ」だね。
このメールがちょっとだけ面白かったのは、差出人アドレスに"警告"という文字列が付いている所。携帯のメール一覧に英文字のアドレスだけが表示されていると、それだけでスパムだっていうアナログフィルタが働くんだけど、この手法だと警告っていう文字列が表示される。
この架空請求スパムはこれだけ。
しかし、何度でもご連絡致しますって書きながら、全然来ないな。

 
ponybadge

Powered by

Feedbacks

Tweets

Tags

Calendar