ソフトウェアパッケージを管理するソフトウェア
何をするのか?
ソフトウェアパッケージを管理する.
ソフトウェアパッケージって何だろう.
実際に動作する実行ファイルと,それを使うのに必要な依存ファイル (リソース類) をまとめたもの?
/nix
ソフトウェアパッケージを管理するソフトウェア
何をするのか?
ソフトウェアパッケージを管理する.
ソフトウェアパッケージって何だろう.
実際に動作する実行ファイルと,それを使うのに必要な依存ファイル (リソース類) をまとめたもの?
Nix を使うLinux distro
OSの設定を /etc/nixos/configuration.nix に宣言的に書く
OSの設定の履歴が残り簡単にロールバックできる
#Linuxディストリビューション
ディレクトリ移動に応じて自動的に環境変数を読み込むツール
ディレクトリに .envrc
というファイルを置く
.envrc
のあるディレクトリで direnv allow
すると読み込まれるようになる
PATH_add ./node_modules/.bin
が特におすすめ
next
とか tsc
とか prettier
とかが直に使える
#プログラミング言語 #関数型言語 #純粋関数型言語
デファクトスタンダード処理系(?): Nix
カス
コンテナ型の仮想化ソフト
Linuxを仮想化
コンテナ型なのでホストも Linux である必要がある
Windows や macOS では Linux 仮想マシン上で動かす
Linux カーネルに (アプリケーション) ソフトウェアを同梱したもの
シェル、ウィンドウシステム、エディタ、ブラウザ、…
Linux および GNU などの FLOSS に特徴的な現象
ディストリビューションにも派生関係がある。Debian 系、Red Hat 系など。
Android は GNU 系のコンポーネントをあまり使っていないので Linux ディストリビューションとは呼ばれづらい
SATySFi文書のビルドを再現性高いものにしたい
マシンAでビルドできたらマシンBでも問題なくビルドできる
できればハッシュ値レベルで完全に同一のビルド成果物が生成されると嬉しい
IDがランダム生成な問題は気合で解決しよう!
そのために、ある文書がどのファイルに依存しているかといった情報はできるだけプロジェクト (≒Gitリポジトリ) に保存しておきたい、というモチベがある
なんとなく
Nixについてちゃんと学びたいような
Docker のチャプター
C++ のチャプター?
GitHub Actions のチャプター
#Ideae
Nix で Node.js をうまくやるためのツールを作りたい
package-lock.jsonだけ信用する形にしたい
将来的にpackage-lock.jsonのバージョン3が予定されている
yarn.lockにも対応したい
#夜報
VirtualBox 上に NixOS 入れてみた
モチベーション…Nix と深く結合したOSを使ってみたい
Nix on Ubuntu on WSL2 やってるけど Windows との統合がうまくいってない
VS Code の言語拡張が Linux のシステム側を見るので nix-shell とかを見てくれない
#パッケージマネージャ
おもに macOS で使われるパッケージマネージャ
Linux でも動く
パッケージを Formula と呼ぶ
WSL で一時期使っていたが Nix と home-manager に移行したので使わなくなった
#Aumy
短く
得意なのはWebフロントエンドです
ツールチェインが好きです
型をどうこうしたりいい感じの仕組みを考えるのが好きです
おれが今名前をつけた経験則
コンピュータの処理で、5秒進捗がなければ、何分待ってもその処理は終わらない
コンピュータの処理はたいてい5秒以内に成功か失敗かわかる
マジで5秒以上かかるタスクでは何かしらの進捗がある
そういう法則があるのか、そのように作られているのかはわからない
手軽に開発環境構築ができるツール
Nixのwrapper
Nix の文法は微妙
\{ pkgs = import <nixpkgs> {} } ->
pkgs.mkShell {
buildInputs =
let open pkgs in
Nix Expression Languageが動的型付け
本当につらい
裏がシェルスクリプト
宣言的な世界にいられるのは最初のうちだけで、突っ込んだ使い方をするとそのへんの見に行く必要が生まれて困る
Nix処理系の実装がC++
Nixの元論文を読む
Elm をNixでやる
おもに変数や関数を定義するのに使われる式
一般的には let 変数名 = 式1 in 式2
という形態をとる
式2では変数が使える
ほとんどの場合 シャドーイング がある
OCaml
https://github.com/AumyF/template-nix-ocaml というリポジトリにすべてがある。
多くの (ほとんどすべての?) Opamパッケージが nixpkgs の nixpkgs#ocamlPackages
配下に追加されている。Opamパッケージがpull requestで運用されているから達成できているといえよう。
ビルドは nixpkgs#ocamlPackages.buildDunePackage
でできる。dependenciesは nativeBuildInputs
に書く。
オープンな分散型チャットのためのプロトコル
またはそのリファレンス実装
https://matrix.org
Mozilla も参加している
https://wiki.mozilla.org/Matrix
Nix 2.4か3.0で出るらしい機能
より再現性が高くなる
nixpkgs とかのURLを明示的に指定するようになる
開発用シェルも統合される
https://github.com/nix-community/naersk
Nix で Rust をビルドするやつ
Cargo.tomlの依存関係にGitが入ってるとビルドできない
#夜報
<-2021-07-16
fers のパーサコンビネータ作るのめんどくなってきた
ライフタイム と クロージャ がめんどくさい
nom に頼る
next: 2021-03-19
Nix の home-manager を使っていい感じにノートの環境構築ができた
ユーザ名直打ちしてるバカがいる
うっかり −ab=−ba でものを考えてた
Nixのパッケージを作るための純粋関数型言語
最初の行は関数の引数
stdenv
はUNIXの基本機能
cp
grep
tar
や GCC、Bash
関数の形式は { 引数a, b, c, ... z }: body
#夜報
prev: 2021-03-13
next: 2021-03-15
Nix のhome-managerを使ってみている
宣言的に.zshrcとかを管理できるらしい
#夜報
prev: 2021-03-14
next: 2021-03-17
home-manager の設定ミスって (なぜか) Nix のPATHごと吹っ飛んで死ぬかと思った
home-manager は Nix でインストールするので Nix の PATH が切れるとフルパス直打ちが必要
#パッケージマネージャ
Node.jsの標準パッケージマネージャ
#パッケージマネージャ
Node.jsのパッケージマネージャ
Facebook製
npm オルタナティブとして生まれた
早い
OCamlのパッケージマネージャ
#パッケージマネージャ
Rustのパッケージマネージャ
Rust公式
普通にやるとコンパイラと一緒についてくる
#パッケージマネージャ
正式名称は Windows Package Manager
その名の通り Windows 向けのパッケージマネージャ
まだ機能は貧弱にもほどがある
が、Microsoft 公式という圧倒的ポテンシャルによりすでに Chocolatey と Scoop 絶対殺すマンと化している
約束の地Hello world
インタプリタが文字列に意味を与える
900ページにもおよぶコンパイラの書籍と50行のRubyコードでLispインタプリタを実装する方法のブログ記事の間
direnvへの言及がある
#夜報
ずっと NixOS に VS Code Remote SSHで接続するとターミナルのNode.jsとdirenvが壊れてたんだけど治った
nix profileのnodejsとdirenvが古すぎてGLIBC2.27だった
VS Codeが最近2.28を要求するようになったのと関係があるんだと思うけど詳しくは知らん
home-managerで入れないと新しくするのがだるい
アプリケーションを動かすための最小限のツールしか入っていないDockerイメージ
シェルもパッケージマネージャも入ってない
Google がメンテしている
https://github.com/GoogleContainerTools/distroless
Docker コンテナをこう一挙に起動するやつ
docker-compose.yml という YAML を書く
docker-compose
というPython製CLIと docker compose
というGo製CLIの2つがある
#仮想化
WSL のバージョン2
軽量Hyper-V仮想マシン上で (Microsoftの手が入った) Linux カーネルを動かす
速い
互換性が高い
#夜報
mae: 2021-02-26
次: 2021-02-28
Docker for DesktopのWSL Integrationで使われてるディストリビューションが気になる
busyboxとmuslとapkが入っているのでAlpine Linuxでは?
#夜報
mae: 2021-02-22
tsugi: 2021-02-24
Dockerの勉強が続いている
Fastify on Docker だとSIGTERMで止まらない
Linuxディストリビューション
busybox と musl を使っているためサイズが小さい
イメージサイズを小さくしたい Docker 用途に流行った
軽量Dockerイメージに安易にAlpineを使うのはやめたほうがいいという話
最近は互換性の問題で Debian への揺り戻しが来ている
#デスクトップアプリケーションフレームワーク
世界一クロスプラットフォームで動くといわれるWebアプリケーションの技術を悪用してデスクトップアプリケーションを開発しようとするフレームワーク
HTML/CSS/JSで作ったUIをChromiumで表示し、Node.jsで作った(ローカル)サーバ側となんか通信していい感じにOSとやり取りる感じだったはず
使ったことがないのでわからない
特に、すでにWeb UIのあるサービスがデスクトップクライアントを提供する際に100割採る施策となっている
#夜報
NixOSラップトップに指紋認証を追加してみた
セキュリティ関連になるのでかりに以下の手順が間違っていた場合多大な損害がでうる。またexperimentalで勝手に設定が変わって大破壊などもおきうる。責任はとらないぞ
認証エージェントを入れる
WindowsでいうUACみたいなパスワードを要求するダイアログを出すためのやつ。いろいろ種類があるがGNOMEのやつをえらんだ
ThinkPadを買って1年が経ち保証切れも来たのでそろそろブチ尖ったことをしたい
Archの環境がしばらく塩漬けになっていたせいでなんのソフトウェアが入ってどういうセットアップになってるのかわからねえ
アホ!
ほしい
NixOS で宣言的にアレする
GoでC言語の資産を利用すること。Goの利点のいくつかを損なうことからCGO is not Goともいわれ実際にC資産に乗らずGoで再実装することもよく見かけるが、標準ライブラリにおいてもCGOを使っている箇所は存在する
たとえばmacOSはアプリケーションによるDNSクエリを禁止しているらしく、CGO回避不能らしい
function
C言語などにおいては、値を返しうる手続きのこと
関数を呼び出す、と言うことが多い
関数型言語 においては第1級の値(第一級関数)であり、値を受け取って値を返すもの
関数を値に適用する、と言うことが多い
#読みかけの本
Julia
1.
型
オプショナルな型宣言
array
連続した値を格納するデータ構造
数値によるインデックスがつけられている
リストと似ている
リストとは違いメモリ上にひとかたまりで置かれる
C言語 コンパイラ
LLVM を使う
C言語 の拡張版
オブジェクト指向 やるらしい
テンプレートメタプログラミングという言葉がある
#short
#Node.js #UUID
標準ライブラリの crypto
にある
import { randomUUID } from "node:crypto";
const uuid = randomUUID(); // ex. 'b15831f7-a86a-433e-8b59-2be556e1f855'
https://github.com/WebReflection/linkedom
jsdomより軽いDOMライブラリ
Node.js非依存ビルド linkedom/worker
が提供されている
#draft #webフロントエンド
ざっくりしたまとめ
Node.js界隈はRailsへの反動で (?) ミニマルとかシンプル志向が強くUNIX (do one thing well) なツールを組み合わせて使う文化があり、Node.jsで動くフロントエンドツール界もそんな感じでやってきた
webpackにbabel-loaderとsass-loaderとcss-loaderとstyle-loaderと……
Node.js固有のモジュールシステム
ES Modulesの世界観上ではcommonjsなソースファイルはmoduleではなくscriptとして扱われることに注意
module.exports
や exports
を使ってエクスポートする
// 同じ
module.exports.add = (x, y) => x + y;
Next-generation Node.js and TypeScript ORM
Node.js向けの ORM
Edge向けにはまだ
Prisma schemaというスキーマ言語でモデルを記述し、いろいろする:
Prisma Client
Aleph.js の関連プロジェクトらしい
Node.js API を Deno の互換APIに差し替える機能がある
#ESM_CDN
#CosmoD
初期
とにかく俺がさくっと使える状態まで持っていきたいので安く早くできるようにしたい
バックエンド
Supabase
#夜報
2022-05-03
16時に起床したんで進捗なさそう
やる
ガベージコレクション読む
CDNエッジ上でJavaScriptとRustが動く
https://yusukebe.com/posts/2021/cloudflare-workers/
V8ではあるがNode.jsではない
いくつかのWeb API互換のものが実装されてはいる
WHATWG Fetch など
Node.js 向けの HTTP/1.1クライアント
WHATWG Fetch が実装中
先進的言語で先進的ランタイムが使えたら2倍先進的なので
ReScriptコンパイラをnpmから落としてくるのはできる
Node.js に依存してる
#draft
JavaScriptはサーバでもクライアントでも同じ言語を使って開発できるというのが売りのひとつである一方で,「このコードはいつどのタイミングで走るんだっけ?」という疑問・意識を持っておかないと,意図したとおりにコードが動かなくなって辛いことになる.特に React, Vue.js を使ったWebフロントエンド開発,さらに Server-side Rendering などが絡むとやばい
CommonJSはNode.js独自のモジュールシステムだが、ES ModulesはECMAScript標準でありブラウザでも動く
インポート/エクスポートの方法が違う
CJSは require
関数と module.exports
への代入で行う
ESMは import
export
という文法を使う
ESMの import
文はファイル先頭にしか書けない
ECMAScript で規格化された JavaScript のモジュールシステム
Node.jsで動かすCommonJSは同期的だが、ブラウザ上での動作も想定したES Modulesは非同期的にモジュールを読み込む
頻繁にリリースされるソフトウェアのうち比較的長くサポートされるバージョン
Ubuntu…20.04
2年毎に4月のバージョン
Node.js…16.x
2n+1バージョンが出ると2nがLTSになる?
Node.js の CommonJS モジュールでは __dirname
__filename
というグローバル変数を使ってスクリプトファイルの場所を取得できたが、[https://twitter.com/bradleymeck/status/889331076220559360?t=6MH7kQ32ZUaSUvjaI7Mh1A&s=19 ESMはファイルやディレクトリといった概念
fileURLToPath
で file://
スキームURLをパス文字列に変換してディレクトリを取得する。
stream
データの流れ(stream)を扱うデータ構造
データの塊が非同期的に繰り返し流れてくる
非同期処理になるのがイテレータ との違い
例:巨大なファイルをまとめて読み書きするとパフォーマンス上の問題が出る
Node.js でObserverパターンを実装するためのやつ
Promiseは一度settledになったらそれ以上状態が変わらない
1回の要求に対して複数回の結果が発生する非同期処理はどう実装するか?
Webサーバが接続を受け付ける処理
1回起動して複数回のHTTPリクエストを受け付ける
Node.js のWebフレームワーク
JSON Schema を使ってデータのシリアライズを高速化してるらしい
Node.js などのバージョン管理ツール