shirobunのプログラミング雑記

プログラミングについて学んだことを書いていきます

Windowsのキーバインドをmacっぽくする(JIS前提)

やること

  • WindowsのJIS配列キーボードを変更する
    • caps lock 無変換左Ctrl 右Ctrl
    • 右Ctrl(無変換) 変換 を単押し → IMEオフ、オン
    • 左Ctrl + アルファベット → macのカーソル移動っぽく

つかうアプリ

手順

  1. Change Keyは管理者権限で実行すればキー配列を変更できる

    • caps lock左Ctrl
    • 無変換右Ctrl
  2. Keyhac の設定ファイルを変更する(デフォルトのファイルをまるっと上書き)

    • C:¥Users¥[name]¥AppData¥Roaming¥Keyhac¥config.py
    • 上書き後、WindowsタスクバーのKeyhacアイコンを右クリックして、設定のリロードする
import sys
import os
import datetime

import pyauto
from keyhac import *


def configure(keymap):

    # --------------------------------------------------------------------
    # Text editer setting for editting config.py file

    # Setting with program file path (Simple usage)
    if 1:
        keymap.editor = "notepad.exe"
        
    # Setting with callable object (Advanced usage)
    if 0:
        def editor(path):
            shellExecute( None, "notepad.exe", '"%s"'% path, "" )
        keymap.editor = editor

    # --------------------------------------------------------------------
    # Customizing the display

    # Font
    keymap.setFont( "MS Gothic", 12 )

    # Theme
    keymap.setTheme("black")

    # --------------------------------------------------------------------

    # Global keymap which affects any windows
    if 1:

        keymap_global = keymap.defineWindowKeymap()

        keymap_global[ "LCtrl-M" ] = "Enter"
        keymap_global[ "LCtrl-I" ] = "Tab"

        keymap_global[ "LCtrl-A" ] = "Home"
        keymap_global[ "LCtrl-E" ] = "End"

        keymap_global[ "LCtrl-N" ] = "Down"
        keymap_global[ "LCtrl-P" ] = "Up"
        keymap_global[ "LCtrl-F" ] = "Right"
        keymap_global[ "LCtrl-B" ] = "Left"

        keymap_global[ "LCtrl-Shift-A" ] = "Shift-Home"
        keymap_global[ "LCtrl-Shift-E" ] = "Shift-End"

        keymap_global[ "LCtrl-Shift-N" ] = "Shift-Down"
        keymap_global[ "LCtrl-Shift-P" ] = "Shift-Up"
        keymap_global[ "LCtrl-Shift-F" ] = "Shift-Right"
        keymap_global[ "LCtrl-Shift-B" ] = "Shift-Left"

        keymap_global[ "LCtrl-K" ] = "S-End","Delete"

        keymap_global[ "LCtrl-G" ] = "Escape"
        keymap_global[ "LCtrl-H" ] = "Back"
        keymap_global[ "LCtrl-A-F" ] = "A-Right"  # ブラウザで進む
        keymap_global[ "LCtrl-A-B" ] = "A-Left"  # ブラウザで戻る
        keymap_global[ "LCtrl-RCtrl-M" ] = "C-Enter"  # ブラウザでリンクを新しいタブで開く

        # 無変換キーを空打ちするとime_off
        keymap_global["O-RCtrl"] = lambda: switch_ime(False)

        # 変換キーを空打ちするとime_on
        keymap_global["(28)"] = lambda: switch_ime(True)

    ## IMEを切り替える
    #
    #  @param flag      切り替えフラグ(True:IME ON / False:IME OFF)
    #
    def switch_ime(flag):

        # バルーンヘルプを表示する時間(ミリ秒)
        BALLOON_TIMEOUT_MSEC = 500

        # if not flag:
        if flag:
            ime_status = 1
            message = u"[あ]"
        else:
            ime_status = 0
            message = u"[_A]"

        # IMEのON/OFFをセット
        keymap.wnd.setImeStatus(ime_status)
        # IMEの状態をバルーンヘルプで表示
        keymap.popBalloon("ime_status", message, BALLOON_TIMEOUT_MSEC)

以上。

【断片的な記録】macにPostgreSQLをインストールした

参考

環境

つまづいた記録

冒頭の【参考】リンクの手順に沿って実行したが、躓いた箇所を記録する。

  • 初めてログインする際、何か聞かれた。断ったらすんなりログインできた。(2回目以降のログインでは聞かれなくなった)
~ ❯❯❯ psql -U${USER} postgres
zsh: correct psql to _psql [nyae]? n
psql (10.4)
Type "help" for help.

postgres=# 
  • データベース作成時、末尾のセミコロンを見てSQLだと思ったが、コマンドだった。。
$ createdb hogehoge -O postgres;

以上。

SSLについて理解したことのまとめ

SSLについて理解したことを、下記サイトから抜粋してまとめてみます。
図解で学ぶネットワークの基礎:SSL編 | 日経 xTECH(クロステック)

Lesson1

  • SSLが持つ機能は二つある。
    • 「データの暗号化」
    • 「通信相手が信頼できることの確認」(認証)
  • SSLSSLクライアント)は,このWebブラウザとTCPの間に位置する。
  • SSLTLSの動作と機能はほぼ同じである。

Lesson2

  • SSLは,「共通鍵暗号」と「公開鍵暗号」という二つの暗号方式を組み合わせて利用している。
  • 共通鍵暗号」の特徴は,暗号化と復号の処理が軽いこと。
    • 実際にアプリケーション同士でやりとりするデータの暗号化/復号に利用される。
  • 暗号通信で使う鍵の共有(前処理)の処理順番
    1. クライアントは、サーバーにSSL通信の要求を送る
    2. サーバーは、自身の公開鍵が入った証明書をクライアントに返信
    3. クライアントは、入手したサーバーの公開鍵を使って「アプリケーション同士の暗号通信に使う共通鍵」を暗号化してサーバーに送る
    4. サーバーは、秘密鍵を使ってクライアントから送られてきた暗号データを復号して,「暗号通信に使う共通鍵」を取り出す
    5. この時点でクライアント&サーバーの両者は,誰にも知られずに共通鍵を持てたことになる

Lesson3

  • SSLは,大きく二つの仕様で成り立っている。
    • 「レコード・プロトコル
      • メッセージのフォーマット。
    • 「ハンドシェーク・プロトコル
      • メッセージを使って暗号通信を実現するまでの手順。
  • SSLで運ぶメッセージは「レコード」と呼ばれる
    • SSLのレコードは,ヘッダー部分とデータ部分に分かれている。
      • ヘッダー部分
        • データの種類(タイプ)
        • バージョン(SSLTLSか)
        • データ長の情報
      • データ部分
        • ハンドシェーク・プロトコルのメッセージ
        • 暗号通信時の暗号化データ
  • 一般的なSSLのやりとり
    1. クライアントは、サーバーに暗号通信で使う暗号方式などを提案する
    2. サーバーは、提案のあった方式から適切なものを一つ選んで返答する
    3. サーバーは、クライアントにCertificateメッセージを使ってサーバー証明書を送る
      • 証明書の情報を送り終えたら,そのことを知らせる
    4. クライアントは、入手したサーバー証明書からサーバーの公開鍵を取り出し、この公開鍵を使って暗号通信に使う共通鍵の基になる秘密の値(プレマスタ・シークレット)を暗号化して送信する。
    5. これがClientKeyExchangeメッセージである。
    6. サーバーは、この暗号化したデータを自身の秘密鍵で復号すると、プレマスタ・シークレットが出てくる。
    7. この時点で両者は、共通鍵の基となるプレマスタ・シークレットを共有できた。
    8. クライアントは、これまで決めた暗号方式の採用を宣言し、ハンドシェークの終了をサーバーに知らせる。
    9. これを受けたサーバーの動作もクライアントと同様。暗号方式の採用を宣言し、ハンドシェークの終了をクライアントに知らせる。
    10. これ以降クライアントとサーバーは、共有したプレマスタ・シークレットから共通鍵を生成し、その共通鍵を使って暗号通信を実施する。

Lesson4

  • 一番上位に位置する「ルート認証局」と呼ばれる認証局の証明書が必ず送られてくる。
  • パソコンにはあらかじめ、信頼できるルート認証局の証明書(自己証明書)が複数インストールされている。
  • クライアントにはサーバー証明書とルート認証局の証明書が送られてくる。
  • クライアントは、自分にインストールされている「信頼できるルート認証局の証明書」をチェックし、その中に一致する証明書があったら、そのルート認証局の証明書は信頼できると判断する。
  • ルート認証局の証明書の中に入っている公開鍵を使って、サーバー証明書に付けられた署名を検証する。

【解決】さくらのVPSにSSHで入れない

現象

  • Permission denied (publickey).

原因

  • scpでvps宛に公開鍵を送らずに、macで作りたての公開鍵の中身をvpsのauthorized_keysファイルの中へコピペしたため(と思います)

やってしまったこと(こちらより一部拝借)

1.[vps]ssh用のディレクトリ作っておく
2.[mac]鍵作る
3.[mac]公開鍵をvpsに持ってく 
→ scpで持ってくのではなく、ファイル内のテキストをコピペして持っていった。
4.[vps]公開鍵を設定する
5.[mac]ssh接続して確認してみる
6.[mac]ssh接続を設定に書いておく
7.[vps]sshdの設定をする

結論

  • 手順をイチからやり直し、scpでvpsへ公開鍵を送ると、sshログイン成功しました。

さくらのVPSにDebian9をインストールしてsudo設定まで

序盤

  • さくらのhelpに従い、Debian9をインストール

カスタムOSインストールガイド - Debian 8 / 9 – さくらのサポート情報

  • rootのパスワードを空白のまま設定してしまったので再設定。。

Debianを使用していますが、suコマンド時の管理者(root)パスワードが分かりません。

rootでログインして作業する

apt update
apt upgrade
apt install sudo
  • visudoのデフォルトのエディタを変更する(nano -> vim)
root@tk2-212-15580:~# update-alternatives --config editor
alternative editor (/usr/bin/editor を提供) には 2 個の選択肢があります。

  選択肢    パス             優先度  状態
------------------------------------------------------------
  0            /bin/nano           40        自動モード
  1            /bin/nano           40        手動モード
* 2            /usr/bin/vim.tiny   15        手動モード

現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください:

「2」を押してenter

  • visudoで設定変更する
# User privilege specification
root    ALL=(ALL:ALL) ALL

# 追記
[ユーザ名] ALL=(ALL:ALL) ALL 

sudoが正しく設定されているか確認する

  • root以外の[ユーザ名]にてログインする
    • apt update
      • error!
    • sudo apt update
      • success!

その他

  • ちょっと気になった点
    • さくらVPSVNCコンソール内でctrl + A打つとttyが切り替わる(行頭に行きたいのに)

Debianのadduserとuseraddについてメモ

  • adduser

  • useradd

    • adduserの中で呼ばれてるので、原始的(なイメージ)
    • ユーザー追加する際にはgroupaddとかも手動でやらねばならん
    • 対話式ではない
    • Debianを含む、各ディストリビューションで使えるコマンド。

https://qiita.com/amedama/items/f45677cd944c42cde839

aptについてまとめてみる

aptが無い時代は

  • tar.gzみたいのをコンパイルしてた
  • アップデートのたびにコンパイルしてた
  • 整合性取るの辛かった
  • そこで、dpkg(パッケージ管理システム)がつくられた

aptは

  • dpkgのフロントエンドとして使われてる
  • dpkg自身では、パッケージをリモートホストから取得したり、複雑なパッケージ間の依存関係を扱うことができない
  • そこで、aptつかうことになる

aptの機能

# 機能 説明
1 依存 必須パッケージ
2 推奨 任意パッケージ(でも通常は導入するもの)
3 提案 任意パッケージ(でも導入すると機能向上するもの)
4 衝突 導入と同時に削除されるパッケージ

aptコマンド

  • apt-getとapt-cacheが統合されてaptになった
旧コマンド 新コマンド
apt-get install パッケージ名 apt install パッケージ名
  • よくつかうaptコマンド例
コマンド例 説明
apt update パッケージリスト(データベース)の更新
apt upgrade インストールされているパッケージ(ソフトウェア)の更新
apt install パッケージ名 パッケージ名のインストール
apt list --installed インストールされているパッケージリストの表示
apt search 検索キーワード パッケージの検索
apt remove パッケージ名 パッケージ名のアンインストール
apt autoremove apt removeで削除されなかった関連ファイルの削除