.NET CoreでLinux環境を用いる場合、ファイルパス生成はPath.Combineを使うべき

タイトルが結論。

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");

そもそもパスの指定方法が適当ってのは気にしないで・・・。

参考

クエリ文字列を生成するときのメモ(C#)

クエリ文字列(クエリストリング、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() };  

ちょくちょく忘れるのでメモメモ。

タニタHealthPlanetのAPIのOAuth再認証について

デブな現状を改善するべく、毎日体重を測っています。

以前作った、タニタの体重計のデータを取得してDiscordに投稿するAzure Functionsについて、私の実装が悪かったのか単に設定がおかしかったのかわかりませんが、Azureの課金額が結構な額になってしまい、現在GCEに.NET Coreなコンソールアプリを配置して、定期実行させるようにしています。

現時点でのソースはこちら。

続きを読む

Gitでうっかり必要なコミットまでresetしてしまったときの対応

前職ではSVNばかり戯れていたので(もとはVSSだったのでこれでも進歩したほうだった)Git初心者なひつじです。
絶対まとめておかないとまた後で調べなおすことになるのでメモメモ。

Gitだと以前コミットした場所まで

git reset

を使えば戻すことができます。

で、今回このコマンドで戻した際、うっかり二回実行してしまって戻したくないところまでワーキングツリーを戻してしまいました。

続きを読む

Azure Functionsでは階層のある設定ファイルを使えない

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でカスタム列に値を突っ込むプログラム

最近Calibreという電子書籍の管理ソフトを使ってます。

このソフトでKindleの電子書籍を管理してるんですが、私はタイトル欄には書籍名と巻数のみだけ、それ以外の情報は消しておきたいというポリシーがありまして、元のタイトルはカスタム列を作成してそちらに入れるようにしています。

こんな感じで。

が、たくさんデータがあるといちいちタイトル欄からコピーしてカスタム列にコピーして・・・ってのが面倒。

なので、Calibreのコマンドを利用して、一気にカスタム列にコピーするソフトを突貫で作りました。

App.config側にCalibreのパスやライブラリパス、コピー先のカラム名、コピー元のカラム名を指定してやると、コピー先カラムに値が書き込まれていない場合にコピー元カラムの値を取得して、コピー先カラムに書き込むだけ。

また、コピー元カラムにコピー先カラム内で利用されている値が含まれている場合に、その値を書き込む処理もフラグを変更したらできるようにしてます(CopyWhenIncludedFlg)。
上の画像でいうレーベルというカラム、単行本レーベルを登録しているんですけど、これも一個一個入れるのが面倒なので、タイトル欄に入っているならそれをコピーして入れておきたいから実装した次第。
実装が糞なので、「ビッグコミックス」と「ビッグコミックススペシャル」みたいなものだとビッグコミックスのほうが採用されちゃうこともあるんですが、まぁいいや。

Markdownファイルを一括PDF変換するソフトを作った

MarkdownファイルをPDFにするとき、普段はVSCodeのMarkdown-PDFプラグインを使ってるんですが、大量のMarkdownファイルがあるときに一個一個PDFにするのが面倒。

このあたりを使えばいいんでしょうけども、せっかくなので作ってみようと思いまして。

続きを読む

スマートメーターと通信するためのあれこれ(申請編)

以前中部電力から別の電力会社に切り替えるため、スマートメータを取り付けてもらったんですが、スマートメーターって電力会社との通信だけでなく、個人に対して通信もできるようになってるんですよね。(HEMSとか)

今の電力会社は電力情報をAPIでくれないので(くれる電力会社あるんだろうか)、日々の電力消費量を見るためにはサイトを見る必要があるんですが、スマートメーターから取得できるならそれで確認できるなということで、試してみることにしました。

続きを読む

Google Compute Engine(無料枠)のLinux上で.NET Coreアプリを定期実行させる

Azure Functionsで動かしていたプログラムがあるんですが、(たぶん実装が悪いのだけど)課金が結構な額となってしまい、またDBを使うとなるとそれはそれでよい金額となってしまいます。

というわけでAzure Functions用に作っていたプログラムを.NET Coreのコンソールアプリとして置き換えて、Google Compute Engine上のLinuxで動かすことにしました。

続きを読む