vimの矢印キーを無効にする。

小指が矢印キーに当たってカーソルが移動してしまってうざいので矢印キーを無効にする。

~/.vimrcに下記を追加

function! HardMode ()
  noremap <Up> <Nop>
  noremap <Down> <Nop>
  noremap <Left> <Nop>
  noremap <Right> <Nop>
endfunction

function! EasyMode ()
  noremap <Up> <Up>
  noremap <Down> <Down>
  noremap <Left> <Left>
  noremap <Right> <Right>
endfunction
command! HardMode call HardMode()
command! EasyMode call EasyMode()

:hardmode 矢印無効化

EasyMode 矢印有効化

以上

参考サイト

https://qiita.com/sawanoboly/items/3b599f6141cc637e1e74

【C#】デリゲートについて

概要

  • デリゲートに関してまとめる。
    • 何回目だろうか。
    • きっとそれだけ分かりにくい内容なのかもしれない。
      • 実際に手を動かさなければ覚えられない。

delegate

概要

  • delegateとは、メソッドを参照するための型(変数)である!
    • 端的に言えば、変数valueにメソッドsomeMethodを格納する。

文法(C#)

  • 変数宣言
delegate 戻り値の型 デリゲート型名(引数リスト);
  • インスタンス化
デリゲート型名 変数名 = new デリゲート型名(メソッド名);

サンプル

最も基本的なデリゲート

using System;

class Sample1{
    // delegate変数の宣言
    private delegate MyDelegate(string arg1);

    /*
     * メインメソッド
     */
    public static void Main(){
        // 処理を変数に格納
        MyDelegate _myDelegate = new MyDelegate(SomeMethod);

        // 格納した処理を使用
        _myDelegate("デリゲートテスト");
    }

    /*
     * 引数1の値を出力する
     */
    public void SomeMethod(string msg){ Console.WriteLine(msg); }
}
  • 出力結果
デリゲートテスト

暗黙の型変換

  • 下記で暗黙の型変換が可能
デリゲート型名 変数名 = メソッド名;
using System;

class Sample2{
    // delegate変数の宣言
    private delegate void MyDelegate(string arg1);

    /*
     * メインメソッド
     */
    public static void Main(){
        // 処理を変数に格納
        MyDelegate _myDelegate =SomeMethod;

        // 格納した処理を使用
        _myDelegate("暗黙の型変換によるデリゲートテスト");
    }

    /*
     * 引数1の値を出力する
     */
    public static void SomeMethod(string msg){ Console.WriteLine(msg); }
}
  • 実行結果
暗黙の型変換によるデリゲートテスト

インスタンスメソッドの代入

  • デリゲートにはクラスメソッドとインスタンスメソッド
    • クラスメソッド(staticメソッド)
    • インスタンスメソッド(object.メソッド名()で呼ばれるメソッド)
using System;

/*
 * メインクラス
 */
class Sample3{
    private delegate void MyDelegate();

    public static void Main(){
        Person _person = new Person("John");
        MyDelegate _myDelegate = new MyDelegate(_person.ShowName);
        _myDelegate();
    }
}

/*
 * Personクラス
 */
public class Person{
    private string name;

    // コンストラクタ
    public Person(string name) {
        this.name = name;
    }

    // サンプルメソッド
    public void ShowName(){
        Console.WriteLine("My Name is {0}",this.name);
    }
}
  • 出力結果
My Name is John

マルチキャストデリゲート(複数メソッドの代入)

using System;

/*
 * メインクラス
 */
class Sample3{
    private delegate void MyDelegate();

    public static void Main(){
        Person _person = new Person("John");
        Person _person2 = new Person("Bob");

        MyDelegate _myDelegate = new MyDelegate(_person.ShowName);
        _myDelegate += new MyDelegate(_person2.ShowName);
        _myDelegate += new MyDelegate(Echo);
        _myDelegate();
    }

    public static void Echo(){
        Console.WriteLine("Echo Method!");
    }
}

/*
 * Personクラス
 */
public class Person{
    private string name;

    // コンストラクタ
    public Person(string name) {
        this.name = name;
    }

    // サンプルメソッド
    public void ShowName(){
        Console.WriteLine("My Name is {0}",this.name);
    }
}
  • 実行結果
My Name is John
My Name is Bob
Echo Method!

非同期処理

  • ThreadPoolを使用することで、非同期呼び出しを使用したマルチスレッド処理を行うことが可能。
文法
// 非同期処理の開始
IAsyncResult BeginInvoke(引数リスト…, AsyncCallback callback, object state);
int EndInvoke(引数リスト…, IAsyncResult ar);
using System;
using System.Threading;

class Sample5{
    private delegate void MyDelegate();
    static void Main(){
        MyDelegate _myDelegate = SomeMethod;
        // 非同期処理の開始
        IAsyncResult ar = _myDelegate.BeginInvoke(null,null);

        for (int i=0; i<5; i++){
            Thread.Sleep(100);
            Console.WriteLine("Main ({0})",i);
        }

        // 非同期処理の終了を待つ。
        _myDelegate.EndInvoke(ar);

        Console.WriteLine("End");
    }

    private static void SomeMethod(){
        for (int i=0;i<5;i++){
            Thread.Sleep(100);
            Console.WriteLine("SomeMethod1 ({0})",i);
        }
    }
}
  • 実行結果
SomeMethod1 (0)
Main (0)
SomeMethod1 (1)
Main (1)
Main (2)
SomeMethod1 (2)
SomeMethod1 (3)
Main (3)
SomeMethod1 (4)
Main (4)
End

参考サイト

【C#】マルチスレッド処理に関して

03_マルチスレッド処理に関して

概要

  • マルチスレッド処理に関するまとめを行う。

マルチスレッド処理

  • マルチプロセスとは別物なので注意!
    • プロセス -> exeファイル
      • スレッド -> プロセス内の処理

並列稼働と並行稼働

  • 並列稼働と並行稼働は違うらしい。
    • 並列稼働: 複数のCPUで同時に処理を行う。
    • 並行稼働: 一つのCPUが複数の処理を切り替えながら動作し、疑似的に複数のCPUがあるように処理を行う。
マルチスレッドの動作原理
マルチスレッドの動作原理

マルチスレッド処理の目的

1. レスポンスタイムの向上

  • 重い処理が行われている間に、他の処理を行わせることで、レスポンスタイムが向上する。
  • 複数のクライアントに対して同時に処理を行うことができる。

2. スループット(単位時間当たりの処理性能)の向上

  • ディスク上にあるすべてのファイルをリストアップするような処理を行うとき、
    ディスクにアクセスしている時間は非常に長くなるが、その間CPUでの処理はほとんどできない。

    • このようなCPUの空き時間がパフォーマンス向上の余地になる。

マルチスレッド処理の実現方法

 
方法 メリット デメリット
スレッド(Thread) ・ 各スレッドに優先順位を設定できる

・ スレッドの一時停止/再開/中断を行うことができる

・ スレッドの作成と破棄を繰り返すとパフォーマンスが落ちる

・ メソッドにパラメータを設定できない

・ メソッドの戻り値を得るのが困難

スレッドプール(ThreadPool) ・ 効率よく複数のスレッドを実行できる

・ object型のパラメータを1つだけ設定できる

・ パラメータがobject型1つのみ

・ メソッドの戻り値を得るのが困難

・ 優先順位付けや待機、停止など、スレッドの細かな制御が難しい

・同時に実行できるスレッドの数が制限されている

デリゲート(BeginInvoke) ・ メソッドに型のあるパラメータを指定できる

・ 簡単に戻り値を得ることができる

・ 優先順位付けや待機、停止など、スレッドの細かな制御が難しい

・ 同時に実行できるスレッドの数が制限されている

タイマー(Timer) ・一定時間間隔でメソッドを実行することができる ・スレッドプールがいっぱいだとうまく動作しない

スレッド

  • Threadクラスで指定したメソッドを別スレッドで起動(実行)する仕組みを提供する。
  • スレッドの生成にはそれなりのリソースが消費されえるため大量にスレッドが処理される場合、パフォーマンスが低下する。

サンプルコード

using System;
using System.Threading;

public class List1_1
{
    public static void Main()
    {
        Thread threadA = new Thread(
                new ThreadStart(ThreadMethod));// (1)

        threadA.Start();// (2)

        for(int i = 0; i < 100; i++)
        {
            Thread.Sleep(5);
            Console.Write("B");
        }
    }

    //別スレッドで動作させるメソッド
    private static void ThreadMethod()
    {
        for(int i = 0; i < 100; i++)
        {
            Thread.Sleep(5);
            Console.Write("A");
        }
    }
}
  • 実行結果
ABBABAABBABAABBAABBABAABABBABAABABBAABABABABABABBABABABABABABABAABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
解説
  • (1): Threadクラスのインスタンスを生成する。
    • ThreadStartクラスのコンストラクタに別スレッドで動作させたいメソッド名を指定する。
        Thread threadA = new Thread(
                new ThreadStart(ThreadMethod));// (1)
  • (2): 別スレッドによる処理を実行する。
    • ThreadオブジェクトのStartメソッドを呼び出す。

スレッドプール

  • ThreadPoolクラスで提供される。
  • キューに入れられたリクエスト(処理)をスレッドプールが用意しているスレッドにより次々に実行していく仕組み。
  • 一度確保したスレッドのリソースをできる限り再利用するように設計されている。
    • スレッドで問題になっていたパフォーマンス低下が解消される。

サンプルコード

using System;
using System.Threading;

public class List2 {
    public static void Main() {
        // ThreadMethodをスレッドプールで実行できるように
        // WaitCallbackデリゲートを作成
        WaitCallback waitCallback = new WaitCallback(ThreadMethod);// (1)

        // スレッドプールに登録
        ThreadPool.QueueUserWorkItem(waitCallback,"A");// (2)
        ThreadPool.QueueUserWorkItem(waitCallback,"B");// (3)

        Console.ReadLine();
    }

    private static void ThreadMethod(object state) {
        for(int i = 0; i < 100; i++){
            Thread.Sleep(5);
            Console.Write("{0}",state);

        }
    }
}
  • 実行結果
ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB
解説
  • (1): スレッドプールで使用できるようにデリゲートを作成。
    • 処理を行いたいメソッドを引数としてWaitCallbackオブジェクトを作成する。
WaitCallback waitCallback = new WaitaCallback(ThreadMethod);
  • (2): スレッドを開始する。
    • ThreadPool.QueueUserWorkItemメソッドを使用する。
      • 引数は、第一引数にデリゲート、第二引数にobject型のパラメータを指定すること。

デリゲート

  • デリゲートに関するまとめはこちら
  • デリゲート=メソッドの呼び出しをラッピングしたもの
  • デリゲートを通じて間接的に呼び出すことができる。
  • デリゲートに登録されたメソッドを実行するには、普通に実行するInvokeメソッドのほかに、
    別スレッドでメソッドを実行するBeginInvokeメソッドが使用できる。

    • デリゲートは上述したスレッドプールを利用して、登録されたメソッドを実行するという仕組みになっている。

サンプル

using System;
using System.Threading;

public class List3
{
    // 戻り値とパラメータのあるデリゲート
    delegate DateTime ThreadMethodDelegate(string c);// (1)
    static ThreadMethodDelegate threadMethodDelegate;// (2)

    public static void Main(){
        threadMethodDelegate = new ThreadMethodDelegate(ThreadMethod); // (3)

        // デリゲートによるスレッド処理呼び出し
        threadMethodDelegate.BeginInvoke(".",new AsyncCallback(MyCallback), DateTime.Now); // (4)

        Console.ReadLine();
    }

    private static DateTime ThreadMethod(string c){
        // 10ミリ秒ごとに100回cを出力
        for (int i=0; i<100;i++){
            Thread.Sleep(10);
            Console.Write(c);
        }
        return DateTime.Now;
    }

    // スレッド処理終了後に呼び出されるコールバック・メソッド
    private static void MyCallback(IAsyncResult ar)// (5)
    {
        DateTime result = threadMethodDelegate.EndInvoke(ar);// (6)
        DateTime beginTime = (DateTime)ar.AsyncState; // (7)

        Console.WriteLine();
        Console.WriteLine("{0}に処理を開始し、{1}に処理を完了しました。", beginTime,result);
    }
}
解説
  • ThreadMethodという名前のメソッドを、デリゲートを使用して別スレッドに実行し
    ThreadMethodメソッドの処理が終了した時点でMyCallbackメソッドが自動的にコールバックされるように設定している。
  • (1)
    • 別スレッドとして処理したメソッドをデリゲート宣言する。
      • delegate DateTime ThreadMethodDelegate(string c);// (1)
      • このときのパラメータの型と個数、戻り値の型は、別スレッドとして処理したメソッドに合わせておく。
        • ThreadMethod自体は、何も特別な部分のない通常のメソッドである。
  • (2),(3)
    • ここで宣言したデリゲートを実際に利用するために、
      デリゲートのインスタンスを作成しフィールド変数threadMethodDelegateとして保持する。

      • static ThreadMethodDelegate threadMethodDelegate;// (2)
      • threadMethodDelegate = new ThreadMethodDelegate(ThreadMethod); // (3)
  • (5)
    • コールバック・メソッドを作成する。
      • コールバック・メソッド: 別スレッドによる処理が終了したことをトリガーとして、自動的に呼び出されるメソッドのことである。
    private static void MyCallback(IAsyncResult ar)// (5)
    {
    }
  • (4)
    • デリゲートのBeginInvokeメソッドを呼び出すことによって、別スレッドの処理を開始する。
      • BeginInvokeメソッドの引数は下記の通り
        • デリゲートを通じて呼び出すメソッドへのパラメータ(複数ある場合は複数指定する。)
        • AsyncCallbackデリゲートでラッピングしたコールバック・メソッド
          • ステート
        • AsyncCallbackデリゲートは、コールバックしたいメソッドをコンストラクタのパラメータに指定して、そのインスタンスを作成する。
        • 最後の引数であるステートjは、object型のオブジェクトを自由に指定できる。
        • 指定したオブジェクトはコールバック・メソッドのパラメータやBeginInvokeメソッドの戻り値であるIAsyncResultオブジェクト内に保持されている。
      • 詳細は「Control.BeginInvoke Method (System.Windows.Forms)」
        // デリゲートによるスレッド処理呼び出し
        threadMethodDelegate.BeginInvoke(".",new AsyncCallback(MyCallback), DateTime.Now); // (4)

タイマー

  • Timerクラスを利用して実現する。

サンプル

using System;
using System.Threading;

public class List4 {
    private static int count = 0;
    public static void Main(){
        // 一定間隔ごとに呼び出すメソッドをTimerCallbackとして登録
        TimerCallback timerCallback = new TimerCallback(ThreadMethod);// (1)

        Console.WriteLine("くるくるまわるよ!");
        // 1秒待ってから、0.1秒ごとにtimerCallbackメソッドを呼び出す
        Timer timer = new Timer(timerCallback, null, 1*1000, 1*100);// (2)

        Console.ReadLine();
    }

    private static void ThreadMethod(object state){ // (3)
        count++;
        string output = "";
        switch(count%7){
            case 0:
                output = "  ( ・ω)";
                count = 0;
                    break;
            case 1:
                output = "  ( ・ )";
                    break;
            case 2:
                output = "  (    )";
                    break;
            case 3:
                output = "  (・  )";
                    break;
            case 4:
                output = "  (・  )";
                    break;
            case 5:
                output = "  (ω・ )";
                    break;
            case 6:
                output = "  (・ω・)";
                break;
        }
        // 行を削除
        Console.Write("\r");
        Console.Write(output);
    }
}
  • 実行結果
List4
List4

参考サイト

連載.NETマルチスレッド・プログラミング入門

[MySQL]データベースの保管場所

本に倣って学習を進めていくうえで,サンプルデータベースが入っていなかった。

公式サイトからデータベースのインポートを行ったのでメモ

ファイルの実体

ファイルの実体は,C:/xampp/mysql/dataにあった。
my.iniの[mysql].datadir項目を参照すればわかる。

# The MySQL server
[mysqld]
port= 3306
socket = "C:/xampp/mysql/mysql.sock"
basedir = "C:/xampp/mysql" 
tmpdir = "C:/xampp/tmp" 
datadir = "C:/xampp/mysql/data"
pid_file = "mysql.pid"

公式サイトからサンプルデータをダウンロード

https://dev.mysql.com/doc/index-other.htmlからダウンロードを行う。

解凍と実行

$unzip world.sql.zip
Archive: world.sql.zip
inflating: world.sql

解凍後のsqlファイルを実行。

# mysql -u nekonisi -p< world.sql
Enter password: *********

実行後確認

MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| book_diary_db |
| information_schema |
| mysql |
| performance_schema |
| phpmyadmin |
| test |
| world |
+--------------------+
7 rows in set (0.00 sec)

文字コードとか大丈夫かな?

以上

【MySql】文字化け解消した

深夜のファミレスで,ヤリチンが女達にガチ説教食らっている横で文字化け解消した。

SHOW VARIABLES LIKE '%CHAR%';

これで環境内の文字コードを確認できる。
下記みたいな感じ。

| Variable_name | Value |
+--------------------------+--------------------------------+
| character_set_client | cp932 |
| character_set_connection | cp932 |
| character_set_database | cp932 |
| character_set_filesystem | binary |
| character_set_results | cp932 |
| character_set_server | cp932 |
| character_set_system | utf8 |
| character_sets_dir | C:\xampp\mysql\share\charsets\ |
+--------------------------+--------------------------------+
8 rows in set (0.00 sec)

で,ここからが本題。
これらの設定は,テーブル作成時に活きてしまうので
設定を行った後に,テーブルの再作成,データベースの再作成を行う必要がある。

または,ALTERコマンドで設定を変更する必要がある。

ALTER DATABASE データベース名 DEFAULT CHARACTER SET 文字コード

こんな感じ。

 

ちなみに各種設定項目の意味は,下記の通り

項目名 意味
character_set_client クライアントから送信する際の文字コード
character_set_connection クライアントから送信した文字コードの変換先
character_set_database データベースの文字コード
character_set_filesystem ファイルシステムの文字コード
character_set_results クライアントへの結果送信に使用する文字コード
character_set_server サーバの文字コード
character_set_system システムで使用する文字コード
character_sets_dir 文字コード設定が保存されているフォルダの場所

参考にしたサイト

よくよく聞いたら,女が学校辞めて働かずに彼氏の家に入り浸ってて,
家事もしないうんこで
男はサッカー日本代表まで行ったけど,ケガで挫折して高校中退してしまったが,めげずにきちんと働いて,その上,女を養ってるクソイケメンだった。

女友達だと思ってたらご親族の方々で,女に対する説教だった。

イケメン,もっとまともな女性とお付き合いしたほうがいいと思うよ。
その女,口悪いし,自分に甘いし,その上,やべえ位アホだぞ。

[XAMPP]日本語の文字化け対策

XAMPPのMySQLで勉強をしているのだけれども,
日本語文字列が???と表示されているので解消法を記述。

xamppの管理画面からMySQL > Configをクリック

my.iniを下記のように修正。(デフォルトのエディタがVimだったので優越感)

18行目~22行目

[client]  
# password = your_password  
port = 3306  
socket = "C:/xampp/mysql/mysql.sock" 
default-character-set = utf8

151~156行目

## UTF 8 Settings 
init-connect=SET NAMES utf8 
collation_server=utf8_unicode_ci 
character_set_server=utf8 
skip-character-set-client-handshake 
character_sets-dir="C:/xampp/mysql/share/charsets"

158~161行目

[mysqldump] 
quick 
max_allowed_packet = 16M 
default-character-set = utf8

163~167行目

[mysql] 
no-auto-rehash 
# Remove the next comment character if you are not familiar with SQL 
#safe-updates 
default-character-set = utf8
  • すでに作成してある行には反映されないので作り直す。
    早めに気づいてよかった。

修正前

MariaDB [dekirusample]> select * from members; 
+-------+------+------+ 
| memno | name | pref | 
+-------+------+------+ 
| 1 | ???? | ??? | 
| 2 | ???? | ??? | 
| 3 | ???? | ??? | 
| 4 | ???? | NULL | 
+-------+------+------+ 
4 rows in set (0.01 sec)

修正後

直らなかった…。

再チャレンジ

どうやらxamppのshellの文字コードはcmdに引っ張られるらしい,
C:\xampp\xampp_shell.batにchcp 65001を記述し再起動。

MariaDB [dekirusample]> select * from members; 
+-------+------+------+ 
| memno | name | pref | 
+-------+------+------+ 
| 1 | ```` | ``` | 
| 2 | ```` | ``` | 
| 3 | ```` | ``` | 
| 4 | ```` | NULL | 
+-------+------+------+ 
4 rows in set (0.00 sec)

違う感じに文字化けた。

どうしても直らないので後日調査,
本質じゃないところでつまづいているなぁちくしょー

以上

MySQLの勉強

MySQL用のGithubPageを作成した。

GithubPage

kindle unlimitedの本の内容をまとめていく。
少しずつ前に。

以上

PHPに関するメモの記録

ファイルの読み込み

  • readfile関数でファイル読み込みが可能

文字を区切る(explode関数)

説明 ¶

array explode ( string $delimiter , string $string [, int $limit = PHP_INT_MAX ] )

文字列の配列を返します。この配列の各要素は、 string を文字列 delimiter で区切った部分文字列となります。

配列要素を区切って文字列に格納する(implode関数)

string implode ( string $glue , array $pieces )
string implode ( array $pieces )

配列の要素を glue 文字列で連結します。

$glueのデフォルトは空文字。

スカラー型

大小関係のある値

ジェネリクス
デリゲート
無名関数
ラムダ式

調べたけど忘れちゃった。
ジェネリクスは確か,型を汎用的にとらえる書き方。

POSTとGET

POSTは登録時に使用する。URLに情報が記載される。
GETは情報を取得するときに使用する。body部分に情報が記載される。

どちらもClient側から参照可能なので重要な情報は記載しないこと。
重要な情報はSESSIONに委ねる。

ファイルポインタ

ポインタは,変数のアドレスを記憶する変数。
ファイルポインタは,どこまで読み込んだかの情報を保持している。

以上