2018年2月3日 星期六

Draw 邊框設計

1.畫出8個橢圓形排列如下

2.編輯/全部選取/右鍵/形狀/結合
3.編輯/複製,編輯/貼上
4.將上層圖案拉大一點
5.將較大的圖案用:修改/排序/置於低層      或用  (右鍵/編排/移到最下層) 也可以
6. 編輯/全部選取,右鍵/形狀/減去
7.格式/線條/樣式--隱入的,這樣就可以去掉邊線
8.格式/平面/點陣圖,選一個您想要的圖案
9.用上一節課的技巧在中間畫出一個圖案如下圖:


Draw 合併的技巧

1.把紙張調整為橫向(格式/頁面屬性/頁面/橫向/確定)
2.在畫紙的左側,畫出一個大圓
3.再畫出一個小圓
4.複製小圓
如圖
5.編輯/全部選取,按下右鍵 選 形狀/結合(第四個選項),就可以合併

6.畫出一個小圓並複製成兩個小圓圈,當作眼睛(用複製的才不會大小眼)

7.編輯/全部選取,按下右鍵,選 形狀/減去 (第五個選項)


8.修改/轉換/變成3D (或按下右鍵 /轉換/變成3D)
9.用圓弧工具,畫一個弧形,當作嘴巴(可以加粗線條並換色)



10. 用同樣的技巧 在右側畫出一個自己的圖案

2018年2月2日 星期五

PHP的測試 (7) 用strtotime計算日期

不論用/或是-都可以自動判斷

$a = "1991-10-23";
$b = "2003/10/24";

$ta = strtotime($a);
$tb = strtotime($b);

echo $a.date("Y-m-d",$ta);
echo '<br>';
echo $b.date("Y-m-d",$tb);

結果
1991-10-231991-10-23
2003/10/242003-10-24


PHP的測試 (6) ajax 比較

不使用 jQuery時

var updateparent=null;  //the caller change function
var ch_sn=0;            //content id
var isIE = false;       
// global request and XML document objects
var req;
// retrieve XML document (reusable generic function);
// parameter is URL string (relative or complete) to
// an .xml file whose Content-Type is a valid XML
// type, such as text/xml; XML source must be from
// same domain as HTML file
function loadXMLDoc(url, process_fn) {
// branch for native XMLHttpRequest object
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
req.onreadystatechange = process_fn;
req.open("GET", url, true);
req.send(null);
// branch for IE/Windows ActiveX version
} else if (window.ActiveXObject) {
isIE = true;
req = new ActiveXObject("Microsoft.XMLHTTP");
if (req) {
req.onreadystatechange = process_fn;
req.open("GET", url, true);
req.send();
}
}
}

// This function is used to extract XML data from the returned AJAX string (in XML format)
function getElementTextNS(prefix, local, parentElem, index) {
    var result = "";
    if (prefix && isIE) {
        // IE/Windows way of handling namespaces
        result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
    } else {
        result = parentElem.getElementsByTagName(local)[index];
    }
    if (result) {
        // get text, accounting for possible
        // whitespace (carriage return) text nodes
        if (result.childNodes.length > 1) {
            return result.childNodes[1].nodeValue;
        } else {
            return result.firstChild.nodeValue;   
        }
    } else {
        return "n/a";
    }
}


function processChange()
{
  // only if req shows "loaded"
  if (req.readyState == 4) {
// only if "OK"
if (req.status == 200) {
  div = document.getElementById('score_'+ch_sn);
div.innerHTML = "";
div.innerHTML = req.responseText;
if(updateparent!=null) { updateparent(); }
updateparent=null;
} else {
alert("There was a problem retrieving the XML data:\n" +
req.statusText);
  }
}
}


function ajaxshow(phpfunc,sn,callback)
{
  //alert('hi');
  var val=phpfunc+sn; //
  //score =
  updateparent=callback;
 
changed=false;
ch_sn=sn;
div1 = document.getElementById('score_'+sn);
div1.innerHTML = "Loaded...";
        loadXMLDoc(val, processChange);
}


PHP的測試 (5) 用 jQuery取代 prototype.js 的上下左右按鍵


<script type="Text/JavaScript" src="jquery.js"></script>
<Script type="Text/JavaScript" Language="JavaScript">
$(document).ready(function(){
   
//當tbd裡所有的input
$('#tbd :input').keydown(function(e){
//取得自訂屬性的名稱
   
    var id=$(this).attr('id');
    var kk= id.split("_");
   
//alert(kk[1]+'!'+kk[2]);
    var y=kk[1]*1;
    var x=kk[2]*1;
   
    newid='';
   
    if (e.which==40) {//下
      y = y+1;
      newid='yx_'+y+'_'+x;
    }
    if (e.which==13) {//下
      y = y+1;
      newid='yx_'+y+'_'+x;
    }
    if (e.which==38) {//下
      y = y-1;
      newid='yx_'+y+'_'+x;
    }
    if (e.which==37) {//左
      x = x-1;
      newid='yx_'+y+'_'+x;
    }
    if (e.which==39) {//右
      x = x+1;
      newid='yx_'+y+'_'+x;
    }

    if (newid !='') {
      document.getElementById(newid).select();
      document.getElementById(newid).foucs();
    }
   

   
});
})
</Script>
</HEAD>
<BODY>
<FORM action="" method=POST id=form1 name=form1>
<table border="1">
<thead>
<tr>
<th>CName</th>
<th>Value</th>
       <th>ValueT</th>
</tr>
</thead>
<tbody id="tbd">
<tr>
<td><input type="text" id='yx_1_1' value="ZZZmeXX"></td>
<td><input type="text" id='yx_1_2' value="ValueXX"></td>
        <td><input type="text" id='yx_1_3' value="ValueBB"></td>       
</tr>
      <tr>
<td><input type="text" id='yx_2_1' value="ZZZmeXX"></td>
<td><input type="text" id='yx_2_2' value="ValueXX"></td>
        <td><input type="text" id='yx_2_3' value="ValueBB"></td>       
</tr>
            <tr>
<td><input type="text" id='yx_3_1' value="ZZZmeXX"></td>
<td><input type="text" id='yx_3_2' value="ValueXX"></td>
        <td><input type="text" id='yx_3_3' value="ValueBB"></td>       
</tr>
            <tr>
<td><input type="text" id='yx_4_1' value="ZZZmeXX"></td>
<td><input type="text" id='yx_4_2' value="ValueXX"></td>
        <td><input type="text" id='yx_4_3' value="ValueBB"></td>       
</tr>
</tbody>
</table>
</FORM>

PHP的測試 (4) 正規表示式 用法列舉

抓取[]中的方法
preg_match_all("/\[([^\]]*)\]/", "<p>[code]</p><p>[menu]</p>",$matches)
刪除空白字元
preg_replace('/[\s]/','',$tt);
只允許英文和數字
preg_replace('/[^a-zA-Z0-9]/','',$_GET['do']);
只允許英文和數字和底線
preg_replace('/[^a-zA-Z0-9_]/','',$_GET['do']);

找出{}內的所有資料
preg_match_all('/\{([^\}]*)\}/', $buffer, $matches);
清除{}內的所有資料

preg_replace("/\{([^\}]*)\}/", '', $replace_data);

找出[]內的所有資料

preg_match_all('/\[([^\]]*)\]/', $buffer, $matches);
找到的資料中 $matches[0] 包含 [] ,$matches[1] 不包含 []

清除()內的所有資料,包含括弧
preg_replace("/\[^\)]+\)/", '', $replace_data);


找出<>內的所有資料
preg_match('/<([^<]*)>/',$m,$match);

去掉檔名中不合理得字元
$file_txt = preg_replace('/\s|\+|\/|\\|\||\*|\.|\$|<|>|\?|#|&/','',$_POST[up_file_txt]);

清除連續的空白,變成一個
$str preg_replace('/\s\s+/'' '$str);

 

PHP的測試 (3) unique()可以得到比microtime更精準的數字 ?

unique()可以得到比microtime更精準的數字 ?

 
 for($i=0;$i<100;$i++) {
    $a1 = time();
    $a2 = microtime(true);
    $b = uniqid();
  }   
   
1516878379,1516878379.8465,5a69ba2bceabe
1516878379,1516878379.8465,5a69ba2bceacb
1516878379,1516878379.8465,5a69ba2bcead0
1516878379,1516878379.8465,5a69ba2bcead5

看起來好像 microtime() 都相同 unique()不同

但是
for($i=0;$i<100;$i++) {
    //$a = time()+microtime();
    $a1 = time();
    $a2 = microtime();
    $b = uniqid();
}

1516881035,0.98530800 1516881035,5a69c48bf08e6
1516881035,0.98532300 1516881035,5a69c48bf08ee
1516881035,0.98532900 1516881035,5a69c48bf08f3
1516881035,0.98533400 1516881035,5a69c48bf08f8

hexdec(substr($b,-8)) 可以決定大約10位數的數字
hexdec(substr($b,-10)) 可以決定大約12位數的數字

2018年1月24日 星期三

PHP的測試 (2) 檔案上傳

用9個檔案上傳的方格

<form id="upForm"  action="test01.php" method="post" enctype="multipart/form-data">
<?PHP
for ($i=1;$i<10;$i++) {
  echo "$i <input name='l1upfile[$i]' type='file' ><br>";

}

?>
<input type="submit" value="上傳" />
</form>


只有 1,4輸入檔案時,可得到底下的$_FILES陣列

Array ( [l1upfile] => Array ( [name] => Array ( [1] => number.sb2 [2] => [3] => [4] => 抽座號.sb2 [5] => [6] => [7] => [8] => [9] => ) [type] => Array ( [1] => application/octet-stream [2] => [3] => [4] => application/octet-stream [5] => [6] => [7] => [8] => [9] => ) [tmp_name] => Array ( [1] => /tmp/phpRwv3Pk [2] => [3] => [4] => /tmp/php3wqacg [5] => [6] => [7] => [8] => [9] => ) [error] => Array ( [1] => 0 [2] => 4 [3] => 4 [4] => 0 [5] => 4 [6] => 4 [7] => 4 [8] => 4 [9] => 4 ) [size] => Array ( [1] => 53048 [2] => 0 [3] => 0 [4] => 53054 [5] => 0 [6] => 0 [7] => 0 [8] => 0 [9] => 0 ) ) )


補充

單一檔案上傳
<input name='upfile1[0]' type='file' />
<input name='upfile1[1]' type='file' />
和多重檔案上傳
<input name='upfile2[]' type='file' multiple="" />
得到的 $_FILES陣列是相同的

Array('name'=>array(0=>...,1=>...),
      'type'=>array(0=>...,1=>...),
      'tmp_name'=>array(0=>...,1=>...),
      'error'=>array(0=>...,1=>...),
      'size'=>array(0=>...,1=>...))

PHP 的測試 (1) MD5

這是以前測試的程式 md5 不論參數多長,總是產生一個長度32的字串 echo md5('tycx/asdfasdfsadfasd'); //a4cd629d921a937bfc6a7c1f38618111 echo md5('tycx/asdfas/sdfasdf/asdfasdf/asdfasdf/asdfasdf/asdfasdf/asdfasdfdfsadfasd'); //323acda0571ca5692d08ab6d410780bf

2018年1月18日 星期四

Namespace觀念與用法

最近查看別人寫的php程式碼,發現大量使用namespace 和 use

Namespace是物件導向語言很基本的功能,主要在解決class名稱衝突的問題。C++與C#也稱為namespace,Java則稱為package,雖然名稱不一樣,但精神都一樣,不過在語法部分PHP有自己的主張,與其他語言稍有不同。

假如是一個人從頭寫到尾的PHP專案,就不會遇到class名稱互相衝突的問題,但如果大量使用別人的framework或package,就很可能遇到class名稱相衝突的問題,所以才說namespace是PHP現代化最重要的基石。

Namespace的宣告會緊接著在<?php的下一行,命名規則建議最頂層的namespace名稱以vendor命名(公司名稱或組織名稱),必須是世界上唯一的名稱,以免class名稱雖然不衝突,但namespace名稱卻衝突了。

http://oomusou.io/php/php-namespace/ 說得很清楚