みろりHP


緑色さんの多目的ブログ
みろりえいちぴー(旧)
引っ越し先 みろりHP: https://www.mrrhp.com
| カテゴリ:- |
スポンサーサイト

一定期間更新がないため広告を表示しています

| スポンサードリンク | - | - |
| カテゴリ:プログラミング |
Python 波ダッシュ問題レポート



「1日1python」の時間です(ただし隔週放送)。みろりhpの記事をpythonで読み込んでいたら、スゲーイヤな問題に咬まれたのでそれについて書く。
なお今回のレポート内容はこのブログだとなんか手に余る感じ。ブログの文字コードがEUC-JPだからだ。今回の内容はUTF-8で書きたいところ。jugemブログは早急に最先端であるUTF-8を導入して頂きたいものだ。これについては随時補足しとく。



マジびっくりなことに、
は違う文字だ。前者は「波ダッシュ(WAVE DASH)」といって、後者が「全角チルダ(FULLWIDTH TILDE)」という。
pythonで下記スクリプトを実行してみればそれがわかる。
wavedash = '〜'        # 前者。波ダッシュ。
fullwidthtilde = '〜'  # 後者。全角チルダ。
print(wavedash == fullwidthtilde)  # Falseになりやがる。ビックリだな。
UTF-8にはどっちの文字も含まれてるんだが、EUC-JPとかSJISには全角チルダのほうが含まれていないらしい。だからこのレポートはUTF-8で書きたかったわけ。
【補足】一応上のスクリプトではエスケープ? がかかってちゃんと二種類表現されているのでコピペしてpython実行してもFalseは得られるみたい。

見分け方はこう。
# b'\xe3\x80\x9c' って出れば波ダッシュ。
print(str(wavedash.encode('utf8')))

# b'\xef\xbd\x9e' って出れば全角チルダ。
print(str(fullwidthtilde.encode('utf8')))

上の見分け方を使って判別関数を作っといたぜ。
def is_WAVEDASH(char):
    return char.encode('utf8') == b'\xe3\x80\x9c'

print(is_WAVEDASH(wavedash))        # Trueになる。
print(is_WAVEDASH(fullwidthtilde))  # Falseになる。


def is_FULLWIDTHTILDE(char):
    return char.encode('utf8') == b'\xef\xbd\x9e'

print(is_FULLWIDTHTILDE(wavedash))        # Falseになる。
print(is_FULLWIDTHTILDE(fullwidthtilde))  # Trueになる。

変換する関数も作ったぜ。てか今回の問題で俺がいちばん必要としたのがこれ。波ダッシュと全角チルダが混在するデータで処理をしようとするとどっかでオカシクなる。文字化けしたり、見た目には同じ文字なのに「違う」って言われたり(冒頭のヤツ)ね。そういう恐れのある文字列は全部以下の関数を通しちまおうぜ。
# 波ダッシュを全角チルダに変換する。reverseにTrue渡せば逆になるよ。
def convert_WAVEDASH_to_FULLWIDTHTILDE(string, reverse=False):
    wavedash = (b'\xe3\x80\x9c').decode('utf-8')
    fullwidthtilde = (b'\xef\xbd\x9e').decode('utf-8')
    if not reverse:
        return string.replace(wavedash, fullwidthtilde)
    else:
        return string.replace(fullwidthtilde, wavedash)



この問題に出会ったのは、みろりhpのデータをxmlエクスポートしたときだ。ナゼかこのブログはEUC-JP(波ダッシュしかないほう)で書かれているのに、出力するとUTF-8(どっちもあるほう)になり、しかももともと含まれていた波ダッシュがすべて全角チルダに置き換わる謎仕様だったんだ。それを処理しようとしたらおかしなことになった。そこでこの調査が必要になったわけ。


| 緑色 | プログラミング | comments(0) |
| カテゴリ:アコギ |
アコギ 山崎まさよし『One more time One more chance』



歌はなしのインスト。今月はかなりヘボ。だけれど一月一曲っていうノルマを優先した。

これまでで一番難儀した。左手がむつかしい。半分アルペジオだから押さえの誤魔化しもきかない。歌も試しはしたけれど、とてもそっちの調整まで気が回らなかった。



ままよと公開しちまった今回だけれど、実は思い入れのある曲だ。ギターを選んだ理由である、例のむかし一緒に住んでた子であるが、その子のレパートリーの中で俺が一等気に入っていたのがこの『One more time, One more chance』だったのだよ。曲の練習のため山崎まさよしさんの歌を何度か聴いたけれど、俺はあの子の歌のほうが好き。歌を試したものの結局ヤメてインストにしたのも、いくら歌っても記憶の中のあの歌に近づけなかったからってのがある。
ってそんな思い出の曲をヘボで公開してんじゃねーよ。きっといつかリトライするかもわからない。


| 緑色 | アコギ | comments(1) |
| カテゴリ:プログラミング |
Python raiseノート



「1日1python」の時間です(ただし隔週放送)。ようやく raise を理解したのでまとめるぜ。raise文との出会いはオライリーだった。raiseとは例外を飛ばすものとの事だったけど、そもそも例外って何かわかんねーしassertっていう何か似てるのもあるしで全く理解できなかったのだよな。でも先日プログラマさんの書いたコラムとか読んでて、throwっていう他の言語の構文を知ったことでとうとう理解できた。



例外って何?
プログラム実行中に起こる、想定外の現象のこと。ほんでプログラム実行中に起こる想定外っつったらエラーのことだから、まあエラーのことだ。以下のように書き下したらよく分かったよ。
  • 例外 -> 想定外 -> プログラムにおける想定外とは? -> エラー
まあその、ドシロートっていうのはこういう用語ひとつでも引っかかっちゃうものなのですよ。pyてょんちゃんが「Exception!!」って叫んだら、「作者のお前が想定してなかったことが起きたぜ!」って意味になるわけだね。

raiseって何?
raiseは例外を生み出してひとつ上の階層に投げる呪文だ。いやエラーなんて放っておいても起こるんだから…なんでわざわざ自分で作るわけ!? ってのがオライリー読んだときは疑問で理解ができなかったんだけど、python的にはエラーじゃないけど俺的にはエラーになって欲しいって状況を想定したら理解できた。
def foo(flag):
    if not flag:
        raise Exception('Falseが来たから俺の都合で終了するよ。')
    return flag

foo(False)
実行すると以下のようになる。
Traceback (most recent call last):
  File "/Users/.../py.py", line 11, in <module>
    foo(False)
  File "/Users/.../py.py", line 8, in foo
    raise Exception('Falseが来たから俺の都合で終了するよ。')
Exception: Falseが来たから俺の都合で終了するよ。
いやー、Exceptionてのは俺の手中にはない範疇のモノだと思っていたから、ちょっと感動ですね。

感動ついでに自作のExceptionを作ってみる
こんなの書いたらできたわ。
class MidoriException(Exception):
    def __init__(self, error_message='緑エラーだよ。'):
        self.error_message = error_message
    def __str__(self):
        return self.error_message

raise MidoriException()
実行すると以下。
Traceback (most recent call last):
  File "/Users/.../py.py", line 11, in <module>
    raise MidoriException()
__main__.MidoriException: 緑エラーだよ。
すげえMidoriExceptionなんつーのが表示されちゃったぜ。なにこれ面白いんだけど。python的にはエラーじゃないんだけど俺の都合でエラーにする箇所については俺オリジナルのExceptionクラスを使えば、結果を見たときわかりやすいかもしんない。

「上の階層に投げる」てのはどゆこと?
階層ってのは「関数の呼出元」と「呼ばれた関数」の層のことだ。「呼ばれた関数」側でraiseすると、生み出したExceptionは「呼出元」へ浮かび上がる。俺が浮かび上げるから raise なんだな。他の言語では throw っていう文が使われてるらしいけど、そっちでは「浮かび上げる」じゃなくて「投げる」っていう感覚なんだね。 ちょっと書いてみる。グローバル -> foo -> bar -> baz の順番で階層的に関数を呼び出して、第四階層であるbazでMidoriExceptionをraiseしてみるぜ。
# 第四階層
def baz():
    # 上の階層barにExceptionを能動的に浮かび上げ(raise)る。
    raise MidoriException('第四階層でエラーが発生しました。')

# 第三階層
def bar():
    # 浮かび上がってきたExceptionは勝手に上の階層fooに浮かび上がる。
    baz()

# 第二階層
def foo():
    # 同じく、勝手に上の階層に浮かび上がる。
    bar()

foo()
なお、fooの中でtryを書いてbarから浮かんできたExceptionを捕まえて、自分で改めてraiseしても同じ結果になるみたい。
def foo2():
    try:
        # ここで捕まえる。
        bar()
    except Exception as e:
        # 捕まえたのを浮かび上げる。
        raise e
てことはさ、普段エラーが起こっているときはその場で勝手にraiseが起きていると思ってよさげ。あーなるほどね!



「例外」が理解できなかったことについては上述した。いっぽう、raiseが理解できなかった理由は、raiseという言葉が指すものを初見で勘違いしたからだ。つまり、実際は「例外を生んで上の階層に浮かび上げる」ことを指すんだが、俺は「例外を生むこと」自体をraiseだと思っちゃったんだよ。こう、俺にはよくわからないpythonの内部から、Exceptionというものを持ち上げるっていうイメージ。それは間違ってた。「Exceptionというものを持ち上げる」のは
Exception()
だ。raiseをつけることで初めてそれが上層へ飛び上がる。で、まあそういう勘違いをしてたんだけど、他の言語のthrowっていう言葉だとそういう間違いをしようがないよな。しかも他の言語だと
throw new Exception();
っていう書き方をしてたんだよ。「新しくExceptionてクラスのインスタンス作ってそれを投げるのね」ってスグわかった。で、pythonだとそういう構文はあるのかな? って考えて、ああ、raiseってこのことだったのか! と思い至れたってわけ。


| 緑色 | プログラミング | comments(0) |
| カテゴリ:みろりHP |
アーカイブページを作った



実験的に、右のサイドバーに過去記事アーカイブスペースを作ってみた。年ごと、またはカテゴリーごとの記事タイトル一覧を見れる。
もともとブログについているカテゴリ表示や年月選択にちと不満があってさ。一度に10件しか表示できないし。いや、10件なのは仕方ないぜ。画像つきの記事を一度に100件とか表示されても挨拶に困っちゃうからな。けどページ送りがかったるいよな。過去記事を閲覧したいときは、タイトル一覧がずらっと全部並んでいるのがやはり正解だろう。実際にマビノギ日記あたりを読んでみたが、ストレスフリーに過去記事を漁ることができたぜ。

ただしでっかい問題があって、これは自動更新ではなくて手動更新なんだよな。だからブログデフォルトのカテゴリ絞りや年月選択も残しておかざるをえない。すると似たような機能がサイドバーに並ぶことになって、ちょいと紛らわしい。だから、実験的な設置。自動更新にできたらいいんだけど。こうやってみんな、レンタルブログからレンタルサーバに引っ越して、ブログプログラムを自前で組むようになっていくのだろうなあ。



もちろんアーカイブリストのhtmlはプログラム(python)で自動作成した。あんなもん手作業で作っていられない。


| 緑色 | みろりHP | comments(1) |
    123
45678910
11121314151617
18192021222324
252627282930 
<< June 2017 >>
+ みろりHP内検索
+ 閲覧記事
+ 過去記事アーカイブ
+ 年月選択
  • 2019年 02月 (1)
  • 2019年 01月 (2)
  • 2018年 12月 (6)
  • 2018年 11月 (6)
  • 2018年 10月 (3)
  • 2018年 09月 (8)
  • 2018年 08月 (4)
  • 2018年 07月 (6)
  • 2018年 06月 (5)
  • 2018年 05月 (4)
  • 2018年 04月 (7)
  • 2018年 03月 (6)
  • 2018年 02月 (6)
  • 2018年 01月 (8)
  • 2017年 12月 (9)
  • 2017年 11月 (9)
  • 2017年 10月 (4)
  • 2017年 09月 (6)
  • 2017年 08月 (6)
  • 2017年 07月 (8)
  • 2017年 06月 (4)
  • 2017年 05月 (7)
  • 2017年 04月 (8)
  • 2017年 03月 (7)
  • 2017年 02月 (10)
  • 2017年 01月 (6)
  • 2016年 12月 (8)
  • 2016年 11月 (8)
  • 2016年 10月 (5)
  • 2016年 09月 (5)
  • 2016年 08月 (7)
  • 2016年 07月 (9)
  • 2016年 06月 (6)
  • 2016年 05月 (8)
  • 2016年 04月 (10)
  • 2016年 03月 (10)
  • 2016年 02月 (8)
  • 2016年 01月 (10)
  • 2015年 12月 (9)
  • 2015年 11月 (6)
  • 2015年 10月 (5)
  • 2015年 09月 (4)
  • 2015年 08月 (8)
  • 2015年 07月 (5)
  • 2015年 06月 (3)
  • 2015年 05月 (7)
  • 2015年 04月 (8)
  • 2015年 03月 (12)
  • 2015年 02月 (8)
  • 2015年 01月 (4)
  • 2014年 12月 (5)
  • 2014年 11月 (5)
  • 2014年 10月 (7)
  • 2014年 09月 (4)
  • 2014年 08月 (7)
  • 2014年 07月 (6)
  • 2014年 06月 (4)
  • 2014年 05月 (12)
  • 2014年 04月 (9)
  • 2014年 03月 (6)
  • 2014年 02月 (6)
  • 2014年 01月 (8)
  • 2013年 12月 (7)
  • 2013年 11月 (10)
  • 2013年 10月 (10)
  • 2013年 09月 (9)
  • 2013年 08月 (11)
  • 2013年 07月 (10)
  • 2013年 06月 (9)
  • 2013年 05月 (15)
  • 2013年 04月 (11)
  • 2013年 03月 (5)
  • 2013年 02月 (7)
  • 2013年 01月 (6)
  • 2012年 12月 (9)
  • 2012年 11月 (10)
  • 2012年 10月 (10)
  • 2012年 09月 (4)
  • 2012年 08月 (2)
  • 2012年 07月 (7)
  • 2012年 06月 (13)
  • 2012年 05月 (13)
  • 2012年 04月 (15)
  • 2012年 03月 (4)
  • 2012年 02月 (12)
  • 2012年 01月 (9)
  • 2011年 12月 (5)
  • 2011年 11月 (13)
  • 2011年 10月 (2)
  • 2011年 09月 (2)
  • 2011年 08月 (1)
  • 2011年 06月 (1)
  • 2011年 05月 (4)
  • 2011年 04月 (10)
  • 2011年 03月 (8)
  • 2011年 02月 (11)
  • 2011年 01月 (14)
  • 2010年 12月 (14)
  • 2010年 11月 (17)
  • 2010年 10月 (17)
  • 2010年 09月 (19)
  • 2010年 08月 (22)
  • 2010年 07月 (18)
  • 2010年 06月 (16)
  • 2010年 05月 (19)
  • 2010年 04月 (15)
  • 2010年 03月 (22)
  • 2010年 02月 (18)
  • 2010年 01月 (18)
  • 2009年 06月 (2)
  • 2007年 12月 (10)
  • 2007年 11月 (7)
  • 2007年 10月 (9)
  • 2007年 09月 (4)
  • 2007年 07月 (5)
  • 2007年 06月 (11)
  • 2007年 05月 (6)
  • 2007年 04月 (4)
  • 2007年 03月 (1)
  • 2006年 01月 (21)
  • + カテゴリ
    + ブックマーク
    + 最近のコメント
    + アクセスカウンター
    全体(since 2010.02.03.)
    今日… 昨日…