nothing to say,just hope
一眨眼我一个月没更新博客了…… 无法挽留的消逝早上起来,照例去阳台观察我的几盆肉肉时,发现其中最大的一颗黑腐了。 坚实的根茎瘪下去一半,已经撑不住叶冠开始歪了……我想把它揪出来砍头,试图去挽留这个脆弱的生命,结果揪出来叶子也快掉光了。强忍着心疼把叶冠切了下来,放在一旁通风处晾着,然后把根和掉落的叶子都放进旁边的盒子,那里已经放了很多干枯腐朽的叶子。 应该是一个月前吧,当时长得最好的一颗肉,如今就躺在“棺材”里,张牙舞爪地等着新成员的到来。 我的肉肉都挺凄惨的:最好看的一颗,死了,化水;第二好看的一颗老桩,长徒了,现在耷拉在盆子外边,一副猥琐的样子;最大的和最大的死后最大的,死了,黑腐;最小的一个石生花压根儿就没活过;最喜爱的发财树仙人球染了蚧壳虫,兑了点醋喷了一下,现在好了点。 这么整理了一下觉得更凄凉了,几棵死的多肉我特么就知道个石生花叫石生花。😂 叶插的苗有三个正在茁壮成长,最大的一个老叶子却干枯了,只剩几颗新出的嫩芽还垂死挣扎,能不能挨过这个夏天还是一个迷。 还是撑过这个夏天吧,我很希望你们都好好活着……
Laravel使用chunk自更新有误的原因
Laravel 的 chunk 在查询大量数据时非常好用,但是在用某个字段做为检索条件,并且在程序内部有更新这个字段的时候,就会有一部分数据丢失。 原因是这样的,比如有7条数据,每次取2条,那么这7条数据就会被分为2,2,2,1这样几块,第一次调用时,取得第一页,也就是第一个2的数据块,更新完后再取数据,原来的第二页就变成了第一页,但是这时候取的还是第二页,所以这时候取的是第三个数据块,到了第三次调用的时候,原来的第二页变成了第一页,原来的第四页变成了第二页,第三页就变成了空的,所以第三页就什么都取不到了。 解决方法:可以使用 laravel 的游标 cursor()
Laravel使用ftp传输文件时报错ftp_put() No data connection的解决
代码: 123456789101112131415161718192021222324252627282930313233<?php$file = "test.dat";$ftp_server="ftp.server.com";$ftp_user = "myname";$ftp_pass = "mypass";$destination_file = "test.dat";$cid=ftp_connect($ftp_server);if(!$cid) { exit("Could not connect to server: $ftp_server\n");}$login_result = ftp_login($cid, $ftp_user, $ftp_pass);if (!$login_result) { echo "FTP connection has failed!"; echo "Attempted to connect to $ftp_server for user $ftp_user"; exit;} else {echo "Connected to $ftp_server, for user $ftp_user";}$upload = ftp_put($cid, $destination_file, $file, FTP_BINARY);if (!$upload) { echo "Failed upload for $source_file to $ftp_server as $destination_file<br>"; echo "FTP upload has failed!";} else { echo "Uploaded $source_file to $ftp_server as $destination_file";}ftp_close($cid);?> 原因是没有定义ftp的主被动模式,true是被动模式: 1ftp_pasv($cid, true);
做个记录
前天晚上回了趟郑州,昨天为了办理按揭满城跑,顶着硕大的太阳,晒得我睁不开眼睛… 累,但是还是做下记录吧。 一年以上的劳务合同 收入证明,公司盖章 非郑户籍购房申请表,两份,第二页公司盖章 公司营业执照副本复印件加公司盖章 在职证明,公司盖章 无房证明,房管局自助办理 贷款银行的银行卡及卡主档 学士证、学位证复印件 学信网学籍、学历验证信息复印件 个人信用报告 银行流水记录 购房转账记录 跟银行客户经理合影–不知道为什么会有这一项但是确实是有 这是办理按揭,还需要再回去一趟签些文件…… 各种手续办理完成的两个月后开始还房贷。
Laravel转换时间为xx分钟前
比如说有这样一个需求:一篇文章的发表时间: 12345**距离现在时间** **显示格式**< 1小时 xx分钟前1小时-24小时 xx小时前 1天-10天 xx天前>10天 直接显示日期 其实laravel已经内置好了,只需要用Carbon就可以实现了。 中文化显示在 app\Providers\AppServiceProvider.php 中添加代码: 123public function boot() { Carbon::setLocale('zh');} Model中调用如果你想在某个类型的数据中人性化显示时间,那么就在该Model中添加以下代码: 12345678public function getCreatedAtAttribute($date){ // 默认100天前输出完整时间,否则输出人性化的时间 if (Carbon::now() > Carbon::parse($date)->addDays(100)) { return Carbon::parse($date); } return Carbon::parse($date)->diffForHumans();}
为爱好充值
那个周末,阳光明媚。 我光着脚坐在窗台前伺候多肉,看它们一个个憨态可掬,咔咔几张照片并随手发到了群里。 然后,同样喜欢花花草草的姑姑就被炸了出来,我俩兴致勃勃的聊起了心得。 看看身边慢慢积攒的一堆东西和群里不停跳动的文字,突然觉得自己离想要的生活好近。 以前在学校买的第一对哑铃,哐哐的玩了两年多,离开郑州时留给了一个老胳膊老腿儿的家伙,这家伙也不会爱惜它,哎。 前几天看着身上日益增长的肉肉,终于不忍心继续堕落下去,现在已经结实多了。✌ 虽然我的果冻乙女心还没有果冻色,玉坠也没有开始坠,但我还是很爱它们呀~ 人还是要有点儿爱好的,消磨时光,调剂生活。
Docker使用教程-以Dockerfile定制镜像
我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。 而 Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu 16.04 最小系统的 root 文件系统。 Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。 理解镜像构成镜像是容器的基础,每次执行 docker run 的时候都会指定以哪个镜像作为容器运行的基础。 镜像是多层存储,每一层是在前一层的基础上进行的修改;而容器同样也是多层存储,是在以镜像为基础层,在其基础上加一层作为容器运行时的存储层。 现在让我们以定制一个 Web 服务器为例子,来讲解镜像是如何构建的。 1docker run --name webserver -d -p 80:80 nginx 这条命令会用 nginx 镜像启动一个容器,该容器命名为 webserver,并且映射了宿主机的 80 端口,这样我们就可以在宿主机用浏览器去访问这个 nginx 服务器。docker的启动画面中有当前容器的 ip,例如:192.168.99.100,打开浏览器直接访问该 ip 就能看到默认的 Nginx 欢迎页面。 现在,我们来做点尝试,修改下nginx的欢迎页面。 1234$ docker exec -it webserver bashroot@bcd5b7c85e68:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.htmlroot@bcd5b7c85e68:/# exitexit 我们以交互式终端方式进入 webserver 容器,并执行了 bash 命令,也就是获得一个可操作的 Shell。 然后,我们用 Hello, Docker! 覆盖了 /usr/share/nginx/html/index.html 的内容。 现在我们再刷新浏览器的话,会发现内容被改变了。 我们修改了容器的文件,也就是改动了容器的存储层。要保存这些修改,可以使用 docker 提供的 docker commit 命令将存储层保存下来成为新的镜像。也就是说,是在原有镜像的基础上,再叠加上改动了的存储层并构成新的镜像。 这意味着每一次修改都会让存储层叠加,而且你所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到。 想想就是件很恐怖的事情。😰 不过,存在即是真理,commit 虽然恐怖,但还是很有用武之地的,比如被入侵后保存现场和一些特殊场合。 使用 Dockerfile 定制镜像如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建和定制镜像,那么之前提及透明性和体积臃肿的问题就都会解决。 这个脚本就是 Dockerfile。 Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。 还是以上边的 nginx 为例。 创建一个文件夹,然后在文件夹内创建一个文本文件。 123mkdir /c/dockercd /c/dockertouch Dockerfile 其内容为: 12FROM nginxRUN echo '<h1>Hello, M-finder!</h1>' > /usr/share/nginx/html/index.html FROM 指定基础镜像所谓定制镜像,就是以一个镜像为基础,在其上进行定制。就像我们先运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指定的。 FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。 RUN 执行命令RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。其格式有两种: shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式。 1RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html run 命令应尽可能的压缩为一行,因为每一个 run 命令就是一层存储层,而且,命令应该遵循良好的代码格式,比如换行、缩进、注释等,会让维护、排障更为容易,最后也应该添加清理工作的命令。 构建镜像在 Dockerfile 文件所在目录执行: 1234567891011$ docker build -t nginx:v3 .Sending build context to Docker daemon 2.56kBStep 1/2 : FROM nginx ---> c5c4e8fa2cf7Step 2/2 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html ---> Running in 4e2f0f98fbfeRemoving intermediate container 4e2f0f98fbfe ---> 8b70819a7261Successfully built 8b70819a7261Successfully tagged nginx:v3SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories. 从命令的输出结果中,我们可以清晰的看到镜像的构建过程。在 Step 2 中,如同我们之前所说的那样,RUN 指令启动了一个容器 4e2f0f98fbfe,执行了所要求的命令,并最后提交了这一层 c5c4e8fa2cf7,随后删除了所用到的这个容器 4e2f0f98fbfe。 这里我们使用了 docker build 命令进行镜像构建。其格式为: docker build [选项] <上下文路径/URL/->在这里我们指定了最终镜像的名称 -t nginx:v3,构建成功后,我们可以像之前运行 nginx 那样来运行这个镜像。
Docker使用教程-入门
docker已经装好了,但是完全不知道怎么用,先来点官网的例子看看吧。 docker自带的终端不太好用,所以先用xshell连接上终端,ip为终端启动时显示的:192.1168.99.100,默认应该都是这个。账号密码是:docker / tcuser 1234567891011121314 ## . ## ## ## == ## ## ## ## ## === /"""""""""""""""""\___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ / ===- ~~~ \______ o __/ \ \ __/ \____\_______/ _ _ ____ _ _| |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ ||_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_| 安装centos镜像拉取一个centos的映像并在衍生容器内运行交互式终端: 1docker run --interactive --tty centos bash 官网的例子是ubuntu,没玩过,所以换成了更熟悉点的centos 安装完成后会自动进入centos的控制台,输入exit可以退出。 安装nginx1docker run --detach --publish 80:80 --name webserver nginx 装完以后,在你的宿主机,也就是装docker的电脑上打开浏览器,输入docker启动时输出的ip就能够看到nginx的欢迎页面了。 删除镜像1.停止所有的container,这样才能够删除其中的images: docker stop $(docker ps -a -q) 如果想要删除所有container的话再加一个指令: docker rm $(docker ps -a -q) 2.查看当前有些什么images docker images 3.删除images,通过image的id来指定删除谁 docker rmi 想要删除untagged images,也就是那些id为的image的话可以用 docker rmi $(docker images | grep “^“ | awk “{print $3}”) 要删除全部image的话 docker rmi $(docker images -q)
Docker安装教程
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。 docker官方推荐了两种安装方式:app和toolbox。 注:app方式对系统版本和配置会有一定要求,Mac版本会自动为你安装好VM(虚拟机),但Windows版本需要你安装微软虚拟化产品Hyper-V,而toolbox方式则需要你额外安装virtualbox来作为docker的VM。 App-macApp-win Toolbox centos 安装注意:docker要求centos在3.0以上 可以用 uname -r 查看centos内核: 12345uname -r[root@localhost ~]# uname -r2.6.32-696.20.1.el6.x86_64 好可惜,我的虚拟机不支持,升级个内核再继续装。 Docker 软件包和依赖包已经包含在默认的 CentOS-Extras 软件源里,安装命令如下: 1yum -y install docker 如果出现 No package docker availableyum没有找到docker包,更新epel第三方软件库,运行命令: 1sudo yum install epel-release 然后再运行: 1sudo yum install docker-io 安装完就可以愉快地安装了。 docker 启动启动docker: 1service docker start 测试运行 hello-world 1docker run hello-world 由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行。 windows安装注意:win7,8和10的家庭版需要docker toolbox安装 点我下载: 安装完成后,桌面会多这三个图标出来。强行给我乔巴照相,哈哈! 点击 Docker QuickStart 图标来启动 Docker Toolbox 终端。 如果系统显示 User Account Control 窗口来运行 VirtualBox 修改你的电脑,选择 Yes 输入一下命令调用测试: 1docker run hello-world win10专业版win10专业版自带hyper-v,用来装docker更方便。(hyper-v是win系统自带的一个虚拟机工具) 找到程序和功能,打开启用和关闭功能,然后勾选hyper-v 然后下载安装 Toolbox 安装完成后会自动打开,右下角的系统通知栏有个小鲸鱼的图标,这表示docker在运行。 到这里就安装好了,更多姿势我们可以在启动器输入 docker 来解锁。
结合layui流加载实现的瀑布流
最近在用layui做一个社区站点,有个页面想做成瀑布流形式,但是layui本身的流加载并没有实现这个功能,所以在研究了几个臃肿的插件源码后,自己做了一个可以结合layui流加载使用的轻量级瀑布流插件,用起来也比较简单。 图丢了,演示效果无。 使用说明:友情提示:如果不熟悉layui的用法,请百度过去仔细阅读一下文档。 在页面中用layui的定义的模式扩展引入common.js ajax加载数据信息,获得数据总分页数 laytpl渲染数据 流加载判断是否还有下一页数据 waterfall整理页面元素的定位 javascript 内容: common.js 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859layui.define(['jquery', 'element', 'util', 'laytpl'], function (exports) { var $ = layui.jquery , element = layui.element , layer = layui.layer , util = layui.util , laytpl = layui.laytpl; var gather = { waterfall: function () { var box = $(".layui-col-md3"); var boxWidth = box.eq(0).width(); var num = Math.floor($("#zone-list").width() / boxWidth); var boxArr = []; box.each(function (index, value) { var boxHeight = box.eq(index).height(); if (index < num) { boxArr[index] = boxHeight; } else { var minboxHeight = Math.min.apply(null, boxArr), minboxIndex = $.inArray(minboxHeight, boxArr); $(value).css({ "position": "absolute", "top": minboxHeight + 15, "left": box.eq(minboxIndex).position().left }); boxArr[minboxIndex] += box.eq(index).height() + 15; if (boxHeight + minboxHeight > $("#zone-list").height()) { $("#zone-list").height(150 + boxArr[minboxIndex]); } } }); }, json: function (url, data, func, options) { var that = this, type = typeof data === 'function'; if (type) { options = func func = data; data = {}; } options = options || {}; return $.ajax({ type: options.type || 'post', dataType: options.dataType || 'json', data: data, url: url, success: function (res) { func && func(res); }, error: function (e) { layer.msg('请求异常,请重试', {shift: 6}); options.error && options.error(e); } }); }, }; exports('common', gather);}); 调用 12345678910111213141516171819202122232425262728var action = '/zone';common.json(action, '', function (res) { flow.load({ elem: '#zone-list' , isAuto: true , isLazyimg: true , mb: 100 , done: function (page, next) { var lis = []; common.json(action, {page: page}, function (res) { var getTpl = zonesTpl.innerHTML, view = document.getElementById('zone-list'); layui.each(res.data.data, function (index, item) { laytpl(getTpl).render(item, function (html) { lis.push(html); }); }); if (page < res.data.last_page) { next(lis.join(''), true); } else { next(lis.join(''), false); } common.waterfall(); }); } });}); html内容: 1234567891011121314151617<script id="zonesTpl" type="text/html"> <div class="layui-col-md3"> <div class="zone-box"> <div class="dt_text"> <span class="zone-word">@{{ d.content }}</span> </div> @{{# var img = layui.jquery.grep(d.imgs.split(','), function(n) {return layui.jquery.trim(n).length > 0;}) }} <div class="img_box base-img-w img-w-@{{ img.length }}" > <a class="img_w " href="javascript:;"> @{{# for(var k=0;k< img.length;k++){ }} <img src="@{{ img[k] }}" > @{{# } }} </a> </div> </div> </div></script> 好了,就是这么简单。
