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

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

2017-06-08

ポインタからクラス名を調べる方法

|  ポインタからクラス名を調べる方法を含むブックマーク  ポインタからクラス名を調べる方法のブックマークコメント

c++で、ポインタからクラス名や型名を調べる処理は、以下の2ステップで実現できます

  • typeid(obj).name() で型名の文字列を取る
  • abi::__cxa_demangle() で demangle する

サンプルコードは以下の通り

#include <typeinfo>
#include <cxxabi.h>

#include <iostream>

int 
main()
{
  class MyClass {
     int value;
  };
  MyClass *ptr = new MyClass;

  char buf[64] = "unknown";
  size_t len = sizeof(buf);
  std::cout << abi::__cxa_demangle(typeid(*ptr).name(), buf, &len,NULL) << std::endl;

  delete ptr;
  return 0;
}

実行すると

main::MyClass

と出力されます

abi::__cxa_demangle() には第2引数にNULLを渡す使い方もありますが、NULLを渡す方法では free() を呼ばないとメモリリークします。上記コードの buf[]の様に事前にメモリを確保して、それを第2引数で渡す方が、コードがシンプルに書けます

参考URL

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

2017-06-01

日本語フォルダ名を英語にする方法

|  日本語フォルダ名を英語にする方法を含むブックマーク  日本語フォルダ名を英語にする方法のブックマークコメント

デスクトップダウンロード,公開,画像,ビデオのようなディレクトリ名を英語名に変更するには以下のコマンドを実行する

$ LANG=C xdg-user-dirs-update --force

設定ファイル

システムの既定値(デフォルト値)は /etc/xdg 以下の設定ファイルで定義されている.たとえば /etc/xdg/user-dirs.default など.

詳細は man page に色々書いてある

$ man xdg-user-dir
$ man xdg-user-dirs-update
トラックバック - http://d.hatena.ne.jp/pyopyopyo/20170601

2016-11-06

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

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

macOS Sierra の TeX環境を texlive2016 に更新したので手順をまとめます.

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

BasicTeX

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

MacTeXだと全パッケージがインストールされ 2.4GB ものディスク容量が消費されますが,サブセット版である BasicTeX は良くよく使われるパッケージのみをインストールするため必要な容量は 280MB程度です

また不足パッケージは後から簡単にインストールできるので実用上の問題もありません

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

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

なおMacTeXは

  • 2016 通常版 /usr/local/texlive/2016
  • 2016 BasicTeX /usr/local/texlive/2016basic
  • 2015 BasicTeX /usr/local/texlive/2015basic

という感じでディレクトリを分けてファイルを配置し,/usr/texbin というシンボリックリンクデフォルトバイナリを切り替える,という仕組みになっています.

たとえば mactex-basic.pkg をインストールすると,/usr/texbin のリンク先は /usr/local/texlive/2016basic/bin/x86_64-darwin

になります.

シンボリックリンクの切り替えは,GUIであれば「システム環境設定」の「TeX Distribution」から行います.

初期設定

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

方法は二つ

あります.

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

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

$ sudo tlmgr update --self 

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

$ sudo tlmgr update  --all

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

日本語環境用パッケージをインストール

$ sudo tlmgr install ptex platex jsclasses japanese-otf jfontmaps cjk-gs-integrate adobemapping 

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

$ sudo tlmgr install  type1cm subfigure dvipdfmx multirow

日本語フォントの設定

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

  • jfontmaps
  • cjk-gs-integrate
  • adobemapping

です

あらかじめインストールしておきます

$ sudo tlmgr install jfontmaps cjk-gs-integrate adobemapping

adobemapping を入れておかないとdvipdfmxでエラーが出ます

フォントの登録

$ cd /usr/local/texlive/2016basic/texmf-dist/scripts/cjk-gs-integrate
$ sudo ./cjk-gs-integrate.pl --link-texmf --force
$ sudo mktexlsr

これで,/usr/local/texlive/texmf-local/fonts以下に,フォントファイルへのシンボリックリンクが自動作成されます

登録済みフォントの一覧を確認します

$ kanji-config-updmap status

フォントの変更

フォントが登録できたら,pdfに埋め込むフォントヒラギノの N シリーズ に変更

$ kanji-config-updmap hiragino-elcapitan-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 2015を消したい場合は /usr/local/texlive/2015basic をディレクトリ毎削除するだけです

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

トラブルシューティング

pdfに画像が貼れない/gsコマンドが無い
ghostscript (gsコマンド) がインストールされていないと dvipdfmx 経由で作成する pdf に画像が貼れない場合があります.ghostscript をインストールするには https://tug.org/mactex/morepackages.html の mactex-additions.pkg から ghostscriptを選択してインストールのが楽そうです
LaTeXIt を使いたい
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 パッケージをインストールすると直ります

まとめ

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

全部インストールすると 2.4GB程度だそうで,かなりディスク容量を節約できたようです.



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

ねこ丸ねこ丸 2016/12/05 15:20 こんにちは、 すでに切ってある,GPTパーテーション
WIN8.1-64からはじめました。
お決まりの、先頭から 300MB、100MB、128MB、win-C:の構成ですが、300MB回復(winPE)を縮小して、そこにgrub2を入れるのかと思っておりますが、webサイトを見ましても説明がよく理解できません。
実際にはどのようにすればよいのでしょうか?
それではよろしくお願いします。

2016-07-12

pdfのファイルサイズを小さくする方法

|  pdfのファイルサイズを小さくする方法を含むブックマーク  pdfのファイルサイズを小さくする方法のブックマークコメント

pdfファイルに高解像度の画像を埋め込むと,ファイルサイズ無駄に大きくなります.この場合,以下のスクリプトで画像の解像度を下げると,効率よくファイル圧縮できます.コマンドラインで実行できるので,複数のpdfファイルを一括で変換することも可能でとても便利です.

なおこのスクリプトLinuxMac OS Xの両方で動作します

スクリプトの中身

#!/bin/bash

error()
{
    echo "$@"
    exit 1
}

if [ $# -ne 2 ]; then
    cat<<EOF
usage:
   $0   <input-pdf>  <output-pdf>
EOF
    exit 1
fi

input=$1
output=$2

[ -f "$input" ] || error "no such input file, $input"
[ -f "$output" ] && error "$output already exists"

gs \
   -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 \
  -dDownsampleColorImages=true \
  -dColorImageResolution=300 \
  -dNOPAUSE -dBATCH \
  -sOutputFile="$output"  "$input"

使い方

上記の内容をパスが通っているディレクトリ,例えば /usr/bin/以下に,pdf_reduce.sh という名前で保存します.次にパーミッションを設定します

$ sudo chmod  a+x /usr/bin/pdf_reduce.sh

実行方法は以下の通りです.

$ pdf_reduce.sh  original.pdf  output.pdf

ここで,original.pdf は元のファイル , output.pdf が出力ファイルの名前になります.

複数のpdfを一括変換する場合は次のようにします

$ mkdir  output
$ for x in *.pdf; do  pdf_reduce.sh $x output/$x; done

出力ファイルの保存先として "output"というディレクトリを作成して,カレントディレクトリにあるpdfをまとめて変換し,同じファイル名で outputディレクトリ以下に保存します.

解説


gsコマンドを使って pdf を読み込んで,再度pdf形式で書き出しています

ポイントは,以下の3点です

A4の紙に印刷する程度であれば解像度は300dpi程度で十分です

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

2016-06-04

MBR(bios)でもESP(uefi)でも起動できるgrub2の設定方法

|  MBR(bios)でもESP(uefi)でも起動できるgrub2の設定方法を含むブックマーク  MBR(bios)でもESP(uefi)でも起動できるgrub2の設定方法のブックマークコメント

Linuxを起動する方法はたくさんあります.本エントリでは

の2つを共存させたディスクを作成する方法についてまとめます

前者は,従来のBIOS経由での起動方法で,古いマザーボードだと必須となる方法です.後者は,EFI経由の起動方法で,最近のマーザーボードで使える"新しくて便利な"方法となります.

具体的な手順について

以下,実例として

の場合について手順を詳細に説明します

SSDは64GB で /dev/sdb に繋いであるものとします

なお既存のディスクを MBR/ESP両対応に変換する手順については,後日別エントリに書く予定です.

事前準備

事前知識として

  • MBRを使う場合は,ディスクの先頭に1MB程度の領域を確保しておいて,そこに grub2を入れる事
  • ESPを使う場合は,ディクスのパーティションテーブルを GPT という形式で設定する事
  • ESPFAT32 または FAT16でフォーマットする事

という条件があります

そこで,予め gptを使うために gdisk, fat でフォーマットするので dosfstools をインストールしておきます

$ sudo apt-get install gdisk dosfstools

grub-efiインストールしておきます

$ sudo apt-get install grub-efi
gdisk を使ったパーティション設定

gdisk で

sudo /sbin/gdisk /dev/sdb

次のように表示されます

GPT fdisk (gdisk) version 1.0.1

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries.

Command (? for help):

初期化SSDなのでパーティションテーブルがありません


まず expert モードに遷移,sector alignment value を 1に変更します

Command (? for help): x

Expert command (? for help): l

Enter the sector alignment value (1-65536, default = 2048): 1

Expert command (? for help): m

Command (? for help):

コマンドを説明すると,

  • まず"x"でexpertモードに突入
  • "l"でsector alignment value の変更
  • 値を1 に設定
  • "m"で元のモードに戻る

となります

続いて第一パーティションを作成します.このパーティションMBRgrub が使う領域になります

Command (? for help): n
Partition number (1-128, default 1): 1
First sector (34-125045390, default = 34) or {+-}size{KMGTP}:  34
Last sector (34-125045390, default = 125045390) or {+-}size{KMGTP}: 2047
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): EF02
Changed type of partition to 'BIOS boot partition'

コマンドを説明すると,

と設定しています.これで "BIOS boot partition" が作成されます

念の為,"p"コマンドパーティションテーブルを表示させて,状態を確認します

Command (? for help): p
Disk /dev/sdb: 125045424 sectors, 59.6 GiB
Logical sector size: 512 bytes
Disk identifier (GUID):XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 125045390
Partitions will be aligned on 1-sector boundaries
Total free space is 125043343 sectors (59.6 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1              34            2047   1007.0 KiB  EF02  BIOS boot partition


Command (? for help):

34セクタから2047セクタに EF02 で BIOS boot parttion が作成されていることが確認できます

うまく行ったら sector alignment value を 2048 に戻します

Command (? for help): x

Expert command (? for help): l
Enter the sector alignment value (1-65536, default = 2048): 2048

Expert command (? for help): m

Command (? for help):
  • "x"でexportモードに突入
  • "l"でsector alignment value の変更
  • 値を 2048 に設定
  • "m"で元のモードに戻る

となります

次に EFI System パーティションを作成します

Command (? for help): n
Partition number (2-128, default 2): 2
First sector (2048-125045390, default = 2048) or {+-}size{KMGTP}: 2048
Last sector (2048-125045390, default = 125045390) or {+-}size{KMGTP}: 256M
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): EF00
Changed type of partition to 'EFI System'

と設定します.これで "EFI System" パーティションが作成されました

続けて Linux 用のパーティションを作成します.今回はディスクの残りの領域をすべて "/" パーティションに割り当てることにします

Command (? for help): n
Partition number (3-128, default 3): 
First sector (524289-125045390, default = 526336) or {+-}size{KMGTP}: 
Last sector (526336-125045390, default = 125045390) or {+-}size{KMGTP}: 
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): 
Changed type of partition to 'Linux filesystem'

となっています

最後に "p" でパーティション情報を表示させます

Command (? for help): p
Disk /dev/sdb: 125045424 sectors, 59.6 GiB
Logical sector size: 512 bytes
Disk identifier (GUID):XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 125045390
Partitions will be aligned on 2048-sector boundaries
Total free space is 2047 sectors (1023.5 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1              34            2047   1007.0 KiB  EF02  BIOS boot partition
   2            2048          524288   255.0 MiB   EF00  EFI System
   3          526336       125045390   59.4 GiB    8300  Linux filesystem

問題なければ "w" でパーティション情報をディスクに書き込みます

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sdb.

問題なければ "Y" を押します."Y"を押すまではディスクには何も書き込まれないので,不安だったら

Ctrk-C とか "N" を押せば変更はキャンセルできます



パーティションのフォーマット

再度パーティションを確認します

$ sudo /sbin/gdisk  -l /dev/sdb
Number  Start (sector)    End (sector)  Size       Code  Name
   1              34            2047   1007.0 KiB  EF02  BIOS boot partition
   2            2048          526335   256.0 MiB   EF00  EFI System
   3          526336       125045390   59.4 GiB    8300  Linux filesystem

第1パーティションのフォーマットは不要です.grubが直接セクタを書き換えるためです

第2パーティション /dev/sdb2 は vfat 32 でフォーマットします.これはEFIのルールです

$ sudo /sbin/mkfs.vfat -F32 /dev/sdb2 

第3パーティション /dev/sdb3 は ext4 でフォーマットしました

$ sudo /sbin/mkfs.ext4  /dev/sdb3

第三パーティションはディスクラベルも指定しておきます.ラベルは"ROOT"にします

$ sudo /sbin/e2label /dev/sdb3 ROOT

今時のLinuxはUUIDでパーティションを特定しますが,私は必ずラベルを設定するようにしています.

なぜなら,サーバ障害時などの緊急時には最悪SSDを取り外して,別のLinux BOXに繋いでマウントという手段を取ることがあり,その際はラベルを指定しておくと作業が円滑におこなえるためです.


システムのコピー

長いので別エントリにしています. linux環境を複製する方法 - ぴょぴょぴょ? - Linuxとかプログラミングの覚え書き - こちらをご覧ください

grubインストール

新しいディスク上を /mntマウントして,そこに chroot した環境で作業します

$ sudo mount /dev/sdb3 /mnt
$ sudo mount --bind /dev /mnt/dev
$ sudo mount --bind /proc /mnt/proc
$ sudo chroot /mnt
MBR用grub2のインストール

従来のBIOSブートで使用するブートローダとして grub2 をインストールします

# /usr/sbin/grub-install --target=i386-pc /dev/sdb

エラーが出る場合は以下の点を確認します

  • "BIOS boot partition"が正しく作成出来ているか?

パーティションテーブルの内容を再度チェックしましょう

  • "multiple partition labels" というエラーが出る場合

以下のエラーが出る場合は

grub-install: warning: Attempting to install GRUB to a disk with multiple partition labels.  This is not supported yet..
# dd if=/dev/zero of=/dev/sdb seek=1 count=2047

を実行してブートクタから第一パーテションまでを一度消去します.あとは再度

# /usr/sbin/grub-install --target=i386-pc /dev/sdb

を実行すればOK

EFI用grub2のインストール

まず"EFI System"パーティションを /boot/efiマウントします

# mkdir -p /boot/efi
# mount /dev/sdb2 /boot/efi

続けてgrub2をインストール

# /usr/sbin/grub-install --target=x86_64-efi /dev/sdb

LinuxEFIで起動していない場合は,ここで

efibootmgr: EFI variables are not supported on this system.
efibootmgr: EFI variables are not supported on this system.

という警告がでます

この警告が出る場合は再起動時にマザーボードBIOS/EFIの設定画面に行き,ブートローダーとしてgrubを使うように設定する必要があります

ねこ丸ねこ丸 2017/02/23 14:11 こんちわ 「34セクタから2047セクタ」のところ
40セクタから2047セクタ のほうが良いような気がするんですがいかがでしょうか?

ねこ丸ねこ丸 2017/02/23 14:37 もひとつ 
$ sudo apt-get update
$ sudo apt-get install grub-efi
$ sudo apt-get autoremove
$ sudo apt-get install grub-efi-amd64
$ sudo apt-get install grub-efi-x86_64
$ sudo apt-get install grub-efi-ia32-bin

$ sudo chown -R usr:usr /mnt
$ mkdir -p /mnt/usb
$ mkdir -p /mnt/usb/boot/iso
$ sudo mount /dev/sdb1 /mnt/usb
$ sudo grub-install --target x86_64-efi --efi-directory /mnt/usb --boot-directory=/mnt/usb/boot --removable
$ sudo grub-install --target i386-efi --efi-directory /mnt/usb --boot-directory=/mnt/usb/boot --removable
$ lsblk -f | grep /mnt/usb

pyopyopyopyopyopyo 2017/02/27 17:13 コメントありがとうございます

一つ教えていただきたいのですが
40セクタにするとどんなメリットがあるのでしょうか?

私のこのエントリでは
OSはLinuxで grub2 を使う前提で手順を書いていますが
- gdiskのデフォルトが34
- セクタ34で問題は起きていない
ということで 34を使っています

34で不具合が出る場合をご存知でしたら是非教えてください

ねこ丸ねこ丸 2017/06/06 13:05 遅くなってすみません。
34の不具合はたまに蹴られることがあります。
それとこのエリアをgrubが欲しがるみたいです。
解決策は 場所はどこでも良いみたいで 4MB(AFT縛り)単位 GDISK で ef02 にしてやれば良いようです。
話題を変えて
GPT-DISK の先頭に 100MB-FAT32 後 ntfs を 適当(AFT)にして GDISK r h 1 2 y y n で ハイブリッドにしますと レガシー(MBR)起動で win7-32 をインストールしますと 認識して 入っちゃいました。

pyopyopyopyopyopyo 2017/06/08 23:01 という事であれば
ef02を作成する前提であれば34で問題ないと思います