Splash 화면 구현

경로 : res/drawable/splash.xml (생성)

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:drawable="@color/purple_200" />
  <item>
    <bitmap
      android:src="@drawable/ic_launcher_foreground"
      android:gravity="center"/>
  </item>
</layer-list>

Splash Theme 추가

경로 : res/values/themes.xml ,res/values-night/themes.xml

<!-- 스플래쉬 테마 -->
<style name="SplashTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  <item name="colorPrimary">@color/purple_500</item>
  <item name="colorPrimaryVariant">@color/purple_700</item>
  <item name="colorOnPrimary">@color/white</item>
  <!-- Secondary brand color. -->
  <item name="colorSecondary">@color/teal_200</item>
  <item name="colorSecondaryVariant">@color/teal_700</item>
  <item name="colorOnSecondary">@color/black</item>

  <!--타이틀 바 없애기-->
  <item name="windowActionBar">false</item>
  <item name="windowNoTitle">true</item>

  <item name="android:windowBackground">@drawable/splash</item>
</style>

Android Manifest 수정

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="me.eeyo.user">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/SplashTheme"> <!-- Splash Theme 적용 -->
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
<!--        <activity android:name=".MainActivity"/>-->
    </application>

</manifest>

Main Activity 수정

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setTheme(R.style.Theme_앱이름); // 앱 기본 테마로 변경

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /* 전체화면 코드 시작 */
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            final WindowInsetsController insetsController = getWindow().getInsetsController();
            if (insetsController != null) {
                insetsController.hide(WindowInsets.Type.statusBars());
            }
        } else {
            getWindow().setFlags(
                    WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN
            );
        }
        /* 전체화면 코드 끝 */
    }
}

결과물

스플래시 액티비티를 사용하는 것 보다 간결하고, 앱 로딩이 끝나는 즉시 메인 액티비티가 뜬다.

이거 하나 보여주자고 왜 액티비티를 만들어 귀찮게

타이틀 바 없애기

경로 : res/values/themes.xml , res/values-night/themes.xml

<style name="Theme.앱이름" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
  ...생략

  <!-- Customize your theme here. -->

  <!--타이틀 바 없애기-->
  <item name="windowActionBar">false</item>
  <item name="windowNoTitle">true</item>  
</style>

상태 바 없애기

경로 : MainActivity.java

import android.os.Build;
import android.view.WindowInsets;
import android.view.WindowInsetsController;
import android.view.WindowManager;

...
public class MainActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    /* 전체화면 코드 시작 */
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
      final WindowInsetsController insetsController = getWindow().getInsetsController();
      if (insetsController != null) {
        insetsController.hide(WindowInsets.Type.statusBars());
      }
    } else {
      getWindow().setFlags(
        WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_FULLSCREEN
      );
    }
    /* 전체화면 코드 끝 */
  }
  ...
}

Before / After

노치 / 펀치홀 대응 (안드로이드 9 이상)

경로 :res/values-v28/themes.xml,res/values-night-v28/themes.xml

<style name="Theme.앱 이름" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
  ... 중략 ...
  <!-- Customize your theme here. -->

  <!--타이틀 바 없애기-->
  <item name="windowActionBar">false</item>
  <item name="windowNoTitle">true</item>

  <!-- 노치 / 펀치 홀 대응 -->
  <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
  <item name="android:windowTranslucentStatus">true</item>
  <item name="android:windowTranslucentNavigation">true</item>
</style>

최종 결과물

재택근무가 길어지면서 사내메신저의 필요성을 느끼던 중

Slack이나 잔디, 라인웍스 등의 협업 툴을 써봤지만 큰 메리트를 느끼지 못하고

관련 소프트웨어에 익숙하지 않은 직원들도 쉽게 쓸 수 있는 디스코드를 선택했다.

일단 직원들 대부분이 온라인게임을 즐기기 때문에 새로 설치하거나 익숙해질 필요가 없었고,

파일 전송 용량 등 몇가지를 제외하면 Slack과 크게 다른점이 없는데,

구글 클라우드와 사무실 내 스토리지가 있어서 필요가 없는 상태였으며

무엇보다 API를 활용해 직접 필요한 기능을 개발할 수 있는 장점이 컸다.

Django로 디스코드 봇을 만들어 프로젝트 관리와 서버에 이슈가 생기면 푸시알림을 보내주려고 했는데

연동 탭에 "웹후크" 항목이 눈에 띄었다.

보자마자 Github에 웹훅 연결하면 되겠네 ㅋㅋ루ㅋㅋ삥뽕 을 외치며 웹훅 생성

처음에 웹훅을 만들면 Captain Hook이라는 이름으로 생성된다.

저 이름과 프로필사진대로 채팅창에 나오는줄알고 이름과 프사를 바꿔줬는데, 깃헙은 그럴 필요가 없었다.

일단 저장 후 웹후크 URL 복사를 눌러준다.

리포지토리의 Settings에 들어가보면 왼쪽에 Webhooks 탭이 있다.

Add Webhook을 누르고

Payload URL에 복사한 URL링크를 넣어주는데, 주의해야 할 점은

discordapp.com/api/webhooks/(중략)*****ito5sjcO*************_hUWO_hTfZt
뭐 이런식으로 생성된 URL 뒤에 반드시

/github

를 추가해줘야 한다.

왜그런지는 나도 모른다.

어쨌든 최종적으로

discordapp.com/api/webhooks/(중략)*****ito5sjcO*************_hUWO_hTfZt/github

이런 형태의 URL을 넣어준 뒤, Content Type을 Application/Json으로 바꾸고

다른건 건들 필요 없이 Add Webhook 버튼만 눌러주면 된다.

그 뒤에 해당 리포지토리에 Push / Pull Request 등의 변화가 생기면

이런식으로 알려준다.

위에 언급한 것처럼 프로필사진과 이름을 바꿔줄 필요가 전혀 없다. 디스코드에 깃허브 봇이 있나보다..

@everyone이나 @here 등으로 호출하는 기능은 없다.

일단 #git-log 라는 채널을 만들어놓았으니 해당 채널에만 알림을 켜놓고

프로젝트 참여인원을 언급하고싶기 때문에 다시 봇을 개발하러 가야겠다.

'Server > Git' 카테고리의 다른 글

[Synology] Git Server / Gogs로 나만의 Git 구축하기  (0) 2021.07.23
[Discord] 웹훅으로 GitHub 로그 받기  (0) 2020.09.16

맥을 사용하다가 윈도우를 다시 사용하려니

Capslock 한영 전환이 너무 익숙해진 나머지 코딩을 하다가도 Capslock 키를 누르기가 일쑤였다.

 

검색해보니 여러가지 방법들이 있다.

 

# 레지스트리

CapsLock2IME.reg
0.00MB

레지스트리를 수정해서 PC를 초기화하거나 원래대로 돌려놓지 않는 이상 영구적으로 적용된다.


단점은 어떤 수를 쓰더라도 기존의 CAPSLOCK 기능을 사용할 수 없다.
일반적인 사용환경에서는 CAPSLOCK을 쓸 일이 그리 없는데 개발할땐 CAPSLOCK이 그리 아쉬울 수가 없다.

 

# 오토핫키 사용

CapslockIME.zip
0.53MB

레지스트리 등록 후 재부팅하기도 귀찮고 시작프로그램에 등록해놓으면 자동실행되니 있는 듯 없는 듯 사용할 수 있다.

오토핫키 설치하기 귀찮은 사람들을 위해 컴파일한 파일과 같이 첨부한다

 

기존 소스는 맥과 같이 길게 누르면 CAPSLOCK이 켜지는걸로 되어 있는데
어찌된 영문인지 나는 암만 해도 안켜지길래 ^capslock 구문을 추가했다.

이것도 원래는 컨트롤키 핫키인데.. 쉬프트를 눌러야 작동이 된다.


어찌되었건 잘 작동하니 그냥 써야지.

장고 앱을 개발하다가 하나의 앱에 View 수가 많아져서 C 계열 언어처럼 전처리기로
#pragma region ~ endregion
으로 뷰를 한방에 묶어서 접어두고 싶었다.

그래서 시작한 폭풍 구글링.
근데 파이썬은 부모만 C계열 언어지, 전처리기는 사용할 수 없다는 안타까운 소식을 접했고...

꿩 대신 닭이다, 이가 없으면 잇몸으로라도 하자는 마음에 VSCode 확장프로그램 탭을 열고, region이라고 검색해봤다.

https://marketplace.visualstudio.com/items?itemName=maptz.regionfolder

 

#region folding for VS Code - Visual Studio Marketplace

OverviewQ & ARating & Review Visual Studio Code Custom Folding Extension This extension enhances the default code folding abilities of Visual Studio Code editor. Regions of code that you'd like to be folded can be wrapped with #region comments. The precise

marketplace.visualstudio.com

얄루! 마침 파이썬의 주석과 같은 #을 사용한다.

다른 언어에서는 주석처리를 한 후 #region을 써주어야 한다.

 

접기 전 (좌) , 접은 후 (우)

요렇게 지저분했던 녀석들이 우측처럼 다 접혀 들어갔다.

 

끝!

Github repository: https://github.com/maptz/Maptz.VSCode.Extensions.customfolding

로그인/회원등록 구현 과정 중 여태 영어만 집어넣다가 superuser 생성 시 이름으로 '최고 관리자'를 넣어줬다.

def create_superuser(self, admin_id, password): # 최고관리자 생성
        user = self.create_user(
            admin_id=admin_id,
            admin_level=True,
            admin_parent=0,
            admin_name='최고 관리자',
            
        )

 

그리고 manage.py createsuperuser를 실행했는데, 다음과 같은 오류가 발생했다.

django.db.utils.OperationalError: (1366, "Incorrect string value:
'\\xEC\\xB5\\x9C\\xEA\\xB3\\xA0...' for column 'admin_name' at row 1")

 

아..인코딩..

MYSQL 클라이언트로 접속 후 

 

mysql > show variables like 'c%';

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
| check_proxy_users        | OFF                        |
| collation_connection     | utf8_general_ci            |
| collation_database       | latin1_swedish_ci          |
| collation_server         | latin1_swedish_ci          |
| completion_type          | NO_CHAIN                   |
| concurrent_insert        | AUTO                       |
| connect_timeout          | 10                         |
| core_file                | OFF                        |
+--------------------------+----------------------------+

전부 utf8인데 이 database의 charset만 latin으로 되어있었다.

mysql > ALTER SCHEMA `App`  DEFAULT CHARACTER SET utf8;

이 스키마의 캐릭터셋을 utf8로 바꿔준다.

그리고 다시 manage.py createsuperuser를 실행해봤지만..

너 대체 나한테 왜그러니?

또 안된다...

혹시나 하고 models.py로 가서,

def create_superuser(self, admin_id, password): # 최고관리자 생성
        user = self.create_user(
            admin_id=admin_id,
            admin_level=True,
            admin_parent=0,
            admin_name='최고 관리자'.encode('utf8'),
        )

string.encode 속성을 강제로 넣어줬다.

makemigration, migrate 하고 createsuperuser 재시도

 

좋아 완벽했어.

+ Recent posts