読者です 読者をやめる 読者になる 読者になる

docker exec せずに docker コンテナ内のファイルを手元で編集できる docker-edit コマンドを書いた

gist.github.com

pipe + fork + exec 書いてみた

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

void
strwrite(
    int const fd,
    char const* const str)
{
  if(write(fd, str, strlen(str)) < 0) {
    perror("write");
    exit(1);
  }
}

pid_t
process_open(
    char const* const path,
    int const stdin_fd,
    int const stdout_fd,
    int const*   close_on_child_fds,
    size_t const close_on_child_fds_length,
    int const*   close_on_parent_fds,
    size_t const close_on_parent_fds_length)
{
  pid_t const child_pid = fork();

  switch(child_pid) {
    case -1: // error
      perror("fork");
      exit(1);
    case 0: // child
      for(size_t i = 0; i < close_on_child_fds_length; ++i) { close(close_on_child_fds[i]); }
      dup2(stdin_fd,  STDIN_FILENO ); close(stdin_fd);
      dup2(stdout_fd, STDOUT_FILENO); close(stdout_fd);

      execl(path, path, NULL);
      perror(path);
      exit(1);
    default: // parent
      for(size_t i = 0; i < close_on_parent_fds_length; ++i) { close(close_on_parent_fds[i]); }
  }

  return child_pid;
}


int main()
{
  int write_pipefd[2];
  int read_pipefd[2];
  if (pipe(write_pipefd) < 0 || pipe(read_pipefd)) {
    perror("pipe");
    exit(1);
  }

  process_open("/usr/local/bin/lua",
      write_pipefd[0], read_pipefd[1],
      (const int[]){write_pipefd[1], read_pipefd[0]}, 2,
      (const int[]){write_pipefd[0], read_pipefd[1]}, 2);

  strwrite(write_pipefd[1], "print(_VERSION)");
  close(write_pipefd[1]);

  char buf[256] = {0};
  if (read(read_pipefd[0], buf, sizeof(buf)) < 0) {
    perror("read");
    exit(1);
  }

  printf("got [%s]\n", buf);
}

f:id:nyaocat:20160229114535j:image
こたつの外でこたつに寄りかかって寝る猫

f:id:nyaocat:20160229114524j:image
キャットタワーのハンモックの上にいるところを撮られた猫

(画像投稿を試すための記事)

C++11以降で #define private public を弾く

どちらもコード中の//#define private publicのコメントを外すとコンパイルが失敗する

マイナンバーを全パターン出力するワンライナーを書きました

seq -w 0 99999999999 | awk '{l=split($0,ns,"");s=0;for(i=1;i<=l;++i){s+=ns[l-i+1]*((i<=6)?i+1:i-5);}d=s%11;print $0 (d<=1?0:11-d);}'

awkフル活用なので面白みに欠ける。

マイナンバーのチェックディジットの計算式は 総務省令第八十五号の第5条より。

GUIアプリを端末から切り離して実行する

普通に端末からwiresharkとか叩くと、端末を閉じるとwiresharkも終了するので鬱陶しい。&付けて起動しても、なんか色々出力出るし。

wireshark < /dev/null >/dev/null 2>/dev/null &

このように起動すれば端末から完全に切り離されて起動するので、端末閉じても平気だし当然ながら出力も出ない。

いちいち書くのが面倒なのでシェルスクリプトにした。

$ cat `which rg`
#!/bin/sh
$@ < /dev/null >/dev/null 2>/dev/null &

$ rg wireshark

svnレポジトリ以下のファイルを全検索してエディタで開くワンライナー(要 percol )

 vim `svn ls -R | xargs grep -n $@ | percol | sed 's/:[^:]*$//' | sed 's/:/ +/'`

これを適当な名前で PATH の通ったディレクトリに名前つけて保存するだけ。

percol は他の類似品でも多分大丈夫。