Ubuntu17.10のGDMロック画面の背景色を変える

Ubuntu17.10からデスクトップ環境のUnity/LightDMが廃止され、代わりにGNOME3/GDMになりました。それに合わせてGDMのテーマもUbuntuに合わせて変えられたのですが、ログイン画面背景色のオレンジがなかなか目にうるさいので普通のGDMの色に戻したいと思います。なお適当に探して見つけたので保証はしかねます。自己責任でお願いします。

root権限で /etc/alternatives/gdm3.css を開き、 #lockDialogGroupbackground の定義(カラーコードのみ)を下記の通り編集します。

#lockDialogGroup {
  background: #2e3436 url(resource:///org/gnome/shell/theme/noise-texture.png);
  background-repeat: repeat;
}

おそらく url(...)GDM - ArchWiki のように編集すれば背景画像も変えられると思います(未検証)。

続いて1675行目、 login-dialog-user-list:expandedbackground-color の定義(カラーコードのみ)を下記のとおり編集します。

  .login-dialog-user-list:expanded .login-dialog-user-list-item:selected {
    background-color: #215d9c;
    color: #ffffff;
}

保存して再起動すれば懐かしいUbuntu GNOME(というか素のGNOME3)のログイン画面っぽくなります。本格的に修正するのは骨が折れそうなのでこれで終わりにしました。

UbuntuでAndroid Studioのデスクトップエントリーを追加する

お題目はタイトルの通り。やり方だけ知りたい人は手順から。

背景

UbuntuAndroid Studioをインストールするときは公式サイトに従って、

  1. Download Android Studio and SDK Tools | Android Studio から.zipをダウンロード
  2. 解凍して /usr/local/ 以下に設置
  3. /usr/local/android-studio/bin/studio.sh を実行

という手順でインストールすると思います。そしてIntellij IDEA等ではインストーラを実行中に「デスクトップエントリの作成」の項目が出てくるのですが、ベースは同じはずのAndroid Studioでは出てきません。

そこでよくある手段として デスクトップエントリ を作成するのですが、そんなことをしなくても以下の手順でデスクトップエントリを追加できました。

手順

  1. まず起動すると出てくるあれを出します。 f:id:uryoya:20171125191731p:plain

  2. Configure のプルダウンメニューから "Create Desktop Entry" を選択 f:id:uryoya:20171125191959p:plain

  3. OKを押す。全ユーザにエントリを作りたい場合は "Create the entry point for all users ~" にチェックを入れれば多分OK(試してない)。 f:id:uryoya:20171125192302p:plain

以上でUbuntuにデスクトップエントリが追加できます。試したのは16.04と17.10です。 f:id:uryoya:20171125192444p:plain

起動するときに出てくるあれが出てこない場合は File > Settings > Appearance & Behavior > System settings > Startup/Shutdown > Reopen last project on startup のチェックを外せばスタートアップメニュー(あれ)が出てきます。多分Settingsからでも変えられると思うんですが探すのが面倒だったのでこういう方法で。

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を使っておけば良さそうです。