work」カテゴリーアーカイブ

HTMLテーブルの列の表示非表示や行の入れ替えをJavaScriptで実装する方法

JavaScriptでtableを操作するサンプル

HTMLテーブルを操作することは、Web開発において重要なスキルの一つです。この記事では、JavaScriptを使ったHTMLテーブルの列の表示非表示や行の入れ替えの方法を解説します。

ドラッグドロップで列を入れ替える

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Tableの列の入れ替え</title>
  <style>
    table {
      border-collapse: collapse;
    }
    th, td {
      border: 1px solid #ccc;
      padding: 0.5rem;
      text-align: center;
      cursor: move;
    }
  </style>
</head>
<body>
  <table id="myTable">
    <thead>
      <tr>
        <th>名前</th>
        <th>年齢</th>
        <th>性別</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>山田太郎</td>
        <td>20</td>
        <td>男性</td>
      </tr>
      <tr>
        <td>鈴木花子</td>
        <td>25</td>
        <td>女性</td>
      </tr>
      <tr>
        <td>田中一郎</td>
        <td>30</td>
        <td>男性</td>
      </tr>
    </tbody>
  </table>

  <script>
    let draggingColumn;

    // ドラッグ開始時に実行する関数
    function handleDragStart(e) {
      // ドラッグされた列の位置を保存する
      draggingColumn = e.target.cellIndex;
    }

    // ドラッグオーバー時に実行する関数
    function handleDragOver(e) {
      // ドロップ先の列の位置を取得する
      const dropIndex = e.target.cellIndex;

      // ドラッグされた列とドロップ先の列が異なる場合
      if (draggingColumn !== dropIndex) {
        const rows = document.querySelectorAll('#myTable tbody tr');
        rows.forEach(row => {
          // ドラッグされた列とドロップ先の列のセルを取得する
          const draggingCell = row.cells[draggingColumn];
          const dropCell = row.cells[dropIndex];

          // ドラッグされた列をドロップ先の列の前に挿入する
          if (draggingColumn < dropIndex) {
            row.insertBefore(dropCell, draggingCell);
          } else {
            row.insertBefore(draggingCell, dropCell);
          }
        });
      }
    }

    // 各列にイベントリスナーを登録する
    const columns = document.querySelectorAll('#myTable th');
    columns.forEach(column => {
      column.setAttribute('draggable', true);
      column.addEventListener('dragstart', handleDragStart);
      column.addEventListener('dragover', handleDragOver);
    });
  </script>
</body>
</html>

このコードでは、各列にdragstart、dragoverの2つのイベントリスナーを登録しています。dragstartイベントが発生した際には、ドラッグされた列の位置を変数draggingColumnに保存しています。そして、dragoverイベントが発生した際には、ドロップ先の列の位置を変数dropIndexに取得し、ドラッグされた列とドロップ先の列が異なる場合には、querySelectorAllメソッドを用いてテーブルのtbody要素内にあるすべての行を取得し、forEachメソッドを用いて各行に対して以下の処理を実行しています。

1.ドラッグされた列とドロップ先の列のセルを取得する。
2.ドラッグされた列をドロップ先の列の前に挿入する。

こうすることで、列の入れ替えを実現することができます。

ボタン操作で行を入れ替える

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Move Table Row Sample</title>
    <style>
      table {
        border-collapse: collapse;
      }
      th, td {
        border: 1px solid black;
        padding: 0.5em;
      }
      .dragged {
        opacity: 0.5;
      }
    </style>
  </head>
  <body>
  <table>
    <thead>
      <tr>
        <th>ID</th>
        <th>Name</th>
        <th>Age</th>
        <th>Gender</th>
        <th>Action</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>1</td>
        <td>John Doe</td>
        <td>25</td>
        <td>Male</td>
        <td><button onclick="moveUp(this)">Up</button><button onclick="moveDown(this)">Down</button></td>
      </tr>
      <tr>
        <td>2</td>
        <td>Jane Smith</td>
        <td>30</td>
        <td>Female</td>
        <td><button onclick="moveUp(this)">Up</button><button onclick="moveDown(this)">Down</button></td>
      </tr>
      <tr>
        <td>3</td>
        <td>Bob Johnson</td>
        <td>40</td>
        <td>Male</td>
        <td><button onclick="moveUp(this)">Up</button><button onclick="moveDown(this)">Down</button></td>
      </tr>
      <tr>
        <td>4</td>
        <td>Alice Williams</td>
        <td>35</td>
        <td>Female</td>
        <td><button onclick="moveUp(this)">Up</button><button onclick="moveDown(this)">Down</button></td>
      </tr>
    </tbody>
  </table>
  <script>
    function moveUp(button) {
      const row = button.parentNode.parentNode;
      if (row.previousElementSibling) {
        row.parentNode.insertBefore(row, row.previousElementSibling);
      }
    }
    function moveDown(button) {
      const row = button.parentNode.parentNode;
      if (row.nextElementSibling) {
        row.parentNode.insertBefore(row.nextElementSibling, row);
      }
    }
  </script>
  </body>
</html>

このサンプルでは、

要素内の行をドラッグして入れ替えることができます。行をドラッグしたとき、dragstartイベントが発生して、ドラッグ中の行を保持します。ドラッグ中の行が他の行の上に移動すると、dragoverイベントが発生して、ドラッグ中の行を他の行の前または後ろに移動します。行をドロップすると、dragendイベントが発生して、ドラッグ中の行をリセットします。

列の一部を非表示にする

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>テーブルの列の表示非表示を切り替えるサンプル</title>
  <script>
    function hideColumn(columnIndex) {
      var table = document.getElementsByTagName("table")[0];
      var rows = table.rows;
      for (var i = 0; i < rows.length; i++) {
        rows[i].cells[columnIndex].style.display = "none";
      }
    }

    function showColumn(columnIndex) {
      var table = document.getElementsByTagName("table")[0];
      var rows = table.rows;
      for (var i = 0; i < rows.length; i++) {
        rows[i].cells[columnIndex].style.display = "";
      }
    }
  </script>
</head>
<body>
  <table>
    <thead>
      <tr>
        <th>名前</th>
        <th>年齢</th>
        <th>メールアドレス</th>
        <th>電話番号</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>山田 太郎</td>
        <td>25</td>
        <td>taro.yamada@example.com</td>
        <td>012-345-6789</td>
      </tr>
      <tr>
        <td>鈴木 次郎</td>
        <td>30</td>
        <td>jiro.suzuki@example.com</td>
        <td>03-1234-5678</td>
      </tr>
    </tbody>
  </table>
  <button onclick="hideColumn(1)">2番目の列を非表示にする</button>
  <button onclick="showColumn(1)">2番目の列を表示する</button>
</body>
</html>

上記のコードでは、hideColumn関数を使用して、2番目の列を非表示にし、showColumn関数を使用して、2番目の列を表示することができます。

行の一部を非表示にする

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Hide Table Row Sample</title>
    <style>
      .hidden {
        display: none;
      }
    </style>
  </head>
  <body>
    <table>
      <thead>
        <tr>
          <th>Name</th>
          <th>Age</th>
          <th>Gender</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>John Doe</td>
          <td>30</td>
          <td>Male</td>
        </tr>
        <tr>
          <td>Jane Smith</td>
          <td>25</td>
          <td>Female</td>
        </tr>
        <tr>
          <td>Bob Johnson</td>
          <td>40</td>
          <td>Male</td>
        </tr>
      </tbody>
    </table>

    <button onclick="toggleGender('Male')">Toggle Male Rows</button>

    <script>
      function toggleGender(gender) {
        const rows = document.querySelectorAll('table tbody tr');
        rows.forEach((row) => {
          const genderCell = row.querySelector('td:nth-child(3)');
          if (genderCell.innerText === gender) {
            row.classList.toggle('hidden');
          }
        });
      }
    </script>
  </body>
</html>

このサンプルでは、各行の3列目(Gender列)の値がMaleである行を非表示にするために、行全体にhiddenクラスを追加します。toggleGender()関数は、ボタンがクリックされたときに、各行のGender列の値が引数で指定された値(この場合はMale)と一致する場合に、その行を表示または非表示に切り替えるために、行全体に対してhiddenクラスをトグルします。

Java初心者がJavaのプロになるためのおすすめ本

概要~Java初心者が現場使えるJavaプログラムを理解するまでのおすすめ参考書ロードマップ~

仕事を始めてJavaに取り組むようになった方は多いのではないでしょうか。
私も実は仕事を始めて初めてJavaを知った/勉強したのですが、最初色んな言葉が出てきて大混乱。勉強が結構大変だったことを覚えています。

そんな経験があったため、最近入ってくる新人さん向けに私が10年働く間にJava初心者に何を学んでもらえばいいか考え、行き着いた結果の良質と考えている参考書10選を今回紹介します。

つまり、個人的Java初心者が現場使えるJavaプログラムを理解するまでの参考書ロードマップの紹介です。

想定読者

  • 仕事を始めてJavaプログラムが必要になった人
  • Javaの勉強を始めて専門用語が多過ぎて勉強に挫折しそうな人

結果

忙しい人はとりあえず結果だけご覧ください。

Java良書10選

  1. やさしいJava
  2. スッキリわかるJava入門
  3. スッキリわかるJava入門 実践編
  4. リーダブルコード
  5. オブジェクト指向でなぜつくるのか
  6. Webを支える技術 ―― HTTP,URI,HTML,そしてREST
  7. 独習Java
  8. プロになるJava
  9. Java言語で学ぶデザインパターン入門
  10. Effective Java

やさしいJava

それでは紹介です。最初はやさしいJavaです。

やさしいJava

まず最初の一冊はわかりやすさを重要視して選んでいます。なぜならJavaの特徴として、他の言語に比べわかりにくい専門用語多く、初心者にはプログラムの理解より言葉の理解最初のハードルがまず高い事が挙げられるからです。

そのため、Javaの入門書は今となってはたくさんありますが、まずは入門書としてタイトルの通り非常にわかりやすいこの本から入るのがいいかなと思っています

スッキリわかるJava入門

次はスッキリわかるJava入門です。

スッキリわかるJava入門

Javaの入門書は1冊ではちょっと物足りないため、もう一冊入門書的な位置づけの本を入れています。
2冊を読み比べて重要なところ、1冊では理解できなったところをもう1冊で補完して、自分の理解力を高めることが重要と考えています。
Javaは1冊だけでは書ききれない重要な概念が多いため、出来れば2冊入門書を読みましょう。

スッキリわかるJava入門 実践編

次はスッキリわかるJava入門の続編、スッキリわかるJava入門 実践編です。

スッキリわかるJava入門 実践編

1歩進めて実践編が本書になります。実際に現場で使える内容となっているので、基礎を理解した上で、読み進めるといいかなと思います。

リーダブルコード

次はリーダブルコードです。
ちょっと箸休めです。

リーダブルコード

内容を知っている人は、なぜここでリーダブルコード?と思う人もいると思うのですが、私はこのタイミングがベストと思います。
プログラム初心者が読む本として位置付けされることもあると思いますが、私はJavaが分かってから読むべき(一度読んでいても再読すべき)と考えています。
自身でJavaコードをある程度書けるようになってからこの本を読むとよりリアルな気づきがあると思います。そう言えばあの時書いたあのコード、リーダブルではなかったな。など。

オブジェクト指向でなぜつくるのか

次はオブジェクト指向でなぜつくるのかです。
こちらもJavaに特化した内容ではないため箸休め第2弾です。

オブジェクト指向でなぜつくるのか

そもそもなぜJavaがここまで流行ったのか、オブジェクト指向はどんなに便利なのか、Javaでオブジェクト指向で作るというのはどういうことなのか理解するのに良い本と考えています。

Webを支える技術 ―― HTTP,URI,HTML,そしてREST

次はWebを支える技術 ―― HTTP,URI,HTML,そしてRESTです。
箸休め第3弾(最後の箸休め)です。そろそろプログラムを見ることに疲れた人向けです(^^;)

Webを支える技術 ―― HTTP,URI,HTML,そしてREST

皆さんがJavaを勉強する理由は様々だと思いますが、最近はWebシステムを作るケースが多いのではないでしょうか。
そんな人向けの本になっているので、私はWeb関係ないという人は飛ばしてもらっていいのですが、Javaで「HTTP,URI,HTML,そしてREST」をプログラミングするという人はぜひ読んでおいてください。
コードが書けるだけではWebシステムは完成しません。なぜそのようなコードが必要かを理解できるようになると思います。

独習Java

箸休めが終わりまとめ編になります。
まとめ関連のおすすめは独習Java です。この本を読んで基礎の振り返りをしっかりする、自信の技術力として定着化するイメージで選んでいます。

独習Java

この本は昔からある良書の扱いになるので教科書的な本になります。そのため丁寧なのですが、最初の1冊としては他の本に読み易さという点で譲りましたが、重要なポイントの抑え方、記載テーマ、サンプルコードなどがやはり入門本からは1つレベルアップしたような教科書的な良書 になっています。いつでも振り返れるよう手元に置いておきたい内容になっています。

プロになるJava

次はプロになるJavaです。
タイトルの通りですが、ここからプロになりましょう(^^)

プロになるJava

ここまでで基礎を固める -> 実践を学ぶ -> プロになる というレベルアップを想定しています。
印象としては、実践を学ぶ -> プロになる 部分はちょっと飛躍的レベルアップなのですが、その部分は実際に自分の手を動かしてプログラミングした結果や実際やったこと読んだことをGoogle検索等で補完しながらレベルアップすることを想定しています。(ここまで読んだ読者ならそれが出来るだけのレベルアップがされていると考えています)

Java言語で学ぶデザインパターン入門

プロになったら次はデザインパターンを学びましょう。

Java言語で学ぶデザインパターン入門

正直プロなったところがJavaで給料をもらえるというスタートラインと思います。
つまり、ここまでのJavaプログラマーでは現場で技術力の差別化が出来ません。
そこで、オッこの人はJavaがかなり出来るなと思ってもらえるようにデザインパターンを学びましょう。
現場でこれはファクトリーデザインパターンですね。なんて、会話が出来るとJavaで自信をもって仕事をしているなと言えると思います。

Effective Java

ついに最後の1冊、10冊目です。
Effective Java です。

Effective Java

もはや説明はいらないくらいJavaをしっかり勉強したことがある人なら誰でも知っている名書と思います。
ただ、いきなりこの本を読んで理解できる人は少ないと思うので今回の最後の1冊として紹介する形で記載しました。
皆さんもぜひここまで読み進めてみてJavaの理解を深めてください!

まとめ

今回は、Java初心者が現場使えるJavaプログラムをプロとして理解するまでのおすすめの参考書10冊を紹介しました。
これらを理解すれば間違なく私はJavaのプロフェッショナルです。と、自信をもって仕事ができる人材になれるかなと思って選抜しているので、これからJavaを頑張ろうと思っている人がいたらぜひ参考に1冊でも読んでみてください。

本投稿が少しでも皆さんの良いJavaライフの助けになればと思います(_ _)

SE/システムエンジニアとして大切な10のこととは?

概要

気がつくとSEとして10年を超える会社員人生を過ごしていたので、
そんな10年を振り返って仕事を進める上で大切と思える10のことをまとめてみた。
具体的な知識/技術ではなく敢えてSE/システムエンジニアとしての行動というより普遍的な内容に絞って記載。
忙しさで忘れないための備忘録と定期的に思い出し/更新して自分への戒めとするための記事にしたい。
行動することの重要性を忘れないよう、いつでも行動に移すための具体的な行動も記載。

10年という経験を通したノウハウとして書いているので書籍とは違った生の声として誰かの役に立てばと思う。

SEとして大切な10のこと

  • 仕事は人との関わりであることを知る
  • 人との調整ごとは早めに行動する
  • プログラムを学ぶ
  • いつも目的意識を持つ
  • チーム全体としての生産性を考える
  • 今やるべきことは未来からの逆算で決める
  • 勉強する習慣を身につける
  • 時間の重要性を意識する
  • できるだけ経験し失敗する
  • 変化は当たり前と考える

仕事は人との関わりであることを知る

仕事である以上、1人で完結することはあり得ない。少なくとも仕事に対する対価をもらうお客さんはいるはずで、お客さん以外にもお客さんのお客さん(いわゆるエンドユーザー)や上司/チームメンバや他社のメンバなど様々な人との関わり合いで成り立っていることを認識する。つまり、技術力/論理的思考といった技術面のスキルだけではなく、相手の立場に立ち感情/共感といった心の部分にも働きかけることができるスキルも大切になる。それらはコミュニケーション力や人間力を磨くことによって培われる。
アウトプット(成果)の観点から見ると、世界一/日本一というトップクラスの技術力を持つ一部のスペシャリストを除くと、技術面の個人的スキルでの成果には限界があり、他者と協力して出した成果の方が大きくなることが多い。私も含め大多数の人はスペシャリストなるには非常にハードルが高く、すると自然と他者との協力による成果で仕事をすることになる。(ただし、他者の協力を得るためにはある程度個人の技術スキルに基づた信頼関係が必要)

〇明日からできる具体的な行動

  • 身だしなみに気を付ける/元気に挨拶をする
  • 1日1回雑談をする
  • たくさんの人に話をして普段から仕事に巻き込んでおく
  • つまらない雑用こそ大切に。小さな実績/小さな信頼を積み重ねる

人との調整ごとは早めに行動する

仕事は人との関わりである以上、必ず人の仕事を手伝う/または人に仕事を依頼する場面がある。10年仕事をしていると自分でできる仕事は大抵自分さえ頑張ればなんとかなる。問題になるのは、仕事をお願いしていた人が思った通りに動いてくれない時。そのため、人に仕事を依頼する上で大切なのは借りは作らずできるだけたくさんの貸しを作っておくこと、また出来る限り早く依頼することが重要。
こういった調整ごとは先手先手で対処すれば、本来それほど難しい問題とならないことがほとんどで、依頼が遅れて後手になるほど条件が厳しくなる。

〇明日からできる具体的な行動

  • 普段からたくさんの貸しを作れるよう誰かのために行動する
  • 遅くても2週間後の見据えた計画を立てる
  • 普段から良好な関係が築けるようコミュニケーションを大切にする

プログラムを学ぶ

どんなに大きなシステムになっても行き着く先はプログラム。例え、ノーコードやパッケージソフトであっても、プログラム工程を外注先に丸投げしていても、どのようにプログラムされているかを理解することは重要。特に大規模になればなるほど性能部分や他システムとの連携部など、コアになる部分で問題が発生することがあり、その部分の解決にはプログラムはなぜ動くのかという根本的な理解が必要。
プログラムを知ることで技術者としての誇り/自信を持つことができる。

〇明日からできる具体的な行動

  • 自分の手を動かしてプログラムを書いてみる
  • 常に自分だったらどうプログラムするかをイメージする
  • 流行りの本もいいが昔からあるいわゆる名書を読む

いつも目的意識を持つ

10年間仕事していても華やか瞬間は一瞬。思い返しても数回程度。過ごしてきた時間の大部分は単調な作業、繰り返し作業となる。それらを意識した上で、この作業は最終的にどんな目的達成のために行っているかを理解することで、単調な作業でも作業効率や細部の作業品質が変わってくる。
つまらない仕事と愚痴る前に、目の前の仕事がどういうもので、何を目指し、今どういう状況であるかということを見極めて、自分自身で考え、必要であれば変えていくという意識が大切。
いわゆる「3人のレンガ職人」。レンガを積む仕事は、ただ積んでいるだけなのか?それとも大聖堂の一部を作っているのか?を意識するのとしないのでは積み上げたレンガに大きな品質の違いが出ることがある。
目の前のプログラムはただ文字を解析するだけなのか、実は世界を支える重要なシステムの一部なのかを意識するのは非常に重要。
人間は、自然と不要なものは意識しない脳になっているため、目的を理解して初めて意識できることが多い。

〇明日からできる具体的な行動

  • 作業を始める前に本来の目的を把握する
  • 仕事の全体を俯瞰して理解する
  • 全体を理解した上で自分の作業がどのような影響を与えるか考える

チーム全体としての生産性を考える

自分がたとえどんなに仕事の天才だとしてもできる作業は1人分(多くて1.5人分とか)。それ以上の成果を出すには自分で極端に無理をするかメンバにお願いする必要がある。メンバにお願いする時、メンバに対し威圧的な態度や仕事の責任として作業を押し付けて無理やりやらせることをしない。メンバの生産性を最大限に引き出すためは、同じ目標に向かってメンバ自ら行動してもらう事が重要になる。

〇明日からできる具体的な行動

  • メンバのモチベーションを考えて行動する
  • メンバと目的を共有する場を繰り返し作る
  • 作業をお願いするときは意志決定の過程を含め話しをする

今やるべきことは未来からの逆算で決める

目的意識のところでも書いたように、人間の脳は不要なものは無視するように出来ている。今の仕事を今後の自分にどれだけ活かせるかは、自分が将来どこに向かっているかを意識することが重要。そのために自分の軸/仕事に対する価値観を早めに認識し、その未来に向かって今の自分が何をすべきかを考え行動する。

〇明日からできる具体的な行動

  • 自分の3年後をイメージする
  • 3年後に向かって1年間の目標を立てる
  • 1年間の目標から今日からできる具体的な行動を書きだし行動する

勉強する習慣を身につける

SEという仕事は、技術の進歩が速いと言われる業界、また時代の流行りもあり生涯1つの専門性、1つの業務知識だけでやり遂げられることは不可能と思える。結局、その時その時にあった技術/業務を学べるよう勉強する習慣をつけておく必要がある。

〇明日からできる具体的な行動

  • 1日または1週間に〇時間と決めて勉強する時間を習慣化する
  • 自分の興味の延長で勉強することが一番習慣化しやすいため興味のある分野を見つける
  • 定期的に本屋に通うなど新しい技術に触れる機会を増やす

時間の重要性を意識する

10年は長いようであっという間。10年間の時間の使い方で今後10年分の給料は稼げる可能性はあるが、時間は絶対に戻せない。
お金のために時間を使うのでなく、時間のためにお金を使う価値観にシフトする
人生には必ず終わりがありそれまでの日数と1日24時間しかないことは決まっている。時間を何に投資するかを考え行動する。

〇明日からできる具体的な行動

  • 自分自身にアポを取り自己成長など有効に使う時間を意識的に確保する
  • 言われた作業を単調にこなすだけのために時間を使わない
  • やらないという選択肢も視野に入れる

できるだけ経験し失敗する

勉強は大切だが10勉強するより1回経験する方が圧倒的に身に付くことが多い。
何事も経験するチャンスがあればチャレンジする。特に若いうちは。
10年後にやっておいてよかったと思い返すことは大成功した経験より失敗した経験の方が多い。チームでの仕事は後から思い返しすと失敗した経験が楽しい思い出になることが多い。逆にチャレンジせずにうまくこなしていた日々を思い出すことはない。
これは山登りに似ている。平坦な道を歩いても心が晴れ渡るような景色は見られない。つらい想いをして登った山の方が素晴らしい景色が見える。
失敗とはうまくいかなかった時点であきらめること、またはチャレンジしないこと。あきらめずに次の行動を決めて、決めたことを本気で実行し続けることが大事。それが将来大きく成功するための唯一の方法。

〇明日からできる具体的な行動

  • チャンスがあればまずチャレンジする
  • チャンスにむけて事前に準備(人との関係作り、勉強等)する
  • 失敗しても失敗はいつか終わることを知る

変化は当たり前と考える

すべては作られた時から陳腐化が始まる。この記事も仕事のやり方も。
他人は変えられないが、自分は意志さえあればいつでも変えられる。
変化に合わせて常に自分の方向性の方を修正する

〇明日からできる具体的な行動

  • 自分を振り返る時間を作る
  • 自分を疑う時間を作る
  • いつでも挑戦者である気持ちで臨む

まとめ

10年を振り返っていろんな経験/書籍から得たことをまとめてみた。
いずれも個人的な経験をもとにしているため万人に通じるものではないが誰かの役に立てばと思う。

最後に書いたように、変化は当たり前。これからも記事のアップデート、自分の行動のアップデートを忘れずにいたい。

いくつか書籍の文章をそのまま載せているところもあるため、参考文献を以下に記載。

参考書籍


SEの基本 この1冊ですべてわかる
【Kindle版】SEの基本 この1冊ですべてわかる


ドラッカーさんに教わったIT技術者が変わる50の習慣
【Kindle版】ドラッカーさんに教わったIT技術者が変わる50の習慣


大富豪からの手紙
【Kindle版】大富豪からの手紙

2024年5月
 12345
6789101112
13141516171819
20212223242526
2728293031