Kgtkr's Blog
Profile image
Web Developer.
RSS
2018/12/01
初めに WebAssemblyには線形メモリがあるだけで動的なメモリ管理機能はありません。 ライブラリを使うことも出来ますが、今回はmallocとfreeを実際に実装してみます。 方針 パフォーマンスは気にしない。とにかく動くものを作るwasmのテキストフォーマットであるwatで実装する 仕様 mallocを呼び出すとメモリブロックが作られます。 メモリブロックにはヘッダ部とボディ部があり、mallocはボディ部の先頭アドレスを返します。 このボディ部の先頭アドレスをブロックのポインタとします。 メモリアドレスは0から始まり、ボディの前にヘッダが入ることからブロックのポインタが0になることはないことがわかるかと思います。 ブロックの間には隙間がなく、またmallocは要求サイズ以上確保するのではなくぴったり要求サイズ確保するものとします。 ヘッダのメモリ配置 サイズ 名前 説明1 flag 終端ブロック:0、未使用:1、使用中:2 4 size ボディのサイズ 4 prev 前ブロックのポインタ。先頭ブロックなら0 終端ブロックはこ
2018/10/13
何かツイート流れてきたので 証明 n, an,\ an, aが整数の時、n0+n1+n2n^0+n^1+n^2n0+n1+n2、すなわちn+n2n+n^2n+n2が6a+56a+56a+5の倍数にならないことを証明する 6a+56a+56a+5の倍数はkkkを整数とすると(6a+5)k(6a+5)k(6a+5)kと表す事が出来る 1+n+n21+n+n^21+n+n2が6a+56a+56a+5の倍数だと仮定すると、 1+n+n2=(6a+5)k1+n+n^2=(6a+5)k1+n+n2=(6a+5)k n, an,\ an, aが555の倍数の時、p, qp,\ qp, qを整数としn=5pn=5pn=5p、a=5qa=5qa=5qとすると、 (左辺)=1+5p+(5p)2=1+5p+25p2=1+5(p+5p2)\begin{aligned} \text{(左辺)} &=& 1+5p+(5p)^2 \\ &=& 1+5p+25p^2 \\ &=& 1+5(p+5p^2) \end{aligned}(左辺)​===​1+5p+(5p)21+5p
2018/10/02
Extracting and spreading parameter lists with tuples TS3.0で追加されたタプル型をより強力に扱うための機能です。 型パラメーターとして受け取ったタプルを展開したり出来ます。 基本的な構文は解説しないので公式ブログあたりを見ておいて下さい。 参考 Tuples in rest parameters and spread expressions #24897 このPRで紹介されているものを主に解説していきます。 注意 TypeScript3.0.xにはバグがありコンパイラやエディタ(正格にはtsserver)がクラッシュすることがあるのでTypeScript3.1.xを使って下さい。 前提知識 TSの基本的な型システムの知識宣言的なリスト操作(Haskellなどでやるあれ) 用語 この記事では、type F<T>=...;を関数のように扱うので、Fを関数、Tを引数、タプル型をリスト、type V=...;を値と表現します。 紹介 Head リストの先頭の要素を返す基本的な関数で
2018/09/19
メモ -- リスト(右結合) [1,2,3,4,5] ++ ([6,7] ++ [8]) [1,2,3,4,5] ++ [6,7,8] -- コスト2(合計2) [1,2,3,4,5,6,7,8] -- コスト5(合計7) -- リスト(左結合) ([1,2,3,4,5] ++ [6,7]) ++ [8] [1,2,3,4,5,6,7] ++ [8] -- コスト5(合計5) [1,2,3,4,5,6,7,8] -- コスト7(合計12) -- 差分リスト(右結合) fromDiffList(toDiffList [1,2,3,4,5] <> (toDiffList [6,7] <> toDiffList [8])) fromDiffList((\a->[1,2,3,4,5] ++ a) <> ((\b->[6,7] ++ b) <> (\c->[8] ++ c))) fromDiffList((\a->[1,2,3,4,5] ++ a) <> (\x->(\b->[6,7] ++ b) ((\c->[8] ++ c) x))) fro
2018/09/18
はじめに TypeScript(TS)には高カインド型(HKT)がありません。一応提案がありますが… しかし様々な機能を組み合わせればHKTを実現することが出来るのでそれの方法と解説を行います。 この記事ではHKTとは何かなどといった解説は行いません。表記は*->*のような表記を使います。 またfp-tsというライブラリを参考にしています。 使う機能 interfaceのマージ(Declaration Merging) TypeScriptでは同名のinterfaceを複数定義出来ます。 そしてこれらは自動的にマージされます。 例えば次の2つの宣言は同等です。 export interface Hoge { x: number; } export interface Hoge { y: number; } export interface Hoge { x: number; y: number; } そしてこの機能は別ファイルや別モジュールで既に定義されているinterfaceを拡張する事も出来ます
2018/09/10
やり方 準備 test.ts export type TypeEq<A, B> = (<T>() => T extends A ? 1 : 2) extends (< T >() => T extends B ? 1 : 2) ? true : false export function assertType<_T extends true>() {} export function assertNotType<_T extends false>() {} 色々複雑になっていますが、これは any や union、never などに対応するためです。 ここらへんの型は少し特殊なため、このようにしないと正常にテスト出来ません。 テストの書き方 assertType<TypeEq<1, 1>>() assertNotType<TypeEq<1, 2>>() テストが正しくなければコンパイルエラーが発生します。 例 import { TypeEq, assertType, assertNotType } from "./t
2018/09/03
spread operator interface Tweet{ id:string; user:string; body:string; } //tweetはTweet型、userはUser型とする let tw={...tweet,...{user:user}}; この時の変数twの型を定義したい時どうしますか? 素直に書いてみましょう interface Tweet2{ id:string; user:User; body:string; } 面倒ですね。プロパティが増えるともっと大変です。 typelevel-ts typelevel-tsという便利なライブラリがあります。 このライブラリを使うとこう書けます。 import {ObjectOverwrite} from 'typelevel-ts'; type Tweet2=ObjectOverwrite<Tweet,{user:User}>; これだけです。 他のライブラリ type-zootypical というライブラリもあります。
2018/08/30
競プロで標準入力のパースがめんどうだったのでマクロ作りました。 AtCoderのRust(1.15.1)でテスト済みです。 ソースコード https://github.com/kgtkr/procon-lib-rs/blob/master/src/parser.rs 使い方 事前準備 標準入力を全て読み込む let text = { let mut s = String::new(); io::stdin().read_to_string(&mut s).unwrap(); s }; 例 入力値 5 10 20 1 a 2 b 3 c 4 d 5 e 1 2 3 4 5 input!(text=> (n:usize) (a:i64 b:i64) {n;list:(i64,#)} (arr:[i64]) ); assert_eq!(n, 5); assert_eq!(a, 10); assert_eq!(b, 20); assert_eq!(list, vec![(1,"a"
2018/08/22
今回のデータ (id,update) ページング処理は大変 要素が追加されていくだけのデータであればページング処理は簡単です。追加されたdateなどをキーにしてlimitするだけで出来ます。 しかしupdateをキーにしたい時などは上手いことしないと抜けが発生します。 まあやったことある人なら分かると思います。 elasticsearchのscrollAPIとか使えば出来ますが…あれスナップショットの有効期限とか設定する必要があるので好きじゃない。永続的に使いたい 今回やること add(id=1,update=1)add(id=2,update=2)add(id=3,update=3)get(key=INF,limit=2)update(id=1,update=4)get(key=2,limit=2) 単純にやると 1,2,3 id update3 3 2 2 1 1 4(result) id update3 3 2 2 5 id update1 4 3 3 2 2 6(result) (なし) 本当は以下のデータが欲しい id up
2018/08/17
CK/CS/TK/TSに認証情報を、LIST_NAMEにリスト名を入れて実行すると同期されます import os import tweepy def list_split(n: int, list): return [list[i:i+n] for i in range(0, len(list), n)] # 環境変数取得 ck = os.environ["CK"] cs = os.environ["CS"] tk = os.environ["TK"] ts = os.environ["TS"] list_name = os.environ["LIST_NAME"] # 認証 auth = tweepy.OAuthHandler(ck, cs) auth.set_access_token(tk, ts) api = tweepy.API(auth) # リストを検索 list_id = None for x in api.lists_all(): if x.name == list_name: li