tbls(データベースドキュメントを自動生成するOSSのツール)のエラー解決について教えてください。

投稿者: Anonymous はじめに tblsを用いたDBドキュメント作成 tblsというツールを用いて既に存在しているDBのデータベース定義書を作成しようとしました. まず,GitHubのREADME.mdに従い下記のようなファイル(.tbls.yml)を作成しました. # .tbls.yml # DSN (Database Source Name) to connect database dsn: sqlite:///./db.sqlite3 # Path to generate document docPath: ./dbdoc また,これに加え同じディレクトリに(DBドキュメントを入れるための)dbdocというディレクトリを作成し,下記のコマンドをterminalで実行しました. mkdir dbdoc tbls doc しかしこのコマンドを実行した結果"unable to open database file: no such file or directory"というエラーが出ます. 質問したいこと 上記で発生したエラーの原因及び解決策についてご教示いただきたいです. 補足その1 環境 OS:MacOSCatalina(ver 10.15.5) DB:SQLite3 その他:DjangoのPJです 補足その2 私のディレクトリ構造 カレントディレクトリ ~/Desktop/hoge_project(仮名) カレントディレクトリ下のファイル accounts document…(Continue Reading)

トランザクションの中で遷移処理を書いてしまうと何か具体的な問題は発生しますか?

投稿者: Anonymous Railsに限らず、WebのMVCなら書き間違えてしまいかねないのですが、 本来の形 本来下記のようにすべきところを def hoge ActiveRecord::Base.transaction do …. …. raise ActiveRecord::RecordNotDestroyed unless Foo.destroy_all end redirect_to ….. rescue ActiveRecord::RecordNotDestroyed redirect_to ….. end 誤り 遷移処理をトランザクションの中に入れてしまった場合に具体的な問題は起こりますでしょうか? def hoge ActiveRecord::Base.transaction do …. …. raise ActiveRecord::RecordNotDestroyed unless Foo.destroy_all redirect_to ….. # <- トランザクション中に書いてしまった! end rescue ActiveRecord::RecordNotDestroyed redirect_to ….. end 説明 raiseで例外が起こった場合はどちらも rescue に処理が飛ぶので、例外が起こったとしても処理の流れに違いはないように思います。(とはいえ、DBに関するブロックに遷移処理が入っているので、ロジック的にもソースコードの美しさ的にも変だとは思いますが) 解決 この例だけで言うと、実際に試してみてトランザクションが正常にコミットできていれば、副次的な問題が起きる可能性は低いと思います。 以下は余談ですが、例外以外の要因でトランザクションを阻害するケースを考えてみました。 問題が起きる可能性がああるのはdoブロック内でreturnしてしまった場合が考えられます。 ブロック内でのreturnはブロックを呼び出しているyieldの終了だけでなく、ブロックの呼び出し元の終了も行うためです。…(Continue Reading)

eclipseとoracleを接続する際のデータ定義と接続情報について

投稿者: Anonymous TERASOLUNAのチュートリアル でデータベースをOracle DBに切り替える作業を行っているのですが、 「データベースへの接続に失敗しました。 Listener refused the connection with the following error: ORA-12505, TNS:listener does not currently know of SID given in connect descriptor」 というエラーが出てしまいます。 接続情報は データベース定義名:TERASOLUNA JDBCドライバー: odbc6jar JDBC Driver:oracle.jdbc.OracleDriver JDBC タイプ:Type4 接続文字列:jdbc:oracle:thin:@192.168.11.89:1521:ORCL(ipはコマンドのipconfigで調べました) 接続ユーザ:taro(SQLコマンドでUSERを作成) 接続パスワード:パスワード(SQLコマンドで作成) 以上の設定で接続を試してみましたが、うまくいきません。 TERASOLUNAのチュートリアルと自分のPC環境設定と照らし合わせて、接続情報の引き出し方はこれであっているか。 確認しておくべき点をご教授願いたいのですが、お願いします。 解決 以下の記事に確認すべき事項と、対処方法が説明されていますから参考になるのではないでしょうか。 ORA-12505: TNS: リスナーは接続記述子で指定されたSIDを現在認識していません 回答者: Anonymous

DBの具象テーブル継承時に、具象先が単一であることを保証する仕組み

投稿者: Anonymous 例えば、StudentクラスとTeacherクラスが、Userクラスを継承しているとします。 それをDBテーブルで表現すると、以下のようになるかと思います。(具象テーブル継承) userテーブル id (※主キー) name(氏名) … studentテーブル user_id(※外部キー) student_no(学籍番号) class_room(所属クラス) … teacherテーブル user_id(※外部キー) office_room(職員用の居室) … このとき、userの具象先(studentかteacher)が単一であることを保証する仕組みは、存在しますでしょうか? あるuserレコードに対して、studentとteacherの両方にレコードが存在できてしまう場合を懸念しています。 解決 ご質問のクラステーブル継承を使った場合でも、CHECK制約を使って継承先を一意に特定することができます。 StudentテーブルとteacherテーブルにそれぞれSTUDENT_IDとTEACHER_IDを主キー(PK)として設定します。 それをuserテーブルの該当カラムに外部キー(FK)として追加します。 最後にuserテーブルのCHECK制約として下記を設定します。 (下記はOracleの構文例です) CONSTRAINT CHK_TYPE CHECK (case when STUDENT_ID is NULL then 0 else 1 end + case when TEACHER_ID is NULL then 0 else 1 end = 1) このCHECK制約は1つ目のcase文でSTUDENT_IDの有無を、2つ目のcase文でTEACHER_IDの有無をフラグ化して、どちらか片方しかない場合のみチェックが通るようにしています。 このテーブル設計により、StudentテーブルのSTUDENT_IDは一意であり、teacherテーブルのTEACHER_IDも一意であることが保証されます。 userテーブルの上記IDをStudentテーブルとteacherテーブルに外部結合する設計で、「あるuserレコードに対して、studentとteacherの両方にレコードが存在できてしまう場合」はなくなります。…(Continue Reading)

リバースプロキシを用いた場合のデータベースの扱い方

投稿者: Anonymous nginxを使って、リバースプロキシをして2つのWebサーバーをサブドメインでわけたいと考えています。 この場合データベースはどのように扱えばいいのでしょうか。ちなみに全て1つの物理サーバー内で構築しようと考えています。 例えばこの場合データベースのインスタンス(MySQL等)を1つのポートで1台たちあげると、そのインスタンスを利用できるのは1つのWebサーバーのみとなってしまうと考えられます。 この解決方法として幾つか考えましたがどれがベストなのかわかりません。 ①データベースインスタンスを2台立ち上げ、データの保管場所を同じにしてWebサーバごとに1台ずつアクセスする。 ②1台のサーバではそもそもデータベースを共有できないので別のデータベースを使わなければならない。 ③データベースごとに物理サーバをたてて、スイッチで接続する。 できれば1台のサーバないでできる方法を教えていただきたいです。また、リバースプロキシのベスト・プラクティスや構築パターンなどありましたら教えていただければ幸いです。 解決 例えばこの場合データベースのインスタンス(MySQL等)を1つのポートで1台たちあげると、そのインスタンスを利用できるのは1つのWebサーバーのみとなってしまうと考えられます。 これがおかしいです。RDBMS(に限らずほとんどのネットワーク越しに利用なサーバソフトウェア)は単一のポートで複数の接続を提供できます。Webサーバが80/tcpで多数のコネクションを同時に提供できるのが良い例です。 なので、何も難しいことは無く、 ・DBサーバ一台 ・Web/APサーバ 2 台 (DBの接続先指定はすべて同じ) ・リバースプロキシ1台 +–Web/APサーバ–+ –リーバースプロキシ–+ +–DBサーバ +–Web/APサーバ–+ でよいでしょう。 リバースプロキシ、Web、AP、DBの各サーバを多段で構成する場合の考え方は、一概に言えるものでは無くシステム構成や各要素にどれぐらいの負荷がかかるか、どのぐらいのリソースが提供できるか、耐障害性をどのぐらい確保しなければならないかによって大きく変わります。どうやって実現するのかまで含めるとすくなくとも雑誌記事一本レベルのボリュームになるので、ここで聞くには向かない質問です。書籍等で勉強されることをお勧めします。 回答者: Anonymous

MySQLの負荷テストツールを探しています

投稿者: Anonymous DBサーバのCPUとIOPSが、定められた非機能要求にてピーク時の負荷を乗り切るには、どのくらいの性能が必要なのかを負荷テストしたく、以下のことができる負荷テストツールを探しています。 クエリを指定できる   – JOINやWHERE句なども再現したいため、自分でクエリを指定できる必要があります。 同時接続数を指定できる クエリの頻度を指定できる   – 1秒に110回送るクエリ、20秒に1回送るクエリなどが存在するため、クエリの頻度を指定できる必要があります。 検証時間を指定できる   – 3分間検証を実施したいため。 以上、このようなことができる負荷ツールをご存知の方がいらっしゃいましたら、ご教示いただけますと幸いです。 mysqlslapで行ける!と思ったのですが、どうやら「クエリの頻度を指定」することができないようで…。 自作でスクリプト組むのも非常に面倒なので、教えていただけるととても嬉しいです! 解決 Jmeterで出来そうとのことなので改めて回答します。 下記Jmeterの配布サイトになります。 http://jmeter.apache.org/ テスト計画とシナリオを作って負荷試験を行いログを出力すればよろしいかと思います。 また、試験に使用するテスト計画ファイル(*.jmx)を別のマシンで作成してから本番環境へ持っていくことも可能ですので、 本番環境でテスト計画ファイルを作成する前に試験環境でテスト計画を作成し、 テスト計画に不備が無いことを確認してから本番環境へ持っていくとよろしいかと思います。 回答者: user10259

Spring bootの起動エラー(DBアクセスに失敗か?)

投稿者: Anonymous EclipseにてSpring initializrというサイトで作ったプロジェクト(mavenでwebでjpa)を解凍しEclipseにインポートしmain()を実行しようとしたところ下記のエラーとなりました。 恐らくapplication.propertiesになにか書かないといけないと思うのですがどうすればいいでしょうか。HSQLとはなんでしょうか?PCにはMySQLとPostgreSQLしか入れていません。 表示されたエラー APPLICATION FAILED TO START *************************** Description: Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class Action: Consider the following: If you want an embedded database (H2, HSQL or Derby), please put it on…(Continue Reading)

TinderライクなマッチングアプリのDB設計

投稿者: Anonymous 現在DBはFirestoreを使って、iosでTinderライクなマッチングアプリを作ろうとしています。 マッチングアプリなので、一度表示した相手は、一定期間もしくは全他ユーザーを表示しきるまでは、再び表示されないようにしたいのですが、そのための効果的なDB設計がわかりません。 現状のDBとしては、 Usersコレクションがあり、その中に各ユーザーを示すドキュメントがあるという状態です。 そして、今は単純にそのコレクションから普通にユーザーを取ってきて表示しているので、一度表示した相手も再び表示されます。 今の所考えている方法としては、以下の二つです。 ① TimeStampコレクションを作って、ユーザーが他ユーザーをスワイプする度に、 TimeStamp/ユーザーUID/OtherUsers/他ユーザーUIDのfieldに[“matched”:Bool], [“lastShowed”: その時の時刻]を書き込んでいく。 そして、相手を表示するときには、一度Usersコレクションからドキュメントを取得し、その各UIDでTimeStamp/ユーザーUID/OtherUsers/そのUIDのドキュメントで、matched==falseかつlastShowedと現在時刻が一定期間経過してるかを、判定して、それが大丈夫なら、表示する。大丈夫でないなら表示しない。 ② 各ユーザーのドキュメントに新たにOtherUsersのコレクションをつくる。 新たなユーザーが登録する度に、全ユーザーのOtherUsersコレクションに、新たなユーザーUIDのドキュメントを作り、そのフィールドに[“matched”:Bool], [“lastShowed”: その時の時刻]を書き込んでいく。 相手を表示する時は、Users/ユーザーUID/OtherUsersコレクションから、matched==falseかつlastShowedと現在時刻が一定期間経過してるの条件でクエリをかけて表示する。 いずれにしてもあまり効率的でないと思うので、もっと良い方法をご教授いただければと思います。 また、必ずしもFirestoreでなくてもよいので、他のDBでも一度表示した相手を一定期間表示しないことができる設計を教えていただけたらと思います。 よろしくお願いします。 解決  単純に、データーベースへのアクセス回数が少なくなるようにというのは、毎回データーベースから抽出、更新するのではなく、DBと表示の間に未表示者リストをメモリーの上に作成し、それを介する様にすれば、(例えば次の人を表示するタイミングで)未表示者が残り何人になったらデータベースへアクセスし、未表示者を更新するようなバッファリングで対応出来るのではないでしょうか。  同様に、何人の人をチェックしおわった(質問者さんの表現を使うとスワイプした)タイミングで、チェックした人のIDとタイムスタンプを配列に保存しておき、こちらも同様に特定件数の既読が溜まったらデーターベースへ書き込む様にすればデータベースへの書き込み回数も抑えられます。  この点を踏まえて、①、②、いや、それならもっと上手いこと出来そうだぞ。と考えて見られるのがよろしいかと思います。 答えになっているようななっていないような、あやふやな回答で申し訳ありませんが、考察の一助となれば幸いです 回答者: Anonymous

pgAdmin3 によるリストアができない

投稿者: Anonymous お力添えをお願いします。 pgAdmin3 によるリストアができず困っています。 【操作手順】 [1] 端末AでpgAdmin3 のオブジェクトブラウザからサーバのデータベースの一つを右クリック「バックアップ」 [2] [1]で生成された watashinodb.backup ファイルを端末Bのローカルフォルダへ移動 [3] 端末BのpgAdmin3 のオブジェクトブラウザからlocalhost のデータベースの一つを右クリック「リストア」 [4] [2]のwatashinodb.backup ファイルを指定して[リストア]実行 [5] 下記のメッセージを受け取る; C:Program Files (x86)pgAdmin III1.22pg_restore.exe –host localhost –port 5432 –username "XXX" –dbname "YYY" –no-password –verbose "C:UsersZZZDocumentswatashinodb.backup" pg_restore: [archiver] unsupported version (1.13) in file header プロセスは、1 のリターンコードを返しました。 環境/インストール済みパッケージ: ■端末A: PostgreSQL:9.6.18 pgAdmin3:1.2.22 pgAdminのpg_dump.exe:9.6.xx ■端末B: PostgreSQL:9.6.18 pgAdmin3:1.2.22…(Continue Reading)

PHP PDOでMySQLのデータを削除したい

投稿者: Anonymous 私はいまPHP PDOを使い、content.phpに削除処理を実装しようとしています。 以下のコードでは、「//取得」のところで表示されている画像A(src=$xxurl)を、content.php内では削除(?)できます(、というか非表示になります)。 しかし、サムネイル一覧ページであるhome.phpに進むと、削除されておらず、画像Aのサムネイルをクリックしcontent.phpに遷移すると、画像Aは再表示されてしまいます。 phpMyAdminでデータを確認しても、削除できていません。 content.php上のボタンをクリックすると、home.phpに遷移し、そこのサムネイル一覧とデータベースから、(ひとつの)データを削除する方法を教えていただきたいです。 【content.php】 try{ $hostname = ‘mysql321.db.sakura.ne.jp’; $dbname = ‘dbname’; $username = ‘username’; $password = ‘xxxxx’; $dbh = new PDO(“mysql:host=$hostname;dbname=$dbname;”, $username, $password , array(PDO::MYSQL_ATTR_INIT_COMMAND => ‘SET NAMES utf8’)); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $stmt = $dbh->prepare(“INSERT INTO xxxxURLs (name, url, time) values (:name, :url, :time)”); if(!$stmt) { $error_info = $dbh->errorInfo(); die($error_info[2]); }…(Continue Reading)

MySQLの文字コードをutf8mb4に変更したが、絵文字がうまく入らない

投稿者: Anonymous PHP+MySQLでWebアプリケーションを開発しています。 スマホからの絵文字がutf8では保存できないので、utf8mb4に変更しました。これでハートや太陽などは入るようになったのですが、人の顔のような絵文字は??になります。そこで、質問があります。 utf8mb4でも、保存できる絵文字とできない絵文字が存在するのでしょうか。 それとも、設定に不足か間違いがあって、本来全て保存できるものでしょうか? 保存できるものとできないものがある場合、違いは何でしょうか。見分ける方法等はありますか? ぐぐっても回答が見つからず、困っております。情報へのポインタだけでも構いませんので、何卒よろしくお願いします。 追記:環境 CentOS6.5 Apache2.2.15 PHP5.6.12 MySQL5.5.28 フレームワーク 自作 my.cnfより抜粋 [mysqld] # character-set character-set-server=utf8mb4 skip-character-set-client-handshake [client] #default-character-set=utf8 [mysql] default-character-set=utf8 [mysqldump] default-character-set=utf8 php.ini内に特に文字コードの設定なし ([mbstring]セクションはすべてコメントアウトされている) 解決 utf8mb4 はすべての絵文字が入ります。 「?」になってしまうということは、テーブルやカラムの charset がちゃんと utf8mb4 になっていないか、クライアントからの接続が utf8mb4 になっていないということが考えられます。 接続の charset は SHOW VARIABLES LIKE ‘%char%’ クエリで確認できます。 接続の charset は接続毎に設定されるので、mysql コマンドで接続したときの charset がちゃんと utf8mb4 だったとしても、PHP…(Continue Reading)

電話帳のテーブル設計

投稿者: Anonymous ユーザ毎に電話番号を登録します。 ユーザは複数の電話帳を登録できて、上記の登録済みの電話番号を電話帳に登録できます。 電話番号は、複数の電話帳に登録が可能です。 としたい時のテーブル設計で悩んでいます。 今のところは、電話帳テーブルのユニークなIDをtag的に電話番号に付与しようと思っています。 ただ、そうすると、tagカラムの文字列長が気になっちゃったり、CLOB使うか?とか思っちゃったり、悩みどころが多くて困っています。 もちろん電話帳から電話番号を絞りこんだりしたいです。 イメージ的には、スマホなどのアドレス帳で、1つの連絡先に複数のグループを指定できるというのが近い感じだと思います。 こういう多対多のようなデータ設計って、どうしてやるのが良いんでしょうか? 今回以外でも似たような状況があったんですが…その時は紐付けテーブル(電話帳と電話番号を結び付けるだけのテーブル)が用意されていました。 解決 もし私が実装するなら、ユーザーは複数の電話番号を持てるのかどうか、仕様確認すると思います。 複数持てるとするならば、「ユーザー、番号、電話帳」の3つが実体を持つデータで、それぞれを中間テーブルで繋げば良いのかと思いました。 回答者: Anonymous

タイムシートのテーブルのDB設計について

投稿者: Anonymous MySQLでタイムシートのテーブルを作成したいと考えています。 テーブルには「開始時間」と「終了時間」のカラムを入れる予定ですが、 開始時間と終了時間から求められる「実働時間」のカラムも入れるべきかで悩んでいます。 「実働時間」カラムを作らない場合、テーブルの構造をすっきりさせることができますが、 「実働時間」のデータを使用したいときは、その都度計算しなければなりません。 このような場合はどちらにするべきでしょうか。   解決 計算で求められる値を、都度計算するか結果を保存しておくかというのは悩ましいところです。 しかしこの質問について言えば、計算方法は制度などによって変化する可能性がありますが、過去の実働時間は一度確定すれば変化することがありませんし、変化しては困ります。ですので、入力時点(または締め日など特定の時点)で計算した値を保存する方法にしなければなりません。 都度計算する場合、計算方法が変わったからと言って単純にプログラムの計算方法を変えると、過去分の実働時間も変化してしまいます。これは非常にまずいです。これを避けるには、タイムスタンプを見てその時々に応じた計算を行うロジックを組む必要があります。新たな計算方法を追加する際に、過去分に影響する判定条件や計算のバグがあれば、過去の時間が変化してしまいます。やはりまずいです。 回答者: Anonymous

排他的なユーザ属性を持たせるときのテーブル設計について知りたい

投稿者: user14485 Webアプリの開発を一人でしているものです。今まで、アプリケーション側をメインに触ってましたが、いざDB設計をしようと思ったら分からないことだらけで、上手く情報を見つけることすらできず困っています。 現在、Web上でユーザ同士をマッチングするアプリケーションを開発しています。 全てのユーザはそれぞれ、AとBどちらかのユーザ属性を選ぶことが可能で、どちらかにしか所属できません。またユーザ属性に応じてテーブルの持つカラムが異なります。 一方で、全てのユーザはメールアドレスとパスワードのような共通の値も必要です。 そこで現在の設計では、最初にメールアドレスとパスワードのような共通の値をもつテーブル(ユーザテーブル)を作成し、その後、A属性のテーブルとB属性のテーブルがユーザテーブルを参照する形にしています。 上手く伝わっているのかも微妙ですが、果たしてこれで良いのか自信がありません。 「何が言いたいのかまとまってないので、まずはこれをやって整理してみろ」等なんでも構いません。何かお力添えいただければ幸いです。 ※私としては、現在、DBの設計パターン集のようなものが見つかれば参考になるだろうと思い探しているのですが見つかりません。併せてご教授頂ければ幸いです。 解決 あなたが記述されているのはおそらく「サブクラス化」と言われる、DB設計では一般的な技法で、記述からわかる範囲では特に危惧するような点はないように思います。「DB設計 サブクラス化」などで検索されれば、あれやこれや情報が見つかるかと思います。 私自身は学生時代にRDBの基礎理論を学習した後、ん十年を経て実際にDB設計に携わることになるまで(なった後も)「DBの設計パターン集」的なものを参照したことがないので、残念ながらこれが良いというアドバイスはできません。(「サブクラス化」なんて言い方も後付けで他の人から教えらられたものです。) 回答者: Anonymous

データベースのトランザクション分離レベルの設定について

投稿者: Anonymous データベースのトランザクション分離レベルですが、例えばSQL serverでデータベース単位にトランザクション分離レベルを設定した上で、クライアント側でセッション単位に指定した場合どちらの設定が有効になるのでしょうか? 解決 「SQL serverでデータベース単位にトランザクション分離レベルを設定」がどのような操作を想定されているのか不明です。少なくともALTER DATABASE の SET オプションにトランザクションに関わる設定はありません。 トランザクション分離レベルは、同時に実行される複数のトランザクションが相互にどのように影響を及ぼしあうか、影響を与えないようにするかに関する規定であり、一般的には各々のクエリに対するロックで実現されます。 SQL ServerにおいてもSET TRANSACTION ISOLATION LEVELで現在のトランザクションに対するトランザクション分離レベルを設定できますが、それはトランザクションに含まれる各々のクエリに対するテーブルヒント(のロックに対する指定)のデフォルト値を変更する行為に対応します。例えば、 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED と指定するのは、全てのクエリにNOLOCKもしくはREADUNCOMMITTEDヒントを付与することを意味します。しかし、個々のクエリ側に明示的にUPDLOCKなど別のロックヒントを付与した場合、トランザクション分離レベルの設定とは異なる挙動をします。 クライアント側でセッション単位に指定した場合どちらの設定が有効になるのでしょうか? というわけでそもそもどちらというわけがありませんし、最終的には各々のクエリがどのようなロックヒントで実行されるかで決まります。 回答者: Anonymous

AWSのRDSの暗号化のメリットについて

投稿者: Anonymous Amazon Web Services(AWS)で提供されているAmazon Relational Database Service(RDS)の暗号化について質問です。 RDSでは、基本的に「リソースの暗号化」と「接続の暗号化」が存在するようですが、まずはリソースの暗号化について質問させて下さい。 RDSインスタンスのリソースの暗号化を有効化した場合、具体的にRDSインスタンス、自動バックアップ、リードレプリカ、スナップショットのリソースが暗号化されるようですが、自分以外のユーザがAWSコンソールにアクセスできるようなことが無い場合(IAMなど)、これらのストレージを暗号化するメリットを感じられなかったのですが、どうなのでしょうか?リソースの暗号化を利用する場合、m3.medium以上のインスタンスを利用しなければいけないため、コスト的なデメリットを感じています。 次に、接続の暗号化についてですが、VPCのPrivate SubnetにRDSを設置しPublic Subnetに設置されたEC2インスタンスのアプリケーションからのみRDSにアクセスできるようにした場合、SSLによる通信の暗号化を行ったところで、誰もその通信を傍受することができないと思うのですが、こちらの認識についても誤りがありましたら、ご指摘していただきたいです。 SSL暗号化は、セキュリティ上の利点を提供する一方、SSL暗号化がかなりの計算処理を必要とするオペレーションで、データベース接続の待ち時間を増加させることがあるという記述がAmazonのドキュメントにございましたので、できれば無効化したいと思っています。 しかし「リソースの暗号化」と「接続の暗号化」を無効にした場合、上記の認識でセキュリティ意識に対する穴がないという自信を持てませんでしたので質問させていただきました。 よろしくお願いいたします。 解決 AWSのデータセンター(DC)内部に悪意のある人間が紛れ込んだ場合への対応、としては穴があることになります。 一例なのですが、バックアップの入ったディスク(またはイメージ)が流出した、EC2インスタンスが繋がるハブに特殊な機器を接続され流れるパケットを盗み見られた、そういったケースへの対応です。DC外部からでも、実装時には未知だった脆弱性により、そういう内容が漏れることが考えられます。 もちろんサービスの内容、保存するデータの重要度によっては「そういうことならしかたないよね」で済む場合もあるでしょう。逆に言うと、データの重要度が高ければ、できたはずの暗号化を実施していなかったことが責任上の大きな問題になる場合もあります。 いずれにせよ、「取れない/見れないから大丈夫」ではなく、「万が一見られても大丈夫」という視点が、暗号化を考える上では肝要です。加えてセキュリティ対策では、問題が発生した時にどれだけの損失・責任が発生するかが重要なファクターになります。特に コスト にはそういうリスクも織り込むべきでしょう。 回答者: Anonymous

ハッシュ値の持ち方について

投稿者: Anonymous パスワードなどのハッシュ値をDBで持とうと思っているのですが、 通常のデータベースではハッシュ値はどのような型で扱うべきなのでしょうか? ちなみにオラクル12cを使用しております。 RAW型で持つのが一般的なのでしょうか? それともハッシュ値を16進数表記の文字列にしてCHAR型等で持つべきでしょうか? 解決 人力でINSERT、UPDATEするケースを考慮して、16進数表記の文字列にしてCHAR型で持つのが便利かと思います。(sha512sum等のコマンドの出力を使えるといった点も考慮して) 回答者: Anonymous

TERASOLUNA Server Framework for Java(Web版)チュートリアルでエラーがでています。

投稿者: Anonymous こんにちは。 現在、業務研修でTERASOLUNA Server Framework for Javaのチュートリアルの構築作業を行っています。 TERASOLUNA Server Framework for Java(Web版)チュートリアル 基本的なログオン機能を構築しているのですが、 2.6 登録処理の動作確認の箇所で登録情報の入力をして登録ボタンを押すと  「エラーが発生しました。」のレスポンスが返ってきて原因が特定できず困っています。 仕様ツールの環境設定は同じものでそろえていますが、 H2databaseが反映されていない。 ビジネスロジックは登録機能がきちんと動いていない等が 考えられます。 基本的に設定ファイル、コード等はチュートリアルの流れに従って、確認して漏れはないと思われますが何かこの時点でエラー画面が返ってきてしまうのに考えられる要因はありますでしょうか? よろしくお願いします。 以下追記 以下がsqlmapコードになります。 <?xml version=”1.0″ encoding=”UTF-8″ ?> <!DOCTYPE sqlMap PUBLIC “-//ibatis.apache.org//DTD SQL Map 2.0//EN” “http://ibatis.apache.org/dtd/sql-map-2.dtd”> <!– SqlMap定義 –> <sqlMap namespace=”user”> <!– 指定したIDのを取得する –> <select id=”getUser” parameterClass=”jp.terasoluna.thin.tutorial.web.usermanager.dto.InsertInput” resultClass=”jp.terasoluna.thin.tutorial.web.usermanager.vo.SelectUserOutput”> SELECT ID, NAME, AGE, BIRTH FROM…(Continue Reading)

NCMBデータストア 更新方法について

投稿者: Anonymous NCMB(nifty cloud mobile backend)で オブジェクト更新方法が分からず困っております。 言語はJavaScriptです。(Monacaで開発しています) 取得・保存は問題なく出来ているのですが、更新が動作しません。 どこか誤っている箇所ございますでしょうか。ご教授の程よろしくお願い致します。 //tblhoge name = “test” のオブジェクトを”test2″に更新 var tblHoge = ncmb.DataStore(“tblhoge”); var hoge = new tblHoge(); hoge.equalTo(“name”,”test”) .fetch() .then(function(results) { results.set(“name”,”test2″); return results.update(); }); 解決 var hoge = new tblHoge(); は、データストアにオブジェクトを保存する場合で、検索した結果に対して更新を行う場合は下記のようになります。 var tblHoge = ncmb.DataStore(“tblhoge”); tblHoge.equalTo(“name”, “test”) .fetch() .then(function(results) { results.set(“name”, “test2”); return results.update(); }); 回答者: Anonymous

データベースに登録されているデータを配列にする

投稿者: Anonymous databaseデータベースに登録されているデータを配列にする方法を教えてください。 適当に作った配列は問題なく動作します。 String[] array = {“abc_1″,”abc_2″,”abc_3″,”abc_1″,”abc_5″,”abc_4”}; for(int i = 0; i<6; i++){ …..array[i]…. } https://stackoverflow.com/questions/4042434/converting-arrayliststring-to-string-in-java を参考に下を試しましたがデータは反映されません。 ArrayList<String> list = new ArrayList<String>(); Cursor cursor= database.rawQuery(“select * from tbl_abc”, null); while (cursor.moveToNext()) { abc_num = cursor.getString(4); list.add(abc_num); } String[] array = list.toArray(new String[list.size()]); for (int i = 0; i < array.length; i++) { array[i] =…(Continue Reading)

configとパラメータシートの差分比較方法について

投稿者: Anonymous あるNW機器のConfigとそのパラメータシートを比較して、この設定はパラメータシートと合っているな!と比較していきたいです。 Config同士、パラメータシート同士であれば、WinMergeやDF等を使用して比較すれば良いと思います。 しかしながらConfigとパラメータシートを比較する場合は単純にWinMergeやDF等を使っての比較ができません。 またバージョンも複数あり、それらのバージョン間の差分もありえ、そのバージョンアップも頻繁です。 こういった場合に簡単に比較する為にVBAを使用しようかと思いましたが、v1とv2を比較するVBAを作成する事はできてもv3が出てきた場合にV1とv3を比較しづらくなります。(もう一度VBAを作り直す必要があるため。) その為、一旦Configの内容やパラメータシートの内容をDBに取り込んで、それの同一かどうかを検証するようにすればバージョンが変わったとしても修正がしやすいのではないかと思っております。 しかしながらDBを構築した経験が無く、どの程度で出来るのか検討がつきません。 また、今回作成するDBは可視性を最優先にして、難しくない構文で作りたいと思っております。 MySQLを使えば良いのでは無いかと考えておりますが、どなたか詳しい方、教えていただけませんでしょうか。 やりたい事はConfigAとパラメータシートの比較で同一か異なっているかどうかを判定するだけでいいのです。(異なっている場合はその内容は人が精査するので) 追記 パラメータシートの例 実際はより複雑ですがイメージは変わりません。 configの例 network src 1.1.1.1 255.255.255.0 dst 2.2.2.2/32 Routing OSPF v2 このような形です。実際にはバージョン差分で表記内容が src⇔source となったり、/32 の部分が255.255.255.255 となったりします。 とっかかりを何とか教えていただければ助かります。 また、誤解をさせてしまったかもしれませんが、必ずしもVBAにこだわっている訳ではありません。Pythonとかでも良いのですが、可視性が簡単でメンテしやすく、また私がネットワークエンジニアでプログラマーでは無い為、分かりやすい(見やすい処理)で書きたいと考えております。 解決 とっかかりということですので、システムの設計だけを考えましょう。 煩雑になるので処理の内容を細かく記述することはしません。 まず、仮定を置かせていただきます。現実と齟齬があるかもしれませんがご容赦ください 設定がパラメーターシートに入る これは頻繁に変更されるが最新のものと比較すればよい コンフィグは複数ありバージョンアップが頻繁にある ここでは単純にするために名前と、IPとサブネットの組を比較するシステムを検討します テーブルは以下のものをパラメーターシート(テーブルA)とコンフィグ用(テーブルB)に準備するものとします。 パラメーターシートの管理方針は、’name’は同じ設定間で統一し’create_date’で世代を管理するものとします。 コンフィグの管理方針は’name’で機器を管理し、’version’で設定の世代を管理します。 この内容でテーブルを作成して比較するものとします。 次に、ここにデータを挿入するためのプログラムと、 ふたつを比較するためのプログラムの二つが必要でしょう。 まず、各データソース(情報源)からデータの抽出を行い、 作成したテーブルに挿入する命令を作成します パラメーターシートはExcelに入力されているので、各セルからデータを取得しテーブルAに挿入するプログラムを作成します。 コンフィグはテキストファイルに記述されているのでこれを文字列解析してテーブルBに取り込むプログラムを作成します この時入力値を正規化するかを検討します。この場合はサブネットマスクの記法を255.255.255.255や/24の形に統一するかどうかなどです。(この時点で正規化しておけば後の比較は楽になります)。ラベル部分がsrcかsourceかなどの吸収はプログラムで行います。 最後に比較する命令を作成します。まずコマンドはパラメーターシート[foo]の内容と機器[bar]のコンフィグの最新の内容を比較する場合。 compare foo bar…(Continue Reading)

C# DataSetの使い道を教えてください。

投稿者: Anonymous お世話になります。 初歩な質問でいつもすみません。 C#を使用し、Accessとデータのやり取りを行う必要がでてきたので 勉強から始め直したのですが、このDataSetの使い道がいまだによくわかりません。 まず、『メモリ上にデータを保持する』とか書いてあるのですが、これは単に ListやDictionary等のコレクションクラスで二次元などの配列を作り、 そこに値を入れていくということとはまた別なのでしょうか? もし同じなら、わざわざDataSetなるもを使用せずとも、自分で領域を作ってさえおけば それで用が事足りてしまうのではないかという気がします。 また、DataSet側の値を操作、変更してもデータベース側も自動で変更されるわけでは ないので、結局はADOなどでゴリゴリSQLを走らせなければならないというと、 『ただの入れ物』にすぎないということなのでしょうか? やりたいことは、データベース側のデータをリアルタイムで取得し、変更などが 行われた場合にデータベース側への更新を極力少ない手間で行いたいのですが、 そういったことはこのDataSetは受け付けてくれるのでしょうか? 基本的な内容で申し訳ありませんが、何卒お願いいたします。 解決 2001年当時のADO.NET関連の機能や概念のために作られていまし「た」。 ・型付きDataSet, 型なしDataSet(join Select、DataTableのグループ化など) ・型付きDataTable, 型なしDataTable(DBのテーブルに対応) ・TableAdapter(単純なDBのテーブルへのCRUD操作の対応) ・データバインディング これは主に2つの視点から見ることができます。 2001年当時の、現在でいうORM自動生成機能(結局SQL直書きがmustなので流行らず※) DataGridViewなどWindows.Forms UIパーツとの双方向データバインド。MVVMのVM的 2番はDataGridViewなどでバインドが非常に便利なので、今でもよく使われます。 (EntityFrameworkやDapperで取得した内容を、わざわざDataTableに詰めなおす、などやったり…) 普通のコレクションもバインドはできますが、UI側が強制的にReadonlyになります。 ・List型 ・配列 etc. ※ 単純なSelect/Insert/Update/Deleteであれば、 TableAdapterのメソッド呼び出しでSQL自動発行されるのですが、 実業務でそんな単純に済むことが多くなく、結局SQL書いた方が早くね?ってなります。 回答者: Anonymous

Data manager を使ってshift jisで保管されたDB2でから日本語を正しく取得するには?

投稿者: Anonymous Data managerを使って、Shift-JISで保管されているDBから値を取得したいです。 Data managerから日本語の入ったデータを取得すると、文字化けしてしまっています。 どうしたらきちんと表示されるでしょうか? 解決 調べたところによると、JDBCはエンコードが指定できず、UTF-8で接続するため、このような現象が発生してしまうようです。 代わりに、ODBC接続をすることで文字化けしないようにできそうでしたが、java8からはodbcjdbcドライバが削除されてしまい、利用できません。 Java7以前を用いて、odbcから接続をすれば、文字化けしなくなるかもしれませんが、試してはいません。 回答者: Anonymous

python3+SQlite でPDFデータをINSERTするにはどうすればよいか

投稿者: Anonymous こんにちは。python3を使ってSQliteに接続し、PDFや画像データなどを登録したいと思っています(リンクを登録するのではなくデータを直接登録したいと考えています)。 blob型というものがあるというところまでは分かるのですが、 ・画像データ→blob型への変換はどうしたらよいか ・pythonでそれを実現するにはどうしたらよいか が分からず困っています。 自分なりに検索してみたのですがやり方が分かりません。 教えていただけると助かります。 よろしくお願いいたします。 解決 SQLite3はBLOBを標準でサポートしています。 Web上を検索するとpython2.xでbuffer(blob)を使ってバイナリを渡すサンプルコードが見つかりますが、python3ではバイナリデータを直接insertできます。 selectもバイナリデータをそのまま返してくれますので、バイナリを書き込めば画像を復元できます。 下記のサンプルコードの読み込み画像ファイルパスをpdfに書き換えるだけでpdfの読み書きも可能です。 import sqlite3 from contextlib import closing rf = ‘C:\test\read.jpg’ #読み込み画像ファイルパス wf = ‘C:\test\write.jpg’ #書き込み画像ファイルパス with closing(sqlite3.connect(‘blob_test.db’)) as db: #適当にテーブル作成 cursor = db.cursor() try: cursor.execute(‘create table img_table (img blob);’) except sqlite3.OperationalError: cursor.execute(‘delete from img_table’) #バイナリ読み込み with open(rf, ‘rb’) as f: blob…(Continue Reading)

beginトランザクションについて

投稿者: Anonymous こんにちは、beginトランザクションについてご質問したいです。 検証しますが、 phpでbegin;した後aというデータをdeleteした場合に、 そのプログラムが終わった場合は、deleteしないと思います。 ただ、そのbeginトランザクションもスクリプトが終了した瞬間に消えると思っています。 ブラウザから、ファイルを叩いて、トランザクションが残りロックがかかりっぱなしになったとかそういう可能性があるのでしょうか? そもそもbeginトランザクションの概念がわかっていません。 ないと思っていますが、可能性があるなら教えてください。 宜しくお願いします。 実際に確認したら、begin後、updateをした後にファイルを終了したら、updateが元に戻っていたので、戻る状態ですね。 しっかりとcommit、rollbackを意識していきます。 解決 ブラウザから、ファイルを叩いて、トランザクションが残りロックがかかりっぱなしになったとかそういう可能性があるのでしょうか? 私の知る限り、ほとんどのデータベースでは、開始されたトランザクションがcommit、またはrollbackされないまま接続が切断されたトランザクションは自動的にrollbackされます。 基本的にはこの動作が正常に機能している限りはロックがかかりっぱなしになることはないでしょう。 ただし、データベースやドライバ、スクリプトの実装方法や設定内容などにより結果は異なります。 例えば、1つのデータベースへの接続を1つのセッション内で共有している場合では1つのスクリプトが終了しても、セッションが切れるまで接続が切れないため、この時点では自動的にrollbackはかからず、ロックがかかりっぱなしになるでしょう。 一番確実なのは、トランザクションを開始したら、開始した処理が責任をもってcommitなりrollbackなりで終了させることです。 接続が切れることによる自動的なrollbackはフェールセーフ的な機能と認識し、それに頼るコーディングは避けるべきです。 また、「begin transaction」は「トランザクションを開始する」という意味です。 データベースにおけるトランザクションについては、説明すると長くなりますし、他にもっとうまく説明されている文献があると思いますので説明はそちらに譲りたいと思います。 いかがでしょうか? 回答者: Anonymous

Timestamp型・Date型・Time型等日付に関する型の使い分けについて

投稿者: Anonymous PostgresSQLを使用していますが、データベースのテーブル設計に関して、日付に関する型の適切な使い分けを知りたいです。 大は小をかねるではないですが、調べれば調べるほど日付に関する型は全部Timestamp型でも問題ないような気がしています。どういった場合にTime型やDate型を使用するのでしょうか? ※PostgresSQLのバージョンは8.4.17です。 ※2038年問題は考慮しません。 解決 まずは、きちんとしたリファレンスから見てみましょう。 8.5. 日付/時刻データ型 簡単にまとめると、(タイムゾーンやら浮動小数点表現やらのことは無視しておきます) timestamp 日付と時刻両方 date 日付 time 時刻 と言うことになります。 さて、ここで日付のみを表したい項目にtimestamp型を使用した場合、どうなるでしょう。当然比較などの場合、時刻部分を勘定に入れずに日付が同じであれば「一致」と判断したいわけです。 2つの対応方法をすぐに思いつくでしょう。 時分秒以下を表す部分は必ず0を入れることにする 比較の際は必ず時分秒以下を切り捨ててから比較する このような一種の「ルール」による回避は、一人の人間が各テーブルのカラム定義の隅々まで完全に把握していることができるような小規模システムでは十分機能するでしょうが、システムの規模が大きくなって、参加する開発者の数が増大するのに連れ、そう言ったルールを徹底するのはどんどん難しくなっていきます。(nowなんて便利な慣用句は「日付だけのつもり」のカラムに適用したからと言って、自動的に時分秒以下の部分に0を入れてくれたりしません。) 時刻のみを表すカラムにtimestampを適用した場合も概ね同様の問題が発生します。 また、こう言ったルールの不徹底によるバグは、「エラー等は出ずに動いちゃうけど、実行してみると、結果が思ったのとちょっと違う」と言う形で現れがちで、なかなか発見されにくく修正も困難になることが多いです。事実上DateTime型しか存在しないDBMS上で動くシステムでは、この手のバグ修正に悩まされたことが何度もあります…。 DBにデータを入れるにあたっては、他にも色々な「ルール」があるものなので、これだけで全てが解決するわけではありませんが、少なくとも程度の問題として、日付だけを表すカラムにはdate型、時刻だけを表すカラムにはtime型を使用することにしておけば、「ルール」に反したコードのせいで予期せぬことが起こる可能性を大きく減らしてくれる、と言って良いでしょう。 回答者: Anonymous

RDBのテーブルで、任意のどちらか片方のテーブルだけと関連付ける方法について教えてください。

投稿者: Anonymous 下記のような3つのテーブルの設計方法が知りたいです。 ・Issuesテーブル ・BugsCommentsテーブル ・FeaturesCommentsテーブル ・Issuesテーブルのカラム id ・BugsCommentsテーブルのカラム id, issue_id ・FeaturesCommentsテーブルのカラム id, issue_id IssuesテーブルがBugsCommentsテーブルとFeaturesCommentsテーブルの「どちらか片方だけ」と 関連したい場合、 アプリケーション側で管理する必要があると考えているのですが、 RDBの機能で整合性を担保してくれるような機能or設計はできますでしょうか? テーブルはSQLアンチパターンの6章ポリモーフィック関連を参考にしました。 解決 書籍SQLアンチパターンの記述に沿って説明を試みてみます。 前置き Issue, Bug, FeatureRequestクラス(p.52 5.1節 図5-2)をクラステーブル継承(p.62 5.3.3節)でテーブルへマッピングすると、Issues, Bugs, FetureRequestsで構成された次の形になります(p.78, 6.5.6節 図6-5)。 図5-2 Issueクラスツリー 図6-5′ Issueクラスマッピング(クラステーブル継承戦略) ここで登場するBugsに複数のコメントが付けられるようにするには、BugsとCommentsを1対多で関連付ければ良い(p.67 6章 図6-1)のですが、更にFeatureRequestsに対してもCommentsを付けたい場合にはどうしよう、というのが6章のテーマです。 図6-1′ BugsとFeatureRequest双方に同じテーブルについて1対多関連を追加したい 本章の結論では、交差テーブルBugsComments,FeaturesCommentsを導入し次のような形にする、としています(p.75 6.5.3節 図6-4/なお下図は書籍の図を上下反転していることに注意)。 図6-4′ 交差テーブルを導入したIssues, Comments関連 ところで、交差テーブルとして導入した2テーブルですが、これはCommentの派生クラスとみなすこともできます。 クラス図で表現すると次のようになります。 図6-4′ クラス図で表現 そして本書の次節の説明(p.78 6.5.6節)では、派生クラス同士の関連を基底クラス同士の関連に置き換えること相当を行っています(リファクタリング手法でいうところのプルアップ)。 クラス図で表現すると次のようになる操作です。 図6-5′…(Continue Reading)

GridDB: gs_stopclusterでクラスタが停止できない

投稿者: Anonymous GridDB V4.0 CEを使い始めました。 起動とクラスタ構成は成功したのですが、クラスタ停止でタイムアウトになってしまいました。 no_proxyの設定をいくつか試したのですが、エラーになります。 どのように対処すればよろしいでしょうか? $ export no_proxy=127.0.0.1 $ gs_startnode $ gs_joincluster -u admin/admin -c (clusterName) $ gs_stopcluster -u admin/admin Traceback (most recent call last): File “/bin/gs_stopcluster”, line 75, in <module> (res, code) = util.request_rest(method, path, data, options, log) File “/usr/griddb-4.0.0/bin/util.py”, line 81, in request_rest f = urllib2.urlopen(url, data, timeout=30) File “/usr/lib64/python2.7/urllib2.py”,…(Continue Reading)

悲観的ロックとトランザクション分離レベルの関係性がよくわからない

投稿者: Anonymous 悲観的ロックの例でよく登場する SELECT FOR UPDATE があります。 一方で、トランザクション分離レベルというものがあります。 トランザクション分離レベル – Wikipedia からトランザクション分離レベルについての説明の一部を引用すると ANSI/ISO SQL標準で定められている分離レベルは、下記の4種類で定義されている。 SERIALIZABLE(直列化可能) REPEATABLE READ(読み取り対象のデータを常に読み取る) READ COMMITTED(確定した最新データを常に読み取る) READ UNCOMMITTED(確定していないデータまで読み取る) とあります。 SELECT FOR UPDATEは上記4つでいうと、どれなんでしょうか?(SERIALIZABLEが該当?)それともまったく違う概念なのでしょうか? 解決 どのようにトランザクション分離レベルを実装するかが、RDB ごとに少し違っていた記憶があるので、 MySQL に限定して回答を行います。 MySQL においては、トランザクション分離レベルと SELECT FOR UPDATE は、共に、トランザクションを並列でさばくための機構です。 MySQL において、トランザクション間の整合性は、次のような原則で動作します。 トランザクションが一環した読み込みを行う必要がある場合(e.g. REPEATABLE READ)、整合性を担保するべき時刻(e.g. トランザクション開始時刻)と undo log を利用して、その時刻相当のデータを常に読み込む。 トランザクションが書き込みを行う場合、データベースの最新の値を更新する。競合する更新がある場合、それはロックによって排他制御を行い、トランザクション間の整合性が崩れないようにする。 これを実現するために、 MySQL(+innodb)は、 shared lock (読み取りロック)と exclusive lock (書き込みロック)を内部機構として持っています。 shared…(Continue Reading)

ひとつの検索条件に対して、複数のSELECTを実行するには、どんなクエリを作成するのがいいでしょうか?

投稿者: Anonymous データベースやSQLに関して、初心者です。おかしな質問していたらご指摘ください。 データ分析のため、サービスに登録したユーザーの情報を複数の切り口から確認したいです。 抽出対象のユーザーの情報のテーブル(users)とレコードは下記です。 sourceは登録元、statusは登録状態です。 +—-+—————+———————+———-+ | id | source | created_at | status | +—-+—————+———————+———-+ | 1 | google | 2020-08-11 00:00:00 | 1 | | 2 | yahoo | 2020-08-12 00:00:00 | 1 | | 3 | google | 2020-08-13 00:00:00 | 1 | | 4 | google | 2020-08-14 00:00:00 |…(Continue Reading)