Skip to content

Instantly share code, notes, and snippets.

View nekketsuuu's full-sized avatar
🍑
I like peaches!

Takuma Ishikawa nekketsuuu

🍑
I like peaches!
View GitHub Profile
@beesandbombs
beesandbombs / bloom.pde
Created May 24, 2017 23:33
blooming dodecahedron
// by david whyte :)
int[][] result;
float t, c;
float ease(float p) {
return 3*p*p - 2*p*p*p;
}
float ease(float p, float g) {
// gif by dave aka @beesandbombs :)
int[][] result;
float t, c;
float ease(float p) {
return 3*p*p - 2*p*p*p;
}
float ease(float p, float g) {
@yohhoy
yohhoy / vlafib.c
Last active July 5, 2022 10:27
Fibonacci with VLA on C99
#include <stdio.h>
size_t f(size_t, char [][*]);
size_t f(size_t n, char r[][2 < n ? f(n-2, 0) + f(n-1, 0) : 1])
{
return sizeof(*r);
}
int main()
OpenSimplexNoise noise;
int[][] result;
float t, c;
float ease(float p) {
return 3*p*p - 2*p*p*p;
}
float ease(float p, float g) {

MIPSのABIは変だという話をこないだのシステムプログラミング会でしたら、ややザワッとしたので、なにがおかしいのかというのをちょっとまとめてみました。まとめてみて思いましたが、やっぱりMIPSのELFファイルはちょっと変です。

謎のmixed endianフィールド

これが僕は一番ひどいと思ったものです。

ファイルにマルチバイトの数値を保存するときはエンディアンというものが問題になります。たとえば0xBEEFという2バイトの数を保存するときは、1バイト目にBE、2バイト目にEFを書くか、逆順で書くかは、ただの決まり事でどっちでもいいわけですが、書く側と読む側で認識があっていないと困ります。世の中的にはリトルエンディアン(下位バイトから書く)のが主流ですがビッグエンディアンなシステムもあります。

それがですね、MIPSのELFヘッダのr_infoという64ビットのフィールドはリトルエンディアンでもビッグエンディアンでもない謎なエンコーディングになっています。具体的には下位32ビットが最初にリトルエンディアンで書かれていて、ビッグエンディアンでエンコードされた上位32ビットがそれに続くという構成になっています。つまりリトルエンディアンだとABCD EFGH、ビッグエンディアンだとHGFE DCBAとなるところが、MIPSのmixed endianだとEFGH DCBAというふうにファイルに書かれていることになります。

@pine
pine / IT_Workshop_Community_Advent_Calendar_20161212.md
Last active October 25, 2020 08:48
IT 勉強会の闇と、如何にして闇を払うか
@kaityo256
kaityo256 / fandcandcompiler.md
Last active October 4, 2020 04:48
FortranとC++とコンパイラと

FortranとC++とコンパイラと

はじめに

将来どうなるかはわからないのだが、とりあえず2018年現在、まだスパコンを使って数値計算をしようとしたらFortranかC++を使わなければならない。で、一般論としてコンパイラはFortranの方が最適化しやすく、似たようなコードをFortranとC++で書いたら、Fortranの方が早くなる、ということはまま起きる。それじゃ全部Fortranでかけばよいのか?というと、世の中そんなに単純では無い気がするよ、という感じのポエムです。

なお、以下に出てくる数値計算結果は筆者の(だいぶ昔の)経験を脚色したもので、実際に存在するアーキテクチャやコンパイラとは全く関係ありませんのであしからず。

C++で書いてみる

#!/bin/bash
set -eu
readonly ARCHIVER_DIR_PREFIX="${HOME}/.minecraft_archiver"
readonly ARCHIVER_BIN_DIR="${ARCHIVER_DIR_PREFIX}/bin"
readonly ARCHIVER_WORK_DIR="${ARCHIVER_DIR_PREFIX}/work"
readonly SYSTEMD_UNIT_DIR="/usr/lib/systemd/system/"
yum -y update
@tenntenn
tenntenn / contract_tricks.md
Last active September 28, 2018 08:56
contract tricks

Contract Tricks

こういうことができたらいいなと言う発想から考えています。

contract ptr(t T) {
    *t
}

type Ptr struct {
(* Encoding termination of a Turing machine into a GADT *)
type s0 and s1 and s2 and s3 and s4 and fin
type c0 and c1 and c2 and c3 and blank
type left and right
type endt
type ('st_in, 'head_in, 'st_out, 'head_out, 'lr) transition =
| Tr1 : (s0, 'a, s1, 'a, left) transition