頭ン中

学んだことや興味を持ったことなど。

Gradleのideaプラグインで生成したideaプロジェクトにresourceフォルダを認識させたい。

環境

  • Gradle 4.1
  • IntelliJ IDEA Community Edition 2016.1.4 (Javaプロジェクト)

IDEAは2017.2.5でも確認。

目的

表題通り。gradle ideaで生成したファイルを使うとsrc/main/resourceがsourceフォルダとして認識されていたのが気になった。

f:id:kikuko72:20171012215837p:plain

調査

最初はIDEAプラグインの設定で出来るものと思っていた。 ……が、sourceとtestSourceの指定はあるがresourceの指定は無い……。

IdeaModule - Gradle DSL Version 2.2-20140924021627+0000

どうも、「IDEAはsourceとresourceの区別してなくね?」とのこと。

Support resource output directory configuration · Issue #1282 · gradle/gradle · GitHub

よろしい、ならば力技だ。

withXmlフックを使う。

第39章 IDEAプラグイン

IDEAのmoduleの管理はimlファイルがやっているらしい。

まずはGradleで生成したimlファイルとGUI上からresourceフォルダと認識させたimlファイルの差分を比較する。

IDEAから開くだけでも空白などの差分が出るが、目的の差分はシンプルだった。

<sourceFolder url="file://$MODULE_DIR$/src/main/resources" isTestSource="false"/>

<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />

確かにさっきのissueの通り、GUI上の見た目は変わるが、xml要素としては同じものっぽい。

type属性に"java-resource"がついていれば良さそう。

対処

ということでwithXmlフックを使ってtype属性に無理やり書き込む。

idea.module.iml {
    withXml { provider ->
        provider.node.component.content.sourceFolder
        .find { it.@url = 'file://$MODULE_DIR$/src/main/resources'}.@type = 'java-resource'
    }
}

完全に力技。

これでGradleに生成させたファイルをIDEAで読み込むと無事resourceフォルダとして認識された。

f:id:kikuko72:20171012221809p:plain

あとがき

無理やりやったのでimlファイルの取扱が変わると問題が起こるかもしれません。

【Android】【iOS】ルート証明書をインストールしてもcertificate_unknown

背景

Burpを利用して普段利用しているスマホアプリの通信を調べて見たかった。

結果

失敗。

メモ

公式手順通りやってAndroidChromeからはhttpsのページ(Google検索)が利用可能にはなっている。 一応iOSでも試してみてSafariから同様にGoogle検索は利用できた。

support.portswigger.net

が、ネイティブアプリからの通信は証明書を認識してくれず。以下のようなメッセージを返される。 TwitterとかGooglePlayとかでエラーになった。

Proxy    The client failed to negotiate an SSL connection to twitter.com:443: Received fatal alert: certificate_unknown

色々検索していると、中間証明書と見なされている場合があるっぽい?

dev.hinaloe.net

もしやこれかと、上記ページ同様の手順を試して見たところ、解決せず。残念。 CA証明書とは認識されているようなのでこれではないっぽい。

f:id:kikuko72:20170724232725p:plain

ここまでやってみて、ダメ元でTwitterで呟いて見たところ、 Firefoxが自アプリ内でルート証明書を管理しているらしいという情報が得られたので試してみる。

f:id:kikuko72:20170724233142j:plain

たしかにFirefoxはブラウザアプリだけど、他のアプリ同様インストールしたものを認識していない様子。 独自に証明書を管理しているアプリだと端末に追加したユーザーの証明書を見てくれない実装になっていることがあるっぽい。

でも、OSの証明書見ない実装ってそんなに普通なのかなー? 何かを見落としている気がする。

webviewを手がかりに検索すると、以下のようなページが。

y-anz-m.blogspot.jp

気になったのは以下の記述。

WebView で https で提供されている URL のサイトにアクセスしようとしたとき、証明書がオレオレ証明書だったり、Android にデフォルトで入っている信頼済証明書機関(trusted certificate authorities)に入っていない場合 SSL のエラーが発生し、処理がキャンセルされ white screen / empty screen (つまり真っ白画面)になります。

webviewはデフォルトのものしか見なくて、ユーザーのインストールしたものは見ないと言っている? あとでもうちょっとこの辺を調べたい。 アプリが実装してないとできないって結論になるかもしれないけど、 それでもいいので、正確な所を知りたい。

【Oracle】impdpでTABLE_EXISTS_ACTION=REPLACEを指定してもテーブル以外は置換してくれないっぽい

背景

あるスキーマのオブジェクトをまるごと他のスキーマへ移行したかった。

先行資料

すでにタイトルの内容を含んだ記事はQiitaにあった。

qiita.com

table_exists_action = replaceではテーブルを削除できても、ビューやパッケージなどのオブジェクトは削除できない。それらのオブジェクトを削除するコマンドは現在impdpにはないので、きちんとリカバリを実行するのならば、ビューやパッケージを削除するdrop文を作るかスキーマ自体を一度削除してからimpdpするしかない。

この記事の目的

上記記事と同じことを書いても仕方ないので、公式ドキュメントの記載とか、他のスキーマへの移行とかその辺を調べます。

公式ドキュメントの記載

たしかにTABLE_EXIST_ACTIONは表に限定してるっぽい書き方。 他のオブジェクトではないとまでは明示的に書いていないが、オプションの説明の内容を見ても表限定っぽい。

TABLE_EXISTS_ACTION

用途

インポート・ユーティリティに対して、作成しようとしている表がすでに存在する場合に行う操作を指定します。

結局、他のスキーマへ移行するには

権限があればユーザーごと作り直しがはやそう。(DBAs-Oracle.com: How to Restore schema using Impdp)

そこまでの権限がないユーザーの場合は、user_objectsからdrop文を生成してdrop後、 recyclebinを掃除?(sql - Delete all contents in a schema in Oracle - Stack Overflow)

user_objectsからまるごとdropしてもディレクトリオブジェクトが巻き込まれてインポートできなくなる心配はなさそう。

CREATE DIRECTORY

すべてのディレクトリは1つのネームスペースに作成されるため、個々のユーザーのスキーマで所有されるわけではありません。ディレクトリに対するオブジェクト権限を特定ユーザーに付与することによって、そのディレクトリ構造内に格納されているBFILEへのアクセスを制限できます。

雑記

1.用意してもらった環境を使ってるだけだとわからないことも多い。でも自分がインフラやDBAをやりたいかというとまだわからない。

2.調べる過程で論理バックアップと物理バックアップという分類があることを知った。

3.無効なユニークインデックスがあるとインポートできないなんて制約があったのね。

データ・ポンプでは、無効な一意索引を持つ表は、ロードされません。データを表にロードするには、その索引を削除するかまたは再度有効にする必要があります。

4.結局なんでテーブルだけTABLE_EXISTS_ACTION=REPLACEみたいな指定ができて、他のオブジェクトはできないのかはよくわからなかった