【Python】JSONの扱い方

Pythonでは、JSONJavaScript Object Notation)データを扱うために組み込みのjsonモジュールが用意されている。

JSONの読み込み

JSONデータをPythonオブジェクトに変換するには、json.load()またはjson.loads()メソッドを利用する。

import json

# JSONファイルの読み込み
with open('data.json', 'r') as file:
    data = json.load(file)

# JSON文字列の読み込み
json_string = '{"name": "Takahashi", "age": 24}'
data = json.loads(json_string)

PythonオブジェクトからJSONへの変換

PythonオブジェクトをJSON形式の文字列に変換するには、json.dumps()またはjson.dump()メソッドを使用する。

import json

data = {'name': 'Takahashi', 'age': 24}
# PythonオブジェクトをJSONファイルに書き込む
with open('data.json', 'w') as file:
    json.dump(data, file)

# PythonオブジェクトをJSON文字列に変換
json_string = json.dumps(data)

JSONデータの操作

import json

# JSONデータの読み込み
with open('data.json', 'r') as file:
    data = json.load(file)

# JSONデータの操作
data['name'] = 'Tanaka'
data['age'] = 30

with open('data.json', 'w') as file:
    json.dump(data, file)

【Ruby】メソッドの可視性(public、protected、private)

Ruby】メソッドの可視性(public、protected、private)

Rubyのメソッドには、public protected privateの3種類の可視性があります。

可視性の特徴

  • public:すべてのインスタンスから実行できる(デフォルト)。
  • protected:クラスの外からは呼び出せない。自分自身、またはサブクラスのインスタンスから実行できる。
  • private:クラスの外からは呼び出せない。自分自身のインスタンスから実行できる。

可視性の変更

以下のようにしてメソッドに可視性を変更できる。

可視性の変更方法1

クラス内で可視性(public、protected、private)を書くと、以降のメソッドが指定した可視性に変更される。

class Baz
    # デフォルトはpublic
    def default_method
        "デフォルトのメソッド"
    end

    public
    def public_method
        "publicのメソッド"
    end

    protected
    def protected_method
        "protectedのメソッド"
    end

    private
    def private_method1
        "privateのメソッド1"
    end
    # 可視性は直前のメソッドではなく、以降のメソッドに対して適用されるため、private_method2もprivateになる。
    def private_method2
        "privateのメソッド2"
    end
end

可視性の変更方法2

変更したい可視性 :メソッド名という記述でも、可視性を変更することができる。

class Baz
    def default_method
        "デフォルトのメソッド"
    end

    def public_method
        "publicのメソッド"
    end

    def protected_method
        "protectedのメソッド"
    end

    def private_method1
        "privateのメソッド1"
    end
    def private_method2
        "privateのメソッド2"
    end

    public :public_method
    protected :protected_method
    private :private_method1, :private_method2
end

public

publicが設定されたメソッドは、すべてのインスタンスから実行することができる。メソッドにはデフォルトでpublicが設定されている。

class Baz
    def default_method
        "デフォルトのメソッド"
    end
    
    public
    def public_method
        "publicのメソッド"
    end
end

Baz.new.default_method  #=> "デフォルトのメソッド"
Baz.new.public_method   #=> "publicのメソッド"

protected

protectedが設定されたメソッドは、クラスの外からは呼び出すことができない。自分自身、またはサブクラスのインスタンスから実行できる。

class Baz
    protected
    def protected_method
        "protectedのメソッド"
    end
end

Baz.new.protected_method    #=> NoMethodError
class Baz
    def initialize(a)
        @a = a
    end
    def default_method(a)
        "#{protected_method}, #{a.protected_method}"
    end
    protected
    def protected_method
        @a
    end
end

baz1 = Baz.new("baz1")
baz2 = Baz.new("baz2")
baz1.default_method(baz2)   #=> "baz1, baz2"

private

privateが設定されたメソッドは、クラスの外からは呼び出すことができない。

class Baz
    private
    def private_method
        "privateのメソッド"
    end
end

Baz.new.private_method    #=> NoMethodError
class Baz
    def initialize(a)
        @a = a
    end
    def default_method(a)
        "#{private_method}, #{a.private_method}"
    end
    private
    def private_method
        @a
    end
end

baz1 = Baz.new("baz1")
baz2 = Baz.new("baz2")
baz1.default_method(baz2)   #=> NoMethodError

Makefileの書き方

Makefileをなぜ書くのか

make(メイク)は、プログラムのビルド作業を自動化するツール。コンパイル、リンク、インストール等のルールを記述したテキストファイル (makefile) に従って、これらの作業を自動的に行う。

ja.wikipedia.org

つまり、コンパイルやリンクなどの一連の手順をMakefileに書いておけば、makeコマンドを実行するだけでコマンド実行などを自動的に行なってくれる。

Makefileの基本構造

Makefileに次のようなルールを書くことで、ビルド手順を指示する。

ターゲット : 前提条件
    コマンド
  • ターゲット:コマンドによって生成されるファイルの名称
  • 前提条件:ターゲットを生成するために必要なファイル
  • コマンド:makeが実行する動作

Makefileの例

main: main.c
  gcc main.c -o main


ターゲット・前提条件・コマンドは複数指定することができる。

main: main.c sub.c
  gcc main.c sub.c -o main
注意

Makefileでは、コマンドの先頭はタブで始める必要がある。

スペースだとエラーが発生する。

$ make
Makefile:3: *** 分離記号を欠いています.  中止.

はてなブログの仕様により、タブがスペースに変換されるため、Makefileの例をコピペするとこのエラーが出るかもしれない。

コメント

Makefileでは、#から行末までの文字がコメントとして無視される。

# コメント
main : main.c # コメント
  gcc main.c -o main # コメント

変数

変数名 = 値で変数を定義し、$(変数名)で変数の値を使う。

# 変数定義
SRC = main.c

# 生成規則
main : $(SRC)
  gcc $(SRC) -o main

自動変数

Makefileでは、特別な意味を持つ変数(自動変数)がよく用いられる。

main : main.c
  gcc $^ -o $@  # gcc main.c -o main になる


自動変数一覧

変数名 意味
$@ ターゲットのファイル名
$% ターゲットメンバーの名前
$< 前提条件の一番最初の名前
$^ 前提条件の全ての名前
$? ターゲットよりも新しい全ての前提条件の名前
$+ 前提条件の全ての名前(重複があっても省略しない)
$* ターゲットのパターンマッチに一致した部分文字列


詳しい説明はこのサイトに書いてある。 quruli.ivory.ne.jp

擬似ターゲット

Makefileのターゲットには、実際にはファイルの名前でない擬似ターゲットを指定することができる。

clean:
  rm *.o

このように記述すると、make cleanと入力するとrm *.oコマンドが実行される。

ただし、cleanファイルが存在する場合、ターゲットは正しく機能しない。

$ make clean
make: 'clean' は更新済みです.

この問題を解決するために、cleanが擬似ターゲットであることを明示的に宣言する必要がある。

.PHONY: clean
clean:
  rm *.o

【rlwrap】Ocamlの対話式コンパイラで矢印キーを使う方法

はじめに

Ocamlを対話式コンパイラ形式で起動する。

$ ocaml
    Ocaml version 4.12.0
#

矢印キーを用いて、テキストカーソルを移動させたり、過去に入力した内容を表示させることが出来ない。

# 1 + 2;;
- : int = 3
# ^[[A

この問題はrlwrapを用いることで解決できる。

rlwrap

rlwrapをインストールする。

$ sudo apt install rlwrap

rlwrapを使ってOcamlを起動する。

$ rlwrap ocaml
    Ocaml version 4.12.0
#

↑キーを押して過去に入力した内容を表示出来ることを確認する。

# 1 + 2;;
- : int = 3
# 1 + 2;;

rlwrap ocamlと入力するのは面倒なので、bash設定ファイルにエイリアスを設定する。

echo "alias ocaml='rlwrap ocaml'" >> ~/.bashrc
source ~/.bashrc

【Ubuntu】マウスホイールのスクロール量の調節【imwheel】

やったこと

Ubuntuを使っていて、マウスホイールのスクロール速度が遅いと思ったので、imwheelを使ってスクロール量を調節した。

imwheelとは 

imwheel はマウスホイールの挙動をプログラムごとに調整するツールです。マウスホイールの入力をキーボードの入力にマッピングしたり、マウスホイールの速度を上げたりすることができます。修飾キーもサポートしています。

wiki.archlinux.jp

imwheelのインストール

次のコマンドでインストールできる。

$ sudo apt install imwheel

次のコマンドでimwheelを実行できる。

$ imwheel
INFO: imwheel started (pid=6368)

imwheelを実行すると、マウスホイールのスクロール速度が速くなった。

imwheelの設定ファイル

imwheelのデフォルトの設定は/etc/X11/imwheel/imwheelrcに書かれている(公式のドキュメントではetc/X11/imwheelrcに設定ファイルがあるらしいが、私の環境では/etc/X11/imwheel/imwheelrcにあった)。 この設定ファイルを編集することで、imwheelが変更するマウスホイールの挙動を細かく設定できる。ただし、このファイルを編集すると全ユーザの設定が変更されるため、今回は~/.imwheelrcを作成・編集する(~/.imwheelrcの内容は1ユーザにしか適用されない)。

スクロール量を変更

.imwheelrcを編集してスクロール量を変更する。

# chromeのみに適用
"chrome"
None, Up,   Button4, 5
None, Down, Button5, 5

# 全てのプログラムに適用
".*"
None, Up,   Button4, 10
None, Down, Button5, 10

上の行の設定の方が優先度が高く設定されるため、全てのプログラムに適用する".*"は、他の設定を上書きしないように最後に書く。

imwheelの設定を適用

次のコマンドで、imwheelを再起動して設定を適用させる。

$ imwheel -k

おまけ

imwheelの設定をGUIで行えるプログラムを、公開してくれている人がいたので使ってみる。

http://www.nicknorton.net/?q=node/10www.nicknorton.net


次のコマンドを入力すると、imwheelの設定画面が表示される。

$ bash <(curl -s http://www.nicknorton.net/mousewheel.sh)


設定画面のMouse wheel speedを変更し、Applyを押すと設定が適用される。

imwheelの設定画面