(1) オブジェクト指向設計 from オブジェクト指向設計実践ガイド

システムを、あらかじめ決められた手続きの集まりではなく、オブジェクト間で受け渡されるメッセージの連続としてモデル化

部品が相互に作用しあい、全体の振る舞いが生まれる 部品がオブジェクト、相互作用はオブジェクト間で受け渡されるメッセージ メッセージの送り手は受け手を知っている必要がある→依存関係を作る

オブジェクト指向設計とは、依存関係を管理すること

オブジェクト設計とは、変更が簡単になるようにどんなコード構成にするか

5つの原則 SOLID

  • Single responsibility 単一責任
  • Open-closed オープン・クローズド
  • Liskow Substitution リスコフの置き換え
  • Interface Segregation インターフェース分離
  • Dependency Inversion 依存性逆転

DRY

Don’t Repeat Yourself

LoD

Law of Demeter デメテルの法則

BUFD(Big Up Front Design)

提案されたアプリケーションのすべての機能の、想定される未来の内部動作をすべて特定し、完全に文書化すること

参考リンク

学校の課題でhtml/css/js縛りでなんか作るっていうのがあったので、shell scriptを書いてみた

要件

  • 紙芝居、ページは画像と文字列、ボタン(次のページへ)で構成されており、たまにある入力の値の条件分岐によってページの遷移先を変える
  • その入力値はページ間で保持する必要がある(縛りがあるのでDBとかは使えない。JSだけというか)

実装したこと

  • ほとんどのHTMLが同じ構成なので、コマンドで引数でもたせて40枚近い HTMLを作るshell scriptを書いた。(なお一発コマンドでできるわけではなくて、内容に合わせて枚数文コマンドを打つ必要がある)

https://github.com/tenshotanaka/Shakure-Cinderella/blob/master/html-build.sh

  • userの選択をcookieに保存し、その値によってページの遷移先を変えるようにした。なおライブラリは以下を使った。

https://github.com/js-cookie/js-cookie/releases/tag/v2.1.4

所感、感想

急いで書いたので、動くだけのクソコードになってしまった。jsとか絶対抽象化できるし、es6じゃないし。エンジニアとしてこのままにしてしまうのは恥ずかしいので一応issueにまとめた。でもこの機会でshell scriptに触れることができたのでよかった。やっぱりコード書くの楽しい。linux実践みたいな本読む時、復習したい。

参考リンク

www.shellscript.sh GitHub - tenshotanaka/Shakure-Cinderella: 情報基礎最終課題

先輩のtweetを見て危機感を感じてrmのaliasを設定した

qiita.com

qiita.com

最近twitterの有用性に気づいた。

あと学習について、思ったことがあって、エンジニアって一生勉強だから、ある課題にあたった時にそれを今そのタイミングで掘るか、ペンディングして休日にやるか、一週間後くらいにやるかいろいろ考えなきゃならない。だから学習もただ掘ればいいというわけではなくて、優先順位が大事だと感じた。

指示の本質を理解する

少し短い記事になってしまうのですが、あるタスクで指示を受けたときにその本質を理解する必要があると感じたこと。ゴールを明確にするとかと共通している部分があるとは思うけど。

たとえばstaging環境にnofollowが付いていないため、SEOランキングが下がる問題を解決するみたいなタスク内容だったとして、重要なのはSEOランキングが下がる問題を解決するであって、nofollowをつけることではない。そこらへんをちゃんとわからないと、ただ具体的に指示された内容をこなすだけになってしまう。だから深く本質を理解することが重要だと感じた。

エンジニアの勉強について

まず勉強には二種類あると思っている。それでこれら二つってお互いにすごく関連している気がする。たとえばあの基礎が抑えられてないから、これが理解できなくて、調べ方の指針もたたないみたいなことがたまにある。

  1. 仕事に必要な知識を得るための勉強、勉強というより調べ物に近いのかな 例)terraformでこういうリソースを追加したいのだがそのコードはどう書けば良いか
  2. 長期で見たときに必要になってくる知識を得るための勉強、技術書中心、公式のリファレンスとか 例)オブジェクト指向設計実践ガイドを読む (3. それらの仕事の仕方、仕事の効率化、)

1は仕事の仕方、問題解決に通じていると思うのだが、そもそもゴールがあって、それを解決するために調べる感じ。 - やりたいことがそもそも公式で推奨されていることとして存在するかどうか公式ドキュメントを見て探す in English あったらそれ読んでやってみる。わからなかったら日本語で読んでみる

  • その上でわからないことがあったら、仕事に必要になると考えられる条件を決めて 調べる

2は何かそれを使ってやりたいときにすぐわからないことにアプローチするためにインデックスを貼るためにやる感じ。一時期は本の内容の70%をメモしていた感じだったけど、今はどこに何が書いてあるのか、またその書いてあることを理解するために最低限必要な知識を書くようにしている。

でも問題なのが自分の投下時間におけるこれらの比率で、2をやりすぎたら普段の仕事終わらないし、1だけだと長期で考えたときにあの基礎が抑えられてないから、これが理解できなくて、調べ方の指針もたたないみたいなこともたまにある。

だから自分の中で長期の勉強と目の前のことのための勉強で時間を分ける必要がある。あと仕事の時間って、基本的に調べる(勉強する)時間+作業時間(実際に動かしたり、レビューもらう時間)に分かれると思っててその比率はそのタスクの達成難易度(作業量×自分の能力)による。自分の能力がそのタスクに関して低いと調べる時間が多くなるし、やり方わかってて動かすだけならほぼ作業だけで済む。

あと何かをやるときはかならず二日以上かけるように予定を立てる、つまりこの日に全部やろうと思って10時間まとまった時間をつくるより、5時間×2とかでやったほうがいい。そうすると多少伸びても時間の融通がきく。

自分の時間分け

  • そうすると朝起きての2時間は長期の勉強にあてる→絶対この時間は長期の勉強をする。この時間に勉強しないと長期の勉強はできないと思え!!またその日のタスクの調べ物は絶対にしない。キリがなくなるから。
  • 仕事の際の調べ物はゴールを決めて調べて、最初から記事を書くつもりで読む。今までは一度読む→もう一度流し読みしながらまとめるみたいな感じだったので、最初から記事を書きながらみたいな感じでもいいから調べる。記事を書くこともそのタスクの一環として、調べたらすぐ記事を書く
  • あと早く自分の遊び場をつくる。

SEOまとめ

SEO検索エンジン

Webマーケティング

SEOとは、検索エンジンを利用するユーザーが入力するキーワードを導線としたキーワードマーケティング

  • キーワードとカテゴリーの設計 web担当者、マーチャンダイザー、インフォメーションアーキテクト
  • 内的施策 サイトのドメイン名やURL構成、HTML/CSSなどサイトの内側に施す対策 ←ここ
  • 外的施策 PageRank(価値やキーワードの関連性が高いページやドメイン、サイトからどのくらいのリンクを受け取っているか、被リンクがあるか)を上げるための対策 ex メディアサイトに取り上げてもらう、ブロガーにリンクを貼ってもらう。

検索エンジンの技術的な仕組み

  • 検索エンジンの種類
    • ディレクトリ型 人間が作ったリンク集。整理、審査されているため探しやすいが、ほとんどがサイト単位
    • ロボット型 ソフトウェアによる自動収集型。ページ単位にインデックスしているため、情報が膨大 クローラーがHTTPプロトコルでコンテンツを取得 →インデクサーが取得したコンテンツを解析し、分析結果とそのファイル自体をデータベースに保存。その際キーワードごとの検索結果も作成。 →クエリサーバーがユーザーからの検索クエリー(キーワード)の結果ページを返す

PageRank

「多くの良質なページからリンクされているページはやはり良質なページである」という再帰的な関係を元に全てのページの重要度を判定したもので、ランクされていないのPageRank 0 ~ 10までの全部で11段階の評価になっている。

  • 被リンク数(リンクされているリンクの数)
  • 評価の高いページからのリンクかどうか
  • リンク元ページでの放出リンク数(貼ってあるリンクの数)

検索エンジンのシェア googleとyahooが主 https://seopack.jp/seoblog/20160816-s-e-share/

SEOサイクルとクローラビリティー(webサイトをいかに巡回しやすいか)

SEOサイクル

  • 診断 アクセス解析・仮説
  • 設計 コンテンツ・SEO・カテゴリー・キーワード設計
  • 実行 HTML/CSS作成、開発、リリース
  • 外的施策 インバウンドリンク対策、メディア対策、プレスリリース

SEO対策の三つのポイント

  • クローラビリティ(クローラーのサイト回避のしやすさ)

    • ステータスコードを返す
    • URL永続化(一度公開して検索エンジンにインデックスされたコンテンツに対し、そのコンテンツが存在し続ける限り同一のURLを使用し続けること)
    • URL正規化(そのキーワードを表すURLはそのサイト内で一つのみ存在する、そのコンテンツはそのサイト内で一つのみの存在する)
    • URL静的化(http://hoge.com/dir/file.html?query=fuga < http://hoge.com/dir/file/query/fuga
    • クロールできるa要素とリンク構造
      • リンクを貼る際は内容的に関連するページに貼るリンクが効果的
      • 1ページから放出する(に貼られている)リンク数は最大でも100本を目安に設計
  • キーワード・キーフレーズ

  • アンサー度(ユーザのニーズを満たせているかどうか)

キーワード

  • キーワードとは
    • 言葉の一致
    • キーワードの守備範囲
    • キーワードの人気度の調査
    • キーワーードのグループ構成
  • キーワードの選定
    • 潜在顧客の検索行動の洗い出し
    • 人気度・コンバージョン・競合度の調査
    • キーワードのグループ分けと優先順位づけ
  • 形態素分析
  • カテゴリー
    • 複数のカテゴリー軸の組み合わせ

アンサー度

  • アンサー度とは
  • テーマの一致
  • 多様性
  • 検索語タイプ

HTMLの最適化(これからはじめるSEOの教科書)←ここ

1, title

2, meta description

3, mata keywords

4, h1

5, h2~h6

6, ul, ol

7, strong

8, center

9, imag

10, リンクの最適な使い方(どういうリンクを貼るべきか)

11, ドキュメント宣言

12, headタグ内で必要なものと不必要なものの仕分け

13, 重要キーワードが重要位置にあるか

14, ページ内が適正な文字数・文字比率になるようチェックしよう

15, HTML内の贅肉を落としスリム体質にしよう

16, 重要ではないタグやキーワードを下方に移動させよう

17, パンくずリストを作成しよう

18, サイトマップを作ろう

19, 内部リンクを張り巡らそう

20, ファイルサイズを縮小化しよう

21, 美しいソースコードに修正

22, URL正規化でバックリンク分散を回避しよう(複数存在のURLを一つに統一)

23, 足を引っ張り合うミラーサイトをなくそう

24, SEO対策が行われているかをチェック(http://ferret-plus.com

25, 上位表示に必要なURLの付け方

26, NGタグの撤廃・改善

27, スパムについて

アクセスログとインデックス状況の分析

アクセスログ

アクセス解析に使う狭義のアクセスログ=webサーバーの生ログ(webサーバーが生成するテキストファイル)

リファラー =あるwebページのリンクをクリックして別のページに移動した時のリンク元のページ。

  • Apache(Linux, UNIX系) Combined, Common ※リファラー情報がない、でも容量が多いから保管場所には注意
  • IIS(Windows系) W3C Extended(W3C拡張) 自由にフォーマットを変更できるヘッダー領域。

リファラーから検索キーワードがわかる。

インデックス数

クロールされているからといって、インデックスされているとは限らない。したがって定期的にインデックス数を確認する必要がある。

分析手法

  • コンバージョン分析
  • 被リンク数
  • PageRank
  • 検索順位
  • 視聴率

アクセス解析の導入

https://analytics.google.com/analytics/web/#report/defaultid/a49424310w110721923p115496641/

ビーコン型アクセス解析

ASP(Application Service Provider)側のサーバーに置かれているJSのタグを全ページに貼り付ける。ページがロードされるとJSのプログラムがCookieの有無を調べCookieが未発行だったり有効期限が過ぎていたりした場合は新規にCookieを発行したりすることで、情報を自動的にASP側に集約していく。JSを実行できないページ(リダイレクトページ、ファイルのダウンロード、ロボットのアクセス)は解析対象にできない。

このCookieには以下を使うASPがある

バケットキャプチャー型

データセンターにネットワーク上を流れるパケットを受信できる機材を用意して、パケットの中身を取り出して集計する。どんなトラフィックでも解析が可能。リダイレクトやファイルのダウンロードのようなものも対象にできる

生ログ型

生ログを解析する。JS, Cookie, ネットワーク機器に依存していないため、ほぼどんなシステムを利用していても分析が可能。携帯電話からのアクセスが携帯キャリアの設置するゲートウェイサーバーになっているため、ログにそのサーバのIPアドレスが記録されるため、複数の携帯電話からのアクセスが一つのセッションにまとまってしまう。

検索エンジンスパム

  • スパムとは、検索エンジンアルゴリズムを利用して、意図的に検索順位を上げようとする検索エンジンにとっての迷惑行為。あらかじめ自分のサイトにしかけをしておき、クローラーやインデクサーを騙してサイトの評価をあげ、自然検索結果の露出を高める行為。

ペナルティ

  • 一時的もしくは恒久的に意図的に検索順位を下げられる
  • 一番のキーワードで検索結果に出なくなる
  • そのドメインごと、検索結果に表示されなくなる

ソフトウェアでのチェック→目視でのチェック

スパム手法

  • HTML系

  • サーバ系

    • ドアウェイページ、リダイレクト
    • クローキング
    • 複製コンテンツ

DNSスパムはDNSワイルドカードを利用してサブドメインを大量作成し、検索エンジンに登録する行為

  • 外部リンク系
    • リンクファーム、有料リンク

検索エンジンの制御

robots.txt

クローラーにインデックスやクローリングの制御情報を渡すにはrobots.txtというファイルをやりとりする必要がある。 http://www.robotstxt.org/robotstxt.html https://support.google.com/webmasters/answer/6062608?hl=en https://moz.com/learn/seo/robotstxt

サイトのルートディレクトリに設置しておくことで、クローラーがHTTPプロトコルをGETして内容を読み取り、その内容にそったクローリングをしてくれる。

http://www.google.co.jp/robots.txt

  • どのロボットに対する指示か
  • アクセス拒否するディレクトリやファイルの列挙

  • noindex 検索結果に表示されない、表示する、pagerankはつく、キャッシュもされる。

  • nofollow このページから、クロールさせる、させないの指示をする

Sitemaps

https://www.sitemaps.org/index.html

googleが策定した規約で、URLの一覧をxmlファイルやテキストファイルで通知する方式 インデックスの促進が目的なので、検索順位に影響が出るわけではない。

縮退運転

クローラーが来ているタイミングでサイトを停止させないため

データベースモデリング

レスポンスが遅いのは検索エンジン側からするとよくない

  • 並び順 重要なものを上に表示する必要があるので、それを考える必要がある。 例 その季節のものを上に表示するようにする

  • エイリアス キーワードの別名を格納する

  • 事前計算 複雑なクロスカテゴリーなどの場合に、件数を計算しておき、0件の場合は表示しないようにするみたいな

  • マルチアサインとマスターカテゴリー 一つのカテゴリーが二つの親カテゴリーに紐づくことがある。構造上二つの上位カテゴリーに属していることにする必要があり、そうするとURLの正規性を保つことができる。

  • キーワードカテゴリー、ショートカットカテゴリー キーワードでの関連性で関連のあるリンクを作るようにする

  • ID体系とURLの関係 リレーション変更によってURLが変更されないようにDB設計する必要がある

ツール

サイト管理ツール  GoogleWebMasterTool

ソースコードエラーチェック http://validator.w3.org/

サイト診断 http://www.seotools.jp/ https://ferret-plus.com/ http://seocheki.net/ https://moz.com/researchtools/ose/

サイトマップ作成 https://www.xml-sitemaps.com/

SEOに関する情報収集 https://www.webmasterworld.com/

参考文献

https://d2eeipcrcdle6.cloudfront.net/seo-cheat-sheet.pdf support.google.com support.google.com

これからはじめる SEO内部対策の教科書

これからはじめる SEO内部対策の教科書

SEOを強化する技術 エンジニアが内側から支えるサイト設計・構築術

SEOを強化する技術 エンジニアが内側から支えるサイト設計・構築術

junior engneerがインターン先Rでそこそこちゃんと仕事をして思ったことまとめ

ライブラリの選定

何かプラグインなり、ライブラリを使いたい時は、なぜそれを使いたいのか、なぜそれが良いと思うか、どう使いたいかを伝える。

ライブラリ導入時のチェック項目

  • [ ] issueの数
  • [ ] 星の数
  • [ ] それに関連する技術のバージョンを調べる
  • [ ] 何年前から使われているか調べる(枯れているか)

仕事の順序

(自分が手がけているプロジェクトと同様の環境の遊び場を使っていじったりする)

1.ゴールを理解する、解決したいことを明確にする(それについてわからないこと、知りたいことを明確にする、それは調べる方法(ググるのか、githubでコードを読むのか)も同様) ex) 一部のリソースへアクセスするポリシーの作りかた、またそのコード

2.その解決方法を調べて、上長にこの方向で解決しようと思うのだがどうか?(自分なりの仮説、メリットデメリットを具体的かつ簡潔に伝える)という形で質問する

3.PRをwipで出して、実装方針を整理し、正しい方向性か上長に聞く。そのコードについて深く考える。その冗長だったら何て言うか考える。

4.PRのreviewをお願いする。PRはreviewerが疑問に思う可能性がある処についてなぜそうしたのか、ちゃんと説明す。reviewerの負担を減らすことを考える、他のメンバーのことも考える。

一言

「仕事とはただqiitaにまとめてあるような実装をして、コードを書いて動かすようにするだけではない。そのコードに責任感を持ち、問題解決を行うのが仕事である。」と思いました。

なんか自分がやってきたことってわりとrailsのコードを書いて何かを動かすようにするという感じで、しかもゴリゴリのスタートアップだったのでとりあえず動くようにして当然のごとくテストなんて書かないしという感じだったので、仕事といえばただ動かすようにすればいいという感じでした。だから、Rに入って技術選定からドキュメントの作成、社内でのコミュニケーションなどあーエンジニアってコード書くだけじゃなくて、問題解決が仕事なんだと思いました。なんか自分で作る時はデバッグして動いたー!!楽しい!!って感じだけど、仕事はそうじゃないなと。ググって一番上に出て来たやつを何も考えずに採用している場合ではないなとおもいました。

あと仕事って最終的なゴールはこのフローを上長の存在なしでできるようにすることだと思う。そうすると自然と上長に何か聞くことが少なくなって、あいつは「仕事ができる」ということになるのではないか。

また明日から頑張っていきたい。