feat: use hexo

This commit is contained in:
2021-01-21 21:45:05 +09:00
parent 2d93c3d6ca
commit 039bac5e09
185 changed files with 2400 additions and 2575 deletions

View File

@@ -0,0 +1,45 @@
---
title: Extract Thumbnail Image from Affinity Photo and Affinity Design
---
Nextcloud doesn't have a support for thumbnail generation from Affinity Photo and Affinity Design. So I had to do it myself.
# Digging Binary
Glancing at `.afphoto` and `.afdesign` in Finder, I noticed that it has a QuickLook support and an ability to show the thumbnail image. So these files should have thumbnail image somewhere inside its binary.
I wrote a simple script to seek for thumbnail image from a binary and save it as `.png` file.
```js af.js
const fs = require("fs");
// png spec: https://www.w3.org/TR/PNG/
const PNG_SIG = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]);
const IEND_SIG = Buffer.from([73, 69, 78, 68]);
function extractThumbnail(buf) {
const start = buf.indexOf(PNG_SIG);
const end = buf.indexOf(IEND_SIG, start) + IEND_SIG.length * 2; // IEND + CRC
return buf.subarray(start, end);
}
function generateThumbnail(input, output) {
const buf = fs.readFileSync(input);
const thumbBuf = extractThumbnail(buf);
fs.writeFileSync(output, thumbBuf);
}
generateThumbnail(process.argv[2], process.argv[3] || "output.png");
```
That's right. This script just scrapes a binary file and extracts the portion of which starts with `PNG` signature and ends with `IEND`.
Now I can generate a thumbnail image from arbitrary `.afphoto` and `.afdesign` file. Let's move on delving into Nextcloud source code.
# Tweaking Nextcloud
I have a little experience in tweaking Nextcloud source code before, where I implemented thumbnail generator for PDFs, so it should be easier this time, hopefully.
![](afphoto.png)
Anyway, long story short, I got Nextcloud generates thumbnail images for Affinity files by implementing PreviewGenerator class.

Binary file not shown.

After

Width:  |  Height:  |  Size: 437 KiB

View File

@@ -0,0 +1,36 @@
---
title: Build Chromium from zero
---
事前準備する。
```
brew install cache
git config --global core.precomposeUnicode true
```
ソースコードを手に入れる。
```shell
ghq get https://chromium.googlesource.com/chromium/tools/depot_tools.git
cd `ghq root`/chromium.googlesource.com/chromium
fetch chromium
```
`.envrc` に以下を追加し、`direnv allow`で環境変数を適用する。
```shell
PATH_add `qhq root`/chromium.googlesource.com/chromium/tools/depot_tools
PATH_add src/third_party/llvm-build/Release+Asserts/bin
export CCACHE_CPP2=yes
export CCACHE_SLOPPINESS=time_macros
export SPACESHIP_GIT_SHOW=false
```
ビルドする。
```shell
cd src
gn gen out/Default --args='cc_wrapper="ccache"'
autoninja -C out/Default chrome
```

181
source/_drafts/camping.md Normal file
View File

@@ -0,0 +1,181 @@
---
title: 準ソロキャンプ
---
半ブッシュクラフト + バックパックで運べる重量 + 雰囲気重視
# 道具一覧
- テント
- MSR Elixir 1 (Green)
- 標準の白色は虫が集まりやすいためグリーンにした
- 予算があるなら Hubba Hubba NX の方が絶対に良い
- 寝袋
- モンベル ダウンハガー 800 #3
- 5 度を下回ると普通に寝れない
- と思っていたが、サーモライトリアクターをインナーに入れることで氷点下 2 度の中で寝ることができた
- マット
- Thermarest Z Lite SOL S
- 帆布シートの上に敷いて座布団としても使える
- 敷物
- asobito 綿帆布シート
- そのままだと硬く寒いため銀マットを座布団として使う
- 多少の防水性と耐火性があるため、焚き火・ブッシュクラフトスタイルと相性が良い
- 前室に敷いておけば、寝ている間地面の湿気から荷物を守れる
- 手袋
- グリップスワニー G-1 ブラック
- 燃えている薪を数秒程度なら持てる
- 柔軟性があるため細かい作業ができる
- ナイフ
- MOSSYOAK 225mm
- 薪割り、木工、着火、料理あらゆる場面で使える
- 木の枝を加工して様々な道具を作れる
- ペグ
- 箸・スプーン・フォーク
- ヘラ
-
- フック
- トライポッド
- Y 字スタンド(肉を回転させながら焼くやつ)
- 蚊取り線香の台
- 加工時に発生する木くずは火口として使える
- 状況によってはサブナイフだけでも良い
- サブナイフ
- Victorinox
- ワインオープナーと小型ナイフがメイン用途
- ランタン
- Feuerhand 276
- こだわりが無ければ LED ランタンの方が圧倒的に明るいし便利
- サブランタン
- UCO キャンドルランタン オイル化改造
- ソロキャンであればこれくらいの明るさでも作業できる
- 2 人キャンで 2 人分をカバーするようなことはできない
- 焚き火調理中にフライパンの中の様子を見たいといった場合には厳しいかもしれない
- 不安定な地面やメッシュテーブルに置くと倒れそうになるのでパーツを自作して補強する必要がある
- ヘッドライト
- Petzl Zipka
- 普通の作業でずり落ちることはない
- 赤色灯が地味に便利で、目の明順応を軽減する効果がある
- ゴミ袋
- ジップロック
- 基本戦略としてゴミを作らないことが大事野菜などは紙で包んでいくことで焚き火の火口にできる
- iPhone
- ロープワークのリファレンスアプリを入れてオフラインでも参照できるようにする
- 現地までの道案内
- 緊急連絡用
- ポータブルバッテリー(ケーブル内蔵型)
- iPhone の充電
- ヘッドライトの充電
- パラコード
- テントやタープの固定、トライポッド自作、ケトルの吊り下げ、ランタンの吊り下げ、薪の固定等、あらゆる状況で使える
- 1m や 3m のロープを何束か作っておくと便利
- ジップロック L サイズ
- 消毒用アルコール
- トイレットペーパー
## 焚き火
-
- ハスクバーナのキャンプ用斧ダイヤモンドシャープナーで研いでおく
- ハンマーとしても使える
- 折りたたみノコギリ
- 薪を現地調達するなら必要
- フェロセリウムロッド
- 趣味
- マグネシウムロッドよりも火花が大きい大きいサイズが良い
- マッチ
- キャンドルランタンや焚き火の火口への点火時に使用する
- 切ったロープの端を処理する際にも使える
- ガストーチ(予備)
- SOTO のマイクロトーチ
- マッチが濡れた場合や雨天時に備えて用意しておく
- 着火剤(予備)
- ピコグリル 398(直火不可能な場合)
- 網を乗せればバーベキューもできる
## 料理
- フライパン
- Turk クラシック 24 cm
- ケトル
- ベルモント アルミケトル 1.2L
- 広口なので  お湯を沸かす以外にも、パスタを茹でたりスープを作ったりして片手鍋のように扱える
- ゴムパーツは焚き火で燃えてしまうのでカッターで除去済み
- ステンレスマグ
- チタン製はお茶の味が損なわれる上に軽すぎて倒れる危険があるため使っていない
- テトラドリップ
- コンパクトなドリッパー
- コーヒー豆は出発前に挽いておくと楽
- Victorinox ウェイター
- ワインや瓶ビールを開けたり、野菜を切るときに使う
- まな板
- MSR の折りたたみまな板 V 字型に折り曲がるため切った材料をフライパンに入れやすい
- 木の板でもなんでも好きなもの使えば良いと思う
- 熱いケトルが置けるため最近は木のまな板を使っている
- ウォーターパック
- エバニュー ウォーターキャリー 2 L(飲料水用)
- モンベルウォーターバッグ 2L(川水用)
- Sawyer Mini 浄水器
- お皿
- 状況に合わせてシェラカップか大きめのステンレス皿を選ぶ
- フォーク
- 木製のフォーク
- 叉の間隔が広いタイプであれば指だけで洗えるため便利
- ケトルに入れっぱなしにしても熱くならない
- 金属製品を傷つけない
- スプーン
- 木製のスプーン
- 主に調理用
- 金属たわし
- 洗剤ミニボトル(50ml)
- 環境にやさしいタイプが良い
- 泡ポンプタイプが楽
- オリーブオイルボトル
- パラフィンシートで蓋を覆っておけば液漏れの心配が無い
- あるいは詰替え用のポンプ or スプレーボトルに入れておく
- 塩・粗挽き黒コショウボトル
- 最低限の味付けができる後はやりたい料理によってバジルやパセリ、タイム、パプリカ等を持っていく
## ボディケア
- ボディケアシート
- 寝る前と起きた後に身体を拭く
- ズボラボのシートで顔を拭けば皮脂も気にならない
- 虫除けスプレー
- ハッカ油系のスプレー
- 目に噴射しないように注意する
- 液体歯磨き
- 耳栓
- フィットさえすれば完全な静寂を得られるため、虫の羽音や他のキャンパーの騒音を心配することがなくなる
- Moldex の中でも Purafit が一番防音性と装着感が高いが、個人差があるため一度全種類試した方が良い
- 絆創膏
## 着替え
- ビーニー(秋冬)
- 就寝用の虫刺され対策にもなる
- ネックウォーマーまたはマフラー(冬)
- 首周りの防寒は大事
- フリースジャケット(冬)
- シェルジャケット(秋冬)
- 寝袋の上に被せることで暖かさを調整できる
- 枕にもなる
- シャツ
- ヘインズ or ヒートテック
- トップス・ボトムスは使い回す
- 下着
- タオル
- 防水サック
- 着替えを入れて枕にできる
- コンタクトレンズ
- メガネ
- 夜トイレに行く場合に必要
# 気分で持っていく道具
- テーブル
- 椅子
- フィールドホッパー
- ホットサンドメーカー
- シングルバーナー
- コッヘル

View File

@@ -0,0 +1,23 @@
---
title: 深圳を旅する Tips
---
## WeChat Pay
深圳での食事は殆ど WeChat Pay で支払うことが出来た。
## UnionPay
ホテルやスターバックスで Visa カードを使うことが出来なかったため、UnionPay カードで支払うことになった。
## Pocketchange
日本の空港に設置している pocketchange で外貨や日本円を各種電子マネーに両替することが出来る。
## Google Translate
翻訳データはダウンロードしてローカルで使えるようにしておくこと。
## Octopus / 深圳通
KKday で事前予約していた物を香港空港で受け取った。深圳通は現地で購入した。

View File

@@ -0,0 +1,12 @@
---
title: Deconvolutionと呼ぶのはもうやめよう
date: 2017-03-05 13:44:00 +09:00
---
深層学習において、Convolutional Layer (畳み込み層)とは、あるシェイプのテンソルをそれ以下のサイズに縮約する性質のレイヤーです。一方で Deconvolution Layer (逆畳み込み層)とは、[Jonathan Long, et al](https://arxiv.org/abs/1411.4038)の論文で提案されたレイヤーで、あるシェイプのテンソルをそれ以上のサイズに拡大する性質を持ちます。
ところが実際のところ、このレイヤーは Transposed Convolution Layer (転置畳み込み層)と呼ぶべきです。なぜかを以下に示します。
> Upsampling is backwards strided convolution. (アップサンプリングは
[Stack Exchange](http://datascience.stackexchange.com/questions/6107/what-are-deconvolutional-layers)での議論を踏まえると

View File

@@ -0,0 +1,30 @@
---
title: Developing Web Apps in One Minutes
---
## 0. Setup Homebrew and Node
```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
```
brew install node
```
## 1. Scaffold from template
```
npx express-generator --view=pug awesome-app
cd awesome-app
npm install
npm start
```
## 2. Deploy with Now
```
npm install -g now
now login
now --public
```

View File

@@ -0,0 +1,11 @@
---
title: 'gst: a powerful pal for ghq'
date: 2017-06-02 23:02:00 +09:00
---
[gst](https://github.com/uetchy/gst) is tiny and simple but powerful pal for [ghq](https://github.com/motemen/ghq).
Have you ever imagined what if you know which commits are unpushed or which changes are uncommitted yet, for all of the repositories you have cloned on your machine?
You might want to check out my ongoing project `gst`:
it might help you to know what ongoing changes are remained to be committed or pushed among entire your local repositories.

View File

@@ -0,0 +1,52 @@
---
title: 数学API:SVG画像としてのLaTeX Math
description: <img>のような場所にLaTeX数学方程式を配置します。
tags:
- LaTeX
- Math
- API
- showdev
---
私はいつも、LaTeX Math 方程式を、MathJax が内部で実行できない Web ページに配置したいと思っていました。
少し時間をかけて、LaTeX Math マークアップを SVG 画像にレンダリングする[Math API](https://math.now.sh) を作成しました。
したがって、GitHub、Jupyter Notebook、dev.to、そして Qiita(こちら!)など、 `<img>`または Markdown( `![]()`)を配置できるほぼすべての場所に方程式を配置できます。
```markdown
![](https://math.now.sh?from=\LaTeX)
```
![](https://math.now.sh?from=\LaTeX)
```markdown
![](https://math.now.sh?from=\log\prod^N_i x_i = \sum^N_i \log{x_i})
```
$$
\log\prod^N_i x_i = \sum^N_i \log{x_i}
$$
## インライン画像
![](https://thepracticaldev.s3.amazonaws.com/i/fqea9nq2wv9in15lqlf3.png)
![](https://thepracticaldev.s3.amazonaws.com/i/43slt0h6dfhox1xwmuti.png)
クエリを「from」から「inline」に変更することにより、インライン方程式を生成することができます。
```markdown
<img src="https://math.now.sh?inline=\\LaTeX" />
```
## オンラインエディター
また、[Math API](https://math.now.sh) で利用可能なオンラインエディターがあります。
![](https://thepracticaldev.s3.amazonaws.com/i/gg2wil3exu9lyj7ppuoy.png)
## 結論
ソースコードは[GitHub](https://github.com/uetchy/math-api)で入手できます。
それを試してみて、新機能のコメント/アイデアを残してください。

View File

@@ -0,0 +1,63 @@
---
title: namae.devでアプリのスリック名を付けます
tags:
- javascript
- web
cover_image: https://thepracticaldev.s3.amazonaws.com/i/uafydwlnfneikuiyxe2w.png
---
新しい OSS プロジェクトまたは Web アプリの命名に苦労したことがありますか? GitHub、npm、Homebrew、PyPI、Domains などで希望するものを誰も要求していないことを望みながら、最適な名前を ​​ 選択するのは退屈です。
だからこそ、[namae](https://namae.dev)を作成しました。
## namae
![namae](https://thepracticaldev.s3.amazonaws.com/i/np1a40lrch9m10b1s7nz.gif)
[namae](https://namae.dev) は、開発者と起業家向けのプラットフォーム間名前可用性チェッカーです。
使用する名前をフォームに入力すると、namae はさまざまなレジストリを調べて、名前がすでに使用されているかどうかを確認します。
![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/pww3x6ycshadfiiotep9.png)
## サポートされているプラ ​​ ットフォーム
namae は 15 のパッケージレジストリと Web プラットフォームをサポートしており、成長しています。
- ドメイン
- GitHub Organization
- npm / npm Organization
- PyPI
- RubyGems
- crates.io (Rust)
- Homebrew / Homebrew Cask
- LaunchPad / APT (Linux)
- Twitter
- Spectrum
- Slack
- Heroku
- ZEIT Now
- AWS S3
- js.org
さらに、検索結果には、**GitHub**および**App Store**に類似した名前のプロジェクトのリストが含まれています。
## 名前の提案
namae には、**Name Suggestion**という独自の機能もあります。共通の接頭辞/接尾辞と同義語で構成される自動生成された名前を提案します。いくつかの例を見てみましょう。
![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/aas52pwbrueyzrulfiae.png)
![Alt Text](https://thepracticaldev.s3.amazonaws.com/i/j6jv0rq4gin28hks1ika.png)
提案をクリックすると、ナマエはフォームを完成させて、レジストリを検索し始めます。
## オープンソース
namae は完全にオープンソースであり、ソースコード全体は[GitHub](https://github.com/uetchy/namae)で入手できます。 API 用の Node.js Lambda と Web フロントエンド用の React アプリで構成され、[ZEIT Now](https://now.sh)で実行されています。
## 結論
namae を使用すると、ホスティングプロバイダーとパッケージレジストリのセットの周りで普遍的に利用可能な名前を検索する時間を節約できます。
[namae.dev](https://namae.dev/)に移動して、将来の製品名が入手可能かどうかのレポートを取得します。何か提案があれば、コメントを残すか、Twitter([@uetschy](https://twitter.com/uetschy))で私に連絡してください。

View File

@@ -0,0 +1,21 @@
---
title: Node.js ORM Comparison
---
ORM いろいろあるね。
- [prisma/prisma](https://github.com/prisma/prisma) - Modern database access (ORM alternative) for Node.js & TypeScript
- PostgreSQL, MySQL, SQLite
- [mikro-orm/mikro-orm](https://github.com/mikro-orm/mikro-orm) - TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns.
- MongoDB, MySQL, MariaDB, PostgreSQL, SQLite
- [typeorm/typeorm](https://github.com/typeorm/typeorm) - ORM for TypeScript and JavaScript
- MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, SAP Hana, WebSQL
- NodeJS, Browser, Ionic, Cordova and Electron
- [sequelize/sequelize](https://github.com/sequelize/sequelize) - An easy-to-use multi SQL dialect ORM for Node.js
- Postgres, MySQL, MariaDB, SQLite, Microsoft SQL Server.
- [Vincit/objection.js](https://github.com/Vincit/objection.js) - An SQL-friendly ORM for Node.js built on knex.
- PostgreSQL, MySQL, SQLite3
- [knex/knex](https://github.com/knex/knex) - A query builder designed to be flexible, portable, and fun to use.
- PostgreSQL, MySQL, SQLite3

View File

@@ -0,0 +1,29 @@
---
title: パケットキャプチャリング
---
- macOS Mojave では、Wi-Fi をオフにしていないと Monitor モードでスキャンしてもパケットが受信できない。
- Preferences > Protocols > IEEE 802.11 で Decrypt Keys を保存する。wpa-psk でハッシュ化された値を保存したほうが安全である。保存先は`.config/wireshark`
- 暗号化された 802.11 通信を覗くには 4-ways handshake (EAPOL)を観測する必要がある。そのためには対象デバイスの Wi-Fi をトグルすれば良い。
## コマンド
```
tcpdump -i en0 -I
```
で tcp ダンプ
```
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I
```
で現在接続しているネットワークの情報を取得
# Charles
1. Charles で`Proxy > Proxy Settings`を開き、HTTP Proxy の Port を選ぶ。
2. Enable transparet HTTP proxying にチェックする
3. Charles 上で`Help > SSL Proxying > Install Charles Root Certificate on a Mobile Device or Remote Browsers`をクリックし、表示されているアドレスとポートを iOS の`Settings > Wi-Fi > 任意のAP > Proxy`に入力する。
4. iOS で`chls.pro/ssl`にアクセスし、プロファイルをインストール
5. `Settings > General > About > Certificate Trust Settings`で Charles の証明書を信用する。

View File

@@ -0,0 +1,21 @@
---
title: "[].map(parseInt)"
---
## Fan fact
`[0xa, 0xa, 0xa].map(parseInt)` results in `[10, NaN, 2]`.
## Why???
`parseInt(0xa, 0, [0xa, 0xa, 0xa])`
The second argument is `0` so the first argument gonna be treated as decimal number becoming `10`.
`parseInt(0xa, 1, [0xa, 0xa, 0xa])`
The second argument is `1` which is invalid as a radix so the result ends up with `NaN`.
`parseInt(0xa, 2, [0xa, 0xa, 0xa])`
The second argument is `2` meaning the first argument going to be handled as a binary number. `0xa` is `10` in binary, which results in `2` in decimal form.

View File

@@ -0,0 +1,46 @@
---
date: 2020-03-16 18:19:11 +0900
title: pixiv SPRING BOOT CAMP 2020
---
[pixiv SPRING BOOT CAMP 2020](https://www.pixiv.co.jp/news/recruit/article/8728/)に参加した。インターン自体が初めてということもあり、普段とは種類の異なる様々な知見を得ることができたので共有したい。
## 選考
選考は Google Hangout Meet を用いたオンラインセッションで実施された。質問内容は以下の通りである。
- 自己紹介
- コースの希望とその理由
- 簡単なコーディングテスト
フロントエンドを希望したため、コーディングテストは JavaScript を用いてフォーム画面を設計するという内容になっていた。
React を用いて MVP を実装し、それからインタビュワーのツッコミを打ち返すという形式であった。
選考結果は次の日に通知された。選考に関するフローは洗練されており、よく設計されているように感じた。
## オリエンテーション
- NDA
- ラジオ体操
- 自己紹介
## 業務
- iMac
- YubiKey
- 課題 1. psd.js の TypeScript 移植
- 課題 2. 通知 API の JSON API 化+React 化
- 同人誌入稿画面のレスポンシブ化
- 新しい入稿フローの提案
### ランチ
- タコライス
- LINE Pay
- PayPay
## 成果発表
## 感想
### 社風

View File

@@ -0,0 +1,79 @@
---
title: RSA
---
http://inaz2.hatenablog.com/entry/2013/11/27/225953
```
openssl genrsa 32 > key.pem
openssl rsa -text < key.pem
```
```
modulus: 2608173289 (0x9b7590e9)
publicExponent: 65537 (0x10001)
privateExponent: 1888610089 (0x7091e729)
prime1: 52223 (0xcbff)
prime2: 49943 (0xc317)
exponent1: 1459 (0x5b3)
exponent2: 3417 (0xd59)
coefficient: 17568 (0x44a0)
```
$$\text{modulus} = \text{prime1} \cdot \text{prime2}$$
publicExponent は $(\text{prime1} - 1)(\text{prime2} - 1)$ とお互いに素な数から選ぶ。65537 で固定、なぜなら二進数で 10000000000000001 となり、ビットがあまり立っておらず計算が早いため。
privateExponent は $\text{publicExponent}^{-1} \text{mod} (\text{prime1} - 1)(\text{prime2} - 1)$
## 中国の余剰定理
[定理の詳細](https://ja.wikipedia.org/wiki/中国の剰余定理)
$$\text{exponent1} = \text{privateExponent} \pmod{\text{prime1} - 1}$$
$\text{exponent2} = \text{privateExponent} \pmod{\text{prime2} - 1} $
$ \text{coefficient} = \text{prime2}^{-1} \pmod{\text{prime1}} $
これらは復号の簡単化のために用意された係数である。
## 公開鍵の中身
```
openssl rsa -pubout < key.pem > pub.pem
openssl rsa -text -pubin < pub.pem
```
```
Modulus: 2608173289 (0x9b7590e9)
Exponent: 65537 (0x10001)
```
## 暗号
$ \text{source}^\text{publicExponent} \pmod{\text{modulus}} = \text{encryptedText} $
## 復号
$ \text{encryptedText}^\text{privateExponent} \mod \text{modulus} $
# Diffie-Helmann 鍵共有
## 一方向性関数
$ \mathrm{G}^x \mod \mathrm{P} = y $
右辺を求めるのは簡単だが、余り$y$から$x$を求めるのは難しい。
この性質を利用して、$x$に秘密情報を与えて交換することで第三者による復号を防げる。
A は$G^A \mod P$を B に送信
→$(G^A \mod P)^B \mod P = (G^{A \cdot B}) \mod P$
B は$G^B \mod P$を A に送信
→$ (G^B \mod P)^A \mod P = (G^{B \cdot A}) \mod P$
以下の法則を使用しているため、お互いに同一の結果を得られる。
$ (G^A)^B = G^{A \cdot B}$

14
source/_drafts/silence.md Normal file
View File

@@ -0,0 +1,14 @@
---
date: 2020-02-13 16:22:05 +0900
title: 静寂を得る方法
---
聴覚過敏であったり、そうでなくとも周りの音がパフォーマンスに悪影響を与える人のために、静寂を得る方法を紹介します。
## EARIN M-2
[EARIN](https://earin.com/) は左右分離型 Bluetooth イヤホンです。付属のイヤホンの代わりに自分の耳にフィットする Comply のイヤーチップと付け替えます。
## Moldex
Moldex は使い捨て耳栓のメーカーであり、各種遮音レベルに分かれた多様なラインナップを提供しています。

View File

@@ -0,0 +1,40 @@
---
title: 新しい自鯖
---
10年ぶりに新しいサーバーを調達しました。最後に自鯖を組んだ時は高校生、沖縄に住んでいた頃です。BTOのタワーPCにDebianを入れてWebサーバーにしていました。UPSとか無いので台風で停電するたびにWebサービスが落ちるヘボ感です。
今回も完成品を買ってしまえばそれでお終いですが折角ですし、なにより面白そうなのでパーツからサーバーを組み立てましょう。初めてのAMD、初めてのDDR4メモリ、初めてのNVM Expressです。
# スペック
用途を考えましょう。
- 機械学習サーバー
- 自宅クラウド
- メールサーバー
- ファイルサーバー (Nextcloud)
- VPNサーバー他
- VS Code Remote SSHのホスト先
- 重いmakeやらなんやら
- TabNine
- Webサーバー
- WebアプリやTelegram botのデプロイ先
重いタスクを並列してやらせたいので最優先はCPUとメモリです。メモリはデュアルリンクを重視して32GBx2を、CPUは昨今のライブラリのマルチコア対応を勘案してRyzen 9 3950Xにしました。
> 結果から言うとメモリはもっと必要でした。巨大なPandasデータフレームを並列処理なんかするとサクッと消えてしまいます。予算に余裕があるなら128GBほど用意したほうが良いです。
GPUは古いサーバーに突っ込んでいたNVIDIA GeForce GTX TITAN X (Maxwell)を流用しました。メモリが12GBありますが、最大ワークロード時でも5GBは残るので今のところ十分です。
記憶装置は3TB HDD 2台と500GB NVMeメモリです。NVMeメモリはOS用、HDDはデータとバックアップ用です。
マザーボードはASRockのB550 Taichiです。X570マザーと比較して、実装されているコンデンサーや安定性でB550にしました。
今後GPUを追加することを考えて800W電源を選びました。実際にサーバーを稼働させて使用電力を計測してみると、アイドル時に180W前後、フル稼働時でも350Wを超えないくらいでした。今後UPSを買う場合はその付近+バッファのグレードを買うと良いかもしれません。
ケースはFractal DesignのMeshify 2にしました。シンプルで良い。
OSは長年親しんできたDebian系を卒業してArchlinuxにしてみました。すでにファンになりかけています。本当に何も用意してくれません。セットアップウィザードとかないです。いきなりシングルユーザーモードにぶち込まれます。`which`すらインストールしなければ使えません。潔癖症の自覚がある人はArchを使いましょう。あとAURにいくつかパッケージを公開してみたので、よければvoteお願いします。
Arch Linuxのセットアップは個別に記事を書いたので読んでください。入力したコマンドを全て記録したので再現性があります。