検索、Emacsによる検索と置き換え、通信速度の感覚、木構造の限界、シンボリック・リンク

					2016年06月28日
情報科学類 コンピュータリテラシ

                                       筑波大学 システム情報系 情報工学域
                                       新城 靖
                                       <yas@cs.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/literacy-2016/2016-06-28
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/

■連絡事項

■補足

■検索に必要な考え方

◆ヒット率と選択率

ヒット率
欲しかった情報のうち、どのくらい見つかったか。
選択率
見つかった情報のうち、どのくらいが本当に欲しかったものか。

図? ヒット率と選択率
図? ヒット率と選択率

あちらを立てればこちらが立たず。 トレードオフ。

◆3つの論理演算

外枠は、全体(たとえば、インターネット上の膨大な数のWWWページ)を表す。 色が付いている所が、見つかったデータを表す。

「keyword1」で検索。

図? キーワードを1つ与えた時
図? キーワードを1つ与えた時

keyword1 AND keyword2 AND keyword3

図? キーワードを3つ与えた時(AND)
図? キーワードを3つ与えた時(AND)

keyword1 OR keyword2 OR keyword3

図? キーワードを3つ与えた時(OR)
図? キーワードを3つ与えた時(OR)

NOT keyword1

図? キーワードを1つ与えた時(NOT)
図? キーワードを1つ与えた時(NOT)

キーワードを1つ与えた時の NOT は使えない。

NOT keyword1 AND keyword2 AND keyword3

図? キーワードを3つ与えた時(AND,NOT)
図? キーワードを3つ与えた時(AND,NOT)

NOT は、AND といっしょにつかう。 NOT 単独では、使えない。

◆絞込検索

絞込検索(しぼりこみけんさく)のイメージ

図? キーワードを1つ与えた時
図? キーワードを1つ与えた時

図? キーワードを2つ与えた時
図? キーワードを2つ与えた時

図? キーワードを3つ与えた時
図? キーワードを3つ与えた時

絞込検索は、基本的には、AND と同じ(注意: キーワードの順番に反応する検 索エンジンもある。AND では順番は関係ない。)。

keyword1 AND keyword2 AND keyword3

図? キーワードを3つ与えた時 図? キーワードを3つ与えた時(AND)
図? キーワードを3つ与えた時(AND)

■WWW検索エンジン

The Unix Super Text 28.5節,34章 参照

インターネット上にある膨大な情報から、必要な情報を見つけ出すためには、 次のような方法がある。

検索するより、人に聞いた方が速いことも多い。

◆検索エンジンとWWWロボット

検索エンジン(サーチエンジン)
WWWで検索機能を使う時、実際に検索を行うプログラム。 インターネット上のあるWWWサーバで動いていてる。
検索結果は、手元のWWWブラウザの画面に表示される。

検索対象のデータにキーワードを与える方法

自動抽出したものは、ヒット率はよいが選択率が悪い。 人間が整理したものは、選択率はよいがヒット率が悪い。
WWWロボット。クローラ。
WWWページからプログラムでキーワードを自動抽出するプログラム。
WWWロボットの動き
  1. ロボットは、あるURLが与えられると、そのページ を訪れる(ページの内容を得る)。
  2. 得たページの内容を解析して、キーワードを抽出する。
  3. そのページにリンクが含まれていたら、1 に戻って繰り返す。
このような繰り返しの方法を、コンピュータ・サイエンスの用語では 再帰(recursion) とう。ロボットは、世界中の WWWページを歩き回り、キーワードを抽出する。 ただし、一度訪れたことがあるページは記録しておいて、2度訪れないようす る。

◆まとめページ、まとめサイトの危険性

ある話題について、掲示板やブログ等に投稿された特定の話題のメッセージを 読みやすいようにまとめたページやまとめたページをまとめページ、あるいは、 まとめサイトと呼ぶことがある。有用なデータがまとめられていることもある が、恣意的な編集がなされていることも多い。単にアクセス数を増やして広告 表示回数を増やす目的のために設置されているものも多い。

◆検索エンジンでのAND、OR、NOT

多くの検索エンジン(Google、Yahoo!Japan、Microsoft Bing, DuckDuckGo等)では、 次の方法で、AND、OR、NOT を用いた検索が可能。
AND
空白で区切り、キーワードを並べる。「AND」と書かない。
OR
OR と大文字書く。
NOT
マイナス「-」を使う。単独では使えない。「keyword1 -keyword2」のように使う。
参考

◆検索エンジンの高度な検索機能

◆フィルタ・バブル

検索エンジンの結果が、ユーザの好みに合うように変化する。 ユーザは、泡(バブル)の中から、外の歪んだ世界を見ることになる。

参考

◆コマンドによるファイルの検索

Unix では、次のようなコマンドでファイルの検索ができる。
シェル
ファイル名置換 (*,?,[]) のパタンを使って、ファイル名で検索できる。
find コマンド
ファイル名、属性(所有者、グループ、日付、モード)等で検索できる。 外部のコマンドも実行できる。 The Unix Super Text 33.1.5 参照
grep コマンド
ファイルの内容で検索できる。 The Unix Super Text 33.1.5 参照The Unix Super Text 第32章 正規表現 参照

◆lv

lv コマンドは、less コマンドと同様に、表示しているファイルを検索する機 能がある。次のようなキーが使える。
キー 説明
/パタン 順方向検索
n 順方向検索次候補
/[←] 順方向検索次候補
?パタン 逆方向検索
?[←] 逆方向検索次候補
手引き 2.6.2 参照The Unix Super Text 33.1.4 参照

■正規表現(regular expression)

単純な検索。 正規表現の例:「^a.*tion$」。「aで始まり、tionで終わるもの」。

^」、「.」、「*」、「$」 は、 メタキャラクタ。特別の意味を持つ。 メタキャラクタを含まない文字列も、正規表現として意味を持つ。

◆正規表現の詳細

grep コマンド、egrep コマンド、Emacs での正規表現の使い方。

■Emacs

Emacs には、通常の検索とインクリメンタルな検索の2種類の検索がある。 The Unix Super Text 12.4.6 参照 手引き 3.3.7 参照 インクリメンタル・サーチの途中で、検索する文字を打つ代わりに、C-s, C-r を打つと次に見つかった場所にカーソルが移動する。

◆Emacsの検索と文字列の置換え

The Unix Super Text 12.4.6 参照手引き 3.3.7 参照

M-x query-replace (M-%, Esc %) が便利。

M-% と打つと、ミニバッファで次のように聞かれる。

Query replace: 置き換え前の文字列[←]
Query replace 置き換え前の文字列 with: 置き換え後の文字列[←]
キー意味
y (または SPC) 置き換え
n 次の候補に移動
q 終了
! 以降すべて置換

その他に、次のような置換え機能がある。 The Unix Super Text 33.2 参照

■通信速度の感覚

次のものと合わせて考えたい。

◆通信速度の単位

毎秒何ビット、bps、bit per second、bit/second
1秒間に何ビット送れるか
Byte/second、毎秒何バイト
1秒間に何バイトビット送れるか。 1 Byte/sec == 8 bps。
ややこしいことに、データ量はバイトで言うことが多く、通信速度は、「ビッ ト/秒」が使われることが多い。(1本の線で1ビットずつ送る感覚。)

情報量の単位と同様に、通信速度にも次のような係数がことがある。

k (キロ、ケイ)
1024 か 1000
M (メガ)
k の 1024 倍か 1000 倍。1,000,000 くらい。
G (ギガ)
M の 1024 倍か 1000 倍。1,000,000,000 くらい。
T (テラ)
G の 1024 倍か 1000 倍。1,000,000,000,000 くらい。

◆通信速度の感覚

10 k bps
よく普及している携帯電話で得られる速度
32 k bps - 56 k bps
電話回線経由で接続した時に得られる速度。
32 k bps または 64 k bps
PHS (Personal Handy Phone) で得られる速度
64 k bps
ISDN (電話回線と同じ電線で直接ディジタル信号を流す時)
100 k bps
MP3 などで圧縮した音楽を流す時に必要な速度。
128 k bps
ISDN で2回線同時に使った時。
1500 k bps (1.5 M bps)
ISDN (光ファイバでディジタル信号を流す時)
1500 k bps (1.5 M bps)
音楽用 CD を圧縮しないでまま流す時に必要な速度。 (1倍速のCDの速度。)
1500 k bps (1.5 M bps)
ケーブルテレビや ADSL という方式でインターネット接続を した時に得られる速度。
5000 k bps (5 M bps)
DVD-Video を再生している時にディスクから読み出されている データの速度。
10 M bps, 100 M bps, 1000 M bps (1 G bps), 10 G bps
イーサネット(LANでよく使われている)

実習室のパソコンは、1G bps で学内LANに接続されている。

学内LANの基幹部分は、1G bps - 16G bps で接続されている。

筑波大学学内LANは、 SINET5 (2016年-)へ 100Gbps、 で繋がっている。 ただし、 coins、宿舎、無線LAN等の一般的な所から利用する時には、 全体で 30G bps という制約がある。 また、 防火壁(ファイアウォール(firewall)) による制約で速度が低下することもある。

■ファイルとディレクトリの木構造を扱うプログラム

標準では単一のファイルやディレクトリを扱うコマンドも、木構造を扱うこと ができるものもある。 木構造をうまく扱うには、「再帰的な(recursively)」処理が重要になる。 これは、自分と同じ処理を、木構造の子供の節にも行うことである。 くわしくは、2年生の「データ構造とアルゴリズム」で扱う。

例:

再帰的な処理を行わせるためには、大文字 -R (recursively) オプションを取 るコマンドも多いが、小文字 -r のものもある。例: scp -r。 大文字でも小文字でもどちらでも受付けるものもある。

何もしないと、自動的に再帰的な処理を行うプログラムもある。例: tar, tree, find 等。

ディレクトリに対しても mv コマンドは有効である。ディレクトリの名前を mv で変更すると、木構造で考えると、それ以下のファイルの名前を全て変更し たことと同じ効果がある。

ファイルのコピーでは、以下で述べるシンボリック・リンク等の問題があるため、 cp -r では不十分なことが多い。

■木構造の制約と問題点

大量の情報を保存するには、木構造を使うしかない。 しかし、木構造だけではうまくいかない。

◆こうもりの分類問題

図13 こうもりの分類(1)
図13 こうもりの分類(1)

図14 こうもりの分類(2)
図14 こうもりの分類(2)

木構造は、ファイルを整理するのに非常に強力な構造である。しかし、それだ けでは、ファイルを整理するには不都合が起きる。それを解消するために、次 のような名前で呼ばれる仕組みが用意されている。

2つの節に、「別名」をつけて、2つの道からたどり着けるようにする。 (木構造では、1つの節にたどり着く道は、ただ1つしかない。)

注意:bash, csh の alias とファイル名の alias (Macintosh) は、まったくの別物。

図15 こうもりの分類(別名つき)
図15 こうもりの分類(別名つき)

◆ハイパーテキストとハイパーメディア

木構造を補う方法として、 ハイパーテキスト を使うことがある。

シンボリック・リンク(symbolic link)は、Unix で、ファイルに別名をつける ための機能。「リンク」とは、木構造の枝の意味で、つまり、ファイル名を意 味する。シンボル(symbol)は、(数ではなくて)文字列であることを意味する。 シンボリック・リンク(symbolic link)は、文字列の形で、ファイルの別名を保 持している。

例:java コマンド

$ ls -l /usr/bin/java [←]
lrwxr-xr-x  1 root  wheel  74 10  7  2015 /usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
$ []
シンボリック・リンクは、ls -l で見ると、右端に l (小文字の L) と表示さ れる。 ファイル /usr/bin/java を参照すると、 /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands にある java が使われる。
$ ls -l /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java [←]
-rwxr-xr-x  1 root  wheel  54624  2  7  2014 /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
$ []

シンボリック・リンクを作成するには、ln -s コマンドを使う。

$ ln -s oldname newname [←]
この結果、newname でファイルを参照すると、 oldname というファイルが使われる。(このファイルは、 newnameoldname の2つの名前を持つ。)

cp コマンドは、コピー元にシンボリック・リンクを指定しても、リンクの先の ファイルをコピーする。
$ cat file1 [←]
cat: file1: No such file or directory
$ echo file1 > file1 [←]
$ cat file1 [←]
file1
$ ln -s file1 slink1 [←]
$ cat slink1 [←]
file1
$ ls -l file1 slink1 [←]
-rw-r--r--  1 yas  prof  6  6 17 14:20 file1
lrwxr-xr-x  1 yas  prof  5  6 17 14:20 slink1 -> file1
$ cp slink1 file2 [←]
$ ls -l file2 [←]
-rw-r--r--  1 yas  prof  6  6 17  2015 file2
$ cat file2 [←]
file1
$ []

■授業アンケート

名前を書いてもよい。書かなくてもよい。成績を付けた後で、読む。

■実習

実習時間中には、 以下の課題をできるだけ多く行いなさい。全部を行う必要はない。 手引き 3.3.7 参照。 Emacs のインクリメンタルサーチ機能を使ってみなさい。 C-s (上から下方向の検索)の代わりに、C-r (下から上方向の検索)を利用してみなさい。 インクリメンタル・サーチとカーソル移動(矢印キー、C-v, M-v)とを比較して、 インクリメンタル・サーチの利点を考えなさい。 Emacs で非インクリメンタルな検索機能を使ってみなさい。

★練習問題(2003) Emacs query-replace

Emacs で query-replace を利用してみなさい。
  1. 練習用に、内容が破壊されても問題ないファイルを用意する。 たとえば、過去に提出したレポートを cp コマンドでコピーする。
  2. そのファイルを emacs 開く
  3. M-% (Esc %)と打つ
  4. 以後、Emacsの検索と文字列の置換え参照。
手引き 2.6.2 参照。 ページャ lv には、検索機能がある。 にあるキーの動きを確かめなさい。

★練習問題(2005) Firefoxの検索機能

Firefox には、表示しているページ内の文字列を検索する機能がある。 この機能を確認しなさい。 ページ内検索 参照。

★練習問題(2006) Thunderbirdの検索機能

Thunderbirdには次のような検索機能がある。 これらの機能を確認しなさい。 詳しくは、「ヘルプ」メニューから「Thunderbird ヘルプ」を選びなさい。 オフィース・ツール(MS Word, Excel等)の検索機能を利用してみなさい。 置換え機能もある。 自分が普段つかっているWWW検索エンジンで次の演算を実行するためには、どの ように記述すべきかを調べなさい。そして、その方法がうまく動作することを 確認しなさい。

★練習問題(2009) WWW検索エンジンの利用、site:、フレーズ、ワイルドカード

検索エンジンの高度な検索機能 を利用してみなさい。 参考

★練習問題(2010) 検索エンジンの一時的な変更

Firefox で、一時的に他の検索エンジンで検索してみなさい。
  1. (検索ボックスに検索したいキーワードを打ち込む。後でもよい)
  2. 検索ボックスの左側の虫眼鏡の部分をクリックして、 登録されている検索エンジンの一覧表を表示する。
    Firefox、検索ボックス、検索エンジンをの一覧 (クリックで拡大)
  3. 一覧表の中かから、検索エンジンを選ぶ。

★練習問題(2011) 検索エンジンの変更

Firefox で、検索エンジンを変更する方法を確認しなさい。
  1. 一番上のメニューバーで、「Firefox」をクリックし、表示されたメニュー から「環境設定...」を選び、 Firefoxの環境設定タブ を開く。
  2. 「検索」パネルを開く。
  3. 「デフォルト検索エンジン」の下の「▼」の部分をクリックし、 目的のものを選択する。
    Firefox、設定、検索、デフォルト検索エンジン (クリックで拡大)

★練習問題(2012) 筑波大学付属図書館の検索機能

http://www.tulips.tsukuba.ac.jp/,筑波大学付属図書館 で図 書の検索を行いなさい。3つの演算(AND, OR, NOT)をどのようにして利用する かを調べなさい。

★練習問題(2013) ls -Rコマンド

ls コマンドには、-R (大文字 R, Recursive) というコマンドがあり、 引数で指定されたディレクトリに子供のディレクトリが含まれていたら、 その子供についても表示する(子供にも子供があればそれも表示する)。 この動きを確かめなさい。
$ cd ~ [←]
$ ls -R    . | lv [←]
$ ls -lR   . | lv [←]
$ ls -laR  . | lv [←]
-R オプションは、このようにしばしば-l オプションや -a オプションと一緒に使われる。また、-R オプションは、大 量の結果を表示することが多いので、パイプに出力してページャで表示するこ とが多い。 (これらのオプションを忘れた人は、man コマンドを見なさい。)

★練習問題(2014) treeコマンド

treeコマンド を利用してみなさい。

★練習問題(2015) シンボリック・リンクの調査

ls -l を使って、次のディレクトリにどのようなシンボリック・リンクがある かを調べなさい。 ls コマンドと grep コマンドを組み合わせて使うと便利である。
$ ls -l /Applications | grep '^l' [←]
ここで、'^l' は、 正規表現 で行の先頭がl で始 まるという意味である。

★練習問題(2016) Finder によるエイリアスの作成

Finder で ファイルに対するエイリアスを作成してみなさい。

★練習問題(2017) Emacs Dired によるディレクトリ木の表示

Emacs に含まれている Directory Editor を利用して ディレクトリ木を表示しなさい。 テキストファイルを開いたり、削除したり、改名したりしなさい。 The Unix Super Text 19.4.4項参照 参照

★練習問題(2018) lynx,w3m コマンドによるディレクトリ木の表示

lynx や w3m のように、端末で動作する Web ブラウザを利用してディレクトリ 木を表示しなさい。
$ lynx . [←]
$ lynx ~ [←]
$ w3m . [←]
$ w3m ~ [←]

★練習問題(2019) フィルタ・バブルの観測

検索エンジンの結果が、過去の検索結果やクリックした広告等で変化すること を観測しなさい。

★練習問題(2020) ジョブ制御

The Unix Super Text 22.3節 参照

次の機能を確認しなさい。

★練習問題(2021) 制御構造

The Unix Super Text 40.15 参照。 次の機能を確認しなさい。

★練習問題(2022) bashの関数

bash の関数を利用してみなさい。 The Unix Super Text 40.15.5 参照

★練習問題(2023) bash算術計算

bash では $(()) で簡単な計算ができる。 この機能を確認しなさい。 The Unix Super Text 41.3.8項 参照
$ cat add [←]
#!/bin/bash

a=$1
b=$2
x=$(($a + $b))
echo $x
$ ./add 10 20 [←]
30
$ []

★練習問題(2024) 条件付きでplatexを2回実行する

platexを2回実行するシェル・スクリプト で、 1回目の実行でエラーが出た時には、2回目は実行しないようにしなさい。

ヒント: if を使う。 「&&」を使う方法もある。

★練習問題(2025) 条件付きでのplatex、dvipdfmx、Preview.appの連続実行

platex、dvipdfmx、Preview.appの連続実行 で、前のプログラムの 実行でエラーが出た時には、次のプログラムは実行しないようにしなさい。

★練習問題(2026) C言語のソース・プログラムだけを表示するls

与えられたディレクトリのC言語のソース・プログラムだけを表示するシェル・ スクリプトを作りなさい。
$ ls-c ~/syspro/file/ [←]
fd-print.c
file-copy.c
mmap-head.c
stdio-thru.c
utmp-print.c
wtmp-last10.c
ystat.c
ystat.h
ヒント:シェルの ファイル名置換 で *.c や *.h といったファイル名のものだけを取り出す。

余裕があれば、-l などのオプションが付けられるようにしなさい。

★練習問題(2027) バックアップ・ファイルとのdiff(複数ファイル)

バックアップ・ファイルとのdiff で複数のファイルを引数に取れるよう にしなさい。
$ diff-backup kadai10.txt kadai11.txt kadai12.txt [←]
ヒント:for 文で、引数のファイルについて、"$file"~ のような名前のファイ ルが存在するかを調べる。存在すれば、diff コマンドで表示する。

★練習問題(2028) 小文字のファイル名への変更

Windows 系のコンピュータから Unix へファイルをコピーすると大文字のファ イル名になってしまうことがある。そのようなファイル名を全て小文字にする ようなスクリプトを書きなさい。

$ mv-lower [A-Z]* [←]

ヒント:ファイル名を echo して、tr で小文字にして、それを `` でシェル変数に入れる。元の名前から小文字 の名前に mv で変える。

余裕があれば、大文字と小文字を変換することで、ファイルが上書きされる時 には警告を出したり、ユーザに問い合わせたりするようにしなさい。

★練習問題(2029) ファイルのn行目からm行目までの表示

引数として2つの数 n, m 、および、ファイル名を取り、そのファイルの n 行めから m 行目までを表示するシェル・スクリプトを作りなさい。 たとえば、次の例では、ファイルの 10 行目から 20 行目までを表示する。
$ show-n-m 10 20 filename [←]

余裕があれば、-n オプションを付けなさい。これは、ファイルに行番号を振 るものである。nl コマンドを使うとよい。(cat -n が使えるシステムもある。)

★練習問題(2030) カウント・ダウン

秒単位でカウント・ダウンをするようなシェル・スクリプトを作りなさい。
$ countdown 5 [←]
5
4
3
2
1
0
$ []
ヒント:sleep 1 で、1秒ごとに止める。

■課題20 検索、Emacsによる検索と置き換え、通信速度の感覚、木構造の限界、シンボリック・リンク

回答をテキスト・ファイルに記述し、(レポート提出 ページ)から提出しなさい。

(1) 検索エンジンを利用しなさい。100件以下の Web ページがヒットするよう な、キーワード(できるだけ少なく)の組み合わせを探しなさい。この時、AND演 算、OR演算、NOT演算を利用してよい。レポートには、次の情報を含めなさい。

練習問題 WWW検索エンジンの利用練習問題 WWW検索エンジンの利用、site:、フレーズ、ワイルドカード 参照

(2) 次のプログラムから2つ選び、検索機能を利用してみなさい。

次のことを報告しなさい。

練習問題 Emacs インクリメンタルな検索練習問題 Emacs 非インクリメンタルな検索練習問題 lvの検索機能練習問題 Thunderbirdの検索機能練習問題 オフィース・ツールの検索機能 参照。

(3) Emacs の query-replace の機能を 使って、次の文書の Emacs の部分を自分の学籍番号に変えなさい。

GNU Emacs is a version of Emacs, written by the author of the original
(PDP-10) Emacs, Richard Stallman.  The primary documentation of GNU
Emacs is in the GNU Emacs Manual, which you can read on line using
Info, a subsystem of Emacs.  Please look there for complete and
up-to-date documentation.  This man page is updated only when someone
volunteers to do so; the Emacs maintainers' priority goal is to
minimize the amount of time this man page takes away from other more
useful projects.  The user functionality of GNU Emacs encompasses
everything other Emacs editors do, and it is easily extensible since
its editing commands are written in Lisp.

練習問題 Emacs query-replace 参照

(4) 漢字2000文字からなる文書を考える。漢字1文字を2バイト(16ビット)で符 号化すると、何バイト(何ビット)必要か。この文書を、通信速度が10M bps (bit / s)のネットワークで転送すると、何秒かかるか。ただし、ネットワーク の通信速度でデータが転送可能であるものとする。データ圧縮は行われないも のとする。計算過程も含めて示しなさい。

(6) [加点] The Unix Super Text の次の部分を読みなさい。

次のコマンドを1つ以上使うシェル・スクリプトを、合計2つ作成し なさい。 作成したシェル・スクリプトについて、それぞれ次のことを報告しなさい。 作成するシェル・スクリプトとしては、このページにある 練習問題 練習問題(2024) から 練習問題(2030) まで から選んでもよい。

(7) [加点] 正規表現の検索機能を用いて、次のファイルやコマンドの出力から 目的のもの検索して画面に表示しなさい。選択ではなく、全て実行しなさい。 なお、grepコマンドには、or の機能がない。orが必要な場合、grep コマンド を複数回実行してもよい。egrep コマンドの「|」を用いれば 1 回で終 わることもある。

レポートには、コマンドラインと実行結果を含めなさい。実行結果が10行以上 に渡る時には、途中を省略しなさい。アクセス・ログに時分のページへのアク セスがない場合には、Web ブラウザでアクセスしてログに含ませなさい。
Last updated: 2016/07/15 13:57:49
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>