Lazy Diary @ Hatena Blog

PowerShell / Java / miscellaneous things about software development, Tips & Gochas. CC BY-SA 4.0/Apache License 2.0

「見せたいけどダウンロードはさせたくない」動画の共有方法

機密性の制御が必要な資料を動画として用意する場合の共有方法。 一般的なOfficeファイルなどの場合は以下に記載があったが、動画の場合の情報が見当たらなかったので。 https://licensecounter.jp/microsoft365/blog/2020/07/download-restriction.html

要件

  • 動画はTeamsの録画機能で作る
  • プロジェクト期間中はチームメンバーから見られるようにしたいが、プロジェクトが終了後は公開範囲を狭めたい
  • 動画のコピーを作られると制御が効かなくなるので動画のダウンロードは不可能にしたい

実現方式

  • Microsoft Stream上に動画ファイルを置く場合*1
    • 参照可能ユーザに対し「表示」権限のみを付与し、「所有者」権限を付与しない*2
  • OneDrive for Business上に動画ファイルを置く場合
    • 「ダウンロードを禁止する」オプションを有効にする*3

制限事項

マークアップ言語に対する静的解析

JSPXMLなどのマークアップ言語に対して、たとえば

  • JSP<form:password>タグのshowPassword属性はtrueにしたらダメ
  • JETTでxlsxファイルに<jt:comment>タグは使ったらダメ
  • Apache FOPで<fo:external-graphic>タグのsrc属性に#%や空白が入っていたらダメ

のような、「XML SchemaDTDでは禁止されていないけれど、実運用上よろしくない or 実装上問題を起こすことがあるのでこのシステムでは使用を禁止したい」といったチェック、いわゆる静的解析を行いたいケースがある。静的解析は、マークアップ言語と組み合わせて使われる言語に対する静的解析と合わせて実行できるとよい。

主にはJavaの開発環境を考えたい。Parasoft Jtest 9.xではJSPの静的解析ができていたのだけれど、10.xからはこの機能が削除されてしまった。SpotBugsはBCELを使ってJavaのASTをVisitorパターンで処理することしかできない(BCELのVisitorが元になっている)のでXMLの処理はできない。

調べてみたところ、こういった用途にはSchematron*1が適しているとのこと。Schematronを直接実行できる処理系は存在しない*2と記載している情報もある一方、oXygenというXMLエディタで使える*3と記載している情報もある。ルールはXMLで記載することになっているようだ。できればルールはJavaJavaScriptなどの言語、ないしは他の静的解析ツールと同じ方法で定義したいところだが……

*1:https://www.schematron.com/

*2:https://www.nslabs.jp/xml-schematron-with-relaxng.rhtml

*3:時実象一, "電子ジャーナル記事チェックへの Schematron の利用 『情報の科学と技術』誌の NII-ELS より J-STAGE への移行に際して", 第13回情報プロフェッショナルシンポジウム予稿集, 2016. URL: https://doi.org/10.11514/infopro.2016.0_41

textlintとRedpenの比較

Googleで検索すると"redpen vs textlint"とかが検索候補に挙がるのだけれど、詳細な比較は以下くらいしか見あたらなかった。

A comparison of open-source linters · GitHub

インターネットへのアクセスにある程度制限がかかっている環境下で英語論文を書くことを念頭に比較した。

  • RedPenはJava 1.8.40+が必要。textlintは、生だとNode.js 6.0.0+とnpm 2.0.0+がが必要だが、textlint-app*1であればインストーラを実行すればNode.jsやnpmの個別インストールは不要。
  • RedPenは本体にバリデータを同梱している。textlintは同梱のバリデータがなく、すべてnpmでインストールする必要がある(textlint-appでも同様)。
  • GitHub上での最終リリースは、RedPenは2020/01/05*2, textlintは2021/07/10*3。ブログの最終更新は、RedPenは2017/10/09*4, textlintは2021/05/24*5
  • RedPenはJavaのほかにJavaScriptでも拡張できる*6。けどNashornベースなのでJDK 15以降では使えない*7
  • プレーンテキストのほかに、RedPenはMarkdown, AsciiDoc, Wiki, Re:VIEW, LaTeX, Java プロパティ形式に対応。textlintはデフォルトではMarkdownに対応し、それ以外のフォーマットはプラグインで対応。textlintにはreStructuredTextプラグインがあるのが利点かな(Sphinxのチェックに使える)。
  • RedPenもtextlintもWordファイルを直接検査するプラグイン等は見当たらなかった。xdoc2txtやpandocを使ってプレーンテキストを取り出す必要がある。
  • RedPenはオンラインでお試しできるサービスがある*8。textlintには同様のサービスは見当たらなかった。
  • 探した限りでは、The Chicago Manual of Style, APA style, The Gregg Reference Manualなど特定のスタイルマニュアルへの適合を検証するルールセットはRedPenにもtextlintにもない。

所感

  • プロキシの内側や、閉域環境での手軽な利用を考えるとRedPenの方が便利そう。一方で、RedPenは現状活動が鈍っているように見える。
  • 各種学会のスタイルマニュアルへの適合を検証するルールセットが見当たらないのはツラい。英語で論文を書くときにはこれがあるだけでだいぶ楽になると思うのだが。
  • 文の頭に"So"や"But,"を持ってこないとかはproselintやtextlint(というかRousseau?)でもチェックできるのだけれど、In AdditionでなくAdditionallyを使うとか、Thereforeは文頭でなく文中に持ってくるみたいな点をチェックしてくれるlinterは見つけられなかった。自分でルールを作れということか?
  • RedPenを試したのだが"ISO/IEC 12207"に対して「ISO/IECはミススペルでは」「12207は大きい数字なのでカンマで区切れ」と言われるのはちょっとツラい。オプションをOFFにするとチェック漏れが出そうだし……

英日翻訳時に技術用語をどうするか

奥村先生も言及されている*1通り、歴史的にはたとえばサイエンス社KnuthのTAOCP日本語版がこの方針になっています(タイトルの"Fundamental Algorithms"は「基本算法」)。この本を読むと、日本語の訳語を用意した場合にどんな雰囲気の文になるかだいたい分かるのではと思います。

ドキュメント翻訳時の体験談

英語のドキュメントを和訳した際の体験から言うと、技術用語に対応する訳語を考えるのは難しいことが多いです。たとえば、前提となる文化や語のイメージをどう翻訳するか?というハードルがあります。

例として、バージョン管理システムGitのコマンドには"Plumbing"と"Porcelain"という種別があります。Plumbingが低レベルAPIでPorcelainが高レベルAPIなのですが、これはそもそも水廻り*2のことをイメージしているものと思われます。Plumbingというのは配管のことで、Porcelainというのはツヤツヤした焼き物のことです。ふだん目にするのは焼き物の部分だけで、配管をいじることはそうないというわけですね。

これを翻訳しようとしたときにまず困ったのが、そもそも日本語と英語の陶磁器の区分けが違うようだということです。

  • 日本で使われている水廻りの焼き物は「陶器」*3
  • 日本語では陶器と磁器は原料や焼成温度の違いで明確に分けられている
  • 英語で衛生陶器に対応する場面で使われる語はPorcelain
  • ところがPorcelainに対応する日本語は「磁器」であって「陶器」ではない
  • 英語で陶器はPotteryで、Potteryは高温で焼かれる焼き物一般(陶磁器)を指すためトイレやバスタブのイメージはない

なので、Porcelainを日本語のイメージに合わせて陶器とすると元の英語と食い違うし、英語のイメージに合わせて磁器とすると日本語の文化と食い違うわけです。

次に困るのが、単に配管とか磁器とか言われても、その背景が分からないとどうしてこんな名前がついているのか分からないということです。脚注に訳注を追加して説明することもできなくはないですが止めました。

最終的には、最初に出てきたときに「配管(Plumbing)と磁器(Porcelain)」という説明をして、コマンドの種別を言うときには「配管コマンド」「磁器コマンド」、APIとして言うときにはPlumbing API/Porcelain APIと書くことにしましたが、あまり統一性は取れていないですね……。コマンドラインオプションにも出てくる語なので、PlumbingとかPorcelainとかのままでもよかったかも。

大学でよく見た方法

上記のような背景(コマンドラインオプションに使われるとか)があるためか、大学の先輩や先生は英語由来の技術用語をアルファベットで記載することが多かったように思います。たとえば「既存のdirectoryに新しくrepositoryを作成する」とかですね。コマンドラインオプションなどと対応がとりやすい他に、日本語に直した際に発音の関係で表記が一意でなくなる問題を避けられるメリットがあります。

一方で、日本語の文章にアルファベットを混ぜる表現は、読者側に要求するリテラシーが上がる、つまり読む際のハードルが上がることになります*4日本橋ヨヲコ極東学園天国」で言う「俺英語ダメやねん」というやつですね。たとえば私の高校の授業でも「ディレクトリ」のように書かれており、用語がアルファベットのまま出てくることはなかったと思います。後でも出てくる「オブジェクト指向における再利用のためのデザインパターン」はかなり売れた本のはずですが、版を重ねても変な訳がいっこうに直らない*5……ということから、このレベルの人の層はかなり多いのではと考えています*6

対応する日本語を考える・対応する日本語を作る

英語をカタカナ表記にしてもだめ、アルファベットそのままもだめで、じゃぁ日本語に直せばよいかというと、今度は適切な日本語がない場合があるわけです。たとえば"Design Patterns: Elements of Reusable Object-Oriented Software"*7では"abstraction"という語が出てきていて、これは「対象(たとえばクラス)を抽象化した結果できあがったもの」というくらいの意味です。この訳本である「オブジェクト指向における再利用のためのデザインパターン*8では、たしか"abstraction"を「抽出」と訳していました。文の中で説明なしにいきなり「抽出」と言われても意味が分かりません。「抽象」とすればまだ何とか意味が通ったかもしれませんが、抽象化とごっちゃになってややこしくなりそうなのは想像がつきます。

これを乗り越えるには、やはり杉田玄白福沢諭吉のように新しい語を作るしかないと思われます。ただ、福沢諭吉にしても康熙字典を総当たりで適した字がないか探し、その上で考えた語も別の言葉に駆逐されたものが多くあるということで*9、訳者に求められる知識も作業量も半端なものではなさそうです。そのうえ、作った語は現在日本語にはない語なのですから「そんな日本語はない!」という圧力に耐える必要があるわけです。まったくどういう脳ミソしてんだという気になります。

専門ではないのですが、参考になるのではと思うのが中国語の場合で、software=軟件、Microsoft=微軟のように直訳のものもありますが、smartphone=手机のように意訳がなされているものもあります*10。この意訳の際のプロセスってどうなってるんでしょうね? なお中国語の漢字をそのまま持ってくればいいじゃない、と思うかもしれませんが、これはおそらく落とし穴があって、中国語と日本語の漢字の意味の差に引っかかるのではと思います。コンピュータに関連しそうな用語だと「下流」とか「処理」とかですね。

余談ですが、私の妻はよく「どうして最近は福沢諭吉のように英語に対応する日本語を考える人がいないのか?」と私に聞きます。最新のテクノロジーを日本語で理解したい!という要望は確実にある一方で、英語を日本語に直すときに何を考える必要があるか?という作業量のイメージには、人によって大きな差があるようです。

*1:https://twitter.com/h_okumura/status/1436842705603100676?s=20

*2:というかおそらくトイレでは

*3:衛生陶器。例: https://www.ceramic.or.jp/museum/contents/pdf/2008_05_01.pdf

*4:例: https://satob.hatenablog.com/entry/20070512/p1

*5:https://satob.hatenablog.com/entry/20051216/p3

*6:英語を読める人が日本語訳を読んでいれば翻訳が変なのには気付くので、もっと早く訳が直るはず、という想像

*7:Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, "Design Patterns: Elements of Reusable Object-Oriented Software", Addison-Wesley, 1995.

*8:エリック・ガンマ, ラルフ・ジョンソン, リチャード・ヘルム, ジョン・ブリシディース(著), グラディ・ブーチ(まえがき), 本位田真一, 吉田和樹(監訳), "オブジェクト指向における再利用のためのデザインパターン", ソフトバンクパブリッシング, 1995.

*9:四書五経とかの知識も翻訳では役立っているのではと想像したのだが、そういう記載は見当たらなかった

*10:余談ですがalgorithmは中国語でも算法というようです。programは算譜ではなく程序となっていました。

Record the mouse position and the top window title to Windows Event Log

Requirement

  • Record the user activity to Windows Event Logs.
  • The mouse position*1 and top window title *2 are used to indicate the activity.

Solution

Run the following PowerShell script every 5 minutes from the Task Scheduler.

Add-Type -AssemblyName System.Windows.Forms
$x = [System.Windows.Forms.Cursor]::Position.X
$y = [System.Windows.Forms.Cursor]::Position.Y

$code = @'
    [DllImport("user32.dll")]
     public static extern IntPtr GetForegroundWindow();
    [DllImport("user32.dll")]
    public static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, out int ProcessId);
'@
Add-Type $code -Name Utils -Namespace Win32
$myPid = [IntPtr]::Zero;

$hwnd = [Win32.Utils]::GetForegroundWindow()
$null = [Win32.Utils]::GetWindowThreadProcessId($hwnd, [ref] $myPid)
$process = (Get-Process | Where-Object ID -eq $myPid)
$path = ($process | Select-Object Path).Path
$title = ($process | Select-Object MainWindowTitle).MainWindowTitle

Write-EventLog -LogName MyLogName -Source MyLogSource -EventID 1 -Category 0 -EntryType "Information" -Message "X=$x, Y=$y`n$path`n$title"