OmniAICreator/Qiita-1.07M huggingface dataset:
LPC812MAXとI2Cを使い0x80に「hello...」と出力する。


LPC812MAXとI2Cを使い0x80に「hello...」と出力する。


x mbed2リビジョン144
x リビジョンを変更できる人むけ


目的
I2Cのテスト


1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり



![o_con716.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/91c8791e-6046-28ca-5872-d65e3fb54d1a.jpeg)




資料1



https://os.mbed.com/users/okini3939/notebook/I2C_jp/



資料2


https://qiita.com/caa45040/items/5032e6905c9425f41495


```c++


//I2C_TEST_STRING_812_1

#include "mbed.h"

DigitalOut myled(P0_7); //red

#define ADDR (0x80)  //I2Cのアドレス

//       SDA    SCL
I2C i2c(P0_10, P0_11); //812

//10の割り算 0から9999までは、正しい。
#define DIV10(n) (((n*409)+((n*154)>>8))>>12)

char ch_hex_a_b[16];
char *ch_hex_a(int d)
{

    ch_hex_a_b[4] = 0;
    ch_hex_a_b[3] = '0' + (  d - (DIV10(d) * 10)  );  // '0'+(d%10)
    d = DIV10(d);
    ch_hex_a_b[2] = '0' + (  d - (DIV10(d) * 10)  );  // '0'+(d%10)
    d = DIV10(d);
    ch_hex_a_b[1] = '0' + (  d - (DIV10(d) * 10)  );  // '0'+(d%10)
    ch_hex_a_b[0] = '0' +  DIV10(d);                  // '0'+(d/10)

    return(ch_hex_a_b);

} //ch_hex_a

//一文字出力
void pc_putc(char ch)
{

    i2c.write(ADDR, &ch, 1);
    wait_ms(1);//1mS待つ　連続送信防止用　受信落ち対策

} //pc_putc

//文字列の表示 nana_seg
void  pc_puts(char *str1)
{

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

        pc_putc( *str1 ++);

    } //while

}//ns_puts

//メインプログラム
int main()
{

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

        myled = 1;//LEDをオン

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

        //I2Cに文字列を出力
        pc_puts(ch_hex_a(1234));

        //I2Cに文字列を出力
        pc_puts("\r\n");

        myled = 0;//LEDをオフ

        wait_ms(1000);//1秒待つ

    }//while

} // main



```


![o_con833.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f3442803-d860-dcfb-a51a-13e2ac9c8eff.jpeg)


-6-
GASとSlack API連携 Enable EventsでVerifedにならず困った話

# 目次
[1.目的](#目的)
[2.何が困りごと？](#何が困りごと？)
[3.なにが問題だったの](#なにが問題だったの)
[4.まとめ](#まとめ)



# 目的　
- SlackAPIでEnable EventsにGASのデプロイURLを設定
- `your url didn't respond with the value of the challenge parameter`になった時の具体的な解決事例が他の記事でなかったので記録

# 何が困りごと？
- プロジェクト内で以下ようなプログラムを作成
- SlackAPIの設定画面赤線のところでエンドポイントが使えないというエラー
- challengeパラメータをちゃんと返すようなAPIを作成しないとボットの作成ができないと他のエンジニアは言ってる
- いろいろサイトをめぐりコードをコピペしても動かずなぜなぜと考察
```slackapi.gs
function doPost(e){
  var params = JSON.parse(e.postData.getDataAsString());
  return ContentService.createTextOutput(params.challenge);
}
```

![Enable Eventsエラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691844/3d1e48fb-7c68-a096-e0ab-be1a784b8dca.png)


# なにが問題だったの
- GASのプロジェクト上で`doPost(e)`が2つのファイルにあったのが問題
- プロジェクト生成時に既存で存在する`コード.gs`でdoPostを作っていたのを忘れていました
- API側が確認のためにリクエストを送ったがどっちが対処すればいいのかわからなかったんですね
- `コード.gs`のdoPostを削除したらVerifedになりました

```slackapi.gs
function doPost(e){
  var params = JSON.parse(e.postData.getDataAsString());
  return ContentService.createTextOutput(params.challenge);
}
```
```コード.gs
function doPost(e){
  // 練習用
}
```

# まとめ
- コードの内容が良くてもそれ以外でうごかないことがあるので気を付けましょう
#3 未経験エンジニアのVSCODE〜エディタプレイグラウンド〜

ご覧いただきありがとうございます。

最近、勉強する中でこういう練習方法があったんだと思うことが多々あります！

そのため、もしご存知ない方に向けて共有していきたいと思います！

今回は **VSCODE編** です。

# 対象者

- VSCODEを利用されている方
- ショートカットを身に付けたい方
- 最近VSCODEを利用し始めた方

# エディタプレイグラウンドとは

エディタプレイグラウンドとは、その名の通り「エディタ公園」。（わかりづらくなった・・・）

こちらではではVisual Studio Codeの代表的な機能10個を試すことができます！！！

ただ全部英語です！

```
英語：「Help」→「Interactive playground」
日本語：「ヘルプ」→「エディタプレイグラウンド」（写真参照）
```

![スクリーンショット 2022-09-03 12.20.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821131/1c9b1943-7b67-fc22-56bf-ad9079ce123f.png)


# 所感
半年ほどVSCODEは使ってきましたが、初めて知りました！

知っている機能もありましたが、知らない機能もありました。

私が利用したプログラミングスクールでは紹介していなかったです。

そのため、ご存知ない方は試してみてください。
ElasticsearchにTimestampから時間と曜日のフィールドを追記する方法

kibanaで可視化する際に特定の曜日と時間を抽出して最大値を取得したかったのでメモ

# indexにドキュメントを追加
```
POST inedx-00000/_doc
{
  "timestamp":"2022-09-02T09:01:02+0900"
}
```

# indexにドキュメントを追加
```
POST inedx-00000/_update_by_query
{
  "script": {
    "lang": "painless",
    "source": """
      DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssx", Locale.JAPAN);
      String datetime = ctx['_source']['timestamp']; 
      OffsetDateTime offsetDateTime = OffsetDateTime.parse(ctx['_source']['timestamp'],formatter);
      ctx['_source']['hour'] = offsetDateTime.getHour();
      ctx['_source']['week'] = offsetDateTime.getDayOfWeek();
    """
  }
}

```
Railsアプリにおけるfaviconの設定方法

## 本記事の対象者
- ファビコンって何？という方
- Railsアプリにファビコンを設定したい方

## favicon(ファビコン)とは？
こちらの画像で青い丸で囲ったところのマークのことをファビコンといいます。
![ファビコン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668589/c7c56360-4037-6fee-15c2-17d322214883.png)
あらゆるWEBサイトにアクセスしてみると、サイトごとにそれぞれのファビコンが設定してあると思います。
ブランディング的観点、信頼性的観点などから設定をしておいた方が良いとされております。

## faviconの設定方法
1. ファビコンとして設定したいロゴを用意して、下記フォルダに格納する。
　app/assets/images
1. app/views/layouts/application.html.erbの<head>タグ内に下記を追記する。
```
<%= favicon_link_tag('FILE_NAME') %>
```
※FILE_NAMEの部分に1で格納したファイルのファイル名を記載してください。

以上です。ファビコンの設定はかなり簡単なので、オリジナルアプリなどを制作する際には必ず設定するようにしましょう。

執筆：2022年9月3日(土)
Windows11環境構築備忘録

自分用の備忘録  
増えたら修正する。

# winget

+ wingetによるpower shellのInstall

```powershell
winget search Microsoft.PowerShell
winget install --id Microsoft.Powershell --source winget
```

+ wingetによるOhMyPoshのInstall

```powershell
winget install JanDeDobbeleer.OhMyPosh -s winget
```

# [Chocolatey](https://chocolatey.org)

+ ChocolateyのInstall (管理者権限のPower Shell)

```powershell
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
```

+ pythonのインストール
    + トラブル時の対応 
        + 環境変数のpathの確認
        + アプリ実行エイリアスのpythonをオフにする

```powershell
choco install python -y
```

# [Scoop](https://scoop.sh)

+ Scoopのインストール (Power Shell)


```powershell
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser # Optional: Needed to run a remote script the first time
irm get.scoop.sh | iex
```



```powershell
scoop install neovim
scoop install fzf
scoop install poppler

```
【Vue.js】imgタグのwidth,heightにパーセント(%)を指定してはいけない

# 結論

Vue.jsで`<img :width="hoge" :height:"foo">`のようにwidht,heightをバインドする時、hoge,fooに100%などのようにパーセンテージは渡せない。必ず数字だけを渡すこと。
HTML５においてimgタグのwidth,heightに単位は指定できず単位なし数値しか指定できない。もしパーセンテージで指定したいならcssで指定する。
VueはこのHTML5の仕様に（おそらく）厳密に従っているのでこのような仕様になっている。

# 背景
v-bindでimgタグのwidthとheightをVueから指定しようとして以下のコードを書いたがうまくいかなかった
```html:hoge.html
<div id="app">
    <img v-bind:src="path" alt="ロゴ画像"
    :width="width" :height="height" />
</div>
```

```hoge.js
Vue.createApp({
    data() {
        return {
            path: '',
            width: '30%',
            height: '30%',
        }
    },
    methods: {
        onclick() {
            this.message = new Date().toLocaleString();
        }
    }
}).mount('#app');
```
widthやheightに30%が入ると思ったが、0だった
![スクリーンショット 2022-09-03 11.36.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515580/0ac90b87-912d-b09d-07d2-1576e5340d81.png)

# 調べてみた
以下でHTML4.1を使用してない限りはパーセンテージは使えないというコメントがあった。

https://stackoverflow.com/questions/3396475/specifying-width-and-height-as-percentages-without-skewing-photo-proportions-in

MDNを見ると確かに単位無しで指定しろと書いてある

https://developer.mozilla.org/ja/docs/Web/HTML/Element/img#attr-width

# まとめ
そもそもHTML5ではimgタグのwidth,heightに単位をつけて指定できないため、Vueでも渡せない

各ブラウザは基本的にうまいこと後方互換性みたいなの出来るようになってるから、直接HTML書いてる時とかは特に意識せずに済んでた。
今まで当たり前のようにimgタグにパーセンテージ使ってたので、今後は気をつけようと思う。
16進数ダンプを、各種進数変換し、ファイルに追加する【前段】

[【前回】](https://qiita.com/AnimaLibera/items/229259cf694e63b4a460)ファイルの16進数ダンプをCSVファイルに保存したので、今回はそれを各種進数変換してファイルに保存するための前段階。
```powershell:記述場所.ps1
    #2桁表示にする。空白なら無しにする。
    foreach-object{
        ('{0:x2}'-f$_).replace(' ',",")
    }|

    #今回は、
    #ここに
    #記述していく。

    #ファイルに追加する
    add-content $str
    #>
```
そもそも16進数から2進数表記にしたり、10進数表記にすると文字数が増えてファイルサイズも増えるので、余計なデータを削除してから進数変換したい。例えばヘッダー部に年月日時分秒などの実際のデータと関係ない情報が書き込まれていた場合スキップして読み込めばよいのだが、ここではそれを除いたデータ部だけを一旦配列に代入したい。
```powershell:記述内容.ps1
    #カンマ区切るにしたものをわざわざ配列に変換している、ここでカンマ区切りは失われる
    $okk=$ok -split ","

    #ヘッダー部10バイトを除き新しい配列に代入する場合
    $Hexdata=$okk[10..($okk.length - 1)]
    
    #SetValueのために配列を宣言する
    $valdata=1..1000*$gyousuu #バイナリから読むバイト数は500だが進数変換後は1000要素に増える場合
```
ここで【SetValue】が出てきたが、空の配列を作成する方法だと配列に配列を結合する事になり、【SetValue】よりもかなり遅い。
```powershell:ここで【SetValue】が出てきたが.ps1
    #空の配列を宣言する
    $data=@()
    $data=$data+$Hexdata[$i+1]#配列に配列を結合は$Hexdata.SetValueよりもかなり遅い。
```
次回はこの【SetValue】を使って実際にデータを追加していく。
モバイルエンジニアが内定者としてインターンシップにフロントエンドで参加した話(ざっくりまとめ)

#### 本記事は、「モバイルエンジニアが内定者としてインターンシップにフロントエンドで参加した際の話」をざっくりまとめたものです。<br>もしかしたら、この話の各テーマごとに深掘りした記事を今後出すかもしれないです


# 自己紹介

自動車産業が有名な県で専門学生をしている20歳男性です。
高校の頃に独学でプログラミングを始め、専門学校に進学。
来年の4月にはビジネスチャットを提供している企業に、モバイルエンジニアとして新卒入社する予定です。

半年ほど前まではFlutterを書いていましたが、最近では入社に向けてSwiftを書いていています。

今回は、入社予定の企業のインターンシップに内定者として参加させていただいたので、その経験や感想をまとめていこうと思います。


# インターンの内容

インターンの期間：３週間
- #### 講義パート ：１週間
    - __環境構築__ から __デザイン__ , __React__ , __型システム__ , __要件定義__ , __ドメイン駆動設計__ , __運用__ , __アジャイル・スクラム__ …などなど様々な講義を受けることができました
    - 実際に業務をされている社員の方々というだけですごいのですが、社員の中にはその分野で超有名な方や、学校で先生をやられている方もいらっしゃって、とてもわかりやすくておもしろい講義ばかりでした

- #### 開発パート：２週間
    - チームで開発を行いました
        - (内定者で１チーム・参加者で２チームの計3チーム)
    - 事前に作っていただいた __チャットアプリ__ を __要求__ に従って改良していきます
        - 要求は、 __ユーザはどんな悩みがあり、どんな機能を欲しがっている__ というようなことが記述されているだけ、実装方法やデザインなどの指定もない
    - どうすればユーザからの要求に応えられるかをチームで議論し、プランニングして実装を進めていく

# 内定者チームで行ったこと
- __全員でモブプロ__
    - FE,BE関係なく、全員で行った
    - 開発の効率は悪いが、重要な部分の認識をチーム全員で揃えることができた
- __タスク管理にGitHub Projectsを使用した__
    - 初めて使う機能だったが、タスク管理しやすかった
    - 個人でも使うこと決定！
- __スクラムマスターを毎日交代__
    - 全員が経験することで、スクラムの意識を高く持って活動できた
  
# 得られたこと
- __コードを読む力__
    - 既存のコードをいじる経験は学生のうちにはなかなかできない
    - でも、入社後には非常に重要なこと
- __チーム運用__
    - アジャイル・スクラムの考え方
        - 入社までにチームで実践する機会はないかもしれないが、個人的にはこの意識を続けていきたい
    - 認識を合わせる
        - ドキュメント
        - モデル
        - ユビキタス言語
- __プランニング__
    - 開発者目線ではなく、ユーザの視点に立って考えることが重要だと感じた
        - どのユーザ？というところまで考えれるとGOOD
- __Web開発技術__
    - アーキテクチャ・開発の進め方など、モバイルに持ち帰れそうなものがたくさん
        - まずはGitHubの運用から採用してみます
        - 今まではMVVMで開発をしていましたが、MVVM+Clean Architectureのような感じにして、DDDの考え方を取り入れていこうと考えています
- __GitHub__
    - チームでGitHubを使用したことがなかったので、初PR・初コンフリクトを経験
        - PRは何をやったかを並べるのではなく、どう伝えるかを意識することが大切と感じた
        - レビュアーのことを考えるのはもちろん、将来そのソフトウェアに関わる人のことまで考えられるとより良くなりそう
    - タスク管理が便利
- __同期や社員の方々との交流__
    - 交流の機会が多くあり、入社前から関わることができたのがGOOD！

# 働いてみた印象
- __いい意味で緩い__
    - 仕事の無駄(硬さ)を省いて __働きやすくしている__ という印象を受けた(緩い≠だらけている)
    - 社員同士でも仲が良さそうで、一般的な固いイメージの会社員とは違い、 __話しかけやすかった__
        - __心理的安全性__ を大切にしている会社です

# まとめ
最初は「Web開発全然やったことないのに大丈夫かな？」と不安でしたが、何とか活動することができました。
その中で、社員の方や同期、参加者との力の差を感じることがありましたが、その差を縮めるために頑張ろうという __モチベーション__ になりました。(20歳なので僕が __ほぼ最年少__ でした)
入社に向けて残り半年、たくさんの経験をして成長した状態で入社できるように努力します　:relaxed:
Pythonでcsvにスペース区切りのリストを書き込む

## 実現したいこと
リストを含むcsvをつくりたい ↓

```hoge.csv
a, b, [1 2 3], c
```


## 結論
これで実現できます。
``` hoge.py
l = [1, 2, 3]  # リスト
l = '[' + ' '.join([str(x) for x in l]) + ']'  # リストをあらかじめ文字列にする！
row = ['a', 'b', l, 'c']  # csvの1行

# csvに出力
with open('hoge.csv', 'w') as f:
    writer = csv.writer(f)
    writer.writerow(row)
```


## 失敗した方法
愚直に書いたコード　↓

```hoge.py
l = [1, 2, 3]  
row = ['a', 'b', l, 'c']  # csvの1行

# csvに出力
with open('hoge.csv', 'w') as f:
    writer = csv.writer(f)
    writer.writerow(row)
```

```hoge.csv
a,b,"[1, 2, 3]",c
```
TerraformでGitHubの公開鍵を設定したユーザーアカウントを作成し、Session ManagerでEC2にSSHアクセスする

# はじめに
踏み台サーバーでよく見られる構成である、Session ManagerにてEC2にアクセスする。
AmazonLinux2を利用するが、ec2-userを削除し、新規でユーザーアカウントを作成する。
この際、Session ManagerはAWS CLIではなく、GitHubの秘密鍵でSSHアクセスできるようにする。
上記をTerraformにて記述する。

Terraformのバージョンは ```v1.1.6```とする。

# 実行環境の準備
[AWSでTerraformを動かすための設定](https://qiita.com/miyabiz/items/b647c93aaf3c05c61525)を参考にしてください。


# EC2を構築する

1.  Session Managerを利用するためのIAMロール
 
    ```tf:iam.tf
    resource "aws_iam_role" "akane_ssm_role" {
      name = "akane_ssm_role"
      path = "/"
    
      assume_role_policy = jsonencode({
        "Version" : "2012-10-17",
        "Statement" : [
          {
            "Effect" : "Allow",
            "Principal" : {
              "Service" : "ec2.amazonaws.com"
            },
            "Action" : "sts:AssumeRole",
          }
        ]
      })
    }
    
    resource "aws_iam_role_policy_attachment" "akane_ssm_role_policy" {
      role       = aws_iam_role.akane_ssm_role.name
      policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
    }
    ```

1.  EC2

    ```tf:ec2.tf
    resource "aws_iam_instance_profile" "akane_ssm_instance_profile" {
      name = "akane_ssm_instance_profile"
      role = aws_iam_role.akane_ssm_role.name
    }
    
    resource "aws_instance" "akane_ssm_ec2" {
      ami                  = "${EC2のAMIのID}"
      instance_type        = "t2.micro"
      subnet_id            = module.vpc.private_subnets[0]
      iam_instance_profile = aws_iam_instance_profile.akane_ssm_instance_profile.name
    
      user_data = <<EOF
        #!/bin/bash
  
        USER_NAME=akane
        sudo adduser $USER_NAME
        sudo mkdir /home/$USER_NAME/.ssh
        sudo chmod 700 /home/$USER_NAME/.ssh
        sudo touch /home/$USER_NAME/.ssh/authorized_keys
        sudo chmod 600 /home/$USER_NAME/.ssh/authorized_keys
        sudo chown -R $USER_NAME:$USER_NAME /home/$USER_NAME/.ssh

        (echo; wget https://github.com/${GitHubのアカウントID}.keys -O -; echo) >> /home/$USER_NAME/.ssh/authorized_keys
        sudo userdel -r ec2-user
      EOF
    
      tags = {
        Name = "akane_ssm_instance"
      }
    }
    ```

# EC2にアクセスする

1. ~/.ssh/config に下記を追記する。
```ssh:~/.ssh/config
host i-* mi-*
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
```

1. GitHubの秘密鍵でSSHアクセスをする
```sh:UNIXコマンド
ssh -i ${GitHubの秘密鍵} akane@$(aws ec2 describe-instances --filters Name=instance-state-name,Values=running Name=tag:Name,Values=akane_ssm_instance --query "Reservations[*].Instances[*].InstanceId" --output text)
```

# 参考
[Amazon Linux インスタンスでのユーザーアカウントの管理](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/managing-users.html)
[Session Manager を通して SSH 接続のアクセス許可を有効にして制御する](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html)
vistaでandroid studio その12

# 概要
vistaでandroid studio 1.0.1やってみた。
練習問題やってみた。

# 練習問題
qiitaのohisamaの記事をリストして、タップでブラウザで表示せよ。

# 方針

- 暗黙のインテント使う。
- listview使う。
- httpsurlconnect使う。
- AsyncTask使う。
- jsonarray使う。

# 写真

![device-2022-09-03-063009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9da7287e-621a-dd75-0852-737ae8b0bae6.png)


# サンプルコード

```
	public void run() {
		new AsyncTask<Void, Void, String>() {
			ListView  list = (ListView) findViewById(R.id.list);
			final ArrayList<String> data = new ArrayList<>();
			final ArrayList<String> data0 = new ArrayList<>();
			ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_single_choice, data);
			@Override
			protected String doInBackground(Void... voids) {
				String dis = "";
				String urlStr = "https://qiita.com/api/v2/users/ohisama@github/items";
				String result = null;
				HttpsURLConnection con;
				URL url = null;
				BufferedReader reader = null;
				try
				{
					Log.e("ohi", "ok0");
					url = new URL(urlStr);
					con = (HttpsURLConnection) url.openConnection();
					Log.e("ohi", "ok1");
					con.setRequestMethod("GET");
					Log.e("ohi", "ok2");
					final int status = con.getResponseCode();
					Log.e("ohi", "ok3");
					if (status == HttpsURLConnection.HTTP_OK)
					{
						Log.e("ohi", "ok4");
						StringBuilder stringBuilder = new StringBuilder();
						reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
						String inputLine;
						while ((inputLine = reader.readLine()) != null)
						{
							stringBuilder.append(inputLine);
						}
						dis = stringBuilder.toString();
					}
					else
					{
						result = String.valueOf(status);
						Log.e("ohi", "err1");
					}
				}
				catch (Exception e)
				{
					Log.e("ohi", e.toString());
					dis = e.toString();
				}
				return dis;
			}
			@Override
			protected void onPostExecute(String result) {
				try
				{
					JSONArray jsonArray = new JSONArray(result);
					for (int i = 0; i < jsonArray.length(); i++)
					{
						JSONObject jsonObject = jsonArray.getJSONObject(i);
						data.add(jsonObject.getString("title"));
						data0.add(jsonObject.getString("url"));
					}
					list.setAdapter(adapter);
					list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
						@Override
						public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
							String url = data0.get(i);
							//Toast.makeText(MainActivity.this, String.format("選択したのは%s", url), Toast.LENGTH_SHORT).show();
							Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
							startActivity(intent);
						}
					});
				}
				catch (JSONException e)
				{
					e.printStackTrace();
				}
			}
		}.execute();
	}
```


以上。
Linux ユーザ・グループアカウントに関するコマンドについて（自分用メモ

●ユーザ。グループアカウントに関するコマンドのまとめ
・passwd ユーザのパスワードを変更
・chage パスワードの有効期限を変更
・useradd ユーザアカウントを新規作成
・userdel ユーザアカウントを削除
・usermod 既存のユーザアカウントの設定を変更
・groupadd グループアカウントを新規作成
・groupdel グループアカウントを削除
・groupmod 既存のグループアカウントの設定を変更
・id ユーザのUIDやGIDを表示
・groups ユーザの所属するグループを表示
・gpasswd グループのパスワードやメンバーを設定

●useradd

useradd [オプション] ユーザ名

オプション
・-c コメント　コメントを指定
・-d ディレクトリ　ホームディレクトリを指定
・-g グループ名|GID プライマリグループを指定
・-G グループ名|GID プライマリグループ以外に参加する補助グループを指定
・-s シェル　ログインシェルを指定
・-D アカウントのデフォルト値を表示または設定
・-m ホームディレクトリを作成(存在しない場合)

※Debian系ディストリビューションでは、「-m」オプションを使用しないとホームディレクトリは作成されない。

ユーザを新規作成する際、ホームディレクトリが存在しない場合には、ホームディレクトリが作成され、「/etc/skel」ディレクトリ以下のファイルがホームディレクトリにコピーされる。


●userdel

userdel [-rf] ユーザ名

「-r（--remove）」オプションを付けると、ユーザのホームディレクトリも削除できる。またユーザがログイン中などで削除できない時には「-f（--force）」オプションを使うことで強制的に削除することができる。


●usermod

usermod [オプション] [ユーザ名]

オプション
・-d ディレクトリ　ホームディレクトリを指定
・-g グループ名|GID プライマリグループを指定
・-G グループ名|GID プライマリグループ以外に参加する補助グループを指定
・-s シェル　ログインシェルを指定
・-L パスワードをロックする
・-U パスワードをアンロックする
・-p 暗号化済みパスワード　暗号化済みパスワードを設定する

※usermodコマンドの-pオプションでは、crypt関数で暗号化済みのパスワードを設定。rootユーザが実行できる。


●passwd

passwd [オプション] [ユーザ名]

・-l パスワードをロックする
・-u パスワードをアンロックする

「passwd」コマンドをオプション無しで実行すると、パスワードの設定・変更ができる。自分以外のユーザのパスワードを変更できるのは、rootユーザのみ。

●groupmod

groupmod [オプション] グループ名

オプション
・-g GID GIDを変更
・-n グループ名　グループ名を変更


●id
ユーザの所属するグループを確認するには、「/etc/passwd」や「/etc/group」ファイルを直接参照するか、idコマンドやgroupsコマンドを使用。
idコマンドはユーザのUIDや、所属するグループのGIDを表示。

id [オプション] [ユーザ名]

オプション
・-u　UID(ユーザID)を表示
・-g　ユーザのプライマリグループのGID(グループID)を表示
・-G　所属する全てのグループのGIDを表示

※ユーザ名を省略すると、コマンドを実行したユーザの情報を表示。
オプションを省略すると、UIDと所属する全てのグループのGIDを表示


●対話的ログインを禁止するにはログインシェルを「/bin/false」または「/sbin/nologin」に設定

ログインシェルは「usermod -s」や「useradd -s」（ユーザ作成時）コマンドで設定できる。
また、シェル変更専用のchshコマンドでも変更が可能。オプションでシェルを指定する場合「chsh -s」を使用する。
※ただし、ログインシェルに設定するシェルは「/etc/shells」ファイルに登録されている必要がある。



■「/etc/passwd」ファイル
ユーザのアカウント情報が格納

■「/etc/group」ファイル
グループに関する情報が格納

■「/etc/shadow」ファイル
暗号化されているパスワード（シャドウパスワード）や、パスワードの有効期限に関する情報が格納
Microsoft365のOutlookで仕分けルール（rwzファイル）のエクスポートとインポート

# エクスポート or インポート画面への行き方

ホーム。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5f6695ce-5343-a3ad-aecb-f965dd85d5f2.png)

移動⇒ルール⇒仕分けルールと通知の管理。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/d0649da6-29c3-841b-6035-6d28ef611566.png)

電子メールの仕分けルール⇒オプション。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/58056c7f-97dd-2c7e-374c-0762e2ab0adf.png)

ここでrwzファイルのエクスポートとインポートが行える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/571ddcad-9955-3862-9d3c-674202c6faaa.png)

# インポート前に移動先フォルダーの作成が必要なことに注意

例えば
『特定のメールアドレスから受信したメールは、〇〇というフォルダーに移動』
という仕分けルールをインポートする場合。

**移動先の『〇〇というフォルダー』が無い状態** でrwzファイルをインポートしようとすると下記エラーになる。

> すべてのオプションが設定されていない仕分けルールがあります。
> 仕分けルールを保存する際に、オプションが設定されていないものは無効になります。
> 仕分けルールを保存しますか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/d1095405-ba90-31a6-740a-78e2c35089e1.png)

このまま『はい』で続行すると、下記のようにインポートが終了してしまう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/e2f4c4c4-bc09-742b-2399-1559a5b9d2bb.png)

仕分けルールは無効になり、移動先のフォルダーは『指定』= 未設定 な状態 。

また、移動先フォルダーの作成には **エクスポートする側のフォルダー構成を控える** ことも必要。
エクスポートしたからといって、すぐにエクスポート側のデータや設定等を消さない方がいい。

# 既に仕分けルールがある状態で同じ仕分けルールをインポートした場合

仕分け設定がもう一つ作成（重複作成）される。

『仕分け設定のインポート』は仕分け設定を **単に追加するだけ** で **アップサートではない** 。
（ **デリートインサートでもない** ）

# インポート後の仕分け実行方法（インポート前に受信した過去メールの仕分け）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/a6b2b9a9-6bef-c1d9-90b9-5c383333f6bd.png)

仕分けルール単位で実行可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/bf4723c2-69c3-e8a0-02f4-615e53e53fdd.png)


# バージョン

Windows 10 Pro 21H2 OSビルド 19044.1889
Microsoft Outlook for Microsoft 365 MSO (バージョン 2207 ビルド 16.0.15427.20166) 32 ビット

TODO:pstファイルに仕分け設定が埋め込まれているか調べる。（アカウントの引っ越しならpstファイルの移管だけで済むかも）
モノクロ画像をAIでカラー化してくれるPythonツールを試してみた

このツイートが目に留まったのがきっかけでした。

https://twitter.com/miyashin_prg/status/1546426570545319936?s=21&t=vout76Kzg-tgNjyDQWo3Rg

お、コマンド3行打つだけじゃん！面白そうやってみよう。
　↓
環境準備＆地味に色々なエラーと格闘したので奮闘記を残します。


# 環境前提

私の環境は以下でした。

- M1 MacBook Air
- 標準ターミナル（zsh）


# その1：環境準備編

### Pythonのインストール

公式ページからMac OS用の最新Python 3をダウンロード。GUIインストーラーを利用して導入。
pipも同梱されています。

https://www.python.org/downloads/

実行確認

```zsh
$ python3 --version
$ pip3 --version
```


### Zshプロファイルにエイリアス登録

プロファイルをテキストエディターで開く

```zsh
$ open ~/.zshrc
```

ファイル内に以下を追記する

```zsh
alias python='python3'
alias pip='pip3'
```

（参考ページ）

https://qiita.com/yuuman/items/90d9253c52ee35f91d66

プロファイルを上書き保存後、ターミナルを再起動する。
バージョン確認コマンドが正しく通るかチェック

```zsh
$ python --version
$ pip --version
```

### pipのアップグレード

```zsh
$ python -m pip install --upgrade pip
```


# その2：依存ライブラリー導入編

### 本題アプリ「Colorization」の入手

https://github.com/richzhang/colorization

```zsh
$ git clone git@github.com:richzhang/colorization.git
$ cd colorization
```


### 依存ライブラリー名の修正

`requirements.txt` をそのままpipで実行するとエラー多数になるため、ライブラリー名を修正

- skimage → scikit-image
- PIL → pillow

（参考）

https://yukun.info/python-pip-pil-install-error/

直せたら以下を実行。

```zsh
$ pip install -r requirements.txt
```


# その3：アプリ実行編

適当なモノクロ画像ファイルを用意し、いよいよアプリを実行。

```zsh
$ python demo_release.py -i 画像ファイルのパス
```

するとこんなエラーが発生。

```zsh
raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:997)>
```

FinderでPythonインストールフォルダーにあった `/Applications/Python 3.XX/Install Certificates.command` というファイルをダブルクリックして実行したら上記解消。以下サイトのおかげです。

（参考）

https://baba-s.hatenablog.com/entry/2022/01/10/210400

多分ここまでやればエラーなくアプリ実行できるはず。
実行中のダウンロード処理？にそこそこ時間かかりますが、成功するとPythonウィンドウが開いてカラー画像を2パターン並べてくれます。
![スクリーンショット 2022-07-11 23.25.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/4ec2159d-28e5-5fee-8a9a-d2af0c37416e.png)


# さいごに

面白いツールの情報を発信してくださったみやさかしんやさん、ありがとうございました m(_ _)m
みやさかさんのブログ記事は以下です。

https://miyashinblog.com/colorization/
サマーインターンを簡単に振り返ってみる

# はじめに
2022年の夏休みに[いい生活](https://www.e-seikatsu.info/)さんのサマーインターンに参加しました。忘れないうちに振り返りを書こうと思います。今までの就活（まだ始まったばかりだが）の感想については他の記事で書きます。

# やったこと
- Vue.js と社内APIを用いたチーム開発

# 選考
- ES
- 面接

# 感想
- チーム開発は初めてだったので、git の有効な使い方を初めて肌で感じることができた。
- そもそも開発自体が初めてだったので、エンジニアの業務の地道さを知ることができた。また、肌で実務を体験することで就活のモチベーションの向上に繋がった。
- 自分は競プロを少し触った程度ぐらいしかアピールポイントがなかったが、他の人は大体何かしらの開発経験がある人が多かった（なぜ自分がこのインターンに受かったのかわからない）。
- メンターの方がチームごとについてくださったが、わからないことを聞いたらかなり親身になって対応してくださって助かった。
- 事前学習教材が初心者にもわかりやすかった。また、インターン中の講義も丁寧に作られており、何かわからないときにはかなり参考になった。
- API ってなんだろというまっさらの状態でインターンに臨んだが、実戦的にまずは技術を用いていくことで理解につながっていったと感じた（まだまだ理解が足りていないのは認識している）。
- 全くの未経験でもバランスを考えてチームを振り分けてくれたと思うので、Python ちょっと授業でやったことあるよって人でも十分やっていけると思った。やる気があればなんとでもなる。
- なによりチーム開発で何かを生み出す作業が新鮮で楽しかった。

### 総括
インターンで上がったモチベーションを維持して、アプリ開発してみようと思いました。また、エンジニアの就活には成果物があると有利だと聞いたので、積極的にgithubに記録していこうと思いました。まずは、インターン中のノリでUdemyのセールで爆買いした講義を消化してWebアプリ開発をしてみようと思います。
Homebrewインストール　「Calling Cask::DSL::Version#after_colon is disabled! Use Cask::DSL::Version#csv instead.」とエラー　解消法

## 環境
-OS: mac Monterey ver12.5.1

## 背景
業務でdockerを使うことになったので勉強のために個人用PCでも
docker環境構築をしてみることに。
初っ端のhomebrew　インストールからエラーが出てしくじった。。。。。

行ったことはこちら↓
**1.** https://brew.sh/ のページから
```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
をコピペ。
ターミナルで実行。

**2.** エラー！！！
```
Error: Calling Cask::DSL::Version#after_colon is disabled! Use Cask::DSL::Version#csv instead.
Please report this issue to the homebrew/cask tap (not Homebrew/brew or Homebrew/core), or even better, submit a PR to fix it:
  /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask/Casks/fritzing.rb:10
```

このエラー内容で検索するもあまりこれ！というものにヒットせず。。。

# 解決策
**1. brew doctor コマンドの実行**
```　
brew doctor
```
どうやら`brew doctor`とは　Homebrew周りでエラーが起きた時にチェックできるコマンドらしい。。


実行後、こんなエラーが出てきた！！
```
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: Unbrewed static libraries were found in /usr/local/lib.
If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected static libraries:
  /usr/local/lib/libTMAESCrypt.a
```
日本語に訳すと、
brew化（？）されてないライブラリがあって、トラブルの元になるから消した方がいいかもね、とのこと。

**2.　不要ファイルの削除**

ということで`brew doctor` で指定されたファイルの削除を実行！
```
$rm -rf /usr/local/lib/libTMAESCrypt.a
```

その後、また`homebrew`　インストールを実行。
```
==> Installation successful!

==> Homebrew has enabled anonymous aggregate formulae and cask analytics.
Read the analytics documentation (and how to opt-out) here:
  https://docs.brew.sh/Analytics
No analytics data has been sent yet (nor will any be during this install run).

==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
  https://github.com/Homebrew/brew#donations

==> Next steps:
- Run brew help to get started
- Further documentation:
    https://docs.brew.sh
```

`Installation successful!` とでたので無事インストール完了しました！
EfexMonでアセンブラ

EfexMonにはアセンブラも入っているので、試してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/c101cbb2-4f67-9af5-541a-87b6bb47f302.png)

コマンドは大文字で、抜けるのはエスケープです。

HALT(18)を74LS04をはさんでLEDをつけているので、点灯します。

![HALT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/caf5e301-5af6-5620-4d00-cd864fcd59c7.png)

![写真（2022-09-03 8.38）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/d9177d47-41df-6621-4651-7841e782c4e3.jpeg)

オレンジのLEDがPowerで赤がHALTで手前の緑は8255につながっている。

プログラムをデバッグするときに、どこまで進んでいるかを確認するのにHALTを使うことがあります。
【Laravel】Eloquentのdelete()メソッドで、モデルイベントが発生しない（場合がある）

モデルの削除時に何か処理をしたい場合、下記のように実装することができます。

```PHP:Laravel
class Post extends Model
{
    public static function boot()
    {
        parent::boot();

        self::deleting(function ($item) {
            // 削除時の処理
                :
                :
        });
    }
}
```

例えば、削除するレコードに関連した別のレコードを更新する、レコードが削除されたことを通知する（ここに実装する処理ではないかもしれませんが例えば、です）、みたいな処理が考えられますね。

ですが、下記のようなコードではイベントが発生しません。

```PHP:Laravel
    Post::where('id', '<', 10)
            ->delete();
}
```

この挙動については Laravel のドキュメントにも記載ありました。
https://laravel.com/docs/8.x/eloquent#events
>When issuing a mass update or delete query via Eloquent, the saved, updated, deleting, and deleted model events will not be dispatched for the affected models. This is because the models are never actually retrieved when performing mass updates or deletes.

Eloquentを介しての大量の更新処理、削除処理に対してモデルイベントは発生しません・・・、ということですね。

解決策としては、

１つひとつ削除するか、
```PHP:Laravel
    Post::where('id', '<', 10)
            ->get()
            ->each(function($item) {
                $item->delete();
            });
}
```
destory()メソッドを使用します。
```PHP:Laravel
    $ids = Post::where('id', '<', 10)
            ->get()
            ->pluck('id')
            ->toArray();
    Post::destroy($ids);
}
```
Salesforce認定アドミニストレーター試験の公式練習問題を解説してみた-その012

こんにちは。本橋孝昭です。

Salesforce認定アドミニストレーター試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回はTrailhead
アドミニストレーター認定の準備: 構成、設定とオブジェクト
構成と設定の学習　にある練習問題12問目をご紹介します。
https://trailhead.salesforce.com/ja/content/learn/modules/administrator-certification-prep-setup-and-objects/study-up-on-org-setup

なお、こちらの内容はYouTubeでも公開しております
https://www.youtube.com/watch?v=ospmi4mC8v8

<iframe width="560" height="315" src="https://www.youtube.com/embed/ospmi4mC8v8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


問題はこちらです
![012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/fbbcbbc2-6764-bffe-f26c-e65341d5c6e3.png)

正解はAとBとCです

プロファイル設定で

・レコードタイプの割り当て
・項目レベルセキュリティ
・割り当てられたアプリケーション


の変更が可能です。


Dについて
Eについて
こちらはユーザレコードからの設定なので間違いです

Service Cloud機能ライセンスはユーザページから設定可能です
https://help.salesforce.com/s/articleView?id=sf.console2_assign_service_feature_license.htm&type=5

地域設定もユーザページから選択可能です


今日の内容はここまでです。
皆さん楽しく元気にSalesforceを学びましょう！
画像認識における Pytorch VS Tensorflow 

# 概要
　よく議論されるTopicで一度は皆が疑問に思う、"PytorchかTensorFlowどっちが良いの？"について個人的な意見を述べたいと思います。PytorchとTensorflowそれぞれに良い所があり、場合によって使い分けましょうという記事が沢山あるので、今回はどちらか断言してみたいと思います。画像認識のタスクを学習し、ロボットに搭載する仮定で話します。

# 論文で使われいる割合
　画像認識ではPytorchが圧倒的に多いです。感覚的には9割くらいかなと。基本的に開発は前に書いた人のコードを元にするので、違うライブラリーだと一から書き直さないといけないので大変です(汗)。

# Third Party Library
　Pytorchには[Torchvision](https://github.com/pytorch/vision), [Pytorch-Lightning](https://github.com/Lightning-AI/lightning), [mmlab](https://github.com/open-mmlab)があります。これらが優秀すぎます。比較ではないのですが、これらのライブラリーの便利さを簡単にまとめます。

　Torchvisionは様々な画像認識に使える関数があるのですが、中でも学習済みモデルを[create_feature_extractor](https://pytorch.org/vision/main/generated/torchvision.models.feature_extraction.create_feature_extractor.html)という関数を使うとBackboneの部分として再利用出来ます。Neckは[FPN](https://pytorch.org/vision/main/generated/torchvision.ops.FeaturePyramidNetwork.html)をサポートしています。という事は残りはHeadだけを自分で書けばモデルが出来上がります。

　Pytorch-Lightningは学習時に必要な幾つものコーディングを簡略化してくれます。使えるようになるとバグが減り、コーディングリビューがしやすくなります。

　mmlabは複数のモデルをConfiguration fileから設定できます。現状、mmlab以上にデータ構造が綺麗なPerceptionのライブラリーは見たことがありません。mmlabを直接使う事も凄く便利ですし、僕はmmlabのコーディングを参考にして複数モデルかつ複数タスクを行えるPerceptionのライブラリーを作りました。

# Pythonで学習したモデルをC++で実行した場合の速度
 TensorflowはC++で書かれていて、それをPybind11でPythonをサポートしています。故に実行速度が早いと言われています。一方PytorchはPythonとC++は別々に書かれているので、PythonのコードをC++にexportすると多少遅いと言われています。これらの理由からTensorflowはC++でのリアルタイム実行に向いていると言われています。

 しかし、実行速度を早くしたい場合は、ONNXやTensorRTのフォーマットに変換して実行します。故にどっちを使っても変換してしまえば、速度は変わらない筈です。しかも、Pytorch1.12以前のJIT Compiler(実行時用コンパイルラー)がCPUとGPUで同じnncというコンパイラーを使っていましたが、[Pytorch1.12はGPUのJIT CompilerがNVIDIAが開発しているNVFuserになった](https://pytorch.org/docs/stable/jit.html#fusion-backends)ことにより、処理速度が向上しました。今後もVersionが上がる毎にサポートが増えたり、より速く実行できるようになると開発者は言っていました。

　余談ですが、僕はTorchScriptを使っています。理由としてはLibtorchにある関数を使えるので、前処理や後処理の部分をPytorchとほとんど同じようにコーディング出来るからです。TensorRTに関しては[Torch-TensorRT](https://github.com/pytorch/TensorRT)を使っています。これはTensorRTのラッパーなので、TorchScriptでもTorch-TensorRTでも同じコードで実行できます。

# 結論
　結論は研究場合も実用の場合もPytorchが良いと思います。僕がPytorch Userなので完全に贔屓しているような記事になってしまいました(汗)。実用の際はライブラリーの選択はかなり重要になるので、Tensorflowを使うメリットをかなり調べましたが、Pytorchに出来ない事が無いかなという感じです。やはり論文で使われたgithubやThird Partyが豊富な事が開発に置いて重要だと思っています。良ければコメントにどちらを使っているかとその理由を書いて頂けると、勉強になりますのでよろしくおねがいします。
(若い)プログラマーのみなさんにぜひオススメしたい秋の夜長に効く音楽

# Roni Size “New Forms” (1997)
アメリカで吹き荒れていたヒップホップの嵐。それに対するイギリスからの回答といった趣きのこの音楽はドラムンベースと呼ばれました。こういうの(これに限らず下で紹介するアルバム全ても)を聴く時に最も大事なのは、低音をきちんと再生できる装置で聴くこと。PCのスピーカーから聞こえてくるのは、スカスカの、例えて言えば、音楽の小指の爪の先っぽ。かといって爆音で音楽を聴ける贅沢な環境を持っている人はそれほどいないでしょう。私がオススメするのは、ちゃんとしたオーディオメーカーのイヤフォン/ヘッドフォンです。1〜2万円あればそこそこの音質のものが手に入ると思います。遮音性の高いものであれば音量をそれほど上げなくても、良い音質で音楽を楽しめるでしょう。必要以上に大きな音で聴くのは耳にダメージを与えてしまいます。衰えた聴力は回復しないといいます。これからもっともっと音楽を楽しむために、どうか耳を大事にしてください。

# Norah Jones “Come away with me” (2002)
彼女が22才の時に、ジャズの名門ブルーノートから出したファーストアルバム。まるで湧き出る泉のように音楽が溢れてくる。

# The Jimi Hendrix Experience “Axis: Bold As Love”(1967)
アメリカからイギリスに渡って、誰も聴いたことがない音楽を創り出し、6年ほどの活動期間の後、27歳で早逝するという、嵐のような人生を歩んだ人。奇妙なファッションに身を包み、ギターを叩き壊して燃やすという過激なパフォーマンスのせいで、キワモノ的な扱いをされることもあった。でも、彼の音楽性の高さは、その音楽が半世紀を経た今でも人々の心を揺さぶり続けていることで証明されています。

# David Bowie “Heroes”(1977)
ベルリンの壁(=立ちはだかる悪)を憎み、立ち上がった人々による、愛と勇気の勝利(1989年のベルリンの壁崩壊)を予言したかのようなアルバムタイトル曲。いつ聴いても勇気を与えてくれる。

# Miles Davis “Kind of Blue”(1958)
ジャズは難しい？　そんなこと全然ないです。響きを楽しみ、音の流れに身を任せるだけでいいんです。何度も聴いて、偉大なミュージシャン達のソロを口ずさめるようになる頃には、頭のキレがそうとうよくなっているはずです(マジで)。

# Metallica “Master of Puppets”(1986)
アメリカの国民的作家であるスティーヴン・キングがファンであることを公言し、執筆中に彼らのアルバムをガンガンかけている、とインタビューで語っているのをどこかで読んだ。もしかしたらコーディング中に聴けば1980年代のキング作品みたいに「キレた」コードが量産できるかも、と思ってやってみた。「スラッシュメタルなんて」などとバカにしていると損をする。これは本当に効く。

# The Beatles “Rubber Soul”(1965)
まさか「ビートルズ」を聴いたことがない、という人はいないと思うけど、もしいたら可哀想なのでご紹介します。その昔、世界中の若者から熱狂的に支持され、大人たちから眉をひそめられたバンド。これは彼らが20代前半の頃に作ったアルバム。音楽の神に愛されていたんでしょうね。奇跡のように輝く曲たち。

# 村治佳織 “ポートレイツ“(2009)
世界中のクラシック音楽ファンから愛されている本物の響き。聴きはじめると「あ、オレいま体に良いものを取り込んでるな」っていうのがすぐに分かる、それくらい本物。

プログラマーは技術だけでなく、知性を身につけるべきだと私は思っています。知性を身につけるには、よい映画をたくさん観て、よい本をたくさん読んで、よい音楽をたくさん聴くこと。

スティーブ・ジョブズはiPodのことを”Device for heart”と呼びました。ここで私が知性と呼んでいるものは、そのハートのことです。

この記事が、これからみなさんがよいものを見つけていくきっかけになってくれればうれしいです。
ミニPCにUbuntu 22.04をインストール

アマゾンタイムセールで買った2万ちょいのミニPCにUbuntu Desktop をインストールしました。

# ワンペで概要
別記事で、Winの上のWSL2にUbuntuをインストールしてみたのですが、
今回はミニPCの上に直接Ubuntuをインストールしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/0571e288-9f82-1cb8-bc73-ffc124d643cc.png)

# 材料
メインのPC：Ubuntuをダウンロード。インストール用のUSBメモリ作る。

ミニPC　Beelink Minis : 2万ちょい こちらにUbuntuをインストール
　・Win11, 8GB DDR, 128G SSD, Intel N5095

Ubuntu
　・Linuxの一つ。DockerではUbuntu, Debian, Fedoraを推奨。
　　Google検索するとUbuntuを使ってる人が多そう。
　　　Docker Ubuntu : 69,600,000 件
　　　Docker fedora :  6,880,000 件
　　　Docker debian : 24,000,000 件 

USBメモリ
　・32Gのメモリ（最低4Gは必要そう）

# 参考文献
[1] Ubuntuチュートリアル https://ubuntu.com/tutorials/install-ubuntu-desktop#1-overview

# 詳細手順
## 1. Ubuntuダウンロード
https://ubuntu.com/tutorials/install-ubuntu-desktop#2-download-an-ubuntu-image

Ubuntu 22.04.1 LTS(Long time support)のisoをダウンロード

せっかくなので理化学研究所からダウンロード

https://qiita.com/seigot/items/a88c47d52a4ad3ea351d

## 2. Ubuntuインストール用USBを作る
・balenaEtcherをインストール
・USBメモリにisoを書き込む　→できた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/bd83b892-0e0e-b1ed-918e-21544e8a308f.png)

## 3. USBメモリからUbuntuをインストール
・ミニPCにUSBメモリを刺す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/bf54d46a-b966-351d-f108-b822a9a91bc1.png)
・電源ON　Biosメニューへ（F7連打）
・USBメモリからブートを選ぶ
　・Try to install Ubuntu
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/d41268e1-d59e-40c7-0c33-dab124e1f17d.png)
・UtuntuインストーラーでInstall Ubuntuを選ぶ　日本語も選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/209a4945-a758-b019-f0ec-2c91dcad5782.png)
・あとは指示に従えばOK

## セキュリティー
・Ubuntu single sign onアカウント作成
・Livepatchを有効化

出来上がり。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/387513f6-efb5-3219-7bdf-354ff2eb4313.png)
Python,Ruby,PHP,Java,JavaScript,Perlの正規表現の比較




<a href="https://qiita.com/yuki_kimoto/items/f9c2454e7f9130ddb003">Qiita > プログラミング言語の比較</a>

Python,Ruby,PHP,Java,JavaScript,Perlの正規表現の比較

# Python

https://qiita.com/FukuharaYohei/items/459f27f0d7bbba551af7

# Ruby

https://qiita.com/shizuma/items/4279104026964f1efca6

# PHP

https://qiita.com/miriwo/items/da463cfcae441400381a

# Java

https://qiita.com/suema0331/items/5dde9f91671100a83905

# JavaScript

https://qiita.com/iLLviA/items/b6bf680cd2408edd050f

# Perl

https://perlzemi.com/blog/20100827127859.html
LPC812MAXでソフトウェアI2Cで遊ぶ



x mbed2リビジョン144
x リビジョンを変更できる人むけ


目的
I2C-USART用のテスト


![o_con714.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/217bf789-b60d-bb72-a950-a20ae2a7268f.jpeg)


![o_con715.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/eb41c22d-fb72-6695-ac35-bbe09e3c7aa9.jpeg)




イメージです。


![o_con368.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e7af4ae3-dbc0-a82c-9884-d6c19ea39110.jpeg)




資料


https://qiita.com/caa45040/items/5032e6905c9425f41495



```c++



//soft_i2c_test_812_1

#include "mbed.h"

DigitalInOut SDA1(P0_10, PIN_OUTPUT,OpenDrain,0);
DigitalInOut SCL1(P0_11, PIN_OUTPUT,OpenDrain,0);

//A5
#define SCK_0_HIGH()  SCL1=1
#define SCK_0_LOW()   SCL1=0

//A4
#define SDA_0_HIGH()  SDA1=1
#define SDA_0_LOW()   SDA1=0

// 1000us   1kh
//  100us  10kh
//   10us 100kh
#define myDelay()  wait_us(100);


int soft_i2c(char add_p, char data_p)
{

    int ii; //カウンター

    //待ち
    SDA_0_HIGH();
    SCK_0_HIGH();
    myDelay();
    myDelay();
    myDelay();

    //START
    SDA_0_LOW();
    myDelay();
    SCK_0_LOW();
    myDelay();

    for (ii = 0; ii < 8; ii++) {
        SCK_0_LOW();
        if ( ((add_p << ii) & 0x80) == 0 ) {
            SDA_0_LOW();
        } else {
            SDA_0_HIGH();
        }//endif
        myDelay();
        SCK_0_HIGH();
        myDelay();
    }//for

    //ack
    SCK_0_LOW();
    SDA_0_HIGH();
    myDelay();
    SCK_0_HIGH();
    myDelay();
 
    for (ii = 0; ii < 8; ii++) {
        SCK_0_LOW();

        if ( ((data_p << ii) & 0x80) == 0 ) {
            SDA_0_LOW();
        } else {
            SDA_0_HIGH();
        }//endif

        myDelay();
        SCK_0_HIGH();
        myDelay();
    }//for

    //ack
    SCK_0_LOW();
    SDA_0_HIGH();
    myDelay();
    SCK_0_HIGH();
    myDelay();

    //STOP
    SCK_0_LOW();
    SDA_0_LOW();
    myDelay();
    SCK_0_HIGH();
    myDelay();
    SDA_0_HIGH();
    myDelay();

    return (0);
}//soft_i2c


//メイン関数
int main()
{

    SCL1 = 1;
    SDA1 = 1;

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

        char *ss1 = "hello world\r\n";
        int ii=0;
        while(ss1[ii] != 0 ){
            soft_i2c(0x80, ss1[ii]);ii++;
        }//while
        
        wait_ms(1000); //1秒の待ち

    }//while

}//main





```
⧉Master/SlaveやBlacklist/Whitelistの置き換え

プログラムで使う関数名、変数名を決めるときの単語に悩まされることが多いです。
そんな時に[Ted-HM][]様の記事「[プログラミングでよく使う英単語のまとめ【随時更新】][]」を良く拝見させていただいています。
非常に便利で良く利用させて頂いているのですが差別用語に関わるものが掲載されていません。
デリケートな部分でもあるため掲載を避けておられるかもしれないですが、私個人は嫌がる人がいるならできる限り置き換えるべきだと考えています。
メモファイルを開くより掲載されてた方が便利なので自分用のメモを兼ねて置き換えられる単語リストを掲載させていただきます。

## Master / Slave

|Master|Slave|
|:-|:-|
|Controller|Device|
|Director|Performer|
|Host|Client|
|Host|Worker|
|Host|Proxy|
|Initiator|Target|
|Leader|Follower|
|Main|Replica|
|Main|Secondary|
|Main|Subordinate|
|Manager|Worker|
|Manager|Helper|
|Parent|Child|
|Primary|Replica|
|Primary|Secondary|
|Primary|Standby|
|Requester|Responder|

## Blacklist / Whitelist
|Blacklist|Whitelist|
|:-|:-|
|Blocklist|Passlist|
|Denylist|Allowlist|




[Ted-HM]: https://qiita.com/Ted-HM 
[プログラミングでよく使う英単語のまとめ【随時更新】]: https://qiita.com/Ted-HM/items/7dde25dcffae4cdc7923#%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%A8%E7%99%BB%E9%8C%B2%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
Firebase CloudFunctionsでデプロイしても反映されないなと思った時に確認すること


Firebase CloudFunctionsを使っていて
`firebase deploy`とか`firebase deploy --only functions`とかをしてデプロイがちゃんとできているはずなのに，なぜか古い関数のままで実行されていて，変更した新しいコードが反映されないなーと思ったときに確認したい内容．

### 1. そもそもターゲットのプロジェクトはあってますか
開発環境と本番環境で切り分けてる人は切替え忘れてるかもね．
`firebase use`で確認できます

### 2. ちゃんとビルドしてますか
デプロイする前に`npm run build`されるようになっていますか？
デフォルト状態だと`firebase.json`で`predeploy`として定義してくれてるけど，何かの拍子に変えてしまったりしてないかな

### 3. エントリーポイントのパスが変わってませんか
`package.json`をみてください．
デフォルトだと
```json
...
...
"main": "lib/index.js",
...
...
```
になっていると思うけど，importするファイルとか増やしてると，自動的に`lib/src/index.js`にパスが変わってる可能性がありますよ．ビルドした後のパスがどうなってるか確認して書き換えましょう．
もしくはビルドしたときにちゃんと`index.js`がlib以下に来るように設定しましょう

特に3つ目は気づかずに1時間くらい困ってたので誰かの参考になれば
2022/9/3主にITとかセキュリティの記事

サーバへランサム攻撃、情報流出を確認 - リケン
https://www.security-next.com/139401

「CODE BLUE 2022」の一部登壇者が明らかに - 5Gハッキングなど
https://www.security-next.com/139447

古いiPhone、iPad、iPod touchに緊急アップデート、重大な脆弱性(9/1)
https://news.mynavi.jp/techplus/article/20220901-2440950/

「明治」シンガポールの子会社にサイバー攻撃 被害など確認中(9/1)
https://www3.nhk.or.jp/news/html/20220901/k10013798431000.html

明治ＨＤのシンガポール子会社にサイバー攻撃…１４００万円支払い要求(9/1)
https://www.yomiuri.co.jp/economy/20220901-OYT1T50271/

「我が社のセキュリティ意識には問題あり」ワースト 3 業界(9/1)
https://scan.netsecurity.ne.jp/article/2022/09/01/48121.html

日本の建設産業に大規模サイバー攻撃「Xデー」、ウクライナ復興支援で浮上(9/1)
https://xtech.nikkei.com/atcl/nxt/column/18/02165/082300005/

サイバー攻撃、弱い組織を突破口にサプライチェーン全体浸食の危険(8/31)
https://online.logi-biz.com/65456/

“三越伊勢丹”を騙るフィッシングサイトが増加、9月は旅行関連に要注意(8/31)
https://gunosy.com/articles/eRVwR

セコムトラストシステムズ、無料オンラインセミナー「Webサイトのセキュリティ対策」9月14日開催 ～ Web攻撃事例や無料サーバー証明書のリスクほか
https://scan.netsecurity.ne.jp/article/2022/09/01/48127.html

GitLab にXSSの脆弱性(9/1)
https://scan.netsecurity.ne.jp/article/2022/09/01/48122.html

無料のクラウドストレージはどれがいい？|おすすめ無料クラウドストレージ7選【インターネット基本(9/1)
https://gunosy.com/articles/eOqtR

Slackを契約する米国企業1社に日本企業の個人情報等を一時的に開示(9/1)
https://scan.netsecurity.ne.jp/article/2022/09/01/48124.html

グーグル、悪質な「Chrome」拡張機能を削除--計140万ダウンロード(9/1)
https://japan.cnet.com/article/35192616/

複数の防御手段でセキュリティーを強化、多層防御とは（中）(8/31)
https://project.nikkeibp.co.jp/idg/atcl/19/00320/081900002/

スマートコントラクトのエクスプロイト排除が最も困難であることが判明(9/1)
https://nextmoney.jp/?p=52814

TikTokのAndroidアプリに1クリックでアカウント侵害可能な脆弱性──Microsoftが報告（修正済み）(9/1)
https://www.itmedia.co.jp/news/articles/2209/01/news079.html

1万超のAndroidアプリにハードコードされた機密情報、悪用されると危険(9/1)
https://news.mynavi.jp/techplus/article/20220901-2440939/

DevOpsを実践的に学べるオンラインイベントを無料開催『Microsoft & GitHub DevOps Day 2022』
開催日時：2022年9月29日（木）13:00〜18:00、DevOpsの有用性を体感！実践的なプラクティスを幅広く紹介
https://prtimes.jp/main/html/rd/p/000011141.000007006.html

未来は予測不可能でも、今見えている変化には対処できる
まつもとゆきひろ氏が語る、これからの時代に必要な心構え(9/1)
https://logmi.jp/tech/articles/327259

テスト配信？新「Google ウォレット」日本国内展開(9/1)
https://jetstream.bz/archives/155962

Visual StudioとWebStormを「デバッグ機能」で比較　どちらが“使える”か？(9/1)
https://techtarget.itmedia.co.jp/tt/news/2209/01/news15.html

オーストリアの裁判所、Cloudflare の IP アドレスをブロックするよう ISP に命ずる(8/31)
https://yro.srad.jp/story/22/08/30/1422239/

親にLINEなどの「UI」の意味が伝わらない、自分はいつどうやって慣れたんだ!?(9/1)
https://otona-life.com/2022/09/01/133761/

大量のアプリやウェブサイトに子どもの保護を義務づける法案が可決され「ネットユーザーの顔スキャン」が加速する危険性(9/1)
https://article.auone.jp/detail/1/3/7/48_7_r_20220901_1661983213203794

メタバースとNFT、Web3は日本で「過度な期待」--ガートナーが見解(9/1)
https://japan.zdnet.com/article/35192635/

クレカ情報大量漏洩にPCI DSS監査機関への虚偽報告、IT部門「聖域化」のリスク(9/2)
https://xtech.nikkei.com/atcl/nxt/column/18/00989/083100096/

データを破壊する「ワイパー」の脅威(9/2)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/111900071/081700035/

AWSは今や半導体メーカー、サーバーを「メインフレーム化」させた驚きの開発史(9/2)
https://xtech.nikkei.com/atcl/nxt/column/18/00692/090100088/

JPX総研とAWSが連携強化、取引所の基幹システムがクラウド移行する日は来るか(9/2)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/07126/
StringVariable を有する共通化された LocalizedString を各所で表示する方法

# この記事の目的
StringVariable を有した LocalizedString を利用する方法をよく忘れるので、
LocalizedString をコピーする方法と、StringVariable の設定方法を備忘するのが目的。

# 本題

例えば、ゲームを作る上で何かのミッションを表示する以下のようなUIを作成するとします。

![mission.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2803164/5086e998-7091-a70d-1d60-2cd8058c216a.jpeg)

この場合、様々なフォーマットが想定されるので、UI側で予め LocalizeString を設定しておいて、
あとから、StringVariable だけ修正するという手段を取ることができません。

そのため、マスターデータなどで表示パターンごとに、
以下のような StringVariable を有する共通化された LocalizedString を設定しておくことが想定されます。

:::note info
{monsterName}を、{count}体倒せ。
:::

:::note info
{monsterSkill}を受けろ。
:::

:::note info
{card}を踏め。
:::

これらの LocalizeString を切り替えた後に、StringVariable を設定するという設計です。
しかし、単純にマスターデータに設定されている StringValiable を UI に設定して、
StringVariable を追加すると、当然ながらすべて同じアドレスなのですべてのUIに影響します。
これを回避するためには、LocalizeString を複製して別のアドレスとしてあげる必要があります。

```C#:UiAchievementQuestController.cs
using UnityEngine.Localization;
using UnityEngine.Localization.SmartFormat.PersistentVariables;

// master.defeatMonster の型は LocalizedString
var localizeString = new LocalizedString(
    master.defeatMonster.TableReference,
	master.defeatMonster.TableEntryReference);

Define.Monster.ID monsterID = Define.Monster.ID.Ms_Goblin;
var monsterMaster = Master.Monster.GetMaster(monsterID);
var defeatCount = achievement.GetDefeatMonsterCount(monsterID));

StringVariable variableA = new StringVariable { Value = monsterMaster.monsterName };
StringVariable variableB = new StringVariable { Value = defeatCount };
localizeString.Add("monsterName", variableA);
localizeString.Add("count", variableB); 
uiTitle.text = localizeString.GetLocalizedString(); // title の型は、TMPro.TextMeshProUGUI
```

こんな感じです。
Unityのインストール

# はじめに
1年前にUnityを少しだけ触ってみたが、何も覚えていなかったため色々メモとして残していこうと思う。

# ダウンロード
・公式ページからダウンロード
![Unityダウンロード１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821619/bec1c163-7cd3-dab0-f39b-ded56002f02d.png)
「Unityを選択+ダウンロード」をクリック。
![Unityダウンロード2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821619/1fcfc55f-df6b-5279-6fde-7687cd855fe8.png)
「Student and hobbyist」の「Personal」プランを選択。
![Unityダウンロード3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821619/e831b440-8193-7feb-7235-2c0b532d144c.png)

それぞれのOSのダウンロードボタンを押すと「UnityHubSetup.exe」がダウンロードされる。

# Unityのインストールから起動まで
・インストールするフォルダのPathを指定し、「インストール」をクリック
![Unityインストール1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821619/6d02d58c-ada9-2249-0ca8-b03c2bf32494.png)
インストールが終わり、画面が切り替わったら「完了」をクリック。
![Unityインストール2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821619/fe05151f-b422-f208-6508-4f564fcc5571.png)
アカウントがなければ「Create account」をクリックし、指示に従い作成する。
アカウントがあれば「Sign in」をクリックし、サインインする。
![Unityインストール3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821619/b76fd655-0d6b-9007-e781-ae49c51a77c1.png)
サインインが完了するとUnity Editorのインストール画面が表示される。
「Install Unity Editor」をクリックするとライセンス承諾画面に遷移する。
![Unityインストール4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821619/86454614-aa0a-6152-2e3f-a9b166ae88fb.png)
「Agree and get personal edition license」をクリックすると、
![Unityインストール5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821619/686c4ab6-39f9-5487-a67b-0c16c0e12ce8.png)
Unity　Editorのインストールが始まる。
![Unityインストール6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821619/3511fa21-fea7-0061-9e6c-017d1596fe22.png)
「Install complete」と表示されたらインストール完了。

# おまけ
![プロジェクト作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821619/11d03ba0-4a09-5329-f25a-af6c5ed5687a.png)
「Projects」のタブから「New project」をクリックするとプロジェクトの初期設定画面に遷移する。
プログラムの責務を分けると何が嬉しいのか？  (例: バックエンド VS フロントエンド)

# 責務を分けると嬉しいこと

- 実装がシンプルになる。開発者に求められる知識量が減る。
- 変更に強くなる。
- 汎用性が高まる。

# 責務を分けないと何が起こるか

- 実装が複雑化する。開発者に求められる知識量が増える。
- 変更に弱くなる。
- 汎用性が低まる。

# 責務を分けないデメリット: 変更に弱い

たとえばあなたがバックエンドのAPIを作る場合、フロントエンドの仕様詳細まで気にかけたいだろうか。

たとえば「縦800pxの領域に成績グラフを描画するので、成績の1ポイントを8pxとして扱い、その値を返す」「成績が10なら80pxという値を返し、成績が20なら160pxを返す」というような実装をしたいだろうか。

もしそのような実装をしてしまった場合、フロントで領域の縦幅が1600pxになった場合はどうなるのだろうか。
正しい描画が出来なくなる。もしくはフロントの変更にあわせてバックエンドの変更まで必要になる。

外部への依存度が高い実装は変更に弱い。


# 責務を分けないデメリット: 開発者に求められる知識が増える

知識の種類、あるいは認知コストが求められる。

ひとたび依存度の高い実装をしてしまえば、プログラムを修正するにしても変更箇所が複数の実装にまたがる。
この場合で言えばフロントエンドとバックエンド両方の知識が必要になる。

これは開発者に優しくない。

# 変更に耐える仕様

そもそもバックエンドAPIでは「成績が10ptの時は10を返す」「成績が20ptの時は20を返す」というように「外部の知識を持たない設計」にしておくとどうだろうか。
フロントエンドではその成績のポイントに応じて適切なpxを算出してグラフを描画すれば良い。

この仕様であればフロントの描画方法が将来的にどう変わったとしても恐らく、バックエンドAPIには変更の必要がなくなる。


ここでは話を単純化しているので、当然の実装だと思われるだろうが。

# 「変えなくても良いこと」は価値である。

変える必要がなければ、そもそも変更のコストはかからず、新しいバグが生まれる可能性もない。

# 責務を分けると汎用性が生まれる

たとえばひとつのバックエンドAPI(のエンドポイントで返されるレスポンス)を利用して、複数のインターフェイスが実装できる。

- フロントエンドのページAではグラフを描画する
- フロントエンドのページBではテーブルに値を表示する
- モバイルアプリでは縦長のグラフを描画する


逆にバックエンドAPIがフロント実装に依存している場合は、インターフェイス単位でバックエンドの実装・変更が必要になる。


<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura

<!-- Update From Qiita API -->