連続した同じ文字を 1 文字にする tr コマンド

tr コマンドには 連続した同じ文字を 1 文字にする -s というオプションがあります。

例えば次のようにスペースが続いている場合

abcde      fghij

tr コマンドを使えば簡単にスペースを 1 つにすることができます。

abcde fghij

次のように指定します。

$ echo "abcde      fghij" | tr -s [:space:]

abcde fghij

[:space:]は、スペースやタブなどを示す文字クラスです。

ls の出力も簡単に加工できます。 (意味はないですが)

$ ls -ltr | head | tr -s [:space:]

total 9498
drwx------ 2 root root 48 1970-01-01 09:00 gconfd-root
drwx---rwx 2 root hpusers 48 2006-09-09 16:03 mmcache
drwxr-xr-x 2 apache apache 48 2006-09-09 16:11 fcgi
drwx------ 2 root root 120 2006-09-27 12:15 YaST2-06402-9kTlAk
drwxr-xr-x 4 root root 96 2007-06-03 17:21 pear
drwx------ 3 root root 80 2007-07-06 19:09 spamd-4708-init
drwx------ 3 root root 80 2007-07-06 22:28 spamd-4426-init
drwx------ 2 root root 120 2009-01-15 09:46 YaST2-04662-jtfPyg
srwxrwxrwx 1 mysql mysql 0 2010-03-04 08:29 mysql.sock

連続する「同じ文字」を 1 つにするだけなので [:alpha:] を 指定すると次のようになります。

$ echo "aaabbccddaaa" | tr -s [:alpha:]

abcda

思いがけないときに役に立つことがあります。

Excel で外部 Web データの取り込み

Excel には外部データの取り込み機能がありますが これを使うと Web のデータも簡単に Excel に取り込むことができます。

便利なのは、単に HTML としてデータを取り込むのではなく テーブル(表)になっている場合、そのテーブルを指定すると テーブルのデータだけを取り込むことができます。

メニューから「データ」→「外部データの取り込み」→「新しい Web クエリ」を選択します。

WRITE_0474_01

取り込む Web ページのアドレスを入力して「移動」ボタンを押すと そのページが表示されます。

WRITE_0474_02

上の図の左上に [→] という黄色いマークが表示されていますが これを選択すると「ページ全体」を取り込む指定になります。

次の図のようにページ内のテーブルにも [→] マークが表示されます。 このマークをクリックで選択してみます。

WRITE_0474_03

[→] マークが緑色になります。
複数のテーブルを選択することもできます。

取り込むテーブルを選択したら「取り込み」ボタンを押します。

WRITE_0474_04

インポート先を指定します。

WRITE_0474_05

次の図のように取り込まれます。

WRITE_0474_06

1 回取り込むと、その指定を記録するので、「更新」処理をするだけで 再度読み込むこともできます。 Web に置いてあるデータを利用する場合など手動のコピペも不要になので便利です。

第 23 回まっちゃ139勉強会に行ってきました

関西メインのセキュリティ勉強会「まっちゃ139」の 第 23 回勉強会に行ってきました。 (#matcha139)

[参考]
まっちゃ139 Hiki - 第23回まっちゃ139勉強会

まっちゃ139は今回が初めてで、サイトには 「まっちゃ139は、学生及び、20歳未満の人を応援しています。」と書いてあるので 若い人ばっかりだったらどうしようかと思っていましたが 2 割くらいで、同世代っぽい人も多くいたので安心しました。

午後の本篇?は自己紹介から始まりました。ふだんは講師だけでなく 参加者も1人ずつ自己紹介をしていくそうなのですが 講演が 4 つあり、人数も100人近くいたので近くの 8 人くらいが輪になっての 自己紹介や雑談を 20 分程度行いました。

最初はテレもありましたが、自己紹介が終わって講演に入っても 周りにいる人が会話を済ませた『知っている人』というのは 他の勉強会と違って不思議な安心感がありました。 初めての試みとのことでしたが、良かったと思います。

驚いたのは、自己紹介した 8 人のうち 5 人が willcom の端末を持っていたり WindowsPhone やら出るわ出るわという状態でした。 シェアというものは環境に寄って大きく変わるものですね。

講演は、オフレコが入り混じった濃いな内容も多くて 専門外の自分には知らないことも色々ありましたが 説明や質疑応答から皆の「やる気」や「楽しんでる」感じが ヒシヒシと伝わってきました。

Andoroid のセキュリティの話がメインで おそらく使う機会はないのですが スマートフォンの進化の過程で発生している問題を 知っておくことは意味のあることだと感じました。 問題の発生する理由や原因自体は、説明を聞くとわかりやすいので セキュリティを考える入口になるのではないかと思います。 (対策や基準の策定は別の問題として・・・)

あと「お菓子休憩」というのがあり、何だろう?と思っていましたが プリンやらモンブランやら用意されてました。 社会人は参加料が 500 円だったんですが、 300 円はお菓子代に消えたそうです。

WRITE_0473_01

大人(ほとんど男)が集まってお菓子を食べてるのも不思議な光景ですが 甘いものを食べながら雑談するのは良いもので こういうことで交流を図るのが大事なんでしょうね。 ちなみに自分はプリンを食べましたが、美味しかったです。

次は年末か年明けだそうですが、是非また参加したいと思います。

OSS-DB Silver を受けてきました

先週、平日の夜に OSS-DB Silver を受けてきました。

試験会場はピアソン VUE だったのですが 遅くまでやっていたり(20 時から試験開始でした)、前日まで申し込み可能だったり(場所によっては当日も可) いろいろと便利ですね。

いつものように簡単な受験体験記を書きました。

apt-get でパッケージを指定してアップデートする

apt-get の upgrade は インストール済みのパッケージを全てアップデートします。

apt-get update は パッケージのアップデートではなく、 パッケージリストのアップデートです。 指定したパッケージをアップデートするには ややこしいですが install を指定します。

インストール済みの apache2 をアップデートしてみます。

$ sudo apt-get install apache2
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  postgresql-doc php5-ldap postgresql-doc-8.4
Use 'apt-get autoremove' to remove them.
The following extra packages will be installed:
  apache2-mpm-worker apache2.2-bin apache2.2-common php5-cli php5-common php5-gd php5-ldap php5-pgsql
Suggested packages:
  apache2-doc apache2-suexec apache2-suexec-custom php-pear php5-suhosin
The following packages will be REMOVED:
  apache2-mpm-prefork libapache2-mod-php5 php5 phpldapadmin phppgadmin
The following NEW packages will be installed:
  apache2-mpm-worker
The following packages will be upgraded:
  apache2 apache2.2-bin apache2.2-common php5-cli php5-common php5-gd php5-ldap php5-pgsql
8 upgraded, 1 newly installed, 5 to remove and 90 not upgraded.
Need to get 6,609kB of archives.
After this operation, 20.7MB disk space will be freed.
Do you want to continue [Y/n]? 

このように upgraded パッケージ数が表示されます。

PostgreSQL の index-only

PostgreSQL 関連の記事をサーフィンしていたときに 下の記事に流れ着きました。

[参考]
POSTORO: postgresは Covering Indexによる高速検索ができないらしい

なんと。

index-only とか covering index というのは 『データベースからデータを取得するときに インデックスに必要な列が全て含まれていれば テーブルのデータを読まなくても済む』という パフォーマンスを高める方法です。

狙って使用したことはありませんが なんとなく PostgreSQL でも普通に使えると思っていました。

HOTもあるので、インデックスの設計するときには 気をつけなくてはならないですね。

PHP 技術者認定上級試験延長

2011 年 11 月に予定されていた PHP 技術者認定上級試験が 来年 1 月に延期が決定しました。

[参考]
上級試験開始延期のお詫び - PHP技術者認定機構

10 月 17 日に何かプレスリリースがあるとのことだったので 期待していたのですが、初級の公式参考書が出たという話でガッカリでした。

[参考]
PHP公式資格教科書 PHP5技術者認定初級試験対応: PHP技術者認定機構 監修, 酒徳 峰章, インターネット・アカデミー 著: 本

すでに延期して 11 月だったので延び延びですね。

MCTS 70-680 (Windows 7) を受けてきました

先週 MCTS 70-680 (Windows 7) を受けてきました。

Windows の MCP は XP,Vista,7 と 3 つ目になるのですが 今回は 受験体験記 に OS 系の試験を受けて感じたコツのようなものも書いてみました。
少しでも受験を考えている方の参考になればと思います。

Sendto フォルダを開く

WindowsXP などでは、右クリックメニューの「送る」を設定する Sendto フォルダを開くために 「ファイル名を指定して実行」に "sendto" と入力すれば良かったのですが WindowsVista や Windows7 ではこの方法で開かなくなっています。

同じような方法で開くためには 「プログラムとファイルの検索」に "shell:sendto" と入力します。

WRITE_0465_01

これで Sendto フォルダを開くことができます。

var_dump() の戻り値を文字列に格納する

PHP の便利な関数 var_dump() ですが 結果を画面に出力してしまいます。 通常なんら不都合はありませんが、文字列に格納しておいて 後で利用したい場合は、少し手を加えます。

まず var_dump() の結果を文字列に格納するためには バッファを使用する必要があります。

PHP のバッファはネストすることができるので すでに何らかのバッファが設定されている場合でも大丈夫です。

次のようになります。

ob_start();
var_dump($_SERVER);
$server = ob_get_contents();
ob_end_clean();
  • ob_start() でバッファを設定する
  • バッファされてる状態で var_dump() を出力する
  • ob_get_contents() で現在のバッファの内容を取得する
  • ob_end_clean() はバッファを出力せずに解除する

この方法は他の直接出力する関数でも使用することができます。

PHP5 技術者認定初級試験を受けてきました

しばらく試験を受けていなかったので コンピュータ試験の勘を取り戻すリハビリと PHP の力試しのために受験してみました。

いつものように 簡単ですが受験体験記を書きました。

言語の試験というのは、わざわざ受けるものではないかもしれませんが 実装から入ってしまうと、言語がサポートしている機能を知らずに自分で作るとか 無駄なことに気付くチャンスだったり、 なんだかんだと大量のソースを読む良い機会になると思います。

来月から上級が始まる予定なので 気が向いたらそちらも受けてみようかなと思います。

Bash のチルダ展開

Bash では次のようにチルダ (~) で カレントユーザのホームディレクトリに移動することができます。

$ cd ~

チルダに続けてユーザ名を指定すると そのユーザのホームディレクトリに展開されます。

$ cat ~hogehoge/.bashrc

他のユーザのホームディレクトリを調べなくても ホームディレクトリを指定することができます。

コマンドプロンプトでも PUSHD

以前 Bash の pushd について書きましたが コマンドプロンプトでも pushd を使うことができます。

C:\> PUSHD D:\test
D:\test> POPD
C:\> 

このようにドライブも移動してくれます。

面白いのがネットワークドライブのパスを指定したときです。

C:\> PUSHD \\192.168.1.15\public
Z:\> 

このように Z から順に空いているドライブを探して 一時的にネットワークドライブの割り当てをしてくれます。 (マイコンピュータを見ると、割り当てられたドライブ名が表示されています)

POPD や、コマンドプロンプトを EXIT して 一時的に割り当てられたドライブを抜けると ネットワークドライブの割り当ても自動で解除されます。

四捨五入して文字列にするワークシート関数

Excel には、数値を四捨五入して文字列に変換してくれる 便利なワークシート関数があります。

次のようなものがあります。

関数名 書式 返り値
DOLLAR=DOLLAR(12345.6789, 3)$12,345.679
YEN=YEN(12345.6789, 3)¥12,345.679
FIXED=FIXED(12345.6789, 3)12,345.679

第二引数は四捨五入する桁数で、省略すると 2 になります。

FIXED() ワークシート関数だけ、第三引数があり ここに TRUE (デフォルトは FALSE) を指定すると カンマ区切りなしで返します。

Linux/KVMによる仮想化ソリューションセミナに行って来ました

9/28 の水曜日に大阪でグローバルナレッジ主催の 『Linux/KVMによる仮想化ソリューションセミナ』が あったので行ってきました。

3 時間のセミナで、次のような内容でした。

  • OSS と Redhat のサブスクリプション
  • KVM 概略
  • RHEL で KVM
  • KVM 技術トピックと RHEL6 での新機能
  • RHEV 製品概略
  • クラウド/仮想化最新情報
  • デモ

Redhat の営業をやってる方が講師だったので Redhat が KVM をどう見ているかとか、 仮想化で Xen はどうするかなどを 質問できたのが良かったです。

Excel の AREAS() ワークシート関数

Excel には AREAS() というワークシート関数があるのですが 使い方がややこしいので説明を書いてみました。

通常、COUNT() などのワークシート関数では 次のように複数の範囲をカンマで区切って使用することができます。

WRITE_0x01_01

同じ範囲指定を AREAS() にも適用してみます。
(カッコを二重にします)

WRITE_0x01_02

2 が返りました。

この AREAS() ワークシート関数は、引数の範囲指定に 何個の「範囲」が指定されたかを返してくれるわけです。

これだけだと使い道がよくわからないので、 さきほどと同じ範囲指定に、次のように名前を付けます。

WRITE_0x01_03

今度は引数に名前を指定します。
(この場合は二重カッコは不要です)

WRITE_0x01_04

当然、結果はさきほどと同じ値が返ります。

このように AREAS() ワークシート関数を使うと 範囲指定が見えないときに範囲の数を判定することができるわけです。

PHP で、大文字・小文字を無視して比較する

PHP には strcasecmp() という大文字・小文字を無視して比較できる関数があります。

[参考]
PHP: strcasecmp - Manual

この関数、真偽値を返すのではなく、『str1 が str2 より小さい場合は負、str1 が str2 より大きい場合は正、等しい場合は 0 を返します。』というものなので 次のような使い方をすると結果が逆になってしまいます。

if (strcasecmp('aaaa', 'AAAA')) {
...

等しい場合が 0 なので FALSE 扱いになるわけです。 一致していることを判定するには、次のように 0 と比較するか、否定します。

if (strcasecmp('aaaa', 'AAAA') == 0) {
...

if ( ! strcasecmp('aaaa', 'AAAA')) {
...

ただ、否定だとあとで意味を取り違えることがあるかもしれないので 0 で比較する方が良いと思います。

第68回 夜な夜な! なにわオラクル塾に行って来ました

9/28 の水曜日に大阪で ORACLE 主催の 『第68回 夜な夜な! なにわオラクル塾 -JavaSE/JDK最新情報! Project "HotRockit" 』が あったので行ってきました。

[参考]
第68回 夜な夜な! なにわオラクル塾 -JavaSE/JDK最新情報! Project "HotRockit"

今回は ORACLE が Sun を買収したことで、ORACLE と Sun の JDK が どうなっていくかのロードマップの説明を中心としたセミナでしたが、 2009 年に BEA SYSTEMS が買収されたときの話や ORACLE の JRockit のもつ色々な機能についても紹介されていました。

普段 Java は使っていないので 言語としての興味はあまり無いのですが、 OSS とベンダの関わりについては 今後の展開に関わっていくことなので 興味深く聞くことができました。

PHP で外部のデータを取得する(プロキシ経由)

前に file_get_contents() 関数を使ったネタを書きましたが 社内などでプロキシを経由している場合は エラーになってしまいます。

プロキシの接続情報を含め、追加情報を設定するには 第 3 引数にコンテキストを設定します。

echo file_get_contents('http://www.yahoo.co.jp/', FALSE, $context); 

コンテキストを作成するには stream_context_create() 関数を使います。

[参考]
PHP: stream_context_create - Manual

HTTP の場合次のようにすると POST 送信になります。

$context = stream_context_create(
  array(
    "http" => array(
      "method" => "POST",
    )
  ));

設定できるパラメータはマニュアルを参照してください。

[参考]
PHP: コンテキストオプションとパラメータ - Manual

プロキシの設定は次のように tcp://host:port で指定します。

$context = stream_context_create(
  array(
    "http" => array(
      "proxy" => "tcp://192.168.1.200:3128",
      "request_fulluri" => TRUE,
    )
  ));

プロキシ経由の場合 request_fulluri も指定します。

プロキシにユーザ認証がある場合ですが ネットで検索したら proxy_user, proxy_pass を設定するとありました。

$context = stream_context_create(
  array(
    "http" => array(
      "proxy" => "tcp://192.168.1.200:3128",
      "request_fulluri" => TRUE,
      "proxy_user" => "xxxxx",
      "proxy_pass" => "yyyyy",
    )
  ));

[参考]
プロキシ経由でfile_get_contents - Road To Nowhere

ただ、この方法では自分の環境では認証エラーになってしまいました。 仕方ないので 次のように プロキシ用のヘッダを生成して使用しています。 自分の環境のプロキシは Basic schema なので Base64 でエンコードするだけです。

$url = "http://www.google.co.jp/";

$proxy_host = "192.168.1.200";
$proxy_port = "3128";
$proxy_user = "xxxxx";
$proxy_pass = "yyyyy";
$proxy_auth = base64_encode("$proxy_user:$proxy_pass");

$context = stream_context_create(
  array(
    "http" => array(
      "proxy" => "tcp://$proxy_host:$proxy_port",
      "header" => "Proxy-Authorization: Basic $proxy_auth",
      "request_fulluri" => TRUE,
      )
  ));

echo file_get_contents($url, FALSE, $context);

PHP の大文字・小文字

PHP の変数は大文字・小文字を区別します。
ところが予約語は、大文字・小文字の区別がありません。

次のようなスクリプトを記述します。
echo 命令が大文字・小文字の 2 パターンあります。

$a = "small";
$A = "large";

echo $a;
ECHO $a;
echo $A;
ECHO $A;

結果は次のようになります。
変数だけ大文字・小文字が区別されています。

small
small
large
large

関数(自作含む)なども大文字・小文字の区別はされません。

クラスの場合 メソッドは区別なしで、変数は区別ありとなります。

class Test {
    var $v1 = "abc";
    function f1() {
        return $this->v1;
    }
}

$t = new Test();
echo $t->f1();
echo $t->F1();
echo $t->v1;
echo $t->V1;   // この行だけエラー

映画『はやぶさ/HAYABUSA』を観てきました

10/1に 土曜日で初日で映画の日なので、映画『はやぶさ/HAYABUSA』を 観てきました。

[参考]
映画『はやぶさ/HAYABUSA』公式サイト 10.1 ROADSHOW

娯楽映画として観れるものにするために 脚色している部分は色々とあると思いますが それでも十分に感動できる内容でした。

分野は違っても、「物を作り進めるプロジェクト」が フィーチャーされるのは嬉しく思います。

自分のやっていることも、何かを誰かに残すことができるかもしれない、 そこだけで終わらず、小さな一歩にできるかもしれない。そんな勇気をもらいました。

CoffeeScript を試してみる

以前、HTML5 など勉強会で紹介された CoffeeScript を試してみます。 CoffeeScript は JavaScript を書くためのスクリプトです。

CoffeeScript を使うメリットは次のような感じです。

  • お決まりの呪文を書く量が減る
  • 人ごとのブレが少なくなる
  • 知識が少なくても「よく落ちる穴」に落ちにくくなる

勉強会では次のサイトが紹介されていました。

[参考]
ちっちゃいCoffeeScriptの本

CoffeeScript は Node.js の拡張で 簡単に試せないのですが 本家のサイトに行くとブラウザ上で試すことができます。

[参考]
CoffeeScript

上記サイトの上部メニューにある「 TRY COFFEESCRIPT 」をクリックすると ウィンドウが表示されるので、左側に CoffeeScript を記述すると右側にコンパイルされた JavaScript が 出力されます。

実際に試してみます。

[CoffeeScript]
alert "success"

  ↓

[JavaScript]
alert("success");

まず、カッコを省略することが出来ます(カッコがないとわかりにくくなる場合は付けます)。 セミコロンも省略できます。

[CoffeeScript]
alert "success" if document? 

  ↓

[JavaScript]
if (typeof document !== "undefined" && document !== null) {
  alert("success");
}

オブジェクトの存在判定が ? だけで記述できます。 この辺りは言語仕様を知らないと難しいですし ハマりやすいところですね。

[CoffeeScript]
if check()
  run1()
  run2()
else
  run3()

  ↓

[JavaScript]
if (check()) {
  run1();
  run2();
} else {
  run3();
}

ブロックは Python のようにインデントで表現します。 ブロックの開始カッコの位置とかブレやすいところですね。

ブラウザ上でそのまま使えないと普及は難しいと思いますが 柔軟な言語仕様に手を入れず、外から整えるやり方は好きです。

Google サイト内検索

Amazonアソシエイト