Somurie Engineer's Blog

MySQLで全てのテーブルからキーワード検索する

はじめに 最近仕事させて頂いている現場でER図が存在せず、foreign key設定もされておらず、DB構成の理解に時間がかかりました。 画面上で入力した値がどこに設定されているかすぐ検索するためにDB内の全検索プログラムが見当たらなかったので作りました。(MySQL8.0動作確認済) カーソルの使用経験があまりなかったのでちょうど良い題材でした。 データベースから全検索 drop procedure if exists searchValueInAllTables; delimiter // create procedure searchValueInAllTables(IN table_schima_name varchar(255), IN keyword varchar(255)) begin declare v_table varchar(255); declare v_column varchar(255); declare done int default 0; declare cur cursor for select table_name, column_name from information_schema.columns where TABLE_SCHEMA=table_schima_name; declare continue handler for sqlstate '02000' set done=1; -- SQLSTATE 値 '02000' で「データなし」状況時にhandleし、done=1を設定する。その後のアクション「継続」をcontinueで指定 set @keyword = keyword; drop table if exists WORK_DATA; create temporary table WORK_DATA( -- temporaryを付けると一時テーブルとして作成できる。セッションを抜けると自動でDropされる table_name varchar(255), column_name varchar(255), hit_count int ); open cur; repeat fetch cur into v_table, v_column; if not done then set @sql_search=CONCAT('SELECT COUNT(*) INTO @cnt FROM ' , v_table, ' WHERE ', v_column, ' LIKE ?

SSLサーバ証明書の動きを整理してみた

はじめに SSLサーバ証明書の動きがいまいち理解できていなかったため整理した。 認識誤りがあればコメント頂けると助かります。 証明書の用途 主にウェブサイト運営団体の電子的な身分証明書として使用する。SSL通信を実現する。 主要キーワードと役割 ルート証明書 ルート認証局(ルートCA)が発行する証明書。Webサーバが公開している公開鍵が本当に該当のWebサーバのものか証明する。 Webサーバ クライアントとHTTPSで通信したい。秘密鍵と公開鍵を持つ クライアント Webサーバにアクセスする側。WebサーバとHTTPSで通信したい。ルート証明書を事前にインストールしている SSL通信までの動き 事前手続き クライアントにルート証明書を設定 mkcertを使い、ルート証明書の生成、インストール、ルート証明書を使ったWebサーバ証明書への署名をまとめて行う (通常はルート証明書が既にクライアントに設定されている) (通常はWebサーバ管理者が依頼し、ルート認証局がWebサーバのデジタル証明書に署名を行う) Webサーバへの公開鍵・秘密鍵の登録 mkcertで作成された秘密鍵、公開鍵をWebサーバに登録する Webサーバのサーバ証明書を取得 クライアント->Webサーバ HTTPSリクエストを発行 クライアント<-Webサーバ Webサーバのサーバ証明書を送付 サーバ証明書の認証 クライアント ルート証明書の公開鍵からWebサーバのサーバ証明書についた署名(ハッシュ値)を復号する クライアント 受信データをハッシュ関数を用いてハッシュ値を求める クライアント 上記2点のハッシュ値が一致すればWebサーバの公開鍵(デジタル証明書)が正しいと判断する 共通鍵の交換 クライアント Webサーバの公開鍵を使ってプレマスターシークレットを暗号化 Webサーバ Webサーバの秘密鍵を使ってプレマスタシークレットを復号化 クライアント・Webサーバ お互いにプレマスタシークレットから共通鍵を生成 補足 CRL 認証局から一定周期で発行され、クライアント側からLDAP、HTTP、FTPなどで取得する CRLには次回CRL発行タイミング(クライアントからの次アクセス時間)が記載されている  (mkcertではこれがかなり先の日付?) 証明書に含まれる情報 公開鍵の情報 コモンネーム 公開鍵の所有者情報 所有者を証明した認証局の情報 証明書の有効期限 証明書のシリアル番号 証明書の失効リスト参照先 詳細は こちら参照

Docker+Railsコンテナ構築時のUnknown MySQL server host ‘mysql’エラー

Docker+Railsコンテナ構築時にUnknown MySQL server host ‘mysql’エラーが発生してなかなか解決しなかったので備忘として解決までの流れを記載する。 Contents 1 環境 2 解決までに試したこと 3 解決方法 4 まとめ 環境 今回は以下環境にて開発を行った。 MacOS Mojave 10.14.3 Docker 18.09.1 Ruby 2.5.3 Rails 5.2.2 MySQL 5.7.10 解決までに試したこと docker-composeでappとdb(両方サービス名)のリンク・リンク名の見直し。(以下URL参照) https://qiita.com/merochiyo/items/14dde59e960c0b35d8a0 dbのコンテナが立ってからappが起動及びdb:createすること。 http://otiai10.hatenablog.com/entry/2016/02/04/160515 解決方法 明確な原因はわからなかったのですが、以下コマンドを使うことで解決しました。恐らくですが、Dockerの古いイメージが残ってしまい、そちらを参照し続けてしまったことなどが原因かと思います。(直前にMySQLのバージョンを8に変更し、認証プラグインがcaching_sha2_passwordになってエラーになり、バージョンを5.7.10に戻したりしていたので、その際のキャッシュなどを使っていたのかなと推測) 以下コマンドでは、可動していないものも含め全てのDockerイメージを削除します。 $ docker stop $(docker ps -q) $ docker rm $(docker ps -aq) $ docker rmi $(docker images -q) まとめ Dockerがどうやってもうまく動かない時は可動しているイメージを削除するだけでなく古いイメージを削

Git使い方まとめ(随時更新)

はじめに Gitの使い方で検索することが多いため、大まかな流れを記録する。 GitHubを一人で使用する前提として記載するため注意。 GitHubへの接続設定(GitHub初回接続時のみ) GitHubへのアップロード時のユーザー設定を以下の通り修正する。 git config --global user.name "somuriengineer" git config --global user.email "somuriengineer@gmail.com" ローカル資源をGitHubにアップロードする手順 GitHub上で空リポジトリを作成 GitHub上のリポジトリがない場合は こちらを参考に作成します。 ローカルリポジトリの作成(初期化) 以下コマンドにより「.git」ディレクトリが作成される。同ディレクトリはリポジトリ構成を表す。 以下コマンドで作成したディレクトリをリポジトリ管理するための準備ができた状態になります。 cd {プロジェクトのリポジトリ} git init コミット対象資源の整理(ステージングエリアへの配備) 以下コマンドによりローカルリポジトリに資源をコミットします。 git addコマンドにより対象資源が作業ディレクトリからステージングエリアに置かれます。 vi .gitignore # *.logなど、リポジトリ管理対象外の資源を記載する echo ".DS_Store" .gitignore git add . # 対象資源を制限する場合は 「.」以外で設定 ローカルリポジトリへの配備(コミット) ステージングエリアに置かれた資源は後述のcommitコマンドによりローカルリポジトリに格納されます。 git commit -m "Initial Commit" # 2回目以降は -a オプションも付けることで、既知のファイル変更を全てコミットする。(-aは--all、-mは--message=の略) コミットコメントが沢山ある場合は -mオプションを付けないでgit commitのみコマンドを入力します。エディタが開くため、1行目に要約、2行目空行、3行目以降に詳細な内容を記載します。 ## リモートリポジトリへプッシュ 以下コマンドによりoriginという名前でリモートリポジトリ(今回はGitHubのリポジトリ)を追加します。 2行目によりリモートリポジトリが何か確認できます。なお、削除は「git remote rm origin」です。 $ git remote add origin https://github.

IntelliJ+SpringBoot環境構築手順まとめ

はじめに Mac上にIntelliJ+SpringBoot環境を整えたため、手順をまとめました。 環境 MacOS Mojave 10.14.1 Homebrew 1.9.3-14-g2cc5086 IntelliJ IDEA 2018.3.3 java se 11.0.2 gradle 5.1.1 作業日 2019/1/29 Gradleのインストール SpringBootの環境セットアップにはGradleが必要になるため、事前にGradleをインストールします。 GradleのインストールはHomebrewを使用するため、以下コマンドのみ実行でOKです $ brew install gradle SpringBootのインストール 以下の公式サイトを参考にインストールしました。 https://spring.io/guides/gs/intellij-idea/ SpringBoot雛形の取得 以下コマンドにてSpringBootの雛形ソースを取得します。取り込む雛形はrestサンプルなど色々あるので好みに応じて変更してください。 $ git clone https://github.com/spring-guides/gs-spring-boot.git 取得したソースを解答し、complete/gradle/wrapper/gradle-wrapper.propertiesのgradleバージョンを以下の通り5.1.1に変更します。(修正前のバージョンが4.*でありはjava11.0.2に対応していなかったため) distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-bin.zip IntelliJの起動 IntelliJにてプロジェクトをインポートします。公式サイト通りcomplete/build.gradleを起動します。 IntelliJ起動後はRunを実行し、localhost:8080にアクセスすると、「Greetings from Spring Boot!」の文字が表示されます。

Vagrant+VirtualBox設定

はじめに Mac上にVagrant+VirtualBox環境を構築する手順をまとめた。 環境 MacOS Mojave 10.14.1 Homebrew 1.9.3 Vagrant 2.2.3 VirtualBox 6.0.2 前提 事前に以下をインストールしてください。 Homebrew Homebrew Cask Vagrantのインストール Vagrant(ベイグラント)とは VagrantはVirtualBoxなどの仮想マシンを管理するCUIツールです。 ChefやAnsibleといった構成管理ツールと組み合わせることでどこでも同じ仮想マシンを開発に参画する方々の端末に再現することができます。 設定ファイルであるvagrantfileにCentOSといったOS、nginxなどのサーバ、phpやphpMyAdminといったアプリケーションなどを記載すると環境構築及び環境の再現ができます。 インストール Homebrew-Caskを使ってインストールします。以下コマンドを入力してください。 $ brew cask install vagrant Boxの追加 Boxは仮想マシン作成に必要なOSのディスクイメージ等が入ったものです。 以下URLからインストールしたいOSを選択します。今回はCentOS 7.2 x64をインストールします。 http://www.vagrantbox.es/ $ vagrant box add centos72 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box $ mkdir centos72 $ cd centos72 $ vagrant init centos72 すると、Vagrantfileというものが作成されるので以下1行を追加します。public_networkにするとホスト端末だけでなく他の端末からもアクセスできます。 Vagrant.configure("2") do |config| config.vm.box = "centos72" config.vm.network "public_network", ip: "192.168.0.20", bridge: "en0: Wi-Fi (Wireless)"

Mac Mojave上へのJava11開発環境構築方法

はじめに Mac上にJava環境を整えたため、手順を残しておく。 環境 MacOS Mojave 10.14.1 Homebrew 1.9.3-14-g2cc5086 IntelliJ 2018.3.3 java se 11.0.2 作業日 2019/1/26 手順 homebrew-caskのインストール Homebrewはターミナルで使用するrbenvやnodebrewなどをインストールするパッケージマネージャですが、CaskではGUIアプリもインストールできます。 Caskをインストールするために以下コマンドを打ちます。 $ brew tap caskroom/cask IntelliJのインストール Caskを使用して、以下コマンドを実行します。(ceはコミュニケーションエディションです) $ brew cask install intellij-idea-ce Javaのインストール Caskを使用して、以下コマンドを実行します。自動的に最新版(2019/1/26時点ではjava11がインストールされます。 $ brew cask install java 参考までに、以下バージョンがインストールされました。 $ java -version openjdk version "11.0.2" 2019-01-15 OpenJDK Runtime Environment 18.9 (build 11.0.2+9) OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode) その他 以下コマンドでhomebrew-caskでインストールしたアプリケーションが一覧で確認できます。今回はIntelliJとjavaの2つをインストールしました。 $ brew cask list intellij-idea-ce java

Pythonスクレイピング

はじめに Pythonによるスクレイピングの情報を以下にまとめる。 環境 MacOS Mojave 10.14.1 Homebrew 1.8.4(インストール済み Rubyインストールの記事参照) pyenv Python 3.7.1 selenium 3.141.0 記載開始日 2018/12/11 スクレイピング方法 Pythonでは以下の選択肢がある。 Requesstライブラリを用いたHTTPプロトコルによる操作。 Selenium+WebDriverを用いたブラウザ操作(RESTfulAPIを用いてブラウザ操作をする)WebDriverには以下のような選択肢がある。ChromeDriverが無難。 ChromeDriver。Chromeを操作できる PhantomJSライブラリ。こちらはブラウザを立ち上げない。Seleniumで使用するのは現在非推奨(PhantomJSはWebKit(レンダリングエンジン)ベースのブラウザ。WebkitはApple主導でSafariなどに使用されている) 上記以外のライブラリもあり。詳細はこちらを参照 ChromeDriver 今回はこちらを選択。選定理由はセッション管理が容易な点と画面操作によりファイルをダウンロードが容易な点。 ChromeDriverをダウンロードし、パスを通せば使えるようになる。使い方の詳細はこちら ファイル保存のサンプルはこちら。 DOM要素コントロールはこちら。 Parser HTMLのParserは3つある。 こちらが参考になる。 以下のような形でパースする。最もメジャーものはBeautifulSoup。 ※パースは「HTML文法に基づき意味や構造を解釈すること soup = BeautifulSoup(res.text, "html.parser") BeautifulSoup PythonのParserとしてよく使用されるHTML構文解析ライブラリ。ChromeDriverにより画面を操作した後、要素抽出などで使用する。 使い方についてはこちらの説明がわかりやすかった。 リファレンスはこちら→http://kondou.com/BS4/ BeautifulSoupだと画面操作はできないので、画面操作はDriver、要素の取得等はBeautifulSoupといった形で使い分けが必要。 XPathの確認方法 XPathの取得はChromeのデベロッパーツールが便利。手順は以下の通り。 Chromeで対象のWebサイトを開き、エレメントを右クリック→検証 デベロッパーツールが開くので該当要素を右クリック→Copy→Copy XPath クリップボードにコピーされるため、貼り付ければOKです 参考 requests: HTTPライブラリ。今回はRequest送信やSession維持に使用 BeautifulSoup: HTML構文解析のライブラリ。

NodeJSのインストール

はじめに Mac上にNodeJS環境を整えたため、手順を残しておく。 環境 MacOS Mojave 10.14.1 Homebrew 1.8.4 rbenv 1.1.1 NodeJS 10.14.1 作業日 2018/12/11 手順 brewコマンドでNodeJSのバージョンを管理するnodebrewをインストールする。プロジェクト毎にNodeJSのバージョンが違う場合などに役立ちます。今後のために必ず入れましょう。以下コマンドで成功するとビールのアイコンが表示されます。 $ brew install nodebrew インストール可能なバージョンを確認します。以下コマンドの結果を見てインストールバージョンを決めます。今回は [こちら][1]のサイトより安定版であるv10.14.1をインストールします。 $ nodebrew ls-remote 以下の通りbash_profileに書き込む。 $ echo export PATH=$HOME/.nodebrew/current/bin:$PATH ~/.bash_profile $ source ~/.bash_profile 以下、1行目を実行しないと2行目でエラーになるので注意。1行目のコマンドにより必要なフォルダを作成するようです。 $ nodebrew setup $ nodebrew install-binary v10.14.1 以下1行目の実行結果として「current: none 」が表示される。現状のバージョンはnone(指定されていない)であるため、2行目でcurrentバージョンを指定する。 $ nodebrew list $ nodebrew use v10.14.1 # バージョンを指定する npmが使えるようになる。 $ npm -v # 今回は出力結果として6,.4.1のバージョンが表示された phantomjsのインストール。2行目はインストールされたかの確認。 $ npm install -g phantomjs $ phantomjs -v # 今回は出力結果として2.

Python環境の構築(MacOS Mojave)

はじめに Mac上にPython環境を整えたため、手順を残しておく。 環境 MacOS Mojave 10.14.1 Homebrew 1.8.4(インストール済み。 Rubyインストールの記事参照) pyenv Python 3.7.1 作業日 2018/12/6 手順 Pythonのバージョン切り替えツールであるpyenvをインストールする。 $ brew install pyenv pyenvのパスを通す(最後のsourceコマンドはbash_profileの適用) $ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile $ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile $ source ~/.bash_profile Pythonのインストール。–listで一覧を確認し、インストールしたいバージョンを指定する $ pyenv install --list $ pyenv install 3.7.1 ちなみに著者は上記installコマンドでzipimport.ZipImportError: can’t decompress data; zlib not availableのエラーが発生しました。 以下サイトにより、xcode-selectの最新バージョンにMojave用のmacOS SDK headerがデフォルトで入っていないのが原因とのことです。 参考サイト

Ruby環境の構築(MacOS Mojave)

はじめに Mac上にruby環境を整えたため、手順を残しておく。 環境 MacOS Mojave 10.14.1 Homebrew 1.8.4 rbenv 1.1.1 gem 2.7.6 bundle 1.17.1 ruby 2.5.3 作業日 2018/12/1 手順 Homebrewのインストール。HomebrewはMacOS上のパッケージ管理ソフトウェアです。2行目は正常にインストールされたかの確認です。 (brew -vでも可) $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" $ brew doctor rbenvを最新版に更新する。 $ brew upgrade rbenv ruby-build 動作確認兼異インストールできるrubyバージョンを確認。2018/12/1時点では2.5.3が最新安定版であるため、2.5.3をインストールする。 $ rbenv install --list rbenvでrubyをインストールする。 $ rbenv install 2.5.3 インストールしたバージョンのrubyを使うよう、設定を切り替え。(下記は環境全体。globalではなくlocalオプションを使うとプロジェクト限定が可能) $ rbenv global 2.5.3` 反映されたかの確認。2.5.3の左側に*がついていればOK。 $ rbenv versions 新たにインストールしたrubyにgemをインストール。(rubyのバージョンごとにgemのインストールが必要)。 $ gem install bundler 新たにインストールしたbundlerの実行ファイルに対してrubyの実行フォルダから参照する際のシンボリックリンクをリフレッシュ

FireAlpacaを使用した年賀状作成

当記事の目的 FireAlpacaを使用して年賀状を作成したため、来年度困らないように年賀状作成時に使った作業を記録する。 (自分用メモです) FireAlpacaのショートカットキー 主に写真加工方法のみ。あとは文字を貼っただけで最低限の形になった。(とりあえず以下の手順で画像切り貼り、文字書き込みできるためある程度形になる) – JPG画像のサイズ変更・加工は、JPGを貼り付け、範囲指定して切り取りが一番楽(ハガキサイズより大きいキャンパスを別途用意する) – 全体を使いたい場合は、上部メニュー > 編集 > キャンパスサイズ… – サイズを小さくして使いたい場合は、上部メニュー > 編集 > 解像度変更 – 画像の一部を切り取りたい場合は、範囲指定した後、上部メニュー > 編集 > トリミング – 画像のサイズ変更をしたい場合は、Command+T(上部メニュー > 選択範囲 > 変形 所感 FireAlpacaは慣れたら早いんだろうけど、初めての操作では悩むことが多い あまり直感的ではなく、初心者に厳しい 次回はフォントをもう少し凝りたい

AWSでEC2+WordPressブログを開設する方法

ブログ作成の背景 フリーランスになりアウトプットの機会が少なくなることを懸念し、ブログ開設をすることにした。 システム構成 構成は以下の通り。特筆すべき点はないです。 サーバ: AWS無料お試し1年分(1年後にAWS lightsailに移行予定) ドメイン: ムームードメイン CMS: WordPress(使ってみたかった。AWS MarketPlaceのものを使用) レンタルサーバの選択 レンタルサーバには料金・性能面等考慮する点が多々ありますが、以下3点で検討し、AWS無料利用枠を選択しました。選択理由としては無料なのはもちろんですが、データ移行等経験してみたいためです。 AWS無料利用枠 AWS lightsail ロリポップ AWS EC2の作成 AWS MarketPlaceにWordPressが用意されているため、EC2インスタンス生成と同時にWordPressのインストールも行うことができる。 AWSのこちらのサイトを参照。 ドメインの取得 格安のドメインで良かったが、.comもあまり高くはなかったため(1480円/年)、.comで検討しました。 お名前.comで契約直前まで行ったが「Whois情報公開代理サービス」との文言に引っかかり調べてみると、Wikipediaには以下の通り記載がありました。 Whoisとは〜WHOIS(フーイズ)とは、インターネット上でのドメイン名・IPアドレス・Autonomous System (AS) 番号の所有者を検索するためのプロトコルである。 システム管理者が、自分の管理下にないIPアドレスやドメイン名の管理者と連絡をとるための、いわば電話帳のような役割を果たすことを目的として始まった。 要するに、ドメイン名から個人情報がある程度特定できてしまうとのこと。 お名前.comでは通常時は登録した個人情報がWhoisサービスに登録されてしまうようで、「登録した個人情報」ではなく「ドメイン契約会社の情報」をWhoisに登録してくれるムームードメインを選択しました。 上記についてはこちらのサイトにわかりやすく記載あり。 DNSの設定 名前解決についてはムームードメインのネームサーバを使用。AWS Route53を使用したかったが無料利用対象外でした・・・無念。 以下サイトの通りの手順で特に問題なく関連付けできます。 こちらのサイトを参照 まとめ AWSの操作が初だったので全体像等調べて事前調査に時間がかかったものの使い始めるとやはり簡単!一度覚えたらかなり作業時間楽ですね(慣れたらEC2立ててWordPressのデフォルトページ表示まで5分でも可能) Whois情報で開示される情報には注意。(どこまで公開されてしまうかは不明ですが) 個人でドメイン取得(.com)する場合はムームードメインが無難 今後の予定 技術面でかなり遅れをとっているので適宜情報収集し、まとめていきたいと思っています。とりあえずはブログ基盤を安定的に運用していこうと思います。 – AWS使用状況の監視 – アフェリエイト(Google AdSenseが有力)の設定 – WordPressで簡単に投稿できるようにカスタマイズ – 1年後にデータ移行