2014年振り返り

あっという間に終わった感があるけど、2014年の振り返りを。
今年はほとんどブログ書かなかったなー。

お仕事

1月から新しい職場で働き始めて、Webプログラマ見習いとしてPHPJavaScriptでお仕事してました。

コード書く仕事は半分くらいで、残りはプロジェクトの交通整理的な役割が多かったです。
それほど大きな会社ではないので、割と色々なことをやらせてもらえました。
プロジェクトを進める上では意外と今までの知識や経験が活かせることが多かった気がします。
前職と違った仕事のやり方として、Slackやチャットワークを日常的に使ってますがとてもいい感じです。

ちょうど1年経ちましたが、全体としてはそこそこ楽しく仕事できてます。

プライベート

子どもが1歳5ヶ月になり、どんどん動き回るようになって目がはなせません。
日々子どもが成長するのを見てるのが楽しいです。
子育てのためだけではないですが、勉強会にほとんど参加しませんでした。

自宅ではまとまった時間が取りにくいので、1時間早めに出社して本読んだり写経したりしてます。
おかげで、月1冊ちょっとは読めたみたいです。
慣れてきたのか、子育て手伝いながらの時間の使い方は去年よりは上手くなってるかも。

反省

新しい環境で仕事を始めたこともあって、インプットはそこそこ多くできた気がしますが、アウトプットは少なめでした。
職場と自宅という2つの環境に閉じてしまった感があるので、もう少し別の界隈の人たちとの交流ができたらよかったかな。

特定のファイルがないディレクトリを抽出する

仕事でサーバ設定いじってて、ちょっと悩んだのでメモっておく。
とりあえず目的は達したけど、もっと簡単にできる方法があれば、ぜひ教えてください。

やりたいこと

同じ構成のディレクトリ群の中から、置き忘れる、消されるなどして必要なファイルが存在しないディレクトリを抽出したい。

やったこと

対象ファイルについて存在チェックすれば良いと考えたので、下記のようにディレクトリのリストに対象のファイル名を連結して test コマンドに渡すようにした。
ここでは、hoge/piyo.txt が必要なファイル。
ディレクトリの構成によっては、find に maxdepth オプションも指定した方がいいはず。

[~/tmp/test] $ find .
.
./dir1
./dir1/fuga
./dir1/hoge
./dir1/hoge/piyo.txt
./dir2
./dir2/fuga
./dir2/hoge
./dir3
./dir3/fuga
./dir3/hoge
[~/tmp/test] $ find . -type d -mindepth 2|grep '/hoge$'|awk '{cmd = sprintf("test -e %s/piyo.txt", $0);r = system(cmd);if(r == 1) print $0}'
./dir2/hoge
./dir3/hoge
[~/tmp/test] $

JavaScript と CSS の minify

久々G*関連ネタ。

tree-tips: Gradleでjavascriptをminifyする! | Gradle
tree-tips: Gradleでcssをminifyする! | Gradle

上記サイトのビルドスクリプトを参考に、カレントディレクトリ以下の JavaScriptCSS再帰的に minify するようにした。

ただ、使っているプラグインが新しめの gradle に対応してないっぽくて、ちょっとはまった。
結局 1.7 です。

wrapper 作ったので、ついでにチームの人に紹介しておいた。

defaultTasks 'allMinifyCss', 'allMinifyJs'

apply plugin: 'js'
apply plugin: 'css'

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath 'com.eriwen:gradle-js-plugin:1.5.0'
    classpath 'com.eriwen:gradle-css-plugin:1.2.1'
  }
}

css.source {
  dev {
    css {
      srcDir "./"
        include "**/*.css"
        exclude "**/*.min.*"
    }
  }
}

css.source.dev.css.files.eachWithIndex { cssFile, i ->
  tasks.create(name: "minifyCss${i}", type: com.eriwen.gradle.css.tasks.MinifyCssTask) {
    source = cssFile
    dest = cssFile.getAbsolutePath().replace('.css','.min.css').replace('.js', '.min.js')
    yuicompressor {
      lineBreakPos = -1
    }
  }
}

task allMinifyCss(dependsOn: tasks.matching { Task task ->
    task.name.startsWith("minifyCss")
  }
)

javascript.source {
  dev {
    js {
      srcDir "./"
        include "**/*.js"
        exclude "**/*.min.js"
    }
  }
}

javascript.source.dev.js.files.eachWithIndex { jsFile, i ->
  tasks.create(name: "minifyJs${i}", type: com.eriwen.gradle.js.tasks.MinifyJsTask) {
    source = jsFile
    dest = jsFile.getAbsolutePath().replace('.js', '.min.js')
  }
}
task allMinifyJs(dependsOn: tasks.matching { Task task ->
    task.name.startsWith("minifyJs")
  }
)

task wrapper(type: Wrapper) {
  gradleVersion = 1.7
}

XMLHttpRequest でのリダイレクト処理

XMLHttpRequest でリダイレクトがうまく処理できなくて困ったので調べてみた。

結論

サーバのレスポンスがリダイレクト (30X) の場合、XMLHttpRequest が勝手にリダイレクトしてくれてリダイレクト先のレスポンスが返ってくる。
つまり、転送先が正しければ 200 が返ってくるし、存在しなければ 404 が返ってくるということ。
responseText の中身も転送先の内容になる。

ググってみたけど、探し方が悪いのかちょっと古めの記事しか見つからなかった。
XMLHttpRequestオブジェクトでRedirectをハンドリングするには?(リダイレクトを拾う方法) - on the center line.
ku

結局、上と同じようにレスポンスの内容によって転送と判断して window.location を書き換えて対応した。
XMLHttpRequest では、基本的に同一ドメインアクセスで転送先は分かるはずなのでこれでいいのかなあ。

試したこと

下記のファイルを使って確認してみた。
一応、同期/非同期通信のそれぞれの方式をChromeSafariFirefox 試したけど結果は全て同じ。

使ったファイルと処理の流れ

1. hoge.html から fuga.php へ GET リクエスト。
2. fuga.php が piyo.html へ転送
3. hoge.html のコンソールログに piyo.html のレスポンス表示

hoge.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8" />
  <title>test</title>
  <script>
    function sync() {
      var xhr = new XMLHttpRequest();
      xhr.open('GET', './fuga.php');
      xhr.send(null);
      console.log(xhr.status);
      console.log(xhr.getAllResponseHeaders());
      console.log(xhr.responseText);
    }
    function async() {
      var xhr = new XMLHttpRequest();
      xhr.onreadystatechange = function () {
        if (xhr.readyState==4){
          console.log(xhr.status);
          console.log(xhr.getAllResponseHeaders());
          console.log(xhr.responseText);
        }
      }
      xhr.open('GET', './fuga.php');
      xhr.send(null);
    }
  </script>
</head>
<body>
  <input type="button" value="sync" onClick="sync()">
  <input type="button" value="async" onClick="async()">
</body>
</html>
fuga.php
<?php
header("Location: ./piyo.html");
piyo.html
piyo.html
レスポンスヘッダ

Accept-Ranges bytes
Connection Keep-Alive
Content-Length 10
Content-Type text/html
Date Sat, 01 Mar 2014 14:03:43 GMT
Etag "5f49f6-a-4f38bc8295bc0"
Keep-Alive timeout=15, max=98
Last-Modified Sat, 01 Mar 2014 13:46:31 GMT
Server Apache/2.2.24 (Unix) DAV/2 PHP/5.5.8

レスポンスボディ

piyo.html

64bit 版 KaoriyaVim で突然の死

あるあるかもしれないけど、64bit 版 KaoriyaVim では、python の dll がロードできないと突然死にます。*1
なお、32bit 版だとエラーメッセージは出るけど落ちません。

ということで、64bit 版の python をインストールしましょう。

http://www.python.jp/download

環境

Windows8.1
64bit 版 KaoriyaVim 7.4.161

*1:ほんの一瞬 "ImportError: No module named site" と表示されるけど

Windows8 環境設定メモ

Windows8をセットアップした時のメモ。

Microsoft アカウント

Windows8 ではアカウントを Microsoft アカウントにできるのだけど、Microsoft アカウントの名前が日本語で登録してあるとホームディレクトリが ”C:\Users\太郎" みたいなことになってしまう。
しかも、一旦このディレクトリが作られてしまうとローカルアカウントに変更しても無駄。

回避するには Microsoft アカウントの名前を英字にしておくか、英字でローカルアカウントを作ってから Microsoft アカウントに紐付ける必要がある。

今回の場合、支給された時点で日本語アカウント名で作られていて回避できなかった。

結局、再インストールもめんどくさいので別のローカルアカウントを作って紐づけを変更。
元のディレクトリは残ってるけど無視することにした。

Chocolatey

http://chocolatey.org/

Windows 向けのパッケージマネージャ。
インストールは上記ページのコマンドをコマンドプロンプトで実行するだけなので楽ちん。

コマンド例

cinst hoge
chocolatey install hoge
chocolatey uninstall hoge
chocolatey -lo list

インストールしたもの

その他

ランチャーも色々探したんだけど、標準で使える "Win + R ファイル名を指定して実行” に落ち着いた。
普段使うものなんてたかが知れてるし、しばらくこれでやってみるつもり。

あと、ポート80 を使いたい場合に Skype の設定を変える必要があるんだけどストアアプリ版のSkypeだとポートが変更できないっぽかった。
http://community.skype.com/t5/Windows-8-1-from-Windows-Store/How-to-change-port/td-p/1173550

2013年振り返り

年末なので今年の振り返りです。
今年は個人的に大きな出来事があった年でした。

子供が生まれた

夏に子供が生まれて生活が一変しました。

何をするにも子供が最優先、自分の時間を作るのが一苦労です。
平日は妻一人に任せきりなので休日くらいは父親業しないとね。

大変なことも多いけど子供がいる生活は楽しいです。

退職 & 転職した

正確には本日付けで退職、年始から新しい会社で働きます。

最初に内定した会社が 2 週間後に倒産が決まるなどという事件もありましたが、とある Web 開発会社に入社することになりました。
来年は Web エンジニア見習いとしてがんばります。

勉強会とか

前半はだいたい月一くらいは参加してたみたいです。
初めてオンラインの読書会にも継続的に参加しました。
読書会駆動で本を読んでディスカッションするのはオススメです。

後半は子供の世話のためほとんど参加できませんでした。
子供の世話に慣れていないせいもありますが、自宅で PC を開くのもままならず勉強自体も通勤時間での読書が精一杯。

子供がもう少し大きくなるまではこんな感じですかね。

総括

子供最優先な生活になったため、思うように時間が取れなくなったけど概ね楽しく過ごせました。
だいぶ子供の世話にも慣れてきたし、転職して勉強すること多すぎるし、来年はもう少し自宅での時間をうまく使えるようにしたいです。