パスワードを忘れた? アカウント作成

rotoさんのトモダチの日記みんなの日記も見てね。 あなたのタレコミがスラドを支えます。さぁ、タレこめ!

12804373 journal
日記

rotoの日記: 禁煙の国

日記 by roto

ニュージーランドでは、禁煙が厳しくてタバコの価格がどんどん上がっているという。
その代わり、禁煙補助薬が約5ドルでゲットできます(リピートの追加費用なし)
という感じでバランスとっている。

日本の場合、健保が禁煙外来の自己負担上限x万円とかやってるけど、桁が違う。

#ニコ飴が旨い。

11843166 journal
日記

rotoの日記: GPL

日記 by roto

     ____________
    ヾミ || || || || || || || ,l,,l,,l 川〃彡|
     V~~''-山┴''''""~   ヾニニ彡|       出す・・・・・・!
     / 二ー―''二      ヾニニ┤       出すが・・・
    '-.,   ̄ ̄     _,,,..-‐、 〉ニニ|       ライセンスは その時と場所の
   /"''-ニ,‐l   l`__ニ-‐'''""` /ニ二|       指定まではしていない
   | ===、!  `=====、  l =lべ=|
.   | `ー゚‐'/   `ー‐゚―'   l.=lへ|~|       そのことを
    |`ー‐/    `ー――  H,〉|=|       どうか諸君らも
    |  /    、          l|__ノー|       思い出していただきたい
.   | /`ー ~ ′   \   .|ヾ.ニ|ヽ
    |l 下王l王l王l王lヲ|   | ヾ_,| \     つまり・・・・
.     |    ≡         |   `l   \__   我々がその気になれば
    !、           _,,..-'′ /l     | ~'''  ソースコードの受け渡しは
‐''" ̄| `iー-..,,,_,,,,,....-‐'''"    /  |      |    10年後 20年後ということも
 -―|  |\          /    |      |   可能だろう・・・・・・・・・・ということ・・・・!
    |   |  \      /      |      |

118172 journal

rotoの日記: GMC-4 Assembler 1

日記 by roto
大人の科学のヤツ、4ビットマイコンと思っていたら、4ビットマイコン風インタプリタ(?)だった。
とりあえず使える程度のアセンブラ(?)を作ってみた。

/* GMC4ASM */

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

#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))

#define CODE_SIZE (0x50)

typedef struct
{
        const char* mnemonic;
        int operand;
        char code;
} mnemonic_t;

typedef struct
{
        const char* exMnemonic;
        char code;
} exMnemonic_t;

typedef struct
{
        const mnemonic_t *mnemonic;
        const exMnemonic_t *exMnemonic;
        char immediate;
        char *label;
} code_t;

typedef struct
{
        char* name;
        int addr;
} label_t;

#define IMM_LABEL (-2)
#define IMM_EXMNE (-1)

static const mnemonic_t mnemonicList[] =
{
        {"KA", 0, '0'},
        {"AO", 0, '1'},
        {"CH", 0, '2'},
        {"CY", 0, '3'},
        {"AM", 0, '4'},
        {"MA", 0, '5'},
        {"M+", 0, '6'},
        {"M-", 0, '7'},
        {"TIA", 1, '8'},
        {"AIA", 1, '9'},
        {"TIY", 1, 'A'},
        {"AIY", 1, 'B'},
        {"CIA", 1, 'C'},
        {"CIY", 1, 'D'},
        {"CAL", IMM_EXMNE, 'E'},
        {"JUMP", IMM_LABEL, 'F'},
};

static const exMnemonic_t extenedMnemonicList[] =
{
        {"RSTO", '0'}, // E0
        {"SETR", '1'}, // E1
        {"RSTR", '2'}, // E2
// {"INPT", '3'}, // E3
        {"CMPL", '4'}, // E4
        {"CHNG", '5'}, // E5
        {"SIFT", '6'}, // E6
        {"ENDS", '7'}, // E7
        {"ERRS", '8'}, // E8
        {"SHTS", '9'}, // E9
        {"LONS", 'A'}, // EA
        {"SUND", 'B'}, // EB
        {"TIMR", 'C'}, // EC
        {"DSPR", 'D'}, // ED
        {"DEM-", 'E'}, // EE
        {"DEM+", 'F'}, // EF
};

typedef enum
{
        ERROR_SUCCESS,
        ERROR_SYNTAX,
        ERROR_LABELDUP,
        ERROR_CODESIZE,
        ERROR_LABELLISTSIZE
} errorCode_t;

static const struct
{
        errorCode_t code;
        const char* message;
} ErrorList[] =
{
        {ERROR_SYNTAX, "Syntax error"},
        {ERROR_LABELDUP, "Label duplicated"},
        {ERROR_CODESIZE, "Too much Codes"},
        {ERROR_LABELLISTSIZE, "Too much Labels"},
};

static const char* wordDelim = " \t";

static int codeCounter = 0;

static code_t codeList[CODE_SIZE];
static int codeListCount = 0;

static label_t labelList[CODE_SIZE];
static int labelListCounter = 0;

static const exMnemonic_t* GetExtendedInstruction(const char *exMnemonicStr)
{
        int i;
        for(i = 0; i < ARRAYSIZE(extenedMnemonicList); i++)
        {
                if(strcmp(extenedMnemonicList[i].exMnemonic, exMnemonicStr) == 0)
                {
                        return &extenedMnemonicList[i];
                }
        }
        return NULL;
}

static int GetLabelAddress(const char *name)
{
        int i;
        for(i = 0; i < labelListCounter; i++)
        {
                if(strcmp(name, labelList[i].name) == 0)
                {
                        return labelList[i].addr;
                }
        }
        return -1;
}

static errorCode_t SetInstruction(const mnemonic_t *mnemonic, char *p)
{
        int operand = mnemonic->operand;
        codeList[codeListCount].mnemonic = mnemonic;
        codeList[codeListCount].exMnemonic = NULL;
        codeList[codeListCount].immediate = '\0';
        codeList[codeListCount].label = NULL;
        codeCounter++;
        if(operand != 0)
        {
                p = strtok(NULL, wordDelim);
                if(p == NULL) return ERROR_SYNTAX;
                if(*p == ';') return ERROR_SYNTAX;
                if(operand == 1)
                {
                        if(strlen(p) != 1) return ERROR_SYNTAX;
                        if(!('0' <= *p && *p <= '9') && !('A' <= *p && *p <= 'F'))
                        {
                                return ERROR_SYNTAX;
                        }
                        codeList[codeListCount].immediate = *p;
                        codeCounter++;
                }
                else if(operand == IMM_LABEL)
                {
                        codeList[codeListCount].label = _strdup(p);
                        codeCounter += 2;
                }
                else if(operand == IMM_EXMNE)
                {
                        const exMnemonic_t* exMnemonic = GetExtendedInstruction(p);
                        if(!exMnemonic) return ERROR_SYNTAX;
                        codeList[codeListCount].exMnemonic = exMnemonic;
                        codeCounter++;
                }
        }
        if(codeCounter > CODE_SIZE) return ERROR_CODESIZE;
        p = strtok(NULL, wordDelim);
        if(p != NULL && *p != ';') return ERROR_SYNTAX;
        codeListCount++;
        return ERROR_SUCCESS;
}

static errorCode_t lineTrans(char* line)
{
        char *p = strtok(_strupr(line), wordDelim);
        int i;
        int len;
        if(p == NULL) return ERROR_SUCCESS;
        if(*p == ';') return ERROR_SUCCESS;

        len = strlen(p);
        if(p[len - 1] == ':')
        {
                if(labelListCounter >= ARRAYSIZE(labelList))
                {
                        return ERROR_LABELLISTSIZE;
                }
                if(len < 2) return ERROR_SYNTAX;
                p[len - 1] = '\0';
                if(GetLabelAddress(p) >= 0) return ERROR_LABELDUP;
                labelList[labelListCounter].name = _strdup(p);
                labelList[labelListCounter].addr = codeCounter;
                labelListCounter++;
                line = strtok(NULL, "");
                if(line == NULL) return ERROR_SUCCESS;
                return lineTrans(strtok(NULL, ""));
        }

        for(i = 0; i < ARRAYSIZE(mnemonicList); i++)
        {
                if(strcmp(p, mnemonicList[i].mnemonic) == 0)
                {
                        if(codeListCount >= ARRAYSIZE(codeList))
                        {
                                return ERROR_CODESIZE;
                        }
                        return SetInstruction(&mnemonicList[i], p);
                }
        }
        return ERROR_SUCCESS;
}

static void OutputInstSet(FILE* fp)
{
        int i;
        int address = 0;

        fprintf(fp, "ADDR\tINST\tCODE\n");
        for(i = 0; i < codeListCount; i++)
        {
                fprintf(fp, "%02X\t%s\t%c\n", address++, codeList[i].mnemonic->mnemonic, codeList[i].mnemonic->code);
                if(codeList[i].immediate != '\0')
                {
                        fprintf(fp, "%02X\t<%c>\t%c\n", address++, codeList[i].immediate, codeList[i].immediate);
                }
                else if(codeList[i].exMnemonic != NULL)
                {
                        fprintf(fp, "%02X\t_%s\t%c\n", address++, codeList[i].exMnemonic->exMnemonic, codeList[i].exMnemonic->code);
                }
                else if(codeList[i].label != NULL)
                {
                        int lbl = GetLabelAddress(codeList[i].label);
                        if(lbl < 0)
                        {
                                fprintf(stderr, "Label %s not found\n", codeList[i].label);
                                return;
                        }
                        fprintf(fp, "%02X\t<%X>\t%X\n", address++, lbl >> 4, lbl >> 4);
                        fprintf(fp, "%02X\t<%X>\t%X\n", address++, lbl & 0xF, lbl & 0xF);
                }
        }
}

void PutErrorMessage(errorCode_t err, int lineCount, char* buf)
{
        int i;
        for(i = 0; i < ARRAYSIZE(ErrorList); i++)
        {
                if(ErrorList[i].code == err)
                {
                        fprintf(stderr, ErrorList[i].message);
                        break;
                }
        }

        fprintf(stderr, "(%d): %s\n", lineCount, buf);
}

int main(int argc, char**argv)
{
        FILE *fp;
        char buf[256];
        int lineCount;

        if(argc < 2)
        {
                fprintf(stderr, "USAGE: GMC4ASM <asm file> [<out file>]\n");
                return 1;
        }
        fp = fopen(argv[1], "r");
        if(fp == NULL)
        {
                fprintf(stderr, "ERR: oepn %s\n", argv[1]);
                return 2;
        }
        lineCount = 0;
        while(fgets(buf, sizeof(buf) - 1, fp) != NULL)
        {
                char *p;
                errorCode_t err;
                buf[sizeof(buf) - 1] = '\0';
                strtok(buf, "\r\n");
                p = _strdup(buf);
                err = lineTrans(p);
                if(err != ERROR_SUCCESS)
                {
                        PutErrorMessage(err, lineCount, buf);
                        free(p);
                        fclose(fp);
                        return 3;
                }
                free(p);
        }
        fclose(fp);

        if(argc > 2)
        {
                fp = fopen(argv[2], "w");
                if(fp == NULL)
                {
                        fprintf(stderr, "ERR: oepn %s\n", argv[2]);
                        return 4;
                }
        }
        else
        {
                fp = stdout;
        }
        OutputInstSet(fp);
        if(fp != stdout)
        {
                fclose(fp);
        }
        return 0;
}
476050 journal

rotoの日記: iEPGを壁カレに食わせるコード

日記 by roto
エラーチェックはザツ。

#include "stdafx.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
// int main(int argc, char* argv[])
{
        std::locale::global(std::locale("japanese"));
        if(__argc < 2)
        {
                std::cout << "USAGE: iEPG2CSV <input.tvpi> [output.CSV]" << std::endl;
                exit(1);
        }
        std::string csvFile = "TV.CSV";
        if(__argc >= 3)
        {
                csvFile = __argv[2];
        }
        std::string iepgFile = __argv[1];
        std::ifstream fin(iepgFile.c_str());
        if(fin.is_open())
        {
                bool isComment = false;
                std::map<std::string, std::string> iepg;
                while(!fin.eof())
                {
                        char buf[1024];
                        fin.getline(buf, sizeof(buf));
                        std::string str = buf;
                        if(str.length() == 0)
                        {
                                isComment = true;
                                continue;
                        }

                        if(!isComment)
                        {
                                int token = str.find(' ');
                                if(token != std::string::npos)
                                {
                                        iepg[str.substr(0, token)] = str.substr(token + 1);
                                }
                        }
                        else
                        {
                                // comment
                                iepg["comment"] += str;
                        }
                }

                std::ofstream fout(csvFile.c_str(), std::ios::out | std::ios::app);
                fout << iepg["year:"] << iepg["month:"] << iepg["date:"] << ","
                        << iepg["start:"] << iepg["program-title:"] << std::endl;
        }
        return 0;
}
530682 journal

rotoの日記: 妖逆門 バーコード メモ

日記 by roto
4bit:不明
6bit:上の数
4bit:↑の隣のバーの数
6bit:真中の数
4bit:↑の隣のバーの数
6bit:下の数
4bit:2=水、3=火、4=金
10bit:不明
1bit:0=地上、1=飛行
6bit:CD(2bit目からCDの直前までの1の合計に1を足したもの)
2bit:ストップビット?
429332 journal

rotoの日記: 牛糞から馬糞

日記 by roto
バイオマス・ガソリンの開発に日本の研究者が成功。

俺「すげー、牛糞からガソリンができるんだってよ。」

(ネトゲに夢中になっている嫁。)
嫁「えっ、なになに。牛糞から馬糞?」

うんこからうんこ作ってどうすんだよ。
639787 journal

rotoの日記: Mydoom

日記 by roto
某メーリングリストにて、やたらとウイルス警告メールが流れた。

流れとしては、
MydoomがFrom:をメーリングリストのアドレスにして、To:はアカウントのみ入れ替えたアドレスのメールを送信。
アカウントが無いので、受信先のサーバが「failure notice」というメールを返す。このメールは送信内容全文(当然ウイルス付き)を含んでいる。
メールリングリストに帰ってきたメールは、投稿されたものとみなされて、メーリングリスト登録者全員に送られる。
登録者のメールサーバなどがウイルスチェックをしていると、ご丁寧にウイルス警告メールを返信してくる。
このために、1通のウイルスメールが4~5倍のジャンクメールを発生させる。

メーリングリスト自体は無償でやってくれているものだから、対策が遅れてもしょうがないと思うのだけど、
差出人を偽装するウイルスに対して警告出すアホなシステム作ってる奴等は恥ずかしくないのだろうか。
644548 journal

rotoの日記: Cygwinで目覚める僕らのゲームボーイ

日記 by roto
ここで話題になった、ゲームボーイのプログラミングの本。
訳あって、LinuxでなくてCygwinでやっているのだけど、GCCさえ動けばあまり関係ないね。
文中にフォトショップやサウンドレコーダーが出てくるし、実際Windowsでやったほうが早いんじゃない?
450788 journal

rotoの日記: くそったれYAH○○!

日記 by roto
某メーリングリストから退会しようと思ったのだが、そのメーリングリストは某eグループを使っていた。
某メーリングリストに登録するときには、自動的に某eグループにも登録されてしまうのだ。
それはいいが、メーリングリストを退会しても某eグループは登録解除できない(?)。
とういか、ヘルプに登録解除の仕方が載っていない。
仕方なく、サポートに解除の仕方をメールで問い合わせしたのだが・・・

> ご登録のメールアドレスから「xxxxxxx-xxxx@xxxx.xxxxx.xx.xx」宛に
> 下記項目につきましてご連絡ください。

> ・eグループ登録削除依頼
> ・お名前
> ・ご登録メールアドレス
> ・生年月日(本人確認のため)
> ・郵便番号

・・・・本人確認?・・・どうやって確認するのだ?
某eグループには(当然メーリングリストにも)、名前も生年月日も郵便番号も登録してないのに・・・・
しかも、解除は手動かよ!!
こいつらあほか?

さらに酷いことには、削除手続きは一度したら同じアドレスは再登録できないらしい。
ということはこのメールアドレスはYAH○○!のデータベースに残っているって事だよね?
てめえのデータベースから俺のメアドを削除してほしいから削除登録してほしいんだよ!!
typodupeerror

アレゲは一日にしてならず -- アレゲ研究家

読み込み中...