可以的,之前我做項(xiàng)目的時(shí)候,只發(fā)布自己代碼打的jar就可以了,
其他jar單獨(dú)放上去,還有那些靜態(tài)資源一般都比較大,也傳一次不更新就不用再打包了
sudo apt-get install python3.6-tk
應(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]
}
}
功力不夠,謹(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 也浪費(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ò)誤。
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
北大青鳥(niǎo)中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過(guò)二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。