2021年10月4日

マウスを分解して掃除してみたよ。

以前、職場でワイヤレスマウスを使っていました。

Microsoft Wireless Mobile Mouse 1000というマウスでとても使いやすかったのですが、いつのころからかホイールの反応がおかしくなってうまくスクロール出来なくなってしまいました。その後そのマウスは使わなくなってしまったのですが、一応捨てずに取っておきました。

それから月日は流れ、新型コロナウイルスの蔓延により自宅でテレワークをするようになりました。

まさか、パンデミックにより家で仕事をする日がやってくるなんて。ほんとに驚きです。おそらく多くの方が同じように驚いたと思います。

2021年5月5日

【Linux】Linux Mint にWindows10のPowerShellでSSH接続する方法



ゴールデンウィークいかがお過ごしでしょうか。
私は特にどこにも行かず自宅に引きこもっています!笑
まあでも、ずっと家にいるのもストレスですね。早く以前のように自由に出歩けるようになってほしいです。

そんななか、自宅でLinuxを使ってサーバーの構築なんかをやってるんですけど、いろいろ調べてるなかでPowerShellをSSHクライアントとして使えることを初めて知りました。
試しにやってみましたので構築手順を備忘録として公開します。

最初にネットワーク構成です。

Linux Mintは余ってるPCにインストールしました。
バージョンは20.1です。
ホスト名はMOUSEMINT。

Windows10は、Pro バージョン20H2です。
ホスト名はMOUSEDAIV4N。

まずLinux側で作業します。


最初にLinuxのアップデートを行います。
$ sudo apt update

次にOpenSSH Serverをインストールします。
$ sudo apt install openssh-server

一応sshdが起動していることを確認します。
$ ps ax | grep sshd
 115240 ?        Ss     0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
 116367 pts/1    S+     0:00 grep --color=auto sshd
大丈夫そうですね。

次にWindows側で作業していきます。


PowerShellを起動したらSSHでログイン出来るか試してみます。
PS C:\Users\hosopro> ssh hosopro@192.168.1.20
The authenticity of host '192.168.1.20 (192.168.1.20)' can't be established.
ECDSA key fingerprint is SHA256:C3Q0M5pSMhjpwkH6+C3UdvEeR5r3gkIrDSVPuRCddiI.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.20' (ECDSA) to the list of known hosts.
hosopro@192.168.1.20's password:
最初に「Are you sure you want to continue connecting (yes/no)?」と聞いてきますので「yes」と入力してEnter。
続いてパスワードを聞いてくるのでLinuxユーザーのパスワードを入力します。

ログイン出来たら一旦ログアウトします。
hosopro@MOUSEMINT:~$ logout
Connection to 192.168.1.20 closed.

再度SSHでアクセス。
PS C:\Users\hosopro> ssh hosopro@192.168.1.20
hosopro@192.168.1.20's password:
Last login: Sun May  2 18:15:50 2021 from 192.168.1.10
2回目からはパスワードだけでログインできます。

ここでホームディレクトリにworkフォルダを作成しておきます。
hosopro@MOUSEMINT:~$ mkdir work
このフォルダはあとで公開鍵を転送するときに使います。
フォルダの作成が出来たら一旦ログアウトします。

ログアウト出来たらホームディレクトリを確認してみます。
「.ssh」フォルダが出来ているのが確認できます。


次に秘密鍵と公開鍵の生成を行います。
PS C:\Users\hosopro> cd .ssh
PS C:\Users\hosopro\.ssh> ssh-keygen

ssh-keygenを実行すると、初めに「Enter file in which to save the key (C:\Users\hosopro/.ssh/id_rsa):」と表示されるのでEnterを押します。

次にパスフレーズをを聞いてきますので入力します。
このパスフレーズは公開鍵認証でSSH接続するときに使います。

パスフレーズは無しでもいいらしいのですが、安全上やはりあったほうがいいので設定します。 ちなみに10文字以上が推奨されています。

また通常のパスワードと違ってスペースも含めることができますので、自分が好きな歌詞の一節をフレーズとして使うなんてもいいんじゃないでしょうか。


.sshフォルダを見るとこのようにファイルが作成されているのが確認できます。


次に作成した公開鍵をLinux側に転送します。
保存先は先ほど作成した「work」フォルダです。
PS C:\Users\hosopro\.ssh> scp .\id_rsa.pub hosopro@192.168.1.20:/home/hosopro/work
hosopro@192.168.1.20's password:
id_rsa.pub                                                     100%  402    97.0KB/s   00:00

転送出来たらSSHでLinuxに接続します。
PS C:\Users\hosopro\.ssh> ssh hosopro@192.168.1.20
hosopro@192.168.1.20's password:
Last login: Sun May  2 18:39:36 2021 from 192.168.1.10

ログイン出来たらホームディレクトリに「.ssh」フォルダを作成します。
hosopro@MOUSEMINT:~$ mkdir .ssh

次にパーミッションを変更します。
hosopro@MOUSEMINT:~$ chmod 700 .ssh



次にworkフォルダに転送された公開鍵ファイルを.sshフォルダに移動します。
hosopro@MOUSEMINT:~$ mv ./work/id_rsa.pub ./.ssh/
hosopro@MOUSEMINT:~$ cd .ssh
hosopro@MOUSEMINT:~/.ssh$ ls -la
合計 12
drwx------  2 hosopro hosopro 4096  5月  2 18:56 .
drwxr-xr-x 23 hosopro hosopro 4096  5月  2 18:51 ..
-rw-rw-r--  1 hosopro hosopro  402  5月  2 18:45 id_rsa.pub

次に移動した公開鍵ファイルのファイル名を変更します。
hosopro@MOUSEMINT:~/.ssh$ mv id_rsa.pub authorized_keys
hosopro@MOUSEMINT:~/.ssh$ ls -la
合計 12
drwx------  2 hosopro hosopro 4096  5月  2 18:58 .
drwxr-xr-x 23 hosopro hosopro 4096  5月  2 18:51 ..
-rw-rw-r--  1 hosopro hosopro  402  5月  2 18:45 authorized_keys

次にauthorized_keysファイルのパーミッションを600に変更します。
hosopro@MOUSEMINT:~/.ssh$ chmod 600 authorized_keys
hosopro@MOUSEMINT:~/.ssh$ ls -la
合計 12
drwx------  2 hosopro hosopro 4096  5月  2 18:58 .
drwxr-xr-x 23 hosopro hosopro 4096  5月  2 18:51 ..
-rw-------  1 hosopro hosopro  402  5月  2 18:45 authorized_keys

ここまで出来たら一旦ログアウトします。
hosopro@MOUSEMINT:~/.ssh$ logout
Connection to 192.168.1.20 closed.


再度SSH接続してみます。
PS C:\Users\hosopro\.ssh> ssh hosopro@192.168.1.20
Enter passphrase for key 'C:\Users\hosopro/.ssh/id_rsa':←秘密鍵のパスフレーズを入力
Last login: Sun May  2 18:47:14 2021 from 192.168.1.10
今度はパスワードでなくパスフレーズを聞いてきました。
うまくいってるようです。
鍵を生成するときに設定したパスフレーズを入力してログインします。
これで公開鍵認証でSSH接続できるようになりました。


公開鍵認証での接続が可能になったので、これまで使用してたパスワード認証は禁止にしたいと思います。

/etc/ssh/sshd_configをviなどで開きます。
PasswordAuthenticationを探し、設定がデフォルトで「yes」になっているのでコメントを外して「no」に書き換えます。
#PasswordAuthentication yes

PasswordAuthentication no

書き換えたら保存し、sshdを再起動します。
$ sudo /etc/init.d/ssh restart

これで鍵を持ってないと弾かれるようになります。
PS C:\> ssh hosopro@mousemint
hosopro@mousemint: Permission denied (publickey).


WindowsからSSH接続するとなると昔はTeraTermやPuTTYを使うのが定番でしたが、デフォルトでPowerShellから接続が出来るのはありがたいですね。これから使っていきたいと思います。



2021年4月29日

【PowerShell】WORDのdocファイルをdocxに変換するスクリプト


最近仕事で、昔作られたWordの仕様書を見る機会があったのですが、ファイル形式が古くて「doc」形式だったんです。 docでも見るぶんにはなんら問題はないのですが、今後のことを考えて一つ一つ開いて「docx」形式で保存するということやっていたんです。

しかし、ファイル数が多いんです。100近くもあるんです。

それでまた思ったんですよ、「めんどくせぇー!」って。笑

というわけで「doc」形式のファイルを「docx」形式に変換するスクリプトを作りました。
###############################################################################
# docファイルをdocxに変換するスクリプト
###############################################################################

$targetPath = "C:\work"

#docファイルを取得
$files = Get-ChildItem -Path $targetPath | ? { $_.Extension -like "*.doc" }

#文書の保存形式(DOCX形式)
$wdFormatDocumentDefault = 16

foreach ($f in $files)
{
    Write-Host $f
    
    #Wordオブジェクトを生成
    $word = New-Object -ComObject Word.Application

    #ファイルをオープン
    $doc = $word.Documents.Open($f.FullName)
    
    #保存ファイル名(拡張子を変更)
    $outputfile = $f.FullName.Replace("doc", "docx")
    Write-Host $outputfile
    
    #保存
    $doc.SaveAs2([ref]$outputfile, [ref]$wdFormatDocumentDefault)
    
    #閉じる
    $doc.Close()
    
    #終了
    $word.Quit()
}

Write-Host "処理が完了しました。"
少し解説すると、最初の$targetPathはターゲットとなるフォルダを指定します。このフォルダ内にあるdocファイルを全て取得して順番に一つ一つ変換していきます。

やってることは単純なのでコードを見ていただければ分かると思いますが、ポイントは保存ファイル名と保存時のSaveAs2のパラメータです。

最初、保存ファイル名はただの文字列で指定していたのですが、保存時にエラーになってしまいうまくいかなかったのでこのようなやり方になりました。おそらくオブジェクト型でないとダメなのだと思います。

次にSaveAs2のパラメータですが、こちらは頭に[ref]を付ける必要があります。最初これに気付かずに非常に苦労しました。 なぜ参照渡しにしなければいけないのかよく分かりませんが、メソッドがそのように定義されているからなんでしょう。

<参考>
http://mtgpowershell.blogspot.com/2010/10/wordhtml.html
https://docs.microsoft.com/ja-jp/office/vba/api/word.wdsaveformat


2021年4月25日

ARCHISS ProgresTouch RETRO TKL(茶軸)を買ってしまいました。

最近、久し振りにキーボードを新調しました。

買ったのは、ARCHISS ProgresTouch RETRO TKL(茶軸)

はじめてのメカニカルキーボードです。
フルキーボードと迷いましたが、コンパクトなテンキーレスにしました。


外箱はこんな感じになってます。


箱を開けるとマニュアルが入っていました。


日本語配列91キーです。
キーにはカナ印字はありません。
まあ、ローマ字入力してるんで無くても困らないですね。


さっそくPCに繋いでみました。
ちなみに有線です。
テンキーが無いのでコンパクトですね。
幅は約36cmです。


裏側はこんな感じです。
USBのコードは左右、中央、3か所から出せるようになってます。


あと、めちゃくちゃ重いです。
量ったら1kg近くもありました。
作りもかなり頑丈に作られてる感じがするんで、ハードパンチャーが使っても壊れなさそうです。笑


横からだとこんな感じですね。
奥行きは約14cm。


あと、結構高さがあるので慣れないと打ちにくいですね。
リストレストがあったほうがあったほうがいいかもしれません。


キーボード奥側
足を折りたたんだ状態。


足を立てた状態。
キーの上部まで5cm以上あります。


DIPスイッチ
このスイッチで特定のキーの配置を交換したり、無効にすることができます。

打鍵感ですが、今まで使ってたパタングラフ式と比べると全然違います。
標準的な打鍵感とされる茶軸を選んだのですが、それでもキーを押すときのストーロークが深いので力が必要だなと感じます。 ただ、このあたりの感覚は使っていくうちに慣れていくと思うので問題ないと思います。

あと、音は大きいなと感じました。筐体の剛性がしっかりしてるので、その分音が響く感じがします。 なのでこれ、会社では使えないですね。
隣の人に「うるせぇ!静かにしろー!」と怒鳴られると思います。笑

あと、今回キーを打ってるところを動画に撮ってみました。
参考になるか分かりませんが、よかったら見ていただければと思います。



2021年4月18日

【PowerShell】複数のWordファイルの文字列を一括置換するスクリプト


最近、仕事で複数のWordファイルを編集する作業がありまして、ある文字列を別の文字列に置換するというものだったのですが、ファイル数が結構あり、こういうのって自動でやらせたいなと思ってスクリプトを作ってみました。

ネットで探すとVBAを使ったやり方は結構たくさん見つかるんですが、PowerShellを使ったやり方はなかなか見つからないんですよね。
それで作るのに苦労したのですが、VBAのやり方を参考にいろいろ試しながらなんとか出来上がりました。
###############################################################################
# 複数のWordファイルの文字列を一括置換するスクリプト
###############################################################################

#Wordファイルが格納されているフォルダ
$targetPath = "C:\work"

#WdFindWrap定数
$wdFindContinue = 1 #検索範囲の先頭または末尾まで検索しさらに検索を続ける

#WdReplace定数 
$wdReplaceAll = 2 #すべて置換する

#パラメーター
$findText = "東京都"        #検索する文字列
$matchCase = $false         #大文字小文字の区別する
$matchWholeWord = $true     #完全に一致する単語だけを検索する
$matchWildcards = $false    #ワイルドカードを使用する
$matchSoundsLike = $false   #あいまい検索
$matchAllWordForms = $false #すべての単語の活用形を検索する
$forward = $true            #検索方向(Trueで末尾へ)
$wrap = $wdFindContinue     #検索が文書の末尾に達した場合にどうするか(WdFindWrap定数)
$format = $false            #書式を検索する場合
$replaceWith = "神奈川県"   #置換文字列
$replace = $wdReplaceAll    #置換する文字列の個数(Wdreplace 定数)
$matchKashida = $false      #アラビア語のドキュメントでの kashida のテキストを区別
$matchdiacritics = $false   #右から左への言語の文書内には、発音区別符号が一致するテキストを区別
$matchalefhamza = $false    #アラビア語ドキュメント内の alef hamza が一致するテキストを区別
$matchControl = $false      #右から左への言語の文書で双方向制御文字が一致するテキストを区別

#Wordファイルを取得
$files = Get-ChildItem -Path $targetPath -Filter *.docx 

foreach ($f in $files)
{
    Write-Host $f

    $word = New-Object -ComObject Word.Application
    $word.Visible = $false
    
    $doc = $word.Documents.Open($f.FullName)

    #置換
    $word.Selection.Find.Execute($findText, `
                                 $matchCase, `
                                 $matchWholeWord, `
                                 $matchWildcards, `
                                 $matchSoundsLike, `
                                 $matchAllWordForms, `
                                 $forward, `
                                 $wrap, `
                                 $format, `
                                 $replaceWith, `
                                 $replace, `
                                 $matchKashida, `
                                 $matchdiacritics, `
                                 $matchalefhamza, `
                                 $matchControl) 

    #保存
    $doc.Save()

    #閉じる
    $doc.Close()

    #終了
    $word.Quit()
}

少し解説すると、$targetPathはWordファイルが格納されているフォルダです。このフォルダ内にある全てのWordファイルの文字列を置換します。

次にFind.Executeメソッドで指定するパラメーターを設定しています。通常、VBAで実行するときは必要なパラメーターだけ指定すればいいのですが、PowerShellの場合すべて指定しないといけません。最初このパラメーターの指定方法がよく分からなくて苦労しました。

$findTextに検索する文字列、$replaceWithに置換後の文字列を指定します。この例では、「東京都」を「神奈川県」に置換しています。
$wdFindContinueはWdFindWrap定数を指定します。今回はwdFindContinue(値:1)を指定して末尾まで検索してもさらに検索するようにしています。
$replaceはWdReplace定数を指定します。今回はwdReplaceAll(値:2)を指定して全て置換するようにしています。

あとは、foreachで見つかったWordファイルに対して同じ処理をくり返しています。


<参考>
http://mtgpowershell.blogspot.com/2010/11/word_12.html
https://touch-sp.hatenablog.com/entry/2017/04/11/185127
https://tonari-it.com/word-vba-replace-replacement/
Find.Execute メソッド | Microsoftドキュメント
WdFindWrap 列挙型 | Microsoftドキュメント
WdFindWrap 列挙型 | Microsoftドキュメント


2021年2月8日

【DIY】モニター台を作ってみた。

昨年、テレワーク用の机を作ったのですが、今回、机の上に置くモニター台を作ってみました。


まずは、出来上がりのイメージです。

モニター1台分の台です。
幅は600mm。奥行は1x10の幅分の235mmです。
下にはキーボードが収まるようにし、中間にはノートPCを収納するイメージです。

これを2台分作成します。




ちなみにこのモニター台の設計図はGitHubに上げてますので、気になる方はダウンロードしてみてください。



それでは材料です。

天板は1x10(19mmx235mm)で600mmの長さにカットしたものを2本。
足の部分も同じく1x10で120mmの長さにカットして、これは4本。
あとは、中間の棚板1x4を長さ562mmでカットして4本。
すべてホームセンターで切ってもらいました。


最初にやすり掛けをします。
このやすり掛けは結構面倒なのですが、これを丁寧にやるかやらないかで出来上がりに差が出てきます。


やすり掛けが終わったら、塗装します。
机に合わせて天板はブライワックス(ジャコビアン)。
足と棚板はつや消しブラックに塗装しました。


そして組み立てです。
ボンドとコーススレッドで留めてます。
ちょっと板の反りとかがあって、棚板がうまく収まらなかったりして苦労しましたが、なんとか出来上がりました。


机に乗せるとこんな感じです。
うーん、いいんじゃないでしょうか。
だいたい予想通りの出来です。


机とマッチしてますね。


キーボードとノートPCも収まってます。