从源码分析几个cms的架构设计
Wordpress drupal joomla
为了对照,我又选取了一个在GitHub上开源的轻量cms
lightcms
drupal 8.7.7 | 21,409 files 69.5Mb wordpress 5 | 2027 files 42.6Mb joomla 3 | 8344 files 37.1Mb
lightcms ? | 2275 files 16Mb
appsite ? | 1188 files 25.7Mb
Wordpress drupal joomla
为了对照,我又选取了一个在GitHub上开源的轻量cms
lightcms
drupal 8.7.7 | 21,409 files 69.5Mb wordpress 5 | 2027 files 42.6Mb joomla 3 | 8344 files 37.1Mb
lightcms ? | 2275 files 16Mb
appsite ? | 1188 files 25.7Mb
最近正在做appsite框架传统网站架构的拓展、其中不免有SEO的部分。 在网上做了一点功课,meta中的 description比较关键,keywords据说已经不再受搜索引擎的关照了,不过这种事情现在不能盲目相信,既然做一个网站那么还是应该要照顾好关键词。但是没必要付出过高的人力成本,所以我这里想到的还是使用分词扩展来自动生成关键词。 这样做的好处是,无论搜索引擎是否在意关键词,我们有和内容相关度很高的关键词,这不会对我们带来损失。 基于程序算法生成的关键词,不需要我们花费人力成本,包括可以在后台控制是否开启该功能。
我这里选用的是对php支持比较好的 SCWS分词扩展。 如果分词的目的是更多的语义化分析、情感分析等,那还是应该考虑一下其他的分词库,不过基本上没有php支持。
进入正题
因为最近的一个需求涉及到SEO 所以考虑用php写一套前台,这样可以根据url自动输出完整的页面,这里比较重要的是url rewrite 因为直接使用参数来访问页面一是不具备结构性,不方便基于文件夹管理php的前台页面,二是搜索引擎搜索方面也不友好。 所以要为后台添加一套自适应的rewrite。
以下是为一个SEO网站设计的结构
domain / home
/page | /class
/action
?querys
其URL示例为: https://domain/user/detail/12345/... https://domain/goods/list/... 经过重写转化为: https://domain/?abstract=user&functionality=detail&id=12345... https://domain/?abstract=goods&functionality=list...
由于没有数据表的概念、我们很多基于关系型数据库的查询方式、在Redis服务器上就要有新的思路。 譬如说我们通过4张表来维护用户数据、在redis上就应该只使用一个Hash 另外类似于Comment这样的表,我们就需要设计成Redis List类型 以COMMET_USERID来作为key 每一次添加一条反序列化数据进去。但这样做面临的问题是我们无法使用关系型表的其他诸如合并查询、反向查询等查询功能。
配置文件中配置 requirepass yourpassword
目前没有方案 考虑中 这个部分也和java服务端的朋友讨论过,Redis确实没有这方面的支持,如果考虑同一个redis服务器中有多个或者大量Saas需求、那么比较好的方式就是在最前面加一个appid的索引。
探索一下几种实现方式:
# 以saasID作为key userid做其中一项的方式
hset TRFUnmsZ userid qFVqmqMz nickname sprite
hset gdYuSu4G userid hGE5REy2 nickname amber
# 以userid作为key saasid作为其中一项
hset qFVqmqMz saasid TRFUnmsZ nickname sprite
hset Lh8PCIVy saasid TRFUnmsZ nickname soki
hset gdYuSu4G saasid hGE5REy2 nickname amber
# 以saasid拼接 keyid的方式
hset TRFUnmsZ_qFVqmqMz nickname sprite
hset TRFUnmsZ_Lh8PCIVy nickname soki
hset hGE5REy2_gdYuSu4G nickname amber
hset TRFUnmsZ_SETTING WECHATID 123456
hset TRFUnmsZ_SETTING APPNAME AppSite
hset hGE5REy2_SETTING WECHATID 654321
基于Redis只能通过key进行查询、不能使用类似于MySQL的WHERE查询,所以用saasid作为key的方式被摒弃。我们不可能取出所有的saas下的数据 再到程序里查找。
在macOS上安装php-redis是比较简单的,但是也有可能进入坑里,由于百度到的结果更坑,所以整理一下备用
官方下载地址 https://redis.io/download 参考官方的说明、安装步骤是 手动下载或者使用终端wget下载tar包 下载完毕后解压并且打开目录
$ cd /User/sprite/Downloads/redis-5.0.5
$ make
安装完毕之后打开终端输入 redis-server 出现redis欢迎界面表示已经安装成功
使用redis-server启动redis服务之后不要关闭终端页面、测试的时候要另外打开一个终端、然后输入redis-cli 否则会报错 无法连接到redis服务器
大杀器 官方文档 phpredis-Github
参考官方的文档,我们可以采用pecl安装、我没有尝试。 使用编译安装的方式
https://github.com/phpredis/phpredis/releases
下载完毕后解压,建议把包转移到其他地方,防止后面清理下载文件夹清理掉。 比如说 我放到了 /Library/PhpExtra/redis-5.0.2 (可以随便放)
$ cd /Library/PhpExtra/redis-5.0.2/redis-5.0.2
一定要保证目录下有 configure文件
这一步是网上基本都错误的部分 phpize是一个可执行文件,路径一般在/usr/bin/下 如果我们的mac注册了php环境,那么我们直接输入phpize就可以 没有再切换目录的必要。
$ phpize ./configure --with-php-config=/usr/bin/php-config
如果这一步的时候,无法找到phpize我们再使用绝对路径来定位
$ /usr/bin/phpize ./configure --with-php-config=/usr/bin/php-config
可能发生的问题:
1.Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable.Then, rerun this script.
brew install autoconf
2.mac phpize执行后报错:grep: /usr/include/php/main/php.h: No such file or directory
3.make: *** No targets specified and no makefile found.
如果phpize这一步成功了,不报错了。仍然有可能无法安装。比如说我就是这样。
无奈,尝试使用pecl方式安装。
一番折腾。 发现还是搞不定。 最终发现了是自己在2.3的步骤时候有错误。
$ cd /Library/PhpExtra/redis-5.0.2/redis-5.0.2 # 切换到你解压的目录
$ phpize
Configuring for: PHP Api Version: 20160303 Zend Module Api No: 20160303 Zend Extension Api No: 320160303
这一步看不到版本号的,看上面错误参考2
$ ./configure
... configure: creating ./config.status config.status: creating config.h
$ make
... Build complete. Don't forget to run 'make test'.
$ make install
...
Installing shared extensions: /usr/lib/php/extensions/no-debug-non-zts-20160303/
最后一步会告诉你 扩展安装到了哪里,复制下来 去php的配置文件中添加
php.ini一般在 /etc/php.ini 如果你没有就复制一个 php.ini.default出来 最后加上:
extension_dir="/usr/lib/php/extensions/no-debug-non-zts-20160303"
extension=redis.so
保存重启apache
sudo apachectl restart 在网上查看很多的帖子都是在 hypedown模块中注释掉对 \n 的解析
这样的做法是不行的,因为这样文章中的换行就会失效,所有的文字就堆到一起了。
查看了服务端的源代码并没有太好的解决方案,官方论坛所谓给出的已解决的开发板,我换了一下也并没有解决,这里先给一个临时解决方案。
在主题的footer中加入一行js代码即可
document.querySelectorAll(".post").forEach(function(post){ post.innerHTML = post.innerHTML.replace(RegExp(/<br><br>/g), '') });
主要就是检测同时出现两行的换行 就将它剔除掉 当然不完美,不过也没必要花太多时间在这个部分,大体上解决了问题~
接近14年底的时候我刚从西藏和尼泊尔回来,那时候我一直在筹划一个好课网的 互联网学习平台,在淘宝上做了0.5套 高水平的ps课程,那个时候我自己有点隐忧,觉得自己内心并没有充满了信心,其实就是感觉还没到。
那个时候想到一些点子,想做一些爆款小游戏,比如说我之前跟你提到过的 摇手机打boss 那个概念,因为我希望可以先做点小游戏做些流水出来,之后再考虑做大,做纯互联网的公司,因为互联网太难做了,需要把盘子做很大,而前期发展又非常耗钱,并且我找过一些程序的朋友,他们都委婉的拒绝了,或者答应了又没音信了,找了一些做过ios游戏的朋友,也给的是冷水。 而刚刚好这个时候,soki的一个朋友小艾 ,突然问我 在做什么等等并且拉我出来聊,soki这个游戏创业的事情。
我首先认为我是做设计的,做游戏美术并不擅长,并且带上了我认为我能做和不能做的部分,比如说那种超级写实,中世纪,超级立体等等,我说我做不了,但是我可以做各种酷炫,设计感好的游戏。 他当时看了看和我强调他很看重游戏的UI设计等等,可能也是因为他一贯在互联网公司的原因,我们聊的比较来,我们都比较认同剑走偏锋这样的价值观。 所以我就觉得这个事情可以做,当时他跟我谈过所谓的待遇或者未来可能有的报酬 大约什么一年30多万吧,股权15% 这样。我当时其实没太感冒,我是直接告诉他 可以先开始合作一段时间,就这样一直给他免费干到第二年看到你。 这个部分有几个点:
"QuartzComposer并没有传言中那么方便,FramerJS更令人惊喜。"

最近在负责一款SpyCamera的设计和交互,因为本身这款软件是一个非常小众而又轻量级的小应用,在众多竞争者中除了核心的功能安排外,能够进行差异化设计的就只有视觉设计和交互设计了。 在视觉设计这部分我把ICON和UI视觉全部重构了一遍,在重构的过程中由于需要去贴合安卓5.0的设计规范来获得谷歌一定的推荐流量,所以把整个视觉设计的相对轻、薄、简,这时一个优秀又有特色的交互就显得更有吸引力了。
加之之前看过一些关于QuartzComposer的介绍,总算找到一个机会好好花点时间来琢磨一下交互设计的实现部分。 首选当然是已经让我激动已久的QuartzComposer ,上手还真不轻松,在网上搜集了一些资料,然后一步步的安装和尝试。
资料传送:
苹果官方的指导文档 QuartzComposerUserGuide.pdf
Github上的新手上路 quartz-composer-and-origami-tutorial-button-animation (英文)
"当自己的目标非常遥远和困难的时候,更需要克制自己的内心,平衡理想和现实的差距,放慢心境,在正确的方向上稳步前行,这一切,都是为了更有效率的去达成那个最遥远的理想。"
近期解决了几件大事,之前的RunPuppyRun游戏重构和优化的工作完成以及新版本上线,原画师(概念设定)一职的招聘和选定人选,以及团队的优劣势发觉以及协作的磨合。 写在今天是因为总算把原画师一职顺利落定,在组织完部门小会之后的现在我才可以静下心来写一写最近的感受。
“一次细致深入的整理带来的价值远远超过在具体工作中能直接带来的效果,更多的是帮助我在思考的过程中更加明晰目标,判断方向以及正确的做减法。”
正在整理着手头的RunPuppyRun 的 Artwork Resource Total List 以及 参考项目 KiwiDash 的 Artwork Resource Total List,想到一些比较重要的点,所以写下来。
因为着实没怎么做过游戏,特别是没有深入的从头至尾的参与过完整的游戏项目,在当下继续深抠RunPuppyRun这个项目时,遭遇到一个很大的瓶颈就是欠缺细节的洞察和贯彻执行能力。
在今天之前我们花了足足两周多的时间来进行项目重构,技术代码重新写了一遍,UI也全部重新画了,角色动画也一直在调,但还没有一个满意的结果。
我们多次开会讨论并试图去找到我们的核心1+X,分析用户的行为数据和交互数据,我们用了各种办法去找到我们想要的答案。当然包括下面这张用户的交互层流转分析。

“告别了短暂的休息后,重新认识的我们每一个人其实都有着自己未来的道路,我们心照不宣。 对于未来可能要发生的一切,我们也有着默契,道不同,却可相与为谋。”
这是从3月份来到广州后的第一个月,接触了很多道不同,却需要相为谋的人,经历了一些难以调和的事件,做了一些难却果断的判断。 抵达广州的第一天是凌晨2点,小伙伴们就开着租来的车接我,见面那刻我还没缓过劲来,一切都感到陌生,直到进了客厅吃了那碗炸酱面,感觉心情平复了许多,也慢慢的开始活起来。当晚便和 许 喝到了夜里,也在酒桌上了解了对方,知道了,是谁,有什么,为什么。 和去年的设想规划有很大出入,这是3天后我才知道的,之前一起合作的技术掉链子不来了也没冲劲了,想要拉入伙的牛人策划因为家庭原因也婉言谢绝了。在我面前的这个 策划许 完全是个空降兵,好在一顿酒已然拉近我们的距离。只是想象中,那个大神级的人,随着时间的推移成了现在这位半路出家的新伙伴,难免让人有些质疑。 尽管如此,希望还是有的。因为在3天后,还有一个很有想法和文学功底的文案策划要过来,据说还是个川妹子,想想也是极好的呢。 事情的发展总是要出人意料,理想总是被覆灭,好在生活也总能给我们一些意外惊喜。 只是没想到,这川妹子的吨位竟如此之高,令人不得不感叹,造化弄人。 这几日是很闲散的,直到新的两位继续加入我们的团队,进行“试合作”,我们开始了相对紧张的工作,而最为紧张的,就是会议之中,我们竟可以为了说明对方是错的而浪费整整半天的时间。而症结点就在于,当我们探讨一个问题的时候,你究竟持有的是开放性的思路,提供建设性意见,还是以封闭思路,以旧有经验来否定当前探索。 当然了,后者唯一的价值就是,如果死亡,那他将会加速这一过程。 在几日争论和无奈以及忍让后,在我们还没来得及在紧张的气氛中去真正了解他之前,他选择或是被选择,离开了团队,带着他的案子,和坚持。 而幸运的是,这个过程中,我和小伙伴们更加认清了自己,在慢慢的磨合中,我们擦出了星光般的火花,微小却让我们彼此交心。火柴和石头本没有交集,但只要放开自己和对方真正的碰撞,在某个未知的时刻,或许就能点燃熊熊的烈火。 告别了短暂的休息后,重新认识的我们每一个人其实都有着自己未来的道路,我们心照不宣。 对于未来可能要发生的一切,我们却也有着默契,道不同,却可相与为谋。
雾霭弥散的傍晚,颇有一番末日前凝重。 国贸桥上的车流依旧, 似乎大家都不愿意相信玛雅人的玩笑话,或是忙碌的生活让人们实在无暇顾盼。
静望让我不禁地想到十年前的7月第一次来到北京,那时的我就像是误入了大森林的小矮人,发觉一切都超出他现有的理解,他发现只要说话,楼道里的灯就可以亮起,一个小学运动场也可以大的像一个初中学校,在夜幕中的广场依然能够用灯光制造出白日。 就像故事片的穿越一般,甚至还没来得及憧憬,我又回到了自己的小世界,继续在小日子中欢乐着。
像是一股力量在牵引着我,两年之前,我再一次站在这片天空下。 这一站就是两年半,一切都那么着急,急的让我又没来得及憧憬,却已然看透另一个实质。 这个城市,就像是病人脑颅中的一颗肿瘤,他已是病入膏肓,这瘤亦是无药可医,可这块腐烂的肉,却维系着命脉的延续,它在不断的吸取身体各种营养的同时不断的膨胀和恶化。它的毒素遍及全身,从灵魂的根源上蚕食着人的生命。它,就是全国最高密度的欲望集合体,北京城。
十年前的我,健康,单纯,快乐。我背负的,是生命的意义和生活的乐趣。 如今,麻木和懒惰在不断的蚕食着我的灵魂和肉体,而我背负的,除了责任以外,更多的是欲望。
一位小科学家在各种诱惑与胁迫前不敌倒下,躺在地上的是一个满是疮痍的社会清洁工,打扫着末日前的种种罪恶,拼命的挣扎在底线之上,为了给自己一个安慰和一个继续欲望生活的借口。
是的,生命的姿态不是固定,恶毒也有存在的价值,但我想做一个医生,终有一天能医治这颗毒瘤,还我十年前的那片天空。
我喜欢明媚的日光, 那样你的笑容就能像花儿般绽放, 为我制造快乐的氧气。
我喜欢湛蓝的夜, 那时我便能呀,把你当做那弯弯的月, 即使是阴天,也不害怕思念。
我更爱着…你的温柔, 无论在何时都能告诉我, 明天,晴
我只是想着 能悄悄的靠近你 在只有你我的地方 谈我们的心
我只是想着 能淡淡的陪着你 在没有外人的世界 轻轻的吻你
我只是想着 能深深的爱着你 在没有你的时候 静静的恋你
我从小就在寻找 那份属于我的坚强 让我在黑的夜,也能安然入睡
我一直都在期盼 那份属于我的宁静 让我在嘈杂的人群,也能淡然穿梭
我一直都在坚持 那份属于我的信念 让我在迷茫的日子,不会茫然无措
我一直都在等待 那份属于我的希望 让我在生命的末端,不会愕然叹息
最近回复