鍍金池/ 問(wèn)答
影魅 回答

函數(shù)或者是程序,本質(zhì)都是包含了對(duì)問(wèn)題的處理過(guò)程。

1.首先, 明確要做什么? 有什么?

一個(gè)數(shù)組, 進(jìn)行計(jì)算, 打印結(jié)果。

2.其次, 可以抽出四個(gè)函數(shù)。

getA() getAverage() getCount() print()

3.最后, 用簡(jiǎn)潔的邏輯處理問(wèn)題。

main() {

A = getA()

ave = getAverage( A )

count = getCount(A, ave)

print(ave)

print(count)

}

寫(xiě)程序不要總想一次做好所有事情。

思考一下, 應(yīng)該寫(xiě)的出。

脾氣硬 回答

推薦一個(gè)這個(gè)js插件,應(yīng)該可以用到小程序里的。
http://code.ciaoca.com/javasc...

萌小萌 回答

經(jīng)過(guò)一個(gè)下午的折騰,上周五還是發(fā)現(xiàn)出現(xiàn)該異常情況的原因。概括來(lái)說(shuō)還是中文轉(zhuǎn)編碼的問(wèn)題,即utf-8轉(zhuǎn)gbk出現(xiàn)的小部分行缺少空格或者雙引號(hào)的問(wèn)題。
出現(xiàn)問(wèn)題的原因:
在進(jìn)行導(dǎo)出的過(guò)程中,接收其他程序傳過(guò)來(lái)的數(shù)組參數(shù),均為utf-8編碼,我這邊在調(diào)用fwrite或者fputcvs寫(xiě)入文件的過(guò)程中并沒(méi)有進(jìn)行 iconv("UTF-8", "GB2312//IGNORE", $header),而是將文件保存在了 export目錄下,然后由vuejs做的后臺(tái)調(diào)用位于同application下的一個(gè)共用類(lèi)的 export方法,該方法是這樣的:

public function export()
{
    $file = \Request::get('file');
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename=export.csv');
    header('Cache-Control: max-age=0');
    $contents = file_get_contents(\Env::get('runtime_path') . '/export/' . $file);
    echo iconv("UTF-8", "GB2312//IGNORE", $contents);
    @unlink(RUNTIME_PATH . '/export/' . $filename);
    exit;
}

問(wèn)題就出在 echo iconv("UTF-8", "GB2312//IGNORE", $contents); 這句代碼上面,這里看到是對(duì)傳入的整個(gè)文件進(jìn)行轉(zhuǎn)編碼的,這里未進(jìn)行測(cè)試到底多少行的數(shù)據(jù)會(huì)出現(xiàn)缺少逗號(hào)引號(hào)的問(wèn)題。
最終的解決思路是,把共用類(lèi)中對(duì)整個(gè)文件的轉(zhuǎn)編碼放到寫(xiě)入方法中,逐條轉(zhuǎn)編碼就解決了該問(wèn)題。

更改后的代碼:

public static function createCsv($data, $header = [], $filename = '')
{
    // 參數(shù)判斷
    $data = is_object($data) ? $data->toArray() : $data;
    $header = is_array($header) ? $header : [];
    $filename = (1 > strlen(trim($filename))) ? 'csv-' : trim($filename);
    if (empty($data)) {
        return false;
    }

    // 文件名/目錄
    $filename = $filename . date("YmdHis", time()) . rand(1000, 9999) . ".csv";
    $dir = Env::get('runtime_path') . '/export/';
    if (!is_dir($dir) && !mkdir($dir)) {
        return false;
    }

    // 打開(kāi)文件指針資源
    $handle = fopen($dir . $filename, 'w+');
    if (!$handle) {
        return false;
    }

    // 寫(xiě)入文件header頭
    if (!empty($header)) {
        foreach ($header as $key => $item) {
            $header[$key] = iconv("UTF-8", "GB2312//IGNORE", $item);
        }
        $res = fputcsv($handle, $header);
        if (!$res) {
            return false;
        }
    }

    // 判斷header是索引數(shù)組還是關(guān)聯(lián)數(shù)組
    $is_assoc = array_keys($header) !== range(0, count($header) - 1);

    // 寫(xiě)入文件內(nèi)容
    $frequency = 0; // 頻率
    $limit = 100000;
    foreach ($data as $datum) {
        $frequency++;
        if ($limit == $frequency) {
            // 刷新輸出buffer
            ob_flush();
            flush();
            $frequency = 0;
        }
        // 如果是關(guān)聯(lián)數(shù)組,則獲取內(nèi)容中和頭部key相對(duì)應(yīng)的值
        if ($is_assoc) {
            $csv = "";
            foreach(array_keys($header) as $item) {
                $datum[$item] = iconv("UTF-8", "GB2312//IGNORE", $item);
                $val = str_replace('"', '""', $datum[$item]); // 將單個(gè)雙引號(hào)替換為兩個(gè)雙引號(hào)
                $csv .= '"' . $val . '",'; // 為每個(gè)字符增加雙引號(hào),并添加逗號(hào)分割符
            }
            $csv = substr($csv, 0, -1); // 去掉每行最后一個(gè)逗號(hào)
            $csv .= "\n"; // 添加換行符
            $res = @fwrite($handle, $csv);
        } else {
            $res = fputcsv($handle, $datum);
        }

        if (!$res) {
            return false;
        }
    }

    // 關(guān)閉指針資源
    fclose($handle);
    return Url::build('erp/Common/export', 'file=' . $filename);
}


public function export()
{
    $file = \Request::get('file');
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename=export.csv');
    header('Cache-Control: max-age=0');
    $contents = file_get_contents(\Env::get('runtime_path') . '/export/' . $file);
    echo $contents;
    exit;
}

調(diào)用步驟:

先調(diào)用createCsv生成文件,再調(diào)用export下載。

———————————————————————分割線(xiàn)——————————————————————

另外一種解決思路:

csv文件直接存儲(chǔ) UTF-8 編碼:
即不需要進(jìn)行 iconv 轉(zhuǎn)編碼,這樣會(huì)有個(gè)小問(wèn)題就是MacOS中的Excel無(wú)法自動(dòng)識(shí)utf-8編碼,中文會(huì)出現(xiàn)亂碼的情況。

原因:

Excel在讀取csv的時(shí)候是通過(guò)讀取文件頭上的bom來(lái)識(shí)別編碼的,如果文件頭無(wú)bom信息,則默認(rèn)按照unicode編碼讀取。(這個(gè)bom是微軟自己定義的一種文件頭部協(xié)定,顧名思義存儲(chǔ)在文件頭部,存儲(chǔ)內(nèi)容就是標(biāo)識(shí)文件編碼的信息。)而我們生成csv的平臺(tái)不一定遵循微軟的bom協(xié)議,導(dǎo)致如果輸出非unicode編碼的csv文件(例如utf-8),并且沒(méi)有生成bom信息的話(huà),Excel自動(dòng)按照unicode編碼讀取,就會(huì)出現(xiàn)亂碼問(wèn)題了。

作者:李蛟 鏈接:https://www.zhihu.com/questio...
來(lái)源:知乎 著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

根據(jù)知乎查到的答案,原來(lái)是這里未遵循微軟的bom協(xié)議。原因找到了,解決方案就能出了。

解決方法:
fopen 方法下寫(xiě)入bom頭,這里簡(jiǎn)單寫(xiě)一下步驟

function createCsv($filename, $header, $data) {
    $handle = fopen($filename, 'w+');
    // 添加BOM,標(biāo)識(shí)為UTF-8格式
    fwrite($handle, chr(0xEF).chr(0xBB).chr(0xBF));
    // 寫(xiě)入頭部
    fputcsv($handle, $header);
    // 逐行寫(xiě)入內(nèi)容
    foreach ($data as $datum) {
        fputcsv($handle, $datum);
    }
    // 關(guān)閉指針資源
    fclose($handle);
}

另外再補(bǔ)充一下 Bom 簡(jiǎn)介

  • 在UCS 編碼中有一個(gè)叫做”ZERO WIDTH NO-BREAKSPACE”的字符,它的編碼是FEFF。
  • FFFE在UCS中是不存在的字符,所以不應(yīng)該出現(xiàn)在實(shí)際傳輸中。
  • UCS規(guī)范建議我們?cè)趥鬏斪止?jié)流前,先傳輸字符”ZERO WIDTH NO-BREAK SPACE”。
  • 這樣如果接收者收到FEFF,就表明這個(gè)字節(jié)流是Big-Endian的;
  • 如果收到FFFE,就表明這個(gè)字節(jié)流是Little-Endian的。
  • 因此字符”ZERO WIDTH NO-BREAK SPACE”又被稱(chēng)作BOM。
  • UTF-8不需要BOM來(lái)表明字節(jié)順序,但可以用BOM來(lái)表明編碼方式。
  • 字符”ZERO WIDTH NO-BREAK SPACE”的UTF-8編碼是EF BB BF。
  • 所以如果接收者收到以EF BB BF開(kāi)頭的字節(jié)流,就知道這是UTF-8編碼了。
  • Windows就是使用BOM來(lái)標(biāo)記文本文件的編碼方式的。

該內(nèi)容來(lái)自 http://blog.csdn.net/chaozhi_... 這篇博客

解夏 回答

在同步器中的節(jié)點(diǎn),始終是有順序的。非公平指的是沒(méi)有進(jìn)入同步隊(duì)列的線(xiàn)程與首節(jié)點(diǎn)的后繼節(jié)點(diǎn)中的線(xiàn)程非公平,也有可能是首節(jié)點(diǎn)中的線(xiàn)程和首節(jié)點(diǎn)后繼節(jié)點(diǎn)中的線(xiàn)程非公平競(jìng)爭(zhēng),比如首節(jié)點(diǎn)中的線(xiàn)程釋放鎖后又立即去獲取鎖。
體現(xiàn)在ReentrantLock代碼中話(huà),就是NonfairSynctryAcquire實(shí)現(xiàn)和FairSynctryAcquire實(shí)現(xiàn)是不一樣的。

static final class NonfairSync extends Sync {
        。。。。。。
        protected final boolean tryAcquire(int acquires) {
            return nonfairTryAcquire(acquires);
        }
        。。。。
}
final boolean nonfairTryAcquire(int acquires) {
            final Thread current = Thread.currentThread();
            int c = getState();
            if (c == 0) {
                if (compareAndSetState(0, acquires)) {
                    setExclusiveOwnerThread(current);
                    return true;
                }
            }
            else if (current == getExclusiveOwnerThread()) {
                int nextc = c + acquires;
                if (nextc < 0) // overflow
                    throw new Error("Maximum lock count exceeded");
                setState(nextc);
                return true;
            }
            return false;
}
static final class FairSync extends Sync {
        protected final boolean tryAcquire(int acquires) {
            final Thread current = Thread.currentThread();
            int c = getState();
            if (c == 0) {
                if (!hasQueuedPredecessors() &&
                    compareAndSetState(0, acquires)) {
                    setExclusiveOwnerThread(current);
                    return true;
                }
            }
            else if (current == getExclusiveOwnerThread()) {
                int nextc = c + acquires;
                if (nextc < 0)
                    throw new Error("Maximum lock count exceeded");
                setState(nextc);
                return true;
            }
            return false;
        }
}
public final boolean hasQueuedPredecessors() {
        // The correctness of this depends on head being initialized
        // before tail and on head.next being accurate if the current
        // thread is first in queue.
        Node t = tail; // Read fields in reverse initialization order
        Node h = head;
        Node s;
        return h != t &&
            ((s = h.next) == null || s.thread != Thread.currentThread());
}

FairSynctryAcquire方法,多了一個(gè)!hasQueuedPredecessors()判斷。如果同步隊(duì)列為空,或者只有首節(jié)點(diǎn),或者首節(jié)點(diǎn)的后繼節(jié)點(diǎn)中的線(xiàn)程是當(dāng)前線(xiàn)程,那么hasQueuedPredecessors()false,!hasQueuedPredecessors()為true,調(diào)用tryAcquire的當(dāng)前線(xiàn)程就可以去獲取同步狀態(tài)。

何蘇葉 回答

一個(gè)有效的 lxml.py Python 文件,實(shí)際上是一個(gè) lxml 模塊,在模塊內(nèi)有定義 etree 等子模塊。

1: 使用時(shí),如果需要用到 lxml 模塊內(nèi)的所有子模塊使用,需要使用下面的語(yǔ)法:

import lxml

lxml.etree

2:如果僅僅需要使用 lxml etree 模塊,直接使用下面的導(dǎo)入模塊語(yǔ)法就行了:

from lxml import etree 

etree
柒喵 回答

.env里面的配置QUEUE_DRIVER就是指定所使用的driver,如果你用的rabbitmq,則QUEUE_DRIVER=rabbitmq,本地調(diào)試時(shí),可以改成QUEUE_DRIVER=sync,這表示同步處理,而不是異步使用rabbitmq處理,這樣就可以直接使用xdebug斷點(diǎn)調(diào)試了。

一般不會(huì)內(nèi)存泄露
android中Application除非被殺死,否則是不會(huì)退出的
你可以嘗試創(chuàng)建一個(gè) hello world項(xiàng)目
然后back或者finish Activity
然后查看AS,你會(huì)發(fā)現(xiàn) 你的HelloWorld項(xiàng)目還存在,并沒(méi)有關(guān)閉

尐懶貓 回答
  1. vuex 主要是用于項(xiàng)目組件之間的通信、數(shù)據(jù)交互;使用vuex之后,各種狀態(tài)都能在一個(gè)地方控制,能進(jìn)行統(tǒng)一管理,非常方便;
  2. localStorage 可以解決 vuex 無(wú)法保存的問(wèn)題;localStorage 只能存字符串,所以在 localStorage 存起來(lái)要序列化(類(lèi)型轉(zhuǎn)換),取出來(lái)又要,很麻煩;
  3. 一個(gè)負(fù)責(zé)通信,一個(gè)負(fù)責(zé)存儲(chǔ);其實(shí)不影響, token 的話(huà)就保存在 localStorage 就好
痞性 回答

你先把數(shù)組拿出來(lái),進(jìn)行增刪操作完之后再進(jìn)行setData

卟乖 回答

你說(shuō)的這種情況在刷新的時(shí)候也存在,比如跳轉(zhuǎn)到/list下,刷新頁(yè)面就無(wú)法顯示還報(bào)錯(cuò)。

試一下這種方式:

render(
  <BrowserRouter>
    <Switch>
      <Route exact path="/" component={Index}/>
      <Route exact path="/list" component={List}/>
    </Switch>
  </BrowserRouter>,
  document.getElementById('container')
);

怎么了沒(méi)毛病,你是怎么理解的,你這代碼跟vue什么關(guān)系

柚稚 回答

np.sum(np.array(range(10000000), dtype=float))
numpy底層用c優(yōu)化的,應(yīng)對(duì)任何數(shù)學(xué)問(wèn)題,默認(rèn)的dtype是int32,當(dāng)然溢出來(lái)啦

一般地,mongodb會(huì)自動(dòng)插入一個(gè)唯一的_id字段作為pk

如果真的要自增,可以參考 https://docs.mongodb.com/v3.0...

簡(jiǎn)單來(lái)講,就是:

  1. 建立一個(gè)自增計(jì)數(shù)器
  2. 創(chuàng)建一個(gè)函數(shù),使用findAndModify更新計(jì)數(shù)器(在update時(shí)用$inc進(jìn)行自增)
  3. 插入記錄時(shí),使用該函數(shù)獲得自增的ID

至于你說(shuō)的定時(shí)任務(wù),抱歉我沒(méi)看懂

凝雅 回答

靜態(tài)編譯刪除不了,動(dòng)態(tài)的去 ext 目錄覆蓋就行

遺莣 回答

同問(wèn) webstorm可以找到定義 同樣的代碼vscode卻不能

疚幼 回答

單頁(yè)面應(yīng)用應(yīng)該放到nginx或者apache、tomcat等web代理服務(wù)器中。