サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
画力アップ
taiyo.hatenadiary.org
目的 Linux上のプロセスの同期待合せ処理として、処理がシンプルなFIFO(名前付きパイプ)を使いたい。 やりたいことは、μuITRONのイベントフラグ相当の処理。 外部仕様を書くと、 書込み側はいつでも書き込め、読み出し側のopenを待たずに次の処理を続ける 読み出し側(待つ側)は書き込み側よりも前にopenしても良い 書き込みデータがロストしない これが実現できるか、Linux 上での FIFO の動作仕様を確認する。 結果 FIFO作成後、一旦ダミーでO_NONBLOCKフラグを付けてopen()しておく(openしっぱなし) 書き込み側は O_RDWR|O_NONBLOCK の flag でopen()してwrite()する 読み込みは、普通にopen()してread()する という役割分担にすれば良い。 以下、詳細。 FIFO の man page fifo(4) には以下の記
目的 以下の条件に合うように、 特定ドメインのアドレス(jp.example.com)宛のメールはサーバ1に送る。 それ以外のメールはサーバ2に送る。 以下のメールサーバ(MTA)で、メール送信時のSMTP接続先を指定したい。 sendmail (RHELのデフォルトメールデーモン) postfix exim ※なぜこの3つかというと、RHELが想定しているMTAがこの3つだから(参考: Product Documentation for Red Hat Enterprise Linux 8 - Red Hat Customer Portal; system-switch-mail コマンドで切り替え可能)。 結果 MTAの設定変更で実現できた。 MTA 特定ドメインのアドレスの接続先 それ以外のメールの接続先 sendmail(FC使用) mailertableファイルで設定 sendm
目的 sshでリモートホストでコマンドを実行するときに、PATHやその他の環境変数を設定して実行したい。 例えば、勝手にコマンドのバージョンアップができない重要なサーバで、自分のホーム以下にインストールしたコマンドをssh経由で実行したいのだが、PATHが/usr/local/binなどにしか通っていなくて困っている。 結果 sshdの設定変更 (PermitUserEnvironment=yes)、sshd再起動 ~/.ssh/environment に環境変数を書く (VAR=VAL 形式で一行一変数で) ※ "~" や "$" の置換はしてくれないので、PATHを書くときはフルパスで書くこと。 ※ ~/.ssh/rc に書いてもダメです 以下、詳細。 sshのmanによると… sshd(8)の "LOGIN PROCESS" の項目によると、sshでログインした時の処理順序は、以下:
目的 GNU make の関数 $(filter-out) の使い方をメモしておく。 結果 filter-outを使うと、変数内の特定の単語を、完全一致/前方一致/後方一致で取り除くことができる。 以下、詳細 filter-outとは GNU Makeのmanual(GNU make: Text Functions)を参照すればまあ書いてあるのだが、textからwordにマッチしない要素を取り出す関数。text, wordともにスペース区切りで複数要素を指定可能。 たとえばMakefile中のCFLAGS指定などで、 CFLAGS = -O2 -c -fomit-frame-pointer -fstrength-reduce などと指定されている時に、CFLAGSは流用したいけど、最適化はオフにしたい(-O2オプションはいらない)、という場合に使用する。 なにができるのか、試してみる fi
目的 Linux上(UNIX全般)で「安全な」シグナル処理を実装したい。 本来シグナルハンドラでしてもよい処理は非常に限られており、実質は特定の型のグローバル変数操作と、非同期シグナルセーフ関数の呼び出ししか安全ではない(参考:UNIX上でのC++ソフトウェア設計の定石 (2) - memologue)。 この条件を守ったうえで、多用な処理をするシグナルハンドラを実装したい。 結果 別途、pipeとスレッド(メインスレッドでも良い)を用意して、 シグナルハンドラ: 受け取ったシグナル情報をpipeにwriteするだけ 別スレッド: pipeをreadしてその後の処理を実行 という役割分担にすれば良い。 以下、詳細。 「非同期シグナルセーフ」な関数 System Interfaces Chapter 2にあるように、非同期シグナルセーフな関数は、確かに少ない。 シグナルハンドラ内では使わなそ
目的 ある実行ファイルの動作に、どの共有ライブラリが必要かを把握したい。 ストレート環境であれば /bin/ldd を使えば良い(BINARY HACKS, HACK #7 を参照)のだが、クロス環境だと一々実行するのが面倒臭い。 一括で、必要なライブラリ一覧を得る方法は無いか。 結果 readelfを使って、elf の dynamic section から SONAME と NEEDED を抜き出して、依存関係を(再帰的に)把握するスクリプトを作成した。 lsso https://sssvn.jp/svn/spikelet/utils/lsso 依存関係といえば有向グラフ、有向グラフといえばGraphviz(Graphviz - Graph Visualization Software)なので、Graphviz形式での出力も可能にした。 実行例は、詳細の最後の辺を参照。 以下、詳細。 背
目的 "getopt"は、Cライブラリもコマンド版も、どちらも使い方を覚えにくい。 ここでは、コマンド版 "getopt" と、sh/bash built-in の "getopts" の使い方をまとめる。 結果 sh/bash built-inのgetoptsが使える場合は、そちらを使った方が良い。 外部コマンド getopt 使用時は、クォート処理に気をつける。 速度的には、getoptとgetoptsどっちでも大して差はない。 getopts.sh https://sssvn.jp/svn/spikelet/sh/getopts.sh getopt-o.sh https://sssvn.jp/svn/spikelet/sh/getopt-o.sh 以下、詳細。 getopt を使う(クォート考慮なし) getopt(1)を参考にしつつ、素直に作成。 getopt.sh https:/
目的 #ifdefが複雑にネストしているCソースファイル中で、どの部分が有効かを簡単に調べたい。 背景と動機については id:taiyo:20080202#p1 などを参照。 結果 C FAQ(Question 10.18)で紹介されている3つのツールと、手元にあったツール1つを試した。 名前 処理可能なディレクティブ 処理方法 感想 rmifdef #ifdef, #ifndef, #else 不明(バイナリ配布) 判定対象が狭く、あまり使い出がない unifdef #ifdef, #ifndef, #else 独自の文字列処理 出力エラーでソースが乱れるのが致命的 scpp 全ディレクティブ lex&yac マクロ展開までされるのと、#if 0を処理しないのがやっかい pcpp 全ディレクティブ 不明(バイナリしか持ってない) 不都合は今のところみつからず pcppが、機能面では不満が
目的 id:taiyo:20080401#p1 を参照。 結果 ~/.gemrc に、以下の設定を記述する(大文字の箇所は記入例、各自で変えること): http_proxy: http://4000000:PassWord@abcproxy.examlple.com:8080 ※PassWordに英数字以外が含まれる場合はURLエンコードが必要 もちろん、~/.gemrc のパーミッションは 600(自分のみread/wriet可) にしておくこと。 gemの仕様 gemのドキュメントやウェブ上の情報ではみあたらなかったので、ソースを読んでみる。 rubygemsの下のremote_fetcher.rbにて、Gem::RemoteFetcherクラスがウェブアクセスを処理するのだが、プロキシ情報の受け取り方は以下のようになっている。 環境変数 http_proxy, http_proxy_
目的 id:taiyo:20080401#p1 を参照。 結果 リポジトリにhttpsでアクセスする場合のみ可能(httpアクセスは、プロキシサーバがPROPFINDメソッドを許可していないため、不可能)。 ~/.subversion/servers に、以下の設定を記述する: [groups] external = sssvn.jp, svn.ruby-lang.org [external] http-proxy-host = abcproxy.examlple.com http-proxy-port = 8080 http-proxy-username = 4000000 http-proxy-password = PassWord ssl-trust-default-ca = yes ファイルのパーミッションも適切に。 ※外部にあるリポジトリにしかアクセスしない場合は、"[globa
目的 id:taiyo:20080401#p1 を参照。 結果 セキュリティ面(秘匿性)を考慮すると、~/.wgetrc に、以下の設定を記述するのが良い: use_proxy = on proxy_user = 4000000 proxy_passwd = PassWord http_proxy = http://abcproxy.examlple.com:8080 https_proxy = http://abcproxy.examlple.com:8080 ftp_proxy = http://abcproxy.examlple.com:8080 もちろん、~/.wgetrc のパーミッションは 600(自分のみread/wriet可) にしておくこと。 wgetの仕様 wgetのinfo(info wgetで表示)に書いてある: コマンドラインオプションとして、以下が指定可能 ("
目的 社内プロキシを経由して、各種のネットワークアクセスツールを使いたい。 条件は以下: 社内プロキシは認証が必須 SOCKSなどは提供されておらず、proxoyサーバのアカウントも持っていない 外部の中継サーバは使わないものとする 結果 ツール名 状況 概要 備考 wget 成功 設定ファイル(~/.wgetrc)に記述 gem(RubyGems) 成功 設定ファイル(~/.gemrc)に記述 subversion 成功 設定ファイル(~/.subversion/servers)に記述 https経由のみ成功、httpとhttp+sshは不可 cvs 失敗 別途ツール(CVSGrab)で Web UI経由でのダウンロードはできるはず(未成功) 詳細は、以降のエントリを参照。 なお、例として以下を使う: プロキシサーバ: abcproxy.examlple.com プロキシポート: 808
このページを最初にブックマークしてみませんか?
『spikelet days』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く