膨張空間

開発日記を中心に、時々雑記を投稿します。よろしく

インプット大全のアウトプット

精神科医の樺沢紫苑著書のインプット大全を読んだ自分なりのまとめをアウトプットする。本の内容を正確にまとめた内容ではなく個人の感想なので注意してほしい。

よくあるまとめ系の記事だと、まとめは最後に書くものだが、私はダラダラと感想を書かれていると、早くまとめだけ読ませてくれと思う事があるので、そんな人向けてまとめから書こうと思う。

まとめ

  1. インプットは量より質を重視する
  2. 必要な情報以外は捨てる勇気を持つ
  3. 記憶に留めて初めてインプット
  4. インプットはアウトプット前提で行う
  5. インプットと目標はセット
  6. 興味・関心のアンテナを意識する
  7. 情報は自分で探しに行かない
  8. 休憩中にスマホはNG

以上

1. インプットは量より質を重視する

自分にとって質の低いインプットを積み重ねるより、質の高いインプットを少しでも積み重ねる方がより成長できる。Twitterとかインスタを何時間見たって試験には受からない。質の低いインプットとは見たり聞いたりしても自分にとって興味や関心がなく、ただ見ているだけ、聞いているだけのインプット。見てるだけのSNS全般はこれ、Youtubeも面白いけど、自分の糧になるような物を選んで見よう。YouTubeなどSNS全般はいかにユーザーを中毒にするかを考えて作られているので、それに負けない。質の高いインプットとは気付き、すべき事、得られる事が多いインプットの事。 得た情報に、なるほど。と納得して自分が良い方向に向かって行けるようなインプットが質の高いインプット。

2. 必要な情報以外は捨てる勇気を持つ

ある実験によるとネットニュースなどから得られた質の低いインプットは1週間後に約97%を忘れていたとのこと。Twitterのタイムライの内容はほぼ覚えてないでしょって事。自分にとって本当に必要な情報・知識に時間を集中する事でインプット効率が上がる。こればっかりだと疲れるからバランスが大事だけど意識しておかないといつも通りダラダラ携帯を眺めて、あー時間がない。とか言っちゃう人になる。 必要でない情報は「見ない」「接続しない」。これも意識的に情報から鎖国する事で自分の目標に集中する。

気がついて、スマホチェックは、無駄だから

3. 記憶に留めて初めてインプット

  • 偽のインプット
    • 再生不可:手に入れた情報を思い出せないなど
    • 説明不可:手に入れた情報を説明する事ができない

自己満足

  • 真のインプット
    • 再生可能:手に入れた情報を思い出す事ができる
    • 説明可能:手に入れた情報をまとめて説明する事ができる

自己成長

4. インプットはアウトプット前提で行う

ある実験で、インプットした後にテストをすると伝えたグループと、インプットをした後に人前で説明してもらうと伝えたグループに分けてインプットを行った。結果は後者の方がより、多くの情報を記憶していた。人前で説明しなければならないため細部まで注意深くインプットしていたことと、緊張感を持っていたために記憶に残ったと推測していた。つまり、アウトプット前提のインプットの方が学びの効率が高い。 私も、インンプット大全でアウトプット前提にと読んでから、まず、メモを取りながら読んだ。その後に知人に内容を伝えた。そして、このプログにアウトプットしている。これくらいアプトプットすると嫌でも内容を覚える。私はこの手の自己啓発本が好きで、よく読んでいたのだが、読んでも身につかない事が悩みだった。友人は身につかないからもう読まないとさえ言っていた。大学生の頃から自己啓発の本を読んでいるのでまぁまぁな数を読んでいるはずだ。しかし、全く覚えていない。 まさに、偽のインプットを質より量でこなしてしまった状態だ。これからは量より質をアプトプット前提でインプットして行こうと決めた。

5. インプットと目標はセット

量より質が大事なのはわかった。アウトプット前提でインプットした方が記憶に残りやすいのもわかった。では、なぜ、インプットは目標とセットで行うのか。それは目標までの道のりが決まると、インプットの方法が具体的に決まるからである。例えば、1年後に英語で日常会話ができるようになるという目標を設定した時に、じゃあ、半年で個人レッスンができるくらいに英語が話せるようになる。3ヶ月でグループレッスンで話せるようになるなど、目標達成に必要な精度の高いインプットの方法を決める事ができるようになる。その結果、自己成長速度が早くなる。 私はこの本を読んでから、そんなに日数が経っていないので自己成長ができているかは判断が難しいところだが、少なくとも読んで終わりではなく本の内容に従ってこの記事を書いているので、自分としては良い方向に向かっていると思う。他の本も読んでいるので、近いうちに感想をブログにしようと思う。

6. 興味・関心のアンテナを意識する

人は自分が興味を持っている情報をキャッチしやすい。この自分が興味を持っている情報をキャッチすることを、選択的注意というらしい。筆者は選択的注意のことを「興味・関心のアンテナ」と名付けている。 街中でCMが流れている時に、同じ場所にいてもよく覚えていたり、全く覚えていなかったりする。人は無意識のうちに「興味・関心のアンテナ」で情報の取捨選択を行っているのだ。 自分のアンテナを意識してアンテナの強化をしよう。具体的に興味・関心がある分野を3つあげることを筆者は勧めている。

7. 情報は自分で探しに行かない

最もやってはいけない情報の探し方はネットサーフィンと筆者は言っている。目的なく情報を探していても重要な情報は一割ほどしか手に入らない。30分ネットサーフィンをしていた場合、27分は無駄な時間を過ごしているということになる。最近はネット通販が当たり前になってきて、商品が自宅に届く時代だ。情報も同じように、自分の元に届くようにした方がいい。具体的な方法としてTwitterで自分にとって有益な情報を発信している人物をフォローするなどを例に上げていた。

8. 休憩中にスマホはNG

脳の80%は視覚情報を処理している。休憩時間にスマホを見ていては脳が休まらない。脳は視覚情報を遮断した瞬間から休憩状態になるので、数分間目を閉じるだけでも疲労が回復する。 また、スマホを長時間使用するほど、集中力は低下する。その結果、注意散漫になり仕事の効率や、学力低下、幸福度低下などのデメリットが発生する。ある実験では、スマホの使用時間が1時間増えるごとに数学の点数が5点下がるという実験結果がある。スマホ、テレビ視聴、ゲームを長時間行うと、その後、30分間は脳の機能が低下する。この時にいくら一生懸命勉強しても記憶には残り難いためだ。さらに人間は睡眠中に記憶を整理する。寝る15分前が記憶のゴールデンタイムと言われている。よくある、勉強して寝る前にベットでSNSをチェックなどを行うと、インプット同士が衝突して記憶が整理されない。さらにスマホブルーライトで睡眠効率が低下までする。

最後に

文頭でも伝えたがあくまで、個人的感想であり本の内容を正確に伝えているものではない。書いてある内容を信じるかどうかはしっかりと自分で調べてから判断してほしい。今回紹介した内容は、私がインプット大全を読んで、私のアンテナに引っかかった内容である。本はもちろんこのブログより、丁寧にわかりやすく、そしてもっと詳しく、多くの情報が書かれていた。少しでも興味を持ったなら躊躇する必要はないので、買ってみて欲しい。

以上。

StreamReaderで指定したレコードに自動分割する

目的

手動でファイルを分割して名前を指定して保存するのが面倒なので、ファイルを自動で分割して保存するようにした。

環境

詳細

実際のコードはここを参考にしてほしい。実際に使用しているので最低限のチェック処理が書いてある。

ポイント1:必要ファイル数を計算する

読み込むファイルの行数が不明なので、ファイルをいくつ分けるか判断する必要がある。 「ReadAllLines」メソッドを使って読み込み元のファイルを読み込んでその件数を取得している。件数をdoubleで宣言しているのがキモ。次のファイル数を計算する箇所で明示的にdoubleで宣言していない場合、暗黙的にintで宣言される。そのため、小数点部は必ず0になり切り上げしたくても狙った数にはならない。

//読み込み元のファイルレコード数
var RecordCount = (double)File.ReadAllLines(FilePath).Count();

//作成するファイル数を取得する
var LoopCount = Math.Ceiling(RecordCount /  (double)MaxFileRecord);

ポイント2:途中ファイルの読み込みは指定行数まで

よくあるサンプルでは「while (sr.Peek() > -1)」で最終レコードまで読み込んで、1行ずつテキストに出力しているものが多い。そのままでは指定した行数毎にファイルを分割できないので、事前に計算していした1ファイルの最大行数(MaxFileRecord)までレコードを読み込んでからファイルに出力してループを抜けるようにしている

//読み込んだ回数が指定したレコード数の時は
if (ReadCount == MaxFileRecord)
{
    //新しいファイルに書き込んで
    sw.WriteLine(NewText);

    //while (sr.Peek() > -1)を抜ける
    break;
}

ポイント3:最後はReadToEndで一気に読み込む

ReadToEndを使うことでファイルの終端まで読み込むことができる。StreamReaderを使用したファイル読み込みのサンプルでよく見る。便利なので通常の読み込みであればこれで十分だ。ReadToEndの読み込み開始位置はPositionから読み込む。Positionは読み込みを行うことで1文字ずつ移動していく。今回はStreamReader.WriteLineを使用して行単位で読み込んでいるので1行づつ移動していくことになる。 そのため最後のファイル以外を読み込んだ後にReadToEndを使用すると残りの行数が一気に取れる。

    //最後のファイルの時は
    if (i == LoopCount)
    {
        //StreamReader.ReadToEndで最後の行まで読み込む
        sw.WriteLine(sr.ReadToEnd());
    }

ファイル作成の主要部分を抜粋

//読み込み元のファイルレコード数
var RecordCount = (double)File.ReadAllLines(FilePath).Count();

//作成するファイル数を取得する
var LoopCount = Math.Ceiling(RecordCount /  (double)MaxFileRecord);

//引数のファイルパスからフォルダパスを取得する
var DirPath = Path.GetDirectoryName(FilePath);

//引数のファイルパスからファイル名を取得する
var BaseFileName = Path.GetFileNameWithoutExtension(FilePath);

//読み込み元のファイルをStreamReaderで開く
using (var fs = new FileStream(FilePaFileMode.Open, FileAccess.Read, FileShare.R)
using (var sr = new StreamReader(Encoding.UTF8))
{
    //作成するファイル数分繰り返す
    for (int i = 1; i <= LoopCount; i++)
    {
        //1ファイルに書き込むテキストを保持する変数を宣言
        var NewText = string.Empty;

        //新しいファイルのパスを生成する
        var NewFilePath = Path.Combine(DirP string.Format("{0}_{1}.csBaseFileName, i));

        //処理した行数をカウントする変数を宣言する
        var ReadCount = 0;

        //新しいファイルをStreamWriterで開く
        using (var newfs = new FileSt(NewFilePath, FileMode.OpenOrCreaFileAccess.ReadWriFileShare.ReadWrite))
        using (var sw = new StreamWriter(ne Encoding.UTF8))
        {
            //最後のファイルの時は
            if (i == LoopCount)
            {
                //StreamReader.ReadToEndで最後の行まで読み込む
                sw.WriteLine(sr.ReadToEnd());
            }
            else
            {
                //レコードが読み込めなくなるまで繰り返す
                while (sr.Peek() > -1)
                {
                    //読み込んだレコードを保存用の変数に追加する
                    NewText = NewText + sr.ReadLine() + Environment.NewLine;

                    //読み込んだ回数をカウントする
                    ReadCount++;

                    //読み込んだ回数が指定したレコード数の時は
                    if (ReadCount == MaxFileRecord)
                    {
                        //新しいファイルに書き込んで
                        sw.WriteLine(NewText);

                        //while (sr.Peek() > -1)を抜ける
                        break;
                    }
                }
            }
        }
    }
}

余談

ここは余談なので興味がない人は読み飛ばしてもらってかまわない。なぜこの機能が必要になったのかというと、業務で数万行のCSVファイルを取り込む処理を定期的に実行していた。取込に問題はなかったのだが取込後のチェックSQLタイムアウトが頻発していた。原因は特定していたが業務にクリティカルな修正になるので修正できなかった。そのため、一時的な逃げとして数万行のファイルを1万行に分割して取り込んでいた。当初は別の人間が対応していたのだが、なんやかんやで自分にお鉢が回ってきた。素直に手作業でやるのが面倒だったのでドラッグ&ドロップでファイルが分割できる機能を開発した。調べて見ると開始からN行までとか。N行目から最後までとかは割と出てきた。しかし、指定した行で自動分割する記事は見つからなかった。なので、もし同じ処理を行いたい人が出てきた時の参考になればいいなと思い記事にした。正直、コードのプラッシュアップはしていないので冗長な書き方になっているかもしれないがご容赦願いたい。

まとめ

  • 必要ファイル数を計算する
  • 途中ファイルの読み込みは指定行数まで
  • 最後はReadToEndで一気に読み込む

参考サイト