Ubuntu16.04でGDMが起動途中に死んでしまうのを直した話

Ubuntu16.04(Unity)にGNOME3を入れて、LightDM+GNOME3でしばらく動かしていた。その後にLightDMからGDMに変えたらGDMが起動途中に事切れてログインできなくなってしまったのを直しました。結論から言うと、

$ sudo dpkg-reconfigure gdm3

で直ったんですが、その前に紆余曲折があってどれが主原因だったのかわからないので記録しておきます。

GDM入れた直後の状態

GDMを入れて、「確かArch Wikiにこんなこと書いてあったなー」と思って

$ sudo systemctl disable lightdm
$ sudo systemctl enable gdm

とした所次に再起動した時には死んでいました...。起動画面はBtrfs scanとかなんとか言って止まっていた。TTYを変えるとCUIでログイン可能だったので助かりました。

この段階で、

  • Unity Desktop
  • LightDM
  • GNOME3
  • GDM

がインストールされていました。

CUIログインして startx とすると一応GNOME3が起動することが確認できました。

試行錯誤してみる

とりあえずググるdpkg-reconfigure gdm でLightDMからGDMに切り替わるらしいという情報を得たのでやってみたのですが断念(何故この時駄目だったのか...???)。そこでGDMを入れなおしてみたり、 ubuntu-gnome-desktop パッケージを入れたり、 ubuntu-desktop をpurgeしてみたものの直らず。この段階でgdm.serviceをenableしているにも関わらず、startxしたあとのgdm.serviceはinactive (dead)になっていることが判明。他のUbuntuマシンの状態を確認すると、ログイン後もGDMサービスが起動していたので、このあたりがおかしいらしい?と推理してみました。

そこでCUIログインした状態で systemctl gdm.service start した所GDMのログイン画面が登場。なんもわからん。もちろん再起動しても死んだまま。まじでわからん。

成功する

色々探した結果、また最初のコマンドが現れたのでダメ元で試したところ起動しました。次のコマンドです(最初と同じ)。

$ sudo dpkg-reconfigure gdm3

gdmgdm3 に差があるのかと言われると、 systemctl status gdm3.service としても gdm.service の状態が表示されたので怪しそう。いやちゃんと調べろよという話なんですが。

多分Unity周りのパッケージを消したのが良かったのかな?くらいしかわかりませんでした。というわけで記憶に怪しいコマンドは適当に入力しないようにしましょう。

PyConJP2017に参加しました(2日目)

2日目も参加しました(かなり寝坊しましたが…)。というわけで忘れないうちにメモっておきます。

起床するまで

実は昨日から@gurutaminnh8の紹介で@nnsnodnbさんと行動してて、ひやかしハウスに泊めてもらってました。 ありがとうひやかしさん!

で色々喋って4時になってやっと就寝し、起きたら12時になってました。いつも通りだね

見てきた物リスト&メモ

  • クイズ・python勝ち抜きバトル!!
    • 確か初級のあたりで死んだ。
      • その時の問題は「Pythonで整数型は最大いくつまでの数を扱えるでしょうか」。正解はDの「もっとずっと多い」だったけど、Bと答えてしまった。
        • 32bit整数だったような…とか思ってたけどそんなことはなかったよ
          • しかもその場合は4,294,967,296だし、FEやり直したほうがいいのでは()
    • is==の違いが出てくる問題は、いつも気をつけてるつもりだけど間違えてしまう…
      • 最後の方のTrue + False is Trueとかね
    • 髭のネタ面白かった
  • AWS APIGateway + Python Lambda + NEologdで作るサーバレス日本語形態素解析API
    • 202から移動せずにそのまま聞いてたけど普段自然言語処理をやらないので聞いたことのある単語くらいしかわからなかった(申し訳🙏)

LT

相変わらずアメリカ語わかんなくて、英語できるようにならねぇとなぁとなりました。精進します…

日本語のほうはちゃんとわかりました(当たり前)。皆さんのPythonへの愛情が伝わってきてよかったです。(Pythonはいいぞ!)

最後に

PyConJP2017に参加してよかったです。とてもいい刺激になりました。それとスタッフ&スピーカーの皆さんお疲れ様でした。楽しかったです!!

これからもPythonを書きまくりたいと思います!!!

PyConJP2017に参加しました

PyConJP2017に参加してきました。1日目が終了したのでとりあえずメモ。

見てきた物リスト&メモ

その他1

色々ひどいまとめだけど、ひどいついでに試しに実行したやつをそのまま貼り付ける

In [1]: import typing

In [8]: def f(arg: List[str]) -> List[str]:
   ...:     return arg
   ...: 

In [9]: f(['hoge', 'piy'])
Out[9]: ['hoge', 'piy']

In [10]: f([1, 2, 3])
Out[10]: [1, 2, 3] # 実行時型チェックするわけではないのだな(?) IPythonだったからか?

In [12]: List[str].mro() # mro()、初知り
Out[12]: 
[typing.List[str],
 typing.List,
 list,
 typing.MutableSequence,
 collections.abc.MutableSequence,
 typing.Sequence,
 collections.abc.Sequence,
 typing.Reversible,
 collections.abc.Reversible,
 typing.Collection,
 collections.abc.Collection,
 collections.abc.Sized,
 typing.Iterable,
 collections.abc.Iterable,
 typing.Container,
 collections.abc.Container,
 typing.Generic,
 object]

In [13]: List[str].__args__
Out[13]: (str,)

In [14]: List[List[str]].__args__
Out[14]: (typing.List[str],)

In [15]: Optional[str].__args__
Out[15]: (str, NoneType)

In [16]: int in vars(__builtins__).values()
Out[16]: True


In [17]: class WaruiObj:
    ...:     def __len__(self):
    ...:         return '0'
    ...:     

In [18]: len(WaruiObj())
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-18-49ec83f96080> in <module>()
----> 1 len(WaruiObj())

TypeError: 'str' object cannot be interpreted as an integer

In [19]: # len() Adapter

In [20]: len(1)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-20-8b3587a43b59> in <module>()
----> 1 len(1)

TypeError: object of type 'int' has no len()

In [21]: # デザインと歴史FAQ

In [22]: iter([1,2,3,4])
Out[22]: <list_iterator at 0x7f84595512e8>

その他2

  • @puhitaku さんとお知り合いに。スク水はいいぞ
  • 今まで書いてたコンピュータの理論と実装の本は完全に3日坊主状態になりました()

コンピュータシステムの理論と実装 3章

昨日3章の全ての回路を実装したので経過報告、兼モチベーションの維持。(兼ねてるのは逆かも)

3章は順序回路を作りました。2章までは状態を持たない論理回路を組み合わせる「組み合わせ回路」でしたが、この章ではクロックが導入され、DFFを使ってレジスタやRAM、プログラム・カウンタを実装します。

レジスタの実装まで来ると、アセンブリのLD命令の動き方がなんとなく想像が湧いてきます。プログラム・カウンタはマルチプレクサとレジスタだけで作れたんですが、初め何を思ったかALUの機能を使って作ろうとしてました。深夜テンション怖い。

次の4章ではCPUを飛ばして機械語をやるようです。3章までと比べて内容が厚くなってるのが気になります…

ログ: uryoya.hatenablog.com

Python3でQRコードを読み込みたかった

Python3でQRコードを読み取るためにPyPIからパッケージを探したのでメモ。

結論から言うとfastzbarlightが簡単かつ早く読み取りができます。

まえおき

C/C++QRコードやバーコードを読み取らせるライブラリとして有名そうなのはZbarで、公式でPythonのライブラリもありました。 ところがPython2.x用のパッケージしか用意されていなかったので、別のパッケージを探しました。

  1. zbarlight 1.2 : Python Package Index
  2. fastzbarlight 0.0.14 : Python Package Index
  3. libzbar-ctypes 0.1.2 : Python Package Index
  4. pyzbar 0.1.4 : Python Package Index
  5. libzbar-cffi 0.2.1 : Python Package Index

fastzbarlightとzbarlightのパッケージはどうやら元のソースコードは同じようです。fastzbarlightはコンパイルオプションを変えて読み取り速度を向上させたらしい(よくわからん)。 で、(fast)zbarlight、libzbar-ctypes、pyzbar、libzbar-cffiのGithubのスターを比べると、1のzbarlightが41でほかよりも多いです。(他のパッケージは0〜10ちょっとくらい)

選ぶ

読み取りに使った画像はこれ。

f:id:uryoya:20170617152721j:plain

ソースコードはこっち。

zbarlight (fastzbarlightはzbarlightのモジュール名を変えただけです。)

from PIL import Image
import zbarlight
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('FILE', help='QR code image file')
args = parser.parse_args()

with open(args.FILE, 'rb') as img_file:
    image = Image.open(img_file)
    image.load()

codes = zbarlight.scan_codes('qrcode', image)
print(f'QR codes: {codes}')

libzbar-ctypes

from PIL import Image
from libzbar import zbar
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('FILE', help='QR code image file')
args = parser.parse_args()

with open(args.FILE, 'rb') as img_file:
    image = Image.open(img_file).convert('L')
    width, height = image.size
    raw = image.tobytes()

image = zbar.Image(width, height, 'Y800', raw)

scanner = zbar.ImageScanner()
scanner.scan(image)

for symbol in image:
    print('decode', symbol.type, 'symbol', symbol.data)

del(image)

pyzbar

from pyzbar.pyzbar import decode
from PIL import Image
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('FILE', help='QR code image file')
args = parser.parse_args()

with open(args.FILE, 'rb') as img:
    codes = decode(Image.open(img))

print(f'QR codes: {codes}')

libzbar-cffiはめんどくさくなってやってないです()

time -pで実行時間を図った結果は次の通り。なお平均とかは取ってないです。

package real user sys
zbarlight 1.59 1.56 0.03
fastzbarlight 1.42 1.37 0.04
libzbar-ctypes 2.25 2.23 0.02
pyzbar 2.29 2.24 0.05

fastzbarlightが一番早く実行が終わり、次いでzbarlight、遅れてlibzbar-ctypes、pyzbarという結果になりました。

libzbar-ctypesはスキャンデータがlibzbar.zbar.Imageオブジェクトになるのでforで取り出す処理が入っています。ただその処理をなくしても速度にあまり変化はありませんでした。

結論としては(fast)zbarlightを使っておけば良さそうです。

コンピュータシステムの理論と実装 1..2章

前回記事から「コンピュータシステムの理論と実装」を読み始めて、現在2章のブール算術まで読み終わった&専用HDLで実装が終わりました。

第1章はNAND回路からAND、OR、NOT、XORの基本ゲートと、マルチプレクサ、多入力の基本ゲートなどを実装します。ここまでは簡単な回路なので、効率はさておき特に問題なく実装できました。

問題無くと言っても、nand2tetrisのプロジェクトについてきたテストが通っただけなので実用上は問題ありそうですが…今回は動けばいいという方針で()

第2章では加算器やALU(算術論理演算子)(Arithmetic Logic Unit)の解説と実装です。ALUを略さない呼び方はさっき調べました。

でそのALUを実装するときハマったので書き記しておきます。

この本のALUのoutバス(16bit)は、最後にoutをゼロチェックと負チェック(?)する仕様になっています。そこではじめに

...
OUT out[16],...

Mux16(a=fOut, b=notFOut, sel=no, out=out);
Or8Way(in=out[0..7], out=...);

というようにチェック用にoutを使ったのですが、出力ピンであるoutを使うなと怒られてしまいました。

安直にoutピン以外に繋げば…と思いましたが

Mux16(a=fOut, b=notFOut, sel=no, out=out);
Mux16(a=fOut, b=notFOut, sel=no, out=cc);
Or8Way(in=cc[0..7], out=...);

内部のサブバスをそうやって使うな💢と言われました…。

そこで次のようにすると

Mux16(a=fOut, b=notFOut, sel=no, out[0..7]=czr1, out[8..15]=czr2, out[15]=cng, out=out);

エラーが解消されました。

HDLのそれぞれの名前はあくまでピンなので、ピン同士の接続を表現する必要がありました。 いつもの癖で高級言語の変数のような書き方をしたのがまずかったようです。

論理回路あたりの低レイヤーな部分を触ったのは高校ぶりなんですが、なかなか楽しいです。

次は第3章の順序回路です。

コンピュータシステムの理論と実装を読み始めた

図書館からオライリーの「コンピュータシステムの理論と実装―モダンなコンピュータの作り方」を借りて、現在読み進めています。

コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方

コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方

本の内容については割愛します。 この本はずっと前から気になっていたものの、忙しい忙しいと言い訳を言って放置していたので一念発起して読み始め、現在1章の終わりまで読み終わりました。 この本は章末に「プロジェクト」と題して、それまでの説明を元に実際にコンピュータを作り上げます。

先ほどサポートページのhttp://www.nand2tetris.orgから必要なソフトウェアをダウンロードしてきたので早速取り掛かりたいと思います。 三日坊主で終わらせずに完遂させたいですね…(遠い目 続きました。以下続編

uryoya.hatenablog.com