OmniAICreator/Qiita-1.07M huggingface dataset:
【パブリッシャー】Eメールをクエリしてみる

[Sharperlight](https://sharperlight.jp/)は、Eメールサーバーに対してもクエリをかけることができるので試してみます。
Sharperlight**クエリビルダ**でも試すことは出来ますが、折角なのでレポートにしてみましょう。
### レポートの作成 ###
[Sharperlight](https://sharperlight.jp/)アプリケーションメニューから**パブリッシャー**を起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b702f711-d2a0-3c71-7f5c-81c8a11b09ef.png)
パブリッシャーが起動したら`新規`ボタンでレポートの作成に入ります。**コード**、 **グループ**、 **タイトル**を記入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/cd165c0f-4109-b4df-7a48-42ba625d5133.png)
`クエリを編集`ボタンでクエリの定義を開始。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/1a19b376-0d42-b5bc-c33a-9d9e36008127.png)
フィルター領域では、先ず`製品`と`テーブル`を指定します。`製品`には**システム**、`テーブル`には**電子メール**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ee090adf-b17d-7441-f405-5dc51466729b.png)
その他のフィルターについては、
- **検索条件/検索条件2：** 索引ダイアログを表示すると既定値を一覧から選択できます。ここでは初期値である**SentAfter:DATE -3d**（3日前から現在までに届いたメール）を、このように **SentAfter:DATE -1d** 編集します。1日前から現在までの間に届いたメールを検索します。
- **行制限の一括設定:** 100に増やします。
- **ホスト:** 今回はHotmailのアカウントを使用するので、索引から Microsoft Outlook IMAPを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/bcc0db76-c142-6213-a137-a805d1deab65.png)
- **アカウントの電子メールアドレス:** Hormailアカウントのメールアドレスを入力。
- **パスワード:** 索引表示ボタンを押すとパスワード専用入力ダイログが表示され、入力結果は暗号化されます。
- **ポート番号:** Hotmail指定のポート番号を設定。
- **セキュリティモード:** 索引からHotmail指定のセキュリティモードを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/eb20be35-939c-aea5-954d-1ac971c75b0f.png)
これでフィルターの設定は終了。
次に出力設定を行います。簡単に**日付**、**件名**、**発信元**を表示してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e8dafcb8-419f-de32-3a85-e8c2a50287c5.png)
ではクエリを保存して、更にレポート本体も`OK`ボタンで保存します。
### 検証 ###
Gmailやその他のメールサーバーからいくつかの試験メールを、クエリをかけているメールアカウントに対して送信します。
パブリッシャーグリッドで先ほど作成したレポートを選択し、右クリックメニューから`レポートの表示`を選択します。Sharperlightサービスが起動していれば、このようなレポートがプロンプトと共に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e6607bb6-8d69-c2ca-ef4e-ef6e5a87082a.png)
`送信`ボタンをクリックすると、このような結果が戻ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/41518f4e-cb5c-c665-edc8-c95efff4829f.png)
### おまけ ###
Excelワークシートにもクエリをコピーし、実行するだけでテーブルを作成できます。
先ほど作成したレポートのクエリを再度開いて、右クリックメニューから`クリップボードにコピー`を選択し、クエリ定義をクリップボードにコピーします。
Excelを起動して（Sharperlight Excelアドインが設定されていることが大事）、シート上のあるセル、ここではC5にします。
Sharperlightリボンからテーブルアイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c40bb0df-0882-7970-63a4-14648cae887a.png)
クエリビルダが起動するので、右クリックメニューから`クエリのインポート` -> `クリップボードから`を選択します。先ほどコピーしたクエリが読み込まれるので、そのまま`OK`ボタンを押します。クエリが実行されてワークシート上にデータテーブルがこのように作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/eca69d97-7e4c-6e17-e252-4f7e67430345.png)

では、失礼します。
Javaで何か作ってみる

## はじめに
仕事の合間の持て余した時間を使って、
何か作ろうと思い、Qiitaに記録を残そうと思う。

## コンセプト
技術日記って事で、進捗の有無に関わらず、
毎日投稿していきたいと思う。
自分が好きで始める事なので、
毎日投稿はMustではなく、Wantで、
のびのびやれたらと思う。

## 対象者
自分。日記なので、人に見られる事を想定して
書くつもりはない。だから拙い文章になると思う。
もちろん、
参考になる事があれば参照してもらってもいいし、
アドバイスもしてもらえるのは嬉しい。

## 簡単な経歴
エンジニアのスタートはC#で、3年ほどやって、
その後は、PHPやJavaScriptをやっている。
詳しい経歴は、Twitterとか見てもらえるといいかな。

## Javaを選んだ理由
単純に、これまで業務でやった事がなく、
やってみたいと思ったのがきっかけ。
C#を長くやっていて、似ている部分は多いし、
何か作ってみて、
今後のキャリアに活かせたらいいかなと思っている。

## 今後の予定
2022年12月までは、Javaの基礎と、
Springのお作法等を学んで、
2023年1月から、簡単なアプリ作成から
進めていこうと思っている。
AWS等のクラウド系にも
手を出したいところだけど、
あれもこれもだと中途半端になるので、
先ずはローカル環境で動くものが作れればと思う。
255文字を超えるURLの記載

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)


+ [255文字を超えるURLの記載について](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000C6yOz)
+ [I am looking for a workaround for a URL field being longer the 255 characters.](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000KeTAN)


アイデアに挙がっていますね。

https://trailblazer.salesforce.com/ideaView?id=08730000000JRON


回避策がないかと思ってコメントを読んで見ると

 

Rich Text: rich text field will not show as URL in reports so no navigation over by Rich Text in reports

リッチテキストではレポートで問題があるみたいです。
 

Trigger : if i have a URL more than 1100 characters, i need to create total 6 fields. 1 long text field, 4 other text fields to divide the long text and 1 formule fields to combind 4 fields to display as URL. More over i have to write a trigger to achive this which needs a customization

 

何でトリガーなのかが分かりませんが、複数のフィールドに分割して使うようなことが書かれています。

 

Workaround is to use a Rich Text field (131,000 character max).  This will allow Links to be placed in this field.  Easy and Dont have to wait for Salesforce to update the URL Field to be greater than 255.  

このコメントではリッチテキストが回避策と言っています。レポートが問題にならないのなら、これが回避策となるかもしれません。

 

さらに古いコメントを読んでいくと

どうもトリガーの回避策はロングテキストで入力させて、実際は分割させて複数の255のテキストに保存しているようです。レポートでは数式のハイパーリンクに分割したフィールドを連結させているように思います。

 

現状ではこの２つの方法のどちらかのような気がします。
ActiveStorageを用いた画像投稿機能の実装

# はじめに
Rubyにおいて画像投稿機能を実装するために必要な流れを忘れないためにまとめます。

## 1. 画像投稿機能を実装するためには
rubyにおいて画像投稿を実装するために必要な流れは以下の通り。

ActiveStorageを用いて
- アップロードした画像専用のテーブルを作成する
- 投稿した画像を表示する
- 投稿した画像の大きさを調整する

## 2. ImageMagickをインストールする
    % brew install imagemagick
- <strong>ImageMagick</strong>とは
コマンドラインから画像に処理を加えることができるツール。
処理としては、画像の作成やサイズ変更、保存形式の変更などがある。
ImageMagickはGemではなく、ソフトウェア。
そのため、Homebrewからインストールする。
GemではないImageMagickをRubyやRailsで扱うには、<strong>MiniMagick</strong>というGemが必要となる。

## 3. MiniMagickとImageProcessingをインストール
    # Gemfileの一番下に記述する
    
    gem 'mini_magick'
    gem 'image_processing', '~> 1.2' 

    # ターミナル上
    % bundle install



- <strong>MiniMagick</strong>とは
ImageMagickの機能をRubyで扱えるようにしてくれるGem。
RailsでImageMagickを扱うために必要となる。
MiniMagickによって、ImageMagickの機能がRailsで使用できるようになりますが、
画像サイズの変更には、もう1つ<strong>ImageProcessing</strong>というGemを追加する必要がある。


　- <strong>ImageProcessing</strong>とは
　MiniMagickでは提供できない、画像サイズを調整する機能を提供するGem。

## 4. ActiveStorageをインストール
    # ターミナルにて    
    % rails active_storage:install
    Active Storageに関連したマイグレーションが作成される。続けてマイグレートする必要がある。
    % rails db:migrate

    Sequel Proを確認し、データベース上に
    「active_storage_attachments」
    「active_storage_blobs」
    の2テーブルができていれば、問題なし。

## 5.　画像の保存機能を実装する
行うことは以下の2つ。

- Active Storageのテーブルと保存するテーブルのアソシエーションを定義
- 保存するテーブルと同名_controller.rbにて、imageカラムの保存を許可

### 5-1. アソシエーションの定義
    # 保存するテーブル内に追記
    has_one_attached :image
    
    <has_one_attachedメソッドとは>
    各レコードとファイルを1対1の関係で紐づけるメソッドです。
    has_one_attachedメソッドを記述したモデルの各レコードは、それぞれ1つのファイルを添付できる。

## 6. ビューファイルの編集
    # new.html.erb内
    form_withのfile_fieldオプションを選択する
    imageがあたかも保存先テーブルのカラムであるかのように扱うことで、フォームのfile_fieldで選択された画像を保存先テーブルのオブジェクトと紐付けます。これも、Active Storageの特徴の一つ。

## 7. ストロングパラメーターへ追記
今回、パラメーターのキーは:imageと設定しているので、それを追記すれば問題ない。
ActiveStorage(画像添付機能)を用いた際の単体テストコードの注意点

# はじめに
Activestorageを用いているアプリケーションで単体テストコードを書く際に、注意点が何点かあったため、忘れないために記録に残します。

# 注意点
## 1.FactoryBotでのimageカラムの取り扱いについて
fakerを使って、ランダムに画像データを添付させることは不可能なので、
あらかじめテスト用の画像データを用意しておく必要がある。

＜対応策の一例＞
1.「public」ディレクトリの中に「images」というディレクトリを作成し、画像「test.jpg」(任意)を、imagesディレクトリの中に配置する。

    イメージ図（階層）
    app
    bin
    ・
    ・
    public
    　　｜
    　　images
     　　　　｜
    　　　　test.jpg

2.<strong>after</strong>というメソッドを用いて、インスタンス生成後に画像が保存されるようにする。
        
    FactoryBot.define do
      factory :message do
        content {Faker::Lorem.sentence}
        association :user
        association :room
    
        after(:build) do |message|
          message.image.attach(io: File.open('public/images/test.jpg'), filename: 'test.jpg')
        end
      end
    end

    ※:messageがbuildされた後で、io: File.openで設定したパスのファイル（public/images/test.jpg）を、test.jpgというファイル名で保存をしている。という意味。

## 2.単体テストコードを書く際の空の表現方法
    nameなどの文字列
    @hoge.name = ""

    画像データなど
    @hoge.image = nil
    (""では空の文字列を保存という意味になると思われる)

## 3.補足情報
上記1で記載したfactorybotで、messageはuser,roomと必ず紐づいている必要があるため、

    association :user
    association :room

アソシエーションが追記されている。
これにより、messageが生成されたとき、それに紐づくuser,roomが自動生成される。
VScode git graph で任意の２commit 間のdiff を見る方法


git history や git Lens でのやり方はググればすぐ出てくるが、git graph でのやり方が判りにくかったので備忘録として記載しておきます。
commit の新しい方を newer, 古い方を older とします。

1.  git graph の通常画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350477/e5164ee8-4a13-43fb-21af-379373f40397.png)
1. newer をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350477/3801b5d1-4f20-2075-f58d-8095c944a5f1.png)
このcommit の詳細が表示される。ここで、緑と赤の数字は直前のcommit からの変更を示す（増加行数と減少行数）。
1. <b>コントロールキーを押しながら</b>older をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350477/c11df666-b58f-8191-27cd-cba38b719411.png)
２つのcommit　が選択された状態になる（VScode の default style では背景の黒が白っぽくなる）。緑と赤の数字は、このolder からの変更を示す。
1. newer のファイル名をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350477/e65fd25f-0147-d8d3-a2bb-dc661fc3f239.png)
1. older と newer の差分が表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350477/c78e913d-d05b-ecc6-1cd2-cff18d49b28b.png)

以上です。慣れれば簡単ですね！
PHP 条件演算子(三項演算子)の省略構文「??」を更に短縮して記載する 〜null合体代入演算子〜

# 概要

- 条件演算子の省略構文を更に短縮して記載する方法をまとめる

# 情報

- 本書き方`??=`の正式名称は「null合体代入演算子」というらしい。
- 本書き方はPHP7.4かで追加されたらしい。なのでPHP7.4以降で使える

# 方法

- 下記のような処理があったとする。（`$str_1`がnull以外の場合、`$str_1`に`$str_1`の値をそのまま格納する。`$str_1`がnullだった場合、`$str_1`に`$str_2`の値を格納する。）

    ```php
    $str_1 = $str_1 ?? $str_2;
    ```

- 上記と全く同じ処理を下記のように記載する事ができる。

    ```php
    $str_1 ??= $str_2;
    ```

# 付録

- 前に三項演算子について記載した記事
    - [PHP 三項演算子](https://qiita.com/miriwo/items/4b4fc022a91a9b48b15c)
    - [PHP 条件演算子(三項演算子)の省略構文「??」](https://qiita.com/miriwo/items/31c7698b7ccedbf01bb8)

# 参考文献

https://www.php.net/manual/ja/migration74.new-features.php
ビューにカードフォームを追加する方法

# カードフォームとは
カードフォームは、モデル駆動型アプリのビュー（一覧画面）的な形で使用されます。
モバイルデバイスに適したコンパクト形式で情報を表示できます。
[カードフォームの作成方法](https://qiita.com/skuramoto/items/f0dd218885fb9d6f3bf8)
# カードフォーム追加手順
##### 1. ビュー編集画面にて「クラシックに切り替える」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/f7c6e968-457a-18e9-255a-af9eaa7421a3.png)


##### 2. 別タブで開かれた画面において、右にある「Custom Controls」(カスタムコントロール)を選択
（もともとの画面をモダン、ここで表示される画面をクラシックという）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/84f86610-5f4c-2f20-1e07-f84e78af82e4.png)

##### 3. 「Add Control」(コントロールの追加)を選択<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/101dd09a-ccc8-2bb7-be08-1e08834c7e42.png" width=60%>


##### 4.  「Read-only Grid」(読み取り専用グリッド)を選択し、[追加]ボタンをクリック<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/04557445-305e-a80b-25fb-c9a2999b0c28.png" width=60%>
::: note warn
もともと設定されている「読みとり専用グリッド(規定)」はカードフォームを表示することができません。
:::

#####  5．追加された「Read-only Grid」（読み取り専用グリッド）のWeb, 電話, タブレットを選択し、下のプロパティで「Card form」（カードフォーム）の鉛筆✏マークをクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/c6956f14-5d60-b28e-e182-fb1fff238e8d.png" width=60%>



##### 6．ビューに表示するカードフォームを選択し、[OK]ボタンをクリック
Entity（エンティティ）：表示させたいカードフォームのテーブルを選択（ビューと同じテーブルであることが多い）
Card Form（カードフォーム）：上のエンティティで設定したテーブルに存在するカードビューの種類が選択できる
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/0809e19f-c937-1627-550d-878b8c4fb0b4.png" width=60%>

##### 7．[OK]ボタンを押してカスタムコントロールのプロパティページを閉じる

##### 8．ツールバーにて[Save As]（名前をつけて保存）をクリックして名前をつけて保存![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/bbfacbaf-b6c0-3626-9928-429956c59ac9.png)

##### 9．もともとのビューの編集画面（モダン）にて[公開]をクリック![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/e9ced53e-10d6-155f-2b83-b8556cfca47d.png)

##### 10. ビュー編集画面にて、今作ったビューの追加をする![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/c9361762-44b8-8b31-b1c4-df34d060e120.png)

# 確認方法
##### 1. モデル駆動型アプリを開く
画面下にローマ字ごとに絞り込めるバーが
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/007d1985-c58d-b54d-575c-2e7f743cd1bd.png)


##### 2.ビューの名前がカードフォームを追加したビューの名前であることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/aa46ac6b-d664-782a-02ac-db35b0dc3205.png)


##### 3. ブラウザを縦長に折りたたむと、自動でカードフォームが表示される
モバイルの画面では自動でカードフォームが表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/07be4700-854c-c5fc-1f52-409ba2073fc0.png" width=40%>

もしくは、、、
##### 3'. 上のツールバーから「Open Dashboard」を選択![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/da6ca219-0bae-9edd-8d22-2634f848674a.png)

##### 4'. 作成したカードフォームが表示される![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/5adb42ca-fa93-85db-e4f2-2e9ed87dabe5.png)
【初心者向け】トランザクション処理って何？

# トランザクションとは？

ひとまとめ、ワンセットにした処理のこと。

## トランザクションは例えばどういうこと？

例えば銀行から田中さんが3万円のお金を引き出すには
ざっくりと次のような順番になります

1. 田中さんの銀行口座にお金があることを確認する
1. 田中さんの銀行口座から3万円を減らす
1. 田中さんに3万円を渡す

もしも途中でエラーが発生し、田中さんが3万円を引き出したにも関わらず
田中さんの銀行口座から3万円が減っていない場合、
銀行側が3万円を損することになります。

よって、途中でエラーが発生した場合は、全体の処理をキャンセルしてしまうことが
トランザクションと呼ばれる処理になります。
カードフォームの作成方法

下のようにビューに表示させるカードフォームを作っていきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/7c56f799-08c9-6e3e-4a86-b5743fcc0de2.png)


# カードフォームの作成手順
テーブルの詳細画面から[フォーム]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/6efa2267-0f7f-5d25-a0bd-4be06390be3d.png)


フォームの一覧の中から「フォームの種類」がカードのフォームを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/72c1c0ee-ef7d-ee39-c595-3606864dc38b.png)


画面右のField Explorerから表示させたい列を選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/bce840d9-9e2c-ca68-6d8f-4242090a1b81.png)
ドラッグアンドドロップで真ん中の編集画面の、挿入したい位置にもっていき、赤線が表示されたらそこに置く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/c5ec21a4-255e-a287-9200-cbb317dd2cf7.png)

[Save]（保存）をして[Publish]（公開）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/403ace2b-a0e7-54d9-4fb4-0017fb9da191.png)
ここまででカードビューの編集は終わり

# 確認方法
まず表示させたいビューに追加する
[ビューにカードフォームを追加する方法](https://qiita.com/skuramoto/items/5a86135d5fdd1c48c61e)

モデル駆動型アプリを開き、ブラウザを縦長に折りたたむと、自動でカードフォームが表示される
（モバイルの画面では自動でカードフォームが表示されます。）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/07be4700-854c-c5fc-1f52-409ba2073fc0.png" width=40%>

ちなみに編集画面ではこんな感じで作りました。Headerは表示が小さいですね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/fa572c57-12a6-9811-9fb1-c6d5d10dc72b.png)
[Vue,Typescript] Uncaught ReferenceError: exports is not definedを解決する

# やりたいこと

Vue(Javascript)からTypeScriptに変更したい。

# エラー内容

```bash
Uncaught ReferenceError: exports is not defined
at ./resources/js/store/auth.ts (app.js:2431:1)
at **webpack_require** (app.js:115736:42)
at ./resources/js/store/index.ts (app.js:2464:30)
at **webpack_require** (app.js:115736:42)
at ./resources/js/router.ts (app.js:2252:31)
at **webpack_require** (app.js:115736:42)
at ./resources/js/app.ts (app.js:2141:32)
at **webpack_require** (app.js:115736:42)
at app.js:115901:64
at **webpack_require**.O (app.js:115773:23)
```

# 原因

tsconfig.ymlで"module": "commonjs”になっていたため。

CommonJSではrequire/exportsを使い、ES modulesではimport/exportを使うようです。

そのため、今回はES modulesのexportを使っていたため、exportsが見つからず、モジュールを呼び出すことができませんでしたというエラーが出てしまっていたわけです。

# 解決策

tsconfig.ymlの"module": "commonjs”を削除する

# 調査
https://qiita.com/salted_plums/items/e4d9562f942c0a8a6c0f

https://utouto97.hatenablog.com/entry/2021/07/18/215210
Python+TKinterでWindowsアプリケーション作ってみたかった

# はじめに
タイトルの通りですが、C#とかで作ったことはあるけどPythonでも作れるというのは知らなかったので試しに作ってみただけの記事になります。
詳しい記事はたくさんありますが、自分用のメモ書き程度に記事にしたいなと思います。
やることとしては
・Pythonや、TKinterのインストール
・コード書く
・えんじょい
インストール系は省きます。

# 書いてみる
とりあえずウィンドウを出してみます。以下のコードを記載して実行
```python
import tkinter as tk
from tkinter.constants import END
import webbrowser

# ウィンドウの初期化
root = tk.Tk()
root.geometry("300x200")
root.title("てすと")

# ウィンドウ表示
root.mainloop()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156172/7bb2ace3-36be-7a57-5d40-f9fcc52de796.png)
いつも思いますが起動してタイトルに自分の決めた文字が表示されるとちょっと楽しくなりますよね。私だけでしょうか。
root.geometryで初期ウィンドウサイズをピクセル単位で指定することができるようです。
root.titleで文字通りタイトルの設定。
root.mainloopで表示って形ですかね。
シンプルに考えておいた方がプログラミングは楽しいです。
楽観的なので行き詰ってから考えましょう。

次にボタンを設置してみます。
初期化とウィンドウ表示の間に書きます。
```python
# メインフレーム作って置く
frame = tk.Frame(root)
frame.pack(fill = tk.BOTH,padx=50,pady=30)

# ボタンのテキスト
text = tk.StringVar(frame)
text.set("絶対に押すな")

# ボタン定義
button = tk.Button(frame,textvariable=text)
button.pack()
```
実行すると、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156172/bdedf821-cc8d-6071-7fd3-c6ad38842249.png)
ボタンが表示されました。
フレーム作ってその上にボタンを置いて、ボタンに書かれているテキストを定義する必要があるみたいです。
詳しい事は分かってません（うごきゃいい）
「絶対に押すな」と書かれてますが、押しても何も起きません。
処理を追加してみます。
```python
import webbrowser

def openweb():
    webbrowser.open("https://allabout.co.jp/matome/cl000000015018/")

～～～ 中略
button = tk.Button(frame,textvariable=text,command=openweb)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156172/77c36bce-2c4c-196d-6165-c42965255b33.png)
もちろんですが見た目は変わらないですね。
ボタンを押してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156172/716f6839-5140-d7a9-09c6-513394581844.png)
猫ちゃんの可愛い画像まとめサイトに行きました。
これで仕事出来なくなりますね。
押した罰です。

# 終わりに
Pythonは最近よく使われていると思うので楽しみながらかつ、勉強がてらいいかなと思って作ってみました。
今回はボタンを設置するにしても全部コードで書きましたが、GUIでデザインできる「PAGE」というツールがあるようなので、
それを使って少し凝ったアプリを作ってみようと思います。

# 参考にした記事・サイト様・ギルティ
https://qiita.com/nnahito/items/ad1428a30738b3d93762

https://office54.net/python/tkinter/python-tkinter-button

https://allabout.co.jp/matome/cl000000015018/
VSCodeで'HelloWorld' is declared but its value is never read.Vetur(6133)が出た

全体的な雑さはご勘弁。未来の俺がこのエラーでググった時のための備忘録。

## 問題

`npm init vue@3`で`lang=TS`でアプリ作成。
`npm run build`は通る。
なのにVSCode上で以下のエラーが出て、他業種への転職を考え始める。
`'HelloWorld' is declared but its value is never read.Vetur(6133)`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284915/6220c462-528d-4250-cac2-bc154406ed09.png)

## やったこと

Veturを無効化した。

以下蛇足。

## 経緯とかの散文蛇足

これまでは[vue-cli](https://cli.vuejs.org/)で`vue create appname`でアプリを作成していた。
ただ最近のイケてる人たちは`npm init vue@3`でVueのアプリを作るらしい。[^1]
webpackベースのvue-cliから[Vite](https://vitejs.dev/)にするといろいろ嬉しいんだって。知らんけど。
で、`npm init vue@3`ってやると[create-vue](https://github.com/vuejs/create-vue)ってのを経由してViteを使うことになるらしい。

この`npm init vue@3`でTypeScript指定で作成したアプリケーションができたのでとりあえずコンソールにだされたメッセージの促すままに`npm run lint`とか`npm run dev`とかやって動いたのでよしよしと思っていた。
以下はできたフォルダ構成の抜粋。App.vueがcomponents配下のファイルをimportしたりしてます。
```
├── src
│   ├── App.vue
│   ├── components
│   │   ├── HelloWorld.vue
│   │   ├── TheWelcome.vue
│   │   ├── WelcomeItem.vue
...
```
でじゃあ開発したろとVSCodeで開いてApp.vueを見ると冒頭の問題に引っかかった。

問題に引っかかって最初はエラーでググって「コンポーネント側に空の`export default {}`とか入れるといいよ」とか言われたからほいほいと思ってHelloWorld.vueの方に入れてみた。
そしたら確かにApp.vueの当該エラーは消えたんだけど、HelloWorld.vueの方で「既定のエクスポートは、ファイルまたはモジュールの宣言のトップレベルにある必要があります。ts(1258)」って出てしまった。
しかも`npm run build`するとこれこそエラーになる。

いや困ったねと思ってコードを見直してみたが、`<script setup lang="ts">`と書いてあって、`setup`ってなんだろ～と思って[公式のsetupの説明](https://ja.vuejs.org/api/sfc-script-setup.html#script-setup)を見てみたら「これはシンタックスシュガーなのじゃ」と書いてある。
ってことは何かしらラッピングしてるんだろうな～だからexportがトップレベルじゃないんだって言われてんだな～と思ったのでいったん`setup`外したらやっぱりts(1258)の方のエラーは消えた。

まあこれで`setup`とかよくわからんし外すか～とかも考えたけど、シンタックスシュガーとか好きなのでやっぱ使いたいな～と思ってどうしたらええんやろと考えた。だいたい公式が出してるコードをワークアラウンド魔改造してもいいことなんてこれまで一度もなかったわけで。

で、公式そのままのコードだしビルドは通ってるので、VSCodeの問題だよねと思った。というか拡張機能の問題でしょと。←おそい
そういえばこのアプリをVSCodeで見たときに別の拡張機能[Vue Language Features (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.volar)と[TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin)とか促されるままに入れたな～とか思い返して、あれ、じゃあVeturいらないんじゃない？と思ったわけです。

で、やっとですけど元から入っていた拡張機能の[Vetur](https://marketplace.visualstudio.com/items?itemName=octref.vetur)に目を向けて、更新でもあるかと思ったら2か月前で止まってるし、じゃあ無効化したらええんかなと思って無効化したら良さそうだったのでそれでOKとした。

ちなみに[Veturのページ](https://marketplace.visualstudio.com/items?itemName=octref.vetur)を今見たら以下の分がこっそり書いてあった。
New official vue editor support: Volar
そっか君はもう役割を終えたんだね今までありがとうなにも君に対価払ってないけど、とか思ってとりあえずもう無効化ってかアンインストールしてもよさそうだなとさっき思ったけど手元にあるいまだにvue2のアプリを見て「とりあえず残しとこ」と思ったのが今です。

[^1]: [公式](https://ja.vuejs.org/guide/scaling-up/tooling.html#%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E9%9B%9B%E5%BD%A2%E3%81%AE%E4%BD%9C%E6%88%90-project-scaffolding)も「特定の webpack のみの機能に依存していない限り、新しいプロジェクトは Vite で始めることを推奨します。」って言ってるし。いろいろ早くなるらしい。ViteはEvanさんが作ってるみたいだし、天才について行けば間違いない。
Windows10のコマンドプロンプトを使って4秒でファイル or フォルダー存在チェック

# やり方

パス内にスペースがある場合を考慮してダブルクオテーション囲み。
（スペースが無ければダブルクオテーション無しでもOK）

```shell
dir "c:\だぶすたくそおやじ.xlsx"
```

↓存在しない場合の例。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/63875721-9640-17e8-88ae-150195e9c7ea.png)

↓存在する場合の例。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/25769dbe-6869-131a-a1b5-c47aadcb848c.png)

# 蛇足

パスの文字列が『長い』『深い階層』『数字の0と英語のOが入ってる』なんて時は、人の目で確認せずに、コマンド叩いた方が早いし楽。

# バージョン

Windows 10 Pro 21H2 OSビルド 19044.2130
Xfree(php)でデータベース連携してデプロイする方法。

先日作ったtodoアプリをXfreeを使ってデプロイしたので、
デプロイ方法とその時の注意点についてまとめたいと思う。

▼１

 1.Xfreeにログインする。
 2.管理パネルページよりPHP・MySQLの管理パネルでログインをする。
 3.サーバー管理パネルのPHP・MySQLサーバーよりデータベースのMySQL設定をクリック
 4.「MySQL追加」　のデータベース名、文字コードを作成
 5.「MYSQLユーザ設定」の　ユーザ名、パスワード
 6.「phpmyadmin」をクリック
   ※phpmyadminは動き遅いため、注意が必要です。
 7.普段使いしているMySQLからデータベースをExportする
 8.ExportしたSQLをXfreeのSQLに流し込む。
　　　　　　※Xfreeのphpmyadminはバージョンが古いため、下記の２点の変更が必要。
　　　　　　　　・SQL内の「utf8mb4」　→ 「utf8」に変更する。
　　　　　　　　　/*!40101 SET NAMES utf8 */;へ変更する
　　　　　　※「current_timestamp」はテーブル内で一つだけのため、
　　　　　　　エラーが発生した場合は対処法するする必要がある。
　　　　　　　下記の２点は別で次回作成する。
 9.VSコードをいじる。
　　サーバー管理パネルのPHP・MySQLサーバーのMySQL一覧をクリック
　　// デプロイ用
　　// define('MYSQL_HOST',    'MySQLホスト名');
　　// define('MYSQL_DBNAME',  'データベース名');
　　// define('MYSQL_CHARSET', 'UTF8');
　　// define('MYSQL_USER',    'ユーザー名');
　　// define('MYSQL_PASSWORD','自分のパスワード');
 10.FileZilla を開く。
11.必要なPHPファイルをドラック&ドロップし、FileZillaファイルじらを読み込む
12.http://自分のドメイン名/自分のPHPファイル名/login.php　をURLに貼り付ける。


※3〜6までこちらの資料を引用
https://www.xfree.ne.jp/manual/man_server_db_setting.php


以上です。
cscの作法 その283

# 概要
cscの作法、調べてみた。
aforge.dll使ってみた。
動画を作ってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e364d9a1-e4b8-ca8b-bc56-ce6a4698da71.png)

# サンプルコード

```
using System;
using System.Drawing;
using AForge.Video.VFW;

class Avi {
	[STAThread]
	static void Main(string[] args) {
		var writer = new AVIWriter("DIB ");
		writer.Open("test1.avi", 320, 240);
		Bitmap image = new Bitmap(320, 240);
		for (int i = 0; i < 240; i++)
		{
    		image.SetPixel(i, i, Color.Red);
    		writer.AddFrame(image);
		}
		writer.Close();
	}
}

```

# コンパイル手順

```
>set PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;%PATH%


>csc /r:AForge.Video.VFW.dll avi0.cs

>avi0

```

以上。
macでUTF-8からShift_JISに変換出来ないとき

# csvをexcelで開くと文字化けしている
原因、excelはデフォルトでShift_JISに変換しているため。
excelで開くとエンコーディングされるので、
先にファイル形式をshift_jisにしてからデータを貼り付けると問題を回避できる。
テキストエディットで変換するような記事が多いが、以下のやり方が一番簡単かと思う

# 対応方法
1. vscodeでcsvファイルを開く。
2. データを切り取る
2. ファイルの文字コードをshift.jisに変更する
2. 切り取ったデータを貼り付ける
2. 保存する
2. 以上

# 参考
https://teiban-navi.com/mac-shiftjis
Could not check compatibility between ~~~ mixed is not available

ローカルで動いているPHPコードをリモートのLaravelサーバにgit pull したら以下のエラーが出た。


```
{message: 'Could not check compatibility between App\\Reposito…class App\\Repositories\\ORM\\mixed is not available', exception: 'Symfony\\Component\\ErrorHandler\\Error\\FatalError', file: '/home/gratest/www/conference_adjuster/backend/app/Repositories/ORM/UserRepository.php', line: 16, trace: Array(0)}

```

原因はローカルのphpが8.0でデプロイ先がphp7.4だったからでした。
関数の戻り値の型にmixidを指定していたところphp7.4だとクラス未定義になっていました。

戻り値の型指定を削除したら動きました。

その後エディターのターゲットPHPバージョンをダウングレードして警告を止めました。
VagrantでVirtualBoxの仮想環境構築で共有フォルダのエラーが発生し解決

<a href="https://ebios10.up.seesaa.net/image/800px-Centos-logo-light.svg.png" target="_blank"><img border="0" alt="800px-Centos-logo-light.svg.png" src="https://www.vagrantup.com/vagrant-public/img/logo-hashicorp.svg" width="640" height="216"></a>

# 概要
Windows環境下でVagrantを使用しVirtualBoxの仮想環境をpython用に構築。共有フォルダのエラーとなったので、その解決までの対処をまとめた

# 環境
Windows 10 Home バージョン1909
VirtualBox　バージョン 6.1.14 r140239 (Qt5.6.2)
vagrant　2.3.2_windows_amd64

VirtualBox：
ubuntu

# 発生したエラー

```
/vagrant => C:/PythonProject
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=1000,gid=1000,_netdev vagrant /vagrant

The error output from the command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
```
/sbin/mount.vboxsf: エラーでマウントに失敗しました
とのこと。冒頭の文章から
「Vagrant は VirtualBox 共有フォルダーをマウントできませんでした。 これは通常
ファイルシステム「vboxsf」が利用できないためです。 このファイルシステムは
VirtualBox Guest Additions およびカーネル モジュールを介して利用可能になります。
これらのゲストの追加が正しくインストールされていることを確認してください」
とのこと。

# 対処１　プラグインのインストール
pluginのインストール後のvagrant reloadで解決したという方も結構いた。
なお、当方は解決しなかった。
<blockquote># vagrant plugin install vagrant-vbguest</blockquote>
<blockquote># vagrant plugin list</blockquote>

# 対処２　virtualbox additionalのバグ？対応
syslogを確認する（VirtualBoxの環境によりlogが違うので注意）
<blockquote>$ sudo tail /var/log/syslog</blockquote>

```
sf_read_super_aux err=-22
```
エラーコードを調べてみると、virtualbox additionalのバグ？らしい。
mount.vboxsfへのリンクが通ってない模様。virtualbox.orgのチケットのリンク先に対応策としてシンボリックリンクを貼るコマンドが表記されている。
<a href="https://www.virtualbox.org/ticket/12879?cversion=0&cnum_hist=17" target="_blank">#12879 (Can't mount shared folders with guest additions 4.3.10 => Fixed in SVN) – Oracle VM VirtualBox</a>
<blockquote># vagrant ssh xxxx</blockquote>
sshで入った後にコマンドを実行。


<blockquote>$ sudo ln -s /opt/VBoxGuestAdditions-4.3.10/lib/VBoxGuestAdditions /usr/lib/VBoxGuestAdditions</blockquote>

# 解決
対処１，対処２を経てvagrant reloadで解決した。

```
==> main: Mounting shared folders...
    main: /vagrant => C:/PythonProject
```
iOS App Dev Tutorialsを読んで実際にやってみた。その２


##  前回の記事
　[iOS App Dev Tutorialsを読んでみた。その１](https://qiita.com/shomiya181210/items/5b6d261938f650509255)　前回の記事を読んだ後、この記事をご覧ください。
## 今回の範囲
　[Using stacks to arrange views ](https://developer.apple.com/tutorials/app-dev-training/using-stacks-to-arrange-views)
　第２回目は実際にXcodeを使って会議タイマーの画面を作成してみる。
## 内容の要約
### 1. プロジェクトを新規作成する
#### 　Xcodeを開き新しいテンプレートを作る。
　　　　<img width="500" alt="SUI_010-010-020@2x.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918800/b00eb8f9-89d0-0f62-0a38-120d08dc7142.png">

### 2. 画面の内容をプログラムする。
#### 　1. 新しくテンプレートを作成すると『Hello,world』を映し出すコードが書かれている。まずはその名前とプレビューの構造をMeetingView用に書き換える。
　　　　<img width="700" alt="スクリーンショット 2022-10-20 20.59.41.png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918800/34b37fdc-4f97-047e-c8be-1e8c0b82828f.png">
```Swift:MeetingView
struct MeetingView_Previews 
```
#### 　2.タイムバーを表示させ、その下に経過時間と残り時間というテキストと、砂時計を表示させる。
　　　<img width="500" alt="スクリーンショット 2022-10-20 11.55.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918800/8a163ce1-e5a9-aaf3-d9e5-c164db031716.png">
``` Swift:MeetingView
HStack {
    VStack(alignment: .leading) {
        Text("経過時間")
        Label("300", systemImage: "hourglass.bottomhalf.fill")
    }
    VStack(alignment: .trailing) {
        Text("残り時間")
        Label("600", systemImage: "hourglass.tophalf.fill")
    }
}

```


### 　３. ビューの調整
#### 　1.下の二つのコードを使ってテキストとテキストの間にスペースを空けてテキストのサイズを縮小する。
　　　　<img width="700" alt="スクリーンショット 2022-10-20 11.59.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918800/9efcd722-54bf-fd09-03f4-ec7a43f0644c.png">
``` Swift:MeetingView　
 Spacer()
```
```Swift:MeetingView　
.font(.caption)
```

#### 　2.円形のタイマーと次の発言者に進むボタンを作る。
　　　　<img width="2700" alt="スクリーンショット 2022-10-20 12.18.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2918800/4835f89a-e547-aa52-de46-3585bab6e5e1.png">
```Swift:MeetingView　
Circle()
    .strokeBorder(lineWidth: 24)
HStack {
    Text("Speaker 1 of 3")
    Spacer()
    Button(action: {}) {
        Image(systemName: "forward.fill")
    }
}       
```

### 　4. 終わり
　　第２回目のチュートリアルはここまでで終了です。次回は細かい設定などをやる予定です。
#### 次回　[iOS App Dev Tutorialsを読んで実際にやってみた。その３](https://qiita.com/shomiya181210/items/f9f122fab2db17f2011f)
🔰超初心者のこの先の超初心者の皆様に向けて#1

＊はじめに
筆者は最近、プログラミングを学び始めた初心者です。Qiitaに記事を投稿する目的は
・勉強したことをアウトプットするため
・筆者のような超がつく初心者と共に学びたい
・これ先のプログラミングを学ぼうと考えている方の入口になれば
と考えて記事を投稿するつもりです。

＊OSとは？
OS(Operating System)とはシステム全体を管理し、様々なアプリケーションソフトを動かしたりするための基本的なソフトウェアのことです。

筆者は人間でいうところの脳🧠をイメージしてます。


＊iOSとAndroidの違い
iOSはApple社が提供している、iPhoneやiPadなどApple製品に搭載されているOSです。
AndroidとはGoogle社が提供しているOSであり特徴は多種多様な機種に対応しています。
【Vivado】Block Designをコピーする

# GUI上では無理らしい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214706/88150a14-ed64-fc43-129b-b2170725e032.png)


# コピー方法

## 1. Block DesignのTclファイルを出力
[File] > [Export] > [Export Block Design]、もしくはGUI下部のTcl Consoleで

```tcl:Tcl Console
write_bd_tcl -force [出力したいパス]/design_1.tcl
```

を実行。

## 2. 出力したTclを編集

以下のような行があり、そこでBlock Designの名前を設定している。

```tcl : 出力したボードのTclファイル
# CHANGE DESIGN NAME HERE
variable design_name
set design_name [出力したBlock Designの名前]
```

この`[出力したBlock Designの名前]`の部分を任意の名前に書き換える。

## 3. 編集したTclファイルを読む

```tcl:Tcl Console
source [編集したBlock Designの名前]
```

コピー元のBlock Designがあるプロジェクトの場合はこれで問題なく読み込める。
同様の方法で他のプロジェクトへのBlock Designのコピーも出来るが、その場合は設定したIPの読み込み等の必要があるので注意すること。
エンジニアのためのローコードプラットフォーム「Retool」のご紹介

皆さんこんにちは、エヴァンと申します。Retoolでセールスエンジニアをしています。Retoolはローコードアプリケーション開発プラットフォームで、社内ツールを素早く構築するために使用されています。

Retoolは、ドラッグ＆ドロップ可能なコンポーネントライブラリと、最も一般的なデータソース（SQLデータベースやAPIなど）用のコネクタを組み合わせることで、エンジニアの作業効率を向上させることができます。エンジニアは、ビジネスロジックをカスタマイズするためにJavaScriptを書くことができ、従来のフルスタックアプリの数分の一の時間で本番環境にアプリを完成することができます。

世界中のエンジニアがRetoolを愛用していますが、日本では比較的知られていません。Retoolの価値を日本に紹介するために、この説明ビデオを作りました。気に入ってもらえると嬉しいです！ https://youtu.be/4U6Y8wjpgVs

また、Retoolのテクニカルデモ（英語）はこちらです： https://youtu.be/sv5niaHKo5g

最後に、Retoolについて日本語でもっと読むことができます: https://gxpretool-docs.gxp.jp/docs

もしRetoolやローコードについて質問があれば、ぜひ聞いてください: evan (at) retool.com
【MySQL Workbench】 ERROR 2013 (HY000): Lost connection to MySQL server at 'reading authorization packet', system error のエラー対処

## エラー内容
MySQL Workbenchでdumpしたデータをインポートするときにエラーが発生
```
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading authorization packet', system error: 54
```
## エラー原因
私の場合、SQLに以下が含まれていることが原因らしい
```
SET @@GLOBAL.GTID_PURGED=
```

## エラー解決方法
SET @@GLOBAL.GTID_PURGED= をコメントアウトするか削除する

## コマンドで一括全置換（コメントアウト）する
自分がいるディレクトリ配下の.sqlファイル全てが置換対象
文字列SET @@GLOBAL.GTID_PURGED= を全置換（コメントアウト）をする
```:一括置換 例
find ./ -name '*.sql' -exec sed -i '' 's/SET @@GLOBAL.GTID_PURGED=/-- SET @@GLOBAL.GTID_PURGED=/g' {} \; 
```
```:一括置換
find ./ -name '*.sql' -exec sed -i '' ’s/置換前の単語/置換後の単語/g’ {} \; 
```
FreeBSDのサンプリングレート変換

FreeBSDでストリーミングを再生する場合以下のようにサウンドデータが流れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/02cf2c4a-865d-cdc8-ad28-b0b3aea2c9a8.png)

mpg123でストリーミングデータを鳴らす場合、デフォルトではストリーミングのサンプリングレートでKernelに渡されます。

WBGOのmp3のストリーミングは48KなのでこのサンプリングレートでKernelに渡します。

```
# /usr/local/bin/mpg123 http://wbgo.streamguys.net/wbgo128
High Performance MPEG 1.0/2.0/2.5 Audio Player for Layers 1, 2 and 3
        version 1.30.2; written and copyright by Michael Hipp and others
        free software (LGPL) without any warranty but with best wishes

Directory: http://wbgo.streamguys.net/

Terminal control enabled, press 'h' for listing of keys and functions.

Playing MPEG stream 1 of 1: wbgo128 ...
ICY-NAME: WBGO-ord2
ICY-URL: 

MPEG 1.0 L III cbr128 48000 j-s
```

DACのサンプリングレートは下記のsysctlの値で確認できます。

dev.pcm.0.play.vchanrate: 48000

この場合はサンプリングレートの変換はどこでも行われません。

WWOZの場合を見てみましょう。WWOZは44.1Kのストリーミングなのでmpg123からカーネルには44.1Kで渡されます。

```
# /usr/local/bin/mpg123 http://wwoz-sc.streamguys1.com/wwoz-hi.mp3
High Performance MPEG 1.0/2.0/2.5 Audio Player for Layers 1, 2 and 3
        version 1.30.2; written and copyright by Michael Hipp and others
        free software (LGPL) without any warranty but with best wishes

Directory: http://wwoz-sc.streamguys1.com/

Terminal control enabled, press 'h' for listing of keys and functions.

Playing MPEG stream 1 of 1: wwoz-hi.mp3 ...
ICY-NAME: WWOZ HD-1
ICY-URL: http://www.wwoz.org

MPEG 1.0 L III cbr128 44100 stereo
```

DACのサンプリング周波数が上記のように48Kの場合、Kernel内でサンプリングレートの変換が行われます。

しかしsysctlのdev.pcm.0.bitperfectを1にするとKernel内でのサンプリングレート変換が行われなくなるためmpg123が変換を行うようです。

mpg123やKernel内でサンプリングレート変換をおこなうと明らかに音質が劣化します。

WWOZの場合dev.pcm.0.play.vchanrateを44100にするのが良さそうです。

CDをリッピングしたものも44100で再生したほうが良さそうです。

dev.pcm.0.play.vchanrateは48000までしか設定できないようです。

dev.pcm.0.bitperfectの設定変更の前にdev.pcm.0.play.vchanrateを変更するとおかしくなるので、逆がよいようです。
Hexabase Flutter SDKの使い方（データストアアイテムのステータス変更）

[Hexabase（ヘキサベース）](https://www.hexabase.com/)は企業向けのBaaS（Backend as a Service）を提供しています。認証やデータストア、ファイルストレージ、リアルタイム通知などの機能があり、企業向けのシステム開発に必要な機能をまるっと提供しています。

APIはREST APIとGraphQLを提供しています。そのAPIをラップしたSDKも開発を進めています。SDKは現在、TypeScriptとDart向けに開発しています。Dart向けのSDKは、もちろんFlutterでも利用できます。

この記事ではFlutter SDKについて、インストールとデータストアのステータス変更について解説します。

## パッケージとソースコード

パッケージはpub.devで公開しています。

[hexabase | Flutter Package](https://pub.dev/packages/hexabase)

ソースコードはGitHubにて公開しています。ライセンスはMIT Licenseです。

[hexabase/hexabase-dart: Hexabase SDK for Dart & Flutter](https://github.com/hexabase/hexabase-dart)

## インストール

インストールは `dart pub get` で行えます。

```
dart pub get hexabase
```

## インポート

SDKをインポートします。

```dart
import 'package:hexabase/hexabase.dart';
```

## 初期化

まずインスタンスを作成します。

```dart
var client = Hexabase();
```

別なファイルで再度インポートした場合には、以下でインスタンスを取得してください。

```dart
var client = Hexabase.instance;
```

## ステータスの考え方

業務システムに限りませんが、データでステータス管理することは良くあります。例えばタスク管理の場合、以下のようになるでしょう。

```plantuml
@startuml
start
repeat :登録済み;
backward :差し戻し;
repeat while (作業中) is (戻し) not (終わり)
:完了;
stop
@enduml
```

ステータスとしては、以下の3段階があると考えられます。

1. 登録済み
2. 作業中
3. 完了

それぞれのステータスを変更する際のアクション名は以下になります。

1. 登録済み → 作業中  
作業開始する
2. 作業中 → 登録済み  
差し戻す
3. 作業中 → 完了  
完了する

```plantuml
@startuml
start
repeat :登録済み;
-> 作業開始する;
backward :差し戻す;
repeat while (作業中) is (戻し) not (完了する)
:完了;
stop
@enduml
```

Hexabaseでは、この「作業開始する」「差し戻す」に該当するアクションを設定し、API経由で実行することでデータのステータスを変更できます。

## データストアの準備

まず登録しているデータストアを取得します。そのため、最初にデータストアを管理するプロジェクトを作成します。

```dart
var project = client.project(id: "PROJECT_ID");
var datastore = project.datastore(id: "DATASTORE_ID");
```

## データストアからデータ取得

データストアから既存のデータを取得します。

```dart
var items = await datastore.items();
```

### 検索条件を付与する

検索条件を利用する場合にはクエリーを取得してください。

```dart
var query = datastore.query();
```

例えば最初の10件を取得する場合には、次のように指定します。

```dart
query.page(1).per(10);
```

他にも様々な条件が指定できます。

## データの詳細を取得する

ステータス情報を取得するため、データの詳細を取得します。

```dart
var item = items[0];
await item.getDetail();
```

## 実行できるアクションを取得する

ステータス変更は、現在のステータスに合わせて実行できるアクションが指定されます（管理画面にて作成できます）。それを取得するのが `actions` メソッドです。

```dart
item.actions().map((action) {
	print(action.nameLabel);
});
```

例えば `実行中にする` や `完了にする` などのアクションが取得できます。

## アクションを指定する

ステータス変更のアクションを指定するのは `action` メソッドです。

```dart
var actions = item.actions();
item.action(actions[0]);
```

設定したら、後は保存するだけです。

```dart
await item.save();
```

これでアイテムのステータスが更新されます。

## まとめ

Hexabase Flutter SDKを使えば、データのステータス管理を手軽に、分かりやすく実現できます。

Dart SDKはFlutterでも利用できます。Flutterで使えると言うことは、iOS/Androidといったスマートフォンアプリやタブレットアプリはもちろん、Webやデスクトップアプリ開発でも利用できます。ぜひHexabaseをDart SDKとともに活用してください。

[hexabase | Flutter Package](https://pub.dev/packages/hexabase)
Amazon EKSをEC2で構築した場合のIPアドレスの上限数

# はじめに
Amazon EKSをEC2で構築した場合、利用できるIPアドレス上限数はインスタンスタイプ毎に異なります。
1つのIPアドレスで、1つのPodが作成できるので、`IPアドレスの上限数=Podの上限数`となります。

# IPアドレスの上限数を調べる

1.  インスタンスタイプとネットワークインターフェースごとのIPアドレスを調べる
[IP addresses per network interface per instance type](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI)を参考にしてください。

1.  利用できるIPアドレスの計算式

    ```
    Maximum network interfaces * (Private IPv4 addresses per interface - 1) + 2
    ```

1.  IPアドレスの上限数の一覧

[eni-max-pods](https://github.com/awslabs/amazon-eks-ami/blob/master/files/eni-max-pods.txt)を参考にしてください。
Azure Fundamentals(AZ-900)：Azure の基礎: Azure のアーキテクチャとサービスについて説明する「Azure ストレージアカウント」

Microsoft Learnを用いたMicrosoft Azure Fundamentals(AZ-900)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始める方の参考になれば幸いです。

## 今回の学習内容
**◆「Azure ストレージアカウント」**
◇対応するMicrosoft Learn ラーニングパス
[Azure の基礎: Azure のアーキテクチャとサービスについて説明する](https://learn.microsoft.com/ja-jp/training/paths/azure-fundamentals-describe-azure-architecture-services/)
◇対応するモジュール
[Azure ストレージ アカウントについて説明する](https://learn.microsoft.com/ja-jp/training/modules/describe-azure-storage-services/2-accounts)

※前回の投稿は下記から確認できます。
[Azure Fundamentals(AZ-900)：Azure の基礎: Azure のアーキテクチャとサービスについて説明する「Azure DNS」](https://qiita.com/fsd-jume/items/14c962b0f88227eb456f)

## Azure ストレージアカウント
**HTTP/HTTPS経由でアクセスできるAzure Storageデータ用の一意の名前空間を提供**
・アカウントの種類により、「ストレージサービス」と「冗長性オプション」が決まる
※それぞれの詳細はこの後の投稿にて順次説明
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/838aa0e8-b6c6-6693-f051-f713fa65a095.png)

### ストレージアカウントエンドポイント
**アカウント名とAzure Storageサービスエンドポイントの組み合わせによって形成**
⇒エンドポイントを用いてHTTP/HTTPS経由でデータにアクセスできる

**◇ストレージアカウントへの名前付けルール**
・長さは3～24文字以内
・数字と小文字のみ使用可能
・複数のストレージアカウントが同じ名前を持つことができない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/df05ad25-5066-8986-01ab-148e9519bdd7.png)

## 次の学習内容
**◆Azure ストレージの冗長性**

https://qiita.com/fsd-jume/items/9fe212829d6378d79955

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8
terraform planのsensitiveな値が含まれる部分のdiffを見たい

# 問題

最近のterraformではsensitiveとマークされた値を含む部分はterraform planでも表示されなくなりました。

```
  ~ resource "aws_cloudfront_distribution" "this" {
        id                             = "ABCDEFGHIJKL"
        tags                           = {}
        # (20 unchanged attributes hidden)

      ~ origin {
          # At least one attribute in this block is (or was) sensitive,
          # so its contents will not be displayed.
        }

        # (3 unchanged blocks hidden)
    }
```

これにより困るのがCloudFrontのような中にいろいろ書けるリソースで、具体的に中で何が変更されたか推測することが難しくなっています。

この隠されているところで具体的に何が変更されたのか、確認する必要があります。

# 解答

terraform plan結果のファイルへの出力とそのjson化の機能を使います。
ただ、そのままですと長大なjsonを目視で読む必要があり大変です。
なので、jqとdiffを使って差分を効果的に可視化します。

## 具体コマンド

```shell
terraform plan -out=tfplan
terraform show -json tfplan > tfplan.json
cat tfplan.json | jq ".resource_changes[].change.before" > tfplan.before.json
cat tfplan.json | jq ".resource_changes[].change.after" > tfplan.after.json
diff tfplan.before.json tfplan.after.json
```

# 参考

[How to show sensitive values \- Terraform \- HashiCorp Discuss](https://discuss.hashicorp.com/t/how-to-show-sensitive-values/24076/9)

# Sponsor

この記事はSpeee社内での知見を元にSpeeeの業務時間を使用して書かれました。
GASでスイッチサイエンスの在庫数を取得して表にまとめてみた

スイッチサイエンスのWebページが更新されて、商品一覧から在庫数を確認しにくくなりました。委託販売をお願いしている自分としては、自分の商品の在庫数を確認したいのですが、これがやりにくくなってしまいました。

そこでGAS (Google Apps Script)の勉強がてらに、Googleスプレッドシートに書いてある商品番号(SKU)の在庫数を取得して在庫数のシートを更新するのをやってみました。方針は単純で、指定したSKUの商品ページをHTMLで取得（そのURLはSKUから機械的に作成できる）し、その中に書いてある在庫数を切り出して記録する、というものです。

まずGoogleスプレッドシートで、調べたいSKUがB列に入っているシートをつくります。わかりやすいようにA列には商品名を書いておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457605/e3bdadb5-a346-af6e-6c9d-226b5888ed95.png)

この表に対して、B列に入っているそれぞれのSKUの商品の在庫数を取得してC列に記入するのをGASでやってみます。

まずこのシートの「拡張機能」→「Apps Script」を選ぶと、Google Apps Scriptの編集画面が開きます。左上にスクリプト名をつけられますので、「SS在庫チェック」みたいな感じにしておくとよいでしょう（SS=スイッチサイエンス）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457605/b430cb7a-aaf5-505e-1fc8-38900ee15844.png)

コード.gsのところにスクリプトを書くわけですが、そこに以下のようなスクリプトを書いておきます。基本的にJavaScriptに近い文法です。
```
function checkStock(){
  start = 2; // 開始列数
  end = 100; // 終了列数（空欄は在庫数取得をスキップするので大きめの値を書いておけばOK）

  sheet = SpreadsheetApp.getActiveSpreadsheet(); // 表を取得
  skus = sheet.getRange('B'+start.toString()+':B'+end.toString()).getValues(); // 在庫数を取得するSKUの配列を表から取得
  nums = [];
  for (let sku of skus){ // 指定範囲のSKUに対して順に：
    if (sku.toString().length > 1){ // SKUが空欄でなかったら、その商品の在庫数を取得
      num1 = []; num1.push(getStock(sku));
    }
    else{
      num1 = ['']; // SKUが空欄だったら在庫数は取得せずに空欄としておく
    }
    nums.push(num1); // 在庫数の配列にその結果を追加
  }
  sheet.getRange('C'+start.toString()+':C'+end.toString()).setValues(nums); // 在庫数の配列を表のC列に書き込み

  date = new Date();
  date = Utilities.formatDate(date, "Asia/Tokyo", "yyyy/MM/dd hh:mm:ss");
  sheet.getRange('C1').setValue('在庫数('+date+')'); // 在庫数取得の日時をC1に記録しておく
}

function getStock(sku) {
  const options = {
    "muteHttpExceptions" : true,
  }
  try {
    res = UrlFetchApp.fetch("https://www.switch-science.com/products/"+sku.toString(), options); // URLを指定してSKU番号=skuの商品ページを取得（存在しないSKUなどのエラーの場合もあるので、optionsでエラー無視を指定）
    if (res.getResponseCode() == 200){ // OKの場合
      text = res.getContentText();
      posS = text.indexOf('在庫数');
      posE = text.indexOf('</p>', posS);
      line = text.slice(posS, posE).split(' '); // 取得した商品ページのHTMLから在庫数を切り出し
      num = line[1]; // 変数はグローバルなので、他の関数で使っている変数名はだめ（これでハマったのでメモ）
    }
    else{ // 指定したSKUの商品ページが存在しないなどのエラーのとき
      num = -1
    }
  } catch(e) {
    console.log('Error:')
    console.log(e)
  }
  return(num);
};
```
上の「実行」ボタンで"checkStock"関数を実行すると、表のC列に在庫数がはいります。（初回実行時のみ、認証と実行の許可を求められるのでOKしておきます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457605/47072678-f474-a9b6-ee40-ba84bac8229f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457605/503b503f-af72-3b94-7e43-f0fb281f419c.png)


これを「トリガー」から、シートの起動時、を指定しておくと、このシートを開くと自動で在庫数が更新されるようになります。

定期的に在庫数を取得して1週間ごとのグラフにする、なんてこともできそうですね。
【Next.ts】ただの大学生がポートフォリオ兼近況報告用サイトをデプロイした

## はじめに

初めてQiitaの記事を書かせていただきます。

内容はタイトルの通りで、今後色々と作ってリリースをしていきたいので、それを見据えて作りました。

これまでメイン/アルバイトでVue.jsを使っていたのですが、以前から使いたいと思っていたNext.js(React)を使ってみた次第です。

GitHubのレポジトリ↓

https://github.com/sakho13/im_sakho

デプロイ↓

https://im-sakho-blog.vercel.app/

### 使用した技術

使っている技術も少ないですし、機能やデザインも改善の余地はあるのですが、とりあえずデプロを目標に開発を進めました。

* Next.js
    * TypeScript
* Notion: 記事管理
    * notion-page-to-html
* Vercel: デプロイ
* Google Analytics: 今後の勉強用に導入
* SCSS
* (NextUI: レスポンシブ用のGridを使ってたのですが、結局は直書きがベストかなと)

## 実装につて

### Next.jsが凄すぎた

これまで個人としてVue.js＆Goでのアプリケーション開発を勉強していたのですが、実際にデプロイするため環境を整えるというのがどうしても今の自分では出来ない部分というところでありました。

そんな中、目にしたのがNext.jsの**API Routes**です。

「嘘でしょ、フロントとバック一緒に上げれるの？」

無知とは怖いなと思うところです。

これを知ってからは、色々作りたい欲がバンバン出てきています！

### Notionとの連携

今回一番悩んだのが、Notionとの連携でした。

初めはNotionAPIを使って記事を取得しようとして実装を進めたのですが、**Notionのブロック**というものに苦戦を強いられ挫折しました。
コードにはその時の亡骸が残ってます(´；ω；｀)

挫折理由としては次の２つになります。

* ブロックの中にブロックがある再帰構造となっている
    * 主に、箇条書きのリスト部分が一括で取れない
* 記事取得に時間がかかり過ぎる

ということで、"notion-page-to-html"というライブラリを使って実装という形になってしまいました。
これには、記事を取得するにはNotion側で公開に設定しなければならないという手間の問題があります。

何か方法があればNotionAPIに切り替えたいところではありますが、一旦はという形です。

### デザイン

センスは当然皆無でございます。(何か違うんだよな感)

とりあえず、ライト/ダークモードの切り替えに対応させています。
私が基本ダークモードしか使ってないので、ライトモードで変な色のところがあったりするかもしれません。

## 今後

今後追加したい機能としては

* ~~ファビコンを新しく作ったでそれに変更~~ (完了: 2022/11/24)
* ~~記事ごとの静的ページを作成~~（完了: 2022/12/31）
    * [こちらにまとめました](https://qiita.com/SaKho13/items/afe5586946791578c9b9)
* Google Analyticsのイベントを追加

かなと思ってます。

## おわりに

以前、Firebaseでちょっとしたものをデプロイしたのですが、その時の反省点も踏まえて実装ができたので満足…かなと思っています!
2地点の座標（緯度・経度）から距離を求める(SPSS Modeler データ加工逆引き3-17)

## 2地点の座標（緯度・経度）から距離を求める

![スクリーンショット 2022-10-14 17.01.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/af24802a-a6ad-ed4a-592c-ff8b92f4d752.png)

## 1.想定される利用目的

・モバイルデバイスと店舗間の距離を特徴量にする
・車両などの移動距離を異常検知や故障予測の特徴量にする

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/distance.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-10-14 17.48.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f76c3153-3d9e-64a5-91a4-004f7d30d8ad.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2022-10-14 17.50.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8f20bb9c-48c5-1e8c-a4ac-3f94067a953a.png)

b.[フィールド作成]ノードを編集します。
![スクリーンショット 2022-10-14 17.50.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5f490a0e-3412-cd58-429d-6ff6e81f49a3.png)

式ビルダーを利用すると入力しやすくなります。
![スクリーンショット 2022-10-14 17.52.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/66d0232e-ddc4-89cc-3cd5-033ce846d3ad.png)

距離の求め方は以下の方法に従っています。
![dp-05-img03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/fd10939e-1568-4d81-d4cc-4a299bbe7075.png)

[プレビュー]します。
![スクリーンショット 2022-10-14 17.53.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/aa6be443-019c-002c-f216-c80879d01e4f.png)

#### 注意点

距離を求める方法はいくつか存在します。極端に短い距離の場合には今回のような式は不要です。

## 4.参考情報

#### 移動体の座標とタイムスタンプを扱った記事

https://www.ibm.com/blogs/solutions/jp-ja/modeler-tips-05/

#### 地図連携について扱った記事

https://qiita.com/kawada2017/items/3b40b0fc595482deeb66

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
[Ubuntu] ThinkPadで中ボタンクリックでのペーストを無効にする

備忘録枠です。
CLIから設定もめんどくさい方向け。
22.04でやってますが、20.04でもできてた気がします。

# 環境

- ThinkPad X13 Gen2
- Ubuntu 22.04

# 方法

1. `gnome-tweaks`を導入する。
    1. `sudo apt update && sudo apt install gnome-tweaks`
1. 下記画像中にある、「中クリックによる貼り付け」のトグルをオフにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306146/50ccf8cc-5493-b325-3056-4cb2a591da6a.png)

以上です。
【Rails基礎】ややこしい部分テンプレートの省略形について簡単にまとめてみた

ソースコードを見ていると部分テンプレートをパーシャルするときに様々な省略形を目にするので、調べたところとてもわかりやすい記事を見つけたので、紹介します。

https://techtechmedia.com/partial-template-rails/
STM32L010と温度,STTS751で液晶温度計 (Mbed)(AQM0802A)(STM32L010F4P6)



x mbed2リビジョン125
x リビジョンの変更ができる人むけ

x 昔、秋月で売っていた温度センサーSTTS751
代用品は、S-5851A。(おもにアドレスの違い)

目的
AQM0802Aで遊ぶ
適当にあつたI2C温度センサーを使用


![o_cop162.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b6332b1b-91e5-46eb-e084-12e4ba18b417.jpeg)


![o_cop161.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0ee538fa-a1ba-bc43-3ca2-b056c3cce66d.jpeg)



LPC812MAXのプログラムとI2Cの定義が違う


```c++

//       SDA    SCL
I2C i2c(PA_10, PA_9); //010


```


参考



https://qiita.com/caa45040/items/e7a06f54b863be1979e5



I2C_LCD_751_010_1




```c++



#include "mbed.h"

//STTS751 0x39
#define ADDR        (0x72) //  address
#define ADDR_LCD    (0x7C) //  address

//       SDA    SCL
I2C i2c(PA_10, PA_9); //010

//10の割り算 0から1028までは、正しい。主に0から999
#define DIV10(n) ((n*205)>>11)

char    tempval;        //温度
char    data_read[6];   //i2cバッファー

//液晶初期化配列
char INIT_com[]= {0x0,0x38,
                  0x0,0x39,
                  0x0,0x4,
                  0x0,0x14,
                  0x0,0x70,
                  0x0,0x56,
                  0x0,0x6C,
                  0x0,0x38,
                  0x0,0xC,
                  0x0,0x1,
                  0x40,0x41
                 };

//液晶のクリア
char INIT_cls[]= {0x0,0x1};

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

    //液晶の初期化
    for(int ii=0; ii<11; ii++) {
        i2c.write(ADDR_LCD, &INIT_com[ii*2], 2);
        wait_ms(2);
    }//for

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

        //液晶のクリア
        i2c.write(ADDR_LCD,INIT_cls,2);
        wait_ms(2);

        //初期化
        //set address 0
        i2c.write(ADDR, "\000", 1); //addres 0

        //温度の読み込み
        // Read temperature register
        i2c.read(ADDR, &tempval,1);

        //tempval = 21; //debug

        //液晶に出力
        // Display result
        data_read[3] = 0;
        data_read[2] = '0' + tempval - ( DIV10(tempval) * 10 ); //1の桁
        data_read[1] = '0' + DIV10(tempval);                    //10の桁
        data_read[0] = '@';
        i2c.write(ADDR_LCD, data_read,3);

        //1秒待つ
        wait_ms(1000);

    }//while

}//main




```