不審なファイルの存在確認等

事の発端

www.ipa.go.jp
「バッチでの配布でも可能です」とか書くならバッチファイル用意しといてほしい…。

バッチファイル

上からやれといわれたけど手順書の通りにはとてもやってられないので渋々バッチファイルを作成した。
こいつが必要な立場にある人はgithubとかアップローダーとかにアクセスできないと思うので直接書いておく。メモ帳か何かにコピペしてhoge.batとか適当な名前+.batで保存して実行のこと。
ちなみにWindows XP以前ではスタートアップフォルダの位置が異なるのでそのままでは動作しない。スクリプト中のスタートアップフォルダ記述箇所を修正すれば動作する。ただし、schtasksコマンドはProfessionalでないと無いそうだ。まあ必要になること自体がおかしいので修正はしない。

@echo off
setlocal enabledelayedexpansion

echo 1. ファイルの存在有無の確認 ---------------------------------
set RESULT=
for /f "usebackq" %%i in (`dir /a /r /s /b "%TEMP%" "%SystemDrive%\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\" "%SystemDrive%\Users\All Users\Microsoft\Windows\Start Menu\Programs\Startup" ^|findstr /I /R "\\leanp\.exe \\leassap\.exe \\leassaq\.exe \\leassnp\.exe \\mdm\.exe \\nvsvcv\.exe \\nvvscv\.exe \\slwga\.exe \\upsl\.dll \\vmat\.exe \\vmatam\.exe \\vmatap\.exe \\vmater\.exe \\vmmat\.exe \\vmnatam\.exe \\vmwere\.exe \\windump\.exe \\ct\.exe \\yrar\.exe \\csvde\.exe \\GetPassword\.exe \\mimikatz\.exe \\mimikatzx64\.exe \\mimikatz1\.exe \\gp\.exe \\Gp64\.exe \\ps\.txt \\msver\.exe \\ss\.exe \\mailfinal\.exe \\mail_noArgv_final\.exe \\result\.log \\14068\.rar \\ms14-068\.exe \\kptl\.doc \\kenpo\.doc"`) do (set RESULT=!RESULT!^

%%i
)

echo;
if not "!RESULT!"=="" (
  echo 下記のファイルが発見されました。
  echo !RESULT!
) else (
  echo 不審なファイルは発見されませんでした。
)
echo;

echo 2-(1) 自動起動設定に不審なファイルが登録されていないかの確認 --
set RESULT=
for /f "usebackq" %%i in (`schtasks /query /v ^|findstr /I /R "\\leanp\.exe \\leassap\.exe \\leassaq\.exe \\leassnp\.exe \\mdm\.exe \\nvsvcv\.exe \\nvvscv\.exe \\slwga\.exe \\upsl\.dll \\vmat\.exe \\vmatam\.exe \\vmatap\.exe \\vmater\.exe \\vmmat\.exe \\vmnatam\.exe \\vmwere\.exe \\windump\.exe \\ct\.exe \\yrar\.exe \\csvde\.exe \\GetPassword\.exe \\mimikatz\.exe \\mimikatzx64\.exe \\mimikatz1\.exe \\gp\.exe \\Gp64\.exe \\ps\.txt \\msver\.exe \\ss\.exe \\mailfinal\.exe \\mail_noArgv_final\.exe \\result\.log \\14068\.rar \\ms14-068\.exe \\kptl\.doc \\kenpo\.doc"`) do (set RESULT=!RESULT!^

%%i
)

@echo off

echo;
if not "!RESULT!"=="" (
  echo 下記のファイルが発見されました。
  echo !RESULT!
) else (
  echo 不審なファイルは発見されませんでした。
)
echo;

echo 2-(2) レジストリキーに不審なファイルが登録されていないかの確認
set RESULT=
for /f "usebackq" %%i in (`reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" /s ^|findstr /I /R "\\leanp\.exe \\leassap\.exe \\leassaq\.exe \\leassnp\.exe \\mdm\.exe \\nvsvcv\.exe \\nvvscv\.exe \\slwga\.exe \\upsl\.dll \\vmat\.exe \\vmatam\.exe \\vmatap\.exe \\vmater\.exe \\vmmat\.exe \\vmnatam\.exe \\vmwere\.exe \\windump\.exe \\ct\.exe \\yrar\.exe \\csvde\.exe \\GetPassword\.exe \\mimikatz\.exe \\mimikatzx64\.exe \\mimikatz1\.exe \\gp\.exe \\Gp64\.exe \\ps\.txt \\msver\.exe \\ss\.exe \\mailfinal\.exe \\mail_noArgv_final\.exe \\result\.log \\14068\.rar \\ms14-068\.exe \\kptl\.doc \\kenpo\.doc"`) do (set RESULT=!RESULT!^

%%i
)

@echo off

echo;
if not "!RESULT!"=="" (
  echo 下記のファイルが発見されました。
  echo !RESULT!
) else (
  echo 不審なファイルは発見されませんでした。
)
echo;

endlocal

echo;
pause

調べたこと

簡単に出来るかと思ったら結構面倒くさくて色々と調べる羽目になった。

手順書見るとTEMPフォルダ2回確認してるし、拡張子が違う場合があると書いてあるのに記載のコマンドでは.exeしか見てないし色々とアレ。

ggplot2で縦に並べたグラフの横幅を揃える

(※2015/06/03 20:27追記あり)
下記の記事に基づく発言に関連してどうも某所で勘違いが発生しているようなので。www.exegetic.biz

使用データ

下記のように生成したものを用いる。

x <- 0:100
x <- data.frame(x = x, y1 = sin(x * pi / 10), y2 = x^2)

なぜ横幅がずれるのか

まず、これをbaseで普通にプロットする。

layout(matrix(1:2, 2))
plot(y1 ~ x, type = "l", data = x)
plot(y2 ~ x, type = "h", data = x)
par(old)

f:id:Rion778:20150602235943p:plain
グラフの横幅はずれない。
baseを用いたプロットでは、あえてずらすような細工をしない限り、「グラフの横幅のずれ」は発生しない。
よって、縦軸を揃えるためにマージン等を設定する必要は無い(そのままでは余白が大きくなりすぎるという問題はあるが)。
ちなみに、y軸の目盛りラベルが話にならない*1ので、las = 1を設定して再確認してみるもやはりずれない。

layout(matrix(1:2, 2))
plot(y1 ~ x, type = "l", data = x, las = 1)
plot(y2 ~ x, type = "h", data = x, las = 1)
par(old)

f:id:Rion778:20150603000700p:plain
ずれないが、下のグラフのy軸ラベルと目盛りラベルが重なってしまっている。
といったところでピンとくるかもしれないが、gridの作図では*2、baseの作図と以下の点が異なる。

  • y軸の目盛ラベルは水平方向がデフォルト(las = 1を指定した場合と同様)。
  • y軸の目盛ラベルの幅に応じて余白が自動調整される。

これは通常のプロットではほとんど問題にならないが、y軸ラベルの長さが異なるグラフを縦に並べると、調整なしでは横幅が必ずずれるという弊害になって現れる。

library(ggplot2)
library(gridExtra) # grid.arrange()関数のために必要
p1 <- ggplot(x, aes(x = x)) + geom_line(aes(y = y1)) + theme_classic()
p2 <- ggplot(x, aes(x = x)) + geom_bar(aes(y = y2), stat = "identity") + theme_classic()
grid.arrange(p1, p2)

f:id:Rion778:20150603001835p:plain
gridの作図ではlayoutを用いたレイアウトはできないので、grid.arrangeなどの関数を用いる必要がある*3
なお、最初に提示したリンク先の例では上下のグラフの高さも設定しているので、これとは出力が異なっている。

解決策

gridの作図では、作図オブジェクト(graphical object; grob)というオブジェクトが生成され、これを通じて描画の制御ができる。
よって、横幅を揃えるためには、まずgrobから横幅や縦幅といったレイアウトの情報を取り出す*4

g1 <- ggplot_gtable(ggplot_build(p1)) 
g2 <- ggplot_gtable(ggplot_build(p2))

ggplot_build関数は描画に必要な全ての情報をplotオブジェクトから生成し、ggplot_gtable関数はそこから横幅や縦幅といったレイアウトに必要な情報を含むgtableオブジェクトを生成する*5
gtableオブジェクトから横幅の情報を取り出し、これをp1とp2のどちらかに合わせる。合わせる基準としては、幅の広い方を選択することにする(文字の重なりを防ぐため)。
gridパッケージには単位を含むオブジェクトの要素ごとに大小を比較するunit.pmax、unit.pmin関数が含まれているので、これを用いて横幅の値の大きい方を取り出す。

maxWidth <- unit.pmax(g1$widths, g2$widths)

この情報を用いてグラフのパラメータを上書きすることで、横幅を揃えることができる。

g1$widths <- maxWidth
g2$widths <- maxWidth
grid.arrange(g1, g2)

f:id:Rion778:20150603003838p:plain
要するに、gridに起因する横幅のずれの調整にggplot2に含まれる関数が使えるという話。

追記


ということを教えていただいた。
size=に"max"や"min"を指定するとエラーが出るが、gtableをこれhttps://github.com/baptiste/gtableに差し替えれば動作する様子。first/last指定でも大抵は事足りるとは思うが。

*1:そもそもどうしてこの方向がデフォルトなのか今ひとつ納得出来ない。

*2:つまるところggplot2が元凶ではない。

*3:grid.arrangeはarrangeGrob関数のラッパーで、arrangeGrob関数はかなり色々なカスタマイズが便利にできる関数の様だが話がずれるのであまり調べていない。

*4:ggplot2はこの2つの関数を含むので、gridに起因する横幅問題の解決が容易になる、というのが元記事の要点である。

*5:と思うがこれもあまり良く調べていない。

RStudioの折りたたみ機能

今更ながらコードの折りたたみ機能が付いている事に気付いた。
詳細はCode Folding and Sections – RStudio Supportを参照。

折りたたみ設定されるもの

  • ブレース(波括弧{})で括られた領域。
  • R SweaveやR Markdownドキュメントにおけるコードチャンク。
  • R Mardcownドキュメント中におけるセクション。
  • コードセクション(後述)

上記4つは自動的に折りたたみ設定がされる。
例えば、関数や条件定義領域などのブレースで囲まれた部分があると、行数の横に三角が現れる。
f:id:Rion778:20150531170144p:plain
これをクリックすることで折りたたみができる。
f:id:Rion778:20150531170225p:plain
展開する場合は再び三角をクリックするか、折りたたまれている事を示している青いアイコンをクリックする。
(キーボードショートカットで操作する方法は用意されていないか、うまく動かないようだ。Ctrl + Command + L(Mac)で閉じられるときもあるし、閉じられないときもある。このコマンドは任意領域の折りたたみの際には上手く動作する。)

任意の折りたたみ領域を設定する

折りたたみ設定がされていない領域も折りたたむことができる。
範囲選択後にEdit > Folding > CollapseまたはCtrl + Command + L(mac)で任意領域の折りたたみができる。
f:id:Rion778:20150531171014p:plain
f:id:Rion778:20150531171158p:plain

コードセクション

Rスクリプト中に、コメント記号(#)で開始し、4つ以上の-または=または#で終了する行があると、セクションの開始とみなされる。
f:id:Rion778:20150531171605p:plain
どのセクション記号も機能は同様であり、セクション開始から次のセクション開始までが折りたたみの対象となる(=サブセクションを作ることはできない)。
セクションは折りたたみの対象となるだけでなく、関数定義と同様にジャンプ機能の対象となり、その部分へ容易に移動できるようになる。
f:id:Rion778:20150531171944p:plain

キーボードショートカット

Macの場合のショートカットが若干押しにくいが…

機能 Windows Mac
折りたたみ Alt + L Ctrl + Command + L
展開 Alt + Shift + L Ctrl + Command + Shift + L
全て折りたたみ Alt + O Ctrl + Command + O
全て展開 Alt + Shift + O Ctrl + Command + Shift + O

Edit > Foldingから選択することも出来る。
折りたたみ・展開は基本的には領域選択と合わせて使う。領域を選択していない場合は動くこともあるし動かないこともあってよく分からない。
「全て折りたたみ」を実行した場合、最も「外側」で折りたたまれる。もしセクションが設定されていればセクションが最も外側となる。
なお、折りたたみの状態はファイルを閉じない限り保存される(たとえRStudioを終了しても)が、ファイルを閉じて再度開いた際には全ての折りたたみが展開された状態となる。

S3

RStudioではじめるRプログラミング入門を読んだ。RStudioについて詳しい情報があるかと思っていたのだが、これについてはそこそこの記述だった。
ただ、全体的に見て、Rとプログラミングをゼロから学ぼうと思うのであれば良い情報量だと感じた。リゲス本なんかに比べるとずっと表現が平易で分かりやすい。タイトルに「入門」と付いたオライリーの本が入門書であったことなど殆ど無いので逆に面食らった。ゆえに、本当の初心者で無ければあえて読む必要も無い本とも言えるのだが、環境やクラス、コードのベクトル化など、なかなか初心者向けの丁寧な解説が無い部分の記述もあり、個人的には参考になった。また、「他人にRを教える」場合の参考書としても良いのではないかと思う。

S3に関してよくまとまっていたので覚書。なお、本書の説明のほうがずっと長いが丁寧。

S3とは

Rに備わっているクラスシステムの一つで、ジェネリック関数、メソッド、クラスに基いている。

やること

  1. オブジェクトのクラス名を考える
  2. クラスのインスタンスのclass属性にクラス名を設定する
  3. 必要となりそうなジェネリック関数のクラスメソッドを書く

ジェネリック関数

Rには、与えられたオブジェクトの種類によって異なる振る舞いをする関数が備わっている。print()はその例。

> x <- 100000
> print(x)
[1] 1e+05
> attr(x, "class") <- "POSIXct"
> print(x)
[1] "1970-01-02 12:46:40 JST"

同じprint(x)でも"class"属性が変わることで関数の動作が変わっている。このように、ジェネリック関数はクラスに応じて振る舞いを変える。

メソッド

ジェネリック関数は呼び出された際にUseMethod()という特別な関数を呼び出す。

> prin
function (x, ...) 
UseMethod("print")
<bytecode: 0x10432ebc8>
<environment: namespace:base>

UseMethod()は関数の第1引数に与えられたオブジェクトのクラスを調べ、そのクラスを処理するための関数に全ての引数を渡す。
具体的には、print.POSIXct()の様に関数名とクラス名をドットで区切った名称の関数が呼ばれる。

> print.POSIXct
function (x, ...) 
{
    max.print <- getOption("max.print", 9999L)
    if (max.print < length(x)) {
        print(format(x[seq_len(max.print)], usetz = TRUE), ...)
        cat(" [ reached getOption(\"max.print\") -- omitted", 
            length(x) - max.print, "entries ]\n")
    }
    else print(format(x, usetz = TRUE), ...)
    invisible(x)
}
<bytecode: 0x10c0b90e8>
<environment: namespace:base>

これらの関数は(print()の場合)、printのメソッドと呼ばれる。どのようなメソッドが存在するのかについては、methods(print)のようにして調べることができる。

> methods(print)
  [1] print.abbrev*                                
  [2] print.acf*                                   
  [3] print.anova*                                 
  [4] print.Anova* 
...

自作のクラスを追加する

オブジェクトにクラス属性を追加する方法はいくつかある。attr()を使う方法や、class()を使う方法、structure()を使う方法などである。

x <- 1

class(x) <- "myclass"
attr(x, "class") <- "myclass"
structure(x, class = "myclass")

structure()を使うやり方は関数の返り値を構成する場合などに役立つだろう。

> roll <- function(){
+   # サイコロを2つ振って合計値を求める
+   die <- 1:6
+   dice <- sample(die, size = 2, replace = TRUE)
+   structure(sum(dice), dice = dice, class = "dice")
+ }
> 
> roll()
[1] 10
attr(,"dice")
[1] 6 4
attr(,"class")
[1] "dice"

class属性はメソッドがなければ単なる属性扱いであり、デフォルトのprint()では他の属性と同様に表示される*1

自作のメソッドを作成する

自作のメソッドを作成、追加する方法はとても簡単で、処理方法を定めた関数を作成し、他のメソッドと同様に、関数名とクラス名をドットで区切った関数名を設定すれば良い。

> print.dice <- function(x, ...){
+   dice <- attr(x, "dice")
+   dice <- paste("dice1:", dice[1], " dice2:", dice[2])
+   string <- paste(x, dice, sep = "\n")
+   cat(string)
+ }
> 
> roll()
11
dice1: 6  dice2: 5

*1:printはコンソール上では暗黙に使われるので上記例では明示的に使用していない。

S-Insertでペーストできない

.vimperatorrc中でペースト操作をしたいところに今までS-Insertと書いていたのだけど、気付いたら動作しなくなっていた。
今まではVimperator側でペースト操作に上書きしていたが(vimperatorでのコマンドラインへの貼り付け方法が分からなかった, S-Fマガジン 2008年 04月号 [雑誌], 近所のホームセンターで前飼っていた犬に、そっくりな犬がいた - ぽっぺん日記@karashi.org(2008-04-12))、Vimperator 3.9から

We don't override <S-Insert> in textboxes anymore,

とかなってるのでこれが原因だとは思う。
S-InsertでペーストできないのがOS Xの正しい動作なのか、Karabinerとかで色々いじってるのが原因なのかはよく分からない。
とりあえず、S-InsertはM-vに置き換えた。

キュウリに対して、おそらく同時期に放飼したであろうスワルスキーカブリダニが容易に見つかるほ場と30分探しても見つからないほ場があった。
スワルスキーカブリダニはナスやキュウリの害虫を食べるダニで、生き物だが農薬として登録されている。生き物だろうが天然物だろうが、農作物に対して病害虫や雑草の駆除目的で使って良いのは農薬だけであって、農薬以外のもの=安全性の担保されていないものを防除目的で使用してはいけない。そして、登録通りに放飼したとすると1m^2あたり25〜50頭導入される。
施設のキュウリというのは1m^2にだいたい1本植わっていて、主枝摘心のつる下ろしという栽培方法だと1株から4〜5本のつるが伸びていて、1本のつるには少なくとも14〜15枚、摘葉をやめていれば20枚かそれ以上の葉がついている。そうすると1m^2に50枚とか100枚とかいう葉があって、そこに25〜50頭なので、よく分散しているとして2〜3枚に1頭は見つかって欲しい、という気になる。
これが見つからないとすると、考えられる理由は、

  1. スワルスキーカブリダニを殺してしまう農薬を使ってしまった。
  2. 増殖するために充分な温度が確保できていない。
  3. 増殖するために充分な湿度が確保できていない。
  4. 気が早い。

1から3は割とありがちで、1ヶ月たっても居ないとするといずれかを疑ったほうが良い。
実は4が特にありがちで、スワルスキーカブリダニというのは結構バカにならない値段がするもので、放飼するのも結構時間がかかるものだから、入れて見えないと不安になる。ただとても小さいもので、また別に葉っぱに均等に分散してくれるわけでもないので、最初の数週間どう頑張っても見つからないということは良くある。だから見えなければ(害虫が増えない限り)しばらく待つのが正解だが、もし自分が金払って労力かけて放飼したものだとしたら、やはり気が気でないだろうと思うところ。

紙の日記、全く長続きしないのでやはりここに書こうと思う。
朝、今日薬剤散布をするのであれば今か夕方かという相談があった。この時期の薬剤散布は難しい。だいたい、農薬というのは散布後に乾かなかったり、散布時に温度が高すぎたりすると薬害の危険性が高まるのでこれを避けるように時間を選択する。日照時間が短い冬なら午前中だし、春〜夏なら夕方といった具合に。日中、施設内はかなり暑いし、日照時間も長くなってきたが、この時期の天気は変わりやすい。夕方に散布して乾かず、夜がぬるく経過して暖房機も回らない、というのが一番まずそうなので、早めに散布したほうがいいのではと返事をしてしまった。午後からはあまり天気が良くなかったので、結果的にはよかったのかもしれないが、この手の相談はいつでも不安が残る。
夕方、車検(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
黒軸は茶軸よりは明らかに静かだけど思ったよりは音がするという印象。撫で打ちができるようになれば違うのだろうか。