nakamurk’s diary

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

Pocketに溜め込んだリンクをエクスポートする方法

結論:Pocketのエクスポートは、次のリンクでできます。
https://getpocket.com/export

最近、断捨離を行っています。物を捨てるのをためらわれるのは、そのままなんですけども、まずは整頓していこうと思っています。もちろんもったいない精神が強いので何年も同じ服は着ますし、家で切る服に関しては穴が開いていても、よれていても気にしないタイプです…。

さて、そんな中PCやスマホなどのデジタルの情報は場所を取らないので、つい貯めがちなのでこちらは整理しようと思い何かの足しになればと今回の記事を書きます。 「Pocket」に記事をためて、後で読もうと思っても、つい読まずにためてしまっていたのですが、どうせ読まないから消してしまおうとも思ったのですが、悪い癖で「なんか、もったいない」と消さずにいる今日この頃。さっと消せる性格ならよかったんですけどね。

ということで、冒頭のリンクに話が移りますが、exportのURLにアクセスすれば無事にHTML形式でエクスポートできました。これで心置きなくClearできます!

英語でググるとトップに出てくるんですね…。日本語だとトップのページがキャプチャは載せているのだけど、どこにアクセスしてるかわからずで、イライラしてました(笑)
https://help.getpocket.com/article/1015-exporting-your-pocket-list

タスクスケジューラがどんなアクションを実行しているか確認するためのPowerShellコマンドを考えてみた

お客様からの問い合わせで。Azure ADにデバイスが登録できなかったというので、その調査をしているときの一コマを記録します。

Microsoftのサポートに問い合わせても、うまく解決してくれなかったので…、一般的なトラブルシューティングとして次のDocsを見るわけです。まあそのおかげで弊社に仕事が回ってくると思えば…。

learn.microsoft.com learn.microsoft.com learn.microsoft.com

しかしながら手元にない端末で、特に問題端末の調査に当たるのが作業者の方が非エンジニアだったとしても、あるいは非エンジニアだからこそ可能な限り多くの情報を簡単に吸い出してくれるようにしたいですよね。2つ目のリンクをよく見ると「デバイス登録のトラブルシューティング ツール」というリンクがあることがわかります。そちらには「DSRegTool.ps1」というツールを使ってくれということが書いてあります。Azure ADにデバイスを登録する際に確認すべき様々なコマンドやログが網羅されています。そして、こちらのスクリプトを試しに会社のPCで実行して、これでお客様に情報がいただけるね!と思ったのもつかの間、会社のセキュリティ推進室から、ウイルスに感染したような動きということで、チェックが入りましたorz…。こちらの3000行超えのps1ファイルなのですが、よく見ると、タスクスケジューラにタスクを登録していたのですね。最近Emotetがまた活発になってきたので、そのせいもあるのでしょう…。

そして、こちらのスクリプトの検証がセキュリティ推進室のチェックに引っかかったことが分かったので「何も変なことしてなかったよ!」の証明のため、「タスクスケジューラには変なものは仕掛けてないよ!」っということを言わなければならず、今回のワンライナーを考えたのです。とりあえず時間もなかったのでCSVみたいな出力にして、Bashで検索するようにしました。分業・シンプルにすることが大事ですね。

タスクスケジューラーがどんなアクションを実行しているか確認するためのPowerShellコマンド · nakamurk/nakamurk.github.io Wiki · GitHub

読めば何となく理解できると思うのですが、以下のような作りになっています。

Get-ScheduledTask | foreach {Write-Host $_.TaskName","$_.Actions.execute}
  • Get-ScheduledTask
    • タスクスケジューラのタスクをすべて取ります。
  • foreach {Write-Host $_.TaskName","$_.Actions.execute}
    • 取り出したタスクそれぞれのタスク名と、タスクオブジェクトにあるActionsオブジェクトから実行しているもの(execute)を出力しています。

CSVみたいな出力の仕方が「やっつけ感満載」なのですが、とりあえず動いたのでよしとしました。それにしても、2-3時間今回のウイルス感染疑惑の対応のために溶かしたのマジで萎えますね。

わたしラグビー部でした

今週のお題「わたし○○部でした」

小学校の頃は、兄の背中を追って?バスケ部に入り中学までは続けましたが、高校になって、ラグビー部に入りました。うまくはないし、比較的大き名けがもしてプレーヤーとしては、鳴かず飛ばずでした。まあ、苦い思い出といえば苦い思い出かなと思います。だけれども、「好きだから続ける」という意味で、今でもラグビーには、レフリーと住んでいる都道府県協会の役員?のような形ですが、関わったりしています。

レフリーをしていて思うのは、学生さんはとても純粋にラグビーに打ち込んでおられて、まさにすべてという子もいるということ。それに対してレフリーとして、ちゃんとレフリーできたらいいな、と思いながらも、課題が山積なので選手の皆さんには、申し訳ないなという気持ちがあります。練習試合なのですけどね、一つでも多く、学びの機会にしてほしいなと思うわけで。私のレフリングが今一つで、せっかくの機会に学ぶことが少ないと申し訳ないじゃないですか。しっかり走って、ラグビーを理解して、選手のためになるようなレフリーになりたい。

そして、社会人のカテゴリー、ここでいう社会人とはいわゆるテレビに出るという意味ではなく、草ラグビーだとか、会社のラグビーチームでというクラブの方々だけども、彼らに感じるのは第一に尊敬ですね。私自身が下手ということもあるのだけど、やはり、社会人になってもグラウンドでボールを追いかけられるというのは並みの気持ちではないと私は思います。当然のようにけがもするし、家庭との両立もすごい調整力だと思う。そんな中で、私にレフリーをさせていただけるのですから、公平で安全なラグビーで楽しんでほしいですね。帰るまでがラグビー!間にお酒を挟んでも、帰るまでがラグビー!でお願いしたい。大事なことなので2回言いました。

いくつまでレフリーをできるかはわかりませんが、少しでも選手に楽しい時間と学びを提供できるよう、私自身がトレーニングと勉強をしてこうと思います。

ショート: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