2006年12月17日 (日)

ちと困る

課題しようと思ったら条件に

A4用紙で2枚程度に(ワープロ書き)

とあった。
Tex使っちゃ駄目っぽいですね。駄目なんでしょうね。

| | コメント (0) | トラックバック (0)

2006年9月17日 (日)

Wikipedia(MediaWiki)からPukiWikiへ

Wikipediaの記事(編集ページ)をダウンロードして、
MediaWiki記法で書かれた文章をPukiWiki用の記法で書かれたソースに変換するスクリプトを書きました。


目的はPerlの学習と某先輩へのおせっかい?です。

大学のワークステーションで動かしたら
一週間近くずっど動かすことになってしまった。
その間ログアウトできなかった・・・

昨日辺りに「nohup」というログアウトしたままでもプログラムを走らせる事ができる
コマンドを知った。もう少し早く知っておけばよかったと思った。

不安要素としては、MediaWiki記法からPukiWikiへの変換。
あと、文字コード関連で警告が出る。出力されるPukiWiki用のテキストは
特に問題ないみたいだから気にしなかった。


そんな駄目駄目なスクリプトですが、使いたい人がいたら「こちら」からダウンロードしてください
動作させるにははLWPモジュールが必要です。

手順は

  1. Wikipedia特別ページの全ページの取得
  2. ある程度の区間の記事へのリンクの取得 (例えば!(感嘆符)から)
  3. 各記事の取得 (例えば!!!)
  4. 編集ページのリンクの取得 (例えば!!!を編集中)
  5. textareaからMediaWiki記法で書かれたテキストの取得
  6. MediaWiki記法をPukiWiki記法へ

こんな感じ


ソースコードを張り付けておきます

#!/usr/local/bin/perl -w
use strict;

use Encode;
use LWP;

# ファイル名を決める
sub getFilename {
  my ($filename) = @_;

  $filename =~ s/.*<title>(.*) .* - Wikipedia<\/title>.*/$1/s;

  # 他にも必要かも
  $filename =~ s/&amp;/&/;

  $filename =~ s/(.?)/sprintf("%02X", ord($1))/eg; # 16進数に直す
  $filename =~ s/00//;                             # NULL文字を消す
  $filename .= ".txt";

  return $filename;
}

# Wikiを解析してファイルに書く
sub Wiki {
  my ($ua, $url) = @_;
  my $req = HTTP::Request->new(GET => $url);
  my $res = $ua->request($req);

  if ($res->is_success) {
    my $text = $res->content;
    Encode::from_to($text, "utf8", "euc-jp");

    my $filename = getFilename($text);
    $text =~ s/.*<textarea.*>(.*)<\/textarea>.*/$1/s; # textarea内のデータのみにする

    # ** ここでMediaWiki記法をPukiWiki記法に変えたい **
    my @text = split("\n", $text);
    foreach(@text) {
        s/<br.*?>/\n/;
        s/^\*(.*)/-$1/;
        s/^\*\*(.*)/--$1/;
        s/^\*\*\*(.*)/---$1/;
        s/^===(.*)===\s*$/***$1/g;
        s/^==(.*)==\s*$/**$1/g;
        s/^=(.*)=\s*$/*$1/g;
        s/^###(.*?[^=]+$)/+++$1/;
        s/^##(.*?[^=]+$)/++$1/;
        s/^#(.*?[^=]+$)/+$1/;
        s/^:::(.*?)/>>>$1/;
        s/^::(.*?)/>>$1/;
        s/^:(.*?)/>$1/;
        s/^; (.*?) : (.*?)/; $1 \| $2/;
        s/<center>(.*?)<\/center>/CENTER:$1/g;
    }
    $text = join("\n", @text);

    # ここでファイルに書く
    open(FILE, ">wiki/$filename");
    print FILE $text;
    close(FILE);
  }
}

# 本文から編集ページのリンクを取得する
sub toEdit {
  my($ua, $url) = @_;
  my $req = HTTP::Request->new(GET => $url);
  my $res = $ua->request($req);
  my $text = $res->content;
  $text =~ s/.*<div class="editsection".*?href="(.*?)&amp;action=edit.*/$1/s;
  $text = "http://ja.wikipedia.org" . $text . "&action=edit";
  return $text;
}

# 表示開始ページが指定された全ページのところから各ページのリンクを取得
sub allPageStep2 {
  my($ua, $url) = @_;
  my @urls;

  my $req = HTTP::Request->new(GET => $url);
  my $res = $ua->request($req);
  my $text = $res->content;
  $text =~ s/.*<hr \/><table(.*?)<\/table>.*/$1/s;

  foreach (split(" ", $text)) {
    if (/href=/) {
      s/href="(.*)"/$1/;
      push(@urls, "http://ja.wikipedia.org/$_");
    }
  }

  return @urls;
}

# 全ページから表示開始ページを指定したページへのリンクを取得
sub allPageStep1 {
  my($ua, $url) = @_;
  my @urls;

  my $req = HTTP::Request->new(GET => $url);
  my $res = $ua->request($req);
  my $text = $res->content;
  $text =~ s/.*<table class='allpageslist'(.*?)<\/table>.*/$1/s;

  foreach (split(" ", $text)) {
    if (/href=/) {
      s/href="(.*)".*/$1/;
      push(@urls, "http://ja.wikipedia.org/$_");
    }
  }

  # 重複の削除
  my %tmp;
  @urls = grep( !$tmp{$_}++, @urls );

  return @urls;
}

#
# MAIN
#

my $ua = LWP::UserAgent->new;
$ua->timeout(10);
$ua->agent('Mozilla');

foreach (allPageStep1($ua, 'http://ja.wikipedia.org/wiki/%E7%89%B9%E5%88%A5:Allpages')) {
  my @url = allPageStep2($ua, $_);
  foreach(@url) {
  print "$_\n";
    my $url = toEdit($ua, $_);
    Wiki($ua, $url);
  }
}

| | コメント (4) | トラックバック (0)

2006年8月11日 (金)

なんで

一時的に利用するサーバの設定(ネットワークぐらい)をした。
だが、

nslookup hoge
で正しいIP取得できるのに、

ping hoge
が通らない
ping xxx.xxx.xxx.xxx(IP)
は通るのに・・・

外部からはURLでもアクセスできるので、
問題無いのでそのまま。
ただ、原因は気になる。

| | コメント (0) | トラックバック (0)

2006年7月11日 (火)

TOEIC

7/8にちゃんとTOEICを受けてきました。
7~10日ほどで結果が分かるらしい。

| | コメント (0) | トラックバック (0)

2006年6月13日 (火)

日本対オーストラリア

今日大学にて巨大スクリーンで試合見てきました。
あの大きさであの画面の美しさは凄い。
難しいけど、ワールドカップ以外でも今回のような企画をして欲しいと思います。

日本の一点目が偶然っぽい置いておいて、
キーパーがかなり守っているのに、
チャンスもあったはずなのに、
点が入っていない。

チャンス生かせたら、展開が変わってたのではないかと思いました。


と、あんまり詳しくないサッカーの試合の話はやめておいて、
オーストラリアの監督のリアクションが凄かった。
すごく嬉しかったんでしょうね。

| | コメント (0) | トラックバック (0)

2006年5月28日 (日)

やっちまった

今日TOEICの試験うけるはずだったのに・・・

家出て、駅ついて時刻表見た瞬間に無理なのが分かってしまった。11:30~12:20のうちに入場しないといけないのに、11:41のはちょっと前に出てしまい、次のは12時過ぎ・・・ちゃんとおきていたのに・・・

4000円が無駄になってしまった。よくないですね。

今度大学であるときは遅れません。というかそれで良い点とらないとね。あと一ヶ月くらい?

よしやる気を出し直そう!!

最近ちょっと英語の学習に関してはたるんでた・・・

| | コメント (3) | トラックバック (0)

2006年5月17日 (水)

日々の生活には算数が必要

昨日の夕方に外食しに行ったときのこと。

4人で行って、全員が680円の天丼を注文し、その内1人はサラダ・ジュースをプラスしていました。会計のときに、自分が食べた分だけ支払います。私は支払い3人目で、最後の4人目の人がサラダ・ジュースを追加した人でした。前の人が1000円で支払いました。次に私が1030円を支払おうとしました。

会計をしていた人はそこで凄い困惑しています。しまいには、「サラダとかも頼んでいた方でしたか?」みたいなことを言い出すし・・・

なぜ!?

向こうはなんで余計なお金を出すんだといった心境だったのだと思います。1000円だったら320円が返ってくるところが350円になり、こちらとしては小銭を減らせる利点があるんですが・・・

最終的には30円を引っ込め、320円のおつりをもらって来ました。別に損をしたわけではないけどなんだかなぁ。

たまに変なおつりの支払い方をしようとして店員に迷惑をかけることもあるけど。これはなんだかなぁ。

| | コメント (1) | トラックバック (0)

2006年4月17日 (月)

夢に一直線

先ほど、大学の自販機にて飲み物を買おうとしたんですが、そこに

夢に一直線
ストレートティー

なるものがおいてありました。

つぼにはまってしまい、大笑いしてしまいました。

今回は買わなかったけど、いつか気が向いたときに買おうと思います。

| | コメント (1) | トラックバック (0)

2006年4月 9日 (日)

今日は一人で街を歩いてきました。

一番の目的は「30日でできるOS自作入門」だったのですが、それは見つかりませんでした。しかし、古本屋にて「闘うプログラマー[上]」を見つけることができました。[下]がなかったが残念ですが、絶版の本ですし安く買うこともできたのでよかったです。

帰ってきてから「「30日でできるOS自作入門」をAmazonで購入しようとしたのですが在庫切れ。どうしても欲しい本なのでcbook24を初利用してしまいました。

| | コメント (3) | トラックバック (0)

2006年4月 5日 (水)

帰ってきた

今日かえってきました。

一ヶ月以上親元にいた(=ネットの世界から離れていた)ことになりますね。

学校は4/6が入学式だから学校に行く必要性がでてくるのは、来週からか早くても7日だと思ってたんですが、一応と思って今年度の学年暦をみてみました。

すると今日からあるみたいに書いてあったんです。それであわてて、先輩や友人にあたったところ自分の学年は7日からでいいというのが分かり一安心。どうせ今日だったら手遅れだから、分かった所でどうという訳ではないのは分かっちゃいるんですが・・・

その後、学年暦の隣にオリエンテーションの予定がアップされていることに気づき、あんなに慌てなくても良かった事がわかり軽くしょんぼりしました。

| | コメント (0) | トラックバック (0)

より以前の記事一覧