単身者が長期間テレワークを生き抜くために【引っ越し編】

久々のブログ更新です。休日やることもないので、たまにはということで。


コロナ禍の影響でテレワークを推進する会社も多いですが、
例にもれず私が勤めている会社でも、ここ2年くらいテレワークが続いています。

テレワークは、出勤をしなくても良い、という関東圏内では特に強いメリットが有りつつも、特に単身者は喋る機会が激減することによって、主にメンタル面でしんどくなることが多いです。

この記事では、単身者である私が病まずにテレワークを継続するために8月ごろ引っ越したぜ、って話を書きます。似たような方で参考になれば幸いです。

続きを読む

Google Home と SwitchBot ハブミニで手軽にIoT環境を作る

Google Homeの未使用品が投げ売りされていたので、衝動買いをしてしまいました。

せっかくなのでということで、Google Homeを利用して簡単な おうちIoT環境 を作ってみました。作るときのノウハウを書いてみたので、よければ参考にしてください。

続きを読む

Windows10環境下のHP-A4のドライバ不具合をどうにかする

IMG_0464.JPG

HP-A4について

ミドルレンジのUSB-DACです。初ボーナスかなんかのときに買いました。
USB-DACというのは、アンプと言われるPC周辺機器の一つで、通常デジタル信号として流れる音楽をアナログにすることで音が良くなる機器らしいです。

確かに、きちんとセットアップしてあげてハイレゾ音源を聞くと心持ち、いい音のような気がします。2万弱払っているのでそうでないと困ります。

公式のASIOドライバがすごく調子が悪い

さて、Windowsで96kHz以上の音楽を楽しむためにはASIOやWASAPIと呼ばれる特殊なプロトコルを利用する必要があります。HP-A4はASIOに対応しているので、公式のドライバを利用するとASIOでの再生ができるのですが、このドライバが非常に不安定です。

結論から言うと、公式ドライバをアンインストールし、MSのドライバを利用すると治ります。ただし、ASIOではなくWASAPIを利用することになります。

症状

DirectSoundを利用して動画などを見たあとに、Foobar2000などでASIO再生をしようとすると、以下のエラーが出て再生ができなくなることが頻発します。

Unrecoverable playback error: Could not create ASIO buffers

一度こうなると、サウンド周りをいじりまくるか、PCを再起動をしないとASIO再生ができません。
再現性がないため、どうにも困っておりました。

原因

Windows Creators Update(1703)で導入されたUSB Audio Class 2.0というものが原因のようです。
USB Audio Class 2.0というのはざっくりいうと、96kHz以上の音源をWindowsで真面目に再生するための新しい音楽再生のための規格らしいです。

1703のアップデート以降、この規格に対応するデバイスを接続すると、この規格用のドライバ(usbaudio2.sys)を勝手にインストールするらしいです。おそらく、これと公式ドライバが干渉して上記の症状が起こっているようです。

公式HPにもその旨が書かれているので、原因はおそらく間違いなさそうです。

対策

以下のブログ記事を見つけて、なるほどと思って実施してみた対策です。

すなわち、Fostexドライバをアンインストールして、usbaudio2.sysをインストールします。

方法は単純で、[サウンド]->再生タブ->[スピーカー(FOSTEX HP-A4)]で右クリック->プロパティ->[プロパティ]->[設定の変更]->ドライバータブ->[デバイスのアンインストール] でアンインストール後、PCを再起動します。この間デバイスは挿しっぱなしでOKです。
あるいは、デバイスマネージャからデバイスのアンイストールでもOKです。
また、念の為、公式のFostexのソフトウェアも削除しておいたほうが良いかもしれません。

PC再起動後、しばらくすると、usbaudio2.sysを含んだHP-A4用のドライバがインストールされます。
[ドライバーの詳細]で以下のような構成になっていればOKです。
無題

あとは、WASAPI対応プレーヤで音楽を再生できることを確認してください。
ASIOは再生ができなくなっていると思われます。筆者はMusicBeeで確認済みです。

また、何故かデフォルトの設定が16bit 44.1kHzになっていることがあるのでその場合は修正してください。

果たして

これで対策はできたつもりですが、また同じようなエラーが出るかもしれません。。。
とりあえずは、これで1週間位様子見したいと思います( ´ー`)y-~~

PHPで$_GETがIEでのみ文字化けしてしまう問題

おはようございます、レモンです。

アルバイトでWebアプリケーションを作っていて、
PHPでREST APIをさくっと書いているのですが、IEでだけ文字化けして返ってきてるようでした。

環境はPHP5系で、ググってみたらよくあるバグのようで対処法をいくつか試してみたけどなんかうまく行かなくてぐぬぬって感じだったのでφ(..)メモメモ。
一応$_GETで取ったヤツを変数に突っ込んでJSONに変更してる感じです。

うまくいった対処法

IEだけ文字化けして戻ってくるのならば、文字化けしている文字コードを判定して、
その時だけUTF-8にしてしまえばいいという発想。
…普通だな!

$word = $_GET["word"];
$encoding = mb_detect_encoding($word, "utf8, JIS, eucjp-win, sjis-win");
if($encoding == "SJIS-win"){
    $word = mb_convert_encoding($word, "utf8", "sjis-win");
}

とりあえず、普通に$_GETで取得をしてから、mb_detect_encodingで文字コードを判定。
注意しておきたいのは、第2引数でutf8を一番最初にしておいて、あとはありえそうな文字コードを後ろに並べておくこと。
こうしないと、日本語ってだけでUTF-8なのにJISとか判定されたりする。

あとは、予めIEがどんな感じの文字コードを返すのかを調べておいて、その時だけmb_convert_encodingで変換。
今回は変更する文字コードとされる文字コードがはっきりしているので、引数にそれをツッコんでおく。

うまくいかなかった対処法

以下は今回うまく行かなかった対処法です。
もちろんうまくいくこともあるかも。その辺はPHP特有のテキトー感満載。

headerをアップデートする

headerで明示的にUTF-8で返ってくるように示せばいいんじゃないか、という対処法。

header("Content-Type: application/json; charset=utf-8");

を付けてみる。特に変化がない。
そもそもこれは出力するときのヘッダだから当たり前といえば当たり前である。

入力時にurlencodeする

ググったらこれが一番引っかかったかも。
ただ、入力側のViewもPHPにしなきゃいけなかったのでボツだった。
(今回は生えHTMLに書いたjQueryで値を取得してた)

やり方は簡単で、

"hope.php?word=<?= urlencode("ワード"); ?>"

という感じで投げてあげる。
こうすれば、いい塩梅にエンコードしてくれるらしい?

PHPは全然慣れていないので、この辺のアタリマエのこともかなり戸惑ってしまいますね。。。

JGitで git log -p を再現する

JGitを研究で使わなきゃならなくなった。
これでgit log -pを再現するのがえらい時間がかかったのでメモ。
一部EGitのソースを流用してる。

以下のcheckGitInfo()を実行するとこんな感じで取得が可能である。

.gitignore MODIFY
 old 
*.csv
*.xml

 new 
*.tsv

ソースコード中のprojectPathはGitリポジトリがあるファイルのString型パス。

流れとしては、

  1. Gitのリポジトリをプロジェクトパスを指定して取得。
  2. LogCommandによってlogのイテレータを取得(返り値はIterable)
  3. 取得したイテレータから前のやつと後のやつのペアを取るようにループを回す。(この時参照渡しに注意。)
  4. リポジトリをセットしたDiffFormatterのscanメソッドを用いて前のヤツと後のヤツの差分情報(DiffEntryオブジェクトで保存)のリストを取る
  5. DiffEntryオブジェクトから、差分の行数を保存しているEditオブジェクトのリストを取得する
  6. 同じくDiffEntryオブジェクトから新旧のテキストをRawTextオブジェクトとして取得。

と言った感じ。

続きを読む

Javaで2進数カウンタを作る

これはなに

Javaで2進数のカウンタが必要になったのでどうやって作るかメモ

どんなものを作ろう

ある固定長のリストのあるインデックスの要素を使う,使わない,というのが分かるBool値を使うために最終的にboolean型のリストが手に入るようにします.

例えば,


int[] list = {1,2,3};

において,0, 1, 2, 3, 1+2, 1+3, 1+2+3の結果をそれぞれ求めたいときなんかに使います.
(今回使ったケースはもう少し複雑なケースだったけど…)

戦略

JavaにはInteger型をBinaryのStringに落としこむメソッドがあるようなのでそれを使って通常のIntegerのforループを2bitに変換します.
ソースコードにするとこんな感じでした


import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		scan.close();

		int length = Integer.toBinaryString(n - 1).length();
		System.out.println(length);

		boolean[] output = new boolean[length];
		Arrays.fill(output, false);

		for (int i = 0; i < n; i++) {
			Arrays.fill(output, false);
			String strBinary = Integer.toBinaryString(i);
			System.out.println(i + ", " + strBinary);
			for (int j = 0; j < strBinary.length(); j++) {
				if(Integer.parseInt(strBinary.substring(
						strBinary.length() - j - 1, strBinary.length() - j)) == 0){
					output[j] = false;
				}else{
					output[j] = true;
				}
			}
			for (boolean o : output) {
				System.out.print(o + ",");
			}
			System.out.println();
		}
	}
}

nがリストの長さ出力させたい通り数(リストの例だと、n=2^3=8)で、outputがほしいboolean型のリストです.
標準入力に例えば4を入力すれば以下の様な出力が得られます.

面倒だったのが,Binary値がStringで,しかも最低ケタ数のものしか手に入らないので,
予め出力を0埋め(今回はfalse埋め?)をしてから入力値から得られたBinaryのStringをsubstringで必要な1文字を切り取り,Integerに変換するという回りくどいことをしています.


4
2
0, 0
false,false,
1, 1
true,false,
2, 10
false,true,
3, 11
true,true,

あとは出力をしている部分に処理を書くか,インクリメントの処理のメソッドを作るかすればやりたいことができるっぽいですね.

追記

Integer->ほしいBoolean値のリスト の変換器を作ったほうが賢かったですね.
こんな感じになりました.


import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		scan.close();

		int length = Integer.toBinaryString(n - 1).length();
		System.out.println(length);

		boolean[] output = new boolean[length];
		Arrays.fill(output, false);

		for (int i = 0; i < n; i++) {
			for (boolean o : toBinaryBooleanList(i,length)) {
				System.out.print(o + ",");
			}
			System.out.println();
		}
	}

	private static boolean[] toBinaryBooleanList(int input, int outputLength) {
		boolean[] output = new boolean[outputLength];
		Arrays.fill(output, false);
		String strBinary = Integer.toBinaryString(input);

		for (int i = 0; i < strBinary.length(); i++) {
			int binary = Integer.parseInt(strBinary.substring(strBinary.length() - i - 1, strBinary.length() - i));
			if(binary == 0){
				output[i] = false;
			}else if(binary == 1){
				output[i] = true;
			}else{
				System.out.println("ERROR: toBinaryBooleanList");
			}
		}

		return output;
	}
}


iOS機器のいざという時のアレ

持っているiPad Airが脱獄してるせいかよく死ぬので強制再起動とかリカバリ方法とかのまとめ。

強制再起動

普通再起動はスリープボタン長押し→電源ボタンをスライド→スリープボタン長押しでOKだがそもそもタッチを受け付けない。画面が真っ暗という状態がしばしば発生する。
こんなときにはとりあえず強制再起動。

  1. まずスリープボタンとホームボタンを10秒位長押し
  2. スリープボタンを離す
  3. なんか反応があったら(多分リンゴマークが表示される)ホームボタンも離す

とりあえずスリープボタンとホームボタンを長押しするとなんとかなる事が多いっぽい。

リカバリモード

強制再起動が受け付けない場合はいよいよiOSが死んでるのでiTunesで復元を試みる。
復元するということはJB環境がぶっ壊れるのでできればやりたくない。

方法は以下。

  1. iOS端末の電源を落とす。
  2. ホームボタンを押しながらPCへUSBケーブルを使って接続。
  3. iOS端末の画面にiTunesと接続しろという表示が出たらホームボタンを離す。
  4. iTunesでよしなにやる。

DFUモード

このモードはいよいよ電源を切ることもできなくなったときにやる。
結局はリカバリーモードとそこまで大差ないっぽい。

方法は以下。

  1. USBケーブルでPCとiOS端末を接続。
  2. スリープボタンとホームボタンを10秒以上長押し。
  3. スリープボタンだけを離す。すると、PC側でiTunesが立ち上がる。
  4. リカバリーモードのiOS端末があるから復元しろとポップアップが来るので復元。

大体の場合は強制再起動でどうにかなりますけど、定期的に復元してiOSを綺麗にしないといつか死にそうですね。
まあ、消えて困る写真もデータもない状態にしておくのが一番気楽です。
データはクラウドにおいておきましょう。

WPFことはじめ その1 MVVM

MVVM

Model-View-ViewModelの略です。
WPFがどうしてもこれに沿わないといけない、という決まりはないんですが、この考えに沿うとアプリが作りやすくなります。
MVCアーキテクチャとほとんど変わらない概念なのですが、もう一回復習ついでに書きます。

MVVMの基本

MVCとかMVVMとかの基本はアプリケーションの役割を以下の3つに分けることです。
無論、オブジェクト指向がベースです。
オブジェクト指向がベースなので、Modelはデータそのものというよりはその器を作るイメージがかなり大きいです。

  • Model:データの形を決めるためのクラス。どんなデータをどういった形でまとめるのか、をオブジェクトを意識してまとめるといい感じにまとまります。
  • View:GUIの一番表面的なモノ。WPFではXAMLが基本で、どの画面にどのパーツ(WPFではコントロールと言ったりする)を配置するかを書きます。極力それ以外は書かないようにします。
  • ViewModel:その名の通りViewとModelをつなげるためのクラス。ここには、Viewに載せるフィールドのプロパティを用意することがWPFでは求められます。

Example

なんかよくわからない気がするので簡単なWPFアプリを作ってみようと思います。

続きを読む

WPFことはじめ その0 WPFとは

そうだ、WPFやろう

  1. なんかデスクトップアプリケーションを作りたくなった。
  2. 研究でJavaのGUIを使っているのでどうにか、楽に作れるフレームワークでやりたい。
  3. 持ってる個人のPC、Windowsしかないから.NETでやろう
  4. せっかくならWPFを触ってみよう

と、いうことでWPFでアプリケーションを作っています。
XAMLとか触るの始めてなのでとりあえずいろいろメモしておきます。

WPFとは

Windows Presentation Foundationの略だそうです。

WPFの歴史

WindowsアプリケーションはXP以前まではWinFormsとかいうやつで作られていて、それはそれでかなり使える感じだったんですが、Vista以降GPU食うアプリが増えてきて(というか、OS自体がGPUを食うようになってきて)、それの対処と一緒にGUIのフレームワークを作っちゃえっていうノリのアレです。
そのため、WPFで作ったアプリは激しいCanvasの動きにも耐えられるとか何とか。

大分適当ですが、概ねこんなかんじだと思ってます。
結構なプログラマな方が「WPFすげえ」「WinFormsやめろ」ということを言っていてどんなもんじゃというのを知ってみようというのがモチベーションです。

WinFormsとWPFの違い

主にView部分が大分違います。
WinFormsはC#で自分でゴリゴリ部品を書くか、Visual Studioのデザイナーを使って配置します。
VSのデザイナはかなり完成度が高いほうだとは思うのですが、それでも配置を動的に作ったりするのがどうにもこうにも面倒でした。

WPFでは、WinFormsでのやり方に加え、XAMLというMicrosoftの独自規格のXMLっぽい何かを使ってViewを記述することで動的にフォームを増やしたり、モデルとフォームの分離をやりやすくしたりといったことを行っています。
XAMLは、最終的にコンパイルするときC#と同じような形になるため、XAMLで書けることはC#で全てかけます。ただし、書き方の制限はあるので逆は無理ですが。
XAMLを少し触ってみた感想としては、C#で書くと面倒なView処理を極力XAMLに投げることを意識するとコードがすっきりするように思えます。
大概のGUIのView部品はXAMLで書けるのでXAMLで書くのが難しい部分をC#に書くといった具合です。
ただ、かなり癖が強いのでなれるまでかなり時間がかかりました。
まだまだ、慣れませんが調べつつ書いていくしかなさそうです。

幸い、WPFはVista時代からある古いフレームワークでWindowsアプリケーションに用いられていることも幸いし、公式ドキュメントを始めとしてかなりの情報がWebに転がっています。
まあ、凝ったことをしようとするとアメリカ語の文書を読む羽目になるのはいつもどおりですが…

とりあえず次回からはWPFに必要な概念であるMVVM、XAMLで使ったコントロールの書き方、詰まった部分等々書いていきたいです。