iPhoneの動画の撮影日時をexiftoolで編集する。

海外でiPhoneで撮影した動画の撮影日時がずれてたのでその変更方法。

写真のEXIF情報はLightroomなどで変更すれば問題ないが動画は出来なかった。動画のEXIFexiftoolを使えば変更できる。

今回は3時間分、撮影時間を戻したいので以下のコマンド。

"exiftool(-k).exe" -overwrite_original -alldates-="03:00" *.MOV

"Create Date"と"Modify Date"は変更されたが、目的であったAmazon Fire TV Stickのスライドショーに反映するには"MediaCreateDate"と"MediaModifyDate"も変更する必要があった。

以下のコマンドで無事反映された。

"exiftool(-k).exe" -overwrite_original -MediaCreateDate-="03:00" -MediaModifyDate-="03:00" *.MOV

Visual Studio 2012をインストール後、Excel 2002が終了できない

問題

Window 7 Pro(32bit)にVisual Studio 2012をインストールすると、Excel 2002が終了出来なくなった!

ウィンドウの右上の[x]ボタンやメニューの「ファイル」→「終了」を選んでも終了出来ない。なおタスクマネージャーから強制終了は出来る。

原因

調べてみるとVisual Studioの「Team Foundation Office Add-in」の「TFSOfficeAdd-in.dll」がエラーを起こしている。

以下イベントビューアーの内容

障害が発生しているアプリケーション名: EXCEL.EXE、バージョン: 10.0.6871.0、タイム スタンプ: 0x4daf71c5
障害が発生しているモジュール名: TFSOfficeAdd-in.dll、バージョン: 11.0.61030.0、タイム スタンプ: 0x5270a9cd
例外コード: 0xc0000005
障害オフセット: 0x00020450
障害が発生しているプロセス ID: 0x1658
障害が発生しているアプリケーションの開始時刻: 0x01cf1d834f62f269
障害が発生しているアプリケーション パス: C:\Program Files\Microsoft Office\Office10\EXCEL.EXE
障害が発生しているモジュール パス: C:\Program Files\Common Files\Microsoft Shared\Team Foundation Server\11.0\x86\TFSOfficeAdd-in.dll

解消方法

使うとは思えない機能なのでレジストリから登録を外せば問題解消した!!

cd "C:\Program Files\Common Files\Microsoft Shared\Team Foundation Server\11.0\x86"
regsvr32 /u TFSOfficeAdd-in.dll

ASP.NET: 動的にサーバーコントロールを追加、イベントハンドラを登録、引数を指定

ASP.NET(C#)で動的に複数のサーバーコントロールを追加して、ボタンクリックのイベントハンドラを登録しそれに引数で値を渡す。

やりたい事:

  1. 動的に複数のリンクボタンを追加
  2. そのリンクボタンにボタンクリックのイベントハンドラを登録
  3. ボタンクリックのイベントハンドラに引数で値渡し

//ページロード
protected void Page_Load(object sender, EventArgs e){
        //リンクボタンを動的に複数追加
        for(int i=0; i<10; i++){
                LinkButton LBtn = new LinkButton();
                LBtn.Text = "リンクボタン" + i.ToString();
                //イベントハンドラに渡す引数を指定
                LBtn.CommandArgument = i.ToString();
                //イベントハンドラの登録
                LBtn.Command += this.LBtn_Click;
                //リンクボタンの追加
                this.Page.Controls.Add(LBtn);
        }
}

//動的に作成されたリンクボタンに登録するイベントハンドラ
protected void LBtn_Click(object sender, CommandEventArgs e){
        Response.Write(e.CommandArgument.ToString());
}

SQL Serverのストアドのソースを検索する。

information_schema.routinesのROUTINE_NAMEがストアド名、ROUTINE_DEFINITIONがストアドのソース

SELECT ROUTINE_NAME, ROUTINE_DEFINITION
FROM information_schema.routines
WHERE ROUTINE_DEFINITION LIKE '%キーワード%'
ORDER BY ROUTINE_NAME

  • 追記

上記のROUTINE_DEFINITIONはnvarchar(4000)のデータ型なのでソースの中身を全て検索できない。

そのため以下のほうが確実(ビューのソールも検索される)

SELECT *
FROM sys.sql_modules
WHERE definition LIKE '%キーワード%'

ストアドのみのソース検索は以下のように

SELECT
     b.name
     ,a.definition
     ,b.create_date
     ,b.modify_date
FROM sys.sql_modules a
INNER JOIN sys.objects b
ON a.object_id = b.object_id AND b.type='P'
WHERE
     definition like '%キーワード%'

GridViewのCellで長い文字列の場合Wrap出来ない。

ASP.NETのGridViewコントロールにスペースを含まない長い文字列があるとWrapされない。

asdfadsfsdalkfjdsljflskjdflkajsdkf;jadskfjdlkfjlsdkjflakdjfsdfldkadskjflsdkjfldsjflsdajflsdkjflsdkjflsdjfljdslfjdslfjadlskjffhalskhf

そこでCellにCSSの"WORD-BREAK:BREAK-ALL"を追加してあげる。

e.Row.Cells[4].Attributes.Add("style", "WORD-BREAK:BREAK-ALL");

すると以下のようにうまくWrapされる。

asdfadsfsdalkfjdsljflskjdflkajsdkf;jadskfjdlkfjlsdkjflakdjfsdf
ldkadskjflsdkjfldsjflsdajflsdkjflsdkjflsdjfljdslfjdslfjadlskjffhalskhf

IE8、9、Chrome19では動作確認済。笑

ASP.NETでTraceListenerでログをファイル出力する

ASP.NET/VB2008でアプリケーションログを出力するためTextWriterTraceListenerを使用する。

検証環境

web.config
TRACE コンパイラ ディレクティブが true に設定されていない場合、空ファイルができるだけでトレース出力されないので注意!太字の部分を「compilerOptions="/d:Trace=true"」を追加する。




compilerOptions="/d:Trace=true"
type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
warningLevel="4">






App_Code/Log.vb
Singletonパターンを応用したLogクラス。Writeメソッドは「Shared」(静的関数)なのでクラスのインスタンス無しで呼べる。というかコンストラクターが「Private」なのでインスタンスは作れない。

Imports Microsoft.VisualBasic
Imports System.Diagnostics
Imports System.IO

Namespace LogTest

'Singleton Log Class:
Public Class Log

'Singleton log object
Private Shared myLog As Log
Private Shared strLogPath As String

'Log level constant
Public Shared ReadOnly LOG_LVL_INFO As String = "I"
Public Shared ReadOnly LOG_LVL_WARN As String = "W"
Public Shared ReadOnly LOG_LVL_ERR As String = "E"

'*******************
'Private Constructor
'*******************
Private Sub New()
'Set log directory
strLogPath = String.Format("{0}\\{1}.log", ConfigurationManager.AppSettings("DirLog"), DateTime.Now.ToString("yyyyMM"))
End Sub

'*******************
'Static Write Method
'*******************
Public Shared Sub Write(ByVal msg As Object, ByVal strLogLevel As String)

'Create an object if not instantiated
If myLog Is Nothing Then
myLog = New Log()
End If

Dim strLogLine As String
Dim strTimestamp As String
Dim strBranch As String

strTimestamp = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss:fff")
strLogLine = strTimestamp + " " + strLogLevel + " " + msg.ToString()

Using myFile As Stream = File.Open(strLogPath, FileMode.Append)

Trace.Listeners.Add(New TextWriterTraceListener(myFile))
Trace.WriteLine(strLogLine)
Trace.Flush()
Trace.Listeners.Clear()

End Using
End Sub

End Class
End Namespace

test.vb.aspx
使い方: 「Log.Write("")」関数でログを書き込む。

Imports LogTest

Public Class LogTestPage : Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Log.Write("ログ書き込み: 情報", Log.LOG_LVL_INFO)
Log.Write("ログ書き込み: 警告", Log.LOG_LVL_WARN)
Log.Write("ログ書き込み: エラー", Log.LOG_LVL_ERR)
End Sub

End Class