diary

主にコンピュータ技術関連のことを投稿。 / 投稿は個人の意見であり所属団体の立場を代表するものではありません。

(簡易版)Google App Script で Google Spreadsheet に日本の祝日リストを吐き出す

これをもっと簡単にしたい。

google spread sheetに自動更新される日本の祝日シートを作る - Qiita

function generateHolidayList() {
  const url = 'https://docs.google.com/spreadsheets/d/xxxxxxxx';
  const sheet = '日本の祝日';

  const start = new Date('2018-01-01T00:00:00');
  const end = new Date('2030-12-31T00:00:00');

  const holidays = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com')
    .getEvents(start, end)
    .map(function(e) { return [e.getStartTime(), e.getTitle()] });
  SpreadsheetApp.openByUrl(url).getSheetByName(sheet).getRange(1, 1, holidays.length, 2).setValues(holidays);
}

このスクリプトは1カラム目に日付、2カラム目に祝日の名前を書き込む。

どこに書き込むのかは url, sheet 変数で決める。

一度実行すると上書きされる。実用上はそんなもんでいいのではないかな。元の qiita のは空白の制御とかもしてるけど滅多にやらないから手作業で十分だし、コードの見通しを良くしたい。あとは早すぎる抽象化をバッサリ削除。

通常の ssh ライクな引数で簡単に EC2 にログインできるようなスクリプトを書いた

ec2ssh

Requirements

環境変数にこれ追加したほうがいいかも。

export AWS_SDK_LOAD_CONFIG=1
sudo gem install aws-sdk
wget https://gist.githubusercontent.com/ishikuro/aca4afc01f96b9c4346b6623696d88dd/raw/4acf0f135d257ade0ae88f4fa44db51abd72605f/ec2ssh
chmod u+x ec2ssh

Usage

ec2ssh [-l username] [-p port_number] [-r region] [-i identity_file] [-q] [--profile profile] [--dry-run] [username@]instance[:port_number] [command]
  • -l username or username@
    • 省略した場合は tag:User を自動的に使用する。tag:User も無いときはデフォルト値として ec2-user が使われる。
  • -p port_number or :port_number
    • 省略した場合はデフォルト値 22 が使われる
  • -r region
    • 指定したリージョンで EC2 インスタンスを探す。省略した場合は ~/.aws/configure に設定したリージョンになる。それも無ければ us-east-1 が設定される。
  • -i identity_file
    • キーペアのファイルを指定する。ssh で適切にデフォルトが設定されているならば省略してもよい。
  • -q
    • quiet mode / セキュリティグループの設定警告や実行予定の ssh コマンドを出力しない。
  • --profile profile
    • ~/.aws/configure や ~/.aws/credentials のプロファイル切り替え
  • --dry-run
    • 実際には実行しない。インスタンスのユーザ名、IP アドレスを知りたいだけのときに有用。
  • instance
    • i- で始まっていればインスタンス ID をもとに、それ以外なら EC2 インスタンスに設定した Name タグをもとに、パブリック IP アドレスを自動で取得して ssh の対象ホストとする。
  • command
    • ssh の引数として渡せる、リモートで実行したいコマンド

Examples

$ ec2ssh MyInstanceA
# => ssh ec2-user@203.0.113.1
# インスタンスの User タグがあればそちらを拾ってユーザ名にしてくれる
# User タグが無ければ ec2-user

$ ec2ssh i-xxxxxxxxxxx
# => ssh ec2-user@203.0.113.1
# i- で始まる文字列にするとインスタンス ID と見なす

$ ec2ssh ubuntu@MyInstanceB
# => ssh ubuntu@203.0.113.2
$ ec2ssh -l ubuntu MyInstanceB
# =>  ssh ubuntu@203.0.113.2
# このようにしてユーザ名は上書き可能

$ ec2ssh -r us-east-1 MyInstanceC
# => ssh centos@203.0.113.3
# リージョン指定可能

$ ec2ssh -i ./my.pem ubuntu@MyInstanceB:10022
# => ssh  -i ./my.pem -p 10022 ubuntu@203.0.113.2

$ ec2ssh -i ./my.pem -l centos -p 10022 -r us-east-1 MyInstanceC
# => ssh -i ./my.pem -p 10022 centos@203.0.113.3

おまけ機能として、デフォルトでセキュリティグループ許可し忘れがないか警告してくれる。リンク先は当該インスタンスに紐づいたセキュリティグループでフィルタされたコンソール。出力不要な場合は -q で抑止できる。

$ ec2ssh MyInstanceA
If you cannot see the login prompt, check security group settings by
https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#SecurityGroups:groupId=sg-xxxxxx,sg-yyyyyy;sort=groupId

⚡️ ssh  -p 22 centos@3.xx.xx.xx

未実装

  • コマンド実行 ssh host ls みたいなやつ
  • 警告を出力しない、quietモード(-q)
  • scp モード
  • region 設定が無いときに us-east-1 を使うようにする
  • credential エラーの対応

gist.github.com

ec2ls

マネジメントコンソールを開かなくてもログインに必要な手がかりを一覧できるようなコマンドも作ってみた。併用すれば捗るはず。

ec2ls [-r region] [--profile profile] [-l]

AMI 名は先頭数文字だけ表示するようにした。ログインユーザ名を知るにはこれで十分。

$ ec2ls
i-xxxxxxxxxxxxxxxxxxx	running	CentOS#	Member
i-xxxxxxxxxxxxxxxxxxx	running	Window#	Admin
i-xxxxxxxxxxxxxxxxxxx	stopped	amzn2-#	WORK_AL2
i-xxxxxxxxxxxxxxxxxxx	running	ubuntu#	IoT
i-xxxxxxxxxxxxxxxxxxx	running	amzn-a#	Greengrass

$ ec2ls -l
i-xxxxxxxxxxxxxxxxxxx	running	CentOS#	Member	Directory/DirectoryPublic1a(192.168.0.0/24)
i-xxxxxxxxxxxxxxxxxxx	running	Window#	Admin	Directory/DirectoryPublic1a(192.168.0.0/24)
i-xxxxxxxxxxxxxxxxxxx	stopped	amzn2-#	WORK_AL2	default/DefaultPublic1a(172.31.16.0/20)
i-xxxxxxxxxxxxxxxxxxx	running	ubuntu#	IoT	default/DefaultPublic1a(172.31.16.0/20)
i-xxxxxxxxxxxxxxxxxxx	running	amzn-a#	Greengrass	default/DefaultPublic1a(172.31.16.0/20)

真面目に VPC, サブネット順にソートしたりしてるんだよ。


gist.github.com

Watch Dogs 2 ごっこができるバッグを探した

f:id:ishn:20181208101111p:plain
パルクールもこなせる鞄ちゃん

Watch Dogs 2 はハッカーをテーマにしたオープンワールドステルスアクションゲームである。

主人公マーカスはパルクールで移動しつつ必要な時に瞬時にラップトップを取り出して施設のハッキングやガジェットの操作を行うため、サイバー空間を扱っていながらも非常にテンポがいいアクションゲームになっている。


ところで私は作品に影響を受けやすいので、今回も「うおー、超かっけえ。俺もマーカスになりたい!」という感じになった(小並感)。

要件は

  • 走ってもずれない
  • 薄い
  • ラップトップだけ入ればいい

である。

あのバッグはなんなのか調査

種類はなんというのだろう。とりあえず Watch Dogs 2 のオフィシャルグッズを見つけた。

https://www.amazon.co.jp/Ubi-Workshop-Watch-2-Marcus%E3%83%A1%E3%83%83%E3%82%BB%E3%83%B3%E3%82%B8%E3%83%A3%E3%83%BC%E3%83%90%E3%83%83%E3%82%B0%E5%85%AC%E5%BC%8FUbisoft%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3by-UBI%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%83%E3%83%97/dp/B071FN1DHM/ref=pd_lpo_sbs_21_t_1?_encoding=UTF8&psc=1&refRID=QACET67BKXGHD18DEBTXwww.amazon.co.jp

あー、なるほど。メッセンジャーバッグなのね。しかしゲーム中の印象に反してかなりぶ厚い。体に密着してくれるのかも怪しい… 市販のその他のメッセンジャーバッグも探してみたがこれよりもさらに大きいものが主流のようでしっくりこない。

自転車にのるときに使うサコッシュという種類のバッグが走ってもずれないし薄くて良さそうだ。しかし、サコッシュの定番は小さすぎてラップトップが入らないので決定打にならず。

サコッシュ - Google 検索

良い感じのサコッシュがあった

もうちょっと粘り強く探したらラップトップがちょうど入るサコッシュがあった。

https://this-is-not-a-store.com/

ここで売っていた Sacoche For Macbook Air というのが、私の持っている 13 inch Macbook Pro にぴったりサイズだったので注文した。

様子

f:id:ishn:20181208092332j:plain

f:id:ishn:20181208092454j:plain
これくらい入れば十分。

この装備で仕事もパフォーマンスを落とさずできるようになったので、本当にこれだけあれば困らない。MacBook Pro のバッテリーは数時間持つので、オフの日の作業だったらケーブル、充電器も不要だ。

f:id:ishn:20181208092537j:plain

f:id:ishn:20181208092632j:plain
ジップを占めるとジッパーが消えるデザイン。肩ひもの調整留め具は小さくかっちり作られていて、全く食い込まない。

f:id:ishn:20181208093003j:plain
暗くて見づらいよね。ごめんね。ちなみにもっと短くできる。

f:id:ishn:20181208093227j:plain
膝にのせてもはみ出さないので移動中も作業できる。

どうなったか

私も会津大出身の矜持として道端で急に走り出すように心がけている。今回のサコッシュはラップトップを入れても体に密着しているので、その際にも全く疲れない。

移動中もすぐに取り出せるしカフェ作業時にトイレに行くときも都度サコッシュに入れて携行できるようになった。時間が空いたときにサッと開いてCTF の問題を解くときの高揚感はまさに Watch Dogs のそれで、黒い画面をたくさん操っていると完全にスーパーハカーになれる。

上で紹介したサイトは会員制っぽいので気軽に買えないのが難点。ほかのブランドでラップトップが入るものがほとんど見つからなかったのだけど、何か知っている方いらっしゃいましたら教えてください。

Oculus Go で模様替えの計画を立てた

自分の部屋の模様替えを VR でプレビューしてみた。所要時間は休日1回分程度。想像以上に簡単で、みんなにも試して欲しいのでメモとして残しておく。

使う技術:

  • 100均で売ってるメジャー
  • DesignSpark Mechanical
  • Amazon Sumerian
  • Oculus Go

使ったお金:

  • メジャー: 108円
  • AWS 利用料金: 18円

必要な前提スキル:

  • なし

模様替え計画

部屋の様子および将来の予想図を作っておく。これには 3D モデリングツールが必要で、ラズパイでおなじみの RS Components が提供している DesignSpark Mechanical (無料)というやつが初心者に有用。Windows 専用なんだけど、持ってなければクラウドWindows サーバーでも使えばいい。

右側ペインのチュートリアルが親切で、3D モデリング未経験の私でも 30 分で何かしらの家具を作れるようになった。家具は箱型がベースだからどんどん作っていける。

とにかく家の中を 100均 で買ったメジャーで測りまくって再現した。といってもスムーズに行けば2時間かからないんじゃないかな。

f:id:ishn:20180605014618p:plain5.5畳くらいの tiny なアパートですが何か。

気が済んだら Room.obj として保存する。

f:id:ishn:20180605014630p:plain

すると、Room.mtl というのも作成される。

f:id:ishn:20180605014639p:plain

Amazon Sumerian にインポートする

Amazon Sumerian – VR アプリケーションや AR アプリケーションの構築

Amazon Sumerian ってご存知ない方も多いだろうけど、さっき作ったモデルを Oculus Go で見るために使う。習うより慣れろでとりあえずウェブのコンソールに入りましょう。

Amazon Sumerian - Pricing
AWS は有料だけど私の作成したやつの場合の今月の料金を試算したら 18円くらいだった。
  • シーンのサイズ: 14MB
  • ストレージ料金: 0.014GB * 0.06 USD = 0.00084 USD
  • 転送コスト: 0.014GB * 約30回 * 0.38 USD/GB = 0.1596 USD
  • 合計 0.16044 USD -> 18円くらい
アカウント作って1年以内の人は無料枠があるので 0 円。

AWS のコンソールは非常に多くのサービスがあって戸惑うかもしれないけど今は Sumerian にしか用はない。

f:id:ishn:20180605020434p:plainスクショには RAS症候群 が隠れていますね

入れたらおもむろに Create new scene

左下の Assets のところにさっきの Room.obj , Room.mtl二つとも一度にドラッグ&ドロップする。.mtl は色とか質感の情報が入っていて、これを一緒に入れないと全て灰色になってしまうのだが、後から個別にインポートすることができない。

f:id:ishn:20180605014644p:plain

アップロードが終わったら Assets 中の Room を中央のキャンバスエリアにまた D&D する。

するとマイホームが現れる。暗いのは光源がないから。後から入れるので大丈夫。

f:id:ishn:20180605014649p:plain

XYZ の軸が DesignSpark と異なるためひっくり返ってしまっている。左上側 Entities でさっき追加した Room が選択されていることを確認し、右側の Transform を次のように設定する。

f:id:ishn:20180605014653p:plain

中央上の Create Entity から pointlight を追加。矢印を引っ張って適当に配置。

f:id:ishn:20180605014701p:plain

VR のカメラを入れる。中央上の Import Assets から CoreVR を追加。

f:id:ishn:20180605014753p:plain

Assets にロードされたら、ツリーを辿って VRCameraRig を見つける。これをまたキャンバスに D&D 。

現時点で Entities はこんな感じになっているはず。

f:id:ishn:20180605014758p:plain

VRCameraRig を選択した状態で右側の VRCameraRig のうち CurrentCameraRig にチェックを入れる。

f:id:ishn:20180605014802p:plain

この辺りまでちょっとついて行けないという人はもう少し丁寧なステップがチュートリアルに載っているので参照してください。https://docs.sumerian.amazonaws.com/tutorials/create/beginner/getting-started-vr

VR カメラも移動する。Oculus Go を被る予定の位置にするのが没入感高くておすすめ。

f:id:ishn:20180605014824p:plain実はもうほぼ完成している。

左上のメニュー Scene -> Publish から Scene を公開する。この URL をメモしておく。

f:id:ishn:20180605014829p:plain

Oculus Go で体験する

さっきの URL をなんとかして Oculus Go に持っていく。自分は Google Keep を使った。

f:id:ishn:20180605014832p:plain

Oculus Browser で開くだけ。

f:id:ishn:20180605014835j:plain

右下のゴーグルアイコンから開始。

f:id:ishn:20180605014838j:plain

これで実際の家具を買う前に感覚を知ることができますね。すごい時代だ! f:id:ishn:20180605022318j:plain

(残念ながら Oculus Browser 経由の VR (WebVR) は録画できなかった。)

10年を振り返る

先日30歳の誕生日を迎え、今日は仕事納めです。思考の変遷を振り返ってみたい気持ちになりました。

20歳頃

まだ高校生だった気がします。その後ニートとフリーターを行ったり来たりで。

狂ったようにカラオケに行ったり、原付でツーリングに行ったりしても、「本当はこんなことやってる場合じゃない」という苦しい気持ちが常にありました。このままでは自分はダメなんだ、明日は正しいことをするんだ、と毎日思うものの、秋田の凍りつくような寒さと、時給600円の激安スーパー店レジバイトの前ではなんの役にも立たない決心でした。

弟が大学に落ちて予備校に行くというので、なんとか自分を変えようと思い同じ予備校へ入り、高校生に混じって勉強しました。

会津大学という超コスパのいいコンピュータ専門の単科大学があり、割と簡単かつ受験科目が少ないというので運よく潜り込めました。

23歳〜

もともと計算機と Linux が好きだったので1年目はチートできました。ただ、勉強習慣が無かったので数学系はどうやって単位を取ったのか覚えていないくらい身につきませんでした。さらに睡眠の習慣すら無かったので、人間関係とかソフトスキル的なものは破滅していたと思います。

この頃考えていたのは就職のことです。ワープワ脳なので3年目くらいまで本気で正規雇用をゴールにしていました。今思うと本当に低いハードル設定だと思うんですが、当時は東北近辺で中小企業に入れれば最高だな😸 と思っていました。

ただ、大学というのは自分にとっては蜘蛛の糸です。せっかくのチャンスだから会津大学でできることには全部関わろうと思いいろんなイベントに参加して活動しました。ハッカソンとか勉強会とか。あと大学周辺ベンチャーの Eyes, JAPAN という会社でバイトをして大変お世話になりました。その辺りで出会った人々から、コンピュータエンジニアとしての習慣を吸収しました。

就職時の年齢を気にしていたので飛び級制度を使い、学部3年+院2年で卒業することに決め、指導教員の先生のご指導のおかげでなんとか大学院に進めました。

26歳〜

コンピュータの動作原理を知っておきたかったので、奥山先生の研究室で回路設計を勉強しました。ただ、どういう技術トピックで他者と差別化するのかという考えばかりが強く、寄り道に多くの時間を使ってしまいました。

この頃考えていたのは「コンピュータエンジニアとして」どうするのか、という縛りでした。今思えば囚われ過ぎでしたが、ゴールも変わりました。就職を考える上でエンジニアとして社会とどう付き合っていくのかいうことです。

そこでエンジニアの働きは社会貢献に尽きるという信条を見出し、それを軸に仕事を探しました。新卒求人を始めたばかりのクラウドの会社があり、考え方が非常にマッチしていたので運よく拾っていただきました。

なんとか働いています。

社会人1年目は、睡眠とか勉強習慣とか、ツケにしていた問題が表面化していました。成果は出ないし体調は崩すしで、エンジニア云々以前の体のバグフィックスに時間を費やしました。

2年目になって気づいたのが、学生の時に必死になっていた技術的な知識の役の立たなさです。エンジニアの仕事は知識を持つことではなくて、問題を解決することです。これは技術の分野はあまり関係ないなと思いました。したがって、今はある程度専門性はあるものの固有の技術について固執していません。また、大学の頃のように、誰かの課題を解決できているわけではないのに表面的な雰囲気(githubとかね)を作ろうとするのはきっぱり辞めました。

そして昔と違って、これからどうなりたいのかはあまり思いつきません... まずはちゃんと人の役に立ちたいです。


そもそもなんでこの記事書いてるんでしょうね。とりあえず、自分の20歳の頃と似たような若者が居たら励ましたいです。こういう人の空白期間ってマジで空白ですからね。海外でバックパッカーとかしてたりしないですし。

振り返ってみると大きなステップを超えていくたびに考えていることがどんどん洗練されていくもんだなと感じます。20歳の自分のまま同じことを繰り返して歳を取っても、こうはならないと思います。

.styをTeX Liveに入れる方法(root不要)

ユーザ権限で行いたい。

この場合、~/texmfに置いておけば自動的に毎回読んでくれるらしい。

TeX Live - ArchWiki

たとえば CTAN: Package bytefield これを入れるときは、

$ mkdir ~/texmf
$ unzip bytefield.zip
(幸いこの中にはコンパイル済みの.styが入っていた)
$ cp -r tex/ ~/texmf
$ tree ~/texmf
/home/ishikuro/texmf/
└── tex
    └── latex
        └── bytefield
            └── bytefield.sty
(使えるかどうか確認)
$ kpsewhich bytefield.sty
/home/ishikuro/texmf/tex/latex/bytefield/bytefield.sty

あとはドキュメントに従って\usepackageなりするとよい。

pngとかjpgをplatexで使う(debian jessie)

注意: この方法でpngを貼ると、PostScriptプリンタでの印刷でとても時間がかかるようになる。パワポで作った図表はできればpdfで出力して貼り込むのがよいと思う。

$ sudo apt install texlive-lang-japanese latexmk

~/.latexmk

#!/usr/bin/perl
$latex         = 'platex %O %S';
$bibtex        = 'pbibtex %O %B';
$dvipdf        = 'dvipdfmx %O %S';
$pdf_mode      = 3; # use dvipdf
$pdf_previewer = "evince"

files:

main.tex
figure/
    a.png
    b.png

main.tex

...
\usepackage[dvipdfmx][graphicx]
\graphicspath{{./figure/}}
...


\begin{figure}
  \includegraphics{a.png}
\end

このままだとエラーになる

$ latexmk main.tex

runpopen command not allowed: extractbb

extractbbの許可

$ sudo cp /usr/share/texlive/texmf.cnf /etc/texmf/texmf.d/90extractbb.cnf

90extractbb.cnfにextractbbを追加

shell_escape_commands = extractbb,bibtex,bibtex8,kpsewhich,makeindex,mpost,repstopdf,
$ sudo update-texmf
$ latexmk main.tex

これで画像が自動で挿入される。いまどきはepsとか用意しなくていい。