わたしのひとりごとが、だれかのお役に立てればと…

情報の洪水をシャットアウトする努力

『遅読家のための読書術』という本を読みました。
※この本を読んだことをきっかけに思ったことをまとめていますので、書籍レビューではないです。ご注意ください。

心に刺さった一節

私は遅読家、つまり本を読むのが遅い方ではないと思っていますが、手に取り買ってしまいました。 冒頭の一節が心に刺さったからです。

「読書量が減った」「本が読めなくなった」といっている人はそうした「新しい読み方」と「これまでの読み方」とのあいだで真っ二つに引き裂かれています。(P8)

「そう、それ!!」と激しく同意して、とりあえず買いました。

ここで言っている「新しい読み方」というのは、スマホSNSやウェブニュースといった圧倒的な量の情報を洪水のように流し込むことです。一方で、「これまでの読み方」というのは本の一言一句を深く読み込んでいくことですね。

この本では、ゆっくりと深く読み込んでいくのではなく、1日1冊くらいのペースで速く読むことをおすすめされています。 それが主題となっています。

本が読めなくなった

上記にあるように、ここ数年本当に本が読めなくなりました。1日1冊ではないですが、2日で1冊くらいのペースで読んでいた時期もありました。

この本を読んでいて、確かにスマホのせいだと改めて実感しました。
スキマ時間をスマホに奪われるだけでなく、情報のインプットも SNS に適したやり方に慣れてしまってます。その一方で、読書はこれまでの読み方で読みたいと(無意識に)思っていて、ギャップに苦しんでいます。

スマホからのインプットの洪水にさらされることから、積極的に回避していかないといけないと痛感しました。よく言われることですが、身にしみて再認識したということですね。

とはいえ、本の読み方も少しは変えていかないといけないとも思いました。

1時間ですばやく読んだほうが、本のポイントがしっかりと記憶に残っていることが多いのです。
逆に、ウンウンうなりながら1ヶ月くらいかけてようやく読み終えた本って、「結局、なにが書いてあったんだっけ?」ということになったりしませんか?

この差はどこから生まれているのか?

「読書密度の違い」と「全体観の有無」だと思います。長期間かけた熟読というのは、単位時間あたりの読書の密度が低いうえ、その本の全体像が見えづらくなりますから、非常に「薄い」読書体験しか提供しません。(P63)

SNSを除外したとしても、依然として多くの学習が必要ですので、こうしたテクニックも用いていかないといけないですね。

さいごに

読書術で必ずいわれることですが、この本でも読書においてアウトプットすることが大切だといっていましたね。
ということで、ひさびさにブログ書いてみましたとさ。

Angular で JointJS を動かすための最初の一歩

Angular に JointJS(https://www.jointjs.com/opensource)を組み込んでグラフ描画を実装しているのですが、日本語の情報がなくて苦労しました。
メモっておいたら役立つかもということで、まずは導入部分での工夫を今回まとめます。

使用しているバージョンはこちら。

パッケージ バージョン
@angular/core 5.2.9
@angular/cli 1.7.4
jointjs 2.0.1

公式サイトのチュートリアルに沿って、動かせる所までやってみます。
https://resources.jointjs.com/tutorial/hello-world

JointJS のパッケージをインストールする

npm install --save jointjs

ここは悩みどころはないはずです。

JointJS を使えるように Component に import する

import { Component, OnInit } from '@angular/core';

import * as joint from 'jointjs';

@Component({
  selector: 'app-simple',
  template: '<div id="myholder"></div>',
  styleUrls: ['./simple.component.css']
})
export class SimpleComponent implements OnInit {
  graph = new joint.dia.Graph;

  constructor() { }

  ngOnInit() {
  }
}

まずは上記のように import * as joint from 'jointjs'; としたいところですが、

node_modules/jointjs/dist/joint.d.ts(1395,34): error TS2503: Cannot find namespace 'JQuery'.

という具合にコンパイルエラーが発生します。

そこで、「import * as joint from 'jointjs';」の代わりに以下のようにして 'jointjs' を使えるようにしました。

declare function require(x: string): any;
const joint = require('jointjs/dist/joint.js');

TypeScript のコンパイラが以下のような require が見つからないとエラーを発生させるので
2行目のように require 関数を宣言してあげる必要があります。

const joint = require('jointjs/dist/joint.js'); ERROR in src/app/simple/simple.component.ts(6,15): error TS2304: Cannot find name 'require'.

Hello World サンプルコード全体

ということで、チュートリアルを動かすサンプルコード全体。
所々で TypeScript 向けに変更してます。

import { Component, OnInit } from '@angular/core';

declare function require(x: string): any;
const joint = require('jointjs/dist/joint.js');

import * as $ from 'jquery';  /* joint.dia.Paper の初期化で $ を使うため */

@Component({
  selector: 'app-simple',
  template: '<div id="myholder"></div>',
  styleUrls: ['./simple.component.css']
})
export class SimpleComponent implements OnInit {

  graph = new joint.dia.Graph;

  paper;

  constructor() { }

  ngOnInit() {
    this.paper = new joint.dia.Paper({
      el: $('#myholder'),
      width: 600,
      heigth: 200,
      model: this.graph,
      gridSize: 1
    });

    const rect = new joint.shapes.basic.Rect({
      position: { x: 100, y: 30 },
      size: { width: 100, height: 30 },
      attrs: { rect: { fill: 'blue' }, text: { text: 'my box', fill: 'white' } }
    });

    const rect2 = rect.clone();
    rect2.translate(300);

    const link = new joint.dia.Link({
      source: { id: rect.id },
      target: { id: rect2.id }
    });

    this.graph.addCells([rect, rect2, link]);
  }
}

参考サイト

ここがなかったら無理でした。 github.com

QQmlApplicationEngine と QtQuick2ApplicationViewer(QQuickView) の違い

Qt を少しずつ勉強していってます。 Qt(主に Qt 4)は書籍があるので勉強しやすかったけれど、 Qt Quick(QML)は書籍もなく、がっつりまとまったサイトもないため、苦戦中。

とりあえず今日ハマってしまったところをまとめてみる。

似たような、ふたつのクラス

QML の入門的なサイトを見てみると、main 関数のあるソース(main.cpp)のなかで、QtQuick2ApplicationViewer なるクラスを使っているサイトをちらほら見かける。

ところが、私が使っている Qt Creator(バージョン 4.0.3)では、 「Qt Quick アプリケーション」を選択して新規プロジェクトを作ってみても、 QtQuick2ApplicationViewer は使用されない。 代わりに QQmlApplicationEngine クラスが使用される。

同じようなロジックのようなのだが、相違はどうなんだろうと調べてみた。
(こんなことを調べずに早く先に進みたかったのだが)

QtQuick2ApplicationViewer とは

うまく言及してくれているサイトがあった。

tips.hecomi.com

以下、ちょうどいい箇所を抜粋。

QtQuick2ApplicationViewer は Qt Creator で Qt Quick 2 プロジェクトを生成すると生成され、プラットフォーム間の違いを吸収してくれる処理が書いてある QQuickView 派生クラス(元を辿ると QWindow 派生クラス)です

API のクラス一覧にも存在しないので、なんだろうと思っていたら…そういうことかと。

その元となる QQuickView は Qt 5.0 から実装されたクラス。
http://doc.qt.io/qt-5/qquickview.html

QtQuick2ApplicationViewer とは

QQmlApplicationEngine は Qt 5.1 から実装されたクラス。
http://doc.qt.io/qt-5/qqmlapplicationengine.html

これらのクラスの違いは?

QQuickView の API ドキュメントを見ると…

The QQuickView class provides a window for displaying a Qt Quick user interface.

一方で、QtQuick2ApplicationViewer の API ドキュメントは…

Unlike QQuickView, QQmlApplicationEngine does not automatically create a root window. If you are using visual items from Qt Quick, you will need to place them inside of a Window.

QtQuick2ApplicationViewer の方には、QQuickView と対比した説明がある。 アプリケーションを表示するにあたって、ウィンドウが自動的に作られるか、そうでないかで違うとのこと。

QQuickView は自動的にウィンドウが作られる、むしろ自分自身がウィンドウなので、QML で "Window" を配置する必要がない。 一方で、QQmlApplicationEngine は自動的に作られないので、QML で "Window" を配置してあげる必要がある。

実際にソースコードを書いてみた

まず、QML を2つ用意する。

① Window なしの QML(nowrapWindow.qml)

import QtQuick 2.7

Rectangle {
    width: 640
    height: 480

    Text {
        text: qsTr("Hello World")
        anchors.centerIn: parent
    }
}

外側に Window を配置せず、矩形(Rectangle)だけ。 QQuickView で使う想定。

② Window ありの QML(wrapWindow.qml)

import QtQuick 2.7
import QtQuick.Window 2.2

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Text {
        text: qsTr("Hello World")
        anchors.centerIn: parent
    }
}

Window を外側に配置しておく。QQmlApplicationEngine で使う想定。

起動元となる C++ ソースコード(QQuickView)

#include <QGuiApplication>
#include <QtQuick/QQuickView>

int main(int argc, char **argv) {
    QGuiApplication app(argc, argv);

    QQuickView *view = new QQuickView;
    view->setSource(QUrl(QStringLiteral("qrc:/nowrapWindow.qml")));
    view->show();

    return app.exec();
}

「Window なしの QML」を読み込んでも、きちんとウィンドウが現れて内容が表示される。

逆に「Window ありの QML」を読み込むと、ウィンドウがふたつ現れてしまう。
ひとつは空っぽのウィンドウ(QQuickView に対応?)で、もうひとつは中身が表示されたウィンドウ(QML 内の Window に対応?)。

起動元となる C++ ソースコード(QQmlApplicationEngine)

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/wrapWindow.qml")));

    return app.exec();
}

QQmlApplicationEngine はウィンドウを自動的に作らないので、 「Window ありの QML」を読み込むことで、ウィンドウが現れて QQuickView と同様の表示を行うことができる。

一方で、「Window なしの QML」を読み込んだ場合、ウィンドウが作られずに何も表示されない状態になってしまう(アプリケーション自体は動いているが)。

まとめ

「(正規の API ではない)QtQuick2ApplicationViewer ってなんだ?」でハマり、時間を食ってしまったので、まとめてみた。
まとめてみたけど、わかってしまえば大したことない話…

この二つのクラス、さらに使い分けがありそうな雰囲気がするけれど、とりあえず今のところは無視しよう。

Qt と QML はやっぱり情報源が少ないのがつらいね、初心者には。

また TOEIC だ

また今年も TOEIC をやることになった。

会社のお金で TOEIC を年1回くらい受けさせてもらったり、
自腹で何度か受けにいったこともある。

リスニングの点数がなかなか上がらない。
というか、リスニングはほぼ上がっていなくて、
リーディングだけがぐんぐん上がっていく。

けれど、リーディングだけでは限界で、
一定レベル以上のスコアはだせない(ビジネスパーソン平均よりもちょっといい程度)。

リスニングはたぶん壁にぶちあたっていて、
壁を乗り越えないといけない時期なんだろうなという感じ。

とはいえ、英語を勉強することだけに集中することもできずに
いつまでたっても壁の前をウロウロしている。

永遠の優先順位 第3位

・・・と、自分が英語に取り組む姿勢を捉えている。

優先順位の第1位、第2位はマイブームだったりで、コロコロ変わる。
当然そのあたりにある業務、作業、そして趣味には時間を費やす。
一方で、ある時期は第1位だったものが、いきなり圏外に転落するという側面もある。

でも、英語だけは第3位という中途半端な位置をキープし続け、
いつもかすかに意識させられる存在。手を動かすことはないのに。

どうしたらいいんだろうね、今年は。

Gradle の社内勉強会をしてきた

・・・と言うものの、実際に勉強会をしたのは
半年前の 2015年11月 なんですが。

せっかく説明資料もサンプルコードもたくさん作ったので
どこかにアップでもしようかと思いながら、ようやくアップした次第です。

https://speakerdeck.com/hideoku/ming-ri-karashi-itakunaru-gradle

サンプルコードは GitHub にアップしてます。
https://github.com/hideoku/GradleLabo

勉強会をやった経緯

うちの部署では、ハンズオン形式で技術勉強会をやってました。
ひとり1回は講師をしないといけないということで、私は Gradle の入門を。

Gradle 大好きなので、みんなにもとにかく使ってもらおうかなと。

Gradle を使ってみようと思ってもらうことが重要なので
ちょっと偏ってますが「Gradle = 便利ツール」というスキームでやりました。

ビルドツールとして紹介すると、弊社の実情的にまだまだ先進的で、
自分には関係ないやと思われると終わり。それはダメだなと。

準備をとにかくがんばった

どうせ勉強会で紹介したって、後に続かない。
自分で手を動かしてなにか挑戦してみるところまで、なかなかつながらない。

そういうあきらめというか、限界は感じてました。

どうしたら手を動かしてもらえるのかを考えたときに・・・

  • 勉強会の資料だけで、ひとり歩きするくらいのボリュームにしよう
  • はじめの一歩でつまづくときに手助けになるサンプルをたくさん作ろう

この2点を抑えておけば、後から挑戦してみようと思いたったときや
必要にかられて Gradle を勉強せざるを得なくなったときに
説明資料やサンプルコードが助けになるはずだと考えて、準備がんばりました。

勉強会の反響

10数人くらい参加してくれました。
目の前には2人しかいなくて、残りはリモート参加という異様な形でしたが。

「やってみたくなった」というコメントが多かったので、
やってよかったなと素直に思いました。

準備に結構な時間をついやしたので、報われました。

とはいえ、半年たった今、Gradle が浸透しているかというと
そんなことはなさそうです。 必要にかられないと、なかなか実際に使おうとは思わないのが実情です。

おわりに

はじめて Speaker Deck にアップしてみた。