2021年6月19日土曜日

Python 3.9環境でTensorflowインストールが失敗する(Windows10)

TensorFlow2のインストールでエラー


Windows版Python 3.9が導入された環境にTensorFlow2をpipインストールしようとしたらエラーが出た。 
ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory~client_load_reporting_filter.h

 ファイルが見付からないというエラーだった。


解決方法


Window10ではデフォルトでファイルのパス名の長さが260までに制限されている。
その為に構成ファイルにアクセスができず、ファイルが見付からないというエラーとなっていた。
この問題を解決するには、ファイルのパス名の長さ制限を解除しなければならない。

ローカルグループポリシーエディタでファイルのパス名の長さ制限を解除できる。(Windows10 proの場合)

ファイル名を指定して実行>gpedit.msc>「コンピュータの構成」>「管理用テンプレート」>「システム」>「ファイルシステム」>「Win32の長いパスを有効にする」の設定を変更する。
規定では「未構成」だったが、「有効」に変更して、新しいコマンドプロンプト(管理者権限)を開いて実行すると、インストールが成功した。

なお、ローカルグループポリシーエディタ以外には、レジストリエディタで下記の値を変更する事でも、パスの長さ制限を解除できる。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled の 0を1に変更。
以上。



2020年11月27日金曜日

アプリケーションを常に「管理者として実行」させるには

アプリケーションを常に「管理者として実行」させるには

該当のExeのプロパティを開く > プロパティウィンドウの「互換性」タブを開く > 「設定」から、「管理者としてこのプログラムを実行する」を探し、チェックする。

2019年2月9日土曜日

【Java】配列やコレクションのソートいろいろ

Java配列をソートするコードを書く

Java配列をソートするコードを書く

いざJavaでコードを書かなければならないという時、配列のソートを思い出すのに苦労することが多いので、備忘も兼ねて、ここにアウトプットしてしまいます。
検討項目
  • プリミティブ型な値を一つだけ持つ配列をソートする
    • ArrayListに変換した後、SortやparallelSortを使う
  • 複数のフィールドを持つ要素の単一のフィールドをソートキーにしてソートする
    • SortやparallelSortを使う。Comparableを継承したフィールド定義クラスを作ったり、Comparatorクラスを実装した比較用クラスを作ったりする。lambdaも使える。
  • 複数のフィールドを持つ要素について、複数のフィールドを優先度付きソートキーにしてソートする
    • 上記同

プリミティブ型な値を一つしか持たない配列をソートする

arraysのソートを活用する

import java.util.Arrays;

class Main {
  public static void main(String[] args) {
    int score[] = { 4, 2, 0, 3, 1 };
    Arrays.sort(score);
    for (int item : score) {
      System.out.print(item + " ");
    }
  }
}
実行結果
java version "1.8.0_31"
Java(TM) SE Runtime Environment (build 1.8.0_31-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)
0 1 2 3 4

複数のフィールドを持つ要素の単一のフィールドをソートキーにしてソートする

SortやparallelSortを使う。フィールドを持つComparableを継承したクラスも作る。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Player implements Comparable {
    private int ranking;
    private String name;
    private int age;

    public Player(int ranking, String name, int age) {
        this.ranking = ranking;
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Player o) {
        return (this.getRanking() - o.getRanking());
    }
    public int getRanking() {
        return ranking;
    }
    @Override
    public String toString() {
        return ranking + " " + name;
    }
}

public class Main {
  public static void main(String[] args) {
    List footballTeam = new ArrayList();

    footballTeam.add(new Player(23, "たかし", 24));
    footballTeam.add(new Player(16, "ひろし", 20));
    footballTeam.add(new Player(18, "けんた", 22));

    System.out.println("Before Sorting : " + footballTeam);
    Collections.sort(footballTeam);
    System.out.println("After Sorting : " + footballTeam);
  }
}
別解。既存かつ変更できないクラスに対し、Comparatorを使って、ソートする。(Java8以降)

import java.util.*;

class Player {
    private int ranking;
    private String name;
    private int age;
    public Player(int ranking, String name, int age) {
        this.ranking = ranking;
        this.name = name;
        this.age = age;
    }
    public int getRanking() {
        return ranking;
    }
    @Override
    public String toString() {
        return ranking + " " + name;
    }
}

class PlayerRankingComparator implements Comparator<Player> {
    public int compare(Player firstPlayer, Player secondPlayer) {
        return (firstPlayer.getRanking() - secondPlayer.getRanking());
    }
}

public class Main {
  public static void main(String[] args) {
    PlayerRankingComparator playerComparator = new PlayerRankingComparator();
    List footballTeam = new ArrayList<Player>();

    footballTeam.add(new Player(23, "たかし", 24));
    footballTeam.add(new Player(16, "ひろし", 20));
    footballTeam.add(new Player(16, "けんた", 22));

    System.out.println("Before Sorting : " + footballTeam);
    Collections.sort(footballTeam, playerComparator);
    System.out.println("After Sorting : " + footballTeam);
  }
}
ComparatorをLambdaにしてやれば、comparator継承クラスも必要なくなる。

import java.util.*;

class Player  {
    private int ranking;
    private String name;
    private int age;

    public Player(int ranking, String name, int age) {
        this.ranking = ranking;
        this.name = name;
        this.age = age;
    }

    public int getRanking() {
        return ranking;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return age + " " + name;
    }
}

public class Main {
  public static void main(String[] args) {
    Comparator<Player> byAge = (Player player1, Player player2) -> 
           player1.getAge() - player2.getAge();
    //Comparator byAge = Comparator.comparingInt(Player::getAge); こちらでも可
    List footballTeam = new ArrayList<Player>();

    footballTeam.add(new Player(23, "たかし", 24));
    footballTeam.add(new Player(16, "ひろし", 20));
    footballTeam.add(new Player(18, "けんた", 22));

    System.out.println("Before Sorting : " + footballTeam);
    Collections.sort(footballTeam, byAge);
    System.out.println("After Sorting : " + footballTeam);
  }
}

複数のフィールドを持つ要素について、複数のフィールドを優先度付きソートキーにしてソートする

import java.util.*;

class Player implements Comparable<Player> {
    private int ranking;
    private String name;
    private int age;

    public Player(int ranking, String name, int age) {
        this.ranking = ranking;
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Player o) {
        if (this.getRanking() == o.getRanking()) {
          return (this.getAge() - o.getAge());
        } else {
          return (this.getRanking() - o.getRanking());
        }
    }
    public int getRanking() {
        return ranking;
    }
    public int getAge() {
        return age;
    }
    @Override
    public String toString() {
        return ranking + " " + age + " " + name;
    }
}

public class Main {
  public static void main(String[] args) {
    List<Player> footballTeam = new ArrayList<Player>();

    footballTeam.add(new Player(23, "たかし", 24));
    footballTeam.add(new Player(16, "ひろし", 22));
    footballTeam.add(new Player(18, "けんた", 20));
    footballTeam.add(new Player(16, "しげき", 18));

    System.out.println("Before Sorting : " + footballTeam);
    Collections.sort(footballTeam);
    System.out.println("After Sorting : " + footballTeam);
  }
}
結果
java version "1.8.0_31"
Java(TM) SE Runtime Environment (build 1.8.0_31-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)
Before Sorting : [23 24 たかし, 16 22 ひろし, 18 20 けんた, 16 18 しげき]
After Sorting : [16 18 しげき, 16 22 ひろし, 18 20 けんた, 23 24 たかし]
Lambdaで記載してみる。
import java.util.*;

class Player  {
    private int ranking;
    private String name;
    private int age;

    public Player(int ranking, String name, int age) {
        this.ranking = ranking;
        this.name = name;
        this.age = age;
    }

    public int getRanking() {
        return ranking;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return ranking + " " + age + " " + name;
    }
}

public class Main {
  public static void main(String[] args) {
    Comparator<Player> byRankAndAge = ( 
     (Player player1, Player player2) -> 
     {
       if (player1.getRanking() == player2.getRanking()) {
         return (player1.getAge() - player2.getAge());
       } else {
         return (player1.getRanking() - player2.getRanking());
       }
     }
    ); 

    List<Player> footballTeam = new ArrayList<Player>();

    footballTeam.add(new Player(23, "たかし", 24));
    footballTeam.add(new Player(16, "ひろし", 22));
    footballTeam.add(new Player(18, "けんた", 20));
    footballTeam.add(new Player(16, "しげき", 18));

    System.out.println("Before Sorting : " + footballTeam);
    Collections.sort(footballTeam, byRankAndAge);
    System.out.println("After Sorting : " + footballTeam);
  }
}


Java学習ならこの本。第3版には、LambdaやStreamなど、Java8から追加されたイディオムもしっかり載っています。オススメ。

2017年9月12日火曜日

究極の速読法 ~リーディングハニーⓇ6つのステップ~ を読んで、やる気が出た話(書評)

速読法は本当に存在するものなんでしょうか。
一冊10分とか、ビジネスリーダーが備えるべき技能で、とか、どうもうさんくさいですね。
とはいえ、本が早く読めるというのは、様々な知識を僅かな時間で吸収できるということになるので、技能があれば、たしかに便利なはず。

そこで速読法をためしてみたくなり、速読に関する本を探したわけす。
できるだけ「うさんくさくないの」というテーマで、私が辿りついたのが、この本です。



「うさんくさくないの」ですかね。これ。


速読以前に「本が読めない」という事がある


若者の活字離れが叫ばれる昨今、実は、活字から離れているのは若者だけではなく、社会人全般、活字から離れているのが現状です。

たとえば、ビジネスマンの中には信奉者の多いピータードラッカー
彼の名前を知っている人は多いと思いますが、彼の書籍を通読出来た人は、実際そんなに居ないと思います。
今回紹介する本でも、ドラッカーの本を通読できている人が非常に少ない点が指摘されています。その理由としては、難しくて内容について行けない、というのももありますが、そもそも読む為のスキルが足りてない、本を読むための基本のスキルが無いという事が多いのだと、この本は指摘しています。
本を読む為の基本的スキルが備わっていないと、途中で挫折する事になるというのです。ドラッカーを読もうと思った事は無いのですが、そのままやれば、自分もきっと挫折する一人でしょう。

本書では、本を読むスキルには4つのステージがあるとしています。どんな本でも素早く読めるのが「ステージ4」、業務など自分の興味のあるテーマに関連する短く書かれた書籍なら読める、というのが、「ステージ3」になります。多くの人が、この「ステージ3」に位置する事になります。
そうです。大多数の人は、自分に関係のある本なら、文章量には依るものの、だいたい最後まで読み切る事ができるのです。

しかしながら、通読できるのは、自分の身近なテーマに限定されています。喫緊な必要性が無い(但し、長期的には必要な)テーマについて書かれた書物については、通読することができず、途中で挫折する事になるのです。挫折しない方法を身につけていることが、本書で言う、本を読むためのスキルです。つまり、

21世紀の資本」を読むにはスキルを要します。 (728ページだから)
サピエンス全史」を読むにはスキルを要します。(上下巻それぞれ300ページだから)

本書は、たとえこれら難解な本であっても、最後まで読み切れるのを目指します。これらの本を、一冊10分で読み切るような、超絶技能を身につける事は目指していません。
地に足の着いた、妥当な落としどころにフォーカスした本となっています。

つまり「うさんくさくないの」です。


全部読まずにポイントを抑える


この表題で、「なんだスキミングの話か」と思った方も多いかと思います。
実際、スキミングのテクニックを使用します。しかし、そのテクニックが登場するのは、本を読む工程の一部のみです。
本書では、本を通読する為に、6つのステップを経ることとしています。
6ステップの詳しい話は、本書を読んで頂きたいのですが、かいつまんで言うと、都合4回、最後まで本に目を通す事を繰り返します。
その工程の中で、下記の状態を作って行きます。
  • 「何の話か理解出来ている状態」を作り出すこと
  • 「各章、各節に何が書かれているか」を知ること
  • 「話はどのように展開するか(=全体の構成)」捉えること
これを、表層を読む最初のステップから、徐々に熟読していくステップを経て、記述されるポイントの輪郭が見いだしていきます。そのなかで、ポイントに関連が無い記述は、容赦なく読み捨てていきます。
この、関連が無い部分を読み捨てるというのが、本を読む上で、なかなか出来ないわけですが、一語一句しっかり読むのは時間のムダであり、本を読む上で苦痛しか生まない、というのが、本書のスタンスです。

本書が示す6つのステップを行いながら、最終的に、
「自分にとって大切なポイント」
or
「著者の述べるポイント」

上記のうち、どちらかを見いだします。両方ではありません。それは、読みたいと思っている本は、この二つのポイントのいずれかテーマにして手に取ったはずだからです。
「著者の述べたポイントは自分の仕事にも生かせるかもしれない」という読後感の本と、
「自分はそうは思っていなかったが、著者が述べるのはこういう事のようだ」という読後感の本とでは、根本的に書かれているテーマがそれぞれ異なっているはずだからです。
最終的に上記2つの状態のいずれかとなる事を、本から見いださなければなりません。それを見いだした上で、改めてポイントを深く理解する為に、必要に応じた時間を使う事になります。


難しい本に挑戦する意義


本書が提唱する6つのステップを活用すれば、難しい本が読めるかも知れません。難しい本とは、すなわち自分とはあまり関係の無い、専門外の領域の本です。
本書では、自分の専門外の本を読むことには、大きな意義があるとしています。
自分の専門技術を追求する為に役立つ本を読む事は重要です。技術の進歩は目覚ましく、その進歩について行くには、これまで以上に沢山の本を読まないと行けないでしょう。
実際、技術者は、自分の専門技術だけではなく、専門分野以外の能力も強化しなければなりません。(技術者に成り立ての頃は除く)
本書の言うように、
ロケットを飛ばす技術を持っていても、政府との交渉を上手く進められなければ、ロケットを飛ばす事はできない。 のです。

政府との交渉の為には、交渉という、技術者にとって専門外の能力が必要になります。この能力を養うのが、専門外の難しい本に挑戦する意義です。専門外の書物も通読できるスキルが、専門分野の能力を発揮する為の環境を整えてくれると、本書では述べられています。

なんだかやる気が出てきます。

まさに、速読界隈ではむしろ異色とさえいえる、「うさんくさくないの」が、本書と言えます。

2017年9月8日金曜日

(書評)「C言語」ポインタが理解できない理由-2011年の本

「C言語」ポインタが理解できない理由
 



筆者はC言語のポインタを理解しているつもりですが、かといって今、この場でC言語のプログラミングをしてみろ、と言われたら、100%バグを組み込むだろうという確信があります。

普段仕事で使わない言語だとこともあります。とはいえ、さすがに今のご時世で、C言語は滅多に使わないので、気にしないことにしますが。

とはいえ、ポインタという概念そのものは、これだけ時代が進んでも、まぁまぁ使われる気がするので、覚えるに越したことは無いと思います。

多くのDBはCやC++でドライバ等が組まれていて、たとえどんなに小さなアプリケーションでも、DBを使わないものはそう滅多に無いと思います。

DB利用アプリで、メモリ系のトラブルがあった時、ポインタとメモリアドレスの様子をすぐにイメージできれば、プロセスのメモリがどこにアサインされ、どのプロセスのデータセグメント上にあって、それがスタックなのかヒープなのか、といった筋道を立てた推理がしやすくなります。その点、ポインタの概念は、今後変わらない普遍的なものであり、エンジニアが備えるべき教養とも言えます。

「C言語」ポインタが理解できない理由は、このポインタの事だけに焦点を当てた本です。
ポインタの概念を理解しようとする上で、つまづくポイントは人それぞれです。

「ポインタのポインタ」でつまづいた人もいれば、ほぼ基本となる「メモリの使い方」の段階で、つまづいた人もいるはずです。
こうしたつまづきを経験した人にとって、本書はうってつけの本です。

本書を読む際、自分のハマりどころに直接ジャンプして、そこから読みすすむのも良いのですが、冒頭から読み進めるのをオススメします。
これは、筆者の個人的な体験からくるオススメであり「分かったつもり」をできるだけ排除する意味があります。筆者もそうだったのですが、ポインタについて、ある程度の難度まで習得したと思っていても、実はそれより前の段階で、理解や認識のモレがあった為に、つまづいてしまっていることがあり得るからです。これが「冒頭から順番に」をオススメする理由です。
本書のサンプルコードを試していきながら、ステップバイステップを実践していけば、ポインタの理解が深まることでしょう。

なお、「今時、自分のPCにC言語の開発環境なんて無い」という方もおられるとおもいます。安心してください。
昨今はWeb上で、様々なプログラム言語によるコーディングができるサービスが公開されています。

C言語のコード補完機能付きREPL※で、オススメしたいWebサービスは「repl.it」です。
C言語を選択すれば、すぐにコーディング環境がWebから利用できます。(Githubアカウントが必要です)

※REPL:Read-eval-print loop-読む、評価する、表示する、ループさせる、という一連のお試しコーディングができる環境の事
また、「自分のローカル」でREPLを構成したいと言う向きには、弊ブログの過去記事にて、CERNが提供するClingというREPLについて記載してありますので、そちらを参考にしてください。

本書の完全クリアで、是非ポインタをしっかり理解していただければとおもいます。

2017年8月31日木曜日

(書評)「仁義なきキリスト教史」と方言


誓って言うが、口論の時は理路整然と自分の主張を述べて、しかもそれが方言丸出しであったほうが怖い。
また、普段方言丸出しで怒鳴られたり、凄まれたりするほうが、標準語で怒鳴られるより数段怖い。
方言の別は問わない。たとえそれが、親しみやすさが高い東北弁や、おっとりした京都弁であっても。
その点、この本は怖い。何が強いって、広島弁で凄むヤクザしか出てこないから。広島弁マジに怖い。

登場人物はキリストを含め、全て広島弁のヤクザである。
キリスト教は、キリストとヤハウェとの関係性を発端とした、本当に微妙な差異しかない宗教観の相違から、血で血を洗う抗争へと発展する。

彼らの価値観の相違は、もうほとんど無視してもいいほど微妙すぎるいざこざから始まり、やれプライドを傷つけられたとか、筋を通したとか通さなかったとかで、やたらとモーダル化して表現し、指摘しあいながらお互いを責め合う。故に、抗争になる。これがいわゆるヤクザ世界で言う「仁義」というやつか。

実際、キリスト教の歴史は、その始まりが太古の昔ゆえ、神話の世界感と同様になり、ファンタジー的な色合いが濃い。
ファンタジーなので、どの聖書にも人間同士の感情の交わりや衝突といった機微について描写があまり豊かではない。フロドとアラゴルンが、なぜ固い友情で結ばれるに至ったかがよく分からないのと同じように、ここは勝手な想像をするしかない。
この本「仁義なきキリスト教史」では、この想像するしかない局面を全て「仁義」の一言で片付けてしまっている。
ヤクザ抗争よろしく、とにかくよくわからない「仁義」という価値観、それにもとる人間の行動が着火点となり、宗教戦争に至る。この本では、シュールなヤクザ組織の衝突と宗教観の衝突とを同一視して、キリスト教の争いの歴史を実にユーモラスに描いている。

ギャグ描写がとにかく軽妙で面白おかしく、そのおかげでキリスト教の歴史が、なかなか頭に入らない。その一方で、広島弁の運用方法、とりわけ、ヤクザにおける広島弁の運用方法が、しっかり頭に入る。
だからといって、この本を読む事で得た広島弁を、広島出身でもない人間が使うのはリスキーである。それは、関西出身でもないのに関西弁を使う人物に遭遇した時の、あの寒々しさと同じ事になる。方言という点からも、この本で得られる知識は劇薬といえよう。

2015年12月29日火曜日

Clingの助けを借りて、その数式をプログラムしてみる

その数式、プログラムできますか?


この書籍を最近読み始めました。
 
 数学的な課題を題材に、公式や定理が考案された歴史的背景や、解法を編み出した人物像と共に解説し、そしてそれを実際のコードに落とし込む場合どうなるかというのを、段階的に思考過程を示しながら、サンプルコードとともに示されています。
 なかなか面白い本だと思います。
 ただ、内容が自分には難しすぎて、実際にサンプルを入力しながら読み進めていかないとついて行くのがなかなか厳しい。さらに、サンプルコードはC++11を前提としており、手元のプライベートなMacbookAirには手軽に使える開発環境がありません。
 気合いで標準導入されたGCCを使うとか、Objective-Cに変換しながらコーディングしてみても良いですが、書籍のサンプルコードは、せいぜい数十行で、関数も単一のものが大半です。気合いを入れたり、統合開発環境をいちいち立ち上げたりなどは少し大げさな感じです。もう少し手軽にサンプルコードを試せる環境が欲しいところです。
 
 PythonではIPythonのようなREPLを使えば、その場その場で思い付いたコードを試す事ができます。この手軽さが理想。C++版のREPLがほしいところです。
 そして有り難い事に、ClingというREPLおよびインタプリタを、CERNが公開していました。CERNは大型ハドロン衝突型加速器で有名なあのCERNです。早速導入してみます。

 

Clingの導入

Clingの導入は、ソースをgit cloneし、Buildする事で行います。Buildには、CERNが提供するBuildScriptを使う方法の他、CMakeやconfigure+Makeを使って手動でBuildする方法があります。

<導入手順(英文)>
https://root.cern.ch/cling-build-instructions
 
 今回は、手元のmac環境にもともとCMakeが導入されていたので、CMakeを使って手動でBuildしてみました。
 英文が読める方は、手順の通り実施すれば多くの場合は問題ないかと思いますが、手動Buildでハマりました。Windowsであるのと、個人的にうっかりミスを誘う記載があり、余分な時間を使った箇所があったので、そのあたりを踏まえた手順を述べたいと思います。
 なお、Clangを全てソースからビルドするので、かなり時間が掛かります。他の作業と並行するなど、時間的な余裕をもっての実施をおすすめします。

 

ソースのビルド

導入するディレクトリを任意の名称(仮に/Users/<login-acount名>/clingとします)で作成した後、まず、CERNのgitからソースをCloneします。リンクの手順(Manual Build)の記載に従い、下記のコマンドを実行します。

<Building with CMake>
git clone http://root.cern.ch/git/llvm.git src
cd src
git checkout cling-patches
cd tools
git clone http://root.cern.ch/git/cling.git
git clone http://root.cern.ch/git/clang.git
cd clang
git checkout cling-patches
cd .. 
 
さて、原文だと最後のcd ..で1階層上にカレントディレクトリを移動していますが、なぜこの操作が記載されているのか良くわかりません。ここは正しくは、「clangを1階層上に登る」ではなく、「最初に作ったディレクトリ配下に移動」が正しいです。ですので、もう2段上にカレントディレクトリを移動しましょう。


cd ..
 
cd ..
pwd (※Windowsでは単にcd)
(pwdの結果)/Users/<login-acount名>/cling
 

 以下のコマンドを実行していきましょう。

mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=[Install Path] ..\src
3行目のコマンドについて、..\src の記載箇所にちょっとした注意が必要です。

cmake -DCMAKE_INSTALL_PREFIX=[Install Path] ..\src

 ..\src はCloneしたソースコード相対パスを示していますが、cernのページはWindowsを前提としているので、バックスラッシュつまり日本語OSでの¥マークであり、一方macなどではバックスラッシュではなく、ただのスラッシュでなければなりません。

<macでのcmakeコマンド実行>
cmake -DCMAKE_INSTALL_PREFIX=[Install Path] ../src

 最初のcmakeの処理が終わったら、以下のコマンドを順次実行していきましょう。
cmake --build . --config [Release/Debug] --target clang
cmake --build . --config [Release/Debug] --target cling
 (※このあたりに時間が掛かります。のんびり待ちましょう)

 全ての手順が終わったら、ビルド後のbinディレクトリに移動して、clingコマンドを実行してみましょう。

cd bin
./cling (※Windowsでは単にcling)

****************** CLING ******************
* Type C++ code and press enter to run it *
*             Type .q to exit             *
*******************************************
[cling]$

 clingの対話式コマンド入力モードになっていれば、導入は成功です。対話モードが不要になった時は.qと入れれば、解除されます。

 

Clingを使った最初の操作

Clingで導入されたClangはC++11対応という事なので、lamdaがつかえます。
 lamda式のコードとともに簡単な操作を行ってみます。必要に応じてclingコマンドを実行し対話モードにしてください。

./cling (※Windowsでは単にcling)
****************** CLING ******************
* Type C++ code and press enter to run it *
*             Type .q to exit             *
*******************************************
[cling]$ #include <stdio.h>
[cling]$ auto f = []{printf("Hello, CLing\n"); };
[cling]$ f()
Hello, CLing
REPL風に、includeからlamdaで記載された関数の定義と、その実行まで順次対話的に入力していきます。入力ミスによるエラーがあっても、行を確定した時点でフィードバックがあるので、再度入力しなおせば、最終的には実行が成功する事になります。

 

サンプルの実行

書籍「その数式、プログラムできますか?」から、足し算のみによってかけ算を実現する「エジプト乗法」というアルゴリズムのコードをサンプルとして、入力から実行までを行ってみます。
 下記のようなコードを入力してみます。 (コードは実際の書籍からアレンジしてます)
auto odd = [](int n)-> bool { return n & 0x1; }
auto half = [](int n)-> int { return n >> 1; }
int mult_acc4(int r, int n, int a) {
    while (true) {
         if (odd(n)) {
             r = r + a;
             if (n == 1) return r;
         }
         n = half(n);
         a = a + a;
     }
}

int multiply4(int n, int a) {
     while (!odd(n)) {
         a = a + a;
         n = half(n);
     }
     if (n == 1) return a;
     return mult_acc4(a, half(n -1), a + a);
コードを入力し、実行してみましょう。
 なお、途中出てくる.rawInputというのは、複数行からなる関数などを書く場合につかいます。行毎にコンパイルしないようにclingに指示するコマンドです。

./cling (※Windowsでは単にcling)
****************** CLING ******************
* Type C++ code and press enter to run it *
*             Type .q to exit             *
*******************************************
[cling]$ auto odd = [](int n)-> bool { return n & 0x1; }
((lambda) &) @0x108afcb30
[cling]$ auto half = [](int n)-> int { return n >> 1; }
((lambda) &) @0x108afcbb0
[cling]$ .rawInput
Using raw input
[cling]! int mult_acc4(int r, int n, int a) {
[cling]! ? while (true) {
[cling]! ?     if (odd(n)) {
[cling]! ?         r = r + a;
[cling]! ?         if (n == 1) return r;
[cling]! ?         }
[cling]! ?     n = half(n);
[cling]! ?     a = a + a;
[cling]! ?     }
[cling]! ? }
[cling]! int multiply4(int n, int a) {
[cling]! ? while (!odd(n)) {
[cling]! ?     a = a + a;
[cling]! ?     n = half(n);
[cling]! ?     }
[cling]! ? if (n == 1) return a;
[cling]! ? return mult_acc4(a, half(n -1), a + a);
[cling]! ? }
[cling]! .rawInput
Not using raw input
 
[cling]$ multiply4(6,80)
(int) 480
[cling]$ multiply4(78,80)
(int) 6240
 
 

 無事、実行できました。Enjoy!

2015年12月12日土曜日

Python mini Hack-a-thonに参加しました

第59回Python mini Hack-a-thonに参加させていただいた。

 Python全くの初心者で有りながら、miniとは言え、まがりなりにもハッカソンと名の付くイベントに無謀にも参加した感想を述べたいと思います。

 まず、第一印象として、参加者全員がOpen Mindで、昨今の技術動向や業務上の相談事など、わりとフランクに話し合われていた。日本もここまで来た。(?)
 こう言う議論が交わされる場があるというのが、IT勉強会の良いところ。貴重な情報収集の機会になります。 

 本題のハッカソンですが、初心者とはいえ、JavaやCのほか、開発のベテランと自負している手前、開発の基本として何よりもまずはTestFirstの実現だ、とばかりに、Unittest2を意気揚々とpipインストール。

 しかしすでにここが間違い。エラーが出る原因を聞いてみたら、今回使用しているPython3.5環境には、既にUnittestがバンドルされているとの指摘。さらにUnitest2は、Python3.2で組みこまれたUnittestをPython2で使用できるようにしたパッケージライブラリであり、Python3.5で動作させようとすること自体が間違い。要は、全面的に間違っていました。
 すかさず、pip uninstall unittest2でアンインストール。追加パッケージを入れずともUnitTestのアサーションはしっかり動きます。最近になって初めてPythonを学習する人は、Python3から始める事も多いかと思います。ただPython2も未だに現役であって、Webの情報もPython2を前提として記載されているケースが多いかもしれません。Python2とPython3の差異がどの程度あるか把握しておいた方が、それぞれどのバージョンについての情報かといった点を切り分けられて、今後の学習でハマる要因を取り除けるので効果的かもしれません。

 その後も、度重なるヘマをしながら、BeautifulSoupとRequestsといったライブラリを使用して、Webスクレイピングの簡単な例をどうにか作って、LTで発表させていただきました。

  個人的に、新しい言語を覚えるには、まずその言語の文字編集処理を学習する事から入るというスタイルを取る事が多いですが、Webスクレイピングでは文字列の部分抽出や検索などを駆使する点から、学習の初め方としては良かったように思います。

 Pythonを使いこなす為に、今後もイベントに参加するなりを続けたい次第です。

2015年11月7日土曜日

セキュアプログラミング開発セミナに参加しました

「リスクに紐付く脆弱性のタイプを見てみる〜ソースから見る脆弱性問題点の把握〜」 こちらに参加しました。
 今日のテーマは、Webアプリケーションのセキュリティに関する脆弱性を如何にして特定するかという内容です。

 なかなか良かったです。
 普段は社内システム向けのプロダクトの開発しかしてないのですが、クラウド環境化の波はどんどん押し寄せます。オンプレミスな環境に対応するだけでは済まない状況であり、セキュアプログラミング開発の知見を得る必要性を感じての参加です。

 
  今日のセミナでは、セキュリティ各種団体の概要の説明、脆弱性の具体例、プロダクト開発者がなぜセキュリティの全体像を知る必要があるのか、といった点について話題が挙がりました。
 共通脆弱性タイプ一覧CWEによって、典型的なプログラム脆弱性のパターンを確認・学習する事ができる点についても説明がありました。
 問題に発展しそうな脆弱性について、普段の調査ではCWEサイトをスポット的に見る機会はありました。しかし、なにしろグローバルな英語サイトなので、英文を読むのがつらくなって、すぐにページから退散する事が多かったです。
 しかしもう少しだけ細かく見ていくと、脆弱性のある不適合コードや、実際の問題事象のサンプルといった情報が豊富に存在しており、セキュリティに関する知見を得られるサイトだったのでした。今日初めて知りました。
 実現しようとする機能には、どのような脆弱性を組みこむ危険性が潜んでいるのか、といった観点からリスク要因を事前に予期・認識できたなら、適切な対処ができます。
 その点で、あらゆる脆弱性パターンの概要を体系だてて理解しておく事は重要です。

 普段からセキュアプログラミングの知識を得ようとする心がけは、プロダクトの品質を高めるだけでなく、プロジェクトを成功に導く為のリスクヘッジとして意義があると感じました。

 今後も定期的に勉強会に参加していきたいと思う次第です。

2014年9月15日月曜日

Cloud9を試す(2)-Nitrous.IOと連携

Sublime Textとtern.jsで、Node.JSを書いているのですが、Cloud9と比較し、コードの補完機能が物足りなく感じます。Cloud9のIDEを使って、Nitrous.IOのBOXにあるソースを編集できないものでしょうか。
Nitrous.IOとCloud9というキーワードで検索してみると、こちらに行き着きました。
エントリにはCloud9IDEとNitrous.IOのBoxをSSH接続で連携させる手順が書かれています。見るとCloud9のエディタでちゃんとコード補完されています。これは是非試したい。

Cloud9でNitrous.IOのプログラムをコーディングする

英語がわかる人は、元のエントリの通りの手順を践めば問題はないはずです。以下には、少し引っかかった箇所を補足して手順を記載しています。
  1. Create a new NodeJS Box on Nitrous.IO
    まず、Nitrous.IOにNodeJSのBOXを作成します。こちらを参考にして下さい。既にNodeのBOXが在る場合はこのステップは不要です。
  2. Note the information about the new box
    BOXのSSH URIを書き留めるか、クリップボードに記憶させておいて下さい。
    私の場合ssh://action@apne1.nitrousbox.com:<ポート番号>でした
    enter image description here
  3. Add a new SSH Workspace on Cloud9
    Cloud9のダッシュボードから、SSH Workspaceの新規作成を実行します。なお、無課金の範囲でCloud9を使用する場合、SSH等プライベート領域で外部公開しないWorkspaceは、1ユーザに付き1つのみ作成可能となっています。既にプライベートWorkspaceを作成済であった場合は、Workspaceを削除するか、課金により、複数のプライベートWorkspaceを作成可能にして下さい。
    下記の様に設定して下さい。
    enter image description here
    • HostName
       NitrousIOのBOXに対応するSSH URI、先ほど確認したやつから、ユーザID(action)を除いたものを設定します。 (例apne1.nitrousbox.com)
    • Username
       ”action”を設定します。 SSH URIの@より前の文字列が、ユーザIDとなっています。
    • Node.JS Binary Path 
       Node.JSが導入されたBOXに関して、Node.JSコアのバイナリがある場所を指定します。本エントリー記載の時点では、pathは/home/action/.parts/packages/nodejs/0.10.26/bin/nodeでした。バージョンによってはこのpathは変更されるので、Nitrous.IOのコンソールから、実存するファイルか確認したほうが良いでしょう。
    • Initial Path
      任意で設定します。ログイン時にどのディレクトリをCloud9のWorkspaceエクスプローラの基点とするか設定します。 
    なおLOGINTESTボタンを押してみたくなりますが、未だ押さないで下さい。次の手順を実施しないかぎり、おそらくログインは失敗します。
  4. Copy the SSH Key shown in the Cloud9 window
    ここの手順について、本家の手順では、/home/action/.sshに、authorized_keyファイルを配置すれば良いような記載がされています。が、どうも本家の記載の通り実施しても、上手くいきませんでした。
    当方はNitrous.IOのPublicKeyにCloud9側のSSH Keyを登録して解決しました。
    イ) NitrousIOのAdd Public Keyをクリック
    enter image description here
    ロ) Cloud9側のYour SSH Key(SSH Setting画面に表示)をコピペする
    enter image description here
    ここでは、Nameを仮にC9としておきます。Add keyボタンを押下します。
  5. You can now connect to the Nitrous.IO box via the Cloud9 IDE.
    Cloud9側のSSH Setting画面に戻り、LOGIN TESTボタンを押下し、ログインできるか確認してください。ログインできない場合、指定しているパスに誤りがないか、NitrousIOのBOXがDeactiveになっていないかを確認して下さい。
    Cloud9に作成したWorkspaceを開く(最初は少し時間がかかります)と、NitrousIOに作成したWorkspaceが、Cloud9でも開けているのがわかります。
    enter image description here
これで、Cloud9の強力なコード補完機能が、NitrousIO上のコード編集でも使えるようになりました。
※コード補完が使えるようになるまでの時間が掛かる場合もあります。Cloud9がWorkspaceの補完候補をクローリングするに時間を要する為だと思います。
Written with StackEdit.

2014年9月14日日曜日

Sublime TextとNitrous.IO環境でNode.JS開発環境を作成する(2)

 前回までは、Nitorus.IOでの開発環境の作成、NitorusDesktopの導入までを行いました。
 今回は、NodeJSSublime Textで編集できるようにします。コード補完機能も使えるようにします。


NitorousDesktopのfilesyncの有効化

 NitorusDesktopは、Nitrous.IOのデスクトップアプリケーションです。
 インストールしたNitorusDesktopを起動し、File Syncを有効にして下さい。


Sublime Text 2にNodeJS補完機能を導入する

 Sublime Text2は、必要に応じてパッケージを導入することで、機能を強化する事ができます。しかしSublimeText2に最初から組みこまれた入力補完機能では少々もの足りないので、TernJsを導入して、NodeJSのコード補完機能を有効にさせます。以下の手順を実施します。


1. Sublime TextへPackageControllerを導入する

 Sublime Text をインストールした際に、最初に実施するのは、Sublime TextにPackegeManagerを導入する事です。
 パッケージマネージャは、Sublime Textでのパッケージの導入と管理を容易にします。
 Sublime TextのviewメニューからShowConsoleすると、画面下部に表示されたコンソールが表示されます。PackegeControllerの公式ページに有るPythonコードをコピペするか、下記をコピペして下さい。導入が完了したら、一度Sublime Textを再起動して下さい。

import urllib2,os,hashlib; h = '7183a2d3e96f11eeadd761d777e62404' + 'e330c659d4bb41d3bdf022e94cab3cd0'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler()) ); by = urllib2.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); open( os.path.join( ipp, pf), 'wb' ).write(by) if dh == h else None; print('Error validating download (got %s instead of %s), please try manual install' % (dh, h) if dh != h else 'Please restart Sublime Text to finish installation')

2. TernJSを導入する

 TernJSは、NodeJSのコード補完機能をSublime Textに組みこむ事ができるパッケージです。
 TernJSの公式ブログのアドレスはこちらです。
 なおTernJSはEmmet社製のプラグインですが、既に他のEmmetのプラグインを導入されている方は、注意点があります(後述)。

 PackageManagerを導入しSublime Textを再起動したら、メニューのTools>CommandPaletteを選択し、テキストボックスにInstallと入力します。インクリメンタルサーチされた一覧から、InstallPackegeという検索結果を選択します。
 少しすると、InstallPackageのテキストボックスが開いて、再度入力を促されます。
 今度はTernと入力すると、サーチ結果がドロップダウンされますので、TernJSを選択し導入します。
 導入が終わったらSublime Textを再起動して下さい。
 
 先述した注意点ですが、既に他のEmmetプラグイン導入済の環境では、pythonのパッケージPyV8が導入されている場合だと、コード補完が少し遅くなる事があるかもしれません。その場合は、PyV8パッケージをパッケージコントローラから削除してください。これにより、次回起動時に最適なバージョンPythonパッケージが導入されます。

3. Tern-Projectファイルの作成

 Sublime Textの再起動により、TernJSの導入が済んだら、これらのコード補完機能を有効に設定するための設定ファイルの更新を行います。

 Sublime Textのメニューで、Preferenceメニューから、Settings - Defaultを選択し、"auto_complete": trueになっている事を確認して下さい。trueなら、Sublime Text全般の自動補完機能が有効となっています。(デフォルトはTrue)

 NitorusDesktopは、クラウド上に配置されたNodeJSの開発環境を、そのままローカルに同期する機能を持っています。
 同期はNitorusDesktopを呼び出すNアイコン(Windowsの場合タスクバーより、macの場合NitrousDesktopを起動後の通知バーより)をクリックし、Nitrous Desktop画面でBoxesがStart状態である時、FileSyncトグルボタンをDisable→Sync(Syncing)に切り替えます。すると同期が開始されます。
enter image description here
 同期フォルダを開いて、開発環境が所定のフォルダに同期された事を確認するには、Nアイコンを、今度は右クリック(Macの場合Nアイコンをクリック)し、Open Nitrous Folderを選択すると、ローカルの同期フォルダ(<ユーザ>\Nitrous)が開きます。
enter image description here
 この同期フォルダにファイルを保存していくと、クラウド上のBOX(NitousIOの開発環境)に同期されるようになります。
 このフォルダに、TernJSの各種設定を記述したNodeProjectファイルを作成します。こうしておけば、異なる環境間、たとえば、自宅とオフィスのPCとの環境間で、都度プロジェクトの設定をしなおす手間がなくなります。

 では、このフォルダのmynodeフォルダ(<ユーザ>\Nitrous\mynode)に、下記の記述で作成した"tern.sublime-project"ファイルを配置して下さい。

{
  "auto_complete_triggers":
  [
    {
      "characters": "<",
      "selector": "text.html"
    },
    {
      "characters": ".",
      "selector": "source.js"
    }
  ],
    "folders":
    [
        {
            "follow_symlinks": true,
            "path": "."
        }
    ],

  "word_separators": "./\\()\"'-:,.;<>~!@#%^&*|+=[]{}`~?",

  "ternjs": 
  {
      "exclude": ["wordpress/**", "node_modules/**"],
        "libs": ["browser", "jquery","node"],
              "plugins": {
                "requirejs": 
                {
                  "baseURL": "./js"
                }
              }
  }
}

4. コード補完機能の確認

 それでは、TernJSの補完機能を使って、実際にコーディングを行ってみます。
 Sublime Textを起動して、メニューバーから、Project > OpenProject とメニューを辿り、先ほど作成したtern.sublime-project(<ユーザ>\Nitrous\mynode\tern.sublime-project)を開いて下さい。
 次にSublime Textから、プロジェクトフォルダとなる<ユーザ>\Nitrous\mynode\に
example.jsというファイル名でJSのソースを作成します。ソースには、下記のフォルダをコピペし保存します。

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(8888, '0.0.0.0');
http://nodejs.org/ の「AN EXAMPLE: WEBSERVER」ソースをNitrous.IO検証用に僅かに改変)

 そして、コード補完機能が有効である事を確認します。先ほどコピペし、保存したexample.jsの行末に、下記のコードを入れてみます。

console.log('Server running at http://0.0.0.0:8888/');

co・・・と入力したあたりで、TernJSのコード補完機能が一見働いたように、下記のような補完リストが表示される筈です。
enter image description here
 しかし、この補完リストは、Sublime Textの標準の補完機能が表示しているものです。既出の文言から予測される入力を単に一覧で表示されているに過ぎません。 
 TernJSの場合本来は下記のように、もっと沢山の補完リストが表示される筈です。
enter image description here

 実は、新規作成したソースについては、TernJSはコード補完対象として認識しません。記載したソースをTarnJSの補完対象にするには、TernJS:Reloadというコマンドを実行して、新たに作成したソースをコード補完対象にしてやる必要があります。
 Reloadは、CommandPalletから実行します。Sublime Textのメニューから、Tools > Command Palatteを選択し、テキストボックスに、Reloadと打ち込むと、TernJS:Reloadが候補としてリストされるので、選択してTernJSをReloadします。
enter image description here
 
 今度は、補完されましたか?
enter image description here


5. Nitrous.IOでの動作確認

 記述したコードをNitrousIOで実行してみます。
 Nアイコンをクリックし、NitorusDesktop画面を表示します。
 enter image description here
 IDEボタンをクリックして、NitrousIOのIDEを開きます。
enter image description here
 
 作成したソースが、クラウド上の開発環境に同期されているのが判ります。
 
 では、Example.jsを実行します。
 画面下部のConsoleのカレントディレクトリをWorkspaceに移動し、NodeJSを実行します。

cd workspace/
node example.js

 正しく起動できた場合は
 Server running at http://0.0.0.0:8888/ が表示される筈です。
 この状態で、IDEのメニュー Preview > Port8888を選択して下さい。
enter image description here

 ブラウザのタグやウィンドウが開いて、下記の表示になれば成功です。
enter image description here
 
 以上で稼動確認終了です。お疲れ様でした。

Written with StackEdit.

2014年8月11日月曜日

NodeJSで気になる点

var Iconv   = require("iconv").Iconv;
var cheerio = require('cheerio')
var urlutil = require('url');
var url_util = require('url'); //不本意な記述

var charsetDetector = require("node-icu-charset-detector");
特に問題はないコードと言えますが、気に入らないのは、var urlutil = require(‘url’);の箇所で定義した変数。
以降のコードには、
var getWebPageTitle = function(url, callback) {
    var urlElements = url_util.parse(url, false);

http.createServer(function (request, response) {
    var urlObj = urlutil.parse(request.url, true);
などと、別の使用局面で、同じような記述をする事になるのですが、なぜかurlutilはスコープ外完で使い回す事ができない。undefinedとランタイムエラーが起こる。今の記載のように局面毎に、別変数を定義してやる必要が有った.
 これはどうも、良くわからない仕様だと思った次第です。
Written with StackEdit.

2014年8月3日日曜日

iTemがNitorus.IOに接続出来なかった→解決

 2時間ほど悩んだので、メモを兼ねて。
 Nitrous.IOは、ssh経由で、ローカル環境に導入されたターミナルから接続できます。
 普段私が使うターミナルはiTerm2ですが、Nitrous.IOのBoxにssh接続しようとしても、下記のエラーが出て、以前のように接続できなくなりました。

$ ssh action@apne1.nitrousbox.com -p 20150
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
95:1c:0c:ed:15:13:a2:39:f2:f6:3e:2f:4a:be:dc:b0.
Please contact your system administrator.
Add correct host key in /Users/hanori/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/hanori/.ssh/known_hosts:4
RSA host key for [apne1.nitrousbox.com]:20150 has changed and you have requested strict checking.
Host key verification failed.

 思えば、接続しようとしたBoxは一度同名のBox名で作成して、一旦削除して再度作成しなおしたのでした。
 よって、Local側とBoxに登録されたSSH鍵認証の情報を再作成しなおさなければなりませんでした。
 Nitrous desktopを使う方法であれば、比較的簡単に復旧する事ができます。

下記がその手順になります。

  1. 既存のSSHを削除する
  2. Nitrous DesktopからShellを起動

1. 既存のSSHを削除する

Nitrous.IOのホスト名によって登録された鍵を検索し、ssh-keygenにて削除します。
冒頭に引用したssh接続時のエラーメッセージには、下記の記載がありました。

RSA host key for [apne1.nitrousbox.com]:20150 has changed and you have requested strict checking.

 この[apne1~]がローカルにて管理されたSSHのホスト名になります。
 下記のコマンドを実行すれば、ローカルに鍵情報が存在する事を確認できます。

ssh-keygen -F [apne1.nitrousbox.com]:20150

 # Host [apne1.nitrousbox.com]:20150 found: line 4 type RSA
 /Users/hanori/.ssh/known_hosts updated.[apne1.nitrousbox.com]:20150 ssh-rsa AAAAB3NzaC~(鍵情報)~El

 次に、登録された鍵を削除します。

ssh-keygen -R [apne1.nitrousbox.com]:20150

# Host [apne1.nitrousbox.com]:20150 found: line 4 type RSA/Users/hanori/.ssh/known_hosts updated.
Original contents retained as /Users/hanori/.ssh/known_hosts.old

これで、ローカルから一旦、鍵の登録を削除する事が出来ました。

ssh action@apne1.nitrousbox.com -p 20150

上記のコマンドを実行してみて、接続できるかどうか確認して下さい。
私の環境では、この対処だけでは接続出来ませんでした。私と同様、Boxに接続出来無かった場合は、次に進んで下さい。


2. Nitrous DesktopからShellを起動

 ローカルから鍵の登録を削除するだけで、接続できるようになる場合も在りますが、私の環境では、下記のエラーが出て、まだ接続できませんでした。

ssh action@apne1.nitrousbox.com -p 20150

The authenticity of host ‘[apne1.nitrousbox.com]:20150 ([176.34.56.246]:20150)’ can’t be established.
RSA key fingerprint is 95:1c:0c:ed:15:13:a2:39:f2:f2:f2:f2:f2:f2:dc:b0.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘[apne1.nitrousbox.com]:20150,[176.34.56.246]:20150’ (RSA) to the list of known hosts.
Permission denied (publickey).

 Public Keyの更新が拒否されました。
 なぜPublic Keyの更新ができないのか判りません。sudoでルート権限下で、いままでの手順を繰り返してもやはりダメでした。
 最終的に、下記の手順で復旧しました。

  1. Nitrous Desktopを起動(既に起動している場合は再起動)
  2. NitrousDesktopで「SHELL」ボタンをクリックし、SHELLを起動
  3. PublicKeyを置き換える(?)か聞いてくるので、OKをクリックする

iTerm2から、下記のコマンドを実行すると、接続が問題無くできるようになった事が確認できました。

> ssh action@apne1.nitrousbox.com -p 20150
action@mynode-130750:~$ ls
README.md  tmp  workspace

 なお、下記のメッセージが出てしまう場合は、いろいろ対処しているなかで、無操作の一定時間経過によってBoxが既に停止してしまっている可能性があります。(無償利用時)

ssh: connect to host apne1.nitrousbox.com port 20150: Connection refused

 その場合はNetrous.IOのダッシュボードのページから、BoxをStartして、再度接続をしてみて下さい。

以上です。

2014年7月27日日曜日

Sublime TextとNitrous.IO環境でNodeJS開発環境を作成する(1)

 Nitrous.IOとSublimeTextがあれば、コード補完機能付きの開発環境が入手できます。
SublimeTextは、macやWindowsなどマルチOSで使える汎用テキストエディタです。
 Nitrous.IOは、Nodejsを初め、ruby、pythonといった、現在主流の各種Web開発スクリプト系言語の開発環境が、僅かな操作でクラウド上に作成できます。
 契約にはフリーミアムモデルを採用しており、一定の枠内で無償利用可能なWeb開発環境となっています。
 Nitrous.IOには、ブラウザベースで操作できる統合開発環境が用意されていますが、言語を問わず汎用的に作られていることから、テキストエディタにコード補完機能はありません(2014/07/20現在)。
 その為、コード補完機能を用いてコーディングしたい時は外部エディタを使う事になります。
 今回は、SublimeTextでNodejsをコーディングする環境を整える事とします。
 下記の順序で説明します。
  • Nitrous.IOに登録する
  • Node.JS開発環境をNitrous.IOに作成する
  • Nitrous Desktopをインストールする
  • SublimeTextをインストールする
  • (Sublimeにコード補完機能を導入する)- 次回に続く

Nitorous.IOに登録する

enter image description here
アカウントの作成
登録はメールアドレスの他に、Linkedin、Github、Google+等のアカウントがあれば、簡単に登録できます。

Nodejs開発環境をNitrous.IOに作成する

enter image description here
新しいBoxの作成
enter image description here
NodeJS開発環境の作成
クラウド上に、Boxと呼ばれる開発環境を作成します。今回は東アジアリージョンでNodejs開発環境のBoxを作成します。Boxは1分程度で作成されます。
 
 
 Nitrous.IOの特徴として、ユーザアカウント毎に割り当てられるN2Oという単位があります。ユーザは割り当てられたN2Oを使って、Boxのメモリの割り当てを増やしたり、ディスクを増やしたりできます。N2Oをもっと増やしたければ、課金やソーシャルへのNitrous.IOおすすめ投稿などをする事になります。
 また、無課金の範囲で使う場合の注意点として、開発環境は一定の時間操作されなかった場合には、環境そのものを自動的にシャットダウンします。ですので、次の日に開発の続きをする場合、再度Boxをスタートさせる必要があります。Boxのスタートは、Nitrous.IOの統合開発環境などから実行します。

Nitrous Desktopをインストールする

Nitrous.IOは、先述の通り、Webベースの統合開発環境をすでに持っていますが、一方ターミナルや開発環境の起動と停止操作を行うといった機能を持つデスクトップアプリケーションも提供しております。また、作成したNodejs実行環境の$HOME以下のディレクトリを、ローカルのディスクにミラーリング・同期する機能を有しています。イメージとしてはDropboxでのフォルダ同期機能が一番近いものでしょうか。
 クラウド環境と同期されたローカルのソースファイルは、当然、自身のローカルにインストールされたエディタで編集する事が可能です。
 Nitrous.IOのデスクトップアプリケーション、NitrousDesktopは、Webページからリンクをクリックしてダウンロードできます。導入も通常のセットアップを行うだけなので、特に説明は不要かと思います。NitrousDesktopはツールバー(macの場合)か通知領域アイコン(Windows)のNアイコンから開きます。
 以下がNitrousDesktopを開いた時の画像です。
NitorusDesktopを開く

SublimeTextをインストールする

SublimeTextは、mac,Windowsなど、クロス環境で使用できる多機能なテキストエディタです。アドオンを導入しカスタマイズしていく事で、あらゆるプログラム言語のコード補完機能を使えるようになります。Nitrous.IOが提供する統合開発環境は、コード補完機能がありませんが、クラウドとローカルが同期されているソースファイルをSublimeTextで編集できればコード補完機能によって生産性が向上します。
 SublimeTextとググると、ダウンロードのリンクが出てくるので、特に説明は不要ですが、後ほどコード補完機能プラグインとして導入するTernJsは、現時点でSublimeText(Version)2への導入を前提としている為に、ここではSublimeText2を導入する事とします。

(NodeJSコード補完機能をSublimeTextに導入する)

次回に続きます。
http://hanorionrails.blogspot.jp/2014/09/sublime-textnitrousio.html
Written with StackEdit.

2011年5月5日木曜日

Cloud9を試す(1)

Cloud9と言うPaasとも言えるしSaasとも言えるWebサービスを使って、Ajaxを使ったWebアプリケーションを作ってみます。
国内には、同名だけど、おそらくそれとは全く異なる製品(NTT PC Com)があるので紛らわしい。
ここでのCloud9は、
  • Ajaxを試す環境が既にクラウド上に用意されている
  • 開発環境(IDE)もクラウド上に用意されている
といった特徴があります。Ajax.orgが提供するサービスです。
仕事では使った事があるAjaxですが、理解しているかと言われると・・・。なので、まずはHelloWorldレベルから、このサービスを試してみます。
これから記載する内容は、Vimeoの入門ビデオと同じ事をするだけなので、英語が判る方はそちらをどうぞ。
Cloud9 IDE Beta Signup from Fabian Jakobs on Vimeo.

最初のChatアプリケーション
このビデオでも言っているように、Cloud9を試すには、Githubのアカウントが必要なので、登録する必要があります。今回は既に持っているアカウントを使いました。
IDEの画面が開かれたら、「Don’t have a Git URL」を押して、サンプルプロジェクトのURLを入力欄に記入しStartEditingボタンを押します。
Cloud9 - Your code anywhere  anytime
IDEが開かれ、プロジェクトを構成するファイル群がツリー表示されてます。shot2
server.jsというJavaScriptファイルをダブルクリックし、エディタを開きます。
エディタ上部にあるrunボタンの右脇をクリックし、ドロップダウンメニューを表示し、Run Configurationを選択します。
shot5
+Addボタンをクリックし、実行ファイルを先ほどのserver.jsを実行ファイルとして設定します。
shot6
RUNボタン押下で、出力結果ウィンドウにメッセージを出力してチャットサーバが起動します。shot7
“http://node_~”と書かれたリンクをクリックすると、チャットアプリケーションへのログイン画面が表示されるはずです。
shot8
適当なハンドルIDを入力し、チャットへアクセスできれば完成です。shot3
ソースもなにもかも借り物のサンプルですが、もうアプリケーションが出来てしまいました。
このように、Cloud9をつかえば、統合開発環境や、DBサーバやアプリケーションコンテナをインストールしたりすることなく、Ajaxアプリケーションを作って試せます。
AJax学習に掛かる工数が大幅に削減できるので、これは便利。

2011年1月2日日曜日

About face 3(書評)

ソフトウェアのユーザーインターフェイスデザインを少しでも勉強した人で、「ペルソナ」という言葉を知らない人はいないでしょう。
また、VisualBasicのユーザー・インターフェイス・コンポーネントは、ある一人の技術者によってデザインされたものであり、その後長きにわたりソフトウェアのユーザー・インターフェイスにおける標準デザインとして、プログラミング言語・OSによらず、あらゆる場面に使われ続けているという事実を知る人も多いでしょう。(今となってはプログラミング言語自体に多少の陰りはありますが)
これらすべては、「アラン・クーパー」その人によって発明・提唱されたものであり、デマルコ、ワインバーグと並び称されるほど、ソフトウェア産業に多大な功績を与えた人物の一人といえます。
アラン・クーパー氏曰く、プログラマーという人種は、自分たちの作り易いようにユーザー・インターフェィスをデザインし、ユーザーに対しては、不当にそのデザインへの順応を強要、自身のデザインしたものが使えないのは、ユーザーが悪いのだと言い切ってしまうきらいが有ると指摘する。こうした考えは「ホモロジクス」すなわち自身の同族のみしか世界に存在してはならないとする、狭量な思考だと揶揄している。していた。下記の本では。
超一級のプログラマーであり、ハッカー達が言うところの「ウィザード(魔法のようなコードを書くプログラマー)」である彼自身が、この本を出した1999年当時、あまりにお粗末、プログラマーご都合主義、ユーザー不在のインターフェイス・デザインの氾濫を大いに嘆いていました。彼のデザインに対するこだわりと熱意は、意味不明支離滅裂なデザインを作り続けるテクノロジおたくのエンジニアに対する怒りによって支えられていたといってもよいでしょう。
その怒りは、当時としては画期的に長い本のタイトルや、先ほどの本の原著の表紙にも象徴されています。
いや、ハッキリ言って、この本の表紙は怖すぎです。
アラン・クーパー氏は、認知科学やインダストリアルデザインの概念をソフトウェア・デザイン、とりわけグラフィカルユーザーインターフェイスに多く取り込み、その学際的なアプローチによって、さらに自身のデザイン手法を研ぎ澄ましてきました。その集大成が、1995年の初版から2008年で第3版を数える「About face 3」です。
氏の提唱するゴールダイレクテッド・デザインという原則は、ユーザーインターフェイスのゴールを、ユーザーをゴールへと直接導くことこそが第一優先であると定義し、500ページ強に徹頭徹尾貫かれています。
ユーザーインターフェイスデザインの初心者が陥る間違い「とにかくユーザーに優しく作る」という誤謬。それにより過ちを生み出さない為に、以下の点は肝に銘じるべきです。
  • ソフトウェアは中級ユーザー向けの設計であること
  • 初級ユーザーが中級ユーザーになる為の助けとなる仕組みを入れること
  • ユーザーインターフェイスは無いに越したことはない
事例も多数掲載。業界のペースセッターであり続ける氏の、比類なき経験値からくる示唆と分析が、シニカルかつユーモラスに語られており、問題提起とその具体的対策は多いに説得力があります。実在のソフトウェアプロダクトを例示し、これのココが不味いという議論を書上で臆面もなく展開できるのは、業界においてこの人だけではないでしょうか。
なかでも、Macの躍進は、単に画面とプリンタ印刷と同じ結果となる、いわゆるWisywigの利点のみだとし、デスクトップパソコンにおける「グラフィカルユーザーインターフェイス」の分野では、さほど良い成果を示していないと指摘する点は痛快です。
言われてみると、たしかに近年のAppleと言えば、iPhone・iPadといった携帯端末での発明は有っても、ことデスクトップアプリケーション分野では目立った活躍はありません。デスクトップアプリケーションの、とりわけビジネス分野に踏み込んだデザインに取り組んでいるのは常にMSやIBM(Eclipse等)であり、Appleはせいぜいウィンドウが吸い込まれるアニメーションに力をそそぐ程度です。iTunesは未だに使いづらいソフトウェアであり、ユーザーは常に同等機能を持つ別の優れたデザインのソフトウェアを探し求めています。きっとAppleはハードウェアベンダーであり、ソフトウェアベンダーでは無いので、しょうが無いのかもしれません。
先述の通り、500ページ強もある本書ですが、部分的にも適用可能な内容も多く、すべてを読まなくともインタラクション・デザインの要諦に触れる事ができます。ですが、コンピュータエンジニアを生業とする人が、ソフトウェアデザインのあらゆる局面でこの本の記載を想起できれば、もっと良い仕事ができるはずであり、できれば通読する事をおすすめします。
ユーザーインターフェイスの良し悪しは、結局のところ定量化が難しく、問題が発覚するのは常にユーザー先です。自分の作ったソフトウェアが「使いづらい」「ユーザーの事を理解していない(業務を判っていない、と同義)」と評価されるのは悲しいことです。どこにこだわるべきか、なににコストをかけるべきかを判断する明確な指針を持ちたいと考える向きには、おすすめ出来る本です。

2010年12月26日日曜日

CIOのケーススタディ(書評)

最近読んだ本です。非常に面白かったです。The Adventures of an IT Leaderの邦訳版であり、トム・デマルコのような、小説の形式を取ったマネジメント指南書に近い雰囲気ですが、違うのはCIO視点、すなわち、より経営に近い立場から見たITマネジメントという事で、どちらかと言えばイリヤフ・ゴールドラット本に近い内容と言えます。

本の表紙は、私の今の職場付近の、おそらくボート上から撮影したもののようで、まぁ、撮る人がとれば、このあたりの風景も表紙になるんですね。

ちなみに原書の表紙はこうです。
「もっと真面目にやれ」、と言ってやりたい気もします。

あと邦訳版には、「あるITリーダーの冒険」というタイトルの他に、最近の時流から、長めのサブタイトルがついてますが、これはあくまでサブタイトルです。いわばノイズであり、某マネジメント本のように、異様に両目の離れたブキミちゃんが、アニメ風の挿絵でマネジメントに大奮闘したりはしません。そっちのほうは読んでないから知らんけど。

閑話休題。

主人公のバートンはIVK社のCIO。成長が低迷する社の立て直しの為に呼ばれた新CEOウィリアムは、前CIOのデイビスをリストラ。ITとは全く異なる部署の責任者だった主人公バートンを、後任のCIOとして選出する所から物語が始まる。
ITのバックグラウンドを一切持たないバートンが、果たしてIT部門の執行責任者として務まるのか、「一年と持たない」と言い残して去った前CIOの予言通りになるのか、というところで、物語は展開していきます。
ITのバックグラウンドを持たない主人公が、如何にITが複雑なのか、如何に微妙な問題に常日頃さらされているかを知るにつれ、事の次第を理解するようになります。主人公が事ある毎に、だらしないその身なりやコミニュケーション能力を馬鹿にしてきた、前CIOに対し申し訳なく思うようにさえなります。
いざ自分がその立場になって、コストやらROIやら、経営層が求める言葉や数値だけで語れるほど、ITは単純な世界の話ではなかったのだと気づいたあたりから、IT部門の一員として技術者との結束が強まり始めます。そんな折、過去に自身が否定し、撤回させたプロジェクトが実施されなかった事で、社内システムのセキュリティ上の窮地ばかりか、自身の窮地をも呼びこむ事となります。
このあたりの筋書きが、物語になかなかの深みを与えています。
以前の主人公は、なぜIT部門が経営層と上手くやれないのか、マネジメントをまともにこなせないのか、まったく理解していませんでした。
実際、経営層とIT部門とのやりとりが円滑に進まない事は多い。IT部門が経営層の立場を理解していない事、ITの知識を持たない人間とIT責任者がうまくコミニュケーションできない事がその理由である、そういう指摘が、この本の要諦の一つです。
たしかに、ITに関する用語や概念は難解で、それをだれでも理解できるように説明できなければ、CIOどころかマネージャも務まらない。反面、でもなぜ、IT部門だけが歩み寄らなければならないのだろうか、という疑問も湧いてきます。
日々更新される新技術に食らいつきつつ、経営層にアピールする為に、さらに会計学や経営学も勉強する。結局はどちらも上手くいかず、偏って高い評価を得ているのは、ビジネス部門の知識に長けた人材であると気づくや否や、会計学をひたすら勉強し始めたりする。
IT固有の複雑さをすっ飛ばしてしまっているのに、経営層にしか響かないレトリックを駆使し、強引にプロジェクトを進めたりできちゃうので、出世は早い。その結果、IT部門に居ながらにして、プログラムが全く組めないマネージャを産みだす、そんな事態も起こりえます。けして良い傾向ではない。
企業の成長に欠かせないはずのIT部門、にも関わらず、ITに対する無理解が依然としてあり、それが企業に手痛いダメージを与えているという事実への警鐘が、主人公が取締役会で発する一言によって集約されています。これをビシッと言えなければならないのです。
「将来、『私はITについてはよく知らない』というのは、『私は会計についてはよく知らない』という以上に、まずい事になる」
CIOの仕事について緻密な筆致で臨場感高く語られており、経営層とIT部門との狭間で起こる問題をいかにして解決するかを学ぶケーススタディとしても活用できます。
自分がこの立場ならどうする、彼らの行動をどう理解するのか、章の末尾に書かれた問いかけによって、自身の思考の整理ができる点はよく考えられていると関心します。

名著。

2010年10月19日火曜日

スマートフォン

後れ馳せながら、スマートフォンを購入した。
一度はiPhoneを予約したり、モバイルスイカの定期券の期間がかなり余っていて、結局購入を断念したり、(Suica定期の解約が必要。12ヶ月定期で残り4ヶ月もあった)。最終的には、htcのアンドロイド携帯になりました。

いろいろ使ってみて思うのが、もっと早く購入するべきだったな、と。
とりあえず、これで予定を取りこぼす事がなくなりそうです。
Salesforceとgoogleカレンダーの組み合わせによって、スケジュール管理は万全。todoもWeb同期されるので、今までのように、情報が発散せず一元管理可能となったのがすばらしい。ガラパゴス携帯でそれを実現しよう、試行錯誤したあげく、結局諦めてしまったことが、いとも容易くできてしまったわけです。

これで、生活が変わるかもしれない、そんな気さえもしています。

さて、まがりなりにもソフトウェア開発者なので、アプリケーションの開発環境が気になるところです。
もうしばらくは、このスマートフォンに魅了され続けるでしょう。

Published with Blogger-droid v1.6.3

2010年6月7日月曜日

つい「しっかりやる」といってしまう自分(書評)

仕事でつい思わず、「きちんとやる」「しっかりやる」こんな言葉を使うことがある。上司にプロジェクトの進捗と残作業を報告する時などが多い。
この本には、こんな尺度の曖昧な言葉に異議を唱えている。
本を読んだ感想などを書いてみようと思います。

この本、最初の印象としては、正直読みづらいと感じた。文章には括弧書きや、モノローグ的が書かれているようなところが散見され、まるで携帯小説かティーンズノベルを読んでいるような気分。「だってそう思うでしょう」と、著者が読み手に対して語りかけるような文体です。ちょっとなれなしい。
ただ、人に伝えるという事の非常に本質的な考察については、納得させれるし、考えさせられもする。著者は広告界でコピーライターという職業を通して、言葉と真摯に向き合いたいと考えている。そして、その思いが伝わってくるから、自分はかなりぬるく軽々しく言葉を使っていたなと身につまされる。
人にものごとを伝える時に、まず著者がやらなければならない事として挙げるのは、「主観に左右される言葉を使わない事」。
悪い例として、この「きちんとやる」「ちゃんとやる」「しっかりやる」という言葉を挙げ、これらを使うべきではないと指摘している。それは、聞く人の主観によって「やる」という程度がどんなふうにもとれてしまうから。そして、そもそもこんな言葉は中身のないカラ言葉だ、と著者は言うのだ。
なるほど、どこかの国の元首相が連発していた「しっかりやる」には、国民に良いようにとってくれという甘えの言葉であり、なんの約束もしていないまさにカラ言葉。曖昧なので、とらえ方によっては「なにもしないとは言っていないでしょうが。ネガティブに取るほうが悪い。」と言っているようにもとれる。まったくひどい言いぐさだ。
さらに著者は「受け手の判断の尺度をあらかじめ明確にする」ことも大事だとしている。受け手も伝え手も、おなじ尺度での判断ができる言葉を使わないと、物事は伝わらないというのである。
元首相の例で言えば、「しっかりやる」の連発で国民を煙にまき、混乱しているところに、さらに「腹案はある」である。これでとどめをさされ、いよいよ国民の空いた口はふさがらくなった。なんの情報も提供せず、受け手の判断の尺度が明確になるどころか「まぁ勝手に想像してくれ」とまで言い切ったのである。よほど画期的なアイディアでもなければ、まず口に出せない言葉でもある。
結果的には普天間の問題は振り出しへ。 これが我が国の首相なのか・・・と頭を抱えるしかなくなった瞬間である。この経験はこれからの人生にトラウマとして影を落とすことでしょう。もうこれは国民に対する国家レベルのDV。
・・・というのは言い過ぎとしても、一国の首相の言葉、自分本位で尺度の曖昧な言葉によって、これほどガッカリさせられた経験を持つ人種は、世界中で一体どれぐらいいるのだろうか。
元首相の評判は予想通り急降下し、当人はあえなく職を失う事となった。
著者がいう通り、言葉って本当に怖い。元首相がまさにそれを体現してくれたわけです。
軽々しく言葉というものを使っていた自分に反省しつつ、しっかりやっていきたい「言葉の技術」を高めなければならない、そう感じて読み終わった。
この本は他にも、「受け手と同じ言葉を使う」「受け手の状況を把握して、ベネフィットを提案する」という事がものごとを伝える時には大事だと指摘。後者は、単純化して言えば、受け手が知りたい事を言うという事です。
当たり前の事が書かれているのが多いのでしょうが、ではなぜ、コミュニケーションではそうしなければならないのか、それが言葉を尽くして語られており、納得感が高い。コミニュケーションの基本がすっかり腹落ちし、最後にはすがすがしい気分にもなる、そんな良書だと思います。