Officeの一時ファイルやThumbs.dbなどをPowerShellで一掃

ファイルサーバの空き容量が減ってきたので調べてみたら、 削除されていないOfficeファイルの一時ファイルや、Thumbs.dbが結構あることが分かった。 Thumbs.dbはグループポリシーでネットワークドライブ上では生成しないようにしているはずだが、 ローカルのフォルダをファイルサーバにコピーすると、一緒にくっついてくるらしい。 以下のPowerShellスクリプトをタスクスケジューラに登録して、定期的(1日1回)にゴミ掃除。 $a = @() $a += Get-ChildItem "(掃除対象フォルダのパス1)" -Force -Recurse $a += Get-ChildItem "(掃除対象フォルダのパス2)" -Force -Recurse $a += Get-ChildItem "(掃除対象フォルダのパス3)" -Force -Recurse $a | Where-Object { ` $_.Name -like "~*" -and $_.LastWriteTime -lt (Get-Date).AddDays(-1) ` -or $_.Name -like "*.tmp" ` -or $_.Name -eq "Thumbs.db" ` -or $_.Name -eq ".DS_Store" ` -or $_.Name -like "._*" ` } | Remove-Item -Force 削除対象は以下の通り。 更新日時が1日以上前のOffice一時ファイル("~*") 拡張子が"tmp"のファイル "Thumbs.db" .DS_Storeや._*などのMac OSで使用されるファイル

Unicode制御文字(LRO, RLO)でコピー・改変を防止 (構想)

Unicode制御文字のうち、LRO(Left-to-right override, U+202D)とRLO(Right-to-left override, U+202E)は 行中でも文字列の方向を変更する。 1行の中に何度もLROとRLOが入ると、カーソルキーが踊って楽しいことになる。 例: 下のテキストボックスの中の文字列を編集したり、カーソルキーで移動しようとしても上手くできないはず。 ‮‭い‮を‭ろ‮る‭は‮ぬ‭に‮り‭ほ‮ち‭へ ‮‭わ‮む‭か‮ら‭よ‮な‭た‮ね‭れ‮つ ‮‭う‮て‭ゐ‮え‭の‮こ‭お‮ふ‭く‮け‭や ‮‭あ‮す‭さ‮せ‭き‮も‭ゆ‮ひ‭め‮ゑ‭み ※ Edgeは表示が崩れるので、Ctrl + A→Ctrl + Cでメモ帳にコピペで確認可能。 表示上は普通のいろは順にひらがなが並んでいるように見えるが、 実際のデータはまったく違う順序になっている。 ↓通常のテキスト (比較用) いろはにほへとちりぬるを わかよたれそつねならむ うゐのおくやまけふこえて あさきゆめみしゑひもせす 作り方 行内の文字列の順番を入れ替えつつ、LROとRLOを交互に挿入。 以下のMathematicaコードで上記の例を作成した。 StringScrumble[str_String] := Module[{chars, chars2}, StringJoin[Riffle[( chars = ToCharacterCode[#]; chars2 = Join[{16^^202e}, Riffle[chars, Reverse[chars]]][[1 ;; Length[chars]]]; FromCharacterCode[Riffle[chars2, {16^^202d, 16^^202e}]]) & /@ StringSplit[str, "\n"] , StringCases[str, "\n"]]]] StringScrumble["いろはにほへとちりぬるを\nわかよたれそつねならむ\nうゐのおくやまけふこえて\nあさきゆめみしゑひもせす"] 各種デバイス・アプリでの表示 上記の文章をメールで送信し、各種端末で受信メールで表示してみた。 ChromeやFirefoxなどブラウザは狙い通り表示された。 Edgeはテキストボックス内ではダメだったが、それ以外の場所ではOK。 Outlookでの表示もOK。 iPhoneのメッセージ、メール、GmailはいずれもOK。 テキストエディタについてもどう表示されるか確認した。 メモ帳は意外にもちゃんとBiDi対応だった。 geditは行頭にRLOがあると右寄せで表示してしまう(こういう表示のほうが正しいかもしれないが)。 Windows 10 Edge: Outlook: メモ帳: Ubuntu 16.

Hugo + GitHub Pages + CloudFlareにGoogleサイトから移転

今まで独自ドメインでGoogleサイトを利用してきたが、 「新しいGoogleサイト」の機能が全然ダメ(特にガジェットが使えなくなる)で使い物にならない Google自身が推進している常時SSL化も独自ドメインでは機能しない(正確にはMixed Contentsを修正できない) 無駄に色々と読み込むせいで遅い ということで他のサービスへの移転を決断。 AWSやGCP上に構築することも考えたものの、 大したPVでもないので無料で使える組み合わせとして、以下の構成にした。 Hugoを使って静的にサイトを生成 GitHub Pagesにアップロード CloudFlareを使って常時HTTPS化に対応 Hugo + GitHub Pagesの部分は Hugo + Github Pagesでブログを公開してみた を参考にした。 Hugo Ubuntuではapt-getでHugoをインストールできる(最新版とは限らないので注意)。 $ sudo apt-get install hugo テーマは、少し古いバージョンのHugoでも動作するMainroadに決定。 後は以下の作業を実施。 今までGoogleサイトのガジェットで行っていたGoogle MapsでのKMLファイルの表示を行うShortcodeを作成。 CSSファイルをいじって横幅を拡大。 コードのシンタックスハイライトを行うため、highlight.jsを読み込むようlayouts/partials/header.htmlを修正。 GitHub GitHubにGitHub Pages用のリポジトリとHugo自体のリポジトリを作成。 ここでUser Pages(リポジトリ名: (ユーザ名).github.io)で作成し、 CNAMEファイルで独自ドメインを設定すると、 GitHubの他のリポジトリにも独自ドメインの設定が反映される。 そのため、今まで(ユーザ名).github.io/(プロジェクト名)/のURLが (独自ドメイン)/(プロジェクト名)/にリダイレクトされるようになる。 既存のプロジェクトページすべてのURLが変更になってしまうし、 今後ホスティング先をGitHub Pagesから別のサービスに移行するときにまた変更することになる。 そこでUser Pagesは作成せず、Project Pagesとして作成する。 c.f. Custom domain redirects for GitHub Pages sites ページ移転作業 各ページを手作業でコピペ。 1日5ページ〜10ページくらい移行作業した。 画像については、Chromeの開発者ツールで、

動画ファイルからDVDオーサリング

「この動画ファイルをDVDに焼いて。簡単でしょ。」 いやいや、DVD-Video規格に沿った動画ファイルとファイル構造にしないといけないんですけど。 Windows用のオーサリングソフトはフリーでも色々あるが、どれが良いのかよくわからないので、 ffmpeg + dvdauthor + mkisofsでISOファイルを作成するバッチファイルを作成した。 参考サイト : http://d.hatena.ne.jp/hikaen2/20150201/1422773879 前準備 ffmpeg 適当にWindows用バイナリを落としてPATHを設定しておく。 dvdauthor Windows用のバイナリをダウンロードし、PATHの通ったところに設置。 http://www.paehl.com/open_source/?DVDAuthor これの下部の「From Box.net」または「From Google Drive」からダウンロード。 mkisofs 他のソフト(cdrfde)にくっついてくるmkisofs.exeを抜き出す。 https://cdrtfe.sourceforge.io/cdrtfe/download_en.html これのcdrtfe 1.5.7 zip archiveをダウンロードし、展開したファイルの中から、 tools\cdrtools\mkisofs.exe tools\cygwin\cygwin1.dll tools\cygwin\cygwin.ini をPATHの通ったフォルダに移動。 バッチファイル 下記の内容のバッチファイルを作成。 CPU数に合わせてthreadsの値は変更する。 DVDにしたい動画ファイルをドラッグ&ドロップ。 @ECHO OFF REM 動画ファイルからDVDのISOファイルを作成 SET VIDEO_FORMAT=NTSC ffmpeg -i "%1" -threads 4 -vf yadif=1,scale=720:480,tinterlace=4 -target ntsc-dvd -flags +ilme+ildct "%~dpn1_dvd.mpeg" dvdauthor -o "%~dpn1_dvd" -t "%~dpn1_dvd.mpeg" dvdauthor -o "%~dpn1_dvd" -T mkisofs -dvd-video -o "%~dpn1_dvd.
球面上の一様分布

球面上の一様分布

球面上に一様分布するランダムな点を生成したい時、 単純に極座標表示でθとφを一様分布させると、極付近に点が集まってしまう。 data1 = Transpose[{Sin[t] Cos[f], Sin[t] Sin[f], Cos[t]} /. { f -> RandomReal[{0, 2 Pi}, 2000], t -> RandomReal[{0, Pi}, 2000]}]; g1 = ListPointPlot3D[data1, BoxRatios -> {1, 1, 1}] 球面上で一様分布させるには、下記のようにθにArcCosを使う (θの位置の確率をSinθに比例させたい→累積確率分布関数はCos→逆関数はArcCos)。 data2 = Transpose[{Sin[t] Cos[f], Sin[t] Sin[f], Cos[t]} /. { f -> RandomReal[{0, 2 Pi}, 2000], t -> ArcCos[RandomReal[{-1, 1}, 2000]]}]; g2 = ListPointPlot3D[data2, BoxRatios -> {1, 1, 1}] なお、多次元球面上の一様分布は球面上に一様分布する乱数の生成にあるように、 多次元ガウス分布を正規化すると得られる。 下記は3次元の場合。 data3 = Normalize /@ RandomReal[NormalDistribution[], {2000, 3}]; g3 = ListPointPlot3D[data3, BoxRatios -> {1, 1, 1}]

RICOHプリンタ・複合機用のZabbix用テンプレート

社内で余っているサーバにZabbixを入れたので、 SNMP v2cでRICOH製のプリンタ・複合機の各種情報を取得するXMLテンプレートをhttps://github.com/coreyramirezgomez/Ricoh-Printers-Zabbix-Template/blob/master/Ricoh%20Printers%20SNMP%20Template.xml を元に作成した。 変更箇所としては以下の通り。 SNMP Discoveryで英語のアイテム名を取得するように変更 1分間あたりの印刷枚数のアイテムとグラフを追加 Discoveryの間隔が長くした(負荷でプリンタが応答しなくなるため) 確認している機種は社内にある以下の2機種のみ。 RICOH MP C5503 IPSiO SP 6320 ダウンロードはZabbix Share - Template Ricoh SNMP Printers。 <?xml version="1.0" encoding="UTF-8"?> <zabbix_export> <version>3.2</version> <date>2017-07-20T10:38:50Z</date> <groups> <group> <name>Printers</name> </group> </groups> <templates> <template> <template>Template SNMP Ricoh Printers</template> <name>Template SNMP Ricoh Printers</name> <description/> <groups> <group> <name>Printers</name> </group> </groups> <applications> <application> <name>SNMP Enabled Printer</name> </application> </applications> <items> <item> <name>Description</name> <type>4</type> <snmp_community>{$SNMP_COMMUNITY}</snmp_community> <multiplier>0</multiplier> <snmp_oid>.1.3.6.1.2.1.25.3.2.1.3.1</snmp_oid> <key>Description</key> <delay>60</delay> <history>90</history> <trends>0</trends> <status>0</status> <value_type>4</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port>161</port> <description/> <inventory_link>2</inventory_link> <applications> <application> <name>SNMP Enabled Printer</name> </application> </applications> <valuemap/> <logtimefmt/> </item> <item> <name>Page Count</name> <type>4</type> <snmp_community>{$SNMP_COMMUNITY}</snmp_community> <multiplier>0</multiplier> <snmp_oid>.

VBAでUUIDを生成

Excel VBAでUUID(GUID)を生成して使っている部分があったのだが、 先日のWindows Updateを適用してから、 CreateObject("Scriptlet.TypeLib")でエラーが出て使用できなくなってしまった。 参考 : 2017 年 7 月のセキュリティ更新適用後、VBA から一部のオブジェクトを作成できません 私の場合はただ単にランダムなUUIDが生成できれば良いので、 UUID v4を生成する関数を作った。 VBの乱数の精度としては24ビットらしいので、1回の乱数生成では最大16ビット使用するようにはしている。 とはいえ乱数の品質としてはあまり高くないのでご注意を。 Public Function GetUUID() As String 'GetUUID = Mid$(CreateObject("Scriptlet.TypeLib").GUID, 2, 36) GetUUID = Right$("0000" & Hex(Rnd() * 65536), 4) & Right$("0000" & Hex(Rnd() * 65536), 4) GetUUID = GetUUID & "-" & Right$("0000" & Hex(Rnd() * 65536), 4) GetUUID = GetUUID & "-4" & Right$("0000" & Hex(Rnd() * 65536), 3) GetUUID = GetUUID & "-" & Right$("0000" & Hex(32768 + Rnd() * 16384), 4) GetUUID = GetUUID & "-" & Right$("0000" & Hex(Rnd() * 65536), 4) & Right$("0000" & Hex(Rnd() * 65536), 4) & Right$("0000" & Hex(Rnd() * 65536), 4) End Function

英語版Windows PE環境でバックスラッシュを入力

会社のPCではHDD暗号化ソフトのSecureDocを使用しているが、先日1台のPCが起動しなくなったため、リカバリーディスクを使っての救出を行った際のメモ。 SecureDocのリカバリーディスクはWindows PEベースなのだが、海外の製品なので当然英語キーボード。 起動しなくなったPCのHDDの中身は運良く復旧できそうだったのだが、 データをネットワーク経由で回収しようとしたところネットワーク設定画面でバックスラッシュが入力できなくてハマった。 5分ほどキーボードを押しまくった後、Altキーと文字コード入力で行けることに気がついた。 Alt押す → テンキー9 → テンキー2 → Alt離す で無事入力できた。 ただ、LetsNoteのNICをWindows PEでは認識できず無駄足に。 結局USBメモリ経由で回収した。

Xubuntu 16.04 + Snortで簡易IDS構築

ウイルス等に侵入された後の対策として、IDSやIPS製品の紹介をベンダーから受けたが、正直なところ価格が高かったのと、検知されるメッセージがSnort由来のものが多い気がしたので、自分でSnortを構築して商用製品との差を調べてみることにした。 構築環境 PC : 余っていたノートPC Panasonic LetsNote CF-NX1 OS : Xubuntu 16.04.2 (LetsNoteの有線LANと無線LANのNICを認識できる可能性が高いディストリビューションとして選択) ルータ : Yamaha RTX810 IDSとして運用(ミラーポートの通信を監視) LetsNoteの有線LANはミラーポートに接続し、通信を監視 LetsNote自体にアクセスするときには無線LANを使用する 図(適当) 手順 基本的に、以下のドキュメント通りでOK。 Snort 2.9.9.x on Ubuntu 14 -16 LetsNoteでは有線LANのNICはenp0s25、無線LANはwlp2s0となった。 注意点は以下の通り。 rule_url=https://www.snort.org/reg-rules/|snortrules-snapshot.tar.gz|<oinkcode> → rule_url=https://www.snort.org/rules/|snortrules-snapshot.tar.gz|<oinkcode> ※微妙にURLが変わっているので注意 sudo /usr/local/bin/pulledpork.pl -c /etc/snort/pulledpork.conf -l → sudo /usr/local/bin/pulledpork.pl -c /etc/snort/pulledpork.conf -l -o /etc/snort/rules/snort.rules ※-oオプションが必要と怒られた 有線LAN(enp0s25)はミラーポートから受信だけできれば良いので、 /etc/network/interfacesを編集して使われていないネットワークのアドレスを適当に設定。 管理の通信やBASEによるログを眺めるためには無線(wlp2s0)を使用するので、 NetworkManagerを使って適当に固定IPを設定。 RTX810はhttp://www.rtpro.yamaha.co.jp/RT/manual/rt-common/setup/lan_port-mirroring.html を参照してミラーポートを設定。 設定(ポート1と2の送信および受信フレームをポート4にミラー) lan port-mirroring lan1 4 in 1 2 out 1 2 解除 no lan port-mirroring lan1 結果 一応IDSとして構築できたので、現在はログを見て様子見。今のところのメモは以下。

Windows標準機能でZIPファイルの作成

JScriptで複数のテキストファイルを書き出し、それをZIPでまとめたかったので作成。 VBAやVBScript版を参考に作ってみた。 参考サイト : http://kiq-creator.com/blog/?eid=33 複数のファイルをZIP圧縮する際のコツとしては、CopyHereをするたびに待機すること。 CopyHereは非同期なので、すぐにJS側に制御が返ってくるが、 複数のファイルを一気にCopyHereしようとすると、「読み取りできません」とエラーが出る。 使い方 以下のコード中のcreateZipFileを自分のスクリプトにコピー&ペーストして createZipFile( "zipファイルのパス", ["圧縮対象ファイルのパス1", "圧縮対象ファイルのパス2", ...]) とすればOK。 もしくは以下のコードをメモ帳で拡張子をjsにして保存すれば、ドラッグ&ドロップでzipファイルを作成(右クリック→送る→圧縮フォルダーとほぼ同じ動作)。 注意事項 ディレクトリには対応してません。またWindows標準では暗号化ZIPは作成できません。 また圧縮対象ファイルの存在チェック等もやってないので、必要であればエラーハンドリング処理を追加してください。 /** Windows 標準機能でZipファイルを作成するWSH(JScript) Copyright 330k This software is released under the MIT License. http://opensource.org/licenses/mit-license.php */ var args = []; for(var i = 0; i < WScript.Arguments.length; i++){ args.push(WScript.Arguments(i)); } var zipfile = args[0].replace(/(.+)\.(.+?)$/, "$1.zip"); createZipFile(zipfile, args); function createZipFile(zipFilePath, sourceFiles){ var shell = WScript.CreateObject("Shell.Application"); var fso = WScript.CreateObject("Scripting.FileSystemObject"); var file = fso.