lessコマンドで特定の文字列をフィルタリングする方法

April 18,2018 12:03 AM
Category:[Linux]
Tag:[less, Linux]
Permalink

lessコマンドで特定の文字列をフィルタリングする方法を紹介します。

1.問題点

あるシステムで出力されるログを、"less +F"で動的に出力しているのですが、閲覧不要なログが大量に出力され、本当に見たい内容のログが見れません。

下記のようにすると、ログが動的に出力されなくなります。

% grep -v 除外文字列 | less +F

ということで、lessコマンドで特定の文字列をフィルタリングする方法を紹介します。

2.lessコマンドで特定の文字列をフィルタリングする

lessコマンドで特定の文字列をフィルタリングするには、まずlessコマンドでログを表示します。

このとき、"+F"オプションは付与せずに表示させてください。

次に"&"を押下。これで下記のように"&/"が表示されます。

&/表示

さらに"!"を押下すると"Non-match &/"という表示になります。

Non-match &/

除外したい文字を設定。ここでは"foo"と入力しています。

除外したい文字

リターンすれば"& :"という表示になり、フィルタリングした状態になります。

& :

さらに"Shift+f"を押下すれば、設定した文字にマッチしない行だけを動的に表示します。

設定した文字にマッチしない行を動的に表示

"!"を入力せずに文字列を設定すれば、設定した文字が存在する行だけをフィルタリングしてくれます。

Comments [0] | Trackbacks [0]

svnでコミットログを修正する方法

April 13,2018 12:03 AM
Category:[Linux]
Tag:[Linux, SVN]
Permalink

svnでコミットログを修正する方法を紹介します。

1.問題点

svnでコミットしたファイルのコミットログを修正したいので、ネットで調べて、TortoiseSVNを使って下記の手順で変更しようとしました。

該当ファイルを右クリックして、「Show log」を選択。

(クリックで拡大、以下同様)
Show log

変更したいリビジョンを右クリックして「Edit log message」をクリック。

Edit log message

メッセージを修正して「OK」をクリック。

メッセージを修正

が、「Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook.」というエラーが表示されて、メッセージを修正することができません。

Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook.

ということでsvnでコミットログを修正する方法を紹介します。

2.svnでコミットログを修正する

1項のエラーメッセージ「ask the administrator to create a pre-revprop-change hook.」は「管理者にpre-revprop-changeフックを作成するよう依頼」とあるので、このフックを作成します。

svnリポジトリにhooksというディレクトリがあるのでそこに移動。リポジトリ名がtestであれば"/svn/test/hooks"になります。

hooksには下記のファイルがあります。

-rwxrwx--- 1 root apache 1977  8月 28 16:58 2017 post-commit.tmpl
-rwxrwx--- 1 root apache 1638  8月 28 16:58 2017 post-lock.tmpl
-rwxrwx--- 1 root apache 2289  8月 28 16:58 2017 post-revprop-change.tmpl
-rwxrwx--- 1 root apache 1567  8月 28 16:58 2017 post-unlock.tmpl
-rwxrwx--- 1 root apache 3426  8月 28 16:58 2017 pre-commit.tmpl
-rwxrwx--- 1 root apache 2410  8月 28 16:58 2017 pre-lock.tmpl
-rwxrwx--- 1 root apache 2786  8月 28 16:58 2017 pre-revprop-change.tmpl
-rwxrwx--- 1 root apache 2100  8月 28 16:58 2017 pre-unlock.tmpl
-rwxrwx--- 1 root apache 2780  8月 28 16:58 2017 start-commit.tmpl

この中にあるpre-revprop-change.tmplは次のようなシェルになっています。

#!/bin/sh
 
# PRE-REVPROP-CHANGE HOOK
  :
# http://svn.apache.org/repos/asf/subversion/trunk/tools/hook-scripts/ and
# http://svn.apache.org/repos/asf/subversion/trunk/contrib/hook-scripts/
 
 
 
REPOS="$1"
REV="$2"
USER="$3"
PROPNAME="$4"
ACTION="$5"
 
if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi
 
echo "Changing revision properties other than svn:log is prohibited" >&2
exit 1

各変数は下記に対応しています。

  • REPOS:このリポジトリへのパス
  • REV:リビジョン
  • USER:プロパティを調整した人のユーザ名
  • PROPNAME:リビジョンに設定されているプロパティ
  • ACTION:'A'dded/'M'odified/'D'eleted

このファイルをコピーして、"pre-revprop-change"というフック用ファイルを同じディレクトリに作成し、実行権を与えます。

# cp pre-revprop-change.tmpl pre-revprop-change
# chmod 755 pre-revprop-change
# ls -l
合計 48
-rwxrwx--- 1 root apache 1977  8月 28 16:58 2017 post-commit.tmpl
-rwxrwx--- 1 root apache 1638  8月 28 16:58 2017 post-lock.tmpl
-rwxrwx--- 1 root apache 2289  8月 28 16:58 2017 post-revprop-change.tmpl
-rwxrwx--- 1 root apache 1567  8月 28 16:58 2017 post-unlock.tmpl
-rwxrwx--- 1 root apache 3426  8月 28 16:58 2017 pre-commit.tmpl
-rwxrwx--- 1 root apache 2410  8月 28 16:58 2017 pre-lock.tmpl
-rwxr-xr-x 1 root apache 2786  4月 12 10:32 2018 pre-revprop-change
-rwxrwx--- 1 root apache 2786  8月 28 16:58 2017 pre-revprop-change.tmpl
-rwxrwx--- 1 root apache 2100  8月 28 16:58 2017 pre-unlock.tmpl
-rwxrwx--- 1 root apache 2780  8月 28 16:58 2017 start-commit.tmpl

これで、コミットログを修正すると、このpre-revprop-changeフックが起動し、サンプルのシェルをそのまま使えばログに関する修正のみ、0で正常終了するようになります。

下記の画面で「OK」をクリックしても、エラー画面は表示されなくなります。

メッセージを修正

なお、pre-revprop-changeのパーミッションを参考サイトの手順にしたがって744にしてログを修正すると、下記のような「Revprop change blocked by pre-revprop-change hook (exit code 255) with no output.」というエラーになったため、755にしています。

Revprop change blocked by pre-revprop-change hook (exit code 255) with no output.

3.参考サイト

参考サイトは下記です。ありがとうございました。

Comments [0] | Trackbacks [0]

CSVDataImExporterプラグイン(MovableType7・コンテンツデータ対応版)

Movable Typeの記事をCSV形式で扱える「CSVDataImExporterプラグイン」をバージョンアップしました。

1.追加機能

MovableType7・コンテンツデータに対応しました。

インポート・エクスポートのメニューは、コンテンツデータ一覧に表示します。

インポート・エクスポートのメニュー

エクスポートのリンクをクリックすると、エクスポート画面が表示されるので、「CSVデータのエクスポート」をクリックすればCSVデータをエクスポートします。

エクスポート

エクスポートデータのサンプルは下記の通りです。

サンプルのコンテンツフィールド
コンテンツタイプ

エクスポートデータ

id,content_type_id,author_id,identifier,label,authored_on,modified_on,unpublished_on,unique_id,status,名前,説明_convert_breaks,説明,価格,URL,日付と時刻,日付,時刻,セレクトボックス,ラジオボタン,チェックボックス,アイテム,画像,カテゴリ,タグ,リスト,テーブル
1,1,1,test1,001,20180411211327,20180411211905,,68b9c31f56157c7de6040488f44f52b729ba01e4,2,テスト1,__default__,"aaa
bbb
ccc",10000,http://www.koikikukan.com/,2018-04-11 12:34:56,2018-04-30,00:00:03,M,1,"200,300",export-002-20171226221651.csv(3),bug-pbmt-white.png(2),"2,1",,"aaa,bbb,ccc","<tr>
		<td>1-1</td>
		<td>1-2</td>
		<td>1-3</td>
	</tr>
	<tr>
		<td>2-1</td>
		<td>2-2</td>
		<td>2-3</td>
	</tr>
	<tr>
		<td>3-1</td>
		<td>3-2</td>
		<td>3-3</td>
	</tr>
"

コンテンツフィールドの他に下記のフィールドをエクスポートします。

  • id
  • content_type_id
  • author_id
  • identifier
  • label
  • authored_on
  • modified_on
  • unpublished_on
  • unique_id
  • status

インポートのリンクをクリックするとインポート画面が表示されるので、必要な設定を行って「CSVデータのインスポート」をクリック。

インポートのメニュー

このような感じでインポートします。

インポート

評価ベータ版ということで、下記のコンテンツフィールドに対応した機能を提供します。

  • Single Line Text
  • Multi Line Text(フォーマットにも対応)
  • Number
  • URL
  • 日付と時刻
  • 日付
  • Time
  • Select Box
  • Radio Button
  • Checkboxes
  • アイテム
  • Audio Asset
  • Video Asset
  • Image Asset
  • Embedded Text
  • タグ
  • list
  • table

コンテンツフィールドの対応状況は下記のとおりです。

  • 日付と時刻/日付/Timeのフォーマットは記事・ウェブページと同じフォーマット
  • Multi Line Textのフォーマットは、CSVのフィールドとして出力
  • アイテム/Audio Asset/Video Asset/Image Assetは記事・ウェブページと同じフォーマット&アップロード対応

なお、現在のベータ版では下記の制約があります。→2018.4.17 すべて対応して製品版をリリースしました。

  • カテゴリセットはcategoryset_idでのインポート/エクスポートのみ可能(カテゴリ名には別途対応予定)→対応済
  • Select Box/Radio Button/Checkboxesはラベルではなく、値のみ対応(名前には別途対応予定)→対応済
  • 記事・ウェブページの機能は動作しません(別途対応予定)→対応済

また、すべての動作を確認できていないので、随時バージョンアップしていきます。

なおMT7製品版のリリース内容によって、操作・機能等を予告なしに変更する可能性もあります。ご了承ください。

2.プラグインのダウンロード

MT7・コンテンツデータ対応のCSVDataImExporterプラグインの評価版を公開中です。

ダウンロードは「CSVDataImExporterプラグイン」のページにアクセスしてください。

「CSVDataImExporterプラグイン」のページ
「CSVDataImExporterプラグイン」のページ

Comments [0] | Trackbacks [0]

subversionでファイル単位にアップデートする方法

April 11,2018 12:03 AM
Category:[Linux]
Tag:[Linux, subversion]
Permalink

subversionでファイル単位にアップデートする方法を紹介します。

1.問題点

subversionを使っているプロジェクトで特定のファイルだけをアップデートする必要が生じました。

いつもならチェックアウトしたリポジトリに移動して、

% svn update

と打つのですが、これでは他のファイルもまとめてアップデートされてしまいます。

ということで、subversionでファイル単位にアップデートする方法を紹介します。

2.ファイル単位にアップデートする

たいした回答ではありませんが、ファイル単位にアップデートするには、

% svn update ファイル名

と入力します。

hoge.ccのみをアップデートする場合は、下記のように入力します。

% svn update hoge.cc
Updating 'hoge.cc':
U    hoge.cc
リビジョン 3 に更新しました。
Comments [0] | Trackbacks [0]

perlで配列の途中の要素を削除する方法

April 6,2018 12:03 AM
Category:[Perl]
Tag:[Perl]
Permalink

perlで配列の途中の要素を削除する方法を紹介します。

1.問題点

次の、配列の途中の要素を削除するサンプルを動かしてみました。

#!/usr/bin/perl
use Data::Dumper;
 
my @foo = (0,1,2,3);
delete($foo[1]);
print(Dumper(@foo));

実行結果

$VAR1 = 0;
$VAR2 = undef;
$VAR3 = 2;
$VAR4 = 3;

deleteで値は消えるようですが、配列の要素自体は削除されないようです。

ということで、perlで配列の途中の要素を削除する方法を紹介します。

2.perlで配列の途中の要素を削除する

perlで配列の途中の要素を削除するには、splice関数を利用します。

#!/usr/bin/perl
use Data::Dumper;
 
my @foo = (0,1,2,3);
splice(@foo, 1, 1);
print(Dumper(@foo));

実行結果

$VAR1 = 0;
$VAR2 = 2;
$VAR3 = 3;

spliceは、下記のARRAYからOFFSET、LENGTHで指定される要素を取り除く関数です。

splice ARRAY,OFFSET,LENGTH

3.参考サイト

参考サイトは下記です。ありがとうございました。

Comments [0] | Trackbacks [0]

lsコマンドでファイルのフルパスを取得する方法

March 27,2018 12:03 AM
Category:[Linux]
Tag:[Linux]
Permalink

lsコマンドでファイルのフルパスを取得する方法を紹介します。

1.問題点

lsコマンドは、カレントディレクトリまたは指定したディレクトリのファイル一覧を表示するコマンドです。

ここではカレントディレクトリのファイルを表示させています。

% pwd
/home/hoge
% ls -l
合計 0
-rw-r--r--. 1 root root 0  3月 26 10:56 aaa
-rw-r--r--. 1 root root 0  3月 26 10:56 bbb
-rw-r--r--. 1 root root 0  3月 26 10:56 ccc

この表示されたファイルのフルパス、

/home/hoge/aaa
/home/hoge/bbb
/home/hoge/ccc

を取得したいのですが、方法が分かりません。

ということで、lsコマンドでファイルのフルパスを取得する方法を紹介します。

2.lsコマンドでファイルのフルパスを取得する

ファイルのフルパスを取得するには、下記のように、xargsコマンド・readlinkコマンドを組み合わせます。

% ls -1 | xargs readlink -f
/home/hoge/aaa
/home/hoge/bbb
/home/hoge/ccc

xargsは、標準入力から生成したコマンドラインを実行してくれるコマンドです。

readlinkは、シンボリックリンクの値または正規化されたファイル名を表示するコマンドで、オプションに"-f/-e/-m"のいずれかを付与することでフルパスを取得することができます。

"-f/-e/-m"オプションの意味は次のとおりです(manコマンドからの抜粋)。

  • -f, --canonicalize:与えられた名前の要素中に存在するシンボリックリンクを 再帰的に全て辿る。最後の要素以外は存在しなければいけない
  • -e, --canonicalize-existing:与えられた名前の要素中に存在するシンボリックリンクを 再帰的に全て辿る。最後の要素も含めて全て存在しなければいけない
  • -m, --canonicalize-missing:与えられた名前の要素中に存在するシンボリックリンクを 再帰的に全て辿る。要素が存在しなくてもよい
Comments [0] | Trackbacks [0]

C/C++でシンボル情報を読み出す方法

March 23,2018 12:03 AM
Category:[C/C++]
Tag:[C/C++]
Permalink

C/C++でシンボル情報を読み出す方法を紹介します。

1.はじめに

C/C++のプログラムでBセクションの開始アドレスと終了アドレスを読み出す必要が生じました。

ひとつの方法として、Bセクションのシンボル情報を読み出せばよいのですが、読み出す方法がわかりません。

ということで、C/C++でシンボル情報を読み出す方法を紹介します。

2.C/C++でシンボル情報を読み出す

C/C++でシンボル情報を読み出すには、下記のようにします。

test.cc

#include <stdio.h>
 
extern const void * __bss_start;
 
int main() {
    printf("__bss_start:%p\n", &__bss_start);
}

__bss_startがBセクションの開始シンボルです。

このプログラムのビルドおよび実行結果は次の通りです。

% g++ test.cc
% ./a.out
__bss_start:0x6009dc

nmコマンドでのシンボル情報は下記です。

% nm ./a.out
 :
00000000006007d8 d __JCR_END__
00000000006007d8 d __JCR_LIST__
00000000006009dc A __bss_start
00000000006009d8 D __data_start
0000000000400680 t __do_global_ctors_aux
0000000000400510 t __do_global_dtors_aux
00000000004006d0 R __dso_handle
                 w __gmon_start__
                 U __gxx_personality_v0@@CXXABI_1.3
00000000006007b4 d __init_array_end
00000000006007b4 d __init_array_start
00000000004005e0 T __libc_csu_fini
00000000004005f0 T __libc_csu_init
                 U __libc_start_main@@GLIBC_2.2.5
00000000006009dc A _edata
00000000006009f0 A _end
00000000004006b8 T _fini
0000000000400460 T _init
00000000004004c0 T _start
 :

これでBセクションの開始アドレス(__bss_start)が取得できました。

3.終了アドレスを取得する

実験したLinuxでは__bss_endというシンボルがないので、ちょっと面倒ですが、リンカスクリプトに追加する方法で実施します。

まず、g++に"-Wl,--verbose"オプションを追加して、リンク時のリンカスクリプトを表示させます。

% g++ -Wl,--verbose test.cc
GNU ld version 2.20.51.0.2-5.36.el6 20100205
  Supported emulations:
   elf_x86_64
   elf_i386
   i386linux
   elf_l1om
using internal linker script:
==================================================
/* Script for -z combreloc: combine and sort reloc sections */
OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64",
              "elf64-x86-64")
OUTPUT_ARCH(i386:x86-64)
ENTRY(_start)
SEARCH_DIR("/usr/x86_64-redhat-linux/lib64"); SEARCH_DIR("/usr/local/lib64"); SEARCH_DIR("/lib64"); SEARCH_DIR("/usr/lib64"); SEARCH_DIR("/usr/x86_64-redhat-linux/lib"); SEARCH_DIR("/usr/lib64"); SEARCH_DIR("/usr/local/lib"); SEARCH_DIR("/lib"); SEARCH_DIR("/usr/lib");
SECTIONS
{
  /* Read-only sections, merged into text segment: */
  PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x400000)); . = SEGMENT_START("text-segment", 0x400000) + SIZEOF_HEADERS;
  .interp         : { *(.interp) }
   :
  .data           :
  {
    *(.data .data.* .gnu.linkonce.d.*)
    SORT(CONSTRUCTORS)
  }
  .data1          : { *(.data1) }
  /* Sharable data sections.  */
  .sharable_data   : ALIGN(CONSTANT (MAXPAGESIZE))
  {
    PROVIDE_HIDDEN (__sharable_data_start = .);
    *(.sharable_data .sharable_data.* .gnu.linkonce.shrd.*)
    /* Align here to ensure that the sharable data section ends at the
       page boundary.  */
    . = ALIGN(. != 0 ? CONSTANT (MAXPAGESIZE) : 1);
    PROVIDE_HIDDEN (__sharable_data_end = .);
  }
  _edata = .; PROVIDE (edata = .);
  __bss_start = .;
  .bss            :
  {
   *(.dynbss)
   *(.bss .bss.* .gnu.linkonce.b.*)
   *(COMMON)
   /* Align here to ensure that the .bss section occupies space up to
      _end.  Align after .bss to ensure correct alignment even if the
      .bss section disappears because there are no input sections.
      FIXME: Why do we need it? When there is no .bss section, we don't
      pad the .data section.  */
   . = ALIGN(. != 0 ? 64 / 8 : 1);
  }
  .lbss   :
  {
    *(.dynlbss)
    *(.lbss .lbss.* .gnu.linkonce.lb.*)
    *(LARGE_COMMON)
  }
   :
  /* DWARF 3 */
  .debug_pubtypes 0 : { *(.debug_pubtypes) }
  .debug_ranges   0 : { *(.debug_ranges) }
  .gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }
  /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }
}
 
 
==================================================
attempt to open /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o succeeded
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o
   :
ld-linux-x86-64.so.2 needed by /usr/lib/gcc/x86_64-redhat-linux/4.4.7/libstdc++.so
found ld-linux-x86-64.so.2 at /lib64/ld-linux-x86-64.so.2

出力された下記の部分をコピーして、linker.scriptなど、任意の名称で保存します。

/* Script for -z combreloc: combine and sort reloc sections */
OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64",
              "elf64-x86-64")
   :
OUTPUT_ARCH(i386:x86-64)
ENTRY(_start)
SEARCH_DIR("/usr/x86_64-redhat-linux/lib64"); SEARCH_DIR("/usr/local/lib64"); SEARCH_DIR("/lib64"); SEARCH_DIR("/usr/lib64"); SEARCH_DIR("/usr/x86_64-redhat-linux/lib"); SEARCH_DIR("/usr/lib64"); SEARCH_DIR("/usr/local/lib"); SEARCH_DIR("/lib"); SEARCH_DIR("/usr/lib");
SECTIONS
{
   :
}

linker.scriptをvimなどで開き、__bss_end(赤色部分)を追加します。

  __bss_start = .;
  .bss            :
  {
   *(.dynbss)
   *(.bss .bss.* .gnu.linkonce.b.*)
   *(COMMON)
   /* Align here to ensure that the .bss section occupies space up to
      _end.  Align after .bss to ensure correct alignment even if the
      .bss section disappears because there are no input sections.
      FIXME: Why do we need it? When there is no .bss section, we don't
      pad the .data section.  */
   . = ALIGN(. != 0 ? 64 / 8 : 1);
  }
  __bss_end = .;
  .lbss   :
  {
    *(.dynlbss)
    *(.lbss .lbss.* .gnu.linkonce.lb.*)
    *(LARGE_COMMON)
  }

サンプルソースに__bss_endの対応(赤色)を追加します。

test.cc

#include <stdio.h>
 
extern const void * __bss_start;
extern const void * __bss_end;
 
int main() {
    printf("__bss_start:%p\n", &__bss_start);
    printf("__bss_end:%p\n", &__bss_end);
}

ビルド時に"-T"オプションでリンカスクリプトを指定します。

% g++ -Tlinker.script test.cc

実行します。

% ./a.out
__bss_start:0x6009dc
__bss_end:0x6009f0

nmコマンドの実行結果は下記です。

% nm a.out
  :
00000000006007c8 d __DTOR_LIST__
00000000004007b0 r __FRAME_END__
00000000006007d8 d __JCR_END__
00000000006007d8 d __JCR_LIST__
00000000006009f0 A __bss_end
00000000006009dc A __bss_start
00000000006009d8 D __data_start
0000000000400680 t __do_global_ctors_aux
0000000000400510 t __do_global_dtors_aux
  :

これでBセクションの開始アドレス(__bss_start)と終了アドレス(__bss_end)が取得できました。

Comments [0] | Trackbacks [0]

確定申告でクレジットカードを使って納税する方法

March 15,2018 12:03 AM
Category:[サービス]
Tag:[]
Permalink

確定申告でクレジットカードを使って納税する方法を紹介します。

1.はじめに

申告所得税はクレジットカード支払に対応しています。

ということで、クレジットカードによる納税方法を紹介します。

使えるクレジットカードは、Visa、Mastercard、JCB、American Express、Diners Club、TS CUBIC CARDのいずれかです。

なお、クレジットカードによる納税の場合、決済手数料がかかります。

金額は、1万円の納税で76円(消費税込で82円)、以後、1万円ごとに76円加算されるので、たとえば納税額が10万円の場合、820円の決済手数料が納税額に加算されます。

2.クレジットカードを使って納税する

国税クレジットカードお支払サイト」のページにアクセス。

国税クレジットカードお支払サイト
国税クレジットカードお支払サイト

納付税額を入力。入力すると決済手数料と支払額合計が表示されます。

納付税額

「上記の注意事項を確認しました」をチェック。

上記の注意事項を確認しました

同意ボタンをクリック。

同意

納税者の情報を入力

(クリックで拡大、以下同様)
納税者の情報

納付内容のところに記載されているとおり、「納付項目」から、一番上にある「申告所得税及復興特別所得税」を選択。

納付内容

選択すると入力項目が表示されるので、「課税期間(今回は29年)」、「申告区分(確定申告)」、通常の申告であれば「本税」および「合計額」を入力して「次へ」をクリック。

「本税」には"*"がついていませんが入力しないと警告が表示されます。また前の画面で入力した納付税額は引き継がれないので、「合計額」に再度入力します。

納付内容

クレジットカード情報を入力して「次へ」をクリック。

クレジットカード情報

入力内容が表示されるので、間違いがなければ「納付」をクリック。

納付

確認のダイアログが表示されるので問題なければ「はい」をクリック。

確認のダイアログ

これで納付手続き完了です。

納付手続き完了

Comments [0] | Trackbacks [0]

.bssと.sbss/.dataと.sdataの違い

March 13,2018 12:03 AM
Category:[C/C++]
Tag:[]
Permalink

.bssと.sbss/.dataと.sdataの違いについて調べてみました。

1.問題点

C++で、やや規模の大きなプログラムを作り、ビルドしたところ、リンクマップには

 .data
 .bss

以外に

 .sdata
 .sbss

というセクションができました。

.dataは初期値ありのデータ、.bssは初期値なしのデータを配置するセクションですが、.sdata/.sbssとの違いが分かりません。

ということで、.bssと.sbss/.dataと.sdataの違いについて調べてみました。

2..bssと.sbss/.dataと.sdataの違い

通常、プログラムが変数の値を読み書きするには、

  • 変数のアドレスをレジスタに代入
  • レジスタの指す先のメモリを読み書き

という、2つの手順が必要です。

.bssセクションや.dataセクションのデータはこの手順で読み書きします。

つまり、変数のアドレスを直接指定したメモリ読み書きは行なえません。

ただ、すべての変数でこれを行うのはコストがかかります。

そこで、データ領域を常に指すレジスタをひとつ設けておき、そのレジスタ値にインデックスを加えた位置(=変数)を読み書きすることで、アドレスをレジスタに設定するコストを削減するという方法があります。

このためのレジスタを「グローバルポインタ(またはベースレジスタ)」と呼びます.

これによりアセンブラは、通常2ワードで参照を行うところ、 1ワードのメモリ参照命令が生成可能となります。

グローバル・ポインタを利用してアクセスする変数を .sbssまたは.sdataというセクションに集めます。

.sbss/.sdataにサイズの小さい変数が多いのは、たくさんの変数を格納できた方がグローバル・ポインタを効率的に利用できるためです。

Comments [0] | Trackbacks [0]

Windowsでconfig.sysのFILESを変更する

March 8,2018 12:03 AM
Category:[Windows]
Tag:[Windows]
Permalink

config.sysのFILESを変更する方法を紹介します。

1.問題点

PCで色々なプログラムを起動しすぎたせいか、「16ビットプログラムを使いすぎです。CONFIG.SYSのFILESを変更してください」
という風なダイアログが表示されてしまいました(キャプチャ取り損ねたので正式なメッセージは失念)。

「CONFIG.SYS」というのは、ファイル名から推測するにWindowsの設定ファイルと思われますが、フォルダを探してもファイルがみつかりません。

ということで、config.sysのFILESを変更する方法を紹介します。

2.config.sysの配置場所

config.sysはCドライブ直下に配置されていると思います。

ただ、エクスプローラーでCドライブを表示しても、CONFIG.SYSが表示されていないと思います。

(クリックで拡大)
エクスプローラー

エクスプローラーでconfig.sysを表示するには、「整理」→「フォルダーと検索のオプション」をクリック。

フォルダーと検索のオプション

「表示」タブの「保護されたオペレーティングシステムファイルを表示しない(推奨)」のチェックを外す。

保護されたオペレーティングシステムファイルを表示しない(推奨)

警告ダイアログが表示されるので「はい」をクリック。

警告ダイアログ

前の画面に戻るので「OK」をクリック。

OK

これでconfig.sysが表示されます。

エクスプローラー

3.config.sysのFILESを変更する

config.sysをメモ帳など、任意のエディタで開きます。

なお通常のユーザーでは保存できないようなので、メモ帳の場合、ダブルクリックではなく、右クリックして「管理者として実行」で開きます。

私の環境では

FILES=40

が設定されていたので、この「40」の値を適当な値に増やします。

FILES

config.sysはWindows起動時に読み込まれ、そのあとは読み込まれないので、編集したあとは再起動が必要です。

4.その他

上記の手順でFILESの値は変更できますが、そもそもその対処が本質的であるかは不明です。

たとえば下記のような対処もあるので、安易に値を変更するのではなく、色々調べてみた方がいいかもしれません。

Comments [0] | Trackbacks [0]

gcc/g++の"-l"オプションの意味

March 6,2018 12:03 AM
Category:[C/C++]
Tag:[C/C++]
Permalink

gcc/g++の"-l"オプションの意味について調べてみました。

1.問題点

C/C++のオブジェクトファイルをldコマンドでリンクする方法(その2)」で示した最後の1行、

-lstdc++ -lm -lgcc_s -lgcc -lc

で"-l"は、リンクするライブラリを指定するためのオプションです。

が、"-l"の後に続く「stdc++」「m」「gcc_s」「c」が何を指しているのか、さっぱりわかりません。

ということで、"-l"オプションの意味について調べてみました。

2."-l"オプションの意味

前項のオプションを例に説明します。

それぞれのオプションは、下記のライブラリを検索します。

  • libstdc++.a
  • libm.a
  • libgcc_s.a
  • libgcc.a
  • libc.a

具体的には、"-l"オプションはリンクのときに使われるオプションで、"-l"の後に続く文字列に"lib"、後方に".a"をつけたライブラリを検索します。

この規則については、ldコマンドのmanページに、次のように記載されています。

-lar
アーカイブファイル ar をリンクするファイルのリストに加える。このオプションは何回でも指定でき る。 ld は ar が指定されるごとに、 libar.a が見つかるまで検索パ スを探す。
Comments [0] | Trackbacks [0]

Movable Type 7の「enable_object_methods」について

March 2,2018 12:03 AM
Category:[7.0]
Tag:[MovableType]
Permalink

Movable Type 7の「enable_object_methods」について紹介します。

1.問題点

Movable Type 7で既存プラグイン検証中で、独自オブジェクトを使っているプラグインでデータを保存すると、「不正な要求です。」という、MT6で発生しなかったエラーが発生しました。

不正な要求です

調べたところ、MT7(MT7.0b1〜)で新しく追加された「enable_object_methods」が影響しているようです。

ということで、「enable_object_methods」について情報共有します。

2.「enable_object_methods」について

「enable_object_methods」はレジストリ項目で、各オブジェクトの編集・保存・削除の可否をチェックします。

具体的には、MT::Commonのsave()/edit()/delete()でこのレジストリをチェックし、編集・保存・削除でこのレジストリが登録されていないと冒頭のエラーになります。

独自オブジェクトを使っているプラグインで、オブジェクトの編集・保存・削除にエラーにならないようにするためには、プラグインのconfig.yaml等に下記の記述が必要です。

enable_object_methods:
    データソース名:
        save: 1
        edit: 1
        delete: 1

β版の情報なので今後変更になるかもしれませんが、独自オブジェクトを使ったプラグイン+MT6で運用しているサイトはMT7へのアップグレードで独自オブジェクトの編集・保存・削除ができなくなる可能性があります。ご注意ください。

Comments [0] | Trackbacks [0]

C/C++のオブジェクトファイルをldコマンドでリンクする方法(その2)

February 28,2018 12:03 AM
Category:[C/C++]
Tag:[C/C++]
Permalink

C/C++のオブジェクトファイルをldコマンドでリンクする方法(その2)です。

1.はじめに

以前「C/C++のオブジェクトファイルをldコマンドでリンクする方法」をエントリーしましたが、簡単なサンプルをldコマンドでリンクするために必要最低限なオプションは結局何かわからないままだったので、オプションを整理しなおしてみました。

2.サンプルとリンク設定オプション

サンプルコード(hello.cc)は下記です。

#include <iostream>
 
int main(){
    std::cout << "Hello, World!!" << std::endl;
    return 1;
}

このサンプルをコンパイルします。

% g++ -c hello.c

次に、-vオプションで実行されるコマンドを表示して、リンクを実行します。

% g++ -v -o main hello.o
Using built-in specs.
Target: x86_64-redhat-linux
コンフィグオプション: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
スレッドモデル: posix
gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC)
COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.4.7/:/usr/libexec/gcc/x86_64-redhat-linux/4.4.7/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.4.7/:/usr/lib/gcc/x86_64-redhat-linux/:/usr/libexec/gcc/x86_64-redhat-linux/4.4.7/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/4.4.7/:/usr/lib/gcc/x86_64-redhat-linux/
LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.4.7/:/usr/lib/gcc/x86_64-redhat-linux/4.4.7/:/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'main' '-shared-libgcc' '-mtune=generic'
 /usr/libexec/gcc/x86_64-redhat-linux/4.4.7/collect2 --eh-frame-hdr --build-id -m elf_x86_64 --hash-style=gnu -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o main /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.4.7/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.4.7 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.7 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../.. hello.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-redhat-linux/4.4.7/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crtn.o

前の記事では、上記のオプションを単にコピーして、

% ld --eh-frame-hdr --build-id -m elf_x86_64 --hash-style=gnu -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o main /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.4.7/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.4.7 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.7 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../.. hello.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-redhat-linux/4.4.7/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crtn.o

としていたのですが、整理すると下記のオプションに絞り込めました(改行は見やすくするためのものです)。

% ld -o main
 -L/usr/lib/gcc/x86_64-redhat-linux/4.4.7
 hello.o
 /usr/lib64/crt1.o
 /usr/lib64/crti.o
 /usr/lib64/crtn.o
 /usr/lib/gcc/x86_64-redhat-linux/4.4.7/crtbegin.o
 /usr/lib/gcc/x86_64-redhat-linux/4.4.7/crtend.o
 -lstdc++ -lm -lgcc_s -lgcc -lc

ということで、簡単なサンプルプログラムでもこれだけのライブラリが必要であることがわかりました。

Comments [0] | Trackbacks [0]

さくらインターネットのサーバで無料SSLを設定する方法

February 27,2018 12:03 AM
Category:[レンタルサーバ]
Tag:[sakura]
Permalink

さくらインターネットのサーバで無料SSLを設定する方法を紹介します。

1.はじめに

さくらインターネットでは無料SSLのLet's Encrypt(レッツエンクリプト)が提供されています。

無料SSLサーバー証明書 Let's Encrypt - さくらインターネット
Let's Encrypt

「さくらのレンタルサーバ」のコントロールパネルから、ワンクリックとまではいきませんが、簡単に設定することができます。

ということで、さくらインターネットのサーバで無料SSLを設定する方法を紹介します。

2.無料SSLを設定する

サーバコントロールパネルにログインして、「ドメイン/SSL設定」をクリック。

ドメイン/SSL設定

無料SSLを設定したいドメインの「証明書」をクリック。

証明書

「無料SSLの設定へ進む」をクリック。

無料SSLの設定へ進む

「SNI SSL」を選択した状態で「無料SSLを設定する」をクリック。

無料SSLを設定する

これで設定完了です。

Comments [0] | Trackbacks [0]

JavaScriptでJSONデータを作る方法

February 21,2018 12:03 AM
Category:[JavaScript]
Tag:[JavaScript]
Permalink

JavaScriptでJSONデータを作る方法を紹介します。

JavaScriptでJSONデータを作る方法

1.問題点

JavaScriptで下記のようなJSONデータを作りたいと思います。

{"foo":"abc","bar":"xyz","hoge":100}

が、JSONデータの作り方が分かりません。

初期値が分かっていれば上記のフォーマットをそのまま書けばいいのですが、foo/bar/hogeの値は処理の中で決まります。

ということで、JavaScriptでJSONデータを作る方法を紹介します。

2.JavaScriptでJSONデータを作る

JavaScriptでJSONデータを作る方法の1つとして下記があります。

<script>
var data = {};
 
data["foo"] = "abc";
data["bar"] = "xyz";
data["hoge"] = 100;
 
json_data = JSON.stringify(data);
// console.log(json_data);
</script>

ひとつめのポイントは、連想配列dataの初期化子を"{}"にすることです。

var data = {};

下のように、

var data = new Array();

配列で定義すると、出力結果が

[]

となってしまうので注意してください。

もう一つのポイントは、JavaScriptデータをJSONデータにするには"JSON.stringify()"を利用します。

json_data = JSON.stringify(data);

3.参考サイト

参考サイトは下記です。ありがとうございました。

Comments [0] | Trackbacks [0]
 1  |  2  |  3  |  4  |  5  | All pages