mweb hexo 设置
hexo 借助图片插件可以在 post 目录建立跟文章文件的同名文件夹来保存图片,之前也一直都是这么做的,但是在 mweb 上预览时图片不显示,经过一番折腾,反正总会有一番折腾,而且也少不了一番折腾以后,弄好了。 现在将折腾的经过记下来留档。 首先,用 mweb 的外部模式打开 hexo 下的 source 目录,然后右键目录,选择编辑,具体配置如下图,如果没有配置图床可以不用理它,我配完也没理它,为啥呢,因为慢。 把 hexo 的配置文件中:post_asset_folder 改为 false。 下一步,把你花花哨哨的图片放到 source/images 目录即可,新增图片时用 mweb 的图片工具添加,会自动保存到文件夹内,并且会自动添加 mackdown 格式的图片到文档内。 然后,就没了。 哦,可能需要执行一下这个: 1npm install hexo-asset-image --save 这次真的没了。
php ziparchive addfile return false
有个文件,存储了两条准备用于给文件重命名的字符串和文件路径的数据,每行一条,名称和字符串以 , 间隔。 然后问题来了,通过读文件取出数据,然后获取文件路径并打包时,ZipArchive 的 addFile 总会有一个 false。 折腾半天,最后发现还是因为粗心大意,没过滤行尾的换行符…… 一声叹息,掏出小本本默默记上一笔。 最后附上代码: 12345678910111213141516171819202122232425<?php$txt_file = './zip.txt';$zip = new ZipArchive();$fileName = './res.zip';$path = '/opt/homebrew/var/www/';if(file_exists($fileName)){ unlink($fileName);}if(!$zip->open($fileName, ZipArchive::CREATE)){ echo...
php 和设计模式 - 门面模式
门面模式也叫外观模式,主要是为子系统中的一组接口提供一个一致的接口,facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 一个简单的🌰: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051class Facade{ private Subsystem $subsystemA; private Subsystem $subsystemB; public function __construct(Subsystem $subsystemA, Subsystem $subsystemB) { $this->subsystemA = $subsystemA; $this->subsystemB = $subsystemB; } public function subsystemARun() { ...
php 和设计模式 - 中介者模式
最近太忙,拖更好多天,难受…… 废话不多说,先来看看概念:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地互相引用,从而使其耦合松散,而且可以肚里地改变它们之间的交互。 也就相当于你租了个房子,但是房东常年旅居国外,有事情你也不需要找房东,因为房东把所有事情都委托给了中介。 令人羡慕的房东啊…… 举个🌰: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990<?php// 中介者模式interface MediatorInterface{ public function send($service, string $message);}class Mediator implements MediatorInterface{ ...
php 和设计模式 - 访问者模式
这个模式就比较复杂,首先从概念来说,就是将对象的操作外包给其他对象,也就是访问者,从而实现在不改变个元素的前提下定义作用于这些元素的新操作。 当一个基类可以被访问,并具有名为 acceptVisitor 的公共方法,改方法接受参数 Visitor,然后根据传递 Visitor 对象调用公共方法 visit。 1234567891011121314151617181920212223242526272829303132333435363738394041interface Visitor{ public function visit($visitor);}class Element{ protected Visitor $visitor; public string $name; public function __construct(string $name) { $this->name = $name; } public function getName():...
php 和设计模式 - 状态模式
通过改变类的状态来实现对它行为的切换。 看代码还是比较好理解的: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869abstract class State{ protected string $state; public function getState(): string { return $this->state; } abstract public function handle();}class StateContext{ protected State $state; public function setState(State $state) { $this->state = $state; } ...
php 和设计模式 - 备忘录模式
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存该对象的内部状态。这样就可以方便的恢复到之前保存的状态。 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849class Memento{ protected string $state; public function __construct(string $state) { $this->state = $state; } public function getState(): string { return $this->state; }}class Originator{ protected Memento $memento; protected string $state; public function...
php 和设计模式 - 命令行模式
用过 laravel 框架的应该都知道,其脚本模块非常强大,这些脚本,也就是命令行模式。 说到命令行,就不得步提一下 cli 和 cgi 的区别,在 nginx 中,php 并不是直接执行的,而是通过 cgi 调用 php 并获取执行结果。 而 cli 就是命令行接口,主要用于 shell 脚本的开发。 123456789php command.php/opt/homebrew/var/www/design-patternphp-cli command.phpX-Powered-By: PHP/7.4.16Content-type: text/html; charset=UTF-8/opt/homebrew/var/www/design-pattern 不多说了,回头再专门看一下这方面的东西。
php 和设计模式 - 责任链模式
建立一个对象链来按指定顺序处理调用。如果其中一个对象无法处理命令,它会委托这个调用给它的下一个对象来进行处理,以此类推。 12345678910111213141516171819202122232425262728293031323334353637383940414243444546abstract class Handler{ protected ?Handler $successor; public function __construct(Handler $handler = null) { $this->successor = $handler; } abstract public function handle($request);}class HttpInNumeric extends Handler{ public function __construct(Handler $successor = null) { ...
php 和设计模式 - 迭代器模式
提供一种方法顺序访问一个集合对象中的各种元素,而又不暴露该对象的内部表示。 foreach 的底层就是迭代器。很多编程语言都已经将其作为一个基础类库实现出来了,所以也就有了这个模式目前学习意义大于实际意义的说法。 在 php 中,内部已提供 Iterator 接口,可以直接使用。 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879class Bookshelf implements \Countable, \Iterator{ protected array $books = []; protected int $current = 0; public function addBook(Book $book) { $this->books[] = $book; ...