以下に記事作成しました。
Windowsのメモ帳をつくってみる(2)
はじめに
本記事は、下記記事の続きです。 agepan.hatenablog.com
メニューバーの作成
GUIでテキストエディターを作成するにあたって、メニューバーは必要だなということで作成していきます。 今回は見た目のみで処理は別途考えることにします(Exit実行時プログラムを終了するようにだけしました)。
tk.Menu()によりメニューバーを定義します。
add_cascade()を使用して、メニューバーのデフォルトで表示されているメニューを記述します。 この時文字列はlabelを用いて指定します。
add_command()を使用して、cascade()で宣言した配下にさらに詳細メニューを作成することができます。 こちらも文字列は同様にlabelを用いて指定します。
command()を使用することで、add_command()をクリックした際の処理を指定することができます。
import tkinter as tk
import sys
class Textarea(tk.Frame):
def __init__(self, master=None):
# 親フレームの引継ぎ
tk.Frame.__init__(self, master)
# タイトル定義
master.title('test')
# Windowの大きさの定義
master.geometry('1280x720')
# Textareaの定義
self.text = tk.Text(master)
#scrollbar
self.scrollx = tk.Scrollbar(master, orient=tk.HORIZONTAL)
self.scrolly = tk.Scrollbar(master, orient=tk.VERTICAL)
self.scrollx.pack(side="bottom", fill="x")
self.scrolly.pack(side="right", fill="y")
# Textareaの表示
self.text.pack(fill="both", expand=True)
# scrollbarとTextareaの同期
self.text["yscrollcommand"] = self.scrolly.set
self.text["xscrollcommand"] = self.scrollx.set
self.text["wrap"] = "none"
# menubar
men = tk.Menu(master)
master.config(menu=men)
menu_file = tk.Menu(men,tearoff=0)
menu_edit = tk.Menu(men,tearoff=0)
menu_format = tk.Menu(men,tearoff=0)
menu_view = tk.Menu(men,tearoff=0)
menu_help = tk.Menu(men,tearoff=0)
men.add_cascade(label="file", menu=menu_file)
menu_file.add_command(label='New', under=0)
menu_file.add_command(label='Open...', under=0)
menu_file.add_command(label='Save', under=0)
menu_file.add_command(label='Save As...', under=0)
menu_file.add_separator()
menu_file.add_command(label='Page Setup...', under=0)
menu_file.add_command(label='Print...', under=0)
menu_file.add_separator()
menu_file.add_command(label='Exit', under=0, command=sys.exit)
men.add_cascade(label='Edit',menu=menu_edit)
men.add_cascade(label='Format',menu=menu_format)
men.add_cascade(label='View',menu=menu_view)
men.add_cascade(label='Help',menu=menu_help)
if __name__ == "__main__":
root = tk.Tk()
textarea = Textarea(root)
root.mainloop()
これを実行すると以下のようにメニューバーを表示することができます。

Tab文字をスペースに
ふと、タブを入力したら、タブ文字で入力されていて、個人的に嫌だったのでスペースでのタブに変更します。
タブ関数と、バインドのショートカットを作成します。 タブ関数では、スペースを4つ入力するように処理を記述します。
また、
実際に作成したコードが以下になります。
class Textarea(tk.Frame):
def tab(self, *args):
self.text.insert(tk.INSERT, ' ' * 4)
return 'break'
def bind_shortcuts(self, *args):
text = self.text
text.bind('<Tab>', self.tab)
これで無事タブを4スペースで入力されるのでうれしくなれました。
さいごに
今回は、ちょっとした実装のみを行いました。 次は、行番号の表示に挑戦してみたいと思います。
Windowsのメモ帳をつくってみる(1)
はじめに
PythonでのGUIアプリケーションの作成を行ってみたいと思い少しずつ学んでいこうと思う。 今回はTkinterを用いる。
フレーム表示
まずは、フレームを表示できないと何も始まらないので軽く調べて表示してみる。
import tkinter as tk
class Textarea(tk.Frame):
def __init__(self, master=None):
# 親フレームの引継ぎ
tk.Frame.__init__(self, master)
# タイトル定義
master.title('test')
# Windowの大きさの定義
master.geometry('1280x720')
if __name__ == "__main__":
root = tk.Tk()
textarea = Textarea(root)
root.mainloop()
表示してみると以下のようになる

テキストエリアの表示
今回の最終目標は、Windowsにデフォルトであるメモ帳を参考にしたテキストエディタを作成することにする そのため、まず確実に必要そうなテキストエリアの表示を行う。
tkinterでは、ウィジェットを定義するだけでは繁栄されないらしいので、 ウィジェットを定義した後に明示的に配置してあげる必要があるらしい。
self.textarea.pack()内で fill="both"を指定することで、表示ウィンドウ全体に表示でき、 expand=Trueにすることでウィンドウサイズ変更した際にテキストエリアも一緒にサイズ変更してくれるらしい。
import tkinter as tk
class Textarea(tk.Frame):
def __init__(self, master=None):
# 親フレームの引継ぎ
tk.Frame.__init__(self, master)
# タイトル定義
master.title('test')
# Windowの大きさの定義
master.geometry('1280x720')
# Textareaの定義
self.textarea = tk.Text(master)
# Textareaの表示
self.textarea.pack(fill="both", expand=True)
if __name__ == "__main__":
root = tk.Tk()
textarea = Textarea(root)
root.mainloop()
実行すると以下のようになる。

スライドバーの表示
このままでは使いにくそうなので、スライドバーを作りたいと思う。 スライドバーを設定する際にorientで配置の向きを調整することができる 水平(HORIZONTAL)、垂直(VERTICAL) これを用いてx軸y軸ともにスライドバーを配置した。
スライドバーを配置するだけだとスライドバーと何も同期していないので、ただの飾りとなってしまう。 そのため、作成したテキストエリアとの同期を行う必要がある。
テキストエリアのデフォルトは文字列の折り返しがオンとなっているらしいので、 x軸のスライドバーを実装したい場合には、テキストエリアでwrapをnoneに指定してあげる必要があるっぽい。
実際に実装したコードは以下のようになる。
import tkinter as tk
class Textarea(tk.Frame):
def __init__(self, master=None):
# 親フレームの引継ぎ
tk.Frame.__init__(self, master)
# タイトル定義
master.title('test')
# Windowの大きさの定義
master.geometry('1280x720')
# Textareaの定義
self.text = tk.Text(master)
#scrollbar
self.scrollx = tk.Scrollbar(master, orient=tk.HORIZONTAL)
self.scrolly = tk.Scrollbar(master, orient=tk.VERTICAL)
self.scrollx.pack(side="bottom", fill="x")
self.scrolly.pack(side="right", fill="y")
# Textareaの表示
self.text.pack(fill="both", expand=True)
# scrollbarとTextareaの同期
self.text["yscrollcommand"] = self.scrolly.set
self.text["xscrollcommand"] = self.scrollx.set
self.text["wrap"] = "none"
if __name__ == "__main__":
root = tk.Tk()
textarea = Textarea(root)
root.mainloop()
これを実行すると画像のようになる。

今回はこの辺にしておこうと思う。
カーネルについて学び始めた(4日目)
こんにちは、揚げパンです。
はじめに
カーネルについての勉強もなんとか三日坊主を逃れました。
これからも継続して続けていければなと思います。
第2部(2.1)
第2部ではプロセスについてです。
プロセスってなんぞや
カーネルの中の概念の1つで、実行中のプログラムを管理するのに用いられます。1つの実行プログラムに1つのプロセスが対応しています。
プロセスは一意のプロセスIDをもち、IDにより判別されるものであるので、同じプログラムを実行するプロセスがたくさん存在する場合には、カーネルはそれぞれ違うプロセスとして認識するらしいです。
プロセスの複数処理
UNIX V6では、複数のユーザーが同時にシステムを使用できるのである瞬間に複数のプロセスが存在することがありえます。
だけど、プログラムを実際に処理するのはCPUのため、すべてのプロセスが同時に処理されているわけではなく、1つずつしか処理できません。(処理されていないのは待機状態)
したっけどうやって複数のプロセスを処理してるの?
ではどのようにプロセスを複数同時どうやって処理してるのってなったと思います。
結論から言うと同時に処理をすることはできません。
しかし、カーネルは処理を行うプロセスを瞬時に切り替えることで見かけ上は複数のプログラムを並列処理しているようにできます。
そのようなことをTSS(タイムシェアリングシステム)というらしいです。
プロセスの実行状態
ここでは、プロセスの実行状態は大きく分けると大きく分けると実行できる状態のプロセスと他のプロセスの終了を待って処理を継続できない待機状態のプロセスにわけらるということが書いてありました。
ユーザーモードとカーネルモード
ここでは、ユーザーモードとカーネルモードとの間でモードを切り替えるとができて、それぞれのモードで仮想アドレスにマッピングされるメモリ領域が違うんだよってお話と、カーネルの機能を実装するにはシステムコールを発行しなくてはいけないよってことについて詳しく書いてありました。
詳しい内容を知りたい方は本をしっかり読んでみてください。
スワッピング
プロセス数が増えるとメモリ容量が足りなくなってくるので、休眠状態にあるプロセスや、重要性の低いプロセスをメモリからスワップ領域に避難して(スワップアウト)、スワップアウトされたプロセスが実行可能状態になったプロセスをメモリ領域に復帰する(スワップイン)が行われます。
この処理をまとめてスワッピングと言うらしいです。
最後に
プロセスについてを自分なりになかなか理解できたので良かったなと思います。
これからも継続してカーネルについての理解を深めていきたいと思います。
最近は、この本を完読した頃にはすごい人(なんかとても抽象的ですねw)になれてるかなと思うことでこの本のモチベーションとしています。
ではではこのへんで
カーネルについて学び始めた(3日目)
こんにちは、揚げパンです。
前回自身で購入したカーネルの本に理解が追いつかずに少し挫折してしまいました。そこで新たに初めてのOSコードリーディングという本を先輩からいただいたのでそちらを読み進めていきたいと思います。
第1部
こちらの本もソースコードの解説を主に行っているのですが、導入として、第1部ではUNIX V6についての説明がされています。
前半部分では、UNIX V6についての歴史やUNIX自体の歴史についての説明、カーネルの最低限の機能などの説明がされています。
後半部分では、UNIX V6を構成するハードウェアについての説明や、ソースコードの閲覧できるサイトなどの説明がありました。
終わりに
第1部を読んでカーネルについての基礎の基礎をわかりやすく説明してあり理解しやすいなという印象でした。
この本を完読し、コンピュータシステムの全体像を理解できたらなと思っています。
僕は少し飽き性なところがあるのでモチベーションが高い間にたくさん読み進めていきたいなと考えています。一冊目のように挫折しないように頑張って行きたいと思います。
カーネルについて学び始めた(2日目)
こんにちは、揚げパンです。
最近は寒くてなかなか布団から抜け出せません。
超例解Linuxカーネルプログラミング~最先端Linuxカーネルの修正コードから学ぶソフトウェア品質~
- 作者:平田 豊
- 出版社/メーカー: シーアンドアールケンキュウジョ
- 発売日: 2019/07/18
- メディア: 単行本(ソフトカバー)
僕が参考書を購入してから(2日目)
初日に張り切って2章まで読み進めたので、3章から読み進めました。
3章から6章まではバグを作りやすいポイントについて書かれています。
3章では普段通らないパスで作り込んでしまったバグが普段から動作しているわけではないのでバグを作り込んでしまっていたら気づきにくくそのまま残っている可能性が高いということについて述べられれいました。
普段通らないパスで作り込んでしまったバグの例を実際のLinuxカーネルでの修正例を用いて解説されています。3章ではその中でも特にデバイスドライバの取り外しの処理で実際にあったバグについて解説されています。
3章に入り、実際のLinuxカーネルであったバグについての解説となったのですがLinuxカーネルのコードを実際に読んで見てもなかなか理解が進まないと実感していました。
そこでこの本は少し自身でカーネルについて学習を進めてから行わないと深い理解ができないと思いもう少し基礎の部分から学ぼうと思いました。
するとたまたま先輩がカーネルについての基本的な本をくれるということで先にその本から読み進めて、またこの本に戻ってこようと思いました。
そこで先輩がくれた本がこちらです。
最後に
これからはこの先輩からもらった本を読み進めカーネルに対する基礎理解を深めていきたいなと考えています。
これ以上挫折しないように頑張りたいと思います。

