[Unix] grepコマンドを使って、ファイル中の文字列出現回数を調べる

開発中のウェブアプリでは、ユーザのログイン履歴を日別にテキストファイルに記録している。だけど、残念ながら集計機能はまだ出来ていない。そんな状況で、「あるユーザが何回ログインしたか」をカウントしたいというニーズあり。

日別のログファイルは同じディレクトリに格納されているので、grepコマンドでユーザ名を検索すればよさそうだ。

調べてみたら、-c オプションで「検索条件にマッチした行数」がカウントできることが解ったので覚え書き。

実行結果

Linuxコマンド集 – 【 grep 】 文字列を検索する:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230786/

[Unix] cpコマンドを使って、できる限り属性やディレクトリ構造を保持してコピーする

任意ディレクトリへのシンボリックリンクを含む、多数のファイルやサブディレクトリを格納したディレクトリを複製したい。目的は作業環境のバックアップ。元ディレクトリの操作を誤ったとき、それを削除して複製しておいたディレクトリの名前を変えれば元の状態に戻せるようにしたい、というわけ。

ディレクトリ構造を保持したまま、シンボリックリンクを「シンボリックリンクのまま」コピーするにはどうしたらいいんだろ?

調べてみたらcpコマンドの -a オプションが使えることが解ったので覚え書き。

[コピー元]の所有者などの属性、 パーミッション 、 ディレクトリ構造、 シンボリックリンク など、 「コピー可能なファイルでコピー可能なものを、可能な限りコピー元の情報をそのままるコピーする」 オプションです。

◇ディレクトリとファイルのコピーと移動◇初心者のためのLinuxサーバー構築講座(CentOS 自宅サーバー対応)☆お便利サーバー.com☆
http://www.obenri.com/_command/cp01.html

Linuxコマンド集 – 【 cp 】 ファイルやディレクトリをコピーする:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230734/

[PHP] Windows版PHPのsymlink()の挙動について

Windows版PHPでsymlink()が常にエラーになるという現象に直面。

たとえば以下のようなPHPファイルをブラウザから実行すると

以下のようなエラーメッセージが表示される。

$tergetは絶対パスの必要があるようで、相対パスで指定するとerrno 2が返る。$linkは絶対パスでも相対パスでもエラー内容は変わらない。

symlink()のサポートはWindowsのバージョンによるらしい

PHPのマニュアルには以下の記述があるが、自分の環境はWindows 7なので該当しない。

注意: Windows ユーザーは注意しましょう。この関数が動作するのは、Windows Vista/Windows Server 2008 以降で PHP を動作させている場合のみです。それより前のバージョンの Windows では、シンボリックリンクをサポートしていません。

PHP: symlink – Manual
http://php.net/manual/ja/function.symlink.php

symlink()の実行には管理者権限が必要らしい

エラーメッセージに含まれるエラーコードを調べると「特権が無い」ということらしい。

ERROR_PRIVILEGE_NOT_HELD
1314 (0x522)
A required privilege is not held by the client.

System Error Codes (1300-1699) (Windows)
http://msdn.microsoft.com/en-us/library/windows/desktop/ms681385(v=vs.85).aspx

試しに、管理者で実行したコマンドプロンプトから実行したみたところ、スクリプトは正常終了した。普通に(管理者としてではなく)実行したコマンドプロンプトではエラーとなる。というわけで、どうやらsymlink()の実行には管理者権限が必要らしい。

XAMPP環境でsymlink()を使ったスクリプトをテストする場合には注意が必要だな。

[PHP] ブラウザへファイルを送出する

ブラウザから直接アクセスできないディレクトリにあるファイルをブラウザへ送りたいニーズあり。

たとえば、セキュリティを担保するためにブラウザから直接アクセスできないディレクトリに置いてあるファイルを、ブラウザから認証を経由して取得できるようにしたい場合など。ファイルへ直リンできないので、意図的にファイルの内容を送出するスクリプトを書く必要がある。

サンプルコード

このサンプルでは、ファイルの内容を添付データとして送出しているので、ブラウザは保存先を聞いてくる。

[PHP] 月の末日を取得する

月の末尾 (最後の日) を取得するニーズあり。調べたところ、PHPの標準機能を使って簡単に取得できることがわかったのでメモ。

サンプルコード

format文字 説明 戻り値の例
t 指定した月の日数 28から41

参考サイト

PHP: DateTime::format – Manual
http://php.net/manual/ja/datetime.format.php

PHP: date – Manual
http://php.net/manual/ja/function.date.php

[PIC] パルスジェネレータを作る

開発中のボードを評価するために60~600Hzのパルスが必要になったので、PIC評価ボード「LAB-X1」でパルスを生成してみる。

パルス生成にハードウェアPWMを使う

パルス生成にはPICに搭載されているPWMを使う。手持ちのPIC16F877Aの場合、CCP1(PORTC.2)とCCP2(PORTC.1)の2チャンネルのPWMが利用可能。PBPのマニュアルによると、周波数の上限はクロックに関わらず32767Hz、下限はクロックに依存して下図の通り。

OSC 14-bit Enhanced 14-bit PIC18
4MHz 245Hz 62Hz 245Hz
8MHz 489Hz 123Hz 489Hz
10MHz 611Hz 153Hz 611Hz
12MHz 733Hz 184Hz 733Hz
16MHz 977Hz 245Hz 977Hz
20MHz 1221z 306Hz 1221Hz

この表によると、命令長14ビットのPIC16F877Aだと4MHzクロックでも下限は245Hzである。必要としている周波数は60~600Hzだけど、ハードの制限ならば仕方ない。245~600Hzのパルスを発生できるように要件を変更する。

サンプルコード

以下のサンプルコードでは、LAB-X1上のポテンショメータ(POT1)で周波数を245Hzから600Hzまで可変させて、チャンネル1のPWMで50%デューティのパルスを生成している。

動作確認のため、生成したパルス(PORTC.1)を別ポート(PORTB.6)に入力してパルス幅を測定してLCDに表示させてみた。パルス幅測定用の組み込みルーチンPULSINは、4MHz OSCだと10マイクロ秒単位のパルス幅を読み取って返す。読み取ったパルス幅から逆算すれば、指定した周波数のパルスが生成できているかどうか確認できるはず。

[PIC] melabs製のPIC評価ボード「LAB-X1」の概要

関係先からmelabs製のPIC評価ボードが提供されたので概要を理解しておく。

外観

melabs-LAB-X1

microEngineering Labs Online Store: LAB-X1 Experimenter Board (Assembled)
http://store.melabs.com/prod/boards/LABX1A.html

特徴

  • 入力: 16スイッチキーパッド、3 x ポテンショメータ、IR、温度、リアルタイムクロック
  • 出力: LEDバーグラフ、2×20 LCDモジュール、スピーカー、DTMF、PWM、IR、2 x RCサーボコネクタ
  • I/O: RS232インタフェース、RS485インタフェース
  • シリアルEEPROM: IC2、SPI、Microwire
  • その他: リセットボタン、5Vレギュレータ、PICmicro MCU用の40ピンZIPソケット
  • ジャンパで選択可能な4MHzから20MHzの発信器
  • インサーキットプログラミング/デバッグコネクタ
  • 追加回路用のプロトタイピングエリア
  • サイズは5.5×5.6インチ

標準版に含まれるもの

  • PICmicro MCU用の40ピンZIFソケット
  • 5Vレギュレーター
  • ジャンパで選択可能な4MHzから20MHzの発信器
  • リセットボタン
  • 16スイッチキーパッド
  • ポテンショメーター x 3
  • LEDバーグラフ
  • 2行20列LCDモジュール
  • スピーカー
  • RCサーボコネクタ x 2
  • RS485インタフェース用ソケット
  • I2CシリアルEEPROM用ソケット
  • SPIシリアルEEPROM用ソケット
  • MicrowireシリアルEEPROM用ソケット
  • リアルタイムクロック/シリアルA/Dコンバータ用ソケット
  • Dallas 1620/1820温度IC用ソケット
  • EPICインサーキットプログラミングコネクタ
  • Microchipインサーキットデバッグコネクタ用のワイヤーリング
  • 追加回路用のプロトタイピングエリア

PICのプログラミングは、同社製U2 Programmerを接続してパソコンからUSB経由で行う。

melabs-LAB-X1

この基板1枚でいろんな実験ができそう。

参考サイト

melabs – Support Documents
http://melabs.com/doclist.htm#X1

mebals – PICBASIC PRO Compiler Example Programs
http://melabs.com/samples/index.htm

[C#] 画像のシャープネスを強調する (精鋭化)

ラプラシアンフィルタを使ったコンボリューション (畳み込み演算) 行うことで、手っ取り早く画面のシャープネスを強調することができる。

ラプラシアンフィルタに関しては以下ページがわかりやすい。

フィルター処理
http://www.gifu-nct.ac.jp/elec/yamada/iwata/filter/

サンプルコード

以下の関数では、画像に4近傍精鋭化フィルタを適用している。適用度合いは引数で指定できるようにし、0.0だとシャープネス強調無し、1.0で強調最大となる。

実行例

0012

左からレベル0,0、0.5、1.0

[C#] 画像のガンマを調整する

ImageAttributesクラスには、ガンマ値を指定して画像を補正する機能がある。

gamma パラメーターは通常、1.0 ~ 2.2 の範囲の値です。ただし、状況によっては、0.1 ~ 5.0 の値が有効な場合があります。

ImageAttributes.SetGamma メソッド (Single) (System.Drawing.Imaging)
http://msdn.microsoft.com/ja-jp/library/fd50dwb0(v=vs.110).aspx

サンプルコード

実行例

0011

左からガンマ1.0、1.6、2.2

[C#] 画像のコントラストを調整する

画像のコントラストを調整するには、ヒストグラムを圧縮したり伸張すれば良いように思う。

ColorMatroxを使うのならば、入力対出力の線形特性の傾きを変化させてやればよい。しかし、係数をうまく調整しないと、少しの変化でレベルがすぐに飽和してしまったり、逆に値を大きく変化させてもなかなか結果に現れないなど、思うような結果が得られないこともあるので注意が必要だ。

以下サイトに具体例があったので、掲載されていたサンプルコードを拝借。

コントラストを変更して画像を表示する: .NET Tips: C#, VB.NET
http://dobon.net/vb/dotnet/graphics/contrast.html

サンプルコード

実行例

0010

左から、コントラスト-25、元画像、コントラスト+25