稼働率99.9% -3ページ目

稼働率99.9%

春日井市でiPhoneアプリの開発を行っています。iPhoneを使い出してからそれに伴って開発環境もWindowsからMacへと移行しました。MacやiPhoneだけでなくIT全般について日々感じた事や思った事を備忘録として記録する事を目的としたブログです。


HTML5とか今めちゃ流行ってるじゃん?


そんな感じでかなり前からJavaScriptを試行錯誤しながら学習しているのですが・・・

「全然分からん」

そう、AJAXが巷で流行り始めた頃から手を出しては、引込めという事を繰り返していたのですが、本腰を入れないと何時までも旧時代の作りしか出来ないなと。

で、数か月ちまちまやっていたのですが、はっきり言って

「分からん」

いや全く分からないわけじゃないんですけどね。言語なんか本質的には関係ないわけですよ。
それこそ、ベンダーオリジナル言語とかと比較すれば圧倒的に情報量は多いので調べれば分かるんですが、知れば知るほど奥が深いなと。

なぜJqueryを使うの?


AJAXが流行し始めた頃は、「prototype.js」が主流で今だと勝手に「jQuery」が主流だと思ってるわけだけどこの辺どうなんだろう。

jQueryの利用率はWebサイト全体の55%。使わないサイトの方が少数との調査結果。W3Techs - Publickey
みてわかる!jQuery入門 - [1]JavaScriptライブラリの本命:ITpro

上記記事からも分かるように圧倒的なシェアを誇っている。
確かに私も「prototype.js」よりも「jQuery」の方が何か分かりやすかったような気がした。

だから、単純に「jQuery」を選択してみた。流行に乗るのも一つの手でしょう。
わざわざマイナー処を使用してサポートが終了するよりはいいかな。


$なのjQueryなの?意味が分からん


しかし、いざ初めて見ると色々とよく分からない事が多々存在する。
まず、一つは「$」と「jQuery」について。
サイトによってまちまちで何のこっちゃ。
かなり初歩的な事ですが、それでも初めのうちはなぜと思ってしまうものです。
結局、「jQuery」の別名が「$」という事。
なので下記のコードはどちらも同じ。


jQuery(document).ready(function(){
    alert('OK');
});

$().ready(function(){
    alert('OK');
});

$(function(){
    alert('OK');
});

ちなみに「jQuery」であって「Jquery」でも「jquery」でもないので注意が必要です。
完全に私は間違って「Jquery」で覚えていました。

上記コードは、DOMが読み込まれた際に実行されるのですが、多少違いはあれどやっている事は同じです。

「jQuery」または「$」はjQuery本体のオブジェクトと捉えていいでしょう。
なのでこの場合、jQueryオブジェクトのready関数に無名関数を引数として渡しているだけです。
三番目の記述はready関数を呼び出していないように見えますが、実はjQuery内部でしっかりと呼び出しています。

どの書き方が正しくてどの書き方が間違っているとは言えませんが、一人でコーディングする際は好きなように記述すればいいのではないでしょうか。
ただ、プロジェクトで開発している際に好き勝手統一性のない書き方は好ましくないのでその辺りは考慮する必要があるでしょう。

規約でそう決まっているから

まあ、理屈はそうなんですが・・・。
質問の仕方にもよるのかもしれません。

例えば、新しくLAN(ローカルエリアネットワーク)を構築するにあたりどのようにIPアドレスを割り当てればいいでしょうか。
図のような環境の場合であった場合どうでしょうか。

接続台数や環境、将来的な拡張性等により割り当てるべきIPアドレスが決まってきます。
Eは実は別のLANに接続されている可能性もありますので必ずしも、このIPアドレスが妥当というわけにはいきません。
勿論、このネットワーク内だけの通信が出来ればいいというのであればどのようなIPアドレスを割り当てしても誰も咎めません。

そもそもIPアドレスとは何なのか?


皆が皆が好き勝手に割り当てしていたのでは、他のネットワークやインターネットへ接続しても通信が行えません。
例えばIPv4の場合、32ビットでアドレスを表します。
8ビットで2進数で最大256までの数値を表せます。
「00000001」=1、「00000010」=2、「00000011」=3・・・
つまり、32ビットで表せる数値の最大は256の4乗=4,294,967,296(約43億)となります。

世界の人口がインターネットが登場する前の1987年に50億人であり、既にこの時点で一人ずつに割り当てしては枯渇するのは当たり前なわけですね。
※この当時そもそも個人に1台処か一家に1台でもかなり稀だったり、扱えるデータ量も
限られているわけで初めから無尽蔵に割り当てできるよう設計する方が問題があるでしょうけど。

そもそもIPアドレスを大きくわけると「グローバルIPアドレス」と「プライベートIPアドレス」に分けられます。
「グローバルIPアドレス」は世界中の関係機関で決められたルールにより管理されたアドレスであり、「プライベートIPアドレス」は誰でも好きなように管理できるアドレスです。
※少し語弊があるかもしれませんが・・・
「グローバルIPアドレス」も「プライベートIPアドレス」も同じIPv4プロトコルなのでそのままでは、どちらなのか判別が出来ません。
なので、RFCという規約に下記のように決められています。


グローバルIPアドレス
クラスA1.0.0.0 ~ 9.255.255.25511.0.0.0 ~ 126.255.255.255
クラスB128.0.0.0 ~ 172.15.255.255172.32.0.0 ~ 191.255.255.255
クラスC192.0.0.0 ~ 192.167.255.255192.169.0.0~ 223.255.255.255

プライベートIPアドレス
クラスA10.0.0.0~10.255.255.255(10.0.0.0/8)
クラスB172.16.0.0~172.31.255.255(172.16.0.0/12)
クラスC192.168.0.0~192.168.255.255(192.168.0.0/16)
※()内は最大割り当て時
上記をよく見ると抜けているアドレスもあります。
これは、特殊な用途に予約されたアドレスになり、通常割り当て出来ません。


IPアドレスをどのように割り当てすればよいか

では、どのように割り当てすればよいのか。
一つは、ネットワークの規模により割り当てするクラスを決めます。
明らかに接続する台数よりも小さなクラスで割り当てしてしまってはルーティング等他の設定が煩雑になります。そのような場合は、余裕を持ったクラスで割り当てする必要があります。
逆に家庭であれば254個も割り当てサイズとしては大きいですが、指定する際に計算をする必要が無いので誰でも割り当てが可能という点で妥当だと言えます。
ネットワークが「192.168.x.x」でサブネットマスクが「255.255.255.0」って分かりやすいじゃないですか。端末を追加する際は、アドレスの下を1~254の間で衝突しない値を指定すればいいので。
もう一つは、管理の規模により割り当てするクラスを決めます。

数台のPCが接続されているようなネットワークを構築するのにクラスAのアドレスを割り当て
してもよいのですが、管理する際にぱっと見ただけで正しいのかも分かりづらいものになります。
例えば、「192.168.241.29/21」このアドレスのネットワークアドレスおよびブロードキャストアドレスは何って言われて計算せずに分かりますか?そうとうネットワークに精通していない人出ない限り、そもそも計算すら出来ませんよ。


かなり端折りましたが(サブネットマスク等)、タイトルの質問の答えとしては「規約に沿って目的のIPアドレスを割り当てした結果、LANのアドレスの多くは192.168.x.xが妥当」ではないでしょうか。

概要


動作検証の為にPHPをステップ実行したかったので「xdebug」の環境を構築したけど正常に動作しない。
現象としては、デバッグ実行後にすぐにプログラムが実行され「NetBeans」側ではいつまでも接続待ち状態
になっていました。
要因が色々とあり一つずつ検証した結果ようやく動作しました。

動作環境

以下の環境で検証
サーバ
  • CentOS 6.2
  • Apache 2.4.3
  • PHP 5.4.8
  • xdebug 2.2.1
クライアント
  • Windows 8
  • NetBeans 7.2

とりあえず手っ取り早く動作させるには

※VirtualBox上の上記サーバ環境の場合
1.「Apache」、「PHP」をソースからインストール
2.PECLコマンドから「xdebug」をインストール
 #pecl install Xdebug
3.php.iniに以下の設定を記述
 [php]
 zend_extension=[extension_dirのパス]/xdebug.so
 [xdebug]
 xdebug.remote_enable=on
 xdebug.remote_host=[クライアント側のIPアドレス]
 xdebug.idekey=[NetBeansで設定されているセッションID]
4.ファイアウォールが設定されている場合はサーバからクライアントへの接続ポートを開けておく。
 ※クライアントからサーバではない点に注意
5.NetBeansからデバッグを実行し、ステップ実行が可能か確認します。

考えられる要因

以下に記述した要因は間接的に動作不良に関わってくるものだと思います。
1.ファイアウォール
 当初、外部サーバを利用していた事による接続ブロックが考えられました。
 サーバ、ルータ、クライアントのファイアウォールの設定を変更してみましたが、結果は同じで動作しませんでした。
2.Apache+PHPのバージョン
 最新環境で構築した事による仕様変更が考えられました。
 以前、Eclipse環境でxdebugによるリモートデバッグ環境を構築した際は、Apache2.2+PHP5.3でした。
 なのでこの時のメモを元に設定したのですが、あまりよくありませんでした。
3.NetBeansでのデバッグ
 xdebugのバージョンに対応していないのかなと思いましたが、全然関係ありませんでした。
 設定自体も実行環境の指定(URL)だけなので何か別に必要になる事はありません・
4.ローカル環境でのデバッグ
 レンタルサーバ上つまり外部ネットワークではなく、ローカル上のApacheなら動作するかと思いましたが、
 これでも全く動作しませんでした。

直接の原因

原因は、「xdebug」は拡張モジュールは拡張モジュールでも【Zend拡張モジュール】という事です。
つまり、PHP.iniに
  extension=xdebug.so
ではなく
  zend_extension=xdebug.so
さらにzend_extensionの場合はextension_dirの指定が有効でない為、フルパスで記述する必要があります。
なので最終的に
  zend_extension=/usr/local/lib/php/extensions/no-debug-zts-20100525/xdebug.so
と記述しないといけませんでした。
あまり気にしていませんでしたが、phpinfoにはしっかりとモジュールがロードされていないメッセージが表示
されていました。

また、xdebugの公式ドキュメントにも「zend_extension="/usr/local/php/modules/xdebug.so"」と記載されており、
さらに「You should ignore any prompts to add "extension=xdebug.so" to php.ini — this will cause problems.」
(プロンプトに表示されている設定は無視しろ。これが問題の原因になります。)とご丁寧に書かれていました。

レンタルサーバでSSHポートフォワーディングによるデバッグ


レンタルサーバ上でデバッグがしたい場合、ルータのファイアウォールやセキュリティー対策などプログラミングに全く関係しない点を
考慮する必要が出てきます。ただ、デバッグしたいだけなのに・・・。
そこでお手軽にする為にSSHポートフォワーディングを使用します。
puttyで以下のように設定を行います。



これで外部サーバ上でもデバッグが可能となります。

参考




概要


今に始まった事ではないのですが、外部公開サーバに対するセキュリティー対策としてファイアウォールをしっかりと設定する必要が出てきました。
個人で借りているサーバにおいて不正パケットが大量に発生していたのでとりあえず設定を行ってみたもののやっぱりよく知っておいた方が安心できるという事で現在勉強中です。
その中でも腑に落ちなかった点があったのでメモ。

:INPUT ACCEPT [0:0]の[0:0]は何の事?


  • パケット・バイトカウンタ [パケットカウンタ:バイトカウンタ]を表している。
  • #iptables-save > iptables.cfgとすると現在のパケット・バイトカウンタが保存されるので確認できる。

  • 初期状態でCentOSをインストールした場合、/etc/sysconfig/iptablesには「:INPUT ACCEPT [0:0]」となっている為、再設定する度に初期化される。
  • パケット・バイトカウンタを利用する事で各プロトコルの通信量の確認が可能

  • 通信量を把握しておけば、攻撃を受けているのか判断をする事も可能

:INPUT ACCEPT にしているのに通信できない


  • CentOS 6.2のデフォルトの状態は確かにデフォルトポリシーは「:INPUT ACCEPT」となっておりルールが明示されていない通信は許可されるはず。

  • 例えば、Apacheをインストールしてアクセスしてもそのままでは通信が行えない。


なぜなのか?
  • よく見ると次のルールが記述されている
  • -A INPUT -j REJECT --reject-with icmp-host-prohibited

  • これは、「入ってきたパケット」に対して「エラーパケット」で応答しなさいという事。

  • この記述より前に記述されているルールに一つも一致しない場合に適用される。

  • デフォルトでは、「SSH」、「接続状態のもの」、「icmp」、「ループバック(サーバ自身からのアクセス)」が許可されている。

  • HTTP通信はこれらのルールに一致しない為、「REJECT」ルールが適用されるので通信が行えない事となる。

「REJECT」は基本的に「DROP」と同じ動作であるが、接続元に対してエラーパケットを送信する点で異なる。デフォルトでは、「port-unreachable」(ポート到達不能)を返す。「icmp-host-prohibited」は、Host Unreachable (ホスト到達不能)をエラーパケットとして送信する。例えば、悪意あるユーザがポートスキャンを行った場合において「port-unreachable」ではホストの存在を知らせてしまう事となる。
「Host Unreachable」ではそもそも存在しないのか、電源が落ちているのか判断出来ない為に諦めさせられる可能性がある。
ただし、Webサーバなどを不特定多数に公開している場合はこの限りではない。


参考:
 Man Page of iptables
 ICMPタイプリスト

Windows 8のダウンロード版をインストールしましたが、色々と問題が発生したのでメモ。

アップグレード版からのクリーンインストール


注意:この方法はライセンス違反に当たります。インストール先にアップグレード対象のWindowsがインストールされている必要があります。

結論としては、インストール自体は行えます。
ただし、認証に失敗します。
原因は、アップグレード版のライセンスキーでインストールしているからです。

アップグレードついでにSSDへ移行したのですが、そもそもこの方法自体が間違っていました。
上記でも記述していますが、そもそもアップグレード版はインストール先のデバイスに対象OSがインストールされている事が前提です。
7の時は、アップグレード版ではクリーンインストールもできなかったはずです。

もし、クリーンインストールするには、DSP版を購入する必要があります。

ユーザ名に注意


ログイン管理には2種類になっています。

  • ローカルアカウント

  • Microsoftアカウント

従来からのローカルアカウントはそのままPC内で管理されるが、Microsoftアカウントはマイクロソフトが提供する各種サービスへの利用が可能となる。
しかし、Microsoftアカウントで管理する場合、氏名がユーザフォルダ名となる為に日本語で登録していると問題が発生します。
後から変更する事が出来ない為、厄介です。
※Microsoftアカウントの氏名を英字に変更しましたが、ログイン時の名前は変更されますがフォルダ名はそのままでした。
VirtualBoxは少なくともインストールができませんでした。
また、自由にユーザ名を指定できないので最初はローカルアカウントで作成して後からMicrosoftアカウントと紐付ける方がよいのでしょう。

デスクトップ版と新しいUI版


従来のアプリはデスクトップ版で動作し、Windows Storeで公開されているアプリは新しいUI版で動作します。
管理方法や機能が異なり、注意が必要です。
例えばEvernoteの場合、細かな点で異なる点があります。

最後に


iPhoneとMacでは、境界線がはっきりしていますが、Winodwsの場合このあたりの線引きが曖昧な気がします。
同じデバイス内でどちらも動作する為、誤解を生じかねません。
また、RT版も存在しており理解していないと何が何やらの状態になりそうです。