라벨이 개발인 게시물 표시

책리뷰- Node.js 교과서 2판 2020년

광범위한 분야를 다루고 있다.  각종 설치에 대해 스샷으로 자세해서 초보에게 좋다. 각 분야에 대한 진입점이 될 수 있다. 검색에 드는 시간을 줄여 준다. 자바스크립트나 웹개발에 대한 기반 지식이 있어야 무리 없이 읽을 수 있다. 총평. 초보라면 레퍼런스로 보유하는 것도 좋다. 초보를 벗어났다면 "한 권으로 끝내는 Node & Express"(한빛미디어)가 더 괜찮다.

오픈소스 자바 런타임 설치. OpenJDK. java runtime Environment.

오픈소스 자바 런타임 설치. 자바 라이센스가 변경되어 오라클 자바는 무료가 아닙니다. 간단히 설명하면 개발, 개인사용 등의 목적이 아니면 돈을 내고 사용해야 합니다. 자세한 사항은 아래 라이센스 문서를 참고한다. Oracle Technology Network License Agreement for Oracle Java SE https://www.oracle.com/downloads/licenses/javase-license1.html 라이센스가 바뀐 이후부터 자바를 상업용으로 무료로 사용하려면 무료로 공개된 자바 런타임을 사용해야 한다.  무료들은 배포만 할 뿐 사후 지원을 해주진 않는다.  사후 지원이 필요하면 오라클에 돈을 내야 한다. JDK에는 JRE가 포함되어 있다.  보통 JRE만 따로 배포하지 않으므로 JDK을 받아 설치해야 한다. JRE, JDK가 무엇인 지에 대한 참고 사항. - JRE(java runtime Environment)는 자바로 만든 프로그램을 실행할 수 있게 해주는 것이다. - JDK(Java Development Kit)는 자바 프로그램을 만들 수 있는 개발킷이다. 윈도우에서는 msi 확장자 파일을 받아 자동설치 하는게 편하다. 윈도우에서는 java_home 환경변수를 설정해야 자바프로그램이 실행된다. zip으로 받으면 몇 가지 설정을 직접 해야 한다. 아래 위키에 OpenJDK 들의 리스트가 정리되어 있다. https://en.wikipedia.org/wiki/OpenJDK 가장 신뢰할 수 있는 배포처. http://openjdk.java.net/ https://www.microsoft.com/openjdk https://aws.amazon.com/ko/corretto/ https://adoptium.net/ 가장 배포가 빠른곳. https://github.com/ojdkbuild/ojdkbuild

TL866 프로그래머를 사용하여 attiny85에 아두이노 바이너리를 업로드 하는 방법.

이미지
기록 저장용으로 글을 작성 합니다. 이 방법보단 usbasp를 사서 하는게 더 간편할 거 같습니다. TL866 프로그래머를 사용하여 attiny85에 아두이노 바이너리를 업로드 하는 방법. 아래 이미지를 클릭하면 크게 볼수 있습니다. - 설치. 아두이노 IDE. https://www.arduino.cc TL866 프로그래머 설치. http://www.autoelectric.cn/en/download.html - 작업 순서. 파일 - 환경설정 에서  '추가적인 보드 매니저 URLs' 에  아래 링크를 기입합니다. https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json 다음 동작중 자세한 출력 보이기 '컴파일' 을 체크합니다. 툴 - 보드 매니저 를 클릭합니다. 사진에 보이는 attiny 를 검색하여 설치합니다. 위 이미지의 설정을 셋팅합니다. 포트는 설정하지 않아도 됩니다. 스케치 - 컴파일된 바이너리 내보내기 를 싱행합니다. 아래 로그에서 hex 확장자 파일이 attiny85에 업로드할 바이너리 입니다. Select IC 를 ATTINY85 로 세팅합니다. 파일 - 오픈 하여  아두이노에서 컴파일한 hex 확장자 파일을 엽니다. file load options 는 위의 그림과 같이 합니다. ATTINY85 칩을 장작한 후에 Device - Program 를 클릭합니다. 위와 같은 창이 열리면 Program 을 클릭하면 됩니다.

Visual Studio 빌드 후 이벤트 명령줄.

 프로젝트 속성 -> 빌드 이벤트 -> 빌드 후 이벤트 명령줄. 하위 폴더까지 복사할때. xcopy "$(ProjectDir)$(OutDir)*" "$(ProjectDir)_exe\" /E /Y 파일만 복사할때. copy /Y "$(ProjectDir)$(OutDir)*" "$(ProjectDir)_exe\" /Y 덮어쓸때 물어보지 않고 덮어씀. /E 빈폴더 포함하여 폴더 복사. xcopy 만. "$(ProjectDir)$(OutDir)*" 빌드한 파일들의 경로. "$(ProjectDir)_exe\" 프로젝트 폴더에 "_exe" 폴더의 경로.

istio, kubernetes, msa 간단 설명.

msa(MicroService Architecture) 예전 서버는 대체로 계정, UI, 로직이 하나의 프로그램에 구현되어 있었다. 이를 Monolithic Architecture 이라고 한다. MicroService Architecture는 계정, UI, 로직을 다른 프로그램으로 구현하고 경우에 따라 머신도 나눈 것이다. istio  msa(MicroService Architecture)가 머신, 프로세스가 여러군데로 분산되어 있어 통신할 수 있는 수단으로 사용한다. 대체로 보안, 모니터링 등의 부가기능을 붙여서 사용한다. kubernetes 바이너리, 라이브러리, OS설정 등을 컨테이너에 담아 일원화 하여 배포한다. msa(MicroService Architecture)가 여러개의 단위로 나뉘어 개발되다 보니 일원화된 OS, 런타임 환경 구성에 많은 자원이 소모되게 된다. 이를 해결하기 위한 기술이다. 결론. PC업계가 점차 한계산업으로 이행되어 고도화된 회사들은 글로벌한 거대한 서비스를 하게 됐다. 예로 구글, 애플, 아마존 등이 있다. 또한 IT기술의 대중화로 국가 서비스가 IT로 이뤄진다. msa는 분산처리의 간편함으로 대용량 서비스를 원활하게 할수 있고 부차적으로 개발의 단순화, 유지보수의 단순화 등을 이뤄 서비스에 비지니스 적용이 신속하고 안정적으로 이뤄질수 있게 한다.  msa로 구현된 서비스의 배포를 쉽게 하기 위해 kubernetes가 사용되고 MicroService간에 통신을 하기위해 istio가 사용된다. msa, istio, kubernetes는 구글, 애플, 아마존, 국가서비스 같이 거대한 서비스를 하는데 적합한 기술이다. 구현하려는 서비스의 규모와 성격에 따라 선택하거나 일부분만 따로 선택해 사용할수 있다.

android Settings Activity 구현. kotlin

아래와 같이 액티비티를 추가한다. Android Studio  File - New - Activity - Settings Activity  res - xml 에 root_preferences.xml 와 비슷한 파일명을 열어 아래와 같이 수정한다. Activity <PreferenceScreen xmlns: app ="http://schemas.android.com/apk/res-auto" xmlns: android ="http://schemas.android.com/apk/res/android" > <PreferenceCategory app :title ="@string/messages_header" > <EditTextPreference app :key ="test1" app :title ="@string/signature_title" app :useSimpleSummaryProvider ="true" /> <SeekBarPreference app :key ="test2" app :title ="font sizw" app :iconSpaceReserved ="false" app :showSeekBarValue ="true" app :defaultValue ="15" app :min ="10" android :max ="35" /> <ListPreference app :defaultValue =

android RecyclerView 심플 구현. kotlin

텍스트뷰만 있는 간단한 RecyclerView 구현이다. activity layout xml 파일에 RecyclerView 을 추가한다. <androidx.recyclerview.widget.RecyclerView android :id ="@+id/text_list" android :layout_width ="match_parent" android :layout_height ="match_parent" app :layoutManager ="androidx.recyclerview.widget.LinearLayoutManager" /> listitem_contents.xml 파일을 layout 폴더에 추가한다. <? xml version ="1.0" encoding ="utf-8" ?> <TextView xmlns: android ="http://schemas.android.com/apk/res/android" android :id ="@+id/item_text" android :layout_width ="match_parent" android :layout_height ="wrap_content" android :gravity ="center_vertical" android :paddingStart ="?android:attr/listPreferredItemPaddingStart" android :paddingEnd ="?android:attr/listPreferredItemPaddingEnd" /> Adapter 클래스를 추가한다. class ContentsAdapter( private val textList : Muta

android getSharedPreferences 사용법. kotlin

getSharedPreferences을 사용하면  키-값 데이터 저장을 위해 간단하게 사용할 수 있다. Androd studio 오른쪽 하단의 Device Explorer를 열면 저장된 폴더에 접근할 수 있다. 저장 폴더의 위치는 다음과 같다. /data/data/{packageName}/shared_prefs/ getPreferences도 동일하게 사용할 수 있다. getSharedPreferences는 프로젝트의 모든 곳에서 동일한 키값에 접근할 수 있지만  getPreferences는 호출된 액티비티에서만 접근할 수 있다. 코드. private fun load () { val sharedPref = getSharedPreferences( "configApp" , Application. MODE_PRIVATE ) val configVersion = sharedPref.getString( "configVersion" , "" ) } private fun save () { val sharedPref = getSharedPreferences( "configApp" , Application. MODE_PRIVATE ) val editor: SharedPreferences.Editor = sharedPref.edit() editor.putString( "configVersion" , "appVersion" ) editor.commit() }

android 전역 폰트 변경. kotlin

사용하는 테마 설정에 android:typeface 을 추가한다. 코드를 실행한다. 코드 실행후 현재 액티비티에 적용하려면 액티비티 리스타트를 해야 한다. styles.xml <style name ="AppTheme" parent ="Theme.AppCompat.DayNight.DarkActionBar" >      <item name ="android:typeface" > serif </item> </style> 코드. fun setFont (defaultFontNameToOverride: String , newFontFileNameInAssets: String): Boolean { try { val fontMaintext = Typeface.createFromAsset(context(). assets , newFontFileNameInAssets) val defaultFontTypefaceField: Field = Typeface:: class . java .getDeclaredField(defaultFontNameToOverride) defaultFontTypefaceField.setAccessible( true ) defaultFontTypefaceField.set( null, fontMaintext ) } catch (e: java.lang.Exception) { return false } return true } 액티비티 리스타트. val intent: Intent = getIntent() finish() startActivity(intent)

android theme 다크 테마 구현. kotlin

스타일은 DayNight 를 상속받게 해야한다.  이후 setTheme 로 적용한다. setTheme 실행후 현재 액티비티에 적용하려면 액티비티 리스타트를 해야 한다. styles.xml <style name ="AppTheme" parent ="Theme.AppCompat.DayNight.DarkActionBar" > 코드. val LIGHT_THEME = "light" val DARK_THEME = "dark" val DEFAULT_THEME = "system" fun setTheme (themeName: String) { when (themeName) { LIGHT_THEME -> { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate. MODE_NIGHT_NO ) } DARK_THEME -> { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate. MODE_NIGHT_YES ) } else -> { if (Build.VERSION. SDK_INT >= Build.VERSION_CODES. Q ) { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate. MODE_NIGHT_FOLLOW_SYSTEM ) } else { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate. MODE_NIGHT_AUTO_BATTERY ) } } } } 액티비티 리스타트. val intent: Intent

android RecyclerView의 TextView에서 textIsSelectable ="true "가 작동하지 않을때 해결방법.

android  RecyclerView의 TextView에서 textIsSelectable ="true "가 작동하지 않는다. - 증상. 리스트 상단에서는 텍스트 선택이 되다가 하단으로 스크롤 시키면 텍스트가 선택되지 않는다. - 해결. Adapter의 onBindViewHolder에 다음과 같은 코드를 추가한다. override fun onBindViewHolder (holder: TextHolder , position: Int) { holder.textView.setTextIsSelectable( false ) ; holder.textView.measure(- 1 , - 1 ) ; holder.textView.setTextIsSelectable( true ) ; } - 출처. https://stackoverflow.com/questions/36801486/androidtextisselectable-true-not-working-for-textview-in-recyclerview

안드로이드 툴바 ScrollView 스크롤시 툴바 감추기. kotlin

NestedScrollView 대신 ScrollView로 스크롤시 툴바를 감출수 있다. ScrollView에 다음 속성을 넣어주면 된다. android:nestedScrollingEnabled="true" app:layout_behavior="@string/appbar_scrolling_view_behavior" <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns: android ="http://schemas.android.com/apk/res/android" xmlns: app ="http://schemas.android.com/apk/res-auto" android :id ="@+id/coordinator" android :layout_width ="match_parent" android :layout_height ="match_parent" android :fitsSystemWindows ="true" > <com.google.android.material.appbar.AppBarLayout android :id ="@+id/appBarLayout" android :layout_width ="match_parent" android :layout_height ="wrap_content" > <androidx.appcompat.widget.Toolbar android :id ="@+id/toolbar" android :layout_width ="match_parent" android :layout_height ="?attr/actionBarSize"

Visual Studio Code(VS Code) Settings Sync 설정 동기화가 내장기능이 됐습니다.

이미지
설정 동기화가 VS Code의 내장 기능으로 출시 됐습니다. ms나 github 계정으로 로그인하고 기능을 켜주면 됩니다. 셋팅 가이드. https://code.visualstudio.com/docs/editor/settings-sync July 2020 (version 1.48) 버전부터 지원합니다. https://code.visualstudio.com/updates/v1_48

kotlin SharedPreferences Generic MutableList 읽기, 쓰기.

https://stackoverflow.com/questions/7361627/how-can-write-code-to-make-sharedpreferences-for-array-in-android stackoverflow 에 올라온 코드를 참조해 제네릭하게 만들어 봤습니다. 사용법은 아래와 같습니다. val sharedPref = getSharedPreferences("config", MODE_PRIVATE) setArrayPref<String>(sharedPref, "testList ", <<inList>> ) val testList = getArrayPref<String>(sharedPref, "testList") fun < T > setArrayPref (prefs: SharedPreferences , key: String , values: MutableList< T >) { val editor = prefs.edit() val jArray = JSONArray() for (i in 0 until values. size ) { jArray.put(values[i]) } if (values. isNotEmpty ()) { editor.putString(key , jArray.toString()) } else { editor.putString(key , null ) } editor.commit() } fun < T > getArrayPref (prefs: SharedPreferences , key: String): MutableList< T > { val json = prefs.getString(key , null ) val list = mutableListOf < T >() if (json

python 실행파일 만들기.

1. pyinstaller을 설치합니다. pip install pyinstaller 2. exe로 만들 파이썬 파일이 있는 폴더에서 아래 명령어를 실행합니다. pyinstaller -w -F test.py -w 콘솔창 뜨지 않게 하기. -F 실행파일 하나만 만들기. 3. dist 폴더안에 실행 파일이 있습니다.

Kotlin 문법 정리.

// 주석. /* 주석 */ // private 현재 파일에서만. // internal 같은 모듈에서만.  // protected 상속받은 클래스에서. class Test {     // Double, float, Long, int, Short, Byte, String, Char     val hello : String = """ hi                             hello """     // val 읽기 전용, var 쓰기 가능.     val a: Int = 1       var b: Int? = null       // lateinit 늦은 초기화.     lateinit private var mHandler: Handler     fun voidFunc() {}     fun sum(a: Int, b: Int) = a + b     fun sum(a: Int, b: Int = 10): Int { return a + b }     // int? 널타입 리턴 가능.     fun parseInt(str: String): Int? { return null }          fun NullCheck() {         var aa: Int? = 11         var bb: Int? = null           var cc: Int = aa!! // !! 널이 아님을 보증.         var str: String? = null         var ch : Char = str?.get(1) // ?. 널이 아닐때 호출         var ch2 : Char = str?.get(1) ?: 'a' // ?: 널일때 호출     }     fun StringTemplates() {          val s1 = "a is $a"          val s2 = "${s1.replace("is", "was&qu

Kotlin 개발 참고.

https://kotlinlang.org https://kotlinlang.org/docs/reference/  - 레퍼런스. https://play.kotlinlang.org  - 온라인 연습. https://kotlinlang.org/docs/reference/basic-syntax.html  - 간단 문법. https://play.kotlinlang.org/byExample/overview  문법 예제. https://github.com/android/user-interface-samples  - 실제 사용예를 볼수 있다. https://kotlinlang.org/docs/reference/collections-overview.html  - 콜렉션. https://kotlinlang.org/docs/reference/functions.html  - 함수, 람다. https://kotlinlang.org/docs/reference/classes.html  - 클래스. https://kotlinlang.org/docs/reference/coroutines/coroutines-guide.html  - 코루틴. https://kotlinlang.org/api/latest/jvm/stdlib/  - Kotlin Standard Library.

android studio assets raw 차이.

res/, assets/ - res 레이아웃, 아이콘 등이 위치하며 R클래스로 편리하게 접근할 수 있다. 즉 컴파일러가 데이터 처리를 위한 각종 동작을 한다. 파일 이름이 소문자, 숫자, 마침표, 언더바 로만 구성. - assets 모든 유형의 파일을 포함할 수 있고 파일 이름 제약이 거의 없다. apk 파일을 열어보면 보인다. 즉 사전처리 하지 않고 apk에 포함 시킨다. 여러 이름으로 여러개의 폴더를 만들수 있다. AssetManager로 접근할 수 있다. 읽기 전용. - 결론. 이미지, xml, 폰트 등 아래 링크에서 지원하는 형태의 데이터는 res 를 사용하면 된다. https://developer.android.com/guide/topics/resources/available-resources?hl=ko res에서 지원하지 않거나 이런 저런 이유로 직접 컨트롤하는 데이터는 assets을 사용하면 된다. R클래스를 사용할 수 없어서 좀 불편하긴 하지만 아무데나 만능으로 사용할 수 있다.

tkinter 파이썬 기본 UI 프레임 - 파일, 폴더 선택 등.. python

이미지
파일, 폴더 경로명 적어주기 귀찮아서 만들었습니다. tkinter는 파이썬에 기본으로 들어있어 따로 라이브러리를 설치할 필요 없습니다. 파이썬으로 간단한 프로그램 만들때 사용할 기본 UI 프레임. 파일 선택, 폴더 선택, 텍스트 에디터, Run 으로 구성. import tkinter import tkinter . filedialog import tkinter . messagebox def open_file ():     path = tkinter . filedialog . askopenfilename (         initialdir = "/" ,         title = "Select file" ,         filetypes =(( "txt files" , "*.txt" ), ( "all files" , "*.*" )),     )     return path def save_file ():     path = tkinter . filedialog . asksaveasfilename (         initialdir = "/" ,         title = "Select file" ,         filetypes =(( "txt files" , "*.txt" ), ( "all files" , "*.*" )),     )     return path def select_folder ():     path = tkinter . filedialog . askdirectory ()     return path def select_file ():     path = tkinter . filedialog . askopenfilename ()     return path def insert_text ( str

flutter MaterialApp - themeMode, theme, darkTheme

themeMode -  App 테마를 선택한다. light - OS 시스템 설정에 관계없이 항상 라이트 모드. theme 사용. dark - OS 시스템 설정에 관계없이 항상 다크 모드. darkTheme 사용. darkTheme가 null이면 테마 사용으로 대체됨. system - OS 시스템 설정에 따른다. 기본값이다. API 문서에 이런 말도 있습니다. MediaQuery.platformBrightnessOf가 Brightness.light 라면 theme가 사용된다. Brightness.dark인 경우 darkTheme가 사용된다.  darkTheme  themeMode가 dark이거나 시스템 설정이 dark 일때 사용됩니다. ThemeData.brightness가 Brightness.dark으로 설정되어야 합니다. darkTheme가 null일 경우 Theme가 대신 사용됩니다. darkTheme가 null이고 Theme도 null이면 ThemeData.light()로 설정됩니다. Theme themeMode가 light 이거나 시스템 설정이 light 일때 사용됩니다. 사용방법. Theme, darkTheme에 ThemeData(테마 속성 세부값)을 세팅한다. themeMode 를 어떻게 사용할지 정하여 사용한다. 참고. https://api.flutter.dev/flutter/material/MaterialApp/theme.html https://api.flutter.dev/flutter/material/MaterialApp/darkTheme.html https://api.flutter.dev/flutter/material/MaterialApp/themeMode.html https://api.flutter.dev/flutter/material/ThemeData-class.html