2015年9月30日 星期三

斷網連線虛擬機

早幾天的 Host-Only Adapter 連接方法雖然可行,但有時需要在 VM 中安裝新程式時就變得無能為力。我希望無論 MacBook 有沒有連線,都能直接使用 IP 地址在瀏覽器執行 CentOS 內的 PHP 程式,包括 phpMyAdmin。要是 MacBook 連線時,VM 同樣也能連線。就這個目標,我嘗試改善一下。成功找到設定的方法:

首先,在 VirtualBox 的 Preference 內的 Network 頁,點選「Host-only Networks」。按右面的「+」圖示生成「vboxnet0」。然後點選螺絲批圖示。


在「Adapter」頁輸入一個新網域地址。可以是「192.168.2.1」,又或像我隨意「192.168.98.10」。


下一步是確認「DHCP Server」頁沒有打勾。


然後打開 VM 的設定,跳到「Network」內的「Adapter 1」。把這個設定成「NAT」,作為上網及更新之用。


跟住是把「Adapter 2」設定為「Host-only Adapter」,選取剛剛設定好的「vboxnet0」。儲存設定並開啟 VM。

成功開機後登入,確認一下 http:///etc/udev/rules.d/70-persistent-net.rules 內有沒有重複的 ATTR 出現。有的話把重複 ethX 哪個刪掉就可以。相同 ethX 會導致設定無效。


回到終端機,跳轉到 /etc/sysconfig/network-scripts/。把 ifcfg-eth0 複製成 ifcfg-eth1。指令是「cp ifcfg-eth0 ifcfg-eth1」。然後以「vi ifcfg-eth1」修改設定內容。把 DEVICE 改為「eth1」;把 HWADDR 地址設定為圖四般你自己的「Adapter 2」的「MAC Address」。記得把 UUID 刪去。輸入「:wq」儲存後離開,重啟後完成。

2015年9月28日 星期一

用 UIButton 製作開關掣


今日嘗試利用 UIButton 製作成只有「開」及「關」兩個狀態的按鈕。原來不容易,花的時間比預計的多。

不解釋,直接來代碼:
button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setTag:i];
[button setFrame:rect];
[button setBackgroundColor:[UIColor redColor]];
[button setTitle:string forState:UIControlStateNormal];
[button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[button.titleLabel setFont:fontTag];
[button.layer setCornerRadius:(rect.size.height*0.5f)];
[button addTarget:self action:@selector(changeSubCategory:) forControlEvents:UIControlEventTouchUpInside];
[scrollView addSubview:button];
- (void)changeSubCategory:(UIButton *)button  {
    button.selected = !button.selected;
    if (button.selected == NO)  {
        [button setBackgroundColor:[UIColor darkGrayColor]];
    }  else  {
        [button setBackgroundColor:[UIColor redColor]];
    }

    //  Do some more things...
}

2015年9月26日 星期六

解決 Nginx 下 phpMyAdmin 登入沒反應的問題


為了更有效地開發服務器端的程式,特別是經常在外沒有連線能力的地方也能繼續,於是在 MacBook Pro 上安裝《VirtualBox》,建立 CentOS 6 + Nginx + MySQL + PHP + phpMyAdmin 的環境。

安裝方法很簡單,網上也有很多的教學。我選的是「CentOS-6.7-x86_64-minimal.iso」版本來安裝。完成 CentOS 6 安裝後,輸入以下指令:
  • ifup eth0
  • yum update
  • yum upgrade
    yum install nginx
  • yum -y install epel-release
  • vi /etc/sysconfig/iptables
    在 iptables 開通 Port 80 及 22:
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -m comment --comment "SFTP port" -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -m comment --comment "Apache WEB server port" -j ACCEPT
  • service iptables restart
  • yum -y install nginx
  • yum -y install mysql mysql-server
  • yum -y install phpmyadmin
  • yum -y install php php-fpm php-mysql php-cli php-gd php-mbstring php-mcrypt php-php-gettext apr-util-ldap mailcap
  • chkconfig --levels 235 mysqld on
  • chkconfig --levels 235 nginx on
  • chkconfig --levels 235 php-fpm on
  • vi /etc/phpMyAdmin/config.inc.php
    把「$cfg['Servers'][$i]['auth_type'] = 'cookie';」中的「cookie」改為「http」
  • service php-fpm start
  • service mysqld start
  • service nginx start

    最後發現登入不了 phpMyAdmin,原來是因為 /var/lib/php/session 的權限還是「apache」:
    [root@centos6 phpMyAdmin]# cd /var/lib/php
    [root@centos6 /]# cd /var/lib/php
    [root@centos6 php]# ls -al
    total 12
    drwxr-xr-x.  3 root root   4096 Sep 26 16:40 .
    drwxr-xr-x. 20 root root   4096 Sep 26 17:06 ..
    drwxrwx---.  2 root apache 4096 Jul 10 01:43 session
    [root@centos6 php]# chown nginx session/
    [root@centos6 php]# ls -al
    total 12
    drwxr-xr-x.  3 root  root   4096 Sep 26 16:40 .
    drwxr-xr-x. 20 root  root   4096 Sep 26 17:06 ..
    drwxrwx---.  2 nginx apache 4096 Sep 26 19:20 session
    [root@centos6 php]# 
    由於建立這個虛擬機的目的是在沒連網的情況下使用,因此網路卡必須設定為「Host-only Adapter」。
  • 2015年9月18日 星期五

    Parallax Previewer


    一直都期待著,終於等到了新 Apple TV 支援 App 功能。可惜錯過了參加開發人員的抽獎機會,唯有等新 Apple TV 上市後又有錢時才能添置一部。

    今日嘗試了《Parallax Previewer》。一個在 Mac OS X 運行的軟體,製作新 Apple TV 上的立體 App 圖示。我簡單地拖拉了三張圖片到《Parallax Previewer》的左方,然後替其中兩層圖案設定好位置,十分簡單地完成了 Parallax 效果。

    2015年9月9日 星期三

    同時拍片及攝影・二


    把昨天畫好都打印出來,並安裝到相機上。手感重了點,但為了同時拍片及攝影,算是可以吧!本周日會用它實戰,再看看有哪些需要修改的地方。

    2015年9月8日 星期二

    同時拍片及攝影


    過去的周六是女兒在《香港迪士尼》演出的日子。那天為她拍片及攝影做一個紀念。一對手處理兩樣事情實在做得不好。回家後決定設計一個能把 iPhone 6 Plus 安裝到相機上的裝置。由於打印凌空部件時會打印支架,而 PLA 的支架又很難處理,我決定把部件分為兩份:手機外殻及連接部件。


    這是連接部件。打印出來後感覺不夠隱陣,於是設計另一個連接部件。


    這個感覺好了。同時發現連接部件後有點空間,於是安排了扇形的部份來加強手機外殻的承托力。效果看來不錯。

    iPhone 6 Plus Camera Case by pacess on Sketchfab

    iPhone 6 Plus Camera Joint by pacess on Sketchfab

    2015年9月4日 星期五

    3D 打印溫室・二


    之前製作的《3D 打印溫室》已經上傳到 Sketchfab,方便有需要的朋友下載及打印。
     

    Greenhouse by pacess on Sketchfab

    2015年9月3日 星期四

    解決 nginx 上的「PHP Fatal error: Call to undefined function mcrypt_get_iv_size()」問題

    在編寫服務器程式時,裡 nginx 發現了「PHP Fatal error: Call to undefined function mcrypt_get_iv_size()」錯誤。解決方法如下:
    [root@guestdev1 ~]# yum install php-mcrypt
    Failed to set locale, defaulting to C
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
     * base: mirror.vastspace.net
     * epel: mirror.smartmedia.net.id
     * extras: mirror.vastspace.net
     * updates: mirror.vastspace.net
    Resolving Dependencies
    --> Running transaction check
    ---> Package php-mcrypt.x86_64 0:5.4.16-3.el7 will be installed
    --> Processing Dependency: libmcrypt.so.4()(64bit) for package: php-mcrypt-5.4.16-3.el7.x86_64
    --> Running transaction check
    ---> Package libmcrypt.x86_64 0:2.5.8-13.el7 will be installed
    --> Finished Dependency Resolution
    
    Dependencies Resolved
    
    ==========================================================================================
     Package                       Arch              Version               Repository    Size
    ==========================================================================================
    Installing:
     php-mcrypt                    x86_64            5.4.16-3.el7          epel          20 k
    Installing for dependencies:
     libmcrypt                     x86_64            2.5.8-13.el7          epel          99 k
    
    Transaction Summary
    ==========================================================================================
    Install  1 Package (+1 Dependent package)
    
    Total download size: 119 k
    Installed size: 331 k
    Is this ok [y/d/N]: y
    Downloading packages:
    (1/2): php-mcrypt-5.4.16-3.el7.x86_64.rpm                               |  20 kB  00:00:00     
    (2/2): libmcrypt-2.5.8-13.el7.x86_64.rpm                                |  99 kB  00:00:01     
    ------------------------------------------------------------------------------------------
    Total                                                           92 kB/s | 119 kB  00:00:01     
    Running transaction check
    Running transaction test
    Transaction test succeeded
    Running transaction
      Installing : libmcrypt-2.5.8-13.el7.x86_64                                           1/2 
      Installing : php-mcrypt-5.4.16-3.el7.x86_64                                          2/2 
      Verifying  : libmcrypt-2.5.8-13.el7.x86_64                                           1/2 
      Verifying  : php-mcrypt-5.4.16-3.el7.x86_64                                          2/2 
    
    Installed:
      php-mcrypt.x86_64 0:5.4.16-3.el7
    
    Dependency Installed:
      libmcrypt.x86_64 0:2.5.8-13.el7
    
    Complete!
    [root@guestdev1 ~]# service php-fpm restart
    Redirecting to /bin/systemctl restart  php-fpm.service
    [root@guestdev1 ~]# service nginx restart
    Redirecting to /bin/systemctl restart  nginx.service
    [root@guestdev1 ~]# 

    2015年9月2日 星期三

    選擇性圓角的 UITextField


    最近想試試如何把 UITableView 的 Grouping 設計應用到連續幾個的 UITextField。研究了一會,編寫了以下程序:
    - (void)roundedCorners:(UIRectCorner)corners radius:(CGFloat)radius view:(UIView *)view  {
        CGRect bounds = view.bounds;
        UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:bounds byRoundingCorners:corners cornerRadii:CGSizeMake(radius, radius)];
    
        //  Set rounded corner mask
        CAShapeLayer *maskLayer = [CAShapeLayer layer];
        [maskLayer setFrame:bounds];
        [maskLayer setPath:maskPath.CGPath];
        [view.layer setMask:maskLayer];
    }

    如果想有邊框的話,可以這樣:
    - (void)roundedCorners:(UIRectCorner)corners radius:(CGFloat)radius view:(UIView *)view  {
        CGRect bounds = view.bounds;
        UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:bounds byRoundingCorners:corners cornerRadii:CGSizeMake(radius, radius)];
    
        //  Set rounded corner mask
        CAShapeLayer *maskLayer = [CAShapeLayer layer];
        [maskLayer setFrame:bounds];
        [maskLayer setPath:maskPath.CGPath];
        [view.layer setMask:maskLayer];
    
        //  Set rounded corner border
        CAShapeLayer *borderLayer = [CAShapeLayer layer];
        [borderLayer setFrame:bounds];
        [borderLayer setPath:maskPath.CGPath];
        [borderLayer setStrokeColor:[UIColor grayColor].CGColor];
        [borderLayer setFillColor:nil];
        [borderLayer setLineWidth:3.0f];
        [view.layer addSublayer:borderLayer];
    }

    2015年9月1日 星期二

    TIPS 最終輪選


    昨晚舉行最後一輪的 TIPS 淘汰。從 12 支創業隊伍中選出 3 支進行重點培育。原本每隊有十分鐘展示時間,由於時間緊迫,改為五分鐘。跟之前兩次輪選一樣,當晚即場得知結果。

    在所有隊伍展示完畢後,大會決定由選出 3 支隊伍改為 4 支,使得大家都多了一個機會。大會宣佈結果時已經是晚上十時。《!Bag》最終有機會入選 4 隊中的一隊;而師傅更是多年前在亞視參與電腦節目的 Dr.Wong,黃岳永先生。希望在未來的三個月裡,能在各位師傅身上汲收到寶貴的知識與經驗!