HAVRMの空空活動誌

「空空」は「うつらうつら」と読むらしいです.まぁ常に寝不足なもんで...

Slack Botの製作 ~2:よくわからないけど受信してみる~

こんにちは.
HAVRMです.

Slack botの作成の二回目です.前回は文字の送信だけ行いました.
havrm.hatenablog.com
今回はとりあえずShellScriptで受信してみます(他の言語で用意されたライブラリ等使った方が圧倒的に楽だと思います(ブログとかにまとめてあるので)が,やはりShellScriptでやります).
なお前回言ってませんでしたが今回はWindows Subsystem for Linux(WSL)でUbuntu 18.04 LTSを起動して行っています.

とりあえず受信する

URL取得

今回botで使うAPIはReal Time Messageing API(以降RTM API)です.このAPIの場合,固有IPアドレスは不要で受信できますが,起動中はWeb Socketを使って受信し続ける必要があります.Slackのドキュメントとか知識不足で苦労しながら読んだところRTM APIで受信するためにはrtm.connectメソッドを送ってURLを得る必要があります.
ということでとりあえず送信します.

curl -s -X GET -H 'Content-Type:application/json' -H 'Authorization: Bearer <トークンID>' https://slack.com/api/rtm.connect

これを送信すると次のようなデータがJSONで帰ってきます(jqコマンド*1で整えてます).

{
  "ok": true,
  "url": "<URL>",
  "team": {
    "id": "<ワークスペースID>",
    "name": "<ワークスペース名>",
    "domain": "<ワークスペースドメイン(hoge.slack.comのhoge)>"
  },
  "self": {
    "id": "<botのID>",
    "name": "<bot名>"
  }
}

この2行目にあるURLを使います.

Web Socketで読んでみる

ということでこのURLでアクセスすればいいです.URLは30秒しか有効でないので発行したらすぐに接続する必要があります.簡単に確認するにはwscatコマンド*2で見ることができます.コマンドは次のようにします.

wscat <URL>

ということで何のひねりもないコマンドで読むことができます.送信されるデータはJSONです.次のような感じに帰ってきます.

connected (press CTRL+C to quit)
< {"type": "hello"}
< ...
< {"type": "goodbye", "source": "gateway_server"}
disconnected

接続成功時に type:hello が,自動で閉じられるときは type:goodbye が来るようです.イベントが発生するごとにJSONが届きます.botで受け取れるイベントは公式サイトにまとめてあります.
api.slack.com

事前に見ていた時は数秒間に一回送信しないといけない(ダミー用にpingがある)みたいに書いてありましたが(流し読みしていたので違うかもしれません),何もしなくても数時間ぐらいは使えてました.
なお最初接続成功しても,チャンネルの#generalに送信してもイベントをWeb Socketで受信できませんでした.これはbotをチャンネルに招待していなかったので起きたもので,招待すれば普通に読むことができるようになりました.

ShellScriptで読む

ということで受信に成功しました.しかし改めて調べてみるとwscatではShellScriptにデータを渡せないようです.そのため別のツールwebsocatコマンドを使います.

websocatのインストール

websocatはGithubに公開されています.
github.com

いろいろインストール方法等書いてありますが,簡単にパッケージでインストールしましょう.パッケージは次の場所にアップロードされています.
github.com

このうち,websocat_1.5.0_ssl1.1_amd64.deb(2020/4/12現在)をダウンロードし書いてあるようにgdebiコマンド*3でインストールします.

sudo gdebi websocat_1.5.0_ssl1.1_amd64.deb

読むだけならコマンドはwscatと同様に次のようなコマンドで読めます.

websocat <URL>

この時の受信データもwscatと同じですが,標準出力で出力されます.

websocatで読んだデータをshellscriptに渡す.

読んだデータをshellscriptに送信します.以下の返答がまんま答えです参考になります.
stackoverflow.com

個人的な好みとしてShellScriptはファイルとして独立させたいのでこのようにexportは使わないです.ということで受信用のShellScript(read.sh)を作ります.
~/read.sh

#!/bin/bash
A=( "1" "2" "3" "4" "5" )
echo "" > ~/read.txt
for B in "${A[@]}"
do
        read -r LINE
        echo "$B is $LINE" >> ~/read.txt
done
kill "$PPID"

なお最初に空文字をread.txtに上書きしている(echo "" > ~/read.txt)のは中身をクリアするためです.今回はテストのために5回受信すれば終了するようにしています(要するに2回文字を別ユーザが送信すれば終了.helloイベントと,メッセージ送信イベント2回,メッセージ記入中イベント2回).killしているのは親プロセスIDなので終了する形になります.
送信するためのShellScript(connect.sh)としては次のようになります.
~/connect.sh

#!/bin/bash
websocat --text $1 sh-c:'exec bash -c ~/read.sh'

ここで--textのオプションを付けているのは注意されたためです.ShellScript側から送信するデータ形式を指定しろとのことでした.これでこのShellScriptの変数にURLを打てばつなげてくれます.あとread.shのほうが Permission denied されたのでとりあえず両方に実行権限を与えました.

chmod a+x ~/read.sh
chmod a+x ~/connect.sh

これでコマンド次のように実行すると~/read.txtにデータが保存されます.

. connect.sh <URL>

~/read.txt

1 is {"type": "hello"}
2 is {"type":"user_typing","channel":"<チャンネルID>","user":"<ユーザID>"}
3 is {"client_msg_id":"<メッセージID>","suppress_notification":false,"type":"message","text":"a","user":"<ユーザID>","team":"<ワークスペースID>","blocks":[{"type":"rich_text","block_id":"<ブロックID>","elements":[{"type":"rich_text_section","elements":[{"type":"text","text":"a"}]}]}],"source_team":"<ワークスペースID>","user_team":"<ワークスペースID>","channel":"<チャンネルID>","event_ts":"1586667548.012700","ts":"1586667548.012700"}
4 is {"type":"user_typing","channel":"<チャンネルID>","user":"<ユーザID>"}
5 is {"client_msg_id":"<メッセージID>","suppress_notification":false,"type":"message","text":"a","user":"<ユーザID>","team":"<ワークスペースID>","blocks":[{"type":"rich_text","block_id":"<ブロックID>","elements":[{"type":"rich_text_section","elements":[{"type":"text","text":"a"}]}]}],"source_team":"<ワークスペースID>","user_team":"<ワークスペースID>","channel":"<チャンネルID>","event_ts":"1586667549.012900","ts":"1586667549.012900"}

(連続で「a」一文字送信しました)

一連の動作をShellScriptにまとめる

ここまでWeb Socketにつなげるたびに毎回 rtm.connectメソッド を手動で送信しURLをコピーしています.ただひたすらに面倒なのでこのURL抜き出す作業もShellScriptで行いましょう.jqコマンドでJSONから簡単にデータを抜き出すことができます.

curl -s -X GET -H 'Content-Type:application/json' -H 'Authorization: Bearer '<トークンID>' https://slack.com/api/rtm.connect | jq -r '.url'

jqコマンドの -rオプション はダブルクォーテーションを削除するためです.
これを先ほど作った ~/connect.sh に追加すると次のようになります.

#!/bin/bash
URL=$(curl -s -X GET -H 'Content-Type:application/json' -H 'Authorization: Bearer '<トークンID>' https://slack.com/api/rtm.connect | jq -r '.url')
websocat --text $URL sh-c:'exec bash -c ~/read.sh'

これで受信し,ShellScriptで処理するところまでできました.

まとめ

ということでShellScriptでデータを受信し,処理するところまでできました.今後やりたいことなどを整理しながらコードを作っていこうと思います(要するに無計画).

*1:jqコマンドは sudo apt install jq でインストールできます

*2:wscatコマンドは sudo apt install node-ws でインストールできます

*3:gdebiコマンドは sudo apt install gdebi-core でインストールできます

Slack Botの製作 ~1:よくわからないけど送信してみる~

皆さん こんにちは
HAVRMです.

これまでいろいろなプログラムを書いてきましたが,中には数時間かかるものもあります.
これらを放置したまま他の作業や出かけたりすることがあるのですが,途中でエラーを起こしていたりすると結構ショックを受けるものです.処理の結果を何らかの方法でスマホに送信できたらといろいろbotを調べていましたが,そもそもそういったのが使えるツールを使っていないこと(SNSで使っているのはLINEぐらいです...),設定に固定IPアドレスが必要だったりと面倒でした(AWSとかいろいろなサービスがあるのでそれを使うのが大半です).
しかし最近Slackを使いだし,そのbotが簡単に利用できそうだったので,やってみることにしました.
とりあえずやりたいことは次の通りです.

  • プログラム完了時に完了した旨と結果を送信する
  • こちらからメッセージを送信し,それに対して返答をする.

ネットを見てみると専用のSDKBoltRuby等をつかって実装していることが多い?のですが,新たに文法を覚えるのとかめんどい大変なので,いつも使っているShellScriptを使うことにします(無理になったら諦めます).とりあえず今回は送信してみます.

簡単に

Slack Botにはいろいろな種類のbotがあります.種類については以下のサイトが参考になります.
qiita.com
固定IPアドレスが不要で送受信可能なAPIはReal Time Messageing APIなのでこれを使ってみようと思います.

登録

botを使いたいワークスペースに移動します(私はSlackをデスクトップアプリで使用しています).ワークスペースでAppを追加します.

f:id:HAVRM:20200218194630j:plain
App画面
検索で「bots」を調べ,これを追加します.
f:id:HAVRM:20200218195912p:plain
Bots画面
登録後ユーザ名を聞かれるのでユーザ名を適当に入れ,「ボットインテグレーションを追加する」を押して登録します.
f:id:HAVRM:20200218200125p:plain
Botsユーザ名登録
この次の画面でいろいろ登録できますが,とりあえずは変更しなくても大丈夫そうです.ただし,送信時に必要になる「トークン」をどこかにコピーしておきましょう.この「トークン」で識別をするのでこれを漏らすと他人から勝手に送られる可能性があります.
f:id:HAVRM:20200218200608p:plain
ボットインテグレーション
これで登録は終わりです.

コマンドで送信する

次にメッセージをコマンドで送信してみましょう.送信はcurlを使った方法が掲載されているのでそれを見ながら簡単に「hello」と送信してみましょう.
api.slack.com
この方法はWebAPIですが,普通に送れます.ただデータを少し変える必要があります.

チャンネルIDを取得する

まず送信先のチャンネルのIDを取得します.ここではchannels.listメソッドを使います.curlで-Xオプションで「GET」を,-Hオプションでコンテントタイプを「application/x-www-form-urlencoded」,認可を「Bearer <トークンID>」とします.送信先APIのURLを指定します.実際のコードは次のようになります.

curl -X GET -H 'Content-Type:application/x-www-form-urlencoded' -H 'Authorization: Bearer xoxb-...' https://slack.com/api/channels.list

この結果がJSONで帰ってきます.その結果はメソッドのページにありますが,この送信先チャンネル名のIDを記録しておきます.

(2021/5/6追記)
先日このchannels.listメソッドを使ったところ次のようなレスポンスが返ってきました.

{
  "ok":false,
  "error":"method_deprecated",
  "response_metadata":{
    "messages":[
      "[ERROR] This method is retired and can no longer be used. Please use conversations.list or users.conversations instead. Learn more: https://api.slack.com/changelog/2020-01-deprecating-antecedents-to-the-conversations-api."
    ]
  }
}

どうもchannels.listメソッドは使えなくなったようです.
このレスポンスにあるように代わりにconversations.listメソッドを使います.またいろいろなオプションを追加できますが,JSON形式に対応してないそうなのでURLをエンコードするかPOSTボディに埋め込むかしないといけないようです.これを使ってから気づいたのですが,どうもデフォルトだとpublicチャンネルしかリストを取得できないのでprivateチャンネルを読み込むためにはtypes Argumentで記述する必要があります.ここら辺の記述方法がよくわからなかったのですが,conversations.list method | Slackでtypes欄に両方受信する意味の「public_channel,private_channel」を記入し,「Test Method」を選択するとこのオプションを含んだURLが表示されるのでこれを使います.

https://slack.com/api/conversations.list?types=public_channel%2Cprivate_channel&pretty=1

最後の「pretty=1」はなくても動きました.
実際に取得する際はcurlで-Xオプションで「GET」を,-Hオプションでコンテントタイプを「application/x-www-form-urlencoded」,認可を「Bearer <トークンID>」とします.送信先は先ほどのURLを指定します.実際のコードは次のようになります.

curl -X GET -H 'Content-Type:application/x-www-form-urlencoded' -H 'Authorization: Bearer xoxb-...' https://slack.com/api/conversations.list?types=public_channel%2Cprivate_channel

この結果のJSONは前のと同じような内容になります.

{
  "ok": true,
  "channels": [
    {
      "id": "<チャンネルID>",
      "name": "<チャンネル名>",
      "is_channel": true,
      ...
    }
  ]
}

このような感じで帰ってくるのでチャンネル名に対応するチャンネルIDはidの項目のものとなります.

メッセージを送信する

次に送信します.ここではchat.postMessageメソッドを使います.今回は-Xオプションを「POST」,-Hでコンテントタイプを「application/json」,認可を「Bearer <トークンID>」,--dataオプションでJSON形式のデータ,今回は次の形のものを送信します.

{
  "channel":"<チャンネルID>",
  "test":"hello"
}

実際のコードは次のようになります.

curl -X POST -H 'Content-Type:application/json' -H 'Authorization: Bearer xoxb-...' --data '{"channel":"<チャンネルID>","text":"hello"}' https://slack.com/api/chat.postMessage

今回はgeneralのIDに送信したので次のように表示されます.

f:id:HAVRM:20200218203749p:plain
送信結果

まとめ

とりあえず送信だけはできたので今回はここまでとします.この後メッセージ受信に対し返信するコードを作ろうと思います.

Windyのスクリーンセイバーの製作 -2/4-

こんにちは,HAVRMです.

久々にスクリーンセイバーの製作について更新しようと思います.

さて,前回ではWindyのAPIを使ってスクリーンセイバーで表示する画面まで作りました.
havrm.hatenablog.com

つぎはオフライン時の処理を書きます.

はじめに

もう一度スクリーンセイバーの製作について流れを確認しましょう.

  1. Windyを表示できるHTMLを作成する
  2. インターネットに接続していないときの処理を行う ←今ここ
  3. HTMLをEXE化する.この際全画面表示できるようにする
  4. スクリーンセイバーを設定する

ということでオフライン時の処理を考えます.今回作るスクリーンセイバーはインターネットに接続してないと当然のことながら気象状況が表示されません.実際にやってみるとわかるのですが,今のソースの場合では背景の黒色のみ表示されます.当然オフライン時にPCを使い,スクリーンセイバーが起動するほど放置することもあると思います.その時に黒一色だと味気ないのでその時の処理を書いていきます.

作りたいスクリーンセイバー

とりあえず,スクリーンセイバーのデザインです.
今回作るスクリーンセイバーは次のような機能を持つとしていました.

  • 画面いっぱいにWindyの画面を出す
  • 中心は東京あたりに設定し現在の状況を表示する
  • 表示するのは「雨・雷」「風」「気温」「湿度」「気圧」「海流」「波」の7つとし,表示は5秒ごとに自動で切り替わるようにする
  • どのAPIを使っているのかわかるようにする
  • Windyを動かせるようにスクリーンセイバーはボタンを押すことで終了する
  • オフラインの時はWindyが表示できないのでデモンストレーションの動画を再生する
  • 当然スクリーンセイバーなので全画面に表示する

今回は赤文字の実装を行います.

実際にプログラミング

オフラインの認識方法

ということでオフライン時に上にあるように動画を流すとすると,まず何よりもオフラインかどうか認識する必要があります.JavaScriptにはオフラインかどうかを認識できる方法がありますが,もっと簡単にいきましょう.
あらためて現在のコードの最初を見てみましょう

<html>
  <head>
    <script src="https://unpkg.com/leaflet@1.4.0/dist/leaflet.js"></script>
    <script src="https://api4.windy.com/assets/libBoot.js"></script>
      <style>
        <!--省略-->
      </style>
   </head>
   <!--省略-->
</html>

scriptタブでJavaScriptを読み込んでいます.これのソースはインターネットなのでオフラインの場合このインポートから失敗します.ではこのインポートが成功するかどうかでオフラインかどうか認識しましょう.

オフラインを認識するためのコーディング

オフラインの際はそれ専用のページに移動するということにして(というのもその方が楽なので),コーディングをしましょう.
インポートに失敗した場合にある関数を実行する場合には次のように書けます.

<script onerror="hogehoge()" sec="url"></script>

ここでのhogehoge()は関数です.この関数は用意しておく必要があります.
ということでこれを適応しましょう.適応するのはWindyのAPIにしておきましょう.

<html>
  <head>
    <script src="https://unpkg.com/leaflet@1.4.0/dist/leaflet.js"></script>
    <script onerror="offline()" src="https://api4.windy.com/assets/libBoot.js"></script>
      <style>
        <!--省略-->
      </style>
   </head>
   <!--省略-->
</html>

これでオフライン時の認識はできるようになりました.

オフライン時の動作を規定する

上でオフライン時にoffline()という関数を動かすようにできました.しかし,この関数自体が今ないので作る必要があります.この関数では動画を再生可能なoffline.htmlを呼び出します.
ということでコーディングです.新たにscriptタブを作り目的のページに移動するコードを書きます.

    <script>
      function offline() {
        window.location.href = 'offline.html';
      };
    </script>

オフライン用ページの作成

ここまででオフラインを認識し,オフライン用のサイトに跳ぶまでできました.これから跳ぶ先のページを作ります.オフライン用のページではデモンストレーションを表示します.デモンストレーショといってもただの動画なので好きなものにしても問題ないです.
のちにこのHTMLをEXE化する際のソフトの影響で動画の拡張子は.oggとします.他でも大丈夫だった気もしますがちょっと覚えてないです...
実際の写真はこれです.

f:id:HAVRM:20190906144853p:plain
デモンストレーション画像
もとはUbuntuのブラウザ上で表示してそれをrecordmydesktopで保存したものになります.これにWindows Media Makerで文字を埋め込みました.異臭分の動画でこれをひたすら無限ループで再生します.また念のため,動画が再生されない場合のためにこの動画の静止画も用意します.
まぁ,説明はここまでにしてとりあえずソースを見ましょう.

<!DOCTYPE html>

  <body bgcolor="black">
    <video autoplay loop poster="SR_Windy.png" width="100%">
      <source src="SR_Windy.ogg">
    </video>
    <p align="right"><font color="white"><input type="button" value="END" onClick="window.close()"></font></p>
  </body>
</html>

videoタブでは自動スタートを示すautoplay,繰り返しを示すloop,表示されないときの画像を指定するposterで構成します.その中のsourceタブで再生する動画を指定します.あとはこの画面を閉じるためのボタンを作って終わりです.

まとめ

ということでここまで書いてきたコードをまとめましょう.
~本体~

<html>
  <head>
    <script>
	  function offline() {
	    window.location.href = 'offline.html';
	  };
	</script>
    <script src="https://unpkg.com/leaflet@1.4.0/dist/leaflet.js"></script>
    <script onerror="offline()" src="https://api4.windy.com/assets/libBoot.js"></script>
  	<style>
  		#windy {
  			width: 100%;
  			height: 94%;
  		}
  	</style>
  </head>
  <body bgcolor="black">
    <div id="windy"></div>
    <script>
    const options = {
                key: 'your_key',
                verbose: true,
                lat: 38,
                lon: 139.6,
                zoom: 4,
                timestamp: Date.now(),
        }
    windyInit( options, windyAPI => {
        const { store, map } = windyAPI

        var overlays = ['rain','wind','temp','rh','pressure','currents','waves']
        , i = 0
        setInterval( ()=> {
                i = ( i === 6 ? 0 : i + 1)
                store.set('overlay', overlays[ i ])
                store.set('timestamp', Date.now());
        }, 5000)
    })
    </script>
	<p align="right">
	<font color="white"><strong id="lays"></strong>We are using Windy API v4, Leaflet v1.4.0. <input type="button" value="END" onClick="window.close()">
	</font></p>
  </body>
</html>

~オフライン用~

<!DOCTYPE html>

  <body bgcolor="black">
    <video autoplay loop poster="SR_Windy.png" width="100%">
      <source src="SR_Windy.ogg">
    </video>
    <p align="right"><font color="white"><input type="button" value="END" onClick="window.close()"></font></p>
  </body>
</html>

実際に実行するとこうなります.










We are using Windy API v4, Leaflet v1.4.0. 

日本全国鉄道の旅 9冊1綴目 ~渋谷 ⇒ 軽井沢~ 2019.08.11

こんにちは.HAVRMです.
x葉目となっていますが,きちんと昔のを書いて番号がつけれるようになったら修正します.最終回とか,特別版とかいったことはありません.

今回は渋谷駅から軽井沢へ行くルートを載せようと思います.
まずはいつもどおりYahoo!乗り換えアプリのスクショを載せます.

x葉目ルート
と言うことで軽井沢への旅2度目です.
今回は前回と同じルートのためほとんど省略します.前回と異なる点について述べていきます.なお前回は下のリンクです.
havrm.hatenablog.com
なお文章中の金額は税込み(8%)です.

なおこのルートでは事前にJR線の乗車券を購入し乗ったと思います.

渋谷駅での乗換

自分は半蔵門線沿線なので半蔵門から埼京線に乗り換えたのですが,工事中のためかやたら遠回りさせられた気がして,結局乗換に5分以上掛かりました(体感では10分でしたが,実際に時計で見ると5分程度でした).

JR快速アーバン

全部で15両編成だった気がするのだが,先頭の5両は途中の籠原駅までで,籠原で前の車両から乗り換えてくる客が多かったです.車両の電光掲示板に書いてあるので確認してあらかじめ適切な車両に乗っておくとこういった場合に楽です.

高崎駅

高崎駅信越本線に乗り換えるために降りたのだが同じホームから発車する水上行きの電車に乗る人がたくさんいて超混雑していました.しかもトイレも超混雑していてあきらめざるを得なかったです.横川駅でバスに乗るために並ぶことが考えられるため駅降りてからすぐ出たかったのですが,しょうがなく横川駅でトイレに行くことに...

JRバス関東

トイレに行った後バス乗り場に行ったが案の定超並んでいたorz.乗る予定のバスは前回の旧国道の碓氷峠を通るバスではなく,バイパスを通るバスで大き目のバスで次の写真です.

実際に乗ったバス(並んだ時この位置で座れたのは補助席)
乗れはしたが,補助席に座ることになりました.やっぱり全員は乗れず,待つ人も何人か...
バス自体はバイパスの混雑回避のため旧国道を経由して軽井沢に出て,結局2分ほど遅れただけだした.旧道を通ってめがね橋等のバス停に止まるバス(前乗ったやつ)はもう期間限定のバスしかないようで,めがね橋に行ってもまた横川に戻らなきゃいけなさそう...
今度帰りにそのバスに乗って,めがね橋で降りてそこから歩いて横川駅に行くのもいいかもしれない.

軽井沢駅での昼食

予定通り軽井沢に着いたのでここでお昼を食べました.前回は有名な釜飯を食べたのですが,今回は違うのをと言うことで軽井沢駅の北口の駅前の「まるほん食堂」で食べることにしました.

まるほん食堂 外観
隣にもそばのお店があったのだが,少し高く,安いこちらの店にしました.もともとそばを食べるつもりが,かつ丼がおいしそうでつい「かつ丼」(¥850)を注文してしまいました.
まるほん食堂 かつ丼
結構おいしく,量も満足でした.

また夕食が食べれるかわからなかったため,あらかじめ軽食程度に買っておこうと次のブログで紹介されていた南口のすぐ近くにあるアウトレットモール内の「Delifrance 軽井沢店」で「パン・ジャポン」(¥240)と「本格ビーフカレーパン」(¥280)を購入しました.
r.gnavi.co.jp

Delifrance 外観
パン・ジャポン
本格ビーフカレーパン
後で食べたのですが,「パン・ジャポン」は甘すぎることは無く,あんことホイップがマッチしていてとてもおいしく,「カレーパン」は結構辛かったのですが,野菜の旨みなのかとてもおいしかったです.ただ辛いので苦手な方はやめたほうがいい気もします.

店舗詳細

まるほん食堂

正式な名前は「レストラン まるほん」みたいです.
住所:長野県 北佐久郡軽井沢町 軽井沢東 4-5
電話:0267-42-2061
tabelog.com

Delifrance 軽井沢店

お店自体は東京にもあるみたいですが,「パン・ジャポン」は軽井沢限定のようです.
住所:長野県北佐久郡軽井沢町大字軽井沢1178-232 軽井沢プリンスショッピングプラザ ニューウエスト NW-74・75
電話:0267-42-0995
www.karuizawa-psp.jp

日本全国鉄道の旅 4冊1綴目 ~渋谷 ⇒ 軽井沢~ 2017.08.13

こんにちは.HAVRMです.
xx葉目となっていますが,きちんと昔のを書いて番号がつけれるようになったら修正します.最終回とか,特別版とかいったことはありません.

今回は渋谷駅から軽井沢へ行くルートを載せようと思います.
まずはいつもどおりYahoo!乗り換えアプリのスクショを載せます.

xx葉目ルート
と言うことで軽井沢への旅でございます.
日付に着目してください.2年ほど前です.なので現在の時刻表とは異なりますので注意してください.なお,最新の時刻の場合は次のページにあげてあります.
havrm.hatenablog.com
また乗換アプリでも表示できなかった(そりゃそうだ)ので今の時刻表で近いものを作成し,一部修正しています.一部字体が変なのはそのためです.
また当時残したメモもなかなかクソいので思い出しながら書きます.

なおこのルートでは事前にJR線の乗車券を購入し乗ったと思います.

渋谷 ⇒ 赤羽

まずは埼京線です.快速で赤羽まで飛ばします.このとき乗った車両はこちら
と言いたいところですが,写真が見つかりませんorz.
見つかり次第載せます...

赤羽 ⇒ 高崎

次は快速アーバンです.ぐいぐい飛ばして高崎まで.
写真が...

高崎 ⇒ 横川

信越本線は山の中を走るので晴れていれば景色がいいです.なおこれもまた写真が...
なお横川駅にはこの時期SLが止まっており,ちょうど乗っている電車と入れ違いの形で出ることがあるので横川駅に入る直前に進行方向左側を見るとSLが見えるかもしれません.

横川 ⇒ 軽井沢

このときはJRバス関東を使いました.バス自体はこの日は普通の路線バスで旧国道を通りつついくつかのバス停に寄っていくルートでした(今調べなおすとこのルートの便は相当減らされている?).途中いくつかのバス停に寄って人が乗ったり降りたりするはずですが横川駅を出発する時点で車内はこんな感じに...

バス車内の様子
途中バス停は「坂本宿」「くつろぎの郷」「めがね橋」「熊ノ平駐車場」「熊ノ平」ととまるのですが,めがね橋で少し降りた以外は人は降りることなく,めがね橋と駐車場から人が追加で何人か乗れた感じでした.めっちゃ混むので乗りたい場合は早めの行動を...
このバスに乗ったときは運転手か放送で寄るバス停や碓氷峠についての解説をしてくれたのはよかった.当時のメモにも残っているが,たとえば昔鉄道があった時代の架線の名残や碓氷峠のカーブは184個あることなどです.あともしバスに乗る際に席を選べるのであれば次のことを元にどちらに座るか考えてください.進行方向左側の場合は山と反対側になるので道路沿いの木々が晴れるときれいですが,ほぼ木です.進行方向右側は山側になるのですが,昔の鉄道のトンネルなどの遺構が見れます.なおこれは旧国道を通るルートに限った話なのでバイパスを使う場合はわかりません.

軽井沢で昼食

このときは有名な?おぎのやの釜飯を食べました.軽井沢駅の南北をつなぐ連絡通路に釜飯の店舗があり,釜飯の弁当を買えます.私は時間があったので新幹線改札前にある椅子で食べました.

店舗情報

おぎのや 軽井沢駅売店

住所:長野県北佐久郡軽井沢町1178
電話:0267-42-8048
www.oginoya.co.jp

追伸

当時一眼レフで写真を撮っていたはずですが,写真が行方不明です.載せれた写真はiPhoneで撮ったものだったので見つかったのですが...
見つかり次第掲載します.

安い軽井沢への行き方について ~「マツコの知らない世界 乗り換えの世界」をみて~

こんにちは.HAVRMです.

先日(2019年7月30日)に放送された「マツコの知らない世界 乗り換えの世界」をみて思ったことがあったのでいくつか書こうと思います.
マツコの知らない世界」というのはTBSの番組でさまざまなジャンルの人がマツコに自身のジャンル等をプレゼンしていく番組で,なかなか深い話を聞け,またマツコの突っ込みも面白いのでよく見ています.
www.tbs.co.jp

そのうち2019年7月30日に放送された「乗り換えの世界」の中の話を実際に体験したりしたのでいくつか書こうと思いました.
↓その日のアーカイブ
www.tbs.co.jp

渋谷駅の乗り換えについて

私自身は半蔵門線沿線に住んでいることもあり,乗換えで渋谷駅はよく使います.特に副都心線への乗り継ぎをよく行います.この場合,半蔵門線の4号車付近に乗ると副都心への乗換えがとてもスムーズにでき乗り換えアプリで表示される電車の一本前に乗ることができることが多々あります.
今回言いたいのは半蔵門線副都心線の乗換えではなく半蔵門線埼京線の乗り換えです.
昔(渋谷駅の大工事前)に一回使ったことがあったのですが,そのときはそこまで時間がかかるイメージはありませんでした.しかし,今回(2019/8/11)に使ったときはとても遠く感じ,実際に5分以上かかりました.工事の影響で通路が狭くなっているので余計にそう感じたのかもしれないです.

軽井沢への安い行き方について

※ここで表示する時刻は2019/8/11の13時に軽井沢に着く東京駅発の時刻となります.
※乗り換えはiPhone用「Yahoo!乗換案内」アプリで表示しています.個人的に愛用しているので.

Yahoo!乗換案内

Yahoo!乗換案内

  • Yahoo Japan Corp.
  • ナビゲーション
  • 無料
apps.apple.com

軽井沢周辺の鉄道事情

番組の後半で軽井沢への安い行き方について紹介されていました.
実際問題,軽井沢は避暑地であり,また駅のすぐ近くに大きなアウトレットモールがあったりと,観光地としてはいいのですが,鉄道でいこうとした場合北陸新幹線か北から南下するしなの鉄道の2種類しか方法がありません(あくまで鉄道のみの場合です).そのため東京からいく場合,ほぼ北陸新幹線でしかいけず,割高になります.新幹線を使わないようにしつつ鉄道のみで考えた場合,小諸まで上がってしなの鉄道に乗り換えるしかなく東京から6時間以上かかるととても疲れるルートとなります(私個人としては景色もきれいですし長時間乗ること自体は苦とならないので問題ないのですが...).ということで実際にいくつかのルートを比較して見ましょう.それぞれの好みに合ったルートを選びましょう(あくまでこのルートは論外だとか,このルートしかありえんと言うつもりもありません).なお実際に遊ぶ際には車があったほうが楽という意見には賛成ですが,お盆の時期は超絶混んでいて車での移動がままならないこともよくあります(20分で通常いけるところに2時間ほど掛かるなど).特に駅前やその周辺の道路がひどいです.

新幹線ルート(¥5390)

東京から軽井沢まで新幹線で行った場合5390円かかります.

f:id:HAVRM:20190815181614j:plain
新幹線使用時
実際にこのルートだと1時間程度で軽井沢につける上に乗換なしでいいので楽です.しかしお盆の時期で超混んでいることも予想できるし,値段もかかるということで安く行きたいと思う人が多いと思います.

番組紹介ルート(¥5510)

さて気になった番組で実際に紹介されたルートですが,安くいけると言う名目で紹介されたものですが,東京発で見てみるとこうなります.なお13時着で見ていますが,結局ちょうどいい時間が無いようで11時台についています.

f:id:HAVRM:20190815183913j:plain
番組紹介ルート
ここで金額を確認してみましょう.東京発の場合,5510円と新幹線ルートよりも高くなっています.では番組で紹介されたときのように池袋発で見てみましょう.
f:id:HAVRM:20190815184338j:plain
新幹線使用時(池袋発)
f:id:HAVRM:20190815184415j:plain
番組紹介ルート(池袋発)
これで比較してみても新幹線が5180円で番組紹介ルートが5310円と新幹線のほうが安くなります.新幹線ルートの場合でも大宮までは在来線で行っているのでその分安くなったと考えられます.まぁ,とりあえずこのルートだと新幹線より高く,時間も掛かるということがわかりました.ただこのルートだと秩父のほうを通り,長瀞も通るので景色は抜群にいいと思います.このルートがここまで高くなるのは西武鉄道とJRの2つの鉄道会社を使うためと考えられます.

番組紹介安価ルート(¥4810)

上の番組紹介ルートだと途中で有料特急の「特急 ちちぶ」に乗ります.そのためそれを在来線に置き換えるとこのようになります.

f:id:HAVRM:20190815185416j:plain
番組紹介安価ルート
この場合純粋に特急料金700円が引かれた4810円となります.その分30分ほど時間が掛かるようになるので30分と700円どちらをとるかになると思います.ただ,この場合6時より前に東京を出るので個人的には難しい気もします.

番組紹介新幹線多用ルート(¥5170)

番組紹介ルートの場合北陸新幹線をできるだけ使わないように高崎から新幹線に乗っていましたが,その制限を取っ払い,熊谷から乗るとこうなります.

f:id:HAVRM:20190815190044j:plain
番組紹介新幹線多用ルート
この場合,「特急 ちちぶ」を使っていませんが,番組安価ルートと比較して1時間ほど時間短縮できます.この場合,新幹線のみよりも安くまた軽井沢に12時頃着くために東京発が7時半頃なので結構現実的な気がします.また「特急 ちちぶ」をつかうとさらに時間短縮できます(その分700円高くなりますが...).

HAVRM短縮ルート(¥2780)

さて番組で消化されたルートの場合秩父を経由していましたが,今回は最短のルートで行きます.軽井沢の近くにJR信越本線の横川駅があります.昔は横川と軽井沢の間に鉄道があったのですが,今は通ってません.たしか事故とかがけ崩れがあったかなんかだった気がする.廃線跡は横川から歩けるようハイキングコースが整備されていて(アプトの道),有名な?めがね橋まで歩けます.
www.city.annaka.lg.jp
さてこの路線の廃止に伴い,JRバス関東はバスを運行しています.
www.jrbuskanto.co.jp
このバスは1時間に1本程度あり,運賃も510円と安いです.問題はこのバスを使う人が多く,バスに乗れないこともあります.これまで2回乗ったのですが両方とも運よく乗れたのでその後どうなったのかはわかりませんが,運転手は乗れなかった人にバスを手配したと言っていたのでたぶん来たのだと思います.

f:id:HAVRM:20190815192526j:plain
バス外観(並んだ位置がここでした.このときは補助席でした)
バスの運行時間は日によって変わるので注意してください.
今回の実際の時刻はこのようになります.
f:id:HAVRM:20190815192958j:plain
HAVRM短縮ルート
この場合掛かる値段は2780円で,時間も3時間半ですみます.しかもこの場合距離が134kmなので学割が適応できさらに2割引となります(言うまでもありませんが,適応は東京 ⇒ 横川のみです).学生なら断然お得です.ただ上で言ったようにバスが滅茶混みするので一本早くしたほうが安心です.電車自体も在来線でそこまで混んでいる感じは受けませんでした.ただ自分が乗ったときは横川駅からSLが発車する時刻とかぶったため信越本線の最後のほうは結構混んでいました.まぁ,混んでるぐらいで満員電車ってわけじゃないけど.

HAVRM時間度外視ルート(¥5230 ⇒ 青春十八切符使用:¥2850)

さて最後に(ほかにもルートはあるのですがこれ以上長くしてもJRの在来線としなの鉄道が伸びるだけです.例:篠ノ井乗換等)最初のほうに遠回りルートとしてあげた小諸経由のルートです.このルートだと到着時間しだいで前日に出なくてはいけなくなります(到着時刻が13時にしているのは実はこのルートの影響です).13時着であれば始発ぐらいに乗れば間に合います.と言うことで遠回りルート.

f:id:HAVRM:20190815194934j:plain
HAVRM時間度外視ルート
さてこのルートの場合,東京からひたすら中央線・中央本線で北上し,小海線しなの鉄道にアクセスするルートとなります.このルートは山の中を通り,渓谷等のきれいな景色と,小海線ではJR最高標高地点があり,その場所には碑のようなものがあり,電車内から見えます.なお小海線は非電化であり,汽車の旅を楽しめます.ただ見ての通り,お金も時間も掛かります.学割が使えるのなら比較的安めにできますが,それよりこの値段になると青春十八切符が使えます.青春十八切符は5回分のJR全線一日乗り放題の乗車券で,長期休暇の決められた期間のみ利用できます.青春十八切符となっていますが年齢制限は無く,子供から年配の方まで使えます.5回分セットで11850円なので一日2370円でJR乗り放題できます.HAVRM短縮ルートの場合,JRの値段が2270円と赤字になるので言いませんでしたが,このルートだと超お得です.なんと2380円引きです.JRに限ってみれば半額以下です.そのため青春十八切符が使える期間だと超安くいけます.

最後に

東京から軽井沢に行くルートをいくつかあげてみましたが,どうだったでしょうか.行き方を変えて毎回異なる車窓の景色を眺めるのもいいと思います(軽井沢に引くこと自体そんなにないかも知れないですが).個人的にはHAVRM時間度外視ルートがお勧めですが,その場合は到着予定時刻を遅らせるか,逆に軽井沢でお昼を食べて東京に帰るときに使います.短時間で楽なルートで行くのもいいですが,在来線でとことこと行く旅もいいですよ.



ちょっと一言
左手の人差し指を怪我したせいで打つのが大変...
このページの文字数も6000字超えているし,もう少しいい感じにページ分割できないかな...

G-Tuneの修理記録 -3/4- キーボードの交換

こんにちは.HAVRMです.
更新がとまっていたG-Tuneの修理記録を更新します.

このシリーズではG-Tuneのファンがもう限界でうるさいわ,冷却できてないわでどうしようもなくなっていたので修理した記録をまとめる.
havrm.hatenablog.com
前回はファンの交換を行った.
havrm.hatenablog.com
これでとりあえず静かになり,また冷却性能も最初のころに戻ったようだ.
ということで次はキーボードの交換に移る.とは言っても購入してから組み立て終わるまで,このG-TuneのCLEVO社での型番は本来「W230ST」なのに「W230SD」と勘違いして作業していますw 今回それが大きな(?)問題に...

キーボードの購入

キーボードについてはコンピュータの型番(W230SD)とキーボードみたいな感じで調べた.この記事の執筆時(2019/7/20)ではないものの,当時はヤフオク!にバックライト付のものが3840円(送料・税込み)で売っていたのでそれを購入した.なお執筆時はそもそもバックライト付が売っていない...
まぁ,高いものの当時はヤフオクのクーポンで初回落札(これまで使ったことがなかった)50%オフのクーポンを持っていたため格安で買えた.

キーボードの取り外し

まぁ,ともかくキーボードを買えたので交換作業を行おう.
キーボードを取り出すには裏蓋をはずす必要はなく,バッテリーのところにある突起を押すことで取り外し等可能になる.なおこれはW230SDのトリセツのP2-13に書いてある.
ということで分解していこう.
例の通り,電源とバッテリーを抜きます.配線作業を行うので電源が通らないようにしましょう.
まずバッテリーの裏の突起を押しましょう.突起は下の画像の赤丸内にあります.押す際はパソコンの画面を広げた(キーボードが見える)状態にしておきましょう.

f:id:HAVRM:20190720174925p:plain
バッテリー裏の突起
突起をおすと「カチッ」と音がして下の写真のようにキーボードの上部が持ち上がります.
f:id:HAVRM:20190720170211p:plain
キーボードカバーのロック解除
この状態で持ち上がったところを持ってあげると(下写真上部),このようにカバーが取れます(下写真下部).
f:id:HAVRM:20190720170601p:plain
カバー持ち上げ
f:id:HAVRM:20190720170724p:plain
カバー取り外し後
カバーを取り出すと,上の写真の赤丸の場所にねじが4箇所見えるのでこれをはずします.
はずした後,キーボードを上にずらすように動かすとキーボードが分離できます.このときまだ配線は取れていないので,ケーブルが千切れないようにゆっくりと無理のない範囲で動かしましょう.
キーボードをずらすとケーブルが2種類見えるので(たぶんそれぞれキーボード線とバックライト),それをはずしましょう.このタイプはロックされているのではずす必要があります.下の写真のまるで囲まれた灰色の部材(一体部材です)を上に押し上げることでロックが解除されます.
f:id:HAVRM:20190720171911p:plain
ケーブルロック取り外し
実際の様子は下の写真のようになります.
f:id:HAVRM:20190720172013p:plain
キーボードケーブル取り外し
ということでキーボードを分離できました.
f:id:HAVRM:20190720172211p:plain
キーボード取り出し

キーボードの組み立て

では購入したキーボードを組み立ててきます.組み立て順番は上でやったことを逆の順番で行うだけです.
しかし,開封したらキーボードが曲がっていました!

f:id:HAVRM:20190720172607p:plain
新品キーボード開封直後
届いたときはきちんと箱で梱包されていたので管理が悪かったのでしょうか...
まあ少し力を入れてあげれば戻りましたし,配線が切れていたわけでもなさそうなのでよかったんですが...
f:id:HAVRM:20190720172750p:plain
新品キーボードゆがみ修正
それはともかく,逆順に組み立てて,起動し,メモ帳に記入したら全部正常に打ち込めました!
f:id:HAVRM:20190720173158p:plain
キーボード試打
とりあえずよかったと,ファンクションキーと連動できる機能も確かめようと,バックライトの明るさを変えようとしたら...
スリープモードになりました!!
え?なんで?
そう思い交換したキーボードを比較すると一部配置が換わっているだと...
f:id:HAVRM:20190720173906p:plain
ファンクションキー配列
F4とF12キーのファンクションを押しながらの動作が逆になっている...
こ,これが型番の違いか...
運のいいことに(?)変化していたのはここだけで,気をつければどうにかなる範囲だったのでよかったものの...
ま,まぁ.気を取り直してバックライトの確認をしましょう.
(F12がバックライト,F12がバックライト,F12がバックライト,...)
f:id:HAVRM:20190720174414p:plain
バックライト
写真を撮ったときは画面の電源も落としてます(Fnキー+F2).明るさも元と同じように3段階にできましたし,問題はないか...


ということで一部キーボード上での表記がずれましたが,まあ,使えるのでよしとしましょう(この記事もこの交換したキーボードで書いてます)
では次回最終回「SSD全交換とクリーンインストール」!(え?まじで?やるの?というかそれもはや修理なの?)