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を指定するように変更。 共通部分がかなり整理できた、つもり、になっている。

麻のボディタオル

2018年の秋(まだ、自転車を封印してない)、 近江上布伝統産業会館 で、興味からボディタオルを購入した。 お、よかった。: 自然派パン工房 ふるさとの道 ほぼ毎日風呂で使ってきて、ついに寿命がきたようだ。 お店の方に、「糸が痩せて破れてくる」まで使える、と...