ブログトップ 記事一覧 ログイン 無料ブログ開設

ぴょぴょぴょ? - Linuxとかプログラミングの覚え書き - このページをアンテナに追加 RSSフィード

2018-05-14

apt で NO_PUBKEY / GPG Error が出る場合の解決方法

|  apt で NO_PUBKEY / GPG Error が出る場合の解決方法 を含むブックマーク  apt で NO_PUBKEY / GPG Error が出る場合の解決方法 のブックマークコメント

apt コマンド公開鍵に関するエラー, NO_PUBKEY / GPG Error が出る場合は,以下の手順で復旧できます

例えば apt-get update で下記のエラーが出る場合は

The following signatures couldn't be verified 
because the public key is not available: NO_PUBKEY 06AED62430CB581C

以下のコマンドを実行します

$ gpg --keyserver pgpkeys.mit.edu --recv-key 06AED62430CB581C
$ gpg -a --export 06AED62430CB581C | sudo apt-key add -

これは

しています

あとは再度

$ sudo apt update

を実行すれば復旧できます

データベースの実体は /etc/apt/trusted.gpg です

$ sudo apt-key list 

で登録済み公開鍵の一覧が確認できます.

一覧には /etc/apt/trusted.gpg だけでなく /etc/apt/trusted.gpg.d/以下のファイル公開鍵も含まれています


なお昔はGPG鍵を更新する方法として

$ sudo apt-key update

という方法も用意されていましたが,この方法は今では廃止されています(2018年5月確認)

トラックバック - http://d.hatena.ne.jp/pyopyopyo/20180514

2018-05-09

macOS に Tex Live 2018をインストールする

|  macOS に Tex Live 2018をインストールするを含むブックマーク  macOS に Tex Live 2018をインストールするのブックマークコメント

macOS High SierraTeX環境を texlive2018 に更新したので手順をまとめます.

この記事は以下のエントリを macOS High SierraTex Live 2018 に合わせて更新・加筆したものです.

BasicTeX

パッケージはMacTeXのサブセット版である BasicTeX を使いました.

MacTeXは全パッケージをインストールします.そのため 2.4GB ものディスク容量を消費します (Tex live 2014の場合).

一方サブセット版である BasicTeX は最低限のパッケージしかインストールしません.必要な容量は 230MB程度です.不足パッケージは後から簡単にインストールできるので実用上の問題もありません

ダウンロード&インストール

https://tug.org/mactex/morepackages.html から mactex-basic.pkg をダウンロードインストールします

なおMacTeXは

  • 2018 通常版 /usr/local/texlive/2018
  • 2018 BasicTeX /usr/local/texlive/2018basic
  • 2017 BasicTeX /usr/local/texlive/2017basic

という感じでディレクトリを分けてファイルを配置します

デフォルトTeX環境の選択は,"TeX Distribution"というアプリで行います.

メニューの”システム環境設定"にアイコンがあります.Spotlight検索TeX Distribution でも起動できます)

このアプリ

  • /Library/TeX/texbin
  • /Library/TeX/Root
  • /Library/TeX/Local
  • /Library/TeX/Documentation

というシンボリックリンクを管理していて,これらリンクデフォルトtex環境を選択する仕組みになっています.

たとえば mactex-basic.pkg をインストールすると,/Library/TeX/texbin のリンク先は

$ readlink -f  /Library/TeX/texbin
/usr/local/texlive/2018basic/bin/x86_64-darwin

という感じで,/usr/local/texlive/2018basic/bin/x86_64-darwin になります

初期設定

basictex をインストールしたら,必要なパッケージを追加インストールします

方法は二つ

あります.

ここでは,説明が簡単,という理由CUIを使います.

ターミナルを起動し,まずは tlmgr 自身を更新します

$ sudo tlmgr update --self 

次に導入済みパッケージの更新

$ sudo tlmgr update  --all

個人的に良く使うパッケージをインストール

$ sudo tlmgr install  type1cm subfigure dvipdfmx multirow xstring logreq biblatex latexmk 

日本語環境の設定

Tex live 2018 で少し手順に変更があります.

TLContirb リポジトリの追加登録

ライセンスの関係で Tex live 2018 ではパッケージ構成に変更がありました.

macOS 同梱のフォントを使うためのパッケージ達は別リポジトリ( TLContrib )へ分離されたので,

まずはこのリポジトリを登録します.

$ sudo tlmgr repository add http://contrib.texlive.info/current tlcontrib
$ sudo  tlmgr pinning add tlcontrib '*'

フォント周りで重要なパッケージは

  • cjk-gs-integrate-macos (cjk-gs-integrateのmacOS版)
  • adobemapping (adobemapping を入れておかないとdvipdfmxでエラーが出ます)
  • ptex-fontmaps

です

リポジトリの登録が済んだら,日本語関連のパッケージをまとめてインストールします

$ sudo tlmgr  install ptex-fontmaps-macos cjk-gs-integrate-macos japanese-otf-nonfree ptex platex jsclasses japanese-otf cjk-gs-integrate adobemapping ptex-fontmaps
フォントの登録

cjk-gs-integrate-macos というスクリプト(cjk-gs-integrate のmac os 版)がインストールされるので,これを使って mac OSフォントを登録します

$ sudo cjk-gs-integrate-macos --link-texmf --force
$ sudo mktexlsr
登録ずみフォントの確認

フォントの設定用に kanji-config-updmap-sys というスクリプトインストールされます.

このスクリプトで現在の設定を確認します.

$ sudo kanji-config-updmap-sys status

以下の出力が得られます

CURRENT family for ja: noEmbed
Standby family : hiragino-highsierra
Standby family : hiragino-highsierra-pron
Standby family : ipa
Standby family : ipaex
Standby family : kozuka
Standby family : ms
Standby family : toppanbunkyu-highsierra
Standby family : yu-win

先頭行は現在の設定で,日本語フォントは埋め込まない,という意味です

残りは利用可能なフォントの一覧です

フォントの変更

フォントが登録できたら,pdfに埋め込むフォントを指定します

$ sudo kanji-config-updmap-sys hiragino-highsierra-pron

自動で extractbb が実行されるようにする

以下の内容で /usr/local/texlive/texmf-local/web2c/texmf.cnf を用意します

shell_escape_commands = \
bibtex,bibtex8,bibtexu,upbibtex,biber,\
kpsewhich,\
makeindex,mendex,texindy,xindy,\
mpost,upmpost,\
repstopdf,epspdf,extractbb

古い TeX環境の削除

uninstallは簡単です

MacTex 2017 を消したい場合は /usr/local/texlive/2017basic をディレクトリ毎削除するだけです

$ sudo rm -rf /usr/local/texlive/2017basic

トラブルシューティング

pdfに画像が貼れない/gsコマンドが無い
ghostscript (gsコマンド) がインストールされていないと dvipdfmx 経由で作成する pdf に画像が貼れない場合があります.ghostscript をインストールするには https://tug.org/mactex/morepackages.html の mactex-additions.pkg から ghostscriptを選択してインストールするのが楽そうです.
LaTeX It を使いたい
gsコマンドが必要なので,あらかじめ上記の手順でghostscriptをインストールして http://www.chachatelier.fr/latexit/ からdmgダウンロードインストールする.
TeX Live Utility.app を使いたい
https://code.google.com/p/mactlmgr/
dvipdfmx がCould not find encoding file “H”. というエラーを出す
adobemapping パッケージをインストールすると直ります
日本語フォントが使えなくなった
Tex live 2018 でフォント周り(パッケージ構成やコマンド名)に少し変更が入っているようです.上記手順を参考にフォント周りの設定を見直してください

まとめ

インストール後の /usr/local/texlive/2018basicのサイズは 546MB でした.2014basicの頃より220MBほど小さくなったようです.

Tex live 2014は全部インストールすると 2.4GB程度なので,それに比べるとかなりディスク容量を節約できたようです.






[改訂第7版]LaTeX2ε美文書作成入門
奥村 晴彦 黒木 裕介
技術評論社
売り上げランキング: 4,008


学生・研究者・技術者のためのLATEXを用いた論文作成術
渡辺 徹
プレアデス出版
売り上げランキング: 233,232

2018-04-26

bash と getopt の連携(2018年バージョン).

|  bash と getopt の連携(2018年バージョン). を含むブックマーク  bash と getopt の連携(2018年バージョン). のブックマークコメント

bash で getopt を使う雛形.

エラー処理をちゃんと書いたバージョンです.実行時のエラー,実装上のバグ,どちらも正しく検出&対処できます.

#!/bin/bash

usage()
{
    cat<<EOF
usage: 
        $0 [option*] [argument*]

  -a 
  -v, --value=VALUE 
  -c
EOF
    exit 1
}

opts=`getopt --name "$0"  --options hav:c --long help,value:  "$@"` || usage
eval set -- "$opts"
unset opts 

while [ -- != "$1" ]; do
    case "$1" in
	-h | --help)
	    usage 
	    ;;
	-a)
	    a=1
	    ;;
	-v | --value)
            shift
	    v="$1" 
	    ;;
	-c)
	    c=1
	    ;;
         *)
             # 実装のバグ検出時の処理をここに書く

             # タイプミスや実装漏れにより
             # getopt の引数で登録したオプションと
             # case文の pattern部分に不一致が出てくると
             # この部分に処理が飛んでくる
             echo "internal error"
             ;;
    esac
    shift 
done

## "--" を取り除く
shift


## オプションの値を表示
echo "a:=$a  value:=$v  c:=$c"

## 残りのコマンドライン引数を表示
while [ -n "$1" ]; do
    echo $1
    shift
done

実行例

$ ./fuga.sh  aaa -a  bbb
a:=1  value:=  c:=
aaa
bbb

なお上記の雛形は bashビルトインの getopts ではなく, GNU版の /usr/bin/getopt を使っています.getopts と /usr/bin/getopt は一長一短で甲乙つけがたい面もありますが

  • long option に対応している
  • オプションの順序に制約がない

という2点で 私は /usr/bin/getopt の方が便利だと考えています.

2018-02-22

RaspberryPIにdebianを入れて headlessで運用する方法

|  RaspberryPIにdebianを入れて headlessで運用する方法を含むブックマーク  RaspberryPIにdebianを入れて headlessで運用する方法のブックマークコメント

ラズパイは非力なハードウェアです.ディスプレイキーボードをつないで,OSとして Raspbian(ラズビアン)などを使えば,PCのように利用することもできます.しかし所詮はラズパイPCの代用としては処理速度が遅く,実用性に欠けます.

またIoTオーディオサーバのような用途ではGUI自体が不要な場合が多いです.この場合,キーボードマウス接続すること自体が無駄GUI関連のソフトウェアインストールすることも無駄になります.

というわけで,今回は

するいわゆる head less で運用する方法をまとめます

また Raspberry pi 3 は64bitモードで使用します.つまり,32bitのARMv7(bcm2707 dts)ではなく,64bitのARM v8 (bcm2837 dts)を使うものとします

手順0) OSの選定

Debianを使います.理由は以下の通り.

RaspberryPiにdebianインストール,と言っても,原理的にはddSDカードにイメージを書くだけです.

ただし今回はMacで作業したので,Mac固有のddの使い方として手順をメモします.

手順1) SDカードMac接続

手順2) ターミナルを起動

手順3) SDカードデバイスファイルを確認します

ターミナル上でdiskutilコマンドを使います

$ diskutil list 

今回は /dev/disk2 にSDカード接続されていました.

/dev/disk2 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *31.0 GB    disk2
   1:             Windows_FAT_32                    31.0 GB    disk2s1

デバイスファイル名を確認するだけなら dh コマンドでも大丈夫ですが

$ dh -h

次のステップで結局 diskutil を使う羽目になります.「Macなら diskuitl 」と覚えておいたほうが都合が良いです

手順4) SDカードをアンマウント

diskutilを使います

$ diskutil unmountDisk /dev/disk2

手順5) ddコマンドで,debianのイメージをsdカードに書き込む

今回は RaspberryPi3 Model Bを使いました.

対応するイメージファイルダウンロードします.preview版を使いました

https://wiki.debian.org/RaspberryPi3

$ wget https://people.debian.org/~stapelberg/raspberrypi3/2018-01-08/2018-01-08-raspberry-pi-3-buster-PREVIEW.img.xz
$ unxz 2018-01-08-raspberry-pi-3-buster-PREVIEW.img.xz
$ dd bs=1m if=2018-01-08-raspberry-pi-3-buster-PREVIEW.img of=/dev/rdisk2 conv=sync

ofオプションでは /dev/rdisk2 を指定します.ここを間違うと大事故(Macが起動しなくなる等)がおきかねません.気をつけましょう.

あとbs=1mも重要なオプションです.このオプションをつけない場合,上記の処理はものすごく遅くなります.詳細は割愛しますが,理由が気になる人は「 dd ブロックサイズ」などで検索して調べてください.

手順6) 確認

成功するとパーティションテーブルが書き換わります.diskutil で確認します

$ diskutil list
/dev/disk2 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *31.0 GB    disk2

手順7) 起動

SDカードラズパイに装着して,有線LAN接続した状態で,ラズパイの電源を入れます.

ディスプレイキーボードラズパイに繋ぐ必要はありません.

これでDHCPIPアドレスを自動取得して,sshログイン可能な状態でラズパイが起動します.

手順8) sshログイン

ネットワークの設定にもよりますが,うまくいけば,以下のコマンドラズパイログインできます.

$ ssh root@rpi3

Password は “raspberry”です

ログインできない場合は,ラズパイIPアドレスを調べる必要があります.

簡単な方法は,LANルーターの管理画面で,貸出中のDHCPアドレスを調べる方法でしょう.

他には ポートスキャンをかけて raspberry piを探す方法があります

nmapを使うなら

$ nmap -p 22 192.168.0.0/24

sshは22番ポートなので"-p 22",192.168.0.0/24スキャンする範囲で,この場合192.168.0.1から192.168.0.254までの範囲でsshが起動しているホストを探します.


手順9) 初期設定

ルートパスワードを変更します

$ password

あとは通常のdebianと同じです

まずはパッケージを最新のものに更新します.

$ apt update
$ apt upgrade

デフォルトでは sudo さえインストールされていません.インストールします.

$ apt install sudo

ユーザを作成します

$ adduser アカウント名

sudoできるようにします.設定ファイルを新規作成します.

$ vi /etc/sudoers.d/local

流石にvi は初めからインストール済みです

設定を書きます

アカウント名 ALL=(ALL) ALL

基本設定は以上です.

外部からsshログインできることを確認します

$ ssh アカウント名@ラズパイのIPアドレス
トラックバック - http://d.hatena.ne.jp/pyopyopyo/20180222

2018-01-18

class を noncopyable にする

|  class を noncopyable にするを含むブックマーク  class を noncopyable にするのブックマークコメント

今時のc++ (c++11など)でコピー禁止,代入禁止のクラスを作る方法

template <class T>
struct CRTPnoncopyable {
    CRTPnoncopyable() = default;
    CRTPnoncopyable(const CRTPnoncopyable&) = delete;
    CRTPnoncopyable& operator=(const CRTPnoncopyable &) = delete;
};

class A : CRTPnoncopyable<A> {};

これでclass Aはコピー禁止になる*1 *2

Boost の noncopyable を使う方法もある *3

#include <boost/core/noncopyable.hpp>

class A : boost::noncopyable {};

両者の違いは何か.


それはクラス継承した際に現れる.

#include <iostream>
#include <boost/core/noncopyable.hpp>

template <class T>
struct CRTPnoncopyable {
    CRTPnoncopyable() = default;
    CRTPnoncopyable(const CRTPnoncopyable&) = delete;
    CRTPnoncopyable& operator=(const CRTPnoncopyable &) = delete;
};

class A1 : boost::noncopyable {};
class A2 : boost::noncopyable {};
class AA: A1, A2 {};

class C1 : CRTPnoncopyable<C1> {};
class C2 : CRTPnoncopyable<C2> {};
class CC : C1, C2 {};

int main()
{
    std::cout << "sizeof(AA) = " << sizeof(AA) << std::endl;
    std::cout << "sizeof(CC) = " << sizeof(CC) << std::endl;
    return 0;
}

class AAboost版,class CCテンプレート版であり,これを実行すると

sizeof(AA) = 2
sizeof(CC) = 1

となる.つまり class CC の方がコンパクトになっている

これはboost版では,コンパイラが Empty Base Optimization を適応できないためである.詳細は以下のページが詳しい

https://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E3%82%B3%E3%83%94%E3%83%BC%E7%A6%81%E6%AD%A2%E3%83%9F%E3%83%83%E3%82%AF%E3%82%B9%E3%82%A4%E3%83%B3%28Non-copyable_Mixin%29

*1:旧来のc++と異なり,c++0xで default, delete が登場したので簡潔にかける

*2:CRTPとはCuriously Recurring Template Patternの略で class A : hogehoge<A> の形,つまりAの基底クラスが Aで特殊化されたテンプレートクラスであるパターンを意味する

*3:以前は boost::noncopyable は boot/utility.hpp にて定義されていたが,いつの間にか boost/core/に昇格されている

トラックバック - http://d.hatena.ne.jp/pyopyopyo/20180118