- 投稿日:2020-04-01T23:32:24+09:00
テーブルを作成するSQL文
今回は、ターミナルでテーブルを作成していきたいと思います!
どういう風に作成するのか、以下のSQL文を見てみましょう^^
CREATE TABLE テーブル名 (カラム名 カラム名の型, ……);Railsでテーブルを作成するときは、
rails g model モデル名
でテーブルに紐付けるモデルを作成
して、その時に作成されたマイグレーションファイルをrake db:migrate
で実行!という順序でやってきましたこの
rake db:migrate
が実行される裏では、このCREATE TABLE
というSQL文が動いていたのです!それでは、実際にテーブルを作成していきましょう!
と、その前にMySQLでの数字型や文字列型の定義方法を確認しておきましょう^^Railsでは、数字を入れる型には"Integer"、文字列を入れる型には"String"が使われていました
MySQLではそれらを以下のように定義します
型名 保存できる値 INT 数字 VARCHAR(M) 最大M文字の文字列 これらを使い、"INT"型のカラム"id"と、"VARCHAR(250)"型のカラム"subject"のある"lessons"テーブルを作成してみましょう!
CREATE TABLE lessons (id INT, subject VARCHAR(250));以下のように表示されれば、SQLは正しく実行されています^^
mysql> create table lessons (id int, subject varchar(250)); Query OK, 0 rows affected (0.17 sec) mysql>下の画像のように、
SHOW TABLES;
で"lessons"テーブルが確認できれば、テーブルが正しく作成れたことが確認できます!
本日はここまで!お疲れ様でした^^
- 投稿日:2020-04-01T22:45:03+09:00
carrierwave+rails6でTypeError (no implicit conversion of nil into String)エラーが発生したときの対処方法
執筆背景
carrierwave+rails6で画像と音声の複数アップロード機能を実装して試しに動作チェックしたところ、no implicit conversion of nil into Stringエラーが発生し、アップロードできなくなる事案が発生した。
今回はこれについての対処方法について執筆していきたいと思う。
なお、今回使用しているrailsのバージョンは6.0.2.2です。結論
このエラーは、アップローダーのfilenameメソッドが正しく機能しないときに起こるエラーです。
filenameメソッドが正しく機能しない原因としては、・ ファイルが正しく添付されていない
・ 読み込まれていないなどが挙げられます。
対処方法としては、
filenameメソッドの中身の後ろに
if original_filename.present?
を追記することでファイルの存在が確認できる場合にのみfileメソッドの中身が動作するように設定することで解決できました。
image_uploader.rbdef filename super.chomp(File.extname(super)) + '.jpg' if original_filename.present? end作業内容
現在以下の画像のようなアップロード機能をcarrierwave+rails6で実装している。
image1のみに画像を添付し、送信ボタンを押すと、以下のエラーが発生。
TypeError (no implicit conversion of nil into String): app/uploaders/image_uploader.rb:33:in `extname' app/uploaders/image_uploader.rb:33:in `filename' app/controllers/characters_controller.rb:30:in `block in create' app/controllers/characters_controller.rb:29:in `create'app/uploaders/image_uploader.rb:33:in
extname'
filename'
app/uploaders/image_uploader.rb:33:inに問題が発生しているみたいなので確認してみる。
image_uploader.rbdef filename super.chomp(File.extname(super)) + '.jpg' endこのメソッドはgem carrierwaveでgem rmagick(画像サイズを変換したり画像の拡張子を揃えるためのライブラリ)を使用するときに、必要なメソッドです。
公式マニュアル → https://github.com/carrierwaveuploader/carrierwave/blob/master/README.md
実は、今回実装したimage1~image4には、共通のアップローダー(image_uploader.rb)を使用するように設定していた。
エラー発生時にはimage1のみに画像をしていたため、
残りのimage2~image4は画像が添付されていないという認識になり、filenameメソッドが正しく動作しなくなったため、エラーが発生したと考えた。
なので、filenameメソッドの中身の後ろにファイルの存在を確認する
if original_filename.present?
を追記した。image_uploader.rbdef filename super.chomp(File.extname(super)) + '.jpg' if original_filename.present? endその結果…エラーが出なくなりました!!
- 投稿日:2020-04-01T14:29:58+09:00
【WAMP】WindowsとApacheとMysqlとPhpと
概要
仕事のために試したことをまとめたものです。
Apacheがwin64、PHPがwin32だとうまくいかなかったのでMySQLも統一の必要があるかもしれません。バージョン
- Apache:httpd-2.4.41-win32-VS16.zip
- MySQL:mysql-8.0.19-winx64.zip
- PHP:php-5.4.45-Win32-VC9-x86.zip
インストール
各アプリケーションのインストールから実行までの手順を記載
Apache
- ファイルをダウンロードし展開(C:\Apache24)
- httpd.confに以下を追記
- http://localhost/でアクセス可能に:
ServerName localhost:80
- PHPのディレクトリを指定:
PHPIniDir "c:/php"
- .phpファイルをPHPとして実行可能に:
AddType application/x-httpd-php .php
- apache2.4用PHP5モジュールをロード:
LoadModule php5_module "c:/php/php5apache2_4.dll"
- URL書き換えのためにmod_rewriteをロード:
LoadModule rewrite_module modules/mod_rewrite.so
- .htaccessでの設定を可能に:<Directory />配下に
AllowOverride All
- htdocsに.htaccessを作成し以下を記述
- URLの書き換えを有効にする:
RewriteEngine on
- 書き換え後のパスのベースURLを指定:
RewriteBase /
- 書き換えの条件を指定
- ファイルではない時:
RewriteCond %{REQUEST_FILENAME} !-f
- ディレクトリではない時:
RewriteCond %{REQUEST_FILENAME} !-d
- 書き換えのルールを指定(条件に一致する全てのパスをクエリをマージしてindex.phpにforward):
RewriteRule ^ index.php [QSA,L]
- コマンドプロンプトを管理者として実行
- apacheを起動:
httpd -k start
MySQL
- 上記サイト手順6まで実行
- PATHを通す([展開先]\bin)
- MySQL初期化:
mysqld --initialize-insecure --user=mysql
- .batファイルを作成し次の内容で保存:
mysqld --defaults-file="[展開先]\my.ini" --console
- 接続:
mysql -u root --skip-password
- rootユーザにパスワード設定:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
PHP
- ファイルをダウンロードし展開(C:\php)
- php.ini-productionをコピペしphp.iniを作成
- 投稿日:2020-04-01T13:02:02+09:00
Win10上でJavaとmysqlのWebシステム構築手順
Overview
今回は一般的な開発環境を作ります。
本番のシステムの場合は適切なセキュリティ対策を行うする必要があります。
概要
- Mysql
- ダウンロード
- インストール
- 設定
- Java
- Download
- 展開するフォルダー
- Tomcat
- ダウンロード
- 展開するフォルダー
- IDE
- ダウンロード
- インストール
- 設定など
- テスト
- サーバーにデプロイ
- DBと接続
MYSQL
ダウンロード
https://dev.mysql.com/downloads/installer/
次の画面
インストール手順
そのまま次
次へ
次へ
次へ
次へ
ルートパスワードを設定、次へ
次へ
Execute !
事前に設定されたパスワードを入力し、チェックをクリック。次へ
Executeをクリック
完了
Java
ダウンロード
https://jdk.java.net/java-se-ri/11
ダウンロードしたファイル展開して「ドキュメント」フォルダに移動
Tomcat
ダウンロード
展開して、JDKと同じように「ドキュメント」フォルダに移動し、完了。
IDE
Eclipse
ダウンロード
https://www.eclipse.org/downloads/download.php?file=/oomph/epp/2020-03/R/eclipse-inst-win64.exe
インストール手順
今回WEB系なのでEnterprise Javaを使う必要になります。
JDKの設定
インストールをクリックして、終わったら以下の画面出てきます。
「ドキュメント」フォルダの中に「new_workspace」フォルダを作成し、設定します。
LAUNCHをクリックして以下の画面が現れます。
-「Maven Project」を作成
設定
それでWeb用なMavenプロジェクトを作成完了。
サーバー環境の設定
左にあるメニューから「Server」選んで「Runtime Environment」と「Add...」
先インストールしたTomcatはバージョン9です。
jdkを確認して
先「ドキュメント」フォルダに移動したJDKが設定されているかどうか
じゃなかったら設定し、悶えなければ「Finish」
テスト
Tomcat&Java
Java&Mysql
接続するための追加
https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.19
上のリンク以下のページへ、赤いまるの情報をコーピします。
以下のコードも追加してください。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
接続コード
これからindex.htmlに追加します。
一番上の列には以下のコードを追加してください。<%@ page import="java.sql.*" %>
「<body>」タグの中に以下のコードをコーピ。password のところだけ、事前に設定されたパスワードを変えてください。
<%
Class.forName("com.mysql.cj.jdbc.Driver");
try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC", "root", "password");) {
System.out.println("connect success");
}catch (Exception e)
{
System.out.println(e);
}%>データベースに接続完了。
- 投稿日:2020-04-01T02:30:36+09:00
Library not loaded: libssl.1.1.dylib (LoadError) 発生時の対処策
状況
macOS catalina で railsアプリの開発環境を整え終わって、
Windows10環境で開発してたWebアプリをクローンし、いざrails server
実行だ!
と意気込んでいたら、見た事のないエラーに困惑…解決はできたものの、いろいろと調べたら闇が深そうだったので、
自分用にメモを残しておきます。ついでに同じエラーに悩む方の助けになれば幸いです!
エラー内容
zshdlopen(/Users/kirimaro/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/mysql2-0.5.3/lib/mysql2/mysql2.bundle, 9): Library not loaded: libssl.1.1.dylib (LoadError) Referenced from: /Users/kirimaro/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/mysql2-0.5.3/lib/mysql2/mysql2.bundle Reason: image not found - /Users/kirimaro/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/mysql2-0.5.3/lib/mysql2/mysql2.bundle
OpenSSL@1.1
のインストールmacOS catalina はデフォルトのSSLがLibreSSL 2.8.3が設定されています。
試しにopenssl version
を実行すると、LibreSSL 2.8.3
と出力されはずです。
上記エラーの原因はこいつです。
gem "mysql2"
はOpenSSLと依存関係にあり、LibreSSLがデフォルトだとLibrary not loaded: libssl.1.1.dylib
といったロードエラーが発生します。これを解消するために、まず
OpenSSL@1.1
をインストールします。尚、
OpenSSL@1.1
はHomebrewでインストールを行いますが、
Homebrewのインストール方法については、他で調べれば記事が大量だと思うのでここでは割愛させていただきます!
※Homebrewの利用にはXcodeが必須となりますので、インストールしていない方は先にインストールしておきましょう。既にHomebrewをインストール済みの方は、以下のコマンドを実行します。
zsh% brew install openssl@1.1
インストールが完了したら、
brew info openssl
を実行します。すると
OpenSSL@1.1
について以下のような情報が表示されます。zsh% brew info openssl openssl@1.1: stable 1.1.1d (bottled) [keg-only] Cryptography and SSL/TLS Toolkit https://openssl.org/ /usr/local/Cellar/openssl@1.1/1.1.1d (7,983 files, 17.9MB) Poured from bottle on 2020-03-30 at 20:49:11 From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/openssl@1.1.rb ==> Caveats A CA file has been bootstrapped using certificates from the system keychain. To add additional certificates, place .pem files in /usr/local/etc/openssl@1.1/certs and run /usr/local/opt/openssl@1.1/bin/c_rehash openssl@1.1 is keg-only, which means it was not symlinked into /usr/local, because openssl/libressl is provided by macOS so don't link an incompatible version. If you need to have openssl@1.1 first in your PATH run: echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.zshrc For compilers to find openssl@1.1 you may need to set: export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib" export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include" For pkg-config to find openssl@1.1 you may need to set: export PKG_CONFIG_PATH="/usr/local/opt重要なのは、
echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.zshrc
で、
これをzshにコピペして実行する事で、デフォルトのSSLがOpenSSLへ変更されます。実は、エラーの解消自体はOpenSSLをインストールしていれば、デフォルトに設定していなくても問題なく解決できます。
私自身まだそこまで詳しくないのですが、開発ツールなどの多くがまだまだOpenSSLへ依存している状況もあるようなので、
デフォルトに指定しておいたほうが無難なのかなと思います。正しく切り替わったか確認したい場合は、zshを再起動したうえで
openssl version
を入力してみて下さい。
OpenSSL @1.1.1d
といった感じで、デフォルトSSLが切り替わっている事が確認できると思います。
mysql2
ビルド時に必要となるlib/includeのPathを環境変数に追加
~/.zshenv
ファイルをviなどのテキストエディタで開き、
brew info openssl
実行時に表示される下記パスを追加します。保存したら反映するために、zshを再起動します。
export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib" export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"bundle configにビルドパスを追加
railsアプリのルートディレクトリへ移動し、zshから下記コマンドを実行します。
zsh% bundle config build.mysql2 --with-ldflags=$LDFALGS --with-cppflags=$CPPFLAGSこれで、bundle installを実行した際、mysql2のインストール時にビルドオプションとして、opensslのlib/includeが読み込まれます。
Railsアプリからすでにインストール済みの
mysql2
をアンインストール下記コマンドを実行し、インストール済みのmysql2を削除します。
zsh% bundle exec gem uninstall mysql2
bundle install を実行
既に
bundle config
でビルドオプションを設定済みですので、bundle install
若しくはbundle
のみでインストール可能です。zsh% bundle install
これで、ロードエラーが解消され、正常にサーバーが起動されると思います。
デフォルトSSLをLibreSSLに戻したい時
デフォルトSSLをLibreSSLに戻したい場合は、
~/.zshrc
に追加された
export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"
を削除・保存し、zshを再起動すると、
LibreSSLがデフォルトSSLに戻ります。
- 投稿日:2020-04-01T02:30:36+09:00
Library not loaded: libssl.1.1.dylib (LoadError) 発生時の解決方法
状況
macOS catalina で railsアプリの開発環境を整え終わって、
Windows10環境で開発してたWebアプリをクローンし、いざrails server
実行だ!
と意気込んでいたら、見た事のないエラーに困惑…解決はできたものの、いろいろと調べたら闇が深そうだったので、
自分用にメモを残しておきます。ついでに同じエラーに悩む方の助けになれば幸いです!
エラー内容
zshdlopen(/Users/kirimaro/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/mysql2-0.5.3/lib/mysql2/mysql2.bundle, 9): Library not loaded: libssl.1.1.dylib (LoadError) Referenced from: /Users/kirimaro/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/mysql2-0.5.3/lib/mysql2/mysql2.bundle Reason: image not found - /Users/kirimaro/.rbenv/versions/2.5.3/lib/ruby/gems/2.5.0/gems/mysql2-0.5.3/lib/mysql2/mysql2.bundle
OpenSSL@1.1
のインストールmacOS catalina はデフォルトのSSLがLibreSSL 2.8.3が設定されています。
試しにopenssl version
を実行すると、LibreSSL 2.8.3
と出力されはずです。
上記エラーの原因はこいつです。
gem "mysql2"
はOpenSSLと依存関係にあり、LibreSSLがデフォルトだとLibrary not loaded: libssl.1.1.dylib
といったロードエラーが発生します。これを解消するために、まず
OpenSSL@1.1
をインストールします。尚、
OpenSSL@1.1
はHomebrewでインストールを行いますが、
Homebrewのインストール方法については、他で調べれば記事が大量だと思うのでここでは割愛させていただきます!
※Homebrewの利用にはXcodeが必須となりますので、インストールしていない方は先にインストールしておきましょう。既にHomebrewをインストール済みの方は、以下のコマンドを実行します。
zsh% brew install openssl@1.1
インストールが完了したら、
brew info openssl
を実行します。すると
OpenSSL@1.1
について以下のような情報が表示されます。zsh% brew info openssl openssl@1.1: stable 1.1.1d (bottled) [keg-only] Cryptography and SSL/TLS Toolkit https://openssl.org/ /usr/local/Cellar/openssl@1.1/1.1.1d (7,983 files, 17.9MB) Poured from bottle on 2020-03-30 at 20:49:11 From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/openssl@1.1.rb ==> Caveats A CA file has been bootstrapped using certificates from the system keychain. To add additional certificates, place .pem files in /usr/local/etc/openssl@1.1/certs and run /usr/local/opt/openssl@1.1/bin/c_rehash openssl@1.1 is keg-only, which means it was not symlinked into /usr/local, because openssl/libressl is provided by macOS so don't link an incompatible version. If you need to have openssl@1.1 first in your PATH run: echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.zshrc For compilers to find openssl@1.1 you may need to set: export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib" export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include" For pkg-config to find openssl@1.1 you may need to set: export PKG_CONFIG_PATH="/usr/local/opt重要なのは、
echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.zshrc
で、
これをzshにコピペして実行する事で、デフォルトのSSLがOpenSSLへ変更されます。実は、エラーの解消自体はOpenSSLをインストールしていれば、デフォルトに設定していなくても問題なく解決できます。
私自身まだそこまで詳しくないのですが、開発ツールなどの多くがまだまだOpenSSLへ依存している状況もあるようなので、
デフォルトに指定しておいたほうが無難なのかなと思います。正しく切り替わったか確認したい場合は、zshを再起動したうえで
openssl version
を入力してみて下さい。
OpenSSL @1.1.1d
といった感じで、デフォルトSSLが切り替わっている事が確認できると思います。
mysql2
ビルド時に必要となるlib/includeのPathを環境変数に追加
~/.zshenv
ファイルをviなどのテキストエディタで開き、
brew info openssl
実行時に表示される下記パスを追加します。保存したら反映するために、zshを再起動します。
export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib" export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"bundle configにビルドパスを追加
railsアプリのルートディレクトリへ移動し、zshから下記コマンドを実行します。
※特定のアプリにのみビルドオプションを指定したい場合は、該当アプリのルートディレクトリにいる状態でローカルの方のコマンドを実行してください!zsh#グローバル(別のアプリでmysql2をインストールする場合も、ビルドオプションが適用される) % bundle config build.mysql2 --with-ldflags=$LDFALGS --with-cppflags=$CPPFLAGS #ローカル(現在ルートディレクトリとなっているアプリでのみ、mysql2インストール時にビルドオプションが渡される) % bundle config --local build.mysql2 --with-ldflags=$LDFALGS --with-cppflags=$CPPFLAGSこれで、bundle installを実行した際、mysql2のインストール時にビルドオプションとして、opensslのlib/includeが読み込まれます。
Railsアプリからすでにインストール済みの
mysql2
をアンインストール下記コマンドを実行し、インストール済みのmysql2を削除します。
zsh% bundle exec gem uninstall mysql2
bundle install を実行
既に
bundle config
でビルドオプションを設定済みですので、bundle install
若しくはbundle
のみでインストール可能です。zsh% bundle install
これで、ロードエラーが解消され、正常にサーバーが起動されると思います。
デフォルトSSLをLibreSSLに戻したい時
デフォルトSSLをLibreSSLに戻したい場合は、
~/.zshrc
に追加された
export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"
を削除・保存し、zshを再起動すると、
LibreSSLがデフォルトSSLに戻ります。