Mac mini (M1, 2020) で Dell モニタの USB ポートが使えない、画面が表示されない時のワークアラウンド

Dell モニタに 20cm の USB-C の延長ケーブルを接続

Mac mini (M1, 2020) を購入した

いろんな方がレビューしてるように、パフォーマンスは素晴らしいです。アプリケーションも、Intel CPU 用機能拡張や VPN (具体的には LogMeIn HAMACHI) などシステムの深いところに食い込んだものは動かないケースが多いようですが、それ以外は概ね想定通りで、すごく満足しています。各デベロッパの対応も早く、毎週のようにサポートされるアプリケーションが増えるのを見られるのも楽しいですね。

Dell モニタの画面が映らない、USB ポートが使えない

しかし、メインで使用している Dell のモニタ P2421DC に USB-C で接続しながら同モニタの USB ポートをハブとして使用するにはコツがいることがわかりました。モニタに電源が入っている状態で Mac mini を起動すると、USB ハブにつながったキーボードから入力できないのです。映像は出力されています。Dell Latitude 5310 や XPS では当然全く発生しません。あまり気にしていませんでしたが、そういえば MacBook Air (Retina, 13-inch, 2019) でも USB-C ケーブルを抜き差ししていたことがあるので、Mac 起動時の USB 機器の接続フローと Dell モニタ側のそれがミスマッチしているように思えます。

ともあれ、日本語ではあまり同様の症状や解決策が無いようなので、投稿しておきます。

環境:

不具合の内容:

macOS 起動後、UCB-C ケーブルで接続された メインモニタのポート USB 3.0 x2 (側面)、USB 2.0 x2 (背面) に接続した機器を認識しない。キーボードやマウスからの入力も、iPad 等への給電も行えない。

下記ワークアラウンドを実行し、キーボードやマウスが使えるようになった後も、スクリーンロックしてしばらくした後にログイン使用とすると、キーボードからパスワードの入力はできるが画面がメインモニタに表示されないこともある。

不具合の再現方法:

モニタの電源が入っている (スタンバイ) 状態 で、Mac mini の電源を投入する。macOS 起動途中から画面は表示されるが、USB 機器は使用できない。

対処方法・ワークアラウンド:

Mac の起動前にできること:

Mac の電源を入れる前に、モニタの電源を切っておく。ボクの場合は HDMI 接続のモニタもあるため、そちらでパスワード入力画面が表示されてからメインモニタの電源を入れる。ごめんなさい、テストしているときはこの方法が有効だった (と少なくとも思う) のですが、最近はなぜか全くうまくいきません。以下をお試しください。

Mac の起動後にできること:

モニタとつながっている USB-C ケーブルを抜き差しします。OS が起動してしまった後では、モニタの電源 off/on では接続されません。Mac mini 背面からケーブルを抜き、モニタがスタンバイ状態に戻ったら再接続します。

ボクは少しでも簡単にケーブルの抜き差しができるようにと、USB 3.1 Gen2 規格に対応した延長ケーブルを amazon で購入しました。本投稿トップの画像のように、モニタ側にこのケーブルを挿し、画面に表示されなかったりキーボードが効かないときに矢印の部分を抜き差ししています。スイッチ付きの USB-C ケーブルを探したが信頼できそうな (Thunderbolt として使えそうな) ものが見つかりませんでした。Mac mini 本体のポートへのケーブル抜き差しに抵抗がある、設置場所的に無理という方はこちらをお勧めします。

今後の展望:

Intel チップの MacBook Air (macOS 10.15 Catalina -> 11.1 Big Sur) でも発生しますが、本体のキーボードでログインはできるし、USB-C ケーブルの抜き差しもたいした手間じゃ無い、ということであまり気にしていませんでした。設置場所によっては Mac mini のケーブル抜き差しは面倒なので、当面は Dell のモニタの電源を切る癖を付けるしかなさそう。Dell は2021年初頭までにMacバージョンのDell Display Managerを提供する (引用元) と言っているで、近い将来解決してくれると願いたいです。

Kindle fire HD 10 は、かなりオススメ

Kindle fire HD 10 はあって損無し

あまり値下げされない amazon 最大画面サイズ 10 インチタブレット、Kindle fire HD 10 が、Cyber Monday 2019 (2019/12/9 23:59まで) で値下げされています (通常価格の 6,000円オフ)。これは、買った方がいいです。

10 インチスクリーンの魅力

本記事の投稿人は前バージョンを所有していますが、10インチという画面の大きさは Kindle 本を読むのには本当に便利です。特に、自宅でパソコンの横で技術書を開くときや、リビングで雑誌を横開きで眺めるときなどには最適です。いまや Amazon Android アプリストアから abemaTV もオフィシャルでダウンロードできるので、テレビで見れない総合格闘技も綺麗に見れます。今のチャンスに、ぜひ!

リフロー版 Kindle 書籍を iPad mini (2018) と比較

僕は iPad mini (2018)Kindle fire HD 10 (2017) を持っているので、いくつか Kindle本の比較写真を載せておきます。ちなみに、2019年 12月現在で、4倍近い価格差があります。

技術書: 『基礎Python 基礎シリーズ』目次 – Kindle fire HD 10 の方が 3行多い:

基礎Python目次

次のページ:

固定画面 (紙の本のページをスキャンした電子書籍) だと縮尺の違いですが、リフロー版 (文字の大きさが変えられる Kindle 書籍) は、一画面に表示できる文字数が多いのです。

Kindle fire HD 10 だと枠内が全て表示されています。

雑誌 (固定レイアウト書籍) の比較 – 縦画面

文字サイズの変えられない、画面サイズ固定 (固定レイアウト) の雑誌だとどうでしょうか。Casa Brutas で確認です。表紙を立て画面で表示すると、Kindle fire HD 10 だと上下に無駄な余白があります。なんだか残念。

雑誌 (固定レイアウト書籍) の比較 – 横 (見開き) 画面

では、見開き (横画面) だとどうでしょうか。表紙の違い。

他のページも。雑誌は Kindle fire のほうが、いっぱいまで表示してくれて無駄がなく、実際の雑誌と近い感覚で読むことができます。ちなみに 2019年 12月にもなれば、電子書籍でもジャニーズ (Casa Brutus なら櫻井くん) もちゃんと見れます。ここには載せてないですが。

結論

自宅で技術書籍や雑誌を読むことが多い方は、Kindle fire HD 10 を買った方が幸せになれます。特に Prime 会員の方は Prime Video も 10 インチの画面で見れるので、躊躇する理由はないですね。iPhone との迫力の違いは圧倒的です。ただし、Prime Video のときの音は、ヘッドフォンをお勧めします。

Pythonista3 でコードを実行するバージョン (3 or 2) を指定

Python には 2.x 系と 3.x 系のバージョンがあり、Pythonista3 は 2.7.12 と 3.6.1 をベースに作られている

ということを知っておきましょう。Pythonista3 では、どちらのバージョンの環境でコードを実行するか選ぶことができます (下図。スクリプト名の右にある ▷ を長押し)。通常はデフォルトのバージョン 3で問題ないはずですが、2系で書かれたコードを実行する際には print 文やモジュールのインポートでエラーが出る可能性が高いです。そういう場合には 2.7 でコードを実行しましょう (Run with Python 2.7)。

6DF76B93-53C3-4D19-B1AD-37FD314A1BD5.jpeg

StaSh 上の一部コマンドは Python 2 用に書かれている

Pythonista 3 に Django や py-tree といった Python のパッケージをインストールするのに本サイトでも便利に使用させてもらっている StaSh ですが、一部コマンドは Python 2 用に書かれているもののようです。なので、StaSh インストール後に普通に起動すると、デフォルトの Python 3.6 で実行されるので、警告が表示されます。

StaSh v0.7.2 on python 3.6.1
Warning: you are running StaSh in python3. Some commands may not work correctly in python3.
Please help us improving StaSh by reporting bugs on github.

Python 3 ではうまく動作しないコマンドや、Python 2 のパッケージをインストールしたり実行するには、Python 2.7 で実行する必要があります (▷アイコン長押し、Run with Python 2.7)。そうすれば上記の警告は出ません。

StaSh v0.7.2 on python 2.7.12

というわけで、Python 2.x 用に書かれたパッケージを pip でインストールしたい場合は、そもそも実行する StaSh を Python 2 で実行しなければなりません。毎回 ▷アイコンを長押しする?ちょっとスマートじゃないですね。

コードを実行するPython のバージョン (3 or 2) を指定する

コードを作成する際、実行する Python のバージョンを指定することができます。方法は簡単で、Python 2 で実行したい場合は以下のようにコードの最初の行にバージョンを明記してあげるだけです (コードを実行する言語を指定するこの方法を Shebang と言います)。パスがない分、Linux や macOS よりも簡単です。

#! python2
# coding: utf-8
# この下にコードを書いていく

StaSh の場合、Python 3 で実行したいとき (Django のインストールなど) と Python 2 で実行したい時 (StaSh 内のコマンドが Python 3 だとエラーを吐くなど) のケースがあるため、先頭の Shebang を変更した stash2.py と stash3.py の 2つのコードを書き、それぞれショートカットとして登録しておくと便利です。

Pythonista 3 に Django 2.0 をインストールする

過去の投稿のように、バージョンを指定してあげれば Django 2.0 も Pythonista 3 にインストールできます。ただ、詳細な原因は確認できていませんが、バージョン 2.0 しか今のところインストールできません。既に Django 1.x をインストール済みの場合は、削除する必要があります。

インストール済みの Django を削除 (StaSh を使用)

pip remove django

2.0 をインストール (2.0.1 以降は、2018/3/23 現在、Python 2.7 はサポート外というエラーで失敗します。もちろん Pythonista は最新の 3.6 でもです)

pip install django==2.0

StaSh で

pip list

としてバージョンを見ると 2.0.3 などと出ますがウソです。Console で確認しましょう。

import django
print(django.VERSION)

さて、 Django 1.x でプロジェクトを作っていた場合、manage.py に runserver --noreload を arg として渡してもエラーが出ます。おきまりの再起動と manage.py の実行を何度かすると、ForeignKeyon_delete がないというエラーになる場合があります。その場合は、エラーが出ている model.py を下の太字部分 (カンマ以降、閉じ括弧まで) を追加しましょう。

author = models.ForeignKey('auth.User', on_delete=models.PROTECT)

メジャーアップデートで色々と変更があるようですが、取り合えず Pythonista on iPhone として嬉しいのは admin ページがレスポンシブデザインになったというところが大きいと思います。楽しみましょう!

iOS Pythonista 3 で XServer に SSH 接続

Pythonista 3 の StaSh を使って SSH で XServer へ接続する

Pythonista 3 の StaSh を使ってホスティングサーバである XServer へ SSH 接続する方法です。ポイントは、XServer のサーバーパネルで「公開鍵認証用鍵ペアの生成」を行わず、StaSh の ssh-keygen コマンドでパスフレーズ無しのキーを作成するということ。パスフレーズを付けて作られたキーは StaSh のssh で動かないようです。おそらく他の SSH 接続を許可するホスティングサーバでも同様の方法で接続可能かと思いますのでお試しください。
XServer の SSH 設定方法 (公式) はこちら

StaSh でキーを作成

$ ssh-keygen -t rsa -b 2048

以下のパスに秘密鍵と公開鍵が作られる。

~/Documents/site-packages/stash/.ssh
$ ls
id_rsa id_rsa.pub

後は、公開鍵を XServer のサーバパネルで登録すれば、以下コマンドでサーバに SSH 接続できる。

SSH コマンド

$ ssh username@username.xsrv.jp -p 10022

(“username” は自分のアカウント名に差し替える)

初めて ssh コマンドを実行すると、どうやら自動的に pyte というターミナルエミュレータが pip でインストールされます。そのまま ssh コマンドを実行してもエラー global name 'pyte' is not defined と表示される場合は、Pythonista 3 を終了してから再度立ち上げてください。

(蛇足) SSH しているときの行数を指定

ここまできたらこっちのもの、.stashrc ファイルに alias を登録したり (こちらを参照)、他の iOS 端末や SSH アプリ、パソコン等に .ssh フォルダの中の ids_rsa を持って行ってそれらの環境で SSH 接続ができるようにすれば作業がはかどります。 ids_rsa ファイルは秘密鍵ですので、絶対に他の人に見られないよう取り扱いには注意しましょう。

一点 Pythonista 3 の StaSh で SSH 接続している際の残念な点は、入力中は画面下の [Tab] [H] [Up] などの StaSh のもつ特殊キーの列と iOS のキーボードのソフトウェアキーボードが常に出てしまうところです (Bluetooth キーボードを使用していても 3行分ほど狭くなる)。面倒ですがログインする端末に応じて、stty コマンドで、画面の行数を指定しまいましょう。一画面に収まって作業がしやすくなります。以下を参考に、自分の環境でちょうどいい行数を指定してみてください。

$ stty rows 51 # iPad mini 2 で外付けキーボードならここまでイケる
$ stty rows 27 # iPhone 8 Plus でソフトウェアキーボードならここまでイケる

Pythonista3 に py-tree をインストールする

ディレクトリ構成を一覧表示してくれる py-tree を Pythonista3 (iOS) にインストールし、使いやすくする方法、など

py-tree をインストールすると

こういうのができるようになります:

[mysite]$ tree
.
|-- db.sqlite3
|-- manage.py
|-- mysite
|   |-- __init__.py
|   |-- settings.py
|   |-- urls.py
|   `-- wsgi.py
`-- polls
    |-- __init__.py
    |-- admin.py
    |-- apps.py
    |-- models.py
    |-- tests.py
    |-- urls.py
    |-- views.py
    `-- migrations
        |-- 0001_initial.py
        `-- __init__.py

Pythonista3 に限った話ではありませんが、Web アプリなど階層構造でプロジェクトを作っている時には、CLI (Pythonista3 の場合は StaSh) でディレクトリとファイルの一覧を見たくなるものです。そんな時に便利なのが py-tree コマンドです。上の例のように表示できるので、デバッグする時などにも重宝します。

インストール

インストールは簡単で、StaSh で以下のコマンド ([stash]$ プロンプトの後の部分) を実行します。

[stash]$ pip install py-tree

“tree” で実行できるようにする

実行するのはもちろん py-tree [enter] です。が、ソフトウェアキーボードでハイフンを入力するのは一手間かかって面倒なので、tree と入力すれば実行できるようにしましょう。
StaSh では Linux のシェル bash にある .bashrc のように alias を .stashrc ファイルに記載して利用することができます。具体的な手順は以下の通りです:

[stash]$ cd site-packages/stash/
[stash]$ la
.gitignore .stash_history .stash_tips .travis.yml CHANGES.md LICENSE README.md __init__.py bin docs getstash.py lib man stash.py system
[stash]$ touch .stashrc
[stash]$ echo "alias tree='py-tree'" >> .stashrc
[stash]$ cat .stashrc
alias tree='py-tree'
[stash]$ la
.gitignore .stash_history .stash_tips .stashrc .travis.yml CHANGES.md LICENSE README.md __init__.py bin docs getstash.py lib man stash.py system

StaSh を一度終了してから再度実行すると、一番上のサンプルのように tree コマンドで階層表示ができるようになります。

(蛇足) Pythonista 3 で xxx.py 以外のファイルを作成、編集する

Pythonista3 単体では .stashrc のような名前のファイルは作れません (勝手に .py が付加されてしまう)。また、一度作るとドットで始まるファイルは不可視となり、編集できません。そのため、そのようなファイルを作る場合は、上記手順にあるように StaSh の touch コマンドでファイルを作り、edit コマンドで Pythonista3 の編集画面で開いてあげます。不可視ファイルは ls -a または同コマンドのエイリアスとしてデフォルトで登録されている la で確認することができます。

まとめ

目的コマンドサンプル
不可視ファイルを作るtouchtouch .invisible
ファイルを Pythonista3 で編集editedit .invisible
不可視ファイルを含むファイルを表示ls -a
または
la
la
(la .* で、不可視ファイルのみを表示)

Pythonista3 に Django をインストール

iPhone や iPad 向け app Pythonista3 に Django をインストールする方法:

まず、ググって Pythonista3 に StaSh をインストールしてください。日本語の情報も見つかります。必要そうならそのうちここにも記事を書きます。

StaSh が入ったら、StaSh から以下を実行します:

$ pip install Django==1.11.6

バージョンの “1.11.6” は、その時に利用できる LTS (Long Term Support) version にしたら良いでしょう。djangoproject.com のサイトをご確認ください。

Pythonista3 を終了し、再度開きます。 <– これは Pythonista3 で何か変更を加えた際にほぼ必ず実行すべきアクションなので、期待した通りの動きをしていない時などはやってみてください。本手順でも何度も出てきます。

StaSh で Django のプロジェクトを作ります。

$ django-admin.py startproject mysite

Pythonista3 を終了し、再度開きます。

/mysite/manage.py を開きます。
Console (右ヘスワイプ) で以下を実行します。

import sys
sys.path

表示結果から、以下のような行を見つけ、コピーします (「…」の部分は、iOS 端末固有の情報です)。

/private/var/mobile/.../Documents/mysite

左にスワイプし、manage.py の編集画面に戻ります。
import sys” の下に以下を追加します — 「ここに貼り付け」を、上記でコピーした内容に置き換えます。

sys.path.append=(“ここに貼り付け”)

すると、こんな感じになります (端末によって AppGroup/…/Pythonista3 の間は異なります):

sys.path.append("/private/var/mobile/Containers/Shared/AppGroup/C1F57ABC-DDDD-EEEE-FFFF-B0B0E0B0B0E7/Pythonista3/Documents/mysite/")

Pythonista3 を終了し、再度開きます。

/mysite/manage.py を開き、実行 (右三角) ボタンを長押しして開いた画面の argument に、“runserver --noreload” を追加します。ハイフン 2つをうまく入力できない場合は、ダブルクォーテーションの内部をコピペしてください。
改めて書きますが、何か想定外のエラーが発生した場合は Pythonista3 app を終了し、再度実行してください。
うまくいくと、以下のような内容が Console に表示されます:

Performing system checks...

System check identified no issues (0 silenced).

You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
November 03, 2017 - 20:46:35
Django version 1.11.6, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

ここまできたら、http://127.0.0.1:8000/ を Safari などのウェブブラウザで開きます。
“It Worked!” ページが表示されたら Django のインストールと初期設定は完了です。Django のチュートリアルなどを参考に、ご自身のプロジェクトやアプリケーションを作りましょう。
Pythonista3 では Django への変更に対する自動更新ができない (--noreload) なので、期待通りの動作をしない場合は、Pythonista3 app の再起動をしてください。

以下は StaSh で Django をインストールした際のログです:

[~/Documents]$ pip list
[~/Documents]$ 
[~/Documents]$ 
[~/Documents]$ pip install django
Querying PyPI ... 
Error: Source distribution not available for Django: 2.0b1
[~/Documents]$ pip install Django==1.11.6
Querying PyPI ... 
Downloading package ...
Opening: https://pypi.python.org/packages/13/26/f3841e00663027ba7cf7ce7ba2cabb682a83cf0629bef013d70bebefa69d/Django-1.11.6.tar.gz
Save as: /private/var/mobile/Containers/Data/Application/20C8FA54-EEEE-FFFF-88888-3BACC5555555/tmp//Django-1.11.6.tar.gz (7874450 bytes)
   7874450  [100.00%]
Extracting archive file ...
Archive extracted.
Running setup file ...
Handling commandline script: django/bin/django-admin.py
Package installed: Django
Dependency available in Pythonista bundle : pytz
[~/Documents]$ 
[~/Documents]$ 
[~/Documents]$ which django
[~/Documents]$ pip list
Django (2.0b1) - A high-level Python Web framework that encourages rapid development and clean, pragmatic design.
[~/Documents]$