2017年8月26日土曜日

Illumos build方法

2019/09/21 修正

illumosのカーネルビルド方法は
https://illumos.org/docs/developers/build/
に書かれている

開発環境は、
OpenindianaまたはOmniOS
がよい


以下 Openindianaの場合
Openindianaのインストールは、
https://www.openindiana.org/download/
USB版をダウンロードしliveUSBを作成する。
virtualBoxではDVD版をダウンロードする
Liveは、GUI
Text Installは、server用

インストール方法は、
http://docs.openindiana.org/handbook/getting-started/#installing-openindiana
に書かれている。
liveUSBの作り方
Linux/OS Xの場合は、
# dd bs=4M if=./image.usb of=/dev/sdX status=progress && sync
sdXは適切な値に変更する。


システムが起動したら

まずはシステムを最新にする。
sudo pkg update

開発環境のインストール
sudo pkg install build-essential \
    runtime/python-35 \
    developer/gcc-7
このコマンドでgit gccなどがインストールされる

ソースコードを取得する。
ディレクトリcodeを作成する。(code以外の名前でもよい)
(codeの場所はどこでも良い。通常のユーザー特権で作成する。)
$cd code
$git clone https://github.com/illumos/illumos-gate.git

クローズドバイナリーの取得は、openindiana,omniOSでは不要
illumosは、まだ一部クローズドバイナリーがあるが、あたらいopenindiana,omniOSでは
/opt/onbld/closedにインストールされている。


illumos.shをコピーし修正する。
$cd ~/code/illumos-gate
$cp usr/src/tools/env/illumos.sh .
$vi illumos.sh       # or your favourite editor instead of @vi@


最終行に下記を追加する。
#
# Set a package version number which is greater than the current OpenIndiana
# build number.  Note that ONNV_BUILDNUM is ignored if PKGVERS_BRANCH is set:
#
export PKGVERS_BRANCH=9999.99.0.0

#
# Set to current version of Perl shipped with OpenIndiana:
#
export PERL_VERSION="5.22"
export PERL_PKGVERS="-522"

#
# If you are building on the latest OpenIndiana (2017-03-07 and later), use
# OpenJDK 8:
#
export BLD_JAVA_8=

#
# IPS packages published at 2019-08-08 and later ship only Python 3.5 modules,
# so you have to use this Python version to build illumos tools
# if your pkg:/package/pkg version is 0.5.11-2019.0.0.5521 or later.
#
export BUILDPY2TOOLS="#"
 
#
# Use the copy of the closed binaries that comes with the "build-essential"
# package:
#
export ON_CLOSED_BINS="/opt/onbld/closed"




ビルドの実行
$cd ~/code/illumos-gate
$time ksh93 usr/src/tools/scripts/nightly.sh illumos.sh

ログの参照
$tail -f ~/code/illumos-gate/log/nightly.log

追加ビルドは、-i オプションを付ける
$cd /code/illumos-gate
$time ksh93 usr/src/tools/scripts/nightly.sh -i illumos.sh


インストール方法
beadmを使用して、BEを作成しインストールする。



2017年8月21日月曜日

cakephp

cakephp インストール

phpのバージョンチェック
php -v

インストールする場所に移動して
php composer.phar create-project --prefer-dist cakephp/app my_app_name
または
composer self-update && composer create-project --prefer-dist cakephp/app my_app_name

インストールできたかテスト
bin/cakephp server

http://localhost:8765


2017年7月9日日曜日

CentOS-7 kernel build方法

CentOSは、Redhatのクローンらしくて、個人でbuildするのは、筋違いのようである。
開発したいのならfedoraでやろうということのようである。
https://wiki.centos.org/HowTos/Custom_Kernelにかかれていることをメモしとく。

開発環境の構築
$su
#yum groupinstall "Development Tools"
#yum install ncurses-devel
#yum install qt-devel (This is only necessary if you wish to use make xconfig instead of make gconfig or make menuconfig.)
#yum install hmaccalc zlib-devel binutils-devel elfutils-libelf-devel
#yum install kernel-devel
#yum install rpm-build redhat-rpm-config asciidoc hmaccalc perl-ExtUtils-Embed pesign xmlto 
#yum install audit-libs-devel binutils-devel elfutils-devel elfutils-libelf-devel
#yum install ncurses-devel newt-devel numactl-devel pciutils-devel python-devel zlib-devel
#exit


ソースコードの取得

$ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
$ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
(この二行は実行しなくてもできた)

下記の場所からパッケージを探す
http://vault.centos.org/7.N.YYMM/os/Source/SPackages/
http://vault.centos.org/7.N.YYMM/updates/Source/SPackages/


$ rpm -i http://vault.centos.org/7.3.1611/updates/Source/SPackages/kernel-3.10.0-514.26.2.el7.src.rpm  2>&1 | grep -v exist

$ cd ~/rpmbuild/SPECS
$ rpmbuild -bp --target=$(uname -m) kernel.spec

以上でソースコードが ~/rpmbuild/BUILD に作られる

モジュール関係でエラーが発生する場合は、yumで追加、updateする。


kernel specification fileの修正

$ cd ~/rpmbuild/SPECS/
$ cp kernel.spec kernel.spec.distro
$ vi kernel.spec

%define buildid .your_identifier

注意 %とdefineの間にスペースを入れない
  buildidーを変更しないと現在動作中のカーネルを書き換えてしまう。


$rpmbuild -bb --target=`uname -m` kernel.spec 2> build-err.log | tee build-out.log

~/rpmbuild/RPMS/`uname -m`/ にrpmファイルができる




2017年2月10日金曜日

JavaScript thisについて考える

MDNには、JavaScriptのthisは、C++なんかの言語とは動作が違うと書かれてる。
thisは、コンストラクターとしてのfunctionのために作られたみたいで、コンストラクター以外では、意味のないものらしい(厳密には、call,apply,bindではthisは、有効になる)

function fn1(){
  var a="abc";
  console.log(this.a);
}

fn1.();   // undefined
fn1.call({a:"fff",}); // fff

thisのうまく動作しない例
function fn2(){
    this.a = "abc";
    this.subfn1 = function(){setTimeout( this.subfn2,1000);}
    this.subfn2 = function(){console.log(this.a);}
}
var a = "window scope";
var xx = new fn2();

xx.subfn1();   // window scope

仕様どうりの動作なのだ。プログラマとしては、abcを出力してほしいのだがそうはならない。
thisは、実行環境を返すというわけのわからない仕様なのだ。
xx.subfn1()とsetTimeoutのコールバックとでは、実行環境が違うのだそうだ。そんなことはプログラマにはわからないし、言語仕様としては不自然である。なんとなく、実装ミスをそのまま仕様にしたような感じがする。

きちんと動作させるために
function fn2(){
    var self = this;   // <==こんなこと
    this.a = "abc";
    this.subfn1 = function(){setTimeout( self.subfn2,1000);}
    this.subfn2 = function(){console.log(self.a);}
}
var xx = new fn2();
xx.subfn1();    // abc

 こんなこと   "var self = this" するのだが、
thisなんか使わなくてもできてしまう。

function fn2(){
    var self = {
      a : "abc",
      subfn1 : function(){setTimeout( self.subfn2,1000);},
      subfn2 : function(){console.log(self.a);},
    }
    return self;
}
var xx = fn2();
xx.subfn1();    // abc



2017年2月4日土曜日

javascript の classは必要なのか

javascriptのpython化が進んでいるそうです。

さて、javascriptにクラスが追加されて、またいらない文法を追加しやがってと嘆いている方もいるかと思います。classがなくても同じようなことができるということです。
もともとjavascriptの流儀としては、functionをコンストラクターとして使うのです。

MDNにある例は、
class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

  static distance(a, b) {
    const dx = a.x - b.x;
    const dy = a.y - b.y;

    return Math.sqrt(dx*dx + dy*dy);
  }
}

const p1 = new Point(5, 5);
const p2 = new Point(10, 10);

console.log(Point.distance(p1, p2));
--------------
このようにできる。newもつかわないようにした。

function Point(x,y){
  return{
    x: x,
    y: y,
    distance: function(a, b) {
        var dx = a.x - b.x;
        var dy = a.y - b.y;

        return Math.sqrt(dx*dx + dy*dy);
    },
 }
}

var p1 = Point(5, 5);
var p2 = Point(10, 10);

console.log(Point().distance(p1, p2));

個人的には、クラスのstaticメソドてのは疑問

次の例
class Animal { 
  constructor(name) {
    this.name = name;
  }
  
  speak() {
    console.log(this.name + ' makes a noise.');
  }
}

class Dog extends Animal {
  speak() {
    console.log(this.name + ' barks.');
  }

}


これは
function Animal(name) {
  return{
    name : name,
    speak : function() {
       console.log(this.name + ' makes a noise.');
    },
  }
}

function Dog(name){
  var dog = Animal(name);
  dog['speak']=function() {
      console.log(this.name + ' barks.');
    }; 
  return dog;
}
こんな感じ

いろんな書き方ができるので、classを使って統一しようという流れみたいです。でもextendsとかsuperとかキーワードが増えるし、java派は、setやgetがほしいとか言うし面倒ですね。
getter,setterてもういらない機能なのに...




2017年1月14日土曜日

面倒だ

4年ほど前に、某社におさめたcakePHPで書いたシステムを他でも使いたいという嬉しい話をいただいた。ホストは、windowsでもmacでもLinuxでも動くし、クライアントもsafari,chrom,ieなどではテストしている。帳票や会社名をちょっと直して、プリンターの設定をすれば、とりあえず仕事は終わりなのだ。しかしメインの開発環境がmacであったため、MacのOSアップデートとともに、開発環境が動かなくなっているのである。なんとか環境を作り直したが、フレームワークとpostgresqlのバージョンが少しちがっている。現状のシステムは、windowでうごいているので、テスト環境はなんとかwindow上に構築できた。4年間で、webアプリの環境もかなり変わってきているし、今後もメンテナンスが必要なら、最新のフレームワークに置き換えたいとこである。でも費用はどこからもでない。勉強を兼ねて、Angular?+Laravel ? Rails? Code Igniter? cakePHP? Python? で作り直すかな。

JavaScript let

ES6で追加になったJavaScript letの例として下記のコードが出てた
var list = document.getElementById("list");

for (let i = 1; i <= 5; i++) {
  let item = document.createElement("li");
  item.appendChild(document.createTextNode("Item " + i));

  item.onclick = function (ev) {
    console.log("Item " + i + " is clicked.");
  };
  list.appendChild(item);
}

letのところをvarにすると、どの行をクリックしても"Item 6 is clicked."となってしまう。
letなら上手くいく。

さてwindows7あたりのIEだとまだletがサポートされてなくて上手くいかない。
  a="Item " + i + " is clicked."
  item.onclick = function (ev) {
    console.log(a);
  };
 なんてすると、なぜか上手く動いてしまう。IEの不具合だとおもう。現在のchrom等のブラウザだと上手くいかない。

昔書いたコードにたまたま動いているやつがいて、ブラウザが新しくなると動かなくなるるのではないかとヒヤリとしている。

昔の環境での正解はなんだろう。タグのプロパティー(例えばvalue)としてiの値を埋め込んでやり、実行時に読み出すのかな。