4월, 2018의 게시물 표시

주식 자동매매 시스템

파이썬을 이용한 주식 자동매매 시스템

이미지
파이썬을 이용한 주식 자동매매 시스템 INDEX 환경구축 키움증권 API - 연결테스트 키움증권 API - 계좌정보 조회 키움증권 API - 주문 키움증권 API - 종목정보 가져오기 포트폴리오 - 종목, 업종별 자산 포트폴리오 한국투자증권 API API reference 키움 OpenAPI+ 개발가이드 한국투자증권 OpenAPI 다운로드 및 가이드 Design https://www.design-seeds.com/in-nature/succulents/cacti-color-2/ https://create.piktochart.com/dashboard

[Network] Server-Client Socket 통신 with Java

이미지
java Application(Eclipse) 을 이용해 Server-Client TCP/IP Socket 통신하기 Server ServerSocket을 생성한 후 Client에서 접속할 때까지 기다린다. ServerSocket을 생성할 때는 port 번호를 지정해줘야 하는데 이때 이미 사용 중인 port 번호를 사용하면 안 된다. // ServerSocket 생성 ServerSocket serverSocket = new ServerSocket(PORT_NUMBER); // Client에서 접속할 때까지 기다리며, 접속하면 클라이언트와 연결된 Socket을 return한다. Socket socket = serverSocket.accept(); Client 서버의 IP, Port번호를 통해 socket을 생성해 server와 통신할 수 있다. Socket socket = new Socket(IP_ADDRESS, PORT_NUMBER); // socket이 제대로 생성되었는지, server와 연결되었는지 확인한다 if (socket != null && socket.isConnected()) { } Server - Client 통신 Stream을 통해 data를 주고받는다. Socket이 생성되면 outputstream과 inputstream을 통해 데이터를 주고받으면 된다. InputStream in = socket.getInputStream(); InputStreamReader inr = new InputStreamReader(in); // 빠른속도를 위해 BufferedReader를 사용한다 BufferedReader br = new BufferedReader(inr); String str = br.readLine(); OutputStream out = socket.getOutputStream(); OutputStreamWriter outw = new OutputStreamWriter(out

개발할 때 유용한 사이트

이미지
flow chart 간단하게 그릴 수 있는 Site https://www.draw.io/ MarkDown 쉽게 작성하는 방법 MD 파일 작성 사이트   를 이용하면 설치 없이 간편하게 사용할 수 있다 . typora는 MD 파일 작성 프로그램이다. 컴퓨터 내에서 MD파일을 쉽게 수정하고 저장할 수 있어서 git을 사용하는 유저들에게는 더욱 유용할 것이다. https://typora.io/#windows GitIgnore 파일 생성 개발 언어, 툴에 따라 필요한 .gitignore 파일을 쉽게 만들 수 있는 사이트이다. 여러 개발언어가 섞여 있는 경우 전부 선택하면 하나의 .gitignore를 만들 수 있다. https://www.gitignore.io/ 무료 디자인 리소스 https://icons8.com/icon/set/human/color https://fontawesome.com/ .html 파일에 코드만 추가해서 사용할 수 있는 아이콘을 제공하는 사이트 <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.13/css/all.css" integrity="sha384-DNOHZ68U8hZfKXOrtjWvjxusGo9WQnrNx2sqG0tfsghAvtVlRW3tvkXWZh58N9jp" crossorigin="anonymous"> http://l-lin.github.io/font-awesome-animation/ 위의 주소에서 아이콘에 Animation을 추가할 수 있는 css 코드를 다운로드 받는다. 사각형 영역을 눌러 CSS 코드를 다운로드 받는다 .html 파일에 아래와 같이 코드를 추가한다 <link rel="stylesheet" href="css/font-aw

System Architecture

이미지
spring layout

[Android] AsyncTask

AnsyncTask는 UI Thread를 조금 더 쉽게 이용할 수 있도록 해주는 Class이다. 이 클래스를 사용하면 Thread나 Handler를 사용하지 않고도 UI Thread에서 백그라운드 작업을 수행하고 UI를 변경할 수 있다. android.os.AsyncTask<params, progress, result> <params, progress, result> 3개의 Generic type으로 정의한다. params : Task를 실행시킬 때 넣어주는 parameter type progress : 진행중에 사용되는 type result : 결과로 return 되는 type AsyncTask 를 상속받아 클래스를 생성해, 백그라운드에서 할 작업을 구현한다. class MyTask extends AsyncTask< String , String, Void> { } doInBackground() <params, , > 값은 doInBackground()의 parameter type이며, 배열로 전달된다. < , , result > 값은 doInBackground()의 return type이다. class MyTask extends AsyncTask< String , String, Void> {     @Override    protected Void doInBackground( String ... strings) { return null; } } onPreExecute() doInBackground() 함수의 실행 전에 호출된다. @Override protected void onPreExecute() {     super.onPreExecute(); } onPostExecute() doInBackground() 함수가 끝나고 실행되는 함수이다. result의 type은 doInBackground() 함

[Android] Service

이미지
 서비스 (Service)  화면 없이 백그라운드에서 실행되는 프로세스를 의미한다. Service를 상속받는 Calss를 생성한다 Class 생성 후 우클릭 > Generate > Override 를 통해 필요한 함수들을 구현한다. Service 시작하기 MainActivity에서 Service로 데이터 전달하기 위해서는  putExtra()를 이용한다. // Service class의 class를 Intent로 생성한다 intent = new Intent(this, ServiceSleep.class); // key - value 로 값을 저장해 전달할 수도 있다 intent.putExtra("comman", "show"); // Service를 시작한다 startService(intent); Service Class 내에서  onStartCommand 를 통해 전달 받은 Intent를 처리한다. getStringExtra("KEY") 와 같은 함수로 값을 가져온다. @Override public int onStartCommand(Intent intent, int flags, int startId) {     if (intent == null) {         return Service.START_STICKY;     } else { // Intent 처리 MainActivity에서 "command"라는 이름으로 // 데이터를 저장했기 때문에 가져올 때도 "command"로 가져오면된다. intent.getStringExtra("command");     }     return super.onStartCommand(intent, flags, startId); } onDestroy에서 Service를 종료시켜줘야 한다. stopService(intent)

[Android] GoogleMaps API 사용방법

이미지
프로젝트 생성 Android studio에서 project를 생성한다. Activity 선택 화면에서 Google Maps Activity를 선택한다. permission설정과, 인증 Key 설정 코드를 추가해야한다. app\src\main\AndroidManifest.xml   <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>   <uses-permission android:name="android.permission.INTERNET"/> res\values\google_maps_api.xml <!-- YOUR KEY에 KEY를 추가해준다 --> <string name="google_maps_key" templateMergeStrategy="preserve" translatable="false">YOUR KEY</string> SHA1 KEY 생성 Path 에 java path 추가  path를 추가하면 keytool 명령을 사용할 수 있다  # C:\Users\student\.android 위치에서 cmd 창을 실행한다 > keytool -list -v -keystore debug.keystore -storepass android -keypass android  # Key가 생성됌  인증서 지문:  SHA1: D8:A3:7B:10:4C:AE:13:E5:CC:A8:E6:61:5B:F7:0A:5B:4A:3B:F6:77  SHA256: D1:D1:06:36:4C:41:E7:63:E3:12:13:62:1D:53:DE:67:30:02:2E:EF:82:B1:B2:BC:11:1C:97:66:0A:DF:6C:E0 서명 알고리즘 이름: SHA1withRSA 주체 공용 키 알

[Android] Web과 App의 연동

javascript에서 App에 있는 함수를 호출하기 위해서는 함수에 아래와 같은 Annotation이 있어야한다. @android.webkit.JavascriptInterface  webView에 사용할 인터페이스를 설정해야한다. JS라는 클래스를 사용하고, HTML에서 "js"라는 이름으로 호출 하겠다는 설정을 해준다. webView.addJavascriptInterface(new JS(), "js"); final class JS { JS() { } @android.webkit.JavascriptInterface public void clickJS(String a) { textView.setText(a); Log.d("[35]", "Event process........... " + a); } } Web에서 window.js로 App 함수 호출하는 방법 <!-- HTML5 --> <button onclick = "window.js.clickJS('Web message')">Android Call</button> App에서 Web에 있는 javascript 함수를 호출하는 방법 // 오류 발생하는 경우 // webView 는 새로운 Thread에서 실행시킬 수 없다. // 아래와 같이 새로운 Thread를 생성하면 오류가 발생한다. // All WebView methods must be called on the same thread.    public void clickBt(View v) {              new Thread(                     new Runnable() {                         @Override                        publ

[Android] 화면전환

Android 화면 전환하는 다양한 방법 화면을 전환하는 방법에는 Intent를 사용해 Activity 전환을 하는 방법, InflaterLayout을 사용해 Activity안에있는 layout을 전환하는 방법, Fragment를 사용하는 방법이있다. Intent //P260 Intent intent = new Intent(getApplicationContext(), SecondActivity.class); intent.putExtra("num1", 1000); startActivityForResult(intent, 100); InflaterLayout Activity를 상속받은 Class에서만 getSystemService() 를 호출할 수 있다. 다른 클래스에서는 Activity에서 생성될 때 context를 넘겨줘야 한다. static LinearLayout container; LayoutInflater inflater; inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.serve, container, true); FrameLayout FrameLayout안에 LinearLayout을 여러 개 추가해서 visible, invisible 방식으로 레이아웃을 관리한다. Fragment // Fragment를 만들 때는 Fragment를 상속받아서 만든다 public static class MainFragment extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { // mainlayout을 container 에 붙인다

[Android] Activity lifecycle

이미지
Activity Lifecycle onCreate(Bundle savedInstanceState) 액티비티가 처음 만들어졌을 때 호출된다. 이 함수는 savedInstanceState를 매개변수로 받는다. savedInstanceState는 Bundle 객체로 Activity에 저장되어 있는 상태정보를 포함하고 있다. Activity가 처음 생성된 경우 이 값은 null이다. onStart() 액티비티가 화면에 보이기 바로 전에 호출된다 액티비티가 화면상에 보이면 이 메소드 다음에 onResume() 메소드가 호출된다 액티비티가 화면에서 가려지게 되면 이 메소드 다음에 onStop() 메소드가 호출된다 onResume() 액티비티가 사용자와 상호작용하기 바로 전에 호출된다 onRestart() 액티비티가 중지된 이후에 호출되는 메소드로 다시 시작되기 바로 전에 호출된다 이 메소드 다음에는 항상 onStart() 메소드가 호출된다 onPause() 또 다른 액티비티를 시작하려고 할 때 호출된다 저장되지 않은 데이터를 저장소에 저장하거나 애니메이션 중인 작업을 중지하는 등의 기능을 수행한다 onStop() 메서드가 리턴하기 전에는 다음 액티비티가 시작될 수 없으므로 이 작업은 매우 빨리 수행된 후 리턴되어야 한다 액티비티가 이 상태에 들어가면 시스템은 액티비티를 강제 종료할 수 있다 onDestroy() 액티비티가 소멸되어 없어지기 전에 호출된다 이 메소드는 액티비티가 받은 마지막 호출이 된다. 액티비티가 애플리케이션에 의해 종료되거나(finish()등의 호출) 시스템이 장제로 종료시키는 경우에 호출시킬 수 있다 위의 두 가지 경우를 구분할 때 isFinishg() 메소드를 이용한다. 액티비티가 이 상태에 들어가면 시스템은 액티비티를 강제 종료할 수 있다 public class MainActivity extends AppCompatActivity { @Override protecte

[Android] WebView

이미지
WebView는 웹페이지를 App안에 넣고 싶은 경우에 사용한다.  xml 파일에 Palette > Widgets 에서 추가 할 수 있다 웹뷰 설정 WebSettings 객체에 웹뷰의 설정 정보가 들어 있다. 이 객체는 getSettings() 메서드를 사용해 참조할 수 있으며 캐시 여부, 폰트 크기 설정, 화면 확대 여부, 자바스크립트 허용 여부 등을 설정할 수 있다. WebView wv = findViewById(R.id.wv); wv.setWebViewClient(new WebViewClient()); // javascript 허용 wv.getSettings().setJavaScriptEnabled(true); // 웹페이지를 로딩하여 화면에 보여준다 wv.loadUrl("https://yumdevelop.blogspot.com"); Error  [ net::ERR_CACHE_MISS ] 바로 실행할 경우 오류가 발생한다. WebView를 사용할 때 인터넷에 접속하기 때문이다. network를 통해 웹페이지에 접속하기 위해서 인터넷 접속 권한 환경설정이 필요하다. 아래와 같이 Manifest.xml 파일에 permission 태그를 추가한다. <!-- app > manifests > AndroidManifest.xml --> <uses-permission android:name="android.permission.INTERNET"/> 화면에 WebView를 추가한 결과

안드로이드 기본 구조

이미지
안드로이드 구조 app [manifest] AndroidManifest.xml app의 환경설정 파일, icon, title 등 설정 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.student.p181"> <application android:allowBackup="true" android:icon="@mipmap/icon" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> [j

R - Database 와 연동하기

R - Oracle JDBC 연동하기 oracle jdbc 계정생성 Oracle JDBC 와 연동 library(rJava) library(RJDBC) library(DBI) drvName <- 'oracle.jdbc.driver.OracleDriver'; id <- 'ruser' pwd <- '111111' url <- 'jdbc:oracle:thin:@localhost:1521:XE' # 1. Driver Loading drv <- JDBC(driverClass = drvName,             classPath = 'c:\\java_hive_lib\\ojdbc6.jar') # 2. Connection conn <- dbConnect(drv, url, id, pwd) # 3. Statement sqlstr <- 'SELECT MONTHS_BETWEEN(sysdate,hiredate) AS day, sal FROM emp' # 4. ResultSet emp <- dbGetQuery(conn, sqlstr);< # 5. Close dbDisconnect(conn) library(ggplot2) p <- ggplot(emp, aes(x = DAY, y = SAL)) + geom_line() library(plotly) ggplotly(p) R - Hive 연동하기 R에서 hive에 접근하기 위해 Linux에서 Hive service를 실행시킨다. # 하둡실행 > start-all.sh # hive service 실행 > hive --service hiveserver Driver와 URL 만 바꾸면 다른 database와 연동가능 library(rJava) library(RJDBC) library(DBI) # Hive 연동 (Linux : server1) drvName &l

R 인터랙티브 그래프 그리기

이미지
인터랙티브 그래프(Interactive Graph) 마우스 움직임에 반응하며 실시간으로 형태가 변하는 그래프다. HTML 포맷으로 저장 가능하며, 일반 사용자들도 웹 브라우저를 통해 그래프를 조작할 수 있다. plotly plotly Document ggplot 그래프를 인터랙티브 그래프로 바꿔준다.  > install.packages('plotly') library(plotly) library(ggplot2) # 배기량(displ)에 따른 고속도로연비(hwy) , 구동방식(drv) p <- ggplot(data = mpg, aes(   x = displ,    y = hwy,     col = drv )) + geom_point() ggplotly(p) HTML 파일로 저장 Viewer > Save as Web Page htmlwidgets 사용하는 방법 > install.packages('htmlwidgets') library(htmlwidgets) # 위에서 사용한 p(ggplot Graph) 사용 pp <- ggplotly(p) saveWidget(pp, file = "aa.html")

[R 함수] KoNLP 패키지 이용해 한글 분석

이미지
KoNLP 패키지를 이용해 블로그를 분석한 결과 KoNLP(Korean Natural Language Processing) 패키지 KoNLP github 한글 자연어 분석 패키지로 한국어를 분석할 수 있는 총 27개의 함수가 들어 있다. KoNLP 패키지를 사용하기 위해서는 rJava, memoise 패키지가 필요하다. 패키지 설치 install.packages("rJava") install.packages("memoise") install.packages("KoNLP") 패키지 로드 library(rJava) library(memoise) library(KoNLP) library(dplyr) library(stringr) rJava 설치되어 있는 jdk 를 연동하는 역할 rJava를 설치한 후 library를 로드하면 오류가 발생한다. error : JAVA_HOME cannot be determined from the Registry solution : 환경변수 setting system 변수에  JAVA_HOME C:\Program Files\Java\jdk-9.0.4 추가 memoise stringr 특수문자 제거를 위해 사용 텍스트 파일에 있는 한글 분석 useNIADic(); txt <- readLines('hiphop.txt') head(txt) install.packages('wordcloud')

[R 함수] ggplot2 패키지를 이용해 그래프 만들기

이미지
ggplot2 는 The Grammar of Graphics에 기반하여 그래프를 만드는 시스템이다.  ggplot2에 data를 제공하고, 변수들을 어떻게 매핑할 지, 어떤 방법으로 그래프를 그릴지 설정한다. ggplot2를 처음 사용할 때 배우기 좋은 사이트 http://r4ds.had.co.nz/data-visualisation.html http://r4ds.had.co.nz/graphics-for-communication.html https://www.datacamp.com/courses/data-visualization-with-ggplot2-1 배경 설정하기 ggplot(data = mpg, aes(x = displ, y = hwy)) 그래프 추가하기 산점도(Scater Plot) geom_point() 축 범위를 조정하는 설정 xlim() , ylim() 막대 그래프(Bar Chart) 집단 간 차이 표현하기  geom_col() : 평균 막대 그래프 막대의 높이가 데이터의 값을 나타내도록 하려면 geom_col()을 사용한다. 데이터를 있는 그대로 남겨둔다.  geom_bar() : 빈도 막대 그래프 x의 위치에 나타나는 각 그룹의 빈도 수를 나타낸다. ( 또는 가중치의 합계)   # "suv" 차종을 대상으로  # 평균 cty 가 가장 높은 회사 다섯 곳을 막대 그래프로 표현  # 막대는 연비가 높은 순으로 정렬  mpg.suv <- mpg[ mpg$class == "suv", c('cty', 'manufacturer', )]  result2 <- aggregate(cty~manufacturer, mpg.suv, mean) result2 <- head(result2[order(result2$cty, decreasing = T), ], 5)  ggplot(data = result2, aes(x = manufacture