以前GCE上で.NET Coreアプリを定期実行する記事を書いたのですが、
無料枠で動かしたはずなのに課金の通知が飛んできたので、いったん撤退して手持ちのRaspberryPi上で動かすことにしました。
IT系と日常系の備忘録。三日坊主。
以前GCE上で.NET Coreアプリを定期実行する記事を書いたのですが、
無料枠で動かしたはずなのに課金の通知が飛んできたので、いったん撤退して手持ちのRaspberryPi上で動かすことにしました。
普段からKindleで電子書籍を購入してるのですが、Amazonって検索結果が妙に使い勝手が悪く、新刊を見落としてたこともしばしば。
きんどうなどの専門サイトで情報を仕入れてたんですが、当然全部が全部載るわけでもなく。
で、自分で検索用のアプリを作ろうと思ってちまちま書いてたもののUI作るのが面倒で放置しているうちに、しんじさん(id:Shinji_Japan)がAmazonのKindle検索用Chrome拡張を公開されました。
要望を複数対応していただいて必要十分なものになったため、アプリを作る必要がなくなったので、アプリを作るために調べていた情報だけ備忘録がてら纏めます。
タイトルが結論。
Linux環境で動く.NET Coreアプリを書いていた時、ファイル出力処理でファイルパスを指定する際、下記のようにとりあえず記載してました。
var fileName = AppDomain.CurrentDomain.BaseDirectory + @"\FolderName\fileName";
想定としてはプログラムがあるフォルダにFolderNameというフォルダがあり、その中にfileNameというファイルが生成されるというもの。
Windows環境ではこれで問題なく動くものの、Linux環境に持っていくとファイルが出力されていなかったので確認してみると、プログラムがあるフォルダに FolderName\fileName という名前のファイルが。
Windows環境ではパスにバックスラッシュを使うのに対し、Linux環境ではスラッシュを使うため、上記の指定だとうまくいかないと。なるほど。
というわけで、Linux環境で動かす場合はスラッシュに置き換えればいいんですが、Windows環境でも動かすことを想定すると、Path.Combineを利用してやるのが最適解のようです。
こんな感じ。
var fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FolderName", "fileName");
そもそもパスの指定方法が適当ってのは気にしないで・・・。
クエリ文字列(クエリストリング、URLパラメータとも)は
http://www.〇〇〇.com/search.php?△△=〇×
の?以降のこと。サーバーに情報を送るための文字列になります。
StringBuilderで strBuilder.Append("△△=〇×"); とか、Dictionary使ってよく生成してたんですが、特殊記号や全角文字列のエスケープ処理を別途行う必要があるので面倒くさい。
System.Web.HttpUtility.ParseQueryString
を使えばエスケープ処理を自動的にやってくれる。
using System.Web;
中略
var queryString = HttpUtility.ParseQueryString("");
queryString.Add("△△", "〇×");
としてやれば、
queryString.ToString();
でクエリ文字列が生成される。
下記のようにUriBuilderに渡してやれば、スマートにURLが生成可能。
var uriBuilder = new System.UriBuilder("www.〇〇〇.com") {Query = queryString.ToString() };
ちょくちょく忘れるのでメモメモ。
デブな現状を改善するべく、毎日体重を測っています。
以前作った、タニタの体重計のデータを取得してDiscordに投稿するAzure Functionsについて、私の実装が悪かったのか単に設定がおかしかったのかわかりませんが、Azureの課金額が結構な額になってしまい、現在GCEに.NET Coreなコンソールアプリを配置して、定期実行させるようにしています。
現時点でのソースはこちら。
前職ではSVNばかり戯れていたので(もとはVSSだったのでこれでも進歩したほうだった)Git初心者なひつじです。
絶対まとめておかないとまた後で調べなおすことになるのでメモメモ。
Gitだと以前コミットした場所まで
git reset
を使えば戻すことができます。
で、今回このコマンドで戻した際、うっかり二回実行してしまって戻したくないところまでワーキングツリーを戻してしまいました。
AzureFunctionsのlocal.settings.jsonファイルといえば
{
"IsEncrypted": false,
"Values": {
"FUNCTIONS_WORKER_RUNTIME": "<language worker>",
"AzureWebJobsStorage": "<connection-string>",
"AzureWebJobsDashboard": "<connection-string>",
"MyBindingConnection": "<binding-connection-string>"
},
"Host": {
"LocalHttpPort": 7071,
"CORS": "*"
},
"ConnectionStrings": {
"SQLConnectionString": "<sqlclient-connection-string>"
}
}
のような感じで設定情報が保存されてます。
最近Calibreという電子書籍の管理ソフトを使ってます。
このソフトでKindleの電子書籍を管理してるんですが、私はタイトル欄には書籍名と巻数のみだけ、それ以外の情報は消しておきたいというポリシーがありまして、元のタイトルはカスタム列を作成してそちらに入れるようにしています。
こんな感じで。

が、たくさんデータがあるといちいちタイトル欄からコピーしてカスタム列にコピーして・・・ってのが面倒。
なので、Calibreのコマンドを利用して、一気にカスタム列にコピーするソフトを突貫で作りました。
App.config側にCalibreのパスやライブラリパス、コピー先のカラム名、コピー元のカラム名を指定してやると、コピー先カラムに値が書き込まれていない場合にコピー元カラムの値を取得して、コピー先カラムに書き込むだけ。
また、コピー元カラムにコピー先カラム内で利用されている値が含まれている場合に、その値を書き込む処理もフラグを変更したらできるようにしてます(CopyWhenIncludedFlg)。
上の画像でいうレーベルというカラム、単行本レーベルを登録しているんですけど、これも一個一個入れるのが面倒なので、タイトル欄に入っているならそれをコピーして入れておきたいから実装した次第。
実装が糞なので、「ビッグコミックス」と「ビッグコミックススペシャル」みたいなものだとビッグコミックスのほうが採用されちゃうこともあるんですが、まぁいいや。
MarkdownファイルをPDFにするとき、普段はVSCodeのMarkdown-PDFプラグインを使ってるんですが、大量のMarkdownファイルがあるときに一個一個PDFにするのが面倒。
このあたりを使えばいいんでしょうけども、せっかくなので作ってみようと思いまして。
以前中部電力から別の電力会社に切り替えるため、スマートメータを取り付けてもらったんですが、スマートメーターって電力会社との通信だけでなく、個人に対して通信もできるようになってるんですよね。(HEMSとか)
今の電力会社は電力情報をAPIでくれないので(くれる電力会社あるんだろうか)、日々の電力消費量を見るためにはサイトを見る必要があるんですが、スマートメーターから取得できるならそれで確認できるなということで、試してみることにしました。