nakamurk’s diary

日々思うことは残していきます。しっかり生きます。

ショート:Windows Terminalでリンクはブラウザに直接飛べるけど、ローカルファイルではできないの?(解決方法教えます)

今週のお題「鬼」

ということで、ブログを久しぶりに書きます。三日坊主の鬼(←無理やり)さて、ことの発端はこちら!

タイトルの件を何とかできないかと、仕事のための勉強を差し置いて、解決してみました←ちゃんと勉強しろ!

  1. HOGEさんのターミナルで、hogeという関数を作る
  2. hoge関数でカレントディレクトリの.vimrcを指定する
  3. 標準出力にURL形式のファイルパスが表示される
  4. Ctrlを押しながらリンクをクリックするとExploreで開かれる

HOGE$ hoge() { declare in="${1:-$(</dev/stdin)}"; echo $in; readlink -f $in | sed "s;^\/mnt\/c;file:\/\/\/c:;g" ; }
HOGE$ hoge ./.vimrc
file:///c:/Users/HOGE/.vimrc

おかしいよとか、もっと楽にできるよっていう情報がありましたらご連絡ください!

はい、まとまったので勉強に戻ります。

参考にしたリンク

【PR】ディスク管理するために

CSについて知識がないので、手始めにディスクの管理してみたいな、と考えました。脈略ないのですけどね。学生の時に学んでいたらよかったな…。ディスクのストレージ管理ができるというMiniTool Partition Wizardを使ってみたので、その記録を。


私の環境

  • os
    • エディション:Windows10Pro
    • バージョン:21H1
    • OSビルド:19043.1165
  • ディスク
PS C:\WINDOWS\system32> Get-Volume

DriveLetter FriendlyName FileSystemType DriveType HealthStatus OperationalStatus SizeRemaining      Size
----------- ------------ -------------- --------- ------------ ----------------- -------------      ----
            Recovery     NTFS           Fixed     Healthy      OK                     10.65 GB   29.3 GB
            System       NTFS           Fixed     Healthy      OK                    254.76 MB    300 MB
C           Windows      NTFS           Fixed     Healthy      OK                     93.95 GB 208.27 GB
                         NTFS           Fixed     Healthy      OK                     49.65 MB    632 MB

勉強したこと

とりあえず、ファイルシステムとか字義的な意味は知っているつもりですが、どちらがおすすめとか説明できないので、勉強しました。Windows自体が用意した「ディスクの管理」で何ができるかをDocsを見て調べたのですが、詳細すぎるというか、初めからそこは考えれないだろうなという粒度の内容でした。プロなら、そこまで考える必要あるんだろうな。

ディスク管理をしてみたい

Windowsの「ディスクの管理」は使いにくいというか、わかりにくかったので、ディスク管理で検索して上位の方に出てきた「MiniTool Partition Wizard」について使ってみることにしました。自分の備忘も併せて、ブログに書いておきます。製品のリンクはこちら:https://jp.minitool.com/partition-manager/。メタタグのdescriptionは次の文章です。

MiniTool Partition Wizard|Windows PCとサーバー向けの最高のPartition Magic代替ソフト
最高のPartition Magic代替ソフトとして、MiniTool Partition Wizardは、Windows 10/8/7/XPおよびServer 2003/2008/2012/2016用の最新のパーティションマネージャソフトウェアです。

「Partition Magic」ってなんだ?

パーティションマジックよりも簡単な初心者向けフリーソフト

まずもってパーティションマネージャーが分からないのですが、こちらですね。そのままですがディスクの管理を行うアプリケーションみたいですね。すでにアプリケーションの更新が止まってしまったようです。

「MiniTool Partition Wizard」ってなんだ?

MiniTool Partition Wizard Free Edition のダウンロードと使い方 - k本的に無料ソフト・フリーソフト

それに比べると、今回調べたMiniTool Partition Wizardは2021-07に更新されていたので、安心ですね。更に驚いたのは、そして正直なところ、こういったアプリケーションは裏で何やっているかわからないので、怖い側面があると思うのですが、こちらを作成している会社はMicrosoftに認められたパートナーということなので、信用してよいのかなと思いました!

Microsoft Solution Providers

インストール

そして、とりあえず触ってみたいので、インストールしました。パーティション管理ができるMiniTool Partition Wizard Freeだけでなく、ディスクのバックアップができるMiniTool ShadowMaker Freeもついてくるようです!Free版なので、当然、商用利用はできません。次に機能の比較のリンクですが、無料版でもたくさんの機能があるみたいです。それぞれの機能名がそのままやりたいことにつながっているように思います。有料版はいくつか機能が追加されるみたいですね。知識不足で、そのあたりが重要かどうか判断できなかったです…。有料版にはいくつか種類があるようですが、お金の払い方の違いのようですね。

MiniTool Partition Wizard バージョン別機能一覧

サーフェステスト

とりあえず、私の使っているPCは中古のノートPCなので、ディスクの状態を確認するサーフェステストを使ってみました。下記のヘルプと同じことなので、見どころはないのですが、、、良かったです。すべてのパーティションで特に問題はありませんでした!こういうことが気軽にできるのうれしいですね。

ディスクのサーフェステスト方法| MiniTool Partition Wizardのチュートリアル

f:id:nakamurk:20210914005048p:plain
パーティションを右クリックする

f:id:nakamurk:20210914005520p:plain
実行前

f:id:nakamurk:20210914005701p:plain
実行完了

f:id:nakamurk:20210914005725p:plain
エラーなし!

ディスク使用状況分析

次はディスク使用状況を分析してくれる機能を使ってみることにしました。ディスク使用状況分析で、どこにどのくらいファイルがあるかを確認しました。どのフォルダが、どれだけ容量を使っているかが、GUIでサクサク確認できて、バックアップ先の容量を試算するときなどは重宝しそうです!エクスプローラーでプロパティを見たときはすごく時間かかりますが、こちらはディスク全体を検索したはずなのに1分くらいで完了しました!

ディスク使用状況分析を使用する方法| MiniTool Partition Wizardチュートリアル

f:id:nakamurk:20210914003745p:plain
起動後の画面

f:id:nakamurk:20210914003928p:plain
ディスク使用状況分析を選択

f:id:nakamurk:20210914004028p:plain
実行前

f:id:nakamurk:20210914004114p:plain
分析場所の選択

f:id:nakamurk:20210914004147p:plain
分析中

f:id:nakamurk:20210914004236p:plain
実行後

使ってみて

マニュアルがとても丁寧に書かれている印象でした!管理するほど、今使っている環境に大切なものはないのですが、実運用を見越して、Raid構成とか考えてみるのも面白いと思いました。外付けのストレージも面倒見てくれるみたいだし、バックアップとかもできそうなので、もう少し勉強してみようかなと思います。

結果は「気軽に使えて、GUIも自然でサクサク動いていい感じ」でした。とりあえずマニュアルを見ましょう!

MiniTool Partition Wizard オンラインマニュアル

映画「ザ・サークル」(2020/05/17、Gyao!にて)

昔の下書きを投稿…

エマワトソンかわいい。ので観ました。ソーシャルネットワーキング疲れと、

SNSのフィルター越し、、、 ・スマフォ片手に自分以外の誰か、何かを撮る。 ・プライバシーと言うが、何でもかんでも撮ってはあげる。

管理、何者かに搾取、  これまでは「試験に通った特権階級」これからは「頭のいかれたギークたち」…

金も保証も

秘密の暴露

新しい社会主義  最適解ではなく、

煽り 普通のひとが大勢にみられる生活に耐えられるはずがない  生まれついた才能があっても   ふつうは段階を経るのである

私の解法(ABC194_Cについて)

ブログ(アウトプット)を再開するためにこちらを書きます。今回は、2021年3月6日(土)に実施されたAtCoder Begginer Contest194のC問題について(C - Squared Error*1、私の解法を解説します。

TL/DR

考え方

愚直な実装

Σの分だけ二重ループで解こうと思うと、次のようになると思います。

#include 
#define ll long long
using namespace std;

int main() {
  ll N, ret = 0; cin >> N;
  vector A(N+1); // 0オリジン(始まり)なので+1しています
  for (int i = 1; i <= N; i++) cin >> A[i];

  for (int i = 2; i <= N; i++) {
    for (int j = 1; j <= i - 1; j++) {
      ret += (A[i] - A[j]) * (A[i] - A[j]);
    }
  }
  cout << ret << endl;
  return 0;
}

しかし、これでは、入力例は問題なくても、次で詳細を説明するTLEが起こりそうな量の入力には耐えられません。

  • 入力例1

    $ IN=1.in; cat $IN; timeout -sKILL 2 bash -c "time ./a.out < $IN"
    3                // 入力
    2 8 4
    56               // 出力
    real    0m0.017s // 計算時間
    user    0m0.001s
    sys     0m0.005s
    

  • 入力例2

    $ IN=2.in; cat $IN; timeout -sKILL 2 bash -c "time ./a.out < $IN"
    5
    -5 8 9 -4 -3
    950
    real    0m0.017s
    user    0m0.000s
    sys     0m0.006s
    

  • 最大の入力例

    $ IN=stdin.; head $IN; timeout -sKILL 2 bash -c "time ./a.out < $IN"
    300000
    18
    72
    -144
    3
    10
    -57
    94
    106
    149
    Killed                          // TLE
    

私の解法

N=3で式を眺めてみます。簡単のためAiをabcと表すことにします。


\sum_{i=2}^3 \sum_{j=1}^{i-1} (A_i - A_j)^2  \\
= (b - a)^2 + (c - a)^2 + (c - b)^2  \\
= (b^2 -2ba + a^2) + (c^2 - 2ca + a^2) + (c^2 - 2cb + b^2) \\
= 2(a^2 + b^2 + c^2) - 2(ba + ca + cb)

同様にN=5で式を眺めてみますと、次のようになります。


\sum_{i=2}^5 \sum_{j=1}^{i-1} (A_i - A_j)^2  \\
= (b - a)^2 + (c - a)^2 + (c - b)^2 \\
 + (d - a)^2 + (d - b)^2 + (d - c)^2 \\
 + (e - a)^2 + (e - b)^2 + (e - c)^2 + (e - d)^2 \\
= (b^2 -2ba + a^2) + (c^2 - 2ca + a^2) + (c^2 - 2cb + b^2) \\
 + (d^2 - 2da + a^2) + (d^2 - 2db + b^2) + (d^2 - 2dc + c^2) \\
 + (e^2 - 2ea + a^2) + (e^2 - 2eb + b^2) + (e^2 - 2ec + c^2) + (e^2 - 2ed + d^2) \\
= 4(a^2 + b^2 + c^2 + d^2 + e^2) - 2(ab + ab + ad + ae + bc + bd + be + cd + ce + de)

ここで、それぞれの項の特徴に気が付きます。

  • 2乗の項
    • ①自身以外の項との組み合わせの数だけ項が存在する:N-1個
  • 各項の積
    • ②aからeの入った袋から2つ球を取り出すときの組み合わせの数

②に関して、安直に組み合わせを考えると、次のようにTLEを起こしそうです。


_N C _2 = \frac{300,000 x 299,999}2 = 44,999,850,000

ですので、計算方法でカバーします。第2項だけに着目すると次のように計算量を少なくできそうです。


ab + ab + ad + ae + bc + bd + be + cd + ce + de \\
= a(b + c + d + e) + b(c + d + e) + c(d + e) + de

これが私の実装の解説となります。変数名などが今一つですが、コード長は423 Byte、実行時間63 ms、メモリ5480 KBと、そこそこの実装だと思います。

テスト(タイムアウトをしないか試験する)

ABCのC問題は愚直に計算するとTLEが起きる問題が多いと思うので、ローカル環境でも、TLE が起きそうなケースを試しておくとよいと思います。

コマンドの準備(汎用的)

Linuxのコマンドにタイムアウトというものがあります。

$ timeout --version
timeout (GNU coreutils) 8.30

タイムアウトさせたい時間とその時のシグナルを設定できます。

# timeout -sKILL 2 ./a.out < stdin

また、実行時間も計測したいので、timeコマンドも挟んでみましょう。

$ timeout -sKILL 2 bash -c "time sleep 1"

real    0m1.003s
user    0m0.001s
sys     0m0.001s

sleep(実行時間を想定)がtimeoutを超えると次のようになります。

$ timeout -sKILL 2 bash -c "time sleep 3"
Killed

今回のテストデータの準備

試験本番ではテストデータの用意の仕方間違えました…。

$ echo 300000 > stdin; for i in `seq 1 300000`; do echo $i >> stdin; done
$ head stdin
300000
1
2
3
...

これでは制約事項「@|Ai|<=200@」が満たされていませんね。実際に入力してみると桁あふれしていることが分かります。

$ ./a.out < stdin
-7529530734753409792

ですが、実行時間だけを取ってみれば、間に合っていることが分かります。私はこの段階で、提出をしました(汗)。

$ timeout -sKILL 2 bash -c "time ./a.out < stdin"
-7529530734753409792

real    0m1.072s
user    0m0.236s
sys     0m0.079s

本来であれば、絶対値が200以下の自然数ですので、次のように与えるべきですね*2。そして、これでは完全なランダムではないですが一旦置いておくことにします。10秒ほどで、テストデータが作成できました(答えは不明です…)。

$ time (echo 300000; while true; do echo $(( ($RANDOM - 16383) % 200 )); done) | head -n 300001 > stdin

real    0m9.753s
user    0m7.171s
sys     0m10.019s

$ head stdin.
300000
18
72
-144
3
10
-57
94
106
149

実際に実行してみると、次のようになりました。1秒以内に結果が出力されているので問題なさそうですね。

$ wc -l stdin; timeout -sKILL 2 bash -c "time ./a.out < stdin"
300001 stdin
1187018545951196

real    0m0.701s
user    0m0.190s
sys     0m0.036s

蛇足

記事書くの大変ですね。この文章で5,000文字くらい(原稿用紙12枚、35ツイート分)で、2,3時間くらいかけました。丁寧な解説をされている先輩方には頭が上がりません。また、感想戦?組の実装は驚異的です。bashawkでの実装までありました。もはや脱帽というか、禿げそうです!それは脱毛w

https://m.media-amazon.com/images/I/41oruV+aJIL._SL75_.jpg https://m.media-amazon.com/images/I/51TtkYDXZFL._SL75_.jpg https://m.media-amazon.com/images/I/51hkUx5456L._SL75_.jpg

とある社畜の振り返り(2021年3月7日)

お題「#この1年の変化

数か月ぶりの投稿になります。筆まめになりたいものです。さてと…。

会いたい人・会いたくもない人と対処の仕方

家族や大好きな異性、あるいは行きたいお店など、わたしにも好きな人がいるのですが、そういう人には会いたいという気持ちと、今だから会いに行けないという気持ちがあり、とても葛藤していますね。少ない機会を設けたり、日ごろはなるべくほかの人との接触を避けるようにしています。

他方で、会わなくてもいいじゃんという人はたくさんいます。愚痴になるのであれですが、仕事をしているととうにね(笑)。誰かを否定しているだけの人、自分が常に正しいと言っている人、大した力もないのに上に立ち声だけ大きい人もういいですねそういう人、4月に部署移動するのですが、正直なところ早くバイバイしたいですね。反面教師にしかならないので、同じ時間を過ごすだけで、機会の損失なんですよね。こちらは、会いたくないという気持ちと、仕事だからしょうがなくコミュニケーションしなければいけないという気持ちで、葛藤しています。私が大人になって、我慢するのですよ。あの人たち、全体を見れない子供なんで(´;ω;`)

時間は掃いて捨てるほど存在しない

そして、転職や移動なども考えた一年でした。31歳になって、自分のやりたいことってなんだっけ?と、考えても何がしたいのかわからない自分がいました。反省です。プログラマーになりたかった小学生の頃の自分、今やている仕事はSIerということですが、自分の思っているプログラマーの仕事とは程遠く、でもお客様がいて、間違いがあってはいけないから正しいことをするために自分の時間を浪費する。そんな感覚ですね。だからこと一生懸命にもがいて走り続けても、会社での成果しかないと。お客様に喜んでいただけることはあっても、会社から評価されないのはアンバランスでしたね。Fワードが出てきてしまいそうになります。

そんな中で、現在は在宅中心の仕事になって、読書や筋トレなどの時間が確保できています。とても良い傾向です。開発がしたいと言っても、いろいろなニュアンスがありしっかり説明できていなかったので、私は次のような分類で勉強し始めています(まだまだビギナーから抜け出せていません)。カッコ内はそのためにしていること。

  • アルゴリズム競技プログラミング
    • 計算量の部分ですね。考えなくてもいい時はありますが、リソースが有効に使えたり時間が早くなるので大切になるときがあります。
  • セキュリティ(CTF)
    • コンピュータを利用して仕事をするのに切っては切り離せないものですね。セキュリティがざるでは信用問題です。ゲームのように楽しみながらやっていきます。基礎というか、(業務じゃ全く触れられないような)大前提の知識だったりするので見過ごせません。
  • 機械学習(Kaggleなどのコンテスト)
    • 少し飛びつくのが遅れましたがキャッチーな奴です。まだまだ、本を読んで、初心者コンテストに出たくらいなので、少しずつ成長します。
  • その他知識(IPAなど資格試験)
    • コンピュータサイエンスの基本的な知識ももっとつけたいですね。IPAの試験は系統的に学ぶことができるので、ちゃんとやります←。
  • サービス作成(言語、フレームワークチュートリアル
    • アプリ作成やビジネスなど漠然と憧れるところ。ですが、何をしていいのかわからないし、何から手を付けていいのかわからなかったところ。今は、ひたすらに言語やサービスにチュートリアルを試すことにしています。全然時間とれてないけど…。

気が付いたのは、まだまだ勉強が足りていないということと、ITという分野は好きで、これから先もずっと仕事にしていくのだろうなということ。ただし、しこたま残業はあるので、その穴埋めのためにアニメを見たり、ぼーっとしてしまうので、ライフワークバランスを直したいと考えています。

VScodeの環境整備でWSLのパスワード忘れてて笑った話

AtCoderでローカルではコンパイルできたのに、提出したらCE(コンパイルエラー)になった。 AtCoder用の環境を整理してて、ローカル環境のパスワードとかを忘れてしまったので、対処メモ。

TL;DR

  • 開発環境:Windows10、VScode、WSLインストール済み
  • 何が起きた:WSLでアプリをインストールしようとしたらパスワード忘れて詰まった
  • 何をした:WSLでパスワードリセットした
  • 残り物:あれ?ローカルだと普通にコンパイルできるんですけど。。。ちょっと難しい算術演算ができない?

環境構築

AtCoderでプログラミングを勉強中だが、よく考えたらVScodeの使い方とかちゃんと調べてなかったので、調べたら、、、パスワードが分からなくなってて詰んだ(笑)

【VScode+WSLで始める】競プロ用C++デバッグ環境構築 - Qiita

AtCoderコンパイルオプションとか重要ですよね。

WSLのパスワードリセット

ということで、はい、こちらで簡単にできましたね。

WSLでLinuxのパスワードを忘れてしまった場合の対処法 | LFI

  1. ログインユーザーをrootにする(パスワードなしで入れる)
  2. ubuntu1804を起動。rootでログインできたことを確認
  3. 一般ユーザのパスワードを変更する
    • 今回はnakamurkを変更
      root@DESKTOP-MIE219J:~# passwd nakamurk
      Enter new UNIX password:
      Retype new UNIX password:
      passwd: password updated successfully
      
  4. 安全のためログインユーザを一般ユーザ(私の場合はnakamurk)に戻す

この節は以上

略語

「あしたの家族のつくり方」を観て

2020年3月8日、Gyao!にて鑑賞。日本生まれ、日本育ちで、アメリカの文化にも疎い私が感じたのは、なんというか、似て非なる高校生生活ということでした。イースターの文化、ホームパーティー、教会で育つ。どれも、ぴんとは来ないし、国家や国境というものについても、価値観が大分違うと感じました。

あるべき姿と閉塞感

邦訳はどことなく、もったりしている印象ですが、原題は「As Cool as I Am」ですたぶん。オープニングにでかでかと出てました。英語できないけど、たぶん直訳すれば「私の思うように生きるって素晴らしい」と言う意味ではないかと思いまう。作中も、それぞれの葛藤と衝突。そして、自分らしく生きようというのが主題にあったように思います。どこか、主人公の親世代が型にはまってしまい、自分らしさと言う型に自身を押し込めて生活をする毎日。ストレスを見ないふりして頑張ったけど、何か歯車が狂うと、途端に押し込めていたはずの感情が爆発して、生活がうまくいかなくなてしまう。でも、どうしようもない…。子供にも、それを当てはめようとします。

しかし、主人公とその同級生たちは、閉塞感ではなく、自分の中の正義と不安、そして若さゆえの過ちもありながら、柔軟に大人たちと対話している姿が、描かれていたように思います。もちろん明らかな過ちや、虚栄ともいえる対応もありましたが、それでも、今を生きている感じがして勇気づけられます。高校生の姿に、30のナイスミドルであるはずの私が(笑)。また、少し生々しい表現があったりで、夕飯時には家族で見れません!

大人はどことなく汚いですね。押しつけもあるし、歪んだままな気がする。料理関係の人と病院の人くらいじゃないですかね、この映画でまともな大人。子供たちのためになる大人ってやつは。好きなように生きることは、確かに自己責任で歩いていかなければならないと思いますが、それは決して、誰かを踏み付けていくこととは違うと、私は思います。

お求めはこちら

90分くらいなので、サクッとみられるかと思います!2020年3月15日(日) 23:59までは #GYAOで!それ以降はAmazonで!