「コンソール」を含む日記 RSS

はてなキーワード: コンソールとは

2023-01-22

エヴァQシンのヴンダー級(NHG)艦のLCLシンクロ対象について

エヴァQシンにて登場するヴンダー及びNHGシリーズ二番艦~四番艦は「誰と」シンクロしているのか? というふとした疑問。

一見LCL存在しないようにも見えますが、どうやら戦闘時にはガス化したLCLガスが艦橋に注入されているようです。

冬月博士もシンで乗っていた二番艦エアレーゼ(エアレーズュング)で最終的にLCL化していましたが、同じ仕様なのかしら。

しか重要なのはしろ二番艦以降が「無人でも動く設計」というところかもしれません。

まぁ破時点からダミープラグはずっと存在しているわけで、エヴァしろNHGにしろ無人仕様はわりと当たり前ではあります

二番艦~四番艦は誰ともシンクロしていない。冬月博士は好きで乗って指揮してただけ。ここまではOK

ヴンダーでは主機(メインエンジン)としてエヴァ初号機を、補機としてS2機関採用しています

明らかにシンジを含め誰もパイロットは搭乗していないので、初号機用のダミープラグも持っていたのでしょうか。

とはいえアンチLシステムや操演に比べれば破の時代からある古い技術なのであって当然かもしれません。

そうなってくると逆にLCLガスなんて艦橋に注入する必要はあるんだろうか? とも思えます

そもそも艦橋のメンバーは明らかに直接操船していますしかし完全手動であり、あれだけ壊されたヴンダーダメージフィードバックもないのでシンクロはしていない。

ふーむ?

ダミープラグシステムを応用して、外部からシンクロ者が操縦するシステム確立させたのはほぼ間違いないように感じます。これは冬月もヴンダー乗員も同様。

あと残る謎はLCLガスだけです。シンクロ技術を使って、脳波だけで操ったりしてたのかな? 冬月博士はなんもコンソールとか出してなかったのでそれっぽい。

逆にどことなアナログヴンダーは……うーん?

2023-01-09

なんかい趣味ない?

ピアノは持ってるけどなんか挫折した

ゲームはゲーミングPC買うほど熱中してたけど、一気に熱冷めてコンソール含めてうっぱらった

漫画も含めて本読まないし、アマプラ契約してるけど観ようって気になれない

出不精だし、外に刺激を感じられない

最近休みyoutubeをダラ観するかinit.vim触るか寝るかしかしてない

2023-01-06

DMMウマ娘プリティーダービーが起動できなくなったので解決した

DMMウマ娘プリティーダービーを遊ぼうとしても、エラーダイアログを出さずに起動しなくなる現象に遭遇した。

Windowsイベントビューアーを除くと、こんなログが吐かれていた(各IDは削除)。

=====

ログ名前: Application

ソース: Application Error

日付:

イベント ID: 1000

タスクカテゴリ: アプリケーション クラッシュ イベント

レベル: エラー

キーワード:

ユーザー:

コンピューター:

説明:

障害が発生しているアプリケーション名: umamusume.exeバージョン: 2020.3.24.51085、タイム スタンプ: 0x

障害が発生しているモジュール名: apphelp.dllバージョン: 10.0.22621.963、タイム スタンプ: 0x

例外コード: 0xc0000005

障害オフセット: 0x0000000000002691

障害が発生しているプロセス ID: 0x0x5B2C

障害が発生しているアプリケーションの開始時刻: 0x0x

障害が発生しているアプリケーション パス: D:\DMMGames\Umamusume\umamusume.exe

障害が発生しているモジュール パス: C:\WINDOWS\SYSTEM32\apphelp.dll

レポート ID:

障害が発生しているパッケージの完全な名前:

障害が発生しているパッケージに関連するアプリケーション ID:

イベント XML:

結論から言うと、Windows本体のapphelp.dllが原因でウマ娘が起動できなくなっているという。

アプリケーションに罪は無いため、DMM Game Playerやウマ娘を何度再インストールしても直らない厄介な現象だ。

Windowsは数十万のファイル存在するため、今回のようにWindows Updateやアプリケーションインストールアンインストールを繰り返すだけでシステムファイルが壊れる事がある。

Windowsでは、これを直すためのコマンドコンソールUIのみに用意されている。

1.DISM.exeを叩く

Windowsスタートメニュー右クリックして、コマンドプロンプトまたはターミナル管理者権限で起動する。

そうするとコマンド入力可能になるので、

DISM.exe /Online /Cleanup-image /restorehealth

を実行する。これは、オンライン上にある正しいWindowsシステムイメージを元に、壊れたファイルを修復する操作となる。

実行するとこう表示される。

展開イメージサービス管理ツール

バージョン: 10.0.22621.1

イメージバージョン: 10.0.22621.963

[==========================100.0%==========================] 復元操作は正常に完了しました。

操作は正常に完了しました。

2.システムファイル整合性チェックを行う

DISM.exeを実行すると、正しいWindowsシステムイメージPC内に保存された状態になる。

この状態で、

sfc /scannow

を実行すると、次のように表示される。

システム スキャンを開始しています。これにはしばらく時間がかかります

システム スキャン検証フェーズを開始しています

検証 100% が完了しました。

Windows リソース保護により、破損したファイルが見つかりましたが、それらは正常に修復されました。

オンライン修復の場合、詳細は次の場所にある CBS ログ ファイルに含まれています

windir\ Logs\CBS\CBS.log (たとえば C:\Windows\Logs\CBS\CBS.log)。オフライン修復の場合

詳細は /OFFLOGFILE フラグによって指定したログ ファイルに含まれています

これで、とりあえずWindows自体の修復コマンドによってシステムファイルが正しい状態復元された状態となる。

実行してもまだメモリ上には古いシステムファイルが読み込まれて実行されている状態なので、終わったらPC再起動する。

3.ウマ娘を起動する。

さて、準備は完了だ。ここまでの操作Windows回復DMM Game Playerで「ダウンロード版をプレイ」を押す事でウマ娘が起動し…ない!

おおブッダよ、あなたは今も寝ているのですか!?

イベントビューアーには今もウマ娘を起動しようとする度にアプリケーションクラッシュイベントが追加されている。救いは無いのですか?

結局、今回のケースではPCで常駐していたリモートデスクトップ用のSplashtop StreamerとVirtual Desktop Streamerをタスクキルする事でウマ娘が起動できるようになり、DMMブラックフライデーで得た有償石でおはガチャを回すことに23成功した。

レアケースかも知れないがウマ娘が起動しないはてな民が居たら役立てて欲しい。

2022-12-21

今日の仏人との会話

 仏人;ワールドカップフランス決勝戦で負けたときマクロンシネマ、

う~~サブいわ、キモいわ、ウザいわ、ありえないわー

https://www.youtube.com/watch?v=6Vof5tbYhcE

マクロンはほんまキモい

フランスが優勝したこと過去2回ある、

1回目はジャックシラクときだ。

そんときシャンゼリゼ通りでパレードやったんだけど、4時間

チームの乗ったバスがやってきて4時間やってお祭り騒ぎ、みんな喜んでみんな浮かれたんだ。

で、

次は第1次マクロン政権ときだった。

そんときパレードやったんだけどどれくらいの時間やったかわかるか?

20分だよ。

マクロンクソッタレエリゼ宮にチームを呼びたかったんだ、

エリゼの中でワイワイてめえだけで盛り上がりたかったんだ、

からチームの乗ったバスシャンゼリゼ通りに来たけど、

voom!

弾丸のように去ってってそれっきりさ。

全くマクロンクソッタレの糞だ。

クリスマスの御馳走について



日本おせちみたいにきっちり決まっているものはないな。

もちろん外せないのはあるけど、パテだな、ソーモンやカナールとか、

あとはダンド、俺はあんま好きじゃないけどまあティピックだ。

あとは牡蠣か、それ以外はまあチーズとかなんとか、家族めいめいってとこじゃね?

基本はノエルから年末にかけては休みだな。

とにかくフランスではノエルから年末にかけて食って食って食って騒いで、

で、新年は2日から仕事だわ。

なので1月ってのはガストロよ、気持ち悪いし寒いしでみんな体調悪くなるよ。

本当に日本フランスノエル正月が逆のイメージだな。

益田;そうだね、日本正月おせちを初めとして祝いじゃ祝いじゃ、

食って食って食って、ってなって、

から7日におかゆを食べるんだ。

仏人;その制度は非常にいいな。

胃を休ませる制度はぜひフランスも取り入れるべきだ。

ただまあフランスではだんだんノエルがmoins sacré(神聖ではない)になってきたがな。

それもこれもみんなヴォク(woke)のクソッタレのせいだ。

ジョワイユノエル(メリクリ)が言えないノエルに何の価値がある。

ヴォクの糞どもはクリスティアンはけちょんけちょんに貶すくせに、

アラブイスラムを少しでもからかったら猛烈に攻撃してくる。

全く世の中狂ってるよ。

日本クリスマスなんて昔は関係なかっただろ?

クリスマスの日に死刑執行したくらいなんだから(笑)

全くクリスマス死刑とかジャポネはクレイジーだぜ。

益田しらねーよそんなこと)

益田;いやでも昭和の早い頃にはすでに子供にはクリスマスプレゼントをあげる風習があったよ。

仏人;マジで?!それでさらにオトシダマがもらえるんだろ??

益田ダブルボーナスやね(笑)

仏人;羨ましいな。

まあそういやフランスでも似たようなのでétrenneってのがあるな。

家政婦とか守衛とか、

お前のためにいつも日々の面倒を見てくれる人に感謝意味を込めてあげるものだけど、

まあ廃れた古い風習だな。

でも今どきのガキのクリスマスプレゼントってのもmoins sacréだな。

アイツラが欲しがるのは最新のiPhoneだよ。可愛げのないことといったらない。

俺らがガキの頃のプレゼントはせいぜい50ユーロくらいのもんだわ。

益田ゲームとか?

仏人;50ユーロじゃ買えねえよ!

昔はソフトで700フランとかしてたんだ。

しかシューペルニンテンドーは1年以上後で出てきたんだ、

日本で出てフランスでは出ないその間に、

マリオストリートファイターがどんだけ面白いかという情報けが流れてきて、

その間俺たちは涙を流してよだれを垂らすしかなかったんだ。

そこでフランスオタクの猛者共は輸入をしてなんとか遊ぼうとしたんだが、

コンソールだけで2,000バル、アダプタもテレビも何もかも規格が違う中で頑張ったやつがいたんだよ。

その頃なんて日本語わかるやつはめったにいなかったからな。

益田ファミコンの頃はアングレしか使えなかったから、昔の方がまだ良かったんだね(笑)

仏人;シューペルニンテンドーになると文字が全部日本語なんだ、

haï・ïïéの意味すらわからん、どっちがウイでどっちがノンだ!?

って万事がそんな調子よ。

そうやっていろんな壁を乗り越えたんだ、

プレイステーションだって規格が違うからディスクが回らないんだが、

蓋がしまっているかを感知するセンサー部分にチューインガムをつけて、

蓋を開けっ放しにしてヨーロッパ規格ディスクを入れてくるくる回して、

回った!となったら超高速回転しているディスクから危ないんだが

それをササッ!と外して日本ディスクを入れて、

それで「動いたー!!!!」とか感涙にむせんでいたんだ。

ああ、何もかもが懐かしいな。

ナポレオンの子孫に新しい子供が生まれたというニュース

ああ、そんなニュース聞いたな。

でも「あっそ、ふーん」くらいだわ。

ブルボン王朝の子孫とかもいるけど、

まあ何の権力もないわな。

益田;でもドイツでは旧貴族の連中が国家転覆を企んでたってのがあったよね。

仏人;coup d'État!!

あったなそんなこと、実に残念だ。

我がフランスでもぜひ起きてほしいことだが。

革命の本場の我が国でも、マクロンはむしろ中世暴君のようにやりたい放題に振る舞ってるわ。

自嘲気味にデモクナルシーという言葉があるくらいだよ。

益田;でも現代ボナパルト家ブルボン家って金持ちなんじゃねえの?

仏人;どーだろ。

まあニュースになるくらいだから裕福なんだろうと思うけど、

でも超金持ちってことはないだろ。

子孫が増えれば増えるほどパトリモワンヌが減ってくんだし。

それに城は維持補修にえれえカネがかかるんだぞ。

もしお前んちの窓が割れたら業者に頼めばせいぜい100ユーロくらいだろうけど、

城のガラス割れたら修復はアルティザンの仕事になるからな。

でもそれでもお城ってのは憧れであり夢だからな。

維持補修が大変だってのに買いたがるやつはいるし、海外の連中にも大勢いる。

フランスでもギニョールの声を担当してた奴らは、リサンシエされるまでは大金持ちだったから、

ほうぼうの城を買ってレフォルムしてたんだよ。

益田現代で新しくイチからお城を作るって人はいなかったの?

仏人;ジャポンラブホかよ(笑)

そんなの作っても意味ねーだろ。

かつて王がいて女王がいてシュヴァリエがいて、

そういった積み重ねがあって初めて城ができるんだ。

まあそういうことやるんだとしたらシノワの連中じゃねーか、

あいつらならプラスチック製の城でも拵えるだろ(mdr)

2022-12-13

anond:20221213193100

かにそれでもコンソールにtanakaを出力してログにもtanakaを上書きすることはできると思いますありがとうございます

これは最初に書いてなかったので申し訳ないのですが、このtanakaスクリプトあくまテスト用で、

最終的にはシェルの全ての標準出力コンソールに出力しつつログにも上書きするスクリプトを書きたいので、execを使用してました。

このスクリプトの3行目の'>(tee)'の'>'が文法エラーになる🥺

※3行目の'>'は実際は半角だけど増田では変換されてしまうので全角で書いてる

1 #!/bin/ksh
2    
3 exec 1> >(tee -a test.log)
4    
5 echo "tanaka"
6
7 exit 0

理想ではコンソールに
tanaka
と出力して、カレントディレクトリtest.logにも
tanaka
と上書きしたい。

bashだとエラーにならなかったのに🥺

2022-12-10

pex LegendsCounter-Strike: Global Offensiveは、どちらもゲームですが、ゲームプレイユーザー層が大きく異なります。Apex Legendsバトルロイヤルゲームであり、PCコンソールプレイすることができます。一方、Counter-Strike: Global OffensiveはFPSゲームであり、PCプレイすることができます。また、Apex Legendsでは、ソロプレイやフルパーティープレイ選択できますが、Counter-Strike: Global Offensiveでは、フルパーティーでのプレイが標準となっています。そのため、Apex LegendsCounter-Strike: Global Offensiveでは、ゲームプレイ話題が大きく異なるため、同じスレッド話題を共有することは困難です。

2022-12-09

anond:20221209200615

コンソール厨は現実を見ようとしないよね

ずっと自分たちの親しんでるものばっかり贔屓し続ける

ゲーマーってもっと技術革新を尊ぶハイテクオタクであるきじゃないのか?

2022-11-06

anond:20221102154429

これまだ1/2だとか言っている人がいるので、本当に2/3かどうかプログラミングで確かめれば良い。

// 「ある夫婦に2人子供がいる」
// 1. 男or女 である確率は 1/2 (トランスジェンダーなどは考えない)
function child() { return ["男", "女"][Math.round(Math.random())]; }
// 2. 100000組の二人の子がいる夫婦を作る
const families = Array(100000).fill(null).map(function () { return [child(), child()] });

// 「片方の子が男であるとき」
// 3. その中で少なくとも一人が男である夫婦を選ぶ
const families_have_son = families.filter(function (children) { return ~children.indexOf("男"); });

// 「もう片方が女である確率は?」
// 4. 3の総数が母数である
const total = families_have_son.length;
// 5. 3の中で、女のいる夫婦を選ぶ
const families_have_son_and_dauter = families_have_son.filter(function (children) { return ~children.indexOf("女") });
// 6. 5を母数で割る
console.log(families_have_son_and_dauter.length / total);

ブラウザコンソールに打ち込めば動くので試してみてほしい。

私の環境では 0.6674999002778923 になった。

2/3が正しそうだ。

実際には、このコードを書いている時点で答えは明確になってしまう。

コードに落とし込むことによって隠された前提をつまびらかにする必要が出るため、実行ボタンを押す以前にはっきりする事がある。

よくわからない問題コードに落とし込むとよい。

ちなみに 1/2 にしたければ、

// 「片方の子が男であるとき」
// 3. その中で「はじめの子」が男である夫婦を選ぶ(間違い)
const families_first_is_son = families.filter(function (children) { return children[0] === "男" });
const total = families_first_is_son.length;
// 5. 3の中で、「次の子が」女である夫婦を選ぶ
const families_first_is_son_and_second_is_dauter = families_have_son.filter(function (children) { return children[1] === "女"; });
// 6. 5を母数で割る
console.log(families_first_is_son_and_second_is_dauter.length / total);

のようにすれば予想通り 0.49868384317792047...(1/2に近似する) のようになる。

しかしこれは問題文の読み間違いであるということがわかる。

2022-10-20

息子 アレク

息子の寝顔を見ててふと思った

俺はこの子幸せにする義務があるのだろうか。

 

4歳の息子にはFireタブレットを与え好きに使わせてる

2歳から使っているので器用なものだ、ゲームYouTubeサクサク操作している。

最近、俺にゲームやらせようと持ってくる

「パパこれ面白いからやっていいよ」

優しさではない

プレイ最中アレク妨害するのが目的

タブレットに「アレクサ」と呼びかけるとゲーム画面が消えアレクコンソールに遷移する

割り込み中断され俺が怒るのが楽しいようだ、そのたびに腹を抱え足をバタバタ笑い転げている。

アレクサ ピカチューを出して なんか歌って」

「ピッカピカピカチュー

部屋を走り回り発狂して笑い転げる

これを何度も繰り返す、何が面白いのだか

「こらー」と叱ってやるのが最高潮で息ができないほど笑ってる

実に可愛い子供笑顔ほど親として人として幸福はなかろう

 

そんな息子との日々、寝顔を眺めていると俺はフワフワ幸せなんだけど、

はて、俺はこの子幸せにしなきゃならんのだろうか。無理っぽくね?

飯は食わせ、常識社会性を授け、習い事やら学問やら、適宜適切な機会は与えるつもりだが

彼の人生幸福まではコミットできんよなぁ

知ったこっちゃない、俺の手で制御できるものではない、運もある、頑張ってくれとしかいいようがない。

 

なんかこっちが貰ってばかりで申し訳ない気持ちになったよ

2022-10-17

anond:20221017141159

かに。小型化=開発難易度ですからね~。

機能詰込み小型化、は日本人が得意だしこだわるところではあると思いますが。

XBOXシリーズSみたいに割り切った据え置きコンソールがあってもいいかもですね。

XBOXリモートプレイに舵を切ってるみたいだし。

2022-10-17

anond:20221017123335

わかる。

個人的には特にフィードバックが欲しいな。

 

携帯機にしたいっていうライン、どうにか諦められないか

ジョイコンが壊れやすいのも小型化突き詰めすぎが原因と思う。

Permalink | 記事への反応(1) | 言及する | 14:11

2022-09-27

anond:20220927150619

敵のクラッキングとやられ具合を把握できるシステムとそれを表示するGUI

これはテロリストに襲われる教室なみにやってみたいやね

まさに「こんなこともあろうかと無駄システム

敵の攻撃を把握できてて、その進行具合をグラフ化できて

エンタキーをッターンとすると、それまで真っ赤で残り1メモリだった画面が、一気に青くなる


それが出来るって事は、システムを掌握してるって事で

攻撃意味はないって事なんだけど

表面上は焦って見せて警報とかならしちゃう

オペレーターに「第三防壁突破されました」とかも言わせちゃう

まだなの?とか焦って聞かれてるのに、「おっ、てきさんもなかなかやるねー、もうちょっとまってー、よーしいいこだー」とかブツブツ言いながらコンソールでカチャカチャとバイナリ入力して

エンタキーをッターンしたい

2022-09-24

[]9月24日

ご飯

朝:バナナ。昼:かいわれ大根ピーマン焼きそばベーコンエッグトマトチーズ。夜:キャベツウインナースープパン

調子

むきゅーはややー。お仕事おやすみ

EVE burst error

クリア

20年以上前ゲームなのに、オシャレで格好いいイケてる雰囲気が凄かった。

私立探偵小次郎パートと、エージェントまりパートで全く異なる二つの事件捜査する。

捜査過程で街を探索するのだが、情報屋とのやりとりや、聞き込みなどのシーンが洒落ててたり、ゲラゲラ笑えたりと個性豊かで楽しい

絵で表現しきれない箇所はバッサリ黒塗り背景に文章だけで表現するのも潔いし、何よりそのテキスト面白いのだから一切問題なし。

ホテルバーや海沿いの倉庫など、登場する場すら格好よく感じてくる。

軽妙なやり取りもあれば衒学的な部分もありで、兎に角事件捜査を楽しめる。

二人主人公制は最初のうちは時折登場人物が重なる程度なんだけど、徐々にそれらが一本に繋がっていくところが快感

特に二人の主人公が互いを知らずにコンピュータ回線越しに事件捜査のために協力するシーンはただCIコンソール文字が出るだけも演出なのに、熱く燃える今作屈指の名シーンだろう。

この互いが互いをあまり知らずに事件捜査のために協力するという関係性も、格好いい。

普段はだらしないけどやる時はやるタイプ主人公拳銃片手に非合法組織と戦いながら夜の街を駆ける、そんな創作物テンプレート自体根本的に格好いい…… と言ってしまえばそれだけなのかもだけど、もうこれは冴羽獠DNAに植え付けられた僕たちの宿命なのかもしれないなあ。

(ルパン三世でもいいし、ダグラスカイエンでもいいし)

ジャズっぽいBGMも決まっている。

そんな感じで、事件捜査する過程については百点満点文句なしの出来。

だけど、物語の終盤はかなり駆け足気味かつ、しっくりこない終わり方だった。

突然現れる現実を超越した科学技術に、二人の主人公蚊帳の外自体が進行し、犯人が突然恋愛をはじめる展開、そして自白で幕をおろす。

最終章までの丁寧な展開、格好いい展開はどこへやらで、正直肩透かし

犯人自白と、とあるキーパーソン独白だけで最終盤は進むため、二人の主人公がそれらにどう感じたのかどんな行動を取ったのかが一ミリもわからないのは流石にガッカリ

何より「犯人自白」とは書いたが、とあるSFガジェットにより厳密には正しい言い回しではなく、真の意味での犯人はおそらく作中でセリフが全く無いという構造も、流石にちょっと終わった感じがしなかった。

とはいえ、謎解きのロジックや、あっと驚くサプライズトリックを楽しむ作品ではなく、事件捜査過程の格好良さを楽しみ作品だと割り切れば文句なし

なお、柴田茜というルポライター女性が「僕っ子」なのは、流石に当時でもコテコテでやりすぎなのでは? と思っていたが、かないみか氏の演技力のおかげですぐ違和感がなくなった、声優ってすごい。

原作アダルトゲームなこともあり、明らかに情事意図するシーンや、明らかに元はエッチなことされたけど違うことに置き換えたシーンなどが多くあり、元もプレイしたくなった。

また、銃を突きつけた状態自由を奪うために服を脱がすというシーンが3回ほどあって性癖を感じたが、たしかにその惨めさはエッチだなあと思った。

続編が色々と出ているが、近年の作品以外はどれも評判が良くないので、飛ばしてその近年の作品を遊ぼうと思う。

2022-09-20

anond:20220920125705

シヴィライゼーション6とかシティーズスカイラインみたいな元々PCゲーだったのをコンソール版にしたやつ

重くて終盤処理落ちしてまともにゲームならなかったか

2022-09-12

anond:20220912011359

今はまたガチャ回帰してるよ

かに増田の言う通りゲーム性高いスマホゲームはかつて流行った

荒野行動とかがそうだけど

結局スマホってプレイしづいか

APEXが流行たらみんなコンソールPCに移行してしまった

2022-09-10

anond:20220910120243

レガシー化して不要になったサービスも含むフルスペックOSインストールされてるのが宗教信者で、

自分OSスクラッチしてて(ただし、安定・堅牢かどうかは定かでない)倫理道徳に関わるサービスを低機能コンソールアプリで済ませてるのが増田なんや

2022-09-03

anond:20220903150604

クソガキがパズドラ荒野行動に夢中だった時代に専用コンソールに人を取り戻したマイクラフォーナイトの偉大さはすごい

2022-08-27

センスの無い未経験年収300万強のプログラマとして就職して必要だったこ

学歴がよくなくて、就職が困難だったので中小 SIer で働いていた。 (プライム案件を取ってこれる分マシらしい)

レキサルティレクサプロデパスのお世話になって続けてたけど、結局は薬でどうにかできず、辞めてしまった。

参考程度だけど、未経験の人が 300万 をもらうために、どのようなスキル必要かを、まとめておく。

ちなみにどれくらいプログラムが書けなかったかというと、競技プログラミング努力しても AtCoder黄色になれず青色のままってくらい。

AtCoder でいう、初心者から抜け出せないという、要するにセンスがないということなのだけど、そういう人も居そうなので、参考までに。

要するに

経験プログラマに対して、これだけ要求されるのだから、未経験の人は覚悟するようにという指針を提供したいので書いた。

入社時に覚悟しておかなければならない事

誓約書

基本的に、損害を与えた場合には、それを作業者補填するという誓約書を結ぶ。

要するに、捨て駒として扱って、失敗したら賠償しろ、という事になる。

このことを認識して、失敗しないように振舞ないと、連帯保証人含めて迷惑をかける事になる。

要するに、低賃金で未経験プログラマ案件にノーリスクで送りこんで、稼ぐための手段です。

必要だったスキル

ディレクション

基本的に PL (夢想家) → PM (御用聞き) → プログラマ という環境なので、プログラマ自分ディレクションして意思決定する必要がある。

例えば、下請け場合は、PM の御用聞きの結果の WBS に合わせないと、顧客から DM瑕疵担保責任がどうとか言われる。

社内開発の場合は、PL の方から直接、長時間の叱責を受けなくてはならない。

そういう不幸を防ぐためにも自分ディレクションして、PM の決めた実態を反映していない WBS に合わせて作業するスキル要求される。

基本的に手戻りは個人の過失になってしまうため、手戻りしないように考え抜いて意思決定をする、というのが重要になる。

これこそ、ガクチカと呼ばれる、頑張れますというスキルなので、学生時代に頑張っておけばよかったなぁ。

デザイン

こう見せたい、こう表現したい、という事を伝えるには、必然的デザイン知識必要になる。

創造思考デザインは切っても切り離せない概念で、デザインとは創造なのだから、当たり前である

ソフトウェアアーキテクチャも、ソフトウェア設計も、コーディングデザインと言えるかもしれない。

言語技術 (言語能力)

顧客と 1:1 で話す事が DM でもボイチャでも突発的に発生するので、いつ、いかなる時でも論理武装していなければならない。

まぁ、顧客であったり PL であったりはキレるのが仕事なので、それに対して理路整然と説明する必要がある。

なんとなく、では納得しないし、すぐ損害賠償請求とかそういう話にいくので、答えられないと持ち帰りますお茶を濁して、エマージェンシーになる。

後述する設計能力においても、課題を把握するための言語技術(言語能力)は重要ファクターだと思う。

ソフトウェア設計

C/C++システムプログラムフレームワーク基本的に無いので、自分概念を整理して、どのような変更、拡張があるかを考えて設計する必要がある。

この能力が弱いと、手戻りが発生しやすくなり、瑕疵担保責任を問われることになる。

読んだ本の中だと、ボブおじさんの本が、やっぱりしっくりくるなという個人的な感想がある。

ネットワークプログラム (C)

UDP で送ってくるデータを受けて 24/365 で停止しない WebAPI への繋ぎ込みという簡単作業があって、振られた。

リークしてはいけないという事で malloc禁止で、グローバル変数を利用するという変なルールがあった。

Rust で書けばいいんじゃないかなと思ったけど、Rust 書くのもシンドイし、C/C++ で、しんどくて読みづらいコードを書いた。

あとで保守する人が大変そうだけど、そういうルールを決めたのは PL だしね。

システムプログラム (C++)

なんか、特殊PCI Expressカードからベンダーが用意している SDKデータ引っこ抜いて Web API へつなぎ込む部分をやった。

データの中の特殊信号を取りたかったらしい。

一応、SDK の使い方をパラ見して 1 日で作ったので、別に負担じゃなかったけど、素人やらせるんなとは思った。

Webバックエンド (Express/Fastify + PostgreSQL)

当たり前だが、DB 作って RestAPI を生やすのは現代プログラマにとって自然にできなければならない。

なので、新規開発のサブモジュールバックエンドを任せられた。

だが、ORM の癖を把握したり、発行されるクエリ確認したりするのは、疲れる。 SQL を直書きするのはシンドイ。

結局 SQL を直書きすることにしたけど、あまりいい決断ではなかったと思っている。

それ以外は フレームワーク に乗ってしまっていいので、書き捨てる分には楽だった。

最近だと、TypeScriptPrisma 使うのが、型安全でよさそうだなと思っている。

Nest.js個人的には好み。

Linux操作 (EC2 とか)

デプロイEC2 直でやったり ECS にしたりとしていたので、ベアメタル知識必要になった。

要するに systemd のいじり方とか、死活監視の仕方とか。

個人的には、クラウド嫌いなので、ベアメタルの方が安心できる。

Bind権威DNS管理して、postfix絶対止めてはいけないメールサーバ管理するとかもあったけど、出来て当然ではある事だし。

Webフロントエンド (React/Vue)

会社Webアプリ案件を取ってきたので突っ込まれた。

経験プログラマでも、月単価 100 万以上で顧客請求してるんだから会社はそりゃ儲けるだろうと思った。

会社が一人前の経験N年のプログラマといったら、その通りに振舞う必要がある。顧客責任はないのだから

当たり前だが、WebディレクションWebデザインWebプログラミング, Webマークアップ は、全て作業者であるプログラマ仕事になる。

個人的には、これが分かれている理由が良く分からないけど、分けたい人がいるんだろう。

デザインで、CSSフレームワークを使うと、その色が出るという事で、全部 CSS手書きしていた。

tailwind が出た現在では使っていればよかったなと思う。

結局、全く分からない中、手探りでデザインし、コードを書いて、顧客に 1 日 5 ~ 10リリースするという行為をした。

顧客大手企業だったので、自社のエンジニアならもっと出来る、と叱責されまくったけど、だったら自社でやればいいじゃんと思った。

一応、今でもサービスは生きていて、ユニークユーザ数は上がっているらしい。

そして、焼き付け刃だったので、 WAI-ARIA を知らず、アクセシビリティへの配慮が足りない事が問題になってしまった。

これはなんとか保守対応ねじ込めたのでトラブルにならなかったけど、瑕疵担保責任と綱渡りだなと思った。

CI/CD 構築 (Azure Pipelines)

当たり前だが、リリースサイクルを短くしないと顧客はキレてしまうので、CI/CD を整えないといけない。

今は Github Actions とかあるけど、昔は無くて Bitrise が高いからみたいな理由Azure Pipelines で CI/CD フローを構築した。

もう Multi Stage Pipeline になってるだろうけど、Release Pipeline が GUI からしか設定できないのが辛みだった。

IaC (Terraform)

当然だが、デプロイするためには IaC を整える必要がある。

これを知らずに、コンソールポチポチしていたので、 IaC 出来てない事がバレた時に色々怒られてしまった。

今は CDK とか便利なものが出来てるんだなぁ。

自動テスト

本来テスト自動テストを整えて、質保証をしてバグを減らさなければならない。

だが、テストを書くという手間を払えなかったので、人力テストしかできなかった。

一応、リグレッションテストを人力でやりまくったので、バグ発見曲線が結合テストでの IF 不一致しかない、という結果にはなったけど

自動化できれば費用必要じゃなかったから、怠慢だと、責められてしまった。

同じような未経験の人へ

経験でも誓約書を盾に、振られた事全部を出来なくてはならない慣習があるので、プログラマはそんなに良い職業じゃないよ。

甘い考えで、プログラマになろうと思っているのなら、考え直した方がいいです。

2022-08-15

Webはてブミュー機能作った

勝手に tampermonkey とかに突っ込んで使ってヨロ

スクリプト保守とかするつもりないから、保守とかするつもりのあるパワーの溢れた人が

これ参考とかにしてもっとかっちょよくしたのを greasy fork あたりに公開してくれ

そしたら俺もそれ使う

使い方:

ブラウザの開発環境を開いて、開発コンソールを開く

localStorage.hatebu_ng_word_list に非表示トリガーになる文字列を|区切り登録する。

localStorage.hatebu_ng_word_list = "池田信夫|フェミ|弱者男性|やまもといちろう"

実際のコード

大なり小なり(>)が実体参照で表示されるのはよくわからん。使う人で適宜コードを直してくれ。

// ==UserScript==
// @name         はてブの一覧NG記事非表示
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       masuda
// @match        https://b.hatena.ne.jp/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=hatena.ne.jp
// @grant        none
// ==/UserScript==

(function() {
	'use strict';

	if (!localStorage.hatebu_ng_word_list) {
		return;
	}
	console.log("はてブの一覧NG記事非表示", localStorage.hatebu_ng_word_list);

	/*
	 * 例:
	 * localStorage.hatebu_ng_word_list =
	 * "池田信夫|フェミ|弱者男性|やまもといちろう|togetter.com";
	*/
	let words = localStorage.hatebu_ng_word_list.split('|').map(w => new RegExp(w));

	function entryDelete(els) {
		els.forEach(el => {
			let hit = false;
			words.forEach(w => {
				hit = hit|| w.test(el.textContent);
			});
			if (hit) {
				el.remove();
			}
		});
	}

	// entrylist-header-main li 1つ目のアイテム
	entryDelete(document.querySelectorAll('.entrylist-header-main > li'));
	// 2つ目以降の li アイテム
	entryDelete(document.querySelectorAll('.entrylist-item > li'));
})();

文字正規表現として評価されて、ヒットした記事項目をページから削除する(DOMから要素を削除する)。

際限なくNG登録できるけど、沢山非表示するとつまらない一覧になる

2022-08-01

anond:20220731183342

自動安価をつけて返信するプログラムでもこんなに長く複雑になる(一部抜粋) 

/**************************************

以下のCSV_DIR, FILE_PATHS, SETTINGSを書き換えてね。 <h3>o- *************************************/</h3>

//CSVファイルが置かれてるディレクトリパス投稿前にエラー出たら大体ここの設定ミス。 例:"C:\\Users\\sakuraimasahiro\\Documents\\iMacros\\Macros\\rentou\\";

const CSV_DIR =

'C:\\Users\\USER\\Desktop\\iMacros\\Macros\\rentou\\';

//ファイルパスCSV絶対パスで、拡張子必要。iimは相対パスでよく、拡張子不要

const FILE_PATHS = {

//投稿文が書かれたCSVファイル

textCsv: CSV_DIR + 'textNoAnker.csv',

//レス投稿文が書かれたCSV。通常とレス用で分けないなら同じファイルを使えばいい。

replyTextCsv: CSV_DIR + 'textReply.csv',

};

const SETTINGS = {

//投稿後の基本待ち時間

baseWaitTime: 5,

//baseWaitTime+0~waitTimeRange(ランダム)だけ待つ

waitTimeRange: 5,

//連投しすぎだと忠告された場合に処理を一時停止させる時間(秒)

waitTimeForAvoidingPunishment: 60 * 30,

//メール

mail: 'sage',

//名前設定

nameSettings: {

//名前名無しなら''。

name: '',

//以下、偽装ワッチョイ設定。浪人ワッチョイを非表示にしてるときだけtrueにしてね。

//妙なニックネーム(ワッチョイ、アウアウウーなど)をランダムで決めて付加するかどうか。true=付加する。false=付加しない。

nickname: false,

//妙なニックネームの後に付く8桁の文字列ランダムで決めて付加するかどうか。

korokoro: false,

//IPランダムで決めて付加するかどうか。

ip: false,

//地域ランダムで決めて付加するかどうか。

area: false,

},

postSettings: {

//アンカー無し投稿をするならtrue。しないならfalse。noAnkerPostかreplyPostのどちらかはtrueにすること(両方trueでもOK)。

noAnkerPost: false,

//アンカー付き投稿(返信)をするならtrue。しないならfalse。もしnoAnkerPostとreplyPostの両方がtrue場合投稿は返信が優先され、返信対象が見つからなくなったらアンカー無し投稿をする。

replyPost: true,

//最初に取得するアンカー無し投稿CSVファイルの行番号。もし返信用と同じCSVファイルを使うなら-1と入力

noAnkerPostTextCsvStartRow: 1,

//最初に取得する返信用投稿CSVファイルの行番号。もしアンカー無しと同じCSVファイルを使うなら-1と入力

replyPostTextCsvStartRow: 1,

//テキストCSV/返信用テキストCSVの取得行が最終行に達したら最初の行まで戻るかどうか。true=戻る。false=マクロ終了。

textCsvLoop: true,

//返信する場合、これより小さなレス番には返信しない。返信を投稿すると、この数値は前回の返信先のレス番に更新される。

minAnker: 895,

//返信する場合名前に以下の文字列を含む投稿アンカーをつけて返信する(ワッチョイやIPなど名前フィールドにあるものならなんでも可)。配列複数指定可能指定無しなら空配列([])。filterNamesとfilterNamesNotIncluded共に無指定ならレス番1から順に返信していく(minAnkerが設定されてればそこから順に)。以下のfilter系は全て併用可能

filterNames: [],

//↑とは逆に、名前に以下の文字列を含まない投稿アンカーをつけて返信する。↑と併用も可能

filterNamesNotIncluded: [],

//返信する場合、本文に以下の文字列を含む投稿アンカーをつけて返信する。

filterText: ['自演かな', '自演わらわら', 'スクリプト使うの', '安価ガバ', '>>660', '自演擁護', '最後' ,'あいうえお', 'かきくけこ', 'さしすせそ', 'なにぬねの', 'はひふへほ', 'まみむめも', 'やいゆえよ', 'やゆよ', 'らりるれろ', 'わいうえを', 'わをん', 'わいうえをん'],

},

//自分IPアドレス確認VPNとかでIPを変更してマクロを動かしてるとき、突然VPN作動しなくなってIPが元に戻ったときマクロを止めるためのもの

ipSettings: {

//自分現在IPアドレス確認をする。

checkIp: true,

//以下の文字列自分現在IPアドレスに含まれている場合マクロを一時停止する。基本的自分の本当のIPアドレス入力

avoidTheIp: '133.206.99.224',

},

//浪人設定。最後動作確認したのは5年くらい前で、今も同じように動作するかは、浪人を持ってないか確認できずわからない。

roninSettings: {

//浪人ログインしてるかどうかをチェックするかどうか。trueらするfalseならしない。trueにしていてもし浪人ログインしていないことを確認したらログインしにいく。

checkLogin: false,

//浪人ログインメールアドレス

mailAdress: 'abc@def.com',

//浪人ログインパスワード

password: '1234',

},

//false: run()実行させず(デバッグ用)

run: true,

//true: 投稿処理だけしない デバッグ

skipPost: false,

};

/**************************************

設定箇所終わり。

書き込めない時の早見表 - 5ちゃんねるwiki

https://info.5ch.net/index.php/%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%81%E3%81%AA%E3%81%84%E6%99%82%E3%81%AE%E6%97%A9%E8%A6%8B%E8%A1%A8 <h3>o- *************************************/</h3>

/**************************************

メモ

クラスフィールド宣言できない。

・NULL演算子(??)は使えない。論理積(&&)は使える。

オブジェクトの分割代入はできない。

・importはできない。 <h3>o- *************************************/</h3>

/**************************************

関数 <h3>o- *************************************/</h3>

/**

* ここから始まる。

*/

function run() {

//設定ミスがないか調べる。

checkSettings();

var _TextCsvCursors = new TextCsvCursors(

new TextCsvCursor(

SETTINGS.postSettings.noAnkerPostTextCsvStartRow > 0

? SETTINGS.postSettings.noAnkerPostTextCsvStartRow - 1

: SETTINGS.postSettings.noAnkerPostTextCsvStartRow,

FILE_PATHS.textCsv,

SETTINGS.postSettings.textCsvLoop,

),

new TextCsvCursor(

SETTINGS.postSettings.replyPostTextCsvStartRow > 0

? SETTINGS.postSettings.replyPostTextCsvStartRow - 1

: SETTINGS.postSettings.replyPostTextCsvStartRow,

FILE_PATHS.replyTextCsv,

SETTINGS.postSettings.textCsvLoop,

),

);

var _LoopStatuses = new LoopStatuses(0, SETTINGS.postSettings.minAnker);

const _MyPosterName = new MyPosterName({

name: SETTINGS.nameSettings.name,

});

//スレURL指定

const _ThreadUrl = openPromptThreadUrl();

//ループ

while (true) {

//IP確認する設定なら、それをする。

SETTINGS.ipSettings.checkIp && checkCurrentIpNotTheIp();

//スレを開く

openUrl(_ThreadUrl.fullUrlHttps());

//浪人ログインする設定なら、浪人ログインしているかどうかを確認し、していなければログインしにいく。

if (SETTINGS.roninSettings.checkLogin) {

if (!checkRoninLogin()) {

loginRonin();

continue;

}

}

//投稿に使うテキスト取得。

const p = (function () {

if (SETTINGS.postSettings.replyPost) {

//返信あり設定の場合。返信対象が無いか調べる。

const targetAnkerNumber = createPostDOMList()

.filterPostnumberHigher(_LoopStatuses.currentMinAnker())

.filterByPostername(SETTINGS.postSettings.filterNames)

.filterByPosternameNotIncluded(

SETTINGS.postSettings.filterNamesNotIncluded,

)

.filterByText(SETTINGS.postSettings.filterText)

.lowestPostNumber();

if (targetAnkerNumber !== null) {

//返信対象があったのでアンカー付き投稿文を作る。

const r = _TextCsvCursors.takeNextRowTextAsReply(targetAnkerNumber);

messageDisplay(`返信対象有り。アンカー先: ${targetAnkerNumber}`);

return {

...r,

updatedLoopStatuses:

_LoopStatuses.updateMinAnker(targetAnkerNumber),

};

}

}

if (SETTINGS.postSettings.noAnkerPost) {

//返信対象無し、或いは返信しない設定の場合アンカー無し投稿文を作る。

const r = _TextCsvCursors.takeNextRowTextAsNoAnker();

messageDisplay('返信対象無し。アンカー無し投稿。');

return {

...r,

updatedLoopStatuses: _LoopStatuses,

};

}

return null;

})();

if (p) {

//投稿

postThenCheckError(

_ThreadUrl.serverName(),

_MyPosterName.randomize({

nickname: SETTINGS.nameSettings.nickname,

korokoro: SETTINGS.nameSettings.korokoro,

ip: SETTINGS.nameSettings.ip,

area: SETTINGS.nameSettings.area,

}),

SETTINGS.mail,

p.text,

);

//_TextCsvCursorsと_LoopStatusesを更新

_TextCsvCursors = p.updatedTextCsvCursors;

_LoopStatuses = p.updatedLoopStatuses.incrementPostCount();

messageDisplay([

`投稿回数: ${_LoopStatuses.currentPostCount()}`,

`minAnker: ${_LoopStatuses.currentMinAnker()}`,

`今回アンカー無し投稿取得行: ${_TextCsvCursors.currentRows().noAnker}`,

`今回アンカー有り投稿取得行: ${_TextCsvCursors.currentRows().reply}`,

]);

} else {

messageDisplay([

`返信対象が現われるのを待機中...。`,

`投稿回数: ${_LoopStatuses.currentPostCount()}`,

`minAnker: ${_LoopStatuses.currentMinAnker()}`,

`今回アンカー無し投稿取得行: ${_TextCsvCursors.currentRows().noAnker}`,

`今回アンカー有り投稿取得行: ${_TextCsvCursors.currentRows().reply}`,

]);

}

//短時間で連投しまくると規制されるので一定時間待機。

wait(SETTINGS.baseWaitTime + randomRange(0, SETTINGS.waitTimeRange));

}

}

/**

* 投稿処理と投稿結果を見てリトライしたりマクロ終了したり。

* @param {string} serverName サーバー

* @param {MyPosterName} _MyPosterName

* @param {string} postMail メール

* @param {MyText} _MyText

* @param {number} retryTimes

* @returns {void}}

*/

function postThenCheckError(

serverName,

_MyPosterName,

postMail,

_MyText,

retryTimes = 0,

) {

const r =

retryTimes === 0

? new ValuesOfPost(serverName, _MyPosterName, postMail, _MyText).post(

postTo5chTread,

postConfirm,

)

: new ValuesOfPost(

serverName,

_MyPosterName,

postMail,

_MyText,

).postSubstring(retryTimes, postTo5chTread, postConfirm);

if (r) {

back();

return;

}

//エラーページに飛ばされた。エラー情報取得。

wait(7);

const error = createPostErrorMessage().analyze();

messageDisplay(error.message);

if (error.order === 'KILL') {

kill();

} else if (error.order === 'SKIP') {

return;

} else if (error.order === 'TRUNCATE') {

back();

return postThenCheckError(

serverName,

_MyPosterName,

postMail,

_MyText,

retryTimes + 1,

);

} else if (error.order === 'WAIT') {

wait(SETTINGS.waitTimeForAvoidingPunishment);

return postThenCheckError(

serverName,

_MyPosterName,

postMail,

_MyText,

retryTimes,

);

} else if (error.order === 'LOGIN') {

//動作未確認

return postThenCheckError(

serverName,

_MyPosterName,

postMail,

_MyText,

retryTimes,

);

}

return;

}

/**

* 現在IPアドレスに、SETTINGS.ipSettings.avoidTheIpの値が含まれていないことを確認する。含まれていたらマクロを一時停止。

* @returns

*/

function checkCurrentIpNotTheIp() {

//IP確認ページへ飛ぶ

openUrl('https://www.cman.jp/network/support/go_access.cgi');

const _IpAdress = createIpAdressFromCMan();

if (_IpAdress.includes(SETTINGS.ipSettings.avoidTheIp)) {

pause('現在IP指定した値が含まれていることを確認。');

//ポーズ解除したならもう一度確認しに。

checkCurrentIpNotTheIp();

}

return;

}

/**

* 設定に致命的な問題が無いか検査

* @returns

*/

function checkSettings() {

if (

SETTINGS.postSettings.noAnkerPost === false &&

SETTINGS.postSettings.replyPost === false

) {

return kill('設定エラー。noAnkerPostとreplyPost両方ともfalseになってる。');

}

if (

SETTINGS.postSettings.noAnkerPostTextCsvStartRow < 0 &&

SETTINGS.postSettings.replyPostTextCsvStartRow < 0

) {

return kill(

'設定エラー。noAnkerPostTextCsvStartRowとreplyPostTextCsvStartRow両方とも-1になってる。',

);

}

if (

SETTINGS.postSettings.noAnkerPostTextCsvStartRow === 0 ||

SETTINGS.postSettings.replyPostTextCsvStartRow === 0

) {

return kill(

'設定エラー。noAnkerPostTextCsvStartRow/replyPostTextCsvStartRowの初期値は-1或いは1以上で。',

);

}

}

/**

* 入力フォームを表示して入力されたスレURLを受け取る。

* @returns {ThreadUrl}

*/

function openPromptThreadUrl() {

const url = prompt('スレURL入力');

return new ThreadUrl(url);

}

/**

* 開いてるスレレス全て読み取ってPostListインスタンスを作って返す。

* 重すぎるので使うのやめ。どうやらインスタンスの大量生成が原因な模様。

* createPostDOMListを使う。

* @returns {PostList}

*/

function createPostList() {

const posts = window.document.getElementsByClassName('post');

return new PostList(Array.from(posts).map((e) => new Post(e)));

}

/**

* 開いてるスレレス全て取得してPostDOMListに格納して返す。

* @returns

*/

function createPostDOMList() {

const posts = window.document.getElementsByClassName('post');

var arrPostDOMList = [];

for (let index = 0; index < posts.length; index++) {

//HTMLCollectionからElementを1つずつ抽出して配列に。

arrPostDOMList.push(posts.item(index));

}

return new PostDOMList(arrPostDOMList);

}

/**

* 開いてる投稿結果画面に表示されてるエラーを読み取ってPostErrorMessageインスタンスを作って返す。

* @returns {PostErrorMessage}

*/

function createPostErrorMessage() {

return new PostErrorMessage(

window.document

.g Permalink | 記事への反応(0) | 15:40

2022-07-18

UNIX 哲学」についていくつか

名著「UNIXという考え方 - UNIX哲学」は本当に名著なのか? 〜 著者のガンカーズは何者なのかとことん調べてみた - Qiita

この記事はよく調べてあるなぁと思う反面,事実関係の間違いも多く当時の空気感など欠けていると思う部分がいくつかある。事実関係に関しては追い切れないので参考文献を挙げるにとどめておくが,空気感のほうはいくつか書いておく。なお当該記事の「当時と今では状況が全然違うんだから安易に『UNIX 哲学』とかいうな」という主旨には大賛成である

参考文献

初期の UNIX歴史について興味がある向きには次の書籍お薦めする。

Peter H. Salus『A Quarter Century of UNIX』(1994, Addison-Wesley Publishing)

和訳の『UNIXの1/4世紀』(Peter H. Salus, QUIPU LLC 訳, 2000, アスキー) は絶版のうえ訳も微妙なので薦めづらいが,原書The Unix Heritage Society (tuhs) で PDF が無償公開されているので,英語が苦にならないのなら読んでみるといい。

また同じく tuhs で無償公開されている Don Libes and Sandy Ressler『Life with UNIX』(1989, Prentice Hall)を読めば80年代終りの UNIX の状況(XENIX についてもしっかり言及されている)や利用者目線での雰囲気もある程度判るだろう。

哲学

記事で一番気になるのが「哲学」という語の捉え方。この言葉の強さに引きずられているように読める。でもこれ,当時は設計基本的な考え方くらいの意味でわりとよく使われていた言葉なんだよね。たとえば米 BYTE 誌のアーカイブを “philosophy” で全文検索するとこんな感じ。

https://archive.org/details/byte-magazine?query=philosophy&sin=TXT&sort=date

ほぼ毎号のように出現していたのが判るだろう。

もっとも猫も杓子も「哲学」を振りかざしていたわけではないし,UNIX開発者たちが「哲学」の語を好んで使っていたのも間違いないように思う。傍証の一つが AT&T定期刊行物『The Bell System Technical Journal』の1978年7, 8月号だ。元記事言及されているマキルロイの Forword の初出がこれで,ネットのアーカイブから PDF が入手できる。

この号は二部構成になっていて第一部が Atlanta Fiber System に関する論文12本(全172ページ),第二部が UNIX に関する(Preface や Foreword を含む)論文22本(全416ページ)となっている。さて前述の PDFOCR されているので “philosophy” で全文検索してみると8箇所見つかる。これが見事に全部 UNIX論文なのだ。もちろん論文性質もページ数も違うからこれだけで確定的なことはいえないが「日常的に使っていたんだろうなぁ」という推測は成り立つだろう。じつはマキルロイ哲学とされている部分は “Style” であり “philosophy” の語は一切使われていないというのもちょっと面白いUNIX開発者たちがなぜ「哲学」という語を好んだか正確なところは判らないが,それまでにない新しい考え方に基づいた OS を開発しているという意識があれば,そういう言葉を選ぶのが自然時代だったことは間違いない。

UNIX認知され拡がっていく過程で「哲学」も知られるようになっていった。自分が好むものの良さを他人にも識ってもらいたい,あわよくば他人もそれを好むようになって欲しいという布教活動は今も昔を変らないわけで「哲学」はその便利なツールとなったわけだ。元記事ではガンカースの著作を「外部の人間が後から打ち立てた哲学」と表現しているが,そんなたいしたものではない。マキルロイ論文に影響を受けた布教のためのああい説教は到るところにあった。たとえば前掲の『Life with UNIX』にもしっかり Philosophy の項がある。また日本最初期の UNIX 解説本のひとつである村井純井上尚司・砂原秀樹『プロフェッショナル UNIX』(1986,アスキー)には冒頭次のような一節がある。

オペレーティングシステムは,コンピュータを使うものにとっての環境形成する基盤であるから,そのうえで生活する者の個性尊重し,より良い環境へと作り上げて行く課程を支援するような素材を提供するソフトウェアでなければならない。この主張こそが,UNIXオペレーティングシステムとしての個性ではないだろうか。

 

    プロフェッショナル UNIX村井純井上尚司・砂原秀樹,1986,アスキー)p 3.

「より良い環境へと作り上げて行く課程を支援するような素材を提供するソフトウェア」とはテキストを入出力フォーマットとする単機能コマンド群のことで,これらをパイプでつなげたりシェルスクリプトでまとめたりすることで「そのうえで生活する者の個性尊重し」た「より良い環境へと作り上げて行く」ということだ。こういった説教はありふれたものであった。たんにそれを「哲学」の語を用いて書籍にまとめたのが,たまたまガンカースだったというだけのことである

そしてじつは UNIX場合布教活動とはべつに「哲学」を広めなければならない切実な理由があった。これを説明するのは非常に面倒くさい。当時と今ではあまりにも環境が違うのだが,その違いが判らないと切実さが伝わらないからだ。マア頑張ってみよう。

UNIX の利用環境

UNIXPDP というミニコンピュータミニコン)上に開発された。このミニコンを使うためには専用の部屋に行く必要がある。その部屋は,もちろん場所によって違うわけだが,マアおおよそ学校教室くらいの大きさだ。長机が何列か並んでおり,そのうえにはブラウン管ディスプレイキーボードを備えた機器が等間隔に置かれている。壁際にはプリンタが何台かあるだろう。通っていた学校コンピュータ室などと呼ばれる部屋があったならそれを思い浮かべればだいたい合ってる。ただし置かれている機器コンピュータではなくコンピュータ接続するための端末装置ターミナル)だ。端末装置キーボードで打った文字コンピュータに送られコンピュータが表示した文字がそのディスプレイに表示される。現在 UnixOSCLI を使うときターミナルとか xterm という名のアプリケーションを用いるがこれらは端末装置エミュレータで,もともとは実体のある装置だったわけだ。

さてコンピュータ室にたいていは隣接するかたちでマシンルームなどと呼ばれる六畳くらいの部屋がある。窓ガラスで仕切られたこの部屋には箪笥洗濯機くらいの大きさの装置が何台か置かれている。これがコンピュータ本体だ。もっとコンピュータが何台もあるわけではない。この箪笥CPU でそっちの洗濯機ハードディスク,あの机に置かれているタイプライタ管理コンソールといった具合に何台かある装置全部で一台のコンピュータになる。どこが〝ミニ〟だと突っ込みたくなるかもしれないが「六畳で収まるなんて,なんてミニ!」という時代お話だ。

端末装置それぞれからUSB のご先祖様の)RS-232 という規格のアオダイショウみたいなケーブルが伸び,マシンルームに置かれたターミナルマルチプレクサと呼ばれるスーツケースに台数分のアオダイショウが刺さってコンピュータとの通信を行う。コンピュータと多数の端末装置を含めたこれら全体をサイトと呼び,root 権限を持って管理業務を行う人をシステム管理者あるいはスーパーユーザと呼んだ。

結構上手に説明できたと思うのだが雰囲気は伝わっただろうか。ここで重要なのは一台のコンピュータを数十人が一斉に使っていたという事実だ。洗濯機とかアオダイショウとかは,マアどうでもいい。

自由不安定OS

当時の UNIX評価一言で表すと〝自由不安定OS〟となる。メーカお仕着せではなく自分好みの「より良い環境」を作りあげる自由さらに他のメインフレームミニコンOS に比べると一般ユーザ権限でできることが圧倒的に多かった。そしてその代償が不安定さ。今では考えられないが UNIX のその不安定さゆえにプロOS ではないと考える向きは多かったし「でも UNIX ってすぐ落ちるじゃん」というのは UNIX アンチ定番ディスりだった。UNIX の落とし方,みたいな情報がなんとなく廻ってきたものだ。

こういった雰囲気を鮮やかに伝えてくれるのが,高野豊『root から / へのメッセージ』(1991,アスキー)だ。当時アスキーが発行していた雑誌UNIX MAGAZINE』に連載されていた氏のエッセイ1986年11月から1988年10月掲載分までをまとめた書籍である。著者の高野氏は勤務先の松下電器1980年ごろから UNIX サイトスーパーユーザを務めており,日本では最古参の一人である。この本の中で高野氏は繰返し UNIX自由さと不安定さに言及している。すこし長くなるが,その中の一つを引用しよう。

CPU は,システムにとって重要な共有資源であるが,この CPU実質的に停めてしまうことが UNIXはいとも簡単にできる。たとえば,cc コマンド10個くらい同時に走らせてみたらよい。VAX-11/780 といえども,同時に実行できるコンパイルはせいぜい3つか4つである。それ以上実行することも当然可能ではあるが,他に与える影響が無視できなくなる。つまり,てきめんに viカーソルが動かなくなる。あるいは,すこし大きめなディレクトリ上での ls コマンドの出力が表示されるまでに煙草を1本吸い終えてしまったり,タイムアウトログインが撥ねつけられたりといったバカげた現象が起きだすのである。こういった状態になると,UNIX破壊されたに等しい。真夜中,独りで VAX を占有して使っているのなら何をやろうとかまわない。しかし,20人30人と多数の人間が使っているとき勝手をやられると非常に困るのである当人仕事が遅れるのは自業自得だとしても,そのとばっちりで他のエディタまで止まってしまうと,もはやどの仕事も進行しなくなる。

ディスクについても同様なことがいえる。UNIX では,ファイルシステムを使いはたすまで大きなファイル自由に作ることができる。したがって,自分プロセスがいったいどのくらいの容量のファイルを作り出すのか見当もつけられないようなアマチュアが使うと悲惨なことになる。ディスクを使いはたすと,コンソールタイプライターにエラーメッセージが出力されるが,夜中にそれが発生して,コンソールタイプライターが一晩中エラーメッセージを打ち続け,朝マシンルームに行ってみると紙を一箱打ち尽くしてしまい,ピーピーと悲しげな声を上げて人を呼んでいた光景を私は何度も見てきた。こうなると,それをしでかした本人のプロセスは当然のこととしても,同じディスクで走っている他のプロセスも先に進めなくなってしまう。すこしでも負荷を夜間にまわそうとする善意は逆転してしまい,わずかでも仕事を先に進めようとする意図完璧に打ち砕かれてしまうのである

 

    root から / へのメッセージ高野豊,1991,アスキー)pp16-17.

そして,こうした不安定さが「哲学」を必要としたのだ。自分が利用しているサイトに「cc コマンド10個くらい同時に走らせ」たり「自分プロセスがいったいどのくらいの容量のファイルを作り出すのか見当もつけられないようなアマチュア」がいるとその累は自分にも及んでしまう。だからサイト利用者全員に UNIX設計基本的な考え方を理解してもらうことが,自分のために必要だった。UNIX伝道がより苛烈だった理由ひとつがここにあるのだ。

ミニコン UNIX終焉

ミニコン上で誕生した UNIX は 4.3BSD(1986)で最高潮を迎える。注意したいのはミニコン時代UNIX は Research UNIXCSRG BSD みたいな区別をせずにまとめて UNIX として扱われていたことだ。実際『プロフェッショナル UNIX』も『root から〜』も UNIX記述されてはいるが実際には BSD を扱っている。べつに当時の人が無知だったわけではない。なにしろ BSD を利用するためにはまず AT&T から UNIXライセンスを購入し,そのうえでカリフォルニア大学バークレー校(UCB)から BSD を入手しなければならなかったからその関係は当然広く知られていた。ベル研発明された UNIX を外部の人たちも含めみんなで改良し,それら全体が UNIX であるという考え方が自然だっただけである。『Life with UNIX』のような英語の文献によく登場する “Berkeley UNIX” という言い回しが当時の気分をよく表している。UNIX vs BSD みたいな捉え方は法廷闘争を経た90年代以降の感覚だ。

もっともそういう70年代風味の牧歌的風景ミニコン世界限定の話であった。BSDのものミニコンのものしかなかったが,そのコードを受け継いだ BSDUnixAT&T推し進める System V などがワークステーション市場舞台80年代中盤から激しく覇権を争うようになる。いわゆる Unix 戦争で,PCUnix であるマイクロソフトXENIX も当然参戦した。ミニコン世界牧歌的だったのは,ぶっちゃけていえば先のない技術だったからだ。ただ Unix 戦争あくまでも標準という聖杯を争う戦いであり,AT&TBSDUnixSun Microsystems が共同で System V Release 4.0 (SVR4) を作りあげたように後の法廷闘争とは趣が違う。

こうしたミニコン UNIX からワークステーション Unix への転変は Unixのもの文化にも変化をもたらした。まず激しい競争Unix の高機能化を加速した。商品として判りやす惹句が「あれもできます,これもできますなのは誰もが知っている。もちろん安定性を増すために quota のような利用者自由制限する機能も含まれていた。またワークステーション Unix現在UnixOS と同様同時に一人が使うものであり前述の布教必要性は大幅に減じた。達人たちのみの楽園から万人に開かれた道具に変ったのだ。こういった変化を体感したければ『root から〜』と水越賢治『スーパーユーザの日々』(1993,オーム社)を読み比べてみるといい。『スーパーユーザの日々』はワークステーション Unixシステム管理入門書だ。この本ではたんに知識を羅列するかわりに架空ソフトウェアハウス(開発会社)を舞台新卒社員が先輩社員からシステム管理を学ぶという体裁をとっており,そのおかげで架空の話とはいえ90年代前半の雰囲気が堪能できる。出版年でいえば『root から〜』と二年しか違わない『スーパーユーザの日々』の落差は “dog year” と称された当時の激烈な変化まで体感できるだろう。

UNIX 哲学背骨

当時はよくいわれたのに今やほとんど聞かれなくなったものがある。マキルロイ論文結論部分に書かれたそれは,1973年出版されたイギリス経済学者エルンストシューマッハー著作題名で,中学生英語力があれば十分に理解できる平明な一文だ。

Small is beautiful.

マキルロイは『人月神話』を引いて一定留保をつけてはいものの,これが UNIX 哲学背骨であることに違いはない。機能をありったけ詰め込もうとして失敗した “kitchen-in-a-sink” な MULTI•csアンチテーゼである UNI•x にとって,これ以上のスローガンがあるだろうか?

ひるがえって現在UnixOS をみれば,ブクブクと肥え太ったシステムコール,全容を俯瞰するだけでも一苦労するライブラリインターフェイス,一生使うことのないオプションスイッチまみれのコマンド群。UNIX仮想敵とした OSのものだ。そのことについてとくになにも思わない。ハードウェアは長足の進歩を遂げ,コンピュータの応用範囲は途方もなく拡がった。UNIX が変らなければたんに打ち棄てられ,歴史書を飾る一項目になっただけだ。ただ現在UNIX 哲学」を語るならそうした背景は理解していなければならないし,どれだけ繊細な注意を払ったところで〝つまみ食い〟になってしまうことは自覚すべきだ。

ログイン ユーザー登録
ようこそ ゲスト さん