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

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

2016-05-15

c++でプログレス・バーを表示する方法

|  c++でプログレス・バーを表示する方法を含むブックマーク  c++でプログレス・バーを表示する方法のブックマークコメント

boostboost/progress.hpp を使えばOK

#include <boost/progress.hpp>

#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/thread/thread.hpp> 

int main(int argc,char *argv[]) 
{
        const unsigned long expected_count=100;
        boost::progress_display show_progress( expected_count );
        for(int i=0; i<expected_count;++i)
        {
	     boost::this_thread::sleep(boost::posix_time::milliseconds(10));

             ++show_progress;
        }
        return 0;
} 

boost/progress.hpp 自体は追加でライブラリリンクする必要はなく,ヘッダファイルをinclude するだけで良い

ただし上記サンプルコードは boost/thread/thread.hpp の sleepを使っているので,ビルド時に,ライブラリ libboost_thread と libboost_system のリンクする必要がある

GCCビルドするなら

$ g++ sample.cpp -lboost_system -lboost_thread
トラックバック - http://d.hatena.ne.jp/pyopyopyo/20160515

2016-03-07

linux環境を複製する方法

|  linux環境を複製する方法を含むブックマーク  linux環境を複製する方法のブックマークコメント

以下の手順で,インストール済みの linux環境 を新しいHDDSSDに複製できます

(2016/3/22追記: 細かい点について説明を加筆しました)

新しいHDDのフォーマット

予め新しいHDDSSD接続してフォーマットしておきます

以下,フォーマット済みのパーティションを /dev/sde1 とし, /mnt にmountするものとして手順を説明します

$ sudo  mount /dev/sde1 /mnt

既存システムマウント

システムを複製する場合は /proc や /sys などの複製しなくて良いディレクトリを除外する必要があります

除外する方法はいくつかありますが,今回は手っ取り早い方法として 既存システムの / パーティションを /media にマウントします

$ sudo mount --bind -oro /  /media

"--bind"を使うのがポイントです.さらに念の為 "-oro" で read-only つまり書き込み禁止にしておきます

データのコピー

/media 以下にあるファイルを /mnt へコピーします

コマンドrsyncを使います

まず dry-run でコピーされるファイル達を確認します

$ sudo rsync -aDnv  --exclude "/mnt/"  /media/  /mnt

rsyncには

注意すべき点が2つあります

1つ目は "D"オプションです.rsyncオプションには "a" だけでなく "D" もつけないと /dev 以下のデバイスファイルがコピーされません

2つ目は "--exclude" オプションです. "/mnt" を除外しないと,"/mnt" 以下に "/mnt/mnt" がコピーされ,それがさらに "/mnt/mnt/mnt"にコピーされ,データが無限増殖します


以上の2点に注意して,問題なければ "n"を外して,実際にコピーを実行します

$ sudo rsync -aDnv  --exclude "/mnt/"  /media/  /mnt

コピーが終わったら混乱を避けるために /media のマウントを解除しましょう

$ sudo umount /media

次に、新しくコピーした /mnt 側の環境の設定を修正します

複製した環境の確認

chroot を使うと、PCを再起動することなく複製した環境の動作確認が行えます

$ sudo mount --bind /dev   /mnt/dev
$ sudo mount --bind /proc  /mnt/proc
$ sudo chroot /mnt

急ぎの場合は

$ sudo chroot /mnt

だけでも大丈夫な場合が多いですが、aptを使う場合、grubを使う場合は /devや/procをマウントした方が安心です。

必要最低限の作業-1) ディスクラベル,fstab の確認

/etc/fstab でディスクのラベルや,UUIDを指定している場合は適宜修正します

$ sudo /usr/sbin/chroot /mnt
# sudo vi /etc/fstab

必要最低限の作業-2) ブートローダインストール

新しいディスク/dev/sde の MBR に grub2 を入れる場合は以下の手順になります

$ sudo mount --bind /dev   /mnt/dev
$ sudo mount --bind /proc  /mnt/proc
$ sudo /usr/sbin/chroot /mnt
# /usr/sbin/grub-install /dev/sde

umount

以上で複製は完了です.最後にディスクを umount しましょう

$ sudo umount /media/dev
$ sudo umount /media/proc
$ sudo umount /media

複製後に知っておくと便利な事

ホスト名の更新方法
sudo vi /mnt/etc/hostname
sshd の鍵の再作成
$ sudo /usr/sbin/chroot /mnt
# rm /etc/ssh/ssh_host_*
# ssh-keygen -A
トラックバック - http://d.hatena.ne.jp/pyopyopyo/20160307

2016-02-23

usb-serial のデバイスファイル名を固定する方法

|   usb-serial のデバイスファイル名を固定する方法を含むブックマーク   usb-serial のデバイスファイル名を固定する方法のブックマークコメント

ルーターの設定,シリアルコンソール,arduinoのような自作デバイスで使うUSB-シリアル変換器は,udev を使うと

を自動設定できます.

うまく設定すると rootアカウントsudo を使わずに シリアルポートが使えるようになり大変便利になります.

以下,具体的な手順をまとめます

USBデバイスIDを調べる

デバイスの識別子(ID)としては

などが利用できます


これらの識別子は dmesg で簡単に確認できます.

たとえば arduino uno を繋いだ場合は以下の通りです

[518136.789084] usb 3-5: new full-speed USB device number 22 using xhci_hcd
[518136.964454] usb 3-5: New USB device found, idVendor=2a03, idProduct=0043
[518136.964458] usb 3-5: New USB device strings: Mfr=1, Product=2, SerialNumber=220
[518136.964460] usb 3-5: Product: Arduino Uno
[518136.964462] usb 3-5: Manufacturer: Arduino Srl            
[518136.964464] usb 3-5: SerialNumber: *****シリアル番号****
[520646.175416] cdc_acm 3-5:1.0: ttyACM0: USB ACM device

この場合

  • ベンダID,プロダクトIDは,それぞれ 2a03,0043
  • シリアルは伏せ字の部分

になります

また末尾の出力から,とりあえずデバイスファイルの名前は /dev/ttyACM0 となっていることがわかります

このデバイスファイル名を手がかりに udev にデバイス情報を問い合わせます

$ udevadm info -a -n /dev/ttyACM0

大量に情報が出力されますが,重要なのは識別子に対応する ATTRS{idProduct} や ATTRS{serial} の出力です

 ATTRS{idProduct}=="0043"
 ATTRS{idVendor}=="2a03"
 ATTRS{serial}=="**シリアル番号**"

udev の設定ファイルの作成

設定ファイルを用意します.名前は /etc/udev/rules.d/99-serial.rules とします.

中身は以下の通り

SUBSYSTEM=="tty", ATTRS{idVendor}=="2a03", ATTRS{idProduct}=="0043", ATTRS{serial}=="**シリアル番号**", SYMLINK+="arduino", MODE="0666"

この設定内容で

になります.

設定を反映させます

$ sudo /etc/init.d/udev reload

動作確認

USBデバイスを挿し直します

/dev/arduino というシンボリックリンクが自動作成されれば成功です


絵で見てわかるIoT/センサの仕組みと活用
株式会社NTTデータ 河村 雅人 大塚 紘史 小林 佑輔 小山 武士 宮崎 智也 石黒 佑樹 小島 康平
翔泳社
売り上げランキング: 10,460

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

2016-02-20

インストーラを使わずにdebianをインストールする方法 (2016年版)

|  インストーラを使わずにdebianをインストールする方法 (2016年版)を含むブックマーク  インストーラを使わずにdebianをインストールする方法 (2016年版)のブックマークコメント

debianfedora などの linux が稼働しているPCに,新しいHDD接続して,そのHDDdebianインストールする方法をまとめます

この方法は

  • installerを使うより早い (数分で新しい debain 環境が用意できます)
  • 既存の設定のコピーが簡単

というメリットがあります

予備機を作る場合,同じ設定のPCを大量に用意する場合などに使うと便利です

ディスクのフォーマット

新しいHDDデバイスファイルを /dev/sdX とします

$ sudo  gdisk /dev/sdX
Command (? for help): n
Partition number: 1
First sector: <enter>
Last sector: 512M
GUID: EF00
Command (? for help): n
Partition number: 2
First sector: <enter>
Last sector: <enter>
GUID: <enter>
$ sudo /sbin/mkfs.vfat -F 16 /dev/sdX1
$ sudo /sbin/mkfs.ext4 /dev/sdX2

/sbin/mkfs.vfat がインストールされていない場合は dosfstools パッケージを追加すればOKです


gdisk よくワカラン,という人は gpart あたりがおすすめです


debootstrap の入手

debian 環境なら apt-get で debootstrap をインストールします

$ sudo apt-get install debootstrap

fedora などの非デビアン環境なら http://ftp.debian.org/debian/pool/main/d/debootstrap/ から tar.gz をダウンロードし作業ディレクトリに展開します

debootstrap の実行

"linux filesystem"のパーティションマウントします

マウントポイントは /media とします

$ sudo mount /dev/sdXX  /media

debootstrap を実行します

$ sudo /usr/sbin/debootstrap --arch amd64 sid /media http://ftp.jp.debian.org/debian

最小構成のパッケージを自動ダウンロードして,自動インストールしてくれます

成功するとbinやsbinが作成され,合計で296Mほどファイルが展開されます

初期設定

$  sudo mount --bind /dev /media/dev
$  sudo mount --bind /proc /media/proc

chroot で環境を切り替えます

$ sudo chroot /media
/etc/fstab
# vi /etc/fstab
# /etc/fstab
#
/dev/sda1 /boot/grub/efi   vfat    umask=0077      0       1
/dev/sda2 /           ext4    errors=remount-ro,relatime 0       1
tmpfs      /tmp        tmpfs   defaults        0       0

ちなみに SSD を discard でmountするのは非奨励だそうです

タイムゾーン
# dpkg-reconfigure tzdata
  1. Asia を選ぶ (aを数回押してasiaを探してenter)
  2. Tokyo を選ぶ (tを数回押してtokyoを探してenter)
ネットワーク

DHCPを使う設定ファイルを用意します

ポイント

  • ネットワークのインタフェースの名前は eth0 とします.最近はinterface名を enp3s0 のような形式にするディストリビューションが多いですが,本エントリではあえて eth0 に固定するように設定します.
  • 固定IPでの設定をコメント部分に書いておくと,緊急時に便利です

  • vi /etc/network/interfaces.d/eth0
# dhcp:
#
auto eth0
iface eth0 inet dhcp

# static:
#
# auto eth0
# iface eth0 inet static
#     address 192.168.0.100
#     network 192.168.0.0
#     netmask 255.255.255.0
#     broadcast 192.168.0.255
#     gateway 192.168.0.1
  • /etc/network/interfaces.d/local
auto lo
iface lo inet loopback
  • /etc/hostname
yourhostname.yourdomainname
  • /etc/resolv.conf
# nameserver 1.2.3.4
locales
# apt-get install locales
# dpkg-reconfigure locales
キーボード配列
# apt-get install console-data
# dpkg-reconfigure console-data
カーネル

/etc/kernel-img.conf

# Kernel image management overrides
# See kernel-img.conf(5) for details
do_symlinks = yes
relative_links = yes
do_bootloader = yes
do_bootfloppy = no
do_initrd = yes
link_in_boot = no

# apt-get install linux-image-amd64 

ブートローダ

UEFIを使わない場合は

# apt-get install grub2
# /usr/sbin/grub-install  /dev/sdX

UEFIを使う場合は

# apt-get install grub-efi
# grub-install --target=x86_64-efi /dev/sdX

ネットワークインタフェース名を eth0 に固定する設定を行います

# vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="net.ifnames=0 biosdevname=0"

設定ファイルを用意します

#  /usr/sbin/grub-mkconfig  -o /boot/grub/grub.cfg

root パスワードの設定

# passwd

ユーザアカウントの作成

useradd を使っても良いですが,既存アカウントとそのパスワードをコピーするだけなら

を直接編集したほうが早いです

必要なパッケージの追加インストール

適宜必要なパッケージをインストールしておきます

# apt-get install lv openssh-server sudo screen rsync

その他設定ファイルの用意

長くなりそうなので別エントリにまとめる予定です

unmount

設定が終了したら ディスクを外します

$ sudo umount /media/dev
$ sudo umount /media/proc
$ sudo umount /media
トラックバック - http://d.hatena.ne.jp/pyopyopyo/20160220

2016-01-16

debianパッケージの作り方

|  debianパッケージの作り方を含むブックマーク  debianパッケージの作り方のブックマークコメント

久しぶりに debian パッケージを作成したので作業メモを公開します

ソースコードの確認

ソースコードは以下の形式であるとします

(つまり autotools で作成されたものです)

環境変数の確認

debianパッケージには,パッケージ作成者の情報(名前やメールアドレス)が埋め込まれています.これら情報は以下の環境変数でカスタマイズできます

なお,これら環境変数が未設定の場合は,環境変数 USER や /etc/hostname の情報が流用されるようです

dh_make の実行

debian のパッケージ用の各種設定ファイルを生成するために,以下の手順で dh_make を実行します

作業ディレクトリソースコードを展開します

$ tar xvfJ hogehoge-0.1.0.tar.xz

dh_make を実行します

$ cd hogehoge-0.1.0
$ dh_make -f ../hogehoge-0.1.0.tar.xz

"-f"オプションソースコードファイル名を指定します

パッケージの種別を聞かれます

Type of package: (single, indep, library, python)
[s/i/l/p]?

アプリケーションならsingle,ライブラリならlibraryを選べばOKです

Are the details correct? [Y/n/q]

確認メッセージが出力されるので,問題がなければ"y"を入力します

微調整

dh_make が成功すると,各種設定ファイルdebian/ ディレクトリ以下に生成されます.設定ファイルの詳細については debian の公式文章や man を見ましょう

最低限知っておくべきことは以下の2点だと思います.

ビルドの確認

パッケージをビルドしてみます

$ debian/rule clean
$ debian/rule build

なお,ビルドで失敗する場合は

  • debian/rule を編集する
  • 環境変数 DEB_BUILD_OPTIONS を使って build の挙動を変える

などで,修正を行います.

後者の方法を使うと,たとえば make tests でエラーが出る場合は, DEB_BUILD_OPTIONS=nocheck とすることで checkをskipできます

deb パッケージの作成

$ dpkg-buildpackage -us -uc -rfakeroot

成功すると一つ上のディレクトリに *.deb パッケージが生成されます

念の為に,出来上がったパッケージに含まれるファイルの一覧を確認しましょう

$ dpkg --contents hogehoge*.deb

aptインストール出来るようにする.

先日書いた記事 自前のDebianリポジトリを作る方法 - ぴょぴょぴょ? - Linuxとかプログラミングの覚え書き -と組み合わせると,apt で自動インストールできるようになります.




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