$ sudo apt-get install sqlite3-pcre
$ file /usr/lib/sqlite3/pcre.so
/usr/lib/sqlite3/pcre.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0afc1236e89d4a8b99746f231049101172714c2c, stripped
$ sqlite3
SQLite version 3.11.0 2016-02-15 17:29:24
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> SELECT date();
2018-10-19
sqlite> SELECT date() AS d WHERE d REGEXP '[0-9]';
Error: no such function: REGEXP
sqlite> .load /usr/lib/sqlite3/pcre.so
sqlite> SELECT date() AS d WHERE d REGEXP '[0-9]';
2018-10-19
sqlite> SELECT date() AS d WHERE d REGEXP '^[0-9]$';
sqlite> SELECT date() AS d WHERE d REGEXP '^[0-9]+$';
sqlite> SELECT date() AS d WHERE d REGEXP '^[0-9\-]+$';
2018-10-19
2018年10月20日 星期六
[SQL] 在 SQLite3 環境中,使用 Regular Expression @ Ubuntu 16.04
2018年10月11日 星期四
PHP 開發筆記 - 判斷瀏覽器語系機制
就 Javascript 來說,很方便:
而 server site 就靠 $_SERVER['HTTP_ACCEPT_LANGUAGE'] 啦,但他的格式還會有語系偏好比重,需要小小處理一番:
var userLanguage = navigator.language || navigator.userLanguage;
而 server site 就靠 $_SERVER['HTTP_ACCEPT_LANGUAGE'] 啦,但他的格式還會有語系偏好比重,需要小小處理一番:
//
// $_SERVER['HTTP_ACCEPT_LANGUAGE'] == 'zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7';
//
function _detect_browser_language($_SERVER_VAR, $system_prefer = array( 'en' => 1, 'cn' => 1 )) {
if (isset($_SERVER_VAR['HTTP_ACCEPT_LANGUAGE'])) {
$langs = array();
foreach(explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $entry) {
$t1 = explode(';', $entry);
$cnt = count($t1);
if ($cnt == 2) {
$t2 = explode('=', $t1[1]);
if (count($t2) == 2)
array_push($langs, array($t1[0], floatval($t2[1])));
else
array_push($langs, array($t1[0], 1.0));
} else if ($cnt == 1)
array_push($langs, array($t1[0], 1.0));
}
function lang_prefer_sort($a, $b) {
if( $a[1] == $b[1] ) return 0;
if( $a[1] > $b[1] ) return -1;
return 1;
}
usort($langs, 'lang_prefer_sort');
foreach($langs as $lang_info) {
if (is_array($lang_info)) {
if (isset($system_prefer[$lang_info[0]]))
return $lang_info[0];
$checker = explode('-', $lang_info[0]);
if (count($checker) == 2) {
if (isset($system_prefer[$checker[0]]))
return $checker[0];
else if ($checker[0] == 'zh')
return 'cn';
}
}
}
}
return 'en';
}
2018年9月18日 星期二
Android 開發筆記 - MenuItemCompat.getActionProvider return null
週末練練 Android 手感,試試 Cast SDK ,結果連最簡單的 CastButton 都弄不出來,一直碰到:
跑去看了一下 CastButtonFactory.setUpMediaRouteButton 程式碼:
才確認應該有什麼搞錯了,再追了一下,果真是 menu 的 xml 描述有問題,不小心把 app namespace 弄錯了,錯誤:
正確:
就這樣耍廢了兩三個小時。
程式範例也才幾句話:
為了 debug :
java.lang.IllegalArgumentException: menu item with ID ###### doesn't have a MediaRouteActionProvider.
跑去看了一下 CastButtonFactory.setUpMediaRouteButton 程式碼:
public static MenuItem setUpMediaRouteButton(Context context, Menu menu, int i) {
zzac.zzdn("Must be called from the main thread.");
zzac.zzw(menu);
CastContext sharedInstance = CastContext.getSharedInstance(context);
MenuItem findItem = menu.findItem(i);
if (findItem == null) {
throw new IllegalArgumentException(String.format(Locale.ROOT, "menu doesn't contain a menu item whose ID is %d.", new Object[]{Integer.valueOf(i)}));
}
MediaRouteActionProvider mediaRouteActionProvider = (MediaRouteActionProvider) MenuItemCompat.getActionProvider(findItem);
if (mediaRouteActionProvider == null) {
throw new IllegalArgumentException(String.format(Locale.ROOT, "menu item with ID %d doesn't have a MediaRouteActionProvider.", new Object[]{Integer.valueOf(i)}));
}
mediaRouteActionProvider.setRouteSelector(sharedInstance.getMergedSelector());
return findItem;
}
才確認應該有什麼搞錯了,再追了一下,果真是 menu 的 xml 描述有問題,不小心把 app namespace 弄錯了,錯誤:
xmlns:app="http://schemas.android.com/tools"
正確:
xmlns:app="http://schemas.android.com/apk/res-auto"
就這樣耍廢了兩三個小時。
程式範例也才幾句話:
@Override public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.navigation, menu);
CastButtonFactory.setUpMediaRouteButton(getApplicationContext(),
menu,
R.id.media_route_menu_item);
return true;
}
為了 debug :
@Override public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.navigation, menu);
MenuItem mMenuItem = menu.findItem(R.id.media_route_menu_item);
if (mMenuItem != null) {
Log.v("onCreateOptionsMenu", "Found");
MediaRouteActionProvider mediaRouteActionProvider =
(MediaRouteActionProvider) MenuItemCompat.getActionProvider(mMenuItem);
if (mediaRouteActionProvider != null) {
Log.v("MediaRouteActionProvider", "Found");
} else {
Log.v("MediaRouteActionProvider", "Not Found");
}
} else {
Log.v("onCreateOptionsMenu", "Not Found");
}
return true;
2018年9月16日 星期日
刻意練習
2018年8月7日 星期二
攀談
跟幾位老友哈拉幾句,又再次發現空氣的新鮮。後來也才知道,大家進退之間,早已找好了位置。幾天前跟一位在 CIO 熱潮的前同事哈拉,順便細細地思考自己到底在追尋著什麼。
每一次的攀談都是不錯的躍進,可惜的是話上句點後,又瞬間跌落谷底 XD 什麼也沒改變。
老同事推薦翻翻李笑來的 "通往財富自由之路" ,重點落在複利的學習力、好好善用自己的長才去累積價值。
這幾天也認識了一位剛三十歲的女強人,先去泰國學語言幾個月,接著開公司、批深圳的貨來泰國賣,搞通泰國銷售流程、客服跟在地行銷,實在佩服。她不是業務出身,而完全就是同背景的IT系統整合,懂的善用時間不自己造輪(Shopify),懂的分析時勢在東南亞找到適合的位置,就這樣努力衝刺著,著實佩服。雖然跟老友哈拉這案例時,總會回歸到個人到底有多少資源可發揮,但我認為最重要仍是執行力啦。
隨時間流逝,會有越來越多的感觸吧,那可能已經不是後悔了。
訂閱:
文章 (Atom)
