ふしみのブログ

英語と旅行のノート

『シュガー・ラッシュ: オンライン』字幕版を見る前におさらいすべき英単語5つ

シュガー・ラッシュ: オンライン』にはカジュアルな表現や言葉遊びが多く、プロット上のキーワードとなっているものもある。辞書的な意味以外のニュアンスを含めて知っておくと、より楽しめると思った5つの英単語をネタバレを避けてまとめてみた。

insecure = 自信がない / 安全でない

1 〖通例be 【容姿・能力・状況などに】自信がない, 不安である «about» feel insecure about the future 将来に不安を感じる. 2 〈仕事・投資などが〉不安定な, 保証のない; 〈物が〉崩れやすい, ぐらぐらした an insecure network 危険性の高いネットワーク.

"insecurity" の形でも使われるので、先に"セキュリティ"を連想してしまうが、"a secure job" (安定した職)、 "a secure politian" (自信のある政治家) のように使われる "secure" の反対語として「不安定な」「自信がない」で使われることの方が多いようだ。

「脆弱な, 安全でない」という意味は英和にはなく、英英辞典では "lack of protection" という語義が2番目に紹介されている。

1 uncertainty or anxiety about oneself; lack of confidence: she had a deep sense of insecurity | he's plagued with insecurities. 2 the state of being open to danger or threat; lack of protection: growing job insecurity | the insecurity of wireless networks.

needy, clingy = 重い (人間関係的に)

動詞 "need" (必要だ), "cling" (しがみつく、こだわる) から。依存的な恋人や、甘えん坊の子供を表現するのによく使われる。

1 貧乏な, 窮迫している(poor); ;〖the ; 名詞的に; 集合的に; 複数扱い〗貧しい人々a needy family貧困家庭. 2 愛情に飢えた.

1 ⦅通例非難して⦆(他人に)頼りすぎる, 依存心の強い. 2 〈服・布などが〉体にぴったりした, まとわりつく.

hinative.com

slaughter = 虐殺

本来は "slaughter of Jews by the Nazis" (ユダヤ人虐殺) などで使われるフォーマルな言葉。

steering wheel = ハンドル

a wheel とも。a handle = ドアなどの取っ手 (丸いドアノブではない、掴む部分があるもの) のこと。バイクや自転車のハンドルは a handlebar。

ditch = サボる, すっぽかす

名詞では溝という意味。動詞では授業をサボる (ditch a class)、デートをすっぽかす (ditch a date) など。

 

出典: ウィズダム英和辞典 / ウィズダム和英辞典, New Oxford American Dictionary

 

in-movies.com

2018年に食べたパフェを振り返る

今年もパフェを食べ続けた。平年よりわりと多く足を運んだつもりだったけど、これでも13店舗15本。2019年もパフェを食べるぞ。

  • 広島・宮島口 古今果
  • 渋谷 SILKREAM
  • 日比谷 林屋新兵衛 (日比谷ミッドタウン)
  • 友人宅 自作パフェ
  • 逗子 ハチドリ
  • 詳細不明 いちじくとチーズケーキのパフェ
  • 渋谷 夜パフェ専門店 パフェテリア・ベル
  • 中目黒 green bean to bar
  • 自宅 いちじくのパフェ・マンゴーのパフェ
  • 等々力 D&D DEPARTMENT 栗のパフェ
  • 等々力 パティスリー アサコ・イワヤナギ
  • 銀座 BISTRO MARX (GINZA SIX 7階)
  • 浅草 フルーツパーラーゴトー

広島・宮島口 古今果

続きを読む

2018年のサブスクリプションを振り返る

月額料金を払ったものを振り返る。

途中でやめたもの

DMM英会話 (月額15,800円)

ネイティブプラン。少し高いので1ヶ月と期限を決めて契約し、15レッスンくらい受けた気がする。

普通のプランはインド・フィリピン訛りを強く感じること、また趣味や話題が合わない(?)ようなことがたまにあった。課金の価値はあったと思うが、少なくとも10レッスンくらいはやらないと割には合わないかも。

eikaiwa.dmm.com

Spotify (月額980円)

乗り換えを検討するためにアイスランド旅行前後の1ヶ月だけ契約したけど、結局プレイリストの移行が面倒で戻った気がする。

www.spotify.com

リネット

結局配送・受け取りがめんどうで使わなかった。宅配ボックスがあるなら使ってもよかったかも。

www.lenet.jp

dアニメストア (月額432円)

アイカツ4thシーズンを見返すために契約した。解約し忘れて2,3ヶ月くらい課金されてしまった。

 

1年間継続したもの

iTunes Music (月額980円)

結局もどってきた。

Amazonプライム (年額3,900円)

プライムの即日配送よりPrime Now + Prime ビデオにお世話になった1年。

Kindle Unlimited Reading (月額1,000円)

読みたい本があるときだけ1ヶ月単位で契約することにしている (契約した直後に解約申し込みすれば翌月自動的に必ず解約される)。だいたい1ヶ月の間で20-30冊くらいの雑誌や本を読むので元は十分取れてるんだけど、Amazonの購入履歴のような読書ログが自動的に付くわけではないのが困り物。

Netflix (月額980円)

IIJ mio (月額2,734円)

So-net NURO光 (月額4,972円)

夜でも実測1Gbps出るやばい光回線。以前契約していたY!BBでは1Mbps切る時間もあったので実に1,000倍速になった。

カード年会費

JAL CLUB EST (年額2,160+5,400=7,560円)

個人的にはラウンジサービスにはあまり価値を感じないけど、付加的に得られたショッピングマイルで帰省の飛行機が取れるのが便利。

J-WEST エクスプレスカード (年額1,000円) 

乗車日の3日前までの予約で東京〜岡山は3000円弱割引になるほか、Web上での当日キャンセルでも310円というフレキシブルさが助かっている。

最近モバイルSuicaを使ったエクスプレス予約ができるようになったので、割引が必要ないor確実に使うかどうかわからなければそちらでも十分かも。

www.jr-odekake.net

 

アイスランドでドライブすると最高

 

今年の夏にアイスランドを旅行した時の車載カメラの映像を編集してみた。最高なので観てください。

www.youtube.com

 

後半の夕日のカットだけ伸ばしたものはこちら。

www.youtube.com

 

この記事は ふしみ Advent Calendar 2018 の13日目の記事です。

英会話レッスンの虚無から逃れよう (主にエンジニア・IT系向け)

英会話の練習は難しい。

私は外資企業でエンジニアとして働いている。留学経験なし、チームでは唯一の日本人なので、英語からの逃げ場はない。幸いビジネス英会話のレッスンには補助が出るので、GABAやベルリッツなどの対面英会話、Skypeを使ったDMM英会話やレアジョブ、Bizmates等の英会話教室をいろいろと試してみたのだけれど、なかなか意味のある練習をできているという実感や、続けるモチベーションが得られなかった。

そんな中で、最大限「自分の考えを自分の言葉で説明する」練習に活かす方法を見つけたので紹介してみる。それは「自分で教材を持っていく」というものだ。

この記事はふしみ Advent Calendar の12日目です。

続きを読む

年末年始の新幹線をPythonで予約する

年末年始の新幹線はすぐに予約で一杯になってしまう。最近はエクスプレス予約のWebサイトを使えばスマホやPCから即時予約できるようになったが、年末年始の「都合が変わって1週間前など新幹線を予約したい」みたいな状況では難しい。ぼくはエクスプレス予約の割引額が増えるJ-WESTカードを持っているのだけど、特にキャンセル待ちなどに優遇があるわけではないので、CYBER STATIONという空席確認Webサイトでじっといい時間の空席が現れるのを待つしかない。

f:id:rfushimi:20181226221611p:plain

というわけでPythonで解決しよう。 この記事は ふしみ Advent Calendar の10日目の記事です。

CYBER STATIONは (見た目的にも) パースがとても簡単そうなので、素直なスクレイピングが通用しそうだ。予約サイト (エクスプレス予約) は自動操作が難しそうだが、Pythonに空席状況を監視してもらって、空席が見つかった瞬間に教えてもらえれば自分で予約できるだろう。

  1. HTTPアクセスで空席を確認する
  2. 空席があれば say コマンドを使って読み上げる
  3. 空席がなければ1時間ずらして繰り返し

こんな感じでやってみよう。

まず、CYBER STATIONにアクセスした時にブラウザがどんなリクエストを送っているか確認してみる。

Host: www1.jr.cyberstation.ne.jp
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Origin: http://www1.jr.cyberstation.ne.jp
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://www1.jr.cyberstation.ne.jp/csws/Vacancy.do
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9,ja-JP;q=0.8,ja;q=0.7
Cookie: JSESSIONID=379D37FA287B0B5DF6B2D203DAEB2D53

予約状況を確認するだけのサイトなのに Cookie が必要みたいだ。しかもこのJSESSIONIDはアクセスごとに変わるらしい。レスポンス内のCookieを次回リクエスト時に正しくセットされていないとエラーになってしまう。

ヘッダを組み立てる。HTTPリクエストには requests 、パースには PyQuery を使うことにする。

from pyquery import PyQuery
import time
import requests
import subprocess

HEADER = '''\
Host: www1.jr.cyberstation.ne.jp
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Origin: http://www1.jr.cyberstation.ne.jp
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://www1.jr.cyberstation.ne.jp/csws/Vacancy.do
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9,ja-JP;q=0.8,ja;q=0.7
Cookie: JSESSIONID=379D37FA287B0B5DF6B2D203DAEB2D53\
'''

headers = dict([tuple(line.split(': ')) for line in HEADER.split('\n')])

リクエストボディはこんな感じ。

month=12&day=29&hour=09&minute=10&train=1&dep_stn=%93%8C%8B%9E&arr_stn=%89%AA%8ER&dep_stnpb=4000&arr_stnpb=6200&stn=4000&stn=6200&script=1

trainが列車種別 (東海道新幹線は1)、stnpbというのが駅コード (正確にはJR駅名コード) を表しているらしい。

url = 'http://www1.jr.cyberstation.ne.jp/csws/Vacancy.do'
body = {
    'month': '12',
    'day': '29',
    'hour': '09',
    'minute': '10',
    'train': '1',
    'dep_stn': '岡山',
    'arr_stn': '東京',
    'dep_stnpb': '6200', #出発駅コード
    'arr_stnpb': '4000', #到着駅コード
    'stn': '4000', #到着駅コード
    'script': '1'
}

主要な駅コードはこちら (出典)。

1000 函館
1065 札幌
2100 仙台
2150 盛岡
2300 秋田
3000 水上
3200 新潟
4000 東京
4050 横浜
4115 新宿
4320 大宮
4300 上野
5100 名古屋
5500 長野
6000 彦根
6050 京都
6100 新大阪
6110 大阪
6200 岡山
6500 鳥取
7000 高松
8100 広島
9000 門司港
9010 小倉
9050 博多
9100 熊本
9400 宮崎
9171 鹿児島中央

検索の開始時間 (8時なら hour = 8)、Cookie (生データ、上の例なら JSESSIONID=379D37FA287B0B5DF6B2D203DAEB2D53) を取ってリクエストを送り、レスポンスボディと次回リクエスト用のCookieを返す関数を書く。

def req(hour, cookie):
    headers['Cookie'] = cookie
    body['hour'] = ('0' + str(hour))[-2:]
    response = requests.post(url=baseurl, params=body, headers=headers, timeout=3)
    cookie = response.headers['Set-Cookie']
    return response.text, cookie

DOMツリーを眼力でパースしてみると、1つ目のtableの中に1つだけtableがあり、更にtableがあり、その中のtrタグが1本の列車に対応している。4行目から15行目までが列車情報のようだ。

f:id:rfushimi:20181226233627p:plain

PyQueryはjQueryと同じように、つまりCSSとほぼ同じ記法で書ける。

pyquery: a jquery-like library for python — pyquery 1.2.4 documentation

trs = pq(pq.find('table')[0]).find('table').find('table').find('tr')[4:16]
# 1回だけ空のCookieでリクエストを送りCookieを取得する
_, cookie = req(6, '')
while True:
    for hour in range(6, 15):
        try:
            text, cookie = req(hour, cookie)
        except:
            # タイムアウトしたら10秒待ってもういちど
            time.sleep(10)
            continue
        pq = PyQuery(text, parser='html')
        trs = pq(pq.find('table')[0]).find('table').find('table').find('tr')[4:16]
        for train in trs:
            tds = pq(train).find('td')
            # 列車名 出発時刻 普通車空き状況 グリーン車空き状況
            name = pq(tds[0]).text()
            departure = pq(tds[1]).text()
            futsu = pq(tds[3]).text()
            green = pq(tds[5]).text()
            if (futsu != '×'):
                say("普通車に空席があります: %s, %s" % (departure, name))
            if (green != '×'):
                say("グリーン車に空席があります: %s, %s" % (departure, name))
        time.sleep(5)

スクレイピングのマナーとして、必ずリクエストの間には充分な間隔を開けよう。 1回のレスポンス

sayは空席を見つけたらTTSで教えてくれる関数。

def say(text):
    print(text)
    subprocess.call('say "%s"' % text, shell=True)

見つかったらこんな感じで教えてくれる。

普通車に空席があります: 13:50, のぞみ113号
普通車に空席があります: 13:50, のぞみ113号
普通車に空席があります: 13:50, のぞみ113号

いつでもエクスプレス予約で予約ができるようにしておいて、Netflixでも観ながらのんびり待つとよいだろう。今回は12月29日(土)13時50分東京発というおそらくかなり人気が高そうなチケットを予約することができた。

adventar.org

友人関係をつなごう

ブログのネタに困っていたら質問をもらったので書いてみます。おそらくイベントというのは料理パーティとか旅行とかどこか遊びに行ったりとかのことを指していると思うので、それを前提にします。

この記事はふしみ Advent Calendar の10日目の記事です。

 

 

(うまくいきそうなら) 友人をマージしてみよう

正直そこまで多くの人に好かれるというか、友人が多いタイプではないと思うのだけど、思いついたイベントをいろいろと実行できているのは「ふしみの友人同士が(何故か)だいたい知り合い」という関係を維持できているからかもしれない。おそらく年に5-6回開催してるホームパーティのおかげで、仲のいい大学の友人やサークルの友人同士、さらには同僚たちが知り合いになってくれたので、楽しいことをやるときにクラスタをまたがって人を誘いやすくなったのだと思う。

 

果たしてこれが他の人にも適用可能な話なのかはちょっとわからないけど、社会人ともなると中々忙しく予定の調整もつけづらくなるのは確かである。「あるグループでやりたいことを考える」よりも、「やりたいこと (ex. 料理, 旅行)」を中心にグループをまたがって気の合いそうな友人たちを引き合わせてみると意外とうまくいく、ということもあるのではないだろうか。

 

なかなか強引な話に聞こえるけど、実は多少の理屈もある。

実際のところその2人は「今まであなたと友人関係を続けている」という点において、何かしらの共鳴する雰囲気を持っているという点で、全くランダムに選んだ2人に比べて「意外と話が合う」という可能性は高いからだ。

○○のグループ、××のグループのみんなを知っているあなただからこそ、「実はこの2人は気が合うのではないか」という引き合わせができる組み合わせを探してみればよい。その2人を引き合わせたら、あとはその人達を媒介に他の人も誘いやすくなる。

 

実のところ、昔から続いている友人関係っていわゆる「いつものメンバー」が段々と強固なものになって長く残っていることが多い。気は合うけれど、意外と (特に学科や部活で会った友人なんかだと) それぞれの最大公約数的な趣味や仕事の話題が残ってないことも多いのだ。あんなにいつも同じ時間を過ごしたのに、卒業・退職などで少し離れたとたん会わなくなる友人グループも多いと思うのはそういう理由もあるだろう。

そういったグループよりも、「この人はこの雰囲気を楽しめそうだ」「この人はこのノリは苦手そうだ」というのを意識してあなたが引き合わせたグループのほうが、意外と細く長く続く友人関係を構築できる、というのもあり得る話ではないだろうか。

 

ただしこの方法のデメリット?として、自分をおいて勝手に仲良くなって遊びに行ってしまう、という可能性もある。嬉しくもあり寂しい。

 

 

写真は本文と関係ないモロッコの仮面です。