超今さらExpress触ってみた - その1 Expressって生々しすぎない? -

Express - Node.js web application framework

背景

  • これまでサーバサイド Node.js は callback 地獄に耐えられなさそうで避けてきてて、サーバサイドは基本 Rails 、インフラはフルマネージドに持っていくようにしてる
  • Webサーバと Rails と PHP はまぁそれなりに使える、JavaScript そのものを書くのは別にそんな困らないけど、Node.js 独自の事情はよく知らない
  • Google BigQuery の導入に向けて Google Cloud の Storage と Functions を使っていく作戦
    • Cloud Functions は調べ始めた段階で Node.js 6 のみ対応1
    • HTTP-triggered Function は Express の req, res オブジェクトが渡ってくる

ということで Node.js 6 ベースで Express.js を書くというのが当面の目標で、最終的には Functions で動くようにしつつテストコードも書きたい、というところを目指していく。

以下は Express のドキュメントはほとんど読んでなくてあり合わせの知識で作業をしてたので変なことしてたら教えてほしいです。(こういうの書いててリアクションあったことほぼないんだけど)

まず普通に動かす

これはまぁ簡単。特に書くこともないけど、Node.js 6 前提なので、npm ではなく yarn で入れてみた。くらいかな。npm 5 が bundle されるのは Node.js 8 から、らしいので。

The npm Blog — npm@5 is now `npm@latest`

びっくりしたのはサーバの起動メッセージも何も出ないんですね…。

routingはアプリの中の事情であって環境の事情とは分けたい

サーバのセットアップとアプリの設定は分けたかったので、server.js と app.js に分けてみる。

app.js

const express = require('express')

const app = express()

app.get('/', (req, res) => {
  res.send('Hello Express')
})

module.exports = app

server.js

const app = require('./app')

app.listen(3000, () => {
  console.log('Starting server localhost:3000 ...')
})

これを

node server.js

で起動する。

なにもかもねぇのでmiddlewareを足す、が、

少なくとも Rails の development 環境にはあった

  1. request ごとのログ2が自動的に出力される
  2. 変更に追随してコードを自動的にリロード

機能がない。これは割と致命的に不便。

ということで以下を追加。

ここで困った。と言うのも上で server.js と app.js を分けていたんだけど、middleware の記述はどっちかというとアプリそのものというよりは環境に近いので server.js に分けたい。ところが

const morgan = require('morgan')
const app    = require('./app')

app.use(morgan('combined'))

app.listen(3000, () => {
..

とは書けない。

どうも、

routing の後に middleware を追加しようとするのはダメっぽい。

はーなるほど。まぁ分からなくもないんだけど、そういうの、記述順に依存せずに動くような、Sinatra で言う configure block みたいなやつを用意してほしいなぁと思う。`Unopiniated` に反するのかもしれないけど。

ということで express の初期化を server.js 側でやって、routing を行う app.js に投げる形にした。

server.js

const express = require('express')
const morgan  = require('morgan')

let app = express()
app.use(morgan('combined'))

app = require('./app')(app)

app.listen(3000, () => {
  console.log('Starting server localhost:3000 ...')
})

app.js

module.exports = (app) => {
  app.get('/', (req, res) => {
    res.send('Hello Express')
  })

  return app
}

これを

nodemon server.js

で立ち上げると reload できるし、普通にログを吐く!

ちなみにNodemonについて

以下の記事を参考にした。

StrongLoop - Comparison: Tools to Automate Restarting Node.js Server After Code Changes

ちょっと古いけど、たぶんそう困らないんじゃないかな。

つづき

超今さらExpress触ってみた - その2 Routerと実際のRequest Handlerを分けたい - - あーありがち(2018-09-11)

  1. 2018-07-24 段階で Node.js 8 と Python 3.7 が beta サポートされた 

  2. logger で手動で吐くやつじゃなくて 

rackアプリのサーバサイドでHTMLをチェック

まとめ

  • tidy を文法チェッカとして使う rack middleware は rack-htmltidy だが、1.8 専用
  • しかも HTML 5 には対応していないのでスマホ版などイマドキの HTML に対応できない

ということで、HTML 5 対応を考えなければ rack-htmltidy を使えばなんとかなるのですが、ちょっと寂しい状況ですね、これは。

背景

しばらく前からWebのフロントエンドの作業をする際にはこのFirefox add-onを使っていました。

しかし Firefox が 5.0 になり、release サイクルが変わって以降、Windows 版以外は source が配布されるのみになってしまいました。さすがに Firefox add-on のために自前 build とかやりたくないし、そこまでの死活問題でもないし、まぁいいかと見送っていたのですが、先日 HTML の構造を壊して手痛い時間の浪費をしてしまったので、一度真面目に考えないとなーと思っていたところでふと気づきました。

サーバサイドでチェックできればいんじゃね?

Bingo でした。rack tidy で検索するといくつか見つかります。というわけで現状を整理してみたいと思います。

Html Tidy

まず今回の話で出てくるいちばん大切なソフトはこれです。

HTML Tidy Project Page

HTML Tidy とはとても古いソフトウェアで、

  • HTML の cleaning
  • HTML の構文エラーの警告

の2つの機能を持っています。先の HTML Validator も中で tidy を実行するモードを備えています。

tidy gem ( 1.8 )

http://tidy.rubyforge.org/

メンテされていないので fork バージョンが多数存在しますが、今でもこれを参照しているプロジェクトが多いです。以下の 1.8 用の gem は基本的にこれを参照しています。

rack-tidy ( 1.8 )

rbialek/rack-tidy - GitHub

チェックではなく HTML の書き換えを目的にしているので、自分の意図とは合いません。また文字コードの扱いもあるので自動書き換えものはけっこう危険。

rack-htmltidy ( 1.8 )

wbzyl/rack-htmltidy - GitHub

こちらも tidy gem を使ったものでチェックだけで使えます。エラーは Log に落ちるので、それを見ながら作業していけばよいようです。

html5-rack-tidy ( 1.8 )

customink/html5-rack-tidy - GitHub

rack-tidy から fork して HTML 5 対応したもの。ということでこれも書き換え目的になっています。

tidy_ffi ( 1.9 )

1.8 用の tidy gem は libtidy を利用するライブラリで、要するに native extension です。これはそのままでは 1.9 では動きません。1.9 では ffi を通す tidy_ffi を使うとよいようです。

libc/tidy_ffi - GitHub

tack-tidy-ffi ( 1.9 )

その tidy_ffi を利用するバージョンがこれ。

makevoid/rack-tidy-ffi - GitHub

ただしやはり HTML の書き換えを目的にしており、また 1.9 の encoding の絡みもあって日本語の HTML を通すととても残念な結果になることもあり、ちょっとさすがに使えない感じです。

tidy_rack

これは libtidy を使わずに実行バイナリを使うバージョン。

phorsfall/tidy_rack - GitHub

HTML の書き換えもするけど HTML 上に error や warning を出力してくれるらしい。

まとめ

  • tidy を文法チェッカとして使う rack middleware は rack-htmltidy だが、1.8 専用
  • しかも HTML 5 には対応していないのでスマホ版などイマドキの HTML に対応できない

ということで、HTML 5 対応を考えなければ rack-htmltidy を使えばなんとかなるのですが、ちょっと寂しい状況ですね、これは。

※ HTML 5 対応を考えると Validator.nu が今のところイチオシみたいですね。試してないですけど。

蛇足

middleman で動かす

middleman で動かすには config.ru ではなく config.rb の方を書き換えないとダメなようです。config.ru で説明してある部分を読み替える必要があります。

w3c validator

もしかしたら HTML のチェッカとしては w3c validator の方が有名かもしれません。w3c validator はチェッカサービスであり、そのエンジンの名前です。手元の環境に自由にインストールして動かすことができます。

この w3c validator を利用する rack middleware がないか探してみたところ、やはりありました。

ただし、せっかくこのツールを利用しているのに rack-validate は w3c_validators にまったく option を渡せず、ローカルの環境に閉じることができずに

The W3C Markup Validation Service

にアクセスしに行ってしまいます。なんてこった。

ソーシャルブックマーク試した2009秋

ちょっと常用している delicious とはまったく別にソーシャルブックマークのアカウントを作ろうとしていろいろ試してみた。

結論から言うとやはり個人的には delicious 最強。Y! Japan ID のある人は Yahoo Bookmarks でもいいかもしんないけど、使ってる人の様子を見た感じ、フォルダ分けとか、それ要るの?って機能があってなんか違う印象。

論外

  • Google Bookmark はソーシャルではない
    • ならべて.com の評価では Google Bookmark の評価が高い1。確かに操作感はかなりいいが、あれは Web 上のブックマークというだけでソーシャルではない。
  • Spurl は相変わらず日本語検索がダメ
  • Diigo は単にブックマーク目的で常用するには重すぎる
  • goo ブックマークはブックマークサービスごときで個人情報取りすぎ。試す気にすらなれず。
  • fc2 は最後のお知らせが2年前。やる気なしと判断。

はてなは個人的に合わなすぎる

  • 常用ブラウザの一つ Camino で bookmarklet が永久にログインを要求してきてまともに動かない。こんな動作は他のソーシャルブックマークではなかったので、すごくやる気をなくす(もしかしたら 3rd party cookie ?)
    • Safari では動いた。
  • タグが [ ] 囲みなのは無理。tDiary ユーザーだけど無理。
2009.09.09:17:34:13 >wtnabe< てゆーか!ええええええ!はてブのタグって
日記の [ ] のままなの!? マジかー。

まともに試したのは nifty, buzzurl, livedoor

nifty clip は import できない?

2009.09.08:19:10:45 >wtnabe< で、nifty clip は import はできないのかな?
2009.09.08:19:16:59 >wtnabe< import できないブックマークサービスに誰が
引っ越すんだよぉおお

意外にdeliciousのリニューアルから学んでいない?

ブックマーク画面を新窓で開かないので、元のページを見ながらタグやコメントを書いていくことが難しい。

nifty, buzzurl はともにブックマークしたいページの内容をブックマーク用のページに取り込むことで代替しようとしているが、

  • HTML には無駄が多いので、目的の内容がちゃんと読めるとは限らない
    • JS が頭に来てたらまず無理
  • ブックマーク対象のページが長ければどんどん submit ボタンが下に追いやられて操作性が悪くなる
    • nifty clip はデフォルトではブックマーク対象ページの内容が折り畳まれているのでマシのように見えるが、結局見ながらコメントやタグ付けしようと思ったら同じことだし、いずれにしても [ クリックする ] ボタンが下すぎる
  • というか内容じゃなくてビジュアルについてブックマーク、コメントしたい場合のことを考えていない
  • buzzurl は新窓じゃなくて新タブを開く。これは javascript の単純な記述ミスなのかも。
    • 逆にあえてタブを開くようにしている可能性もある。delicious bookmarklet 程度の大きさのウィンドウを開くようにしてみたが、そんな大きさでは収まらない。

基本的にブックマーク作業を行うページを高機能にしようとすると目的の達成が遅くなる印象を受けた。元々サイトはすでに開いてあるんだから、それを使わせた方が早いのが道理じゃないのかなぁ。

2009.09.10:07:08:17 >wtnabe< まずbuzzurlのbookmarkletがウィンドウじゃ
なくてタブで開かれるのはwindow.openの中身のある第3引数がないからと分かっ
た。
2009.09.10:07:09:42 >wtnabe< ただしbuzzurlの新規ブックマークの画面はそ
もそもdelicious程度の大きさの新窓では表示しきれないという問題があって、
結局タブで開くのが正しいらしい。ブックマーク画面のクセに主張が強すぎる
だろ。
2009.09.10:07:17:11 >wtnabe< その点ははてブがよかったが、もう今どきタ
グを [ ] で入力していくのにはちょっと耐えられない。いや tDiary 使って
ますけどね。使ってますけどね。

タグはキーワードなのか?

2009.09.10:07:45:03 >wtnabe< buzzurlはもう一つ、タグをキーワードに言い
直してるのはいいんだけど、form の field が分離してるのが解せない。もっ
とたくさんキーワード付けたくなったらどうするの、とか。

タグという言葉をあえて避けたんだろうとは思うけど、input type="text" な field に分けてしまうと、

  • 収まらなかった場合どうするの?
  • 少ししか付けない場合はかなりの空間が無駄

という問題がある。

一応ツール作った

2009.09.10:09:40:12 >wtnabe< JSで違うウィンドウのDOMっていじれないのかな?
2009.09.10:09:43:45 >wtnabe< setTimeout() でタイミングずらしたらできた。
2009.09.10:10:04:07 >wtnabe< setTimeout でむりくりいじるのはいいんだが、
読み込み時間がサイトによって違うから設定が難しいなぁ。
2009.09.10:10:09:34 >wtnabe< んー。nifty の bookmarklet は google と
yahoo の referer をゴニョゴニョしようとして長くなり過ぎてるから
document に append する形になっちゃってるのか。この処理外したもの自作
した方が最終的には面倒がなさそうだな。
2009.09.10:10:17:38 >wtnabe< なんとか 550x600 の popup window で
nifty clip 使えるようになった。

これでなんとか使えるかなって感じ。

nifty clipのfeedが特殊

2009.09.10:14:47:47 >wtnabe< うわーなんだこれ。nifty clip でのclip の
feed は本人のコメントじゃなくて元ページの頭の部分がdescription に入っ
てるよ。

もしかしたら需要あるのかなぁ。例えば気になる記事を他人に読ませるときの手がかりになるとか? 自分でも思い返しやすいとか? つーかでも自分の作った feed として全体を見たときに、著作権的に引用扱いで賄えるの? とか疑問がいろいろ。

ちなみに delicious や livedoor clip は自分のコメントが feed に入るようになっている。ブックマーク時の感想、意図はコメントを読んだ方が思い返しやすいのでこっちの方が好み。というかフツーこうだと思ってた。

最終的には livedoor clip にしたが…

2009.09.10:15:13:21 >wtnabe< livedoor clip はフツーっぽいな。本人のコ
メントが feed に入ってくる。popup window でコメント入れられるようにま
たいじるのか…。ツンデレだわほんと。#livedoor
2009.09.10:15:23:34 >wtnabe< livedoor clip の [ マイクリップ ] ってすっ
げー目立たない気が

メンテ画面がやたら出る。出ないときは clip 操作は比較的軽快に動くが、閲覧が重い。

あと今回 livedoor ID を新規取得したんだけど、ID発行メールがくるまでに丸2日くらい掛かった。試しに gmail でもう一つ ID を取ってみたら、そっちはそれほど時間が掛からなかったので恐らく特殊なケースなんだろうけど、さすがにちょっとビックリというかガックリというか。

その待ち時間のおかげで nifty と buzzurl の実験ができたんだけどね。

おまけ - 最近ポータル使ってないので @nifty ID 取得にまごつく

ポータル上のサービス使うのって難しくないすか。普段自分はもう「いわゆるかつてポータルと呼ばれたサイト」は使ってないので、情報量の多さに圧倒される。自分の目的を達成する方法がまったく分からない。

2009.09.08:18:29:53 >wtnabe< @nifty clip 新規登録しようとしたらいきな
り @nifty ID でログインしろと言ってきた。何を言ってるのか(ry なんだこ
れ。
2009.09.08.18:30:50 >wtnabe< nifty はごちゃごちゃして分かりにくいなぁ
2009.09.08:18:33:25 >wtnabe< この無料ID取得ってやつか?  なんでそこへ
の案内がないんだよー
2009.09.08:18:34:55 >wtnabe< なんかユーザー名とは別にユーザーIDが発行
された。昔の[a-z]{3}[0-9]{5}形式の。まだこれでなきゃ使えないサービスっ
てあるんだ。
  1. 調べた当時は突出して高かった 

github は git 1.4.x では使えないみたい

イントラで yapra を使いたくて git clone しようと思ったんだけど、404 で止まる。使ったのは Debian etch の git 1.4.4. 探すと同じようにハマった人が居て、やはり backports から入れて解決したようだ。

github - /var/log/messages

でもこういう情報はちゃんと表に出さないとダメだろうとカッとなってあちこち調べまくった。1.5 以上でしか github は使えませんというならそれはサイト上に書かれているべきだろうと思って探したがそもそも github には help がない。

Twitter / Keiji Yoshimi: @wtnabe guide? http://githu…

Home — GitHub Guides — GitHub

Guides というページを教えてもらったけどなんでこれトップページとかヘッダのメニューにリンクないの。そしてやはり欲しい情報はないっぽい。

さらにカッとなって git の release note を漁ると、こんな記述を発見。

The above two new features are not enabled by default and you have to explicitly ask for them, because they make repositories unreadable by older versions of git, and in v1.5.0 we still do not enable them by default for the same reason. We will change this default probably 1 year after 1.4.2's release, when it is reasonable to expect everybody to have new enough version of git.

from http://www.kernel.org/pub/software/scm/git/docs/RelNotes-1.5.0.txt

1.5.0 ならではの新しい機能を有効にすると古いバージョンからそのリポジトリは使えなくなります、と。1.4.2 が出て 1年経ったらそのオプションをデフォルトにしますよ。

で、ログを漁ると

Public Git Hosting - git.git/log

1.4.2 のタグが打たれてすでに 2年。つまり 1.5 以降を使っているリポジトリには 1.4.x ではアクセスできなくて当然の状況だと。こういうことですな。

残念ながら github がどういう環境で動いているかまでは調べる気力がなかったので分かってないですけど、せめてそういう大事な情報はトップページかせめて 1 hop の位置に書いといてくれよと思った。

その後スッキリして backports から git 1.5.6 入れたよ :-( できるだけ stable のままで行きたい人だっているんだよ。

もやもやしたものがありますねぇ

そもそも MacOSX のファイル名は UTF-8 で取れるけど UTF-16 で保存されてるんじゃないのかとか思ったりもしますが、ウノウさんには番長名乗ってるテスタも居るわけで、スルーしちゃってるってことはですよ、これは要するにテスト項目として MacOSX のファイル名問題が全然上がっていなかったということを意味しませんか。ちょっとそれはどうなんだろう。

フォト蔵使ってないんで分からないんですけど、Mac での動作を保証しないアップローダというかファイル転送サービスは多いですよ。1ユーザーとしては諦めがついてるんで気にしてないですが。

まぁ今回も保証外ですで済まそうと思えば済ませる問題をそうしなかったという点は評価できるんですけどね。

IEのドメイン当たりクッキー数の上限が20から50に増えるらしい

Internet Explorer で、ドメインあたりの Cookie の数の制限が 20 から 50 に増加する

RFC 的には user agent は最低 20 扱えるようにしろ、と書かれているだけで上限はないっぽい?

RFC 2965 HTTP State Management Mechanism

によると、

Applications should use as few and as small cookies as possible, and they should cope gracefully with the loss of a cookie.

ではあるけれども、

忍者 TOOLS の悪行 - にぽたん研究所

で挙げられている Client Side State - HTTP Cookies に書かれている

Servers should not expect clients to be able to exceed these limits.

という記述を見つけることができないなぁ。なんか見落としてますか?

※ いずれにせよ最小限で済ませましょうよというのは間違いないんだけど。

screen の multiuser mode を1台のマシン上で1人で実験する

前にも一度だけやってみたことはあったんだけど、そのときは「おぉすげぇ」と思っただけで使いたいとは思わなかった。今回は真面目に使いたいと思ったのでメモ。

まず、screen の multiuser mode はユーザーが1人だけでも利用できるため、ちょっと混乱する。先に言っておくが、ユーザーが自分1人の場合は

screen -x は multiuser mode でなくても成功する

のでこの結果では判断しちゃいけない。ただ、何かの拍子に機械を変わる必要があり、いちいち detach しなくても作業を続けられるというメリットはあるのでこの使い方自体を否定する気はない。しかしあくまで multiuser じゃないのでそこんとこよろしく。

で、multiuser mode の実験になるわけだが、必要な作業は以下の通り。

  1. screen バイナリに setuid root ( man chmod )
  2. 別なユーザーでログインする
  3. screen の session を作成し、それに対し
コマンド意味
multiuser on絶対に必要
acladd USERこれやっとかないと detach できない
aclchg USER PERMISSION WINDOW特定のユーザーに特定の window 上で特定の操作を許可する

と言ったコマンドを実行すると自分の利用している screen session に別のユーザーが attach してこれるようになる。attach するには

screen -x -r username/pid

とする。screen -S で name が設定されている場合はそれでもよい。detach は通常通り detach すれば ok.

別なユーザーでログインすることの意味

1人で実験の際に意外とハマるのは上の 2 に挙げた別なユーザーでログインするというところ。これ、su ではダメ。もっと言うとそのユーザーの tty が作成されてないとダメ。ということで login する。

これをクリアすればもう大丈夫。

acladd, aclchg 辺りの挙動がなんか変

しかしまだ自分の中には疑問があって、

  • acladd すると aclchg しなくてもいきなりフルコントロールできちゃうので、これは一種のセキュリティホールじゃないのか?
  • acladd しなくても aclchg しただけで attach は可能なので余計な作業をしてほしくない(例えば見せたいだけの)場合は先に aclchg した方がよさげ。
  • でもその場合も acladd しておかないと detach できない
    • で、acladd したときにやっぱり全権限が付与されちゃう予感

なんか、acladd と aclchg の動きがおかしいような。確認したのは screen 3.09.15 @ OSX なので、最近のバージョンでは挙動が変わってるかもしれない。

※ 設定も環境も元の session を作ったユーザーのものに従うっぽい。escape とか違ってると detach できなくて焦るので multiuser での作業はすぐに情報を伝達できる準備(irc とか Skype とか口頭でとか)をしてからやっとかないと混乱するかも。

るびま創刊

イマドキ、という感じがしないでもない Web Magazine が創刊されました。

Rubyist Magazine

日本 Ruby の会責任編集。Code Reading 読んでみるかなぁとか、なんだかんだ影響受けてたりしますが。

portupgrade -an の結果を整形

重たいのは承知のうえで富豪手抜きアプローチ。こんな感じで。

#! /usr/bin/env ruby
# -*- ruby -*-

print "Have you executed CVSUP recently ?\n"
print "Please wait for a while. Take coffee break ;-)\n"

needupgrade = Hash.new()

cmd = open( '| sudo portupgrade -an 2>&1' )
while line = cmd.gets
  if ( line =~ /Upgrading '(.*)' to '(.*)'/ )
    needupgrade.store( $1, $2 )
  end
end
cmd.close()

if ( needupgrade.size > 0 )
  maxlength = 0
  needupgrade.keys.each { |string|
    if ( string.length > maxlength )
      maxlength = string.length
    end
  }

  needupgrade.keys.sort.each { |pkg|
    printf( "%-*s --> %s\n", maxlength, pkg, needupgrade[pkg] )
  }
else
  print "All ports are up-to-date ! Congratulation !\n"
end

STDERR をリダイレクトしてるのは no need な upgrade の情報が STDERR に出ちゃうのでそれをカットするため。

これでインストール済みの ports のうち、アップデートがあるものをリストアップできる。もちろん cvsup はしてないとダメだし、pkgdb が矛盾してて portupgrade の出力が途中で止まった場合のことは考慮してません。

名づけて listupgrade かな?

FreeBSD で自分に必要な update だけを知る

方法が分からない。ただ、作る方法はあるなぁと思っている。

  1. pkg_db と ports skelton の distinfo を比較して skelton の方が新しいやつをリストアップ
  2. pkg_db と FreshPorts を比較して、FreshPorts に新しい情報が出ているやつをリストアップ
    • どこまで戻るかがあれだけど。手元の skelton より新しい日付は全部さらうってのもアリだな。
  3. pkg_db と CVSWEB と比較するのは面倒そうなのでやりたくない

ほんとは portupgrade でできるような気がしないでもないんだけど、man をざっと見た限りはそんな機能なさそう。

みんなこういうのまったく必要に感じないのかな? 誰か作ってくんないかなぁ。local で閉じる場合は以下のような感じ?

  • /var/db/pkg 内の directory 名をさらって
  • バージョン番号と package の名前を分割してハッシュにする
  • 名前で whereis を掛けると skelton の位置が分かる
  • distinfo を読んでバージョンを比較
  • 食い違ってるやつを出力

と思ったら

portupgrade -an

でいいっぽいぞ。何やってんだ、おれ。

あー。すごい重い。しゃーないっちゃしゃーないけど。なんか全部 Makefile なめてるし。やっぱもっと pkgdb と distinfo だけをうまく使った方法があってもいいような気がするな。

tdiarygrep 追加

msearch の精度の低さで放置していた日記内検索は結局 tdiarygrep にした。これは日記データに直接 grep を掛けるので負荷が高く遅いのであまりやりたくなかったんだけど、検索できない日記なんて不便でしゃあないと実はずっと前から思っていたのでこれにした。設置が楽なのが何より強み。

ちなみに今回入れたのはオリジナルの方。これで Google が拾ってくれなくても検索できる。よしよし。

tree コマンド

こんなものが。DOS 独自のものかと思ったら RedHat に入ってました。Debian も FreeBSD もパッケージがある。cygwin にはないけど、2000 にも tree.com がある。なんか、あれこれフリーソフト探したりしたことあるけど、全然必要なかったんじゃん。

tDiary のリンク元って

非表示設定じゃなくて記録除外設定なのね。すでに記録されちゃったものは元ファイルを直接修正しないと無理だと。うむ。

TCOの話

一部は的確だけど一部はぼかしてあるなぁ。時間と手間を掛けてトレーニングした技術者なら「訳分かってないけどとりあえずパッチ当てとく」なんてことはないはずなのに、そのパッチ当てすら、自動化・簡略化されたら「自分では何も考えることができない担当」ってのが増えちゃうわけで、TCO は削れるかもしれないけど、状況としては今よりさらに危機的、ということにならんかえ?

教育にはコストが掛かるけど、教育の重要性を隠しちゃうのはどうかなぁ。

About

例によって個人のなんちゃらです