Yuki Nakata's Blog

スーパー中ちゃん♪

三国志13のチュートリアル 魏武強兵の攻略です。

呂布軍を撃破せよ

かなりの初見殺しです。 それまでは簡単だったのですが、少し難しくなっています。

集落懐柔をして集落を従属させていきましょう。

済北は山賊が支配しているので攻略するのは簡単です。

許昌も攻め落としましょう。許昌を攻略することでトータルの兵士数が増えます。 

これで曹操軍の兵数がトータル5万を超えます。呂布軍は2万5千なので2倍です。

さすがに呂布が強くても、勝つことができるようになります。

ポイントは複数の都市から出陣する方法です。

部隊毎に進軍させたり、停止させることができます。一斉に攻撃できるように部隊のタイミングを計りましょう。

この章は訓練しなくてもいいと思います。

Cub Linuxをインストールしました。

chrome + ubuntu でcub linuxです。

cub linux
 ここからダウンロードできます。
Screenshot from 2016-02-05 11:21:41
マウスポインタが指しているアイコンをクリックでインストール。

後はUbuntuのインストールと同じです。Englishでインストールします。
Screenshot from 2016-02-05 20:48:45
インストール後に日本語にします。

Elementary OS 初期設定2 日本語入力 Japanese Input  <-- 全く同じ方法で日本語になります。ご参考に

デフォルトでChromeやFlashが入っていますので、いきなりYoutubeが利用できます。

あとguest additionsをインストールしなくてもフルスクリーンになります。

Linuxのデスクトップも魅力的になってきたと思います。

非常に気に入りました。アイコンもフラットデザインでスマホっぽいです。

Elementary OS やlubuntuからcub linuxへと乗り換えました。

2016年はこれで行きます。

nakatayuki.com ドメインが失効してしまいました。

 domain
見ると突然こんな表示に。

失効したドメインを復旧させる方法を書いています。

まずは深呼吸をして落ち着きます。

スタードメインを利用しています。ややこしいですが、運営会社はネットオウルです。そのドメインサービスがスタードメインになります。

1 ネットオウルにログインしてお金を振り込みます。

 ネットオウルプリペイドからお金を振り込みます。クレジットカード払いだとすぐに反映されるのでクレジットカードがおススメです。

2 利用中のサービスから自分のドメインを選択して、料金を支払い更新します。
domain2

 これだけでは失効したままです。

3 お問い合わせフォームから復旧お願いのメールを送ります。
 ネットオウルお問い合わせフォーム
 
ネットオウルIDと名前とメールアドレスを入力します。 URLは必要ありません。

件名は 失効したドメインの復旧のお願い

内容は

お世話になります、スタードメインを利用しておりますOOと申します。

この度、ドメイン「OO.com] の有効期限が切れて失効となってしまいました。

既にプリペイドでチャージを済ませ、料金を支払い更新しました。

お忙しいところ申し訳ありませんが、ドメイン復旧をお願いいたします。

何卒よろしくお願いいたします。


 
12時間くらい経ち復旧しました。

ドメインは先払いです。気を付けましょう。
 

コールマンのオーバーサングラスの紹介です。

実は2015年アマゾンで購入した中で一番良かったのがこのサングラス。

オーバーサングラスです。度は入っていません。眼鏡の上にもかけられるサングラスです。

もちろん眼鏡なしでもコンタクトでも可。

年を取ると太陽光が眩しい。スーパーやデパートのライトが眩しい。本屋のジュンク堂が眩しすぎる。

眩しくてしょうがない。紫外線も飛蚊症も気になる。

酷いときは眼を開けているだけで痛い。

というわけで外出する際はサングラスを掛けています。

オーバーサングラス
コールマンのオーバーサングラス。もっと早く買えば良かった。2000円以下で購入できます。

パソコンの液晶ディスプレイを見ていて辛いときも、このサングラスを使っています。

非常におススメです。

100円ショップでも似たようなのがあります。ダイソー、キャンドゥで売っていますが、デザインはコールマンの方が良い。

写真でもわかるとおり、横もサングラスになっています。

視界を遮らないような配慮がなされているのがグッド。

夜暗くなると見えづらくなり危ないので外します。

一個持っておいて損はないです。

順序として目薬に頼る前にまずサングラスだと思っています。

Coleman(コールマン) メガネの上から掛けられるオーバーサングラス 偏光レンズ ブラックマット CO3012-2
 

働く人のための大人リュック ultima tokyo

仕事ではリュックを使っています。

外でスマホを使うとき、手が開いていると非常に便利です。

使っているのはコレ
_UY500_
Ultima Tokyoのルーカス2 色は鮮やかなオレンジ。目立ちます。

激しく忘れ物をするので、派手な色を選択するようになりました。カラーはネイビーとブラックもあります。

13.3インチのノートPCがすっぽりと入ります。

両脇に水筒と折り畳み傘を入れて完成。

自転車通勤、バイク通勤をしている人にはやはりリュックが良いですね。


ライブドアのレベル別ランキングで3になりました。

ようやく記事数100です。

目安としてはユニークユーザーのアクセスが一日100人突破するとレベル3になります。

ブログを始めて半年かかっています。 

ランキング4ははるか遠く感じます。 

linux glibcのrand関数のソースコードを読んでみましょう。

どうやって乱数を生成しているのか調べてみましょう。全く怖くありません。

まず乱数についてですが、真性乱数と擬似乱数に分類されます。glibcの乱数は周期性があるため擬似乱数となります。優秀な擬似乱数としてはメルセンヌ・ツイスタ乱数があります。暗号に使われるのは真性乱数の方ですね。難しそうな説明はここまで。w

glibc ダウンロードディレクトリ glibc-2.22.tar.gz

rand関数は解凍してstdlibディレクトリのrandom.cとrandom_r.cに書かれています。

ソースコードを読む、というよりパクって実装して動かしてみると理解できます。

まず今は使われていない昔のrand関数を書いていきます。
oldrand.c

#include <stdio.h>
#include <stdlib.h>

/* x**31 + x**3 + 1.  */
#define    TYPE_3        3
#define    BREAK_3        128
#define    DEG_3        31
#define    SEP_3        3

//実はこの乱数テーブルをいじっているだけ 昔の乱数は2番目の-1726662223しか使っていない
static int32_t  randtbl[DEG_3 + 1] =
  {
    TYPE_3,

    -1726662223, 379960547, 1735697613, 1040273694, 1313901226,
    1627687941, -179304937, -2073333483, 1780058412, -1989503057,
    -615974602, 344556628, 939512070, -1249116260, 1507946756,
    -812545463, 154635395, 1388815473, -1926676823, 525320961,
    -1009028674, 968117788, -123449607, 1284210865, 435012392,
    -2017506339, -911064859, -370259173, 1132637927, 1398500161,
    -205601318,
  };

static struct random_data unsafe_state =
  {
    .fptr = &randtbl[SEP_3 + 1],
    .rptr = &randtbl[1],

    .state = &randtbl[1],

    .rand_type = TYPE_3,
    .rand_deg = DEG_3,
    .rand_sep = SEP_3,

    .end_ptr = &randtbl[sizeof (randtbl) / sizeof (randtbl[0])]
};

void oldrand(struct random_data *buf, int *result)
{
  int *state;

  state = buf->state;
  int val = state[0];
  val = ((state[0] * 1103515245) + 12345) & 0x7fffffff;  //randtbl[1]をごちゃごちゃいじっているだけ
  state[0] = val;
  *result = val;
}

int main()
{
  int i, result;

  for (i = 0; i < 10; i++) {
    oldrand(&unsafe_state, &result);
    printf("oldrand = %d\n", result);
  }

  return 0;
}

$ gcc oldrand.c -o oldrand
./oldrand
oldrand = 897822358
oldrand = 105331223
oldrand = 617672196
oldrand = 1888665581
oldrand = 1128537634
oldrand = 1434149043
oldrand = 980477552
oldrand = 1927835113
oldrand = 1772747374
oldrand = 1723946255

これが昔のrand関数です。randtblという乱数テーブルを用意していますが、たった一つしか使っていません。
val = ((state[0] * 1103515245) + 12345) & 0x7fffffff;
ここで数字をいじっているだけです。

次は現在使われている乱数
myrand.c

#include <stdio.h>
#include <stdlib.h>

/* x**31 + x**3 + 1.  */
#define    TYPE_0        0
#define    TYPE_3        3
#define    BREAK_3        128
#define    DEG_3        31
#define    SEP_3        3

//実はこの乱数テーブルをいじっているだけ ポインタを使って順送りしているだけ。最後まで行ったら最初に戻る
static int32_t randtbl[DEG_3 + 1] =
  {
    TYPE_3,

    -1726662223, 379960547, 1735697613, 1040273694, 1313901226,
    1627687941, -179304937, -2073333483, 1780058412, -1989503057,
    -615974602, 344556628, 939512070, -1249116260, 1507946756,
    -812545463, 154635395, 1388815473, -1926676823, 525320961,
    -1009028674, 968117788, -123449607, 1284210865, 435012392,
    -2017506339, -911064859, -370259173, 1132637927, 1398500161,
    -205601318,
  };

static struct random_data unsafe_state =
  {
    .fptr = &randtbl[SEP_3 + 1],
    .rptr = &randtbl[1],

    .state = &randtbl[1],

    .rand_type = TYPE_3,
    .rand_deg = DEG_3,
    .rand_sep = SEP_3,

    .end_ptr = &randtbl[sizeof (randtbl) / sizeof (randtbl[0])]
};

void myrand(struct random_data *buf, int *result)
{
  int *state;


      int32_t *fptr = buf->fptr;
      int32_t *rptr = buf->rptr;
      int32_t *end_ptr = buf->end_ptr;
      int32_t val;

      val = *fptr += *rptr;
      /* Chucking least random bit.  */
      *result = (val >> 1) & 0x7fffffff;  //ここで数字をいじる。他はポインタの書き換えでしかない
      ++fptr;
      if (fptr >= end_ptr) {
           fptr = state;
            ++rptr;
        } else {
           ++rptr;
          if (rptr >= end_ptr)
           rptr = state;
        }
      buf->fptr = fptr;
      buf->rptr = rptr;

}

int main()
{
  int i, result;

  for (i = 0; i < 10; i++) {
    myrand(&unsafe_state, &result);
    printf("oldrand = %d\n", result);
  }

  return 0;
}
$ gcc myrand.c -o myrand
$ ./myrand
oldrand = 1804289383
oldrand = 846930886
oldrand = 1681692777
oldrand = 1714636915
oldrand = 1957747793
oldrand = 424238335
oldrand = 719885386
oldrand = 1649760492
oldrand = 596516649
oldrand = 1189641421

難しそうですがやっていることはポインタを使って読み込むrandtblのアドレスを書き換えているだけです。

もちろん、これだけだと毎回同じ乱数が生成されます。

srandは与えられた種を元にrandtblのデータを書き換えているだけです。

それで毎回異なる乱数を生成することができるようになります。

仕組みは恐ろしく簡単です。

それよりも注意が必要なのは関数の実態がわかりづらいことです。

random.cの中でsrandが関連付けられています。

weak_alias (__srandom, srand)  とあります。

srandを呼び出すと__srandomに変換されますよ、という意味。

さらに__srandom_r関数へと変換されて、random_r.cファイルの中で定義されています。

つまりsrand 関数は内部では __srandom_r 関数になります。

仕組みはこんなもんです。この調子でglibcのソースコードを読んでいきましょう。

↑このページのトップヘ