2021/09/01

TypeScript入門 第4回 コマンドライン引数

ここまで作成したソースコードを使えば計算はできるのですが, 式を変更する毎にソースコードの編集, コンパイル, 実行と手順が多いので使い易くありません. そこで, コマンドライン引数から数式を与えられるようにします. 

1)コマンドライン引数

process.argvを使えば, コマンドラインから引数を取得できます. index.tsに次のようなコードを記述して試してみます.

for (let arg of process.argv) {
    console.log('コマンドライン引数:', arg)
}

実行してみます.

PS C:\TSWork\RPN> .\node_modules\.bin\tsc
PS C:\TSWork\RPN> node .\dist\index.js 1 2 + 4 *
コマンドライン引数: C:\Program Files\nodejs\node.exe
コマンドライン引数: C:\TSWork\RPN\dist\index.js
コマンドライン引数: 1
コマンドライン引数: 2
コマンドライン引数: +
コマンドライン引数: 4
コマンドライン引数: *
PS C:\TSWork\RPN>

2)コマンドライン引数から式を取り出す

実行結果から, process.argvの3つ目以降の要素を配列として取り出せば, コマンドラインから数式を与えられます. つまり, process.argvの0番目と1番目の要素がジャマ, ということです. このような場合, sliceを使って配列をコピーします. index.tsファイルを次のように変更します.

let input = process.argv.slice(2, process.argv.length)
for (let arg of input) {
    console.log('コマンドライン引数:', arg)
}

実行してみます.

PS C:\TSWork\RPN> node .\dist\index.js 1 2 + 4 *
コマンドライン引数: 1
コマンドライン引数: 2
コマンドライン引数: +
コマンドライン引数: 4
コマンドライン引数: *
PS C:\TSWork\RPN>

この結果から, inputをそのままcalc関数に渡せば計算してくれます. 最終的なindex.tsファイルの内容は次のようになります.

// 補助関数
function calcAux(stack: number[], op: (a: number, b: number) => number) {
    let b = stack.pop()
    let a = stack.pop()
    if ('number' === typeof a && 'number' === typeof b) {
        stack.push(op(a, b))
    } else {
        throw new Error('数字が入ってないよ')
    }
}

// 配列を逆ポーランド記法で記述した式として計算する.
function calc(input: string[]) {
    let stack: number[] = []
    for (let value of input) {
        if (value === '+') {
            calcAux(stack, (a, b) => a + b)
        } else if (value === '-') {
            calcAux(stack, (a, b) => a - b)
        } else if (value === '*') {
            calcAux(stack, (a, b) => a * b)
        } else if (value === '/') {
            calcAux(stack, (a, b) => a / b)
        } else {
            let a = parseInt(value)
            stack.push(a)
        }
    }

    if (1 === stack.length) {
        return stack.pop()
        
    } else {
        throw new Error('スタックの要素数が1ではありません. 式を間違えているかも?')
    }
}

let input = process.argv.slice(2, process.argv.length)
// 計算してみる
console.log('計算結果', calc(input))

実行してみます.

PS C:\TSWork\RPN> .\node_modules\.bin\tsc
PS C:\TSWork\RPN> node .\dist\index.js 1 2 + 4 *
計算結果 12
PS C:\TSWork\RPN> node .\dist\index.js 1 2 + 4 * 5 -
計算結果 7
PS C:\TSWork\RPN>

コマンドライン引数の内容に応じて計算することを確認できました.

3)まとめ

この記事では, コマンドライン引数に記述した式を計算するようにプログラムを修正しました. プログラムに式を与える方法として, ファイルからの読み込みも考えられます. しかし, TypeScriptというよりもNode.jsでのファイルの読み込みは, 非同期プログラミングが前提となり, 挫折しそうなポイントですので, 記事を改めてじっくりと考えたいと思います. 

コマンドラインから式を与えられるようにしましたが, 誤った式を与えた場合, 例えば対応していない演算子や数値以外の文字列が与えられた時, エラーを返しません. 次回の記事では, 式として妥当かどうかをチェックする仕組みを入れます. 

最後に, この記事で使用したNode.jsとTypeScriptのバージョンは次の通りです.

PS C:\TSWork\RPN> node --version
v14.17.5
PS C:\TSWork\RPN> .\node_modules\.bin\tsc --version
Version 4.3.5
PS C:\TSWork\RPN>

2021/08/28

TypeScript入門 第3回 関数定義

1)はじめに

前回, 逆ポーランド記法で記述した数式を計算するプログラムを作成しました. しかし, 計算する数式をソースコードに埋め込んであって, 数式を変更するためにはソースコードを編集してコンパイルしなくてはなりません. 使い物にならないので, プログラムとしての体裁を整えていきます.

2)関数の定義

計算する部分を関数として定義し, 計算する数式を引数として与えられるようにします. 関数の戻り値は, 計算した結果とします. 計算の過程を記録するスタックは, 関数の中で定義するローカル変数とします. ソースコードは次のようになりました.

// 配列を逆ポーランド記法で記述した式として計算する.
function calc(input: string[]) {
    let stack: number[] = []
    for (let value of input) {
        if (value === '+') {
            let a = stack.pop()
            let b = stack.pop()
            if ('number' === typeof a && 'number' === typeof b) {
                stack.push(a + b)
            } else {
                throw new Error('数字が入ってないよ')
            }
        } else if (value === '*') {
            let a = stack.pop()
            let b = stack.pop()
            if ('number' === typeof a && 'number' === typeof b) {
                stack.push(a * b)
            } else {
                throw new Error('数字が入ってないよ')
            }
        } else {
            let a = parseInt(value)
            stack.push(a)
        }
    }

    if (1 === stack.length) {
        return stack.pop()
    } else {
        throw new Error('スタックの要素数が1ではありません. 式を間違えているかも?')
    }
}

// 計算してみる
console.log(calc(['2', '3', '+', '4', '*']))

関数名は「calc」としました. 注意点は次の通りです.

  1. 引数名に続けて引数の型を指定する必要があります. 関数の戻り値の型も指定できますが, コンパイラに型推論させる方が良いようです.
  2. 計算結果をコンソールへ出力するコードは削除しました.
  3. 入力をすべて処理できれば, 計算結果を返します. この時, スタックの要素数が1であることを確認し, 1でない時はエラーを投げています.
  4. 関数定義に続いて, 動作確認用のコードを入れています.

このソースコードをコンパイルし実行すると, 計算結果として「20」を表示しました. 問題なく動作しています.

3)演算子の種類を増やす

今のソースコードでは, 対応している演算子は「+」と「×」の2種類だけです. 少なくとも「-」と「/」は対応しておきたいところです. 「+」や「×」を計算するコードをコピーして編集すれば簡単に対応できますが, 似たようなコードが繰り返し現れるのは気持ちの良いものではありません. そこで, 補助関数を導入して全体を見やすくします. 合わせて, 「-」と「/」にも対応します. ソースコードは次のようになりました.

// 補助関数
function calcAux(stack: number[], op: (a: number, b: number) => number) {
    let b = stack.pop()
    let a = stack.pop()
    if ('number' === typeof a && 'number' === typeof b) {
        stack.push(op(a, b))
    } else {
        throw new Error('数字が入ってないよ')
    }
}

// 配列を逆ポーランド記法で記述した式として計算する.
function calc(input: string[]) {
    let stack: number[] = []
    for (let value of input) {
        if (value === '+') {
            calcAux(stack, (a, b) => a + b)
        } else if (value === '-') {
            calcAux(stack, (a, b) => a - b)
        } else if (value === '*') {
            calcAux(stack, (a, b) => a * b)
        } else if (value === '/') {
            calcAux(stack, (a, b) => a / b)
        } else {
            let a = parseInt(value)
            stack.push(a)
        }
    }

    if (1 === stack.length) {
        return stack.pop()
        
    } else {
        throw new Error('スタックの要素数が1ではありません. 式を間違えているかも?')
    }
}

// 計算してみる
console.log(calc(['2', '3', '+', '4', '*', '5', '/', '2', '-']))

補助関数の引数は, スタックと演算子に対応した関数を取れるようにしています. このようなプログラミング技法に慣れていない方は, 関数型プログラミングに関する書籍などで勉強することをお勧めします. 

補助関数の注意点として, スタックからポップした値を変数に割り当てる順序を「a, b」から「b, a」に変更しています. 引き算や割り算では, この順序を間違えると正しい答えは得られません. 補助関数を使うことで, calc関数の見通しが良くなりました. このソースコードをコンパイルし実行すると, 計算結果として「2」を表示しました. 問題なく動作しています.

3)まとめ

この記事では, 前回, 作成したプログラムの構成を変更し関数を定義して, プログラムらしく仕上げました. また, 計算のための補助関数は, 関数そのものを引数として与えられるように定義しました. TypeScriptのように型を厳密にチェックしてくれるプログラミング言語であれば, このようなテクニックを安心して使えます. 

しかし, 計算する式を変更するためにソースコードを編集するのは煩わしくなってきました. 次回の記事では, ソースコードを編集せずに計算する式を変更する方法を試します.

最後に, この記事で使用したNode.jsとTypeScriptのバージョンは次の通りです.

PS C:\TSWork\RPN> node --version
v14.17.5
PS C:\TSWork\RPN> .\node_modules\.bin\tsc --version
Version 4.3.5
PS C:\TSWork\RPN>

2021/08/25

TypeScript入門 第2回 逆ポーランド記法

新しいプログラミング言語の勉強を始める時は, 簡単なプログラムを作成するようにしており, 逆ポーランド記法(Reverse Polish Notation, RPN)で書かれた数式を計算するプログラムを作成することから始めています. 逆ポーランド記法に馴染みのない方もおられると思うので, 逆ポーランド記法の説明から始めます. なお, 記事が長くなるので分割します. 

1)逆ポーランド記法

多くのプログラミング言語では, 算数や数学の授業で習った数式と同じ形式で数式を書きます. 例えば, 2と3の足し算は次のように書きます.

2+3

この式に4を掛けてみます.

(2+3)×4

2+3×4

「2+3」全体に4を掛ける場合と3だけに4を掛ける場合とで計算結果は異なります. 一般に使う数式では, 次の事柄を把握しておかないと計算結果がとんでもないことになります.

  1. +や×などの演算子の優先順位
  2. カッコの有無や入れ子の具合

通常の数式では, +や×などの演算子は数字と数字の間に置きますが, 逆ポーランド記法では演算子を最後に置きます. 例えば, 「2+3」を次のように書きます.

2 3 +

「2に3を足す」と日本語の語順通りに読めます. 同じようにして, 「(2+3)×4」と「2+3×4」も逆ポーランド記法で書いてみます.

2 3 + 4 ×

2 3 4 × +

上の式は「2に3を足して, その結果に4を掛ける」, 下の式は「2に, 3と4を掛けた結果を足す」と読めます. 賢明なる読者の皆様はすでにお気づきの通り, 逆ポーランド記法で書いた式にはカッコが現れていません. また, 演算子の優先順位も考えなくて済みます. 

2)スタック

逆ポーランド記法で記述した式を計算する手順, 即ちアルゴリズムを考えていきたいのですが, その前にスタック(Stack)と呼ばれるデータ構造を確認する必要があります.

スタックは, 机の上に積んだ本をイメージすると分かりやすいと思います. 

スタックに対して行える操作は次の2つです.

  1. プッシュ(Push):積んである本(つまり, スタック)に新しい本を載せる.
  2. ポップ(Pop):スタックの1番上の本を取る.

スタックでは, 一番上に積んである本に対してのみ働きかけられ, 途中の本については何もできません. スタックの一番底にある本を取り出すためには, 1番上にある本から順に取り除く必要があります. 

3)アルゴリズム

スタックを用いれば, 逆ポーランド記法で記述した式を計算するアルゴリズムを簡潔に述べられます. 

  1. 式を構成する数値や演算子といった要素を順番に処理します.
  2. 数値の場合, スタックにプッシュします.
  3. 演算子の場合, スタックから数値を2つポップし, 演算子に応じた計算をした結果をスタックにプッシュします.
  4. 式の終端に到達した場合, スタックには1つだけ数値が残っており, その数値が求める答えです. 
  5. 計算の途中で空になったスタックからポップした場合や, 最後に2つ以上の数値がスタックに残っている場合, 不正な式と判断できます. 

4)試してみる

TypeScriptの配列をスタックとして使うためのpushメソッドとpopメソッドがあります. これらを使ってアルゴリズムを試してみます. 

まず, TypeScriptのプロジェクトを作成します. ディレクトリ名は逆ポーランド記法ということで「RPN」としています. プロジェクトの作成方法については, 前回の記事を参照してください. とりあえず, 関数の定義とかも考えず, 入力となる式もソースコードに埋め込んで, 計算できるものを作ります. でき上ったプログラムは次の通りです.

console.log('逆ポーランド記法')

// 入力となる式
let input = ['2', '3', '+', '4', '*']
console.log('入力', input)

// 計算のためのスタック
let stack: number[] = []
console.log('スタック', stack)

console.log('計算開始')
for (let value of input) {
    console.log('入力値', value)
    if (value === '+') {
        let a = stack.pop()
        let b = stack.pop()
        // let c = a + b
        if ('number' === typeof a && 'number' === typeof b) {
            stack.push(a + b)
        } else {
            throw new Error('数字が入ってないよ')
        }
    } else if (value === '*') {
        let a = stack.pop()
        let b = stack.pop()
        if ('number' === typeof a && 'number' === typeof b) {
            stack.push(a * b)
        } else {
            throw new Error('数字が入ってないよ')
        }
    } else {
        let a = parseInt(value)
        stack.push(a)
    }
    console.log('スタック', stack)
}

console.log('計算終了')
console.log('スタック', stack)

コンパイルして実行してみます.

PS C:\TSWork\RPN> .\node_modules\.bin\tsc
PS C:\TSWork\RPN> node .\dist\index.js
逆ポーランド記法
入力 [ '2', '3', '+', '4', '*' ]
スタック []
計算開始
入力値 2
スタック [ 2 ]
入力値 3
スタック [ 2, 3 ]
入力値 +
スタック [ 5 ]
入力値 4
スタック [ 5, 4 ]
入力値 *
スタック [ 20 ]
計算終了
スタック [ 20 ]
PS C:\TSWork\RPN>

期待通りの結果が得られました.

ソースコードでは, 演算子が入力された場合, スタックから数値をポップしています. この時, スタックが空の場合があるため, ポップした結果がundefinedである可能性があります. そのまま計算しようとすると, TypeScriptに怒られてしまいます.

TypeScriptのコンパイラ報告するエラーは事前に潰さなくてはコンパイルすらできません. TypeScriptでは, このようなコンパイル時のエラーに対応するためのソースコードを丁寧に書いて, コンパイラを納得させてからようやく実行できます. これが煩わしく感じられる人もいると思いますが, リリース後にこのような不具合が見つかることを考えると, コンパイラのご機嫌を取るぐらい何ともありません. 逆に, 慣れてくるとコンパイラのチェックの甘いプログラミング言語は怖くて使えなくなります.

ソースコードはコピペしてもらっても良いのですが, 自分で入力することをお勧めします. 自分で入力することでコンパイラの応答を観察できるので, 理解がより深まります. 

5)まとめ

今回の記事では, 逆ポーランド記法で記述した式を計算するためのアルゴリズムを確認しました. 次回の記事では, 作成したプログラムをそれらしく仕上げていきます.

最後に, この記事で使用したNode.jsとTypeScriptのバージョンは次の通りです.

PS C:\TSWork\RPN> node --version
v14.17.5
PS C:\TSWork\RPN> .\node_modules\.bin\tsc --version
Version 4.3.5
PS C:\TSWork\RPN>

2021/08/22

TypeScript入門 第1回 環境構築

1)はじめに

プログラムを実行する環境がデスクトップPCからスマートフォンに移っています. スマートフォンだけで動作するプログラムもありますが, スマートフォンはインターネットと常時接続できるため, サーバと協調して動作するプログラムも多くあります. スマートフォンが接続するサーバは, 自前で用意したオンプレミスのサーバよりもアマゾンのAWSやマイクロソフトのAzureといったクラウドサービスを利用したサーバが大半でしょう. 

このようにプログラムの開発・実行環境がデスクトップPCやオンプレミスのサーバからクラウド環境に移行しており, プログラマとして今後も仕事を続けていくためには, クラウド環境は避けて通れません. クラウド環境でプログラムを開発するのですから単純に仮想マシンを使うのではなく, AWS LambdaやAzure Functionsといったサービスを組み合わせて作りたいものです. そのために最適なプログラミング言語を選んでおきたいので, いろいろと検索して調べた結果, 型安全性を保証してくれるTypeScriptが良さそうな感じがします. 

15年ぐらい前にWebアプリケーションを開発するためJavaScriptを使って以来, JavaScriptから離れていましたので, TypeScriptはもちろんのこと最新のJavaScript事情やNode.jsについて何の知識もありません. 急ぎ書店で「プログラミングTypeScript」と「ハンズオンNode.js」を買い求め, この2冊を一通り読んでみましたが, 分かったような, 分からないようなモヤモヤした感じです. やはり, 簡単なもので良いのでTypeScriptを使ってプログラムを作らないとそのプログラミング言語を習得できません.

これに続く記事では, 私がTypeScriptに入門するにあたり, 試したこと, 考えたことを書きますので, 参考にしていただけると幸いです. なお, この記事では, TypeScriptでプログラムを開発するための環境を構築し, TypeScriptで書いたプログラムが動作するところまでを説明します.

2)環境構築

TypeScriptでプログラムを作成するために用意したものは次の通りです.

  • Node.js
  • Visual Studio Code

Node.jsはTypeScriptで書いたプログラムをJavaScriptにコンパイルし, 実行するために使います. ブラウザ上でTypeScriptを試せる「TypeScript Playground」もありますが, クラウドでサーバレスを目標にしていますので, Node.jsは必須でしょう. 

Visual Studio Code(以下, VSCodeと書きます)はソースコードを編集するためのテキストエディタです. テキストエディタは他にも色々とありますが, 情報が得られやすいVSCodeを選択しました. 

3)最初のプロジェクト

TypeScriptでプログラムを作成するための準備から始めす. まず, エクスプローラなどを用いて作業用のディレクトリを作成します. ディレクトリ名は「HelloTypeScript」としました. PowerShellを起動し, 作成したディレクトリに移動します. 続けて, 次の4つのコマンドを実行します. 

> npm init -y
> npm i -D typescript
> npm i -D @types/node
> npx tsc -init

1番目はプロジェクトの初期化, 2番目はTypeScriptコンパイラのインストール, 3番目はTypeScriptからNode.jsのAPIを使うための型情報のインストール, 4番目はTypeScriptのための初期化を実行しています. 4番目のコマンドはnpmでなくnpxであることに注意してください. lsコマンドを使ってディレクトリの中身を確認するといくつかのファイルができています. 


VSCodeを使って, tsconfig.jsonファイルを編集します. ここは, 「プログラミングTypeScript」の流儀に従って編集します. 編集結果は次の通りです.

{
  "compilerOptions": {
    "target": "es5",                                
    "module": "commonjs",                          
    "outDir": "./dist",     // コメントを外し, 出力ディレクトリにdistを指定             
    "strict": true,                             
    "esModuleInterop": true,                     
    "skipLibCheck": true,                          
    "forceConsistentCasingInFileNames": true      
  },
  "include": ["src"]        // 追加
}

tsconfig.jsonファイルの内容を見やすくするために, コメント行は削除しました. また, 編集した2行にコメントを付けています. 

tsconfig.jsonファイルの設定内容に合わせて, ディレクトリなどを作成します.

  1. distディレクトリを作成する.
  2. srcディレクトリを作成する.
  3. srcディレクトリ内にindex.tsファイルを作成する.
  4. index.tsファイルに「console.log('Hello TypeScript!')」と入力する.

これらのディレクトリやファイルは, VSCodeの画面左側, エクスプローラを使って作成できます. 作成した結果は次の通りです.


index.tsをコンパイルして実行します. PowerShellで次のコマンドを実行します.

> .\node_modules\.bin\tsc
> node .\dist\index.js

実行結果は次のようになります.


Windows10の設定によっては, tscを実行した時に次のようなエラーが表示されます.


このようなエラーが表示された場合, 

スタート→設定→更新とセキュリティ→開発者向け

の順に画面を開き, PowerShellスクリプトの実行を許可します.


ここまでできれば, TypeScriptで開発するための最低限の環境が整いました. 次回から簡単なプログラムを作成しながら, TypeScriptコンパイラの反応を観察し, 勘所を探っていきます.

2019/06/30

[読書] 「うつ」は炎症で起きる(エドワード・ブルモア 著)


著者は、ケンブリッジ大学精神医学科長であり、神経科学とメンタルヘルス分野のエキスパートです。著者の主張は、「うつ」は脳を含む体の炎症が引き起こす、というものです。

この30年、医療は劇的に進歩してきましたが、「うつ」などの心の病気に関しては停滞している状況です。この原因として、「うつ」に関する適切なバイオマーカーが無いことが挙げられます。

例えば、糖尿病であれば血糖値、高血圧であれば血圧、などを用いて病気の兆候などを判断できます。一方、「うつ」に関しては脳内のセロトニンが不足している、などと言われますが、脳内のセロトニンの濃度を正確に測る安価な方法はありません。つまり、薬が効いているかどうかを客観的に判定する基準がありませんでした。

また、体の病気や怪我と「うつ」などの心の病気は完全に分離して扱われてきました。これは、デカルトの二元論に始まり、体を血と肉でできた機械とみなすことで医療は発展してきました。更に、血液脳関門によって、白血球などの免疫細胞や免疫タンパク質が脳への侵入を防いでいると考えられていたため、体と心を分けて扱う根拠となっていました。

しかし、最近の研究により、血液脳関門は免疫細胞や免疫タンパク質を通過させており、また、体の炎症が「うつ」の原因となっていることを示す証拠が出てきています。これらについては、神経免疫学という分野で研究が進んでいます。つまり、体の炎症が脳に伝わり、脳が炎症を起こした結果が「うつ」であると考えられます。

なぜ、体が炎症を起こすと「うつ」になるのか、現代の生活では「うつ」になるメリットは何一つありませんが、かつてサバンナで暮らしていたときには「うつ」になるメリットがあったようです。

サバンナで部族社会の一員として暮らしていたとすると、狩猟や部族間の抗争により傷を負うことがあります。傷を負えば感染症にかかる可能性が高まるため、免疫系が活発になり体に炎症反応が生じます。この時、傷の回復に専念するため、体を休めなくてはなりません。つまり、「うつ」の症状を出すことで体を休めることができます。

このようなことから、体の炎症反応の度合いを測定することが「うつ」のバイオマーカーとなる可能性があります。これについては、神経免疫学の進展を待たねばなりません。

体の炎症を抑えれば心の健康にも良さそうです。研究の成果が出てくるまで、10年単位の時間が必要となりますので、それを待ちたくありません。体の炎症を抑える方法として、ヴィム・ホフ・メソッドがあります。これについては、改めて書きます。

2018/06/09

[読書] 太陽を創った少年:僕はガレージの物理学者(トム・クラインズ 著)



この本の主人公テイラーは、9歳でロケットの推進剤を作り始め、11歳のとき核物理学に目覚めて放射性物質を集め始めます。医療用の放射性物質(がん細胞用のマーカ)を安価に製造するための中性子源として使うために核融合炉を創り始め、14歳で核融合炉を稼働させます。

核融合炉を稼働させるためには、恒星間レベルの真空度を実現し、5億度に耐える容器が必要なため、技術レベルは非常に高いものです。ただ頭が良いだけでなく、自分の手を動かして試行錯誤の末、動くものを作り上げてしまうことが驚異的です。

この偉業はテイラーの天才的な頭脳だけでなく、テイラーの両親の協力がなければ達成できませんでした。ガイガーカウンターが鳴りっぱなしなるような放射性物質を11歳のテイラーが集め始めたとき、それを止めさせずにテイラーの防護策の安全性を評価でき、必要な事を助言できる人を探し出しています。簡単にできることではありません。

テイラーのような天才児は、神から特別な才能を与えられた、ということで「ギフテッド」と呼ばれますが、その才能が「祝い」となるか「呪い」となるかは育った環境に強い影響を受けます。テイラーの例は稀であり、多くの場合はその才能が「呪い」となります。この本を読むことで、天才児の才能を伸ばすために親ができることを学べます。

私の娘も小学1年生となりましたが、テイラーのような特別な才能はなさそうです。しかし、あらゆる才能が平均値ということはないはずで、何か人よりも得意なことがあるはずです。娘の才能を見つけ伸ばすために、私がこの本から学んだことは次のとおりです。

1)子供にいろいろな経験をさせる
 どんな才能を持っているか分かりません。

2)子供をよく観察する
 何が得意かを見つけ出さねばなりません。

3)すばやく行動する
 子供が興味を示したとして、その興味が長く続くとは限りません。

4)自分の趣味を押し付けない
 きっと私がやりたくないことに娘は興味を示すはずです。娘の意思を尊重しなくては上手くいかないでしょう。

 

2018/05/28

[読書] 退屈すれば脳はひらめく(マヌーシュ・ゾモロディ著)


待ち時間が数十秒あれば、スマホを取り出しメールをチェック、返信、続けて情報収集。できるビジネスパースンは、1秒たりとも無駄にしない\(^o^)/

と、言いたいところですが、私の現実はこんな感じ。

昼休み。14時から会議があるんか。もうちょっとましな時間に設定せえよ。というても、遅れるとカッコ悪いから13時50分にアラームを設定しとこ。スマホのロックを解除。メール、LINE、Facebookに未読がある。未読を一通りチェックしたから、スマホを机に置いて、・・・・・

何か忘れとる。スマホで何するんやったんか、脳みそを振り絞って、・・・・・・

思い出しました、アラームの設定でした\(^o^)/

スマホのロックを解除して、そういえば、Twitterをチェックしてへんかった・・・・・

このようなことを繰り返しているとアホになる、がこの本の主張です。

1.時間を無駄にしている。
 上の例の場合、アラームを設定するだけなのに5分以上の時間がかかっています。

2.集中力がなくなる。
 長い文章を読めなくなったり、理解できなくなります。

3.新しいアイデアが浮かばなくなる。
 これは意外でした。何もすることがなく時間を持て余すと、脳のデフォルト・モード・ネットワークが活動するそうです。この時に新しいアイデアが浮かんできます。いわゆる「三上」です。

ちょっとしたスキマ時間にスマホを取り出して何かしていると、デフォルト・モード・ネットワークが活動することはありませんので、新しいアイデアが出てこなくなります。この本の冒頭で著者も告白していますが、私にとっても死活問題です。

スマホを捨てたいところですが、スマホなしでは色々と差し障りが出てきます。著者も繰り返し述べていますが、スマホを遠ざけるデジタル・デトックスは現実的ではなく、スマホを意識的に使うことが必要となります。

この本では、スマホを意識的に使えるようになる方法を7つのステップで示しています。私は、運良くスマホへの依存度が低かったようで、次の3つだけで済みました。

1)スマホを使う時は何をするか意識し、最初にそれを片付けることを心がける。
2)未読が少しぐらい溜まっても死ぬことはない、と腹をくくる。
3)すべてのアプリについて通知を一旦OFFにし、通知の必要性を慎重に吟味する。

スマホ、というよりアプリの向こうにいる企業に、
 A)どれぐらいの時間を吸い取られているか、
 B)吸い取られた時間に対し十分な見返りをアプリから受け取っているか、
を定期的に振り返りたいものです。


ヒューマン・リソース・マシーン 入社41年目−並べ替えよ

目次 1)課題 0を終端とした文字列がいくつか流れてきます。各文字列に対してソート(並べ替え)を行い、小さい順(昇順)に右側へ運んでください。 2)状況の確認 この問題では, 予めコードが入っています. このコードを実行して, 何をするコードなのか確かめます.  左のコンベアから...