2014年3月アーカイブ

Twitterでつぶやく、その前に!

  • その機能は本当にないのでしょうか?
  • すでに誰かが同じところでつまづいて、解決していたりしないでしょうか?

あるある、そんなのは、あるよ!

テンプレートは以下のような感じ。

<mt:GetEnv name="REMOTE_ADDR" setvar="remote_ip">

<mt:Ignore><mt:var name="remote_ip"> →192.168.11.146 </mt:Ignore>

<mt:if name="remote_ip" like="^192\.168\.">
ローカルネットワークからのアクセス
<mt:else>
それ以外
</mt:if>

Not PowerCMSの場合は、以下のプラグインを利用してください。

ちなみに、PowerCMSもしくは下記のプラグインを使うと、サーバー環境変数をダンプした結果がテンプレートで確認できます。

テンプレートに、以下のように書くだけです。

<mt:EnvDump>

MTEnvDumpタグでダンプした結果を確認できます

空室がほとんどなく、部屋の単価が高騰している(特に平日)

東京の人は見ることがほとんどないと思うのですが、私のように毎週不定期で東京出張してると毎週定期的に楽天トラベルなんかにアクセスするのですが。平日と書きましたが、この間の3連休なんかもそうでしだ。まぁ、連休はわからんでもないのですが。

楽天トラベルで東京のホテルの価格が高騰している

需要と供給の関係なので、ある意味で健全な経済活動の結果なんだと思いますが、2極化しています。

  • 普通に予約を受付け、空室の残が残っていないホテル
  • 極端(といっていいと思う)な高い価格を設定して、空室が残っているホテル

極端かどうかは主観の問題が入るわけですけど、普段は1万円以下の部屋が3万円前後ってのは、やっぱり感情的にはそういうホテルには宿泊したくはないなぁ、というのが正直な感情ですね。

まとまんない雑文ですが、こういうのを投稿できるようになったことが、自分自身の変化なのかな、と。

お前らCMSの「C」にもっと力入れろよとか、ツールはどうでも良くてコンテンツこそが王様であるというお話には基本的には概ね同意だったんですけどね。これまでは。

SafariScreenSnapz004

で、MT6が出て、Data APIだとか言われても、それで売れるもんかって思ってました。今でもそう思ってるところありますけど。お客さんが「それ、Data APIで」とか言ってこないからね、基本。

でも、考えが変わった。投稿ツールを作ったからなんだけど。Facebookは「今どんな気持ち?」って聞いてくる。Twitterは「今何してる?」って聞いてきてたような気がするのだけど、今見たら聞いてこないな。

でもね、この、「今何してる?」とか「今どんな気持ち?」っての、これって意味が無いように見えて、実は結構重要じゃないかと思えてきた。ツールが変わるとこんなに書けるものかな、と思えたのですよ。それなりに忙しい訳ですが、書けなかったブログエントリの数が今月はこんなに。モチベーションが変わったわけではなくて、ツールが変わっただけです。

筆は軽くなるね。確実に。デスクトップアプリ、投稿エディタ、軽いから。

わからないことが、わからないってのはその通りで、実際に構築がっつり進めたり仕様検討の段階で悩むことも多いかと思います。PowerCMSは一つのことを実現するために複数の方法がとれるため、構築中に「あれ、これでいいんだっけ?」とか、「他の人はどういう風に設計してるんだろう?」て思ったりすることもあるかと思います。

相談会ですが、ただつぶやいただけ! なんだけどメールでお問い合わせももらったりして、急にやることになったので。 PowerCMS Cafe的な感じといえばそうなんですが、具体の案件でお困り中のことなんかがありましたら、直接お話させていただこうと思います。

好評であれば今後継続開催や大阪(地方?)での開催も検討します。

【東京開催】PowerCMS設計・構築相談会(4月3日(木))

PowerCMSでのCMS(サイト)構築を検討されておられる方、現在構築中のお客様、制作会社様を対象に、PowerCMS設計・構築相談会を開催いたします。

相談会は、特に決まったセミナーやセッションを行わず、ご質問いただいた内容に弊社スタッフがお答えする形で情報共有や構築の課題解決のヒントを模索する場として、ざっくばらんに参加者の皆さま同士や私たちがお話させていただく場とさせていただきたいと思います。

詳細とお申し込みはこちらからお願いします。

MTEvalScriptプラグイン

| コメント(0) | トラックバック(0)

We Love Blog

のっけから(劇薬注意!)

何というか、どっちかというと技術的好奇心から、できるのかな、と思って作った。後悔はしていないが公開はしてみる。

昨日、オフィスに三菱東京UFJ銀行から電話があったのです。

内容は、インターネットバンキングの利用においてウィルス感染したパソコンからのアクセスでの不正行為が行われている件についての案内 ということでした。ちょうど数日前にFacebookなんかで三菱東京UFJ銀行のトップページが話題になっていたのが頭にあったので、忙しかったこともあり短時間で電話は終えたのですが(ブログネタにするなら詳しく聞いておけばよかった...)、このトップページの注意喚起とわざわざ電話がかかってきたことから、これは、尋常じゃない事態になっているのではないかという印象を持ちました。

追記 : タイミングよく? こんなメルマガが。

三菱東京UFJ銀行トップページ

本日話題になった銀行サイトの緊急メッセージ。このように緊急時になるとサイトデザインからかけ離れたコンテンツエリアを貼付けるサイトは少なくありません。

それでも、かかってきた電話と相まって、私は"尋常じゃない事態になっているのではないかという印象を持った"わけですから、つまり、危機感を伝えるという意味では、このデザインとこのデザインが話題になったことが有益に働いた、ということでしょう。

また、社内でシェアされていたのですが、

動画になっとる..

いつ差し替わったのか追ってないのですが、三井住友銀行の簡単!やさしいセキュリティ教室がいつの間にか動画になってました(以前は4コマ)。

簡単! 優しいセキュリティ教室 - 三井住友銀行

このオリジナルとなったコンテンツが掲載されたのがおそらく2005年。

10年近く経過しているけれど、これまでにない事態になっていることを感じさせる一つの材料でもあります。

MAUSの改良とあわせてブログテンプレートを久しぶりに微調整してみてる。

og:imageの設定

og:imageをカスタムフィールド(画像)で指定できるようにした。テンプレートはMT側で書く(もうちょっと短く書けそうだけど。

<MTFor regex_replace="/(?:\r?\n|\r)/g","" setvar="entry_og_image">
<MTIf tag="EntryOGImage">
<MTEntryOGImageAsset>
<$MTAssetProperty property="image_width" setvar="og_width"$>
<$MTAssetProperty property="image_height" setvar="og_height"$>
<MTIf name="og_width" eq="$og_height">
<$MTAssetUrl encode_html="1"$>
<MTElse>
<$mt:AssetThumbnailURL height="600" square="1" encode_html="1"$>
</MTIf>
<MTElse>
<mt:EntryAssets type="image" limit="1">
<$MTAssetProperty property="image_width" setvar="og_width"$>
<$MTAssetProperty property="image_height" setvar="og_height"$>
<MTIf name="og_width" eq="$og_height">
<$MTAssetUrl encode_html="1"$>
<MTElse>
<$mt:AssetThumbnailURL width="600" square="1" encode_html="1"$>
</MTIf>
<mt:Else>
</mt:EntryAssets>
</MTEntryOGImageAsset>
</MTIf>
</MTFor>
<mt:unless name="entry_og_image">
<mt:Assets type="image" tag="@site_icon" limit="1" regex_replace="/(?:\r?\n|\r)/g","" setvar="entry_og_image">
<$MTAssetProperty property="image_width" setvar="og_width"$>
<$MTAssetProperty property="image_height" setvar="og_height"$>
<MTIf name="og_width" eq="$og_height">
<$MTAssetUrl encode_html="1"$>
<MTElse>
<$mt:AssetThumbnailURL height="600" square="1" encode_html="1"$>
</MTIf>
</mt:Assets>
</mt:unless>

<!-- Open Graph Protocol -->
<meta property="og:type" content="article">
<meta property="og:locale" content="<$mt:BlogLanguage setvar="blog_lang"$><mt:If name="blog_lang" eq="ja">ja_JP<mt:else><$mt:Var name="blog_lang"$></mt:If>">
<meta property="og:title" content="<$mt:EntryTitle encode_html="1"$>">
<meta property="og:url" content="<$mt:EntryPermalink encode_html="1"$>">
<meta property="og:description" content="<$mt:EntryExcerpt remove_html="1" encode_html="1"$>">
<meta property="og:site_name" content="<$mt:BlogName encode_html="1"$>">
<mt:if name="entry_og_image"><meta property="og:image" content="<mt:var name="entry_og_image">"></mt:if>

画像挿入ダイアログ

リンク挿入ダイアログ

MarkdawnではなくHTMLを貼付けられるようにしたり、URLからページタイトル取得できるようにしたり。

Sub Action(itemIndex as integer)
  If URLField.Text <> "" Then
    Dim Timeout As Integer = 40
    Dim MySocket As New HTTPSocket
    GetProgress.Visible = True
    GetProgress.Refresh
    Dim Response As String = MySocket.Get( URLField.Text, Timeout )
    Dim StatusCode As Integer = MySocket.HTTPStatusCode
    If StatusCode = 200 Then
        Response = DefineEncoding( Response, Encodings.UTF8 )
        Dim Title As String
        Title = NthField( Response, "</title>", 1 )
        Title = NthField( Title, "<title", 2 )
        Title = NthField( Title, ">", 2 )
        Title = ReplaceAll( Title, Chr( 10 ), "" )
        Title = ReplaceAll( Title, Chr( 13 ), "" )
        LabelField.Text = Title
        GetProgress.Visible = False
        Return
      End If
    End If
  End If
  Beep
  GetProgress.Visible = False
End Sub

(3月27日追記)Timeout40秒はちょっと長いのと、文字コードShift_JISとかEUC-JPとかあるので、その辺を修正...

Dim Timeout As Integer = 20
Dim MySocket As New HTTPSocket
Dim Response As String = MySocket.Get( URLField.Text, Timeout )
Headers = APISocket.PageHeaders
Dim HeaderSource As String = Headers.Source
Dim HeaderArr() As String
HeaderArr = SplitB( HeaderSource, Chr( 13 ) + Chr( 10 ) )
Dim StatusCode As Integer = MySocket.HTTPStatusCode
If StatusCode = 200 Then
Dim Charset As String
If UBound( HeaderArr ) > -1 Then
  For i As Integer = 0 To UBound( HeaderArr )
    Dim Hd As String = HeaderArr( i )
    If InStr( Hd, "charset=" ) <> 0 Then
      Charset = NthField( Hd, "charset=", 2 )
    End If
  Next
End If
If Charset = "" Then
  Charset = NthField( Response, "charset=", 2 )
  If Charset <> "" Then
    Charset = NthField( Charset, Chr( 34 ), 1 )
  End If
End If
Dim TextEnc As TextEncoding
If Charset <> "UTF-8" Then
  TextEnc = GetInternetTextEncoding( Charset )
  Response = DefineEncoding( Response, TextEnc )
  Response = Response.ConvertEncoding( Encodings.UTF8 )
Else
  Response = DefineEncoding( Response, Encodings.UTF8 )
End If

年度末というもの。

| コメント(0) | トラックバック(0)

3月末ですね。消費税増税前でもあります。増税前のご発注、お待ちしていますm(_ _)m

なんていう話題を書き始めたのは、去年から今年にかけて色々あったからです。父親が亡くなって相続の話しがあったり、CSS Nite LP, Disk 30「仕事とお金の話」(2013年10月26日開催)でお金の話しをしたら、今年になって税務調査きたり(会社としては2回目でした)。おまけに今年は消費税が変更されるので、製品のパンフレットの刷り直しを余儀なくされたり。

で、3月末。官公庁案件なんかもあるから、年度末モード的な雰囲気はやはりありますけど、それほど深刻ではないのは弊社、決算期が6月なのですね。この話しはかこれまでにも何度か書いてますけど、これとかこれとか

税務調査でも(ウチはちゃんと払ってますぜ)、ほとんどが仕掛かりの話しでした。要は、この経費はいつの売上のための経費なんだ、と。それが期をまたがっていないかどうかを細かく見て行く感じです(あ、一応何も無かったです結果的に。前回は印紙代が違っていたとかで数百円だったか訂正がありましたが今回はなし)。

でね。3月決算の会社が多いではないですか一般的には。官公庁も自治体もそうだし。年度末、年度内納品なんだけど、実際は色々あるじゃないですか(何が)。6月くらいではさすがに実体と合うわけなので、6月決算いいよ、と今回も書いておきます。

つらつらと何でこんなの書いてるかっていうと、

3月決算の会社様、増税前にPowerCMS のパートナーに加入いただくってのはどうですか!?

と言いたかっただけです。

PowerCMSパートナー制度のご案内

というか、MAUSの新しいベータのテスト投稿です。ご了承くださいm(_ _)m

追伸

Movable Type 6のブロガー向けイベントってないのでしょうか。楽しみにしてるんだけど...

GitHubのog:imageで自分のプロフィールアイコンがでるのがこっぱずかしい今日この頃です皆さんいかがお過ごしでしょうか?

Movable Typeでゴミっぽい? ファイルが残る件

以前ちょっと目にして、そういや昔そんなこと考えたこともあったなぁ、と思い出していたのですが、まさかこの時期にしかも3連休の最終日にゴミ掃除のために出勤する羽目になろうとは...

MovableType(MT)のゴミファイルを削除する | Androidアプリ開発雑記

MovableTypeで悩まされるのは、ゴミファイルが残ってしまうことです。カテゴリのbasenameを変更したなどに、古いファイルに関しては削除されず、新しいbasenameのディレクトリが作られ、そのディレクトリに各ファイルが作られます。

WeblogPublisherを久しぶりに読んでいったのですねー。最初は、これか... (remove_fileinfo) と思ったのですけども。

screen-20140323173629

で、次に、これか、と思ったのですが、もうこの時点では古い MT::FileInfoレコードは削除されてしまっていたのでした。

MT::FileInfo->set_info_for_url

引用元の記事にもあったのですが、↓

作戦2: mt_fileinfoテーブルの変更を検知する

これも上と似ていますが、mt_fileinfoテーブルが変更されるタイミングが分かれば、過去と現在でなんらかの処理を行う事ができるのでは?と考えました。

プラグイン書いた( Garbage Cleaner = ゴミ掃除機! )

ブログエディタに印刷機能は要らんと思うのですが、まぁ、エディタだからね。一応。

印刷対応

印刷設定でサイズを%指定した場合のプリントのサンプル。

動的に生成したTextAreaのStyledTextPrinterをコールするとNilObjectionのエラーになるので、ダミーのテキストエリアを配置しておいて隠しておく。TextAreaは両方ともStyledはOff。動的に生成したコントロールがNilになるところは納得いってない。バグじゃねーのとか思うけど、とにかくこれで動くのであるよ。

ダミーのテキストエリア

せっかく画像作ったので今回もog:imageはこれでw

We Love Blog

年度末進行に巻き込まれて早朝から新幹線移動してます皆さんいかがお過ごしでしょうか。

続きなのかどうかわからんが。(これから読む方にすいませんが、纏まってません。考えが...)

どっちかと言えばこっちの続きか。ブログ投稿ツールで筆は軽くなるか? - Junnama Online

最初にMTのはなし。もはや5.xじゃないし、というのは置いておいて。

ブラウザを起動してログインして、書く、というスタイルは変わってないんですよね。実は。もちろん、MarsEditやWindows Live Writerなどのブログエディタも割と古くからあって、今敢えてブログエディタを作るって意味もどうなんかなぁと思わないでもないのですが。

メールからポストする(モブログ?)のようなインターフェースもありました。てか、自分も作ったりした。

さて、今のMT6の投稿画面はこんな感じです。

Movable Type 6の記事投稿画面

書く、という行為からすると、前述の「MT3.xからMT5.2までの間に劇的に変わった20個」のうち、以下あたりですか。

  1. ユーザーインターフェースとリッチテキストエディタ
  2. 記事等の自動保存機能(MT4.0)と履歴管理機能(MT5.0)
  3. カスタムフィールド(MT4.1)
  4. スマートフォンオプション(MT5.1以降)
  5. テンプレート(記事/ページ)プレビュー機能(MT4.2)

劇的とは言い難いなぁ。もちろん進化していることは確かなのですが、「書く」という行為からみてどうなんだと言われてみると、ブログツールの登場、Movable Typeの登場時点でもう既にできあがってるというか、完成度が高いと言えるのかもしれません。

We Love Blog

元々こんなタイトルじゃなかったんだけど、最後まで書いたら何だかそんな記事になってしまった...

別に書けなきゃ書けないで勝手だからいいんだけどね。続き。何だかつらつら考えて纏まらないけれども。

普通に考えるとブログ以外に場所ができたと考えるのが妥当なのでしょう。Facebookに「We Love Blog」とか写真アップして、みんなで いいね! してんだからブログ書く必要感じないもんな...(謎)

ネットのテレビ化(頭のスイッチがオフの時間が増えてきた)

ジョブズの言葉だったと思うのですが、「テレビを見るときは思考のスイッチがOFFになる。PC(Mac)の前にいるときは思考のスイッチがONになる」的な表現をされていて、当時は納得したものですが、最近はPC(Mac)の前にいても、思考がOFFにな時間が増えているのではないかと。

FacebookやTwitterのタイムラインを眺めてる時、基本的には受け身ですよね。歩きスマホじゃないけど、スマホ・タブレットがそれを助長してる気がする。

書き込むときも、さほど思考のスイッチが入らない。なぜなら(前も書いたけど)、TwitterやFacebookの投稿には「タイトル」がないから。普通に頭に浮かんだことが思考が整理されずにアウトプットされていく。

すいません、まだ公開してないんですけどね。テストを兼ねたエントリ。

フィードバックをあまりいただけないのでちょっとイジケてますw 。Movable Type 6、Mac OS X (10.7以降)という限られたユーザー対象のソフトウェアだから...

でもね、これ便利です。数少ないフィードバックの中で、本文以外がプレビューできないとか「続き」入力でMarkdownが使えないとか、あと、画像挿入がしっくりこないというお話をいただきましたので、そこを改善中です。

左カラムを本文・続きの2カラムにした

私自身が、「続き(text_more=EntryMore)」を殆ど使わないのでそこはできないようになっていたのですが、本文と続きの使い分け的に以下のように使っている人がいるようなので。

  • インデックスページ、一覧ページに途中まで表示して「続きを読む」リンクで個別ページに飛ばしているケース
  • 「本文」「続き」の間に広告を差し込んでいるようなテンプレートにしているケース

これまでは、「続き」は「メタデータ」のパネルで入力できるようにしていたのですが、Markdownが使えないということだったので、思いきって? 左カラムを上下に切って2カラムにしました。デフォルトは隠されているので、マウスでグイッっとドラッグするか、メニューもしくはキーボードショートカットで切り替え。

エディタ切り替えメニュー

og:image に対応させた

og:imageの指定

これが、まー一番なんですけどね。とりあえず新幹線にて電波が悪いので一回これでポストしてみるよ。

一発目に引用されている記事(静的サイト生成という「古くて新しい手法」の復活 - モジログ)にて、

静的サイト生成という手法そのものは、CMSの初期から存在していた。ブログツールの走りだった初期「Movable Type」も、静的サイト生成型だった。しかしこの頃は、レンタルサーバが主体で、自前でCMSのサーバを常時起動できない、といった制約が大きかった。マシンパワーも非力で、動的サイトでは一定以上のアクセスをさばけない、といった理由もあったと思う。つまり、この頃の静的サイト生成というのは、主に「制約」から導かれた手法だった面が大きい。

(強調は筆者) 「静的サイト生成型だった」 ... え、だったって、おい。

まとめページの冒頭でも、

一方、静的サイト生成ジェネレータは、記事を書いたあと、さらにHTML生成用のコマンドを実行し、さらにHTMLがすべて生成されるまで待つ必要があります。やや面倒ですが、

再構築(ry ... Teitterでも

さて、ここまで書いて、自分も過去によく書いていた再構築がどうとかWordPressがどうとかMovable Typeがどうとかいう話しを再燃させるつもりはなくて、静的生成、静的サイト生成ツールについて感じている最近のこと、主にメリットについてちょっと思うところがあって。

ここから本題です。

静的生成は既存システム(動的)との親和性が高い

もう、これにつきる。数年前に大きな投資をして構築した巨大なECシステム、例えばJSPで書かれているとか、そういうシステムの中にコンテンツを投入するための静的サイトジェネレータ。というかファイル生成ツール。ファイルをJSPとして吐き出すとかだけではなくて(もちろん吐き出すこともできる。JSPやPHPじゃなくてもJSONでもCSVでもXMLでもなんでもいいのだ)、JSPから読み込むパーツ生成ツールとしてのシステム。もちろんJSPじゃなくてもPHPでもなんでもいいけど。

そういうツールと組み合わせて使うCMSというお話になったときに、私が顧客先で検討状況等聞いているとPHP製の動的なもの、オープンソースに限らないけれども WeodPress的なるものとの競合って殆どないので。

生成したサイトやデータの寿命が長い

細かい理由はいろいろあるのですが、僕がデータベースをあまり信頼してない、という点が大きいと思います。 プロフィールにも書いてありますが、僕は20代の頃にデータベースのテクニカルサポートエンジニアをしていました。毎日いろんなお客様からデータベースのトラブルの連絡があり、状況や設定などを報告してもらって原因をさぐる、という仕事です。 データベースが遅い、止まる、ロールフォワードが終わらない、エラーが出るが原因が分からない、結果が違う、サーバと接続できなくなった、などなど、さまざまなトラブルがあり、その原因には、プログラミングミス、設定ミス、ハードウェアの障害、通信エラー、OSのバグ、運用ミス、勘違いなどさまざまです。

(強調は筆者)

上記の記述は「寿命」の話しとは違うわけですが、サイトを少なくとも5年運用することを考えた時、MySQLのバージョンがどう、PHPのバージョンがどう(まさに今、年度末で官公庁のCMSシステムリプレースとか)、って本当によくあるわけです。これからもどんどん出てくると思う。PowerCMSですら7年になる。PowerCMSはまだ初期のバージョンも保守しているけど、そもそものデータベースやPHPのバージョン問題とかはどうしようもないし。

止まったら一巻の終わり

なので、リプレースの相談ってのが本当に良くくるのですね。

クラウドストレージとの相性

途中引用した

Movable Typeで吐き出すHTMLをS3に保存すればmicroインスタンスでも頑張れるかもしれない

ってのもまさにそうだけど、AWS(S3)でもAzureのBlobでも、要するにファイル置き場についてはPHPのバージョンもOSもWebサーバーもへったくれもなく、ただファイルが置いてあってHTTPでGETできれば良いのですね。バックアップも考えなくていいってことです。

御社のCMSはSEOに強いですか?

最後にちょっと脱線しますけど、御社のCMSはSEOに強いですか? とか聞かれることがままあるのですが、スタティックなファイル生成をDreamweaverで行おうがテキストエディタで行おうがMovable Typeで行おうがPowerCMSで行おうが結果は変わらんわけです。なので、「ウチのCMSはSEOに強いでっせ」って売り込みをかけるベンダーがいたとしたら、そいつは信用ならないと思いますよ。それでも敢えて言うのなら、SEOに強いCMSってのは

  • SEOに強いサイトを作りやすく、メンテナンスしやすい

ということになると思います。もちろん、Movable Typeが持っている、様々なアーカイブを吐けて内部リンクの調整がしやすいとかそういう話しはともかく、例えばPowerCMSのCSVエクスポート/インポート機能がSEOに役に立つという人もいるし、トラッキングタグの管理機能が役に立つという話しもあるし、運営側が考える通りにサイトの内容を調整したりコンテンツを適切に投入できるCMSが長い目で見て(そもそもSEO自体が長い目でみるべきものですよね?)SEOに強いってことになるのではないかと。

ただ、一つだけ(聞かれた時に)はっきり言うことがあるのですけども。

  • スタティックに吐けるので、速い(表示速度)=強い

その程度ですね。

macoslib が便利すぎる

| コメント(0) | トラックバック(0)

Xojoがマルチプラットフォームなアプリを作れるとは言っても、作り込みを進めて行くとやっぱり特定のOS向けのソフトウェアになっていってしまう今日この頃。どうせ特定のOS特化していくなら、やっぱりOSネイティブの機能を使いたくなりますよね。昔はこんな本があったんですけどね...今や本家マニュアルの日本語訳すらありません。で、結局有償のプラグインということになるのですが(おや、お金がかかることは構わないのですけども←自分もそういう商売やってんじゃん)、macoslibというプロジェクトがある。これが、本当素敵すぎる。

macoslibは、要するに、XojoからOS Xへアクセスするための様々なライブラリを提供してくれます。尚、紹介するのはごくごく一部の機能です。興味のある方はご自身でお試しください。

ボタンにシステムアイコンをセット

実は... 一番時間がかかってるのがアイコン作成だったり(プログラマあるある的)。macoslibからOSアイコンの取得ができるので、使わない手はないと。

SegmentedControl のOpenイベントに

me.Items( 0 ).Icon = SystemIcons.QuickLookTemplate

で、システムアイコン(クイックルック)を取得してセットしてくれます。Retinaディスプレイの場合、大きなサイズのアイコンが戻ってきてしまうので(あと、色を変更したいというあたり)、実際は以下のような感じで、いい感じに。

クイックルックのアイコンをボタンアイコンにセット

me.Items( 0 ).Icon = GetIcon( SystemIcons.QuickLookTemplate.IconTemplateSetColor( &c333333 ) )

Sub GetIcon( P As Picture ) As Picture
  Dim SP As Picture
  If ScalingFactor > 1 Then
    SP = New Picture( P.Width / 2,  P.Height / 2, 32 )
    SP.Graphics.DrawPicture( P, 0, 0, P.Width / 2, P.Height / 2 , 0, 0, P.Width, P.Height  )
    SP.Transparent = 1
  Else
    SP = P
  End If
  Return SP
End Sub

NSSharingServicePickerを呼ぶと、シェアメニューを呼び出せる

Facebook自動投稿のMTプラグインとか、僕も作ってるけど(他の方が作成しているTwitterポストプラグインとかも)、殆どはData APIからのPostには対応していません。もちろんプラグインの方を変更してもいいんだけど、macoslibからシェア機能を呼び出せる。

シェアボタン

    Dim picker as New NSSharingServicePicker( New NSURL( Permalink ) )
    picker.ShowRelativeToRect( me.bounds, me.View, Cocoa.NSRectEdge.NSMinYEdge )

スムーズなウィンドウのリサイズ

NSWindowプロパティをウィンドウに設定( m_NSWindow As NSWindow )してOpenイベントで自分自身をセットしておき、

m_NSWindow = self

サイズを変更したいタイミング(MAUSでは、設定パネルのパネルをクリックした時)で、

m_NSWindow.SmoothResize( w, h )

とすると、スムーズなアニメーションでリサイズしてくれます。

検索フィールドを表示する

Canvasを配置して、Superを Cocoa.NSSearchField に設定する。

MAUSScreenSnapz019

Actionイベントで、me.StringValue とすることで値を取得できる。また、Openイベントで

  me.TabStop = true
  me.PlaceholderText = App.kLabelSearch

のようにして、タブフォーカス、CueTextのセットができます。

「このアプリケーションで開く」の実装

MAUSではないのですが、AzureのBlobクライアントを作っていて、直接Blobを編集するところを実装したかったのです。

このアプリケーションで開く

FolderItemをCFURLに変換して、FindAppsForURLを呼ぶと、アプリケーションのリストが返ります。

  Dim Apps() As FolderItem
  Dim CF As CFURL
  if F.Exists Then
    CF = new CFURL( F )
    Apps = FindAppsForURL( CF )
  End If

アプリケーションのアイコンを取得

上の画像の、コンテクストメニューのアイコンをセットしているところ。

      Dim Icon As MacIcon
      Icon = MacIcon.NewIconFromFolderItem( F )
      Dim p As Picture
      Icon.Size = 16
      p = New Picture( 16, 16, 32 )
      Icon.Draw p.Graphics, 0, 0
      Dim Mstr As String = App.kMenuOpenWithDefault
      mItem = New MenuItem( Mstr )
      mItem.Icon = p

冒頭にも書きましたけど、紹介したのはごくごく一部の機能です。興味のある方は是非ご自身でお試しください。

続き。

筆が軽くなる? って、何か軽いこと書くみたいな後ろ向きなことじゃなくて、FacebookやTwitterには毎日なんらかの投稿をしてるのにブログのポスト数は多くならないみたいなのが改善されるのかどうかを考えてみようと。

最近(最近でもないか) TumblrいいよTumblrという話しを見かけるのですが(今日もFacebookで見かけたのですけど、いざこうやって書こうとすると見つけられないのが不便ですよねぇ)。

と、ここまで書いて、Facebookだとここまでだよなぁ(文章量的に)。この程度の投稿をパッと投げてそれにコメントがついたり「いいね!」されたり... ちょっとこの分量でブログに記事投げるのは憚られるのは何故だろう。ブログってやっぱりそこに訪問してもらうアクションがあるからだろうか? 別に文字数何文字以上じゃないと決まりがあるわけじゃないのに。

あと、何だ、ここまで書いてポストして、後で追加・更新するんじゃダメなの? 何故ダメなんだろう。ツールの問題もそうだけど、心理的な何かがあるんじゃないだろうか。

  1. タイトルを考える重さ
  2. ツールの問題
  3. ブログに単文、草稿のようなものを投稿しにくい心理的な障壁

ちょっとまとまらないんだけど、一旦投げてみる。投げてみよう。

一応キャプチャを付けておく。

この記事入力

何でブログが書けないか、以降も続く(かも)

きっかけはね、何故ブログが書けないのだろう、もしくは続かないのかを考えてみたのだ。

タイトルの重み、タイトル重い

何だろう。やっぱりタイトルが敷居高いんじゃないかと思うのです。TwitterやFacebook。タイトル無しに書き始められるじゃない。そんなことを考えてみたのです。

ブラウザ立ち上げてログインしてってのも1アクション要るよね。Facebookなんかはまだいいのだ。既にログインしている、人の発言、タイムラインを見る。そこで、そのまま入力、タイトルは不要

手軽だし、短さもいい。文章のボリュームが不要というプレッシャーのなさ。そこが意外と大切なんじゃないか、と。

タイトル重要、SEOに重要、ソーシャルメディアに重要... 重要度が増すにつれ、タイトルを考えて思いつかずに小一時間(てのは極端かもしれないけど)。

多機能がゆえの管理画面の威圧感がないですか?

もしくは重厚な管理画面。多機能であるがゆえ、ログインして管理画面を遷移して(しかもそれなりにレスポンスが遅かったり)。そして、機能が多いことが威圧感や難しさにつながっていないだろうか?

マークアップの負担

マークアップ。リッチテキストもいいんだけど、ただマークアップしたいだけには多機能すぎるし、ビジュアルエディタ(リッチテキスト)も反応が鈍かったり思うようなソースが吐かれないとかで嫌いな人もいるだろう。

写真加工の負担

Facebookに写真をアップするとき、サイズを加工する? しないよね。ウィンドウにドラッグするだけ。そのくらいでいいのではないか。

MAUS - 呼吸をするようにブログを書くためのMarkdown エディタ

そういう目的に特化したツール。そんなツールができないかな、ということでツールを作ってみた。エディタを立ち上げてさくっとブログを書いてアップする。入力はMarkdown。

MAUSスクリーンキャプチャ

Data APIを使ったMovable Type クライアントです。 つまり、ブログエディタ。MAUSは次のような特徴を持っています。

MAUSの概要

  • ボタンやキーボードショートカットでMarkdownの各種記法に対応します。
  • ワンクリックでMovable Typeに記事を登録できます。
  • Drag & Dropで画像やファイルを挿入します。複数ファイルのドラッグに対応しています。
  • 画像やファイルはMovable Typeのアイテムとして登録されます。
  • 画像の自動縮小、サムネイルの作成ができます。
  • PDFのサムネイルが作成できます。
  • ビジュアルビュー(レンダリング結果)とHTMLソースビューを切り替え可能です。
  • プレビュー画面のスタイルシートが設定できます(設定→エディタ設定→テンプレート(タブ)。

便利な機能

  • リストや引用等の入力中にShitキー+改行(Returnキー)を押下することで、リストや引用、プログラム入力モードのまま改行することができます(次の行頭に記号やスペースが挿入されます)。
  • 画像挿入後、テキスト部分をダブルクリックすることで代替テキスト(alt属性)、URLの編集が可能です。
  • Command + "+"キー、Command + "-"キー、でボタン類の表示非表示を切り替え可能です。
  • 中央のエリアをドラッグすることでエディタとビューアーの表示幅比率を変更できます。ダブルクリックで初期値(5:5)にリセットされます。
  • Shiftキー + "目玉" ボタンクリックで、管理画面に遷移することができます。
  • Dockのアイコンにファイルをドラッグ & ドロップすることでファイルのアップロード(アイテムへの登録) が可能です。

今後の課題

  • カレンダー横の日付表示部ですが、"@"部分のコンテクストメニュー(右クリック又はCtrl+クリック)で、「現在時刻にリセット」ができます。記事を書き始めてから、公開するまでに時間がかかってしまったのに書き始めた日付で公開されてしまう、というのを何度も経験していて、このあたりは何とかしたいところ。デフォルトで最初の投稿時の日付にしてもいいと思う。ここは今後の課題。
  • ブログ記事の概要、キーワード、タグなどのメタ情報を編集できます。ただ、これも、多分このUIだと指定するのを忘れてしまう可能性が高い。最初のデプロイ時にメタデータ編集画面を表示するオプションを検討したい。
  • カテゴリが指定できない。これは現状のData APIでできないから。当然要望として出てくるでしょうね。 これは、プラグインを書いて対応させた。とりあえずカテゴリの指定は一つのみ。タグは指定可能です。
  • テキストフォーマットが指定できない。このエディタから投稿したらフォーマット Markdown になって欲しいけど、これもプラグインが必要。Data APIからはできない。 これもプラグインで対応させた。
  • 投稿時に戻ってきたAPIの返り値を受け取ってドキュメントのプロパティとして保持する仕様にしているのですが、"概要"の扱いが何かスマートじゃない。つまり、"概要"欄を空のまま投稿しても、自動生成されたテキストが返ってくるので。こうすると、次に上書きアップロード時には"概要"欄にテキストがあるものとして投稿されてしまう。"概要の受け取り値を無視する"ような設定が必要そう。投稿時の戻り値については、概要は空なら空で良いと思うけどね。
  • ショートカットキーを覚えることで、ツールボタン類を隠したくなるんですけど、ステータスバーのようなものがやはり欲しいかも。記事のステータスを確認したり、メタ情報を確認したり日付を確認したり。ただ、画面を広く使うという点では矛盾するのですが。

尚、MT6ユーザー限定、Macユーザー(OS 10.7以降)限定って、すごく狭いターゲットなので、今後はXML-RPC対応版などへの展開を検討しています。そりゃね、Wordpress にも対応したいわ。

Movable Type Data APIへの要望

カテゴリが指定できないのは上記の通り現状のData APIでできないから。これは僕の仕事ではないので(プラグインを書けばできると思いますが)、バージョンアップを待ちたいと思います。 上記の通り、限定的ではあるもののプラグインで対応させた。

すべてできるように、というのはもちろんですが、プライオリティをつけるとすれば、以下のようなものですかね。

  • 記事のカテゴリ指定に対応して欲しい
  • 既存アイテムの一覧取得、アイテムの上書きに対応して欲しい
  • テキストフォーマットを指定したい。
  • 記事投稿後のAPI返り値の"概要"の自動生成は不要。Data APIはあくまでも"素"のデータを返して欲しい。あるいはAPIのパラメタで指定できるように。
  • カスタムフィールドの一覧が取得したい(そこまで手は回らないだろうけど)。
  • JSONオブジェクトが取得できるコールバックが欲しい。これまでMTのプラグインを書いていた人に対してはこっちのほうが敷居が低い。新しい開発者も大事だろうけど、既存の開発者も、ね。

このソフトウェアが良いものになるかどうかは、そこらへんにもかかっている、と、最後に中の人にプレッシャーをかけておこうと思います。以上、MAUSのご紹介でした。

Facebook

Twitter

このアーカイブについて

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

前のアーカイブは2014年1月です。

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

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

Powered by Movable Type 6.2.6