歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【Django】『現場で使える Django の教科書』を読んでいきます

PythonのWEBフレームワーク、Djangoのチュートリアルはひととおり通したものの、実際にプロダクトを作るには不安な状態で、これからどう学ぶべきか悩んでいました。

そんな中、『現場で使える Django の教科書』という本がなかなか良さそうだったのでこれを参考にしつつ勉強を進めていこうと思います。

現場で使える Django の教科書《基礎編》

現場で使える Django の教科書《基礎編》

Djangoが主張しているMTVってMVCとどう違うの?(実際にはViewの役割がTとVに分かれただけ)」とか「それぞれのモジュールでどういう処理を書いていけばいいの?」みたいなことがわかりやすく図解されているので、チュートリアルで学んだことの整理に役立ちそうです。

気になった方は、詳しい内容は著者のブログで!

akiyoko.hatenablog.jp

akiyoko.hatenablog.jp

とりあえずGAEでWEBアプリケーションを作って公開するところまでは趣味でもやりたいです。何を作ろうかな。

【NES】C言語でファミコンソフトをコンパイルして通す

ゲームボーイとりあえずキャラクターを動かす程度の実装はできるようになったのですが、ファミコンのほうが面白いんじゃないかと思って調べてみました。将来的には自作のファミコンプログラムでVJやるとかできたらかっこいいです。

こちらの記事によると、cc65というコンパイラ(?)を使えばC言語でソフトを作れるそうです。

blog.akiym.com

というわけで、↑の引用元であるこちらのサイトを参考にしつつ、とりあえずコンパイルを通してみます。

OSXへのコンパイラのインストールは brew install cc65 で済んでしまいました。

www34.atwiki.jp

#include <conio.h>


int main(void) {
    clrscr();
    cprintf("hello cc65");
    while(1);
    return 0;
}

Makefileはこんな風に記述しています。あまり記述方法わかっていない…。

main:
  cc65 -t nes main.c
  ca65 -t nes main.s
  ld65 -t nes main.o nes.lib atmos.lib -o main.nes

clean:
  rm main.o main.nes main.s

エミュレータで動かしてみます。

今回のプログラムです。

github.com

【Rust】簡単なcliを作る

少しずつRustの勉強も進めていきたいです。

以前数値計算のシミュレーションを実装しようとしていたのですが、ハミルトニアンの復習のほうが自分にとって難しくなって来てしまったので止まってしまっています。

そちらは今後気が向いたときに進めることにして、せっかくなので日常的に使えるものを作りたいと考え、GB USB SMART CARDにMacからゲームボーイソフトを書き込む際に利用するems-flasherを再現することを目標にしてみました。

github.com

というわけで「コマンドライン引数をパースする」「ファイルを読み込む」「USBの接続先に書き込む」という機能が必要そうです。

Rustのコマンドラインパーサーには clapというライブラリを使いました。

github.com

若干文字列周りで詰まりました。文字列は「サイズが固定されていない」というのはその通りで、ゲームボーイソフトのC言語プログラミングをしていた際は、「ユーザーからの文字列入力を行う必要がない」ので意図的に入門書も読み飛ばしていましたが、少しは気張らないといけませんね。

qiita.com

doc.rust-jp.rs

他にも画像処理のコードをRustで書くことにもチャレンジしたいのですが、opencvのインストールに手こずったのでこれまた後回しにしています。

【Django】GAEでとりあえずアプリケーションを立ち上げる その2

docs.djangoproject.com

私はpipenvを利用したいので、GAEのPython3.7のサンプルアプリケーションにある .gcloudignore を参考にしつつ、PipfilePipfile.lock などを追記します。

# This file specifies files that are *not* uploaded to Google Cloud Platform
# using gcloud. It follows the same syntax as .gitignore, with the addition of
# "#!include" directives (which insert the entries of the given .gitignore-style
# file at that point).
#
# For more information, run:
#   $ gcloud topic gcloudignore
#
.gcloudignore
# If you would like to upload your .git directory, .gitignore file or files
# from your .gitignore file, remove the corresponding line
# below:
.git
.gitignore
Pipfile
Pipfile.lock

# Python pycache:
__pycache__/

また、 mysite/settigs.py に ALLOWED_HOSTSを追記しました。今のところ公開するつもりの無いアプリケーションなので DEBUG=True などを指定して適当にやってしまっていますが、セキュリティ関連もちゃんと設定しなきゃいけないですね。

# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'qr1q-b3u&hogehoge'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

【Django】GAEでとりあえずアプリケーションを立ち上げる

久しぶりに会社でWEBアプリケーションを書くことになりそうです。レポーティング用アプリケーションで凝ったシステムは必要ない(はず)なので、分析担当のメンバーも理解しやすいPythonDjango)を選ぼうと思っています。

ひとまず、こちらのチュートリアルをやってみました。コードの内容は全く理解していないものの、GAEでとりあえずアプリケーションを立ち上げるところまで完了しました。

cloud.google.com

あとはDjango公式サイトを見つつシンプルなものを作るのと、JSのフレームワークの簡単なやつを試そうと思っています。

ちょっと意外だったのが、仮想環境としてpipenvを利用していたことで Pipfile is not supported と出てきたことです。Pipfileを無視してrequirements.txtを読んでほしいんですけどね…。

あと、これをGithubにpushしたところ、いくつかのセキュリティアラートが出ました。

f:id:takeshi0406:20190426200452p:plain

どうやらライブラリのバージョンが古いかなにかで脆弱性を自動で検知してくれたようです。便利ですねこれ。

f:id:takeshi0406:20190426200510p:plain

【メモ】Githubの草を剥がさずにリポジトリを移行(結合)した

Rustの練習用にいくつかリポジトリを作って書き捨てのプログラムを書いていたのですが、あまり「〇〇-test」とかリポジトリが乱立してるのは見栄えがいいものではありません。

というわけでこんなディレクトリ構成で一つのリポジトリで管理し、過去のリポジトリは削除してしまうことにしたのですが、最近「毎日とりあえずコード書いてGithubに草を生やす(コミット履歴を残す)」ことにハマっていて、普通にリポジトリを消してしまうとせっかく生やした草が剥げてしまいます。

$ tree
.
├── README.md
├── duplex-pendulum
│   ├── Cargo.lock
│   ├── Cargo.toml
│   └── src
│       └── main.rs
└── python-rust-linkage-test
    ├── Cargo.toml
    ├── main.py
    └── src
        └── lib.rs

4 directories, 7 files

こちらの記事を参考に、gitのUpstream機能でなんとかできました。まあ本質的じゃないのでこだわらなくてもいいですが一応…。

qiita.com

コミットログを見るとひどいので見ないでください。

github.com

【GB】複数スプライトのキャラクターを動かす

こちらの実装を元にしていますが、「複数スプライトを利用していること(それをなんちゃってオブジェクト指向で隠蔽していること)」「斜め移動に対応していること」が工夫した点です。

github.com

こんな感じのコードを実装しています。

const unsigned char sprite[] = {
    0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00,
    0x00, 0x1F, 0x00, 0x3F,
    0x00, 0x7F, 0x00, 0x77,
    0x08, 0x6B, 0x40, 0x77,
    0x80, 0xFF, 0x00, 0x7F,
    0x00, 0x3F, 0x00, 0x1F,
    0x10, 0x1F, 0x30, 0x30
};


typedef struct _Player {
    UBYTE i, x, y;
} Player;


void Player_init(Player* player, UBYTE i, UBYTE x, UBYTE y) {
    // copyのため?
    player->i = i * 1;
    player->x = x * 1;
    player->y = y * 1;
    SPRITES_8x16;
    set_sprite_data(player->i, 0, sprite);
    set_sprite_data(player->i + 2, 0, sprite);
    // スプライトを反転させる(キャラクターが左右対称のため)
    set_sprite_prop(player->i + 2, S_FLIPX);
    set_sprite_tile(player->i, 0);
    set_sprite_tile(player->i + 2, 0);
    move_sprite(player->i, player->x, player->y);
    // 横にずらして配置
    move_sprite(player->i + 2, player->x + 7, player->y);
    SHOW_SPRITES;
}

void Player_move(Player* player, UBYTE joystate) {
    if (!joystate) {
        return;
    }

    if (joystate & J_RIGHT) player->x++;
    else if (joystate & J_LEFT) player->x--;

    if (joystate & J_UP) player->y--;
    else if (joystate & J_DOWN) player->y++;

    move_sprite(player->i, player->x, player->y);
    move_sprite(player->i + 2, player->x + 7, player->y);
    delay(10);
}

こういう副作用多くて、なんとか隠蔽しなきゃいけないときオブジェクト指向的な発想って便利ですね。また、自分自身は組み込みプログラミングに慣れていないので joystate & J_DOWN みたいな「共通するビットが立っているとき実行する」ような発想のコードはちょっと新鮮でした。

kiito.hatenablog.com

また、割り込みでBGM出してみています。というか実はこちらが主目的です。

sakana38.hatenablog.com

こちらで実装中です。

github.com

組込み開発のための実践的プログラミング

組込み開発のための実践的プログラミング