angular-highlightjs v0.5.0 released!

November 07, 2015

https://github.com/pc035860/angular-highlightjs/releases/tag/v0.5.0

本來以為之前解掉神秘的 Webpack 問題,這次竟然因為有人嘗試使用 RequireJS 而破功 (X)

之前的 Webpack 問題 https://github.com/pc035860/angular-highlightjs/issues/26#issuecomment-125014758

本來以為順利改成 UMD 了(dependencies 之類的),結果 Webpack 在 UMD 的 syntax 之下竟然會嘗試 resolve 兩種 pattern 的 dependency… (在 browserfiy 正常,在 Webpack 會掛掉)

最後還是透過奇技淫巧,把 UMD 改寫成了一下才順利騙過 Webpack (O)

結果這次回過頭碰到 RequireJS 人,發現 highlightjs 在 npm package 跟 CommonJS 下的名字是不一樣 www https://github.com/pc035860/angular-highlightjs/issues/47#issuecomment-129695318

總之,這次更新修了好幾個 bug,還終於把年初有人建議把所有 directive name 加上 prefix 的部分做掉了(老實說這不會花太多時間,但就是懶…) 有一種隨著 module 越擺越久,出現的問題漸漸比較難解決的 fu (X)

果然難解的問題都是要經過時間歷練的。

另外為何好像都沒有看過中文的 github open source 教學之類的,雖然已經搞了幾個 project 又過了這麼久,我總覺得目前我 維護 open source 專案的 github 操作方式好像不是很正確啊…

這個 repo 終於也突破 200 stars !

angular-easyfb v1.4.0 released!

September 20, 2015

https://goo.gl/9tPWeC

  • 支援 Ad Preview Plugin
  • 有鑑於支援 Ad Preview Plugin,將預設的 platform version 改為最新的 2.4

這次再版號上面其實是有點糾結的,主要是因為經歷了 Facebook Platform 從不需要帶 version 到需要帶 version 的這個轉換。

FB 1.0 -> FB 2.0

原本 init parameters 裡面不帶版號就使用的人再升到 FB 2.0 可能會遇到的問題是

  • 沒有帶版號所以預設使用 FB 2.0,造成自己有再使用的某些 API 崩壞

FB 官方的 API 文件其實是有明確表示需要帶版號的

然而從今年三月過後 FB 1.0 完全 deprecated,我為了盡量不造成人家的 app 掛掉,選擇預設帶入最舊的版號 2.0

FB 2.0 -> FB 2.4

結果前幾天一個新的 PR 表示想要支援一個新的 Facebook plugin 叫做 Ad Preview,這個 plugin 需要的是 FB 2.4。而這真的是尷尬到了極點啊

經過長考(!?)之後,還是決定以後都就直接帶入最新的 platform version 好了,反正依據官方文件這樣才是正確的行為。

於是乎,為了盡量造成最小的損害,我還是讓 version 的中間版號加了個 1 ,表示這還算是個有點大的改動。

Release 之後還是小小的擔心啊…

早餐吃麥片的COPY疑雲

September 06, 2015

Update 2015/09/07 已經收到來自早餐吃麥片的誠意道歉信

前兩天同事貼了一個截圖在 slack,所有在 channel 裡的人都震驚了。

是說如果使用我們家抄筆記來分享文章的話,點進來的人如果沒有安裝抄筆記,會看到一條精美的 側邊欄 (UX持續精進中),提示如果在閱讀英文的過程中碰到障礙可以參考使用我們家的 chrome extension。

對,該名同事只不過在 Facebook 上點了早餐吃麥片分享的 Popdaily 連結,竟然出現了跟我們家相似度高達9成的側邊欄。

早餐吃麥片與抄筆記側邊欄比較

由於這個 blog 基本上還是定位為技術 blog,我們就從多個角度來確認一下到底,只是設計上的相似呢?還是有實質上的 copy 呢?

前置作業

由於早餐吃麥片的版本使用了各種的高科技(X)

想要從瀏覽器上一窺其原始碼或是使用 Chrome DevTools 來分析需要一些小作業。

  • 點進連結之後會發現網址已經被改成 http://blog.morningshop.tw,這是用了 HTML5 pushState 來達到讓你重新整理此頁會直接跑到早餐吃麥片 blog 的效果,按上一頁再來檢視原始碼或開啟 DevTools
  • 發現重新進入頁面,側邊欄卻沒有跳出來,這是由於它使用了 cookie 來限制看到側邊欄的次數。可以直接將 blog.morningshop.tw 底下的 showside 清除或是直接用「無痕模式」來瀏覽

側邊欄附近

抄筆記

早餐吃麥片

<head> 裡面

抄筆記

早餐吃麥片

小結

明眼人大致上看了上面的截圖應該都可以了解兩者之接近程度,然而要怎麼證明是早餐吃麥片 copy 抄筆記,而不是相反呢?

其實早餐吃麥片的工程師感覺是有能力的,大部分該改掉的東西都有改掉,然而還是留下了幾個關鍵:

  1. CSS 檔名還是 note-article.min.css。當初取這個黨名就是因為抄筆記用來分享文章用的,我不懂為啥不把檔名改掉 www
  2. 抄筆記的核心配色是綠色的,CTA按鈕的 :hover:active 狀態也都是綠的,然而這部分被遺漏了 XD

一些感想

從上面的各種截圖可以看出來其實有改的部分也蠻多的,特別我沒有截到的程式碼部分大都是他們自己有另外再寫,利用 cookie 來鎖定兩小時才會看到一次是一個不錯的主意。而且還在持續更新中,硬是在外面的 frame 加上了早餐吃麥片粉絲團、分享跟讚之類的(這部分就覺得太過頭了)。

既然有能力做這些事情,為什麼還要複製我們的程式碼跟畫面呢?

我知道這種事可能對某些人來說是家常便飯,大家可能也見怪不怪,就跟如雨後春筍般冒出的內容農場一樣。

可能半年一年後你的產品大紅大紫,然而夜深人靜的時候請你仔細想想,這樣做你問心無愧嗎?

From Sass(+Compass) to libSass(+compass-mixins)

July 26, 2015

最近又要對抄筆記做不小個改動,於是打算來解決一個困擾我已久的問題: Sass/Compass 有夠慢!

http://lmgtfy.com/?q=sass+slow

舊做法:Compass + concat

其實很早以前我就已經嘗試處理過這個問題,原本所有需要 compile 的 @import 都會回歸到同一個 .scss 檔案,但由於每次在 watch 的狀態下按存檔我都要等個 10 秒左右,最後我就受不了了,於是出現了如下的結構:

sass_tree_01.png sass_tree_02.png

這樣每次會生出 一堆 css(沒有前置底線的都會生成 .css 檔案),然後再透 Grunt 在這些 .css 檔生出來之後把它們 concat 起來,如此在只更改單一檔案的時候(e.g. sass/cards/new-features.scss)就不會需要同時 compile 其它的一大包東西(是說我本來以為 Sass 本身的 cache 機制進場可以解決這個問題,但上網查了一下跟親自試了一下之後覺得似乎沒有什麼幫助…)

此時的 Gruntfile.js (我是用 grunt-contrib-compass) 就生出了這兩段新的 configuration:

// in grunt.initConfig
concat: {
  css: {
    options: {
      separator: ''
    },
    src: [
      '<%= config.concatDir %>/css/*.css',
      '<%= config.concatDir %>/css/cards/*.css'
    ],
    dest: '<%= config.distDir %>/content/css/app.css'
  }
},
watch: {
  css: {
    files: ['<%= config.concatDir %>/css/{,**/}*.css'],
    tasks: ['concat:css']
  }
}

然而在碰到修改的是共用的 _ xxx.scss 或著是需要整包做一次重新 compile 就會要等有點久…

dev_css.gif

新做法:libSass + compass-mixins

  • libSass

    Sass engine 的 C/C++ port 版,運作速度非常非常之快。並且有各個 language 的 wrapper,都可以在頁面上找到。

  • compass-mixins

    脫離了 Ruby Compass 的魔掌之後仍然有 Compass 大部分的 mixin 可以用。

  • grunt-sass

    Grunt + node-sass

安裝必須品

npm install --save-dev compass-mixins
npm install --save-dev grunt-sass

修改 Gruntfile.js

// in grunt.initConfig
sass: {
  options: {
    includePaths: [
      // 把 compass-mixins 加到 sass 的 include path
      'node_modules/compass-mixins/lib'
    ]
  },
  dist: {
    options: {
      sourceComments: true
    },
    // 用 grunt 展開檔案丟給 node-sass
    // ref: http://gruntjs.com/configuring-tasks#globbing-patterns
    files: [{
      expand: true,
      cwd: '<%= config.appDir %>/sass',
      src: '{,**/}*.scss',
      dest: '<%= config.concatDir %>/css',
      ext: '.css'
    }]
  }
}

值得注意的是如果是從 Compass 轉移過來的話,原本 Compass 是自動 compile 整個設定的 Sass 資料夾內非 _ 開頭的 Sass 檔案,而 node-sass 的 compile 是以單一檔案為基礎的,因此在這邊我們需要透過 Grunt 的 globbing patterns 把原本 Compass 設定的 Sass 資料夾內的檔案展開餵給 grunt-sass。

如果你沒有這個需求,可以直接參考 grunt-sass 的 README 有最基本的一對一設定方法:

sass: {
  options: {
    sourceMap: true
  },
  dist: {
    files: {
        'main.css': 'main.scss'
    }
  }
}

馬上來試一下速度怎麼樣!

dev_css_after.gif

後記

其實當時要改成 Compass + concat 前我就已經有稍微調查過 node-sass,不過那時候恰恰是 Sass 迎來升上 3.3 並且 Compass 迎向 1.0 的可怕時刻,然而偏偏我就是需要 Sass 3.3 才有的功能,而 libSass 的進展畢竟還是沒有直接跟上 Sass,最後我只好作罷。

Switching from Ruby Sass to LibSass http://www.sitepoint.com/switching-ruby-sass-libsass/

時過境遷,後來 Ruby Sass 停下來等 libSass 追上後再齊頭並進,才有了今天這麼快速又不落人後的 libSass!

Sass Compatibility http://sass-compatibility.github.io/

果然在這個變化快速的產業,偶爾就是需要讓子彈飛一陣子。

giphy.gif

週末長知識: 為什麼 Chrome 看這次的 Apple 網頁怪怪的?

June 14, 2015

每次 Apple 做完新的 event 總是會搭配新網頁上線,相信很多人都會去逛逛。

以下的畫面是來自 Google Chrome 43:

apple_rocks_chrome.gif

那個 1 hr 是否有一種留白的 epic 感 (誤)

Read on