반응형


모델에 포인트 주기 좋은 데칼




[대림데칼C021] 1/100 & 144 다용도 범용 코션 습식 제단 데칼 (일반 및 홀로그램)


https://smartstore.naver.com/drstore/products/2015858825




'일상 > 키덜트 월드' 카테고리의 다른 글

토끼 라이더?  (0) 2021.06.01
저렴한 핸디 글라인더  (0) 2019.09.09
콕핏 이미지  (0) 2019.07.24
SD 자쿠  (0) 2019.03.31
Green Stuff World - 쇼핑목록  (0) 2019.03.08
반응형

 

git reviewer 추가

 

.git/config 내에  아래와 같이 추가하면, review에게 자동으로 메일이 갑니다.

receivepack = git receive-pack \
--reviewer id@aaa.xxx.com\
--reviewer aaa@org.xxx.com\

--reviewer aaa@org.xxx.com\

반응형


일반적인 String compare 함수는 정확한 string을 비교해서 처리해야 하는 경우들이 많습니다.


그런데 간혹, 문자열이 엇비슷하면 같다고 처리하고 싶을 때도 있습니다.


예를 들면,  

1. "나 ^^ 이뽀 :)~" 와 "나 ^^;;; 이뽀~~~???" 이런 문자열들을 같은 취급 하고 싶은 경우, 

2. "이 름" 과 "이름" 과 같이 공백을 무시하고 싶은경우,


3. 마지막으로  "오늘 아침 날씨" 와 "오늘 오전 날씨" 와 같이 의미 갖는 단어들을  같은 것으로  취급하고 싶은 경우,


들 일것입니다.


3번은 단순 코드로는 해결하기 힘든 내용일 것입니다. 

'비슷한 문자열'이라는 개념을 정리하는 차원에서 써 놓은 항목입니다.



일단 순수한 코드차원에서 접근하자면, 1,2번의 경우에 대해서는 간단한 해결책이 있습니다.


특수문자나 공백을 제외하고 문자열을 비교하는 코드를 작성하여 이를 사용하면 됩니다.





#include <string>

using namespace std;



bool inline
is_ignorable_ch(unsigned char c)
{
if (c<= 0x2F) return true; // control code
/*
U+0020      20  SPACE
U+0021  !   21  EXCLAMATION MARK
U+0022  "   22  QUOTATION MARK
U+0023  #   23  NUMBER SIGN
U+0024  $   24  DOLLAR SIGN
U+0025  %   25  PERCENT SIGN
U+0026  &   26  AMPERSAND
U+0027  '   27  APOSTROPHE
U+0028  (   28  LEFT PARENTHESIS
U+0029  )   29  RIGHT PARENTHESIS
U+002A  *   2a  ASTERISK
U+002B  +   2b  PLUS SIGN
U+002C  ,   2c  COMMA
U+002D  -   2d  HYPHEN-MINUS
U+002E  .   2e  FULL STOP
U+002F  /   2f  SOLIDUS
*/  
else if(0x3A <= c && c<= 0x40) return true;
/*  
U+003A : 3a  COLON
U+003B  ;   3b  SEMICOLON
U+003C  <   3c  LESS-THAN SIGN
U+003D  =   3d  EQUALS SIGN
U+003E  >   3e  GREATER-THAN SIGN
U+003F  ?   3f  QUESTION MARK
U+0040  @   40  COMMERCIAL AT
*/

else if(0x5B <= c && c<= 0x60) return true;
/*
U+005B  [   5b  LEFT SQUARE BRACKET
U+005C  \   5c  REVERSE SOLIDUS
U+005D  ]   5d  RIGHT SQUARE BRACKET
U+005E  ^   5e  CIRCUMFLEX ACCENT
U+005F  _   5f  LOW LINE
U+0060  `   60  GRAVE ACCENT
*/
else if(0x7B <= c && c<= 0x7E) return true;
/*
U+007B  {   7b  LEFT CURLY BRACKET
U+007C  |   7c  VERTICAL LINE
U+007D  }   7d  RIGHT CURLY BRACKET
U+007E  ~   7e  TILDE
*/
return false;
}

bool
is_similar(const std::string& str1, const std::string& str2)
{
const char* s1 = str1.c_str();
const char* s2 = str2.c_str();
int l1 = str1.size();
int l2 = str2.size();

int i=0,j=0;
for( ;i<l1 && j<l2;)
{
if(is_ignorable_ch(s1[i])){i++; continue;}
if(is_ignorable_ch(s2[j])){j++; continue;}
if(s1[i] != s2[j]) return false;
i++;
j++;
}

for(i ;i<l1;i++)
if(!is_ignorable_ch(s1[i])) return false;

for(j ;j<l2;j++)
if(!is_ignorable_ch(s2[j])) return false;

return true;
}


#define TEST(P1, P2, _EXPECT) do{\
int r = is_similar(P1, P2);\
printf( "%s\t r= %s:\t %s, %s\n"\
,(r == (_EXPECT))?"PASS":"FALSE" \
,(r==true)?"true":"false"\
,#P1 \
,#P2);\
}while(0)

void compare_test()
{

int no = 0;
TEST("","", true);

TEST("", "aaa", false);


TEST("차차차... 해", "", false);

TEST("안녕하세요. ", " 안 녕 하세요, ",true);
TEST("hello... 나는 누구 ?", "hello나는누구",true);
TEST("hello... ", "he ll. o",true);
}



result 


PASS  r= true:  "", ""

PASS  r= false:  "", "aaa"

PASS  r= false:  "차차차... 해", ""

PASS  r= true:  "안녕하세요. ", " 안 녕 하세요, "

PASS  r= true:  "hello... 나는 누구 ?", "hello나는누구"

PASS  r= true:  "hello... ", "he ll. o"



반응형



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")



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




+ Recent posts