いつか、どこかで

【読書メモ】それは「情報」ではない

図書館で借りた。

著者はかの有名なカンファレンスの運営、TEDの創設者。 2000年(日本では2001年)に出た本なので、スマホ以前、AppleiPodを出すよりも前で、ちょっと今とは状況違うかな、ってところもあるけれど面白かった。

なんか知ってる話がよく出てくるなあ、と思ったら、教える仕事を始めたばかりの1997年に読んだ

と同じ著者の人だったわ。

原題「Information Anxiety」は、情報不安症=毎日浴び続ける大量の情報を処理しきれず不安になってしまう現代人の病のこと。 そんなに不安になることないんだよ、知らない自分と向き合おうよ、という本でした。

以下、気になった文章。

  • クロード・シャノンとウォーレン・ウィーバーは、情報とは「不確かなものを削減する」ものだと述べ、意味のあるものが情報だとする定義を裏付けている。
  • 私たちにわかるのは、自分が知っていることと、知らないことだけ(言い換えれば、自分が理解できることと、できないこと)だ。
  • 情報を分類する手段は「位置」「アルファベット」「時間」「分野」「階層」
  • 情報の分類を変えることで、新しい情報が生まれ、新しい理解が生まれる。
  • 「このプロジェクトの目的はなんだ?」という自分への質問を怠ると、それをどう実現するかという段になって、道を見失い、どうしようもない疑念に悩まされる。
  • 的確な質問を考えられる方が、的確な答えを得るより数倍得をする
  • 考えをグループ化することが、コミュニケーションにとっては非常に大切である

この本のあとに出てきたスマホがすっかり定着した現在だと、どんなことを書かれるのか気になる。

CEATEC2019に行ってきました

昨日、CEATEC2019に行ってきました。

www.ceatec.com

木曜日にした理由は単にスケジュールの都合ですが、その日のセッションも確認、予約してから行きました。

公式アプリ | CEATEC 2019 公式サイト もスマホにインストール済み。セッションの予定や会場マップ、行ったブースの履歴とか見れて便利でした。

まず会場ついて最初に「Webアクセシビリティセミナー1:障害当事者のWebの利用方法を知る」の聴講。

視覚障害の人たちがどんなふうにWebを利用しているかなんて正直考えたこともなかったので、とても勉強になりました。 セッションの感想はNoteに。

note.com

そのあと、ブースを端から順に。 京セラさんのブース、光るパネルの上を移動して、位置で音や光が変わったり、腕の動きで音の鳴り方が変わったり、という「カメラ-LIDARフュージョンセンサ」と「行動認識技術」のデモを体験。(人の動きに合わせて音と光の変化を感じてみよう! in CEATEC 2019 | 京セラソーシャルアルバム)そんなに待たずに体験できて、なかなか面白かった。

半分弱回ったところで「デジタル社会における若年層向けプログラミング教育」を聴講に。 セミナーの内容はこちら→ https://home.jeita.or.jp/page_file/20191009113449_SJudcXgCPK.pdf

色々なプログラミング教育の取り組みやツール、ソフト開発など、普段私が携わっているエンジニア向け教育とはぜんぜん違う畑の内容は知らないことばかりで興味深かったです。

地方における子どもたちは、そもそもそういった職業やセミナーを知ることもないのでそこから変えていきたい、というお話がありました。

そのあと、またブース戻って、おしゃべりコウペンちゃん(おしゃべりコウペンちゃん新登場!)の実物とお話したり、富士通さんのブースのミュージカル仕立てのショーを見たらすごくハイクオリティで3回ぐらい見ちゃったり。演技して、IT用語満載の長台詞を噛まずに喋って踊って、4日間大変だろうなあ、何交代なんだろう。Youtubeに上がってる(https://www.youtube.com/watch?v=etvPz-Myd1Q&t=4s)のはブースダイジェストだけど、後日ショー部分をまとめてアップしてくれたら嬉しい。

それから、Active Sleep Bed activesleep.jp も体験させてもらいました。角度だけじゃなく、硬さも部分で変えられるの、面白い。

あとはかつて新人研修担当させてもらった企業さんのブースにいたら教え子がいて、覚えててくれたりとか。

一時期は随分縮小してたCEATECですが、だいぶ活気が戻ってきたなあ、と感じました。来年もまた行きたいな。

QiitaにFortranをCとPythonに移植する記事を書きました

「FORTRAN77数値計算プログラミング」のプログラムをCとPythonに移植してみる(その1)

という内容の記事を、Qiitaに書きました。

qiita.com

ちょっと他にない記事で面白い、になると良いなー。

【C言語とJava】配列の違い

今年の新人研修で、結構コーディングできるのに、私が配列の図解をしたら「初めてわかった!」ってなっている受講者がいて、やっぱり混同しやすいのかなーとまとめてみることにしました。

 配列の基本

まず要素5個の配列を作る場合 C言語では

int array[5];

Javaでは

int[] array = new int[5];

大括弧の位置が違いますが一緒でも良いです。メモリ上はこんなふうに違います。 f:id:riko111:20200313110924p:plain

※イメージ図です。実際のメモリ配置を表してはいません。

宣言と同時に初期化する場合、 C言語では

int array[] = {10,20,30,40,50};

Javaでは

int[] array = {10,20,30,40,50};

と同じように書けます。大括弧内の要素数は同時に初期化する場合のみ省略可能です。省略しなくても良いです。

この書き方を分けて書くと、 C言語では

int array[];
array = {10,20,30,40,50};

Javaでは

int[] array;
array = {10,20,30,40,50};

となりますが、どちらもコンパイルエラーになります。ただし、エラーになる箇所が違います。

がエラーです。これは、最初の図を見てもらえば、

  • C言語ではarrayのメモリは配列そのものなので宣言の時点で要素数が決定していないといけない
  • Javaではarrayのメモリは配列を参照するものなので宣言の時点で配列そのものの要素数が不明でもかまわない

という違いが理解できるかと思います。 そして、Javaでは

int[] array;
array = new int[]{10,20,30,40,50};

と記述することが可能です。

また、あらかじめ配列が用意されているときにその要素数を調べるには、 C言語では

int array[5];
int length = sizeof(array)/sizeof(int);

Javaでは

int array[5];
int length = array.length;

となります。

二次元配列

次に、二次元配列について見てみます。 C言語では

int array[2][3];

Javaでは

int[][] array = new int[2][3];

メモリ上はこうなります。 f:id:riko111:20200313115934p:plain

宣言と同時に初期化する場合

int array[][3] ={{10,20,30},{40,50,60}};

Javaでは

int[][] array = {{10,20,30},{40,50,60}};

となって、C言語で要素数を省略できるのは1次元目のみ、Javaではどちらも省略可となります。もちろん、省略しなくても良いです。

メモリ上はこうなります。 f:id:riko111:20200313115930p:plain

また、Javaでは

int[][] array;
array = new int[2][];
array[0] = new int[]{10,20,30};
array[1] = new int[] {40,50,60};

という風に書くことが可能で、

int[][] array;
array = new int[2][];
array[0] = new int[3];
array[1] = new int[2];

というように2次元目を違う要素数にすることが可能です。C言語では2次元目の要素数は全部同じでないといけません。

C言語でもJavaでも、次元を増やしていくことが可能ですが、

という違いがあります。

また、要素数を調べる場合、 C言語では

int array[2][3];
int length = sizeof(array)/sizeof(int);

Javaでは

int array[2][3];
int length = array.length;

となりますが、このとき、lengthに格納される値は

になります。これも、図を見てそれぞれの言語のarrayが表すメモリを見ていただければと思います。

こんなふうにC言語Javaでは配列が違うので、注意しましょう。

【Java】文字列比較に==演算子を使ってはいけない理由

研修のときに、口を酸っぱくして説明するんだけどみんな忘れちゃうやつ。

String型は参照型である

というのはどういうことかというと、

String str = "ABC";

と宣言したとき、メモリ上は、 f:id:riko111:20200312185229p:plain

となるのだけれど(イメージです。実際のメモリ配置を表してはいません)、これが例えば

public class Test {
    public static void main(String[] args){
        String str = "ABC";
        if(str == args[0]){
            System.out.println("同じ文字列です");
        } else {
            System.out.println("違う文字列です");
        }
    }
}

というコードのとき、コンパイルして実行したら、

>java Test ABC
違う文字列です

となる。これはメモリ上、 f:id:riko111:20200312185232p:plain

こういう状態で、●と□を比較しているので、等しくないと判断される。

public class Test {
    public static void main(String[] args){
        String str = "ABC";
        if(str.equals(args[0])){
            System.out.println("同じ文字列です");
        } else {
            System.out.println("違う文字列です");
        }
    }
}

と記述すれば、strが参照している文字列と、args[0]が参照している文字列の比較に鳴るので、等しいと判断される。

メモリ管理のやっかいなところ

で、問題は、

public class Test {
    public static void main(String[] args){
        String str1 = "ABC";
        String str2 = "ABC";
        if(str == str2){
            System.out.println("同じ文字列です");
        } else {
            System.out.println("違う文字列です");
        }
    }
}

と書いたら、等しいと判断されること。

これはなぜかというと、

  1. String型はクラスで定義された型なので、正確には
String str1 = new String("ABC");

と書くべきである。 でもStringはとってもよく使うので例外的に、

String str1 = "ABC";

と書ける。

2.ただし、省略形の書き方は、明示的なオブジェクトの生成を指定していないので、

String str1 = "ABC";
String str2 = "ABC";

と書くと、str1はオブジェクト生成が行われるが、str2では先程生成したオブジェクトをそのまま参照する。 つまり、メモリ上は f:id:riko111:20200312190359p:plain

になる。 これはJVMがそういうふうにメモリ管理することにしてるので。

なので最後のコード書いて、なーーんだ==で文字列比較してちゃんと出来るじゃ~んってならないでね。 そして、C++C#だと、==で文字列比較できるのにー、っていう人、それはC++C#には演算子オーバーロードという機能があって、Javaにはないからです…

Pythonエンジニア認定試験に合格しました

今月に入ってから勉強始めたPythonの試験を昨日受けてきました。

f:id:riko111:20200315100638j:plain

試験用の公式テキスト、「Pythonチュートリアル」を買って、

Pythonチュートリアル 第3版

Pythonチュートリアル 第3版

  • 作者:Guido van Rossum
  • 発売日: 2016/03/24
  • メディア: 単行本(ソフトカバー)

全部終わってないけど基本的なところはまあ押さえられたかなーって思ってやってみたので得点0の分野がありますが(笑)、無事に受かりました。

他の言語経験者なら簡単にマスターできると思います。便利で楽しい言語だなと思いました。