2012年5月26日土曜日

特定のプロセスが使用しているメモリ量を監視する

どうも、俺@土曜の昼下がりです。 部屋に無理やり書斎(みたいなもの)を作ったのでとても快適です^^ さて、Linuxサーバにおいて特定のプロセスが使ってるメモリ量を調べる方法メモです。
#!/bin/sh

mem=0 #メモリ量
bef=0 #beforeの略のつもり
res=0 #結果
# 仮にapache(httpd)のメモリ量を取得する場合
while [ 1 ]
do  
    for n in `/bin/ps aux | awk '/httpd/ { print $6 }'`
    do
        mem=`expr $mem + $n`
    done
    res=`expr ${mem} - ${bef}`

    # メモリ量($mem)と前回との差分($res)を表示
    echo `date "+%F %T (${mem}) -> ${res}"`
    
    bef=$mem
    mem=0

    # 1秒ごとに処理
    sleep 1;
done
これを、apache_memorycheck.shとか名前をつけて
$ chmod +x apache_memorycheck.sh
して実行すれば 1秒ごとにapacheが使っているメモリ量と、1秒前との差分を表示できます!


$ ps axu
した結果の「RSS」の部分がプロセスが確保している物理メモリ量なので、それをawkを使って加算して計算しています。
ちなみに「VSZ」は仮想メモリ量です。(プロセス起動時にとりあえず確保される)

 以上でぇぇえぇえす。

2012年5月25日金曜日

nginxでリバースプロキシ(sslあり)

どうも、俺@華金です。

今日はnginxでリバースプロキシしちゃうぞ!(SSL付き)のメモです。
※nginx v1.2.0です。

# vim /path/to/nginx.conf
--------------------------------------
user nobody;
worker_processes 1;
events {
  worker_connections 256;
}

http {
  # この辺は環境にあわせて
  include /path/to/nginx/conf/mime.types;
  default_type application/octet-stream;
  sendfile on;
  keepalive_timeout 10;

  server {
    # 1080ポートで待ち受け
    listen 1080;
    server_name koexuka.blogspot.jp;

    # ここからリバースプロキシ設定
    location / {
      # 192.168.0.10の80番ポートへリバースプロキシする
      proxy_pass http://192.160.0.10:80/

      # ヘッダ情報付与
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto http;
    }
  }

  # SSLのリバースプロキシ設定

  server {
    # 1081ポートで待ち受け
    listen 1081;
    server_name koexuka.blogspot.jp;
    # SSL設定
    ssl on;
    ssl_certificate /path/to/server.crt; # SSL証明書パス
    ssl_certificate_key /path/to/server.key; # SSL鍵パス
    ssl_session_timeout 5m;
    ssl_protocols SSLv2 SSLv3 TLSv1; # 環境にあわせる
    ssl_ciphers HIGH:!aNULL:!MD5; # 環境にあわせる
    ssl_prefer_server_ciphers on;
    # ここからリバースプロキシ設定     location / {       # 192.168.0.10の443番ポートへリバースプロキシする       proxy_pass https://192.160.0.10:443/       # ヘッダ情報付与       proxy_set_header X-Real-IP $remote_addr;       proxy_set_header X-Forwarded-Host $host;       proxy_set_header X-Forwarded-Server $host;       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;       proxy_set_header X-Forwarded-Proto https;     }   } }

以上!簡単!

これでサーバの1080番ポートへのhttpパケットは192.168.0.10の80番ポートへ、
1081番ポートへのhttpsパケットは192.168.0.10の443番ポートへ送られます。



以上でぇぇえぇぇぇす。

2012年5月17日木曜日

そうだ、macvimを使おう

どうも、俺@昼休みです。
今日は、Macのテキストエディタの一つであるmacvimを使ってみたら他のどのエディタより使いやすかった、という話です。

本家はこちら
香り屋パッチがあてられて日本語化を頑張ってくれているプロジェクトはこちら



これまでmacで使うフリーのエディタに
・CotEditor(http://sourceforge.jp/projects/coteditor/
・Fraise(http://www.macupdate.com/app/mac/33751/fraise
・mi(http://www.mimikaki.net/
・テキストエディット(プリインストール)
を使ってきましたが、どれも高機能すぎたり何かの機能が足りなかったりして
「WindowsのEmEditor最強!」と思ってました。

今回どこかの記事でmacvimについて紹介されているのを読み、導入してみました。
vimは開発でよく使うエディタでとても大好きなエディタなのですが、いつもターミナル上でvimを起動して、、という使い方しかしなかったので「MacのGUIエディタで使ってみてどうかな?」と思ってましたが、、
超使いやすい!さすがvimやでぇ!
これまで使ってきたエディタなんか比にならねぇぜ。

何が使いやすいって、
・当然ながらviのキーバインド
・当然ながらファイルエンコーディングの設定とかコマンド一発
・というか、自由に~/.gvimrcに設定に書いて自分好みの環境が作れる。書き方はvimrcとほぼ同じ

:lcd <パス>
 でカレントディレクトリを移動出来る
・というか、vimで使えるコマンドは大抵使える

:!<cmd>
でmacvim上からコマンド打てる。
:!uuencode ./% hoge.txt | mail you@example.com
で編集中のファイルを添付して誰かにメール送信とか出来ちゃう。
・vimscriptが使える
・もちろん背景色やシンタックスの設定、透明度の設定もできちゃう
・タブ機能も完備
・プリンタへ送って印刷もできる
・マウスでコピペもできる
・つまり最強
という事になります。
viやvimに慣れてる人で、「macで使えるオススメのフリーエディタないかなぁ」という人には間違いなくmacvimをオススメします。

.gvimrcの例
set number
set autoindent
set sw=4
set ts=4
set ignorecase
set incsearch
set hlsearch
set statusline=%<%f\ (%05l/%05L)\ %m%r%h%w%{'['.(&fenc!=''?&fenc:&enc).']['.&ff.']'}%=%l,%c%V%8P

set laststatus=2
syntax on

set encoding=utf8
set fencs=utf8,ujis,sjis
set fileformat=unix

set transparency=5 "透明度
set lines=40 columns=180 "横幅と縦幅
colorscheme default "カラースキーム 他にもいっぱいある


以上でぇぇぇぇえす。

2012年5月11日金曜日

Objective-Cで構造体をNSLogする

どうも、俺@仕事中です。
Objective-Cで構造体をNSLogしたり、NSArrayやNSDictionaryで扱いたい場合、
例えばcocos2dのccColor3Bを

ccColor3B color = {0,0,0};
NSLog(@"%@", color);

//または
[dictionary setObject:color forKey:@"colorKey"];
のようにしてもEXC_BAD_ACCESSでエラーになります。

ここはひとつNSValueを使いましょう。
NSValue *colorValue = [NSValue valueWithBytes:&color objCType:@encode(GLubyte)];
これでインスタンス化出来る。

配列へ格納したあとの取り出しは
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:colorValue, @"key", nil];
ccColor3B color;
[(NSValue *)[dictoinary objectForKey:@"key"] getValue:&color];
とします。


以上でぇえぇぇす。

Objective-Cで 'Cannot find interface declaration for 'XXXXClass', superclass of 'ZZZZClass'...'が出る

どうも、俺@昼休みです。
タイトルの通り、Xcodeでコンパイルすると
「Cannot find interface declaration for 'XXXXClass', superclass of 'ZZZZClass'...」のエラーが出て困っていた俺へのめも。
何が起こってるかというと、簡単に言うと循環参照。

Objective-Cのクラスの前方宣言がないと困ること - アールケー開発に同じような内容の詳しい解説があります。

ClassA
#import "ClassB.h"
@interface ClassA: NSObject
{
  ClassB *b;
}
@end

ClassB
#import "ClassA.h"
@interface ClassB: NSObject
{
  ClassA *a;
}
@end
ClassAとClassBがそれぞれのヘッダファイルでお互いをimportしていて、
かつどちらかでどちらかのインスタンス変数を持っている、
またはどちらかのクラスを継承している、
ような場合にタイトルのような問題が発生します。
※コンソールからgccとかで直接コンパイルした場合は、

In file included from ClassA.h:2,
                 from ClassA.m:1:
ClassB.h:6: error: expected specifier-qualifier-list before ‘ClassA'
のようなエラーが出ます。困ったもんだ。

問題の詳細はコンパイルの処理にあり、
■ClassA.hのコンパイル
ClassA.h内で#import "ClassB.h"が見つかった時点でClassB.hをインポート(解析)する。
ClassB.h内にある#import "ClassA.h"が見つかりClassA.hをインポート(解析)するはずだが、#import宣言はネストしながらインポートしないため、実際はClassA.hのインポートは行われない。
ClassB.h内のClassAインスタンス変数の定義(ClassA *a;)で、ClassAの宣言が見つからないのでエラーとなる。
、、、そうです。

こういうような場合、#import宣言をやめて@classを使い前方宣言で対処できるのであればそれで解決できます。

ClassA
@class ClassB;
@interface ClassA: NSObject
{
  ClassB *b;
}
@end

ClassB
@class ClassA;
@interface ClassB: NSObject
{
  ClassA *a;
}
@end


ただし、対象のクラスを継承していたり、処理内で対象のクラスをallocしたりしてる場合は#importを使わなければいけません。


以上でェェエェす。


macでlsしたときの@(アットマーク)

どうも、俺@今から仕事です。
Mac(Tiger以上)のターミナル上で

$ ls -l
したときにファイルやディレクトリの属性に@(アットマーク)が付いている場合があります。

$ ls -l
-rw-r--r--   1 username  staff    411 12 12 17:44 hoge.txt
-rw-r--r--   1 username  staff  26945  5 11 09:39 foo.txt
-rw-r--r--@  1 username  staff   1766  5 11 09:37 fuga.txt #←こいつ!

なんだこれは?ということで調べてみると、Mac Tigerで導入されたファイルリソース(Extended Attributes)というものらしいです。
※Tigerではデフォルトで無効化されており、実質Leopardから見られる。

拡張属性というもので、Spotlightなどの検索で利用されるらしい。
特にその存在が邪魔するというともないとは思いますが、「きもい!消したい!」という人(俺)は、
1)まず確認
$ ls -l@
-rw-r--r--   1 username  staff    411 12 12 17:44 hoge.txt
-rw-r--r--   1 username  staff  26945  5 11 09:39 foo.txt
-rw-r--r--@  1 username  staff   1766  5 11 09:37 fuga.txt
        com.apple.metadata:kMDItemWhereFroms      174
        com.apple.quarantine       70
lsに-@を付けることでその詳細が確認できます。
ここにある、com.apple.metadata:kMDItemWhereFromsとcom.apple.quarantineはダウンロードしたファイルにつく属性みたい。
$ xattr -d com.apple.metadata:kMKItemWhereFroms fuga.txt
$ xattr -d com.apple.quarantine fuga.txt
これで削除できます。

以上でぇぇぇぇえぇぇぇぇえす。

2012年5月10日木曜日

objective-cのクラスでプロパティをprivateに

どうも、俺@残業中です。
今日はObjective-Cのクラスで、プロパティ(@property)宣言した値をprivateのように扱う方法めもです。

MyClass.h
@interface MyClass {

  // インスタンス変数
  NSString *string;
}
@end

MyClass.m
#import "MyClass.h"
// 無名カテゴリ宣言
@interface MyClass()
@property (nonatomic, retain) NSString *string;
@end

@implementation MyClass
@synthesize string;
@end
これでオッケー。

ヘッダファイルにプロパティを書いてしまうと、外部からそのプロパティにアクセス出来てしまうことが用意に想像できてしまい、意識せずに外部からそのプロパティへアクセスしてしまいがちです。
プログラマが一人であったり、小規模なプロジェクトであれば問題ありませんが、「このインスタンス変数は外部からアクセスしちゃあかんでぇ」と意識させたい場合などにはこの方法が便利です。

ただし、Objective-Cの特性で外部からのアクセスを完全に遮断することは出来ず、やろうと思えばアクセス出来ちゃいますが、こればかりはどうしようもありません。あしからず。


以上でぇぇぇぇえぇす。