Hatena::ブログ(Diary)

日暮れて途遠し このページをアンテナに追加 RSSフィード

<ようこそ! 最初にお読みください。>
 告発、告訴の問題は、現在次のブログをメインにしています。
再審請求に向けて:http://hirono-hideki.cocolog-nifty.com/blog/

本日、金沢地方検察庁に電話連絡をしました。追って、エントリを書きます。
2008年1月21日

本日、金沢地方検察庁に電話連絡をしました。追って、エントリを書きます。
9月25日20時49分

 まだ書いていませんが、簡単にご報告しますと、今年度の新しい担当者のお名前は、「タカマツ」。たぶん、高松と書くのでしょう。当日不在ということで、 まだ声も聞いていないのですが、例の捜査官室長のような上司の人が、対応に出て、尋ねもしないのに、名前を教えてくれました。  とても変わった名前で、「戸澗(とま)」というそうです。  なお、この部分は、エントリに記載後、消去する予定のお知らせです。 10月4日23時31分


 ここ一ヶ月間のアクセス状況を公開しました。10分ほど前の記録になります。 2007年9月26日22時33分
2008年10月6日、金沢地方検察庁に電話連絡。応対したのは岸田さん。 2008年10月29日0時55分

2009-04-12 *1239487942*[捜査]刑務所から手紙を出して消せる証拠とは?

[][]指定したディレクトリ内のhtmlファイルにMETAタグを追加

 latex2htmlを使い始めましたが、やっかいな問題があることに気がつきました。htmlファイルのMETAタグで文字コードの指定を自動でやってくれないのです。日本語パッチを当てれば解決するという情報も読んでいたのですが、なんか2002年頃に作成されたパッチみたいで、Ubuntuではパッチを当てたソースコードコンパイルもかなり難しいような情報もありました。

 おかしなことに$charset='euc-jp'と設定するとTexの処理がすぐに止まってしまうのです。$HTML_VERSION = "4.0"の設定を有効にしているのがまずいみたいな感じです。しかし、このバージョンを下げるとCSSがまともに反映されなくなるみたいです。結局、$charset = "utf-8"で有効になっているみたいです。

 このままでも問題はなかったのですが、脚注を別ファイルとして作成する設定にしたところ、その脚注のファイルだけが文字化けを起こしていました。脚注を同じファイルにすると表示される場所がおかしく、どうもなじめなかったのです。脚注のファイルだけを文字コード変換しても解決していたのですが、そのうち他にも問題が起きそうで、気になりました。

 生成されたhtmlのソースコードを見ると、MATAタグのエンコード指定が存在せず、これではブラウザの環境によって文字化けを起こす可能性が高いと考えました。初めはlatex2htmlの環境変数の値を変更すれば、解決するはずと調べまくったのですが、日本語パッチを当てる以外に有効な方法はなさそうでした。

 ということで、生成されたhtmlにMETAタグを追加する方法を考えました。latex2htmlでは、Texのサブセクション単位などで沢山のhtmlファイルが、一つのディレクトリ内にまとめて生成されます。簡単に10個以上のファイルが出来てしまうので、一つずつ手を加えるのは、余りに面倒です。

 それで、シェルスクリプトを作成しました。引数に特定のディレクトリを指定して、全てのhtmlファイルを対象にしますが、既にエンコード指定のMETAタグの存在するものは除外するようにしました。こういう自動化は便利ですが、間違ったことをすると大変なことになるので、確認をして処理を進めるようにしました。

ソースコード:

#!/bin/bash                                                                                                   
workdir=""                                                                                                    
if [ $# -gt 1 -o $# -le 0 ] ; then                                                                            
        echo "引数はディレクトリの指定一つだけ。"                                                             
        exit 1                                                                                                
else                                                                                                          
        workdir=$1                                                                                            
        cd $workdir                                                                                           
        echo "`pwd $workdir`に入りました。"                                                                   
fi                                                                                                            

ans=""
        read -t 10 -n 1 -p "処理を続行しますか?[y/n]" ans
                case "$ans" in                            
                        n|"")                             
                                echo "中止しました。"     
                                exit 1                    
                                ;;                        
                        y)                                
                                echo "継続"               
                                ;;                        
                esac                                      

        f_check () {
                local s=""
                s=`sed -n '/text\/html; charset/p' $1`
                if [ "$s" != "" ]; then               
                        echo "既に存在します。---> $1"
                        echo "-------------------------------------------------------"
                        echo $s                                                       
                        echo "-------------------------------------------------------"
                        return 1                                                      
                else                                                                  
                        return 0                                                      
                fi                                                                    
        }                                                                             

declare -a add_list
no=0;              

for f in `find . -name '*.html' -print`;do
        f_check $f
        if [ 1 -eq "$?" ]; then
                :
        else
                cat $f | \
                awk '{print}/<\/TITLE>/{print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=euc-jp\">"}' >  $$.tmp
                mv $$.tmp $f
        echo "set done $f"

        add_list[$no]=$f
        no=$(expr $no + 1)

        fi
done

echo "==========結果:=========="

for a in "${add_list[@]}"; do
        echo "$a"
done

echo "上記${no}個のファイルが処理されました。"

実行:

% cp kokuso-tex/kokuso-tex-node* xxx/                                                         [~/tmp/tex2html]
% ls xxx/                                                                                     [~/tmp/tex2html]
index.html                kokuso-tex-node11.html  kokuso-tex-node5.html  kokuso-tex-node9.html                
kokuso-tex-footnode.html  kokuso-tex-node2.html   kokuso-tex-node6.html  kokuso-tex.html                      
kokuso-tex-node1.html     kokuso-tex-node3.html   kokuso-tex-node7.html                                       
kokuso-tex-node10.html    kokuso-tex-node4.html   kokuso-tex-node8.html                                       
% ./latex2html-add-meta.sh xxx                                                                [~/tmp/tex2html]
/home/u8w/tmp/tex2html/xxxに入りました。                                                                      
処理を続行しますか?[y/n]y継続                                                                                
set done ./kokuso-tex-node8.html                                                                              
set done ./kokuso-tex-node3.html                                                                              
set done ./kokuso-tex-node11.html                                                                             
set done ./kokuso-tex-node7.html                                                                              
set done ./kokuso-tex-node9.html                                                                              
既に存在します。---> ./kokuso-tex-footnode.html                                                               
-------------------------------------------------------                                                       
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">                                          
-------------------------------------------------------                                                       
set done ./kokuso-tex-node10.html                                                                             
set done ./kokuso-tex-node4.html
既に存在します。---> ./kokuso-tex.html
-------------------------------------------------------
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
-------------------------------------------------------
set done ./kokuso-tex-node6.html
set done ./kokuso-tex-node5.html
set done ./kokuso-tex-node2.html
set done ./kokuso-tex-node1.html
既に存在します。---> ./index.html
-------------------------------------------------------
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
-------------------------------------------------------
==========結果:==========
./kokuso-tex-node8.html
./kokuso-tex-node3.html
./kokuso-tex-node11.html
./kokuso-tex-node7.html
./kokuso-tex-node9.html
./kokuso-tex-node10.html
./kokuso-tex-node4.html
./kokuso-tex-node6.html
./kokuso-tex-node5.html
./kokuso-tex-node2.html
./kokuso-tex-node1.html
上記11個のファイルが処理されました。
%                                                                          


文字化け:

f:id:hirono_hideki:20090412025335j:image


文字化け解消:

f:id:hirono_hideki:20090412025334j:image

2009-04-07 *1239104892*[パソコン]一太郎、ジャストシステムの危機

[][]リージョンの内容を、別のバッファ書き込み

一応意図したように動いていましたが、無効な部分がありました。追記をご覧下さい。

;;2009-04-07
(defun h-region-cp-buffer (target-buf sp ep)
  "リージョンの内容を他のバッファに書き込む。バッファが存在しない場合は新規作成。"
  (interactive "BTarget buffer: \nr")
  (let ((copy-buf (current-buffer))
        blst current-win win
        (target-bf-name
         (buffer-name
          (get-buffer-create target-buf))))

    (switch-to-buffer target-bf-name)
    (insert-buffer-substring copy-buf sp ep)
    (newline)

    ;;書き込み先のバッファにウィンドウが割り当てられているか検索
    (setq blst
          (let ((lst nil))
            (walk-windows (lambda (x)
                            (setq lst
                                  (cons (window-buffer x) lst))))
            lst))

    (switch-to-buffer copy-buf)
    (setq win (get-buffer-window target-bf-name))

    ;;書き込み先バッファのウィンドウが存在するかで処理を切り分け。
    (if (member target-bf-name blst)
        (select-window win target-bf-name)
      (progn
        (delete-other-windows)
        (set-window-buffer (split-window-horizontally) target-bf-name)
        (select-window (get-buffer-window target-bf-name))
        (swap-screen-with-cursor)))))

;;キーマップを作成 ローカルで作成し、グローバルにセット
(let ((f12-key (make-sparse-keymap)))
  (define-key f12-key "a" 'h-region-cp-buffer)
  (setq f12-key-map f12-key))

;;グローバルキーバインドの設定
(global-set-key [f12] f12-key-map)

 Emacsでは、標準で似たようなコマンドがあるのですが、いまひとつ使い勝手がよくなこともあり、作ってみました。以前にも似たようなものを作っていたのですが、今回は細かい点も配慮し、次の操作に移りやすいようにしました。なお、あらかじめリージョンが設定されていないとエラーが出ます。

 インタラクティブ宣言にバッファの引数を指定してあるので、補完が出来、存在しないバッファ名を指定すると新規にバッファが作成されます。




追記:2009年 4月 11日 土曜日 08:56:52 JST

 コメント欄において、Plusさんから、ご指摘を頂き間違いに気がつきました。訂正したものをアップしますが、Plusさんがコメントで、はるかに簡潔で要領を得たコードを提示して下さったので、そちらの方をよい例として参考にして下さい。自分の方はよくない例として参考にしてもらえれば幸いです。

訂正したものです。

(defun h-region-cp-buffer (target-buf sp ep)
  "リージョンの内容を他のバッファに書き込む。バッファが存在しない場合は新規作成。"
  (interactive "BTarget buffer: \nr")
  (let ((copy-buf (current-buffer))
        blst current-win win
        (target-bf-name
         (buffer-name
          (get-buffer-create target-buf))))

    (switch-to-buffer target-bf-name)
    (insert-buffer-substring copy-buf sp ep)
    (newline)

    ;;書き込み先のバッファにウィンドウが割り当てられているか検索
    (setq blst
          (let ((lst nil))
            (walk-windows (lambda (x)
                            (setq lst
                                  (cons (buffer-name (window-buffer x)) lst)))) ;訂正
            lst))

    (insert "%s" (car blst))

    (switch-to-buffer copy-buf)
    (setq win (get-buffer-window target-bf-name))

    ;;書き込み先バッファのウィンドウが存在するかで処理を切り分け。
    (if (member (get-buffer-window target-bf-name) blst)  ;訂正
       (select-window (get-buffer-window target-bf-name)) ;訂正
      (progn
        (delete-other-windows)
        (set-window-buffer (split-window-horizontally) target-bf-name)
        (select-window (get-buffer-window target-bf-name))
        (swap-screen-with-cursor)))))

 参考です。関数の返却値が次のように異なっています。

(window-buffer) バッファそのもの
#<buffer *scratch*>

(buffer-name) バッファの名前(これは文字列)
"*scratch*"

(selected-window) ウィンドウそのもの
#<window 113 on *scratch*>