CDK for Terraform のインストール

● Terraformのバージョンマネージャーのインストール

brew install tfenv
tfenv --version
tfenv 3.0.0

tfenv で インストール可能なバージョンの一覧を表示させる

tfenv list-remote

バージョンはこちらも参考に
https://developer.hashicorp.com/terraform/install

バージョン 1.7.5 のインストール

tfenv install 1.7.5
tfenv use 1.7.5

● インストール済みの tfenv 一覧

tfenv list

Terraform のインストール

brew tap hashicorp/tap
brew install hashicorp/tap/terraform

brew unlink tfenv
brew install hashicorp/tap/terraform
terraform version
Terraform v1.7.5
on darwin_arm64
No.2500
04/01 15:59

edit

Vercel の X-Vercel-Cache ヘッダ

bypass:キャッシュがバイパスされたため、応答はオリジン サーバーから提供されました。

hit : 応答はエッジから提供されました。

miss : 応答はエッジで見つからなかったため、オリジン サーバーから取得されました。

prerender : 応答は静的ストレージから提供されました。

revalidated : エッジで古い応答が見つかりましたが、同期的に再検証されました。

stale : 応答が古い (エッジから提供される)。
No.2493
03/21 13:39

edit

Firebase Cloud Messaging (FCM)で通知を送る

● WEB アプリへの通知の流れ

・1. クライアントアプリ側で getToken() で token を受け取る

vapidKey(公開鍵, firebase console にて確認できる)をセットしてトークンを生成する

messaging.getToken({
        vapidKey: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
      })

・2. クライアントアプリからサーバーアプリへ token を送信する

・3. サーバーアプリから特定の端末(token)へ 通知を送信する

参考 ; https://blog.ojisan.io/fcm-push/

● 通知の送信方法

・「以前のHTTP」を使う ( https://fcm.googleapis.com/fcm/send )
  必要なもの (Cloud Messaging API(レガシー)のサーバーキー)

・「HTTP v1」を使う ( https://fcm.googleapis.com/v1/projects/<プロジェクトID>/messages:send )
  必要なもの (サービスアカウントの秘密鍵 json → 秘密鍵 jsonからアクセストークンを生成してそれを使用する)

参考 : 以前の HTTP から HTTP v1 に移行する

● 特定の個人に対して通知を送信する(トークン)

・トークンの扱いについて

https://firebase.google.com/docs/cloud-messaging/manage-tokens?hl=ja

● 全員に対して通知を送信する(トピック)

https://qiita.com/yum_fishing/items/54b4f10dea24e0d7722d

・(サーバー側)Topicを作成する
・(利用者)Topicに登録する
・(サーバー側)Topicに 対して通知を送信すると、そのトピックをサブスクライブしている全員に対して通知を送ることができる。
No.2302
03/27 10:56

edit

firebase-ui まとめ

● firebase-uiを使用する(vueの例)

onMounted(() => {
  const ui =
    firebaseui.auth.AuthUI.getInstance() ||
    new firebaseui.auth.AuthUI(firebaseAuth);

  ui.start("#firebaseui-auth-container", {
      //   ログイン完了後に画面遷移するURL
    signInSuccessUrl: "/mypage" ,
    callbacks: {
      uiShown: () => {
      //   表示時に何か実行したい場合ここに記述
         );
       },
    },
    signInOptions: [
      {
        provider: EmailAuthProvider.PROVIDER_ID,
        disableSignUp: {
          status: true,
        },
      },
    ],
  });
});
<template>
            <div id="firebaseui-auth-container"></div>
</template>

● firebase-ui の 日本語化

・1. 以下のコマンドで日本語版をビルドすることができます

git clone https://github.com/firebase/firebaseui-web.git
cd firebaseui-web
npm install

node node_modules/gulp/bin/gulp.js build-esm-ja

参考 : https://github.com/firebase/firebaseui-web#developer-setup

・2. ビルドして生成されたファイルを以下の通りリネームします

dist/esm__ja.js → firebaseui_ja.js
dist/index.d.ts → firebaseui_ja.d.ts

あとは普通に importすれば、 メッセージが日本語化されたfirebase-uiが使用できます

tsconfig.json の allowJs は 設定しなくてもok

"compilerOptions": {
    // 設定しなくてもokです
    "allowJs": true,
    ...
}

● firebase-ui の 日本語メッセージ一覧

https://github.com/firebase/firebaseui-web/blob/master/translations/ja.xtb

No.2256
12/08 17:07

edit

firebase security rule の テスト を jest + typescript で行う

● firebase security rule の テスト を jest + typescript で行う

・必要なnpmパッケージ @firebase/rules-unit-testingを追加する

yarn add @firebase/rules-unit-testing --dev

firestore.test.ts のサンプル

import fs from 'fs'
import * as testing from '@firebase/rules-unit-testing'
import * as http from 'http'

const projectId = '<FirebaseのプロジェクトID>'

// カバレッジレポートの出力
const COVERAGE_URL = `http://localhost:8080/emulator/v1/projects/${projectId}:ruleCoverage.html`
afterAll(async () => {
  const coverageFile = 'firestore-coverage.html'
  const fstream = fs.createWriteStream(coverageFile)
  await new Promise((resolve, reject) => {
    http.get(COVERAGE_URL, res => {
      res.pipe(fstream, { end: true })
      res.on('end', resolve)
      res.on('error', reject)
    })
  })
  console.log(`● カバレッジレポートを次のURLに出力しました\n${COVERAGE_URL}`)
})

describe('firestore', () => {
  let testEnv: testing.RulesTestEnvironment

  let userAuthor: testing.RulesTestContext
  let userMaintainer: testing.RulesTestContext
  let userDoesntHavePermission: testing.RulesTestContext
  let userUnauthenticated: testing.RulesTestContext

  beforeAll(async () => {
    testEnv = await testing.initializeTestEnvironment({
      projectId: projectId,
      firestore: {
        rules: fs.readFileSync('./firebase_emulator/firestore.rules', 'utf8'),
        host: 'localhost', // npx jest から実行する場合は必要(firebase emulators:exec からテストする場合は不要)
        port: 8080 // npx jest から実行する場合は必要(firebase emulators:exec からテストする場合は不要)
      }
    })

    userAuthor = testEnv.authenticatedContext('test__userAuthor')
    userMaintainer = testEnv.authenticatedContext('test__userMaintainer')
    userDoesntHavePermission = testEnv.authenticatedContext('test__userDoesntHavePermission')
    userUnauthenticated = testEnv.unauthenticatedContext()

    // テストデータ作成
    await testEnv.withSecurityRulesDisabled(async context => {
      // Client SDK からのルールが適用されない Firestore インスタンス。
      const noRuleDB = context.firestore()

      // 1. (/users/test__userAuthor)
      await noRuleDB.doc(`/users/test__userAuthor`).set({
        name: 'テストデータ(userAuthor)'
      })

      // 2. (/users/test__userMaintainer)
      await noRuleDB.doc(`/users/test__userMaintainer`).set({
        name: 'テストデータ(userMaintainer)',
        _permissions: ['/users/test__userAuthor/news']
      })

      // 3. (/users/test__userDoesntHavePermission)
      await noRuleDB.doc(`/users/test__userDoesntHavePermission`).set({
        name: 'テストデータ(userDoesntHavePermission)'
      })
    })
  })

  afterAll(async () => {
    // テストデータ削除
    await testEnv.withSecurityRulesDisabled(async context => {
      const noRuleDB = context.firestore()

      // 1. (/users/test__userAuthor)
      await noRuleDB.doc(`/users/test__userAuthor`).delete()

      // 2. (/users/test__userMaintainer)
      await noRuleDB.doc(`/users/test__userMaintainer`).delete()

      // 3. (/users/test__userDoesntHavePermission)
      await noRuleDB.doc(`/users/test__userDoesntHavePermission`).delete()
    })
  })

  test('「news/コレクション一覧の読み取り」: ログイン済みユーザ(本人)は読み取ることができる', async () => {
    const newList = userAuthor.firestore().collection('/users/test__userAuthor/news').get()
    await testing.assertSucceeds(newList)
  })

  test('「news/コレクション一覧の読み取り」: ログイン前ユーザ(本人)は読み取ることができない', async () => {
    const newList = userUnauthenticated.firestore().collection('/users/test__userAuthor/news').get()
    await testing.assertFails(newList)
  })

  test('「news/コレクション一覧の読み取り」: 権限を持たない本人以外のユーザは読み取ることができない', async () => {
    const newList = userDoesntHavePermission.firestore().collection('/users/test__userAuthor/news').get()
    await testing.assertFails(newList)
  })

  test('「news/コレクション一覧の読み取り」: 権限を持つ本人以外のユーザは読み取ることができる', async () => {
    const newList = userMaintainer.firestore().collection('/users/test__userAuthor/news').get()
    await testing.assertSucceeds(newList)
  })
})

● テストの実行

npx jest firestore.test.ts

FirestoreのカバレッジをGitHubActionsでいい感じに表示する - Qiita
rules-unit-testingがv2になったので変更点とともに紹介する

No.2242
10/31 19:24

edit

firebase firestore のセキュリティールール書く際に必要な情報

● 事前に組み込まれている関数、変数を活用する

Firestore rules tips - Qiita

exists 存在やアクセスするためのパスを確認した後ゲットを行うと良い

debug(exists(/databases/$(database)/documents/users/XXXXXXXXXXXXXXXXXXXXXXXXXX))

  ↓  bool_value: true となった場合 このパスの位置にドキュメントがあることがわかるので get() に切り替えます

debug(get(/databases/$(database)/documents/users/XXXXXXXXXXXXXXXXXXXXXXXXXX))

  ↓  $(変数) で変数展開できます。現在ログイン中の uid はこちら

debug(get(/databases/$(database)/documents/users/$(request.auth.uid)))

● Firestore セキュリティルールで使える関数一覧

Firestore セキュリティルールで使える関数一覧 - Qiita

● ワイルドカードと再帰ワイルドカード

CloudFirestoreのセキュリティルールの構造化  |  Firebase

● firebase firestore のセキュリティールール の debug()

debug() で囲むとエミュレーターを使ったときに firestore-debug.log

string_value: "hogehoge"

のような形でデバッグが表示されます(stringの場合)

・配列をdebugする

debug(['a','b'])

 ↓ firestore-debug.log に次のように書き出されます

list_value {
  values {
    string_value: "a"
  }
  values {
    string_value: "b"
  }
}

・リクエストパスをdebugする

debug(request.path)

 ↓ firestore-debug.log に次のように書き出されます

path_value {
  segments {
    simple: "databases"
  }
  segments {
    simple: "(default)"
  }
  segments {
    simple: "documents"
  }
  segments {
    simple: "users"
  }
  segments {
    simple: "xxxxxxxxxxxxxxxxYYYYYYYYYYYYZZZZZZZZZZ"
  }
  segments {
    simple: "news"
  }
}

● ワイルドカード

単一リソースのワイルドカード

match /posts/{post}

これは posts 以下のすべてのドキュメントにマッチしますが、 posts 以下にコメントなどがネストされている場合は、コメントのサブコレクションにはマッチしません。

match /posts/{document=**}

これだと posts 以下なんでもマッチします。 引用 : posts

Firestore のセキュリティルールのデバッグには debug() を使おう - Qiita

【改訂版】 Firebase Cloud Firestore rules tips – su- tech blog

No.2240
11/25 15:10

edit

firebase emulatorを使用する (例: Authentication , Firestore)

● firebase emulatorのインストール

npm install -g firebase-tools
firebase --version

firebase アカウントが既にある場合は一度ログアウトしてからログインしなおすと良いです

firebase logout
firebase login

javaのインストールが促される場合は、下記のサイトからダウンロードします。

(interl と M1, M2 mac で ダウンロードするインストーラーが違うのでご注意ください)
https://www.oracle.com/java/technologies/downloads/

● ローカルフォルダ firebase_emulator_authentication にエミュレータをインストール

mkdir _firebase_emulator_authentication
cd _firebase_emulator_authentication
firebase init

emulator だけを使用したい場合は次のコマンドでもokです

firebase init emulators

● インストールオプションを適宜選択する

例: Authentication を使用したい場合

「Emulators: Set up local emulators for Firebase products」 を選択
     ↓
「Authentication Emulator」 を選択

例: Firestore を使用したい場合

「Emulators: Set up local emulators for Firebase products」 を選択
     ↓
「Firestore Emulator」 を選択

● firebase エミュレーターの起動

firebase emulators:start

javaコマンドラインツールが必要と表示される場合はこちらからダウンロードしてインストールします

https://www.oracle.com/java/technologies/downloads/

エミュレーターの管理画面はこちら

http://localhost:4000/auth

● firebase エミュレーターをlocalhostではなくIPアドレス指定で起動する

firebase.json

  "emulators": {
    "auth": {
      "port": 9099,
      "host": "192.168.1.26" // これを追加します
    },

● アプリからfirebaseエミュレーターを使用する

import { connectAuthEmulator} from "firebase/auth"
if (process.env.NODE_ENV != "production") {
  connectAuthEmulator(auth, "http://localhost:9099")
}

● firebase emulator Authentication では verify(検証)はできません

ログイン成功時に返却される UserCredentialImpl に kid が含まれないため公開鍵が分からないため検証はできません。 https://zenn.dev/mekappi/articles/48034d52393184

● firestoreエミュレーターを使用する

ディレクトリに移動してから次のコマンドを実行します

・1. firebase の初期化

firebase init

以下の2つをスペースを押して選択します

Emulators: Set up local emulators for Firebase products
Firestore: Configure security rules and indexes files for Firestore

次に以下の4つを聞かれるので答えます

・1. 既存プロジェクトまたは新規プロジェクトを使用するか聞かれるので答えます
・2. セキュリティールールのファイル名を聞かれるのでそのままエンターを押します(firestore.rules になる)
・3. インデックスのファイル名を聞かれるのでそのままエンターを押します(firestore.indexes.json になる)
・4. インストールするエミュレーターを聞かれるので( Authentication Emulator ,  Firestore Emulator)の2つを選択します

後はエンターキー連打でokです

・2. エミュレーターの起動

・データの永続化ありで起動する (ディレクトリ firestore_data にデータが保存されます)

firebase emulators:start  --import firestore_data --export-on-exit

終了時にメモリ上のデータをディレクトリ「firestore_data」のファイルに書き出します。
必ずctrl+cを押して終了させるようにしましょう。
(ターミナルごとkillした場合は保存されません)

・3. Firestoreに undefined なデータを送信した時に自動的にそのメンバを削除するように設定する

アプリ側の .ts (.js) を変更します

export const firebaseDB = getFirestore()

  ↓

export const firebaseDB = initializeFirestore(FirebaseApp, {
  ignoreUndefinedProperties: true
})

引用 : https://firebase.google.com/docs/reference/js/firestore_

initializeFirestore (アプリ、設定、データベース ID)

指定された設定でFirestoreの新しいインスタンスを初期化します。 getFirestore()を含む他の関数の前にのみ呼び出すことができます.カスタム設定が空の場合、この関数はgetFirestore()を呼び出すのと同じです.


・データの永続化なしで起動する

firebase emulators:start

● firestoreのセキュリティールールをテストする

firestore.rules を以下の内容で保存してデータ取得がエラーとなることを確認します

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    // rule - 全て却下
    match /{document=**} {
      allow read, write: if false
    }
  }
}

ホワイトリスト形式で記述するので ルールを何を書かない場合でもアクセスができなくなります

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
  }
}

なお、 firestore.rules は更新するとするルールが適用されます(エミュレーターを再起動する必要はありません)

No.2224
03/09 21:21

edit

gcloud CLI + Mac インストール

・1. gcloud のインストール

brew install --cask google-cloud-sdk

・2. シェルに設定

シェルが bash の場合

source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.bash.inc'
source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/completion.bash.inc'

シェルが zsh の場合

source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.zsh.inc'
source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/completion.zsh.inc'

・3. gcloud コマンドの確認

which gcloud

gcloud --version

・4. python のパスとバージョンの確認

which python

python --version

2.7 以上だと合格です。

pythonがない場合は以下のコマンドでインストールします

brew install pyenv

.bash_profile

# pyenv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

ここで一度ターミナルを終了して再度起動します。

・5. gcloud へのログイン

gcloud auth login

webブラウザでログインします。

・5. gcloud の project の作成

gcloud projects create <プロジェクトID>

test-my-first-project というプロジェクトを作成します

gcloud projects create test-my-first-project

プロジェクト一覧の表示

gcloud projects list
No.2214
01/05 18:35

edit

Google GCE のマシンで dnf -y update を行う

● Google GCE のマシンで dnf -y update を行う

普通に行うと killed となるので以下のようにして実行します。

dnf config-manager --disable google-cloud-sdk
dnf config-manager --disable google-compute-engine

dnf -y update
No.2211
09/12 10:54

edit

Google GCEの仮想マシンの削除

● 1. IPアドレスの解放

Google Cloud PlatformのメニューからVPCネットワーク → 外部IPアドレスを開きます。 ここで不要な外部IPアドレスの確認および削除ができます。 外部IPアドレスをリストから選択して 静的アドレスを解放 で削除できます

● 2. VMインスタンスの削除

Google Cloud Platformのメニューから「Compute Engine」 → 「VMインスタンス」から削除したいマシンを選択して削除します。
添付ファイル1
No.2058
10/04 08:44

edit

添付ファイル

Google GCEの仮想マシンの設定方法 (KUSANAGI)

● 1. KUSANAGIマシンを新規作成

この後表示される画面で「有効にする」ボタンを押します
その後「VMインスタンスを作成」ボタンを押します。

● 2. とりあえず「ゾーン us-west1-a」と「e2-small」「 ディスク30GB」だけ指定して「デプロイ」実行

● 3.作成したGCEマシンを停止(この後設定変更)

● 4. 「編集」を押してマシンタイプを f1-micro に変更

● 5. 外部固定IPを作成する

「GCPコンソール」→「VPCネットワーク」→「IPアドレス」
から、「外部IPアドレス」を選択して、画面上部の「外部静的アドレスを予約」をクリック。
「名前」「リージョン」「接続先」を設定して「予約」ボタンを押す

● 6. マシンを立ち上げて root パスワードを設定

sudo passwd root

● 7. SSH の接続ポートを変更する / パスワードログインを禁止する

su -
vi /etc/ssh/sshd_config 

ポートを変更する

Port 52200

パスワードでのログインを禁止する

PasswordAuthentication no

再起動して新しいポートになっているか確認する

service sshd restart
systemctl status sshd.service

パスワードでのログインが禁止されているか確認する

ssh hoge@xxx.xxx.xxx.xxx -p 52200

● 8. firewall の sshのポートを 52200 へ変更する

● 9. KUSANAGIを再設定する

メモリが少なくなったマシンようにKUSANAGIを再設定します

su -
kusanagi configure
kusanagi init

● 8. nginx の 「ユーザー」と「グループ」を kusanagi kusanagi に変更する

sudo -
cd /etc/nginx/
cp nginx.conf nginx.conf.backup
vi nginx.conf

KUSANAGI9 の場合は nginx のディレクトリ は /etc/opt/kusanagi/nginx になります

nginx.conf の3行目を変更します

user kusanagi kusanagi;

編集後にリロード

nginx -s reload

● 9. php-fpm の 「ユーザー」と「グループ」を kusanagi kusanagi に変更する

 user = kusanagi
 group = kusanagi

● yum のエラーを修正して使用できるようにする

sudo rpm --rebuilddb
sudo yum update -y

● composer の インストール

cd
curl https://getcomposer.org/installer | php
sudo mv -i composer.phar /usr/local/bin/composer
composer -V
Composer version 1.10.9 2020-07-16 12:57:00
添付ファイル1
添付ファイル2
添付ファイル3
添付ファイル4
添付ファイル5
添付ファイル6
添付ファイル7
vm.png ( 137.3 KBytes ) ダウンロード
添付ファイル8
gcp02.png ( 435.5 KBytes ) ダウンロード
No.1821
09/12 10:24

edit

添付ファイル

No.1815
07/12 23:47

edit

さくらのレンタルサーバーでドメインごとに違うバージョンの PHP を動作させる

● さくらのレンタルサーバーでドメインごとに違うバージョンの PHP を動作させる

あるドメインだけ昔のバージョンの PHP で動作させたいという用件がたまにあります。
それをさくらのレンタルサーバーで実現する方法です。

.htaccess

Action myphp-script /php.cgi
AddHandler myphp-script .php .html

php.cgi (権限は 0755 に設定します)

#!/bin/sh
exec /usr/local/php/5.6/bin/php-cgi

これで php 5.6 が起動するようになります。

CLIから起動するときはこちらのフルパスで実行します

php -v

 ↓

/usr/local/php/5.6/bin/php-cgi -v
No.1812
09/30 10:02

edit

Amazon EC2 の apache で SERVER_ADDR が ローカルIPになる問題に対処する

● Amazon EC2 の apache で SERVER_ADDR が ローカルIPになる問題に対処する

SERVER_ADDR を書き換えるのは難しいので、独自の環境変数「X-SERVER_ADDR_EIP」をセットします。

独自の環境変数「X-SERVER_ADDR_EIP」に 123.123.123.123 をセットする例

SetEnv X-SERVER_ADDR_EIP '123.123.123.123'
No.1732
04/04 10:14

edit

Amazon AWS / Route53 で SPFレコードを設定する

v=spf1 a mx ip4:54.199.137.202 include:asp.cuenote.jp ~all

「レコードセットの作成」を押して次のように設定します。

名前 : (空欄のまま)
タイプ : TXT テキスト
値 : v=spf1 a mx ip4:xxx.xxx.xxx.xxx ~all

なお、 -all、**~all* は次のような違いがあります。

-all (ハイフン + all)

設定以外のアドレスは当該ドメインのメールサーバとして認証しない

~all(チルダ + all)

設定以外のアドレスは当該ドメインのメールサーバとして認証しないが、正当なメールであっても認証失敗する可能性もある

チルダの方がルールが緩いゆえに、メールサービスによっては soft fail 扱いとなるので、-all を設定するようにしましょう。

No.1731
04/04 09:00

edit

Amazon EC2 で SERVER_ADDR がローカルIPを返す問題に対処する

● Amazon EC2 では SERVER_ADDR がローカルIPを返します

$_SERVER['SERVER_ADDR']

 ↓

172.31.9.228

● グローバルIPを取得する

$eip = file_get_contents('http://169.254.169.254/latest/meta-data/public-ipv4');
echo $eip;
No.1730
04/03 17:37

edit

VALUE DOMAIN で メールサーバの SPFレコードを正しく設定する

● VALUE DOMAIN で メールサーバの SPFレコードを正しく設定する

SPFレコードを IP xxx.xxx.xxx.xxx に対して設定する

txt @ v=spf1 +ip4:xxx.xxx.xxx.xxxx -all

なお、 -all、**~all* は次のような違いがあります。

-all (ハイフン + all)

設定以外のアドレスは当該ドメインのメールサーバとして認証しない

~all(チルダ + all)

設定以外のアドレスは当該ドメインのメールサーバとして認証しないが、正当なメールであっても認証失敗する可能性もある

チルダの方がルールが緩いゆえに、メールサービスによっては soft fail 扱いとなるので、-all を設定するようにしましょう。

No.1639
12/09 09:53

edit

XSERVER で phantomjs を使って動的サイトをスクレイピングする

● XSERVER で phantomjs を使って動的サイトをスクレイピングする

(node.jsはあらかじめこちらの方法でインストールしておいてください。)
XSERVER で node.js を利用する|プログラムメモ

● XSERVER に phantomjs をインストールする

npm install phantomjs

● phantomjs の バージョン確認

./node_modules/phantomjs/bin/phantomjs -v

●(phantomjs 1)phantomjs でスクリプトを動かす( Hello World ! )

test_helo.js というファイル名で以下のファイルを作成

console.log('Hello, phantomjs');
phantom.exit();

phantomjs で実行する

./node_modules/phantomjs/bin/phantomjs test_helo.js

●(phantomjs 2)phantomjs でスクリプトを動かす( 動的サイトからのスクレイピング )

動的サイト「https://dev.to/top/week」からソースを取得します。

test_web.js というファイル名で以下のファイルを作成

var webpage = require('webpage').create();
var url = 'https://dev.to/top/week';

webpage.open(url, function() {
    console.log(webpage.content);
    phantom.exit();
});

phantomjs で実行する

./node_modules/phantomjs/bin/phantomjs test_web.js

これで「https://dev.to/top/week」のHTMLソースが表示されればOKです。

●(phantomjs 3)Curlの代わりに使用する

curl_phantom.js というファイル名で以下のファイルを作成

var system = require('system');
var args = system.args;

if ( ! args[1] ){
	console.log( 'ERROR: please set URL' );
	phantom.exit();
}

var webpage = require('webpage').create();
var url = args[1];

webpage.open(url, function() {
    console.log(webpage.content);
    phantom.exit();
});

phantomjs で実行する

./node_modules/phantomjs/bin/phantomjs  curl_phantom.js  https://dev.to/top/week
No.1423
01/23 10:07

edit

XSERVER で node.js を利用する

● XSERVER で node.js を利用する

● 1. nodebrewのインストール

XSERVER へ ssh接続して

mkdir src
cd src
wget git.io/nodebrew
perl nodebrew setup
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile

これで一旦ログアウトして再度 ssh接続します。

nodebrew

これでバージョンが表示されれば nodebrew のインストールが完了です。

● 2. インストール可能な node.js を表示

nodebrew ls-all 

● 3. (例)node.js v20.11.0 をインストール

nodebrew install-binary v20.11.0

パスを追加します

export PATH=$PATH:~/.nodebrew/node/v20.11.0/bin

● 4. インストールされている全てのnode.jsのバージョン表示する

nodebrew list

● 5. node.js を切り替える

nodebrew use v20.11.0
No.1422
01/30 18:16

edit

さくらのレンタルサーバで形態素解析 mecab を使用する

● (1/2)mecab本体のインストール

・mecabのダウンロード

http://taku910.github.io/mecab/#download

・mecabのmakeとインストール

tar xvfz ./mecab-0.996.tar.gz
cd mecab-0.996
./configure --prefix=$HOME/local --with-charset=utf8 --enable-utf8-only
make
make install

・.bash_profile に 以下を追加

# mecab
PATH="$HOME/local/bin:$PATH"

・mecabのインストール場所

~/local/bin/mecab

・mecabのバージョン確認

mecab -v

● (2/2)mecab辞書(ipadic)のインストール

・mecab ipadicのダウンロード

http://taku910.github.io/mecab/#download

tar xvzf mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801
./configure --with-charset=utf8
make
make install

・インストールした mecab ipadicのエンコーディングの確認

mecab -d ~/local/lib/mecab/dic/ipadic -D
No.1368
01/29 22:36

edit

さくらレンタルサーバ

XSERVER の cli(ssh接続) で PHP7 を使用する

● ssh接続したXSERVERで php を実行するとバージョンが低いPHPが起動する

XSERVERのコンパネでphp7を設定してもコマンドラインから実行するphpのバージョンは低いままです。

php -v
PHP 5.4.16 (cli) (built: Apr 12 2018 19:02:01) 

なぜこれが起きているかというと、php と打った時に実行されるファイルは

which php
/usr/bin/php

/usr/bin/php となっています。これのバージョンが(PHP 5.4.16)なのです。
そこで /usr/bin/php の代わりに /usr/bin/php7.2 を見に行くように変更します。

● phpのコマンドを /usr/bin/php7.2 に向ける

vi .bash_profile

この中の下記の行を変更します

PATH=$PATH:$HOME/bin

 ↓

PATH=$HOME/bin:$PATH

( $HOME/bin を先頭に入れ替えます )

● $HOME/bin/php を /usr/bin/php7.2 に向ける

mkdir $HOME/bin
ln  -s  /usr/bin/php7.2  $HOME/bin/php

● 一度ログアウトして再度ssh接続して確認

php -v
PHP 7.2.6 (cli) (built: May 30 2018 21:41:35) ( NTS )

これでOKです。

No.1350
11/17 15:18

edit

XSERVER

XSERVER に phpize で pecl拡張をインストールする

XSERVER では phpize できますので pecl拡張をインストールすることができます。

ホームディレクトリに php_source を作成してそこへインストールしたいモジュールを解凍して make します

例) XSERVERへ mailparse の PHP pecl拡張をインストールする

cd
mkdir php_source
cd php_source
wget https://pecl.php.net/get/mailparse-3.0.2.tgz
tar zxvf mailparse-3.0.2.tgz
cd mailparse-3.0.2
phpize
./configure
make

make が無事完了すると ~/php_source/mailparse-3.0.2/modules/ にモジュールが作成されます。

このモジュールを好きなディレクトリへ移動します。
(例えば ~/php_modules/)

● インストールしたモジュールを PHP の cli から使用する

php の -d オプションを使って直接モジュールファイルを指定して使用します

php -d extension=/home/<YOUR-ACCOUNT-NAME>/php_modules/mailparse.so  <実行したいPHPソース>

● インストールしたモジュールを WEBのPHPで使用する

XSERVERのコンパネの php.ini設定 から設定します

extension = /home/<YOUR-ACCOUNT-NAME>/php_modules/xxxxx.so
No.1207
11/17 14:49

edit

XSERVER

さくらのレンタルサーバでメール受信をきっかけにプログラムを起動する

● 1. メールアカウントを作成する( 例: autoexec )

さくらレンタルサーバのコンパネからメールアカウント「autoexec」を作成します。

● 2. .mailfilterを権限 0600 で作成する( 例: autoexec )

cd ~/MailBox/autoexec
touch .mailfilter
chmod 0600 .mailfilter

● 3. .mailfilterの中にプログラムに引き渡すコマンドを記述

.mailfilter

to "| /usr/local/bin/php <YOUR-PROGRAM-FULL-PATH>"

これでメール受信をきっかけにプログラムが起動します。

No.1202
11/09 09:22

edit

さくらレンタルサーバ

composer2 を さくらのレンタルサーバ、XSERVER へインストールする

sshでさくらのレンタルサーバへログイン後に

● ログインシェルを bash に変更

chsh -s /usr/local/bin/bash

● composer のインストール( ~/usr/local/bin/ へインストールする場合 )

cd
mkdir -p usr/local/bin/
curl -sS https://getcomposer.org/installer | php -- --install-dir=usr/local/bin/

● composer のインストール( ~/composer2/ へインストールする場合 )

cd
mkdir -p composer2/
curl -sS https://getcomposer.org/installer | php -- --install-dir=composer2/

インストール先はどこでもokです。お好きなところへどうぞ。

● .bash_profile に追加

とりあえず .bash_profile ファイル内に alias で設定します

vi .bash_profile

.bash_profile の最初にロケールを追加

デフォルトでは LANG=C (英語) に設定されているので日本語に設定しておきましょう。

export LANG="ja_JP.UTF-8"

.bash_profile の最後に追加

# composer
PATH=$PATH:$HOME/usr/local/bin
alias      php='php -c~/www/php.ini'
alias composer='php -c~/www/php.ini ~/usr/local/bin/composer.phar'

● composer 高速化 リポジトリを日本のミラーサーバに変更

( composer Version2 以降はデフォルトでも十分早いので以下は特に必要ありません )

リポジトリを(packagist.jp)に変更します

composer config -g repos.packagist composer https://packagist.jp

(もしもの時に)戻す場合はこちらのコマンドからリポジトリを削除します

composer config -g --unset repos.packagist

● composer 高速化 hirak/prestissimo のインストール

( composer Version2 以降はデフォルトでも十分早いので以下は特に必要ありません )

composer global require hirak/prestissimo
No.1200
06/21 10:39

edit

さくらレンタルサーバ

さくらのレンタルサーバの Let's Encrypt SSL証明書を更新する

● さくらのレンタルサーバで自動更新が可能になりました

さくらのレンタルサーバ/マネージドサーバ Let's Encrypt
https://www.sakura.ne.jp/function/freessl.html?=mail_20171017

● さくらレンタルサーバ > ドメイン設定

https://secure.sakura.ad.jp/rscontrol/rs/domain

・「証明書」 「更新」をクリック
・「秘密鍵を含む新しい設定の作成」をクリック
・「LETSENCRYPT xxxxxxx」 をアップロード ・「有効化の確認」にチェックを付けて「新しい設定を有効化する」ボタンをクリック

No.1137
11/09 09:24

edit

さくらレンタルサーバ

さくらのレンタルサーバで無料の独自のSSL「Let's Enctypt」を導入する

● さくらのレンタルサーバで自動更新が可能になりました

2017年10月17日以降さくらのレンタルサーバで自動更新が可能になりました

さくらのレンタルサーバ/マネージドサーバ Let's Encrypt
https://www.sakura.ne.jp/function/freessl.html?=mail_20171017

● さくらのレンタルサーバで「Let's Enctypt」無料SSLを設定する手順

1. さくらコントロールパネルへログイン
2. 左のグローバルメニューから「ドメイン/SSL設定」を押す
3. 設定したいドメインの【登録】ボタンを押す
4. 【無料SSLの設定へ進む】ボタンを押す
5. 【無料SSLを設定する】ボタンを押す

● さくらのレンタルサーバで「http → https」 へリダイレクトする .htaccess

SetEnvIf REDIRECT_HTTPS (.*) HTTPS=$1 
<IfModule mod_rewrite.c>
RewriteEngine on 
RewriteCond %{ENV:HTTPS} !on 
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 
</IfModule>

昔ながらのやり方はこちら↓


● さくらのレンタルサーバで無料の独自のSSL「Let's Enctypt」を導入する

無料の独自SSL「Let's Enctypt」を簡単に導入し、独自ドメインを https://あなたのサーバー名/ でアクセスできるに設定します 。
簡単に導入できるネットオウルの無料ウェブサービス「SSLボックス」を利用します
なお、SSL認証レベルは【DV】です。

● SSL認証の認証レベルとは?

SSL認証の認証レベルは3段階あります。

1. ドメイン認証型(通称:DV)(ドメインの所有権を確認する一番低レベルなSSL認証)
2. 企業認証型(通称:OV)(ドメインの所有権に加えて企業の実在性を確認するスタンダートなSSL認証)
3. EV認証(通称:EV)(Extended Validation 認証。更に厳しい認証。取得するとブラウザのアドレスバーに企業名が表示される)

● ネットオウルのユーザー登録をする。

http://www.netowl.jp
の会員登録から会員登録を行います。

● ネットオウルの「SSLボックス」から 「Let's Enctypt」サーバ証明書を取得する

  • 会員登録後ログインしたら「SSLボックス管理」→「新規取得」へ移動します。
  • 「その他のサーバで利用する」をクリックします。
  • 下記のとおり入力します

https://secure.netowl.jp/netowl/?service=sslbox

SSL種別 : 『Let's Enctypt』を選択
コモンネーム : あなたのドメイン名
国 : JP
都道府県(state) : Tokyo (例)
市区町村(local) : Tokyo (例)
組織  (org) : Personal (例)
部署  (unit) : None (例)

入力後「所有者確認手続き」ボタンをクリックします

-「Web認証」「DNS認証」と選ぶ画面が出てきますが、「Web認証」を選択し、トークンファイル「ダウンロード」ボタンをします。

  • LteT1zJucsfEkFbRwObN_gckPht1yL8a4PERmoK4vBU のようなファイルがダウンロードされます。
  • ダウンロードしたトークファイルファイルをアップロードします。FTPでサーバに接続しサイトトップにディレクトリ「.well-known」を作成しその下にデレクトリ「acme-challenge」を作成しそのディレクトリにトークファイルをアップロードします。
  • アップロードが完了したらネットオウルの「所有者確認開始」ボタンをクリックします。
  • 確認が正常に完了すると証明書を発行するというボタンが表示されますのでそのボタンをクリックします。
  • 3つのファイルのダウンロードボタンが表示されますのでそれぞれクリックしてファイルをダウンロードします。ダウンロードされるファイルは以下の通り
CERT(SSL証明書) : LETSENCRYPTXXXXXXXX.cert
中間証明書    : LETSENCRYPTXXXXXXXXInt.cert
秘密鍵      : LETSENCRYPTXXXXXXXX.key

● さくらのレンタルサーバーに証明書ファイルをアップロードする


  • さくらのレンタルサーバーにログインし「ドメイン設定」ボタンを押して「 ドメイン 一覧 」を表示させます

  • 一覧リストの中の "SSL証明書を登録したいドメイン" の横の「登録」ボタンを押します
  • 「秘密鍵を既にお持ちの場合には、アップロードをしてください。」と表示されるので先程ダウンロードしたファイル『秘密鍵: LETSENCRYPTXXXXXXXX.key』をアップロードします。
  • 証明書のインストールを行います 」と表示されますので『証明書のインストール』のワクに先程ダウンロードしたファイル「CERT(SSL証明書) : LETSENCRYPTXXXXXXXX.cert」の中身をコピーペーストして貼り付けて送信します。
  • SNISSLが利用可能です 」と表示されれば正しくアップロードされています。
  • 同じ画面の真ん中あたりのメニューの「中間証明書のインストール 」をクリックします。『中間証明書    : LETSENCRYPTXXXXXXXXInt.cert』の中身をコピーペーストして貼り付けて送信します。
  • これで証明書のアップロードは完了です。画面上に「SNI SSLを利用するにはドメイン設定よりSNI SSLを有効にしてください。 」と表示されているので「ドメイン設定」をクリックします。
  • 『 4. SSLの利用をお選びください』の項目のところ「SNI SSLを利用する」を選択し送信ボタンを押します

● 独自SSLの確認

https://あなたのサーバー名/ へアクセスして独自SSLが正しく設定されていることを確認します。

添付ファイル1
添付ファイル2
No.1081
11/09 09:24

edit

添付ファイル

さくらレンタルサーバ

IDCFクラウドに仮想マシンを作成してSSHでログインする

● IDCFクラウドに新しいマシンを作成する

「仮想マシン作成」ボタンから新しいマシンを作成する。

● 管理画面の「コンソール」から仮想マシンにログインする

作成後に届くメールに SSHの PASS が書いてあるので
管理画面の「コンソール」から

id : root
pass : メールに記載のパスワード

でログインできる。

● SSHのキーを登録する

左メニューの「SSH key」から SSH KEY 登録画面を表示する
登録するキーは、自分のマシンのコンソールから

cat ~/.ssh/id_rsa.pub

で表示させる。

SSH KEY登録画面から「アップロード」タブを選択し

SSH Key名 : 任意の名前
RSA公開鍵を貼り付け : 先程のキーを貼り付ける

で登録する

● ファイアーウォールの設定

左メニューの「IPアドレス」からマシンのIPアドレス(xxx.xxx.xxx.xxx)をクリックして「 ファイアーウォール 」タブを選択し下記のように設定する

例 : SSHの設定の場合(HTTP,HTTPSも同様に設定する)

コメント : 任意のコメント(例:SSH)
ソースCIDR : IPによるアクセス制限(制限をかけたくなければ Any を選択)
タイプ: Custom TCP
ポートレンジ : 52222

● ポートフォワードの設定

左メニューの「IPアドレス」からマシンのIPアドレス(xxx.xxx.xxx.xxx)をクリックして「 ポートフォワード 」タブを選択し下記のように設定する

コメント : 任意のコメント
パブリックポート : SSH
プライベートポート: 49152〜65535 あたりから任意の値を選択 (例:52222)
仮想マシン : 先ほど作成したマシンを選択

● SSHでログインする

鍵ファイルが `id_rsa_idcf_cloud` の場合は以下のようにしてログインします

ssh -i ~/.ssh/id_rsa_idcf_cloud -p52222 root@xxx.xxx.xxx.xxx
添付ファイル1
添付ファイル2
No.1080
01/30 09:10

edit

添付ファイル

さくらのレンタルサーバへPHP のPECL拡張をインストールする

さくらのレンタルサーバへPECL拡張をインストールするには

  1. 使用しているPHPバージョンに対応するpecl拡張のソースをダウンロード・展開
  2. phpize , configure , make
  3. 任意の場所に【xxxxx.so】ファイルを移動
  4. php.iniに `extension = xxxxx.so` を記述

でできます。

例としてPECL拡張 `mailparse` をインストールしてみます。

1. 使用しているPHPバージョンに対応するpecl拡張のソースをダウンロード・展開する

https://pecl.php.net/
から使用したいpecl拡張をダウンロードします。 (この際対応しているPHPのバージョンを確認すること) 例 : mailparse バージョン 2.1.6 をダウンロードします

wget https://pecl.php.net/get/mailparse-2.1.6.tgz
tar zvxf mailparse-2.1.6.tgz
cd mailparse-2.1.6

2. phpize , configure , make します

ターミナルから以下のコマンドを実行します。

phpize
./configure
make
make test

3. 任意のフォルダにファイルをコピー

ここでは ホームディレクトリ直下の php_modules ディレクトリにコピーします

mkdir cd ~/php_modules/
cp ./modules/mailparse.so   ~/php_modules/

4. さくらレンタルサーバの管理画面から PHP設定の編集 を押して php.iniに設定を記述します

extension_dir =  /home/『ユーザー名』/php_modules/
extension = mailparse.so

phpinfo() で項目が表示されていれば正しくインストールされています。

5. コマンドラインからも使えるようにエイリアスを設定する

● .bash_profileに以下を追加

alias php='php -c/home/『ユーザー名』/www/php.ini'

● .cshrc に以下を追加

alias php	php -c /home/『ユーザー名』/www/php.ini

追加後にコマンドラインから

php -m

で該当モジュール(mailparse)が表示されていれば正しくインストールされています 

6. PECL拡張をインストールしたPHPを使用してcomposerを使う

composer requie hogehoge/hogehoge

とするかわりに

php /PATH/TO/COMPOSER/composer.phar   require   hogehoge/hogehoge

とすればいいでしょう。

No.1047
11/09 09:25

edit

さくらレンタルサーバ
メール

さくらのレンタルサーバへPHPのPECL拡張(ソケット拡張、FTP拡張等)をインストールする

さくらのレンタルサーバ「スタンダード」へPHPの FTP拡張(ftp.so)ソケット拡張(socket.so)をインストールする方法。

1. PHPのバージョンを確認する

PHPのソースから

phpinfo();

でバージョンを確認します。

2. 同じバージョンのPHPソースを取得してきて、さくらサーバ上で展開する

https://secure.php.net/releases/
例(バージョン 5.6.21)の場合はPHP 5.6.21 (tar.gz) をダウンロードして展開するとフォルダ php-5.6.21 ができます。

3. 拡張の共有ライブラリをmakeする

cd ./php-5.6.21/ext/sockets
phpize
./configure
make

成功すると modules/sockets.so ファイルができます。

4.任意のディレクトリに sockets.so をコピーする

例( 【ホームディレクトリ】/php_modules)の場合

mkdir ~/php_modules
cp modules/sockets.so ~/php_modules/

5.さくらレンタルサーバのコンパネ →『 PHP設定の編集』に以下を追加して保存する。

php.ini に以下を追加します

extension_dir =  /home/『ユーザー名』/php_modules/
extension = sockets.so

6.phpinfo() で確認する

成功すると と表示されます。

同様に 3〜5 の手順で ftp拡張をインストールするすることもできます。

6. コマンドラインからも使えるようにエイリアスを設定する

● .bash_profileに以下を追加

alias php='php -c/home/『ユーザー名』/www/php.ini'

● .cshrc に以下を追加

alias php	php -c /home/『ユーザー名』/www/php.ini

追加後にコマンドラインから

php -m

で該当モジュール(mailparse)が表示されていれば正しくインストールされています

7. PECL拡張をインストールしたPHPを使用してcomposerを使う

composer requie hogehoge/hogehoge

とするかわりに

php /PATH/TO/COMPOSER/composer.phar   require   hogehoge/hogehoge

とすればいいでしょう。

引用 : http://tti.matrix.jp/blog/?p=344

添付ファイル1
No.1041
11/09 09:25

edit

添付ファイル

さくらレンタルサーバ