ヒマをみつけてWeb開発
その場の思い付きを、ヒマをみつけてWebサイトにしてみるブログ

ARの力でVRをカオスにする、カソウセカイカメラをリリースしました

Friday, 3 August 2012 02:18 by sabro

仮想世界カメラ

世の中はいま、アクセルワールド、SAOみたいな仮想世界アニメが好調で、先日はサマーウォーズのテレビ放送なんかもありましたが、セカンドライフの話題はまったくありませんでしたね。そんなちょっと忘れられ気味なセカンドライフ向けの新サービスをリリースしたので紹介させていただきます。

カソウセカイカメラ
http://www.kasousekaicamera.com/

ARとVRの先端技術を組み合わせれば、超最先端になるはずという思い込みを出発点に、仮想世界の中で拡張現実ができるサービスになってます。詳しくは、発表会で使った資料をみてもらうとわかりやすいと思います。

 

 

このブログはウチの技術ブログという位置づけなので、内部で使用している技術をちょっと紹介( ̄∇  ̄ )

仮想世界向け独自GeoHash

緯度、経度の情報をハッシュ化し、位置のインデックスを作るGeoHashという技術があります。当然、カソウセカイカメラのコメントインデックスにも応用できそうなのですが、あれは緯度、経度が有限という前提なので、無限に広がる仮想世界ではうまく使えませんでした。そこで、4バイト整数の最大値2,147,483,647メートル四方をインデックスできる、独自のGeoHashを作成しました。といっても、ハッシュ自体の作り方は全く同じです。個人的にはGPSにしろGeoHashにしろ、人が住むのは地球だけという狭い視野で作られているので、月面基地、スペースコロニー、仮想世界など、人が活動するあらゆる場所から一意に特定できる新しい仕組みが必要になるときが来るとおもいます。

3次元空間の位置を2D画面にマッピングする透視投影変換

3次元空間上にあるコメントを、HUDの2次元座標に変換するのに透視投影変換を使いました。ゲームではおなじみのアルゴリズムですね。ただ、ゲーム制作の場合はライブラリがこのあたりを受け持ってくれることが多いみたいですが、セカンドライフのスクリプトLSLにはそんな機能はもちろんないので、ローレベルなところから実装が必要で大変でした。

技術的に面白く、内容もそこそこ面白い、カソウセカイカメラをよろしくおねがいします( ̄∇  ̄ )

達人プログラマーを目指すのもいいけど

Friday, 27 January 2012 03:49 by sabro

達人プログラマーを目指してというブログがあって、技術的な面で参考になることもあるし、はてなのホットエントリで上位に来るからたまに見に行くんだけど、どうも違和感を感じることがあった。ぼくは揉め事とか好きじゃないしスルーしてきたんだけど、ブコメ見ててもぼくみたいな考え方する人は少ないみたいなので、こういう考え方もあるってことを書いてみようと思う。

技術を理解しない上司と言ってることは同じ

あのブログでは、技術を理解しないマネジメント層を悪く言うことが多い。ぼくも技術を理解しない上司は問題だという点は同意する。しかし、同様にマネジメントを理解しない技術者もまた問題なのである。ひたすらに技術者からの要求を並べているが、マネジメントのことを理解しようという姿勢があのブログからは感じられない。経営しか分からない人が技術を軽視することが滑稽であるように、技術しか分からない人が経営を軽視するのも同じく滑稽だ。結局、自分が担当している分野以外を軽視するという点では、言っていることは同じなのである。

分業による効率化が想像力を奪った

今では営業部門と製造部門が分かれてるのは当たり前だが、ずーっと昔はそうではなかった。産業形態は、家内制手工業 → 問屋制家内工業 → 工場制手工業 → 工場制機械工業と移り変わってきたが、家内制手工業の段階では、製造も販売も基本的に同じ人が担当していたのである。当時の職人は技術的技工を追い求めると同時に、自分の商品を買ってもらうため営業活動もやっていく必要があった。製造から販売まで行程の全てを体験するため、当時の人はどちらの大変さも、どちらの面白さも理解していたに違いない。しかし、問屋制家内工業の段階から、販売する人と製造する人は明確に分けられるようになってしまった。分業することで効率化は進んだが、販売担当と製造担当がお互いの重要性を理解しなくなっていった。

技術を理解する上司が増えなかったのは誰のせいか

個人的には、マネジメント層に技術を学べと言っていいのは、マネジメントを学ぶ気のある技術者だけだとおもう。技術書をたくさん読んでるのは分かるけど、マネジメント層だって経営論は学んでるはず。マネジメント層に技術書を読んでもらいたかったら自分も経営論を読まなきゃいけないだろう。そもそも、技術者が技術ばかりを追わずに経営論も学んでいたら、技術者上がりでマネジメント層へ行く人間はもっと増えていたはず。なかなか技術者からマネジメントしたい人がでてこないから、会社としても経営しかできない人を上司にするしかなかったことも理解する必要がある。

大切なのは想像力

ぼくらの生きてる時代は、分業による効率化が最初から当たり前だったので、どうしても販売する人と製造する人が理解し合うことは難しくなってしまった。人は自分に都合のよい言説しか見ないから、「技術が分からない上司」「経営が分からない技術者」は、これからもしばらくは存在し続けるだろう。でも、志のある人はぜひ自分の担当してない役割についても学んで欲しい。自分が軽視している分野の大変さ・面白さを学べば、今まで感じていた怒りや不満が自分の想像力のなさが原因だったことに気づくはずだ。

Tags:   ,
Categories:   その他
Actions:   Permalink | Comments (17) | Comment RSSRSS comment feed

Cassandraemon 1.0.6をリリースしました

Friday, 23 December 2011 21:01 by sabro

0.8.7をリリースしたときに1.0はしばらく先になりますと書いたのですが、Cassandra1.0はThrift APIのインターフェースにほとんど変更がなかったことと、メンバーの@kojiishiさんが頑張って新機能を作ってくれたこともあって、早くもリリースすることになりました( ̄∇  ̄ )

Cassandraemon - Download: Cassandraemon 1.0.6

オブジェクトマッピングの高速化

Cassandraemonでは、オブジェクトを登録するとき、1プロパティを1カラムに格納するのですが、これまではリフレクションを使っていました。しかし、これでは遅いのでReflection.Emitで動的に変換用のアセンブリを作る方針に変更。パフォーマンスが大幅にアップしました。他にも、値型をByte配列に変換するロジックなどにも手を入れて、細かな高速化を行っています。

Serialize方法をカスタム可能に

オブジェクトをプロパティごとにシリアライズして格納する際、たとえば特定のプロパティを格納しないなどのカスタマイズが可能になりました。

// IgnoreDataMemberAttributeがついていないプロパティを取得
var properties = type.GetProperties()
     .Where(p => !p.GetCustomAttributes(
         typeof(IgnoreDataMemberAttribute), true).Any());

// Reflection.Emitを内部で使用するCompiledCassandraSerializerFactoryを使う
var factory = CompiledCassandraSerializerFactory.Default;

// 型とシリアライズするプロパティを渡してシリアライザを作る
var serializer = factory.CreateSerializer(type, properties);

// シリアライザをセット
factory.SetSerializer(type, serializer);

より詳しくは、公式のドキュメントをお読みください。

さて、次回のリリースは本当に先になるはず。気長にお待ちください( ̄□  ̄ ||

Tags:   , , , ,
Categories:   NoSQL
Actions:   Permalink | Comments (4) | Comment RSSRSS comment feed

Cassandraemon0.8.7をリリースしました

Saturday, 3 December 2011 20:44 by sabro

Cassandraemonの初の0.8系対応バージョンをリリースしました。

Cassandraemon - Download: Cassandraemon 0.8.7

Thrift APIが0.8.7バージョンのものを使っているからこんなバージョンになってますが、実質的にCassandra0.8に対応する初のリリースです。新機能は、New Feature - ver 0.8に書いてありますが、英語なので、簡単に日本語で説明しときます。

CQL

Cassandra0.8のウリであるCQLに対応しました。

using(var context = new CassandraContext("localhost", 9160, "Keyspace1"))
{
	// insert
	string insertCql = "insert into ColumnFamily1 (KEY, name1, name2) values ('key1', 'value1', 'value2')"; 
	CqlResult insertResult = context.ExecuteCqlQuery(insertCql);
	
	// get count
	string countCql = "select count(*) from ColumnFamily1 where KEY = 'key1'";
	CqlResult countResult = context.ExecuteCqlQuery(countCql);
	Console.WriteLine(countResult.Num);	// 2
	
	// get data
	string retrieveCql = "select * from ColumnFamily1 where KEY = 'key1'";
	CqlResult retrieveResult = context.ExecuteCqlQuery(retrieveCql);
	
	var dictionary = retrieveResult.ToFlatDictionary<string, string>();
	dictionary.ToList().ForEach(kv => Console.WriteLine(kv.Key + " = " + kv.Value));
	// name1 = value1
	// name2 = value2
}

CQLの結果は、Thriftで生成したコードで定義されているCqlResultで受け取るのですが、そのままだと扱いにくいので、Object、List、Dictionaryに変換できる拡張メソッドを用意してあります。

ToCassandraEntiry ()
ToFlatNameList<T> ()
ToFlatValueList<T> ()
ToFlatDictionary<TKey, TValue> ()
ToFlatValueKeyDictionary<TKey, TValue> ()
ToNameListDictionary<TKey, TListItem> ()
ToValueListDictionary<TKey, TListItem> ()
ToObjectList<T> ()
ToObjectDictionary<TKey, TValue> ()

Counter

Cassandra0.8の、もうひとつのウリであるCounterです。普通のColumnと同様の感覚で使えます。

// insert 
var cc1 = new CounterColumn().SetNameValue("one", 1);
var cc2 = new CounterColumn().SetNameValue("two", 2);
var cc3 = new CounterColumn().SetNameValue("three", 3);

context.InsertOnSubmit("CounterColumnFamily1", "key1", new[]{cc1, cc2, cc3});
context.SubmitChanges();


// get data
var query = from x in context.CounterColumnList	// <- attention "CounterColumnList"
	    where x.ColumnFamily == "CounterColumnFamily1" &&
		  x.Key == "key1"
	    select x.ToFlatDictionary<string, long>();

query.First()
     .ToList()
     .ForEach(kv => Console.WriteLine(kv.Key + " = " + kv.Value));
// one = 1
// three = 3
// two = 2

Eventを追加

Eventをいくつか追加しました。サーバに接続したタイミング、切断したタイミングなどで処理を実行できます。

ConnectionPool.Connected += (sender, e) => Console.WriteLine("Connected");
ConnectionPool.ConnectionFailed += (sender, e) => Console.WriteLine("ConnectionFailed");

CassandraContext.Created += (sender, e) => Console.WriteLine("Created");

using(var context = new CassandraContext("localhost", 9160, "Keyspace1"))
{
	context.Executed += (sender, e) => Console.WriteLine("Executed");
	context.Disposed += (sender, e) => Console.WriteLine("Disposed");
	
	var column = new Column().SetNameValue("name1", "value1"); 
	context.InsertOnSubmit("ColumnFamily1", "event", column);
	context.SubmitChanges();
	
	Console.WriteLine("Submitted");
}
// Connected
// Created
// Executed
// Submitted
// Disposed

新しいInsert API

Insertするとき、今まではCassandraEntityオブジェクトを作成しないといけなかったのですが、ColumnFamily、Keyを別途指定できるメソッドを用意しました。いちいちCassandraEntityオブジェクトを作らなくても、Column、SuperColumnなどを直接登録できます。

using(var context = new CassandraContext("localhost", 9160, "Keyspace1"))
{
	// old version
	context.Column.InsertOnSubmit(cassandraEntity);
	context.SuperColumn.InsertOnSubmit(cassandraEntity);
	context.ColumnList.InsertOnSubmit(cassandraEntity);
	context.SuperColumnList.InsertOnSubmit(cassandraEntity);

	// new version
	context.InsertOnSubmit( "ColumnFamily1", "key1", column );
	context.InsertOnSubmit( "ColumnFamily2", "key2", superColumn );
	context.InsertOnSubmit( "ColumnFamily3", "key3", columnList );
	context.InsertOnSubmit( "ColumnFamily4", "key4", superColumnList );
}

CassandraConnectionConfig

設定項目が増えてきたので、CassandraConnectionConfigにまとめました。CassandraConnectionConfigBuildeクラスを使って生成できます。

var builder = new CassandraConnectionConfigBuilder
{
	Hosts = new [] { "localhost" }
	Port = 9160,
	ConsistencyLevel = ConsistencyLevel.QUORUM,
	Timeout = TimeSpan.FromSeconds(100),
};
var config = new CassandraConnectionConfig(builder);
using (var ctx = new CassandraContext(config)) { ... }

設定項目の一覧です

Name Description Default Value
Hosts 接続するホスト string[] { "localhost" }
Port Thriftのポート番号 9160
Keyspace 接続するKeyspace "system"
ConsistencyLevel デフォルトのConsistencyLevel ( 実行中にいつでも再設定できます ) ConsistencyLevel.One
RetryCount 接続エラー時のリトライ数 -1 ( this mean nodecount * 2 )
IsFramed フレーム転送使用 true
Timeout 接続待ちのタイムアウト値 10 seconds
MinPoolCountPerHost プールするコネクションの最小値 2
MaxPoolCountPerHost プールするコネクションの最大値 int.MaxValue
Node Node取得の方式 empty string

ConnectionPoolの修正

コネクションプーリングが不安定だったのですが、地道にバグを取り、テストコードも追加して、安定性が向上しました。

今回のリリースでは、新たにメンバーに加わった@kojiishiさんに、コネクションプーリングを中心に色々手伝って頂きました。さて、やっと0.8系をリリースできましたが、セカンドライフ向けWebサービスの開発が忙しいので、1.0系はまだ少し先になりそうな感じです( ̄□  ̄ ||

Tags:   , , , ,
Categories:   NoSQL
Actions:   Permalink | Comments (0) | Comment RSSRSS comment feed

セカンドライフ向けクエスト作成サービス「クエストマイスター」をリリースしました

Saturday, 6 August 2011 20:29 by sabro

久々の更新です。

今だにセカンドライフで活動しているのですが、今回、セカンドライフ向けのクエスト作成サービスを作ったので紹介させていただきます。

クエストマイスター
http://questmeister.com/

QuestMeister

クエスト作成

クエストマイスターは、Web上でクエストの情報を入力して、インワールドでミスティックストーンというオブジェクトを設置するだけでクエストの作成ができます。全くスキルが必要ないので誰でもクエストを作成でき、公開してわずか数日ですが、すでにクエストを色々作っていただいてます。

クエストプレイ

プレイする場合は、ミスティックストーンを探しだして、特定のキーワードをチャットするなどしてクリア条件をみたす必要があります。クリア条件は、セカンドライフのLSLスクリプトでプログラム的に設定可能なので拡張性が大きく、工夫次第で面白いものも作れるようになってます。

世間ではセカンドライフの評価は相変わらず低いですが、Webサービスと連携することで大きく可能性は広がると思いますよ。みなさんは、どう思われますか( ̄∇  ̄ )

Tags:   , ,
Categories:   Second Life
Actions:   Permalink | Comments (15) | Comment RSSRSS comment feed

Cassandraemon初の0.7系リリース

Wednesday, 13 April 2011 04:34 by sabro

Cassandraemonの初の0.7系対応バージョンをリリースしました。

Cassandraemon - Download: Cassandraemon 0.7.4

バージョンが0.7.4になってますが、Thrift APIが0.7.4バージョンのものを使っているからであって、実質的にCassandra0.7に対応する初のリリースです。新機能は、New Feature - ver 0.7に書いてありますが、英語なので、簡単に日本語で説明しときます。

New Link Style

Cassandraのカラム名はByte配列であるため、Cassandraemon0.6では、比較の際、ToCassandraByte関数を呼んだり、GreaterThanOrEqual関数を呼んだりする必要がありました。0.7ではCassandraBinaryという、各種演算子をオーバーロードしたByte配列のラッパークラスを作成することで、LINQをシンプルに書けるようにしました。

// ver 0.6
from x in context.ColumnList
where x.ColumnFamily == "Product" &&
      x.Key == "key1" &&
      x.SuperColumn == "sc1".ToCassandraByte() &&
      x.Column.GreaterThanOrEqual(1)
select x;

// ver 0.7
from x in context.ColumnList
where x.ColumnFamily == "Product" &&
      x.Key == "key1" &&
      x.SuperColumn == "sc1" &&
      x.Column >= 1
select x;

Secondary Index

Cassandra0.7の目玉機能、Secondary Indexに対応しました。Where句に以下のように指定することで、事前に作られたインデックスを使って値を取得できます。

from x in context.ColumnList
where x.ColumnFamily == "Product" &&
      x.Index["ColumnName1"] == "col1" &&
      x.Index["ColumnName2"] >= 1 &&
      x.Index["ColumnName3"] < DateTime.Now &&
      x.Column.In("ColumnName1", "ColumnName2")
select x;

Live Schema Update

Live Schema Updateに対応しました。といっても、ThriftのApiをラップしたものを、CassandraContextクラスに用意しただけです・・・。

class CassandraContext
{
	public string SystemAddKeyspace(KsDef ksDef)
	public string SystemUpdateKeyspace(KsDef ksDef)
	public string SystemDropKeyspace(string keyspace)
	public string SystemAddColumnFamily(CfDef cfDef)
	public string SystemUpdateColumnFamily(CfDef cfDef)
	public string SystemDropColumnFamily(string columnFamily)
	public void Truncate(string columnFamily)
}

TTLに対応

カラムの生存時間を指定するTTLに対応しました。といっても、ウチが何かしたわけじゃなくて、ThriftAPIのColumnクラスにTTLプロパティが追加されただけです。一応、List<Column>クラスに、全てのリスト内のColumnに対してTTLをセットする拡張メソッドを追加したりはしてます。

multiget_coutに対応

Keyを複数指定して、CountColumn<TKey>メソッドを呼ぶことで、複数行のCountを一気に取ってこれます。multiget_count関数はThriftApiに用意されているんですが、なぜか今のところ公式のドキュメントに記載がないみたいです。

var query = from x in context.ColumnList
            where x.ColumnFamily == "Product" &&
                  x.Key.In("key1", "key2") &&
                  x.Column >= 1
            select x;

Dictionary<string, int> d = query.CountColumn<string>();

さて、やっと0.7系をリリースできましたが、Cassandraemonは、0.8が出るまでしばらく沈黙が続きそうな感じです( ̄□  ̄ ||

Tags:   , , , ,
Categories:   NoSQL
Actions:   Permalink | Comments (15) | Comment RSSRSS comment feed

Cassandra0.6から0.7への移行

Tuesday, 8 March 2011 07:01 by sabro

Cassandra0.6から0.7への移行方法書いてみます。Cassandraパッケージ内の文書に書いてあるやつほぼそのままだけど。

ちなみに、今回移行するのは0.7.3。0.7.1と0.7.2はブルームフィルターの圧縮にバグがあるらしくて、0.7.3でデータを取り込む前に「nodetool scrub」を実行しないとダメっぽいですけど、0.6系からならこの手順はいらないらしいので今回は飛ばします

追記:ちょっと勘違いしてたかも、0.6系で動かしてたやつに対して実行しないとダメぽいです

  1. 0.6のすべてのノードで「bin/nodetool drain」を実行。これはノード上の全てのmemtablesをフラッシュして、書き込み禁止にする命令です。読み込みは許可されます。
  2. ログに、"Node is drained"と表示されたら、Cassandraのプロセスを止めます。
  3. 0.7のディレクトリに移動し、「bin/config-converter oldfile newfile」で、storage-conf.xmlをcassandra.yamlにコンバートします。ただ、0.6のほぼ弄ってない設定をコンバートしても、0.7にデフォルトで付いてくるyamlと結構違う部分があったので、コンバートしたものからKeySpaceの設定だけコピーすることにしました。
  4. KeySpace、ColumnFamilyの名前が'^\w+'の正規表現に一致しない場合は名前を変更します
  5. データを0.7のディレクトリへコピー
  6. 0.7でCassandraを起動
  7. 「bin/schematool <host> <jmxport> import」と実行することで、yamlの設定を読み込む

 

以上です( ̄∇  ̄ )

Categories:   NoSQL
Actions:   Permalink | Comments (14) | Comment RSSRSS comment feed

コピーコストゼロ時代のビジネスモデル

Sunday, 24 October 2010 10:13 by sabro

電子書籍も借り貸しできますー米Amazon【湯川】

Amazonの電子書籍ストアで購入した電子書籍を最長14日間は、友人の電子書籍リーダー機「kindle」や、iPhone、iPadなど向けの kindleアプリ上でも読めるようになるという。ただし貸出中は、自分のkindleでは貸出中の電子書籍は読めない状態になる。

ついに、電子書籍も貸し借り出来る時代になったようだ。だが、これはデジタルへの完全な移行ではない。電子書籍を貸すと、貸した側はその間、書籍が読めなくなるらしいが、これは本来なくてもいい制限だ。

デジタルデータは複製コストゼロであり、コピーしたものを友人の電子書籍リーダーへ送ってしまえば、自分のデータは残っているので読めるはずである。というか、この貸し借り機能自体、コピーしたものを送って、貸し手のリーダーはデータが残っているにも関わらず、ソフト的に閲覧できないような制限を掛けているだけなのだろう。

なぜそのようなメンドクサイ制限をワザワザかけるのか?それは、今が紙のデータから、デジタルデータへ移行する過渡期だからだ。まだまだ紙の本が主流であり、顧客側にも紙を使っていた習慣が残っているので、顧客側も受け入れることができるのである。

しかし、この制限がなくなるのも時間の問題であろう。生まれて、ものごころがついた時から、デジタルの書籍しかなかった世代は、デジタルの本を貸したら自分が読めなくなってしまうことに疑問を持つことになる。国民の大多数がそうなれば、制度も変わっていかざるをえない。

デジタルデータが当たり前になった時代は、買った書籍をみんなでシェアできないことにも疑問を持つかもしれない。コピーのコストがかからないなら、より多くの人が手に入れた方が、みんながハッピーになるじゃん!という考え方は、書籍の制作者を除いては、納得できてしまう。技術的に可能なことを制度でムリヤリ封じ込めるようなやり方は、長くは続かない。つまり・・・。

デジタルデータは遅かれ早かれ自由にコピーする時代が来る。それが必然である。

しかし、それでは制作者は食べていけない。制作者への還元がないのであれば、長く創作をつづけるモチベーションも湧かず、業界の先細りを招くだろう。そこで、本当にコピーがフリーになっても成り立つビジネスモデルを考えてみることにする。

まず、いろんなところで言われているとおり、編集、流通は基本的にはなくなるだろうと思う。特に存続させる利点もないと思うので、ここはなくなるしかないだろう。問題は実際にものを作っている制作者がどう利益を得るかだ。

コピーがフリーになると、結局は作品を1度世に出してしまった時点で、もうお金を得るチャンスはない。購入者が他の人にコピーさせてしまえば、作品は急激にシェアされていく。もちろんフリーでだ。こうなってしまっては、もうアウトである。

現在のモデル

ここで発想を転換してみよう。1度でも世に出すとアウトなら、出さなければいいのである。読み手からの要望が高まり、ある一定のお金が集まるまでは出さないようにするのだ。

将来のモデル

制作者の作品が読みたいユーザは、電子マネーを制作者に送り、次回作を出してくださいとお願いする。そのとき、「こんな作品が読みたいです」みたいな意見が送れてもいいかもしれない。世の中からのニーズが高まり、ある一定の金額が集まった時点で、制作者は初めて、ものを作り始める。ユーザからの意見を反映したり、ときにはあえて無視したりして作品ができたら、ダウンロード可能に設定する。ダウンロードされた作品はガンガン「シェア」されるが、お金はすでにもらった後なので、問題はない。

細かい問題はあるだろうが、上記のようなシステムをWebサイトとして作れば、うまく回りそうな気がする。

有名でない人はそもそもお金が集まらないのではないかという反論もあるだろう。その場合は、ある程度有名になるまでは、自由にダウンロードさせるという手が考えられる。ある意味「下積み」期間だ。今、デビュー目指して作品を書いてる人は、出版社の担当編集に作品を評価してもらっては没をくらい、作品を書いてもお金がもらえない生活をしているはずである。その評価する人が、担当編集から一般ユーザに変わったと思えばよい。むしろエンドユーザに評価してもらった方が、制作者としても納得がいくのではないだろうか。

とまあ、こういう妄想をしてみたわけだが、制作者がお金を要求した時点で人が離れて、無料公開している人の方へ流れていったりしそうな気もする。本当に成り立つかどうかは各自の判断におまかせである。

ここから追記。このモデルの、さらなる利点を思いついたので書いておく。

ずばり、その利点は「個人が好きなだけ支払ができること」だ。制作者が指定した金額に達すれば次回作が作ってもらえるわけだが、支払額に制限がないことがミソである。

現代は趣味・嗜好の多様化により、すべての国民が同じ作品を楽しむということが起きにくくなってしまった。つまり、より少ない顧客からなんとか食べていけるだけのお金を頂いていかないとならないわけだ。これはかなり難しいことのように思われるが、個人の支払額を固定しないことで、うまくいく可能性がある。

実は、今までの商品で個人支払額が均一だったのは、流通小売の事情だったりする。販売員は、買いに来た客がそのコンテンツをどれくらい欲しいのか知りようがないので、メチャクチャ欲しい客だから高い料金を取ったり、たいしていらない客に安値で売りますよというような手法を取ることができなかった。その結果、そんなに欲しくないかもというお客に対して、すごく欲しい客と同じ料金を要求することになった。

支払額可変

しかし、本来コンテンツの価値は相対的なものであるはずである。あるコンテンツはAさんに取っては、生活費を削ってでも欲しいものだったとしても、Bさんにとっては、定価の2割の値段なら読んでもよいくらいの価値かもしれない。

支払額可変

払う額を各自で決めることにすると、制作者のファンで次回作がメチャクチャ読みたいAさんから現在の定価の何倍もの支払いをしてもらえる可能性がある。全国民が楽しむような作品でなくても、少数のコアなファンを獲得すれば制作者が食べていけるようになるのだ。

今、コアなゲーマーでなくても遊べるソーシャルゲームや、人間なら必ず持っている性欲の部分に重点を置いたキャラ萌えアニメみたいなコンテンツが世の中に溢れている。それはなるべく多くの顧客に興味を持ってもらうためだ。しかし、それらはあまりにもユーザ層を広げることに気を取られすぎ、本当にコンテンツが好きなコアな層が楽しめる「エッジ」を削ぎ落としてしまった。その原因は、すべての客の支払単価が同じことにある。

支払額を固定しなければ、高額を払ってくれるコアなファンを獲得するため「エッジ」の効いた作品を輩出する制作者も増えるだろう。ゲーム性は低いがマーケティング力で売ってるソーシャルゲームに、プロが魂を込めて作った一般受けはしないが面白いゲームが勝つ。そういうクリエイター冥利につきる世界が来る可能性があるのではないだろうか。

GREE、モバゲーが提供しているものにある価値

Wednesday, 15 September 2010 07:26 by sabro

モバゲーをけなす30代男性を見て思うこと
http://blogs.itmedia.co.jp/fukuyuki/2010/09/30-d031.html

このエントリーに対する批判がすごいことになっている。ただ、批判コメントがどれも感情的で、モバゲー、GREEはダメな会社であるという結論ありきなものが多いと感じる。

なぜ感情的に批判してしまうのか

コメントやブコメでの批判は明らかに的はずれなものが多い。

批判1
「大人は新しいものを全て否定していない、TwitterやiPhone等いいものは理解している」

ブログ主は、若者に向けて造られたコンテンツのことを語っているのに、明らかに小、中学生に向けたものではないものを例にあげて反論している。

批判2
「モバゲー、GREEには新しい要素が何もない」

ソーシャルにつながれるゲームは高スペックのPCや、ネットに繋がったXBoxなど、小中学生が簡単には手に入れられない環境でしかプレイ出来なかった。小中学生が8割型もってる機器で、全国的にソーシャルにつながれるゲームが出たのは初のこと。若者の大半にとっては、まったく新しいもの。

どうも、GREE、モバゲーはとにかくダメという結論ありきで感情的に書いてあるものがほとんどだった。なぜ感情的に批判してしまったのか。

たぶん、2000円の折れる釣竿とか、どうみても価値のないデジタルデータを、世の中をよくわかってない人を騙して売りつけるやり方が気に食わないとか、そんな理由なんじゃないかと思う。

そのデータには本当に価値がないのか

となりのトトロという映画がある。もう公開から20年以上が経っているが未だにDVDが売れているという、すさまじい映画である。なんでも、子供のころにトトロを見て育った世代が、大人になって、自分の子供に見せるために買っているそうだ。

トトロ

説明不要だと思うが、映画に出てくるトトロは、子供にしか見えないという設定。子供の純粋な心でしか見れないもの、分からないものがあるという主題なのだと思う。大人には価値が分からなくても、子供にとって大切なものというのはあるものだ。私は子供のころビックリマンシールを集めていたが、父親に無理やり焼却処分されてしまったことがあり、トラウマになっている。僕にとっては、大切だったのに分かってもらえなかった。

トトロを子供に買ってあげる大人は、今の子供の純真な気持ちを大切にしてほしいと思って買うのだと思う。しかし、子どもが純真な気持ちで価値を見出した釣りゲーの魚たちの価値は認めない。子供社会の中では、すごく価値があるのかもしれないのに・・・。それとも、モバゲー、GREEを批判する人は、トトロにも現実を見ろと批判するのだろうか。

もうひとつ、作品を挙げよう。

電脳コイル

上記画像は、電脳コイル24話「メガネを捨てる子供たち」のヒトコマである。電脳メガネをかけると見える「デンスケ」という犬を失って、失意の中にいる主人公ヤサコに対し、母親は「触れるもの、温かいものが、信じられるものなの」と悟し、現実の生きている世界に戻ってきなさいと説得する。これは、大人の視点から見れば正しい論理である。大人になって、実際の社会を動かす立場になると、しょせん仮想のデータというのは偽物であり、それよりは実際の現実こそがすべてとなるのは当たり前の話だ。

しかし、その当たり前が子供にとっては当たり前ではない。この後、ヤサコはデンスケがたとえデジタルデータだったとしても、自分が感じているこの気持ちは本物と悟り行動を起こす。大人と違い、実際の社会を担っていない子供には、また違った価値観がある。たかが一ゲーム会社が作ったデジタルデータであったとしても、それが、実社会ではなんの価値もないものであったとしても、そのデータが会社の儲けのために造られたものであったとしても、それは、子供の社会ではとても大事なモノなのかもしれない。

若者、情弱が騙されている?

GREE、モバゲーが若者や、情弱を騙しているとの指摘がある。若者が大きくなり、GREE、モバゲーのビジネスモデルに気づいたとき騙されたと思って恨んだり、怒ったりするだろうか?

私は小さい頃にビックリマンを集めていたことはさっき話したが、なぜかロッテに対して怨みや、怒りの感情はない。それは多分、あの頃の自分にとっては価値のあるものを提供してくれていたからだ。大人が、自分にとって実感の湧かない実社会のことを押し付けてくる中、本当に当時の自分がほしいものを提供してくれていた。

もちろん、大人になった今の自分は、実社会に役立つことの方が大切だと分かるが、それを子供の頃に押し付けられても仕方がない。単に、子供心に欲しいものを抑圧しつつ、実社会に役立つことをやりたいフリをしながら生きていくだけだろう。大人になったら分かることは、大人にならないと分からないのだ。

ソーシャルが提供する価値

まだ働く年代になっていない若者は、自分が社会に貢献するチャンスが少ないので、自分の生きる価値を実感しづらく、そこを友達からの承認で埋めていく必要がある。そこで、GREE、モバゲーのソーシャルの部分が生きてくる。「俺はこんな珍しい魚もってるぞ」「俺はあのゲーム全国◯位だぜ」。しょうもないというかもしれないが、実は子供の生きる支えになっているケースもあるのではないか。

人間は、最終的には、社会に貢献することで自分の生きる価値を見出すべきだろう。だが、3歳児に、おまえは明日から社会に貢献して生きるのだといっても、それはムリという話だ。成長には適切な段階がある。20、30にもなって、仮想のデータでしか自分の価値を見いだせないのもどうかと思うが、小中学生の場合は、仕方ない部分もあるのではないだろうか。

まとめ

実際に遊んでいる若者がいいと言ってるんだから、子供とっては価値はあるのだろう。それを大人が大人の感覚、大人の理論で批判してもしょうがない。あれだけ受け入れられてるということは、それだけ子供にとって欲しい物をGREE、モバゲーが真剣に考えているということなのだ。

GREEには本当に志はないのか

Friday, 3 September 2010 17:35 by sabro

「パチンコのような単純さ」で1000万ユーザー獲得 グリー田中社長が語るヒットの極意 (1/2)
http://www.itmedia.co.jp/news/articles/1009/02/news056.html

ブコメは非難の嵐だけど僕は田中社長には志を感じる。ではなぜユーザの見栄をついて利益をあげるようなサービスをグリーは、やっているのか。

Mixiより先にSNSを始めるなど、田中社長は元々時代の先端を行くようなサービスを作っていた。そして、モバイルの可能性・ポテンシャルの大きさに目をつけてガラケー向けのサービスを始める。この時点では、田中社長はガラケーユーザの傾向などを深くまで把握してなかったのではないだろうか。

今でこそスマートフォンがあるが、当時ネットのヘビーユーザーはガラケーよりPCでネットにアクセスしていたと記憶している。ガラケーはネットに詳しくないライトユーザーやPCを買えない学生などがほとんどを占めていたはず。

しかし、その層には、技術的にイノベーティブなサービスは届かない、凄さが理解されない。もし、GREEがガラケーでそのようなサービスを提供していたら、今のような成功はしていないだろうし、ユーザも少ないマイナーサービスとして、ヘビーユーザーの話題になることもなかったのではないか。

技術的に優れたサービスを正当に評価するには、時にある程度のネット知識が要求される。ガラケーのユーザー層を把握した田中社長は、自己満足な技術志向サービスをやめ、ユーザーに要望されるものを提供しようと思ったのではないか、というのが自分の見解である。

さて、良いサービスは、イノベーティブなものだけでなく、人々の生活を豊かにするという方向性のものもある。人の見栄をつくのではなく、人を楽しませるようなものは出来なかったのか。

これも、そもそも、生活を豊かにしたい、人生楽しみたいというユーザーがいなかったからというのが自分の見解。そんなまさか、人生楽しみたくない人なんかいないだって?正確に言うと、人生を楽しむよりも優先するものがあったといったほうがいいかもしれない。

欲望には段階があるとか誰かが言っていたような気がする。生理欲求、安全欲求とか低い次元の欲求が満たされてやっと、高次の欲求が出てくるらしい。実は、人生を楽しむとか、かなり高次の欲求なんだよね。ガラケーメインユーザの学生で、人生にまったく不安はなく、余裕を持って楽しめてる層がどれだけいるだろう。

人は、自分に生きる価値がないと思うと、とてもじゃないが人生を楽しんでいる余裕はなくなってしまう。親に面倒を見てもらっており、社会に出て人の役に立つという経験をしてない学生は、なかなか自分の価値を認められず、友達からの承認を欲するようになる。大人になって、気楽な1人が好きになった人も、学生の頃は友達欲しいなと思ってたんじゃない?

つまり、ガラケーのユーザーは豊かな人生より友達からの承認を求めていたということ。GREEのソーシャルゲームは、その要求に正面から答えている。学生はしがらみの多いSNSを好み、自由なTwitterに魅力を感じない。GREEが人生の楽しさを提供するようなサービスを始めていたら、どうなってたかはちょっと分からないけど、GREEにとって、そんなに誤った選択をしてきたとは僕は思わない。

まとめると、田中社長には志があるのだが、ポテンシャルに惹かれて始めたケータイ事業では、イノベーティブなもの、人生を豊かにするサービスを提供してもダメだと考えたんじゃないかと。今後、スマートフォン事業が進展すれば、またGREEの違った面も見れるかもしれない。

~ 蛇足 ~

うちが、セカンドライフで提供してるクリエモンというサービスがありますが、これはモロにイノベーティブで人生を楽しくする方向を目指したもの(だと自分は思っている)です。しかし、これを理解してくれる人は、セカンドライフにはなかなかいません。

テキストインターネットを使いこなすネットのヘビーユーザーほど、セカンドライフは嫌う傾向にあります。実際、大手広告代理店とかにつられてきたIT音痴のオッサンとかがいっぱいいたりします。

しかも、個人的には、しがらみの多い仮想世界は、ガラケーを使うような若いユーザに向いてると感じています(今は18歳以上じゃないと入れないけど)。

どうも、立場的に田中社長と被るようなものを感じたので、今回のエントリを書いたのでした。さて、うちはどういう方向を目指していけばいいのやら。

Tags:  
Categories:   その他
Actions:   Permalink | Comments (47) | Comment RSSRSS comment feed