반응형



Singleton pattern은 객체의 인스턴스가 process내에서 1개만 생성되도록 하는 것입니다.


이렇게 하기 위해서는 global 객체를 하나만 유지하고, 일반적으로 getInstance() 와 같은 class의 스테틱 메소드(static method)를 통해서 생성된 instance를 얻어가는 구조입니다.


주로 XXXX Manager 와 같은 management instance 류 들이 singleton으로 작성됩니다.



가장 simple한 구현체는 아래와 같은 형식입니다.


class Singleton

{

  public:

    static Singleton* getInstance();

  private:

    Singleton()=default;

};


Singleton* 

Singleton::getInstance();

{

    static Singleton inst;

    return &inst;

}

또는 

Singleton* 

Singleton::getInstance();

{

    static Singleton* inst = new Singleton();

    return inst;

}

또는 

static Singleton* __inst = nullptr;

Singleton* 

Singleton::getInstance();

{

    if(__inst == nullptr)

    {

       __inst = new Singleton();

    }

    return __inst;

}


하지만, 이렇게 작성된 코드는 객체 생성 시점에 쓰레드 세이프(thread safe)하지 않기 때문에 , single thread환경에서는 이슈가 없겠지만,

multi-thread환경에서는 이슈가 생길 가능성이 다분합니다.


이를 위해서 각 platform 환경에 맞춰서 thread safe 형식을 추가하여 작업을 해야 하는 상황이 발생하죠.

pthread 를 지원하는 환경이면, pthread_once 와 같은 함수들 말이죠.



C++ 11에서 부터는 언어 차원에서 pthread_once 와 같은 기능을 할 수 있는 기능을 지원하게 되었습니다.

std::call_once() 입니다. (http://www.cplusplus.com/reference/mutex/call_once/?kw=call_once)


이 call_once를 이용하면 platform과 연관성을 줄이면서 Singleton 디자인 패턴(design pattern)을 완성 할 수 있습니다.


[std::call_once를 이용한 Singleton pattern 구현]

#include <new>

#include <memory>

#include <mutex>

#include <stdio.h>


class Singleton

{

public:

    static Singleton& getInstance();


    void log(){

        printf("instance: %p", __instance.get());

    }

    ~Singleton(){

        printf("delete instance : %p", this);

    }

private:

    Singleton() = default;

    

    Singleton(const Singleton &) = delete;

    Singleton &operator=(const Singleton &) = delete;


    static std::unique_ptr<Singleton> __instance;

    static std::once_flag __once;

};



std::unique_ptr<Singleton> Singleton::__instance;

std::once_flag Singleton::__once;


Singleton& 

Singleton::getInstance()

{

    std::call_once(__once, []() {

      __instance.reset(new Singleton);


      printf("create instance : %p\n", __instance.get());


    });


    return *__instance.get();

}


void 

test_std_once()

{

    Singleton& ins= Singleton::getInstance();    

    ins.log();

}








반응형



Linux 의 memory 보안을 위한 설정


relro 

GCC의 compile option을 통해서 relro ( Relocation Read-Only )공격, GOT overwirte을 막기 위한 option을 제공합니다.

컴파일 옵션에 아래와 같이 적어주면 됩니다.

gcc -Wl,-z,relro,-z,now


해당 사항을 조치하고 나서 테스트 하기 위해서는 아래 링크의 security check script 를 사용하여 확인 가능합니다.


https://github.com/slimm609/checksec.sh

 

# ../checksec.sh –file full_test


Stack Canary, Terminator canaries, Null Canary...

stack 공격을 막기 위해서는  stack 가드 활성화 하면 됩니다.

-fstack-protector-all 






반응형

 

 

파이선 가이드북.!!

https://wikidocs.net/book/1

 

 

 

강의 자료

https://python.bakyeono.net/index.html

 

 

 

[머신러닝 입문 강좌 | TEAMLAB X Inflearn ]

 

numpy

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

https://www.youtube.com/watch?v=R47dC04H2-I

 

 

https://www.youtube.com/channel/UC_kvhNYJtP1-Ap67byTbfuw

 

TeamLab

가천대학교 산업경영공학과 Teamlab의 강의/연구 동영상입니다.

www.youtube.com

 

 

geo pandas를 이용한 지도 활용

 

 

https://sksdudtjs.tistory.com/23

 

지리 데이터 시각화(1) - 한국 기초 구역도 합치기, GeoPandas

데이터 사이언스 스쿨 - 지리 정보 데이터 처리 먼저 위 사이트에서 많은 도움을 받았음을 밝힙니다. 지리 데이터를 처음 접하시는 분은 한 번 정독하시는 걸 추천드립니다. 목적 아래 테이블과

sksdudtjs.tistory.com

 

 

import geopandas as gpd
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# Step 1: 한국의 행정 경계 데이터 불러오기
# GeoJSON or SHP 파일을 불러옵니다 (GeoJSON은 한국 경계 데이터를 쉽게 구할 수 있음)
# https://github.com/southkorea/southkorea-maps 에서 행정구역 GeoJSON을 다운로드할 수 있습니다.
korea_admin_boundaries = "korea_admin_boundaries.json"  # 파일 경로를 맞게 설정하세요.
gdf = gpd.read_file(korea_admin_boundaries)

# Step 2: 임의의 내한성 데이터 추가
# 한국의 행정 구역별 내한성 (Hardiness Zone) 값을 가정
np.random.seed(42)  # 재현 가능한 결과를 위해 설정
gdf['Hardiness_Zone'] = np.random.randint(6, 9, len(gdf))  # 예: 내한성 값 6~9 범위

# Step 3: 지도 그리기
fig, ax = plt.subplots(1, 1, figsize=(10, 14))
gdf.plot(column='Hardiness_Zone',
         cmap='coolwarm',  # 색상 지도 설정
         legend=True,
         edgecolor="black",
         linewidth=0.5,
         ax=ax)

# 지도에 타이틀 추가
plt.title("Korean Plant Hardiness Zones", fontsize=15)
plt.axis("off")  # 축 제거
plt.show()

 

 

지리 정보 데이터 처리 방식

 

https://datascienceschool.net/03%20machine%20learning/03.04.01%20%EC%A7%80%EB%A6%AC%20%EC%A0%95%EB%B3%B4%20%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EC%B2%98%EB%A6%AC.html

 

지리 정보 데이터 처리 — 데이터 사이언스 스쿨

GeoPandas는 파이썬에서 지리정보 데이터 처리의 기하하적 연산과 시각화 등을 돕는 패키지이다. 이름으로도 알 수 있듯이, GeoPandas는 Pandas와 비슷하다. 두 가지의 자료형 GeoSeries와 GeoDataFrame이 있

datascienceschool.net

 

'python' 카테고리의 다른 글

Python 패키지 모듈 정의하기  (0) 2022.05.27
반응형




파이 카메라

http://www.hardcopyworld.com/ngine/aduino/index.php/archives/1808




http://wiki.rasplay.org/


반응형

준비하기



[bs4 install]


pip3 install --upgrade bs4


---------------------------------------


import urllib.requset 

import urllib.parse


url ="http://xxx.xxx.xxx/img/test.png"

savename="test.png"

#download

urllib.request.urlretrieve(url, savename )




#memory 로 로드

mem = urllib.requst.urlopen(url).read()


with open(savename, mode="wb") as f:

f.write(mem)

print("saved");






방식 : GET, POST, PUT, DELETE

대상 : http://media.daum.net   => 호스트 네임

추가정보

- 경로 : /photo-viewer

- 데이타: ?cid=318190#20170615103230763

요청 매개변수.


api = "https://search.naver.com/search.naver"

value ={

"where":"nexearch",

"sm":"top_hty",

"fbm":"1",

"ie":"utf8",

"query":"초콜릿"

}


params = urllib.parse.urlencode(values)


print (api)

print(params)


url = api +"?"+ params



data = urllib.request.urlopen(url).read()

text = data.decode("utf-8") // # euc-kr

print(text)




-------------------


BeautifulSoup   스크랩 툴.


pip BeautifulSoup


from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'html.parser')



아래 두 함수 사용 css 선택자를 이용하여 선택하는 함수임.

 css 선택자를 알아야 함.

soup.select_one()

soup.select()


<html><body>

<div id="meigen">

<h1> 위키북스 도서</h1>

<ul class= "items art it book">  => class를 여러개 사용.

<li>유니티 게임 인문</li>

</ul>

</div>

</body></html>


css 선택자 :

tag 선택자  : 

 "ul", "div", 'li" ...

id 선택

 "#meigen"  =>id

 "#<id이름>"

class 선택자

 ".book.art.it.items"  => 점으로

 "ul.book"

".<클래스 이름>.<클래스 이름>.<클래스 이름>"


후손 선택자

"html li"

자식 선택자

"ul.items > li"ㄱ



list_items = soup.select("ul.items li")  # 요소 의 배열


header = soup.select_on("body > div > h1") # 요소


print(header.string)

#header.attrs["title"]


print(soup.select_one("ul").attrs)


for li in list_items:

print(li.string)


---------------------------------

기사에서 마우스 오른쪽 클릭 ->검사


url = "http://news.naver.com/main/main.nhn?mode=LSD&mid=shm..."

response = urllib.request.urlopen(url)

soup = BeautifulSoup(response, "html.parser")

results = soup.select("#section_body a")

for result in results:

print("제목:", results.attrs["title"])

print("링크:", result.attrs["href"])

print("")

url_article = result.attrs["href"]

response = urllib.request.urlopen(url_article)

soup_article = BeautifulSoup(response, "html.parser")

content = soup_article.select_one("#articleBodyContests")


#print(content.contents)  => 보기 않좋음

output=""

for item in content.contents:

#output += str(item) 

stripped = str(item).strip()

if stripped =="":

continue

if stripped[0] not in ["<","/"]:

output += str(item).strip()



printf(output.replace("본문 내용TV플레이어",""))



time.slee(1) # server에서 과부화 걸리면 ip 차단함.. 그래서 회피를 위해 sleep







----------------------------------

import requests


from bs4 import BeautifulSoup


print("start")

#url = "http://ecos.bok.or.kr/jsp/vis/keystat"

url = "http://ecos.bok.or.kr/jsp/vis/keystat/Key100Stat_n.jsp"

#url = "http://news.naver.com/"

proxies = {

'http': 'http://ip:port',

'https': 'https://ip:port',

}

#proxy = req.ProxyHandler({'http': '168.219.61.252:8080'})

r =  requests.post(url, proxies=proxies)


soup = BeautifulSoup(r.text,'lxml')

#with open("test.html", mode='wt') as f:

#    f.write(r.text)


print(r.text)


#results = soup.select("#section_body a")


results = soup.select('tr')



for res in results:

    print(res)


print("end")



------------------------------------




반응형

김태훈



https://www.youtube.com/watch?v=soJ-wDOSCf4&t=16s

DCGAN


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

책읽어주는 


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

강화학습




carpedm20.github.io





윤인성

머신러닝/딥러닝 실전 입문


https://www.youtube.com/watch?v=ivf1I85pzw8&list=PLBXuLgInP-5m_vn9ycXHRl7hlsd1huqmS&index=6



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


'머신러닝 & 텐서플로 & 파이썬' 카테고리의 다른 글

GAN 스터디  (0) 2019.03.27
데이타 크롤링  (0) 2018.04.02
Tensorflow training을 save하고 restore하는 방법  (0) 2018.03.22
Matplotlib 사용하기  (0) 2018.03.20
adam and gradient descent optimizer  (0) 2018.01.29
반응형

 

 

 

요즘 카카오 미니 광고가 눈에 자주 들어오네요.

아이들이 게임하는 모습이 너무 귀엽고 해서 한번 써보고싶다는 생각이 드네요.

물론 와이프님의 허락이 필요하겠지만요 ㅠㅠ

https://kakao.ai/feature

 

반응형



training modeling 을 저장했다가 다시 불러서 사용하게 되면,

처음부터 training을 할 필요가 없어져서 매우 유용합니다.


그 방법 역시 매우 간단한데요. 아래 예제가 있습니다.

한번 활용해보세요.


optimizer = tf.train.AdamOptimizer(learning_rate)

train = optimizer.minimize(cost)


saver = tf.train.Saver()

sess = tf.Session()

sess.run(tf.global_variables_initializer())


# training 을 저장할 file 명

mytrain= "./mytain.ckpt"


if os.path.exists(mytrain+".meta"):

# 파일에서 loading

    saver.restore(sess, mytrain)


else :

    for step in range(2001) :

        cost_val, hy_val, _ = sess.run([cost, hypothesis, train], feed_dict={X: trainX, Y: trainY})

        if step % 10 ==0 :

            print(step, "Cost: ", cost_val, "\nPrediction:\n", hy_val)


#file에 저장

    saver.save(sess, mytrain)


test_predict = sess.run(hypothesis, feed_dict= {X: testX})





아래와 같이 graph 까지 복원해서 사용할 수 있는 방법도 있습니다.

saver = tf.train.import_meta_graph(mytrain+".meta")

saver.restore(sess, mytrain)




ex)

save



train_size = int(len(dataY) * 0.7)

test_size =  len(dataY) - train_size


trainX = np.array(dataX[0:train_size])

testX = np.array(dataX[train_size:len(dataX)])


trainY = np.array(dataY[0:train_size])

testY = np.array(dataY[train_size:len(dataY)])


input_len = data_dim*seq_length


X = tf.placeholder(tf.float32, [None, input_len], name='X')

Y = tf.placeholder(tf.float32, [None, 1], name='Y')


W = tf.Variable(tf.random_normal([input_len, 1]), name='weight')

b = tf.Variable(tf.random_normal([1]), name='bias')


#hypothesis = tf.matmul(X, W) + b

hypothesis = tf.add(b, tf.matmul(X, W), name="h")




cost = tf.reduce_mean(tf.square(hypothesis - Y))


optimizer = tf.train.AdamOptimizer(learning_rate)

train = optimizer.minimize(cost)


saver = tf.train.Saver()

sess = tf.Session()

sess.run(tf.global_variables_initializer())



for step in range(2001) :

    cost_val, hy_val, _ = sess.run([cost, hypothesis, train], feed_dict={X: trainX, Y: trainY})

    if step % 10 ==0 :

        print(step, "Cost: ", cost_val, "\nPrediction:\n", hy_val)


saver.save(sess, mytrain)





resotre

if os.path.exists(mytrain+".meta"):

    sess = tf.Session()

    sess.run(tf.global_variables_initializer())

    saver = tf.train.import_meta_graph(mytrain+".meta")


    saver.restore(sess, mytrain)


    graph = tf.get_default_graph()

    X = graph.get_tensor_by_name('X:0')

    W = graph.get_tensor_by_name('weight:0')

    b = graph.get_tensor_by_name('bias:0')


    hypothesis = graph.get_tensor_by_name('h:0')   #tf.matmul(X, W) + b



    test_predict = sess.run(hypothesis, feed_dict={X: testX})




'머신러닝 & 텐서플로 & 파이썬' 카테고리의 다른 글

데이타 크롤링  (0) 2018.04.02
머신러닝 유투브 영상모음  (0) 2018.03.29
Matplotlib 사용하기  (0) 2018.03.20
adam and gradient descent optimizer  (0) 2018.01.29
Softmax  (0) 2018.01.26

+ Recent posts