OmniAICreator/Qiita-1.07M huggingface dataset:
PyTorchMobile-iOSで速度比較　「CPUのみ」「CoreMLバックエンド」「Metal」最速は？

#TorchMobileでGPUパワーを使う

MobileNetv2をiPhone11で実行。
CPUのみ、CoreMLバックエンド、Metalバックエンドを比べてみました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/e73da8eb-8f26-8c08-e46c-db89988cc95a.png", width=400>

#PyTorchモバイルを高速で使いたい

#CoreMLバックエンドもしくはMetalが使える
CoreMLバックエンドやMetalを使用するようにモデルを設定できます。
これでデバイスのGPUやニューラルエンジンを使えるようです。

https://github.com/pytorch/ios-demo-app

#変換方法

CPU

```python
import torch
import torchvision
from torch.utils.mobile_optimizer import optimize_for_mobile

model = torchvision.models.mobilenet_v2(pretrained=True)
model.eval()
example = torch.rand(1, 3, 224, 224)
traced_script_module = torch.jit.trace(model, example)
torchscript_model_optimized = optimize_for_mobile(traced_script_module)
torchscript_model_optimized._save_for_lite_interpreter("HelloWorld/HelloWorld/model/model.pt")
```

CoreML

```python:mobilenetv2.py
import torch
import torchvision

from torch.backends._coreml.preprocess import (
    CompileSpec,
    TensorSpec,
    CoreMLComputeUnit,
)

def mobilenetv2_spec():
    return {
        "forward": CompileSpec(
            inputs=(
                TensorSpec(
                    shape=[1, 3, 224, 224],
                ),
            ),
            outputs=(
                TensorSpec(
                    shape=[1, 1000],
                ),
            ),
            backend=CoreMLComputeUnit.ALL,
            allow_low_precision=True,
        ),
    }


def main():
    model = torchvision.models.mobilenet_v2(pretrained=True)
    model.eval()
    example = torch.rand(1, 3, 224, 224)
    model = torch.jit.trace(model, example)
    compile_spec = mobilenetv2_spec()
    mlmodel = torch._C._jit_to_backend("coreml", model, compile_spec)
    mlmodel._save_for_lite_interpreter("./mobilenetv2_coreml.ptl")


if __name__ == "__main__":
    main()
```

Metal

```python
import torch
import torchvision
from torch.utils.mobile_optimizer import optimize_for_mobile

model = torchvision.models.mobilenet_v2(pretrained=True)
scripted_model = torch.jit.script(model)
optimized_model = optimize_for_mobile(scripted_model, backend='metal')
print(torch.jit.export_opnames(optimized_model))
optimized_model._save_for_lite_interpreter('./mobilenetv2_metal.pt')
```

#推論

モデル実行の手順は同じです。

モデルインスタンス化

```obj-c++
try {
  _impl = torch::jit::_load_for_mobile(filePath.UTF8String);
} catch (const std::exception& exception) {
  NSLog(@"%s", exception.what());
  return nil;
}
```

実行

```obj-c++
auto outputTensor = _impl.forward({tensor}).toTensor().cpu();
```

#比較結果
MobileNetv2をiPhone11で実行。

|Model|Time|
|---|---|
|CPU| 0.024118|
|CoreML|0.013819|
|Metal|0.046400|

CoreMLが倍速かったです。
Metalバックエンドがそんなに速くないのは意外でした。

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[TextMeshPro] SetText直後にテキストの領域（大きさ）を知りたい

SetText()しても次のフレームでしか正しいtextBoundsが得られないと思っていましたが、
ほうほう、[```Canvas.ForceUpdateCanvases()```を呼べば良い](https://stackoverflow.com/questions/55417905/why-is-textmeshpro-not-updating-textbounds-after-setting-text)のですね。
知りたいのは今セットしたテキストのみなので、そのテキストだけForceUpdate()できればよいのですが、その場合は```TMP_Text.ForceMeshUpdate()```が使えるようです。
Jetpack ComposeでCanvasを使ってカスタムグラフィックを作成してみる

最近、Android開発でJetpack ComposeでCanvasを使う機会があったので、今まで難しそうでなかなか手を出してこなかった、Canvasを勉強してみることにしました。

# Canvasの基本的な考え方
普段僕たちがみている画面は、ピクセルによって構成されています。キャンバスでは、このピクセルが色で満たされることで、その代わりに画面に画像が表示されるというものになっています。

Canvasでは、最初``x = 0, y = 0``からスタートします。つまり、画面の左上の部分ですね。そこから、xにどのくらい動くのか？yにどのくらい動くのかを記述することで、さまざまなグラフィックを再現できます。

まずは簡単な三角形を表現してみます。

```kotlin:MainActivity.kt
Canvas(
modifier = Modifier
.width(150.dp)
.height(150.dp)
.padding(16.dp)
) {
    val path = Path()
    path.moveTo(size.width.toFloat(), 0F)
    path.lineTo(size.width.toFloat(), size.height.toFloat())
    path.lineTo(0F, size.height.toFloat())

    drawPath(
        path = path,
        brush = SolidColor(Color.LightGray)
    )
}
```

![スクリーンショット 2022-02-20 11.48.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2397901/f9dc723d-b294-6b4c-7e47-0810597ba8db.png)

こんな感じで、三角形が表現できました。

ここでのコードが何をやっているのかというと、まず先ほども述べたようにCanvasでは、（x＝０、y＝０）からスタートします。
そこで、まずは``path.moveTo(size.width.toFloat(), 0F)``でxに``300dp``分移動して、そこから``path.lineTo(size.width.toFloat(), size.height.toFloat())``で直角にyへ``150dp``移動しています。そこからまた、x＝０のポジションから``150dp``分ポイントをずらすことで、三角形の3点を定義しています。

そこから、``drawPath``を用いて、3点の中身に色をつけているという流れになっています。

さらにここから、この三角形の半分のを別の色で塗りつぶそうとするとこんな感じのコードになります。

```kotlin
Canvas(modifier = Modifier
            .width(300.dp)
            .height(150.dp)
            .padding(16.dp)
        ) {
            val path = Path()
            path.moveTo(size.width.toFloat(), 0f)
            path.lineTo(size.width.toFloat(), size.height.toFloat())
            path.lineTo(0f, size.height.toFloat())
            clipPath(
                path = path,
                clipOp = ClipOp.Intersect
            ) {
                drawPath(
                    path = path,
                    brush = SolidColor(Color.LightGray)
                )

                drawRect(
                    SolidColor(Color.Green),
                    size = Size(
                        0.5f * size.width,
                        size.height.toFloat()
                    )
                )
            }
        }
```
![スクリーンショット 2022-02-20 12.29.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2397901/3eb27a06-b7da-1439-f5c8-bb6ffed86983.png)

ここでは、``clipPath``メソッドを使用しています。
このメソッドを使用することで、``path``の中身だけ色を塗りつぶすことができるようになります。
もし、``clipPath``を使用しないと、こんな感じの見た目になります。
![スクリーンショット 2022-02-20 12.34.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2397901/b66019e1-2724-4d6c-2299-01a6df732f48.png)

# 最後に
今回はCanvasを使用して簡単なカスタムグラフィックを作成してみました。
次からは、これにアニメーションをつけてさまざまなグラフィックを再現してみたいと思います。

### 参考
https://developer.android.com/jetpack/compose/graphics?hl=ja&authuser=1
Bootstrap5の導入の仕方

webページの作成において、ユーザーインターフェイスを構成するのはHTMLです。
その際、見栄えはCSSで調整し、ページに動きをつけたいといった場合にはJavaScriptを用います。
要は「HTML」「CSS」「JavaScript」のうち、中枢を担うのはHTMLであり、CSSやJavaScriptはwebページの操作性を向上させるための飾りです。
デザイナーにとって、CSSやJavaScriptの作りこみは腕の見せどころではありますが、反面とても面倒な作業でもあります。
そこで、「Boostrap」というCSSのフレームワークを使うことにより、面倒な作業を必要とせず、効率的にCSSを仕上げることが可能となります。

#Boostrapとは
Bootstrapとは、レスポンシブデザインを採用した HTML/CSS/JavaScriptのフレームワークです。
レスポンシブデザインというのはPCやタブレット、スマホなどの用いる端末の画面の広さに応じて、同じデザインで異なる大きさの画面に対応するためのデザイン技術のことです。例えば、広い画面では横並びにしていた表示を、スマホなどの狭い画面では縦並びにしたり、サイドバーを表示しないなどと自動的に調整することができます。

##Bootstrapの導入
Bootstrapを導入する方法は2種類あります。
公式ページからファイルをダウンロードする方法とHTMLにBootstrapのリンクを記述する方法です（CDNを使った方法）。

###公式ページからのダウンロード
公式ページからダウンロードするには、まず以下のリンクからダウンロードをクリックし、その後のページで「コンパイルされたCSSとJS」という項目でダウンロードを開始すると、Bootstrapの各種ファイルをローカルに取り込むことができます。
ダウンロード方法としてはこれだけです。

https://getbootstrap.jp/


その後、index.htmlというファイルを用意し、そのファイルの中でダウンロードしたjsフォルダとcssフォルダをindex.htmlと同じ階層に配置し、以下のように記述すればBootstrapを使うことができるようになります。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Bootstrap Sample</title>

    <!-- BootstrapのCSS読み込み -->
    <link href="css/bootstrap.min.css" rel="stylesheet" />
  </head>

  <body>
    <!-- BootstrapのJS読み込み -->
    <script src="js/bootstrap.min.js"></script>
  </body>
</html>
```

###CDNを使った方法
こちらは公式ページからダウンロードする必要がなく、ネットワーク経由でBootstrapを使うことができます。
基本的には用いるファイル(bootstrap.min.css)などは同じですが、ローカルにファイルが無いので、サイトから使うファイルを引っ張ってくる形になります。
このあたりは公式ページにも書いてあります。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Bootstrap Sample</title>

    <!-- BootstrapのCSS読み込み
    <link href="css/bootstrap.min.css" rel="stylesheet" /> -->

    <!-- BootstrapのCDNでのCSS読み込み -->
    <link
      href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css"
      rel="stylesheet"
      integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC"
      crossorigin="anonymous"
    />
  </head>

  <body>
    <!-- Bootstrapのjs読み込み
    <script src="js/bootstrap.min.js"></script> -->

    <!-- BootstrapのCDNでのjs読み込み -->
    <script
      src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"
      integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"
      crossorigin="anonymous"
    ></script>
  </body>
</html>
```

####注意点
紹介した方法はBootstrap5での導入方法です。
Bootstrap5の以前のBootstrap4までのバージョンではjQueryに依存する形でbootstrap.jsファイルが動いていたので、そこの記述をする必要があります。
Bootstrap5からはjQueryが削除されました。
「Veu.js」などのJavaScriptフレームワークが登場したによって、どんな環境でも使いやすいように依存関係を無くしたようです。

##まとめ
Bootstrapの導入方法としては以上になります。
自力でCSSやjsを作成しデザイン作業を行うのはとても大変ですので、こういった既存のフレームワークを用いることで作業が楽に、効率的になると思います。
手動テストケースをエクセルで管理したくないので、yamlに書いたテストケースを Azure DevOps にタスク登録してくれるツールを作った

# これは何？

典型的な手動テストスイートとテスト結果はエクセルで管理されている事が多いように思います。
私は手動テストに精通しているわけではありませんが、手動テストスイートとテスト結果の管理にエクセルは適していないと思える(後述)部分があります。
また、私自身エクセルが苦手です。
yaml にテストスイート(ケース)を記載して、その yaml を元に Azure DevOps にテストケースの実行タスクを登録するための CLI ツールを作りました。

# 作ったもの

https://github.com/nnashiki/yaml2devops-cli
https://pypi.org/project/yaml2devops/

pip install して CLI で使ってください。
詳しくは 上記 GitHub Repo の README をご覧ください。

以下の様な yaml　の記述(左側)から Azure DevOps 実行タスク を生成します。
![](https://github.com/nnashiki/yaml2devops-cli/raw/main/image.png)


# (ポエム)手動テストスイートとテスト結果の管理にエクセルは適していないと思える

エクセルを用いた典型的な手動テストスイートとテスト結果の管理は以下のよう様になっていることが多いように感じます。

- テストスイート毎にシートが用意されている
- テストケースのマスターとテスト結果が1行にまとまっている
- テストケース毎に担当者アサイン列が用意されている

上記の様な構造だと以下のやりにくさがあります

## テストのマスターとテスト結果の分離の煩雑さ

- (テストスイートの実行2回目以降)前回実行したシートをコピーして、前回結果を消して..という様な煩雑な作業が発生する
    - テスト実行を重ねる毎にシートが増殖して重くなる、煩雑になる
- もしくは、テストケースのマスターからテスト結果を書き込むところを作成するオペレーションが必要になる

## テストの担当者や進捗状況をセクセルを参照しないと確認できない
- エクセルでテストの実行結果を管理することになってしまい、テストの担当者や進捗状況をエクセル参照しないと確認できない


# 関連
リリースした後に気づきましたが DSL を作成している方もいました。
https://dev.classmethod.jp/articles/ktestcasedsl-core/
Amplify CLIのインストールに失敗する時の対処法


###下記のコマンドでAmplify CLIのインストールを試みる。
```
npm install -g @aws-amplify/cli
```


##すると、以下のエラーが出現。
```
npm ERR! code ENOTEMPTY
npm ERR! syscall rename
npm ERR! path /Users/masakazu/.nodebrew/node/v16.14.0/lib/node_modules/@aws-amplify/cli
npm ERR! dest /Users/masakazu/.nodebrew/node/v16.14.0/lib/node_modules/@aws-amplify/.cli-E3waRsVY
npm ERR! errno -66
```

##試したこと
###npmをアップグレード後、npmのキャッシュをクリアして再インストール
```
$ npm install -g npm
$ rm -rf node_modules
$ npm cache clean
$ npm install -g @aws-amplify/cli
```
これで上手く行く人が多いのではないかと思いますが、自分の環境ではまた同じエラーが発生。

###管理者権限でキャッシュの強制クリアを試み、再度インストール
```
sudo npm cache clean --force
npm install -g @aws-amplify/cli
```
こちらの方法で解決することができました。
どうやら僕の環境では管理者権限でないとキャッシュをクリアできていなかったようです。
Nuxt2のServerMiddleware+Express構築の際の覚書

Nuxt3の正式リリースも近そうですが、まだまだ2で構築する機会もありそうなので覚書。

# ServerMiddleware

NuxtのserverMiddlewareプロパティを利用すると、サーバサイドで動作するアプリをつくることができます。
これを利用してシンプルなAPIサーバを立てられるので、ちょっとしたWebアプリやモックなどに重宝します。

https://nuxtjs.org/ja/docs/configuration-glossary/configuration-servermiddleware/

しかし、そのままだと若干開発時に設定が必要でいつも詰まるので覚書。

## Express

公式ドキュメントにExpressを使えるよ的な事が書いてありましたが自分の環境では

```
import express from 'express'
```

て書いたらエラーになりました。
内包しているわけではないので、インストールが必要です。（あたりまえ）

```
npm install express
```

## paths

serverMiddleware以下のコードでは、importするときに、tsconfigのcompilerOptions:pathsを適用してくれません。

```
import AAA from '@/aaa'
```
とか書いてしまうとエラーになります。

### 解決方法

`tsconfig-paths-webpack-plugin` で解決できます。

参考:

https://github.com/nuxt/typescript/issues/339

例: 以下のように設定している場合、そのままでは、server/index.ts で `import aaa from '@/aaa'` とかできないので、server以下のディレクトリでコードを書いたときも paths が使えるようにします。

```nuxt.config.js
serverMiddleware: [{ path: '/api', handler: '@/server/index.ts' }],
```

1) プラグインをインストール

```
npm install --save-dev tsconfig-paths-webpack-plugin
```

2) tsconfigに `@server` 以下のパスを追加

```tsconfig.js
...
"paths": {
      "~/*": [
        "./*"
      ],
      "@/*": [
        "./*"
      ],
      "@server/*": [
        "./server/*"
      ]
...
```

3) nuxtの起動時にプラグインを利用するため、package.jsonの`scripts:dev`を変更する

```package.json...
"dev": "node -r tsconfig-paths/register ./node_modules/nuxt/bin/nuxt.js",
```
これで

```
npm run dev
```

したときにpathsを適用してくれます。

## ホットリロード

ServerMiddleware配下のファイルはホットリロードしてくれないので不便です。
nuxt.config.js　の設定で対応できます。

```nuxt.config.js
build: { watch: ['@/server/api/*.ts'] },
```

## 以上

ほんの覚書程度なので足りない内容などは以下を参考にしてください。

- https://nuxtjs.org/ja/docs/configuration-glossary/configuration-servermiddleware/
- https://github.com/nuxt/typescript/issues/339
- https://nuxtjs.org/ja/docs/configuration-glossary/configuration-watch/
ISE WebpackのテキストエディタとしてVSCodeを使う

# はじめに
いきなりですが，LinuxにインストールしたISE Webpackでは日本語入力が使えません．加えて，日本語を表示することもできませんでした(日本語フォント使っても出なかった)．本記事では，その問題を解決しようと試行錯誤した結果，そもそも別のエディタが使えることに気づいたところから始まります．
LinuxへのISE Webpackのインストール方法はこちらから

https://qiita.com/BonyChops/items/bd6532ed39e9d790dc29

# VSCodeの設定

一応，VSCodeでどんな設定をしたかを軽くご紹介します．そこまで特別なことはやってないです(VSCode側からでもビルドできる設定も今後紹介するかも？)．環境はUbuntu 21.04です．

## VSCodeのインストール
基本的には[ここ](https://code.visualstudio.com/docs/setup/linux)に載ってる方法で良いと思います．
Debianパッケージを直接落とします．

```sh
cd $(mktemp -d)
wget -O vscode.deb https://code.visualstudio.com/sha/download?build=stable&os=linux-deb-x64
sudo apt install -y ./vscode.deb
```

## 拡張機能のインストール
そのままVerilogのファイル(`.v`)を開くと，Syntax Highlightingなしのテキストな見た目になってしまうので，拡張機能を入れます．色々ありますが，僕が入れているのはこちら．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601799/cedc07ec-3076-4071-32a9-22b421628834.png)

# カスタムエディタの設定
[Edit] -> [Preferences...] -> [ISE General] -> [Editors]を開くと，次のような項目が出てくると思います．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601799/b47969f8-525d-7db3-2ae9-303c565adbdb.png)

ここのEditorをISE Text EditorからCustomに変更して，好きなように変更します．開く対象のファイルは`$1`に展開されるので，例としてgvimを使うときは次のようになります


```sh
gvim $1
```

終わり

# VSCode向け設定

じゃあ，`code $1`で終わりやん！と思いましたが，これだけでは起動しません．冒頭で紹介したISEのインストール方法を用いた皆さん，もしくは，**USB-DRIVERを適切に設定している皆さん**は少し工夫が必要です．
端的に言うと，環境変数`LD_PRELOAD`が設定されている状態だとVSCodeが起動しなくなります．ということで，それを回避するスクリプトを書きましょう[^1] [^2]．

下記を実行すると，`~/scripts/isecode.sh`に起動用のスクリプトを作成できます．
```sh
mkdir -p ~/scripts      
echo '#!/bin/bash\nLD_PRELOAD="" code $(dirname $1) -g $1' > ~/scripts/isecode.sh
chmod +x ~/scripts/isecode.sh
```
これが設定できたら，あとはISE側の設定を変えるだけです．お疲れ様でした．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/601799/b0aa1c1a-39ad-4c2d-cd40-e8b21ec3260c.png)



[^1]: スクリプトなんか書かなくても`LD_PRELOAD="" code $1` とかでいいんじゃないの？と思われるかもしれませんが，ISEがどうやらこの構文を受け付けてくれないみたいです．
[^2]: `LD_PRELOAD="" code $1` でも良かったのですが，せっかくなのでワークスペース扱いで起動できるように，`LD_PRELOAD="" code $(dirname $1) -g $1` を指定します．ディレクトリを開く対象に指定し，Gotoとしてファイルを指定します．
Get video height and width by ffprobe


### example1

```shell
ffprobe -v error -show_entries stream=width,height -of default=noprint_wrappers=1 file.mp4

# width=2160 height=1080
```

### example2

```shell
ffprobe -v error -show_entries stream=width,height -of csv=p=0:s=x file.mp4

# 2160x1080
```

### example3

```shell
ffprobe -v error -show_entries stream=width,height -of json file.mp4

{
  "programs": [],
  "streams": [{},
    {
      "width": 2160,
      "height": 1080
    }
  ]
}
```

`-v error` 进行安静输出，但允许显示错误。排除常见的 FFmpeg 输出信息，包括版本、配置和输入详细信息。

`-show_entries stream=width,height` 只显示 width 和 height 流信息。

`-of` 选项选择输出格式（default、compact、csv、flat、ini、json、xml）。

`-select_streams v:0` 如果输入包含多个视频流，则可以添加此选项。`v:0`将只选择第一个视频流。否则，你将获得与视频流一样多的 width 和 height 输出。
Ubuntu20.04系のフルバックアップをやってみた

## 事のきっかけ

自作PCで電源がいきなり落ちるトラブルがあり、Ubuntuに関しては特に拘りがなかったのでバックアップをしていなかった。
そのせいもあり、復旧するのにえらく時間がかかってしまったのがきっかけ。

## バックアップ方法

- 1.NASを用意する

NASは正直どのメーカーであっても国際的な規格に従っていれば何でも良い。
強いて言うなら、UbuntuがNASを認識できていることを確認しておく事と、ルーターを介して外部ネットワークと接続できないようにプライベートな環境にしておく。
メーカーの悪意orプラグインを提供する側の悪意or外部から侵入を試みる悪意によって漏れたら洒落ならんので。

- 2. UbuntuでNASをマウント
※[username],[password],[NASのIP or Domain], [ディレクトリ]は、それぞれ自分の環境に置き換えるようにする。

```shell
sudo apt install cifs-utils
cd /mnt
sudo mkdir nas
sudo mount -t cifs -o noperm,username=[username],password=[password] //[NASのIP or Domain]/[ディレクトリ]
```

- 3. いざバックアップ
※[バックアップ先のディレクトリ]は各自で書き換えてください。

```shell
sync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /[バックアップ先のディレクトリ]
```

## やり終わっての感想

ITエンジニア的には、コマンド叩いてやれば終わりという感覚なので問題ないのだが、これを一般ピープルに翻訳しようとすると、面倒になる。

同じUnix系というかあっちはUNIX本家のmacOSにあるTimeMachineが如何に便利で万人向けであるかを実感した。

## GUI的にバックアップ

下記コマンドにより、「バックアップ」アプリが追加される。

```shell
sudo apt install deja-dup
```

## 参考資料
https://wiki.archlinux.jp/index.php/Rsync_%E3%81%AB%E3%82%88%E3%82%8B%E3%83%95%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97
100倍速の Log4Shell 対策法を Snyk で実現

本記事は2022年2月4日に公開した英語ブログ[Log4Shell remediation with Snyk by the numbers](https://snyk.io/blog/log4shell-remediation-with-snyk-by-the-numbers/)を日本語化した内容です。

[![logo-solid-background.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2216557/14d05b40-70b7-5276-27e9-2ecfe395db03.png)](https://snyk.io/jp)

# Snyk を使って業界平均より100倍速く Log4Shell を対策しよう

[**Log4Shell**](https://qiita.com/SnykSec/items/fccc10bd25cd5de0b56f) の公表から2ヶ月近くが過ぎました。Java ユーザーに大影響を与えたこの脆弱性の検出と修正において、Snyk が大きな役割を果たしてきました。例えば、Snyk のお客さまは業界平均に比べて**100倍も速く Log4Shell 対策を完了**しています。

なぜこのようなことが実現できたのでしょうか。いくつかの理由があります。

1. Log4Shell を [**Snyk 脆弱性データベース**](https://security.snyk.io/vuln/SNYK-JAVA-ORGAPACHELOGGINGLOG4J-2314720)ですぐに公表できたこと
1. [**依存関係**](https://snyk.io/product/open-source-security-management/)と[**コンテナ**](https://snyk.io/product/container-vulnerability-management/)内の Log4Shell に対するリアルタイムのスキャン機能
1. 間接的依存パッケージに対するスキャン機能 ([**パッケージマネージャを使わない参照や JAR ファイル**](https://snyk.io/blog/new-snyk-cli-command-finds-log4shell-in-unmanaged-undeclared-java-code/)もサポート)
1. [**修正用プルリクの自動作成**](https://snyk.io/blog/find-fix-log4shell-quickly-snyk/)によりすぐに修正完了

Log4Shell についてのインフォグラフィックを作成しました。この脆弱性についてのタイムライン、時間的・金額的な Snyk の利用効果、そしてお客さまの体験談をぜひ、ご一読ください。

# 数字で見る Snyk を使った Log4Shell 対策の効果 (100倍速の脆弱性修正)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89952/c0b10492-62fd-43aa-e3cd-7cc9c63946ea.png)

[PDF のダウンロードはこちら](https://snyk.io/wp-content/uploads/log4shell-remediation-with-snyk-infographic-v2.pdf)

# 最後に
Snykを使ってみたい！と思われた方は、ぜひ無料トライアルをお試しください。無料トライアルは[こちら](https://snyk.co/qiita)からどなたでもご利用いただけます。トライアル中の技術的なご質問は、[サポート](https://support.snyk.io/hc/en-us)をご利用ください。UIは英語ですが、日本語でご記入ください。日本語で対応しています。

Snykでは、セキュアなコーディングのための情報や脆弱性の最新情報などを発信しています。ぜひフォローをお願いします。

* [Snyk公式ウェブサイト](https://snyk.io/jp)
* [Snyk Japan Twitter](https://twitter.com/snykjp)
* [Snyk Japan Facebook](https://www.facebook.com/snykJP/)
javaScript81_Date

Jsの中に、Dateを使用し、時間を表すことができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/ea26f379-272a-1c0a-36a5-3c6a62a0336e.png)
 getDate()メソッド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/86554f68-b899-5731-115c-045a98b4eb21.png)
getDay()メソッド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/32cbcd43-6e38-0218-e341-b8a6a842b56c.png)
getMonth()メソッド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/c6bcd4cc-0818-bf02-51f7-aa70b544081d.png)
getFullYear()メソッドとgetTime()メソッド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/6c76aa85-4ae8-48a6-3df0-945346922b45.png)
Date.Now()メソッド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/c8f72404-6f59-d5f5-f5ae-d953d9abf2a9.png)
Azure App ServiceでSQLiteを使うときに気を付けること

#はじめに
Azure App ServiceでPaaSのWebアプリを作成する際に、クラウドのコストを最小限に抑えるためにDBにSQLiteを採用したら後で困ったことになったので、気を付けたほうがいいことを記事にしておきます。
App Service＋SQLiteの組み合わせが絶対にダメというわけではないのですが、採用するにあたって注意が必要な点を記載します。
他にも発見したら更新するかもしれません。
#App ServiceでSQLiteを採用するときの確認事項
##ステージングスロットは使用しないか？
App Serviceにはステージングスロットという便利な環境があります。
運用環境とは異なる環境（ステージングスロット）を用意することができ、Azureのポータル画面からスワップという操作を行うことで、事前にステージングスロットで起動しておいたアプリを運用環境に起動した状態でデプロイすることができます。
それまで運用環境で動いていたアプリはデプロイスロットに移されます。

ダウンタイムが発生せず簡単にアプリをデプロイできる便利な機能ですが、SQLiteを使用しているとSQLiteのDBファイルも運用環境とステージングスロットで置き換わってしまいます。
ステージングスロットはスワップするまではテスト環境として使用するケースが多いと思いますが、スワップによって運用環境のDBがテスト環境のDBに置き換わってしまったら大きな影響を及ぼす恐れがあります。

##Zipファイルでアプリをデプロイすることはないか？
App Serviceにアプリをデプロイする方法として、発行プロファイルを使用してVisual Studioからビルド＆デプロイする方法、WinSCPなどのクライアントからFTPで送信する方法などがありますが、Zipファイルのアップロードによるデプロイも可能となっています。

Zipファイルのアップロードでは、既にデプロイされているファイルは上書きされるため、運用環境のSQLiteの内容が失われてしまいます。
また、Zipデプロイでは前回デプロイと比較して存在しないファイルは自動で削除されるため、SQLiteのファイルを含んでいないZipファイルをデプロイしても運用環境のSQLiteの内容は失われてしまいます。

##DBの性能をスケールアップする可能性はないか？
DBの処理時間がボトルネックになっているとわかり、DBの性能をスケールアップしたくなったとしても、SQLiteを採用しているとDBだけをスケールアップすることはできません。
SQLiteはApp Serviceと同じ環境で動作するため、App Serviceのプランを変更すれば性能が向上するかもしれませんが、どの程度向上するかわかりません。

#おわりに
クラウドサービスの利用自体が初めてで、右も左もわからずにAzureのApp Serviceを利用したときの失敗体験からこの記事を書きました。

お金に余裕があるならAzureのSQLデータベースのサービスを利用するのが確実です。
ただ、無料利用枠でちょっと試したいだけというときにDBのサービスを利用するとお金がかかってしまうため、DBは無料で済ませたいと考える中でSQLiteを思い浮かべる方もいるのではないでしょうか。
SQLiteは手軽に採用できて便利ですが、PaaSのサービスとはあまり相性が良くないみたいので、デメリットを考慮しつつ採用を検討していただけたらと思います。
PowerShellでフォルダ内のCSVファイルを連結するときの文字化け対応

確定申告のCSV取り込みで月別のcsvを連結しようと思ったら文字化けしたので解決したときのメモ

### 状況とやりたかったこと：
フォルダの中に　202101.csv, 202102.csv ... 202112.csv のように１年分のcsvファイルが入っている状態

これらのcsvを連結して一つのファイルにしたい。

### 試したこと：
いろいろ調べると、やはり文字コードの問題があるようでPowerShellのデフォルトの文字コードがUTF-8になっていることが原因らしい。　PowerShellの文字コード設定を変えればいけるとかの記事を参考にしたのだが、うまくいかず。それならバイナリで出力して、バイナリで受け取ってくれればと

`Get-Content *.csv -Encoding Byte  | Set-Content all.csv  -Encoding Byte`
のようにしてみたら以下のようなエラーが、

> Get-Content: Cannot process argument transformation on parameter 'Encoding'. 'Byte' is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method. (Parameter 'name')

Byte という名前は Encoding パラメータに対して有効ではありませんよということのようです。

### 結果：
じゃあフツーに　SJISで設定したらと試すとうまくいきました。
`Get-Content *.csv -Encoding Shift-JIS | Set-Content all.csv  -Encoding Shift-JIS`

銀行とか、クレジットカード会社が提供している明細CSVダウンロードのサービスではすぐにExcelで開けるようにShift-JIS のEncoding でダウンロードされるようです。
つまりフツーにExcel使っている場合はcsvファイルから直接Excelを開くようにする場合は、CSVファイルはShift-JISである必要がある。少なくとも2022年2月時点では
PostgreSQLで正規表現にマッチする文字列を取得する

PostgreSQLで正規表現にマッチした特定の文字列を抽出する方法のメモ。マニュアルを読むと色々書いてあるけど、高度なことをしなければ、`substring` を使っておけばOK

### 具体例

キャプチャ用の括弧なしだと、マッチした部分文字列が返る。

```sql
select substring('psql (PostgreSQL) 10.18', '^\w+');      --> psql
select substring('psql (PostgreSQL) 10.18', '\(\w+\)');   --> (PostgreSQL)
select substring('psql (PostgreSQL) 10.18', '[\d\.]+$');  --> 10.18
```

キャプチャ用の括弧をつけると、括弧の中にマッチした文字列だけが返る。こちらを使うケースの方が多そう。

```sql
select substring('psql (PostgreSQL) 10.18', '\((\w+)\)');   --> PostgreSQL
select substring('psql (PostgreSQL) 10.18', '(\d+)\.\d+');  --> 10
select substring('psql (PostgreSQL) 10.18', '\d+\.(\d+)');  --> 18
```

キャプチャ用の括弧を複数つけると、最初の括弧の中にマッチした文字列だけが返る。そのため、キャプチャさせたくない括弧には `?:` を付けるとスキップできる。

```sql
select substring('psql (PostgreSQL) 10.18', '(\d+)\.(\d+)');    --> 10
select substring('psql (PostgreSQL) 10.18', '(?:\d+)\.(\d+)');  --> 18
```

そもそもマッチしない場合は `null` になる。

```sql
select substring('psql (PostgreSQL) 10.18', 'mysql');  --> null
```

### おまけ

`substring(<string>, <pattern>)` の代わりに `substring(<string> from <pattern>)` としても同じ。

```sql
select substring('psql (PostgreSQL) 10.18' from '^\w+');  --> psql
```

### 確認環境

* PostgreSQL 10.18

### 参考文献

* [9.7. パターンマッチ - PostgreSQL 10.5文書](https://www.postgresql.jp/document/10/html/functions-matching.html)
class<<selfという書き方は？

ruby書いているとタイトルのような記述を見たことがある人は多いとおもいます。自分はよくわからなかったので今回の記事でまとめてみようとおもいます。

こういう時はとりあえず公式ドキュメントを見てみようと思ったので見てみました。すると、
>特異クラス方式。複数のメソッドを一度に定義するとき向き
>https://docs.ruby-lang.org/ja/3.0/doc/spec=2fdef.html#class_method



## 特異メソッドとは?
特異メソッドとは１つのオブジェクトに対して適用されるメソッドのことです。実際に例を見ていきましょう

```
class User
  def my_name
    puts "自己紹介しましょう"
  end
end

ouki = User.new
riboku = User.new

def ouki.introduction
  p "秦国最強の将軍である"
end

ouki.my_name
=> 自己紹介しましょう

riboku.my_name
=> 自己紹介しましょう

ouki.introduction
=> "秦国最強の将軍である"

riboku.introduction
NoMethodError (undefined method `introduction' for #<User:0x000002364158c3b0>)
```
rubyではメソッドは、```def メソッド名 end```と記述します。
my_nameはインスタンスメソッドです。そのため、Userクラスから作成されたoukiインスタンスやribokuインスタンスではmy_nameメソッドが使えます。
しかし、ouki.introductionメソッドは違います。これは、oukiインスタンスしか使えないメソッドなんです。そのため、ribokuインスタンスがそのメソッドを使うとしてもエラーを吐くわけです。

あるオブジェクトにのみ適用できる特別に異なるメソッド、それが特異メソッドです。

## 特異メソッドの実態
rubyの原則として、**メソッドはクラスに紐づく**というものがあります。そのため特異メソッドもなんかしらのクラスに属しているはずなんですね。実際にどこのクラスに属しているのかを見ていきましょう。
```
class User
  def my_name
    puts "自己紹介しましょう"
  end
end

ouki = User.new
riboku = User.new

def ouki.introduction
  p "秦国最強の将軍である"
end

p ouki.class.method_defined?(:introduction)
=> false
p ouki.singleton_class.method_defined? :introduction
=> true
```

上記からも分かるように、ouki.introductionメソッドという特異メソッドは、Userクラスに属しているのではなく、特異クラスに属していることが分かります。なお、特異クラスは特異メソッドが定義されたときに自動で作成されます。

つまり、特異クラスに特異メソッドは属しているということです。

## クラスに特異メソッドを定義してみましょう
```
class User
  def User.introduction(name)
    p "#{name}"
  end
end

puts User.introduction("王騎")
=> 王騎
```
このintroductionメソッドの呼び出し方は、クラスメソッドの呼び出し方と同じなんです。つまり、
```
class User
  def self.introduction(name)
    p "#{name}"
  end

  puts self.introduction('王騎')
end
```
これと同じなんです。
ここからわかることは、クラスメソッドはクラスの特異メソッドにあたるんです。

## class<<selfとは？
これは特異クラス定義式といいまして、そのまんまの意味です。特異クラスを定義するものです。ここまで読んだ方であれば、特異クラスとは特異メソッドを定義した時にでてくるものでしたね。
実際に特異クラス定義式で書いてみましょう

```
class User; end
class << User
  def production(name)
    puts "#{name}"
  end
end

puts User.production('王騎')
=> 王騎
```

```class << User```でUserの特異クラスに対して、Userの特異メソッドを定義しています。
さらにUserの部分をselfに変えてあげれば、
```
class User; end
class << self
  def production(name)
    puts "#{name}"
  end
end

puts User.production('王騎')
=> 王騎
```
今回のタイトルの形ができましたね。

まとめると、```class << self```は特異クラスにたいして特異メソッドを定義しているんです。

以上です。何か間違いがございましたら、ご教示いただけますと幸いです。

【参考資料】

https://qiita.com/TomoProg/items/23027a866beac66a40c6

https://qiita.com/k-penguin-sato/items/d637dced7af32e4ec7c0

https://docs.ruby-lang.org/ja/3.0/doc/spec=2fdef.html
PullRequestをローカルにチェックアウトし動作確認する方法

GitHub CLI を使用


```
$ brew install gh

// ログインを行う
$ gh auth login 
```

プルリクエストの画面から右上にあるCodeを押す
![スクリーンショット 2022-02-20 10.45.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/225743d5-44db-6455-dcbe-8536731fefd1.png)

```
$ cd ディレクトリまで
$ gh pr checout 2
```

参考
https://zenn.dev/morinokami/articles/hello-github-cli
Cookieとセッションの違い

## 結論

- Cookie
    - 具体的な機能の名前
- セッション
    - 仕組みの名前

どちらもコンピュータ間の通信状態を保つための技術だけど、
セッションの方が言葉として抽象度が高い。

「セッションを実現するためにCookieを使う」イメージで、
図で表すと以下の感じでしょうか。
![セッションの図.002.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690075/9dbb9561-8a95-b420-cec7-af4ee4a192bf.jpeg)


## Cookieとは

クライアントとサーバで情報を交換する機能。

リクエスト・レスポンスの中に以下のようにして詰められている。

- Cookie: キー＝値

- 例（ログイン状態を保ちたい時）
    - Cookie: ユーザーid＝kuma; パスワード＝pass

Cookieの値からidとパスワードを渡すことで、「1度ログインしたら、しばらくidとパスワード入力不要」が実現できる。

でも通信の中身にidやパスワードをそのまま詰めると、中身を盗まれたときに悪用されやすい。

## セッションとは

>一連の処理の流れ
引用：プロになるためのWeb技術入門 _ なぜ,あなたはWebシステムを開発できないのか 

### 例
- ログインのセッション（一連の処理の流れ）
    1. idとパスワードの入力
    2. ログイン成功

1〜2の流れ全体をセッションと言い、
そのうち**2. ログイン成功**という状態を保持しておけば、何回もログインしなくてよくなる。

**2. ログイン成功**という状態を保持するためにセッションIDを発行して、
「このセッションIDを持っているクライアントはログイン済み」みたいに判定をする。

### セッション便利だけど...
このセッションIDをクライアントとサーバ間でどうやって受け渡そうか...
→Cookieに白羽の矢が立った

以下のように、
CookieにIDとパスワードを詰めてるときと
CookieにセッションIDを詰めてるとき、
やっていることは本質的に一緒

- Cookie（IDとパスワードver）
    - ユーザーid＝kuma
    - パスワード＝pass
- Cookie（セッションver）
    - セッションID＝複雑な数字・文字列

## まとめ
一言でまとめると
**セッションを管理するためのセッションIDを、Cookieを使って運んでいる**
という感じでしょうか。


ちなみにCookieは元々Netscape Communications社が考案したとのことですが、

1企業が考案したものが世界基準になってたりする辺り、この業界の「便利だし使おう」みたいな文化が感じられて好きです。

## 参考文献

プロになるためのWeb技術入門 なぜ,あなたはWebシステムを開発できないのか
[【PHP超入門】Cookieとセッションについて](https://qiita.com/7968/items/ce03feb17c8eaa6e4672#cookie%E3%81%AE%E4%BB%95%E6%A7%98%E3%81%A8%E6%AD%B4%E5%8F%B2)
[iOS] （社内アプリ等で）限定的にアプリを配布する方法をまとめてみた

# 前提知識

## Apple Business Manager(ABM)

- Appleデバイスやアカウントを管理し、Mobile Device Management(MDM)による管理をサポートするための公式サービス。
- 法人であれば、無料で登録・利用可能。
- MDM製品と連携して利用するサービス。
- 実際に端末に適用させる設定を作るのがMDMで、配布するアプリを入手したり、端末を組織の所有物として紐付けたりしてMDMによる管理をサポートするのがABM。

**参考リンク:**

https://www.lanscope.jp/trend/20867/

**公式ドキュメント:**

https://support.apple.com/ja-jp/guide/apple-business-manager/welcome/web

※教育期間向けには同じ位置づけで[Apple School Manager(ASM)](https://support.apple.com/ja-jp/guide/apple-school-manager/welcome/web)がある。

# カスタムApp

**ユースケース：**

- 組織内の従業員への独自のアプリ配信。
- あらかじめ特定されたビジネスパートナーに対するアプリ配信。

**特徴：**

- ABM/ASMの利用が前提となります。App Store ConnectでAppを[表示およびダウンロードできる組織を指定します](https://help.apple.com/app-store-connect/?lang=ja#/dev275598f16)。
- 指定された組織は、MDMまたは招待コードを使ってAppを配信できます。App StoreのUIには表示されません（検索結果やカテゴリ内の一覧など）。
- アプリ審査の対象となります。
- Apple Developer Program(ADP)で利用可能。Apple Developer Enterprise Program（後述）では不可。

**公式ドキュメント：**

https://developer.apple.com/jp/custom-apps/

# 非表示App(Unlisted App)

**ユースケース：**

- カンファレンスの出席者など、限定的かつカスタムAppよりも広範囲な対象へのアプリ配信。

**カスタムAppとの相違点：**

- ABM管理されていないデバイスに対して配布可能。
- アプリのURLをユーザーに伝えて配布。
- アプリ毎にリクエストフォームから申請を行い、Appleの許可を経て非表示Appになります。

アプリ審査がある点、ADPでのみ利用可能な点はカスタムAppと同様。

**注意点：**

- URLを知っていれば誰でもインストール可能となるため、URLの告知範囲のコントロールや、アプリ内でのログインなどのユーザーコントロールといった、情報の保護管理はアプリの配信元や開発元が責任を負います。

**公式ドキュメント:**

https://developer.apple.com/jp/support/unlisted-app-distribution/

# Apple Developer Enterprise Program(ADEP)

※2022年2月現在、新規のADEP取得は非常に困難な模様のため、上記カスタムAppまたは非表示Appの選択が現実的です。

- 大きな組織が独自の社内用Appを開発し、従業員向けに展開するためのプログラム。
- ADPと異なり、アプリ審査を経ずに配信が可能。
- 以下が条件となっている。（公式ドキュメントより引用）

> - 100名以上の従業員を持つ組織であること。
> - 組織が法人であること。DBA、架空事業名、商号、支店名での登録は受け付けません。
> - 社内用に独自のAppを開発し、そのAppを非公開かつ安全に組織の従業員に配信する目的でのみ、このプログラムを利用すること。
> - 社内用Appのダウンロードを従業員にのみ限定するためのシステム、およびメンバーシップの資格情報やアセットを保護するためのシステムを構築していること。
> - Appleの検証インタビューおよび継続的な評価プロセスに参加し、承認されること。

公式ドキュメント：

https://developer.apple.com/jp/programs/enterprise/
javaScript80_arguments

関数を呼び出す際に、ブラウザは関数に二つの隠された引数を渡します。
一つはthis,もう一つはarguments.

argumentsの構造はArray(リスト）に似ていますが、Arrayではありません。
argumentsを使い、インデックス番号で値を操作することができます。リストの長さも確認することができます。
関数を呼び出す時、渡した値（実引数）は全部arguments内で保存されます。

値がArrayかどうかを確認する方法として、Array.isArray()メソッドを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/f81852be-a4db-87bd-43bb-dfe28c496549.png)
形式引数と定義しなくても、argumentsで実引数を渡すことができます。
arguments[0]: 一つ目の実引数
arguments[2]:二つ目の実引数

argumentsの中にcallee属性があります。callee属性は現在指している関数オブジェクトとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/aba5d2a6-b9e0-1db3-c012-badbab375f1a.png)
javaScript79_callとapply

主にcall()とapply()メソッドについて書きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/7d7bd68e-dc2a-9e80-3734-bdd0199e83aa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/1b4f5bbc-7991-e534-eeb8-6b27b64df27e.png)
メソッド内に、引数を追加することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/e723c45c-9d8e-7f07-fafb-d569f152824b.png)
令和3年度秋期データベーススペシャリスト試験に（ギリギリ）合格した勉強法

#はじめに
令和3年度秋期データベーススペシャリスト試験に合格したので勉強方法を記録として残しておきます。
これから受験を考えている方の参考になれば幸いです。

#試験の結果
まずは私の試験結果から。
![dbq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2528939/1d9b0ced-fe69-7e2f-9c24-e45d7ea0db33.png)
タイトルにもありますが、午後Ⅰがギリギリでした。
試験を受けているときも午後Ⅰは難しいと感じていたので、合格ラインに届いていてホッとしました。

#データベースに関する事前知識
データベース設計は未経験です。
データベースに関する知識はSQLも含めて、基本情報技術者試験と応用情報技術者試験を受験したときに学習した内容しかありません。
業務でデータベース設計をすることになり、このままではいけないと思いデータベーススペシャリスト試験を受験することにしました。
データベーススペシャリスト試験は今回が初めての受験になります。

#勉強方法
続いて勉強方法の紹介です。
##参考書＋問題集での学習
以下の書籍を使用しました。

[情報処理教科書 データベーススペシャリスト 2021年版](https://www.seshop.com/product/detail/23987)

この書籍はAmazonでも高評価のレビューが非常に多いこともあり、迷うことなく購入しました。
データベーススペシャリスト試験はこの書籍の内容を集中的に学習することで合格できました。

書籍の使い方ですが、まずSQLの知識があいまいな人は前半の参考書部分をしっかり読み込むことをお勧めします。
午前問題でSQLの問題は頻出ですし、午後問題でも必要な知識になります。

知識の整理ができたらひたすら過去問を解きます。
データベーススペシャリスト試験の午後問題は長文読解の問題ですが、過去の問題から傾向が大きく変わる可能性が低いため、過去問になれることが最も重要です。

この書籍の良いところは、過去19年分の問題と解説をWebページからダウンロードして学習に使用できるところです。
過去問の量はもちろん申し分ないのですが、なにより解説が非常に丁寧で問題を解くときの参考になります。

過去の午後問題には優先度が付けられていて、たくさんある問題の中からどの順番で取り組めばよいのかがわかるのもありがたかったです。
私は、最重要とされる問題すべてと、重要とされる問題の一部を解きました。
午後Ⅰと午後Ⅱでそれぞれ10問ずつくらいの問題を解きました。
午後問題の解説は丁寧な分ボリュームもありますが、目を通すことで確実に力になるので、解説を最後まで読んでから次の問題を解くことをお勧めします。

##模擬試験
私の勤めている会社が模擬試験の受験費用を負担してくれるというので、TACの模擬試験を受験しました。
タイミングとしては、本試験の一か月前、上記の書籍で最重要とされている問題をすべて解いたあとぐらいだったと思います。
会場での受験は申し込み期限に間に合わなかったので、問題を購入して自宅で時間を計って解きました。

自己採点した結果、ギリギリ合格ラインでした。
問題の難易度としては、過去問題の中でも優しい部類の問題と同じくらいかなと感じました。
今見てみると、本試験の点数と傾向がかなり似ていますね。

【模擬試験結果】

|区分|点数|
|:---|:---|
|午前Ⅰ|60点|
|午前Ⅱ|88点|
|午後Ⅰ|63点|
|午後Ⅱ|72点|

模擬試験でギリギリですが合格ラインに達したこともあり、今までの勉強方法が間違っていないとわかったので、引き続き過去問を解いて解説を読むという勉強を続けて本試験の日を迎えました。
#おわりに
上記の勉強をすることで、ギリギリですが令和3年度秋期データベーススペシャリスト試験に合格することができました。

データベーススペシャリスト試験でよく言われることですが、午後問題はとにかく時間との勝負です。
過去問を繰り返し解くことで、問題を解く手順を身に付け、時間配分にも気を配れるようにすることが重要になります。

模擬試験も受けられるのであれば受けることをお勧めします。
その際は会場で受験できると、より本番に近い環境で試験を受けられるので良いと思います。

過去問をひたすら解く、という何のひねりもない勉強法の紹介でしたが、これから受験を考えている方の参考になれば幸いです。
40 代おっさん GASのErrorオブジェクトについて学ぶ

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## Errorオブジェクト

Errorオブジェクトとは
例外情報を取り扱うオブジェクト

構文

```javascript
new Error(エラーメッセージ)
```

throw文を使うことで例外を発生させる。

構文

```javascript
throw new Error(エラーメッセージ)
```

Errorオブジェクトの主なメンバー

|分類|メンバー|戻り値|説明|
|----|--------|------|----|
|メソッド|toString()|String|例外を文字列として返す|
|プロパティ|message||エラーメッセージ|
|プロパティ|name||例外の種類名|
|プロパティ|stack||スタックトレース|

```javascript
function toshiki2() {
  try{
    throw new Error('発生させた例外');
  } catch(e) {
    console.log(e.name);
    console.log(e.toString());
    console.log(e.message);
    console.log(e.stack);
  }
}
```

例外を表すその他の主なオブジェクト

|オブジェクト|説明|
|----|--------|
|RangeError|値が配列内に存在しない、または値が許容範囲にない場合のエラー|
|ReferenceError|存在しない変数が参照された場合のエラー|
|SyntaxError|構文的に正しくないコードについてのエラー|
|TypeError|値が期待される型でない場合のエラー|

お試し

```javascript
function toshiki2() {
  throw new TypeError('発生させた例外');
}
```

23:44:02	エラー	
TypeError: 発生させた例外
toshiki2	@ オブジェクト.gs:2

が出たと思います

### スタックトレース

スタックトレースとは
例外が発生するまでに呼び出した関数の記録
stackプロパティを使うとできる。

```javascript
function toshiki4() {
  try{
    throw new Error('発生させた例外');
  } catch(e) {
    console.log(e.stack);
  }
}
```

## 参考資料

<https://www.amazon.co.jp/s?k=google+apps+script+%E5%AE%8C%E5%85%A8%E5%85%A5%E9%96%80&adgrpid=110264232688&gclid=CjwKCAiA9aKQBhBREiwAyGP5lSl7AJJLCvOEHb4wQgMlyqW1fll5X8GDTT_Rkd1_soUAyIPMXQr26hoClHEQAvD_BwE&hvadid=553833563682&hvdev=c&hvlocphy=1009076&hvnetw=g&hvqmt=b&hvrand=4378489642044417389&hvtargid=kwd-594191211348&hydadcr=4106_13159878&jp-ad-ap=0&tag=googhydr-22&ref=pd_sl_2x1owglv0s_b_p52>
【Laravel9】いつまでも、あると思うな、LTS

# Laravel9 LTSやめるってよ。

2022/02/08に、待望の**LTS**新バージョン**Laravel9**がリリースされました。
[当時のリリースノート](https://github.com/laravel/docs/commit/8b3dc9cf72abe63a64bbfc0570c43a14da990e5e#diff-1d2b91d957f8612017f196e6cc2e83c33bcfe3fd348dc3619e9e9672e797d46f)にも、LTSの文字が輝いていました。

しかし、2022/02/09に以下のコミットがなされ、Laravel9の横から【LTS】の文字が削除されました。

https://github.com/laravel/docs/commit/1249422c2ea59f9bc8eac468b0ffe108658214fe

## なぜLTSが消えたの？

laravel作者のTwitterの呟きを見ていただくと、**全ての理由**がわかります。

https://twitter.com/taylorotwell/status/1491834866295525389

要約すると、Symfony側で[影響の大きいPR](https://github.com/symfony/symfony/pull/45377)が出ていることが原因で、Laravel9のLTSサポートするか決めかねているそうです。

PRの内容は、**Symfony6.1**から**PHPバージョンの最低要件を8.0から8.1**に引き上げるよというものです。
（現在の最低要件は、PHP8.0)
かなり影響が大きそうですね。

ただ、このPRの結果がどうであれ、Laravel9には**最低でも2年間のセキュリティアップデート**が適応されるようです。

## Symfony6.1のPHP最低バージョンが8.1に（2022-02-26更新）

Symfony側の[PR](https://github.com/symfony/symfony/pull/45377)（PHP最低バージョン8.0 -> 8.1）が昨日マージされました。
その結果、Symfony6.1からPHPの最低バージョンが8.1になることが確定しました。

詳細は下記ページをチェックしてください。
https://symfony.com/blog/symfony-6-1-will-require-php-8-1

Laravelでは、Laravel10のPHP最低バージョンを8.1に変更する[PR](https://github.com/laravel/framework/pull/41250)が提出され、既にマージされています。
(以前までは、PHP8.0, 8.1両方に対応予定でした。)

### Laravel９のLTS有無については、また情報が入り次第更新します。
[JavaScript]スーパーリロードってできるのか(但し、非推奨)

# はじめに

WEBサイトの画像表示時にキャッシュを無効化してサーバーから取得するようにできないかなーと思って、色々調べてたら「こんなことできるんだー」と思ったのでメモ（但し、アンチパターンとして認識）

# やりたいコト

特定の画像をキャッシュから取得しないようにしたかった

```php
<img src="/img/hoge.png">
```

# やったこと

王道でいくと`Cache-Control`で`content="no-cache"`を設定する、とか

```php
<meta http-equiv="Cache-Control" content="no-cache">
```

imgタグなので、srcを動的にするとか

```php
<?php
    $now = new Carbon();
    $now_unix = $now->format('U');
?>
<img src="/img/hoge.png?timestamps=<?php $now_unix; ?>">
```

ありましたが、JavaScriptでできないかな～って思ってたら見つけました。

↓参考

https://zenn.dev/mindwood/articles/ba4594c53a93b0

## JavaScriptによるキャッシュの削除

https://qiita.com/Buzzword111/items/03974c04930b8f660075#pageshowイベント

コチラの記事を拝見してpageshowイベント内にあるpersistedというプロパティを使えば、キャッシュによる読込みなのか、否かを判定してくれるらしいと知る

ということで、記事のコードほぼ引用で恐縮ですが、こんな感じで実装すればいいじゃんと思った

```php
window.addEventListener('pageshow', function(event) {
  if (event.persisted) {
    // キャッシュの時の処理(※)
  } else {
    // 何もしない
  }
});
```

※pageshowイベントのMDNでも同じようにpersistedを使うサンプルコードを用意してる

https://developer.mozilla.org/ja/docs/Web/API/Window/pageshow_event

### キャッシュからの取得の時に何するか

ここでようやく結論`スーパーリロード`をします。

JavaScript上でリロードするには

```php
window.location.reload()
```

でできるけども、スーパーリロードするには

```php
window.location.reload(true)
```

でいけるらしい。

https://developer.mozilla.org/ja/docs/Web/API/Location/reload

ただ、上記**`Location.reload()`**のドキュメントにはその記述はないが探すと一個前の`Location`インターフェースの`reload`の説明欄に記述があった

これは気づかない。。。

https://developer.mozilla.org/ja/docs/Web/API/Location

### 完成したコード

なので、キャッシュで画像データ（厳密には画像を持つhtmlファイル）を取得した際はスーパーリロードをするようにした

```php
window.addEventListener('pageshow', function(event) {
  if (event.persisted) {
    window.location.reload(true) // 追加
  } else {
    // 何もしない
  }
});
```

## よくよく調べると、、、

調べると、reload()の引数にtrueをとるのは非推奨ではないかという記事もいくつか出てきた

https://highmoon-miyabi.net/blog/2020/10/29_000581.html

ただ、MDNには（ちょろっと）書いてあるし、、、

ということでもう少し調べると以下TypeScriptのgithubのissueでのやり取りが出てきた

https://github.com/Microsoft/TypeScript/issues/28898#issuecomment-445367646

どうもTSとしてはreloadについては、`HTMLの仕様として引数をとることが記述がない`ということで非推奨とされたらしい

https://html.spec.whatwg.org/multipage/history.html#dom-location-reload

## 結論

JavaScriptとしての**`Location.reload()`**の扱いは最終的には不明だが、代表的なフレームワークが非推奨としているので個人的にも非推奨であるだろう、と結論付けました。

今回は`reload(true)`は使わずに上述のimgタグのsrcを動的にする形でdoneとした。

# おわりに

スーパーリロードができるのすっごく便利だな、と思った矢先、非推奨であり実用的ではないことがわかり残念感が大きかったのでせっかくなら、と記事にした。
Longan Nanoを使ってみる ～FONTX2ファイルを作る～

# 好きなフォントを使用する

# 注意
このページは、quiita.com で公開されています。URLがqiita.com以外のサイト、例えばjpdebug.comなどのページでご覧になっている場合、悪質な無許可転載サイトで記事を見ています。正しい記事は、https://qiita.com/BUBUBB/items/7ce85ada67a3f6d1944d からリンクしています。

無許可転載サイトでの権利表記（CC BY SA 2.5、CC BY SA 3.0とCC BY SA 4.0など）は、不当な表示です。
正確な内容は、qiitaのページで参照してください。

## FONTX2形式
FONTX2形式は、大昔のPC(DOS/Vと呼ばれていた時代）に使われていたフォントの形式。現在のWindowsのフォントは、拡大しても汚くならず、大きさも文字によって自由に指定でき、斜体や太字も自由自在。（ベクターフォント）　昔のPCでは、一定の区画(16x16ドット-漢字、16x8ドット-ASCII文字）内に、文字を点で表現していた。（ラスターフォント）

ベクターフォントは高機能だがサイズが大きく、表示にたくさんのリソースを使う。そのため、電子工作で使われているマイコンではベクターフォントは扱うのが難しい。電子工作では、あらかじめ液晶側に固定の文字フォントを格納した、キャラクターディスプレイ（[こんなの](https://akizukidenshi.com/catalog/g/gP-00040/)）が使われていた。最近はマイコンの性能が上がってきたことから、グラフィック液晶を使うことも多くなった。　そうなると、やはり漢字を表示したくなるのが日本人の心。で、カビが生えたFONTX2形式を引っ張り出してきた。

現在では、FONTX2形式は電子工作界隈ではかなりポピュラーになっている。


## FONTX2の作成・編集
夢よもう一度で一般的になってきたFONTX2形式だがWindowsの64bit環境で使えるツールは少な目だ。変換ツールなどは、DOS版だったり、現在のWindowsでは起動できないことも多い。当然、開発ももう終わっている。そんな中で、車輪の再発明が行われている状況のようだ。

FONTXの形式については、[FONTXファイルの使いかた](http://elm-chan.org/docs/dosv/fontx.html)で詳細に解説してある。このページでは、http://elm-chan.org/fsw.html#fontxedit でフォントエディタがソースコードを含めて公開されており、最新のWindows11でも問題なく動作する。


## FONTX2の変換
fontxeditだと、既存のフォントの変更などはできるが、TrueTypeフォントからの変換などは無いようだ。ゼロから好きなフォントを作っていくのは大変なので、既存のフォント（TrueTypeフォント）から変換したいところだ。ツールはいくつもあるのだが、Windows11で動作しないものが多く、なかなか見つけられない。仕方ないので、今回、Visual Studio 2022のC#で、WindowsのフォントからFONTX2形式のファイルを作るためのプログラムを作った。小さいプログラムなので当然一切の権利は放棄する。

[Githubからダウンロード](https://github.com/HisayukiNomura/FontConverter/releases/tag/0.1)

![fnt01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/fb8de334-071b-d9b8-46cb-f7a82d8dcc8f.png)

簡単な使い方は次の通り

1. ①をクリックして、既存のFontX2ファイルを指定する。半角のファイルを読み込むと自動的に半角のチェックボックスがオンになるが、間違えていたら優しく手で修正する。
1. ②をクリックして、変換したいフォントを指定する。12x12のフォントなどの場合、相当小さくなることを忘れてはいけない。普通の明朝やゴシックなどを１２ドットにしても、きれいには表示できない。[自家製ドットフォントシリーズ](http://jikasei.me/font/jf-dotfont/)などから、小さくてもきれいに表示できるTrueType フォントをダウンロード、インストールして使用するのが吉。
1. ③ビットマップに変換したとき、フォントが上下左右にずれてしまうことがある。この場合、XOffsetとyOffsetで調整する。マージンは、文字の外側にできる余白の量。文字の外側に2ドット余白ができたとき、ここを-1にすると、余白は１ドットになる（予定）。
1. ④変換するときの対象の文字を指定する。例えば、漢字は変更せず、かなカナだけを特定のフォントに入れ替えるときには、漢字と英数字記号のチェックを外す。
1. ⑤変換ボタンを押すと、更新対象のファイルを読み込み、返還後の結果を XXXX_UPDATE.XX という名前で保存する。
JS100戦をやります！！

# 今年はJSの使い手になりたくて基礎的で意外とわかってないことをまずは100個やってみる！！！

## NO1 Array.at 

配列を後ろから数えることができる
以下は参考ソース

```javascript
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <ul>
        <li>要素１</li>
        <li>要素２</li>
        <li>要素３</li>
        <li>要素４</li>
        <li>要素５</li>
    </ul>
    <script>
        const lis = [...document.querySelectorAll('li')];
        console.log(lis);
        const li = lis.at(-2);
        li.style.background = 'red';
    </script>
</body>
</html>
```

## NO2 textContent VS innerText

以下の違いを理解していないとバグの原因になりかねない

- textContent:テキストを取得 
- innerText:画面に表示されているテキストを取得

```javascript
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <span id="test">
        textContent VS <span style="display: none;">Innner Text</span>
    </span>
    <div id="result">
        結果：
    </div>
    <script>
        const test = document.getElementById('test');
        const result = document.querySelector('#result');
        let text;
        text = test.innerText;
        result.append(text);
    </script>
</body>
</html>
```

## NO3 スプレッド構文(...)で簡単に配列を複製

参考コード以下

```javascript
const arr1 = [10,20,30];
const arr2 = [40,50,60];
const arr3 = [...arr1, ...arr2];
console.log(arr3); // 10,20,30,40,50,60
```

## NO4 querySelectorAllは配列にすると便利

JSは配列のメソッドが豊富なので一度配列にすると扱いやすいのかもしれない。

```javascript
// 配列にする
const lis = [...document.querySelectorAll('li')];
lis.filter(li => li.textContent == 'あたり')
.forEach(li => li.style.color='#ff0000');
```
STM32L010でソフトウェアシリアル9600bps(STM32L010F4P6)(USART)(Keil)


x Mbed2


目的
シリアルのテスト


参考
STM32F303K8 & mbedでSoftwareSerialを実装する 【TX編】



https://qiita.com/YuseiIto/items/ddc15a77fd7b57ffa757



![o_con238.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e76f26a7-f603-07d8-506d-108ab17227a5.jpeg)



![o_con239.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ef8779d6-da9c-d3f3-3b0f-16e14eabb7ba.jpeg)




```c++




//K_S_SER_9600_010_1

#include "mbed.h"

#define UART_DELAY 101 //  1/9600 98-105

DigitalOut TX(PA_2);

//仮想シリアルへの一文字出力 9600bps
int pc_putc(char ch)
{

    TX=1;
    TX=0;//Start
    wait_us(UART_DELAY);

    for(int ii=0; ii<8; ii++) { //Data x 8
        TX=(ch>>ii)&1;
        wait_us(UART_DELAY);
    }; //for

    TX=1;//Stop
    wait_us(UART_DELAY);

    return(0);

} //pc_putc

//文字列の表示 nana_seg
int pc_printf(char *str1) {

    //文字の中身がゼロか
    while(*str1){

        //一文字出力
        pc_putc(*str1 ++);

    } //while

    //戻り値
    return(0);

}//ns_printf

//メインルーチン
int main()
{

    TX=1; //ポートの初期化

    //無限ループ
    while(1) {

        //文字列を出力
        pc_printf("hello world\r\n");

        //1秒の待ち
        wait_ms(1000);

    }//while

}//main



```
[Simulink] Arduinoビルド時のエラー解決 (ext_types.h/ExtModeMalloc)

## Problem

ビルド時に自作のモデルをビルドしようとした際、
ExtModeMallocがすでにmem_mgr.c/hで宣言されているのに、マクロ定義しようとしてコンパイルエラーが発生する。
下記のマクロをコメントアウトすることで解決。今のところ特に問題はでていない。

### Before modification:

```c
C:\Program Files\MATLAB\R2021b\rtw\c\src\ext_mode\common\ext_types.h
#define malloc ExtModeMalloc
#define calloc ExtModeCalloc
#define free   ExtModeFree
```

### After modification (Comment out 3 defines) :

```c
C:\Program Files\MATLAB\R2021b\rtw\c\src\ext_mode\common\ext_types.h
// #define malloc ExtModeMalloc
// #define calloc ExtModeCalloc
// #define free   ExtModeFree
```

environment : R2021b, Simulink® Support Package for Arduino
HPE iLO4 環境のBIOSアップデートで古いROMを残す方法

# 前提

- リダンダントROMに対応した iLO4 (たぶん他のiLOでも出来る)

- リダンダントROMに異なるバージョンが入っている

|例||
|:---:|:---:|
|System ROM|v2.00|
|Backup System ROM|v1.00|

筆者は DL360 Gen9 で確認した。

# 狙ったROMに上書きする

- BIOSから残したいROMで起動するよう設定して保存

```
1.  (F9) System Utilities
2.  System Configuration
3.  BIOS/Platform Configuration (RBSU)
4.  Advanced Options
5.  ROM Selection
```

- 再起動して古いBIOSで起動していることを確認

- BIOSアップデートする。

以上
2022/2/20主にITとかセキュリティの記事

ウェブ3が3Dテレビから学べる教訓【オピニオン】(2/18)
https://m.finance.yahoo.co.jp/news/detail/20220218-00160146-coindesk-bus_all

.NET 20周年(2/17)
https://developers.srad.jp/story/22/02/16/1535247/

遠のくネット利用者保護　総務省の法改正案、大幅に後退(2/17)
https://www.nikkei.com/article/DGXZQOUA175S20X10C22A1000000/

英数字＋記号12桁の強固さを実感？ パスワードを推測するWordle風ゲームが堂々登場(2/18)
https://internet.watch.impress.co.jp/docs/yajiuma/1389314.html

デジタルウォレットアプリ「Kyash」のアカウント乗っ取りを注意喚起(2/18)
https://japan.cnet.com/article/35183742/

Gucci（グッチ）がサンドボックスの仮想土地を購入し、メタバース市場に参入(2/18)
https://nextmoney.jp/?p=48274

米銀JPモルガンや東芝など3社、量子暗号通信の実験成功(2/17)
https://www.nikkei.com/article/DGXZQOGN1765Y0X10C22A2000000/

「2026年には4人に1人がメタバースを日常利用」、ガートナーが展望(2/17)
https://xtech.nikkei.com/atcl/nxt/news/18/12265/

【書き起こし】メルペイチームが考える「ゼロトラスト」をベースとした認証・認可の在り方と課題 #merpay_techtalk(2/17)
https://engineering.mercari.com/blog/entry/20220217-11d92ef626/

CMS「Drupal」にデータ改ざんの脆弱性　迅速にアップデートを(2/18)
https://www.itmedia.co.jp/enterprise/spv/2202/19/news029.html

警察庁、「令和３年におけるサイバー空間をめぐる脅威の情勢等について（速報版）」を発表(2/17)
https://securityinsight.jp/news/13-inbrief/4930-220217-1

ロシア侵攻前のサイバー攻撃予想 ウクライナ当局が分析(2/18)
https://nordot.app/867388075934121984?c=113147194022725109

暗号通貨ウォレットの識別子を入れ替える攻撃への防御策を実装した「Opera 84」が公開(2/18)
https://forest.watch.impress.co.jp/docs/news/1389259.html

QRコードで偽サイト誘導　「非接触」狙うサイバー攻撃(2/18)
https://www.nikkei.com/article/DGXZQOUC102BF0Q2A210C2000000/

Google ChromeとFirefox、バージョン100で不具合発生の恐れ(2/18)
https://news.infoseek.co.jp/article/mynavi_2369072/?tpgnr=it

知られざる「IT拠点ウクライナ」の企業が直面する危機的状況(2/18)
https://forbesjapan.com/articles/detail/45922

北京五輪「公式アプリ」内の「検索NGワード」一覧から見えた“中国の残念さ”何もかも、ずさん過ぎる…(2/18)
https://gendai.ismedia.jp/articles/-/92549?page=1&imp=0

iPhoneのSafariで表示されるプライバシーレポートとは｜見方と危険性を解説(2/18)
https://news.nifty.com/article/technology/techall/12276-1477759/

JSOX(内部統制報告制度)における「不備」の考え方④(2/18)
https://kaikeizine.jp/article/29070/

レガシーなシステムとの向き合い方(2/18)
https://engineering.mercari.com/blog/entry/20220218-3c7faca4cc/

中国当局、メタバース巡り警告　違法資金調達の場になるリスク(2/18)
https://jp.reuters.com/article/china-tech-metaverse-banks-idJPKBN2KN0RQ

広島県にサイバー攻撃、２日以上継続中(2/18)
http://www.shikoku-np.co.jp/flash/article.aspx?id=20220218000526

Web版Officeが大きく進化、見た目はデスクトップ版に近づく(2/18)
https://xtech.nikkei.com/atcl/nxt/column/18/01938/013100004/

米、中国などの知財侵害に警告
「悪名高い市場」報告書(2/18)
https://nordot.app/867217890324496384?c=39546741839462401

2022年のクリプト業界、5つの予測(2/18)
https://forbesjapan.com/articles/detail/45876/1/1/1?s=ns

複数の仮想通貨企業がマネーロンダリング防止イニシアチブでチーム立ち上げ(2/18)
https://nextmoney.jp/?p=48295

Windows 11、米国でAndroidアプリ対応開始。タスクバー改良も(2/18)
https://www.watch.impress.co.jp/docs/news/1389567.html