【コラム】

日本語で10行プログラミング

82 縦書き風テキスト作成ツール

 

82/90

開発日誌~スパムメールの収集

以前からスパムメール(迷惑メール)に興味があり、スパムメール収集用のアドレスを作ってメールを集めています。メールを収集する方法は簡単で、わざとそのアドレスをホームページの目立たないところに載せておくだけです。

驚くべきことですが、Webにメールアドレスを載せると、数日もしないうちにスパムが来るようになります。メールアドレス収集する専用のプログラムが、常にWebを巡回してメールアドレスを収集しているのだと思いますが、それにしてもその収集力に感心するばかりです。

また、スパムメールの本文の内容も日々進化しており、友達を装ったメールや、プレゼント当選のお知らせ、巧妙な誘いの文句や出会い系サイトへの誘導や、非常に凝ったアスキーアートなど、手を換え品を換え実に凝ったメールが送られてきます。

こうしたメールの数が一向に減らないところを見ると、スパム業者はそれなりに利益が出ているのだと思います。メールによる"オレオレ詐欺"のようなものです。こうしたスパム業者の巧妙な罠に引っかからないように注意してください。

時間ができれば、こうしたスパムメールを遮断するソフトを自分で作ってみたいと思って集めているのですが、忙しくてなかなか取り掛かれません。ですが、スパムメールを自動的に選別する、迷惑メールフィルターやこれを備えたメールソフトも次々と発表されていますので、せっかくスパムを集めていますが、それほど役に立てられないかもしれません。

縦書きテキスト作成ツール

さて先日、スパムメールを整理していたら、その中に面白いメールがありました。

一般的なメールソフトは横書きのものがほとんどだと思います。もちろん、私の使っているメーラーも横書きです。しかし、そのメールは、なんと縦書きで送られてきたのです。

おやっと不思議に思って凝視してみると、行と行の間に空白文字が入っており、文字の配置を工夫して、横書きのメールソフトでも、縦書きに見えるように細工されていたのでした。

スパムメールの内容は嫌なものでしたが、これはとても面白い試みだと思いました。ぜひ、自分でも縦書きの文章を作って、親しい人に送ってみたいと思いました。

前書きが長くなりましたが、そんな訳で、今回の10行プログラミングは、横書きのエディタで、縦書きっぽく見えるテキストを作成するプログラムを作ってみます。

実現する方法を考える

さて、実際にプログラミングを始める前に、どうやったら目的が達成できるのか、実現方法を考えて見ましょう。

横書きのテキストを縦書きに変換するためには、一体どうしたら良いでしょうか?

実現する方法は、いくつかあると思いますが、ここでは、二次元配列変数を使って、これを回転する方法で実現してみたいと思います。

以下に実現の手順をまとめてみました。

  1. 変換したい文章を読み込む
  2. 文章を1文字ずつに分けて、二次元配列変数に代入する
  3. 二次元配列変数の各要素が2バイト(漢字1文字)になるように揃える
  4. 二次元配列変数の内容を右に90度回転させる
  5. 二次元配列変数を左上から右下へ表示する

二次元配列変数は、配列変数を行と列の二次元の要素を持った配列変数です。これは、表計算ソフトのExcelなどを思い浮かべてみると良いでしょう。縦方向(列)と横方向(行)にセルが並んでいるという具合です。

なぜ一度、配列変数に文字を代入するのかと言えば、手順4のように、90度右回転させるためです。横書きの並びを、縦書きに変換するには、横書きの並びをくるりと90度右方向に回転させてやると、縦書きになるのです。下の図を参考にして右に90度配置換えさせることを確認してみてください。

配置を回転させるために配列変数を使います

使えそうな命令を探す

なんだかできそうだと思ったら、次に、機能を実現できそうな、なでしこの命令を探してみます。なでしこのエディタの命令一覧を見ると、二次元配列変数を手軽に扱うための命令が用意されていることに気づいたでしょうか。

なでしこエディタから命令の一覧が見られます

これを見ていくといろいろ使えそうな命令が見つかります。特に、「表右回転」という命令があります。これは、今回のプログラムを作るためにあるのではないかと思うような命令です。先ほど確認した手順4の右に90度回転する作業をこの命令で行うことができます。

あと、手順2の1文字ずつに分けて配列変数に代入する作業も、「文字列分解」という命令で行うことができます。

10行プログラム

それでは、材料がすべて整いましたので、実際になでしこのプログラムとして組み立てていきたいと思います。

# 文章を配列に代入
「.txt」のファイル選択。文章にそれを開く。#1
マップは空。#2
文章を反復 #3
  それを文字列分解。マップにそれを配列追加。#4
# 二次元配列変数を回転させる
マップは、マップの表右回転したもの。#5
# 全角に揃える
ROWを0から(マップの表行数-1)まで繰り返す #6
  COLを0から(マップの表列数-1)まで繰り返す #7
    マップ[ROW,COL] = マップ[ROW,COL]&「__」から2バイト左部分。#8
# 配列を文字列に変換
マップの「,」を「 」に置換。「ー」を「|」に置換。#9
それをメモ記入。終わり。#10

適当な文章を縦書きにしてみたところ

1行目では変換したいファイルを選択して、ファイルを開いて変数「文章」に代入します。2行目では、二次元配列変数として使う「マップ」を初期化します。3行目から4行目では、一行ずつ繰り返し、文章を1文字ずつに分解します。5行目では、横書きを縦書きにすべく、90度右回転します。

6行目から8行目では、各要素を全部チェックして、同じ幅(漢字1文字分=2バイト)に揃えます。これは、もし半角英数文字があった時でも、空白文字で穴埋めして、縦書き文字の列がずれないようにするためです。

9行目では、二次元配列変数「マップ」を文字列として扱うことで、暗黙的にCSV形式に変換しています。CSV形式に変換すると、各要素が「,」で区切られることになります。そこで、「,」を空白文字「 」に置換して行間に置き換えます。これにより、縦書き文字が綺麗に区切られます。その後、「ラーメン」など「ー」を縦書き時に不自然にならないように「|」に変換します。

最後、10行目では、変換が完了したテキストを、「メモ記入」命令でテキストエディタに表示させます。

改造のヒント

どうでしょうか。今回の10行プログラムは、かなりのものが出来たと自負しています。

ですが、改良したい点を出すとすれば、文章によっては、横書きの記号が縦書きになると不自然に見えるものがあるので、これを置換する部分、9行目に置換する項目を増やすとより見栄えがよくなるでしょう。

他には、縦書きの列の区切りを便箋風に見せるために細い罫線を入れてみたり、装飾のために、文章全体を囲ってみたりしてみると、楽しいと思います。

82/90

インデックス

連載目次
第90回 10行プログラミング最終回~10行プログラミングを振り返って
第89回 フォルダ一括圧縮
第88回 テキストエディタに貼り付けたExcelの表を見やすく整形する
第87回 一発加算電卓
第86回 ブログにHTMLソースを貼れるよう変換する
第85回 カード式メモ帳
第84回 時間電卓を作る
第83回 アスキーアート地図エディタ
第82回 縦書き風テキスト作成ツール
第81回 Excelシートの比較を行う
第80回 ノルマ計算機
第79回 高速バックアップ
第78回 単語帳に読み上げ機能をつける
第77回 ホームページのバックアップツール
第76回 英単語帳を作成する(その2)
第75回 英単語帳を作成する(その1)
第74回 メモリカード挿入でデータをコピーするツール
第73回 モールス信号ソフトの作成
第72回 フォトCDランチャーを作る
第71回 残暑見舞い作成ツールを作る
第70回 画面キャプチャプログラムを作る
第69回 様々なルールに対応するビンゴシートのプログラムを作る
第68回 ビンゴカードを作る
第67回 ビンゴマシンを作る
第66回 パスワードマネージャの作成
第65回 アンドゥ機能をつける
第64回 テキストの比較ツール~FCフロントエンド
第63回 システム情報クリップ
第62回 飲み会電卓を作る
第61回 バイナリエディタの作成
第60回 メールフッタ作成ツール(その2)
第59回 メールフッタ作成ツール(その1)
第58回 プロセス監視ツールを作成する
第57回 TODOメモを作る
第56回 携帯電話をテキストリーダーに使う(2)
第55回 携帯電話をテキストリーダーに使う(1)
第54回 「オープンソースカンファレンス2006 Tokyo/Spring」に参加しました
第53回 10行でチャットソフトを作る(2)
第52回 10行でチャットソフトを作る(1)
第51回 プレゼンタイマーを作る
第50回 カラーピッカーを作る
第49回 簡単な暗号作成プログラム
第48回 お手軽データベース「SQLite」を使う
第47回 CUI(コマンドライン)環境を拡張する
第46回 デスクトップ画像を記録するプログラム
第45回 市外局番で住所を調べる検索プログラム
第44回 コマンドライン型ランチャーを作る
第43回 文字数カウンタを作る
第42回 日本語でバッチ処理
第41回 イベントドリブンと電光掲示板
第40回 なでしこでWindowsの「送る」メニューを使いやすくする
第39回 同人音楽即売会M3に参加して思ったこと
第38回 画像のサムネイル作成
第37回 なでしことExcelで行事予定カレンダーを作ろう
第36回 なでしことExcelで月間カレンダーを作ろう!
第35回 なでしことExcelで年間カレンダーを作ろう
第34回 急な電話にも安心、意外と便利な「手書きメモ」
第33回 携帯電話のアドレスデータを取り出す
第32回 記念日カウンターを作る
第31回 顔文字入力支援ソフト
第30回 アスキーアートのためのエディタ
第29回 HTTPサーバーを作る
第28回 手紙のあいさつ文を作成するプログラム
第27回 ギターコードの構成音を表示
第26回 音楽の再生スピードを変える
第25回 ミニスライドショーを作る
第24回 撮影日で写真を振り分け
第23回 PSP用テキスト画像の作成
第22回 金種計算
第21回 パスワードを自動生成
第20回 携帯メールでWEBを更新する
第19回 時間の使い方を反省するプログラム
第18回 ウェブを画像でキャプチャ
第17回 ラーメンタイマーを作る
第16回 画像のトリミングツール
第15回 ごみの分別カレンダー
第14回 デスクトップ検索ツール
第13回 フォント見本帳
第12回 セピア調の画像ビューワー
第11回 健康チェック
第10回 10行で壁紙にらくがきする
第9回 WEBサイトの更新チェッカー
第8回 WEBページのリンク切れをチェック その2
第7回 WEBページのリンク切れをチェック
第6回 音楽ファイルの整理 - メディアタグから自動フォルダ分類
第5回 請求書の自動作成・印刷~Word連携技
第4回 重要データのバックアップ術
第3回 10行ニュースリーダーを作ろう!
第2回 なでしことは その2
第1回 なでしことは? その1

もっと見る

人気記事

一覧

イチオシ記事

新着記事