2014年1月アーカイブ

世界でこれが必要な人の数はいったい何人なのだろうw

MTのData APIを Xojo から利用するためのクラスを作った。Mac/Win用のMTクライアントが簡単に作れる筈。今朝書いたのと違ってCURLを使わず、Xojoのネイティブなコードで書いたので、これはWindowsでも動くはず。

Synopsis

Dim DataAPI As MTDataAPI
DataAPI = New MTDataAPI
DataAPI.UserName = "Melody"
DataAPI.Password = "Nelson"
DataAPI.CGIPath = "http://localhost/cgi-bin/mt/"

Properties

  • Username(String : デフォルト値: Melody)
  • Password(String : デフォルト値: Nelson)
  • CGIPath(String : デフォルト値: http://localhost/cgi-bin/mt/)
  • DataAPIScript(String : デフォルト値: mt-data-api.cgi)
  • AdminScript(String : デフォルト値: mt.cgi)
  • APIVersion (String : デフォルト値: v1)
  • AuthRemember(Boolean : デフォルト値 : True)
  • AuthTimeout(Integer : デフォルト値 : 30)
  • AuthTimeout(Integer : デフォルト値 : 30)
  • ClientID(String : デフォルト値: Xojo)
  • GetTimeout(Integer : デフォルト値 : 90)
  • PostTimeout(Integer : デフォルト値 : 60)
  • AccessToken(String : デフォルト値: なし)
  • SessionID(String : デフォルト値: なし)
  • TokenExpires(String : デフォルト値: -1) ※取得したAccessTokenが有効なUnixTimestamp
  • LastErrorCode(JSONItem : デフォルト値: なし)

Method

今のところGetEntries, GetEntry, NewEntry, UpdateEntry, UploadAsset をサポート。

GetEntries(ブログ記事一覧の取得)

Dim JSON As JSONItem
 = DataAPI.GetEntries( <BlogID(Integer)>, <Params(String)>, <Authentication(Boolean)> )


例えば、BlogID が1のエントリーを500件、カラム名を指定し、認証付きでGETする場合

Dim JSON As JSONItem
= DataAPI.GetEntries( 1, "limit=500&fields=title,updatable,id,status,date,body,permalink", True )

GetEntry(単一ブログ記事の取得)

Dim JSON As JSONItem
 = DataAPI.GetEntry( <BlogID(Integer)>, <EntryID(Integer)>, <Authentication(Boolean)> )

NewEntry(ブログ記事の投稿)

Dim JSON As JSONItem
 = DataAPI.NewEntry( <BlogID(Integer)>, <Entry(Dictionary)> )

ここでのEntryはDictionaryとして指定する。

Dim BlogId As Integer = 1
Dim Entry As New Dictionary
Entry.Value( "title" ) = "記事のタイトル"
Entry.Value( "body" ) = "記事の本文"
Entry.Value( "status" ) = "Publish"
Dim JSON As JSONItem = DataAPI.NewEntry( BlogId, Entry )
MsgBox( JSON.ToString )

UpdateEntry(ブログ記事の更新)

Dim JSON As JSONItem
 = DataAPI.UpdateEntry( <BlogID(Integer)>, <EntryID(Integer)>, <Entry(Dictionary)> )

UploadAsset(アイテムのアップロード)

Dim JSON As JSONItem
 = DataAPI.UploadAsset( <BlogID(Integer)>, <File(FolderItem)>,
    <Path(String)>, <autoRenameIfExists(Boolean)>, <normalizeOrientation(Boolean)> )

ファイル選択してアップロードするコードは以下の通り。

Dim DataAPI As MTDataAPI
DataAPI = New MTDataAPI
DataAPI.UserName = "Melody"
DataAPI.Password = "Nelson"
DataAPI.CGIPath = "http://localhost/cgi-bin/mt/"
Dim F As FolderItem = GetOpenFolderItem("")
If F <> Nil Then
    Dim JSON As JSONItem = DataAPI.UploadAsset( 1, F, "images", True, True )
    MsgBox( JSON.ToString )
End If

ね、とっても簡単。

XojoからCURL経由でMovable TypeのData APIを叩く時のポイントなど。

JSONにセットする前に特定文字列はUnicodeエスケープシーケンスに変換する

sub RawDataEscape( Param As String )
  Param = ReplaceAll( Param, "\", "\\" )
  Param = ReplaceAll( Param, Chr( 34 ), "\u0022" )
  Param = ReplaceAll( Param, Chr( 10 ), "\u000a" )
  Param = ReplaceAll( Param, "<", "\u003C" )
  Param = ReplaceAll( Param, ">", "\u003E" )
  Param = ReplaceAll( Param, "&", "\u0026" )
  Param = ReplaceAll( Param, "'", "\u0027" )
  Param = ReplaceAll( Param, ";", "\u003B" )
  Return Param
end sub

コマンドに渡す直前にJSON文字列のダブルコーテーションをエスケープする

sub JSONEscape( Param As String )
  Param = ReplaceAll( Param, Chr( 34 ), "\" + Chr( 34 ) )
  Return Param
end sub

Shellに渡す文字列をエスケープする

sub ShellEscape( Param As String )
  Param = ReplaceAll( Param, " ", "\ " )
  Param = ReplaceAll( Param, ";", "\;" )
  Return Param
end sub

CURLコマンドには -s オプションを付ける

付けなくてもいいけども、JSONがそのまま受け取れるので。

sub BlogPost( Title,Body,EditEntryId As String )
  Dim j as new JSONItem
  j.Value( "title" ) = App.RawDataEscape( Title )
  j.Value( "body" ) = App.RawDataEscape( Body )
  j.Value( "status" ) = "Publish"
  Dim Entry,Cmd As String
  Entry = App.JSONEscape( j.ToString )
  Cmd = "curl -s -H " + Chr( 34 ) + "X-MT-Authorization: MTAuth accessToken=" + App.AccessToken
  Cmd = Cmd + Chr( 34 ) + " -d entry=" + Chr( 34 ) + Entry + Chr( 34 ) + " "
  If EditEntryId <> "0" Then
    Cmd = Cmd + " -d __method=" + Chr( 34 ) + "PUT" + Chr( 34 ) + " "
  End If
  Cmd = Cmd + APIField.Text + "/" + VersionField.Text + "/sites/" + BlogIDField.Text + "/entries"
  If EditEntryId <> "0" Then
    Cmd = Cmd + "/" + EditEntryId
  End If
  Dim Sh As New Shell
  Sh.Execute( Cmd )
  Dim Result As String 
  Result= Sh.ReadAll
  //...
end sub

複数のパラメタをGETで渡す場合は & を \ でescapeする

sub GetEntries()
  Dim Cmd As String
  Cmd = "curl -s -H " + Chr( 34 ) + "X-MT-Authorization: MTAuth accessToken=" + App.AccessToken
  Cmd = Cmd + Chr( 34 ) + " "
  Cmd = Cmd + APIField.Text + "/" + VersionField.Text + "/sites/" + BlogIDField.Text + "/entries?limit=" + LimitField.Text
  Cmd = Cmd + "\&fields=title,updatable,id,status,date,body,permalink"
  Dim Sh As new Shell
  Sh.Execute( Cmd )
  //...
  Dim Result As String 
  Result= Sh.ReadAll
end sub

MTのData APIを使ってOS Xのアプリケーションを作ってみました。外部エディタを指定することで、リスト画面で項目を右クリックからエントリーの編集や新規投稿ができます。

外部エディタの設定は「External Editor」タブクリックして行います。Markdownを使う場合は、「Format」チェックボックスのMarkdownにチェックを入れて設定を保存してください。このムービーでは、Mou を外部エディタに指定しています。


あとは、エディタ側からドキュメントを保存すれば、投稿や更新をしてくれます。エントリーの保存、削除、ステータスの変更なども行えます。外部エディタなしでも投稿や編集が可能です。その場合は、項目をダブルクリックするか、「Editor」タブクリックで投稿画面に遷移してください。

このアプリケーションは、無保証、β版です。CURLを使っています(これ、入ってるんだよね? デフォルトのMac OS Xに...)。

ダウンロード

Mac OS 10.7以上で動作します。繰り返しますが、このアプリケーションは、無保証、β版です。何が起きようとも作者は一切の責任を負いません。まぁ、見た目も荒削りだし、Data APIのサンプルアプリ的な位置づけです。そのうちちゃんと作るかも。

25日に東京でXojo勉強会を行います(というか、会場提供して1コマお話させていただきます)。会場はさほど広くないのであまり人数に余裕はありませんが、今のところ古参? のユーザーさんが中心のようなので(以前はREALBasicあるいはREAL Studio)、これから、という方にも参加いただけたらいいなと思い、チュートリアル的なものを書いてみます。Xojoのサンプルにもあり、紹介動画もアップされていますが、簡易Webブラウザを作るというものです。


少し古いもの(REAL Studio時代)の動画もあります。

アカウントの作成とダウンロード

以下のページから、アカウントを作成してログイン、まずはダウンロードしてください。

ディレクトリごとアプリケーションフォルダにドロップしてコピーし、起動します(起動したら一旦終了してMacを一度再起動しておいたほうがいいかもしれません)。

Xojo自体は、無償で利用できます。お金がかかるのは作成したアプリをビルドする時。つまり、ダブルクリックで起動する単独のアプリケーションを作成したり配布したりする時にライセンス登録が必要になります。ライセンスはビルドの対象毎に必要です。今回のようなデスクトップアプリのライセンスは 34,000円。他にWebアプリやコンソールアプリ等を作成する場合には別のライセンスが必要です。すべてが含まれるProライセンスというものもあります。

3分で作る簡易ブラウザ

今回作るのは、以下のようなアプリケーションです。

  • テキストフィールドに入力したURLに「Go」ボタンクリックでアクセスすると、ページを表示するWebブラウザ

(ソースコード)ExampleBrowser.zip

ダブルクリックしてXojoを起動したら、「デスクトップアプリケーション」タブを選択し、適当なアプリ名を入力して「OK」をクリックします。

起動時の画面

ウィンドウへのコントロールの配置

デフォルトでウィンドウが1つ登録されています。今回はこれをこのまま使います。 右上の「ライブラリ」ボタンをクリックして(最初はデフォルトで表示されているはずです)各コントロールを表示します。HTMLビューワをウィンドウにドロップして配置します。

HTMLViewerの配置

配置後、マウスドラッグして大きさを調整します。「インスペクタ」ボタンをクリックすると、オブジェクトのプロパティが編集できます。今回は特に名前も設定も変更せず、設定するのは右下の「Locking」の部分のみ。下と右の鍵マークをクリックします。これでウィンドウリサイズ時にHTMLビューワが追随するようになります。

コントロールの配置(四隅をロックする)

同じ要領で、PushボタンとTextフィールドを配置します(冒頭のムービーでは「戻る」「進む」「再読み込み」ボタンを追加していますが、ここでは省略します。Textフィールドの「Locking」は新たに右の鍵を選択します。Pushボタンの「Locking」では、左鍵を外し、逆に右鍵を選択、ボタンのラベル(Caption)に「Go」を入力します。

コーディング

配置を大きさを確定したら、いよいよコードを書きます。といっても、コードはたったの一行ですが。

GOボタンへのコードを追加(1)

Goボタンをダブルクリックします。「イベントハンドラの追加 PushButton 1」と表示され、イベントの一覧が表示されます。「Action」を選択して(最初から選択されているかと思います)、「OK」。

GOボタンへのコードの追加(2)

以下のコードを入力します。

HTMLViewer1.LoadURL( TextField1.Text )

入力途中には入力候補が表示されます。tabで候補を出し、returnで確定です。Xojoでは、大文字と小文字を区別しません(が、気持ち悪いのですよね。正確にタイプしていただいて構いません...)。

実行する

コードの入力と実行

入力できたら、緑のボタン「実行」をクリックします。URLを入力して「Go」ボタンをクリックしてください。ページが表示されましたか? 表示された方は、勉強会参加いただいて大丈夫ですw。尚、実行されるアプリケーションは一時的に作成されるもので、アプリケーションの実行が終了すると自動的に削除されます。単独で起動するアプリケーションを作成する段階になったら、ライセンスの購入を検討すれば良いでしょう。

実行中のブラウザ画面

以上、いかがでしたか? この例はとても簡単だと思いますが、Xojo自体は高度なオブジェクト指向、プラグインによる拡張、OSネイティブの機能へのアクセスなど、本格的な開発が可能なポテンシャルを持っています。Xcodeに挫折した人とかにはお勧め。

Windows版のビルド

画面を見ていただきわかる通り、このキャプチャはMac OS X上のものですが、ビルドライセンスがあればこのまま Windows用のアプリをビルドすることができます。

ビルド設定

Windows 8上で実行してみます。

Windows 8での実行

ちゃんと動いてますね。ということで、興味もたれた方いらっしゃいましたら、是非勉強会へ。

自分で欲しかったから mt/alt-tmpl/cms/edit_entry.tmpl をいじってたんですけどね。同じこと考えてる人がたくさんいらっしゃるようで。標準で欲しいわな、これ。

公開日付に現在時刻をセットするボタン
  <mtapp:setting
     id="authored_on"
     label="$authored_on_label"
     label_class="top-label"
     help_page="entries"
     help_section="date">
    <div class="date-time-fields">
      <input type="text" id="created-on" class="text date text-date<mt:if name="status_future"><mt:if name="can_publish_post"> highlight</mt:if></mt:if>" name="authored_on_date" value="<$mt:var name="authored_on_date" escape="html"$>" /><span class="separator"> <__trans phrase="@"></span> <input type="text" class="text time <mt:if name="status_future"><mt:if name="can_publish_post"> highlight</mt:if></mt:if>" name="authored_on_time" value="<$mt:var name="authored_on_time" escape="html"$>" id="created-on-time" />
    <MTDefaultLanguage setvar="lang">
    <a href="javascript:void(0)" onclick="set_authored_on_to_current()">
    <mt:if name="lang" eq="ja">&#12394;&#12358;<mt:else>Set now</mt:If>
    </a>
    <script type="text/javascript">
    function set_authored_on_to_current (){
        var d = new Date();
        var month  = d.getMonth() + 1;
        var day    = d.getDate();
        var hour   = d.getHours();
        var minute = d.getMinutes();
        var second = d.getSeconds();
        if ( month < 10) {month = "0" + month;}
        if ( day < 10 ) { day = "0" + day; }
        if ( hour < 10 ) { hour = "0" + hour; }
        if ( minute < 10 ) { minute = "0" + minute; }
        if ( second < 10 ) { second = "0" + second; }
        var authored_on_date = d.getFullYear() + '-' + month + '-' + day;
        var authored_on_time = hour + ':' + minute + ':' + second;
        getByID( 'created-on' ).value = authored_on_date;
        getByID( 'created-on-time' ).value = authored_on_time;
    }
    </script>
    </div>
  </mtapp:setting>

年始に今年の目標的なものを書いて、ですね、10日経過したわけですが。

目標を立てる時に一つだけ守ろうと思っていることがあるのです。

その目標は数値化できるものか。数値化できたとして、外部要因に左右されるものになってはいないか。

ウチの会社の大きな特徴の一つは、「数字を課していない」ということです。ノルマや数値目標などが全くもって、ない。良いことなのか悪いことなのかはわかりません。正直わかりませんが、なくて済むならこんなものはないほうがいいとは思います。

2回やって出来なかったことは、3回目も出来ない法則

こんなこと書いてたブログ記事がどっかにあったんだよなぁ。でも、いざ今エントリ書く時見つけられないからまぁいいや。例えば「社内の情報共有」が課題だと認識したとする。目標は、「社内の情報共有を推進すること」。これは、願望であって希望であって計画ではない。目標でもない。

そんなことは、多分わかっていて、そういう話題は大抵過去にも出ているのです。でも、できなかった。2年続けて掲げられて、それが出来なかったとしたら、それは多分今年も出来ない。

なぜなら、できなかったということは、本当に必要ではなかったこと、だからです。それは、多分今年もできない。優先度が高くないってことです。結局のところは。そういうときは、ただ一つ、"アプローチを変える"

話しを戻します。数値化できる、できないということは大切なのですが、その数字が外部環境要因に左右されるものであってはいけないのです。例えば、今年はこれだけ売上を上げます、とかいう目標。達成できなかったときの言い訳が立つかどうかで考えてみれば、達成できなかった時に言い訳はいくらでも立つわけですよ。市場がどうだ、顧客がどうだ、景気がどうだ...

では、どうするか。簡単です。外部環境要因に左右されない数字を目標に掲げればいいのです。売上がどれだけあがるかは景気や顧客の状況に左右されるでしょう。でも、新しいサービスを3つリリースして、プレスリリースを3回打つこと。これは、できるわな。他人や市場は関係ない。

結局、そういうところまでは目標をブレイクダウンしてやっていくことが大切なのだと思うのです。そう言う意味で、年頭の

を考えたら、やるべきこと、目標をブレイクダウンすることになる。

  • 1日1トピ。ブログ、会社サイト、製品サイトの記事リリースを毎日、少なくとも平日は毎日すること
  • エバンジェリストとして、人前で話す機会を年間24以上(月2回以上)持つこと
  • 年末段階で、来年以降、新たな収益につながる可能性が見える素材が2つ増えていること(成果が出ていること、ってのを目標にはしない。確実に自分主体でできることを目標には据えておく)

そう、できるだけ具体的に数値化できること、そして、外部環境要因に左右されないことを目標に据えてやっていくこと。結果はそれについてくるんだよな、と、いうことで、改めて本年も宜しくお願いいたします。

Retina Displayのサポートについては、そのものズバリのブログエントリがあり、最新版にはサンプルディレクトリにサンプルもある(Example Projects/Platform-Specific/OS X/RetinaDisplay/RetinaDisplay.Xojo_binary_project)。こいつを動かせばそのまま動くのだけども、新規に作成したプロジェクトにソースをコピペしてもなぜか動かなかったので、共有しておく。

Retinaディスプレイへの対応方法

(元エントリにあるように)要するに、Info.plistに以下を追加して、Declare Function BackingScaleFactor をコールする。

<key>NSHighResolutionCapable</key>
<true/>

引数はWindowPtrなので、このコードはWindowのメソッドとしておく(もしくは呼び出す際にWindowを指定してやる必要がある)。要はマルチスクリーンのケースがあるので、Windowから判定するということなのだろう。

  #If TargetCocoa Then
    Try
      Soft Declare Function BackingScaleFactor Lib "AppKit" Selector "backingScaleFactor" (target As WindowPtr) As Double
      Return BackingScaleFactor(Self)
    Catch e As ObjCException
      Return 1
    End Try
  #Else
    Return 1
  #Endif

問題はこれをビルド時に追加するためのコードの場所で、これは、「挿入」→「Build Step」→「新しいIDEスクリプト実行手順」を作成して、そこに書くことになる。

  Dim appName As String = CurrentBuildAppName
  appName = ReplaceAll(appName, " ", "\ ") // Escape spaces for the command line
  
  Dim appPath As String = CurrentBuildLocation + "/" + appName + ".app"
  
  Dim command As String
  command = "/usr/bin/defaults write " + appPath + "/Contents/Info ""NSHighResolutionCapable"" YES"
  Call DoShellCommand(command)

Info.plistにXMLを直接書くのではなく、defaultsコマンドを使ってシェル経由で設定を追加している(この仕組みを使うと先に紹介したPerlスクリプトにUIを被せるような用途の際にPerlスクリプトやモジュールを自動的にパッケージに含められて便利)。

ところが、単にこれを書いただけでは正しく実行されない。ビルド設定のOS Xの「Build」の下にDragして配置することではじめて正しく動作します(こういうのがね、日本語マニュアルが無いってのが無駄な労力につながるってんだ)。

XojoのプロジェクトをRetinaDisplay対応させる

Mavericks(OS X10.9)の判別と、ついでにRetinaディスプレイの判別も初期化時に行う方法

ついでに、OS X10.9(Mavericks)の判別が必要になったので、これを行う方法と、マルチスクリーンを考慮しなければ初期化時にRetinaディスプレイ判別もできちゃわないだろうか、ということで、以下(どちらかといえばこっちが本題)。問答無用で、コードをそのまま貼っておく。AppのOpenイベントに書く。

OSのバージョン判定は素直に sw_vers -productVersion をシェルで叩く。その後、screencaptureコマンドを叩くのだけど、Retinaディスプレイだと生成されたキャプチャのピクセルが縦横ともに常に2倍になる。Mavericksかどうかでコマンドのパラメタが違うのは、Mavericks以前では screencapture の-R(ピクセル指定)が有効でないためです。

  #If TargetMacOS Then
    Dim IsMavericks, IsRetina As Boolean
    Dim sh As New Shell
    Dim GetOSVer As String = "sw_vers -productVersion"
    sh.Execute(GetOSVer)
    Dim Res As String = sh.ReadAll
    Dim vNum As Double = Val(Res)
    If vNum >= 10.9 Then
      IsMavericks = True
    End If
    Dim Temp,TestFile As FolderItem
    Temp = SpecialFolder.Temporary.Child( "com.alfasado.test.work" )
    if Temp.Exists = False Then
      Temp.CreateAsFolder
    End If
    Dim OrigWidth As Integer
    Dim CreateCapture As String
    If IsMavericks = True Then
      OrigWidth = 1
      CreateCapture = "cd " + Temp.ShellPath + "; screencapture -R 1,1,1,1" 
    Else
      OrigWidth = Screen(0).Width
      CreateCapture = "cd " + Temp.ShellPath + "; screencapture -x 1,1,1,1" 
    End If
    sh.Execute(CreateCapture)
    TestFile = Temp.Child( "1,1,1,1" )
    If TestFile.Exists Then
      Dim P As Picture
      P = Picture.Open(TestFile)
      If OrigWidth = P.Width Then
        IsRetina = False
      ElseIf OrigWidth * 2 = P.Width Then
        IsRetina = True
      End If
      TestFile.Delete
    End If
    Temp.Delete
    If IsRetina Then
      MsgBox "Retina"
    Else
      MsgBox "Not Retina"
    End If
    If IsMavericks Then
      MsgBox "Mavericks"
    Else
      MsgBox "Not Mavericks"
    End If
  #Endif

以前に本格的にREALBasic使ってたのってOS9の時代だったので。OS Xにすっかり変わっていることでシェルが活用できることが結構大きいな、と。何でもかんでもDeclareってのがパターンだったけど、Tarminal遣いの人にも色々と活用できる。こういう点ではUnix万歳、だね(screencaptureコマンドの仕様が将来変わるかもってのはあるけど、て、まぁあるだろな。互換性だけちゃんとしてくれれば動かなくなることはなかろう)。

関連

あけましておめでとうございます。

謹賀新年。先日立派な竹林と遭遇したので一枚撮影しました。

"新しいキーワードをつくる"を掲げてスタートした昨年ですが、達成できたかと振り替えると不十分な成果となってしまいました。自身の出来には大いに不満。もちろんさぼってたわけではないんですけどね。

その中でも会社10年を迎えられたり、PowerCMS 4のリリースができたりといくつかトピックもあり、また次の年につなげられる下地がつくれたりといった出来事がありました。それを受けつつ、また、10年を迎えたということで、次の10年(そんな気の長い話しとてもできやしませんから、まずは5年ですね)。

エバンジェリスト・ドリブン。発信をさぼらない。

職業、PowerCMSエバンジェリスト。これ、昨年のスライドに書きました。もちろん基本が変わっているわけではないのですが、もっと言えば Movable Type エバンジェリストであったり、Webアクセシビリティエバンジェリストであったり、自分の、ひいてはアルファサードの仕事の進め方って突き詰めると「エバンジェリスト・ドリブン」なんじゃないかな、と。年末の社内会議のために12月あたりから頭を整理していて、ベースはこれだな、と思いました。"エバンジェリスト・ドリブン"、と名付けました。今年はこれで行きます。

去年はPHPカンファレンスに参加してDynamicMTMLのプレゼンをしたり、Kansai.pmでMTの話しをしたり、Net::Azure::StrageClientというPerlモジュールを書いてCPANデビューしたり、ひさしぶりにXojoでデスクトップアプリを作ったりといった活動をしてきましたが、明らかに発信をさぼっていたので(ブログのエントリー数がまさに物語ってますよね)、ここから再度頑張って行きたいと思っています。

エバンジェリスト・ドリブン

奇しくもCSS Nite LP30で話したのですが、"意外と伝わっていないと心得る(情報発信)" つまり、情報発信する側は、もう伝わっただろうとか、アルファサードとか野田のこととか Junnama のことって、みんなに知ってもらっているだろう、と思いがちなんですけど、まだまだ知られてないし、自分が認識しているより相手・市場は自分(会社)のこと知らないよ、と。

で、会社規模が10人超えて見渡してみるけど、やっぱりこれを行えるのはウチの会社だと"社長"ですから。そこをさぼらないこと。12月に立て続けにブログに書き散らかしたのにはそういう意味も含まれています。今年は色々書きます。2014年は、いや、2014年からはさらに積極的に発信しよう。PowerCMSの製品ブログもそうですが、いくつかブログを立ち上げる予定。

パートナー・ドリブン、新たなソリューションの開発とリリース。

PowerCMSパートナーという形で40社近くの法人・個人の方々とお仕事をさせていただいているのですが、販売代理、CMS製品メーカーと構築パートナーという関係以上のものを生み出せているかと言えば疑わしい。単なる仕事の紹介とか受託案件における協業を超えた一歩、というものを作れていないのですが、今年は具体的にいくつかターゲットを定めてソリューションづくりを進めます。僕らの仕事は B2Bの受託仕事がベースですが、PowerCMSというソリューションがあることで、"単なる"受託とは少し性格の違うビジネスを展開できています。当社のパートナー様にもそういったビジネスを進めていただけるような組み方、提案について、今年は具体的に進めます。キーワード的には、クラウド・マルチデバイスを絡めて。大事なことなので重ねて書きます。"具体的"ね。

作るを創る→CMSから一歩範囲を広げること。

Movable Type シフトをひいてから6-7年経過します。PowerCMS、6年経ちました。1プロダクトの比重が高まり過ぎという話しが毎度出て、必ずしもそれが悪いととらえてはいませんが(逆に効率はこのほうがいいわけですし)、でも、今年は範囲を広げます。"B2Bの受託仕事" + "エバンジェリスト・ドリブン"(もう一つ付け加えれば、"作るを創る")というベースに沿っているのであれば、それは他のこと、他の商材でも構わないと考えています。

アルファサードの根っこ

画像は昨年からの引用。アルファサードの"根っこ"

Webがまかなう守備範囲は数年前と比較して格段に増えました。スマホ・タブレット、携帯電話、デジタルサイネージ、キオスク端末、さらには眼鏡? とか。媒体にしても、サイト、アプリ、書籍。そして、作るものが増えれば作るためのためのプロセスやツールも多様化してきます。そこにニーズ、ビジネスチャンス、言い換えればそこに貢献できることは企業、当社の存在意義につながって行くのですから。今年はCMSにこだわりつつ、こだわりません。近々何らかの発表ができるかと思いますが、新しいこと一つ、はじめます。

原点回帰、会社設立時の想いに立ち戻って。

Webのマルチデバイス化が進み、Webアクセシビリティへのニーズが高まり(実際によく引き合いがあるのです最近)、仕事をさせていただく機会が増えているのですが、JIS X 8341-X対応を求められるお仕事の進め方というか、色々感じるところが多く、当社的にはCMSベンダーとして見られること、いただくお仕事の比重が高まっている中で、半端な仕事のやり方が良くない。また一緒にお仕事をさせていただくコンサルタントの方や行政の方(主に、というかほぼ前者ですが)と考え方、進め方が相容れない、あわないことが増えている。また、自身が必ずしもアクセシブルでないツールを扱っているという矛盾が生じていること。これらを踏まえ、今一度会社設立時の想いに立ち戻り、どういうスタンスでWebアクセシビリティに向き合うのか、また仕事としてどうしていくかについて整理をしていきたいと考えています。

(アルファサード株式会社)社名について
  • アルファ(物事の最初。未知数。プラスアルファ。)+ファサード(建築用語で建築物の正面(デザイン)、最も目に付く場所であり、重要視される場所。 )。
  • ファサードの作りの巧拙で客が店に興味をもつかどうか、店に入るかどうかが決まる。
  • ファサードはエスペラント語のコンピューター用語では「ユーザーインターフェイス」の意。
  • すべて (al≒all) の人にやさしい fasado (ユーザーインターフェイス) を提供する会社であること。

One more thing. 投資すること。

最後に一つ。10年ほど会社やってると、"第二の創業"とか言い出す社長、いるでしょ? 僕もそうなんですけどね。とはいえ、10年会社やってんですから第一の創業と第二の創業は全然違います。良い悪いは別として。受託の仕事においては、基本、動いた工数を積み上げる労働集約型のビジネスなので、1年目も10年目もそう変わらないととらえることもできます。できますけど、違いは確実にあるよね。

  • 取引先、取引実績の積み上げがある
  • 仕事の実績、評価の積み上げがある(逆もしかり、ですが)
  • 積み上げた自己資本

この3点目。資本について、CSS Nite LP30で話したように、100%オーナー社長の中小零細企業においては資本の活用具合がどう、という評価は一般的にはされないのですが(銀行にはむしろ資本の厚さが評価されるので)、有効な資本の活用の仕方、に今年は注目して取り組みます。別に投資信託や株式をはじめるわけじゃないですけど。新しいソリューションへの投資、パートナーへの投資、そういった視点を仕事に持ち込んで行くことで、第一の創業とは違う、スピード、掛け算的な成長を目指して動いて行くこととします。

以上、2014年の取り組み5点。本年も何卒よろしくお願いします。

Facebook

Twitter

このアーカイブについて

このページには、2014年1月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2013年12月です。

次のアーカイブは2014年3月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.2.6