« FreeBSD の操作を効率的に(tcsh:前編) | トップページ | セキュリティの小技(TCP/IP 編) »

FreeBSD の操作を効率的に(tcsh:後編)

 では、先週宣言した通り、tcsh の説明の続きを… といきたいところですが、先週は、いろいろと不親切だったような気もするので、ちょっと戻って、まずは一般的な話から(^^;

■ 代表的なシェル

 現在、広く使われている(と思われる)シェルを、簡単に紹介しておきます。

(1) sh (Bourne Shell、ボーンシェル、ビーシェル)
 シェルスクリプトの実行に役立つ、多くの機能を備えた、近代シェルの先駆け。
 現在も、シェルスクリプトの解釈・実行用として、標準的に使われています。
 「Bourne」の由来は、作者の名前から。

(2) ash (Almquist Shell、アッシュ(?)、エーシェル(?))
 Bourne Shell の代用として作られたシェル。
 Bourne Shell よりもコンパクトで、処理が早いのが特徴。
 BSD系や、Debian系の Linux では、Bourne Shell 代わりに使われています。

(3) csh (C Shell、シーシェル)
 当初、BSD向けに開発され、その後、大流行したシェル。
 優れた操作機能を持ち、現在の対話的なシェルの手本となりました。
 名前の由来は、シェルスクリプトC言語風に書けることから。

(4) ksh (Korn Shell、コーンシェル)
 Bourne Shellcsh の「いいとこ取り」をしたシェル。
 商用(使うのにお金が必要な) UNIX でよく使われていた(らしいです)。
 「Korn」の由来は、作者の名前から。

(5) bash (Bourne Again Shell、バッシュ)
 Bourne Shell に、ライバルだった csh の機能を取り込んで作られたシェル。
 現在、Linux の標準シェル。
 名前の由来は、「Bourne Shell よ、再び(Again)!」…だそうです(^^)

(6) tcsh (TENEX Shell、テーシーシェル)
 csh をもとに、使い勝手を向上させたシェル。
 機能的には、tcshbash は、ほぼ互角です。

(7) zsh (ゼットシェル)
 ksh を基本に、bashtcsh の機能を取り込んだ、高機能シェル。
 個人的には、bash の方に似ている、と思うのですが…


 このうち、対話的シェルとして、現在人気があるのは、bashtcshzsh でしょうか。

 私は、対話的なシェルに tcsh、シェルスクリプトには ash (FreeBSD の /bin/sh) を使っています。


■ tcsh の機能(追加)

 前回、大切な機能が抜けていたので、追加します(^^;

● コマンド置換

 「`」(バッククォート。 日本語106キーボードでは、[Shift] を押しながら [@] を押すことで入力できます)で囲まれたコマンドを実行し、その出力結果で置き換えます。

 `cmdcmd を実行し、その出力
結果と置き換える

 例えば、次のように、あるコマンドを実行する際に、別のコマンドの実行結果が必要な場合があります。
 《 sshd のありかを調べる 》
$ which sshd[Enter]
/usr/sbin/ssh
 《 sshd で使用するライブラリを表示 》
$ ldd /usr/sbin/ssh[Enter]
/usr/sbin/sshd:
        libssh.so.4 => /usr/lib/libssh.so.4 (0x280b0000)
 ~~~

 《 syslogd のプロセスIDを調べる 》
# cat /var/run/syslog.pid[Enter]
434
 《 syslogd に設定ファイルを再読み込みさせる 》
# kill -HUP 434[Enter]
#  
 どちらの例もパイプは使えませんが、コマンド置換を使えば、1行で用件を済ませることができます。
 《 sshd で使用するライブラリを表示 》
$ ldd `which /usr/sbin/ssh`[Enter]
/usr/sbin/sshd:
        libssh.so.4 => /usr/lib/libssh.so.4 (0x280b0000)
 ~~~

 《 syslogd に設定ファイルを再読み込みさせる 》
# kill -HUP `cat /var/run/syslog.pid`[Enter]
#  
(「`」の中でも、補完機能が使えますよ~(^^)。)

● コマンドの連続実行

 これは、なんとなく裏ワザっぽい気がするのですが、一応、tcsh の正式な機能らしいので…

 cmd1 ; cmd2 cmd1cmd2 を連続実行
 cmd1 && cmd2 cmd1成功したら、
cmd2 を実行
 cmd1 || cmd2 cmd1失敗したら、
cmd2 を実行

 「成功」とか「失敗」という言葉が出てきましたが、UNIX 上で動くコマンドは、実行中に何かエラーが起きれば「失敗」、そうでなければ「成功」という結果を返すことになっています。


■ tcsh の設定

 tcsh は、とても多機能なことと、私が FreeBSD 上での作業をあまりやらないため(^^;、ここでは、簡単にさわりだけを紹介します。

 tcsh について、もっと知りたい、という方は、マニュアルページを読んでみて下さい。

 ◆ FreeBSD 日本語マニュアル検索: http://www.jp.freebsd.org/man-jp/search.html

 (「日本語マニュアル RELEASE :」の選択欄で、「7.2-RELEASE-K」を選ぶのを忘れずに)


tcsh の設定ファイルたち

 tcsh には、たくさんの設定ファイルがあります。
 主なものとしては…

 (1) /etc/csh.cshrc
 (2) /etc/csh.login
 (3) ~/.tcshrc (なければ ~/.cshrc)
 (4) ~/.login
 (5) /etc/csh.logout
 (6) ~/.logout

 …があります。

 ただし、設定ファイルごとに、読み込まれる条件と順番が決まっていて、

 ○ ログイン時
  /etc/csh.cshrc
  /etc/csh.login
  ~/.tcshrc (なければ ~/.cshrc)
  ~/.login

 ○ シェル起動時(ログイン時以外
  /etc/csh.cshrc
  ~/.tcshrc (なければ ~/.cshrc)

 ○ ログアウト時
  /etc/csh.logout
  ~/.logout

 …というルールになっています。

 /etc ディレクトリに置かれている設定ファイルは、FreeBSD 全体に関係する設定ファイルなので、通常は変更せず、カスタマイズする場合はユーザのホームディレクトリにある設定ファイルを変更します。

 普通は、~/.tcshrc をカスタマイズすれば十分なので、このファイルについて説明します。


■ .tcshrc の設定

 FreeBSD では、すでに ~/.cshrc が準備されているので、これを ~/.tcshrc という名前でコピーして、それを編集するのが一番楽でしょう。
 《 ホームディレクトリに移動 》
$ cd[Enter]
 《 ファイルの一覧を表示 》
$ ll[Enter]
total 16
-rw-r--r--  1 violet  violet  758 Sep  1 15:55 .cshrc
-rw-r--r--  1 violet  violet  258 Sep  1 15:55 .login
-rw-r--r--  1 violet  violet  167 Sep  1 15:55 .login_conf
-rw-------  1 violet  violet  379 Sep  1 15:55 .mail_aliases
-rw-r--r--  1 violet  violet  339 Sep  1 15:55 .mailrc
-rw-r--r--  1 violet  violet  773 Sep  1 15:55 .profile
-rw-------  1 violet  violet  284 Sep  1 15:55 .rhosts
-rw-r--r--  1 violet  violet  980 Sep  1 15:55 .shrc
 《 .cshrc を .tcshrc の名前でコピー 》
$ cp .cshrc .tcshrc[Enter]
 《 ファイルの一覧を表示 》
$ ll[Enter]
total 18
-rw-r--r--  1 violet  violet  758 Sep  1 20:00 .cshrc
-rw-r--r--  1 violet  violet  258 Sep  1 20:00 .login
-rw-r--r--  1 violet  violet  167 Sep  1 20:00 .login_conf
-rw-------  1 violet  violet  379 Sep  1 20:00 .mail_aliases
-rw-r--r--  1 violet  violet  339 Sep  1 20:00 .mailrc
-rw-r--r--  1 violet  violet  773 Sep  1 20:00 .profile
-rw-------  1 violet  violet  284 Sep  1 20:00 .rhosts
-rw-r--r--  1 violet  violet  980 Sep  1 20:00 .shrc
-rw-r--r--  1 violet  violet  758 Sep  9 20:09 .tcshrc ← これ
 《 .tcshrc を編集 》
$ vi .tcshrc[Enter]

 以下は、私が一般ユーザのときに使っている~/.tcshrc です。
 (ライトユーザなので、大した設定は、していませんが…(^^;;;

 赤字が、もとのファイルから変更した部分です。
# $FreeBSD: src/share/skel/dot.cshrc,v 1.14.8.1 2009/04/15 03:14:26 kensmith Exp $
#
# .cshrc - csh resource script, read at beginning of execution by each shell
#
# see also csh(1), environ(7).
#

alias h         history 25
alias j         jobs -l
alias la        ls -a
alias lf        ls -FA
alias ll        ls -lA

alias ls        ls-F
alias vim       jvim3
alias less      jless -e -c -~ --

# A righteous umask
umask 22

set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin $HOME/bin)

#setenv EDITOR  vi
setenv  EDITOR  jvim3
#setenv PAGER   more
setenv  PAGER   "jless -e -c -~ --"
setenv  BLOCKSIZE       K

#setenv LANG    C
setenv  LC_CTYPE        ja_JP.eucJP

if ($?prompt) then
        # An interactive shell -- set some stuff up
        set filec
        set history = 100
        set savehist = 100
        set mail = (/var/mail/$USER)
        if ( $?tcsh ) then
                bindkey "^W" backward-delete-word
                bindkey -k up history-search-backward
                bindkey -k down history-search-forward
                set zltn = `set | grep tty | cut -f 2 | cut -c 4-5`
                set prompt = "[%{^[[34m%}%m($zltn):%{^[[35m%}%n%{^[[0m%}]%/%# "
                unset zltn
                set histdup = erase
                set nobeep
        endif
endif
 ちなみに、root~/.tcshrc では、

29行目:#setenv LANG   C
  → setenv  LANG   C
43行目:set prompt = "[%{^[[34m%}%m($zltn):%{^[[35m%}%n%{^[[0m%}]%/%# "
  → set prompt = "[%{^[[34m%}%m($zltn):%{^[[0m%}/]%/%# "
45行目:set histdup = erase
  → #set histdup = erase

 の部分が違っています。


.tcshrc の解説

08行目~16行目:
 □ エイリアス(コマンドの別名)の設定です。

 エイリアスとは、(a) 長いコマンド名の入力を短縮する ためとか、(b) FreeBSD 本来のコマンドを、もっと便利なほかのコマンドに置き換えるため、といった目的で使われる機能です。

 なお、15行目と16行目は、実際に jvim3jless というプログラムがインストールされてないと、無意味です(^^;

14行目:alias ls   ls-F
 本来の ls (/bin/ls) の代わりに、tcsh組込みコマンド ls-F を実行します。

 ls-F を使うことにより、ディレクトリやシンボリックリンク、実行可能ファイルなどの区別が付けやすくなります

15行目:alias vim   jvim3
 jvim3 を、vim という短縮名で実行できるようにします

16行目:alias less   jless -e -c -~ --
 FreeBSD 本来の less (/usr/bin/less) の代わりに、jless を指定されたオプション付きで実行します。

 FreeBSD 本来の less を使いたい場合には、「/usr/bin/less」とフルパスで指定するか、頭に「\」を付けて「\less」 と実行すれば、本来の less を実行できます


 その他、便利そうなエイリアスの例として、

 ○ Windows でいう「ゴミ箱」機能らしきものを実現する:
  alias del   'mv \!* ~/.trush'

 などがあります。ただし、

 ○ alias rm   'mv \!* ~/.trush'
  や
 ○ alias rm   rm -i

 といった、削除コマンド「rm」をエイリアスに使う設定は、個人的にはお勧めしません


19行目:umask 22
 ファイルマスクの設定。

 細かい説明は省きますが(^^;;、要は umask を 22(8進数表記)に設定することで、新規に作成するファイルについては、自分以外の人は書き込みができないようにすることができます

21行目:set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin $HOME/bin)
 実行ファイル検索パス、通称パスの設定。

 これらのディレクトリ内にある実行ファイルの名前は、メモリ上に記憶され、パス指定なし(ファイル名を指定するだけ)で実行できるようになります。

 また、最後の「$HOME/bin」という おまじない(^^;の効果で、自分のホームディレクトリに bin ディレクトリを作り、その中に自作のプログラムを入れておけば、FreeBSD の標準コマンドと同じ感覚で使うことができます。
(ただし、~/bin に新しくプログラムを追加したら、rehash を実行することを忘れずに)


23行目~30行目:
 □ 環境変数の設定。

 あとから出てくるシェル変数とは異なり、ほかのプログラムから参照することができるので、tcsh などのシェルにより呼び出され、実行されるプログラムの振る舞いを決める(変える)ために使われます。

 なお、慣例として、環境変数の名前は大文字、シェル変数の名前は小文字とすることが多いです。

23行目:#setenv EDITOR  vi
24行目:setenv  EDITOR  jvim3

 標準で使うエディタを、FreeBSD 標準の vi から jvim3 に変更しています。
(何度も言いますが、jvim3 が実際にインストールされていないと、この設定も無意味ですよ~(^^;

25行目:#setenv PAGER   more
26行目:setenv  PAGER   "jless -e -c -~ --"

 標準で使うページャを、FreeBSD 標準の more から jless に変更しています。
(何度も言いますが、jless が実際にインストールされていないと…(以下、略))

 環境変数 EDITORPAGER は、いろいろなプログラムやスクリプトで利用されている環境変数なので、正しく設定しておきましよう。

27行目:setenv BLOCKSIZE   K
 ディスク情報を表示するプログラムが、ディスク容量を表示する際に使う「単位」を指定。

 「K」は kbyte 単位で表示させるため指定ですが、考えようによっては「M」(Mbyte) 単位で表示してくれたほうが見やすいかも。

29行目:#setenv LANG   C
30行目:setenv  LC_CTYPE   ja_JP.eucJP
 使用する言語の指定。

 環境変数 LC_TYPE の「値」を ja_JP.eucJP に設定することで、日本語 EUC を使うことを宣言しています

 もちろん、ターミナルエミュレータ側(Tera Term など)も EUC を使うよう、設定を合わせておく必要があります。

 なお、root の場合には、上記に追加して、環境変数 LANGC に設定することで、日本語 EUC を扱えるようにしながら、プログラム自体は、できるだけ標準(英語の設定)で動くようにしています


32行目~48行目:
 □ シェル変数 prompt が設定されているとき = (tcsh が)対話的シェルとして実行されたときに、有効になる部分です。

34行目~37行目:
 シェル変数の設定。

 シェル変数は、シェルだけにしか見えない(参照できない)ので、シェル自身(この場合は tcsh)の動作を決める(変える)のに使われます。

 ちなみに、ビーシェルBourne Shell)系では、シェル変数に「値」を設定する際、「=」の左右に「空白」があってはダメですが、csh系では「空白」があっても OK なので、一応、両者の違いとして覚えておくとよいと思います(^^)

34行目:set filec
 ファイル名とディレクトリ名の補完機能を有効にします

35行目:set history = 100
 コマンドライン履歴を、最大 100個まで、メモリ上に記憶します

36行目:set savehist = 100
 tcsh の終了時に、~/.history ファイルに、最大100個の履歴を保存します

37行目:set mail = (/var/mail/$USER)
 メールが届くディレクトリを指定すると、tcsh がメールが届いたことを教えてくれるはず… ですが、私のところでは、メール配送デーモンを動かしていない(※)ので、この設定は、無用の長物と化してます(^^;;;
/etc/rc.conf で、sendmail_enable="NONE" に設定してます


38行目~48行目:
 □ シェル変数 tcsh が設定されているとき = この設定ファイルが tcsh に読み込まれた場合のみ、有効になる部分。

 逆に言うと、この部分は csh では無視されるので、これをうまく使えば、cshtcsh で1つの設定ファイル(~/.cshrc)を共用するような使い方もできます。

39行目~41行目:
 tcsh の機能をキーに割り付ける指定

39行目:bindkey "^W" backward-delete-word
 [Ctrl][W] に、「1語削除」機能を割り付けます

40行目:bindkey -k up history-search-backward
 [↑] に、「入力された文字で始まる履歴を、新しいものから順に呼び出す」機能を割り付けます。

 …前回、[↑] は、単に履歴を古い方へさかのぼるだけです、と言ったのは嘘でしたm(_`_)m

41行目:bindkey -k down history-search-forward
 [↓] に、「入力された文字で始まる履歴を、新しい方へ戻る」機能を割り付けます


42行目~44行目:
 プロンプトの設定

42行目:set zltn = `set | grep tty | cut -f 2 | cut -c 4-5`
 前準備として、シェル変数 zltn に、ログインしている端末名の後ろ2文字(4文字目と5文字目)を代入します。
 …さっそく、コマンド置換が活躍してますね(^^)

 もう少し説明しておくと、端末名は、シェル変数 tty に「値」として自動的に設定され、ログインする端末に応じて、
コンソールの場合: ttyv0, ttyv1, ttyv2, ...
・ネットワーク経由の場合: ttyp0, ttyp1, ttyp2, ...
 となるので、結局、zltn には「v0, v1, v2, ...」または「p0, p1, p2, ...」のうちの、どれか1つが設定されます。

43行目:set prompt = "[%{^[[34m%}%m($zltn):%{^[[35m%}%n%{^[[0m%}]%/%# "
 ここでプロンプトを設定しています。
 …ごちゃごちゃして分かりづらいので、エスケープシーケンスの部分に、蛍光マーカを引いておきました(^^;

 簡単に意味を説明すると、

  %{   エスケープシーケンスの始まり
  %}   エスケープシーケンスの終わり
  %m   ホスト名(のうち、最初の「.」の前まで) ⇒ thyme に置き換え
  %n   ユーザ名 ⇒ violet に置換え
  %/   カレントディレクトリのパス名を表示
  %#   プロンプト文字(一般ユーザは「>」、ルートは「#」)に置換え
  $zltn   シェル変数 zltn の「値」に置き換え

 となるので、これを設定したあとのプロンプトは、次のようになります。
[thyme(p0):violet]/home/violet>  

 ちなみに、エスケープシーケンスを調べるには、次のようなファイルを esc.pl の名前で作成し、
#! /usr/bin/perl

  foreach $i (30..37, 40..47, 5, 4, 1, 0) {
    print "\x1b[${i}m ^[[${i}m \x1b[0m\n";
  }

 《 perl に esc.pl を読み込ませて実行 》
$ perl esc.pl[Enter]
 あるいは、
 《 esc.pl を実行可能に設定した後、実行 》
$ chmod 755 esc.pl ; ./esc.pl[Enter]
 とすれば、カラフルなエスケープシーケンス画面に表示されます

 UNIX において、プロンプトは、個性を主張するのに最適な手段なので、tcsh のマニュアルを読んで、ぜひお気に入りのプロンプトを作ってみてください(^^)

44行目:unset zltn
 prompt を設定した後は、シェル変数 zltn は不要なので、(zltn に設定された「値」を消すのではなく)シェル変数 zltn ごと消去します


45行目、46行目:
 □ tcsh の動作を制御するシェル変数の設定

45行目:set histdup = erase
 履歴中にあるものと全く同じコマンドが再入力されたとき、最新の履歴だけを残し、古いものを削除erase)します。
 これにより、重複のない、たくさんの種類の履歴を残すことができます。

 なお、root の場合、全ての履歴を残すことに意義があるので、この設定はコメントアウトしています

46行目:set nobeep
 ビープ音を一切鳴らしません


 また、これ以外に設定しておいた方がよいかもしれない、tcsh 用のシェル変数を紹介しておきます。

 ○ set ignoreeof
 [Ctrl][D] は、ディレクトリ名/ファイル名の補完候補を表示する際に使うキー操作ですが、何も文字が入力されていないときに [Ctrl][D] を押すと、シェルが終了し、自動的にログアウトしてしまいます
 set ignoreeof は、何も文字を入力していない時に [Ctrl][D] を押しても、ログアウトしないようにする設定です

 ○ set noclobber
 リダイレクトによるファイルの上書きを禁止します
 本当に上書きしたいときには、「!」を使って、「cmd >! file」などとします。

 ○ set correct = all
 コマンドラインの間違いを直してくれます。
 …個人的には、うるさく感じるので、使ってませんが(^^;

.tcshrc の設定を tcsh に反映させる

 ~/.tcshrc を変更したら、ホームディレクトリで
 《 指定されたファイルを読み込んで、解釈・実行する 》
$ source .tcshrc[Enter]
$  
 とすれば、~/.tcshrc の設定内容が tcsh に反映されます。

(注:環境変数あるいはシェル変数を「設定しない」ことにした場合には、「unsetenv」あるいは「unset」により、環境変数あるいはシェル変数を手動で消してあげる必要があります)


.login.logout の設定

 ~/.login~/.logout には、それぞれログイン時とログアウト時に実行したいコマンドを書きます。

 FreeBSD の場合、~/.login には、「今日のひとこと」を表示するプログラムを実行するよう、設定されています。
(FreeBSD のインストール時に、game をインストールしていないと、実行されないようになってますが…)

 一方の ~/.logout は、ファイル自体が準備されていませんが、例えば
clear
 という内容の ~/.logout を作成すれば、コンソールからログアウトすると同時に、それまで作業していた画面が消去されるので、セキュリティ的によいかもしれません(^^)

|

« FreeBSD の操作を効率的に(tcsh:前編) | トップページ | セキュリティの小技(TCP/IP 編) »

コメント

Article writing is also a excitement, if you be acquainted with thhen you can wdite otherwise it is difficult to write.

投稿: www.designerhandbagsplaza.com | 2013/10/10 08:20

Awesome! Its truly remarkable post, I have got much clear idea regarding from this paragraph.

投稿: nexopia.com | 2013/10/12 10:40

Unquestionably believe that which you said. Your favorite reason appeared to be on the web the simplest thing to be aware of. I say to you, I definitely get annoyed while people think about worries that they plainly don't know about. You managed to hit the nail upon the top and defined out the whole thing without having side effect , people could take a signal. Will likely be back to get more. Thanks

投稿: home appliances | 2013/10/25 13:07

Have you ever considered about adding a little bit more than just your articles? I mean, what you say is fundamental and everything. But think about if you added some great images or video clips to give your posts more, "pop"! Your content is excellent but with images and videos, this website could certainly be one of the most beneficial in its niche. Superb blog!

投稿: Magdalena | 2013/11/05 01:00

Greetings from Florida! I'm bored to death at work so I decided to browse your site on my iphone during lunch break. I really like the knowledge you provide here and can't wait to take a look when I get home. I'm shocked at how fast your blog loaded on my cell phone .. I'm not even using WIFI, just 3G .. Anyhow, good site!

投稿: carpet cleaner reviews | 2013/11/12 10:57

Youre so cool! I dont suppose Ive learn anything like this before. So nice to seek out any person with some authentic thoughts on this subject. realy thank you for beginning this up. this web site is something that's needed on the net, somebody with a bit originality. useful job for bringing one thing new to the internet!

投稿: industrial | 2013/11/14 06:01

Hey there are using Wordpress for your blog platform? I'm new to the blog world but I'm trying to get started and create my own. Do you require any html coding knowledge to make your own blog? Any help would be greatly appreciated!

投稿: outdoor heater natural gas | 2013/11/16 02:55

wonderful submit, very informative. I wonder why the other experts of this sector do not realize this. You should continue your writing. I'm sure, you've a huge readers' base already!

投稿: outdoor heaters electric | 2013/11/27 05:26

As a customer I purchased the 2nd Generation i - Pad after doing my research finding the right deals at the right time spent close to a thousand dollars on insurance,smart covers you name it I pimped my i - Pad to personalize it to my style. Note though, that absolutely free games do not exist. Devices is getting some good number of sales and also having some good amount of apps and games getting developed for it.

投稿: android Pet rescue Saga | 2013/12/02 03:57

Thanks for any other wonderful article. The place else may just anyone get that type of info in such an ideal means of writing? I have a presentation nedxt week, and I'm at the look for such info.

投稿: http://www.Ceilingfansgiant.com/ | 2013/12/04 12:47

Have you ever thought about publishing an e-book or guest authoring on other websites? I have a blog based on the same subjects you discuss and would love to have you share some stories/information. I know my subscribers would value your work. If you are even remotely interested, feel free to send me an e-mail.

投稿: help | 2013/12/07 02:13

Order Aripiprazole, abilify aripiprazole 15 mg abilify costs (wlr-mould.com), purchase abilify aripiprazole 20 mg, aripiprazole canada cost of abilify, generic abilify canada order abilify, aripiprazole drug abilify buy (http://cylog.Cyloghomes.net/hiro8409/Posts/view/2518)!

投稿: abilify aripiprazole 15 mg | 2013/12/08 07:42

I was curious if you ever considered changing the page layout of your website? Its very well written; I love what youve got to say. But maybe you could a little more in the way of content so people could connect with it better. Youve got an awful lot of text for only having 1 or two images. Maybe you could space it out better?

投稿: Rayford | 2013/12/19 05:33

It is really a great and useful piece of information. I am glad that you shared this helpful information with us. Please keep us up to date like this. Thanks for sharing.

投稿: Julissa | 2014/01/03 11:50

Apcalis-Sx 20mg Oral Jelly, uk apcalis sx cheap apcalis sx (taynibbtinghof1970.miiduu.com), apcalis sx 20 57127, purchase apcalis sx get apcalis sx (http://tumbweanawor1976.soup.io/), discount apcalis sx cheap apcalis sx (http://levschronfavic1972.miiduu.com/apcalis-sx-oral-jelly), discount apcalis sx apcalis-sx20, apcalis-sx20 apcalis-sx20.

投稿: buy apcalis sx | 2014/01/04 12:08

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/33909/46176702

この記事へのトラックバック一覧です: FreeBSD の操作を効率的に(tcsh:後編):

» 最近見ているDVD [ゲーマーの就職]
DVDを見ていると正社員の求人なども見つけるのは疎くなっていってしまいます。最近ALIASというdvdを [続きを読む]

受信: 2009/10/02 21:08

« FreeBSD の操作を効率的に(tcsh:前編) | トップページ | セキュリティの小技(TCP/IP 編) »