ひきこもりプログラマ

C++のこととか。

InkscapeからRoland STIKA SV-8で印刷するとレターサイズぶんしか印刷されない

2018-08-17 | Software
カッティングシートでステッカーを作るのにRoland STIKA SV-8を購入しました。カッティングデータは、付属ソフトウェアのCutStudioで作成するのが基本なのですが、ファイル形式が独自のため、もしSTIKAから別の機種に乗り換えたときにデータが使えなくなるのではないかという不安があります。そこでSV-8のプリンタドライバ経由でカッティングすることにしました。

このプリンタドライバは、Adobe Illustratorなどのようにベクターデータを作ってそのままプリンタに吐けるアプリからデータを受け取って、その通りにカットしてくれます。で、Illustratorなんて持っていませんのでかわりにInkscapeを使ってみました。InkscapeであればSVGフォーマットで保存できますので安心です(とも言い切れないのですがそういうことにしておきます)。ところが、どうもInkscapeの印刷機能は、SV-8のドライバとの情報交換がうまくいっていないらしく、縦が28cmぐらいのところでデータが途切れてしまいます。バグトラッカーを検索すると、わりかし印刷がらみは問題が多いようです。
https://bugs.launchpad.net/inkscape/+bugs?field.tag=printing

で、回避策としては、InkscapeからPDF形式で保存して、それをAcrobat Readerなりで開いてSV-8プリンタで印刷すればいいみたいです。お試しください。

動画をGoogleフォトにアップロードする前に更新日付を変更する

2017-10-03 | Program
Panasonicのビデオカメラで撮影した画像を、製品添付アプリケーションの「HD Writer」を使ってPCにコピーすると、動画ファイルの作成日時と更新日時が、撮影した日ではなくコピーした日時になります。まあ当たり前といえば当たり前なんですが、問題はこの動画をGoogleフォトにアップロードすると、コピー日時が動画の日時になってしまって、書き換えるのが大変ということです。

Googleフォトでは動画ファイルの更新日付を見ているようなので、こいつを書き換えてからアップロードしてやればOKです。カメラによっては(あるいは取り込み方法によっては)ファイル作成日時が撮影日時のままだったりするらしいのですが、今回は「HD Writer」による取り込み時にファイル名が撮影日時になる(2017-10-02_123456.m2tsのように)ことを利用しました。スクリプトでファイルをさらってファイル名から取得した撮影日時をファイルの更新日時にセットします。

var fileExp = /^(\d{4})-(\d{2})-(\d{2})_(\d{2})(\d{2})(\d{2}).m2ts$/;
var objShell  = new ActiveXObject("shell.application");

function ProcessFolder(folder)
{
	var num = 0;
	for (var fc = new Enumerator(folder.Files); !fc.atEnd(); fc.moveNext())
	{
		var file = fc.item();
		var match = fileExp.exec(file.Name);
		if (match)
		{
			++num;
			var objFolder = objShell.NameSpace(folder.Path);
			var objFolderItem = objFolder.ParseName(file.Name);
			var date = match[1] + "/" + match[2] + "/" + match[3];
			var time = match[4] + ":" + match[5] + ":" + match[6];
			objFolderItem.ModifyDate = date + " " + time;
		}
	}
	for (var fc = new Enumerator(folder.SubFolders); !fc.atEnd(); fc.moveNext())
	{
		var sub = fc.item();
		num += ProcessFolder(sub);
	}
	return num;
}

if (WScript.Arguments.length == 0)
{
	WScript.Echo("フォルダ名を指定してください。");
	WScript.Quit(1);
}
var fso = new ActiveXObject("Scripting.FileSystemObject");
var folder;
try
{
	folder = fso.GetFolder(WScript.Arguments(0));
}
catch (ex)
{
	WScript.Echo(WScript.Arguments(0) + "をフォルダとして開けませんでした。");
	WScript.Quit(1);
}

var num = ProcessFolder(folder);
WScript.Echo(num + "個のファイルを処理しました。");


動画をコピーする前に「Googleのバックアップと同期」を停止しておいて、動画をコピーしたらコピー先フォルダ名を上記スクリプトに渡して起動してください。スクリプトを適当な名前.jsとして保存して、動画フォルダをドラッグ&ドロップしてやればいいかと。

Visual SourceSafeからPerforceに移行する

2014-06-19 | Software

VSSのデータベースをPerforceのレポジトリに変換するにはVSSToP4というユーティリティを使います。このユーティリティは

  • 基本処理が書かれたPerlスクリプト
  • PerlからPerforceのコマンド(P4コマンド)を実行するためのPerlライブラリP4Perl

から構成されています。公開されているスクリプトでじっさいに移行を試みたところ,いくつか問題が発生したので,解決策をメモしておきます。

国際語モードへの対応

スクリプトを実行してすぐに

Unicode server permits only unicode enabled clients.

と出力された場合,Perforceサーバが国際語モード(internationalized mode)で動作しているのにクライアント側がそれに対応していないのが原因かもしれません。国際語モードに関する注意英語版)に書かれているように,サーバ側はメタデータをUTF8で管理するので,クライアント側ではそれをどの文字コードに変換して表示すればいいかを指定してやる必要があるのです。

この指定には通常は環境変数P4CHARSETを使うのですが,P4Perlは実行環境の環境変数を引き継がないようで,明示的に指定してやる必要があります。P4PerlでPerforceコマンドを実行するときはP4オブジェクトを生成することになっており,これが生成されるのは

  • convert.pl
  • mkdepot.pl

の2箇所です。それぞれのスクリプトに

$p4->SetPort($convert::p4port);
$p4->SetClient($convert::p4client);
$p4->SetUser($convert::p4user);

と書かれた部分がありますので,このうしろに

$p4->SetCharset("shiftjis");

と追加してください。もうちょっと真面目に書くとすると,国際語対応サーバで運用している場合,つまり環境変数P4CHARSETが設定されている場合にだけこの処理を追加したいので

if (defined($ENV{'P4CHARSET'})) {
  $p4->SetCharset($ENV{'P4CHARSET'});
}

となるでしょう。

ちなみに,Perforceの代理店の東陽テクニカさんにコンタクトして商談が始まると,各種資料をいただけるのですが,その中に含まれるVSSToP4では上記の変更を適用ずみです。めんどくさがらずにちゃんとPerforce本社に連絡して本家のスクリプトを更新してくれよと思ったり思わなかったり。

SourceSafeは英語版で

スクリプトはエラーなしで実行されたみたいだけどなにも起きないよ? という場合,ひょっとしたらVisual SourceSafeが日本語版じゃないですか? VSSToP4のスクリプトは,VSSのコマンドライン(ss.exe)でファイルの履歴やプロパティを取得してそれをパースするのですが,ss.exeの出力が日本語のままだとパース処理がまともに動きません。VSSの言語設定を英語にしておきましょう。

ファイルタイプのマッピング修正

[VSSのパス] is not valid SourceSafe syntax
というエラーが出て,よくみるとエラーのアタマにutf8とかutf16とか書かれていたら,ファイルタイプのマッピングを修正する必要があります。VSSのファイルタイプをPerforceのファイルタイプに変換する処理がreadhist.pl内にあるのですが,残念ながらUTFに非対応です。もともとのコードは

$type = lc($value);
# The following lines handle new VSS 2005 file types.
$type =~ s/ auto-detect//g;
$type =~ s@text: ansi/mbcs@text@g;

となっているのですが,ここに

$type =~ s/text: utf8/text/g;
$type =~ s/text: utf16 le/utf16/g;
$type =~ s/text: utf16 be/utf16/g;

を追加してください。

余談

東陽テクニカ版のVSSToP4ではtextタイプをすべてunicodeタイプにしてしまっています。オリジナルのmkdepot.plでは

my @addcmd = ("add", "-f", "-t", "$file_type{$vss_file}");

となっているのですが,これが

my $tmp_type = $file_type{$vss_file};
if ($tmp_type eq "text") {
  $tmp_type = "unicode";
}
my @addcmd = ("add", "-f", "-t", "$tmp_type");

と変更されているんですね。この指定をすると,ファイルの中身が

  • サーバ側ではUTF-8で保存され
  • クライアントワークスペースではP4CHARSETの値(つまりShift JIS)でエンコードされる

わけなんですが,これってクライアント側でUTF-8をUTF-8のまま保持したいときは使えないじゃないですか。なのでUTF-8のファイルはファイルタイプをunicode以外,つまりtextなりbinaryなりにしないといけないというわけのわからないことになってしまいます。そんなことに注意しないといけないのなら,国際語モードは使わないほうがいいんじゃないかという気がしてならないのですがどうなんでしょう。

参照: Internationalization and Localization


Visual Studioでインストルメンテーションによるプロファイルが失敗するのはプロジェクト参照が原因

2013-10-03 | Program

Visual Studio 2010で,Performanceというアプリケーションプロジェクトと,AというDLLプロジェクトを作り,両プロジェクトをインストルメンテーションしてプロファイルを実行しようとしたのですが,エラーになります。


Warning VSP2317: モニターは、カーネル モード実行の検出のためのハードウェア パフォーマンス カウンターを取得できませんでした。経過時間とアプリケーション時間は同じです。
プロファイルを開始しました。
同じ場所で C:\Users\satomi\documents\visual studio 2010\Projects\Performance\Debug\A.dll をインストルメント化しています
情報 VSP3049: 小さい関数はインストルメンテーションから除外されます。
Microsoft(R) VSInstr Post-Link Instrumentation 10.0.40219 x86
Copyright (C) Microsoft Corp. All rights reserved.
処理するファイル:
C:\Users\satomi\documents\visual studio 2010\Projects\Performance\Debug\A.dll --> C:\Users\satomi\documents\visual studio 2010\Projects\Performance\Debug\A.dll
元のファイルは C:\Users\satomi\documents\visual studio 2010\Projects\Performance\Debug\A.dll.orig にバックアップされました
ファイル C:\Users\satomi\documents\visual studio 2010\Projects\Performance\Debug\A.dll を正しくインストルメントしました
同じ場所で C:\Users\satomi\documents\visual studio 2010\Projects\Performance\Debug\Performance.exe をインストルメント化しています
情報 VSP3049: 小さい関数はインストルメンテーションから除外されます。
Microsoft(R) VSInstr Post-Link Instrumentation 10.0.40219 x86
Copyright (C) Microsoft Corp. All rights reserved.
処理するファイル:
C:\Users\satomi\documents\visual studio 2010\Projects\Performance\Debug\Performance.exe --> C:\Users\satomi\documents\visual studio 2010\Projects\Performance\Debug\Performance.exe
元のファイルは C:\Users\satomi\documents\visual studio 2010\Projects\Performance\Debug\Performance.exe.orig にバックアップされました
ファイル C:\Users\satomi\documents\visual studio 2010\Projects\Performance\Debug\Performance.exe を正しくインストルメントしました
別のプロセスで使用されているため、プロセスはファイル 'C:\Users\satomi\documents\visual studio 2010\Projects\Performance\Debug\A.dll' にアクセスできません。
C:\Users\satomi\documents\visual studio 2010\Projects\Performance\Report131003.vsp に書き込まれたデータ。
プロファイルが終了しました。
ファイルにデータ バッファーが含まれていません
ファイルにデータ バッファーが含まれていません
失敗した分析
別のプロセスで使用されているため、プロセスはファイル 'C:\Users\satomi\documents\visual studio 2010\Projects\Performance\Debug\A.dll' にアクセスできません。
プロファイルが完了しました。

で,原因はPerformanceプロジェクトがAプロジェクトを参照していたことでした(共通プロパティ/Frameworkと参照)。この参照を削除して,PerformanceプロジェクトがAプロジェクトを明示的にリンクするようにしたところ(構成プロパティ/リンカー/入力),無事にプロファイルを実行できました。

しかし…仕事でプロファイリングしたいソリューションにはプロジェクトが30個以上あるんですよね…。これぜんぶ修正するのかと思うとげんなりします。


Handle.exeによる共有ファイル(UNCパス)の検索

2013-09-10 | Software

理屈はよくわからないのですが,Handle.exeではUNCパス
\\ComputerName\SharedFolder\FileName.txt

\Device\Mup\ComputerName\SharedFolder\FileName.txt
に展開されるので(Windows Server 2012環境),
Handle.exe \\ComputerName\SharedFolder
といった入力にはマッチしないようです。