Hylangで最大ヒープ

概要

 Pythonの組み込みライブラリにはheapqなる、ヒープ木を実現するためのモジュールがあるのだが、最小ヒープしか対応していないので、小細工して最大ヒープをできる様にしてみた。
 ※ ただし言語はHylang

最大ヒープって何?

 ヒープ木でルートの値が最大値のもの。
 詳しくは、http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_9_B&lang=jpを参照

実装

 比較演算子のオーバーライドでどうにかしてみた。

;; ----------------------------------------
;; Max Heap : ルートが最大値
;; ----------------------------------------
(import [heapq [heappush heappop]])

(defclass ReverseOrder []
  []
  (defn --init-- [self x]
    (setv (. self _x) x))
  (defn --lt-- [self other]
    (> (. self _x) (. other _x)))
  (defn --le-- [self other]
    (>= (. self _x) (. other _x)))
  (defn --gt-- [self other]
    (< (. self _x) (. other _x)))
  (defn --ge-- [self other]
    (<= (. self _x) (. other _x)))
  (defn --str-- [self]
    (-> (. self _x) str)))

(defn heap-push [que x]
  (heappush que (ReverseOrder x)))

(defn heap-pop [que]
  (. (heappop que) _x))


;;; テスト
(def xs [])
(heap-push xs 2)
(heap-push xs 3)
(heap-push xs 1)
(print (heap-pop xs)) ;; 3

おまけ

 流石にHylangの需要がなさすぎるので、Python Versionも公開しておく。

from heapq import heappush, heappop


class ReverseOrder:

    def __init__(self, x):
        self._x = x
        return None

    def __lt__(self, other):
        return (self._x > other._x)

    def __le__(self, other):
        return (self._x >= other._x)

    def __gt__(self, other):
        return (self._x < other._x)

    def __ge__(self, other):
        return (self._x <= other._x)

    def __str__(self):
        return str(self._x)

def heap_push(que, x):
    return heappush(que, ReverseOrder(x))

def heap_pop(que):
    return heappop(que)._x

## テスト
xs = []
heap_push(xs, 2)
heap_push(xs, 3)
heap_push(xs, 1)
print (heap_pop(xs)) # 3

「12歳が書いた量子力学の教科書」の適当まとめ

概要

 後で見返して、こんな感じだったなーと思い返す用のまとめ。

12歳の少年が書いた 量子力学の教科書

12歳の少年が書いた 量子力学の教科書

適当まとめ(見返し用)

  1. 量子力学とは何か
  2. 万物の根源
    • 歴史的な流れ(古代〜)
    • 単位系の話
  3. 前期量子論
    • プランク〜ボーアの時代
    • 光は波か粒子か?
      • 光の二重性
    • コンプトン散乱
    • 教科書の物理モデルは間違い
      • ラザフォードの太陽系型原子モデル
      • ボーアモデル
    • ド・ブロイ
  4. 数学的定式化

  5. 内在的矛盾と解釈問題

  6. 量子力学の先へ

  7. 近未来応用への道

感想

  • 量子力学というか物理学自体に明るくないが、なんとなく概要はつかめるようになった気がする。
  • 数学的定式化の行列のところはある程度知識がないと辛いのではないかと感じた。
  • コレをベースに量子コンピュータの勉強をすすめることにする。

Pythonで代数学をやる

ライブラリ

ライブラリ Version 説明
Sympy 1.1.1 代数計算
NetworkX 2.0 グラフ理論

概要

 PythonMaximaMathematicaのような代数計算ができるライブラリであるSympyとグラフ理論用のライブラリであるNetworkXを使ってみたかった。
 そのうちmatplotlibと連携してグラフとか出力してみたい。

導入

  • pipでインストールできる

はじめに

実践

Tips

参考

TODO

  • NetworkXを触っていないので後日なんか作る

Tidalに入門したかった

概要

  • プログラミングで音を奏でられる&LiveCodingができるということで、Tidalをインストールしようとしたがダメだったのでメモしておく

環境

Softwares Version
Basix(OS) 3.0
Stack 1.3.2
SuperCollider 3.6.2

インストール

ダメだった点

まとめ

  • これ以上はめんどくさいので、とりあえず保留
  • 後日再挑戦する

Kivy備忘

Kivy使い方メモ

概要

  • PythonGUI作成ライブラリとしてKivyが注目されているのでやってみた
  • 実装はPythonではなく、hylangで行う

環境

App Version
Python 3.5.2
hylang 0.13.0

Install

作成メモ

デフォルトで読み込まれるkvファイル

Properties

  • Observer patternに該当する
  • kvファイルとのやり取りとか、メモリ管理とか色々やってくれるらしい
  • on_で値変更時のイベントが飛んでくるようになるらしい

KV File

  • 基本的に木構造な感じで作成していく
<LoginScreen>:  # Class Name
  GridLayout:   # Layout to the parent
    rows:       # Property of a layout
(defclass Main [App]
  ;; build()の戻り値がメインのルートになる
  (defn build [self]
    (setv (. self root) (apply Button {:text "BTN"})) ;; Buttonがルートになる
    (. self root)))

参考プログラム

Pong Game Tutorial

Kivyでテトリス

  • https://github.com/mmueller/tetrivy
  • PC上での操作性はもっと改良する必要がある気がする
  • マネして作ってみてイベント操作性とか改良してみると結構勉強になる

Tips

キーボード入力のやり方 (Windowクラス利用)

キーボード入力のやり方 (FocusBehaviorクラス利用)

Errors

"__no_builder"的なやつ

履歴

Date Notice
2017/11/12 初回作成

LxPupインストール

概要

 家のゴミPC(EeePC初期型:容量4GB)にPuppyLinuxのLXDE版をインストールした際の話

インストール

なぜLxPupなのか?

 容量的に通常のLinuxだと明らかに足らない。軽いと思っていたBasixですら4GBが必要で、上記PCの表記上は容量が足りている様に見えるが、システム領域があるので実質4GB未満しか使えない。
 PuppyLinuxは200MB未満でインストール可能なので、上記PCでも余裕でインストール可能。(LxPupは300MBぐらい)
 派生のLxPupにした理由は、PuppyLinuxのデスクトップがゴチャゴチャしているのと、アイコンのデザインが好きに慣れないから。

ダウンロード

 ダウンロードはリンクより可能。今回は16.08.2のisoを落とした。

設定

  1. メニュー → セットアップ → Puppyユニバーサルインストーラを選択
  2. SDカード領域を選択する
  3. 領域を適当に初期化する。(bootの設定を入れる様にする)
  4. インストール時にファイルの指定を迫られるので以下のファイルを指定
    • /initrd/mnt/tmpfs/puppy_lxxenial_XX.XX.sfs
  5. 以下の4ファイルをUSBからコピーしてインストール先に突っ込む(今回は/mnt/sda1)
    • initrd.gz
    • vmlinuz
    • puppy_lxpup_XX.XX.sfs
    • zdrv_lxpup_XX.XX.sfs
  6. メニュー → システム → Grub4Dosブートローダの設定を起動する
    • 上記ファイルを入れておくと場所(/mnt/sda1)を認識してくれる筈
  7. lang_pack_ja-2.1.sfsをリンクから落としてタブルクリックでインストール
  8. 再起動

アプリケーション等

  1. vimリンクを参照して、sfsを落としてインストールする

その他

  1. ユーザ領域をどのぐらいのサイズにするか?
    • 2Gにすると起動が遅くなったので、1Gぐらいがいいのか?
  2. PETgetマネージャでインストールできないものが結構ある(vimがダメだった)
  3. 本体の電源で切ると、次回起動時に立ち上がらない事がある(EeePC側の問題か?)
  4. 起動が不安定

まとめ

 良い子のみんなはマネしないで、もっといい中古のPCを買おう。

参考

FSharp導入編

概要

 F#をちょいちょい弄っているので、オボエガキ兼簡易まとめ。
 Visual Studio 2010以降はデフォで入っており、スクリプト形式で実行できるので、Windowsの場合だとバッチファイルの代りになるのがいい。

インストー

Linux

 環境としては、monoとfsharpが入っていればいいみたい

Windows

 Visual Studioをインストールすると多分自動的に入ってくる

スクリプト実行

Linux

 取り敢えず、HelloWorldを出力させてみる。以下の内容でファイルを作成する。

  // ファイル名 : hello_world.fsx
  printfs "Hello, World"

 コマンドで、以下を実行する。

  fsharpi --exec  hello_world.fsx

Windows

 バッチファイルを作成して実行させるので、以下の内容でバッチファイルを作る。
 因みにfsi.exeのパスは環境によっては違う場所に入っている可能性があるので注意

  REM ファイル名 : run_fsharp.bat
  @echo off
  SET BIN_PATH="C:\Program Files (x86)\Microsoft SDKs\F#\4.0\Framework\v4.0\fsi.exe"
  %BIN_PATH% --exec %1

 上の内容で、hello_world.fsxを作成し、以下のコマンドで実行する。

  REM run_fsharp.batが存在するフォルダに移動する
  REM run_fsharp.bat と hello_world.fsx は同じフォルダに入れておく
  run_fsharp.bat hello_world.fsx

後記

 Windowsのバッチファイルでちょっと複雑な処理をするようなスクリプトを書こうとすると、配列とかループとかがクソ面倒で詰む。F#も文法が手続き型言語から多少離れているので若干書きづらいが、慣れればそれなりに書けるので選択肢としては有りだと思う。
 また、F#の他に開発環境にはJRE(Java Runtime Engine)が入っている事が多いので、clojureも候補としては有り。但し、LISPの方言特有の括弧地獄に悩まされる事にはなるが。