CoffeeScript 1.8.0の変更点をまとめてみた

CoffeeScript 1.8.0の変更点をまとめてみた

The —join option of the CLI is now deprecated.

CLIオプションで--joinがdeprecatedになった(まだ使えるが将来的に削除される)

複数のファイルを無秩序に結合することでスコープ汚染を引き起こしてしまうのが理由、と説明されていた

普通にcat a.coffee b.coffee > c.coffeeしろとのこと

Source maps now use .js.map as file extension, instead of just .map.

ソースマップの拡張子の命名規則をsourceFileName.targetExtension.mapへ変更し、.js.mapをつけるようになった

同じ名前のファイルが存在していた場合(sourceFile.scss, sourceFile.coffee)に、生成されたソースマップかどちらのものか識別できない(あるいは上書きされる)問題が解決された

The CLI now exits with the exit code 1 when it fails to write a file to disk.

コンパイルコードの書き出しに失敗した時(パーミッション・ファイルロック等)にexit code 1で終了しない問題を修正、正しく不正終了を検知できるようになった

The compiler no longer crashes on unterminated, single-quoted strings.

閉じられていないシングルクオート文字列を含んだcoffeeコードのコンパイル時にコンパイラがクラッシュする問題を修正、正しくシンタックスエラーを吐くようになった

coffee17> 'hoge
TypeError: Cannot read property '0' of null
  at Lexer.exports.Lexer.Lexer.stringToken (/usr/local/Cellar/nvm/0.13.1/v0.10.31/lib/node_modules/coffee-script/lib/coffee-script/lexer.js:172:46)
  at Lexer.exports.Lexer.Lexer.tokenize (/usr/local/Cellar/nvm/0.13.1/v0.10.31/lib/node_modules/coffee-script/lib/coffee-script/lexer.js:31:143)
  (省略)

coffee18> 'hoge
[stdin]:1:1: error: unexpected '
'hoge
^

Fixed location data for string interpolations, which made source maps out of sync.

文字列をinterpolation ("user id is #{user.id}"みたいなやつ) した時に、ソースマップでのロケーションデータがおかしくなる問題を修正

The error marker in error messages is now correctly positioned if the code is indented with tabs.

インデントにタブを使用している際にエラーメッセージの表示箇所がおかしかったのを修正

Fixed a slight formatting error in CoffeeScript’s source map-patched stack traces.

コンパイルコード実行時にエラーが発生した時、StackTraceの行数をcoffeeScriptの行数に合わせるpatchStackTraceの挙動や呼び出しタイミングが改善された

デフォルトでスタックトレースへの行番号パッチを当てる、生成されるソースマップの行番号記述をjsのものと統一する、等

The %% operator now coerces its right operand only once.

モジュロ演算子(%%)のコンパイルコードが右辺値を3回呼び出すため、右辺に冪等でない関数が設定された時に不正な計算結果となる問題を修正

coffee17> 0 %% valueOf: -> console.log '!'
!
!
!

coffee18> 0 %% valueOf: -> console.log '!'
!

It is now possible to require CoffeeScript files from Cakefiles without having to register the compiler first.

Cakefile内でCoffeeScript(.coffeeファイル)をrequireする時に、coffee-script/registerをrequireする必要がなくなった

The CoffeeScript REPL is now exported and can be required using require ‘coffee-script/repl’.

CoffeeScriptのREPLインターフェースが直接requireできるようになった

Fixes for the REPL in Node 0.11.

Node v0.11でcoffee-replが起動できない問題を修正

v0.11からreplreadline.interfaceの継承オブジェクトに変更されたため、repl.promptString::replaceメソッドを持たなくなったのが原因

$ coffee
coffee17> /usr/local/lib/node_modules/coffee-script/lib/coffee-script/repl.js:48
      initialPrompt: repl.prompt.replace(/^[^> ]*/, function(x) {
                                 ^
TypeError: undefined is not a function
  at addMultilineHandler (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/repl.js:48:34)
  at Object.module.exports.start (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/repl.js:155:7)
  at Object.exports.run (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/command.js:79:32)
  at Object.<anonymous> (/usr/local/lib/node_modules/coffee-script/bin/coffee:7:41)
  at Module._compile (module.js:449:26)
  at Object.Module._extensions..js (module.js:467:10)
  at Module.load (module.js:349:32)
  at Function.Module._load (module.js:305:12)
  at Function.Module.runMain (module.js:490:10)
  at startup (node.js:124:16)
  at node.js:807:3

$ coffee
coffee18>


newしてもObjectの参照が解除されないシーンがある

  • prototypeで宣言されたオブジェクトをconstructorで初期化していない
  • 直接値を挿入せず、キーのみを読み書きする

以上の条件がそろうとnewしてもオブジェクトの参照は解除されず、すべてのインスタンスで同じオブジェクトを共有することになる

うまく利用できればかっこいい実装できそうだけど、人類にはまだ早い感じがするので大人しく気をつけることにする。


自動でソートしてくれるBackbone.Marionette.CompositeView

Backbone.Marionette.CompositeViewの挙動を、prototypeを拡張することで自動でソートして挿入してくれるようにした。coffeeでは.prototype.::と記述できる。

このセクション以降で定義されたCompositeViewにBackbone.Collection::comparator()の定義されたcollectionをattachすれば、Collectionのソートオーダーに従ってレンダリングしてくれる。中間に挿入されたものでも$.eq比較で適切に挿入される。

↓ 実装自体はここ

https://github.com/marionettejs/backbone.marionette/wiki/Adding-support-for-sorted-collections


mdadmが止まった後にやったこと

ある日帰ったらサーバが止まってた。何事かと思いディスプレイをつないでみたらGRUBの起動で止まってた。

キーボードを接続して通常起動すると、どうやらmdadmで組んでるRAID10からディスクが2枚外れてしまい、マウント不可状態に陥っていたらしいことがわかった。後からわかったことだが、ディスクは壊れていなかった。

日常では感じることのできない胸の高鳴りに冷や汗を流しながら、恋をしたような気分でディスプレイと向き合った。以下、mdadmちゃんとの文通ログ。


まずはsshできるようにした

/homeがロストしてしまっていたので公開鍵は使えない、直接sshd_configを編集してPermitPasswordLoginをyesに、sshできるようにした

ssh後、まずは状況の確認、mdstatとdetailでmdの状態を確認する

$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md0 : inactive sdd[2] sde[3] sdf[4] sdg[7]
      11720542048 blocks super 1.2

unused devices: <none>
$ mdadm --detail /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Mon Dec  3 01:05:01 2012
     Raid Level : raid10
  Used Dev Size : -1
   Raid Devices : 6
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Wed Jun  4 00:29:50 2014
          State : active, FAILED, Not Started 
 Active Devices : 4
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 0

         Layout : near=2
     Chunk Size : 1024K

           Name : ubuntu:0
           UUID : 5715dcea:bb512ad2:15f0c995:a1e21b5b
         Events : 36178

    Number   Major   Minor   RaidDevice State
       0       0        0        0      removed
       1       0        0        1      removed
       2       8       48        2      active sync   /dev/sdd
       3       8       64        3      active sync   /dev/sde
       4       8       80        4      active sync   /dev/sdf
       7       8       96        5      active sync   /dev/sdg

どうやらsdbとsdcが落ちている模様(。ŏ﹏ŏ。)

$ mdadm --examine /dev/sdb
/dev/sdb:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : 5715dcea:bb512ad2:15f0c995:a1e21b5b
           Name : ubuntu:0
  Creation Time : Mon Dec  3 01:05:01 2012
     Raid Level : raid10
   Raid Devices : 6

 Avail Dev Size : 5860271024 (2794.40 GiB 3000.46 GB)
     Array Size : 8790405120 (8383.18 GiB 9001.37 GB)
  Used Dev Size : 5860270080 (2794.39 GiB 3000.46 GB)
    Data Offset : 262144 sectors
   Super Offset : 8 sectors
          State : active
    Device UUID : 4c920d09:40a0ecb9:b65b5bf2:6e466ed7

    Update Time : Tue Jun  3 20:58:42 2014
       Checksum : e13e4087 - correct
         Events : 35176

         Layout : near=2
     Chunk Size : 1024K

   Device Role : Active device 0
   Array State : AAAAAA ('A' == active, '.' == missing)
$ mdadm --examine /dev/sdc
/dev/sdc:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : 5715dcea:bb512ad2:15f0c995:a1e21b5b
           Name : ubuntu:0
  Creation Time : Mon Dec  3 01:05:01 2012
     Raid Level : raid10
   Raid Devices : 6

 Avail Dev Size : 5860271024 (2794.40 GiB 3000.46 GB)
     Array Size : 8790405120 (8383.18 GiB 9001.37 GB)
  Used Dev Size : 5860270080 (2794.39 GiB 3000.46 GB)
    Data Offset : 262144 sectors
   Super Offset : 8 sectors
          State : active
    Device UUID : 78d5a2df:c46b0a98:d8a27284:3047a3e9

    Update Time : Wed Jun  4 00:27:01 2014
       Checksum : 3a3ed14a - correct
         Events : 36170

         Layout : near=2
     Chunk Size : 1024K

   Device Role : Active device 1
   Array State : .AAAAA ('A' == active, '.' == missing)

壊れているわけではなさそうな雰囲気٩(ˊᗜˋ*)و

$ smartctl -a /dev/sdb
(中略)
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
(以下略)

SMARTは大丈夫だったので追加してみる

$ mdadm --re-add /dev/md0 /dev/sdb
mdadm: --re-add for /dev/sdb to /dev/md0 is not possible

(⑅☍﹏⁰)

一回止めてassembleする

$ mdadm --stop /dev/md0
mdadm: stopped /dev/md0
$ mdadm --assemble --run --force /dev/md0 /dev/sd[bcdefg]     
mdadm: forcing event count in /dev/sdc(1) from 36170 upto 36178
mdadm: /dev/md0 has been started with 5 drives (out of 6).

sdcが追加できた

$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md0 : active raid10 sdc[1] sdg[7] sdf[4] sde[3] sdd[2]
      8790405120 blocks super 1.2 1024K chunks 2 near-copies [6/5] [_UUUUU]

unused devices: <none>

sdbを追加して確認してみる

$ mdadm /dev/md0 --add /dev/sdb                          
mdadm: added /dev/sdb
$ cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md0 : active raid10 sdb[6] sdc[1] sdg[7] sdf[4] sde[3] sdd[2]
      8790405120 blocks super 1.2 1024K chunks 2 near-copies [6/5] [_UUUUU]
      [>....................]  recovery =  0.0% (404736/2930135040) finish=482.5min speed=101184K/sec

unused devices: <none>

復旧作業に入った ヾ(❀╹◡╹)ノ゙

一応examineを確認してみる

$ mdadm --examine /dev/sdb
/dev/sdb:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x2
     Array UUID : 5715dcea:bb512ad2:15f0c995:a1e21b5b
           Name : ubuntu:0
  Creation Time : Mon Dec  3 01:05:01 2012
     Raid Level : raid10
   Raid Devices : 6

 Avail Dev Size : 5860271024 (2794.40 GiB 3000.46 GB)
     Array Size : 8790405120 (8383.18 GiB 9001.37 GB)
  Used Dev Size : 5860270080 (2794.39 GiB 3000.46 GB)
    Data Offset : 262144 sectors
   Super Offset : 8 sectors
Recovery Offset : 0 sectors
          State : clean
    Device UUID : 574e70b2:38c28301:a1586a47:11250489

    Update Time : Wed Jun  4 01:49:14 2014
       Checksum : d8dd47a5 - correct
         Events : 36188

         Layout : near=2
     Chunk Size : 1024K

   Device Role : Active device 0
   Array State : AAAAAA ('A' == active, '.' == missing)
$ mdadm --examine /dev/sdc
/dev/sdc:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : 5715dcea:bb512ad2:15f0c995:a1e21b5b
           Name : ubuntu:0
  Creation Time : Mon Dec  3 01:05:01 2012
     Raid Level : raid10
   Raid Devices : 6

 Avail Dev Size : 5860271024 (2794.40 GiB 3000.46 GB)
     Array Size : 8790405120 (8383.18 GiB 9001.37 GB)
  Used Dev Size : 5860270080 (2794.39 GiB 3000.46 GB)
    Data Offset : 262144 sectors
   Super Offset : 8 sectors
          State : clean
    Device UUID : 78d5a2df:c46b0a98:d8a27284:3047a3e9

    Update Time : Wed Jun  4 01:49:14 2014
       Checksum : 3a3de4a3 - correct
         Events : 36188

         Layout : near=2
     Chunk Size : 1024K

   Device Role : Active device 1
   Array State : AAAAAA ('A' == active, '.' == missing)

大丈夫そう(๑・◡・)

これでダメなら予備ディスクと交換する


1 2 3 4 5