ジェネリックとデリゲート

ジェネリクス型

  • クラスのメンバを宣言するときに,

public class SomeClass{

	private strig member1;
	private int member2;

	someClass(){
		this.member1="hoge";
		this.member2=7;
	}
}

としてしまうと,member1member2には,それぞれStringintしか使用できなくなる。

  • ジェネリクスを使用すると,メンバ変数の型をインスタンス時に指定することができる。

public class SomeClass<T1, T2>{

	private T member1;
	private T2 member2;

}

public static void main(String args[]){
	SomeClass<String, int> obj = new SomeClass<String, int>();
}

デリゲートについて

  • 匿名関数
    • メソッドの型

// 単なる型
public delegate void TestMethod(String s);

  • 使用方法は,作成した型で変数を作成し使用する。

public delegate void TestMethod(String s);

TestMethod test = delegate(String msg){
	MessageBox.Show(msg)
};

test("test");
test("hoge");
test("fuga");

  • .NETのフォームのイベントハンドラ等で使用されている。
  • 引数を使用しない匿名関数は,Actionという名前で宣言されている。

Action act = delegate(){
	MessageBox.Show("Action");
}

act()

ラムダ式

  • いちいちdelegateを書くのが面倒くさいので,ラムダ式を使用する。

TestMethod test = delegate(String msg){
	MessageBox.Show(msg)
};

TestMethod test = (nsg) => {
	MessageBox.Show(msg)
};

TODO: C#の部分をJavaに置き換え

以上

~/.ssh/configについて

時間がないので10分で

Host: 任意のホスト名

HostName: ホスト名

Name: ユーザ名

Port: ポート番号

IdentityFile: 任意の鍵

ssh 任意のホスト名

で指定した接続が可能

以上

[Python]親クラスで子クラスのメンバを使用する。

コード

 coding=utf-8

from abc import ABCMeta, abstractmethod

class Parent(object):
    
    @abstractmethod
    def hoge(self):
        print(self.name)

    @abstractmethod
    def fuga(self):
        print(self.age)

    @abstractmethod
    def fuga2(self, age):
        print(age)

class Child(Parent):

    def __init__(self):
        self.name='nekonisi'
        self.__age='26'

    def hoge(self):
        super().hoge()

    def fuga(self):
        super().fuga() #error

    def fuga2(self):
        super().fuga2(self.__age)

if __name__ == '__main__':
    child = Child()
    child.hoge()
    # child.fuga() #error
    child.fuga2()

実行結果

nekonisi

26

解説

  • 親クラスParentで,hoge, fugaメソッドを宣言して子クラスChildで使用する。
  • その際に,子クラスのメンバを使用したいが,プライベートメンバだと,親クラスで参照できないためエラーになってしまう。
  • 回避策として,fuga2では子クラスのプライベートメンバを引数として渡してあげて実行している。

問題

  • 複数のプライベートメンバを使用するときに,引数が増えてしまう。
  • 自インスタンスを引数として渡してあげる方法もダメだった。

解決策

  • 会社の先輩に聞いたら,「できるわけねーだろ」とのこと
  • そもそも設計思想がおかしい。
    • 子クラスのメンバを使用したメソッドが親クラスにあること自体がおかしい。
  • 下記のように修正
# coding=utf-8

from abc import ABCMeta, abstractmethod

class Parent(object):

    def __init__(self, name: str, age: int):
        self.__name = name
        self.__age = age
    
    @abstractmethod
    def hoge(self):
        print(self.__name)

    @abstractmethod
    def fuga(self):
        print(self.__age)

class Child(Parent):

    def __init__(self):
        super().__init__('nekonisi', 26)

    def hoge(self):
        super().hoge()

    def fuga(self):
        super().fuga()

if __name__ == '__main__':
    child = Child()
    child.hoge()
    child.fuga()

 

そうすると,コンストラクタのオーバロードとかもしたくなっちゃう。

追記

オーバーロードは下記のように実現する。

# coding=UTF-8

class hoge(object):
    def __init__(self, name=None, age=None):
        if name is None:
            name = 'noname'

        if age is None:
            age = 0

        self.__name=name
        self.__age=age

    def introduce(self):
        print('My name is ' + self.__name)
        print('I\'m ' + str(self.__age) + ' years old.')

if __name__ == '__main__':
    obj1 = hoge()
    obj2 = hoge('nekonisi', 26)
    obj3 = hoge('konisi')

    obj1.introduce()
    obj2.introduce()
    obj3.introduce()

実行結果

My name is noname
I'm 0 years old.
My name is nekonisi
I'm 26 years old.
My name is konisi
I'm 0 years old.

 

以上

[PyCharm]venv環境の設定手順

What’s venv?

venv は virtualenv が Python 3.3 から標準機能として取り込まれたものである.別途ソフトウェアをインストールすることなく使用できる.pip によるパッケージの導入状態をプロジェクトごとに独立させることができる.

https://qiita.com/fiftystorm36/items/b2fd47cf32c7694adc2e

PyCharmによるインタプリタの設定

Ctrl + Alt + s > プロジェクト > プロジェクト・インタープリター > 各項目を設定する。

タブレットで実行するとうまくいかなかったので新規の仮想環境を構築した。

補足

環境変数PYTHONPATHPATHにpythonのパスを指定していると,挙動がおかしくなった。

現環境では,PATHのみに指定することにした。

以上

 

IdeaVimのインストール

設定画面を起動

Ctrl + Alt + S

ideaVimのインストール

プラグイン > JetBrainsプラグインのインストール > IdeaVimを選択 > インストール

以上

githubでssh接続できなかった時の話

Githubにssh接続できない!

昨日まで,githubにssh接続できてたのに…。

対応

  • MSYS2をインストールしてから,接続できなくなったので,MSYS2をアンインストール => ダメ
  • 鍵を再作成,登録 => ダメ
  • git bashをアンインストール => ダメ

解決策

  1. gitbash と MSYS2をアンインストール
  2. gitbashを再インストール
  3.  鍵の再作成
    1. gitbashにてssh-keygen
    2. ~/.ssh/id_rsa.pubをGithubに登録
    3. ssh git@github.comで接続ができることを確認
  4. ~/.ssh/known_hostを削除
  5. vim ~/.ssh/configで下記を記述
Hostname github.com
User git
IdentityFile ~/.ssh/id_rsa

で接続成功。

原因(推測)

  • MSYS2をインストールすることで,接続時に使用する秘密鍵のパスが変わっていた?
    • MSYS2のデフォルトの秘密鍵のパスがの権限が変わっていた。
  • gitコマンド使用時に使用する鍵のパスの設定がされていなかった?

以上

pycharmのインストールから日本語化(for Windows)

What’s PyCharm?

PyCharmPython統合開発環境 (IDE) の一つである。

wikipedia~PyCham~

PyCharmのインストール

公式サイトより,最新版のexeをダウンロード

  1. ダウンロードしたexeファイルを実行
  2. Next連打(雑)

Pleiadesによる日本語化

What’s Pleiades?

Pleiades は Eclipse や Android Studio のような Java アプリケーションを日本語化するためのツールです。~ 公式サイトから抜粋 ~

(Eclipseだけじゃないんだ…。)

  1. 公式サイトから,Pleadesプラグインをダウンロード
  2. zip解凍
  3. 解凍したフォルダから, setup.exe(ショートカット)を実行
  4. 日本語化するアプリケーションにpycharm.exeを指定
    例(C:\Program Files\JetBrains\PyCharm Community Edition 2018.2.3\bin\pycharm.exe)
  5. 日本語化をクリック

以上

C#で鍵を作成=> 暗号化 => 複合

C#で鍵を作成=> 暗号化 => 複合

using System;
using System.Text;
using System.Security.Cryptography;

namespace keygenTest
{
class Program
{
static void Main(string[] args)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
String keyword = Console.ReadLine();
byte[] keywordByte = System.Text.Encoding.UTF8.GetBytes(keyword);
byte[] encryptText = rsa.Encrypt(keywordByte, false);
byte[] decryptText = rsa.Decrypt(encryptText, false);
Console.WriteLine("keyword: " + keyword);
Console.WriteLine("keyword(byte)" + Encoding.UTF8.GetString(keywordByte));
Console.WriteLine("encryptText: " + BitConverter.ToString(encryptText));
Console.WriteLine("decryptText: " + Encoding.UTF8.GetString(decryptText));
Console.ReadKey();
}
}
}

 

出力

hogeeee!!!
keyword: hogeeee!!!
keyword(byte)68-6F-67-65-65-65-65-21-21-21
encryptText: 59-30-83-EC-A0-EE-CA-B3-FE-B5-47-3C-50-4D-17-81-43-09-67-4C-E0-05-0C-07-5A-CC-7F-13-08-A9-E4-89-B0-DB-5F-8B-3D-41-F0-08-DD-6B-4F-9D-00-98-1D-88-48-19-B2-88-45-36-05-B3-75-0E-E9-30-86-D0-37-8D-38-B2-88-8C-20-3F-47-AA-F0-6C-13-9B-34-3E-7E-E6-7C-65-DD-F4-8A-7C-AE-BB-DE-3E-1D-D2-67-DE-F1-E0-37-0C-CD-D1-BF-66-6E-0D-41-E0-FE-77-94-65-67-7C-2D-D0-E8-7A-3C-81-BE-3D-67-50-0B-EE-30-9E-0A-76
decryptText: hogeeee!!!

以上

 

OSの再インストール

ディスプレイの調子がおかしかったので,
$sudo apt-get upgradeしたら,目も当てられないことになった。

勉強時間を削って頑張ったけど,治りそうもないので再インストールする。

一応,やったこと

  1. リカバリモードで起動(起動時にshiftキー連打)
    1. resume 通常の起動
      
      clean パッケージアーカイブの削除
      
      dpkg パッケージの修復
      
      failsafeX 標準グラフィックドライバー起動
      
      fsck ファイルシステムのチェック
      
      grub GRUB ブートローダーのアップデート
      
      netroot ネットワークに接続できる状態で Root になって Shell を起動
      
      root Root になって Shell を起動
      
      sysytem-summary システム情報の表示
  2. rootで,$apt upgrade やら $apt update やら実行 → ダメ

ということで,OSの再インストールをすることにした。

PCのスペックが

CPU: Intel Core2

メモリ: 3GB

なので,ubuntuの最新版は諦めて(64bit版しか提供されなくなったみたい。)

zorinOSなるものをインストールする。

手順はRufusでbootableUSBを作成し,BIOSでbootの設定をいじって起動する。

なぜかうまくいかないけど,なんとか家を出る時間までに終わればいいな。

以上