StatsBeginner: 初学者の統計学習ノート

統計学およびR、Pythonでのプログラミングの勉強の過程をメモっていくノート。たまにMacの話題。

Rで{snow}と{parallel}の並列化を少し試してみた

Rで計算を高速化したいとき、

  • なるべくベクトル計算にしてforで頭からみていくような処理を避ける
  • 自作関数をコンパイルする
  • 並列化(マルチコアの利用)

などの手法があり、ベクトル化とコンパイルに関してはケースによって何が有効かというのは難しい。
ただ、forで頭から順に見ていく処理(前後の依存関係がなく、処理順を入れ替えたり、カタマリに分割しても問題がないようなもの)をやる場合に、複数のスレッドに分けて並行処理すればその分速くなるというのは直観的に理解しやすい。


色々試したわけではないので、どういう場合にどの程度並列化が有効であるかとかはよく分かってないのだが、取り急ぎコードの書き方を忘れないため程度のメモとして、以下に書き写しておく。
なお、並列化すると、時間を測った場合のuserとsystemの値がおかしくなるが、elapsedの値は合っている。(一応ストップウォッチで確認した。)

> library(snow)
> library(parallel)
> detectCores(logical = FALSE)  # 物理コア数の確認
[1] 4
> detectCores(logical = TRUE)  # 論理コア数の確認
[1] 8
> 
> # 処理の中身はどうでもいいが、ここでやっている処理が何かというと、
> # faid_allという文字列のベクトルがあり、これを頭から順にみていって、
> # d_all3というデータフレームのfile_article_idという列の値と一致する
> # 行の、content_without_tagという列に入っているテキストを連結して
> # text_allという新しいベクトルに追加していく。

> # 並列化しない場合
> t <- proc.time()
> text_all <- c()
> for(i in 1:length(faid_all)) {
+   target.rows <- which(d_all3$file_article_id==faid_all[i])
+   text.sep <- d_all3[target.rows,]$content_without_tag
+   text.paste <- paste(text.sep, collapse = '\n')
+   text_all <- c(text_all2, text.paste)
+ }
> proc.time()-t
   user  system elapsed 
 64.819  12.420  77.050 

> # {snow}のsocketで並列化
> cl <- makeCluster(8, type="SOCK")  # クラスターを8つ立ち上げ
> clusterExport(cl, c('d_all3','faid_all')) # オブジェクトをクラスターにコピー
> # クラスターを立ち上げてオブジェクトをコピーするところで10秒ぐらいかかるので、時間はここから測る。
> t <- proc.time()
> text_all <- parSapply(cl, faid_all, function(p){
+   target.rows <- which(d_all3$file_article_id==p)
+   text.sep <- d_all3[target.rows,]$content_without_tag
+   text.paste <- paste(text.sep, collapse = '\n')
+   return(text.paste)
+ })
> stopCluster(cl)  # クラスターを立ち上げ(忘れないように!)
> proc.time()-t
   user  system elapsed 
  0.098   0.054  16.365 

> # {parallel}のforkingで並列化
> t <- proc.time()
> text4 <- mclapply(faid_all, function(p){
+   target.rows <- which(d_all3$file_article_id==p)
+   text.sep <- d_all3[target.rows,]$content_without_tag
+   text.paste <- paste(text.sep, collapse = '\n')
+   return(text.paste)
+ }, mc.cores = 8)
> proc.time()-t
   user  system elapsed 
 36.652   8.208  16.077 


forkingとsocketの違いはあまり理解できてないが、socketは使用する変数を全て、各コアにコピーしなければならないらしく、そこの処理で少し余計に時間がかかる。
自分の場合、Macの物理コアが4、論理コアが8で、4本に並列化すると4倍ぐらいの速度にはなった。上の例のように8本にしても8倍にはならないのだが、4本よりは少し速かった。


以下は、AWSでvCPUが32個のマシンを借りて、とある処理にかかる時間を並列化の本数ごとに計測したもの。1回ずつしか測ってないので誤差がある。
途中からほとんど水平だが、並列化しても意味がないというより、たぶん「とある処理」の中で並列化と関係ない部分で30秒ぐらいかかってるんだろう。(vCPUは仮想CPUのことなので物理的なコア数のように比例的に増えないというのもあるかもしれないが。)

MeCabとRMeCabのインストール、NEologd辞書への変更、ユーザ辞書登録をやり直す(Mac OS)

形態素解析エンジンのMeCab(およびRMeCab)をEC2上の新しい環境に入れる必要が生じたので、

  • MeCabのインストール
  • IPA辞書のインストール
  • RMeCabのインストール
  • NEologd辞書のインストールとシステム辞書の変更
  • ユーザ辞書の作成、コンパイル、登録

の手順を改めて確認してみた。以下は手元のMac上での作業だけどlinuxでもさほど変わらんでしょう。
ちなみにRMeCabは、システム自体にインストールされたMeCabを利用するラッパーなので、R上だけではインストールが完結しない。


ソースから自分でインストールする方法もあるが、私はHomebrewで管理することにしたいので、まずHomebrewでMeCabとIPA辞書をインストールする。ターミナルで以下のようにする。

$ brew install mecab
$ brew install mecab-ipadic


ちなみにどうでもいいが、MeCab本体だけインストールした状態でmecabコマンドを打つと、

$ param.cpp(69) [ifs] no such file or directory: /usr/local/lib/mecab/dic/ipadic/dicrc

というエラーが出るが、上記の場所を探しに行っているのは、mecabrcというファイルに書かれたコンフィグでデフォルトでそう指定されているため。
最初からIPA辞書を使わないという場合は、べつにmecab-ipadicをインストールせずに、別の辞書をインストールして、コンフィグを書き換えればいいのだが、その場合は、
/usr/local/etc/mecabrc
を開いて、

$ dicdir =  /usr/local/lib/mecab/dic/ipadic


という記述の部分を書き換えることになる。ここに、コンパイル済みの別の辞書のパスを書けばいい。ちなみに後述するように、同じファイルにユーザ辞書の設定も書くことになる。


とりあえずIPA辞書のインストールまで済んだら、試しに起動してみる。

$ mecab
すもももももももものうち。
すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
。	記号,句点,*,*,*,*,。,。,。
EOS


RのほうでRMeCabもインストールしておこう。CRANからじゃないので注意。

install.packages("RMeCab", repos = "http://rmecab.jp/R")
library(RMeCab)
RMeCabC("すもももももももものうち。")
# 結果の表示は省略


IPA辞書でMeCabを使うなら上記で完了だが、今回は、新語に強く毎週辞書が更新されているmecab-ipadic-NEologdを使いたいので、インストールする。インストール方法は以下のページに書いてある。
https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md


まず、git cloneでソースをダンロードし、ダウンロードしたディレクトリに移動して、インストーラーを実行する。

$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
$ cd mecab-ipadic-neologd
$ ./bin/install-mecab-ipadic-neologd -n -a

ここで-aというオプションは、上記説明ページにある「全部入り」の意味。けっこうインストールに時間かかる。
さて、インストールしただけではNEologd辞書は使えない。以下のように解析を実行してみると……

$ mecab
今日はあつまれどうぶつの森をプレイします。
今日	名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
あつまれ	動詞,自立,*,*,五段・ラ行,命令e,あつまる,アツマレ,アツマレ
どう	副詞,助詞類接続,*,*,*,*,どう,ドウ,ドー
ぶつ	名詞,一般,*,*,*,*,ぶつ,ブツ,ブツ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
森	名詞,一般,*,*,*,*,森,モリ,モリ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
プレイ	名詞,一般,*,*,*,*,*
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。	記号,句点,*,*,*,*,。,。,。
EOS


このように「あつまれどうぶつの森」が固有名詞として認識されないのは、システム辞書としてデフォルトのIPA辞書が適用されたままだからである。
NEologd辞書をMeCabに反映させる方法は2つある。

  1. MeCabコマンドを実行するときに、システム辞書を指定する。(RMeCabではこの方法は使えない。)
  2. /usr/local/etc/mecabrcを書き換えてデフォルトのシステム辞書を入れ替える。


前者は、以下のようにmecabコマンドの後ろに-dオプションを付けて辞書を指定する。ちなみに後でやるように、ユーザ辞書を指定する場合は-uで指定するのだが、その場合はディレクトリじゃなくてファイルのパスを指定するところが違うので注意。システム辞書はディレクトリで指定する。

$ mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd/
今日はあつまれどうぶつの森をプレイします。
今日	名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
あつまれどうぶつの森	名詞,固有名詞,一般,*,*,*,あつまれどうぶつの森,アツマレドウブツノモリ,アツマレドーブツノモリ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
プレイ	名詞,固有名詞,一般,*,*,*,PLAY!,プレイ,プレイ
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。	記号,句点,*,*,*,*,。,。,。
EOS


しかしRのRMeCabから使う場合は、この方法は使えない(RMeCabのdicという引数はユーザ辞書を指定するためのもの。)
そこで、コンフィグでデフォルトのシステム辞書を変更するために、/usr/local/etc/mecabrcを書き換えるのだが、最初は開くと以下のような内容になっている。

; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
;
dicdir =  /usr/local/lib/mecab/dic/ipadic

; userdic = /home/foo/bar/user.dic

; output-format-type = wakati
; input-buffer-size = 8192

; node-format = %m\n
; bos-format = %S\n
; eos-format = EOS\n


dicdir=がシステム辞書のパスを書くところで、userdic=はユーザ辞書のパスを書くところ(最初は;でコメントアウトされている)。
とりあえずここでは、以下のように書き換えておく。テキストエディタで開けばよいが、管理者権限になってて保存できなかったりする場合はターミナルからsudo viとか編集する。

dicdir =  /usr/local/lib/mecab/dic/mecab-ipadic-neologd/


これでシステム辞書が切り替わったので、以下のように、オプションを付けなくても「あつまれどうぶつの森」が一つの固有名詞として判定される。

$ mecab
今日はあつまれどうぶつの森をプレイします。
今日	名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
あつまれどうぶつの森	名詞,固有名詞,一般,*,*,*,あつまれどうぶつの森,アツマレドウブツノモリ,アツマレドーブツノモリ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
プレイ	名詞,固有名詞,一般,*,*,*,PLAY!,プレイ,プレイ
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。	記号,句点,*,*,*,*,。,。,。


Rの方でもちゃんと認識できる。

> RMeCabC("今日はあつまれどうぶつの森をプレイします。")
[[1]]
  名詞 
"今日" 

[[2]]
助詞 
"は" 

[[3]]
                  名詞 
"あつまれどうぶつの森" 

[[4]]
助詞 
"を" 

[[5]]
    名詞 
"プレイ" 

[[6]]
動詞 
"し" 

[[7]]
助動詞 
"ます" 

[[8]]
記号 
"。" 


さて次に、ユーザ辞書を登録する。例えば以下のように、「95%信頼区間」は複数の単語に分解されてしまうのだが(文脈にもよる可能性があるが)、これを辞書に登録しておいて1つの名詞として認識させたい。

$ mecab
今日は95%信頼区間の求め方を勉強します。
今日	名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
95%	名詞,固有名詞,一般,*,*,*,95%,キュウジュウゴパーセント,キュウジュウゴパーセント
信頼	名詞,サ変接続,*,*,*,*,信頼,シンライ,シンライ
区間	名詞,一般,*,*,*,*,区間,クカン,クカン
の	助詞,連体化,*,*,*,*,の,ノ,ノ
求め	動詞,自立,*,*,一段,連用形,求める,モトメ,モトメ
方	名詞,接尾,特殊,*,*,*,方,カタ,カタ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
勉強	名詞,サ変接続,*,*,*,*,勉強,ベンキョウ,ベンキョー
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。	記号,句点,*,*,*,*,。,。,。
EOS


ユーザ辞書を使う方法はここに書いてある。
http://taku910.github.io/mecab/dic.html
まずMeCabのフォーマットにしたがったCSVファイル(タイトル行は不要)を作成し、それをコンパイルして、/usr/local/etc/mecabrcのユーザ辞書欄にパスを追加するか、もしくは解析をするときにオプションで指定する。
ユーザ辞書はどこに置いててもいいのだが、私は/usr/local/lib/mecab/dic/の中にuserdicというフォルダを作って置いておくことにした。
そのフォルダの中にまず、以下のような内容のcsvをuserdic1.csvという名前で保存する(名前は何でもいいが)。文字コードはUTF-8にしておく。

95%信頼区間,1285,1285,5000,名詞,一般,*,*,*,*,95%信頼区間,キュウジュウゴパーセントシンライクカン,キュージューゴパーセントシンライクカン


一番左が、文章中に出てくる実際の表記で、右から3つ目は基本形。左から2つ目と3つ目のIDは、左文脈ID、右文脈IDというらしいが、空にしておいてもコンパイル時に勝手に埋めてくれるらしい。私はよく分かってないが、システム辞書のコンパイル前のcsvを見て似た単語と同じIDを入れておいた。
左から4つ目の5000という数字は、その単語の登場しやすさを表していて、値を小さくすると出現頻度の高い単語ということになるので、解析時に1つの単語として認識される確率が高くなる。
このコストの数字も、システム辞書のコンパイル前のcsvを見て似た単語のコストを書いとけばいいらしい。認識されやすくするなら、小さい値を設定する。


つぎにこのcsvをコンパイルして、MeCabが読めるユーザ辞書にするのだが、上のリンク先に書いてあるコンパイル方法だと、mecab-dict-indexという実行ファイル(コンパイラ兼インストーラ)が/usr/local/libexec/mecab/というディレクトリに置いてあることになっている。
私も以前はそうだったのだが、いったん最初からMeCabを入れ直したらMac上では/usr/local/Cellar/mecab/0.996/libexec/mecabというディレクトリに入っていた。
なお、場所が分からなければ、ターミナルから

$ sudo find / -name mecab-dict-index

として探せばよい。


ユーザ辞書をコンパイルするには、以下のようにする。
辞書置き場に移動した上で、最初のmecab-dict-indexまでが実行ファイルを指定。-d オプションのところはどのシステム辞書を使っているかを書く。-uは生成されるコンパイル済みユーザ辞書のパスとファイル名。-fと-tはcsvとコンパイル済み辞書の文字コード。そして最後にcsvのパスを指定。
システム辞書の指定が間違っていたり、文字コードの指定が間違っていたりすると、ちゃんと動作しない辞書ができて、その状態でうっかりRMeCabから呼び出すとRのセッションごと落ちるので注意したい。

$ cd /usr/local/lib/mecab/dic/userdic
$ /usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd -u userdic1.dic -f utf-8 -t utf-8 userdic1.csv

reading userdic1.csv ... 1
emitting double-array: 100% |###########################################| 

done!


これでコンパイル完了したので、試しに使ってみる。

$ mecab -u userdic1.dic
今日は95%信頼区間の求め方を勉強します。
今日	名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
95%信頼区間	名詞,一般,*,*,*,*,95%信頼区間,キュウジュウゴパーセントシンライクカン,キュージューゴパーセントシンライクカン
の	助詞,連体化,*,*,*,*,の,ノ,ノ
求め	動詞,自立,*,*,一段,連用形,求める,モトメ,モトメ
方	名詞,接尾,特殊,*,*,*,方,カタ,カタ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
勉強	名詞,サ変接続,*,*,*,*,勉強,ベンキョウ,ベンキョー
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
。	記号,句点,*,*,*,*,。,。,。
EOS


ちゃんと認識できてるようだ。
RMeCabでもやっておく。dicという引数にユーザ辞書のパスを書く。

> RMeCabC("今日は95%信頼区間の求め方を勉強します。",
+         dic='/usr/local/lib/mecab/dic/userdic/userdic1.dic')
[[1]]
  名詞 
"今日" 

[[2]]
助詞 
"は" 

[[3]]
         名詞 
"95%信頼区間" 

[[4]]
助詞 
"の" 

[[5]]
  動詞 
"求め" 

[[6]]
名詞 
"方" 

[[7]]
助詞 
"を" 

[[8]]
  名詞 
"勉強" 

[[9]]
動詞 
"し" 

[[10]]
助動詞 
"ます" 

[[11]]
記号 
"。" 


これは先ほど言ったように、mecabrcの中にユーザ辞書の指定を書き込むことも可能で、mecabrcに以下のように追記する。システム辞書(dicdir)はディレクトリ、ユーザ辞書はファイルを指定するというところを間違えやすいので注意が必要。ちなみに、ユーザ辞書はカンマで区切って複数のパスを書けば複数同時に使えるらしい。

; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
;
dicdir =  /usr/local/lib/mecab/dic/mecab-ipadic-neologd/

userdic = /usr/local/lib/mecab/dic/userdic/userdic1.dic

; output-format-type = wakati
; input-buffer-size = 8192

; node-format = %m\n
; bos-format = %S\n
; eos-format = EOS\n


ちなみに、NEolodgに切り替えると、「すもももももももものうち。」が解析できなくなる。
すもももももももものうち · Issue #41 · neologd/mecab-ipadic-neologd · GitHub

Rのplm::pgmm関数でError "system is computationally singular"が出まくった

{plm}パッケージのpgmmという関数でパネルデータの分析をしようとしたら、

system is computationally singular

のエラーで推定できない。
plmパッケージに例題として入っているデータとモデルではふつうに推定できたので、たぶん分析しようとしているモデルが不適切なのだろうと思い、変数やモデルの構成をいろいろ変えてみたけど、解決せず。


一般的には"system is computationally singular"というエラーは、変数間の相関が高くて多重共線性が発生している場合や、見た目上は相関が高くなくても変数の行列に一次独立でないものが混じっている(他の複数の変数の線形和で表現できるとか)場合や、サンプルサイズより変数の数が多い場合に発生する。
ところが、変数をいろいろチェックしたけど、どうもそういう問題ではなさそうに思えてきた。そもそも、学生のPCでは動いたらしいコードが自分のPCで動かないのも変なので(上記エラーはたまに、環境によって出たり出なかったりするけど)、{plm}パッケージ自体をアプデ・再インストールしようとしたところ、今度はコンパイルのところでエラーがでて、その一部を挙げると

clang: error: unsupported option '-fopenmp'

となってて進めなくなった。
これはググるといろんなところで報告されているエラーで、とりあえずこのページに書かれてあるとおりに、X-codeのxommand line toolsとclangとgfortranのアップデートをしろと言われる。
R Compiler Tools for Rcpp on macOS before R 4.0.0 | The Coatless Professor


しかしこれをやってみたところ、こんどはRcppのエラーが発生して、たとえばその一部をみると

error: no member named 'fabsf' in the global namespace

というようなことが書かれている。
このページにかかれている症状と似ている。
Odd header error due to no member named 'fabs' in the global namespace · Issue #40 · rmacoslib/r-macos-rtools · GitHub


たぶんパスの問題で、いろいろ調べてみたのだが自分の知識では解決方法がよく分からず、半日ぐらい悩んでいた。


で、結局、Rのバージョンを3.6から4.22にアップデートしたら、全て解決しました(笑)

Rで「自作関数に引数として与えたグローバル変数」を上書きする方法ってある?

Rで、自分で定義した関数内の処理のようなローカルなスコープから、グローバル変数を定義したり変更したりする操作をしたい場合は、「<<-」を使うことになっていて、

> obj1 <- c("元々1", "元々2")
> 
> myfun <- function(x){
+   obj1 <<- c(obj1, x)
+ }
> 
> myfun('追加')
> 
> print(obj1)
[1] "元々1" "元々2" "追加" 

こういうふうになるのだが、これはどのグローバル変数を上書きするかは関数定義ないに直接書き込んでしまっているので、それ自体を引数として指定したい場合のやりかたが、よく分からない。
分からないので、文字列をコードとして実行する方法を用いて、無理やり、

> append.global <- function(x, y) {
+   x.name <- as.character(eval(substitute(alist(x))))  # オブジェクト名を文字列で取得
+   code <- paste(x.name, '<<- c(', x.name, ',\"', y,'\")', sep='')
+   eval(parse(text=code))  # 文字列をコマンドとして実行
+ }
> 
> obj1 <- c("元々1", "元々2")
> append.global(obj1, '追加')
> print(obj1)
[1] "元々1" "元々2" "追加" 

というふうにしてみたのだが、もっと良い方法はないのだろうか?
関数の返り値を代入する方法だと都合が悪いことがあり、返り値を使わずに関数内の記述だけで上書きしたい。

古典を読もうとする学生に「教科書から読め」と諭す必要はないと思う

昨日、ツイッターで「大学生のための100人100冊」という、いわゆる「必読書リスト」を紹介するツイートが流れてきました。20世紀の著作を集めたものなので、「古典」というほど古くないものも多いですが、でもまあ「古典」に近いものが多いとは言えるでしょう。
 


100冊といいながら120冊載っているのですが、結構いいリストだと思いました。といっても、自分が読んだことあるものを数えてみたら33冊しかなかったので、「お前に良し悪しは判断できんだろ」と言われればその通りなのですが、読んだことがなくても聞いたことはあったり、同じ著者の別の本は読んだことがあったりするわけで、重要なものかどうかは何となく分かる……気になっています(気がするだけかも知れません)。


この種の必読書リストで一番好きなのは、柄谷行人や浅田彰らが編集した『必読書150』ってやつですね。私はポストモダンの人たちの思想は好きではないものの、古典文献リストとしてはけっこうオーソドックスなので、事あるごとに人に勧めています。人文社会科学50冊、日本文学50冊、海外文学50冊という分け方もいい。それ以外では、古典ではないですが、「サントリー学芸賞」や「吉野作造賞」の受賞作リストは外れが少ないと思います。あとは読書猿さんの「Googleが選ぶ20世紀の名著100選」かな。


ところで、「こんなリストは無視して教科書から読むべき」という意見も一緒に(複数)流れてきたのですが、個人的には、必読書リストに挑戦しようという学生に「教科書から読め」と諭す必要はないと思っています。リストに挙がっている個々の著作について、「これの岩波文庫版は翻訳が悪い」とか「これはどうせ最初の3ページで挫折するから、こっちの解説書をみながらのほうがいい」とかアドバイスすることはあるでしょう。しかし一般論として、「古典や必読書といわれる有名な本のリスト」をつぶしていこうという気概は尊いものだし、そういう意欲をもった学生には、ぜひ「最初から」その挑戦を進めてほしいですね。


「教科書から読むべき」という人は、「学生がいきなり難しい本を読んでも理解できなくて挫折するから、教科書で基礎をつくった後で取り組むべき」と考えているのでしょう。もちろん、「挫折して勉強嫌いになったら大変だ」という懸念は理解できます。ただ、私の個人的な観測範囲だと、こういうリストに挑戦するタイプの学生は、分からなかったら勝手に解説書を当たるか、巻末の解説を頼りに解読しようとするので、ほっといても大丈夫な気がします(笑)。それに、不思議なもんですが、理解できず30ページぐらいで挫折したとしても、後々、その経験が何かの気付きにつながったりすることが、意外と多いんですよね。


実際問題、必読書リストのせいで迷惑を被ったっていう若者は、存在するんですかね?読んで分からなくても、その場合たいていは読むのをやめるわけで、4年間無意味にページをなぞり続けるわけではないのだから、大きな害はないんじゃないでしょうか。それに、そもそも今の学生って、指定された教科書とネットの解説ぐらいしか読まないタイプが大半でしょう。個人的には、授業で指定された教科書を無視し、授業自体もサボって、哲学書を読みふけっているような学生を応援したいのですが、そんな学生は明らかに減っています。教科書しか読まないってのは、それはそれで大学生活としてはつまらないわけで、だから、必読書リストというものの存在意義はむしろ、「教科書しか読まないタイプの学生」に対する啓発にあると思います。


「お前ら教科書しか読んでなくて恥ずかしくないの?」的な、マウンティングというか、スノビズムの洗礼を受けるのは、なかなかいい経験です。「ニーチェ的な…」とかつい口走ると、「ニーチェの著作で一番好きなのは?」と訊かれて、「いや、ニーチェの本自体は読んだことないけど…」みたいな*1。苦痛は苦痛で、弊害も多いのですが、最近はそういう洗礼がなくなってしまって寂しい感じがします。ただ、教員がそれをやると角が立つし、教員自身もじつは全然読破してないので(笑)、リストから無言の圧力を受けるぐらいがちょうどいいですね。ちなみに、これらのリストを読破したとしても、こんどは(海外文献の場合は)「原書マウンティング」の世界が待ち受けていますので、キリはありません。


まぁ、上記のリストの中には「いきなり読むとマジで苦痛以外のなにも得られない」ものも混じってるかもしれないので、個別に判断したほうがいいのでしょう。でも、少なくとも私が読んだ33冊は大学生がいきなり読んでも問題なかったと思うし、繰り返しますが一般論として「古典・必読書リストをつぶしていく」という取り組みには、大きな意味があるという点を強調しておきたいです。


それと、たとえばウィトゲンシュタインの『論理哲学論考』やハイデガーの『存在と時間』のような本って、先に解説書を読んでいれば理解しやすいんですかね?意外と、そうでもないんじゃないでしょうか。むしろ、ちんぷんかんぷんになりながら作品そのものを読んでから、その後で解説書を当たり、さらに行ったり来たりするというのが、一番効率がいいような気がします。まぁ私はそれでも結局あまり理解できてませんが……。


また、「アリストテレスやカントやハイデガーを読む前に、教科書を読むべき」とか言われると(そもそも哲学に教科書ってあったっけという気もしますが)、なんというか、「女の子に声をかける前に恋愛の指南書を読め」というのに似た違和感があります。順序として指南書から入るのは悪くはないことも多いかも知れませんが、「このリストを読破するために、まず教科書を読もう」って、普通なりますかね?たいていの人間は、そんな悠長な段取りはできなくて、古典文献に対する興味や教養への憧れがあるなら、いきなり古典そのものを読みたいと思うのが人情です。だから、まずいきなり読んでみて、挫折するならすればいいんじゃないですかね。個人的には、そういうのが大学生活の醍醐味だと思っています。

*1:なお、部分的にしか読んでなくても、真剣に読んでいれば案外その思想家の本質は分かるので、その部分的な知識で堂々と議論すればいいと思う

MacのKarabinerが削除できずターミナルでも"su: Sorry"が出るとき

MacでUSキーボードを使っている人が、漢字かなの変換をしやすくするのに、Karabiner-Elementsというソフトがよく使われている。で、そのソフトのアップデートが上手くいかず、アンインストールしてやりなおそうとして、うまく行かなかったという報告がネット上にけっこうある。
自分も今日、その現象にハマってしまったのだが、大事なことを忘れていただけだった。


Macでアプリを削除するときは、AppCleanerとかを使うことが多いけど、Karabinerはその方法では削除できない。権限がどうのこうのという警告がでるので、ターミナルから

su rm -fr Karabiner-Elements.app


とかやるのだが、

su: Sorry


って出て先に進めない。
Mac OSでデフォルトではrootのパスワードが設定されていないために、こうなることはあるらしいのだが、
「su: Sorry」Macでrootユーザーに変更できない - いづいづブログ


Karabinerに関してはそんな問題でなく、単に、GUIで「Misc」のタブからアンインストールすればいいだけだったw
以前も同じことがあって学習したはずだったのだが、完全に忘れていて、30分ぐらい悩んでしまった……。
将来、検索で思い出せるように、ブログに書いておこうと思った。

「シャブ漬け」という比喩は世間でそれなりに使われている

吉野家の役員のくだんの発言については、特に非難したいとも擁護したいとも思わず、「生娘をシャブ漬けにしてる暇があったらうちの職場の近くに店をつくってくれ」ぐらいの感想なのだが(飲食店がほとんどないので)、「シャブ漬け」という喩えはそれなりに耳にする割に、えらい勢いで世間が怒っているなと感じた。まぁ、「生娘」のほうに怒っている人が多いのかもしれないが。
 

マーケティングの先生が、
 


とおっしゃっていて、それはそうだろうと思う一方で、「しかし『シャブ漬け』っていう比喩はそれなりに聞くけど、どんな場面だっけ?」としばらく悩んで思い出したのだが、「補助金」だな。


沖縄では、地元経済界が基地利権に依存しており、それが基地問題の政治的・社会的な解決を阻んでいることを指して、「シャブ漬け」と呼ぶことがよくあるらしい。確かに、何度か聞いたことがある気がする。

俯瞰的に見れば、基地を押し付け、基地と向き合おうとしない本土の人間がいて、沖縄からいくら声を投げ掛けても無視されてしまう状況がある。とりわけ復帰後は沖縄を黙らせるため、徹底的に各種補助金をつぎ込み既得権益層を引き込むという植民地主義的な戦略があった。「シャブ漬け」という言い方をよくするが、悪いのは明らかにシャブを打った方だ。打たれた側がそこから逃れられなくなるという構造が結果として沖縄にある。竜一君は、そのことへの苛立ちを時々口にしていた。
 
琉球新報(2015/12/17)「対談・石川竜一×初沢亜利 沖縄を撮る意味とは」より


社会学者の上野千鶴子氏は以下のインタビューで、沖縄の基地のみならず、国策プロジェクトを進めるに際して多額の補助金で地元の協力を取り付けることを、「シャブ漬け」と呼んでいた。

——沖縄、特に名護は新基地への賛否をめぐり二つに割れることを強いられてきた。地元としては自分たちが招いたわけでもない新基地に振り回されている。
 
「それは国策だから。巨額の金が動く。石原伸晃前環境相が福島について『最後は金目でしょ』と言ったが、沖縄も同じ構図だ。原発だけじゃない、三里塚(成田闘争)も八ッ場ダムも同じ。国策による補助金漬けの構図。シャブ漬け、だ」
 
——政府からすると、シャブ漬けにしているのに言うことを聞かない沖縄にいら立つのだろう。
 
「住民に権利意識が生まれ、受忍限度が下がったから。良いことだ。強姦だって昔は女たちは泣き寝入りしていた。訴えたら、落ち度があるんじゃないかと女の方が逆に責められた。今は女がガマンしないし、ガマンしなくてもよくなった。それに復帰後、沖縄県民も他府県の県民と同じだという平等意識が生まれた。だから『どうして沖縄だけがガマンしなければいけないのか』と思うようになった。当然の変化だと思う」
 
琉球新報(2014/10/29 )「<憲法・女性・沖縄 上野千鶴子さんに聞く>自らの未来決める時/金で魂買う構図変えよう」より


東海道新幹線のグリーン車に置いてある雑誌『WEDGE』では、ふるさと納税がやり玉に挙がっていた。

この2年で激増している「ふるさと納税」は、地方自治体と地方の生産者を”シャブ漬け”に追い込んでいる。
「下りると損」のチキンレースであるため、自治体や個人に自制を求めるのは不可能だ。国が適切な規制をかけるしかない。
(中略)
一方、自治体も”シャブ漬け”のようになっている。そもそも地元から得られる税収が少ない地方の自治体にとって、ふるさと納税による税収増は魅力的だ。通常の税収を超えるふるさと納税金額が集まる自治体さえ出てきており、後に続けと躍起になっている。
 
WEDGE(2016/1/20)「OPINION」より


JALが破綻した当時の前原誠司国土交通大臣と自民党の三ッ矢憲生議員のやり取りのなかで、親方日の丸の上にあぐらを書いた経営を行ってきたことや、公的資金が注ぎ込まれようとしていることが、「シャブ漬け」と呼ばれていた。
(議事録の表現を事後に修正しているかもしれないが、三ッ矢議員が「薬物中毒のどら息子みたいなもの」と言ったのを受けて、前原大臣が「シャブ漬けの息子」と言い換えている。)

○三ッ矢委員 (略)日本航空というのは、私に言わせると、薬物中毒のどら息子みたいなものですよ。生活に困りましたといって、じゃ、生活費の支援をしてあげましょうと。
(略)
○前原国務大臣 これは控えようと思ったんですが、どら息子とおっしゃいましたね。それはだれがどら息子にしたんですかと私は申し上げたいです。シャブ漬けの息子とおっしゃいましたね。だれがシャブ漬けにしたんだと。それを私はあえてここでは申し上げておきたいと思います。
 
第174回国会 国土交通委員会 第14号(平成22年4月21日(水曜日))


経済学者の金子勝教授は2021年のインタビューで、アベノミクス期の日銀の異次元緩和を指して「シャブ漬け」と呼んでいる。

「異次元策の麻薬効果、僕は『シャブ漬け』と呼ぶが、その最大の被害は産業衰退だ。産業の新陳代謝、必要な構造転換を阻んできた。特に製造業だ。その労働生産性は2000年代初めまでは世界一だったが、今や16位(OECD加盟主要31カ国中=19年データ)。あらゆる指標が落ちている。本来は潰れなければいけない電力会社がまだ生きている。原発部門が大赤字の東芝、三菱重工、日立など重電メーカーを異次元緩和で政策的に支えてきた。軽電のパナソニックも身売りの連続。自動車ですら電気自動車、自動運転になったら世界についていけない」
 
サンデー毎日(2021/8/22)「安倍・菅政治の罪と罰/7 金子勝・慶應大名誉教授が五輪後経済と産業衰退の悪夢を語る」より


古い話だが、テリー伊藤氏が小沢一郎氏について、与党の利権に「シャブ漬け」になっていると批判していた。これは補助金とは違うが。

小沢氏の態度について、演出家のテリー伊藤氏は「てっきりテーブルをひっくり返してくれると思ったのに、裏切られた思いだ。『妻とは別れる』とか言いながらセックスして、不倫関係を清算できずにいるダメな男のノリ。与党として甘い汁を吸ったらもう冷や飯食いには戻れないという一種のシャブ漬け状態」とバッサリ。
 
日刊スポーツ(1999/08/14)「自由党 小沢一郎党首 小渕恵三首相と会談し「離脱」の意思を引っ込める」


要するに、国からもらう補助金をはじめとして、「既得権益」「不労所得」「濡れ手に粟」のようなリソースに依存している状態を指して「シャブ漬け」ということがよくあるわけである。
これは「楽な方法に依存してしまうこと」を意味するので、吉野家の役員が単に「牛丼大好き」の意味で「シャブ漬け」と言ったならそれは不適切な用法だろう。仮に、「牛丼という安易な選択肢に頼ってしまい自炊しなくなる」みたいな意味であれば適切であり、大学生時代の私は生娘ではなかったが、シャブ漬けではあったことになる。


ところで、私が「シャブ漬け」という表現を「それなりに耳にする」と思ったのは、仕事で公共事業の関連の話題に触れることが多いためかも知れないので、どれだけ一般的かはわからない。どうなんでしょうね。