名城大学理工学部 応用化学科 永田研究室
トップ 教育 研究 プロフィール アクセス リンク キャラクター ブログ
トップ  >  ブログ

 

ブログ「天白で有機化学やってます。」 ブログ「天白で有機化学やってます。」

論文審査の問題(「現代化学」11月号より)2021/11/03(水)

 「現代化学」の11月号、有賀克彦先生の「論文審査は本当にきちんとされているのか?」という記事を拝読しました。JACSのアソシエイト・エディターを務められた中村栄一先生のコメントも合わせて読むと、おおむね「各国学会が発行している学術雑誌の査読はきちんと行われている。一方、一部の商業学術雑誌の方針には疑問あり」ということになるかと思います。

 中村先生が指摘される商業誌の問題点として、「時流に乗るのは仕方ないとしても、『流行の研究を作り出す』ことを狙っているところに問題がある」と書かれています。敏腕の雑誌編集者であれば、「流行を作り出す」ことは、利益を最大化するための理想的なあり方でしょう。とは言え、彼らは「商業誌の編集者」なのですから、「利益を追求する」ことは当然です。だとすると、問題は、そのような商業誌のあり方に乗っかっている研究者の心構え、ということになりますね。要するに、「Nature系の雑誌にたくさん論文を出すために、研究戦略を最適化する」みたいな方向に行ってしまうと、それはちょっと違うんじゃないの、ということになります。

 有賀先生はBCSJ(日本化学会の欧文誌)の編集委員長を務めていらっしゃいます。私の学生時代は、BCSJはハードルの低い雑誌で、よっぽどへぼい内容でなければ、データや議論の形式をきちんと整えればだいたい受理してもらえました。今はまったく様変わりしていて、私ぐらいのレベルだと、かなり気合を入れないと投稿できないハイエンドジャーナルになってしまいました。しかしこれは喜ばしいことです。国の化学会の主力雑誌は、その国の化学の研究レベルを反映します。BCSJがぼちぼちだった時代も、日本化学会の速報誌 Chemistry Letters はレベルが高く、日本の化学研究は国際的に高く評価されていました。有賀先生は「BCSJのハードルをあまり高くするつもりはない」とおっしゃってますが、自然に高くなっていくのは歓迎すべきことだと思います。

 ただ一方で、もっと「気軽に出せる」雑誌はあってもよいと思うのですね。上記の記事の中で、東北大の西原洋知先生からの「論文はすべてオープンアクセス、掲載料を払えば即掲載、入り口の審査ではなく事後評価で価値を決める」というご提案が紹介されています。私はこの方向性には賛同しますが、事前審査はやはり必要かなと思います。論文が「査読付きで公開されたかどうか」には、一定の重みがあると思うからです。いわゆる「メガジャーナル」がそちらの方向性ですが、掲載料が高いんですよね。

 日本化学会のメガジャーナルを作って、「ハイインパクトな仕事は BCSJ, そうでもない仕事はメガジャーナル」という流れが確立すれば、日本の化学研究がまた活性化するんじゃないかな、と感じます。投稿するのは日本人ばっかりになるかもしれませんけど、昔の BCSJ だって Chemistry Letters だってそうだったし、そこから徐々に地位を上げていったわけです。「国際化」の呪縛に最初からとらわれることもないんじゃないかな、と思います。冊子体を航空便で送っていた時代とは違って、オープンアクセスの電子ジャーナルなら世界中どこからでも読めるわけですからね。

Keynote から PowerPoint に書き出すと図がぼける問題:その後2021/09/23(木)

以前、「Keynote '09 から PowerPoint に書き出すと図がぼける問題」というのを書きました。その後、徐々に PowerPoint への移行を進めていますが、相変わらずこの問題には悩まされています。前回書いた方法でやろうとすると、「対応する画像を探す」のが非常に大変なのです。図の数が少なければよいのですが、100個近くの図があるスライドだと、1個ずつ作業するのはかなり苦痛です。結局、Keynote と PowerPoint のファイルを両方開いて、PowerPoint 上の図を右クリックして「画像の変更…」で置き換える方が楽です。

要するに Keynote のエキスポート機能がヘボだからこういう憂き目に遭っているわけです。本当は自動化できるはずのことを、手動でやらされるのは、どうにも納得がいきません。しかも、あと少しのところなのです。Keynote と PowerPoint の図の対応が自動でつけられれば、全部自動化が可能なはずなのです。

というわけで、ちょっと頑張りました。ここからは Python ガチの話になります。

まず、numpy, opencv-python, scikit-image を入れておきます。私は "Numeric" という venv 環境を作って、そこにインストールしています。

$ python3 -m venv Numeric
$ source Numeric/bin/activate
(Numeric) $ pip3 install numpy
(Numeric) $ pip3 install opencv-python
(Numeric) $ pip3 install scikit-image

.pptx, .key ファイル名をコマンドラインから読み込んで、それぞれ一時ディレクトリに展開します。

file_pptx = sys.argv[1]
file_key = sys.argv[2]
tmpdir = os.environ['TMPDIR']
basename_pptx = os.path.basename(file_pptx)
basename_key = os.path.basename(file_key)
tmpname_pptx = tmpdir + basename_pptx + ".folder"
tmpname_key = tmpdir + basename_key + ".folder"
subprocess.run(["rm", "-rf", tmpname_pptx])
subprocess.run(["rm", "-rf", tmpname_key])
os.makedirs(tmpname_pptx)
os.makedirs(tmpname_key)
shutil.copy(file_pptx, tmpname_pptx + os.sep + basename_pptx)
shutil.copy(file_key, tmpname_key + os.sep + basename_key)
subprocess.run(["sh", "-c", "cd \"" + tmpname_pptx + "\"; unzip " + basename_pptx], stdout=subprocess.PIPE)
subprocess.run(["sh", "-c", "cd \"" + tmpname_key + "\"; unzip " + basename_key], stdout=subprocess.PIPE)

画像ファイルの一覧を取得します。".pdf" から ".png" への変換が問題なので、その組み合わせだけです。

list_pptx = glob.glob(tmpname_pptx + "/ppt/media/*.png")
list_key = glob.glob(tmpname_key + "/*.pdf")
base_pptx = [os.path.basename(n) for n in list_pptx]  #  表示用のベースネーム
base_key = [os.path.basename(n) for n in list_key]

画像ファイルのサイズを取得します。ここは ImageMagick の identify コマンドを使っています。ImageMagick は、自力でビルドするのは非常に大変なので、Homebrew でインストールしました。

size_pptx = []
size_key = []
for i in range(len(list_pptx)):
  res = subprocess.run(["identify", "-format", "%[width],%[height]", list_pptx[i]], stdout=subprocess.PIPE)
  sizelist = [int(x) for x in res.stdout.decode('utf-8').split(",")]
  size_pptx.append(sizelist)
for i in range(len(list_key)):
  res = subprocess.run(["identify", "-format", "%[width],%[height]", list_key[i]], stdout=subprocess.PIPE)
  sizelist = [int(x) for x in res.stdout.decode('utf-8').split(",")]
  size_key.append(sizelist)

サイズが似ているもの(差が1ピクセル以内)の組み合わせを探します。

original_pptx = [[] for i in range(len(size_pptx))]
converted_key = [[] for i in range(len(size_key))]
for i in range(len(size_pptx)):
  for j in range(len(size_key)):
    if abs(size_pptx[i][0] - size_key[j][0]) < 2 and abs(size_pptx[i][1] - size_key[j][1]) < 2:
      original_pptx[i].append(j)
      converted_key[j].append(i)

さあここからが本番です。画像の類似性判定について、いろいろ調べたのですが、skimage.metricsstructural_similarity が一番うまくいきました。画像の読み込みに OpenCV, データの処理に NumPy を使うので、これらを使えるようにしておきます。(他にも import はいろいろ必要ですが、省略しています)

import cv2
import numpy as np
from skimage.metrics import structural_similarity

類似性判定です。まず pdf を ImageMagick の convert コマンドで png に変換したあと、サイズを合わせます。私が使う画像は線画が多いので、あまりエッジが鋭いと判定がうまくいかないかもしれません。そこで、cv2.blur で少しぼかします。そのあと、structural_similarity で類似性を判定し、一致度が最大のものを選びます。

for i in range(len(original_pptx)):
  if len(original_pptx[i]) > 1:
    #  pptx の画像を読み込む
    image1 = cv2.imread(list_pptx[i], -1)
    if image1.shape[2] == 4:
      #  アルファチャンネルを統合
      alpha = image1[...,-1:].astype("float32") / 255
      image1 = image1[...,:-1] * alpha + 255 * (1 - alpha)
      image1 = image1.clip(0, 255).astype("uint8")
    img_size = (image1.shape[1], image1.shape[0])  #  shape[1]が幅、shape[0]が高さ
    #  ぼかす
    image1 = cv2.blur(image1, (3, 3))
    simmax = None
    jmax = None
    for j in range(len(original_pptx[i])):
      #  original_pptx[i][j] の画像を png に変換する(変換済みならそれを使う)
      original_png = re.sub(r'\.pdf$', '.png', list_key[original_pptx[i][j]])
      if not os.path.exists(original_png):
        res = subprocess.run(["convert", list_key[original_pptx[i][j]], "-define", "png:color-type=2", original_png])
      #  変換した画像を読み込む
      image2 = cv2.imread(original_png)
      if image2.shape[1] != img_size[0] or image2.shape[0] != img_size[1]:
        #  いったん2倍にリサイズしてから、先ほどと同じサイズにする
        image2 = cv2.resize(image2, (img_size[0]*2, img_size[1]*2))
        image2 = cv2.resize(image2, img_size)
      #  ぼかす
      image2 = cv2.blur(image2, (3, 3))
      sim = structural_similarity(image1, image2, multichannel=True)
      print("comparing {} and {}; sim = {}".format(base_pptx[i], base_key[original_pptx[i][j]], sim))
      if simmax == None or simmax < sim:
        simmax = sim
        jmax = j
    #  一致度が最大のものを選ぶ
    print("{} is selected".format(base_key[original_pptx[i][jmax]]))
    original_pptx[i] = [original_pptx[i][jmax]]

実験してみました。下の画像の類似性判定で、一致度が図のようになっています。なかなかのものです。この2つの画像が区別できるんだったら、大丈夫でしょう。

あとは、少し解像度高めの画像を convert で作成して、差し替えて、PowerPoint フォーマットに戻せばできあがりです。

#  png ファイルを入れ替える
for i in range(len(original_pptx)):
  if len(original_pptx[i]) > 0:
    res = subprocess.run(["convert", "-density", "288", list_key[original_pptx[i][0]], "-define", "png:color-type=6", list_pptx[i]])

#  新しい pptx ファイルを作成する
basename_fixed = re.sub(r'\.pptx', '_fixed.pptx', basename_pptx)
file_fixed = re.sub(r'\.pptx', '_fixed.pptx', file_pptx)
subprocess.run(["sh", "-c", "cd \"" + tmpname_pptx + "\"; zip -r \"" + basename_fixed + "\" '[Content_Types].xml' docProps ppt _rels"], stdout=subprocess.PIPE)

subprocess.run(["mv", "-f", tmpname_pptx + "/" + basename_fixed, file_fixed])
print("Fixed file {} was successfully created.".format(file_fixed))

実運用を始めるといろいろ問題が出てきそうな気がしますが、その都度対応していこうと思います。

有機化学2の授業アンケート2021/08/26(木)

有機化学2の授業アンケートの結果を受け取りました。いろいろご意見をいただき、ありがとうございます。大学にもアンケート回答を提出しましたが、こちらでも書いておきたいと思います。

小テストの解説を WebClass に載せて欲しい。

講評は載せていましたが、あまり詳しい解説は載せていませんでした。ただ、小テストは基本的には授業でやった内容なので、解説なしでも解答にたどりつけるのが本来の姿なんですよ。講評を元に、自力で理解を深めていただきたいと思っています。

小テストの問題を後で見られるようにして欲しい。

これねえ、気持ちはすごくわかるし、その方が勉強しやすいのは間違いないと思う。でもね、小テストの問題を公開すると、どうしても「問題と答えの組み合わせを覚えて乗り切ろうとする」人が出てきてしまうんですよ。そういう人はたいがい単位が取れないんだけど、評価の精度が下がってしまいます。正攻法で取り組む人をきちんと評価するためには、こちらから問題を公開しない方がいい、と思っています。小テストの「講評」は事前に WebClass に出していますし、それを元に当日の解説をやっていますので、ここをしっかり聞くことで補って欲しいと思います。

小テストの解説を「見逃し配信」に含めていないのも、同じ理由です。だから、小テストの解説は、講義当日の最初に聞くほかチャンスがない。でも、「一度しかないチャンスをちゃんと生かす」ことも、大事だと思うのです。

(遠隔講義の分の)添削が見つけにくかった。

こちらも不慣れで、みなさんから WebClass がどう見えているのかいまいちよくわからなかったんです。今回でだいたいわかったので、今後は案内できると思います。みなさんも WebClass の学生用マニュアルを一通り読んでおいてくださいね。(応化実験2・3でも WebClass を多用しますので。)

小テストの解説を詳しくやってほしい。

あんまり時間をかけると講義本体にしわ寄せが行くんだよね……講義内容を圧縮して、解説増やした方がいい? そっちの方がみなさんにとって大変だと思うんですけど。

小テストの時間を毎回10分は必ずとって欲しい。実力が発揮できない。

講義時間の管理がちゃんとできてなかった(余分なことをしゃべり過ぎた)回が何度かありました。これは反省点です。今後改善していきたいと思います。それにしても、「実力が発揮できない」ってすごいな。実力あるんだったら、あの程度の問題は瞬殺してよ。

課題シートにある質問の欄は、復習の量が多いと窮屈に感じた。

「質問」を消して復習欄に使ってもらって良かったんですけどね。わざわざ「質問」欄を作っているのは、質問があるときにその方が書きやすいと思ったからです。

生徒の状況などを読み取った解説や指導、グループワークなども取り入れられておりよかった。

ありがとうございます。「生徒」と言っちゃだめですよ。「学生」です。「生徒」は「教えてもらう人」、「学生」は「自ら学ぶ人」です。ぜんぜん違います。グループワークはやっぱり入れた方がいいんですかね。演習科目はともかく、講義科目にグループワークを入れることには、私の中でかなり迷いがあります。理解を深めるのに役立つのであれば、積極的に取り入れていきたいのですが、まだよくわかりません。

有機化学基礎・有機化学2の成績2021/08/25(水)

前期の成績集計が終わりました。1年生配当の「有機化学基礎」と2年生配当の「有機化学2」の成績分布を公開します。前回はこちら、前々回はこちらです。前回は全面遠隔講義で、条件がいろいろ違いすぎるので、直接比較はできません。

まず、1年生配当の有機化学基礎の成績分布です。(前回までは「有機化学2」を先に示していたので、比較の時には注意してください。)

この講義は3回目ですが、一昨年の合格率は 88% でした。試験のレベルはあまり変わってないので、ついて来れない人が少し増えています。単位を取れなかった人の傾向を調べてみると、「予習・復習」が不十分な人(3段階評価で平均が2未満)は4人で、それほど多くありません。はっきり相関があるのは、小テストの点です。不合格者は全員、小テストの点が6割未満(30点満点で18点未満)でした。理解できていない項目が小テストで明らかになっているのに、それを放置している、という図式です。しっかり振り返って、後期で巻き返してください。

次に、有機化学2の成績分布です。

今回は厳しい結果になりました。といっても、過去3年(昨年度を除く)の合格率が 50%, 46%, 57% と推移してきましたから、平常運転といえば平常運転です。やはり、昨年の全面遠隔講義の評価は、甘すぎたようです。全面遠隔講義に戻ることはあまり考えたくありませんが、今後そういう事態になった場合は、評価方法を考えないといけませんね。

昨年度から新カリキュラムになって、今まで1年で済ませていた有機化学の講義内容を1年半で行うようになっています。多少は新しい内容も入っているのですが、基本的にはより説明を丁寧にする方向でカリキュラムを組んでいます。だから、本当はもう少し合格率が上がらないといけないんだよな。60% は行ってほしいところでした。

有機基礎と同様に、不合格だった人は、だいたい小テストの平均点が6割に達していません。不合格になる人は、小テストを通じた「ふりかえり」をしていないと思われます。小テストの問題は公開していませんから、講義の時の解説をよく聞いておかないといけません。気づいていなかった人もいるようですが、小テストの講評は毎回 WebClass に載せていました。こちらから提供しているリソースを、最大限に活用してもらう必要があります。リソースを自分で見つけるのも、大学生として必要な能力の一つです。

オープンキャンパス:対面型は終了、Webは継続中!2021/08/02(月)

2021年度のオープンキャンパスは、対面型と Web の併用で進めております。対面型は予約制で、先週末に無事終了しました。ご来場いただいた方は、どうもありがとうございました。暑かったのですが、お疲れは出ませんでしたでしょうか。

Web オープンキャンパスは継続中です! 「名城大学受験生応援サイト」からご訪問ください。また、キャンパス見学会など、その他のイベントも鋭意(入学センターが)企画しておりますので、合わせてご覧ください。

キャンパスの雰囲気は、大学生にとってはやっぱり大事な要素だと思います。私たち教員の立場では、「何を学べるか」ばかりに目が行ってしまうのですが、大学生活は、「何を学ぶか」に加えて、「どういう環境で学ぶか」もまた重要です。私は、名城大学の正門から入って行くところの並木道が大好きだし、タワーと北館・南館に囲まれたちょっとした広場の雰囲気も好きです。Web でも動画でのキャンパスツアーがあるようですので、そちらもぜひ見てみてください。

次の記事: LED光反応装置を作った
記事一覧: 2020年 2019年 2018年 2017年 2016年 2015年 2014年 2013年