Syleir’s note

2020.4.1より統計検定やE資格の勉強の進捗を報告しています。統計検定準1級、E資格、G検定取得しました!当ブログへのリンクはご自由にどうぞ。

MENU

【Pythonista3】iPad × AtCoder環境の最適解を発見した【環境構築不要で最速コードテスト】

この記事は 競プロ Advent Calendar 2021  16日目 の記事です。

 

はじめに

新型コロナウイルス感染症の感染者減少に伴いリアルが充実しだした方も多いですよね。でも僕はひきこもりをしています。オミクロン株の先行きは読めないですけど、リアルが充実するとお外にデスクトップを持っていって精進とかは難しい感じになってきます。

そこで今回はiPadで外でそれなりにコーディングが出来る方法を開発したので自分の競プロ環境をご紹介します。最近はiPad第9世代やiPad Air4のコスパがやばすぎると話題になっていますが、こいつらはその辺のPCよりスペックが高いので余裕で競プロできちゃいます。あとで詳細を書きますが環境構築不要なので、初心者にもおすすめです。iPadのいいところは4万円払うと十分なスペックのデバイスが手に入るところです。パソコンを4万円で買うと競プロがギリギリできる程度のでかい文鎮が手に入るのと雲泥の差です。低コストで競プロを始めてみませんか?という趣旨が3番目くらいの執筆動機です。

本記事はiPadAtCoderすることへの愛が溢れすぎて長編になってしまいました。本来5記事くらいに分割するべきなんですけどAdvent Calendarの都合上1記事で走り切ろうと思います。ゆっくり読んでください。

ちなみにタイトルで最速と書きましたが全然最速を保証していません。強い主張をしておくと反例が降ってくるというライフハックを使用しています。iPad環境でよりよい手法をご存知の方教えてください。

2020 Apple iPad Air (10.9インチ, Wi-Fi, 64GB) - シルバー (第4世代)

 

 

 

目次

 

Pythonista3のご紹介

Pythonista 3

Pythonista 3

  • omz:software
  • 仕事効率化
  • ¥1,220

apps.apple.com

Pythonista3はiPadiPhone上で直接動作するPython環境を実現するiOSアプリです。アプリをダウンロードするだけで動きます。なんと環境構築不要です!ダウンロードしたら2秒後にはPythonが動きます。Python 3.6(とPython 2.7)に対応しています。1200円しますがそれを補って余りある魅力的なアプリです。

過去のお遊びはこれらです。記事にしていない成果もたくさんあるんですが余力ができたら書こうと思っています。

 

iOSアプリ「ショートカット」と「pythonista3 」を連携させて朝アラームを止めたら自動で天気を読み上げさせる! - Syleir’s note

iOSアプリ「ショートカット」と「pythonista3」を自動化させて毎朝LINEでリマインダーする! - Syleir’s note

Pythonista3の特徴

request、numpy、matplotlibなどの人気のあるサードパーティモジュールを使用することができます(ちょっとバージョンが古いですが)。

また、iOS専用に作られたモジュールを使うことができます。センサーや位置情報、フォトライブラリ、連絡先、リマインダー、クリップボードなどにアクセスするスクリプトを書くことができます。ゲームを作ったり、iOSpythonで動くアプリを作ることもできます。あと地味にデバッグ機能も優秀です。またiCloudに書いたスクリプトを置いておけるので、出先で実装して帰ったらPCで続きをやるみたいなこともできます。頑張るとGitHubにpushとかもできますがちょっと紙面が足りないので頑張ってググってください。

numpy、クリップボードが使えるということはf:id:syleir:20211203221848j:plain

Pythonista3をダウンロードするだけでAtCoderの入力例からクリップボードにコピーして高速にコードテストする環境が実現できるってことです。ということはPythonista3をダウンロードするだけでお手軽Python競プロ環境を作れるってことです。すごくないですか?僕はABC-AよりもPythonの環境構築の方が難しいと思っています。diffくらいありますよね?なんで競プロをやりたいのにその前にABC-Aより難しいことをしなきゃいけないんですか?2次関数習う前に微分積分習うみたいなもんですよねこれ。僕は自分のM1Mac にPython環境を作るの、半年かかりました。それを1200円払うだけでiPad上に実現できてしまいます。この環境は最強なので今でもこの環境でAtCoderをしています。iPadは起動がめちゃくちゃ早いしサクサク動いてくれるのでいつでもどこでもストレスなく精進をすることができます。

従来のコードテスト手法

import sys

if sys.platform =='ios':
	sys.stdin=open('input_file.txt')

iPadPython競プロerにとって、従来のコードテスト環境はこれでした。書いているコードと同じディレクトリにinput_file.txtを用意してそこにコードテストの入力例をペースト、それを上記のコードを利用して入力代わりに受け取ることでコードテストを実現していました。別にこれでも実用レベルではあったのですが、input_file.txtをいちいち開いてコードテストをするのがめんどくさいこともありました。特に入力例が3つあるのは最悪で、3つ目をテストするのが面倒でそのまま出した結果WAを出したことが998,244,353回くらいあります。多分そんなにないですが。ということでこれを改良していきます。

clipboardモジュールについて

これはPythonista3だけでサポートされているクリップボードにアクセスできるめちゃくちゃ便利なモジュールです。今回の高速コードテストを可能にする要です。でもPythonista3だけでサポートされているのでAtCoderの実行環境に投げるとバグります。

f:id:syleir:20211203224341p:plain

f:id:syleir:20211203224352p:plain

これを頑張って使いたいんですけどエラーを吐くのでうまく回避しなければなりません。ついでにいろんなエラーを吐きやがりました。ということで試行錯誤した結果できたのが下のコードです。(3分クッキング)

新手法でのコードテストの実演

import sys
if sys.platform =='ios':
	import clipboard
	a=clipboard.get()
	a = a.split('\n')
	text = '\n'.join(a)
	with open('input_file.txt','w') as f:
		f.write(text)
	sys.stdin = open('input_file.txt')

これを提出したいコードの上に書いておくだけで高速にコードテストができます。iOSプラットフォーム下だけで動かすことでAtCoder環境では普通に動くようになってます。同じディレクトリに'input_file.txt'が存在しない時には'input_file.txt'を作成してクリップボードから変換して貼り付け、存在する場合には元にあるものを上書きして貼り付けすることでどんな状況でも入力を与えることができます。複数行の入力にも対応しています。これで1秒でコードテストをすることができます。

実演した動画がこれです。iPhoneだとちょっと小さいかもしれないんですけどギリいける感じに頑張りました。

youtu.be

 

自分の環境とおすすめのキーボードなど

さて、ここまでiPadでPythonista3を使って環境構築なしでお手軽競プロ環境を作ってやるみたいな話になってましたが、新規でiPad競プロ水たまりに皆さんを落とす上で少しお手伝いをしたいと思っています。競プロをする上でのiPadの選択とキーボードの選択についてです。人並みにガジェットは好きなのでついでに布教させてください。そんな話いらんって方は下の注意点という見出しまで飛んでください。

自分の環境の紹介

自分は収入の8割をガジェットと本に費やす悪質なガジェットオタクだったのでiPad Pro 12.9 inch + Magic Keyboardという最強構成でやってしまっています。大は小を兼ねる!最強!という主張をしています。実際上の動画みたいに動画編集やりたくなった時はできるし、大きい画面でYouTubeのサムネイル描いたりできるし活用はしているのですが、競技プログラミングではそこまでのスペックは必要ないので、ありうる条件を考えてそれに見合った構成を考えたいと思います。

本体の選び方

2021 Apple 12.9インチiPad Pro (Wi-Fi, 256GB)

2021 Apple 11インチiPad Pro (Wi-Fi, 256GB)

2020 Apple iPad Air (10.9インチ, Wi-Fi, 256GB)  (第4世代)

2021 Apple 10.2インチiPad (Wi-Fi, 64GB)

2021 Apple iPad mini (8.3インチ, Wi-Fi, 64GB)

 

現在iPadは上位の5種類展開しています。

 

値段

値段は随時セールがあったりして変動するのですが
12.9インチiPad Pro > 11インチiPad Pro >> iPad Air > iPad mini  >>> iPad 無印
です。各々予算に相談してください。

画面サイズ

画面サイズに関しては上の数字を見ていただければわかりますが、

12.9インチiPad Pro > 11インチiPad Pro ≒ iPad Air ≒ iPad 無印 >> iPad mini
です。自分が現在12.9インチiPad Proと11インチiPad Proの使用していて思うこととしては、画面サイズは大きい方が操作性と視認性がよく競技プログラミング環境的にはいいです。ただ12.9インチというサイズはMacbook Airの画面サイズが13インチということを考えるとパソコン並みでタブレットとしての機動力には欠けます。なので10〜11インチクラスのiPadを使用するという戦略もありです。自分も11iインチiPad Proでのコーディングをたまにやっていました。

ただし、iPad miniに関しては画面サイズが小さいため、画面分割すると使用領域が著しく狭くなり、コーディングに支障が出るため競技プログラミング目的としては非推奨です。持ち歩きには軽くていい端末ですが‥

スペック

競技プログラミングに関してはiPad 無印 で十分快適に行えます。自分は現在の12.9インチiPad Proにするまでは2014年に購入したiPad無印でコーディングをしていましたが競技プログラミングのコーディング程度なら問題なくできました。今のiPad無印は当時のスペックよりも大幅に進化しているので快適に行えます。スペック面では他のiPadの使用用途に応じて考慮するのがよいと思われます。

本体容量

競プロ専用機として使うなら一番少ない64GBでも過剰ですがせっかく買う機体、そんなことはないと思います。普段使いするなら256GB以上がおすすめです。

Apple pencilについて

自分は考察もiPad上でしています。この時画面に手書きメモするのにApple Pencilを使います。このApple Pencilには2種類あり、旧型の第1世代と新型の第2世代があります。iPad無印だけは新型に対応しておらず第1世代を使用しなければならないのですが、充電形式が絶望的な絵面をしているのでこれが許せない人は無印はおすすめしません。

f:id:syleir:20211206203022j:plain

第一世代Apple Pencilの充電形式


キーボードの選び方

キーボードの選択についてはまず自分の使いたいキーボード配列がJISなのかUSなのかで大きく選択肢が異なります。

JISキーボード

JIS配列を使用したい場合は公式のキーボード一択になります。サードパーティー製のJIS配列のbluetoothキーボードはiPadだとUSキーボードとして認識されてしまうためです。書いてある記号と違う記号が打ち込まれるストレスは本当に異常なのでJIS配列のUSキーボードは買わない方がいいです。

f:id:syleir:20211206191830p:plain

f:id:syleir:20211206192331p:plain

こういうiPadのキーボードとして無線のJIS配列キーボードを推奨しているYouTuberは編集用途で使っておりひらがなしか打たない人です。記号をあり得ない頻度で打つ我々にとってこの問題は死活問題なので気をつけましょう。僕は一度乗せられて購入して見事にこれで失敗しました。

 

純正キーボードの選択肢としては、

全機種対応

Apple Magic Keyboard - 日本語(JIS) (分離型)
 

12.9インチiPad Pro 

Apple Magic Keyboard 12.9インチiPad Pro (一体型、トラックパッド付き)
Smart Keyboard Folio12.9インチiPad Pro (一体型、トラックパッドなし、軽い)

11インチiPad ProiPad Air

Apple Magic Keyboard 11インチiPad Pro・iPad Air (一体型、トラックパッド付き)
Smart Keyboard Folio 11インチiPad Pro・iPad Air(第4世代)(一体型、トラックパッドなし、軽い)

iPad 無印

Smart Keyboard iPad(第8世代)(一体型、トラックパッドなし、軽い ※リンクは第8世代のものですがこのSmart Keyboardは最新のiPad第9世代でも使えます)

iPad mini

一体型キーボードの発売なし

 

 

という感じです。一体型が良ければ上に紹介したキーボードを使えばよいし、分離型が良ければApple Magic Keyboardという選択になると思います。分離型を使う場合はiPadタブレットスタンドに乗せた上でMagic Trackpadで操作するとQOLが爆増します。タブレットスタンドに関しては頑丈さ、関節の硬さ、持ち運びのしやすさなどの観点で色々な選び方があると思うので各自合うものを選んでいただければいいと思います。またiPadにおけるトラックパッド操作はめちゃくちゃ快適なので一体型のトラックパッド付きのキーボードかMagic Trackpadの導入はめちゃくちゃおすすめです。お財布にはやや手痛いですけどね。

 

これは折り畳んで持ち歩けるし関節も硬くてしっかりホールドしてくれるのでめちゃくちゃ使っててよかったタブレットスタンドです。

USキーボード

US配列に関しては上のようなバグは存在しないのでサードパーティー製のも含めて自由に構築することができます。純正のペアリングの速さにはなかなか勝てないので純正が無難です。上に紹介したもののUS配列版を購入してくれたらとりあえず大丈夫ですが、お金がない学生など、安いサードパーティー製の使用も視野に入るかなと思います。

なお自分はガジェットオタクを拗らせて、サードパーティ製のUSキーボードはHHKB Professional HYBRID Type-S 無刻印を使用しています。これは最高のキーボードなので競プロ民全員使った方がいいとガチで思っているので布教しておきます。関連する過去記事はこちらです。

syleir.hatenablog.com

syleir.hatenablog.com

さてロマンだけのキーボードはさておき、実用範囲のそこそこコスパのキーボードをいくつか紹介します。

1.Anker ウルトラスリム Bluetooth ワイヤレスキーボード

とにかく安い。2000円でそこそこ使えておすすめです。コスパは最高。

2.ロジクール MX KEYS KX800M

テンキー付きの無線キーボード。高級路線を行くので打鍵感がいいです。テンキー付きなのもおすすめ。持ち歩きはやや厳しいけど家に置くならいいと思う。デザインもかっこいい。3台まで同時にペアリングして切り替えができるのでパソコンとも共用できる。最近MX KEYS miniというこれのテンキーレス版が出たらしいけどそれはJISしかないらしい。US版が欲しいけど個人輸入するしかない。手軽に買えたらそれを推していたんですけど。

3.iClever キーボード ケース タッチパッド付き

コスパにこだわるiPad無印使いの方へ。タッチパッドがついててこの安さはすごい。純正じゃないのでキーボードも適宜充電する必要があるのだけが難点。

 

US配列ならこれら以外にも色々選択肢があります。自分はプログラミングをやるならUS配列の方が合理的で好きです。

結局おすすめは?

考えられるパターンごとに構成を考えたいと思います。

1.大画面で快適に最強構成で競プロをしたい!動画編集とか3Dモデリングも将来やってみたい!

12.9インチiPad ProApple Magic Keyboard 12.9インチiPad Pro

 

2.そこそこ普段使いもするけど別に動画編集とか重い作業は頻繁にやるわけじゃない、大学のノートを取ったりPDFで勉強したりはしてみたい!

iPad AirSmart Keyboard Folio 11インチiPad Pro・iPad Air(第4世代)
oriPad AirApple Magic Keyboard

 

3.世の中コスパで出来ているという思想がある。最安値構成でやりたい。他の用途は想定していない。鬼の精進をするので他のことをする時間はない。

iPad無印Anker ウルトラスリム Bluetooth ワイヤレスキーボード

この辺をサポートしておけば自分の必要レベル感を補間して必要な機材を選択できると思っています。傲慢でしょうか。もしわからなければ自分のやりたいことと予算や条件などをコメントいただければできる範囲でお答えします。

注意点

numpyとPythonのバージョン

Pythonista3におけるnumpyとPythonのバージョンは次のように確認することができます。

f:id:syleir:20211208172650j:plain

f:id:syleir:20211208172654j:plain

 

実際のAtCoder環境は

numpy 1.18.2

Python 3.8.2

 

なのでこの辺のバージョンが違うことによるエラーに注意する必要はあります。例えばABC-Dくらいで用いる逆元のmodを利用する問題では、pow関数を利用することがPython3.8よりできるようになりましたがPython3.6ではできなかったりします。

残念ながらこれらのアップデートはできません。環境構築がいらない代わりにこの辺の融通は効かなくなっています。世の中にはトレードオフはつきものです。許してください。この辺のバージョン起因の差が気になるようになったらABC-CやDでライブラリを使って楽したくなってくる頃だと思うので環境構築のはじめどきかなと思います。自分はまだ自作ライブラリを作って粘っているんですけど。。

Cythonとnumbaでの高速化

Cythonについては学習コストが高くて試したことがないんですけど軽く調べた限りは出来なさそうでした。

f:id:syleir:20211208171846j:plain

numbaをインストールしようとしてみた

numbaについてはPythonistaではStaShを使ってダウンロードするのですが、この画面で静止して出来なそうでした。実際numbaの要求する制約として比較的新しいnumpyのインストールが必要そうで、上述したようにnumpyの最新版のインストールはできないので要求を満たすことができなさそうです。

Scipy使用不可

これはGitHubのissueにもあるのですが、Scipyは使えないようです。これが個人的に少し嫌だなとは思うのですが、初心者のうちは心配する事案ではないかなと思っています。

 

Pythonista3で競技プログラミングをやる際にはこれらのことに気をつける必要はありますが、水色レベルまではこれらに拘泥するよりは新しいアルゴリズムを覚えたり、実装の練習をする方が優先かなと思います。今までやってきて困ったケースは高速化が足りないというよりは自分の実力が足りず適切なアルゴリズムが設計できていないケースの方が圧倒的に多かったです。

やってみてこれらのライブラリの必要性に気づいたら環境構築の勉強をして、自分の好きな環境を作ってみたらいいと思います。必要性に駆られたら環境構築も勉強する気が起きると思いますが、ほんとに競プロを始めたい人が環境構築からやって挫折してせっかく始める機会を逃すというのが一番勿体無いです。Pythonista3も万能ではありませんが、初心者の環境としては85点くらいあると思います。「とりあえず始めてみる」ができるのがこのアプリの強みです。

あと、そういう条件の問題は低レベルの問題ではほとんどありませんが、仮に出くわした場合の応急処置としてAtCoderのコードテストを利用するという手もあります。コーディングは補完や自動インデントが効くのでPythonistaでやって、コードテストだけ公式に投げるといいと思います。バージョンが起因のエラーが起きてそうとかの場合もコードテストに投げると原因が分かったりします。

 

(余談)kaggleには向かない

AtCoderだけやりたい人は読み飛ばしてくれればいいのですが、Pandasやscikit-learn、Tensorflow、Kerasといったkaggleに便利なライブラリはscipyや新しめのnumpyをベースに動いているのでインストールできません。まあそもそもkaggleにマシンスペックが追いついていないのでやる人はあまりいないと思いますが。。。

Python初心者の方へ

この記事を読んでPythonで競プロを始めてくれる方がひとりでもいてくれたら嬉しいのですが、Pythonistaを入れておしまいということはなく、この後はPythonの書き方と競技プログラミングの考え方を学んでいく必要があります。Pythonで競プロをやるというムーブは競技プログラミング界では比較的新しめの概念なので(要出典)、成書が少ないのが特徴です。自分が初心者だった頃(4年前くらい)はC++という言語で書かれた本しかなく(例えばこれとか)、それを読み解いて頑張って勉強するみたいなムーブが主流でしかも難易度が高くて挫折していました。競プロ入門書って全然入門書じゃないやんみたいなこと結構ありませんか?またPythonが上手い人のコードをみて勉強しようとしても意味わからんコード書いてて全然勉強にならんしなあと思ってTwitterを開いたりしていました。今思うと勉強が下手だったのかもしれませんが。

最近、Pythonで競プロをやろうみたいなニーズが少しずつ増えてきて、ついにPythonで競プロをやろうという本が出版されました。Pythonistaが増えるとこういう本とか熱い記事が出てくれるので皆さんもPythonの普及を頑張りましょう。

 

この本は名目上アルゴリズム実技検定(PAST)という検定の対策本になっていますが、実際は初心者がPythonAtCoderを始めて緑色や水色を目指そうという本です(知らんけど)。最初の文法から基本的なアルゴリズムまで詳説されているので初心者におすすめです。どこの馬の骨が書いたかもわからない下手な記事(このブログの他の記事とかそうですね)に載せられて勉強するよりずっと道筋立った勉強をすることができます。

この本で基本的な勉強をしつつ少しずつコンテストに出て過去問を解くというのが今のいい感じのPython初心者におすすめのムーブな気がしています。

Pythonista3を深めたい人へ

Pythonista3というのはなかなか利用者が少なく、AtCoderみたいにコミュニティも活発じゃないです。この記事でPythonista3に興味を持ってくれた方、知見をぜひ共有してください。あとPythonista3に関する成書はPythonではじめるiOSプログラミングしか現状ではないと思います。この本は前半でゲームの制作について、後半でアプリの開発について知見を詳しく書いてくれています。Pythonista3はGUIを使ったアプリの制作もできるんですけど、各オブジェクトについて、どのネット記事よりも詳細に書かれています。

 

余談:M1Macでも環境構築なしで Pythonが動く、そうPythonista3ならね

Apple siliconを搭載したMac(M1Mac)はiOS, iPadOSアプリを動かすことができます。
AppStoreを起動→pythonistaで検索→iPhoneおよびiPad Appを選択するとダウンロードできてPythonista3を起動できます。実はM1MacでもPythonが環境構築せずに動作してしまいます。

f:id:syleir:20211207001416p:plain

M1MacにPythonistaをダウンロードする

アプリの注意書きにmacOSでは検証されていませんとありますが上のコードは問題なく動きました。とはいえiPadのアプリなのでマウスの挙動が最適化されてなくてキーボードショートカットを多用することになります。全選択→command+Aとかshift+方向キーとかが使えれば問題なく使用できます。

f:id:syleir:20211208231614p:plain
f:id:syleir:20211208231620p:plain
Macでも動きました

まとめ

iPadAtCoderやるならPythonista3がおすすめ!

クリップボードにアクセスできて高速にコードテストができます。

・環境構築不要なので初心者にもおすすめ!

 

色々間違ってることとか怪しい記述とかあるかもしれません。コメントください。Twitter:@_vy3です。遊びにきてください。またのお越しをお待ちしています。あときっと明日の記事もPython初心者にお役立ち情報が投下されるんだと思っています。これからも競プロ Advent Calendar 2021をよろしくお願いします。