「xml」を含む日記 RSS

はてなキーワード: xmlとは

2008-06-02

さくらのレンタルサーバ ライトユーザが書く実情(または宣伝もしくは疑問)

http://anond.hatelabo.jp/20080601175525

他の有料レンタルサーバを使ったことないので、あてにはできないけど。

総評

ライトプランの制限

重要なこと

プラン変更は出来ない。変更したい場合は別プランで新規登録後、データを移すことになる。

その他

実際の環境

公式にはこちら

以下私の環境。これは割り当てられたサーバにより多少の違いがあり得る。その他詳細はアカウント毎に確認できる。

CPUIntel(R) Pentium(R) M processor 2.00GHz
メモリ2GB
OSFreeBSD 6.1-RELEASE-p23 i386
ApacheApache/1.3.39
Perl5.8.8
Ruby1.8.5
Python2.4.5

主なperlライブラリ

2008-05-13

GuiceSeasar2 を連携させてみたよ

[参考文献]

    S2 は、.dicon ファイルで定義をだいぶ簡略化できる。パフォーマンスはどうなんだろう。誰かテストしてくれいw

    app.dicon

    <?xml version="1.0" encoding="UTF-8" ?>

    <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd">

    <components namespace="client">

    <include path="hello.dicon" />

    <component class="org.seasar.guice.Client" />

    </components>

    hello.dicon

    <?xml version="1.0" encoding="UTF-8" ?>

    <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"

    "http://www.seasar.org/dtd/components24.dtd">

    <components initializeOnCreate="false">

    <component class="org.seasar.guice.HelloServiceImpl" />

    </components>

    HelloService.java、HelloServiceImpl.java は、上記 ITPro と内容が同じなので省略。

    Module.java

    package org.seasar.guice;

    import org.seasar.framework.container.S2Container;

    import org.seasar.framework.container.SingletonS2Container;

    import org.seasar.framework.container.factory.S2ContainerFactory;

    import com.google.inject.AbstractModule;

    import com.google.inject.name.Names;

    public class Module extends AbstractModule {

    S2Container container = null;

    public Module(S2Container container){

    this.container = container;

    }

    @Override

    protected void configure() {

    bind(S2ContainerFactory.class).annotatedWith(Names.named(container.getPath()));

    bind(Client.class).toInstance(SingletonS2Container.getComponent(Client.class));

    }

    }

    Client.java

    package org.seasar.guice;

    public class Client {

    private HelloService helloService = null;

    public void setHelloService(HelloService helloService) {

    this.helloService = helloService;

    }

    public void execute() {

    helloService.sayHello();

    }

    }

    Main.java

    package org.seasar.guice;

    import org.seasar.framework.container.S2Container;

    import org.seasar.framework.container.factory.SingletonS2ContainerFactory;

    import com.google.inject.Guice;

    import com.google.inject.Injector;

    public class Main {

    private static final String PATH = ".\\app.dicon";

    public static void main(String[] args) {

    SingletonS2ContainerFactory.setConfigPath(PATH);

    SingletonS2ContainerFactory.init();

    S2Container container = SingletonS2ContainerFactory.getContainer();

    Module module = new Module(container);

    Injector injector = Guice.createInjector(module);

    Client client = injector.getInstance(Client.class);

    client.execute();

    }

    }

    実行結果

    java -cp ?? org.seasar.guice.Main

    2008/05/13 21:19:22 org.seasar.framework.log.Logger info

    情報: Running on [ENV]product, [DEPLOY MODE]Normal Mode

    Hello, world!

    実行環境JDK 7 (build 1.7.0-ea-b24)

    2008-03-27

    http://anond.hatelabo.jp/20080327022633

    というわけでまとめはwikiで。

    という話が過去にあったなと、検索したらもうすぐ2年です><

    http://www.goodpic.com/mt/archives2/2005/06/blogwiki.html

    http://mojix.org/2005/06/28/232219

    でみんなワイワイ。ブックマークでワイワイ。

    ま、ブログも専用カテゴリ過去日記トラックバックで幾らか似たような事が出来るし、はてなグループキーワードwiki的だけれど、結局はまとめる手間が面倒臭いと。

    トラックバックがそのあたりを少しだけ補完してくれるのだけれど、もう少しハンドリングが良くなるといいな。XMLとかJSONとかで配ってくれるとツリー構築とかしやすくなると思う。

    あと、閲覧側が手軽に記事同士を関連付けていける仕組みってのがほしいかも。その辺はブックマークが担う部分か。現状、はてなブックマークはそのあたりが幾らか備わってるな。wiki的に誰でも編集できるとか、含む日記とか。そのあたり、対人間も含めもう少しハンドリングよくしたり、ユーザーのページで役に立つようにしたらよいかも。

    だからあれか、フローストックの中間的な部分をフローからストックへ向けてデータを再利用しながら改良していきやすいシステムでつなげていけばいいのか。

    はてなブックマークポチポチ選択していったら、ブログからトラックバックコメントを取ってきて、それをまたポチポチ選択していくと関連する話のツリーやまとめが出来てきて、それでポチっと押すとはてな記法でそれが吐き出されて、とか。

    そういや、今度作り直すんだって?そんな風にならないかな。

    2008-03-21

    []Python 2.5のdistutilsで、Visual Studio 2005を使いたい!

    目的

    Visual Studio 2005しかインストールしてない場合、Python 2.5だとdistutilsが正しく動かないっぽいので、どうにかしたいYO!

    なんでVisual Studio 2005だと、distutilsが動かないんかな?

    distutilsでVisual Studioを使うときのコンパイル環境は、sysモジュールのversionプロパティを参照して環境を選択をしているようです。Pythonインタプリタを起動して、以下のような命令を実行してみると、sys.versionプロパティが確認できます。

    import sys;print sys.version
    

    Python 2.5.2だと、以下のようになっています。Visual Studio 2003の環境が使われるようです。

    2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)]
    

    Python 2.6a1だと、以下のようになっています。Visual Studio 2008の環境が使われるようです。

    2.6a1 (r26a1:61155, Mar  1 2008, 12:11:56) [MSC v.1500 32 bit (Intel)]
    

    以上から察するに、Python 2.5.2とPython 2.6のどちらでも、Visual Studio 2005の環境が選択されることはないっぽいです。うーん、困った!

    解決策

    Python 2.6とVisual Studio 2008をインストールしよう!」というのを真っ先に思いつきましたが、あんまり環境を変えたくないんだよなー。というわけで、環境の変更を最低限に抑えてどうにかしてみました。簡単に言うと、distutilsだけの置き換えをしました。

    Python 2.6 をインストールする

    Python 2.6の公式ダウンロードページから、Windows版のインストーラーをダウンロードして、適当な場所にインストールしてください。

    distutilsだけ置き換える

    "Python-2.5.2/Lib/distutils"を別の場所に移動し、"Python-2.6a1/Lib/distutils"を"Python-2.5.2/Lib"以下にコピーしてください。以降はPython 2.6は必要ないので、アンインストールして構いません。

    ファイルの修正
    • 例外をPython 2.5.2で許されている形式に変更。
    • get_build_version()関数で強制的に8を返すように変更。

    上記の2点の変更を行います。distutilsディレクトリに、以下のパッチをあててください。

    Index: msvccompiler.py
    ===================================================================
    --- msvccompiler.py
    +++ msvccompiler.py
    @@ -170,6 +170,7 @@
         if majorVersion == 6:
             minorVersion = 0
         if majorVersion >= 6:
    +        return 8
             return majorVersion + minorVersion
         # else we don't know what version of the compiler this is
         return None
    Index: msvc9compiler.py
    ===================================================================
    --- msvc9compiler.py
    +++ msvc9compiler.py
    @@ -128,7 +128,7 @@
                                    "sdkinstallrootv2.0")
                 else:
                     raise KeyError("sdkinstallrootv2.0")
    -        except KeyError as exc: #
    +        except KeyError, exc: #
                 raise DistutilsPlatformError(
                 """Python was built with Visual Studio 2008;
     extensions must be built with a compiler than can generate compatible binaries.
    @@ -172,6 +172,7 @@
         if majorVersion == 6:
             minorVersion = 0
         if majorVersion >= 6:
    +        return 8
             return majorVersion + minorVersion
         # else we don't know what version of the compiler this is
         return None
    @@ -455,7 +456,7 @@
                     try:
                         self.spawn([self.rc] + pp_opts +
                                    [output_opt] + [input_opt])
    -                except DistutilsExecError as msg:
    +                except DistutilsExecError, msg:
                         raise CompileError(msg)
                     continue
                 elif ext in self._mc_extensions:
    @@ -482,7 +483,7 @@
                         self.spawn([self.rc] +
                                    ["/fo" + obj] + [rc_file])
     
    -                except DistutilsExecError as msg:
    +                except DistutilsExecError, msg:
                         raise CompileError(msg)
                     continue
                 else:
    @@ -495,7 +496,7 @@
                     self.spawn([self.cc] + compile_opts + pp_opts +
                                [input_opt, output_opt] +
                                extra_postargs)
    -            except DistutilsExecError as msg:
    +            except DistutilsExecError, msg:
                     raise CompileError(msg)
     
             return objects
    @@ -520,7 +521,7 @@
                     pass # XXX what goes here?
                 try:
                     self.spawn([self.lib] + lib_args)
    -            except DistutilsExecError as msg:
    +            except DistutilsExecError, msg:
                     raise LibError(msg)
             else:
                 log.debug("skipping %s (up-to-date)", output_filename)
    @@ -598,7 +599,7 @@
                 self.mkpath(os.path.dirname(output_filename))
                 try:
                     self.spawn([self.linker] + ld_args)
    -            except DistutilsExecError as msg:
    +            except DistutilsExecError, msg:
                     raise LinkError(msg)
     
             else:
    
    manifestファイルを作る

    python.exeと同じディレクトリに、以下のXMLを"python.exe.manifest"として保存してください。

    <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
    <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity
            type='win32'
            name='Microsoft.VC80.CRT'
            version='8.0.50608.0'
            processorArchitecture='x86'
            publicKeyToken='1fc8b3b9a1e18e3b'
            />
        </dependentAssembly>
      </dependency>
    </assembly>
    

    これで終わりです。

    2008-03-20

    []gcc-xmlVisual Studio 2005を使いたい!

    gcc-xmlって何?

    gccの構文解析の結果(構文木)を、XMLとして出力してくれるツールです。C++の構文解析はやたらと面倒らしいので、こういうのがあるとうれしいみたいよ。

    何でわざわざビルドするの?

    Py++」というC++のPytyonバインディングで使われていたので、必要になりました。gcc-xml 0.6はバイナリで配布されてるんだけど、MSVC7.1までしか対応してないようで、Visual Studio 2005だと使えませんでした。うーん、困った。というわけで、最新版のソース一式を取得してビルドしてみます。

    CMakeをインストールしよう

    gcc-xmlビルドには、CMakeというツールが必要になります。CMakeは、オープンソースクロスプラットフォームビルドシステムなんだとか。CMakeの公式サイトから、Windows版のインストーラーをダウンロードしてインストールしよう。

    実は最初は、ここでcygwinのsetup.exe経由でのインストールをしてたんですけど、これだとgcc-xmlビルドの段階でエラーが発生しちゃいました。この原因がどうしてもわかんなかったので、あきらめて公式サイトインストーラーを使うことにした次第です。

    gcc-xmlソース一式を取得しよう

    ソース一式はCVSから取得できます。CVSクライアントはいろんなのがあるので、好きなクライアントを使って取得しよう。ここではcygwinCVSを使って、シェルから以下の命令を実行して取得しました。40MBくらいあるみたい。

    $ cvs -d :pserver:anoncvs@www.gccxml.org:/cvsroot/GCC_XML co gccxml

    gcc-xmlビルドしよう その1

    Visual Studio 2005 コマンドプロンプト」を起動してください。起動したら、さきほど取得したソース一式が格納されているディレクトリに移動して、以下の命令を実行します。

    $ cmake .

    cmake.exeにはあらかじめパスを通しておくか、パスを直接指定するのを忘れずにね。

    gcc-xmlビルドしよう その2

    gcc-xmlビルドはまだ終了してなかった! 一度ビルドが終了しても、第二第三のビルドが必要となって…。などと恐れおののきましたが、二段階でいいみたい。

    さきほどの処理が終了すると、同じディレクトリに"gccxml.sln"というソリューションファイルが新しくできあがっているかと思います。これをVisual Studio 2005から開いて、Releaseビルドしよう。ビルドが終了したら、以下の5つの実行ファイルができあがっているはずです。

    • bin/release/gccxml.exe
    • bin/release/gccxml_cc1plus.exe
    • bin/release/gccxml_vcconfig.exe
    • bin/release/gxsysEncodeExecutable.exe
    • bin/release/gxsysProcessFwd9x.exe

    gcc-xmlVisual Studio 2005を使えるように設定しよう

    まずは環境変数の設定です。Visual Studio 2005を使っていることを、gcc-xmlに高らかに宣言しておこう。

    $ set GCCXML_COMPILER=msvc8

    つぎに、gccからVisual Studio 2005のインクルードファイルを使えるよう、パッチをあてます。ありがたいことに、"GCC_XML/VcInstall"ディレクトリ以下にVisual Studioバージョンによってパッチが用意されています。そのディレクトリと、パッチを当てたファイルを出力するディレクトリ("gccxml.exe"が置いてあるディレクトリ)を指定して、"gccxml_vcconfig.exe"を実行してください。

    $ bin/release/gccxml_vcconfig GCC_XML/VcInstall/ bin/release

    gcc-xmlを使ってみよう

    あとはbin/releaseにパスを通せば、gcc-xmlが使えるようになったはずです。bin/release以下をどこか適当ディレクトリコピーして、そこにパスを通してもオッケイです。やったね! というわけで、さっそく試してみましょう。

    $ gccxml eample1.cpp -fxml=example1.xml

    ここでは、解析するC++ソースファイルとしてeample1.cpp入力し、eample1.xmlを出力しています。ちゃんと出力できたかな? できたー! やったー!

    以上で終わりです。

    2008-03-15

    [][]PythonからSWIG経由でVisual Studio 2005を使って困ったこと

    以上のような組み合わせで出くわした困ったことと、その解決策をメモしておきます。

    setup.py を実行するとエラーが表示された!

    Python was built with Visual Studio 2003;

    extensions must be built with a compiler than can generate compatible binaries.

    Visual Studio 2003 was not found on this system. If you have Cygwin installed,

    you can try compiling with MingW32, by passing "-c mingw32" to setup.py.

    setup.pyに.iファイルとか.cppファイルを記述して実行すると、こんな感じのエラーメッセージが表示されました。うーん、困った!

    http://labs.cybozu.co.jp/blog/mitsunari/2007/08/vc2005boostpython.html

    上記のページを参考にして、"%Pythonインストールしたフォルダ%/Lib/distutils/msvcompiler.py"を以下のように修正してみたら解決できました。ありがとうありがとう

    --- msvccompiler.py    2007-04-04 17:17:12.000000000 +0900
    +++ 
    @@ -126,7 +126,7 @@
             self.set_macro("FrameworkDir", net, "installroot")
             try:
                 if version > 7.0:
    -                self.set_macro("FrameworkSDKDir", net, "sdkinstallrootv1.1")
    +                self.set_macro("FrameworkSDKDir", net, "sdkinstallrootv2.0")
                 else:
                     self.set_macro("FrameworkSDKDir", net, "sdkinstallroot")
             except KeyError, exc: #
    @@ -252,7 +252,10 @@
    
         def initialize(self):
             self.__paths = []
    -        if os.environ.has_key("DISTUTILS_USE_SDK") and os.environ.has_key("MSSdk") and self.find_exe("cl.exe"):
    +        if self.__version >= 7.1 or (
    +            os.environ.has_key("DISTUTILS_USE_SDK") and
    +            os.environ.has_key("MSSdk") and
    +            self.find_exe("cl.exe")):
                 # Assume that the SDK set up everything alright; don't try to be
                 # smarter
                 self.cc = "cl.exe"
    @@ -288,10 +291,16 @@
    
             self.preprocess_options = None
             if self.__arch == "Intel":
    -            self.compile_options = [ '/nologo', '/Ox', '/MD', '/W3', '/GX' ,
    -                                     '/DNDEBUG']
    -            self.compile_options_debug = ['/nologo', '/Od', '/MDd', '/W3', '/GX',
    -                                          '/Z7', '/D_DEBUG']
    +            if self.__version >= 7.1:
    +                self.compile_options = [
    +                    '/nologo', '/Ox', '/MD',  '/W3', '/EHsc', '/DNDEBUG']
    +                self.compile_options_debug = [
    +                    '/nologo', '/Od', '/MDd', '/W3', '/EHsc', '/Z7', '/D_DEBUG']
    +            else:
    +                self.compile_options = [
    +                    '/nologo', '/Ox', '/MD',  '/W3', '/GX',  '/DNDEBUG']
    +                self.compile_options_debug = [
    +                    '/nologo', '/Od', '/MDd', '/W3', '/GX', '/Z7', '/D_DEBUG']
             else:
                 # Win64
    
    

    cl.exeが見つからないと言われた!

    setup.pyを実行するとcl.exeが見つからないみたいなエラーが表示されました。これは、アレだ。「パス通せ!」ということですね。bashを起動するときのバッチファイル(たぶん"cygwin.bat"とか)で、以下のような行を入れてやれば解決しました。

    call "%VS80COMNTOOLS%vsvars32.bat"
    

    setup.pyを実行したときに"basetsd.h"が開けないと言われた!

    d:\python25\include\pyconfig.h(189) : fatal error C1083: include ファイルを開けません。'basetsd.h': No such file or directory

    error: command 'cl.exe' failed with exit status 2

    setup.pyを実行すると、上のようなエラーが表示されました。

    http://d.hatena.ne.jp/ousttrue/20070531/1180556273

    上記のサイトを見るとインクルードパスが通っていない場所に"basetsd.h"があるのが原因なので、"cygwin.bat"にインクルードパスの設定をしておきました。

    call "%VS80COMNTOOLS%vsvars32.bat"
    set INCLUDE=C:\Program Files\Microsoft Platform SDK\Include;%INCLUDE%
    

    setup.pyを実行したときのリンク時にエラーが発生した!

    link: extra operand `/INCREMENTAL:NO'

    詳しくは `link --help' を実行して下さい.

    error: command 'link.exe' failed with exit status 1

    これは、cygwinのほうのlink.exeが実行されてるのが原因でした。スマートな解決策ではありませんが、cygwinのほうのlink.exeをリネームして解決。パスの設定順序とかでどうにかできるといいんだけど、どうすればいいんかな。

    MSVCR80.dllが見つからないと言われた!

    MSVCR80.dllが見つからなかったため、このアプリケーションを開始できませんでした。アプリケーションインストールし直すとこの問題は解決される場合があります。

    SWIGが生成した.pyファイルをimportしたら、こんな感じのエラーダイアログが表示されたよ。うーん、困った!

    http://d.hatena.ne.jp/moriyoshi/20070525

    上記のページを参考にして、"%Pythonインストールしたフォルダ%/python.exe.manifest"として以下のようなファイルを新しく作ったら、解決できました。ありがとうありがとう

    あとこれ、bashから実行したらエラーダイアログが表示されず、importするモジュールが見つからないみたいなエラーメッセージが出力されるだけだったよ。

    <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
    <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
        </dependentAssembly>
      </dependency>
    </assembly>
    

    2008-01-31

    web混沌を愛せないかな

    キーワード検索のやり方も知らず、リンクアンカーで彷徨った末に胡散臭い情報商材に引っかかる初心者

    ・数万通のメールを送信して金持ちになるスパマー

    ・自サイトのスペースをドット単位で販売して100万ドルを手に入れた男。

    スネオの髪型を洒落でニセ立体化してみたらニュースに載るほどの騒ぎに。

    アダルトサイト迷宮のようなリンクアンカー

    mixi犯罪自慢して人生オワタする若い人。

    ・その人を個人情報保護なんて糞喰らえな勢いで「祭る」匿名の人たち。

    ・例え裁判所から命令されてもお金を出す気は全くないどっかの管理人さん。

    ウイルスを作ってもそれを罰する規則が存在しないので別件逮捕

    リミックスされまくって、もはや元ネタの追跡すら難しいMAD動画

    ・自サイトローカルルールを絶対化するサイト管理人

    無断リンク禁止サイト押しかけて正義を気取るモヒカンさん。

    ・新しいwebサービスには恐ろしいスピードで飛びつくが、意外と普通の人がよく使うページを知らなかったりするGeekたち。

    これらの全てを許容する、今のこのWorld Wide Webが大好きだ。

    web混沌を常にはらんでいる。

    多様性は混沌も生むが、進化も生む。

    多様性の結果として混沌と大量のゴミが生まれたとしても、その中から進化が1個でも生まれればそれは進化としては正しい。

    ----

    すべてを整えようとするのは理系技術屋の性なのかな。

    技術屋ができるのはあくまで情報の生成から整理までであって、管理はできない気がする。

    Googleがやっているのは整理。ティム・バーナーズ・リーがやろうとしたのは管理に近い。(ただし強制力はない。web情報機械意味を持たせて整理しようとしたXHTML(XML)規格は、BlogをはじめとしたCMSのおかげである程度普及したが、Webを席巻する程には至らなかった)

    ※しかも、Geekから見ると整理されているように見えるものでも、同じものが初心者からは複雑怪奇(というか超難解)に見えたりもするので、事態がますますややこしくなっているように見える。

    2008-01-25

    XMLの閉タグは名前を省略出来るべき

    例えば </body> は

    </>

    みたいに。

    2007-12-17

    XMLという存在への懐疑はWWWの今後への懐疑である。

    XMLという存在への懐疑は、WWWの今後への懐疑である。

    そして、誰もこれを懐疑することを否定も肯定もできない。

    そして、「WWWは正しいか?」という問いかけをすることも否定も肯定もできない。

    が、インフラとなった技術存在意義を懐疑されない。

    OSもそう。コンパイラもそう。

    人工言語プログラミング言語)の自然言語日本語英語等)への影響がどんどん大きくなっていく。

    そろそろ、その意味を考えなければならない。

    2007-12-02

    ここで勝手言語論争ごっこ

    一番使い勝手の良いプログラミング言語Perlどぅわ!

    C/C++/C#なんて気軽に文字列処理できないし、

    Windowsでしか使えないVisualほにゃらら

    メモリの確保、解放なんてしたくない

    だいたい、セグメンテーションフォルトを起こすような言語は嫌い

    DirectXOpenGLとお友達になりたくない

    Haskelわけわかんないし

    Java重苦しいし、いちいちclass Hogehoge { public static void main() { ... } }書くのがめんどくさいし、API多すぎ

    オブジェクト指向したくなるような複雑なプログラムは最初から考えない(作れない)

    GUI作りたくなるような言語はめんどくさい

    言語が提供するGUIのツールはOSとは別に独自のレイヤー世界感を持っててとっつきにくい

    マルチスレッド、排他処理を扱うようなプログラム脳味噌がついて行かないので書かない

    CGIにしか使えないようなPHP

    Ruby、、、そもそもLL言語で大規模でオブジェクト指向プログラム書きたくない。小規模ならオブジェクト指向要らない。

    俺のマシンで実行できないAda/Basic/Fortran/Pascal その他いろいろ

    VHDLVerilogFPGAやゲートアレイなんて持ってない、持ちたくない(苦手だもん)

    データベースなんかいじってたまる

    HTMLXML日本語タグが入り乱れるので、そのつど日本語入力の切替えが死ぬほど嫌になった。

    だから、HTMLXMLは全部手入力なんて真似は絶対してやらねえ。

    Flex(Action Script)はコンパイラJavaで実装されてて重すぎる。(シェルを使えばまし)

    JavaScriptブラウザごとの挙動の違いを吸収しきれる自身が無いので使わない。

    1プログラムにつき、(コメント含めて)250行以上書きたくない

    複雑なプログラムを最後まで書ける連中が羨ましい。

    排他制御にとちって、デスロックしてしまえ。

    (本文には触ったこともない言語を思い込みで罵倒しているなど、嘘、おおげさ、紛らわしいが多数混入しています。それが全部わかった貴方プログラミング言語マスターです。)

    2007-11-22

    むしろおれが炎ジョイから発想したことは

    今後、はてブ炎ジョイのような形で

    サイト管理者が管理できない別レイヤーコンテンツが記述される

    レイヤーコンテンツ

    とでもいうようなものが流行っていってしまうのかもしれないなぁということ。

    もちろん、サイト管理者が管理できないのも問題だけど、それ以外にも

    どうやってすべてのレイヤー情報を1つにまとめるか、というのも問題になってくるわけで、

    検索エンジンに噛ませたい場合、ある規格にそって記述してもらうとか(なんらかのXMLRSSのように)、

    なんらかの統一規格があったほうがよいのかもなぁとか、そんなことを思うわけです。

    2007-11-08

    60行テンプレートエンジンがパワーアップしてレイアウト機能に対応

    前の60行テンプレートエンジンを改良して、レイアウトテンプレート機能を追加してみた(それでも全部で90行)。

    レイアウトテンプレート機能とは、例えば個別のテンプレートが<table>...</table>を出力して、それをレイアウトテンプレートが<html><body>...</body></html>で囲って出力するとかそんなの。

    詳しくは終わりの方のサンプルをみてくれ。

    これは Ruby on Rails(とその仲間たち)にある便利機能のひとつ。

    ついでにいうとSmartyにはない機能のひとつ。

    今まで知らなかった人はぜひ試してくれ。チョー便利だから。

    前回はたくさんのブックマークありがと。

    コメントで「男前テンプレート」と名前がついてたので、勝手採用

    名前がキモいっていわれるよ?でもそんなのカンケイネー

    あと、これ以上の機能追加はしないので、各自勝手に改造して使ってくれ(そのためにコメントをつけてるから)。何でも人任せにするな。

    コード

    <?php
    /*
     *  OtokomaeTemplate.php -- レイアウトテンプレートに対応した90行のテンプレートエンジン
     *
     *  - レイアウトテンプレート中で echo $_content; とすると中身が表示される。
     *  - テンプレート中で設定した変数レイアウトテンプレートで使うことが可能。
     *  - レイアウトテンプレート名をテンプレート側で指定することも可能。
     *  - 使い方:
     *      require_once('OtokomaeTemplate.php');
     *      $TEMPLATE_DIR    = 'templates';  // 省略可、パーミッションに注意
     *      $LAYOUT_TEMPLATE = 'layout.php'; // 省略可
     *      $context = array('title'=>'Example',
     *                       'list'=>array(10,'<A&amp;B>',NULL));
     *      include_template('template.php', $context);
     *  - 要 PHP 5.1 or later
     *  - ライセンス: public domain (自由に改造してね)
     */
    
    /*
     *  設定用のグローバル変数
     */
    $TEMPLATE_DIR    = NULL;   /* テンプレートを探すディレクトリ */
    $LAYOUT_TEMPLATE = NULL;   /* レイアウトテンプレートファイル名 */
    
    /*
     *  テンプレートを読み込んで実行する。
     *  $_context は変数名をキー、値を要素とする連想配列。
     *  $_layout はレイアウトテンプレートファイル名。
     *  - NULL または省略した場合は $LAYOUT_TEMPLATE を使う。
     *  - FALSE ならレイアウトテンプレートを使わない。
     *  - $_context['_layout'] = '...'; とすればテンプレート側でも指定可能。
     */
    function include_template($_filename, $_context, $_layout=NULL) {
        global $LAYOUT_TEMPLATE;
        $_content = render_template($_filename, $_context);
        if (@$_context['_layout'] !== NULL)   // テンプレート側で指定された場合は
            $_layout = $_context['_layout'];  // それを使う。
        elseif ($_layout === NULL)            // 引数で指定されなかった場合は
            $_layout = $LAYOUT_TEMPLATE;      // デフォルトファイル名を使う。
        if ($_layout) {
            $_context['_content'] = $_content;  // レイアウトテンプレート中で使う変数
            $_content = render_template($_layout, $_context);
        }
        echo $_content;   // or return $_content;
    }
    
    /*
     *  テンプレートを読み込んで実行し、その結果を文字列で返す。
     *  include_template() の実体。
     */
    function render_template($_filename, &amp;$_context) {
        $_cachename = convert_template($_filename);
        extract($_context);     // 連想配列ローカル変数に展開
        ob_start();
        include($_cachename);   // テンプレートを読み込んで実行
        return ob_get_clean();
    }
    
    /*
     *  テンプレートファイルを読み込み、convert_string() で置換してから
     *  キャッシュファイルに書き込む。読み込み時のロックは省略。
     *  (file_get_contents() もファイルロックできるようにしてほしいなあ。)
     */
    function convert_template($filename) {
        global $TEMPLATE_DIR;
        if (! file_exists($filename) &amp;&amp; $TEMPLATE_DIR)
            $filename = "$TEMPLATE_DIR/$filename";
        $cachename = $filename . '.cache';
        if (! file_exists($cachename) || filemtime($cachename) < filemtime($filename)) {
            $s = file_get_contents($filename);
            $s = convert_string($s);
            file_put_contents($cachename, $s, LOCK_EX); // LOCK_EX サポートは 5.1.0 から
        }
        return $cachename;
    }
    
    /*
     *  テンプレートの中身を置換する。
     *  - '#{...}' を 'echo ...;' に置換
     *  - '%{...}' を 'echo htmlspecialchars(...);' に置換
     *  - ついでにXML宣言も置換
     */
    function convert_string($s) {
        $s = preg_replace('/^<\?xml/', '<<?php ?>?xml', $s);
        $s = preg_replace('/#\{(.*?)\}/', '<?php echo $1; ?>', $s);
        $s = preg_replace('/%\{(.*?)\}/', '<?php echo htmlspecialchars($1); ?>', $s);
        return $s;
    }
    ?>
    

    サンプルPHPコード:

    <?php
    require_once('OtokomaeTemplate.php');
    $TEMPLATE_DIR    = 'templates';
    $LAYOUT_TEMPLATE = 'layout.php';
    $context = array('list'=>array(10,'<A&amp;B>',NULL));
    include_template('template.php', $context);
    ?>
    

    レイアウトテンプレート(layout.php):

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
              "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
      <body>
        <h1>%{$title}</h1>
        <div id="maincontent">
    <!-- テンプレートの内容 -->
    <?php echo $_content; ?>
    <!-- /テンプレートの内容 -->
        </div>
      </body>
    </html>
    

    テンプレート(template.php):

    <?php // レイアウトテンプレート名をテンプレート中で指定する場合 ?>
    <?php //$_context['_layout'] = 'mylayout.php'; ?>
    <?php // レイアウトで使用する変数テンプレート中で指定する場合 ?>
    <?php $_context['title'] = 'レイアウトのサンプル'; ?>
    <table>
    <?php foreach ($list as $i=>$item): ?>
      <tr bgcolor="#{$i % 2 ? '#FFCCCC' : '#CCCCFF'}">
        <td&gt;#{$i}</td&gt;
        <td&gt;%{$item}</td&gt;
      </tr>
    <?php endforeach ?>
    </table>
    

    出力例:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
              "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
      <body>
        <h1>レイアウトのサンプル</h1>
        <div id="maincontent">
    <!-- テンプレートの内容 -->
    <table>
      <tr bgcolor="#CCCCFF">
        <td&gt;0</td&gt;
        <td&gt;10</td&gt;
      </tr>
      <tr bgcolor="#FFCCCC">
        <td&gt;1</td&gt;
        <td&gt;&lt;A&amp;B&gt;</td&gt;
      </tr>
      <tr bgcolor="#CCCCFF">
        <td&gt;2</td&gt;
        <td&gt;</td&gt;
      </tr>
    </table>
    <!-- /テンプレートの内容 -->
        </div>
      </body>
    </html>
    

    いくつか補足:

    2007-11-02

    Visual C# Express Editionのダウンロード時の質問項目がひどすぎる

    バカすぎる。俺は学生なんだが、

    こんな質問に答えられるわけがないだろ。「お客様の主な役割について最も適したものをお聞かせください。」という質問に「学生」って答え作ってるんだから、学生にしたら上の質問を無効にしろよ。「システムを導入するにあたっての、あなたの立場を教えてください。」は確実に答えが選択肢にないんですが。学生は不可なのかと思って対象ユーザーをしらべたけど、ちゃんと学生も対象に入っている。

    Visual C# 2005 Express Edition は、学生や、プロフェッショナルではない開発者を対象ユーザーと想定して作成されています。Visual C# 2005 Express Edition には、Visual Studio 2005 Professional Edition と同じ機能が多数用意されていますが、アプリケーション開発を簡単に始めることができるようにシンプル化されてもいます。

    http://www.microsoft.com/japan/msdn/vstudio/express/faq/default.aspx#vcsharp学生向けを意識してるなら、質問もそれ向けに作ってくれよ。あれか製品自体は学生向けだけど、無料ダウンロード学生禁止なのか?もうどうでもいいや。

    あ、あと

    どのプログラミング言語の話題に興味がありますか。
    HTMLXMLが入ってるのもアレHTMLプログラミング言語って言うのは意外とマイクロソフトが広めてるのかもしれない。

    http://anond.hatelabo.jp/20071102133439

    この日記を上の検索機能から、興味がある単語(例.XMLオートマトン)で検索をかけてます。

    http://anond.hatelabo.jp/20070907154801

    このスレッド立てた増田です。

    このサイトの型システムの解説が分かりやすかったです。

    http://www.chimaira.org/docs/Problems200504.htm

    XML的型システム(一種類である必要は全然ありません)が確立して、それがプログラミング言語の型システムとしっかりとした関係を結んでいる状況を期待しているわけです。

    ここについてしっかり考えてみたいと思います。

    プログラミング言語の型システムとしっかりした関係を結ぶにはどうすればいいか考えてみようと思います。

    まず、プログラミング言語を絞って考えます。

    日本Webプログラミングで主流な言語Rubyの型システムXML的型システムとの対応についてみんなで考えてみましょう。

    ここでのリアクションがよかったら、この話題専用の日記を立ち上げましょう。

    2007-10-31

    生け垣オートマトン

    ネーミングセンスが好きだ。

    英語だと、hedge automataだ。

    RELAX NGというXMLスキーマ数学的な基礎らしい。

    通常のオートマトンが文字列を扱うのに対して、

    生け垣オートマトンは生け垣を扱う。

    ここで、生け垣は順序木の順序列のことだ。

    すごい理論としておもしろいので勉強中だ。

    これを勉強した後と前では、RSSSOAP等のXMLの応用に対する見方も変わるかもしれない。

    みんなも、下記URIをぜひ読んでみよう。

    参考URI

    2007-10-30

    []55行で作るC#テンプレートエンジン

    http://anond.hatelabo.jp/20071030034313二番煎じ

    あまりのアホさに、作ってて気が狂いかけた

    方針


    using System;
    using System.CodeDom.Compiler;
    using System.Collections.Generic;
    using System.IO;
    using System.Reflection;
    using Microsoft.CSharp;
    
    delegate void ConvertTemplateDelegate(TextWriter tw, Dictionary<object, object> args);
    static class TemplateGenerator {
        public static ConvertTemplateDelegate Generate(string code) {
            CompilerParameters param = new CompilerParameters();
            param.GenerateInMemory = true;
            param.ReferencedAssemblies.Add("System.Web.dll");
            CompilerResults rs = new CSharpCodeProvider().CompileAssemblyFromSource(param, ParseTemplate(code));
            if (0 < rs.Errors.Count) {
                StringWriter sw = new StringWriter();
                sw.WriteLine("Compile Error...");
                foreach (CompilerError err in rs.Errors)
                    sw.WriteLine(err.ToString());
                throw new Exception(sw.ToString());
            }
            return (ConvertTemplateDelegate) Delegate.CreateDelegate(typeof(ConvertTemplateDelegate), rs.CompiledAssembly.GetType("Template", true).GetMethod("Convert"));
        }
        private static string ParseTemplate(string code) {
            using (StringWriter sw = new StringWriter()) {
                sw.WriteLine("using System; using System.Collections.Generic; using System.IO; using System.Web;");
                sw.WriteLine("public static class Template {");
                sw.WriteLine("public static void Convert(TextWriter tw, Dictionary<object, object> args) {");
                int index = 0;
                while (0 <= index &amp;&amp; index < code.Length) {
                    int i = code.IndexOf("<%", index);
                    sw.WriteLine("tw.Write(\"{0}\");", EscapeString(i < 0 ? code.Substring(index) : code.Substring(index, i - index)));
                    if (0 <= i) {
                        i += 2;
                        int i2 = code.IndexOf("%>", i);
                        if (0 <= i2) {
                            string cc = code.Substring(i, i2 - i);
                            if (cc.StartsWith("="))
                                sw.WriteLine("tw.Write(HttpUtility.HtmlEncode(\"\"+({0})));", cc.Substring(1));
                            else
                                sw.WriteLine(cc);
                            i = i2 + 2;
                        }
                    }
                    index = i;
                }
                sw.WriteLine("}}");
                return sw.ToString();
            }
        }
        private static string EscapeString(string code) {
            return code.Replace("\\", "\\e").Replace("\"", "\\\"").Replace("\t", "\\t").Replace("\n", "\\n").Replace("\r", "\\r").Replace("\\e", "\\\\");
        }
    }
    

    サンプル C# コード。ためしにテンプレートから Xml 生成して、標準出力してみる。

    class Program {
        static void Main(string[] args) {
            ConvertTemplateDelegate func = TemplateGenerator.Generate(TemplateEngine.Resource1.template);
            using (StringWriter sw = new StringWriter()) {
                Dictionary<object, object> arg = new Dictionary<object, object>();
                arg["title"] = "template sample";
                arg["data"] = new string[] { "foo", "fooo", "<strong>foooooooooo!</strong>" };
                func(sw, arg);
                Console.WriteLine(sw);
            }
        }
    }
    

    サンプルテンプレート

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
              "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
      <head>
        <title><%= args["title"] %></title>
      </head>
      <body>
        <h1><%= args["title"] %></h1>
        <table>
    <% string[] data = (string[]) args["data"]; %>
    <% for(int i = 0; i < data.Length; i++) { %>
          <tr bgcolor="<%= i % 2 == 0 ? "#FFCCCC" : "#CCCCFF" %>">
            <td><%= i %></td>
            <td><%= data[i] %></td>
          </tr>
    <% } %>
        </table>
      </body>
    </html>
    

    出力例

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
              "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
      <head>
        <title>template sample</title>
      </head>
      <body>
        <h1>template sample</h1>
        <table>
    
    
          <tr bgcolor="#FFCCCC">
            <td>0</td>
            <td>foo</td>
          </tr>
    
          <tr bgcolor="#CCCCFF">
            <td>1</td>
            <td>fooo</td>
          </tr>
    
          <tr bgcolor="#FFCCCC">
            <td>2</td>
            <td>&lt;strong&gt;foooooooooo!&lt;/strong&gt;</td>
          </tr>
    
        </table>
      </body>
    </html>
    

    CodeDom 使って動的コンパイル……って、このコードのままだとセキュリティ的に大問題な気がするな。

    素直に ASP.NET 使ったほうが楽だと直感した。

    あと EscapeString すっごく自信ない。たぶん修正が必要だと思うw

    40行で作るPerlテンプレートエンジン

    60行で作るPHP用テンプレートエンジン

    やってしまった・・・。

    方針:

    • PHPのように<?php・・・?>が無いのでそのまま表示と(foreach|if|unless)に対応。
    • [% $c{title} %]で普通に表示(TTっぽい?)
    • [# $c{title} #]でHTMLエスケープ表示
    
    package SixtyLinesTemplate;
    
    use strict;
    use warnings;
    our $VERSION = '0.01';
    
    sub convert {
        return unless defined(my $str = shift);
        $str =~ s{&amp;}{&amp;}gso;
        $str =~ s{<}{&lt;}gso;
        $str =~ s{>}{&gt;}gso;
        $str =~ s{\"}{&quot;}gso;
        $str;
    }
    
    sub include_template {
        my $tmpl = shift;
        my %c = %{+shift};
        eval convert_template($tmpl);
        die $@ if $@;
    }
    
    sub convert_template {
        my $tmpl = shift;
        my $cache = $tmpl.'.cache';
        return scalar do { open my ($FH) , $cache; local $/; <$FH> }
            if ( -f $cache &amp;&amp; (stat($tmpl))[9] <= (stat($cache))[9] );
        my $out = do { open my ($FH) , $tmpl; local $/; <$FH> };
        $out =~ tr/()/\x28\x29/;
        $out =~ s/\[%\s*(foreach|if|unless|end)\s*(.+?)\s*{?\s*%\]/");".(lc($1) eq 'end' ? '} print q(' : "$1 $2 { print q(")/ige;
        $out =~ s/\[%(.+?)%\]/);print $1; print q(/g;
        $out =~ s/\[#(.+?)#\]/);print SixtyLinesTemplate::convert($1); print q(/g;
        $out = 'print q('.$out.');';
        open my ($FH) , '>' , $cache;
        print $FH $out;
        $out;
    }
    
    1;
    
    

    サンプルコード

    
    use SixtyLinesTemplate;
    
    my $context = {
        'title' => 'Example',
        'list'  => [10,'<A&amp;B>']
    };
    
    SixtyLinesTemplate::include_template('template.tmpl',$context);
    
    

    サンプルテンプレート

    
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
              "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
      <head&gt;
        <title>[# $c{title} #]</title>
      </head&gt;
      <body>
        <h1>[# $c{title} #]</h1>
        <table>
    [% foreach my $i (0..@{$c{list}}-1) %]
          <tr bgcolor="[% $i % 2 ? '#FFCCCC' : '#CCCCFF' %]">
            <td&gt;[% $i %]</td&gt;
            <td&gt;[# $c{list}[$i] #]</td&gt;
          </tr>
    [% end %]
        </table>
      </body>
    </html>
    
    

    出力例:

    
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
              "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
      <head>
        <title>Example</title>
      </head>
      <body>
        <h1>Example</h1>
        <table>
    
          <tr bgcolor="#CCCCFF">
            <td>0</td>
            <td>10</td>
          </tr>
    
          <tr bgcolor="#FFCCCC">
            <td>1</td>
            <td>&lt;A&amp;amp;B&gt;</td>
          </tr>
    
        </table>
      </body>
    </html>
    
    

    foreachんところが汚く見えるかもしれませんが、あれは添え字を取ろうとするとああなるんでご勘弁を。

    普通ループするだけならforeach my $item (@$c{title}) でいけますゆえ。

    あと存在しない変数とか使うと死んだり警告でたりするのでevalの前にno strictとno warningsをやった方がいいかもねぇ。

    って何まじめに検証してんだ俺・・・orz

    追記:

    SixtyじゃなくてFortyだね。恥ずかし!

    追追記:

    danさんに添削頂いたYO!

    でも&amp;の奴はちゃんと書いてるんだけども投稿すると勝手エスケープされてしまってるんだよね。何でだろ?

    ちなみにこのconvertの処理はCGI::Utilから拝借しました。

    60行で作るPHPテンプレートエンジン

    唐突に、PHP用のテンプレートエンジンを作ってみる。

    方針:

    • ふつうのPHPファイルテンプレートとして使う。
    • <?php echo $var; ?> は面倒なので #{$var} と書けるようにする。
    • <?php echo htmlspecialchars($var); ?> はもっと面倒なので %{$var} と書けるようにする。
    • ついでにXML宣言も <<?php ?>?xml ... に自動置換する。

    【追記】レイアウト機能を追加してみた

    コード

    <?php
    /*
     *  SixtyLinesTemplate.php - 60行しかないけどSmartyより速いテンプレートエンジン
     *
     *  使い方:
     *     require_once('SixtyLinesTemplate.php');
     *     $TEMPLATE_DIR = 'templates'; // 省略可、パーミッションに注意
     *     $context = array('title'=>'Example',
     *                      'list'=>array(10,'<A&amp;B>',NULL));
     *     include_template('template.php', $context);
     *
     *  ライセンス: public domain (自由に改造してね)
     */
    
    /*
     *  テンプレートを探すディレクトリ。
     */
    $TEMPLATE_DIR = NULL;
    
    /*
     *  テンプレートを読み込んで実行する。
     *  $_context は変数名をキー、値を要素とする連想配列。
     */
    function include_template($_filename, $_context) {
        $_cachename = convert_template($_filename);
        extract($_context);
        include($_cachename);
    }
    
    /*
     *  filename を読み込み、convert_string() で置換してから
     *  filename.cache に書き込む。読み書きのロックは省略。
     *  (file_{get,put}_contents() はファイルロックできるようにすべきだ。)
     */
    function convert_template($filename) {
        global $TEMPLATE_DIR;
        if (! file_exists($filename) &amp;&amp; $TEMPLATE_DIR)
            $filename = "$TEMPLATE_DIR/$filename";
        $cachename = $filename . '.cache';
        if (! file_exists($cachename) || filemtime($cachename) < filemtime($filename)) {
            $s = file_get_contents($filename);
            $s = convert_string($s);
            file_put_contents($cachename, $s);
        }
        return $cachename;
    }
    
    /*
     *  テンプレートの中身を置換する。
     *  - '#{...}' を 'echo ...;' に置換
     *  - '%{...}' を 'echo htmlspecialchars(...);' に置換
     *  - ついでにXML宣言も置換
     */
    function convert_string($s) {
        $s = preg_replace('/^<\?xml/', '<<?php ?>?xml', $s);
        $s = preg_replace('/#\{(.*?)\}/', '<?php echo $1; ?>', $s);
        $s = preg_replace('/%\{(.*?)\}/', '<?php echo htmlspecialchars($1); ?>', $s);
        return $s;
    }
    ?>
    

    サンプルPHPコード

    <?php
    require_once('SixtyLinesTemplate.php');
    $TEMPLATE_DIR = 'templates'; // optional
    $context = array('title'=>'Example', 'list'=>array(10,'<A&amp;B>',NULL));
    include_template('template.php', $context);
    ?>
    

    サンプルテンプレート

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
              "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
      <head>
        <title>%{$title}</title>
      </head>
      <body>
        <h1>%{$title}</h1>
        <table>
    <?php foreach ($list as $i=>$item): ?>
          <tr bgcolor="#{$i % 2 ? '#FFCCCC' : '#CCCCFF'}">
            <td>#{$i}</td>
            <td>%{$item}</td>
          </tr>
    <?php endforeach ?>
        </table>
      </body>
    </html>
    

    出力例:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
              "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
      <head>
        <title>Example</title>
      </head>
      <body>
        <h1>Example</h1>
        <table>
          <tr bgcolor="#CCCCFF">
            <td>0</td>
            <td>10</td>
          </tr>
          <tr bgcolor="#FFCCCC">
            <td>1</td>
            <td>&lt;A&amp;B&gt;</td>
          </tr>
          <tr bgcolor="#CCCCFF">
            <td>2</td>
            <td></td>
          </tr>
        </table>
      </body>
    </html>
    

    2007-09-25

    がんばるあなたを応援したい

    上二つはガジェット自体の構造について。要はXMLを書けばよいらしい。

    で3つ目が本題で、内容javascriptRSSJSONデータを取得して表示する方法。表示はこれを参考にすればよいと思う。後は、読んだ後、リストからはずす処理をどういったUIでやるかだよね。Javaやったんならオブジェクトの扱いは大体わかると思うから、後はDOMを理解すればOKだと思う。

    がんばれ。

    2007-09-24

    スーツ族とかSIerとか言う人に対する愚痴

    なんかまとまってないけど、書いたので乗せる。ほとんど愚痴だよ。

    このへんからぼろぼろ出てきてるけど、まぁおおむね理解できる。

    http://d.hatena.ne.jp/higayasuo/20070923

    http://d.hatena.ne.jp/habuakihiro/20070922

    http://d.hatena.ne.jp/jYoshiori/20070826/1188150596

     けどなんなだかなぁという気が最近している。

     スーツ族がつまらない連中代名詞であるのは良いとして、「スーツ族の煽りの結果、せっかくの良いものが台無しだぁ??」みたいな既定路線の論調はなんなんだろうという気になる。

     RoRでもStrutsでもなんでもいいんだけど「オープンソースの成果を世に普及させたい」とか、「俺の仕事場で楽しく使いたい」というのならば、道具としては工業製品としての品質を持っていないと駄目なんだけどって言いたい。

     で、また特有の色眼鏡で「あーまたサポートがどうのとか、枯れてないと駄目だとか言い出したよー」って言われそう。そういうファクターも大切だと言いたいけど、ここでいいたい品質って言うのは、フレームワークが持っているべき「誰が使ってもそれなりの物を作れる」っていう品質StrutsとかRoRが低い品質だって言いたい訳じゃない。素敵なフレームワークだと俺も思う。

    けど、スーツ族とかSIer存在馬鹿すぎて駄目だとかそういうのはどうよと思う。

    スーツ族とか頭の固いおじさん達の方がこのイット業界といえども圧倒的に多数なんだからそういう人たちでもうまく使えるようにするという進化を何度も繰り返すべきであり、その繰り返しは許容すべきモンなんじゃないだろうか。

     物理的な工業製品進化を見ても分かるように、「馬鹿でも使える」というキーワードはとても大切で、これは複雑さが人類史上maxソフトウェアといえども忘れてはいけないことの一つだと思う。「馬鹿でも使える」のを物理的な仕組み作りじゃ無理かもしれないということの解の一つとして「設定より規約」があるのかもしれないし、「いやいや、自動XML生成ツールで克服だよ」があるのかもしれない。

    とにかく、そういった人たちの否定は、進化の否定、技術者としての自分の否定になるんじゃないだろうか。

    あと、

    スーツ族 == SIerコンサルタント

    スーツ族 == ネット専業とかパッケージベンダーとかコミッタ

    とかの文脈であって、たいていSIer中の人間は馬鹿にされがちだけど、SIerの中にもコミッタは当然いるし、理解が深いのも多いよって言いたい。 逆にSIerで、技術専門職である人間(業界専業のSEだとこの話の対象から外れるが・・・)の場合、千差万別のシステムを見てるので、尋常じゃない位の知識量と技術力が蓄積されている。

     そういう人たちが大規模なシステムを組むときに、普通プログラマ達がそれなり作ってそれなりの品質になるように苦心するわけ。上に挙げたようなエントリを書く人やそれにbookmark入れてコメントするような意識の高い人たちばかりだったら、理想郷になるんだろうけど。。。

    2007-09-19

    http://zapanet.info/blog/item/1089

    キャッシュの話でないのであれば、複製を保存せず、透過的に変換する行為については著作権侵害には問えないだろう。

    一時期流行った「赤ちゃん語変換」みたいなサイトならともかく、「半角」と「全角」の違いであればクライアント側のグリフでいかようにもなってしまう話である。 著作者本人がいくら「半角」での表示を期待していても、それを「全角」文字として表示してしまうコンピュータはたくさんあるのだ。

    アスキーアートなんて、まともに絵として表示される環境の組み合わせは相当限定されているはずだが、絵として表示できなければ著作権侵害になってしまうのかってな話だ。

    RSS は生の XML のまま表示させないといかんのかってな話だ。

    だいたいにして著作権法の同一性保持権は「著作物の性質並びにその利用の目的及び態様に照らしやむを得ないと認められる改変」を認めている。

    表示能力に劣る携帯端末での文書表示が目的ならこの改変は認められるのではないだろうかと思うがどうだろうか。

    キャッシュの話であれば、もう fj.soc.copyright やらでさんざん議論されていたような気はするが。

    ひろゆきが言うように複製を保持してそれを公衆送信可能にすることは、現行の著作権法では著作権の侵害になる。

    しかし、現在ではインターネットの公正な利用の範疇として、キャッシュ機能は検索エンジン等で広く利用されている。 皆がそれを利用している。

    その行為でだれかの利益が侵されているならともかく、だれの利益も侵さない行為は「侵害」と言わないと思う。

    侵害されていると思うなら、裁判所に行ってくればいい。 もしかしたら Google から大金せしめられるかもしれない。

    2007-09-07

    不満に思っている事案

    http://anond.hatelabo.jp/20070907153704

    XML規格のデータ型と、サーバサイドのスクリプト言語Javascriptデータ型の対応がきれいになってない。

    ・セマンティックウェブが名前だけよく聞くがとっかかりが見えない。

    2007-09-02

    http://anond.hatelabo.jp/20070902125208

    > どんな形式(PDF, ワード, 一太郎, HTML, Flash)にでも変換できるような、中間言語があるといいのかな。TeXとか。

    実はこういう方向に思考が行くのは正当な流れで、その延長上に"XMLに対する期待"ってものがあったりする。XMLって、中身と見た目を完全に分けて、クライアント側で、そのクライアントに適したようにレンダリングしてよ、っていうのが目的のひとつだから、まさにここでいう中間コード

    ただし、中間コードとして何でもできるXMLみたいな規格は複雑すぎて、簡単な用途に使うのには流行らなかった。まぁ、いくつか流行ったものもあるけどね。RSSとか。

    そこでどうなったかというと、"中身と見た目の分離"というところでぴんと来た人もいるだろうけど、HTML+CSS適当に簡単で、しかも中身と見た目を分離できる。

    というわけで、みんな、なんだか同じところをぐるぐる回ってるんじゃないかなぁ・・・という話でした。

    2007-08-12

    マークアップエンジニアって結局何やる人なの?

    何か名前の響きからしてこんな感じの人を想像してたんだけど

    でもいままでamachang発言((X)HTML+CSS しか出来ない人は真剣に第二の何かを探したほうがいいとか)の反応ざっと見てきたけどid:amachang(とその周辺)が「マークアップエンジニア = (X)HTML+CSS しか出来ない人」として話を進めてるのにも関わらずそれについて反論があんまりないんだよな。「趣味じゃなくて仕事として(X)HTML(とCSS)を作成するためにはこれこれこういう知識が必要なんだよ」とか「マークアップエンジニアには(X)HTMLCSSしかすることがないとでも思ってんのか馬鹿」とか言ったりするのかと思ったらほとんどそんなことなくて、むしろ同意ですとかそんなこと言われなくてもわかってるよとかJavaScriptだって同じじゃんとか見た感じそんなのばっかり。どうも俺の想像した職業とは違うらしい。

    マークアップエンジニアって本当に(X)HTMLCSSの知識だけで(X)HTMLCSS書いてる人なの?反応見ててそもそも(X)HTMLCSSに理解があるのかってこと自体にまで疑問を感じるんだけど。

    ログイン ユーザー登録
    ようこそ ゲスト さん