too late amatuar programmer

[python] 一度に複数のパターンを置換する関数(正規表現を置換前文字列とできる版)

2010-10-30 by ebon | Lavel: 0 comment

一度に複数のパターンを置換したい場合がある。
その場合、pythonクックブックの同名レシピが参考になる.

そのレシピでは、以下のように、1パスで対応できることに意義を置き、問題が定義されている.
単一の文字列の中の複数の文字列パターンを、同時に(1パス)で置換したい
それに対する解法・考察として、以下3パターンが書かれている.

  • シンプルな例
  • クロージャーを用いた例
  • オブジェクトを用いた例

よくある同問題について、問題と対策について分かりやすく記述されており、このレシピは大いに参考になると思う.

[python] 文芸的プログラミングツール:PweaveとPyLitの比較

2010-10-11 by ebon | Lavel: 0 comment

前回の記事で、python用文芸的プログラミングツールをピックアップし、そして、PweaveとPyLitの2点を候補とした.
ここでは、その2つのツールの主な特徴・prosconsを取り上げ全体的な使用感を比較してみたい.
自分の事情では、PyLitの方が使いやすい という結論が出た.
理由は以下に記すが、簡単に言うと、使用環境/言語を選ばない という至ってシンプルな理由だ.

[python] 文芸的プログラミングのためのツール?

2010-10-08 by ebon | Lavel: 0 comment

コードとコード解説(解説といっても大したものではない.)文書の管理方法を模索している.
対象言語はpythonであり、特にpython用として, コードと文書管理のためのツールで何かいいものはないかというところだ.

そんな中探していると,「文芸的プログラミング」をコンセプトにしたプロジェクトをいくつか発見した.
それらツールをピックアップしてみる.

先に書いておくと、詳細を比較検討した訳ではないが、
ざっと見てみた中で、特に使いたいと思ったのは「Pweave」,「PyLit」の2つだ.

Interlinguaを学ぶことが,スペイン語を最も早く習得する方法?

2010-09-19 by ebon | Lavel: , 0 comment

「ある自然言語を習得するために、まず人口言語を学ぶ」
というアプローチは人口言語の紹介と共に、よく提言されている.

その例のひとつとして、
ロマンス諸語を学ぶ場合にinterlingaをまず学ぶ
というアプローチがある.

このアプローチをざっくり言うと、「ロマンス諸語によく似ていてより簡素なinterlinguaをまず学んでおけば、コア感覚が養われて他のロマンス諸語を学ぶときはすぐ学べる!というものだ.

しかし、このアプローチの紹介日本人にとってはメリットが薄いと考えられる.
ここでは、概要の紹介と、メリットが薄そうと考える理由を記載してみる.

※そもそもinterlinguaとは という所は、
wikipedia(english), そして以下の本によくまとまっている.

EngLits.com: Short Versions of Long Books シェイクスピア、オースチン、ディケンズ 等,名作をお気軽に

2010-09-15 by ebon | Lavel: 0 comment

語学学習を兼ねて、あるいは学習の目的自体でもあり、
古今東西の名作古典を原書で熟読できるようなりたいと思っている.
さらに、これら作品を、音声・電子テキストで得られると尚良い.

そんな折、”名作古典をショートバージョンで”というコンセプトを元に制作されている、
以下のコンテンツを見つけた.
いかにも現代風のつまみ食いコンセプトである

Englits.com
+ ポッドキャスト紹介

[python] python2.6で使用可能なpathモジュール

2010-08-15 by ebon | Lavel: 0 comment

気軽にstat情報を走査したり、ディレクトリを走査する乗り物スクリプトのような、
findコマンドライクに扱えるものが欲しいと思い、osモジュールやwalkモジュール関連の情報を漁っていたところ、pathモジュールなるものがあるということを以下から知った.


まさに目的として、上記記事で書かれている通りなので喜んで使おうとしたがリンク切れだった..
少し探してみたが、作者による最終更新は結構前であり、オリジナルは2.4までしか対応してないようだ.( The "path" module )

めげずに探したところ、やはり別の方が2.6対応版をGitに上げていた.

古典を読むことは、語学学習に特別な効果をもたらすのか

2010-08-10 by ebon | Lavel: 0 comment

多言語話者には、古典愛好家/古典語学習者の割合が非常に多い気がしている。
たまたま私が目にした人間・話がそうだった というように、
サンプルに偏りがあるのは重々考えられる。
ただ、その関連性を目にする頻度から、以下の点、

  • 古典を読む事が語学力を養うために有効な手段なんだろうか
  • 有効だとしたらどういった性質がそうさせるの

という点が気になっていたので、例を上げつつ少し考えてみたい.

あるいは、古典を読む事というより、”古典語の学習は語学力アップに効果的なのか”
という事が実質の疑問と言えるかもしれない.

ラテン語は、ロマンス諸語の元である言語なため、
他ロマンス諸語を学ぶのに有効というのはよく言われていることだが..

ひとまず以下に古典愛好家である多言語話者の例をあげる.

[python] lxmlをインストール: ソースから/Macportから.

2010-08-07 by ebon | Lavel: 0 comment

lxmlライブラリを,[RedHatにソースからインストール ,Mac10.5にMacportでインストール]した際のメモ.

そこそこ大きなXMLファイルをパースしたり編集したりしたかったので、
柔軟性と高速なパフォーマンスを備えるlxmlを使用することにした.

基本、以下を参考にさせていただき、はまることなくインストールできた.


自分の場合は、予想に反して特にエラーもなくできたが、
何らかエラーが発生する場合、(そしてエラーは頻発する模様だ)上記記事のコメント欄等含めて参考になるかもしれない.

以下手順でインストール.

[python] (比較的)安全にファイル内の文字列を(その場で)置換する

2010-08-03 by ebon | Lavel: 0 comment

ファイル内の文字列を(その場で)置換したいことは良くある.
単純にファイルを読み込み置換するだけですむなら良いが、やはりできるだけ安全に行いたい.

perlではよく適当に -i オプションを付けて済ませてしまっていたが、
それはどうやら常軌を逸した行いのようだ.
なので少しは誠意ある振る舞いが出来るよう、
(比較的)安全にファイル内の文字列を置換する方法を考え、コードを残しておく.

ほんとに最低限の事だと思うが、安全さを以下のポイントを抑える事で担保する.

ポイント:

  • 一時ファイルに書きだし、それをコピーすることで(その場での)書き込みを行う
  • try ~ finally で元ファイルのcloseは確実に行う

これらをまとめ、以下のコード のように置換を行う関数化しておく.

# -*- coding: utf-8  -*-

import os,re,sys
import tempfile
import shutil

def pat_replace(stext,rtext,file):
    """
    porpose : ファイル内の文字列を(その場で)置換する 
    usage   : pat_replace("置換前パターン","置換後文字列",'target-file') --> replaced file
              * stext は reパターンで渡す必要がある.
    """    
    tmpfd,tmpname = tempfile.mkstemp(dir='.')
    try:
        output_file   = os.fdopen(tmpfd, 'w')
        input_file = open(file)
    except IOError:
        print '"%s" cannot be opened.' % file
    else:
        for line in input_file:
            a = stext.sub(rtext, line)
            output_file.write(a)
    finally:
        output_file.close()
        input_file.close()

    shutil.copyfile(tmpname,file)
    os.remove(tmpname)

[python]「各条件を満たす最初の要素」★以外★を抽出する方法

2010-07-24 by ebon | Lavel: 0 comment

とあるものを書いていて、

"各条件を満たす最初の要素"★以外★を抽出する

という要件が出てきた.

分解し、各動作の組み合わせで、すぐ解決できそうなものではある.
が、その過程でけっこう頭を悩ましてしまったので、解決方針の考えをまとめておく.
思ったより悩んだ要因として、以下の事がある.

  • 条件は複数ある
  • 最初の要素★以外★を抽出したい の以外の部分

これらの解決法としてどう表現するか?を試行錯誤したログのような記事だと思っていただきたい.

やはり例がないと何がしたいのかも分からないので、簡単な例を用意する.
前段階として考えていくに辺り、★以外★の部分もひとまず邪魔だ、
その部分をまず除き、単純化した要件で考えてみる.

"各条件を満たす最初の要素"を抽出する

こちらの動作で考えてみたい.この動作であれば至ってシンプルかと.
例題を用意する.

例題:
リスト:[6,1,5,3,8,10,11]から、
5より小さい要素・8より大きい要素の、それぞれ条件を満たす最初の要素を取り出せ  

つまり期待する動作としては、以下の動作だ.

f [6,1,5,3,8,10,11] -> [1,10] (3,11は対象にならない)
まずすぐに思いつく方法として、以下のfilterなどでもよくあるやり方がある.

  • 条件を満たす最初の要素をリストから抽出する関数、find()関数を用意する
  • 各条件のリスト([p1,p2,...])を用意する
  • 探索対象のリスト(L)を引数としたfind関数へ、各条件を順次適用する