Monday, March 9, 2015

Using gvim under Cygwin

Today I am trying to using gvim under Cygwin console but it failed:
$ which vim
/usr/bin/vim

$ which gvim
/usr/bin/gvim

$ gvim
E233: <δΈθƒ½ι–‹ε•Ÿ X Server DISPLAY>
Press ENTER or type command to continue

From below link we know I have to install X-Server to Cygwin:
http://stackoverflow.com/questions/12430633/how-can-i-get-mintty-cygwin-terminal-to-open-gvim-in-a-new-window

Here are how to install and enable X-Server under Cygwin:
[Official site]
http://x.cygwin.com/

[Installing Cygwin/X]
A listing of the Cygwin/X packages is given below; a listing of the general Cygwin packages would be beyond the scope of this document.
Cygwin/X packages are located in the X11 category.
  • xorg-server (required, the Cygwin/X X Server)
  • xinit (required, scripts for starting the X server: xinitstartxstartwin (and a shortcut on the Start Menu to run it), startxdmcp.bat )
  • xorg-docs (optional, man pages)
  • xlaunch (optional, a wizard for starting X sessions)
  • You may also select any X client programs you want to use, and any fonts you would like to have available.
  • You may also want to ensure that the openssh package is selected if you wish to use ssh connections to run remote X clients.
  • You may also want to ensure that the inetutils or rsh packages are selected if you wish to use telnet or rsh connections to run remote X clients. (not recommended)
[Starting Cygwin/X]
$ startxwin

Welcome to the XWin X Server
Vendor: The Cygwin/X Project
Release: 1.17.1.0
OS: CYGWIN_NT-6.1 TW1W7D-400077 1.7.35(0.287/5/3) 2015-03-04 12:09 x86_64
OS: Windows 7 Service Pack 1 [Windows NT 6.1 build 7601] (Win64)
Package: version 1.17.1-2 built 2015-02-23

XWin was started with the following command line:

/usr/bin/XWin :0 -multiwindow -auth /home/linst/.serverauth.7912

(II) xorg.conf is not supported
(II) See http://x.cygwin.com/docs/faq/cygwin-x-faq.html for more information
LoadPreferences: /home/linst/.XWinrc not found
LoadPreferences: Loading /etc/X11/system.XWinrc
LoadPreferences: Done parsing the configuration file...
winDetectSupportedEngines - DirectDraw4 installed, allowing ShadowDDNL
winDetectSupportedEngines - Returning, supported engines 00000005
winSetEngine - Multi Window or Rootless => ShadowGDI
winScreenInit - Using Windows display depth of 32 bits per pixel
winAllocateFBShadowGDI - Creating DIB with width: 3520 height: 1080 depth: 32
winFinishScreenInitFB - Masks: 00ff0000 0000ff00 000000ff
winInitVisualsShadowGDI - Masks 00ff0000 0000ff00 000000ff BPRGB 8 d 24 bpp 32
MIT-SHM extension disabled due to lack of kernel support
XFree86-Bigfont extension local-client optimization disabled due to lack of shared memory support in the kernel
glWinSelectGLimplementation: Loaded 'cygnativeGLthunk.dll'
(II) AIGLX: Testing pixelFormatIndex 5
GL_VERSION:     4.5.0 NVIDIA 347.25
GL_VENDOR:      NVIDIA Corporation
GL_RENDERER:    GeForce GT 640/PCIe/SSE2
(II) AIGLX: enabled GLX_SGI_make_current_read
(II) AIGLX: enabled GLX_MESA_copy_sub_buffer
(II) AIGLX: enabled GLX_SGI_swap_control and GLX_MESA_swap_control
(II) AIGLX: enabled GLX_SGIX_pbuffer
(II) AIGLX: enabled GLX_ARB_multisample and GLX_SGIS_multisample
(II) 482 pixel formats reported by wglGetPixelFormatAttribivARB
(II) AIGLX: Set GLX version to 1.4
(II) 323 fbConfigs
(II) ignored pixel formats: 0 not OpenGL, 54 RBGA float, 69 RGBA unsigned float, 0 unknown pixel type, 36 unaccelerated
(II) GLX: Initialized Win32 native WGL GL provider for screen 0
winPointerWarpCursor - Discarding first warp: 1760 540
(--) 8 mouse buttons found
(--) Setting autorepeat to delay=500, rate=31
(--) Windows keyboard layout: "00000409" (00000409) "US", type 4
(--) Found matching XKB configuration "English (USA)"
(--) Model = "pc105" Layout = "us" Variant = "none" Options = "none"
Rules = "base" Model = "pc105" Layout = "us" Variant = "none" Options = "none"
winInitMultiWindowWM - DISPLAY=:0.0
winMultiWindowXMsgProc - DISPLAY=:0.0
winProcEstablishConnection - winInitClipboard returned.
winClipboardThreadProc - DISPLAY=:0.0
OS maintains clipboard viewer chain: yes
winInitMultiWindowWM - XOpenDisplay () returned and successfully opened the display.
winMultiWindowXMsgProc - XOpenDisplay () returned and successfully opened the display.
winClipboardProc - XOpenDisplay () returned and successfully opened the display.
winMultiWindowXMsgProcErrorHandler - ERROR: BadMatch (invalid parameter attributes)

After that, a new window will opened, you can now start gvim($ gvim) correctly!

[Switching out of Cygwin/X]
[Stopping Cygwin/X]

Qt 5.4 CMake Manual

This manual details the specifics of how to use Qt 5 with CMake. The minimum version required to use Qt5 is CMake 2.8.3, but 2.8.11 is recommended.

http://doc.qt.io/qt-5/cmake-manual.html

Friday, February 27, 2015

Using Homebrew to install missing cscope/Exuberant Ctags/wget package on my MAC

I am using Homebrew as my MAC package manager now, here's my steps to install missing wget/cscope packages to my macbook pro:

1. Search if there is a "cscope" FORMULA in current Homebrew library:
$ brew search cscope
cscope


2. Start to install cscope:
$ brew install cscope
==> Downloading https://homebrew.bintray.com/bottles/cscope-15.8a.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring cscope-15.8a.yosemite.bottle.tar.gz
🍺  /usr/local/Cellar/cscope/15.8a: 10 files, 736K


3. Install Exuberant ctags:
$ brew search ctags
ctags      rbenv-ctags
homebrew/php/phpctags

$ brew install ctags
==> Downloading https://homebrew.bintray.com/bottles/ctags-5.8.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring ctags-5.8.yosemite.bottle.tar.gz
==> Caveats
Under some circumstances, emacs and ctags can conflict. By default,
emacs provides an executable `ctags` that would conflict with the
executable of the same name that ctags provides. To prevent this,
Homebrew removes the emacs `ctags` and its manpage before linking.

However, if you install emacs with the `--keep-ctags` option, then
the `ctags` emacs provides will not be removed. In that case, you
won't be able to install ctags successfully. It will build but not
link.
==> Summary
🍺  /usr/local/Cellar/ctags/5.8: 8 files, 364K


4. Same way to install wget:
$ brew install wget
==> Installing wget dependency: openssl
==> Downloading https://homebrew.bintray.com/bottles/openssl-1.0.2.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring openssl-1.0.2.yosemite.bottle.tar.gz
==> Caveats
A CA file has been bootstrapped using certificates from the system
keychain. To add additional certificates, place .pem files in
  /usr/local/etc/openssl/certs

and run
  /usr/local/opt/openssl/bin/c_rehash

This formula is keg-only, which means it was not symlinked into /usr/local.

Mac OS X already provides this software and installing another version in
parallel can cause all kinds of trouble.

Apple has deprecated use of OpenSSL in favor of its own TLS and crypto libraries

Generally there are no consequences of this for you. If you build your
own software and it requires this formula, you'll need to add to your
build variables:

    LDFLAGS:  -L/usr/local/opt/openssl/lib
    CPPFLAGS: -I/usr/local/opt/openssl/include

==> Summary
🍺  /usr/local/Cellar/openssl/1.0.2: 459 files, 18M
==> Installing wget
==> Downloading https://homebrew.bintray.com/bottles/wget-1.16.1.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring wget-1.16.1.yosemite.bottle.tar.gz
🍺  /usr/local/Cellar/wget/1.16.1: 9 files, 940K


References:
http://bearlin001.blogspot.tw/2015/02/homebrew-missing-package-manager-for-os.html

Homebrew: The missing package manager for OS

This is the steps I install homebrew to my macbook pro:

1. Install Homebrew itself:
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
==> This script will install:
/usr/local/bin/brew
/usr/local/Library/...
/usr/local/share/man/man1/brew.1

Press RETURN to continue or any other key to abort
==> /usr/bin/sudo /bin/mkdir /usr/local

WARNING: Improper use of the sudo command could lead to data loss
or the deletion of important system files. Please double-check your
typing when using sudo. Type "man sudo" for more information.

To proceed, enter your password, or type Ctrl-C to abort.

Password:
==> /usr/bin/sudo /bin/chmod g+rwx /usr/local
==> /usr/bin/sudo /usr/bin/chgrp admin /usr/local
==> /usr/bin/sudo /bin/mkdir /Library/Caches/Homebrew
==> /usr/bin/sudo /bin/chmod g+rwx /Library/Caches/Homebrew
==> Downloading and installing Homebrew...
remote: Counting objects: 233669, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 233669 (delta 0), reused 0 (delta 0), pack-reused 233666
Receiving objects: 100% (233669/233669), 29.63 MiB | 423.00 KiB/s, done.
Resolving deltas: 100% (175242/175242), done.
From https://github.com/Homebrew/homebrew
 * [new branch]      master     -> origin/master
HEAD is now at 00667c7 go: show what arch and os is currently building
==> Installation successful!
==> Next steps
Run `brew doctor` before you install anything
Run `brew help` to get started


2. Run Homebrew doctor:
$ brew doctor
Your system is ready to brew.

3. Install package:
$ brew install wget
==> Installing wget dependency: openssl
==> Downloading https://homebrew.bintray.com/bottles/openssl-1.0.2.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring openssl-1.0.2.yosemite.bottle.tar.gz
==> Caveats
A CA file has been bootstrapped using certificates from the system
keychain. To add additional certificates, place .pem files in
  /usr/local/etc/openssl/certs

and run
  /usr/local/opt/openssl/bin/c_rehash

This formula is keg-only, which means it was not symlinked into /usr/local.

Mac OS X already provides this software and installing another version in
parallel can cause all kinds of trouble.

Apple has deprecated use of OpenSSL in favor of its own TLS and crypto libraries

Generally there are no consequences of this for you. If you build your
own software and it requires this formula, you'll need to add to your
build variables:

    LDFLAGS:  -L/usr/local/opt/openssl/lib
    CPPFLAGS: -I/usr/local/opt/openssl/include

==> Summary
🍺  /usr/local/Cellar/openssl/1.0.2: 459 files, 18M
==> Installing wget
==> Downloading https://homebrew.bintray.com/bottles/wget-1.16.1.yosemite.bottle.tar.gz
######################################################################## 100.0%
==> Pouring wget-1.16.1.yosemite.bottle.tar.gz
🍺  /usr/local/Cellar/wget/1.16.1: 9 files, 940K

4. Update Homebrew:
$ brew update
Already up-to-date.

5. Homebrew helps:
$ brew --help
Example usage:
  brew [info | home | options ] [FORMULA...]
  brew install FORMULA...
  brew uninstall FORMULA...
  brew search [foo]
  brew list [FORMULA...]
  brew update
  brew upgrade [FORMULA...]
  brew pin/unpin [FORMULA...]

Troubleshooting:
  brew doctor
  brew install -vd FORMULA
  brew [--env | config]

Brewing:
  brew create [URL [--no-fetch]]
  brew edit [FORMULA...]
  open https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/Formula-Cookbook.md

Further help:
  man brew
  brew home


References:
http://brew.sh/
https://blog.engineyard.com/2010/homebrew-os-xs-missing-package-manager/ https://github.com/Homebrew/homebrew

Monday, February 23, 2015

QFontMetrics Class

http://doc.qt.io/qt-5/qfontmetrics.html
http://doc.qt.io/qt-5/qfont.html

https://www.google.com.tw/search?q=QFontMetrics&lr=lang_zh-CN%7Clang_zh-TW&es_sm=122&biw=1920&bih=955&tbs=lr:lang_1zh-CN%7Clang_1zh-TW&source=lnms&tbm=isch&sa=X&ei=FiDsVJfRCsacugTskILYDQ&ved=0CAsQ_AUoBA

https://developer.apple.com/library/mac/documentation/TextFonts/Conceptual/CocoaTextArchitecture/Art/glyph_metrics_2x.png

Monday, November 10, 2014

FacebookSDK how to request permissions

General:
https://developers.facebook.com/docs/facebook-login/permissions/v2.2

List of all permissions:
https://developers.facebook.com/docs/facebook-login/permissions/v2.2#reference

How to request permissions:
https://developers.facebook.com/docs/facebook-login/permissions/v2.2#adding [Generic description]
https://developers.facebook.com/docs/android/login-with-facebook/v2.2 [For Android]

Friend list interface in Facebook SDK after API Version v2.0

[GET /v2.2/me HTTP/1.1]
A user represents a person on Facebook. The /{user-id} node returns a single user.
1. Go to https://developers.facebook.com/docs/graph-api/reference/v2.2/user
2. Click "Graph Explorer" -> "Get Access Token" -> "User Data Permissions" -> Select "user_about_me" -> Click "Get Access Token", you will see a access token look like "CAACEdEose ... ccKEs" show in the field, then click Submit.
3. You will see a JSON string which is an array of Friendlist objects, Ex:
{
    "id": "1234123412341234",
    "bio": "I love music!",
    "first_name": "bear",
    "gender": "male",
    "last_name": "lin",
    "link": "https://www.facebook.com/app_scoped_user_id/1234123412341234/",
    "locale": "zh_TW",
    "name": "bear lin",
    "timezone": 8,
    "updated_time": "2013-11-17T09:22:13+0000",
    "verified": true
}
4. The more Access token you select, the more information will return.


[GET /v2.2/me/friendlists HTTP/1.1]
A person's 'friend lists' - these are groupings of friends such as "Acquaintances" or "Close Friends", or any others that may have been created
1. Go to https://developers.facebook.com/docs/graph-api/reference/v2.2/user/friendlists
2. Click "Graph Explorer" -> "Get Access Token" -> "Extended Permissions" -> Select "read_friendlists" -> Click "Get Access Token", you will see a access token look like "CAACEdEose ... ccKEs" show in the field, then click Submit.
3. You will see a JSON string which is an array of Friendlist objects, Ex:
{
    "data": [
        {
            "id": "4777092484211",
            "name": "Artists",
            "list_type": "user_created"
        },
        {
            "id": "4777064723517",
            "name": "Musicians",
            "list_type": "user_created"
        }
    ],
    "paging": {
        "next": "https://graph.facebook.com/v2.2/1234123412341234/friendlists?limit=5000&offset=5000&__after_id=enc_AeyE7DuzMXSU9JFIGYuR1XfRcZT-U6YI205muBRRkOIAIAk_UhLZ3kMtWkS67_mgwuE"
    }
}

[GET /v2.2/{friendlist-id} HTTP/1.1]
A friend list - an object which refers to a grouping of friends created by someone or generated automatically for someone (such as the "Close Friends" or "Acquaintances" lists)
1. Go to https://developers.facebook.com/docs/graph-api/reference/v2.2/friendlist
2. In the "Graph Explorer" you should replace "{friendlist-id}" with a valid Id(ex: 4777092484211, you can get it from /v2.2/me/friendlists).
3. After submit, Ex:
{
    "id": "4777092484211",
    "name": "Artists",
    "list_type": "user_created"
}
NameDescriptionType
idThe friend list IDstring
nameThe name of the friend liststring
list_typeThe type of the friend listenum{close_friends, acquaintances, restricted, user_created, education, work, current_city, family}

[GET /v2.2/me/friends HTTP/1.1]
A person's friends.
"Friend list now only returns friends who also use your app".
Read below articles fist:
http://stackoverflow.com/questions/23417356/facebook-graph-api-v2-0-me-friends-returns-empty-or-only-friends-who-also-u
https://developers.facebook.com/docs/apps/changelog [Read API Version v2.0 changelog]

1. Go to https://developers.facebook.com/docs/graph-api/reference/v2.2/user/friends
2. In the "Graph Explorer":
Permissions
  • A user access token with user_friends permission is required to view the current person's friends.
  • This will only return any friends who have used (via Facebook Login) the app making the request.
  • If a friend of the person declines the user_friends permission, that friend will not show up in the friend list for this person.
3. After submit: Ex:
{
    "data": [
        {
            "name": "Eric",
            "id": "33333333333333"
        },
        {
            "name": "Lee",
            "id": "111111111111"
        }
    ],
    "paging": {
        "next": "https://graph.facebook.com/v2.2/1234123412341234/friends?limit=25&offset=25&__after_id=enc_AexidG6KKymgeEvLC38u6ERUDQud__sm2tYQkoPMs2ba6l8E17X73s-pSYx5y5hnuDdwFpyt23dt_Gi3GWiZ1raR"
    },
    "summary": {
        "total_count": 307
    }
}
4. You can also using Postman:
GET /v2.2/1234123412341234/friends?access_token=CAACEdEose0cBAIBIg6ZA9P9YNQQxLpmzT4VSBj2dYClv7vIM7aeXNoHpRTq27yGPh14szRVC2VVU6727V66BItbgUuco1tHVo6ZAwr2LhLlZCu3KxuHSuW6ZASBWm9T44RWWnHCbvFELTSJkveqArEAVEdPwkjHIyDFiAQJX6na9uESefCVfX0e4fUNvKjAkvK7b7BSKkhkCEKulWhPO HTTP/1.1
Host: graph.facebook.com


After API Version v2.0, "/me/friends" no longer return full friends list, it only returns the user's friends who are also using your app, please read: http://stackoverflow.com/questions/23417356/facebook-graph-api-v2-0-me-friends-returns-empty-or-only-friends-who-also-u
------------------------------------------------------------------------------------------------------------------------------
In v2.0 of the Graph API, calling /me/friends returns the person's friends who also use the app.
In addition, in v2.0, you must request the user_friends permission from each user. user_friendsis no longer included by default in every login. Each user must grant the user_friends permission in order to appear in the response to /me/friends. See the Facebook upgrade guide  for more detailed information, or review the summary below.
If you want to access a list of non-app-using friends, there are two options:
  1. If you want to let your people tag their friends  in stories that they publish to Facebook using your App, you can use the /me/taggable_friends API. Use of this endpoint requires review by Facebook  and should only be used for the case where you're rendering a list of friends in order to let the user tag them in a post.
  2. If your App is a Game AND your Game supports Facebook Canvas , you can use the /me/invitable_friends endpoint in order to render a custom invite dialog , then pass the tokens returned by this API to the standard Requests Dialog. 
In other cases, apps are no longer able to retrieve the full list of a user's friends (only those friends who have specifically authorized your app using the user_friends permission). This has been confirmed by Facebook as 'by design'. 
For apps wanting allow people to invite friends to use an app, you can still use the Send Dialog on Web or the new Message Dialog on iOS  and Android .
UPDATE: Facebook have published an FAQ on these changes here:https://developers.facebook.com/docs/apps/faq  which explain all the options available to developers in order to invite friends etc.
------------------------------------------------------------------------------------------------------------------------------
References:
https://developers.facebook.com/docs/apps/faq
https://developers.facebook.com/docs/apps/changelog [Read API Version v2.0 changelog]
https://developers.facebook.com/docs/apps/upgrading#upgrading_v2_0_user_ids

[TODO]
https://developers.facebook.com/docs/graph-api/reference/v2.2/user/taggable_friends
https://developers.facebook.com/docs/graph-api/reference/v2.2/user/invitable_friends