deploygateが便利になっていた

概要

通常iOSやAndroidの場合に実機でテストする場合にPC端末に繋いだ上でビルドする必要があります。
それでもAndroidの場合は、apkをメール等で配布すればいいのですがiOSの場合はそうはいきません。そこで
deploy gate で開発段階のアプリを配布する必要があります。その他にもiOSの場合はxcodeのバージョンによってビルドできない事があるのでそれを避ける事ができます。

ipaを配布する方法

deploy gate にログインし管理画面からipaもしくはapkをアップロードします。
実はこの部分が便利になっていました。

curl -sSL https://deploygate.com/cli/install/自分のid | bash
dg deploy

上記の方法で code deploy のdgコマンドが使えるようになりプロジェクトファイルまで移動してdeployコマンドを使えば自動的にdeploy gateにアップロードしてくれるようです。便利ですね。
ちなみにインストール中にgemをいくつかインストールしていたのでrubyを事前に入れておく方がいいと思います。

AWS Route53にサブドメインを追加する

概要

AWSで運用しているサイトでサブドメインを追加するにはどうしたらいいんだろう?と思い調べて試してみました。
ちなみに独自ドメインは取得してありなおかつelbは設定済みという前提です。
ネットとかでみたら?な部分が多かったのですがやってみたら簡単でした。

Route53に管理画面ページへ遷移


AWSコンソールからRoute53へ移動します。
ちなみに1年くらい前にAWSコンソール画面のデザイン変わりましたよね、、、、、。
最初は使いにくいなと思いましたが慣れると悪くないですね。
デザイン変更が嫌ならaws-cliでやりなさいってことなんだろうな〜

サブドメインの追加


自分の場合はすでにドメインを設定しているので登録しているドメインの createrecordsetを押下してサブドメインを追加しました。elbを設定してるので alias target にはelbを指定します。

終わり

上記後にブラウザから新しく作成したサブドメインにアクセスすればページが表示されるかと思います。
あとはelbにぶら下がっているec2内のnginxなどでルーティングしてあげればドメイン毎に別々のページを表示できますね。

cloudSQLにmacのローカルから接続する方法

はじめに

GAEを使ってwordpressを構築したいと思ったのがきっかけで、GCPを使っていてcloudSQLへローカルから繋ぎたくなりました。
この方法は2つあり特定のipからの許可を行う方法とproxyを使う方法の2種類あります。
特定のipから許可する方法はAWSでSGの解放と考え方は同一なのでわかりやすいと思います。
むかしip許可をする方法は管理画面から行うだけでできたのですがproxyの方法は?な部分があったのでできなかったのを覚えています。
今回はこのprxoyを使う方法を自分の備忘録として記録します。

cloud SDKのインストール

cloud sdkは簡単に言うとaws-cliのようなもの?これを入れると簡単にローカル端末からGCPへアカウントのログインが行うことができます。ただむかしハマったのがこれpythonのバージョンが3系だと動かないのでローカルでpython3系の人はpyenvなどでこれを動かす時だけ2.7系にしないとダメな気がします。
下記はgoogle公式にあるものと同一です。


curl https://sdk.cloud.google.com | bash
exec -l $SHELL
gcloud init

アカウントを切り替えたい時

余談ですがgoogleのアカウントは複数持っている人も多いとお思います。
その場合にアカウントの切り替えたい時は、ログインし直すといいと考えます。


gcloud auth list
gcloud auth login

リストでみてお目当のアカウントと違ったら切り替え。

cloudSQLへの接続

上記で基本的な準備が整っているのでcloudSQLへ進みます。

cloud_sql_proxyをダウンロード

こちらもgoogle公式と同一ですが記します。

curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
chmod +x cloud_sql_proxy

cloud sqlへ接続

上記でダウンロードしたcloud sql prxoyのディレクトリの上に適当なディレクトリを作成(localsql)し下記のコマンドを実行すればコネクションはできるかと思います。
./cloud_sql_proxy -dir=localsql -instances=cloudsqlの接続インスタンス

終わりに

GCPはどうもAWSよりも情報が少なくハマると難しい部分がありますね。
ただ料金やサービス的に魅力的なものも多いのでこれからも色々試して行きたいなと思います。
特に個人が行うサービスはAWSよりもお財布に優しいしGCPが自動でやってくれるところもあっていいですね。

embulkの使い方

embulk 概要

embulkとは大量のログデータ等をbigQuery、redshift、elasticsearch等のデータウエアハウスに転送する際に使われるルーツです。
同じトレジャーデータのツールにfluentdがありますがこちらは逐次データ転送をするツールがあります。
対してこちらのembulkは大量のデータ転送を行います。
今回はこちらを使ってmysqlからbigqueryへデータを転送する方法を記します。

embulk インストール

こういうツール系は書いた時と後でやってみると違うことが多いのでコマンドというよりも公式のリンクと主に必要な物を記載します。
主に必要なのはjavaとrubyでしょう。
下記のURLを参考に各環境に応じて実施します。
embulkの公式インストール

embulk 必要なファイル

schema.json

実行ファイル
2週類のファイルが必要なファイルになります。
1つが読子きさきに作成するデータベースの設計jsonファイルです。
もう1つがembulkの実行内容のファイルです。

テーブル.json

[
  {
    "name": "id",
    "type": "INTEGER"
  },
  {
    "name": "カラム名",
    "type": "STRING"
  },
]

ここのjsonファイルは下記のデーターロード先で作成されるテーブルとカラム構造となります。
データ抽出元とここを合わせる必要があります。

実行.yml

in:
  type: mysql
  port: 3306
  user: データベース接続ユーザー
  password: データベースパスワード
  database: データベース名
  host: データベースの接続ホスト
  query: |
    SELECT *
    FROM テーブル名
    WHERE date BETWEEN '2017-07-01 00:00:00' AND '2017-07-31 23:59:59'

out:
  type: bigquery
  mode: append
  auto_create_table: true
  table: 作成されるテーブル名
  options: {connectTimeout: 720000} # 長目がいい
  ignore_unknown_values: 1 # 1行目はヘッダーだから無視
  auth_method: private_key
  schema_file: テーブルの設計jsonファイル
  service_account_email: GCPで作成してます
  p12_keyfile: GCPのキーファファイル通常はp12
  source_format: CSV
  file_ext: .csv
  delete_from_local_when_job_end: 1
  project: 'GCPのプロジェクトID'
  dataset: データセットここは自分の作る
  formatter:
    type: csv
    header_line: false
    timezone: Asia/Tokyo

上記ではmodeがappendになっています。
新規のテーブルの場合は新規にテーブルが参加されますがすでにテーブルがある場合はテーブルにデータが追加されます。
inのquery部分で実行しているSQLで抽出された結果を取得しています。
ちなみに他のサイトでここのembulkをバッチ化する際に月ごとのバッチ化する際にshllスクリプトで変数として実行時間の期間を設定してましたがmysqlの関数をここに書けば大丈夫ですね。

実行

こちらのコマンドにより実行できますが、データ量によって時間がかかります。
embulk run 実行ファイル.yml

React基礎

概要

React.jsとはFacebook謹製のjsフレームワークです。
似たようなjsフレームワークにangular.jsがありますが、htmlを拡張していくのがangularでjs自体を拡張していくのが私の印象でした。(angular2はType.scriptでないといけないのでなるべくピュアなES6を勉強す流には向いているのか?)加えてReact.jsはjsの関数型機能をベースにつくられています。そういう意味ではReactを単なるビューを司るフレームワークという一般的な紹介には疑問を感じています。今回はこのReactの基本的な部分を紹介します。

コンポーネント

コンポーネント(component)とは日本語にすると構成要素とかという意味になります。
要するに部品という意味です。イメージ的には、よくあるheaderやfooterの共通化のようなものです。
このコンポーネントには主に2種類あります。
なんで2種類あるのというお話ですが、functional componet はstateを保持できません。逆に class componentは state を保持することができるという違いがあります。

functional (or stateless) componet

関数でコンポーネントを作成するのがfunctional componet です。
下記のような形になります。

function Hello() {
    return(
        <div>
            こんにちは
        </div>
    )
}

class component

クラスを宣言してReact.Componentを継承してコンポーネントを作成します。

class Hello extends React.Component {
    render() {
    return (
        <div>
            こんにちは
        </div>
    )
    }
}

htmlをエスケープさせないようにする

変数に格納したhtmlはReactDOM.reder内部でエスケープされてしまうので下記のようにする必要があります。

const textHtml = {__html:'<h2>test</h2>'};

<span dangerouslySetInnerHTML = { textHtml } />

コンポーネントの値(stateとprops)

propsとは

propsとはコンポーネントに値を渡すときに利用されるものです。
上記した functional componet を利用して書くと下記のようになります。
ReactDOM.render内部でHelloコンポーネントにpropsを渡しています。
propsはデフォルトの値を与えたり必須チェックを行うこともできます。

function Hello(props) {
    return(
        <div>
            こんにちは{props.name}
        </div>
    )
}

---

ReactDOM.render(
    <Hello name="名前" />, document.getElementById('root'));
registerServiceWorker();

---

Hello.propTypes = {
    name: React.PropTypes.string.isRequired
}
---
Hello.defaultProps = {
    name: 'デフォルト'
}

stateとは

stateとはclassコンポーネントの中で保持する値のことを言います。
constructorを宣言しその中で値を保持して利用します。

constructor() {
    super();
        this.state = {
            name: 'ステート'
        };
    }

NewRelicの導入手順

newrelic概要

newrelicとはサーバーのパフォーマンス監視を行うことができるツールです。
全ての機能を使うためにはお金を払う必要がありますが、無料版でも多くの機能を使うことができます。
無料版でもサーバーのCPU利用率やメモリ使用料からインフラの応答反応やWEBパフォーマンスを確認することができます。
有料版でしたらスロークエリやエラーなどの詳細が見れるので、ELKでエラーログ解析環境を作らなくてもよくなります。
特にAWSを入れている方は、下記のURLよりキャンペーンで申し込むと通常の無料プランよりも多くの機能を使えます。
https://newrelic.com/partner/aws-monitoring

インストール方法

ここではNewRelicのAPMとserversのインストール方法を記します。

APMのインストール

APMは主にアプリケーションのパフォーマンスを監視するツールです。
こちらは下記の手順でど運輸が可能です。

sudo rpm -Uvh http://yum.newrelic.com/pub/newrelic/el5/x86_64/newrelic-repo-5-3.noarch.rpm
sudo yum install newrelic-php5
sudo newrelic-install install

newrelic-install installをするとライセンスキーが聞かれるので管理画面から確認できるライセンスキーを記入します。
そのあとにnginxやphp-fpmをリスタートしてしばらくするとnewrelicに表示されるようになります。

SERVERSのインストール

SERVERSは、サーバーのメモリやCPU利用率等を監視するツールです。

rpm -Uvh https://download.newrelic.com/pub/newrelic/el5/i386/newrelic-repo-5-3.noarch.rpm
yum install newrelic-sysmond
nrsysmond-config --set license_key=ライセンスキー
/etc/init.d/newrelic-sysmond start

終わりに

newrelicの使い方を簡単に紹介させていただきました。
この手順も慣れてしまえば5分ほどでできてしまい簡単にサーバー監視ができるのでとても便利です。
とりあえずサーバーパフォーマンスやエラー解析を行っていなくてという状況でしたら、まず最初の選択肢としてnewrelicは悪くない選択肢だとお思います。

wordpressの初期設定のつまづきポイント

wordpressの引越しを実施

久々にwordpressの引越しを実施しました。
今回はapacheからnginxへ移行しPHPもバージョンアップしました。
ただその中でひっかかった部分があったので備忘録を記述します。

プラグインをインストールできない。

プラグインをインストールしようとするとFTPをもとまられるようになりました。
これは下記の2つの変更を行う必要があります。

wp-config.phpの編集

下記の一文をwp-config.phpに追加する必要があります。

define('FS_METHOD', 'direct');

ディレクトル所有者と権限の編集

wp-contentの所有者を変更しました。
通常apacheだとwww-dataとかになっていると思いますが、nginxで実行しているのでnginxに変更します。

chown -R nginx:nginx wp-content

権限の変更

さらにプラグインのディレクトリの権限の変更を行います。

chmod 0707 wp-content/upgrade
chmod 0707 wp-content/themes
chmod 0707 wp-content/plugins

ここまで入れて問題なく動いたのですがなぜかjetpackが動きません。

jetpackがうまく動かない?

jetpackの機能を有効化しようとしたら下記のようなエラーが出ました。

SyntaxError: Unexpected token < in JSON at position 0

jsエラーなのであれれと思いましたがこちら下記のサイトに行って個別に機能の有効化ができました。

/wp-admin/admin.php?page=jetpack_modules

wordpressをupdateできない。

下記のメッセージが表示された場合にはパーミッションの変更が必要です。

いくつかのファイルをコピーできないため、最新版のインストールができません。これはたいていの場合、ファイルのパーミッションが適切でないことが原因です
sudo chmod -R 707 wp-includes

プラグインを入れるのに失敗する

その他プラグインを入れたときにファイルをコピーできないとエラーがでたら下記のコマンドを実行してパーミッションの変更を行います。

sudo chmod -R 707 wp-includes

終わりに

wordpressは問題が発生しても調べればすぐに答えが出てなんとか解決することができました。
またちょくちょく個別のカスタマイズをしていきたいと思います。

Dockerの基本コマンド

イメージ関連

イメージ検索
docker search
リモートからイメージの取得
docker pull イメージ名
イメージ一覧表示
docker images

イメージを起動しコンテナ化

docker run -it centos /bin/bash
-i = 標準入力開き続ける
-t = 擬似ターミナルの割り当て
-d = デタッチモード コンテナに入らないでバックグラウンドで動かす場合
-p = ポートの割り当て ホスト側 : コンテナ側
-v = ボリューム(ディレクトリの共有) ホスト側 : コンテナ側

イメージの作成方法

docker commit コンテナID イメージ名:タグ
docker build -t イメージ名: タグ .

Dockerfile

FROM centos
RUN yum update && yum install httpd
CMD /etc/init.d/httpd.start

Docker Hub

Docker Hubにログインする
docker login
dcoker tag イメージID Docker Hubアカウント名/イメージ名:タグ
Docker Hubにイメージを送る
docker push 上記イメージ

削除

コンテナ全削除
docker rm $(docker ps -aq)
イメージ全削除
docker rmi -f $(docker images -q)

GCPの概要

はじめに

GCPのお勉強会に参加したのでその時のメモ
普段AWSだけどGCPどんな感じなのか興味があり参加

GCP(概要)

googleは専用回線を持っていてそれと同じ専用線をGCPでは利用可能
世界展開する際にはこのネットワークを利用することができるので高速アクセスが可能

エッジキャッシュサーバー

CDN安くて許容度が高い

リージョンとゾーン

リージョン : データセンターの場所 asia-north-east1 東京とかとか
ゾーン : データセンターをメンテナンスするエリア 基本的にゾーン毎に3ヶ所
ここら辺はAWSと同じよね。

データセンター

日本にもある
電気代を抑えるためにgoogleは努力
冷却システム AIが行なっているらしい
サーバーのハードも自作、、、市販はしてないのね。

課金

分単位で課金が発生
ここはAWSと違う時間単位で課金が走るのでね。
サステンドユーズディスカウント : 同じインスタンスを使ってるとお安くしてくれる

App Engine

Paasなので基本的にお任せ
言語も限定的 Java, PHP, Pythonなど
ruby perlは使えないらしい 悲しい。

Compute Engine

IaaSなのでミドルウェアから作ってくれる
基本的にAWS的にはこれと同じかEC2でゴリゴリいつもやってるのと同じね。

IAMの管理

ここら辺は基本的にAWSと同じイメージユーザーに色々とroleで権限与えていく
1番の違いはgoogleアカウントと紐づいているところが違う

GCPへのアクセス

goole cloud platform console

GUIで使う管理画面

CloudのSDK/Shell

テーミナルの画面
gclou コマンドが使えるようになる

gcloud compute list
gsutil ls gs://hoge

cloud shellでは管理画面から操作可能

RESTful APIs

1番機能が画面やシェルはここのAPIを読みだしてる。
APIs Exploer からguiで確認可能

Google App Engine

Paasサービス
スケーラビリティが高い デフォルトでオートスケーリングができる 40msでインスタンスが立ち上がる
AWSの場合はオートスケーリングでスパイクがあると対応しきれないけどすごいな。
極端な話0台で設定してリクエストがあったらインスタンスが立ち上がるということができる。
AWSのlambdaよりもいいですねこりゃ。
しかもバージョン管理もしてくれる。
ミドルウェアの管理も不要つまり環境が不要!!!!
なんと!!!
snapchat、ingress、メルカリもApp Engineで運用してるらしい。
snapchatはインフラエンジニアなしでiOS&Androidエンジニア

Standard Enviroment

java, python, PHP&GOのみ
sshでは入れない
書き込み処理ができない。
image magicとかインストールする必要があるものはできない。
APP EngineのSDKを入れて開発できる。

無料枠

インスタンス1日28時間の無料枠あり。
プロジェクト毎に課金がされる。
よってテストと本番みたいにすればテストと本番のインスタンスにそれぞれ無料枠適用される。
夕方5時にリセットされる。
例) 2台動かす
A 14時間アクセスあり起動
B 15時間アクセスあり起動
計 29時間なので1時間課金される

Flexible Enviroment

Dockerベースでできている。
こちらはローカルにアクセスできる

失ったもの

スケーラビリティが失われている。
ms単位ではインスタンス立ち上がらないので0台運用できない1台設定して。
無料枠はない。

オートスケールで死ぬのを防ぐには

settings のDaily spending limitで金額を設定する。(ここでの金額はDatastore&App Engine)
これでアクセスできないと500エラーが返る。
DDOS攻撃受けたらipブロック登録しとけばよい。。。

Google Cloud Datastore

KVSのデータストア
スケーラビリティが高い
ポケモンGOもこれを利用している。
国毎にデータベース分けられてないのでこれ以上のものはない。
無料枠あり。
ストレージが1GBまで無料になっているらしい。

wordpressカスタマイズの基本

ユニットテストデータ

https://github.com/jawordpressorg/theme-test-data-ja
wordpress importerが進まないときは下記の変更を加える。

wp-content/plugins/wordpress-importer/parsers.php
if ( false && extension_loaded( 'simplexml' ) ) {

デバッグをオンにしてエラーを表示

define('WP_DEBUG', true);

ファイルとの対応関係

パーツテンプレート
header.php => get_header();
footer.php => get_footer();
slug-name.php => get_template_part($slug,name);
固定ページ = page.php
投稿詳細ページ = single.php
フロントページ = front-page.php

パラメーター

パラメーター

name = サイト名
description = キャッチコピー
charset = 文字コード

ループ

<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<p><a href="<?php the_permalink(); ?>"><?php the_title() ?></a></p>?>
<?php endwhile; ?>
<?php else : ?>
<p>記事がありませんでした</p>
<?php endif; ?>

アーカイブページ
ループ内の記事全てが表示される

シングルページ
ループ内でも1ページのみ表示

カスタムフィールド

the_meta();

ページ毎の条件分岐

is_home
is_front_page
is_singular

functions.php

プラグインと同様の効果を持つ

アイキャッチの有効化

add_theme_support(“post_thumbnails”)

カスタムフィールド

<?php the_meta(); ?>
<?php echo esc_html(get_post_meta($post->ID, 'フィールド名', true)) ?>

smart custom fields

smart custom fields

<?php scf::get('フィールド名'); ?>

カスタムクソノミー

custom post type ui

カスタムリンクの変更

httpd.conf

<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>

AllowOverride None → All に変更する。
※ ちゃんとvar/www/htmlのディレクトリ内担っている事を確認する事!!!!