鍍金池/ 問(wèn)答/ 人工智能問(wèn)答
蝶戀花 回答

可以的,之前我做項(xiàng)目的時(shí)候,只發(fā)布自己代碼打的jar就可以了,
其他jar單獨(dú)放上去,還有那些靜態(tài)資源一般都比較大,也傳一次不更新就不用再打包了

祈歡 回答

應(yīng)該是redis沒(méi)有啟動(dòng)后臺(tái)運(yùn)行,
去修改redis.conf文件把daemonize設(shè)置為yes,
然后重新啟動(dòng)redis-server和redis.conf

詆毀你 回答

先看書(shū),別用學(xué)習(xí)java、PHP那套做項(xiàng)目方法

耍太極 回答

可以使用 @oraoto 的思路, 寫(xiě)個(gè)lua腳本.
如果lua腳本無(wú)法實(shí)現(xiàn)業(yè)務(wù)邏輯, 可以使用WATCH命令, 或者自己實(shí)現(xiàn)一個(gè)簡(jiǎn)單的鎖, 鎖住這個(gè)鍵.
可以參考Redis實(shí)戰(zhàn)中《4.4 Redis事務(wù)》 和 《6.2分布式鎖》

膽怯 回答

我覺(jué)得你其實(shí)可以就在一個(gè)隊(duì)列里面處理。你說(shuō)的太吃力,指的是哪方面的?是速度慢,還是會(huì)失敗?
我用隊(duì)列處理過(guò)10萬(wàn)多行的數(shù)據(jù),但不是生成文件,而是更新插入到數(shù)據(jù)庫(kù),耗時(shí)大約在1-2小時(shí)

赱丅呿 回答

為什么要弄兩個(gè)spider呢?你完完全全可以在第一個(gè)spider下再寫(xiě)一個(gè)parse_shuping_two啊.


對(duì)你的代碼稍作了修改,可以達(dá)到你的要求(別忘了在settings.py中加上ITEM_PIPELINES = {'ysw.pipelines.YswPipeline': 300}以激活pipeline):
spiders/shuping.py

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request
from ysw.items import YswItem, YswItems
import json
from scrapy import Selector
import re


class ShupingSpider(scrapy.Spider):
    name = 'shuping'
    #allowed_domains = ['www.yousuu.com']
    start_urls = ['http://www.yousuu.com/book/124600']

    #此方法解析評(píng)論第一頁(yè)的一級(jí)書(shū)評(píng)
    def parse(self, response):

        #遍歷每個(gè)一級(jí)書(shū)評(píng),獲得信息
        for r in response.xpath('//*[@id="content"]/div'):
            item = YswItem()

            #發(fā)帖時(shí)間
            item['time'] = r.xpath('string(./div/div/div[1]/div/span[2])').extract_first().strip()

            #獲得贊同數(shù)
            agree = r.xpath('string(./div/div/div[2]/button[1]/span)').extract_first().strip()
            if agree:
                item['agree'] = agree
            else:
                item['agree'] = '0'

            #一級(jí)書(shū)評(píng)內(nèi)容
            item['fir_text'] = r.xpath('string(./div/div/p)').extract_first().replace('\r\n', '').replace(' ', '')

            #二級(jí)評(píng)論數(shù):
            sec_num = r.xpath('string(./div/div/div[2]/button[2]/span)').extract_first().strip()
            if sec_num:
                item['sec_num'] = sec_num

                #獲取二級(jí)評(píng)論url的組成部分cid
                cid = r.xpath('./@cid').extract_first().strip()

                #補(bǔ)全二級(jí)評(píng)論第一頁(yè)的url
                sec_text_url = "http://www.yousuu.com/ajax/getonecomment?render=true&cid={}".format(cid)

                #將每一個(gè)一級(jí)書(shū)評(píng)下的所有二級(jí)書(shū)評(píng)的獲取都交給sp_two.parse
                sec_text_list = []
                yield Request(sec_text_url, meta={'sec_text_list':sec_text_list, 'item':item}, callback=self.parse_shuping_two)
            else:
                item['sec_num'] = '0'
                yield item
        return print('一級(jí)書(shū)評(píng)第一頁(yè)!')

    def parse_shuping_two(self, response):
        items = YswItems()

        # json格式轉(zhuǎn)為python結(jié)構(gòu)數(shù)據(jù)
        jsobj = json.loads(response.body)

        # 從字典中提取html的值,也就是二級(jí)評(píng)論的html格式文本
        html = jsobj['html']

        # 獲得二級(jí)書(shū)評(píng)第一頁(yè)的所有二級(jí)書(shū)評(píng)內(nèi)容,放在列表result中,迭代這個(gè)parse方法時(shí),依次是第2,3,頁(yè)等等
        result = Selector(text=html).xpath('//p/text()').extract()

        # 獲得上一個(gè)Request傳遞過(guò)來(lái)的參數(shù), 第一次是一個(gè)空列表
        sec_text_list = response.meta['sec_text_list']

        # 獲得shuping.parse()傳來(lái)的item
        item = response.meta['item']

        '''每一頁(yè)的二級(jí)評(píng)論內(nèi)容放在一個(gè)列表result中,這個(gè)列表又放在列表sec_text_list中
        二級(jí)書(shū)評(píng)每一頁(yè)的第一個(gè)書(shū)評(píng)都是它的一級(jí)書(shū)評(píng)內(nèi)容,所以從每一頁(yè)新的二級(jí)書(shū)評(píng)從第二個(gè)算起'''
        sec_text_list.extend(result[1:])

        # 判斷二級(jí)評(píng)論是否還有下一頁(yè)
        nextpage = Selector(text=html).xpath('//a[text()="更多回復(fù)"]/@onclick').extract_first()
        if nextpage:
            # 獲得下一頁(yè)的cid
            cid = re.search(r"(.*?)'(.*?)',(.*)", nextpage).group(2)
            # 獲取下一頁(yè)的t
            t = re.search("(.*),(.*?)\)", nextpage).group(2)
            # 組裝二級(jí)評(píng)論下一頁(yè)的url
            next_page_url = "http://www.yousuu.com/ajax/getcommentreply?cid={}&t={}&render=true".format(cid, t)
            # print('next_page_url')
            # 迭代這個(gè)方法繼續(xù)獲得下一頁(yè)的二級(jí)評(píng)論內(nèi)容
            yield Request(next_page_url, meta={'sec_text_list': sec_text_list, 'item': item}, callback=self.parse_shuping_two)
        else:

            items['sec_text'] = sec_text_list
            items['time'] = item['time']
            items['agree'] = item['agree']
            items['sec_num'] = item['sec_num']
            items['fir_text'] = item['fir_text']

            print('已獲取此一級(jí)書(shū)評(píng)的全部二級(jí)書(shū)評(píng)!')

            yield items

pipelines.py

# -*- coding: utf-8 -*-
import os

class YswPipeline(object):
    def process_item(self, item, spider):

        base_dir = os.getcwd()
        file_name = base_dir + '/SP.txt'

        with open(file_name, 'a', encoding='utf-8') as f:
            if item['sec_num'] == '0':
                f.write('時(shí)間:' + item['time'] + '\n'
                    '贊同數(shù):' + item['agree'] + '\n'
                    '二級(jí)評(píng)論數(shù)量:' + item['sec_num'] + '\n'
                    '一級(jí)評(píng)論內(nèi)容:' + item['fir_text'] + '\n\n'
                    )
            else:
                f.write('時(shí)間:' + item['time'] + '\n'
                    '贊同數(shù):' + item['agree'] + '\n'
                    '二級(jí)評(píng)論數(shù)量:' + item['sec_num'] + '\n'
                    '一級(jí)評(píng)論內(nèi)容:' + item['fir_text'] + '\n'
                    '二級(jí)評(píng)論內(nèi)容:' + '\n'.join(item['sec_text']) + '\n\n'
                    )
        return item

不需要什么算法

var myArray = ['1001|電腦','1002|個(gè)人電腦','99|華碩電腦','100|華碩筆記本'];
var id = 100;
var result = [];
for (var i = 0; i < myArray.length; i++) {
    var sec = myArray[i].split('|', 2);
    var theid = parseInt(sec[0]);
    var thename = sec[1];
    result.push(thename);
    if (theid == id) {
        break;
    }
}
console.log(result);

ES6:

let myArray = ['1001|電腦','1002|個(gè)人電腦','99|華碩電腦','100|華碩筆記本'];
let id = 99;
let last = myArray.findIndex(v=> parseInt( v.split('|', 2)[0] ) ===id )
myArray.slice(0, last+1).forEach(v=> alert( v.split('|', 2)[0] ));
冷溫柔 回答

您好,請(qǐng)問(wèn)下這個(gè)問(wèn)題您解決了嗎?我也遇到了這種需求,能否一起探討下?感謝。

解夏 回答

分布式系統(tǒng)需要部署到多節(jié)點(diǎn),除了性能需求外,還是考慮容災(zāi)需求。最簡(jiǎn)單的有 mysql 主備兩節(jié)點(diǎn)部署,復(fù)雜的有兩地三中心部署。

伴謊 回答

postgre, 一對(duì)多用數(shù)組

WITH C AS (SELECT 商品ID,ARRAY_AGG(標(biāo)簽) AS 標(biāo)簽 FROM B GROUP BY 商品ID)
SELECT A.*, 標(biāo)簽 FROM A LEFT JOIN C USING(商品ID) WHERE 你的條件
初念 回答

步驟

*第一步:排序,時(shí)間從近到遠(yuǎn)
*第二步:分割,將數(shù)組分成5個(gè)一組,返回新數(shù)組
*第三步:抽離,將相同時(shí)間抽離出來(lái)組成要求上的數(shù)據(jù)格式

代碼

第一步:排序
    var compare = function (prop) {
        return function (obj1, obj2) {
            var val1 = obj1[prop];
            var val2 = obj2[prop];
            if (!isNaN(Number(val1)) && !isNaN(Number(val2))) {
                val1 = Number(val1);
                val2 = Number(val2);
            }
            if (val1 < val2) {
                return 1;
            } else if (val1 > val2) {
                return -1;
            } else {
                return 0;
            }
        }
    }
    //用法
    arr.sort(compare("time"))
第二步:分割
//分割
    Array.prototype.chunk = function(size) {
        var array = this;
        const length = array.length 
        if (!length || !size || size < 1) {
            return []
        }
        
        let index = 0 
        let resIndex = 0 

        let result = new Array(Math.ceil(length / size))
        while (index < length) {
            result[resIndex++] = array.slice(index, (index += size))
        }
        return result
    }
    //用法
    arr.chunk(5)
第三步:抽離
    //抽離
    function sortArr(arr, str) {
        var _arr = [],
            _t = [],
            // 臨時(shí)的變量
            _tmp;

        // 按照特定的參數(shù)將數(shù)組排序?qū)⒕哂邢嗤档门旁谝黄?        arr = arr.sort(function(a, b) {
            var s = a[str],
                t = b[str];

            return s < t ? -1 : 1;
        });

        if ( arr.length ){
            // _tmp = arr[0][str];
            _tmp = new Date(arr[0][str]).getFullYear()
        }
        // 將相同類別的對(duì)象添加到統(tǒng)一個(gè)數(shù)組
        for (let i=0;i<arr.length;i++) {
            if(new Date(arr[i][str]).getFullYear()===_tmp){
                // if ( arr[i][str] === _tmp ){
                _t.push( arr[i] );
            } else {
                _tmp = new Date(arr[i][str]).getFullYear();
                _arr.push( _t );
                _t = [arr[i]];
            }
        }
        // 將最后的內(nèi)容推出新數(shù)組
        _arr.push(_t);
        return _arr;
    }
    //用法,這里僅對(duì)一維數(shù)組使用
    sortArr( arr, 'time')
    //我將數(shù)據(jù)一二步處理后開(kāi)始二叉數(shù)循環(huán)
    var cc = arr.sort(compare("time")).chunk(5)
    var _cc = []
    for(let i=0;i<cc.length;i++){
        //抽離
        var _datas=sortArr( cc[i], 'time')
        //根據(jù)所給數(shù)據(jù)結(jié)構(gòu)進(jìn)行賦值
        _cc.push({section:i+1, sectionDatas:[]})
        for(let o=0;o<_datas.length;o++){
            _cc[i].sectionDatas.push({
                data:new Date(_datas[o][0].time).getFullYear(),
                datas:[]
            })
        }
        for(let p=0;p<_cc[i].sectionDatas.length;p++){
            _cc[i].sectionDatas[p].datas=sortArr(cc[i], 'time')[p]
        }
    }

最近剛研究的函數(shù)式編程

功力不夠,謹(jǐn)慎使用
    class Functor {
        constructor(data){
            this.data = data
        }

        map(data){
            return new Functor(data)
        }

        //排序
        compare(prop) {
            var result = this.data.sort(function (obj1, obj2) {
                var val1 = obj1[prop];
                var val2 = obj2[prop];
                if (!isNaN(Number(val1)) && !isNaN(Number(val2))) {
                    val1 = Number(val1);
                    val2 = Number(val2);
                }
                if (val1 < val2) {
                    return 1;
                } else if (val1 > val2) {
                    return -1;
                } else {
                    return 0;
                }
            })
            return this.map(result)
        }

        //分割
        chunk(size) {
            var array = this.data;
            //獲取數(shù)組的長(zhǎng)度,如果你傳入的不是數(shù)組,那么獲取到的就是undefined
            const length = array.length
            //判斷不是數(shù)組,或者size沒(méi)有設(shè)置,size小于1,就返回空數(shù)組
            if (!length || !size || size < 1) {
                return []
            }
            //核心部分
            let index = 0 //用來(lái)表示切割元素的范圍start
            let resIndex = 0 //用來(lái)遞增表示輸出數(shù)組的下標(biāo)

            //根據(jù)length和size算出輸出數(shù)組的長(zhǎng)度,并且創(chuàng)建它。
            let result = new Array(Math.ceil(length / size))
            //進(jìn)行循環(huán)
            while (index < length) {
                //循環(huán)過(guò)程中設(shè)置result[0]和result[1]的值。該值根據(jù)array.slice切割得到。
                result[resIndex++] = array.slice(index, (index += size))
            }
            //輸出新數(shù)組
            // return result
            return this.map(result)
        }

        //抽離
        sortArr(arr, str) {
            var _arr = [],
                _t = [],
                // 臨時(shí)的變量
                _tmp;

            // 按照特定的參數(shù)將數(shù)組排序?qū)⒕哂邢嗤档门旁谝黄?            arr = arr.sort(function(a, b) {
                var s = a[str],
                    t = b[str];

                return s < t ? -1 : 1;
            });

            if ( arr.length ){
                // _tmp = arr[0][str];
                _tmp = new Date(arr[0][str]).getFullYear()
            }
            // 將相同類別的對(duì)象添加到統(tǒng)一個(gè)數(shù)組
            for (let i=0;i<arr.length;i++) {
                if(new Date(arr[i][str]).getFullYear()===_tmp){
                    // if ( arr[i][str] === _tmp ){
                    _t.push( arr[i] );
                } else {
                    _tmp = new Date(arr[i][str]).getFullYear();
                    _arr.push( _t );
                    _t = [arr[i]];
                }
            }
            // 將最后的內(nèi)容推出新數(shù)組
            _arr.push(_t);
            return _arr;
        }

        //轉(zhuǎn)指定json格式
        dataToJSON(){
            var _json = []
            var _this = this;
            this.data.forEach(function(item,i){
                var _datas=_this.sortArr( item, 'time')
                _json.push({section:i+1, sectionDatas:[]})
                for(let o=0;o<_datas.length;o++){
                    _json[i].sectionDatas.push({
                        data:new Date(_datas[o][0].time).getFullYear(),
                        datas:[]
                    })
                }
                for(let p=0;p<_json[i].sectionDatas.length;p++){
                    _json[i].sectionDatas[p].datas=_datas[p]
                }
            })
            return _json
        }
    }
    Functor.of = function(data){
        return new Functor(data)
    }
使用方法
Functor.of(a).compare("time").chunk(5).dataToJSON()    //返回一個(gè)新的值,不改變?cè)瓉?lái)數(shù)據(jù)
青黛色 回答
  1. code怎么來(lái)的?是不是和邀請(qǐng)人ID有關(guān)系
  2. nodejs直接獲取查詢字符串得到code然后根據(jù)第1步得到邀請(qǐng)人ID
耍太極 回答

鍵值1 也浪費(fèi)不了多少吧
一般key要加個(gè)前綴以區(qū)分
例如:product_, order_

我甘愿 回答

先考慮000000 ~ 999999(假設(shè)不忽略前面的 0) 一共一百萬(wàn)個(gè)數(shù),這一百萬(wàn)個(gè)數(shù)一共有10^6 * 6 個(gè)數(shù)字,10個(gè)數(shù)字都是對(duì)稱的,因此,一共有10^6*6/10 = 6*10^5 個(gè) 0。 但是對(duì)于不足 6 位的數(shù)我們要去掉第六位上的 0, 這一共有 10^5 個(gè)數(shù),對(duì)于不足 5 位的數(shù)我們要去掉第五位上的 0, 這一共有 10^4 個(gè)數(shù)。。。。。
最后還要加上 100萬(wàn)的六個(gè)0。
因此6*10^5 - 10^5 - 10^4 ... - 10 - 1 + 6 = 488895個(gè)

按@Masterton 個(gè)的 PHP 轉(zhuǎn)個(gè) JS 是

var a=[], i;
for(i=0; i< 1000000; i++) {a[i] = i+1;}
num = a.join('').replace(/[1-9]/g,'').length;

結(jié)果也是488895

半心人 回答

在問(wèn)這個(gè)問(wèn)題之前,我還不是很了解 nn.module 這個(gè)類,與 pytorch 的一些基礎(chǔ)知識(shí)

在pytorch的 nn.Module 類中,初始化 __init__ 的時(shí)候傳入的是各個(gè)層的特征數(shù)。
以我拿的分類器為例子來(lái)說(shuō),這個(gè)分類器很簡(jiǎn)單,網(wǎng)絡(luò)中沒(méi)有太多的層次,就是做了一個(gè)線性回歸的操作。傳入的
i_char 為輸入特征個(gè)數(shù),o_labels 為輸入特征個(gè)數(shù)。比如,我的特征有密文類型和密文長(zhǎng)度,密文類型產(chǎn)生的特征(先不算符號(hào))有26 + 26 + 10 = 62個(gè),這時(shí)候我還想要添加1個(gè)密文長(zhǎng)度的特征,這時(shí)候就特征就有63個(gè)。

每次調(diào)用這個(gè)類也就是它的 __call__ 的時(shí)候,這個(gè)函數(shù)會(huì)調(diào)用 forward 這個(gè)函數(shù),并給這個(gè)函數(shù)傳入我們調(diào)用 model 的時(shí)候傳入的內(nèi)容。這個(gè)傳入內(nèi)容就是特征的相關(guān)內(nèi)容。

傲寒 回答

number = number - i;這段代碼有問(wèn)題,
需要定義一個(gè)變量,

int temp=number;
temp = temp - i;

就可以了

孤酒 回答
Request header field timestamp is not allowed by Access-Control-Allow-Headers in preflight response.
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, timestamp ");
陪我終 回答

你說(shuō)的應(yīng)該是vue-cli生成的配置文件上的proxytable
1.事實(shí)上在你運(yùn)行的時(shí)候,會(huì)配置啟動(dòng)一個(gè)node服務(wù),這個(gè)服務(wù)的作用1是靜態(tài)文件服務(wù),讓你可以訪問(wèn)到html/js等文件包括監(jiān)聽(tīng)文件變動(dòng)等,2是啟動(dòng)一個(gè)http代理,你js發(fā)送的請(qǐng)求會(huì)請(qǐng)求到這個(gè)服務(wù)A,由服務(wù)A代理到服務(wù)B,而服務(wù)A和靜態(tài)文件服務(wù)器是同源的,并不影響同源策略。
2.瀏覽器是沒(méi)有必要設(shè)置CORS的,服務(wù)器設(shè)置CORS就是為了告知瀏覽器允許訪問(wèn)我的源,不是跟我同源的,要在瀏覽器接受到響應(yīng)后拋出錯(cuò)誤。