반응형

Visual Studio Community 2022를 업그레이드 하다 실패로 인하여 재설치를 하게 되었는데 아래와 같이 설치 파일을 다운로드 하지 않았습니다. 라는 오류가 계속 떴다.

더 상황이 기괴한건 다운로드 속도다 잘 나와야 183KB
무슨 2400bps 모뎀도 아니고 2023년에 이기 머선 129 -_-

해결방법은 있다.
양형님들 사이트에서 hosts파일을 수정하여 IP를 추가해주면 된다카더라.
https://stackoverflow.com/questions/72200029/not-able-to-install-visual-studio-2022-using-visual-studio-installer
스택오버플로우는 언제나 진실이다.



1. host파일이 있는 위치로 이동한다.
C:\Windows\System32\drivers\etc

2. hosts파일을 메모장(관리자권한으로 실행한)으로 불러들여 아이디 한칸 띄우고 download.visualstudio.microsoft.com 이렇게 입력하고 저장해주면 된다.
추가해줄 아이피 리스트는 아래에서 아무거나 골라서 추가하면 된다.
이렇게 말이다.
93.184.215.201 download.visualstudio.microsoft.com
68.232.34.200 download.visualstudio.microsoft.com
192.229.232.200 download.visualstudio.microsoft.com
36.25.247.107 download.visualstudio.microsoft.com
192.16.48.200 download.visualstudio.microsoft.com

그리고 다시 visual studio installer를 가보면 속도가 그나마 MB로 상향된것을 확인할 수 있을것이다.
만약 속도가 그대로라면 일시 중지 후 다시 이어서 시작하면 될 것이다.

이것 때문에 아무것도 못하고 반나절 이상 시간을 허비해버렸다.

 

 

반응형
Posted by Hippalus
,

반응형

                .Parameters.Append .CreateParameter("DA_NAME", adVarChar, adParamInput, 100, DA_NAME)

                .Parameters.Append .CreateParameter("DA_LAT", adDouble, adParamInput, , DA_LAT)

                .Parameters.Append .CreateParameter("DA_LNG", adDouble, adParamInput, , DA_LNG)

 

adEmpty 0 No value
adSmallInt 2 A 2-byte signed integer.
adInteger 3 A 4-byte signed integer.
adSingle 4 A single-precision floating-point value.
adDouble 5 A double-precision floating-point value.
adCurrency 6 A currency value
adDate 7 The number of days since December 30, 1899 + the fraction of a day.
adBSTR 8 A null-terminated character string.
adIDispatch 9 A pointer to an IDispatch interface on a COM object. Note: Currently not supported by ADO.
adError 10 A 32-bit error code
adBoolean 11 A boolean value.
adVariant 12 An Automation Variant. Note: Currently not supported by ADO.
adIUnknown 13 A pointer to an IUnknown interface on a COM object. Note: Currently not supported by ADO.
adDecimal 14 An exact numeric value with a fixed precision and scale.
adTinyInt 16 A 1-byte signed integer.
adUnsignedTinyInt 17 A 1-byte unsigned integer.
adUnsignedSmallInt 18 A 2-byte unsigned integer.
adUnsignedInt 19 A 4-byte unsigned integer.
adBigInt 20 An 8-byte signed integer.
adUnsignedBigInt 21 An 8-byte unsigned integer.
adFileTime 64 The number of 100-nanosecond intervals since January 1,1601
adGUID 72 A globally unique identifier (GUID)
adBinary 128 A binary value.
adChar 129 A string value.
adWChar 130 A null-terminated Unicode character string.
adNumeric 131 An exact numeric value with a fixed precision and scale.
adUserDefined 132 A user-defined variable.
adDBDate 133 A date value (yyyymmdd).
adDBTime 134 A time value (hhmmss).
adDBTimeStamp 135 A date/time stamp (yyyymmddhhmmss plus a fraction in billionths).
adChapter 136 A 4-byte chapter value that identifies rows in a child rowset
adPropVariant 138 An Automation PROPVARIANT.
adVarNumeric 139 A numeric value (Parameter object only).
adVarChar 200 A string value (Parameter object only).
adLongVarChar 201 A long string value.
adVarWChar 202 A null-terminated Unicode character string.
adLongVarWChar 203 A long null-terminated Unicode string value.
adVarBinary 204 A binary value (Parameter object only).
adLongVarBinary 205 A long binary value.
AdArray 0x2000 A flag value combined with another data type constant. Indicates an array of that other data type.
반응형
Posted by Hippalus
,

반응형

github에 파일 관리를 위해 GUI 환경을 제공하는 여러툴들 중 괜찮은 source tree 기본 사용법이다.

설치는 알아서 하시고 상단 메뉴들 중 + Create를 누르면 아래처럼 로컬(나는 내부 네트워크 폴더가 로컬작업화면이다.) 설정 화면이 나타난다.

Create Repository On Account를 눌러 git repository를 만들수도 있겠으나 만들어는 지지만 오류가 나타난다.

따라서 그냥 로컬만 만들고 git자체는 github.com에서 만들길 권장한다.
일단 로컬환경을 구축하였다면 이번엔 리모트(github.com) 환경을 만든다.

최상단 메뉴의 Repository > Add Remote를 눌러

Repository Setting 화면을 불러온다.

name과 url을 입력해야 하는데

먼저 github.com에 접속하여 Remote Repository를 생성한다.
나는 로컬과 동일한 이름인 HelloHell로 그리고 공개여부는 Private로 하였다.
github.com은 3명까지는 무료로 Private를 이용할 수 있는것으로 알고 있다.

Create a new repository를 눌러 생성하였다면 아래처럼 생성된 화면과 함께 HTTPS 주소를 확인할 수 있다.
일단 이 주소(https://github.com/arosones/HelloHell.git)를 복사한다.

그리고 Source Tree의 URL에 붙여넣으고 끝내면 좋으련만 21년 이후로 계정 설정이 바뀌어서 토큰을 생성하여 주소에 포함시켜야만 한다.

더 자세한 토큰 생성법은 내가 이전에 작성한 포스트를 참고하길 바란다.
(https://hippalus.tistory.com/569)

토큰이 만들어졌다면 이제 이 토큰을 URL에 붙여넣는다.
방식은 https://토큰@github.com/당신의계정과 레파지토리 주소 이다. 

모르겠다면 내 포스팅을 참고하라
(https://hippalus.tistory.com/569)

문제 없이 진행했다면 좌측 REMOTES아래에 HelloHell이 나타남이 확인될 것이다.

 

여기까지가 가장 기본인 로컬과 리모트 저장소 생성방법이었다.
이제부턴 파일을 실제로 리모트 환경인 git으로 올려보겠다.
화면을 Source Tree(좌), 로컬저장소(우상단), github.com(우하단) 이렇게 3개를 한번에 캡쳐 떠 보았다.
로컬저장소에 파일을 아무거나 만들고 Source Tree에서 가만히 기다리거나 F5를 누르면 추가한 파일이 나타난다.

Unstaged files 윈도우 영역에서 우측의 + 버튼을 누르면 Staged files 윈도우 영역으로 파일이 올라가고 좌상단의 Commit 을 눌러 Commit을 시도하면 하단의 Commit 윈도우에 적당한 문장을 작성할 수 있다.
난 First Commit이라 작성했다.
Commit버튼을 눌러 Commit을 실행한다.

그럼 이렇게 History에 First Commit 문구와 함께 로컬 저장소의 master로 파일이 저장된것을 확인할 수 있다.

그럼 이제 리모트 환경인 github.com으로 동기화 작업을 진행해 보겠다.
상단 메뉴의 Push를 누르면 창이 하나 뜨는데 체크박스가 있다.
이걸 체크해주자.

그러면 git에 master가 보여지고 Push를 누르면 git으로 전송되어 동기화가 일어난다.

동기화가 이루어진 결과다.
우측 하단에 보면 FirstHell.txt의 모습을 확인할 수 있다.

하는김에 하나 더 해보자.
이번엔 SecondHell.txt를 만들어 아까처럼 Unstaged files의 파일리스트 +버튼을 눌러 staged files윈도우로 보내고 또 Commit를 하면

아까와 조금 다르게 Push에 숫자1 뱃지가 표시됨을 확인할 수 있다.

 

 

여기까지가 기본적인 로컬과 리모트 환경의 동기화였다.

그럼 이제 조금 더 나아가보자
git활용법 중 정책이란게 있다.
master만 운영하면 나중에 개발할 때 master로 동기화를 무턱대고 해버리게 되면 버그가 발생하고 난리가 난다.
그래서 정책을 설정하는데 일반적인 dev도 있고 긴급한 오류 수정인 hotfix도 있고 각 상황에 맞게 각 회사들마다의 정책이 있을 것이다.
이것까지 논하기엔 주제가 너무 나가버리니 그냥 난 서비스인 master와 개발 환경인 dev두개로만 정책을 설정했다 치겠다.
즉 개발로 모든 작업이 끝나면 master로 덮어 쓰는 구조정도로 이해하면 되겠다.

github.com에서 아래처럼 새로운 정책으로 dev를 만든다.
dev라 입력하고 Create branch:dev from 'master'를 누르면 된다.

그리고 이번엔 Dev로만 보내기 위해 DevHell.txt란 파일을 로컬에 만든 후

Source Tree에서 Unstaged files에서 +버튼을 눌러 Staged files로 보낸 후 마찬가지로 Commit를 시킨다.

다 되었으면 이제 Push를 해야 하는데 이상하다.
remote branch 콤보박스 컨트롤에 dev가 나타나지 않는다.
master만 보인다.

이럴 땐 그냥 dev라고타이핑 하면 된다.
source tree가 잘 만든 툴이지만 버그들이 좀 보인다. -_-

dev 입력 후 push를 누른 후 github로 이동해서 보면 dev에만 DevHell.txt가 동기화 된 것이 확인된다.

master로 가보면 당연히 devhell.txt파일을 찾을 수 없다.

여기까지 source tree의 기본 사용법과 아주 조금 응용법에 대해 알아봤다.

반응형
Posted by Hippalus
,

반응형

개나 소나 말이나 닭이나 죄 git을 사용해대지만 조금 더 편리하게 사용하려면 GUI를 지원해주는 툴을 사용하는것도 방법이다.
그런데 얘네들이 너무 바꿔댄다.
프로그램들도 툭하면 deprecated deprecated deprecated ... -_-

시키는대로 다 해도 오류가 나면서 완료됨이라며 Push가 되질 않는다.

읽어보면 2021년에 패스워드 방식이 종료됐다란 이야기이다.
이런건 그냥 툴 자체에서 사전에 제대로 흐름을 자연스럽게 셋팅이 가능하도록 좀 해줘야 하는거 아닌가 ㅡㅡ

githun.com으로 이동해서 우측 상단의 내 프로필을 선택하여 토큰을 발급받는 곳까지 이동한다.
2023년 1월 현재 경로는 다음과 같다.
Personal Access Tokens (Classic) (github.com)

https://github.com/settings/tokens

이동하면 Fine-grained tokens방식과 Tokens(classic)방식이 있는데 대충 두개 차이는 베타버전인 Fine이 좀 더 수월하고 뭐 그런것 같은데 난 그냥 classic 버전을 선택했다.
선택하면 토큰이 사용될 Note와 토큰 만료일을 대충 설정하고 
가장 중요한 repo에 체크를 반드시 한 후 스크롤을 내려 녹색 generate 버튼을 눌러 토큰을 생성하자.

생성한 토큰은 Source Tree의 상단 메뉴의 우측을 보면 설정(톱니아이콘)이 있는데 여길 누르면 저장소 설정화면이 뜨고 원격 저장소 경로를 더블클릭하거나 편집을 누르면 아래와 같이 원격 저장소 정보 화면으로 이동된다.
여기에 아까 생성한 토큰을 URL에 넣어주면 되는데 방식은 이렇다.
빨강색은 불변
주황색은 앞서 생성한 토큰
파랑색은 각자 계정과 레파지토리명
https://생성한토큰@github.com/내계정/레파지토리

좀 기괴하다 만든놈이 이렇게 입력하라니 어쩔 수 없다만 내가 만들었다면 토큰입력항목과 내계정 그리고 레파지토리를 각각 따로 입력하는 UI를 제공했을것이다.

여기까지 다 했다면 이제 커밋과 Push가 모두 다 잘 되는것을 확인할 수 있을것이다.

반응형
Posted by Hippalus
,

반응형

중국 앱들 때문에 애플에서 특단의 조치를 취한지 어언 석달이 지났나?
클립보드에 내용이 있는 상태에서 금융앱들을 실행하면 붙여넣기를 허용하겠느냐라는 짜증나는 안내창이 반겨준다.
이번 패치에 해결됐나 싶었는데 여전히 해당 증상이 나타나길래 애플넘들 정신 못차리고 있구나 싶었는데 설정에서 해결할 수 있는 방법이 있었다.

먼저 환경설정 톱니바퀴 아이콘을 터치해서 설정으로 들어간 후
짜증나는 붙여넣기 허용 안내가 뜨는 앱들을 일일이 들어가서
(뭔 카카오 시리즈가 이리 많냐 ㅡㅡ)

참고로 나는 설정 > 토스를 선택했다.
토스 설정으로 들어가면 다른 앱에서 붙여넣기가 기본 묻기 상태로 되어 있다.

이를 선택하면 묻기, 거부, 허용이 있는데 허용을 선택해준다.

이제 앱에서 다시는 허용하겠느냐라는 안내창을 볼 일이 없다.
중국은 참 여러모로 대단하다.
우한 폐렴 (코로나 19)도 그렇고 앱에서 개인정보 탈취하는 것도 그렇고
보이스피싱에 
도대체 인류에 도움이 되는 일이 있기나 하는 것인지

반응형
Posted by Hippalus
,

반응형

흔히 부르는 햄버거 메뉴를 눌렀을 때 이벤트 감지를 알려주는 강좌를 보고 따라 했음에도 햄버거 메뉴가 동작 자체를 안하는 문제를 발견했다.
        leading: IconButton(
          icon: Icon(Icons.menu),
          onPressed: () {
            print("Menu Call!!!!");
          },
        ),
강좌에서 동작했던 코드인데
아래처럼 해야만 동작했다.
        leading: Builder(
          builder: (context) => IconButton(
            icon: new Icon(Icons.settings),
            onPressed: () => Scaffold.of(context).openDrawer(),
          ),
        ),

그새 구글이 구글했나보다.
작작 좀 바꿔라.

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  //const MyApp({super.key});
  final appTitle = 'Drawer Demo';
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: appTitle,
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.red,
      ),
      home: Home(),
    );
  }
}

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: Builder(
          builder: (context) => IconButton(
            icon: new Icon(Icons.settings),
            onPressed: () => Scaffold.of(context).openDrawer(),
          ),
        ),
        title: Text('Drawer'),
        elevation: 0.0,
        centerTitle: true,
        actions: [
          IconButton(
            icon: const Icon(Icons.shopping_cart),
            onPressed: () {
              print("AA2222");
            },
          ),
          IconButton(
            icon: const Icon(Icons.search),
            onPressed: () {},
          ),
        ],
      ),
      body: Center(child: Text('My Page!')),
      drawer: Drawer(
        child: ListView(
          padding: EdgeInsets.zero,
          children: [
            // DrawerHeader(
            //   child: Text('Drawer Header'),
            //   decoration: BoxDecoration(
            //     color: Colors.blue,
            //   ),
            // ),
            UserAccountsDrawerHeader(
              currentAccountPicture: CircleAvatar(
                backgroundImage: AssetImage('assets/0001.gif'),
              ),
              otherAccountsPictures: [
                CircleAvatar(
                  backgroundImage: AssetImage('assets/0002.png'),
                )
              ],
              accountEmail: Text('dev.yakkuza@gmail.com'),
              accountName: Text('Dev Yakuza'),
              onDetailsPressed: () {
                print('press details');
              },
              decoration: BoxDecoration(
                  color: Colors.blue[300],
                  borderRadius: BorderRadius.only(
                    bottomLeft: Radius.circular(40),
                    bottomRight: Radius.circular(40),
                  )),
            ),
            ListTile(
              title: Text('Item 1'),
              onTap: () {
                Navigator.pop(context);
              },
            ),
            ListTile(
              title: Text('Item 2'),
              onTap: () {
                Navigator.pop(context);
              },
            ),
          ],
        ),
      ),
    );
  }
}

반응형
Posted by Hippalus
,

반응형

visual studio code로 flutter를 개발하기 위해 extension을 설치하고 F1을 눌러 New project를 누르면 

이딴게 호출되는 사람이 있을 수 있다.  그게 나다 -_-
이상한건 난 분명히 환경변수를 설정해줬단 말이다.
그래도 뜨니 어쩔 수 없다. 또 하는 수 밖에

flutter site에서 파일을 다운받은 후 루트 > Users > hippalus (참고로 이 폴더는 내 유저명임) > Development (참고로 새로 만든 폴더임) > flutter를 위치시켜 뒀다.

터미널을 열어(터미널이 어디있는지 모른다면 응용프로그램 폴더의 유틸리티 폴더를 참조할것)

vim editor를 열기 위해 

vi ./~zshrc 입력 후 엔터

vim editor에 대해 더 알고 싶다면 이 블로그 글 참조 바람 잘 설명되어 있음
머여 내 포스트랑 겹치는 내용이네? ㅋ
https://d-dual.tistory.com/8

 

[ Mac OS / Terminal ] zsh 셸에서 Vim을 이용하여 환경 변수 설정하는 방법.

📝 VIM 소개 - vim.org Vim은 모든 종류의 텍스트를 만들고 변경할 수 있도록 구성 가능한 텍스트 편집기입니다. 대부분의 UNIX 시스템 및 Apple OS X에 "vi"로 포함되어 있습니다. 라고 vim 공식 페이지에

d-dual.tistory.com

vim editor에서 i를 눌러 INSERT모드로 진입 후 각자 위치시킨 경로를 입력 

export PATH="$PATH:/Users/hippalus/Development/flutter/bin"

다 입력했다면 esc키를 눌른 후 :wq 엔터치면 vi editor에서 빠져나옴

터미널로 다시 넘어왔다면 업데이트 한 내용을 적용하기 위해 source 명령어 사용

source .bashrc 실행하면 끝

반응형
Posted by Hippalus
,

반응형

SELECT
   OBJECT_NAME(object_id),  OBJECT_DEFINITION(object_id)
FROM 
   sys.procedures
WHERE 
   OBJECT_DEFINITION(object_id) LIKE '%내용%'

반응형
Posted by Hippalus
,

반응형

<INPUT TYPE="CHECKBOX" NAME="CHK" CLASS="CHECKDATA" VALUE="1">체크1
<INPUT TYPE="CHECKBOX" NAME="CHK" CLASS="CHECKDATA" VALUE="2">체크2
<INPUT TYPE="CHECKBOX" NAME="CHK" CLASS="CHECKDATA" VALUE="3">체크3

이렇게 체크박스가 동일한 클래스명으로 여러개 존재하고 라디오 버튼처럼 하나의 체크박스만 체크 가능하게 할 경우
체크박스의 체인지 이벤트에 아래와 같이 코딩해주면 끝남

           
$(".CHECKDATA").on('change', function() {
                $(".CHECKDATA").not(this).prop('checked', false);  
            });

반응형
Posted by Hippalus
,

반응형

망할 azure PaaS 환경의 클라우드 이관 작업을 진행하려다 보니 관련 부서에서 날짜 관련해서 제약사항이 생긴다란 이야기를 듣고 생각해보니 기존 소스들이 이관되면 엉망이 되겠다 싶어 미리 준비해보았다.

당장 javascript로 만들어진 new Date()만 보더라도 한국 시간과 미국 시간의 차이로 임계영역에 다다르면 날짜가 서로 꼬이게 될 것이란건 너무나 자명했다.

현재 서버호스팅 환경에선 new Date()시 2022-08-08 19:00:00이던게 
미국과 한국은 13시간의 차가 있으므로 azure PaaS 클라우드 환경에선 2022-08-09 20:00:00으로 보여지게 될테니 말이다. 

그리하여 기존의 new Date()대신 new AzureDate()를 호출하면 해당 함수내에서 알아서 시간계산을 해서 값을 돌려준다면 모든게 해결될 듯 보였다.
어차피 getFullYear(), getMonth(), getDate() 등의 함수는 new Date()로 받아온 시간객체를 통해 얻는 행위이므로 AzureDate()만 만들다면 이 모든건 소스 수정 없이 우아하게 처리 될 것이다.

아래가 그 결과물이다. 
    function AzureDate() {
        var dt;
        
        if (arguments.length == 0) {
            dt = new Date();
        } else if (arguments.length == 1) {
            dt = new Date(arguments[0]);
        }

        dt.setHours(dt.getHours() + 13);        
        
        return dt;
    }

특이한 부분은 arguments.length라는 부분이다.
new Date(), new Date("2022-08-08") 이렇게 인자를 넘겨서 객체를 생성하기 때문에 내가 만든 javascript 함수도 이에 대응할 필요가 있었다.

하지만 우리의 자바스크립트는 오버로딩을 지원하지 않는다.
https://www.geeksforgeeks.org/function-overloading-in-javascript/
Unlike the other programming languages, JavaScript Does not support Function Overloading
Here is a small code which shows that JavaScript does not support Function Overloading.

 

Function Overloading in JavaScript - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

따라서 arguments.length로 분기해준다면 훌륭하게 잘 처리가 가능하다.

다 만들어 놓고 azure cloud에 올려 테스트해봤더니 -_-
시간차가 벌어지지 않더라
생각해보니 javascript는 로컬이잖 -_-

내친김에 classic asp로도 만들어봤는데 마찬가지로 시간차가 없었단 -_-

    function AzureDate() 
        Dim dateVal
        dateVal = dateadd("h", 13, now())
        
        AzureDate = year(dateVal) & "-" & Right(String(2, "0") & month(dateVal), 2) & "-" & Right(String(2, "0") & day(dateVal), 2)
    end function

    function AzureNow() 
        Dim dateVal
        dateVal = dateadd("h", 13, now())
        AzureNow = dateVal
    end function


한국 서버에서 돌린 결과 2022-08-08 오후 7:30:00
8/8/2022 7:30:00 PM
azure Cloud서버가 한국에 있어서 그런건지...
이건 좀 이상하므로 설치한 담당자에게 물어보는 중

반응형
Posted by Hippalus
,