반응형

1. 오늘의 집에서 예쁜 조명이 있나 탐색중 발견

 

2. 가격이 비쌌다... 무료 164,000원

 

3. 살까말까 고민하다가 결국 사버렸다.

 

4. 배송은 좀 생각보다 금방 왔음. (뭐 자체제작이라길래 오래 걸릴줄 알았는데..) 

    한 일주일 안돼서 왔던듯?

 

5. 같이오는 전구의 색깔은 약간 샛노란색에 가깝고 방하나를 환하게 비출만한 밝기는 아니다.

    (딱 감성용으로 쓰기 좋은듯)

 

6. 사진과 같은 색깔이다.

 

7. 지금 10% 할인 쿠폰을 준다.... 젠장 비싸게 사버렸다

 

8. 아무튼 예쁘다.

 

반응형
반응형

1. 생일 케이크로 시킴. 뭐시킬지 고민하다가 빙글 스윙 트리 시킴. 35000원... 내도..ㄴ...
 

 
 
2. 배달은 30분? 금방왔음 (토요일 기준)
3. 크기는 딱 4명정도 먹기 좋은 정도?

 
 
4. 안에는 초코 그리고 요거트, 체리로 들어있었던듯?

 
 
5. 비싼건 역시 맛있다.

반응형
반응형

전세 대출 받으러 여기저기 기웃기웃 다님ㅋㅋㅋ

 

1. 우리은행 방문 (11월 초중)

 금리 4.8% 정도 나올거라고 함

 

2. 새마을금고 방문 (11월 초중)

 변동 금리 4.1% 정도 나올거라고 함

 

3. 토스뱅크 & 카카오 뱅크 찾아봄

 고정 4%~ 4.1% 예상 됨

 

4. 케이뱅크 홈페이지 가보니 어라 특판 진행? 최저 3.46% (11월 28일 기준임)

   예상금리가 뭐 3.61? 고정금리가? 그래서 바로 자세히 보기 누른뒤 신청

 

 

5. 신청과정은 아래 순으로 진행됨.

 1) 예상한도 확인

 2) 서류 제출

 3) 대출 심사

 4) 대출 약정
 5) 대출금 보내기 

 

6. 서류제출에서 아래 서류 제출하라고 함.

- 임대계약서 그리고 필증

- 소득계약서

- 계약서 증명서 (납입영수증)

 

7. 제출 후 한 3일뒤 전화 연락옴

- 임대차계약서에 주소가 살짝 이상해서 수정후 임대인, 임차인, 중개사 도장찍어서 보내라

- 소득계약서는 소득금액증명원 출력본을 직접 찍어서 내야한다. (내가 낸건 다른 서류였음)

 

8. 다시 나머지 서류 제출 후 1~2일뒤인가 또 연락옴

- 임대차계약서에 임대인 도장이 달라 계약금 전송내역을 보내달라.

 

9. 계약금 전송내역 제출 후 하루 뒤 대출 가능이라고 연락옴

이게 왠걸? 최저금리 3.46에 맞춰서 금리가 대출된다고 나왔다. 

(사실 3.49였는데 확정신청을 좀 기다렸다가 다시 재조회 하니 3.46이라 잽싸게 신청했다.)

 

 

친절하게도 케이뱅크에서 부족한 서류가 뭐인지는 다 문자로 전송해준다.

이거 모르고 괜히 대화 녹음했음.. (안내 해주시는분들 목소리가 전부 다 좀 뾰로퉁한건 비밀)

 

아무튼 이제 대출일날 버튼만 누르면 완료!

 

 

추가)

대출 버튼 누르고 문자왔는데 실제로 저때보다 당일 금리로 우선해서 보내줘서 최종 3.22로 대출받았다

반응형
반응형

1. 파이썬파일

python에서 list로 묶어서 전송후 postgresql에서 unnest 풀어서 저장

import pandas as pd
import psycopg2 as pg
#%%
# -*- coding: utf-8 -*-
"""
Created on Mon Jan 13 20:57:30 2020
@author: user
"""
class PostgresDataClass():
    def __init__(self,host,database,user,password):
         self.host = host
         self.user = user
         self.database = database
         self.password = password
         self.type_dict = {'timestamp without time zone':'timestamp[]',
                           'character varying':'text[]',
                           'integer':'int4[]',
                           'date':'date[]',
                           'real':'real[]',
                           'bigint':'bigint[]',
                           'double precision':'double precision[]',
                           'numeric':'numeric[]',
                           'text':'text[]'}
    def connect(self):
         conn = pg.connect(host=self.host,
                           database=self.database,
                           user = self.user,
                           password = self.password)
         return conn
     
        
    def get_cursor(self, conn):
        cur = conn.cursor()
        return cur
    
    ##select return list
    def select_list(self,sql,param=()):
        with self.connect() as conn:
            with self.get_cursor(conn) as cur:
                cur.execute(sql,param)
                return cur.fetchall()

    ##select return dataframe
    def select_dataframe(self,sql,param=()):
        with self.connect() as conn:
            with self.get_cursor(conn) as cur:
                cur.execute(sql,param)
                colnames = [desc[0] for desc in cur.description]
                df = pd.DataFrame(cur.fetchall())
                df.columns = colnames
                return df

    ##query execute
    def execute(self,sql,param=()):
        with self.connect() as conn:
            with self.get_cursor(conn) as cur :
                try : 
                    cur.execute(sql,param)
                    conn.commit()
                except Exception as e:
                    print('%s %s'%(e.__class.__name__,str(e)))
                    

    def set_source_list(self,data):
        self.source_list = data

    def insert_list(self,data,schema_table_name,size=100000):
        it = iter(data)
        win =[]
        length = len(data)
        record_sum = 0
        with self.connect() as conn:
            with self.get_cursor(conn) as cur:
                while True:
                    try :
                        for e in range(0,size):
                            win.append(next(it))
                    except Exception :
                        None
                    if len(win)==0:
                        break
                    record_sum += len(win)                    
                    self.set_source_list(win)
                    self.migration(cur,schema_table_name)
                    win = []
                    conn.commit()
                         
    def migration(self,cur,schema_table_name):
        schema, table_name = schema_table_name.split('.')
        table_info = self.select_dataframe(""" SELECT column_name, ordinal_position,is_nullable, data_type
                                               FROM information_schema.columns WHERE table_schema = lower(%s)
                                               AND table_name = lower(%s) order by ordinal_position""",(schema,table_name))
        index = 0
        for column_name in table_info['column_name']:
            exec(column_name + '=[x[{index}] for x in self.source_list]'.format(index=index))
           
            index += 1 
        columns = ','.join(table_info['column_name'])
        
        unnest_columns=[]
        for i in range(0,len(table_info)):
            unnest_columns.append('unnest(%({})s::{})'.format(table_info['column_name'][i], self.type_dict[table_info['data_type'][i]]))
            
        insert_sql = """INSERT INTO {schema_table_name}({columns}) SELECT {unnest_columns} ON CONFLICT DO NOTHING""".format(schema_table_name =schema_table_name, columns =columns, unnest_columns=','.join(unnest_columns))
        
        params = locals()
        cur.execute(insert_sql,params)

 

 

2. 가져다 쓰기 (연결부분)

from postLib import  PostgressConn

post = PostgressConn('host','database','user','password')
post.insert_list(tuples, 'data')

 

3. 끝!

 

 

 

 

 

 

반응형
반응형

 

티스토리 광고만 붙여놓고 운영을 하지 않았는데 광고가 이렇게 본문 중간에 덕지덕지 붙어있을지는 상상도 못했다..

분명 난 앞에와 뒤에만 설정을 헀는데 본문에도 광고가 계속 들어가 있을줄이야..

광고 설정

 

으 광고 너무 많음

에디터 영역에 광고가 들어가있는 화면

 

 

후.. 에디터에 광고가 덕지덕지 있으면 나 같아도 읽기 싫다. 그래서 어떻게 없앴다 어떻게?

 

HTML 이용해서!

 

티스토리 블로그 관리 > 꾸미기  > 스킨편집 에 들어가서  html 편집 클릭

 

html 편집화면

 

 

CSS 영역에 아래 추가 해주면 된다.

.contents_style은 글이 올라오는 에디터 div의 class 네임이고 .google-auto-placed는 애드센스 광고 영역이라서 에디터 div안에 애드센스 광고만 차단하게 된다.

 

 

.contents_style .google-auto-placed {
   display: none !important;
}



에디터 엔터(내어쓰기) 추가 되는거 막았더니 div Class 이름이 아래처럼 바꼈다.

.tt_article_useless_p_margin contents_style .google-auto-placed {
   display: none !important;
}

 

 

내 CSS 파일

 

 

그러면 귀신같이 광고가 사라져서 가독성이 좋아진다. 끝!

반응형
반응형

rsi 계산에는 ewm의 개념이 들어가는데 이부분은 정확한 이해를 하지 못했다.

파이썬의 경우, DataFrame에 ewm이라는 함수를 사용한다.

RSI 계산하는 공식이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 def calcRSI(self,stock_ds, date_index, ema=True):
        close_delta = stock_ds['Close'].diff()
 
        # Make two series: one for lower closes and one for higher closes
        up = close_delta.clip(lower=0)
        down = -1 * close_delta.clip(upper=0)
 
        if ema:
            # Use exponential moving average
            ma_up = up.ewm(com=self.period - 1, adjust=True, min_periods=self.period).mean()
            ma_down = down.ewm(com=self.period - 1, adjust=True, min_periods=self.period).mean()
        else:
            # Use simple moving average
            ma_up = up.rolling(window=self.period, adjust=False).mean()
            ma_down = down.rolling(window=self.period, adjust=False).mean()
 
        rsi = ma_up / ma_down
        rsi = 100 - (100 / (1 + rsi))
        rsi = pd.DataFrame(rsi)
        rsi.columns = ['rsi']
        return rsi
cs

 

ewm 함수는 아래에서 볼 수 있다.

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.ewm.html

 

pandas.DataFrame.ewm — pandas 1.3.3 documentation

When ignore_na=True (reproducing pre-0.15.0 behavior), weights are based on relative positions. For example, the weights of \(x_0\) and \(x_2\) used in calculating the final weighted average of [\(x_0\), None, \(x_2\)] are \(1-\alpha\) and \(1\) if adjust=

pandas.pydata.org

 

adjust의 함수는 이렇게 사용되는데, 대부분 엑셀을 통해 RSI를 계산하는 사이트를 보면 아래와 같은 공식을 사용한다.

하지만, 이는 무한대라는 가정하에 아래와 같은 공식이 나온다고 한다.

그래서 우리가 엑셀을 통해 만들기 위해서는 위와같은 공식을 사용해야한다.

아래는 RSI 계산식이다.

보통은 RSI 계산식의 기간은 14일이다. 그래서 13이 들어갔다.

index 날짜 종가 변화량 gain loss avg gain avg gain RS rsi
1 2021. 6. 28 134.78       0      
2 2021. 6. 29 136.33 1.55 1.55 0 0 0.49    
3 2021. 6. 30 136.96 0.63 0.63 0 0.326666667 0.235925926    
4 2021. 7. 1 137.27 0.31 0.31 0 0.320694698 0.151389397    
5 2021. 7. 2 139.96 2.69 2.69 0 0.980397768 0.109236936    
6 2021. 7. 3 142.02 2.06 2.06 0 1.229444488 0.084037747    
7 2021. 7. 4 144.57 2.55 2.55 0 1.492225911 0.067314816 22.168 95.684
8 2021. 7. 5 143.24 -1.33 0 1.33 1.228877214 0.290154062 4.235 80.899
9 2021. 7. 6 145.11 1.87 1.87 0 1.331266648 0.243815497 5.46 84.52
10 2021. 7. 7 144.5 -0.61 0 0.61 1.135904496 0.297552735 3.817 79.242
11 2021. 7. 8 145.64 1.14 1.14 0 1.13646341 0.256945689 4.423 81.56
12 2021. 7. 9 149.15 3.51 3.51 0 1.440598722 0.224021715 6.431 86.542
13 2021. 7. 10 148.48 -0.67 0 0.67 1.265912275 0.27810087 4.552 81.988
14 2021. 7. 11 146.39 -2.09 0 2.09 1.119694428 0.487382347 2.297 69.673
15 2021. 7. 12 142.45 -3.94 0 3.94 0.99582491 0.869338416 1.145 53.391
        if(D16>0,D16,0) if(D16>0,D16,0) (E16*1/(1+13)+G15*(1-(1-1/(1+13))^(A16-1))*(1-(1/(1+13))))/(1-(1-1/(1+13))^A16) (F16*1/(1+13)+H15*(1-(1-1/(1+13))^(A16-1))*(1-(1/(1+13))))/(1-(1-1/(1+13))^A16) G16/H16 100-(100/(I16+1))

 

정확한 이해가 필요하면 통계박사를 찾아가면 된다.

반응형

'투자 > 개발' 카테고리의 다른 글

Google Sheets를 이용한 자동 메일  (0) 2021.09.06
네이버 증권을 이용한 주식 테마 정리하기  (4) 2021.08.22
반응형

일단 Google Sheets, 스프레드시트를 이용한 메일링이 가능 한 것을 알게 되었고,

즉시 방법을 찾았다.

근데 정확히 내 엑셀에 있는 데이터를 표 형식으로 해서 메일링 하는 방법은 찾기 어려웠다.

그래도 힘겹게 이 사이트를 찾아서 다행이였다.

https://spreadsheet.dev/send-html-email-from-google-sheets

 

Send HTML email from Google Sheets

In this tutorial, I'll show you how to send HTML email from Google Sheets using Apps Script. I'll also show you how to create the HTML email template using Gmail and Google Docs. In a previous tutorial, I described how to build a Stock Watcher application

spreadsheet.dev

https://spreadsheet.dev/send-email-from-google-sheets-based-on-a-schedule

 

Send email from Google Sheets based on a schedule

If you've worked in any organization of any size, you've probably had to put together and send reports on a regular basis to your team. In this post, I'll show you how to automate sending emails from Google Sheets based on a schedule. We'll build a stock p

spreadsheet.dev

 

여기 방법을 그대로 따라하면 된다.

총 위에 두개가 나오는데

위에는 google sheets에서 Google Script를 통해 데이터를 읽어오는법

아래는 google sheets에서 html에다 데이터를 넣어주는 방법이다.

위에방법으로만 하면 그냥 일렬로 데이터가 쭉 나와서 메일 전송이 되기때문.

처음엔 방법이 어려웠으나 해보니 쉽다.

나의 스프레드시트의 데이터는 아래와 같다.

이걸 자동 메일링으로 보낼거다.

과정 1 - 데이터 에 들어간다(파일 수정 보기 등등 칸에 있다) -> 이름으로 지정된 범위 클릭

들어가서 범위를 지정한 후 이름을 정해준다.

과정 2 - 시트의 이름을 변경한다. (나같은 경우엔 참고 사이트와 똑같이 Data로 변경, 위의 Stocks도 마찬가지)

 

과정 3 - 도구 - 스크립트 편집기 들어간다

Code.gs에 아래와 같은 코드를 넣는다.

sendEmail은 메일 보내는 함수

getEmailText는 필요없다. body로 변수 받는데 메일링 할때 body 변수 지워버렸거든

getData는 아까 지정해준 Data, Stocks에서 각각의 값을 가져온다

getColor는 getData에서 값 -> 색상 변경이라고 보면 된다.

getEmailHtml은 html로 데이터를 넣어주는 함수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
function myFunction() {
  sendEmail()
}
 
function sendEmail() {
  var stockData = getData();
  var stockColor = getColor();
  var body = getEmailText(stockData,stockColor);
  var htmlBody = getEmailHtml(stockData,stockColor);
 
  MailApp.sendEmail({
  to: "메일@naver.com",
  subject: "하루일과",
  htmlBody : htmlBody
  });
}
 
function getEmailText(stockData) {
  var text = "";
  stockData.forEach(function(stock) {
    text = text + stock.name + "\n" + stock.ticker + "\n" + stock.price + "\n-----------------------\n\n";
  });
  return text;
}
 
/**
 * @OnlyCurrentDoc
 */
function getData() {
  var values = SpreadsheetApp.getActive().getSheetByName("Data").getRange("Stocks").getValues();
  values.shift(); //remove headers
  var stocks = [];
  values.forEach(function(value) {
    var stock = {};
    stock.market = value[0];
    stock.ticker = value[1];
    stock.company = value[2];
    stock.volumn = value[3].toFixed(2);
    stock.change = value[4].toFixed(2);
    stock.price = value[5].toFixed(2);
    stock.year_high = value[6].toFixed(2);
    stock.year_high_over = value[7].toFixed(2);
    stock.year_low = value[8].toFixed(2);
    stock.year_low_over = value[9].toFixed(2);
    stock.per = value[10].toFixed(2);
    stock.eps = value[11].toFixed(2);
    stocks.push(stock);
  })
  //Logger.log(JSON.stringify(stocks));
  return stocks;
}
 
function getColor() {
  var values = SpreadsheetApp.getActive().getSheetByName("Data").getRange("Stocks").getBackgrounds();
  values.shift(); //remove headers
  var colors = [];
  values.forEach(function(value) {
    var color = {};
    color.market = value[0];
    color.ticker = value[1];
    color.company = value[2];
    color.volumn = value[3];
    color.change = value[4];
    color.price = value[5];
    color.year_high = value[6];
    color.year_high_over = value[7];
    color.year_low = value[8];
    color.year_low_over = value[9];
    color.per = value[10];
    color.eps = value[11];
    colors.push(color);
  })
  return colors;
}
 
 
 
function getEmailHtml(stockData,stockColor) {
  var htmlTemplate = HtmlService.createTemplateFromFile("Template.html");
  htmlTemplate.stocks = stockData; 
  htmlTemplate.colors = stockColor; 
  var htmlBody = htmlTemplate.evaluate().getContent();
  console.log(htmlBody)
  return htmlBody;
}
cs

 

과정4 - HTML 코드 만들기 (사실 이게 제일 귀찮다)

일단 코드 투척.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<div dir="ltr">
    <table cellspacing="0" cellpadding="0" dir="ltr" border="1" style="table-layout:fixed;font-size:10pt;font-family:Arial;border-collapse:collapse;border:none">
        <colgroup>
            <col width="95">
                <col width="57">
                    <col width="139">
                        <col width="74">
                            <col width="55">
                                <col width="75">
                                    <col width="93">
                                        <col width="144">
                                            <col width="93">
                                                <col width="144">
                                                    <col width="56">
                                                        <col width="74">
        </colgroup>
        <tbody>
            <tr style="height:21px">
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;background-color:rgb(207,226,243);font-size:11pt;font-weight:bold;color:rgb(0,0,0);text-align:center"
                rowspan="1" colspan="12">관심주식</td>
            <tr style="height:21px">
                <td style="border:1px solid rgb(0,0,0);overflow:hidden;vertical-align:bottom;background-color:rgb(207,226,243);font-size:12pt;font-weight:bold;text-align:center">거래소</td>
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;background-color:rgb(207,226,243);font-size:12pt;font-weight:bold;text-align:center">티커</td>
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;background-color:rgb(207,226,243);font-size:12pt;font-weight:bold;text-align:center">기업명</td>
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;background-color:rgb(207,226,243);font-size:12pt;font-weight:bold;text-align:center">시총</td>
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;background-color:rgb(207,226,243);font-size:12pt;font-weight:bold;text-align:center">상승률</td>
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;background-color:rgb(207,226,243);font-size:12pt;font-weight:bold;text-align:center">현재 주가</td>
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;background-color:rgb(207,226,243);font-size:12pt;font-weight:bold;text-align:center">52주 신고가</td>
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;background-color:rgb(207,226,243);font-size:12pt;font-weight:bold;text-align:center">신고가 대비 하락률</td>
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;background-color:rgb(207,226,243);font-size:12pt;font-weight:bold;text-align:center">52주 신저가</td>
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;background-color:rgb(207,226,243);font-size:12pt;font-weight:bold;text-align:center">신저가 대비 상승률</td>
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;background-color:rgb(207,226,243);font-size:12pt;font-weight:bold;text-align:center">PER</td>
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;background-color:rgb(207,226,243);font-size:12pt;font-weight:bold;text-align:center">EPS</td>
            </tr>
            <for(var i = 0; i < stocks.length; i++) { ?>
            <tr style="height:21px">
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;font-size:12pt;text-align:center; background-color : <?= colors[i].market?>"><?= stocks[i].market?></td>
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;font-size:12pt;text-align:center; background-color : <?= colors[i].ticker?>"><?= stocks[i].ticker?></td>
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;font-size:12pt;text-align:center; background-color : <?= colors[i].company?>"><?= stocks[i].company?></td>
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;font-size:12pt;text-align:center; background-color : <?= colors[i].volumn?>"><?= stocks[i].volumn?></td>
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;font-size:12pt;text-align:center; background-color : <?= colors[i].change?>"><?= stocks[i].change?></td>
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;font-size:12pt;text-align:center; background-color : <?= colors[i].price?>"><?= stocks[i].price?></td>
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;font-size:12pt;text-align:center; background-color : <?= colors[i].year_high?>"><?= stocks[i].year_high?></td>
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;font-size:12pt;text-align:center; background-color : <?= colors[i].year_high_over?>"><?= stocks[i].year_high_over?></td>
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;font-size:12pt;text-align:center; background-color : <?= colors[i].year_low?>"><?= stocks[i].year_low?></td>
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;font-size:12pt;text-align:center; background-color : <?= colors[i].year_low_over?>"><?= stocks[i].year_low_over?></td>
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;font-size:12pt;text-align:center; background-color : <?= colors[i].per?>"><?= stocks[i].per?></td>
                <td style="border-width:1px;border-style:solid;overflow:hidden;vertical-align:bottom;font-size:12pt;text-align:center; background-color : <?= colors[i].eps?>"><?= stocks[i].eps?></td>
            </tr>
            <? } ?> 
        </tbody>
    </table>
</div>
cs

 

아래의 큰 틀을 만들기 위해서는

과정 4-1 엑셀을 복사해서 gmail이용하여 나 자신에게 보낸다.

과정 4-2 gmail에서 메일 들어간 뒤 더보기(오른쪽 3개 점) 들어가서 메일 원본보기를 클릭

 

과정 4-3 원본메일 - 클립보드 복사

과정 4-4 클립보드에서 <div> ~</div> 만 가져오면된다.

여기서 잠깐!  Content-Transfer-Encoding: quoted-printable 이거 다음 div가 시작이며

매애애애앤 아래 --000000000000478d2f05cb539a8a-- 이런거 위에 div가 마지막이다.

 

과정 4-5 Decode에 복붙하고 Encode 해준 후 Encoding 된 텍스트 가져온다.

https://www.webatic.com/quoted-printable-convertor

 

Encode/Decode Quoted Printable - Webatic

Related utilities HTML Entities convertor,   URL convertor,   Base64 convertor,   Encoding Explorer Charset The current character set/encoding is   Unicode (utf-8) Afrikaans (iso-8859-1) Albanian (iso-8859-1) Arabic (win1256) Azerbaijani (iso-8859-9) B

www.webatic.com

 

과정 4-6 Encoding 된 텍스트 예쁘게 정렬시켜준다.

https://www.browserling.com/tools/html-prettify

 

HTML Prettifier - HTML Beautifier - Online - Browserling Web Developer Tools

 

www.browserling.com

 

그 뒤에 Template.html에 복붙해준다. 그게 아까 그 위에 코드이다

 

과정 5 - HTML에 변수를 넣어준다.

위에 코드를 잠시보자면 <?= stocks[i].eps?> 이런 부분이 있는데 데이터 가져와서 동적으로 넣어준것이다.

아 반복문도 있으니 참고 부탁.

 

아무튼 이렇게 순서대로 하면

 

 

이렇게 쨘하고 보내진다.

그 뒤에 트리거는 알아서 잘들 조절 하시고

그럼 여기까지.

반응형
반응형

어딜가도 테마별 주식이 엑셀로 쉽게 볼수 있는 곳이 없었다.

그래서 하기로 했다.

일단, 네이버 금융의 테마별 시세를 들어간다.

(네이버 금융 -> 국내 증시 -> 주요시세정보 -> 테마)

 

테마별 시세 : 네이버 금융

관심종목의 실시간 주가를 가장 빠르게 확인하는 곳

finance.naver.com

 

테마명이 나오며, 테마 링크를 클릭하면 해당 종목들이 나온다. (모든 종목을 한번에 보고싶었다)

+ 테마 검색도 없다.

그래서 BeautifulSoup 라이브러리를 통해 만들었다.

Soup를 통한 select를 할 때,  Copy - Copy Selector를 통해서 태그를 가져오면 된다.

 

<소스코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import sys
sys.path.append('C:\\Users\\user\\Anaconda3\\libs')
import requests
from io import BytesIO
import pandas as pd
import seaborn as sns
from tqdm import tqdm
 
from bs4 import BeautifulSoup
import datetime
import re
from postLib import  PostgresDataClass
 
# from html_table_parser import parser_functions as parser
 
#%%
 
end = datetime.datetime.now()
start = end - datetime.timedelta(days=10)
headers = {'User-Agent''Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36'"Upgrade-Insecure-Requests""1","DNT""1","Accept""text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language""en-US,en;q=0.5","Accept-Encoding""gzip, deflate"}
pd.set_option('display.float_format'None)
df = pd.DataFrame()
 
#%%
for pagenum in range(1,8):
    url = "https://finance.naver.com/sise/theme.nhn?field=name&ordering=asc&page={pagenum}".format(pagenum=pagenum)
    resp = requests.get(url, headers = headers)
    soup = BeautifulSoup(resp.content, "html.parser")
 
 
    thema_num = 0
    while thema_num < 50:
        try : 
            thema_num += 1
            board_date = soup.select("#contentarea_left > table.type_1.theme > tr:nth-child("+str(thema_num)+") > td.col_type1 > a")[0]
 
    
            linkUrl = 'https://finance.naver.com' + board_date['href']
 
            linkResp = requests.get(linkUrl, headers = headers)
            linkSoup = BeautifulSoup(linkResp.content, "html.parser")
            thema = board_date.text
        except Exception as e:
            continue
        link_num = 0
        while link_num < 100 :
            try : 
                link_num += 1
    
                link_board_date = linkSoup.select("#contentarea > div:nth-child(5) > table > tbody > tr:nth-child("+str(link_num)+") > td.name > div > a")[0].text
                print(thema, link_board_date)
                df = df.append({'thema' : thema, 'stock' : link_board_date}, ignore_index =True)                
 
                
            except : 
                continue
     
df1 = df.groupby(['stock'])['thema'].apply(lambda x: ','.join(x)).reset_index()
 
df.to_excel('C:\\Users\\user\\thema.xlsx')
df1.to_excel('C:\\Users\\user\\thema2.xlsx')
 
tuples = [tuple(x) for x in df.values.tolist()]
 
post = PostgresDataClass('localhost','stock','postgres','postgres')
post.insert_list(tuples, 'stock.thema_stock')
cs

 

<데이터> 예제 (네이버)

 

반응형

'투자 > 개발' 카테고리의 다른 글

위불과 같은 RSI 계산하기 (엑셀, 파이썬)  (0) 2021.09.25
Google Sheets를 이용한 자동 메일  (0) 2021.09.06
반응형

이번에도 늦었지만 후기를 남겨야겠다.

2018년 5월 16일 면접을 보고 왔다. 3번째 면접이였기 때문에 더더욱 열심히 준비했고 더더욱 잘보기위해 준비를 했었다.

이번에는 삼성전자 DSR A타워와 16라인에서 진행했는데 집합장소는 DSR A타워 였고 개인적인 문자로 개별입실이 가능하다고 문자가 왔다.

그래서 나는 DSR타워와 걸어서 10분(?) 정도 거리에 숙소를 잡았다. 호텔로 잡았고 가격은 55000원 정도였다.

전날 일찍 누웠는데 너무 더워서 1시간 자고 깨서 2시간정도 뒤적뒤적거리다가 12시쯤 눈을 붙이고 4시에 기상하여 씻고 이동했다.

비가 올 후덥지근한 날씨였고 DSR 타워에 거의 도착했을 때 비가 조금씩 왔다. 아무튼 DSR 타워에 도착하여 대기를 하다가 면접을 진행했다.

면접 진행 순서는 이번에 처음으로 DSR타워에서 인성면접을 위한 CBT, 창의면접을 위한 문제풀이, 창의면접 -> 점심먹고 -> 16라인에서 직무에 대한 문제풀이, 직무면접 -> 16라인에서 인성면접 순으로 진행했다.

 

 

 

창의면접

창의 면접은 2번 봤을 때와 동일했다.

창의 문제는 아래와 같았다.

최근 많은 사람들이 귀농,귀촌을 하고 있다. 특히 젊은 층에서 귀농,귀촌을 하고 있다. 그런데 많은 사람들이 귀농을 포기한다(? 이런문제였던가) 이때 발생할 수 있는 문제와 해결방법에 대해서 말해보시오.

그리고 키워드는 미세먼지, 청년, 등등 으로 나왔었다.

대략 이러한 느낌으로 나왔다. 맨 처음에는 문제에 대한 이해가 되지 않았다. 귀농을 하는데 무슨 문제가 발생할수 있을까 생각을 엄청 많이하고 고민을 많이 했었다.

그래서 가장 중요한 방법으로는 아주 짧게 젊은 층이 귀농포기를 하는 이유에 대해서 얘기했었고 그에대한 해결책을 해기했었다. 

대락적으로 1. 청년 취업률 하락, 2. 워라밸을 위한 삶, 3. IoT기기의 발달로 인한 농사에 대한 접근용이성 등을 이용해서 문제를 얘기했었다.

거기에 대한 가장 크게 얘기했었던 해결방안으로는 귀농하는 젊은 층을 붙잡기 위해 젊은층을 취업성공패키지처럼 교육을 시키는 것이였다. 귀농을 미리 겪는다면 귀농을 미리 체험할 수 있음으로써, 귀농에 대해 다시한번 생각해 볼 수 있는 좋은 계기가 될것이다. 라고 말을 했었다.

이때, 면접관님이 이미 있는거 아닌가요? 라는 말을 했었고 아 이미 있는건가요? 라고 대답을 했었다.;; 그때 면접관이 아니 저도 정확히는 모르겠지만 있을거 같은데 다른 창의적인 내용 없어요? 라는 질문을 하셨고 , 나는 돈을 주면 더 좋을 것 같다는 얘기를 했었다.

다른 맨 왼쪽에 계신분은 이러한 말을 쭈욱 얘기했는데 크게 관심이 없었던 것 같다. 원인은 좋은데 해결방안이 좋지 않다. 다른 해결방안은 없는가? 라는 질문을 했었다.

그때 나는 잠시 생각해본다는 말을 했었고, IoT에 관한 내용을 말했었다. 근데 왜 내가 이러한 말을 했을까? 문제에 대한 설명이 정말 이상하게 돼있었어서 내가 제대로 핀트를 잡지 못했었었던거 같기도 하고...

아무튼 또 다른 질문으로는 문제원인은 제대로 파악하셨는데 해결방안이 미흡하네요. 라는 말을 들었었고 나는 문제를 풀면서 문제를 제대로 이해 못해서 풀 시간이 부족했었다고 말했었다.

그래서 다른 해결방안이 무엇이 있는가에 대해서 또 물어봤었던 거 같다. 그래서 나는 각각의 특산물이 나오는 촌마다 거기에 대한 특별 IoT기기를 갖고 교육을 한다면 미리 체험해 보고 경험할 수 있다 라는 말을 했었다.

아무튼 대충 발표는 이렇게 끝나고 창의적인 생각해본적 있느냐 라는 질문으로 넘어갔는데 나는 최근에 면접을 보러 서울에 오면서 지하철에 냉난방, 온난방실이 있는것을 알았다. 버스에도 온도를 측정하여 어플에 나타내주면 더 좋을 것 같다. 라는 생각을 말했었다. 이때 면접관이 이해를 잘 못해서 어플에 이용하면 좋다. 라고 말을 했었고, 어플을 보고 나갔는데 갑자기 온도가 나빠지면 항의가 많이 들어올것 같다. 어떻게 할 것인가? 라는 질문에 나는 그러한 경우는 매우 작은 경우이기 때문에 어쩔수 없을 것 같다 라는 말을 했었다. 근데 이 대답은 정말 잘못 대답한것 같다. 오차나 에러가 나면 안되는 회사에서 무시한다는 말은 안좋은 의도로 들릴수 있는것 같다.

이로써 창의성 면접은 끝이 났다. 지금 면접을 복기하면서 생각하는건데 생각보다 창의면접을 못본것 같다.

마지막에 나와서 몇분정도 봤냐고 김기열 닮으신 면접안내자에게 물어봤는데 15분 정도 봤다고 말했고, 시간은 중요치 않다고 하셨다.

 

직무면접

직무면접의 문제풀이 시간은 50분이였다. 그리고 면접 시간은 15분 이였다.

직무면접 문제 키워드는 다음과 같았다.

1. 디자인패턴

2. 재귀함수

3. Application App

어쩔수 없이 2번을 골랐고 2번의 세부내용은 아래와 같았다.

1. 재귀함수의 정의, 장점, 단점

2. 피보나치함수의 코드, 하노이탑의 코드를 작성하시오.

3. 웨이퍼에 불량Chip이 발생했을 경우, 집중되어있을 수 있는데 어떻게 확인 할 것인가?

대략적으로 이러한 문제로 나왔다.

직무면접을 보러 들어갔다. 생각보다 16라인에 면접실은 작았다. 들어가서 인사하고 1분자기소개도 하지않았다.

문제풀이 해주세요. 라고 말해서 나는 1번 재귀함수의 정의, 장단점에 대해서 설명했다.

그리고 2번을 풀기 전, 판서를 해도 될까요? 라는 질문을 하고 피보나치에 대한 재귀 코드를 작성했다. 그리고 아래에는 다이나믹프로그래밍으로 코드를 작성했다.

그리고 재귀 코드에 대한 설명을 했는데 이러한 경우 메모리에 부담을 느낄 수 있다. 라는 말을 했고 다이나믹 프로그래밍으로 작성하면 성능이 좋아진다고 발표했다.

특히 메모리부하가 생기는 원인은 계속해서 스택에 쌓이고 + 한번만 방문해도 되는데 계속해서 쪼개서 방문하기 때문 이라고 설명을 했다. 

그리고 하노이탑은 열심히 복기했지만, 잘 모르겠다고 하고 넘어갔다.

마지막 3번을 할때도 웨이퍼를 그렸고 칩이 1개일때 까지 재귀적으로 접근을 하여 합칠 때, 불량칩이 몰려있는지 계산을한다. 라고 설명을 햇었는데 여기서 버벅버벅거려서 면접관분들께서 다시 한번 설명 해달라고 해서 설명했다. 그런데 이때 설명을 제대로 못한것 같다. 차라리 코드를 작성해서 같이 설명햇다면 훨씬 좋았을 것같다.

웨이퍼에 대한 설명을 끝 맞추고 면접관님께서 아까 피보나치의 경우 성능을 좋게 만들 수있는 방법에 대해서 말해 보세요. 라고 해서 나는 여러번 똑같은 곳에 방문하기 때문에 미리 배열을 만들어 놓고 한번만 방문하면 된다. 라고 설명했고 음.. 하고 넘어가셨다.

그 다음 받았던 질문으로는 인턴활동을 한것을 물어봤다. 두레텍에서 한 것은 물어보지 않았고 휴라에서 했던 일만 물어봤었다. 

휴라에서 암호화통신(?) 하시고, 문서작업 하셨다는데 정확히 뭐 하신거에요? 그때 AES 암호화 프로젝트에 대해서 대답했었다. 클라이언트와 서버에 사이에 암호화 작업이 필요해서 AES 암호화 작업을 했다. 라고 대답했고 그에 대해서 라이브러리를 사용하신거에요? 라는 질문을 했고 나는 C언어에서 openSSL 라이브러리, C#에서는 자체 제공하는 라이브러리를 사용했다고 말했다. 그리고 C언어에서 OpenlSSL 라이브러리중 EVP 라이브러리를 사용했고 이거는 AES 라이브러리보다 속도가 빠르고 커널에 자체 접근하기 떄문이라고 설명했다. 그 다음 질문으로는 어느 부서에서 일을 하고 싶냐고 물어보셔서 악성코드분석을 해봤고 AES암호화하면서 Security IC를 만드는 일을 하고 싶다고 말했다. 그때 다른 한 분이 Security IC? 라고 말하시고 한번 쳐다보셨다.

그 후, 네트워크 관련 수업 많이 들으셨는데 네트워크에서 사용하는 프로토콜에 대해서 말해보라고 하셔서 RIP, OSPF 그리고 AS-PATH, LOCAL-PREFERENCE, MED 등에 대해서 말했는데 꼬리질문이 없었다. 마지막으로 DES,HASH, 곡선형 암호화등에 대해서 공부해본적 있냐고 물으셨고 보안기사 공부를 하면서 알고있는 정도라고 말했다. 그래서 AES 암호화를 직접 만드신건 아니죠?라는 질문도 받았었다. 그리고 면접이 끝났다.

직무면접은 잘봤다고 지금까지 생각했는데 지금 복기하면서 보니 막상 잘본 것 같지 않다. 후...

 

인성면접

인성면접을 마지막으로 봤는데 면접관님들한테도 내가 마지막 면접자 였다.

들어가서 바로 1분자기소개 시킴

1분자기소개 했더니 삼성전자에서 떨어진건 알겠으니 뭘 준비 했느냐는 질문이 들어옴

그래서 실제로 발로 움직이기위해 매주 마다 삼성관련해서 뮤지엄 세미콘 코리아 등을 방문했다고 말함 또한 sw test a형 취득까지

다른 질문으로 들어온게 왜 뽑아야하느냐 라는 질문이 들어왔었고 나는 다른사람들보다 무엇을 잘할지 알고있다. 그리고 그 직무에서 흥미를 느끼고 다른 누구보다도 열심히 할 자신이 있다고 대답했다. 다른질문으로는 소프트웨어 직군에서 가장중요시되는게 무엇인지 물어봄 나는 협동력이라고 말함 왜 협동력인지 물어봤고 협동력이 같이 일을하는거냐고 물어봄 그래서 나는 같은 방향을 나아가는데 동업자 같은 얘기함 글고 의사소통이 중요하다했는데 말이 되는게 아닌 서로의 주장을 이해하고 나아가는게 의사소통이라 말함

그리고 보안관련해서 puf 말했는데 약자를 까먹음ㅠ 이거 대답못함 아마 떨어지면 이부분이 아닐카 싶음

다른 질문으로는 보안프로젝트 무엇해봤나고 물어봄 그래서 인턴때 무슨일 해봤나고 물으셨고 드론뭐 같은거 많이했네 라고 물으셔서 어버버버버거리면서 드론때 무슨일했는지 하나씩 설명했음 그다음 보안 일 하고싶다고 했는데 경험이 너무 적은거 아니에요? 뭐 해봤어요 라고 물으셔서 내가 악성코드분석 프로젝트 얘기했고 정확히 어떻게 동작하는지까지 얘기했다 즉 pe파일을 실시간으로 파악해서 악성의 위험이있는지에 대해서 말했다

그리고 다른질문으로는 지금까지 어느부분에서 발전했는지 물으셨고 나는 알고리즘의 사고화가 좋아졌다고 대답했다 그리고 다른질문으로 남들보다 잘할수 있는게 뭐냐? 이러한 느낌으로 질문을 받았는데 나는 팔부러졌을때 노력이라는 가치관 하면 된다라는 가치관을 갖게 되었다고 말했다

그리고 마지막에 학점 좋네요ㅎㅎ라는 질문을 받고 마지막말을 하라고 하셔서 어느부분에서 감점받았는지 알고싶다고 말했는데 안된다고 하셨고 그럼 회사에서 뵀으면 좋겠다라는 말을 하고 나왔다

압박아닌 압박이 느껴지는 면접이였고 임원면접이 정말 어려웠다 

=========================================

바로 나오자 마자 적은 임원면접 후기였다.

반응형
반응형

 

그렇다. 시간이 이렇게 진행된다.

인적성은 짧게 짧게 치고 빠진다. 7유형을 푼다.

나는 공부 하나도 안하고 가서 잘 못풀긴 했다.

근데 아 몰랑.

 

반응형

+ Recent posts