30日でできるOS自作入門をやり終わった
感想
30日でできるOS自作入門をやり終わった。
自分で書いて、ふむふむっていいながら書き進んだ。
あとは細かいところとかを調べて実装したりしてみたいと思った。
ハードとソフトのインターフェースの部分の実装がすこしでもわかったのはよかった。
後半数日が駆け足になってしまったので、また読み直したい。
30日でできるOS自作入門は、NASMみたいなアセンブラでやってるんだけど、NASMでやったときのコマンドとかがどうなるのかが気になってる。
コード面ではアセンブラ(インテル記法)、C、gnu makeとかを掘り下げていけるといいかもしれない。
やっぱりGASで書きたいなと思っているので、またOSdevのところを見たいと思ってる。
あとlinuxカーネルのコードもみてみたい。
ブートストラップローダとかどう読み込んでいるのかとかを参考にしたい。そこはGRUBの範疇か。
linux用のノートパソコン欲しいなぁ。仮想上で動かすの気持ち悪いんですよね。かといってデュアルブートはなぁっていう感じで。
最初はos x上ですすめようかなと思ってたんだけど、マルチタスクの実装あたりでqemuがおかしくなったのでwindowsに移行させました。
os自作入門はwindowsでやるもんだったなw
あと、windowsでやるときはMakefileのコマンドをcmd.exe経由で実行しないといけないので注意した方がいい。
この手の低層のやつは動かないと致命的なものが多いけどすんなりいったのはかなり好感持てると思う。
あととってもわかりやすいし。この本のきついところは、コードの整理する部分だったかな。
まぁここらへんで。
追記
x86のセグメント管理がすごくわかりやすかった。x86もっと知りたいと思えた。
これが言いたかったのに書き忘れてた。
どんな人におすすめできるか
- 特にやることがないけどでかいプログラムを作ってみたい人
- 長期間かけてプログラミングしてみたい人
- 情報系の大学で授業でOSの概念だけやったひと
- 低層のプログラミングに興味がある人
django channelsで複数アプリのルーティング
django channelsのチュートリアルだと一つのアプリで複数アプリのルーティングが書いてなかったので。
from channels.auth import AuthMiddlewareStack from channels.routing import ProtocolTypeRouter, URLRouter import chat.routing import anime_log.routing from django.urls import path, include application = ProtocolTypeRouter({ 'websocket': AuthMiddlewareStack( URLRouter([ path('ws/chat/', URLRouter(chat.routing.urlpatterns)), path('ws/anime_log/', URLRouter(anime_log.routing.urlpatterns)), ]) ), })
pathでURLRouterをネストさせる。 includeだとURLRouterをネストしろって出るので。
EaseUS Todo BackupのOSクローン失敗事例
家のwindows機のssdを256から500に買えようと思ったんだけど普通に失敗した
OSの入ったドライブはGPTになってる。
新しいドライブをGPTでフォーマットして、システムクローンを行ってみた。
移し替えた後もOSは起動できた。今まで通りと思っていた。
chrome開いたらERR_CERT_AUTHORITY_INVALIDが出た。どのTLS/SSLが効いてる(https)サイトも観れなかった。googleすら。応急措置というかこれでいけるかなって思ってとりあえずほかのパソコンから有名どころの証明書をダウンロードしてUSBメモリ経由でインストールしていくつかのサイトは見れるようになった。
エラー表示が出た際のERR_CERT_AUTHORITY_INVALIDの文字列をクリックすると、証明書の中身を見ることができて、ISSUERってのが出るので、ISSUERの文字列+certificate downloadを検索すると大体の証明書はダウンロードできてインストールできる。ここらへんはセキュリティ的にシビアな部分なので自己責任で。
別の方法で試したのが、firefoxのインストール。別のパソコンからインストーラーを持ってきて試した。firefoxはシステムの証明書を使っていないっぽくて、どのサイトも閲覧できた。firefoxいいわね。
あらかた証明書をインストールしても、microsoft officeなんかの認証機能がまともに使えなくなっていたので、ここらへんでギブアップした。
あとあとeaseUSの情報探してたらGPTはアプリからやると失敗するらしいwwww 次はwinPEからやってみよう
年末年始は三ツ星カラーズとハイスコアガール読んでそれ以外は親戚のうちでも家でも本読んでプログラミングしてました。楽しかったです。冬休みカムバック。
golangで作るインタープリター読み終わった
golangで作るインタープリター読み終わりました!!!!!!!! 率直な感想はとても面白かったです。 あんまり言語処理系詳しくないんですけど、ソースコードがめちゃめちゃ綺麗でテスト駆動方針なので、非常に読みやすいです。
読む前に知っておいて良かったこと
golangの文法に慣れるのにあったほうがすぐ覚えられる
https://golang.org/doc/code.html
ここに載ってる。たまたま見たことあったけど知ってて良かった。
- コンパイラの大まかな処理
インタープリターまでなので、中間言語生成からの機械語の最適化とかまでは知らなくても問題なかった あくまでレキサーとかパーサーとか。本書にも軽く載ってる
上記のことはないならないで刺激的な情報が得られるんじゃないかな
学んだこと
今ぱっと思いついたものを書いて見た。多分他にもあるじゃないかな...あってほしいな...
所感
真面目に書いて 1 ヶ月くらいで読み終わった golangの構文すごい刺激的だった。type assertionは少し戸惑った。このインタープリターなら他の言語に移植するの難しくなさそうだなって思った。いわゆるコンパイラのフロントエンドと呼ばれる部分の実装だけど、あんまりでかいプログラムを書くことが少ないので、とてもいい経験になったと思う。 個人的にはやっぱり低層の技術が好きなので(だからwebアプリとかモバイルアプリが苦手)コンパイラもちゃんと勉強したいなと思っていて、ASTからの機械語生成の部分を1 から 作ってみたい。本書でも出てきたけど、ガベージコレクタはgolangに依存するので、ここも自分で作れないかなぁと少し思った。 golangは静的な言語でネイティブな機械語を出力できるわけだけど、osが作れないのはここら辺に理由があるのかなぁと考えたりした。
夢が広がる本だなぁ。
https://www.amazon.co.jp/dp/4873118220/ref=cm_sw_em_r_mt_dp_U_gyJlCb1HVVQM2
新年の抱負
あと数時間で2019年ですね
年末はすごい調子良かったんですよね
作ったり試したり学んだり
そんなわけで新年の抱負
- 努力
- 成果
- 他人のことを気にしない
を忘れずに過ごしたいですね 3 つ目は今まで自分が少し周りを気にしすぎていた点があったんだなぁと感じたためです
まだ明けてませんが、来年もよろしくお願いします
djangoの画像の複数アップロード
djangoの公式ドキュメントにシンプルな複数アップロードのサンプルが載ってなかったので、試してみたでござる
""" imagetest/models.py """ from django.db import models class SimplePhoto(models.Model): img = models.ImageField(upload_to='images/')
モデル
""" imagetest/views.py """ from django.shortcuts import render, redirect from .models import SimplePhoto from .forms import SimplePhotoForm, PhotosForm def index(req): images = SimplePhoto.objects.all() if req.method == 'POST': f = SimplePhotoForm(req.POST, req.FILES) if f.is_valid(): f.save() else: f = SimplePhotoForm() return render(req, 'imagetest/index.html', {'images': images, 'form': f}) def multiple(req): images = SimplePhoto.objects.all() if req.method == 'POST': form = PhotosForm(req.POST, req.FILES) if form.is_valid(): for ff in req.FILES.getlist('photos_field'): p = SimplePhoto(img=ff) p.save() else: form = PhotosForm() return render(req, 'imagetest/index.html', {'images': images, 'form': form})
一つのと複数アップロードのビュー
""" imagetest/urls.py """ from django.urls import path from .views import index, multiple urlpatterns = [ path('',index), path('multiple/',multiple), ]
urlの設定。ルートから伸ばしてるけど省略。
""" imagetest/forms.py """ from django import forms from .models import SimplePhoto class SimplePhotoForm(forms.ModelForm): class Meta: model = SimplePhoto fields = ['img',] class PhotosForm(forms.Form): photos_field = forms.ImageField( widget=forms.ClearableFileInput(attrs={'multiple': True}))
複数でもModelForm使えるかなと思ったけどダメだった。saveで拡張するらしい。
<html> <head> <title>ImageTest</title> </head> <body> {% for img in images %} <img src="{{ img.img.url }}" /> {% endfor %} <form method="POST" enctype="multipart/form-data"> {% csrf_token %} {{ form }} <input type="submit" value="送信"> </form> </body> </html>
単数の画像アップロードは公式ドキュメントそのまんまのやつ。 複数の場合はrequest.FILES.getlist['field_name']しないとだめ。formのcleaned_dataから引っ張り出してイテレーションすると引っ張り出してきたファイルはbytesでUploadedFileじゃないのでそのままモデルの渡して保存できない。 htmlのenctypeをmultipartにするのとstaticurlの設定を忘れないようにしないとな。
ちょうどMXでランサーが死んで麻婆神父が出てた
externとグローバル変数の疑問
前もって言っておくけど解答を示しているわけじゃないです。
C書いてて不思議に思ったので、字面に起こしておこうと思った。externとグローバル変数の使いかたに曖昧さがあると自分で感じた。感じたのは以下のようなコード。
/* test.h */ #ifndef _TEST_H_ #define _TEST_H_ #ifdef __cplusplus extern "C" { #endif #include <stdio.h> int g; void set(void); #ifdef __cplusplus } #endif #endif
#include "test.h" int extern_g; int main() { g = 0; extern_g = 100; printf("global variable g is %d\n", g); set(); printf("global variable g is %d\n", g); return 0; }
#include "test.h" extern int extern_g; void set() { g = 100; printf("extern variable extern_g is %d\n", extern_g); }
gccもエラーにならんしどうなんだろう
externって便利と言えば便利だけどなくても困らなくない?って思った。結局は、動けばいいっていう話だけど。
正しいヘッダファイルの書き方を学ばないとなって思った。