20200124のLinuxに関する記事は5件です。

cursesで日本語が文字化けするときの対処法

Linux環境でC言語でcursesを使ったときに、日本語が文字化けするときがあります。そんなときは、locale.hをインクルードし、setlocale関数でロケール情報を設定します。

Main.c
#include <curses.h>
#include <locale.h>

int main()
{
  setlocale(LC_ALL, "");

  initscr();
  printw("ああああ");
  refresh();
  getch();
  endwin();
  return 0;
}

コンパイルする際には、以下のようにオプションを指定します。

$ gcc Main.c -lncursesw

ncurseswとはワイド文字に対応したncurses(new curses)という意味です。
コンパイルエラーが発生する場合は、ncurseswをインストールする必要があります。
Debian / Ubuntu

$ sudo apt-get install libncurses5-dev libncursesw5-dev

RHEL / CentOS

$ sudo yum install ncurses-devel

無事に実行できたら、画面にきちんと文字が表示されていることを確認してください。いずれかのキーを押すとプログラムを終了します。
それでも文字化けが直らない場合は、ソースコードがUTF-8でエンコードされているかを確認してください。もしShift-JISを使っている場合は、UTF-8に変換してみてください。

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

ゾーンファイルのIPアドレスの間違えを修正したもののDNSサーバに繋がらない時の対処

ゲストOS:centos7
ホストOS:MacOs
webサーバ:apache
DNSサーバ:BIND

インフラ関連について自主学習している初学者です。サーバ構築中に上手く動作せず、少し苦労したので備忘録として投稿します。
用語の使い方など間違っていたらすいません。

 問題発生の流れ

virtualbox上のcentos7上でwebサーバを立ち上げDNSで名前解決させる。
BINDでDNSサーバ構築し、apacheでwebサーバを構築した。
ブラウザから接続確認するために、ホストOSのDNSサーバをcentosの/etc/resolv.confに記述しているIPアドレスに設定。curlコマンドでアクセスするも繋がらない。

 解決までの道なり

上手く動作しない場合、レイヤ層順に調べて原因追究すべし!と以前会社で習ったので、その通り調べました。

①ホストOS上からゲストOSへ通信できるのかを確認
ターミナル 上(MacOS)で以下のコマンドを実行。
ping (centosのIPアドレス)
PING centosのIPアドレス (centosのIPアドレス): 56 data bytes
64 bytes from (centosのIPアドレス): icmp_seq=0 ttl=64 time=0.431 ms
64 bytes from (centosのIPアドレス): icmp_seq=1 ttl=64 time=0.390 ms
64 bytes from (centosのIPアドレス): icmp_seq=2 ttl=64 time=0.543 ms
^C
--- (centosのIPアドレス) ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.390/0.455/0.543/0.065 ms
以上からつながっていることを確認。

②firewallが止まっているかを確認。
systemctl status firewalld
止まっていた。

③DNSサーバに問題があるのか確認。
ターミナル 上で(MacOS)以下のコマンドを実行。
nslookup www.example.com ←設定したドメイン
設定したIPアドレスが出てこなかった。

DNSサーバに問題があると確認が取れたため、ゾーンファイルを再度見直すとAレコードのIPアドレスが間違っていた。修正して、serviceを再起動。
nslookup www.example.com
再度上のコマンドを入力するとIPアドレスが表示されたため、DNSサーバが上手く動作した。

④さらに問題。
最終確認のためcurlコマンドでアクセスするも繋がらない。問題は他にもあると考えて次にwebサーバを確認する。
http.confなどの設定ファイルを全て確認するも問題はない。
再度繋がるか確認。
・curl www.example.com
このコマンドは繋がらない
・curl (centosのIPアドレス)
このコマンドでは繋がることが出来た。

⑤MacのDNSにキャッシュが残っているのではないかと思い、キャッシュを削除することに。
以下のコマンドを実行。
sudo killall -HUP mDNSResponder

再度確認。
curl www.example.com
webサーバに用意していたhtmlファイルを表示することができた!!

まとめ

今回の場合、MacのDNSにキャッシュが残っていることを気づかなかったため、レイヤ層順が少し前後してしまい原因追究が遅れてしまった。この一件でレイヤ層を意識して一つずつ着実に原因を無くしていくことでスピーディな解決ができると学んだ!次にいかす!!

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

LinuxサーバにGitの最新バージョンを導入する

はじめに

  • Linuxで(Linuxに限らずだけれど)Gitをパッケージインストール(yum install gitなど)すると,古いものしか入らない.
  • バージョンアップしやすい形で最新版をインストールする方法を記述する(他の人も同じこと書いてるけれど,参照しやすいように).
  • 参考サイト

作業の手順

# 事前に時刻合わせをしておかないとエラーになる可能性がある

# 依存ライブラリをインストール
sudo yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker gcc

# Gitをインストール(今回はここで入れたgitは後でアンインストールする)
sudo yum -y install git

# rootにスイッチ
sudo su -

# 以下の作業はすべてrootで実行.

# ソースディレクトリまで移動
cd /usr/local/src/
# 公開されているgitのソースをインストール(この作業のために上記でGitをインストールした)
git clone git://git.kernel.org/pub/scm/git/git.git

# パッケージインストールしているgitをアンインストール
yum remove git

# ディレクトリ移動
cd git

# makeする
make prefix=/usr/local all
make prefix=/usr/local install

これ以降、最新バージョンが公開されるたびに、git pullしてmake~すれば最新バージョンにアップデートできる.

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

logrotate対象に、ある文字列「ではない」ファイルを指定したいのですけど、ひょっとして不可でしょうか

やりたいこと

logrotate の設定ファイルで、下記のように指定したい。

/etc/logrotate.d/nanika_no_service
/var/log/nanika_no_service/【"aiueo" から始まるログ以外】.log {
    monthly
}

/var/log/nanika_no_service/aiueo.log {
    daily
}

調べてみた結果

無理っぽい。
やむをえず、下記で妥協。

/etc/logrotate.d/nanika_no_service
/var/log/nanika_no_service/[!a]*.log {
    monthly
}

/var/log/nanika_no_service/a*.log {
    daily
}

理由

https://github.com/logrotate/logrotate/blob/master/logrotate.c
https://github.com/logrotate/logrotate/blob/master/config.c

ソースコードによると、rotate するファイルの探索にはglobを使っているようです。
でもって、globの仕様も読んでみたのですが、「単一文字以外」のワイルドカードの案内はあれど、「複数文字以外」の書き方はありませんでした。

そんなわけで、logrotate.conf のファイル指定では

/var/log/nanika_no_service/【"aiueo" から始まるログ以外】.log {
    # 略
}

上記のように書けない、というのが、今のところの結論です。
うまい方法はないものでしょうか。

経緯

同じディレクトリにあるログで、1種類のログだけ別条件で rotate したくなりました。それで調査したというわけです。
上の例だと aiueo.log が、それに当たります。

でも、ちょっと待ってください。[!] を使わず下記のように書けばいいのではないでしょうか。

/etc/logrotate.d/nanika_no_service
/var/log/nanika_no_service/*.log {
    monthly
}

/var/log/nanika_no_service/aiueo.log {
    daily
}

そうですね。僕もそう予想しました。
ですが残念なことに NG です。

logrotate 設定では、重複があると上手く動作しません。上記のようにしてしまうと、aiueo.log*.log にも含まれ、設定に重複があります。
このような条件だと、実行時にエラーになるか、aiueo.log*.log の設定に従ってしまいます (設定順によって変わりますが、どの並びがどの動作になるかは、ちょっと忘れました)。

おわりに

この投稿では、logrotate の対象ログ指定で、「複数文字以外」の表現ができないか調べました。
残念ながら、今のところ実現方法を見つけられていません。

それではごきげんよう。

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

「procs:新しいプロセス表示・検索ツール」の更新紹介

はじめに

ちょうど1年ほど前に「procs:新しいプロセス表示・検索ツール」の初期バージョンを公開しました。その後54回のリリースを経て、昨日v0.9.0になりました。
ちょうどきりがいいのでこの1年間のアップデート内容をまとめて紹介します。

特徴

procsはpsコマンドの代替となるプロセス一覧の表示ツールです。主な特徴は以下の通りです。

  • 色・単位付きの表示
  • キーワードによる絞り込み
  • psで表示できないカラムに対応
    • TCP/UDPポート
    • ディスクのRead/Write速度
    • Dockerコンテナ名
  • ページャ対応
  • topのような定期更新モード
  • ツリービュー

55446704-ab43a480-55fb-11e9-81dc-e3ac1a1e2507.png

アップデート

Linux版の大幅な高速化

これは高速化を頑張ったというより異常に遅い箇所を見過ごしていたものです。最近気づいて修正したところ10倍ほど高速化しました。
体感できるレベルの差があるので、古いバージョンをご利用の方は最新版へのアップデートをお願いします。

macOS/Windows対応

初期リリースではLinuxのみ対応でしたが、macOSとWindowsにも対応しました。ただしLinux版より表示できるカラムが若干少なくなっています。

各種パッケージ提供

いくつかのパッケージマネージャに対応して簡単にインストールできるようになりました。

  • Nixpkgs
  • snapcraft
  • homebrew
  • Alpine Linux
  • Cargo

具体的なコマンドはこちらにまとまっています。

新しいカラム

psに存在しないカラムをいろいろ追加しました。一覧はこちら
個人的にはDockerコンテナ名表示をよく使っています。

55446681-91a25d00-55fb-11e9-943d-5b5caeb23c62.png

ページャ対応

出力をページャ(デフォルトはless)に通すようにしたので狭い画面でもスクロールするなどして見やすくなりました。
パイプを通す場合は自動で無効化されます。

定期更新モード

topコマンドのように定期更新されるモードを追加しました。
procs -w 10で10秒ごとに更新されます。
キー入力でソートするカラムを変更できることもできます。

ツリービュー

プロセスの依存関係をツリーで表示することができます。

55446692-9ff07900-55fb-11e9-8b66-a8432df0a8e1.png

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