「30日でできる! OS自作入門」 開発環境構築 for mac
ふとしたことがきっかけでOSを勉強してみようと思った。
もう少しパソコンの内側を知りたい。
コードがコンパイルされてからの先をもう少し知りたい。
それならOSを作りながら学べば良いのではと思った次第である。
大学の講義でOSは学んだことはあるが、コードは一切出てこないし理論だけだったので面白くなかった。
だからコードを書きながらOSを学べる本が良かったので、この本を図書館で借りてきた。
- 作者: 川合秀実
- 出版社/メーカー: 毎日コミュニケーションズ
- 発売日: 2006/03/01
- メディア: 単行本
- 購入: 36人 クリック: 735回
- この商品を含むブログ (299件) を見る
さて勉強しようと思ったが、この本はwindows向け。最近、macを手に入れwindowsを手放した矢先のことであった。
しかし!なんと!macでも勉強できるようにしてくれている人がいた!
github.com
だが、ここに書いてあるようにやってもできなかったので少しメモ。
まずは、僕みたいに図書館で借りてきたのでCD-ROMがないという人!
30日でできる! OS自作入門
ここにあります。"HariboteOS.iso"ってやつです。
次に2.シェルスクリプト実行の項。
curl https://raw.github.com/sandai/30nichideosjisaku/master/bin/install.sh | sh
をターミナルで実行せよとあるが、これをやっても上手くいかない。
そこで、このページのgitリポジトリをダウンロードし、その中のbin/install/install.shを実行する。
そして、次のように表示されれば成功。
その後は3.確認の項にあるようにすれば同じように動くはず。
参考文献
OS自作入門 その5 - 勉強覚え書き
IBMメインフレーム・コンテスト2015
2015年12月10日をもって、メインフレーム・コンテスト2015が終了した。
www-06.ibm.com
10月に大学の後期が始まり、掲示板を確認しに行ったときに張り紙を見て知った。
それから申し込みをして、約2か月取り組んだ。
コンテスト通して思ったことをまとめようと思う。
メインフレーム?
「メインフレーム」。アーキテクチャ系の講義の「コンピュータの歴史」で聴いたことがあるような・・・。
張り紙を見た時に「プログラミングにチャレンジ!」と書いてあったから、参加してみただけで、正直メインフレームが何か良く分からなかった。
学生向けのコンテストであるが、現在の学生はコンピュータ=パソコン世代なので、知っている方が珍しいに違いない。そして、学生でそれを触ったことがある人なぞ、さぞいないだろう。
というわけで、このコンテストでは初めにメインフレームについてのpdfが配られる。
しかし、そこには少しの説明しかないし、コンテストを終えてみても少し分かったような・・・。
メインフレーム - Wikipedia
詳しくはwikipediaを見るのがいい。
ざっと述べると、企業や銀行などで使われるシステムを動かすための基盤のコンピュータ。高額でハイスペックなコンピュータ。
メインフレームコンテスト?
IBMが主催するメインフレーム・コンテストは世界中40ヵ国で開催されている。日本での開催は初めてとのこと。
そういうわけで、問題文が全て英語。これを知ったときは、ビビった。だって、「プログラミングにチャレンジ!」って日本語で書いてあったじゃん。
しかし、そこは仕方ないと割り切り問題を解くことにした。
このコンテストはPart1、Part2(17問)、Part3(16問)から成り立っている。Part1はコンテストの説明くらいで、問題を解くのはPart2から。
問題を解くといっても、このコンテストは一問一問解きながらメインフレームを理解しよう!というスタンスらしく、各問題には、メインフレームに使われている技術や歴史の説明と課題文があり、参加者は説明を基にしながら課題を解くといった具合だ。
Part2よりもPart3の方が難しいとあるが、難易度は変わらない。簡単なのもあれば、難しいのもある。
では実際にどんな問題がでるかというと、これが幅広い。C・C++・Java・Cobol・Assemblerなどの言語から、SQL・JSON・MongoDBなどのDBに関するものから、JCL・Linuxコマンド・Z/OSコマンドから、いろいろと出題される。
CobolやDBなんて、学生は使ったことない。ほとんどの技術が授業で少しやったことがある程度で、やんわりとしか分からない。
このような感じで正直なところ、「コンピュータスキル・コンテスト」という方が正しい気がする。
そして、最後にこれらの知識の集大成として、JavaとSQLを使ってプログラムを作成する。
感想
このコンテストは、よく分からない技術について英語の説明文を読んで、問題を解く。客観的に見てすごいと思うし、自分自身よくできたと思う。
大学3年の後期で何か成せねばなと考えていたときだったので、張り紙を見た時に、これで上位に入賞しようと思ったのがきっかけだった。
根気よく初めてみたものの、この問題を解いても意味があるのだろうか?コンテストで入賞して意味あるの?随時そんなことを考えていた。そして、Part2を解き終わってPart3に進むときやめようと思った。しかし、それから10日ほど経ってからPart3を解くことに決めた。中途半端にしたくないなという気持ちと純粋に問題を解くことが楽しかったから。それからは諦めることなく問題を解き進めた。
コンテストを終えて思う事は、良く頑張れたなということ。英語も得意な方ではないが、調べながらでも書いてあることが理解できたし、初めて知る技術についても、経験則を利用してすぐに身に付けることができた。そして、問題の大半がこれまで大学で勉強してきたことで、自分にも力が付いたのだなと実感することができた。これは尊い経験となった。
コンテストの解答には自信があるし、上位入賞は狙っている。アメリカにも行く気でいる。しかし、それ以上にコンテストで得られたものが大きかった。
自分も力が付いてきているし、社会で戦えることが分かった。自分は何者でもないし、力が欲しいと思って、大学で通っているわけだから、力が付いたことが分かったのはとても自信になる。大学からコンピュータについて学び始めたことは遅いことだと思っていた。しかし、それでもたくさん勉強したことで、コンテストでも戦えるくらいになれたし、やってきたことは間違いではなかったようだ。
IBMメインフレーム・コンテスト2015。参加して良かったと思う。
P.S.
このコンテストは普段は触れることがないような技術に触れることができる素晴らしい機会だと思う。社会の基盤となっているものこそ、学生が接する機会が少ない。だからIBMさんにはとても感謝している。これを機に、他のところでもこのようなコンテストや勉強会などを開催して、学生が経験できないような技術に触れることができる機会を設けていただきたい。
Rails ルーティング設定
Ruby on Railsのメモ。
Ruby on Railsを使うことになり、Rubyの勉強から始めた。そして、Rubyについて分かったきたので、下記のサイトでRailsの勉強を始めた。
一つ問題。コントローラとアクションの作成とルーティングの設定 - Ruby on Rails入門の「ルーティングの設定」でroutes.rbに
Books::Application.routes.draw do match 'hello' => 'booklist#hello' match 'bye' => 'booklist#bye' end
と記載するとあるが、この通りにすると、
と表示される。よく分からないが、"match"ではなくて"get"を使えとのこと。ということで変更する。
Books::Application.routes.draw do get 'hello' => 'booklist#hello' get 'bye' => 'booklist#bye' end
希望通りに表示された。
なんとか解決したが、routes.rbにおける、matchとgetの違いが分からない・・・。分かり次第、追加記載しようと思う。
Common LispでFizzBuzzを解いてみた
Ruby FizzBuzz最短コードメモ (51bytes) ネタバレ注意 - Qiitaを見て、Common Lispでは何byteで書けるかな?と思ったのでやってみた。
結論から言うと、あまり短いコードは書けなかった(技量的に)。しかしながら、面白いことを2つ発見したのでまとめておく。
負の剰余
Cで配列のインデックスを指定する場合や素数判定のプログラムを書くときに剰余演算子を用いたことはあった。そのときは正の剰余を想定して書いたので、負の剰余のことなぞ考えたこともなかった。しかし、上記の記事では負の剰余を用いており、ではCommon Lispではどうなるのかな?と思ったのでまとめてみた。処理系はCCL1.6。
n | (mod n 15) | (mod n -15) | (mod -n 15) | (mod -n -15) |
---|---|---|---|---|
1 | 1 | -14 | 14 | -1 |
2 | 2 | -13 | 13 | -2 |
3 | 3 | -12 | 12 | -3 |
4 | 4 | -11 | 11 | -4 |
5 | 5 | -10 | 10 | -5 |
rubyと同じようだ。他の言語では、どうなるだろう?
FizzBuzz問題を最短コードで書く場合"FizzBuzz"から、3の倍数なら"Fizz"を、5の倍数なら"Buzz"を, 15の倍数なら"FizzBuzz"を取り出すのが良いのではないかと考えた。そして、取り出すための関数として"subseq"を選んだ。すると以下のようになる。
(subseq "FizzBuzz" 0 4) => "Fizz" (subseq "FizzBuzz" 4 8) => "Buzz" (subseq "FizzBuzz" 0 8) => "FizzBuzz"
これを任意のnを与えてできないかと考えていたら、妙な数式が出来上がった。
(subseq "FizzBuzz" start end) start: (mod (mod (expt n 4) 15) 9) ; exp(n,4) % 15 % 9 end : (+ (mod (mod (expt n 4) 15) -5) 8) ; exp(n,4) % 15 % -5 + 8
これを使うと、以下の様になる。
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
start | 4 | 4 | 0 | 4 | 4 | 0 | 4 | 4 | 0 | 4 | 4 | 0 | 4 | 4 | 0 |
end | 4 | 4 | 4 | 4 | 8 | 4 | 4 | 4 | 4 | 8 | 4 | 4 | 4 | 4 | 8 |
sebseq | "" | "" | "Fizz" | "" | "Buzz" | "Fizz" | "" | "" | "Fizz" | "Buzz" | "" | "Fizz" | "" | "" | "FizzBuzz" |
ほぼ数字遊びのような感じだが、うまく動くので何らかの数学的要因があるかもしれない。
しかも、これが面白いのは、3でも5でも15の倍数でもない値のときは""となるところだ。
だが、これをいざコードにすると、計算式が長い。また、3でも5でも15の倍数でもない値のとき、その数を返すわけではないのではないので、その値を表示させるには、さらに一工夫必要で、結果としてコードが長くなる。残念。
当初の目的であった、Common Lispで最短でFizzBuzzを解くというのは達成できなかったが、なかなか面白い発見はできた。Common Lispで最短FizzBuzzはひとまず止めるが、Common Lispの技量が上がったらまた解いてみようかな。また、新しい言語の取得の一環として最短でFizzBuzzを解くというのは、良い訓練ではないかと思った。
Common Lispで初めて実装
夏休みに入ってからM.Hiroi's Home Page / xyzzy Lisp ProgrammingとPAIPでCommon Lispの勉強をしている。
基本的には例題のコードを写して、実際に動かすといった具合だ。
夏休みも終わるなーと思っていた先日、「もし大学4年間が24時間だったら、現在は何時何分だろうか」と思った。
プログラムを書こうと思ったときに頭に浮かぶものはC言語。C言語以外でプログラムについて考えたいと思って、Common Lispを始めたので、
「いかん、いかん、Common Lispで考えろ!」と自分に言い聞かせながら、一通り書いてみた。
(defconstant *hour* 24 "A day is 24 hours") (defconstant *minute* 60 "A hour is 60 minutes") (defconstant *second* 60 "A minute is 60 seconds") (defconstant *day* 365 "A year is 365 days") (defconstant *school-year* 4 "University is 4 years") (defvar *each-month-days* '(30 31 30 31 31 30 31 30 31 31 28 31) "Days of each months(April start)") (defun StudentDays (year date day) "Days of student life" (let ((days (* 365 (1- year))) (date2 (mod (+ date 8) 12))) (if (or (> day (elt *each-month-days* date2)) (< year 1) (> year 4)) (return-from StudentDays -1)) (dotimes (i date2 days) (setf days (+ days (elt *each-month-days* i)))) (setf days (+ days day)))) (defun PrintTime (second) "Print 'hour:minute:second'" (if (< second 0) (format nil "error") (progn (format nil "~s:~s:~,2F" (truncate (/ second 3600)) (truncate (mod (/ second 60) 60)) (float (mod second 60)))))) (defun StudenTtime (year data day) "Total seconds of student life" (let ((seconds (/ (* *hour* *minute* *second*) (* *day* *school-year*)))) (printtime (* seconds (studentdays year data day)))))
(StudentTime 3 10 3) "15:6:24.66" (StudentTime 3 3 3) "17:32:23.01" (StudentTime 5 10 3) "error" (StudentTime 5 10 32) "error"
しかし、初めて関数型言語で書いたので、関数型言語のスタイルが分からない。Common Lispも多くのコードに触れていないので、Common Lispのスタイルも分からない。そこで、今後のために現在の疑問を挙げようと思う。
・大域変数は"*変数名*"というスタイルであるが、定数の場合はどうなるのであろう?(今回はとりあえず、大域変数と同じスタイルにした。)
=>アスタリスクは付けないようだ。(2015/10/02)
スペシャル変数の名前は、最初と最後にアスタリスクを付けるのが慣習だが、定数の場合は通常この慣習に従わない。理由は、アスタリスクを付けると、「要注意!このレキシカルスコープの外側で何かによって変更されるかもしれない」と解釈されるからだ。もちろん、定数は変更されない。
Peter Norvig(2010) 「実用Common Lsip」翔泳社 149pp.
・計算結果を出力する際にPrintTimeで出力をしたが(1)、PrintTimeでは出力文字列を返すだけにして、呼び出し元(StudentTime)で表示するべきか(2)?
(1)
(defun foo () (hoge)) (defun hoge () (format nil "hoge"))
(2)
(defun foo () (format nil "~S" (hoge))) (defun hoge () 'print)
・Lispboxでは日本語が対応していないのでコメントも英語で書いてみたが、正しいか分からない。コメントの英語が正しいかチェツクする方法はあるのか?(とりあえずは英語のコメントにたくさん触れ、その中で身に付けていこうかな)
C言語取得の際は多くのコードに触れたことと例題のコードばかり写してないで、自分で一から創り上げたことが良かったと思うから、Common Lispでもそうしたい。また、人工知能にも興味があるから、その辺を絡めていけばよいのではないかと思っている。
ブログを始めるにあたって
プログラミングを始めて2年が経った。大学で情報系の学部に進学して授業で習い始めたのがきっかけだった。
それまで、全くプログラミングに触れたことはなかったし、周りにプログラミングをする人もいなく、C言語という言葉も大学に入ってから知ったくらいプログラミングはかけ離れた世界のものであった。
もちろん始めたころは苦労した。どうやって動いているかも謎だった。ようやく、半年過ぎたあたりから授業の問題が簡単に思えてきた。しかし、そのころはC言語で文字列処理や数値計算ばかりで自分が想像していたプログラミング(アプリとかweb系とか)とは違うものであり、授業でプログラミングを学んで何が創れるのだろう?と疑問に思った。
それから、授業以外でもプログラミングを勉強するようになり、いろいろ創ったり、プログラミングコンテストの問題を解いたりした。そこでたくさんのプログラムを書く中で、たくさんのエラー出し、たくさんのエラー内容を確認した。
エラー内容が分からずに検索したそんな時、行きつくのは、過去に同じエラーをだして、その解決法を載せているたくさんのブログだった。そこには有益なことが書いてあり、たくさんの知識をいただき大変お世話になった。
そのおかげで、始めたころからは想像もつかないくらいに上達した。
そして、2年が経過して思うことは、これまでに取得してきた知識を可視化したら、膨大な量になったであろうなってこと。また、自分がたくさんのブログにお世話になってきたように、自分のエラーが誰かの参考になれば嬉しいなってこと。
そこで、このブログを始めようと思った。
有益な情報を公開する
これまたよいことは、役に立つおもしろい情報を集めて選り分け、それをWebページにしたり、あるいは FAQ (Frequently Asked Questions lists)のような文書にすることです。そしてそれらを一般公開することです。
How To Become A Hacker: Japanese
果たして有益な情報であるか分からない(情報を集めて選び分けているわけではないので)が、一人の人間が時間をかけて悩んできたことがまとめられ、他人がそれを読んでより短い時間で解決できることは有益なことであると思う。