# 2개 이상의 리스트를 쌍으로 묶은 리스트 생성하기
X = [1,2,3,4,5] Y = [6,7,8,9,0] print(list(zip(Y, X))) # [(6, 1), (7, 2), (8, 3), (9, 4), (0, 5)]

공간정보시스템 / 3차원 시각화 / 딥러닝 기반 기술 연구소 @지오서비스(GEOSERVICE)
# 2개 이상의 리스트를 쌍으로 묶은 리스트 생성하기
X = [1,2,3,4,5] Y = [6,7,8,9,0] print(list(zip(Y, X))) # [(6, 1), (7, 2), (8, 3), (9, 4), (0, 5)]
EPSG.jar는 (주)지오서비스에서 개발한 EPSG 코드 기반의 좌표변환을 위한 Java 라이브러리입니다. 안드로이드 클라이언트 GIS 엔진인 BlackPoint-Xr(현재 SmartPoint-Xr로 제품명이 변경됨)등과 같은 프로그램에서 이용되고 있습니다. 이 EPSG 라이브러를 이용한 좌표 변환에 대한 예를 기록해 둡니다.
먼저 필요한 jar는 EPSG.jar와 종속성을 갖는 ellip2ellipsoid.jar, javaproj-1.0.6-noawt.jar 입니다.
예제 코드는 다음과 같습니다.
package testEPSG;
import geoservice.ellip2ellipsoid.ConstantParameters10;
import geoservice.ellip2ellipsoid.IParameters;
import geoservice.ellip2ellipsoid.Values3;
import geoservice.epsg.EPSG;
import geoservice.epsg.EPSGFactory;
public class MainEntry {
public static void main(String[] args) {
EPSG fromEPSG = EPSGFactory.create(5174);
EPSG toEPSG = EPSGFactory.create(5179);
IParameters params = new ConstantParameters10();
Values3 pt = new Values3(200000, 500000, 0);
fromEPSG.to(pt, toEPSG, params);
System.out.println(pt.toString());
}
}
EPSG:5174 좌표계의 (200000, 500000)를 EPSG:5179로 변환하는 코드인데요. EPSG:5174는 Bessel 타원체를 사용하며, 일본의 기준점을 활용하면서 발생한 경도상의 오차인 10.405가 반영된 대한민국 중부원점 좌표계이고, EPSG:5179는 GRS80 타원체의 단일원점 좌표계인 UTM-K 좌표계입니다.
Python을 이용해 웹 페이지에서 원하는 정보를 추출해 내는 코드다. 아래는 네이버 뉴스의 오늘 날짜에 대한 토픽 제목과 해당 url을 뽑아내는 코드 예제.
import requests
from bs4 import BeautifulSoup
url = 'https://news.naver.com/main/ranking/popularDay.nhn?rankingType=popular_day&date=20191022'
r = requests.get(url)
html = r.content
soup = BeautifulSoup(html, 'html.parser')
titles_html = soup.select('.ranking_section > ol > li > dl > dt > a')
for i in range(len(titles_html)):
print('#' + str(i+1), titles_html[i].text)
print(titles_html[i]['href'])
print()
결과는 대략 아래와 같다.
#1 러 군용기 6대의 무력 시위···한반도 3면 다 헤집고 다녔…
/main/ranking/read.nhn?mid=etc&sid1=111&rankingType=popular_day&oid=025&aid=0002946814&date=20191022&type=1&rankingSectionId=100&rankingSeq=1
#2 시정연설 마친 文, 이철희에 건넨 말 "섭섭한가 시원한가"
/main/ranking/read.nhn?mid=etc&sid1=111&rankingType=popular_day&oid=025&aid=0002946806&date=20191022&type=1&rankingSectionId=100&rankingSeq=2
.
.
#5 文대통령 발언에 뒤집어진 ‘정시 확대’…“조국 사태가 교육…
/main/ranking/read.nhn?mid=etc&sid1=111&rankingType=popular_day&oid=020&aid=0003248596&date=20191022&type=1&rankingSectionId=100&rankingSeq=5
C# 언어를 활용하여 스레드를 통해 코드를 동시에 실행하고자 하는데, DB Connection과 같은 유한한 자원을 미리 생성해 놓고 활용하고자 합니다. 이때 사용할 리소스 풀로써 만든 클래스입니다.
class ResourcePool<T>
{
private readonly ConcurrentBag<T> _items = new ConcurrentBag<T>();
private ManualResetEvent _event = new ManualResetEvent(true);
public ResourcePool(List<T> items) {
var iter = items.GetEnumerator();
while(iter.MoveNext())
{
_items.Add(iter.Current);
}
}
public void Release(T item)
{
_items.Add(item);
_event.Set();
}
public T Get()
{
T item;
do
{
if (_items.IsEmpty)
{
_event.Reset();
_event.WaitOne();
}
} while (!_items.TryTake(out item));
return item;
}
}
위의 ResourcePool은 generic 클래스로 어떤 객체 타입이든 리소스로써 담아두고 활용할 수 있습니다. 예를 들어, 아래와 같은 클래스로 말입니다.
class Resource
{
public int v {
get;
set;
}
private int _useCount = 0;
public Resource(int v)
{
this.v = v;
}
public void increaseUsingCount()
{
_useCount++;
}
public string toString()
{
return "V: " + v + " Count: " + _useCount;
}
}
이 리소스 풀에 스레드에서 사용할 리소스를 담아두는 코드의 예는 아래와 같습니다.
List<Resource> items = new List<Resource>() { new Resource(0), new Resource(1), new Resource(2), new Resource(3) };
ResourcePool<Resource> objPool = new ResourcePool<Resource>(items);
실제 리소스 풀은 스레드를 통해 활용될 때에 그 의미가 있습니다. 예를 들어 앞서 작성한 코드들을 전제로 아래의 코드처럼 말입니다.
Parallel.For(1, 50, new ParallelOptions { MaxDegreeOfParallelism = 8 },
(int i) => {
Resource r = objPool.Get();
r.increaseUsingCount();
Console.WriteLine("[Thread-Index: " + i + "] " + r.toString());
// Some Operation
Thread.Sleep(new Random().Next(600, 3000));
// .
objPool.Release(r);
});
위의 코드는 총 49개의 스레드를 만들고, MaxDegreeOfParallelism에서 지정한 값이 8만큼, 최대 8개의 스레드만을 동시에 실행하도록 하며, 람다 함수를 통해 실행할 스레드 코드를 지정하고 있습니다.
C# 언어에서 PostgreSQL 데이터베이스를 사용하기 위한 내용을 정리해 봅니다.
먼저 Visual Studio를 실행하고 C# 프로젝트를 생성합니다. 그리고 Package Manager를 실행하는데, 아래와 같은 메뉴를 통해 접근이 가능합니다.

Package Manager는 콘솔창과 비슷한 방식으로 명령을 실행할 수 있는데, .NET을 위한 PostgreSQL 라이브러리를 설치하기 위해 아래의 명령을 입력합니다.
Install-Package Npgsql -Version 4.0.4
현재 시점에서는 4.0.4가 최신버전이지만 이를 확인하기 위해 아래의 URL로 접속하기 바랍니다.
https://www.nuget.org/packages/Npgsql/
라이브러리의 설치가 성공적으로 마무리 되면 아래처럼 코드를 입력하여 PostgreSQL에 대한 조회가 가능합니다.
using (var conn = new NpgsqlConnection("host=localhost;username=postgres;password=__________;database=postgres"))
{
try
{
conn.Open();
using (var cmd = new NpgsqlCommand())
{
cmd.Connection = conn;
cmd.CommandText =
"SELECT table_name " +
"FROM information_schema.tables " + "" +
"WHERE table_schema = 'public' AND table_type = 'BASE TABLE'";
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
listBox1.Items.Add(reader.GetString(0));
//or listBox1.Items.Add(reader["table_name"].ToString());
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
Using 절에 추가해야 할 것은 다음과 같습니다.
using Npgsql;
끝으로 Npgsql은 하나의 Connection에 대해서 하나의 Command만을 실행할 수 있습니다. 확인한 날짜는 2019년 10월 2일자이며, 이 시점에서 최신 버전으로 테스트해 보았습니다.