「Linux」カテゴリーアーカイブ

Linux関連情報

Rで日本語表示 Linux(CentOS)

Rで日本語表示が出来なくって困った。
RはCentOS上で動作しています。
CentOS 6でもCentOS 7でもどちらでも対応出来たので、記録します。

対策は、フォントを追加してやればOK!
凄く簡単だった。

で、本当にそれだけなんだろうか?たまたまそれで上手く行っただけかも知れないけど。。。。(^^ゞ

やったことは以下のコマンドを実行しただけ。

全然、Rに関して書いてないけど、Rで日本語表示出来る様になったんで・・・デフォルトのフォントがこれなんですね。

おしまい(^^♪

MariaDBを外部から接続できるようにするCentOS 7

MariaDBを外部サーバからアクセスできるように設定する。

MariaDBは前回導入しましたが、外部からアクセスできるように設定を行います。

外部とは、同一ネットワーク内のサーバからのみアクセスを許可します。全公開するとセキュリティを考慮する必要が生じますので、同一ネットワーク内としています。

環境

CentOS 7.4
MariaDB 10.1

作業項目

  1. ファイアウォールでMariaDBのサービスを許可する。
  2. MariaDB内に外部からアクセスを許可するユーザを作成する。
  3. MariaDBの設定を確認・調整する。

ファイアウォール設定

ファイアウォールにMariaDBのアクセスを許可します。
以下のコマンドで設定します。

firewalldの再起動は以下のコマンドでもOK!

これでfirewalldにmysqlのサービスが許可されました。
mysqlとしましたが、MariaDBは内部にmysqlを含んでいると考えてください。そして、mysqlが許可されればMariaDBへの許可が済んだことになります。

MariaDB内に外部からアクセスを許可するユーザを作成する。

今回は、内部ネットワークなのでrootユーザと同じレベルで作成します。

前回インストールしたMariaDBであれば、これだけでOKのはずです。

私が少し躓いたのは、間に物理的なファイアウォールやUTMを配したネットワークを経由した際に、そのハードルを越えるために設定を施す必要が生じたのですが、同一ネットワーク内であれば、ルータ代わりにUTMを使っている様な下手なことをしていなければこれでつながるはずです。

MariaDBの設定を確認・調整する。

基本的には必要ありませんが、/etc/my.confや/etc/my.conf.d/で設定しているconfファイルで、bind-addressを指定している場合には、その設定を見直す必要があります。

bind-addressで指定が行われている場合、外部からアクセスするアクセス元のIPアドレスを確認して登録します。

対象ファイルは
/etc/my.conf
それ以外は以下の様に確認しました。

これで何か設定が行われていれば、以下の様に接続元のIPアドレスを追加します。

こんな感じです。

以上で完了です。

最後に確認

最後に確認方法ですが・・・・

外部のマシンから以下のコマンドを実行します。

これでアクセスできない場合には、もう一度設定をみなしましょう。
それでも接続できない場合は、ネットワークに問題があるのかも知れません。ネットワーク管理者に相談してみるのも方法かと思います。

 

CentOS 7 へMariaDB 10.1(最新)をインストール

CentOS 7 + MariaDB 最新版をインストール

2018年3月時点における環境は以下の通り。

CentOS 7.4
MariaDB 5.5

この状況ですと、MariaDBの最新版がインストールされていない状態になっています。
MariaDBには、「Galera Cluster」が提供されておりますが、10.1以降ではデフォルトで組み込まれる様になりました。
つまり、10.0までのバージョンでは個別インストールが必要となります。

また、MariaDBとMySQLのバージョン関係を見てみましょう。


MariaDBバージョン MySQQLバージョン
MariaDB5.5.x MysQl5.5
別途Galera Clusterをインストール。
MariaDB10.0.x Mysql5.6
別途Galera Clusterをインストール。
MariaDB10.1.x Mysql5.7を取り入れ、MariaDB独自機能あり。
Galera Clusterは組み込み済み。

正直、現時点でMySQL 5.5はちょっと古い。5.6もしくは5.7をインストールしたい。
デフォルトのCentOS 7ではMariaDB5.5に対応しており、MariaDB10.xをインストールするには別途独自のインストール設定を行わなければならない。

ジレンマはあるが、後々のことを考えると選択肢は新しいバージョンを適用したい。

MariaDB 10.1.xをインストールする!

旧パッケージの削除

まず、既にインストールされているMariaDB関連のパッケージを確認→削除する。

確認すると、mariadb-libsがデフォルトでインストールされているので、これを削除する。

リポジトリの準備

MariaDBの本家からインストールを行えるようにリポジトリを追加する。

以下のサイトでも紹介されています。

https://mariadb.com/kb/ja/yum/

まずリポジトリの定義を行います。
/etc/yum.repos.d/にMariaDB.repoを作成します。
内容は以下の通りです。

MariaDBをインストール

これでMariaDBをyumでインストールできる。

確認してみます。

これでインストール自体は完了です。

MariaDBの初期設定

MariaDBの初期設定を行います。
インストール直後の設定はほとんど何もされていない状態にあるようです。
そこで、インストール設定を行います。
まず、デフォルトの設定ファイルをバックアップしておきます。
#本家では推奨されているわけではないのですが、気持ち的にオリジナルを無くしてしまうのは気持ち悪いw

バックアップ出来たので、初期設定を行います。

文字コードの設定が行われていない状態なので、設定をします。
以下の項目を追記します。

取りあえず、大まかな設定は済みました。
この後は、MariaDBを起動しMariaDBのセキュア設定を行う。

MariaDBの起動

MariaDBを起動する。

注意!!

2018-06-15時点において、上記の設定方法ではMariaDBが正常に起動できません!

多分、MariaDBのインストーラーがバグっている様に思えます。

こんな感じのエラーが表示されます。更に要求されたコマンドを実行してみます。

対処方法は以下の通りです。

まとめると、こんな感じ。

なんか最初のインストールでゴミが出来てしまうのと、インストールに必要なプラグインが抜け落ちてる感じがします。
それを無理矢理、MySQLのパッケージを削除→ゴミも削除→再度インストール。。。という流れでしょうか?

最後に、MariaDBを再起動時にも起動するように設定するには、以下のコマンドを実行します。

 

セキュリティ設定

セキュリティ設定を行います。

※パスワードは適当に入力してください。

これでセキュリティ設定は完了です。

こんな感じで使えるようになります。

 

 

 

Log4cppでログファイルをローテーションする

プログラム開発でログの出力を行いたいと思います。
今回はC++のプログラムで実装してみます。

まず、なんで今更Log4cppについて記述しようと思ったか説明します。
log4cppのサンプルや記述はネット検索ですぐに見つかります。
でも、上位で検索されたサンプルには間違いがそのまま残されていて、実際に動かしてみるとローテーションは行われませんでした。
また、注意深く見てみると、設定のパラメタすら間違ったままになっているのです。
私は、そのWebサイトの間違いに過去引っかかり、無駄な時間を費やしました。なので、そんな無駄な時間を今後費やすことのないように、ここに記述します。
そちらのサイトを批判するつもりはありませんので、当該サイトのURL等については記述しません。
なお、ここの記載内容に間違いがあった場合には、お手数ですがご指摘して頂けますようお願いします。
こちらのサイトを参考にされる方には、コメント欄に指摘されている内容も含め参考にされることを期待します。
なるべく、修正は行っていくつもりですが・・・将来のことなので、ご注意ください。また、Web上の情報は参考情報です。ご利用に際しては、ご自身の責任でご利用ください。

環境

今回実装を試したのは以下の環境です。

OS:CentOS 7.4
gcc バージョン 4.8.5

 

パッケージインストール

 

プログラム

 

設定

ファイルサイズを102400バイトまでとする。
ログは最大8世代まで残す。

ざっとこんな感じ。

コンパイルは以下のコマンドで行う。

 

CentOS 7 NTP設定・・・ちょっと待て!?

こんな感じではじまった

CentOS 7で時刻同期を行おうとNTPの設定を行った。
デフォルトでインストールされているだろうと思い込んで進んだのだが、ntpdが無いではないか!?

そんじゃ・・・ということでyumにお願いしてインストールしてsystemctlをstartとenableやって、ntpqコマンドで動作確認。。。。おっ!動いた!OK(^^♪

と思ったよ!!俺でもこれくらいは出来るぞ!と、思ったよ!

しばらくして、マシンの再起動なんかもして、翌日ntpqで時刻同期はどうなってるかなぁ~なんて、楽しみに見てみたら・・・・

あれ?動いてない?systemctl enable ntpdを忘れてたの?
と再度実行して、再起動してみたものの同じ現象やん!?

やばい!いつも簡単な設定だから適当決め込んでいたのだが、不味い!!((((;゚Д゚))))ガクガクブルブル

ググったら出てきた。CentOS 7からntpdは標準ではなく、代わりにChronydが標準になったのが原因だった。
当然、デフォルトで設定されてたよw

と言うことで本題!

でもって、/etc/chrony.confを開いて以下の部分を適当に変更。

不要なサーバ設定を削除して、必要なサーバを指定(IPは適当なものに置き換えてください)して、再起動したらOKでした。

こんな感じで再起動

ちなみに、

確認はやらなくちゃ!

更に確認方法は・・・

こんな感じで表示されたらOKらしい。(表示されているのはデフォルトの状態で試した時です。)

ほんま焦りますわ(^^♪

ついでにちょっとだけコメント

ちなみに、サーバとして動作させるには、/etc/chrony.confの以下の部分を設定してあげる必要があります。

allowする相手のネットワークを必要に応じて記載することが必要です。

サーバとして動作させる必要が無ければ、この状態でOKです。

ちにみに設定変更を行ったら、サービスの再起動を行うこと!

自動機能もデフォルトで設定されている様ですが、どうしてもやりたい人は、systemctl enableで実施してください。

chronydは嫌だぁ~!って人は、chronydをdisableしてntpdを設定してあげれば良いそうです。

 

独自コマンドのサービス登録(CentOS 7)

今回は、CentOS 7上で自分で作ったプログラムをサービスとして登録する方法について説明します。

CentOS 6までとは管理の方法が異なっているため、ご注意ください。

環境はCentOS 7です。

今回のお題は

独自に作成した常駐プログラムをサービスとして登録します。
仮に、dummyというプログラムをサービスとして登録します。
dummyプログラムは単体で動作する時、常に動作状態を維持し障害や何らかの人為的操作以外で停止することが無いプログラムであると仮定します。
なんか難しく書きましたが、要は異常がない限り動き続けるプログラムを準備します。
それをサービスとして登録します。

サービス登録内容の記述

サービス登録を行うためには、設定内容をファイルに記述する必要があります。
そのファイルは以下のフォルダーへ保存します。

試しにdummyプログラムをサービスとして登録する場合の記述内容を以下に記します。

[Unit]ではこのサービスに関する説明を記しています。
Descriptionで簡単な名前を登録します。

[Service]では、以下の内容を登録しています。
Restart:always・・・サービスが停止していた場合に自動的に再起動を行います。
StartLimitInterval=60・・・①
StartLimitBurst=5・・・・・②

StartLimitInterval中にStartLimitBurst回の再起動を試みますが、それが失敗した場合には、次のStartLimitInterva時間は再起動を試みません。という設定になります。

PIDFileはPIDを出力する先を示しています。
ExecStartはコマンドの起動方法です。
ExecStopはコマンドの終了方法です。

[Install]
WanterByでは、OSの起動のセッションを指定しています。
multi-user.targetはinit 3の起動時に相当します。
他にgraphical-user.targetなどを指定することが可能です。
multi-user.targetを指定した場合、graphical-user.target時にも起動されます。これは、graphical-user.targetがmulti-user.targeをベースにしているためです

上記の設定では、プロセスが起動できない状態が発生した場合、永遠に再起動が繰り返されることになります。

また、プロセスがゴースト(defunct)になってしまった場合に、プロセス自体が残るため再起動が行われない可能性が残ります。
そういう意味では、少し問題を抱えていると思っても良いでしょう。

この解決方法については、別途説明したいと思います。

サービスの起動と終了

サービスを起動するには、通常通り以下のコマンドでサービスを起動します。

終了させるには、以下のコマンドです。

startもstopも基本的に何もエコーバックされてこないのでstatusで確認を取るのが賢明でしょう。

startさせた後に、OS起動時の登録を行う場合には以下のコマンドを実行してください。

disableすれば起動時の登録は解除されます。

課題

Systemdで登録したサービスの再起動には、先に述べた通り、プロセスがゴースト化してしまったり、何らかの異常が発生して実際の動作を行っていない場合の対処法がありません。
そんな時には、サービスとしての登録だけは行い、monitなどのプロセス監視を併用すると良いかと思います。

次回は、このDummyサービスをmonitを併用したプロセスの自動再起動をやってみようと思います。

 

QTiles/QMetaTiles Pluginで作成したタイル画像の要らない部分を削除する

QGISでタイル作成したタイル画像で不要なタイル画像を削除する方法をまとめました。
透過のみのタイル画像というよりも、1カラーだけのタイル画像を削除する方法になっています。
厳密に透過画像のみを削除したい場合には、identifyの出力内容を調整する必要があります。

QGISで簡単にタイル画像を作成しようと思って、QTilesやQMetaTilesプラグインでタイルを作成したまでは良かった。

おぉ~!タイル画像が出来てるではないか!!

と、意気揚々で「次はこれ作ってぇ~!」とかお願いしていたら・・・・
やたら時間は掛かるんだけどねw

で、しばらくお願いして放置していたら・・・

「なんかエラーが出て、出来ません。」との連絡が。

なんで?

見てみると、ディスクがパンパン(爆)

よく見ると、タイル画像が重すぎて一杯やないですか!

でも部分的に削除すると言っても・・・・と悩みながらも、透過しているだけのタイル画像は必要ないわなw

どうやって判定しようかなぁ?

ちょうど、そのWindowsマシンには下記のツールが入っていた。

  • ImageMagick
    Linuxで画像弄るなら必須アイテム。Windows版も当然ある。
  • Gow
    Linux風のコマンドを使えるようにするツール。

で、使ったのがこんなコマンド

identify

今回扱った画像には以下の条件がある。

①PNG画像
②1つのタイル画像に含まれる色は、対象物があった場合は2色以上になる。
③対象物が無い場合は透過のみとなるため、1色のみになる。

上記を整理すると、「単色のpng画像は不要」ということになる。

で、どうやってそのリストを作って削除するか・・・・

まずはWindowsでやってみた。
以下のバッチファイルを準備する。

Gowを入れると、xargsやsedなどLinux標準のコマンド類が使える様になります。sedのみを使いました。
xargsを使って渡せば簡単じゃないか!と思われますが、これがWindows側の「|(パイプ)」とxargsの相性が悪く、受け渡す標準出力を溜めこんでします様です。
その為、大量のファイルを扱う場合には、ファイルのパスがバッファに積まてしまいエラーが発生するという問題を解決出来ませんでした。

使い方はこんな感じです。

タイル画像のあるフォルダーの根元に移動してから、この以下のコマンドを実行します。

①で削除対象ファイルの削除用コマンドをrun_del.batファイルへ書き出します。
それを②で実行する。

それだけですw

せっかくここまで読んで頂いたのに済みませんが、時間にメッチャ余裕のある方や、タイルファイル数がそれ程多くない方はこれでも全然OKです。
でも、タイル数が数十万とか数百万とかになってくると、Windowsのコマンドプロンプトは使い物になりません。
Power Shellを使え?とか言わないでください。信用してませんからw

で、仕方が無いのでLinuxにファイルをコピーしてから同じことをLinux上で実施して、結果をダウンロードしてくることにしました。

下手すりゃ、ファイル共有掛けて実行してもそこそこLinuxの方が速いかも知れないのですが・・・・

確実に速かったのでこれにした。

まずは、全てのファイルを圧縮しようと思うのですが、7zを使いました。

とは言え、数百万ファイルのファイルを圧縮するには相当な時間が掛かりますし、纏まったファイルの容量もデカくて取り扱いが不便です。
こまめに分けました。

それぞれのフォルダー毎に圧縮ファイルを作成します。

これでフォルダー単位の圧縮ファイルが作成されます。

圧縮ファイルをLinuxに転送します。

転送したファイルを今度はLinux上で解凍します。

次に、以下のコマンドで透過(1つのカラーだけ)のファイルを削除します。

Windows環境でやる何倍も速く実行できます。

 

 

 

OpenSceneGraph コンパイルエラー jas_math.h

OpenSceneGraphのコンパイル中にエラーが発生した。

エラー内容は以下の通り

調べてみると、どうも/usr/include/jasper/jas_math.hに問題があるらしい。

jas_math.hファイルを一部修正することで解決するらしい。

修正内容は以下の通り。

89行目あたりの以下の部分を修正する。

こちらが修正前

こちらが修正後

 

これでコンパイルが通るようになった。

焦った〜(^^;

OpenSceneGraph インストールのyumまとめ!

OpenSceneGraphのインストールで各種パッケージをインストールするのは大変です。
対象OSはCentOS 7です。

一つ一つパッケージを確認しながらインストールしていると、何時間掛かることでしょう?

ということで、私がインストールしたyumコマンドを以下に記録しておきます。

まとめてインストールする手順を以下に記します。
前提として、gccやqtが入っていることとしますが、入っていない人のためにこんな感じです。

epel リポジトリをインストールします。

つづいてnux-dextopをインストールします。
ffmpeg関連のインストールを行うための下準備です。

そして最後に以下のコマンドで一気にパッケージをインストールします。
個人個人の好みに合わせてインストール対象を調整してください。

概ね必要そうなライブラリは全てインストールしたつもりです。

これで大分楽になるはず!

あとは、OpenSeceneGraphのソースをダウンロードして、通常どおりにコンパイルとかやれば概ね大丈夫でしょう!

では、ソースをダウンロードします。
今回は、Stable Releaseを利用します。
下記URLでダウンロードします。

https://www.openscenegraph.org/index.php/download-section/stable-releases

gitでインストールするなら、適当なディレクトリへ移動してから以下のコマンドを実行します。今回は、/homeで作業を行うことを前提にします。(cd /home で移動してください)

これで/home/OpenSceneGraphが出来上がっています。
ccmake-guiを起動します。

ccmake-gui画面で、「Configure」やって「Generate」を行います。
※エラー内容には注意すること。
※EXSAMPLEを必要とする場合には「BUILD_OSG_EXAMPLES」をチェックすることを忘れずに。

これで準備は完了!山は越えました!!
構築に入ります。

これで構築は完了しました。
データなどを揃えてお試しください。

足りないライブラリとかパッケージがあれば、どなたかコメントしてください。

このコマンドを書き換えて楽になりたいです(^^;

インストールの詳細は以前に書いた下記の内容をご確認下さい。

OpenSceneGraphをLinuxへインストールする。

OpenSceneGraphをLinuxへインストールする。(2回目)

 

 

CentOS 7におけるrsyslogの設定

CentOS 7をサーバとして、rsyslogでルータのログを残したいと思います。

/etc/sysconfig/rsyslogの設定は必要ありませんでした。
/etc/sysconfig/rsyslogの設定は、syslogd(「r」がない古い)の設定でありrsyslogdの設定ではありませんので、不要ということに気が付きました。
/etc/sysconfig/rsyslogを以下の様に編集しました。

続いて、/etc/rsyslog.confを以下の様に編集しました。

15-16行目:UDPでの受信を有効にするために、コメントを外します。
54-55行目:/evar/log/messagesへそのままログが書き込まれない様に設定する。
*.info;mail.none;authpriv.none;cron.none;local1.none /var/log/messages
この行の「local1.none」が影響するのだが、ファシリティの値が何になっているのか確認する必要がある。
ファシリティが解っていないと、情報を指定できない。
今回使用したルータはBuffaloのBHR-4GRVだったので、この値になっている。(https://buffalo.jp/php/lqa.php?id=BUF6516)
76-77行目:ログの出力先を設定する。

取りあえず、rsyslogの設定は完了したので、設定を有効にするためにrsyslogを再起動する。

※なぜか、「rsyslogd」ではなく「rsyslog」(最後に「d」が付かない)であることに注意!
ホンマに再起動しているんか?という感じで返ってくるので、心配な方はrebootしちゃってくださいw

ここまでで、rsyslogの設定は完了なのですが、届かない・・・・(TT)

なんでだろう?

ということで、ファイアウォールで止められていました(^^ゞ
/etc/sysconfig/iptablesに以下の1行を追加してください。

その後、iptablesを再起動します。

これで、ログが残る様になったはずです。

でも。。。。このままだと、ログが延々と同じファイルに書き込まれるのですわ( ;∀;)

ログのローテーションを行うには、、、、多分これで行けるはず!
/etc/logrotate.d/syslogに以下の1行を適当に追加!

どうや!?

しばらくしたら結果が解るだろう?

ということで、後は皆さん信じて待つのみです!