728x90
반응형

락을 풀기전에는 hash가 82 에서 점점 떨어져 48까지 내려감

* 락 푸는 과정

1. 그래픽 드라이버 업데이트하기 : 512.15 이상

2. https://github.com/NebuTech/NBMiner/releases 사이트에서 NBMiner_41.5_Win.zip 다운로드

3. 압축을 풀고 driver_install.bat 를 관리자권한으로 실행

4. start_eth.bat 파일을 편집으로 열어서 아래 처럼 지갑주소 변경

실행한 결과 hash가 84 정도를 계속 유지한다. 해쉬가 낮은데 현재 아무것도 조정하지 않은 상황이다
(정말 LHR 이 풀리는지 궁금해서 해본거라...)

반응형

'IT Info' 카테고리의 다른 글

LHR 채굴락 풀기  (0) 2022.05.19
PowerToys  (0) 2022.05.11
[펌] HTTP2  (0) 2022.05.03
원격 데스크톱 연결 접속 IP 정보 삭제  (0) 2022.04.27
Tistory 코드블럭 복사시 개행되지 않을 때  (0) 2022.04.23
[펌] 제페토와 게더타운  (0) 2022.04.11
728x90
반응형

사용하고자할 Font 파일을 다운로드한다.
프로젝트에 Fonts 폴더를 만들고 다운로드한 폰트파일을 넣는다.

폰트의 속성창에서 아래처럼 리소스(Resource)를 선택한다.


화면의 xaml 단에아래처럼 정의해서 쓰면 된다.
FontFamily="/Wpf.FontTest;component/Fonts/#Donoun"

<Window x:Class="Wpf.FontTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        FontFamily="/Wpf.FontTest;component/Fonts/#Donoun"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel>
        <Label  Content="다람쥐 헌 쳇바퀴에 타고파. 폰트 적용 예제(Donoun - 전체적용)" FontSize="25" />
        <TextBlock Text="다람쥐 헌 쳇바퀴에 타고파. 폰트 적용 예제(Noto Sans)" FontSize="25" FontFamily="/Wpf.FontTest;component/Fonts/#Noto Sans CJK KR"/>
        <TextBox   Text="다람쥐 헌 쳇바퀴에 타고파. 폰트 적용 예제(고딕)" FontSize="25" FontFamily="고딕"/>
        <Label  Content="다람쥐 헌 쳇바퀴에 타고파. 폰트 적용 예제(Donoun - 전체적용)" FontSize="25" />
    </StackPanel>
</Window>

여기서 중요한건 폰트명에 #을 붙이고 폰트 파일명을 넣는게 아니라 폰트이름을 넣어야하는데
이는 글꼴을 클릭하면 아래와 같은 창에서 글꼴 이름 을 넣어줘야한다.

그런데 아래처럼 간혹 글꼴이름이 한글로 나올때가 있는데

이때는 아래 코드를 통해 영어 명칭을 알아내 영어 명칭으로 넣어주어야한다.

/// <summary>
/// 설치된 글꼴 명칭 확인
/// </summary>
private void FontList()
{
    List<string> fontList = new List<string>();
    foreach (FontFamily font in Fonts.SystemFontFamilies)
    {
        fontList.Add(string.Join(",", font.FamilyNames.Values));
        Debug.WriteLine(string.Join(",", font.FamilyNames.Values));
    }
}

소스
https://github.com/kei-soft/KJunBlog/tree/master/Wpf.FontTest

반응형
728x90
반응형

Visual Studio 에서 데이터 확인을 위해 Cosole.WriteLine 로 데이터를 표시했는데 출력창에 나타나지 않았다

2019 버전에서는 이상없이 출력이 되었다

확인해 보니 2022 부터는 using System.Diagnostics; 을 하고 Debug.WriteLine 을 써야 출력창에 표시가 된다.

반응형
728x90
반응형

Visual Studio 2022 preview 17.3.0 실행
.NET MAUI 앱(미리보기) 로 프로젝트 만들기

Nuget 패키지 관리에서 시험판 포함 체크후 Plugin.Fingerprint 3.0.0-beta.1 설치

MainPage.xaml.cs 에서 지문 인증 코드 추가

using Plugin.Fingerprint;
using Plugin.Fingerprint.Abstractions;

namespace Maui.BiometricTest
{
    public partial class MainPage : ContentPage
    {
        public MainPage(IFingerprint fingerprint)
        {
            InitializeComponent();
        }

        private async void OnClicked(object sender, EventArgs e)
        {
            var request = new AuthenticationRequestConfiguration("지문인증", "지문을 인식해주세요.");

            var result = await CrossFingerprint.Current.AuthenticateAsync(request);

            if (result.Authenticated)
            {
                await DisplayAlert("지문인식 성공!", "접근가능", "OK");
            }
            else
            {
                await DisplayAlert("지문인식 실패!", "접근불가", "OK");
            }
        }
    }
}

MauiProgram.cs 에 아래 코드 추가

builder.Services.AddSingleton<MainPage>();
builder.Services.AddSingleton(typeof(IFingerprint), CrossFingerprint.Current);

using Plugin.Fingerprint;
using Plugin.Fingerprint.Abstractions;

namespace Maui.BiometricTest
{
    public static class MauiProgram
    {
        public static MauiApp CreateMauiApp()
        {
            var builder = MauiApp.CreateBuilder();
            builder
                .UseMauiApp<App>()
                .ConfigureFonts(fonts =>
                {
                    fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                    fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
                });

            builder.Services.AddSingleton<MainPage>();
            builder.Services.AddSingleton(typeof(IFingerprint), CrossFingerprint.Current);

            return builder.Build();
        }
    }
}

Platforms > Android > MainActivity.cs 에  OnCreate 코드 추가

using Android.App;
using Android.Content.PM;
using Android.OS;

using Plugin.Fingerprint;

namespace Maui.BiometricTest
{
    [Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
    public class MainActivity : MauiAppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            CrossFingerprint.SetCurrentActivityResolver(() => this);
        }
    }
}

AndroidManifest.xml 에 권한 추가
<uses-permission android:name="android.permission.USE_BIOMETRIC" />

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
	<application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true"></application>
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
	<uses-permission android:name="android.permission.INTERNET" />
	<uses-permission android:name="android.permission.USE_BIOMETRIC" />
</manifest>

결과
https://www.youtube.com/shorts/bDWoIP8PHF0


소스
https://github.com/kei-soft/KJunBlog/tree/master/Maui.BiometricTest

반응형
728x90
반응형

아래 링크에서 파일을 다운받아서 설치한다.
https://marketplace.visualstudio.com/items?itemName=SharpDevelopTeam.ILSpy

실행하여 설치된 Visual Studio 를 선택 (2022 는 없다 ㅜㅠ)

설치가 끝나면 프로젝트를 열어 참조 중 하나를 우클릭하면 'Open in ILSpay' 메뉴가 보이고 이를 클릭하면 

아래처럼 디컴파일된 소스가 보이게 된다.

반응형
728x90
반응형

요런게 있었네...

https://docs.microsoft.com/ko-kr/windows/powertoys/?WT.mc_id=twitter-0000-docsmsft 

 

Microsoft PowerToys

Microsoft PowerToys는 Windows를 사용자 지정하기 위한 유틸리티 세트입니다. 유틸리티에는 ColorPicker, FancyZones, File Explorer 추가 기능, Image Resizer, Keyboard Manager, PowerRename, PowerToysRun, Shortcut Guide 등이 있습

docs.microsoft.com

 

반응형

'IT Info' 카테고리의 다른 글

LHR 채굴락 풀기  (0) 2022.05.19
PowerToys  (0) 2022.05.11
[펌] HTTP2  (0) 2022.05.03
원격 데스크톱 연결 접속 IP 정보 삭제  (0) 2022.04.27
Tistory 코드블럭 복사시 개행되지 않을 때  (0) 2022.04.23
[펌] 제페토와 게더타운  (0) 2022.04.11
728x90
반응형

Nuget 에서 AvalonEdit 을 검색해서 설치

MainWindow.xaml

<Window x:Class="AvaloneditTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:avalonedit="http://icsharpcode.net/sharpdevelop/avalonedit"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="5*"/>
            <ColumnDefinition Width="5*"/>
        </Grid.ColumnDefinitions>
        <avalonedit:TextEditor SyntaxHighlighting="C#" x:Name="CodeEditor1" FontFamily="Consolas" FontSize="10pt" IsReadOnly="True" Grid.Column="0"/>
        <avalonedit:TextEditor SyntaxHighlighting="C#" x:Name="CodeEditor2" FontFamily="Consolas" FontSize="10pt" IsReadOnly="True" Grid.Column="1" />
    </Grid>
</Window>

MainWindow.xaml.cs

using ICSharpCode.AvalonEdit.Highlighting;

using System.Windows;

namespace AvaloneditTest
{
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            CodeEditor1.SyntaxHighlighting = HighlightingManager.Instance.GetDefinitionByExtension(".cs");
            CodeEditor1.Load(@"MainWindow.xaml.cs");

            CodeEditor2.SyntaxHighlighting = HighlightingManager.Instance.GetDefinitionByExtension(".xaml");
            CodeEditor2.Load(@"MainWindow.xaml");
        }
    }
}

결과

반응형
728x90
반응형

MessageBox 를 이용해 메세지를 띄울때 그전에 띄워진 TopMost가 true인 창으로 인해 가려지는 경우가 있다.
가려지는 걸 막기 위해서는 MessageBox 를 띄울때 TopMost 를 true 로 처리해서 띄워야 하는데 이를 처리하는 방법은 아래와같다.

1.

using System.Windows;
MessageBox.Show("message.", "title", MessageBoxButton.OK, MessageBoxImage.Exclamation, MessageBoxResult.OK, MessageBoxOptions.DefaultDesktopOnly);

MessageBoxOptions.DefaultDesktopOnly 항목이 TopMost=true 로 처리되게 해준다

2.

 System.Windows.Forms.MessageBox.Show(new System.Windows.Forms.Form { TopMost = true }, "message", "title");

 

반응형
728x90
반응형

Server 구성

1. ASP.NET Core gRPC 서비스 프로젝트 생성


2. proto 파일 정의 (weather.proto)

syntax = "proto3";

import "google/protobuf/empty.proto";
import "google/protobuf/timestamp.proto";

option csharp_namespace = "GrpcStreamServer";

package WeatherForecast;

// The weather service definition.
service WeatherForecasts {
  // Sends a weatherStream
 rpc GetWeatherStream (google.protobuf.Empty) returns (stream WeatherData);
}

message WeatherData {
  google.protobuf.Timestamp dateTimeStamp = 1;
  int32 temperatureC = 2;
  int32 temperatureF = 3;
  string summary = 4;
}


3. WeatherService.cs 에 동작 정의
(날짜별 온도값을 랜덤하게 반환한다.)

using Google.Protobuf.WellKnownTypes;

using Grpc.Core;

using GrpcStreamServer;

using static GrpcStreamServer.WeatherForecasts;

namespace GrpcStreamServer.Services
{
    public class WeatherService : WeatherForecastsBase
    {
        private readonly ILogger<WeatherService> _logger;

        public WeatherService(ILogger<WeatherService> logger) => _logger = logger;

        public override async Task GetWeatherStream(Empty _, IServerStreamWriter<WeatherData> responseStream, ServerCallContext context)
        {
            var rng = new Random();
            var now = DateTime.UtcNow;

            var i = 0;
            while (!context.CancellationToken.IsCancellationRequested && i < 20)
            {
                await Task.Delay(500); // Gotta look busy

                var forecast = new WeatherData
                {
                    DateTimeStamp = Timestamp.FromDateTime(now.AddDays(i++)),
                    TemperatureC = rng.Next(-20, 55),
                    Summary = ""//Summaries[rng.Next(Summaries.Length)]
                };

                _logger.LogInformation("Sending WeatherData response");

                await responseStream.WriteAsync(forecast);
            }
        }
    }
}


4. Program.cs 에서 WeatherService Mapping

using GrpcStreamServer.Services;

var builder = WebApplication.CreateBuilder(args);

// Additional configuration is required to successfully run gRPC on macOS.
// For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682

// Add services to the container.
builder.Services.AddGrpc();

var app = builder.Build();

app.UseRouting();

app.UseEndpoints(endpoints =>
{
    endpoints.MapGrpcService<WeatherService>();
});

// Configure the HTTP request pipeline.
//app.MapGrpcService<WeatherService>();

app.Run();


5. Properties 의 launchSettings.json 파일에 서비스 주소 정의 및 기타 옵션 설정

{
  "profiles": {
    "GrpcStreamServer": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": false,
      "applicationUrl": "http://localhost:5038;https://localhost:7038",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}


6. appsettings.json 파일에서 Protocols 정의 및 Log Level 지정

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Kestrel": {
    "EndpointDefaults": {
      "Protocols": "Http2"
    }
  }
}


7. appsettings.Development.json 파일에서 Develope 모드 일때 Info 도 로그가 찍히도록 Log Level 정의

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning",
      "Microsoft.AspNetCore.Hosting": "Information",
      "Microsoft.AspNetCore.Routing.EndpointMiddleware": "Information"
    }
  }
}


8. Server 실행


Client 구성

1. 콘솔앱 프로젝트 생성


2. Server 에서 만들어진 proto 파일을 동일하게 Protos 폴더를 만들어 복사한다.


3. Nuget 설치
Google.Protobuf
Grpc.Net.Client
Grpc.Tools


4. 프로젝트파일 편집
<Protobuf Include="Protos\weather.proto" GrpcServices="Server" />
Server 를 Client 로 아래 처럼 바꾼다.
<Protobuf Include="Protos\weather.proto" GrpcServices="Client" />

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <None Remove="Protos\weather.proto" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Google.Protobuf" Version="3.20.1" />
    <PackageReference Include="Grpc.Net.Client" Version="2.45.0" />
    <PackageReference Include="Grpc.Tools" Version="2.45.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
  </ItemGroup>

  <ItemGroup>
    <Protobuf Include="Protos\weather.proto" GrpcServices="Client" />
  </ItemGroup>

</Project>


4.  빌드/다시빌드
빌드 하게되면 proto 파일을 이용해 c# 코드가 생성된다. (솔루션 탐색기에서 표시되지 않음)


5. 서버 연결 및 통신 (

using Google.Protobuf.WellKnownTypes;

using Grpc.Core;
using Grpc.Net.Client;

using GrpcStreamClient;

using var channel = GrpcChannel.ForAddress("http://localhost:5038");

var client = new WeatherForecasts.WeatherForecastsClient(channel);

var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
using var streamingCall = client.GetWeatherStream(new Empty(), cancellationToken: cts.Token);

try
{
    await foreach (var weatherData in streamingCall.ResponseStream.ReadAllAsync(cancellationToken: cts.Token))
    {
        Console.WriteLine($"{weatherData.DateTimeStamp.ToDateTime():s} | {weatherData.Summary} | {weatherData.TemperatureC} C");
    }
}
catch (RpcException ex) when (ex.StatusCode == StatusCode.Cancelled)
{
    Console.WriteLine("Stream cancelled.");
}

https 로 연결하면 SSL 인증서를 요구한다.
GetWeatherStream 을 호출하면 서버에서 데이터를 실시간으로 전달해준다.
CancellationTokenSource 로 5초 지나면 호출을 Cancel 한다.

아래는 서버와 클라이언트간에 테스트 결과




소스 : https://github.com/kei-soft/GrpcSample

 

반응형
728x90
반응형

Server 구성

1. ASP.NET Core gRPC 서비스 프로젝트 생성


2. proto 파일 정의

syntax = "proto3";

option csharp_namespace = "GrpcServer";

package greet;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply);
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings.
message HelloReply {
  string message = 1;
}


3. GreeterService.cs 에 동작 정의

using Grpc.Core;

using GrpcServer;

namespace GrpcServer.Services
{
    public class GreeterService : Greeter.GreeterBase
    {
        private readonly ILogger<GreeterService> _logger;
        public GreeterService(ILogger<GreeterService> logger)
        {
            _logger = logger;
        }

        public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
        {
            return Task.FromResult(new HelloReply
            {
                Message = "Hello " + request.Name
            });
        }
    }
}


4. Program.cs 에서 GreeterService Mapping

using GrpcServer.Services;

var builder = WebApplication.CreateBuilder(args);

// Additional configuration is required to successfully run gRPC on macOS.
// For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682

// Add services to the container.
builder.Services.AddGrpc();

var app = builder.Build();

// Configure the HTTP request pipeline.
app.MapGrpcService<GreeterService>();
app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");

app.Run();


5. Properties 의 launchSettings.json 파일에 서비스 주소 정의 및 기타 옵션 설정

{
  "profiles": {
    "GrpcServer": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": false,
      "applicationUrl": "http://localhost:5253;https://localhost:7253",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}


6. appsettings.json 파일에서 Protocols 정의 및 Log Level 지정

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Kestrel": {
    "EndpointDefaults": {
      "Protocols": "Http2"
    }
  }
}


7. appsettings.Development.json 파일에서 Develope 모드 일때 Info 도 로그가 찍히도록 Log Level 정의

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning",
      "Microsoft.AspNetCore.Hosting": "Information",
      "Microsoft.AspNetCore.Routing.EndpointMiddleware": "Information"
    }
  }
}


8. Server 실행

web page 확인

 

Client 구성

1. 콘솔앱 프로젝트 생성

2. Server 에서 만들어진 proto 파일을 동일하게 Protos 폴더를 만들어 복사한다.

3. Nuget 설치
Google.Protobuf
Grpc.Net.Client
Grpc.Tools

4. 프로젝트파일 편집
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" /> 부분을 Client 로 아래 처럼 바꾼다.
<Protobuf Include="Protos\greet.proto" GrpcServices="Client" /> 

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <None Remove="Protos\greet.proto" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Google.Protobuf" Version="3.20.1" />
    <PackageReference Include="Grpc.Net.Client" Version="2.45.0" />
    <PackageReference Include="Grpc.Tools" Version="2.45.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
  </ItemGroup>

  <ItemGroup>
    <Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
  </ItemGroup>

</Project>


5.  빌드/다시빌드
빌드 하게되면 proto 파일을 이용해 c# 코드가 생성된다. (솔루션 탐색기에서 표시되지 않음)


6. 서버 연결 및 통신

using System.Threading.Tasks;

using Grpc.Net.Client;

using GrpcClient;

using var channel = GrpcChannel.ForAddress("http://localhost:5253");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();

https 로 연결하면 SSL 인증서를 요구한다.
SayHelloAsync 로 서버쪽에 요청을 하게되면 서버측에서는 받은 메세지앞에 Hello 를 붙여 반환한다.

아래는 서버와 클라이언트간에 테스트 결과


소스 : https://github.com/kei-soft/GrpcSample

참고 링크 : https://docs.microsoft.com/ko-kr/aspnet/core/tutorials/grpc/grpc-start?view=aspnetcore-6.0&tabs=visual-studio

반응형

+ Recent posts