stylesheet

2020-01-07

新年あけたらWindowsで障害

新年早々Windowsで障害発生。
どのタイミングで壊れたかは不明だが、再起動後におかしいことに気付く。

以下、トラブルシューティングのメモ。

障害の特定

タスクバーのアプリアイコンが正しく表示されていないのを発見
クリックしてもアプリが起動せずエラーメッセージが表示される。障害発生を認識し、調査開始。

試しにGoogle Chromeを起動
一見、正しく起動したように見えるが、Googleアカウントからログアウトした状態で起動した。

Firefoxを起動
プロファイルが見つからないと言われ、起動できない。ディスクの障害を疑う。

Firefoxのプロファイルを探してエクスプローラで%appdata%フォルダを開く
Roamingフォルダにアクセスできず。Roamingフォルダが壊れた断定。

CHKDSKで修復

完全検査オプション付きでCHKDSKを実行して修復できるか試す。

$ chkdsk c: /r
ファイル システムの種類は NTFS です。
現在のドライブはロックできません。

ボリュームが別のプロセスで使用されているため、CHKDSK を
実行できません。次回のシステム再起動時に、このボリュームの
チェックをスケジュールしますか (Y/N)? y

次回のシステム再起動時に、このボリュームはチェックされます。

再起動後のスキャンが26%で止まって動かない。
強制再起動で仕切り直し。

今度は読み取り専用でチェックのみを実行。

$ chkdsk.exe c:
ファイル システムの種類は NTFS です。

警告: /F パラメーターが指定されていません
CHKDSK を読み取り専用モードで実行します。

ステージ 1: 基本のファイル システム構造を検査しています ...


  717312 個のファイル レコードが処理されました。

ファイルの検査を完了しました。


  39765 個の大きなファイル レコードが処理されました。


  0 個の問題のあるファイル レコードが処理されました。

ステージ 2: ファイル名リンケージを検査しています ...


  321 個の再解析レコードが処理されました。
ファイル 1463 のインデックス $I30 で、エラーが検出されました。
ファイル 1463 のインデックス $I30 で、エラーが検出されました。


  950234 個のインデックス エントリが処理されました。

インデックスの検査を完了しました。

エラーを検出しました。読み取り専用モードでは CHKDSK を続行できません。

エラーの検出に成功したので、今度はエラー修復オプション付きで実行。

$ chkdsk c: /f
ファイル システムの種類は NTFS です。
現在のドライブはロックできません。

ボリュームが別のプロセスで使用されているため、CHKDSK を
実行できません。次回のシステム再起動時に、このボリュームの
チェックをスケジュールしますか (Y/N)? y

次回のシステム再起動時に、このボリュームはチェックされます。

今度は無事に修復が完了。

復旧を確認

エクスプローラで%appdata%フォルダを開く -> OK。データは無事のよう。
Firefoxを起動 → OK
Google Chromeを起動 → OK

運良くファイル消失は発生しなかった模様。
念の為、再度、完全検査オプション付きでCHKDSKを実行して完了とする。

$ chkdsk c: /r

今回障害が発生したディスクはSamsungのSSD MZ7TE256HMHP
S.M.A.R.T.によるとDrive Remaining Life92%となっていた。今後もまだまだ障害が起こりそうではある。

2020-01-04

PhotoVision TV 202HWの制限解除

年末大掃除で、いただき物の202HWが出てきた。
基本、テレビは殆ど見ないこともあり、いただいてすぐにしまい込んでいたのだと思う。

この製品について改めて調べてみると、フルセグ、防水、外部アンテナにも対応するなど、契約者数水増しや契約解除忘れを狙ったセコい商売といった事情があるにせよ、実質タダのおまけ製品としてはなかなかのものだったのではないだろうか。

ただし、この製品、専用のSIMを抜いたり契約を解除するとTV視聴時やスライドショー時に、以下のようなメッセージが画面半分を専有し大きく視聴が制限されるようになるというトラップ付きであった。

3G通信が限定されているため緊急地震速報等の一部機能が使用できません。 通常の状態へ戻すには電波の良いところへ移動するか、お客様の契約状態をご確認ください。

そういった事情もあって、当方が譲り受けることとなったわけではあるが、またしかし、ある界隈ではこの制限の解除手法が確立されており、比較的簡単に行えることも知られている。

前置きが長くなったが、今回はこの製品PhotoVision TV 202HWの制限解除を行う方法をメモ。

無事制限解除成功の暁には、防災グッズとして災害時の出動に備える予定だ。

§ 解除手順

TL;DR

大まかな手順は以下の通り。202HW本体のファームウェアバージョンはα28.1であった。

  • 基板上のRxとTx信号を使用してシリアルコンソールに接続。
  • SDカードに保存しておいたTV制限解除プログラム(apk)をインストールしてTV制限解除。
  • システムファイルを改鋳版と差し替えてスライドショーの制限解除。
  • シェルコピーでルート化、ADBサービス有効化でUSBアクセス復活。

使ったもの

  • ハンダゴテ
  • はんだ
  • ジャンパー線
  • プラスドライバー
  • カッターナイフ
  • SDカード
  • Orange Pi Win (シリアル通信用)
  • Windows PC

ファイルの入手先

基板上のRxとTx信号を使用してシリアルコンソールに接続。

202HWの電源をOFFにし、裏蓋2枚を外して基盤を露出させる。細かい作業になるのでディスプレイを取り外したほうが作業しやすい。
基板裏面にアクセスできたら、カッターやドライバー等でレジストを剥がしてはんだ付けする。接触が悪いと通信に支障が出るので、導通を確認しながら丁寧に。

シリアル接続にはUSBシリアル変換器を使用するのが一般的だが、あいにくと所持していないためOrange Pi WinのGPIOで代用。UART2を使用する。

GPIO UART2
CON1-P32 UART2_RTS PB2
CON1-P36 UART2_CTS PB3 
CON1-P38 UART2_TX  PB0 
CON1-P40 UART2_RX  PB1 

P32のRTS(Request To Send)とP36のCTS(Clear To Send)は、フロー制御用の信号線なので今回は使用しない。

202HWとは最小構成のUARTで接続。 一方のTX(Transmit Data)と他方のRX(Receive Data)を互い違いに結線するクロス結線を行う。(202HWのTxをOrangePiのRxへ、OrangePiのTxを202HWのRxへとつなぐ。)

結線を完了したら、OrangePiからシリアル通信を開始する。
ソフトウェアは今回はminicomを使用。

$ sudo apt install minicom
$ sudo minicom -s

ポート:/dev/ttyS2 速度:115200bps データ:8bit パリティ:None ストップ:1bit フロー制御:None

ACアダプタを接続して充電状態にするとターミナルにずらずらとLinuxの起動メッセージが表示されるので、起動完了まで暫く待つ。
準備ができたらENTERキーで202HWのコンソールに接続できる。

取りこぼしたデータは文字化けとして現れる。

充電モードの場合はルート起動するのでコンソールもルートシェルになる。

SDカードに保存しておいたTV制限解除プログラム(apk)をインストールしてTV制限解除

TVの制限解除を行うためにapkをインストールする。通常のAndroidと同じようにpmコマンドが使用できる。
APKファイルの受け渡しにはSDカードを使用すると良い。

$ pm install /mnt/sdcard2/photovision_tv_function_unlocker.apk

上記プログラムを追加すると、メニューへ制限解除ツールが追加される(「本体設定」の下に追加される)ので、そちらから制限解除の有効/無効を行えるようになる。

制限解除プログラムはGitHubで公開されている。

https://github.com/173210/photovision_tv_function_unlocker

およそ7年前のプログラムではあるが、特に問題なく動作した。
ざっとソースコードを確認したところ、ContentResolver経由でnone_alert_mode設定を変更しているだけのようだ。

システムファイルを改鋳版と差し替えてスライドショーの制限解除

ざっくりと、dpf-libs.jarファイルをSDカードへ抽出し、WindowsPC上で改鋳版を生成、本体へ書き戻しといった手順となる。

システムファイルを改鋳することになるので最悪起動できなくなることに留意する。

jarファイルをSDカードに吸い出す。cpコマンドは使用できないので、ddコマンドで代用。

$ dd if=/system/framework/dpf-libs.jar of=/mnt/sdcard2/dpf-libs.jar

入手したjarファイルをPC上で、展開、デコンパイル、パッチ当て、再コンパイル、再圧縮を行う。
必要なプログラムを同梱したスクリプトが用意されているのでそれを使用する。javaは別途インストールが必要。
今回はOpenJDKをインストールしたので、パスを通して、スクリプトを実行する。jarファイルはスクリプトと同じ場所にコピーしておく。

$ set path=%path%;c:\jdk-13\bin
$ go.cmd

生成したmod.jarをSDカードに保存し、202HWへ受け渡し、ルートコンソールでオリジナルと置き換える。

$ dd if=/mnt/sdcard2/dpf-libs_mod.jar of=/system/framework/dpf-libs.jar
$ chmod 644 /system/framework/dpf-libs.jar
$ reboot

システムを再起動するとシステム更新処理が走り、スライドショーが制限解除される。

シェルコピーでルート化、ADBサービス有効化でUSBアクセス復活。

ルートシェルで、シェルをコピーしてsuコマンドを生成。また、adbサービスを有効化してmicroUSBでアクセスできるようにする。


$ cd /system/bin
$ cat sh > su
$ chmod 4755 su

$ setprop persist.service.adb.enable 1

以上。

2019-12-18

今日はSNSアカウントの収集日

I don't give a fuck about your Instagram

ロシアからアカウント乗っ取りということで久々にログイン。
パスワード変更とプライバシー設定の見直しをしておいた。

8年ぶりの休眠ユーザーの召喚に成功するとは、流石の運営。
今月のアクティブユーザー一人増えたね。

大統領選中にトランプとのツーショット写真をシェアしてたと思うと、そのままにしておいたほうが良かったかもしれない。

2019-12-11

LightDMでlibvert-qemuアカウントを表示しない

LightDMのログインスクリーンでシステムアカウントのlibvert-qemuが表示されて目障り。
いつまでたっても修正される気配がないので、設定を追加して対処する。

作業を行う環境は以下の通り。
elementary固有の現象なのか、それともubuntuにも発生するのか。

$ cat /etc/lsb-release

DISTRIB_ID=elementary
DISTRIB_RELEASE=5.1
DISTRIB_CODENAME=hera
DISTRIB_DESCRIPTION="elementary OS 5.1 Hera"

SystemAccount=trueを記述した設定ファイルを作成する。

$ sudo emacs /var/lib/AccountsService/users/libvirt-qemu

[User]
SystemAccount=true

accounts-daemonサービスをリスタートするか単純にシステムを再起動する。

$ sudo service accounts-daemon restart 

以上。

2019-11-06

GRUB2 タイムアウト時のデフォルトを最後に選択した項目にする

GRUB_DEFAULTsavedへ変更、GRUB_SAVEDEFAULT=trueはなければ追加する。
$ sudo nano /etc/default/grub

  GRUB_DEFAULT=saved
  GRUB_SAVEDEFAULT=true

$ sudo update-grub

デュアルブートでWindowsも使用する人に便利。
大型アップデートで何度も再起動が必要な時に威力を発揮する。

2019-09-12

TCSUNBOW SSD N4 240GB M.2 2242 を購入

M.2 2242 SATA 6G/sのSSD。旧Thinkpad等に使える2242サイズの変態用。

お客様のハードディスクをアップグレードする時が来ました
その通りです。これはストレージのトレンドと未来の形です!

等、ふざけた商品説明が並ぶ格安中華品。

ちゃんとしたパッケージ入りで3年保証との記載はあるが、ウェブサイトwww.tcsunbow.cnは既にコンテンツなし。保証を受ける場合は記載の住所に殴り込む必要があるか。

取付用のネジ付属。

当然のようにチップを隠すようにシールが貼られている。使用チップは公言していない。

裏面にはチップなし。2019年6月製造だろうか。結構最近まで製造されていたようだ。

記載を信じるならば、Silicon Motion製SSDコントローラーSM2258XTとTOSHIBA製の3D NANDが使用されている。NANDのほうにはTH58TFと記載されているようにも見えるが、老眼が進んでよく見えない...。

Thinkpad T440pに取り付けると特に問題なく認識された。こちらのディスクにはLinuxをインストールする予定。

速度控えめ、発熱多め。
3年保証はともかくとして、初期不良の交換は受け付けてもらえるだろうし、Amazonで3000円強の値段で購入できることを考えるとそう悪いものでもない。

2019-08-06

Echo Show 5 ファーストインプレ

Amazonのいつものセールで購入したのでメモ。Amazon Music Unlimited 6ヶ月が付いて5,980円にて購入。定価は9,980円のようだ。

以下、主なスペック。

  • ディスプレイ: 5.5インチ (960×480)
  • プロセッサ: MediaTek MT 8163
  • スピーカー: 1.65インチ 4W
  • カメラ: 1メガピクセル
  • ポート/ボタン: マイク/カメラのオン/オフボタン、カメラカバー、音量ボタン、3.5ミリステレオジャック、Micro USB電源ポート、電源ポート
  • ワイヤレス: Wi-Fi (802.11a/b/g/n/ac)、Bluetooth
  • サイズ: 148×86×73ミリ、410グラム

ハードウェア的には1万円以下で販売されているような格安タブレットと同等かそれ以下の性能。バッテリーを省略している分だけ割高とも言える。

2週間ほどの使用で一度、何を言っても「わかりません」と返すようにバグったので、ファクトリーリセットを行った。Alexaアプリに関してもそれなりに不具合などあるので、トラブルフリーと言うわけでもなさそう。

付属品はACアダプターと薄っぺらいマニュアル。

12V 1.25AのACアダプター。USBアダプターのような見た目だが昔ながらのDCジャック。

上部はカメラシャッター、音量アップ、音量ダウン、ミュートボタンが並ぶ。小さな穴は集音マイク。
マイクはもう少し頑張ってほしかった。 少し離れると大声で呼びかけないと認識に失敗することが多くなる。卓上使用なら問題ないが、リビングでテレビ横に設置の場合は覚悟が必要。

物理的にカメラを遮るカメラシャッターは最近の流行り。ボタンを指でスライドさせる簡素な造り。
アレクサでは操作できない...。いや、アレクサに覗かれる心配は無用。

背面には電源ポート、マイクロUSB端子、3.5mmオーディオ出力端子が並ぶ。マイクロUSBは電源用ではないとのこと。

macアドレスは化粧箱の底面に記載。WiFiネットワークへの接続をmacアドレスで制限している場合に便利。
デバイス側にセキュリティはないに等しい。万全を期すため、侵入を防ぐ強固なネットワークやスマートキーによる入退室記録を備えた遮音防音ブースを用意して挑みたい。

一見するとネット部分から音が出る無指向性スピーカー風デザインだが、 本当のスピーカーは4Wものが下向きに配置されている。接地面に音を反射させて拡散させる仕組み。
わざとらしい低音を奏でる小さなスピーカーだが、BGM用としては十分とも言える。

5.5インチ (960×480)のタッチスクリーンディスプレイ。映り込みは半端ないが、使用中はそれほど気になるものでもない。

全般的なフィーリングは、まさしく格安中華タブレットそのものといったもの。値段なりの性能、値段なりの外観。ソフトウェアに関しても、過剰な期待は裏切られる。そもそもスマートスピーカー自体、世代を重ねてきたとは言え未だ家電レベルには達しておらず、使い続けるには広い心と忍耐が試され、利用者側の学習も必要。

製品としては、安定のAmazon品質。 『多少の不満はあるが我慢すれば使える。安いので我慢。』だ。 ただし、スマートスピーカーを試してみたい向きにはそれなりにおすすめできる商品。最悪、デジタル時計にはなるのでまったくの無駄とはなりにくいはず。

2019-06-25

OnePlus3T (A3010) の通話録音機能を有効化

Android 9ベースのOxygenOS 9.0.3でも機能したのでやり方をメモしておく。

$ settings put global op_voice_recording_supported_by_mcc 1
adb接続などでop_voice_recording_supported_by_mccフラグをOnにする

フラグを立てると"電話"アプリの設定にCall Record項目が表示される。

Call Record設定に入って通話録音の設定を行う。すべての通話を自動で録音するよう設定した。
この状態で電話を受けると自動で通話録音が開始された。当然、切ると録音終了。

録音した内容は"レコーダー"アプリで再生できる。
端末スピーカーでの通話は、受話・送話ともに正常に記録されていた。

再起動するとフラグがリセットされるので、起動時に毎回行う必要がある。
init.rcで行ってもよいが、よりカジュアルな方法としてMacroDoroidというアプリでマクロを作成した。

以上。
下手なアプリをインストールするよりよっぽど安定して使える。

2018-12-22

自転車タイヤ交換 SCHWALBE KOJAK

寒いのでお部屋遊びが捗るわ。

20インチミニベロ、ルック車のタイヤを交換。
銘柄はSCHWALBEのKOJAK
ブラックフライデーセール時にCRCで購入したもの。届くまで3週間程かかった。

Schwalbe Kojak。白いホイール、黒いタイヤ、クリアキャップのミスマッチ。

SCHWALBE KOJAK

Size:ETRTO 35-406 (20 x 1.35 Inch)
Typ:Wired
Compound:SpeedGrip
Execution:RaceGuard
Color:Black
Skin:Lite
Weight:285 g (10 oz)
Pressure:4.00 - 6.50 Bar (55 - 95 psi)
Maximum load:70 kg
EPI:67
Profil:HS385
Article number:11100063.02
EAN:4026495853811
Tube:6, 6A

合わせてチューブもSCHWALBEのものに交換。
米式バルブ。 28-406 (20 x 1.10)から40-406 (20 x 1.50)サイズまで適合するようだ。

SCHEWALBE AV6

Marking:AV 6
Article number:10413310
Version:STANDARD
Weight:95g
Valve:AV
Valve length:40

取り外したKendaの臭うタイヤ。

もともと装着されていたものはKENDA 32-406 (20 x 1.25)なので一段太いものとなる。

また、空気圧はKENDAのものが2.8-4.5BARなので、1.5倍近く圧を掛けることが可能。 (もっとも、所有している空気入れでは5BAR以上入れると接続部からエア漏れしてしまうが)

ダサさ3割増しのトレードオフとして、お尻への負荷は程々に、楽に速度が出るようになることを希望。
寒いから乗らんけど。

2018-12-01

2018年度のAndroidアプリ開発に関して その2

久々にAndroidアプリを製作してみたら、太古の時代とはいろいろと状況が変わっていた話のその2。
今度は、大幅にパワーアップしたPlay Consoleに関して気になった機能を挙げていく。

App Signing (アプリの署名)

サーバー側でアプリへ署名を行う仕組み。
アップロードキーで署名してパッケージをアップロードするとサーバー側で配布用の鍵で署名し直してくれる。

厳重管理の配布用鍵を共有する必要がなくなるので運用が楽になる。組織にもよるが、アップロードキーはgitへ含めてしまって問題ないように思える。

Android App Bundle (アーティファクトライブラリ)

aab。以前のapkに変わるもの。

aabでアップロードすると、Google Play側で各端末に最適化(不要なリソースを削る等)したapkを生成してくれるので、ユーザーのダウンロードサイズを抑えることができる。 アプリの分割配信にも対応。

apkやaab等をまとめてアーティファクトと呼称するようになったようだ。また、(aabから生成したものではない)以前の形式のapkを、ユニバーサルAPKと呼ぶようになった。

リリース前レポート

テスト端末を使用した自動化された受入テスト(品質テスト)が行える。

Firebase Test Labの機能が一部取り込まれたようだ。Robo Scriptにも対応している。

アプリのリリース

トラック(配布チャンネル)が「内部テスト版トラック」「クローズドトラック(アルファ版)」「オープントラック(ベータ版)」「製品版トラック」の4つに整理された。

段階的に公開範囲を広げていくリリースシナリオに沿ったもののようだ。初版リリース前なら「内部テスト版トラック」を作成することで、ストア表示の確認にも使える。

ストア掲載情報のテスト機能

ストア表示のプレビュー機能が搭載されたか誤解したがそうではなく、ストア掲載情報に関してのA/Bテストが行える。(50%のユーザーに対しては別パターンの画像を表示等)
アプリのA/Bテストですらないので開発者が気にする類ではない。広告屋によるマーケティング担当に向けた機能。

以上、気になった機能を挙げてみた。

外部サービスが必要であったものもPlayコンソールで行えるようになっており、企業による本格的な開発におけるリリース管理全般に使えるような改善が行われている。
QAやマーケ担当に向けた機能が充実しており、以前は開発者が使うものといったイメージを持っていたが認識を改めたいと思う。

また、逆説的にそういった機能が必要となる程、今のアプリは多様な人材が必要で、組織立って多大なコストをかけて行う重いビジネスとなってしまったのだと感じてしまう。

戦略会議で意見表明するマーケティング担当

QAチームによる最終品質チェックの様子

2018-11-18

Kensington Orbit Trackball with Scroll Ring (K72337) の分解整備

Kensington製のスクロール機能付きトラックボール製品。私の記憶が正しければ、5年以上前に購入したもの。

同社トラックボールシリーズの中では下位グレードに位置するもので、比較的安価に入手できる。
特徴的なスクロール機構で根強い人気があるのか、2018年の現在でも未だにカタログ落ちせずに新品入手可能。かなりのロングセラー製品。

https://www.kensington.com/p/products/control/trackballs/Orbit-Trackball-with-Scroll-Ring/
  • 製品のコンセプト - 良い
  • 操作性 - 左右対称デザインで利き手側のクリックが難有
  • 外観 - 値段なり
  • 品質 - クリックがしょぼい
  • 価格 - ニッチな製品なので妥当

そんな製品であるが、ラップトップPCを主に使うようになったこと、クリックの切れが悪く下品で大きな音がすることから長らくジャンク箱入りしていた。

その後、環境の変化もあり、思い立って再度使い始めた。
机が散らかっている時にも省スペース据え置きで使えるトラックボールはやはり便利ではある。

しばらくそのまま使用していたが、やはりこのクリックでは快適に使用することが難しい。
そのため、分解整備を実施することとし、同時にクリック感やクリック音の改善ができればと思う。

2018-11-10

Androidアプリ開発の状況 (2018年度)

久々にAndroidアプリを製作してみたら、Lollipop時代とはいろいろと状況が変わっていたのでメモ。
以下、2018年版としてプラットフォームやよく使われるライブラリ等を表にしてみた。

2018年度Android開発

2014年頃
(Kitkat/Lollipop辺りまで)
2018年現在
(Nougat/Oreo/Pie)
備考
最低対応バージョン
(推奨)
Gingerbread
(API9)
Lollipop
(API21)
言語 Java6 Java8
Kotlin
Java8はAndroid7.0(API24)とそれ以前とで対応状況が異なる
DEXコンパイラ DX D8 Android Studio 3.1からD8がデフォルト
コード圧縮 ProGuard ProGuard
R8
次期バージョンのAndroid Studio 3.3からR8がデフォルトになる
デザイン Holo
Material
Material フラットデザイン2.0やMaterialTheming
ランチャーアイコン Bitmap画像 Vector画像 API25でRoundIcon
API26からAdaptiveIcons追加
基本レイアウト Relative Constraint
コンポーネント Support Library Jetpack JetpackでSupport LibraryとArchitecture Componentsが統合された
アーキテクチャ MVP MVVM Android Archtecture Components (AAC)のViewModel + DataBindingでMVVM
開発プラットフォーム Fabric Firebase Twitter社のFabricはGoogleへ売却された
ビューインジェクション Butterknife - DataBindingで代用
DI Guice Dagger2
イベント駆動 EventBus RxAndroid ViewModel + LiveDataだけで十分かも
HTTP通信 Volley Retrofit2
OkHttp3
画像ロード Volley Picasso
Glide
ラムダ式 Retrolambda - API24で不要

雑感

アーキテクチャ的に近年はMVVMがトレンドのようで、ViewModel + DataBinding + LiveDataあたりを組み合わせて実装する。

Kotlinに関してはクリエーターやデベロッパー色の強い開発者を中心に普及が進んでいるようだ。
ただ、SDKバージョンをAPI24まで上げるとJava8の多くの機能が使用できるので、Kotlinへのモチベーションは個人的にさがっている。

AndroidOSは毎年新しいメジャーバージョンがリリースされているが、Marshmallowあたりから個人的にはどうでも良くなってきた感がある。
最低SDKバージョンはLollipop(API21)が推奨されているようで普及率は85%となる。Java8の対応状況を考えるとNougat(API24)まで上げたいが、普及率は37.1%と苦しいところ。

尚、Nougatからがサポート中の現行バージョンとなり、Marshmallowまでは旧バージョン扱いとなっている。

参考リンク

2018-09-01

ちょっとした確認用にpythonでhttpサーバーを起動

Pythonモジュールの実行で済むわけですが...

Python2.x
$ python -m SimpleHTTPServer
Python3.x
$ python3 -m http.server

これすら覚えられずに毎回検索しているわけで...

$ touch ~/.local/bin/httpserv
$ chmod +x ~/.local/bin/httpserv
$ $EDITOR ~/.local/bin/httpserv
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Usage: httpserv [PORT=8000]

import sys
try:
    # py2
    import SimpleHTTPServer
    SimpleHTTPServer.test()
except ImportError:
    # py3
    import http.server
    if sys.argv[1:]:
        port = int(sys.argv[1])
    else:
        port = 8000
    http.server.test(port=port)

コマンド化すると補間も効くので大丈夫だろうと言うことです。