いろいろやる課、書く係

いろいろなことを、たんたんと記録するブログ

SQL Server Management Studioのレコード編集、上位200件じゃなくて任意の検索結果でできるんだって

知らなかったよ……

かなりの行数があるテーブルで、そこそこの量の特定のレコードの値を更新しなければならず、任意のSQL叩いた結果を編集できんのかね、とググったら、ありましたよ。

www.dbsheetclient.jp

できるってよ。今まで上位200件で事足りてたので、横着して調べていなかったんだ……

手順としては、まず「上位200件の編集」を実行してから、SQLペインを開いてSQLを好きに書き換えて実行です。

かんた~ん。

ただしF5でSQLの実行はできなかったので、ツールバーSQL実行ボタンを探して押しました。

楽~!!!

 

 

C#のフォームで、特定のフォルダ内にある動画を連続再生したい

とりあえず、Windows Media Playerを使うことにしまして。

手順!

1.ツールボックスWindows Media Playerコンポーネントを追加

こちらを参考にしました

www.kyoukasho.net

 

2.追加したコンポーネントツールボックスからフォームにドラッグして追加

Timerも追加する(ドラッグしてフォームの上に落とすと、フォーム外の下に表示されるので、そうなればOK)

 

3.あとはコード書く

こちらを参考にしました

www.chuken-engineer.com

変えたのは以下の点。

・this.Bounds = new Rectangle(0,0,1920,1080);

の部分は削除(DockでFillにしてるからいいかなーと)

あとフォームは最大化してます。

 

・動画のフォルダはトップフォルダしか見ない(サブフォルダは見ない)

System.IO.SearchOption.AllDirectories→TopDirectoryOnly

一時的に要らないファイルを退避しておくのに、よくサブフォルダつくって放り込んでおくので……

 

・ファイルが終了しても頭のファイルに戻る仕様になっていますが、わたしは最後のファイルを再生したらフォームを閉じるように修正しました

 

おわり。

AWSの無料期間が切れたぞ

無料期間、5月末までだったわぁ~~~(何度かメールでお知らせ来るので、ただのわわたしの横着)

と慌ててAWSの中身を削除するなど。

お勉強でハンズオン動かしてたくらいの使い方なので、料金は発生しないはずですが、ビビりなので……

オブジェクトの削除に依存関係などあるんだろうか……とドキドキしながら削除していきましたが、S3のオブジェクトがないので削除できないよーってAppSyncだったかAmplifyだかに言われましたが、とりあえず放置してたら消えてました。めでたしめでたし。

削除してもすぐに消えないものもあるので、ドキドキしちゃいますよね。

IAMのロールで消えないのあったけど放置。ポリシーもたくさんあるので放置。ポリシーは料金発生しないようなので。

料金発生しているかどうかは、請求およびコスト管理コンソールを確認すればいいようだ。

以下を参考にしました。

aws.amazon.com

なおルートアカウントは削除してません。なんとなく。

KotlinでRecyclerViewをスクロールさせたときにtoolbarが隠れるようにしておくと、Fragment遷移後でも消えたままになるので、強制表示させる

まぁ、スクロールしても隠れないようにしておいてもいいんだけれど、スクロールするくらい量があるんだから、ツールバーかくしてデータの表示領域広くしてあげたほうがよいかなって思いまして。

なお参考にしたのはこちらの記事。

medium.com

 

以下、手順。

1.Basic Activityテンプレートで新プロジェクト作成

※ビルドでエラーが出たらこちら参照

sakimika.hateblo.jp

 

2.Floating Buttonは要らないので関係個所削除

わかんなければ先に進んで、赤線出た箇所を削除

 

3.こちらの記事を参考に、FirstFragmentにRecyclerView追加

hirauchi-genta.com

ただし、MainActivity.ktはFirstFragment.ktに読み替え。(#OnCreateも#OnViewCreatedに読み替え。)

activity_main.xmlも、fragment_first.xmlに読み替え。

 

4.RecyclerViewの中身を追加(FirstFragment.kt)

画像は適当にします(res > drawble > 右クリック> New > Vector Asset で適当なのを追加して、全部それにするとか)

スクロールが必要なほどの行数が欲しいので、美しくないけどささっとこんな感じにした

mAnimalList = arrayListOf(dog, cat, elephant, horse, lion)

mAnimalList = arrayListOf(dog, cat, elephant, horse, lion, dog, cat, elephant, horse, lion)

 

5.スクロールでtoolbarが隠れるようにする(activity_main.xml

赤字部分を追加

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/Theme.MyApplication.PopupOverlay" />

 

6.行クリックでSecondFragmentに遷移するようにする

CustomAdapter.ktに以下を追加

    private inner class ItemClickListener : View.OnClickListener {
        override fun onClick(view: View) {
            
            Navigation.findNavController(view)
                .navigate(R.id.action_FirstFragment_to_SecondFragment)
        }
    }

#onCreateViewHolderに赤字部分追加

    override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(viewGroup.context).inflate(R.layout.list_item, viewGroup, false)
        view.setOnClickListener(ItemClickListener())
        return ViewHolder(view)
    }

 

7.FirstFragmentでtoolbarが消えるまでスクロールし、行クリックで画面遷移すると、toolbarが消えたままであることを確認

 

8.AppBarLayoutにid追加(activity_main.xml

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/appBar"
        android:theme="@style/Theme.MyApplication.AppBarOverlay">

 

9.MainActivity.kt#onCreateに以下を追加

        val navController = findNavController(R.id.nav_host_fragment)
        navController.addOnDestinationChangedListener { _, destination, _ ->
            findViewById<AppBarLayout>(R.id.appBar)?.apply {
                setExpanded(true, false)
            }
        }

 

10.FirstFragmentでtoolbarが消えるまでスクロールし、行クリックで画面遷移すると、toolbarが強制的に表示されることを確認

9をすると、Navigationを使ったすべての遷移についてそうなるけど、Fragment個別にしたい場合は

        navController.addOnDestinationChangedListener { _, destination, _ ->
            when (destination.id)
            {
                R.id.SecondFragment ->
                    findViewById<AppBarLayout>(R.id.appBar)?.apply {
                        setExpanded(true, false)
                    }
            }
        }

とするか

そのFragmentのonViewCreatedで

        (activity as AppCompatActivity).findViewById<AppBarLayout>(R.id.appBar)?.apply {
            setExpanded(true, false)
        }

とする。

 

なお、Fragment使ってるバージョンでお届けしましたが、Fragment使ってないぜ!って場合は、何かしらのactivity#onCreateで

        val appBarLayout : AppBarLayout = findViewById(R.id.appBar)
        appBarLayout.setExpanded(true, false)

こうかな……

Android StudioのAVDをDドライブに移行

Cドライブ整理の続き。

sakimika.hateblo.jp

 

Android StudioのAVDを移す。これもユーザーフォルダにあるんだなぁ。

www.javadrive.jp

1.DドライブにAVDを保存するフォルダ作成

2.システム環境変数でそのフォルダを設定

3.新しいフォルダにAVDファイルを移動

4.移動後、設定ファイル内のパスを変更

5.Android Studio起動確認

できた。終わり。

 Cドライブ1/3くらい空いた。

 

なお、容量を食っているフォルダを簡単に確認する方法

www.gigafree.net

Androidの.gradleも食ってるけど、3.5GBか……まぁいいか。

やらなかったけど、Android Studio周りのファイルの移動についてはこちら。AVDのことも書いてる。

suihan74.github.io

ThunderbirdのメールデータをDドライブに移行

何にも考えないで全部Cドライブにバカスカ入れていたら、Cドライブがいっぱいいっぱいになっており……

そしてガラガラのDドライブ……なんてこと

 

受信メールが多いので、動きが緩慢になり始めているメールから着手。

こちらを参考にしました~

www.1-firststep.com

Thunderbirdのメールデータってデフォルトだとユーザーフォルダにあるんだな……

上記記事には書いていないので補足ですが、メールがバカスカ届くタイプの方は、作業前にメールの自動受信を止めておくのが吉。

アカウント設定 > サーバ設定

「新着メッセージがないか起動時に確認する」

「新着メッセージがないか○分ごとに確認する」

のチェックを外しておく。

なお、移動したのは「Profiles」フォルダの中にあったデータだけで、「profiles.ini」という設定ファイルは、そのままの場所においてあります。

 

次は、Android StudioのAVDを移す。sakimika.hateblo.jp

 

 

 

アプリからメールが飛ばなくなった「SMTP ホストが見つかりません。」

あるPCに仕掛けているアプリから出しているメールが飛ばなくなった。

ログを確認すると、ある時から急に飛ばなくなっている。

エラー内容は

SMTP ホストが見つかりません。」

ping 打ってみると、IPアドレスが返ってこない……はて?

なお同じアプリをほかのPCにも入れているが、そちらは正常稼働。設定ファイルも問題ない。

さてわたしの知識ではここで限界であるので、ネットワークエンジニアさんにお伺いすると、そのPCのルーター2つのうち、1つ(ルーターA)が落ちているのではないかと。

デフォルトゲートウェイは稼働している方(ルーターB)に切り替わっている(そういうアプリを入れている)ので、ネット接続は可能となっているが、PCの設定でDNSサーバーをルーターAにしか設定していなかったので、DNSが引けなくなっていた、と。

なるほど。

PCは遠隔地にあるためすぐにルーターの確認ができないため、対応として、DNSサーバーの設定のセカンダリーに、ルーターBを入れてもらった。

あとは現地に行くときに機器は確認してもらうとして、今後は、PCの設定をするときに、DNSサーバーのプライマリーだけじゃなくて、セカンダリーも設定しましょう、というお話。