C# 文字化け問題解決

C#でGitのDiffコマンドを起動して受け取った結果を処理しとうと思い、ずっと後回しにしてた文字化け問題がやっと解決しました。

C#ではProcessクラスで外部コマンドを実行し、標準出力から結果を受け取ります。ここで受け取るときに文字化けを起こしていました。文字列を受け取った後に、文字列をエンコードしても、微妙に文字化けがのこってしまいうまくいきませんでした。

原因

Processクラスで結果を受け取るには、StandartOutputプロパティを参照しますが、StandartOutputはReadStreamオブジェクトであり、Net Fremeworkでは既定のエンコードであるShift-JISとなります。一方Git Diffの出力はUTF-8なので、Shift-JISでUTF-8を読みに行くので文字化けとなってしまいました。

解決法

ProcessオブジェクトにはStartInfoクラスがあります。ここにエンコードを指定するプロパティがあり、UTF-8に設定します。

 Process.StartInfo.StandardOutputEncoding = Encoding.UTF8;

コードサンプル

Process process = new Process(); 
// コマンド名 
process.StartInfo.FileName = command; 
// 引数 
process.StartInfo.Arguments = argument; 
// StandardOutputで結果を受け取るために必要な設定 
process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardOutput = true; 
// StandardOutputのエンコード設定 
process.StartInfo.StandardOutputEncoding = Encoding.UTF8; 
// 実行 
process.Start(); 
//プログラムが実行完了するまで待つ 
process.WaitForExit(); 
//結果格納 
var str = process.StandardOutput.ReadToEnd(); 
//プロセス終了 
process.Close();

参照

ProcessStartInfo.StandardOutputEncoding プロパティ

エクスプローラーから直接カレントフォルダ指定でVSCodeを開く

Windowsでちょっとしたプログラミングをするときに、Visual Studio Codeを使うのですが、エクスプローラーで開いているフォルダを指定して Visual Studio Code を開く方法です。

やり方1 コマンドプロンプトを開く

やり方は次の通り

  1. エクスプローラーでフォルダを開く
  2. アドレスバーに[ cmd ]と入力する
  3. コマンドプロンプトに[ code . ]と入力する

ちなみに .(ドット)は現在のフォルダの意味です。

開き方1

やり方2 直接表示

次はエクスプローラから直接VSCodeを開くコードです。[ cmd ] の後ろに[ /k ]か[ /c ]のオプションをつけるとコマンドを指定することができます。

オプションの [ /k ]はVSCodeを閉じたあともコマンドプロンプトが開いたままに、[ /c ]は VSCode閉じるときにコマンドプロンプトもいっしょに閉じます。

開き方2

Ryzen自作PC Windows11インストールで苦労した話

だいぶ久しぶりに自作パソコンを制作しました。意外と苦労した点を書きます。

主な部品は次の通り

  • CPU ・・・AMD Ryzen 7 5800X
  • マザーボード ・・・ASRock アスロック B550 Steel Legend
  • GPU・・・ASUS TUF-GTX1660S-6G-GAMING
  • ファン・・・虎徹 MarkII Rev.B SCKTT-2100
  • メモリ・・・32GB
  • SSD・・・500GB
  • ハードディスク・・・8TB

ちなみに今回選んだCPUはGPUもファンもついてないので、別途購入する必要があります。

メモリサイズを間違えた

メモリの種類がDDR4ということはわかってましたが、大きさまで気にしておらず間違えてノートPC用を買ってしまいました。組み立てる段階で間違えに気づき、慌ててAmazonで注文しました。

間違えたやつは260pin

260pin

正解は288pin

288pin

画面に全く映らない

組み立てが終わり、電源を立ち上げたら、画面が真っ黒のままで何も映りませんでした。マザーボードのコードには0dと表示。ホームページで調べてもあまりはっきりしたことが書いてなくてわかりませんでした。いろいろ試した結果。メモリがちゃんとささってないことが原因でした。

Windows11がインストールできない

Windows11をインストール開始すると、シリアル番号を入力した後にハードウェアが対応していないという警告がでてインストールできませんでした。UEFIのセキュアブートを有効にすることで解決しました。

そのままではセキュアブートを変更することができませんでした。起動タブでCSMを無効にし再起動してようやくセキュアブートを有効にすることができました。

  1. CSMをOFFする
  2. 再起動
  3. セキュアブートを有効
CSM無効
セキュアブート有効

WordPressブログのインポートで苦労した話

経緯

今日ブログのレイアウトを大幅に変更した。変更するに当たりいきなりネット上で変更するのは怖かったので一旦ローカル環境にうつしてからアップロードする作戦にしたら、Wordpressのインポートでいきなり苦労したので内容を報告します。

以前ローカルに”local”で環境を作り、All-in-One WP Migrationを使用して、バックアップしPHPのバージョンアップしたことがあった。その時はインポート容量に制限があることがわからなかったが、今回改めてやってみると300MBの制限があった。

容量の上げ方はこのサイトに書いてあった。

how-to-increase-maximum-upload-file-size-in-wordpress/

方法は以下の2つ

① Edit .htaccess file

php_value upload_max_filesize 128M
php_value post_max_size 128M
php_value memory_limit 256M
php_value max_execution_time 300
php_value max_input_time 300

② Edit wp-config.php file

@ini_set( 'upload_max_filesize' , '128M' );
@ini_set( 'post_max_size', '128M');
@ini_set( 'memory_limit', '256M' );
@ini_set( 'max_execution_time', '300' );
@ini_set( 'max_input_time', '300' );

local だとどちらの方法もダメだった。①の場合、エラーでサイトが開かなくなる。②の場合、変化なし。
直接php.iniを書き換えてもダメ。

結局localでやるのは諦めた。localはWordpressの環境を作るのが簡単なので気に入ってたのに。

対応策

MAMPでWordpressの環境を作った。MAMPの場合、アップロードの初期値は8MB。①の方法で変更できた。

.htaccess

# BEGIN WordPress
# "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /wp/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wp/index.php [L]
</IfModule>

# END WordPress

# ここから下を追加
php_value upload_max_filesize 1000M
php_value post_max_size 1000M
php_value memory_limit 1000M
php_value max_execution_time 300
php_value max_input_time 300

②の方法は変化なかった。

参考

WordPressのバックアップの仕方とローカルサイトでの試し方などは、このサイトが非常に良かったので紹介しておく。


WordPressのPHPを安全にバージョンアップする方法
WordPressのバックアップをかんたん確実に取る方法【初心者向け】
WordPressをローカル環境(パソコン)にインストールする方法

サイコロを転がす問題

Aize On Judgeの問題解きは結構続いています。もう少しでIntroduction To Programming Iが完了しそうです。今回はサイコロの問題。今まではサイコロを決まったとおりに転がしたときの目のを求める問題で迷いました。

問題は下記のリンクにあります。
Aizu Online Judge Dice I

サイコロの6面にそれぞれ数字が割り当てられて、N,S,W,E(東西南北)にサイコロを回転させたときに上に来る数値を回答するような内容です。しかも今後のためにクラスや構造体で作成しておくとのこと。

実際にサイコロを作成して、N,S,W,Eへそれぞれ回転させたときに、どこに移動するか確認し、配列を受け渡すプログラムを作成しました。

こんな感じで、S,W,Eの場合も考えると。

コードは以下のようになりました。

#include <iostream>
#include <string>
#include <array>
using namespace std;

struct Dice
{
    array<int, 6> roll;
    void toNorth()
    {
        array<int, 6> t = roll;
        roll[4] = t[0];
        roll[0] = t[1];
        roll[5] = t[4];
        roll[1] = t[5];
    }
    void toSouth()
    {
        array<int, 6> t = roll;
        roll[1] = t[0];
        roll[5] = t[1];
        roll[0] = t[4];
        roll[4] = t[5];
    }
    void toWest()
    {
        array<int, 6> t = roll;
        roll[3] = t[0];
        roll[0] = t[2];
        roll[5] = t[3];
        roll[2] = t[5];
    }
    void toEast()
    {
        array<int, 6> t = roll;
        roll[2] = t[0];
        roll[5] = t[2];
        roll[0] = t[3];
        roll[3] = t[5];
    }
};

int main()
{
    int num;
    string commands;
    Dice dice;
    for (int i=0; i<6; i++) {
        cin >> dice.roll[i];
    }
    cin >> commands;
    size_t size = commands.size();
    for (size_t i=0; i<=size; i++ ) {
        if (commands[i]=='N')
            dice.toNorth();
        else if (commands[i]=='S')
            dice.toSouth();
        else if (commands[i]=='E')
            dice.toEast();
        else if (commands[i]=='W')
            dice.toWest();
    }
    cout << dice.roll[0] << endl;
    
    return 0;
}

http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=3407308#1

mac OS mojave で前と変わったこと

telnetができない

あまりよく使うコマンドでは無いから気がつくまで時間がかかったが、telnetができなくなっていた 。telnetはTCPポートが開いているかどうかの確認の時によく使う。使い方としては次のような感じ。
$ telnet 192.168.0.2 80
いつからだろう。思い当たるのはOSをアップデートした頃ぐらいかな。inetutilsをインストールして解決できた。
brew install inetutils

pingができない

そしていつの間にかpingもできなくなった。

ping 192.168.20.2
ping: Lacking privilege for raw socket.

whichで調べてみると、下記のファイルになってた。
$ which ping
/usr/local/opt/inetutils/libexec/gnubin/ping

inetutilsをインストールしてからか?
解決策として管理者としてやるか、別のpingプログラムを使うか。
$ sudo ping 192.168.0.2
$ /sbin/ping 192.168.0.2

どちらでもそんなに手間ではない。

コンピュータ名でping

pingで思い出したが、windowsのpingは ping <コンピュータ名>のようにコンピュータ名を打って、pingができる。macはWindowsみたくコンピュータ名でpingは打てないようだ。同じようにできないかと調べたが見つからなかった。しかし、一つだけ名前からip アドレスを調べるコマンドは分かった。sumutilだ。使い方はこう。
$ smbutil lookup <PC name>

TP-Link スマートコンセントHS-105をAPIから操作(3)

昨日の続きでPython3で通信できるようにやってみた。まだPython2系が無くなったわけではないし、緊急性はなかったが、動作しないのを見たらどうしても直してみたくなった。ちなみにPythonバージョンは3.6.4。

実行してまず、実行エラーで引っかかったのはprint関数。
Python2 ・・・ print ‘文字列’
Python3 ・・・  print(‘文字列’)
これはすぐに分かった。
もう一つ大きなものは、文字列とバイト列の関係だ。変わったのはわかってたので、単純にbytes関数で変換したら、エラーは消えたが全く返答が帰ってこない。

わけが分からずに使っていたが、bytes()関数は大きさを指定してbytesオブジェクトを作る関数だったようだ。

bytes(10)
b’\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00’

Python3は文字列はデフォルトでUnicodeになって、その代りbytes型ができた。
下記のような感じである

PYTHON3PYTHON2
byte列bytes (b”)str (”)
通常の文字列str (”)str (”)

要するに文字列をbyte列に直せば良い。
変更箇所は下記の通り
まずは暗号化関数

整数をからbyte列に変換するにはto_bytes()関数を使用する。動作は下記の通り。

i=ord(‘a’)
i.to_bytes(1,’big’)
b’a’

Python3.2から使用可能。標準関数なのでimportする必要はない。
これがわかるまで結構時間がかかってしまった。
次に復号化

受信する時に、byte列で入ってくるので、Python2のようにord() 関数で整数に戻す必要がないので、記入としては減る方向になった。

無事にPython2のファイルと同じことができた。

Adobe Acrobat Reader DC のものさし機能が便利

仕事では電気設計の仕事をしていて、設備のハード図を書いて、モータケーブルの長さを決めて手配することもしている。装置内のケーブルの長さはメカ設計に相談し、メカ設計がCADでケーブルをはわす経路の長さを測って教えてもらうのだが、メカ設計が忙しいときはなかなか聞きにくい。PDFベースの図面はもらっていてこれで何かできないかと探していたら、なんとPDFを見るのに使っているAdobe Acrobat Reader DCにものさしがあることが分かった。

使い方は簡単。ツールタブからものさしをクリックするとツールバーが表示されるのでものさしを選択するだけ。寸法線のところで計ってみると長さが全然違って表示された。縮尺が全然合ってないようだ。

そんな時は縮尺を合わせることもできる。測定タイプのツールバー以外のところで右クリックし、「測定比率と精度を変更」をクリックする。寸法測定中でも、右クリックをすれば3段目に表示される。ものさしツールを選択してないと表示しないので注意していただきたい。

右クリックメニューに「測定比率と精度の変更」がある

測定比率は電卓を使って計算する。図面上の表示寸法が300mmで、ものさしでの測定寸法が59.99mmなので単純に割り算をすればよい。300 ÷ 59.99 ≒ 5 。なので5と言う数値を入力する。入力欄がグレー色になっているので分かりにくいが入力することができる。計算結果が小数点の場合は小数点第5位まで入力できるので入力した方がよい。あまり小数点第1位ぐらいで四捨五入すると、正確な数値にならない。また、精度は1に設定。ここで細かく小数点まで表示してしまうと、切りのいい数字で表示されずに見ずらい。

測定比率と精度を変更ウィンドウ

実際に測定して確かめてみると正確に寸法が表示される。

測定結果

円も測定することが出来る。

ただ測るだけではなく、ファイルを保存すれば寸法線をそのまま保存することもできる。このやり方を見つけてからは、メカ設計の手を止めることもなくじっくりと測ることが出来るようになった。

XCYベアボーンキットにWindows10インストール(2)

Windows10を諦められない

DebianでやっていたがWindows10が諦められない。できないままで終わるのは嫌だ。それにWindowsのデスクトップアプリを試す環境がどうしても欲しい。前回は起動ディスクをUSBメモリーで作ったが、DVDにしてみてはどうか。イメージファイルをDVDに焼いてインストールすることにした。

イメージDVDを作成

MACでイメージファイルを焼くのはすごく簡単。外付けのDVDドライブを取り付けて、新しいDVD-Rをセットし、Finderでイメージファイルを右クリックして「ディスクイメージファイルを・・・.iso をディスクに書き込む」だけ。書き込みにかかる時間はUSBメモリーに作成するよりずっと早い。

XCYベアボーンへインストール

外付けDVDドライブを取り外し、そのままXCYベアボーンへ取り付け、F11を押しながら起動し、起動後、何かキーを押せばインストールが開始する。後はウィザードに従うだけ。思ったより簡単にできた。

Wi-Fiは問題なし

Debian 9で苦労したWi-Fiの設定はWindows10では全く苦労せずに設定できた。さすがWindowsだ。

画面が真っ暗に

しかし問題が起きた、一度シャットダウンして再び電源を入れたら、ログイン画面は表示するが、ログイン後に画面が真っ暗でマウスポインタだけ映るようになった。Ctrl+Shift+Delete メニューは問題なく表示する。調べてみるとグラフィックでエラーが出ているとのことだった。コントロールパネルのデバイス設定を見るとエラーになっていた。そのままドライバーを更新たところ解消した。次からはシャットダウンして立ち上げても全然問題なかった。

Macからリモートディスクトップ

Macからリモートデスクトップで接続して作業したかったので、Windows 以前使用したことがある、Remote Disktop Ver8で接続することを確認。しかし画像ファイルのコピペができないから使い勝手が悪いと思った。調べるとVer10では出来るらしい。早速ダウンロードして接続しようとしたが、ログインするところで接続できなかった。いろいろ調べて試してみた。結果的に言えば通常しているログインIDではなく、Windows ID でログインすることが出来た。 画像のコピペができることも確認した。