반응형
TPM ( Total Productive Maintenance )

생산 현장의 효율성과 생산성을 최대한 높이기 위한 관리 기법

고장 및 결함을 줄이고 '무사고, 무고장, 무불량' 을 목표로 하는 활동을 중심으로 합니다.

이는 일본의 도요타에서 시작, 전 세계로 확산된 방식입니다.
이를 지탱하는 기둥 중 하나가 5S 이며 소프트웨어라는 공장을 빗대어 표현할 수 있겠습니다.


5S

1. 정리 Seiri ▶조직

적절한 명명법 등과 같은 방법을 사용하여, 클래스, 메서드, 변수 등 무엇이 어디에 사용되고 위치해 있는지 알아야 한다.
( NHN Academy 당시 학장님 말씀으로  '저는 개발 당시 대부분 변수 이름 짓는 것에 시간을 보냈습니다. 그만큼 심사숙고하여 이름을 지어야 합니다.' 라고 하셨다. )

 

2. 정돈 Seiton ▶ 단정함

물건마다 제자리가 있다. 코드 또한 누구나 예상할 수 있는 위치에 알아야 한다.

 

3. 청소 Seiso ▶ 정리

TODO와 같이 주석이 달린 코드가 처리되었다면, 지워야 한다. 불필요한 쓰레기는 작업공간을 혼란스럽게 만든다.

 

4. 청결 Seiketsu ▶ 표준화

그룹 내의 스타일을 정하고 따라야 한다.

 

5. 생활화 Shutsuke 규율

관례를 따르고, 자신의 코드를 돌아보며 변경할 수 있는 마음을 가져야 한다.

 

'도요타' 자동차 처럼 소프트웨어도 엔진오일 등 자동차 상태를 매번 체크하고,
부품을 교체하여 고장을 미리 방지한다. 

즉,
우리가 만드는 소프트웨어 또한 주기적인 코드리뷰와 불필요한 코드를 과감히 제거하고, 교체하는 등 지속적인 리팩터링을 통해 만들어가야 한다.
반응형
반응형
코드나 컴퓨터를 사용하다 보면 ₩ 써야할 때가 있습니다.
근데 기존 키보드에서는 Enter키 위에를 아무리 눌러도 
\ , |
로 작성됩니다.

그럴 땐 ALT + = 를 누르면 ₩ 가 입력됩니다.
 

 

반응형
반응형

 

"더블클릭은 상관없어~" 하고 잘 알아보지도 않고
G502 hero 벌크제품을 2022년도 쯤에 구매해서 사용했습니다.
얼마 지나지 않아서 더블클릭 증상이 찾아왔습니다.
오랫동안(3일) 컴퓨터를 사용하지 않거나 종료하지 않절전모드만 자주 사용하면
종종 더블클릭에 당첨되고 합니다.

근데 최근에 문제가 터졌습니다. 이제 클릭이 되지 않습니다....
오른쪽 마우스 클릭이 오락가락합니다.

여러 해결 방법을 찾아보았습니다.
1. 잔류 전기가 남아 그렇다 선을 뽑고 막 클릭해서 방전 시켜라
2. 스위치 부품이 녹슬어서 그렇다. 스위치를 바꿔라
3. 마우스 클릭하는 부분 틈사이로 바람을 불어주면 된다.

모두 임시 방편일 뿐 다시 돌아왔고 결국에 클릭이 되지않는 상태가 되어버렸습니다.
그래서 수리점에 맡길려다가 아두이노, 라즈베리파이 조금 봤다고 자신감이 생겨 이참에 분해해서 수리 하자.
바로 진행해 보았습니다.


준비물
1. 인두기와 납 (다이소에서 구매했습니다.)
2. 마우스 스위치
3. 수리할 마우스
4. 집게 (이것도 다이소에서.. 없으셔도 됩니다.)
5. 목장갑

 

1. 먼저 마우스 커버를 분리해줍니다.

추가로 사이드 버튼 기판도 분리해줍니다.

 

2.  보이는 모든 나사와 휠을 분리해 줍니다.

잘 기억해주세요

 

3. 이 부분을 제거해 줍니다.

어느 영상에서 번갈아가면서 인두로 작업하면 된다고 한다는데

세 개라서 금방 굳습니다.

때문에 인두기를 가로로 눕혀서 한번에 작업하는 것이 좋겠습니다. 

4. 다음 제품을 납땜해 줍니다.

기존은 중국 제품 50M (5000만회 보장) 입니다.

저는 많이 사용하기도하고 묵직한 느낌을 좋아하기 때문에 골드 80M 사용하였습니다.

취향에 맞는 부품을 골라 사용하시면 됩니다.

 

 

 

마우스 수리 스위치 TTC 실버 골드 방진골드 30M 60M 80M - 유선마우스 | 쿠팡

쿠팡에서 5.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 7 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

 

5. 납땜 완료

기판은 좀 탔지만 납땜 완료한 모습입니다.

 

 

5. 재조립

분해의 역순으로 조립하면 되겠습니다.

가끔 이렇게 수리할 때가 있는데 귀찮아서 미루다 작업해 보았는데요.
확실히 골드 제품이 묵직하고 클릭감이 좋지만 너무 많이 사용하면 피로도가 있을 것 같습니다.
그래도 중국이나 일본제품의 클릭문제 때문에 저는 앞으로도 골드 제품 사용할 것  같습니다.

 

반응형

'공돌이 생활' 카테고리의 다른 글

[ 컴퓨터 조립 후기 ] RTX 4060 + i5 14600KF  (6) 2025.03.06
반응형
Android Studio를 통해 Emulator로 Debug 하던 중에 반복되는 이 에러를 보았다.
[ Incorrect use of ParentDataWidget ]

 

이 에러는 Expanded Widget Column, Row, Flew 와 같은 부모 위젯에서 사용해야 하지만,

그 이외에 위젯에서 사용될 경우 발생한다.

 

따라서 Expanded를 세 개의 부모 위젯에서 사용하거나 제거해주면 해결된다.

반응형
반응형

 

에라토스테네스의 체 는 소수를 찾는 쉽고 빠르게 찾을 수 있는 방법이다.

( 고대 그리수 수학자 에라토스테네스가 발견 )

 

알고리즘

다음과 같은 알고리즘을 따른다.

0 ~ 50 까지의 수를 찾고자 할때, 0과 1을 제외

 

1.  2부터 시작하여 2를 제외한 2의 배수를 모두 지운다.

  2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50

 

2. 지워지지 않은 다음 숫자부터 1번과 같이 반복한다. ( 3을 제외한 3의 배수 지우기 )

  2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50

 

3.  √50 = 7.071 이므로 구하는 수의 제곱근 이하의 소수, 즉, 7의 배수까지 제외하면 된다.

  2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50

 

4. 제외 되지 않은 숫자가 소수

 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47

 

Code

자바를 통해 다음과 같이 구현할 수 있다.

Boolean[] primeNumbers = new Boolean[number + 1]; // N이 0일 때, 0 ~ 100 까지 101개의 수
        primeNumbers[0] = false; // 1
        primeNumbers[1] = false; // 2

먼저 0 ~ 100까지의 101개의 배열을 생성해주고 0, 1은 제외 시킨다.

 

 // 모두 true로 초기화
 for (int i = 2; i <= number; i++) {
 	primeNumbers[i] = true;
 }

2부터 모두 소수라 가정하고 true로 지정한다. 

 

for (int i = 2; i <= Math.sqrt(number); i++) {
	if (primeNumbers[i] == false)
    	continue;
    for (int j = i + i; j <= number; j += i) {
    	primeNumbers[j] = false;
    }
}

에라토스테네스의 체 공식으로

1. 이미 제외시킨 숫자라면 다음 숫자

2. 제외시킨 숫자가 아니라면 그 수를 제외하고 배수를 false로 변환한다.

 

다음과 같은 결과를 얻을 수 있다.

 

전체 코드

import java.util.Scanner;

public class eratos {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("2이상의 숫자를 입력해 주세요 : ");
        int N = scanner.nextInt();

        fintPrimeNumber(N);
    }

        private static void fintPrimeNumber(int number) {
        Boolean[] primeNumbers = new Boolean[number + 1]; // N이 0일 때, 0 ~ 100 까지 101개의 수
        primeNumbers[0] = false; // 1
        primeNumbers[1] = false; // 2

        // 모두 true로 초기화
        for (int i = 2; i <= number; i++) {
            primeNumbers[i] = true;
        }

        for (int i = 2; i <= Math.sqrt(number); i++) {
            if (primeNumbers[i] == false)
                continue;
            for (int j = i + i; j <= number; j += i) {
                primeNumbers[j] = false;
            }
        }

        System.out.println();
        System.out.println(number + "이하의 소수 입니다.");
        
        for (int i = 0; i < primeNumbers.length; i++) {
            if (primeNumbers[i]) {
                System.out.print(i + " ");
            }
        }
    }
}
반응형

'알고리즘' 카테고리의 다른 글

플라비우스 요세푸스 순열  (2) 2025.02.28
[ 자료구조 ] 큐 ( Queue ) - JAVA  (0) 2025.02.26
스택 ( 자료구조 ) - JAVA  (0) 2025.02.04
[ 알고리즘 ] 선택 정렬  (2) 2024.12.12
반응형
Flutter 개발시 API Key나 다른 것을 숨겨야 할 상황이 생긴다. 
이 때 우리는 환경변수를 사용하여 보안성을 높일 수 있다.
이번에는 .env 파일을 통해 git과 같은 코드 업로드 시 보안을 높이고
또한
앱 배포시에도 리버스 엔지니어링으로 부터 더욱 안전할 수 있게 난독화까지 할 수 있도록 하겠다. 

 

● API Key를 숨기지 않더라도 Naver, AWS 등 여러가지 API 서비스는 제한 횟수로 관리하는 방법이나 단기에 많은 요청시와 같은 비정상적인 호출이 실행되었을 때를 서비스를 제공하는 곳에서 관리해주기 때문에 어느정도 보장되지만, 그럼에도 악용하는 방법은 무궁무진 하므로 보안성을 최대한 높이는 것이 좋다.

● API Key 뿐만 아니라 숨겨야 하는 다른 데이터를 난독화를 통해 보안성을 높일 수 있다. 

 

.env File 사용하기

.env

플러터 프로젝트 루트 디렉터리 (Flutter Project Root Directory)에 .env 파일을 생성하고 key를 적으면 된다.

NAVER_ID_KEY = '발급 받은 키값'

 

Add Package 

난독화와 환경변수 .env file에 적은 값들을 가져오기 위해 다음 패키지를 추가 해 주자.

 

envied | Dart package

Explicitly reads environment variables into a dart file from a .env file for more security and faster start up times.

pub.dev

 

pubspec.yaml

$ flutter pub add envied
$ flutter pub add --dev envied_generator
$ flutter pub add --dev build_runner

 

 

Code 작성

다음과 같이 .env에 사용했던 상수명을 그대로 작성해주고 obfuscate ( 난독화 )를 true -> 사용해주자

* path에 사용한 .env파일 명을 적어주면 된다.

 

env.dart

import 'package:envied/envied.dart';

part 'env.g.dart';

@Envied(path: '.env')
abstract class Env {
  @EnviedField(varName: 'NAVER_ID_KEY', obfuscate: true)
  static final String NAVER_ID_KEY = _Env.NAVER_ID_KEY;

  @EnviedField(varName: 'NAVER_SECRET_KEY', obfuscate: true)
  static final String NAVER_SECRET_KEY = _Env.NAVER_SECRET_KEY;

  @EnviedField(varName: 'AWS_API_GATEWAY_URL', obfuscate: true)
  static final String AWS_API_GATEWAY_URL = _Env.AWS_API_GATEWAY_URL;
}

 

 

Code 작성 후 터미널에 다음 코드를 작성하면 env.g.dart file이 생성된 것을 확인 할 수 있다.

$ dart run build_runner build

 

 

 

사용은 Dart의 클래스 사용법과 동일하다.

 

이와 같이 예민한 값들을 .env file과 envied package를 통해 보안성을 높일 수 있다.

 

반응형
반응형
다음과 같은 오류는 google.android.gms.service가 충돌해서 발생하는 오류이다.
Naver Map API 사용하는 경우 대부분 자신의 위치 기반으로 geolocator를 사용하고 둘 다 google.android.gms.service.location를 사용하기 때문에 발생한다.

 

충돌지점은 20.0.0버전의 이후와 이전으로 20.0.0 버전으로 넘어가는 과정에서 에러가 발생한다고 한다.

 

해결방법으로 20.0.0 이후 버전으로 맞춰주거나 이전버전으로 통합 맞춰주면 된다.

allprojects {   
    repositories {
        google()
        mavenCentral()
    }
    configurations.all{
        resolutionStrategy{
        	force "com.google.android.gms:play-services-location:21.0.1"
        }
    }
}

flutter 프로젝트 root 경로/android/build.gradle

반응형
반응형
Flutter를 사용하다보면 이 에러를 심심치 않게 볼 수 있다.
Flutter와 dart는 자주 쓰이는 언어에 비해 터무니 없이 역사가 짧다.
때문에 다양한 상황에 따른 가이드라인이 많이 부족할 수 밖에 없으며 한국어 관련 문서,
블로그는 더 찾기 힘들다. 

그런 상황에서 다른 분들은 삽질 하지 않았으면 한다.


먼저 다음과 같은 오류는
Flutter .yaml - Package 와 Android의 Kotlin 버전이 맞지 않아서 이다.
binary version은 1.9.0인데 1.5.1으로 예상된다.
아니면 1.9.0인데 1.7.1로 예상된다.

그렇다면 kotlin과 Package 버전을 맞춰주면 해결 되는 문제이다. 실제로도 그렇다.
하지만 Package 가 어느 kotlin의 어느 버전으로 사용하고 있는지 확인 하는 것보단 프로젝트의 Android 버전을 확인하는 것이 쉽기 때문에 사람들은 이 코드를 많이 봤을 것이다.
Flutter 프로젝트 root 경로/android/build.gradle

물론 단순한 Package 하나의 문제인 경우 위 코드로 해결된다.
하지만 특정 Package 를 사용해야 하고 그것을 포함한 여러 Package 를 사용해야 하는 경우
구(권장)하는 Kotlin 또는 Package 가 지원 가능한 Kotlin의 버전이 서로 맞지 않기 때문에 다음과 같은 오류가 발생
할 수 있다.




다음과 같은 경우 BuildTree를 통해
어떤 Package 의 버전이 다르고 최종적으로 어떤 버전으로 Build되었는지 알 수 있다.
BuildTree에서 확인하여 버전이 다른 Package 를 업데이트 시켜줌으로써 해결할 수 있다.
 

Android Build Tree 확인

Flutter를 사용하여 개발하다 보면 Package 사용은 필수적이다.다음 사이트를 통해 추가하지만 Kotlin 버전의 충돌과 해당 Package에 포함된 다양한 Library에 따라 오류가 발생할 수 있다.  The official repo

p-coding.tistory.com


 

그래도 해결되지 않는다면

Flutter 프로젝트 Root/android 경로에 제일 하단부분에 setting.gradle으로 따로 설정하게끔 되어 있다.

( 다음 파일이 있다면 여기서 수정하지 않을 시 처음 설명드렸던 방법으로 하더라도 해결되지 않는다. )

다음과 같이 변경해 주면 된다.

Flutter 프로젝트 root 경로/android/setting.gradle

 

반응형
반응형
Flutter를 사용하여 개발하다 보면 Package 사용은 필수적이다.
다음 사이트를 통해 추가하지만
Kotlin 버전의 충돌과 해당 Package에 포함된 다양한 Library에 따라 오류가 발생할 수 있다. 
 

The official repository for Dart and Flutter packages.

Pub is the package manager for the Dart programming language, containing reusable libraries & packages for Flutter and general Dart programs.

pub.dev

 

 

때문에 Flutter root 디렉토리/android로 이동한 후 다음과 같은 명령어를 통해 BuildTree를 확인 할 수 있다.

gradlew app:dependencies

 

 

(*) 표시는 최종적으로 실행된 라이브러리 입니다.

 

반응형
반응형
해당 게시글에서는 지도 화면이 아닌 JSON 데이터를 받는 방법입니다!
이번에는 API GateWay를 생성하고 lambda와 연결, flutter에서 호출할 차례이다.

이전 글
 

KaKao Map Rest API + Flutter 사용해보기 ( http 통신 ) - 2 ( AWS lambda)

해당 게시글에서는 지도 화면이 아닌 JSON 데이터를 받는 방법입니다!이번에는 lambda 함수를 먼저 작성하고 테스트 해보자 이전에는 Flutter + rest api 통신 문제로 인해 통신하지 못했지만, javascript

p-coding.tistory.com

 

이전에는 lambda 함수를 생성하고 테스트하여 Kakao Rest Api가 정상적으로 작동하는지 시도해 보았다. 이번에는 그 함수의 반환 값을 받기 위해서 API GateWay를 사용하여 Flutter에서 접근할 수 있도록 만들어 보자.

 

1. 저번과 같이 콘솔 상단에 API GateWay 검색 후 이동해주자

 

2. API 생성 해주자

 

3. REST API 구축해주자

 

4. 식별가능한 이름과 설명을 작성한 뒤 생성해주자

 

5. 리소스를 생성해주자

API_GATEWAY_Path/locations 를 가지는 리소스를 만들 수 있다.

 

6. 이제 요청할 메서드를 생성하자

( 여기서 GET과 POST를 선택할 수 있는데 GET은 Param에 포함하여 요청하고 POST는 Body로 요청한다. 
나는 POST로 진행하였다. )

이전에 설정했던 lambda함수를 선택해주자!

 

7. 다음은 스테이지를 정의해야 한다.

원하는 스테이지를 정의하고 우리는 테스트로 dev로 설정해주자

 

그러면 다음과 같이 URL 호출이 생성되며 URL/locations 를 사용하여 우리가 설정한 API 호출할 수 있다.

 

이제 GateWay 설정도 완료되었으니 Flutter에서 호출해보자

import 'dart:convert';
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:http/http.dart' as http;

class TestPage extends StatefulWidget {
  const TestPage({super.key});

  @override
  State<TestPage> createState() => _TestPageState();
}

class _TestPageState extends State<TestPage> {
  Future<void> fetch() async {
    // 현재의 위도 경도 위치를 가져옴
    Position position = await Geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.high);

    const String url =
        'URL/locations';

    Map<String, String> headers = {
      'Content-Type': 'application/json',
    };

    final Map<String, dynamic> body = {
      'y': '${position.latitude}',
      'x': '${position.longitude}',
    };

    http.Response response = await http.post(
      Uri.parse(url),
      headers: headers,
      body: json.encode(body),
    );

    if (response.statusCode == 200) {
      log(response.body);
    } else {
      log('Failed to send data: ${response.statusCode}');
    }
  }

  @override
  void initState() {
    super.initState();
    fetch();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("테스트 페이지"),
      ),
      body: const Center(
        child: Text("지도 api 테스트중 입니다."),
      ),
    );
  }
}

 

URL에 설정한 URL 값을 넣어주고 실행하자 log를 통해 우리가 설정했던 body가 들어온 것을 알 수 있다.

 

 

마치며...
이제 이 값들을 변환시켜 좌표값을 가져오고 좌표값을 통해 네이버 지도를 띄울 수 있다.
다음 글은 네이버 지도 RestAPI를 통해 Static Map을 띄우도록 하겠다
좌표값을 알고 있기 때문에 dynamic, Static 자유롭게 사용해도 된다.
반응형

+ Recent posts