エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

Swiperを使ってみた

きっかけ

ルーセルスライダーでリストを表示したかったので調査した結果、swiperってライブラリが良さそうだったので、使ってみた。

公式サイト

swiperjs.com

実装内容・説明

Typescript使っているので、それに合わせて実装
jsの情報はいっぱい出てきたけど、typescriptは、あんまりなかったので、手探りだった。。。

動きは、全部swiperが付けてくれるので、こっちは、動きの定義とレイアウトの定義をしてあげるだけ。

完成イメージ

趣味全開で作ってるので、ご了承下さい。

html

まずは、見た目側
面倒くさいから、作ったので全部載せる。

<!DOCTYPE html>
<html lang="ja" class="h-100">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <meta name="Description" content="Enter your description here"/>

  <script src="/js/youtube.js"></script>
  <link rel="stylesheet" href="/style.css">
  <link rel="stylesheet" href="/youtube.css">
  <title>GalwWing</title>

</head>
<body class="h-100 bg-light">
<!-- 全ページを囲む要素 -->

<main class="h-100">
  <!-- サイトバーメニュー -->
  <!-- サイトバーメニュー -->

  <!-- 全ページの右のコンテンツ -->
  <div class="page-content main w-100">
    <div id="youtube">
      <div id="player"></div>
    </div>
  </div>

  <!-- Slider main container -->
  <div class="swiper">
    <!-- Additional required wrapper -->
    <div class="swiper-wrapper">
    </div>

    <!-- If we need pagination -->
    <div class="swiper-pagination"></div>

    <!-- If we need navigation buttons -->
    <div class="swiper-button-prev"></div>
    <div class="swiper-button-next"></div>

    <!-- If we need scrollbar -->
    <div class="swiper-scrollbar"></div>
  </div>

</main>
</body>

</html>

重要なのは、<div class="swiper">とその中の定義。
基本的に、公式サイトで乗ってるレイアウトそのまま貼り付ければ、行けるはず。
リストで表示したいデータを、<div class="swiper-wrapper">に追加してやる必要がある。
とりあえず試す場合は、公式サイトに以下のようなサンプルが記載されている

<!-- Slider main container -->
<div class="swiper">
  <!-- Additional required wrapper -->
  <div class="swiper-wrapper">
    <!-- Slides -->
    <div class="swiper-slide">Slide 1</div>
    <div class="swiper-slide">Slide 2</div>
    <div class="swiper-slide">Slide 3</div>
    ...
  </div>
  <!-- If we need pagination -->
  <div class="swiper-pagination"></div>

  <!-- If we need navigation buttons -->
  <div class="swiper-button-prev"></div>
  <div class="swiper-button-next"></div>

  <!-- If we need scrollbar -->
  <div class="swiper-scrollbar"></div>
</div>

typescript

どちらかというと、こっちの実装で苦労した。
webpackが絡んでくると、typescript系の実装は、敷居が10段くらい高くなるんだよね。。。

まずは、npmでモジュールをインストール

npm install swiper

実装しているクラスが、雑音多いので、実装部分だけ抜粋。

// import Swiper styles
import 'swiper/css';
import 'swiper/css/navigation';
import 'swiper/css/pagination';

// コアバージョンに加えて、ナビゲーションとページネーションを追加する
import Swiper, { Navigation, Pagination, SwiperOptions } from 'swiper';

// モジュールを使用可能に
Swiper.use([Navigation, Pagination]);

// 省略

window.onload = () => {
  const swiperParams: SwiperOptions = {
    direction: 'horizontal',
    slidesPerView: 3,
    spaceBetween: 50,
    loop: false,
    autoplay: true,
    pagination: {
      el: '.swiper-pagination',
    },
    navigation: {
      nextEl: '.swiper-button-next',
      prevEl: '.swiper-button-prev',
    },
    scrollbar: {
      el: '.swiper-scrollbar',
    },
  };

  const swiper = new Swiper('.swiper', swiperParams);
};

SwiperOptions で動きを定義。
paginationで、位置情報の「・・・」みたいなやつを表示するタグを指定。
nabigationは、移動するためのボタンを表示するタグを指定。
scrollbarは、なんだっけ。。。?思い出せん。。。
あと、cssのインポートとuseでswiperに使う情報を連携してあげる必要がある。
cssの定義は、webpackに起因してくるので、おまじない程度に考えてもらえればいいはず。

公式サイトだと、directionverticalになっているけど、それだと「・・・」が縦に出てきてしまうので、イメージと違うから、horizontalを指定。

あとは、なんとなくのイメージで分かると思うから、大雑把に説明(今までの説明も大雑把な気がするが。)
slidesPerView:画面に表示するデータ数
spaceBetween:データの感覚 loop:最初と最後の要素に来た際、サイクルさせる。falseにすると、ボタンが非活性になる。
autoplay:動きをちゃんと検証してないけど、たぶん、自動で移動してリストの内容を見せてくれると思う。

Swiperのインスタンス生成するときにオプションとswiperの定義をしているタグを指定することで、完成イメージの表示になる。
ただ、最後の難問として、webpackの定義がいる。

webpack

はっきり言って、typescriptを難しくしている犯人は、webpackだと思っている。
typescriptの環境作れていること前提で話すが、必要な部分はcss-loader付近の定義

const config = {
  module: {
    rules: [
      {
        test: /\.(ts|tsx)$/i,
        loader: 'ts-loader',
        exclude: ['/node_modules/'],
        options: {
          transpileOnly: true,
          configFile: process.argv.mode === 'production' ? 'tsconfig.json' : 'tsconfig.dev.json',
        },
      },
      {
        test: /\.css$/i,
        use: [stylesHandler, { loader: 'css-loader', options: { url: false } }],
        sideEffects: true, // production modeでもswiper-bundle.cssが使えるように
      },
      {
        test: /\.(eot|svg|ttf|woff|woff2|png|jpg|gif)$/i,
        type: 'asset',
      },

      // Add your rules for custom modules here
      // Learn more about loaders from https://webpack.js.org/loaders/
    ],
  },
  resolve: {
    extensions: ['.tsx', '.ts', '.js'],
  },
};

この定義を入れることで、最終的にビルドしたjsに、cssの定義を含めることができるはず。。。
なんとなく、雰囲気で実装してる。たしか、以前調べたときに、そんなだった気がする。
ライブラリにcssが含まれているときに、htmlにnode_moduleのパス書きたくなかったので、この定義をした気がする、全然気にならない人は、typescripでインポートしたファイルへのパスをhtmlで定義してやれば、webpackに書かなくてもイケる気がする。
個人的に、そのやり方は気に食わないが。

参考サイト

雑記

jquery非依存は、探せばあるものだな。
以前に関わったプロジェクトで、jquery起因でパフォーマンスが出ない事例を聞いていたので、なるべく避けるようにしているが、jquery非依存ライブラリの日本語の情報は、まだ少ない気がする。
あとは、定義の仕方で悩むことが多かった。
いろんなのが起因してビルドエラーになっていたり、ビルド忘れていて定義が反映されないから、定義内容を何度も見返したりしていた。
PONに気づくと、アハ体験が起きたあとに、落胆するんだよね。。。
他の人は、どうなんだろう?怒りが湧くのか、笑ってしまうのか、落胆するのか、あるいは、別の反応が起こるのか。

GWは、ホロライブの動画を結構見た気がする。
ホロライブを見ると沼にハマるって意味が分かったわ。。。
きっかけがあると、人間関係が見えてくるようになって、他のホロメンの動画を見てしまい、その連鎖が止まらなくなるんだよね。。。

youtubeのUIが、最近、気に食わないのだが、俺だけ?
あと、チャットがウザいから非表示にしたいんだけど、設定で非表示にできないのかな?
たぶん、あれのせいでパフォーマンス落ちてる気がするんだよね。。。
マシンスペック上げられればいいんだけど、cpu交換って、なんか怖い。

Githubでissueのテンプレートを設定する

調査日付

2022.05.02

やり方

Settingページから、中段くらいにあるfeature/Issueの「Set up template」を押下する

「Add template: select」 から、テンプレを選択して修正する ちなみに、デフォルトで用意されているテンプレの意味

  • Bug report:バグレポート
  • Feature request:機能要望
  • Custome request:カスタマイズ

バグレポート/機能要望以外を追加する場合は、カスタマイズ選んで変えればいい。
バグレポート/機能要望は、フォーマットがある程度準備されているので、欲しいレイアウト次第だと思う。
英語は分かりにくい等あれば、ここで日本語に編集しておけばいい。

追加し終わったら、「Propose changes」で、コミットして、テンプレート変更内容を反映させる。

ちなみに、自分のfeature requestのテンプレート設定

# 概要

# 理由・目的

# 実装方針

## タスク

- [ ] 細かいタスクに分解できているなら書き出す

# 参考

## サイトURL

## 資料

雑記・感想

git使ってると、個人プロジェクトでも、後々、これはどういう意味だっけ?ってなるので、できれば、テンプレートを利用して、情報を整理して書く癖をつけておいた方がいいと最近思った。

まとまった休暇を取れた場合、久々に機能追加してくと、過去の自分が何を書いたのか、全くわからない状態になってしまって、必死に何を書いたか思い出すのに時間がかかったのが悔やまれる。。。
もっと休みを有意義に使いたかった。。。

参考サイト

Githubにissueのテンプレートを作成する方法|Koushi Kagawa|note

【github】issueを複数テンプレート化してissueを整理しよう! | 2055年からきたごんじっち

オレオレ GitHub Issue テンプレートを晒す - ほとラボ

【翻訳・要約】Javascript vs Typescript

参考サイト

dev.to

経緯

typescriptよく使っているので、改めて違いを把握しておきたく読んだ

内容の超要約

  • JavaScriptとは?

  • Typescriptとは?

    • すべてのJavaScriptライブラリおよびフレームワークと互換性あり
    • コードの複雑さが増すにつれて、JavaScriptOOP要件を満たす必要があり、それを書いけするためにTypescriptが開発された
    • コード開発の高速化に役立つ

個人的見解

Typescriptのメリットは、前述してあるとおり、OOPの概念を理解していれば、使いやすい点。
Java触ってたら、学習コストは、幾分か少なくなる。

ただ、パフォーマンス解析するときは、Typescriptだと苦労した経験がある。

あと、互換性があるというが、全部互換があるわけではない。
一部、有名なFWでも、メンテがされてないと、クラス定義ファイルがなくて苦労するケースがあった記憶がある。

ただ、開発が早くなるのは、実感としてある。
クラス定義ファイルをちゃんと作りながら開発すること前提ではあるが、

2022/04/11週 気づきと振り返り JSPで発狂しそう

業務こなしての問題・気づき

Java

共通部品は利用者の想定を裏切らないようにする

なんか、名前から連想する期待値と結果が違うと、すごく萎える。。。

名前は、最小限の範囲になるようにネーミングしておいてほしいと感じる。

JSPのエラーは分かりづらい

JSPで画面出力しているのだが、html生成でヌルポ発生しているのは分かったのだが、原因が全くわからない事象によく遭遇する。。。
それが発生するのは、カスタムタグであることが多い。
俺の技術力が足りないのか?と思ってしまうが、大抵、ちゃんとエラーハンドリングしてないカスタムタグ作成者が悪いと思うんだよね。

最終的に、コード見直して原因分かったけど、カスタムタグでの例外は、トレーサビリティが低いのでtry-catchで全例外をラッピングするようにして欲しいと思いました

SpringBootで定期処理の実装

経緯

RSSリーダーを作ったのだが、フィードの更新が手動なので、自動更新にしたく、いろいろ調べた

実装

@Scheduled で指定できる。

自分は、cronで1時間毎に起動したかったので、下記の通りに実装
コードに下手書きは、流石にないわぁーと思ったので、設定ファイル(application.properties)に記述

@Component
public class AutoUpdateTask {

  @Scheduled(cron = "${update.scheduler.cron}")
  public void allUpdate() {
    // ・・・
  }
}
update.scheduler.cron=0 0 * * * *

設定内容は、0分0秒時に起動するように定義。
そうすることで、1時間毎に起動するはず。

あとは、mainクラス(SpringApplication.runを実行しているクラス)に、@EnableSchedulingをつけるだけ。
最初、起動しないから、定義を何回も見直したけど、スケジューリングが有効になってないことに気づいて台パンした。

感想・雑記

久しぶりにcron書いた気がする。
普段、全く使わないからな。。。

そういえば、実際の開発でも、1回しか使ったこと無いな。。。

この定義したのはいいのだが、確認方法が難しい。。。
実際に動かして試してるんだけど、他に確認方法ないのか?
ユニットテストで確認したいのだが、検索した感じ、見つけられなかった。

参考リンク

https://reasonable-code.com/spring-boot-scheduling-tasks/

Spring Boot @Scheduled アノテーションで定期実行 - 公式サンプルコード

スケジュール機能を使ってみよう編|SpringBootに入門するための助走本(Zenn改訂版)

1時間置きに実行する|cronの設定・書き方🕒

「GAFAエンジニアはどれぐらいタイピングが速いのか?」の感想

視聴した動画

www.youtube.com

感想・ポエム

タイピングが業務の大半を締めないのは、実際の業務すると分かる。
考える時間の方が長い。
だけど、外部の人は、それが分からんのです。。。
考える時間を軽視している感じがする。
特に日本は、製造業が強いせいか、考える時間を考慮されない感がする。
海外では、どのように考えられているのか気になる。
実際のコーディングだと、タイピングより、どれだけコード補完をうまく使えるかの方が重要そうな気がする。

タイピングが生きるのは、コードレビューとかの対面時だと思う。
今、teamsで画面共有して話すことがあるのだが、そのときにタイピングが遅いと、イライラする事がある。
遅いままでいいと思うのは、ダメ。ある程度のタイピングスピードは必要

自分の中での結論

  • 業務でタイピングは、それほど重要ではない
    • コード補完をうまく使う方が大事
    • タイピング時間 < 考える時間
    • ソフトウェア開発は知的生産性が重要
  • 遅いと人を苛つかせることがある

気になった記事の感想:コードレビューで嫌われる人の特徴7選

記事を書くに至った経緯

記事を読んでいて感化されたのと、個人的な考えを書き出したくなったため

リンク

コードレビューで嫌われる人の特徴7選 - Qiita

思ったこと

レビューを受ける人(レビューイ)

人とのやり取りだから、人格攻撃がやっぱりダメだよね。
受ける人の行動も重要だと思う。
指摘を受けた結果、どう動くのかも重要。言われたまま素直に直していると、たぶん、実力は伸びないと思う。なぜそうするのか、なぜ今の実装ではダメなのかまで考えないと、力にならないと思う。

やっぱり、気持ちがマイナスになる人が多々いるようだな。。。
人間関係に影響が出てくるのが、今のレビューの問題な気がする。
レビューのシステム化は、人間関係に影響しないから、有効ではなかろうかと再認識できる。
sonarやlintは、これからも伸びていくだろうなと思う。
個人的な考えとしては、指摘事項をボカロとかが読み上げてくれると、やる気が出る。見た目がいいものだと尚良。
おっさんに指摘されるより、2次元の美少女に指摘される方がやる気が出ると思うんだよね。
ちなみに、自分は男女平等を重んじるので、↑でいっている「おっさん」は、おばさんも含む

コードレビューを「行う」人(レビューア)

最近は、こっちの立場でやることが多い。
レビューイもそうだが、レビューアも人格攻撃しちゃダメだよね。
口調や呼気、文脈に注意を払わなければいけないのが、結構辛たん。。。

特に、指摘するときは、理由とセットで説明するのは必須。
理由がなければ、同じことを繰り返す可能性高いからな。
レビューイの成長につながらないってのもある。

アクションプランが、見ていて面白かった。
なんというか、小学校の宿題で、先生がコメントする感じっぽいなぁ~と思った。
小学校のころは、指摘だけじゃなくて、褒めも適度に入れてくるからな。
レビューアは、小学校の先生になったつもりでやればいいのではないか?と思いました。
※舐めプ的なことは、しちゃダメ

レビューは、人間関係に影響が少なからずでるのが面倒くさい。
もう、2次元の代理人を立てたほうがいいんじゃなかろうかと思ってる。
レビューア・レビューイに2次元キャラを間に挟めれば、マイルドになると思うんだけど、俺だけかな?

参考リンク

https://wa3.i-3-i.info/diff108review.html