ふふーん

一緒にやりたくなったのよ!あなたと、調合を!

はじめてのapacheモジュール

apacheのモジュール作ってみたのでメモ。

環境はCentOS 7.3。

# cat /etc/centos-release
CentOS Linux release 7.3.1611 (Core) 

必要なパッケージを入れる。

# yum install '@development tools' epel-release
# yum install httpd httpd-devel libapreq2 libapreq2-devel

思い出しながら書いてるのでなんか足りないかも。httpd-develに入ってるapxsというコマンドがいろいろ便利にやってくれる。

まず、"hello"を返すだけのやつ。apxs -gでテンプレート作ってくれるので、ほぼそのまま使える。

# apxs -g -n hello
Creating [DIR]  hello
Creating [FILE] hello/Makefile
Creating [FILE] hello/modules.mk
Creating [FILE] hello/mod_hello.c
Creating [FILE] hello/.deps
# ls hello/
Makefile  mod_hello.c  modules.mk

ここで作られるmod_hello.cの先頭に便利コメントがあるので読んでおくとよさげ。

hello_handler()だけちょっと直せば(putsのメッセージしか変えてないけども)おわり。

static int hello_handler(request_rec *r)
{
    if (strcmp(r->handler, "hello")) {
        return DECLINED;
    }
    r->content_type = "text/html";

    if (!r->header_only)
        ap_rputs("hello\n", r);
    return OK;
}

モジュールのビルドとhttpdのリロード。リロードする前にhttpdの設定ファイルを追加する。モジュールのビルドとインストールまではapxsコマンドがやってくれる便利。

# apxs -c -i mod_hello.c
# cat /etc/httpd/conf.d/hello.conf
LoadModule hello_module modules/mod_hello.so
<Location /hello>
    SetHandler hello
</Location>
# systemctl reload httpd

動いてるか確認する。

# curl http://127.0.0.1/hello
hello

大丈夫そう。

次、POSTで受け取ったデータをそのまま返すやつ。echoサーバー的な。

テンプレート作るのとかはほぼ同じコマンドでできる。ビルドするときにインクルードパスを追加するところだけ注意。

# apxs -g -n echo

ハンドラーを作る。

static int echo_handler(request_rec *r)
{
    if (strcmp(r->handler, "echo")) {
        return DECLINED;
    }
    r->content_type = "text/html";

    if (!r->header_only)
        return DECLINED;

    apreq_handle_t *apreq = apreq_handle_apache2(r);
    const apr_table_t *param;
    apreq_body(apreq, &param);

    ap_rprintf(r, "%s\n", apreq_params_as_string(r->pool, param, NULL, APREQ_JOIN_AS_IS));

    return OK;

ビルドとインストール。

# apxs -I /usr/include/apreq2 -c -i mod_echo.c

httpdの設定ファイル追加して、リロードしたら、動作確認。

# curl -d 'text=hellohello' http://127.0.0.1/echo
"hellohello"

おわり。

nfcpyでPASMOを読む

PASMOの履歴管理したいなーとおもったのでやってみる。

pythonでnfcpy使うのが一番楽そうなのかな。

Getting started — nfcpy 0.13.0 documentationを見るとまだpython3.xには未対応っぽい。

使ったNFCリーダーはAmazon | ソニー SONY 非接触ICカードリーダー/ライター PaSoRi RC-S380 | プリペイド電話カード オンライン通販

#!/usr/bin/python

import nfc

def on_connect(tag):
    print '\n'.join(tag.dump())

with nfc.ContactlessFrontend('usb') as clf:
    clf.connect(rdwr={'on-connect': on_connect})

これでNFCのタグをダンプできる。これを実行してPASMOをかざすとダンプできた。

デバイスにアクセスするのにroot権限必要かも(あとで調べる)。

$ sudo ./pasmo.py 
System 0003 (Suica)
Area 0000--FFFE
  Area 0040--07FF
    Random Service 1: write with key & read with key (0x0048 0x004A)
    Random Service 2: write with key & read w/o key (0x0088 0x008B)
...
      Random Service 96: write with key & read with key (0x1808 0x180A)
      Random Service 97: write with key & read with key (0x1848 0x184A)
      Random Service 98: write with key & read with key (0x1888 0x188A)

NFCを読めているらしい。PASMOのデータは

github.com

ここをみるとよさげ。

MirageOSの環境構築

環境構築とサンプルを動かすまで。環境はUbuntu 16.04。

いろいろインストール。

$ sudo apt install -fy automake build-essential pkg-config

ocamlの準備。opamを入れてから、opamを使ってocamlのコンパイラーとかをインストールする。

$ sudo apt install -fy opam
$ ocamlc -version
4.02.3
$ opam init --no-setup
$ eval `opam config env`
$ opam switch
--     -- 3.07    Official 3.07 release
--     -- 3.08.0  Official 3.08.0 release
--     -- 3.08.1  Official 3.08.1 release
--     -- 3.08.2  Official 3.08.2 release
--     -- 3.08.3  Official 3.08.3 release
--     -- 3.08.4  Official 3.08.4 release
--     -- 3.09.0  Official 3.09.0 release
--     -- 3.09.1  Official 3.09.1 release
--     -- 3.09.2  Official 3.09.2 release
--     -- 3.09.3  Official 3.09.3 release
--     -- 3.10.0  Official 3.10.0 release
--     -- 3.10.1  Official 3.10.1 release
--     -- 3.10.2  Official 3.10.2 release
--     -- 3.11.0  Official 3.11.0 release
--     -- 3.11.1  Official 3.11.1 release
--     -- 3.11.2  Official 3.11.2 release
--     -- 3.12.0  Official 3.12.0 release
--     -- 3.12.1  Official 3.12.1 release
--     -- 4.00.0  Official 4.00.0 release
--     -- 4.00.1  Official 4.00.1 release
--     -- 4.01.0  Official 4.01.0 release
--     -- 4.02.0  Official 4.02.0 release
--     -- 4.02.1  Official 4.02.1 release
--     -- 4.02.2  Official 4.02.2 release
--     -- 4.02.3  Official 4.02.3 release
--     -- 4.03.0  Official 4.03.0 release
--     -- 4.04.0  Official 4.04.0 release
--     -- 4.04.1  Official 4.04.1 release
system  C system  System compiler (4.02.3)
# 247 more patched or experimental compilers, use '--all' to show
$ opam switch 4.04.1
$ ocamlc -version
4.04.1

mirageをインストールする。

$ opam install mirage

サンプルを動かしてみる。

$ git clone https://github.com/mirage/mirage-skeleton
$ cd mirage-skeleton/tutorial/hello
$ ls
config.ml  unikernel.ml
$ mirage configure -t unix
$ ls
Makefile  config.ml   main.ml                           myocamlbuild.ml
_build    key_gen.ml  mirage-unikernel-hello-unix.opam  unikernel.ml
$ make depend
$ make
$ ./hello 
2017-04-25 09:16:02 +09:00: INF [application] hello
2017-04-25 09:16:03 +09:00: INF [application] hello
2017-04-25 09:16:04 +09:00: INF [application] hello
2017-04-25 09:16:05 +09:00: INF [application] hello

とりあえずここまで。

NixOSのunstableチャンネルにしてみた

unstableなチャンネルを使ってみた。やり方はほぼマニュアルにあるとおり。 https://nixos.org/nixos/manual/index.html#sec-getting-sources

一般ユーザーのホームの下にシステムのパッケージのツリーを置くのがなんとなく気持ち悪かったので/var/libの下で作業した。

$ sudo mkdir /var/lib/atelier
$ sudo chown firis. /var/lib/atelier
$ cd /var/lib/atelier

更新前の状態。

$ nixos-version
17.03.1009.10179b08a5 (Gorilla)

あとはマニュアルの通り。nixpkgs-channelsとnixpkgsってどう使い分けてるんだろう。

$ git clone https://github.com/nixos/nixpkgs
$ cd nixpkgs
$ git remote add channels https://github.com/nixos/nixpkgs-channels
$ git remote update channels
$ git checkout -b local channels/nixpkgs-unstable
$ sudo nixos-rebuild switch -p unstable -I nixpkgs=/var/lib/atelier/nixpkgs

これでシステムがunstableチャンネルに更新される。17.09になるのね。

$ nixos-version 
17.09.git.67adf69 (Hummingbird)

nixos-rebuildするときに-pでプロファイル名つけると、systemd-bootのエントリーは作られないっぽい。 なんか同じこと言ってる人がいた。 www.reddit.com

起動してから毎回switchするのだるい。

NixOSをインストールした

QEMUの仮想マシンにNixOSをインストールしたときのメモ。

とりあえずsshでログインできるようにする。

# nix-env -iA openssh
# systemctl start sshd

これでsshdが起動するので適当にネットワークつなげるとsshでログインできるようになる。

最初にパーティションを切ってフォーマットとか。よくわからんので適当。 ESPを200Mとスワップを2Gにして、残りはbtrfsで。btrfsのサブボリュームは適当(よくわからん)。

# gdisk -l /dev/sda
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          411647   200.0 MiB   EF00  EFI System
   2          411648         4605951   2.0 GiB     8200  Linux swap
   3         4605952       104857566   47.8 GiB    8300  Linux filesystem

# mkfs.vfat /dev/sda1
# mkfs.btrfs /dev/sda3
# mkswap /dev/sda2
# swapon /dev/sda2
# mount /dev/sda3 /mnt
# btrfs subvolume create /mnt/system
# btrfs subvolume create /mnt/home
# umount /mnt
# mount -o subvol=system /dev/sda3 /mnt
# mkdir /mnt/home
# mount -o subvol=home /dev/sda3 /mnt/home
# mkdir /mnt/boot
# mount /dev/sda1 /mnt/boot

NixOSのコンフィグを作る。

# nixos-generate-config --root /mnt
writing /mnt/etc/nixos/hardware-configuration.nix...
writing /mnt/etc/nixos/configuration.nix...

/mnt/etc/nixos/hardware-configuration.nixと/mnt/etc/nixos/configuration.nixの2つファイルが作られる。 hardware-configuration.nixのほうは触らないで、システムに変更を加えるときはconfiguration.nixを編集する。

とりあえずほぼデフォルトのままにする。変更したのはホスト名とタイムゾーンくらい。

# Edit this configuration file to define what should be installed on
# your system.  Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running ‘nixos-help’).

{ config, pkgs, ... }:

{
  imports =
    [ # Include the results of the hardware scan.
      ./hardware-configuration.nix
    ];

  # Use the systemd-boot EFI boot loader.
  boot.loader.systemd-boot.enable = true;
  boot.loader.efi.canTouchEfiVariables = true;

  networking.hostName = "nixos"; # Define your hostname.
  # networking.wireless.enable = true;  # Enables wireless support via wpa_supplicant.
  networking.interfaces.enp0s4.ip4 = [ { address = "192.168.111.5"; prefixLength = 24; } ];

  # Select internationalisation properties.
  # i18n = {
  #   consoleFont = "Lat2-Terminus16";
  #   consoleKeyMap = "us";
  #   defaultLocale = "en_US.UTF-8";
  # };

  # Set your time zone.
  time.timeZone = "Asia/Tokyo";

  # List packages installed in system profile. To search by name, run:
  # $ nix-env -qaP | grep wget
  # environment.systemPackages = with pkgs; [
  #   wget
  # ];

  # List services that you want to enable:

  # Enable the OpenSSH daemon.
  # services.openssh.enable = true;

  # Open ports in the firewall.
  # networking.firewall.allowedTCPPorts = [ ... ];
  # networking.firewall.allowedUDPPorts = [ ... ];
  # Or disable the firewall altogether.
  # networking.firewall.enable = false;

  # Enable CUPS to print documents.
  # services.printing.enable = true;

  # Enable the X11 windowing system.
  # services.xserver.enable = true;
  # services.xserver.layout = "us";
  # services.xserver.xkbOptions = "eurosign:e";

  # Enable the KDE Desktop Environment.
  # services.xserver.displayManager.sddm.enable = true;
  # services.xserver.desktopManager.plasma5.enable = true;

  # Define a user account. Don't forget to set a password with ‘passwd’.
  # users.extraUsers.guest = {
  #   isNormalUser = true;
  #   uid = 1000;
  # };

  # The NixOS release to be compatible with for stateful data such as databases.
  system.stateVersion = "17.03";

}

あとはインストールする。途中でrootユーザーのパスワード聞かれる。終わったら再起動。

# nixos-install

ついでなのでGNOME3にする。configuration.nixを編集してnixos-rebuildするだけ。 configuration.nixの差分はこんな感じ。i18nのとこと、Xのとこと、あとは一般ユーザー作ったくらい。

--- configuration.nix.00 2017-04-20 14:06:41.168682910 +0900
+++ configuration.nix.01  2017-04-20 14:45:44.399948923 +0900
@@ -19,11 +19,14 @@
   networking.interfaces.enp0s4.ip4 = [ { address = "192.168.111.5"; prefixLength = 24; } ];
 
   # Select internationalisation properties.
-  # i18n = {
-  #   consoleFont = "Lat2-Terminus16";
-  #   consoleKeyMap = "us";
-  #   defaultLocale = "en_US.UTF-8";
-  # };
+  i18n = {
+    consoleKeyMap = "us";
+    defaultLocale = "ja_JP.UTF-8";
+    inputMethod = {
+      enabled = "fcitx";
+      fcitx.engines = with pkgs; [ fcitx-engines.mozc ];
+    };
+  };
 
   # Set your time zone.
   time.timeZone = "Asia/Tokyo";
@@ -54,14 +57,15 @@
   # services.xserver.xkbOptions = "eurosign:e";
 
   # Enable the KDE Desktop Environment.
-  # services.xserver.displayManager.sddm.enable = true;
-  # services.xserver.desktopManager.plasma5.enable = true;
+  services.xserver.enable = true;
+  services.xserver.displayManager.gdm.enable = true;
+  services.xserver.desktopManager.gnome3.enable = true;
 
   # Define a user account. Don't forget to set a password with ‘passwd’.
-  # users.extraUsers.guest = {
-  #   isNormalUser = true;
-  #   uid = 1000;
-  # };
+  users.extraUsers.firis = {
+    isNormalUser = true;
+    extraGroups = [ "wheel" ];
+  };
 
   # The NixOS release to be compatible with for stateful data such as databases.
   system.stateVersion = "17.03";

アップデートしたら、作ったユーザーのパスワード設定するの忘れないように。

# nixos-rebuild switch
# passwd firis

これで再起動するとGNOME3の環境になる。fcitxでmozcも使える。

pythonのrequestsを使う

使い方わからんち。

$ LANG=ja_JP.UTF-8 python3
Python 3.4.2 (default, Oct  8 2014, 10:45:20) 
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> r = requests.get('http://mikutter.hachune.net/faq.json')
>>> r.url
'http://mikutter.hachune.net/faq.json'
>>> r.status_code
200
>>> r.reason
'OK'
>>> r.ok
True
>>> r.text
'[{"question":"Android端末を充電したいのですが","answer":"ふわああぁ!いらっしゃ
...
>>> r.content
b'[{"question":"Android\xe7\xab\xaf\xe6\x9c\xab\xe3\x82\x92\xe5\x85\x85\xe9\x9b
...
>>> type(r.text)
<class 'str'>
>>> type(r.content)
<class 'bytes'>
>>> r.json()
[{'answer': 'ふわああぁ!いらっしゃぁい!よぉこそぉ↑mikutterへ~!どうぞどうぞ!
...
>>> r.json()[0].keys()
dict_keys(['answer', 'question', 'id'])
>>> _ = list(map(lambda q: print(q.get('question')), r.json()))
Android端末を充電したいのですが
mikutterとはなんですか
動作条件は?
mikutterで彼女作れますか?
mikutterプラグインってどうやって作るんですか?
井の頭線でmikutterを使っている人を目撃しました。
mikutter優勝魔剤?
I am English speaker. Can I use Mikutter in English?
我是中国人说话。我可以在中国mikutter使用。
なぜかツイート数が増えました
mikutterで検索するとよくわからないものが出てくる
バグが多いように思う
ミク要素がありません
動作OS/ディストリは?
Macでの動かせますか
報告したバグが直らない
隠し機能を見つけてしまいました
何もしていないのに突然落ちました。
ハッシュタグはありますか?
足りない機能がある
mikutterの削除ボタンがしいたけに見えて困る。
mikutterの開発に参加したい