<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Piconix</title>
	<atom:link href="http://www.piconix.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.piconix.net</link>
	<description>pico pico nix piconix</description>
	<lastBuildDate>Mon, 13 Dec 2010 09:14:44 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>SharePoint 2010 のタイマージョブを開発するときの基本事項</title>
		<link>http://www.piconix.net/archives/sp10timerjobbasics/</link>
		<comments>http://www.piconix.net/archives/sp10timerjobbasics/#comments</comments>
		<pubDate>Mon, 13 Dec 2010 07:34:57 +0000</pubDate>
		<dc:creator>管理人</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false">http://www.piconix.net/?p=528</guid>
		<description><![CDATA[タイマージョブを作成する機会があったので、メモがてら記録しておきます。 はじめる Visual Studio 2010 で、&#8221; 空のSharePointプロジェクト&#8221; から始めます。 デバッグの設定は、サンドボックスではなく、&#8221;ファーム&#8221; にします。 特定のサイトに対するジョブを作成する場合は、デバッグの設定でそのサイトを指定します。 Features の下にフィーチャを追加します。 タイトル、説明、スコープを設定します。スコープについては、後述。 そのフィーチャを右クリックして、イベントレシーバを追加します。イベントレシーバについては、後述。 パッケージの名前、タイトル、および説明を必要に応じて設定します。 パッケージにフィーチャを追加します。(というか、既定で追加されています) プロジェクトにクラスを追加します。このクラスがジョブの本体になります。後述。 フィーチャのスコープ フィーチャのスコープは &#8220;Farm&#8221; または &#8220;Site&#8221; にしますが、この設定によって、ジョブの Execute() メソッドの中での this.Parent の内容や、FeatureActivated( SPFeatureReceiverProperties properties ) の properties 引数の内容が変わってきます。要するに、コンテキストが変わります。したがって、ジョブの処理内容が特定のサイト コレクションに関係することであれば Site を、ファーム全体に対する処理 (サイトコレクションをまたぐような処理) であれば Farm を選びます。 イベント レシーバ アクティブ時 フィーチャがアクティブになったときに、次のようにジョブを登録するようにします。 public override void FeatureActivated( SPFeatureReceiverProperties properties ) { SPWebService service [...]]]></description>
			<content:encoded><![CDATA[<p>タイマージョブを作成する機会があったので、メモがてら記録しておきます。</p>
<h1>はじめる</h1>
<ol>
<li>Visual Studio 2010 で、&#8221; 空のSharePointプロジェクト&#8221; から始めます。
<ul>
<li>デバッグの設定は、サンドボックスではなく、&#8221;ファーム&#8221; にします。</li>
<li>特定のサイトに対するジョブを作成する場合は、デバッグの設定でそのサイトを指定します。</li>
</ul>
</li>
<li>Features の下にフィーチャを追加します。
<ul>
<li>タイトル、説明、スコープを設定します。スコープについては、後述。</li>
<li>そのフィーチャを右クリックして、イベントレシーバを追加します。イベントレシーバについては、後述。</li>
</ul>
</li>
<li>パッケージの名前、タイトル、および説明を必要に応じて設定します。
<ul>
<li>パッケージにフィーチャを追加します。(というか、既定で追加されています)</li>
</ul>
</li>
<li>プロジェクトにクラスを追加します。このクラスがジョブの本体になります。後述。</li>
</ol>
<h1><span id="more-528"></span>フィーチャのスコープ</h1>
<p>フィーチャのスコープは &#8220;Farm&#8221; または &#8220;Site&#8221; にしますが、この設定によって、ジョブの <code>Execute()</code> メソッドの中での <code>this.Parent</code> の内容や、<code>FeatureActivated( SPFeatureReceiverProperties properties )</code> の <code>properties</code> 引数の内容が変わってきます。要するに、コンテキストが変わります。したがって、ジョブの処理内容が特定のサイト コレクションに関係することであれば Site を、ファーム全体に対する処理 (サイトコレクションをまたぐような処理) であれば Farm を選びます。</p>
<h1>イベント レシーバ</h1>
<h2>アクティブ時</h2>
<p>フィーチャがアクティブになったときに、次のようにジョブを登録するようにします。</p>
<pre>public override void FeatureActivated( SPFeatureReceiverProperties properties ) {
    SPWebService service = properties.Feature.Parent as SPWebService;
    SPFarm farm = service.Farm;
    SPService timer = null;
    timer = getSPTimer( farm );
    if( timer != null ) {
        foreach( SPJobDefinition job in timer.JobDefinitions ) {
            if( job.Name == List_JOB_NAME ) {
                job.Delete();   //  Delete all living jobs.
            }
        }
    } else {
        throw new Exception("Could not get SPTimerV4 Service.");
    }

    // install the job
    Job one = null;
    try {
        one = new Job( List_JOB_NAME, timer, null, SPJobLockType.Job );
    } catch {
        throw new Exception( "Installing the job failed." );
    }
    try {
        SPMinuteSchedule schedule = new SPMinuteSchedule();
        schedule.BeginSecond = 0;
        schedule.EndSecond = 59;
#if DEBUG
        schedule.Interval = 1;
#else
        schedule.Interval = 15;
#endif
        one.Schedule = schedule;
        one.Update();
    } catch {
        throw new Exception( "Scheduling the job failed." );
    }
}</pre>
<h2>非アクティブ時</h2>
<p>フィーチャが非アクティブになったときに、次のようにジョブを削除するようにします。</p>
<pre>public override void FeatureDeactivating( SPFeatureReceiverProperties properties ) {
    SPWebService service = properties.Feature.Parent as SPWebService;
    SPFarm farm = service.Farm;
    SPService timer = null;
    timer = getSPTimer( farm );
    if( timer != null ) {
        foreach( SPJobDefinition job in timer.JobDefinitions ) {
            if( job.Name == List_JOB_NAME ) {
                job.Delete();
            }
        }
    } else {
        throw new Exception( "Could not get SPTimerV4 Service." );
    }
}</pre>
<h1>SPJobDefinition</h1>
<p>追加したクラスは、SPJobDefinitionクラスを継承するようにします。</p>
<pre>public class Job : SPJobDefinition {
	private const String CoreName = "My Time Job Title";

	public Job()
	    : base() {
	}

	public Job( string jobName, SPService service, SPServer server, SPJobLockType targetType )
	    : base( jobName, service, server, targetType ) {
	    this.Title = CoreName;
	}

	public Job( string jobName, SPWebApplication webApplication )
	    : base( jobName, webApplication, null, SPJobLockType.ContentDatabase ) {
	    this.Title = CoreName;
	}

	public override string Description {
	    get {
	        return "This time job is doing something on entire site collections.";
	    }
	}

	public override string DisplayName {
	    get {
	        return CoreName;
	    }
	}

	public override void Execute( Guid contentDbId ) {
	}
}</pre>
<p>この、Execute メソッドに処理を記述します。</p>
<h1>その他</h1>
<h2>配置</h2>
<p>一般的な SharePoint プロジェクト同様、Visual Studioの [配置] コマンドでソリューションを配置できますが、配置後にタイマーを再起動する必要があります。</p>
<p style="padding-left: 30px;"><code>net stop SPTimerV4<br />
net start SPTimerV4</code></p>
<h2>デバッグ</h2>
<p>タイマージョブに限りませんが、デバッグのためにトレースログを出すように設定しておくと便利です。</p>
<p>次のようなクラスを追加し、コード中で <code>diag.WriteTrace( 1, cat, TraceSeverity.Verbose, "{0} == {1}", a, b );</code> といったようにして書き出します。</p>
<pre>class Diagnostics : SPDiagnosticsServiceBase {
	public enum CategoryId {
	    None = 0,
	    Deployment = 100,
	    Provisioning = 200,
	    CustomAction = 300,
	    Rendering = 400,
	    WebPart = 500
	}

	private static string DiagnosticsAreaName = "MyTimerJob";

	public Diagnostics()
	    : base() {
	}
	public Diagnostics( String name, SPFarm parent )
	    : base( name, parent ) {
	}

	protected override IEnumerable ProvideAreas() {
	    List categories = new List();
	    foreach( string catName in Enum.GetNames( typeof( CategoryId ) ) ) {
	        uint catId = (uint)(int)Enum.Parse( typeof( CategoryId ), catName );
	        categories.Add( new SPDiagnosticsCategory( catName, TraceSeverity.Verbose, EventSeverity.Error, 0, catId ) );
	    }

	    yield return new SPDiagnosticsArea( DiagnosticsAreaName, categories );
	}

	public static Diagnostics Local {
	    get {
	        return SPDiagnosticsServiceBase.GetLocal();
	    }
	}

	public SPDiagnosticsCategory this[CategoryId id] {
	    get {
	        return Areas[DiagnosticsAreaName].Categories[id.ToString()];
	    }
	}
}</pre>
<h2>Dispose</h2>
<p>トレースログをきちんと確認するようにします。SPSite や SPWeb などをきちんと Dispose していないと、&#8221;An SPRequest object was not disposed before the end of this thread.&#8221; といったようなメッセージが記録されます。ある意味、便利です。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.piconix.net/archives/sp10timerjobbasics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>検索センターにナビゲーションが表示されない</title>
		<link>http://www.piconix.net/archives/searchcenterwithoutnavigation/</link>
		<comments>http://www.piconix.net/archives/searchcenterwithoutnavigation/#comments</comments>
		<pubDate>Wed, 06 Oct 2010 06:37:38 +0000</pubDate>
		<dc:creator>管理人</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false">http://www.piconix.net/?p=500</guid>
		<description><![CDATA[SharePoint 2010 でサイトを構築するときの話です。 検索センターをどこに作成していますか? 独立したWebアプリケーション下のサイト コレクションとして作成していますか? それともホームページとなるサイト コレクションの下に作成していますか? まあ、いずれの場合でも、検索センターを作成すると、ナビゲーションが一般的な他のサイトとは異なってしまいます。 これは、通常のサイトは v4.master というマスターページが使用されているのに対して、検索センターでは minimal.master というマスターページが使用されているためです。 ではマスターページを v4.master にすればよいかというと、それはそれで検索ボックスが非表示になってしまいうまくいきません。 おそらく、検索センターは Google 検索のように、ポータルサイトとして独立して機能するような意図で minimal.master が適用されているのかもしれません。 しかし実際には、 というかアタクシのケースでは、検索の機能はホームページの下に他のサイトや機能と同様に並列にぶらさがる、サイトの機能の一部としてユーザーに提供しています。 そこで、なんとかv4.masterを適用できないかと調べたら、次のサイトに答えがありました。 Converting a Custom SharePoint 2010 Master Page into a Search Center Master Page 他にもいくつか参考になるサイトがあります。 SharePoint Search Center uses minimal.master &#8211; and why you should care about that! SharePoint 2010 &#8211; [...]]]></description>
			<content:encoded><![CDATA[<p>SharePoint 2010 でサイトを構築するときの話です。</p>
<p>検索センターをどこに作成していますか?<br />
独立したWebアプリケーション下のサイト コレクションとして作成していますか? それともホームページとなるサイト コレクションの下に作成していますか?</p>
<p>まあ、いずれの場合でも、検索センターを作成すると、ナビゲーションが一般的な他のサイトとは異なってしまいます。</p>
<p>これは、通常のサイトは v4.master というマスターページが使用されているのに対して、検索センターでは minimal.master というマスターページが使用されているためです。<br />
ではマスターページを v4.master にすればよいかというと、それはそれで検索ボックスが非表示になってしまいうまくいきません。</p>
<p>おそらく、検索センターは Google 検索のように、ポータルサイトとして独立して機能するような意図で minimal.master が適用されているのかもしれません。<br />
しかし実際には、 というかアタクシのケースでは、検索の機能はホームページの下に他のサイトや機能と同様に並列にぶらさがる、サイトの機能の一部としてユーザーに提供しています。</p>
<p>そこで、なんとかv4.masterを適用できないかと調べたら、次のサイトに答えがありました。</p>
<ul>
<li><a href="http://blog.drisgill.com/2010/09/converting-custom-sharepoint-2010.html" target="_blank">Converting a Custom SharePoint 2010 Master Page into a Search Center Master Page</a></li>
</ul>
<p>他にもいくつか参考になるサイトがあります。</p>
<ul>
<li><a href="http://www.sharepoint911.com/blogs/john/archive/2010/05/12/sharepoint-search-center-uses-minimal-master-%E2%80%93-and-why-you-should-care-about-that.aspx" target="_blank">SharePoint Search Center uses minimal.master &#8211; and why you should care about that!</a></li>
<li><a href="http://sharepointroot.com/2010/08/05/sharepoint-2010-search-center-controls-missing/" target="_blank">SharePoint 2010 &#8211; Search Center Controls Missing</a></li>
<li><a href="http://social.msdn.microsoft.com/Forums/en/sharepoint2010general/thread/514c870d-323d-425e-b628-92e4c3f07ec8" target="_blank">Search box is missing when applied v4.master for search center sites</a></li>
<li><a href="http://www.google.co.jp/search?q=sharepoint+2010+%22Search+Center%22+%22minimal.master%22&amp;num=30&amp;hl=ja&amp;source=lnt&amp;sa=X&amp;ei=2ROsTOvsO4ulcbeWlccE&amp;ved=0CAYQpwU" target="_blank">Google で検索</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.piconix.net/archives/searchcenterwithoutnavigation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ユーザーが検索で表示されない</title>
		<link>http://www.piconix.net/archives/searchingusersfails/</link>
		<comments>http://www.piconix.net/archives/searchingusersfails/#comments</comments>
		<pubDate>Mon, 04 Oct 2010 10:12:37 +0000</pubDate>
		<dc:creator>管理人</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false">http://www.piconix.net/?p=485</guid>
		<description><![CDATA[SharePoint 2010 で検索を構成していて、はまりました。 通常の検索は問題なく行えます。しかし、ユーザー (ひと) を検索しようとしてもヒットしません。 User Profile 専用のクロール ルールを作成し、 https://somewhere.com sps3://somewhere.com といったように、検索先アドレスを指定していたのですが&#8230;。もう、ピンと来ましたか? イベント ログには、次のように記録されています。 ログの名前: Application ソース: Microsoft-SharePoint Products-SharePoint Server Search イベント ID: 14 タスクのカテゴリ: Gatherer レベル: 警告 説明: 開始アドレス sps3://somewhere.comをクロールできません。 コンテキスト: アプリケーション &#8216;Search_アプリケーション&#8217;、カタログ &#8216;Portal_Content&#8217; 詳細 : 指定されたタイムアウト時間内にリポジトリからの応答がなかったので、このアイテムをクロールできませんでした。しばらくしてからリポジトリのクロールを再試行するか、検索管理の [プロキシとタイムアウト] ページでタイムアウトの値を長めに指定してください。オフピーク時にこのリポジトリのクロールを実行することもできます。(0x80040d7b) さて原因ですが、プロトコル ハンドラの名前 sps3 を、sps3s にすべきだったのです。そう、サイトを SSL で保護していたのです。 脱力しました&#8230;.。数時間が&#8230;..。 あと、検索の構成に関しては、こちらのエントリが、非常に役に立ちました。 Successful SharePoint 2010 People Search [...]]]></description>
			<content:encoded><![CDATA[<p>SharePoint 2010 で検索を構成していて、はまりました。</p>
<p>通常の検索は問題なく行えます。しかし、ユーザー (ひと) を検索しようとしてもヒットしません。</p>
<p>User Profile 専用のクロール ルールを作成し、</p>
<blockquote>
<div id="_mcePaste">https://somewhere.com</div>
<div id="_mcePaste">sps3://somewhere.com</div>
</blockquote>
<p>といったように、検索先アドレスを指定していたのですが&#8230;。もう、ピンと来ましたか?</p>
<p>イベント ログには、次のように記録されています。</p>
<blockquote><p>ログの名前:  Application<br />
ソース:  Microsoft-SharePoint Products-SharePoint Server Search<br />
イベント ID:  14<br />
タスクのカテゴリ:   Gatherer<br />
レベル:   警告<br />
説明:<br />
開始アドレス sps3://somewhere.comをクロールできません。<br />
コンテキスト: アプリケーション &#8216;Search_アプリケーション&#8217;、カタログ &#8216;Portal_Content&#8217;<br />
詳細 :<br />
指定されたタイムアウト時間内にリポジトリからの応答がなかったので、このアイテムをクロールできませんでした。しばらくしてからリポジトリのクロールを再試行するか、検索管理の [プロキシとタイムアウト] ページでタイムアウトの値を長めに指定してください。オフピーク時にこのリポジトリのクロールを実行することもできます。(0x80040d7b)</p></blockquote>
<p>さて原因ですが、プロトコル ハンドラの名前 sps3 を、sps3s にすべきだったのです。そう、サイトを SSL で保護していたのです。</p>
<p>脱力しました&#8230;.。数時間が&#8230;..。</p>
<p>あと、検索の構成に関しては、こちらのエントリが、非常に役に立ちました。</p>
<p><a href="http://www.thesanitypoint.com/archive/2010/05/27/successful-sharepoint-2010-people-search.aspx?id=90&amp;List=032b7d51-232c-49f2-83f8-908ec51a95a5&amp;ItemID=90" target="_blank">Successful SharePoint 2010 People Search</a></p>
<p>また、プロトコル ハンドラの一覧は、こちら。</p>
<p><a href="http://technet.microsoft.com/ja-jp/library/dd695731(office.12).aspx" target="_blank">http://technet.microsoft.com/ja-jp/library/dd695731(office.12).aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.piconix.net/archives/searchingusersfails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SPSite 取得するだけで FileNotFound エラー</title>
		<link>http://www.piconix.net/archives/filenotfoundatspsite/</link>
		<comments>http://www.piconix.net/archives/filenotfoundatspsite/#comments</comments>
		<pubDate>Thu, 30 Sep 2010 05:21:48 +0000</pubDate>
		<dc:creator>管理人</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[SharePoint]]></category>

		<guid isPermaLink="false">http://www.piconix.net/?p=482</guid>
		<description><![CDATA[SharePoint 2010 にアップグレードしてから、はじめてコードを書いてみたところ、いきなりエラー。 Visual Studio 2010 で、とりあえずサイトでも取得するか、というごく簡単なコード SPSite site = new SPSite("http://mydev"); を実行してみたものの、 System.IO.FileNotFoundException が出ました。 何が問題だったかというと、プロジェクトのビルド設定で、x86 用になっていたため。環境は64ビットでした。これをなおしたところ、すんなり解決。 というか、影響出るんだ&#8230;.。]]></description>
			<content:encoded><![CDATA[<p>SharePoint 2010 にアップグレードしてから、はじめてコードを書いてみたところ、いきなりエラー。</p>
<p>Visual Studio 2010 で、とりあえずサイトでも取得するか、というごく簡単なコード</p>
<pre>SPSite site = new SPSite("http://mydev");</pre>
<p>を実行してみたものの、</p>
<pre>System.IO.FileNotFoundException</pre>
<p>が出ました。</p>
<p>何が問題だったかというと、プロジェクトのビルド設定で、x86 用になっていたため。環境は64ビットでした。これをなおしたところ、すんなり解決。</p>
<p>というか、影響出るんだ&#8230;.。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.piconix.net/archives/filenotfoundatspsite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>dotProject で日本語を入力しようとしてもできない</title>
		<link>http://www.piconix.net/archives/dotprojectdbcsissue/</link>
		<comments>http://www.piconix.net/archives/dotprojectdbcsissue/#comments</comments>
		<pubDate>Thu, 13 May 2010 09:18:30 +0000</pubDate>
		<dc:creator>管理人</dc:creator>
				<category><![CDATA[技術]]></category>
		<category><![CDATA[dotProject]]></category>

		<guid isPermaLink="false">http://www.piconix.net/?p=474</guid>
		<description><![CDATA[今、dotProject を扱っています。 無事にインストールも終了し、さて適当に Company でも追加するかと思い、日本語の会社名を入力して submit したところ、会社名がカラの会社情報が作成されてしまいました。 じかにデータベースを覗いて見ても、company_name 列には何も入っていません。 試しに、データベースの管理ツールで、直接このカラの company_name を編集して日本語を入れてみました。 dotProject 上では、文字化けしました。ブラウザのエンコードをEUC_JPに変更すると、表示されました。どうも、PHP と MySQL 間でエンコードの問題が起きているようです。 解決策として、次の一行を追加することで、修正できました。イタリックの赤字の部分が、挿入した行です。 /includes/db_connect.php // Quick hack to ensure MySQL behaves itself (#2323) $db-&#62;Execute("SET sql_mode := ''"); mysql_set_charset("utf8"); 要は、データベース接続が作成された直後に、文字コードを変えるのです。 この場所が適当かどうか、この変更の後に問題がないか、あまり詳細なテストをしていませんが、とりあえずは期待通り動いています。 ちなみに、当然ながら PHP のコードや MySQL の各種エンコード関係の設定は、UTF-8 にしたうえでの、操作です。]]></description>
			<content:encoded><![CDATA[<p>今、<a href="http://www.dotproject.net/" target="_blank">dotProject</a> を扱っています。</p>
<p>無事にインストールも終了し、さて適当に Company でも追加するかと思い、日本語の会社名を入力して submit したところ、会社名がカラの会社情報が作成されてしまいました。<br />
じかにデータベースを覗いて見ても、company_name 列には何も入っていません。</p>
<p>試しに、データベースの管理ツールで、直接このカラの company_name を編集して日本語を入れてみました。<br />
dotProject 上では、文字化けしました。ブラウザのエンコードをEUC_JPに変更すると、表示されました。どうも、PHP と MySQL 間でエンコードの問題が起きているようです。</p>
<p>解決策として、次の一行を追加することで、修正できました。イタリックの赤字の部分が、挿入した行です。</p>
<p style="padding-left: 30px;">/includes/db_connect.php</p>
<pre style="padding-left: 30px;">// Quick hack to ensure MySQL behaves itself (#2323)
$db-&gt;Execute("SET sql_mode := ''");
<span style="color: #ff0000;"><em>mysql_set_charset("utf8");</em></span></pre>
<p>要は、データベース接続が作成された直後に、文字コードを変えるのです。</p>
<p>この場所が適当かどうか、この変更の後に問題がないか、あまり詳細なテストをしていませんが、とりあえずは期待通り動いています。</p>
<p>ちなみに、当然ながら PHP のコードや MySQL の各種エンコード関係の設定は、UTF-8 にしたうえでの、操作です。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.piconix.net/archives/dotprojectdbcsissue/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

