CSS animationを使ってみよう!

css animationについて、あまり使う機会はありませんよね?
あったとしても、ローディングなどごく一部でしか使わないので、下記の参考サイトなどからコピーや微調整して使うことは多いのではないでしょうか?
codepen
 
今回は、css animation の基本的なところを改めて確認しようと思います。
まずはシンプルに円を作成します。
<div class="circle"></div>
.circle {
  width: 30px;
  height: 30px;
  border-radius: 30px;
  background: #2196F3;
}
  
その円をゆっくり移動しましょう。
まずはキーフレームの作成から始めます。
@keyframes example {
  0% {
    transform:translateX(0);
  }

  100% {
    transform:translateX(200);
  }
}
キーフレームを作成しただけではまだ動きません。
次ように円が表示されたと思います。

 
最後に.circleにanimationのプロパティを追加します。
.circle {  
  animation-name: example;
  animation-duration: 1s;
  animation-timing-function: ease-out;
  animation-delay: 0;
  animation-iteration-count: infinite;
  animation-direction: alternate;
  animation-fill-mode: both;
  animation-play-state: running;
}

次のように円がアニメーションしたと思います。

 

各animationプロパティについて

animation-name

要素にキーフレームアニメーションを適用するアニメーション名を指定します。
(今回は「example」です。)

animation-duration

アニメーション一回分の時間の長さを指定します。

animation-duration: 1s;



animation-duration: 3s;

animation-timing-function

アニメーションの動きの加減速(イージング)を設定します。
キーワード「ease-out」やcubic-bezierなどで指定します。
animation-timing-function: ease-out;



animation-timing-function: steps(3, end);



animation-timing-function: cubic-bezier(0.86, 0, .07, 1);



easingsについては下記が参考になると思います。
https://easings.net/ja

animation-delay

アニメーションの開始を遅らせる時間を指定します。

animation-delay:0;
Start
animation-delay:1s;(1秒後開始されます)
Start

animation-iteration-count

停止するまでにアニメーション周期が再生される回数を指定します

animation-count:infinite; (無制限に繰り返されます)
Start
animation-iteration-count:3; (3回繰り返されます)
Start

animation-direction

アニメーション再生の方向をしていします。

animation-direction:normal;(周期ごとに初回に戻ります)
Start
animation-direction:reverse;(逆方向に開始され、周期ごとに初回に戻ります)
Start
animation-direction:alternate;(毎回反転させます。初回は順方向になります。)
Start
animation-direction:alternate-reverse;(毎回反転させます。初回は逆方向になります。)
Start

animation-fill-mode

実行の前後にどう対象にスタイルを適用するかを設定します。

none
適用されているcssの初期値

forwards
最後の適切なキーフレームで定義された値を対象に適用されると同時に適用

backwards
最初の適切なキーフレームで定義された値を対象に適用されると同時に適用

both
forwardsとbackwardsの両方適用

animation-play-state

アニメーションが実行中か停止中かを設定します。

running
アニメーションが現在実行中になります

paused
アニメーションが現在停止します。

以上がCSS animationの基本的な使い方です!
このように分けて考えるとわかりやすのではないでしょうか?

次回はさらに詳しい内容をお伝えできればと思います。

Solrのパッケージ管理機能

はじめに

Solr 8.4 からパッケージ管理機能が追加されました。リファレンスによると、ここでいうパッケージは1つまたは複数のプラグインを1つにまとめたものという意味のようです。
Solr におけるパッケージ管理について調べました。

パッケージ管理機能

従来、プラグインを利用するためには
・jar ファイルを特定の場所に置く
・solrconfig.xml の lib ディレクティブで jar ファイルの場所を指定する
という作業が必要でした。

SolrCloud環境では、複数のノードでこの作業を行う必要があります。 jar ファイルのアップデートの際に異なるノードでのバージョン違いが発生するリスクもあります。

パッケージ管理機能により、複数ノードへのプラグインのインストールやアップデートを一括で操作できるようになります。

パッケージ管理を有効にする

デフォルトではパッケージ管理機能は無効になっているので、起動時のオプションを指定して有効にします。

bin/solr -c -Denable.packages=true

リポジトリを追加する

パブリックなSolrパッケージリポジトリというものは存在していないようなので、Solr のソースに含まれていた、以下のサンプルプラグインをローカルのウェブサーバでホストして試してみました。

$ ls solr-8.4.1-src/solr/core/src/test-files/solr/question-answer-repository/
publickey.der  question-answer-request-handler-1.1.jar.tmp
question-answer-request-handler-1.0.jar.tmp  repository.json
$ cp solr-8.4.1-src/solr/core/src/test-files/solr/question-answer-repository/* $DOC_ROOT/solr/repo/

ウェブサーバ上の特定のディレクトリがパッケージリポジトリであるとSolrに認識されるためには repository.json ファイルが必要であるようです。

$ cat solr-8.4.1-src/solr/core/src/test-files/solr/question-answer-repository/repository.json
[
  {
    "name": "question-answer",
    "description": "A natural language question answering plugin",
    "versions": [
      {
        "version": "1.0.0",
        "date": "2019-01-01",
        "artifacts": [
          {
            "url": "question-answer-request-handler-1.0.jar.tmp",
            "sig": "TTzgh5/usbyWg7oZ7lRwz4eQfh1FeXWvv4U85tsVthVz0MRDz9t7SmonDkegZ7OyqeoiQ4I207pifpVW+DRd9Q=="
          }
        ],
        "manifest": {
          "version-constraint": "8 - 9",
          "plugins": [
            {
              "name": "request-handler",
              "setup-command": {
                "path": "/api/collections/${collection}/config",
                "payload": {"add-requesthandler": {"name": "${RH-HANDLER-PATH}", "class": "question-answer:fullstory.QA\
RequestHandler"}},
                "method": "POST"
              },
              "uninstall-command": {
                "path": "/api/collections/${collection}/config",
                "payload": {"delete-requesthandler": "${RH-HANDLER-PATH}"},
                "method": "POST"
              },
              "verify-command": {
                "path": "/api/collections/${collection}/config/requestHandler?componentName=${RH-HANDLER-PATH}&meta=tru\
e",
                "method": "GET",
                "condition": "$['config'].['requestHandler'].['${RH-HANDLER-PATH}'].['_packageinfo_'].['version']",
                "expected": "${package-version}"
              }
            }
          ],
          "parameter-defaults": {
            "RH-HANDLER-PATH": "/mypath"
          }
        }
      },
      {
        "version": "1.1.0",
        "date": "2019-01-01",
        "artifacts": [
          {
            "url": "question-answer-request-handler-1.1.jar.tmp",
            "sig": "LypqlmbJ76AWa5jx0XhjKxO4lrcQAvpSuYddfzcE6TnX0VDPFhrlQHSSX6cZLtvNbQ+74xUMKgsoX1IUnEnKYw=="
          }
        ]
      }
    ]
  }
]

同じパッケージのバージョン違いがrepository.json で定義されています。

Solr稼働中に以下のコマンドでリポジトリを追加します。

$ bin/solr package add-repo question-answer http://localhost/solr/repo/

利用できるパッケージのリスト

インストール対象となるパッケージのリストを表示します。

$ bin/solr package list-available
Available packages:
-----
question-answer                 A natural language question answering plugin
        Version: 1.0.0
        Version: 1.1.0

インストール

$ bin/solr package install question-answer:1.0.0
Posting manifest...
Posting artifacts...
Executing Package API to register this package...
Response: {"responseHeader":{
    "status":0,
    "QTime":42}}
question-answer installed.

インストール済みパッケージの確認

$ bin/solr package list-installed
Installed packages:
-----
{
  "name":"question-answer",
  "version":"1.0.0"}

デプロイ

コレクションを指定してデプロイします。

$ bin/solr package deploy question-answer -collections test
Executing {"add-requesthandler":{"name":"/mypath","class":"question-answer:fullstory.QARequestHandler"}} for path:/api/\
collections/test/config
Execute this command (y/n):
y
Executing http://localhost:8983/api/collections/test/config/requestHandler?componentName=/mypath&meta=true for collecti\
on:test
{
  "responseHeader":{
    "status":0,
    "QTime":0},
  "config":{"requestHandler":{"/mypath":{
        "name":"/mypath",
        "class":"question-answer:fullstory.QARequestHandler",
        "_packageinfo_":{
          "package":"question-answer",
          "version":"1.0.0",
          "files":["/package/question-answer/1.0.0/question-answer-request-handler-1.0.jar.tmp"],
          "manifest":"/package/question-answer/1.0.0/manifest.json",
          "manifestSHA512":"a91ab5a2c5abd53f0f72c256592c2be8b667cecb8226ac054aeed4d28aac9d743311442f2d58539bb83663a19bd\
1efb310aaadfd77bea458f3d475161721a114"}}}}}

Actual: 1.0.0, expected: 1.0.0
Deployed on [test] and verified package: question-answer, version: 1.0.0
Deployment successful

repository.json の記述にしたがって /mypath で QARequestHandler が動くように Config API が呼ばれたことが分かります。
/mypath をリクエストしてみます。

$ curl http://localhost:8983/solr/test/mypath
{
  "responseHeader":{
    "status":0,
    "QTime":0},
  "responseHeader":[
    "version","1.0"]}

残念ながら QARequestHandler のソースを見つけることができず、具体的にどんなパラメータでどんな機能が使えるのかが不明ですが、デプロイできていることは確認できました。

パッケージのアップデート

$ bin/solr package install question-answer:1.1.0
Posting manifest...
Posting artifacts...
Executing Package API to register this package...
Response: {"responseHeader":{
    "status":0,
    "QTime":4}}
question-answer installed.
$ bin/solr package list-installed
Installed packages:
-----
{
  "name":"question-answer",
  "version":"1.0.0"}
{
  "name":"question-answer",
  "version":"1.1.0"}

同じパッケージの2つのバージョンがインストールされたことが分かります。

新しい方のバージョンをデプロイします。

$ bin/solr package deploy question-answer:1.1.0 -collections test
Package {
  "name":"question-answer",
  "version":"1.0.0"} already deployed on test. To update to {
  "name":"question-answer",
  "version":"1.1.0"}, pass --update parameter.
Already Deployed on [test], package: question-answer, version: 1.1.0
Deployment failed

失敗しました。
リファレンスを確認すると、上書きデプロイのときは –update オプションが必要とのことです。

$ bin/solr package deploy question-answer:1.1.0 -collections test --update
Executing http://localhost:8983/api/collections/test/config/requestHandler?componentName=/mypath&meta=true for collecti\
on:test
{
  "responseHeader":{
    "status":0,
    "QTime":1},
  "config":{"requestHandler":{"/mypath":{
        "name":"/mypath",
        "class":"question-answer:fullstory.QARequestHandler",
        "_packageinfo_":{
          "package":"question-answer",
          "version":"1.1.0",
          "files":["/package/question-answer/1.1.0/question-answer-request-handler-1.1.jar.tmp"],
          "manifest":"/package/question-answer/1.1.0/manifest.json",
          "manifestSHA512":"be22126df3fbb84284cdb94469fa0f83753961c066451f0b9107312d076f3f016e60fd279951656ee7ff4b17bc2\
57fbd2ce8950533c7d394b1080122f6461606"}}}}}

Actual: 1.1.0, expected: 1.1.0
Deployed on [test] and verified package: question-answer, version: 1.1.0
Deployment successful

今度は成功しました。
/mypath にリクエストを投げて、バージョン1.1にアップデートされたことを確認します。

$ curl http://localhost:8983/solr/test/mypath
{
  "responseHeader":{
    "status":0,
    "QTime":0},
  "responseHeader":[
    "version","1.1"]}

デプロイ中のパッケージをリストするコマンドもあります。

$ bin/solr package list-deployed -c test
Packages deployed on test:
{
  "name":"question-answer",
  "version":"1.1.0"}

おわりに

Solrのパッケージ管理機能の使い方を見てきました。次回はリポジトリを設定して自分で作ったパッケージを扱えるようにしてみます。

日本発のステーブルコイン「xcoin」を買ってみた

5月15日に日本発のステーブルコイン「xcoin」「xcoin wallet」サービスが始まりました。
このサービスは Exchangers Co.,Ltd.という会社が運営していて、その代表取締役はテレビなどで活躍されている竹田恒泰氏。
竹田恒泰氏のファンというのもありxcoinを購入してみました。

海外に行く予定や海外通貨で何かする予定もないので、今のところ、同氏がプロデュースする「利尻昆布ラーメン くろおび 」の宅配ぐらいでしかxcoinの使い道はありませんw が、今後、マスターカード利用加盟店でxcoinでの支払いが可能になるようだし、大手ポイントサービスとの連携の話もある模様。なかなか面白いサービスになるんじゃないかと思います。

ていうか、そもそもステーブルコインってなんぞ?

ステーブルコインは、安定した価格を実現するように設計された通貨です。
ビットコインをはじめとする仮想通貨暗号資産)は、ドルや円といった法定通貨と比較すると価格変動が激しくその実用性に課題があると一般的に言われています。
仮想通貨が広く普及する上でも価格の安定は大きな課題の一つとして考えられ、ステーブルコインはその課題を解決する通貨として考案されました。
引用「ステーブルコインとは 【bitFlyer(ビットフライヤー)】」

アメリカではテザーやリブラなどのステーブルコイン銘柄が既に市場を席捲していて、米ドルであれば1ドル=1コインとしてドル建てで発行、実際の資産の裏付けにより価格変動を安定させつつ決済・送金における仮想通貨の利便性を両立しているとのこと。中国もデジタル人民元のプロジェクトを進めているらしい(怖…

Cryptoslateによると、現在ステーブルコインに分類される仮想通貨を合わせると、時価総額にして80億ドルを超える規模になる。とりわけ、最も時価総額の多いステーブルコインのテザー(USDT)は、仮想通貨の時価総額ランキングで5位以内に入っている。
引用「『ステーブルコインの現状と将来性』Facebookの仮想通貨リブラ、中銀デジタル通貨台頭で業界再編へ【COINPOST】

xcoinは156種類のステーブルコインを取り扱う

Facebook が運営するリブラも「米ドル、ユーロ、英ポンド、シンガポールドル」の複数のステーブルコインを取り扱っているようですが、なんとxcoinは156種類ものステーブルコインを取り扱う。ぶっちぎりですねwwww今のところこの規模で取り扱うサービスはない模様。それが日本発というのもなんとも痛快!

日本なら日本円と同価値になるXJPY。米ドルなら同価値になるXUSDという感じでxcoinを購入できる。購入したxcoinは専用アプリの「xcoin wallet」で送金や交換などの管理がまるっとできる。しかも送金まではわずか4秒でできるのがすごいとのこと。

仕組みとしては以下のようなものらしい。

トークンの発行にはイーサリアムのブロックチェーンを活用しERC20トークンを発行する。なおこのブロックチェーンはパブリックでなく、プライベートチェーンとのこと。

通常パブリックなブロックチェーンはブロックの承認を文字通りパブリックにすることで取引が改竄されない信頼を担保している。

引用「竹田恒泰氏のエクスコイン社らが発表した156種類のステーブルコイン「xcoin」について考察 【 あたらしい経済】

日本発のステーブルコイン。せっかくだから応援してもいいじゃないですか

今の段階では国内でxcoinを利用した購買行動ができないので、PayPayなどの電子決済サービスの方がもちろん便利です。

将来的に、世界各国で自国通貨を裏付けにしたデジタル通貨を発行する動きになることは間違いないので、デジタル通貨プラットフォームであるxcoinはをそのまま吸収できるのが強み。
そんな日本製のプラットフォームが世界を席捲する可能性があるって考えるとなんだか夢がありますよね。

電子決済であれば国内での利用に制限されるけど、xcoinなら世界中どこでもxcoin walletひとつでマスターカードの提携店で決済できたり、交換や送金も手数料もなく簡単にできる。
国内の利用手段も大手ポイントサービスとの提携など色々な展開も期待できる。今はラーメンしか買えないけれどwww応援してもいいんじゃないかと思います。
興味があれば以下のリンクから公式サイトを覗いてみてください。

xcoin公式サイト

こちらの動画でもっと詳しく知ることができます。

【Solr】Date Mathの仕様をソースコードで確認する

Solr のリファレンスガイドでは Date Math においてどの時間単位がどういう表記で許されているかの仕様はあまり詳しくは説明されておらず、いくつかの具体例が挙げられているのみです。 例に挙がっていない時間の単位が使えるのかはどうかは試してみないと分かりません。

そこで Solr 8.4.1 のソースコードで仕様を確認してみました。

Date Math を扱うクラスを探して org.apache.solr.util.DateMathParser というクラスに行き当たりました。そのソースコードでは、扱える単位は以下のように定義されていました。

    Map units = new HashMap<>(13);
    units.put("YEAR",        ChronoUnit.YEARS);
    units.put("YEARS",       ChronoUnit.YEARS);
    units.put("MONTH",       ChronoUnit.MONTHS);
    units.put("MONTHS",      ChronoUnit.MONTHS);
    units.put("DAY",         ChronoUnit.DAYS);
    units.put("DAYS",        ChronoUnit.DAYS);
    units.put("DATE",        ChronoUnit.DAYS);
    units.put("HOUR",        ChronoUnit.HOURS);
    units.put("HOURS",       ChronoUnit.HOURS);
    units.put("MINUTE",      ChronoUnit.MINUTES);
    units.put("MINUTES",     ChronoUnit.MINUTES);
    units.put("SECOND",      ChronoUnit.SECONDS);
    units.put("SECONDS",     ChronoUnit.SECONDS);
    units.put("MILLI",       ChronoUnit.MILLIS);
    units.put("MILLIS",      ChronoUnit.MILLIS);
    units.put("MILLISECOND", ChronoUnit.MILLIS);
    units.put("MILLISECONDS",ChronoUnit.MILLIS);

まとめると以下のようになります。ミリ秒の異表記が妙に充実していますね。

  • 年 : YEAR,YEARS
  • 月 : MONTH,MONTHS
  • 日 : DAY,DAYS,DATE
  • 時 : HOUR,HOURS
  • 分 : MINUTE,MINUTES
  • 秒 : SECOND,SECONDS
  • ミリ秒 : MILLI,MILLIS,MILLISECOND,MILLISECONDS

週(WEEK)が見当たりませんが、近くに書かれているコメントによると、週については
/WEEK と書いたときの丸め処理(たとえば NOW/DAY と書くとその日の0時0分0秒になる)がややこしいので今のところ採用していないとのことです。

おうちでDIYチャレンジしませんか?

こんにちは、デザイナーのはなです。

お休みの日も外に遊びに行けない昨今、みなさんはどうやっておうち時間を過ごしていますか?

私はもとより多趣味で引きこもりなので、正直あまり以前の休日の過ごし方と変わっていません;

さて、私の多趣味のうちのひとつにDIYがあります。

この機会に新しく食器を置く棚を作りたいなと思っているので、おさらいがてら以前私が本棚を作ったときの過程を紹介したいと思います。

1.設計

 設計というと大層に聞こえますが、要はどんなものを作りたいか考える時間です。

大体こんな感じのものを作ろうかなと決めたら、ざっくり設計図を書きます。

こんなヘロヘロのフリーハンドでも大丈夫です。

左下のグレーの箇所に通販で購入した机を、右下の箇所にギターを置きたかったので、その大きさをもとにして全体のサイズなどを決めました。

また、どんな大きさの木材がいくつ必要なのか書き出しておくと、買い物がスムーズです。

2.材料調達

ホームセンターや通販などで、木材を始めとする必要な材料を調達します。

ホームセンターだと購入した木材をカットしてくれるサービスを行っていることが多いので、設計図をもとにすべての木材をカットしてもらいます。

また、木材は通販でも購入できます。

好きなサイズにカットしてくれるサービスもあるので、こんなときだからうまく活用したいですね!

https://www.rakuten.co.jp/mokuzai-o/

https://shop.woodworks-marutoku.com/

また、個人的におすすめしたいのが平安伸銅さんのDIYパーツです。

LABRICOという突っ張り棒パーツが有名ですね。

平安伸銅さんのサイトには、おしゃれなDIYパーツが色々揃っており、見ているだけで創造意欲がかきたてられます。

https://www.heianshindo.co.jp/labrico/

3.塗装

買ってきた木材に塗装を行います。

塗料にもいろいろありますが、置く場所や用途によってどの塗料を選んだらよいかが変わってきます。

室内用の本棚なら防水のことなどはあまり考えなくてもいいですが、食器棚となると①食品に触れるものが乗る②濡れているものが乗る可能性がある、などと少し注意が必要です。

ちなみに私はDIYのすべての工程の中で塗装が一番好きです。

4.組み立て

塗装した木材を組み立てていきます。

このとき注意したいのが、大きめのものを一人で作った場合、組み立てと設置の順番を間違えると詰むということです。

今回作った本棚の設計では、LABRICOを使用した木の柱を建てる必要がありました。

LABRICOなど突っ張り棒パーツを使用した棚などの作り方のサイトを見ると、先に組み立てをすべて行ってから設置すると書いてあることが多いですが、私一人では柱を二本以上同時に建てることができなかったため、L字金具をつけた柱を一本ずつ先に設置→棚板を設置 という順序で組み立て設置を行いました。

5. 設置

前項でも書いたとおり、組み立てと設置は順番を考えながら行います。

手伝ってくれる人がいるなら、素直に手伝ってもらったほうがいいと思います。

(私は父親に「お前一人では無理だ」と散々言われ腹が立ったので意地でも一人で完成させました)

設置したら完成です!

すごくいい感じに出来上がりました!

(趣味がバレバレで恥ずかしいところだけぼかしを入れました)

自分で作った棚だと愛着もひとしおです。

ちなみに青い壁紙は、貼ってはがせる賃貸用の壁紙のりを使って貼りました。

壁のどこか一面に壁紙を貼るだけで部屋の雰囲気がガラッとかわるので、こちらも手軽なDIYとしておすすめです!

まとめ

大規模なDIYとなると、やろうやろうとは言いつつなかなか始められなかったり、時間がかかるということに臆してしまう気持ちも出てくると思います。

ですが、作る作らないは置いておいて、とりあえず設置場所のサイズを図って必要な木材の枚数だけ出してみると、あれ?案外作れそうだな?という気持ちになってきます。

私も食器棚を作ろう作ろうと思いつつ、いろいろ忙しかったのもあって作り始められていなかったのですが、数少ない外出の予定が潰れまくっている今がまさに作りどきなのかなと思いました。

みなさんもこの機会に、少し手間のかかるDIYに挑戦してみませんか?