トップ «前の日(11-20) 最新 次の日(11-22)»

2019-11-21 (Th)

_ ごまおつ

もうプレイしないだろうな。

飽きた。

終盤に所属していたギルドが強すぎてやる気をなくした、と思う。 全然ついていけないんだもん。

ギルドを抜けてからもたまに土曜のスコア大会をプレイしてたけど、 もういいや。

ってことで、アンインストールした。

さようなら〜〜 ノシ

(と言いつつ、引き継ぎに必要な情報だけはスクショ撮ってる)


2021-11-21 (Su)

_ 全角と半角の文字幅

固定幅フォントにおいては、2:1 になるのが正しいと思ってたんだけど…

なんでか、全角半角を混ぜてテキストで表を作ろうとすると、 必ず | の位置が微妙にずれてしまう。

ここ数日ちょっと調べてみた。

freetype を直接ごりごり扱ってみたり。

#include <ft2build.h>
#include FT_FREETYPE_H
#include <freetype/ftimage.h>

static unsigned int text[] = {
    0x00003042, 0x00003044, 0x00003046, 0x00003048,
    0x0000304a, 0x0000304b, 0x0000304d, 0x0000304f,
    0x00003051, 0x00003053, 0x00003055, 0x00003057,
    0x00003059, 0x0000305b, 0x0000305d, 0x0000305f,
    0x00003061, 0x00003064, 0x00003066, 0x00003068,
    0x00003042, 0x00003044, 0x00003046, 0x00003048,
    0x0000304a, 0x0000304b, 0x0000304d, 0x0000304f,
    0x00003051, 0x00003053, 0x00003055, 0x00003057,
    0x00003059, 0x0000305b, 0x0000305d, 0x0000305f,
    0x00003061, 0x00003064, 0x00003066, 0x00003068,
    0x0000000a,
    0x00000061, 0x00000062, 0x00000063, 0x00000064,
    0x00000065, 0x00000066, 0x00000067, 0x00000068,
    0x00000069, 0x0000006a, 0x0000006b, 0x0000006c,
    0x0000006d, 0x0000006e, 0x0000006f, 0x00000070,
    0x00000071, 0x00000072, 0x00000073, 0x00000074,
    0x00000075, 0x00000076, 0x00000077, 0x00000078,
    0x00000079, 0x0000007a,
    0x00000061, 0x00000062, 0x00000063, 0x00000064,
    0x00000065, 0x00000066, 0x00000067, 0x00000068,
    0x00000069, 0x0000006a, 0x0000006b, 0x0000006c,
    0x0000006d, 0x0000006e, 0x0000006f, 0x00000070,
    0x00000071, 0x00000072, 0x00000073, 0x00000074,
    0x00000075, 0x00000076, 0x00000077, 0x00000078,
    0x00000079, 0x0000007a,
    0x0000000a,
};
#define LEN (sizeof text / sizeof text[0])

#define WIDTH  1024
#define HEIGHT 256
#define LEFT 16
#define TOP 128
static unsigned char paper[HEIGHT][WIDTH];


static void draw(FT_Bitmap *bitmap, int x, int y)
{
    for (int j = 0; j < bitmap->rows; j++) {
        for (int i = 0; i < bitmap->width; i++) {
            unsigned char c = bitmap->buffer[j * bitmap->pitch + i];
            if (c) {
                if (y + j >= 0 && y + j < HEIGHT) {
                    if (x + i >= 0 && x + i < WIDTH)
                        paper[y + j][x + i] = 255;
                }
            }
        }
    }
}

int main(void)
{
    FT_Library library;
    int error;

    error = FT_Init_FreeType(&library);
    if (error) {
        fprintf(stderr, "ft init error\n");
        exit(1);
    }

    FT_Face face;
    error = FT_New_Face(
            library,
            "/usr/share/fonts/TTF/NasuM-Regular-20141215.ttf",
            0,
            &face);
    if (error) {
        fprintf(stderr, "new face error\n");
        exit(1);
    }

    error = FT_Set_Char_Size(
            face,
            0,
            8 * 64,
            300,
            300);
    if (error) {
        fprintf(stderr, "set size error\n");
        exit(1);
    }
    
    int x = LEFT, x6 = LEFT<<6, y = TOP;
    unsigned int idces[LEN];
    for (int i = 0; i < LEN; i++) {
        if (text[i] == '\n') {
            x = LEFT;
            x6 = LEFT<<6;
            y += 24;
            continue;
        }

        idces[i] = FT_Get_Char_Index(face, text[i]);

        error = FT_Load_Glyph(
                face,
                idces[i],
                0 |
//              FT_LOAD_DEFAULT |        // x
                FT_LOAD_NO_HINTING |     // o
//              FT_LOAD_PEDANTIC |       // x
//              FT_LOAD_NO_AUTOHINT |    // x
                0
);
        if (error) {
            fprintf(stderr, "no glyph error\n");
            exit(1);
        }

        error = FT_Render_Glyph(
                face->glyph,
                FT_RENDER_MODE_NORMAL);
        if (error) {
            fprintf(stderr, "glyph render error\n");
            exit(1);
        }
        
        draw(&face->glyph->bitmap,
                (x6 >> 6) + face->glyph->bitmap_left,
                y - face->glyph->bitmap_top);
        
        x += face->glyph->advance.x >> 6;
        x6 += face->glyph->advance.x;
    }
    
    printf("P3\n%d %d\n%d\n", WIDTH, HEIGHT, 255);
    for (int y = 0; y < HEIGHT; y++) {
        for (int x = 0; x < WIDTH; x++) {
            if (paper[y][x]) {
                printf("%d %d %d ", 255, 255, 255);
            } else {
                printf("%d %d %d ", 0, 0, 0);
            }
            printf("\n");
        }
    }
}

実行したら標準出力に ppm ファイルが出力されるので、適当にファイルにリダイレクトして 適当な画像ビューワで見る。

なんと、FT_LOAD_NO_HINTING を指定するとちゃんと 2:1 になるのね。 hinting が悪さしてる? でも fonts.conf で false にしても治らない。

うーーん…

emacs の FT_LOAD_xxx の箇所に全部 FT_LOAD_NO_HINTING を追加してみても、 やっぱりずれるし。

ゔ〜〜〜ん

freetype-infinality とかいうやつにしてみたけど変化なく。

もしや Ubuntu ならうまく設定してたりするのか? と思って Ubuntu live media で 起動してみたけど、やっぱりずれるし。

世の中、幅の比率はあまり気にしない方向なのか? テキストで表を作ろうってのがもう老害?

(3:2 のフォントもあるらしいけど、それは好みなので置いておく)

macOS 上の emacs だと問題ないんだけどな。その辺はさすが mac かな。


2022-11-21 (Mo)

_ 原神

適当にデイリーやって。紀行も進めて。

紀行はあと 700弱で Lv30。 700弱、っつーと、料理を作りまくって鍛造しまくれば、すぐだ。 Lv30 になったら、天空紀行を解放。そうすれば、武器が手に入る…

…んだけど、よく考えたら、今、課金できないんか…… スマホ壊れてるから。

ゲームを始めたプラットフォーム以外では課金できない、って話だけど、 プラットフォーム限定の話かなぁ。android だったら windows でも課金できたり しないのかな。まぁ、windows で課金ってどういう支払い方法(というか経路)? って気はするが。

んー。スマホはよ来い。不便でたまらん。今日発送された。今週中には来るはず。 東京から日本郵便ってどのくらい時間かかるんだろうな。 一晩くらいで来ないかな…


2023-11-21 (Tu)

_ Lenovo ノート PC 発送?

メールが来た。 発送されたのかな?

発送の実績日時が昨日で、届く予定日が30日になってる。 10日はかかんないやろ… まさか海を渡ってくるのか? 国内配送だよなぁ。

あ、配送状況のサイトが日通だった。 日通って PC 系強いというかよく使われてる印象。 以前 HP の PC を修理に出した時も日通だったみたい。

にしても、普通、最寄りの店に到着とか表示しない? 発送のあと、いきなりお届け先配送で予定日(11/30)付き。 予定日まで待たされそうな時、「待たなくていいよー」は どこに連絡したらいいものやら…

ま、明日明後日くらいには届くんじゃないかな。 明日中に届いてくれれば、明後日の祝日は遊び倒すんだけど。

_ 原神 - 画像認識イベントで奇跡が起きる

紫の物産。スミレウリとか鉱石とか緋櫻毬を撮りまくったら、

画像認識 x4

なんと4つ揃った。

画像認識の紀行

この4つで紀行もゲット。

明日あと1つは無理だと思う・・・ 10枚で5色中特定の3色を埋めるのはたぶん無理・・

確率を計算してみる? いや確率統計苦手なんだよな…

ruby でやろ。

total_count = 0
hit_count = 0

(0..4).each do |c0|
  (0..4).each do |c1|
    (0..4).each do |c2|
      (0..4).each do |c3|
        (0..4).each do |c4|
          (0..4).each do |c5|
            (0..4).each do |c6|
              (0..4).each do |c7|
                (0..4).each do |c8|
                  (0..4).each do |c9|
                    a = [0,0,0,0,0]
                    a[c0] += 1
                    a[c1] += 1
                    a[c2] += 1
                    a[c3] += 1
                    a[c4] += 1
                    a[c5] += 1
                    a[c6] += 1
                    a[c7] += 1
                    a[c8] += 1
                    a[c9] += 1
                    if a[0] >= 1 && a[1] >= 1 && a[4] >= 1
                      hit_count += 1
                    end
                    total_count += 1
                  end
                end
              end
            end
          end
        end
      end
    end
  end
end

puts total_count
puts hit_count
puts hit_count.to_f / total_count
luna:~ % ruby test.rb
9765625
6796020
0.695912448

答。約70%。

と聞くと高そうなんだけど、このくらいだったら結構外すんだよね…


追記 パスワード変更