(専門教育として)プログラミングよりもコンピュータ科学をやれ、というなら、まずプログラミングをやるべき理由

典拠

ACMが示している、コンピュータ科学の専門教育のカリキュラムガイドライン Curriculum Guidelines for Undergraduate Programs in Computer Science の2013年版(CS2013, https://www.acm.org/education/curricula-recommendations#h-computer-science )で例示されている時間の割り振りと内容を見るとそうなっている。

詳しく

CS2013 では、次のように基本的な内容を Tier-1、発展的な内容を Tier-2 として時間の割り振りの例を示しているが(p. 37)、

まず Software Development Fundamentals(SDF)に、次いで Discrete Structures(DS)に、多大な時間を割り振っていることがわかる。そして、それぞれの説明には次のようにある。

SDF

(p. 167) Fluency in the process of software development is a prerequisite to the study of most of computer science. In order to use computers to solve problems effectively, students must be competent at reading and writing programs in multiple programming languages. Beyond programming skills, however, they must be able to design and analyze algorithms, select appropriate paradigms, and utilize modern development and testing tools. ...

コンピュータ科学で何をやるにもほぼプログラミングは大前提であり、複数のプログラミング言語を読み、書けなければならない、といったようにある通り、プログラミング抜きにはコンピュータ科学はありえない、という考えかたが背後にあることがよくわかると思う。またそれに続けて、アルゴリズムの設計や分析、といったように書かれているように、プログラミングとは単にコードを書くことではなく、アルゴリズムなどについても当然含まれる、といった考えかたであることもわかる。

DS

(p. 76) Discrete structures are foundational material for computer science. By foundational we mean that relatively few computer scientists will be working primarily on discrete structures, but that many other areas of computer science require the ability to work with concepts from discrete structures. Discrete structures include important material from such areas as set theory, logic, graph theory, and probability theory.

The material in discrete structures is pervasive in the areas of data structures and algorithms but appears elsewhere in computer science as well. For example, an ability to create and understand a proof—either a formal symbolic proof or a less formal but still mathematically rigorous argument—is important in virtually every area of computer science, including (to name just a few) formal specification, verification, databases, and cryptography. Graph theory concepts are used in networks, operating systems, and compilers. Set theory concepts are used in software engineering and in databases. Probability theory is used in intelligent systems, networking, and a number of computing applications.

「離散構造」などと訳されることもあり、また数学の分野としては離散数学などと呼ばれることもあるが、そのあたりの分野である。大学などでは、これらの授業で習った内容について、すぐに(忘れないうちに)応用したプログラムを提出させている所などもあると思うが、プログラミングと密接している最重要分野といってよい。

ssh-agent に、サブコマンドを指示する引数を付けた場合の挙動について

ssh-agent には次のようにして、サブコマンドを指示する引数を付ける起動法があります。

ssh-agent cmd

たとえば ssh-agent bash のようにして、エージェント配下の環境を引き継ぐために使うものですが、man ssh-agent を読むと、その際の挙動について、次のようにあります。

If a command line is given, this is executed as a subprocess of the
agent.  When the command dies, so does the agent.

そのまま素直に読めば ssh-agent が親プロセスとなり、子プロセスの側で引数として名前を与えたものを exec する、という意味に読めます*1……が、実際にやってみると、逆であることがわかります。

以下は私の手元の FreeBSD で、試してみた一例ですが(ps コマンドの結果から見つけやすくするため、起動するコマンドは csh にしています)、

$ exec ssh-agent csh
% ps axd
  PID TT  STAT       TIME COMMAND
    0  -  DLs     4:16.86 [kernel]
    1  -  ILs     0:00.08 - /sbin/init --
  121  -  Is      0:00.01 |-- adjkerntz -i
(略)
73430 v0  R       0:00.63 |-- mlterm
73431 15  Ss      0:00.08 | `-- csh
73445  -  Ss      0:00.00 |   |-- ssh-agent csh
73910 15  R+      0:00.01 |   |-- ps axd
73911 15  S+      0:00.01 |   `-- less

というように、親プロセスのほうが引数として与えたほうを exec していて、ssh-agent は子プロセスの側に、つまり、それ以降にこのシェルから実行されるプロセスから見ると、きょうだいプロセスの位置にあります。

実装の変更にドキュメントが追随していないだけか、とも思ったのですが、どうも最初からのようです。

もうちょっと調査したら、OpenSSH プロジェクトに報告するつもりで……いたのですが、だいぶ放置してしまっています。どこにもアウトプットしてなかったので、ここに置いておきます。

*1:記憶にある限り、既存の解説書などの図でも、全てそのようになっています。

技術書典7にサークル参加します

配置は「え19C」です。新刊は、技術系よろず(?)同人誌「ElectroComplex」3号(¥300)です。内容は今までと同じく記事1本で、サークル詳細から引用しますが「ネットにはいまいちスッキリとした解説の見つからない、バックアップにおけるハノイの塔手法(Tower of Hanoi backup rotation scheme)について、筆者による独自研究の粋を尽くした解説をお送りします」という記事となります。

既刊まとめ買いのディスカウント価格は検討中です。また、在庫状況は全く読めていません……

技術書典6にサークル参加します

配置は「い16」です。新刊は、技術系よろず(?)同人誌「ElectroComplex」2号(¥300)です。内容は創刊号に引き続き記事1本で、電子工作の製作例紹介となります。特殊なMOSFETを使用した無電源AMラジオについて解説します。

既刊(創刊号)については、¥300 ==> ¥200 で頒布します。在庫は(前回の頒布数から予測すると)十分にある予定です。