雷って幻想的だよね?

宗教:C#、ラノベ好きの戯言です。

サンワサプライのエゴのミクスマウスを買って初回使ってみた感想

400-MA092 買った直後の使用感になります。

direct.sanwa.co.jp

上の記事の商品を買った。(買ったのはAmazonだけど・・・)
安かったので常用してみて、ほしい点をあぶりだして、ロジクールの製品を買うかどうかの検討材料にしようと考えた。

圧迫による怪我をケアするロジクールMX Verticalエルゴノミクスマウス

これがどういうのかよくわからなかったので・・・

とりあえず、買ったのはサンワさんのです。
エルゴエッジ構造が個人的にすごく気になったので。

現状で良いと感じた点

・マウスホイールが今までと回す感じが違って、すごく新鮮。回しやすい。
・良い姿勢で持ちやすい形に思える。
・思った以上に持ちやすく感じる。
・小指が机に触れない(持ち方次第なので、今後も変わるかもしれないが)

現状で悪いと感じた点

・【エルゴエッジ構造】に関してはとりあえず、薬指も入る。
・画面3つあるので端から端まで移動しようとすると大変。カウントを1600にすると粗すぎて細かい制御ができないのでかなり厳しい。
・1ドットぐらい動かそうとすると、、、おそらく認識が悪く、うまく動かない。(値段相当と思われる)
 (細かい制御がいらない場合は気にならない程度だと思う。ゲームしないなら。。。)
・このデザインを使い続けると普通のマウス持つのがつらくなりそう(というか、キーボードがつらい)
 →それだけ、持ちやすいということだと思う。たぶん。
・クリックしながらドラッグなどの操作が、今までと違う力の入れ方になるので、やりづらく感じる。(慣れるまでと思う)

ロジクール期待できそうなこと

・小指の箇所がへこんでいないほうが持ちやすい可能性を感じ取れた
・上についているボタンが押しづらそうに思えたが、このマウスを持った感じでは、意外と押しやすそう
・親指の位置がこれよりも高いため、より、自分の持ち方にあっていそう。
ロジクールの製品はマウスホイールが神がかっている(自分が使っていた製品は)ので、

【総合感想】
買ってよかった。
1ヵ月~3ヵ月使ってみて、再検討したい。
あと、肘付きながらではないほうが動かしやすいので、いい姿勢になりやすいかもしれない。
ただ、範囲選択がとてもしづらく思うので、これに慣れれるかどうかが一番重要だと思う。

すでに弊害が出てきていて、10キーが邪魔・・・
友人が言っていた気持ちがわかってきた。
10キーは別で買って、キーボードの上に置くべきかもしれない(マテ
10キーは半角で文字が打てるので、個人的にすごく重要・・・


使用感の追記:2018/09/09 13:47

少し手を放していると、無線通信が切れて、クリックするまで無反応になる。
このワンクリックが非常にうざい・・・
参考になりましたら幸いです。

CドライブのSSDが200Gではなぜか足りないので、更新するために調べてみた

現行:製品の仕様情報 - Intel® SSD 335 Series (240GB, 2.5in SATA 6Gb/s, 20nm, MLC)

Cドライブは高いけど安定優先でインテルにしてるので、インテルの製品で気になったもの
※当方はそんなに詳しい人間ではないです。PC自作してる程度です。ゲームで最高でやりたいけど、MOD入れると微妙に落とさないとできない勢です。
価格帯は400G付近を意識

SSD 905P
インテル® Optane™ SSD 905P シリーズ 129834
 ・16万円弱のSSD「Optane SSD 905P」がアキバで予想以上の反響 (1/4) - ITmedia PC USER
  ・2018/05/21の資料
  ・280:41,574円
  ・480:63,704円
情報
・接続:PCIe 3.0 x4

Optane SSD 900P
の上位互換らしい。
ちなみに今の価格は・・・
280G:46,798円(Amazon
480G:76,574(Amazon
価格あまり落ちていない感じ
ちなみに、Amazonだと905Pは480Gで74,800(ssdpe21d480gax1 なので接続端子が特殊)なので・・・信頼できる実店舗で、端子があるのを買うべきっぽい
それ以外の値段はヤバいので無視。

Intel Optane Technologyが利用されているらしい

参考
KabyLakeからサポートされる「Intel Optane Technology」とは : 自作とゲームと趣味の日々

自己解釈
マザーボードがKabyLake以上で使えそうな感じ(つまり私無理じゃね?)

ちなみに、もう一段階落ちるIntelのは
インテル® SSD 760p シリーズ (512 GB、M.2 80 mm、PCIe* 3.0 x4、3D2、TLC)
3D NANDらしいので興味がわかない・・・不揮発性が高いのうたってないと不安で・・・

悩ましいが、開発するうえで、起動が遅いのでかなりほしいなぁ・・・

以上です。(T-T

Cドライブの容量がいっぱいいっぱいなので削減を試してみた

Windows仕様

Windows10 Pro
バージョン:1803
OSビルド:17134.228

参考サイト
WinSxS フォルダーのクリーンアップ - Windows 10 hardware dev

ちなみに、以下の操作をすると復元や、サービスパックのロールバックなどできなくなるそうなので注意してください。
気になる人はリンク先を見てください。

1.ディスククリーンナップをWindowsマーク(スタートボタン)で検索して、管理者権限で全部消す
よくやるので10Gほどきれいになった(OSの大型アップデートの不要なバックアップを消すので)

2.SpaceSnifffer で 「$recycle.bin」フォルダを消す。
 過去のごみ箱情報らしい。消してもシステム落ちなかったので大丈夫だと思う。ダメだったらここの行を修正するので、10月ぐらいにこの記事が更新されてなかったらつかえていることだと思ってください
 2018/09/01実施

3.コンポーネントをクリーンナップする(タスクスケジューラで行われるものだそうな)

 Dism.exe /online /Cleanup-Image /StartComponentCleanup

をする。

50%で1726エラーが出た。
が何もせずに、再度実行…完了(なんでやねん
2Gほど削除された

4.サービスパックのアンインストールに必要な状態を削除

Dism.exe /online /Cleanup-Image /SPSuperseded

…サービスパックのバックアップはなかったそうな・・・あれぇ?

以上です。
新しく見つけたら追記するか、新たに記事を書く予定です。

Xamarin.Androidでoverrideできる関数を探す(※要ReSharper)

Androidの標準と違って、オーバーライドの関数を探すのがちょっと大変だったので、メモ

継承した後のクラス名を選択して、Alt+Enter →オーバーライドを生成する

があるのでこれを選択する。 その後、ダイアログボックスが出るので、ここから気になるものをチェックすると作成されるので非常に楽です。

これにもっと早く気づいていれば・・・

Visual StudioでのXamarin.Androidのデバッグ

自分が今のところチェックをするところのデバッグのメッセージなどの設定です。

利用するクラス

public static class DebugLog
{
	/// <summary>
	/// ひとつ前の関数の情報を出力する
	/// </summary>
	/// <param name="memberName">基本設定不要</param>
	/// <param name="sourceFilePath">基本設定不要</param>
	/// <param name="sourceLineNumber">基本設定不要</param>
	[Conditional("DEBUG")]
	public static void TraceMessage([System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
		[System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
		[System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)
	{
		var i = sourceFilePath.LastIndexOf("\\");
		var s = sourceFilePath.Substring(i + 1);

		OutPut(memberName, "ファイル名:" + s + "\t:" + sourceLineNumber + "行");
	}
	/// <summary>
	/// 処理固有の出力を記述する
	/// ※処理ごとに継承して利用する
	/// </summary>
	/// <param name="message"></param>
	[Conditional("DEBUG")]
	private static void OutPut(string fancName, string message)
	{
		Log.Info("プロジェクト名"+ "." + fancName, message);
	}
}

これで出力されたログを表示する
※Debugログが多いのでInfoを設定したほうがいいと思われる。

ツール
Android
デバッグログ

表示した、デバイスログの右側に検索キーワードが存在するので、ここにプロジェクト名を入れると、、、
プロジェクトで絞られる。

その後、より細かくフィルタリングしたい場合は、グリッドのフィルタ機能を利用する。


以上。
とりあえず、全部の関数にログメッセージを仕込んでおけばちょっとしたときに調べやすいかな?と。

Xamarin.Android FileProvider エラー

Java.Lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference

が表示された場合、以下を行うと、解消されます。 ※Xamarin.Android Android8.0想定

1:Properties/AndroidManifest.xmlに以下を追記する ※ ここに以下を追加

  <provider android:name="android.support.v4.content.FileProvider" 
            android:authorities="${applicationId}.fileprovider" 
            android:exported="false" 
            android:grantUriPermissions="true">

        <meta-data android:name="android.support.FILE_PROVIDER_PATHS" 
                       android:resource="@xml/file_paths"></meta-data>
  </provider>

2:Resourceフォルダに以下のフォルダを追加 ・xml

3:上記で追加したフォルダに以下のファイルを作成し、内容を記述する

3-1:ファイル名

file_paths.xml

3-2:内容

<?xml version="1.0" encoding="utf-8"?> <external-files-path name="my_images" path="Pictures" /> <external-files-path name="my_movies" path="Movies" />

以上。 場合によって、それ以外のエラーが出ると思いますが、それは対処が違うため、再度検索などお願いします。(私は次のエラーが出たのでそれの対処を行うためです)

Xamarin.Androidで更新されたテキストを内部データに連携する方法(外部のMVVMなどを利用しない方法)

Xamarin.Androidで更新されたテキストを内部データに連携する方法
で、かなり詰まったので、同じ人がいないようにとの願いのメモです。

初心者なので、ご指摘あればいただけるとうれしいです。

最後に、クラス全体を載せていますので、説明が不要な方はそちらをご覧ください。

【手順】

  1. BeforeTextChangedでテキスト変更開始を検知
  2. TextChangedで変更することを確定させる
  3. AfterTextChangedで上記を満たした場合に、変更とみて更新を行う
    ※ただし、複数回流れることがあります。
  4. 保存時の動作
    1. フォーカスがある場合のみの保存とする(しないとなんかすごく更新がかかる。恐らくなんか実装が変)
    2. GetViewで保存した、EditTextに紐づけたタグ情報を元に対象のデータを特定
    3. 更新する。
    4. isEdittingはActivityで、保存ボタンを押したときにこのフラグを基準に1度のみ保存動作をさせるため指定

動作したAdapterのまとめです。

public class ListItemDetailAdapter : BaseAdapter<ViewArticleItem>
{
#region メンバ変数
private Activity _activity;
private List<ViewArticleItem> _items;
private DbContext dbContext;
/// <summary>
/// EditTextを変更したかどうか
/// </summary>
private bool isEditting = false;
#endregion

#region 必須処理

public ListItemDetailAdapter(Activity activity, List<ViewArticleItem> items)
{
this._activity = activity;
this._items = items;
dbContext = Common.ConnectDB.GetDBContext();
}

public override long GetItemId(int position) => position;


public override View GetView(int position, View convertView, ViewGroup parent)
{
View view = convertView ?? _activity.LayoutInflater.Inflate(Resource.Layout.ListItemDetailLayout, null);

//対応するプロパティの割り当て
EditText editText = view.FindViewById<EditText>(Resource.Id.editText);
ViewArticleItem item = _items[position];
editText.Text = item.Text;
setTagItemId(editText, item.ItemId);
SetEditEvent(editText);

return view;
}

public override int Count => _items.Count;
public override ViewArticleItem this[int position] => throw new NotImplementedException();

#endregion

#region タグ:ItemIdを設定する

private void setTagItemId(EditText editText, int itemId)
{
editText.SetTag(Resource.Id.editText, itemId);
}

private int getTagItemId(EditText editText)
{
return (int)editText.GetTag(Resource.Id.editText);
}

#endregion

#region イベント処理

private void SetEditEvent(EditText editText)
{
//重複しないようにイベント削除
editText.TextChanged -= EditTextOnTextChanged;
editText.BeforeTextChanged -= EditTextOnBeforeTextChanged;
editText.AfterTextChanged -= TextViewOnAfterTextChanged;
editText.FocusChange -= EditTextOnFocusChange;

//イベント再登録
editText.TextChanged += EditTextOnTextChanged;
editText.BeforeTextChanged += EditTextOnBeforeTextChanged;
editText.AfterTextChanged += TextViewOnAfterTextChanged;
editText.FocusChange += EditTextOnFocusChange;
}

/// <summary>
/// フォーカスが変わった場合
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void EditTextOnFocusChange(object sender, View.FocusChangeEventArgs e)
{
if (isEditting)
{
//変更時にデータを保存する
dbContext.SaveViewArticleItems(GetArticleItems());
DebugMessage.ShowDebugToastShort(Application.Context, "Itemsを保存しました");

isEditting = false;
}
}

private bool isChange = false;
private bool isChanging = false;
private void EditTextOnBeforeTextChanged(object sender, TextChangedEventArgs e)
{
if (isChange == false)isChange = true;
}


private void EditTextOnTextChanged(object sender, TextChangedEventArgs e)
{
if (isChange && e.BeforeCount != e.AfterCount)isChanging = true;
}

/// <summary>
/// 文字変更入力後処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TextViewOnAfterTextChanged(object sender, AfterTextChangedEventArgs e)
{
if (false == (isChange && isChanging))return;

//描画中の文字に更新文字を設定する
SaveChangeText((EditText)sender);

isChange = false;
isChanging = false;

}

#endregion

#region 外部利用処理

public List<ViewArticleItem> GetArticleItems()
{
return _items;
}

#endregion

#region 内部処理

/// <summary>
/// 変更を保持データに反映する
/// </summary>
/// <param name="editText">変更データを持つEditText</param>
private void SaveChangeText(EditText editText)
{
if (editText.HasFocus == false) return;//これがないと、アクション時などに、一覧表が更新されてしまう

//更新対象を特定するために、ItemIdを取得する
var itemId = getTagItemId(editText);

//データに反映する
var item = _items.First(x => x.ItemId == itemId);
item.Text = editText.Text;
isEditting = true;
}

#endregion

}