안녕하세요~

오늘은  음악 및 악기 커뮤니티 킵플에서 개발한

새로운 기능에 대해 소개드리겠습니다.

 

음악이란 처음 배우는 과정부터 학원에 등록해서 레슨을 받아야 하고,

장비나 소음 문제에서 자유로우려면 연습실이나 합주실을 대관해야 합니다.

또 음반을 내거나 레코딩을 하려면 녹음실이 필요하죠.

 

이렇게 음악 활동을 하려면 다양한 장소들을 알아보고 방문해야 하는데요,

이런 상황들을 위해서 각종 장소를 좀 더 편하게 찾을 수 있으면 좋지 않을까?

라는 생각이 들었고 최근 많아진 부동산 분석 서비스에서 지도와 연동하여

아파트 정보를 보여주는 서비스에서 영감을 얻었습니다.

부동산 데이터를 활용하여 분석하는 서비스인 '리치고'

 

부동산에서 가장 중요한 시세 정보를 이렇게 한 눈에 전부 들여다 볼 수 있으니

과거처럼 부동산에 들러서 일일히 매물을 알아보고 할 필요가 줄어들어서

사용자들에게는 정말 편리한 서비스가 아닐 수 없죠.

 

저도 위와 같은 아이디어에 감명을 받고 킵플에 적용해보기로 했습니다!

킵플에서 도입한 현재 업체정보 지도 (계속 편의성 업데이트 예정!)

https://keepl.co.kr/location

 

↓ ↓ ↓ ↓ ↓  관심있으신 분들은 구경해보세요      ↓ ↓ 

 

업체정보

전국의 악기 수리점, 학원, 연습실, 녹음실 등 장소 정보를 제공합니다.

keepl.co.kr

 

위와 같이 전국에 있는 업체 정보를 표시해서

사용자들이 주변에 있는 좋은 시설들을 이용하는 데

도움을 주고자 이번 "업체정보 지도" 를 만들 게 되었습니다!

 

아직은 UI도 빈약하고 데이터도 부족하지만

점차 개선해나가서 음악인들에게 정말 필요한 정보를 계속해서 제공할 수 있는

킵플이 되도록 노력하겠습니다!

 

글 읽어주셔서 감사드리고~

킵플 코드악보, 중고거래 등 여러 기능이 있으니 많은 이용 부탁드립니다!

 

 

https://keepl.co.kr

 

킵플 - 소리와 열정이 만나는 곳

국내 최고의 악기 커뮤니티를 지향하는 킵플 입니다. 커뮤니티, 중고거래, 코드악보, 회원 연주영상

keepl.co.kr

 

해당 글은 프로그래머스 사이트의 코딩테스트 연습 중

Lv3. 오랜 기간 보호한 동물(2) 문제의 풀이 입니다.

 

https://school.programmers.co.kr/learn/courses/30/lessons/59411

 

풀이

SELECT AI.ANIMAL_ID, AI.NAME FROM ANIMAL_INS AI 
LEFT JOIN ANIMAL_OUTS AO ON AI.ANIMAL_ID = AO.ANIMAL_ID
ORDER BY DATEDIFF(AO.DATETIME, AI.DATETIME) DESC
LIMIT 2;

 

DATEDIFF 함수 : ([단위], 시작날짜, 끝날짜) 로 시간의 간격을 알 수 있음. 

안녕하세요~ 전국의 뮤지션 여러분들!

또 오랜만에 새로운 소식으로 블로그에 글을 쓰게 되었습니다.

 

기존에 존재하던 커뮤니티들 중에서 제대로 뮤지션들이 활동할만한 커뮤니티가

없다는 생각이 들어서 또 직접 만들어버린 사이트입니다. 😄

 

사이트 이름은 킵플 (Keepl) 이고, 과거에는 열심히 낭만을 쫒으며 기타를 쳤지만

현재는 일상에 찌들어버려서 음악을 할 여유가 사라져버린 저 자신을 포함한 여러 사람들을 위해

악기 연주를 놓지 말자 (Keep playing) 의 약자로 지었습니다.

 

정말 좋은 뜻이죠 ㅎㅎ

 

https://keepl.co.kr

 

킵플 - 소리와 열정이 만나는 곳

국내 최고의 악기 커뮤니티를 지향하는 킵플 입니다. 악기별 커뮤니티, 유머, 회원 연주영상, 레슨, 구인/구직, 코드악보, 중고거래, 블라인드 테스트

keepl.co.kr

 

자.. 그렇다면 기존에 존재하던 사이트들과는 차이점이 뭐냐??

사실 별 다를것은 없습니다.

 

하지만!

그래도 기왕 글을 쓴 김에 대표 메뉴 몇 개만 소개해보도록 하겠습니다.

먼저, 활동의 가장 기본이 되는 커뮤니티 메뉴입니다.

 

- 커뮤니티 메뉴

다양한 악기 연주자들을 위하여 악기별 주제로 대화할 수 있는 게시판 형식의 커뮤니티입니다.

 

저는 과거 기타를 연주하면서 항상 했던 생각이 있습니다.

바로.. '왜 악기 연주는 주류가 될 수 없을까' 입니다.

그래서 악기가 메인 주제로 누구나 편하게 대화할 수 있는 창구가 있으면 좋겠다는 생각으로

이런 형태의 게시판이 탄생하게 되었습니다.

본인이 좋아하는 악기에 대해서도 대화할 수 있으며

자연스럽게 다른 커뮤니티로 넘어가서 평소에 잘 접하지 않던 다른 악기도 접할 수 있죠.


(디자인은 추후에 점차 개선해나갈 예정입니다.)

 

- 코드악보 게시판

순수히 웹페이지 요소로 노가다스럽게 만들었습니다.. 무려 재생도 되고 웹상에서 제작/편집도 됨

 

현재로서 가장 필살기로 내세울 수 있는 기능인 코드악보 게시판 소개드립니다!

친절하게 기타 지판으로 코드 모양까지 알려주고, 재생 버튼을 누르면 음이 나오면서 재생도 됩니다.

그리고 편집 모드로 들어가면 직접 악보를 제작하거나 편집할 수도 있죠.

기존에 있던 다른 사이트들의 코드악보들은 텍스트/이미지 기반으로 되어있어서

재생이 되면 좋겠다는 생각으로 만들어진 기능입니다.

 

- 아지트 게시판

디X인사이드의 갤X리를 참고하여 만들었습니다. 추후에는 더 많은 악기와 주제로 이야기를 나누면 좋겠다는 생각으로 만들어졌습니다.

 

이미지 설명에 나와있는대로 X시인사이드의 X러리 구조를 참고해서 만들었습니다.

위에서 보셨다시피 커뮤니티는 현재 6개의 악기 주제로 구성되어있지만,

추후에 더 다양한 악기에 대해 이야기하는 게시판이 생길 필요성도 있다고 생각되기 때문에.

누구나 그룹을 만들어 특정 주제로 대화할 수 있는 그룹 개념의 '아지트' 를 도입하게 되었습니다.

 

 

위에서 소개한 커뮤니티, 코드악보, 아지트 외에 다른 게시판도 존재하고 있으며,

킵플은 앞으로 단순 게시판 뿐만 아니라 기존 웹사이트들에는 없는 특별한 기능들을 도입해서

음악인들이 즐겁게 뮤직 라이프를 영위하는 데 도움을 주는 것을 목표로 하고 있습니다.

 

아직은 사이트를 시작한 지 얼마 되지 않았지만 앞으로 꾸준히 개선해서

대한민국 최고의 음악 커뮤니티가 되도록 노력하겠습니다.

 

많은 성원 부탁드립니다😊

 

https://keepl.co.kr/community

 

커뮤니티 홈

여러 악기 주제에 대해서 자유롭게 이야기하는 킵플 커뮤니티입니다.

keepl.co.kr

 

 

- Merge Sort



정렬할 배열을 재귀적으로 정확히 반으로 나누면서 정렬과 병합을 반복하는 형식으로 정렬하는 방법


pseudo code


mergeSort(A[], p, r) {            // A[] : 정렬할 원 배열, p: 현재 함수에서 가리키는 배열의 처음 위치, r: 배열의 마지막 위치

if(p<r) {                       // p가 r보다 작을 경우. 즉, 더 이상 나눌 수 없을 때 까지 분할을 실행

q = (p+r) / 2;         // 배열의 위치 p와 r을 이용해서 중간 값 q를 구함

mergeSort(A, p, q);        // 반으로 나눈 왼쪽 재귀적 실행

mergeSort(A, q+1, r);     // 반으로 나눈 오른쪽 재귀적 실행

merge(A, p, q, r);           // 왼쪽과 오른쪽을 병합

}

}


동작 예)



- Quick Sort


정렬할 배열을 재귀적으로 나누되, 기준점(pivot)을 설정하여 더 큰 값과 작은 값으로 나눠서 정렬하는 방법


pseudo code


quickSort(A[], p, r) {                    // A[] : 정렬할 원 배열, p: 현재 함수에서 가리키는 배열의 처음 위치, r: 배열의 마지막 위치

if(p<r) {                             // p가 r보다 작을 경우. 즉, 더 이상 나눌 수 없을 때 까지 분할을 실행

q = partition(A, p, r);       // pivot을 기준으로 왼쪽과 오른쪽 부분배열로 분할

quickSort(A, p, q-1);        // pivot의 왼쪽 부분배열 재귀적 실행

quickSort(A. q+1, r);        // pivot의 오른쪽 부분배열 재귀적 실행

}

}


동작 예)


기준점(pivot)은 어떤 값으로 해도 상관 없으나, 현재는 각 분할의 가장 오른쪽 값으로 설정했을 경우


i : 기준점보다 작은 값들의 마지막 배열 위치

j : 현재 확인중인 배열 위치

x : 기준점


1. 배열의 처음부터 j번째의 값과 기준점의 값 x를 비교하여 A[j]가 같거나 크면 pass, 적으면 A[i+1] 값과 A[j] 값을 치환한 다음 i를 1 더해줌

(i 앞의 값들은 모두 기준값보다 작고 뒤의 값들은 모두 크도록 만듬)


2. 배열의 값을 전부 확인한 경우에 A[i+1] 값과 A[x] 값을 치환 

(기준값을 기준값보다 작은 부분배열과 기준값보다 큰 부분배열의 사이에 위치시킴)




Merge Sort 보다 Quick Sort가 빠른 이유


- 병합 과정에서 유리함


Merge Sort는 병합 과정의 왼쪽과 오른쪽 데이터를 합치는 동작에서 정렬을 한 번 더 진행해야 한다.

또한, 해당 정렬을 진행하는 과정에서 임시 배열을 하나 생성해야 함.


하지만 Quick Sort의 경우에는 원 배열을 부분배열로 분할하기는 하지만 병합이라는 과정이 없기 때문에

임시 배열을 만들거나 병합 시에 데이터를 재 정렬할 필요가 없음.

Fragment란, 어플리케이션에서 화면에 직접 보이는 공간인 Activity내에서


분할시키고 다른 화면으로 전환할 수 있는 화면 공간의 단위입니다.


Fragment를 이용하려면, 그 상위에 있는 Activity에서 출력할 layout을 제어해줘야 합니다.


하지만 Fragment내부에서 다른 Fragment로 이동하는 것은 그 Fragment가 자신의 하위레벨이 아니기 때문에


내부에서 직접 제어할 수 없으므로, 상위 레벨인 Activity를 호출하여 제어하는 형태가 되어야 합니다.



MainActivity 아래에 A, B, C 라는 3개의 Fragment를 만들었다고 가정 시,


A, B, C Fragment의 내부에서 서로 다른 Fragment로 전환하는 방법입니다.


먼저 MainActivity의 onCreate() 메소드에서 기본적으로 사용할 Fragment공간과 초기 Fragment의 Instance를 전달합니다.


- MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// 화면 전환 프래그먼트 선언 및 초기 화면 설정
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.ContentLayout, StudyFragment.newInstance()).commit();
}


그 다음, 다른 Fragment로 전환할 때 이용할 메소드를 정의합니다.


- MainActivity.java

public void replaceFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.ContentLayout, fragment).commit();      // Fragment로 사용할 MainActivity내의 layout공간을 선택합니다.
}

MainActivity에서든 Fragment 내부에서든 Fragment를 전환할 때 이 메소드를 이용할 예정입니다.



그리고 Fragment 내부에서 다른 Fragment로 전환할 event를 정의합니다.



- StudyFragment.java (study_fragment.xml Layout 이용)

public class StudyFragment extends Fragment {

// 각각의 Fragment마다 Instance를 반환해 줄 메소드를 생성합니다.
public static StudyFragment newInstance() {
return new StudyFragment();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstaceState) {
View view = inflater.inflate(R.layout.study_fragment, null); // Fragment로 불러올 xml파일을 view로 가져옵니다.
Button button1 = (Button)view.findViewById(R.id.study_button); // click시 Fragment를 전환할 event를 발생시킬 버튼을 정의합니다.

button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

// getActivity()로 MainActivity의 replaceFragment를 불러옵니다.
((MainActivity)getActivity()).replaceFragment(NewFragment.newInstance());    // 새로 불러올 Fragment의 Instance를 Main으로 전달
}
});

return view;
}
}

참고로 Activity 하위의 모든 Fragment들이 newInstance() 메소드를 가지고 있어야 화면 전환이 가능합니다.


이걸로 생각보다 간단하게 해결했습니다.

제가 작성하고 있는 앱의 경우 service를 이용하고 있기 때문에


종료되지 않고 폰이 켜져있는 한 계속 실행되고 있습니다.


여기서 Thread를 동작시키고, 앱을 이용하고 있을 때만 Thread를 동작시키고 앱이나 화면이 꺼지면 Thread를 중지시키려 합니다.


하지만 Thread.stop() 기능이 deprecated되었기 때문에 (더 이상의 API에서 지원을 하지 않는 기능이기 때문에)


다른 방법을 찾아보았습니다.



- while( )의 조건을 이용

=> 쓰레드가 동작하는 조건을 결정하는 boolean변수를 하나 만들어 쓰레드의 동작을 제어합니다.


private boolean condition = true;


@Override

public void onDestroy( ) {

super.onDestroy( );

condition = false;

}


MyThread th = new MyThread( );

th.start( );


class MyThread extends Thread( ) {

public void run( ) {

while(condition) {

 . . .

}

}

}


- Thread.interrupt( )를 이용

=> 앞의 방식과 기능은 유사하나 쓰레드의 인터럽트 함수를 사용하는 경우입니다.


MyThread th = new MyThread( );

th.start( );


@Override

public void onDestroy( ) {

super.onDestroy( );

th.interrupt( );

}


class MyThread extends Thread( ) {

public void run( ) {

while(!isInterrupted()) {

 . . .

try {

. . .

} catch (InterruptedException e) {

Thread.currentThread( ).interrupt( );

} catch (Exception e) {

e.printStackTrace( );

}

}

}

}

라즈베리파이3에 라즈비안을 설치할 때 locale관련 설정을 모두 초기로 했을 시,


처음 실행한 다음


sudo apt-get update

sudo apt-get upgrade


한글 폰트를 설치

sudo apt-get install fonts-unfonts-core


한글 입력기를 설치

sudo apt-get install fcitx-hangul


reboot


재부팅한 다음,


- [시작] - [Setting] - [Input Method] 에서 키보드 입력기를 fcitx로 설정해줍니다.


- [시작] - [Setting] - [Raspberry Pi Configuration] - [Localisation] 에 들어가


1. Locale: ko(Korean), Character Set: UTF-8로 설정하고


2. Set Timezone을 서울 시간으로.


3. Set Keyboard를 Model: Generic 105-key (intl) PC, Layout Korean, Variant Korean


설정하면 됩니다.


Ok를 누르면 재부팅되고 설정이 적용됩니다.



fcitx입력기의 기본 한/영 입력 전환키는 [Ctrl] + [Space] 입니다.

실행 화면





clc

clear

delete(instrfindall)


% 시리얼 통신 포트 및 통신 방식 설정

s2 = serial('COM33', 'BaudRate', 115200, 'DataBits', 8, 'StopBits', 1, 'Parity', 'non');

fopen(s2);

time = 0;


% 그래프 x축 최대 크기

x_limit = 1000;


for a = 1:x_limit

   time = time+1;


   % 시리얼 통신으로 전송받은 string 데이터 저장

   accel = (fscanf(s2));

   

   % string형으로 받아온 데이터를 tokenizer(공백이나 쉼표 등)로 분리하여 data행렬에 저장 

   [data, tf] = str2num(accel);


   xlim([0,x_limit]);

   if a>2

       plot(time, data(1), 'r.');

       hold on;

       plot(time, data(2), 'g.');

       hold on;

       plot(time, data(3), 'b.');

       hold on;

       

       drawnow;

    fprintf('%d: \t%d\t%d\t%d\r\n', a, data(1), data(2), data(3));

   end

end

a = 0;

clf;


fclose(s2);

delete(instrfindall)

I2C통신은 아주 흔하게 사용하는 통신 방법중에 하나로서, 주로 하나 이상의 센서들을 제어하거나 값을 받아올 때 사용합니다.


센서용으로 I2C통신이 흔하게 이용되는 이유는 한 간편한 방식으로 통신라인에 최대 7-bit 주소를 이용할 수 있기 때문인데,


이는 곧 이론상으로 한 통신라인 상에서 127개의 센서를 제어할 수 있다는 뜻입니다.


해당 통신을 구현하기 위해서는 특정한 회로 및 시퀀스 스펙을 맞춰주어야 합니다.



1. 하드웨어상 특징


- 통신 라인에서 제어 주체별로 각각 Master, Slave로 나눌 수 있으며 주로 MCU가 Master가 되고 센서가 Slave가 됩니다.

  Master는 통신 라인의 Clock 주파수를 생성하고 Slave의 주소를 호출하여 동작을 제어하는 역할을 합니다.

  Slave는 Master에 의해 호출되어 Master가 원하는 값을 반환합니다.


- 주로 +3.3V 전압을 이용하며, 그 이상의 전압도 가능합니다. 다만, 각 칩이나 센서별로 스펙상 특정한 전압을 사용하기 때문에

  해당 전압에 맞추어 사용하여야 합니다.


- 통신 라인은 SDA(데이터), SCL(클락) 두 선으로 구성되어 있고 각각의 선에 풀업 저항이 필요합니다. (+3.3V의 경우 주로 4.7K)

 


2. 동작 시퀀스 특징


<라즈베리파이> 부팅시 자동 실행


라즈베리파이를 이용하여 부팅시 자동으로 특정한 명령이 수행되도록 하는 방법

알려진 여러가지 방법이 있지만, 실제로 실행이 안되는 경우가 많이 있습니다.


제가 해본 여러가지 방법중에 아직까지는... 문제가 없던 방법입니다.

1. sudo nano /etc/profile 
root 권한으로 해당 파일을 수정합니다.




2. 해당 파일의 마지막줄에 아래 예시와 같이 실행할 작업을 적어주시면 됩니다.


sudo python3 /var/www/new/Flask/index.py




파이썬 프로그래밍을 할때는 꼭


[출처] : http://yekyu94.tistory.com/4

+ Recent posts