スプラトゥーンのスコア管理サービスを作ってみた
自分用に作ったものだけど、一応アカウント管理つけてサーバ上に置いてあるので、
使ってみたい人はどうぞ。サポートとか一切ありませんが、オープンソースなので、pull requestは歓迎します。GitHub リポジトリはこちら (2時間ぐらいで作ったのでソースコードが汚い。)
2015/09/06 コード整理のため、一旦非公開にしています。
※ときどきサーバが落ちてるかもしれません。
※バグがあったらコメントかGitHubのIssueをくれれば直すかもしれません。
内部的なこと
アカウント登録に使うメールアドレスは、パスワードを忘れたとき用にしか使ってません。
なので、パスワード忘れてもいいや、って人や、忘れることがない人は、
hogehoge@example.comとか好きなアドレスで登録して使ってもらったらいいと思います。
武器やマップは、選択しなくても登録できます。その場合、マップごとの集計とかはされません。
人が増えるようなことがあったら、各マップや各武器ごとの集計とか紹介するかも。
ワークショップ「スタートアップのための新規サービスの作り方」に参加してきた。
概要
5月30日(土)に、株式会社アキュトラスで行われたワークショップ、
「スタートアップのための新規サービスの作り方」に参加してきました。
某大手IT企業に勤めていらっしゃる(と同時に親友である)川鯉氏が、
わざわざ香川まで来て開催してくれました。(Thanks!!!)
非常にためになる内容だったため、内容をまとめておこうと思います。
新規サービスを作る前に
新規サービスを思いつきで作ってしまうと、失敗した時に大きなロスがでます。
場合によっては、そこで試合終了ということにもなりかねません。
出資を受けている場合などは、出資元にも迷惑をかけることになります。
それを防ぐために、まずは課題を明確にし、インタビューによって
課題解決のためのソリューションをしっかりと考えます。
インタビューでは、同じ課題を抱えている人の特徴を考察したりして、
しっかりと情報を集めておきます。ここで集めた情報は、ソリューションを
考えるときなど、いろいろと役に立ちます。
今回のワークショップでは、時間の都合でインタビューについては省略しますとのこと。
インタビューだけで1冊の本になっちゃうぐらい大事なことらしいです。
(インタビューのワークショップは、今度、岡山で開催いただけるかも、とのことでした!)
まずは、課題を決めるために、参加者から課題を募り、列挙しました。
本来は、みんなが課題と思っていることの方がやりやすいのですが、
今回は人数の都合や時間の都合などもあり、仮想顧客を参加者の中から1人選びたく、
集まった課題から1つを決めました。
今回は「女の子とお近づきになれない」という課題に決定されました。笑
カスタマージャーニーマップの作成
次は、カスタマージャーニーマップを作成します。
カスタマージャーニーマップで、課題に対するユーザの行動を分析して、
感情の起伏を確認します。そして、感情が下がっているポイントについて、
さらに詳細な課題を確認していきます。
今回のカスタマージャーニーマップでは、
オンラインゲーム(MMORPG)で、女の子と出会いたいが、
遠方の人が多く、なかなかオフ会が成立しないことが課題とされました。
(オフ会が成立すれば、女の子とお近づきになるきっかけが生まれる!?)
バリュープロポジションキャンバスの作成
次は、バリュープロポジションキャンバスを作ります。
カスタマージャーニーマップから、顧客が嬉しいこと、悲しいこと、顧客の望むものを抽出していきます。
そして、顧客に提供する価値を考えていきます。
顧客に提供する価値がたくさん出てきました。
ここから、1つを選び、それにそって顧客の嬉しさが増す要素、顧客の悲しさが低減される要素を考えていきます。
今回は、「場所をサジェストする」という価値に対し、
「条件をゆずってサジェストできる」←「相手から感謝される」という嬉しさを増幅させる
という感じにまとまりました。
ビジネスモデルキャンバスの作成
9つのブロックに分けて、ビジネス全体を俯瞰するために、
ビジネスモデルキャンバスを作成します。
戦略的にビジネスモデルを考えるためのフレームワークとのこと。
今回、顧客はお金がなくて遠方に行けないユーザ、ってことだったんですが、
ここで「顧客はお金がなくて遠方に行けないのに、そのお金がない顧客からお金をとるの?」という疑問が。
顧客に提供する価値が、「条件をゆずって(場所を)サジェストできる」だったので、
顧客は「オフ会に参加するユーザ」ではないのか、と。
そこで、顧客は「オフ会に参加するユーザ」に変更しました。
利益は、サジェストする場所への交通費実費にマージンを乗せることにしました。
また、有料会員には、サジェストする件数を増やしたりしてはどうか、ということで、
有料会員による収入も追加しました。
ユーザーストーリーマッピングの作成
いよいよ、ユーザーストーリーマッピングの作成です!
時間の都合で、かなりおしていたんですが、なんとか終えることが出来ました。
みんなの集中力もMAXです!!
結構、「〜〜をしてくれる」的なものが出てきていましたが、
そのたびに「それは、ユーザの行動じゃなくて、システムがやってくれることだよね」って指摘を入れました!
MVPもしっかりと意識して、作っていきます。
(MVP=顧客に価値が提供されるかを確かめるための最小限の製品)
そして、なんとか完成しました!
MVPは、最終的に4つの付箋に絞られました。
最後に、川鯉氏が結果を講評してくれました。
もう、くたくたのヘロヘロですが、最高に面白い内容でした。
まとめと感想
これまで、こういう検証を行ったことがなかったのですが、
最後に出てきたアウトプットは、非常に納得のいく内容になっていて、驚きました。
また、今回はビジネスモデル検証でちょっと詰まったのですが、
川鯉氏曰く、あんまりビジネスモデル検証で詰まることは少なく、
今回はエンジニア寄りの人が多かったからかも、とのこと。
いろんな専門家の人が集まれば、もっと柔軟にスムーズに
検証が進んでいったりするのかな、とか。
最後に、わざわざ香川まできてくれた川鯉氏、ありがとうございました!
参加者のみなさまは、おつかれさまでした!!
また次回の開催が楽しみです!
TeamPass 2.1.21 でフォルダの日本語が文字化けする問題
Teampass 2.1.20になってから、長いフォルダ名は、
ツリー上では省略して表示されるようになった。
- items.php 217:222
// resize title if necessary if (strlen($folder->title) > 20) { $fldTitle = substr(str_replace("&", "&", $folder->title), 0, 17)."..."; } else { $fldTitle = str_replace("&", "&", $folder->title); }
この処理が原因で、日本語が中途半端なところで途切れて、文字化けしてしまう。
なので、mb_strlenとmb_substrを使って解決。
// resize title if necessary if (mb_strlen($folder->title) > 15) { $fldTitle = mb_substr(str_replace("&", "&", $folder->title), 0, 12)."..."; } else { $fldTitle = str_replace("&", "&", $folder->title); }
SECCON 2014 オンライン予選 Writeups
友人からお誘いがあったので、参加してきました。
一通りいろんな方のWriteupを見ましたが、
同じような解き方じゃなかったもの+αだけWriteupを書いておきます。
capistrano3 + git で submodule も一緒にデプロイしたい場合
生まれて初めて(?)git submodule を使った気がする。
capistrano3 で submodule を含むリポジトリをデプロイしようとすると、
submodule の内容は空っぽになってました。
capistrano2 だと、
set :git_enable_submodules, 1
これでいけるんだけど、、、と思って調べていたら、task を追加してあげるという方法があるらしい。
以下に、task のコードをそのまま引用。
namespace :git do desc 'Copy repo to releases' task create_release: :'git:update' do on roles(:all) do with fetch(:git_environmental_variables) do within repo_path do execute :git, :clone, '-b', fetch(:branch), '--recursive', '.', release_path end end end end end
これを、lib/capistrano/tasks/git.cap として保存する、と。
試したんだけど、なんかうまくいかない。なんでじゃ!と思って Capfile を見ると
末尾に以下のような記述があった。
# Loads custom tasks from `lib/capistrano/tasks' if you have any defined. Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
拡張子が rake のファイルを読み込むようになってた。。
ということで、lib/capistrano/tasks/git.rake に名前を変更したら、うまくいったというお話。(´・ω・`)