ダイヤユウ

ダイヤ ユウ

主にプログラミング。

LaravelからGCPのCloudSQLに接続できるようにする

AppEngineにlaravelアプリケーションをデプロイしても、DB接続とか面倒なのでメモ。

CloudSqlにローカルから接続できるようにする

  • cloud_sql_proxyダウンロード
curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
  • プロキシを実行可能に
chmod +x cloud_sql_proxy
Google Cloud Platform Console の Cloud SQL の [サービス アカウント] ページに移動します。
[サービス アカウント] ページに移動

必要に応じて、Cloud SQL インスタンスを含むプロジェクトを選択します。
[サービス アカウントを作成] をクリックします。
[サービス アカウントを作成] ダイアログで、わかりやすいサービス アカウント名を指定します。
[役割] で、次のいずれかの役割を選択します。
[Cloud SQL] > [Cloud SQL クライアント]
[Cloud SQL] > [Cloud SQL 編集者]
[Cloud SQL] > [Cloud SQL 管理者]
あるいは、[プロジェクト] > [編集者] の順に選択して、編集者の基本的な役割を使用できますが、編集者の役割には Google Cloud Platform 全体の権限が含まれます。

これらの役割が表示されない場合、Google Cloud Platform ユーザーに resourcemanager.projects.setIamPolicy 権限がない可能性があります。権限を確認するには、Google Cloud Platform Console の [IAM] ページにアクセスし、自分のユーザー ID を検索します。

必要に応じて [サービス アカウントの ID] を一意のわかりやすい値に変更して、後でこのサービス アカウントを簡単に見つけられるようにします。
[新しい秘密鍵の提供] をクリックします。
デフォルトのキータイプは JSON であり、この値を使用するのが適切です。
[作成] をクリックします。
秘密鍵ファイルがマシンにダウンロードされます。秘密鍵ファイルは、別の場所に移動できます。安全な場所に鍵ファイルを保管してください。

接続コマンド実行

<INSTANCE_CONNECTION_NAME>はSQLインスタンスIDを指定

./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:3306 \ -credential_file=<PATH_TO_KEY_FILE> &

だが、こんな感じのエラーが出る。

couldn't connect to "aaaaaaaaaaa": ensure that the account has access to "aaaaaaaaaaaa" (and make sure there's no typo in that name). Error during createEphemeral for aaaaaaaaaa: googleapi: Error 403: Access Not Configured. Cloud SQL Admin API has not been used in project aaaaaaaaa before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/sqladmin.googleapis.com/overview?project=aaaaaaaaaa then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry., accessNotConfigured

Cloud SQL Admin API has not been usedとか書かれているから、これを有効にすればいけるはず。「APIとサービス」->「ライブラリ」から該当のAPIを探そう。

f:id:utr066:20190113025254p:plain

真ん中のやつだね。これを有効化して接続コマンドを実行すればいけるはず。

DBの中身を参照できるようにする

composer.jsonに以下を記述。

"post-install-cmd": [
        "chmod -R 755 bootstrap\/cache",
        "php artisan cache:clear"
    ]

で、migrateするには必要な情報がありますね。そうです、DBの接続情報です。localでは、だいたいenvファイルにDB_HOSTなんかの情報を指定していると思うけど、AppEngineの場合はそれらの環境変数app.yamlに記述する。

env_variables:
  # Put production environment variables here.
  # DB接続情報を追記
  DB_CONNECTION: mysql
  DB_HOST: localhost
  DB_PORT: 3306
  DB_DATABASE: GCPのsqlで作ったDB名
  DB_USERNAME: 作成時に作ったユーザー名
  DB_PASSWORD: 作成時に作ったパスワード名
  DB_SOCKET: /cloudsql/YOUR_STAGING_PROJECT_ID:asia-northeast1:YOUR_CLOUDSQL_INSTANCE_ID
beta_settings:
  cloud_sql_instances: YOUR_STAGING_PROJECT_ID:asia-northeast1:YOUR_CLOUDSQL_INSTANCE_ID

migrateする

AppEngine上ではphp artisan migrate実行できないようなので、ローカルからやるしかない・・・

データベース作成

migrateしようと思っても、データベースが存在しないなら意味がない。GCP上からデータベースを作成。 f:id:utr066:20190113053202p:plain

migrationをローカルから実行

ENVの値をCloudSqlを見にいくように書き換えてからphp artisan migrateを実行しよう。この時には、上の方で書いた接続コマンドは実行されている状態にしておくように。

DB_HOST=127.0.0.1
DB_PORT= PORT名
DB_DATABASE=DB名
DB_USERNAME=ユーザー名
DB_PASSWORD=パスワード

これでCloudSqlの方にもmigrateされたデータが入るはず。

GoでMysqlに接続してselect・update・deleteしようか

f:id:utr066:20181222184550p:plain

Goでmysqlに接続してみよう。

mysqlを使う

まあmysql使うことも多いと思うからmysqlに接続しよう。今回は、ローカルに入れたmysqlにgoで接続してごにょごにょしたい。mysqlを入れていない人は入れておこう。

brewで入れておきましょうか。homebrew以外で入れる方は頑張ってください。

$ brew install mysql
$ mysql -uroot

多分最初はpassword指定なしのrootで入れると思うから、接続の確認しておきましょう。接続できたらdatabaseとtableを作成して少しデータを入れておきます。Goからいじるためですね。

mysql>となったらそこで以下のコマンドを打ちます。

$ create database sample;
$ use sample;
$ create table users(id int, name varchar(10));
$ show tables;
// usersができていることを確認
$ insert into users (id, name) values (1, '太郎'), (2, 'hoge'), (3, 'fuga')
// とりあえず3人ほどuserを作ります
$ select * from users;
作られたか確認しましょう。

mysqlにデータが保存できたら準備完了です。このデータをGoでいじりましょう。

goでusersテーブルにアクセスする

go/src配下で適当なディレクトリを作ります。まあsampleとしておきましょう。

$ mkdir sample

作ったら配下にmain.goを作ります。

sample
.
└── main.go

このmain.goにDBに接続する処理を書いていきますか。

接続を確認する

まずは、DBに接続できるか確認しておきましょう。

import (
  "database/sql"
  _ "github.com/go-sql-driver/mysql"
  "log"
)

func main() {
  db, err := sql.Open("mysql", "root:@/sample")
  if err != nil {
    panic(err.Error())
  }
  defer db.Close()

  if err = db.Ping(); err != nil {
    log.Fatalf("接続が確認できなかったよ!やったね!!")
  }
}

接続できなかった場合、log.Fatalf内部の文が出力されるはずです。試しにsql.Openの引数で指定したデータベース名をSampleではなく別のものにしてみると、出力されるのがわかるのではないでしょうか。

usersテーブルからデータを取得しよう

次はさっき作ったusersテーブルから保存されているデータを取得したいです。

こちらに書いてあるコードを使わせていただきます。

dev.classmethod.jp

package main

import (
  "database/sql"
  "fmt"
  _ "github.com/go-sql-driver/mysql"
)

func main() {
  // DBへの接続
  db, err := sql.Open("mysql", "root:@/sample")
  if err != nil {
    panic(err.Error())
  }
  // 接続を閉じる
  defer db.Close()

  if err = db.Ping(); err != nil {
    log.Fatalf("接続が確認できなかったよ!やったね!!")
  }

  rows, err := db.Query("SELECT * FROM users")
  if err != nil {
    panic(err.Error())
  }

  for rows.Next() {
      var id int
      var name string
      if err := rows.Scan(&id, &name); err != nil {
          panic(err.Error())
      }
      fmt.Println(id)
      fmt.Println(name)
      // idとnameが表示されるはず。
  }
}

やっていることとしては、さっき作ったDBに接続して、SELECT * FROM usersした結果に対して処理を行なっている。その処理っていうのが、for rows.Next()の中身。取ってきたデータに対してrows.Scanしてidとnameを表示させている。

insertしよう

DBからデータを取得するだけでは物足りません。なので、Goでデータをusersテーブルに挿入してみましょう。 以下の文を追加して実行してみるとどうなるでしょう。

_, err = db.Exec("insert into users (id, name) values (4, 'ほげ')")
if err != nil {
    log.Fatalf("db.Exec(): %s\n", err)
}

実際にinsertされたかをみてみます。

mysql> select * from users;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 太郎   |
|    2 | hoge   |
|    3 | fuga   |
|    4 | ほげ   |
+------+--------+

idが4のuserが入っていますね。

deleteしよう

普通にExecの引数にsql書けばいけますね。

  _, err = db.Exec("delete from users where id=4")
    if err != nil {
        log.Fatalf("db.Exec(): %s\n", err)
    }

updateしよう

同様にですね。

_, err = db.Exec("update users set name = 'changed' where id=3")
if err != nil {
    log.Fatalf("db.Exec(): %s\n", err)
}
mysql> select * from users;
+------+---------+
| id   | name    |
+------+---------+
|    1 | 太郎    |
|    2 | hoge    |
|    3 | changed |
+------+---------+

prepare使ったほうがいいらしい

prepare使ったほうがいいらしいね。

dsas.blog.klab.org

ワードプレスのドメイン変更したらPVがガタ落ちした件について

f:id:utr066:20181222142628j:plain

数年前からワードプレスでサイトを運営しているんだけど、そのサイトのドメインを変えた。前々からドメイン名は失敗したなあと思っていたんですよね。 最初はドメイン名と同じサイトタイトルだったけど、どんどんサイトタイトルが変わっていきました。今後はサイトタイトルも変わらないだろうと思ったので、やっぱりドメイン名変えるか!と。 だが、ドメイン名はそう簡単に変えるもんじゃないらしい。今回はそんなことを書いていきたいと思う。

独自ドメインから別の独自ドメインに変更

ワードプレスエックスサーバーで運営しているんだけど、お名前.comで別のドメイン取って変えた。前のドメイン気に入らなくなってしまったんだよなあ・・・

軽くやったことを書いておこう。

ドメイン取得

ドメイン変更したくなったら、まずはドメインの取得ですよね。お名前.comで取ることが多いので今回もここから取得しました。取得したらエックスサーバーを使うので、設定の変更だったりをしたっけな。

ドメインをエックスサーバーで管理し、ワードプレスを入れる

取得したドメインを今回もエックスサーバーで使いたいので、ドメインをエックスサーバーに登録します。そしたら、そのドメインに対してワードプレスをインストール。これでこのドメインでもワードプレスが使えるようになる。

ドメインワードプレスにデータを入れる

ドメインワードプレスを入れたけど、何もデータがないので前のドメインで使用していたデータを入れます。前のドメインのサイトからpublic_html内をダウンロードし、必要なものを新ドメインワードプレスに入れる。これで新ドメインで前と同じように表示できればOK。

リダイレクト設定をする

前のドメインにアクセスがきたら、新ドメインに飛ばすようにリダイレクト設定をします。エックスサーバーに転送設定があったからそれを使ったけど、トップページはリダイレクトされなかったから.htaccessをちょっといじった。

ドメインアドセンスの審査をする

アドセンスは以前は追加のサイトは審査しなくてもよかったけど、今は審査する必要がある。ぶっちゃけ面倒ですね。しかも新サイトをアドセンス審査に出したら通過できなかった・・・なぜ落ちるんだ・・・落ちる理由が謎だったので、問い合わせのメールを送ったらちゃんと見てくれたらしくて広告を表示できるようになりました。

ドメインを変えた結果、PVが3分の1に減った

上記のような設定をして、大体1週間ぐらいたったけど、やはりPV数の減少が始まっている。まあネットでドメインを変更したらPVがどうなったかを検索すれば、「こんなに落ちたよ!」っていうのが結構出てくるけど、自分も例に漏れず急落した。大体3分の1ぐらいになったな、悲しい。

アドセンスもやべえよこれ

PV減るっていうことは、広告収入もやばくなりますよね。今までpv数ぐらいはアドセンスの収入あったけど、これがどうなるか今後楽しみです。

嗚呼、闇のドメイン変更よ

やはりこうなったか、という感じですね。ドメイン変更しなければこんなことにはなっていないけど、変更したくなっちゃったんだからしょうがないよね。PV減るのも収益減るのも悲しいけど、まあいっか。

新卒を一年で辞めてフリーランスエンジニアになったよ(半年のニート期間もあるよ)

正社員を辞めて常駐フリーランスエンジニア になった。まだなってほとんど時間も経っていないけど、今だからこそメモを残しておこうと思う。自分はほとんど経験がない状態で正社員を辞めたので、早々にフリーランスエンジニア になってみたい人にとっては、参考になるかもしれない。

この記事ではフリーランスエンジニア になった経緯などを書いていこうと思う。

新卒で入った会社を1年で辞める

自分はエンジニアとして新卒正社員になったんですが、そこを1年で辞めました。色々思うことはあったけど、なんというか勢いで辞めた感じがありますね。同期は元気にしているかな。

辞めてすぐにフリーランスになったわけじゃなくて半年間はニート「働きたくねええええ、うわあああああああ」と思ってたらニートになってました。 辞める直前は転職活動として他の企業に話を聞きに行ったりしていたんですけどね。でも、「また週5日のワークスタイルがまた始まるのか・・・」と思うとどうも気が進まない。途中でそんな活動も辞めちゃいました。

ニート生活が始まる

そして、ニート生活が始まります。確か会社を辞めた次の日に髪の毛をブリーチした気がします。エンジニアといえど、前働いていた企業は結構髪の色を気にしていたのでその反動ですかね。髪の毛はキシキシになりました。

あと、「会社を辞めたら解放感がもっとあるのかな」、と思ったけどほとんど無かった気がする。辞めた会社はホワイトだったし、まあ家でもパソコンはいじるしそこまでストレスは無かったのかもしれん。

ただ、東京の朝の満員電車から解放されたのは良い。あのストレスはやばい。満員電車のストレスは相当なものっていうのが調べると出てくるから色々調べてみると面白いですよ。企業もその辺り考えて時間ずらすとか朝はリモートとかなんかしてくれよな。

ニート期間中に何をしていたか

ニート期間は自由で誰に何を言われるでもない。朝起きたら、「さあ、今日は何をしようか」と考えるところから1日が始まる。この感覚結構いいですよ笑 余裕があります。

ニート中何をしていたかですが、まあベッドに横たわっていました。後は、ワードプレスで弱小メディアを運営していたりするので、記事を書いたり編集したり。プログラミングでいうと、その頃ReactをやりたかったのでReactを使ってチャットアプリケーションを作ったりなんてことをしていました。家にずっといるのも何なので、駅前のスタバやマックやエクセルシオールをローテーションしていた気がします。

お金がやばい

一人暮らしでニート生活をしていると、税金や健康保険料などの他に家賃や光熱費がかかってくる。ネットも使うから通信費もかかる、そして生きていくためには食費がかかる。全部を合計すると最低でも16,17万円ぐらいは毎月もっていかれるということだ。この金額を毎月払わなければいけないのはやっぱり結構きついです。何というかどんどん心が締められていくような感覚です。

最初のニート中は普通な気がしたけど、支払う毎に最後の方は「ああ、やべえはこれ・・・」となります。お金の余裕は心の余裕とは言うけど、そうかも知れんと実感しました。

働くための活動をする

お金もないので、「働くのだるいけど働くしかないか・・・」と考えるようになってきます。(働きたくないけどおおおおお)

でも、「正社員は面倒だし何かなあ」と感じていたから他の雇用形態を考える。エンジニアなら派遣やフリーランスといった働き方もありますからね。そして、フリーランスやってみよう!という考えに行き着きます。

新卒エンジニアを一年で辞めて半年間ニートのわいを取ってくれるところなんてあるのか・・・ということは思ったけど、まあ聞いてみないと分からないからとりあえず行動してみようか。という感じで案件を探そうと思いました。

フリーランスのエージェントに登録

フリーランスとして活動する人々のために企業とフリーランスを仲介してくれる業者がいます。大手なところだとレバテックフリーランス が有名ですかね。流れとしては、登録して自分の経験や希望言語・単価をエージェントの方に教えて案件を探してもらうといった感じです。

わいのスペック

案件を探し始めた時の自分のスペックを書いておきます。

  • 学生時代に某IT企業で約1年間インターンRailsを学ぶ
  • 某IT企業にエンジニアとして就職。PHPやGO等を学ぶ。そして1年で退職
  • そこから約半年間のニート生活

うーーーん、こんなんでフリーランスとか可能なのかよと書いていて思いました。半年間のニートってなんだよ・・・企業側絶対怪しむだろと。

案件はRubyで探す

エージェントの方に希望条件を聞かれますが、言語としてはRubyがいいかなーなんて思っていたので、Rubyでお願いします、ということを伝えました。でも自分の経験の単価の相場なんてわかりません。そこで「エージェントの方に相場ってどれぐらいですかね?」ということを聞いてみました。

すると、「この経験ですと35~40万ですかね」という返事。 「いや、低くね?」確かに経験ほとんどないけど、35かあ・・・。

ちょっと他のエージェントにも登録してみることにしました。

他のエージェントにも登録したけど、門前払い

自分の相場を見定めるために、レバテックフリーランス とポテパンフリーランスにも登録。希望言語を入力して「単価40以上で探してくれよ」、とメールしたらどちらも紹介できる案件がございませんといった結果になりました・・・おいおいまじかよ、やっぱりそうなんか、そううまくはいかねえかという感じです。現実は厳しいんや。

Midworksで案件を紹介してもらう

一番最初にMidworksに登録していたのですが、そこで案件を探してもらうことに。ただ、言語はRubyでということでお願いしていたけど、Goならあるみたいなことを言われました。Rubyはあかんかったらしい。きっとGoはまだそこまでやっている人がいないのだろう。

他にはPythonの案件も紹介してもらいました。紹介してもらった案件はGoとPythonの案件で、どちらも面談とやらを行ってGoの案件に参画です。

案件の単価は?

一番気になるのはここですよね。新卒一年で辞めて半年ニートした自分がいくらの案件を獲得したのか。GoとPythonの案件で提示された金額はどちらも単価40~50万円ぐらいです。

フリーランスに興味があれば、案件を探してみるのもいいかもしれない

自分みたいにほとんど経験がなくても、フリーランスに興味があるって言う人はいるんじゃないかなあと思います。そう言った場合はエージェントに登録してみるのもありかもしれないですよ。エージェントによっては、案件があったりなかったりする場合もあるだろうけどね。自分が登録して案件に参画したのはMidworksっていうところ。

【midworks】

担当者に当たり外れはあるだろうから、まあそこは祈るしかないよね。

Gin(Go)でAPIをRailsやLaravelライクに作る

APIを作るときにどのようなディレクトリ構成にするのかということも悩むものの一つでしょう。特にフレームワークを使わない場合、どんな構成で作っていくのかは結構考えるのではないでしょうか。

でもフレームワークを使う場合はどうでしょう。ある程度フレームワークの流れは決まっているので、それに沿って作る場合が多いんじゃないかと思います。

今回は、GOのGinというフレームワークを使って簡単なAPIを作ってみようかなと思います。その際、ビューのないMVCモデルのような感じでやってみようかなーと思う、イメージはRailsやLaravelのような感じです。GOをわからない人が見てもあーRailsの流れと同じね、みたいな感じになればいいと思う。

続きを読む