2023年10月1日日曜日

Dynalistでメモの達人になれるか!


こんにちは、せんです。

私の苦手なことのひとつは片付けです。

もともと収集癖もありますし、何にでもはまりやすい質で、書籍や雑貨を中心にすぐにものが場所を占めてしまいます。





そんな私、携帯やパソコンの中身を片付けるのもまあまあ苦手です。

メモを取ることはできても、そのメモを整理整頓していくのはめんどくさい。

パソコンを開いたら携帯のメモを新たに開くのがめんどくさい。

以前「メモを取るというのは、定期的に見直すところまでできてこそ意味がある」というような格言を聞きましたが、

「直さないとなあ」と思ってもすぐにできるようになっちゃうほど出来た人間ではないと自分でもよくわかっています。


そんなわけで、最近探していたのが「最初から整理できるメモ、が作れるツール」でした。

要は、最初からある程度整理した状態で保存する、という、できる人っぽい手法をとりたいのです。

無料で使えて、

携帯でもパソコンでも内容が同期できて、

ルーズリーフみたいに内容を抜き差しできて、

検索とかできちゃったりして、

欲を言えば、見た目がいい。

そんなのあるのかしらと思いつつ、探してみた結果、


「Dynalist」というツールを見つけました。

アウトライナーと呼ばれるツールです。

有料版もあるそうですが、今回は無料版の機能だけ見てみます。


さっそく登録!!


公式サイト(https://dynalist.io/)にアクセスしてみましょう。

トップページからわかるように、まだ日本語化はされていません。


Googleのアカウントで登録ができるので、さっそく使ってみました。

参考サイト:https://www.sungrove.co.jp/dynalist/


登録が終わると、スタートページとしてメモの見本が表示されます。



左上側の「+」アイコンをクリックすると、新しいフォルダとドキュメントを作成できます。



試しにstudyフォルダの下にVB.NETというファイルを作ってみました。

調べ物をしたことをここに書き溜めていくようにします。



アウトライナーツールというだけあって、中身はリスト形式になっていきます。

タブキーを使って階層化することができます。



便利なところその①
子を持つ階層に対して「+」「-」アイコンを使うことで、以下の階層を非表示にできます。



便利なところその➁
項目をコンパクトにまとめることができるので、項目の入れ替えもしやすいです。


項目を選択した状態でエクスプローラーにドロップすると、独立したファイルになります。
(これ元に戻すにはどうしたらいいんだ???)




こんな使い方もできる!!


①チェックボックス
 各項目の先頭に表示されるハンバーガーをクリックすると、下のようにメニューが表示されます。
 メニューからAdd Checkboxを選ぶと、黒点のあとにチェックボックスが表示されます。


②番号付け
 同じくハンバーガーメニューから「Numbering Children」を選択すると、



子階層に番号付きのリストになります。


③カレンダー表示
 右欄にもヒントとして表示されていましたが、「!」を入力すると、カレンダーが表示されます。


④ズーム
 ハンバーガーの右隣にあるZoom inというアイコンをクリックすると、


その項目が全体表示されます。
パンくずリストから戻れるのも便利ですね!


⑤検索
 エディタ部分の虫眼鏡アイコンから、検索もできます。




感想


今回は、Dynalistというアウトライナーをご紹介しました。
肝心の「メモを整理整頓して、定期的にチェックする」という目的のためには、
これを使い続けられるか?という点が一番重要ですよね。
もう少しこれを習慣化して、次回ご報告します。
やっぱり違うなと思ったら、別のツールについて記事を作っているかもしれません...

ご覧いただいてありがとうございました。











2023年9月17日日曜日

「MX MASTER 2S」が不調なので修理してみた

こんにちは、やっまむーです。

先日、自宅で使用しているマウス「MX MASTER 2S」が急に動かなくなりました。
ポインタが動かず、しかしクリック操作やスクロールは問題なし。
電源を入れなおしたり、無線の接続設定を見直したりと試しましたがうんともすんともポインタは動きません。

キーボード操作のみを駆使して調べてみると、どうやら内部パーツの劣化により一部のボタンが押しっぱなしになっていることが原因のようです。
保証書を確認すると2017年に購入しており、6年間使い続ければ仕方ないなとも思います。

ただ、同等品の「MX MASTER 3S」は1万円を超える価格なのでポンとお金を出すのを躊躇してしまいます。
さらに調べてみると、同様の現象に悩まされて自己修理をしたという記事を見つけましたので、今回はそれにならって私も修理してみました。

分解と修理手順

使う工具は大きく3つです。

  • カッターナイフ(ソール剥がし用)
  • T型トルクスドライバーのT5サイズ
  • プラスドライバーのNo.0サイズ

まずはマウスの滑りをよくするソールをカッターナイフで剥がします。 刃先を隙間に差し込んで剥がしていきます。 今回、ソールを再利用するため破損しないようにゆっくりと、また接着面をできるだけ触れないようにピンセットも使っています。

ソールがあった個所はプラスドライバー、マウスの先端部はトルクスドライバーを使って外します。 自宅にトルクスドライバーが無かったので、急遽精密ドライバーのセットをAmazonで購入しました。

ネジを外して中身を開けるとこのようになっています。 フレキケーブルが繋がっているので勢いよく開けると断線の可能性もあります。

今回、親指部分にあるジェスチャーボタンが押されっぱなしになっています。 この部分のネジを緩めることで、ボタンと基盤のスイッチ部に隙間を作ってやります。

作業完了後は元通りにねじ止めしてソールを張り付けて完成。 電源を入れると、無事にマウスが動くようになりました。

今回保障期間も過ぎており、最悪買い替えればと考えて分解修理をしました。 皆さんも壊れた機器があれば自分で修理してみてはいかがでしょうか。

キーボードでマウスを操作する

ちなみに予備マウスがないため、調べるときはキーボード操作のみで行っていました。 その中で、どうしてもマウス操作が必要な時は「アクセシビリティ マウスの設定」でテンキーによるマウス操作を使いました。

Windowsキーを押して、「アクセシビリティ マウスの設定」と検索すると設定が出てきます。

タブキーを押して「マウス キー機能」まで移動して設定をオンにすると、テンキーでポインタを操作できるようになります。 普段使う機会はないと思いますが、もしもの時は使ってみることをお勧めします。

ではではー。

2023年9月3日日曜日

[Python]Tkinter Treeviewの値取得でゼロ落ち

こんばんは。ざわです。

Pythonで実装したツールで、画面の一覧データをCSVファイルに出力したら
頭に0(ゼロ)がついているデータの 0部分がゼロ落ちして出力される現象がありました。
GUIにtkinter、一覧(表)は tkinter.ttk.Treeview ウィジェットを使っています。
原因など調べてみた結果と対応策について書いていきたいと思います。

現象

ゼロ落ち現象となるサンプルコードはこちらになります。

# サンプルコード
import tkinter as tk
from tkinter import ttk
import pandas as pd

# CSV出力ボタン押下
def btnCsvOutput_Click():  
    data = [tree.item(item)['values'] for item in tree.get_children()]
    df = pd.DataFrame(data)
    df.to_csv('sample.csv', encoding='shift-jis', header=False, index=False)

# メインウィンドウ生成
root = tk.Tk()
root.title('sample')
root.geometry('400x300')

# Treeview
column = ('ID', 'Name')
tree = ttk.Treeview(root, columns=column)
# 列設定
tree.column('#0',width=0, stretch='no')
tree.column('ID', anchor='w', width=100)
tree.column('Name',anchor='w', width=100)
# 列見出し設定
tree.heading('#0',text='')
tree.heading('ID', text='ID',anchor='w')
tree.heading('Name', text='Name', anchor='w')
# レコード追加
tree.insert(parent='', index='end', iid=0 ,values=('00001', 'AAAAA'))
tree.insert(parent='', index='end', iid=1 ,values=('00100', 'BBBBB'))
tree.insert(parent='', index='end', iid=2 ,values=('000XXXXX', 'CCCCC'))

# ウィジェット配置
tree.pack(pady=10)

btnCsvOutput = tk.Button(root, text='CSV出力', width=10, command=btnCsvOutput_Click)
btnCsvOutput.pack(pady=10)

root.mainloop()

これを実行した画面がこちら。

CSV出力した結果がこちら。

画面の表のID列には コードの29~31行目のレコード追加処理で書いた通り 0がついた状態で表示されていますが、
CSVには 0が消えて出力されています。
ただ、CSVの3行目のように 数値以外の文字が含まれる場合はゼロ落ちしていません。

対応方法

さて、何が原因でどう修正したらいいかなと調べた結果、こちらのサイトが参考になりました。

(フォーマットして0埋めしたら?というご意見もあると思いますが桁数が固定でないためフォーマットでは対処できず・・)

原因は、tkinter.ttk.Treeviewでは、整数に変換できる文字列は整数に変換してしまうようで、
それに該当するのが ttkの _convert_stringval()関数(*1)のようです。

参考サイトでは、
自身のコードに、条件文によって整数に変換しない _convert_stringval()関数を実装し、
ttk._convert_stringvalをその関数で置き換えるようにしています。(*2)

*1:ttk.py の元の関数
def _convert_stringval(value):
    """Converts a value to, hopefully, a more appropriate Python object."""
    value = str(value)
    try:
        value = int(value)
    except (ValueError, TypeError):
        pass

    return value
 ttk.py はPythonのインストール先の tkinterフォルダにあります。
 (例 : C:\Users\{ユーザID}\AppData\Local\Programs\Python\Python310\Lib\tkinter)

*2:上記のサンプルコードに _convert_stringval()関数を追加した例
# サンプルコード
import tkinter as tk
from tkinter import ttk
import pandas as pd

def _convert_stringval(value):
    """Converts a value to, hopefully, a more appropriate Python object."""
    if hasattr(value, 'typename'):
        value = str(value)
        try:
            value = int(value)
        except (ValueError, TypeError):
            pass
    return value

ttk._convert_stringval = _convert_stringval

# CSV出力ボタン押下
def btnCsvOutput_Click():  
    data = [tree.item(item)['values'] for item in tree.get_children()]
    df = pd.DataFrame(data)
    df.to_csv('sample.csv', encoding='shift-jis', header=False, index=False)

# メインウィンドウ生成
root = tk.Tk()
root.title('sample')
root.geometry('400x300')

(以下略)

6~14行目に _convert_stringval()関数を追加しています。
(この関数は、ttkのimport後、ttk.Treeviewを使用するコードより前に追加すること)
8行目の if文が元関数から変更(追記)したコードになります。
16行目で ttk._convert_stringval を自身の関数で置き換えています。

これを実行してCSV出力した結果がこちら。

ID列のデータがゼロ落ちせず、正しく出力されるようになりました。

ここまで、ttk._convert_stringval()関数を変更する方法を書いてきましたが、
他のコードに影響を及ぼしそうでttkの関数を変更したくない、という場合もあるかと思います。
そういった場合の対応案として、Treeviewにinsertする時点でデータを pandasのDataFrameにセット(保持)しておき、
CSV出力処理時に Treeviewから出力データを取得するのではなく、保持したDataFrameデータを出力すればいいかと思います。

それではまたー。

2023年8月18日金曜日

Xamarinプロジェクトのエラーを解決してみた!

数年前に作成したVisual Studio 2019のXamarinプロジェクトを、まっさらなパソコンでビルドしたところ、いくつかエラーが発生しました。その解決メモです。

.NETのインストール


まず、下記のエラーが発生し、プロジェクトが「アンロード済み」となり、読み込まれませんでした。


error  : プロジェクト ファイルを開けません。 
.NET SDK バージョン 7.0.304 では、MSBuild バージョン 17.4.0 以上が必要です。
現在利用可能な MSBuild のバージョンは 16.11.2.50704 です。
global.json で指定した .NET SDK を、現在利用可能な MSBuild バージョンが求められる古いバージョンに変更します。


プロジェクトのターゲットフレームワークは「.NET Standard 2.0」です。
下記のサイトに


netstandard がターゲットの既存のコードの場合は、TFM を net5.0 から net6.0 に変更する必要はありません。
 .NET 5 と .NET 6 により、.NET Standard 2.1 以前が実装されます。

と書かれています。

Visual Studio 2019では、.NET 6以降は正式にサポートされていないため、(すでにサポートは終了していますが).NET 5をインストールする必要があります。Visual Studio Installerを使ってはうまくインストールできなかったため、.NET 5のダウンロードサイトからダウンロードし、インストールしました。

ちなみに、エラー内容にある「.NET SDK バージョン 7.0.304」は、Visual Studio 2022のインストールで「.NETマルチプラットフォームアプリのUI開発」をチェックした際に、インストールされたSDKです。

JDKのインストール


次に、Xamarin.Androidプロジェクトをビルドすると、下記のエラーが発生しました。


$(TargetFrameworkVersion) v12.0 を使用するときには、Java SDK 11.0 以上が必要です。


まっさらな環境なので、JDKもインストールしていません。
下記のダウンロードページからOpenJDK 11をダウンロードし、インストールします。


そして、[ツール] > [オプション] > [Xamarin] > [Android 設定]の「Java Development Kit の位置情報」から「JDK 構成」を開き、インストールしたJDK11のパスを指定します。


残念なことに、VS2019の仕様なのかバグなのか、VS2019を終了するとこの設定は元に戻ってしまい、起動するたびに再設定しなくてはなりません。。。

Android SDKのインストール


ビルドすると、まだエラーが発生します。


API レベル 31 の android .jar が見つかりませんでした。
これは、API レベル 31 の Android SDK プラットフォームがインストールされていないことを意味します。Android SDK マネージャー ([ツール] > [Android] > [Android SDK マネージャー...]) にインストールするか、インストールされている API バージョンを対象とする Xamarin.Android プロジェクトを変更します。(C:\Program Files (x86)\Android\android-sdk\platforms\android-31\android.jar がありません。)


API レベル 31、つまりAndroid 12が必要です。
ところが、Android SDK マネージャーを開いても、Android 12が表示されません。


下部の歯車アイコンを押下し、[リポジトリ] > [Google(サポート対象外)]の方を選択すると、「Android 12.0」が表示されるので、チェックしてインストールします。
これで無事にビルドすることができました。


またいつか、どこかで。

2023年8月4日金曜日

PHPの学習ノート②-DB接続の方法まとめ


こんにちは、せんです。

PHPの学習ノート第2回です。

 

前回の記事:環境構築


第2回はDB接続です。 

定番のPDOを含む合計4種類の方法について、簡単な使い方と使ってみた感想を記録します。 

※DBはPostgreSQLを使用

※この記事ではphp.iniの編集など、細かい説明を省略しています。


①PostgreSQL関数を使用する。


PHPのライブラリから提供される、pg_connect、pg_query、pg_fetch_allといった関数です。

PostgreSQL以外のDBについても、mysqli_connect、oci_executeなどが用意されており、使うDBに対応したメソッドを使います。


基本の書き方はこんな感じ。

引数にSQLを直接書くスタイルです。


$conn = pg_connect("host=localhost port=5432 dbname=testdb user=postgres password=***");
$result = pg_query($conn, "select * from books");
while ($row = pg_fetch_row($result)) {
    echo "id:$row[0] title:$row[1] writer:$row[2]<br/>";
}
pg_close($conn);


②PDOを使用する。


PostgreSQL関数を1番に持ってきましたが、検索するとPDOに関する記事が最も多く、現在最も定番の方法のようです。

PDOとは「PHP Data Objects」の略。

PHP5.1から使えます。


「PDOのメリット=共通のメソッドを使用するのでDBを変更しても修正が楽」という説明が非常に多いのですが、

それでは決め手にならないんじゃないか…と思うので、ほかの違いも見てみましょう。

基本の書き方はこんな感じです。

こちらも引数に直接SQLを書きます。

PDOクラスのオブジェクトを生成して接続します。


try {
    $dbh = new PDO('pgsql:dbname=testdb host=localhost port=5432 user=postgres password=***');
    $sql = 'select * from books';
    foreach ($dbh->query($sql) as $row) {
        print "id:$row[0] title:$row[1] writer:$row[2]<br/>";
    }
} catch (PDOException $e) {
    print('Error:' . $e->getMessage());
    die();
}
$dbh = null;


例外はPDOExceptionとしてキャッチされるので、try-catchで書けます。 基本は上の通りです。

PDOについて調べると、プリペアドステートメントを使用した書き方も登場します。

INSERT処理を見てみましょう。


$sql = "insert into books (title, writer) values (:title, :writer)";
$stmt = $pdo->prepare($sql);
$params = array(':title' => '赤毛のアン', ':writer' => 'モンゴメリ');
$stmt->execute($params);


values句で、あとから値をセットするプレースホルダ(:〇〇)を使っています。

SQLインジェクション対策として「PDO+プリペアドステートメント+プレースホルダ」は頻出のセットですが

PostgreSQL関数にもpg_query_paramsという関数があり、これを使えば同じことができそうです。

PHP公式ドキュメント

MySQLの場合はmysqliクラスを使ってPDOと同じように書く方法もあります。


③Idiormを使用する。


オブジェクトを操作するようにDBを操作するORMのライブラリです。

ORMなどのキーワードを追加して初めて検索結果に出てくるレベルです。

2011年に登場しました。

idiorm.phpの1ファイルを追加するだけなので、フレームワークを使用するより簡単かつ軽量に実装できる選択肢です。

公式ドキュメント

簡単な使用例はこちら。 SQLは書きません。


require_once('../idiorm.php');
ORM::configure('pgsql:dbname=testdb host=localhost port=5432');
ORM::configure('username','postgres');
ORM::configure('password','***');

$books = ORM::for_table('books')->find_many();
foreach ($books as $book) {
    echo $book->title . '</br>';
}

$newBook = ORM::for_table('book')->create();
$newBook->title = '長くつしたのピッピ';
$newBook->writer = 'リンドグレーン';
$newBook->save();


④のフレームワークと比べるとはるかに簡単に使えますが、 

複雑なクエリを実行する場合はraw_queryメソッドの引数に直接SQLを指定することになります。


④Laravelなどのフレームワークを使用する。


LaravelをはじめとしたPHPのメジャーなフレームワークには、もれなくORMが含まれています。

クエリビルダでDB操作を行うこともできますが、 ここではLaravelのORMであるEloquentの基本的なメソッドを見てみましょう。


$allBooks = Book::all();
foreach($allBooks as $book){
    echo $book->title;
}

$newBook = Book::create([
    'title' => '若草物語',
    'writer' => 'オルコット'
    ]);
    
$updateBook = Book::findOrFail(1);
$updateBook->title = 'Anne of Green Gables';

$deleteBook = Book::findOrFail(2);
$deleteBook->delete();

このコードはControllerクラスに書かれます。BookはMVCのモデルです。

createメソッドで配列を入れるあたりは見た目にも分かりやすいです。

ただ、ここまで来るまでが長いので、しっかり勉強してから使いたいです。


まとめ


DB接続について検索すると、体感8割くらいがPDOに関する記事です。

それに乗ってPDOを使うにしても、ほかの方法についていくらか知っておきたいものです。


すでに使用するフレームワークが決まっている場合はその機能を活かしたいですが、

そうでなければ①から③で選ぶことになるでしょう。


この記事が方法選択のとっかかりになれば幸いです。

ご覧いただいてありがとうございました。

2023年7月23日日曜日

「Google Play Games」を使ってPC上でゲームをする

こんにちは、やっまむーです。

少し前に、Googleから「Google Play Games」のベータ版がリリースされました。
これは「Google Play」で提供されているAndroid向けのゲームをWindowsPC上で遊べるようになるものです。
スマホ上の小さい画面ではなく、PCの大画面で遊べるということでさっそく使ってみました。

Google Play Gamesのインストール

まずは公式サイトから「Google Play Games」のベータ版をダウンロードします。

ダウンロードしたインストーラーを起動すると、早速インストールが始まります。

インストールが完了すると、自動的に「Google Play Games」が起動します。

ログインしてゲームをプレイする

次に「Google Play Games」で使用するアカウントでログインをします。
サインインのボタンを押すと次のように使用するアカウントの選択画面が出てきます。

使用するアカウントを選択してログインすると、「Google Play Games」上にそのアカウントの情報が表示されます。

OKを選択した後は、利用規約、データ送信に関するプライバシーの同意をすればログインは完了です。

画面右には既に遊んでいるゲームが表示されています。
インストールして起動すると、無事にPC上でプレイができました。

最初はフルスクリーンで始まるので、Shift+Tabでウィンドウモードに切り替えておくことをお勧めします。
また、Google Play上でデータを管理するようなゲームであれば、現在のプレイ内容の引継ぎもできるようです。

全てのゲームに対応しているわけではありませんが、有名なゲームもいくつかあります。
今後追加される可能性もありますので、よければ一度試してみてはいかがでしょうか。

ではではー。

2023年7月9日日曜日

Windowsでシンボリックリンクを使ってみる

こんばんは。ざわです。

Googleで「シンボリックリンク」で検索すると、
「シンボリックリンクとは、Linux においてコンピューター上にある他のファイルやフォルダを指し示す働きを持つファイルです。
英語では symlink とも呼ばれ、Windows におけるショートカットとよく似ています。」とでてきます。

私は、これまでLinuxで使ったことはありますが、Windowsにもシンボリックリンクがあることは知らず、、
先日 仕事で使う機会があったので、Windowsのシンボリックリンクについて書いてみたいと思います。

Windows シンボリックリンクを知った経緯は、
担当しているシステムで、そのプログラムが参照するxmlファイルのパスが変わることになり、
(これまではプログラムファイルと同じ環境に配置していたxmlファイルを、サーバ上での管理に変更)
xmlファイルのパスは設定ファイルで設定しているので、その設定を変更すればいいだけなのですが、
ちょっとした理由があって、設定は変更せずこれまでのパスのままにしておきたいなぁ、、と。

Linuxであればシンボリックリンクで対応できるけど、と思い
試しに「Windows シンボリックリンク」で検索してみたらありました!

Windows シンボリックリンク 作成方法


 ショートカットはエクスプローラー(GUI)で作成できますが、
 シンボリックリンクはできませんので、コマンドプロンプトで作成します。
  1. コマンドプロンプトを起動
    その際、管理者権限で実行する必要があるので「管理者として実行」で開く。

  2. mklinkコマンドを実行
    構文:
     mklink {作成するシンボリックリンク名} {リンク元パス}

    例:
     mklink C:\テストプログラム\info\data1.xml C:\リンク元\info\data1.xml
 [C:\テストプログラム\info]配下に、data1.xml というシンボリックリンクが作成されました。


ディレクトリのリンクを作成する場合は、mklinkコマンドのパラメータに [/d]を付けます。
構文:
 mklink /d {作成するシンボリックリンク名} {リンク元パス}

例:
 mklink /d C:\テストプログラム\info_link C:\リンク元\info 

[C:\テストプログラム]配下に、info_link というシンボリックリンクが作成されました。

これで、プログラムの設定ファイルに "C:\テストプログラム\info_link" を設定すれば、
[C:\リンク元\info]下のxmlファイルを参照するようになります。

シンボリックリンクは、シンボリックリンク自体を削除しても、元ファイルは削除されませんが、
同期しているのでシンボリックリンクのディレクトリ内のファイルを更新、削除すると元ファイルも更新、削除されます。

それではまた。