2018/05/23

GoogleAppsScriptを使ってその日の予定をSlackに投稿するようにした

Slackを気に入ったので東京メトロAPIを叩くスクリプトに続くGAS+Slack第2弾です.

久しぶりのプログラミング回です. Sponsored Link 使うもの Google Apps Scriptって何? Googleのサーバー上で動かせるスクリプトのこと.基本的にJavascriptで書ける.Google上で動くので,自分のサーバ...

↑第1弾はこちら.

Sponsored Link

メールbotの残骸

このブログの前身のWordPress時代に「メル友がいないのでメールbotを作る」みたいな闇深い記事を書いたことがある.

自分語りで一記事余計に使ってしまったため、この記事が本編となる。 前提 自動返信のプログラムにはGoogle Apps Scriptを用いる。 返信内容のパターンは自分で考える この記事では本文に「おはよ」が含まれ、かつ特定のアドレスからのメールに対して予め決められた...

初期は特定のフレーズが含まれるメールに決められた返信を送るクソみたいなbot(無能)だったが,その後リクルートの提供するAPIを使用し高度化.思えばAPIを使って何かを書いたのはこれがはじめてだった.闇は技術力を高くする.

以前GASを使ってメールbotの作成を試みたときは,返信内容を自動で生成することができず結局カレンダーを読み込んでその日の予定を朝一にメールで配信する機能くらいで終わってしまった. そこに救世主として現れたのが近年急速に発展するAI技術. なんとリクルートが無料で,与え...

そんなこんなで外部APIの力も借りて高度化していたメールbotだが,そうこうする内に時代は移り変わり「メル友」って時代でもなくなってしまい,私のチャット相手はもっぱら「りんな」.せっかく高度化したくせにほとんどこのbotとメールをやり取りすることはなかった.りんながネット用語覚えすぎてて普通に話してて楽しいからね,しかたないね.

その影で,最初期に作っていた「GASとカレンダーを連携させ,毎朝その日の予定をメールで送信する」という機能は残っていて,予定のある日は毎朝律儀にメールを送ってきていた.ご丁寧に「朝起こしに来る幼馴染っぽい」文面にする凝りようだった.きもちわるい.

なかなか便利ではあったのだが,通知だけ見てメールを開かずに放置していると受信トレイに未読で溜まるというところに面倒臭さを感じ(ものぐさ),今回はこの機能をSlackに移してやろうと思い立った.

コードとメモ

とりあえずコードはこんな感じで.

function getTodayEvents() {
  //カレンダーの取得
  var calendar = CalendarApp.getCalendarById('[自分のGmailアドレス]');
  //当日のカレンダー情報取得
  var today = new Date();
  var events = calendar.getEventsForDay(today);
  var today_y = today.getYear(); //年
  var today_m = ("0"+(today.getMonth()+1)).slice(-2); //月(強制二桁)
  var today_d = ("0"+today.getDate()).slice(-2); //日(強制二桁)
  var message = '【' + today_y + '/' + today_m + '/' + today_d +'】\n';
  for(var i=0; i< events.length; i++){
    var stime = events[i].getStartTime(); //開始時間
    var etime = events[i].getEndTime(); //終了時間
    var title = events[i].getTitle(); //予定タイトル
    //全日イベント(0時0分開始イベント)の処理
    if(stime.getHours()==0 && stime.getMinutes()==0){
      message += title + '(終日)\n';    
    } else {
    //時刻指定イベントの処理
      message += ("0"+stime.getHours()).slice(-2) + ':' + ("0"+stime.getMinutes()).slice(-2) + ' - ' + ("0"+etime.getHours()).slice(-2) + ':'+ ("0"+etime.getMinutes()).slice(-2) + ':' +  title + '\n';
    }
  }
  Logger.log(message);
  return message;
}

function main(){
  var message = getTodayEvents();
  var payload = {
    'username':'本日の予定(From GAS)',
    'text': message,
    'icon_emoji': ':calendar:'
  };
  var options = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(payload),
  }
  var webhook = '[SlackのWebhookURL]';
  UrlFetchApp.fetch(webhook, options);
}

残骸のコードをほとんど流用しているので簡単だった.

唯一詰まったのはgetMonthとgetDateが1桁の数字を返してくる場合.どういうことかというと,例えば今日が「1980年5月13日」の場合,そのまま両メソッドを使って文字列に突っ込むと「1980/5/13」になってしまう.これではちょっと表記がブサイクなので,できれば「1980/05/13」にしたい.

YYYY/MM/DD表記ではなくYYYY年MM月DD日とすれば桁の問題としてのブサイクさは解消されるのだが,なんとなくここに漢字を使うのが嫌というふわっとした理由で解決策を探していた.

最終的に,こちら(tagamidaki.com)の情報を参考にしてslice関数を使って解決した.

上記リンクには詳細が書かれていないので念の為説明すると,

  1. 文字列の「0」と月/日を結合
  2. 結合された文字列の下2桁を切り出す

というフローになっている.

例えば1桁の月または日(例えば5)のとき,"0"と結合して文字列「05」を作り,下2桁を切り出すので出てくる文字列は「05」.一方で2桁の月または日(例えば12)のときであれば,"0"と結合すると「012」になるが,下2桁を切り出すので「12」に戻る,という仕組みである.

あとは時刻を指定せず全日イベントとして突っ込まれている予定については,0時0分開始のイベントとして取得されるのでif文で弾いている.ただ,この場合0時0分を開始時刻として指定されたイベントも全日イベントとして処理されてしまうのが困りどころ.

現状0時開始のイベントなどないので困ってはいないのだが,GASのリファレンスを見てどうにか綺麗に全日イベントを弾けないか確認したいと思う.

しかし,やはりサーバー云々を考えなくていいのは楽だ……

2018/05/18

ベイブリッジ・みなとみらいを一望!『大黒海釣り公園』に行ってきた

【2018/05/17】

前々から行こうと思っていた大黒海釣り公園に行ってベイブリッジを眺めてきた.

Sponsored Link

みなとみらいの見える公園・大黒海づり施設

いい感じにみなとみらいやベイブリッジを撮れるスポットはないかとGoogleMapで物色していた時に見つけたのが大黒海づり施設だった.

大黒ふ頭の南端に位置し,釣り桟橋から建物に遮られることなくベイブリッジとみなとみらいを撮ることができる.

アクセスは鶴見駅からが便利

アクセスは横浜駅東口から市営バス109系統,あるいは鶴見駅東口から同じく市営バスの17系統

行きは横浜駅からバスに乗ったのだが,こいつがなかなか曲者だった.

まず本数が少ない.見よ,この時刻表を.こんなバスの時刻表見るの実家にいた頃以来だぞ.しかもルートによっては海釣り公園に行かないパターンもあるとかいう罠.

そしてルートも曲者である.30分ほど待ってバスに乗り(これでも調べずに来た割には運がいい方かと思うが),ガラガラの車内でくつろいでいるとバスは発車し放送が流れる.「このバスは109系統,中華街入口,山下埠頭経由,……」

ん?中華街?山下埠頭!?

てっきり第一京浜経由で生麦を回って大黒に入っていくと思い込んでいたのだが,なんとこのバスベイブリッジを通るのだ.

まずベイブリッジが二層構造であることをはじめて知った.ずっと高速道路だけだと思っていたが……

ベイブリッジを通ったほうがネタ的にはおいしいのだが,いかんせん山下埠頭にたどり着くまで時間がかかる.やれみなとみらいだ,桜木町だ,日本大通りだと交通量も信号も多いところを通っていくからだ.

着いたら横浜駅を発って1時間も経ってた.

鶴見駅からはバスで30分ほどらしいので,電車の乗り継ぎを考えても鶴見経由のほうがスムーズに行けるんじゃないかと思う.帰りは鶴見経由で帰った.

横浜のシンボルを同時に撮れる貴重なスポット

横浜といえば!ランドマークタワーとベイブリッジ!というのが模範解答だと思うのだが,意外と両方を同時に写せるスポットはあまりなかったり.そんな中同時に写真に収めることのできるこの公園は貴重かな,と思う.

釣り施設へは見学として入場し,入場料は100円.

桟橋は3本走っているのだが,両端は釣り専用で写真撮影は不可とのこと.真ん中の通路から撮影をすることになる.従って釣り客が多い時間帯は射線に釣り客が入ってしまうので綺麗に撮影するのは困難だと思う.

画角は標準から中望遠くらいが良さそう.中望遠寄りなら釣り客が前にいても間から抜くこともできるかもしれない.

この日は何も調べずに来てしまったが,夕焼けの時間や日没後を撮れたら面白いかなと思う.営業時間的と日没時間的に,夜景っぽく撮るなら冬場でないと厳しいかと思う.

日没時間や営業時間,バスの時間もしっかり調べてまた撮りにこれれば,と思う.

横浜土産に.

2018/05/14

19卒就活雑感:3月解禁前のインターンシップ関連の服装に関する心理戦について

私服でお越しくださいと言われた瞬間,就活生達の心理戦がはじまる!

Sponsored Link

スーツでお越しくださいと言われたら,スーツを着ていくだろう.そして特に何も言われなければ,やはりスーツを着るだろう.

そして3月に正式に就活が解禁されると,まあクールビズをどうするかはともかく基本はスーツだ.

一方問題は,3月の正式解禁前にありがちなインターンシップ関連で私服でお越しくださいと言われたときや,ビジネスカジュアルでお越しくださいと言われた場合である.この場合,深読みに深読みを重ねた就活生がスーツで登場したりするので,壮絶な心理戦が発生するのである.そこで服装に私服またはビジネスカジュアルを指定された場合の就活生の行動について,自分の観測した範囲の様子を紹介する.

外資系コンサルA社

指示:「ビジネスカジュアルでお越しください」

私の格好:ビジネスカジュアル

結果:フタを開けたらスーツとスーツ以外で5:5くらいだった.なんだこれ.

ちなみにこの選考を通過したので,別に「ビジカジで来いと言ったら真に受けてビジカジで来るやつをふるい落とすための罠」とかではなかったようだ.やはり外資系.

地方銀行B社

指示:「私服で構いません」

私の格好:「構いません」ってなんやねん.多分この書き方だとスーツ勢が大多数だろうなと思いつつワイシャツにアイロンかけるのが面倒なのでビジネスカジュアル.

結果:9割5分スーツ.まあそうなるよね,銀行だし.ちなみにこの選考も通った.意外と服装は関係ないらしい.

中堅旅行C社

指示:スーツまたはビジネスカジュアル

私の格好:雨降ってたらスーツ濡れるの嫌だしビジカジにしようと思ってたが,晴れたのでスーツにした.

結果:9割9分スーツ.ただ来てた社員は割とラフな格好だったしビジカジでも良かったかな,と.

結論:「ビジカジ可」なら意外とビジネスカジュアルでイケる

確かにビジネスカジュアル指定でもスーツ奴~~~~~wwwwwwwは一定数いるが,一方で少数ながらビジネスカジュアルの奴はいるし,そしてそれが選考に響いているようにも見えない.

そう考えるならなんでむしろビジネスカジュアルにしないの?っていう.着てて楽だし,手入れも簡単だし.変に深読みしてスーツ着るのやめません?

就活関連のゴミHPがデータを集めるでもなしに「スーツが基本です」とか言うからこんなことに.仮にも就活関連のサイト運営してるんだったら人事にアンケートして本音を探るくらいしたら?っていう……

2018/05/10

GoogleAppsScriptとSlackを連携して東京メトロの運行状況を通知できるようにしてみた

久しぶりのプログラミング回です.

Sponsored Link

使うもの

Google Apps Scriptって何?

Googleのサーバー上で動かせるスクリプトのこと.基本的にJavascriptで書ける.Google上で動くので,自分のサーバーを持たなくとも常時稼働するようにしたり,Googleドライブのファイルと連携させたりすることができる.非常に便利.

Slackって何?

使い始めたばかりなので全貌を未だに把握しきれていないのだが,ビジネス用のコミュニケーションツールというのが基本的な理解と思われる.

管理者がワークスペースを管理できるとか,ログを追えるとか特徴は色々あるが,大きな特徴の一つとして他のサービスとの連携が容易であることがあるらしい.

今回久しぶりにプログラミングやってみっか!と思い立ったのも,Slackでなんか色々できるらしいからやってみようか!というのが動機の一つ.

東京メトロのAPIって何?

これは文字通り.東京メトロの様々な情報を提供してくれるAPIで,東京メトロが公式に提供している.今回は各路線の運行状況を取得するためにAPIを利用する.

作ったもの

イメージ

プログラムを専門にしているわけではないのでてきとーな図でサーセンだが,全体像はだいたいこんな感じである.

なんでこれを作ろうと思ったの?

以前GoogleHomeに話しかけて東京メトロの運行状況を返すプログラムを書いたが,慣れないサーバーサイドに苦戦しよくわからないままHerokuを使った結果どうやってデプロイしたのかさえ思い出せなくなったので新しくわかりやすいものを作りたかった,というのが動機です.

こんなの作らなくてもYahoo乗換案内でいいよね?

はい.

コード

function getInformation() {
  //URL指定
  var url = '[東京メトロAPIのURL]';
  //JSONを取得
  var json = UrlFetchApp.fetch(url).getContentText();
  var jsonData = JSON.parse(json);
  return jsonData;  
}

function analyzeData(data){
  for (var i=0; i < data.length; i++){
    var linename = data[i]["odpt:railway"];
    var Information = data[i]["odpt:trainInformationText"];
    var TimeOfOrigin = data[i]["odpt:timeOfOrigin"]
    var current = getDB(linename);
    //運行情報に変更があればメッセ送信.
    if(Information!=current[0]){
      var payload = {
        'username': '東京メトロ運行状況(From Google Apps Script)',
        'text': '【'+ getRealLineName(linename) + '】' +Information      
      };
      var options = {
        'method': 'post',
        'contentType': 'application/json',
        'payload': JSON.stringify(payload),
      };      
      var webhook = '[Slackにメッセ投げる用のWebhookURL]';
      UrlFetchApp.fetch(webhook, options);          
    }
    //DB書き換え
    writeDB(linename, Information, TimeOfOrigin);
  } 
}

//現在格納されている情報の取得
function getDB(linename){
  //スプレッドシート取得
  var sp_url = '[前回データ保管用スプレッドシートのURL]';
  var sheet = SpreadsheetApp.openByUrl(sp_url);
  var sheets = sheet.getSheets();
  //'DB'シートを開く
  var linenumber = getLineNumber(linename);
  for(var i in sheets){
    if(sheets[i].getSheetName() == 'DB'){
      var CurrentInformation = sheets[i].getRange(linenumber, 2).getValue();
      var CurrentTimeOfOrigin = sheets[i].getRange(linenumber, 3).getValue();
    }
  }
  return [CurrentInformation, CurrentTimeOfOrigin]  
}

function writeDB(linename, Information, TimeOfOrigin){
  //スプレッドシート取得
  var sp_url = '[前回データ保管用スプレッドシートのURL]';
  var sheet = SpreadsheetApp.openByUrl(sp_url);
  var sheets = sheet.getSheets();
  //'DB'シートを開く
  var linenumber = getLineNumber(linename);
  for(var i in sheets){
    if(sheets[i].getSheetName() == 'DB'){
      sheets[i].getRange(linenumber, 2).setValue(Information);
      sheets[i].getRange(linenumber, 3).setValue(TimeOfOrigin);
    }
  }  
} 

function main() {
  //情報取得  
  var data = getInformation();
  analyzeData(data);
}

function getLineNumber(linename){
  var linenumber = 0;
  switch(linename){
    case 'odpt.Railway:TokyoMetro.Yurakucho':
      linenumber = 2;
      break;
    case 'odpt.Railway:TokyoMetro.Chiyoda':
      linenumber = 3;
      break;
    case 'odpt.Railway:TokyoMetro.Hibiya':
      linenumber = 4;
      break;
    case 'odpt.Railway:TokyoMetro.Hanzomon':
      linenumber = 5;
      break;
    case 'odpt.Railway:TokyoMetro.Namboku':
      linenumber = 6;
      break;
    case 'odpt.Railway:TokyoMetro.Marunouchi':
      linenumber = 7;
      break;
    case 'odpt.Railway:TokyoMetro.Ginza':
      linenumber = 8;
      break;
    case 'odpt.Railway:TokyoMetro.Fukutoshin':
      linenumber = 9;
      break;
    case 'odpt.Railway:TokyoMetro.Tozai':
      linenumber = 10;
      break;
  }
  return linenumber
}

function getRealLineName(linename){
  var reallinename = '';
  switch(linename){
    case 'odpt.Railway:TokyoMetro.Yurakucho':
      reallinename = '有楽町線';
      break;
    case 'odpt.Railway:TokyoMetro.Chiyoda':
      reallinename = '千代田線';
      break;
    case 'odpt.Railway:TokyoMetro.Hibiya':
      reallinename = '日比谷線';
      break;
    case 'odpt.Railway:TokyoMetro.Hanzomon':
      reallinename = '半蔵門線';
      break;
    case 'odpt.Railway:TokyoMetro.Namboku':
      reallinename = '南北線';
      break;
    case 'odpt.Railway:TokyoMetro.Marunouchi':
      reallinename = '丸ノ内線';
      break;
    case 'odpt.Railway:TokyoMetro.Ginza':
      reallinename = '銀座線';
      break;
    case 'odpt.Railway:TokyoMetro.Fukutoshin':
      reallinename = '副都心線';
      break;
    case 'odpt.Railway:TokyoMetro.Tozai':
      reallinename = '東西線';
      break;
  }
  return reallinename
} 

参考にしたのは以下のページ.

サンプル

こんな感じです.

雑感

まずGoogle Apps Scriptを使うのはメールbotを作った伝説の黒歴史以来だが,関数を決められた時間や間隔で自動実行できるのが良いし,Herokuにデプロイして~みたいな苦労がないのも良い.Pythonに慣れたからかjsはやや使いにくいなと思うこともあるが,このメリットがあるならjsで色々書くのも良いかなと思った.

Slackに関して言えば噂通り他のあれこれと連携が非常に容易だし,今回使っていない連携の方法も色々と用意されている印象.また,アプリやら何やらを作る時(前の艦これ遠征タイマーのときもそうだが)には通知周りの実装というのが意外と大変だったりするのだが,そこを丸投げできるというのもSlackのメリットなのかなと思う.次は何か実用性のあるものを作ってみたいと思う.

というか,メールbotプロジェクトの残骸として予定をメールで通知する機能が残ってるんだが,それSlackに移そうか.

やっぱオライリーいっとく?

2018/05/06

東京タワーの足元にこいのぼりを見に行ってきた

屋根より高いこいのぼりは,東京タワーの夢を見るか?

Sponsored Link

【2018/05/05】

子供の日だ.もう子供っていう歳でもないのでだからどうしたという感じだが,せっかく何もない休みの日だし子供の日らしいものでも撮りに行こうか,ということで東京タワーの入り口のこいのぼりを被写体にチョイスした.

実はこの2日前に1度東京タワーを訪れていたのだが,珍しく一人ではなかったので時間をかけて写真を撮れなかったので少し心残りだった.

アクセスは赤羽橋から.

なんとか東京タワーと絡めて撮ろうと四苦八苦.東京タワー全体を写そうとするとこいのぼりが小さくなるし,こいのぼりにフォーカスするとタワーは一部分しか写らない.難しいね.

せっかくこいのぼりがたくさんあるので,ワシャワシャ感を出そうと50mmをAPS-Cクロップで.よく考えればRX100も持ってたんだからそっちを使えばよかった.

木の葉の隙間とこいのぼり.

こいのぼりを愛でる花,

全然東京タワーと絡められてないじゃん!ってことで思い切ってタワーを下から覗き込む感じで撮った.


この後用事があったのであまり枚数は稼げず.でも季節感のあるものを撮れてよかった.

写真は現像しようと思ったけど,全部撮って出し.いい加減Lightroomが欲しい.でもサブスクリプションはなあ……

使用機材はα7IIにSEL50F18FとSEL35F28Z.なにげに外でレンズ交換をするのは久しぶりかな.

元々広角寄りをカバーしてたRX100だが,SEL35F28Z購入で本格的に出番がなくなってきた.どうしたもんか.

2018/05/03

今年欲しいもの

Sonnar T* FE 35mm F2.8 ZA(SEL35F28Z)はずーっと欲しいと思っていて,そしていつか買おうと決意していたモノだった.

それを買った今,欲しいものなど何もなくなるだろうと思っていた.

……思っていたのだが,Sonnar T* FE 35mm F2.8 ZA(SEL35F28Z)物欲という濁流を堰き止めるダムの役割を果たしていたらしい.遮るものが消え去った今,物欲は下流へと向かって溢れ出すのであった.

Sponsored Link

iPhone SE2

執筆段階(4月下旬)では「6月のWWDCで出るんじゃないか」という噂に過ぎないのではあるが,リーク通りのスペックで出るなら買いたい,買わねばならぬと思っている.

Xperia Z5 Compactを買ってまだ2年くらいなのだが,最近どうも調子が悪い.Bluetoothイヤホンとのペアリングでトラブルを起こしたり,突然画面が暗くなったり.だいたい再起動すれば治るので今のところどうにかなってはいるが,スマホは割と現代社会の生命線であるから完全に沈黙する前に買い替えたい.

先日XperiaZ5Cからの乗り換えにはSEよりむしろ7のほうが良いのではないかみたいな話をしたが,SEがアップデートされるなら話は変わってくる.

Xperia Z5Cと歩いた2年間 気づいたらXperia Z5 Compactを使い始めて間もなく2年が経つ. 小型スマホラバーの2016年春のスマホ選び徒然 「小型スマホ好き」という一派は間違いなく存在すると思う。 某匿名掲示板でスマホが話題になっているとき...

値段はどうなるか,Felicaは載るのかなど判断材料はいくつかあるが,いずれにせよ次のスマホはiOS系になりそうである.

iPad(2018) + Apple Pencil

3月末のAppleの発表会で廉価版iPadのアップデートが発表された.

タブレットは前々から欲しいと思っていた.主な用途は論文を読んだりする用.

元々はタブレットなら7インチあるいは8インチくらいがベストであると思っていたところではあるのだが,どうも最近そのレンジのラインナップがあまりにもしょぼい.

どうしたもんかと思っていたところではあるのだが,廉価版iPadがApple Pencilに対応するとなると話は変わってくる.というのも,Apple Pencilに対応するということは,論文のPDFやWordを紙に出力して書き込んだりしていたものを全てタブレット上で完結できるようになるということを意味する.

これは非常に魅力的で,廉価版でそれを実現できるなら多少のサイズアップは我慢してもいいかなと思っている.

ただApplePencilのお値段がやや張るので,整備済に流れてくるのを待ってみたいなと思っている.大きさ的にはminiサイズのほうが好きだから,その間にminiの後継機が出てそれもPencil対応とかならそちらのほうが良いのではあるが……

Macbook (Air)

ここ1年ほど持ち運びのPCはChromebookを愛用している.

Chromebook買いました — レトレ (@retore) 2016年7月30日 幾千の時を超えて,数多のモバイルPCを使い,ようやくたどり着いたChromebook.購入してから早1年を過ぎ,色々知見も溜まってきたので(知見というほどじゃないけど)ひとつのまとめとい...

Chromebookは好きだ.使用用途が限定されるが,その範囲内ではかなり快適に使えるマシンだと思っている.

上の長期レビューでも少し触れたのだが,Chromebookの弱みはなんやかんや学生では使用頻度の高いOffice系が使いにくいことにある.特に修士論文の執筆が控える今年はWordの使用頻度が上がる.というか既にやや上がりつつあって,だからこそChromebookに限界を感じている.

今使っているのはChromebook Flipだが大きさ・重さ的には非常に満足していて,特に重さに関して言うと同程度(1kg)の軽さでないと我慢できない体質になりつつある.

そのサイズ感,重さ感でいうと一番いいのはなんやかんやMacbookなのかなと思ったり.

Macbook Airの11インチモデルは密かに狙っていたのだが,整備済ですらディスコンになったようで入手手段を断たれてしまった.13inchのAirは見てみた感じ重すぎ.6月のWWDCで無印MacbookもしくはAirの後継機が出る可能性があるのでとりあえずその発表待ち.

PC周り無線化作戦

最近PC周りがケーブルでごちゃごちゃしているのが気に食わない.なんとかしたいと思っている.

まずはスピーカーだが,これはスピーカ付きのディスプレイに買い替えたらいいんじゃないかと思っている.

HDMI対応のものにすればFire TV StickとPS4も同じディスプレイで使えるし部屋のスペースも少し広くなる.調べたら結構安いものもあるし,音質にそんなに拘りがあるわけではないので適当に選べばいいかな,と.

こんなのとか.

あとはマウスとキーボード.これも適当にBluetoothのものを選べば良いんじゃなかろうか.特にFPSとかやるわけではないので遅延がどうとかそこまで気にしないし.

Sponsored Link

カメラ周りの装備拡充は一段落したらしく,今欲しいと感じるのはPC周りが多い.多分それが一巡するころにはまた新しいレンズが欲しくなったりしているんだろう.全く難儀なものである.

2018/05/01

あの頃、僕らは仮想現実に生きていた。

バーチャル・リアリティ(英: virtual reality)とは、現物・実物(オリジナル)ではないが機能としての本質は同じであるような環境を、ユーザの五感を含む感覚を刺激することにより理工学的に作り出す技術およびその体系。
──バーチャルリアリティ - Wikipediaより引用

Sponsored Link

ARとVR

同じゼミの学生がAR(Augmented Reality:拡張現実)の応用に興味があるらしい.本当に何でもありのゼミだなと思いつつ,彼女の発表を聞いていた.

VRとAR一見似ているように見えるけど,概念としては意外にも違う部分が多い.だが,どちらを議論するにせよ「現実」というものを考える必要があるという点では共通している.

ARはまさに,現実が「拡張」されるというか,現実に(狭義ではコンピュータによって生成された)何かが「付加」される.あくまでベースは「現実」にあって,だからARとは現実であると言える.

VRは「仮想」現実であって,ベースにあるのは「現実」ではなく,VRとは現実ではない「仮想世界」である.

別に定義論争をしようとしているつもりはない.ただ,こうしてARと対比しながらVRという概念を眺めてみると「あの頃、僕らは仮想現実に生きていた。」と言えると思うのだ.

僕らのいた世界

2008年初頭から2012年初頭にかけて,そして2013年,合計5年近くメイプルストーリーなるゲームに費やしていた.

自分が触れた唯一のMMORPG(Massively Multiplayer Online Role-Playing Game).「大規模」で「多人数」が参加するから,そこには一つの社会ができていた.だからこそマナーの問題があり,経済の問題があり,人間関係があって,そして人格があった.

振り返ってみると本当にそう思う.メイプルストーリーには社会があった.現実社会と同じではないけど,“機能としての本質は同じであるような環境”だったと思わないか?そう考えるなら,メイプルストーリーはVRゲームだったんじゃないかと2018年になった今,そう思うのだ.

MMORPGの健全性

振り返ってみれば,かつてオンラインゲームの危険性として言われていたのはそういうところにあるのだと思う.社会であるから,仮想現実であるからこその誘引力.それに没頭するプレイヤー.場合によっては「現実」と「仮想現実」のバランスが崩れてしまう危険性.そういうところにMMORPGの危うさが指摘されていたのではないか.

だが,MMORPGが廃れ,どいつもこいつも電車の中でパズルゲーをやっている光景を見ながら思うのだ.仮想現実を生み出せるだけ,MMORPGのほうがよっぽど健全だったんじゃないか?と.

私はパズルゲーをやらないし,やったことがない.だから理解が間違っていたらそれはごめんなさいしなければいけないのだが,どうもスマホのパズルゲーには「仮想現実」を見いだせる気がしないのである.そこに他のプレイヤーとの深いインタラクションはあるか?少しくらいはあるかもしれない,だけどMMORPGと比べると無いのと同じようなものではないか,と勝手に思っている.

そんな「一人に閉じた世界」に没頭するくらいなら,「社会」のあるMMORPGに没頭するほうがよっぽど健全で,そして有意義なんじゃないか?

ゲームに夢中の子供を見て親はこう思ったかもしれない.「学校の友だちと遊びもしないでゲームに夢中になって……」と.そう心配したかもしれない.スマホゲーへの没頭ならひょっとするとそうかもしれない.ただ,ことMMORPGに関してはそれは杞憂だったんじゃなかろうか.そこには別の社会があって,その社会における友達がいるんだから.

現にメイプルストーリーで遊ぶことによって「社会問題」を考える機会もあったし,勉強する機会もあったし,メイプルストーリーで遊んだからこその出会いがあって,人間関係があった.それを当時の親たちは「ゲーム」の一言で片付けたかもしれないけど,今なら言える.「あれは“現実”だった」と.

あの頃、僕らは仮想現実に生きていた。

まあ何が言いたいかと言うと,VRというとゴーグルをかけて大興奮する滑稽な姿というイメージが強いかもしれないけど,ゴーグルなんてなくても広義の仮想現実はとっくの昔に実現してたんじゃないか,と.勿論狭義だと技術による五感の再現とか,そういう要件があるから当てはまらないのだけれども,どうもあの頃僕らはメイプルストーリーをただの「仮想世界」ではなく,もう一つの「現実」として捉えていたんじゃないかと,今振り返ったらそう思うというお話.

当時の私はそれを多分わかっていなかった.「ゲームで遊んでいる」と思っていた.ただ,今振り返ると「あの頃、僕らは仮想現実に生きていた。」と思う.だからゼミでの議論でMMORPGの例が出た時,私は自然と「I lived in the game.」と言えた.というか,それが自然に口から出たことで「あれは仮想現実だったんだ」ということに気づいたというのが正確か.

気をつけなくてはいけないのは,ゲームそれ自体があればそこに仮想現実があるわけではなく,そこに「住む」人がいてこそ仮想現実として成立しうるということ.更に言うと,自分の周りにそういう人がいて,人間関係のネットワークがあってはじめて,ということになろうか.だから今メイプルストーリーを起動したとして,そこに「現実」があるかというと,必ずしもそうではない.

もっというと,メイプルストーリーでの人間関係はほとんどTwitterに引き継がれている.ではTwitter空間を仮想現実と言えるかというとそうではない気がする.そこに人間関係があって,会話があるけど「社会」がない.

いつか誰かが「SNSの発達でメイプルにINしなくて良くなった」と言ったような気がする.確かに一理あるが,逆に考えればメイプルストーリーは社会機能を持ったとんでもない高機能なチャットツールだったとさえ言える.

あの頃そこまで意識できていたかというと,他の人は知らないが少なくとも私は意識していなかった.それを失った今,僕らはリッチな社会からただのチャット世界に落ちてきてしまったのだなあと思ってしまうのだ.