一般的なデータ構造

近頃は、言語に組み込みのデータ構造が充実しているので、データ構造を意識することが少なくなっているかもしれない。しかし、データ構造に対する理解を深めておくと、ソフトウェアやデータベースの高速化に役立つだろう。(私の場合は、振り返ると、大学で基礎として教えてもらえてラッキーだった。)... 続きを読む

open (file object)

ファイルのオープン

utf-16 でエンコードされた csv ファイルの読み出し。(書き出しは unicode_escape。)
f = open('keyword.csv', encoding='utf-16')
for l in f:
    print(l.encode('unicode_escape'))
または、
with open('keyword.csv', encoding='utf-16') as f:
    for l in f:
        print(l.encode('unicode_escape'))
... 続きを読む

sitemap中の%エンコードされた日本語のURLの一覧

sitemap.xml を確認しようとするが、日本語の URL にしていると、sitemap.xml 内の URL が % エンコードされてしまい、内容がわからないということがあるかもしれない。(そんなことで困っている人はいないかもしれないが。。。) python で xml 内の loc タグ内の % エンコードされたURLを日本語にして表示する。 print_sitemap.py
#!/usr/bin/env python

import requests
import sys
from bs4 import BeautifulSoup
import urllib.parse

url = sys.argv[1]
sitemap = requests.get(url)
soup = BeautifulSoup(sitemap.text)
locs = soup.find_all('loc')
for loc in locs:
    print(urllib.parse.unquote(loc.text))
python print_sitemap.py URL BeautifulSoup は xml や、html の解析に便利なので、使ってみてほしい。... 続きを読む

共用体

さて、構造体の次に出てくるのが共用体だろう。 これが、今思うと、自分には、超難解だった。ネット上の説明も、まあまあ、デタラメだと思う。 私がこれまで携わってきた中では、以下の二つのケースが大半だったので、私見だが、使う必要が出てきた時に考えればよいと思う。

可変サイズのデータの格納

typedef union {
    char charval;
    int intval;
    long longval;
    double doubleval;
} variant_t;


int main(int argc, char *argv[])
{
    variant_t v;

    v.charval = 1;
    v.intval = 2;
    v.longval = 3;
}
一般的には、こういう説明だろう。 図示すると次のようになるだろうか。 union しかし、ネット上の説明がデタラメだと思うのは、いったい、どの共用体メンバーにアクセスしてよいかわからない点だ。 実際には、構造体と組み合わせて使うのではないかと思う。
#include <stdio.h>

// char でも int でも long でも double でも入るデータ構造を考えてみる
typedef struct {
     int valtype; // 1=charval, 2=intval, 3=longval、 4=doubleval
     union {
         char charval;
         int intval;
         long longval;
         double doubleval;
    } u;
} variant_t;

int
main(int argc, char *argv[])
{
    variant_t v;

    v.valtype = 3;
    v.u.longval = 1234567890;

    switch (v.valtype) {
    case 3:
        printf("%ld\n", v.u.longval);
        break;
    default:
        printf("not implemented yet\n");
        break;
    }
    return 0;
}
おそらく、こういった、データの中身に何が入ってもよいような構造を作りたい場合に union を使うことがあるかもしれない。 もちろん、ベタに、
typedef struct {
     int valtype; // 1=charval, 2=intval, 3=longval、 4=doubleval
     struct {
         char charval;
         int intval;
         long longval;
         double doubleval;
     } s;
} variant_t;
とか、
typedef struct {
     int valtype; // 1=charval, 2=intval, 3=longval、 4=doubleval
     char charval;
     int intval;
     long longval;
     double doubleval;
} variant_t;
でもよいのだが、不要なメモリを確保してしまうことになるので、通信など、サイズに制約があるようなデータは、union のようなデータ構造になっているだろう。

ビットフィールド

組み込み用のマイコンでは、ある領域を、バイト単位でもビット単位でもアクセスしたい場合があり、そういった場合に union を使うことも多い。
#include <stdio.h>
#include <stdint.h>

typedef union {
    struct {
        unsigned int b7: 1;
        unsigned int b6: 1;
        unsigned int b5: 1;
        unsigned int b4: 1;
        unsigned int b3: 1;
        unsigned int b2: 1;
        unsigned int b1: 1;
        unsigned int b0: 1;
     } bit;
     uint8_t byte;
} reg_t;

int
main(int argc, char *argv[])
{
    reg_t reg;

    reg.byte = 0xaa;

    // ベタでごめん
    printf("%d ", reg.bit.b7);
    printf("%d ", reg.bit.b6);
    printf("%d ", reg.bit.b5);
    printf("%d ", reg.bit.b4);
    printf("%d ", reg.bit.b3);
    printf("%d ", reg.bit.b2);
    printf("%d ", reg.bit.b1);
    printf("%d\n", reg.bit.b0);

    return 0;
}

... 続きを読む

構造体

未だに構造体に関する検索が多いようなので、少し書いてみようと思う。 他のサイトにも解説があるので、初学者の頃、自分がわかりづらかった点について書いてみようと思う。

構造体とは

複数の変数をひとまとめにして扱うようにしたもの。 例えば、座標のように (x,y) をまとめて扱えると便利だろう。
struct 構造体タグ名 {
     型 変数; // メンバ変数と言う
      :
};
のように宣言する。 例1:構造体の場合
// 実際に変数が割り当てられるわけではない。
struct point_st {
    int x;
    int y;
};

int
main(int argc, char *argv[])
{
    struct point_st point;

    point.x = 10; // 構造体のメンバ変数にアクセスする時は、"." を使う。
    point.y = 20;

    return 0;
}
例2:構造体へのポインタの場合
#include <stdlib.h>
struct point_st {
    int x;
    int y;
};

int
main(int argc, char *argv[])
{
    struct point_st *pointp = (struct point_st *)malloc(sizeof(struct point_st));

    // 構造体へのポインタの場合、->(アロー演算子と呼ばれているようだ)でアクセスする。
    pointp->x = 10;
    pointp->y = 20;

    return 0;
}

わかりづらかった点

色々な書式があってわかりづらい。

以下は同じものだ。 パターン1:
struct point_st {
    int x;
    int y;

    return 0;
};

struct point_st point;
パターン2:
typedef struct point_st {
    int x;
    int y;
} point_t;

point_t point;
パターン3 (タグ名省略):
typedef struct {
    int x;
    int y;
} point_t;
struct 〜 と書くのは、タイプ量も多いし、長くて読みづらいので、私は、パターン3をよく使う。

構造体自身へのポインタを含む場合の書き方がわからない。

リスト構造を作る場合に、構造体自身へのポインタを示す場合の書き方。 パターン1:
struct point_st {
    int x;
    int y;
    struct point_st *next;
};

int main(int argc, char *argv[])
{
    struct point_st *point1p;
    struct point_st *point2p;

    point1p = (struct point_st*)malloc(sizeof(struct point_st));
    memset(point1p, 0, sizeof(struct point_st));
    point1p->x = 1;
    point1p->y = 2;
    point1p->next = NULL;
    point2p = (struct point_st*)malloc(sizeof(struct point_st));
    memset(point2p, 0, sizeof(struct point_st));
    point2p->x = 3;
    point2p->y = 4;
    point2p->next = point1p;
    return 0;
}
パターン2:
typedef struct point_st {
    int x;
    int y;
    struct point_st *next;
} point_t;

int main(int argc, char *argv[])
{
    point_t *point1p;
    point_t *point2p;

    point1p = (struct point_st*)malloc(sizeof(struct point_st));
    memset(point1p, 0, sizeof(struct point_st));
    point1p->x = 1;
    point1p->y = 2;
    point1p->next = NULL;
    point2p = (struct point_st*)malloc(sizeof(struct point_st));
    memset(point2p, 0, sizeof(struct point_st));
    point2p->x = 3;
    point2p->y = 4;
    point2p->next = point1p;
    return 0;
}
同様に、読みやすさから、パターン2を使う。

構造体をどのようにして関数に渡すのかわからない

この構造体を他の関数にどのように渡すべきなのか。
#include <stdio.h>

typedef struct {
    double x;
    double y;
} point_t;

void
print_point(point_t point)
{
    printf("%f,%f\n", point.x, point.y);
}

int
main(int argc, char *argv[])
{
    point_t point;

    point.x = 123.4;
    point.y = 456.7;
    print_point(point);
    return 0;
}
としたいかもしれない。(まあ、これでも動く。) しかし、C 言語の場合は、引数はコピーされて渡される。(値渡し) 構造体は複数の変数を束ねておりサイズが大きく、 コピー時間は、小さなプログラムであれば問題ないが、処理の量が多いと、かなりの時間になる。 そのため、通常はポインタ(=構造体の先頭アドレス)を渡すことが多いと思う。
#include <stdio.h>

typedef struct {
    double x;
    double y;
} point_t;

void
print_point(point_t *pointp)
{
    printf("%f,%f\n", pointp->x, pointp->y);
}

int
main(int argc, char *argv[])
{
    point_t point;

    point.x = 123.4;
    point.y = 456.7;
    print_point(&point);
    return 0;
}

リターン値を構造体にしたい場合はどうするのか

#include <stdio.h>

typedef struct {
    double x;
    double y;
} point_t;

void
print_point(point_t *pointp)
{
    printf("%f,%f\n", pointp->x, pointp->y);
}

point_t
xy_point(double x, double y)
{
    point_t point;
    point.x = x;
    point.y = y;
    return point;
}

int
main(int argc, char *argv[])
{
    point_t point;

    point = xy_point(123.456, 789.123);
    print_point(&point);
    return 0;
}
としたいかもしれない。昔はコンパイルエラーだった。(と思う) 構造体をリターンすることができなかった。 今はコピーされてリターンするようだ。 昔ながらのやりかただと以下のようになる。
#include <stdio.h>

typedef struct {
    double x;
    double y;
} point_t;

void
print_point(point_t *pointp)
{
    printf("%f,%f\n", pointp->x, pointp->y);
}

void
xy_point(double x, double y, point_t *ret)
{
    point_t point;
    ret->x = x;
    ret->y = y;
}

int
main(int argc, char *argv[])
{
    point_t point;

    // point にリターン値を入れてもらうため、構造体へのポインタを渡す
    xy_point(123.456, 789.123, &point);
    print_point(&point);
    return 0;
}
どのようにコンパイルされるか見たことがないので確信が無いが、 構造体自身をリターンできるのであれば、前者の方法でも良いかもしれない。... 続きを読む

malloc の使い方(malloc/free/memset)

この難しいテーマを自分はうまく説明できるだろうか。

C 言語を使うには

以下のいずれかの環境があれば試すことができる。
  • mac に xcode をインストールしている。
  • windows に cygwin(およびgcc) をインストールしている。
  • Linux か FreeBSD をインストールして、Cコンパイラをインストールしている。

malloc とは

malloc は標準で用意されているライブラリだ。 メモリの確保(解放)を行う。 コマンドラインから man malloc と打つと使い方が表示される。Mac の場合次のような感じで表示される。
NAME
calloc, free, malloc, realloc, reallocf, valloc -- memory allocation

使い方

ポインタ = malloc(バイト数);
とコールすると、バイト数分のメモリが確保され、確保したメモリへのポインタが返る。 確保したメモリは、
free(ポインタ);
をコールするまで解放されない。 確保したメモリは初期化されないので、通常は、
memset(ポインタ, 0, バイト数);
のようにして 0 で初期化する。(string.h の include が必要) 文字列の終端が \0(=0) だったり、NULL ポインタ(=0) が データの末尾を表していることが多いため、0 で初期化することが 多いだろう。

指定した数のデータ

実行時に毎回データ数が変わるような場合、malloc でデータ数分のメモリを確保することになるだろう。 int の場合
int n = 100;

int *intp = (int*)malloc(sizeof(int) * n); // int 100個分のデータ領域
memset(intp, 0, sizeof(int) * n);

*(intp + 10) = 123;
intp[10] = 123; // 上と同じ。こちらのほうがわかりやすいと思う。

// コンパイルエラーにはならないが、C 言語では何もチェックしないので
// 異常な動作になる。
*(intp + 1000) = 123;
intp[1000] = 123;
char の場合
int n = 100;

char *strp = (char*)malloc(n); // 100文字分のデータ領域
memset(strp, 0, n);

// example 1
strcpy(strp, "hogehoge");

// example 2
*(strp + 30) = 'a';
strp[30] = 'a'; // 上と同じ

// C 言語では確保したメモリを越えようがコピーするので、
// 異常な動作になる。
strcpy(strp, 100文字を超える文字列へのポインタ);

いわゆるリスト

C 言語でリスト(追加削除のできるデータ構造)を扱おうとするとmalloc を使ってリスト構造を作る必要があるだろう。
typedef struct node_st {
int v;
struct node_st *next;
} node_t;
と宣言されているとして、node_t を一つ分確保する場合。
node_t *nodep = (node_t*)malloc(sizeof(node_t));
memset(nodep, 0, sizeof(node_t));
nodep->v = 123;
nodep->next = NULL; // いちおう初期化

prev_nodep = 前の要素を検索するルーチン();
prev_nodep->next = nodep;
nodep->next = NULL;

ちなみにリストを扱う場合は、man queue にあるようなマクロを使うことができる。 以下のようなリストがある。
  • 単方向リスト SLIST
  • 単方向TAILIQ STAILQ
  • 双方向リスト LIST
  • 双方向TAILQ TAILQ
TAILQ は末尾の要素へのアクセスが速い。 単方向は先頭から末尾へのアクセスのみで、双方向はあるノードの前後のノードへのアクセスができる。 という違いがある。(双方向のほうがデータサイズは大きくなる)... 続きを読む

インターネット接続サービス(プロバイダ)が多すぎて選ぶのに悩む

インターネットプロバイダを選ぶのに、あまりに選択肢が多く、スマホや電話などとの組み合わせ、その他諸々の条件が多すぎて、私は、本当に選ぶのに悩んでしまった。 価格.com で比較するにしても、結局は時間がかかってうんざりしてくるし・・・ 悩んだ末選んだのは、次のサービス。(UQwimax) novas Home+CA 速度制限がきついのは嫌なので、ギガ放題プラン(2年)だ。 もう、10年以上固定電話は使っておらず、無くても別に支障はないので、回線を選ぶ時は wimax でもよかった。(スマホがあるので固定回線代は無駄。) ルータが届けば即使えて、光回線のように工事に立ち合ったりするのが不要なのは良いと思った。 また、引越しや、事務所の移転などの際、どこにでも持っていけるというのがメリットだろう。 元々、NAS(ネットワークハードディスク)を接続したかったのでこのルータを選んだ。このルータにはLAN端子が付いているからだ。「元々」と書いたのは、今はほとんどのデータを google drive / サーバ / AWS S3 などに置くようにしたので、必要なくなってしまったからだ。 このルータの場合、下り最大 220Mbps。wimax の 提供エリアや、電波状況によって変わる。 速度制限としては、3日間で10GB以上になると制限がかかり通信が遲くなる。翌日18時頃から翌々日2時頃まで制限ということなので、実質は翌日の夜間だけ制限される、ということだろう。スマホの速度制限よりかなり緩い。10GB というのは、youtube で 720p の解像度の動画を見た場合、max 4Mbps(*1) ≒ 400KB/s なので、割り算すると、ほぼ 7 時間相当分ということになろうか。 もし、インターネット接続サービスをお探し中であれば、ご参考に。
(*1) ライブ エンコーダの設定、ビットレート、解像度より... 続きを読む

CSSが更新されたりされなかったりする現象

css を更新したのに、web サイトが更新されず、ctrl+f5 を押してもらったりすることがよくあり、今回もまた聞かれてしまった・・・ last-modified は付いているのに、何故、ie は css を取りにいってくれないのだろうと、しばらく(というか数年)放置したままだった。 改めて調べてみると、以下の記事を見つけた。 Web サーバー側でコンテンツを更新しても IE 上に反映されない (キャッシュのお話) 「IE9 以降の IE では、以下両方に該当する場合、更新確認も行わずにコンテンツをキャッシュから取得するようになっています。」以降に、どのような場合にキャッシュから取得するのかが書かれている。
有効期間 = (最終チェック日時 - 最終更新日時) * 0.1

つまり最終チェック日時と最終更新時間の差が大きい、つまり更新されていない期間が長いコンテンツは有効期間が長く設定され、クライアントからの更新確認の頻度が下がる仕組みです。
だそうだ。しばらくアクセスしてなかったら、ctrl+f5 押してね、ということか。なんとなく逆のような気もするが・・・ よろしければ、ご参考に。... 続きを読む

openssl で AES 暗号化したファイルを java で復号

android で暗号化したファイルを復号しようと思ったが、どのようにするか。 暗号化は、わざわざツールを作るのも面倒なので、openssl でよいかと考えた。 openssl java で検索すると以下のような記事が見つかる。 openssl enc -e -aes-128-cbc で暗号化したファイルの先頭には、Salted__ソルトが入るようだ。 これは、openssl の仕様で、Java の Cipher クラスには、そのようなインタフェースはない。 上記の記事ではそれらを実装しているのだと思うが、面倒だし、openssl 依存というのもなあ、と思った。 とりあえず、man enc してみた。たぶん、そうこうしている間に実装できただろうが。 興味深いオプションとしては、-P オプション、-S オプション、-nosalt オプション、-K、-iv オプションだろうか。
オプション 機能
-P オプション salt、key、iv を表示して終了する。
-S オプション salt を指定して暗号化する。
-nosalt salt を使わない。
-K、-iv -K で指定したキーと -iv で指定した initial vector を使う。
暗号化する時に、Key / iv を表示させて、それを Java の Cipher クラスに渡せばよい。 使用例:
$ openssl enc -aes-128-cbc -P 
enter aes-128-cbc encryption password:
Verifying - enter aes-128-cbc encryption password:
salt=E89360B042EFDBE0
key=35E38573AB84F2054BB8BCD8E5CD56EE
iv =382EA02910F2C2B5E2990846A30C169D
パスワードは hogehoge を入れてみた。実行毎に salt は変わるので、key/iv は変わる。もし、同じ salt を指定したければ、次のとおり。
$ openssl enc -aes-128-cbc -P -S E89360B042EFDBE0
enter aes-128-cbc encryption password:
Verifying - enter aes-128-cbc encryption password:
salt=E89360B042EFDBE0
key=35E38573AB84F2054BB8BCD8E5CD56EE
iv =382EA02910F2C2B5E2990846A30C169D
試しに salt を指定して暗号化したファイルの hexdump。
$ openssl enc -aes-128-cbc -S E89360B042EFDBE0 -in hoge.txt -out hoge.txt.enc
$ hexdump -C hoge.txt.enc 
00000000  53 61 6c 74 65 64 5f 5f  e8 93 60 b0 42 ef db e0  |Salted__..`.B...|
00000010  65 f6 60 7a 8f f7 e3 21  a3 b2 dd a1 5c a7 dd be  |e.`z...!....\...|
00000020
(-nosalt を使えば、Salted__ソルト、は出力されない。) もらったファイルから key / iv を表示する場合
$ openssl enc -d -aes-128-cbc -in hoge.txt.enc -P
enter aes-128-cbc decryption password:
salt=E89360B042EFDBE0
key=35E38573AB84F2054BB8BCD8E5CD56EE
iv =382EA02910F2C2B5E2990846A30C169D
ソルトの部分を削れば復号できるのか。
$ dd if=hoge.txt.enc of=hoge.txt.enc.nosalt bs=1 skip=16
16+0 records in
16+0 records out
16 bytes transferred in 0.000732 secs (21860 bytes/sec)
$ hexdump -C hoge.txt.enc.nosalt 
00000000  65 f6 60 7a 8f f7 e3 21  a3 b2 dd a1 5c a7 dd be  |e.`z...!....\...|
00000010
$ openssl enc -d -aes-128-cbc -in hoge.txt.enc.nosalt -K 35E38573AB84F2054BB8BCD8E5CD56EE -iv 382EA02910F2C2B5E2990846A30C169D
$ openssl enc -d -aes-128-cbc -in hoge.txt.enc.nosalt -K 35E38573AB84F2054BB8BCD8E5CD56EE -iv 382EA02910F2C2B5E2990846A30C169D
hogehoge
Java Cipher を使って復号する場合
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding"); // openssl は PKCS5Padding で暗号化する
Key k = new SecretKeySpec(key, "AES"); // key は byte 配列
IvParameterSpec p = new IvParameterSpec(iv); // iv は byte 配列
c.init(Cipher.DECRYPT_MODE, k, p);
byte[] ret = c.doFinal(buf); // buf は byte 配列 (Salted__ソルトは削るか-nosaltで出力させない)
... 続きを読む

Android 用 epub リーダーで表示の速いものを探してみた

2018/9/20 現在: Calibre で作った epub ドキュメント(飲食店のメニューだが)を Android のタブレットで表示させているが、ページの表示に時間がかかるので、表示速度が速いものがないか探した。 Google play で表示される上から順番に評価。(かなりの数がある・・・) [toc]

Lithium: EPUB Reader (今使っているもの)

ダウンロード数 100万 評価 4.6 ファイル形式 EPUB のみ? 速度 △
  • 広告が表示されず気にいっていたが、ページの表示に時間がかかる。

Reasily – EPUB Reader (新たに使おうと思ったもの)

ダウンロード数 1万 評価 4.6 ファイル形式 EPUB のみ? 速度 ◯
  • 全画面表示にもできるが、メニューを上部に出せるので、操作がわかりやすい。
  • 詳細設定メニューがわかりやすい。英語だが。(スワイプして目次を表示するオプションを off にしたり、画像をタップして拡大するのを off にしたりするのが簡単にできる。)
  • 広告表示なし。

Moon+ Reader

ダウンロード数 1000万 評価 4.4 ファイル形式 epub,pdf,mobi,chm,cbr,cbz,umd,fb2,txt,html.rar,zip,OPDS 速度 ◯
  • メニューをどうやって出してよいのかわかりづらい。

Copper Reader

ダウンロード数 1万 評価 3.0 ファイル形式 EPUB ? 表示速度 ×
  • 全体的に反応が遅い。

高速PDF EPUB リーダー

ダウンロード数 1万 評価 4.1 ファイル形式 PDF,EPUB,XPS,CBZ,JPEG,TIFF 表示速度 ?
  • EPUB をダウンロードフォルダから取り込めず評価できず。

ReadEra – free ebook reader (なかなか良い)

ダウンロード数 100万 評価 4.8 ファイル形式 EPUB,PDF,DOC,RTF,TXT,DJVU,FB2,MOBI,CHM 表示速度 ◯
  • メニューは長押ししないと出てこないので操作に不慣れだとわかりづらいか。
  • 先頭に[TOC]を書いているが、その表示が意図したものと違う。

ePub Reader for Android

ダウンロード数 100万 評価 3.6 ファイル形式 EPUB のみ? 表示速度 △
  • 反応が全体的に遅めか。

eBoox: Reader for fb2 epub zip books (なかなか良い)

ダウンロード数 10万 評価 4.9 ファイル形式 fb2,epub,doc,docx,mobi,prc,txt,rtf,odt,html,cbr,cbz 表示速度 ◯
  • メニューが出しづらい。
  • epubの作り方に問題がある可能性もあるが、レイアウトが少しずれ気味か。

PocketBook Reader

ダウンロード数 100万 評価 4.3 表示速度 ?
  • 漢字が化けるので評価の対象外

電子ブックリーダー&フリーの ePub 書籍

ダウンロード数 500万 評価 4.2
  • 漢字が化けるので評価の対象外

EPUB Reader (Michael Volz)

ダウンロード数 10万 評価 3.8 ファイル形式 EPUB (HTML5 based ebook) 表示速度 ×

eBooka Reader

ダウンロード数 5万 評価 4.2 ファイル形式 PDF,EPUB,EPUB3,MOBI,DJVU,FB2,FB2.zip,TXT,RTF,AZW,AZW3,PRC,HTML,CBZ,XPS,MHT 表示速度 △
  • 色々できる感じはするが、いまいちメニューがわかりづらい。

Gitden Reader: EPUB3 & EPUB2

ダウンロード数 10万 評価 4.2 ファイル形式 EPUB,EPUB3? 表示速度 ×
  • 横書きを意図していたが、表示すると縦書きになって使えず。(どこかに設定があるかもしれない)

ePUB EBook Reader Skoob

ダウンロード数 50万 評価 4.3 ファイル形式 EPUB2,EPUB3 ? 表示速度 × あまりに多いので、このあたりで評価終了。
使用した端末は ZenPad 8。 どのくらいの大きさか知りたい時はzenpad 8.0 の大きさも参考に。 キッズモードを使えば、アプリの起動を制限できるので、飲食店のメニューなどに活用できる。... 続きを読む

WEBサイトやtwitterのアクセスを増やしたい

Googleが言うように良質のコンテンツを作れば WEB サイトが見られるようになるのだろうか。また、twitter でも良質な情報を発信していれば、フォロワーが増えるのだろうか。 自分の投稿に魅力がないのかもしれないが、そうそう WEB サイトの投稿がシェアされることもないし、twitter でも相当共感を覚えない限り「いいね」止まり、というのが実感だ。 広告なんて打ってもしかたないと思っていたが、今は、WEB を検索するより、twitter で流れてくる情報を取捨選択する人のほうが多いのではないかと思い、twitter のプロモツイートを使ってみた。オートプロモートだと月1万円ほどだから、会社の宣伝広告費としては、結構お得なように思う。 1回つぶやくと約10000回ほど表示されているようだが、そのうちの、1人ぐらいはフォロワーになってくれるように思う。別の飲食店のサイトでも試しているが同じようだ。そちらのサイトは1ヶ月で30人程フォロワーが増えた。(小さい話だが・・・) プロモーションが流れてきてうっとおしいかな、と思っていたが、意外にもフォロワーが増えて、意欲が沸いてくる。 同じような悩みを抱えている方は試してみてはどうだろう。... 続きを読む

AWS Linux (CentOS 6) で PV を HVM に変換

数年前に AWS の EC2 で構築した CentOS 6 システムの話。 その CentOS 6 は準仮想化(PV) AMI であり、t2 や m4 など、コストパフォーマンスの高い現行世代のインスタンスにインスタンスタイプを変更できない。 そこで PV から HVM に変換しようと思い調べてみると、AWS に公式のドキュメントがあった。 しかし、そのとおりにやってもうまくいかなかったので、別の方法を考えた。

概要

AWS に記載の方法は、PV マシンのディスクを別の EC2 にアタッチして、新規に作成したディスクに dd で msdos パーティション 1 にコピーし、そのディスクにブートローダーをインストールする、ということだ。 しかし、そもそも、元のイメージがマーケットプレースのイメージから起動したものの場合、別の EC2 インスタンスにマウントできない。インスタンスへの Amazon EBS ボリュームのアタッチにある、「ボリューム上に存在する AWS Marketplace コードをサブスクライブしている必要があります。」の条件を満たしていないためであろう。 代替手段として、起動させた PV イメージを、dump / restore を使って新しいディスクにコピーし、その新しいディスクを別の EC2 インスタンスにマウントしてブートローダをインストールする。 新しく作る HVM インスタンスは、CentOS 6 の場合は、t3 インスタンスだとブートローダのインストールに失敗するし、起動もしない。(centos.org 提供のものも起動しない)。t2 インスタンスであれば、ブートローダのインストールに成功し、起動も OK である。

(多少雑な)手順

1.PV インスタンスを起動する 2.新規にボリュームを生成し、PV インスタンスにアタッチする。 3.lsblk などでデバイスファイル名を確認する。(/dev/xvdg など) 4.以下を実行する。(デバイスファイル名は、読者の環境に合わせること)
parted /dev/xvdf --script 'mklabel msdos mkpart primary 1M -1s print quit'
partprobe /dev/xvdf
udevadm settle
mkfs -t ext4 /dev/xvdf1
e2label /dev/xvdf1 /
mount /dev/xvdf1 /mnt
cd /mnt
dump 0uf - | restore rf -
cd /
umount /mnt
dump / restore は一般には single user mode で実行するとは思うが、できないので、不要なプロセスを止めて実行する。 5.ボリュームを PV インスタンスからデタッチする。 6.新規に EC2 インスタンスを起動する。Amazon Linux で t2.micro など。(CentOS なら Amazon Linux 2 でないほうがよいか) 7.ボリュームをアタッチする。 8.lsblk などでデバイスファイル名を確認する。(/dev/xvdf など) 9.以下を実行する。別の VPC でコピーした場合などは、/etc/resolv.conf を調整しておくこと。パッケージの取得に失敗する。
mount /dev/xvdf1 /mnt/ && mount -o bind /dev/ /mnt/dev && mount -o bind /sys /mnt/sys && mount -o bind /proc /mnt/proc
chroot /mnt
yum install grub -y
rm -f /boot/grub/*stage* /boot/grub/device.map
grub-install /dev/xvdf
cat <<EOF | grub --batch
device (hd0) /dev/xvdf
root (hd0,0)
setup (hd0)
EOF
10.vi で /etc/grub.conf を開いて編集。 root (hd0) を root (hd0,0) に、kernel 〜 の root=〜 を root=LABEL=/ に変更。 11.umount してインスタンスを一度停止
umount /mnt/sys
umount /mnt/proc
umount /mnt/dev
umount /mnt
shutdown -h now
12.HVM インスタンスのボリュームを両方デタッチする。 13.コピー先ボリュームをアタッチ。この時、デバイス名には、xvda を入力する。(いかにも指定できなさそうだが。) 14.インスタンスタイプを t2.medium に設定して再起動 (t3 では起動しない。m4 ではカーネルバージョンを上げないと起動はするが ssh ログインできない) 15.起動したら、yum update してカーネルを最新にする。/boot/grub/grub.conf の kernel、initrd には、/boot 下にある最新のものをセットする。 16.再起動
kernel バージョンによるのか、インスタンスタイプによっては動作しない。centos.org 提供の HVM イメージで動作しない(選択できない)ものは、おそらく動作しない。 結構罠が多かった。 ネット上の情報を元にトライしてみたがうまくいかなかった、という方がいるかどうかわからないが、お試しを。... 続きを読む

Linux shell (bash) のコマンド履歴(ヒストリー)のたどりかた

Linux のコマンド履歴、カーソルの上下で表示させているのを良くみかけるが、もっと素早く検索、移動、編集する方法。
キー 動作
CTRL+R 上に検索(Reverse incremental search) CTRL+C か CTRL+G で中断
CTRL+N カーソルの下と同じ(Next)
CTRL+P カーソルの上と同じ(Previous)
CTRL+F カーソルの右と同じ(Forward)
CTRL+B カーソルの左と同じ(Backward)
CTRL+D 一文字削除(Delete)
CTRL+H Backspaceと同じ
CTRL+K 行末まで削除(kill)
CTRL+Y CTRL+K で削除した内容をペースト(yank)
CTRL+A 行の先頭に移動
CTRL+E 行の末尾に移動(end)
emacs というテキストエディタから派生したものだと思うが、機能名とキーが対応づいているのでそれさえ知っていれば覚えやすいとは思う。... 続きを読む

Mac の入力欄でのキー操作

Mac でテキストを入力する欄、例えば、ブラウザのアドレス入力欄や、テキスト入力欄で、カーソル移動する時、カーソルキー(上下左右のキー)をお使いだろうか? 今頃になって知ったのだが、コントロールキーと何かのキーを一緒に押すと移動などができる。
キー 動作
CTRL+F カーソルの右と同じ(Forward)
CTRL+B カーソルの左と同じ(Backward)
CTRL+N カーソルの下と同じ(Next)
CTRL+P カーソルの上と同じ(Previous)
CTRL+D 一文字削除(Delete)
CTRL+H Backspaceと同じ
CTRL+K 行末まで削除
CTRL+Y CTRL+K で削除した内容をペースト
CTRL+A 行の先頭に移動
CTRL+E 行の末尾に移動
Macのキーボードショートカット に書いてある。 linux shell (bash) のヒストリ機能も同様なので、カーソルまで手を伸ばすのがうっとおしい人は、これぐらいは覚えておいて損はないと思う。... 続きを読む

アマゾンのすごいルール

アマゾンのすごいルールという本に書いてあったこと。 企画書は、1ページ、または、6ページで文章で作成するとのこと。パワーポイントは使用禁止。 後で見返して思い出せるよう、文章で書くそうな。確かにパワーポイント資料をもらっても、何を書いてあるのかさっぱりわからない。 ページ数については、私も、新人の頃、簡潔にまとめるよう指導された。上司に時間がないので。ビジネス文書は、起承転結ではなく、起結承で書け、ということだっと思う。 自分の中で、パワーポイント資料読んでも何もわからない、と思っていたから目にとまったのかもしれない。... 続きを読む

CSV(TSV)からSQLを作る

私は、シェルスクリプトではやりづらいと思うものは、pythonで作ることが多い。 今回は、タブ区切りファイルから SQL 文を出力してみた。 今、保守しているシステムでテーブル構造自体をテーブルに定義するものがある。 例えば、
フィールド名 フィールドタイプ 最小値 最大値
名前 全角 1 10
といった類の定義をDBテーブル自体に行うというもの。 追加しかできない上に定義の時は、WEB からいちいち手入力する必要があるし、複数のDBテーブルに設定する必要がある。えらく時間がかかってめんどくさい。 なんだこれ、とブツブツ言いながら、CSV から SQL を生成するスクリプトを作ることにした。DB に接続して直接DBに登録することもできるだろうが、そこまで時間をかけるのも無駄なので、SQL を print するものにとどめた。 詳しい部分は書けないが、次のようなコード。(python3用) テーブル定義は excel で作られているので、定義部分をコピーしてテキストエディタに貼る。そうすると、タブ区切りになるので、そのファイルを保存して、第3引数で渡す。
import sys
import csv

table_id = int(sys.argv[1])
table_name = sys.argv[2]
table_def = sys.argv[3]

def get_field_type(s):
    if s == '文字(全角・半角)':
        return 0
    elif s == '全角':
        return 1
    elif s == '全角カナ':
        return 2
    elif s == '半角':
        return 3
    else:
        raise Exception

def get_field_length(s):
    if s == '-':
        return "0"
    else:
        return str(int(s))

with open(table_def, newline='', encoding='cp932') as csvfile:
    reader = csv.reader(csvfile, delimiter='\t')
    for row in reader:
        field_id = int(row[0])
        field_name = row[1]
        field_type = get_field_type(row[2])
        sql = """insert into meta_fields (table_id, field_id, field_name, field_type) values({}, {}, '{}', {});"""
        print(sql.format(table_id, field_id, field_name, field_type))
            :
        他にも必要な insert 文を print

設計もこのスクリプトもしょうもないと苦笑してしまう・・・... 続きを読む

Twitter でクリックされるのはどの程度なのか

WEB サイトを作ってもそうそう見られるものでもないと、つくづく感じているが、Twitter の場合はどうなのだろう。 そもそも、フォロワーを増やすには権威ある人、カリスマのある人、友達の多い人でないと難しく、リツイートも相当共感を呼ぶものでないとリツイート、いいね、されない。そこで、Twitter の広告機能を使ってみてはどうかと考えた。 通常広告だと、指定したツイートが設定した金額分だけばらまかれる。 オートプロモートだと、ツイートする度にばらまかれるのだと思うが、何日分か見た感じでは、日に2000程度のインプレッションが得られるようにばらまかれていた。 詳細を表示したり、プロフィールを表示したり、写真を表示したりするのをエンゲージメントと呼ぶようであるが、おおまかには、オートプロモートの2000インプレッションのうち、エンゲージメントはテキストだけの場合で20件前後、写真も含む場合は200件弱のようだ。意外だったが、プロモツイートのほうがエンゲージメント率が高い。 自分が3回ほど試した範囲では、プロモート内容によって大きく変わるものではなく、エンゲージメント率は1〜3%程度のようである。写真が入ると10%程度まで上がることもあった。知名度が高い場合はエンゲージメント率も上がる可能性もある。 マーケティングの数字として、どこかで1/1000というのを聞いたような記憶があるのだが、興味あって見てくれた人が商品を買ってくれたり、来店してくれたりするのは、エンゲージメントした内のさらに何%かだろうから、0.1%というのは、データと合っているように思う。 お客さんの数が伸びない、といった場合に、Twitter広告、Facebook広告、Instagram広告などを活用してみるのもいいと思う。... 続きを読む

Google で検索されるようになるまでにどの程度かかるのか

現在、2018/8/21 3:10。 site:URL の一覧に出るまでにどの程度かかるのだろうか。 現在、2018/8/22 9:54。 site:URL の一覧に表示されるようになった。(検索にもヒットする。) このサイトだと 1 日程度。 ahrefs でのこのサイトのランクは 38M (3800万番目) なので、ahrefs ランキングとは無関係ということか。 3ヶ月ほど前に作った個人ブログなど、新規の記事を登録し、sitemapを再送信しても、なかなかインデックスに登録されない。(3日程度か?)... 続きを読む

商用サービス

出先のネットワークに接続している時、その出先機関で通信は覗き見られてはいないだろうか? SSLなら安全だろうか? SSL でも DNS の記録を取り、特定のサイトへは接続できないかもしれない。 また、海外から日本国内の動画を見たり、逆に日本国内から海外のコンテンツを見たりする時に VPN が必要となることもある。 そんな心配がある人は、アバスト セキュアラインVPNといったVPN サービスを利用してみてはどうだろうか。 自分で構築する場合は、IPSEC IKEv2 による VPN 構築方法メモ for mac/windows/androidも参考に。... 続きを読む

C言語を学ぶべきかどうか

ahrefsでC言語に関する検索上位のページを調べてみると、C言語をおすすめしない理由などが挙がっている。 初学者が、ということかもしれないが、そんな記事が google の上位に来てアクセスが集まるのはとても悲しいので、C言語について少し書いてみようと思う。 典型的には、言語的なものについて考えるならば、
  1. 組み込み系
    • アセンブラ
    • C言語
  2. WEBサイト
    • HTML/CSS/Javascript
    • PHP or Java or Ruby
    • DB(SQL)
  3. スマートフォンアプリ
    • HTML/CSS/Javascript
    • ネイティブアプリの場合は、Swift(ios)/Java or Kotlin(android)
  4. データサイエンス
    • Python
  5. デスクトップアプリ
    • .net
といった感じだろうか。 実際には、これに加えて、設計、テストが必要になる。これに加えて、ネットワークやサーバOSに関する知識があれば、運用までカバーできるのではないかと思う。 自分でシステムを考えるというのでなければ、狙っている業界に合ったものが必要だろうと思う。おそらく、ロボット・車載・ドローンといった機械の制御、OS、WEBサーバ(apacheなど)、DBサーバなど、速度が求められるものはC言語かそれに近いものだろうし、WEBアプリ、スマートフォンアプリなどのように機能に柔軟性が求められるものはC言語には苦手かもしれない。 自分の興味のある分野に応じて言語を選択すべきだと思うが、C言語はビジネスにならないから選ぶべきではないという意見には、C言語の案件はまだ相当数あるし、単価もそう悪くないよと言いたい。 初学者が学ぶべきかどうか・・・車やロボットを制御したいと思うのであれば最初から学ぶべきだと思う。単にソフトウェアで何ができるのかを学びたいだけならば、python か node.js(javascript) をおすすめする。 C言語は難しいだろうか・・・・自分も多少つまづいた点はあったが、それは、別の記事にでも書いてみたいと思う。... 続きを読む

動的IPアドレスに対するWEBサイトのアクセス制限方法

取引先の担当の方から「動的IPのようでコロコロIPアドレスが変わるのですが、(WEBアプリ管理者用)WEBサイトにアクセス制限かけられますか?」と聞かれた。 使っているのは、apache 2.2 / linux / aws ec2。 いくつか方法があると思う。

apache で動的IPアドレスの場合だけ Basic/Digest 認証を追加する

複雑な設定が不要で、パスワードを推測しづらいものにし、定期的に変更するのであれば、現実的ではないかと思う。
<Directory /home/test>
order allow,deny
allow from 許可するIPアドレス
AuthType Basic
AuthName "Restricted Resource"
AuthUserFile /etc/httpd/htpasswd
Require valid-user
Satisfy any
</Directory>
Satify any なので、allow か require かどちらかが使われる。 apache 2.2 satisfy directive

VPN を使って IP アドレスを固定化する

組織の情報システム部門が禁止していない場合に限る。 500/udp、4500/udp が通る環境であれば、 固定 IP アドレスの IKEv2 VPN サーバに VPN 接続して、VPN サーバからのアクセスを apache で許可する。 500/udp、4500/udp は通らないが、openvpn のインストールが許されるのであれば、固定 IP アドレスの openvpn サーバに VPN 接続して、VPN サーバからのアクセスを apache で許可する。

クライアント証明書を使う

サーバ側、クライアント側ともややめんどう。 apache 2.2 Client Authentication and Access Controlより引用 apache の設定に以下を追加
SSLVerifyClient require
SSLVerifyDepth 1
SSLCACertificateFile conf/ssl.crt/ca.crt
... 続きを読む

python学習法

研究や、仕事上必要に迫られてこのページに辿りつかれた場合、python にはよくできたチュートリアルがあるので、試してみてほしい。 これと、ライブラリリファレンスがあればある程度のことはできる。 塾に通う必要も本も必要ないし、私はそうした。 pythonに限らず、リファレンスには、言語やフレームワークを設計した人達の考えが詰まっているので、目次だけでも見たほうがよい。 また、WEB サーバを作りたいのであれば、django をおすすめする。こちらにもチュートリアルがある。 チュートリアルを試してみた後は(途中でやめてもいいと思うが)何でもよいから、テーマを決めて、小さなアプリを作ってみればよいと思う。日々めんどうだな、と思っていることを python で実行できるようにしてみるなどといったことが良いのではないかと思う。

インストール方法

公式な python をインストールしたい場合は、python.orgからダウンロードしてインストール。 データサイエンス関連の機能が必要な場合は anacondaなどをインストールしても良いと思う。... 続きを読む

一般的な用語と python ドキュメントとの対応表

探しにくいドキュメントについて。

一般的な用語から python ドキュメントを参照したい人向け。

制御構造

その他の制御フローツール(チュートリアル)を一読されたい。
while 文
プログラミングへの第一歩(チュートリアル)
if 文
if 文(チュートリアル)
for 文
for 文(チュートリアル)

データ構造

配列、リスト
配列という概念はなく(必要ないのだろう)、リストを使う。リスト型(チュートリアル)|リスト型(ライブラリリファレンス)
連想配列 / ハッシュ / マップ / 辞書
辞書と呼ぶことが多いか。辞書型(チュートリアル)|マッピング型(ライブラリリファレンス)
その他は、python の組み込み型 も参照。

探しにくい用語

丸括弧 () で囲まれたデータ
タプル。リストのような感じだが、変更できない。ドキュメントによると、「,」がタプルを作るため、丸括弧が必要なわけではない。タプルとシーケンス(チュートリアル) | タプル型(ライブラリリファレンス)
角括弧 [] の中に for が入っているデータ
内包表記(list comprehension)。リストの内包表記(チュートリアル)
配列の一部の切り出し
スライス。共通のシーケンス演算(チュートリアル)
... 続きを読む

pythonで開業

そんなふうにキーワードを認識するなら作ってやるわ、と思い作ったネタのページ。

実は改行したい(したくない)人

print で困っている場合

python3 ライブラリリファレンス print 改行したくなければ、end=”を付ける。 python 2.7 で print statement を使う場合は、通常は改行する。末尾に , を入れると改行しない。
print 'hogehoge'
print 'hogehoge',

ソースコード中で改行したい場合

elementtree の改行で困っている場合

PYTHON ELEMENTTREE 出力で改行

本当に開業したい人

思ったほど開発案件が多くないのでおすすめできない。 python にこだわらず、顧客ニーズに合った言語で対応できなければならない。 システムの応答速度、システムのサイズ(コストにかかわる)、開発・保守要員の調達性、既存開発資産の流用性など。... 続きを読む

wordpressの画像圧縮(画像サイズ縮小)-プラグインを使わず手動で

WEB サイトの表示速度を上げるため wordpress の画像をプラグインを使って圧縮しているかもしれない。 私は、次のような理由で手動で画像サイズを縮小することにした。 * プラグインだらけになってわけがわからない(プラグインは必要はものを最小限だけ入れたい) * プラグインがどのように動くかわからない(wordpressアプリで画像のアップロードに失敗したり) * 既にアップロードしているファイルをプラグインで(サイズ制限などなく)縮小できるかどうか不明

ImageMagick をインストール

Linux サーバ(CentOS 6)のほうは、
yum install ImageMagick
でインストール。 さくらのレンタルサーバ(スタンダード以上が必要)も使っているが、ssh でログイン。ImageMagick はインストールされているようだ。

メディアディレクトリに移動

cd ワードプレスディレクトリ/wp-content/uploads
など。

画像サイズの確認

find . -type f -exec identify {} \;
〜 JPEG 3096×5504 〜 などのように表示されているので、大きそうなファイルをリサイズする。目処は横幅600px前後か? または、ファイルサイズが 1M を超えているものを ls -l などでチェック。
find . -type f -ls
など。

画像圧縮

ミスった時に戻れるようファイルのバックアップを取っておく。
mogrify -resize 30% ファイル名
または、横幅を 600 px にしたい場合は、
mogiry -resize 600x ファイル名
とする。 mogify はファイルを変換して上書きするので気をつけよう。
それ以前に、アップロードする前に mogrify しておきたい。... 続きを読む

AWS WAF を検討しているが、マネージドルールとしてどれを選べばよいか

AWS を使って WEB アプリケーションを提供しているお客様からセキュリティ対策について相談があったので、AWS WAF について調査した。 WAF とは、Web Application Firewall の略で、アプリケーションの前段に設置して、あやしげなアクセスをブロックするというコンセプトのものである。AWS のサービスとして用意されているものが、AWS WAFである。 しかし、自分で AWS WAF を設定するのは、かなり困難なように思える。したがって、マネージドルールというものを調べた。 これは、AWSによると「セキュリティ専門家により管理されるルール」ということである。 さて、そのページの下のほうに「Managed Rules セラー」があるが、どれを選べばよいのか判断に困らないだろうか。 使ってみたわけではないので、説明書きから読み取れる範囲でしかないが、防御している範囲毎に並べなおしてみた。

OWASP TOP 10(最も重大なウェブアプリケーションリスクトップ10)から保護

OWASP TOP 10 リスト 保護している範囲は、page.4 / page.6 が参考になろう。

wordpress などの CMS システムを保護

BOT からの攻撃を保護

BOT – 脆弱性(バグなど)を突いてシステムに侵入し、感染をどんどん広げていくタイプのソフト – からの攻撃を保護。 BOTとは?(総務省ページ) ネットワーク上でしらみつぶしに開いているポートを探し、そのポートにバグを誘発するようなデータを注入してシステムに自分自身のコピーを侵入させて増殖させるような特徴があるため、そういったあやしげな動きを検出してガードすると想像する。

OWASP TOP 10 + BOT からの保護

IP Reputation

あやしげなIPアドレスからのアクセスから保護

CVE に公開されているような一般的な脆弱性から保護

CVE CVEとは

対応範囲不明確


予算によると思うが、OWASP TOP 10(例えば Fortinet) / OWASP TOP 10 + IP reputation / OWASP TOP 10 + BOT(例えば Fortinet の Complete OWASP Top 10 のほう) + IP reputation あたりの選択がよいのではないか。 開発者観点では、SQL injection やクロスサイトスクリプティング、CSRF は、WAF(こちらはWeb Application Frameworkの略)を使うので、起こりにくくなっているのではないかと思う。(コンセプトを理解して使っていればだが・・・) WAF(Web Application Framework)+WAF(Web Application Firewall)、それと昔ながらの Firewall でガードしたいものだ。 それと、専門家に頼む場合は、無くならなさそうな会社に頼むように。以前、セキュリティの会社を閉じて、お客さんに迷惑をかけてしまった者からのアドバイスです。 参考: AWS WAF AWS WAF の料金 AWSでWAFを導入する理由と最適な選択 by クラスメソッド... 続きを読む

WEBサイトのバックリンク獲得法

ahrefs を使って、自分の持っているサイトのランキングを見てみた。 ひどい。。。 良質なバックリンクを獲得できていないのでは、と思った。 ahrefs academy から辿ったと思うが、以下のガイドが参考になる。 The Noob Friendly Guide To Link Building 2016年時点だが、手法が列挙されている。 それぞれの手法に Effectiveness、Penalty risk、Link value、などが表示されており実用的だと思う。 英文が読めなければ、指標の高い手法名を google 検索してみると良いかもしれない。... 続きを読む

jekyll で作った github pages の posts にアドセンスの記事内広告を貼る

これも前の記事と同様にニーズがあるかどうかわからないが。。。
  1. github pages を作る作り方の参考。ここでは、minimal テーマを使用。
  2. _layouts ディレクトリを作り、mininal テーマの _layouts をコピーする。
  3. _layouts/posts.html を編集する。 {{contents}}の下あたりに広告コードを差し込む。
... 続きを読む

sphinx の html 出力にアドセンスの記事内広告を貼って github pages に上げてみる

そんなニーズがあるかどうかは知らないが。 _templates に layout.html をコピーして、記事の下に広告コードを挿入する。 例えば、[read the docs テーマ(sphinx_rtd_theme)[https://sphinx-rtd-theme.readthedocs.io/en/latest/] の場合。 lib/python3.6/site-packages/sphinx_rtd_theme/layout.html を _templates にコピーする。
<div itemprop="articleBody">
:
</div>
の下あたりに、
<div>
広告コード
</div>
のような感じで差し込む。 もう少しレイアウトの調整は必要かもしれないが、このような感じになる。 github pages 面白いな、という気分になってくる。... 続きを読む

さくらのレンタルサーバ(スタンダード)で python3.6 + django2.0 を動かす

さくらのレンタルサーバで、python で書いた web アプリを動かそうとすると、cgi を使うしかない。 django を cgi で動作させるスクリプトがあるのでそれを使ってみた。 シェルを使う必要があるので、スタンダードプラン以上が必要。さくらのレンタルサーバ、しばらくの間、使えるのはWEBサーバだけと誤解していたが、シェルもコンパイラも使えるので、普通にサーバとして使える。(ただし、FreeBSD) wsgi で動かしたほうが速いんだから、さくらインターネット使いたいのなら vps 借りればいいのでは? とは思うが、ちょっとしたことを試すのに、サーバー自体の設定をしなくてよいので。
  • 以下を参考に python3.6 をインストールする。
  • 以下を参考に django 諸々をインストールする。
試用・お申し込みはこちらから。 さくらのレンタルサーバ ビジネス ... 続きを読む

宝くじ、ロト6などの結果を取得する方法

みずほ銀行の宝くじやロト6などの結果を表示するページ。csv からデータを取って表に差し込まれるようになっていた。 全く公式な使い方ではないと思うが、以下 URL。

宝くじ

https://www.mizuhobank.co.jp/retail/takarakuji/tsujyo/kinki/csv/kinki.csv https://www.mizuhobank.co.jp/retail/takarakuji/tsujyo/zenkoku/csv/zenkoku.csv https://www.mizuhobank.co.jp/retail/takarakuji/tsujyo/tokyo/csv/tokyo.csv https://www.mizuhobank.co.jp/retail/takarakuji/tsujyo/chiiki/csv/chiiki.csv https://www.mizuhobank.co.jp/retail/takarakuji/tsujyo/kct/csv/kct.csv https://www.mizuhobank.co.jp/retail/takarakuji/tsujyo/nishinihon/csv/nishinihon.csv https://www.mizuhobank.co.jp/retail/takarakuji/tsujyo/jumbo/csv/jumbo.csv

mini loto (921-)

1- (20刻み) https://www.mizuhobank.co.jp/retail/takarakuji/loto/backnumber/loto0001.html 521- (20刻み) https://www.mizuhobank.co.jp/retail/takarakuji/loto/backnumber/detail.html?fromto=521_920&type=miniloto 921- https://www.mizuhobank.co.jp/retail/takarakuji/loto/miniloto/csv/A101NNNN.CSV

loto6

1- (20刻み) https://www.mizuhobank.co.jp/retail/takarakuji/loto/backnumber/loto60001.html 461- (20刻み) https://www.mizuhobank.co.jp/retail/takarakuji/loto/backnumber/detail.html?fromto=461_480&type=loto6 1170- https://www.mizuhobank.co.jp/retail/takarakuji/loto/loto6/csv/A102NNNN.CSV

loto7

1- (20刻み) https://www.mizuhobank.co.jp/retail/takarakuji/loto/backnumber/detail.html?fromto=1_20&type=loto7 211- https://www.mizuhobank.co.jp/retail/takarakuji/loto/loto7/csv/A103NNNN.CSV

numbers

1- (20刻み) https://www.mizuhobank.co.jp/retail/takarakuji/numbers/backnumber/num0001.html 2701- (20刻み) https://www.mizuhobank.co.jp/retail/takarakuji/numbers/backnumber/detail.html?fromto=2701_2720&type=numbers 4652- https://www.mizuhobank.co.jp/retail/takarakuji/numbers/csv/A100NNNN.CSV

bingo5

1-4 https://www.mizuhobank.co.jp/retail/takarakuji/bingo/backnumber/detail.html?fromto=1_4&type=bingo5 5- https://www.mizuhobank.co.jp/retail/takarakuji/bingo/bingo5/csv/A104NNNN.CSV... 続きを読む

WordPress サイトの応答速度を上げる

WEB サーバの速度を上げれば、多少は検索結果のランキングが上位になるのだろうか?と思い改善した点。
  1. 可能なら、php バージョンを 7 に上げる。
  2. サイドバーから使っていなさそうなウィジェットを削除する。twitter フォローボタンも外してしまった。
  3. 不要なプラグインを外す。
    • Google Analytics for WordPress は止めた。js が一個削れる。(Head, Footer and Post Injections で Analyltics コードを設定)
    • Jetpack は必要なものだけ ON にする。統計は analytics で取るので止める。画面下部に Debug というリンクがあるので、そこからモジュール一覧を表示して、統計を停止する。参考
    • 絵文字は使わないので、Disable Emojis プラグインをイントールする。
  4. 不要な広告を削除。
  5. WEBサーバやプラグインでキャッシュ設定したほうがいいかもしれないが、コンテンツを更新して css や js が反映されない、とかなりそうなので設定しない。(chrome の developer console で見てレスポンスに Etag が入っていればそのままにした。)
google chrome の developer console で network タブを見て、処理時間がかかっているようなプラグイン等を削除していった。 多少は改善したようである。... 続きを読む

8インチタブレット zenpad 8.0 の大きさ

下に敷いているのは、セブンイレブンで売っている A5 サイズのリングノート。ほぼA5サイズ(=A4の半分)手元に置くのに手頃な大きさ。 wifi だけでよければ、手頃な価格。 速度的にも申し分ない。 飲食店の一部のメニューを epub で電子ブックにしてテーブルに置いた。 電子ブックの作り方については、別記事に記載。... 続きを読む

飲食店での google 活用法

  • google マイビジネスに登録する。お客さんは検索すると、電話番号、地図、営業時間等を見ることができる。店舗側はインサイトでどのくらいのアクセスがあったか知ることができる。口コミなどに書かれた内容で業務を改善できる。
  • google drive (document/spreadsheet) で業務マニュアルやシフトの共有。
  • google photo で写真を管理。スタッフに撮影してもらった写真を google photo や google drive で受け渡し。
  • 買い物リストを google keep で管理。チェックリストを使えば買ったものを消したりできて便利。
どれも無料で使える。... 続きを読む

電子ブックを簡単に作る方法 — markdown から epub を作る

飲食店用のメニューをタブレットで作って欲しいと個人的な依頼があった。どんな料理?と、よく聞かれるので写真を見せたいということだった。ただ、注文までは必要なく、メニューブックのかわりということだ。

どのように表示させるか

とりあえず手持ちの端末は、iPad、kindle fire だったが追加で、ZenPad 8.0を購入して評価した。 google photo のアルバムを公開する、google document を公開する、WEBサイトに掲載する、など考えた。 しかし、お客さんが自由に触れる端末なので、セキュリティ上、使えるアプリを制限したい。 また、使えるアプリが制限されているほうが、スタッフさんやお客さんにもわかりやすいだろう。 そこで考えたのが、電子ブック(epub)化することだ。本と同じなので、メニューブックとほとんど同じ感じで扱えるだろう。 ZenPad には、キッズモードというのが付いており、起動できるアプリを制限することができるので、お客さんが使う時はキッズモードを有効にする。 電子ブックリーダーとして、ローカルの epub ファイルを読み出すことができ、広告も挿入されない Android 用の Lithium というアプリを使うこととした。

epub を作る

さて、epub ファイルを作る方法だが、iBooks Author、google document、calibreなどがある。 iBooks AUthor は、私には少し難しすぎるし、テキストの入力が煩雑に思えた。 google document はまあ使える。epub 出力して、さらに、calibre でカバーページなどを追加する。この方法で初期バージョンを作成した。写真の横幅を15cm程度に縮めておかないと、画像が次のページにはみだしてしまうようだった。その手間さえ面倒でなければ、割と誰でもできるのではないかと思う。今のところ、「美味しそう」と好評だ。 本題だが、さらにネット検索と試行錯誤をしてみたところ、calibre には markdown 形式のドキュメントを epub に変換する機能があった。markdown 形式のドキュメントと画像等を zip に圧縮して calibre に登録して変換するとよい。 この変換の結果できたファイルを bluetooth や、google drive などで端末に送ればよい。

markdown を使う時の注意点

google document を使う方法で悩まされた問題は、画像が ZenPad だと正しく表示されるが、スマートフォンだとはみ出て見えることだ。markdown もそのまま使うとそうなるのだが、html で書くこともできるので、画像を img タグで記述して width を % で指定するとどの端末でもうまく収まってくれるようだ。chrome 拡張の markdown preview plus などを入れておくとよいだろう。 改ページは、
<hr style="page-break-before:always;display:none;"/>
のように書くと calibre は改ページと認識するようで、そこでファイルが分割されている。 calibre ドキュメントの Replace scene breaks の項も参考。 先頭に
[TOC]
を入れておくと目次が生成されると同時にナビゲーション(というのかどうか知らないが、右端から左にスワイプすると表示されるメニュー)も生成されるようだ。calibre の書籍編集機能を使って目次ページを削除すれば、目次は消えるが、ナビゲーションは残るようである。 ビデオを入れることも可能なようだ。video タグが使える。ただし、ZenPad など Android 端末の場合は mp4 から webm 形式に変換しておく必要がある。video タグは以下のように。
<video controls>
  <source src="movie/tmrz-1518447087.webm" type="video/webm">
</video>
mac の iBook でしか確認していないが、以下も可能そうだ。
<video controls>
  <source src="movie/tmrz-1518447087.webm" type="video/webm">
  <source src="movie/tmrz-1518447087.MP4" type="video/mp4">
</video>
以上、ご参考に。... 続きを読む

spring framework / spring security 4 reference

リファレンス

ネット検索で断片的な情報を参照するより、リファレンスを参照してアーキテクチャを理解するのがよいと思う。 spring framework 4 reference spring security 4 reference

サポート (EOL)

2020年までサポートされる 元記事

HOWTO

フォームを使わずに値のセットや値のチェックを(バリデーション)行う

リファレンス ここの例だと、propertyValues を target にセットする。その時、FooValidator が適用される。設定が必要だったかもしれない。 propertyValues は MutablePropertyValues のインスタンスなど。map などからインスタンス化できる。

オブジェクトのコピー

org.springframework.beans.BeanUtils の copyProperties 同名のプロパティ値(getter/setterを持ったメンバ変数?)を src から dst にコピー。このような便利なものがあるとは知らず、無駄にコピーしたり、プロパティ値が増えるとその度にコピーすることに・・・... 続きを読む

音声をテキストに変換(google speech api)

google の cloud speech api のサンプルを使用。 transcode.py の
language_code='en-US'
language_code='ja-JP'
に変える必要あり。 wav ファイルは、16k 1ch でないと駄目なようなので、(transcode.pyの設定を変えればよさそうだが)
ffmpeg -in infile.wav -ac 1 -ar 16000 outfile.wav
などで変換する。 TBS のニュースを xperia で録音して PC にダウンロードして変換:
Transcript: 大月1日に召集される特別国会で自民党は大島理森前衆院議長再任する方針を固めました
Transcript: 衆院議長が総選挙ごとに交代する寒冷になっていますが天皇陛下の退位を実現する法整備で調整に当たったことなどが消化された他太陽控え衆院議長は皇室会議のメンバーであることなどが考慮されたい年の見通しとなりました大島氏は国会運営に精通していて野党とのパイプがあることなども考慮されたもの
まあまあいい感じかもしれない。 鬼平犯科帳のオープニング: 1st try:
Transcript: いつも世にも悪は
Transcript: その頃67巻クワ型盗賊改方という特別警察を設けていた
Transcript: ダークな床濡れを容赦なく取り締まるために行った時の機動性を与えられたこのすけ盗賊改方のお父さんこそが長谷川ふとんで鬼の映像
2nd try:(flac でエンコードして storage にアップして変換)
Transcript: いつも世にも悪は絶え
Transcript: その頃67巻クワ型盗賊改方という特別警察を送っていいんだと悪魔族の群れを容赦なく取り締まるために僕の希望を与えられたこのすけ盗賊改方のお父さんこそが備わっている人呼んで鬼の平蔵である
3rd try:(1st try と同じ wav)
Transcript: いつも世にも悪は
Transcript: その頃67巻クワ型盗賊改方という特別警察を設けていた
Transcript: ダークな床濡れを容赦なく取り締まるためにドキドキ同性を与えられたこのすけ盗賊改方のお父さんこそが長谷川ふとんで鬼の映像
まあ、人間でもこのくらいの聞き間違いはあるかもしれない。鬼平犯科帳を読書か試聴させ続ければ、認識が強化されるのかもしれない。... 続きを読む

画像化されている文字をテキストに変換する方法

WEB サイトで画像化されている文字があって、ALT もセットされていない画像をテキストにしたいと思ったが、さすがに手入力はだるすぎる・・・(ALTから読み出すのも面倒だが。) Google drive にアップロードして変換できるというような記事も見たが、いちいち保存してアップロードなんてめんどくさすぎる・・・ 画像のURL(は右クリックでコピーされる)からテキストに変換するアプリでも作ろうかと思っていたが、そういえば、Google に OCR 機能があったなと思って調べた。Vision API だ。 画像の URL からファイルをダウンロードして、API に入れればテキストが返ってくるんだろうな、と思ってドキュメントを読んでいると、サンプルコードが提供されていた。 Mac で試してみた。authentication の下に書かれてあるリンクを辿って、Creating the service account のとおりに設定し、落ちてきた json ファイルを保存。シェルから、
sudo pip3 -r requirement.txt
export GOOGLE_APPLICATION_CREDENTIALS=jsonファイルのパス
python3 detect.py text-uri URL
のようにすれば結果が返ってくる。おそらく Windows でも同様で、export のところが環境変数の設定に変わるだけだろう。 テキスト変換しようとしていた画像の変換結果はこうだ。
> python3 detect.py text-uri http://www.e-b-s.co.jp/herseries/img/LP_SLIM/c04_point_pc.png
Texts:

"あなたの食行動(高カロリー嗜好)の有無がわかります。
FTO
FTO
あなたに必要な栄養素が何なのかがわかります。
あなたが太りやすい食べ物の特徴がわかります。
ADRB3 UCPl
あなたに適した運動の種類がわかります。
UCPI
あなたの脂肪のつきやすい部位がわかります。
ADRB3 UCP1
あなたの基礎代謝が高いか、
低いかがわかります
ADRB3UCP1ADRB2
"
bounds: (98,35),(963,35),(963,660),(98,660)

"あなた"
bounds: (98,35),(181,35),(181,62),(98,62)

"の"
bounds: (187,38),(212,38),(212,60),(187,60)

"食"
bounds: (218,35),(243,35),(243,63),(218,63)

"行動"
bounds: (247,35),(303,35),(303,62),(247,62)

"("
bounds: (313,35),(321,35),(321,62),(313,62)

"高"
bounds: (325,35),(351,35),(351,63),(325,63)

"カロリー"
bounds: (357,36),(469,36),(469,61),(357,61)

"嗜好"
bounds: (474,35),(532,35),(532,62),(474,62)

")"
bounds: (535,36),(542,36),(542,62),(535,62)

"の"
bounds: (551,38),(576,38),(576,60),(551,60)

"有無"
bounds: (582,35),(636,35),(636,63),(582,63)

"が"
bounds: (640,37),(667,37),(667,61),(640,61)

"わかり"
bounds: (671,35),(751,35),(751,62),(671,62)

"ます"
bounds: (764,35),(815,35),(815,61),(764,61)

"。"
bounds: (820,55),(828,55),(828,63),(820,63)

"FTO"
bounds: (865,42),(903,42),(903,56),(865,56)

"FTO"
bounds: (928,42),(959,42),(959,56),(928,56)

"あなた"
bounds: (99,155),(181,155),(181,182),(99,182)

"に"
bounds: (188,157),(210,157),(210,180),(188,180)

"必要"
bounds: (216,155),(273,155),(273,182),(216,182)

"な"
bounds: (278,155),(302,155),(302,182),(278,182)

"栄養素"
bounds: (306,155),(392,155),(392,183),(306,183)

"が"
bounds: (397,157),(424,157),(424,180),(397,180)

"何"
bounds: (427,155),(453,155),(453,182),(427,182)

"な"
bounds: (459,155),(482,155),(482,182),(459,182)

"の"
bounds: (487,159),(512,159),(512,180),(487,180)

"か"
bounds: (517,156),(543,156),(543,180),(517,180)

"が"
bounds: (547,157),(574,157),(574,180),(547,180)

"わかり"
bounds: (577,155),(658,155),(658,182),(577,182)

"ます"
bounds: (671,155),(723,155),(723,181),(671,181)

"。"
bounds: (726,175),(733,175),(733,183),(726,183)

"あなた"
bounds: (98,275),(181,275),(181,302),(98,302)

"が"
bounds: (186,276),(214,276),(214,301),(186,301)

"太り"
bounds: (218,275),(267,275),(267,301),(218,301)

"やすい"
bounds: (277,274),(362,274),(362,301),(277,301)

"食べ物"
bounds: (367,274),(452,274),(452,302),(367,302)

"の"
bounds: (456,278),(482,278),(482,299),(456,299)

"特徴"
bounds: (486,274),(542,274),(542,302),(486,302)

"が"
bounds: (546,276),(573,276),(573,301),(546,301)

"わかり"
bounds: (576,275),(657,275),(657,301),(576,301)

"ます"
bounds: (670,274),(722,274),(722,301),(670,301)

"。"
bounds: (725,294),(734,294),(734,303),(725,303)

"ADRB3"
bounds: (866,284),(903,284),(903,292),(866,292)

"UCPl"
bounds: (930,284),(958,284),(958,292),(930,292)

"あなた"
bounds: (99,395),(181,395),(181,422),(99,422)

"に"
bounds: (188,397),(210,397),(210,420),(188,420)

"適し"
bounds: (215,395),(270,395),(270,422),(215,422)

"た"
bounds: (278,396),(301,396),(301,421),(278,421)

"運動"
bounds: (306,395),(363,395),(363,422),(306,422)

"の"
bounds: (367,399),(392,399),(392,420),(367,420)

"種類"
bounds: (396,395),(453,395),(453,422),(396,422)

"が"
bounds: (457,397),(484,397),(484,420),(457,420)

"わかり"
bounds: (487,395),(568,395),(568,422),(487,422)

"ます"
bounds: (581,395),(633,395),(633,421),(581,421)

"。"
bounds: (636,415),(644,415),(644,423),(636,423)

"UCPI"
bounds: (870,403),(897,403),(897,413),(870,413)

"あなた"
bounds: (99,515),(181,515),(181,542),(99,542)

"の"
bounds: (187,519),(213,519),(213,539),(187,539)

"脂肪"
bounds: (216,515),(273,515),(273,542),(216,542)

"の"
bounds: (277,519),(302,519),(302,539),(277,539)

"つき"
bounds: (307,515),(360,515),(360,542),(307,542)

"やすい"
bounds: (367,515),(453,515),(453,541),(367,541)

"部位"
bounds: (457,515),(512,515),(512,542),(457,542)

"が"
bounds: (517,517),(544,517),(544,540),(517,540)

"わかり"
bounds: (547,515),(628,515),(628,541),(547,541)

"ます"
bounds: (641,515),(693,515),(693,541),(641,541)

"。"
bounds: (696,535),(704,535),(704,543),(696,543)

"ADRB3"
bounds: (867,524),(903,524),(903,533),(867,533)

"UCP1"
bounds: (915,524),(955,524),(955,533),(915,533)

"あなた"
bounds: (99,633),(181,633),(181,660),(99,660)

"の"
bounds: (187,636),(212,636),(212,658),(187,658)

"基礎"
bounds: (218,633),(273,633),(273,660),(218,660)

"代謝"
bounds: (277,633),(334,633),(334,660),(277,660)

"が"
bounds: (336,635),(363,635),(363,658),(336,658)

"高い"
bounds: (367,633),(422,633),(422,660),(367,660)

"か"
bounds: (427,634),(453,634),(453,658),(427,658)

"、"
bounds: (457,653),(464,653),(464,660),(457,660)

"低い"
bounds: (486,633),(542,633),(542,660),(486,660)

"か"
bounds: (546,634),(573,634),(573,658),(546,658)

"が"
bounds: (577,635),(603,635),(603,658),(577,658)

"わかり"
bounds: (607,633),(687,633),(687,659),(607,659)

"ます"
bounds: (701,633),(753,633),(753,659),(701,659)

"ADRB3UCP1ADRB2"
bounds: (807,642),(963,642),(963,651),(807,651)
すごすぎる。十分使える。 領域の座標らしきものが返ってきているので、変換単位で移動させたりといったアプリケーションも考えられるのかもしれない。 もう、ALT も設定しなくていいのかもしれない・・・... 続きを読む

OpenJDK は使い物になるのか?

一部上場企業向けのアプリケーションで OpenJDK 1.8 (Linux) を使って構築して、日々使っていただいているので、問題なく使えるはずだ。Oracle JDK のベースは、OpenJDK だし、”sponsored and led by Oracle” であるし、RedHat の製品は OpenJDK での動作を保証しているので、問題ないはずだ。オープンソースにするということは、業界内で助け合おうということだと思うので、より安定して使えると私は信じている。 開発には、操作性などの都合、Windows を使うことも多いだろうが、Windows 用の OpenJDKを入れおくと良いだろう。... 続きを読む

pdf の上に pdf を重ねて出力

既出かもしれないが、面白いものを見つけたような気がする。 Apache PDFBox は良く知られていると思うが、その中のコマンドラインツール。 その中でも OverlayPDF は使えそうだと思ったので試してみた。PDF の上に別の PDF を重ねるということだろう。

手順

1.まず、以下のファイルを用意する。

pdfbox app jarファイル IPAフォント 他にも、java を実行できるよう、セットアップする。

2.ここでは例として、テキストから作った二つの PDF ファイルを重ねてみる。

uso.txt を作る。
これはうそです。
Mac は UTF-8 で OK。Windows は Shift-JIS? codepage による?

3.コマンドプロンプトから以下のコマンドで PDF を二つ作る。(> はプロンプト)

> java -jar pdfbox-app-2.0.7.jar TextToPDF -ttf IPAfont00303/ipagp.ttf uso1.pdf uso.txt
> java -jar pdfbox-app-2.0.7.jar TextToPDF -ttf IPAfont00303/ipamp.ttf -fontSize 30 uso2.pdf uso.txt
uso1.pdf と uso2.pdf ができているはずだ。

4.以下のコマンドを実行する。

> java -jar pdfbox-app-2.0.7.jar OverlayPDF uso1.pdf uso2.pdf uso_over_uso.pdf
どうだろう。二つの PDF が重なっているのではないだろうか。IPA フォントもなかなか良い。 うその上にうそを重ねた結果

その他の使い方

このコマンドラインツール、分割、結合もできて便利そうだ。 マージ “`java -jar pdfbox-app-2.y.z.jar PDFMerger 入力PDFファイル1 入力PDFファイル2 … 出力PDFファイル 分割 “`java -jar pdfbox-app-2.y.z.jar PDFSplit PDFファイル 画像変換 “`java -jar pdfbox-app-2.y.z.jar PDFToImage PDFファイル とするようだ。 既存の紙の帳票の上に印字するのに使えないだろうか・・・    ... 続きを読む

株の自動売買

日経平均株価が何十年かぶりの高値を付けたという景気のいい話を聞いたので(景気の良さは実感できないが・。。。)、pythonで自動売買ができないのか考えてみた。 自分は下手なのと、資金が無いのとで、しばらく遠ざかっていたが、売買の方法だけ考えて、あとは機械に処理させたほうが良いのではないだろうか・・・python でも、そういったシステムを作れるだろうか。 たまたま時間があったので、HetaTraderというプロトタイプを作ってみた。なかなかふざけた名前で気にいっている。そのうち、自分より上手に売買してくれるかもしれない。 entry/exitのトリガーと、entry/exitの実行に分けられるかと思う。

売買のタイミング

株価の取得には、チャートギャラリーというソフトが必要。Yahooファイナンスでも株価は取れるが、過去の値段を取ったりするのはなかなか面倒だ。Excelに取り込めるとあるが、Pythonからもアクセスできた。 チャートギャラリーの Active market データベースだと、検索性が悪いので、sqlite3 に取り込み直す。権利落ち修正値段を見る必要があるので、view で補正している。 sqlite3 への取り込みの時に、52週の高値/安値、20日移動平均値、21日標準偏差を別のテーブルに格納している。python3 では、statistics ライブラリが追加になっていて標準偏差の計算が簡単になっている。 もっと綺麗に実装できるだろうが、機能するか見たいだけなので、お許しを。

売買の実行

ほんと、個人で使える API を用意してほしい・・・ かろうじて使えそうなのは、楽天証券の携帯画面。サポートが続けばいいのだが。 entry は、寄付きか引け、exit は逆指値でいいので、これで十分だ。 まだ未完成だが、ログイン/注文画面への遷移/ログアウト、あたりは確認してみた。

今後

また、追ってレポートしたい。... 続きを読む

さくらのレンタルサーバのいいところ

さくらインターネットのレンタルサーバ、一つのサーバを借りれば、いくつも WordPress サイトを作れて便利だということに、今頃気づいた。。。さくらのレンタルサーバ スタンダードだとデータベースを20個、ビジネスだと100個作れる。WordPressをそれぞれ、20個、100個インストールできるではないか。2個はできたので、100個でも同じはず。。。 私は次の点がさくらのレンタルサーバの良い点だと思う。
  1. [new!]SSL が無料。(ただし、独自ドメインのみ利用可能)
    2. 複数の WordPress サイトを比較的簡単に設置できる。こういった用途には、http://ホスト名.sakura.ne.jp/WordPressディレクトリ/ とするのが一番簡単か。(もちろん、ドメイン名は変えられる。)
    3. メールが付いている。このメールは転送用にもできるし、送受信用にもできる(WEBメールが使える)。ウィルスチェックの機能も付いている。メールアドレスは無制限に作れる。
    4. 2週間お試しで使える。
    5. 疑問があれば、まりなが twitter で教えてくれる。
    6. スタンダードプラン以上ではシェルが使える。gcc、g++なども使えてpython3もコンパイル可能なレベル。ImageMagickなども実行できて画像の変換も可能であった。
使い込めば、メールまわりの機能が充実していることがわかるが、今回は割愛する。 申し込みはこちらから。
さくらのレンタルサーバ スタンダード
さくらのレンタルサーバ ビジネス... 続きを読む

WordPress のバックアップ/復元を簡単に – Jetpack

WordPress コンテンツのバックアップには、JetPack の有料プランを使うのが簡単だ。月々の利用料(500円前後〜)は発生するがJetPackの一機能なので、追加プラグインのインストールは不要だ。 [toc]

機能

JetPackのSecurity設定でサイトのバックアップを有効にすると、次のような画面になる。   ここでバックアップの詳細を押すと、バックアップとセキュリティの概要が表示される。   Backups を押すと、バックアップの概要が表示される。カレンダー形式で表示されている。リストアするための設定をしていないので、赤いボックスが表示されているが、とりあえず、先に進む。   カレンダーの日付、または、一覧表示の View Backup ボタンを押すと、指定した日のバックアップの概要が表示される。   ダウンロードボタンを押すと、ダウンロード対象を選択するポップアップが表示される。   Prepare Backup ボタンを押すと、進行状況がポップアップに表示され、準備が終わると次のようにDownload ボタンが青色に変わる。Download ボタンを押すと、指定したコンテンツが落ちてくる。 Backup Contents に表示されているものが、tar.gz 形式のファイルにまとまっている。(tar xvf ファイル名か、windows の解凍ソフトなどで展開できる。)コンテンツを復元するのに必要なファイルが入っている。  

リストア方法

sftp を使ったリストア

sftpでも復元できる。動きを見ていると、バックアップデータとphpスクリプトが転送され、そのスクリプトがDBやファイルを復元する仕組みになっているようだ。(ftpも同様と思う。)設定手順は次のとおり。
  1. WEB サーバに復元用のアカウントを作成する。(useradd -m -G apache hogehoge など。)
  2. WordPressを置いているディレクトリに、書き込み権限を与える。(chmod g+w /opt/wordpress など。) wordpress ディレクトリに復元用のデータ等を置くので、書き込み権限が無いと復元に失敗する。復元に失敗した場合は、メールでエラーが通知される。
  3. バックアップ設定画面を開き、項目を入力する。Username には、1で作ったアカウント名を入力する。WEBサーバへのログインを、パスワード認証でなく、パブリックキー認証に設定している場合は、パスワードは入力せず、show public key で表示される内容を、~アカウント名/.ssh/authorized_keys に追加する。
  4. saveボタンを押す。保存後、画面をリロードすると以下のようになる。(サーバを sftp に限定していないので、sshもオンになる。sftpでアクセスさせたい場合は、forget this connectionリンクを押せば、設定を忘れてくれる。)
以上の設定を行い、バックアップ画面からrestoreボタンを押せば、指定したバックアップに復元される。

手動 でのリストア方法

諸事情で自動設定にしたくない場合は、手動でリストアすることもできる。 手動でのリストア方法

まとめ

バックアップは、Automatic 社のサーバに保存されるので、自分でデータを保管する場所を確保する必要はない。プレミアムプランでは、セキュリティスキャンもかけてくれるようだ。正確な情報については、Get to know VaultPressを。 レンタルサーバのディスクが壊れる、ということはそうそう無くなっているかもしれないが、ハッキングなどによりサイトが改竄される可能性が無いとはいえない。正常な状態まで調査/復元するために便利なサービスだ。WordPress で作った会社のホームページやお客様のホームページなど、まだバックアップを取っていなければ、おすすめしたい。 お申し込みは、Jetpackのページから。... 続きを読む

今頃になって S51SE に Android 4.4 を入れてみる

Android 2.3 の Experia mini を Android 4.4 にしたい、今さらそんなことをしたい人がいるかどうか知らないが、以下にまとまっていた。 LegacyXperia インストール方法 ブートローダは mac から書いたが、fastboot というコマンドぐらいしか使わなかった。(Android Studioに入っている) ブートローダを書く時、 ./fastboot erase system ./fastboot erase userdata をしておかないとけないのか?初回 LegacyExperia の画面で固まったままだった。(電池を抜いて再度トライ) google 日本語入力 skype gmail google keep wordpress などをインストールしてみたが、特に問題なさそうだった。 Xposed は入れられなかった。(datasim パッチを入れようとしたが入れられなかった。) 何ぶんメモリが小さいので、アプリを選んでインストールする必要がある。... 続きを読む

簡単に WORDPRESS サイトを立ちあげる方法

wordpress.com で作るのが一番簡単ではないかと思います。
  • レンタルサーバを借りて wordpress を導入する手間がありません。おそらく数分で立ちあげられることでしょう。
  • 値段は機能によって違います。各プランの比較表をご覧ください。
こちらのリンクからお申し込みください。 参考 JetPack の有料プランもおすすめです。一番価格の安いPersonal版にはバックアップとスパムフィルターが付いています。... 続きを読む

AWS を安く使う方法

ディープラーニングや、イーサリアムなどの暗号通貨などのアプリケーションとして、GPU をよく見かけるようになりました。 今さらながら、どのくらいの速度差があるのか見てみたいと思ったのですが、役に立つかどうかわからない GPU を買うのももったいない感じです。 そんな時は AWS だと思うのですが、それなりのお値段だと思います。 例えば、g2.2xlarge を見てみると、オンデマンド価格は $0.65/h です。ですが、スポットインスタンスであれば、例えば、g2.2xlarge だと、今見てみると、$0.2077/h でした。一世代前の GPU なのかもしれませんが、かなりお得な感じがします。(1時間20円であれば、ほとんど電気代だなあ、と。) g2 インスタンスは、AWSのページによると、NVIDIA GRID K520 を使っているらしいので、CUDAバージョンの表が役に立つかもしれません。 スポットインスタンスの使い方ですが、EC2 の画面の左側のメニューに、スポットリクエストというのがあります。 スポットインスタンスはシャットダウンしてしまうと、ディスクの内容は消えてしまう(停止メニューが押せなくなっている)ので、システムを構築した後、一旦スナップショットに保存してイメージにするか、直接イメージを作るか何かして、次に立ち上げる時のために保存しておく必要があります。基本的には、起動すると、何か計算しはじめて、適当なタイミングで消えてもらう、というアプリケーションに向いているかなと思います。 スポットインスタンスを作る最初の画面で、少し迷った点。 1ページ目、リクエストタイプの設定。 一時的に立ち上げるのであれば、「リクエスト」を選んでページの下のほうにある最高価格には、「自動入札を使用 (推奨)」を選べばよいのではないかと思います。システムを構築して、一定の価格以上は許容でない、というのであれば、最高価格は「最高価格を設定する (インスタンス時間当たり)」を設定しておけばよいかと思います。 2ページ目、リクエスト有効時間の設定。 いつ終了するかを決めることができるようですが、「期限切れによるインスタンスの削除」をチェックしておかないと、終了期限が来ても立ち上がったままなのでご注意を。 c3.large や、f1 インスタンスなどもお得なので、比較してみてください。... 続きを読む

pushd / popd / dirs

pushd ディレクトリ名
現在いるディレクトリをスタックに積んで、ディレクトリ名で指定したディレクトリに移動
popd
スタックの先頭のディレクトリに移動
dirs
スタックを表示
別のディレクトリで作業(環境変数の設定やコンフィグファイルの編集)をした後、元のディレクトリに戻りたいなどという場合に便利。 私は今でもよく使う。 詳しくはお使いのシェルのマニュアルページを見よう。 (man bashなど。man pushdでも見れるかもしれない。) ジョブコントロール機能も参考に。... 続きを読む

AWS の FPGA インスタンス(f1インスタンス)を使ってみる

AWS の FPGA の利用可能なインスタンス(f1)を使ってみたいと思ったが、何かに使えないとやる気が出ないので、(double)sha256 の高速化を目標にした。(bitcoinのminingに使えないのかと。) 何年か前に ASIC を作るプロジェクトに2年ほど携わったことがある程度の知識しかないので、専門用語等が間違っていてもご容赦を。 一時間あたり $1.65 なので、結構なお値段だ。 GPU か FPGA かどちらを使うべきか悩んだが、GPU は基本的には、浮動小数点演算を並列に実行するには向いていそうだが、ハッシュ処理に使われているシフトやバイトの入れ替えなどは FPGA のほうが向いていそうに思える。なんといっても、線をつなぎかえるだけなのだから。

AWS イメージ・開発環境

FPGA の HDK/SDK が搭載されているイメージは、AWS market place で、FPGA Developer AMI という名前で提供されている。FPGA を使わなければ、t2.medium などでも起動できそうだ。これなら料金を抑えられる。 インスタンスを立ち上げてみると、合成ツールとシミュレータは入っているようだった。また、ハードウェア開発キット(HDK) に一通りドキュメント、サンプルが揃っている。

実装・評価

FPGA インスタンスを使うにあたって、私の疑問点は、ホストとのインタフェースをどうするのか、というのと、ホストインタフェースを組み込んだ状態でシミュレーションできるのか、という点だ。 両方とも可能で、全て cl_hello_world に書かれている。このサンプル、本当に良く考えられていると思う反面、このサンプルが無ければ何もわからなかっただろう。

ホストインタフェース

cl_hello_world だが、ホストから適当な番地に書き込んだデータを読み出すことができるようなロジックになっているようだ。また、Virtual DIP SW/LED/JTAG などの機能もある。 このサンプルを使えば、特定の番地にデータを書き込み、読み出しすることが可能そうだ。

シミュレーション

ASIC とは違って書き換えは可能なものの、FPGA イメージを作るには時間がかかる。そのため、FPGA イメージを作っては試す、などといったことはできないし、どこが間違っているかもわからないだろう。シミュレーションで論理を検証することができるようになっており、FPGA イメージを作るほどの時間も必要ない。 さて、シミュレーションの方法だが、RTL Simulation for Verilog/VHDL Custom Logic Design with AWS HDK に記載がある。なんと、C言語でテストできる。私にとっては、かなり嬉しいし、敷居が下がった。また、実環境でのCソースも同様に用意されているので、流用できそうだ。( sha256 の RTL は Hardware implementation of the SHA-256 cryptographic hash function にあるので、cl_hello_world を適当に編集して、sha256 モジュールと接続すればよさそうだ。make C_TEST=test_hello_world で実行する。 ハッシュ化したいメッセージを適当な番地にセットし、実行開始フラグを立て、実行完了フラグが立っていたら、戻り値を適当な番地から読み出す、これができれば、FPGA で sha256 の計算をさせられそうだ。 試してみたところ、pythonで言うところの
hashlib.sha256(hashlib.sha256(1024bitのメッセージ).digest()).digest()
は、1回あたり、1.5us (666kHash/s)前後だった。sha256 は、64 回ループ+αで、二回実行しているので、桁的には、動作クロック/100程度だろうか。 シミューレーションのため、 /home/centos/src/project_data/aws-fpga/hdk/cl/examples/cl_hello_world/verif/scripts/top.vivado.f に追加したファイル(私の例ではsha256_core.vなど) を入れる必要がある。 ちなみに、ここまでで、丸々3日ほどかかってしまったが、ハードウェア設計・実装に精通していれば、もっと早いだろう。

合成

ファイルを追加したので、いくつか変更する必要があった。 /home/centos/src/project_data/aws-fpga/hdk/cl/examples/cl_hello_world/build/scripts の * encrypt.tcl の file copy 〜 とある箇所にファイルを追加 * synth_cl_hello_world.tcl を以下のように変更(追加したファイルが verilog だったから?)
read_verilog [glob $ENC_SRC_DIR/*.v]
read_verilog -sv [glob $ENC_SRC_DIR/*.sv]
./aws_build_dcp_from_cl.sh を実行するとメモリが足りないよ、と言われるので、-ignore_memory_requirement を付けて実行。 デフォルトはバックグラウンドで(nohupコマンドで)実行されるが、-foreground を付ければ、画面に表示されるので、screen などで端末が切断されても復活(screen -r)できるようにして実行。 4〜5時間かかった。 シミュレーションでは動作しても、実機上で同じ結果にならず、試行錯誤・・・

FPGA イメージの生成

How To Create an Amazon FPGA Image (AFI) From One of The CL Examples: Step-by-Step Guide のとおりに生成する。 ポイントは * S3 の設定で、AWS にアクセス権を与えること * IAM の設定で、EC2 full access か何かの権限を与えること (S3 のアクセスだけでは、create image が失敗した) かと思う。

FPGA へのロード・実行

アカウントの初期状態では、f1 インスタンスが使えないようになっているので、AWSに制限値を上げるよう申請する。 以下のリンクを参考にイメージを作ってロード。 (FPGAイメージの作り方〜ロードの方法)[https://github.com/aws/aws-fpga/tree/master/hdk/cl/examples#3-submit-the-design-checkpoint-to-aws-to-register-the-afi] software/runtime の下に実環境上で動作させるコードがあるので、参考に。

活用方法など

ホストとのやりとりが割と簡単なので、パターンの決まったロジックを10〜100倍にしたい時に有効な場合もあろう。(ただ、一ヶ月フルに回すと、12万ほどかかる計算なのでお気をつけて。) とりあえず、bitcoin daemon から「宿題」をもらって、nonce に相当する部分をブン回せば、当たりが出るかもしれないので試してみよう・・・(全部 C 言語で書くのは、さすがに面倒なので、FPGAを実行させて結果を読み出して表示するという簡単な機能のC言語プログラムを python から subprocess で呼び出すか。) それにしても、bitcoin の ASIC の性能は T Hash/s とのことで、どのように実現しているのか。個数を増やしているのではなく、パイプライン的にして、ほぼ 1 hash / clock でデータが出てくるようになっているのか。それでも数百MHash / s だろうし、想像できない数を並べているのだろうか。 レポートを見てみると、2%程度しか使っていなかったので、頑張れば、50個ぐらい詰め込めるのか?

参考

最初、GUI環境も整えたりしたが、結局は不要だった。 以下のようなソフトウェアとハードウェアの関係などにも目を通しておいたほうが理解が深まるかもしれない。 Happy a nice hacking on cl_hello_world!... 続きを読む

お名前.com で取ったドメインで www 無しのサーバ

独自のドメインで安価にブログを構築する方法は、お名前.comでドメインを取って、bloggerにコンテンツを置く方法ではなかろうか。SSLを使わなくてよければ、ドメインの費用だけで済みそうだ。 また、bloggerだと条件を満たせば、adsense広告も有効にできるし、広告を非表示にもできるのがいいところかな、と思っている。 先日、koneko.blog といういい感じの名前のドメインを取ったものの、http://koneko.blog とできないことに気づいた。 その対処法:
  1. blogger で “www.ドメイン名” のカスタム設定をする。
  2. (結局安くならないが)さくらインターネットなどでVPSを借りて、centos+apacheを立てる。
  3. お名前.com でもドメイン無しの A レコードは設定できるので、ホスト名には何も入れず、上記サーバのアドレスを入れる。
  4. cd /etc/httpd/conf.d/forward.conf にでも virtual host を設定して、ドメイン名を www.ドメイン名に転送する設定を入れる。
例:
<VirtualHost *:80>
    ServerName koneko.blog
    Redirect / http://www.koneko.blog/
</VirtualHost>
しかし、1年もすれば、子猫じゃなくなるな、というのが悩みだが。... 続きを読む

Google デジタルワークショップ

受講してみましたが、Googleの検索の仕組みや広告等の有料サービスへの理解が深まりました。 アクセス数の多いWEBサイトをどのようにして作ればよいのだろう、という悩みから受講してみたのですが、 自社製品のPRにお悩みのマーケティング担当の方には役立つのでは。 ただ、AM5時から始めて、AM11時ぐらいまでかかったので、一日仕事ですね。 認定証... 続きを読む

aws lambda

計算量の必要なロジックを AWS に計算させてはどうかと思った。 AWS Lambda を使えば、サーバを立ち上げなくても、ロジックの一部を切り出して実行させることができそうだ。HTTP で URL にパラメータを付けて GET すれば計算結果が返ってくる、といったことをやってみようと思う。

lamba 関数と API の作成

以下の手順で作成する。
  1. AWS Lambda のダッシュボードから関数を作成を選択。
  2. 設計図には、ブランク関数を選ぶ。
  3. トリガーに、API Gateway を選択。(HTTPで実行させたいため。)テスト用なので、セキュリティには、オープンを設定。 関数名を入力。
  4. ランタイムは、とりあえず、python 2.7 を選択。
  5. Lambda 関数のコードには以下のように記述。
def lambda_handler(event, context):
    # TODO implement
    return {"statusCode": 200, "body": "hello"}
もし、json データを返したいのであれば、
"body": '{"resp": "hello"}'
などのようにする必要がある。 あとは適当に入力して、関数の作成ボタンを押す。関数の作成に成功したら、トリガーに表示されている URL をクリックしてみよう。結果が表示されるはずだ。

トラブルシュートの方法

私は、最初、lambda 関数の作成時、デフォルトのコードで実行して少しハマってしまった。URL をクリックしても internal server error が返っていた。 以下のようにするとログが表示されるのでどこまで実行されているかわかる。ここに気づくのに時間がかかった。
  1. Amazon API Gateway サービス > API > リソース > 関数名 を選択
  2. メソッド名を選択(または ANY)
  3. テストを押す
  4. メソッド GET を選択
  5. テストボタンを押す
ログの最後のほうに、
Thu Apr 06 20:05:34 UTC 2017 : Execution failed due to configuration error: Malformed Lambda proxy response
とある。 lambda が返すべき書式が決まっているらしい。
{
    "statusCode": httpStatusCode,
    "headers": { "headerName": "headerValue", ... },
    "body": "..."
}
のような応答を返す必要がある。 ドキュメントを参照してほしい。

パラメータを渡して結果を得る

さて、query parameter でパラメータを渡して、結果を返してみたい。何をやろうとしているかバレバレであるが、lambda 関数を以下のように変えてみる。
import json

def lambda_handler(event, context):
    qs = event['queryStringParameters']
    result = {"result": qs['hash'] + qs['nonce']}
    # TODO implement
    return {"statusCode": 200, "body": json.dumps(result)}
URL?hash=1234&nonce=1234 などとすると、hashとnanceを結合した文字列が返る。 プログラミングモデル ハンドラーなどが参考になろう。 print すれば、cloudwatch のログに出力されるし、API Gateway からテストを実行すれば、実行状況も追うことができるだろう。 あとは、自由にロジックを入れてみよう。面白いサービスがあるものです。

追記:速度について

sha256 を二回計算させるロジックを AWS に置いてみたところ、10万回ループで、約6秒(=16k Hash/s)。threading でマルチスレッドにしても、計算時間はスレッド数に比例する感じ。(thread にしても意味がない) bitcoin の採掘に ASIC が必要というのがよくわかる。... 続きを読む

飲食店など個人事業のためのホームページ等作成法

どうするのが良いか?

ホームページを作るべきかどうか。。。個人事業レベルなら、google のサービスへの登録とブログで十分ではなかろうか。また、twitter/facebook/line/インスタなど SNS のリアルタイム性、拡散性を考えると、ブログ+SNS が良さそうだ。

手順

  1. gmail アカウントを作成。gmail アカウントを作れば、google の、メール、写真、ドキュメント、ブログなど様々なサービスにアクセスすることができる。
  2. google マイビジネスに登録。飲食店なら、住所、電話番号、写真など登録しておけば、google で検索した時に大きく表示されるだろう。
  3. ブログを立ちあげる。blogger で良いのではないかと思う。blogger は広告を表示しないようにもできるし、gmail アカウントを持っていれば簡単に作れる。独自ドメインだと、ドメインの管理など煩雑だし、多少お金もかかるので、独自のドメインでなくても良いのかもしれない。
  4. twtiter アカウント、facebook page などを作る。ifttt を使えば、blogger を更新したら、twitter に流すことも可能だろう。また、twitter に書けば facebook page を更新することもできるので、どこかに一本化するのが楽だ。twitter は20代以下、facebook は、30代以上がターゲットになるのではなかろうか。(どこかにそれらしきデータがあったように思う。) line、instagram などが主流だとは思うが、自分が使っていないので、トライしてみてほしい。
  5. 飲食店なら、いちおう、インターネット時代の海原雄山、食べログに登録する。ブログの URL を入れるのを忘れないよう。食べログの代理店の営業は聞かなくても大丈夫だと思う。その分、仕入れを充実させたい。

運用

お知らせ的なものをブログに、日々の情報は、SNS に流せばよいのではないかと。ブログにはメニューやサービス内容など、あまり変わらない情報を載せて必要な時だけ更新し、SNS を日々更新するという運用方法もあると思う。 多少時間はかかるが、お金は全然かからない。色々楽しいサービスを考えて、ブログを更新してみてはどうだろうか。... 続きを読む

bitcoin 採掘

今から bitcoin を掘っても遅いと思うが、試してみた。

技術的な背景

bitcoin は、ブロックチェーンと呼ばれる改竄できない(困難な?)データを P2P ネットワークでシェアしている仕組みのようである。 ブロックチェーン自体は、前のブロックのデータを使って、次のブロックのデータを作る、ということで、新しくないように思える。契約書の割印のようなもので、そのページのデータを書き換えようとすると、前のページを差し替える必要がある、といったものだろうか・・・ 改竄できないデータを作るために、sha256 ハッシュを二回使って、先頭がいくつかの 0 となるようなデータを探し出させるような、計算量を必要とする仕組みになっているようだ。 昔はソフトウェアでも掘れていたが、計算量の増大に伴い、GPU に、それでも遅いので、ASIC で採掘するのが主流。

python で試掘

技術的な解説など山のようにあると思うので、前置きはこのくらいにして、掘れるわけはないと思うが、python で掘ってみることにした。 python だと、pyminer というのがある。 このソフトを使うには、 bitcoind が必要とのこと。bitcoind のセットアップ方法は色々書かれているが、試してみたところ、ちょっと試すにしても、最初のダウンロード時間が長すぎて(1日経っても終わらない・・・)挫折。また、getwork rpc プロトコルが廃止されていて pyminer.py は使えない。。。 試行錯誤の末、辿り着いた結論は、slushpoolに登録して Stratum Mining Proxy を使うこと。 python setup.py install して mining_proxy.py を実行すれば、pyminer.py が実行できるようになった。mining_proxy.py には何か引数が必要かもしれないが、よくわからない。とりあえず、-cu と -cp を付けておいたが未検証だ。 pyminer 自体は、nonce を 0 から順に試しているだけなので、そのままでは全く使えないだろう。 pyminer を魔改造して遊んでみては?

参考

  • slushpool は長らく pool を運営しているようで、ドキュメントがわかりやすいように思えた。
... 続きを読む

python でマージャンの点数計算をしてみる (5)

とりあえず、タンキ、トイツ、コーツ、ジュンツを抽出してみたいと思う。めんどうになってきたので、ソースを貼る。 point_calc.py
data = "萬3 萬4 萬5 萬5 萬6 萬7 筒1 筒1 筒1 索3 索3 索6 索8 索7"
print(data)

data_list = data.split(' ')
print(data_list)

data_list.sort()
print(data_list)

# 一個だけ
def fetch_tanki(data_list):
    return [data_list[0], data_list[1:]]

# 対の牌
def fetch_toitsu(data_list):
    # 牌がなければ None を返す
    if len(data_list) == 0:
        return None

    toitsu = []

    pai = data_list.pop(0) # 先頭の要素を取り出す
    toitsu.append(pai)

    # 同じ牌がなければ None を返す
    if pai not in data_list:
        return None

    data_list.remove(pai)
    toitsu.append(pai)

    return [toitsu, data_list]

# 同じ牌3個
def fetch_kotsu(data_list):
    # 牌がなければ None を返す
    if len(data_list) == 0:
        return None

    kotsu = []

    pai = data_list.pop(0) # 先頭の要素を取り出す
    kotsu.append(pai) # kotsu = [pai]

    for i in range(2): # 2回ループ
        # 同じ牌がなければ None を返す
        if pai not in data_list:
            return None

        data_list.remove(pai)
        kotsu.append(pai)

    return [kotsu, data_list]

# 同種で数字が3個並ぶ
def fetch_juntsu(data_list):
    # 牌がなければ None を返す
    if len(data_list) == 0:
        return None

    juntsu = []

    pai = data_list.pop(0)
    juntsu.append(pai) # juntsu = [pai]

    for i in range(2):
        pai = next_pai(pai) # pai の数字を 1 増やした牌を返す
                            # 数字が1-9でなければ None
                            # 字牌は None とする
        if pai is None:
            return None

        if pai not in data_list:
            return None

        data_list.remove(pai)
        juntsu.append(pai)

    return [juntsu, data_list]

# pai は 種類+数字
# 字牌の時は種類のみ
def next_pai(pai):
    # 1文字だけの時は None
    if len(pai) != 2:
        return None

    num = int(pai[-1]) # 末尾の数字(文字)を数値に変換
    num += 1
    if num <= 1 or num >= 10: # num が 1 になる時は'萬0'などを入力した場合。
                              # 一応チェック。
        return None

    return pai[0]+str(num)



# deepcopy でないと data_list が書き換わる
import copy
print(fetch_tanki(copy.deepcopy(data_list)))
print(fetch_toitsu(copy.deepcopy(data_list)))
print(fetch_kotsu(copy.deepcopy(data_list)))

# ジュンツテスト用
data = "萬3 萬4 萬5 萬5 萬6 萬7 筒1 筒1 筒1 索3 索3 索6 索8 索7"
print(data)

data_list = data.split(' ')
print(data_list)

print(fetch_juntsu(copy.deepcopy(data_list)))
実行結果
萬3 萬4 萬5 萬5 萬6 萬7 筒1 筒1 筒1 索3 索3 索6 索8 索7
['萬3', '萬4', '萬5', '萬5', '萬6', '萬7', '筒1', '筒1', '筒1', '索3', '索3', '索6', '索8', '索7']
['筒1', '筒1', '筒1', '索3', '索3', '索6', '索7', '索8', '萬3', '萬4', '萬5', '萬5', '萬6', '萬7']
['筒1', ['筒1', '筒1', '索3', '索3', '索6', '索7', '索8', '萬3', '萬4', '萬5', '萬5', '萬6', '萬7']]
[['筒1', '筒1'], ['筒1', '索3', '索3', '索6', '索7', '索8', '萬3', '萬4', '萬5', '萬5', '萬6', '萬7']]
[['筒1', '筒1', '筒1'], ['索3', '索3', '索6', '索7', '索8', '萬3', '萬4', '萬5', '萬5', '萬6', '萬7']]
萬3 萬4 萬5 萬5 萬6 萬7 筒1 筒1 筒1 索3 索3 索6 索8 索7
['萬3', '萬4', '萬5', '萬5', '萬6', '萬7', '筒1', '筒1', '筒1', '索3', '索3', '索6', '索8', '索7']
[['萬3', '萬4', '萬5'], ['萬5', '萬6', '萬7', '筒1', '筒1', '筒1', '索3', '索3', '索6', '索8', '索7']]
実行結果、本来は見やすいようにすべきだろう。 タンキ、トイツ、コーツ、ジュンツのリストの後ろに、残り牌のリストを出力している。 残り牌を同じように解析すれば、牌の組み合わせを表示できるのではなかろうかと思う。 ただ、このコードの不満なところは、牌の先頭からしか切り出せないことだ。 普通はもっと考えて作るかもしれないが、私の作り方は、おおむねこのような感じだ。 また時間をみて続けたい。... 続きを読む

python でマージャンの点数計算をしてみる (4)

牌を切り出すのに少し試行錯誤してみたいと思う。 実行後、IDLE の画面に次のように表示されていると思う。
>>>
python を起動した時にも表示される。ここで、python の文を入力することができる。変数を表示させたい時は、そのまま変数名を入力すればよい。 牌を並べかえておこう。
>>> data_list.sort()
>>> data_list
['筒1', '筒1', '筒1', '索3', '索3', '索6', '索7', '索8', '萬3', '萬4', '萬5', '萬5', '萬6', '萬7']
並べ替えは辞書順になるので、萬を最初に、字を最後にするような並べ替えについては後で考えたいと思う。 リストの先頭にある牌を取得
>>> pai=data_list[0]
>>> pai
'筒1'
リストの先頭にある牌を除いたリストを取得。
>>> rest=data_list[1:]
>>> rest
['筒1', '筒1', '索3', '索3', '索6', '索7', '索8', '萬3', '萬4', '萬5', '萬5', '萬6', '萬7']
[1:] のような書き方ができるのは便利だと思う。マイナス値を指定すると文字列の末尾からカウントする。これも便利。 牌の種類と数字を取得
>>> pai[0]
'筒'
>>> pai[1]
'1'
やはり、数字は文字列の1でなく、int の 1 がよかろうか。
>>> int(pai[1])
1
しかし、東南西北白發中だとどうなるだろうか。
>>> jihai='東'
>>> jihai[0]
'東'
>>> jihai[1]
Traceback (most recent call last):
  File "<pyshell#66>", line 1, in <module>
    jihai[1]
IndexError: string index out of range
>>> 
これは後で考えることにしよう。 筒1筒1、筒1筒1筒1、筒1筒2筒3のパターンを探す必要がありそうだ。 つづく それにしても、python のリストは便利すぎる。
[1,2,3,'test','test',True]
のように何でも入る。C言語などで苦労した者が見ると、何これと思うだろう。... 続きを読む

python でマージャンの点数計算をしてみる (3) — 準備

wikipedia にある、門前清自摸和をやってみたいと思う。 windows に python 3.6 をインストールして  IDLE を起動してみよう。 mac なら、何かテキストエディタでファイルを作り、 python3 ファイル のようにして実行する。 まず、wikipediaや麻雀雑誌にある牌の並びをリスト化したい。 しかし、リスト入力は、””を付ける必要がありめんどうなため、 萬3萬4萬5萬5萬6萬7筒1筒1筒1索3索3索6索8索7 という文字列をリストにすることを考えたい。 リスト化の都合上、牌の間は空白で区切ることとする。 少しずつやっていこう。 IDLE から、New -> File して以下のように入力する。
data = "萬3 萬4 萬5 萬5 萬6 萬7 筒1 筒1 筒1 索3 索3 索6 索8 索7"
print(data)
File->Save As で mahjong とでもいうフォルダを作り、point_calc.py とでも名前をつけて保存しよう。 Run->Run Module でプログラムを実行してみる。
萬3 萬4 萬5 萬5 萬6 萬7 筒1 筒1 筒1 索3 索3 索6 索8 索7
>>> 
のように表示された。何か楽しそうだ。 リストに変換してみよう。先程のファイルの末尾に2行追加する。
data = "萬3 萬4 萬5 萬5 萬6 萬7 筒1 筒1 筒1 索3 索3 索6 索8 索7"
print(data)

data_list = data.split(' ')
print(data_list)
Run Module してみよう。
萬3 萬4 萬5 萬5 萬6 萬7 筒1 筒1 筒1 索3 索3 索6 索8 索7
['萬3', '萬4', '萬5', '萬5', '萬6', '萬7', '筒1', '筒1', '筒1', '索3', '索3', '索6', '索8', '索7']
のように文字列がリストになっているものが表示される。 すぐに実行でき、何でも print できるのは python の良いところだと思う。 つづく... 続きを読む

python でマージャンの点数計算をしてみる (2)

なぜ、マージャンの点数計算を題材として選んだか・・・ややこしいからだ。ここでは、python だが、好きな言語を使って考えてみればよいと思う。 マージャンの戦略を考えたり、プログラム同士を戦わせたり、など色々よくばりたいとは思いつつも、今回は、python 普及が目的なので、マージャンの点数計算に絞りたいと思う。目的/目標を明確にすることは重要だと思う。そうでないと、終わりが見えない。 マージャンを知らない人が読むと素通りされそうなので、ルール等をおおざっぱに説明しておく。 4人で行うゲームで、マンズ1-9(1萬-9萬)/ピンズ1-9(1筒-9筒)/ソーズ1-9(1索-9索)/東南西北白發中それぞれ4枚ずつの牌を使う。 牌が13枚配られ、毎回1枚ずつ引く(ツモ)か、他の人が捨てた牌をもらって(チー/ポン/カン)いき、役が完成したら上がって点がもらえる。   点数の計算方法は、基本的には、wikipedia の計算式や、のとおりだ。 おおむね役で決まる(それに応じて符は自動的に決まるので)のだが、例えば、「1萬1萬1萬2萬2萬2萬3萬3萬3萬」は、「1萬2萬3萬/1萬2萬3萬/1萬2萬3萬」とも「1萬1萬1萬/2萬2萬2萬/3萬3萬3萬」とも解釈できるため複雑そうだ。役も沢山あるので、組み合わせも多そうだ。記事を書き出してみたものの、いつ完成するのか・・・   順番に並べかえたり、牌の種別を調べたりすることが必要そうに思えるが、まずは、牌のデータの持ち方を決めることにしたい。 萬筒索字牌の種類で並びかえ、数字の小さいものから順に並べることが多いので、萬1、萬2、東、南、西などの文字列でデータを表してみることにしたい。そのほうが print できるし便利だろう。 さて、ポン、チー、カン(明槓-他人の捨てた牌で4枚の組にする、暗槓-自分がツモった牌で4枚の組にする)、など、役数にも影響するので、これらも識別する必要がありそうだ。 とりあえず、データの持ち方は、リストにして、 [“萬1”, “萬2”, …., 同種で順に並んだ3個の牌の組, 同じ牌3個の牌の組, 同じ牌4個の牌の組] とし、「牌の組」には、他からもらったものか(鳴いた)ものかどうか区別できるような構造にしてみようかと思う。 これを、 [[牌の組, 牌の組, 牌の組, 牌の組, 牌の組], [牌の組, 牌の組, 牌の組, 牌の組, 牌の組],…] に変形するか、 [牌, 牌, …] に展開するか して、役に一致するかを判定すればよいのではなかろうか。   つづく・・・かな?w  ... 続きを読む

python でマージャンの点数計算をしてみる (1)

python で何ができるのか、また、ソフトはどのようにして作るのか、その一例として、マージャンの点数計算でもしてみようと思う。 中学生の頃、ベーシックマガジンか、月刊マイコンか、Oh!MZ か忘れたが、マージャンって面白そう、と思い、その頃は雑誌に印刷された BASIC のソースコードをポチポチ入力して遊んだ記憶がある。 だが、BASIC なので、よし、ロン、と思っても、タイプミスしていて、その度にデバッグしていた楽しい思い出がある。 python でもタイプミスしていると、Exception が発生して、その度に当時を思い出す。 なんとなく、自分のバックグラウンドのような気がするので、それを python で再現してみようと思う。 つづく・・・といいんだが      ... 続きを読む

プリンタ/スキャナを買わないですます方法

プリンタ/スキャナを買うべきか考えていますか? コンビニのコピー機というか複合機がとても便利になっているので、頻繁に使うのでなければ、プリンタもスキャナも要らないなと、最近つくづく思います。 写真もプリントできるのでとても便利です。 コンビニの複合機には、セブンイレブンのタイプと、ローソン/ファミリーマートのタイプの二種類がありそうです。 どちらもスマートフォンや、USBメモリから、文書の印刷、写真のプリントができます。 写真は、ローソン/ファミリーマートの複合機では、少し大きいタイプ(2L)にも印刷できます。 また、スキャンもできますが、スキャン結果は、セブンイレブンのほうは、スマートフォンに保存できますが、ローソン/ファミリーマートのほうは、スマートフォンには保存できなさそうでした。(USBメモリに保存) セブンイレブンの複合機では、nanaco で支払いができ、スマートフォンに nanaco を登録しておけば、ほとんどスマートフォンだけで、印刷/スキャンができます。google drive などで文書をPCと同期しておけば、なお便利ですね。 私は、普段はセブンイレブンで印刷/スキャンを、大きな写真を印刷したい時は、ローソン/ファミリーマートで2Lサイズで印刷するか、セブンイレブンで葉書に印刷しています。また、社印を押してスキャンなどが必要な時は、イートインコーナーのあるコンビニで印刷後ハンコを押してスキャンして送信、といったように使っています。 まあ、個人でやっている小さな会社だからできることかとは思いますが。... 続きを読む

卒業祝、就職祝、餞別には何が良いか

3月は卒業の季節で、4月から進学されたり、会社に勤めるようになったりすると思います。 私のまわりでも、頑張ってくれたアルバイトの学生さんが就職されます。 そういった時に、私は、図書券をもらったりしたのですが(何ぶん昔の話なので・・・)、嬉しくて、もらった図書券で何を買おうか吟味して本を買っていた記憶があります。 少々味気ないかもしれませんが、Amazon のギフトカードなんかをもらうと嬉しいと思います。 プレゼントしたギフト券、4月から必要になる物や、知識を得るのに使ってもらえるかもしれません。 Amazon のギフトカードには、印刷できるタイプ、E-mail で送るタイプ、Amazon のアカウントにチャージする3種類があるので、 手渡しがよければ、印刷して、メッセージを添えて渡してはどうかなと思います。 Amazon ギフトカード... 続きを読む

ssh

UNIX 系のマシンにリモートログインするのに必須のコマンド。 windows であれば、teraterm や、putty を使えば、SSH プロトコルでリモートログインできる。もしくは、cygwin や、mingw など、UNIX 環境をエミュレーションするようなソフトをインストールして、ssh コマンドを使ってリモートログインすることができる。
まず、前準備として、ssh-keygen で 公開鍵 / 秘密鍵のペアを作る。公開鍵をを、ログインするサーバの、~/.ssh/authorized_keys に追加する。 その後、ssh -i 秘密鍵 ユーザ@ホスト で接続する。
ログインだけでなく、このコマンドが便利なのは、ポートフォワード機能。三種類の転送方法がある。-L、-R、-D の三種類。それぞれ、ローカル、リモート、ダイナミック。 ローカルは、接続元の指定のポートへの着信が、ログインしているサーバから、指定したアドレス、ポートに発信される。一例としては、ファイアウォールの外側のサーバで、例えば、DB ポートなどをフィルタしていて直接接続できない時に、ローカルホストにポート転送して使う。 リモートは、ログインしているサーバの指定のポートへの着信が、接続元のサーバから、指定のアドレス、ポートに発信される。ファイアウォールの外側のホストから、ファイアウォールの内側のホストに通信したい時に使える。 ダイナミックは、接続元の指定のポートに着信した socks による着信が、ログインしているサーバから指定のアドレス、ポートに発信される。ファイアウォールで自由に外に出られない/サーバで接続するホストを絞っている、といった場合に使える。 詳しくは、man ssh を見てください。    ... 続きを読む

Windows server 2016 Datacenter default code page

AWS の Windows 2016 Datacenter を使ったところ、code page が日本語設定になっていなくて困った。 色々調べまくったところ、以下を設定するとよさそう。 コントロール パネル > 時計、言語、および地域 > 地域 管理タブを選択 Unicode 対応でないプログラムの言語欄のシステムロケールの変更ボタンを押す 日本語を選択 再起動  ... 続きを読む

AWS の t2 インスタンスとは

AWS の t2 インスタンスのクレジットの説明、要するに、ダンジョンマスターのマナみたいなものかと思う。 と言っても、ダンジョンマスターがわかる人が少ないか。他のロールプレイングゲームだとスタミナなどと表現されているように思います。 使えば減り、休めば増える。      ... 続きを読む

ファイルをファイル名で探す – find

find コマンドを使う。 例えば、今いるディレクトリ (. で表します) を検索 find . -name ‘hoge*’ -print もしくは、 find .  | grep ‘hoge*’ など。 ” でくくっとかないと、シェルが、カレントディクレクトリにある hoge* を探して、その結果を渡してしまって意図しない結果に。” でくくらず、hoge¥* や “hoge*” でもよい。 “” でくくった場合は、環境変数が展開されます。 例えば、echo “hoge$PATH” と echo ‘hoge$PATH’ の違いを見てみればわかると思います。
このコマンド、-exec オプションを使うと、見つけたファイルに対して、コマンドを実行させたり、ファイルを削除したりできます。 find . -name ¥*.bak -exec ls -l  {} ¥; ≈find . -name ¥*.bak -delete などのように使います。 前者の例では、{} に検索に一致したファイル名が入ります。
詳しい使い方については、 man find して、手始めに、/EXAMPLE[ENTER] してみてください。  ... 続きを読む

テキスト処理

テキストファイル(例えばログなど)の検索、編集などでよく使うコマンドを紹介したい。
cut コマンド
空白やタブなどで区切られた出力から指定した部分を切り出す
sort コマンド
ソートする
uniq コマンド
同一行を一行にまとめる。-c オプションをつければ同一行の数を出力する。入力はソートしておく必要がある。
sed / awk コマンド
入力の各行に指定のパターンを適用する。sed は行単位、aws はもう少し複雑なスクリプティングができる。

詳しくは、man コマンド名 でマニュアルを表示させ、EXAMPLE を検索しよう。... 続きを読む

パイプ(その2)

パイプのことを書いていて、別のコマンドを思いだした。 tee コマンドだ。 例えば、 tail -f /var/log/messages | tee log.txt | grep ERROR みたいな感じ。   log.txt に書きつつ、標準出力にも書く。(そしてパイプで接続したプログラムに処理させる)   分岐させるから、T だったかな?  ... 続きを読む

パイプ

始めてシェルを使った時、そして今でも画期的だと思えるのは、パイプの機能。 あるプログラムの出力を他のプログラムに簡単に渡すことができる。 例えば、 ps auxw | grep java ps はプロセスの一覧 grep は文字列の検索 プロセスの一覧から、java 文字列を検索する。当然、その後にまた処理をしたければ、パイプで渡す。 標準入力からデータをもらって、標準出力にデータを出力する。そして、標準出力と標準入力を接続するのがパイプ。 ちなみにエラーメッセージは渡したくないことが多々あるので、エラーメッセージは標準エラー出力に出力され、標準出力とは区別される。標準エラー出力を標準出力に無理矢理出力する方法もあて、/bin/sh ならば、2>&1 を付けるとよい。(2 は標準エラー出力の番号で、1は標準出力の番号) 小さなプログラムをつなげて使う、というのが元々の思想と聞いた記憶がある。less is more ということか。 はるか昔、こういったことが、UNIXマガジンや、UNIXプログラミング環境や、楽しい UNIX、BSD オペレーティングシステムなどといった本に載っていて、夢中になって試していました。本当に楽しい本だったと思う。もう無いのかな?... 続きを読む

中古PCをお探しの方

AMAZON でも購入できるんですね。 メモリ8GBで、価格の安い順から調べてみました。ソフト開発用途なので、8GB は最低必要かと思いました。事務用途(MS OFFICEなど)であれば、4GB 程度で十分ではないかと思います。 OFFICE 2016 と書かれている商品がありますが、KING SOFT 社のオフィスソフトだったりして、まぎらわしいですね。 CPU の性能比較をしながら選んではどうかと思います。  ... 続きを読む

大学で勉強したのが少しは役に立ったと思えたもの

もう大学を卒業して四半世紀になりますが、100年以上使いものになる理論を考えた人、そして、それが役に立つだろうと思い教えた人は偉いと思う。

回路理論

特に回路シミュレーションのために、回路を行列で表すグラフ理論には感銘を受けました。今でもコンピュータサイエンス全般に応用可能。

電磁気学

電波など、電磁波を扱うのなら、必須かも。基本はマクスウェルの方程式でしょうかね。あとは、今でも理解不能な座標系毎の計算。

通信工学

  • サンプリング定理
  • ハフマン符号
  • OSI7階層モデル
など

数学

行列 など

コンピュータサイエンス

アルゴリズムとデータ構造 二分木やハッシュなど。データの追加や検索など。  

その他

確率・統計なども役に立つと思います。
今の時代、仮説と検証の繰り返す、そして、考えを表現するといった、文科系的な考え方も必要なのかなと思います。      ... 続きを読む

色々リファレンス

BSD/Linux

Linux – REDHAT ENTERPRISE LINUX / CENTOS

操作を一通り理解するには、以下のページを読むべきでしょう。(CENTOS も同様) 個別のコマンドの詳細を知りたい場合は、端末を起動して、 man コマンド名 もしくは、 man -k キーワード などとしましょう。

FreeBSD

FreeBSD Handbook FreeBSD の達人に教えてもらいました。一通り操作方法が記載されています。

言語

PYTHON

チュートリアルとライブラリリファレンスがあれば遊べます。

C++

プログラミング言語C++ 文法、ライブラリとも網羅されていてすばらしい。

Java

ライブラリ/フレームワーク

apache commons

spring

spring framework の目次だけでも見ておくと良いかも。... 続きを読む