THUMBS SHIFT→

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

pythonでリストをn要素の配列に分割する

def divide_list(list_, n):
    """
    divide list into sub-list which have n elements.Reminder is appended to it.
    Args:
        list_ (list): list to divide
        n (int): number of elements which sublist has

    Returns:
        list: divided list.It's length is len(list_) // 30 + (1 or 0)

    Examples:
        >>> divide_list(list(range(11)), 3)
        [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10]]
    """
    divided_list = [list_[i:i + n] for i in range(0, len(list_), n)]
    return divided_list

tensorflowでGPUが使われているか確認する

tensorflow-gpuのインストールは

GPU support  |  TensorFlow

を参照してください。アメリカ語が読めない人は機械学習は無理です諦めてください。

で、正しく使われているか確認したい時は

>>> import tensorflow as tf
>>> tf.test.is_gpu_available()
True

で確認できる。

参考: https://www.tensorflow.org/api_docs/python/tf/test/is_gpu_available

検索すると

from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())

って方法が出てくるけど紹介したヤツのほうが簡単だと思う。

Matebook13でUbuntuとデュアルブートする。

最近Matebook 13を買ったのですが、速攻ubuntu入れたので備忘録として残しておきます。

そもそもデュアルブートじゃなきゃだめなのか?

windows機でubuntu使うとなると、WSLやVirtualBoxなどが候補に上がりますが、正直言ってストレスフルなのでおすすめしません。

LinuxとWindowsをデュアルブートするのは止めたほうが良い | SlackNote

という記事に書かれているように、デュアルブートにはそれなりのリスクがあります。しかし上で挙げた2つともつっかえる点が多く「スムーズに開発するためにubuntuを使いたいのに、そのubuntuが使いにくい」という本末転倒な事態になってしまいます。

WSLを使う場合はGUIアプリケーションの起動が手間ですし、ターミナルもデフォルトのままだとただのコマンドプロンプトなので、自分でカスタムするわけですが、これがまためんどくさい。僕はむずくて諦めました。 じゃあVirtualBoxは?となりますが、これはこれでキーボードのキャプチャ、解像度の調整、(これは想像ですが)Web開発しようとしたらポートの開放とかめんどいと思います。あとメモリをホストOSから分けてもらってるので動作がもっさり。

というわけで結局デュアルブートに落ち着きました。Ubuntu最高!winは雑魚!

デュアルブートのやり方

UbuntuとWindowsのDualboot環境を構築する | UnFlexFlex

基本的には上のサイトに全部書いてあるので、注意点だけ紹介。

0.Windowsのプロダクトキーを控えておく

万が一データが全部ふっとんだときに備えてプロダクトキーを控えます。

【Windows 10対応】インストール済みのWindows OSのプロダクトキーを調べる:Tech TIPS - @ITによると、

wmic path SoftwareLicensingService get OA3xOriginalProductKey で確認できます。

1.高速スタートアップを無効にする

ここは特になし。もしかしたらやらなくてもOKかもしれないが僕はやりました。

2.Windowsのドライブを縮小

ここも手順通り。僕はデスクトップ機が70GBくらい使ってるので80GBをubuntuに割り当てましたが、ほんとにwindows使わないので160GBくらい割り当てても良かったかもしれない・・・。ちなみにデスクトップでは個人でpythonの開発とかやってます。他の言語はやってないです。

参考までに、ドライブをいじる前のパーティションを載せときます。

f:id:arark:20190502224023j:plain
直撮りですまない...
下段のディスク1は下で作るUSBです。

3.Ubuntuをダウンロード

どうせ日本語入力するのでJapanese Remix落としましょう。

4.USBをFAT32形式でフォーマット

ここもそのまま

5.UNetbootinでUSBにLiveCDを書き込む

書き込み先を間違えないように。

6.Windowsを再起動してBIOSメニューに入る

MateBook13はF2でBIOSに入れます。ここでUSB以外をDisableにしてUSBから起動するようにしましょう。これは後で戻さなくても普通に動いてます。

7.OSのインストール

ここで注意なのですが、インストールしようとすると、ウィンドウの下が見切れてボタンが押せないのでインストール出来ません。これは解像度が高いからubuntuが自動で2倍に拡大してるためで、「設定>デバイス>ディスプレイ>サイズ調整>100%」を選択すれば普通に戻ります。その代わりめっちゃ文字が小さくなります。まぁ耐えられなければ好きな3:2の解像度を選んでください。

インストールは「それ以外」を選ぶのですが スワップ領域は作らなくていいらしいです。実際僕も作ってないですが2GB確保されてました。 参考:https://kledgeb.blogspot.com/2018/04/ubuntu-1804-bios-2-biospcubuntu-1804.html

後は手順通りのはず。インストールしたらフォルダ名を英語にするのを忘れずに。

Matebook 13を買った。

Matebook 13 を買いました。そもそもの発端は6年間使い続けたASUS x202eが電源入らず、充電もできなくなったことでした。まぁ買った後に電池パックを外してつけなおしてみたら普通に動いたんですが、どちらにしてもメモリ4GB&Ivyのcorei3じゃ動作遅すぎるので、x202eは弟のPC勉強機になりました。軽く使ってみた感想としては感動ですね。画面がきれい、電池が持つ(x202eは1.5hしか持たなかった)、キーが光る、音が良い、手触りが良い。などなど。まだ連休中で家でゴロゴロしてて、持ち出して触れてないから細かいレビューは後で上げます。多分。 ちなみに買って速攻ubuntu入れました。もうWindows触れない・・・。WindowsなしでハイスペノートPCあれば迷わず買ったんだけどなぁ。

django で自分で作ったファイルをダウンロードさせる

どういうときの話?

例えばユーザーの入力によって動的にファイルを作り、そのファイルをModelのデータベースに保存1させつつ、ユーザーにダウンロードさせたいとき

下準備

# @settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
MEDIA_URL = '/media/'

参考

設定 | Django documentation | Django

Djangoで、ファイルダウンロード | NARITO BLOG

スラッシュの過不足があったりするとエラーが出るので注意。

# @urls.py
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

これはユーザーだけじゃなくて、自分でアップロードする場合にも必要。これは開発時の設定なので注意

参考

静的ファイル (画像、JavaScript、CSS など) を管理する | Django documentation | Django

# @models.py
from django.db import models

class FileModel(models.Model):
    file = models.FileField(upload_to='files/')

足りない所は想像力で補ってください。

ファイルをModelに保存する

from django.core.files.base import ContentFile
from .models import FileModel

string = 'this is sample file content'
myfile = FileModel()
content = ContentFile(string)
myfile.file.save('file_name', content)

参考

モデルフィールドリファレンス | Django documentation | Django

こうするとDBに登録されるのでフィルターとかソートとかして取り出せる(はず)。

同名のファイル名で上書きすると、suffixが付いたファイルが新たに作成されて、そちらがDBの指すファイルの実体となる。もとのファイルが削除されるわけではない。

html側は、

<a href="{{ uploadfile.file.url }}" download="{{ uploadfile.file.name }}">{{ uploadfile }}</a>

のようにdwonload属性を使うのが手軽でいいと思う。

参考 

Djangoで、ファイルダウンロード | NARITO BLOG


  1. この言い方は正しくないが

migrate-exblog 2.0.0をリリースしました

github.com

知らない人向けに説明すると、これはエキサイトブログにははてなブログのようなエクスポート機能が無いので、スクレイプして他のブログに移行できる形式に変換するプログラムです。

今までの、単体テストも無くて、パラメータの設定の仕方も気持ち悪い仕様から大幅に変更しました。

今まで全部の投稿をとってくるのに、/m2005-01-01みたいな月ごとの投稿一覧ページを全部試してとってきてたんですけど、なんと/m1900-01-01/に全ての月ごとのアーカイブページのリストがあったんで、そこからとってくるようにしました。このおかけでだいぶ高速化できました。あ、ちなみに一回サーバーにリスエスト送ったら0.5秒休むようにしてます。

これで大体開発終了ですかね。まぁカード型のデザインとか、独特なスキン使ってるとエラー出るんですけど、正直使う人もいないしそこまでやってもなって感じです。

今後は勉強のためにdjangoでWebアプリ化でもしてみようかなと思います。

ほんとにこの開発を通じて良い経験になりました。使ってもらえるのが一番うれしいけどどうしたら有名になるんだろうか。宣伝?

pythonプロフェッショナルプログラミングを(大体)読んだ

読んだ。kindleで買ったら800円くらいポイントが付いてきたのでラッキー。

個人開発で限界を感じてる人におすすめ。

Pythonプロフェッショナルプログラミング 第3版

Pythonプロフェッショナルプログラミング 第3版

最近個人で開発しているが、pythonのパッケージ化とか、開発のお作法とか、テストの書き方とか、gitの使い方とか、なんにもわからなかったので買ったけどほんとに欲しいものが書いてあった。

前も調べたことが合ったんだけど、その時は旧版で、gitじゃなくてmercurialとかちょこちょこ微妙なトコが合ったが、改訂してからはgitになったのでとても使いやすくなった。

入門書みたいに、listのメソッドにはsortやappendなどがあって〜〜と全部書いている訳じゃないのが特に良かった。こういう機能があって、こういうように運用するといいですよ。詳しくはドキュメント見てくださいね。さっきの例えで言うとlist型があって、一気に値を保持できますよ。こういうときに使うと良くて、詳しいメソッドはドキュメントをみてね。みたいな。

こういう体裁を採ってるおかげで、実際に開発で使うときのノウハウが沢山載ってるのがとても良い。詳しいとこまで全部説明してたらいくら紙面があってもたりないしね。

一番重点的に読んだのはパッケージ化の所。ちょうどやりたかったしね。次点でテストかな。逆にチケット管理とか、チームで開発するときに重要になるようなところは流し読みしただけ。内容が濃いのでこの本を全部マスターすれば結構すごいプログラマになるんじゃないか?え?ならない?そう・・・

次はテストの実装とか、djangoを使ったwebアプリ化とかをやってみる。

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もめっちゃ好みだった、と思ってスタッフ調べてみたら音楽は鷺巣さんなのね。通りで聞いたことあるテイストだと思った。庵野はよシンエヴァ作れ。

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

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

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

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

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