沒穿方服

索引

顯示╱隱藏內文

104 會員中心的「工作」頁面(職缺搜尋),例如 pda.104.com.tw/work/mate/list,一堆公司不寫清楚在做什麼,看介紹才發現又是博奕,直接進黑名單。

但是內建的排除功能不太方便,所以寫了一支簡易自救;
將 bookmarklet 加進書籤 → 104 職缺 忽略特定公司

原始碼放在 bootleq/bookmarklets/blob/master/tw-104-mate-list.js
單純是用 MutationObserver,沒有很特別的地方。


其實 104 有提供排除功能(自訂配對條件才有),可以排除 20 個公司。 104 內建的排除功能

團隊在 rails console 用了 ap 來顯示每個指令的執行結果,有好有壞,缺點之一是遇上層層包疊的類別,又沒有特別處理 inspect 方法時,會直接輸出大段文字,格式難看,干擾開發。

其實 ap 會對特定類別調整顯示,例如 ActiveRecord::Base 物件會被顯示為 attributes 的 hash,但想自訂其他規則的話,目前還沒有簡單方法。

最後用了 monkey patch 達成,對想改的類別逐一動手,暫時夠用了。 我改的是 PG::ResultReform::FormTrailblazer::Operation 三個類別,見 gist,放到 Rails 專案的 config/initializers/ 下面。

例子,PG::Result 物件

調整前,顯示的是 inspect 結果,加上 raw 選項會漂亮一些,但資訊不算有用。 調整前

調整後,模仿 AR 顯示查詢出來的記錄。 另外如果有裝 table_print,可以選擇輸出 table 格式。 調整後

總算可以簡單偵測分頁關閉,發生順序是 TabLeaveTabClosedTabEnter,在 TabClosed 的時候就能取得新的 tabpagenr('$') 了。

簡化 Vim 切換至最後選取的 tab 功能:

if exists('##TabClosed')
  function! LastTab(act)
    let lt = g:lasttab

    if a:act ==# 'TabLeave'
      let lt.prevLeave = lt.leave
      let lt.leave = tabpagenr()
    elseif a:act ==# 'TabClosed'
      let lt.leave = lt.prevLeave
    elseif a:act ==# 'switch'
      let to = lt.leave
      if to == tabpagenr()
        echo 'Already on last tab.'
      else
        execute "tabnext " . lt.leave
      endif
    endif
  endfunction

  if !exists('g:lasttab')
    let g:lasttab = {'leave':1, 'prevLeave':1}
  endif

  autocmd TabLeave * call LastTab('TabLeave')
  autocmd TabClosed * call LastTab('TabClosed')

  nnoremap <silent> <LocalLeader>t :call LastTab('switch')<CR>
  inoremap <silent> <LocalLeader>t <C-\><C-N>:call LastTab('switch')<CR>
endif

Vim 已經有一個盤古之白的專案 PanGu.vim,但我還是另外寫了 bootleq/vim-wordword

根源問題

大部分語言書寫都是以空白作文字區隔,例如 this one 兩字中間的空白;
而中文是一個例外,我們每個字都是連在一起的

當混用兩種文字系統時,例如「word文字word」,就不知道交接處要不要加空白了。
雖然不會有「word文 是一個字,字word 是另一個字」的問題,但「word文字」連在一起又似乎和「word 文字」有不同意境。

Word divider 相關花絮

  • 西方歷史上也有完全不使用空白和符號間隔的 scriptio continuaVergilius Augusteus, Georgica 141

  • 日文一般來說和中文一樣,但包含大量假名時可以有例外,比較像韓文(未確認),在真正斷字的地方加上空白。

  • CSS4 有個 text spacing 草案,但好像沒有明確相關的部分。

精簡的 Vim 盤古之白實作

因為 Vim 的 regexp 可以搜尋 word boundary,又 multibyte 文字永遠被視為 word(見 'iskeyword'選項),所以其實只要 :%substitute/\>\<./ \0/g 就搞定了加空白的工作。

Vim plugin 適合 Unix 哲學

比起處理更多(甚至包含未有定論的)排版規則,專心做好「加上空白」比較重要。
而要發揮工具的最大價值,應儘力減少在 Vim 中使用它的成本,例如提供 user-operator 或其它容易呼叫的介面。

處理了一個以日文 IME(半型假名模式)輸入數字時,按下 Enter,值就變成 2 倍的狀況。

組字中,輸入 123 組字完成,值變成 123123

這個表單用了一個自訂的 angular $formatter,每當輸入值變動時,便即時把非數字的字元移掉(使用 $element.val(newValue))。

先不論在 $formatter 中變更元素的值是否恰當,這個問題最後被釐清為一個情境,就是在 compositionend(IME 組字完成)事件中,如果以 JavaScript 修改 <input> 的 value,會發生什麼事呢?

經測試,Firefox 在「IME 送出字串」和「JS 設定的值」相同時,input 可以接受該值;反之不相同時,input 的值會被取消(變成空的)。

而這次的 bug 只會在 Google Chrome 上發生,input 內容會是「JS 設定的值」,後面再接著「IME 送出的最後一組字串」,合起來就是前面圖中的 123123。

測試用 jsfiddle:

Workaround

藉由 setTimeout 讓設值在 compositionend 之後再執行。