docker + Laravel + vue.js で簡単SPA〜環境構築構築〜編

お疲れ様です、阿部です。

今回は、以前自分が現場で使っていたdockerの技術を使って「簡単SPA」の環境構築をしてみたいと思います。

# 本記事を読むことで得られるメリット
– ハンズオンでモダンなWEBアプリ開発環境を構築できる
– composer、node.js等のパッケージ管理ツールのコマンド理解
– JavascriptフレームワークVue.js、PHPフレームワークLaravelのインストール方法の理解

# 本記事の主な使用ツール
– VSCode
– Docker for Desktop(Mac版)

# 参考マシンスペックやツールのバージョン
– MacOS Catalina バージョン 10.15.7 (Intel Tip)
– Docker version 20.10.12
– docker-compose version 1.29.2

  • Mac M1チップの場合は多少設定が異なるのでご注意ください。
  • Windows版は、dockerの立ち上げにWSL2(Windowns Subsystem for Linux)のインストールが必要になります。
    希望者が多ければ別途手順をまとめたいと思います。

2022/4/6追記

自分の環境がWSL2導入済みの為、手順をまとめられませんが、

以下のサイトに手順がまとめてありました。

https://qiita.com/whim0321/items/ed76b490daaec152dc69

Windowsで使う場合はこちらをご使用ください。

# docker for Desktopのダウンロード・インストールはこちら
以下のサイトにアクセスして、「Mac with Intel Tip」をダウンロードしてインストール
https://www.docker.com/products/docker-desktop/

# WSL2上にdockerをインストールする場合はこちら(2022/4/6 追記)
– Ubuntu 20.04 をアップデートする(最初からこのバージョンならこのコマンドは不要です。)
apt update
apt upgrade -y

  • 必要なパッケージをインストールする
    apt install curl -y
    apt install apt-transport-https -y

  • Docker Engine をインストールする
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

  • レポジトリをアップデートし、Docker Engine をインストール
    apt update
    apt install docker-ce docker-ce-cli containerd.io -y

  • docker-compose インストール
    apt install docker-compose -y

  • Docker デーモンを起動
    service docker start

  • インストール後、ターミナルを開いて以下のコマンドを実行
    docker -v
    docker-compose -v

  • いずれもバージョンが表示されれば問題ありません。

# GitHubよりベースソースをダウンロード
– Windowsの場合 WSL2上にログインしてGitのインストール(2022/4/6 追記)
apt update && sudo apt upgrade
apt install git && git --version

  • Macの場合 homebrew + Gitインストール(2022/4/6 追記)
    homebrewは以下のサイトを参考にインストール
    https://qiita.com/zaburo/items/29fe23c1ceb6056109fd

homebrewインストール後以下を実行
brew install git-lfs

Win&Macいずれも、
git --version

https://github.com/HiroyukiAbe-bit/Sample-DocLaraVue
【手順】
– 画面中央の「code」をクリック
– HTTPSに書かれた「https://github.com/HiroyukiAbe-bit/Sample-DocLaraVue.git」をコピー
– ターミナルを開いて、プロジェクトのダウンロードを行いたい箇所に移動して、以下のコマンドを実行

  • 特定の階層まで移動
    cd ~
    git clone https://github.com/Hiroyuki
    Abe-bit/Sample-DocLaraVue.git

  • git cloneが完了したらダウンロードされたフォルダ(ディレクトリ)をVSCodeで開きましょう。

# .env.exampleをコピーして.envファイルに変更
– 中身を以下の内容に修正
WEB_PORT=80
DB_PORT=3306

DB_NAME={ここは好きな名前でOK}
DB_USER=admin
DB_PASSWORD=admin
DB_ROOT_PASSWORD=root

# dockerイメージのビルド
docker-compose build --no-cache

  • dockerのイメージのビルドを行うと都度、dockerがイメージファイルのキャッシュを取ります。
  • —no-cache オプションをつけるとエラーが出た時になどにdockerのbuildキャッシュを
    読み込まなくなるのでエラーで動作終了することを考慮してつけた方が無難です。

# dockerのコンテナ起動
docker-compose up -d
* この時点でmysqlコンテナの作成が行われ、各コンテナが起動します。

# appコンテナに入る
docker compose exec app bash

  • docker内でインストールしているPHPのバージョン(7.4)に合わせる為、必ず起動したコンテナに入るよう注意してください。

# Laravelのインストール
composer create-project --prefer-dist "laravel/laravel=6.*" .
exit

  • ここではLaravelの安定版であるver6系をあえて入れてます。
  • 安定版はLTS(Long Term Support)といって開発元が推奨しているサポートの長いバージョンです。

# Laravel Mixファイルの削除
cd backend
rm -rf package.json webpack.mix.js

  • LaravelMixとは、Laravelの環境内にVue.jsを内包する形で構成するための機能です。
  • 今回はVueCLIと呼ばれるVue用の開発サーバも立ち上げる為、Laravel側でVueを使わない為削除しておきます。

# vueのビルドファイルの格納先を指定
cd public
mkdir templates
cd templates
touch base.html

# Laravelにルーティング設定
backend/routes/web.phpファイルを開く

以下をの内容に書き換える
Route::get('/{any}', function () {
return view('spa.app');
})->where('any', '.*');

# gitignore に以下を追記
.gitignore
/public/app
/resources/views/spa

# Windowsにnode.jsのインストール(2022/4/6追記)
– 以下のサイトがわかりやすいです、参考にされてください
https://qiita.com/echolimitless/items/83f8658cf855de04b9ce

# Vue.jsのインストール
cd ../../../frontend
npm install -g @vue/cli

# バージョン確認
vue -V

# vue のソースダウンロード
vue create .

# 色々聞かれるのでお好みで設定する

例) 自分の場合は以下のようにしました

# vue.config.js に以下の内容を追記
module.exports = {
// アセットはLaravelのpublic/appディレクトリ配下に作成される
outputDir: ‘../backend/public/app’,

// app配下にjs, cssなどが置かれるので、publicPathを調整
publicPath: ‘/app’,

pages: {
// appのエントリポイント、テンプレート、出力先を調整
app: {
entry: ‘src/main.js’,
template: ‘templates/base.html’,
filename: ../../resources/views/spa/app.blade.php,
},
},
}

# フロントエンドのbuild
npm run build

# ブラウザより以下のアドレスにアクセスするとvue.jsの画面が表示されていたら成功
http::/localhost:80

# まとめ

今回は、環境の構築まで対応しました。また不定期にはなりますが、

  • バックエンドのマイグレーションファイル作成等テーブル周りの構築
  • フロントエンドからAPIの接続等

基本的な操作方法を上げたいと思います。

わからないことがあれば阿部までご相談ください。

Salesforce習得に向けてのチュートリアル

  • Salesforceとは
  • ・SalesforceはクラウドベースのCRM・顧客管理やSFA・営業支援サービス
    ・イメージとしては、「Salesforce」という大きな半完成状態のシステムがある感じ。
     (Force.comというプラットフォーム上に、Sales Cloud、Service Cloud、Community Cloudなど様々な機能が存在する)
    ・ノンプログラミングのような形でカスタマイズすることもできるが、カスタマイズで実現できない部分は新たにコードを書いて開発する。

  • Salesforceの学習環境
  • 公式が学習サイト(Trailhead)を用意しているため、そこの「トレイル(ガイド付き学習パス)」を読み進め、理解を高める。
    TRAILHEAD

  • Trailhead(学習環境)の学習方法
  • まず、以下のトレイルを一通り行うことを推奨する。予想時間の半分ほどで終わる。
    ・システム管理者初級 
    ・システム管理者中級
    ・システム管理者上級 (※2~4番目の項目は飛ばす)
    ※検索タグ「システム管理者」「○級」ではなく、このトレイル名が存在する。
    ※各ページ末のまとめ課題は、わからなければ飛ばしてもいい。
     実技系は英語だが、<Trailhead学習上の注意点>に書いたような問題がある。

    他、推奨トレイル
    ・Trailhead を使用した Salesforce の学習 
     …学習アカウント「Trailhead Playground」の説明がある。
      システム管理者初級ではちょっとしか触れられないため、事前に見ておくといい。

    なお、上記のトレイルには、Salesforce独自のプログラミング言語(Apex、Visualforce)の説明は含まれていない。
    必要なもの、興味あるものは別のトレイルで学習すること。

  • Trailhead学習上の注意点
  • -推奨モード
    Salesforceには、従来型のClassicモード、新しいLightningモードが存在する。
    基本的には、公式が推奨している「Lightningモード」を使うと良い。

    理由:Trailheadの記述はLightningモードをベースにしているため。また、最新のモードであるため。

    実感:課題に英語記述が頻繁に出てくる。「基本オブジェクト」の英語名と和名の対応が分からなくなることが多い。
       Lightningモードでは、左上「オブジェクトマネージャ」タブで両方が表示されるので、わかりやすい。

    注意点(2つ):

    (1)「レポート作成」の手順中に「表形式(表・サマリー・マトリックス)を選ぶ」という指示があるが、Lightningモードでは表形式は自動選択されてしまうため、不可能。
    ⇒「新規レポート (Salesforce Classic)] というボタンで入ることにより、指示通りに進めることができる。
    (※アクセス権の設定によっては、Classicに入るボタンしかないことも。)

    (2)項目名(複数形)
    Trailheadの記述は、作成する項目名に「複数形」の設定の記述が頻繁にあるが、日本語環境には複数形設定はない
    そのため、一部の課題で複数形を設定していないと、オブジェクトを認識せずエラーとなってしまう。
    (例:システム管理者 中級 「戦闘基地」のシステム作成課題)
       ⇒日本での業務上は支障はないと思われるが、課題をする際は以下の設定を行う。

  • 左のクイック検索にて「組織情報」を検索し選択する。
  • 「編集」ボタンを押下する。
  • 「地域の設定」にて、「言語のデフォルト値」を日本語から英語に変え、保存する。
  • 日本語表記のまま、複数形や母音の設定が表示されるようになる。※
  • (※上記の言語設定前に作成したオブジェクトについては、設定後に「編集」内容が変わることはないので注意)

レッスン予約プラグイン OLB(Online Lesson Booking)

インストール

[プラグイン] → [新規追加] 「OLB」で検索。
[インストール] → [有効化] で ダッシュボードに OLBsystemが表示される。

事前準備

  • [設定] → [一般]
    • メンバーシップ の 「□ だれでもユーザー登録ができるようにする」にチェックを入れる。
      ここでチェックを入れると、以下の画像のように、WordPressのデフォルトのログインページに、
      登録リンクが表示され、だれでもユーザ登録が可能になる。

    • 新規ユーザのデフォルト権限購読者に設定する。

必要な固定ページの自動生成

プラグインを[有効化]すると、OLBで使用する固定ページが自動生成される。
固定ページ一覧から、確認しておく。
以下、自動生成されたページの例

  • 講師用スケジュール編集ページ
  • 講師用キャンセルフォームページ
  • 会員用マイページ
  • 会員用予約一覧ページ
  • etc …

また、自動生成された固定ページは、各権限(管理者、講師、会員)ごとに
ウィジェットにまとめられている。

[外観] → [ウィジェット] から、追加されていることを確認する。

ウィジェットに追加すると、テキストエリアに各権限毎のリンクが初期設定が記載されているので、
必要なもの、不要なものを整理して、保存する。

会員登録から、ログイン、会員専用ページに遷移するまで

上記で、会員用ウィジェットを追加しておく

ユーザ登録

通常のログイン画面へ

[登録]をクリックし、ユーザ登録をする

[登録]をクリックすると、設定したメールアドレスにパスワード変更用のリンクが記載された
メールが送信されるので、パスワードの変更をする。

ログインにすると会員専用ページに遷移する。
上記でウィジェットに「会員専用」を追加しておけば、会員でログインした場合のみ、
「会員専用」のウィジェットが表示されるようになる。

講師登録と、会員のレッスン予約まで

講師の登録

  1. 管理者ユーザでログインし、[ユーザー] → [新規追加]を選択
  2. 各必要な項目を埋めていく
    Online-Booking-System追加フィールド
    講師属性にチェックを入れる

  1. [保存]して、ユーザー一覧画面で、講師属性が設定されていれば成功

既存ユーザを講師に設定する

  1. 既存ユーザーの編集画面へ
  2. Online-Booking-System追加フィールドに講師属性がない場合は、「権限グループ」を[投稿者]に変更して、一旦保存、再度編集画面を開き、Online-Booking-System追加フィールドの講師属性にチェックを入れて、保存する。

レッスンのスケジュールを作成する

[外観] → [ウィジェット] から、ウィジェットに「講師専用」を追加しておく

  1. 上記で作成した講師でログインする
  2. ウィジェットから、「講師用スケジュール編集」をクリック
  3. 編集ページで、レッスン可能な日時をクリックして、保存する
    この時、列、行を一括で選択するときも可能

会員でレッスン予約をする

[外観] → [ウィジェット] から、ウィジェットに「会員専用」を追加しておく

  1. 会員でログインする
  2. ウィジェットから「日別スケジュール(全講師)」をクリック
  3. レッスンスケジュールを作成した日付を選択
  4. レッスン可能な時間が、青枠でOpenになっているので、クリック

  1. 予約・キャンセルフォームに遷移するが、以下の制限がかかる場合がある
    • ユーザの有効期限内ではありません
      [全般設定]で「有効期限なし」にチェックを入れていない場合は、
      有効期限チェックが入り、予約確定ができない場合がある。
    • あなたの保有チケットはありません。
      [全般設定]で「チケット制を適用する」にチェックが入っている場合、
      会員がチケットを持っていない場合にチェックが入る。
  2. 予約可能な場合は、以下のように表示される。そのままでいい場合は「予約」ボタンをクリック

  1. 予約が確定する。
  2. 予約の確認は会員メニューの「会員予約情報」から確認でき、キャンセルも可能

チケット残数を確認する(会員)

  1. チケット確認用の固定ページは、「チケット更新ログ」としてデフォルトではまだ下書き状態なので、「公開」に変更する。
    また、親ページは、「会員用マイページ」を選択する。
  2. このままではリンク元がないので、パーマリンクをコピーして、ウィジェットに「チケット更新ログ」へ遷移するためのリンクを作成する。

mac MAMP から メール送信

macには、デフォルトでメール転送エージェント(MTA)である、Postfixがインストールされているが、
MAMPにインストールしたWordPressのプラグインなどから、メールを送信する際には、少し設定が必要となる。

また、ここではsmtpにGMailを使用する

設定

/private/etc/postfix/main.cfを編集する。

sudo vi /private/etc/postfix/main.cf

ファイルを開いたら、一番下に以下を記述

# gmail setting ==================================================
myorigin = gmail.com
myhostname = smtp.gmail.com
relayhost = [smtp.gmail.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/private/etc/postfix/gmail_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
inet_protocols = all
smtp_use_tls = yes
smtp_tls_security_level = encrypt
tls_random_source = dev:/dev/urandom
# ================================================================

gmailパスワードを作成する

※ gmailパスワードをあらかじめ2段階認証にしておく必要があります。

以下から、アプリパスワードを設定する。
アプリパスワード

  • [アプリを選択] から [メール] を選択
  • [端末を選択] から [Mac] を選択

[生成] をクリックする

上記、パスワードをメモしておく。

gmailパスワードを設定する

作成したgmailのアプリパスワードを設定したファイルを作成する
作成するファイルは、/private/etc/postfix/main.cfに追記した、
smtp_sasl_password_mapsのファイル名にすること

sudo vim /private/etc/postfix/gmail_passwd

以下のように記載

[smtp.gmail.com]:587 メールアドレス@gmail.com:アプリパスワード

アプリパスワードは空白を開けずに続けて記載してOK

パスワードファイルの作成が完了したら、mapデータベースを更新する。

sudo postmap /private/etc/postfix/gmail_passwd

gmail_passwd.dbが作成されているか確認

ll /private/etc/postfix/ | grep gmail

gmail_passwd.dbが表示されればOK

メールを送信してみる

postfixの停止(すでに起動している場合のみ)、起動

# 停止
sudo postfix stop

# 起動
sudo postfix start

テストメールを送信

date | mail -s test [あなたのメールアドレス]

メールが受信できれば、成功

番外 postfixのログファイルがない場合

上記でメールが送信できない場合は、なぜ送信できないのか、探る必要があるが、
自分の環境下では、/var/log/mail.logがなかった。
そのため、コンソールにメールログを出力して確認をした。

log stream --predicate '(process == "smtpd") || (process == "smtp")' --info

上記コマンドを実行すると、ターミナルが待ち状態になり、mailコマンドを実行する度に、画面にログが吐かれる。

WP-Members 会員専用サイトを作成する

インストール

[プラグイン] → [新規追加] からインストール可能。
[インストール] → [有効化]後、[設定] → [WP-Members]が表示されるようになる。

設定

WP-Members オプション タグ

  1. [オプション設定][内容]
    posts, pagesの設定項目があるが、
    posts投稿
    pages固定ページ
    のことかと思われる。 アクセス制限をここで設定する。

内容をブロック

ここでは、投稿ページ、固定ページのデフォルト設定を決める。

ここで「ブロック」、「ブロックしない」を設定しても、各記事編集で、変更可能。

以下、各設定項目解説

機能項目 概要
内容のブロック 投稿や固定ページへのアクセスを登録したユーザーのみに限定します。ブロックされた閲覧者には、「この情報へのアクセスはメンバーに限定されています。ログインしてください。メンバー登録は下記リンクをクリックしてください。」という文章とともに、ログインフォームと新規登録フォームが表示されます。
抜粋を表示 ブロックした場合に、抜粋のみを表示します。続きを読むにはユーザー登録して下さいという形に出来る。
ログインフォームを表示 ブロックした場合に、ログインフォームの表示/非表示をコントロールします。
登録フォームを表示 ブロックした場合に、新規登録フォームの表示/非表示をコントロールします。
自動抜粋 抜粋を表示の文字数を指定します。
  1. その他は読めばわかる

フィールド

登録フォームに表示するフィールドをここで設定する。
user_emailのみは、表示が必須(当たり前だけど)
その他項目は、必要に応じて表示/非表示、必須/任意の設定が可能。
Display Labelで各項目は画面表示される。Display Labelは、編集から変更が可能。

ダイアログ

登録フォーム送信時の文言をここで指定できる。
デフォルトでは英文になっているため、必要であれば修正する。

メール

以下が実行された際に送信されるメールの内容をここで設定できる。

  • 新規ユーザ登録
  • パスワードリセット
  • ユーザ名の回復
  • 管理者への通知
  • 署名

メールタイトル、メール本文内では、ショートコードが使用可能。

カスタムメールアドレス

送信元メールアドレスをデフォルトの設定から変更したい場合はここに入力

送信者の名前

送信者名をカスタマイズする場合はここに入力

各種ページの作成

ショートコード 概要
[wpmem_form login] ログインフォームを出力。
[wpmem_form register] 新規登録フォームを出力。
[wpmem_profile] ユーザープロフィールを出力。
[wpmem_form user_edit] ユーザープロフィールの編集フォームを出力。
[wpmem_logout] ログアウトページ。
[wpmem_form password] パスワードの変更・リセット。
[wpmem_form forgot_username] ユーザー名を忘れた場合の回復するためのEメール入力フォーム。
[wpmem_logged_in]ログインユーザーのみ[/wpmem_logged_in] ショートコードで囲んだテキストがログインユーザーのみに表示されます。
[wpmem_logged_out]ログアウトユーザーのみ[/wpmem_logged_out] ショートコードで囲んだテキストがログアウトユーザーのみに表示されます。
[wpmem_field user_login] ユーザー名を表示する。
[wpmem_avatar] プロフィール画像を表示する。
[wpmem_field user_email] Eメールアドレスを表示する。
[wpmem_login_link]ログインする[/wpmem_login_link] ログインページへのリンクとショートコードで囲んだリンクテキスト。
[wpmem_reg_link]新規登録する[/wpmem_reg_link] 新規登録ページへのリンクとショートコードで囲んだリンクテキスト。

Google Map を簡単に表示できる simple mapの使い方

まず、プラグインをインストール。

インストール後は
[設定] ⇒ [Simple Map] が作成されているので、ここで、API keyを設定する。

ショートコードで記事に表示

記事、固定ページどちらでも使用可能。
ベースとなるのは以下のショートコード

[map]住所[/map]

or

[map addr="住所"]

これでマップの表示は可能。

その他プロパティについて

以下のプロパティが設定できる。

  • lat
  • lng
  • width
  • height
  • zoom
  • breakpoint

イベントカレンダーが簡単に作成できる、All-in-one Event Calendar

使い方

まずは設定

プラグインをインストールしたら、固定ページにCalendarというページが作成される。
イベントカレンダーの表示は、デフォルトではこの固定ページが使用されるようになっているが、変更する場合は、
[イベント] → [設定] のイベントの閲覧タブから、カレンダーページを変更して、更新する。

イベントの作成

  1. ダッシュボードのメニューから、[イベント] → [新しく追加] を選択
  2. イベントのタイトルを入力
  3. あとはイベントの情報を入力していき、公開すれば完了

設定した固定ページを確認すると、イベントが反映されている。

Linuxコマンド・ランキング

沢山存在するコマンドの中でもどのコマンドが頻繁に使用されているのかを調べてみました。

調べてみたところランキングにしていたサイトが2件ございましたのでご紹介いたします。

まずはこちらのサイトのランキングから一覧のページを作成したコマンドのみを抜粋してご紹介いたします。

1位 tar ファイルを書庫化・展開する(拡張子.tarなど)
8位 zip ファイルを圧縮する(拡張子.zip)
9位 chmod ファイルやディレクトリのアクセス権を変更する
13位 rpm RPMパッケージをインストール/アンインストールする
17位 yum パッケージを取得してインストール/アップデートをする
18位 wget ファイルをダウンロードする

続きましてこちらのサイトのランキングから一覧のページを作成したコマンドのみを抜粋してご紹介いたします。

1位 vi
7位 echo

両サイトより抜粋してみましたが、被ったコマンドがありませんでした。
なのでこの8つのコマンドの内、どれをよく使うのかを調べるために実際にCentOS 6でサーバーを構築した際に使用したコマンドをランキングにしてみました。また、両サイトの様に一覧を作成したコマンドのみを抜粋しております。

2位 vi
9位 rm
10位 rpm
11位 yum
13位 chmod

zip/unzip コマンド一覧

zipファイルとして圧縮

$ zip 作成するZIPファイルPATH 圧縮対象PATH ... # 圧縮時

zipファイルを解凍

$ unzip 解凍するZIPファイルPATH # 解凍時

ディレクトリを指定して再帰的に圧縮する

$ zip -r 作成するzipファイルPATH 再帰的に圧縮するフォルダ

圧縮対象となるファイル名を指定して圧縮する

$ zip 作成するZIPファイルPATH 圧縮対象PATH ... -i 圧縮対象ファイル名

cp コマンド一覧

そのままファイルをコピーする

$ cp コピー元 コピー先

ファイル名を同じ名前としてコピーする

$ cp コピー元 コピー先のディレクトリ名

複数ファイルに同時にコピーする

$ cp コピー元その1 コピー元その2 コピー先のディレクトリ名

ワイルドカードを使って一度にコピーする

$ cp file* ディレクトリ名

ディレクトリごとコピーする

$ cp -r コピー元ディレクトリ コピー先ディレクトリ

上書きになるときは要確認する

$ cp -i ファイル元 コピー後

上書き時に今日の日付を後ろにつけてバックアップファイルを作成する

$ cp -b --suffix=_$(data +%Y%m%d) コピー元 コピー先

シンボリックリンクを作成する

$ ln -s 元ファイル シンボリックリンク
$ cp -s 元ファイル シンボリックリンク

「file1」を「file2」にコピーする

ファイルの属性はなるべく保持され、シンボリックリンクはそのままコピーされる

$ cp -a file1 file2

「dir1」を「dir2」にコピーする

ディレクトリの内容もそのままコピーされる

$ cp -a dir1 dir2

コピーしたファイルの名前が表示される

$ cp -v コピー元 コピー先

強制的に上書きコピーする

$ cp -f コピー元ファイル コピー先PATH

強制的に上書きコピーする(上書きの有無を聞かれる場合)

$ \cp -f コピー元ファイル コピー先PATH

上書き時にバックアップを取得する

$ cp --backup コピー元ファイル コピー先PATH

上書き時に番号付きのバックアップを取得する

$ cp --backup=numbered コピー元ファイル コピー先PATH

権限やオーナー、グループを保持したままコピーする

$ cp -p コピー元ファイル コピー先PATH

ハードリンクを作成する

$ cp -l コピー元ファイル コピー先PATH

ディレクトリ構造を含めてコピーする

$ cp --parents コピー元ファイル コピー先PATH