B-Teck!

お仕事からゲームまで幅広く

【Java/Kotlin】URI Template(RFC6570)の仕様に則ってURL文字列に変数をセットする

"http://example.com/name/{name}/age/{age}"のような文字列に対して変数を割り当てたいとき、 javax.ws.rs.core.UriBuilderが利用できる。

URI文字列がqueryも含む場合は、 UriBuilder.fromUri() を利用すると良い。

  • Javaの場合
import javax.ws.rs.core.UriBuilder;
import java.util.HashMap;
import java.util.Map;

class Demo {
    public static void main(String[] args) {
        String template = "http://example.com/name/{name}/age/{age}";

        // mapで変数に対応するkey-valueを与えると置換できる
        // UriBuilder.buildFromMap()
        Map<String, String> parameters = new HashMap<>();
        parameters.put("name","Bob");
        parameters.put("age","17");

        String bob = UriBuilder.fromPath(template)
                .buildFromMap(parameters)
                .toASCIIString();
        
        // http://example.com/name/Bob/age/17
        System.out.println(bob);
  
        // 変数の順番が固定であれば、手前から順番に置換することもできる
        // UriBuilder.build()
        String alice = UriBuilder
                .fromPath(template)
                .build("Alice","15")
                .toASCIIString();

        // http://example.com/name/Alice/age/15
        System.out.println(alice);
    }
}
  • Kotlinの場合
import javax.ws.rs.core.UriBuilder

fun main() {
    val template = "http://example.com/name/{name}/age/{age}"

    // mapで変数に対応するkey-valueを与えると置換できる
    // UriBuilder.buildFromMap()
    val parameters = mapOf(
            "name" to "Bob",
            "age" to "17"
    )

    val bob = UriBuilder.fromPath(template)
            .buildFromMap(parameters)
            .toASCIIString()

    // http://example.com/name/Bob/age/17
    println(bob)

    // 変数の順番が固定であれば、手前から順番に置換することもできる
    // UriBuilder.build()
    val alice = UriBuilder.fromPath(template)
            .build("Alice", "15")
            .toASCIIString()

    // http://example.com/name/Alice/age/15
    println(alice)
}

参考 : how to use URI templates to change path parameters in a URL in java - Stack Overflow

【本】ジョブ理論を読んだ

ジョブ理論 イノベーションを予測可能にする消費のメカニズム (ビジネスリーダー1万人が選ぶベストビジネス書トップポイント大賞第2位! ハーパーコリンズ・ノンフィクション)

ジョブ理論 イノベーションを予測可能にする消費のメカニズム (ビジネスリーダー1万人が選ぶベストビジネス書トップポイント大賞第2位! ハーパーコリンズ・ノンフィクション)

  • 作者: クレイトン M クリステンセン,タディホール,カレンディロン,デイビッド S ダンカン,依田光江
  • 出版社/メーカー: ハーパーコリンズ・ ジャパン
  • 発売日: 2017/08/01
  • メディア: 単行本
  • この商品を含むブログ (6件) を見る

以下読書メモ兼自分用要約

ジョブ理論とは?

  • 従来のイノベーションに対する理論、「破壊的イノベーション」は、
    既存のプロダクトをよりシンプルで低コストなもので駆逐する概念である。
  • 新たなイノベーションを生み出すには別の視点がなければならない。
  • 顧客がなぜ商品を選び取るのかを、その行動や原因から導き出し、
    適切に解決するプロダクトを提供するのがジョブ理論

ジョブの概念

  • 顧客がプロダクトを選択するとき、必ず解決したい「何か」が存在する。
    これを「ジョブ」と定義する。
  • ジョブとは、解決したい「何か」と、それを取り巻く状況を複合した概念である。
    • 最終的に解決したい目標
    • 目標を達成することを阻む障害や状況
    • 消極的な解決策(無消費や間に合わせの解決策)
  • 顧客が真に求めているのは、ジョブを適切に解決するプロダクトであり、
    最大公約数的にすべてを解決しようと試みるプロダクトではない。

ジョブの見つけ方

  • 解決するべきジョブのありか
    • 日常生活の中での不便
    • やりたくない、面倒で、手を付けていない物事
    • 物事を成し遂げるときの間に合わせの解決策
  • ジョブの解決にはプロダクトの機能面だけでなく、社会的側面、感情的側面が影響する
    • 社会的側面とは、ジョブを解決することで得られる、生活や家庭に対して与える影響
    • 感情的側面とは、社会的側面の改善によって引き起こされる感情の好転や改善
  • 顧客が自分の要望を正確に伝えることはない
    • 本人が感じているよりも、その行動に至るまでの決定要因は多い
    • プロダクトを利用し始めるとき、利用をやめるときには重要な知見が含まれている
      • 以前の解決策をやめたのはなぜか(何もしていなかったことを含む)
      • プロダクトの利用をやめる原因は?
    • 顧客の購買行動についてのデータは購入自体のデータであり、
      そのプロダクトの実際の利用シーンを直接反映していない
  • なぜそのジョブの解決に自分のプロダクトが利用されないのか
    • プロダクトを利用しない層(無消費者)はなぜそのプロダクトを利用しないのか
    • 利用している顧客と何が異なっているのか

ジョブを解決するためのプロダクト

  • 顧客のジョブのディティールを把握する
    • 顧客が求める目的・目標を、機能的・感情的・社会的側面で分解
    • ジョブを解決するに当たって支払っても良い代償(金銭・時間等…)
    • 現在存在するその他の解決策(競合)
    • プロダクトを利用しはじめることを妨げている原因
  • 適切にジョブを解決するプロダクトは一つのサービスの形となる
    • 顧客が真に解決したいジョブを理解する
    • ジョブを解決するに際しての障害を最小化する
    • その他の選択肢からの移行を容易にする

ジョブに対して選ばれ続ける組織であるために

  • 一度プロダクトをリリースすると、売上や目に見える成果を見てしまいがちになり、
    ジョブへの注視が疎かになりやすい
    • 得られるデータが、ジョブの解決という視点に立った情報かを常に意識する必要がある
  • ジョブの解決に最適化された組織は、より適切な体験を顧客に提供することができる
    • ジョブを中心に、その達成のために組織を分割・結合する
    • 一貫性のある体験を提供する
  • ジョブを正しく定義し、組織の中に浸透させる
    • ジョブを正しく理解した組織は、それぞれがジョブの解決のために正しい選択肢を取る
    • 解決するべきジョブを共有できていれば、モチベーションが高まる
    • ジョブの解決に対して、必要に応じたリソースを振り分けることができる

感想

全編に渡って語られる「ジョブ」という単位でプロダクトを見る考え方は非常に参考になる。
我々がプロダクトを選択する際に必ず見ているはずなのに、見逃してしまう盲点をついている。
ただ、文意が同じ内容を何度も何度も繰り返し語るため、非常に冗長に感じてしまった。
この点が難点であるものの、挙げられる様々な事例、思考は示唆に富んでおり、
読んで良かったと感じた。

【雑記】競技プログラミングを始めたら楽しかったのでおすすめします

ふとしたきっかけで会社で競技プログラミングの本を見せて貰う機会があり、
内容が面白かったので自分でも購入して読んだり、
解いているうちにズブズブとハマって行ってしまいました。
せっかくなので読者の方にもおすすめしてみたいと思います。

競技プログラミングって何?

プログラミングを使って、出題された問題を解いていく競技です!
上級者の方でもうなるような問題もありますが、
プログラミング自体の初心者でも気軽に解いていける問題もたくさんあります!

例えば、こんな問題もあります。

119という文字列が入力されたときに991が出力されるように、9と1を置き換えてください。

このくらいなら解けそうだと感じませんか?

何が楽しいの?

これは一度触ってみてもらったほうがわかりやすいと思うんですが、
競技プログラミングの問題を解くのは、パズルを解くような楽しさがあります。
解き方を考えて、答えが出たときの楽しさが好きな人には特におすすめですね。

また、コンテストに参加したりすると、順位がついたり、レートがついたり...
自分の技量を客観的に見られること、数値で競い合っていけることも楽しいポイントです。
目標とする人や、ライバルなんかを見つけられるともっと楽しいですね。

なにか役に立つの?

いくつか役に立つと思っているポイントはあるんですけど、
1つ目は「プログラミング学習として始めやすい」ことです。
アプリを作ったり、Webシステムを作ったり…そういうのって結構他の技術や知識が求められて、
純粋にプログラミング初心者の場合なんかは戸惑いやすいです。
競技プログラミングといっても、ifやforみたいな基礎的な部分だけ知っていれば解ける問題があります!
また、実力やスコアが数値として目に見えてくるので、目標も立てやすいです。

2つ目は、「就職の役に立つ」ことです。
最近は、企業の採用活動で競技プログラミングを利用することも多いようです。
私自身、Hacker Rankというサイトの問題を解くというようなWebテストを受けたこともありました。
下記のようなサイトもあるので、これからより注目が高まってくるのでは?

なにから始めればいいの?

おすすめは過去問をいくつかを解いてみることです!
AtCoder は日本語のサイトで、これまでのコンテストの問題が公開されていてとっつきやすいです。
初心者向けの問題集として AtCoder Beginners Selection - AtCoder もあるので、
試してみてはいかがでしょうか?
また、AtCoderではほぼ毎週土曜日、初心者でも気軽に参加できる
「AtCoder Beginner Contest(通称ABC)」も開催しています!
私も用事がないときはなるべく参加して勉強しています。

もし本で勉強を始めたいと思う人は、これらの本が有名なのでおすすめです。
説明が充実しており、章立ても初心者向けでわかりやすい

プログラミングコンテスト攻略のためのアルゴリズムとデータ構造

プログラミングコンテスト攻略のためのアルゴリズムとデータ構造

初心者向けの本ではあるものの、解説がやや分かりづらく、中級者を目指したい人向けな印象
最強最速アルゴリズマー養成講座 プログラミングコンテストTopCoder攻略ガイド

最強最速アルゴリズマー養成講座 プログラミングコンテストTopCoder攻略ガイド

完全な初心者には難しい中級者向けの本。これが理解できるようになってきたら競プロの沼に腰まで浸かっていると思う
プログラミングコンテストチャレンジブック [第2版] ?問題解決のアルゴリズム活用力とコーディングテクニックを鍛える?

プログラミングコンテストチャレンジブック [第2版] ?問題解決のアルゴリズム活用力とコーディングテクニックを鍛える?

AtCoderを利用する際の便利ツールなど

  • AtCoder Problems
    AtCoderの問題の解答状況を一覧できます。
    他のユーザーとの比較もできるので、モチベーションアップに利用しよう!
    AtCoder Problems

  • AtCoder Scores
    AtCoderの問題を点数順に並べて解答状況を確認できるサイト。
    AtCoder Scores

  • Comfortable Atcoder
    AtCoderを使いやすくするChrome拡張。入れておくと地味に便利なのでおすすめ。
    Comfortable Atcoder - Chrome Web Store

さいごに

一人でも仲間を増やして一緒に楽しんでいけたらいいなと思って、いろいろ書いてみました。
だいぶ駆け足で書いてしまったので、分かりづらい部分多々あると思いますが、
少しでも興味を持ったらぜひこの世界に足を踏み入れてください!
一緒にスキルアップしましょう!
わからないことがあればコメントやTwitterなど、気軽にご連絡いただければお答えします。