Excel VBA で jQuery のようにアクセスできるライブラリを作れるか?

ちっとばかり頭の体操の意味も込めて、Excel VBA を jQuery 風に弄れるかどうかのテストを。結論から言えば、結構いけます。行けるんじゃないだろうか?の段階まではできました。

Option Explicit

' 宣言
Private XL As New XLQuery

Sub test001()
    XL.Cell("A1").Text = "masuda"
    XL.Cell("A1:A10").Text = "masuda"
    ' 行列指定
    XL.Cell(1, 2).Text = "masuda"
    ' 範囲指定
    XL.Cell(1, 2, 10, 2).Text = "masuda"
    ' 名前定義
    XL.Cell("#name").Text = "masuda"
    ' クラス定義(実は名前)
    XL.Cell(".name2").Text = "masuda"
End Sub

Sub test002()
    ' 背景色を設定
    XL.Cell(1, 1).css("background-color") = "#FF0000"
    ' 文字色を設定
    XL.Cell("A2").css("color") = "blue"
End Sub

な風なコードを書くと、

な位まではできることが確認できました。

練習コードも含めてあるので、無駄が多いですが、ちょっと全コードを晒しておきますw 二つのクラス(XLQuery, XLRange)を作ってください。

XLQuery クラス

Option Explicit
''' excel vba query

Private EmptyBook_ As Workbook
Private EmptySheet_ As Worksheet
Private Current_ As Worksheet
Private Selection_ As Range

''' 簡易プロパティ
Public Property Get Application() As Excel.Application
    Applicaiton = Excel.Application
End Property
Public Property Get Book() As Workbook
    Set Book = Excel.ActiveWorkbook
End Property
Public Property Get Sheet() As Worksheet
    Set Sheet = Excel.ActiveSheet
End Property

''' コンストラクタ
Public Sub Class_Initialize()
    Set Current_ = Excel.ActiveSheet
    Set Selection_ = Excel.ActiveSheet.Cells(1, 1)
End Sub

''' Empty チェック
Public Property Get EmptySheet() As Worksheet
    Set EmptySheet = EmptySheet_
End Property
Public Function IsEmptySheet(sh As Worksheet) As Boolean
   Set IsEmptySheet = IIf(sh = EmptySheet_, True, False)
End Function

''' Worksheet を取得
Public Function GetSheet(name As String) As Worksheet
    Set GetSheet = EmptySheet_
    Dim sh As Worksheet
    For Each sh In Me.Book.Sheets
        If sh.name = name Then
            Set GetSheet = sh
            Exit For
        End If
    Next
End Function

''' カレントシートの設定/取得
Public Property Get Current() As Worksheet
    If Current_ Is Nothing Then
        Set Current = EmptySheet_
    Else
        Set Current = Current_
    End If
End Property
Public Property Let Current(v As Worksheet)
    If v Is EmptySheet Then v = Nothing
    Set Current_ = v
End Property

''' テキストを取得/設定
Public Property Get Text() As String
    If Selection_ Is Nothing Then
        Text = ""
    ElseIf Selection_ Is Range Then
        Dim rg As Range
        Set rg = Selection_
        Text = rg.Text

    Else
        Text = ""
    End If
End Property
Public Property Let Text(Value As String)
    If Not Selection_ Is Nothing Then
        If TypeOf Selection_ Is Range Then
            Selection_.Value = Value
        End If
    End If
End Property

''' セルにアクセス
Public Function Cell(r1 As String, Optional c1 As String = "", Optional r2 As String = "", Optional c2 As String = "") As XLRange
    Dim rg As New XLRange
    ' Cell("A1")呼出
    ' Cell("A1:B10")呼出
    ' Cell("#id")呼出
    ' Cell(".class")呼出
    If c1 = "" Then
        If Left(r1, 1) = "#" Then
            rg.self = Me.Sheet.Range(Mid(r1, 2))
        ElseIf Left(r1, 1) = "." Then
            rg.self = Me.Sheet.Range(Mid(r1, 2))
        Else
             rg.self = Me.Sheet.Range(r1)
        End If
    ' Cell(1,1)呼出
    ElseIf r2 = "" Then
        rg.self = Me.Sheet.Cells(CInt(r1), CInt(c1))
    ' Cell(1,1,2,10)呼出
    Else
        rg.self = Me.Sheet.Range(Me.Sheet.Cells(CInt(r1), CInt(c1)), Me.Sheet.Cells(CInt(r2), CInt(c2)))
    End If
    Set Cell = rg
End Function

XLRange クラス

Option Explicit
Private text_ As String
Private range_ As Range

Public Property Get Text() As String
    Text = text_
End Property
Public Property Let Text(v As String)
    text_ = v
    If Me.self Is Nothing Then Exit Property
    Me.self.Value = v
End Property

Public Property Get self() As Range
    Set self = range_
End Property
Public Property Let self(v As Range)
    Set range_ = v
End Property

Public Property Let css(prop As String, v As String)
    If Me.self Is Nothing Then Exit Property
    Select Case StrConv(prop, vbLowerCase)
    Case "background-color": self.Interior.Color = toRGB(v)
    Case "color": self.Font.Color = toRGB(v)
    End Select
End Property

Private Function toRGB(v As String)
    If Left(v, 1) = "#" Then
        Dim r, g, b
        r = CInt("&H" + Mid(v, 2, 2))
        g = CInt("&H" + Mid(v, 4, 2))
        b = CInt("&H" + Mid(v, 6, 2))
        toRGB = RGB(r, g, b)
    Else
        Select Case v
        Case "red": toRGB = RGB(255, 0, 0)
        Case "blue": toRGB = RGB(0, 0, 255)
        Case "green": toRGB = RGB(0, 255, 0)
		' このあたりは後で
        End Select
    End If
End Function

プロパティとパラメータの省略(option)を駆使して、それ風に動くようにします。VBA の制限としてクラスをひとつのファイルに複数のクラスを置けないので、利用する側を考慮してクラスは多くない様にします。なので、継承など本来のオブジェクト指向は無視して(苦笑)、使いやすい形で「オブジェクト」の部分だけ残しておくということで。
XLRange クラスの css プロパティを使って、スタイルシート風に設定ができるようにすれば、Excel のオブジェクトを覚えなくて良いので、その点は楽かなと。

カテゴリー: 雑談, Excel VBA | 1件のコメント

Xcode 4.2 でUINavigationControllerを使う

UITableViewController と UINavigationController を使って画面を作ると、手軽に業務アプリ的な入力画面が作れるはずなのですが、この扱いが意外大変なのです…が、実は、Xcode 4.2 から導入された storyboard の機能を使うと「非常に簡単に」(と言っても以前に比較してというところでしょうが)、ページが扱えますという tips です。まぁ、実の処は、執筆中の本で使うサンプルなのですが。

imageimage

上記のようにテーブルの項目をタップすると、画面間を行き来できる、というツリー構造のアプリです。

■Xcode 4.2 で Master-Detail Application を選択

XCode で既にテンプレートが用意されているので、これを使います。「Master-Detail Application」を選択すると、上記のようなアプリのひな型が作成されます。

image

アプリケーション名を「SampleNavi」のように付けます。「Use Core Data」のところで、おそらくデータバインドができると思うのですが、テンプレートではチェックが外れています。このあたりは後日。

image

すると、下記のような3つの Controller が自動で作成されます。

image

  • Navigation Controller
  • Master View Controller ( TableViewController )
  • Detail View Controller ( ViewController )

Navigation Controller は、他の View のページ遷移を扱っているコントローラーです。TableViewController や ViewController の上についてナビゲーターのバーがこれにあたります。ページを戻るためのボタンが自動で出てきます。

■ファイルとの対応

image

実際のファイルとの対応は、

  • Master View Controller(UITableViewController) が、MasterViewContoller.h
  • Detail View Controller(UIViewController)が、DetailViewController.h

となっています。Master ページはひとつなので、基本は MasterViewController.h には手を入れません。また、DetailViewController は、遷移先の View に対してひとつ作るようにすると楽です。勿論、TableView の項目が同じ View を共有する場合は、DetailViewController でも構いません。

さて、storyboard の View とソースファイル(*.h, *.m)との対応をどのように取っているかというと、左側の画面で「Detail View Controller – Detail」を選択した後で、右側の Show the identity inspector のアイコンをクリックします。

image

すると、Class のところに、「DetailViewController」と表示されています。

image

これが、storyboard の View とコードファイルの対応になります(実際にはクラス名)。

■Detail 画面を増やす

さて、ここでもうひとつ Detail 画面を増やしてみましょう。

まず、Master View Controller の Table View Cell をクリックして、コピー&ペーストします。名前を「Other」に変えておきます。

image

追記 ~ Cell を2回クリックして attributes inspector で設定します。

20130508_01

同じように、Detail Controller View をコピーして、ペーストします。この時点では、ナビゲーターのバーはありません。

image

再び、Table View Cell の 「Other」を選択した状態で、右側の「Connection inspector」を開きます。

image

「push」の connection を、新しく作った ViewController に接続させます。

image

すると、自動的にナビゲーションバーが追加されます。名前が「Detail」のままなので、「Other」に変更しておきます。

image

■ソースコードを作成する。

DetailViewController クラスをひな形にして、OtherViewController クラスを作成します。Finder でファイルをコピーして、内部のクラス名を「DetailViewContoller」から「OtherViewController」に変更しておきます。

2つのファイルをプロジェクトに追加します。

image

■OtherViewContoller クラスを結びつける

新しく追加した Other View Controller を選択して、identity inspector を開いて、結び付けるクラスを「OtherViewController」に変更します。

image

これで、新しい View が、追加した OtherControllerView と結び付けられます。

■実行してみる

imageimage

実行してみると Master から Detail、Master から Other 画面への遷移ができているのが分かります。ここでは、Detail と Other とが同じ ラベルの表示になっているので、遷移のテストをするときに文字などを変えてみると分かり易でしょう。

あとは、View に対するクラスが異なるので、自由に画面を作っていけば ok です。サンプル画面を作るときに、View の遷移のコーディングが大変だったりするのですが、master-detail のテンプレートを使うと、非常に簡単です。詳細ページを増やす場合は、Other ページと同じ要領で ViewController を増やしていけばいいのです。

…というメモを残しておかないと、自分自身が忘れてしまうので、おすそ分けということで。

カテゴリー: Objective-C | Xcode 4.2 でUINavigationControllerを使う はコメントを受け付けていません

[VB] VB6.0風にVB.NETでデフォルトプロパティを作る

前回、[C#] VB6.0風にC#でデフォルトプロパティを作る | Moonmile Solutions Blog の続きです。と言うか、こっちを先に書かないと訳が分からないですよね。

Public Class Form1

	''' <summary>
	'''  インデックスを利用した例
	''' </summary>
	''' <param name=&quot;sender&quot;></param>
	''' <param name=&quot;e&quot;></param>
	''' <remarks></remarks>
	Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
		Dim obj As New DefaultClass
		' 配列も関数呼び出しも「()」なので、関数呼び出しに見えるのが難点か
		Debug.Print(obj(10))
		Debug.Print(obj(&quot;key&quot;))

		Debug.Print(obj.Item(10))
		Debug.Print(obj.Item(&quot;key&quot;))

	End Sub

	''' <summary>
	''' 暗黙の型変換を使う
	''' </summary>
	''' <param name=&quot;sender&quot;></param>
	''' <param name=&quot;e&quot;></param>
	''' <remarks></remarks>
	Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
		Dim obj As New DefaultClass

		Dim name As String = obj
		Debug.Print(&quot;name:{0}&quot;, name)
		Dim num As Integer = obj
		Debug.Print(&quot;num:{0}&quot;, num)

	End Sub
End Class

Public Class DefaultClass
	Public Sub New()
		Me.ItemName = &quot;DefaultClass&quot;
		Me.ItemNum = 10
	End Sub

	''' <summary>
	''' デフォルトプロパティを作る
	''' </summary>
	''' <param name=&quot;i&quot;></param>
	''' <value></value>
	''' <returns></returns>
	''' <remarks></remarks>
	Default Public ReadOnly Property Item(i As Integer) As String
		Get
			Return String.Format(&quot;item-int {0}&quot;, i)
		End Get
	End Property
	Default Public ReadOnly Property Item(name As String) As String
		Get
			Return String.Format(&quot;item-name {0}&quot;, name)
		End Get
	End Property

	Public Property ItemName As String
	Public Property ItemNum As Integer
	''' <summary>
	''' 暗黙のキャスト
	''' </summary>
	''' <param name=&quot;obj&quot;></param>
	''' <returns></returns>
	''' <remarks></remarks>
	Public Shared Narrowing Operator CType(obj As DefaultClass) As String
		Return obj.ItemName
	End Operator
	Public Shared Narrowing Operator CType(obj As DefaultClass) As Integer
		Return obj.ItemNum
	End Operator
End Class

もともと、既定のプロパティという考え方が、VB6.0から来ているので(正確にはVB3.0の頃ですかね?)VB.NET のほうが素直に書けます。
「obj(10)」のようにインデックスを使う場合には、「Default」というキーワードを使います。上記のソースの場合には、Item プロパティを多重定義しているので、Integer 型、String 型の両方の Item プロパティの定義に Default を設定します。

暗黙の変換のほうは「Narrowing」というキーワードですね。これが C# の implicit にあたります。逆に、明示的な変換のほうは「Widening」というキーワード。C# で云えば explicit です。

暗黙の変換を使うと、

Dim name As String = obj
Debug.Print("name:{0}", name)
Dim num As Integer = obj
Debug.Print("num:{0}", num)

という書き方ができて、対象のオブジェクトから値を取り出すときに便利です(つーかかえってややこしいかも)。取り出す利用者側として、「name」「num」の型はわかっているので「name = obj」、「num = obj」とやっても、それぞれの string 型、integer 型を類推させることが可能、ということです。普通は「name = obj.name」のように目的のプロパティを指定する訳ですが、取り出す string 型が一種類しかないのであれば「name = obj」としても良かろうという意味ですね。

本当は、「obj = name」のように逆向きも作りたいところなのですが、単純な代入演算子(=演算子)はオーバーライドできないので、無理なのです。仕方がないので二項演算子と組わせた「*=」とか「+=」とかならば可能なので、その話は後日。「+=」はデリゲート関係で使っていますね。

カテゴリー: VB | [VB] VB6.0風にVB.NETでデフォルトプロパティを作る はコメントを受け付けていません

[C#] VB6.0風にC#でデフォルトプロパティを作る

VB6.0の頃は、デフォルトプロパティというものがあって、
http://akihitoyamashiro.com/VBA/CreateDefaultProperty.htm

なところにあるように、「Attribute Value.VB_UserMemId = 0 」という属性(みたいなもの)を設定して、オブジェクトのプロパティを決めていました。まあ、大ざっぱに言えば、「obj.Item(10)」のように配列にアクセスするときに、「obj(10)」のように、Itemメソッドを省略できるという技です。普通は Item というメソッドが使われるのですが、このメソッド名は「Attribute Value.VB_UserMemId = 0 」を付けメソッド(プロパティ)の場合は、これが省略できるという仕組みです。

で、これを C#, VB ならばどうやるか、という話を少し。

private void button1_Click(object sender, EventArgs e)
{
	DefaultClass obj = new DefaultClass();
	Debug.Print(obj[10]);
	Debug.Print(obj.Item(10));
	Debug.Print(obj["key"]);
	Debug.Print(obj.Item("key"));
}

private void button2_Click(object sender, EventArgs e)
{
	DefaultClass obj = new DefaultClass();
	// string 型に暗黙の変換
	string name = obj;
	Debug.Print("name:{0}", name);
	// int 型に暗黙の変換
	int num = obj;
	Debug.Print("num:{0}", num);
}

「既定のプロパティ」という機能をちょっと拡大解釈して、添え字(あるいは添え文字列?)で扱う時のメソッドと、単純にオブジェクトから別の型に変換されるときのプロパティ、という風に分けてみました。

■添え字を使う場合

「obj.Item[10]」と「obj(10)」が同じような動作をするためには、次なように、this[…] のように書きます。[] 演算子は多重定義が効くので、int型とstring型の両方を一度に作れます。配列風なものと連想配列風なものですね。これは、string型だけじゃなくて、任意のobject型も使えるので結構不思議な使い方ができます。

public string Item(int i)
{
	return string.Format("item-int:{0}", i);
}
public string Item(string name)
{
	return string.Format("item-str:{0}", name);
}
// Default と同じ扱いが可能
public string this[int i]
{
	get { return this.Item(i); }
}
// 連想配列風に
public string this[string name]
{
	get { return this.Item(name); }
}

ちなみに、[] 演算子は、ふたつ以上の引数を持つことができるので、obj[x,y] のようなアクセスの仕方もできます。定義は↓のようですね。

// 引数が二つある場合
public string this[int x, int y]
{
	get { return string.Format("{0} {1}", x, y); }
}

■暗黙の変換を使う

もうひとつ、implicit を使って暗黙的に変換させることができます。普通は、自前で作成したクラスからstring型のプロパティを取り出すには、ToString メソッドをオーバーライドしたりしますが、もっと端的にキャストを使っても良いわけです。↓のように、DefaultClass 型から、string型やint型に自動で変換してくれます。

rivate void button2_Click(object sender, EventArgs e)
{
	DefaultClass obj = new DefaultClass();
	// string 型に暗黙の変換
	string name = obj;
	Debug.Print("name:{0}", name);
	// int 型に暗黙の変換
	int num = obj;
	Debug.Print("num:{0}", num);
}

これを実装するためには、implicit を使って、string型や int型に自動的に変換されるようにします。ちなみに、implicit は暗黙変換なので、明示的な変換(キャスト)を使いたい場合は、explicit を使えば ok です。

public string ItemName { get;  set; }
public int ItemNum { get;  set; }

/// <summary>
/// 暗黙変換(string型)
/// </summary>
/// <param name=&quot;obj&quot;></param>
/// <returns></returns>
public static implicit operator string( DefaultClass obj ) 
{
	return obj.ItemName;
}
/// <summary>
/// 暗黙変換(int型)
/// </summary>
/// <param name=&quot;obj&quot;></param>
/// <returns></returns>
public static implicit operator int(DefaultClass obj)
{
	return obj.ItemNum;
}

これが何に役に立つかというと…あまりにトリッキー過ぎて役に立たないというか、文法的に不思議な感じになってしまというか、妙な感じになるので、多用するのはちょっと、という気になります。

…が、いま作っている ExDoc という XML をパースするライブラリは、このあたりを使っていて配列をstring型に自動変換したり、コレクションから単一のオブジェクトに代入するときに暗黙にキャストをしていたりします、という詳細は別の機会に。ソースコードは git にあるので、moonmile/ExDoc – GitHub ご覧ください。ただ今、HTML のパースを準備中。

カテゴリー: C# | 1件のコメント

[のだめ開発] 指揮者 conductor の役割とは

のだめカンタービレ – Wikipedia を見ると、原作のほうは2001年から、アニメのほうは2007年から、ということで、TOMOKO NINOMIYA WEBSITE が二ノ宮女史のページ

 

image

 

音楽のオーケストラを、ソフトウェア開発のオーケストレーション(コンピュータ用語では、自動化の意味を示すのだけど、ここでは、本来の意味の Orchestration アンサンブル 管弦楽法 – Wikipedia のほうに意味にあわせる)を考えたときに、以前は「指揮者 Conductor」を「プロジェクトマネージャ project manager」と同値に考えて、「管理者」という言葉の響きからくる「管理する人」「管理される人」という区分を類推してしまい、いまいち…と思っていたのですが、ちょっと思い直して manager とは違う、本来の意味の conductor から、ソフトウェア開発プロセス/チームを考え直してみよう、という企画です。つーか、まぁ、妄想も大いに。

アニメの lession 5 で、S オケで千秋真一君が失敗したのは、コンダクターではなくて、オケを管理しようとしていたから、という解釈をして話を進めていくと、

  • オーケストラのメンバを「支配」しようとうする management をすると、失敗する例

として挙げられる。その後に、シュトレーゼマンが、S オケのメンバをとりなす手法は、ワインバーグの言う「くすぐり」の手法なんだけど、これが conductor の手法のひとつでもあるワケ。これを、そのまま複数名のソフトウェア開発に当てはめると(ウォーターフォールでも、アジャイルでも同じ)、

  • プロジェクトメンバを「支配」しようとする management をすると、失敗する

となる。ただし、これは類推にすぎなくて、実はソフトウェア開発として「支配的」に行う場合もあり得る。「支配的」≒「mission commander と soldier の関係」ということですね。いわゆる「軍隊式」という奴です。「社畜といえども楽しい職場」という言葉がある通り(これはある)、soldier 的に働いている方もいらっしゃるわけで、逆に言えば、何も全てを「アジャイル式」にしなくてもよいし、何も全てを「軍隊式」に仕上げなくても良い。それぞれの company の風土もあれば、mission も様々で、オーケストラが様々なように、オーケストレーション自体も様々、という具合。

…が、ここでは、本来の「オーケストレーション」を目指してみると、

  • プロジェクトメンバを「支配的」に扱うと、そのプロジェクトは失敗する確率が高くなる(ほぼ 100% に近くなる)
  • プロジェクトメンバを「支配的」に扱わないことが、唯一のオーケストレーションの道である。

と結論付けられる。ここで言う「支配的 dominant」を再定義すると、千秋真一君が「俺の言う通りに演奏しろ」から派生させて、

  • 「俺の設計通りに作れ」
  • 「俺のスケジュール通りに進めろ」
  • 「俺のリスク管理は完璧なんだ(俺の感知しないリスクは考えなくていい)」
  • 「俺のワークの分け方 WBS は完璧なんだ」

ってところで「俺様」風が発生してしまうと、アレなわけです。このあたり、しばらくのだめを見続けると、先にももう一つ指揮者コンクールのシーンがあります。

この「俺様」のところ、管理的/支配的(本来の management の意味とは離れるので、commander のほうを充てるのがよいかも)に頭の中の展開を「絶対」にしてしまうところにが「軍隊的」であったりします。いやいや「俺様」自体は実は悪くは無くて、

  • 「俺が考える最高の設計を作った」
  • 「俺が考えるできる限り実現可能なスケジュールを立てた」
  • 「俺の考えるリスク管理だ」
  • 「これは、俺の WBS の分け方だ」

というような、「俺様」カテゴリ内の「事実/製作物」だけ取り出せばよいわけで、それを未知なる現実やプロジェクトメンバとの突合せとしての現実にあわせたときに、そこに出てくるのは conductor の技法なわけです。メンバ自体は、実はばらばらの「理想」を持っている(あるいは「技量」を持っている)ので、それを加味した上で(それは指揮者の技量かもしれず、あるいは現実解なのかもしれず)、全体としてのオーケストラを作り上げて、音楽を作り上げる(観客に聴かせる)という目的を達成するわけです。

これを、ソフトウェア開発の管理者、指揮者、プロジェクトマネージャに引き合わせてみると、理想としての目標あるいは目的、あるいは現実としての目標を掲げると同時に、その「行程」に責任を持つ(あるいは助力する)ということになります。

「行程に対する助力」って何ぞや、というのは次回。

カテゴリー: のだめ開発プロセス | [のだめ開発] 指揮者 conductor の役割とは はコメントを受け付けていません

非同期スクリプトをWordPressに埋め込む

最近海外で流行りのTwitter,Facebook,Google+1,Analyticsをまとめる非同期スクリプトにはてなを加えてみた | ゆっくりと…
http://tokkono.cute.coocan.jp/blog/slow/index.php/xhtmlcss/asynchronous-loading-of-major-social-buttons/

はてな数がアレなので、いまいち躊躇していたのですが、上記のスクリプトを本ブログに埋めてみました。

本当は、適当なプラグインを作って埋め込むとバージョンアップが楽なんですが…まぁ、直接埋め込みということで。埋め込まれているのが、「ツイッター」「はてな」「facebook」で、google+ が外れているのは、google+ を配置すると、何故か改行してしまうからなんですね。後で、並べられるようになったら追記します。

■footer.phpにスクリプトを埋め込む

<script type=&quot;text/javascript&quot;>
    (function (w, d) {
        //        w._gaq = [[&quot;_setAccount&quot;, &quot;UA-XXXXXXXX-X&quot;], [&quot;_trackPageview&quot;]];
        //        w.___gcfg = { lang: &quot;ja&quot; };
        var c, e = d.createDocumentFragment(), f = d.getElementsByTagName(&quot;script&quot;)[0],
    a = function (a, b) {
        if (!d.getElementById(b)) {
            c = d.createElement(&quot;script&quot;);
            c.src = a; c.id = b || null; c.async = true; e.appendChild(c);
        }
    };
        // a((&quot;https:&quot; == location.protocol ? &quot;//ssl&quot; : &quot;//www&quot;) + &quot;.google-analytics.com/ga.js&quot;);
        a(&quot;https://apis.google.com/js/plusone.js&quot;);
        a(&quot;//b.st-hatena.com/js/bookmark_button_wo_al.js&quot;);
        a(&quot;//platform.twitter.com/widgets.js&quot;);
        a(&quot;//connect.facebook.net/ja_JP/all.js#xfbml=1&quot;, &quot;facebook-jssdk&quot;);
        f.parentNode.insertBefore(e, f);
    })(this, document);
</script>

</body>
</html>

google analytics は使わないのでコメントアウトして(使う場合は、「UA-XXXXXXXX-X」のところを修正)、body の終了タグの直前に入れます。はてな等のタグを読み込んだ後にスクリプトを動作させるため、読み込み時の一番最後に埋め込む、という具合

■loop-single.php と loop-page.php に埋め込む

何処に埋め込んでもいいのですが、entry-content の直前に入れてあります。

					<div class=&quot;entry-meta&quot;>
						<?php twentyten_posted_on(); ?>
					</div><!-- .entry-meta -->

<a href=&quot;https://twitter.com/share&quot; class=&quot;twitter-share-button&quot; data-via=&quot;moonmile&quot; data-lang=&quot;en&quot;>tweet</a>
<a href=&quot;http://b.hatena.ne.jp/entry/&quot; class=&quot;hatena-bookmark-button&quot; data-hatena-bookmark-layout=&quot;standard&quot; title=&quot;このエントリーをはてなブックマークに追加&quot;><img src=&quot;http://b.st-hatena.com/images/entry-button/button-only.gif&quot; alt=&quot;このエントリーをはてなブックマークに追加&quot; width=&quot;20&quot; height=&quot;20&quot; style=&quot;border: none;&quot; /></a>
<div class=&quot;fb-like&quot; data-send=&quot;false&quot; data-layout=&quot;button_count&quot; data-width=&quot;450&quot; data-show-faces=&quot;false&quot; data-font=&quot;arial&quot; style=&quot;display:inline;top:-6px&quot; ></div>

					<div class=&quot;entry-content&quot;>

facebook のいいねボタンは、そのまま使うと div タグで改行してしまうので、「style=”display:inline;top:-6px”」を指定してあります。top で位置をずらしてあるのは、はてなボタンとツイートボタンと同じ位置に合わせるためです。はてなとツイートボタンは iframe なんですが、facebook ボタンは div タグなのが違いかと。多分、テンプレートによって異なると思うので、この値は随時調節。

■loop.php に埋め込み

トップページを開いたときは、loop.php が呼び出されるので、これにも埋め込みます。

			<div class=&quot;entry-meta&quot;>
				<?php twentyten_posted_on(); ?>
			</div><!-- .entry-meta -->
</p>
<p>
<a href=&quot;https://twitter.com/share&quot; class=&quot;twitter-share-button&quot; data-via=&quot;moonmile&quot; data-lang=&quot;en&quot; data-url=&quot;<?php the_permalink(); ?>&quot; data-text=&quot;<?php the_title(); ?>&quot; >tweet</a>
<a href=&quot;http://b.hatena.ne.jp/entry/<?php the_permalink(); ?>&quot; class=&quot;hatena-bookmark-button&quot; data-hatena-bookmark-layout=&quot;standard&quot; title=&quot;このエントリーをはてなブックマークに追加&quot;><img src=&quot;http://b.st-hatena.com/images/entry-button/button-only.gif&quot; alt=&quot;このエントリーをはてなブックマークに追加&quot; width=&quot;20&quot; height=&quot;20&quot; style=&quot;border: none;&quot; /></a>
<div class=&quot;fb-like&quot; data-href=&quot;<?php the_permalink(); ?>&quot; data-send=&quot;false&quot; data-layout=&quot;button_count&quot; data-width=&quot;450&quot; data-show-faces=&quot;false&quot; data-font=&quot;arial&quot; style=&quot;display:inline;top:-6px&quot; ></div>
</p>
<p>
	<?php if ( is_archive() || is_search() ) : // Only display excerpts for archives and search. ?>
			<div class=&quot;entry-summary&quot;>
				<?php the_excerpt(); ?>
			</div><!-- .entry-summary -->
	<?php else : ?>
			<div class=&quot;entry-content&quot;>
</p>
<p>

記事が複数表示されるので、<?php the_permalink(); ?> を入れて記事のURL(パーマリンク)を指定させます。これをしてしないと、表示されているURLが指定されてしまうのでURLを指定します。

非同期読み込みなので、先に記事が表示されて後からツイートボタン等が表示されます。表示が早くなるのはいいかなと。

でも、ツイートボタンのツイート数って、なんか合わないんですよね…まあ、これはツイッター本家の問題なので、仕方がないかと。

カテゴリー: Javascript, Wordpress | 2件のコメント

moonlight mile 第4巻におけるハーモニーの話を少し

「のだめ開発プロセス」を考えるにあたって、風呂で読んでいたのが、これ。いや、正確には目指して読んでいたわけではないのだけど、目指すものに出会えるという幸運(正確には、「気になっていることだから、目の前にあるものに気づくという現象なんだが)に巡り合うという話を少し。

IT業界に入ると、最新技術への好奇心(僻地探索というかエリート意識とかそういうものも含む)と、ビジネス的にお金周辺のところに悶絶することになるのだが…う~ん、「社畜でありつつも楽しいIT土方」というブログの文言を見て、「人より頭がいいけど、ほどよく働いて程よく給料を貰う公務員の人生」(この人は一般的な公務員だったよ)を思い出してみたりします。IT業界にいると、google とか microsoft とか apple とか facebook のように一発当ててやろう気分の場合もあれば、経済的にはどうでもいいけど兎に角楽しいプログラミング(あるいは巨大プロジェクトを扱うというのも含めて)をしたいという場合もある。その感覚は、交互に襲ってくるのか、それとも片方をあきらめるのか、ということなのですが…数年前から、いくつかのIT系の勉強会から離れてしまっている(今は.NETラボぐらいしか出てない)ので、現状のソフトウェア界隈のモチベーションがどんなのか分かりかねるのですが、ひとまず、twitter で追っている限りは、「世代が違うなぁ」というほどには個々に盛んなようです。

さて、前置きはそれくらいにして、ちょっとハーモニーの話。

ソフトウェア開発プロセスに、建築の比喩を持ち込むのと同じく、音楽の比喩も結構用いられます。オーケストラという比喩や、ハーモニーという比喩もそうです。現実の泥臭い部分(現実が現実であるという部分)を抜きにして、仲間意識なりグループ意識を持ち込むことがあります。ただ先に書いた通り、「現実が現実である部分」があって、それは、上司との関係であったり、納期であったり、顧客との交渉であったり、会社内の組織としてのITプロジェクトと、社外に接することが多いITプロジェクトとは様相が全く違っているわけです。そのあたりを、一緒に扱ってしまうのはどうかなぁ、と常々思っていて、結局のところ「アジャイル」自体も括弧付きに見えてしまったりするのです。

…が、最近思い直したのですが、今の現実に引きずられなければいけないことは全くなく(全くでもないんだが)、自分なりのまだ見ぬ現実を作るのもありかなぁと思ったりしております。それは「幻想」よりも「妄想」に近いことは承知しているのですが、「妄想」すら許されれない現実というのもちょっと嫌かなぁと。つまりは、社会的にスライドするということですよ。

ソフトウェア開発というのは、実は、ひとりで開発もできるという点で比較的漫画家や小説家に近いところがあります、とマスダは結論付けます。と同時に、チーム開発なり分業をするという点で、漫画家やアニメーションと似たところがあります、とマスダは続けます。他の現実とは違うところで、新しい現実(というか社会現象)を構築することは、実は漫画やアニメーションやオーケストラと似たようなところもあり、かつ、「個人のモチベーションに依る」という手法も取れる(当然、個人のモチベーションに依らないという方法もある)、ことも似ています、とマスダはマスダは更に議論を拡げてみたり。

このことを踏まえると、実は、ウォーターフォールなりアジャイルなりという開発プロセスを、別の軸(別の平面という意味で)で見ることもアリで、その中に「ハーモニー」という軸や、「オーケストレーション」(コンダクターや、プレイヤー、ソリスト、協奏曲などなど)のメタファを含めて思考実験するもありなのでしょう。それは、直接的な「ハーモニー」を求めるわけではないけれど、一種シミュレーション的な思考実験という範囲で、ということです。社会の縁の人間としては、あまり現実的なように思えない時もあるのですが、いやいや、軸自体(次元自体)が異なるので、そのあたりは未来に託すとことなのかもしれまんせん。

ハーモニーというのは「協調性」という言葉で表されるので、時において既存の社会/集団に対する協調性を問われることも多いのですが、実は、強烈な個性と強烈な個性があわさるところに生まれるものも「協調性」というものであり、それこそが実はハーモニーの目指すところではないか、と結論づけるわけなんだにゃぁ。わかるかにゃぁ。絶対的な個性というものは、相対的な個性とは違うところにもあるんです、ぎゃぽー。とか。そんな訳で「ハーモニー」なんですよッ!!!

カテゴリー: のだめ開発プロセス | moonlight mile 第4巻におけるハーモニーの話を少し はコメントを受け付けていません

[C#] インターネットから画像をダウンロードしてメモリ上で操作する

ちょっと、技術ネタを放出。

ツイッターのクロールツールを作る中で、プロフィール画像をどうしようかと思っていたのですが、一度ファイルに落とさなくてもプロフィール画像(profile_image_url)をダウンロードしてメモリ上で操作できますよ、という話です。
このテクニック、asp.net mvc の記事を書いていたときに、ASP.NET MVC アプリケーション開発入門: 第 9 回 出力キャッシュの利用 – MSDN サンプル ギャラリー で microsoft の方に教えて頂きました thanx.

// アイコン表示
WebClient cl = new WebClient();
byte[] pic = cl.DownloadData(profile_image_url);
MemoryStream st = new MemoryStream(pic);
pictureBox1.Image = new Bitmap(st);
st.Close();

方法は単純で、WebClient で指定のURLをダウンロードして、byte 配列に入れます。こうすると on memory になるので、MemoryStream を通して、Bitmap に直します。これを PictureBox に代入すれば ok です。
って、簡単に書いていますが、試行錯誤すると結構面倒なもので「ストリームを使ってなんとかできる」ってのを覚えておけば ok です。
C# も java と同じように stream があちこちで使えるようになっているので。

実行するとこんな感じにできます。

ああ、自分のツイートも3,000を超えてしまったので、twitter api だけでは全てを取得できないんですよね。早く google 経由で取ることも考えないと。いくつか見ていくと、2万ツイートを超える方もかなりいるようなので。

カテゴリー: C# | [C#] インターネットから画像をダウンロードしてメモリ上で操作する はコメントを受け付けていません

ソフトウェア開発プロセスとオーケストラの関係(メモ書き)

ちょっとルールを決めてみる。

考察の対象は、ウォーターフォールだったりアジャイルになるんだろうけど、「比較対象」にしないようにしよう。比較対象にしてしまうとと、批判的なことになっていしまうので水掛け論にしかならない(ウォーターフォールだけにw)。なので、実現可能性を求めることにして、実現不可能性のところは、多少オミットする。実現不可能性というのは、悲観的な意見(現実がアレだから、どうにもならないことだから)という悲観的…と言いますか、「実現不可能であることの原因を外部に求めてしまうところ」のことで、所詮、ひとつひとつのプロジェクトは「プロジェクト」であるがゆえに、完全な相似は求められないのだから(だけど、若干の相似性はある。という前提がある)、外部要因も様々、ひるがえって、現実にである内部要因も様々である、ということを認識する。

なので、「なんとなくできたらいいなぁ、夢の開発プロセス」でも ok かと思う。そういう意味では、SF 的に思考実験みたいなもので、それがアジャイル界隈になるのか、逆にウォーターフォール界隈になるのか、スクラムになるのか、統一プロセスになるのかということをカテゴリに含めるのではなく、横軸として考えることにしよう。ワインバーグの本は直接ひも解くと引きずられてしまうので参照程度に。

そうそう、オーケストラとの対比の中で、ベースはのだめカンタービレを用いる第一の理由として「人物に投影すると分かり易いから」というのがある。理論的なところや手順を示しても、なんとなく可能できそうな、可能でなさそうな、スーパーマンを予想してみたりと、人物像が結べなかったりする。ふと、気づいたのが、それってプロセス開発を構築するにあたり「ペルソナ」自体がうまくいっていないでは?と思ったり。いや、発案者自身はわかっているのだが、説明するにあたり、説明を受ける側が像を結べないのではなか、と勘繰ってみたり。なので、その補完をする意味で、多少の揺れ/ぶれは目をつぶるとして焦点が合しやすい「像」を立てておくことは重要だ。それが、「のだめカンタービレ」の登場人物であったりする。

そうそう、他人と何かの認識を合わせることきには、「共通認識(バックグラウンド)」が必要だ。だから、ある程度のバックグラウンドを共有していない相手は、どうやっても認識を合わせることはできない、と最近結論付けている。そうそう、人に「期待」するところはできるだけ小さくしておくのがよく、同時に、インプットとアウトプットの組み合わせを確認することによって、その人が何を考えているのか(あるいは考えていないのか)が分かる、という具合だ。

という訳で、バックグランドで動いていたプロセスも終了したようなので、ひと区切りします。売り文句として「歌うようにプログラミングする」あるいは「歌うように開発をプロセスする」というのを思いついた。当然、「流れるようにコーディングする」へのオマージュである。

カテゴリー: 雑談, のだめ開発プロセス | ソフトウェア開発プロセスとオーケストラの関係(メモ書き) はコメントを受け付けていません

のだめカンタービレに学ぶソフトウェア開発プロセス(音合わせ中)

「のだめカンタービレ」というのは、一斉を風靡した(したのか?)クラッシック・ギャク漫画ですが、ギャグというか正統な音楽漫画なんですけどね。ホントは。

image

実写のほうはさておき…、原作漫画とアニメのほうをベースにして、ソフトウェア開発プロセスを解説/考察していきたいと考えています。実は、ソフトウェア開発組織はオーケストラ:柴田 芳樹 (Yoshiki Shibata):So-netブログ な話で、オーケストラとソフトウェア開発の類似点は考察に値するなぁ、と漠然と考えていた(第10巻ぐらいを読んだあたりで)のですが、アジャイル開発とのバッティングがって思考停止しておりました。

が、最近、ブログテーマ[とある現実な掌握術]|システム開発の見積もりブログ をぽちぽちと書いていて、なるほど真面目にアニメとの組み合わせでソフトウェア開発プロセス自体を考察するのも良いかなと思い始めました。まあ、この「とある現実的な~」の話は、「魔法少女まどか☆マギカ」における建築的考察⑥最終|建築エコノミスト 森山のブログ へのオマージュなんですけどね。森山さんのブログは結構前から見ています。

以前、ソフトウェア開発とオーケストラとの比較しようと考えたときに懸念していたのが、指揮者(コンダクター)がどのくらい「管理的」なことをやるのか、という懸念がありました。管理的、マネジメントという類推から、「アジャイル」よりも「ウォーターフォール開発」に近いのではないか、と思ったりしたものの、昨今「アジャイル」界隈から自分が離れてきて、純粋にソフトウェアを開発するということに集中し始めて、さきほど気が付いたのが、

  • 指揮者(コンダクター)が、イメージを先行させる人であること。
  • デザイナー、設計者、がイメージを固定化させて、目に見えるようにすること(目に見えないような場合もありますが)
  • プレイヤー、クリエイター、デベロッパー、開発者、実装者、が「動く、鳴らす、聴く」に直結するところを担当すること。

という分類(役割分担)もアリなのではないか、という結論に至りました。

いや、結論には至ったのですが「仮定」でしかないので、これを「妄想」も交えて希望的に解いてみようというのが、「のだめカンタービレに学ぶ~」の発送の発端です。

ええ、プロセス名は Nodame Developement Driven 略して、「NoDD」 … じゃんだめだからw、「NodameDD」かなぁ。これは後程考えます。読み物としてぼちぼちアップするということで。

カテゴリー: プロジェクト管理, のだめ開発プロセス | のだめカンタービレに学ぶソフトウェア開発プロセス(音合わせ中) はコメントを受け付けていません