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()

表示してみると以下のようになる

f:id:agepan4869:20211113102836p:plain

テキストエリアの表示

今回の最終目標は、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()

実行すると以下のようになる。

f:id:agepan4869:20211113104943p:plain

スライドバーの表示

このままでは使いにくそうなので、スライドバーを作りたいと思う。 スライドバーを設定する際に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()

これを実行すると画像のようになる。 f:id:agepan4869:20211113110405p:plain

今回はこの辺にしておこうと思う。

次の記事 agepan.hatenablog.com

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()

これを実行すると以下のようにメニューバーを表示することができます。 f:id:agepan4869:20211114122907p:plain

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スペースで入力されるのでうれしくなれました。

さいごに

今回は、ちょっとした実装のみを行いました。 次は、行番号の表示に挑戦してみたいと思います。

カーネルについて学び始めた(4日目)

こんにちは、秀才ハッカーを目指している揚げパンです。

はじめに

カーネルについての勉強もなんとか三日坊主を逃れました。 

これからも継続して続けていければなと思います。

 

 第2部(2.1)

第2部ではプロセスについてです。

プロセスってなんぞや

カーネルの中の概念の1つで、実行中のプログラムを管理するのに用いられます。1つの実行プログラムに1つのプロセスが対応しています。

プロセスは一意のプロセスIDをもち、IDにより判別されるものであるので、同じプログラムを実行するプロセスがたくさん存在する場合には、カーネルはそれぞれ違うプロセスとして認識するらしいです。

プロセスの複数処理 

UNIX V6では、複数のユーザーが同時にシステムを使用できるのである瞬間に複数のプロセスが存在することがありえます。

だけど、プログラムを実際に処理するのはCPUのため、すべてのプロセスが同時に処理されているわけではなく、1つずつしか処理できません。(処理されていないのは待機状態)

したっけどうやって複数のプロセスを処理してるの?

ではどのようにプロセスを複数同時どうやって処理してるのってなったと思います。

結論から言うと同時に処理をすることはできません。

しかし、カーネル処理を行うプロセスを瞬時に切り替えることで見かけ上は複数のプログラムを並列処理しているようにできます。

そのようなことをTSS(タイムシェアリングシステム)というらしいです。

 

プロセスの実行状態

ここでは、プロセスの実行状態は大きく分けると大きく分けると実行できる状態のプロセスと他のプロセスの終了を待って処理を継続できない待機状態のプロセスにわけらるということが書いてありました。

ユーザーモードカーネルモード

ここでは、ユーザーモードカーネルモードとの間でモードを切り替えるとができて、それぞれのモードで仮想アドレスにマッピングされるメモリ領域が違うんだよってお話と、カーネルの機能を実装するにはシステムコールを発行しなくてはいけないよってことについて詳しく書いてありました。

詳しい内容を知りたい方は本をしっかり読んでみてください。

スワッピング

プロセス数が増えるとメモリ容量が足りなくなってくるので、休眠状態にあるプロセスや、重要性の低いプロセスをメモリからスワップ領域に避難して(スワップアウト)、スワップアウトされたプロセスが実行可能状態になったプロセスをメモリ領域に復帰する(スワップイン)が行われます。

この処理をまとめてスワッピングと言うらしいです。

 

最後に

プロセスについてを自分なりになかなか理解できたので良かったなと思います。

これからも継続してカーネルについての理解を深めていきたいと思います。

最近は、この本を完読した頃にはすごい人(なんかとても抽象的ですねw)になれてるかなと思うことでこの本のモチベーションとしています。

 

ではではこのへんで

カーネルについて学び始めた(3日目)

こんにちは秀才ハッカーを目指している揚げパンです。

前回自身で購入したカーネルの本に理解が追いつかずに少し挫折してしまいました。そこで新たに初めてのOSコードリーディングという本を先輩からいただいたのでそちらを読み進めていきたいと思います。

 

はじめてのOSコードリーディング ~UNIX V6で学ぶカーネルのしくみ (Software Design plus)

はじめてのOSコードリーディング ~UNIX V6で学ぶカーネルのしくみ (Software Design plus)

 

 第1部

こちらの本もソースコードの解説を主に行っているのですが、導入として、第1部ではUNIX V6についての説明がされています。

前半部分では、UNIX V6についての歴史やUNIX自体の歴史についての説明、カーネルの最低限の機能などの説明がされています。

後半部分では、UNIX V6を構成するハードウェアについての説明や、ソースコードの閲覧できるサイトなどの説明がありました。

 

終わりに

第1部を読んでカーネルについての基礎の基礎をわかりやすく説明してあり理解しやすいなという印象でした。

この本を完読し、コンピュータシステムの全体像を理解できたらなと思っています。

 

僕は少し飽き性なところがあるのでモチベーションが高い間にたくさん読み進めていきたいなと考えています。一冊目のように挫折しないように頑張って行きたいと思います。

 

 

カーネルについて学び始めた(2日目)

こんにちは、秀才ハッカーを目指している揚げパンです。

 最近は寒くてなかなか布団から抜け出せません。

 

超例解Linuxカーネルプログラミング~最先端Linuxカーネルの修正コードから学ぶソフトウェア品質~

超例解Linuxカーネルプログラミング~最先端Linuxカーネルの修正コードから学ぶソフトウェア品質~

  • 作者:平田 豊
  • 出版社/メーカー: シーアンドアールケンキュウジョ
  • 発売日: 2019/07/18
  • メディア: 単行本(ソフトカバー)
 

僕が参考書を購入してから(2日目)

初日に張り切って2章まで読み進めたので、3章から読み進めました。

3章から6章まではバグを作りやすいポイントについて書かれています。

3章では普段通らないパスで作り込んでしまったバグが普段から動作しているわけではないのでバグを作り込んでしまっていたら気づきにくくそのまま残っている可能性が高いということについて述べられれいました。

普段通らないパスで作り込んでしまったバグの例を実際のLinuxカーネルでの修正例を用いて解説されています。3章ではその中でも特にデバイスドライバの取り外しの処理で実際にあったバグについて解説されています。

 

3章に入り、実際のLinuxカーネルであったバグについての解説となったのですがLinuxカーネルのコードを実際に読んで見てもなかなか理解が進まないと実感していました。

そこでこの本は少し自身でカーネルについて学習を進めてから行わないと深い理解ができないと思いもう少し基礎の部分から学ぼうと思いました。

 

するとたまたま先輩がカーネルについての基本的な本をくれるということで先にその本から読み進めて、またこの本に戻ってこようと思いました。

 

そこで先輩がくれた本がこちらです。

 

はじめてのOSコードリーディング ~UNIX V6で学ぶカーネルのしくみ (Software Design plus)

はじめてのOSコードリーディング ~UNIX V6で学ぶカーネルのしくみ (Software Design plus)

 

 

最後に

 

これからはこの先輩からもらった本を読み進めカーネルに対する基礎理解を深めていきたいなと考えています。

 

これ以上挫折しないように頑張りたいと思います。

最近忙しかったため進捗がないお話

最近予定がびっしりだったため、なかなかLinuxカーネルについての勉強も、AtCoderの方も手がついていない日が数日続いてしまいました。

そのためブログに書く内容もないのですが、ブログを始めるときになるべく毎日投稿をしないと三日坊主のためすぐにやらなくなってしまうと思い、毎日投稿を目標としました。

 

最近、全然勉強に手がついていなかったので年末年始では体を休めながらも、AtCoderカーネルの勉強の両方を怠らないようにしていきたいです。

 

 

AtCoder始めました。

こんにちは、秀才ハッカーを目指している揚げパンです。

最近自分のプログラミングスキルを向上させたいなと思い友人に相談しました。

すると、競技プログラミング楽しいしプログラミングスキルもあがるよと言われたのをきっかけにAtCoderを始めてみました。

競技プログラミングとは...

僕も友人に競技プログラミング楽しいよと言われても何それ?とピンとこなかったので競技プログラミングについて少し調べてみました。

調べてみた結果、競技プログラミングとはプログラミングを使って問題を解くことでプログラミングの技術を競うコンテストの総称のことを指しているようです。

実際に過去問を解いてみた

実際にAtCoderAtCoder Beginner Contestの問題を何問か解いてみました。

A問題やB問題は割とすぐに解けたのですが、C問題やD問題あたりから全く手が動かなくなってしまいました。

僕は大学に入学してからプログラミングの勉強を始めたのですが、インプットの作業を行うばかりで実際にコーディングを行うことがなかったためか、自分のアルゴリズム力とプログラムの実装力が全然ないことに気づきました。

これから

アルゴリズム力と実装力が今後、僕の課題であることがはっきりと知ることができたので、今後徐々にAtCoder Beginner ContestのC問題やD問題から徐々に過去問に取り組んでいきたいと思います。

なかなか予定が合わなく実際にコンテストに参加する機会がないのでまだレートがないのですが、コンテストに参加する機会ができたときに良い結果を残せるように日々頑張りたいと思います。