地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

単方向リストと双方向リスト

双方向と片方向
双方向リストはノード毎に要するメモリ量が多くなるし、基本的な操作にかかる手間が多くなる。しかし、どちらの方向にもシーケンシャルアクセス可能であるため、扱いやすくなることが多い。特に、あるノードの削除をする場合、そのノードのアドレスさえ分かっていれば、定数時間でそれが可能である。挿入の場合も、挿入する位置(そのノードの前に新たなノードを挿入する)が判っていれば、双方向リストでは定数時間で挿入が可能である。片方向リストでは、挿入・削除の際に1つ前のノードのアドレスも知る必要がある。アルゴリズムによっては双方向のアクセスが必須な場合もある。一方、双方向リストでは尾部の共有はできないので、永続データ構造としては使えない。

削除したいノードのアドレスを別のデータ構造で管理している場合はノードの削除とノードにに紐づく前後のノードのポインタ情報を書き換えればノードの削除移動が双方向リストだと可能

単方向リストだと削除したノードのアドレスがわかっても前のノードのアドレスを知るための方法がないためO(N)の時間がかかってしまう。

【Linux】イベント駆動ライブラリのlibevのサンプルmain

software.schmorp.de

#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <ev.h>
#include <strings.h>

#define PORT_NO 3033
#define BUFFER_SIZE 1024

void accept_cb(struct ev_loop *loop, struct ev_io *watcher, int revents);
void read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents);

int main()
{
  struct ev_loop *loop = ev_default_loop(0);
  int sd;
  struct sockaddr_in addr;
  int addr_len = sizeof(addr);
  struct ev_io w_accept;

  // Create server socket
  if( (sd = socket(PF_INET, SOCK_STREAM, 0)) < 0 )
  {
    perror("socket error");
    return -1;
  }

  bzero(&addr, sizeof(addr));
  addr.sin_family = AF_INET;
  addr.sin_port = htons(PORT_NO);
  addr.sin_addr.s_addr = INADDR_ANY;

  // Bind socket to address
  if (bind(sd, (struct sockaddr*) &addr, sizeof(addr)) != 0)
  {
    perror("bind error");
  }

  // Start listing on the socket
  if (listen(sd, 2) < 0)
  {
    perror("listen error");
    return -1;
  }

  // Initialize and start a watcher to accepts client requests
  ev_io_init(&w_accept, accept_cb, sd, EV_READ);
  ev_io_start(loop, &w_accept);

  // Start infinite loop
  while (1)
  {
    ev_loop(loop, 0);
  }

  return 0;
}

void accept_cb(struct ev_loop *loop, struct ev_io *watcher, int revents)
{
  struct sockaddr_in client_addr;
  socklen_t client_len = sizeof(client_addr);
  int client_sd;
  struct ev_io *w_client = (struct ev_io*) malloc (sizeof(struct ev_io));

  if(EV_ERROR & revents)
  {
    perror("got invalid event");
    return;
  }

  // Accept client request
  client_sd = accept(watcher->fd, (struct sockaddr *)&client_addr, &client_len);

  if (client_sd < 0)
  {
    perror("accept error");
    return;
  }

  // Initialize and start watcher to read client requests
  ev_io_init(w_client, read_cb, client_sd, EV_READ);
  ev_io_start(loop, w_client);
}

/* Read client message */
void read_cb(struct ev_loop *loop, struct ev_io *watcher, int revents){
  char buffer[BUFFER_SIZE];
  ssize_t read;

  if(EV_ERROR & revents)
  {
    perror("got invalid event");
    return;
  }

  // Receive message from client socket
  read = recv(watcher->fd, buffer, BUFFER_SIZE, 0);

  if(read < 0)
  {
    perror("read error");
    return;
  }

  if(read == 0)
  {
    // Stop and free watchet if client socket is closing
    ev_io_stop(loop,watcher);
    free(watcher);
    perror("peer might closing");
    return;
  }
  else
  {
    printf("message:%s",buffer);
  }

  // Send message bach to the client
  /* send(watcher->fd, buffer, read, 0); */
  bzero(buffer, read);
}

【Ansible】コマンドラインオプション

1.Ansible

  引数に従い、単発でモジュールを実行します。     $ ansible (対象機器名) -u (ユーザー名) -k -m (実行モジュール) -a (モジュールの引数)      引数の説明:     (対象機器名) 設定を行う機器名。インベントリファイルに定義しておく必要があります。             1台のホスト、ホストグループという複数のホストをまとめたグループを指定します。             また、ALL とするとインベントリファイルに記述した全ての設定を行います。

     -u      対象機器に接続するユーザー名。省略すると現在のユーザー名で接続します。      -k      対象機器にssh接続するときにパスワード入力する。      -m      モジュール名      -a      モジュールの引数。(引数名)=(値) で記述します。”で囲むこともできます。

  例)centos2 に対して、モジュールPINGを使用し、pingを実行します。

    $ ansible centos2 -a data=pong -m ping -k

 ※上記以外にも様々な引数があります。詳細は以下を見てください。  参考URL:https://docs.ansible.com/ansible/latest/cli/ansible.html

2.Ansible-Playbook

 引数に指定したplaybookに書かれた処理を上から順に連続で実行します。  複数のplaybookを指定することで、連続で実行することもできます。

 $ ansible-playbook -k (playbookファイル名) ...

     -k           対象機器にssh接続するときにパスワード入力する。      (playbookファイル名)  実行内容を記述したplaybookファイル名。絶対パス指定も可能。 

 例) playbook sample.yml を実行

   $ ansible-playbook -k sample.yml

 ※その他の引数(一部)    ansible-playbookには様々な引数がありますが、おそらくよく使うことになるplaybookの書式チェックや実行内容確認の引数を紹介します。

     --syntax-check    playbookの書式のエラーチェック      -C           dry-run。対象機器に接続するが、変更などは行わない。(何をやろうとするのか確認する)

  使用例)     ansible-playbook の引数はplaybookファイル名より前にも後ろにも記述できます。     確認系の引数は最後に書くと、後末尾を消すだけで実際の処理ができるので便利です。

    $ ansible-playbook sample.yml --syntax-check     $ ansible-playbook -k sample.yml -C

これまでやってきたことをメモ

概要

職務経歴書で使うようなことを棚卸し的に書いてメモを記事にしただけの記事。

学歴とか

高校/大学は一応理系でプログラミングの基礎の基礎の基礎くらいは知っていたくらい。

職歴

1社目

2017/04 ~ 2019/03

仕事でやったこと

仙台に本社を構えるSIerに内定をもらったので入社。参画したプロジェクトは1つ。やったことは主にHPCの研究/開発者たちが快適に使えるような環境を構築/運用していく役割

研究で使うサーバのセットアップはもちろんGitLabだったりPukiWikiだったりプロジェクトで使うようなツールの運用なんかもやっていた。IaCとかモニタリングツールとかはこの辺で学んだ。

2社目

2019/04 ~

転職した理由

東京が本社のSIerで仙台での採用。このときの転職の軸とか条件は以下の感じ

  • 仙台で勤務可能
  • 東京の案件をやれる
  • クラウドを使ったWebシステムに携われる

これを満たせるのが今の会社だったので入社を決めた。

仕事以外でやったこと

資格を取った

SIerあるあるなのか奨励金があって取るたびにお金がもらえたので1年目から色々取った。LPICとかは仕事上なきゃ大変って感じなので取って仕事に活きる機会が多かったので楽しかった。言語系は入門書読んでおけばさっと取れるので奨励金目当てで取って美味しいものを食べにいくくらいだった。

今後はCKAとかCKADとかAWSとか業務に直結する系の資格だけを狙って効率的に学習していきたい。

  • MOS Excel 2016
  • ITパスポート
  • 基本情報技術者
  • LPIC Level3 (300/303/304)
  • AWS認定(CLP / SAA / SOA / DVA)
  • Java Silver SE8
  • Python3エンジニア認定基礎試験
  • PHP5技術者認定初級試験
  • OSS DB Silver
  • UMTP L1
  • UiPath RPA アソシエイト
アウトプットした

小さなアウトプットでも積み重ねることで年間100記事くらい書いてた。コンテキスト違うアウトプットはそれだけで価値があるというのを信じて今後もこれは続けていきたい。