首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
184 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
32
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
560
篇与
的结果
2023-08-30
必备的 6 大计算机网络基础知识点!会 3 个以上就很牛逼了
必备的 6 大计算机网络基础知识点!会 3 个以上就很牛逼了
2023年08月30日
14 阅读
0 评论
0 点赞
2023-08-30
如何成为一个厉害的工程师
如何成为一个厉害的工程师从知乎上一个经典的理论,“以大多数人的努力程度之低,根本轮不到拼天赋”,即大部分对于自己梦想付出的努力,还远远不到拼天赋的地步。换句话说,每个人只要真正努力,就可以超越大部分人。保持学习前两天跟公司的一位P9沟通,他说,我至少几个月要保持学习一门新语言,从学习新语言里学习新的思考方式。对于普通程序员来说,不仅要保持学习的态度,更要保持学习的深度,学习是唯一不落后的最佳渠道。我在项目里,就学习java8的语法,用新语法来尝试新业务,效果出奇。而且据我观察,往往有追求的大佬和新同学,都对新技术渴求和渴望。即为明显的一个例子,我根据多年的交易经验,设计了一套轻量级业务隔离框架,一个P9大佬,在我做完技术汇报后,硬是单独拉着我,咨询我框架是如何实现,并且直接阅读我写的源代码,一直到问懂了才恍然大悟。学习,可以是学习书本知识,可以学习当下的知识付费,可以学习跨界思维,还可以学习人,学习大师,学习身边的同事。REVIEW学而思,学和思本来就是互相补充的关系,而REVIEW在互联网界,有着更深的含义,有CODE REVIEW、故障REVIEW、项目REVIEW、技术方案REVIEW等等。互联网变得很快,有时候快是第一要素,先行抢占市场,抢占用户才能胜者为王。但是快,往往也会忽视很多问题,忽略方案上的漏洞、忽略代码上的缺陷、忽略团队上的管理和沟通,此时要停下来,REVIEW自身和项目,继续做到每日精进。借势和借力前几周末,跟CTO做技术REVIEW,我汇报的主题是交易系统架构。谈到跨部门的合作问题和难点,CTO一句话让我醍醐灌顶,如何推动项目。他说,做业务,要懂得借势和借力。借势指的是两者目标一样,自然能促进业务发展和跨团队合作,借力是指复用已有的产品能力、技术架构。两者合二为一,驱动业务发展自然水到渠成。总结和抽象我一直认为,从低层次往高层次走,最重要的一个特性,就是“总结和抽象”。这是一种能力,也是一种思考方式。前两天看到有很多同行在脉脉吐槽阿里的中台,“徒有其表”、“炒作概念”、“无需中台”的评论。为什么从中台哺育了整个阿里经济体技术框架的中台,在这些人里一文不名?我想除了不懂阿里内情、视角不同外,很多人缺少“总结和抽象”的能力。总结,是把一篇文章,用一句话概括;能从下笔千言里,找到最重要的一句话;能把做了半年的系统,用一个序列图完美释义。信息泛滥的互联网,总结变成了一种非常重要的能力,能剔除垃圾信息,找到最重要的值得付费的一句话。总结是精炼,类似咖啡萃取,将最精华的部分提炼出来,可以理解成量变,只不过是将大的化小,化繁为简;而抽象是质变,将一个业务和一个系统,抽象到更高的层次,抽象成更为通用的理解方式。抽象,用哲学来说,是还原一个事务最本质的面目。在JAVA面向对象编程里,一个非常重要的特性,就是接口定义,接口就是对业务具体逻辑实现的抽象,抽象出一个模块具有的能力。举个例子来说,钉钉有很多功能,IM聊天会话、审批、打卡等,抽象起来,这个能力叫:办公协同。抽象可以让用户在更高层次上去思考,拓宽业务和系统边界。这也是为什么老板一句话,属下做一年。正是老板在更高程度的抽象,而实际落地,却是需要补充无数的血肉,才能真正落地一个业务。之所以老板可以高瞻远瞩,而我等屌丝只能一线撸码,相信也是总结和抽象能力让我等望其项背。最后想成为很厉害的人,可以读一下 《如何成为一个很厉害的人》 。
2023年08月30日
13 阅读
0 评论
0 点赞
2023-08-29
phpDocumentor
phpDocumentor最近再总结一些PHP的规范, 想起之前在Y!的时候的API描述自动生成工具, 翻到了phpDocumentor, 用起来感觉还是很方便 , 就安装到使用的过程写下来, 与大家分享phpDocumentor的安装很简单,如果通过pear自动安装在命令行下输入pear install PhpDocumentor如果是手动安装则在http://manual.phpdoc.org/下载最新版本的PhpDocumentor(现在是1.4.2),把内容解压即可.phpdocumentor的使用也很简单, 分为命令行模式和web模式:命令行模式在phpDocumentor所在目录下,输入php –h会得到一个详细的参数表,其中几个重要的参数如下:-f 要进行分析的文件名,多个文件用逗号隔开-d 要分析的目录,多个目录用逗号分割-t 生成的文档的存放路径-o 输出的文档格式,结构为输出格式:转换器名:模板目录。例如:phpdoc -o HTML:frames:earthli -f test.php -t docsWeb模式在新的phpdoc中,除了在命令行下生成文档外,还可以在客户端浏览器上操作生成文档,具体方法是先把PhpDocumentor的内容放在 apache目录下使得通过浏览器可以访问到点击files按钮,选择要处理的php文件或文件夹,还可以通过该指定该界面下的Files to ignore来忽略对某些文件的处理。然后点击output按钮来选择生成文档的存放路径和格式.最后点击create,phpdocumentor就会自动开始生成文档了,最下方会显示生成的进度及状态,如果成功,我们就可以通过查看生成的文档了,如果是pdf格式的,名字默认为documentation.pdf。来看个例子:代码加上注释:<?php /** * @filename baseTags.php * @touch date Tue 21 Apr 2009 11:49:12 AM CST * @package phpDocumentor demo * @author Laruence * @license http://www.zend.com/license/3_0.txt PHP License 3.0 * @version 1.0.0 * @copyright (c) 2009, Laruence */ /** * this function is a demo to illustrate how phpdocument tags work * <code> * $bool = element(true, "laruence"); * </code> * @deprecated * @param bool $bool a flag to decide whether the string should be output * @param string|int $string sometimes it's a string, sometimes it's a int * @return bool */ function element($bool, $string){ if ($bool){ die("flag off"); } echo "I love $string"; return true; } ?>在命令行模式下输入:phpdoc -o HTML:frames:default -f baseTags.php -t docs还有一些其他技巧, 比如, 你可以把phpdoc这个脚本放到/usr/bin目录下, 将phpdoc.ini和phpdocumentor目录放到php设置的include path 下, 就可以把phpdoc当成shell命令来很方便的使用了.还有, 比如一些文件的描述信息, 完全可以map成vim的一个宏命令, 我自己就把相关的信息都map成了F12,function MyCopy() call setline(line("."),"/**") call append(line(".")+1," * @filename ".expand("%")) call append(line(".")+2," * @touch date ".strftime("%c")) call append(line(".")+3," * @author Laruence<huixinchen@baidu.com>") call append(line(".")+4," * @license http://www.zend.com/license/3_0.txt PHP License 3.0") call append(line(".")+5," * @version 1.0.0 ") call append(line(".")+6,"*/") endf map <f12> <esc>:call MyCopy()<cr><esc>5j$a等等.最后, 生成的API文档见这里: 例子如果有兴趣, 还可以看看phpdoc的代码, 也是很有意思,呵呵ps: 相关的tags的说明见phpDocumentor官方网站的说明 tags说明手册
2023年08月29日
10 阅读
0 评论
0 点赞
2023-08-28
PHP+Gtk实例(求24点)
PHP+Gtk实例(求24点)最近要安排我为BIT提供的《PHP高级应用--关于PHP你不知道的》一门课的讲课素材, 其中有部分涉及到PHP和Gtk2开发桌面应用的部分, 于是抽空就想写一了一个demo出来.这是一个经典的求24的算法的PHP实现, 加上了Gtk2的界面, 其实也没什么复杂的, 和MFC开发没什么太大的区别, 唯一的不爽, 就是要自己用代码来写布局。。。有兴趣的同学可以看看.后记: 这里有一个网页版的, 可以用来玩玩: http://www.laruence.com/stashes/compute.php完整源代码(PHP-Gtk example): <?php /** * A 24 maker * @version 1.0.0 * @author laruence<laruence at yahoo.com.cn> * @copyright (c) 2009 http://www.laruence.com */ class TwentyFourCal extends GtkWindow { private $chalkboard; private $inputs; public $needle = 24; public $precision = '1e-6'; function TwentyFourCal() { parent::__construct(); $this->draw(); $this->show(); } /** * 画窗体方法 */ public function draw() { $this->set_default_size(200, 200); $this->set_title("24计算器"); $mesg = new GtkLabel('Please input 4 integer(0-99):'); $this->chalkboard = new GtkLabel(); $this->inputs = $inputs = array( new GtkEntry(), new GtkEntry(), new GtkEntry(), new GtkEntry() ); /** * container */ $table = new GtkTable(4, 1, 0); $layout = array( 'left' => 0, 'right' => 1, 'top' => 0, 'bottom' => 1, ); $vBox = new GtkVBox(false, true); $vBox->pack_start($mesg); foreach ( $inputs as $input ) { $input->set_max_length(2); $table->attach($input, $layout['left'], $layout['right'], $layout['top']++, $layout['bottom']++); } $vBox->pack_start($table); $button = new GtkButton("Calculate"); $button->connect("clicked", array($this, "calculate")); $vBox->pack_start($this->chalkboard); $vBox->pack_start($button, true, false); $this->add($vBox); } public function show() { $this->show_all(); // 显示窗体 } private function notice($mesg) { $this->chalkboard->set_text($mesg); } /** * 取得用户输入方法 */ public function calculate() { $operants = array(); $inputs = $this->inputs; foreach ($inputs as $input) { $number = $input->get_text(); if (!preg_match('/^\s*\d+\s*$/', $number)) { $this->notice('pleas input for integer(0-99)'); return ; } array_push($operants, $number); } $length = count($operants); try { $this->search($operants, 4); } catch (Exception $e) { $this->notice($e->getMessage()); return; } $this->notice('can\'t compute!'); return; } /** * 求24点算法PHP实现 */ private function search($expressions, $level) { if ($level == 1) { $result = 'return ' . $expressions[0] . ';'; if ( abs(eval($result) - $this->needle) <= $this->precision) { throw new Exception($expressions[0]); } } for ($i=0;$i<$level;$i++) { for ($j=$i+1;$j<$level;$j++) { $expLeft = $expressions[$i]; $expRight = $expressions[$j]; $expressions[$j] = $expressions[$level - 1]; $expressions[$i] = '(' . $expLeft . ' + ' . $expRight . ')'; $this->search($expressions, $level - 1); $expressions[$i] = '(' . $expLeft . ' * ' . $expRight . ')'; $this->search($expressions, $level - 1); $expressions[$i] = '(' . $expLeft . ' - ' . $expRight . ')'; $this->search($expressions, $level - 1); $expressions[$i] = '(' . $expRight . ' - ' . $expLeft . ')'; $this->search($expressions, $level - 1); if ($expLeft != 0) { $expressions[$i] = '(' . $expRight . ' / ' . $expLeft . ')'; $this->search($expressions, $level - 1); } if ($expRight != 0) { $expressions[$i] = '(' . $expLeft . ' / ' . $expRight . ')'; $this->search($expressions, $level - 1); } $expressions[$i] = $expLeft; $expressions[$j] = $expRight; } } return false; } function __destruct() { Gtk::main_quit(); } } new TwentyFourCal(); Gtk::main(); //进入GTK主循环 ?>GTK1的API Reference : http://gtk.php.net/manual/en/gtk.gtkentry.phpGTK2的API Reference: 很不完整
2023年08月28日
13 阅读
0 评论
0 点赞
2023-08-28
一个巧妙的分页方法
一个巧妙的分页方法PHP是一个Web脚本语言,在Web应用中最常见的莫过于列表显示。所以页码生成也就犹为常用。 最近我索性写了一个,在生成思想上, 有一些技巧拿与大家分享:先说说需求: 显示的页码数是$size, 当前的页数是$page, 总数是$total, 每页显示的条数是$page_size 首先,要获取总页面数是多少:$total_page = ceil($total/$page_size);这样的写法是不是更简单一些呢?其次,我是这样想的, 这个需求最高的需求是要根据当前的页码,找出size个页码数来。那么就可以转化为: 根据当前的信息, 填充一个size个元素的数组。最终就可以简单的转化为:根据当前的信息,寻找出size个元素的数组的起始元素是什么?我们假设这个起始元素是:page_start;$page_start = 1; $half = intval($size/2); $page_start = max(1, $page - $half); $page_end = min($page_start + $size - 1, $total_page); $page_start = max(1, $page_end - $size + 1);这样写,是不是也很有技巧呢?最后就简单了, 根据起始页和结束页, 生成一个数组, 最后foreach这个数组,生成html代码:$page_numbers = range($page_start, $page_end); $nav_str = ""; foreach($page_numbers as $num){ //....... }源码:/** *A pagination generation class *@class : Pagination *@version: 1.0.0 *@author : huixinchen at baidu.com *@useage: * $pagi = new Pagination($url_prefix, $page_size, $mesgs_count, $pagination_size=10, array $conf); * $navigation_str = $pagi->generate($current_page_number); */ class Pagination{ private $page, $total_page, $total, $page_size, $size; private $prev_str = "<", $next_str = ">"; private $class, $selected_class = "selected", $prev_class="prev", $next_class="next", $de_prev_class="de_prev", $de_next_class="de_next"; private $url_prefix="", $split_char="?"; private $para_name = "page", $target = ""; public function Pagination($url_prefix, $page_size, $total, $size=10, $conf=array()){ $this->page = 1; $this->page_size = $page_size; $this->total = $total; $this->total_page = intval(ceil($total/$page_size)); $this->size = $size; if(!empty($conf)){ $configure = array("prev_str", "next_str", "class", "selected_class"); foreach($conf as $key => $val){ if(in_array($key, $configure)){ $this->$val = $val; } } } $this->url_prefix = $url_prefix; if(strstr($url_prefix, '?') !== false){ $this->url_prefix .= "&" . $this->para_name . "="; }else{ $this->url_prefix .= "?" . $this->para_name . "="; } } public function generate($page){ $this->page = $page; if(isset($this->page[$page])){ return $this->page_str[$page]; } $page_start = 1; $half = intval($this->size/2); $page_start = max(1, $page - $half); $page_end = min($page_start + $this->size - 1, $this->total_page); $page_start = max(1, $page_end - $this->size + 1); $this->page_str[$page] = $this->build_nav_str($page_start, $page_end); return $this->page_str[$page]; } private function build_nav_str($page_start, $page_end){ $page_nums = range($page_start, $page_end); $target = $this->target? " target=\"{$this->target}\"" : ""; if($this->page == 1){ $page_str = <<<html <span class="{$this->de_prev_class}"> {$this->prev_str} </span> HTML; }else{ $page = $this->page - 1; $page_str = <<<html <span class="{$this->prev_class}"> <a href="{$this->url_prefix}{$page}"{$this->target}>{$this->prev_str}</a></span> HTML; } foreach($page_nums as $p){ $page_str .= ($p == $this->page) ? <<<html <span class="{$this->selected_class}">{$p}</span> HTML : <<<html <span class="{$this->class}"><a href="{$this->url_prefix}{$p}"{$this->target}>{$p}</a></span> HTML; } if($this->page == $this->total_page){ $page_str .= <<<html <span class="{$this->de_next_class}"> {$this->next_str} </span> HTML; }else{ $page = $this->page + 1; $page_str .= <<<html <span class="{$this->next_class}"> <a href="{$this->url_prefix}{$page}"{$this->target}>{$this->next_str}</a></span> HTML; } return $page_str; } public function tidy_str(){ ;//void } public function __call($func_name, $arguments){ if(isset($this->$func_name)){ return $this->$func_name; } } public function __destruct(){ unset($this->page_str); unset($this); } }
2023年08月28日
8 阅读
0 评论
0 点赞
1
...
40
41
42
...
112