shonen.hateblo.jp

やったこと,しらべたことを書く.

jQueryでdata要素のキーと値を持つ要素を選択する

jQuerydataで追加した要素にも使えます.

バージョン

結論

data"key"をキー"val"を値に持つ要素の色をredに変える場合.

$("div")
  .filter((idx,elem)=>($(elem).data("key") == "val"))
  .css("color", "red");

Array.prototype.filter() と引数が違う

Array.prototype.filter() は「要素」「インデックス」「配列」の順に与えられる.

jQueryでは「インデックス」「要素」の順に与えられる.

要素をjQueryで処理したい時は $() で囲む必要がある

windowsの環境変数のPATHに書き込んだのに反映されないとき

  • アプリケーションを再起動する
  • OSを再起動する
  • 環境変数のPATHの設定を開いて,重複して追加されている項目が無いか確かめる.あれば片方消す.
    • AppData\Local\Microsoft\WindowsApps が2つありませんか?僕はありました.
  • 環境変数のPATHの設定を開いて,1行表示にして,;;が含まれていないか確認する.あれば;にする.
    • 僕はありました.

whitespaceを出力するコンパイラのようなものを作った

この記事は何ですか

日記です

興味を持った

コンパイラを作る講習会があったらしく*1, 興味を持ったので自分でもコンパイラを書いてみた.

どんなコンパイラ

*1:https://note.mu/ruiu/n/n00ebc977fd60

*2:スペース,タブ,改行を一切入れなくても成立するsyntaxなのでwhitespaceと共存出来る

続きを読む

C++ の継承でよく見かける virtual について

何度も調べているので,もう自分でまとめた.

参考資料

http://www.yunabe.jp/docs/cpp_virtual_destructor.html

virtual に関する実験

#include "bits/stdc++.h"
using namespace std;

struct A{
    int x;
    A(int _x = 1):x(_x){
        cout << "construct A : " << x << endl;
    }
    virtual ~A(){
        cout << "destruct A : " << x << endl;
    }
    virtual void func(){
        cout << "func A : x=" << x << endl;
    }
};

struct B: public A{
    int y;
    B(int _y = 2, int _x = 1):A(_x),y(_y){
        cout << "construct B : " << x << ',' << y << endl;
    }
    ~B(){
        cout << "destruct B : " << x << ',' << y << endl;
    }
    void func(){
        cout << "func B : y=" << y << endl;
    }
};

int main(){
    unique_ptr<A> ptr;
    ptr.reset(new A(10));
    ptr->func();
    ptr.reset(new B(20, 30));
    ptr->func();
    
    A* p = new B(9, 99);
    p->func();
    delete p;
    
    return 0;
}

結果.

construct A : 10
func A : x=10
construct A : 30
construct B : 30,20
destruct A : 10
func B : y=20
construct A : 99
construct B : 99,9
func B : y=9
destruct B : 99,9
destruct A : 99
destruct B : 30,20
destruct A : 30

A*B* を代入しても,B 側のメソッドが呼ばれる.デストラクタも同様.

かなり不思議な挙動だと思いませんか? 変数 A* p の気持ちになって観察すると,A のポインタが入っているはずなので,p->func()A::func() を呼び出すはず.

仕掛け

仮想関数テーブル (vtable) と呼ばれる機構があり,メソッドに virtual と修飾するだけで,適切な関数が呼び出されるよう「動的に」解決してくれる.

動的に解決する以上,ある程度のオーバーヘッドが発生する.

どの程度のオーバーヘッドが気になるならば,virtual 禁止縛りで書いてみると面白いかもしれない.

#include "bits/stdc++.h"
using namespace std;

struct A{
    const char type; // todo: うまいこと隠す
    int x;
    A(int _x = 1, char _type = 'A'):type(_type), x(_x){
        cout << "construct A : " << x << endl;
    }
    ~A();
    void func();
};

struct B: public A{
    int y;
    B(int _y = 2, int _x = 1):A(_x, 'B'),y(_y){
        cout << "construct B : " << x << ',' << y << endl;
    }
    void _delB(){
        cout << "destruct B : " << x << ',' << y << endl;
    }
    void _func(){
        cout << "func B : y=" << y << endl;
    }
};

A::~A(){
    if (type == 'B') ((B*)this)->_delB();
    cout << "destruct A : " << x << endl;
}
void A::func(){
    if (type == 'B') ((B*)this)->_func();
    else
        cout << "func A : x=" << x << endl;
}

int main(){
    
    unique_ptr<A> ptr;
    
    ptr.reset(new A(10));
    ptr->func();
    ptr.reset(new B(20, 30));
    ptr->func();
    
    A* p = new B(9, 99);
    p->func();
    delete p;
    
    return 0;
}

汚い

立方体の各面にテクスチャを貼る - three.js アプリ

HelloWorld(https://threejs.org/docs/index.html#manual/introduction/Creating-a-scene)の次からいきなり詰んだので記事書きました .

環境

  • 0.95.0 from npm

dom操作が苦手なので必要以上にjqueryが登場しますが,その場合はv3とします.

続きを読む