2013年10月6日 星期日

[Android] dp px 互換(dp px exchange)

Image from BBC GEL



單位

dp : Density-independent pixel,獨立於螢幕解析度密度的像素值,也就是說,當你設定 1dp 時,在 120 dpi 的螢幕上會是原本的 75 %,在 160 dpi 的螢幕上為 100%,在 240 dpi 的螢幕上為 150%,實際的像素值會依螢幕密度而改變。

px : pixel ,一般所認知的像素值,指定多少就是多少,不會因螢幕密度不同而改變。所以 100 * 100 px 的方形在 320 x 480 螢幕的手機上看起來會比 1280 x 720 的螢幕上看起來大很多,這個方形實際上尺寸並沒有改變,改變的是螢幕解析度,放在一個較小的空間看起來比較大,放在一個較大的空間,看起來就會比較小。

這裡有圖示解說,看圖比較容易懂。


轉換

如果單純只在 layout 上指定值,直接指定 dp 就好了,但如果要在程式碼中指定就必須要做轉換,否則都是 px ,我們必須把它轉為 dp 才能和其他在 layout 中指定的元件有一樣的比例。

我自己是找到公式後寫成工具程式,直接叫用就好了,程式碼如下:

/**
 * Covert dp to px
 * @param dp
 * @param context
 * @return pixel
 */
public static float convertDpToPixel(float dp, Context context){
    float px = dp * getDensity(context);
    return px;
}

/**
 * Covert px to dp
 * @param px
 * @param context
 * @return dp
 */
public static float convertPixelToDp(float px, Context context){
    float dp = px / getDensity(context);
    return dp;
}

/**
 * 取得螢幕密度
 * 120dpi = 0.75
 * 160dpi = 1 (default)
 * 240dpi = 1.5
 * @param context
 * @return
 */
public static float getDensity(Context context){
 DisplayMetrics metrics = context.getResources().getDisplayMetrics();
 return metrics.density;
}


參考資料

http://developer.android.com/guide/practices/screens_support.html
http://www.bbc.co.uk/gel/tablet/tablet-device-considerations/pixel-density

php 取得遠端網站的內容

取得遠端的網頁內容的函式名稱:

file_get_contents



用法:

$homepage=file_get_contents('http://www.kimo.com.tw');

echo $homepage

以PHP讀寫Excel檔案

以PHP讀寫Excel檔案



http://phpexcel.codeplex.com/

用google找了一下,PHPExcel類別的功能非常強大,支援各版本的Excel檔案、CSV、HTML及PDF檔案的讀寫,有這方面的需求,改用這套工具可以省卻不少自行撰寫工具的時間,對使用者來說,Excel檔案的親和性比起CSV檔案來說,好太多了,所以決定使用Excel作為報表讀取檔案。



文章起頭的網址是PHPExcel的官網,從官網下載套件後,下載套件內的說明文件非常詳盡,花一二天就可以讀懂,使用上並不困難,只是要花時間熟悉使用方法。



PHPExcel的安裝

解壓縮下載的套件後,將Class目錄放到類別目錄下。



PHPExcel的使用

require Class/PHPExcel.php後,PHPExcel會自動載入需要的所有類別,不需作後續設定。



PHPExcel的設計哲學

物件分成三大區塊

1)Excel檔的操控--針對Excel2007版本的Excel進行操控,所有操控都在記憶體中進行,檔案的寫入及讀取由其他物件負責。

2)Excel檔的讀取--包含各版本Excel、PDF、CSV等

3)Excel檔的寫入--包含各版本Excel、PDF、CSV等



讀取Excel檔案的操件方法

1)由PHPExcel決定載入檔案的種類,如Excel版本,而不硬性設定。



1.$reader = PHPExcel_IOFactory::load('excel檔');





2)由PHPExcel決定載入檔案的種類,不硬性設定讀取的檔案種類,但將檔案設定為唯讀屬性。



1.$reader= PHPExcel_IOFactory::createReaderForFile('excel檔');
2.$reader->setReadDataOnly(true);
3.$excel= $reader->load('excel檔');





讀取某一格的Excel內容

column由0開始

row由1開始



1.$sheet=$excel->getActiveSheet();
2.$sheet->getCell('A8')
3.->getValue();







1.$sheet=$excel->getActiveSheet();
2.$sheet->getCellByColumnAndRow(2,8)
3.getValue();





取得公式計算後的結果



1.$sheet=$excel->getActiveSheet();
2.$sheet->getCell('A8')
3.->getCalculatedValue();
 




循序讀取cell的內容



01.<?php
02.$objReader = PHPExcel_IOFactory::createReader('Excel2007');
03.$objReader->setReadDataOnly(true);
04.$objPHPExcel = $objReader->load("test.xlsx");
05.$objWorksheet = $objPHPExcel->getActiveSheet();
06.echo '<table>' . "\n";
07.foreach ($objWorksheet->getRowIterator() as $row) {
08. echo '<tr>' . "\n";
09.$cellIterator = $row->getCellIterator();
10. $cellIterator->setIterateOnlyExistingCells(false); // This loops all cells,
11. // even if it is not set.
12. // By default, only cells
13. // that are set will be
14. // iterated.
15. foreach ($cellIterator as $cell) {
16. echo '<td>' . $cell->getValue() . '</td>' . "\n";
17. }
18.echo '</tr>' . "\n";
19.}
20.echo '</table>' . "\n";
21.?>







01.<?php
02.$objReader = PHPExcel_IOFactory::createReader('Excel2007');
03.$objReader->setReadDataOnly(true);
04.$objPHPExcel = $objReader->load("test.xlsx");
05.$objWorksheet = $objPHPExcel->getActiveSheet();
06.$highestRow = $objWorksheet->getHighestRow(); // e.g. 10
07.$highestColumn = $objWorksheet->getHighestColumn(); // e.g 'F'
08.$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); // e.g. 5
09.echo '<table>' . "\n";
10.for ($row = 1; $row <= $highestRow; ++$row) {
11. echo '<tr>' . "\n";
12.for ($col = 0; $col <= $highestColumnIndex; ++$col) {
13. echo '<td>' . $objWorksheet->getCellByColumnAndRow($col, $row)->getValue() . '</td>' . "\n";
14. }
15.echo '</tr>' . "\n";
16.}
17.echo '</table>' . "\n";
18.?>





設定使用第幾個活頁簿(index從0開始)



1.setActiveSheetIndex(0);





使用流程
1)讀取Excel檔案或創建Excel檔案
2)解析並操控Excel檔案
3)將記憶體中的Excel轉換成其他的型態

2013年4月29日 星期一

PHP日期的加減法

顯示格式2004-01-08

在2004-01-08再加上15天 = 2004-01-23

$years = date("Y"); //用date()函式取得目前年份格式0000
$months = date("m"); //用date()函式取得目前月份格式00
$days = date("d"); //用date()函式取得目前日期格式00
$day = date("Y-m-d",mktime(0,0,0,$months,$days+15,$years));
echo $day;

在2004-01-08再加上6個月 = 2004-07-08

$years = date("Y"); //用date()函式取得目前年份格式0000
$months = date("m"); //用date()函式取得目前月份格式00
$days = date("d"); //用date()函式取得目前日期格式00
$day = date("Y-m-d",mktime(0,0,0,$months+6,$days,$years));
echo $day;

在2004-01-08再加上2年 = 2006-01-08

$years = date("Y"); //用date()函式取得目前年份格式0000
$months = date("m"); //用date()函式取得目前月份格式00
$days = date("d"); //用date()函式取得目前日期格式00
$day = date("Y-m-d",mktime(0,0,0,$months,$days,$years+2));
echo $day;

在2004-01-08再減15天 = 2003-12-24

$years = date("Y"); //用date()函式取得目前年份格式0000
$months = date("m"); //用date()函式取得目前月份格式00
$days = date("d"); //用date()函式取得目前日期格式00
$day = date("Y-m-d",mktime(0,0,0,$months,$days-15,$years));
echo $day;

在2004-01-08再減6個月 = 2003-07-08

$years = date("Y"); //用date()函式取得目前年份格式0000
$months = date("m"); //用date()函式取得目前月份格式00
$days = date("d"); //用date()函式取得目前日期格式00
$day = date("Y-m-d",mktime(0,0,0,$months-6,$days,$years));
echo $day;

在2004-01-08再減2年 = 2002-01-08

$years = date("Y"); //用date()函式取得目前年份格式0000
$months = date("m"); //用date()函式取得目前月份格式00
$days = date("d"); //用date()函式取得目前日期格式00
$day = date("Y-m-d",mktime(0,0,0,$months,$days,$years-2));
echo $day;

[PHP] 分割與合併字串的相關函式

PHP中提供許多分割與合併字串的函式,以下就來瀏覽一下吧!
1.explode():此函式可以將字串分割為陣列儲存,類似切token的方式,若以下列程式碼為例:
$student="kevin susan james";
$stuednt_array=explode(" ",$student);
foreach($stuednt_array as $index => $value)
echo "student $index is: $value\n";

則結果為:
student 0 is: kevin
student 1 is: susan
student 2 is: james




<?php

// Example 1
$pizza  "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces explode(" "$pizza);
echo 
$pieces[0]; // piece1

echo $pieces[1]; // piece2

// Example 2

$data "foo:*:1023:1000::/home/foo:/bin/sh";
list(
$user$pass$uid$gid$gecos$home$shell) = explode(":"$data);
echo 
$user// foo

echo $pass// *

?>




2.implode():此函式可以將陣列合併為字串儲存,若以下列程式碼為例:
$stuednt_array = array(kevin, susan, james);
$student = implode(",", $stuednt_array);
echo $student

則結果為:
kevin,susan,james

3.join():此函式和implode()用法相同,不再舉例。


4.split():這個函式和implode()很相像,不同的是他可以用regular expression,先看他的官方文件:
array split ( string $pattern , string $string [, int $limit ] )

而官方的舉例如下:
$date = "04/30/1973";
list($month, $day, $year) = split('[/.-]', $date);
echo "Month: $month; Day: $day; Year: $year\n";

依此例子,則會印出以下結果:
Month: 04; Day: 30; Year: 1973
5.str_split():此函式會將字串以字母切割,並儲存成陣列,先看他的官方文件。
array str_split ( string $string [, int $split_length ] )

舉例而言:
$str = "Hello";
$arr1 = str_split($str);
print_r($arr1);

印出結果會如下:
Array
(
   [0] => H
   [1] => e
   [2] => l
   [3] => l
   [4] => o
)

以上為比較常用的,如果日後有用到或看到新的,再來新增好了。

2013年4月25日 星期四

[分享]快用苹果助手免越狱安装的原理

这个软件其实是 这个软件开发者的APPLE ID购买了很多很多的软件游戏 ,然后通过这个软件授权KEY利用ITUNES的同步允许给你设备安装软件。 安装的时候,其实是在用快用苹果助手官方的账号给你安装游戏软件的。说简单点就是这个软件帮你跳过了一步一步授权KEY的麻烦。直接同步安装。

从使用体验来分析,“快用”大致的原理是,先按苹果的流程购买获得各APP的安装文件,然后放在自己的服务器上供用户通过“快用”下载。在下载到PC本地后,通过数据线连接IOS设备,并模拟iTunes的通信规范往设备里装应用。这使得所有通过“快用”安装的应用所对应的苹果ID是“快用”的一个ID,而非用户在自己设备上的常用ID。

这会导致两个显而易见的结果:

1、不能升级。所有使用“快用”安装的APP都不能通过app store升级,除非获得“快用”方面官方ID的密码。原理上,如果“快用”的服务器上更新了应用版本,可以卸载应用后重新通过“快用”安装来升级——显然,这有些麻烦。而且到目前为止,由于“快用”刚刚上线不久,还处于积累更多APP的阶段,对于已有APP的版本管理和升级,还抽不出精力来照顾。


2、安装的应用可能被iTunes同步抹去。这一现象并没有绝对的必然性,在使用中确实出现过。但此问题与“快用”无关,只能说PC版的iTunes用户体验实在糟糕。还有一种情况是IOS设备执行iTunes同步后会有部分通过“快用”安装的APP无法使用,出现闪退。虽然“快用”上已经有闪退修复的功能,但似乎并不总是好使
但实际上,这两个问题都不算是大问题。毕竟与为了获得更多应用使用权限而越狱相比,可能遇到的技术问题更多。

据“快用”的研发经理欧阳磊介绍,该产品思路来自于网络上有规模不小的IOS用户群体互相之间共享苹果ID来下载付费应用。这使得一个群体内的单个人付出更少的费用获得更多的应用。而“快用”则把这种模式从小群体拓展到了大众,“快用”官方付费并把应用分享给所有用户。

对于“快用”来说,“共享ID”的技术模式并不存在太大的风险,苹果不太可能限制用户之间的ID共享,否则会得罪拥有多个苹果ID和多个ISO设备的用户(这样的用户正越来越多)。
下载地址:http://www.kuaiyong.com/

2013年3月18日 星期一

C# MessageBox.Show 用法 .

简介摘要:MessageBox.Show (String) 显示具有指定文本的消息框。 .NET Compact Framework 支持。 MessageBox.Show (IWin32Window, String) 在指定对象的前面显示具有指定文本的消息框。
   
   
   
MessageBox.Show (String) 显示具有指定文本的消息框。 
   
 .NET Compact Framework 支持。 
   
MessageBox.Show (IWin32Window, String) 在指定对象的前面显示具有指定文本的消息框。 
   
MessageBox.Show (String, String) 显示具有指定文本和标题的消息框。 
   
 .NET Compact Framework 支持。 
   
MessageBox.Show (IWin32Window, String, String) 在指定对象的前面显示具有指定文本和标题的消息框。 
   
MessageBox.Show (String, String, MessageBoxButtons) 显示具有指定文本、标题和按钮的消息框。 
   
MessageBox.Show (IWin32Window, String, String, MessageBoxButtons) 在指定对象的前面显示具有指定文本、标题和按钮的消息框。 
   
MessageBox.Show (String, String, MessageBoxButtons, MessageBoxIcon) 显示具有指定文本、标题、按钮和图标的消息框。 
   
MessageBox.Show (IWin32Window, String, String, MessageBoxButtons, MessageBoxIcon) 在指定对象的前面显示具有指定文本、标题、按钮和图标的消息框。 
   
MessageBox.Show (String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton) 显示具有指定文本、标题、按钮、图标和默认按钮的消息框。 
   
 .NET Compact Framework 支持。 
   
MessageBox.Show (IWin32Window, String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton) 在指定对象的前面显示具有指定文本、标题、按钮、图标和默认按钮的消息框。 
   
MessageBox.Show (String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton, MessageBoxOptions) 显示具有指定文本、标题、按钮、图标、默认按钮和选项的消息框。 
   
MessageBox.Show (IWin32Window, String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton, MessageBoxOptions) 在指定对象的前面显示具有指定文本、标题、按钮、图标、默认按钮和选项的消息框。 
   
MessageBox.Show (String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton, MessageBoxOptions, Boolean) 显示一个具有指定文本、标题、按钮、图标、默认按钮、选项和"帮助"按钮的消息框。 
   
MessageBox.Show (String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton, MessageBoxOptions, String) 使用指定的帮助文件显示一个具有指定文本、标题、按钮、图标、默认按钮、选项和"帮助"按钮的消息框。 
   
MessageBox.Show (IWin32Window, String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton, MessageBoxOptions, String) 使用指定的帮助文件显示一个具有指定文本、标题、按钮、图标、默认按钮、选项和"帮助"按钮的消息框。 
   
MessageBox.Show (String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton, MessageBoxOptions, String, HelpNavigator) 使用指定的帮助文件和 HelpNavigator 显示一个具有指定文本、标题、按钮、图标、默认按钮、选项和"帮助"按钮的消息框。 
   
MessageBox.Show (String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton, MessageBoxOptions, String, String) 使用指定的帮助文件和帮助关键字[guan jian zi]显示一个具有指定文本、标题、按钮、图标、默认按钮、选项和"帮助"按钮的消息框。 
   
MessageBox.Show (IWin32Window, String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton, MessageBoxOptions, String, HelpNavigator) 使用指定的帮助文件和 HelpNavigator 显示一个具有指定文本、标题、按钮、图标、默认按钮、选项和"帮助"按钮的消息框。 
   
MessageBox.Show (IWin32Window, String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton, MessageBoxOptions, String, String) 使用指定的帮助文件和帮助关键字[guan jian zi]显示一个具有指定文本、标题、按钮、图标、默认按钮、选项和"帮助"按钮的消息框。 
   
MessageBox.Show (String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton, MessageBoxOptions, String, HelpNavigator, Object) 使用指定的帮助文件、HelpNavigator 和帮助主题显示一个具有指定文本、标题、按钮、图标、默认按钮、选项和"帮助"按钮的消息框。 
   
MessageBox.Show (IWin32Window, String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton, MessageBoxOptions, String, HelpNavigator, Object) 使用指定的帮助文件、HelpNavigator 和帮助主题显示一个具有指定文本、标题、按钮、图标、默认按钮、选项和"帮助"按钮的消息框。   
   
用法如: 
DialogResult ret =MessageBox.Show( "确定要删除[shan chu]记录么?"  ,  "删除[shan chu]", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);  
MessageBox.Show( "提示[ti shi]信息", "  信息标题", MessageBoxButtons.OK); 
MessageBox.Show( "提示[ti shi]信息", "  信息标题", MessageBoxButtons.OK, MessageBoxIcon.Error);
     我们在程序中经常会用到MessageBox     
      MessageBox.Show()共有21中重载[zhong zai]方法。现将其常见用法总结如下:        
   
   1.      MessageBox  .Show( "Hello~~~~"  );   
  最简单的,只显示提示[ti shi]信息。   
   
   
     
   2.   MessageBox  .Show( "There are something wrong!"  , "ERROR"  );   
    可以给消息框加上标[shang biao]题。   
   
   
     
   3.      if  ( MessageBox  .Show( "Delete this user?"  ,  "Confirm Message"  ,  MessageBoxButtons  .OKCancel) ==  DialogResult  .OK)   
  {   
         //delete     
  }   
  询问是否删除[shan chu]时会用到这个。   
   
   
     
   4.   if  ( MessageBox  .Show( "Delete this user?"  ,  "Confirm Message"  ,  MessageBoxButtons  .OKCancel, MessageBoxIcon  .Question) ==  DialogResult  .OK)   
  {   
          //delete     
  }   
  可以给MessageBox加上一个Icon.net提供常见的Icon共选择[xuan ze]   
     
   
   
   
   5.   if  ( MessageBox  .Show( "Delete this user?"  ,  "Confirm Message"  ,  MessageBoxButtons  .OKCancel,  MessageBoxIcon  .Question, MessageBoxDefaultButton  .Button2) ==  DialogResult  .OK)   
  {   
         //delete     
  }   
  可以改变MessageBox的默认焦点,如下:   
   
   
     
   6.      if  ( MessageBox  .Show( "Delete this user?"  ,  "Confirm Message"  ,  MessageBoxButtons  .OKCancel,  MessageBoxIcon  .Question, MessageBoxDefaultButton  .Button2, MessageBoxOptions  .RtlReading) ==  DialogResult  .OK)   
  {   
         //delete     
  }   
  反向显示:   
   
   
     
   7.   if  ( MessageBox  .Show( "Delete this user?"  ,  "Confirm Message"  ,  MessageBoxButtons  .OKCancel,  MessageBoxIcon  .Question,  MessageBoxDefaultButton  .Button2,  MessageBoxOptions  .RightAlign, true  ) ==  DialogResult  .OK)   
  {   
          //delete     
  }   
  添加Help按钮:   
   
   
     
   8.      if  ( MessageBox  .Show( "Delete this user?"  ,  "Confirm Message"  ,  MessageBoxButtons  .OKCancel,  MessageBoxIcon  .Question,  MessageBoxDefaultButton  .Button1,  MessageBoxOptions  .RtlReading,  @"/folder/file.htm"  ) ==  DialogResult  .OK)   
  {   
         //delete     
  }   
  指定帮助文件的路径[lu jing],点击即可打开该路径[lu jing]下的帮助文件。   
     
   
   
     
  9.    //HelpNavigator 指定常数来指示[zhi shi]要显示的帮助文件元素。  Find  帮助文件将打开到搜索[sou suo]页。            
   if  ( MessageBox  .Show( "Delete this user?"  ,  "Confirm Message"  ,  MessageBoxButtons  .OKCancel,  MessageBoxIcon  .Question,  MessageBoxDefaultButton  .Button1,  MessageBoxOptions  .RtlReading,  @"/folder/file.htm"  ,  HelpNavigator  .Find) ==  DialogResult  .OK)   
  {   
          //delete     
  }   
还有一些用法,不是太实用这里就不一一介绍了,有兴趣的朋友可以参考[can kao]下这里: MSDN  MessageBox类。



   

MessageBox.Show 方法的使用

MessageBox 類別 Show 方法的語法為:
數值變數名稱 = MessageBox.Show(提示訊息 [,標題] [,按鈕] [,圖示] [,預設按鈕] [,選項])
按鈕的列舉常數名稱及其意義為:
列舉常數名稱
顯示按鈕
MessageBoxButtons.OK
「確定」按鈕
MessageBoxButtons.OKCancel
「確定」、「取消」按鈕
MessageBoxButtons.AbortRetryIgnore
「中止」、「重試」、「略過」按鈕
MessageBoxButtons.YesNoCancel
「是」、「否」、「取消」按鈕
MessageBoxButtons.YesNo
「是」、「否」按鈕
MessageBoxButtons.RetryCancel
「重試」、「取消」按鈕
圖示的列舉常數名稱及其意義為:
列舉常數名稱
顯示按鈕
MessageBoxIcon.Asterisk
 i圖示
MessageBoxIcon.Error
 X圖示
MessageBoxIcon.Exclamation
 「!」圖示
MessageBoxIcon.Hand
 X圖示
MessageBoxIcon.Information
 i圖示
MessageBoxIcon.None
無圖示
MessageBoxIcon.Question
 「?」圖示
MessageBoxIcon.Stop
 X圖示
MessageBoxIcon.Warning
 「!」圖示
預設按鈕的列舉常數名稱及其意義為:
列舉常數名稱
顯示按鈕
MessageBoxDefaultButton.Button1
以第一個按鈕為預設按鈕
MessageBoxDefaultButton.Button2
以第二個按鈕為預設按鈕
MessageBoxDefaultButton.Button3
以第三個按鈕為預設按鈕
選項的列舉常數名稱及其意義為:
列舉常數名稱
顯示按鈕
MessageBoxOptions.DefaultDeskTopOnly
訊息方塊僅顯示於預設旳桌面。
MessageBoxOptions.RightAlign
標題文字靠右對齊。
MessageBoxOptions.RtlReading
訊息由右向左顯示。
MessageBoxOptions.ServiceNotification
訊息方塊僅顯示於作用旳桌面。
傳回值的列舉常數名稱及其意義為:
列舉常數名稱
顯示按鈕
DialogResult.OK
按「確定」鈕
DialogResult.Cancel
按「取消」鈕
DialogResult.Abort
按「中止」鈕
DialogResult.Retry
按「重試」鈕
DialogResult.Ignore
按「略過」鈕
DialogResult.Yes
按「是」鈕
DialogResult.No
按「否」鈕