- 投稿日:2019-12-01T20:39:22+09:00
Web開発勉強のためWordpressでポートフォリオサイトを開設するまで①
Web開発を勉強するにあたり、まずは独学で下記のサイト・サービスを利用してみました。
・Progate
https://prog-8.com/
→言語の違いについては学べたが、もう少し難しいほうがいいと思いやめる。・Ruby on Rails チュートリアル
https://railstutorial.jp/
→Rubyのバージョンの違いなど細かな違いのせいか、同様のコマンドを入力してもエラーが頻発。
いろいろ調べて解決するも、肝心のHerokuデプロイがどうしてもうまくいかず挫折。あとは海外のサイトなので忘れましたが、言語別にFizzbuzzやらアルゴリズムを解くサイトを覗いて、アルゴリズムがわかっても初心者にすぐ実装できるスキルなぞあるはずもなく挫折。
ここまでで1か月ぐらいは消費したと思います。
その後、2か月ぐらいQiitaを眺めて興味ありそうなワードはネットで調べて、みたいなことを繰り返してました。
ムダに知識だけが増えていって、典型的な「わかる」けど「できない」使えない人間への道を歩んでいますwさすがに手を動かさないとマズいかなーと思い、かといって上記のように独学でやるのはムリかなと判断し、Udemyのオンライン講座に課金することを決意しました。
https://www.udemy.com/mobile/ipad/Web開発はWordpressやらrubyやらはオワコンで、時代はDjangoやらNode.jsだ!と3か月に渡るネットサーフィンで得た知識を参考に講座を探したんですが、あんまりよさげな講座(初心者がすぐにサイト公開できそうな講座)がなかったので、ノウハウが蓄積されてるであろうWordpress、rubyの講座を購入しました。
前置きが長くなりましたが、次回からはWordpressを使った講座のなかで詰まったところや、解決した方法について記事を書いていきたいと思います。
- 投稿日:2019-12-01T18:09:04+09:00
Node.js & Express & MySQL & React でTODOリスト API編
目的
ReactでTODOアプリを作成したことはありますが、自分でAPIを書いたことがなかったので書いてみました。
Web企業未経験なので、間違いなどありましたらご指摘いただけると助かります!APIを書くまえに
まずは簡単にNode.jsとReactの勉強をUdemyで行いました。
Linkは下記になります。【フロントエンドエンジニアのための React ・ Redux アプリケーション開発入門】
https://www.udemy.com/course/react-application-development/【Node.js速習講座 Part1 <導入&基礎編>】
https://www.udemy.com/course/nodejs-part1/【Node.js速習講座 Part1 】
https://www.udemy.com/course/nodejs-part2-express/データベースとテーブルの準備
まずはじめにMySQLで必要なテーブルを準備します。
$ sudo service mysqld status $ mysql -u root mysql> create database todo_api; mysql> use todo_api; mysql> create table todo_list(id int auto_increment, name varchar(255), isDone boolean, index(id)); mysql> insert into todo_list(name, isDone) values('todo sample', true); mysql> exitname : やることを保存
isDone : todoが完了しているか(true / false)これでテーブルの準備は完了です。
AUTO_INCREMENTを使用する際はindexを作成する必要がある点にご注意ください。Node.jsで実際に処理を書いていく
ここからがいよいよAPIを書いていきます。
まずは、必要なnpmパッケージをインストールしましょう。
# 作成したディレクトリ内で $ npm init $ npm install express --save $ npm install body-parser --save $ npm install mysql --savebody-parserを使用することで、データの取得が容易になります。
後ほど使用します。まずは、定型文的な処理を書いていきます。
index.jsconst express = require("express") const app = express() const bodyParser = require("body-parser"); const mysql = require("mysql") app.use(bodyParser.urlencoded({ extended: true })); # *******は、ご自身のパスワード const connection = mysql.createConnection({ host: 'localhost', user: 'root', password: '*******', database: 'todo_api' }) connection.connect(); const port = process.removeListener.PORT || 3000; app.listen(port)ここからMethotごとの処理を記述していきます。
まずはgetからindex.jsapp.get('/api/v1', (req, res) => { connection.query('select * from todo_list', (error, results, fields) => { if (error) { console.log(error) } res.send(results) }) }) app.get('/api/v1/:id', (req, res) => { connection.query("select * from todo_list where id = ?", req.params.id, (error, result, fields) => { if (error) { console.log(error) } res.send(result) }) })select * from todo_list where id = ?", req.params.id はSQLインジェクション対策です。
select * from todo_list where id = ${req.params.id}" は危険です。
他は簡単ですね。続いてPOST
index.jsapp.post('/api/v1', (req, res) => { let todo = { name: req.body.name, isDone : req.body.isDone } connection.query("insert into todo_list(name, isDone) values(?, ?)", [todo.name, todo.isDone], (error, results, fields) => { if (error) { console.log(error) } res.send(todo) }) })body-parserを使用することによって、req.body.nameのように書くことでデータを取得することができます。
ただ、APIとして使用する際にtodoというオブジェクトが必要なのかどうかは自分はまだよくわかっていないので、
もしかしたら消すかもしれません(笑)続いてPUT
index.jsapp.put('/api/v1/:id', (req, res) => { connection.query(`select * from todo_list`, (error, results, fields) => { connection.query("update todo_list set name = ?, isDone = ? where id = ?", [req.body.name, req.body.isDone, req.params.id], (error, result, fields) => { if (error) { console.log(error) } res.send(result) }) }) })update todo_list set name = ?, isDone = ? where id = ?,[req.body.name, req.body.isDone, req.params.id]は、
? は複数個になった場合は引数に配列で値を配置します。
配置する値がフィールドの場合は ?? とします。書き方はとんでもなく汚いような気がします。。。。。
何か他の方法があれば教えていただきたいです(切実)
やっていることは、POSTの処理のSQL文をUPDATEにしただけです。
簡単ですね。最後にDELETE
index.jsapp.delete('/api/v1/:id', (req, res) => { connection.query(`select * from todo_list`, (error, results, fields) => { connection.query("delete from todo_list where id = ?", req.params.id, (error, result, fields) => { if (error) { console.log(error) } res.send(result) }) }) })特に解説する部分はありません。
Postmanでテスト
APIを作成する際はPostmanが便利です。
Link https://www.getpostman.com/試しにGETを送信すると、こんな感じでJSON形式でデータが返ってきます。
いい感じですね。
終わり
これでとりあえずAPIは終了です。
昨日Nodeの勉強を始めたばかりなので、書き方が間違えている部分はお許しください(笑)今後はAPIをHerokuにデプロイして、それを使用してReactでTODOリストの作成をします。
強強エンジニアの方、ぜひ間違えている部分を個人的にでもコメントにでも良いので教えていただきたいです。
- 投稿日:2019-12-01T13:08:26+09:00
MySQLに対応したogr2ogr(GDAL)をインストールする方法まとめ
※本記事はRDBMS-GIS Advent Calendar 2019の1日目の記事です。
はじめに
現時点(2019/12/1)では、MySQLにシェープファイルをインポートするにはogr2ogrというGDALというライブラリに含まれるコマンドラインツールを利用するのが一般的です。
ただ、GDALをインストールする方法がいくつか存在するため、慣れていないと「どれを使うのが良いの?」と戸惑います。本記事は「これからogr2ogrを使ってMySQLにシェープファイルをインポートしたい」という人用におすすめの方法をまとめておきます。
PostGIS使いもシェープファイル以外のファイルをシェープファイルに変換する際等にogr2ogrを使えるので有用かもしれません。
GDALインストール方法の選基準は下記です。
- MySQLドライバが有効な状態でビルドされていること。
- MySQLのインポートに必要であるため。
- 最新(に近い)ソースでビルドされていること。
- MySQLドライバの開発スピードが早いため。(古いと致命的なバグもある)
ogr2ogrを使ったシェープファイルのインポートについては本記事ではあまり説明しません。本記事ではあくまでGDALのインストール方法について解説します。
ogr2ogrを使ったMySQLへのシェープファイルのインポート方法については下記記事を参照して下さい。
https://qiita.com/miyauchi/items/c8349e1e6339bdf26a20
結論
公式で配布されてるDockerイメージ使うのが最も手っ取り早いです。
https://github.com/OSGeo/gdal/tree/master/gdal/docker
ただ、ogr2ogrのためだけににDockerを使うのはオーバーヘッドが大きすぎるのも事実です。
ので、各プラットフォーム毎でいえば下記もおすすめです。
- Windows
- OSGeo4W
- GISInternals
- Linux
- ソースからコンパイル
以降はそれぞれの方法についての解説です。
Dockerイメージを使う(Windows/Mac/Linux共通)
Dockerエンジンのインストールや使い方については省略します。
GDALのDockerイメージは下記で配布されています。
https://github.com/OSGeo/gdal/tree/master/gdal/docker
まずはイメージを準備しましょう。いくつかイメージが用意されていますが、使うのは
osgeo/gdal:ubuntu-full-latest
である点に注意して下さい。(MySQLドライバが含まれるため)$ docker pull osgeo/gdal:ubuntu-full-latestコンテナを起動します。ここではホストの/home/ディレクトリをマウントしています。
$ docker run -v /home:/home -it --rm osgeo/gdal:ubuntu-full-latestコンテナに入ったら、こんな感じでシェープファイルの文字コードを変換したり、MySQLにインポートしたりできます。
root@43dd82bfeb90:/# cd [シェープファイルが格納されたディレクトリ] root@43dd82bfeb90:/# ogr2ogr -f "ESRI Shapefile" -lco ENCODING=UTF-8 -oo ENCODING=CP932 [変換後のシェープファイル名] [変換前のシェープファイル名] root@43dd82bfeb90:/# ogr2ogr -f "MySQL" "MySQL:[MySQLのデータベース名],host=[MySQLのホスト名],user=[MySQLのユーザ名],password=[MySQLのパスワード]" [変換後のシェープファイル名]Windows
Windowsの場合はOSGeo4WやGISInternalsで配布されているインストーラを使うのがお手軽です。
OSGeo4Wを使う場合は、インストールするGDALのバージョンが選択できるので、最新版を選ぶと良いでしょう。
どちらもMySQLドライバが有効な状態でビルドされているようです。
- OSGeo4W
- GISInternals
Linux
ソースからのコンパイルについてはこちらの記事で紹介しています。MySQLを有効にするのを忘れないようにしましょう。
https://qiita.com/miyauchi/items/c8349e1e6339bdf26a20
OSのパッケージリポジトリに登録されているGDALを使うと、本記事執筆時点ではバージョンが古かったりMySQLドライバが有効でなかったりするのでおすすめしません。
Mac
未調査です。私はDockerを使っています。
まとめ
shp2mysqlみたいなコマンドが早くできたら、わざわざこんな面倒な作業しなくて済むんですけどね。
という機能追加リクエストも出ているので「Affects me」すると優先順位が上がるかもしれないのでおすすめです。
- 投稿日:2019-12-01T00:06:57+09:00
redashでMySQL自体の見える化
背景
- システム系の情報表示はMackerelで事足りるのですが、もう少し細かいDBの値をちらっと見るためにMySQL自体の統計表示をしてみました。
- とはいってもデータ系で数字が出る指標は少ないのでこの程度です。これは、誰でもすぐに真似して使える指標だと思います!
実行例
上記のダッシュボードのクエリーは超単純です。いつも見慣れたMySQLの統計情報を出すだけです。
show table status;InnoDB関連はこちら
SELECT (sum(database_pages)/sum(pool_size)) *100 AS used, sum(pool_size), sum(free_buffers), sum(database_pages) FROM information_schema.INNODB_BUFFER_POOL_STATSまとめ
- 手っ取り早くMySQLのレイヤー高めの情報を可視化しました。
- 参考