simon’s diary

思うがままに書き綴る。。。

勉強がてらvimの使い方をまとめてみる

現在、Linuxの勉強をしている。やはり、新しいスキルを手に入れることは楽しい。

ところで、vimlinuxに内蔵されているエディター。LinuxにはEmacsというエディタもあり、よくどちらの方がよいかということで議論になるらしい。vimの方が簡単そう、かつデフォルトっぽいので、vimを勉強する。

テキストを開くとき、vi,vimどちらのコマンドでも開けるとだが、厳密にはviとvimは違うらしい。vimはviの上位互換コマンドらしく、vimの方が機能が豊富なよう。ただ、大体の環境ではvimの機能が全てviコマンドで使えるのであんまり気にしなくていいのかも。

qiita.com

完全にここのまとめをパクった。 

escキー:ノーマルモード
iキー:入力モード
vキー:ビジュアルモード
:キー:コマンドモード

※入力モード、ビジュアルモード、コマンドモードに入るには、
必ずノーマルモードに戻らないといけない。つまり、入力モード→ビュジュアルモードみたいなモードの変換はできない。

ノーマルモード(escキー)

1.移動モード

  • ^:行頭へ移動
  • $:行末へ移動
  • gg:ファイルの先頭行へ移動
  • G:ファイルの行末の先頭へ移動
  • ctrl + f:次の画面に移動
  • ctrl + b:前の画面に移動
  • w:次の単語の先頭に移動
  • b:前の単語の先頭に移動
  • f文字:現在行の中で指定した文字に移動。;で次の単語に移動する。日本語の扱いに注意 

2.編集、削除

  • x:カーソル上にある単語を削除
  • dd:カーソル上にある行をカット(カット後、ペースト可能)
  • ndd:カーソル上にある行からn行カット
  • w:カーソル上にある単語を削除し、入力モードに変更
  • p:コピー、カットした文字をペースト
  • yl:カーソル上の一文字をコピー
  • nyl:カーソル上の文字からn文字コピー
  • yy:カーソル上の行をコピー
  • nyy:カーソル上の行からn行コピー

3.検索

  • /文字:Enterで文字の検索。nで下方向に検索、Nで上方向に検索
  • /Ctrl + p:コピーした文字の貼り付け

4.取り消し

  • u:前の操作を取り消す
  • ctrl + r:取り消したもの元に戻す

5.保存、終了

  • ZZ:保存して終了

ビジュアルモード(vキー)

  • 矢印:選択範囲を指定
  • y:選択した範囲をコピーして終了
  • x:選択した範囲をカットして終了

コマンドモード(:キー)

1.設定

  • w:保存
  • w ファイル名:ファイル名をつけて保存
  • q:終了
  • q!:変更を保存せずに終了
  • set number:各行に行数を表示
  • syntax on:シンタックスハイライトをONにする
  • set ignorecase:検索時に大文字、小文字を区別しない
  • set noignorecase:検索時に大文字、小文字を区別する

2.置換

  • s/変更対象文字列/変更後文字列/:カーソル行の対象文字一箇所のみ置換
  • s/変更対象文字列/変更後文字列/g:カーソル行も対象文字を全て置換
  • %s/変更対象文字列/変更後文字列/g:ファイル内の対象文字列をすべて置換
  • %s/変更対象文字列/変更後文字列/gc:ファイル内の対象文字列をすべて置換(一回ご:とに確認)

qiita.com

次はこっちも勉強しよう。

 

 

 

成長を加速するキャリアの積み方

個人で受けていたDMP開発の仕事がほぼ終わった。設計のレビュー、実装の部分を受け持って、どうにかお客さんにも満足してもらって(たぶん)、充実感でいっぱいだ。エンジニアとしてはまだまだキャリアが浅いけれど、今まで培った技術をフルにアウトプットできたと思っている。また、ほとんど経験のない言語を使って開発を行って、問題とは全て一人で解決して、仕事を完結できた。これで休日を使って、ダブルワーク可能なことも分かったし、自分一人で仕事をできることも分かった。このことは大きな自信に繋がった。

話は変わって、今、僕が携わっているプロジェクトはAPIのテストについて話をしたい。リーダーの方が非常に技術的な知見が深い方で、僕が今まで携わってきたプロジェクトでは、テストの実施フェーズは手動で行っていたが、このプロジェクトでは全自動でテストをしようということで、テスト計画を作っている。

junit,Jenkins,RunScopeなど使ってテストの実施をしていくのだが、どのツールもほとんど利用したことがないし、テスト計画やちゃんとしたテスト設計をした経験はゼロだ。現在のプロジェクトにおいて、まだまだチームの力になれていない。自分のスキルの低さを痛感するし、悔しい、申し訳ないと思う。

でも、これだけ一気に新しいことを知ることができるなんて、本当に幸せなことだと思う。確かに、自分のできることから少しずつできることを広げていくのが、負担が少ないし、会社・クライアントにも確実にバリューを提供できて、いいのかもしれない。しかし、個人として飛躍的に成長速度を高めることはできないと思う。

こんなキャリアの積み方をしていると仕事で怒られること、失敗することがたくさんあるだろう。でも早く成長してたい人は進んでこのようなキャリアを積んでいく方がいいのかもしれない。特に僕のような凡人は。

 

自分に足りないテクノロジーナリッジまとめ

上流工程から携わる企業に転職して、非常に感じるのが、技術力が高い人が少ないということだ。なぜ、技術力が低いかというと、開発などの単価の安い部分は海外の開発拠点や下請け会社さんに依頼するから。単価の高いマネージメントなどをしっかりと技術力をつける前から担当しないといけなくなる。だから、技術は中途半端で、コミュニケーション能力が長けている人が非常に多い。プロダクトに関して、どのように実現しているかという知識が欠落していて、どんなことができるかという情報だけ収集して、編集して、お客さんに提案する。そのため、技術力ではなく、資料編集力(エクセル,パワーポイントのスキル)や交渉力などが非常に長けていく。

でも、結局、システムの構築段階になって、実際に作り方がわからないから、そのような場面で技術力の高い人や協力会社が重要となってくる。

僕にとって、資料編集力やちょっと長けたコミュニケーション能力よりも圧倒的に技術力を付けるほうが難しいと思ったし、将来的に技術を知っているほうが確実に市場価値の高い人間になれると思ったので、初めにあえて実装をばりばりしなければならない下請の会社で働いた。そして、転職して現在の会社で非常に価値の高い人材担っていたと感じる。

技術力だけできる人に比べたら、市場ではコミュニケーション能力が高い人(もちろん、それなりの頭の良さはPMOとかもマネージメントのロールでも必要)の方が価値が高い。なぜなら、SIにおいて、マネージメントの役割のほうが成果に対して影響度が大きいから。しかし、コンサル(営業)やマネージメントは自分では仕事を生み出すことができないし、(プロダクトを生み出すことができないという意味で)エッジのたった、これといったスキルをつけることが難しい。だから、技術力の習得を目指しました。エンジニアリングの習得は非常に勉強しなければならないから、難しい道ではあるが。

さて、本題です。今後の勉強計画を設計してみる。

年内

  • Linuxの基礎を習得→LPI2の資格を取得
  • 統計学(R言語)の基礎を習得→Rによるやさしい統計学の問題をすべて解けるようになる
  • VMwareの特性を理解し、利用できるようになる→購入した本を年内に二回読む
  • JavaでJenkinsを年内に使えるようにする→Jenkinsの本を読み、JavaでWEBアプリの作成

年明け→4月まで

  • TCP/IPの基礎を習得
  • 分散処理システム(Hadoops)
  • ファイヤーウォール構築
  • 要件定義の方法

とりあえず、来年の4月までに粗方のIT技術を習得し、4月から起業するために事業計画やアイディア出しを行って、2016年の11月、僕が26歳になったときに起業できるように進めていこう。

 

 

 

面白いブログってどう書くの?

私は今までにポータルサイトを運営したり、企業のブログを運用したり、コンテンツマーケティングの施作について何かと考えることが多かったです。今はデジタルに関するマーケティングが私のスペシャリティですが、WEBサイトのコンテンツマーケティングって本当に難しいと思うんですよね。何故かというと決まった答えがほとんどなくて、差別化が非常に難しいから。エッジの立ったコンテンツを集め続けることは非常に難しいんです。ブログ自体を始めるのはとっても簡単ですが、エッジの立ったコンテンツを集められない、書けない。また多少は役に立つ情報を持っていても、成果を出すためには、ある程度の量や継続性が必要なので続かない。

誰でもできるようで、成果の出せる人はごく一握りだと思っています。こんなに参入障壁が低くて、競合が多く、答えのない中で、自分でPDCAサイクルを回しながら成果を出せる人はなにやっても成果を出すんじゃないかな。もともと文才がある人とかはまた別だと思いますが。。

今までの経験から、このブログコンテンツを何にしようかなーと考えた結果、自分が書きたいことを書こうという結論に至りました。それが一番、面白いコンテンツを発信できるということです。

  • 情報収集しながら書く→知識詰め込み型のブログ。他のサイトと似たようなブログになりやすい。また、時間がかかる。
  • 情報収集しないで書く→時間がかからず、ブログを書くのにストレスがかからない。元からの知識量が多い、または発信したい内容が既にないといけない。
  • 分野を絞って書く→SEO的にはいい(はず)、書く内容がなくなってくる。
  • 分野を絞らないで書く→SEO的にはよくない、自由に記事の内容を決めれる。

私は以前、基本的に分野を絞りながら、また情報収集しながらブログを運営していたんですが、SEO的にはいいんですけど、いろいろ工数がかかったりして、記事を書くことがストレスになり、長続きしないんですよね。(タイピングが遅くて、記事を書くのに時間がかかっていたことも長続きしなかった原因だと思いますが、、)だから、今回は初めて、SEOなんか考えず、好き勝手書いてやろうと決めました。文章の見直しもほとんどしません。ほぼ趣味ですね笑。

なんか主題とずれたけど、面白いブログっていうもの定義が難しいので、PVが多いブログだとすると、やっぱり、ある程度分野を絞って、かつ、わかりやすいとか示唆に富んでいる記事だったりするけれど、なかなか難しいので、私は今は書きたいことを気ままにアウトプットするための場ぐらいに思って、ブログを更新し続けています。

たくさん記事を書くなかで、ちょっとずるレベルアップに励んで、いつか自然に面白い記事が書けているまで、スキルレベルを上げたいと思います。

ぐるぐる系 VS ガツン系と結合の備忘録

こちらの記事の続きです。書籍の内容が重すぎて、まだまだまとめることが多そうです。

simon.hatenadiary.com

ぐるぐる系 VS ガツン系

SQL単体はFor文の機能がないため、For文(ぐるぐる系)を用いようとするとストアドプロシジャーを利用することになる(またはサーバーサイドプログラミングでfor文を利用するなど)。しかし、パフォーマンスを上げるために、できるだけ、ストアドプロシジャーを用いないこと(ガツン系)。

ぐるぐる系の処理のパフォーマンスが悪い理由は以下の二つの理由である。

  • 一つ一つの処理にオーバーヘッドが必要
  • 並列分散処理ができない

また、処理自体が単純なため、RDBMSの進化の恩恵を受けられない(チューニングポテンシャルがほとんどない)ことから、求められる性能がでないときは下記のような対策が取られるが、コストが非常に高いので、初めからぐるぐる系の処理を用いることを最小限にとどめることが求められる。ぐるぐるの処理回数が決まっていて、処理内容が多くない場合、ぐるぐる系の処理のほうがパフォーマンスがでることもあるので、例外的にぐるぐる系の処理でもよい。

  • ぐるぐる系処理をガツン系に書き換える
  • CPUなどの物理的に性能の良いものに変える

相関サブクエリ

サブクエリ内に外側のクエリとの結合条件を記述することでテーブルをその結合キーでカットした部分集合に対して操作を行うことを可能にする技術。ウィンドウ関数のPARTITION BY句とORDER BY句と同じ機能をもつ。

結合

クロス結合

直積(非常に演算コストが高い)

SELECT * FROM Employees CROSS JOIN Departments;

内部結合

直積の部分集合、相関サブクエリと書き換え可能なことが多い

SELECT E.emp_id, E.emp_name, E.dept_id, D.dept_name

 FROM Employees E INNER JOIN Departments D

  ON E.dept_id = D.dept_id;

外部結合

マスタ側のテーブルだけに存在するキーがあっても、キーを削除せず、結果に保存。値のない部分はNULL。クロス結合の部分集合でない要素もあることがあるので、外部結合という。

SELECT E.emp_id, E.emp_name, E.dept_id, dept_name

 FROM Departments D LEFT OUTER JOIN Employees E 

  ON D.dept_id = E.dept_id;

※左のテーブルがマスタ

結合アルゴリズムとパフォーマンス

オプティマイザが選択可能な結合アルゴリズムは主に以下の三つ。RDBMSによってサポートしていないものもある。

  1. Nested Loops
  2. Hash
  3. Sort Merge

1.Nested Loops

結合対象となるテーブルを1行ずつループしながらスキャンする。このテーブルを駆動上または外部表と呼ぶ。もう一方のテーブルは内部表と呼ぶ。駆動表の一行について内部表を一行ずつスキャンして、結合条件に一致すれば返却する。この動作をすべての駆動表の行に対して繰り返す。

  • Nested Loopsの実行時間は行数の直積数に比例
  • 1ステップで処理する行数が少ないため、あまりメモリを消費しない
  • どのDBMSでもサポートしている

内部表の結合キーにインデックスが張られていてる場合(ほとんどの場合)、駆動表が小さいほうが処理速度は速い

2.Hash

 小さいほうのテーブルをスキャンし、結合キーに対してハッシュ関数を適用することでハッシュ値に変換する。その次にもう一方の大きいほうのテーブルをスキャンし、結合キーがそのハッシュ値に存在するか調べる。

  • ハッシュテーブルのためにNested Loopより多くのメモリを消費
  • よって、TEMP落ちになる可能性がある
  • ハッシュ値は入力値の順序性を保存しないため、等値結合でしか利用できない

つまり、Nested Loopがあまり効かない場合、Hashを利用するとよい。

3.Sort Merge

結合対象のテーブルをそれぞれ結合キーでソートを行い、一致する結合キーを見つけたらそれを結果にセットする。Nested Loopがあまり効かない場合、こちらも検討。

結合アルゴリズムRDBMSの種類によって、選択可能なものもあるが、基本的にオプティマイザに任せるほうが良い。