まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

Linux のコマンドラインで cp といえば「ファイルコピー」コマンドです。

# cp a.txt b.txt

とやれば「a.txt というファイルを b.txt という名前でコピー」です。簡単ですよね。

この cp コマンドには便利なオプションが数多くあります。例えば、
# cp -r /home/a /tmp

で /home/a というディレクトリをまるごと /tmp に(/tmp/a というディレクトリを作って)コピーする、という命令になる、とかです。

この cp コマンドは賢いので、コピー先に同じ名前のファイルがあると、新しいファイルで上書きするかどうかを確認してくれます:
# cp a.txt b.txt
cp: `b.txt' を上書きしてもよろしいですか(yes/no)?


ここで y(es) を押すと上書きコピー、n(o) を押すと上書きしません。

さて、 ディレクトリまるごとコピーした後に、コピー元のディレクトリの一部に変更が加わったとします。ファイルそのものが更新されたとか、新しいファイルが追加されたとか。 で、その変更をコピー先にも反映させようとして、もう一度ディレクトリまるごとコピーを試みるとこんな感じになります:
# cp -r /home/a /tmp
cp: `a.txt' を上書きしてもよろしいですか(yes/no)? y
cp: `b.txt' を上書きしてもよろしいですか(yes/no)? n
cp: `c.txt' を上書きしてもよろしいですか(yes/no)? y
  :

新しく追加されたファイルは無条件にコピーされるのですが、それ以外の(既に存在する)ファイルは上書き扱いになるので、1つ1つ確認メッセージが表示されます。で、上記例では最初の a.txt は上書きする、次の b.txt は上書きしない、次の c.txt は上書きする、・・・といちいちコマンドを入力してコピーするかどうかを指示しています。

現実的には変更の加わったファイルは上書きしてほしいし、変更されていないファイルについても(処理としては無駄になりますが)上書きしても結果的にファイル内容は変わらないので、「全て無条件に上書きしても構わない」というケースも少なくないと思います。でもその場合でも y とリターンキーを連打することになって、ちょっと面倒です。


もちろんそんなことは想定済みで、cp コマンドには「コピー先に同名のファイルがあった場合に強制上書きする」というオプション -f があります。
# cp --help
:
:
-f, --force if an existing destination file cannot be opened, remove it and try again.
でも実際にやってみるとうまくいかないケースが多いです。
# cp -f a.txt b.txt
cp: `b.txt' を上書きしてもよろしいですか(yes/no)?
これはシステムの設定で cp にエイリアスが指定されていることが原因として考えられます。僕の CentOS 環境では特に何もエイリアスを指定したつもりがなくてもこのようなエイリアスが(デフォルトで)設定されているようでした。
# alias
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
  :

cp は知らないうちに 'cp -i' という命令になっていました。この -i オプションは強制インタラクティブの指定で、いわば -f の逆の動作(常に上書きを確認する)を指定するオプションです。
# cp --help
:
:
-i, --interactive prompt before overwrite (overrides a previous -n option)

なので、このエイリアスを無効にすれば -f オプションが有効になるのですが、デフォルトの設定を変えてしまうのはそれはそれで怖い。。

というわけで、普段は -f を付ける時だけ cp コマンドの頭に \(¥あるいはバックスラッシュ) を付けて実行するようにしています。コマンドの頭に \ を付けると、その時だけエイリアスが無効になります
# \cp -f a.txt b.txt
# (上書きコピー完了)

もちろん -r オプションなどとも一緒に使えるので、これでディレクトリまるごと上書きコピーすることもできるようになります。











 

システムプログラマーとして株式会社クーシーに入社後、半年が経ちました。

まだ毎日が勉強で、知らないことも驚くことも多いし、偉そうに感想を言えるような立場ではないのですが、特に大きく印象に残っている発見はこれです:
「今どきのウェブって、これだけの人がこれだけの作業をしてできているのか」

例えば企業のウェブサイト。中小企業だったりするとサイトの規模そのものは必ずしも大きいわけではないのです。極端な例ですが、1ページだけを作る場合で考えます。

これまでの自分がそのページを作ろうとすると、どちらかというと「やりたいことは技術的に実現できるかどうか」を中心に考えていました。今も自分の担当箇所でいえば技術的にできるかどうか、どのくらいでできそうか、ということが検討内容になりますが、それをどう見せるか、についてはあまり重視していませんでした。まあ「jQuery Mobileとか、Bootstrap とか、適当なフレームワークを適当にカスタマイズして使おう。画像は誰か描いて(苦笑)」程度に考えていた、というレベルです。ぶっちゃけ CSS とか基礎はわかっているつもりだけど自分ではサンプルを作る程度でそれ以上にいじることはほとんどない感じ。悪く言えば見た目は軽視してました。

今の会社では UI や UX を専門に担当するチームがあります。PC 用なのか、スマホ用なのか、レスポンシブデザインにするのかを考慮した上で、画像やグラフなどはピクセルレベルで調整して、必要であれば画像のデザインも行った上で HTML をデザインし、CSS を用意してくれます。僕らはその HTML をテンプレートにして組み込んだり、 CSS はロードして指定するだけ。これにバックエンド処理を加えたり、動的な JavaScript を加えたりしてページを作ります。良くも悪くも分業制を敷いて、それぞれのプロが担当する形です。クーシーの強みは(どちらかを外注するとかではなく)その両方のプロが所属しているところだと思います。

これまでの自分の感覚と比べると、軽視していた半分の作業を専門チームがやってくれている、という感じです。作業は細かいし、さすが質も高いし、そして自分は楽です(その代わり作業人月は増えるけど)。自分があまり注力していなかった分野のプロと接する機会がある、というだけでもすごくいい刺激が得られるし、技術を盗む相手という意味でも頼もしい。そして何よりも自分が担当したサイトやサービスがすごく良さげに見える(笑)。

と、そんな当たり前のことが新鮮な状態から自分にとっても当たり前のように感じつつある今日この頃です。


 

CentOS のローカル環境内に yum のリポジトリを作成する手順を紹介します。


RHEL(RedHat Enterprise Linux) や CentOS を使っている人には「何を今さら」な情報だと思いますが、アプリケーションやモジュールのインストールには rpm や yum を利用することが多いと思います。

特に yum を利用することで、目的のモジュールを導入するために必要となる前提ライブラリが既にインストールされているかどうかをチェックし、更にその前提ライブラリの前提となるライブラリのインストール状況も調べて・・・で、現在の環境に足りないライブラリやモジュールを順次インストールした上で最終的には目的のモジュールまでインストールしてくれます。非常に便利なツールです。

ただ RHEL にせよ CentOS にせよ、その利用の条件として「yum リポジトリ」と呼ばれる一連のファイル環境を用意する必要があります。DVD などからの新規導入時にはその DVD メディアの中に yum リポジトリが含まれていてそのリポジトリを使ってインストールが行われたり、インターネットアクセス環境が整っている場合はインターネット上の yum リポジトリを参照することでインストールを行うことができます。なので、通常はリポジトリの存在をいちいち意識することなく yum を利用することが大半だと思います。

ところが、インターネット接続のない特殊な環境下の場合、最初の導入時こそ DVD 内のメディアリポジトリを利用して指定したアプリケーションやモジュールを導入することになるので何も変わりませんが、その DVD を取り出して再起動した後からは yum リポジトリにアクセスできなくなってしまうため、後から足りないモジュールを追加インストールする際に苦労します。もちろんそこで改めて DVD メディアをマウントすればそのメディアリポジトリを使うことはできますが、わざわざ DVD メディアを再度用意する必要があります。またその場合でもインストールできるのは DVD 内に含まれている(最新版とは限らない)モジュールだけであって、最新モジュールを yum でインストールするには最新モジュールの含まれたリポジトリの DVD メディアを用意する必要があります。要は色々面倒なわけです。

そこでインターネット接続がない場合でも、メディアを意識せずに yum を使えるようにするためにローカル環境のディスクシステム内に yum リポジトリを作る方法を紹介します。この環境を作っておけばとりあえずそのリポジトリに含まれているモジュールについては yum で(依存関係ごと)導入できるようになるし、モジュールのバージョンアップをしたい場合は必要なモジュールをローカルファイルシステム上にコピーした上で再度リポジトリを作成し直せばいい、ということになります。バージョン管理の面倒さこそありますが、ディスク上にリポジトリを作っておくことで DVD メディアやネット経由のリポジトリよりは高速なアクセスが期待できる、というメリットもあります。


では以下にその手順を紹介します:

まずはリポジトリの元になる DVD のインストールメディア(RedHat や CentOS など)を用意します。このメディアが /mnt にマウントされていて、アクセスできる状態(/mnt/Packages/ というフォルダが存在している状態)になっているものと仮定します。

次にリポジトリを作成するディレクトリを用意します。ここでは /usr/tmp/repo/ というフォルダ以下にローカルリポジトリを作成することにします。

というわけで、まずは /usr/tmp/repo を作成しておきます:
# mkdir /usr/tmp/repo/


このディレクトリ内に centos/ サブディレクトリを作ります(これがリポジトリの名称になります):
# mkdir /usr/tmp/repo/centos


更にこのディレクトリ内を DVD と同じ状態にするべく、Packages/ サブディレクトリを作ります:
# mkdir /usr/tmp/repo/centos/Packages


DVD 内のリポジトリに含まれる一連の rpm ファイルを全て用意したディレクトリ以下へコピーします:
# cp /mnt/Packages/*.rpm /usr/tmp/repo/centos/Packages


ここから /usr/tmp/repo をローカルリポジトリにするための設定を行います。まずは rpm を使ってローカルリポジトリ作成に必要なツールだけを単独で3つ導入します:
# cd /usr/tmp/repo/centos/Packages
# rpm -ivh deltarpm-3.5-0.5.2009093git.el6.x86_64.rpm
# rpm -ivh python-deltarpm-3.5-0.5.20090913git.el6.x86_64.rpm
# rpm -ivh createrepo-0.9.8-4.el6.noarch.rpm
(バージョンの数値は用意したメディアによって異なっている可能性があります。適宜読み変えてください)


導入した createrepo を使って、/usr/tmp/repo 以下にローカルレポジトリを作成します:
# cd /usr/tmp/repo
# createrepo .


yum がこのローカルレポジトリを利用できるよう、以下のファイルを新規に作成・編集します:
# vi /etc/yum.repos.d/centos.repo

(以下、/etc/yum.repos.d/centos.repo の内容)
[centos]
gpgcheck=0
name=My Repo
baseurl=file:///usr/tmp/repo


yum リポジトリを更新します:
# yum clean all
# yum list


これでローカルファイルシステム内に centos という名称の yum リポジトリが作成できました。インターネットに繋がっていなくても、インストール DVD メディアがなくても yum を使ったモジュールのインストールが可能になります。


なお、モジュールを新しいものに更新したい場合や、このローカルリポジトリに別の .rpm ファイルを含めたい場合はそれらを /usr/tmp/centos/Packages/ 以下にコピーして、再度 yum リポジトリを更新(上述)すれば新しい内容の yum リポジトリになります。






 

このページのトップヘ