ku-sukeのブログ

Just another hatena blog

Web屋がWordpressで消耗しないCMSを考えてみた

 最近ちらほら、Wordpressキツイよねという話がWeb屋さんの知り合いからよく耳にする機会があるように感じます。というか、僕自身コーポレートサイト製作の案件とか相談された時に、Wordpressはちょっとないなと思っちゃいます。(まぁ予算があったり規模がデカければ普通に商用CMS使いますが。)

そんななか滋賀の渚さんが虚構新聞のサイトとアプリをまるっとリニューアルして、すんごく薄いCMS?的なものを作られていたので影響されて考えをまとめてみました。 

Wordpressが嫌になるシチュエーション

だいたい、昔の静的サイト制作のノリのままCMS化が進んでWordpress使いやすいよね~で流れてしまった挙句、バージョンアップや脆弱性対応でつらい目にあってWordpressやめたくなってるんだと思います。

そもそもの前提として

  • コーポレートサイトとか、基本静的ページでもギリ行ける内容。
  • でも、お知らせ更新とか問い合わせフォームとかちょこっと動的。
  • スマホでアクセスしたらスマホ版でみせたい。
  • 保守は請け負っていない、顧客も予算とってない。
  • 3−5年くらいは使用されることが予想される。
  • サーバは安い共用

というかんじだと思うんですよ。

じゃあどういうのがあればいいか

裏返すと、以下の様なCMSがあれば良いなーと個人的に思うわけです。

  • めっちゃシンプル。PHP10ファイルくらいで出来てる。
  • テンプレートは制作会社で作るので10個くらい主要なタグ(現在のURL取得とかogタグ各種組み立てられるくらい)が使えればいい。
  • なんだったらデータベースなくても動いてくれていいかも。
  • クライアントが新着情報を更新するくらいのWysiwyg管理画面はほしい。画像やPDFの添付くらいは必要。
  • ユーザエージェントでスマホ版には切り替えてほしい。
  • 勝手にバージョンアップしないで欲しい。
  • バージョンアップしなくても脆弱性とかないようにしといてほしい。(すくなくとも外部からアクセス可能な記事表示部分は。制作会社に責任が発生するという意味で。)
  • プラグインとかで拡張しなくていいのでシンプルを保ってほしい。拡張したければ制作会社がカスタマイズ費とって改造するし。
  • ロリポップ/minibird等のレンサバでFTPアップで動くこと。黒い画面禁止。
  • スマホアプリも今度作るかもなのでJSON APIも吐き出してほしい。

いかがでしょうか。PHP製の軽量CMSを幾つかあさってるのですが、まだこれといったものに出会えていません。SoyCMSとかbaserCMSもいいのですが、もっともっと薄いものを探しています。

 

例)Monstra

monstra.org

例)kirby

getkirby.com

 

ほかにもPico,getSimpleなどあるのですが、これらは結構似通っていて、Markdownベースだったりします。クライアントにMarkdown書いてっていうのもなぁ(Aceエディタとかあるけども)と思って、あまり深入りしていません。これくらいのシンプルな薄いCMSで、gitとmarkdownがなくても使えるものがあったらぜひ教えて下さい。

 

虚構新聞/虚構新聞社公式アプリ

虚構新聞/虚構新聞社公式アプリ

  • NagisaWorks, K.K.
  • ニュース
  • 無料

 

爆速モバイルWeb、AMPの仕組み抄訳

鈴木さんの記事を読みましてAMPの仕組みについて読んでみました。以下抜粋して日本語メモを。

モバイルウェブが爆速に! GoogleがAMP (Accelerated Mobile Pages) を立ち上げ | 海外SEO情報ブログ

 

追記:ざっくり言うと、主にニュースとか静的コンテンツを想定し、HTML+CSSでJSは原則禁止、広告とかで使いたい場合iframeを用意するのでその中だけ。iframeや画像は事前にサイズを固定し変更不可にすることでlazyloadしてもレンダリング時にガタガタしないよね。というAMP HTMLフレームワークを策定したお話です。

 

原文:https://www.ampproject.org/how-it-works/

モバイルのための仕組み

(※見出しは筆者による)

Web performance is not unexplored territory for the tech community: books have been written about it, many talks have been given – there is even an entire conference series dedicated to the topic. However, users still frequently see poor web performance in the wild, particularly on mobile devices. 

Consumption of news articles, and similar relatively static content, is often painfully slow, with pages taking a long time to load. Even after text becomes visible, pages continue to build up over many seconds, as ads and images come into display. The result is an often jarring experience of janky scrolling and users needlessly losing their reading position.

中略

To make the web fast at scale, we want to make it easier to create documents that are fast-by-default.

 ウェブパフォーマンスは、技術コミュニティにとって未知の領域ではなくなったものの、ことモバイルウェブにおいてはまだまだ荒削りの状態です。ニュース記事を読むにしても、テキストが表示されてなお画像や広告を読み込むためにページの構築は何秒間も続きます。その結果ユーザは読むために不毛なスクロールと耳障りな経験をします。

そこで我々はWebを高速にスケールさせるために、デフォルトで高速なドキュメントを作りやすくしたいと考えました。

対象は静的コンテンツのみ

The web today is many things: an application platform, an e-commerce platform, a content platform, a gaming platform, and so much more. We decided to focus entirely on static content 

いまウェブはEC、プラットフォーム、ゲームなど様々なものでできているので、その中で容易に適用できる静的コンテンツに集中することに決めました。

 

We began to experiment with an idea: could we develop a restricted subset of the things we’d use from HTML, that's both fast and expressive, so that documents would always load and render with reliable performance? That experiment has culminated in a promising proof of concept we call Accelerated Mobile Pages (AMP). AMP HTML is built on existing web technologies, and the documents written in it render in all modern web browsers and web views. 

我々はHTMLのサブセットを開発し高速で表現力豊かな、そして信頼できるパフォーマンスを実現できるか検証し、AMPと呼ばれるコンセプトを実証しました。

AMP HTMLは既存のWeb技術で作られているため、すべてのモダンブラウザやWebViewで適切にレンダリングされます。(※翻訳元のページ自体がAMP HTMLで記述されています)

We think AMP HTML is promising, but we know it's not complete. We are sharing our proof-of-concept on GitHub to start a conversation about how to make static content on the web fast.

AMP HTMLは有望だと思いますが完全ではありません。ぜひgithubページをみて静的コンテンツを(モバイル)ウェブ上で高速にする方法について議論しましょう。

JavaScriptについて

One thing we realized early on is that many performance issues are caused by the integration of multiple JavaScript libraries, tools, embeds, etc. into a page. This isn’t saying that JavaScript immediately leads to bad performance, but once arbitrary JavaScript is in play, most bets are off because anything could happen at any time and it is hard to make any type of performance guarantee. With this in mind we made the tough decision that AMP HTML documents would not include any author-written JavaScript, nor any third-party scripts.

私達が早くから認識していたパフォーマンス問題の一つに、ページ内に埋め込まれる多数のJavaScript(ライブラリやツール等)があります。

JavaScript=パフォーマンス低下というわけではありません。しかし任意のJavascriptを実行させるとパフォーマンスの保証を行うことが非常に難しいため、難しい決断でしたがAMP HTMLは一切のJavaScript(自信が書いたものもサードパーティ製のものも)を含めないことにしました。

JavaScript is the core building block for advanced web apps, but for static content it may not always be required

中略

But the web platform has a great solution: custom elements and web components. AMP components may have JavaScript under the hood, but it is coordinated with other AMP components, so its composition into the page doesn’t cause performance degradation.

JavaScriptは先進的なWebアプリにとって中心をなすものですが、必ずしも静的コンテンツに必要ではありません。(投票などの機能を用いている記事はあるものの)ウェブプラットフォームにはカスタム要素とweb componentがあります。AMPコンポーネントの中にJavaScriptを用意しています、他のAMPコンポーネントと協調して動作するためパフォーマンスの低下を引き起こしません。

So, AMP HTML comes with strong limitations on JS. What about CSS? AMP HTML loves CSS! We do add some best practice enforcement, but we do want AMP HTML documents to look like their authors intended them to, and so allowing extensive styling is core to the platform.

AMP HTMLがJSに強い制限を加える一方、CSSはどうでしょうか。AMP HTMLはCSSが大好きです!いくつかのベストプラクティスを用意しましたが、AMPページで制作者の表現をぜひして欲しいので、スタイルの許可をプラットフォームのコアとして据えています。

広告とアクセス解析は?

Ads and analytics – while critical for publishers – are a big part of the performance problem and so they must be a big part of the solution.

中略

AMP HTML does not allow this. We realize that both ads and analytics are an important element of monetization on the web, and so we need to support them: our goal is to realign monetization with great user experience.

パブリッシャーにとって、広告と解析がとても重要であることは理解しています。(広告や解析は様々なタイミングでJSを実行しますが)AMP HTMLではそれらを許可しません。解析や広告がウェブでの重要なマネタイズ手段だと認識しているので、我々はそれをサポートする必要があります。私達のゴールは素晴らしいユーザ体験とともにマネタイズを再編成することです。

AMP HTML is taking the following approach to analytics: so-called “tracking pixels” can be embedded into AMP documents as long as they don’t use JavaScript. They typically come with a noscript version that makes this easy. More advanced analytics are currently not supported. Our vision is to deploy a single, unified, auditable, high performance, open source analytics library with AMP HTML that can report to various existing analytics provider backends, so it is possible to use the existing ecosystem without overloading a page with analytics software. 

 AMP HTMLでは、従来noscriptタグとともに用いられていたような解析ピクセルを使用して下さい。それ以上の高度な解析は現在サポートしていませんが、AMP HTMLが従来と同様の解析を出来るようなオープンソースライブラリを提供したいと構想しています。

instead they live in sandboxed iframes with no access to the primary document. 中略

We also prioritize ads lower during loading than other content and optimize load timing to avoid jank. Ads in AMP files can still be heavyweight, so there is still a lot of work to do for us. 

 (AMP HTMLはJSが利用できませんが)代わりにサンドボックスiframeに広告を表示できます。iframeは優先度低くロードされることでページロードを阻害しません。iframe内の広告自体に関しては、まだまだ高速ではないため私たちは多くのことをする必要があります。

速度について

So, how fast is AMP HTML? Pretty fast. In a sample of pages our early partners created we are seeing performance improvements measured through Speed Index between 15% and 85%. This was measured with a simulated 3G connection and a simulated Nexus 5 device.

それで、どれくらい速いのでしょう?めっちゃ速いで。SpeedIndexを使用してNexus 5の3G回線で計測したら、15%~85%位早くなりました。

But how do we get from good to, let’s say, instant? We’ll cheat :) AMP documents are from the ground up designed to be efficiently pre-renderable. Browsers have long supported pre-rendering through the <link rel=prerender> tag, but they need to be conservative about this mechanism because prerendering can be expensive. With AMP HTML we added the ability to tell a document: render yourself, but only as far as what is visible above the fold and only elements which are not CPU intensive to minimize the cost of pre-rendering. With this mechanism in place, referrers of AMP document can initiate rendering of docs before the user acts much more aggressively, so that in many cases the document will be done rendering by the time the user clicks.

でも、どのように実現しているのでしょうか。私たちはズルをしました。AMPは事前にレンダリングしやすいようにデザインされています。各ブラウザは<link rel=prerender>タグを実装していましたが、処理が重くあまり利用されてきませんでした。AMP HTMLは、ブラウザ自身がレンダリングするもののファーストビューができるだけ早く、かつCPU負荷の高くないものという条件でプレレンダリングするようブラウザに伝えます。このため、多くの場合でユーザがクリックする前にドキュメントのレンダリングが完了しているのです。

With all of these techniques in place, AMP HTML documents can be loaded with a small set of HTTP requests: the document itself, custom fonts (if used) and what we call the AMP JavaScript library that implements the AMP custom elements and resource loading. 

これらのテクニックを適切にするため、AMP HTMLは少数のHTTPリクエストでロードできます。ドキュメント自体、カスタムフォント(使う場合)そしてカスタム要素やリソースをロードするためのAMPライブラリと呼んでいるものです。 

Our goal with AMP HTML is reliable performance, so we designed it to be easily cacheable by content delivery networks (CDNs). Google is offering a service that delivers AMP HTML documents given their URL through its CDN. Others can use this service or make their own or serve AMP HTML pages from a plain-old-web-server.

信頼できるパフォーマンスを達成するため、CDN経由でキャッシュ可能な配信できるようにしました。AMP HTMLはGoogleが提供するCDN経由で配信することができます。もちろん自身のサーバからでも、普通の古いサーバからでも配信することが可能です。

レイアウトを事前に定義

This brings us to the final topic that makes AMP HTML unique: all resource loading is controlled by the AMP library and, more importantly, resources must declare their sizing up-front. 

This doesn’t mean that resources can’t be responsive – they can be, but their aspect ratio or dimensions needs to be inferable from the HTML alone. This means that after initial layout, an AMP document does not change until user action.

中略

This gets us lazy loading with zero visual jank.

 

 最後に、AMP HTMLを特徴づけている点について。すべてのリソースは、事前に自分のサイズを定義しておかなければなりません。

これは、レスポンシブデザインに対応していないという意味ではありませんが、縦横比やサイズを初期ロードのタイミングでHTMLから読み取れるようにしておく必要があります。AMPページは初期レイアウトされてから、ユーザがアクションするまでレイアウトが変化しません。(広告であっても固定の枠からサイズ変更を許可しないので)非同期でリソースを読み込んでもページがガタガタとレンダリングされることがありません。

To summarize: AMP HTML is a specialized subset of HTML with custom elements that provides reliable performance and instant loading of static content. Nothing about the project is set in stone.  

中略

See you over on GitHub!

 まとめ:AMP HTMLはHTMLのサブセットとカスタム要素で出来ていますが、まだなにも確定はしていません。See you over on GitHub!

=================

ということで、HTML+CSSでシンプルなページを用意し、JSを禁止し、画像や広告の表示サイズを事前に固定することで、高速ロード、高速レンダリングかつ読みやすくなるよね!ということのようでした。Googleが参加するということでWeb界隈の人は抑えておいたほうが良いと思います。

iOS 9の各種ブロック率をGAで解析する方法

先のエントリで、検出テストをやってみたのですが、だいたい仕組みとかがわかってきたのでfuckadblockに頼らないお手軽対策をやってみたいと思います。

 

一応傾向値だけは知っときたいなと思って、設定してみました。これでほぼGAのブロック率は計測できるんじゃないかなと思います。

<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script type="text/javascript">$(window).load(function(){
if(typeof window.ga.loaded == "undefined"){$("#header").append("<img src='http://example.com/analytics.php' />");}
}
);</script> 

 本来windowのロードが完了した時点では、gaのロードが概ね終わってるはずなので、そのタイミングに引っ掛けてwindow.ga.loadedプロパティの有無を調べるという方法です。

これで検出できた場合に、自分のドメインに設置したGAにサーバサイドでページビューを送信するスクリプトを読ませるようにします。Universal Analyticsをガラケーサイトに対応させるためのスクリプトみたいな感じです。

gist954e13443c2dc1982f3b

いちおうCookieでユニークユーザを計測できるようにしつつ、IPとUserAgentだけ送信しておきます(仕組み上GhosteryみたいなPC用のブロッカーも反応するので。)

ちゃんとやる場合はページパスも渡すようにしてもいいのですが、今回は傾向値を掴みたいだけなので固定パスでpageviewを送ります。ここは好みに合わせて、埋め込み元からパスやタイトル情報を渡したり、eventで送信してもいいですね。詳しくはMeasurement Protocolを読みましょう。

 

この方法で、GAのBlock率を計測することができます。なお、24時間での実験結果ではこんだけBlockerの記事書いててもGAブロック率7%程度でした。

 

広告屋さん向けに書いておくと、GTM/YTMなどのブロック率検知も同様に行えます。

GTMなら、window.google_tag_managerとか、YTMはちょっとわかりやすいパラメータが見当たらなかったのですが、window.BrightTag.V2_RESPONSEとかですかね。

PCでテストする場合は、Ghosteryの拡張でオン・オフしながらChromeのコンソールでconsole.dir(window)として、ブロック時と非ブロック時で違いが検出できそうかつwindow.loadイベントのタイミングで拾えそうなものを選びます。

 

ちなみに、解析用スクリプトはadとかanalyticsっていう単語を入れると引っかかる可能性があるので、自ドメインで無関係そうなファイル名にするのが無難だと思います。

(追記)iOS 9のSafariの広告ブロッカーを検知するテスト

もともとPCの世界にはAdBlockというのがあって、僕も愛用しているのですが、それを良しとしないサイト運営者向けに、FxckAdBlockというJSがgithubで公開されています。

github.com

動作原理としては、存在するはずの広告枠のCSSをチェックし、隠されたりそもそも存在しているかどうかを調べ、NGなら警告を出すというものです。

 

追記:2015-09-20

--ここから--

動作原理としては、特定のclassを含む要素を作成し、CSSとして隠されているかを調べるというものでした。iOS 9のAdBlockerアプリはJSの通信をブロックするものが主流で、CSSで隠すものは少ないため、検知があまりできないようでした。

シンプルに検知するなら以下でどうかなーと思ってます。

<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script type="text/javascript">$(window).load(function(){
if(typeof window.google_ad == "undefined"){$("#header").append("<div style='color:red;'>AdBlock Detected</div>");}
if(typeof window.ga.loaded == "undefined"){$("#header").append("<img src='http://mydomain.example.com/aaaaa.php' />");}
}
);</script>

要は、ページのロード完了時点で主要なタグのオブジェクトの存在有無を確認する感じですね。

Google Adなら、window.google_adとか、GAならwindow.ga.loaded オブジェクトをtypeofして"undefined"じゃないかを調べる感じですね。

--ここまで-- 

 

このブログにはそもそも広告を入れてなかったのですが(ZenBackの下部除く)実験的に復活させてみたうえで上記のJSを導入してみました。(今はもう外しています。)

f:id:ku-suke:20150919094832p:plain

 

みなさんのAdBlockerでの検知状況に関して、@ku_sukeかこのブログのコメント欄にてご報告いただければ幸いです。

 

ちなみに、しばらくしたらうざいので消します。→消しました。)また、コードを下においておきます。

<script type="text/javascript" src="https://raw.githubusercontent.com/sitexw/FuckAdBlock/master/fuckadblock.js"></script>
<script type="text/javascript">
// Function called if AdBlock is detected
function adBlockDetected() {
$("#header").append('<div style="height:360px;background-color:red;font-size:72px;">AdBlockを検出するテスト</div>');
}

// and|or
fuckAdBlock.setOption({
debug: true
});

if(typeof fuckAdBlock === 'undefined') {
adBlockDetected();
} else {
fuckAdBlock.onDetected(adBlockDetected);
fuckAdBlock.onNotDetected(adBlockNotDetected);
// and|or
fuckAdBlock.on(true, adBlockDetected);
fuckAdBlock.on(false, adBlockNotDetected);
// and|or
fuckAdBlock.on(true, adBlockDetected).onNotDetected(adBlockNotDetected);
}
fuckAdBlock.check();
</script>

 

 

microserviceはしんどそうだけど、2層くらいはいいよ

今年携わっているクライアントのシステムを2層化するように進めているんだけど、けっこうアリだなと思うようになってきたので書き留めてみる。

 

■2層システムとは

最近microserviceが話題になってるんですが、役割ごとに多数分割するのではなく、MVCでいうところのMとVCの2つに分割する感じです。

 

図を後で書く

 

■2層システムのそれぞれの役割

バックエンド(データレイヤーとか呼んでる)は、業務要件に適したモデルをJSON APIで提供します。出力だけじゃなく会員登録や各種CRUDができるようにします。

 

逆に、フロント側は原則データベースを持たず、REST APIを用いてウェブアプリケーションを構築します。場合によっては1画面複数APIを叩くので、適宜キャッシュや非同期処理ができるといいですね。

 

■2層システムに分ける意義、幸せなこと

・システムの寿命というかライフサイクルが違う

 一般的にプレゼンテーション層というのは、自社のビジネスではなく世の中の進化に左右されがちです。やれGoogleアルゴリズムを変えたとか、スマホの比率が急に増えたとか、AppIndexingでWebと同じ内容をアプリでも提供した方がいいとか、アドテクなどマーケ系システムのJSと連携したりとかです。

 

その反面、サービスがひと通り立ち上がったあとのビジネスロジック層というのは、それほど頻繁に変わらないし、変わる場合も自社の年間や四半期の経営計画に沿っておちついて計画できます。

 

それらのライフサイクルというところで分断することで、たとえば表側はNodeJSなどスクリプト言語の軽量なものでかき、長期間コードベースを維持するくらいならさくっと捨てて書きなおしたりしつつ、バックエンドはとにかくパフォーマンスと可用性を重視して、GoやJava/Scalaなどで書くといった具合の技術の選定がしっくりきやすいと個人的に感じています。

 

また、フロント側にデータベースを持たせなければ、サーバのセキュリティ要件をやや緩和しやすくなるきがしますし、バックエンド側をオンプレに置いてhttpsポートだけ開けて、フロントはGAEなどクラウド化するというのもやりやすそうですね。


・業務知識レベルに応じた分業がしやすい

もうひとつ、ある程度の規模のウェブアプリケーションとなると、人の入れ替わりでブラックボックス化しやすいという問題があります。ドキュメントをメンテしたとしても巨大で、外注さんに来てもらってもなれるまで時間がかかったりします。

 

そこで、業務知識も必要なビジネスロジック部分は、ある程度なれた人間を中心に構成し、ミスのないように設計実装をします。そうして出来上がったAPIをドキュメントも含めパッケージングすることで、歴の浅い人や外注さんがプレゼンテーション側を担当し「そこだけ見れば良い」という状況をある程度作り出すことが可能になります。

 

もちろんマイクロサービス的な保守コストの増加というのは少しはあるのですが、それを上回るメリットがあると感じていますし、APIのバージョニングを用いることで、/v1/は2016年までメンテ、/v2/は2017年までということが計画しやすくなります。

TVなどなかなかアップデートされない機器向けに提供する場合を想定し(/v12-lts/のような)5年間の維持を約束するバージョンも提供してもいいかもですね。

 

微妙に、API化するほどじゃないけど、フロント側にデータベース持たせたくないなぁとかいう要件がちらほら出てくるので、当然ながら銀の弾丸ではないのですが、すでにあるていどビジネスが立ち上がっているウェブアプリケーションには結構おすすめだなと思いました。

1万円の価値(と企業規模と業務システム)のはなし

最近、おっさんエンジニア諸氏と久しぶりに飲みに行くときによくする話があるのですが、社員50人の会社から2000人(当時)の会社に転職して、あるいはもっと歴史ある企業のお客様と接するときに痛感することが有ります。

 

本題に行く前に飲みの席で出た具体例を。

 

とあるクラウド形式で提供されるサービスが有り、それは従量課金のクレジットカード払いが標準でした。そこで日本のとある会社が2万円前後の微変動する実費のサービスを請求書払いで月5万円強で企業に提供していました。

 

そこで、「それはぼったくりだよね」という話になったところで、僕が「そんなこともないんじゃないかな」という話を入れました。

長い間日本企業は稟議で予算確保、月末締め、翌月末払いの請求書払いを基本としていて、それをベースに社内システム・人員含む体制が構築されているので、そこからはみ出る処理は手間がかかるんですわ。という話をしました。

 

■日本的な業務の仕組みとあわない

 

たとえば前述の請求書払いの月5万円のサービスだと、5万円×今会計年度末月までの利用費を稟議に上げればいいわけです。予算確保と見積書、支払いが一致するわけですね。

ところが前述のクラウドサービスをそのまま使うとなると話がややこしくなります。

まず、コスト見積がわかんないので、多めに稟議をあげます。100万円とか。そうすると実費30万円だったとしても100万円の予算確保をベースに売上見込みを立てるような業務システムがあるので、そのフォーマットにあった作文を作るわけです。「150万円儲かります」みたいな。

あるいは、ぎりぎりの予算を通そうとすると、1円でも超えた瞬間大慌てで支払期日までに追加の稟議を挙げないといけません。「利用数が突発的に発生し5000円超えました。」みたいな。

さらに会社によっては「見積書の添付をお願いします」と言われることも。。。

 

無事に予算が確保できたら、次はコーポレートカード使用申請です。こちらも限度額があるので注意が必要、かつ、使用額の見込みが不安定となると経理はいい顔をしません。「もし限度額超えて決済できない案件ができたらどうするんですか!」と

 

そういった経理担当を説得し、はれてサービスを使い出すと早速月末が訪れます。実際の使用料金が確定したので先の経理担当に報告します。「今月は$198でした。」「それ何円?」「今日のレートでぐぐったら23,543円です。」「請求タイミングのレートで確定してくれないと困るんだけど」「えっと、いつだっけ。。」

そして決済タイミングの為替レートで説明を終わらせると「それでは領収証の原本を送付してもらって下さい」と言われたりします。ないよ。Webの管理コンソール見てよ。あってもPDFなんだけど「原本」って何さ。

 

■言いたいことは業務システムのクソさではなく

 

ようするに、クレジットカードでドル払い、従量課金で年間コストが正確に予測できないサービスは、大企業の非IT部門との間で多大な調整コストが発生します。そんな事務処理に毎月数時間費やすとしたらどうでしょう。それが月3万円で解決できるなら払うという企業担当者はめちゃくちゃ多いです。さらに紙のNDAも結ばしてくれると最高。

 

ここで表題の1万円の価値になるんですが、零細企業、あるいは個人事業主にとって毎月3万円って大金だと思うのです。月の売上が100万円とかだと3%じゃないですか。

 

でも、月の売上が1億とか、10億になってくると、3万円なんて誤差でしかないわけです。なので「日本のトラディッショナルな社内標準のワークフローでできるようになる」ことは、大企業にとっては数万円、へたしたら数十万円くらい喜んで払うわけです。

 

僕が1万円の価値っていうのを感じたのは、やっぱ大企業って機材や検証機はケチらないし、いざ広告打つぞってなったら、数万円単位じゃなく数百万円単位だし、逆に月間の売上1000万円くらいだと失敗とみなされるし、子会社が独立して8億円の売却益が発生しても、「当期純利益への影響が軽微なため」って発表しちゃったりして、違うなーと思うわけです。

 

もちろん、そこで所属する人間も、家に帰ればただの人なので、卵1パック188円で高いな、と思ったりするわけで会社人間としての金銭感覚とのギャップでも考えちゃうわけです。

 

■結論:本質的な価値ではないところも含め「顧客価値」

 

だから僕は、もし日本でB2Bのサービスをやるなら、固定金額や請求書払い+営業部隊っていうのは(必要とは言わないけど)顧客提供価値の一部だと思ってます。価格帯によっては本質的な価値よりもそっちのほうが上回る場合もあるんだけど、そこはサービス設計としてグローバルじゃなく日本市場をターゲットとするならアリだと思います。

 

技術者の人って本質的な価値しか追求されない方が結構多いので、こういうはなしをおっさんエンジニア諸氏とすると盛り上がるわけですw

 

※そんなクソみたいな業務システムになってる企業は滅びればいいという皆様には同意しますが、おおいんですよ。普通に。売上1億円超える企業だとこっちのほうがスタンダードだと感じます。

 

※その分、大口契約の可能性も高いわけで。めんどくさいから年間契約で10ユーザー分よろしく的な。大口契約になればサービス提供側も、事務処理コスト分サービスに転嫁しなくていいので、本質的になりますね!

Bootstrapよりキレイ!Googleのマテリアルデザインキット

Bootstrapの見慣れた感というか、モック感から脱却しようとFoundationとかに手を出しかけてたのですが、Googleがだしてきたマテリアルデザインキットがすごく良かったので紹介します。

 

f:id:ku-suke:20150804202136p:plain

 

たとえば管理画面風のデザインはこれ

 

ほかにもBootstrap風の上部メニューのデザイン(Android)もあったり

 

f:id:ku-suke:20150804202525p:plain

 

コンポーネントと呼ばれる部品も充実しています。これ見るだけで色々できそうな気がしますね!

 

f:id:ku-suke:20150804210236p:plain

 

Blog風など幾つか提供されています。いまとあるサイドプロジェクトで簡易的な管理画面をつくろうとしてたのですが、早速活用していい感じに仕上げることが出来ました。

 

ダウンロードすると全テンプレートが含まれているので、コピペで組み合わせるだけでも結構いい感じに出来ます。Bootstrapに飽きてきたら、ぜひ使ってみてください。

 

www.getmdl.io