20190507のLinuxに関する記事は9件です。

LPICの受験対策・確認事項など

LPICとは

Linuxの管理者・運用者のための資格試験です。
LPICは日本語で提供されていますが、世界中で通じる唯一の資格です。
レベル1から3まであり、レベル3が最難関の試験です。
その他に入門者向けのLinux Essentialsと、少し毛色が違う開発系のためのDevOpsもありますが、このページではレベル1から3までの試験を中心に扱います。

レベル1試験はLinuxの仕組みや基本的な操作方法を中心に出題され、Linux経験1年未満くらいの方が対象です。個人的には半年以内の方でも十分に合格できると思います。レベル1試験は101試験と102試験の2つに分かれており、2つ合格して資格が認定されます。

レベル2試験はLinuxの高度な扱い方やLinux上で動作する各種のソフトウェアを中心に出題され、Linux経験3年未満くらいの方が対象です。個人的には1年以内の方でも十分に合格できると思います。レベル2試験は201試験と202試験の2つに分かれており、2つ合格して資格が認定されます。

レベル3試験はLinuxの最高位で、テーマごとに試験が分かれており、出題範囲も全く異なります。1つでも合格するとレベル3として認定されますが、各試験に合格するとその試験分野のスペシャリストとして世界的に認められます。
個人的には1年以上の経験があれば十分に合格できると思います。
一番簡単なのは「LPIC-3 304:仮想化とハイアベイラビリティ」で、次は「LPIC-3 303:セキュリティ」かと思います。ただ、「LPIC-3 300:混在環境」はWindows Serverの経験があるならとっつきやすいのではないでしょうか。

試験科目一覧を以下に示します。出題範囲はリンク先から確認できます。

その他の情報はこちら

  • 受験料:税込み16200円(後で紹介するバウチャーを使えば安くなります)
  • 試験時間:90分
  • 問題数:60問
  • 合格点数:500点(200~800点の範囲でスコアリング。ただし、50%正解すればよいわけではありません。詳しくは後程。)

LinuCとの違い

LPICと似た試験にLinuCというものがあります。
よくLPICは終了してLinuCに変わったと誤解されますが、LPICは引き続き受験可能です

ではLinuCとは何かといいますと、簡単に言えば、日本版LPICです。
運営組織は別でLPICはLPI日本支部、LinuCはLPI Japanという組織です。
以前はLPIがLPI JapanにLPICの日本での運営を委託していました。

LPICは世界的な資格な半面、日本独自の使われ方には合わないためLinuCができたと、言われています。
建前上は。。。
本音のところは利権の問題などささやかれますが、ここでは割愛します。
(確かにLPI Japan時代はLPICレベル3試験の受験料を日本だけ2倍にしていたという事実もありますが、、、。LinuCは引き続き2倍料金です。)

個人的にはLPICを推します。それには次の理由があります。

  • LPICは世界で通じる。海外で働かないから関係ない、とはなりません。国内の外資系企業で働くことは絶対ありませんか?その際、LPICなら通じますが、LinuCは通じないかもしれません。
  • LPICは歴史がある。まだまだLinuCは知名度はありません。IT系の方なら知っているかもしれません。しかし、就職の際に書類選考をするのは人事担当者です。LPICは知っていてもLinuCは知らないかもしれません。
  • 受験料が安い。先にも書きましたが、LPICのレベル3受験料はLinuCの半額で1.5万円です。LinuCは3万円です。説明不要ですね。
  • LinuCはころころ問題が変わる可能性がある。LinuCは試験問題をすぐに変え得ることを表明しています。それではせっかく買った教科書や問題集がすぐに役に立たなくなる、なんてことが起こるかもしれません。資格は合格することが大事です。しかも受験料も安くありません。より確実に合格したいならLPICが良いですね。

LPICのコツ

LPICの合格のためのコツをご紹介します。

問題形式と採点方法

LPICは次の問題形式があります。

  • 単一選択問題 (選択肢の中から1つだけ選択します。)
  • 複数選択問題 (選択肢の中から複数個選択します。選択する数は問題ごとに指示があります。選択が全部正解で得点です。)
  • 語句入力問題 (キーボードから文字を入力します。)

※選択問題の選択肢は4~5つ程度

LPICの採点方法は難しい問題ほど高得点になります。
具体的には、他の受験者の正答率が低い問題ほど高い点数になります。

ここでカギになるのは「語句入力問題」です。
語句入力問題は選択問題に比べて、消去法が使えない分、かなり難しいです。
語句入力問題で出る問題は簡単なものばかりというわけではないので、どれだけ語句入力問題を正答できるかで大きく点数が違います。
語句入力問題としては、ファイルのパス、ファイル名、設定ファイルのパラメータや値、コマンドのオプションなど、様々あります。
これらはLinux経験者だから勉強しなくても答えられるというものでは決してありません。

単一選択問題と複数選択問題の選択問題系も難しい問題ほど点数が高いですが、消去法も可能なため、語句入力問題に比べると難易度は下がります。
それでも得点すべき問題はしっかりと得点したいですね。

試験範囲

LPICの試験範囲は公開されていますが、これらがまんべんなく出るかというとそんなことはなく、結構偏りがあったりします。そのため、教科書を読むだけでは頻出部分がうろ覚えになったりして効率が悪いです。
必ず問題集を解きましょう。

再受験

再受験は1回目の不合格から1週間後に受験できます。
ただし、再受験時には1回目に出た問題はほぼ出ません。実感としては同じ問題は60問中3、4問です。
その為、1回目に出た問題を頑張って覚えても2回目にはほぼ役に立ちません。
1回の受験でばっちり合格できるように準備したほうが良いです。
不合格であったとしても1回目の受験の点数に関係なく、しっかりと勉強して2回目に臨んでください。

勉強法

さて、やっと勉強方法ですね。
LPICのコツでも書きましたが、難しい問題を確実に解くこと、頻出分野を集中的に勉強することが合格につながります。
LPICの勉強は短期間に効率よくやることが大事です。

以下ではレベルごとの学習法を紹介します。

LPICレベル1

効率よく勉強することが大事、と書きましたが、レベル1は地道に教科書を読んでおいたほうが良いです。
流し見でもよいですので、教科書には一通り目を通しておいてください。

おすすめは翔泳社さんの「Linux教科書 LPICレベル1」です。必ず最新バージョンのものを購入してくださいね。
https://www.shoeisha.co.jp/book/detail/9784798160498

教科書を一通り読んだ後は問題集をやりましょう。
おすすめはこちらも翔泳社さんの「Linux教科書 LPICレベル1 スピードマスター問題集」です。できれば最新バージョンが良いですが、1つ前のバージョンでもなんとかなります。
https://www.shoeisha.co.jp/book/detail/9784798141893

Web問題集のPing-tさんもおすすめです。
https://ping-t.com/
102試験は有料ですが、101試験は無料で利用できます。
Ping-tさんは網羅的に問題が出るので、上位レベルの試験では効率が悪くて使いづらいですが、レベル1試験はあまり偏りがないので良いです。正解するごとに金銀銅のマークがつくので、すべての問題を銀マーク以上にしたうえで、2度ほど問題数・試験時間を本番と同じにして挑戦しましょう。それで9割取れればまず合格するでしょう。

LPICレベル2

レベル2から急に難しくなります。効率よく学習したいですね。
レベル2は問題集を解きながら、わからないところは教科書で読むという、レベル1とは逆のほうが効率が良いです。
決して教科書を全部読んでから問題、としてはいけません。絶対最初に読んだあたりの範囲は忘れています。

教科書はレベル1と同じく翔泳社さんのものがおすすめです。
https://www.shoeisha.co.jp/book/detail/9784798151236

問題集はWeb問題集の学易さんと紙の問題集の翔泳社さんのものがおすすめです。
学易:https://gakuyasu.byaku.jp/
翔泳社:https://www.shoeisha.co.jp/book/detail/9784798151250

学易はレベル2は無料で利用できます。
無料なので問題数は50問程度とやや少なめですが、しっかりと本試験を分析したうえで問題を作ってあるので、大幅な得点上昇に結びつきます。解説も解説が必要な問題のみについており、解説を読むだけで大変、ということはありません。必ず確実に満点がとれるようになるまで勉強しましょう。
といっても1日頑張れば、十分にそのレベルまでいけますよ。

翔泳社さんの紙の問題集も解いておきましょう。できれば2周くらいはしたいですね。

レベル1でおすすめしたPing-tさんはレベル2ではおすすめしないです。まんべんなく問題が出るので、効率が悪いです。解説もかなり長々としており、しかも別の似たような問題から流用した解説が多数あるので、正直あまり頭に入ってきません。何度もやっていると、問題文と答えの組み合わせを暗記するだけになってしまいます。それでは本試験に対応できません。

LPICレベル3

レベル3は完全に問題集だけで十分です。副読本として教科書を用意しておいても良いですが、教科書を読むより問題集の解説を読んだほうが良いです。

レベル3は学易さんの問題集だけでよいです。
レベル3から学易さんは有料になってしまいますが、効率よく・確実に合格して時間やお金を節約したほうがずっと良いです。
https://gakuyasu.byaku.jp/

学易さんでは後述するバウチャーも販売しており、バウチャー購入時に問題集の利用割引券がもらえます。
それを使って問題集を購入するのが良いですよ。

レベル3からは学易では解説がある問題が多いです。といっても、必要最低限の分量に抑えられており、どの点が解き方のポイントになるかが色を変えて書かれているので、非常にわかりやすいです。
問題は130問くらいあるので、ほぼ100%正解できるまでやりこみましょう。おそらく2日もあれば十分に力がつくと思います。
学易は合格保証付きで、万が一不合格の場合は利用料を返金してくれるようです。すごい自信ですね(笑)。でも本当に良い問題集だと思います。

バウチャー購入

LPICのバウチャーは調べてみましたが、間違いなく学易さんが最安です。
学易:LPIC 受験バウチャー割引販売

価格は税込14,580円。定価が16,200円なので、ちょうど10%割引ですね。
ただし、納品までに1週間くらいかかるようなので、早めに購入したほうが良いですね。
バウチャーは1年くらい使えますので、急に忙しくなって受験を先延ばしにしても問題ありません。
購入すればeラーニングの割引チケットももらえますのでお得です。

その他の販売サイトについて
- Ping-t : 15,120円
- isaオンラインショップ : 15,120円
- Pearson : 16,200円
- SEShop : 16,200円
- メルカリ : ???円 ※たまに出品されているようです

試験予約

試験の予約の流れとしては次のような感じです。

  1. LPIアカウント登録 (2回目不要)
  2. Pearsonアカウント登録 ※1営業日かかるので早めに事前に登録しておきましょう (2回目不要)
  3. テストセンターの選択
  4. 受験日時の選択
  5. バウチャーで決済
  6. 予約完了

試験の予約の詳しい手続きは学易さんのWebサイトに画像付きで詳しく載ってますので、詰まった方はこちらを参考にするのが良いです。

学易:バウチャーの使用方法

受験当日

テストセンターは込み合う可能性がありますので、予約時間の30分前には到着しましょう。
受験には以下の持ち物が必要です。

  • 写真付き身分証
  • 別の身分証・クレジットカード
  • ポケットティッシュ (必要な場合)

その他のものは持って行っても持ち込めません。腕時計もダメです。

テストセンターに到着したら、まず受付に行って名前と受験科目、受験時間を伝えましょう。

その後、身分証の提示・確認を行い、同意書にサインします。

写真撮影と電子署名(タブレット上に専用のペンで漢字でフルネームを書きます)を終えたら、荷物を預けるロッカーについて案内されますので、荷物をロッカーにしまってください。

以上で準備は完了です。時間になったら入室しましょう。

持ち込めるのはポケットティッシュ、メガネだけです。メガネは確認のため、入室の際に係員に見せてチェックしてもらいます。

試験室で自分の席に着席すると、受験科目・受験者(自分)の名前を改めて確認し、試験開始です。
ここで、係員が離れていきますので、以降は画面の指示に従って試験を進めましょう。

まずは、確認事項を読み、同意します。※絶対に同意しないで進めないでください

試験が開始されると1.5時間のカウントダウンが始まります。問題は後で見直せますので、コマンド問題から先にやるなど、自分なりの方法で解き進めてください。

全ての問題に回答完了後、回答一覧から未回答問題がないかを確認し、試験を終了します。
時間切れの場合は強制的に終了になります。

直ちに試験結果が表示されます。

お疲れさまでした。これで完了です。受付でスコアレポートを印刷したものを受け取ってください。

合格した場合は1か月ほどで認定証が送られてきます。
※101、102試験などの2科目合格が必要な場合は送られてきません。

最後に

LPICの勉強は短期間に効率よくやることが大事です。
Pearsonアカウント作成がまだの方はPearsonアカウント作成を、それとバウチャーの購入は早めにすましておきましょう。
それでは長くなりましたが読んでいただきありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Kali Linux に Kindle for PC をインストールする。

Kali Linux に Kindle for PC をインストールする。

LinuxでKindleを読むために手こずったため、メモ化しておく。
・playonlinuxの環境構築
・Kindleのインストール
・Kindleの日本語化

この記事を書いたときの環境

$ uname -a
Linux kali 4.19.0-kali4-amd64 #1 SMP Debian 4.19.28-2kali1 (2019-03-18) x86_64 GNU/Linux
$ playonlinux --version
PlayOnLinux 4.3.4
$ ls ~/Downloads/
kindle-for-pc-1-17-44183.exe

playonlinuxのインストール

wineを直接使ってもいいんですが、バージョン管理が(非常に)面倒なのでplayonlinux上でwineの適切な
バージョンを設定してKindleをインストールしたいともいます。

$ sudo apt install playonlinux
$ playonlinux --version
PlayOnLinux 4.3.4

terminalから起動して設定していきます。メニューバー等からも起動はできますが、terminalから起動した場合
ログがでるのでエラーへの対処がしやすくなります。

$ playonlinux

言語設定で日本語を選んでいる場合は言語を英語にして起動したほうが無難です。次のコマンドで言語を英語にして起動できます。

$ LC_ALL=C playonlinux

Kindle for PCのダウンロード

playonlinuxから直接Kindleをインストールできますが、
これだと適切なバージョンが設定できないのでうまく動きません。
自分で適切なバージョンのものをダウンロードしてインストールします。
wineとKindleのバージョンの組み合わせは次を確認すればいいでしょう。
https://appdb.winehq.org/objectManager.php?sClass=application&iId=10597
ここからRatingがGoldかPlatinumの組み合わせを選べば良いと思います。
今回はwine-2.15, Kindle-1.17.xで行います。
Kindle-1.17.xのダウンロードは以下のページから。
https://kindle-for-pc.en.uptodown.com/windows/download

またamazon.co.jpから最新バージョンのものをダウンロードしても(2019.5.7現在では)
バージョンがよくわからないのでうまく行くかは運次第。

playonlinuxの仮想環境の設定

ツールバーの Tools > Manage Wine Versions を選択。
Wine Version(x86)からWine 2.15を選択。

次にConfigureから新たにWindows,wineの環境を構築。
New > 32 bit windows installation > 2.15 を選択。
virtual driveの名前を聞かれるので適当に"KindleJP"と入力。

Kindle for PCのインストール

メニューのinstall > install-not-a-listed-programを選ぶ。
上記のplayonlinuxで仮想環境の設定をおこなっている場合は、Edit or update an existing applicationを選択。
仮想環境の設定を行ってなくてもInstall a program in a new virtual driveを選択すれば同様の設定を行える。
installを行う前にUse another version of Wine とConfigure Wineにチェックを入れる。
(チェックを入れなくても後で設定できる。)
チェックを入れた場合、wineのバージョンとwindowsのバージョンを聞かれるので
wineは2.15、windowsはwindows 7もしくはwindows 8.1を選択。

その後インストールするアプリを聞かれるのでダウンロードしたkindle-for-pc-1-17-44183.exeを選択。
インストール中、アカウントを聞かれるが一旦無視してよい。
インストールが終了するとplayonlinux上にKindleのアイコンが表示されると思います。

Kindle for PCの日本語化

インストールは完了しましたが、日本語が表示できないので表示させるためにレジストリをいじります。
自分でwindowsのレジストリをいじる場合は、間違えた場合取り返しがつかないことがあるので必ずバックアップコピーをとるのですが
今回はLinux上の仮想環境であること(と、あとめんどくさい)からレジストリのバックアップは行いません。

Kindleのアイコン上で右クリック > Registory Editor
regeditが表示されるので
HKEY_USRS/S-1-5-21-0-0-0-1000/Software/Amazon/Kindle/User_settings/lang.iso639
のValue dataをenからjpに変更します。

ただし、これを変更しても全部うまく日本語化されるわけではないみたい。
うまいやり方だれか教えてください。

参考文献・リンク

Ubuntu 16.04 に Kindle for PC をインストールする
http://nkenbou.hatenablog.com/entry/2017/04/25/125733
Where are Amazon Kindle ebooks on my Linux PC after I download them for offline reading w/“Kindle Cloud Reader” Chrome app, & how to convert to PDF?
https://askubuntu.com/questions/1011989/where-are-amazon-kindle-ebooks-on-my-linux-pc-after-i-download-them-for-offline

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UbuntuでHFS+を一般ユーザーで読書可能にする

Macでよく使われるHFS+フォーマットのディスクを,Ubuntuで一般ユーザーで読み書き可能な状態でマウントする方法をまとめておきます.
検証環境:Ubuntu 18.04 LTS

インストール

hfsprogsbindfsが必要なので,インストールしておきます.

sudo apt install hfsprogs bindfs

マウント

/dev/sdd1/media/HFS_Disk/ にマウントするとします.このとき, /dev/sdd1 を一旦 /media/HFS_Root/ にマウントしてから,それを /media/HFS_Disk/ にマウントし直すことで一般ユーザーでの読み書きを実現します.(HFS_Rootではroot権限がないと書き込みができません.)

sudo mount -t hfsplus -o force,rw /dev/sdd /media/HFS_Root
sudo bindfs -u $(id -u) -g $(id -g) /media/HFS_Root /media/HFS_Disk

アンマウント

HFS_DiskをアンマウントしてからHFS_Rootをアンマウントして完了です.

sudo umount /media/HFS_Disk
sudo umount /media/HFS_Root

参考元

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ヤマハルータ(RTX1200)からログをCentOS6に送ってみた

はじめに

ヤマハルータ(RTX1200)のログをLinuxに集めてみました。

参考

環境

  • ルータ
    • ヤマハルータ(RTX1200)
  • ログ収集サーバー

    • CentOS6.10
  • ログ収集デーモン

    • syslog → rsyslog

動作概要

RTX1200からログ収集サーバーにUDP/514でログを送信

    ------+-----------------------------+-------
          |                             |
    +-----+------+               +------+------+
    | RTシリーズ |               | コンピュータ|
    +------------+               +-------------+
                      514/UDP
      syslog →syslog メッセージ→ syslogd (syslogデーモン)
        ↑                            ↓
    logしたい情報           syslog.confでの指示によりファイル化などをする

syslogとは

  • 役割
    • 各アプリケーションからログを受け取りファイルに書き込む
    • ログを他のサーバーに送信することもできる

rsyslogとは

  • CentOS6ではsyslogの後継で高機能なrsyslogが採用されている。役割は同じ
  • rtx1200ではsyslogが採用されている

CentOSの設定

  • 設定ファイル
    • /etc/rsyslog.conf
<ファシリティ>.<プライオリティ> 出力先

ファシリティとは

  • ログの種類。mail、cron、ntpなど
  • local0-local7は自由に使えるファシリティ。rtx1200からのログはこのどれかで定義する

プライオリティとは

  • 優先順位のこと
  • emerg
    • 緊急事態
  • alert
    • 警報(すぐ対応必要)
  • crit
    • 危険
  • error
    • エラー
  • warning
    • 警告
  • notice
    • 注意
  • info
    • 情報
  • debug
    • 問題に対応するための詳細な情報
  • none
    • なし

どのアプリケーションからのどのレベルのログをどこに書き込むか指定する。レベルごとに指定できるのでレベル毎に書き出すファイルを変えることもできる。

ヤマハルータからログを受け取る設定

設定ファイル /etc/rsyslog.conf

udp/514から受け取る設定

$ModLoad imudp
$UDPServerRun 514

デフォルトだと/var/log/messagesに出力されるのでlocal5.noneで出力しないようにする

*.info;mail.none;authpriv.none;cron.none;local5.none    /var/log/messages

local5(ヤマハルータ)からのログを/var/log/rtx1200.logに書き込む

# RTX
local5.*                                                /var/log/rtx1200.log

あとはiptabltesでudp 514ポートを開放する

ヤマハルータの設定

administratorになってから
ログの送信先を設定

# syslog host IPアドレス

ファシリティ(ログ種別)をCentOSに合わせる

# syslog facility local5

出力したいログのレベルを決定する

# syslog notice on
# syslog info on
# syslog debug on

ヤマハルータのログのレベル

  • noticeレベルの情報

    • パケットフィルタリングで、落としたパケットの情報などを ログします。
  • infoレベルの情報

    • 通常の情報をログします。
  • debugレベルの情報

    • 障害解析などの為に、ISDNやPPPのデバッグ情報をログします。

補足

webサーバなどのログをwebサーバで保管するのではなくsyslogの仕組みを使って他のサーバで保管、一括管理することでログが改ざんされることを防ぐこともできる。

まとめ

  • 上記設定で特に問題なくログを収集することができました。logrotateの設定を入れたほうが良いかもしれません。今度はログの解析をやってみようと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[linux] SELinuxの状態 [CentOS7]

SELinuxの状態

enforcing ... SELinuxは有効で、アクセス制限もあり。 

permissive ... SELinuxは有効だが、アクセス制限はなく、警告を行う。

disable ... SELinuxは無効。

確認方法

vi /etc/selinux/config を端末にて実行。

SELINUX=[上の3つのどれか状態]

[上の3つのどれか状態]を書き換えて保存し、「:w」
エディターから出て、 「:q」
再起動すると、  「reboot」
変更できる。

*設定を変更した際、適用するには再起動が必要なことが多いと思います...。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

sudo不要のコマンドインストール (unrarの場合)

Linux系サーバにrar形式のファイルを展開するためのコマンドをlinux環境に非su権限でインストールする.
インストール先を変更するだけで済む事例.

なぜPermission deniedされるのか

今回の場合は,単に保護されたディレクトリ内に新しくファイルを作ろうとしたから.
ファイルを作る場所を変え,かつその場所が環境変数PATHに登録されていれば,この問題を避けることができる.

準備

ホームディレクトリなどに次のディレクトリを作成する.

  • ソースコード保存先(/home/{username}/packagesなど)
  • 実行ファイルインストール先(/home/{username}/binなど)

ソースコードのダウンロード

ソースコード保存先に,このサイトにあるtar.gz形式ファイルのダウンロード.

wget http://www.rarlab.com/rar/unrarsrc-{version}.tar.gz

tar.gz解凍

保存先にてtarコマンドの実行.解凍用オプション(zxvf)は定型文のように覚えてしまう.

tar zxvf http://www.rarlab.com/rar/unrarsrc-{version}.tar.gz

unrarディレクトリが作成されているので,そこに移動.

makefileの編集

makeコマンドによってmakefileを用いたコマンドの作成がされるので,一度unrar内のファイルmakefileをテキストエディタで開く.DESTDIR=の部分だけ下記のように編集して保存する.

makefile
#DESTDIR=/usr ###←もともとの文コマンドの文頭に#をつける.
DESTDIR=/home/{username} ###←/binを除く部分を書く.

実行ファイル作成

makeで実行.

make

これにより,makefileで:の前に定義されるターゲットのうち,一番初めに書かれているものかつドットから始まっていないものを実行する.unrarのmakefileの場合,次が該当.

makefile
# ↓飛ばす
.cpp.o:
    $(COMPILE) -D$(WHAT) -c $<

# ↓実行される
all:    unrar

:   :   :

# ↓allで指定されたunrarターゲット
unrar:  clean $(OBJECTS) $(UNRAR_OBJ)
    @rm -f unrar
    $(LINK) -o unrar $(LDFLAGS) $(OBJECTS) $(UNRAR_OBJ) $(LIBS) 
    $(STRIP) unrar

make後,コマンド出力の末尾に"unrar"と書かれている(=unrarが正常に生成された)ことを確認して次へ.

実行ファイルのインストール

こちらもmakeで実行.

make install

makefile内の次のターゲットが実行される.

makefile
# ↓makeコマンドで指定されたターゲット
install:    install-unrar

# ↓installで指定されたターゲット
install-unrar:
            install -D unrar $(DESTDIR)/bin/unrar

ここでDESTDIRを用いていることが分かる.
実行後,/home/{username}/bin内にunrarが生成される.

PATHの登録(.bashrcの編集)

/home/{username}/binをPATHに登録し,unrarコマンドが使えるようにする.
homeディレクトリに.bashrcがあることを確認.ドットから始まる隠しファイルなので,lsコマンドに-aオプションをつける.

ls -a

このファイルをテキストエディタで開き,次の一行を追加して保存する.

.bashrc
export PATH="$PATH:/home/{username}/bin"

.bashrcはユーザがログイン時に自動的に実行されるコマンドを記載するもの.ターミナルのスタイルを変えたり,長いコマンドを簡略化するエイリアスを登録したり,そして何より環境変数の変更・追加を行うなどの目的で使われる.
今回は,ログイン時に元々のPATHに/home/{username}/binを追記するために使う.

動作確認

再ログインするか,.bashrcを強制的に実行する.

source ~/.bashrc

コマンドが使えるか(=どこにコマンドがあるかを教えてくれるか)を確認.

which unrar ###→ /home/{username}/bin/unrarと返せばOK.

unrarでrarファイルを解凍する.

unrar e xxx.rar

以上.

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

このご時勢なのにOracleDBをPro*Cで操作する

はじめに

本記事は、個人開発(勉強)環境として、Oracle環境を導入する手順まとめです。なぜ記事を書こうと思ったかというと、内容が古すぎるのか、最新の記事がどこにも見当たらなく非常に困ったため。需要あるか分かりませんが、同じような状況の同志と、今後の自分のために。
「クラウドやりたい!」、「Webデザイナーやりたい!」という人も多いと思いますが、(私みたいに)業務上必要なシーンがくるやもしれません。
記事の構成としては以下の通りです。1については、興味ない人は読み飛ばしてください。

  1. 昨今のOracle
  2. Oracle Linux環境の構築
  3. Oracle DBの導入
  4. データベースの作成
  5. Oracle DBのセットアップ
  6. 動作確認(追記予定)

なぜLinuxかというと、今回はC言語からPro*Cを用いてDatabaseを利用します。WindowsにC言語のコンパイル環境を導入するよりもLinux構築のほうが(個人的に)容易なので、今回はOracle Linuxを選定しました。なぜOracle Linuxを選定したかについては下記参照。

また当記事については、先人の良記事を利用して環境構築するため、基本はサボりますリンク多めですがご了承ください。リンク先で触れられていない部分については、当記事で追記しています。

最終的な目標環境は以下の通り。

Windows OS (各個人のバージョン)
 ┗ VirtualBox (6.0.6)
  ┗ Oracle Linux (7.5.0.0.0)
   ┗ C言語実行環境
   ┗ Oracle Database (12c Release 2)

1. 昨今のOracle

Oracle Javaをはじめ、Oracleについては昨今いろいろ言われていますが、Oracle DBを個人で利用するくらいならまだ無償で利用可能。
その辺の話はあまり詳しくないので参考いくつか載せておきます。

上記記事ではOracle DBについては触れられてはいませんが、オンプレのパッケージ商品を販売したり、クラウドに注力したりと、そのうち個人利用ですらサブスクリプション課金になりそうな勢いですね。

2. Oracle Linux環境の構築

構築手順

基本的には、「参考:VirtualBoxでOracle Linux 7.5をインストールする(だけのメモ)」を参考に構築する。

  • Oracleにアクセスする
    • Oracleユーザを作成する。住所やメールアドレスなど入力するが、個人でも会社のでも問題ない
    • 作成したユーザIDでログインすると、検索ボックスがあるため、「Oracle Linux 7.5.0.0.0」と入力し「Search」ボタンを押下する
    • 「DLP:Oracle Linux 7.5.0.0.0 ( Oracle Linux ) 」を押下すると、カートに追加される
    • 右上の「Checkout」を押下する
    • カートのSelected Softwareに「Oracle Linux7.5.0.0.0」が入っていることが確認出来たら、Platforms/Languagesを「x86 64bit」にして「Continue」ボタンを押下する
    • 「I accept the terms in the license agreement」という同意書的な文章が出てきた場合、「I accept the terms in the license agreement」にチェックをして「Continue」ボタンを押下する
    • 「V975367-01.iso Oracle Linux Release 7 Update 5 for x86(64 bit), 4.1GB」以外のチェックをすべて外して、「Download」ボタンを押下し、ダウンロードする
  • 参考:Windows7環境なのにdocker入れて開発することになった話【①環境設定編】」の「1.VirtualBoxのインストール」を参考にViertualboxをインストールする
  • Oracle Linuxをイメージをマウントする
    • VM VirtualBoxを起動する。
    • 「新規(N)」をクリック
    • 名前に「Oracle」っぽい名前(OracleVMとかOracleTestとか)を入れると、OSが勝手にOracleになるので、次へ
    • メモリーサイズを任意の値で設定(4G以上あるとさくさく)し、次へ
    • ハードディスクの設定で「仮想ハードディスクを作成する」を選択し、任意のサイズで作成する(データベース入れるので40GB程度は欲しい)
    • 仮想ハードディスクの作成では、全てデフォルトのまま次へ(可変サイズ/固定サイズはどちらでも良い)
  • 参考:VirtualBoxでOracle Linux 7.5をインストールする(だけのメモ)」の、「Oracle Linux」に従ってインストールを進める

詰まりそうなPOINTのTIPS

  • 日本語入力がうまくできない場合は次の記事を参照「参考:Oracle Linux 7.4 デスクトップ上での日本語入力方法
  • プロキシ環境下で利用している場合
    • アプリケーション→システムツール→設定→ネットワーク
    • 手動の設定画面を開く
    • HTTPプロキシ~Socksホストにproxyサーバの「http://proxy.co.jp」の「proxy.co.jp」部分を入力する
    • ポート番号は各社様々であるが、80番、8080番、1080番、3128番などが使われることが多い

3. Oracle DBの導入

構築手順

ここからは、2で構築したOracle Linux上で環境構築を行う。
基本的には「参考:Oracle Linux7.5にOracle 12cR2をインストールする」を参考に構築する。

  • Oracle Preinstall RPMを実行する
  • Oracle DBのインストール用のディレクトリ(俗にいうOracle homeディレクトリ)を作成する
    • $ mkdir -p /u01/app/oraInventory
    • $ mkdir -p /u01/app/oracle
    • $ mkdir /home/oracle/tmp
    • 必要に応じて$ chmod$ chownでディレクトリに所有者、アクセス権限を設定する。今回はすべてルートかつフルアクセス権限で行うため、以下の設定
      • $ chown -R root:root /u01/app/oracle
      • $ chown -R root:root /u01/app/oraInventory
      • $ chmod -R 775 /u01/app/oracle
      • $ chmod -R 775 /u01/app/oraInventory
    • $ ls -l /u01/app/を実行し、各権限を確認
drwxrwxrwx.  5 root root   89  4月 24 18:21 oraInventory
drwxrwxrwx. 10 root root 4096  4月 24 18:29 oracle
  • Oracleにアクセスする
    • Oracle Database 12c Release 2(俗にいうOracleDB 12cR2)のLinux x86-64の「See All」を押下
    • ライセンス同意を求められたら、ページ上部の「ライセンスに同意する」にチェック
    • 「linuxx64_12201_database.zip」を押下し、ダウンロードする
  • ダウンロードした「linuxx64_12201_database.zip」を解凍し、インストールをする
    • ダウンロードフォルダ下で、$ unzip linuxx64_12201_database.zipを実行する
    • 回答したdatabaseフォルダ下にrunInstallerがあるので、databaseフォルダ下で$ ./runInstallerを実行する(通常のexeファイルの実行と同じ実行の仕方)
  • 参考:Oracle Linux7.5にOracle 12cR2をインストールする」の「Oracle インストール」に従ってインストールを進める

※今回作成するOracleDBには、Oracle Linuxログインユーザが触れられれば良いので、「インベントリの作成」及び「権限のあるオペレーション・システム・グループ」については、すべてOracle Linuxへログインしているユーザ(が所属するグループ)を選択する。グループについては、デフォルトでユーザIDと同一名称のグループが作成されている。

詰まりそうなPOINTのTIPS

  • yumのプロキシ突破について、/etc/yum.confファイルの一番下にproxy=http://proxy.xxx.xxx:ppを追記する
  • スワップサイズでワーニングが出た場合は、以下コマンドを実施
  • インストーる中に修正スクリプトを促すメッセージが出た場合は、ルートユーザに移行して、修正スクリプトを実行する
    • $ su -
    • $ cd /tmp/CVU_XXXXXXXX←警告メッセージ中に記載
    • $ ./runfixup.sh

4. データベースの作成

構築手順

ここからは、3でインストールしたOracle 12cR2上にデータベースを作成する。基本的には「参考:Oracle Linux7.5にOracle 12cR2をインストールする」のデータベース作成以降を参考に構築する。

  • 環境変数の修正のために、.bash_profileに以下を追記する(通常ログインユーザフォルダ直下に存在する)
export TMPDIR=$HOME/tmp
export TEMP=$HOME/tmp
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/jdk/bin:${PATH}:PATH=$ORACLE_HOME/sqldeveloper/sqldeveloper/bin:
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export NLS_LANG=JAPANESE_JAPAN.UTF8
export LANG=ja_JP.UTF-8

export ORACLE_SID=testdb

※作成する際に入力した以下は控えておくとよい

  • SID : testdb
  • リスナー名 : LISTENER
  • リスナー・ポート : 1521

5. Oracle DBのセットアップ

  • sqlplusを起動し、データベースを起動
    • $ sqlplus / as sysdbaでシステムユーザで実行
    • SQL> show userの結果はSYSであるはず
    • SQL> startupでデータベースが起動する

以下より、すべてsqlplusにSYSでログインした状態で行う

・ユーザの作成
SQL> create user username identified by password;

・テーブルスペースの作成
SQL> create tablespace TEST_TBS 
     datafile '/u01/app/oracle/oradata/testdb/test01.dbf' 
     size 2G 
     autoextend off;

・一時領域テーブルスペースの作成
SQL> create temporary tablespace TEST_TMP 
     tempfile '/u01/app/oracle/oradata/testdb/testtmp01.dbf' 
     size 2G 
     autoextend off;

・user権限の設定(作成したテーブルスペースにuser権限を割り当てる)
SQL> alter user username
     default tablespace TEST_TBS
     temporary tablespace TEST_TMP;

・user権限の設定(接続権限、CRUD権限の追加)
SQL> grant connect, resource to username

・表領域の無制限割り当て
SQL> alter user username quota unlimited on TEST_TBS ;

・作成したユーザでアクセス可能であるかを確認
 下記のSQLが実行できればOK
SQL> connect username/password
SQL> show user
     USERNAME
  • 外部アプリケーションからアクセス可能にするために、listener.oraを下記の通り書き換える(HOST名称については、Oracle Linuxをインストール時に決定した名称)
$ cat /u01/app/oracle/product/12.2.0/dbhome_1/network/admin/listener.ora

/u01/app/oracle/product/12.2.0/dbhome_1/network/admin
listener.ora
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (ORACLE_HOME = /u01/app/oracle/product/12.2.0/dbhome_1)
      (SID_NAME = testdb)
      (SERVICE_NAME = testdb)
    )
  )

LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracle12test)(PORT = 1521))
  )

ADR_BASE_LISTENER = /u01/app/oracle

リスナーを立ち上げる
$ lsnrctl start

  • 今回はクライアントからのアクセスも同OSから行うため、transnames.oraも下記の通り書き換える(HOST名称については以下略)
LISTENER_TESTDB =
  (ADDRESS = (PROTOCOL = TCP)(HOST = oracle12test)(PORT = 1521))


TESTDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracle12test)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = testdb)
    )
  )

※listener.oraは、サーバ側(OracleDBをインストールした端末)に配置する、ネットワーク設定ファイル。サーバが受け取った通信を、どのデータベースに飛ばすか設定する

※transnames.oraは、クライアント側に配置する、ネットワーク設定ファイル。どのサーバのどのポートに、どういったプロトコルで接続するかを設定する

参考:オラクル ちょこっとリファンレンス

6. 動作確認

サンプルデータ

参考:底辺過ぎてちょっとビビる」を参考に、ソースコードを作成しました。

まずはsqlplusに、5で作成したユーザでログインする。

$ sqlplus / as sysdba

SQL> connect username/password

SQL> show user
     USERNAME

sqlplusにログインした状態で、テーブルを作成する。

SQL> CREATE TABLE username.MEMBER 
     (CODE varchar2 (10) NOT NULL, 
     NAME varchar2 (10) NOT NULL, 
     UPDATE_YMD varchar2 (8) NULL)

SQL> ALTER TABLE username.MEMBER ADD PRIMARY KEY 
     (CODE,
      NAME);

SQL> commit;

sqlplusにログインした状態で、サンプルデータをインサートする。

insert into username.MEMBER(
  CODE,
  NAME,
  UPDATE_YMD 
)
values
(
  '0000000000',
  'aaaaaaaaaa',
  '20190101'
);

insert into username.MEMBER(
  CODE,
  NAME,
  UPDATE_YMD 
)
values
(
  '1111111111',
  'bbbbbbbbbb',
  '20190101'
);

commit;

sqlplusからログアウトする。

ソースコード作成

以下のソースコードを記載する。

test_p.pc
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

/* SQLアクセス用定数(テスト用のためハードコーディング)*/
#define ORAUSER    "username"
#define ORAPASSWD  "password"
#define ORASYSID_T "testdb"

/* フェッチ時マックス件数マクロ定義 */
#define MAX 100

/* SQLアクセス用変数(いわゆるホスト変数)宣言部 */
/* "h_"始まりの変数はselectに利用 */
EXEC SQL BEGIN DECLARE SECTION;
    varchar username[20];
    varchar password[20];
    varchar systemid[20];
    char    h_code[MAX][10];
    char    h_name[MAX][10];
EXEC SQL END DECLARE SECTION;

/* ProCプリコンパイラ用ヘッダファイル宣言 */
EXEC SQL INCLUDE sqlca.h;

/******************************/
/* ここからメイン関数 */
/* メイン関数内での流れ */
/* 1.変数定義(ホスト変数についてはグローバル定義) */
/* 2.値の初期化 */
/* 3.DBコネクト */
/* 4.select文の発行 */
/* 5.カーソルオープン */
/* 6.フェッチ実行 */
/* 7.カーソルクローズ */
/* 8.DB切断(コミット) */
/******************************/
int main(int argc, char *argv[])
{
    /* フェッチ時のカーソルループ用変数 */
    int i;

    /* ホスト変数初期化 */
    memset(&username, 0x00, sizeof(username));
    memset(&password, 0x00, sizeof(password));
    memset(&systemid, 0x00, sizeof(systemid));
    memset(&h_code, 0x00, sizeof(h_code));
    memset(&h_name, 0x00, sizeof(h_name));

    /* oracleへの接続(SQLアクセス用変数に定数をセット) */
    strcpy(username.arr, ORAUSER);
    username.len = strlen(username.arr);
    strcpy(password.arr, ORAPASSWD);
    password.len = strlen(password.arr);
    strcpy(systemid.arr, ORASYSID_T);
    systemid.len = strlen(systemid.arr);

    /* 例外宣言→errorptへ飛ぶ */
    EXEC SQL WHENEVER SQLERROR GOTO errorpt;


    printf("user: %s, password: %s 接続開始します\n",
    username.arr,password.arr);

    /* 接続 */
    EXEC SQL CONNECT :username
      IDENTIFIED BY :password
      AT :systemid;

    printf("%s 接続成功しました\n",systemid.arr);

    printf("system: %s 検索を開始します\n", systemid.arr);

    /* カーソル宣言(selectの場合のsql発行はここ) */
    EXEC SQL AT :systemid DECLARE cursor CURSOR FOR
      SELECT CODE, NAME
        FROM MEMBER
        WHERE UPDATE_YMD > 20190101;

    printf("検索完了しました\n");

    printf("カーソルオープンします\n");

    /* カーソルオープン */
    EXEC SQL OPEN cursor;

    printf("カーソルオープンしました\n\n");

    /* データ取り出し(いわゆるフェッチ) */
    EXEC SQL FETCH cursor INTO
    :h_code,:h_name;

    /* 値が入ってない場合は抜ける */
    for(i=0;i<MAX;i++){
      if(0 == strlen(h_code[i])){
        printf("\n");
        break;
      }else{
        printf("%s,%s\n",
        h_code[i],h_name[i]);
      }
    }

    printf("フェッチ完了しました\n");

    /* カーソルクローズ */
    EXEC SQL CLOSE cursor;

    printf("カーソルクローズしました\n");

    /* commitと書いているが、切断も行っている */
    /* select以外の場合、これを書かないとrollbackされる */
    /* selectではカーソルクローズで切断されるため不要 */
    /* EXEC SQL COMMIT WORK RELEASE; */

    return 0;

    /* error時の処理 */
errorpt:
    printf("\n\n%-79s \n",sqlca.sqlerrm.sqlerrmc);
    EXEC SQL WHENEVER SQLERROR CONTINUE;
}

コンパイル

  • まずはプリコンパイル(pcファイルをcファイルにする)
    • $ proc iname=test_p oname=test_p.c sqlcheck=full
      • 実行することで、test_p.cが生成される
      • inameの拡張子は書いても書かなくてもよい
      • onameは書かない場合inputと同一名称(拡張子は"c")となる
      • sqlcheck=fullオプションで、この時点で静的構文解析を行う
  • オブジェクトファイルを生成する
    • $ gcc -c test_p.c -I $ORACLE_HOME/precomp/public
      • 実行することで、test_p.oが生成される
      • 4で設定した環境変数"$ORACLE_HOME"下に、precomp/publicフォルダが存在し、pro*c用のsqlcaヘッダファイルが存在する
      • "-I"オプションは、ヘッダを追加するオプション
  • 実行ファイル作成
    • $ gcc -o test_p test_p.o -L$ORACLE_HOME/lib -lclntsh
      • 実行することで、test_pが生成される
      • 4で設定した環境変数"$ORACLE_HOME"下に、libフォルダが存在し、pro*c用のライブラリ群が存在する
      • "-L"オプションは、ライブラリを追加するオプション

実行

  • 実行形式ファイルなので、$ ./test_pで実行する

実行結果

$ ./test_p
user: username, password: password接続開始します
testdb 接続成功しました
system: testdb 検索を開始します
検索完了しました
カーソルオープンします
カーソルオープンしました

0000000000,aaaaaaaaaa
1111111111,bbbbbbbbbb

フェッチ完了しました
カーソルクローズしました

詰まりそうなPOINTのTIPS

  • pcコンパイルにてライブラリ参照ができないエラー発生

pcのコンパイルの時点で、複数のライブラリが呼べないような以下のようなエラーが発生

行0、列0でエラーが発生しました。ファイルtest_p.pc
PCC-F-02102, Cプリプロセッサ処理を実行中に致命エラーが発生しました。
行33、列11でエラーが発生しました。ファイル/usr/include/stdio.h
    33  # include <stddef.h>
    33  ..........1
    33  PCC-S-02015, 挿入ファイルをオープンできません。
行15、列10でエラーが発生しました。ファイル/usr/include/_G_config.h
    15  #include <stddef.h>
    15  .........1
    15  PCC-S-02015, 挿入ファイルをオープンできません。
行51、列11でエラーが発生しました。ファイル/usr/include/wchar.h
    51  # include <stddef.h>
    51  ..........1
    51  PCC-S-02015, 挿入ファイルをオープンできません。
行50、列10でエラーが発生しました。ファイル/usr/include/libio.h
    50  #include <stdarg.h>
    50  .........1
    50  PCC-S-02015, 挿入ファイルをオープンできません。
行307、列3でエラーが発生しました。ファイル/usr/include/libio.h
   307    size_t __pad5;
   307  ..1
   307  PCC-S-02201, 記号"size_t"が見つかりました。 次のうちの1つが入るとき:

環境によっては、各ヘッダファイルの配置場所が、エラーメッセージ通りの/usr/include/下に無いことがある。ため、設定ファイルであるpcscfg.cfgにリンクを追加する必要がある。

  • 設定ファイルを検索$ find / -name pcscfg.cfg
    • /u01/app/oracle/product/12.2.0/dbhome_1/precomp/admin/pcscfg.cfg
    • sys_includeに、実際にヘッダファイルが存在するパスを追記する(私の場合は/usr/lib/gcc/x86_64-redhat-linux/4.8.2/include/stddef.h
pcscfg.cfg
...
sys_include=($ORACLE_HOME/precomp/public,/usr/include,/usr/lib/gcc/x86_64-redhat-linux/4.1.2/include,/usr/lib/gcc/x86_64-redhat-linux/4.4.7/include,/usr/lib/gcc/x86_64-redhat-linux/4.4.4/include,/usr/lib64/gcc/x86_64-suse-linux/4.8/include,/usr/lib/gcc/x86_64-redhat-linux/4.8.2/include/)
...

参考:Pro*Cのプリコンパイルでstddef.hが見つからないエラー発生

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【環境構築】OracleDB×Pro*C【今更】

はじめに

本記事は、個人開発(勉強)環境として、Oracle環境を導入する手順まとめです。記事を書こうと思った理由は、最新の記事がどこにも見当たらず、非常に困ったため。需要あるか分かりませんが、同じような状況の同志と、今後の自分のために。
「クラウドやりたい!」、「Webデザイナーやりたい!」という人も多いと思いますが、(私みたいに)業務上必要なシーンがくるやもしれません。
記事の構成としては以下の通りです。1については、興味ない人は読み飛ばしてください。

  1. 昨今のOracle
  2. Oracle Linux環境の構築
  3. Oracle DBの導入
  4. データベースの作成
  5. Oracle DBのセットアップ
  6. 動作確認(追記予定)

なぜLinuxかというと、今回はC言語からPro*Cを用いてDatabaseを利用します。WindowsにC言語のコンパイル環境を導入するよりもLinux構築のほうが(個人的に)容易なので、今回はOracle Linuxを選定しました。なぜOracle Linuxを選定したかについては下記参照。

また当記事については、先人の良記事を利用して環境構築するため、基本はサボりますリンク多めですがご了承ください。リンク先で触れられていない部分については、当記事で追記しています。

最終的な目標環境は以下の通り。

Windows OS (各個人のバージョン)
 ┗ VirtualBox (6.0.6)
  ┗ Oracle Linux (7.5.0.0.0)
   ┗ C言語実行環境 (gccコンパイル環境)
   ┗ Oracle Database (12c Release 2)

1. 昨今のOracle

Oracle Javaをはじめ、Oracleについては昨今いろいろ言われていますが、Oracle DBを個人で利用するくらいならまだ無償で利用可能。
その辺の話はあまり詳しくないので参考いくつか載せておきます。

上記記事ではOracle DBについては触れられてはいませんが、オンプレのパッケージ商品を販売したり、クラウドに注力したりと、そのうち個人利用ですらサブスクリプション課金になりそうな勢いですね。

2. Oracle Linux環境の構築

構築手順

基本的には、「参考:VirtualBoxでOracle Linux 7.5をインストールする(だけのメモ)」を参考に構築する。

  • Oracleにアクセスする
    • Oracleユーザを作成する。住所やメールアドレスなど入力するが、個人でも会社のでも問題ない
    • 作成したユーザIDでログインすると、検索ボックスがあるため、「Oracle Linux 7.5.0.0.0」と入力し「Search」ボタンを押下する
    • 「DLP:Oracle Linux 7.5.0.0.0 ( Oracle Linux ) 」を押下すると、カートに追加される
    • 右上の「Checkout」を押下する
    • カートのSelected Softwareに「Oracle Linux7.5.0.0.0」が入っていることが確認出来たら、Platforms/Languagesを「x86 64bit」にして「Continue」ボタンを押下する
    • 「I accept the terms in the license agreement」という同意書的な文章が出てきた場合、「I accept the terms in the license agreement」にチェックをして「Continue」ボタンを押下する
    • 「V975367-01.iso Oracle Linux Release 7 Update 5 for x86(64 bit), 4.1GB」以外のチェックをすべて外して、「Download」ボタンを押下し、ダウンロードする
  • 参考:Windows7環境なのにdocker入れて開発することになった話【①環境設定編】」の「1.VirtualBoxのインストール」を参考にViertualboxをインストールする
  • Oracle Linuxをイメージをマウントする
    • VM VirtualBoxを起動する。
    • 「新規(N)」をクリック
    • 名前に「Oracle」っぽい名前(OracleVMとかOracleTestとか)を入れると、OSが勝手にOracleになるので、次へ
    • メモリーサイズを任意の値で設定(4G以上あるとさくさく)し、次へ
    • ハードディスクの設定で「仮想ハードディスクを作成する」を選択し、任意のサイズで作成する(データベース入れるので40GB程度は欲しい)
    • 仮想ハードディスクの作成では、全てデフォルトのまま次へ(可変サイズ/固定サイズはどちらでも良い)
  • 参考:VirtualBoxでOracle Linux 7.5をインストールする(だけのメモ)」の、「Oracle Linux」に従ってインストールを進める

詰まりそうなPOINTのTIPS

  • 日本語入力がうまくできない場合は次の記事を参照「参考:Oracle Linux 7.4 デスクトップ上での日本語入力方法
  • プロキシ環境下で利用している場合
    • アプリケーション→システムツール→設定→ネットワーク
    • 手動の設定画面を開く
    • HTTPプロキシ~Socksホストにproxyサーバの「http://proxy.co.jp」の「proxy.co.jp」部分を入力する
    • ポート番号は各社様々であるが、80番、8080番、1080番、3128番などが使われることが多い

3. Oracle DBの導入

構築手順

ここからは、2で構築したOracle Linux上で環境構築を行う。
基本的には「参考:Oracle Linux7.5にOracle 12cR2をインストールする」を参考に構築する。

  • Oracle Preinstall RPMを実行する
  • Oracle DBのインストール用のディレクトリ(俗にいうOracle homeディレクトリ)を作成する
    • $ mkdir -p /u01/app/oraInventory
    • $ mkdir -p /u01/app/oracle
    • $ mkdir /home/oracle/tmp
    • 必要に応じて$ chmod$ chownでディレクトリに所有者、アクセス権限を設定する。今回はすべてルートかつフルアクセス権限で行うため、以下の設定
      • $ chown -R root:root /u01/app/oracle
      • $ chown -R root:root /u01/app/oraInventory
      • $ chmod -R 775 /u01/app/oracle
      • $ chmod -R 775 /u01/app/oraInventory
    • $ ls -l /u01/app/を実行し、各権限を確認
drwxrwxrwx.  5 root root   89  4月 24 18:21 oraInventory
drwxrwxrwx. 10 root root 4096  4月 24 18:29 oracle
  • Oracleにアクセスする
    • Oracle Database 12c Release 2(俗にいうOracleDB 12cR2)のLinux x86-64の「See All」を押下
    • ライセンス同意を求められたら、ページ上部の「ライセンスに同意する」にチェック
    • 「linuxx64_12201_database.zip」を押下し、ダウンロードする
  • ダウンロードした「linuxx64_12201_database.zip」を解凍し、インストールをする
    • ダウンロードフォルダ下で、$ unzip linuxx64_12201_database.zipを実行する
    • 回答したdatabaseフォルダ下にrunInstallerがあるので、databaseフォルダ下で$ ./runInstallerを実行する(通常のexeファイルの実行と同じ実行の仕方)
  • 参考:Oracle Linux7.5にOracle 12cR2をインストールする」の「Oracle インストール」に従ってインストールを進める

※今回作成するOracleDBには、Oracle Linuxログインユーザが触れられれば良いので、「インベントリの作成」及び「権限のあるオペレーション・システム・グループ」については、すべてOracle Linuxへログインしているユーザ(が所属するグループ)を選択する。グループについては、デフォルトでユーザIDと同一名称のグループが作成されている。

詰まりそうなPOINTのTIPS

  • yumのプロキシ突破について、/etc/yum.confファイルの一番下にproxy=http://proxy.xxx.xxx:ppを追記する
  • スワップサイズでワーニングが出た場合は、以下コマンドを実施
  • インストーる中に修正スクリプトを促すメッセージが出た場合は、ルートユーザに移行して、修正スクリプトを実行する
    • $ su -
    • $ cd /tmp/CVU_XXXXXXXX←警告メッセージ中に記載
    • $ ./runfixup.sh

4. データベースの作成

構築手順

ここからは、3でインストールしたOracle 12cR2上にデータベースを作成する。基本的には「参考:Oracle Linux7.5にOracle 12cR2をインストールする」のデータベース作成以降を参考に構築する。

  • 環境変数の修正のために、.bash_profileに以下を追記する(通常ログインユーザフォルダ直下に存在する)
export TMPDIR=$HOME/tmp
export TEMP=$HOME/tmp
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/jdk/bin:${PATH}:PATH=$ORACLE_HOME/sqldeveloper/sqldeveloper/bin:
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export NLS_LANG=JAPANESE_JAPAN.UTF8
export LANG=ja_JP.UTF-8

export ORACLE_SID=testdb

※作成する際に入力した以下は控えておくとよい

  • SID : testdb
  • リスナー名 : LISTENER
  • リスナー・ポート : 1521

5. Oracle DBのセットアップ

  • sqlplusを起動し、データベースを起動
    • $ sqlplus / as sysdbaでシステムユーザで実行
    • SQL> show userの結果はSYSであるはず
    • SQL> startupでデータベースが起動する

以下より、すべてsqlplusにSYSでログインした状態で行う

・ユーザの作成
SQL> create user username identified by password;

・テーブルスペースの作成
SQL> create tablespace TEST_TBS 
     datafile '/u01/app/oracle/oradata/testdb/test01.dbf' 
     size 2G 
     autoextend off;

・一時領域テーブルスペースの作成
SQL> create temporary tablespace TEST_TMP 
     tempfile '/u01/app/oracle/oradata/testdb/testtmp01.dbf' 
     size 2G 
     autoextend off;

・user権限の設定(作成したテーブルスペースにuser権限を割り当てる)
SQL> alter user username
     default tablespace TEST_TBS
     temporary tablespace TEST_TMP;

・user権限の設定(接続権限、CRUD権限の追加)
SQL> grant connect, resource to username

・表領域の無制限割り当て
SQL> alter user username quota unlimited on TEST_TBS ;

・作成したユーザでアクセス可能であるかを確認
 下記のSQLが実行できればOK
SQL> connect username/password
SQL> show user
     USERNAME
  • 外部アプリケーションからアクセス可能にするために、listener.oraを下記の通り書き換える(HOST名称については、Oracle Linuxをインストール時に決定した名称)
$ cat /u01/app/oracle/product/12.2.0/dbhome_1/network/admin/listener.ora

/u01/app/oracle/product/12.2.0/dbhome_1/network/admin
listener.ora
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (ORACLE_HOME = /u01/app/oracle/product/12.2.0/dbhome_1)
      (SID_NAME = testdb)
      (SERVICE_NAME = testdb)
    )
  )

LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracle12test)(PORT = 1521))
  )

ADR_BASE_LISTENER = /u01/app/oracle

リスナーを立ち上げる
$ lsnrctl start

  • 今回はクライアントからのアクセスも同OSから行うため、transnames.oraも下記の通り書き換える(HOST名称については以下略)
LISTENER_TESTDB =
  (ADDRESS = (PROTOCOL = TCP)(HOST = oracle12test)(PORT = 1521))


TESTDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracle12test)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = testdb)
    )
  )

※listener.oraは、サーバ側(OracleDBをインストールした端末)に配置する、ネットワーク設定ファイル。サーバが受け取った通信を、どのデータベースに飛ばすか設定する

※transnames.oraは、クライアント側に配置する、ネットワーク設定ファイル。どのサーバのどのポートに、どういったプロトコルで接続するかを設定する

参考:オラクル ちょこっとリファンレンス

6. 動作確認

サンプルデータ

参考:底辺過ぎてちょっとビビる」を参考に、ソースコードを作成しました。

まずはsqlplusに、5で作成したユーザでログインする。

$ sqlplus / as sysdba

SQL> connect username/password

SQL> show user
     USERNAME

sqlplusにログインした状態で、テーブルを作成する。

SQL> CREATE TABLE username.MEMBER 
     (CODE varchar2 (10) NOT NULL, 
     NAME varchar2 (10) NOT NULL, 
     UPDATE_YMD varchar2 (8) NULL)

SQL> ALTER TABLE username.MEMBER ADD PRIMARY KEY 
     (CODE,
      NAME);

SQL> commit;

sqlplusにログインした状態で、サンプルデータをインサートする。

insert into username.MEMBER(
  CODE,
  NAME,
  UPDATE_YMD 
)
values
(
  '0000000000',
  'aaaaaaaaaa',
  '20190101'
);

insert into username.MEMBER(
  CODE,
  NAME,
  UPDATE_YMD 
)
values
(
  '1111111111',
  'bbbbbbbbbb',
  '20190101'
);

commit;

sqlplusからログアウトする。

ソースコード作成

以下のソースコードを記載する。

test_p.pc
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

/* SQLアクセス用定数(テスト用のためハードコーディング)*/
#define ORAUSER    "username"
#define ORAPASSWD  "password"
#define ORASYSID_T "testdb"

/* フェッチ時マックス件数マクロ定義 */
#define MAX 100

/* SQLアクセス用変数(いわゆるホスト変数)宣言部 */
/* "h_"始まりの変数はselectに利用 */
EXEC SQL BEGIN DECLARE SECTION;
    varchar username[20];
    varchar password[20];
    varchar systemid[20];
    char    h_code[MAX][10];
    char    h_name[MAX][10];
EXEC SQL END DECLARE SECTION;

/* ProCプリコンパイラ用ヘッダファイル宣言 */
EXEC SQL INCLUDE sqlca.h;

/******************************/
/* ここからメイン関数 */
/* メイン関数内での流れ */
/* 1.変数定義(ホスト変数についてはグローバル定義) */
/* 2.値の初期化 */
/* 3.DBコネクト */
/* 4.select文の発行 */
/* 5.カーソルオープン */
/* 6.フェッチ実行 */
/* 7.カーソルクローズ */
/* 8.DB切断(コミット) */
/******************************/
int main(int argc, char *argv[])
{
    /* フェッチ時のカーソルループ用変数 */
    int i;

    /* ホスト変数初期化 */
    memset(&username, 0x00, sizeof(username));
    memset(&password, 0x00, sizeof(password));
    memset(&systemid, 0x00, sizeof(systemid));
    memset(&h_code, 0x00, sizeof(h_code));
    memset(&h_name, 0x00, sizeof(h_name));

    /* oracleへの接続(SQLアクセス用変数に定数をセット) */
    strcpy(username.arr, ORAUSER);
    username.len = strlen(username.arr);
    strcpy(password.arr, ORAPASSWD);
    password.len = strlen(password.arr);
    strcpy(systemid.arr, ORASYSID_T);
    systemid.len = strlen(systemid.arr);

    /* 例外宣言→errorptへ飛ぶ */
    EXEC SQL WHENEVER SQLERROR GOTO errorpt;


    printf("user: %s, password: %s 接続開始します\n",
    username.arr,password.arr);

    /* 接続 */
    EXEC SQL CONNECT :username
      IDENTIFIED BY :password
      AT :systemid;

    printf("%s 接続成功しました\n",systemid.arr);

    printf("system: %s 検索を開始します\n", systemid.arr);

    /* カーソル宣言(selectの場合のsql発行はここ) */
    EXEC SQL AT :systemid DECLARE cursor CURSOR FOR
      SELECT CODE, NAME
        FROM MEMBER
        WHERE UPDATE_YMD > 20190101;

    printf("検索完了しました\n");

    printf("カーソルオープンします\n");

    /* カーソルオープン */
    EXEC SQL OPEN cursor;

    printf("カーソルオープンしました\n\n");

    /* データ取り出し(いわゆるフェッチ) */
    EXEC SQL FETCH cursor INTO
    :h_code,:h_name;

    /* 値が入ってない場合は抜ける */
    for(i=0;i<MAX;i++){
      if(0 == strlen(h_code[i])){
        printf("\n");
        break;
      }else{
        printf("%s,%s\n",
        h_code[i],h_name[i]);
      }
    }

    printf("フェッチ完了しました\n");

    /* カーソルクローズ */
    EXEC SQL CLOSE cursor;

    printf("カーソルクローズしました\n");

    /* commitと書いているが、切断も行っている */
    /* select以外の場合、これを書かないとrollbackされる */
    /* selectではカーソルクローズで切断されるため不要 */
    /* EXEC SQL COMMIT WORK RELEASE; */

    return 0;

    /* error時の処理 */
errorpt:
    printf("\n\n%-79s \n",sqlca.sqlerrm.sqlerrmc);
    EXEC SQL WHENEVER SQLERROR CONTINUE;
}

コンパイル

  • まずはプリコンパイル(pcファイルをcファイルにする)
    • $ proc iname=test_p oname=test_p.c sqlcheck=full
      • 実行することで、test_p.cが生成される
      • inameの拡張子は書いても書かなくてもよい
      • onameは書かない場合inputと同一名称(拡張子は"c")となる
      • sqlcheck=fullオプションで、この時点で静的構文解析を行う
  • オブジェクトファイルを生成する
    • $ gcc -c test_p.c -I $ORACLE_HOME/precomp/public
      • 実行することで、test_p.oが生成される
      • 4で設定した環境変数"$ORACLE_HOME"下に、precomp/publicフォルダが存在し、pro*c用のsqlcaヘッダファイルが存在する
      • "-I"オプションは、ヘッダを追加するオプション
  • 実行ファイル作成
    • $ gcc -o test_p test_p.o -L$ORACLE_HOME/lib -lclntsh
      • 実行することで、test_pが生成される
      • 4で設定した環境変数"$ORACLE_HOME"下に、libフォルダが存在し、pro*c用のライブラリ群が存在する
      • "-L"オプションは、ライブラリを追加するオプション

実行

  • 実行形式ファイルなので、$ ./test_pで実行する

実行結果

$ ./test_p
user: username, password: password接続開始します
testdb 接続成功しました
system: testdb 検索を開始します
検索完了しました
カーソルオープンします
カーソルオープンしました

0000000000,aaaaaaaaaa
1111111111,bbbbbbbbbb

フェッチ完了しました
カーソルクローズしました

詰まりそうなPOINTのTIPS

  • pcコンパイルにてライブラリ参照ができないエラー発生

pcのコンパイルの時点で、複数のライブラリが呼べないような以下のようなエラーが発生

行0、列0でエラーが発生しました。ファイルtest_p.pc
PCC-F-02102, Cプリプロセッサ処理を実行中に致命エラーが発生しました。
行33、列11でエラーが発生しました。ファイル/usr/include/stdio.h
    33  # include <stddef.h>
    33  ..........1
    33  PCC-S-02015, 挿入ファイルをオープンできません。
行15、列10でエラーが発生しました。ファイル/usr/include/_G_config.h
    15  #include <stddef.h>
    15  .........1
    15  PCC-S-02015, 挿入ファイルをオープンできません。
行51、列11でエラーが発生しました。ファイル/usr/include/wchar.h
    51  # include <stddef.h>
    51  ..........1
    51  PCC-S-02015, 挿入ファイルをオープンできません。
行50、列10でエラーが発生しました。ファイル/usr/include/libio.h
    50  #include <stdarg.h>
    50  .........1
    50  PCC-S-02015, 挿入ファイルをオープンできません。
行307、列3でエラーが発生しました。ファイル/usr/include/libio.h
   307    size_t __pad5;
   307  ..1
   307  PCC-S-02201, 記号"size_t"が見つかりました。 次のうちの1つが入るとき:

環境によっては、各ヘッダファイルの配置場所が、エラーメッセージ通りの/usr/include/下に無いことがある。ため、設定ファイルであるpcscfg.cfgにリンクを追加する必要がある。

  • 設定ファイルを検索$ find / -name pcscfg.cfg
    • /u01/app/oracle/product/12.2.0/dbhome_1/precomp/admin/pcscfg.cfg
    • sys_includeに、実際にヘッダファイルが存在するパスを追記する(私の場合は/usr/lib/gcc/x86_64-redhat-linux/4.8.2/include/stddef.h
pcscfg.cfg
...
sys_include=($ORACLE_HOME/precomp/public,/usr/include,/usr/lib/gcc/x86_64-redhat-linux/4.1.2/include,/usr/lib/gcc/x86_64-redhat-linux/4.4.7/include,/usr/lib/gcc/x86_64-redhat-linux/4.4.4/include,/usr/lib64/gcc/x86_64-suse-linux/4.8/include,/usr/lib/gcc/x86_64-redhat-linux/4.8.2/include/)
...

参考:Pro*Cのプリコンパイルでstddef.hが見つからないエラー発生

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Linuxにおけるshellについて

Shellとは

Linuxへのインターフェイスで、terminalがそれにあたる。Command lineインターフェイスはGUIよりもよりパワフル。サーバー管理に使っているLinuxなどは、GUIがなかったり、SSHなどで接続できる点がメリット。

The Promptではいくつかの情報を提示している。どのサーバーであったりとか、ユーザー、どのディレクトリーにいるのかなど。

[sebec@linuxsvr ~]$

[root@linuxsvr:~]#

二つ目のroot/superuserはsystem管理者に限定されているのが常で、アプリのインストールや起動、停止などで必須となる場合が多い。

~(tilda) はいくつかの情報を包括している。

~sebec = /home/sebec
~pat = /home.pat
~root = /root
~ftp = /srv/ftp

Linux commandについて

大文字小文字が関係あるケースセンセティブ。基本的には小文字。
ls
cd
pwd
cat
echo - 引数を画面に表示
man - onlineマニュアルを表示 (man ls)
exit - shellを終了、もしくはセッションを終了
clear - 画面を白紙に

man commandを参考に見てみる
Linuxのterminalで下記をタイプ

$ man ls

[enter] ページを一行ずつスクロールする
[space] ページごとをスクロールする
[g] 一番最初に戻る
[G] 一番下に行く
[q] 閉じたいとき

環境の引数について
PATHは環境の引数に大きく関係する。commandのコントロールを制御するもので、多くのディレクトリーがメモされている。

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/sebec

でパスに書いてあるディレクトリー情報が表示される。左から右にcomamndが読まれていく。どのコマンドがどこのディレクトリーにあるかなどはwhichで検索できる。

$ which cat
/usr/bin/cat
$ which tac
/usr/bin/tac

linuxのコマンドを知るには実際に、そのディレクトリーを見にいくことで学べることがある。例えば、/bin内には下記のcommandがある

$ ls /bin
|       dd      ksh     pax     stty
bash        df      launchctl   ps      sync
cat     echo        link        pwd     tcsh
chmod       ed      ln      rm      test
cp      expr        ls      rmdir       unlink
csh     hostname    mkdir       sh      wait4path
date        kill        mv      sleep       zsh...

ここに書いてあるのは、一部だが、実際のlinuxの/binには大量のコマンドがある。更に細かいcommand情報はman -k SEARCH-TERMで調べられる。もしくは--help-hで見られる。

ディレクトリーでshellる

. 今いるディレクトリー
.. 親ディレクトリー
cd -  一つ前のディレクトリーに戻る
/ ディレクトリー仕切り

echo $PATHでcommandのパスが記載されているが、commandをフルパスで書いて実行することもできるし、指定のディレクトリーにいれば、$PATHに書かれていなくても、./commandで実行できる。

mkdir [-p] ディレクトリーを作る -pはparentで複数フォルダを作ることができる。
rmdir [-p] ディレクトリーを削除
rm -rf ディレクトリーを強制削除

ls -lをdecodeしてみる

ls -l
drwxr-xr-x    3 sebec  staff     96 May  5 22:56 VirtualBox VMs

左から
Permission drwxr-xr-x
Link数 3
Owner名 sebec
Group名 staff
Bytes 96
最終変更日時 May 5 22:56
ファイル名 VirtualBox VMs

Permissionの読み方はSSHの設定、秘密鍵・公開鍵の登録方法を参照

.filenameドットから始まるのは隠れファイル。ls -aでみることが可能。ls -l -aで更に詳細が見られる。-aなどのオプションは順不同。ls -laと繋げても同じ表示になる。

ls -Fでファイルタイプ別で表示できる。
/ ディレクトリー
@ リンク
* 実行可能

シンボリックリンクは実際のファイルやディレクトリーにリンクしており、リンク先のファイルがあるかのように使える。要するにshortcutとして使える。

ls -latls -latrなどで時間別にソートできる。
-tは時間別に、-rは順序逆にして確認できる。

tree -dでリストをビジュアルで見られる。
tree -C はカラーごとに見られる。

treeのコマンドが入っていない場合は、
suでパスワードを入力しrootで
yum -y install treeでインストールできます。

今後、ファイル名を作成するときはなるべくスペース[ ]を避けること。なるべく-_camelCaseなどにする。もし、スペースが入ってしまっている場合は、""や''で囲うか()を直前に使う必要がある。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む