OS X で30日でできるOS自作入門(2)

4日目になって露見したエラー

qemu-system-i386 -drive file=haribote.img,format=raw

これだとフロッピーが読み込めないのでifをつける

qemu-system-i386 -drive file=haribote.img,format=raw,if=floppy

makeの

copy file1+file2 file3

ここは3日目のやつだけど

cat file1 file2 > file3

にすればいい

あと

copy \B file1 file2

cpで置き換え

OS X で30日でできるOS自作入門(1)

OS入門はじめました

かの有名な30日でできるOS自作入門はじめました。 前から持ってたんですけど、読むだけ放置してた本。 実機テストは今のところしない方針です。qemuで動かしたいと思ってます。

OS X でやっていきたいと思ってます。

新しい情報は残しておくに越したことはないので、検索しただれかのためになったらいいなと思って、残しておきます。

エディタはなんでもいいと思います。 肝心のtolsetは、公式サイトの os x リンクからダウンロードしてください。少なくともosaskは動きました(2018/12/16)

問題はqemuですね。brew install qemuで一式入れます。 入ったqemu-system-i386を実行します。

% qemu-system-i386 helloos.img

こんな感じで。 あんまり調べてないので、他のいい方法あったら、コメ投げてください。オネシャス

余談

qemuの他のコマンド観てたら、xtensaあったんですよね。 xtensaはespの中のプロセッサなんですよね。エモい👆👆👆👆👆👆👆👆👆👆👆👆 ついでに、golangで作るインタープリターもやってます。結構いい感じですよ。golangやろうとしてる方、ちょっとオヌヌメします。

ncursesのバージョンが見たい

os x を使っているんですけど、ncursesはbrewでインストールできるんですよね。

だけどほんとにそのバージョンのを使ってるのかわからないときとかバージョンが知りたくなる。なので、直感的に信じてやって見たらバージョン出力ができたという感じです。ソースコードのどこに書いてあるんだろうね。以下、コード

#include <ncurses.h>
#include <stdio.h>

int main(){
    printf("%s\n", NCURSES_VERSION);
}

バージョン出力だけなので、色々入れてないけど。一応これで出た。ncursesの6.1を入れたはずなんだけど実際には5.7のデフォルトのっぽかったんだよね... どうやったら使えるようになるのかは調査中です。 5.7だと、SIGWINCHのシグナルハンドラーを設定してリサイズしようとするとどうしてもおかしくなるんだよね... どうしようかなぁ

ROMっぽいもの

前回の記事から22日ほど経ってしまっているんですよね。 最近は勉強する習慣をつけてます。 django、vue、golang、cpu製作、web製作などなど 競プロなんかもちょっとずつやってます、はい。 目的は勉強なんですけど、最近ブログ更新してないなぁとか思っちゃったりしてるので、書きたいと思います!!

ROM書いてみた

言わずもがなROMです。定数か変数か変えれば、RAMになると思ってます。numeric_stdを使っているので、そのままFPGAっていうわけにはいかないかも(実験してない)だけど、シミュレーションでは良さげだったので。

ソースコード

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;


entity ROM is
    -- change length of std_logic_vector
    port(address: in std_logic_vector(9 downto 0);
    output: out std_logic_vector(7 downto 0));
end entity;


architecture RTL of ROM is
    -- change size of array to match address
    type Memory1KB is array(0 to 1023) of std_logic_vector(7 downto 0);
    constant data: Memory1KB := (
"00000000",
"00000001",
"00000010",
"00000011",
...
"00000000",
"00000000",
"00000000",
"00000000",
"00000000",
"00000000",
"00000000");
begin
    output <= data(to_integer(unsigned(address)));
end architecture;

typeでaliasを付けつつ、ROMのサイズを指定(210 B = 1 KB)。 address幅もそれに合わせて 10 bit になってる。実際のデータは 0 番地には 0 を 1 番地には 1 を 2 番地には 2 を入れてある。 ROMのは210バイトだけど、1 バイトは1 ^ 8 -1 までしか表せないので、足りないところは 0 埋めでテストした。

f:id:b1u3:20181130005053p:plain
ROMのシミュレーション

シミュレーションでは、addressに 0 から順番にアドレスを入れていった。 FPGAとかに載せる時は、ベンダーが提供してるものを使うか、下から自作するのか、それともこのままいけるのかまだわかんないです。

djangoのcontenttypes

contenttypesはdjangoでいうアプリの様なもので、modelsとかfieldsとかがある。そのうちのmodelsの中にContentTypeというモデルがある。これがメイン。

ContentTypeとは

簡単に言えば、プロジェクトにインストールされたモデルを管理するモデル インストールされたオブジェクトは自動で生成される。

プロパティ

  • app_label これは、モデルがどのアプリケーションに含まれているかを示す。例えば、プロジェクトmysite内のpollアプリだったらpollになる。ついでに、常にこれはpythonのimport文のドットで区切った最後の単語になる。

  • model これは、モデルの名前。models.Modelを継承したクラスの名前。

  • name barbose nameだと思われる。

メソッド

  • ContentType.get_object_for_this_type(**kwargs) モデルのオブジェクトを持ってくる

  • ContentType.model_class() モデルクラスを持ってくる

contenttypesはアプリケーションなので、同じ様にモデルとかも扱うことができる。 objectsでマネージャーを取って来たりすることができる。

Generic relations

オブジェクトとモデルクラスを結びつける機能。ForeignKeyの強化版。

例えば、ForeignKeyを使うとき、AからBに関係を張りたいとき、AとBっていう名前が必要になる。だけど、ContentTypeを挟んでおくと、これは動的に変えられる様になる。

Reverse Generic Relations

GenericForeignKeyを設定しておくと逆参照ができる。MenyToMenyのGeneric版。 GenericFordignKeyをもつモデルに対して、GenericRelationを張ると参照できる様になる。

djangoのi18nやってみた

色々djangoi18nチュートリアル見たけど何が必要なのか一貫してなかったからやってみた。

環境

設定とか

l10ni18n
├── l10ni18n
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
└── testapp
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations
    │   ├── __init__.py
    ├── models.py
    ├── templates
    │   └── testapp
    │       └── base.html
    ├── tests.py
    ├── urls.py
    └── views.py

こんな感じのディレクトリ構成になっている。manage.pyがあることからl10ni18nがプロジェクトディレクトリであることがわかる。

base.htmlとviews.py

<html>
        <head>
                <title>I10N I18N</title>
        </head>
        <body>
                {% get_current_language as lang %}
                <p>{{ lang }}</p>
                <p>{% trans msg %}</p>
        </body>
</html>
from django.shortcuts import render
from django.utils.translation import gettext as _


def my_view(req):
    msg = _('Test')
    return render(req, 'testapp/base.html',{'msg':msg})

views.pyではgettextで翻訳文字をマークしてる。

で、このあと、testapp内に空のディレクトリを作る。

% mkdir testapp/locale
% ./manage.py makemessages -l en
% ./manage.py makemessages -l ja

これで、.poがlocaleフォルダ内にできる。 .poファイルを編集して、翻訳後の文字を設定する。 その後、コンパイルする

% ./manage.py compilemessages 

すると.moが.poと同じディレクトリ内にできる。

settings.pyには、LocaleMiddlewareを追加。

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
...
from django.utils.translation import gettext_lazy as _

LANGUAGES = (
        ('en', _('English')),
        ('ja', _('Japanese')),
        )

それとLANGUAGESも追加する。これ以外だったら、LANGUAGE_CODEのものが返されるらしい。これで試して見た。 まず、i18nが効いてないとき、

f:id:b1u3:20181103200132p:plain

f:id:b1u3:20181103200358p:plain

翻訳前の文字列がそのまま出る。 効いてる時、

f:id:b1u3:20181103200448p:plain

f:id:b1u3:20181103200543p:plain

こんな感じになる

vueの最初の方をやった

vueの最初の数ページを読んだ後に、小さいシングルページアプリケーションを書いてみた。ミラクルキラッツなので。

f:id:b1u3:20181028165459p:plain

f:id:b1u3:20181028165515p:plain

なるほど〜って言いながら、書いてた。appにだけコンポーネントを追加しようと思ってたんだけど、それは無理だった。残念。 JSの辞書のキーが文字列限定なのがpythonと違って気をつけなきゃいけない点かなぁと。

フロントはまだまだ覚えることが多くて大変だなぁと思った。

やる気はまだまだあるからできるところまでやろう!!!と思っている。

昨日と違った自分に。1 歩ずつでも前に進もう。

<html>
        <head>
               <meta charset="UTF-8">
               <title>todo</title>
               <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
       </head>
        <body>
                <div id="app">
                        <h1>{{ title }}</h1>
                        <ol>
                                <todo-item v-for="item in todoList" v-bind:todo="item"></todo-item>
                        </ol>
                        <input v-model="newTodo">
                        <button v-on:click="addNewTodo">Add</button>
                </div>
        <script>
               Vue.component('todo-item',{
                       props:['todo'],
                       template:'<li>{{ todo.text }}</li>'
               })
               var app = new Vue({
                       el:"#app",
                       data:{
                               newTodo:'',
                               title:'Todo App',
                               todoList:[
                                       {'text':"todo1"},
                                       {'text':"todo2"},
                                       {'text':"todo3"},
                                       ]
                       },
                       methods:{
                               'addNewTodo':function(){
                                       this.todoList.push({text:this.newTodo})
                                       this.newTodo = ''
                               }
                       }
               })
       </script>
        </body>
</html>