読者です 読者をやめる 読者になる 読者になる

フリーソフトで作るWindowsセキュア環境

Windowsフリーソフトでセキュアにするよ。
ネットまわりの危険軽減から紛失対策まで。

ファイヤーウォール&アンチウイルス

インターネットセキュリティ総合製品を入れていない場合や、お使いのアンチウイルスにファイヤーウォールがない場合に。

ZoneAlarm Free Firewall(ファイヤーウォール)


http://www.zonealarm.com/security/en-us/zonealarm-pc-security-free-firewall.htm

有名なファイヤーウォールソフト。
インバウンドのチェックだけでなく、アウトバウンドのチェックや実行ファイルの改変チェックなどできます。
ウイルスに感染した際に、一番問題になるのはアウトバウンドなので、ない場合には入っていると安心。
最悪アウトバウンドさえ遮断できれば情報の流出を防ぐことができます
Windows標準のファイヤーウォールはアウトバウンドのチェックはしてくれない
※個人ユーザーおよび非営利の慈善団体、行政機関と教育機関のみ無料で使えます

avast! Home Edition(アンチウイルス


http://www.avast.com/jpn/download-avast-home.html

フリーの常駐型アンチウイルス
SMTP/POP3/IMAP4などのメールプロトコルや、WEB、アプリケーションなどのウイルスをリアルタイムでチェックできます。
定義ファイルの更新もかなり頻繁に行われ、検出率もかなり良い数字を出しています。
※検出率の比較はテストの内容によってかわるのでお調べください
※メインのマシンであれば、NOD32kasperskyなどの商用のものをおすすめします



ブラウジングFireFox)編

ファイヤーウォール&アンチウイルス意外でさらに安全にする為に。
ブラウザはFireFoxを前提にしています。
FlashPlayerなどは常に最新を保つように!

■ NoScript(Scriptの自動実行を抑制)(FireFoxアドオン)

https://addons.mozilla.org/ja/firefox/addon/722
FireFoxを安全にするための有名なアドオン。
JSなどの実行許可や、クロスドメインでのIFRAME呼び出しなどをドメイン単位で管理&制御するアドオン。
JSが標準で無効になるので不便よりも安全をとるのであれば。

■ FlashBlock(Flash自動実行を抑制)(FireFoxアドオン)

https://addons.mozilla.org/ja/firefox/addon/433
Flashの自動実行を抑制するアドオン。
クリックでFlashを実行できます。
FlashPlayerの脆弱性ゼロデイ攻撃対策。
JSFlashが標準で無効になるので不便よりも安全をとるのであれば。


ファイル&パスワード編

パスワードを普通にテキストファイルなどに書いて管理していたりすると、マシンを落とした場合などに大変なことになります。
USBメモリなどに機密情報をいれて持ち歩いているも同じです。
暗号化しましょう。

■ TrueCrypt(暗号化仮想ドライブ作成)


http://www.truecrypt.org/downloads
http://www.forest.impress.co.jp/article/2008/02/08/truecrypt5.html
暗号化した仮想ドライブの作成ソフト。
Portable KeePassを選べばUSBメモリなどに入れてスタンドアローン実行可能なバージョンも利用できます。
ドライブをまるまる暗号化することもできますが、仮想ドライブのイメージをファイルとして作成して、必要なときにパスワードを入力してマウントする機能がおすすめ。
マウント後は普通の外部ドライブのように読み書きできます。

トラベラーディスク作成機能というのがあり、TrueCryptのないマシンでも(パスワードを入力して)マウントできるUSBメモリ等を作成できます。

■ KeePass(パスワード管理&暗号化)


http://keepass.info/download.html
パスワード管理に便利。
スターパスワードで暗号化されたファイルでパスワードを管理できます。
パスワードジェネレート機能やパスワードの強度チェックなどの機能もあります。








とりあえずここらへんで。
※入れたからといって安全を保障するものではありません
※入れたソフトに脆弱性がある可能性もゼロではないのでインストールは自己責任で

mac book設定メモ3『買ったらとりあえず設定しとけ。windowsユーザーのためのMACキー配置設定。』

MAC買ってはじめに戸惑うことはキー配置だと思います。
実際キー配置さえwindowsにあわせてしまえば、そこまでOSの使用感に違いを感じることはありません。


mac book設定メモ3は「とりあえず設定しとけ。windowsユーザーのための迷わないMACキー配置設定。」です。


MacOS

『システム環境設定→キーボードとマウス→キーボードタブ→装飾キー』で装飾キーの配置を変更します。
「キーボードを選択」プルダウンでキーボード毎に設定できます。
キーボードの左下の方が

CapsLock A S ...
Shift X X ...
Ctrl Windows Alt ...

のようなWindowsキーボードでの動作になるべく近いものにするため、Macのキー配置を

CapsLock A S ...
Shift X X ...
Command Option Control ...

という配置に変更します。
※人によっては Option と Control が逆の方がしっくりくるかも。


Macキーボード編

Mac用キーボードの設定です

CapsLock Command
Control CapsLock
Option Option
Command Control
Windowsキーボード編

Macに外付けでWindowsキーボーをを使用する場合です

CapsLock CapsLock
Control Command
Option Control
Command Option
● ショートカットの変更

『システム環境設定→キーボードとマウス→キーボードショートカットタブ』で変更できます。
Windows+Dでデスクトップ表示など必要に応じて変更します。
※キーボード毎に個別設定できないのでキーボードを両方使う人は極端にいじらない方が良いです。


WindowsOS編(BootCamp等で起動する場合)

キーボードの左下の方が

CapsLock A S ...
Shift X X ...
Ctrl Windows Alt ...

となるように設定します


Macキーボード編(Windowsキーボードを使用する場合には特に気にする必要ないのでMacキーボード設定のみ)

http://www.vector.co.jp/soft/winnt/util/se394317.htmlをインストールし

CapsLock Ctrl
Control CapsLock
Option Windows
Command Alt

と設定する
※ソフトのインストールは自己責任でお願いします
※右側のキー設定は好みに応じて Command → Alt などとしておいたほうが便利かもしれない
Windowsキーボード接続時はAppleKbWinを無効にする


IME変換を使いやすく

Macのキーボードの使いやすい点として、「英数」「かな」キーがあります。
Macの感覚でキーを押しても英数で「カナ」になるなどわかりにくいので、IMEの設定を変更して、
Macと動作を近づけます

  • IMEの設定を開き「Microsoft IME Standard」を規定の言語に設定する
  • Microsoft IME Standard」のプロパティを開く
  • 全般タブ→設定を開く
  • 無変換キーの設定を「IMEオフ」にする

以上で

以上で、Windowsを使っていた頃とかわらない感じでMacを触れます

mac book設定メモ2『windowsとmacでThunderbirdを共有(同一プロフィール実行)』

id:toytools:20090502
にて「windows」「mac」「共有領域」の3パーティション構成の構築を行ったがThunderbirdのプロファイルを「共有領域」に保存し、データを完全同期をする方法



windowsmacの順でインストールをすることを前提に書いています。

前準備編

  • Thunderbirdのデータを置きたいフォルダを共有領域に作成する(以下「共有領域プロファイル保存フォルダ」とする)

windows

  1. まだアカウントを作成していない場合
  2. C:\Documents and Settings\[ユーザ名]\Application Data\Thunderbird\Profiles\に移動(XPの場合)
  3. 「共有領域プロファイル保存フォルダ」にprofilesフォルダを移動
  4. profiles.iniを開いて編集する
    • IsRelativeを0にする(絶対パスを有効にする設定)
    • Pathを「共有領域プロファイル保存フォルダ/profiles/****.default」のようにプロファイルを保存したディレクトリに書き換える
  5. Thunderbirdを起動して正しく読み込めていれば完了

mac

  1. Thunderbirdをインストールする
  2. Thunderbirdを起動しアカウントを作成せずに終了
  3. ~/Library/Thunderbird/Profiles/profiles.iniをwindowsの場合と同様に編集
    • ただしパスはmacunix)表記のパス
    • macにはパスをコピーする機能はないのでAmCopyPathCMXをインストールしておけばOK
  4. Thunderbirdを起動して正しく読み込めていれば完了

mac book設定メモ1『windows・mac・共有領域の3パーティション構成(+windowsは単独でも仮想でも起動可能)作成方法』

windowsmac・共有領域の3パーティション構成(+windowsは単独でも仮想でも起動可能)作成方法

mac book購入しました。


システム領域を共有領域にするのは危ないのでwindowsmacとは別にそれぞれからアクセスできる専用のパーティションをきる構成の作成メモ


windowsmac、共有フォルダ」の3パーティション構成
windowsはbootcampでもParallels Desktop(仮想)でも同一windowsを起動可能
共有パーティションwindowsmacどちらからでもアクセス可能
でのセットアップのメモ





最終的な構成は

■ インストール&パーティション構築編

※操作は以下の順番を守ってください

1)Boot Campアシスタントを使ってwindowsパーティションをきる
  • 容量はとくに32G以下とかでなくてよい
 この時点でのパーティション構成(順番も含め)
 mac(HFS+)
 windows(FAT32)※windows未インストール
  • ※この時点ではwindowsをインストールする予定の領域は要領に限らずFAT32です
2)付属のmacOSインストールCDを入れて再起動
    • ※ジャーンって音がするまでCボタンを押したままにしてCDからブートする
3)CDからブートしたらインストールに進まずに上部に表示されているメニューの「ユーティリティ」から「ディスクユーティリティ」を選択して起動
4)macが入っているパーティションをさらに分割する
  • ※ディスクユーティリティはmacのアプリケーションフォルダ内に存在するが全体で3パーティション以上の場合、CDからブートしないとほぼ失敗する(2時間くらいまっても分割終わらないしプロセスもほとんど処理を行っていなかったのでプロセスを強制終了するはめになりました。。。)
  • ※この時点では共有パーティションはHTS+(通常のまま)にしておく
 この時点でのパーティション構成(順番も含め)
 mac(HFS+)
 共有パーティション(HFS+)
 windows(FAT32)※windows未インストール
5)ここでいったん終了してmacを起動
6)windowsのディスクを入れて再起動
    • ※ジャーンって音がするまでCボタンを押したままにしてCDからブートする
7)通常通りwindowsをインストール
  • インストールするパーティションは必ずbootcampで作成したパーティション(通常はCドライブ)を指定する
  • インストール中に出てくるHDDフォーマットの選択の際にはかならずフォーマットを行う
    • 32G以上を確保していたら必ずNTFSでフォーマット
    • 32G以下であればFAT32かNTFSどちらでもよい
    • フォーマットはクイックでもいいので絶対やる
  • キーボード選択
    • 「s」キーを押して「そのほかのキーボードを選択」して、次の画面で「106 Japanese Keyboard(Including USB)」を選択する
    • 何度か再起動がかかるのでその際には再起動時にoptionキーをおしておき、ブート選択画面を表示しwindowsのブートを選択してあげる
8)windowsのインストールの完了
  • ここではまだwindowsをアクティベートしない
9)windowsにbootcampユーティリティをインストールする
10)macを起動
11)アプリケーションからディスクユーティリティを起動して共有ディレクトリを選択したメニューから「削除」メニューでフォーマットをFAT32に変換する
 この時点で初めてパーティション構成(順番も含め)は
 mac(HFS+)
 共有パーティション(FAT32)
 windows(NTFS)
 となる

■ 後処理編

1)Parallels をインストールして起動
2)自動的にbootcamp領域のwindowsVMが作成される
3)Parallels の設定からCPUやメモリなどの構成を設定する
  • なるべく再認証で電話の必要がなくなる可能性を高くしたいのであればCPUの数(コア数)は実際のものにあわせておく(Core2だったら2にする)
  • Parallels でシステムパーティション間でのファイル共有やアプリを共有する機能などはなるべくオフにする(安定させるため)
4)bootcampでwindowsを起動
  • ※起動時にoptionキーおしっぱでブートを選択
5)bootcampのwindowsをアクティベート
6)macを起動して、Parallels からwindowsを起動してアクティベート
  • ※私は再電話認証はいらなかったが、必要になったら電話してアクティベートを通す

[PHP][日記] PHPerだけど正規表現まわりの問題がもりあがっているようで一言

追記しました

サーバー側書くときには特別な理由がない限りPHP使う、PHPerだけど
404 Blog Not Found - 「PHP使いはもう正規表現をblogに書くな」と言わせないでくれ
に対して一言。


まぁ内容が正規表現ゆえゆえというより、「PHP使いはもうメアドの正規表現をblogに書くな」という内容なってしまっているのでその流れで。


メアドの正規表現はそこまで厳密にやる意味ない

厳密にやると「一部の携帯のメアドが通らない」ってのがあるけど、それの対応した時点で何をもって厳密なメアドの正規表現とするのかは不明になっていまう。


携帯のメアドに対応したとして、日本の携帯以外にもRFC2822に準拠していないメアドは存在する可能性があるので、上記を対応しただけでは微妙(携帯だけ対応しただけでは厳密でもなければ、完全でもない中途半端)なものになってしまう。
※自分の予想を超えたメアドが存在する可能性は0ではない


そのメアドを選んだ人の問題だといわれればそれまでだが、携帯のメアドも選んだ人の問題だと言ってしまえばそれまでで、どのラインで切るかは人それぞれの感覚にゆだねることとなってしまう。

メアドを正規表現チェックする意味

メアドを正規表現でどんなに厳密にチェックを行ったところで、そのメアドが存在するかもわからない。


厳密な意味でのValidなチェックはメール認証など他の処理によって担保されるので、
メアドを正規表現でチェックする理由は単純なヒューマンエラーのチェックを行うことで入力ミスをへらすといったそういう程度の理由でしかない。


言語でくくって考えるのは違うのでは

どんな言語でも、凄い人もいるし、覚えたての人もいるわけで単純に○○erは〜ってくくることは違うのではと思います。
※日本人は〜、韓国人は〜、白人は〜、黒人は〜と言っていることとなんら変わりはない。






こういうこと言ってると「これだからPHPerは〜」とか言われるのだろうか




追記1
るとさんからコメントで指摘をいただきましたので、追記します。

このエントリーで言いたかったことは、メールに関して「極端に厳密なチェック」は必要ないということです。
もとの記事(PHP)で紹介されている正規表現のように+を含むメアド等を存在するのにはじいてしまうのは問題だと思います。

厳密にやりすぎて、存在しうるメアドをはじいてしまう可能性があるのであれば、存在しうるメアドを全て通す程度の簡易チェックのほうが望ましいと個人的には思っているので、RFCに準拠したチェックに日本の携帯は例外として通すといった処理はナンセンスだと思ったのでこのエントリーを書きました。
※日本の携帯以外にも例外が存在する可能性は0ではないので例外を通すのであれば、許容範囲をより広げるほうが良い


また、システムによってはRFC準拠のもののみ許容といったチェックもありえると思います

Airの制約を越えるFlashアプリを作る。C#とFlashをExternalInterface経由で相互通信。

何が良いって、Adobe Airとかの制約も一切受けずにもっとディープなアプリケーション作れちゃうよ!

Flashでできないポートのリッスンとかいろいろな実装をC#に委譲できちゃうし!


簡単にExternalInterfaceをC#で使うためのライブラリをダウンロードする

http://www.adobe.com/support/documentation/jp/flash/samples/
Programming_ActionScript3.0_samples.zipをダウンロード


解答したしたフォルダの
/Samples/IntrovertIM_CSharp/ExternalInterfaceProxy
以下のCSクラス群がC#でExternalInterfaceを簡単に実装するためのラッパー実装

DLLの配置

id:toytools:20070906 で述べているような方法でFlashアクセス用のDLLを配置する。

DLLはダウンロードしたファイル内に含まれているので上記の記事のところからダウンロードしなくても大丈夫(なはず)。
※今回は前に作ったものの修正にExternalInterfaceを使いたかったので、DLL再配置などはしていないので未確認

FlashからC#への通信

C#
private ExternalInterfaceProxy proxy;

public void InitializeExternalInterfaceCallBack(){
	/*
	 * this.flashは配置したAxShockwaveFlashフラッシュオブジェクトインスタンス
	 */
	proxy = new ExternalInterfaceProxy(this.flash);
	/*
	 * コールバックを追加.
	 */
	proxy.ExternalInterfaceCall += new ExternalInterfaceCallEventHandler(proxy_ExternalInterfaceCallBack);
}
private object proxy_ExternalInterfaceCallBack(object sender, ExternalInterfaceCallEventArgs e){
	/*
	 * e.FunctionCall.FunctionNameにコールされたメソッド名が格納されている
	 * e.FunctionCall.Argumentsに引数のリストが格納されている
	 */
	switch (e.FunctionCall.FunctionName){
		case "SomeMethodName1":
			/*
			 * こんな感じで引数は取得
			 */
			string firstArgument = (string)e.FunctionCall.Arguments[0];
			break;
		case "SomeMethodName2":
			break;
		case "SomeMethodName3":
			break;
	}
	return null;
}
ActionScript3.0
/*
 * 通常のExternalInterfaceのcallの実装
 */
ExternalInterface.call( "SomeMethodName1" , "someArgumentValue" );

C#からFlashへの通信

C#
/*
 * proxyは上記で作成したproxyと同様のもの
 * private ExternalInterfaceProxy proxy;
 */
proxy.Call("someCStoFlashMethod", someArgumentVar );
ActionScript3.0
/*
 * 通常のExternalInterfaceのリッスンの実装
 */
ExternalInterface.addCallback( "someCStoFlashMethod" , _someCStoFlashMethod);
public function _someCStoFlashMethod( someArgumentVar:Number ):void{
	//do some function.
}

オブジェクト指向な大規模JS開発とかに便利なクラス定義JS(ネームスペースとpublic,private分離)作ってみたよ

(2009/3/6)バグを調整

オブジェクト指向な大規模JS開発とかに便利なクラス定義JS(ネームスペースとpublic,private分離)作ってみたよ
複数人が書くと、結構みんなばらばらの書き方になっちゃうし。


特徴は

  • ネームスペース定義できる
  • privateとpublicの分離
  • 固定されたクラス定義シンタックス

等です


使い方

  • public,private,protected staticの順に定義します
  • public内、private内であればthis参照でいけます
  • またpublic,privateをまたいでコールする場合には、this.public、this.privateのスコープでコールする必要があります
  • staticなど必要ないところは未指定で飛ばすことができます
  • コンストラクタはパブリック空間にConstructを定義すればOK(引数の制限などはありません)
Class.register( "com.somedomain.SomeClass" , {
 		//PUBLIC MEMBERS
 	},{
 		//PRIVATE MEMBERS
 	},{
 		//STATIC MEMBERS
 	}
});

テスト

■テストクラス

    Class.register( "net.toytools.TestClass" , {
        //PUBLIC MEMBERS
        publicMember:null,
        Construct:function( value ){
            this.publicMember = value;
            console.log("Construct : " + value);
        },
        publicMethod:function(){
            //public to private
            this.private._publicToPrivate();
            
            //public to public
            this.publicToPublic( "THIS SCOPE" );
            this.public.publicToPublic( "PUBLIC SCOPE" );
        },
        privateToPublic:function(){
            console.log( "privateToPublic : " + this.publicMember );
        },
        publicToPublic:function( value ){
            console.log( "publicToPublic : " + value );
        }
    } , {
        //PRIVATE MEMBERS
        _publicToPrivate:function(){
            console.log("_publicToPrivate : "  + this.public.publicMember);
            //private to public
            this.public.privateToPublic();
        }
    } ,{
        //STATIC MEMBERS
        TEST_STATIC_VAR:"test static var!!",
        testStaticMethod:function(){
            console.log("testStaticMethod");
        }
    } );


■実行

    net.toytools.TestClass.testStaticMethod();
    var o1 = new net.toytools.TestClass( "Construct Arguments" );
    o1.publicMethod();

■結果

testStaticMethod
Construct : Construct Arguments
_publicToPrivate : Construct Arguments
privateToPublic : Construct Arguments
publicToPublic : THIS SCOPE
publicToPublic : PUBLIC SCOPE

ソース

ソース

そのうちどっかにあげるかもだけどめんどくさいのでとりあえず。

/**
 * (c) kaw( http://d.hatena.ne.jp/toytools/ )
 */
var Class = function( ){
    var pub = {
        /**
         * クラスを登録する.
         * @param   namespace       クラスまで含んだネームスペース文字列(例:"net.toytools.TestClass")
         * @param   publicMembers   パブリックメンバーオブジェクト
         * @param   privateMembers  プライベートメンバーオブジェクト
         */
        register:function( namespace , publicMembers , privateMembers , staticMembers ){
            if( !publicMembers ) publicMembers = {};
            if( !privateMembers ) privateMembers = {};
            if( !staticMembers ) staticMembers = {};
            var pub = function(){}
            var pri = function(){}
            pub.prototype = publicMembers;
            pri.prototype = privateMembers;
            var splittedNamespace = namespace.split('.');
            var clazz = function(){
                var pubIns  = new pub();
                var priIns  = new pri();
                pubIns.private = priIns;
                priIns.public  = pubIns;
                pubIns.public  = pubIns;
                priIns.private = priIns;
                if( pubIns["Construct"] ) pubIns.Construct.apply( pubIns , arguments )
                return pubIns;
            };
            staticMembers.__CLASS_NAME__ = namespace;
            for( var i in staticMembers ){
                clazz[i] = staticMembers[i];
            }
            _registerClass( splittedNamespace , clazz , _namespacesRoot );
            _namespacesDic[namespace] = clazz;
        },
        /**
         * クラスを取得する.
         * @param   namespace       ネームスペース文字列
         */
        get:function( namespace ){
            return _namespacesDic[namespace];
        },
        /**
         * クラスは登録されているか.
         * @param   namespace       ネームスペース文字列
         */
        isRegistered:function( namespace ){
            return _namespacesDic[namespace] != undefined;
        }
    };
    //PRIVATE MEMBERS
    var _namespacesRoot = window;
    var _namespacesDic  = {};
    var _registerClass  = function( splittedNamespace , registerClass , nextTarget ){
        var next = splittedNamespace.shift();
        if( nextTarget[next] == undefined ) nextTarget[next] = {};
        if( splittedNamespace.length == 0 ){
            nextTarget[next] = registerClass;
            return nextTarget[next];
        }else{
            return _registerClass( splittedNamespace , registerClass , nextTarget[next] );
        }
    }
    return pub;
    
}();