鍍金池/ 問答/ Linux問答
久不遇 回答

使用線程執(zhí)行 demux_thread 任務(wù)時(shí),主線程要等待它返回(可用 SDL_WaitThread()),否則 main() 函數(shù)返回時(shí)將強(qiáng)制結(jié)束其他線程。

短嘆 回答

正好碰到了這個(gè)問題,我也試了很多方法,最后轉(zhuǎn)變了思路,你看能不能用上。
如果你是為了對(duì)外(不是nginx和tomcat間)的安全,那么nginx已經(jīng)替你認(rèn)證過了,tomcat就不用了。
你取證書是為了取用戶名的話,可以在nginx里直接取到$ssl_client_s_dn ,返回建立的SSL連接中客戶端證書的DN主題字段,里面是包含用戶名的,你直接把這個(gè)存到header里,在后面的應(yīng)用服務(wù)器直接取Header就行了。

只愛你 回答
virt 7070m
你的java程序能訪問的內(nèi)存空間地址, 包括代碼,數(shù)據(jù),共享庫,交換頁等等, 這是一個(gè)虛擬映射, 并不是所有地址都有相應(yīng)的物理內(nèi)存對(duì)應(yīng), 所以可以是大于物理內(nèi)存的.

res 2.5g
這個(gè)可能和你的java啟動(dòng)參數(shù)有關(guān), 如 -Xmx2500m或比這個(gè)還大, 是程序占用的非交換的駐留內(nèi)存.

shr 10m
占用內(nèi)存的可共享部分,可能與其他進(jìn)行共用.

%mem 4.0
占用內(nèi)存的百分比

推測 2.5g/4%=62.5~你的機(jī)器有64G的物理內(nèi)存

至于代碼

 List list = new ArrayList<String>(1000);
 list.add("abcd");  

可以這樣理解內(nèi)存使用
new ArrayList<String>(1000); 僅僅是分配并初始化了一個(gè)ArrayList對(duì)象. 并初始化的內(nèi)部的數(shù)組對(duì)象

我們看一下JDK6的源碼

127     public ArrayList(int initialCapacity) {
128         super();  //調(diào)用AbstractList的默認(rèn)構(gòu)造函數(shù),里面什么也沒有做
129         if (initialCapacity < 0)
130             throw new IllegalArgumentException("Illegal Capacity: "+
131                                                initialCapacity);
132         this.elementData = new Object[initialCapacity]; //創(chuàng)建一個(gè)數(shù)組對(duì)象
133     }

真正消耗內(nèi)存的是 new Object[initialCapacity], 大約是initialCapacity*4個(gè)字節(jié), 算下來也不多.
list.add("abcd")增加了一個(gè)string對(duì)象加對(duì)象內(nèi)部字符和屬性(長度等)占用的內(nèi)存.

可以用下面的小程序完成對(duì)內(nèi)存使用的檢驗(yàn)

import java.util.*;

public class test{

        public static void print(){

        long total = Runtime.getRuntime().totalMemory();
        long used  = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
        System.out.println("total="+total+" used="+used);

    }

    public static void main(String[] args)throws Exception {
         print(); //(1)
         List<String> list = new ArrayList<>(1000000);
         print(); //(2)
         Thread.sleep(1000);
         int i=0;
         while(i++<1000000){
          list.add(i+"test1234567890");
         }
         print();//(3)

         Thread.sleep(10000);  
    }
} 

代碼里的Thread.sleep的作用是為了占用內(nèi)存時(shí)間長一下,這樣可以用終端指令進(jìn)行監(jiān)控

top -p `pgrep java`

上面的程序執(zhí)行后輸出的結(jié)果為

total=55574528 used=608336        (1)
total=55574528 used=4608352       (2)
total=204472320 used=85200512     (3)

上面(2)-(1) 4608352-608336= 4000016
對(duì)應(yīng)的是ArrayList對(duì)象占16字節(jié), elementData數(shù)組每個(gè)占4字節(jié),共1Mx4=4M內(nèi)存.
放入字符串后, 85200512-4608352=80592160, 大概我的每個(gè)測試字符串占用了80字節(jié),實(shí)際字符平均20個(gè), 每個(gè)字符占用的也是4個(gè)字節(jié).

-----實(shí)踐出真知-----

咕嚕嚕 回答
if ($host = "www.xxx.com")

完全沒必要判斷$host,這個(gè)應(yīng)該在server_name匹配

      index index.html;

index指令不能放到if里面,應(yīng)該在server或者location塊就配置好全局的index

   if ($url = '/mobile') {
      root /var/www/mobile/dist;
    }
    if ($url = '/ipad') {
       root /var/www/pad/dist;
    }

root可以放在location里的if
但你這里完全沒必要用if,使用locationalias即可

    location /mobile/ {
       alias /var/www/mobile/dist/;
    }
    location /ipad/ {
       alias /var/www/pad/dist/;
    }

似乎每一條配置指令都用錯(cuò)了……

清夢 回答

抓包工具:fiddler,charles;
1.如果是https請求,需要設(shè)置代理,在手機(jī)上安裝相關(guān)軟件的證書,以中間人攻擊的方式,能夠看到http傳輸?shù)臄?shù)據(jù);
2.抓包開始,請清除緩存,不少app為了節(jié)約加載時(shí)間,一些數(shù)據(jù)會(huì)緩存。
3.盡量避免其他軟件在抓包時(shí)的干擾,后臺(tái)清理掉,或者在抓包軟件中設(shè)置只針對(duì)某一個(gè)域名抓??;

兮顏 回答

git add -> git commit -> git pull -> git push

葬愛 回答

@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })改成@Consumes("application/json")

冷眸 回答

你把 sport 22改為 dport 22

脾氣硬 回答

類似這樣

#!/bin/bash

ssh root@192.2.1.160 <<'ENDSSH'
cd /home/app/scripts/
sh -x arr.sh 'test'
ENDSSH

你的就是這樣

#!/bin/bash

ssh root@MachineB <<'ENDSSH'
cd xxx
sh -x local_script.sh -ub
ENDSSH
詆毀你 回答

由服務(wù)器與瀏覽器的時(shí)間差引起.

假設(shè)服務(wù)器在 A 時(shí)間返回內(nèi)容, 那么返回的 HTTP 頭類似這樣:

Date: A
Cache-Control: max-age=60

可知 css 的有效時(shí)間窗口是 A ~ A+60, 瀏覽器接到時(shí)(忽略網(wǎng)絡(luò)傳輸?shù)绕渌臅r(shí))為 A + 100 時(shí)間, 它通過計(jì)算 <Date> + <max-age> 得知 css 內(nèi)容已經(jīng)過期, 因?yàn)?A + 100 > A + 60, 因此會(huì)重新驗(yàn)證內(nèi)容(If-Modified-Since, If-None-Match).

下面是個(gè)模擬的 HTTP 服務(wù)器, 你可以自由修改返回頭去測試瀏覽器反應(yīng)

// 運(yùn)行模擬服務(wù)器:
//  1. 保存成文件 "demo-server.go"
//  2. 下載 golang, https://golang.org/dl/
//  3. 打開命令行, 運(yùn)行 "go run demo-server.go"
//  4. 打開瀏覽器, 訪問 http://localhost:8080/
package main

import (
    "fmt"
    "log"
    "net/http"
    "time"
)

func setHeader(w http.ResponseWriter, h map[string]string) {
    for key, value := range h {
        w.Header()[key] = []string{value}
    }
}

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, `
        <html>
          <head>
            <link href='/cache.css' rel='stylesheet' type='text/css' />
          </head>
          <body>
            <h2>default page</h2>
          </body>
        </html>
        `)
    })

    http.HandleFunc("/cache.css", func(w http.ResponseWriter, r *http.Request) {
        setHeader(w, map[string]string{
            "Cache-Control": "public, max-age=130",
            "ETag":          "e123456789",
            "Content-Type":  "text/css",
            // 服務(wù)器時(shí)間慢 100 秒
            "Date": time.Now().Add(time.Second * -100).UTC().Format(http.TimeFormat),
        })
        fmt.Fprintf(w, "h2 {color: red}")
    })

    log.Fatal(http.ListenAndServe("127.0.0.1:8080", nil))
}
毀憶 回答

不知道你了解 C 里面的內(nèi)存對(duì)齊不?這里是同樣的道理

因?yàn)槟愕慕Y(jié)構(gòu)了出現(xiàn)了 float64,導(dǎo)致整個(gè)結(jié)構(gòu)里的成員都要以 64 位對(duì)齊(也就是 8 字節(jié))

對(duì)于 A,X Y 和 Z 各占 8 字節(jié),也就是 24 字節(jié)
對(duì)于 B,Y 占 8 字節(jié),而 X 和 Z 能在一個(gè) 8 字節(jié)的空間中放下,所以它們共用 8 字節(jié)

結(jié)論就顯而易見了吧

你可以使用 這個(gè)網(wǎng)站 來查看一個(gè)結(jié)構(gòu)體內(nèi)存布局

怣人 回答
  1. phpStudy我覺得比較適合的場景,是本地測試環(huán)境,放服務(wù)器上我覺得還是不太適合,看起來并沒有比WAMP更靠譜
  2. 做運(yùn)維,看起來越輕松的,坑就越大。比如phpStudy很傻瓜吧?面板還是中文的,這不鬧脾氣趴窩了不是?并且由于集成度高,你都不好確定是哪里出的問題……當(dāng)然我承認(rèn)這點(diǎn)有失偏頗,但是阿里云上,同樣的低配,win系就得1G內(nèi)存起,Linux512就給跑,這總說明問題吧?
  3. ……選Linux的話,其實(shí)也不難,首先市場里配好的鏡像一堆,直接選鏡像再按教程跑遍基礎(chǔ)配置,快的很。倒是win系這邊,也就占個(gè)圖形化的優(yōu)勢,配起來并沒容易很多,反而抵消掉圖形的這點(diǎn)優(yōu)勢了。
  4. 好像這個(gè)回答并沒有什么幫助……好吧那么建議題主試試WAMP,或者干脆就用IIS算了。我記得好像微軟自己也有個(gè)matrix什么的套件吧?如果還能搜到也可以試試,畢竟是它們自家的。
話寡 回答
  1. grep 需要添加參數(shù) --line-buffered,才能過濾 continuous stream.
  2. docker logs 使用 grep 某些環(huán)境下需要添加 2>&1 才有效果, docker logs xx -f 2>&1| grep --line-buffered xxx

參考
How to 'grep' a continuous stream?
docker logs <container id> | grep <some value> doesn't work

初心 回答

你的情況用acl來分配權(quán)限比較好

并沒有,需要自己寫擴(kuò)展。


function certainFunction(obj, keys) {
  return keys.reduce((result, key) => {
    if (obj.hasOwnProperty(key)) {
      result[key] = obj[key];
    }
    
    return result;
  }, {});
}

var obj = { a: 1, b: 2, c: 3, d: 4 };
certainFunction(obj, ['a', 'b']);
影魅 回答

解決了,因?yàn)間ithub登錄成功后是 http 方式跳轉(zhuǎn)過去的,所以 express-session 需要設(shè)置下 secure: false

app.use(session({
    secret: 'Stefanie Sun',
    store: sessionStore,
    resave: true, // 強(qiáng)制更新 session
    saveUninitialized: true,  // 
    cookie: { 
        maxAge: 3 * 3600 * 1000,  // 過期時(shí)
        secure: false // http 訪問時(shí) secure 為 false
  }, 
    rolling: true
}))

怪我沒有仔細(xì)看文檔=。=

冷眸 回答
docker run -it 鏡像:版本 /bin/bash

生成容器后可以進(jìn)去看有哪些軟件。

Dockerfile看不到的。

我不懂 回答

重現(xiàn)了Connection reset by peer,代碼如下

//client
    public static void main(String[] args) {
        try {
            Socket s = new Socket();
            s.setSoLinger(true,0);//設(shè)置調(diào)用close就發(fā)送RST
            s.connect(new InetSocketAddress("127.0.0.1",3113));

            OutputStream os = s.getOutputStream();
            os.write("hello".getBytes());

            s.close();

            System.in.read();//防止程序退出
        }catch (Exception e){
            e.printStackTrace();
        }
    }
//server
        try {
            ServerSocket ss = new ServerSocket(3113);
            Socket s = ss.accept();
            InputStream is = s.getInputStream();
            byte[] buf =new byte[1024];
            //int len = is.read(buf);
            //System.out.println("recv:"+new String(buf,0,len));

            Thread.sleep(10000);

            s.getOutputStream().write("hello".getBytes());

            System.out.println("send over");
            System.in.read();
        }catch (Exception e){
            e.printStackTrace();
        }