Movable Type3.17でHTMLAreaを使う(3)
Movable Type3.17でHTMLAreaを使う(2) のコメントで、IE6.0で相変わらずレイアウトが崩れるという報告をいただきました。
実は、私自身使っていないんです。(゜;)\(--;)
Markdownの方が便利で…。
それはさておき、修正が難しくなければ今週末を目標に対応しようと思います。
※サーバーが故障したため、コメントは失われてしまいました。
« 2005年07月 | メイン | 2005年09月 »
Movable Type3.17でHTMLAreaを使う(2) のコメントで、IE6.0で相変わらずレイアウトが崩れるという報告をいただきました。
実は、私自身使っていないんです。(゜;)\(--;)
Markdownの方が便利で…。
それはさておき、修正が難しくなければ今週末を目標に対応しようと思います。
※サーバーが故障したため、コメントは失われてしまいました。
CODE COMPLETE 第2版(上)を読了しました。
一言で言うと、本書はプログラミングの総合ガイドです。
章の終わりにはたくさんの参考資料が紹介されているので、より知識を深めたいときには役に立ちそうです。
第1部「基礎を固める」は、ソフトウェアコンストラクションの概念から上流工程までを解説します。
気になった箇所では、
言語の「中で」プログラミングしているプログラマは、自分の考えを、言語が直接サポートしている構造だけに限定してしまう。 したがって、使用している言語ツールが初歩的なものであれば、プログラムの考えも初歩的なものになる。
とありました。文化の違う複数の言語を習得するのも、表現力に幅ができて良いと思います。
第2部「高品質なコードの作成」は興味深く読みました。後述します。
第3部「変数」、第4部「ステートメント」はコーディングのテクニックを解説します。
経験の浅いプログラマには大変参考になると思います。
また、経験豊富なプログラマにとっても、経験則で知っていることを理論的に理解することは、後輩に教えるときなどに役立つでしょう。
さて、第2部「高品質なコードの作成」です。
複雑さへの対処は、ソフトウェア開発における技術面での最も重要なテーマである。
そして、
すべてのソフトウェア設計手法の目標は、複雑な問題を単純な問題に分割することである。
と言い切ります。
オブジェクト指向プログラミングは、複雑さに対処するためのさまざまなテクニックを提供する。
オブジェクト指向プログラミングを「複雑さへの対処」という視点から見ると理解しやすいかもしれません。
複雑な問題を分割し単純な問題にしたのが「クラス」。クラスは一つのことに集中できるようにします。
「カプセル化」はクラス内の複雑さを隠蔽します。
「抽象化」は、サブクラスの詳細を無視することによって、複雑なものを単純に見せます。
「デザインパターン」も複雑な設計をパターン化することにより、複雑さを緩和します。
ちなみにRubyではデザインパターンをモジュールで提供しています。たとえばSingletonパターンでは
class SomeSingletonClass include Singleton end
SingletonモジュールをincludeするだけでSingletonパターンを実現しています。
複雑な実装はモジュール内に隠蔽されています。
逆に、複雑さを増大させる使い方はオブジェクト指向プログラミングの誤用です。
典型的な例が、深すぎる継承階層です。
「複雑さへの対処」という視点からオブジェクト指向プログラミングを見ると、理解しやすいと思いました。
あと、おもしろかったのは、
というところ。個人同士のやりとりは、他人のコードの助けにならない、ということ。
Movable Type3.17用HTMLAreaを変更しました。
IE6.0でレイアウトが崩れるという問題に対処したつもりです。
さて、どうでしょうか。
インストールしなくても(インストールする権限が無くても)、ActiveRecordとActiveSupportのファイルをコピーすればActiveRecordが使えるみたい。
Ruby on Rails のTODOリストプログラムを参考にして、TODOリストプログラムを作成します。
ActiveRecordを使用して、データベースのtodoテーブルのデータを取得します。
lib/todo.rbファイルを作成します。
require 'active_record'
ActiveRecord::Base.establish_connection(
:adapter => 'mysql',
:host => 'localhost',
:username => 'root',
:password => '',
:database => 'todo'
)
class Todo < ActiveRecord::Base
end
MainPage.rbを編集します。
require 'lib/todo'
module TodoList
class MainPage < CGIKit::Component
def items
Todo.find_all
end
end
end
MainPage.ckdを編集します。
{
:items => {
:element => Repetition,
:list => :items,
:item => :item
},
:item => {
:element => String,
:value => :"item.description",
}
}
:item の :value を :todo から :"todo.description" に変更します。
WEBRickサーバを再起動し、ブラウザをリロードします。
todoテーブルには、まだデータがないので、何も表示されません。
データベースにデータを登録します。
INSERT INTO `todos` (description) VALUES ('Do my bed');
ブラウザをリロードすると、「Do my bed」が表示されます。
REXMLでノードの階層構造を出力する
出力例
html[xmlns="http://www.w3.org/1999/xhtml"]
head[]
meta[content="text/html; charset=UTF-8",http-equiv="Content-Type"]
title[]
body[]
h1[]
h2[]
div[]
form[name="form1",id="form1"]
p[]
br[]
input[name="textfield",type="text"]
ソースコード。
require 'rexml/document'
# 要素を階層表示する
# element 要素
# level 階層レベル
def show_element(element, level)
# 空白
sp = ' ' * level
# 属性
attr = []
element.attributes.each do |name, value|
attr << "#{name}=\"#{value}\""
end
# 出力
puts "#{sp}#{element.name}[#{attr.join(',')}]"
# 子要素
element.each_element do |e|
show_element(e, level + 1)
end
end
if $0 == __FILE__
if ARGV.size < 1
puts "USAGE: ruby #{__FILE__} xmlfilepath"
exit
end
doc = REXML::Document.new(File.new(ARGV[0]))
show_element(doc.root, 0)
end
一通り動作するようになりましたのでckgeneratecodeを公開します。
ckgeneratecodeは、CGIKit 2.x用テンプレートからバインディングファイルとコードを生成するプログラムです。
私のように、先にデザイナーさんからHTMLファイルをもらい、それを元にプログラムを作っていくスタイルだと、このようなスクリプトがあると楽になると思います。
goodicをRubyで作ってみました。ほとんど同じなのですが…。
Windowsで作ったので、入出力はShift_JISを前提にしました。
ruby goodic.rb ej python
py・thon
━━ n. 【動】ニシキヘビ; 大蛇.
ruby goodic.rb je 公園
こうえん 公園
a (public) park; 《小規模で四角形》a square.
国立[国定]公園 a national [quasi-national] park.
日比谷公園 Hibiya Park.
ruby goodic.rb jn おもむろに
おもむろに 0 【▽徐に】
(副)
落ち着いて、ゆっくりと事を始めるさま。ゆったりしたさま。
「―口を開く」
CGIKit2のサブコンポーネントの練習もかねて、日付選択コンポーネントを作成しました。
「日付」「日時」「時分」を選択する3種類を作成しました。
CGIKit2になって、簡単に作れるようになりましたね。
ckgeneratecodeをPopupとBrowserの項目を配列で持つように変更しました。
CGIKit2のバインディングファイルは、解析はeval()でおこなっているので、Rubyの文法に従っていれば良いようです。 って、よく見たら書いてあった。
書式はRubyスクリプトですが、ファイルをeval(load)した結果は Hashでなければなりません。
CGIKit2のコンポーネントはHTMLに表示するためのもので、エレメントは値の表示と同期を行います。
だから、値の同期が必要ならサブコンポーネントを作るのではなくて、エレメントを作らないといけないことに気がつきました。
サブコンポーネントについてはTutorial5.5とTutorial6に詳しい解説がありますが、エレメントの作り方のドキュメントはないようです。ソースコードを探索しましょうか。
あと、CGIKitメーリングリスト - 760 で報告されている問題にはまってしまいました。
2.0.0-preview-1が公開されてから、たくさんの変更が行われているようですので、preview-2 を公開が待ち遠しいです。
Windows 2000にインストールしたApache1.3をアンインストールしたら、サービスにApacheが残ったままになりました。
検索してみると同じ現象の人を発見。
解決方法を残しておきます。
もう一度、Apache1.3をインストールします。
コマンドプロンプトで、Apacheをインストールしたフォルダに移動します。
cd C:\Program Files\Apache Group\Apache
サービスを停止します。
Apache.exe -k stop -n Apache
The Apache service is stopping.
The Apache service has stopped.
サービスを削除します。
Apache.exe -k uninstall -n Apache
Removing the Apache service
The Apache service has been removed successfully.
これで、Apacheがサービスから削除されました。
アプリケーションの追加と削除からApacheを削除します。