【旅程表 #01】くっつけて、openpyxl

リステはいいぞ

公式サイト: Re:ステージ!公式サイト
ゲームもあるみぃ: Re:ステージ!プリズムステップ




茶番はここまで(はやい)




今回は旅程表を自動で作るソフトを作っていきたいと思います

1.目標

私は乗り寄りの鉄オタもどきなのでちょくちょくどこかに出かけたりしているのですが、その時に↓のような旅程表を作っていました。
f:id:kanade_2001:20220213163924p:plain
これはnumbersで作ったもので、セルの幅などある程度まではテンプレートに保存できますが、路線カラーなど色をつけたりは一つ一つ手動でやっていました。ただこれを続けるのはめんどくさいですし、なんなら時刻とか路線名とかも自動で入力できるようにしたいのでこの度ソフトを作っちゃおうという結論になりました。


2. 使用するライブラリなど

今回は最終的にPDFなどで旅程表を出力することが目的なのでWeasyPrintのように直接PDFを組み立てるライブラリの仕様も検討しました。しかし、作るソフトウェア内部からのみはなくファイルを直接いじろうと思った時にxlsxファイルやcsvといったファイル形式で保存されていた方が楽なので、openpyxlでexcel形式のファイルを作った後にそれをpdf出力するという形式にします。このopenpyxlはpythonのライブラリの一つで、xlsx形式ファイルの入出力ができるものです。オープンな(MITライセンスです)pythonのxlsx用ライブラリなのでくっつけてopenpyxl(なのだと思っています)。xlsx形式を扱えるライブラリとしてはpandasも有名ですが、openpyxlの方が書式等の設定ができるので今回のようにお絵描きをする場合はopenpyxl一択だと思います。
また、cuiだとちょっとめんどくさそうなのでkenvyとかでGUIも作れたらいいなぁなんて。他には使うかどうかは未定ですが駅データ.jp(https://www.ekidata.jp/)さんの無料版データも用意して自動補完機能とかつけるかもしれません。あとこれまで避けてたGitHubを使ったり使わなかったりします。


3. openpyxl

とりあえず初日なので慣れることから
ファイル作成は

import openpyxl
workbook = openpyxl.Workbook()
workbook.save('Sample1.xlsx')

でいけます。
汎用性を考えてファイル名は別の変数を後から付け足しました。ファイルが既に存在するかの確認を含めて最終的に

import openpyxl
import os

name = "sample1.xlsx"

#Make file

filename = name
#filename = path + filename
#filename = os.path.expanduser(filename)
if os.path.exists(filename):
    print("File exists.")
    workbook = openpyxl.load_workbook(filename)
else:
    print("File doesn't exist.")
    workbook = openpyxl.Workbook()
    workbook.save(filename)

workbook.save(filename)

みたいな感じになりました。os.path.expanduserとかコメントアウトされてるところに関してはwindowsmacの兼ね合いでごっちゃになってるやつです(macならコメントアウトして動く)。

とりあえず初日は情報量ゼロだけどこんな感じで。次は簡単なデータを用意して整形などしていきたいと思います。

【Mac】 VSCodeでPython3を使用する

[10秒でわかる要約]

VSCodeでCodeRunnerの設定をいじったらPython2からPython3に無事変えられた

皆さんはどんなプログラミング言語を使っているでしょうか。C++C#PythonRuby、Processing......かくいう私は主にC++を使用しているのですが、PythonのDecimalや機械学習に特化した様々なモジュールが恋しくなることが度々あります。そこでウォーミングアップにとABC098-Aを解こうとしました。

a, b = map(int, input().split())
print(max(a + b, a - b, a * b))

すると

File "~/ABC098-A.py", line 1, in <module>
    a,b = map(int,input().split())
AttributeError: 'int' object has no attribute 'split'

??????

調べてみるとどうやらPython2とPython3の記法の違いによっても発生するみたいです。いやいや自分はちゃんとPython3をインストールしていますから......

import sys
print(sys.version)

>2.7.16 (default, Jun  5 2020, 22:59:21) 
>[GCC 4.2.1 Compatible Apple LLVM 11.0.3 (clang-1103.0.29.20) (-macos10.15-objc-on darwin)

いやいやいやいや

$python
>Python 2.7.16 (default, Jun  5 2020, 22:59:21) 

$python3
>Python 3.7.2 (v3.7.2:9a3ffc0492, Dec 24 2018, 02:44:43) 

ふむふむ一応Python3はインストールされているけれどつかわれていない、と(Macの場合デフォルトでPython2がインストールされています。サポート終了が言われているんだからPython3に移行してもらいたいところですが......)

その後30分ほどGoogleと格闘しつつキーボードを叩いていると、しまいにはPythonのみならずC++さえも動かなくなってしまいました。これはもう爆破するしかないのでは......そう思い始めた時一縷の光が!

どうやら code-runner.executorMapが破損しているらしい

VSCodeの設定からcode runnerで検索してsettings.json を開くと......

"code-runner.executorMap": {
    "python": "python"
}

もしかしなくてもこれが問題なのでは......?

Finderを開いて /usr/local/bin に移動してPathが通っていることを確認します。 f:id:kanade_2001:20210111111307p:plain

そして settings.json

    "python": "python3.7"

にすると......

f:id:kanade_2001:20210111111609p:plain f:id:kanade_2001:20210111111723p:plain

通りました!

以上冒頭一行の内容を引き伸ばし引き伸ばしして書いた記事でした。お役に立てれば幸いです。

[p.s.] ずっとC++で書いてきたので変数の型を指定しなかったり;を打たなかったり最後にreturn 0;を書かないのに違和感しか感じない......

【雑談】 あけましておめでとうございます/2021年の予定

あけましておめでとうございます。

 

※注意※

これは前回の記事から2ヶ月が経過しそろそろ新しい記事を書かなければならないという思いから書いた情報量0の雑談です。

月日が経つのは早いもので2020年は終わり2021年が来てしまいました。昨年は某某のせいで多くのイベントごとが中止や延期を余儀なくされましたし、生活も一変しました。もういっそのこと2020.5年みたいな感じで2020年をもう一度やり直してほしいというのが正直なところですがそうは問屋がおろさない(し、いろんなシステムが死ぬ)ので諦めて前を見ていきましょう。

 

ということで2020年にやったことと2021年にやる(予定)のものをまとめたいと思います。(前を向いていきましょうの次の文で振り返りをしようという矛盾)

2020年夏

・自作CPU(TD4)→サークルの方で簡単なブログを書きましたが改めてこちらでも書こうと思っています

2020年秋

・ICPC2020→先輩方のお力により3月のアジア予選に出場することになりましたのでそのときに改めて記事を書きます

2020年冬

Raspberry Piでスマートリモコンを作る→まだ終わっていません(できるだけ早く片付けたいがそろそろ期末試験がやってくる......)

第3級アマチュア無線技士の資格をとりました→免許証の申請がまだなのでそれが終わったら(以下略)

 

2021年(予定)

・生活リズムを整え1日3食食べる

AtCoder水色になる(まずはコンテストの時間帯に起きているようにするところから)

基本情報技術者試験に合格する

FPGA

・自作OS&コンパイラ

・(アカウントを作成したきり放置したままの)Kaggleを動かす

・(はてなブログ以外の)自分のサイトを作成する

TeX環境を構築する

・生活リズムを整え1日3食食べる(大事なことなので2回言いました)

 

では今回はこんなところで。元気に開発していきましょう!!! 

【電子工作】 Raspberry Piでスマートリモコンを作る-Day2


microSDカードやら電源やらを買い忘れていたので2日空いての投稿です。

Amazonで32GBのSDカード、micro HDMIケーブル、CPUファンと5V3A電源を購入しました。Amazon Prime便利。 目的の使用用途だけなら32GBはいらないと思いますが大は小を兼ねるということで(そもそも4B 8GBがオーバースペックなので今更)。 f:id:kanade_2001:20201116220425j:plain

また、「Raspberry Pi」とわざわざ書くのも大変なので「ラズパイ」に表記を変えることにしました。

1. OSの書き込み

SDカードをPCに接続してOSイメージを書き込んでいきます。 OSは公式サイトから落とせますが、「Using Raspberry Pi Imager」と「Manually Install an operating system image」の2通りがあるようです。 公式曰く前者のほうが速いし簡単ですよ、ということでImagerを使って書き込みをします。

f:id:kanade_2001:20201115114219p:plain
Raspberry Pi Imager
Operating SystemをRASPBERRY PI OS (32-BIT)、SDカードを自分が差し込んだSDに設定しWRITEを押すだけで完了します。

2. 初期設定

ラズパイにモニタ、マウスとキーボードをつなげて起動します。(OSを書き込んだあとに設定ファイルを弄ることでラズパイ本体にモニタなどをつなげることから最初からSSH接続ができるようにすることも可能のようですが割愛させていただきます。)

VNCのセットアップ

起動したら右上のラズパイのマークから

設定>Raspberry Piの設定

で設定を画面を表示させ、インターフェイスタブの中のVNCSSHをオンにします。 VNCをオンにすると右上にマークが表示されるので、ここをクリックしてIPアドレスを控えておきます。

ラズパイ側の設定はここまでなのでキーボードやモニタをWindowsに付け替えます。IPアドレスの固定化を先に済ませたほうがいいかもしれません。この下の「ラズパイの設定」を参照してください。

WindowsVNC Viewerをインストールし起動します。右上のFileからNew Connectionを選択し、VNC Server欄に先程控えておいたラズパイのIPアドレスを入力してOKを押します。 f:id:kanade_2001:20201116214200p:plain

これでめでたく接続が完了し、Windowsからラズパイを操作できるようになりました。 f:id:kanade_2001:20201116200225p:plain

ラズパイの設定

再起動時などにIPアドレスが変わってしまうことのないようにIPアドレスの固定をしていきます。

右上のWi-Fiマーク (有線接続の場合は矢印マークになるようです) を右クリックしWireless & Wired Netwok Settingsを選択します。

f:id:kanade_2001:20201116214902p:plain
Network Preferences

設定画面のタブから無線ならwlan0、有線ならeth0を選択し、Automatically configure emptyy optionsのチェックマークを解除、IPv4アドレスにIPアドレスを入力します。

(VNCでつなげてからIPの固定化をしましたが、先にIPの固定化を済ませてからVNCで接続したほうがいい気がします)

3. Homebridgeのインストール

念の為アップデートを確認します。

$ sudo apt-get update
$ sudo apt-get upgrade

gccのバージョン4.9.2以上が必要のようです

$ g++ -v
...
gcc version 8.3.0 (Raspbian 8.3.0-6+rpi1)

node.jsを入れます。ついでにnpmとvimも入れておきます。

$ sudo apt-get install -y nodejs
$ sudo apt-get install -y npm
$ sudo apt-get isntall vim

ではHomebridgeをインストールしていきましょう

$ sudo npm install -g --unsafe-perm homebridge
$ sudo npm install -g --unsafe perm homebridge homebridge-config-ui-x
$ sudo hb-service install --user homebridge

これだけだと起動しなかったので

$ sudo apt-get install libavahi-compat-libnssd-dev

も必要のようです。

再起動を終えたら

http:// <IPアドレス> :8581

を表示します。

f:id:kanade_2001:20201116215639p:plain
homebridge
(メモリもぐもぐ......)

常時起動させておいたりだとか設定は少し残っていますが赤外線LED部分の準備がまだ掛かりそうなのでそれは最後つなげるパートにやろうと思います。

4. iPhoneの設定

App Storeでホーム.appをインストールします (デフォルトでインストールされていますが使っていなかったのでアンインストールしていた)。

f:id:kanade_2001:20201116222314p:plain
ホーム.app
アクセサリを追加をタップして先程アクセスしておいたhomebridgeページ内のQRコードを読み取ります。
f:id:kanade_2001:20201116222454p:plain
bridgeが追加されました
現段階では何も家電などは追加していないのでトップページはまだまっさらですがこれで準備が整いました。

5. まとめ

UIも洗練されていますのでかなり簡単に設定は終わらせることができました。次回は赤外線LEDの配線周りをやろうと思います。今回とはうってかわって電気的なお話になります。それでは。

【電子工作】 Raspberry Piでスマートリモコンを作る-Day1

もうすっかり冬になり17時ごろには日が暮れるようになりました。私は整理整頓ができない人なので家に変えるといつも同じ壁にぶち当たります。

「照明のリモコンはどこだ」

そこで私はSiriに問いかけます。(私はAppleとSiriに魂を売りました)

「Hey Siri, 照明を付けて」

「HomeKitアクセサリが設定されていないようです」

 

............このHomeKitとか言うもの、対応商品の品揃えが少ない上に高い(し、そもそもアパートぐらしなので勝手に変えられない)のでなかなか手が出せません。

 

どうしようかなと探しているとどうやらRaspberry Piと赤外線LEDでスマートリモコンを作れるようなのです。ということで自作スマートリモコンを作っていきたいと思います。

 

 

1. スマートリモコンの大まかなデータフロー

f:id:kanade_2001:20201113231407p:plain

データフロー(Siri→HomeKit→Homebridge→LIRC)

スマートリモコンを作るにあたって大まかに何を準備すればいいのかをまとめましょう。

 

iPhone内で音声の認識や翻訳、HomeKitとの連携はしてくれるのでHomeKitから赤外線LEDまでの経路を考えればいいということになります。

この橋渡しとなってくれるのが今回の主役(?)Homebridgeくんです。

https://homebridge.io/

HomebridgeはHomeKitをエミュレートできるNode.jsサーバで、これをRaspberry Piに入れて動かそうと思います。Homebridgeは多くのAPIが公開されているので、必要なものを入れて使うことができます。

赤外線の送受信の部分は市販の学習リモコン(Nature Remoなど)を使用している記事が多い気がしますが、6000円以上しますし何れにせよHomeKitと接続するためにはHomebridgeが必要です。この部分を赤外線LEDと赤外線リモコンモジュール(高々数百円)で作ることができればかなりお得になると思いませんか?また、リモコンは一般的に38kHzで信号を送っていますがRaspberry Piで赤外線LEDを操作しようとすると処理のタイミングなどでこのリズムが乱れ正確に信号が送れないことがあるようです。この不具合を解消してくれるのがLIRCというパッケージです。ありがたいことにHomebridge-LIRCというAPIも公開されているのでそれが使えそうです。

 

というわけで

  • Homebridgeを使えるようにする
  • HomebridgeとHomeKitをつなげる
  • HomebridgeとLIRCをつなげる
  • LIRCを設定、リモコンの信号を読み取る

という課題を達成すれば「Hey Siri, 照明をつけて」とお願いすることができるようになるというわけですね。

 

2. 必要なパーツ

秋月電子通商で全部揃いました。

  • Raspberry Pi 4 Model B 8GB element14版
  • 5mm 赤外線LED 940nm OSI5LA5113  グレー
  • 赤外線リモコン受信モジュール OSRB38C9AA
  • MOSFET 2N7000
  • PchパワーMOSFET (55V 11A) IRFU9024NPBF
  • カーボン抵抗 (炭素皮膜抵抗) 1W27Ω
  • カーボン抵抗 (炭素皮膜抵抗) 1/2W4.7kΩ
  • Raspberry Pi用ユニバーサル基板
  • ピンソケット (メス) 2x20 (40P)
  • ピンソケット 2x20 (40P) ラズパイ用スタッキングコネクタ
  • 2.1mm標準DCジャック (4A) 基盤取付用 MJ-179PH

Raspberry Piと赤外線の送受信パーツ、出力を高めるためのトランジスタに抵抗やソケットなどといった具合です。

 

また、温度計としても使えたらいいなぁということで温湿度センサとLED表示器、LEDなどを買いました。

  • 温湿度センサ モジュール DHT11
  • 7セグメントLED表示器 高輝度2文字 カソードコモン ボディ黒 C-552SRD
  • RGBフルカラーLED 5mm OSTA5131A カソードコモン

 

3. まとめ

今回は準備編ということでここで終わりです。次回部品が届いたらRaspberry Piの初期設定などを勧めていきたいと思います。