タグ

ブックマーク / mizunashi-mana.github.io (12)

  • ボックスタイプとCSSレイアウト

    <div>デザインにおいて、<div style="text-decoration: underline;">レイアウト</div>は重要な要素だ。</div> という HTML 片が、基的なブラウザでどう表示され、それがどういう原理からくるものか分かるだろうか? そして、それが意図に反した表示になっている場合に、意図通りに直すことはできるだろうか? これに対して明確な答えを持っている人は、この記事に書いてあることを既に理解しているであろうから引き返してなんら問題はない。 結論から言えば、これは <div>デザインにおいて、<span style="text-decoration: underline;">レイアウト</span>は重要な要素だ。</div> と書くのが一つ意図通りの HTML 片だったということになる。 div タグの代わりに、 span タグを使っているところが異なる

    ボックスタイプとCSSレイアウト
    emonkak
    emonkak 2023/10/15
  • malloc と併用可能なアロケータを作る

    大規模で、ユーザ入力などの外部要因により左右されるプログラムでは、動的なメモリ管理が必要になる場合が多い。特に GC が普及した今日では、多くのプログラムにおいて基的な機能と言えるだろう。このメモリ管理の機構として、多くのプログラミング言語実装では libc の malloc / free がデファクト的に使われている。一般に、プログラムの動的なメモリの割り当てと解放を抽象化した機構はメモリアロケータ、または単にアロケータと呼ばれる。libc malloc はその標準的なものとして、システムアロケータと呼ばれたりする。特に、ほとんどの環境では libc のデファクト標準で glibc が使われることから、glibc malloc が事実上の標準システムアロケータであると言ってよいだろう。このため、libc malloc は数多くのライブラリやプログラミング言語ランタイムで使われている。

    malloc と併用可能なアロケータを作る
  • SecureRandom.getInstanceStrong を気軽に使ってはいけない

    何番煎じか分からないが、個人的に詰まったので備忘録。JDK には、暗号用の乱数生成器 SecureRandom クラスが用意されている。そして、このクラスには、 getInstanceStrong というメソッドが用意されている。この名前はいかにも強そうで、基的にはこのメソッドを使っていれば安全そうに見える。ところが、このメソッドは何も考えずに使うと思わぬ落とし穴にハマることになる。今回はその話をする。 突然フリーズするサーバ アリスはボブに頼まれ、単純なデータベースへの読み書きを担当する API サーバを作ることになった。読み書きするデータは機密性の高いもので、万が一にも漏洩するのは良くないし、生データに触れるのも制限された人のみにすべきで、それはアリスに対しても開示できないものなので、データベースに保存するデータは全てサーバ側で書き込み側から鍵を受け取って暗号化してから保存することに

    SecureRandom.getInstanceStrong を気軽に使ってはいけない
  • 文脈依存 PEG による Haskell パーサ

    前に PEG パーサジェネレータライブラリ ptera を作っているという話をしたが,今回はその第二弾.ptera で Haskell2010 の文法パーサを例に追加してみたんだが,その過程で色々あったのでその備忘録. 結論から言うと,ptera に前回から以下の拡張を加えた. 先読みを強化し,もうちょっとちゃんと機能するように 文脈依存でパースができるようにした 後は,Template Haskell で文法書けるようにしたりもしたが,まあそれはいいでしょ. Haskell2010 と ptera ptera でひとまず Template Haskell で文法が書けるフロントエンド部分作った後,Haskell 2010 ぐらいパースできないと使い物にならないなあと言う感じで Haskell の example project 書いてみたんだが,ここで色々つまづいてしまった.主に今回説明

    文脈依存 PEG による Haskell パーサ
  • ptera 式 PEG パーサ生成法

    最近 PEG パーサジェネレータライブラリを作っているんだが,一旦区切りがついたので忘れないうちに備忘録をまとめておく. さて,PEG は曖昧さが存在しない言語を定義する為の文法だ.基的には文法自体は結構単純で書きやすい.構文解析も単純ではある.ただ,愚直に構文解析すると入力の長さに対して指数時間かかってしまうため,取り扱いが少し難しい.ただ,入力の長さ分のメモリを用意することで,解析時間を入力の長さに対して線形時間にする packrat parsing という手法が提案され,最近では PEG をプログラミング言語の文法の定義方法として採用する言語も増えているようだ. PEG の魅力はなんといっても曖昧さを排除できる点と,文法程度を簡潔にできる点だろう.ただ,あまりいい感じのパーサ生成ライブラリがない場合も多い.Haskell にもあんまりいい感じのがなかった.なので今回は,PEG の勉

    ptera 式 PEG パーサ生成法
  • Unicode とサロゲートコードポイント

    Unicode は、文字コードの標準を目指して創設された規格であり、文字をどう処理するか、テキストデータとしてどう表すかを規定している。今や国際的に普及した規格で、特に Unicode が規定する符号化方式 UTF-8 は、いまやテキストデータのエンコーディングデファクト標準となっている。 Unicode は歴史的経緯からサロゲートコードポイントという仕様を包含している。今回は、この仕様の紹介と、UTF-8 を使う際の注意点を見ていく。なお, Unicode 13.0.0: https://www.unicode.org/versions/Unicode13.0.0/ を元にしていく. Unicode と固定長の夢 当初、Unicode は ASC-II の固定長 7bit 表現に倣い、固定長 16bit で世界中の文字を表現する規格として提案された。当時の提案 [1] では、 In th

    Unicode とサロゲートコードポイント
  • CBC mode に対しての Padding Oracle Attack

    共通鍵暗号の暗号方式としてよく用いられている暗号の種類として,ブロック暗号がある.ブロック暗号は,暗号方式の大別で,固定長のデータを単位として処理するような暗号の総称である.ところで,もちろん暗号化の対象となるデータは,固定長とは限らないし,かなり長さが大きくなる場合もある.そこで,ブロック暗号を扱うデータサイズより長いデータに対しても利用できるよう補佐する暗号利用モードと呼ばれるメカニズムも用意されている. ところで,この暗号利用モードは,誤って利用すると,元となったブロック暗号が優秀であろうと致命的に安全性が損なわれる場合が多いことが知られている.今回はそのケースのうち,CBC と呼ばれる暗号利用モードについて知られている攻撃手法,padding oracle attack の概要を見ていく. CBC (Cipher Block Chaining) ブロック暗号として, 暗号化アルゴリ

    CBC mode に対しての Padding Oracle Attack
  • BlockArguments で括弧を書かない生活を送る

    GHC 8.6 から BlockArguments という拡張が入った.これは構文拡張で,Haskell 2010 で必要だった幾つかの括弧を省略できるようにするものだ.この拡張を使うことで,Haskell プログラミングにおいて極限まで括弧を省略できるようになった.今回は,BlockArguments の簡単な紹介と,どういう風に括弧の省略ができるかを見ていきたいと思う.

    BlockArguments で括弧を書かない生活を送る
  • 多相関数を第一級で取り扱う

    今回は,GHC拡張の一つ RankNTypes の紹介をしようと思う.もうちょっとちゃんとまとめたのをいつか Haskell-jp かどっかに投稿したいと思ってるんだが,時間が (さっさと書け). さて, Haskell のプログラミングにおいて多相関数はかなり重要な役割を持つ.しかしながら,標準の範囲では多相関数自体を第一級の値として扱うことはできない.私たちに許されるのは,多相関数を定義することだけだ.まあ,それだけでもかなり有用なんだけど,多相関数を第一級で扱えると,色々プログラミングの幅が広がる.今回は,多相関数を第一級として扱うというのはどういうことか,そしてそれをするにはどうすればいいか,そうすることで何がうれしいのかを簡単に触れられたらと思っている. 多相関数を第一級で扱うとはどういうことか (パラメトリック)多相関数 ((parametric) polymorphic fu

    多相関数を第一級で取り扱う
  • type family を使って再帰的 ADT をオープンにする

    元ネタは Trees that grow . Haskell では代数的データ型 (ADT) を使ってプログミングに使うデータ構造を定義し,その構造を操作することによりプログラミングを行う. ADT はパターンマッチが容易で,再帰的に定義でき,基的に閉じた構造になっている.そのため便利な反面,その機能が保守で仇となる場合もある.この問題は古くから知られており,いくつかの解決策も提案されてきた.今回はこのうち,現在 GHC で採用されつつある type family を使った解決方法を紹介する. なお,環境として以下を想定している. The Expression Problemプログラミング,特に Haskell を使用したプログラミングにおいて,データ型は非常に重要な役割を持つ.特に,一部のプログラムにおいては,根幹をなすデータ型がいくつか存在するような場合もある.この場合データ型の扱い

    type family を使って再帰的 ADT をオープンにする
  • リテラルをコンパイラ時にチェックする

    Haskell はいくつかのリテラルで型クラスを使用したオーバーロードを許容している.例えば,Haskell で 1 と書いた場合,この型は 1 :: Num a => a になり, Num のインスタンスを定義することで,リテラルに対する実体をユーザも制御できるようになっている.GHC拡張で文字列に対してのオーバーロードなども提供されている.ただ,提供するデータ型とリテラルによっては,プログラムが意図通りに動かなかったりクラッシュしてしまったりすることがある.これを事前にチェックする仕組みを,コンパイラプラグインで実装する方法を紹介する. なお,環境として以下を想定している. Haskell のオーバーロードリテラルHaskell では整数及び浮動小数点数リテラルにおいて,オーバーロードが許容されている.それぞれ, 整数リテラル: Num のインスタンス 浮動小数点数リテラル: Frac

    リテラルをコンパイラ時にチェックする
  • Scala コードの裏側

    末尾呼び出し最適化 Java は末尾呼び出し最適化をしないことで有名だ [2].だけど, Scala は末尾呼び出し最適化を行う.具体的にコードを見てみる: $ cat src/TailCallOpt.scala object TailCallOpt { def tailCallFunc(a: Long): Long = { if (a > 10) a else tailCallFunc(a + 1) } } $ scalac -Ystop-after:tailcalls -Xprint:fields,tailcalls src/TailCallOpt.scala [[syntax trees at end of fields]] // TailCallOpt.scala package <empty> { object TailCallOpt extends Object { def <

    Scala コードの裏側
  • 1