shioyakitaroのブログ

主にオラクルDBやLinuxについて調べたことを書いてます。

超小ネタ:VSCodeとターミナルでの挙動の違い〜バックスラッシュが入力できない?!

久しぶりの投稿。

Macを使ってUnityのプログラムをVSCodeを使って書いている際に、バックスラッシュが入力できず、どうしても円マークになる。
ただ、ターミナルだと円マークではなくバックスラッシュが入力できる。
なぜバックスラッシュが入力したかったかというと、デバッグのためのDebug.Log関数の中で文字列を改行したかったため、
\nが必要になったからである。

この現象、VSCodeの設定がおかしいために起きてしまうのかなと思っていたが、実際のところ原因は入力文字であった。

Macの入力文字を見ると

  • Hiragana
  • Romaji <-- コレ
  • Katakana
  • ABC

Romajiが選択されていた。

これをABCに変更したところ、VSCodeでも円マークではなく、バックスラッシュが入力できた。

ターミナルの場合はRomajiでも円マークではなくバックスラッシュが入力されるため原因が判明するのに少し時間がかかった。

本当に些細なことではあるが、大変大切だと思い備忘録として残した。

備忘録〜パソコンに有線キーボードがない場合にBluetoothキーボードを認識させたいとき

久しぶりの投稿。

今回は完全に備忘録として残す。Bluetoothキーボードを認識させる際の方法について。

経緯は以下の通り。

  • MacからデスクトップPCのUbuntuをリモート操作したかったが、接続できない。
  • 過去に設定した気がするが、記憶が定かではない。
  • デスクトップPCには有線のキーボードがなく、代わりにBluetoothのキーボードを持っている。
  • Bluetoothキーボードをペアリングさせたいが、単にBluetoothのUSBドングルを指すだけでは当然ながらBluetoothキーボードが使えない。

というわけで、キーボードをペアリングさせるためにMacからsshでUbuntuにログインし、ペアリングを試みた。

前提

  • MacからUbuntuにsshできること
  • Ubuntuではrootユーザーになれること

手順

MacからデスクトップPCのUbuntuへssh
macPC$ ssh <ユーザー名>@<ホスト名 or IPアドレス>
UbuntuPC$ 

# 念のため、Bluetoothのドングルが認識されていることを確認(今回はUSBドングルなのでlsusbで確認)
UbuntuPC$ lsusb
...
Bus 001 Device 005: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)  <-- コレ
...
Bluetoothキーボードをペアリングする。これをする際、rootユーザーで実施しないといけないので注意。
# root ユーザーにスイッチ。rootユーザーのパスワードが分かる場合は su - でも良い。
UbuntuPC$ sudo su -

root@UbuntuPC# bluetoothctl
...
[NEW] Device 21:20:01:05:C6:C5 Bluetooth 3.0 Keyboard  <-- コレ
...
Agent registered

# 接続する
[bluetooth]# connect 21:20:01:05:C6:C5
Attempting to connect to 21:20:01:05:C6:C5
[CHG] Device 21:20:01:05:C6:C5 Connected: yes
[CHG] Device 21:20:01:05:C6:C5 Paired: yes
Connection successful

これでBluetoothキーボードが使えるようになる。

最後に:
画面共有の手順は以下を参考にすると良い。
usado.jp

以下をUbuntu側でやるのを忘れずに。

$ gsettings set org.gnome.Vino require-encryption false 

Vimテク:INSERTモードのままカーソルを移動したい時の設定

お久しぶりです。

僕はインフラエンジニアとしてキャリアをスタートしたため、普段もテキストエディタはVimを使用しています。

ここ最近、必要に駆られてプログラミングの勉強をしている時に、それは主にサンプルプログラムの模写だったんですが

INSERTモードのままカーソルを移動したい

という思いが芽生えました。

というのも、たとえばプログラミングの時には、よく関数の構文で、引数を括弧で囲うことがあると思うのですが


この時に、括弧を閉じ忘れないように、括弧を書く時には()を先に入力して、そのあと中身を記述するようにしてました。

ただ、このやり方だと、いちいち括弧がくるたびに、以下の手順を踏まないといけなくなります。

  1. Escしてノーマルモードにする
  2. カーソルが)の上にくるため、続いてiを入力しINSERTモードにする


つまり、括弧を二つ書いた後に、中身を書き始めるために2ステップ必要になります。

この2ステップを何度か繰り返していると、さすがに

INSERTモードのままカーソルを移動させたい

と思い始めました。

たくさんのクラス、メソッド、その度毎に登場する引数、囲う括弧

もう耐えることはできませんでした。

INSERTモードのままカーソルを移動させることができれば2ステップは1ステップに減りますし

たとえ1ステップでも、2ステップからの1ステップは半分だし

塵も積もれば山となるので、ステップを減らしたい、そう思いました。

というわけで調べた結果、以下を設定ファイル(~/.vimrc)に書き込めば良いことが分かりました。

imap <C-p> <Up>
imap <C-n> <Down>
imap <C-b> <Left>
imap <C-f> <Right>

引用元:qiita.com



なお、今回の僕の希望が左右のカーソル移動だったこと、Ctrl+pではデフォルトの入力補完機能を使いたかったことから

僕は上記の下二行のみを記述して使っています。

Vimを使用されている方にはおすすめです。時は金なり。

以上、Vimテクでした。

PDBではデフォルトのDATA_PUMP_DIRは使用できません

オラクルDBのマルチテナント環境ではまったので備忘録として記しておく。

Oracle RAC環境からデータポンプでエクスポートしたデータを、マルチテナント環境のPDBにデータポンプでインポートしようとした際にエラーが発生。

ディレクトリオブジェクトにDATA_PUMP_DIRが存在しているのにも関わらず

そこにダンプファイルを置いて、ディレクトリオブジェクトにDATA_PUMP_DIRを指定してもディレクトリオブジェクト関連のエラーでインポートができない。

ディレクトリオブジェクトへの書き込み、読み込み権限を付与してもエラーは変わらず。

調べたところ、公式ドキュメントを見ると次の一文が

デフォルトのデータ・ポンプ・ディレクトリ・オブジェクトのDATA_PUMP_DIRは、PDBでは使用できません。エクスポートまたはインポートするPDB内に明示的なディレクトリ・オブジェクトを定義する必要があります。

Oracle Data Pumpの概要

にしてもエラー内容が分かりにくい。使えないなら上記のメッセージを表示してほしいものである。

小技:tnsnames.oraにおけるネットサービス名の一覧確認コマンド

どうも。

今回はoracleのネットサービス名の一覧確認コマンドを書いておきます。

エントリ数が多い場合に便利です。ってこんなのいちいち検索しなくてもコマンド書いてると思いますが

ちょっと何かしらアウトプットしたくなったので書いておきます。

oracle$ cd $ORACLE_HOME/network/admin
oracle$ cat tnsnames.ora | grep -v "^ " | grep -v "^$" | grep -v "^#" | sed -e "s/=//" | sort

以上。

備忘録:Oracle RACのリスナー周りの関係と値指定のメリット

さてさて、今回はOracle RACのリスナー周りの関係について理解したことを備忘録として書く。

環境
OS : Oracle Linux Server release 6.9
DB : Oracle RAC
リスナー:SCANリスナー、アプリケーション用にデフォルトリスナー同様net1に別にリスナーを立てているケース

事前知識

Oracle RACにおいては、
値を設定していなくてもリスナーの情報が下記パラメータに自動的に登録される。

パラメータ名:登録される情報
local_listener : net1のリスナーの情報(デフォルトリスナーなど)
remote_listener : SCANのホスト名:ポート番号
listener_networks : net2のリスナーの情報

DB起動時にはこれらのリスナーに動的にサービスが登録される。
良しなにやってくれるし、これらのパラメータには値を設定しない方が良いのだろうか。

値未指定で良い?

値は指定した方が良いというのが持論。今のところ理由は二つ。

理由1:自動登録の失敗の可能性

リスナー数が多くなっていった際にALTER SYSTEM SET文で指定可能な文字数(255文字)を超えるとOracle Clusterwareによる自動登録が失敗する。

理由2:リスナーで受け付けるサービスが汚くなる

複数DBを同一サーバー群で構成すると、それらすべてのリスナーの情報が登録されてしまう。

たとえばDB1とDB2を同一サーバー群で運用する場合、かつリスナーを分ける場合、
net1に属するリスナーがそれぞれ存在するとき、両方の値がlocal_listenerに登録され、
同様にnet2に属するリスナーがそれぞれ存在するとき、両方の値がlistener_networksに登録される。

結果として、それぞれのリスナーに、すべてのDBのサービスが登録されてしまう。これは気持ち悪い。

最後に

運用上、ネットワーク的にもアプリケーション用、管理用にNICを分ける場合が多いと思うので
リスナーもそれぞれ存在するケースが想定される。上記の持論が助けになれば幸いである。
なおこれらのパラメータ、何も設定しなければDB起動時のアラートログを見れば分かる通り
システム側でalter system XX SCOPE=MEMORY文を発行して値を登録しているのだが
上記パラメータのどれかがspfile等に値が設定されているとシステム側では自動で設定しなくなる。
僕はlocal_listener,listener_networksに値を指定し、DB再起動をした際にremote_listenerに値を指定しなかったために
SCAN経由でのDB接続ができないという事態になった。個人的にはこれを気をつけたい。

最後の最後に

いくつか知識不足で理解がおかしい場合はご指摘いただきたい。優しければなおよし。

ifup後に静的ルーティングの設定が反映されない原因調査

久しぶりの更新。今回はifup時の静的ルーティング設定について書く。

背景

/etc/sysconfig/static-routesファイルに静的ルーティングの記述があっても
ifdown / ifupをすると静的ルーティングの設定が反映されない

環境:Oracle Linux Server release 6.9

原因

static-routesファイルの設定を反映させるには
ifup後にnetwork restartを実施する or OS再起動が必要だった。
つまりifupの際にstatic-routesファイルは読み込まれない。


なお、Oracle Linuxのドキュメントではroutes-デバイス名ファイルに記載するよう書かれていた。
https://docs.oracle.com/cd/E37670_01/E41138/html/ch11s07.html


To permanently configure static routes, you can configure them by creating a route-interface file in/etc/sysconfig/network-scripts for the interface.



このroutes-デバイス名ファイルに記載するとifup後に設定が反映される。

なお、network restartでstatic-routesファイルが反映されるのはnetworkコマンドの中身を見れば一目瞭然。

root# cat network | grep static
	# Add non interface-specific static-routes.
	if [ -f /etc/sysconfig/static-routes ]; then
	   grep "^any" /etc/sysconfig/static-routes | while read ignore args ; do
	# Add non interface-specific static arp entries.
root#

過去にifup/ifdownとifconfig up / ifconfig downコマンドの挙動の違いに驚いたことがあったが、またしてもifup/ifdownコマンドの挙動について知見を深めることができた。