ハンバーグのおいしい季節

いっつもうめえよ

M-1グランプリ2018を展望しよう

昨晩M-1グランプリの話を熱く語ってしまったので、明日に控えるM-1グランプリ2018の決勝戦の展望をしてみる。

決勝進出者(発表順)

常連組の和牛、ゆにばーす、かまいたち
初出場の霜降り明星、見取り図、トム・ブラウン
ラストイヤーのスーパーマラドーナジャルジャルギャロップ

というバランスのいい決勝進出者になった。 昨年同様、笑神籤という抽選システムでネタ順が確定するので、正直予想が全くつかない。どんなにいいネタを持っていても、10組出場の大会でトップバッターになったらかなり厳しくなってしまう。昨年のトップバッターのゆにばーすは、散々それを言われていたと思うが運も実力なのかもしれない。 1組ずつ語ると全く止まらなくなりそうなので、M-1公式の三連単予想だけしてみる。

1位:かまいたち 2位:ゆにばーす 3位:霜降り明星

全く根拠はないが、こう予想してみた。尻上がり的に盛り上がってオチで完璧に落とす、というイメージがある三組を選んだ。キングオブコントを優勝したハナコしかり、オチが綺麗に決まると審査員に評価されやすいイメージがあるので。

敗者復活に関しては、どんなネタでも自分が贔屓してしまうAマッソと囲碁将棋は準々決勝で敗退し出場しないので、フラットに見れそう。 個人的には、ラストイヤーのプラスマイナスを応援したい。

M-1グランプリの話をしよう

本日、降臨!アイドル神GTというネット番組に自分の好きなフィロソフィーのダンスというグループが出演するので公開収録へ行ってきた。渋谷の無限大ホールに来るのは、去年のM-1グランプリ特訓ライブ的なやつぶりだった。


年末になったし、M-1グランプリの話をしよう。
自分が初めてM-1に虜にされたのが、2007年だった。
忘れもしない、無名のサンドウィッチマンが敗者復活から優勝した年である。
仙台から上京して二人で暮らしながら売れない日々送っていた彼らが、その日を境に芸能界のスターに成り上がった。まさにM-1ドリームである。*1
当時中1だった私は、そのサクセスストーリーに惹かれに惹かれた。こういう言い方をするとのちにお笑い芸人を目指した奴みたいに思われてしまうが、自分はその栄光を掴み取る瞬間をみてみたい、とただただ感じた。

翌年の2008年、敗者復活戦が行われる大井競馬場に家族で見に行った。あのサンドウィッチマンテレビ朝日に送り出したトレーラーはここから出発したのか、と少しテンションが上がった。
12月下旬の寒空の下、とにかく客は笑いたくてうずうずしてる会場だった。約60組が出場する敗者復活戦で、様々な芸人が笑いを掻っ攫う中、1組だけ会場を沸かし切ったコンビがいた。
それがオードリーだった。寒空の会場は燃えに燃え、揺れに揺れた。競馬場だから揺れる設計なのか?とさえ疑うほどだった。
彼らはその年敗者復活から準優勝し、TVスターとなった。
M-1グランプリには夢しかない、改めてそう感じた。


M-1グランプリは2010年で一度幕を閉じた。
翌年からTHE MANZAIがそれに取って代わられる大会となった。
THE MANZAIは明らかに色が違った。M-1は戦いであり、バチバチな大会だったのに対してTHE MANZAIはある種お祭り的な大会だった。
しかし、今思うとTHE MANZAIは非常にいいクッション的な大会だった。

M-1と違って芸歴による出場制限がないため、若手からベテランまで、正統派漫才から邪道漫才までなんでも楽しめる、おもちゃ箱みたいな大会だった。
そのおかげでかつてのM-1では受け入られることがなかったであろう、アルコ&ピースの「忍者になって巻物を取りに行く」という伝説の邪道ネタが審査員全票獲得したり、ベテランの博多華丸・大吉が優勝したり、国民ワラテンという視聴者参加型の採点だったりと茶の間もみんなで楽しめる大会だった。


そして2015年、M-1グランプリが帰ってきた。しかもとんでもなくパワーアップして。
コンビ結成10年以内から15以内に変更され、出場芸人のレベルがグンと底上げされた。
また、THE MANZAIを経て茶の間がいろんな漫才に寛容になったおかげで、かつてのM-1では考えられないくらいネタの幅も広がった。現に2010年のM-1でメタな漫才を披露して8位で終えたジャルジャルも、2015年ではファーストステージ1位で突破した。
そして、2015年から3回戦と準々決勝の動画がgyaoにて公開される運びになった。
今までは、その年に2本面白い漫才を作れば優勝できると言われてきたM-1グランプリだったが、予選の動画がgyaoで公開されてしまうため芸人は準決勝まで勝負ネタを隠さないといけない流れになった。*2

これらを踏まえて、M-1グランプリのレベルはかなり高くなった。
自分自身も2015年から毎年、今年が一番面白かったと言っている気がする。

しかし、今も昔も変わらないのはM-1グランプリだけに思いを懸ける芸人がたくさんいることである。M-1博士ことスーパーマラドーナ武智や今年決勝進出して涙を流した霜降り明星せいやや見取り図盛山、優勝したら辞める宣言をしてるゆにばーす川瀬名人など、彼らのM-1に懸ける情熱はハンパない。彼らは下半期の仕事、多分M-1のことしか考えてないと思う。しかし自分はそういう彼らを見るとグッと来てしまうし、M-1ドリームを掴みかけている彼らを応援したくなる。
また、M-1ドリームは売れるためだけではない、そう思わせてくれたのが昨年6位で終わったジャルジャル福徳の涙だった。富も名声もすでに手に入れた彼らが欲しがってるのは、M-1王者という称号だった。
M-1ドリームはM-1をきっかけに夢を掴むだけではない、M-1自体が芸人の夢なのだと強く感じた。


M-1グランプリはお笑いの大会としても、テレビ番組としても、そして芸人が夢を掴む場所としても最高峰なのである。
今年2018年は12月2日(日)にM-1グランプリが放送される。今から待ちきれない。

*1:ネタ的には準優勝したトータルテンボスが好きだった

*2:予選と同じネタでも決勝まで進出する芸人ももちろんいる

dvipdfmxが通らない時の対策をしよう

Texで編集する機会があったので、久しぶりに触ったらdvipdfmxのコンパイルが通らなかったのでメモ。前までは同環境で動いてたのに。

環境

macOS High Sierra

エラー

$ dvipdfmx hoge.dvi

上記コマンドを実行しようとすると、下記で怒られる。

** WARNING ** Filtering file via -->rungs -q -dNOPAUSE -dBATCH -dEPSCrop -sPAPERSIZE=a0 .....
** ERROR ** pdf_ref_obj(): passed invalid object.

対策1

command -->rungs...で怒られているので、/usr/local/texlive/2017/texmf-config/dvipdfmx/dvipdfmx.cfgを編集する必要があるらしい。

D  "rungs -q -dNOPAUSE -dBATCH -dEPSCrop -sPAPERSIZE=a0 -sDEVICE=pdfwrite -dCompatibilityLevel=%v -dAutoFilterGrayImages=false -dGrayImageFilter=/FlateEncode -dAutoFilterColorImage    s=false -dColorImageFilter=/FlateEncode -dAutoRotatePages=/None -sOutputFile='%o' '%i' -c quit"
    ↓
D  "gs -q -dNOPAUSE -dBATCH -dEPSCrop -sPAPERSIZE=a0 -sDEVICE=pdfwrite -dCompatibilityLevel=%v -dAutoFilterGrayImages=false -dGrayImageFilter=/FlateEncode -dAutoFilterColorImage    s=false -dColorImageFilter=/FlateEncode -dAutoRotatePages=/None -sOutputFile='%o' '%i' -c quit"

これで解決だ!と思い実行してみるが、コンパイル通らず。

対策2

ghostscriptをもう一度入れ直してみる。

$ brew install ghostscript

gsはシンボリックリンクなのでリンクを貼り直す。

$ rm /usr/local/bin/gs
$ ln -s /usr/local/Cellar/ghostscript/9.26/bin/gs /usr/local/bin/gs

バージョンを確認してみる。

$ gs -v
GPL Ghostscript 9.26 (2018-11-20)
Copyright (C) 2018 Artifex Software, Inc.  All rights reserved.

最新になってるので、実行してみる。

$ dvipdfmx hoge.dvi
hoge.dvi -> hoge.pdf
[1][2][3][4][5][6][7][8][9][10]
5443026 bytes written

できた。

残留してみよう

現在、3日連続で大学の研究室内で寝泊まりしている。
よく大学で何をやっているのか、などを聞かれるのだがみなさんが想像している以上に大学院生は忙しくはない。と思ってる。院生の授業は週に5コマ程度しかなく、それ以外の時間を研究に充てる。進捗は求められるが、場所は選べる。また、研究室と企業との共同研究などの仕事を学生も手伝うため、そこで給料も発生する。
ただ、論文提出やプロジェクト実装などの業務内容的に、どうしても締め切りに追われる毎日のため直前期にはよく大学に泊まる。あと自分は埼玉から神奈川まで2.5時間かけて通学しているためめんどくさくて帰らない日もある。しかし、布団はもちろんIHや電子レンジ、冷蔵庫、シャワーも完備されているので不自由は特になく生活できる。
現在3日連続で自分が泊まっているのは、4つくらいの仕事が同時に、しかも別々の方向から降ってきたからである。しかし社会人はもっと理不尽な仕事が降ってくると認識しているので、まあ練習だと思っている。

弊大学では大学に寝泊まりすることを「残留」と呼ぶ。
他大学ではラボ泊と言ったり各々文化によって様々な呼称があるが、我々は残留おじさんと呼ばれる(勝手に呼んでる)見回り警備員が研究室にやってきたら、残留届というものを提出しなければならない。残留という言葉はガイダンスにも載っている、大学公認の呼称である。残留届はオンライン提出も可能であり、よく残留する人はスクリプトを書いて自動提出するのが我々の研究室のポリシーみたいになっている。また、大学には週7で研究室に寝泊まりし、Amazonからの宅配も全て大学に届ける猛者もいる。過去には大学に現住所を移した人もいるとかいないとか。
あ、そういえば昨夜ピザを注文したのだが、これも毎度研究室の部屋まで届けてくれる。大学関係者以外の方も学生に忖度してくれる、地域密着型キャンパスなのである。
他にも、弊大学はよくグローバルキャンパス的な扱いをされることがある。理由は単純に外国人留学生が多いからで、決して学生が英語を話せるわけではない。(自分もその1人)
しかし大学の授業は年末は12/27まであり、年始は1/7からある。しかも12/24のクリスマスイブは祝日にも関わらず授業がある。
クリスマスから年始にかけて家族で過ごす文化が根強い留学生を全く配慮してないスケジュールなのである。これがグローバルキャンパスだ、はっきりわかんだかんね。

なんだかんだ言って、埼玉から神奈川の僻地まで4年以上通学しているのは自分でも感激する。残りの学生生活は就活やら修論やらで、楽しめるのだろうか。

振られた仕事が多くて、現実逃避のために思いついたことや自分の生活についてなんとなく書いてみたが、案外こういう話もいい気がしてきた。普段文章を書くのが下手なので練習がてらにもう少し継続してみたい。

サブスクのコスパを検証しよう

サブスクコンテンツが隆盛を極める時代だが、自分も入会数が増えてきたので精査してみる。

入会コンテンツ(月額費)

明らかに多い。月額5,000円以上払ってる。アマプラやAppleMusicやNewsPicksは学生プランだとしても、入りすぎた感。 一つずつ精査してみる。

Amazon Prime

Amazon Student会員なので年会費が1,900円。 プライム・ビデオでバチェラージャパンなどのコンテンツも視聴する上、通常514円かかる当日お急ぎ便も無料なので毎週のようにAmazonで本や生活用品を購入している。 しかも本はStudentだと10%のポイントが付く。3冊以上買うとさらに3%のポイントが付くので13%還元される。
まじでコスパ最強。実質タダ。継続確定。

Apple Music

いろんな音楽ストリーミングサービスがあるが、自分はiOSユーザなのと学割があるので入会した。 こちらも一般980円のところ学割で半額以下になる。 もうCDは買わない時代だし(ヲタクなので買うけど)YouTube音源を落として聴いてる人がもう軽蔑される時代。これかSpotifyにはほとんどの人が入ってるんじゃないのかな。
コスパ最強。実質タダ。継続確定。

NewsPicks

最近入会した。学割でこちらも1,500円が500円になる。オリジナルコンテンツが面白いし、動画はローカルに落として観れるので移動中にも便利。 ニュースもお金を払ってるので自然と見るようになったので意識高い系になれそうな感じする。
コスパまあまあ。実質タダ。継続確定。

Kindle Unlimited

3ヶ月で99円!みたいなセールをやってた時に入会したら、一度体験入会していたせいで正規料金の980円で入会させられた。まじ騙された。 でもなんだかんだ技術書とかは充実してるし、読みたい本は月に1冊以上あるので本を買うよりは安い。ってかなんでこれは学割ないんだ。
コスパは元取れるくらい。まあ継続確定。

Netflix

TSUTAYAで旧作が100円だとしたら、月に10本観れば元が取れる計算。 明らかに10本観てない。たまーに新作の映画を観るのと、シン・ゴジラとかの好きなシーンとかを何度も繰り返し観るくらいの活用しかできてない。石原さとみの「GOD」のダブルクォーテーションジェスチャーのところは50回くらい見たので実質タダなのかもしれないが、元は取れてない気がする。
しかし、ネトフリはアカウント共有が可能で、現在は2人で自分のアカウントを共有しているので自分の都合でやめることができない。お金払ってるの俺なのにな。
継続確定。

DAZN

月額費がこの中では一番高い。でもJリーグだけで元取れるのに、リーガやプレミア、CLまでリアルタイムで観れるので正直コンテンツの単価では一番コスパいいと思う。人によって価値観は違うけどね。
圧倒的に継続確定。

退会するものなかった。月額5,000円でもそれなりにリターンがあるのでまあいいや。

YouTubeチャンネルの動画を自動で全保存してみよう

先日、僕が応援する某アイドルのシンガーソングライター名義でのYouTubeチャンネルが大人の事情で削除されるかもしれないという情報を聞きつけ、消される前に動画を全保存しなければ。という使命感に駆られました。
また最近では、そのアイドルグループのMVやライブ映像もメジャーデビューに先駆け(?)削除されたり、静岡朝日SunsetTVで配信されている僕が好きなコンテンツの「Aマッソのゲラニチョビ」がプロデューサーの逮捕により全削除されたりと(現在は一部復活)、YouTube上の動画もいつ見れなくなるかわからない状況です。

Clipboxとかの既存ダウンロードツールもありますが、一つ一つやるの億劫なので自動化しようと思い、そのメモです。

こちらを参考にさせていただきました。
PythonでYoutubeの動画をダウンロードするまで(2017/11/30現在)


私的利用のためのダウンロードであり、再配布やアップロードなどの法的悪用をするつもりはありませんのでご留意ください。

YouTubeチャンネルの動画リスト抽出

YouTube Data API (v3)のSearch APIを用いることでキーワード検索やチャンネル検索などいろいろできました。
公式ドキュメントにサンプルコードがあったので、そのまま流用。
https://developers.google.com/youtube/v3/code_samples/python#search_by_keyword

パラメータにChannelIDを指定するだけで、そのチャンネルから投稿された動画をlistで返してくれます。


ChannelIDは
https://www.youtube.com/channel/XXXXXXXXX
のXXX部分に該当します。


また、一回のリクエストで50件しか取得できない問題があるので、それ以上動画投稿してるチャンネルとかだと繰り返し処理する必要があります。
search APIを投げた際に指定した件数(maxResults)以上の件数動画が存在する場合はnextPageTokenというパラメータが帰って来るので、リクエストパラメータのpagetokenに指定して再帰的に処理することで全件取得しました。

この辺はこちらを参考にしました。500件以上だとできない問題あるらしいけど今回僕の対象はそこまで動画が多くないので今は無視。
YouTubeの特定のチャンネルに紐付く動画を取得する。(YouTube Data API (v3) Search)

from apiclient.discovery import build
from oauth2client.tools import argparser

DEVELOPER_KEY = "自分のキー"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"
ChannelId = "UC7MyccaiE4MYa9ERzqZYY4Q" #チャンネルID
videos = [] #videoURLを格納する配列

def youtube_search(pagetoken):
  youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
    developerKey=DEVELOPER_KEY)

  search_response = youtube.search().list(
    # q=options.q,
    part="snippet",
    channelId= ChannelId,
    maxResults=50,
    order="date", #日付順にソート
    pageToken=pagetoken #再帰的に指定
  ).execute()


  for search_result in search_response.get("items", []):
    if search_result["id"]["kind"] == "youtube#video":
      videos.append(search_result["id"]["videoId"])

  try:
      nextPagetoken =  search_response["nextPageToken"] #nextPageTokenが返ってくる限り処理を繰り返す
      youtube_search(nextPagetoken)
  except:
      return

YouTube動画の保存

Pythonにはpytubeというモジュールがあり、これがURLを引数に指定するだけで保存してくれる超優れものだったので使用しました。
ネット環境にも依存しますが、5分の動画を30秒くらいで保存してくれるのでまじ速い。もっと早く使えばよかったと思いました。

from pytube import YouTube

def save_video(search_list):
    for ID in search_list:
        query = 'https://www.youtube.com/watch?v=' + ID
        print(query+"を保存")
        yt = YouTube(query)
        yt.streams.filter(subtype='mp4').first().download("./videos")


これらを実行すると、

https://www.youtube.com/watch?v=PhYT-_l2lMkを保存
https://www.youtube.com/watch?v=Ty0J4YL9BwYを保存
https://www.youtube.com/watch?v=zBrA2nztpu8を保存
・
・
・

みたいに自動でチャンネル内全ての動画がローカルに保存されます。やったね。

最後に

僕は在宅時代、このシンガーソングライターさんのYouTube動画を見て、ライブ反省会と題した動画の中で自らのことをいちいちブスだの可愛いだのと一喜一憂する姿がとても人間味があって面白い人だなと感じ、彼女が所属するアイドル現場に足を運ぶきっかけとなりました。
このご時世YouTubeなどによる影響力はものすごいし、無料コンテンツながらもバタフライエフェクト的に経済を回していると思います。ですので、素晴らしい動画コンテンツが大人の事情で削除されるのは非常に勿体無いなぁと思いつつ、今回自動ダウンロードを試みました。
法律に詳しくないのでYouTubeなどの無料コンテンツは私的利用のためのダウンロードなら可能という認識ですが、間違っていたらご指摘ください。

Twitterのツイート情報から生活リズムを把握しよう

僕が応援するフィロソフィーのダンスというアイドルグループの十束おとはさん(以下、おとはす)が以前、こんなツイートをしていました。


このツイートを見てから、目には目を歯に歯を!的な精神でおとはすの生活リズムをツイート情報から定量的に把握できないかな、と思い生活リズムの把握を試みました。

※興味本位なものであり、決して悪用目的やプライバシーを侵害する事が目的ではありません。


ツイート投稿時間からの把握

まずはツイート投稿時間をプロットして、何時くらいのツイートが多いのか見てみようと思いました。
TwitterAPIでは一回のリクエストで200件のツイートが取得できるので、API制限上で取得可能な上限の3200件を取得するために16回同じ処理を回します。投稿時間はGETメソッドを用いてstatuses/user_timeline.jsonの"created_at"から取得可能です。

APIを使用するにあたりOAuth認証周りがめんどくさいのでRequests-OAuthlib というライブラリを使用しました。以下参考。
Python で Twitter API にアクセス

from requests_oauthlib import OAuth1Session
import json
import config

#対象者のTwitterID
screen_name = "ttk_philosophy"

def get_all_tweets():
        #config.py に取得したキーなどを登録しておく
	CK = config.CONSUMER_KEY
	CS = config.CONSUMER_SECRET
	AT = config.ACCESS_TOKEN
	ATS = config.ACCESS_TOKEN_SECRET

	# OAuth認証
	twitter = OAuth1Session(CK, CS, AT, ATS)
	#timelineのURL
	url = "https://api.twitter.com/1.1/statuses/user_timeline.json"
	
	max_id = None
	timeCounter = [0 for i in range(24)]
	for i in range(16):
		#パラメータ指定
		params = {"count" : 200 ,"screen_name": screen_name,"max_id":max_id}
		req = twitter.get(url, params = params)
		# レスポンスを確認
		if req.status_code == 200:
			tweets = json.loads(req.text)
			max_id = tweets[-1]["id"]-1
			for tweet in tweets:
		                # TimeZoneをAsia/Tokyoにする
				time = tweet["created_at"].split()
				hour = int(time[3][0:2])+9
				hour = hour -24 if hour >= 24 else hour
				timeCounter[hour]+=1
		else:
			print ("Error: %d" % req.status_code)
	return timeCounter


def plot_bar_chart(x,y):
	plt.title(screen_name+type) #タイトル
	plt.bar(x,y,color="gold",alpha=0.7) #カラー指定してbar plot
	plt.xticks(x)  #x軸目盛
	plt.ylim([0,600])  #y軸目盛
	plt.xlabel('Hour')
	plt.ylabel('Tweets')
	plt.savefig(screen_name+".png") #画像として保存


if __name__ == '__main__':
	x_axis = range(24)
	y_axis = get_all_tweet()
        plot_bar_chart(x_axis,y_axis)


max_idを指定することで直前の処理で取得した最後のツイートの一個前のツイートから取得することが可能です。
取得した3200件のツイートを1時間毎のツイート投稿時間を棒グラフにしてみます。可視化ライブラリはmatplotlibを使用しました。


予想

おとはすさんはアイドルの中でも割と早寝早起きタイプだと思われます。以前、他のメンバーから「おとちゃんはゲーマーなのに早寝早起きだからLINE送っても早朝に返信が来る」的なことを聞いたことがあったので、深夜のツイートは少ないと予測しました。

結果

f:id:shin_nandesu:20180612102131p:plain

な、なんと規則正しい生活...!
深夜3時以降のツイートはほとんどなく、8時台から朝のツイートをし始めている!
アイドルでゲーマーという、なんとも不規則そうな生活を送っているのに早寝早起きをしているおとはすはエライ!


ツイート内容からの把握

おとはすさんのツイート内容には、就寝時と起床時の一貫したルールが存在します。

・起床時


・就寝時



このように、朝一番のツイートには「おはす〜」、寝る前のツイートには「おやはす〜」という文字列が混在していることがわかります。
これらは、朝の挨拶の「おはよう」及び就寝時の挨拶の「おやすみ」に愛称である「おとはす」の"はす"の部分を結合したものでありマス!説明不要だと思いますが!



そのため、先ほど取得した3200件のツイートから「おはす」「おやはす」という文字列が混在するツイートをフィルタリングして、起床時間と就寝時間を見てみたいと思います。

ちなみに、午前中にツイートをせず昼を迎えた場合には「昼はす〜」という固有の挨拶も存在しますが、割愛しました。

結果

起床時と就寝時のツイートをプロットし、平均時間を算出しました。

・起床時のツイート時間
f:id:shin_nandesu:20180612230733p:plain

#起床ツイートの平均時間 10:31:47

・就寝時のツイート時間
f:id:shin_nandesu:20180612230737p:plain

#就寝ツイートの平均時間 0:54:17

以上の結果から、おとはすさんは、平均として10時31分47秒くらいに「おはす〜」を投稿し、0時54分17秒あたりに「おやはす〜」を投稿することが分かりました。
素晴らしく規則正しい生活、見習いたいです。

まとめ

興味本位で生活リズムを把握を試みましたが、予想通りと言えば予想通りの結果が現れました。
今回分析の対象とさせてくれた十束おとはさんには大変感謝しています。
ちなみにおとはすさんははてなブロガーなので、こちらもぜひ。
otohatotsuka.hatenablog.com