XpsDocument の印刷でフォントが変わる

Xpsファイルを印刷するプログラムを作っていると変な現象に出会った。2日ほどな悩んだがやっと原因が分かったのでメモしておく。

【症状】

MSゴシック体を使ったXPSドキュメントを作成する。(これはワードパッドなどで適当に文書を作成して、印刷にMicrosoft XPS Document Writerを使ってXPSファイルに出力したものである。)これをVS2010にて自前で作成したプログラムから印刷するとなぜか明朝体で印刷される。
対象の.net frameWorkが3.5の時にだけ発生する。
4.0では発生しない。実行PCがWindowXp(32bit)では発生しなかった。

【プログラム環境】
OS:Windows7 (x64)  SP1
Visual Studio 2010
.net FrameWork3.5SP1用

【プログラム(印刷部)】
きわめて単純な印刷プログラム。ボタンを押すと下記のコードが実行されるようにしているだけ。


PrintDialog dialog = new PrintDialog();
 bool? ret=dialog.ShowDialog();
 if (ret == true) {
XpsDocument document = new XpsDocument(_filePath, FileAccess.Read);
FixedDocumentSequence seq = _doc.GetFixedDocumentSequence();
dialog.PrintDocument(seq.DocumentPaginator, "これは標準印刷");
 }

【原因】
マイクロソフトのバグ

文書番号: 2566651
[FIX] .NET Framework 3.5 Service Pack 1 を対象とする Windows Presentation Foundation アプリケーション内の XpsDocumentWriter クラスを使用するときに XPS 文書のテキストが異なるフォントで印刷される

http://support.microsoft.com/kb/2566651/

【対処方法】
基本的に次のサービスパックを待つ。またはHotFixを申請する。
さてどうしようかなぁ。今回はframework4.0は使ってはいけないからなぁ
UIゴシックは問題ないみたいなのでこれを使おうかなぁ。

カテゴリー: .net C#, 未分類 | タグ: | コメントをどうぞ

YouTubeに動画を大量にアップする。

さてと・・。大量にある動画をYouTubeにアップしないといけない。

動画1本分は15分で250Mほどの容量がある。ためしに手動で1本Upしてみると20分ほどかかる。ちなみに全本数は280本。

さてと・・・。どうすんべこれ

いつものようにツールを探す・・・。今回はいいツールが見つかんない。おしいツールは見つかったが、表題や説明を同じように何度も入力しないといけない。

これは間違いの元になる。うーん 作るか

といことで、YoutubeのAPIを呼び出して連続UPLOADするツールを作成しました。

【したいこと】

1.複数枚のDVDからの分割動画なので、「あいうえお」という表題を入力してけば、分割数を自動で判断して「あいうえお(1/10)」「あいうえお(2/10)」というように連番付きでUPしてほしい。

2.前もってDVDのセットを複数登録しておきたい。

3.一般公開しない動画なので、「限定公開」でアップしたい

4.Upload完了後は閲覧用のURLをTEXTで取得したい。(会員専用のブログに張り付けるため)

5.アップロード開始後は、ログもとりながら一晩中動いてね。

で、こんな感じ

99本の24時間以上の連続UPLOADの成功率は98/99でした。

一晩中アップロードしてくれますw

これで私は寝ることが可能となりましたぁw
売れんかなぁw

カテゴリー: etc | タグ: , , | コメントをどうぞ

DVDからYouTubeへUploadするために動画をカットする。

DVD動画をYouTubeへアップロードする必要が発生しました。しかも数十枚も・・・。これはツールを利用するしかないと思い調べると使えそうなものがありました。

その名は FFMPEG (これについてはググってみてね)

コマンドラインツールですが、やりたいことは一応やれそうです。

やりたいことは、

1.DVDの中のVOBファイルを連結し1本のMPEGする。
(これがカットする元動画データとなる)

2.YouYubeの制限に違反しないように、1本15分(正確には誤判定をきらって14分55秒にした)のサイズにカットする。ただし、2本目以降はカットするスタート時間の位置を5秒ほど戻して、前回のものの終わりの部分と少し被らせる。

うーーん時間の指定が面倒で、間違えそう;;
そもそも1本のMPEGにした段階で総時間がわからないと何本にカットするかもわからないぞ。

ということで、そのあたりを自動で計算てカットしてくれるツールを作りました。といってもFFMPEGをcallするGUIラッパーですが・・・

こんな感じ

VideoCutter ImageVOBファイルをドラッグ&ドロップし、実行ボタンを押すだけで、15分もののMPEGにカットしてくれます。

N秒かぶりのカットが楽勝で正確にできるので超便利w

自己満足^^売れんかなぁ

カテゴリー: etc, 未分類 | タグ: , , | コメントをどうぞ

Prea KT-2 再起動・シャットダウン

Canon製品のPrea Kt-2でちょっと困ったことに遭遇したのでメモしておく。

開発環境:embedded Visual C++

hoge.bat内でaaa.exeとbbb.exeを一連で実行している場合、
aaa.exe内で再起動やシャットダウン命令を発行しても次のbbb.exeが実行されてしまいます。aaa.exeの戻り値など使ってhoge.batを終了するようにしてやれば、hoge.bat終了後に正常に再起動やシャットダウンが動いてくれました。

例:hoge.bat
————————————–
echo off
Kaisi:
aaa.exe
rem エラーレベルが9以上なら終了
if  errorlevel  9 goto ShutDown
bbb.bat
goto Kaisi

ShutDown:
————————————
バッチ終了後、シャットダウンが実行されるようだ。

カテゴリー: etc | コメントをどうぞ

PCA for SaaS PCA商魂9V.2R7 のトラブル事例

はやりのクラウド環境でトラブルが発生していた。やっと解決したのでここに記録を残しておく。

[症状]

PCA for SaaS PCA商魂9V.2R7が入力途中でエラーを起こしたり、突然入力伝票画面が消えたりとても不安定になる。発生頻度は見積書の明細行入力を15行ぐらい入力するとほぼ確実に発生する。たまに問題なく登録できるときもあるので、とても不可解な現象に見える。

[解決方法]

解決にだいぶ労力を要しまたが、原因はプロバイダー(PLALA)の「ネットバリアベーシック」というセキュリティサービス(パケットフィルタ)でした。この無料サービスをOFFにすると問題なく運用できるようになりました。

[感想]

このパケットフィルターがいかなるものかは詳しく調べてませんが、SaaS版商魂が使えたり、使えなかったりで、不安定という症状に見えるので、原因がまさかパケットフィルターとは思いませんでした。PC交換、ハブ・LANケーブル交換を行い、最後にはルータ交換までおこなった挙句にわかったことでした・・・・・。PLALAさんのサービスを熟知してなかった私が未熟もんでした。

PCAさんにもだいぶご迷惑をおかけいたしましたのでここでお詫びを申し上げときます。お騒がせして、どうも申し訳ありませんでした。m(_ _)m

 

 

 

カテゴリー: windows, トラブル | タグ: , , | コメントをどうぞ

Hyper-V IPアドレスがすでに割り当てられている

Windows2008 のHyperV環境にて、仮想ハードディスクをコピーしてゲストマシンを引越した時に、IPアドレスの設定で以下のようなエラーがでました。

このネットワーク アダプター用に入力された IP アドレス XXX.XXX.XXX.XXX は別のアダプター Name of adapter に既に割り当てられています。

《解決策》

http://support.microsoft.com/kb/269155/ja

私は以下の方法を採用して解決しました。

1.[スタート] ボタンをクリックし、[ファイル名を指定して実行] をクリックします。「cmd.exe」と入力して Enter キーを押します。
2.「set devmgr_show_nonpresent_devices=1」と入力して、Enter キーを押します。
3.「Start DEVMGMT.MSC」と入力し、Enter キーを押します。
4.[表示] をクリックして、[非表示デバイスの表示] をクリックします。
5.ネットワーク アダプター ツリーを展開します。
6.グレー表示になっているネットワーク アダプターを右クリックしてから、[削除] をクリックします。

カテゴリー: 未分類 | コメントをどうぞ

Silverlight4 Validation付きユーザコントロール

コントロール自身にValidation機能を持たせたユーザコントロールの例
開発環境:VisualStudio2010 Silverlight4

最近SilverLight4のアプリを開発してるのですが、日本語情報はすくないですねぇ。しかたなく英文と格闘する毎日を送っています。
情報をもらってばかりいるのは気が引けますので、少しづつですが私も情報を発信していきます。ほんとうは半年後の自分のためでもあるんでしけどね。まずは出来立てのユーザコントロールからどうぞ。

使用している技術内容

  1. ユーザコントロール
  2. Varidation
  3. Entity
  4. 依存関係プロパティ
  5. Bindをコードで記述

などにご注目ください。ちょっとてんこもりすますね^^;
直接入力やElementバインディングでも使用できることを確認しました。データバインディングのテストはしてませんが、たぶん大丈夫でしょう。

TestControl1.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.ComponentModel;
using System.Windows.Data;
using System.ComponentModel.DataAnnotations;
using System.ServiceModel.DomainServices.Client;

namespace SilverlightApplication1.Controls
{
    /// <summary>
    /// 内部にエンティティデータを持つユーザコントロールの例
    /// コントロール単独でVlidation機能を実装。
    /// Emptyと1以外のデータはエラーになる。
    /// 2011/02/22 Visualstudio 2010 + Silverlight4
    /// </summary>
    public partial class testControl1 : UserControl
    {

        public testControl1() {
            InitializeComponent();
            //InDataはXAML側でリソースとして定義してある。
            InData = new TestControlEntity();
            InData.PropertyChanged += new PropertyChangedEventHandler(InData_PropertyChanged);
            //デザインモードの時はバインドしない。
            //(コードによるBindingの例)
            if (!DesignerProperties.IsInDesignTool) {
                Binding b = new Binding();
                b.Source = InData;
                b.Path = new PropertyPath("InText");
                b.Mode = BindingMode.TwoWay;
                b.NotifyOnValidationError = true;
                b.ValidatesOnDataErrors = true;
                b.ValidatesOnExceptions = true;
                b.ValidatesOnNotifyDataErrors=true;
                textBox1.SetBinding(TextBox.TextProperty,b);
            }
        }

        void InData_PropertyChanged(object sender, PropertyChangedEventArgs e) {
            if (e.PropertyName == "Text") {
                this.Text = ((TestControlEntity)sender).InText;
            }
        }

        #region 依存関係プロパティ(Text) 黄金パターン^^V
        //-----------------------------------------------------------------------------------
        public readonly static DependencyProperty TextProperty =
               DependencyProperty.Register("Text", typeof(string), typeof(testControl1),
               new PropertyMetadata("",
                   new PropertyChangedCallback(testControl1.OnTextChangedStatic)));

        private static void OnTextChangedStatic(DependencyObject d, DependencyPropertyChangedEventArgs e) {
            ((testControl1)d).OnTextChanged(e);
        }

        private void OnTextChanged(DependencyPropertyChangedEventArgs e) {
            //InData.InText = e.NewValue.ToString(); //<--これはダメ ElementBindingの例で落ちる(右の例)
            if (textBox1 != null) {
                textBox1.Text = e.NewValue.ToString();

            }
        }

        [Category("共通")]
        public object Text {
            set { SetValue(TextProperty, value); }
            get { return GetValue(TextProperty); }
        }
        //-----------------------------------------------------------------------------------
        #endregion

    }
// //////////////////////////////////////////////////////////////////////////////////////////////
    /// <summary>
    /// ユーザコントロール内部で使用するEntity
    /// </summary>
    public class TestControlEntity : INotifyPropertyChanged
    {
        public TestControlEntity(){}
        private string _InText="";
        public string InText {
            set {
                //内部データとコントロールの表示を一致させる場合はこっちを使う
                //正しくない値でもセットして通知
                //if (_InText == value) { return; }
                //_InText = value;
                //OnPropertyChanged("Text");

                if (!String.IsNullOrEmpty(value) && value != "1") {
                        throw new ArgumentException("TextはEmptyまたは1でなければなりません。:["+value.ToString()+"]");
                }

                //正しい値なのでセットして通知
                _InText = value;
                OnPropertyChanged("Text");
            }

            get {
                return _InText;
            }

        }

        #region INotifyPropertyChanged メンバー

        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string Name) {
            if (PropertyChanged != null) {
                PropertyChanged(this, new PropertyChangedEventArgs(Name));
            }
        }
        #endregion
    }
}

testControl1.xaml
使用するには
xmlns:Local=”clr-namespace:SilverlightApplication1.Controls”
あたりを修正しないといけませんね。

<UserControl x:Class="SilverlightApplication1.Controls.testControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
             xmlns:Local="clr-namespace:SilverlightApplication1.Controls"
    d:DesignHeight="57" d:DesignWidth="226">
    <UserControl.Resources>
        <Local:TestControlEntity x:Name="InData" />
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot" Background="#FFCDF2DB">

        <TextBlock Height="21" HorizontalAlignment="Stretch" Name="textBlock1" Text="Emptyと1以外はエラーとなるTextBox" VerticalAlignment="Stretch" TextWrapping="Wrap" Margin="0,0,0,36" Padding="2" />
        <TextBox Height="24" Margin="19,23,23,10" Name="textBox1" />
    </Grid>
</UserControl>

実行例 Xaml
下記のコードは使用例です。実際に実行する時は、このユーザコントロールを使用するページを作成してみてください。
下記のカット&ペーストでは動きませんよ。

<navigation:Page x:Class="SilverlightApplication1.Views.Page4"
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
           xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
           xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
           mc:Ignorable="d"
           xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
           d:DesignWidth="640" d:DesignHeight="480"
           Title="Page4 Page" xmlns:my="clr-namespace:SilverlightApplication1.Controls">
    <Grid x:Name="LayoutRoot">
        <my:testControl1 HorizontalAlignment="Left" Margin="79,142,0,0" x:Name="testControl11" VerticalAlignment="Top" TabIndex="2" />
        <TextBox Height="24" HorizontalAlignment="Left" Margin="79,100,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" TabIndex="1" Text="ダミーパーキング場所" />
        <TextBox Height="24" HorizontalAlignment="Left" Margin="79,217,0,0" Name="textBox2" VerticalAlignment="Top" Width="120" TabIndex="3" Text="ダミーパーキング場所" />

        <my:testControl1 HorizontalAlignment="Left" Margin="439,142,0,0" x:Name="testControl12" VerticalAlignment="Top" TabIndex="5" Text="{Binding Path=Text, ElementName=textBox3}" />
        <TextBox Height="24" HorizontalAlignment="Left" Margin="509,100,0,0" Name="textBox3" VerticalAlignment="Top" Width="52" TabIndex="4" />
        <TextBox Height="24" HorizontalAlignment="Left" Margin="444,217,0,0" Name="textBox4" VerticalAlignment="Top" Width="120" TabIndex="6" Text="ダミーパーキング場所" />
        <TextBlock Height="23" HorizontalAlignment="Left" Margin="380,100,0,0" Name="textBlock1" Text="Elementバインディング" VerticalAlignment="Top" />
    </Grid>
</navigation:Page>
カテゴリー: SilverLight | タグ: | コメントをどうぞ

Silverlight4 SelectedItemsの削除処理

ListBoxやDataGridなどを使っている場合で、選択されているものを削除したい時は要注意。
SelectedItemの削除処理は、素直に書いちゃうと自分で自分を削除するようになってしまう。
一度削除対象をListに格納してから削除ループを回すべし

private void btnヘッダ削除_Click(object sender, RoutedEventArgs e) {
 var dellist = 伝票ヘッダDataGrid.SelectedItems.Cast<伝票ヘッダ>().ToList();
 foreach (var item in dellist) {
       伝票ヘッダDomainDataSource.DataView.Remove(item);
  }

 //削除に失敗する失敗する書き方
 //foreach (伝票ヘッダ item in 伝票ヘッダDataGrid.SelectedItems
 //    伝票ヘッダDomainDataSource.DataView.Remove(item);
 //}
}
カテゴリー: SilverLight | タグ: | コメントをどうぞ

Silverlight4メモ onDelete Cascade

Entitymodel上でアソシエーションを修正した時の注意。

onDelete CascadeをEntitiModelを修正しただけでは関連テーブルの削除は実現できない。SQLManagementStudioを使って、データベースダイアログラムより、「削除ルール」を「重ねて表示」にすべし。(p.s.「重ねて表示」は誤訳にしてもひどいと思います・・・原文はCascadeなんでしょうね)

カテゴリー: SilverLight | タグ: , , | コメントをどうぞ

Windows Server バックアップ 失敗 Hyper-V-VMMS ID:10137

Windows Server 2008 R2に標準機能の「Windows Server バックアップ」で以下のエラーが発生してバックアップに失敗するようになってしまいました。

「仮想マシン’Hogehoge’に対して元に戻すスナップショットが見つかりませんでした。(仮想マシン ID  NANYARA-KANYARA-NANYARA-KANYARA)」

ソース:Hyper-V-VMMS
イベントID:10137

ふむ・・・・・ こまった・・・

どうやら、Hyper-Vのバーチャルマシン関係のことでバックアップに失敗しているようです。ちなみに、問題のバーチャルマシンを停止している状態ではバックアップは成功しました。でもバーチャルマシン起動中でもバックアップはできるはず・・・。だって前はできてた。

いろいろ調べてみると以下のことが分かったのでご報告します。

Windows Server バックアップではVolume Shadow Copy Service(VSS)が使われますが、この時VSSからスナップショットされたVHDのマウント要求があるようです。これに応じるためには「自動マウント機能」が有効になっている必要があります。上記のエラーが出るときはこれは無効になっている可能性があります。

と いうことで・・ 以下のようにしました。

【自動マウント機能を有効にする方法】

  • 1.ホストサーバにて、Dos窓より、「Diskpart.exe」を実行。
  • 2.automount と入力 →現在の状況が表示される。
  • 3.もし 「新しいボリュームの自動マウントが無効です」と表示されたら automount Enable と入力する。→自動マウント機能が有効になる。
  • 4.exitで終了する。

やっぱりいつのまにか「自動マウント機能」が無効になっていたようです。これを有効にしたことで、バックアップは正常に動作するようになりました。

めでたしめでたし。

P.S. ネット上の情報量が非常に少なかったので、これでいいのかちょっと不安・・・ だれか教えてちょ m<_ _>m 

カテゴリー: windows, トラブル | タグ: | コメントをどうぞ