2015年12月15日火曜日

yesodのデプロイをnginx + keterでやってみた

keterってどうよ


yesodのproduction環境へのデプロイってどうやってやるのかなと思いつつ調べていたらketerなるものを見つけたのでやってみました。

keterを使ってyesodのデプロイとdaemonizeしてみる


keterはyesodのデプロイとdaemonizeまでやってくれる

keterをインストール


とりあえずインストール
karky7 ~ # emerge -pv dev-haskell/keter

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild  N    ~] dev-haskell/keter-1.4.3.1:0/1.4.3.1::haskell  USE="doc hoogle hscolour profile -system-filepath {-test}" 0 KiB

Total: 1 package (1 new), Size of downloads: 0 KiB

 * IMPORTANT: 42 news items need reading for repository 'gentoo'.
 * Use eselect news read to view new items.

karky7 ~ # 

そして設定
karky7 ~ # cp /etc/keter/keter.yaml.systemd /etc/keter/keter.yaml
karky7 ~ # mkdir -p /web/incoming

keterのIPとポートを決める
# /etc/keter/keter.yaml
root: /web
host: 127.0.0.1
port: 3000
nginx:
  start:
    - systemctl
    - start
    - nginx.service
  reload:
    - systemctl
    - reload
    - nginx.service

yesodプロジェクトを作成


どこでもいいので作る
karky7 ~ # yesod init
Welcome to the Yesod scaffolder.
I'm going to be creating a skeleton Yesod project for you.

What do you want to call your project? We'll use this for the cabal name.

Project name: yapp
Yesod uses Persistent for its (you guessed it) persistence layer.
This tool will build in either SQLite or PostgreSQL or MongoDB support for you.
We recommend starting with SQLite: it has no dependencies.

    s      = sqlite
    p      = postgresql
    pf     = postgresql + Fay (experimental)
    mongo  = mongodb
    mysql  = MySQL
    simple = no database, no auth
    mini   = bare bones, the "Hello World" of multi-file Yesod apps
             (Note: not configured to work with yesod devel)
    url    = Let me specify URL containing a site (advanced)

So, what'll it be? simple
That's it! I'm creating your files now...

---------------------------------------

                     ___
                            {-)   |\
                       [m,].-"-.   /
      [][__][__]         \(/\__/\)/
      [__][__][__][__]~~~~  |  |
      [][__][__][__][__][] /   |
      [__][__][__][__][__]| /| |
      [][__][__][__][__][]| || |  ~~~~
  ejm [__][__][__][__][__]__,__,  \__/


---------------------------------------

The foundation for your web application has been built.


There are a lot of resources to help you use Yesod.
Start with the book: http://www.yesodweb.com/book
Take part in the community: http://yesodweb.com/page/community


It's highly recommended to follow the quick start guide for
installing Yesod: http://www.yesodweb.com/page/quickstart

If your system is already configured correctly, please run:

    cd yapp && stack build && stack exec -- yesod devel
karky7 ~ # 

yappのketer.yamlをイジる
karky7 ~ # cd yapp
karky7 yapp # emacs config/keter.yml

修正する
# After you\'ve edited this file, remove the following line to allow
# `yesod keter` to build your bundle.
# user-edited: false <---- ここコメントアウト

# A Keter app is composed of 1 or more stanzas. The main stanza will define our
# web application. See the Keter documentation for more information on
# available stanzas.
stanzas:

  # Your Yesod application.
  - type: webapp

    # Name of your executable. You are unlikely to need to change this.
    # Note that all file paths are relative to the keter.yml file.
    exec: ../dist/build/yapp/yapp

    # Command line options passed to your application.
    args: []

    hosts:
      # You can specify one or more hostnames for your application to respond
      # to. The primary hostname will be used for generating your application
      # root.
      - www.kamegashira.jp # <--- ここイジった

    # Enable to force Keter to redirect to https
    # Can be added to any stanza
    requires-secure: false

  # Static files.
  - type: static-files
    hosts:
      - kamegashira.jp/static # <--- ここイジった
    root: ../static

    # Uncomment to turn on directory listings.
    # directory-listing: true

  # Redirect plain domain name to www.
  - type: redirect

    hosts:
      - kamegashira.jp # <--- ここイジった
    actions:
      - host: www.kamegashira.jp  # <--- ここイジった
        # secure: false
        # port: 80

    # Uncomment to switch to a non-permanent redirect.
    # status: 303

# Use the following to automatically copy your bundle upon creation via `yesod
# keter`. Uses `scp` internally, so you can set it to a remote destination
# copy-to: user@host:/opt/keter/incoming/

# You can pass arguments to `scp` used above. This example limits bandwidth to
# 1024 Kbit/s and uses port 2222 instead of the default 22
# copy-to-args:
#   - \"-l 1024\"
#   - \"-P 2222\"

# If you would like to have Keter automatically create a PostgreSQL database
# and set appropriate environment variables for it to be discovered, uncomment
# the following line.
# plugins:
#   postgres: true

がっちゃんこする


karky7 yapp # yesod keter
cleaning...
Warning: The package list for 'hackage.haskell.org' does not exist. Run 'cabal
update' to download it.
Resolving dependencies...
Configuring yapp-0.0.0...
Building yapp-0.0.0...
Preprocessing library yapp-0.0.0...
[1 of 8] Compiling Settings         ( Settings.hs, dist/build/Settings.o )
[2 of 8] Compiling Settings.StaticFiles ( Settings/StaticFiles.hs, dist/build/Settings/StaticFiles.o )
[3 of 8] Compiling Import.NoFoundation ( Import/NoFoundation.hs, dist/build/Import/NoFoundation.o )
[4 of 8] Compiling Foundation       ( Foundation.hs, dist/build/Foundation.o )
[5 of 8] Compiling Import           ( Import.hs, dist/build/Import.o )
[6 of 8] Compiling Handler.Common   ( Handler/Common.hs, dist/build/Handler/Common.o )
[7 of 8] Compiling Handler.Home     ( Handler/Home.hs, dist/build/Handler/Home.o )
[8 of 8] Compiling Application      ( Application.hs, dist/build/Application.o )
In-place registering yapp-0.0.0...
Preprocessing executable 'yapp' for yapp-0.0.0...
[1 of 1] Compiling Main             ( app/main.hs, dist/build/yapp/yapp-tmp/Main.o )
Linking dist/build/yapp/yapp ...
karky7 yapp # 
karky7 yapp # cp yapp.keter /web/incoming/
/etc/hostsファイルにホストを追加
127.0.0.1        www.kamegashira.jp

keter起動


うまくいけば、起動するはず
karky7 ~ # systemctl start keter
karky7 ~ # ps -ef | grep keter
root     10381     1  0 22:00 ?        00:00:00 /usr/bin/keter /etc/keter/keter.yaml
root     10400 10381  0 22:00 ?        00:00:00 /usr/bin/keter /etc/keter/keter.yaml
karky7 ~ # 
karky7 ~ # netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 *:43124                 *:*                     LISTEN     
tcp        0      0 *:ssh                   *:*                     LISTEN     
tcp        0      0 localhost:3000          *:*                     LISTEN 
...

nginxを設定、起動する


serverセクションを追加する、「proxy_set_header Host $host;」が重要、これないとうまく動かない
    server {
        listen 80;
        server_name kamegashira.jp;
        location / {
            proxy_pass http://127.0.0.1:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Fowarded-For $proxy_add_x_forwarded_for;
        }
        access_log /var/log/nginx/localhost.access_log main;
        error_log /var/log/nginx/localhost.error_log info;
    }
そしてnginx起動
karky7 ~ # systemctl start nginx
ブラウザで「http://www.kamegashira.jp/」にアクセスしてみる
簡単にデプロイができる、大量なスクリプトをweb領域に展開するよりは全然かんたん、1つのファイルだけ持ってけばいい。理想のデプロイじゃないですか。

是非みなさんhaskellでyesodなクリスマスを彼女と過ごしてください!

2015年10月1日木曜日

emacsのflymakeがエラーで文句をいう件について

最近でるflymakeのエラーがウザい


OpenSolaris勉強会でメモリまわりのお話を聞きつつ、illumosのカーネルコードを追っかける事が多くなった今日この頃ですが、最近、私のemacsがCのソースファイルを開くと以下のエラーを吐くようになってしまいました。

Flymake: Configuration error has occurred while running (make -s -C ./ CHK_SOURCES=ioctl_app_flymake.c SYNTAX_CHECK_MODE=1 check-syntax). Flymake will be switched OFF >
これがウザい、いつか直そうと思いつつ、面倒くさいので放置していましたが、あまりにウザいので、修理を決意。

check-syntaxを書けよ


結論からいうと、Makefileに「check-syntax」ターゲットが無いのが原因だったらしい。なので、Makefileに書いてみた

CFLAGS +=  -Wall
CFILES = devone.c

obj-m += devone.o
sample-objs := $(CFILES:.c=.o)

all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

check-syntax:
        gcc -o null -Wall -Wextra -pedantic -fsyntax-only $(CHK_SOURCES)

その後、Cのソースファイルを開いてみるとエラーは出ません
まぁそれはいいとして、今までのソースのために全部にMakefileを作成しそれを書くのは無理なので、emacs側にcheck-syntaxが実行できない場合(やるんだけどエラーを返してきた場合)、そのチェックを無視するように、emacsの設定ファイルに追加する。

(defadvice flymake-post-syntax-check (before flymake-force-check-was-interrupted)
  (setq flymake-check-was-interrupted t))
(ad-activate 'flymake-post-syntax-check)

こんな感じで追加してやると、Makefileが無くてもエラーが出ない、これで快適にコードを追っかけることができます、意味分からんが...

2015年9月22日火曜日

XRのタイヤを久しぶり入れ替えた

今回はIRCのiX-09Wに替えてみた


前はブリジストンのHard系のモトクロスタイヤでしたが、もうそんなにゲロを吐くようなところには行かないと心に誓い、今回はどちらかというとHardでもなくMudでもない、ちょうど真ん中程度の、オールマイティ的なタイヤをチョイス。


リアはチェーンとかあるから面倒くさい、しかも一人でやるので大変、ライザップでもいって筋力つけないと、タイヤを持てないレベル。

だいたい外すと、気になってチェーンとか掃除しちゃうタイプ、gentooユーザーはとことんこだわってしまうらしい (笑)


結構キタネェー


 昔は手でハメていたんですが、最近は同級生のタイヤやで面倒くさいのでやってもらう、チェンジャーでやったら、手でなんかできない...

ちなみに、伊豆高原のタイヤマンです、43歳独身で嫁募集中とのことです、最近酔っ払ってどっかの階段から落ちて尾てい骨にヒビが入って死にそうだったって言ってました。
アホの塊ですよ...

で、前と後ろを換装して、出来上がり


 やっぱ新しいタイヤを履かせると、ちょっとイカツくなって、いい感じ、?

最近、息子の野球で山に入れない年が続きますが、来年の秋ぐらいには、また山にこもりましょうかね、それまでお金もかかるのでボチボチ、リペアしていきます。

チームお稲荷の復活も近いですよ!

それと尾てい骨のチョンガーのことも忘れないでください...

でお疲れ様でした、明日はシルバーウィーク最終日、みなさんいい思い出できました?



ここタイヤや





2015年9月4日金曜日

Solaris11のZone Of Shared Storage(ZOSS)がやべぇー

COMSTARが便利すぎる


飲みすぎで、体調不良が続き、ミネラル不足からくる全身のツリ、夕方襲ってくるアル中ハイマー病、そんな夏も終わり、涼しくなってきた今日この頃。
皆さん健康には気をつけてください。

ZOSSってZone Of Shared Storageっていうのですが、読んでそのまま、共有ストレージ上でZoneを動かす技術、今回はiSCSIを利用してやってみました。

構成

こんな感じ

iSCSIのtargetを作成

まずTargetを作成する

必要なパッケージをインストール

iichiko ~ # pkg install group/feature/storage-server
iichiko ~ # pkg install system/storage/iscsi/iscsi-target

zfsから切り出し

iichiko ~ # zfs create -V 30G rpool/export/zonevol1

論理ユニット作成

iichiko ~ # stmfadm create-lu /dev/zvol/rdsk/rpool/export/zonevol1
Logical unit created: 600144F0FA864600000055DE92840001
※確認
iichiko ~ # stmfadm list-lu
LU Name: 600144F0FA864600000055DE92840001
iichiko ~ # stmfadm list-lu -v
LU Name: 600144F0FA864600000055DE92840001
    Operational Status     : Online
    Provider Name          : sbd
    Alias                  : /dev/zvol/rdsk/rpool/export/zonevol1
    View Entry Count       : 0
    Data File              : /dev/zvol/rdsk/rpool/export/zonevol1
    Meta File              : not set
    Size                   : 10737418240
    Block Size             : 512
    Management URL         : not set
    Vendor ID              : SUN
    Product ID             : COMSTAR
    Serial Num             : not set
    Write Protect          : Disabled
    Write Cache Mode Select: Enabled
    Writeback Cache        : Enabled
    Access State           : Active

iSCSIイニシエータで利用可能にするためadd-viewする

これでイニシエータ側で見れるようになる
iichiko ~ # stmfadm add-view 600144F0FA864600000055DE625D0001

targetのサービスを起動

iichiko ~ # svcadm enable -r svc:/network/iscsi/target:default

Target作成

iichiko ~ # itadm create-target
Target iqn.1986-03.com.sun:02:07iichiko-20do-61dd-c43a-a68793659de1 successfully created
iichiko ~ # itadm list-target -v
TARGET NAME                                                  STATE    SESSIONS
iqn.1986-03.com.sun:02:07iichiko-20do-61dd-c43a-a68793659de1  online   0
        alias:                  -
        auth:                   none (defaults)
        targetchapuser:         -
        targetchapsecret:       unset
        tpg-tags:               default
これでターゲット側の設定が終了、ものすげぇー簡単

イニシエータ側の設定

つづいてイニシエータ側、Zoneを稼働させるホストを設定する

パッケージインストール

iichiko ~ # pkg install network/iscsi/initiator

initiatorサービス開始

iichiko ~ # svcadm enable iscsi/initiator

/dev/dsk配下の再構築

iichiko ~ # devfsadm -i iscsi

map情報の更新

どのURIがどのデバイスに張り付いているか確認する、ここの手順を実行しすると /dev/dsk下に論理ユニット番号のデバイスとして確認できる
iichiko ~ # suriadm map iscsi://192.168.11.100:3260/luname.naa.600144F0FA864600000055DE92840001
PROPERTY        VALUE
mapped-dev      /dev/dsk/c0t600144F0FA864600000055DE92840001d0

Zoneの作成

イニシエータ側でZoneをつくる、rootzpoolがZoneのブートプールとして、URIで指定する
dev-112 ~ # zonecfg -z shouchuu
Use 'create' to begin configuring a new zone.
zonecfg:shouchuu> create
create: Using system default template 'SYSdefault'
zonecfg:shouchuu> set zonepath=/shouchuu
zonecfg:shouchuu> add rootzpool
zonecfg:shouchuu:rootzpool> add storage iscsi://192.168.11.100:3260/luname.naa.600144F0FA864600000055DE92840001
zonecfg:shouchuu:rootzpool> end
zonecfg:shouchuu> commit
zonecfg:shouchuu> export
create -b
set zonepath=/shouchuu
set autoboot=false
set autoshutdown=shutdown
set ip-type=exclusive
add anet
set linkname=net0
set lower-link=auto
set configure-allowed-address=true
set link-protection=mac-nospoof
set mac-address=auto
end
add rootzpool
add storage iscsi://192.168.11.100:3260/luname.naa.600144F0FA864600000055DE92840001
end

Zoneインストール

あとはいつも通りインストール
dev-112 ~ # zoneadm -z shouchuu install

その他、いろいろ

zpoolで追加

複数のURIを指定して、束ねたりできる
zonecfg:shouchuu> add zpool
zonecfg:shouchuu:zpool> set name=data
zonecfg:shouchuu:zpool> add storage iscsi://192.168.11.100:3260/luname.naa.600144F0FA864600000055DE92850002
zonecfg:shouchuu:zpool> add storage iscsi://192.168.11.100:3260/luname.naa.600144F0FA864600000055DE92870003
zonecfg:shouchuu:zpool> end

detachとattach

detachとattachもいつも通り
dev-112 ~ # zoneadm -z shouchuu shutdown
※detach
dev-112 ~ # zoneadm -z shouchuu detach
Exported zone zpool: shouchuu_rpool
Unconfigured zone storage resource(s) from:
          iscsi://192.168.11.100:3260/luname.naa.600144F0FA864600000055DFEC6B0001

※rpoolの確認
dev-112 ~ # zpool status -v
  pool: rpool
 state: ONLINE
  scan: none requested
config:

        NAME      STATE     READ WRITE CKSUM
        rpool     ONLINE       0     0     0
          c2t0d0  ONLINE       0     0     0

errors: No known data errors

※attach
dev-112 ~ # zoneadm -z shouchuu attach
Configured zone storage resource(s) from:
        iscsi://192.168.11.100:3260/luname.naa.600144F0FA864600000055DFEC6B0001
Imported zone zpool: shouchuu_rpool
Progress being logged to /var/log/zones/zoneadm.20150828T055358Z.shouchuu.attach
    Installing: Using existing zone boot environment
      Zone BE root dataset: shouchuu_rpool/rpool/ROOT/solaris
                     Cache: Using /var/pkg/publisher.
  Updating non-global zone: Linking to image /.
処理中 リンクされたイメージ: 1/1 完了
  Updating non-global zone: Auditing packages.
このイメージは更新の必要はありません。 (zone:shouchuu)

  Updating non-global zone: Zone updated.
                    Result: Attach Succeeded.
Log saved in non-global zone as /export/zones/shouchuu/root/var/log/zones/zoneadm.20150828T055358Z.shouchuu.attach

※boot
dev-112 ~ # zoneadm -z shouchuu boot

global Zoneからみたpool

iscsi接続されたzpoolはこんな感じでみれる
dev-112 ~ # zpool status -v
  pool: iscsi_rpool
 state: ONLINE
  scan: none requested
config:

        NAME                                     STATE     READ WRITE CKSUM
        iscsi_rpool                              ONLINE       0     0     0
          c0t600144F0FA864600000055DFEC6B0001d0  ONLINE       0     0     0

errors: No known data errors

  pool: rpool
 state: ONLINE
  scan: none requested
config:

        NAME      STATE     READ WRITE CKSUM
        rpool     ONLINE       0     0     0
          c2t0d0  ONLINE       0     0     0

errors: No known data errors
かなりと言うか、ひどく簡単、別のイニシエータに移動するのも、Zoneの設定を配布しておいて「detach」と「attach」で簡単に移設できちゃう。
これやべぇーラ



2015年8月3日月曜日

2015/08/01 伊豆市リトルシニア 清瀬ポニー 東京遠征いってきました

とにかく暑かった、清瀬


練習試合のため、東京の清瀬ポニーさんの地元まで練習試合に行ってきました。


「パネェー、暑い!、倒れますわ!」  



雲がありません...私は1試合目の1塁塁審で投入されることになりました。



無事塁審も終わりバックネット裏から観戦、この暑さのなか、もりもり投げてます、とにかくタフですよ。



めしタイム、からの2試合め



このあとホームラン、90メートルオーバー、すげぇー

試合内容を暑さによってほぼ忘れているいますが、試合内容は良かったと思います。




帰ればアルチューハイマーですよね、

「今日のビールは格別においしいですな!」

皆様お疲れさまでした、暑いので無理せず頑張りましょう。


 

2015年7月4日土曜日

2015/07/04 伊豆市リトルシニア 静岡県夏季大会 開会式にいってきました

静岡 草薙球場までいってきました


3年生の最後の大会となる「第8回 日刊スポーツ新聞社杯南関東支部 静岡県夏季大会」の開会式へいってきました。

今回の私の任務は、緊急要員の審判部として急遽、開会式へ投入されました。といっても選手の誘導をやったぐらいですが...



やっぱり綺麗な球場でした、ここで野球ができる選手が羨ましいです。



天候不良のため入場行進は割愛されましたが雨がもってよかったです。

審判なので、意外なアングルから写真がとれました、

他の「本物の審判」に見つかったら、「He is OUT」ですね。





この大会も最後まで頑張って勝ち進んでください、応援しています。

2015年6月29日月曜日

Pythonのsqlacodegenが便利です

SQLAlchemyのモデルクラスをDBから作ってくれる


PythonのORMでSQLAlchemyが好きな私ですが、最近のmigrationツールを使えなくなってきたお年寄りなので、

「テーブルから簡単にクラスを作ってくれるツールってないのか...」

と思いつつ、探していたら、sqlacodegenっていうのを見つけました、これSQLAlchemy用のORMクラスをデータベースから作成してくれるツールでシンプルでいけてる

インストール


まずはインストール、とりあえず適当にgentooのebuildを作っておきましたので、gentoo貴族はlaymanで入れて見てください。そのたのディストリビューションなかたはpipで入れて見てください。

karky7 ~ # layman -s karky7
...
...
karky7 ~ # emerge -pv sqlacodegen
...
Calculating dependencies... done!
[ebuild  N    ~] dev-python/inflect-0.2.5::karky7  PYTHON_TARGETS="python2_7 python3_3" 0 KiB
[ebuild  N    ~] dev-python/sqlacodegen-1.1.6::karky7  PYTHON_TARGETS="python2_7 python3_3 -python3_4" 0 KiB
..
..
karky7 ~ # emerge sqlacodegen

使ってみる


シェルからこんな感じで直接データベースを見にいかせるとモデルを全部吐いてくる
cuomo@karky7 ~ $ sqlacodegen mysql://root@localhost/SAMPLEDB
# coding: utf-8
from sqlalchemy import BigInteger, Column, DateTime, ForeignKey, Text
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base


Base = declarative_base()
metadata = Base.metadata


class BlogPost(Base):
    __tablename__ = 'BlogPost'

    id = Column(BigInteger, primary_key=True)
    title = Column(Text, nullable=False)
    authorId = Column(ForeignKey(u'Person.id'), nullable=False, index=True)

    Person = relationship(u'Person')


class Person(Base):
    __tablename__ = 'Person'

    id = Column(BigInteger, primary_key=True)
    name = Column(Text, nullable=False)
    age = Column(BigInteger)
    regdate = Column(DateTime)

その他のオプションはこんな感じ--tables [テーブル名]で関連するテーブルだけ吐いてきたり、いろいろできる。

cuomo@karky7 ~ $ sqlacodegen --help
usage: sqlacodegen [-h] [--version] [--schema SCHEMA] [--tables TABLES]
                   [--noviews] [--noindexes] [--noconstraints] [--nojoined]
                   [--noinflect] [--noclasses] [--outfile OUTFILE]
                   [url]

Generates SQLAlchemy model code from an existing database.

positional arguments:
  url                SQLAlchemy url to the database

optional arguments:
  -h, --help         show this help message and exit
  --version          print the version number and exit
  --schema SCHEMA    load tables from an alternate schema
  --tables TABLES    tables to process (comma-separated, default: all)
  --noviews          ignore views
  --noindexes        ignore indexes
  --noconstraints    ignore constraints
  --nojoined         don't autodetect joined table inheritance
  --noinflect        don't try to convert tables names to singular form
  --noclasses        don't generate classes, only tables
  --outfile OUTFILE  file to write output to (default: stdout)

最近、WAFへバンドルされているマイグレーションツールがいっぱいありますが、ちょっと使うには色々と覚える必要があるのでちょっと面倒くさい。
でもこのツールは、必要最低限でやりたいことがhelpを見るだけでできちゃうのが凄くいい。
SQLALchemy専用ですが、私はSQLAlchemy以外は使わないのでこれでいい、ちょっと注意点なんですが、テーブルのコメントなどにutf-8以外の文字コードを含んでいると、Unicodeエラーになってしまうので、その場合はALTER TABLEなどでコメントを削除するか、utf-8で入れ直すかしてみて下さい。


2015年6月23日火曜日

Persistentがまともに動きません

SelectOneManyとかもうないのか...


二日酔いが続く中、Database.Persist.Query.Join (SelectOneMany (..), selectOneMany)のあたりの関数がごっそりなくなっていて、嗚咽を模様した今日この頃です。

この辺の記事(「Yesod Web Framework SQL Join」)がそれっぽいようなことを書いてあるような気配がするのですが、英語も読む気力がないので、どなたか訳してくれないでしょうか...Orz

そんなことはいいとして、適当に書き換えてみました、データベースに入っているデータを単純に読み込むだけですが

データはこんな感じ
cuomo@karky7 ~ $ mysql -u root SAMPLEDB
Reading table information for completion of table and column names
...
...
mysql> SELECT * FROM Person;
+----+-------------------+------+
| id | name              | age  |
+----+-------------------+------+
| 11 | Kazuto Ando       |   40 |
| 12 | Yoshirou Dorumaki |   41 |
+----+-------------------+------+
2 rows in set (0.00 sec)

mysql> 
で、haskellのコード、Persistent MySQLを利用しています

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE FlexibleContexts #-}
import Database.Persist
import Database.Persist.MySQL
import Database.Persist.TH
import Data.Int
import Control.Monad.Logger (runNoLoggingT, MonadLogger)
import Control.Monad.IO.Class
import Control.Monad.Trans.Control (MonadBaseControl)

share [mkPersist sqlSettings] [persistUpperCase|
Person
    name String
    age Int Maybe
    deriving(Show)
BlogPost
    title String
    authorId PersonId
    deriving(Show)
|]

main :: IO ()
main = do
  person <- getPerson 11
  case person of
    Just p -> dispPerson (personName p) (personAge p)
    Nothing -> putStrLn "Nothing"

dispPerson :: String -> Maybe Int -> IO ()
dispPerson name (Just age) = putStrLn $ name ++ "\n" ++ show(age)
dispPerson name Nothing = putStrLn name

getPerson :: (MonadBaseControl IO m,
                        MonadIO m) => Int64 -> m (Maybe Person)
getPerson n = runNoLoggingT $ getConn $ runSqlConn $ do
   get (toSqlKey n)


getConn :: (MonadBaseControl IO m,
            MonadIO m,
            MonadLogger m) => (SqlBackend -> m a) -> m a
getConn = withMySQLConn getConnection

getConnection :: ConnectInfo
getConnection = ConnectInfo {
    connectHost = "localhost",
    connectPort = 3306,
    connectUser = "root",
    connectPassword = "",
    connectDatabase = "SAMPLEDB",
    connectOptions = [],
    connectPath = "",
    connectSSL = Nothing
}

そしたら、11番目の「かずと」を抜いてみる、最近、プロマネ的な仕事をこなしているっぽい、出世したらしい
*Main> :load "/home/cuomo/Code/yesod/Persistent/PersistMySQL.hs"
[1 of 1] Compiling Main       ( /home/cuomo/Code/yesod/Persistent/PersistMySQL.hs, interpreted )
Ok, modules loaded: Main.
*Main> main
Kazuto Ando
40
*Main>
こんだけです、気持ちが悪いので止めておきます...


2015年6月22日月曜日

二日酔い

健康診断が控えた今日この頃、「二日酔い」という状態に陥りました。

しかし、今朝はいい天気です。

健康診断は、さらに高得点を叩き出すような気がします、皆さんも飲みすぎにはご注意下さい。




2015年6月13日土曜日

gentooでVirtualBoxやってみた

vmware playerからVirtualBoxに乗り換えてみた

昔ちょっと使っていたことはあったのですが、ネットワークまわりの設定が良く分からず放置していたのですが、

「VirtualBox、最近いいよ」

って付き合ってるかわいいJKにいわれたので、vmware playerから変えてみました。

インストぅール


まずは本体のインストール
cuomo@karky7 ~ $ uname -a
Linux karky7 3.14.2-gentoo #7 SMP Sat Feb 28 18:44:57 JST 2015 x86_64 Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz GenuineIntel GNU/Linux
カーネルやらはこんなバージョン、
karky7 ~ # emerge -pv app-emulation/virtualbox
...
[ebuild  N     ] app-emulation/virtualbox-modules-4.3.18::gentoo  USE="-pax_kernel" 525 KiB
[ebuild   R    ] app-emulation/virtualbox-4.3.18::gentoo  USE="additions alsa doc extensions java opengl pam pulseaudio python qt4 sdk vboxwebsrv -headless -vnc" PYTHON_TARGETS="python2_7" 5 KiB
...
karky7 ~ #

つづいて、その他の追加パッケージ、いらなかったらごめんなさい
karky7 ~ # emerge app-emulation/virtualbox-extpack-oracle \
app-emulation/virtualbox-guest-additions \
app-emulation/virtualbox-additions \
x11-drivers/xf86-video-virtualbox \
sys-apps/usermode-utilities \
net-misc/bridge-utils

そのままだと使えないので、ちょっと追加設定が必要、/etc/groupにVirtualBoxを利用するユーザーを含める
karky7 ~ # cat /etc/group
vboxusers:x:333:cuomo
vboxguest:x:777:cuomo
karky7 ~ # grpconv
karky7 ~ # systemctl enable virtualbox-guest-additions
Created symlink from /etc/systemd/system/multi-user.target.wants/virtualbox-guest-additions.service to /usr/lib64/systemd/system/virtualbox-guest-additions.service.
karky7 ~ # systemctl start virtualbox-guest-additions
karky7 ~ # 

一般ユーザーで起動、これで起動すればすべてよろしい。
cuomo@karky7 ~ $ VirtualBox


試しにSolaris11を入れてみる


ネットワーク構成はこんな感じでつくってみた



まずはネットワーク設定、Natネットワークを作成
このネットワークはゲストOSが外部へ通信出きるようにするためのネットワーク設定で、「Nat_global」という設定で作っておく。


続いてホストオンリーネットワークの設定、この設定はホストOS(gentoo)からゲストOSへSSHが出きるようにするためのいわゆるローカルネットワーク、どうもNatネットワークへSSHできないらしいので...



Solaris11.2のインストール

初期サーバー設定



メモリ設定、とりあえず2GB用意



ディスク設定



ディスクのタイプを選択、VirtualBox専用ファイルタイプ



ディスクは可変タイプ(sparse file)を指定

 

ファイルの場所とサイズ、めんどくせ



CPUの設定



ビデオメモリの設定、128MB与えてしまえ



インストール用SolarisのCDを仮想OSへ設定



NATネットワークを設定(仮想サーバーどもがグローバルへ出れるネットワーク)



ホストオンリーアダプタを設定(ホストOSがゲストOSにSSHするためのネットワーク)



そしたら、インストール開始、



インストールが終了するまで、ビールでも飲んでいてください...

ネットワーク設定

Solarisのネットワーク設定、まず、ホストオンリーネットワーク用デバイスがホストOSに作成されているか確認、gentoo上のネットワークデバイスの確認

karky7 ~ # ip addr
...
...
9: vboxnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet6 feff::8ff:ffff:feee:3/64 scope link 
       valid_lft forever preferred_lft forever
...

続いてSolaris(ゲストOS)のネットワーク設定、net0がNatネットワーク、net1がホストオンリーアダプタで設定されている

root@super-dev:~# netadm enable -p ncp DefaultFixed
root@super-dev:~# dladm show-phys
LINK              MEDIA                STATE      SPEED  DUPLEX    DEVICE
net1              Ethernet             unknown    1000   full      e1000g1
net0              Ethernet             unknown    1000   full      e1000g0
root@super-dev:~# ipadm create-ip net0
root@super-dev:~# ipadm create-ip net1
root@super-dev:~# ipadm create-addr -T static -a 192.168.254.2/24 net1/global1
root@super-dev:~# ipadm create-addr -T static -a 192.168.100.4/24 net0/global0
root@super-dev:~# echo '192.168.100.1' > /etc/defaultrouter 
root@super-dev:~# svccfg -s name-service/switch setprop config/host = 'astring: "files dns"'
root@super-dev:~#  svcadm refresh name-service/switch
root@super-dev:~# svccfg -s network/dns/client setprop config/nameserver = net_address: "(8.8.8.8 8.8.4.4)"
root@super-dev:~# svcadm refresh dns/client
root@super-dev:~# ipadm 
NAME              CLASS/TYPE STATE        UNDER      ADDR
lo0               loopback   ok           --         --
   lo0/v4         static     ok           --         127.0.0.1/8
   lo0/v6         static     ok           --         ::1/128
net0              ip         ok           --         --
   net0/global1   static     ok           --         192.168.100.4/24
net1              ip         ok           --         --
   net1/global0   static     ok           --         192.168.254.2/24

ホストオンリーアダプターのNICにSSHできるようになる、ちなみに192.168.100.1~3は予約らしく、設定すると外部と通信ができないので、4までずらしました。(よくわからない)

ここでsshできるか確認
cuomo@karky7 ~ $ ssh 192.168.254.2
Password: 
Last login: Sat Jun 13 16:17:56 2015 from 192.168.254.1
Oracle Corporation      SunOS 5.11      11.2    June 2014
cuomo@super-dev:~$ 
もしできないようだったら再起動するか、ホストオンリーアダプタを再設定してみるといいらしい(謎)

ゾーンをつくる


こんな感じで2つのNICをもったゾーンをつくる、色々やってはみたものの「net」設定で「ip-exclusive」な設定ですと、外部と通信できなくなってしまうので「ip-shared」で設定しました。まぁアプリケーションの動作環境としてはこの辺は関係ないのでいいとしています。「anet」だといくのかな?、どなたか教えてください....
root@super-dev:~# zonecfg -z chikubi
zonecfg:chikubi> export
create -b
set brand=solaris
set zonepath=/export/zones/chikubi
set autoboot=false
set autoshutdown=shutdown
set ip-type=shared
add net
set address=192.168.100.100/24
set configure-allowed-address=true
set physical=net0
end
add net
set address=192.168.254.100/24
set configure-allowed-address=true
set physical=net1
end
zonecfg:chikubi> 
そしたらインストールして、bootする

root@super-dev:~# zoneadm -z chikubi install
Progress being logged to /var/log/zones/zoneadm.20150613T073500Z.chikubi.install
       Image: Preparing at /export/zones/chikubi/root.

 Install Log: /system/volatile/install.6289/install_log
 AI Manifest: /tmp/manifest.xml.KWaiqm
  SC Profile: /usr/share/auto_install/sc_profiles/enable_sci.xml
    Zonename: chikubi
Installation: Starting ...

        Creating IPS image
開始 リンクされたイメージ: 1/1 完了
        Installing packages from:
            solaris
                origin:  http://192.168.254.3/
ダウンロード                 パッケージ  ファイル  転送 (MB)  速度
完了                               282/282   53274/53274  351.9/351.9  793k/s

フェーズ 項目
新しいアクションをインストールしています 71043/71043
パッケージ状態データベースを更新しています      完了 
パッケージキャッシュを更新しています         0/0 
イメージ状態を更新しています      完了 
スピード検索データベースを作成しています      完了 
パッケージキャッシュを更新しています         1/1 
Installation: Succeeded

        Note: Man pages can be obtained by installing pkg:/system/manual

 done.

        Done: Installation completed in 1103.209 seconds.


  Next Steps: Boot the zone, then log into the zone console (zlogin -C)

              to complete the configuration process.

Log saved in non-global zone as /export/zones/chikubi/root/var/log/zones/zoneadm.20150613T073500Z.chikubi.install
root@super-dev:~# zoneadm -z chikubi boot
root@super-dev:~# zlogin -C chikubi
...
...
これで、ゾーンが出来上がり、ゾーン内からグローバルへ、ホストOSからゾーンへのSSHなども出きるはず、あとは普通に使いうだけ。

ゲストOSへVirtualBox Addonのインストール


つづいて、コピペとか、ホストOSのディスクをゲストOSへ共有させたりとか、自動でウインドウをリサイズできる機能を追加設定する(vmware-toolsみたいな)、ゲストOSで仮想CDROMをマウントさせる


メニューから選択すると、ゲストOSにCDROMがマウントされる


そうしましたら、以下のコマンドをrootで実行、Solarisですとグローバルゾーンで実行します

root@super-dev:~# cd /media/VBOXADDITIONS_4.3.18_96516/
root@super-dev:/media/VBOXADDITIONS_4.3.18_96516# pkgadd -G -d ./VBoxSolarisAdditions.pkg

The following packages are available:
  1  SUNWvboxguest     Oracle VM VirtualBox Guest Additions
                       (i386) 4.3.18,REV=r96516.2014.10.10.21.35

Select package(s) you wish to process (or 'all' to process
all packages). (default: all) [?,??,q]: 

Processing package instance <SUNWvboxguest> from </media/VBOXADDITIONS_4.3.18_96516/VBoxSolarisAdditions.pkg>

Oracle VM VirtualBox Guest Additions(i386) 4.3.18,REV=r96516.2014.10.10.21.35
Oracle Corporation
Using </> as the package base directory.
## Processing package information.
## Processing system information.
## Verifying package dependencies.
## Verifying disk space requirements.
## Checking for conflicts with packages already installed.
## Checking for setuid/setgid programs.

This package contains scripts which will be executed with super-user
permission during the process of installing this package.

Do you want to continue with the installation of <SUNWvboxguest> [y,n,?] y
...
...
...
Configuring VirtualBox guest kernel module...
VirtualBox guest kernel module loaded.
VirtualBox pointer integration module loaded.
Creating links...
Installing video driver for X.Org 1.14.5...
Configuring client...
Installing 64-bit shared folders module...
Installing 32-bit shared folders module...
Configuring services (this might take a while)...
Enabling services...
Updating boot archive...
Done.
Please re-login to activate the X11 guest additions.
If you have just un-installed the previous guest additions a REBOOT is required.

Installation of <SUNWvboxguest> was successful.
root@super-dev:/media/VBOXADDITIONS_4.3.18_96516# 

そしたら、rebootしましょう

再起動後、前より使い勝手が良くなっているはず、Addonの機能を有効にすればつかえるようになります。


この辺はLinuxでも同じように設定できます、vmware playerよりは細かいネットワーク設定ができるなかっていう感じがします。ビデオキャプチャーとかちょっとした機能があるところもいいですかね。

Macと仮想環境を共有出きるところもいいですね、ちなみに「JKと付き合っている」ことは内緒にしておいて下さい。


 


2015年6月6日土曜日

haskellでMeCab(形態素解析)をやってみた

お酒にやられた体に必要なものは、メカブです...

まずはインストール


超有名な形態素解析エンジンのMeCabさんをインストゥールする、まずは本体と辞書
karky7 ~ # emerge -pv app-text/mecab

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild  N     ] app-text/mecab-0.996::gentoo  USE="unicode -static-libs" 1,366 KiB
[ebuild  N     ] app-dicts/mecab-ipadic-2.7.0.20070801::gentoo  USE="unicode" 11,922 KiB

Total: 2 packages (2 new), Size of downloads: 13,288 KiB

 * IMPORTANT: 34 news items need reading for repository 'gentoo'.
 * Use eselect news read to view new items.

karky7 ~ # 
さすがgentoo一発ですね、つづいてMeCab Haskell
karky7 ~ # emerge -pv dev-haskell/mecab

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild   R   ~] dev-haskell/mecab-0.4.0-r1:0/0.4.0::haskell  USE="doc hoogle hscolour profile" 0 KiB

Total: 1 package (1 reinstall), Size of downloads: 0 KiB

 * IMPORTANT: 34 news items need reading for repository 'gentoo'.
 * Use eselect news read to view new items.

karky7 ~ # 

Haskellで動かしてみる


いっぱいオプションがあるのですが、わからないのでつかわない
{-# LANGUAGE OverloadedStrings #-}
import Text.MeCab

main :: IO()
main = do
  let str = [ "和人が和人でシャープA", "カズトも荒んでる",
              "ヨシロウトカズトガナイスガイ", "ヨシロウとカズトがナイスガイ" ]
  mapM_ putStr =<< mapM wakati str

wakati :: MeCabString s => s -> IO s
wakati str = new2 "-O wakati -l2" >>= parse' str

parse' :: MeCabString s => s -> MeCab -> IO s
parse' = flip parse
うごかしてみると、
~/Code/haskell/MeCab $ runghc MeCab5.hs
和人 が 和人 で シャープ A
カズト も 荒ん でる
ヨシロウトカズトガナイスガイ
ヨシロウ と カズト が ナイスガイ
~/Code/haskell/MeCab 
ヨシロウトカズトガカタカナでつながっていると分けられないようです、MeCabも分けられない強力な繋がりをもっているのでしょう...



2015年6月1日月曜日

HaskellのgetStdRandom関数

getStdRandomなにこれ?


手続き型言語の乱数生成ロジックになれた腐れ脳では、Haskellの乱数生成流儀についていくのがオックウになった今日この頃ではありますが、暇なのでSystem.Randomを弄って見ました。

乱数系の関数はSystem.Randomモジュールにあるのですがその中でgetStdRondom関数というのがあってこれがちょっと分かりにくかった。

その関数というのがこんな感じ、
Prelude> :m +System.Random
Prelude System.Random> :t getStdRandom
getStdRandom :: (StdGen -> (a, StdGen)) -> IO a
ちょっと使ってみる
Prelude System.Random> getStdRandom $ \g -> (random g, g)
(6296841432639150751,794839904 2103410263)
Prelude System.Random> getStdRandom $ \g -> (random g, g)
(6296841432639150751,794839904 2103410263)
Prelude System.Random>
結果は同じ、同じ乱数ジェネレータで乱数を生成しているため、同じ乱数しか返ってこない、これではこまる
getStdRandom関数は「StdGenを引数にとってタブル(値,乱数ジェネレータ)を返す関数」を引数にとるのですが、この時乱数ジェネレータを新しいものにするとそれを書き換えてくれるという便利な関数で、いたれりつくせりでちょっと分かりにくい。
で、どうなってるのか気になったのでソースコードをみてみた
...
theStdGen :: IORef StdGen
...
...
getStdRandom :: (StdGen -> (a,StdGen)) -> IO a
getStdRandom f = atomicModifyIORef theStdGen (swap . f)
  where swap (v,g) = (g,v)
theStdGenはIORefにくるまった乱数ジェネレータで、atomicModifyIORef関数は
Prelude System.Random> :m Data.IORef
Prelude Data.IORef> :t atomicModifyIORef
atomicModifyIORef :: IORef a -> (a -> (a, b)) -> IO b
Prelude Data.IORef> 
これは、「IORef aな変数とaをとって(更新後の値,戻値にしたい値)を返す関数」を引数にとるという頭が腐りそうになる関数らしく、IORefから乱数ジェネレータをはがして、それを第2引数の関数への入力へつかってその関数が返してきた、値と新しい乱数ジェネレータをもらって、値はそのまま返して、ついでに新乱数ジェネレータで旧乱数ジェネレータを更新する(であってるかどうか分かりませんが...)

長い...

第2引数のタプルは(値,乱数ジェネレータ)になっているのでswapしてる、なるほどぉー。
それが分かれば、こうやって使うのも自然に分かる
Prelude Data.IORef System.Random> :t randomR
randomR :: (Random a, RandomGen g) => (a, a) -> g -> (a, g)
Prelude Data.IORef System.Random> :t randomR (1, 100)
randomR (1, 100) :: (Random a, RandomGen g, Num a) => g -> (a, g)
Prelude Data.IORef System.Random> 
Prelude Data.IORef System.Random> getStdRandom $ randomR (1, 100)
95
この関数は範囲指定の乱数を生成してくれて、第1引数に範囲をしてすればgetStdRandomの引数に使える関数になる、ちなみにrandomRは新しい乱数ジェネレータを返してくれる。

リストで乱数が欲しいなら、こうして
Prelude> :m +System.Random
Prelude System.Random> :m +Control.Arrow
Prelude System.Random Control.Arrow> :t ((take 10) . fst . first randoms . split)
((take 10) . fst . first randoms . split)
  :: (Random a, RandomGen b) => b -> [a]
Prelude System.Random Control.Arrow> let gen = mkStdGen 10
Prelude System.Random Control.Arrow> :t ((take 10) . fst . first randoms . split) 
((take 10) . fst . first randoms . split)
  :: (Random a, RandomGen b) => b -> [a]
Prelude System.Random Control.Arrow> ((take 10) . fst . first randoms . split) gen
[429082465013243227,-2464015050900774578,7201080910402330150,-3257845164067810313,-4921980529382864518,1852978159347469817,8762143554925919814,-368579347710764073,-3030540427141715674,5472412\
645992684729]
Prelude System.Random Control.Arrow>
splitで乱数ジェネレータを更新しているので実行する度に違う乱数がちゃんと返ってくる、乱数生成にしても関数プログラミングでやるとまったく違ったアプローチになるのですね、やっぱ知っとかないとね。

とにかく、Haskellはたのしい。


2015年5月31日日曜日

アルチュハイマーな脳でも、モナドが何となく分かってきたような気がする

Real World Haskellの15.4章の「配管を隠す遊び」で掲載されているコードをちょっと弄ってみたものの、これであっているかどうかいまいち自信が持てないためブログに晒してみました
内容はStateモナドの詳細を隠すためのコードの書き方が掲載されています、そのまま直書きですとこんな感じ、
module Supply
       (
         Supply
       , next
       , runSupply
       ) where

import Control.Monad.State

newtype Supply s a = S (State [s] a)

unwrapS :: Supply s a -> State [s] a
unwrapS (S s) = s

instance Monad (Supply s) where
  s >>= m = S (unwrapS s >>= unwrapS . m)
  return = S . return

runSupply :: Supply s a -> [s] -> (a, [s])
runSupply (S m) xs = runState m xs

next :: Supply s (Maybe s)
next = S $ get >>= \st ->
             case st of
               [] -> return Nothing
               (x:xs) -> put xs >>= \_ -> return (Just x)
サンプルはnext関数を呼ぶとStateモナドが持っている状態のリストから1つづつ値を返してくるというコード、こうやってSupplyモナドを走らせる
*Supply> runSupply next [1,2,3,4,5]
(Just 1,[2,3,4,5])
これはこれでいいのですが、ghc-7.8.3で実行するとこんなエラーがでる
GHCi, version 7.8.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :load "/home/cuomo/Code/haskell/State/Supply5.hs"
[1 of 1] Compiling Supply      ( /home/cuomo/Code/haskell/State/Supply5.hs, interpreted )

/home/cuomo/Code/haskell/State/Supply5.hs:15:10: Warning:
    ‘Supply’ is an instance of Monad but not Applicative - this will become an error in GHC 7.10, under the Applicative-Monad Proposal.
Ok, modules loaded: Supply.
*Supply> 
「ghc-7.10だとエラーになるからSupplyのApplicativeインスタンスを書けよ」って脅かされる、なので自分でインスタンスを適当に書いてみた

...
import Control.Applicative
...

instance Applicative (Supply s) where
   pure = return
   (S mf) <*> (S m) = undefined
そしたら今度は「Functor書け」って怒られる始末、なのでいわれるがままにFunctorを書く
instance Functor (Supply s) where
  fmap f (S m) = undefined
これで、構文チェックはOKらしいが「undefined」なので詳細をつめる
instance Functor (Supply s) where
  fmap f (S m) = S $ f <$> m

instance Applicative (Supply s) where
   pure = return
   (S mf) <*> (S m) = S $ mf >>= \f -> f <$> m
これで警告やエラーはとまったがFuntor則にあってるかどうか確かめないとわからないので、確認してみる
第1法則「fmap id = id」の確認
*Supply> runSupply (id `fmap` next) [1,2,3,4,5] == runSupply next [1,2,3,4,5]
True
良さげ...
第2法則「fmap (f . g) = fmap f . fmap g」の確認
*Supply> :m +Data.Maybe
*Supply Data.Maybe> runSupply (fmap (id . fromJust) next) [1,2,3,4,5] == runSupply ((fmap id . fmap fromJust) next) [1,2,3,4,5]
True
という感じでいいのでしょうか?
next関数がMaybe値を返してくるのでfromMaybeを使って試してみました
そうするとこんな感じで使えるApplicativeだと
*Supply> runSupply (return (liftM (+1)) <*> next) [1,2,3,4,5]
(Just 2,[2,3,4,5])
何となくしっくり来た感があるのですが間違っていないでしょうか...ちなみに「アル中ハイマー」「アルチュハイマー」は別物です、どちらかといえば「アルチュハイマー」の方がかわいいです。



アルチュハイマーな型はこちらをどうぞ

2015年5月10日日曜日

Solaris11.2 pkgbuildでエラーのその後...


先日 @ftnk 先生にお願いしてあったpkgbuildのエラーの件で私なりに調べてみました。

Solaris の pkgbuild でエラーが出た場合の対処

で書いてあるように「/usr/lib/python2.6/vendor-packages/pkg/server/depot.py」にそれ系の設定があったのを思いだし、気にかかったので調べてみました。

でエラーの内容

Framework error: code: 28 reason: Operation too slow. Less than 1024 bytes/sec transfered the last 30


このエラーコード28とは「pycurl.E_OPERATION_TIMEOUTED」で定義されていて

>>> import pycurl
>>> pycurl.E_OPERATION_TIMEOUTED
28
>>>

こいつかraiseされて止まっているっぽい、コードでいうと

「/usr/lib/python2.6/vendor-packages/pkg/client/transport/engine.py:305」

    errors_seen += 1
else:
    timeout = en == pycurl.E_OPERATION_TIMEOUTED
    ex = tx.TransportFrameworkError(en, url, em,
        repourl=urlstem, uuid=uuid)
    repostats.record_error(decayable=ex.decayable,
        timeout=timeout)
    errors_seen += 1

ここでTransportFrameworkErrorが飛んできていました、でpycurlのTIMEOUT系のパラメータでグローバルな変数を調べて見ましたところ

PKG_CLIENT_CONNECT_TIMEOUT
PKG_CLIENT_LOWSPEED_TIMEOUT

という2パラメータを発見、このうちPKG_CLIENT_LOWSPEED_TIMEOUTはcurlの処理がストールしたかどうかを判断するための設定値らしくディフォルトだと

>>> pycurl.LOW_SPEED_TIME
20

で設定されていました、そしてこの値はオーバーライド出きるらしく以下のファイル、「/usr/lib/python2.6/vendor-packages/pkg/client/__init__.py」で定義されていて、

try:
# Number of seconds below lowspeed limit before # transaction is aborted. self.PKG_CLIENT_LOWSPEED_TIMEOUT = int(os.environ.get( "PKG_CLIENT_LOWSPEED_TIMEOUT", self.pkg_client_lowspeed_timeout_default)) except ValueError: self.PKG_CLIENT_LOWSPEED_TIMEOUT = \ self.pkg_client_lowspeed_timeout_default


このパラメータを環境変数にセットしておくとその値を使ってくれるっぽい、なので.bash_profileに以下を追加してみた

export PKG_CLIENT_LOWSPEED_TIMEOUT=3600

3600は適当

これで試した結果エラーが発生せずビルドに成功しました。
これでいいのかどうか不明ですが、非力なPCだった場合、この設定を増やした方が良さそうです、ちなみに調べた訳ではないのですが、この設定値を0に設定すると無限に待つような動きっぽいです。

たしかにローカルでpkgsendするならcurlじゃなくて直接ファイルに書いた方が早いような気もしますが、間違っていたらごめんなさい。

とりあえず @ftnk 先生ありがとうございました。



2015年5月8日金曜日

Solaris11でMySQL Cluster 7.4.6をやってみた

最近MySQL界隈のセミナーなどで耳にするMySQL Clusterに興味を持ってしまい、書籍などで調べてみたものの良く分からず、 どうしても実際にイジって見ないと気が済まないのでSolaris版を作ってやってみました。
MySQL Clusterの詳細は非常に奥深いので、私が適当な事を書くと叱られると思いますので、書籍やMySQLの先生方にお願いするとして(適当ですみません)、とりあえずSolarisゾーンで試してみる。

今回はSolarisゾーンへのインストールから初期動作までということで...



パッケージサーバーの準備


まずはインストールとか言われても、やる気が起きるわけがないので、こちらに用意しました。IPSサーバーを準備すればソースからのビルドは免れます。
gentoo install battleの猛者には叱られるかもしれません...

まずはゾーンを準備


構築環境
  • Gentoo Linux Linux 3.14.2-gentoo #7 SMP
  • Solaris11.1 x86 on vmware player


で仮想環境のSolaris上へ、準備するゾーンは全部で5つ、
  • iichiko2-spec(IPSパッケージ用)
  • mgm(マネージメントノード)
  • sql1(SQLノード1)
  • sql2(SQLノード2)
  • data1(データノード1)
  • data2(データノード2)

以上のゾーンで構成します、実際はvmware player for gentoo上の仮想環境上のSolaris11なのでその辺の環境の差は各自で調整してください。


iichiko2-specゾーン
create -b
set brand=solaris
set zonepath=/rpool/zones/iichiko2-spec
set autoboot=false
set ip-type=shared
add net
set address=192.168.254.103/24
set configure-allowed-address=true
set physical=net0
end
mgmゾーン
create -b
set brand=solaris
set zonepath=/rpool/zones/mgm
set autoboot=false
set ip-type=shared
add net
set address=192.168.254.80/24
set configure-allowed-address=true
set physical=net0
end
sql1ゾーン
create -b
set brand=solaris
set zonepath=/rpool/zones/sql1
set autoboot=false
set ip-type=shared
add net
set address=192.168.254.81/24
set configure-allowed-address=true
set physical=net0
end
sql2ゾーン
create -b
set brand=solaris
set zonepath=/rpool/zones/sql2
set autoboot=false
set ip-type=shared
add net
set address=192.168.254.82/24
set configure-allowed-address=true
set physical=net0
end
data1ゾーン
create -b
set brand=solaris
set zonepath=/rpool/zones/data1
set autoboot=false
set ip-type=shared
add net
set address=192.168.254.83/24
set configure-allowed-address=true
set physical=net0
end
data2ゾーン
create -b
set brand=solaris
set zonepath=/rpool/zones/data2
set autoboot=false
set ip-type=shared
add net
set address=192.168.254.84/24
set configure-allowed-address=true
set physical=net0
end

ゾーン作成とパッケージインストール


iichiko2-specを作成しIPSを利用できるようにする
global-zone ~ # zoneadm -z iichiko2-spec install
global-zone ~ # zlogin -C iichiko2-spec

IPS設定
root@iichiko2-spec:~# wget http://www.karky7.com/files/ips-mysql-cluster-7.4.6_2015.05.06.zfs.img.gz
root@iichiko2-spec:~# zfs create -p -o mountpoint=/var/pkglocal rpool/pkglocal
root@iichiko2-spec:~# gunzip < ips-mysql-cluster-7.4.6_2015.05.06.zfs.img.gz | zfs recv -F rpool/pkglocal
root@iichiko2-spec:~# svccfg -s application/pkg/server setprop pkg/inst_root=/var/pkglocal
root@iichiko2-spec:~# svccfg -s pkg/server setprop pkg/port=80
root@iichiko2-spec:~# svccfg -s svc:/application/pkg/server setprop pkg/readonly=true
root@iichiko2-spec:~# svcadm refresh pkg/server
root@iichiko2-spec:~# svcadm enable pkg/server

こんな画面が出ればOK、これでpkg installが可能になる



global-zone ~ # pkg set-publisher -g http://192.168.254.103 iichiko2-spec
global-zone ~ # pkg publisher
発行元                   タイプ ステータス P 場所
solaris                     起点   オンライン F http://192.168.254.100/
iichiko2-spec               起点   オンライン F http://192.168.254.103/
global-zone ~ #
続いて各サーバーを作成
global-zone ~ # zoneadm -z mgm install
global-zone ~ # zlogin -C mgm
とりあえずmgmゾーンでパッケージを入れて、後はゾーンのクローンで済ませる(面倒)

global-zone ~ # zlogin mgm
[Connected to zone 'mgm' pts/3]
Oracle Corporation      SunOS 5.11      11.1    September 2012
root@mgm:~# pkg install pkg://iichiko2-spec/database/mysql-cluster-gpl-74 \
pkg://iichiko2-spec/database/mysql-cluster-gpl-74/devel \
pkg://iichiko2-spec/database/mysql-cluster-gpl-74/doc \
pkg://iichiko2-spec/database/mysql-cluster-gpl-74/library \
pkg://iichiko2-spec/database/mysql-cluster-gpl-74/server \
pkg://iichiko2-spec/database/mysql-cluster-gpl-74/tests
           Packages to install:  6
       Create boot environment: No
Create backup boot environment: No
            Services to change:  1

DOWNLOAD                                PKGS         FILES    XFER (MB)   SPEED
Completed                                6/6   15897/15897  329.3/329.3  3.0M/s

PHASE                                          ITEMS
Installing new actions                   16957/16957
Updating package state database                 Done
Updating image state                            Done
Creating fast lookup database                   Done
root@mgm:~#
後はcloneで増産
global-zone ~ # zoneadm -z mgm shutdown
global-zone ~ # zoneadm -z sql1 clone mgm
global-zone ~ # zoneadm -z sql2 clone mgm
global-zone ~ # zoneadm -z data1 clone mgm
global-zone ~ # zoneadm -z data2 clone mgm
global-zone ~ # zoneadm -z sql1 boot
global-zone ~ # zoneadm -z sql2 boot
global-zone ~ # zoneadm -z data1 boot
global-zone ~ # zoneadm -z data2 boot
global-zone ~ # zlogin -C sql1
global-zone ~ # zlogin -C sql2
global-zone ~ # zlogin -C data1
global-zone ~ # zlogin -C data2
global-zone ~ # zoneadm -z mgm boot
全部揃うとこんな感じでゾーンが稼働中
  
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              solaris  shared
   3 iichiko2-spec    running    /rpool/zones/iichiko2-spec     solaris  shared
  10 sql1             running    /rpool/zones/sql1              solaris  shared
  11 sql2             running    /rpool/zones/sql2              solaris  shared
  12 data1            running    /rpool/zones/data1             solaris  shared
  13 data2            running    /rpool/zones/data2             solaris  shared
  14 mgm              running    /rpool/zones/mgm               solaris  shared

ここからMySQL Clusterの設定


マネージメントサーバーの設定
global-zone ~ # zlogin mgm
root@mgm:~# cp /etc/mysql/7.4/ndb-mgmd_74.config.sample /etc/mysql/config.ini
root@mgm:~# svcadm enable svc:/application/database/ndb-mgmd_74:default
root@mgm:~# ls -l /var/mysql/7.4/mgm/
total 7
-rw-r--r-- 1 mysql mysql    5 2015-05-07 08:03 ndb_1.pid
-rw-r--r-- 1 mysql mysql  687 2015-05-07 08:03 ndb_1_cluster.log
-rw-r--r-- 1 mysql mysql 4380 2015-05-07 08:03 ndb_1_config.bin.1
-rw-r--r-- 1 mysql mysql   81 2015-05-07 08:03 ndb_1_out.log
root@mgm:~#

とりあえずこんな感じで動く、他のゾーンはまだ動いてないよ
root@mgm:~# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=4 (not connected, accepting connect from 192.168.254.83)
id=5 (not connected, accepting connect from 192.168.254.84)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.254.80  (mysql-5.6.24 ndb-7.4.6)

[mysqld(API)]   2 node(s)
id=2 (not connected, accepting connect from 192.168.254.81)
id=3 (not connected, accepting connect from 192.168.254.82)

ndb_mgm>
各ゾーンのIPとIDが重要なので、変更する場合は各自で調整してください

data1の設定

IDがプロセスIDのpidファイル名に含まれてしまうので、ここは調整しておく
global-zone ~ # zlogin data1
root@data1:~# cp /etc/mysql/7.4/ndb-ndbmtd_74.my.cnf.ndb /etc/mysql/my.cnf
root@data1:~# svcprop svc:/application/database/ndb-ndbmtd_74:default | grep pid
ndb-ndbmtd_74/pid astring /var/mysql/7.4/data/ndb_5.pid
root@data1:~# svccfg -s  svc:/application/database/ndb-ndbmtd_74:default setprop ndb-ndbmtd_74/pid="/var/mysql/7.4/data/ndb_4.pid"
root@data1:~# svcadm refresh svc:/application/database/ndb-ndbmtd_74:default
root@data1:~# svcadm enable svc:/application/database/ndb-ndbmtd_74:default
root@data1:~# ls -l /var/mysql/7.4/data/
total 4
-rw-r--r-- 1 mysql mysql    5 2015-05-07 08:08 ndb_4.pid
-rw-r--r-- 1 mysql mysql 2227 2015-05-07 08:08 ndb_4_out.log
root@data1:~#

data2の設定
global-zone ~ # zlogin data2
root@data2:~# cp /etc/mysql/7.4/ndb-ndbmtd_74.my.cnf.ndb /etc/mysql/my.cnf
root@data2:~# svcprop svc:/application/database/ndb-ndbmtd_74:default | grep pid
ndb-ndbmtd_74/pid astring /var/mysql/7.4/data/ndb_5.pid
root@data2:~# svcadm enable svc:/application/database/ndb-ndbmtd_74:default
root@data2:~# svcs -xv
root@data2:~# ls -l /var/mysql/7.4/data/
total 4
-rw-r--r-- 1 mysql mysql    5 2015-05-07 08:10 ndb_5.pid
-rw-r--r-- 1 mysql mysql 2227 2015-05-07 08:10 ndb_5_out.log
root@data2:~#
sql1の設定
global-zone ~ # zlogin sql1
[Connected to zone 'sql1' pts/3]
Oracle Corporation      SunOS 5.11      11.1    September 2012
root@sql1:~# cp /etc/mysql/7.4/ndb-sql_74.my.cnf.sql /etc/mysql/my.cnf
root@sql1:~# svcadm enable svc:/application/database/ndb-sql_74:default
...ちょっと時間がかかります svcs -xvでエラーがでなければOKです
root@sql1:~# svcs -xv
root@sql1:~# 
root@sql1:~# ls -l /var/mysql/7.4/data/
total 110641
-rw-rw---- 1 mysql mysql       56 2015-05-07 08:13 auto.cnf
-rw-rw---- 1 mysql mysql 50331648 2015-05-07 08:13 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 2015-05-07 08:12 ib_logfile1
-rw-rw---- 1 mysql mysql 12582912 2015-05-07 08:13 ibdata1
drwx------ 2 mysql mysql       81 2015-05-07 08:12 mysql
drwx------ 2 mysql mysql       63 2015-05-07 08:12 ndbinfo
drwx------ 2 mysql mysql       55 2015-05-07 08:12 performance_schema
-rw-r----- 1 mysql mysql     3536 2015-05-07 08:14 sql1.err
-rw-rw---- 1 mysql mysql        3 2015-05-07 08:13 sql1.pid
drwx------ 2 mysql mysql        2 2015-05-07 08:12 test
root@sql1:~#
sql2の設定
global-zone ~ # zlogin sql2
[Connected to zone 'sql2' pts/3]
Oracle Corporation      SunOS 5.11      11.1    September 2012
root@sql2:~# cp /etc/mysql/7.4/ndb-sql_74.my.cnf.sql /etc/mysql/my.cnf
root@sql2:~# svcadm enable svc:/application/database/ndb-sql_74:default
root@sql2:~# ls -l /var/mysql/7.4/data/
total 110641
-rw-rw---- 1 mysql mysql       56 2015-05-07 08:16 auto.cnf
-rw-rw---- 1 mysql mysql 50331648 2015-05-07 08:16 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 2015-05-07 08:15 ib_logfile1
-rw-rw---- 1 mysql mysql 12582912 2015-05-07 08:16 ibdata1
drwx------ 2 mysql mysql       81 2015-05-07 08:15 mysql
drwx------ 2 mysql mysql       63 2015-05-07 08:15 ndbinfo
drwx------ 2 mysql mysql       55 2015-05-07 08:15 performance_schema
-rw-r----- 1 mysql mysql     3575 2015-05-07 08:16 sql2.err
-rw-rw---- 1 mysql mysql        4 2015-05-07 08:16 sql2.pid
drwx------ 2 mysql mysql        2 2015-05-07 08:15 test
root@sql2:~#

SQLノードでクラスタ利用可能か確認


sql1、sql2のどちらのSQLノードでもいいのでzloginし、mysqlコマンドで利用可能なストレージエンジンを確認してみる。
sol11-1dev ~ # zlogin sql1
[Connected to zone 'sql1' pts/5]
Oracle Corporation      SunOS 5.11      11.1    September 2012
root@sql1:~# mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.24-ndb-7.4.6 MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ndbcluster         | YES     | Clustered, fault-tolerant tables                               | YES          | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| ndbinfo            | YES     | MySQL Cluster system information storage engine                | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
11 rows in set (0.00 sec)
mysql>
「ndbcluster」ストレージエンジンが「YES」なら利用可能、この時点で感動していいレベル

クラスターを起動させる


まだデータノードは「not started」、SQLノードも「not connected」です。
これを起動するには「ALL START」コマンドで起動する、データノードのサービス開始をマネージメントノードから実行するように、データノードのmy.cnfに書いてあるので、データノードのサービススタートと同時にデーターノードが走り出さないような設定にしてあります。
ndb_mgm> ALL START

Node 4: Started (version 7.4.6)
Node 5: Started (version 7.4.6)

ndb_mgm>
ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=4    @192.168.254.83  (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0, *)
id=5    @192.168.254.84  (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.254.80  (mysql-5.6.24 ndb-7.4.6)

[mysqld(API)]   2 node(s)
id=2    @192.168.254.81  (mysql-5.6.24 ndb-7.4.6)
id=3    @192.168.254.82  (mysql-5.6.24 ndb-7.4.6)

ndb_mgm>
データノードへ*マークついて無事起動確認、データノード2台で1グループの設定で動作を確認できます(nodegroup 0)、SQLノードも接続できてます。

使ってみる


まずは簡単なことから始める、sql1ゾーンでクラスタ用テーブルをつくってみる、テーブルを作るときに「NDB」を指定して作成する。
root@sql1:~# mysql -u root
...
...
mysql> CREATE DATABASE IICHIKODB;
Query OK, 1 row affected (0.06 sec)

mysql> use IICHIKODB
Database changed
mysql> create table cava_club_user(id BIGINT PRIMARY KEY, name VARCHAR(256)) ENGINE NDB;
Query OK, 0 rows affected (0.42 sec)

mysql> INSERT INTO cava_club_user(id, name) VALUES('1', 'Kazuto');
Query OK, 1 row affected (0.01 sec)

mysql>
sql2ゾーンで先ほど入れたデータを確認してみる

root@sql2:~# mysql -u root
...
...
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| IICHIKODB          |
| mysql              |
| ndbinfo            |
| performance_schema |
| test               |
+--------------------+
6 rows in set (0.00 sec)

mysql>
mysql> use IICHIKODB
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> SELECT * FROM cava_club_user;
+----+--------+
| id | name   |
+----+--------+
|  1 | Kazuto |
+----+--------+
1 row in set (0.00 sec)

mysql>
すばらしい、細かいことは抜きにしてとりあえずデータのクラスタ化が確認できる。
こういったシステムは運用がしっかりしていないと大変な感じがしましたね、でもその辺がノウハウであるとも思いますが、PHP書きながら片手間で触るようなシステムではないようです(笑)...


2015年5月4日月曜日

Solaris11.2 pkgbuildでエラー

なぜかエラー


Solaris用のパッケージを作ってて、初めてのエラーに遭遇。
初めは自分で書いたspecが悪いと思って色々いじってみたものの、状況は変わらず...

いろんなマシンで試してみたのの、それも変わらず、どうもマシンのスペック不足だと思い、そこそこのサーバーでビルドしたら問題なくとおる。

最後のガッチャンコで、これは辛い、こんなエラー
pkgbuild: /export/home/karky7/packages/PKGS/SFEmysql-cluster-74-server/reloc/usr/mysql-cluster/7.4/support-files/mysqld_multi.server
pkgbuild: /export/home/karky7/packages/PKGS/SFEmysql-cluster-74-server/reloc/usr/mysql-cluster/7.4/support-files/solaris/postinstall-solaris
pkgbuild: /export/home/karky7/packages/PKGS/SFEmysql-cluster-74-server/reloc/var/svc/manifest/application/database/mysql-cluster-74.xml
pkgbuild: ## Validating control scripts.
pkgbuild: ## Packaging complete.
pkgbuild: WARNING: omitting library/perl-5/dbi-512 from the IPS manifest
pkgbuild: WARNING: omitting library/perl-5/dbd-mysql-512 from the IPS manifest
pkgbuild: WARNING: omitting data/mysql-cluster-gpl-74/library from the IPS manifest
pkgbuild: Calling script /export/home/karky7/packages/PKGMAPS/scripts/database%2Fmysql-cluster-gpl-74_ips.sh
pkgbuild: pkgsend: \'add\' failed for transaction ID \'1430692081_pkg%3A%2F%2Fiichiko3-spec%2Fdatabase%2Fmysql-cluster-gpl-74%407.4.6%2C5.11-0.11.2%3A20150503T222801Z\': 1: Framework error: code: 28 reason: Operation too slow. Less than 1024 bytes/sec transfered the last 30\\
 seconds
pkgbuild: URL: \'http://iichiko3-spec:80/add/0/1430692081_pkg%3A%2F%2Fiichiko3-spec%2Fdatabase%2Fmysql-cluster-gpl-74%407.4.6%2C5.11-0.11.2%3A20150503T222801Z/file\' (happened 3 times)
pkgbuild: 2: Framework error: code: 28 reason: Connection time-out
pkgbuild: URL: \'http://iichiko3-spec:80/add/0/1430692081_pkg%3A%2F%2Fiichiko3-spec%2Fdatabase%2Fmysql-cluster-gpl-74%407.4.6%2C5.11-0.11.2%3A20150503T222801Z/file\'
pkgbuild:
pkgbuild: Calling script /export/home/karky7/packages/PKGMAPS/scripts/database%2Fmysql-cluster-gpl-74%2Flibrary_ips.sh
pkgbuild: PUBLISHED
pkgbuild: pkg://iichiko3-spec/database/mysql-cluster-gpl-74/library@7.4.6,5.11-0.11.2:20150503T223807Z
pkgbuild: Calling script /export/home/karky7/packages/PKGMAPS/scripts/database%2Fmysql-cluster-gpl-74%2Fdoc_ips.sh
pkgbuild: PUBLISHED
pkgbuild: pkg://iichiko3-spec/database/mysql-cluster-gpl-74/doc@7.4.6,5.11-0.11.2:20150503T224304Z
pkgbuild: Calling script /export/home/karky7/packages/PKGMAPS/scripts/database%2Fmysql-cluster-gpl-74%2Ftests_ips.sh
pkgbuild: PUBLISHED
pkgbuild: pkg://iichiko3-spec/database/mysql-cluster-gpl-74/tests@7.4.6,5.11-0.11.2:20150503T224449Z
pkgbuild: Calling script /export/home/karky7/packages/PKGMAPS/scripts/database%2Fmysql-cluster-gpl-74%2Fdevel_ips.sh
pkgbuild: PUBLISHED
pkgbuild: pkg://iichiko3-spec/database/mysql-cluster-gpl-74/devel@7.4.6,5.11-0.11.2:20150503T224814Z
pkgbuild: Calling script /export/home/karky7/packages/PKGMAPS/scripts/database%2Fmysql-cluster-gpl-74%2Fserver_ips.sh
pkgbuild: PUBLISHED
pkgbuild: pkg://iichiko3-spec/database/mysql-cluster-gpl-74/server@7.4.6,5.11-0.11.2:20150503T224822Z
pkgbuild: Executing(%clean): /bin/bash /var/tmp/pkgbuild-karky7/pkgbuild-tmp-21.7750
pkgbuild: + umask 022
pkgbuild: + uname -a
pkgbuild: SunOS sol11_2-cbe 5.11 11.2 i86pc i386 i86pc Solaris
pkgbuild: + cd /export/home/karky7/packages/BUILD
pkgbuild: + cd mysql-cluster-gpl-7.4.6
pkgbuild: + rm -rf /var/tmp/pkgbuild-karky7/SFEmysql-cluster-74-7.4.6-build
pkgbuild: + exit 0
--- command output ends --- finished at Mon May  4 07:48:37 JST 2015

INFO: pkgbuild -ba finished at Mon May  4 07:48:37 JST 2015

INFO: SFEmysql-cluster-74 PASSED

pkgsendが時間かかりすぎで、「Framework error: code: 28 reason: Connection time-out」のあたりが怪しいが、これはもう @ftnk 先生にお願いするほかない...

pkg/socket_timeout count 600

この辺の調整でうまくいかないか?、なにせビルドが時間がかかる...

だれか超強力外人助っ人バリのサーバーくらさい...


2015年5月1日金曜日

焼肉λ@鈴木屋、1年ぶりにカリー化...

ご無沙汰です、ビールがうまかった...
 
思えばhaskellでつながって、リア充で疎遠になって、TwitterやFacebook上でしか安否確認できなかった皆さんにこうして1年ぶりにあえて、ホントに良かったです。



ただ、

「三島haskell無名関数の会」入信すると...
 

「結婚」できるって、

ホントかもしれない、これ伝説になるかもな...


止まりませんね、またみんなで飲みましょう



2015年4月21日火曜日

伊豆市リトルシニア 静岡蒲原シニアと練習試合やりました

久しぶりの野球ネタ


既に入団して早1年が過ぎ去りました...時間が経つのも早いものです。
入団以来、野球ネタは書いてなかったのですが、これからちょっとづつ書こうかとは思います。

今日は天城グラウンドで静岡蒲原シニアさんとの練習試合でした、若干曇りぎみ、雨もちょっとパラつきましたが、試合に支障ない程度で良かってです。

 

なんと!、女子が入団しました


まじかっ! 女子の入団だってぇー!

本日はたまたまだったのですが、新1年生で女子が入団するということで、みんなとはちょっと遅れた入団式だったのですが立ち会うことができました。


練習だって結構ハードなのに、この中で野球をやっていこうって凄い決断ですね、頭が下がります、たいしたもんです。

入団おめでとうございます、3年間頑張ってください。

男どもも負けてられないですね...

試合のほう


本日3試合、私は審判として出場しました(体力がないので交代制ですが)、野球のことはあまり詳しく知らないので試合の気の利いた説明とかはできませんが、1年前に比べたらみんなプレーが格好良く見えました。


とりあえず、お疲れさまでした、こう皆で並ぶとなかなか逞しくなったなぁーと少し感じる近頃です。


本日も審判業務が終了しました、で、最後はこれで締めましょう...


皆さん、朝早くから1日ご苦労さまでした、また頑張ります...

2015年4月18日土曜日

MySQL-5.6.24へQ4Mを入れ込んだgentooのebuildをつくりました

Q4Mを再び...


Socket遊びが終わらない和人くんはほっといて、Q4Mの新しいバージョンをgentooで使えるようにebuildを作成しました。 前回はMySQLの5.1用のプラグインとして作りましたが、もう古いということで新しめのMySQLとQ4Mで作り直しました。



インストール


既にMySQLをインストールされている方は気をつけてください まずこうして
karky7 ~ # layman -a karky7
バージョン指定でこうする
karky7 ~ # emerge -u "=dev-db/mysql-5.6.24::karky7"
サービスを開始
karky7 ~ # systemctl start mysqld
Q4Mのプラグインをインストール
karky7 ~ # mysql -u root < /usr/share/mysql/support-files/install.sql
確認
karky7 ~ # mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.6.24-log Source distribution

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show plugins;
+----------------------------+--------+--------------------+--------------------+---------+
| Name                       | Status | Type               | Library            | License |
+----------------------------+--------+--------------------+--------------------+---------+
| binlog                     | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| mysql_native_password      | ACTIVE | AUTHENTICATION     | NULL               | GPL     |
| mysql_old_password         | ACTIVE | AUTHENTICATION     | NULL               | GPL     |
| sha256_password            | ACTIVE | AUTHENTICATION     | NULL               | GPL     |
| MEMORY                     | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| MRG_MYISAM                 | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| CSV                        | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| MyISAM                     | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| PERFORMANCE_SCHEMA         | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| BLACKHOLE                  | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| InnoDB                     | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| INNODB_TRX                 | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_LOCKS               | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_LOCK_WAITS          | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP                 | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP_RESET           | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMPMEM              | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMPMEM_RESET        | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP_PER_INDEX       | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP_PER_INDEX_RESET | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_PAGE         | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_PAGE_LRU     | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_POOL_STATS   | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_METRICS             | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_DEFAULT_STOPWORD | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_DELETED          | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_BEING_DELETED    | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_CONFIG           | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_INDEX_CACHE      | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_INDEX_TABLE      | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_TABLES          | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_TABLESTATS      | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_INDEXES         | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_COLUMNS         | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_FIELDS          | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_FOREIGN         | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_FOREIGN_COLS    | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_TABLESPACES     | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_DATAFILES       | ACTIVE | INFORMATION SCHEMA | NULL               | GPL     |
| ARCHIVE                    | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| partition                  | ACTIVE | STORAGE ENGINE     | NULL               | GPL     |
| QUEUE                      | ACTIVE | STORAGE ENGINE     | libqueue_engine.so | GPL     |
+----------------------------+--------+--------------------+--------------------+---------+
42 rows in set (0.00 sec)
でQUEUEが入ります
 

Q4Mの罠


Q4Mのソースを追加してビルドをすると、ディフォルトのebuildでは以下のエラーでビルドできませんした。
...
...
...
/home/cuomo/workspace/mysql/mysql-5.6.23/storage/q4m/src/boost/static_assert.hpp:119:10: 備考: in expansion of macro ‘BOOST_JOIN’
          BOOST_JOIN(boost_static_assert_typedef_, __LINE__)
          ^
/home/cuomo/workspace/mysql/mysql-5.6.23/storage/q4m/src/boost/optional/optional.hpp:333:8: 備考: in expansion of macro ‘BOOST_STATIC_ASSERT’
        BOOST_STATIC_ASSERT ( ::boost::mpl::not_<is_reference_predicate>::value ) ;
        ^
In file included from /usr/include/features.h:366:0,
                 from /usr/include/assert.h:35,
                 from /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.3/include/g++-v4/cassert:43,
                 from /home/cuomo/workspace/mysql/mysql-5.6.23/storage/q4m/src/queue_cond.cc:1:
/usr/include/bits/mathcalls.h: 大域スコープ:
/usr/include/bits/mathcalls.h:153:1: エラー: declaration of C function ‘long double pow(long double, long double)’ conflicts with
 __MATHCALL (pow,, (_Mdouble_ __x, _Mdouble_ __y));
 ^
/usr/include/bits/mathcalls.h:153:1: エラー: previous declaration ‘double pow(double, double)’ here
 __MATHCALL (pow,, (_Mdouble_ __x, _Mdouble_ __y));
 ^
In file included from /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.3/include/g++-v4/complex:44:0,
                 from /home/cuomo/workspace/mysql/mysql-5.6.23/storage/q4m/src/boost/type_traits/is_complex.hpp:12,
                 from /home/cuomo/workspace/mysql/mysql-5.6.23/storage/q4m/src/boost/type_traits.hpp:81,
                 from /home/cuomo/workspace/mysql/mysql-5.6.23/storage/q4m/src/boost/spirit/home/classic/core/parser.hpp:12,
                 from /home/cuomo/workspace/mysql/mysql-5.6.23/storage/q4m/src/boost/spirit/home/classic/core.hpp:29,
                 from /home/cuomo/workspace/mysql/mysql-5.6.23/storage/q4m/src/boost/spirit/include/classic_core.hpp:11,
                 from /home/cuomo/workspace/mysql/mysql-5.6.23/storage/q4m/src/boost/spirit/core.hpp:25,
                 from /home/cuomo/workspace/mysql/mysql-5.6.23/storage/q4m/src/queue_cond.cc:4:
/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.3/include/g++-v4/cmath: 関数 ‘long double std::pow(long double, long double)’ 内:
/usr/lib/gcc/x86_64-pc-linux-gnu/4.8.3/include/g++-v4/cmath:411:39: エラー: ‘long double std::pow(long double, long double)’ conflicts with previous using declaration ‘long double pow(long double, long double)’
   pow(long double __x, long double __y)
                                       ^
In file included from /home/cuomo/workspace/mysql/mysql-5.6.23/storage/q4m/src/queue_cond.cc:13:0:
/home/cuomo/workspace/mysql/mysql-5.6.23/storage/q4m/src/queue_cond.h: メンバ関数 ‘queue_cond_t::value_t queue_cond_t::pow_func::bop(const queue_cond_t::value_t&, const queue_cond_t::value_t&) const’ 内:
/home/cuomo/workspace/mysql/mysql-5.6.23/storage/q4m/src/queue_cond.h:274:69: エラー: オーバーロードされている ‘pow(const long long int&, const long long int&)’ の呼び出しが曖昧です
       return value_t::int_value(static_cast<long long>(powl(x.l, y.l)));
                                                                     ^
/home/cuomo/workspace/mysql/mysql-5.6.23/storage/q4m/src/queue_cond.h:274:69: 備考: 候補:
In file included from /usr/include/features.h:366:0,
                 from /usr/include/assert.h:35,
                 from /usr/lib/gcc/x86_64-pc-linux-gnu/4.8.3/include/g++-v4/cassert:43,
                 from /home/cuomo/workspace/mysql/mysql-5.6.23/storage/q4m/src/queue_cond.cc:1:
/usr/include/bits/mathcalls.h:153:1: 備考: double pow(double, double)
 __MATHCALL (pow,, (_Mdouble_ __x, _Mdouble_ __y));
 ^
<コマンドライン>:0:6: 備考: long double pow(long double, long double)
In file included from /home/cuomo/workspace/mysql/mysql-5.6.23/storage/q4m/src/queue_cond.cc:13:0:
/home/cuomo/workspace/mysql/mysql-5.6.23/storage/q4m/src/queue_cond.h:275:5: 警告: 制御が非 void 関数の終りに到達しました [-Wreturn-type]
     }
     ^
storage/q4m/CMakeFiles/queue.dir/build.make:57: ターゲット 'storage/q4m/CMakeFiles/queue.dir/src/queue_cond.cc.o' のレシピで失敗しました
make[2]: *** [storage/q4m/CMakeFiles/queue.dir/src/queue_cond.cc.o] エラー 1
CMakeFiles/Makefile2:596: ターゲット 'storage/q4m/CMakeFiles/queue.dir/all' のレシピで失敗しました
make[1]: *** [storage/q4m/CMakeFiles/queue.dir/all] エラー 2
Makefile:136: ターゲット 'all' のレシピで失敗しました
make: *** [all] エラー 2
...
...
pow()関数がconflictしてると起こられます、色々調べてみましたがどうやら、cmakeのオプションの -DWITH_ZLIB=system がQ4Mだとダメらしく、これを -DWITH_ZLIB=bundled にする必要があるようです、このオプションはCOMPRESS()関数などで使うらしいのですが、これをMySQL提供のzlibにするか、システムにインストールされているzlibを利用するかの選択のオプションで、ディフォルトだとsystemになっています。

gentooのディフォルトのebuildが-DWITH_ZLIB=systemでハードコードされていたので、これを修正しました。 多分、どちらのzlibでも動くと思うのですが、たぶんヘッダーのincludeに問題があるような気がします、RedHatでも同じエラーが出てるような気がしました。 時間があれば、ソースコードを追っかけてみます、っていってそのままが多いのですが...

最後にcmakeのオプションサンプル


cmakeのオプションはこんな感じ、参考程度に、MySQL-5.6.23ですが....
cmake --no-warn-unused-cli \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_C_FLAGS_RELWITHDEBINFO=-DNDEBUG \
-DCMAKE_CXX_FLAGS_RELWITHDEBINFO=-DNDEBUG \
-DCMAKE_INSTALL_PREFIX=/usr \
-DMYSQL_DATADIR=/var/lib/mysql \
-DSYSCONFDIR=/etc/mysql \
-DINSTALL_BINDIR=bin \
-DINSTALL_DOCDIR=share/doc/mysql-5.6.23 \
-DINSTALL_DOCREADMEDIR=share/doc/mysql-5.6.23 \
-DINSTALL_INCLUDEDIR=include/mysql \
-DINSTALL_INFODIR=share/info \
-DINSTALL_LIBDIR=lib64 \
-DINSTALL_ELIBDIR=lib64/mysql \
-DINSTALL_MANDIR=share/man \
-DINSTALL_MYSQLDATADIR=/var/lib/mysql \
-DINSTALL_MYSQLSHAREDIR=share/mysql \
-DINSTALL_MYSQLTESTDIR=share/mysql/mysql-test \
-DINSTALL_PLUGINDIR=lib64/mysql/plugin \
-DINSTALL_SBINDIR=sbin \
-DINSTALL_SCRIPTDIR=share/mysql/scripts \
-DINSTALL_SQLBENCHDIR=share/mysql \
-DINSTALL_SUPPORTFILESDIR=/usr/share/mysql \
-DWITH_UNIT_TESTS=OFF \
-DWITH_LIBEDIT=0 \
-DWITH_ZLIB=system \
-DWITHOUT_LIBWRAP=1 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_UNIX_ADDR=/var/run/mysqld/mysqld.sock \
-DINSTALL_UNIX_ADDRDIR=/var/run/mysqld/mysqld.sock \
-DWITH_SSL=system \
-DWITH_DEFAULT_COMPILER_OPTIONS=0 \
-DWITH_DEFAULT_FEATURE_SET=0 \
-DENABLE_DTRACE=OFF \
-DWITH_EDITLINE=bundled \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=all \
-DMYSQL_USER=mysql \
-DMYSQL_UNIX_ADDR=/var/run/mysqld/mysqld.sock \
-DDISABLE_SHARED=OFF \
-DWITH_debug=OFF \
-DWITH_DEBUG=OFF \
-DWITH_Debug=OFF \
-DWITH_EMBEDDED_SERVER=OFF \
-DWITH_profiling=OFF \
-DWITH_PROFILING=OFF \
-DWITH_Profiling=OFF \
-DENABLE_DTRACE=OFF \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_CSV_STORAGE_ENGINE=1 \
-DWITH_HEAP_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MYISAMMRG_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=OFF \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_INSTALL_DO_STRIP=OFF