全部文章

<p>毕业一年的多,当年毕业时在珠海一直想找份全职的前端工作,做了两个月的全职前端之后,就离开了上家公司,现在一直从事介于前端与后端(不如说是全站都兼顾)的工作,现今珠海的会不会有更多的前端职位呢?薪资到什么水平呢?以前一直给自己贴上前端er的标签,一年过去了,还是在前端与后端之间摇摆不定,希望珠海的前端职位越来越多,我心依然喜欢着前端。</p> <p><strong> 2017-05-01更新: </strong> 我目前就职于 <code>Quest</code> 珠海公司,工作主要是基于 <code>Angular 2</code> 开发后台系统,目前项目使用了 <code>Highcharts</code> 实现各类图表,使用 <code>moment</code> 处理日期与时间。</p> <p>目前团队还在磨合期,除了我一个是一直做前端的外,其它团队成员都是从 <code>C#</code> 转过来,他们对 <code>HTML</code> 和 <code>CSS</code> 理解不够,写样式没有规范,调整也是改一下样式再看一下页面,写出来的样式几乎没发重用。</p> <p><strong> 2019-12-15 更新:</strong> 我已经离开 <code>Quest</code> 珠海公司,目前就职一家做酒店任务管理系统的初创企业。</p>
详情
<p>构建html结构:</p> <p><code>tool.js</code> 的内容:</p> <pre><code class="language-javascript">function fnXMLHttp(fn) { var oXMLHttp = null; if (window.XMLHttpRequest) { //现代浏览器(IE7+,Chrome,Firefox,Safari,Opera) oXMLHttp = new XMLHttpRequest(); } else if (window.ActiveXObject) { //IE5,IE6 oXMLHttp = new ActiveXObject("" Microsoft.XMLHTTP ""); } if (oXMLHttp != null & amp; & amp; fn != undefined) { oXMLHttp.onreadystatechange = fn; } return oXMLHttp; /* XMLHttpRequest对象的属性有 onreadystatechange: 属性值为函数,当readyState属性改变时触发 readyState:属性值为数字(0:Uninitialized,1:Open,2:Send,3:Receiving,4:Loaded),HTTP请求的状态 status:属性值为数字,由服务器返回的 HTTP 状态代码:例如200,404 response:返回内容 responseText: responseXML: statusText:这个属性用名称而不是数字指定了请求的 HTTP 的状态代码 timeout: upload: onerror:数值为函数 onabort():取消当前响应,关闭连接并且结束任何未决的网络活动。 onloadstart: onloadend: onprogress: ontimeout: open(""GET"", url, true); //以GET方法+异步方式打开HTTP连接,原型open(method, url, async, username, password) send(null);发送HTTP请求 getAllResponseHeaders(); getResponseHeader(); setRequestHeader(); 请求头部 Host Connection Keep-Alive Accept-charset Accept-Encoding If-Modified-Since If-None-Match If-Range Range */ } function fnPost(url, data, fn) { var oXMLHttp = fnXMLHttp(); oXMLHttp.onreadystatechange = fnChange; oXMLHttp.open('POST', url, true); oXMLHttp.send(data); function fnChange() { if (oXMLHttp.readyState == 4 & amp; & amp; oXMLHttp.status == 200) { fn(oXMLHttp.response); } } } function bind(o, e, f) { if (window.addEventListener) { o.addEventListener(e, f, false); //false,表示在冒泡阶段调用事件处理程序 } else if (window.attachEvent) { o.attachEvent('on' + e, f); } } function $id(id) { return (typeof id === 'string') ? document.getElementById(id) : id; } function $tag(tagName, parent) { var parent = typeof parent != 'undefined' ? parent : document; return parent.getElementsByTagName(tagName); } function getStyle(obj) { if (window.getComputedStyle) { return window.getComputedStyle(obj, null); } else if (obj.currentStyle) { return obj.currentStyle; } }</code></pre> <p><code>flash.js</code> 的内容:</p> <pre><code class="language-javascript">(function() { var dBox = $id('first-view'), dLis = $tag('li', dBox), dUl = $tag('ul', dBox), dNum = $id('indicator'), timer = 0, timer1 = 0; var x1, //手指触摸时的x坐标 x2, //手指移开时的x坐标 dx, //间距 index = 0, //当前是第几个li可见 nLiLen = dLis.length, //总共多少个li nBoxWidth = $(window).width() - 16, currentPos = 0, //ul当前的距离 reg = /\-?[0-9]+\.?[0-9]*/g; //获取transform:translateX(34px)中的34 //绑定手指触摸时的处理函数 bind(dBox, 'touchstart', function(ev) { ev.preventDefault(); if (!ev.touches.length) { return false; } var touch = ev.touches[0]; x1 = touch.pageX; currentPos = parseFloat(dUl[0].style.webkitTransform.match(reg)); clearInterval(timer); clearTimeout(timer1); }); //绑定触摸过程的处理函数 bind(dBox, 'touchmove', function(ev) { ev.preventDefault(); if (!ev.touches.length) { return false; } var touch = ev.touches[0]; x2 = touch.pageX; var dx = x2 - x1; if (0 & lt; index & amp; & amp; index & lt; nLiLen - 1) { dUl[0].style.webkitTransform = 'translateX(' + (currentPos + parseFloat(dx)) + 'px)'; dUl[0].style.webkitTransition = '0ms linear'; } }); //绑定手指移开时的处理函数 bind(dBox, 'touchend', function(ev) { ev.preventDefault(); dx = x2 - x1; fnAnimate(dx); timer1 = setTimeout(fnStart, 5000); }); //绑定全部资源加载完毕的处理函数 bind(window, 'load', function() { var lis = ""; var imgs = $tag('img', dUl[0]); for (var i = 0; i & lt; nLiLen; i++) { lis += "" + i + ""; imgs[i].style.width = nBoxWidth + 'px'; dLis[i].style.width = nBoxWidth + 'px'; } dNum.innerHTML = lis; dBox.style.width = nBoxWidth + 'px'; fnSetNum(index); fnStart(); }); $(window).resize(function() { nBoxWidth = $(window).width() - 16; dBox.style.width = nBoxWidth + 'px'; var imgs = $tag('img', dUl[0]); var dLis = $tag('li', dUl[0]); for (var i = 0; i & lt; nLiLen; i++) { imgs[i].style.width = nBoxWidth + 'px'; dLis[i].style.width = nBoxWidth + 'px'; } }); function fnStart() { timer = window.setInterval(function() { dx = -21; if (index & lt; nLiLen - 1) { fnAnimate(dx); fnSetNum(index); } else { index = -1; } }, 3000); } function fnAnimate(dx) { if (Math.abs(dx) & gt; 20) { //滑动够一定距离才执行 if (dx & lt; 0) { //从右向左滑动 if (index & lt; nLiLen - 1) { index++; } } else if (dx & gt; 0) { //从左向右滑动 if (index & gt; 0) { index--; } } dUl[0].style.webkitTransform = 'translateX(-' + (index \* nBoxWidth) + 'px)'; dUl[0].style.webkitTransition = '500ms linear'; } fnSetNum(index); } function fnSetNum(index) { var lis = $tag('li', dNum); for (var i = 0; i & lt; nLiLen; i++) { lis[i].className = "" ""; } lis[index].className = 'current'; } function fnGetNum() { return index; } })(); </code></pre>
详情
<h3>在linux上创建仓库以及一些最基本操作</h3> <p>创建仓库 <code>svnadmin create 仓库名称</code></p> <p>检出 <code>svn co svn://192.168.1.133/repos /web/www/html/website</code></p> <p>更新 <code>svn up /web/www/html</code></p> <p>开启 <code>svnserve -d -r /web/svn</code></p> <hr /> <h3>遇到的问题</h3> <p>1.SVN客户端 <code>tortoiseSVN</code>,<code>show log</code> 没有显示日期,作者,备注信息</p> <p>解决办法:</p> <p>修改svn配置文件:仓库 <code>/conf/svnserve.conf</code> 改为: <code>anon-access = none auth-access = write</code></p> <hr /> <p>2.多用户访问多仓库,一个认证文件?如何创建仓库? 解决办法: 目录结构 <code>/web/svn /web/svn/websiteA</code> (一个仓库) <code>/web/svn/websiteB</code> (另外一个仓库) <code>/web/svn/websiteC</code> (再一个仓库) <code>/web/svn/websiteA/conf/svnserve.conf</code> (每一个仓库都有)</p> <p>设置各个仓库中的 <code>svnserve.conf</code></p> <pre><code>password-db = /web/svn/codeAuth/passwd authz-db = /web/svn/codeAuth/authz</code></pre> <p><code>/web/svn/auth</code> (存放认证相关文件,各个仓库共用)</p> <p><code>/web/svn/codeAuth/authz</code> (设置用户,用户组,权限)</p> <p><code>/web/svn/codeAuth/passwd</code> (设置用户密码)</p> <hr /> <p>3.同步更新问题 在 <code>/web/www/html/websiteA</code> 目录 <code>checkout</code> 一份,作为本地测试用,要求仓库有新的提交时 <code>/web/www/html/websiteA</code> 自动更新</p> <p><strong>解决办法</strong></p> <p>在创建仓库目录中有个 <code>hooks</code> (简称钩子程序),在此目录新建 <code>post-commit</code></p> <pre><code>REPOS="$1" REV="$2" export LANG=en_US.UTF-8 svn update /web/www/html/websiteA --username xxxx --password xxxx REPOS="$1" REV="$2" export LANG=en_US.UTF-8 svn update /web/www/html/websiteA --username xxxx--password xxxx echo 'whoami',$REPOS,$REV >> /web/svn/repos/hooks/svn_hook.log #mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf</code></pre>
详情
<p>边学边做,共计一个一个星期,从无到有,从不完善到完善,基于Yii构建的站点终于完成,访问地址:<a href="http://famous86.com">点击</a>访问。</p> <p>该站点,分两个应用,一个是前台应用,一个是后台应用,两个应用的配置基本相同,但也有不同,后台有明确的权限管理配置,而前台是所有访客都可以访问。</p> <p>通过做完这个站点,基本清楚明白 Yii 构建站点的流程,Yii 的特点,难点。</p> <p>Yii 有批处理的概念,就是当你清楚你的需求,设计好数据库后,通过脚手架工具,可以快速帮你构建起数据模型(Model),控制器(Controller),视图(View),而且常用的模块都构建好,你只需要按照自己的业务逻辑再有针对性地修改即可。</p> <p>如果要个性化定制界面,就要了解 view 这一层,也就是要根据系统自带的模板规则,生成的 html 结构进行分析,比如列表模块,form 表单模块,只有了解清楚这些模块的 html 结构才能写出高效,通用的 css。</p> <p>Yii 的功能实在太强大,太多了,做完这个站点只能说基本了解怎么用它,想要驾驭 Yii 还要继续努力,继续投入时间去研究。</p>
详情
<p>由于http服务由原来的Apache转换到Nginx,配置要求支持自定义url,由于之前一直在用Apache,受惯性思维的思维的影响,一开始尝试使用.htaccess文件来实现,查阅相关资料后发现,nginx服务器默认是不支持.htacceess,只能当它是普通的配置文件,可以把它include进来,而重写规则与Apache的写法是不同的,网上也有相应的转换工具,但是感觉不靠谱,因为不明白原理。</p> <p>接下来,继续查找资料,把wordpress后台设定链接形式选为自定义,格式为Custom Structure为 <code>/%category%/%post_id%.html</code> 尝试了比较多的形式是 <code>if(!d xxxx){rewrite (.*) /index.php}</code> 这种形式试过了,除了文章的链接是可以实现的外,其它的全部跳去404页面,这时百思不得其解,放下一天,今天早上上班,感觉很不爽,总有个问题在心里,碍着碍着的感觉,立下决心,今天一定要解决。</p> <p>由于线上的网站已经在使用,调试起来极不方便,就想着自己搭建一个环境,刚好,会议室有台服务器,已经安装了Centos,网上搜了一篇<a href="http://www.nginx.cn/install">文章</a>,里边很详细的介绍了安装步骤,照着敲就行了,安装完成之后,配置好nginx,安装wordpress,设定跟在线使用wordpress一样的配置。</p> <p>写重写规则</p> <p><code>try_files $uri $uri/ /index.php;</code> 写在nginx server 段下的location段中。</p> <p>然后重新载入配置文件</p> <p><code>service nginx reload</code> 发现没有任何作用,在自问“重写规则写错了?”静下心思考,是配置没生效吧,果断重启nginx,然后,一切都正常了,It works. </p> <p>总结:网上的文章不可全信,一定要有自己的思考,是什么?为什么?只有了解清楚了,解决就不会太难。</p>
详情
<p>不知不觉已经毕业一年了,昨晚从珠海回到江门五邑大学,刚好碰到职协送旧,顺便去坐了下,见到老朋友,寒暄几句,有的即冲冲离开,剩下的吞云吐雾,喝几罐啤酒,唱唱K慢慢地也就散了。</p> <p>今天早上,一睁开眼,八点多,看了部分古典的《拆掉思维的墙》很是受感触,回到珠海一定要看完这本书,因为他触动了我心里的想法,缺乏安全感他分析得很透彻。</p> <p>刚洗完脸,健辉打电话过来叫过去参加毕业典礼,进入到吕志和礼堂,一切仿佛回到了前一年的今天,而不同的前一年我穿的是学士服,拿的的是毕业证书,而后天背了个逃难式的背包,手拿单反,镜头出现的全是别人的笑脸。</p> <p>感叹时间飞逝的同时,似乎感觉到自己也是时候要改变些什么了。</p>
详情
<p>今晚准备去看变形金刚4,内心有点激动,应下时下气氛,今天特意换个手机主题,这个主题包竟然达到62M之多。</p>
详情
<p>IP地址由32位正整数组成,8位为一组,分成4组,每组以“.”隔开最多可以有2^32=4294967296约43亿台电脑接入到网络。</p> <p>IP地址分两部分,</p> <p>一是网络标识(网络地址),路由器就是根据IP地址的网络标识进行转发,同一网段内,网络标识必须相同,网络标识相同的计算机必须同属于一个链路,不同网段网络标识必然不同;</p> <p>二是主机标识(主机地址),同一网段内,各主机标识必然不同。</p> <p>IP地址分为4类,</p> <p>A类:首位为0,1-8位为网络标识,即0.0.0.0---127.0.0.0;</p> <p>B类:前两位为10,1-16位为网络标识,即128.0.0.1---191.255.0.0;</p> <p>C类:前三位为110,1-24位为网络标识,即192.168.0.0---239.255.255.0;</p> <p>D类:前四位为1110,1-32为网络标识,没有主机标识,常用于多播。</p>
详情
<p>逻辑上内存大体上分为四段,分别为栈空间段,堆空间段,初始化数据段,和代码段。</p> <p>栈空间的特点:空间小,CPU访问的速度快,后进先出。</p> <p>堆空间段的特点:大小不固定,空动态扩张或缩减。</p> <p>数据段的特点:存放程序静态分配的变量。</p> <p>代码段的特点:存放可执行文件的操作指令,可读不可写。</p>
详情
<p><code>欢迎来到我的博客。</code></p> <p>这个网站搭建于 <code>2014-06-22</code>,这是我个人的网站,这个网站主要是记录自己工作遇到的难题,常犯的错误以及总结。</p> <p>我目前生活在全国最适合居住的城市之一---珠海,欢迎大家与我交流。</p> <p>如有网站兼职也可联系我:</p> <ul> <li>QQ:565524110</li> <li>Email:565524110@qq.com</li> </ul> <h1>技术栈</h1> <ul> <li>Vue2/3</li> <li>React</li> <li>NestJS</li> <li>微信小程序</li> <li>Angular</li> <li>Flutter</li> </ul> <h1>做过的项目</h1> <ul> <li><a href="https://www.pcdeng.com/printer-playground/">Printer Playground</a></li> <li><a href="https://www.pcdeng.com/tag-editor/">QiLabel Editor</a></li> <li><a href="https://chrome.google.com/webstore/detail/ngmlmeaknfjiomiklcdjmoajhdompmii">Chrome Extension Printer Driver</a></li> <li><a href="https://www.pcdeng.com/vue-ad/">Vue Ad Prototype</a></li> <li><a href="https://www.pcdeng.com/lite-hotel-app.html">Lite Hotel</a></li> <li><a href="https://pcdeng.com">记一记</a></li> <li><a href="http://app.runcam.cn">RunCam HD 在线 App</a></li> <li><a href="http://runcam.com/">RunCam 官网</a></li> </ul> <h1>Github</h1> <p><a href="https://github.com/pcdeng">github</a></p>
详情
<p>历时一天终于把人生中第一个博客系统搭建起来了。注:第一版是基于wordpress 搭建博客,后来学习了 laravel 之后,自己写了一个简单的够自己用的博客系统也就是现在这个记一记系统。</p> <p>1.屏蔽了从 “fonts.googleapis.com” 加载字体慢的问题。</p> <p>2.修改了主题 “twentyfourteen” 样式表 “style.css” 使整个页面水平居中。</p> <p>3.比较全面地了解了 <code>wordpress</code> 的架构,功能,数据库。<a href="http://blog.csdn.net/liujiyong7/article/details/8037843">详见</a></p>
详情