一往確認日記 |
2016年03月18日
_ う電卓 1.3.2 がリリースになりました。
う電卓はApple Watch向けの電卓で、iPhone/iPadにも対応してます。
GT(総和)、やMR(メモリー計算)を式の途中で利用できない不具合があったので、それを修正したのが1.3.2です。 これで電卓としてまともに機能するようになったはずです。 一部大幅に修正してますのでそれに伴いまた不具合が出る可能性はあるので、見つけたらフィードバックしてもらえると嬉しいです。
また10進数<->16進数変換やカウンターとしても利用できるようになりました。 この機能は無料では時間制限がありますので、日常的に役立ちそうでしたらアプリ内購入で解除していただけると嬉しいです。
10進数<->16進数変換やカウンターは元々Apple Watchに実装してましたが、ようやくiPhone/iPadがApple Watchの機能に追いついたかたちです。
2019年03月18日
_ なぜ、あなたの仕事は終わらないのか スピードは最強の武器である
[読書]
なぜ、あなたの仕事は終わらないのか スピードは最強の武器である
時間の使い方が上手い人はそういう風に考えているんだ、と面白いです。
後半の一部は著者の中島さんのブログか記事で読んだことがあるので、前半の子供の頃からの話が特に興味をもちました。
事の発端が、宿題が出来てなくて海にいけなかったというところで、それをきっかけにそういう風に考えていくんだという感じでどんどん引き込まれて一気に読んでしまいました。
2021年03月18日
_ PLCでmruby (8) irep_header
前回からだいぶ空いてしまいました。
前回はrite_section_irep_headerについて調べました。
今回はその中身になります。
手がかりは前回出てきたdump.cファイルのsection_irep_sizeを計算している箇所です。
section_irep_size = sizeof(struct rite_section_irep_header);
section_irep_size += get_irep_record_size(mrb, irep);
rite_section_irep_headerに加算しているget_irep_record_size()関数を見てみます。
static size_t
get_irep_record_size(mrb_state *mrb, const mrb_irep *irep)
{
size_t size = 0;
int irep_no;
size = get_irep_record_size_1(mrb, irep);
for (irep_no = 0; irep_no < irep->rlen; irep_no++) {
size += get_irep_record_size(mrb, irep->reps[irep_no]);
}
return size;
}
get_irep_record_size()では更にget_irep_record_size_1()を呼び出しています。
static size_t
get_irep_record_size_1(mrb_state *mrb, const mrb_irep *irep)
{
size_t size = 0;
size += get_irep_header_size(mrb);
size += get_iseq_block_size(mrb, irep);
size += get_catch_table_block_size(mrb, irep);
size += get_pool_block_size(mrb, irep);
size += get_syms_block_size(mrb, irep);
return size;
}
ここからrite_section_irep_headerにつづいてirep_header、iseq_block、catch_table_block、pool_block、syms_blockと続くと思われます。
まず、irep_headerを確認します。 write_irep_header()がそれに該当しそうです。
static ptrdiff_t
write_irep_header(mrb_state *mrb, const mrb_irep *irep, uint8_t *buf)
{
uint8_t *cur = buf;
cur += uint32_to_bin((uint32_t)get_irep_record_size_1(mrb, irep), cur); /* record size */
cur += uint16_to_bin((uint16_t)irep->nlocals, cur); /* number of local variable */
cur += uint16_to_bin((uint16_t)irep->nregs, cur); /* number of register variable */
cur += uint16_to_bin((uint16_t)irep->rlen, cur); /* number of child irep */
return cur - buf;
}
recode size, number of local variable, number of register variable, number of child irep の順で並んでいる様です。
Ruby scriptで確認してみます。
codes = File.read "a.mrb"
size_of_rite_binary_header = 22
size_of_rite_section_irep_header = 12
section_top = size_of_rite_binary_header + size_of_rite_section_irep_header
recode_size = codes[section_top + 0, 4].unpack("N").first
number_of_local = codes[section_top + 4, 2].unpack("n").first
number_of_register = codes[section_top + 6, 2].unpack("n").first
number_of_child_irep = codes[section_top + 8, 2].unpack("n").first
pp recode_size: recode_size, number_of_local: number_of_local, number_of_register: number_of_register, number_of_child_irep: number_of_child_irep
出力はこちらです。
{:recode_size=>26,
:number_of_local=>2,
:number_of_register=>3,
:number_of_child_irep=>0}
サイズは26バイトで、ローカル変数は2個、レジスターは3個、子はなしとなっています。
つづく
[book] 論語と算盤
大河ドラマ「青天を衝け」を観ています。
NHK+に登録したので1週間以内なら都合の良いときに見れるので便利です。
ドラマで渋沢栄一氏に興味を持ちましたので、氏の著書である「論語と算盤」を読み始めました。