C# で Hello world

using System;

namespace HelloWorld
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, world");
        }
    }
}

VimのVundleでプラグインを管理する

NeoBundle.vim から dein.vim に移行している最中ですが、Vundle.vim しか使えない環境もあり、改めて手順におこしておく。

1. Vundle.vim をローカルにコピーする

$ git clone http://github.com/gmarik/vundle.git ~/.vim/bundle/vundle

2. vimrc に Vundle.vim の設定を追加する

"
" Vundle.vim
"
set nocompatible              " be iMproved, required
filetype off                  " required

set rtp+=~/.vim/bundle/vundle/
call vundle#begin()

Plugin 'VundleVim/Vundle.vim'

call vundle#end()            " required
filetype plugin indent on    " required

3. プラグインをインストールする

vim を起動して、 :PluginInstall を実行する。

nginx モジュール開発するにあたって(config編)

まずconfigに関する情報集め。

include ファイルや外部ライブラリがなければ、以下の内容で十分。

ngx_module_type=HTTP
ngx_module_name=ngx_http_foobar_module
ngx_module_srcs="$ngx_addon_dir/ngx_http_foobar_module.c"

. auto/module

ngx_addon_name=$ngx_module_name

青春18きっぷで東京から小倉まで

品川を始発で出発して、小倉まで。 青春18きっぷで初の長旅だったけれど、途中で休憩できたり、意外と疲れなく行けた。

ansible で vagrant の開発環境を構築する (準備)

ansible で vagrant の環境を構築するための準備。

実行環境

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.11.1
BuildVersion:   15B42
$ vagrant --version
Vagrant 1.7.4
$ ansible --version
ansible 1.9.4
  configured module search path = None

ansible をインストール

brew install ansible

環境設定

  • inventory file
ansible_ssh_private_key_file=~/.vagrant.d/insecure_private_key
127.0.0.1 ansible_ssh_port=2222 ansible_ssh_private_key_file=.vagrant/machines/default/virtualbox/private_key ansible_ssh_user=vagrant

接続確認

inventory file をファイル名 hosts として保存する。

$ ansible -i ./hosts 127.0.0.1 -m ping
127.0.0.1 | success >> {
    "changed": false,
    "ping": "pong"
}

参考

ssh の設定でつまづきましたが、こちらが参考になりました! Vagrant + Ansible

http2 対応の curl をビルドする

curl の http2 は nghttp2 を利用しているので、あらかじめインストールしておく。

$ curl -O http://curl.haxx.se/download/curl-7.45.0.tar.gz
$ tar zxf curl-7.45.0.tar.gz
$ cd curl-7.45.0
$ ./configure --prefix=/usr/local/curl-http2 --with-nghttp2
(途中省略)
configure: Configured to build curl/libcurl:

  curl version:     7.45.0
  Host setup:       x86_64-pc-linux-gnu
  Install prefix:   /home/vagrant/opt/curl-7.45.0
  Compiler:         gcc
  SSL support:      enabled (OpenSSL)
  SSH support:      no      (--with-libssh2)
  zlib support:     enabled
  GSS-API support:  no      (--with-gssapi)
  TLS-SRP support:  enabled
  resolver:         default (--enable-ares / --enable-threaded-resolver)
  IPv6 support:     enabled
  Unix sockets support: enabled
  IDN support:      enabled
  Build libcurl:    Shared=yes, Static=yes
  Built-in manual:  enabled
  --libcurl option: enabled (--disable-libcurl-option)
  Verbose errors:   enabled (--disable-verbose)
  SSPI support:     no      (--enable-sspi)
  ca cert bundle:   /etc/ssl/certs/ca-certificates.crt
  ca cert path:     no
  LDAP support:     enabled (OpenLDAP)
  LDAPS support:    enabled
  RTSP support:     enabled
  RTMP support:     enabled (librtmp)
  metalink support: no      (--with-libmetalink)
  HTTP2 support:    enabled (nghttp2)
  Protocols:        DICT FILE FTP FTPS GOPHER HTTP HTTPS IMAP IMAPS LDAP LDAPS POP3 POP3S RTMP RTSP SMB SMBS SMTP SMTPS TELNET TFTP

$ make
$ sudo make install

libcurl で http レスポンス ボディを受け取る

curl はコマンドではよくお世話になっていたが、C から使ったことはなくこの度 libcurl を使うコードを書いてみた。
curl はいろんなプロトコルに対応しているが、そのほとんどが option や callback 関数を設定するだけでなんとかなりそう。

それと、--libcurl というコマンドラインオプションがあり、curl コマンドで実行した内容の C ソースコードを出力できる。
普段使い慣れているコマンドラインから、C ソースコードでの実装に入っていけるから、実装が少しだけ楽になりそう。

コード

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "curl/curl.h"

typedef struct {
    char *m;
    size_t size;
} Memory;

size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata);

int main(int argc, char **argv)
{
    CURL *curl;
    CURLcode ret;
    Memory body;

    curl_global_init(CURL_GLOBAL_ALL);

    curl = curl_easy_init();
    if (curl == NULL) {
        fprintf(stderr, "Error: curl_easy_init() failed\n");
        return 1;
    }

    body.m = (char *)malloc(1);
    body.m[0] = '\0';
    body.size = 0;

    curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/");
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &body);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
    curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");

    ret = curl_easy_perform(curl);
    if (ret != CURLE_OK) {
        fprintf(stderr, "Error: curl_easy_perform() failed: %s\n", curl_easy_strerror(ret));
        return 1;
    }

    printf("response: \n%s\n", body.m);

    free(body.m);

    curl_easy_cleanup(curl);

    curl_global_cleanup();

    return 0;
}

size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata)
{
    char *p;
    Memory *mem = (Memory *)userdata;
    size_t append_size = size * nmemb;

    p = (char *)realloc(mem->m, mem->size + append_size + 1);
    if (p == NULL) {
        return 0;
    }
    memcpy(p + mem->size, ptr, append_size);

    mem->m = p;
    mem->size += append_size;
    mem->m[mem->size] = '\0';

    return size * nmemb;
}