nekoTheShadow’s diary

技術ブログとして始めたはずが、読書&愚痴ブログになりました(´・ω・`)

Scala挫折しそう

ここ数年、毎年新しい言語をひとつは学ぶという習慣を続けています。2018年はC#コンパイラの出来がよいのか、雑に書いてもそこそこの性能が出るし、なによりLINQが書いていて気持ちいい。またLINQの存在を知ったあとで、JavaのStream APIをあらためて勉強しなおしてみると、こちらはこちらでなかなかよくできていることに気づくなど、たいへん勉強になりました。これからもC#で遊んでいこうと思います。

さて2018年も年の瀬。来年学ぶべき言語を考え始める時期でもあります。そこでここ1か月は予行演習として、前々から関心があったScalaに触れていたのですが、そうそうに挫折しそう、というか多分挫折すると思います(´・ω・`)

①挫折の最大原因がIntelliJ IDEA。ネットの記事や入門書によると、Scalaを書くにはIntelliJ IDEAが最適、というよりそれ以外の選択肢はほぼないらしい。ならばと使ってみたところ、自分のPCとの相性が悪いのか、自分の使い方が悪いのか、妙にもっさりしていて、コード補完がうまくきかなかったり、コンパイルエラーの検出ができなかったりと、ストレスがたまることが多い。ショートカットや見た目のフィーリングが妙に気に食わない、無償版とはいえ商用製品をただで使うのは気が引けるなども、IntelliJ IDEAから遠ざかる要因になっています。なおPluginを導入すればEclipseでもよいそうですが、自分の環境ではろくに動きませんでした(そのPluginがもともとあまり安定していないらしい)。

②あとは些末なところで、Scalaの文法が自分の好みに合わないというのも挫折の理由にあったりなかったり。

  • Listの添字アクセスが[]ではなく()
    • VBAと同じですが、VBAにトラウマがあるので、それを思い出してつらい(´;ω;`)ウゥゥ
    • []は別の用途で利用されるのだが、これはこれは違和感がぬぐえない。
  • やたらに記号を多用するスタイルで、書くのも読むのも慣れないと厳しそう。少なくともググラビリティは低い。
    • 無名関数ではプレースホルダが使えるのだが、その記号が_。ほかの言語だと変数名_は"無視"を意味することが多いので、違和感がある。
    • :+とか+++とか、ほかのプログラミング言語だとあまり見慣れない記号が妙に出現する。
    • 同じ記号に違う意味がありすぎて、覚えきれる自信がない。
  • def methodName() = {}=はいらなくない? =は束縛の意味なのかなあ?

ここに挙げたのは一部で、ほかにもいくつあるのですが、ただこうした違和感は学習期間が短いゆえの現象、要するに「慣れてないだけ」。とはいえ、ひとたび違和感を持ってしまうとそれをぬぐうのはなかなか難しいのも現実ではあります。

③まあこれは覚悟していたことではあるのですが、Scalaは学習コストが高く、はやくもわたしのIQではついていけなさそうな雰囲気を醸し出しています。1か月触れた程度ではあるのですが、それでもimplicitや型クラスなどなど、抽象度が高い概念がぽんぽん出現し、このペースで難しい概念が現れるとなると、ついていけるのかがとても心配になります。


Scalaからは戦略的撤退を決めるとして、ではどの言語を勉強すべきか。そもそもScalaを選んだ要因のひとつがJVM系言語に興味があったからでした。Scala以外のJVM系言語となると、Groovy/Kotolin/Clojureあたりかしらん。Groovyはグルー言語としての用途はよく聞くのですが、アプリケーション構築にどれだけ利用されているのかわからないので、パス。KotolinはAndroidに関心が薄いのと、前述したようにIntelliJ IDEAがだめ。となると消去法的にClojureが最有力候補になりますね……。ただLISP系ということぐらいしかわかっていないので、環境構築とか入門書とか、周辺の情報を集めることが先ですね。過去にSchemeに取り組んだことがあって、LISP系の文法には抵抗ないので、そこは無問題。ただ万が一はまってしまうと、通常世界にかえってこれなさそうな感じがする(LISPプログラマに対する偏見)。

JVMにこだわらずともPHPPerlでもいいですし、昨今の動向を考えるとフロントエンドに取り組むのもありのような気がします。個人的にはとりわけCSSに苦手意識があって、なんとなくフロントエンドからは逃げ回ってきたのですが、最近はそうもいっていられない雰囲気があり、迷うところではあります。また言語ではなく、何かしらのフレームワークを学ぶ選択肢も考えています。ちなみに学ぶとすればRuby on RailsかSpring Bootですね。ただフレームワークを学ぶとなると、何かしらのアプリケーションを作成することになるのですが、どう頭をひねってみても、特別作りたいものがない。よさげなハンズオンを探してみようかしら。

なかなか迷いは尽きないですね(´・ω・`)

Joshua Bloch『Effective Java 第3版』(丸善出版)を読んだ。

Effective Java 第3版

Effective Java 第3版

Javaプログラマの必携書として名高い『Effective Java』の新版である第3版の日本語訳が発売されたということで、さっそく買って読みました。第2版は2008年出版で、Java6を対象としていましたが、それ以降もJavaにはさまざまな機能が追加されてきました。『Effective Java』はいわば「Javaプログラミングのベストプラクティス集」といった位置づけですが、Java6以降に追加された機能の中には、その"ベストプラクティス"のありようをかえてしまったものもあります。第3版は原則として第2版の内容を踏襲しつつ、そうしたJavaの進化に伴って一部修正&大幅追加するというスタンスのもと執筆された--と個人的には理解しました。

Javaプログラマであれば読まないという選択肢はない、というと過言ですが、少なくとも読んで損はない内容であると思います。ジュニアプログラマにとっては新しい知識の源泉であり、シニアプログラマにとっては、ふだん無意識的・経験的に実践しているテクニックを整理して言語化するきっかけになるはずです。前述したとおり、第2版とは内容的な重複がかなりあるため、第2版とは違う斬新な内容を期待していると、期待外れということになります。そこだけは注意しましょう。

実は第2版は読んだことがあり、そのときの読書記録をこのブログの記事として残しているのですが、第2版に比べるとフォントのサイズが大きくなって、読みやすくなっているような気がします(勘違いだったらごめんなさい)。また紙の質も第2版よりやや良くなっている、具体的にはより明るい白で、かつ1枚あたりの重さが軽くなっているように思います(これも勘違いだったらすみません)。内容はともかく、物理的な読みやすさは第3版のほうがよかったような。

さて以下は本書を読みながら残していた読書メモ(というか日記)を整理したものになります。よかったらどうぞ。


第2章 オブジェクトの生成と消滅

  • 項目5 資源を直接結び付けるよりも依存性注入を選ぶ
  • 項目8 ファイナライザとクリーナーを避ける
  • 項目9 try-finallyよりもtry-with-resourcesを選ぶ

第2版と比べて、追加・変更があったのはこのあたりかしらん。項目5については「その通り」のひとことで、本書にも書かれてはいますが、依存性の注入を利用すると、手スタビリティが上がるのが個人的には大きい。また項目9も禿同(←古い)で、try-withy-resoucesはぜひ使いましょう。ただ意外にベテランを自称しているプログラマほど知らなかったりする。

Javaプログラマにとってガベージコレクションとは「確実にそこに存在し、機能を果たしているが、いつ・どこで・どのように動いているかはわからない」という、いわば神がかり的な存在です。よってその「神がかり的な」動きに依存するファイナライザを利用すべきではなく、ましてやその存在をコントロールしようとするなど、もってのほか。ちなみにJava9からfinalizerがdeprecateになったのは本書で知りました。

第3章 すべてのオブジェクトに共通のメソッド

Objectに定義されていて、自作クラスでオーバライドする類のメソッドに関する章。この章は本書でいうところの「一般契約」の解説が中心で、「一般契約」はJavaのバージョンが少し上がったぐらいではほとんど変わらないということもあり、第2版とほとんど違いがないように感じました。

Javaプログラマとしては当然知っておくべきですし、わたしも本書(第2版)を読んで知ったのですが、現実のプログラミングではIDEの機能やLombokなどのライブラリで自動生成することが多い。というか、そのほうが安全なので。

第4章 クラスとインターフェイス

この章で第2版から増えたのが「項目21 将来のためにインターフェイスを実装する」。Java8からインターフェイスにデフォルトメソッドを持たせることが可能になりましたが、項目21はそれを注意して利用するよう警告する項目になります。そもそもデフォルトメソッドの導入により、本章全体の記述が第2版とは変更になっているように思えます。デフォルトメソッドのおかげで、抽象クラスや継承それ自体のプレセンスが下がっている--はずですが、Java6のレガシーシステムをお守りしている自分には関係がなかった(´;ω;`)ウゥゥ

ちなみに第2版を見たところ「項目21 戦略を表現するために関数オブジェクトを使用する」が本章からなくなっているようです。これはいうまでもなく無名関数・ラムダに代替されたからでしょう。

第5章 ジェネリクス

現代的なプログラミングにおいて、ジェネリクスを積極活用しない理由はないと考えています。ジェネリクスというとコレクション関係(ex. List<String>)がまず頭に思い浮かぶのですが、メソッド定義の際に利用すると、型安全でかつ柔軟なAPI設計ができるので、機能をよく把握し、積極的に使いたいと思います。ちなみに第2版から増えたのが「項目32 ジェネリクスと可変長引数を注意して組み合わせる」。ここは@SafeVarargsアノテーション周りのお話ですね。

第6章 enumアノテーション

この章は第2版と比べて、大きい変更なしだと思います。第2版が依拠していたJava6と第3版が依拠しているJava9の間で、enumについては大きな機能追加などはなかったのかな。しかしその裏を返せば、機能追加が不要なほど、enumが強力だということ。enumはシンプルな機構に見えて、工夫次第でいろいろ使える便利屋さん。本書でもいくつも紹介されている--というより、わたしは本書を読んでenumの強さを知ったくちです。

アノテーションについては、もう少し記述があってもよいような気がします。現代的なプログラミングでは何かしらのフレームワークを利用することが多いと思いますが、「アノテーションを使わないJavaフレームワークは存在しない」というほど、アノテーションは多用されます。要するに現代Javaプログラミングとアノテーションは切っても切り離せない関係にあるわけで、それだけの重要性を持つにも関わらず、アノテーションについて扱っている項目が3つだけというのは少し寂しい。

第7章 ラムダとストリーム

第2版と第3版でもっとも大きく変わったのはこの章、というよりこの章自体が丸々追加されています。内容はというと以下の通り。

  • 項目42 無名クラスよりラムダを選ぶ
  • 項目43 ラムダよりもメソッド参照を選ぶ
  • 項目44 標準の関数型インターフェースを使う
  • 項目45 ストリームを注意して使う
  • 項目46 ストリームで副作用のない関数を選ぶ
  • 項目47 戻り値型としてStreamよりもCollectionを選ぶ
  • 項目48 ストリームを並列化するときは注意を払う

はっきりいうと、この章についてはさほど意外性がなかった、というか「関数型プログラミングの世界ではごく当たり前に言われていることが書かれているだけ」という印象を持ちました。ただ「Schemeを中心としてLISP系言語に集中的に取り組んだことがある」「関数型言語の影響が強いRubyを数年にわたって書いている」など、関数型プログラミングに親和的なバックボーンがあるために、余計にそういう感想を持ったのかもしれません。一般的なJavaプログラマは手続き型に慣れているはずで、そういう人に関数型のいろはをJavaの世界に落とし込みつつ、整理して紹介することには大きな意味があるはずです。

第8章 メソッド

「項目55 オプショナルを注意して返す」が追加されていますね。戻り値としてオプショナルが返ってきた場合、メソッドを呼び出した側はこれをある種の異常と受け取るわけですが、Javaではそのような異常を示す際には例外を使ってきました。つまりメソッドを設計するにあたって、オプショナルを返すべきか、あるいは例外を投げるべきかは頭の痛い問題です。

第9章 プログラミング一般 / 第10章 例外 / 第11章 並行性

この3章については第2版との間で大きな変更はないように感じます。もっとも変更がなかったからといって、重要度が低いというわけではなく、単に機能的な変更が少なかったからというだけで、大切な内容が含まれています。

  • 第9章: 「プログラミング一般」というタイトルですが、Java特有の内容も一部含まれています。とりわけ他言語からJavaへ移ってきたプログラマ、そもそもプログラミングに触れ始めたばかりの初心者などは読んで損はない内容だと思います。
  • 第10章: 例外の取り扱いはとにかく難題。しかもJavaには検査例外/非検査例外という、ただでさえ論争的な例外の扱いをさらにややこしくする概念が導入されており、とにかく頭が痛い。本書が示している例外の取り扱い方針はJavaの原理原則に基づいたもので、そういう意味ではまっとうな内容であるといえる--のですが、現実のプログラミングでは基本的に非検査例外を使えばよいと思ったり思わなかったり。
  • 第11章: Javaは意外にマルチスレッドプログラミングに関する機能が充実している一方、慣れていないプログラマ(←わたしのこと)が安易に利用して問題を引き起こしがち。この章はJavaにおけるマルチスレッドプログラミングの機能を紹介したものというよりは、マルチスレッドプログラミングにおけるベストプラクティスを整理したもので、かみしめるように読みました。「項目82 スレッド安全性を文章化する」← とくにこれは実践していこうと思います。

第12章 シリアライズ

シリアライズに深くかかわるようなシステムにかかわったことがなく(せいぜいIIOP程度)、本章は字面だけ読んで終わりとしました。ごめんなさい🙇。この章はシリアライズにおける「べき論」を整理したものだと理解しているのですが、個人的にはこの項目を心にとめておこうと思います: 「項目85 Javaシリアライズよりも代替手段を選ぶ」。年季の入ったシステムならともかく、これから構築するようなシステムであれば、インターフェイスJSONXMLCSVでいいよね……だめ?(´・ω・`)

結城浩『Java言語で学ぶリファクタリング入門』を読んだ。

Java言語で学ぶリファクタリング入門

Java言語で学ぶリファクタリング入門

タイトル通りなのですが、結城浩Java言語で学ぶリファクタリング入門』(ソフトバンク クリエイティブ)を読みました。もっとも「読んだ」といっても、単に字面に目を通しただけではなく、掲載されているサンプルコードを「写経」しています。なお「写経」結果は以下のレポジトリにアップロードしていますが、ただ単純にサンプルコードを単純に書き写してはいないこと、すなわちJava10の機能を利用したり、ユニットテストを実施したりと、自分なりのアレンジがかなり入っていることに注意(?)してください(´・ω・`)

github.com

ここ最近はレガシーシステムの保守にかかわっているのですが、この手の保守作業のスタンスとして多いのが「動いているものには手を入れない」。ただその方針のせいで、ソースコードは極上のスパゲッティに仕上がっており、解読作業で1日がつぶれるなんてこともしばしば(そしてそういう箇所に限ってたいしたことをしていなかったりする)。本書を読んだのは、そういう「循環的複雑度が高いコード」(←お上品な言い回し)を戦うすべを身に着けたいというのがきっかけでした。逆に言うと、こういう本を読む必要がないと感じている人は相当に恵まれた職場・現場にいるので、是非とも大事にしてください(´・ω・`)

転職活動をやめることにした。

9月の終わりごろから、SIer脱出(というより自社脱出)を目指して続けていた転職活動をやめることにした。なお再開時期は未定。はやくて年明けぐらいかしらん(´・ω・`)

今回の転職活動をやめるに至る最大の理由は「体を壊した」というもの。やめる理由の95%がこいつといっても過言ではない。子供のころは比較的体が丈夫な方で、大病はおろか風邪すらもほとんどかからなかったのだが、20歳を超えたあたりから体質が変わったのか、年に1度は長く続く病気を患うタイプになってしまった。今回かかったのは副鼻腔炎というやつで、医者によると「副鼻腔という穴にばい菌が繁殖して、膿がたまる病気」だそう。

俗にいうと「ちくのう」。そんなかわいらしい名前がついているので、完全になめていたのだが、これがたいへんつらい。ひどいときには10分に1度は鼻をかまないと、鼻が詰まって呼吸ができない。そもそも「鼻が詰まっている」という状況自体、結構なストレスである。また、鼻をかんだところで鼻から出てくるのは鼻水ではなく膿のため、いいようがない異臭を放っている。要は鼻をかむたびに、膿の異臭が鼻に残り、食欲などはFly Awayしてしまう。何よりつらいのは、たまった膿が顔の骨や神経や歯を内側から圧迫するらしく、顔面が殴られたような痛みに襲われることである。もっともひどいときは、顔面痛でベットから起き上がることも困難で、頼みの痛み止めすら効かず、貴重な有給休暇を1日使って、会社を休む羽目に(´;ω;`)ウゥゥ

副鼻腔炎と診断されて、今日で2週間弱。薬がよく効いて、一時期よりは鼻づまりや顔面痛は収まったものの、まだまだティッシュと痛み止めは手放せそうにない。いったいいつになったら根治するのか(´・ω・`) また副鼻腔炎のストレスが起因したのか、咳喘息らしい症状が出始めている。咳喘息には数年前にかかり、その当時は夜も眠れないほどつらかった。よく効く薬を処方してもらって、完全に治ったと思ったのだが、ここにきて再発気味である。1度かかると2度とかからないタイプの病気だと勝手に思っていたのだが、違うのかもしれん。1度かかると繰り返しやすい類の病気もあるが、咳喘息がこれでないことを祈るばかりである。

ちなみにわたしはいわゆる「頭痛持ち」というやつで、とくにストレスがかかる状況になると、脳がちぎれるような頭痛に襲われる。市販のアスピリンを飲んで30-60分もすれば収まる程度の症状なので、完全に慣れっこなのだが、まったくつらくないかといわれれば嘘である。副鼻腔炎&咳喘息(疑惑)という高負荷状態の現在、当然頭痛の症状は出ており、こうしてブログを書いている今も頭が痛かったりする。

鼻はずるずるで、始終げほげほ咳をしている。そのうえ頭痛ががんがんするような状態で、より体に負荷がかかる転職活動は難しいと考え、転職活動を中止するにいたった。だいたいにして、見るからに体調が悪そうなやつと面接官も会いたくないだろう。風邪をうつされるかもしれないと気が気でないし、いろいろ話を聞いたところで、結局は「自分の体調管理もできない」ということで、落とすほかない。わたしにとっても企業にとってもまったくメリットがないならば、きちんと体を治してから転職活動を再開したほうがよいだろうと判断したのである。


転職活動をやめる理由の95%が体調不良だとして、残りの5%は何かというと、まず「そうはいってもSIerに未練がある」というのがまず挙げられる。多重下請け構造、蔓延する長時間労働、偉くなるとコーディングをやめて、PMやアーキテクトやコンサルタントになるしかないという乏しいキャリア像--などなど、不満をあげだすときりがないのだが、しかしSIerの扱う領域、すなわち「事業会社のビジネスロジック」は個人的には非常に魅力的である。あるいは、プログラマ志向だとSIからの脱出先はいわゆるWeb系が中心になるが、どうもこの「Web系」が扱っている領域に関心を持てないというのも、転職活動を考え直すきっかけといってよいだろう。

そもそも転職しようと思ったきっかけは、自社に対する不満がたまりにたまり、もはや我慢ならない状態に陥ったからだった。あげだすときりがないが、とりわけつらいものを3つだけ挙げてみると

  1. つらいことや評価につながらないことは、嘘をついてでも他人に押し付けることが正しいとされる。
  2. 人事評価はプロジェクトでの頑張りや身に着けた技術ではなく、課外活動や何の役にも立たないe-learningや上司へのおべっかで決まる。
  3. 下請けや下流工程に対する蔑視がひどい。とくに保守運用などは人間がやることではないとされ、かかわっているだけで評価が最低ランクまで下がる(実話)

わたしは世渡り下手・政治下手ということもあって、とりわけ1.の餌食にされやすく、はっきりいって人間不信である。自社の人間はだれひとりとして信用ならないし、みんなやりたがらない仕事を引き受けたら昇給0の憂き目にあうし、上流こそ至高でそれ以外はだめとするカースト制にはついていけないしで、こんなところにいられるかと転職活動をはじめたわけである。しかしひるがえって考えてみると、どうしてもやりたいことがあって転職するわけではないため、まともな転職理由や志望動機をこたえることができない。もちろん表面上であれば、いくらでもとりつくろえるわけであるが、そんなもので転職したところで自分のためにならないことは目に見えているし、転職先にも迷惑である。

「最低限信頼できるチームのもと、好きなプログラミングに集中して、世のため人のためになるものを作りたい」。どんなに考えてみても、本音レベルの転職理由はその程度のものでしかなかった。要は転職する理由や自分のキャリアイメージの掘り下げが足りなかったというのも転職活動をやめる5%に含まれているのである。

『Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング』『JUnit実践入門: 体系的に学ぶユニットテストの技法』をそれぞれ読んだ

世間的にはJavaプログラマとして通っているものの、自分がメインで触れてきた環境=お仕事で触れてきた環境はJava7。プライベートではJava8以降の機能を利用してはいるものの、それは機能をつまみ食いする程度。体系だってJava8の機能を学んだことがなかったということもあり、Cay S. Horstmann著、柴田芳樹訳『Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング』(インプレス)を手に取りました。

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング (impress top gear)

Javaプログラマーなら習得しておきたい Java SE 8 実践プログラミング (impress top gear)

この手のJava8入門本はいろいろ出版されているのですが、この本を選んでよかったと思います。訳者が柴田芳樹さん(ex. 『Effective Java』『プログラミング言語Go』)ということで、内容は信用に足るだろうと、ほぼジャケット買いに近い形で買ったのですが、その予想は大当たりでした。本書は全9章からなり、各々の章末に演習問題がついています。以下のレポジトリはその演習問題に対する、わたしの回答集です。参考にしたい方はどうぞ。

github.com

なお本書はJava8の新機能を学ぶことが中心ですが、自分が解くにあたってはJava10を利用しており、Java9ないしJava10で追加されたような機能についても、何の注釈なく利用しています。また全9章中、以下の2章の演習問題については全く回答していません(一通り読んではいます)

反省点としては、テストコードをほとんど(というかまったく)書かなかったこと。演習問題が結構難しく、解くだけで精いっぱいだったということもあり、ユニットテストはおざなりに(´・ω・`) 業務は保守運用・傷害調査が中心で、ユニットテストはおろか、ソースコード自体書く機会が少ない。プライベートでもソースコードは書くが、ユニットテストは書かないとなると、「ユニットテスト書かなさすぎ問題」が自分の中で頭をもたげてきます。そこでJUnit力を磨くという意味で、渡辺修司『JUnit実践入門: 体系的に学ぶユニットテストの技法』(技術評論社; WEB+DB PRESS)の演習問題を解くことにしました。

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

この本自体はかなり前に手に入れ、読みはしていたのですが、演習問題を解いていませんでした。そこで内容をざっと読みなおしたあと、演習問題に回答することで、JUnit力の向上、ならびにユニットテストを書く習慣を取り戻すことに挑戦しました。こちらの演習問題についても、わたしが解いた回答集は以下のレポジトリにアップロードしています。

github.com

ただし本書の出版年がやや古いということもあり、いくつかの部分については2018-09現在に合わせています。

  • 本書ではJava7系を利用してるが、Java10に変更。
    • Java8,9,10において追加された機能については、注釈なく利用している(ex. ラムダ式、ローカル変数の型推論など)
  • 本書ではJUnit4を利用しているが、JUnit5に変更。
  • 本書ではマッチャーとしてHamcrestを採用している、というより事実上のデファクトスタンダードとして紹介しているが、今回はAssertJを利用した。
    • これは現代的な環境に合わせたというよりは、個人的に使ってみたかったという面が大きい。
  • 本書ではユニットテストのメソッド名に日本語を使うことを推奨しているが、個人的にはかなり違和感があるので、メソッド名は英語で、代わりに@DisplayNameを利用している。

GitHubに草を生やしまくるスクリプト

現在絶賛転職活動中で、SIerからWeb系への転向も視野に入れているのですが、Web系ではGitHubの内容、なかでも通称"草"と呼ばれるcontribution履歴が重視されるようです。ということは--スクリプトなどでGitHubに草を生やしまくれば、あたかもスーパーハッカーであるかのように偽装でき、いろいろな企業から引く手あまたなのでは??? (← そんなことはありません)

というわけで「GitHubに草をはやしまくるシェルスクリプト」を書いてみました。要件としては以下の通りです。

  • 実行するとfake-projectというプロジェクトが作成され、2017-01-01から2018-12-31までの2年間、そのプロジェクトに毎日コミットしたかのように見せかける。
  • コミット回数は1日1回から5回まで。ただし単純なランダムではなく、コミット回数が多い日ほど少なく、逆にコミット回数が少ない日ほど多くする。
    • 単純な一様分布ではなく、大きい数字ほど出づらくするような傾斜をかけるイメージ
  • コミットメッセージはコミット日付をそのまま使いまわす。
    • 有名なOSSプロジェクトから拾ってきたメッセージをもとに機械学習でそれらしいメッセージを作る--というのは考えたのですが、そこまでの技術力はありませんでした(´・ω・`)

以上をみたすシェルスクリプトfake.shは以下の通りです。

#!/bin/bash

mkdir fake-project
cd fake-project
git init

start="2017-01-01"
seq 0 $(( ($(date -d "${start}+2years" +%s) - $(date -d ${start} +%s)) / (60*60*24) )) | while read day; do
  seq 1 $(seq 5 | tac | awk '{for(i=0;i<NR;i++) print $0}' | shuf | head -n 1) | while read hour; do
    timestamp="$(date -R -d ${start}+${day}days+${hour}hours)"
    date -d ${start}+${day}days+${hour}hours
    echo ${timestamp} >> fakefile
    git add -A
    git commit -m "${timestamp}"
    git commit --amend --date="${timestamp}" -m "${timestamp}"
  done
done

簡単な技術解説:

  • dateコマンドはGNU版を利用しています。
  • GitHubの草はGitのAuthor Dateを見ているようなので、git commit --amend --date=timestampで直前のコミットを偽装しています。
  • 傾斜のかかった乱数ですが、まず注目すべきはseq 5 | tac | awk '{for(i=0;i<NR;i++) print $0}'。この一連のコマンドは1を5個、2を4個、… 5を1個、それぞれ標準出力に出力します。あとはこの出力をshufでシャッフルしているわけですね。

さてfake.shを実行後(完了までは数分かかります)、カレントディレクトリに作成されたfake-projectGitHub上に作成したレポジトリにpushすると、偽装は完了。偽装前の2017年と2018年の"草"の状態は以下のようにたいへんみすぼらしいものでした。

f:id:nekoTheShadow:20180920232842p:plain f:id:nekoTheShadow:20180920232811p:plain

それがなんということでしょう! fake.shにより作成したプロジェクトをGitHubにpushするだけで、あっというまにスーパーハッカー風の草原ができあがったではありませんか!!! これで君もスーパーハッカ―だ!!! (← 違います)

f:id:nekoTheShadow:20180920233138p:plain f:id:nekoTheShadow:20180920233140p:plain


作成したプロジェクト、ならびにfake.shは以下のリンクに設置しています。御笑覧ください(´・ω・`)

github.com

ここ数か月で読んだ本に関する読書メモ

自分の趣味は読書で、読んだ本については簡単な読書メモを残し、とりわけ面白かった本についてはブログに掲載しているのだが、ここ数か月は高負荷のストレスがかかる仕事がつづいており、ブログ執筆が怠りがちでした(ブログはたいてい休日に書いているのだが、その休日はついつい寝て過ごしてしまう)。そんなつらい状況でも読書と読書メモは続けていたので、面白かったり印象に残っている本について、そのメモを世間様にさらしたいと思います(´・ω・`)


沈才彬『中国新興企業の正体』(角川新書)

中国新興企業の正体 (角川新書)

中国新興企業の正体 (角川新書)

以前に『現代中国経営者列伝』という本を読んだのが、本書も同種の本で、成長中の中国企業が紹介されている。『現代中国経営者列伝』は企業そのものより企業のトップに焦点を当てていたが、本書は企業そのものの紹介が多く、また中国でしかサービスを展開していない企業も取り上げられている。「そうした企業がなぜ伸びているのか」という分析にまで踏み込んでいる本ではないので、読み物として読むと面白いと思う。

小山聡子『浄土真宗とは何か: 親鸞の教えとその系譜 』(中公新書)

タイトルを見ると、まるで浄土真宗全般について扱っているように思えるが、実際は浄土真宗の宗祖である親鸞に関する議論が中心。浄土真宗というと、他力本願の思想や加持祈祷の否定などが知られるが、では親鸞はそうした考えを徹頭徹尾、厳格に実践することができたのだろうか? 本書によれば、それは否で、親鸞もひとりのにんげんでしかなかった--というといいすぎであるが、少なくとも親鸞が生きた当時の風潮からは逃げきれなかったということがよくわかるのである。

鈴木透『スポーツ国家アメリカ: 民主主義と巨大ビジネスのはざまで』(中公新書)

スポーツという観点からアメリカはどのように見えるのか、あるいはアメリカの政治や文化がスポーツにどのような影響をあたえているのか、という話題について、いくつかの雑多なテーマを紹介している。とくにアメリカにおける女性とスポーツについて扱った章は勉強になった。オムニバス形式で「大学の講義にありそうだな」なんて思いながら読んだのだが、あとがきによると、本書は筆者の大学での講義をベースにしているらしい。

高槻泰郎『大坂堂島米市場: 江戸幕府 vs 市場経済』(講談社現代新書)

江戸時代には「天下の台所」と呼ばれ、そのイメージは現代の大阪=商人の町として色濃く残っているわけだが、ではなぜ大坂が「天下の台所」と呼ばれたのかというと、本書が扱う堂島の米市場があったからである。詳しい内容はさておき、当時の大坂に高度に発達した先物市場があり、現代のそれと比べてもそん色がないというのには驚かされる。

古野まほろ『警察手帳』(新潮新書)

警察手帳 (新潮新書)

警察手帳 (新潮新書)

交番勤務のおまわりさんから、キャリア入省の警察官僚、はては警視総監まで、警察官であれば必ず持っているのが警察手帳であるが、その警察手帳をタイトルに関した本書は警察官の日常について、軽い読み物調にまとめている。正義の番人、法の執行官である警察官も皮をむいてみれば、ひとりのサラリーマンに過ぎない。サラリーマンとしての警察官の日常を知るには面白い1冊だといえよう。

広中一成『牟田口廉也: 「愚将」はいかにして生み出されたのか』(星海社新書)

牟田口廉也といえば、日本陸軍きっての愚将であり、なかでも無謀かつ杜撰なインパール作戦を立案、その指揮を執った結果、多くの人命をうしなったことでよく知られている。本書はその牟田口廉也の評伝で、色眼鏡で見がちな牟田口の生涯を冷静に描こうとしている。個人的に意外だったのは、彼が実践経験豊富な現場型の将官で、盧溝橋事件では現地指揮官として戦線拡大を行い、、マレー戦線ではいくつもの勝利をおさめ、マスコミからは常勝将軍としてもてはやされていたこと。インパール作戦のような無謀な作戦をやるぐらいだから、現場なんて見たこともない官僚型の人間だと思っていたのだが、どうやら違うらしい。

本書はインパール作戦の失敗を牟田口の個人的資質を第一に見ている。要するにそれだけの作戦を指揮立案するだけの器ではなかったということだ。しかし無能な牟田口をそれだけの地位に押し込んだのは日本陸軍であり、牟田口は与えられた職責をまじめにこなしただけということもできる。またインパール作戦の実行にあっては、予定段階から無謀とわかっていたということもあり、多くの参謀が自らの責任に及ばないよう立ち振る舞っている。インパール作戦は確かに牟田口の資質が問題だったわけだが、その背景には日本陸軍の組織や人事に問題があったということがよくわかる。

森本あんり『異端の時代: 正統のかたちをもとめて』(岩波新書)

異端の時代――正統のかたちを求めて (岩波新書)

異端の時代――正統のかたちを求めて (岩波新書)

丸山眞男・初期教会・アメリカ合衆国建国をベースとして、そもそも異端とは何か・正統とは何かというところから議論がはじまるのだが、個人的に関心をもって読んだのがこの部分。まずみんなが正しいと思っていることがあり、この「みんなが正しいと思っていること」を囲む線が引かれて、その内側にあるのが正統、外側にあるのが異端になるというのである。まず線が引かれて、正統と異端が人工的に決められるという類の議論を耳にするが、歴史的にはそれは間違っている。正統が正統としていられるのは、結局はみんなが支持するからであり、みんなが支持するのは正統のほうが異端に比べると、よくもわるくも不真面目でゆるふわだからである。

本書の議論によれば、異端とはまじめで寛容ではなく、自ら意思をもって選び取る必要がある存在なのだという。さて現代社会は自ら選択することが求められる時代である。マックス・ウェーバーは脱魔術化の時代といったが、科学技術や自由主義の発展にともなって、自らの選択できる余地が増えつつある。そうしたみなが選択を行う社会はすなわち、総異端社会の到来であり、言い換えれば正統が失われた社会だといえる。

堀川恵子『教誨師』(講談社文庫)

教誨師 (講談社文庫)

教誨師 (講談社文庫)

宗教の視点から受刑者に反省と償いを促すことを教誨といい、それに携わる宗教家を教誨師という。本書は教誨師の中でも、確定死刑囚に対する教誨に長年携わった浄土真宗の僧侶が残したインタビューと日記に基づく記録である。読んでいて楽しい、心躍るというタイプの本ではないが、他社の生命を奪い、その代償として生命を奪われる人間に更生を促す難しさと奥深さを考えてしまう。

団鬼六真剣師 小池重明』(幻冬舎アウトロー文庫)

真剣師小池重明 (幻冬舎アウトロー文庫)

真剣師小池重明 (幻冬舎アウトロー文庫)

真剣師とは賭け将棋で生計を立てる職業であり、本書は「新宿の殺し屋」という異名をとった伝説の真剣師である小池重明の記録である。小池はプロ顔負け、というかプロさえ打ち負かす実力を持ちながら、飲む・買う・打つにはまったくだらしない。無頼派・破滅型の天才の生きざまには、なんともいない哀愁がただよっており、きわめてよくできた文学なのである。事実は小説より奇なりとはよく言ったものである。

山本譲司累犯障害者』(新潮文庫)

累犯障害者 (新潮文庫)

累犯障害者 (新潮文庫)

刑務所がどこにも行き場がない社会的弱者の受け入れ先になっている、ということは最近になってよく指摘されているが、本書は弱者のうちでも障害者がテーマである。福祉につながっていればよいが、そうではない場合、微罪を繰り返し、刑務所に何度も入ることで生き残るほかない。刑務所が最後のセーフティーネットなのだが、個人的に衝撃だったのは、警察や検察や裁判所はそうした実態を漠然と把握しており、障害者をやむなく受刑させていることが多々あるということだ。

小谷野敦江藤淳大江健三郎』(ちくま文庫)

大江健三郎といえばノーベル文学賞を受賞した小説家である一方、戦後民主主義派の朝日岩波系文化人として、現在でも言論界に強い影響力を有している。対して江藤淳保守系の文芸評論家として活動、その思想は現代の保守系文化人にも影響を与えている。本書はそうした思想的には対極にあるふたりの文学者のダブル評伝で、面白いのは筆者が「江藤は死ぬほどきらいだが、大江のことは尊敬してやまない(ただし思想は除く)」という態度を貫いていること。そんなに「江藤のことを嫌わなくても」と思いつつ、そうしたバイアスを除いても、江藤が俗物根性の持ち主であったことがよくわかる。

本田靖春『誘拐』(ちくま文庫)

誘拐 (ちくま文庫)

誘拐 (ちくま文庫)

いわゆる「吉展ちゃん誘拐殺人事件」の顛末を描いたドキュメンタリー。この事件は"落としの八兵衛"こと平塚八兵衛の活躍にスポットライトがあてられることが多いのだが、本書は事件の発生から解決までの一連の流れを整理しており、平塚の活躍についても事件の一要素程度にしか扱われていない。細部にいたるまで丹念に取材されているため、読んでいて臨場感を感じる一方、明るい面ばかりが語られる高度経済成長にもある種の暗部や闇があったことにも思いを巡らせてしまった。

中村高寛ヨコハマメリー: かつて白化粧の老娼婦がいた 』(河出書房新社)

かつて横浜には通称"メリーさん"と呼ばれるホームレスがおり、横浜市民のなかでは半ば都市伝説化していたのだという。その"メリーさん"を題材にしたドキュメンタリー映画があるのだが、本書はその映画の監督が書いたもので、"メリーさん"に関する記述が半分、映画撮影時の身辺雑記的記述が半分という内容になっている。映画自体も"メリーさん"本人よりはむしろ"メリーさん"に関係する人の記録というややポストモダンじみた内容だったらしく、"メリーさん"自体や"メリーさん"を生み出した背景などを知りたいという人にはやや肩透かしかもしれない。

神山典士『ペテン師と天才: 佐村河内事件の全貌』(文藝春秋)

ペテン師と天才 佐村河内事件の全貌

ペテン師と天才 佐村河内事件の全貌

筆者はいわゆる佐村河内騒動を最初にスクープしたライターで、本書はそのスクープの元になった週刊文春の記事をもとに執筆されたものである。読んでいてわかるのは佐村河内という男が出世欲と虚栄心にまみれた病的な嘘つきであるということ。それに加担した新垣隆の罪も重いが、しかし本書によると、ゴーストライターであっても、自分の作った曲が多くの人に聞いてもらえるという誘惑には勝てなかったのだという。こういう騒動があっても、新垣には才能と能力がある。では佐村河内には何があるのか? それが悲しい本書の結末である。

ゲイ・タリーズ『覗くモーテル観察日誌』(文藝春秋)

覗くモーテル 観察日誌

覗くモーテル 観察日誌

幼いころよりのぞき願望にとらわれた男がモーテル経営者となり、以降30年間の長きにわたって、モーテルの個室を覗き、記録を取り続けた--というにわかには信じがたい事実のドキュメンタリーである。覗き男の興味関心がセックスにあったため、話題はセックス関連に偏っているが、時代によってセックスに対する人々の価値観が変わっていくのは面白い。そうまじめに読まなくても、他人の性行為を覗き見るというインモラルな行為をエンターテイメント的に楽しむのもよいだろう。

本村凌二『教養としての「ローマ史」の読み方』(PHP研究所)

教養としての「ローマ史」の読み方

教養としての「ローマ史」の読み方

全体的なテイストとしては、ビジネス教養書といってよいだろう。新書にありがちな、やや通俗寄りの学術書を期待していると失敗する。タイトルにある通り、本書はローマ帝国の誕生から滅亡までを概観するというもので、通史ではない分、詳細な理解にはつながらないが、ローマの歴史を概観で知るぶんにはこれで十分だと思う。まさしく「教養としての」という修飾語がピッタリである。

『忘れられたベストセラー作家』(イースト・プレス)

忘れられたベストセラー作家

忘れられたベストセラー作家

小説をあまり読まない人からすると、あまり理解できない感覚かもしれないが、とくに通俗小説や大衆小説のジャンルにおいては、99%の小説と小説家は年月がたつにつれて読まれなくなっていく。こうした「読まれなくなった」状態をよく「忘れられた」というが、本書はそうした「忘れられた」作家や作品について、やや雑多にまとめたものである。エッセイテイストで読みやすいといこともあり、文学に興味がある人は読んで損にはならないと思う。

呉座勇一『戦争の日本中世史: 「下剋上」は本当にあったのか』(新潮選書)

戦争の日本中世史: 「下剋上」は本当にあったのか (新潮選書)

戦争の日本中世史: 「下剋上」は本当にあったのか (新潮選書)

タイトルからは中世に行われた個々の戦争の戦術や背景を解説する本かのように思われるが、実際には戦争が中世社会にどのような影響を与えたのかについて、丁寧に議論を進めた1冊である。本書がやり玉に挙げるのは唯物史観マルクス主義といいかえてもいいだろう。戦後の日本史学界は先の大戦の反省もあって、唯物史観に強く染まっており、中世史を見る目を曇らせてきたというのが本書の主張である。とくに「悪党」について扱っている章では「『悪党』という存在が英雄視されるほどのものなのか」「そもそも『悪党』なんていたのか」というところまで踏み込んでおり、その議論の斬新さと緻密さについては、知的好奇心を喚起させられた。