落書きノート

ふと自分が気になった事を書いてます

思い出話

ふと今、思い出話を書こうと思い立って書いてみようと思いました。まあ、思い出というか、いやまあこれも思い出なのかな。苦笑

思えば昔、15歳の頃ですが(中学3年かな)、この頃から病気の兆候がありました。もしかしたらこの前から調子が悪かったのかもしれません。小学生の頃から穏やかな生活を送ってませんでしたから。基準というものが今ではよくわかりません。念のため、ここで書いている病気は精神関係の病です。

少なくとも15歳の頃には唾液が異常に出たり、妙にお腹が鳴ったりと自分でも異常なのがよく分かるぐらいでした。他にも症状があったと思いますが、この2つが特に目立ってました。この症状が出てから3年間ぐらいは我慢したでしょうか。この期間、特に辛かったです。小学生の頃も死にそうな思いで過ごしてましたけど、更に辛くなるとは思っても見ませんでした。

病気とわかってからもまた更に過酷な日々が続くとも思ってませんでした。普通、治療をすると楽になると想像すると思いますが、薬が阻害薬なので、自分の考えではありますが、人によっては更にその症状が出てくるわけです。わかりやすく言えば、枯れるまでその症状が出てくるというイメージですね。ただ、その症状によって壊死の可能性がある部分には薬が作用して回復しますが、ひたすらその症状との戦いを強いられるわけです。

患部は脳全体なのですが、特に目立つ部分は海馬が未熟だということ。この部分をどうにかすれば治ると思われがちなのですが、ここだけではないようなのですね。脳全体と医者は言ってましたから。最近思うのは感覚の問題なのかなぁと思ったりします。その感覚を正常に戻すために海馬などの患部を利用しているだけ…という感じなのでしょうか。もしかしたら手当たり次第に作用しているということも考えられますけど。

小学生の頃(1年生のとき)はあることが原因でいじめの対象になりましたが、まあそれもそれなりの理由はありますけどね。周りの人に説明しても子供だから通じないと思います。賢い子供が集まってるような学校でもありませんし。それにその頃の自分は八方塞がりな状況でしたし、今考えてもその頃の自分には切り抜けることは無理だったろうなと思えるぐらい。親も大人の世界の常識を子供に持ちかけてくるのも無理があります。まあ、運が悪かったです。環境に恵まれなかったのでしょう。

で、それ以外にも色々とありましたが、死にそうな思いをして小学校を卒業し、惰性的に入学した中学校でも大変でした。小学生の頃から半ばやけくそな気持ちで過ごしてましたので、どうでもいいやという気持ちでした。

中学3年の頃に症状が出てきて、何が起こっているのか一瞬理解出来ませんでした。色々対策はしましたが、効果が出ず。どうしようもなかったので、親に相談して病院に。精密検査をしてみても異常なし。自律神経失調症だろうと言われました。その頃の年齢だと小児科ですね。小児科では様子を見たらどうかと言われました。こんな状態で本当に?と思いましたが、詳しい原因がわからないので我慢せざるを得ない状況でした。その頃、微かに覚えてますが、脳のレントゲン写真を見ていると、脳が頭蓋骨に比べてかなり小さかったのを覚えています。その頃にはだいぶ弱っていたのかもしれません。

で、中学校でも辛い思いをしましたが、なんとか卒業し、高校受験です。試験の問題を見てもよくわからなかったので、感覚で解いてました。後で問題と解答を照らし合わせてみると結構あってました。潜在意識では理解していたのかもしれませんね。家庭学習塾で一応真面目に勉強してましたから、それが功を奏したのかもしれません。本番で応用出来ないという感じですね。知識というよりもそれ以外の面で不足していたのだと思います。

高校に入学し、そこではいじめというよりも、病気との戦いでした。それが一番何よりも辛かったのを覚えてます。自由な校風だったので、気持ちにゆとりを持てていたということもあったのですが、それでも病気の症状が出ていました。不思議な感覚ですね。それでも一応やることがないとさすがに暇なので、高校で思い切り勉強しようと思っていましたが、なかなか体が動かず。気持ちだけ先走って時間が過ぎていきました。今ではその高校、厳しくなったようですが、昔は健常人からすれば良い環境だったのではないでしょうか。自分は大学で伸びたという実感はありましたけど、あれはかなり突き放されるような厳しい環境だったので、人によるのかなと思いました。たまたま自分はその大学のやり方を見て必死に勉強したということなんですけどね。やばいと思えば出来るという…。

結局、小学校から体験した悪いエピソード、これが積み重なると色々とやらかすものですね。高校でもその経験を引きずってやらかしたこともあります。

それで、高校3年の頃には更に悪化していたので、精神科にかかることになりました。それであの阻害薬、抗精神病薬ですね。名前はジプレキサ(別名オランザピン)です。その頃は今とは違う別の病名、社会不安障害(別名SAD)を告げられ、パキシル(別名パロキセチン)という抗うつ薬も処方されていました。現在は統合失調症と診断されています。

当時は2つとも画期的な新薬と言われていました。ジプレキサは、副作用が少なく、陽性症状や陰性症状両方に効くと評判の薬でした。パキシルも副作用の少ない抗うつ薬と。でも、実際は副作用が出ていると感じるものでした。それにパキシルは効果があったのですが、ジプレキサは本当に効果があるの?と思うぐらいでした。今ではジプレキサだけですが、その薬をずっと飲んでいて、効果が当時とは比べ物にならないくらい違うなあと。おそらく改良に改良を重ねられているのですね。この世界でも自分一人の成果ではなく、他の患者さんの成果も参考にされているのかなと思いました。

で、その薬を飲んで授業に出ました。しかし、その授業で喋りたくなってしまい、我慢していましたが、口から言葉が溢れ出すような感じで他の人にずっと喋りかけていました。自分で喋っている感覚はありましたけど、抑えようと思っても抑えられない状態です。それでいて感覚が麻痺していました。これも不思議ですね…。

幻聴ですね。これにも反応したりと色々大変です。被害妄想から他の人に迷惑をかけてしまったこともありました。慣れないうちはこの辺りで苦戦を強いられます。

そんなこんなで高校を卒業しました。そして大学受験です。この時点でボロボロの自分には受かる大学もあるはずもなく、浪人しました。まあ細かく言えば、その頃はオンラインゲームに夢中になっていたということもあり、勉強がおろそかになっていたということも関係しています。浪人で反省し、予備校で勉強していました。勉強スペースで勉強しようと思いましたが、持病があるので、それを避け、気が紛れる喫茶店(ベローチェ)に通い詰めし、そこで勉強していました。これも辛かったですね。受験シーズンが近づくにつれ、プレッシャーを感じるようになります。そのプレッシャーに耐えられなくなって公募推薦で前に通っていた大学に行くことになりました。必要な成績はなんとかなりました。

大学でもやはりエピソードが積み重なっているので、うまく行かず。サークルとかにも入ってましたけど、結局野良で出会った人たちと仲良くする機会が多かったです。語学自習室という自分とは無縁の場所もよく行った覚えがあります。そこでかな。英語を勉強し出したのは。動機は熱心に英語を勉強している人を見て、それに刺激されたのかもしれません。高校や予備校のときの自分を思い出しました。真面目に頑張っている方が自分の性に合っているということで。

TOEICを初めて受けたときは散々でした。380点ぐらいだったかな。もう少し低かったか。中村澄子さんの1日1分レッスンをやってから480点取りました。リスニングや長文、この辺りが全然できなかったですね。自分、もともとは文系だったのですが、高校の時、思い切って理系に転向して数学や物理を頑張っていたら、文系科目ができなくなってしまいました。覚えるのが苦手になったんですね。長文も読みづらいし…。公募推薦の英語、よくしのげたなと思われるかもしれませんが、かなり適当にやりましたよ。それで運良く受かりました。数学もそんなに出来たというわけでもないですけど、英語よりかはマシです。この部分は浪人の経験のおかげかも。笑

まあ、理系でTOEIC500点以上を取れば、良い方だと聞いたことがあります。文系はわかりませんが、京大の人でこのぐらいだと聞いたことがあります。もちろん点数の良い人と悪い人と上下しているとは思いますが。京大の大学院も500点から600点ぐらいあれば良いのかもしれません。ああ、あまりあてにはしないでくださいね。専門ではないですから。笑。試験があると思うので、ここでいい結果を出しておけば良いんだと思います。

ACM/ICPCのサークルにも入って活動に参加した経験もあります。こういうものがあるんだなというぐらいは参考になりました。もちろん持病があるので、まともに出来たわけではないのですが。

ここで思うのは、自分から色々なものを自発的に見ていくというだけでも全然違うと思いました。今は出来なくても、後々の自分にいい影響があると。もちろんそのことについて考えずにいると無駄に終わってしまう可能性もありますが、見ないよりはマシです。

長々と書きましたが、今回はこんな感じです。次回、また思いついたら近況とともに書いてみます。

HTML CSS JavaScriptでCG作成

面白かったので講座の続きを。ここで少し疲れたかな。

<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="utf-8" />
    <title>Canvas Tutorial Template</title>
    <script type="text/javascript">
        const NUM = 500;
        const WIDTH = 640;
        const HEIGHT = 480;
        var speedX = new Array(NUM);
        var speedY = new Array(NUM);
        var locX = new Array(NUM);
        var locY = new Array(NUM);
        var radius = new Array(NUM);
        var r = new Array(NUM);
        var g = new Array(NUM);
        var b = new Array(NUM);
        var ctx;

        function init() {
            var canvas = document.getElementById('tutorial');
            if (canvas.getContext) {
                ctx = canvas.getContext('2d');
            }
            for (var i = 0; i < NUM; i++) {
                speedX[i] = Math.random() * 8.0 - 4.0;
                speedY[i] = Math.random() * 8.0 - 4.0;
                locX[i] = WIDTH / 2;
                locY[i] = HEIGHT / 2;
                radius[i] = Math.random() * 8.0 + 1.0;
                r[i] = Math.floor(Math.random() * 64);
                g[i] = Math.floor(Math.random() * 64);
                b[i] = Math.floor(Math.random() * 64);
            }
            setInterval(draw, 33);
        }

        function draw() {
            ctx.globalCompositeOperation = "source-over";
            ctx.fillStyle = "rbga(8,8,12,.1)";
            ctx.fillRect(0, 0, WIDTH, HEIGHT);
            ctx.globalCompositeOperation = "lighter";

            for (var i = 0; i < NUM; i++) {
                locX[i] += speedX[i];
                locY[i] += speedY[i];

                if (locX[i] < 0 || locX[i] > WIDTH) {
                    speedX[i] *= -1.0;
                }

                if (locY[i] < 0 || locY[i] > HEIGHT) {
                    speedY[i] *= -1.0;
                }

                ctx.beginPath();
                ctx.fillStyle = 'rgb(' + r[i] + ',' + g[i] + ',' + b[i] + ')';
                ctx.arc(locX[i], locY[i], radius[i], 0, Math.PI * 2.0, true);
                ctx.fill();
            }
        }

    </script>
    <style type="text/css">
        canvas {
            background-color: #000;
            border: 1px solid #999;
        }

    </style>
</head>

<body onload="init();">
    <canvas id="tutorial" width="640" height="480"></canvas>
</body>

</html>

f:id:kh2n:20170516173836p:plain

HTML CSS JavaScriptでCG作成

講座を見て自分でやってみました。乱数便利!

<html>

<head>
    <title>Canvas tutorial template</title>
    <script type="text/javascript">
        function draw() {
            var canvas = document.getElementById('tutorial');
            if (canvas.getContext) {
                var ctx = canvas.getContext('2d');
                ctx.globalAlpha = 0.3;
                for (i = 0; i < 1000; i++) {
                    ctx.beginPath();
                    var r = Math.floor(Math.random() * 256);
                    var g = Math.floor(Math.random() * 256);
                    var b = Math.floor(Math.random() * 256);
                    ctx.strokeStyle = 'rgb(' + r + ',' + g + ',' + b + ')';
                    ctx.arc(Math.random() * 400, Math.random() * 300, 5, 0, Math.PI * 2, false);
                    ctx.stroke();
                }
            }
        }

    </script>
    <style type="text/css">
        canvas {
            border: 1px solid #999;
        }

    </style>
</head>

<body onload="draw();">
    <canvas id="tutorial" width="400" height="300"></canvas>
</body>

</html>

f:id:kh2n:20170516171819p:plain

<html>

<head>
    <title>Canvas tutorial template</title>
    <script type="text/javascript">
        function draw() {
            var canvas = document.getElementById('tutorial');
            if (canvas.getContext) {
                var ctx = canvas.getContext('2d');
                ctx.globalAlpha = 0.5;
                for (i = 0; i < 500; i++) {
                    ctx.beginPath();
                    var r = Math.floor(Math.random() * 256);
                    var g = Math.floor(Math.random() * 256);
                    var b = Math.floor(Math.random() * 256);
                    ctx.fillStyle = 'rgb(' + r + ',' + g + ',' + b + ')';
                    ctx.arc(Math.random() * 400, Math.random() * 300, 15, 0, Math.PI * 2, false);
                    ctx.fill();
                }
            }
        }

    </script>
    <style type="text/css">
        canvas {
            border: 1px solid #999;
        }

    </style>
</head>

<body onload="draw();">
    <canvas id="tutorial" width="400" height="300"></canvas>
</body>

</html>

f:id:kh2n:20170516171849p:plain

HTML CSS JavaScriptでCG作成

VSCode,汎用的に使えるのは良いですが、インデントの挙動がおかしいとかがあって、まだところどころバグがあるんじゃないのかと思うのですが…。試しにAdobe提供のBracketsを使ってみると便利に使えたのでこちらを使ってみてます。Google Chromeでないとライブプレビューが使えないというのが少し気になりましたが、インストールして使うようにしました。拡張機能はBeautifyをインストールしました。ソースコードのフォーマッタですね。

この分野のプログラミング、コツを掴むと面白いと思います。ゲームプログラミングをしているかのような。普段からアルゴリズムの問題を解いてますけど、これのCG版といったような感じでしょうか。想像力が必要というのが少し異なるかも…。

<html>

<head>
    <title>Canvas tutorial template</title>
    <script type="text/javascript">
        function draw() {
            var canvas = document.getElementById('tutorial');
            if (canvas.getContext) {
                var ctx = canvas.getContext('2d');
                ctx.globalAlpha = 0.5;
                ctx.beginPath();
                ctx.fillStyle = '#3399FF';
                ctx.arc(150, 150, 80, 0, Math.PI * 2.0, true);
                ctx.fill();
                ctx.beginPath();
                ctx.fillStyle = '#FF9933';
                ctx.arc(250, 150, 80, 0, Math.PI * 2.0, true);
                ctx.fill();
            }
        }

    </script>
    <style type="text/css">
        canvas {
            border: 1px solid #999;
        }

    </style>
</head>

<body onload="draw();">
    <canvas id="tutorial" width="400" height="300"></canvas>
</body>

</html>

f:id:kh2n:20170516153150p:plain

<html>

<head>
    <title>Canvas tutorial template</title>
    <script type="text/javascript">
        function draw() {
            var canvas = document.getElementById('tutorial');
            if (canvas.getContext) {
                var ctx = canvas.getContext('2d');
                ctx.globalAlpha = 0.3;
                for (i = 0; i < 1000; i++) {
                    ctx.beginPath();
                    var r = Math.floor(Math.random() * 256);
                    var g = Math.floor(Math.random() * 256);
                    var b = Math.floor(Math.random() * 256);
                    ctx.strokeStyle = 'rgb(' + r + ',' + g + ',' + b + ')';
                    // ランダムな場所に始点を移動
                    ctx.moveTo(Math.random() * 400, Math.random() * 300);
                    // ランダムな場所まで線を描く
                    ctx.lineTo(Math.random() * 400, Math.random() * 300);
                    ctx.stroke();
                }
            }
        }

    </script>
    <style type="text/css">
        canvas {
            border: 1px solid #999;
        }

    </style>
</head>

<body onload="draw();">
    <canvas id="tutorial" width="400" height="300"></canvas>
</body>

</html>

f:id:kh2n:20170516153920p:plain

<html>

<head>
    <title>Canvas tutorial template</title>
    <script type="text/javascript">
        var speedX = 3.0;
        var speedY = 4.0;
        var locX = 200;
        var locY = 150;
        var ctx;

        function init() {
            var canvas = document.getElementById('tutorial');
            if (canvas.getContext) {
                ctx = canvas.getContext('2d');
                setInterval(draw, 33);
            }
        }

        function draw() {
            ctx.globalCompositeOperation = "source-over";
            ctx.fillStyle = "rgba(8,8,12,.2)";
            ctx.fillRect(0, 0, 400, 300);
            ctx.globalCompositeOperation = "lighter";

            locX += speedX;
            locY += speedY;

            if (locX < 0 || locX > 400)
                speedX *= -1;

            if (locY < 0 || locY > 300)
                speedY *= -1;

            ctx.beginPath();
            ctx.fillStyle = '#3399FF';
            ctx.arc(locX, locY, 4, 0, Math.PI * 2.0, true);
            ctx.fill();
        }

    </script>
    <style type="text/css">
        canvas {
            background-color: #000;
            border: 1px solid #999;
        }

    </style>
</head>

<body onload="init();">
    <canvas id="tutorial" width="400" height="300"></canvas>
</body>

</html>

f:id:kh2n:20170516153902p:plain

OpenGL ウォークスルー問題 再トライそして完成

C/C++,OpenGLのウォークスルー問題です。懲りずにやりました。結果、出来ました。gluLookAt関数じゃないと出来ないと思ってましたけど、glRotate関数とglTranslate関数でも出来るものですね。微調整もしました。個人的には完璧に出来たと思います。実験とはまた違う感じかもしれないですけど、これで行けるでしょう!

A. ウォークスルーの実験

#include <stdlib.h>
#include <math.h>
#include <GL/glut.h>

int w0, h0;
int wa, ha;
double a;
double v;
const double t = 10;
const double PI = 3.14;

void scene(void)
{
  /* 物体の色 */
  static GLfloat red[] = { 0.8, 0.2, 0.2, 1.0 };
  static GLfloat green[] = { 0.2, 0.8, 0.2, 1.0 };
  static GLfloat blue[] = { 0.2, 0.2, 0.8, 1.0 };
  static GLfloat yellow[] = { 0.8, 0.8, 0.2, 1.0 };
  static GLfloat ground[][4] = {
    { 0.6, 0.6, 0.6, 1.0 },
    { 0.3, 0.3, 0.3, 1.0 }
  };

  int i, j;

  /* 赤い箱 */
  glPushMatrix();
  glTranslated(0.0, 0.0, -3.0);
  glMaterialfv(GL_FRONT, GL_DIFFUSE, red);
  glutSolidCube(1.0);
  glPopMatrix();

  /* 緑の箱 */
  glPushMatrix();
  glTranslated(0.0, 0.0, 3.0);
  glMaterialfv(GL_FRONT, GL_DIFFUSE, green);
  glutSolidCube(1.0);
  glPopMatrix();

  /* 青い箱 */
  glPushMatrix();
  glTranslated(-3.0, 0.0, 0.0);
  glMaterialfv(GL_FRONT, GL_DIFFUSE, blue);
  glutSolidCube(1.0);
  glPopMatrix();

  /* 黄色い箱 */
  glPushMatrix();
  glTranslated(3.0, 0.0, 0.0);
  glMaterialfv(GL_FRONT, GL_DIFFUSE, yellow);
  glutSolidCube(1.0);
  glPopMatrix();

  /* 地面 */
  glBegin(GL_QUADS);
  glNormal3d(0.0, 1.0, 0.0);
  for (j = -5; j < 5; ++j) {
    for (i = -5; i < 5; ++i) {
      glMaterialfv(GL_FRONT, GL_DIFFUSE, ground[(i + j) & 1]);
      glVertex3d((GLdouble)i, -0.5, (GLdouble)j);
      glVertex3d((GLdouble)i, -0.5, (GLdouble)(j + 1));
      glVertex3d((GLdouble)(i + 1), -0.5, (GLdouble)(j + 1));
      glVertex3d((GLdouble)(i + 1), -0.5, (GLdouble)j);
    }
  }
  glEnd();
}

void display(void)
{
  static GLfloat lightpos[] = { 3.0, 4.0, 5.0, 1.0 }; /* 光源の位置 */

  static double ex = 0.0, ez = 0.0; /* 視点の位置 */
  static double r = 0.0;            /* 視点の向き */
  static double rd = 0.0;
  
  /* 画面クリア */
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  /* モデルビュー変換行列の初期化 */
  glLoadIdentity();

  /* 視点の移動 */
  glRotated(r, 0.0, 1.0, 0.0);
  glTranslated(ex, 0.0, ez);

  /* 光源の位置を設定 */
  glLightfv(GL_LIGHT0, GL_POSITION, lightpos);

  /* シーンの描画 */
  scene();

  glutSwapBuffers();

  if(ha < 0) {
    v = abs(ha) * 0.0001;
    ex = ex - v * sin(r * PI / 180) * t;
    ez = ez + v * cos(r * PI / 180) * t;
  } else if(ha > 0){
    v = abs(ha) * 0.0001;
    ex = ex + v * sin(r * PI / 180) * t;
    ez = ez - v * cos(r * PI / 180) * t;
  }

  if(wa > 0) {
    rd = abs(wa);
    a = rd / t * 0.01;
    r = r + a * t;
  } else if(wa < 0){
    rd = abs(wa);
    a = rd / t * 0.01;
    r = r - a * t;
  }
}

void resize(int w, int h)
{
  w0 = w / 2, h0 = h / 2;
  /* ウィンドウ全体をビューポートにする */
  glViewport(0, 0, w, h);

  /* 透視変換行列の指定 */
  glMatrixMode(GL_PROJECTION);

  /* 透視変換行列の初期化 */
  glLoadIdentity();
  gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0);

  /* モデルビュー変換行列の指定 */
  glMatrixMode(GL_MODELVIEW);
}

void keyboard(unsigned char key, int x, int y)
{
  /* ESC か q をタイプしたら終了 */
  if (key == '\033' || key == 'q') {
    exit(0);
  }
}

void init(void)
{
  /* 初期設定 */
  glClearColor(1.0, 1.0, 1.0, 0.0);
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_CULL_FACE);
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
}

void idle(void) {
  glutPostRedisplay();
}

void mouse(int button, int state, int x, int y) {
  switch(button) {
  case GLUT_LEFT_BUTTON:
    if(state == GLUT_DOWN) {
      glutIdleFunc(idle);
    } else {
      glutIdleFunc(0);
    }
    break;
  }
}

void motion(int x, int y) {
  wa = x - w0, ha = y - h0;
}

int main(int argc, char *argv[])
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH);
  glutCreateWindow(argv[0]);
  glutDisplayFunc(display);
  glutReshapeFunc(resize);
  glutKeyboardFunc(keyboard);
  glutMouseFunc(mouse);
  glutMotionFunc(motion);
  init();
  glutMainLoop();
  return 0;
}
> brew cask install xquartz
> brew install freeglut
> gcc core.cpp -o core -I/usr/local/include -L/usr/local/lib -framework GLUT -framework OpenGL -mmacosx-version-min=10.8

f:id:kh2n:20170516000726p:plain

意外と使いやすい書見台

最近、アマゾンで書見台を見ていると、こんなものが上位に上がっていました。

竹製と書かれていますが、買って使ってみると木製なんじゃないのかと思ったりします。まあ、それは置いておいて…。

この書見台、初めて使ったときは使いにくいのなんのって…と思ってましたが、工夫すれば意外と使えました。工夫して使っているうちにピンが柔らかくなってきて、今ベストな状態で使えています。普通に使ってると分厚い参考書が挟めないということに気づくのですが、ピンを外側に持っていくと挟めるようになります。まあ、actto(旧エレコム?)の書見台の方が遥かに使いやすいですけど、デザインが良いですね。それもありますけど、せっかく買ったので大切に使っています。