npm install のオプションについて

最近はReact+echoでなんか作ろうプロジェクトを進めている!

npm install

  • オプション無し
    • ex) npm intall
    • カレントディレクトリに存在するpackage.jsonに応じて、./node_modules/ 以下にモジュールをインストールする
      • package.jsonとは、パッケージ名や、バージョン、モジュールの依存関係などを管理するファイル
        npm initで対話形式で作成可能
  • -g
    • ex) npm install -g パッケージ名
    • 指定したパッケージがグローバル領域にインストールされる
    • 通常プロジェクト毎にpackage.jsonを作るので、あまり使わないオプション
    • macだと通常 /usr/local/lib/node_modules/ 以下にインストールされる
  • --save
    • ex) npm install --save パッケージ名
    • 指定したパッケージをローカルインストールし、package.jsondependenciesに追記する
      • dependenciesはプロジェクトの実行に必要なものだけを入れるとよい
  • --save-dev
    • ex) npm install --save-dev パッケージ名
    • 指定したパッケージをローカルインストールし、package.jsondevDependenciesに追記する
      • テストモジュールとか

参考

s3の特定ディレクトリにファイルがあるか確認する

S3のバケットディレクトリにファイルが上がっているか、ファイルが空でないかを検知したい。 ので、検知する用のシェルスクリプトを書いた。 あまり綺麗な書き方ではないと思うのでもっといいやり方があれば知りたい。

ディレクトリの想定

特定バケット以下の指定ディレクトリのファイルを確認。 ディレクトリはこんな感じになっている想定。

nekootoko3_no_gohan/[matatabi | saba | catfood]/YYYYMMDDHH/ファイル

matatabi saba catfood ディレクトリ以下には毎時ファイルがアップロードされる。

スクリプト

現在時刻から3時間前に上げられているであろうファイルを確認するバッチ。

DATETIME=$(date -d '3 hours ago' '+%Y%m%d%H')
BUCKET_NAME='nekootoko3_no_gohan'
DIR_LIST="matatabi saba catfood"

ERR_MSG=''

for DIR_NAME in $DIR_LIST
do
    # 手動実行用に実行状況を出力
    echo "inspecting s3://$BUCKET_NAME/$DIR_NAME"

    RES=`/usr/local/bin/aws s3 ls s3://$BUCKET_NAME/$DIR_NAME --sum`
    if echo $RES | grep -sq 'Total Objects: 0'; then
        MSG="$DIR_NAME ni file ga naiyo!!\n"
        ERR_MSG=$ERR_MSG$MSG
    elif echo $RES | grep -sq 'Total Size: 0'; then
        MSG="$DIR_NAME no file size ga 0 dayo!!\n"
        ERR_MSG=$ERR_MSG$MSG
    fi
done

if [ -n "$ERR_MSG" ]; then
    echo -e $ERR_MSG >&2
fi

これをcron設定しよう。 標準エラー出力だけは出力するようにしないと、エラーメールが飛ばないので注意。

MAILTO=alert@alert.jp

5 * * * * /bin/sh どこかのディレクトリ/gohanchecker.sh 1> /dev/null

mysqlで複数カラムを追加・削除したい

mysqlで同一テーブルに対して複数カラムの追加・削除する必要があるときに、
今まで複数のALTER文を発行していたけど、1クエリーで実行できるように書くようにした。

カラム追加

複数行で書くと普通にALTER文を何回か書く感じになる。

ALTER TABLE `table` ADD COLUMN `column1` decimal(11,2) NOT NULL DEFAULT `0`;
ALTER TABLE `table` ADD COLUMN `column2` varchar(255) NOT NULL DEFAULT 'neko';

これを1行で書くと

ALTER TABLE `table` ADD COLUMN `column1` decimal(11,2) NOT NULL DEFAULT `0`,
                    ADD COLUMN `column2` varchar(255) NOT NULL DEFAULT 'neko';

1回のクエリで実行できてなんかいい感じだ。

カラム削除

これも複数行で書くと

ALTER TABLE `table` DROP COLUMN `column1`;
ALTER TABLE `table` DROP COLUMN `column2`;

これを1行で書くと

ALTER TABLE `table` DROP COLUMN `column1`,
                    DROP COLUMN `column2`;

カラム変更をまとめて行う

ADDDROPCHANGEMODIFYはカンマ区切りで1つのクエリでまとめられる。

tableに対して、カラム追加・カラム削除・カラム名(とカラム定義)変更、カラム定義変更を1クエリで行う。

ALTER TABLE `table` ADD COLUMN `column1` decimal(11,2) NOT NULL DEFAULT `0`,
                    DROP COLUMN `exist_column1`,
                    CHANGE COLUMN `old_column_name` `new_column` int(11) NOT NULL DEFAULT '1',
                    MODIFY COLUMN `pi` decimal(11,2) NOT NULL DEFAULT '3.14';

node.js?npm?Javascriptとどんな関係が?

npmnode.jsJavascriptの関係性がよく分からない。

node.js

  • サーバーサイド用Javascript の言語処理系のこと。
    • サーバーサイド用Javascriptってなんやねん。
      • ブラウザで動くJavascript(いつもjsファイルに書いているやつ)と似てるようで実は違うJavascript
        • モジュールの読み込みができたりするんです。
      • nodeコマンドで実行でき、Browserfyを使ってブラウザで動くJavascriptに変換できる
    • 言語処理系ってそもそもなんやねん
      • プログラミング言語で記述されたプログラムをPCで実行するためのソフトウェア。
        .pyファイルはpythonの言語処理系、.goファイルはgolangの言語処理系で実行するよね。
    • nodeコマンドでREPL(Read Eval Print Loop: 対話的実行環境)が出て来るよ(pythonコマンドみたいな感じ)
$ node
> var name = 'nekootoko3';
undefined
> name
'nekootoko3'
> console.log(name);
nekootoko3
undefined
> .exit
$
  • 引数に.jsファイルを持って来ると。

nekootoko.js

var name = 'nekootoko3';
console.log('Soy ' + name + '!');
$ node nekootoko.js
Soy nakootoko3!

npm

  • パッケージ管理ツール
    • pythonでいうところのpip、rubyでいうところのgem
    • 例のnode.js(サーバーサイドJS)をブラウザで動くjsに変換するツールをインストールするぞ!
# パッケージをグローバルにインストール
$ npm install -g  browserify
/usr/local/bin/browserify -> /usr/local/lib/node_modules/browserify/bin/cmd.js
+ browserify@16.1.0
added 140 packages in 7.915s

おわりに

フロントやるぞお

参考

CentOS7にGoの最新版をインストールする

最新版のgoをインストールする流れをまとめてみた

全体の流れ

$ uname -m
x86_64
$ sudo su -
# cd /usr/local/src
# wget https://dl.google.com/go/go1.9.4.linux-amd64.tar.gz
# tar -zxvf go1.9.4.linux-amd64.tar.gz
# mv go /usr/local
# exit
$ vi ~/.bash_profile
下のようにPATHに/usr/local/go/bin を追加する

PATH=$PATH:$HOME/bin:/usr/local/go/bin
$ source ~/.bash_profile

各コマンドの説明

uname -m

$ uname
Linux
$ uname -m
x86_64

sudo su -

  • ルートユーザーになる
    • /usr は一般ユーザーに編集権限がないので

cd /usr/local/src

wget https://dl.google.com/go/go1.9.4.linux-amd64.tar.gz

tar -zxvf go1.9.4.linux-amd64.tar.gz

  • ファイルを解凍する
    • tar ファイルの解凍・圧縮を行うコマンド
      • -z gz対応
      • -x 解凍(extract)
      • -v 圧縮・解凍状況を表示(なくてもいい)(verbose)
      • -f ファイル名を指定(filename)

mv go /usr/local

vi ~/.bash_profile

  • パスを通す

参考

htmlファイルの上の方にいるあいつら

ブログ長らく放置していたけど、しれっと再開しますw
あまり肩肘張らずちょっとした内容でもちょいちょい更新していきます。
そして基本的には丁寧語とか使わず、自分用のメモに近い形で書いていきます。

htmlファイルの先頭とかhead内にいろいろ書くと思うんだけど今までコピペで済ませていた。 ちょっくら必須なやつだけでも簡単にまとめてみようと思う。

この例に出てくる<body>より上の要素を解説

<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <meta name="description" content="...">
    <title>解説するお</title>
    <link rel="stylesheet" href="css/style.css">
    <script scr="js/script.js"></script>
  </head>
  <body>
  <!-- なんかいろいろ -->
  </body>
</html>

<!DOCTYPE html>

  • 文書がHTML5で書かれたことをブラウザなどに対して明示する宣言
    • HTML5では、videoタグなど新たな便利なタグが使えたり、フォームの機能が拡張されていて便利
    • 参考:yahooのブログ
  • 文書の先頭に記述する

<html lang="ja">

  • lanf="ja"と指定することで、日本語の文書であることを明示する

<head>

<meta name="viewport" content="width=device-width">

<meta name="description" content="...">

  • 検索結果の説明文に表示される文言
  • SEOの効果を高めるために重要らしい

<link rel="stylesheet" href="css/style.css">

<script scr="js/script.js"></script>

参考

ハイパフォーマンスWebサイトを読んで

こんにちは。
寒くなってきましたね。
半袖じゃ若干きついですね、、、

仮想通貨を少し買ってみてるんですが、値段の乱高下が半端ないですね。
ビットコインの分裂があーだこーだというのを聞いても実際がよく分からないので、
近々ブロックチェーン技術を勉強しようと思います。

とはいえ今回は別のテーマで、前回に引き続きWebの基本的なところです。
何を読んでも知らないことばかりなのは変わりありませんが、
少しずつ理解が容易になってきていることで自分の成長を感じるここ最近ですw

概要

サイトを高速化するための方法について。
サイトが表示されるまでの処理で時間が消費される割合はフロントエンドが80%程度とほとんどの割合を占めている。
ブラウザがサーバーからHTML文書を取ってくるバックエンドの処理は20%に過ぎないので、
フロントエンドの処理を変えることで大幅な高速化を実現できる可能性がある。

全体の構成

  • フロントエンドパフォーマンスの重要性
  • HTTPの概要
  • ルール1: HTTPリクエストを減らす
  • ルール2: CDNを使う
  • ルール3: Expiresヘッダを設定する
  • ルール4: コンポーネントgzipする
  • ルール5: スタイルシートを先頭に置く
  • ルール6: スクリプトは最後に置く
  • ルール7: CSS expressionの使用を控える
  • ルール8: JavaScriptCSSは外部ファイル化する
  • ルール9: DNSルックアップを減らす
  • ルール10: JavaScriptを縮小化する
  • ルール11: リダイレクトを避ける
  • ルール12: スクリプトを重複させない
  • ルール13: Etagの設定を変更する
  • ルール14: Ajaxをキャッシュ可能にする
  • 米国トップ10サイトの分析

HTTPリクエストを減らす

CDNを使う

  • CDN(Contents Delivery Network)を使うこと
    • CDNとは、ユーザーにコンテンツを効率的に配信するために、複数の拠点に分散して配置したWebサーバの集合。
    • AWS Cloud Flont など

Expiresヘッダを設定する

  • Expiresヘッダをしていない場合、条件付きGETリクエストを発行する
    • 最終的にはキャッシュを使うことになってもHTTPリクエストが送られるため、オーバーヘッドとなる
  • Expiresヘッダを指定して、コンポーネントの取得時にキャッシュを使用するようにする
    • max-ageを使うと、日付ではなく保持期間を秒単位で指定できる
    • Apachemod_expiresを使うと、DxpiresDefaultをディレクティブでExpiresヘッダとmax-ageヘッダ療法を指定できる
  • ファイル名にバージョンや日付などを付加することで、Expiresヘッダを長めに指定してもファイル変更時にファイルを取得しに行ってくれる
    • nekootoko.js?20171111nekootoko.css?v=91と行った感じ

コンポーネントgzipする

スタイルシートは先頭に置く

スクリプトは最後に置く

  • ブラウザがスクリプトを読み込んでいる間、それ以外のダウンロードを行わないため。
  • 描画に直接関係ない、かつ、読み込みに時間がかかるスクリプトの場合は最後に置くと描画の妨げにならない

CSS expressionの使用を控える

  • CSS expressionは、ロードの遅延やバグの原因になりうるので極力使用を控えるべき

JavaScriptCSSは外部ファイル化する

  • インラインと外部ファイルだとキャッシュがない状態での単純な比較だとインラインが早い
    • HTTPリクエスト数が少なくなるため
  • コンポーネントの再利用化やコンポーネントがキャッシュされるメリットが大きいので基本的に外部ファイル化するべき
  • onloadイベントで、ページが完全にロードされた後で外部コンポーネントを動的にダウンロードする

DNSルックアップ回数の削減

  • DNSルックアップはオーバーヘッドとなるため、DNSルックアップ削減が高速化につながる
  • Keep-Aliveを使用する
    • Keep-Aliveが利用されていれば、一定のアイドル時間があくまではTCP接続が維持されるためDNS問い合わせが発生しない
  • ドメインの数を減らす

JavaScriptを縮小化する

  • JavaScriptソースコードを縮小化する
    • 縮小化(推奨)
      • コードのコメントや余白を削除する
      • JSMinなどのツールあり
    • 難読化(非推奨)
      • コードの変数を短いものに置き換える
      • 保守性が低下する
      • Dojo Compresser などのツールあり
  • 縮小化とgzipの組み合わせを推奨
  • CSSはコメントや空白文字が少ないので効果が薄い -> JSだけでよい

リダイレクトを避ける

  • リダイレクトはHTMLドキュメント全体の配信を遅らせる
  • 末尾のスラッシュの欠如の場合
    • https://nekootoko.com/gohan にアクセスすると、 https://nekootoko.com/gohan/にリダイレクトされる
    • ホストネーム直後のスラッシュの欠如は問題ない
    • ApacheDirectorySlachディレクティブを使うことでエイリアスを設定する
  • ウェブサイトの連結の場合
    • Apacheエイリアスを設定する
    • バックエンドが同一サーバ上にある場合は、古いハンドラーで新しいハンドラーを呼び出す
  • 内部トラフィックの追跡の場合
    • HTTPヘッダのRefererを活用する
  • 外向きトラフィックの追跡の場合
    • ビーコンもしくはリダイレクトもやむなし
  • 覚えやすいURL

スクリプトを重複させない

  • スクリプトが重複することでパフォーマンスが低下する要因は2つ
    • HTTPリクエストが発生する
      • Chromeはしなかったけど、最近のはするのかなぁ
    • JavaScriptが無駄に実行される
  • サーバーサイドでinsertScriptといった関数を作成する
    • 依存関係やバージョンも同時に扱えばなおよし(やりたい)

ETagの設定を変更する

  • EtagはHTTPレスポンスヘッダに含まれている
    • クライアントにキャッシュがある場合、条件付きGETリクエストにも含まれキャッシュの有効性検証に用いられる
    • Etagは [iノード]-[ファイルサイズ]-[タイムスタンプ]の構成となっている
  • サーバーが異なる場合、異なったEtagとなるためファイルに変更がなくとも、304レスポンスではなく200レスポンスとなる
  • Etagは設定を変えるか削除する方がよい

参考: HTTPヘッダチューニング Etag・Last-Modified

Ajaxをキャッシュ可能にする

  • Ajaxリクエストがこれまでのルールを守っているかの確認
    • 特にExpiresヘッダに遠い未来を設定しているか

終わりに

この本の執筆された2008年にはまだ一般的ではなかったこと(特にAjaxなど)が、
今では普通になっていることを考えるとWebの世界の移り変わりの速さを感じます。
ただ、今でもこの本のルールを活かせる部分も多いと思うので、
早速に会社に改善提案を出してみます!