カテゴリー
その他 社内SE

Code-server keyboad Layout 日本語化

VPSに入れてあるUbuntuにCode-serverをインストールして、ブラウザからアクセスしたところ、キーボードショートカットがうまく動かない。ターミナルを開く「Ctrl+Shift+@」を押しても反応がない。手元の日本語キーボードをCode-serverがUSのキーボードと認識しているのが原因のようだ。Keyboad Layoutをjaに変更したいのだが、表示される選択欄にjaはない。VPS上のUbuntuを日本語環境にしてみたりしたが効果がない。

仕方がないのでVS-CODEを立ち上げ、そこのKeyboad Layoutをまるっとコピーしたら、問題が解決した。

以下、方法を備忘録。

code-server 右下のLayout: USとなっているところをクリックします。
右下のLayoutがUS

上の画像の箇所をクリックすると、Keyboad Layoutの変更ができるので、そこで「Configure Keyboad Layout」を選択。

表示されたKeyboad Layoutの切り替え一覧から「Configure Keyboad Layout」を選択します。

表示されるkeyboadlayout.jsonに以下をコピーペーストし保存。(長いコードの下に設定の続きあり。)

{
	"layout": {
		"name": "00000411",
		"id": "",
		"text": "Japanese"
	},
	"rawMapping": {
		"Sleep": {
			"vkey": "VK_SLEEP",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"WakeUp": {
			"vkey": "VK_UNKNOWN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyA": {
			"vkey": "VK_A",
			"value": "a",
			"withShift": "A",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyB": {
			"vkey": "VK_B",
			"value": "b",
			"withShift": "B",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyC": {
			"vkey": "VK_C",
			"value": "c",
			"withShift": "C",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyD": {
			"vkey": "VK_D",
			"value": "d",
			"withShift": "D",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyE": {
			"vkey": "VK_E",
			"value": "e",
			"withShift": "E",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyF": {
			"vkey": "VK_F",
			"value": "f",
			"withShift": "F",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyG": {
			"vkey": "VK_G",
			"value": "g",
			"withShift": "G",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyH": {
			"vkey": "VK_H",
			"value": "h",
			"withShift": "H",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyI": {
			"vkey": "VK_I",
			"value": "i",
			"withShift": "I",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyJ": {
			"vkey": "VK_J",
			"value": "j",
			"withShift": "J",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyK": {
			"vkey": "VK_K",
			"value": "k",
			"withShift": "K",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyL": {
			"vkey": "VK_L",
			"value": "l",
			"withShift": "L",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyM": {
			"vkey": "VK_M",
			"value": "m",
			"withShift": "M",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyN": {
			"vkey": "VK_N",
			"value": "n",
			"withShift": "N",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyO": {
			"vkey": "VK_O",
			"value": "o",
			"withShift": "O",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyP": {
			"vkey": "VK_P",
			"value": "p",
			"withShift": "P",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyQ": {
			"vkey": "VK_Q",
			"value": "q",
			"withShift": "Q",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyR": {
			"vkey": "VK_R",
			"value": "r",
			"withShift": "R",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyS": {
			"vkey": "VK_S",
			"value": "s",
			"withShift": "S",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyT": {
			"vkey": "VK_T",
			"value": "t",
			"withShift": "T",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyU": {
			"vkey": "VK_U",
			"value": "u",
			"withShift": "U",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyV": {
			"vkey": "VK_V",
			"value": "v",
			"withShift": "V",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyW": {
			"vkey": "VK_W",
			"value": "w",
			"withShift": "W",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyX": {
			"vkey": "VK_X",
			"value": "x",
			"withShift": "X",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyY": {
			"vkey": "VK_Y",
			"value": "y",
			"withShift": "Y",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KeyZ": {
			"vkey": "VK_Z",
			"value": "z",
			"withShift": "Z",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Digit1": {
			"vkey": "VK_1",
			"value": "1",
			"withShift": "!",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Digit2": {
			"vkey": "VK_2",
			"value": "2",
			"withShift": "\"",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Digit3": {
			"vkey": "VK_3",
			"value": "3",
			"withShift": "#",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Digit4": {
			"vkey": "VK_4",
			"value": "4",
			"withShift": "$",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Digit5": {
			"vkey": "VK_5",
			"value": "5",
			"withShift": "%",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Digit6": {
			"vkey": "VK_6",
			"value": "6",
			"withShift": "&",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Digit7": {
			"vkey": "VK_7",
			"value": "7",
			"withShift": "'",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Digit8": {
			"vkey": "VK_8",
			"value": "8",
			"withShift": "(",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Digit9": {
			"vkey": "VK_9",
			"value": "9",
			"withShift": ")",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Digit0": {
			"vkey": "VK_0",
			"value": "0",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Enter": {
			"vkey": "VK_RETURN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Escape": {
			"vkey": "VK_ESCAPE",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Backspace": {
			"vkey": "VK_BACK",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Tab": {
			"vkey": "VK_TAB",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Space": {
			"vkey": "VK_SPACE",
			"value": " ",
			"withShift": " ",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Minus": {
			"vkey": "VK_OEM_MINUS",
			"value": "-",
			"withShift": "=",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Equal": {
			"vkey": "VK_OEM_7",
			"value": "^",
			"withShift": "~",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"BracketLeft": {
			"vkey": "VK_OEM_3",
			"value": "@",
			"withShift": "`",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"BracketRight": {
			"vkey": "VK_OEM_4",
			"value": "[",
			"withShift": "{",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Backslash": {
			"vkey": "VK_OEM_6",
			"value": "]",
			"withShift": "}",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Semicolon": {
			"vkey": "VK_OEM_PLUS",
			"value": ";",
			"withShift": "+",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Quote": {
			"vkey": "VK_OEM_1",
			"value": ":",
			"withShift": "*",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Backquote": {
			"vkey": "VK_UNKNOWN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Comma": {
			"vkey": "VK_OEM_COMMA",
			"value": ",",
			"withShift": "<",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Period": {
			"vkey": "VK_OEM_PERIOD",
			"value": ".",
			"withShift": ">",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Slash": {
			"vkey": "VK_OEM_2",
			"value": "/",
			"withShift": "?",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"CapsLock": {
			"vkey": "VK_UNKNOWN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F1": {
			"vkey": "VK_F1",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F2": {
			"vkey": "VK_F2",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F3": {
			"vkey": "VK_F3",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F4": {
			"vkey": "VK_F4",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F5": {
			"vkey": "VK_F5",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F6": {
			"vkey": "VK_F6",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F7": {
			"vkey": "VK_F7",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F8": {
			"vkey": "VK_F8",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F9": {
			"vkey": "VK_F9",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F10": {
			"vkey": "VK_F10",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F11": {
			"vkey": "VK_F11",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F12": {
			"vkey": "VK_F12",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"PrintScreen": {
			"vkey": "VK_SNAPSHOT",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"ScrollLock": {
			"vkey": "VK_SCROLL",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Pause": {
			"vkey": "VK_NUMLOCK",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Insert": {
			"vkey": "VK_INSERT",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Home": {
			"vkey": "VK_HOME",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"PageUp": {
			"vkey": "VK_PRIOR",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Delete": {
			"vkey": "VK_DELETE",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"End": {
			"vkey": "VK_END",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"PageDown": {
			"vkey": "VK_NEXT",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"ArrowRight": {
			"vkey": "VK_RIGHT",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"ArrowLeft": {
			"vkey": "VK_LEFT",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"ArrowDown": {
			"vkey": "VK_DOWN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"ArrowUp": {
			"vkey": "VK_UP",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"NumLock": {
			"vkey": "VK_UNKNOWN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"NumpadDivide": {
			"vkey": "VK_DIVIDE",
			"value": "/",
			"withShift": "/",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"NumpadMultiply": {
			"vkey": "VK_MULTIPLY",
			"value": "*",
			"withShift": "*",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"NumpadSubtract": {
			"vkey": "VK_SUBTRACT",
			"value": "-",
			"withShift": "-",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"NumpadAdd": {
			"vkey": "VK_ADD",
			"value": "+",
			"withShift": "+",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"NumpadEnter": {
			"vkey": "VK_RETURN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Numpad1": {
			"vkey": "VK_END",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Numpad2": {
			"vkey": "VK_DOWN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Numpad3": {
			"vkey": "VK_NEXT",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Numpad4": {
			"vkey": "VK_LEFT",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Numpad5": {
			"vkey": "VK_CLEAR",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Numpad6": {
			"vkey": "VK_RIGHT",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Numpad7": {
			"vkey": "VK_HOME",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Numpad8": {
			"vkey": "VK_UP",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Numpad9": {
			"vkey": "VK_PRIOR",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Numpad0": {
			"vkey": "VK_INSERT",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"NumpadDecimal": {
			"vkey": "VK_DELETE",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"IntlBackslash": {
			"vkey": "VK_UNKNOWN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"ContextMenu": {
			"vkey": "VK_APPS",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Power": {
			"vkey": "VK_UNKNOWN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"NumpadEqual": {
			"vkey": "VK_CLEAR",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F13": {
			"vkey": "VK_F13",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F14": {
			"vkey": "VK_F14",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F15": {
			"vkey": "VK_F15",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F16": {
			"vkey": "VK_F16",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F17": {
			"vkey": "VK_F17",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F18": {
			"vkey": "VK_F18",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F19": {
			"vkey": "VK_F19",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F20": {
			"vkey": "VK_F20",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F21": {
			"vkey": "VK_F21",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F22": {
			"vkey": "VK_F22",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F23": {
			"vkey": "VK_F23",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"F24": {
			"vkey": "VK_F24",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Help": {
			"vkey": "VK_UNKNOWN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Undo": {
			"vkey": "VK_UNKNOWN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Cut": {
			"vkey": "VK_UNKNOWN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Copy": {
			"vkey": "VK_UNKNOWN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Paste": {
			"vkey": "VK_UNKNOWN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"AudioVolumeMute": {
			"vkey": "VK_VOLUME_MUTE",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"AudioVolumeUp": {
			"vkey": "VK_VOLUME_UP",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"AudioVolumeDown": {
			"vkey": "VK_VOLUME_DOWN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"NumpadComma": {
			"vkey": "VK_ABNT_C2",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"IntlRo": {
			"vkey": "VK_OEM_102",
			"value": "\\",
			"withShift": "_",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"KanaMode": {
			"vkey": "VK_UNKNOWN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"IntlYen": {
			"vkey": "VK_OEM_5",
			"value": "\\",
			"withShift": "|",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Convert": {
			"vkey": "VK_CONVERT",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"NonConvert": {
			"vkey": "VK_NONCONVERT",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Lang1": {
			"vkey": "VK_UNKNOWN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Lang2": {
			"vkey": "VK_UNKNOWN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Lang3": {
			"vkey": "VK_UNKNOWN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Lang4": {
			"vkey": "VK_UNKNOWN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"ControlLeft": {
			"vkey": "VK_CONTROL",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"ShiftLeft": {
			"vkey": "VK_SHIFT",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"AltLeft": {
			"vkey": "VK_MENU",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"MetaLeft": {
			"vkey": "VK_LWIN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"ControlRight": {
			"vkey": "VK_CONTROL",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"ShiftRight": {
			"vkey": "VK_SHIFT",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"AltRight": {
			"vkey": "VK_MENU",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"MetaRight": {
			"vkey": "VK_RWIN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"MediaTrackNext": {
			"vkey": "VK_MEDIA_NEXT_TRACK",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"MediaTrackPrevious": {
			"vkey": "VK_MEDIA_PREV_TRACK",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"MediaStop": {
			"vkey": "VK_MEDIA_STOP",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"Eject": {
			"vkey": "VK_UNKNOWN",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"MediaPlayPause": {
			"vkey": "VK_MEDIA_PLAY_PAUSE",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"MediaSelect": {
			"vkey": "VK_LAUNCH_MEDIA_SELECT",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"LaunchMail": {
			"vkey": "VK_LAUNCH_MAIL",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"LaunchApp2": {
			"vkey": "VK_LAUNCH_APP2",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"LaunchApp1": {
			"vkey": "VK_LAUNCH_APP1",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"BrowserSearch": {
			"vkey": "VK_BROWSER_SEARCH",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"BrowserHome": {
			"vkey": "VK_BROWSER_HOME",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"BrowserBack": {
			"vkey": "VK_BROWSER_BACK",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"BrowserForward": {
			"vkey": "VK_BROWSER_FORWARD",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"BrowserStop": {
			"vkey": "VK_BROWSER_STOP",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"BrowserRefresh": {
			"vkey": "VK_BROWSER_REFRESH",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		},
		"BrowserFavorites": {
			"vkey": "VK_BROWSER_FAVORITES",
			"value": "",
			"withShift": "",
			"withAltGr": "",
			"withShiftAltGr": ""
		}
	}
}

code-serverからログアウトし、再度ログイン。

左上の三からメニューを表示し、「Sign out of code-server」をクリック
ログアウト方法

最後に一番最初のKeyboad Layoutの選択で「Japanese (User configured layout)」を選択すると日本語キーボードでもショートカットが使えるようになる。

変更されると右下の表示が「Layout: Japanese」になります。
こうなったらOK!

以上!

カテゴリー
その他 社内SE

Chromebook用メモ帳(Text editor PWA)

Chromebook (Chrome OS)用のテキストファイル用文字化け対策済みのアプリ(PWA)を以下リンクに公開します。PWAをインストールすれば完全にオフラインでも利用可能です。(ChromebookでSJISのテキストファイルを開けるようになります。)

メモ帳アプリ

PWA インストール方法

通常のPWAのインストールと同様です。メモ帳アプリを開いて上部アドレスバーに表示されるアイコンからインストールです。(表示されない場合は、アドレスバーでEnterを押して再読み込みしてみてください。)

PWAインストールボタン
PWAインストール確認画面

これでアプリとして「メモ帳」が登録されているので、検索ランチャーなどから呼び出せます。

ファイルから直接メモ帳を起動したい場合

ファイルをダブルクリックで表示など、ファイルから直接「メモ帳」を起動したい場合は、最初に実験的機能から、File Handling APIを選び、Enabledに設定します。

  1. アドレスバーにchrome://flagsと入力し、実験的機能を呼び出す。
  2. File Handling APIを探し、Enabledにする。
  3. Restart(再起動)する。(Chromebookが再起動されます。)
File Handling API

この状態でファイルアプリから適当なファイルを選び、右クリックから、以下の画像の要領で先程登録したメモ帳アプリを呼び出します。(画像のアプリ名は開発中のため異なります。。。)途中、許可を求められるので適宣許可ください。

ファイルから呼び出し

上の画像で「デフォルトを変更」を選ぶとテキストファイルをダブルクリックで開けるように設定もできます。

注意点

SJISのテキストファイルを読み込み表示/編集できますが、保存するとUTF-8になります。最近のWindowsのメモ帳はUTF-8がデフォルトですので、特に問題ないかとは思いますが、利用の際は注意ください。

その他

一度インストールすると完全にオフラインで動作します。サーバにファイルなどを送ることもないのでセキュリティ上も安心かと思います。

Shift-JISの他、EUC-JPも読めるようにしていますが、テストしていない(手元にEUC-JPのファイルがない)ので動かないかもしれません。

経緯

ChromeOSのTextアプリがShift-JISに対応していないため、古いテキストファイルを開くと文字化けていることがあり、その対策としてオープンソースソフトのSmart Text Editorを改変して作りました。本家のいらなそうな機能はバッサリ削っています。日本語対応以外で追加した機能は「名前を付けて保存」くらいです。短時間テストなしで改変したので、バグあるかもしれません。ソースはこちらに公開しています。(本家もかなりぐちゃぐちゃなコードです。何も気にせずぐちゃぐちゃ改変できるのでやりやすいといえばやりやすいのですが。。)

カテゴリー
その他 社内SE

HP Chromebook x360 14c レビュー(14c-cc 型番:518T8PA-AAAB)

家族で使用するためにChromebookを購入した。色々悩んだが、少し良いものをということで、HPの上位機種を選択した。スペックは「Core i3-1125G4 8GB 128GB SSD 14インチ フルHD」である。フルHDとあるが、設定から2194×1234まで解像度をあげられる。自動更新スケジュールは2029年6月までであった。

使って1週間ほどだが、総論としてとても気に入っている。思ったより軽く扱いやすいし、何よりフルHD IPSディスプレイがきれいである。WindowsやMACとは異なるOSなのでできることに制限はあるが、家族で利用する分には問題ない。Androidのアプリが使えるのも地味に良い。余談だが、子供の保育園の連絡帳がスマホアプリになり、スマホが苦手な私にとっては、ChromeBookを使ってキーボードで書けるようになりその点も嬉しい。

操作性

HPのChromebookというより、ChromeOSの操作性なのだと思うが、タッチパッドがよくできていて、マウスいらずである。それに加え、本製品はタッチディスプレイなのでマウスの出番はまったくない。この操作性の良さはMACのノートに近い。キーボードもキーピッチが20mm前後なので、特に打ちにくいこともない。

最近Windowsのノートも改善してきているが、タッチパッド絡みで言えば、やはりWindowsを使うならマウスのほうが良いし、それが残念ながら面倒なのだ。

動作

WEBを見る分には申し分ない。1週間でなれてしまったが、買って届いた日は、WEBの表示速度に「おっ」と驚いてしまった。起動は5,6秒ぐらいである。起動が速いので「ノートPC立ち上げるか。。。」のような億劫感は少なく、使いたいときにパッと使えるのが良い。この製品はシェルを開くと起動してくれるので起動ボタンを押す手間もない。ただ、起動時間に関して言えば、最近Windowsも頑張っているので、こちらのほうはよく見るChromeBookの宣伝ほどの驚きはなかった。

妻曰く、かなり良いとのことである。音にこだわりのない私の印象は、外付けスピーカーの音に比べると軽いという印象だったが、10年以上音楽をやっていた妻が言うなら良いのであろう。

映像、ディスプレイ

きれいである。Youtubeで自然ドキュメント系のフルHDの映像を見たが、ずっと見ていられる綺麗さであった。(ちなみに他の解像度の低い手持ちのデバイスではすぐに飽きてしまう映像である。)

また、上でも書いているが、フルHDなのに、設定から2194×1234まで解像度をあげられる。ただ、ここまで解像度を上げると字が小さくなりすぎるので、デフォルトの解像度は1536×864のまま今のところは使っている。

それと、主観ではあるものの、解像度1536×864のまま、YoutubeでフルHDの映像を見たときの映像の細かさはちゃんとフルHDが出ていそうである。あまり映像にこだわりのない私の感想ではあるが、解像度を上げてフルHDを見ても違いが見えないので多分Chrome OSにそういう機能があるのでは、と思っている。調べると以前は設定すればフォントやシェルフ以外の解像度を上げる機能がChromeOSにはあったらしい。今はその設定がなくなっているのでデフォルトになったのかもしれない。

カメラ

一応カメラアプリから自分を映して見てみたが、92万画素なのでそれなりである。WEB会議などで使う分には問題ないだろう。妻曰く、あまり細かく映るとアラが見えるおそれがあるため、少しボケてるぐらいが良いらしい。

電池持ち

ChromeBookの宣伝通り良い。フル充電で充分1日使える。家族がたまに(週に1、2時間ぐらい)使う分なら1ヶ月ぐらい充電無しで使えそうである。USBタイプCで充電可能なのもスマホの充電ケーブルと共用できて良い感じである。

購入の経緯

これまで、家族用のデバイスとして、メモリ2GBのタブレットをメインに、サブで10年前のMAC(Core i7 + SSD)を使っていた。最近タブレットが重くなり、かといってMACをいちいち出すのは億劫で、いろいろ考えた末、最近良く目にするChrombookの購入に至った。ちなみに自分用としてWindowsノートも2台持っているし、仕事柄、会社でもPCを色々購入しており、PCを見る目はなんとなくあるつもりである。

ChromeBookの選定にあたっては、はじめからHP製かFujitsu製のどちらかを購入するつもりであった。Asus製も目に入ってはいたが、これまで2度ほどAsus製品を購入し、どちらもすぐに壊れて印象が悪いので外した。Fujitsuの軽いPCとHPのコスパと迷った末にAmazonでセールとなっていたHP製の購入となった。

カテゴリー
OS 社内SE

さくらVPS 512MBにCode-serverを入れてみた

ここ数年、個人の開発環境はVS CodeでRemote Developmentを使って開発を行っている。これを最近話題のCode-serverでクラウド化すれば、PCを変えるたびに、ローカルにVS Codeをインストールする手間がなくなる。

ただ、開発環境はさくらインターネットのVPSの一番下の512MBプランなのでcode-serverを入れて重くなるのも嫌だな、となかなか手を付けずにいたが、今回試してみた。

OSや入っている主要プログラムは以下である。

Ubuntu 20.04 / Nginx / OpenLiteSpeed / Postfix / MariaDB / PostgreSQL / SSH / Code server (今回追加)

WEB系はNginxで受けて、裏で動いているOLSやCode-serverにproxyしている。

結論から言うと、この環境でもcode-serverはPHP程度の開発では問題ないレベルで動作している。「ローカルより若干遅いかな」、とか、「見た目が少し違うのでやりにくいな」と最初は感じたが、しばらくすると慣れて全く問題なくなった。

メモリはかなりカツカツで、コンパイルが必要な開発は無理そう。

セキュリティはクライアント認証をNginxに設定し、そこからProxyでCode-serverに繋いでいる。Code-server単体ではpassword設定しかできず若干不安があった。

同じくセキュリティ絡みで言えば、code-serverの起動オプションに[–disable-telemetry]を付けて起動している。これを付けないと、code-serverの開発元に諸処の情報が送付される。code-serverのインストール解説サイトで言及されていることがないため、たいした情報が送られているわけでもないかもしれないが念の為。

ちなみに、Code-serverのインストールに際し、HTTPのフロントエンドもApacheからNginxに変更した。理由はどうしても、ApacheのReverseProxyでCode ServerのWebsocketを通せず、やむなくNginxへの変更となった。軽い軽い言われているNginxだが、私の開発環境でProxyオンリーのフロントエンド利用ではApacheより遅く感じた。あくまで体感だが、1コアで最小限のセッティングにした場合、Apacheに分がありそう。

Apache Proxyで通らなかったCode ServerのWebsocketは「ProxyWebsocketFallbackToProxyHttp」(Apache 2.4.47)や、「ProxyWebsocketIdleTimeout」(Apache 2.5)を使えば動いた気がしたが、 Ubuntu 20.04のApacheのバージョンが2.4.41でそこまで試す気もなくあきらめた。

今回個人の開発環境を変更したが、会社の開発環境もCode server化したくなった。ただ、FreeBSD環境があったり、クローズドな社内ネットワーク内にサーバがあったりするので、保留。

カテゴリー
OS 社内SE

OpenLiteSpeedで実行ユーザを変更する

ApacheからOpenLiteSpeedへのサーバ変更で困ったことの一つが、OpenLiteSpeedの実行ユーザを変更することがうまくいかないことであった。OpenLiteSpeedのユーザとグループはApacheと同じもので動かしたい。

設定ファイル”/usr/local/lsws/conf/httpd_config.conf”を見ると、上のほうにuser/groupの設定がある。単純にこの設定を変えてOpenLiteSpeedを再起動すると、一見、正常に動いているように見えるのだが、Admin consoleからServer logやライブフィードが見られないなどPHPでファイルアクセスした際のユーザがらみと思われる異常が散見された。

解決方法は上記のファイルでユーザ、グループを変更後、以下のコマンドでOpenLiteSpeedを再インストールすることであった。

apt -y install --reinstall openlitespeed
# 念のため(不要かも)
rm -rf /tmp/lshttpd
systemctl restart lshttpd

正直、なぜ必要なのかはわからないが、これをやらないとOpenLiteSpeed経由で作成するファイルのユーザ/グループが設定ファイルのユーザ/グループにならない。

当該サーバはubuntuを使用しているため、aptでの再インストールとなっている。試していないが、Debian系特有の現象で、CentosなどのRedhat系ならこういった作業は不要なのかもしれない。

カテゴリー
OS 社内SE

OpenLiteSpeedでphp.ini Overrideが効かない

ApacheからOpenLiteSpeedにサーバを変更したのだがいくつか困ったことがあった。その一つが、OpenLiteSpeedでは”.user.ini”が効かなく、virtualhost毎にPHPの設定を微妙に変更できなくなってしまったことだ。

Admin console画面から設定を見ていると、virtualhostの[general](一般)タブの下に「php.ini Override」という設定があり、PHPの設定の一部上書きが出来ると書いているではないか。これは幸いと設定、console画面から「穏やかな再起動」をしてみたが動かない。

何度も設定をやり直した挙句、弱って直接confファイルを修正して、systemctl restart lshttpd とコマンドラインから再起動したところ、難なく動作した。

その後は、Admin consoleから設定、再起動しても問題なく設定が反映されるようになった。

理由は不明。単に何か間違えていた可能性もあるが、コマンドラインから修正と再起動を行うと動くこともあるという参考までに。

ちなみに行った設定は以下。

phpIniOverride  {
  php_value default_charset "SJIS"
  php_value mbstring.language "neutral"
  php_value mbstring.internal_encoding "SJIS"
  php_value date.timezone "Asia/Tokyo"
  php_value error_reporting E_ERROR
}

1990年代にWindowsで動かしていたコードやDBを引き継ぎ続けているため、こんな設定になっている・・・。

カテゴリー
OS 社内SE

OpenLiteSpeedでのクライアント認証

最近一部のhttpサーバをApacheからOpenLiteSpeedに変更した。ただ、問題があり、Apacheにはあるクライアント認証の機能がOpenLiteSpeedにはない。

さんざん迷った挙句、Apacheでreverse proxyを使用し、そこでクライアント認証することにした。「全部Apacheで良いじゃないか」という感じもするが、どうもApache+mpm_event+php-fmpの構成では、まれにプチフリするのが気になってしょうがない。設定が悪い気がするが、再現性がなく調査もできない。

案ずるより産むがやすし、動かしてみたら、とても軽快になった。reverse proxy分重くなるかと思ったが、杞憂であった。

以下、OpenLiteSpeedのadmin consoleをクライアント認証に設定する例。

前提

クライアント証明書は以下
 ・CA証明書:/opt/myCA/cacert.pem
 ・証明書失効リスト:/opt/myCA/crl.pem
Admin ConsoleはSSLなしで動作させ、localhost(127.0.0.1)以外は接続させない。(Admin ConsoleをSSLありのデフォルトの状態で動作させたい場合は、Apache設定のコメントを参照のほど。reverse proxyでSSLのエラーを無視させればちゃんとつないでくれる。)
以下はOpenLiteSpeedのAdmin configの設定。設定後、restart。

vi /usr/local/lsws/admin/conf/admin_config.conf
---
enableCoreDump            1
sessionTimeout            3600

errorlog $SERVER_ROOT/admin/logs/error.log {
  useServer               0
  logLevel                INFO
  rollingSize             10M
}

accesslog $SERVER_ROOT/admin/logs/access.log {
  useServer               0
  rollingSize             10M
  keepDays                90
}
# 以下のセクションを追加
accessControl  {
  allow                   127.0.0.1
}
# 以下のセクションを変更
listener adminListener {
  # addressとsecureの2行を変更
  address                 127.0.0.1:7080
  secure                  0
  #keyFile                 $SERVER_ROOT/admin/conf/webadmin.key
  #certFile                $SERVER_ROOT/admin/conf/webadmin.crt
  #clientVerify            0
}
---
systemctl restart lsws

Apach設定

Apacheでhttps://yourdomain.net:8000/にアクセスするとOpenLiteSpeedの管理コンソール(http://127.0.0.1:7080/)にアクセスする設定。ブラウザにクライアント認証の証明書が入っていないとはじかれる。SSLはLetsencryptで取得。
mod_proxy mod_proxy_httpはモジュールで入れること。

# Apacheのバーチャルホストの設定に以下を追加
<IfModule mod_ssl.c>
        <VirtualHost _default_:8000>
                ServerName yourdomain.net
                DocumentRoot /var/www/

                ErrorLog ${APACHE_LOG_DIR}/lsws/proxy_error.log
                CustomLog ${APACHE_LOG_DIR}/lsws/proxy_access.log common

                # Proxy設定
                <Proxy *>
                    Order deny,allow
                    Allow from all
                </Proxy>
                ProxyRequests Off
                ProxyPreserveHost On

                ProxyPass / http://127.0.0.1:7080/
                ProxyPassReverse / http://127.0.0.1:7080/

				# AdminConsoleをデフォルトのまま(SSLで)使用するなら以下
				#SSLProxyEngine On
                #SSLProxyCheckPeerCN off
                #SSLProxyCheckPeerName off
                #ProxyPass / https://127.0.0.1:7080/
                #ProxyPassReverse / https://127.0.0.1:7080/


                # クライアント証明書関係
                SSLEngine on
                SSLCACertificateFile /opt/myCA/cacert.pem
                SSLCARevocationFile /opt/myCA/crl.pem
                SSLCARevocationCheck chain
                SSLVerifyClient require
                SSLVerifyDepth 1

                # SSL
                SSLOptions +StdEnvVars
                Include    /etc/letsencrypt/options-ssl-apache.conf
                SSLCertificateFile /etc/letsencrypt/live/yourdomain.net/fullchain.pem
                SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.net/privkey.pem

        </VirtualHost>
</IfModule>

サイトへのアクセスも楽で、パスコンが盗まれたら失効すれば良いし、クライアント認証の良さは他のセキュリティには代えがたい。Google Authenticatorとかで二段階認証やると、アクセスのたびに入力しなきゃいけなくて面倒だし、フィッシングのリスクもあるし。

カテゴリー
プログラム 社内SE

WordPress twenty- twentyのテーブル変更

WordPress twenty-twentyでこのブログを書いているのだが、付属のテーブルを少しだけおしゃれに外枠をなしにすることにした。

テーブルをブロックで作成した際に、[追加CSSクラス]に[is-style-regular my-style-stripes]とすると以下のような外枠なしの表ができる。

人生項目 内容
プログラム 仕事のために仕方なくやっている
家事 家族のために仕方なくやっている
DIY 家族のために仕方なくやっている
囲碁 ここ数年打っていない。打つ相手もいない。。。
サンプル

やり方は[外観]-[テーマエディター]でstyle.cssを選択し以下のCSSを最後に追加する。(もしくは、[外観]-[カスタマイズ]で左側ペインの[追加CSS]に追加。)

.my-style-stripes table{
	border:none;
}
.my-style-stripes table tr{
	border:none;
}
.my-style-stripes table tbody tr:nth-child(odd) {
	background: #dcd7ca;
}
.my-style-stripes table thead th {
	border-top:none;
	border-right: none;
	border-left: 1px solid #6d6d6d;
	border-bottom: 2px solid #6d6d6d;
}
.my-style-stripes table tbody td{
	border-top:none;
	border-right: none;
	border-left: 1px solid  #6d6d6d;
	border-bottom: 1px solid  #6d6d6d;
}
.my-style-stripes table thead th:first-child, .my-style-stripes tbody td:first-child{
	border-left: none;
}
.my-style-stripes tbody tr:last-child td {
	border-bottom: none;
}
カテゴリー
プログラム 社内SE

Roundcubeに任意のユーザ名とパスワードでログインするプラグイン

レガシーな意見を振り切れず、わずか20人の小売りの会社にメールサーバを一から構築した。その際、メールの自動フォルダ振り分けができるようdovecotにsieveを追加し、その操作のため、初めてRoundcube環境も構築したのだが、これがどうして、通常のメーラーとしてもなかなか良い。

ただ、Roundcubeのログインがメールアドレスとパスワードでしかできないのが自分の環境的に使いにくい。出来れば、自分で設定したユーザ名とパスワードでログインしたいため、ファイルに設定したユーザ名とパスワードでログインできるようなプラグインを作成してみた。また、20人分の設定も面倒なので、CSVにした一覧から設定ファイルを生成するツールも作成した。

インストール方法

  1. RoundcubeのPluginsフォルダーにGithubからソースをダウンロードする
  2. Roundcubeのconfigにvirtuserpassを設定

Linuxなら以下のような感じです。

cd (Roundcubeをインストールしたフォルダ)/plugins
git clone https://github.com/y-toy/virtuserpass virtuserpass

vim ../config/config.inc.php
---
# "virtuserpass" を $config['plugins'] に追加
$config['plugins'] =  array('virtuserpass');
# もしくはファイルの一番下に以下を追加
# $config['plugins'][] =  'virtuserpass';

設定

“(Roundcubeをインストールしたフォルダ)/plugins/virtuserpass/config”の下に”config.inc.php”を作成し、以下のような設定をします。

// 主な設定
$config['virtuserpass'] = array(
	'taro'=>array('967Joe123','taro@biggy.co.jp','emailPass1234'),
	'ziro'=>array('pass1234','ziro@biggy.co.jp','emailPass5678'),
	'saburo'=>array('1234test','saburo@biggy.co.jp','emailPass7777'),
);

// オプション
$config['virtuserpass_scramble']=false;
$config['virtuserpass_email_scramble']=false;
$config['virtuserpass_allow_email_login']=true;

上の設定では、”taro”、”ziro”、”saburo”が設定してあり、”taro”さんはアカウント”taro”とパスワード”967Joe123″でログインできます。(対応するメールアドレスとパスワードは’taro@biggy.co.jp’と’emailPass1234’。)

$config[‘virtuserpass’]

ログインするアカウントの設定をします。ログインするユーザ名とパスワード、内部で変換されるメールアドレスとパスワードを設定します。

$config['virtuserpass'] = array(
	'ユーザ名' => array('パスワード', 'メールアドレス', 'メールのパスワード'),
	// いくつでも設定できます。
);

$config[‘virtuserpass_scramble’]

trueを設定するとconfigファイルのユーザのパスワードがMD5でハッシュされているものとして扱います。パスワードが外部に漏れない用のセキュリティ考慮です。後から説明するツール”makeConfigFileFromCSV.php”で設定できます。

$config[‘virtuserpass_email_scramble’]

trueを設定するとconfigファイルのメールパスワードが暗号化されているものとして扱います。ないよりましでしょの気休めセキュリティです。後から説明するツール”makeConfigFileFromCSV.php”で設定します。

$config[‘virtuserpass_allow_email_login’]

falseを設定するとメールアドレスを使ったログインが出来なくなります。

ツール

CSVファイルから一括でユーザをconifgに設定できるようにツールも作っています。

使い方

php ./makeConfigFileFromCSV.php csv-file-path [1|0] [1|0] [1|0]

引数 1 :CSVファイルのパス
引数 2 : 1を設定するとログイン時のパスワードがハッシュされて設定されます。
引数 3 : 1を設定するとメールアドレスのパスワードが暗号化されて設定されます。
引数 4 : 0を設定するとメールアドレスでのログインが出来なくなります。

Configファイル生成の仕方

  1. CSVファイルを作成します。CSVファイルは以下の4列で作成してください。ログインユーザ名,ログインパスワード, メールアドレス, メールアドレスのパスワード。このプラグインのconfigフォルダーの下にsample.csvファイルがありますので参考ください。
  2. 下のような感じでこのツールを実行します。このプラグイン用のconfigファイルが作成されます。
cd (Roundcubeをインストールしたフォルダ)/plugins/virtuserpass
php ./makeConfigFileFromCSV.php 作ったCSVファイルのパス 1 1 1

3. 作成したCSVファイルは念のため削除するか、公開されていないフォルダに移動します。

カテゴリー
プログラム 社内SE

sshのconfigのhostをリスト表示し、そのままssh

sshコマンドを打つときに.configに設定したホスト名を忘れて躓く方のための補助用のスクリプトです。
Windows Powershell版Linux bash版それぞれあります。

使い方

コマンド:sshfc [ホスト名の一部]

sshfcとだけ打つとconfigファイルに設定した全ホスト名が表示されます。
sshfc sysのように第一引数をつけて打つとホスト名にsysを含むSSH先が表示されます。続けて番号選択でそのままSSH接続です。
コマンド名は”ssh from config” の頭をとってsshfcとしています。以下使用例になります。

C:\> sshfc sys
1) system
2) test_system
3) dev_system
SSHするホストの番号を入力してください。[c]を押すとキャンセルされます。: 3
ssh dev_system
hogehoge@192.168.1.100's password:
....

Linux Bash版 インストール方法

以下の要領で、githubからスクリプトをダウンロードしてPATHが通っているフォルダに置いてください

git clone https://github.com/y-toy/linux_sshfc.git
chmod +x ./linux_sshfc/sshfc
# 以下環境に合わせて実行ください。
mv ./linux_sshfc/sshfc /usr/local/bin/

Windows Powershell版 インストール

以下の要領で、”ユーザフォルダ\bin”をPATHに追加して、githubからファイルをダウンロードします。

New-Item ($HOME + "\bin") -ItemType Directory
[System.Environment]::SetEnvironmentVariable("Path", $env:Path + ";%USERPROFILE%\bin", "User")

git clone https://github.com/y-toy/windows_sshfc.git
cd windows_sshfc
Move-Item ./sshfc.ps1 ($HOME + "\bin")

スクリプト自体が実行できない場合は以下コマンドを実行してみてください。スクリプトの実行制限を緩めます。

Set-ExecutionPolicy Unrestricted -scope CurrentUser

上記は確実ですが、上記をやらなくても、githubからダウンロードしたファイルを、空行を入れるなど意味のない編集をメモ帳などでして、BOM付UTF-8で保存すると実行できるようになるはずです。(普通のUTF-8はNGです。メモ帳の[名前を付けて保存]で UTF-8 BOM付きを選択。)

雑記

最近、WindowsのsshクライアントをMicrosoft謹製の「Windows terminal」に変更しました。 「Windows terminal」 自体は秀逸なのですが、以前使用していたsshクライアントと比べ若干使いずらいのが、SSHの接続先の選択方法。なのでツールを作ってカバーした感じです。

作ったツールが思いのほか便利だったので、bash版も作成しサーバに入った後のSSHも同様にできるようにしました。「.configに設定したホスト名なんだっけ?」と考えることが無くなりました。

Powershell のスクリプトを書くのは初めて。こういった作業効率化のちょっとしたコードを書く分には構文に慣れている分、過去のvbscriptで良いかなあという印象です。bashのスクリプトも簡単な数行ものを除けば、めったに書かないのでいつも構文忘れます。

Powershell版は日英つけていますがps1ファイルは配布が難しいので意味ないです。Bash版は面倒なので英語だけです。