펌웨어 프로그램은 보통 여러명이서 개발하는게 아니라서 개인적으로 관리하는 용도로 사용하기로 했다.

 

git hub가 아닌 git으로 push 없이 커밋만으로 형상관리 할수 있다.

단점은 hub에 올리는게 아니라서 협업은 할수 없지만 만드는게 간단하다.

 

추가로 커밋할때 버전도 자동으로 업데이트 할수 있는 방법 없을까 해서 작업해봤다.

 

sourceTree를 열고 Create에서 관리하기 원하는 폴더를 지장하면된다.

예 누르면 된다.

.gitignore 에 필터링 하고 싶은거 넣으면 된다. 주로 컴파일 빌드 파일을 필터링

GNU ARM*/
*.si4project/
.cproject
.project
.settings/

 

그러고 커밋하면 코드가 관리된다.

 

여기까지는 다 아는 내용일거고 

깃을 생성하면 아래 폴더가 같이 생성되는데 안에 경로로 가면 sample 코드 들이 있다.

 .git\hooks

이중에 pre-commit , prepare-commit-msg 이 두 파일만 수정한다.

pre-commit 파일에 아래 코드 전체 복붙

#!/bin/bash

VERSION_FILE="version.h"
COMMITTER=$(git config user.name)
EMAIL=$(git config user.email)
DATE=$(date +"%Y. %m. %d. %p %I:%M:%S")

# 파일이 없으면 기본 내용으로 생성
if [ ! -f "$VERSION_FILE" ]; then
    cat <<EOF > "$VERSION_FILE"
#ifndef VERSION_H
#define VERSION_H

#define FIRM_VER "Ver. 0"

#endif // VERSION_H
EOF
    echo "Created $VERSION_FILE with initial content."
fi

# 현재 버전 가져오기
CURRENT_VERSION=$(grep '#define FIRM_VER' "$VERSION_FILE" | grep -oE '[0-9]+')

# 새 버전 계산
NEW_VERSION=$((CURRENT_VERSION + 1))

# 버전 업데이트
sed -i "s/#define FIRM_VER \"Ver. $CURRENT_VERSION\"/#define FIRM_VER \"Ver. $NEW_VERSION\"/" "$VERSION_FILE"

# 새 주석 작성
NEW_COMMENT=$(cat <<EOF

/*
Ver. $NEW_VERSION
날짜: $DATE
작성자: $COMMITTER <$EMAIL>
*/
EOF
)

# `#endif` 아래에 멀티라인 주석 추가
awk -v comment="$NEW_COMMENT" '
/^#endif/ {
    print $0
    print comment
    next
}
{ print $0 }
' "$VERSION_FILE" > "$VERSION_FILE.tmp" && mv "$VERSION_FILE.tmp" "$VERSION_FILE"

# 변경 사항 스테이징
git add "$VERSION_FILE"

 

prepare-commit-msg 파일에 아래 코드 전체 복붙

#!/bin/bash

VERSION_FILE="version.h"
MSG_FILE="$1"

# 현재 버전 가져오기
CURRENT_VERSION=$(grep '#define FIRM_VER' "$VERSION_FILE" | grep -oE '[0-9]+')

# 작성자 정보
COMMITTER=$(git config user.name)
EMAIL=$(git config user.email)
DATE=$(date +"%Y년 %m월 %d일 %A %p %I:%M:%S")

# 기존 커밋 메시지 가져오기
COMMIT_MESSAGE=$(cat "$MSG_FILE")

# 새로운 메시지 형식 작성
NEW_MESSAGE=$(cat <<EOF
Ver. $CURRENT_VERSION
$COMMIT_MESSAGE
EOF
)

# 커밋 메시지 파일 업데이트
echo "$NEW_MESSAGE" > "$MSG_FILE"

뒤에 .sample 확장자를 지워야 동작이 됨

 

그 후 한번 아무렇게나 커밋을 한번 하면  폴더에 version.h 이라는 파일이 생성된것을 확인 할 수 있다.

#ifndef VERSION_H
#define VERSION_H

#define FIRM_VER "Ver. 3"

#endif // VERSION_H

/*
Ver. 3
날짜: 2024. 12. 13. AM 10:34:41
작성자: sonseoungmin <raimbow10@naver.com>
*/

/*
Ver. 2
날짜: 2024. 12. 12. PM 05:26:35
작성자: sonseoungmin <raimbow10@naver.com>
*/

/*
Ver. 1
날짜: 2024. 12. 12. PM 03:23:21
작성자: sonseoungmin <raimbow10@naver.com>
*/

3번 커밋한 상태의 version.h 파일

소스트리에 커밋된 커밋메시지 상태

version.h 도 같이 업데이트 되서 커밋된 것을 확인. version.h 파일은 건드릴 필요 없다.

 

한번 커밋을 해보면 알겠지만 설명하자면

커밋 전에 파일을 생성해서 version.h 를 찾고 없으면 새로 만들고

기존거 있으면 버전을 숫자를 1씩 올리고 하단에 주석으로 간단한 정보를 넣는다.

( 주석에 커밋 메시지도 함께 추가하려고 하였지만 구조적으로 안되겠더라. 할줄 아는분 알려주삼 )

sourceTree에 커밋 메시지도 version.h를 추적해서 Ver. x 를 상위에 넣어서 설명 앞에 버전이 먼저 보이도록 하였다.

 

 

이제 메인에다가 원하는 위치에 콘솔로 출력할수 있게 코드를 만들면 끝.

#include "version.h"

void main(void)
{
	printf("Rail Sample TRX Standard %s\n", FIRM_VER);
}

 

 

 

 

 

 

 

 

SourceInsight4를 열어서 Base 파일을 열기

 

utils.em 을 열면 메크로 코드들이 보인다

 

macro AddBlockCommentWithExactPlacement()
{
    hbuf = GetCurrentBuf();
    hwnd = GetCurrentWnd();

    // Get the current selection
    sel = GetWndSel(hwnd);

    // Insert "/*" at the start of the selected block
    InsBufLine(hbuf, sel.lnFirst, "/*");
    
    // Adjust selection to account for the new "/*" line
    sel.lnFirst = sel.lnFirst + 1;

    // Add "*/" on a new line after the last line
    InsBufLine(hbuf, sel.lnLast + 2, "*/");

    // Update the selection to reflect the changes
    sel.lnLast = sel.lnLast + 1;
    SetWndSel(hwnd, sel);
}

macro hangulcmt()
{
	sCmt = ask("한글 주석을 입력 하세요");
	sCmt = cat("//" sCmt);

	hWnd = GetCurrentWnd()
	inFirst = GetWndSelLnFirst(hWnd)
	hBuf = GetCurrentBuf()
	sCurrent = GetBufLine(hBuf, inFirst)
	
	DelBufLine(hBuf, inFirst);  
	InsBufLine(hBuf, inFirst, "@sCurrent@ @sCmt@");	
}

위 코드를 맨 아래에 복사 붙여넣기

저장 후에 나간다.

 

 

원하는 키를 배정함

 

hangulcmt 실행시 위 창 뜸

 

선택 코드 블럭 /* */ 처리

'업무관련 > 그외' 카테고리의 다른 글

NIFI 이용 sftp서버 -> 로컬로 파일 가져오기  (0) 2023.11.22
NIFI 임시 실행법  (1) 2023.11.22

 

 

폰트하나 다운받아서 아래와 같이 설정후 

 

Generate Font Atlas 눌러서 기다리면 아래와 같이 뜨고 

 

저장하면 에셋이 만들어짐

 

 

 

 

 

 

 

 

1) 우선 깃허브에 레포지토리를 생성해야한다

 

 

 

아래와 같이 등록 필수

 

 

 

 

 

 

2) 깃 생성후 소스트리에서 클론을 한다.

 

 

클론을 하면 아래와 같이 깃허브와 폴더가 연동된것을 확인할수 있다.

 

 

 

3) 유니티 프로젝트를 생성한다.

 

4) 프로젝트가 만들어졌으면 유니티를 끄고

방금 만든 프로젝트 파일을 전부 소스트리로 생성한 폴더로 옮겨준다.

 

 

 

 

 

4) 유니티 허브를 켜서 ADD 해서 만들어온것을 불러온다.

 

 

 

5) 작업을 하면된다.

 

6) 연동되는 것을 확인할수 있다.

 

깃허브와 유니티가 동시에 불러오기가 되지 않아

깃허브로 연동한 폴더를 먼저 생성하고 거기에 유니티 프로젝트를 넣는식으로 하였다.

유니티 Save Selection을 즐겨 사용하는데 이게 유니티를 재시작하면 다 없어지는 불편함이 있다

재시작시에도 유지될수 있는 방법을 찾아서 공유한다.

 

아래 스크립트를 Asset/Editor 안에

using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditor.ShortcutManagement;

public class SelectionSaver
{
    const string SELECTION_PATH = "Main Menu/Edit/Selection/";

    // 에디터가 로드될 때 단축키를 초기화합니다.
    [InitializeOnLoadMethod]
    static void SaveHotkeys()
    {
        foreach (var item in ShortcutManager.instance.GetAvailableShortcutIds())
        {
            if (item.StartsWith(SELECTION_PATH))
            {
                ShortcutManager.instance.RebindShortcut(item, new ShortcutBinding());
            }
        }
    }

    // 선택을 저장하고 불러오는 단축키를 정의합니다.
    [Shortcut("save_selection_1", KeyCode.Alpha1, ShortcutModifiers.Control, displayName = "Save Selection 1")]
    static void SaveSelection1()
    {
        SaveSelection("1");
    }

    [Shortcut("load_selection_1", KeyCode.Alpha1, ShortcutModifiers.None, displayName = "Load Selection 1")]
    static void LoadSelection1()
    {
        LoadSelection("1");
    }

    [Shortcut("save_selection_2", KeyCode.Alpha2, ShortcutModifiers.Control, displayName = "Save Selection 2")]
    static void SaveSelection2()
    {
        SaveSelection("2");
    }

    [Shortcut("load_selection_2", KeyCode.Alpha2, ShortcutModifiers.None, displayName = "Load Selection 2")]
    static void LoadSelection2()
    {
        LoadSelection("2");
    }

    [Shortcut("save_selection_3", KeyCode.Alpha3, ShortcutModifiers.Control, displayName = "Save Selection 3")]
    static void SaveSelection3()
    {
        SaveSelection("3");
    }

    [Shortcut("load_selection_3", KeyCode.Alpha3, ShortcutModifiers.None, displayName = "Load Selection 3")]
    static void LoadSelection3()
    {
        LoadSelection("3");
    }

    [Shortcut("save_selection_4", KeyCode.Alpha4, ShortcutModifiers.Control, displayName = "Save Selection 4")]
    static void SaveSelection4()
    {
        SaveSelection("4");
    }

    [Shortcut("load_selection_4", KeyCode.Alpha4, ShortcutModifiers.None, displayName = "Load Selection 4")]
    static void LoadSelection4()
    {
        LoadSelection("4");
    }

    [Shortcut("save_selection_5", KeyCode.Alpha5, ShortcutModifiers.Control, displayName = "Save Selection 5")]
    static void SaveSelection5()
    {
        SaveSelection("5");
    }

    [Shortcut("load_selection_5", KeyCode.Alpha5, ShortcutModifiers.None, displayName = "Load Selection 5")]
    static void LoadSelection5()
    {
        LoadSelection("5");
    }

    [Shortcut("save_selection_6", KeyCode.Alpha6, ShortcutModifiers.Control, displayName = "Save Selection 6")]
    static void SaveSelection6()
    {
        SaveSelection("6");
    }

    [Shortcut("load_selection_6", KeyCode.Alpha6, ShortcutModifiers.None, displayName = "Load Selection 6")]
    static void LoadSelection6()
    {
        LoadSelection("6");
    }

    [Shortcut("save_selection_7", KeyCode.Alpha7, ShortcutModifiers.Control, displayName = "Save Selection 7")]
    static void SaveSelection7()
    {
        SaveSelection("7");
    }

    [Shortcut("load_selection_7", KeyCode.Alpha7, ShortcutModifiers.None, displayName = "Load Selection 7")]
    static void LoadSelection7()
    {
        LoadSelection("7");
    }

    [Shortcut("save_selection_8", KeyCode.Alpha8, ShortcutModifiers.Control, displayName = "Save Selection 8")]
    static void SaveSelection8()
    {
        SaveSelection("8");
    }

    [Shortcut("load_selection_8", KeyCode.Alpha8, ShortcutModifiers.None, displayName = "Load Selection 8")]
    static void LoadSelection8()
    {
        LoadSelection("8");
    }

    [Shortcut("save_selection_9", KeyCode.Alpha9, ShortcutModifiers.Control, displayName = "Save Selection 9")]
    static void SaveSelection9()
    {
        SaveSelection("9");
    }

    [Shortcut("load_selection_9", KeyCode.Alpha9, ShortcutModifiers.None, displayName = "Load Selection 9")]
    static void LoadSelection9()
    {
        LoadSelection("9");
    }

    [Shortcut("save_selection_0", KeyCode.Alpha0, ShortcutModifiers.Control, displayName = "Save Selection 0")]
    static void SaveSelection0()
    {
        SaveSelection("0");
    }

    [Shortcut("load_selection_0", KeyCode.Alpha0, ShortcutModifiers.None, displayName = "Load Selection 0")]
    static void LoadSelection0()
    {
        LoadSelection("0");
    }

    // 선택된 객체들을 JSON으로 저장하는 메서드
    static void SaveSelection(string key)
    {
        if (Selection.assetGUIDs == null || Selection.assetGUIDs.Length == 0) return;

        string json = JsonUtility.ToJson(new GUIDArray { guids = Selection.assetGUIDs });
        if (string.IsNullOrEmpty(json)) return;

        EditorPrefs.SetString(key, json);
    }

    // JSON으로 저장된 객체들을 불러오는 메서드
    static void LoadSelection(string key)
    {
        string json = EditorPrefs.GetString(key);
        if (string.IsNullOrEmpty(json)) return;

        GUIDArray guidArray = JsonUtility.FromJson<GUIDArray>(json);
        if (guidArray == null || guidArray.guids.Length == 0) return;

        bool resave = false;
        List<Object> objects = new List<Object>();
        foreach (string guid in guidArray.guids)
        {
            string path = AssetDatabase.GUIDToAssetPath(guid);
            if (string.IsNullOrEmpty(path))
            {
                Debug.LogWarning($"Object with guid ({guid}) no longer exists. It will be resaved");
                resave = true;
                continue;
            }

            Object obj = AssetDatabase.LoadAssetAtPath(path, typeof(Object));
            var asset = AssetDatabase.LoadAssetAtPath<Object>(path);

            Selection.activeObject = asset;
            EditorGUIUtility.PingObject(asset);
            
            if (obj == null) continue;

            objects.Add(obj);
        }

        Selection.objects = objects.ToArray();

        // 존재하지 않는 객체가 있을 경우 다시 저장
        if (resave)
        {
            EditorPrefs.SetString(key, JsonUtility.ToJson(new GUIDArray { guids = guidArray.guids }));
        }
    }

    // GUID 배열을 저장하기 위한 클래스
    [System.Serializable]
    public class GUIDArray
    {
        public string[] guids;
    }
}

SelectionSaver.cs 로 저장하면 끝.

 

Save Selection을 해서 사용후 유니티를 껐다 켜도 유지되는것을 볼수 있다.

 

PS. 단축키는 코드에서 변경해야함. 코드에서 Shortcut 부분 확인하면 알수 있다

 

 

애니매이션 변경이 필요한데 애니메이션 파일을 열고 스포라이트를 넣으려고 하니까 넣어지지가 않는다.

 

 

 

 

 

그냥 애니메이션을 바꿀수 있게 만들면 편할텐데 이렇게 애니메이터를 연결해줘야 수정이 가능하다.

너무 수정이 어렵게 만들어져있다

 

'유니티' 카테고리의 다른 글

유니티 한글 깨짐 방법  (0) 2024.07.08
유니티 깃허브에 연동하는 방법 feat.소스트리  (0) 2024.07.01

 

git에서 소스를 받으면 sts를 열고 아래와 같이 import 시킨다

 

 

import가 완료되면 라이브러리가 다운로드 된다

 

라이브러리가 전부 다운받아지고 준비가 되면 위 스프링부트 실행한다

https://localhost/443

 

 

레코드를 전부 가져와서 jsp에서 분류 사용하는 방법

DB 쿼리를 만들어서

 

EgovMap egovMap = new EgovMap();
List<EgovMap> selectMenuInfo = (List<EgovMap>) myPageLogService.selectMenuInfo(egovMap);
model.addAttribute("selectMenuInfo", new ObjectMapper().writer().writeValueAsString(selectMenuInfo));

 

모델로 jsp로 보내면

var selectMenuInfo;
$(function () {
    try {
        selectMenuInfo = ${selectMenuInfo};
    } catch (e) {
        selectMenuInfo = null;
    }
});

위처럼 선언을 해서 넣어주고

$.each(selectMenuInfo, function(idx, NMWNdata){
    //console.log(NMWNdata);
    if(NMWNdata.webMenuId == "${selectDrBrdDetail.webMenuId1}"){
        vUrl=NMWNdata.url;
    } 
 });

위처럼 찾아갈수 있다 (로그 주석을 제거하고 확인해보면 대충 알거임)