孙肖宁 发布的文章

对于一些很大的数字在前端显示的时候可能会不容易控制,而且对于一些很大的数字我们也不需要很精确的显示,这时候我们就需要把这个阿拉伯数字转换为汉字形式的了,并且保留一位小数就可以了。比如:12000我们可以显示为1.2万
我们之前说了下加逗号进行区分的方法,大家可以看下小编之前的文章。
我们来说下如何实现的吧

function makeFriendly(num) {
    if (num >= 100000000) {
        num = Math.round(num / 10000000) / 10 + '亿'
    } else if (num >= 10000) {
        num = Math.round(num / 1000) / 10 + '万'
    }
    return num;
}

nyroMd.jpg

题目

卡拉兹(Callatz)猜想:

对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……

我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?

输入格式:

每个测试输入包含 1 个测试用例,即给出正整数 n 的值。

输出格式:

输出从 n 计算到 1 需要的步数。

输入样例:

3

输出样例:

5

代码实现:

#!/usr/bin/python
n = input()
i = 0
while not n==1:
    i=i+1
    if n%2==0:
        n=n/2
    else:
        n=(3*n+1)/2
print i

小编使用python2实现的,可能不太适合使用python做算法题,但是仅提供一种解题思路吧,这是第一题,相对来说很简单。

首先我们先来了解下spu和sku这两个的概念。
spu:指的是商品,spu属性就是不会影响到库存和价格的属性, 又叫关键属性,与商品是一对一的关系。
sku:指的是具体规格单品,sku属性就是会影响到库存和价格的属性, 又叫销售属性,与商品是多对一的关系。
我们就拿小米9来举例子
小米9
机身颜色:全息幻彩蓝,深空灰,全息幻彩紫
存储容量:6+128G,8+128G,8+256G
spu就是指商品:小米9
sku就是指具体规格单品:全息幻彩蓝 8+128G等
sku一共有33=9个(机身颜色种类存储容量种类)

下面我们来设计模型
一般情况下我们使用5张表就可以解决基本的需求了:

  • 商品分类表:category
  • 商品表(即:spu表):product
  • 商品规格表(即:sku表):product_specs
  • 属性key表:attribute_key
  • 属性value表:attribute_value

商品分类表:category

  • 该表主要是描述商品的分类。
  • 属性:id,parent_id,name等

商品表(即:spu表):product

  • 存储商品信息
  • 属性:id,category_id,name,attribute_lise等

商品规格表(即:sku表):product_specs

  • 存储商品的具体规格单品,即sku
  • 属性:id,product_id,product_specs等

属性key表:attribute_key

  • 用于存储sku的属性,比如:机身颜色,存储容量

属性value表:attribute_value

  • 用于存储sku的属性值,比如:6+128G,8+128G,8+256G

在我们程序处理金钱的时候,有时候在使用JavaScript的计算的时候很容易出现问题,如果数字很大的话往往会出现显示不好看的问题,所以小编在这里封装了一个格式化金钱的方法。

function formatCurrency(num, withcents) {
    var originnum = num;
    num = num.toString().replace(/\$|\,/g, '');
    if (isNaN(num)) {
        num = "0";
    }
    var sign = (num == (num = Math.abs(num)));
    num = Math.floor(num * 100 + 0.50000000001);
    var cents = num % 100;
    num = Math.floor(num / 100).toString();
    if (cents < 10) {
        cents = "0" + cents;
    }
    for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++) {
        num = num.substring(0, num.length - (4 * i + 3)) + ',' + num.substring(num.length - (4 * i + 3));
    }
    var rs = (((sign) ? '' : '-') + num + '.' + cents);
    if (!withcents && parseInt(originnum) == parseFloat(originnum)) {
        return rs.split('.')[0];
    } else {
        return rs;
    }
}

参数:

  • num:金钱的金额
  • withcents:是否补全分(即小数点后的两位)

  • 企业的目的就是盈利,不是赔钱。
  • 我们期待的未来是进步的。进步可以呈现两种形式。第一,水平进步,也成广泛进步,意思是照搬已取得成就的经验————直接从1跨越到n。水平进步很容易想象,因为我们已经知道了他是什么样。第二,垂直进步,也就是深入进步,意思是要探索新的道路————从0到1的进步。垂直进步较难想象,人们需要尝试从未做过的事。
  • 质疑现有观念,从零开始重新审视自己所从事的业务。
  • 每个垄断企业都是靠解决一个独一无二的问题获得垄断地位;而企业失败原因却相同:他们无法逃脱竞争。

python这门语言真的是很简洁,同时我们要提高我们的编程效率可以使用一些简单的方式,比如我们今天所说的字典推导和集合推导。

集合推导

list1 = [1,2,3,4,5]
list2 = [x+1 for x in list1]

那么list2的值就是:
[2,3,4,5,6]

字典推导

字典推导也是一样的

dict = { x: x % 2 == 0 for x in range(1, 6) }

那么dict的值就是
{1: False, 2: True, 3: False, 4: True, 5: False}

首先我们明白两个命令的作用:

  • git add把文件修改添加到暂存区;
  • git commit提交更改,把暂存区的所有内容提交到当前分支。

从暂存区里面恢复至普通文件(绿字变红字):
如果是撤销所有的已经add的文件:git reset HEAD .
如果是撤销某个文件或文件夹:git reset HEAD -filename

版本回退,也就是回退某个commit:git reset --hard 版本号(版本号就是通过git status获取)
撤销没add文件的修改(红字变无) :git checkout --filename
7.jpg

首先我们说下为什么要获取小程序的formId,如果我们想要给用户发通知(小程序消息)那么该用户必须在7天之内提交过表单,也就是我们必须有7天之内的一个formId。
那么怎么获取formId呢。也很简单,提交表单的时候加上report-submit="{{true}}",也就是:
<form bindsubmit="formSubmit" report-submit="{{true}}">。按钮的类型为form-type="submit"
表单的提交建议还是使用这种,因为这样可以积累一个formId。小编之前为了方便直接写了个请求函数,那样获取不到formId。在取值formId的时候也很简单,只需要在formSubmit这个函数里面,获取就可以
let formId = e.detail.formId
但是在模拟器里面你会发现,你获取到的是the formId is a mock one.是不是很好奇呢。其实在模拟器是获取不到formId,只有真机才可以。

Discuz这个论坛程序是使用php进行开发的,所以迁移也很简单,首先把源码下载下来,然后放在迁移之后的服务器上即可,如果数据库地址,用户名,密码都没有发生改变的话,那就完事了,完成迁移了。是不是很简单呢,但是往往没那么简单,一般迁移数据库经常会改变账号密码,或者是地址,所以需要配置数据库的。网站系统需要修改的位置有主要有两处Discuz和UC-center

  • 路径:/config/config_global.php 这里路径是从网站的根目录里面开始算起的,打开 config_global.php修改里面的账号密码以及服务器地址即可。
  • 路径:/uc_server/data/config.inc.php,打开 config.inc.php 文件修改,修改里面的账号密码以及服务器地址即可。
  • 路径:/config/config_ucenter.php,打开 config_ucenter.php ,修改里面的账号密码以及服务器地址即可。

都是修改

['dbhost'] = '数据库地址';
['dbuser'] = '数据库用户名';
['dbpw'] = '数据库密码';
['dbname'] = '数据库名称';

到这里整个论坛都恢复正常访问了。

微信小程序在用户发布内容的时候往往需要检查发布内容是否违规,是否有敏感词汇,或者图片等有木有问题等等吧。检查这些内容当然可以使用手工进行检测,人工进行审核,但是那样是不是就太麻烦了。所以微信官方也给我们提供了免费的查询接口,记住是免费的。不过目前只能是微信才能使用。下面小编使用python封装的两个方法。

msg_sec_check文本内容检查

import requests
from flask import json, jsonify

def msg_sec_check(content=None, access_token=None):
    '''文字内容检查'''
    if content == None:
        return True
    url = 'https://api.weixin.qq.com/wxa/msg_sec_check?access_token=%s' % access_token
    req = {
        'content': content
    }
    req = json.dumps(req, ensure_ascii=False).encode('utf-8')
    rs = requests.post(url, data=req)
    if json.loads(rs.content).get("errcode")!=0:
        return False
    return True

参数说明:

  • content:要检测的内容
  • access_token:access_token

msg_sec_check图片检测

import requests
from flask import json, jsonify

def msg_sec_check(media=None, access_token=None):
    '''图片检查'''
    if content == None:
        return True
    url = 'POST https://api.weixin.qq.com/wxa/img_sec_check?access_token=%s' % access_token
    req = {
        'media': media
    }
    req = json.dumps(req, ensure_ascii=False).encode('utf-8')
    rs = requests.post(url, data=req)
    if json.loads(rs.content).get("errcode")!=0:
        return False
    return True

参数说明:

  • media:要检测的图片,格式支持PNG、JPEG、JPG、GIF,图片尺寸不超过 750px x 1334px
  • access_token:access_token