HHKB Professional HYBRIDを買って半年ちょっと使っている話。

イメージ
昨年の9月に購入しましたHHKB。 一時期英語配列のキーボードを使っていましたが、今回は日本語配列をチョイス。 PFU キーボード HHKB Professional HYBRID 日本語配列/墨 良かったところ タイピング時の打鍵感、音が心地良い     これがかなりデカい。直近の生成AI周りの発展のおかげで直接タイピングしてコードを書くことは以前に比べるとかなり減ったけど、それでも全然使うのでここのストレスがないことは大きい。 ただ、これも人による部分が大きいと思う部分なので事前に触れる箇所があれば触った方が良い。 HHKBの公式サイトにタッチ&トライスポット というページがあるので実際の打鍵感や音を確認したい人はそこで検索してのをおすすめします。 僕の場合、当初は HHKB Studio を買おうと思って秋葉原の遊舎工房というお店で触らせてもらいましたが、正直打鍵感と音の感じが好みではなかったのでボツ。 横に置いてあったこっちのキーボードを触ってみたらかなりしっくりきた。他にも色んなキーボード(同モデルの静音タイプとか)が置いてあったけど、長いこと使うなら手に馴染むモデルが良いと思ってそのまま購入という流れ。 あと、個人的には気にならなかったけど、色んなところのレビューを見る感じ音に敏感な人と同居してるとか赤ちゃんがいる家庭とかだと少し苦情が出るかも、なくらいの音が出るのでそこは注意すべき。多分そういった人向けに静音モデルがあると思う。 Bluetooth接続できるデバイスの数が多め これもかなりポイント。仕事用のPCにもプライベート使っているPCも両方ともクラムシェルモード(PCを折りたたんだまま外部ディスプレイに接続して使用するモード)で使っているので、仕事を始めるタイミングや終えて切り替えるタイミングで物理ケーブルの切り替えに手間が掛かるのが嫌だった。 HHKBを使用する前に使用していたMagic Keyboardなんかは複数デバイスに対応していなかったため、いけてないなと思いつつ使っていた。 今はコマンドで接続先を切り替えるだけなのでそのストレスは大きく減った。お高いキーボードであれば標準的に乗っている機能なんだろうけど、なんでMagic Keyboardはこの機能がないんだろう・・・ 良くないところ 割と頻繁な頻度で単三電池...

Pythonで学ぶスタック

スタック

について改めて使い道を模索してみたのでメモ。

スタックについて

底のある箱の中に積み木を積んでいくイメージ。
いわゆるLIFO(last in first out)、最後に入れたものを最初に取り出す、というデータ構造。

要素を取り出す時の操作をpop、要素を入れる時の操作をpushという。

スタックを連結リスト、もしくは配列で実装した場合のpop、pushの操作はO(1)の計算量となります。

Pythonでのスタック利用例

Pythonでの表記法と注意点

他の言語と同様に、PythonでもStackが組み込み関数として用意されています。

ここで注意すべきなのは上記で用意したPythonでリストを用いてスタックを表す場合にはpushではなく、appendを使う点です。

スタックとして使う場合は以下のように要素の出し入れを行います。

>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack.pop()
5
>>> stack
[3, 4]

他にもスタックには様々な使い道があります。

連結リストの要素を逆転させる

def reverse_linked_list(head):
    nodes = []
    while head:
        nodes.append(head.data)
        head = head.next

逆ポーランド記法の計算

def evaluate_rpn(expression):
    inter_results = []
    delimiter = ','
    operators = {
        '+':lambda y, x: x + y,'-':lambda y,x:x-y,
        '*':lambda y,x:x*y,'/':lambda y,x:x //y
    }
    
    for token in expression.split(delimiter):
        if token in operators:
            inter_results.append(operators[token](inter_results.pop(),inter_results.pop()))
        else:
            inter_results.append(int(token))
    return inter_results[-1]


expression = "3,4,+,2,*,1,+"
evaluate_rpn(expression)
# 15

ディレクトリ構造の短縮化

def shortest_path(path):
    if not path:
        raise ValueError("パスが与えられていません")
        
    path_names = []
    if path[0] == '/':
        path_names.append("/")
    for token in (token for token in path.split("/") if token not in ['.','']):
        if token == '..':
            if not path_names or path_names[-1] == '..':
                path_names.append(token)
            else:
                if path_names[-1] == '/':
                    raise ValueError("パスエラー")
        else:
            path_names.append(token)
            
    result = '/'.join(path_names)
    return result[result.startswith('//'):]


path = "/usr/lib/../appication/../bin/"
shortest_path(path)
# '/usr/lib/appication/bin'        

この様に様々な用途に使えます。
同様にキューについてもその内書く予定です。

コメント

このブログの人気の投稿

【OSLog】How to log a Swift project

Principles of UX/UI Designでこんなことを学んでいるよ 第一週 User-centerd design①

Swiftで使うQueueのテンプレート