主頁 > 軟體工程 > 為什么我在回傳陳述句中收到Abort陷阱:6錯誤C

為什么我在回傳陳述句中收到Abort陷阱:6錯誤C

2022-03-14 13:58:38 軟體工程

我是編碼新手,我需要一些幫助來了解我的 DES 加密實作可能存在的問題。我不斷收到 Abort trap: 6 錯誤,但不確定原因。

我的嘗試包括: - 通過列印陳述句來確定錯誤。

我有一個想法,我的 encrypt 函式是罪魁禍首,因為當我自己運行其他函式時,它們作業得很好。每條陳述句在加密回傳函式之前執行;但是,在 return 陳述句之后,我得到了 abort trap: 6 錯誤。

'''

BEFORE ENDING TO ENCRYPT
/bin/sh: line 1: 39098 Abort trap: 6           ./DES
[Finished in 1.9s with exit code 134]
[cmd:  pwd && g   -c src/*.cpp -I /usr/local/include -I /Users/username/Desktop/coding_stuff/dev/DES/include -std=c  14 -g -Wall -m64 && g   *.o -o bin/debug/DES -L /usr/local/lib && cd bin/debug && ./DES]
[dir: /Users/username/Desktop/coding_stuff/dev/DES]
[path: /Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/share/dotnet:~/.dotnet/tools:/Library/Apple/usr/bin:/Library/Frameworks/Mono.framework/Versions/Current/Commands]

'''

我在 Mac OS Monterey 上,并且正在為我的專案使用 Sublime Text 編輯器。

如果我的代碼看起來有點混亂,我深表歉意,謝謝!

我的 DES.h 檔案

'''

#include <iostream>
#include <string>

#ifndef _DES_
#define _DES_

class DES
{
    public:

        DES(){};    // default constructor

        std::string shiftbits(std::string bits, int n /* number of shifts*/, char dir);

        std::string xOr(std::string s1, std::string s2);    // does XOR of two std::strings

        std::string expansion_ri(std::string s1, std::string input32bit);   // expansion of 32_bit

        std::string encrypt(std::string plain_txt, std::string key);

        std::vector<std::string> key_sched_des(std::string key);

        std::string F(std::string subkey, std::string right_block);

    private:
        

        // This is the PC_1 vector
    const int pc_1[56] = {  57 ,49 ,41 ,33 ,25 ,17 ,9  ,
                            1  ,58 ,50 ,42 ,34 ,26 ,18 ,
                            10 ,2  ,59 ,51 ,43 ,35 ,27 ,
                            19 ,11 ,3  ,60 ,52 ,44 ,36 ,
                            63 ,55 ,47 ,39 ,31 ,23 ,15 ,
                            7  ,62 ,54 ,46 ,38 ,30 ,22 ,
                            14 ,6  ,61 ,53 ,45 ,37 ,29 ,
                            21 ,13 ,5  ,28 ,20 ,12 ,4 };

    int num_leftShift[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; // number of bits to shift for each iteration

    // This is the PC_2 vector that shrinks 64_bit input to 56 bits
    const int pc_2[48] = {  14 ,17 ,11 ,24 ,1  ,5  ,
                            3  ,28 ,15 ,6  ,21 ,10 ,
                            23 ,19 ,12 ,4  ,26 ,8  ,
                            16 ,7  ,27 ,20 ,13 ,2  ,
                            41 ,52 ,31 ,37 ,47 ,55 ,
                            30 ,40 ,51 ,45 ,33 ,48 ,
                            44 ,49 ,39 ,56 ,34 ,53 ,
                            46 ,42 ,50 ,36 ,29 ,32 };

    // This vector is the inital permutatinon table
    const int IP_t[64] = {  58 ,50 ,42 ,34 ,26 ,18 ,10 ,2 ,  
                            60 ,52 ,44 ,36 ,28 ,20 ,12 ,4 ,
                            62 ,54 ,46 ,38 ,30 ,22 ,14 ,6 ,
                            64 ,56 ,48 ,40 ,32 ,24 ,16 ,8 ,
                            57 ,49 ,41 ,33 ,25 ,17 ,9  ,1 ,
                            59 ,51 ,43 ,35 ,27 ,19 ,11 ,3 ,
                            61 ,53 ,45 ,37 ,29 ,21 ,13 ,5 ,
                            63 ,55 ,47 ,39 ,31 ,23 ,15 ,7 };

    // expansion table for F function
    const int E_t[48] = {   32 ,1  ,2  ,3  ,4  ,5  , 
                            4  ,5  ,6  ,7  ,8  ,9  ,
                            8  ,9  ,10 ,11 ,12 ,13 ,
                            12 ,13 ,14 ,15 ,16 ,17 ,
                            16 ,17 ,18 ,19 ,20 ,21 ,
                            20 ,21 ,22 ,23 ,24 ,25 ,
                            24 ,25 ,26 ,27 ,28 ,29 ,
                            28 ,29 ,30 ,31 ,32 ,1 };

    // these are the S-boxes in a 3d array where the first value is the number of S-boxes, second is the rows and third is the columns for the S-boxes
    int S[8][4][16] = {                        // S-box
        {
            { 14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7 },
            { 0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8 },
            { 4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0 },
            { 15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13 }
        },
        {
            { 15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10 },
            { 3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5 },
            { 0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15 },
            { 13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9 }
        },
        {
            { 10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8 },
            { 13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1 },
            { 13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7 },
            { 1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12 }
        },
        {
            { 7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15 },
            { 13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9 },
            { 10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4 },
            { 3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14 }
        },
        {
            { 2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9 },
            { 14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6 },
            { 4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14 },
            { 11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3 }
        },
        {
            { 12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11 },
            { 10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8 },
            { 9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6 },
            { 4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13 }
        },
        {
            { 4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1 },
            { 13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6 },
            { 1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2 },
            { 6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12 }
        },
        {
            { 13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7 },
            { 1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2 },
            { 7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8 },
            { 2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11 }
        }
    };

    // The permutation table for the F funciton
    const int P[32] = {     16 ,7  ,20 ,21 ,
                            29 ,12 ,28 ,17 ,
                            1  ,15 ,23 ,26 ,
                            5  ,18 ,31 ,10 ,
                            2  ,8  ,24 ,14 ,
                            32 ,27 ,3  ,9  ,
                            19 ,13 ,30 ,6  ,
                            22 ,11 ,4  ,25 };

    // This is the final permutation table for the end of the encryption/decryption
    const int P_1[64] = {   40 ,8  ,48 ,16 ,56 ,24 ,64 ,32 ,
                            39 ,7  ,47 ,15 ,55 ,23 ,63 ,31 ,
                            38 ,6  ,46 ,14 ,54 ,22 ,62 ,30 ,
                            37 ,5  ,45 ,13 ,53 ,21 ,61 ,29 ,
                            36 ,4  ,44 ,12 ,52 ,20 ,60 ,28 ,
                            35 ,3  ,43 ,11 ,51 ,19 ,59 ,27 ,
                            34 ,2  ,42 ,10 ,50 ,18 ,58 ,26 ,
                            33 ,1  ,41 ,9  ,49 ,17 ,57 ,25 };

};

#endif

'''

這是我的 DES.cpp 檔案

'''

    #include "DES.h"
    #include <vector>
    #include <math.h>
    #include <sstream>

    int bit_to_dec(std::string num);
    std::string Dec_to_Bin(int n);

    std::string DES::shiftbits(std::string bits, int n, char dir)
    {
        std::string temp = "";

        if(dir =='l')   // shift to left
        {
            for(std::size_t i = n; i < bits.size();i  ) // prints bits from n to length of std::string
                temp  = bits[i];

            for(std::size_t i = 0; i < n;i  )   // then prints from 0 to n
                temp  = bits[i];

    } else //shift to the right
    {
        int diff = bits.length() - n;
        //cout << diff;
        for(std::size_t i = diff; i < bits.length(); i  )
            temp  = bits[i];
        
        //cout << temp;
    
        for(std::size_t i = 0; i < diff; i  )
            temp  = bits[i];
        
    }
    return temp;

}

std::string DES::xOr(std::string x1, std::string x2)
{
    std::string Xor = "";

    int bigest;
    if(x1.size() > x2.size())
        bigest = x1.size();
    else
        bigest = x2.size();

        for(int i = 0; i < bigest; i  )
        {
            if((x2[i] == '0' && x1[i] == '1')||(x2[i] == '1' && x1[i] == '0'))
                Xor  = '1';
            else if(x2[i] == '0' && x1[i] == '0')
                Xor  = '0';
            else if(x2[i] == '1' && x1[i] == '1')
                Xor  = '0';
        }
        return Xor;
}

std::string DES::expansion_ri(std::string s1, std::string input32bit)
{
    std::string str_temp = "";
    for(int i = 0; i < 48   /*The expansion of bits*/; i  )
        str_temp  = input32bit[E_t[i] - 1]; // go through every bit position in table

    return str_temp;
}

std::vector<std::string> DES::key_sched_des(std::string key)    // key schedule for des. returns a vector of subkeys
{
    std::string key64 = key;
    std::string key56;

    for(int i = 0; i < 56; i  )
        key56  = key64[pc_1[i] - 1];

    // splits key into left and right
    std::string left;
    for(int i = 0; i < 28; i  )
        left  = key56[i];

    std::string right;
    for(int i = 28; i < 56; i  )
        right  = key56[i];

    // first left shift in key schedule
    std::vector<std::string> lef_key(16), rig_key(16);

    rig_key[0] = shiftbits(right, num_leftShift[0], 'l');
    lef_key[0] = shiftbits(left, num_leftShift[0], 'l');


    for(int i = 1; i < 16; i  ) // fills up the keys and the bits are shifted by corresponding shift table
    {
        rig_key[i] = shiftbits(rig_key[i - 1], num_leftShift[i], 'l');
        lef_key[i] = shiftbits(lef_key[i - 1], num_leftShift[i], 'l');

    }

    // merge left and right previous keys to enject into pc_2
    std::vector<std::string> merge(16), subkey(16);

    for(int i = 0; i < 16; i  )
    {
        merge[i] = "";
        merge[i]  = lef_key[i]   rig_key[i];
    }
    
    // permutates merged left and right boxes
    for(int i = 0; i < 16; i  )
    {
        for(int z = 0; z < 48; z  )
        {
            subkey[i]  = merge[i][pc_2[z] - 1];
        }
    }


    return subkey;
}

std::string DES::F(std::string subkey, std::string right_block) //F function
{
    std::string expand = "";
    for(int i = 0; i < 48; i  )
        expand  = right_block[E_t[i] - 1];

    // std::cout << "expanded right block:" << expand << std::endl;
    // std::cout << "*****************************\n";

    std::string exceptOR;
    exceptOR = xOr(expand, subkey);

    // std::cout << "xor value:" << exceptOR << std::endl;
    // std::cout << "*****************************\n";


    // take S box calculation by 6 bits at a time
    int z = 0;

    std::string comb_sbox = "";
    for(int i = 0; i < 48; i  = 6)
    {
        std::string row_bits = "";
        std::string column_bits = "";

        row_bits = exceptOR[i];
        row_bits  =  exceptOR[i   5];
        for(int j = i   1; j < i   5; j  )
            column_bits  = exceptOR[j];

        // std::cout << "row:" << row_bits << std::endl;
        // std::cout << "*****************************\n";
        // std::cout << "column:" << column_bits << std::endl;
        // std::cout << "*****************************\n";

        // take bits and map to each S box
        int row = bit_to_dec(row_bits);
        int column = bit_to_dec(column_bits);

        int sbox = S[z][row][column];
        // std::cout << "number:" << sbox << std::endl;
        std::string sbox_bin = Dec_to_Bin(sbox);
        // std::cout << sbox_bin << std::endl;
        // std::cout << "*****************************\n";

        // need to combine sbox values and then use permutaiton
        // switch up values
        comb_sbox  = sbox_bin;

        z  ;
    }

    //std::cout << comb_sbox << std::endl;

    std::string permutate;// permutate the Sbox combination
    for(int i = 0; i < 32; i  )
        permutate  = comb_sbox[P[i] - 1];


    return permutate;
}

std::string DES::encrypt(std::string plain_txt, std::string key)
{

    // set up keys
    std::vector<std::string> sub_strs;
    sub_strs = key_sched_des(key);


    // do inital permutations 
    std::string IP = "";
    for (int i = 0; i < 64; i  )
        IP  = plain_txt[IP_t[i] - 1];

    std::string left[16], right[16];

    // stores bits into left and right 
    for(int i = 0; i < 32; i  )
    {
        left[0]  = IP[i];
    }
    for(int i = 32; i < 64; i  )
    {
        right[0]  = IP[i];
    }

    for(int i = 0; i < 16; i  ) //16 rounds
    {
        

        std::string sub_key = F(sub_strs[i], right[i]);

        right[i   1] = xOr(left[i], sub_key);   // l - 1 because previous left was used
        left[i   1] = right[i];


    }

    //combine the std::strings of bits into one 64 bit block
    std::string combined = "";
    for(int i = 0; i < 32;i  )
        combined  = right[15][i];
    
    for(int i = 0; i < 32;i  )
        combined  = left[15][i];

    //do final permutation of block
    std::string final_perm = "";
    for(int i = 0; i < 64; i  )
        final_perm  = combined[P_1[i] - 1];

    std::cout << "BEFORE ENDING TO ENCRYPT" << std::endl;

    return final_perm;
}

std::string Dec_to_Bin(int n)
{
    std::string binary = "";
    while (n > 0)
    {
        std::string temp;
        std::stringstream tmp;
        tmp << (n % 2);
        tmp >> temp;
        binary = temp   binary;
        n /= 2;
    }
    while(binary.size() < 4)
        binary = '0'   binary;
    return binary;
}

int bit_to_dec(std::string num)
{
    int sum = 0;
    for(int i = 0; i < num.size(); i  )
    {
        int value = num.size() - 1;
        value -= i;
        if(num[i] == '1')
        {
            sum  = 1 * pow(2, value);
        }else   // then is 0
        {
            sum  = 0 * pow(2, value);
        }

    }

    return sum;
}

'''

這是我的 main.cpp

'''

#include <iostream>
#include <string>
#include <bitset>
#include "DES.h"
#include <vector>
#include <math.h>

using namespace std;

string txttoBits(string str);   // turns string into a string of bits
int bit_to_dec(std::string num);

// This program implments the DES symmetric encryption protocol
int main()
{
    DES obj;

    // key needs to be 64 bits
    string temp = obj.encrypt("1010101011010100000011111101000101000100100101001001000010100000", "0100111111111111000010111111011110001110101100110100000000000000");

    std::cout << "AFTER ENDING OF ENCRYPT" << std::endl;


    //obj.F("110101000000111111010001010001001101111101010111","00010001010111111111001010010010");


    // cout << "would you like to encrypt or decrypt your text?(E for encrypt, D for Decrypt):";
    // char encOrdec;
    // cin >> encOrdec;

    // if(encOrdec == 'E')
    // {
    //  cout << "please enter the text you would like to Encrypt:" << endl;
    //  cin.ignore();
    //  string plain_txt;
    //  getline(cin, plain_txt)
    //  vector<string> enc_text = obj.encrypt(/*value of the string*/)

    //  cout << "The encrypted text is:" << enc_text[0] << endl;
    //  cout << "The key is:"  << enc_text[1] << endl;
    // }
    // else if(encOrdec == 'D')
    // {
    //  cout << "please enter the text you would like to Decrypt:" << endl;
    //  cin.ignore();
    //  string cipher_txt;
    //  getline(cin, cipher_txt)
    //  vector<string> enc_text = obj.decrypt(/*value of the string*/)

    //  cout << "The decrypted text is:" << enc_text[0] << endl;
    //  cout << "The key is:"  << enc_text[1] << endl;

    // }
    

    return 0;
}

string txttoBits(string str)
{
    string bitstring = "";
    for(std::size_t i = 0; i < str.size(); i  )
    {
        bitstring  = bitset<8>(str[i]).to_string();
    }
    return bitstring;
}

'''

對于我的主要 obj.Encrypt(),0 和 1 只是隨機二進制。這只是對 64 位二進制和 64 位密鑰的測驗,以確定該功能是否有效。

uj5u.com熱心網友回復:

這至少是其中一個問題。您在此處覆寫字串陣列的邊界:

std::string left[16], right[16];
//...
for (int i = 0; i < 16; i  ) //16 rounds
{
  std::string sub_key = F(sub_strs[i], right[i]);
  right[i   1] = xOr(left[i], sub_key);  // <-- What happens when i == 15?
  ....
}

注釋行基本上指出了這個問題。您正在訪問right[16],這是超出范圍的。


至于bit_to_dec功能,可以在一行代碼中完成:

#include <bitset>
//...
int bit_to_dec(std::string num)
{
  return static_cast<int>(std::bitset<32>(num).to_ulong());
}

這消除了 的用法pow(),它是一個浮點函式。如果您將浮點數引入顯然都是基于整數的程式中,則可能會引入浮點數問題,例如舍入等。

uj5u.com熱心網友回復:

問題是,對于成員函式內部回圈(如下所示)的最后一次迭代(何時i = 15,您將超出命名的范圍這會導致未定義的行為forencryptstd::stringrightleft

for(int i = 0; i < 16; i  ) //16 rounds
    {
        

        std::string sub_key = F(sub_strs[i], right[i]);

        right[i   1] = xOr(left[i], sub_key);   // out of bounds here on the left hand side
        left[i   1] = right[i]; //out of bound here on the left hand side


    }

未定義的行為意味著任何事情1都可能發生,包括但不限于給出預期輸出的程式。永遠不要依賴(或基于)具有未定義行為的程式的輸出。

所以你看到的輸出(也許看到)是未定義行為的結果。正如我所說,不要依賴具有 UB 的程式的輸出。該程式可能會崩潰。

例如,這里程式執行時沒有給出任何輸出,而這里相同的程式執行時有您預期的輸出。

因此,使程式正確的第一步是洗掉 UB(在您的情況下,這意味著注意不要超出陣列的范圍)。只有這樣,您才能開始推理程式的輸出。


1有關未定義行為的更技術上準確的定義,請參見此處提到:對程式的行為沒有限制

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/443088.html

標籤:C 德斯

上一篇:從函式回傳constchar*

下一篇:如何在stable_timer::async_wait中用lambda替換std::bind

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more