読者です 読者をやめる 読者になる 読者になる

古都のIT職人Blog

No more Kyoto.

ポケモンの思い出とか

雑記

すごい勢いらしいですね、Pokémon GO。

pokemongo.nianticlabs.com

初代のポケモンが1996年で確か小学生の頃だったかな。確かミニ四駆ブームの後だったか。

うちはテレビゲーム禁止だったんですが、(ゲームの話題に入れない私を)見かねた友人がゲームボーイ本体とたぶん青(だったはず)を 貸してくれた記憶があります。親の目を盗んでこっそりと遊んでいた記憶があります。あと通信対戦も。あれからもう20年でみんなアラサーなんですよね。元気にしているかなアイツら…。

あとはカードゲームの方ですね。ミュウツーとかユンゲラーでデッキを組んでいたような気がします。コイントスの練習とかしてましたね、当時は。

中学校に進学する時点で引っ越して、そのまま自然消滅だったかな。

そのあとモンスターコレクション、マジック・ザ・ギャザリングトレーディングカードゲーム方面に手を出すきっかけになりました。感慨深いものがあります。


基本方針として中毒性の高そうなモノには手を出さない方針なのでとりあえず様子見です。拡張現実(AR)とか位置情報の活用とか技術面では色々と興味は あるのですが、炎天下を歩き回る気は無いです。

というか、自己啓発系の本を読んで自分が長いモノに巻かれるのが嫌いであることを再認識してので……。


こちらからは以上です。それでは。

ウォートン・スクールの本当の成功の授業

ウォートン・スクールの本当の成功の授業

はてなブログの見出しとMarkdownモード、そしてスクレイピング

雑記 プログラミング はてな スクレイビング

今更ではあるけれど……。 (はてなダイアリーとの互換性だかなんか知らないけど、)はてなブログでは<h2>タグは使わない前提になってるらしい。

なんの話かというと、現状このブログの記事のほとんどは見出しに<h1>タグを使っているエントリが複数ある状態で色々と好ましくないということです。

はてなブログには「はてな記法」「Markdown」「見たまま」の三つの編集モードがあり、そしてこのブログはMarkdownモードで書いています。

一般的なMarkdownの記法では、見出しは#の後ろに一つ以上の半角記号が続く独立した行で、#の数で見出しの階層を表現します。

# 見出し1

## 見出し2

### 見出し3

上記の例で言うと最初の「見出し1」の部分は<h1>タグに、2つ目の「見出し2」は<h2>タグになる。

ほとんどのブログテーマはh2タグの見た目を規定してないか、使わない前提でデザインしているように見える。何も考えずに、見出しとして# ...という書式で記事を書くと、テーマによっては見出しの見た目がイマイチになってしまう。

編集ページのメニューから見出しを入力しようとすると、### ...となるので、 システム側としては###、つまり<h3>タグを使わせたい模様。 少なくとも一般的なはてなブログのテーマを使う限り、見出しは###にしたほうが見た目が自然になる。

参考:はてなブログをMarkdownで書く際には,見出しはh3要素からはじめる - 白覧境幾

ところがこれをやるとHTML5としては<h1>の次に<h2>を飛ばして<h3>になるのでHTMLとしては不自然になる。一説によるとSEOの面から不利かもしれないとのこと。

Markdownモードの方はお気をつけください、ということです。

<h1>タグは記事のタイトル用ということでさすがにまずいので意図せずに<h1>タグになっている箇所だけ<h2>になるように記事を修正したい。


以前から実は気づいていましたが、そもそもこのブログ、文体が「ですます体」だったり「だ・である体」だったり非常に読みにくい。……できればそっちもなんとかしたい。

修正対象ページをリストアップする

というわけでまずは対象ページをリストアップ。

APIで全ページ取り出す方法もあるみたいだけど…。

ブログのURLの末尾に/archiveをつけると全ページの一覧(ただしページネーションあり)が取得できるようです。ただ、ページネーションのリンクをたどるの少々面倒なので、月別アーカイブから取り出す方向で。

はてなブログでは"http://ブログURL/archives/年/月"という形式でその月の記事が(ページネーションなしで)取り出せるようなのでこれを使います。。

準備

Rubyで適当なスクリプトを作る。Ruby については複数バージョンのRubyを共存させるためにrbenvを使ってインストールしている。Ruby 2.3.1を使うものとし、HTMLおよびXMLのパースようのライブラリとしてNokogiriもインストールする。rbenv local 2.3.1というのはこのディレクトリ以下では2.3.1という名称でインストールされているRubyインタプリタ*1を使うように設定するよ、というrbenvのコマンド。2.3.1の部分を使用したいインストール済みのRubyインタプリタを指定。

$ rbenv install 2.3.1
$ rbenv local 2.3.1
$ rbenv exec gem install nokogiri

やっつけ作業用のスクリプト

以下のように動作するやっつけ作業用のスクリプトを作成します。

  1. 月別アーカイブのURLを適当に生成(2015/01-2016/12)
  2. ブログ開始から今月までの記事を対象にするので、対象となる記事が存在しない月のURLを捨てる
  3. それぞれの月の記事一覧ページのHTMLから各ブログ記事のURLをNokogiriで取り出す
  4. それぞれの記事の本文のHTMLを取得し、不適切な<h1>タグを含むページを探す

やっつけURL一覧取得スクリプトRuby)。

対象のはてなブログの各エントリにおいて、見出しにh1タグが使われているURLを見つけ出すやっつけ作業 ...

あとは出力されたURLにアクセスして、個別に修正する作業を繰り返すことになります。 同じ要領で「だ・である体」のエントリも検出することもできるけど後回し。


幸か不幸か、リストアップされた修正が必要なエントリは合計39エントリ……。

パトラッシュ…、(やる前から)僕もう疲れたよ?


修正作業はこれからですが以上です。

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

*1:ランタイムというべきなのか実行エンジンというべきなのか?

Tesseract-OCR の各言語のラッパーいろいろ

OCR tesseract プログラミング

サーバーサイドでOCRさせたいので各言語のtesseract-ocrラッパーを調査。

なお、APIとして使う分にはtesseractコマンドを呼び出すタイプはリクエストの度にプロセスを生成することになるので好ましくないかと。

今更であはるけれども書いておくと、Tesseract-OCRというのはGoogleが開発を支援しているオープンソースOCRエンジンのこと。

ご本尊:tesseract-ocr · GitHub

続きを読む

Ruby で平仮名またはカタカナをローマ字にする

Ruby 日本語関連 プログラミング

ちょうどいいRubyのライブラリがないか調べたので備忘録。 昔はSuikyoというライブラリがあったはずだけど、今はメンテされていない様子。

ローマ字表記について

そもそも論として、いわゆるヘボン式訓令式という2大派閥(?)に加えて外務省方式、駅名方式などかなりのバリエーションがある。ヘボン式についても、オリジナル版(Traditional Hepburn)と改訂版(Revised Hepburn)修正ヘボン式(Modified Hepburn)、日本人による改良版などの亜種があるらしい。

ヘボン式にすべきか訓令式にすべきかという議論はあるようですが、ソフトウェア開発者としてはユーザー次第としか言いようがない。 個人的には人名についてはヘボン式の方が字面がきれいに見えるので良いと思いますが。

参考:ローマ字 - Wikipedia

その2:Hepburn romanization - Wikipedia, the free encyclopedia

とりあえずヘボン式訓令式か、長音をどう扱うかをメインにirbで試した結果。

Rubyのライブラリ

主な違いは長音をどうするか、入力に平仮名、カタカナの両方を受け付けるかどうかなど。適当に検索した範囲では、以下の3つ。

  • romkan
  • romankana
  • romaji

romkan

平仮名からローマ字に変換およびローマ字から平仮名に変換。長音はハイフン-に変換される。

romkan | RubyGems.org | your community gem host

Ruby/Romkan: a Romaji/Kana conversion library for Ruby

ヘボン式から訓令式への変換用のメソッドto_kunreiがある。

irb(main):001:0> require 'romkan'
=> true
irb(main):002:0> "にほんばし".to_roma
=> "nihonbashi"
irb(main):007:0> "にほんばし".to_roma.to_kunrei
=> "nihonbasi"
irb(main):009:0> "らーめん".to_roma
=> "ra-men"
irb(main):010:0> "おーいにっぽん".to_roma
=> "o-inippon"

最終更新日が2011年でちょっと不安。irbでは問題なく動いている。

romankana

平仮名からローマ字に変換およびローマ字から平仮名に変換。

romankana | RubyGems.org | your community gem host

GitHub - ymrl/romankana

irb(main):004:0> require 'romankana'
=> true
irb(main):005:0> "ニホンバシ".to_roman
=> "nihonbashi"
irb(main):006:0> "ジュンイチ".to_roman
=> "junichi"
irb(main):009:0> "ラーメン".to_roman
=> "raamen"
irb(main):010:0> "おーいにっぽん".to_roman
=> "ooinippon"

長音は直前の母音を重ねるタイプ。下記のようなケースを区別できない。

irb(main):012:0> "さあどうする".to_roman
=> "saadousuru"
irb(main):013:0> "さーどうする".to_roman
=> "saadousuru"

入力文字列がリアル鬼ごっこのような文体でない限り問題にはならないかも知れない。

参考:ローマ字とひらがなを変換する - Ruby Tips!

romaji

平仮名、カタカナからヘボン式ローマ字に。長音はハイフン-に変換される。このライブラリは發音(ん)に対してnmを使い分けるようにになっている。 しかし、nの後ろに母音またはyが来るケースについては考慮されてない。

romaji | RubyGems.org | your community gem host

GitHub - makimoto/romaji: Romaji-Kana transliterator

irb(main):001:0> require "romaji"
=> true
irb(main):002:0> require "romaji/core_ext/string"
=> true
irb(main):003:0> "にほんばし".romaji
=> "nihombashi"
irb(main):004:0> "ニホンバシ".romaji
=> "nihombashi"
irb(main):005:0> "ジュンイチ".romaji
=> "junichi"
irb(main):006:0> "ラーメン".romaji
=> "ra-men"
irb(main):007:0> "おーいにっぽん".romaji
=> "o-inippon"

課題など

romkan以外のライブラリにはnの次に母音(a,i,u,e,o)やyが来た場合にアポストロフィを入れる処理はないように見える。また、訓令式との切り替えはromkanにしかない。

なお、長音を文字の上にマクロン(またはサーカムフレックス)をつけて表記したい場合は後処理で一工夫必要。

漢字仮名交じりの文字列からローマ字化したい場合は、zipangというライブラリもある。

参考:日本語をURL用ローマ字に変換するgem Zipangを作った - Qiita

簡単ですがここまで。

記事下のカスタマイズ(関連記事を表示する)

今更ながら関連記事を記事下に入れるようにしてみました。

下記のページによると、いくつか方法があるそうですが、

www.jimpei.net

一番楽そうなLInkWithinを使いっています。詳しい設置手順はこちらが詳しいかと。

デフォルトのままでは英語で"You may also like ...(省略)"と表示されるので、linkwithin_textという変数に値をセットして変更します。 貼り付けるタグ(XXXXXXXはサイト別のID)の、

var linkwithin_site_id = XXXXXXX;

のすぐ下に、下記の行を追加しています。

linkwithin_text="関連記事";


関連記事の精度はまあまあといったところでしょうか。

以上です。