무료 SSL 인증서로 letsencrypt는 정말 유용합니다.

다만 3개월마다 갱신해줘야한다는게 불편하긴하지만, 이것도 cron걸어두면 괜찮죠..

 

cron에서 걸어둘 인증서 자동 관리기인 certbot에서 renew가 명령어가 안될때..

 

다음과 같이 conf파일에 사용할 수없는 문자가 입력되어 오류가 날 수 있습니다. (다른 이유가 있을 수도 있으니, 오류 메시지를 잘 확인하도록 합니다.)

grep -r -P '[^\x00-\x7f]' /etc/nginx /etc/letsencrypt/ 해서 어느파일에서 00 ~7f 문자가 사용되었는지 확인합니다.

 

nginx에서 gzip 으로 압축하여 전달하지 않을 user-agent문자열 셋팅 부분에 불용문자열이 있네요.

gzip_disable "MSIE [1-6].(?!.*SV1)" 으로 변경하였습니다.

 

이제 SSL 갱신이 잘됩니다.

vmware 15.x 버전을 쓰고 있는데 호스트운영체제(윈도우즈)와 게스트운영체제(CentOS8)의 폴더 공유가 잘 되지 않아 해당 도움말을 찾아보았습니다.

 

docs.vmware.com/en/VMware-Workstation-Pro/15.0/com.vmware.ws.using.doc/GUID-AB5C80FE-9B8A-4899-8186-3DB8201B1758.html

 

위 링크에 도움말이 있고, 각 vmware제품 버전에 맞추어 확인하면됩니다.

 

1.먼저 VM Setting에 공유폴더를 설정합니다.

2. 게스트 OS에서 아래와 같이 마운트를 시킵니다.

잘 되네요~

 

아래는 사이트에 있는 설명입니다.

 

After you enable a shared folder, you can mount one or more directories or subdirectories in the shared folder to any location in the file system in addition to the default location of /mnt/hgfs.

Depending on the kernel version of the Linux guest operating system, VMware Tools uses different components to provide shared-folder functionality. In Linux kernels prior to version 4.0, the VMware Tools services script loads a driver that performs the mount. Linux kernels 4.0 and later use a FUSE file system component.

You can use different mount commands to mount all shares, one share, or a subdirectory within a share to any location in the file system. The commands also vary depending on the Linux-kernel version of the guest.

Mount Command SyntaxLinux Kernel Prior to 4.0Linux Kernel 4.0 and LaterDescription

mount -t vmhgfs .host:/ /home/user1/shares /usr/bin/vmhgfs-fuse .host:/ /home/user1/shares -o subtype=vmhgfs-fuse,allow_other Mounts all shares to /home/user1/shares
mount -t vmhgfs .host:/foo /tmp/foo /usr/bin/vmhgfs-fuse .host:/foo /tmp/foo -o subtype=vmhgfs-fuse,allow_other Mounts the share named foo to /tmp/foo
mount -t vmhgfs .host:/foo/bar /var/lib/bar /usr/bin/vmhgfs-fuse .host:/foo/bar /var/lib/bar -o subtype=vmhgfs-fuse,allow_other Mounts the subdirectory bar within the share foo to /var/lib/bar

For Linux kernel prior to version 4.0, you can use VMware-specific options in addition to the standard mount syntax. Enter the command /sbin/mount.vmhgfs -h to list the options.

For Linux kernel version 4.0 or later, enter the command /usr/bin/vmhgfs-fuse -h to list the available options.

값 출력 비교를 위한 엑셀의 샘플 자료값입니다.

    class Program
    {
        static void Main(string[] args)
        {
            var x = new decimal[] { 20, 30, 40, 50, 60, 70 };
            var y = new decimal[] { 12.48M, 32.33M, 33.11M, 84.12M, 45.91M, 40.11M };

            var cp = CovarianceP(x, y);
            Console.WriteLine("Covariance Population : {0}", cp); //모집단 공분산


            var cs = CovarianceS(x, y);
            Console.WriteLine("Covariance Sample : {0}", cs); //표본집단 공분산

            Console.ReadLine();
        }

        /// <summary>
        /// 모집단 공분산 구하기
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        static decimal CovarianceP(decimal[] x, decimal[] y)
        {
            if (x.Length != y.Length)
                throw new ArgumentException("two parameters must be same length.");

            var avg_x = x.Average();
            var avg_y = y.Average();

            return x.Zip(y, (x1, y1) => (x1 - avg_x) * (y1 - avg_y)).Average();
        }

        /// <summary>
        /// 표본집단 공분산 구하기
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        static decimal CovarianceS(decimal[] x, decimal[] y)
        {
            if (x.Length != y.Length)
                throw new ArgumentException("two parameters must be same length.");

            var avg_x = x.Average();
            var avg_y = y.Average();

            return x.Zip(y, (x1, y1) => (x1 - avg_x) * (y1 - avg_y)).Sum() / (x.Length -1);
        }
    }

 

결과입니다.

double로 하실경우 소수점 마지막자리에 오차가 좀 발생합니다.

 

 

공분산에 대한 설명은 이분 블로그에서 너무나 친절하고 쉽게 설명이 되어 있습니다.

https://blog.naver.com/ikek21/220003173213

 

공분산(covariance)

공분산이 뭐에요? 란 질문에.. 난 당황했었다.. 다.. 당황하셨어요? 그리곤 재빨리 자리를 피했다.. 하지만...

blog.naver.com

 

rust 및 cargo 설치  후, cargo install wasm-pack 으로 wasm 개발팩을 설치하게 되는데 GCC관련 오류가 납니다.

 

 

윈도우용 MinGW-W64를 설치해야하고 설치시, Architecture에서 x86_64를 선택해주어야합니다.

MinGW-W64 설치후 bin에 PATH 꼭 걸어두셔야하구요.

C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin

 

 

모두 컴파일 되고 마지막에 아래처럼 오류가 날 수 있습니다.

 

그러면 rustup update 를 해서 rust 환경을 최신으로 업데이트 해야합니다.

 

다시 cargo install wasm-pack 하면 모두 잘 인스톨 되는걸 확인할 수 있습니다.

배포환경은 리눅스 Centos7 였습니다.

윈도우 로컬 개발환경에서는 잘 기록되는 NLog가 리눅스 서버에 배포하면 잘 기록되지 않는 문제였습니다.

 

진입점소스는 아래와 같은 형태였었습니다. (네, 인터넷에서 검색해서 그냥 넣었습니다 ㅡㅡ)

        public static void Main(string[] args)
        {
            var config = new ConfigurationBuilder()
                            .SetBasePath(System.IO.Directory.GetCurrentDirectory())
                            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                            .Build();

            NLog.LogManager.Configuration = new NLogLoggingConfiguration(config.GetSection("NLog"));

            var host = CreateHostBuilder(args)
                .Build();
            
            host.Run();
        }

 

그리고 배포시에 사용하는  appsettings.Production.json 파일에 다음과 같이 설정하였습니다.

 

  {"NLog": {
    "variables": {
      "var_logdir": "/var/www/www.mydomain.com/log"
    },
    "targets": {
      "logfile": {
        "type": "File",
        "fileName": "${var_logdir}/nlog-${shortdate}.log"
      },
      "logconsole": {
        "type": "Console"
      }
    }
  }
 }

기본 개발환경에서는 var_logsdir 부분의 값은 "D:\Logs" 였구요..

 

첨에 왜 안되는지 이유를 모르고 좀 헤맸는데, 소스를 보면 간단히 확인되는 문제였습니다.!

 

위에 .AddJsonFile에서 기본적인 appsetting.json 만 해주었기 때문입니다.

(알아서 Production 등이 처리되는 줄... 착각했었네요..)

 

.AddJsonFile ... 부분 하단 라인에 아래와 같이 추가적으로 실행 환경에 맞는 설정을 추가해줘야합니다.

진입 함수에서 아래코드로 확인 가능합니다.

 

var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

 

=== 생략 ===

.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)

.AddEnvironmentVariables()

 

 

 

보통 Startup에서 저런 구성을 넣어주더군요...

 

하지만 굳이 env 불러오지 않고, 아래처럼 소스를 수정하여 해결을 보았습니다.

 

    public class Program
    {
        public static void Main(string[] args)
        {
            var host = CreateHostBuilder(args)
                .Build();
            host.Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) => 
            Host.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration(ConfigConfiguration) //ConfigConfiguration 호출
                .UseNLog() //NLog 사용
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder
                    .ConfigureKestrel(serverOptions => {
                        serverOptions.Limits.MaxConcurrentConnections = 1000;
                        serverOptions.Limits.MaxConcurrentUpgradedConnections = 1000;
                        serverOptions.Limits.MaxRequestBodySize = 1024 * 1024 * 100;
                        serverOptions.Limits.MinRequestBodyDataRate = new MinDataRate(bytesPerSecond: 100,
                                gracePeriod: TimeSpan.FromSeconds(10));
                        serverOptions.Limits.MinResponseDataRate = new MinDataRate(bytesPerSecond: 100,
                                gracePeriod: TimeSpan.FromSeconds(10));                        
                        serverOptions.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(2);
                        serverOptions.Limits.RequestHeadersTimeout = TimeSpan.FromMinutes(1);
                    })
                    .UseStartup<Startup>();
                });
        

        static void ConfigConfiguration(HostBuilderContext ctx, IConfigurationBuilder config)
        {            
            NLog.LogManager.Configuration = new NLogLoggingConfiguration(config.Build().GetSection("NLog"));      
        }
    }

 

Builder 구성부분에서 config를 받아 메소드를 수행할 수 있도록 했고.

해당 메소드에서 NLog설정을 셋팅하도록 했습니다.

 

이제 각 환경 Development, Staging, Production 따라 각기 다른 환경에 맞게 로그가 잘 기록이 되는군요.

1. 기본 사항

당연한 이야기지만 FTP서비스와 Management 서비스가 설치되어 있어야 합니다.

2. Management Service에서 IIS Manager credetials가 체크되어 있어야 합니다.

3. FTP 인증에서 IIS ManagerAuth가 설정되어 있어야 합니다.

4. FTP 권한 룰에서는 접속 계정명이 설정되어 있어야 합니다.

Read, Write Permission을 상황에 맞게 적절하게 선택합니다.

 

5.퍼미션 설정 확인

 

#트러블 슈팅 기본

1.로컬 요청에대해서 상세 메시지를 볼 수 있도록 합니다.(기본으로 되어있으나 확인!)

2. 이벤트 로그를 확인합시다.

 

 

대표 해결 사례, # 530 에러 발생시

1.

C:\Windows\System32\inetsrv\Config 에 NETWORK SERVICE 계정에 읽기 권한을 줍니다.

 

2.관리자 권한으로 커맨드 라인을 실행하여 

iisreset /noforce

을 입력해서 iis를 리셋합니다.

 

3.잘 적용이 안되는 경우 서버를 리부팅합니다. (이렇게 해서 해결된적 있네요;;)

 

Blender3d에서 창을 나누거나 합치는 방법입니다.

 

상단 좌우측 끝을 왼쪽, 혹은 오른쪽으로 이동하여 합치거나 나누는 것이 가능합니다.

좌측 모서리에서 좌측으로 마우스를 드래그 할 경우나, 우측 모서리에서 우측으로 마우스를 드래그하는 경우,

창을 합치고, 그 반대의 경우는 창을 분리하게 됩니다.

 

창 합치기, 창 분리하기

'앱개발' 카테고리의 다른 글

JSON.stringify / JSON.parse 활용  (0) 2024.08.31
inkscape - 도형 머지하기  (0) 2024.06.19
윈도우용 npm 업그레이드 하기,  (0) 2019.04.01
PouchDB에 관해서...  (0) 2019.02.22
예쁜 패턴 만들어주는 사이트  (0) 2018.09.28

quartz net 에서는 timestamp값을 0001-01-01 00:00:00 부터 Time Tick (TotalMiliSecond * 100)값을 저장합니다.

오라클에서 Tick값을 그대로 계산해서 보면 2일이 모자라게 나타납니다.

 

아래 쿼리로 확인하면 제대로 보입니다.

 

9/24 시간을 붙힌 이유는 대한민국 Timezone 시간을 덧 붙혀서 계산해야 제대로 보입니다.


select to_date('1970-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS') +
       (
          (LAST_CHECKIN_TIME - 621355968000000000 ) -- (now ticks - UNIX epoch in CLR ticks)
            /10000000 -- CLR ticks per second
        )/60/60/24 + 9/24 -- convert from seconds to days for date addition arithmetic
as date_from_ticks
from QRTZ_SCHEDULER_STATE;

 

 

아래처럼 해도 결과는 동일합니다.

SELECT to_date('0001-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS') +
       (LAST_CHECKIN_TIME / (10000000 * 60 * 60 * 24)) + 2 + (9/24)
as date_from_ticks
from QRTZ_SCHEDULER_STATE;

 

Time Tick값을 DateTime으로 변경

 

참고:

https://stackoverflow.com/questions/20052643/date-math-in-oracle-related-to-net-ticks

+ Recent posts