リサイト(RE:Site)は,その場所に行かないと投稿することも投稿を読むことも出来ないSNSです.
インターネットの登場は,「どこでも情報にアクセスできる」時代の幕開けでした.しかし,その便利さと承認欲求に溺れた私達は,TwitterなどのSNSに時間を費やし,心を砕き,目の前にあるものを見失ってしまっています.
私達の提案する「リサイト」は,「実際に行かないと見ることのできない情報」を提供することで,私達と情報の関係を再定義し,現実世界を再び冒険と出会いに溢れたものに変えます.
リサイトは,TwitterやFacebookのように誰もが情報及び現在位置(必須です)を投稿(モニュと呼びます)し,それを閲覧することができるSNSです.しかし,"モニュ"の内容の全てを簡単に得ることは出来ません.
具体的には,半径200m以内の投稿しか読むことは出来ません. 例えば,知り合いがどこかで"モニュ"をした場合,知り合いが"モニュ"をしたということ自体はわかりますが,実際にその場所に行かないとどのような内容が"モニュ"されたのか知ることは出来ません.
また,あらゆる人のモニュを時系列で見ることができる,いわゆるタイムラインも存在しますが,タイムラインに表示されるのも近傍のモニュだけです.
「その場所に行かないと情報にアクセスすることが出来ない」
これは一見,ただのデメリットであるように思えます.しかし,Instagramのストーリーやツイッターのタイムラインなど,情報へのアクセスを制限することがユーザーにとっての便益になる例は数多くあります.得られる情報が多すぎるとユーザーは情報にアクセスしづらいからです.
InstagramのストーリーやTwitterのタイムラインは,情報の拡散を時間的に縛るものであるのに対し,リサイトは情報の拡散を地理的・空間的に縛ります.これまでのSNSに見られなかったこの特徴が,リサイトに以下に述べるような興味深い長所を与えます.
通常のSNSでは,あなたの投稿は他の投稿によって瞬時に見えなくなり,歴史に残るのはごくごく一部の"バズった"投稿だけです.バズることを目的として語調の強い感想をつぶやき続けるアカウントが生まれるのも頷けます.
しかし,通常のSNSでは,膨大な投稿の中に埋もれてしまう, 「このお店のご飯美味しかった」「ここ,隠れた穴場!」「ここから見える夜景はキレイだった!」と言った日常のちょっとしたつぶやきこそ,私達が本当に見たい,共有したい,伝えたいものだったのではないでしょうか. そして,それはしばしば,あなたの現実の身体や,あなたが実際にいた場所と紐付いています.そのため,場所と投稿を紐付けることが重要になります.
あなたのモニュは,モニュされた場所に自動的にタグ付けされてサーバーに保存されます.そして,何年もあと,その場所を訪れた友達や,もしかすると全く知らない人に届き,その人から「いいね」が帰ってくるかもしれません.これまでのSNSとは全く異なる喜びがここに生まれます.
なお,住所を特定される危険を防ぐため,知らない人に対してはあなたのモニュは匿名化されます.
旅行に行ったとき,ピクニックにでかけたとき,ごはん屋さんを探すとき.そんなときに,現実世界の場所とリンクしたSNSであるリサイトは,そこを訪れた人たちの残していった情報を探すのに便利だというのは簡単に想像できます.
しかし,リサイトが使えるのは,何も目新しい場所を訪れたときだけではありません.学校や会社,いつも通っている場所でも,リサイトを開けば,その場所を訪れた人の新たなモニュに出会えます.あなたが普段は見落としていた,日常の中に眠っていた素敵な場所に出会うことができるかもしれません.
逆に,リサイトで「いいね」をもらうためには,実際にその場所に行き,その場所に関連したことをモニュしなければなりません. リサイトでは,わたしたち皆が持っている承認欲求が,自然と現実世界に私達の目を向けさせるのです.
人類のSNS中毒を解決できます.
リサイトは,リーチアウトにもとても有用です.その場所に行かないと見ることが出来ない情報をリサイトに投稿しておけば,町や観光地,お店に人を集めることが可能になります.
例えば,アニメのキャラの非公開イラストや,アフターストーリー小説,芸能人の限定インタビュー動画などのURLをリサイトに投稿することができるでしょう.
しかし,この機能の実装のためには, モニュした内容の公開距離・公開期間を設定できるようにする 必要があります.お店の宣伝のために投稿したのに,200m先から/何年後でも読めるようでは貴重さが薄れてしまうからです.
また,その場所に行くだけでなく, QRコードによる認証 ができるようになるとより利用の幅が広がりそうです.お店で買い物をしたときにもらえるQRコードで情報にアクセスできるようにするなどの利用が考えられます.
投稿を読み書きするためのウェブサイトと,投稿を位置情報毎にデータベースに乗せて管理するバックエンドサーバに分けて設計しています.
フロントエンドはVue.js
,バックエンドはRuby on Rails
で構築されており,それらがjsonld
を用いてやり取りします.
- Vue.js
- Ruby on Rails
- スマートフォン,タブレットなど,外で使うことのできる情報端末一般
- アイデア出しから開発まで全てHack Dayで行いました
base_url: https://monu-geometry.herokkuapp.com/v1/
param | value |
---|---|
longitude | 34.684860 |
latitude | 135.1994354 |
delta | 0.003 |
post のリスト 距離近い順
{
"posts": [
{
"distance": 12, // number: メートル単位
"body": "this is body", // string: ツイート本文
"url": "https://<slug>", // string: ツイートに含まれるURL
"created_at": 1571454012 // number: UNIX時間
},
{
"distance": 13, // number: メートル単位
"body": "this is body", // string
"url": "https://<slug>", // string
"created_at": 1571454012 // number
},
]
}
failure mode | HTTP status |
---|---|
longitude or latitude が未指定 or numberじゃない | 400 Bad Request |
上記以外 | 500 internal server error |
{
msg: "error message"
}
新しいpostを作成
{
"longitude": 34.684860, // number
"latitude": 135.1994354, // number
"url": "http://hogehoge",
"body": "this is body"
}
post のリスト 距離近い順
{
post: {
"body": "this is body", // string: ツイート本文
"url": "https://<slug>", // string: ツイートに含まれるURL
"created_at": 1571454012 // number: UNIX時間
}
}
failure mode | HTTP status |
---|---|
どれかが未指定 | 400 Bad Request |
上記以外 | 500 internal server error |
{
msg: "error message"
}
v1_users GET /v1/users(.:format) v1/users#index
POST /v1/users(.:format) v1/users#create
v1_user GET /v1/users/:id(.:format) v1/users#show
PATCH /v1/users/:id(.:format) v1/users#update
PUT /v1/users/:id(.:format) v1/users#update
DELETE /v1/users/:id(.:format) v1/users#destroy
v1_me GET /v1/me(.:format) v1/users#me
v1_login POST /v1/login(.:format) v1/users#log_in
v1_posts GET /v1/posts(.:format) v1/posts#index
POST /v1/posts(.:format) v1/posts#create
v1_post GET /v1/posts/:id(.:format) v1/posts#show
PATCH /v1/posts/:id(.:format) v1/posts#update
PUT /v1/posts/:id(.:format) v1/posts#update
DELETE /v1/posts/:id(.:format) v1/posts#destroy
v1 POST /v1/images/:post_id(.:format) v1/images#create
GET /v1/images/:post_id(.:format) v1/images#show
POST /v1/posts/:id/good(.:format) v1/posts#good
v2_users GET /v2/users(.:format) v2/users#index
POST /v2/users(.:format) v2/users#create
v2_user GET /v2/users/:id(.:format) v2/users#show
PATCH /v2/users/:id(.:format) v2/users#update
PUT /v2/users/:id(.:format) v2/users#update
DELETE /v2/users/:id(.:format) v2/users#destroy
v2_me GET /v2/me(.:format) v2/users#me
v2_login POST /v2/login(.:format) v2/users#log_in
v2_posts GET /v2/posts(.:format) v2/posts#index
POST /v2/posts(.:format) v2/posts#create
v2_post GET /v2/posts/:id(.:format) v2/posts#show
PATCH /v2/posts/:id(.:format) v2/posts#update
PUT /v2/posts/:id(.:format) v2/posts#update
DELETE /v2/posts/:id(.:format) v2/posts#destroy
v2 POST /v2/images/:post_id(.:format) v2/images#create
GET /v2/images/:post_id(.:format) v2/images#show
POST /v2/posts/:id/good(.:format) v2/posts#good
- (GET)/login または (POST)/createでログインかユーザー作成
- json形式の
{"token": "huahkdailno"}
をもらう - headerに
Authorization
とBearer {token}
を追加し、送信 - 簡単にauthできてるかの確認として(GET)/meにアクセス(ユーザーオブジェクトがもらえる)
//request
{
"name": "hoge1",
"email": "kooala",
"password": "password",
"image": "url_to_image"
}
//response: user_obj(include token)
//response: user_obj(include token)
//request
{
"email": "kooala",
"password": "password",
}
//response: user_obj(include token)
//response: user_obj
//request
{
"longitude": 34.684860,
"latitude": 135.1994354,
"url": "http://hogehoge",
"body": "this is body"
}
//response: post_obj
//response good_obj
//request => /v2/posts?longitude=34.684860&latitude=135.1994354&delta=0.05
//response: arrayof posts_obj
//response: posts_obj