matobaの備忘録

育児しながら働くあるエンジニアの記録

djangoは管理コマンドを追加できるという話

今の会社で働き始める前、djangoで管理コマンドを作れることをぼくは知らなかった。

今は、普通にdjangoで作られたアプリケーションを触るし、普通に管理コマンドが作れることは知ってるし、普通に作る。

だけど、入社する前にdjangoチュートリアルをやってただけだと、全然知らなかった。

多分、ぼくと同じような人は、結構世の中にいるような気がするので、簡単に紹介しよう。

ドキュメントは、ここをみると良いと思う。

カスタム django-admin コマンドの実装 | Django documentation | Django

ドキュメントを読んだた書いてあるけど、

myproject/myapp/management/commands/my_custom_command.py

みたいな場所に作る。なぜ、こんなに階層が深いのかなぞだと思ってる。

こんなファイルが、 my_custom_command.py だとする。

from django.core.management.base import BaseCommand

class Command(BaseCommand):
    def handle(self, *args, **options):
          print('hello command')

これで、myappがINSTALLED_APPに入っていたら、my_custom_commndが使えるようになる。

$ python manage.py my_custom_commnd
hello command

パラメータとかも渡せる。詳しくはドキュメントを読むと良さそう。

django adminの一覧でカラムを増やしたい

django adminの一覧でカラムを増やしたい、と思う時はよくある

なんか、毎回同じようなことを検索して、djangoのドキュメントを探して自分で実行して確かめてる。というわけで、メモする。

例えば、こういうモデルがある。

class MyModel(models.Model):
    title = models.CharField(max_length=10)
    text = models.CharField(max_length=10)
    rank = models.IntegerField()

    def __str__(self):
        return self.title

そこに、以下のようなadmin定義をする。

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    fields = ('title', 'text', 'rank')

するとMyModelの一覧は、titleがずらっと並ぶ。rankも見たいよね。という時はある。 そういう時は、list_desplayを定義する。

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    fields = ('title', 'text', 'rank')
    list_display = ('title', 'rank')

それだけ。

詳しくはドキュメントを。

The Django admin site | Django documentation | Django

djangoでadmin画面を触ってる時に出る `Unknown field(s) ...`のエラー

djangoを触っていて、エラーが出た。

Djangoのバージョンは、1.11 以下が、エラーメッセージ。

Unknown field(s) (myfiled) specified for MyModel. Check fields/fieldsets/exclude attributes of class MyModelAdmin.

myfiledとかMyModelAdminとかは、良い感じに目で置換してもらいたい。

admin画面に登録した後に、django adminで詳細ページを開こうとした時に出るエラー。

原因は、filedsのタイポだった。

例えば、django adminに登録する時、以下のようなコードがある。

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    fields = ('title', 'text')

それを、例えば、以下のように書いていて、

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    fields = ('myfiled', 'text')

myfiledなんてフィールドがmodelに定義されてなかったら、先頭のエラーが出る。

「それがぼくには楽しかったから」を読み終わったので感想を書く

「それがぼくには楽しかったから」を読み終わった。

思ったことや感想を簡単に書く。

それがぼくには楽しかったから 全世界を巻き込んだリナックス革命の真実 (小プロ・ブックス)

それがぼくには楽しかったから 全世界を巻き込んだリナックス革命の真実 (小プロ・ブックス)

どんな本?

Linuxカーネルを作った、リーナスの話。

リーナスが考えている人生の意味とか、Linuxを作ったとき何を考えていたかとか、Linuxがどうやって広がったのか、今どう思っているか、みたいな話が書いてあった。 とはいえ10年以上前の本だけど。

誰が読むべき?

この本は、読むべきとか読まないべきとか、そう言う話じゃなくて、興味あれば読んで見たら?って感じ。

個人的には、10年前の古き良きインターネットの時代の話をとりあえず知りたい、みたいなのがあるから、読んだし、リーナスがLinuxについてどう言う話をしているのかも知りたかったから読んだ。

読んで嬉しいことは?

んー、何だろう。

Unixは、小さい部品がたくさんあると言う設計哲学だけど、Linuxカーネルコンポーネントを分けずに一つに集約しているのが印象的だった。

分けるのが良いとか集約するのが良いとか、そう言う話じゃなくて、何のために分けるのか、何のために集約するのか、と言うのが重要なのかなあ、と思ったりした。

読んでよかった?

よかったかな。個人的に気になったことは知ることができたから。

疑問に思ったことはあった?

途中、カーネルの話になったけど、わからないことが多々あった。 システムコールを実際に、意識して読んだことがないから話についていけない部分はあった。

システムコールってどんな風に使うのかなー、とか、OSのプログラムを見て見たいなあ、とか思ったりした。

印象に残ったことは?

いくつか印象に残ったことがある。

一つ目は、リーナスの人柄。リーナスは、思想が強いタイプの人というより、コンピュータやソフトウェア開発を楽しんでいるタイプの人だと思った。

あと、リーナスは、大学卒業後に、クローズドなハードウェア系の企業に就職したという話もあって、それも印象的だった。

それから、リーナスは、GNUのリチャードストールマンの思想に賛成してるというんじゃないのも印象的だった。オープンorクローズではなくて、ある時はオープン、ある時はクローズ、みたいなスタンスなのが印象的だった。

次はどう言う本を読みたい?

次は、伽藍とバザールって本を読みたいなと思ってる。手元に、もう買ってある。

伽藍とバザール

伽藍とバザール

まあ、あとは、もっと技術書かな。技術書は、ブログに書かなくても読んでるんだけど。

テキストファイルとPythonで音楽制作がしたい

テキストファイルとPythonで音楽制作ができないかなあ、と思った。

というわけで、色々ツールを作ってる。 今回は、テキストファイルをmidiに変換するやつ作った。

この中にある。

github.com

用意するテキストファイルは、こんな感じ。csv形式。

NoteName,Velocity,Start,End
G5,100,     0,  1
E5,100,     1,  1.5
E5,100,   1.5,  2
F5,100,     2,  2.5
E5,100,   2.5,  3
D5,100,     3,  3.5
C5,100,   3.5,  4
G5,100,     4,  5
E5,100,     5,  5.5
E5,100,   5.5,  6
D5,100,     6,  7

これは、どんぐりころころの冒頭の譜面を書き起こしてる。ちなみに、どんぐりころころはパブリックドメインなので選んだ。

1行目は、G5という音を100のベロシティ(音の強さ)で、0拍目から1拍目まで鳴らす。という意味。

こんな感じでmidiファイルに変換できる。

python -m compose.midi.text_to_mid ./sample/donguri.txt ./sample/donguri.midi

それをDAWに取り込んで、鳴らすとこんな感じになる。

soundcloud.com

使ってみた感想。

  • 音符をテキストで管理できるのはいいなと思う。
    • diffが取れるし、再利用性が高い。
    • メタデータを作ってプリコンパイルするような感じで生成したい
    • なお、MusicMacroLanguage(MML)というのもあるけど、パッと見でしっくりこなかったのと、自分で拡張するのがめんどくさそうなので使ってない。
  • テキストデータのStartとEndを打つのがめんどくさい
    • 今の所、絶対時間になっているので、かなりめんどい。
    • 今、譜面でいうとどこをどういう風に表してるのかがわからん。(何小節目とか)だからタイプミスがぱっと見わからない。
    • 今の所、StartとEndを入力する形式にしてるけど、どちらかというと発音開始位置と音符の長さが重要な気がしてる。
  • DAWに貼り付けないと音を聞けないのは辛い
    • 間違ってるかどうかのプレビューがコマンドラインからサクッとやりたい。
    • コマンド一発で、簡単にプレビューしたい。
    • DAWに貼り付けるのは、ある程度、音符レベルの作編曲が定まってきて、音の質感とかを考えるときにやりたい。

気が向いたときに、作っていこうと思ってる。

vimのfiletypeの設定

vimの設定を調べてた。filetypeって設定は何だろうと思ったので、調べつつ、理解を書いていきます。

filetypeの設定って?

vimで編集しているファイルの形式を検出する機能を使うかどうか。がfiletypeの設定。

filetype - Vim日本語ドキュメント

.vimrc

filetype on
filetype off

検出する不形式

検出できるファイルのタイプは、ここに書いてある。

自分で独自のファイル不タイプを追加することもできる様子。(やったことはない)

インデントとプラグイン

インデントファイルだけ、検出する。プラグインだけ検出する。というのができるようす。

.vimrc

filetype plugin on
filetype plugin off
filetype indent on
filetype indent off 

filetype - Vim日本語ドキュメント