紙の日記、全く長続きしないのでやはりここに書こうと思う。
朝、今日薬剤散布をするのであれば今か夕方かという相談があった。この時期の薬剤散布は難しい。だいたい、農薬というのは散布後に乾かなかったり、散布時に温度が高すぎたりすると薬害の危険性が高まるのでこれを避けるように時間を選択する。日照時間が短い冬なら午前中だし、春〜夏なら夕方といった具合に。日中、施設内はかなり暑いし、日照時間も長くなってきたが、この時期の天気は変わりやすい。夕方に散布して乾かず、夜がぬるく経過して暖房機も回らない、というのが一番まずそうなので、早めに散布したほうがいいのではと返事をしてしまった。午後からはあまり天気が良くなかったので、結果的にはよかったのかもしれないが、この手の相談はいつでも不安が残る。
夕方、車検(5回目)に出していたデミオを回収に行ってきた。代車に来たのは一番新しいデミオだった。新しいだけあって静かで燃費が良くてよく走る。が、ステアリングが太かったりアクセルペダルがオルガン式で慣れなかったり低速時のパワステが軽すぎたりでなんだか疲れてしまった。慣れの問題だとは思うけど、当分車は買い換えないと思う(財布の問題も大きい)。車屋の話ではやはりディーゼルが人気とのこと。入浴剤やらドーナツやらいろいろくれた。具合悪そうだったからか、マスクも付けてくれた。

gap.plot()で省略される部分のラインを途中まで描く

plotrixパッケージに含まれるgap.plot()関数は、データの途中を省略したプロットを行う関数で、以前に少し紹介した。

このとき、typeに"o"、"l"、"b"などを指定した場合、省略範囲にかかるラインは描画されない。
f:id:Rion778:20141208233336p:plain
省略部分(まで|から)のラインも欲しい場合があるかもしれない。
要するに、こんなかんじの図である。
f:id:Rion778:20150113004548p:plain
上記の図を描くためにgap.plot()に少し小細工をしたものを用意した。

gap.plot.addline <- function(x, y, gap,
                             breakcol = "black",
                             breaklty = 1,
                             xlim = range(x), ylim = range(y),
                             xtics = NA, ytics = NA,
                             lty = rep(1, length(x)),
                             col = rep(par("col"), length(x)),
                             pch = rep(1, length(x)),
                             add = FALSE, stax = FALSE,
                             type = "p",
                             main = "", xlab = "x", ylab = "y")
    {
        ## まずgap.plotする
        gap.plot(x = x, y = y, gap = gap,
                 bgcol = "white", breakcol = "white", # 別途ablineで引く
                 xtics = xtics, ytics = ytics,
                 lty = lty,
                 col = col,
                 pch = pch,
                 add = add,
                 stax = stax,
                 type = type,
                 brw = 0,
                 main = main, xlab = xlab, ylab = ylab
                 )
        ## gap上下の値を計算
        lreg.idx <- max((1:length(y))[y < gap[1]]) # 下範囲の最大値のインデックス
        ureg.idx <- min((1:length(y))[y > gap[2]]) # 上範囲の最小値のインデックス
        lreg.x <- x[lreg.idx]; ureg.x <- x[ureg.idx] #x
        lreg.y <- y[lreg.idx]; ureg.y <- y[ureg.idx] #y
        ## 傾きを計算
        grad <- (ureg.y - lreg.y)/(ureg.x - lreg.x)
        ## 線引き
                                        # 下から境界まで
        lines(x = c(lreg.x,lreg.x + (gap[1] - lreg.y)/grad),
              y = c(lreg.y, gap[1]),
              col = col, lty = lty)
#             type = type,  pch = pch) # 特定のポイントを消す方法が欲しい…
                                        # 境界から上まで
        lines(x = c(ureg.x - (ureg.y - gap[2])/grad , ureg.x),
              y = c(gap[2], ureg.y) - diff(gap), # y軸の値からはgap分を差し引く必要がある
              col = col, lty = lty)              # gap.plotでadd=TRUEして追加した場合を除き、
#             type = type, pch = pch)            # y軸目盛りは下領域が延長されていると考えなければならない。
        ## 省略位置のラインは改めて引く
        abline(h = gap[1],
               col = breakcol,
               lty = breaklty)
    }

これをこのように使うとさっきの図が描ける。

gap.plot.addline(
    x, y, gap, breakcol = breakcol, breaklty = 2,
    ytics = ytics, type = type, col = col)
## 省略線をaxis.breakで記入しないと不自然
axis.break(5, axis = 2)
axis.break(5, axis = 4)

概ねもとのgap.plot()の感じで使えるが、多少制限がある。基本的には面倒だから制限になってしまっているだけなので、頑張ればきっとなんとかなる。

  • gapの指定は1カ所分しかできない(gap.plot()は2カ所)。
  • データは右肩上がりで省略範囲を通過すること。
  • 省略範囲を通過するのは1回だけであること(もとのgap.plot()も複数回省略範囲を通過するようなデータはうまくプロットできない)。
  • xの昇順でデータはソート済み(別に関数の中でソートするように修正すりゃいいのかもしれない)。
  • gapの厚み(brwで指定するもの)はゼロで固定(プロット範囲に対する相対値だったので、計算が面倒になってやめた)。
  • typeが"b"だと不自然(線の始点がポイントの中央なので重なってしまう)。

最後の点については、特定のポイントのみ描画なしにできれば解決できるんだけどそのような方法が見つからなかったので諦めた。これは頑張ってもだめかもしれない。
また、brwを0で固定している関係上、gap部分を線で示す必要性があろうかと思うので、ablineで別途指定できるようにもしてある。

Majestouch MINILA買った&また改造した

職場で使う用にMINILAの黒軸を購入したので、前回(Majestouch MINILA買った&Mac用にとりあえず改造した - もうカツ丼はいいよな)と同じような感じで少々いじった。
http://instagram.com/p/xT5JCESp13/
基本的には前回と同様で、Fnキーへの変換・無変換割り当てとCapsLockへのFnキー割り当てを行った。
その他、無変換キーのあった場所にAltを割り当てた。
iPhoto
作業途中の写真なので元々の状態と異なるが、無変換キーのキーマトリクスパターンはC1とR5で、これをひっくり返して少し右(上から見れば左)にずらすとC9とR3に配線されてAltキーになる。これは要するにUS配列の場合のAltキーの位置になる。
位置がずれている関係上そのままでは入らないが、少し足を曲げてやれば入った。
f:id:Rion778:20150101213936j:plain
黒軸は茶軸よりは明らかに静かだけど思ったよりは音がするという印象。撫で打ちができるようになれば違うのだろうか。

Rでinstall.packages()しようとしたらエラー

すごく久しぶりにRでinstall.packages()してみたら、

> install.packages("ggplot2")
--- Please select a CRAN mirror for use in this session ---
Error: .onLoad failed in loadNamespace() for 'tcltk', details:
  call: dyn.load(file, DLLpath = DLLpath, ...)
  error: unable to load shared object '/Library/Frameworks/R.framework/Versionsc/3.1/Resources/library/tcltk/libs/tcltk.so':
  dlopen(/Library/Frameworks/R.framework/Versions/3.1/Resources/library/tcltk/libs/tcltk.so, 10): Library not loaded: /usr/X11/lib/libXft.2.dylib
  Referenced from: /usr/local/lib/libtk8.6.dylib
  Reason: image not found

とかなんとか出てきて止まってしまった。おそらくOS XYosemiteにしてからはじめてパッケージインストールを試みたので、そいつが原因だったとは思う。
検索したら同じような症状で困ってる人と解決方法を提示している人が出てきた。

r - Rcmdr launch error in Yosemite (OS X 10.10) - Stack Overflow
書いてあるとおり*1にターミナルから

sudo ln -s /opt/X11 /usr/X11

とやったら無事復帰。

TypeError:['@@iterator'] is not a function

Firefox34.0.5にした(された)ら見出しのようなエラーが出てVimperatorがうんともすんとも言わなくなってしまって大分焦ったけど、_libly.jsを新しいものにしたら直った。

別に家の外では使ってないのにVimperator動かないだけで大分不便。

ギャップのあるデータを途中を省略してプロットする

ギャップのあるデータ

例えばこのようなデータが有るとする。

testdata <- data.frame(x = 1:10,
                       y = c(1,3,2,4,3,21,23,22,24,23))

前半と後半の間にデータの大きな飛躍があるため、そのままプロットすると前半部、後半部の変化が相対的に小さくなって見難くなる。

## 通常のplot
plot(testdata, type = "b")

f:id:Rion778:20141208232141p:plain
実際そうなのだから別にこれで良かろうという意見もあろうかと思う。が、やむを得ない事情から中間部を省略しなければならないという状況に立たされる場合もあるかもしれない。きっとある。あるに違いない。

plotrixパッケージ

そのようなことをするためのツールを含め、なんか色々入ってるplotrixパッケージというものがある。

今回はこれを使ってデータを省略したプロットをやってみる。

install.packages("plotrix") #インストールして
library(plotrix)            #読み込む

gap.plot関数

途中を省略したいという要求はgap.plot関数を使えば叶う。

## gap.plot
gap.plot(testdata$x, testdata$y,        #dataframeはそのまま渡せない
         gap = c(5, 20),                #省略範囲を指定する必要がある
         ytics = 1:25,                  #ラベル位置は指定したほうが良い
         type = "b"                     #plotに指定できるオプションは大抵指定できる
         )

通常のplotと似たような使い方が出来るが、plotほど空気を読んでくれない部分もあるので引数は丁寧に指定したほうが良い。
xとyに対応するデータ、省略範囲の指定は必須である。
「gap.axis = "x"」を指定すればx軸の省略もできるが、両方一度に省略することはできない。
また、gapに4つの数値を指定すれば2つの範囲を一度に省略することができるが、3つ以上はできない。
ラベルは普通にやると適切に配置されないので指定したほうが良い。
結果はこうなる。
f:id:Rion778:20141208233336p:plain
このように、2つのグラフが隙間をあけて並べられたような形になる。他にもgap.boxplotやgap.barplotがあり、同様のプロットが簡単にできる。
「コレジャナイ…」という意見もあろうかとは思う。が、誤解を防ぐためにはギャップを明確に示したほうが良いというのが作者の意見の様である。ただし、このギャップ部分は色や大きさを調整できるので、見えないように調整することもできる。後述のaxis.breakと組み合わせると誤解を招きやすい感じにすることもできる。

axis.breakで軸に省略線を入れる

「『傾いた=みたいなので軸を省略してあるやつ』が欲しいんだよ」という意見があろうかと思う。この「傾いた=みたいなの」を入れるためだけの関数がaxis.breakである。
axis.breakに位置と目的の軸番号を指定するだけで記入できる。
これを、gap.plotの引数を調整してギャップ部分を見えなくしたグラフに組み合わせると、こんな感じになる。

## axis.breakと組み合わせる場合
gap.plot(testdata$x, testdata$y,
         gap = c(5, 20),
         brw = 0,                       #隙間はオプションで調整できる
         breakcol = "white",            #色も指定できる
         ytics = 1:25,
         type = "b"
         )
## 省略線をaxis.breakで記入する
axis.break(5, axis = 2)                 #位置と軸が必要
axis.break(5, axis = 4)

f:id:Rion778:20141208234446p:plain
これで、いかにも誤解を誘いそうだが一応言い訳はしてあるんだよという感じのグラフの完成である。
ちなみに、tyepに"l"や"b"を指定した場合、ギャップをまたぐ部分のラインは描画されない。これに関しては、傾きとギャップ部分の交点座標を求めるなどしてlines関数で別途対応すれば一応描ける。地味で面倒な作業なので今回は説明しない。

Majestouch MINILA買った&Mac用にとりあえず改造した

http://instagram.com/p/vf8EtCyp9T/
なんかMacでも使えるらしいという曖昧な情報を元にMINILAを買ってしまった。スペースキーの両隣にFnキーが付いてるのが若干気になったけど、まあKarabinerとかでなんとかなるだろうと思っていた。

どうにもならなかった…。

なんか単独ではイベントが発生しないとかなんとか…。
なんとかできないもんかとググってみたら改造してる人が居たので見よう見まねで改造することにした。
[親指シフト]MINILA US67keyに親指シフトキーを追加 - かもめ~る通信
バラす方法もここを参考にした。
MINILA分解手順 - かもめ~る通信
割と苦労した。
バラしたはいいけど軸の外し方が分からず、危うく壊すところだった。
軸の外し方はこの動画が参考になった。

FILCO Majestouch (マジェスタッチ) を分解・修理してみた(repair) - YouTube
配線の仕方がよく分からなかった(最初のサイトの方法ではダメだった。USとJPの違いなのかもしれない。)けど、最終的にこのようにしたら目的の動作をするようになった。
http://instagram.com/p/vgTY9DSp-w/
さらに、Seil(Seil - OS X用のソフトウェア)をインストールしてFor Japaneseの次の項目にチェックした。

  • Enable NFER Key on PC keyboard
  • Enable KATAKANA Key on PC keyboard(keycodeは104に)

とりあえずこれでFnキーが英数/かなとして動作するようになった。
当然このままだとFnキーが潰れてしまう。CapsLockに配線するという手もあるけど、そもそもFnは音量調整くらいにしか使ってなかったので、音量調整さえできれば別に困らない。とりあえず夜遅くなってしまったのでFnをどうするかはまた今度。

(追記:2014/11/18)
考えるのも面倒だったので結局CapsLockにFnを割り当てた。
http://instagram.com/p/vijko0yp7q/
Karabinerで「F10, F11, F12 to Speaker Controls」を有効にして終わり。

Excelでエラー値を表示させなくする方法

Excelで印刷用の資料を作成していると(そもそもするなという話だが)、VLOOKUPなんかでエラーが帰ってきた場合にそれを表示したくないという場面がしばしばある。その解決方法3つ。

1. 条件付き書式を使う

Excel for Mac 2011の場合だがスタイルを「クラシック」、対象を「指定の値を含むセルだけを書式設定」、値を「エラー」、書式を「ユーザー書式設定」にして書式設定で文字色を白、背景色を無しにすればエラーの場合に画面上には何も表示されなくなる。
%E6%96%B0%E3%81%97%E3%81%84%E6%9B%B8%E5%BC%8F%E3%83%AB%E3%83%BC%E3%83%AB
条件付き書式設定のあまり高度な機能を使っていないので、割と古いバージョンのExcelでも動く。また、後から設定するのも比較的簡単。
ただ条件付き書式というのはされているのかされていないのか分かりにくい機能なので、人に渡す可能性があるファイルではやらないほうが良い。

2. IFとISERROR関数を組み合わせる

=IF(ISERROR(式), "", 式)

このようにすれば、式の評価結果がエラーの場合は空文字列、そうでなければ評価結果が表示される。
古いバージョンのExcelでも動き、条件付き書式と違って小細工をしていることが伝わりやすい。
ただ、空文字列は空白セルとは異なるので、その点は頭に入れておく必要がある(cf. Excelの空白セルと空文字列 - もうカツ丼はいいよな)。
また、式を2回書く必要があり、無駄に計算量が増える上、既に入力されてしまったものを直そうとするとかなり面倒である。

3. IFERROR関数を使う

=IFERROR(式, "")

IFERROR関数は第一引数に与えられた式の評価結果がエラーなら第二引数の値を返し、そうでなければ式の評価結果を返す。
式を複製する必要がなく、前後に「IFERROR(」と「,"")」を追加すれば良いので、既に入力されてしまった式への対処も比較的容易である。
ただし、IFERROR関数が比較的新しい関数なので、Excelのバージョンが古いと使えないという問題がある。といってもOffice 2007以降なら使えるので使用できる場面は広いと思う。現状では最もスマートな解決方法だと考えている。

結論

Excelで書類作成なんかしてはいけない。

害虫の薬剤抵抗性

害虫の薬剤抵抗性

ある害虫に対し特定の農薬を使い続けていると農薬の効果が低下してくる現象があり、薬剤抵抗性と呼ばれている。その歴史は古く、1908年にアメリカで柑橘の害虫であるナシマルカイガラムシの石灰硫黄合剤に対する感受性が低下したのが最初の事例と言われる。また、我が国の事例では衛生害虫ではシラミのDDT抵抗性(1950年代)、農業害虫では柑橘類のミカンハダニのシュラーダン抵抗性が最初の事例と言われている。
薬剤抵抗性の事例は病原菌や雑草でも近年大きな問題となっているが、特に害虫類(ダニ含む)での事例は1950年以降急激に増加を続けている。
また、過去には抵抗性が発達しにくいとされていたBT剤やフェロモン剤にも抵抗性の事例があり、抵抗性と無縁であり続けられる農薬はほとんど無い。

薬剤抵抗性の発達

農薬の多くは自然界に多量に存在することのない人工的な物質から構成されていることから、農薬そのものが抵抗性を誘導するのではなく、突然変異により抵抗性を持った固体が僅かな割合で常に存在しており、これが農薬による淘汰圧にさらされることで選抜される、と考えられている。
また、植物をエサとする害虫類は、植物が害虫に対する防御物質として生成するニコチンやアルカロイドなどの殺虫成分を解毒する作用をもともと持ち合わせており、これが農薬のような殺虫成分に対する抵抗性の起源とも言われる。それを示す事例として、チョウ目の幼虫のような雑食性が強く様々な植物を食べる機会があると想像される昆虫では、薬物酸化酵素活性が高い傾向が認められる。

交差抵抗性

特定の農薬に抵抗性を示す害虫が、それまで使われたことのない別の農薬に抵抗性を示す場合があり、交差(叉)抵抗性と呼ばれている。
これは特に同一系統に属する薬剤で発生しやすいが、系統によっては同一系統の別薬剤に交叉抵抗性を生じやすいものと生じにくいものがあり、単純ではない。また、害虫の種類によっても発達の仕方が異なる。

抵抗性を発達させない方法

抵抗性を発達させる方法を考えてみよう。最も効率的なのは、最初に弱い淘汰圧を掛けて抵抗性に関連する遺伝子を個体群に集積させていき、その後淘汰圧を高める方法だ。
すなわち、農薬は不必要に薄い濃度で散布してはならない。規定の倍率を下回る濃度で散布しても法的な問題は無いが、充分な効果が得られなかったり、抵抗性が発達したりしてかえってたくさんの農薬を散布しなければならない事態になりかねない。
また、同一の個体でも生育ステージによって薬剤への感受性は異なる。チョウ目の幼虫などは生涯で体重が何十倍、何百倍にもなる。すなわち、同じ濃度・量で薬剤を処理しても、害虫の側としては全く状況が異なる。例えば幼虫がかなり大きくなるハスモンヨトウなどは、終齢幼虫まで生育してしまうと薬剤による防除が非常に困難になる。
その他、害虫の密度も抵抗性の発達に影響してくる。害虫の密度がそれほど高くなければ、抵抗性遺伝子を持った個体がわずかに生き残ったとしても、交尾の機会に恵まれずに抵抗性個体群の発達を抑止できる。
いずれにせよ、重要なのは発生初期を見極めて適切に防除することである。

ローテーション防除

抵抗性発達防止のためには、異なる系統の薬剤を輪番使用することが効果的とされてきた。薬剤に対する感受性は農薬の散布を中止することで回復する場合がある。ただし、農薬によっては感受性の回復しやすいもの、しにくいものがあり、また交叉抵抗性は必ずしも同一系統の農薬だから生ずるというものではないため、これも完璧ではない。

ブロック式ローテーション

現在最も有効な抵抗性管理手法とされているのが、IRAC*1(Insecticide Resistance Action Committee, 殺虫剤抵抗性管理委員会)の推奨するブロック式ローテーションである。この方法は従来のローテーション防除と基本的な考えは同じだが、以下の2点が特に異なっている。

  • 殺虫剤を成分ではなくその作用機構(MoA: Mode of Action)により分類する。
  • 害虫の1世代を「ブロック」と考え、隣接する「ブロック」に同じMoAに属する薬剤を散布しない。

すなわち、世代をまたがって同一作用機構の薬剤を散布しないようにすることで、薬剤抵抗性の世代を超えた発達をストップさせるのである。
MoAは数字とアルファベットの組み合わせによって「1A」のように定められる。基本的には、同じ数字の薬剤が世代をまたがって散布されないように注意すれば良い(逆に言えば、同一世代内であれば同じMoAの薬剤の散布は許容される)。代替手段がなく、交叉抵抗性の発達が認められてない場合はアルファベットが異なる薬剤を交互に使用することもできる(アルファベットが異なる薬剤は「サブグループ」と呼ばれる)。
問題はどの薬剤がどのMoAに属するかだが、これに関してはIRACのWebサイトでポスター(日本語版もある)が公開されている他、iOSAndroid向けのアプリまである。

もう少し細かい一覧表は例えばデュポンなんかが公開している。

ただ、これは商品名ではなく有効成分名での記載なので、結構使いにくい。有効成分名は農薬のラベルに記載されているので使えないことはないが、そもそもアルファベットと数字のみでローテーションが組めるように工夫されているのだから、それをラベルに書くべきである。
国によってはMoAに基づいたローテーションが既に浸透しており、MoAがかなり目立つように農薬パッケージに印刷されている場合もあるが、日本ではまだほとんど浸透しておらず、この点はかなり遅れている。しかし、最近発売された農薬の中にはチラシ等にMoAが記載されているものも出てきた。日本でもMoAに基づくローテーション防除が一般的となることが望まれる。

*1:イラク」だと国名と混同するから「アイラック」と読んで欲しいと以前講演で聞いた。ちなみにIRACの病害版とも言えるFRACは「フラック」。

Elpy使用時のFlymakeエラー

いつからか定かでないがElpy使用時に

  Flymake: Failed to launch syntax check process 'pyflakes' with args (/path/to/file/filename_flymake.py): Searching for program: no such file or directory, pyflakes. Flymake will be switch OFF

とかいうエラーがポップアップで出るようになってしまっていた。
EmacsGNU Emacs For Mac OS Xから落としてきたもの。pyflakesはpipで入れてある。
ググったら同様の症状の人が居た。

この人はsudoでpyflakes入れなおしたら解決したと言っているけど手元では直らなくて、結局途中の人が書いているようにpython-check-commandにpyflakesのフルパスを指定した。
ターミナルからpyflakesの場所を確認して…

% which pyflakes
/usr/local/bin/pyflakes

init.elに追記。

(custom-set-variables
 '(python-check-command "/usr/local/bin/pyflakes"))

これで文句言わなくなった。