티스토리 뷰

728x90
SMALL

오늘 너무 피곤했는데 대표님이 아침에 세미나 가도 된다고 해서 갑자기 너무 행복해지면서 잠이 확 깼다!!

우와우와... 회사 진짜 잘 고른 거 같다. 세미나 너무 좋아....

 

아무튼 이 기세라면 1년은 100프로 채우고 싶다. 

1. 자유로운 분위기 - 출퇴근 시간, 음악 들어도 됨. 이런 것들.

2. 업무에 필요한 것 요청 시 지원


화요일인데 벌써 피곤한 나의 브금

https://www.youtube.com/watch?v=Dq3C0M1u9Ho 

오랜만에 마시멜로

 

오늘의 인상 깊었던 글 아카이브

 

https://okky.kr/article/1142729

 

OKKY | 이직 고민

안녕하세요!  이직을 준비하고 있는 27살 개발자입니다. 26살 1월에 입사해서 이제 1년 다니고 회사의 연봉과 기술 스택의 문제, 방향성의 차이로 이직을 준비하고 있는데요, 중견이나 이름 알만

okky.kr

안녕하세요!

이직을 준비하고 있는 27살 개발자입니다.

26살 1월에 입사해서 이제 1년 다니고 회사의 연봉과 기술 스택의 문제, 방향성의 차이로 이직을 준비하고 있는데요,

중견이나 이름 알만한 스타트업들은 서류는 붙는데 코딩테스트와 과제를 진행하면, 다 떨어지고 있습니다..ㅜㅜ

그 외 이제 중소/스타트업은 붙어서 지금 고민이되는데요…

1. 현회사는 중소기업으로 연봉은 26살 작년 2500 -> 올해 2900 이고 포괄임금제에 야근 수당도 없습니다. 그대신 안정적인 수익 모델이 있다는 점이 메리트

같습니다

2. 중고차 관련 스타트업 제가 들어가면 개발자는 저랑 사수 1명으로 총 2명이고, 연봉 3500을 제시하였습니다. 현제 이곳은 수익화 플랫폼을 이제 구축하는 단계라 들어가면 모든 것을 해야합니다. 야근도 할 수도 있습니다. 근데 야근 수당도 준다고 합니다..

 

둘 중에 간다면 어딜가는게 좋고, 커리어에 도움이 될까요..? 아니면 그냥 현회사 다니면서 이직 준비를 조금 더 하는게 좋을까요.??

 

제가 봤을때 서류는 붙는데 코딩테스트에서 떨어지는 케이스면

현재 나이대비 보여지는 스펙은 그럭저럭 나쁘지 않음 -> 좋은 대학교에서 졸업하여 학점도 나쁘지 않음

코딩 테스트에서 떨어짐 -> 어디 사이트 코테인지는 모르겠으나 보통 코딩 테스트 사이트의 2~3레벨 정도면 엄청나게

어려운  난이도가 아닌데 떨어진다는건 그 부분에 문제가 좀 있어 보임

아에 못푸는 수준인지 아니면 푸는데 남들에게 설명을 못하고 넘어갈 정도인지가 중요함

못푸는 정도라면 이직보다는 공부를 더 하시고 

머릿속에 있는데 설명을 못하는거면 컨디션 조절을 잘하거나 조금만 연습하면 금방 통과가능할듯

지금은 어디회사가 중요한게 아님

짧게 빠른 걸음으로 여러번 갈지 아니면 큰 걸음으로 천천히 한번에 갈지는 본인의 선택임

 

https://www.boannews.com/media/view.asp?idx=104138 

 

[주말판] 인공지능이 가야할 길, 평탄치 않다

인공지능이 드디어 조금씩 그 가치를 증명하기 시작했는데, 산업 자동화(스마트 팩토리 등), 의료 진찰, 신약 개발(코로나 백신 등), 사업 프로세스의 자동화(사기 탐지 등)에서 특히 약진을 보이

www.boannews.com

어제 이 기사에서 가트너는 2021년 11월 보고서를 통해 많은 조직들이 아직도 인공지능을 실험하는 단계에 멈춰있으며, 실제 사업 행위와 프로세스에 도입시키는 데에 어려움을 겪고 있다고 알렸다. 이 부분 공감


4) 인공지능이라는 기술도 보안과 거버넌스를 필요로 한다는 걸 잊지 않는다.

이 부분에서 이루다가 생각나면서 내 전공과의 융합이 생각났다.

 


오늘 전열기구와 가습기를 사기 위해서.. 머쓱하고 관심을 많이 받았다.. 그래서 머쓱...

CPP이 주언어라고 했던 스스로를 오늘 뼈저리게 반성하고.... 자책을 안 하기 위해서 노력했다. 

 

잘 모르는 것 앞에서 쫄아서 프로그래밍이 어렵다고 징징거리고 개발자는 내 적성이 아니라고 포기하는 개발자가 아니라 모르는 걸 만나면 그걸 넘을 생각에 설레는 개발자가 되어야지. 프로그래밍이 어렵다고 징징거리는 개발자가 아니라 열심히 모르는 걸 공부해서 잘 하는 개발자가 되어야지.

 

오늘 그래서 사수님께 코드를 잘 못 읽겠다고 이야기 드렸더니 이건 언어 문제라기 보다 알고리즘 문제라고 이게 여기서 왜 쓰였는지 알아야한다는 조언을 들었다. 아이패드 들고 와서 라도 코드를 뜯어봐야겠다.

 

그리고 어렵게 생각하면서 내 한계를 규정짓지는 말아야겠다.

버퍼, 포인터, 클라스 등등의 개념에 대해서 잘 모르고, 잊은 것도 많은 거 같다...

포인터가 없어서 c#이나 JAVA가 선호된다고 한다.

 

아무튼 좋은 사수님을 만나서 다행이다.

 

자책할 시간에 공부하자.

 

//https://stackoverflow.com/questions/13660777/c-reading-the-data-part-of-a-wav-file
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <fstream>
#include <cstdint>
#include <Windows.h>
#include <string>
using namespace std;


//=========================================================== 
// base64 
//=========================================================== 
std::wstring base64Encode(const wstring input) {
    //string utf8_input = wstrToUtf8(input); 
    unsigned char const* buffer = (unsigned const char*)(input.c_str()); 
    size_t size = input.length(); 
    input[0];
    using std::wstring; 
    static wchar_t const* base64Table = L"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 
    // for = 
    // size_t base64Size = (size + 2 - ((size + 2) % 3)) / 3 * 4; 
    // wstring result(base64Size, L'='); 
    size_t base64Size = ceil(size * 4.0 / 3); 
    wstring result(base64Size, 0);
    unsigned char const* s = buffer; // source pointer 
    size_t di = 0; // destination index 
    for(size_t i = 0; i < size / 3; i++){ 
        // input: 0000_0000 0000_0000 0000_0000 
        // // out1: 0000_00 // out2: 00 0000 // out3: _0000 00 // out4: 00_0000 
        result[di++] = base64Table[s[0] >> 2]; 
        result[di++] = base64Table[((s[0] << 4) | (s[1] >> 4)) & 0x3f]; 
        result[di++] = base64Table[((s[1] << 2) | (s[2] >> 6)) & 0x3f]; 
        result[di++] = base64Table[s[2] & 0x3f]; 
        s += 3; 
    } 
    size_t remainSize = size % 3; 
    switch(remainSize){ 
    case 0: 
        break; 
    case 1: 
        result[di++] = base64Table[s[0] >> 2]; 
        result[di++] = base64Table[(s[0] << 4) & 0x3f]; 
        break; 
    case 2: 
        result[di++] = base64Table[s[0] >> 2]; 
        result[di++] = base64Table[((s[0] << 4) | (s[1] >> 4)) & 0x3f]; 
        result[di++] = base64Table[(s[1] << 2) & 0x3f]; 
        break; 
    default: 
        throw std::logic_error("Should not happen."); 
    } 
    return result; 
}



typedef struct WAV_HEADER
{
    /* RIFF Chunk Descriptor */
    uint8_t         RIFF[4];        // RIFF Header Magic header
    uint32_t        ChunkSize;      // RIFF Chunk Size
    uint8_t         WAVE[4];        // WAVE Header
    /* "fmt" sub-chunk */
    uint8_t         fmt[4];         // FMT header
    uint32_t        Subchunk1Size;  // Size of the fmt chunk
    uint16_t        AudioFormat;    // Audio format 1=PCM,6=mulaw,7=alaw,     257=IBM Mu-Law, 258=IBM A-Law, 259=ADPCM
    uint16_t        NumOfChan;      // Number of channels 1=Mono 2=Sterio
    uint32_t        SamplesPerSec;  // Sampling Frequency in Hz
    uint32_t        bytesPerSec;    // bytes per second
    uint16_t        blockAlign;     // 2=16-bit mono, 4=16-bit stereo
    uint16_t        bitsPerSample;  // Number of bits per sample
} wav_hdr;

typedef struct  WAV_SUBHEADER
{
    /* "data" sub-chunk */
    uint8_t         Subchunk2ID[4]; // "data"  string
    uint32_t        Subchunk2Size;  // Sampled data length
} wav_subhdr;

int main(int argc, char* argv[])
{
    wav_hdr wavHeader;
    wav_subhdr wavSubHeader;
    int headerSize = sizeof(wav_hdr), filelength = 0;

    LPCWSTR filePath = L"C:\\Users\\Z690-EXTREME\\Downloads\\녹음.wav";
    HANDLE wavFile = CreateFile(filePath, GENERIC_READ, 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
    filelength = GetFileSize(wavFile, nullptr);

    //Read the header
    DWORD bytesRead;
    ReadFile(wavFile, &wavHeader, headerSize, &bytesRead, nullptr);
    cout << "File is                    :" << filelength << " bytes." << endl;
    cout << "RIFF header                :" << wavHeader.RIFF[0] << wavHeader.RIFF[1] << wavHeader.RIFF[2] << wavHeader.RIFF[3] << endl;
    cout << "WAVE header                :" << wavHeader.WAVE[0] << wavHeader.WAVE[1] << wavHeader.WAVE[2] << wavHeader.WAVE[3] << endl;
    cout << "FMT                        :" << wavHeader.fmt[0] << wavHeader.fmt[1] << wavHeader.fmt[2] << wavHeader.fmt[3] << endl;
    cout << "Data size                  :" << wavHeader.ChunkSize << endl;

    // Display the sampling Rate from the header
    cout << "Sampling Rate              :" << wavHeader.SamplesPerSec << endl;
    cout << "Number of bits used        :" << wavHeader.bitsPerSample << endl;
    cout << "Number of channels         :" << wavHeader.NumOfChan << endl;
    cout << "Number of bytes per second :" << wavHeader.bytesPerSec << endl;
    cout << "Audio Format               :" << wavHeader.AudioFormat << endl;
    cout << "Block align                :" << wavHeader.blockAlign << endl;
    // Audio format 1=PCM,6=mulaw,7=alaw, 257=IBM Mu-Law, 258=IBM A-Law, 259=ADPCM

    size_t bytesSubRead = 0;
    while (ReadFile(wavFile, &wavSubHeader, sizeof(wavSubHeader), &bytesRead, nullptr))
    {
        if (bytesRead == 0)
            break;
        //todo endian 확인
        //[윈도우] char 형은 하위비트에서 상위비트 순으로 저장되는 Little Endian 방식을 사용하고 int, long형은 최상위비트에서 하위비트로 저장되는 방식(Big endian)을 사용하네요.
        //모든 시스템이 같은 엔디안을 사용하는 것은 아니다.Linux, Windows 계열은 리틀 엔디안 방식을 사용하고 있다.그러니까 우리는 보통 리틀 엔디안을 이용하는 시스템을 주로 사용하고 있다.\
        //하지만 반대로 네트워크를 통한 전송은 빅 엔디안 방식이다.IP 패킷이 바이트 단위로 구분된 이후 최상위 비트(Most Significant Bit)를 먼저 전송하고 최하위 비트(Least Significant Bit)를 나중에 보낸다.또한 바이트 내의 비트 전송 순서도 최상위 비트를 먼저 보낸다.전반적으로 빅 엔디안 순서라 볼 수 있다.
        //DATA는 Big endian
        cout << "Data string                :" << wavSubHeader.Subchunk2ID[0] << wavSubHeader.Subchunk2ID[1] << wavSubHeader.Subchunk2ID[2] << wavSubHeader.Subchunk2ID[3] << endl;
        cout << "Data length                :" << wavSubHeader.Subchunk2Size << endl;

        //todo 크기 단위 확인, 샘플 갯수일까, 바이트 단위일까
        //Read the data
        int8_t* buffer = new int8_t[wavSubHeader.Subchunk2Size];
        DWORD bytesChunksRead = 0, offset = 0, remains = wavSubHeader.Subchunk2Size;

        //todo google "c++ read big file"
        do {
            if (ReadFile(wavFile, &buffer[offset], sizeof(int8_t) * wavSubHeader.Subchunk2Size, &bytesChunksRead, nullptr)) {
                if (bytesChunksRead == 0)
                    break;
                /** DO SOMETHING WITH THE WAVE DATA HERE **/
                cout << "Read " << bytesChunksRead << " bytes." << endl;
                remains -= bytesChunksRead;
                offset += bytesChunksRead;

                if (strncmp((const char*)wavSubHeader.Subchunk2ID, "data", 4) == 0) {
                    //todo chunk2id 가 data 였으면 여기서 읽은 값을 base64 인코딩 합니다.
                    wcout.imbue(locale("korean")); wstring plain(L"대한민국"); wcout << base64Encode(plain).c_str() << endl;

       
                }
            }
        } while (bytesChunksRead > 0 && remains > 0);


        delete[] buffer;
        buffer = nullptr;
    }
    CloseHandle(wavFile);
    return 0;
}
728x90
LIST

'신입일기(웹툰예정)' 카테고리의 다른 글

1/20 업무일지+TIL  (2) 2022.01.20
1/19 업무일지 + TIL  (0) 2022.01.19
1/17 업무일지+TIL  (0) 2022.01.17
1/14 업무일지+TIL  (0) 2022.01.14
1/13 TIL + 업무일지  (0) 2022.01.13