THUMBS SHIFT→

このブログは主に親指シフトを用いて書かれています

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 IMG_TAG.format(base64=enc)

以上です。

エキサイトブログを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

ロードバイクのシフトワイヤーを変えたけども

 先日自転車に乗っていたら、唐突にワイヤーが切れた。その時は一緒に走っていた先輩の応急処置のおかげで一応家に帰ることはできた。先輩がいなかったらトップ固定で帰ることになっていたかと思うと怖い。

 で、せっかくパーツを変えるので、いいものにしようと思って少し良いケーブルセットを買った(自転車乗りあるある)。ケーブルのグレードは、ポリマーコーティング>オプティスリック>ノーマル となっているらしい。  ポリマーコーティングはすぐ剥がれるらしいので却下して、オプティスリックのを買った。ちょうどさっきの先輩もシフトワイヤーをノーマルグレードのケーブルに変えるのでシフトの軽さを比べてみた。

 結果は・・・「大差なし」。俺からすると自分のほうがちょっと軽いかなと思ったけど先輩は自分のが軽いと言い張っている。まぁどうせシフトの軽さが結果につながるようなレースに出るわけでもないので何でもいいんじゃねという結論になった。

zwiftはいいぞ

 最近zwiftを始めた。どっかにパワーメーターねえかなーと思って先輩に聞いたところ部室にパワータップ付きのホイールが2つ転がってるらしいのでそれを使う。フリーボディがめっちゃ削れてたりリムがブレーキするの怖いほど削れてたり、スプロケなかったり、付いててもスプロケの位置ずれててディレイラーの調子が悪くなったりしたが、フリーボディはこれまた部室に転がってた新しい奴に交換して、リムはローラーしかしないので放置して、スプロケは同期からいらなくなったのを譲ってもらった。 

 で、ここ3日ぐらいやってみたんだけどほんと効率よくトレーニングできる。いつも公道で練習してたけど、日本特有の自動車が通ることしか考えられていないやたら細い道路とか、サイクリングロードを蛇行しながら走るおじいちゃんとか、急に車線変更するタクシーとか、狙ったかのように赤になる信号など、ストレスしかなかった。  その点zwiftは部室で練習できて、実走練みたいに練習場所に行く必要がない。しかもパワーという絶対的な指標があるからどれくらい追い込めているのかすぐわかる。感覚でやってると甘えが出てくるし、速度は環境で大きくかわるのであんまり参考にならない。ローラーで練習するので例えば「20分全力で漕ぐ」などの公道ではできない練習もできる。

 zwiftのいいところはトレーニングメニューがいっぱいあって、選べば自動でトレーニングを始めてくれるところ。自分でメニューを決めるのはめんどくさいし、「ちょっときつくしすぎたかも。1セット省略しよう」とか甘えることがない。指示通りに漕げばいいので、今まで測る機会のなかったFTPを計測できた。FTPの測り方を調べるのもめんどくさいし、計測前の5分全速力ってどんくらいだよ力尽きるわとかいう心配がない。zwift内のコースを好きに走れるモードもあるみたいだけどそれはやってないからわからん。

 ただパワーメーターがないと始められないのはやっぱりハードルが高いと思う。俺は部室にあったからよかったけど。これからはほとんどzwiftで練習することになりそう。マジで日本は自転車走りづらすぎるんだよ。  

GTX1050tiを買った

 PCを自作するとき保留しておいたグラボを買いました。予算的には1080まで買えたけど、どうせ使いこなせないのと、ロードバイクのホイールも欲しいので1050tiにした。玄人志向の。

 ちなみにやってるゲームはworld of tanks(wot)のみ。1050tiじゃちょっとスペックたりないかなって思ったけど全然そんなことない。HDのウルトラ設定で60fpsでる。まったく不満はない。グラフィックの設定で忘れないでほしいのが垂直同期を有効にすること。これをしないとテアリング(画面の上下で画面が断層みたいにずれること)が発生してめっちゃ目に付く。トリプルバッファは知らん。とりあえず有効にしとけ。

 今まで低設定でやってたしPS2レベルの画質(さすがに言いすぎかも)から卒業できたのはいいことなんだけど、なんか画質に満足しちゃったんだよなー。前ほどゲーム楽しめないっていうか。まぁここら辺は気分だしそのうち治るでしょ。

  あ、そうそう。グラボ買って取り付けるときやべえ!メモリと干渉するかもしれねえ!micro ATXにするんじゃなかったわクソが。とか思って結構慌てたけどなんかメモリとグラボは干渉しないようにできてるらしい。なので全然micro ATXでいいです。問題になるのはケースの大きさのみ。

 グラボ選びではクッソ時間かけて選んだわけだけど結局最初によさげだと思っていた1050tiに戻ってきてしまった。くそ時間かけて選んだ俺からのアドバイスとしては値段が下がってたらRX570も候補に入れとくといいとおもいます。俺は買おうとしたときに急に値段跳ね上がったので買わなかった。

 つーかお前TDP75Wってなんだよ...。せっかく550WGoldの電源買ってきたのに全然いみねぇじゃねえか。もう少し電気食えや。この点RX570は150Wなのでうれしい。

 まぁ唯一の不満点としては光らないこと。光らないとPCの中身が見えないだろぉ??

 せっかくグラボ買ったので3Dプログラミングでもやっていこうと思います。(やらない)