2018年5月29日火曜日

Pyhon の pathlib を使ってみる

これまで、python で script を書く時に、ファイル一覧とかのハンドリングには、 os と glob を使っているが、 python 3.4以降では pathlibモジュールが標準ライブラリに追加されたということを知って、 調べてみた。
あくまで、初心者がメモしたもので、使っているわけではないです。
  • python 3.4以前ならos.walk
  • glob

  • 相対パスでも指定可能
  • 絶対パスで指定した場合は絶対パスを返す
  • 相対パスは os.path.abspath で絶対パスへ変換
  • '*', '?', '[]' のワイルドカードが使える
  • ワイルドカードで「xxxを含まない」はできない
  • 再帰的検索は、 glob.glob("/test_dir/**.txt", recursive=True)
  • python 3.4以降、 pathlib が標準ライブラリに追加された。

  • open など python 標準の関数では、文字列の代わりにPathオブジェクトが使える。
  • 外部ライブラリでは、受け付けないものがあるらしい。
  • Pathオブジェクトの文字列への変換は、 Path.as_posix() とか str(Path)
  • 基本的な使い方

  • from pathlib import Path
    # from pathlib import PosixPath
    # from pathlib import PurePath
    
    # これは具象パス(Posixかwindowsのどちらか)になる
    #    pure_path = PurePath(c_path)
    #    posix_path = PosixPath(c_path)
    
    logger.info(Path.cwd())  # 現在のパス
    logger.info(PurePath())  # 現在のパス `.`
    
    logger.info(Path.home())  # ホームディレクトリのパス
    
    logger.info(Path('~/work/test').expanduser())  #  ~ および ~user を展開 
    
    # cd が出来ないみたい。
    os.chdir(Path('~/Documents/proj/gpxs').expanduser())
    
    c_path = Path.cwd()
    p_path = c_path.relative_to('/home/')  # 絶対パスから相対パス
    
    logger.info(c_path)
    logger.info(c_path.parts)  # パスの構成要素(タプル)
    logger.info(p_path)
    logger.info(p_path.parts)
    
    c_files = c_path.iterdir()  #
    logger.info([x for x in c_path.iterdir() if x.is_dir()])
    logger.info([x for x in c_path.iterdir() if x.is_file()])
    
    c_files = c_path.glob("tes*.dat")  #
    c_flist = list(c_path.glob("**/tes*.dat"))  # 相対だとglobが使えない
    
    logger.info(c_files)
    logger.info(c_flist)
    
    # for c_f in c_flist:
    for c_f in c_path.glob("tes*.dat"):
        logger.info(str(c_f))
        logger.info(c_f.root)  # ローカルまたはグローバルルート。あれば。
        logger.info(c_f.parent)  # 親ディレクトリ parents[0]
        logger.info(list(c_f.parents))  # 親ディレクトリ(list)
                                        # 最後がスラッシュなら、ファイル名が空として扱われる
        """[PosixPath('/home/hogehoge/Documents/proj/mp4tomp3'),
            PosixPath('/home/hogehoge/Documents/proj'),
            PosixPath('/home/hogehoge/Documents'),
            PosixPath('/home/hogehoge'),
            PosixPath('/home'),
            PosixPath('/')]"""
        logger.info(c_f.name)  # ローカルまたはグローバルルート。あれば。
        logger.info(c_f.stem)  # name から suffix を取る
        logger.info(c_f.suffix)  # ピリオドを含む
        logger.info(c_f.suffixes)  #
        logger.info(c_f.suffixes[-1])  #
    
        logger.info(c_f.exists())  #
        logger.info(c_f.match("/proj"))  #
        # logger.info(c_f.isfile())  #
    
        logger.info(c_f.stat())
        """
        os.stat_result(st_mode=33188, st_ino=2755182,
                       st_dev=2054, st_nlink=1, st_uid=1001, st_gid=1001,
                       st_size=5764,
                       st_atime=1528063195, st_mtime=1516928971, st_ctime=1516933101)
        """
        logger.info(c_f.stat().st_mode)
        logger.info(c_f.stat().st_size)
        logger.info(c_f.stat().st_mtime)
    
        logger.info(Path.chmod(mode))  # os.chmod() のようにファイルのモードとアクセス権限
        c_f.chmod(0o644)
    
        logger.info(c_f.with_name("hogetest.dat"))  # change name
        logger.info(c_f.with_suffix(".json"))  # ピリオドが必要
    
        c_p = c_f.parent / "testdir"
        c_p = c_f.parent.joinpath("testdir")
    
        logger.info(c_p.is_dir())  #
        c_p.mkdir(parents=False, exist_ok=True)
        c_p.rmdir()
    
        o_file = open(c_f, 'r')
        o_file.close()
        c_f.unlink()  # delete c_f
    
    # mv c_file new_file
    c_file.rename(new_file)
    
    # cp c_file new_file
    new_file.write_bytes(c_file.read_bytes())  # for bin files
    new_file.write_text(c_file.read_text())  # for text files
    
    # newest file in c_path
    m_time, file_path = max((f.stat().st_mtime, f) for f in c_path.iterdir())
    m_time, file_path = max((f.stat().st_mtime, f) for f in c_path.glob('*.dat'))
    
こうゆうのを使えば、少しは、らしい、 スクリプトになるのかしらん。

2018年5月13日日曜日

サドルを購入 SELLA ITALIA FLITE FRICTION FREE

まず、お蔵入りしていたサドルを試した

これまで使ってきたのは、selle sanmarco の Zoncolan で、ベースグレードで、 クッションが厚手のもの。
試しにZoncolanの前、私にはハズレだったやつ(Selle Italia C2 Genuine Gel Saddle)を 押入の奥から出して80kmほど走ってみた。
Zoncolan に比べて、
  1. ノーズ部分が平で少し広いのは、登る時に少し嬉しい。Zoncolan は丸太、C2 は 板。
  2. 硬い。少し痛い。が、我慢できる範囲かも、と思った。
  3. 太股の内側があたる(すれるではない)感覚が困る。ゆずれない。
  4. ひと昔前に合わなかったサドルは、今も合わない。

新しいサドル候補

  • SELLA ITALIA FLITE FRICTION FREE Ti BLK FLOW 重量:205g,サイズ:275×145
    SELLA ITALIA からは、FLITE FRICTION FREE のサドル。 FLITE FRICTION FREE は、下図のようにネックを絞り込んでいる。少し不細工だが、この形状に期待。 で、SLRより、ロングライド向き評価のFliteの安いやつが候補。
  • selle sanmarco アスピデ ダイナミック オープン 重量:215g,サイズ:277×142
    Zoncolan と同じメーカー selle sanmarco の、決め手がなかったのけど、アスピデを候補にした。
  • BROOKS カンビウム C15カーブド オールウェザー 穴あき 重量:432g,サイズ:283×140
    雨にも強いというやつ。しなやかでロング向きということで候補入り。
  • その他、複数

候補の比較、フライトに決める

ネットで得られる写真を加工して比べてみると、下のようになる。まあ、きちんとした寸法ではないので、 参考程度なのだが、実物を並べて比べることは出来ないので。
  • 一番右:C2
    ノーズが徐々に広がってくる。これが内股に当る原因かと思う。 なので、ネックの部分のラウンド形状が重用。
  • 右から二番目:アスピデ
    輪郭は Zoncolan と相似に見えるが少し太いよう。 ネックの部分の断面を、他の写真から想像するに、断面形状が アスピデはフラット寄り、Zoncolan は丸いように見える。少しやばいかも。
  • 右から三番目:Flite
    ネック部分まで細身。内股に当るのは避けられそう。先端部分の太さはC2と同等。 少しフラットすぎるように思う。
  • 一番左:カンビウム
    全体に一回り大きい。これはリアル店舗で触ってみた。 ハンモックのような構造でしなやか。一回り太くても大丈夫かもしれない。
選択は、まず、内股に当らないことを優先。 それなりの言い訳ができる、Flite と カンビウムに絞り、Flite にした。
カンビウムは、ネットに耐久性上の問題をいくつかだけど、見付けたのでヤメた。 Brooks なら丈夫(長く使える)という、先入観がぶれたから。

第一印象

  • 90kmほど高さと水平を調整しながら走行。Zoncolanと比較して。
  • パッドが薄い。Zoncolanは、ベースグレードでパッドが厚いタイプだった。
  • ベースのしなりが少ない。Zoncolanの1/4ぐらいか。Zoncolan がへたっていたから?
  • 硬い。少し痛い。我慢できないほどでは無いが、200ではなく、150が厳しそう。
  • ただ、レーパンが、フェルト一枚程度の極薄パット付きのものだった。 Zoncolanでは、厚パッドが少し不快で、使いふるした安物レーパンを使ってきた。 こいつには、ちゃんとしたパッドが必要。
  • 尻が滑る感じが強い。ポジション調整がある程度進むと、落ち着いてきた。
  • 太股の内側はまったく問題無い。予想どおり。
  • ネックまで絞られているためか、前後のポジション変更幅が少ないみたい。 次はサドルの少し前方へ出して調整を試してみる。
  • 見た目がクロモリバイクに合わない。 オフセットしたシートポストをストレートに変更するのもありかも。 見た目も少し良くなるかも。
まあ、半年ぐらい使ってみよう。ただし、レーパン効果が実感できた場合。
少し不安。 だめだったらどうしよう。(少し怪しくなってきた。)

第一印象,その2

  • 85kmほど、普通のレーパン、サドルを5mmほど前、で、くろんど池まで。
  • パッドの顕著な効果は感じられない。まあ、少しマイルドになったという程度。
  • 前へずらした事で、前回より「いい場所」に落ち着くようになってきている。 もう少しいい所がありそう。もう少し前かな。
  • 舗装の状態が良いと、いい感じなのだが、日本の道路事情なので、 どうしても、荒れた路面によるダメージが蓄積してゆく感じ。 まだ200kmほどだけど、馴染んでくるのか不安。
  • しかし、不細工だな。シートポストを交換したい。

第一印象,その3

  • 普通のレーパン、サドルをさらに2mmほど前、で、130kmほど、竜王方面へ。
  • サドルにドカッと座って脚を休める時、追い風にまかせて麦畑の中を流す時、とか、もう少しだけクッションが欲しくなる。 突き上げで休んでる気にならない。慣れるかな。
  • まあ150kmぐらいは行そうだけど。サドルに「休んでんじゃねえ」と急かされる感じ。

第一印象,その4

  • 普通のレーパンで、80kmほど、脇道や農道のダートとか、荒れた道が多かった。で、かなりくる。
  • 脇道を選んで走るような私には、完全なロード用サドルは無理だったか。
  • カタログではMTB用途を含んでいたはず。でもツーリング用には厳しいか。
  • 短いおつきあいで終わりそう。
  • ロードに付いてきた安価バージョンのToupeと比べてから処遇を考えようか。

2018年5月10日木曜日

コマ図+キューシートみたいなもの、再開 [ Up 20180902 ]

Vikingとの親和性を高める

昨年までは、個別にgpxファイルを VikingRouteConverter とかで ハンドリングしていたが、 GoogleMapの位置情報を、Viking のデータファイルに直接Waypointで登録できるようにしたので、 「コマ図+キューシートみたいなもの」も、Vikingでの作業割合を高めて、 効率を上げようと考えた次第。
ルートデータの編集をVikingで行う場合、 GooglMapとかを背景に出来ないので、結構面倒だったが、 登録してあるPOIだけだが、これらを含めて作業できるのは、結構嬉しい。
まだまだ手数が多いが、去年より省力化できたと思う。
おおまかな流れは以下の図。 今回、初めてPythonのClassを使ったScriptを作ってみた。継承は次の機会。
ガラケー持ちのあがきだなあ。
バッテリーの持ちが悪くなってきている。 そろそろ、交換時期かなあ。

[20180902] Up

Viking の POI として登録してあるポイントから、RoutePoint の近いものを抽出する機能を追加した。 コマ地図1枚あたりの RoutePoint は3〜4点なので、 それぞれから所定の距離、例えば1,5km 以内、の登録済ポイントをリストアップして、各コマ地図毎に 重複削除、sort したリストを作成する。

このデータは、 静的サイトジェネレータ sphinx でmake 出来るように、 reStructured Text で吐き出し、現状、 make epub するようにしている。が、いまひとつなんだなあ。
css て何?という状況なんで、当分このままだろうなあ。

script としては、複数あったものを統合して、jobを指定するように変更。 共通部分がかなり整理できた、つもり、になっている。

Emacs の lsp の設定、なう(202310)

前回さらしてから、さらに1年。そう、3年めになる。 が、今回は一段と自信がない。 環境は、 Debian GNU/Linux 12 (bookworm) + emacs(29.1)。consult + company。 embark は未だに使ってない。 用途は、メモ と ...