タグ

ブックマーク / blog1.mammb.com (30)

  • テキストエディタで使われがちなデータ構造 Piece Table の概要と実装 - A Memorandum

    テキストエディタのデータ構造 Gap method Piece Table method Piece Table の構造 Piece Table の実装 Piece Table のメソッド まとめ テキストエディタのデータ構造 テキストエディタで採用されているデータ構造にはいろいろあります。 こちらの論文 Data Structures for Text Sequences では各種データ構造について比較検討されています。 多くは、Gap method や Piece table method をベースにしたものが多いのではないでしょうか(図で言う最下部の中心の丸印に当たります)。最近では Rope なども有名ですね。 Gap method Gap method では、現在のカーソル位置で、テキストバッファを2つに分割し Gap を間に挟み、カーソル位置に対する編集(テキスト追加/削除)を

    テキストエディタで使われがちなデータ構造 Piece Table の概要と実装 - A Memorandum
  • モダンで早い静的サイトジェネレータ Astro の始め方 - A Memorandum

    はじめに プロジェクト作成 プロジェクト構成 コンポーネント レイアウト ページ ビルド Blog テンプレート Portfolio テンプレート Documentation テンプレート まとめ はじめに 先日1.0リリースとなった、静的サイトジェネレータのAstroの紹介です。 JSで作成したページをビルドして、JSを含まない早いサイトを生成し、必要な場合には ReactVue といった好きなフレームワークを簡単に組み込むことができるのが特徴になります。 プロジェクト作成 Node は、v14.18.0 以上、または v16.12.0 以上が必要です。 npm や yarn、pnpmcreate astro でプロジェクトを作成します。 # npm $ npm create astro@latest # yarn $ yarn create astro # pnpm $ p

    モダンで早い静的サイトジェネレータ Astro の始め方 - A Memorandum
  • Gradle Groovy DSL から Kotlin DSL への乗り換え方 - A Memorandum

    はじめに スクリプトファイルの命名 Kotlin と Groovy の言語上の考慮事項 Gradle init によるプロジェクト生成 プラグインの適用 プラグインの設定 タスクの構成 タスクの作成 依存の指定 よくある設定 はじめに Gradle 5.0 よりGradle Kotlin DSL が提供され、groovy によるビルドスクリプトを Kotlin で記載できるようになりました。 Kotlin でビルドスクリプトを書くことで、IDEによるサジェストやコードジャンプなどの恩恵を十分に受けることができますし、タイプセーフでありリファクタリングなども容易となるので、これから Groovy のビルドスクリプトを書くのであれば Gradle Kotlin DSL を使うべきです。 ここでは、Groovy DSL と Kotlin DSL の違いと Kotlin DSL でビルドスクリプト

    Gradle Groovy DSL から Kotlin DSL への乗り換え方 - A Memorandum
  • Java によるネットワークプログラミングの基礎知識 - A Memorandum

     はじめに プログラミングモデルの変遷 ソケット ソケットによるサーバ実装 スレッドプールを利用したサーバ実装 ブロッキングI/Oの課題 ノンブロッキングI/O I/O多重化(multiplexing) バッファ操作 I/O多重化を使ったサーバ実装 非同期チャネル NIO2 によるエコーサーバ まとめ はじめに Java でネットワークプログラミングを行うのであれば Netty を使えば良いのですが、Netty に至るまでの標準APIの変遷についての話題は知っておいて損はない内容だと思います。 いまさら書く必要のある内容では無いかもしれませんが、とりまとまった情報源も乏しいため、Java標準APIを利用したネットワークプログラミングについて説明していきます。 プログラミングモデルの変遷 Java でネットワークプログラミングを行うには、JDK1.4 以前では Socket を使ったシンプ

    Java によるネットワークプログラミングの基礎知識 - A Memorandum
  • 【Modern Java】Local-Variable Type Inference - A Memorandum

    JEP 286: Local-Variable Type Inference ローカル変数宣言型推論の注意点 4つの原則 7つのガイドライン 「インターフェースを使ったプログラミング」についてはローカル変数では重視しなくてよい ダイヤモンド<> やジェネリックメソッドにおける var 利用は注意すること リテラルにおける var 利用は注意すること var の利用例 まとめ blog1.mammb.com JEP 286: Local-Variable Type Inference Java 10 によりローカル変数宣言で型推論(type inference)が可能となり var により型定義を省略できるようになりました。 C++ での auto、C# での var、Scala での var/val、Go での := のように大抵の言語ではローカル変数型推論をサポートしており、Java

    【Modern Java】Local-Variable Type Inference - A Memorandum
  • 【Modern Java】Java Platform Module System (JPMS) - A Memorandum

    JSR 376: JavaTM Platform Module System モジュール宣言 モジュールの定義 ServiceLoader の依存関係 システムモジュール Automatic Module(自動モジュール) と Unnamed Module(無名モジュール) Gradle における Java Platform Module System blog1.mammb.com JSR 376: JavaTM Platform Module System Project Jigsaw の成果として Java 9 で Java Platform Module System (JPMS) が導入されました。 モジュールシステムによる目標は以下となります。 信頼性の高い設定 脆弱でエラーが発生しやすいクラスパスメカニズムを、プログラムコンポーネントが互いに明示的に依存関係を宣言する手段に置

    【Modern Java】Java Platform Module System (JPMS) - A Memorandum
  • TypeScript のはじめかた-環境編- - A Memorandum

    はじめに Node のインストール プロジェクトの初期化 TypeScript コンパイラの導入 TypeScript の設定 Hello TypeScript DOM 操作 まとめ はじめに 簡単なサンプルを交えて TypeScript の始め方について紹介します。 Node のインストール Node (と npm ) がインストールされているものとします。未導入の場合は以下を参照してください。 blog1.mammb.com ここでは現在の最新の LTS(Long Term Support) 版として以下を使います。 $ node -v v12.18.0 $ npm -v 6.14.4 プロジェクトの初期化 TypeScript コンパイラは npm パッケージとして公開されています。 最初にプロジェクトディレクトリを作成し、npm で初期化(package.jsonファイルを作成)し

    TypeScript のはじめかた-環境編- - A Memorandum
  • Apache POI 4.X チートシート - A Memorandum

    はじめに 依存 ワークブックの新規作成 既存ワークブックのオープン ブックの保存 シートの作成 シートの取得 行の取得 行と列の移動 セルの取得 セルへの値設定 セル値の文字列取得 行とセルの走査 値が設定されている範囲の取得 罫線の設定 セルスタイルプロパティ フォントの設定 背景色の設定 入力規則(プルダウンリスト)の設定 式の設定 カラム幅の自動調整 はじめに 増強版として以下にまとめ直しました。 blog1.mammb.com Apache POI のよく使う API の簡易チートシートです。 3 系、4系 で API 使い方が変わってきています。 ここでは 4系 を対象とします。 依存 拡張子 xlsx 形式を扱う場合は poi-ooxml が必要 implementation 'org.apache.poi:poi:4.1.2' implementation 'org.apac

    Apache POI 4.X チートシート - A Memorandum
  • Java lambda における this 参照について - A Memorandum

    はじめに 匿名クラスの this 参照 lambda の this 参照 lambda コードの展開 lambda で自身を参照する はじめに lambda は、匿名クラスの単なる構文糖ではなく、その実現方法の違いから発生するいくつかの違いがあります。 ここでは、lambda ブロックにおける this 参照の違いについて説明します。 匿名クラスの this 参照 匿名クラス内部で this 参照をすれば、それは匿名クラス自身を指し示します。 public class Main { public void run() { Runnable r = new Runnable() { @Override public void run() { System.out.println(this.getClass().toString()); } }; r.run(); } public stati

    Java lambda における this 参照について - A Memorandum
  • Markdown で簡単にオンラインドキュメントを生成できる mdBook の使い方 - A Memorandum

    mdBook とは mdBook の導入 mdBook の始め方 mdBook でビルドする mdBook のコマンド mdBook での作業 mdBook で Rust コードを実行 mdBook とは Markdown 形式できれいなドキュメントを作成するためのツールです。 チャプター別に執筆した Markdown ファイルから、以下のようなオンラインドキュメントを簡単に作成することができます。 mdBook でビルドすると book ディレクトリに HTMLCSS、JS ファイルが生成されるので、ディレクトリごと Github Pages などに配備すればオンラインでドキュメントを公開することもできます。 同様のツールに gitbook-cli という Node ベースのものがありますが、mdBook は Rust 製で、なにしろ速いのがメリットです。 mdBook の導入 R

    Markdown で簡単にオンラインドキュメントを生成できる mdBook の使い方 - A Memorandum
  • bash の初期化ファイル .profile, .bashrc, .bash_profile の使い分けと管理方針 - A Memorandum

    はじめに bash の初期化ファイル ログインシェルとは インタラクティブ(対話的)シェルとは ログインシェルとインタラクティブシェルの分類 各種環境における初期化ファイル CentOSの初期化ファイル Ubuntuの初期化ファイル macOS(Catalina以前)の初期化ファイル macOS(Catalina)の初期化ファイル 各環境におけるデフォルトの初期化ファイル 単一ファイル管理(~/.bashrc) 標準的管理(環境変数は~/.bash_profile) 厳格管理(~/.profile 利用) macOS Catalina の場合 まとめ はじめに 記事では bash の初期化ファイルと、それにまつわる運用方法について説明します。 シェル(bash)の初期化ファイルには .profile .bashrc, .bash_profile などがありますが、どこに何を定義すべきかに

    bash の初期化ファイル .profile, .bashrc, .bash_profile の使い分けと管理方針 - A Memorandum
  • Java Beans の大罪 〜 getter/setter を捨てて美しきオブジェクトの世界で生きよ〜 - A Memorandum

    まえがき はじめに Java Beans の誕生 サーバサイドの台頭 Struts と BeanUtilsの興起 Enterprise JavaBeans ORM の台頭 getter/setter は良くない習慣です なぜ getter/setter は悪なのか 悪の囁きに対する処方箋 まとめ まえがき 以下のコードを見てください。 Car car = new Car(); car.getEngine().getFuelContainer.setFuel(Fuel.litreOf(30)); もしあなたが、このコードに違和感を感じたのであれば、以下の記事を読む必要はありあません。 はじめに 開発の現場では今なお、疑問を挟む余地なく Bean という言葉が使われ、それに付随する getter/setter の呪縛に囚われ続けた状態が続いています。 この慣習は広く蔓延し、多くの開発者の思考を

    Java Beans の大罪 〜 getter/setter を捨てて美しきオブジェクトの世界で生きよ〜 - A Memorandum
  • Docker でロードバランサ・アプリケーションサーバ・DBサーバの環境構築 - A Memorandum

    はじめに Nginx でロードバランサを構成する Webサーバ1号機の作成 Webサーバ2号機の作成 ロードバランサの作成 ロードバランサとWebサーバの起動 Web アプリケーションの準備 Docker でアプリケーションをビルドする DBサーバの準備 ロードバランサとアプリケーションサーバの起動 まとめ はじめに 前回は Docker のインストールからイメージビルド・コンテナ起動・Compose までの流れをみてきました。 blog1.mammb.com 今回は以下のような、一般的な Web アプリケーションの開発環境を構築していきます。 前回の記事とあわせて、Docker の活用方法を理解いただければと思います。 Nginx でロードバランサを構成する 最初に、単純な Web サーバを Nginx でロードバランシングする環境を作成して動作を見てみます。 このような構成となります。

    Docker でロードバランサ・アプリケーションサーバ・DBサーバの環境構築 - A Memorandum
  • Docker のインストールからイメージビルド・コンテナ起動・Composeまで - A Memorandum

    はじめに Docker のインストール Docker の起動 コンテナの起動 Docker Hub から nginx のイメージを取得 取得したイメージから ws-nginx という名前でコンテナを作成 作成したコンテナを起動 コンテナの操作 動いているコンテナの一覧 コンテナの停止 停止しているコンテナを含めて一覧 コンテナの削除 イメージの一覧 イメージの削除 Dockerfile からイメージ作成 Nginx の設定ファイルの準備 Dockerfile の作成 Dockerfile のビルド イメージの実行 Docker Compose docker-compose.yml の作成 docker-compose up まとめ はじめに DockerOSX への導入からコンテナ起動までを見ていきます。 Docker のインストール DockerHub からインストーラをダウンロー

    Docker のインストールからイメージビルド・コンテナ起動・Composeまで - A Memorandum
  • 今始めずにいつやるの? Rust の始め方 - A Memorandum

    Rust とは Rust のインストール rustup のインストール バージョンの確認 アップデート アンインストール Hello World Hello Cargo ビルド 実行 check リリースビルド クレート 依存の追加 ドキュメント Rust plugin for IDEA Rust の文法以前、環境構築と使い方を簡単に。 Rust とは 比較的若く近代的な言語仕様(2006~) マルチパラダイム 手続き型、関数型、オブジェクト指向 静的型付 型推論あり null がない ジェネリクスはある C++ のスマートポインタを発展させたメモリ安全 安全な並列性 所有権・借用・ライフタイムによる GC 不要なメモリ管理 この概念により学習難易度は高い Firefox のレイアウトエンジン Servo が Rust自転車の車輪がモチーフのロゴが・・ダサい Rust のインストール

    今始めずにいつやるの? Rust の始め方 - A Memorandum
  • 20行ぐらいでリッチなテキストエディタをJavaFXで - A Memorandum

    Nashorn スクリプトで作る Ace Editor とは 50行ぐらいでファイル処理 実行 Nashorn スクリプトで作る ace.js として以下のスクリプトを作成します。 #!/usr/bin/jjs -fx var html = "<!DOCTYPE html>" + "<html><head>" + "<style type='text/css' media='screen'>" + " #editor { position: absolute; top: 0; right: 0; bottom: 0; left: 0; }" + "</style>" + "</head>" + "<body>" + "<div id='editor'></div>" + "<script src='https://cdnjs.cloudflare.com/ajax/libs/ace/1.2

    20行ぐらいでリッチなテキストエディタをJavaFXで - A Memorandum
  • Java におけるタイプセーフとジェネリクスの微妙な関係 - A Memorandum

    はじめに 当たり前な話 ジェネリック型の継承関係 共変(covariant)の問題点 共変(covariant) が妥当なケース 反変 (contravariant) の問題点 反変 (contravariant) が妥当なケース ここまでのまとめ ジェネリクスが不変だと、、 ジェネリクスに共変性を持たせる ジェネリクスに反変性を持たせる 境界ワイルドカード型のまとめ ジェネリック型のキャスト 境界型パラメータ 配列は共変 ジェネリクスの 不変・共変・反変 といった話は、なんとなく分かった気になって流してしまう方が多いのではないでしょうか? Java に限った話ではないですが、実際、ジェネリクスが絡んだタイプセーフ性の話題は混乱しやすく、理解しにくいものだと思います。 ここでは Java を題材に ジェネリクスの 不変・共変・反変 について、なるべく分かりやすく説明してみたいと思います。

    Java におけるタイプセーフとジェネリクスの微妙な関係 - A Memorandum
  • 知らなくても困らない Javaクラスのバイトコードの読み方 - A Memorandum

    クラスファイルの中身 クラスファイルの構造 javap コマンド javap 出力の概要 型とメソッドの読み方 オペランドスタック コンストラクタの実行 加算メソッド invoke 系命令 条件判断 for ループ まとめ 普段使いでは困ることはないですが、昨今はバイトコードマニピュレーションによる黒魔術が謳歌しているため、知っていると役に立つ場合もあるバイトコードの最低限の読み方を説明します。 クラスファイルの中身 以下のような簡単なソースコードを考えましょう。 public class Class1 { public int add(int x, int y) { return x + y; } } このソースコードをコンパイルして作成された Class1.class の中身のダンプを見てみます。 $ hexdump -C Class1.class 00000000 ca fe ba

    知らなくても困らない Javaクラスのバイトコードの読み方 - A Memorandum
  • Java8 Stream の裏舞台は、きっとあなたが考えているより忙しない - A Memorandum

    Java9 も出た昨今でいまさらですが、Stream パイプラインが裏でどのように動いているのかをコードを交えて紹介します。 以下の単純な例を元に、内部処理を追っていきましょう。 Arrays.asList("a", "b", "c") .stream() // (1) Stream の生成 .filter(String::isEmpty) // (2) パイプライン .forEach(System.out::print); // (3) 終端処理 (1) Stream の生成 (2) パイプライン (3) 終端処理 まとめ (1) Stream の生成 最初はストリームを取得する stream() の中身から見ていきます。 stream() は Collection インターフェースのデフォルトメソッドとして以下のように定義されています。 public interface Collect

    Java8 Stream の裏舞台は、きっとあなたが考えているより忙しない - A Memorandum
  • Rust の初期環境構築 【2017年版】 - A Memorandum

    Rust のインストール Hello World ビルドと実行 IntelliJ Rust Rust のインストール brew 使う場合は以下。 $ brew install rust ただ、公式通り rustup を使った方が複数バージョンの管理できたりするので、以下でインストールする。 $ curl https://sh.rustup.rs -sSf | sh 以下のように表示される。 Welcome to Rust! This will download and install the official compiler for the Rust programming language, and its package manager, Cargo. It will add the cargo, rustc, rustup and other commands to Cargo's

    Rust の初期環境構築 【2017年版】 - A Memorandum