<TEXTAREA> の縦サイズ

<TEXTAREA> で rows を指定しても IE と Firefox では見た目が違ってしまいます。

例えば次のように定義します。

<textarea rows="3" cols="20">
1.ABCDE
2.あいう
3.アイウ</textarea>

rows を 3 にしていますが、Firefox では 次の赤線で囲んだように 3 行分以外に スペースが空いてしまいます。

WRITE_0335_01

不思議に思っていたのですが、 どうやらこのスペースは、横スクロールバーのための予定地だったようです。 スタイルシートで横スクロールバーを出してみます。

textarea {
    overflow-x : scroll ;
}

次のようになります。

WRITE_0335_02

Firefox はこの状態で 3 行分の縦サイズになりました。 逆に IE の方は横スクロールバーの分 隠れてしまいました。

自動改行させる場合(デフォルト)は、横スクロールがなくても 横に長くなった分は、次の行に改行されるだけなので 横スクロールバーを“なし”に設定してみます。 (ついでに縦スクロールバーを“必須”にしてデザインを合わせます)

textarea {
    overflow-x : hidden ;
    overflow-y : scroll ;
}

次のようになりました。

WRITE_0335_03

IE と Firefox で同じ縦サイズになりました。

横に長くなっても折り返すだけなので問題ありません。

WRITE_0335_04

自動改行させない場合はこの方法は使えません。
wrap を off にしてみます。

<textarea rows="3" cols="20" wrap="off">
1.ABCDExxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
2.あいう
3.アイウ</textarea>

WRITE_0335_05

横に長くなった分が隠れてしまうだけでなく IE 側にスペースができてしまいました。

Word の書式解除のショートカット [Ctrl]+[Space]

Word には文字書式解除のショートカットとして [Ctrl]+[Space] があります。 次のように「太字」「下線」「斜体」のような書式を解除することができます。

WRITE_0334_01

範囲を選択して [Ctrl]+[Spcae] を押します。

WRITE_0334_02

解除できました。

Word で、テキストボックスのフォーカス移動

Word で、次のようにテキストボックスを並べている場合 テキストボックス間の移動は [Tab] キーではできません。
(普通に Tab が入力されます)

WRITE_0332_01

そういう場合、[Alt]+[↑] や [Alt]+[↓] を使うことで フォーカスを移動することができます。

WRITE_0332_02

ただし、テキストボックスの生成順にフォーカスが移動するので その順で並んでいない場合は、変な順番の移動になります。

Word のオートコレクト (C) → ©

Word を使っていて (C) と入力すると © (○に c) に 勝手に変換されてしまうことがあります。

これは、オートコレクトという機能のせいです。

変換されてしまった直後に [Back Space] や [Ctrl]+[Z] を押すと 変換前の状態に戻すことができますが、 次のように、この機能自体を無効にすることもできます。

Word 2000 の場合、「ツール」から「オートコレクト」を選択します。 ( Word 2007 でも「オートコレクト」を探すのは同じです)

WRITE_0330_01

「入力中に自動修正する」のチェックを外します。

WRITE_0330_02

これで自動変換されなくなります。

Word でも表に計算式を入れる

Excel では「 =sum(A1:A5) 」のようにセルに計算式を入れることができますが Word でも表に計算式を入れることができます。

まず表を作ります。

WRITE_0328_01

表の計算式を入れたいセルにカーソルを置いて 「罫線」メニューから「計算式」を選択します。 ( Word2000 の場合)

WRITE_0328_02

計算式を入れるセルの上に数値があれば 次のようにデフォルトで「 =SUM(ABOVE) 」がセットされています。 "ABOVE" は、表内のこのセルより上にある範囲のことです。 "LEFT" だと 計算式を入れるセルより左にある範囲になります。

WRITE_0328_03

計算結果が入りました。

WRITE_0328_04

次のようにセルの位置の指定もできます。

WRITE_0328_05

計算結果が入りました。

WRITE_0328_06

計算式の結果は、他のセルの値を変えても自動では反映されません。 右クリックで「更新」するか、[F9] キーを押して更新する必要があります。

Bash の組み込みコマンド pushd

bash には pushd というコマンドがあります。

pushd コマンドは cd コマンドと同じように ディレクトリを移動することができます。

cd コマンドとの違いは 移動したディレクトリをディレクトリスタックに 積んで(保存して)くれます。 "push directory" なワケです。

ディレクトリスタックの内容は dirs コマンドで見ることができます。 初期状態では、ホームディレクトリが ディレクトリスタックに積まれています。

~:$ dirs
~

実際に使ってみます。 pushd コマンドは、実行後に現在のディレクトリスタックを 表示してくれます。

~:$ pushd /var
/var ~

/var:$ pushd /home
/home /var ~

/home:$

ディレクトリスタックから取り出すには popd コマンドを使います。

/home:$ popd
/var ~

/var:$

このままでも良いのですが 私は function を使って既存の cd コマンドを 置き換えて使用しています。

function cd {
    case $1 in
        "")
            pushd $HOME > /dev/null
            ;;
        "-")
            [ `dirs | wc -w` -gt 1 ] && popd > /dev/null
            ;;
        *)
            [ -d $1 ] && pushd $1 > /dev/null
            ;;
    esac
}

引数を指定しなければホームディレクトリに、ディレクトリを 指定した場合は移動してディレクトリスタックに積みます。 ハイフン "-" を指定した場合はディレクトリスタックから取り出します。

VBA で参照設定せずに DetaObject を使用する

Excel の VBA で クリップボードにデータを格納する場合 DetaObject を使う方法があります。

参照設定をせずに DetaObject を使う場合 次のように書きたくなりますが、 これはエラーになります。

Set Clip = CreateObject("MSFORMS.DataObject")

色々と調べてみると、次のように宣言できるようです。

CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")

これを利用すれば 参照設定せずに 簡単にクリップボードに文字列を格納できます。

With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    .SetText "この文字列をクリップボードに格納します"
    .PutInClipboard
End With 

PostgreSQL の PL/pgSQL 関数のソースを確認する

PostgreSQL に格納されている PL/pgSQL 関数のソースを確認するメモです。

次の test という関数で確認してみます。

CREATE OR REPLACE FUNCTION test(f1 TEXT, f2 TEXT)
RETURNS TEXT AS
$$
DECLARE
BEGIN
    RETURN 'This is a pen!';
END;
$$
LANGUAGE PLPGSQL;

関数の情報が格納されている pg_proc カタログから取得します。 prosrc 列にソースが格納されています。

db=# SELECT prosrc FROM pg_proc WHERE proname = 'test';

            prosrc
------------------------------

DECLARE
BEGIN
     RETURN 'This is a pen!';
END;

(1 row)

pg_proc カタログには 他にも色々な情報が格納されています。

db=# \x
db=# SELECT * FROM pg_proc WHERE proname = 'test';

-[ RECORD 1 ]--+-----------------------------
proname        | test
pronamespace   | 27944
proowner       | 16384
prolang        | 34946
procost        | 100
prorows        | 0
proisagg       | f
prosecdef      | f
proisstrict    | f
proretset      | f
provolatile    | v
pronargs       | 2
prorettype     | 25
proargtypes    | 25 25
proallargtypes |
proargmodes    |
proargnames    | {f1,f2}
prosrc         |
               : DECLARE
               : BEGIN
               :     RETURN 'This is a pen!';
               : END;
               :
probin         | -
proconfig      |
proacl         |

proargnames が引数の名前で proargtypes が引数のデータ型です。 prorettype は戻り値のデータ型です。

【参考サイト】
PostgreSQL 8.1.0 文書 41.24. pg_proc

関西 LPIC 無料セミナー

またもや関西限定の情報で、関西以外の方にはアレなのですが 7 月に LPIC の無料セミナーが 2 つあります。

『 LPIC レベル 1 技術解説無料セミナー』

7/11 大阪
『LPICレベル1技術解説無料セミナー』開催@大阪(7月11日)のお知らせ|Linux技術者認定機関 LPI-Japan

『 LPIC レベル 2 技術解説無料セミナー』

7/9 京都
オープンソースカンファレンス2010 Kansai@Kyoto - イベント案内 | 2010-07-09 (金): Linux技術者認定資格(LPIC)レベル2 技術解説セミナー

オープンソースカンファレンス2010 Kansai !

今年も、オープンソースカンファレンス Kansai の季節がやってきました。 日程は、2010年7月9日(金),10日(土)です。

オープンソースカンファレンス2010 Kansai@Kyoto - オープンソースの文化祭!

オープンソース好きが集まる オープンソースのためのお祭です。 (去年も全く同じことを書いていました。)

関西に住んでいるので、いつも関西のイベントだけピックアップしています。 関西以外の方にはゴメンなさい。

tac コマンドと rev コマンドの使い道

以前紹介した tac コマンドrev コマンドの 使い道を探していたのですが、素晴らしいネタが書いてあるサイトがありました。

【参考サイト】
しげふみメモ : Linuxのrevコマンドで文字を逆に並べる

ソートや文字の切り出しは考えていたのですが banner コマンドを使ったネタは想定外でした。

banner は 次のような出力ができるコマンドです。

$ banner Linux

#        ###  #     #  #     #  #     #
#         #   ##    #  #     #   #   #
#         #   # #   #  #     #    # #
#         #   #  #  #  #     #     #
#         #   #   # #  #     #    # #
#         #   #    ##  #     #   #   #
#######  ###  #     #   #####   #     #

これを tac コマンドに通すと上下が逆になります。

$ banner Linux | tac

#######  ###  #     #   #####   #     #
#         #   #    ##  #     #   #   #
#         #   #   # #  #     #    # #
#         #   #  #  #  #     #     #
#         #   # #   #  #     #    # #
#         #   ##    #  #     #   #   #
#        ###  #     #  #     #  #     #

rec コマンドに通すと左右が逆になります。

$ banner Linux | rev

  #     #  #     #  #     #  ###        #
   #   #   #     #  #    ##   #         #
    # #    #     #  #   # #   #         #
     #     #     #  #  #  #   #         #
    # #    #     #  # #   #   #         #
   #   #   #     #  ##    #   #         #
  #     #   #####   #     #  ###  #######

2 つのコマンドに通すと 180 度回転させることができます。

$ banner Linux | rev | tac

  #     #   #####   #     #  ###  #######
   #   #   #     #  ##    #   #         #
    # #    #     #  # #   #   #         #
     #     #     #  #  #  #   #         #
    # #    #     #  #   # #   #         #
   #   #   #     #  #    ##   #         #
  #     #  #     #  #     #  ###        # 

アイデア次第だと感心させられます。

積ん読 2010/06/09

文字列を反転させる rev コマンド

以前書いた tac コマンドは 行を反転さるコマンドでした。 そこで、行内の文字列を反転するコマンドも無いかと探してみたら rev というコマンドがありました。

次のテキスト( test.txt )を処理します。

1 2 3
4 5 6
7 8 9

rev コマンドで出力します。

$ rev test.txt

3 2 1
6 5 4
9 8 7

行の順番はそのままですが、行内で文字が反転しています。

標準入力を受けることもできます。

$ cat test.txt | rev 

3 2 1
6 5 4
9 8 7

tac と合わせて使うと全て反転させることができます。

$ tac test.txt | rev

9 8 7
6 5 4
3 2 1

ソートに使うくらいで、他に「これぞ!」という使い道は思いつきませんが いつか必要になるときのために、こういったコマンドが用意されているのは安心ですね。

PHP の preg_replace_callback 関数

Perl の文字列置換では、"e" オプションを付けると 置換先の指定を実行文として処理できるので、 条件にマッチした部分をサブルーチンで処理させることができます。

ややこしいので実際の例で説明します。

sub replace {
    return "[".($1*2)."]";
}

$xx = "123456789";
$xx =~ s/(\d)/replace($1)/ge;
print $xx;

文字列置換のときに replace() サブルーチンが実行されます。
実行結果は次のようになります。

$ perl replace.pl

[2][4][6][8][10][12][14][16][18]

これと同じことを PHP でやりたい場合 preg_replace_callback() という関数を使用します。

<?php
function replace($matches) {
    return "[".($matches[1]*2)."]";
}

$xx = "123456789";
$xx = preg_replace_callback("/(\d)/", "replace", $xx);
print $xx;
?>

実行結果は同じになります。
PHP の preg_replace_callback() では条件にマッチした部分を 第二引数のコールバック関数に渡すような形になります。

Perl の "e" オプションは、実行文として処理するだけなので サブルーチンを使用せずに 次のようにも書けます。

$xx = "123456789";
$xx =~ s/(\d)/"[".($1*2)."]"/ge;
print $xx;

PHP でも別の場所にわざわざ関数を定義したくない場合 create_function() で無名関数を作るという手があります。

<?php
$xx = "123456789";
$xx = preg_replace_callback("/(\d)/"
          , create_function('$matches'
                           ,'return "[".($matches[1]*2)."]";')
          , $xx);
print $xx;
?>

tac コマンドとは

Linux には tac というコマンドがあります。

資格の学校とは全く関係はありません。
「 cat コマンドの逆」ということで tac です。

$ cat test.txt

abc
123
efg
456
$ tac test.txt

456
efg
123
abc

このように cat とは 逆順の出力になります。

デフォルトでは、区切り文字が改行になっているので 行単位で逆になります。 他のコマンドで行を逆にするのは結構大変なので 覚えておくと役に立つときがあるんじゃないでしょうか。

他にも if 〜 fi、case 〜 esac といったように 「逆の文字列」で何かを表現することがありますが、 テキストならではの発想で面白と思います。

newgrp コマンドでグループを変更する

Linux に newgrp というグループを変更するコマンドがあります。

このコマンド、設定ファイルなどを変更するコマンドではなく su コマンドのように一時的に状態を変更するコマンドです。

まずグループについてですが、 Linux のユーザは 次の例のように複数のグループに属することができます。

$ id

uid=501(hoge) gid=502(develop) groups=497(manage),502(develop)

id コマンドで出力される groups は、補助グループと呼ばれる ユーザが属しているグループです。
gid の方は、一次グループと呼ばれ、ファイルを作成したときは このグループの権限が設定されます。

次のコマンドで、一次グループを変更することができます。

$ newgrp manage
$ id

uid=501(hoge) gid=497(manage) groups=497(manage),502(develop)

ファイルを作成するとグループが変わっているのがわかります。

$ ls -l

-rw-r--r--  1 hoge develop         0 2010-06-01 22:55 a.txt
-rw-r--r--  1 hoge manage          0 2010-06-01 22:56 b.txt

次の場合、newgrp するときにパスワードの入力が求められます。

  • ユーザにはパスワードがなくグループにはある
  • ユーザがグループのメンバーではなくグループにパスワードがある

su コマンド同様、root の場合はパスワードの入力が不要です。

newgrp すると su と同様に新しいシェルが起動します。

$ pstree

init┬
    ├
    ├sshd─sshd─bash─pstree

$ newgrp manage
$ pstree

init┬
    ├
    ├sshd─sshd─bash─bash─pstree

su コマンドと同様に環境を初期化するには "-" を指定します。

$ newgrp - manage

また、sg という newgrp とほぼ同機能のコマンドもあります。
newgrp との大きな違いとして、su コマンドと同様に "-c" オプションでコマンドを実行することができます。

$ sg --help
usage: sg group [[-c] command ]

ちなみに、sg コマンドは newgrp のシンボリックリンクのようです。

$ ls -l /usr/bin/newgrp /usr/bin/sg

-rwsr-xr-x  1 root root 27080 Mar  8  2004 /usr/bin/newgrp
lrwxrwxrwx  1 root root     6 Jan 20  2004 /usr/bin/sg -> newgrp

スタイルシートで使える色の指定方法

HTML では #RRGGBB と名前で 色を指定することができます。

<body bgcolor="#ffffff" text="black">

スタイルシートでは他の指定方法も使えます。

まず HTML と同じ指定。

<span style="color:red">名前で指定</span>
<span style="color:#ff0000">#RRGGBBで指定</span>

#RGB の 3桁で指定することもできます。

<span style="color:#f00">#RGBで指定</span>

#3fb と指定した場合 #33ffbb と同じ色になります。

rgb(R,G,B)での指定です。
0 〜 255 を 10 進数の数値で指定することができます。

<span style="color:rgb(255,0,0);">rgb(R,G,B)で指定</span>

rgb(R%,G%,B%)での指定です。
パーセンテージで 0 〜 100 で指定することができます。

<span style="color:rgb(100%,0%,0%);">rgb(R%,G%,B%)で指定</span>

Linux の join コマンドをテキストの抽出に使ってみる

join というコマンドがあります。

配列を文字列に結合する join もありますが データベースを使ってる人ならテーブルの結合を 思い浮かべるのではないでしょうか。 そちらのイメージです。

まずは paste コマンドのおさらい。
次の 2 つのファイル sugaku.txt と kokugo.txt を処理します。

ito     98      1
kameda  83      2
tanaka  71      3
wada    32      4
ito     91      2
tanaka  100     1
wada    45      3

数学と国語のテスト結果で、「名前、点数、順位」が テキストファイルに書かれています。

join します。

$ join sugaku.txt kokugo.txt

ito     98      1       91      2
tanaka  71      3       100     1
wada    32      4       45      3
        ~~~~|~~~~       ~~~~|~~~~
    sugaku.txtの内容   kokugo.txtの内容

2 つのファイルが 1 つにまとまりました。
オプションなしの場合、1 列目の値を使って結合します。

kokugo.txt に kameda の行はなかったため除外されました。 データベーステーブルの内部結合と同じです。

結合条件となる列を変えることもできますが、 あらかじめソートされている必要があります。 順位で結合するために kokugo.txt を順位の列でソートして kokugo2.txt を作ります。
( sugaku.txt は順位の列も昇順になっているのでソート不要)

$ sort +2 -n kokugo.txt > kokugo2.txt

$ cat kokugo2.txt

tanaka  100     1
ito     91      2
wada    45      3

3 列目の順位の列で join します。

$ join -1 3 -2 3 sugaku.txt kokugo2.txt

1       ito     98      tanaka  100
2       kameda  83      ito     91
3       tanaka  71      wada    45
        ~~~~|~~~~~      ~~~~|~~~~~~
    sugaku.txtの内容   kokugo2.txtの内容

"-1" は 1 つ目のファイルの結合条件となる列を指定します。 "-2" は 2 つ目のファイルの結合条件となる列です。

結合条件となる列は 先頭に出力されます。

ファイルの 1 つを標準入力から受けることもできます。 その場合、ファイルの指定の変わりにハイフン "-" を指定します。

$ cat sugaku.txt | join -1 3 -2 3 - kokugo2.txt

1       ito     98      tanaka  100
2       kameda  83      ito     91
3       tanaka  71      wada    45

これを利用して 標準入力から受けたコマンドの出力結果のテキストを 抽出してみたいと思います。

ls の結果が次のようになるとします。

$ ls -l

-rw-r--r--  1 hoge hoge    54 May 31 04:12 a.txt
-rw-r--r--  1 hoge hoge    54 May 31 04:12 b.txt
-rw-r--r--  1 hoge hoge    54 May 31 04:12 c.txt
-rw-r--r--  1 hoge hoge    54 May 31 04:12 d.txt

まず次のようなテキスト( where.txt )を用意します。

a.txt
b.txt

join します。

$ ls -l | join -1 9 - where.txt

a.txt -rw-r--r--  1 hoge hoge    54 May 31 04:12
b.txt -rw-r--r--  1 hoge hoge    54 May 31 04:12

a.txt と b.txt だけ抽出できました。

列を指定して抽出できるので抽出条件が他の列に混ざっていても 大丈夫という利点があります。

Google サイト内検索

Amazonアソシエイト