|
|
業務報告
業務報告部屋を作ってみました。
会員ページr-jmさん更新 SOBAってすごそうだ。
皆さんにお世話になったので、隠しカウンター説明 ---- SQL関係はCountSQLフォルダ ---- MYSQLでテーブル作成 days [今日の日付] r_ip [訪問者IP] count [カウンター] ---- Index_htmlで<dtml-call counterpy> counterpyをコール ---- counterpyのやっている事 始めて接続したかを判断する為セッションを使う fzugcounter=REQUEST.SESSION.get('_FZUG_COUNTER_',None) if fzugcounter==None: がNoneなら(始めて接続) きょうの日付、訪問者のIPを調べる 調べた訪問者が本日接続したか記録をしらべる。 もしみつかったらcountをプラスして書き込み。CountSQL.UpdateSQLを呼ぶ なかったら、count=1で、新規に書き込み。CountSQL.InsertSQLを呼ぶ Noneでなかったら何もしないで戻る ---- 表示関係 dtmlMethod(ShowCounter) 初期状態では、本日分の記録を表示 「全部」にラジオボタンのチェックをつけ参照ボタンを押すと SetShowRadiopy で全部表示するようにセッションフラグをたててdtmlMethod(ShowCounter)に戻る セッションフラグがたっていると全て表示するSQLを呼ぶ。 countshowpyが実際に↑の処理を行っている。
>>34,35 有難う御座いました。 FSCounterここには入れてないし、リモートで入れるの面倒だったので、 だいだい概略は、自分がやったのと同じようです。 CookieをSessionでやろうと思っていたのが違ってましたが、結果は同じでしょう多分
>>34 このIPファイルが見付からなかった ちゃんとありました↓ /var/zope26/var/counter.***.***.counter.ip しかも一日の来客の IP がすべて出てきます。これログ見るより簡単ですね^^
>>27 リモートアドレスを「.」で分割して左シフトしてる すいません無責任モードでした def ignore_ip(self, REQUEST): このメソッドは、FSCounter の Edit タブで出てくる [Addresses to ignore] 欄に対応しているところですよね シフト演算は URL文字列を整数型にしているのだと思います 十進数だと解かり難いので 16進数で表すと URL が "A0.B1.C2.D3" とすれば、シフト演算後の整数値は 0xA0B1C2D3 になります # 30 malo さんが既に解説しておられますね;; で、本来の話に戻って、同一IPの訪問者かどうかは [IP Tracking] または [Cookie?] チェックボックスでおこなっています ソースは FSCounter.py で場所は "def increment(self, REQUEST):" メソッドの中です。 [IP Tracking] 対応部分は if hasattr(self,'ip_tracking') and self.ip_tracking: 以下の部分で、IP 毎にファイルこしらえて、それと比較しているようです (ただ自分のところでは、このIPファイルが見付からなかったので、間違っているかも;;) [Cookie?] 対応部分は elif self.cookie_yn: 以降で、クッキーがなければ++1して、クッキーを設定しているようです # なんか解かって書いているように見えますが、急いでソース見たので間違いだったらすいません
>>32 int(rAdrSplit[0])<<24の間違いではないでしょうか? typoでした。 何度も有難うございます。 見るに私の解釈が間違ってるみたいですねぇ。 成る程pythonのidleで実行したらよかったんだ。 ご迷惑をおかけしました。
kiyoさんは,int(rAdrSplit[0]<<24)と書きましたが,これでは型が合わずエラーになります。 なのでint(rAdrSplit[0])<<24の間違いではないでしょうか? 以下に実際にPythonで試してみました。若干私の解釈と違ってました。 Python 2.2.2(SJIS enhanced) (#37, Oct 15 2002, 15:30:03) [MSC 32 bit (Intel)] on win32 Type "copyright", "credits" or "license" for more information. IDLE 0.8 -- press F1 for help >>> str="00000001.00000010.00000011.00000100" >>> AdrSplit=string.split(str,'.') Traceback (most recent call last): File "<pyshell#1>", line 1, in ? AdrSplit=string.split(str,'.') NameError: name 'string' is not defined >>> import string >>> AdrSplit=string.split(str,'.') >>> print AdrSplit ['00000001', '00000010', '00000011', '00000100'] >>> print AdrSplit[0]<<24 Traceback (most recent call last): File "<pyshell#5>", line 1, in ? print AdrSplit[0]<<24 TypeError: unsupported operand type(s) for <<: 'str' and 'int' >>> print int(AdrSplit[0])<<24 16777216 >>> print int(AdrSplit[1])<<16 655360 >>> print int(AdrSplit[2])<<8 2816 >>> print int(AdrSplit[3]) 100 >>> print (int(AdrSplit[0])<<24+int(AdrSplit[1])<<16+int(AdrSplit[2])<<8+int(AdrSplit[3])) 0 >>> print ((int(AdrSplit[0])<<24)+(int(AdrSplit[1])<<16)+(int(AdrSplit[2])<<8)+int(AdrSplit[3])) 17435492 >>>
>>30 maloさん有難う。 私の持っているテクニカルリファレンスには、左シフトの解説はないのですが、 maloさんの例題を元に、いままでの知識で、思うに。 rAdrSplit[0] = 00000001 rAdrSplit[0] << 1 = 00000010 rAdrSplit[0] << 2 = 00000100 rAdrSplit[0] << 3 = 00001000 rAdrSplit[0] << 4 = 00010000 rAdrSplit[0] << 5 = 00100000 rAdrSplit[0] << 6 = 01000000 rAdrSplit[0] << 7 = 10000000 rAdrSplit[0] << 8 = 00000000 ここでゼロになると思っていた。 pythonの左シフトは違うのでしょうか? # 後で気がついたのですが、intって8ビットじゃないよねぇ(アホだあ、僕)
>>29 FSCounter これは,文字列のIPアドレス(2進数)を整数に変換していると思います。 例えば, IPアドレス(文字列)="00000001.00000010.00000011.00000100" =(10進表示)1.2.3.4 >rAdrSplit = string.split(self.REQUEST.REMOTO_ADDR, '.') rAdrSplit[0]="00000001",rAdrSplit[1]="00000010",rAdrSplit[2]="00000011",rAdrSplit[3]="00000100", ここまでは文字列です。 >rAdrInt = (int(rAdrSplit[0]<<24) + (int(rAdrSplit[1]<<16)****略 rAdrSplit[0]<<24="00000001000000000000000000000000" rAdrSplit[1]<<16=" 000000100000000000000000" rAdrSplit[2]<< 8=" 0000001100000000" rAdrSplit[3]<< 0=" 00000100" これを整数にすると rAdrSplit[0]<<24=1*2^24 rAdrSplit[1]<<16=2*2^16 rAdrSplit[2]<< 8=3*2^ 8 rAdrSplit[3]<< 0=4 これらをすべて足すと rAdrSplit = 1*2^24 + 2*2^16 + 3*2^8 + 4 たぶん,こんなことをしてるのではないでしょうか? あんまりカウンタのロジックとは関係ないと思います。
>>27 FSCounter のソース盗んだらどうですか? owaさんの指示に従い盗もうとソース覗くが、わからん(爆笑) カウンターなんて簡単だろうと思いきや、リモートアドレスを「。」で分割して左シフトしてる。 さらに&なんかしてる。 なんじゃー 多分私が間違ってる事は明白ですが、 rAdrSplit = string.split(self.REQUEST.REMOTO_ADDR, '.') rAdrInt = (int(rAdrSplit[0]<<24) + (int(rAdrSplit[1]<<16)****略 rAdrSplit[0]<<24は 255までの数値を左シフト24回もしたらゼロにしかナランだろうに? なにやってんだろう??? # また自信なくした。
|
|