Windowsのテキストエディタを Visual Studio Codeに乗り換える

Windows上のテキストエディタはこれまでemacsやsublime textなど色々使ってみたけど、Visual Studio Code(以下、VS Code)に乗り換えてみることにした。自分がテキストエディタに求める条件はそんなに多くなくて、

  • 動作が軽いこと
  • emacsキーバインド風味であること。カーソル移動だけサポートしてくれれば十分
  • 用途はメモ。プログラムはlinux上でvimで書きます

だけ。ところがこれでも色々問題があって、

  • emacs。gnupackの更新も随分止まっているし、本家のダウンロード版は日本語入力時に変換候補が表示されない(確定はできるので無理すれば使えなくもない)。かといって、自分でコンパイルするのも面倒だし。Windows上でemacs使うのは鬼門すぎるなあ。
  • vim。vim本体のモード切り替え(入力/カーソル移動)に加えて、日本語入力のモード切り替えも頭の中で管理しないといけないのがなんか嫌。
  • sublime text。v1.0になって、日本語入力の変換ウインドウの表示位置がずれるようになってしまった。タブデザインもかっこわるくなってしまってイマイチ。
  • Atom。以前に一度試してみてあまりの重さに却下。
  • その他のテキストエディタはあまり知らない。

あとは別手法としてVirtualBoxなど仮想サーバでlinux動かして、それ上でemacs使うことも考えたけど、さすがに大げさすぎるので気がすすまない。

VS Codeはちょっと使ってみた感じ、上記の問題点がなくて特に気になるところがないので、これでしばらくやってみることにする。

ちなみにプログラミングはvimなのは、プログラミングはあまり日本語入力しないから。たぶん上にあげた理由のモード管理が2重になるのがなんか嫌なんだろうな。

Jetpackインストール時に register_http_request_failedエラーになる

WordPressに Jetpackプラグインをインストールしようとしたところ、最初の初期接続のところで register_http_request_failedエラーになってしまう。

エラーメッセージでググッてみると、タイムアウト値が短すぎる可能性があるので大きくしろ、という記事が見つかった。しかしなあ、接続ボタンをクリックしてからエラーになるまで 2,3秒なのでタイムアウトに引っかかっているとは思えないんだよな、とりあえず php.iniに max_execution_time = 300を設定してみたがやはり状況変わらず。

プラグインのソースを眺めてみるとどうも curlを使っているようだったので、curlが https対応してないのでは、と思い直接コマンドを実行してみるとこれまた問題ない。

その後いろいろ phpまわりの情報をあさっていると、php.iniにエクステンションライブラリの設定があることを発見。もしやと思い、extension=curl.soを追加して再挑戦すると今度は正常に接続できてインストールも無事終了。

Google Developer Day 2011 Quiz(4) 一人ゲーム

次は一人ゲーム。これは最初、論理的に最小値を求めるロジックがあるのかと思ってさんざん考えたけど、思いつかなかったのであきらめて総当りで計算することにした。

ロジックは、すべての要素が0になるまで2で割り続ける→そのうち5で割り切れるものが 1つでもあればそのセットを覚える→そのセットのコンビネーションを計算→そのうち、結果的にすべての要素が5で割り切れていれば、その手数を覚える。→覚えた手数のうち最小のものが答え、という感じにした。

言語はrubyで書いた。コンビネーションのメソッドはググッてヒットしたものを使わせて頂きました。

#!/usr/bin/env ruby

class Array
 def combination(num)
   return [] if num < 1 || num > size
   return map{|e| [e] } if num == 1
   tmp = self.dup
   self[0, size - (num - 1)].inject([]) do |ret, e|
     tmp.shift
     ret += tmp.combination(num - 1).map{|a| a.unshift(e) }
   end
 end
end

def devide(depth, master, ary)

 ary4 = ary.collect{|k| if (k % 5 == 0) then 1 else 0 end}
 master << ( [depth ] << ("0b" + ary4.join).oct )

 ary2 = ary.collect{|i| i / 2 }
 ary3 = ary2.select{|j| j == 0}

 if ary3.size != ary2.size
   depth = depth + 1
   devide(depth, master, ary2)
 end
 return master
end

def solver(num, ary)

  master=[]
  depth=0

  master = devide(depth, master, ary)
  min = master.size + 1

  master.reject! {|x| x[1] == 0}

  1.upto(master.size){|i|
    combi = master.combination(i)
    combi.each{|j|
      mask = 0
      maxc = 0
      j.each{|k|
        mask = mask | k[1]
        if( k[0] > maxc )
          maxc = k[0]
        end
      }
      if ( ((2 ** ary.size) - 1) == mask )
        if ( min > maxc + j.size)
          min = maxc + j.size
        end
      end
    }
  }
  puts min
end

body=File.open(ARGV[0]).readlines

1.upto(body[0].to_i){|i|
  solver(body[i * 2 - 1 ].chop, body[i * 2].split("\s").collect{|j| j.to_i})
}

ary2とか3とか 4とかいうのが非常に汚い。

Google Developer Day 2011 Quiz(3) Web Game

締切も過ぎたことなので解答を晒してみる。というか今 Quizトップページを見てみたらボーダーラインが101点になってる。。。これはだめかなあ。しかし、101点ということは結局のところスライドパズルがどれだけ解けるかが問題で、それまでの試験は意味ないってことだよな。

まずは Web Game。HTMLソースを見るとカードの色がベタに書いてあるので、それを読んでマッチングすれば瞬殺だけど、それではあまりに面白く無いので素直に神経衰弱してみた。

var count = 0;

function checknumberofcard(){
  var i = 0;
  var element = true;
  while(element){
    i++;
    element = document.getElementById('card' + i);
  }
  return i;
}

function solver(first){

  count++;
  console.log(count);
  if (count > 1800){
    return 0;
  }

  var card1 = 'card' + first;
  var color1 = turnupcard(card1);

  var checkColor = existColor(color1,first);
  var second;

  if (checkColor == -1) {
    second = getuncheckedcard(first);
  } else {
    second = checkColor;
  }

  var card2 = 'card' + second;
  var color2 = turnupcard(card2);

  if ( color1 == color2) {
    cardmap[first] = 0;
    cardmap[second] = 0;
    checkedmap[first] = 1;
    checkedmap[second] = 1;
  } else {
    cardmap[first] = color1;
    cardmap[second] = color2;
  }

  solver(getuncheckedcard(first));
}

function getuncheckedcard(n){
  var i = n + 1;
  while(true){
    if ((i != n) && (checkedmap[i] != 1)){
      return i;
    } else{
      return i + 1;
    }
    if (i == ncard - 1) {
      i = 0;
    } else {
      i++;
    }
  }
}

function existColor(color,n){
  for (i = 0; i < cardmap.length; i++) {
    if ((i != n) && (cardmap[i] == color)){
      return i;
    }
  }
  return -1;
}

function turnupcard(card){
  var element = document.getElementById(card);
  if (element == null) {
    return 0;
    alert('Card element is not found. Check element id.');
  } else {
    var myevent = document.createEvent('MouseEvents');
    myevent.initEvent('click', false, true);
    element.dispatchEvent(myevent);
    return element.style.backgroundColor;
  }
}

var ncard = checknumberofcard();
var checkedmap = new Array(ncard);
var cardmap = new Array(ncard);

console.log(ncard);
for(i=0; i < checkedmap.length; i++){
  checkedmap[i] = 0;
}
for(i=0; i < cardmap.length; i++){
  cardmap[i] = 0;
}

solver(0);

単純に 1枚目をめくって色を覚える。もしこれまでめくったカードでマッチしてないカードのなかに同じ色があれば 2枚目はそれをめくる。なければめくってないカードからひとつめくる。色が違っていればそれも覚える。カードがなくなるまで以下繰り返し。

1800とかいうマジックナンバーはこれは無限ループ抑止用。思い出した。バグがなくなった今はなくてもいいはず。

しかし汚いソースだ。改めて読み返すと我ながら意味不明だ。