<   2012年 10月 ( 19 )   > この月の画像一覧
Solarisでの現在のネットワークトラフィックの測り方
Windowsだとタスクマネージャー等で、現在のNICごとのネットワークトラフィックがある程度分かるんですが、それをSolaris10でも知る方法です。


ちょうど、Solaris: ネットワークの解析コマンド入門に希望していたことが載っていました。
(この資料はSolarisのネットワーク関連の操作が大抵網羅されており、非常に有用です)

以下のコマンドでスループットがわかるようです。

# dladm show-dev -s -i 1 e1000g0(←NIC名)



結果はこんな感じです。

ipackets rbytes ierrors opackets obytes oerrors
e1000g0 857 738987 0 7649 9574282 0

それぞれの項目の意味は以下のようです。
e1000g0:NIC名
ipackets:受信パケット数
rbytes:受信バイト数
ierrors:受信エラー数
opackets:送信パケット数
obytes:送信バイト数
oerrors:送信エラー数

この送受信バイト数に8を乗ずることで bps が出せますね。
上の例だと、受信5.9Mbps、送信76Mbpsになります。
[PR]
by Jehoshaphat | 2012-10-30 21:37 | Unix | Trackback | Comments(0)
Solaris10でIPを変更する方法
Solaris10でIPやデフォルトゲートウェイ等の基本的ネットワークの設定ですが、つい忘れるのでメモします。


IPは以下ファイルで定義します。(コマンドでも出来るようだけど、再起動したらもとに戻るので最初からファイルに書いたほうが良いです)

# vi /etc/inet/ipnodes (←/etc/inet/hostsへのシンボリックリンクになっていた)
192.168.13.6 hogehost loghost

↑のファイルはReadOnlyになっているので、viで編集した場合、:w! で強制上書き保存します。


次にネットマスクを設定します。

# vi /etc/inet/netmasks
192.168.13.0 255.255.255.0

↑のファイルもReadOnlyになっているので、viで編集した場合、:w! で強制上書き保存します。


デフォルトゲートウェイの設定をします。

# vi /etc/defaultrouter
192.168.13.1



ドメイン名とDNSサーバのアドレスを指定します。

# cat /etc/resolv.conf
domain jehupc.com
nameserver 192.168.13.2


参考:
Solarisのネットワーク設定


追記(2013/3/14):
Solarisではホスト名とIPの対応表を定義し、次に、ホスト名とインターフェイスとの対応表を定義することでIPの設定を行なっているようです。

インターフェイスとホスト名を結びつけます。

# vi /etc/hostname.e1000g0 (hostname.インターフェイス名のファイル)
hogehost  ←ホスト名を記述

NICが2つ以上ある場合のIPの設定は、(Solaris)NICが2つある場合のIP設定を参照。
[PR]
by Jehoshaphat | 2012-10-30 21:35 | Unix | Trackback | Comments(0)
(Solaris)telnetでrootユーザがログインできるようにする
telnetでSolaris10に接続し、rootでログインしようとすると接続できません。
設定を変更しないとダメなようです。

/etc/default/login ファイルで設定する必要があるんですが、デフォルトだとこいつのパーミッションは444になっています。
とりあえず編集させるため以下のようにパーティションを変更してから、/etc/default/login ファイルの CONSOLE をコメントアウトします。

chmod 644 /etc/default/login

vi /etc/default/login

CONSOLE=/dev/console
 ↓
#CONSOLE=/dev/console

これでファイルを保存し、telnetで接続し、rootでログインが出来るようになりました。
[PR]
by Jehoshaphat | 2012-10-30 21:30 | Unix | Trackback | Comments(0)
IE8でJPEG画像を表示して保存しようとするとビットマップになる時がある
IE8の環境で、JPEG画像へのリンクを押下して表示された画像を保存しようとすると、保存形式がビットマップしか選べなくなることがあります。(保存時のファイル名も untitled.bmpになってしまいます)
この現象についてちょっと調査してみました。


ググると同様の現象の解決法があったんですが、大抵はキャッシュの削除や、Temporary Internet Files の場所を変えるという方法でした。
キャッシュの削除や場所を変えても改善しませんでした。

で、現象が発生する時と発生しない時があるので、どういう条件でそうなるのか色々試したところ、日本語のファイル名のリンクを押下するとビットマップOnly現象が発生することがわかりました。
(グループウェアで画像ファイルを添付してのやり取りがあるんですが、日本語のファイル名をそのままアップするケースが多い状態です)


その点について更に情報収集していると、MSフォーラム:IE8で日本語ファイル名の画像について名前をつけて保存しようとすると untitled.bmp になり bmp でしか保存できないで望んでいた答えが出ていました。


どうやら、URLとキャッシュのファイルのマッピングテーブルである index.dat (C:\Documents and Settings\ユーザ名\Local Settings\Temporary Internet Files\Content.IE5\) へのアクセスするAPIの問題だそうです。


ファイルをキャッシュする時 SetUrlCacheEntryInfo 関数を使って保存し、ファイル名をUTF8でindex.datに格納します。
そして、画像ファイルを右クリック→名前をつけてファイルを保存 にすると、RetrieveUrlCacheEntryFile 関数でキャッシュされたファイルを得ようとするわけですが、ファイル名がShift-JISで渡されてしまい、RetrieveUrlCacheEntryFile内部ではindex.datにそんなファイル名はねーよ (実際はUTF8で格納されているため)となって、エラーとなり、仕方なくメモリの中に展開されたビットマップオブジェクトをuntitled.bmpとしてビットマップ保存しようとするようです。

ファイル名がURLエンコードされている場合、保存時はちゃんとJPEGで行おうとします。(おそらくRetrieveUrlCacheEntryFile関数内でURLデコードしてキャッシュを見つけることができるのでしょう)
ただし、保存時のファイル名が短い名前(8.3形式)になってしまいます。(これもIEのバージョンによって挙動が異なるようです。IE8以降では短い名前ですが、IE7以前はURLエンコード名そのままになるようです。このあたりの話はMSフォーラム:キャッシュに非ascii文字のファイル名のゴミが残るでまとめられています)

結局、MSがAPI(RetrieveUrlCacheEntryFile関数)を直さないといけないので、ユーザに画像ファイルを保存する用途の場合、IEで日本語を含む画像ファイルを扱わないほうが良さげですね。
どうしてもという場合は、サーバ側でjpegファイルの場合は Content-Disposition を attachment にし、Content-Type を application/octet-stream にすることで、JPEGへのリンク押下時にファイルのダウンロードダイアログを表示させることができます。ファイルのダウンロードダイアログから保存した場合はJPEGで保存されます。
この設定はWebサーバ側で、JPEGのMIMEを変えてしまえばいいだけの話です。


参考:
MSサポート:Internet Explorer で画像がビットマップ (.bmp ファイル) として保存される ここではキャッシュフォルダ関連の設定とアドオンを見直すようにとあります。
[PR]
by Jehoshaphat | 2012-10-30 21:28 | 豆知識 | Trackback | Comments(0)
(Linux)普通のsambaサーバ構築メモ
LinuxでSambaを使って、いわゆる一般的なスタンドアロン共有フォルダサーバ(ローカルパスワード認証)を構築するためのメモです。
CentOS6.3で、Sambaのバージョンは 3.5 です。


まず、smb.confを編集します。

# vi /etc/samba/smb.conf


[global]
workgroup = WORKGROUP
server string = 任意の文字列

#↓sambaサーバ名
netbios name = natsumikan

#↓アクセスを許可するネットワークアドレスを指定
hosts allow = 127. 192.168.77.

log file = /var/log/samba/log.%m
#↓ログサイズ(KB)
max log size = 1024

#認証設定
security = user

(※認証方式には以下がある。
share:共有を一種類の固定ユーザを使ってアクセス。パスワードだけでアクセス制御。
user:共有を個別のアカウント(またはゲストユーザ)を使ってアクセス。一般的なスタンドアロンの共有フォルダ。今回はこれを使用。
ads:共有を個別のアカウントを使ってアクセスするが、認証はActiveDirectoryドメインで行う。
domain:共有を個別のアカウントを使ってアクセスするが、認証はWindowsドメインで行う。
server:共有を個別のアカウントを使ってアクセスするが、WindowsNT,Smabaで認証を行う。

#↓プリンタは使わないので
load printers = no



あとはsmb.confの続きのところに共有の設定を書いていきます。
(今回は smb.conf に共有の設定を書きましたが、本来は別ファイルに定義した方がよいです。詳しくは、smb.confを編集して共有の作成をするべからずを参考に...)


(smb.conf続き)
[hoge]
comment = test_sahre
browseble = yes
path = /var/samba/share_dir/hoge
writable = yes
#↓読み書き可能なユーザ、またはグループを指定する
write list = @group1 , user1
#↓読み込みのみ可能なユーザ、またはグループを指定する
read list = user2
#↓アクセス可能なユーザ、またはグループを指定する
valid users = @group1 , user1 , user2
#↓明示的にアクセス拒否するユーザ、またはグループを指定する
invalid users
#↓ファイル作成時のマスクを8進数で設定。規定値は744
create mask = 777
#↓ディレクトリ作成時のマスクを8進数で設定。規定値は755
directory mask = 777
#↓大文字、小文字が混在する場合、全て小文字とみなす
default case = lower
#↓大文字、小文字が異なっていても区別せず同一ファイルとしてみなす
case sensitive = no
#↓Windows側が大文字、小文字を区別した場合、それに従う
preserve case = yes
(※グループを指定する時はグループ名の先頭に「@」が必要。)


security = user (ローカル認証)の場合は、共有フォルダにアクセスするためのUnixユーザを作成しておく必要があります。
共有フォルダアクセスだけが目的のユーザあれば、ホームディレクトリ必要ない+シェルログインさせる必要ないユーザを作成すればセキュリティ的にもいいでしょう。
以下のようにして、ホームディレクトリ必要ない+シェルログインさせる必要ないユーザを作成できます。

↓Unixユーザを作成
# useradd -d /dev/null -s /sbin/nologin username
↓Unixユーザのパスワード作成
# passwd username
↓sambaのアカウントを作成し、パスワードを設定
# smbpasswd -a username
New SMB password: (パスワード入力)
Retype new SMB password:(パスワード入力)

任意のユーザのパスワード変更する時は以下のコマンドにします。
# smbpasswd ユーザ名


sambaユーザ一覧を表示するには以下コマンドを使います。
# pdbedit -L



共有フォルダへのアクセスをグループ単位で制御するためには、グループを追加し、グループにユーザを所属する必要があります。

# groupadd gp_piyo  ←グループ作成
# usermod -G gp_piyo user_a  ←グループにユーザ追加


余談ですが、現在Samba接続しているセッション一覧を表示するにはsmbstatusコマンドでわかるようです。

# smbstatus
Unknown parameter encountered: "browseble"
Ignoring unknown parameter "browseble"

Samba version 3.5.10-125.el6
PID Username Group Machine
-------------------------------------------------------------------
3063 user_a user_a test-machine (::ffff:192.168.77.99)

Service pid machine Connected at
-------------------------------------------------------
hoge 3063 test-machine Fri Oct 5 00:23:45 2012

Locked files:
Pid Uid DenyMode Access R/W Oplock SharePath Name Time
--------------------------------------------------------------------------------------------------
3063 502 DENY_NONE 0x100081 RDONLY NONE /var/samba/share_dir/hoge . Fri Oct 5 00:23:45 2012



慣れれば簡単に構築できます。

参考:
Sambaサーバの設定
ASCII.jp:ファイルサーバの文字化けの解消方法は?|サーバトラブル解決のセオリー
利用ユーザの作成・削除
ユーザ・グループの管理 - Technical Tips -
[PR]
by Jehoshaphat | 2012-10-30 21:21 | Linux | Trackback | Comments(0)
(PHP,HTML)AjaxUpload 画像選択時にアップロードしサムネイルを表示
HTML5になるとローカルファイルをブラウザにドラッグしてアップロードできるで書いたように、HTML5対応でないブラウザを考慮すると、従来通りファイル選択ダイアログから画像を選ばしてアップロードするというアプローチになります。

しかし、通常はアップロードファイルをファイル選択してもブラウザにはファイル名が出るだけです。

今回やってみるのは、ファイル選択したら画像を非同期(Ajax)でアップロードし、サムネイルを表示する方法です。


jQuery と AjaxUpload を使います。

AjaxUploadは元来、http://valums.com/ajax-upload/で公開されたらしいのですが、現在は FileUploader という新しいものになっているようです。

で、解説サイトAjax Upload - ZURB Playground - ZURB.comからAjaxUploadをダウンロードします。

使い方は下記のような感じです。

●クライアント側
・HTMLファイル
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="jquery-1.6.2.js"></script>
<script type="text/javascript" src="ajaxupload.js"></script>
</head>
<body>
<!-- ↓AjaxUploadを使うためのスクリプト。画像を非同期でアップし、完了したらサムネイル表示 -->
<script type="text/javascript" charset="utf-8">
$(function(){
//サムネイル表示するimgタグを ID 名で指定(jQueryを使ったセレクタ)
var thumb = $('img#thumb');
var imagefilename = $("#imagefilename");
//AjaxUploadクラスを生成し、参照ボタン押下時の処理を定義。第一引数は参照ボタンのID名。
new AjaxUpload('imageUpload', {
//formタグのID名 newHotnessForm を実行
action: $('form#newHotnessForm').attr('action'),
name: 'image',
//アップロード中は loading スタイルシートを利用
onSubmit: function(file, extension) {
$('div.preview').addClass('loading');
},
//アップロード完了時の処理
onComplete: function(file, response) {
thumb.load(function(){
$('div.preview').removeClass('loading');
thumb.unbind();
});
thumb.attr('src', response);
//img要素表示
thumb.css("display", "inline");
//hiddenに画像パス指定
$("#imagefilename").attr("value" , response);
/*デバッグ。Ajaxで返された値を表示。*/
$("#res").html(response);
}
});
<!-- ↓クリアボタン押下時の設定 -->
$("#pic1_clear").click(function(){
thumb.removeAttr('src');
thumb.css("display", "none");
imagefilename.attr("value" , "");
});

});

</script>

<form id="hoge" method="post" action="hoge.php"><!-- ←メインのフォーム -->
氏名:<input type="test" id="name" name="name" size="20"><br>
写真1:<input type="file" id="imageUpload" name="imageUpload" size="20"><br>
<!-- ↓に上記参照ボタンで選んだ画像ファイルが表示される。 -->
<div class="preview">
<img id="thumb" width="320px" height="240px" class="no_display" >
<!-- 参照ボタンで画像選択時に、アップロードされた画像パスを保持し、メインのフォーム先に送信 -->
<input type="hidden" id="imagefilename" name="imagefilename" >
</div>
<!-- デバッグ用。Ajaxで返された値を表示 --><div id="res"></div>
<input type="submit" value="登録">
</form>

<!-- ファイル選択参照ボタン押下時に動くフォーム -->
<form id="newHotnessForm" method="post" action="./upphp.php">
</form>

</body>
</html>



・スタイルシート
.loading{
background-image: url("./images/load.gif")
}
.no_display{
display: none;
}


HTMLの規約上、formはネストさせてはいけないので、メインのformとは別に定義する必要があります。(ネストさせるとうまく動きませんでした。
JavaScriptでAjaxUploadのインスタンスを作成し、参照ボタンでファイルを選んだらサーバに送信し、その後、サーバからレスポンスで画像ファイルへのパスを取得し表示します。
ただ、上記の方法だとメインフォーム送信時に、参照ボタンで選んだ画像ファイルを送ることはできません。
なので、AjaxUploadでアップロードされたファイルパスをhiddenに持ち、そのアップロードファイルパスをメインフォーム送信先に送るような仕組みにしています。


●PHPサーバ側(upphp.php)
$uploaddir = './uploads/';  
//画像更新時に発生するブラウザキャッシュの問題を回避したければ、timme() でUnixタイムスタンプをつけたほうが良いかも。
$file = $uploaddir . basename($_FILES['image']['name']);
 
//画像かどうか
$imginfo = getimagesize( $_FILES['image']['tmp_name'] );
if ( $imginfo[2] == IMAGETYPE_JPEG || $imginfo[2] == IMAGETYPE_GIF
|| $imginfo[2] == IMAGETYPE_PNG ){

//画像の時
if (move_uploaded_file($_FILES['image']['tmp_name'], $file)) {
echo $uploaddir . $_FILES['image']['name'];
} else {
echo $uploaddir . "err.jpg";
}
 
}else{
//画像じゃないとき
echo $uploaddir . "err_nonimg.jpg";
}

PHP側では送信されてきたファイルが画像ファイルかどうか判断し、画像ファイルならアップロードディレクトリにコピーします。
そして、ファイルパスをクライアントに返します。

ただ、一回画像をアップロードし、再度参照ボタン押下して別画像に更新しようとすると、ブラウザキャッシュのせいで、画像自体はアップロードされているものの、ブラウザ表示上は変わらない現象が発生しました。(HTTPヘッダでキャッシュ無効にしてもダメでした。)
なので、ファイル名にUnixタイムスタンプを含めるなどの手法を取り、ファイル名が同一にならないようにしたほうが良いかもしれません。


参考:
画像アップロード時にjQueryでサムネイルを表示する方法 | Web活メモ帳
AJAX Multiple File Upload Form Using jQuery
php で画像ファイル形式を判別する方法 - ブックマクロ開発に
PHP関数講座:getimagesize -- そふぃのphp入門
[PR]
by Jehoshaphat | 2012-10-22 01:31 | PHP開発 | Trackback | Comments(0)
(JavaScript)jQueryでAJAX
(JavaScript)ページの一部を動的に置き換える(prototype.js) でprototypeを使ったAjax通信方法を書きました。

今回はjQueryを使った方法です。

AJAX(非同期通信)リクエストをPrototypeとjQueryで行う[AJAX][JS] | QUALL - blogに、PrototypeとjQueryでのAjax構文の比較がなされてました。

ほぼコピペですが、jQueryを使った場合,下記のような感じとなります。

●HTML、JavaScript側

<script type="text/javascript">
$(function(){
$("#evnt").click(function(){
//AJAXを使い、サーバにリクエス。レスポンスを表示。
$.ajax({
url : "/test.php", //リクエス先
type : "post", //GETかPOSTか
data : ({ prm1: $("#paramtext1").val() , prm2: $("#paramtext2").val() }), //パラメータ
success : function(request){
$("#rest").html(request);
}
});
});
});
</script>
 
<input type="text" id="paramtext1">
<input type="text" id="paramtext2">
<input type="button" id="evnt" value="実行">
<div id="res"> </div>





●PHP側(test.php)

foreach ($_POST as $key => $value) {
echo $key . "は" 0 $value . "です<br>";
}

[PR]
by Jehoshaphat | 2012-10-22 01:27 | Webがらみ | Trackback | Comments(0)
HTML5になるとローカルファイルをブラウザにドラッグしてアップロードできる

画像をアップロードするとき、ローカルファイルをドラッグ&ドロップできるさいと増えましたよね。

で、社内イントラネット向けのウェブアプリ開発をすることになったので、ドラッグによるローカルファイルアップロードしようかと思ったんですが、これってHTML5の機能になるんですね。

自宅ではFirefoxをメインで使っていますが、職場はIE8を使うことに決まっています。
IE8は、HTML5の機能は使えないので、結局諦めました。

HTML5が使えるFifefox3.6やChrome11以降では、jQueryを使った droparea スクリプトを使うと簡単にドラッグアップロードできるようです。
[PR]
by Jehoshaphat | 2012-10-22 01:24 | Webがらみ | Trackback | Comments(0)
IEでGoogleカレンダー埋め込みサイトが正常に表示されない
サイトにGoogleカレンダーを埋め込んでるんですが、IEでページのリロードをするとGoogleカレンダーが表示されないという現象が発生しました。
Firefox,Chrome,Opera等では発生していません。

いろいろ調査したんですが、多分Google側が修正を加えたことで起こっているんじゃないかと思います。

埋め込みページを初回表示するときは正常に表示されます。(それで稀にエラーになることがありますが。。。)
ページを更新すると確実に表示されません。その際、以下の様なJavaScriptのエラーが発生します。


Web ページ エラーの詳細

ユーザー エージェント: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; MDDS; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)
タイムスタンプ: Wed, 4 Jul 2012 06:19:20 UTC


メッセージ: 'gapi.config' は Null またはオブジェクトではありません。
ライン: 126
文字: 216
コード: 0
URI: https://www.google.com/calendar/xxxxxxxxxxxxxxxxxxxxxxembedcompiled__ja.js


メッセージ: オブジェクトでサポートされていないプロパティまたはメソッドです。
ライン: 10
文字: 21
コード: 0
URI: https://www.google.com/calendar/embed?src=xxxx@group.calendar.google.com&ctz=Asia/Tokyo&gsessionid=OK


クッキーの受け入れやキャッシュの無効化等色々試したんですが、ダメでした。

こちら側ではどうしようもないので、とりあえず暫定的な方法を取ることに。。。
初回表示は正常に行くことから、[表示されない場合はここをクリック]みたいなボタンを作成し、埋め込みページにリダイレクトするコードを埋め込んだページにリダイレクトするようにしました。

こんな感じです。


●カレンダー埋め込みページ(main.html)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Untitled</title>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
.....
<input type="button" value="表示されない場合はここをクリック" onclick="location.href='back.html';" />
<div>
<!--ここにカレンダーへの埋め込みコード記述-->
</div>
.....
</body>
</html>




●back.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<SCRIPT type="text/javascript">
<!--
setTimeout("link()", 0);
function link(){
location.href='main.html';
}
-->

</SCRIPT>
</head>
<body>
</body>
</html>



GoogleにはさっさとIEでも表示できるように修正して欲しいもんです。。。

追記:
2012年10月現在は直っているようです。(この現象が起きたのは2012/6下旬です。)
[PR]
by Jehoshaphat | 2012-10-22 01:22 | Webがらみ | Trackback | Comments(0)
VisualStudio 2010 のC++で作ったバイナリはWindows2000では動かない
今更、、という感じですが、VisualStudio 2010 C++(VC10) で作成したバイナリはWindows2000では動かないようです。
動かそうとすると、「xxxx.exeは有効なWin32アプリケーションではありません。」と怒られます。

有名な話らしいですが、C++系アプリを殆ど作らない3流PGには寝耳に水でした。

なので、社内とかでまだ 2000 を使っていて、ネイティブアプリを作る場合は、VistualStudio 2008 以前で作らないといけないようです。


なお、VS2008(VC9)の時は 98/ME/NT が切り捨てられたようです。

詳しくは、Visual Studio 2010 の試用レポートの表が参考になります。


幸いVS2008 ExpressEditionの環境が手元にあったので助かりました。古い開発環境も残しておかないといけないもんですね。。。


参考:
VisualStudio2010 と Windows2000 - プログラミングメモ
VC++2010を使ってWindows 2000対応ソフトをコンパイルする方法 - Windows 2000 Blog
Windows 2000 Sotaの雑記/ウェブリブログ
[PR]
by Jehoshaphat | 2012-10-22 01:18 | C/C++開発 | Trackback | Comments(0)