ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

UbuntuでPython 3環境をSnappyで展開する

UbuntuPython 3環境をSnappyで展開する方法ですが、割と簡単でした。 下記の開発者が作成したsnapイメージを使うことで簡単にセットアップできるようです。

インストール

~$ snap search python36-jamesh
Name             Version  Publisher  Notes  Summary
python36-jamesh  3.6.4    jamesh     -      Python language interpreter and standard library
~$ sudo snap info python36-jamesh
name:      python36-jamesh
summary:   Python language interpreter and standard library
publisher: jamesh
contact:   https://github.com/jhenstridge/python-snap-pkg/issues
license:   Python-2.0
description: |
  Python is a programming language that lets you work quickly and integrate systems more
  effectively.
snap-id: fzEY53WAr0RixVKo3QewIH9iJR8VODoq
channels:                    
  stable:    –               
  candidate: –               
  beta:      –               
  edge:      3.6.4 (20) 22MB -

~$ sudo snap install python36-jamesh --edge --devmode
python36-jamesh (edge) 3.6.4 from 'jamesh' installed 

バイナリーの確認

コマンド名先頭にpython36-jamesh.がついたものがsnapでインストールしたPython 3で、ついていないものが標準インストールのPython 3です。

~$ python3
python3                  python36-jamesh.pydoc3   python3-jsondiff         python3-jsonschema
python3.6                python36-jamesh.python3  python3-jsonpatch        python3m
python36-jamesh.pip3     python3.6m               python3-jsonpointer      

利用方法

python36-jamesh.がついた方のコマンドを利用します。pipコマンドも使えます。

~$ python36-jamesh.pip3 --version
pip 9.0.1 from /snap/python36-jamesh/20/lib/python3.6/site-packages (python 3.6)

~$ python36-jamesh.pip3 list
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
pip (9.0.1)
setuptools (28.8.0)
You are using pip version 9.0.1, however version 18.0 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

モジュールを追加したい場合は--userで
~$ python36-jamesh.pip3 install six --user

~$ python36-jamesh.python3 
Python 3.6.4 (default, Jan 24 2018, 06:03:07) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

Snap、超便利!

GitLabでCI/CDする(後日内容更新予定)

GitLabでCI/CDを行う方法はGitLab 8.4くらいがリリースされた頃、確か今から2年前くらいに試したことがあります。 GitLabもそれからずいぶんバージョンアップされたし、そろそろ再調査してみるかと思いました。

参考にした情報源のリンクをまとめます。

Gitlab CIについてのまとめ

GitLab 8以降のバージョンではCI/CDを回すためのサーバー機能はデフォルトで利用できます。コードテストを実行したり、本番環境としてアプリケーションをデプロイする先として利用する環境として「GitLab CI Runner」を用意するというわけです。実際はCI Runnerと何らかのプロセス(例えばDocker)を実行したサーバーをGitLabのプロジェクトと結びつけて利用する形です。CI Runnerを複数用意して、プロジェクトごとに別のものを使うことができます。

Gitlab CI Ruunerのインストール

どこでCI Ruunerを動かすかによって、インストール方法が変わってきます。

利用できるexecutor: docker-ssh, parallels, shell, ssh, virtualbox, docker+machine, docker-ssh+machine, docker, kubernetes

Kubernetes サポート!?

インストール方法など

gitlab-ci-multi-runnerからgitlab-runnerに名前が変わりました。 また、最近のバージョンはKubernetesをデプロイ先として利用できるようです。割と簡単なのはDockerを使う方法です。

.gitlab-ci.ymlの書き方

ここが重要です。このファイルをGitリポジトリーにおいて、コミット時にCIを回すことができます。全てのブランチを対象とすることも、特定のブランチでのみCIを回すこともできます。

Jenkinsを動かすのと比べるとこちらも動かすのは簡単なのですが、.gitlab-ci.ymlの書き方がなかなか難しい印象を受けました。また、CIを回す時のテスト方法も自分で考える必要があり今後の課題です。

(後日内容更新予定)

Redis Serverを使い始めました(後日内容更新予定)

今更かもしれませんがRedis Serverを使い始めました。 Ubuntu 16.04では3.0.6、Ubuntu 18.04では4.0.9が標準パッケージとして提供されており、aptコマンドで導入できます。 ちなみにDebian 9は3.2.6が標準で利用できるようです。

% sudo apt update && sudo apt install redis-server

参考にしたのは次のサイトです。

Redis ServerのDBをPythonで叩くのも簡単みたいです。

Ubuntu Server 18.04では以下のように必要なパッケージを入れてPython 3で利用できました。

% sudo apt install python3-pip
% pip3 install redis

Redis ServerのDBをPHPで利用するにはこんな感じみたいです。

思っていた以上に簡単でした。

Ubuntu Server 18.04以降で自動更新を止める方法

何度かこのブログでも取り上げましたが、Ubuntu Server 18.04からServer版にもLiveCD版が用意されるようになり、従来のDebian Installerを使ったバージョンから変わってこちらが公式のインストーラーとなりました。

新しいLive Server Installerは色々良くなっている点があるのですが、一点だけ注意が必要です。

従来のDebian Installer版ではインストールの最後に次のようなダイアログが表示されます。セキュリティアップデートを自動で行うか、しないか、Landscapeというツールに任せるかの選択です。

f:id:ytooyama:20180904233235p:plain

新しいLive Server Installerではこのような選択肢は出てきませんが、デフォルトで「Install security updates automatically」を選択した場合と同じ設定が行われます。そして、どうやら起動のたびに新しいアップデートがないか確認して、アップデートが見つかった場合は自動更新が行われるようです。

動かしているものによるとは思いますが、サーバーOSを自動更新するってちょっと怖いですよね。 「自動更新」を想定していない場合は次の設定をデフォルトの1から0にして一旦再起動すると、次回から自動更新が行われなくなるようです。

内容 設定
ファイル /etc/apt/apt.conf.d/20auto-upgrades
設定 APT::Periodic::Unattended-Upgrade

[2018/9/7 追記]

正攻法はこちらのコマンドを実行して設定する方が良いみたいです。

% sudo dpkg-reconfigure -plow unattended-upgrades

そのほか、従来のDebian Installer版のUbuntu Server ISOを使う方法もあります。 以下からダウンロードできます。ただし、インストールするときはインストーラーの言語として日本語は選択しないでください。ループしてしまい、インストールを終えることができません。

aptを使った自動更新についての参考になる情報です。

Ubuntu 18.04.x+Python 3などの環境でpipが変な動き

パッケージを入れたり削除したり使い込んでいくと、pipコマンドがうまく動かなくなることがたまにあるようです。 今日、表題の構成やUbuntu 16.04.x + Python 3環境でも起きたので、そのうち原因を追求したいところ。

python3-pipを入れてすぐは動くのですが、なんか不安定な様子です。 mainリポジトリーのPythonuniverseリポジトリーのpython3-pipのバージョンの問題なのかな。

~$ pip3 list
Traceback (most recent call last):
  File "/usr/bin/pip3", line 9, in <module>
    from pip import main
ImportError: cannot import name 'main'

mainをインポートできないとか、致命傷ですね。

とりあえず、次のように実行してお茶を濁すことにしました。

~$ python3.6 -m pip list
Package             Version  
------------------- ---------
asn1crypto          0.24.0   
attrs               17.4.0   
Automat             0.6.0    
blinker             1.4      
certifi             2018.1.18
...

解決策?

その後の調査で、python3-openssl python3-pipを消して入れ直すとpip3コマンドが動くようになることがわかりました。

% sudo apt remove python3-openssl python3-pip
% sudo apt install python3-openssl python3-pip

Ubuntuのパッケージのpip、pipコマンドがPython3向けになったり、2向けになったりpip2コマンドがなかったりよくわからん。

Ubuntu 18.04.1を新規インストールするときはapt lineに注意しよう

Ubuntu 18.04.1が7月27日にリリースされたので、早速インストールしてみました。 変更点はこちらにまとまっています。

デスクトップ版はまだインストールしていませんが、サーバー版はインストーラーでソフトウェアRAIDを組めたり、LVMを使うか否か選択するだけで簡単にストレージをセットアップできるようになったり、NICのBondingができるようになったりと改良が施されていました。

Ubuntu Server 18.04.1のインストール後に、利用できるパッケージのバージョンをいろいろ調べようとしたのですが、あれもこれも見つからずはてなマークがたくさん浮かびましたが、原因がわかりました。

これです。 mainリポジトリーしか有効になってなかった!

~$ cat /etc/apt/sources.list
deb http://archive.ubuntu.com/ubuntu bionic main
deb http://archive.ubuntu.com/ubuntu bionic-security main
deb http://archive.ubuntu.com/ubuntu bionic-updates main

ちなみにUbuntu 18.04.0からUbuntu 18.04.1にアップデートした場合は、Ubuntu 18.04.0のsources.listが使われるので特に問題はありません。Ubuntu 18.04.1を新規でインストールしたら、デフォルトの設定がこうなっていました。

Ubuntuにはmain、restricted、universe、multiverseというリポジトリーが用意されています。 この中でmainとuniverseにはフリーソフトウェアが、restrictedやmultiverseには制限付きのソフトウェアが主に収録されています。

mainとrestrictedはCanonicalがメンテナンスを行うパッケージが管理されています。universeはコミュニティーのメンバーが主にボランティアでメンテナンスしているもの、multiverseはボランティアもしくはソフトウェアの開発元がメンテナンスするパッケージが集められています。

UbuntuDebianベースのディストリビューションです。当然ながら多くのオープンソースのパッケージはuniverseに公開されています。パッケージ検索してみると、universeで提供されるパッケージが多いことがわかります。

リポジトリーについてはこちらをご覧ください。

ascii.jp

それに加えてUbuntuにはbackportsとpartnerというリポジトリーもあるのですが、これについては今回説明を省きます(UbuntuリポジトリーについてはWikipediaのUbuntuの記事も参考になります)。

これら、複数あるリポジトリーの中のmainしかデフォルトでは設定されていません。そのため、多くのパッケージが見つからなかったというわけです。

Ubuntu 18.04以降ではsnapdを使って欲しいというCanonicalからのメッセージなのかもしれません。 けれどももし、他のリポジトリーのパッケージも使いたいということであれば、次のようにリポジトリーを追加してください。

deb http://archive.ubuntu.com/ubuntu bionic main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu bionic-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu bionic-updates main restricted universe multiverse

mainリポジトリーだけで別に困らないのであればデフォルトのまま運用でもいいですし、フリーソフトウェアだけ使いたいならmainとuniverseだけを指定することもできますが、結局は使いたいパッケージがどこで配布されているかで必要なリポジトリーを設定すればいいと思います。debパッケージにこだわらなければ、snapパッケージを使う手もあります。

snapcraft.io

リリースノートにも記載がありますが、Ubuntu 16.04.xからのアップグレードは7月中には開始される予定です。いつものことですが変更点が16.10,17.04,17.10そして18.04と4リリース分の違いがあり、かなり変更点があります。アップグレードに失敗した時のために、必要なデータはバックアップを取ってから実施することをおすすめします。同じような環境を作って試すのもいいと思います。

最近のバージョンのSafariでデフォルトフォントとサイズを指定する

大抵のブラウザーにはデフォルトのフォントとサイズを指定する設定があります。これらのフォントはHTMLファイルやCSSなどでフォントやフォントサイズが指定されていない場合、ここで設定したフォントとフォントサイズでコンテンツを表示します。

現在のバージョンのSafariには、デフォルトのフォントとサイズを指定する設定はありません。そのため、何も設定していない場合、上記のようなコンテンツを表示した場合、Safariでは明朝体で日本語が表示されます。

これをゴシック体や特定のフォントを使って表示することができます。CSSファイルを作成してSafariでそのCSSを読み込むように設定すれば、定義した設定をSafariに行うことができます。

f:id:ytooyama:20180724214721p:plain

これらの方法は「Safari 明朝体フォント」などのキーワードでWeb検索すると、デフォルトのフォントを指定する方法は多く見つかります。例えばこのような感じです。

a:link{text-decoration:none !important;}
a:visited{text-decoration:none !important;}
a:hover {text-decoration:underline !important;}
    body {
        font-family: 'SourceHanSansJP-Normal';
    }

デフォルトのフォントサイズは上記のコードに次のように一行追加するだけでうまくいきました。

a:link{text-decoration:none !important;}
a:visited{text-decoration:none !important;}
a:hover {text-decoration:underline !important;}
    body {
        font-size: 14px;
        font-family: 'SourceHanSansJP-Normal';
    }

次のHTMLファイルを作成して、Safariドラッグ&ドロップすると確認できます。上記のCSSファイルを変更後は、一度設定を開いて読み込み直してください。レンダリング結果が変わるのが確認できます。font-size: 14px;のサイズを小さくしてSafariCSSを再読み込みすると、そのサイズでHTMLが表示されます。

<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
  <h1>Safariのデフォルトフォントを変更</h1>
    <p>Safariで使用するフォントが指定されていないページにアクセスすると、「明朝体」フォントで表示されます。</p>
    <p><b>CSSファイル</b>で使用するフォントを定義して設定を行うと、フォントが指定されていないページを指定したフォントで表示することができます。</p>
</body>
</html>

フォントサイズのイメージを以下に貼り付けます。

14px

f:id:ytooyama:20180724215616p:plain:w240

8px

f:id:ytooyama:20180724215627p:plain:w240

さて、font-familyで指定するフォント名ですが、Font Bookでフォントを選んでフォントの情報に含まれる「PostScript名」を指定すれば良いです。

f:id:ytooyama:20180724220532p:plain

macOS High SierraでUSBインストーラーを作ろうとして困った話

macOSでISOイメージからUSBインストーラーを作る時、だいたい以下のような手順で作成していました。 普段はEasy2Bootを使っていたので、macOSインストーラーを作るのは久しぶりでした。

・デバイス番号確認 
$ diskutil list

・フォーマット
$ diskutil eraseDisk FAT32 MEMISO MBR /dev/disk2

・アンマウント
$ diskutil unmountDisk /dev/disk2

・書き込み
$ sudo dd if=CentOS-7.5-x86_64-Minimal-1804.iso of=/dev/disk2 bs=1m

そして作成したUSBメモリーからインストーラーを起動するわけですが、何らかのよくわからないエラーが表示され、うまく起動してくれませんでした。ISOイメージのダウンロードに失敗したかと思いハッシュ値を確認したのですが全く一緒です。念のためにUbuntuインストーラーも作ってみましたが出てくるエラーこそ違うものの、同じくインストーラーが起動しませんでした。ちなみにSierraまではこの方法でうまくUSBブートするディスクを作れていました。High Sierraのddのバクなのかな。

調べると、/dev/diskXのところを/dev/rdiskXと指定してもイメージを作れるらしいことを見つけました。たしかに、/dev/diskXのを指定するよりもずっと短時間で作成できます。もっと早く知っときゃ良かった。

つまり、次のコマンドでイメージを書き込みできます。

$ sudo dd if=CentOS-7.5-x86_64-Minimal-1804.iso of=/dev/rdisk2 bs=1m

作成したイメージでCentOS 7.5のインストーラーを起動でき、セットアップして正常にOSを起動できました。

ところがどっこいUbuntu Server 18.04のインストーラーは起動せず

同じ方法でUbuntu Server 18.04のインストーラーを作りますが、/dev/rdiskXを指定してもダメでした。 そこで公式のLiveインストーラーではなくdebインストーラーをイメージソースとして作ってみました。

そちらはうまく起動できました。そのあと試しにそのUSBインストーラーを使ってインストールしてみました。特に問題なく、インストール完了です。

ところがどっこいUbuntu Server 18.04は起動せず

インストールが終わって再起動しました。残念ながらカーネルのブート途中でカーネルパニックが発生してしまいました。

この問題はUbuntu Server 18.04をインストールしたいくつかのハードウェアで起こっている問題です。カーネルパニックが起動時に発生したり、シャットダウン時に正常に電源断が行われずにハードウェア強制リブートが行われてしまったりするという問題がいくつか報告されています。ちなみにUbuntu Desktop 18.04ではあまり聞いたことはない事象です。

Canonicalはなんとかしようと現在もカーネルに修正を加えているので、いずれ不具合なく動作するようになるかもしれませんし、しないかもしれません(後者の場合は詳細なログとバグ報告が必要ですね)。カーネルパニックが頻発する問題はLinuxカーネル4.14までは起きていませんでした。Linuxカーネル4.15の途中のRC版から発生するようになり、最近のLinuxカーネルUbuntu 18.04の組み合わせでも、ハードウェアによってはカーネルパニックとの死闘を繰り広げる必要があるようです。かなり深い問題のようです。

とりあえず手元の環境でうまく動かない場合はUbuntu 16.04は2021年まで利用できるので、問題が落ち着くまではUbuntu 16.04を使うといいと思います。 ちなみにUbuntu 16.04+Linuxカーネル4.15の組み合わせは概ね問題なく動くようです。