mmt

ナオラー徒然日記

ラズパイでセキュアを意識したSSH接続の設定をした

 久々の投稿。今回はみんな大好きラズベリーパイでセキュアを意識したssh接続の設定をやってみた。
 ラズパイとは関係ないが昨日WPA2の脆弱性が発表された。Wi-Fiで最も安全性が高いと言われていた認証方式なだけにネット上でも衝撃が走っていた。
 通称KRACKs(key reinstallation attacks : 鍵再インストール攻撃)と呼ばれAESなどの暗号解読によってパスワードが読み取られるという訳ではなく暗号化された通信の内容を覗かれたり、攻撃コードを埋め込んだり、不正サイトに誘導されるらしい。怖い話です。

ラズパイ側の設定

さて本題に
まずIPアドレスを固定
ルーターDHCPサーバ機能によってIPアドレスを動的に振り分けるため、ラズパイ側のIPアドレスは何度も変わってしまうため、IPアドレスを固定。
$ sudo vi /etc/network/interfaces

# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
 source-directory /etc/network/interfaces.d
 
   # The loopback network interface
   auto lo
   iface lo inet loopback
  
  auto wlan0
  iface wlan0 inet static   // "dhcp""static"に変更
  address 192.168.100.40   // 設定したいラズパイの固定IPアドレス
  netmask 255.255.255.0   // サブネットマスク
  gateway 192.168.100.1    // ルータのIPアドレス
  dns-nameservers 192.168.100.1  // ルータのアドレス

と書いたら
$ sudo /etc/ini.d/networking start
でネットワークサービスを起動
ちなみに編集して再起動したいときは
$ sudo /etc/init.d/networking restart
止めたいときは
$ sudo /etc/init.d/networking stop
OpenSSHをラズパイ側で利用するためのパッケージをインストール
$ sudo apt-get install openssh-server

続いて
$ sudo vi /etc/ssh/sshd_config

//もともと書いてある
Port 22
//を22番以外の数字に変更
//49513~65535の間が基本的に無難
Port 615625

rootログインを非許可にする
PermitRootLogin no //yesをnoに
// ラズパイのUbuntu MATEで
// 最初から記述してある
// PermitRootLogin widhout-password
// だとなぜかエラーが出た

// パスワード認証によるログインを非許可
PasswordAuthentication  no //yesをnoに

$ sudo /etc/init.d/ssh start
サービスを起動

クライアント(mac)側の設定

OpenSSHをクライアントで利用するためのパッケージをインストール
$ brew install openssh-client
鍵ファイルの作成
$ ssh-keygen -t rsa
$ cd .ssh
$ vi config

Host [ラズパイ側のエイリアス名前(何でも良い)]
    HostName 192.168.100.40 // ラズパイのIPアドレス
    User [クライアント側のユーザ名]
    Port 615625
    IdentityFile ~/.ssh/id_rsa
#以下の場合180秒ごとにサーバ(ラズパイ)にメッセージを送り、ServerAliveCountMax のデフォルト回数である 3回応答しなくなったらタイムアウトする
ServerAliveInterval 180

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/[鍵ファイルの作成でつけた名前].pub
$ chmod 600 ~/.ssh/[鍵ファイルの作成でつけた名前]

公開鍵をラズパイに転送
$ rsync -e "ssh -p 615625" -avz ~/.ssh/id_rsa.pub [ラズパイ側のユーザ名]@192.168.100.40:~/.ssh

ラズパイ側の設定

$ mv ~/.ssh/[鍵ファイルの作成でつけた名前].pub ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
$ sudo /etc/init.d/ssh start

2このようにすれば本来
$ ssh ユーザ名@ホスト名 -p ポート番号
と打ち込むのを
$ ssh ユーザ名
でパスワードを入力せずにパスワード認証方式より安全な公開鍵暗号方式ssh接続できるようになる

最後に

ufwファイアウォールの設定を行う
ufwをインストール
$ sudo apt install ufw

同一ネットワーク内からのみのfromで指定したアドレスからtoで指定したアドレスかつポートへの通信を受信する
$ sudo ufw allow from 192.168.100.0/24 to any port 615625

ufwの設定を読み込み
$ sudo ufw enable
$ sudo /etc/init.d/ufw start

これで完成

最近VimでEscキーが遠いと感じた話

 最近まで僕はVimを使ってる時、他のエディタを使う時の様なキーボードとマウスを使う煩わしさが拮抗することなく使えてる事に感動していた。しかしキーボードだけで使っている時「Escキーが遠い。。」と感じてきた。
 基本的に両手はホームポジションにあるため手のひらの手根?の場所はCommandキーや十字キーの下に配置している。普通に文字など入力している時は手を固定して入力できるのだがVimでモードを変更する際(Visualモード、もしくはInsertモードからNormalモードに切り替える時)Escキーを押さないといけないのだが、左手を固定したままだとEscキーまでやや届かない。最初は特に気にも留めなかったが使っているうちにだんだん面倒だと感じてきた。なので.vimrcにEscキーのキーマッピングを割り当てたコードを追加した。

""""""""""""""""追加""""""""""""""""""
inoremap <C-z> <Esc>
vnoremap <C-z> <Esc>

ついでに連打でハイライト解除の箇所にも追加した

" Esc連打でハイライト解除
nmap <Esc><Esc> :nohlsearch<CR><Esc>
""""""""""""""""追加""""""""""""""""""
"C-z連打でも解除するよう追加
nmap <C-z><C-z> :nohlsearch<CR><Esc>

 本来C-zはシェルのジョブコントロール機能で、一時的に、ターミナルを使うために処理を中断させるもの。僕はC-zを使わないので両手をホームポジションに固定したままC-zでEsc処理を行えるようになった。

 ただそれだけの話でした。

ソートアルゴリズムの速度比較

ソートアルゴリズムについて

 大小関係が定められたたくさんのデータを、小さい順(昇順)あるいは大きい順(降順)に並べ替える作業をソート(整列)と言い、それを行うアルゴリズムをソートアルゴリズムと言います。 この処理は、さまざまなプログラムの中で頻繁に使われ、それ故、古くからいろいろなアルゴリズムが考案されてきました。

参考文献:いろいろなソートアルゴリズム

動機

 ソートの勉強を調べていたらソートアルゴリズムがたくさんあることに少しだけ疑問があった。
 なぜなら数字などを順番に並び変えるのにソートアルゴリズムなんて一つで十分ではないのか?と思ったという素朴な疑問。
 一つ一つ調べると、どのソートが効率が良く、どのソートが効率が悪いなど色々あることが分かったのですが、どれが良くてどれが悪いかを知るだけじゃいまいち物足りない気のするので実装してみようと思いつきました。
 その中で代表的なものの中の5つのソートアルゴリズムの速度を比較したいと思います。(ちなみに昇順に並べるコード)

測定するアルゴリズム

  • まず1つ目はソートと聞いて自分がパッと思いついた"バブルソート"です。これは比較的短いコードで書け、簡単なアルゴリズムですがソートアルゴリズムの中でもかなり効率の悪いアルゴリズムで、計算量はO(n^2)。
  • 2つ目は先ほどのバブルソートの改良版の"シェーカーソート"というもので、計算量はO(n^2)。
  • 3つ目はシェーカーソートよりは速いがクイックソートよりは遅い"挿入ソート"で、計算量はO(n^2)。
  • 4つ目はソートの中でも高速とされる"クイックソート"で、計算量はO(nlogn)。
  • 5つ目はC++のライブラリである"標準ソートです"。

測定コード

#include<iostream>
#include<vector>
#include<algorithm>
#include<stdlib.h>
#include<time.h>
#include<iomanip>

//  バブルソート関数
void Buble_Sort(int x[], int n);
//  シェーカーソート関数
void Shaker_Sort(int x[], int n);
//  挿入ソート関数
void Insertion_Sort(int [], int );
//  クイックソート関数
void Quick_Sort(int list[], int left, int right);

using namespace std;

int main(void){

  int i;
  // 異なる乱数の入った配列を保持する一時的に作った配列
  int *Temporary_Array;
  // それぞれのソート用のポインタ配列
  int *Buble_Array,*Shaker_Array,*Insertion_Array,*Quick_Array;
  int Array_Size;

  // 標準ソートで使う動的配列クラス
  vector<int> v;

  cout << "データサイズを入力してください : ";
  cin >> Array_Size;
  // それぞれの配列のメモリの動的確保
  Temporary_Array = new int[Array_Size];
  Buble_Array = new int[Array_Size];
  Shaker_Array = new int[Array_Size];
  Insertion_Array = new int[Array_Size];
  Quick_Array = new int[Array_Size];

  // 異なる乱数の生成
  srand((unsigned)time(NULL));
  for(i = 0;i < Array_Size;i++){  
    Temporary_Array[i] = rand();
    v.push_back(rand());
  }

  /* 異なる乱数の入った配列をバブルソートを行う配列に代入 */
  for(i = 0;i < Array_Size;i++)
    Buble_Array[i] = Temporary_Array[i];

  /* 異なる乱数の入った配列をシェーカーソートを行う配列に代入 */
  for(i = 0;i < Array_Size;i++)
    Shaker_Array[i] = Temporary_Array[i];

  /* 異なる乱数の入った配列を挿入ソートを行う配列に代入 */
  for(i = 0;i < Array_Size;i++)
    Insertion_Array[i] = Temporary_Array[i];

  /* 異なる乱数の入った配列をクイックソートを行う配列に代入 */
  for(i = 0;i < Array_Size;i++)
    Quick_Array[i] = Temporary_Array[i];
//  メモリを解放
  delete[] Temporary_Array;

  /* バブルソート計測開始 */
  clock_t Start_Buble_Sort = clock();
  Buble_Sort(Buble_Array,Array_Size);
  /* バブルソート計測終了 */
  clock_t End_Buble_Sort = clock();
  delete[] Buble_Array;

  /* シェーカーソート計測開始 */
  clock_t Start_Shaker_Sort = clock();
  Shaker_Sort(Shaker_Array,Array_Size);
  /* シェーカーソート計測終了 */
  clock_t End_Shaker_Sort = clock();
  delete[] Shaker_Array;

  /* 挿入ソート計測開始 */
  clock_t Start_Insertion_Sort = clock();
  Insertion_Sort(Insertion_Array,Array_Size);
  /* 挿入ソート計測終了 */
  clock_t End_Insertion_Sort = clock();
  delete[] Insertion_Array;

  /* クイックソート計測開始 */
  clock_t Start_Quick_Sort = clock();
  Quick_Sort(Quick_Array, 0, Array_Size-1);
  /* クイックソート計測終了 */
  clock_t End_Quick_Sort = clock();
  delete[] Quick_Array;

  // 標準ソート計測開始
  clock_t Standard_Start = clock();
  sort(v.begin(),v.end());
  // 標準ソート計測終了
  clock_t Standard_End = clock();

  cout << "・バブルソートによる実装時間は     " << fixed <<  setprecision(7) <<  (double)(End_Buble_Sort - Start_Buble_Sort)  / CLOCKS_PER_SEC << "秒" << endl;
  cout << "・シェーカーソートによる実装時間は " << fixed <<  setprecision(7) <<  (double)(End_Shaker_Sort - Start_Shaker_Sort)  / CLOCKS_PER_SEC << "秒" << endl;
  cout << "・挿入ソートによる実装時間は       " << fixed <<  setprecision(7) <<  (double)(End_Insertion_Sort - Start_Insertion_Sort)  / CLOCKS_PER_SEC << "秒" << endl;
  cout << "・クイックソートによる実装時間は   " << fixed <<  setprecision(7) <<  (double)(End_Quick_Sort - Start_Quick_Sort)  / CLOCKS_PER_SEC << "秒" << endl;
  cout << "・標準ソートによる実装時間は       " << fixed <<  setprecision(7) <<  (double)(Standard_End - Standard_Start)  / CLOCKS_PER_SEC << "秒" << endl;

  return 0;
}

/*  バブルソート */
void Buble_Sort(int x[], int n)
{
  int i, j, tmp;
  for (i = 0; i < n - 1; i++) {
    for (j = n - 1; j > i; j--) {
      if (x[j - 1] > x[j]) {  
        tmp = x[j];        
        x[j] = x[j - 1];
        x[j - 1]= tmp;
      }
    }	
  }
}

/*  挿入ソート */
void Insertion_Sort(int x[], int N){
  int i,j,v;
  for(i = 1;i < N;i++){
    v = x[i];
    j = i - 1;
    while(j >= 0 && x[j] > v){
      x[j + 1] = x[j];
      j--;
    }
    x[j + 1] = v;
  }
}

/*  シェーカーソート */
void Shaker_Sort(int x[], int N){
  int right, left, work, shift;
  int i, j;
  right = N - 1; left = 0;
  while(right > left){
    for(i = left; i < right; i++){
      if(x[i] > x[i + 1]){
        work = x[i];
        x[i] = x[i + 1];
        x[i + 1] = work;
        shift = i;
      }
    }
    right = shift;
    for(i = right; i > left; i--){
      if(x[i] < x[i - 1] ){
        work = x[i];
        x[i] = x[i - 1];
        x[i - 1] = work;
        shift = i;
      }
    }
    left = shift;
  }
}

/*  クイックソート */
void Quick_Sort(int list[], int left, int right){
  int i, last;
  int tmp;

  if (left >= right)
    return;
  last = left;
  for (i = left + 1; i <= right;i++){
    if (list[i] < list[left]){
      last++;
      tmp = list[last];
      list[last] = list[i];
      list[i] = tmp;
    }
  }
  tmp = list[left];
  list[left] = list[last];
  list[last] = tmp;

  Quick_Sort(list,left,last-1);
  Quick_Sort(list,last+1,right);
}

ちょっと雑な感じになってしまいましたがとりあえずこんな感じに書きました。

言語は先ほどちらっと言った、標準ライブラリのvectorを使うためC++です。C++は去年の学校の授業で触って以来全くやっていなかったので書くのに多少苦労もあった。。

ちなみにソートアルゴリズムは主にこちらの本を参考にした。

実装

f:id:mimaken:20170716103623p:plain

コンパイルを行いsortという実行ファイルを生成

f:id:mimaken:20170716103631p:plain

./sortで実行するとデータ数を入力するよう促される。試しに12345といったデータサイズの値を入力。そうすると各ソートの実装時間が表示される。
データサイズを1から10億をそれぞれ10回測定しそれらの平均の時間を調べた。

結果

結果は以下の表にまとめた。
f:id:mimaken:20170611015329p:plain
 空白の箇所はあまりにも時間がかかるため断念したところです。
 データサイズが少ないと一般的に速いとされているクイックソートや標準ライブラリによるソートが他のより若干遅いことがわかりました。
 ただデータサイズが大きくなるにつれやはり高速と呼ばれるクイックソートと標準ソートは100万まではデータサイズが小さい時とあまり変わらない速度でソートしてます。
 10億といった値だとなんと標準ソートの速度がクイックソートの半分といった結果でやはりライブラリは強い(確信)
 要するに

  • 高速なソートはデータ数が少ないとO(n^2)より遅い。
  • データサイズによってソートを使い分けるのは大事。

  • まさしくこのbotの言う通りである()

    どっち派?target=”_blank” or ”target=_new"

    タブの仕組み

     サイトにあるリンクなどをクリックすると同じタブに置き換わって表示されたり新しいタブが出てそこに表示されたりと色々な表示の仕方がある。それはaタグの中のtarget="何か"で制御されます。
     今回は新しいタブに表示される2通り仕組みを紹介します。

    blankとnewの説明

    f:id:mimaken:20170622150303p:plain
  • target="_blank"について
     target="_blank"は何枠でも出てきます
     例えばリンクを10回クリックすれば10つの新しいタブが出てきます。

  • target="_new"について
     target="_new"はblankとは違いリンクを何度クリックしても新しいタブは一つしか出てきません。そこに置き換わって表示されていきます。
     自分の知ってるサイトで有名なサイトですとyahoo画像なんかはtarget="_new"になっています。
     個人的にyahoo画像のサイトでその仕様ですと正直不便な気もしますが。。

    検証

  • target="_blank"の場合

  • Google & Yahoo

  • target="_new"の場合

  • Google & Yahoo


     ちなみに僕はtarget="_blank"派です。
     僕は新しいタブを開くことに対してあまり抵抗はなくいつもそのようにしてネットサーフィンを楽しんでます。
    要するに「_blank」の方に慣れているからです。大した理由はないです。。

    最後に

     皆さんはどちら派でしたか。
     ちなみに毎回別のタブを開くのことは「戻る」ボタンが使えなくなるので、前の画面に戻れなくなったり、さらにタスクバーがごちゃごちゃになるという混乱を招いてしまうことがあり、それらによって別のタブで開くことは極力避けた方が良いという意見が多々あるようです。
     またChrome拡張機能で、別タブで開く「_blank」を無効化して無視するのがあるらしくそれほど「_blank」は嫌われてる?
     こう言った意見を考慮すると「_new」の方が良いのかなと思ったり思わなかったり。

    学校へのSSH接続を自動化した

    はじめに

     僕はよく学校へSSH接続を行い、そこからプログラミングの課題をやったり提出したりしている。
     その際にいちいち長いコマンドを打ち、パスワードを入力して接続するのは少々面倒だったので自動化することにした。

    expectによる実装

    • そもそもexpectってなんぞや?
    •  SSH自動化はexpectというもので出来るらしい。(他のでも出来ますがexpectが簡単で分かりやすそうだった)  調べたらexpectとは対話的なプログラムとのやりとりを自動化するプログラムらしい。 今回の場合、向こうからパスワードを聞かれた時それに対して人間がパスワードを入力するがこれを自動化してくれる。
    • とりあえずスクリプトを書いてみた
    • 以下の記事を参考にした。 qiita.com

      #!/usr/bin/expect
      
      set timeout 10
      #ssh ユーザ名@ホスト名
      spawn ssh username@sshgate.u-hatena.ac.jp
      expect "Password: "
      send "ThisIsMyPasswd\n"
      interact
      

      sshという名前のディレクトリを作ってそこでssh_school.shというファイル名に書いた。

      #!/usr/bin/expect
      これはそのスクリプトを動かすシェルの宣言。#でコメントアウトしているように見えるがこれがないと動かない。

      set timeout 5
      タイムアウトする秒を指定しています。
      デフォルトだと10秒だがそれだと長いので5秒にしてある。

      spawn ssh usename@sshgate.u-hatena.ac.jp

      実行したいコマンドを指定。
      要するにspawnで指定したコマンドが自動化するコマンドです。
      この場合@の前にユーザ名、@の後にホスト名を入れる。

      expect "Password: "
      expectスクリプトで、相手からの応答(ダブルクォートで囲まれた文字列)を読み取り、パターンマッチをする時に利用します。
      この場合向こうから「Password: 」とパスワードを聞かれた場合の文字列である。

      send "ThisIsMyPasswd\n"
      相手に文字列を返答するコマンドです。
      これは"ThisIsMyPasswd"と自分のパスワードを打ってから\nでエンターを入力したという意味だ。

      interact
      標準入出力をキーボードと画面にします。

      スクリプトを書き、そのまま実行しようとしてもパーミッションなんちゃらがでるので
      $ chmod u+x ssh_school.sh
      で実行権限を付与。

      $ ./ssh_school.sh
      で見事SSH自動化に成功。これを叩くだけでパズワードを入力する手間をかけずに学校にSSH接続できた。やったね!

      その後、自分はzshを使っていたのでzshの環境設定ファイル.zshrcに以下のようなのを追加した。

      #.zshrc
      alias sshs='~/ssh/ssh_school.sh'
      

      でaliasを貼り、これで長いコマンドを打たなくて済み、尚且つどこの場所にいても"sshs"と叩けば学校へのSSHが出来るようになった。

    最後に

    今回の一つ前に投稿したのが去年の12月。3ヶ月間ブログで書く事がなくてやっと見つけた話題。これからも続けられるか心配だがモチベを上げてやっていこうと思う。

    AtomからVimに乗り換えた話

    はじめに
    たったの7ヶ月(笑)しか使っていなかったAtomからVimに乗り越えた。


    まずAtomとはGithubが提供しているオープンソースのエディタである。
    そしてVimとは設定ファイルの編集やプログラムを書くのに特化したエディタで、
    vimスクリプトと呼ばれる独自のスクリプトを使用して高度に機能を拡張することができます。
    別にAtomが嫌になって乗り換えたってわけではないです。。

    所々と間違っている箇所はあるかもしれないですが、
    AtomVimに興味がある人の参考になればと思います。


    Vimに乗り換えた理由
    エディタ戦争というものがあってその中でも二大陣営といえるのは、Vim愛好派とEmacs愛好派である。学校では最初の方はEmacsを使っていたので二大陣営のもう片方のVimが興味本位でどういうものか気になったのと、Vimを使っている人が周りにいたからのが使い始めた理由です。

    Atomを使った理由
    なぜAtomを使っていたかというとおすすめエディタというサイトでAtomを見た瞬間「めっちゃ綺麗で見やすやん!!」と衝動的にインストールして使い始めました笑。

    こんな感じ。 またGUIで設定ができるのでそこら辺は、初心者の僕でもあまり抵抗なく使えます。
    f:id:mimaken:20161214230134p:plain


    Vimの環境設定
    いきなりAtomの話は終わりますが続いてはVimの環境設定。
    カラースキーマは以下のサイトのIcebergというのにした。
    github.com


    手順
    githubからファイルを取得して指定のフォルダへ保存。

     $ mkdir -p ~/.vim/colors
     $ git clone https://github.com/cocopon/iceberg.vim
     $ mv ~/iceberg.vim/colors/iceberg.vim  ~/.vim/colors
    


    次にVimの設定ファイルを開き以下の2行を追加。

     $ vim ~/.vimrc
    
    ".vimrc
    syntax on
    colorscheme iceberg
    

    ちなみにVersionは0.6(12月19日現在)
    これでカラースキーマの設定は終わり。

    次に以下のサイトを見つけた。
    qiita.com
    とりあえずここにあるコードを丸コピして.vimrcに追加。
    さらに行番号に色をつけるコードも追加

    autocmd ColorScheme * highlight LineNr ctermfg=93
    

    ちなみに僕は93の紫色を選びましたがこんな感じに他の番号の色もたくさんあります。
    h2plus.biz

    現段階のUIはこんな感じ。
    f:id:mimaken:20161219000145p:plain

    あと入れるものがないかなとサイトを見ていたらプラグインでNERDTreeというものを見つけた。
    何とvimを開きながらディレクトリをツリー表示することができ、ファイルにvimを開きながらアクセスができるプラグインらしい。
    あと括弧を自動的に閉じてくれるプラグイン、この2つを追加。

    catcher-in-the-tech.net
    ここの記事を参考にして以下を追加。

     "C-tでツリー表示
      nnoremap <silent><C-t> :NERDTreeToggle<CR>
    
     "---------------------------
     " Start Neobundle Settings.
     "---------------------------
     " bundleで管理するディレクトリを指定
     set runtimepath+=~/.vim/bundle/neobundle.vim/
    
     " Required:
     call neobundle#begin(expand('~/.vim/bundle/'))
    " neobundle自体をneobundleで管理
     NeoBundleFetch 'Shougo/neobundle.vim'
     " NERDTreeを設定
     NeoBundle 'scrooloose/nerdtree'
     "括弧を自動的に閉じてくれる
     NeoBundle 'Townk/vim-autoclose'
    
     " 今後このあたりに追加のプラグインをどんどん書いて行きます!!"
    
     call neobundle#end()
    
     " Required:
     filetype plugin indent on
    
     " 未インストールのプラグインがある場合、インストールするかどうかを尋ねてくれるようにする設定
     " 毎回聞かれると邪魔な場合もあるので、この設定は任意です。
     NeoBundleCheck
    
     "-------------------------
     " End Neobundle Settings.
     "-------------------------
    

    そして開いてみると
    f:id:mimaken:20161219000359p:plain


    一応環境設定はこれで終わりなので設定ファイルなどはGitで管理して学校でも使えるようにする。


    最後にVimを使ってみての感想
    まずVimを最初に開いた時
    f:id:mimaken:20161216152305p:plain
    この~がたくさんあるのを見た時ミミズがいっぱいいる..と最初思いってしまいました。
    あとキーボードで操作するのがメイン、またkjhlで上下左右に動いたり、
    挿入モードやビジュアルモードなどといろんなモードがあるので操作に慣れるまでとても時間がかかりそうです。。
    だけど早めにこのシンプルな操作性に一度慣れてもっとカスタマイズしていけたらな〜と思います。


    他の参考文献
    vim-plugin NERDTree で開発効率をアップする! - Qiita

    初ブログ

    はじめまして

    南沢奈央を応援しているファン歴3年(もうすぐ4年)の大学2年生です!

    本日ブログを開設しました。

     

    周りがブログを書いていた影響もあり自分もブログを始めてみようと思いました。まあおそらくメインは趣味や技術系(メモなどの備忘録的な?)だと思います。

     所々間違ってる点などあると思いますが、その時はご指摘などお願いします。

     とりあえず投稿を続けられるように頑張ります。。

     以上、趣味&技術系0回目投稿でした。

    f:id:mimaken:20161211225933j:plain