OpenCart 图片显示不出来

在 Windows 上安装了 OpenCart (2.3) 后,打开首页,发现产品都不显示图片,查看 img 标签的 src 属性,发现都是空的。一番搜索后,意识到应该是路径问题。

打开 OpenCart 的 config.php、admin/config.php 如下:

define(‘DIR_BASE’, realpath($_SERVER[‘DOCUMENT_ROOT’]) . ‘/’);

Windows 下路径是以“\”间隔的,把 DIR_BASE 这个值改为绝对路径,并且“\”换成“/”即可。

为用户账户“root”指定的密码无效,或者未能连接到数据库服务器

用 IIS 的 Web Platform Installer (Web平台安装程序)安装 OpenCart 时,出现了这很奇怪的错误:

为用户账户“root”指定的密码无效,或者未能连接到数据库服务器

但其实我输入的密码是正确的。Google之发现不少人也碰到这个问题,基本上确定是 MySql Connector/NET 的 bug ,但给出的解决方法也不尽相同……

我的解决方法是:(在控制面板/卸载程序)卸载已经安装的 MySql Connector/Net,然后在 Web Platform Installer 里把 MySql Connector 和 OpenCart 添加到“安装”里,然后一起安装。

xx33

终于成功在 IIS 上安装了 OpenCart 了!

IntelliJ IDEA、PyCharm 运行 Django 的 manage 命令

在开发 Django 项目时,会需要经常执行它的 manage.py  任务。

其实在 IntelliJ IDEA(或者 PyCharm )中可以很方便地运行 manage.py 任务,如图:

20171204163518
IntelliJ IDEA(或PyCharm)可以很方便地执行 django manage.py

然后就可以在 console 窗口中直接输入想要运行的 task 的名称了:
20171204164219

django 使用 mssql 遇到“没有活动事务时,不能发出 SAVE TRANSACTION”

django mssql SAVE TRANSACTION problem
django 使用 mssql 遇到“没有活动事务时,不能发出 SAVE TRANSACTION”的问题

这个问题有两个解决方法:

  • 第一种方法:provider 使用 SQLNCLI11
    SQLNCLI11 即 Microsoft® SQL Server® 2012 Native Client,下载并安装

    install SQLNCLI11
    安装 SQLNCLI11

    但我安装时碰到了 dll 缺失的问题,实在不想再折腾了,跳过。

    install SQLNCLI11 dll
    安装 SQLNCLI11 又遇到 dll 缺失的问题

     

  • 第二种方法:provider 使用 SQLOLEDB,设置 ATOMIC_REQUESTS 为 True
    打开 settings.py 在 DATABASES 下增加 ATOMIC_REQUESTS 的设置:

    20171202113004
    ‘ATOMIC_REQUESTS’:True,

Chrome extension(扩展程序)三大件的调试

Chrome extension 里脚本主要在三个地方运行:background.js、popup.js、content_script.js,这三者都可以通 Chrome 的“开发者工具”来调试。

  • background.js
    截图20171130101219background.js 运行于整个 Chrome extension 环境。默认设定下,background.js 的生命周期是只要 Chrome 打开,那它就会一直处于运行状态。
  • popup.js
    它的运行环境也是整个 Chrome extension 环境。以 pageaction 为例,你点击图标时 popup 出现,等鼠标点击其它地方,popup 消失,它的生命周期也就结束了。
    可能通过鼠标右键“检查”来打开 console 来调试 popup.js
    20171130103938
  • content_script.js
    它的运行环境只在 tab 里,和用户浏览的网页一样,就像是网页里的 js 一样。你关掉网页,它的生命周期也就结束了。打开“开发者工具”在 Sources 那个面板可以看到 Content scripts
    20171130104419
  • 它们之间如何通信
    如果要向 background.js、popup.js 发消息,注意它们的运行环境是 Chrome 运行环境,所以就是向 chrome.runtime 发消息:

    chrome.runtime.sendMessage(...)

    如果要向 content_script.js 发消息,注意它的运行环境是特定的 tab ,所以就是向 chrome.tabs 发消息

    chrome.tabs.sendMessage(...)

    那怎么接收对方发送的消息呢?
    注意!在 background.js、popup.js 和 content_script.js 里侦听对方发送的消息都是用:

    chrome.runtime.onMessage.addListener(...)

    不存在 chrome.tabs.onMessage 的!

关于 jQuery 中的 prop 和 attr

  1. 尽量使用 prop,而不是 attr
    在一些 DOM 的常用操作中这两者接近等价(要不然也不会这么容易搞混),但是 attr 在某些 element 的属性上可能不会像你想象的那样(比如 input 的 checked),使用 prop 可以避免这种情况。
  2. attribute (基本上)是 string 的
    attribute 就是你写在 HTML 中 element 的那些“属性”,像这样:

    <input type="hidden" name="type" value="file" crazy-attr="xxxx">

    这个 input 的 attributes 有 type/name/value/crazy-attr,这些“属性”的赋值除了被引号围着,就没有其它的类型声明,那它们只能是 string 的。另外,注意到没有你可以给 element 设定各种奇怪的任意名字的 attribute,而不是非得按照控件的属性来。
    你所设定的 attribute 会保存在 element.attributes 数组中。

  3. property 是定义在 DOM 类中的
    每个 element 都是 DOM 对象,都有它对应 DOM 的类,这个类里所声明的就是这个 element 的 property