かなり久々のスパム

いやー、本当に久々にスパムメールがきました。
以前は出会い系やBSカード販売だったけれど、今日は競馬とキャッシングでした。

メール内容は・・・

週末って色々とお金が要りますよね。

そんな人こそ賢く使ってください。

50万円借りても月々の金利はわずか3600円。

必要な時に必要な金額を上手に利用して下さい。

もちろん急なピンチの時にも当社がお力になります。

学生・主婦・金融ブラックどんな方でも大丈夫です。
http://...

▼ ただ今期間限定の低金利キャンペーン実施中
http://...

▼ 誰でも簡単に継続して稼げます【未経験者OK)<br>
  http://...

▽ 来店不要・低金利・即日融資が可能です。
http://... 申し込みはコチラから

※配信停止は http://...
Return-Path: <tzqvctzt+err50233s1215@se2.sweofiawiok.xyz>
Received: from 103.50.22.52([103.50.22.52])
 by wolfs.jp([127.0.0.1])
 with ESMTP for <...>;
 Sun, 18 Oct 2015 04:14:52 +0900 (Asia/Tokyo)
Received:
 by ha5etjt (Postfix, from userid 1002) id 80A30157A336;
 Sun, 18 Oct 2015 04:13:51 +0900 (JST)
Received: from localhost (unknown [10.109.155.172])
 by localhost (Postfix)
 with ESMTP id 6A6D41048CA8 for <...>;
 Sun, 18 Oct 2015 04:13:50 +0900 (JST)
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary="=_0126db24de70e3f13a7dd9bf467dcadd"
To: ...
From: bvcfdsf@se2.taodwao.com
Subject: お客様を信頼して50万円までは無審査!
Message-Id: <20151018041350@caw.pfpnxjm>
Date: Sun, 18 Oct 2015 04:13:50 +0900 (JST)

サイトには東京都知事と日本貸金業協会会員の記載がありますが、どちらも存在しない物でした。
ヤミ金ですねー

以前の不正BSカード販売メールは警察が欲しがっていたので情報提供をしましたが、今回はヤミ金。
とりあえず、警察のサイトでヤミ金関係の何かがないかなー?と見ていると・・・「ヤミ金融業者の撲滅を目指して!」ってページを発見。
担当部署へ連絡したところ、ヤミ金の情報は欲しいと言うことでした。

撲滅を目指してるだけあって情報はかなり欲しいみたいです。
不正BSカードと違うね・・w

なので県警のメールアドレスにデータを添付して送信。

あとは何かしてくれると面白いんだけどなあー

スパムメール発信元 IPアドレス一覧ページにも今回のIPアドレスを追加してあるので必要ならどうぞ

eo光電話を契約

来年からKDDIの固定電話アナログ通信のサービスが終了するみたいでネット回線契約の通知が届いてました。
電話だけ利用する場合、新たに光回線を引く工事をして利用するしかないようです。

しかも以前より基本料金も値上がり・・・今使っているeo光の光電話に契約した方が安く工事費も必要ないのでeo光電話に契約することにしました。
そして・・・eo光電話には悪魔の機器、eo多機能ルーターの使用が必須となりました。

なんでこんなにも多機能ルーターを嫌がるか・・と言うと、うちの環境がちょっと特殊だから。
今は eo終端装置 ⇒ 個人サーバー ⇒ ハブ ⇒ 各PC って感じで私のサーバーがルーターの役割の状態。
それにマルチセッションサービスで、サーバーが使用するグローバルIPと各PCが使用するグローバルIPを1つずつ、計2つもらっているのです。

で、eo光電話を契約すると eo終端装置 ⇒ eo多機能ルーター ⇒ 個人サーバー ⇒ ハブ ⇒ 各PC となり余計な物が追加されます。
契約時に「eo光電話アダプター」を要求すれば「ルーター機能をOFF」にした「eo多機能ルーター」を送ってもらえるのですが、どのみち設置が必要。
今まで通りのスループットを発揮すれば良いのだけど・・・取りあえずルーターの到着待ち。

そして・・契約変更の電話をしてから2日後にルーターが到着。
eo光電話 - 説明書など eo光電話 - ルーター箱
説明書や規約の紙とルーターが入った箱。
eo多機能ルーターのメーカーは「Sumitomo Electric NetworksInc.」なので住友電気工業のよう。

ルーターのセット内用は・・・
eo光電話 - eo多機能ルーター セット内用
 ・eo多機能ルーター ×1
 ・ルータースタンド ×1
 ・電源アダプター ×1
 ・電源アダプター用ACコード ×1
 ・cat6LANケーブル ×1
 ・モジュラーケーブル ×2
 ・壁掛け用ビス ×2
 ・説明書 ×1
 ・wi-fi 設定情報シート ×1
 ・製造番号シール ×2
でした。

ルーターの裏と端子を見てみると・・・
eo光電話 - eo多機能ルーター 裏 eo光電話 - eo多機能ルーター端子
あーあ・・きたMAID IN CHINA。
これが嫌だからIntelのLANボードや家庭用ルーターは国産かアメリカ産のやつを高い金だして買ってるのに大元がこれじゃ全く意味が無い

そして端子の安いこと・・全くシールドがない。
わざわざシールドとアースに対応したcat7を使っている意味もなくなるし、サーバー本体とルーターに付けてあるアースの意味なくなる。

ことごとく安い糞な仕様である。
パケットの仕様さえ判ればハードを作って単純な電話とLANの分離機が作れるのになあ・・・

MODメンテナンスの事とか

最近は1日1時間ぐらいMODのメンテナンスをやってます。
と言っても殆どは最適化で、それも体感できるような物は少ない感じのコード。

今日はブロックを叩いたときのパーティクルが出ない事に気付いたからコードを見てみると・・・
パーティクルの座標がずれていましたw

このパーティクルは本体のコードaddBlockHitEffectsから貰っているんだけれど、これものすごく無駄があるんですよ

public void addBlockHitEffects(int p_78867_1_, int p_78867_2_, int p_78867_3_, int p_78867_4_) {
    Block block = this.worldObj.getBlock(p_78867_1_, p_78867_2_, p_78867_3_);
 
    if (block.getMaterial() != Material.air) {
        float f = 0.1F;
        double d0 = (double)p_78867_1_ + this.rand.nextDouble() * (block.getBlockBoundsMaxX() - block.getBlockBoundsMinX() - (double)(f * 2.0F)) + (double)f + block.getBlockBoundsMinX();
        double d1 = (double)p_78867_2_ + this.rand.nextDouble() * (block.getBlockBoundsMaxY() - block.getBlockBoundsMinY() - (double)(f * 2.0F)) + (double)f + block.getBlockBoundsMinY();
        double d2 = (double)p_78867_3_ + this.rand.nextDouble() * (block.getBlockBoundsMaxZ() - block.getBlockBoundsMinZ() - (double)(f * 2.0F)) + (double)f + block.getBlockBoundsMinZ();
 
        if (p_78867_4_ == 0)
        {
            d1 = (double)p_78867_2_ + block.getBlockBoundsMinY() - (double)f;
        }
 
        if (p_78867_4_ == 1)
        {
            d1 = (double)p_78867_2_ + block.getBlockBoundsMaxY() + (double)f;
        }
 
        if (p_78867_4_ == 2)
        {
            d2 = (double)p_78867_3_ + block.getBlockBoundsMinZ() - (double)f;
        }
 
        if (p_78867_4_ == 3)
        {
            d2 = (double)p_78867_3_ + block.getBlockBoundsMaxZ() + (double)f;
        }
 
        if (p_78867_4_ == 4)
        {
            d0 = (double)p_78867_1_ + block.getBlockBoundsMinX() - (double)f;
        }
 
        if (p_78867_4_ == 5)
        {
            d0 = (double)p_78867_1_ + block.getBlockBoundsMaxX() + (double)f;
        }
 
        this.addEffect((new EntityDiggingFX(this.worldObj, d0, d1, d2, 0.0D, 0.0D, 0.0D, block, this.worldObj.getBlockMetadata(p_78867_1_, p_78867_2_, p_78867_3_))).applyColourMultiplier(p_78867_1_, p_78867_2_, p_78867_3_).multiplyVelocity(0.2F).multipleParticleScaleBy(0.6F));
    }
}

無駄ってのは第4引数p_78867_4_を評価しているところ。
p_78867_4_は叩かれた面の数字が入るのだけれど、途中で値が変動しないのにも関わらず6面全部を評価しているところ。
まあ、これはデコンパイルされたコードだからこうなってるだけで、本当のコードは違うのかもしれないけどw

レンダリングに関わるところなので1秒間に何度も呼ばれる物だからswitchの方が高速。
なのでうちのコードはこんな感じ

public boolean addHitEffects(World world, MovingObjectPosition target, EffectRenderer effectRenderer) {
    float range = 0.1F;
    double pX = (double)target.blockX + world.rand.nextDouble() * (this.getBlockBoundsMaxX() - this.getBlockBoundsMinX() - (double)(range * 2.0F)) + (double)range + this.getBlockBoundsMinX();
    double pY = (double)target.blockY + world.rand.nextDouble() * (this.getBlockBoundsMaxY() - this.getBlockBoundsMinY() - (double)(range * 2.0F)) + (double)range + this.getBlockBoundsMinY();
    double pZ = (double)target.blockZ + world.rand.nextDouble() * (this.getBlockBoundsMaxZ() - this.getBlockBoundsMinZ() - (double)(range * 2.0F)) + (double)range + this.getBlockBoundsMinZ();
 
    switch (target.sideHit) {
        case 0:
            pY = (double)target.blockY + this.getBlockBoundsMinY() - (double)range;
            break;
        case 1:
            pY = (double)target.blockY + this.getBlockBoundsMaxY() + (double)range;
            break;
        case 2:
            pZ = (double)target.blockZ + this.getBlockBoundsMinZ() - (double)range;
            break;
        case 3:
            pZ = (double)target.blockZ + this.getBlockBoundsMaxZ() + (double)range;
            break;
        case 4:
            pX = (double)target.blockX + this.getBlockBoundsMinX() - (double)range;
            break;
        case 5:
            pX = (double)target.blockX + this.getBlockBoundsMaxX() + (double)range;
            break;
    }
 
    int meta = 0;
    try {
        TileEntity_Multibase te = (TileEntity_Multibase)world.getTileEntity(target.blockX, target.blockY, target.blockZ);
        meta = te.getMeta();
    } catch (Exception e) {
    }
 
    effectRenderer.addEffect((new EntityDiggingFX(world, pX, pY, pZ, 0.0D, 0.0D, 0.0D, this, meta, target.sideHit)).applyColourMultiplier(target.blockX, target.blockY, target.blockZ).multiplyVelocity(0.2F).multipleParticleScaleBy(0.6F));
 
    return true;
}

メソッド名や引数が違うのはコードを使ってる場所が違うだけで内容は全く同じ。
本体のコードと違うところは、叩かれた面によって座標を変動させる所。
さっきも書いたけど、1秒間に何回も呼ばれるメソッドだし、変動しない値を6回も評価するのは無意味なのでswitchで目的の値へ飛ぶ方が速い。

でもまあ、こんな感じで本体のコードから持ってきたヤツも信用せずちゃんと書き換えれば少しは体感できるぐらい軽くなるのかも?

Selectable Paintingsが進まないのもこの辺があってすごく面倒だから・・・
テクスチャの解析に時間が掛かるからって言って当時にできる限りの最適化をやってたからなあー。