[html] 깜빡이는 글자, 이미지 예제

반응형
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>jQuery Animation</title>
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.js"></script>
</head>
<body>
    <div id="flicker" style=" width:200px; height:200px; background-color: #ff0000;"></div>
 
    <script type="text/javascript">
 
        /**
         * 깜빡이는 예제
         * flicker라는 Id를 가진 엘리먼트에 7개의 애니메이션 함수를 적용하였습니다.
         * 7개의 visual effect는 실행 대기열에 쌓여서 앞의 애니메이션 함수가 끝난후에 바로 동작을 합니다.
         */
        $("#flicker").fadeIn(100).fadeOut(100).fadeIn(100).fadeOut(100).fadeIn(100).fadeOut(100).fadeIn();
 
    </script>
</body>
</html>

[출처] https://kssong.tistory.com/36

 

 

반응형

댓글()

Python 에서 MySQL 연결하기

프로그래밍/Python|2021. 6. 28. 15:24
반응형

필요한 라이브러리를 설치합니다.

# pip3 install mysql-connector

 

예제 (test.py)

import mysql.connector

conn = mysql.connector.connect(
    host = "localhost",
    user = "sysdocu",
    password = "12345678",
    database = "sysdocu"
)
cursor = conn.cursor()

sql = "UPDATE log SET name=%s, status=%s, number=%s"

name = "ROBOT"
status = "have"
number = 35.123874

val = (name, status, number)
cursor.execute(sql, val)
conn.commit()

 

실행

# python3 test.py

반응형

댓글()

[에러] AttributeError: 'DataFrame' object has no attribute 'split'

프로그래밍/Python|2021. 6. 16. 07:35
반응형

데이터 형식이 다른 text_line 이 있다고 했을때 아래와 같이 실행하면

에러가 출력됩니다.

 

[코드]

text = text_line.split()

print(text)

 

[에러]

AttributeError: 'DataFrame' object has no attribute 'split'

 

[해결]

일반 문자열로 변환 후 처리합니다.

text = str(text_line).split()

print(text)

 

반응형

댓글()

Python 숫자 세자리마다 콤마 입력하기

프로그래밍/Python|2021. 6. 15. 07:46
반응형

[ 소스 ]

number = 1234567
str = "세자리 콤마\n" + str("{0:,}".format(number))
print(str)

 

[ 실행 결과 ]

세자리 콤마
1,234,567

 

 

반응형

댓글()

파이썬에서 텔레그램 메세지 보내기

프로그래밍/Python|2021. 6. 14. 14:17
반응형

사전 준비

# pip install python-telegram-bot --upgrade

 

작성

# vi send.py

import telegram

telegram_token = '1422759215:AAHUr-9IDG2nqz4f7pdVrz0YMA7pAUt9hxs'
bot = telegram.Bot(token = telegram_token)
bot.sendMessage(chat_id = 'xxxxxxxx', text="메세지 내용")

 

* token 생성과 chat_id 확인

텔레그램에서 botfather 검색 후 채팅창에 /newbot 입력, 그 다음 생성할 봇 이름을 입력하면 (예: sysdocu_bot 이렇게 뒤에 _bot 붙여야 함) HTTP API 키가 생성됩니다. (키는 중요하므로 보관합니다)

웹 브라우저에서 발급받은 토큰을 이용해 접근합니다.

URL : https://api.telegram.org/bot1426769915:AAHUr-9IDG2nqz4f9pdVrz0YMA7pAUt9hxs/getUpdates

그다음 botfather 채팅창에 자세히 보면 t.me/sysdocu_bot 이런 형식의 봇 링크가 있습니다. 클릭하고 들어가 /start 라고 입력해줍니다.

또다시 위의 URL 로 접근하면 "id":xxxxxxxx 이런 chat_id 값을 확인 할 수 있습니다.

 

실행

# python send.py

 

이미지와 함께 보내려는 경우 아래와 같이 수정하여 사용하면 됩니다.

 

bot.sendMessage(chat_id='xxxxxxxx', parse_mode='HTML', text="<a href='http://sysdocu.tistory.com/image.png'> </a>메세지 내용")

 

반응형

댓글()

쉘스크립트 수 비교하기

프로그래밍/BASH SHELL|2021. 6. 10. 11:34
반응형

기본 예제

#!/bin/bash

Boy="160"
Girl="158"

if [ "${Boy}" -gt "${Girl}" ]; then
        echo "소년이 더 큽니다. "
elif [ "${Boy}" -lt "${Girl}" ]; then
        echo "소녀가 더 큽니다. "
else

        echo "소년과 소녀가 같습니다."
fi

 

비교 연산자

A -lt B : A가 B보다 작습니다.
-le : 작거나 같습니다.

-gt : 큽니다.
-ge : 크거나 같습니다.
-eq : 같습니다.
-ne : 다릅니다.

 

반응형

댓글()

안드로이드 비정상 종료 감지 처리 (어플 재시작)

반응형

아래 내용을 소스에 추가합니다.

(MainActivity 에서 감지시 초기 화면 SplashActivity 로 이동)

 

 

첫번재 방법

 

        // 비정상 종료시 어플 재시작
        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread thread, Throwable ex) {
            Intent crashedIntent = new Intent(MainActivity.thisSplashActivity.class);

                Toast.makeText(MainActivity.this, "비정상 종료 되어 재시작 합니다.", Toast.LENGTH_SHORT).show();

                //crashedIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                crashedIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(crashedIntent);
                System.exit(0);
            }
        });

 

 

두번째 방법

 

링크 참조

https://ssaurel.medium.com/how-to-auto-restart-an-android-application-after-a-crash-or-a-force-close-error-1a361677c0ce

 

반응형

댓글()

안드로이드 와이파이 SSID 가져오기

반응형

Android 8 에서 동작하던 SSID 가져오기가 Android 11 에서 안되는 현상이 확인되었습니다.

구글링 해보니 runtime permission 적용하면 된다고 하여 아래소스를 찾아 적용하였습니다.

(기능 사용시 권한 부여)

 


public String SSID = null;


tryToReadSSID(); // 호출하여 아래 내용 실행


    // SSID 가져오기
    private void tryToReadSSID() {
        // If requested permission isn't Granted yet
        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // Request permission from user
            ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 101);
        } else { // Permission already granted
            WifiManager wifiManager = (WifiManager) getActivity().getApplicationContext().getSystemService(WIFI_SERVICE);
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();
            if(wifiInfo.getSupplicantState() == SupplicantState.COMPLETED) {
                SSID = wifiInfo.getSSID().replaceAll("\"", ""); // SSID 앞뒤에 있는 따옴표 제거하고 SSID 변수에 입력
            }
        }
    }
 

 

반응형

댓글()

TextView 레이아웃 사이즈에 맞게 글자 크기 자동 조정하기

반응형

레이아웃에서 아래와 같이 설정시

기본폰트 18sp 지만, 글자가 많아 레이아웃을 벗어날 경우 2sp 단위로 12sp 까지 줄일 수 있습니다.

 

<TextView
                android:id="@+id/tv_private"
                android:layout_width="0dp"
                android:layout_height="30dp"
                android:layout_weight="4"
                android:layout_marginLeft="20dp"
                android:text="0.0.0.0"
                android:textColor="@color/white"
                android:textSize="18sp" // 기본 크기
                android:textStyle="bold"
                android:gravity="center_vertical"

                android:autoSizeTextType="uniform"
                android:autoSizeMinTextSize="12sp" // 최소 크기
                android:autoSizeMaxTextSize="18sp" // 최대 크기
                android:autoSizeStepGranularity="2sp" /> // 조정 간격

 

반응형

댓글()

안드로이드에서 모바일 네트워크 구분하기 (2G, 3G, 4G, 5G)

반응형

example.java

package com.example.mymobilenetworktype;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.widget.TextView;

import static android.telephony.TelephonyManager.NETWORK_TYPE_1xRTT;
import static android.telephony.TelephonyManager.NETWORK_TYPE_CDMA;
import static android.telephony.TelephonyManager.NETWORK_TYPE_EDGE;
import static android.telephony.TelephonyManager.NETWORK_TYPE_EVDO_0;
import static android.telephony.TelephonyManager.NETWORK_TYPE_EVDO_A;
import static android.telephony.TelephonyManager.NETWORK_TYPE_EVDO_B;
import static android.telephony.TelephonyManager.NETWORK_TYPE_GPRS;
import static android.telephony.TelephonyManager.NETWORK_TYPE_HSDPA;
import static android.telephony.TelephonyManager.NETWORK_TYPE_HSPA;
import static android.telephony.TelephonyManager.NETWORK_TYPE_HSPAP;
import static android.telephony.TelephonyManager.NETWORK_TYPE_IDEN;
import static android.telephony.TelephonyManager.NETWORK_TYPE_LTE;
import static android.telephony.TelephonyManager.NETWORK_TYPE_NR;
import static android.telephony.TelephonyManager.NETWORK_TYPE_UMTS;

public class MainActivity extends AppCompatActivity {
    private TextView textView;
    private TelephonyManager telephonyManager;

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

        textView = findViewById(R.id.textView);
        ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_PHONE_STATE}, PackageManager.PERMISSION_GRANTED);
        telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }

        switch (telephonyManager.getDataNetworkType()) {
            case NETWORK_TYPE_EDGE:
            case NETWORK_TYPE_GPRS:
            case NETWORK_TYPE_CDMA:
            case NETWORK_TYPE_IDEN:
            case NETWORK_TYPE_1xRTT:
                textView.setText("2G");
                break;
            case NETWORK_TYPE_UMTS:
            case NETWORK_TYPE_HSDPA:
            case NETWORK_TYPE_HSPA:
            case NETWORK_TYPE_HSPAP:
            case NETWORK_TYPE_EVDO_0:
            case NETWORK_TYPE_EVDO_A:
            case NETWORK_TYPE_EVDO_B:
                textView.setText("3G");
                break;
            case NETWORK_TYPE_LTE:
                textView.setText("4G");
                break;
            case NETWORK_TYPE_NR:
                textView.setText("5G");
                break;
            default:
                textView.setText("Unknown");
        }
    }
}

 

[출처] https://programmerworld.co/android/how-to-detect-the-mobile-network-type-2g-3g-4g-5g-from-your-android-app-android-studio-complete-source-code/

반응형

댓글()

Ubuntu 18.04 에서 Android Studio 및 AVD 설치하기

프로그래밍/Android (Java)|2021. 5. 21. 11:18
반응형

Ubuntu 18.04 에서 안드로이드 개발 환경 Android Studio 를 설치하고, AVD 를 이용하여 여러 단말기의 사이즈, OS 종류에서 테스트 할 수 있습니다.

 

1. 설치

# add-apt-repository ppa:maarten-fonville/android-studio

# apt -y update

# apt -y install android-studio

 

2. 실행

# /opt/android-studio/bin/studio.sh

설치 마법사에서 Next 이나 Custom 을 누르면 되고, 설치과정중 AVD 를 선택 후 Finish 를 눌러 설치를 진행합니다.

설치가 완료되어 Android Studio 가 실행되면 기본 프로젝트를 생성하거나 기존 프로젝트를 불러와 사용이 가능합니다.

 

3. AVD 사용

메뉴 Tools > AVD Manager 를 실행합니다.

하단의 [+Create Virtual Device] 버튼을 누르고 원하는 단말기 사이즈와 OS 버전을 선택 후 생성한 뒤,

우측의 아래 화살표 (▼) 를 눌러 Cold Boot Now 를 눌러 단말기 전원을 켜면 가동됩니다.

부팅이 완료되기 까지 시간이 조금 소요됩니다.

 

 

반응형

댓글()