.この薄っぺらいブログが見えるというのか/

自転車・PC・読書感想。サイクリング部の大学生やってます。

venvのディレクトリ構造についての誤解

単純に馬鹿な誤解してただけなんですが、venvで仮想環境作るときに

python3 -m venv venv-dir

ってやると思う。 俺はvenv-dir以下で開発するのかと思ってたけどこれは違うらしい。つまり

venv-dir
└ lib
└ lib64
└ etc
└ .... #以上がvenvで作られるディレクトリ

└ プロジェクトのコードたち

みたいなディレクトリ構成になると思ってたけどこれは間違ってて、実は

プロジェクトのルートディレクトリ
└ venv-dir
└ プロジェクトのコードたち

が正しい構造らしい。 (; ・`д・´) ナ、ナンダッテー !! (`・д´・ (`・д´・ ;)

まぁこの認識さえ間違っている可能性はある。

でも考えてみればvenvはPATHの先頭に仮想環境のパスを追加するだけなので(うろ覚え)、venv-dirはPC内のどこにあってもいい。例えば(アホみたいだが)/boot に作ってもいい。俺が勘違いしてたように、venv-dir以下にコードを置く必要はない。

ここではvenvのフォルダ名をvenv-dirとしたけど、開発のお作法的には

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

(出典: https://github.com/github/gitignore/blob/master/Python.gitignore )

のどれかを使うのがいいと思う。天下のgithubが言うんだからそうに違いない。

まぁエクスプローラーがスッキリする .envか .venv がいいかなとは個人的に思う。

pythonで画像をbase64エンコードしてimg タグに埋め込む

import base64 as bs
from pathlib import Path
IMG_TAG = '<img src="data:image/jpg;base64,{base64}"/><br>'
image_path = Path('path/to/somewhere')

def make_base64_tag(image_path):
    with image_path.open('rb') as f:
        enc = bs.b64encode(f.read())
        enc = enc.decode()
    return BASE64_URL.format(base64=enc)

以上です。

pathlibでカレントディレクトリ取得できない問題

parent/
 └ child/
  └ main.py

main.pyが

from pathlib import Path
print(Path('.').resolve())

だとする。このとき

$ pwd
parent/
$ python child/main.py
(上位パス)/parent/child

となることを期待するが、残念ながらこうはならず、

$ python child/main.py
(上位パス)/parent

と出力されてしまう。

まとめると

parent/から parent/child/main.pyのPath('.')を実行するとPath('parent/child')ではなく、Path('parent')が帰ってきてしまう

ということだ。これをcwd取得出来ない問題という。これでは非常に困る。たとえばparent/child/main.py からparent/ref.txt を参照するときにPath('.').parent / 'ref.txt'では参照できない。正確に言えば、cwdがchildだと正常に実行できるが、parent/だとエラーになる。

これを解決するにはまず

  1. main.pyが存在する位置を絶対パスでとってきて
  2. その親ディレクトリにアクセスし
  3. ref.txtを参照する

ことが必要になる。

結論から言うと

Path(__file__).resolve().parents[1] / 'ref.txt'

でcwdに関わらずref.txtにアクセスできる。

os.pathとか使う方法は色々ネットにあったけどpathlib単体で解決する方法はなかったので記事にした。

エキサイトブログをMovable Type形式でエクスポートするツールを公開しました

github.com

 タイトルの通りです。エキサイトブログにあった部活のブログを移行する際にまさかのエクスポート機能がないという糞仕様だったので自分で書いたのを改変して公開しました。なにがムカつくってインポート機能はあるところだよな。そういうとこやぞ。 FC2を経由してエクスポートはできるっぽいけどこれがあるから自前で実装していないのだろうか。ちなみになんでFC2経由でエクスポートできるのに自作したのかというと自分でやりたかったからです。あとFC2は新規にブログ作ってから1週間はエクスポートできない。(別のサイトも移行したんだけどそのとき使ったスクリプトが流用できそうだったのもある。)  これからmovable typeを利用したソフトを開発する人向けに言っとくと(いるのか?)これmovable typeのドキュメントになってる。movable typeという名前がブログの出力フォーマットと、CMS両方につかわれているので探すのがとても面倒くさい。なんかバージョンが4で、古いかもしれないけど知らん。

 スクレイピングして記事の内容集めてきてるんですけどまじでエキサイトブログのhtmlが汚すぎて内容の選別が大変でした。部活のブログのhtmlはまさかのtableタグで記事を管理してるのでほんとに汚い。htmlのデザインは全然詳しくないけどこれが良くないことだというのはわかる。

 まぁ糞仕様とかなんだかんだ言ってるけど、そのおかげでスキルが上がったのには感謝してる。綺麗だったらぱっと取ってきて終わりだっただろうし。この公開を通してgithubの使い方とかお作法とかpythonデバッグとかjupyterの使いどころとか学べたので楽しかった。

 READMEにも書いてあるけど現在はタイトル、本文、投稿日時のエクスポートしか対応してません。コメントとかカテゴリとかにも対応するかどうかは皆さんの反応にかかってます。正直自分はもう使わないので開発のモチベがない。反響があればやろうと思います。Webアプリケーション化とかやっても面白そう。

 みんなもこのツールを使って微妙にデザインのダサさが漂うエキサイトブログから脱出して、モダンなはてなブログに移行しよう!

 これ見て雇ってくれる企業とかねぇかな(期待)。

シン・ゴジラ の感想

いつかは見ようと思っていたシンゴジラをやっとみた。色々思うところはあったけど楽しかった。

思うところのなかでも特に言いたいことが「はよエヴァ作れ」ね。これは各所で言われているので俺からはこれ以上はいわない。

全編通して、ずっとエヴァヤシマ作戦を見てる感じだった。BGMもヤシマ作戦の使われてたしね。ヤシマ作戦のBGM汎用性高すぎだろ。割と普通にTVのBGMでも流れてるし。新劇場版のエヴァのCD全部持ってる俺としては他のBGMもめっちゃ好みだった、と思ってスタッフ調べてみたら音楽は鷺巣さんなのね。通りで聞いたことあるテイストだと思った。庵野はよシンエヴァ作れ。

ひたすら会議見させられるけどヤシマ作戦大好きな俺としてはもう会議が面白かった。会議室の全体をとりながらバックで「〜〜を確認」「目標〜〜しました」「〜〜を関係各所に通達」とか情報がながれこんでくるのが好き。エヴァでオペレーターたちがやってたあれ。最後の作戦行動よりむしろ会議が好き。ほんとにエヴァに毒されてしまったと自分でも思う。はよエヴァ作れ。

会議の内容も(グダグダさ方面での)リアリティがすごいあって、形式を踏まないと行動できない日本の民主主義ってのがひしひしと感じられる。射線上に民間人がでてきて射撃の可否を問うシーンで上司から上司へ電話が回されるシーンがあるんだけど、いや現場の報告ぐらい直接聞けるようにしとけよとか、そういう細かいところで現実感がでてくる。

見る前から「内閣総辞職ビーム」って聞いてたから今か今かと待ってたんだけどあれだったのか。なんかもっと間接的なもの(ビームによる不祥事とか)で総辞職かと思ったらもろ直撃で笑った。そういや憲法にそんな文言あったなぁ。試験では全く使わなかった知識がこういうとこで活きてくると楽しい。

まぁ肝心の作戦部分には賛否あるみたいだけどまぁ良いんじゃね。なんとかして(アルマゲドンの削岩機みたいな)もので穴開けて体に直接打ち込むシナリオにすればいいかとおもった。とはいえ俺はそういうもんだと思って楽しく見てました。楽しんだもの勝ち。

結論としてはエヴァ作れです。おしまい。

pythonではてなAPIを使って記事を投稿する

色々認証方式があるけど一番簡単なBASIC認証でやる

template = """<?xml version="1.0" encoding="utf-8"?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app">
<title>{title}</title>
<author><name>name</name></author>
<content type="text/plain">{body}</content>
 <updated>{date}</updated>
 <app:control>
     <app:draft>no</app:draft>
 </app:control>
 </entry>
"""
# ここでインデントするとprintで出力したときにおかしくなる。
# templateの{title}, {body}, {date}にそれぞれ値を入れる。
# nameは変えたりして試してみたけど特に違いがわからなかったのでそのままにしてる。
# dateの書式はdatetime.datetime.strftime('%Y-%m-%dT%H:%M:%S')でいける

uri = 'https://blog.hatena.ne.jp/{hatena_id}/{blog_id}/atom/entry'

# このブログで言うとhatena_id = 'arark', blog_id = 'arark.hatenadiary.jp' (ドメイン名)

api_key = '<api_key>'  # 設定に書いてある

import requests
from requests.auth import HTTPBasicAuth

res = requests.post(uri, auth=HTTPBasicAuth(hatena_id, api_key), data=template)

これでOK

uri変えたりすれば他のAPIでも使えると思う

requestsでUnicodeEncodeErrorがでたけど何でも良いから送信したい時

python のrequestsの話です。

import requests
r = requests.post(url, data=str)
>> UnicodeEncodeError ...

となってしまった時は

r = requetsts.post(url, data=str.encode('utf-8', errors='ignore')

とすればよろしく無い文字を無視してPOSTしてくれる。

これは内部でstr.encode('utf-8')みたいに文字列をバイト列に変換しているためで、最初からdataにバイト列を渡しておけば起こらないのでignoreを指定して無理やりutf-8のバイト列にしている。

ignoreの他にも色々エラーハンドラがあって、 ここ で確認できる。

使用例はこっち

probikekit 利用記録

probikekitでracing zeroを買ったのでその履歴をここに貼っておく。f:id:arark:20181229154957p:plain

海外通販で注文したはいいものの待ち遠しすぎて一日に100回は確認する俺みたいな人はいると思うのでこれを参考にしてほしい。

まぁ感想としてはとにかく遅かった。まず発送26日って言ってるのに28日発送だからね。いや別に遅いのは良いんだよ。知ってて注文したし。でも26日っていってるのに待たされると気を揉むよね。ブラックフライデーで忙しいのもわかるけどね。

んでまぁ日本につくのも遅いよね。10日かかってるし。他のサイトで見たところによると5日とかで着いてるのもあったから5日で来るかな−とか期待しちゃうよね。いいけどね遅くても。

でも日本に来てからは早いって周りも言うし俺もそう思ってるから税関で4日待たされるのはちょっと意外だよね。二次検査(?)までされたみたいだから多分「おいおいホイールに8万とかまじかよ軽く自転車買えるぜwwww」みたいに笑われてたのかな。それとも値段が信じられなくて色々確認とかしてたのかな。

まぁなんだかんだで最寄りの郵便局まで着いて、到着予定日14日(郵便局着いた当日)って書いてあった時は期待して即家帰って関税用意したよね。来なかったけど。次の日の夜7時に来たね。だったら14日って書くなよって思ったけどね。

総じて「遅いのは良いけど期待させるな」って感想だね。みんなも海外通販ではあんまり期待しないで待とうね。

mezzanineのチュートリアル"A Mezzanine Tutorial, Take 2"の覚書

最近python製のCMS(wordpressみたいなもの)である"mezzanine"を勉強してた。日本語での情報が少ないので

Docs / Mezzanine / A Mezzanine Tutorial, Take 2 | Rod's Tech

このサイトを参考にしてたんだけど、解説不足や(おそらく)アップデートで現状に即して無いところがみつかったので気づいたところをかいてく。一通り読んだけど自分自身まだ全然mezzanineについてわかってないので参考程度に読んでください。

元サイトがやってることの流れ(多分)

俺はあまり英語読みたくないので必要なところだけ読もうとしたけど、前のpartで言ったこと使ったりするので同じことすると躓くとおもいます。 

part1

mezzanineのインストール。ブログの投稿ページをMarkdown記法で書けるようにする。

part2

ブログ記事内でコードハイライトを適用する。要らないと思ってここを飛ばすと後でわかんなくなる。(実体験)

part3

デフォルトのページをカスタムする。

part4

新しいページを作る。adminにmodelを追加する。ココらへんから俺の手に負えなくなってきたので覚書がなくなる。

part1

Pagedown, a Mezzanine Markdown Package

#####################
# PAGEDOWN SETTINGS #
#####################
RICHTEXT_WIDGET_CLASS = 'mezzanine_pagedown.widgets.PageDownWidget'
RICHTEXT_FILTER = 'mezzanine_pagedown.filters.custom'
RICHTEXT_FILTERS = (RICHTEXT_FILTER,)
PAGEDOWN_MARKDOWN_EXTENSIONS = ('extra','codehilite','toc')
RICHTEXT_FILTER_LEVEL = 3
PAGEDOWN_SERVER_SIDE_PREVIEW = True

をsettings.pyに追加する際、「RICHTEXT_FILTERSを変な書き方してるのはバグで、たぶん今は治ってると思うよ」と筆者は書いてるけど自分が試したところでは多分治ってないのでそのままコピペしてください。

urlpatterns = patterns("",
("^pagedown/", include(mezzanine_pagedown.urls)),

を置き換えろとあるが、このコードはアプデのせいかもう存在してないので20行目あたりにある

urlpatterns = i18n_patterns(
    # Change the admin prefix here to use an alternate URL for the
    # admin interface, which would be marginally more secure.
    url("^admin/", include(admin.site.urls)),
)

urlpatterns = i18n_patterns(
    # Change the admin prefix here to use an alternate URL for th
    # admin interface, which would be marginally more secure.
    url("^admin/", include(admin.site.urls)),
    url("^pagedown/", include(mezzanine_pagedown.urls)),
)

に置き換える。

part2

Generate Pygments css

python manage.py pygments_styles はエラー出るので python manage.py pygments_styles -h を使う。

python manage.py pygments_styles colorfulもエラーなので python manage.py pygments_styles --scheme colorfulを使う。このコマンドはCSSコードを生成するけど、それをどこに置くかが下の段落に書いてある。

part3

SEARCH_MODEL_CHOICES = []

はsettings.pyのどこかに書く。

Remove Left and Bottom Menus

{% page_menu "pages/menus/tree.html" %} はbase.html の106行目

{% page_menu "pages/menus/footer.html" %}はbase.htmlの135行目

<div class="span2 left">
to

<div class="span1 left">
and

<div class="span7 middle">
to

<div class="span8 middle">

とあるが検索かけてもこの部分がみつからなかったのでアプデで消えたと思われる。あとそもそもbody.htmlが消えてbase.htmlに統合されているので注意。おそらく上のdivタグは <div class="col-md-3 right"> にまとめられてて、実際ここのdivタグを全部取り除くと下の枠が消えるんだけど、これが良い方法なのかはわからん。

Make Home Page CMS Editable

"mezzanine.pages.views.page"

を""で囲むのを忘れないように。警告がでるので気になる人は一番上でimport mazzanineとでもすればいい。

While we're mucking with pages in the admin, clean out pages you don't want.

これはadmin>Pagesからできる。

以降は気が向いたら書く。何年後になるかは知らない。

part4

通勤・通学で疲れているあなたに贈るサイクルライフ

  自転車通学に変えて2年ぐらいたって、電車通学のつらさと自転車のすばらしさに気づいたので布教する。車でいいじゃんとか言うのは受け付けない。車使える人はそっちの方がいいんじゃないかな。

気づいてないかもしれないけど電車通勤は疲れる

  通勤といえば電車という固定観念を持ちがちなので他の手段を検討することなんてないと思うけど電車通勤は本当に疲れる。頻出する階段に、たちっぱなしの満員電車。雨が降れば濡れた傘を常に気にしなくてはいけない。弄りたくもないスマホをいじって時間を潰そうものなら目の疲れと首への負担によってお前は死ぬ。

 思い出してほしい。会社や学校に着く前にすでにあなたは疲れていないだろうか。

おはしますは自転車

 その点自転車は非常に楽だ。何と言ったって基本座っていられる。これは大きい。いや漕いでるじゃねえかと言う人がいるかもしれない。自転車にあまり乗ってない人はわからないかもしれないけど電車で立ちっぱよりはだいぶ楽だ。

 自転車っていうのは自分のペースで漕ぐことができるから電車よりは疲れにくいと思う。思うに電車の疲れって 周りに合わせないといけないことによる所が大きいんじゃないか。電車内では迷惑にならない場所を確保して、乗り換えでは急がないといけないとか。

 しかもいくら自分が電車通勤に労力を払っても電車が早くなるわけじゃないからこれらの努力が徒労に思えてしまう。

 その点自転車なら自分が疲れた分だけ早く目的地に着くし、漕ぐことだけに集中すればいいから精神的につかれることはあんまりない。

ルートによっては自転車の方が早い

 いくら疲れにくいといっても遅かったらあまり自転車を選ぶメリットはないかもしれない。朝の5分は夜の1時間に匹敵するのは周知の事実である。ただルートによっては自転車の方が早いこともある。参考までに自分の例を挙げる。

 俺が電車で大学まで通学すると井の頭→東横→大井町線というように乗り換え2回、50~60分の時間がかかる。

 一方自転車通学ではここ10回の平均をとると約27分(距離は8.5km)である。俺は部活で自転車をやっているから多少早いとしてもまぁあと10分あれば絶対につく。市街地では信号が多いから体力差があってもそんなに時間差はつかない。

 部活の同期はたまに20kmの距離を練習を兼ねて自転車で通学してくるけど、かかる時間は電車とあまり変わらないらしい。

 自転車=遅い、と思ってる人も多いだろうけどそんなことはない。全く参考にならないけど一応言っておくと、プロは50km/hで一時間走る。自転車はどうせ遅いから検討もしないというのはもったいない。

ダメなところもある

 もちろん自転車が電車の完全上位互換ってわけじゃない。雨が降ったら自転車は使えないし、夏は汗だらだらで、冬は耳が痛い。会社や学校に自転車置き場がなかったら探さないといけない。とはいえ、自分で対策ができるものもある。夏は着替えをバッグに入れて運動着で行って、制汗シートで汗をふけばいいし、冬は耳当てやスポーツレギンスなどで対応できる。雨の時はレインコートを着ていけば良い。

 嫌なら別に無理して自転車で行く必要はない。電車を使ったっていいのだ。使い分けできるのが自転車のいいところだ。

自転車通勤の注意点

 自転車通勤をするうえで注意点がある。

 まず第一にちゃんと自転車の整備をすること。さびまくりのチェーンに、ろくに空気を入れていないタイヤではいくらペダルを踏んでも進まない。タイヤに空気を入れて、チェーンに油をさすのは必須。サドルを上げると力が入りやすいのでサドルを上げるのもおすすめ。

 また、距離が短ければシティサイクル(ママチャリ)でもいいけど更に速く移動したいんだったらスポーツ自転車を買ったほうがいい。ちなみに「かっこいい自転車=マウンテンバイク」みたいな認識が広まってるけどほんとはロードバイクとかクロスバイクとか呼ぶのが正しい。

 スポーツ自転車ではかごがない代わりに、シティサイクルより格段に速い。有名どころではGIOS社のMISTRALとか、GIANT社のESCAPEとかがある。どっちも4~5万ぐらいでちょっと高いが速度を求めるなら払う価値はある。

 なんで早いかっていうと、いろいろ理由はあるけど重量が軽い。ギアが多いので上り坂ではより軽く、下り坂ではよりスピードを出せる。サドルが高いから力が入りやすい。かごがないので空気抵抗が小さい。などがある。

 話がそれたけど第二の注意点としては交通法を遵守すること。

  • 自転車は基本車道。(左側通行
  • 交差点では二段階右折。(右車線にはいかない)
  • 車両扱いだから信号では必ず止まる
  • スピード出すならヘルメット推奨

を守ってほしい。

(守ってない人が多すぎる!)

かっこいい

https://www.cannondale.com/~/media/Images/Dorel/Products/Bikes/C11119M/Variants/C11119M3047/images/C19_C11119M_SystemSixHM_DA_Di2_BBQ_HERO.ashx?mw=1000

http://www.riogrande.co.jp/pinarello_opera/pinarello2018/images/racing/P17_DOGMAF10_167_002.jpg

http://www.japan.bianchi.com/images/bike_list/19-Oltre-XR4-Disc-Dura-Ace-Di2-1D.jpg


かっこいい