無料ブログはココログ

« 2016年3月 | トップページ | 2016年5月 »

カンタン非同期処理のNode-REDはデータ構造から始めよ!

node.js上で動くNode-REDのプログラムは ノードと呼ばれるモジュールをつなげることで非同期処理を簡単に記述することができます。

ここまでは簡単なプログラミングの説明をしてきましたが、今回は少し大きなプログラムを開発する場合を考えてみます。Node-REDでロジックを書く場合はファンクションノードにJavascriptで用なプログラミングします(カスタムノードを作ることもできます)。

Javascriptというといわゆる「コールバック地獄」(google検索)が連想されますが、Node-REDならノードを分けることで、快適にプログラミングできます。ここでは、なつかしのジャクソン法の命名にならって4つに分類してみましょう。

20160430_092923

基本

単純な処理は一つのファンクションノードで書くことができます。

図中のインジェクトノードからmsgオブジェクトを受け取って処理を行い、msgオブジェクトをreturnします。returnしたオブジェクトは次のデバッグノードでデバッグタブに出力されます。

連接

複数のノードを前後につなげます。処理1のノードがmsgオブジェクトをreturnすると、後続の処理2が実行されます。

全体としては非同期処理ですので、途中で外部呼び出しをすると、別の処理が開始されることがありますが、入力データの単位で見ると処理1と処理2は順次的に行われます。

選択

データに応じて処理を分ける場合、出力を複数に分けることができます。配列をreturnするとそれぞれが出力されます。出力が不要な場合は、その番号のところにnullをセットしておきます。

同じデータを渡すだけであれば1つの出力を複数のノードに渡すこともできます。
経験的には出力を複数にすると出力番号順、1つから複数に分けると後続のノードの作成順に実行される様に思いますが、保証されたものではありません。

反復

1つの入力から同じ処理を非同期に複数実行することもできます。node.send(obj)が呼ばれると処理中に、非同期に、後続処理が実行されます。

後続の処理は受け取ったオブジェクトをmsgとして処理しますので、returnで渡す場合と同じ様にnode.send()の引数もオブジェクトでないといけません。

ノード間のインタフェース

ノード間は関数呼び出しではないので引数がありません。Webプログラミングのセッション情報がmsgとして流れていくイメージが近いと思います。

msgはフロー(つまりタブ)をスコープとするFlow contextや全体で共通のGlobal contextと異なって、msg単位で独立しています。しかし引数と違って、ある処理が使わないデータが後続の処理で使われる場合もありますので、むやみに破壊することができません。

チェック&カスケード

安全なノードの基本構造はチェック&カスケードです。入力のmsgオブジェクトをチェックし、必要な処理を行い、受け取ったmsgオブジェクトをそのまま次のノードにカスケードします。

もちろん、msgオブジェクトに追加や変更をすることもありますが、受け取ったmsgオブジェクトを破壊しないことが基本です。

汎用性と保守性は違う

多くの言語では、汎用モジュールを参考にすると保守性の高いプログラミングが可能です。しかし、Node-REDでは注意が必要です。

Node-REDの標準ノードの多くはmsg.payloadをインタフェースにしています。しかし、始端あるいは終端となるノード以外でマネをすると、後続処理がmsg.payloadを退避する必要が生じてノード間の依存が強くなってしまい、保守性が悪くなります。

そこで、データの種類に応じてmsgオブジェクトにプロパティを追加する必要が出てきます。

データ構造から始めよ!

はじめに説明した様にNode-REDはファンクションノードによって、非同期処理を簡単かつ柔軟に扱うことができます。その反面、引数がないのでmsgオブジェクトを誤って破壊しない様に、データ構造をきちんと設計しておくべきです。

命名に用いたジャクソン法の4分類は、プログラムのデータ構造の分類です。それぞれに応じたフローがあるのですから、データ構造をどのようにするかを設計できれば容易に実装できるでしょう。

今回は全て配列をmsgにセットして渡しましたが、「選択」の場合は連想配列にすると見通しが良くなるかもしれません。このあたりは通信プロトコルなどの制約に応じて工夫してください。

おわりに

これまで説明してきた様にNode-REDは、設定中心のプログラミングが可能(Hello World!からNode-REDを知る)、通信に強い(RedmineのREST API を呼ぶ)、 ソーシャルに強い[Node-REDでTwitterのDMからRedmineのチケットを作成する)といった特徴がありますが、今回取り上げた非同期処理が簡単なことは、node.js上のNode-REDならではの特徴でしょう。

Javascriptだとコールバック地獄に落ち入りがちな順次処理が、フローをつなげることで簡単に実現できますし、データ構造にあわせた非同期処理も可能です。

書籍が出版されるなどIoT環境として注目されるNode-RED。ビジュアルでお手軽な点が強調されがちですが、注目されている理由はこの辺りにあるのかも知れません。

このエントリーをはてなブックマークに追加


「なんで?」と「自分だったら」が属人化を防ぐ1 - 必要な時に、必要なものを、必要なだけ -

珍しく社内でお話しする機会がありました。

社会人になって32年。20世紀と21世紀を半分ずつ過ごしてきました(正確には21世紀は2001年からなので少し短い)。

今の会社を知ったきっかけは先輩が残業が多いと愚痴りにきたからで、「残業代は多いけどシンドイ」と聞いて、結婚資金を貯めたかった私は興味を抱きました。

調べてみると最初に商用としてUNIXを導入したとか、面白そうだったので会社に入りました。

当時は「モーレツ社員」とかいう言葉に代表される様に、イケイケドンドン、フォードの自動化に象徴される大量生産大量消費の時代でした。

20世紀の末になるとトヨタ生産方式に代表されるような効率化が求められる様になり、米国が日本の技術を参考にリーンやTOCといった無駄のない方法が考えられる様になりました。そして21世紀は根性論ではなく、無駄のない効率が求められる様になりました。

残念ながら、世の中がそのように変化している中で属人化を無くす方法は、資料を整理したり、勉強会を開く、など昔ながらのまとまった時間をかける方法が行われています。

しかし、よく考えてみると、そのような方法を取らなくてもリーダーは大事なところは把握していますし、トラブルが生じるとここがおかしいのではないか、などと言い当てています。

リーダーの様に 日々の仕事の中で、「なんで?」と疑問を残さず、「自分だったら」と考えれば、もっと効率的に属人化を防ぐことができます。

それは生涯学習の方法であり、アクティブラーニングであり、機械学習にも似たケース・ベースド・リーズニングの方法で、障害が予測されるフォルトプローンを知る方法です。

それは大変に思えるかも知れませんが、情報量の定義を利用して全てではなく大切な情報を見極めて常に整理していれば、意外と楽にできることです。

真面目に頑張ることが正しいとは限りません。「なんで?」と「自分だったら」を活用して、属人化を防ぎましょう。

このエントリーをはてなブックマークに追加

ザ・ゴール2 コミック版:TOCの思考プロセスは、ツール、知識、考え方から

TOCの思考プロセスには3つのツールが登場します。“ものごとのつながりを考える「ブランチ」、意見の対立について考える「クラウド」、目標を達成する方法を考える「アンビシャス・ターゲット・ツリー」”(教育のためのTOC 日本支部)の3つです。

TOCfE(教育のためのTOC)勉強会でのモヤモヤ

これらのツールについては引用元のTOCfE勉強会が関西でも開催されていて(facebook)、そのワークショップへの参加を通じてだいたい知っていました。

でも、正直なところ少しモヤモヤしていました。それは、どのような局面で使うのか、問題をモデル化しても結局はアイデア勝負ではないのか、そのモデルは正解なのか、といった疑問です。

しかし今回、 ザ・ゴール2 コミック版を読んでようやくすっきりしました。まずは3つのツールから説明します。

意見の対立について考える「クラウド」

前作のザ・ゴール コミック版 でもCCPMに繋がる家族のストーリーがありましたが、今回は親子の対立をクラウドで解決します。

クラウドでは対立する意見の理由(なぜ)に共通する同じ目標をモデル化します。共通の目標と考え方の違いを明確にすることで、互いの理解が深まり、対立を解消する解決策を考えることができます。

目標を達成する方法を考える「アンビシャス・ターゲット・ツリー」

コミック中では「前提条件ツリー」と呼ばれています。これは、目標を達成するために必要な「中間目標」をはっきりさせるためのツリーです。

まず、目標を達成しようとするときの障害を挙げ、その障害をかわせる中間目標を考えます。そして、現在から中間目標をたどり目標まで論理的につなげることで、障害をかわして中間目標を達成する手順を考えていきます。

ものごとのつながりを考える「ブランチ」

UDE( Undesirable Effects: 好ましくない現象)を明確にして、因果関係から現状ツリーを作成します。問題の全体像を示して「何を考えるか」をはっきりさせます。現状ツリーができれば、全てのUDEの原因がわずか一つかふたつの根本(コア)となる問題がわかります。

現状ツリーのUDEをひっくり返してDE(Desirable Effects: 望ましい現象)を考えて図式化し、「何に変えるか」を考えるために 未来現実ツリーを作ります。

現在から未来に向かって実行していく移行ツリーを作る例や、 アンビシャス・ターゲット・ツリーを使ったお話も出てきます。

知識と考え方

この本ではツールの使い方がストーリーで示されています。そこにはワークショップではわからない、知識や考え方にポイントがあると思いました。

まずは知識の重要性です。今回は財務のスペシャリストの女性が問題を整理していましたし、家族の対立の際も子供がどのような考えを持つかを大人が知らなければ理解が進まなかったでしょう。

次に「コア」根本の問題を見つけていることです。表面的にはたくさんの問題があっても、まず解決しないといけないのはそんなに多くはありません。セーフウェアの根本原因やなぜなぜ分析にもつながるポイントだと思いました。

最後にUDEからDEに反転させていることです。論文の書き方でも同じようなことをしています。物事を裏側から見ると意外とシンプルになりますし、考えも広がります。

つまり思考プロセスというのは、物事を知り、現実を深め、アイデアを広げることで、3つのツールはそれを支援している。なので、ツールはあくまでも考える道具なので、本業の腕を磨き、考えを深め、広げる際に、必要に応じて使えば良いと思いました。

思考プロセスが単なるツールではないと理解したとき、この本がより素晴らしく感じました。

このエントリーをはてなブックマークに追加


[#Node-RED] Node-REDでTwitterのDMからRedmineのチケットを作成する

前回Node-REDからRedmineのREST API を呼んでチケット一覧を取得しましたが、今回はそれを少しずつ変更しながらちょっと実用的なものを作ります。

httpヘッダーをJSONでセット

前回は文字列としてヘッダーをセットしましたが、複数のヘッダーが必要ですのでJSONに変更します。チェンジノードのデータを「JSON {}」して以下の様にセットします。

{"X-Redmine-API-Key":アクセスキー}

一旦、デプロイしてインジェクトボタン(timestampと表示されているノードの左側の四角いボタン)を押して、右側のデバッグノードの確認します。

20160417_124531

上図のようにエラーが表示された場合は、表示されているノードの名前「APIキー」で確認できますが、エラーメッセージの上にマウスカーソルを移動させると対象のノードが赤の点線で囲まれるので簡単に確認できます。

httpヘッダーをJSONでセット

チケットを作成するにはPOSTで、 Content-Typeの設定が必要です。チェンジノードの設定を以下に変更して、確認します。

{"X-Redmine-API-Key":アクセスキー, "Content-Type":"application/json"}

プロジェクト作成&ID取得

Redmineで、プロジェクト -> 新しいプロジェクトと実行して、更新を受けるプロジェクトを作ります。さらに、プロジェクトを選んでから設定 -> メンバーの右側でユーザとロールを選んで追加しておきます。

プロジェクトIDはNode-RED呼び出しノードのURLをssues.jsonからprojects.jsonに変更して、インジェクトするとプロジェクトIDがわかります。

{ "projects": [ { "id": 3, "name": "自動投稿", "identifier": "social", "description": "ソーシャル投稿用のプロジェクトです", "status": 1, "created_on": "2016-04-17T04:01:39Z", "updated_on": "2016-04-17T04:01:39Z" }, { "id": 2, "name": "親プロジェクト", "identifier": ・・・

同様にステータスIDはissue_statuses.json、トラッカーIDはtrackers.json、優先度は/enumerations/issue_priorities.jsonで得られます。

POSTしてみる

Redmineのドキュメントを参考にチケットを作ってみます。入力をSubjectに入れるので、チェンジノードをあきらめて、ファンクションノードに以下のコードを設定します。

msg.headers =
{"X-Redmine-API-Key": アクセスキー, "Content-Type":"application/json"};
msg.payload =
{
  "issue": {
    "project_id": 3,
    "tracker_id": 4,
    "subject": msg.payload,
    "priority_id": 2
  }
};
return msg;

入力がtimestampでは寂しいので「漢字のサブジェクト」という文字列をインジェクトノードにセットします。設定画面のpayloadで「aZ」を選択して設定します。

デプロイしてdebugタブに以下のような表示がされれば成功です。

{ "issue": { "id": 17, "project": { "id": 3, "name": "自動投稿" }, "tracker": { "id": 4, "name": "タスク" }, "status": { "id": 1, "name": "新規" }, "priority": { "id": 2, "name": "通常" }, "author": { "id": 1, "name": "阪井 誠" }, "subject": "漢字のサブジェクト", "start_date": "2016-04-17", "done_ratio": 0, "spent_hours": 0, "created_on": "2016-04-17T05:57:57Z", "updated_on": "2016-04-17T05:57:57Z" } }

twitter対応

チケット作成が確認できたので、いよいよtwitterに対応しましょう。Node-REDの左側の少し下の方にtwitterノードがありますのでこれをクリックします。すると右側のinfoタブに説明が表示されます。すると、送信者はtopic、内容はtweetにセットされることがわかります。

そこで、テストデータとしてインジェクトノードのtopicに送信者、payloadに漢字の概要を設定して、チェンジノードでmsg.payloadをmsg.tweetにセットします。

Redmineを確認すると、題名が「送信者」、説明が「漢字の説明」となったチケットができているはずです。

twitterノードの追加

入力としてtwitterノードを追加します。「Add new twettier-credentials...」の状態で右のペンのアイコンをクリックするとtwitterの連携用の認証に進むことができます。searchはダイレクトメッセージを選択します。

デプロイして自分にダイレクトメッセージすると、説明にプロフィール等が載っていてそのままではチケットの説明に使えません。msg.tweet.textが求めている送信文でした。最終的にファンクションノードは以下の様なコードになります。インジェクトも同じ様に変更します。

msg.headers =
{"X-Redmine-API-Key":アクセスキー, "Content-Type":"application/json"};
msg.payload =
{
  "issue": {
    "project_id": 3,
    "tracker_id": 4,
    "subject": msg.topic,
    "description": msg.tweet.text,
    "priority_id": 2
  }
};
return msg;

ようやくチケットができました。

20160417_154511

ふりかえり

Node-REDを使って段階的に開発してみました。インタフェースがJSONで統一されているので、インジェクトノードで下流を確認しておいて、あとから実際の通信をすることができます。

時差意の処理はファンクションノードで頑張れば大抵のことはできるのですが、細かく分けて実装するとdebugタブのエラー表示をうまく使えます。

また、infoタブで仕様の確認ができるので、インタフェースを確認しながら作り上げることができます。もし、勘違いがあればdebugノードを追加して簡単に確認できます。

20160417_171132

作成したフロー中のデバッグノードには、右側の四角の部分が白いものがあります。これはデバッグに使ったもので、そのままでは煩わしいので表示を停止したものです。再デプロイしなくても四角の部分を押すだけで変更できます。

まとめ

IoT環境として知られているNode-REDは、通信プログラムが作り易い環境です。

ソフトウェア開発に通信がからむと結合時に実物との擦り合わせが必要です。twitterノードのポーリングは15分に1回ですので、今回の様に段階的に開発しないと開発にとても時間がかかるでしょう。

Node-REDユーザに公開されているノードには、この他にもソーシャネット向けのノードがたくさんあり、無料サービスのFREDでもたくさんサポートされています。

今回はイベントドリブンな方法のみを紹介しましたが、インジェクトノードはcronの様な定期実行も可能です。色々なシステムを作ることが可能でしょう。

ぜひ、一度Node-REDに触れてみてください。
(注:今回利用したtwitterノードはデータ取得を100%保証していないので、実際に使う場合は別の方法でもチェックしてください)

おまけ:Redmineの視点で

今回は前田さんの発表を参考に、メールの代わりにTwitterを入力源として使ってみました。もちろん、文字コードの考慮が必要ですが、RedmineのメールをチェックしてTwitterで通知することも簡単にできます(こちらはデータ抜けがないでしょう)。

さらに応用すれば、社内用とプロジェクト用のRedmine間で更新をリンクさせることも可能になるでしょう。チケット作成時にチケット番号が返ってきますので、それを何かに覚えておけば容易に実現できるでしょう(Node-REDはDBなどのストレージも色々使えます)。

次回は、もう少し大きなシステムを作る際に考えないといけない保守性について書いてみたいと思っています。

このエントリーをはてなブックマークに追加

[#Node-RED] RedmineのREST API を呼ぶ

前回は「Hello World!」のWebサーバを構築しましたが、今回はクライアントとしてNode-REDからRedmineのREST APIを呼んでみます。なおNode-REDとRedmineはローカル環境で動作させました。

20160414_233706

フローの説明

グレイ(青?)のインジェクトノードの左の四角いボタンを推すとタイムスタンプがmsg.payloadに入れられます(中身は使わずタイミングを与えています)。

  1. チェンジノードでmsg.headers(httpヘッダー情報)に「X-Redmine-API-Key=アクセスキー」をセットします。
  2. httpリクエストノードでhttp://Redmineサーバアドレス/redmine/issues.jsonを呼び出(GET)します。
  3. JSONが一つの文字列でmsg.payloadにセットされるのでファンクションノードでオブジェクトに変換します。
  4. デバッグノードでデバッグタブに出力します。

JavaSscriptはたった2行

なお、JavaScriptのコードはファンクションノードに書いた以下の2行だけです。

msg.payload = JSON.parse(msg.payload);
return msg;

Redmineの設定

REST API を有効にする:
管理 -> 設定 -> 認証で、「RESTによるWebサービスを有効にする」をチェック

アクセスキーの取得:
個人設定-> APIアクセスキー(右側に表示されます) の「表示」を押すとAPIアクセスキーが表示されます。必要に応じてリセットしてください。

認証が必要:
管理 -> 設定 -> 認証で「認証が必要」のチェックをしている場合は、ベーシック認証のユーザとパスワードを設定します。この場合はアクセスキーは不要な様です(Redmine 2.5.2で確認しました)。

注意点

デバッグ情報を全て表示したい場合は、REST APIのパラメータでlimitやoffsetを指定してください。途中で表示が切れる場合はNode-REDのsetteings.jsでdebugMaxLengthを変更してください。

おわりに

Node-REDなら、ちょっとした処理をとても簡単に実現できます。今回はインジェクトノードのボタンを押すことで実行しましたが、http、Twitter、メール、Websocket、tcp、udp、MQTT、シリアル、ファイル更新、などを入出力とする事ができます。

このように入力や出力を簡単に取り替えられるのは、ノード間のインターフェースがJSONで標準化されていることのほか、インジェクトノードやデバッグノードが良くできているので、作り易いからだと思います。

次回はその辺りを意識しながら説明してみようと思います([#Node-RED] Node-REDでTwitterのDMからRedmineのチケットを作成する)。

おまけのコード

ローカル環境やFREDでインポートできます(2016/4/18 追記:無料で利用できるのは72時間までになりました)。動かすには、サーバーアドレスとアクセスキーを変更する必要があります。ちなみにローカルIPアドレスですので、攻撃はできません。

このエントリーをはてなブックマークに追加

[#Node-RED] Hello World!からNode-REDを知る

Node-REDはIoT向けのビジュアルツールで、データフローを定義することでプログラミングできます。IBMのEmerging Technologyというチームが開発し、オープンソースで公開されているほか、Bluemixでサポートされています。

node.jsが動作する環境で利用することができますが、体験するだけならFREDにアカウントを作れば無料で色々と開発できます。今回はFREDを使って説明します。
(2016/4/18 追記:無料で利用できるのは72時間までになりました)

まずはHello World!

Node-REDはノードと呼ばれるモジュールを組み合わせて、フローと呼ばれるプログラムを構成します。

ノードには標準のものと公開されているもののほか、カスタムノードがあります。独自のロジックを作るには標準のファンクションノードにJavascriptのプログラムを書くか、Javascriptとhtmlでカスタムノードを作ることになります。

最もシンプルなプログラムは、標準ノードを組み合わせて設定するだけでできます。左側にあるノードをドラッグ&ドロップして配置し、各ノードの丸と丸の間をつなぐだけです。いわゆる「Hello World !」は以下の様になります。

20160410_235702_2

図の上部に3つ直線に並んでいるものをノードという基本的な処理で、最初のノードが「http in」というノードでURLとメソッド「GET」を設定しています。中央のチェンジノードはmeg.payloadに「こんにちは」という文字列を設定しています(ダブルクリックで設定できます)。最後の「http response」ノードは受け取ったmeg.payloadを返します。

たったこれだけの設定で右上の[Deploy]ボタンを押すだけでwebアプリを構築でき、設定したURLにブラウザでアクセスすると、「こんにちは」と表示されます。

(FREDはマルチユーザ対応していますのでURLに特別なルールがあります。ユーザ・ドキュメントを確認してください)

どこでもダンプ& 簡単結合

「msg」と表示さているノードはデバッグノードで、右側のdebugタブに設定したオブジェクトが表示されます。設定によってmsgオブジェクトの一部を表示することもできます。

ノード間はmsgオブジェクトが受け渡されますので、 任意のところに接続するとその全てをダンプできます。これは分割して開発している場合にとても便利です。

先行する処理の出力を、後続する処理の入力として「inject」ノードから与えると、別の拠点で開発していても、事前に結合の確認ができます。

インポートで共有

分散開発にはインポート/エクスポートも便利です。プログラムはJSONファイルですので、右上のハンバーガー(三本線メニュー)-> Import -> Clipbord でペーストすると、他の人の開発したプログラムを読み取ることができます。

例えば GUIでカンタン開発!Node-REDでズンドコキヨシ on @Qiita の下の方にあるJSONをコピーし、上記の方法でインポートしてデプロイすると、すぐにズン!ドコ!キヨシ!を実行できます。

人に渡す場合は、対象のノードを選んでおいて、 右上のハンバーガー(三本線メニュー)-> Export -> Clipbordで表示できますので、コピーして利用します。

最初に示したHello World !はこんな感じになります。

これをFREDでインポートして、https://fred.sensetecnic.com/public/<アカウント名>/hello でアクセスすると「こんにちは」と表示されます。

Node-REDでシステムを開発する際に注意すべき汎用性と保守性について説明する予定でしたが、次回以降もRedmineの紹介をもう少しする予定です( [#Node-RED] RedmineのREST API を呼ぶ)。

このエントリーをはてなブックマークに追加

買って良かったキーボードPC(WP004)購入記

色々と検討した結果、家族用にキーボードPC(TEKWIND WP004)を買いました。意外と悪くない、というか買って良かったです。

20160403_160225_2

検討内容

そもそも購入を検討したのは、自作PCがWindows XPで年賀状以外に使っていない状態だったのですが、家族からブラウザを使いたいとの要望があったからです。

普通に考えるとリプレスです。利用頻度が低いのに折角なら良いマシンが欲しい、でも予算がない、じゃあ中古でと検討しました。Core i5でメモリ16GBなら4万円強、気軽に買えない感じです。

しばらく様子を見ていたのですが、値段も下がらないし、思い切ることもできないので、追加を検討しました。

まずはCrome bookとしてネットブックを蘇らせることを検討しました。お金がかからないのは良いのですが、今あるディスプレイを活かすとスペースの関係で閉じないといけません。電源のON/OFFが面倒そうなのでやめました。

次に検討したのがスティックPCです。値段は色々ですが、2万円ぐらいでブラウズマシンには良さそうです。Windows 10も使ってみたかったので、かなり惹かれました。でも今のディスプレイの空きポートがRGBで変換が必要なのと、年賀状を印刷する際にキーボードの差し替え等が必要なので、思いとどまりました。

そこで、キーボードPCの登場です。キーボードPCなら値段は2万円前後で、電源操作も簡単。HDMIとRGBがついていて、OSはWindows 10。コンパクトなので、今あるキーボードをディスプレイの後ろに隠しておけば、スペースを有効に活用できます。

キーボードPC
スティックPC
ネットブック(s9e)
デスクトップPC
RGB

×
HDMI
×
キーボード

無線LAN

起動
OS
Windows 10 Windows 10
Chromium OS Windows 7?
価格
約2万円
約2万円 無料(再利用) 約4万円

使用感はなかなか快適です。エクスペリエンスインデックスは以下のような感じです。グラフィックス(デスクトップ)以外は良好です。

20160402_222846_3


キーボードはMacbook Airの13インチと比べると、サイズがほぼ同じ大きさで、ストロークが深く、ほんの少しぐらつきがある感じです。カチャカチャ音がしますが、タッチは嫌いじゃないです。

問題はキーボードの配列がいけてないことです。狭いところにタッチパッドまであるので、右シフト、右コントロールがなく、かなキーまで左側にあります。

英語キーの右シフトにあたる大きなキーがアンダースコアになっていて、何じゃこりゃな感じです。家族がブラウザを使う分には文章をガンガン入力しないので、まあ許容範囲です。

以上、キー配列に問題がありますが、全体としてはお買い得だったと思っています。

(おまけ)
このPCを勉強会のプレゼンに使えば話のネタになると思うのですが、誰かしませんか?(見たいだけで、私はしません。念のため)

このエントリーをはてなブックマークに追加


考えろ、理解しろ、整理しろ

渡辺幸三さんのブログ:設計者の発言を読んでいて感じたこと。

日々の仕事をする中で口うるさいと思われても、年長者の務めなのできっかけを見つけては指導している。色々と言っているが、だいたい以下の3つに集約できるだろう。

考えろ

指示されたままに仕事をしたり、いつも通りで良いと思っていないだろうか。

渡辺さんの「論理削除」ではなく「無効化」をスタンプ属性や更新履歴テーブルの無駄っぽさを読んでいると、習慣ではなく考えて仕事をすることの重要性を感じる。

より良い方向を考えても、全体との調和の問題で実施できないかもしれない。しかし、きちんと考えてシステムを作り上げることはとても重要だ。次の仕事に活かせるからだ。

なぜかを理解しろ

学部の恩師の言葉で忘れられないのが「職人になるな勉強を続けなさい」という言葉(社内勉強会より社外の勉強会)。知っているだけではなく、きちんと理解していなければ技術者とは言えない。

人に聞いてわかったつもりで仕事に使い、うまくいったらそれでおしまい。それは技術者でも職人でもない。ただの人工(にんく)に過ぎない。

ものごとの原理は何なのか、その人はどうやって情報を知ったのか、広い目で深く理解していれば、自己流ではないより良い方法が選択できるだろう。

整理しろ

世の中のできる人を見ていると、常に考えて仕事をし、より深く理解しているだけでなく、情報を整理してコンパクトに理解している(できる人を観察して勝負する

得た知識はそのままにしておけば忘れてしまうし、量が増えれば大変になる。知識を活かしてステップアップするには、これまでの知識との関連を整理しておく必要がある。

体系化できていればすべてを覚えておく必要はない。どの資料に書いてあるかを知っていれば、いつでも確認できるからだ。経験のインデックスを作るのだ。

おわりに

世の中には新しい情報があふれているが、実は似たような議論を繰り返していることも多い。

渡辺さんの議論も、コードクローン(リンク先は阪大井上研)は全て悪か、より良いバランスはあるのか、と言う議論に見えなくもない(普及しているオープンソースには一定のコードクローンが存在するらしい)。このようにマッピングできるのは、ものごとを考え、理解し、整理しているからである。

ここに挙げた内容は技術者にとって基本的なことであるが、実践は難しい。自分のことはともかく、若者の可能性を信じて意見するのが年長者の務めだと思っている。

このエントリーをはてなブックマークに追加


« 2016年3月 | トップページ | 2016年5月 »