OmniAICreator/Qiita-1.07M huggingface dataset:
UITextViewでテキストを選択した時に出るMenuをカスタマイズする方法

UITextViewで文を選択した時に出るMenuに新たなMenuを追加したかったので、備忘録として残します。

## 実装

```Swift
import UIKit

final class TextView: UITextView {
    override func editMenu(for textRange: UITextRange, suggestedActions: [UIMenuElement]) -> UIMenu? {
        var actions = suggestedActions

        let customMenu = UIMenu(
            title: "",
            options: .displayInline,
            children: [
                UIAction(title: "カスタム") { _ in
                    print("カスタム")
                }
            ]
        )

        actions.insert(customMenu, at: 0)
        return UIMenu(children: actions)
    }
}
```
これで既存のメニューにあらたなMenuを追加することができました！
![スクリーンショット 2023-09-12 21.10.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627061/a8cb3a40-c726-8aa5-369d-b12d7e1b6371.png)

また、既存のメニューを全て消し、カスタムのメニューだけ表示したい場合はこのように記述します。
```Swift
final class TextView: UITextView {
    override func editMenu(for textRange: UITextRange, suggestedActions: [UIMenuElement]) -> UIMenu? {
        var actions = suggestedActions

        let customMenu = UIMenu(
            title: "",
            options: .displayInline,
            children: [
                UIAction(title: "カスタム") { _ in
                    print("カスタム")
                }
            ]
        )

        return UIMenu(children: customMenu.children)
    }
}
```

## おわりに
意外と参考になるサイトがなくて苦労しました。
SwiftUIでカスタマイズしたい場合は、UIKitに触れなければならないようです。
【SwiftUI】positionで画面の隅に図形を移動させたい

# はじめに
positionで画面の隅に図形を移動させたい事があり、苦戦したので記録しておきます。

# こんな感じ
![Simulator Screenshot - iPhone SE (3rd generation) - 2023-09-12 at 20.57.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/b3e2b45f-acb8-3067-084a-ea73c9dcd6d5.png)


# 実装
```diff_swift
import SwiftUI

struct ContentView: View {
+   private var rect: CGRect {
+       let scenes = UIApplication.shared.connectedScenes
+       let windowScene = scenes.first as? UIWindowScene
+       return windowScene?.windows.first?.screen.bounds ?? .init()
+   }
    
+   private var safeareaInsets: UIEdgeInsets {
+       let scenes = UIApplication.shared.connectedScenes
+       let windowScene = scenes.first as? UIWindowScene
+       return windowScene?.windows.first?.safeAreaInsets ?? .init()
+   }

    var body: some View {
        VStack {
            Text("テスト")
        }
        .frame(maxWidth: .infinity, maxHeight: .infinity)
        .padding(20)
        .background(content: backgroundView)
    }
    
    private func backgroundView() -> some View {
        ZStack {
            Circle()
                .frame(width: 30, height: 30)
                .foregroundColor(.blue)
+               .position(x: rect.minX, y: rect.minY - safeareaInsets.top)
            
            Circle()
                .frame(width: 30, height: 30)
                .foregroundColor(.blue)
+               .position(x: rect.maxX, y: rect.maxY - safeareaInsets.top - safeareaInsets.bottom)
        }
    }
}
```

# おわり
どうなってるのか分からずめっちゃ時間かかりました。
QuizKnockのパズル解きプログラムを実装してみた！

## TL;DR


最近Atcoderを始めました！
楽しいですが初参加したAtcoder Beginer ContestではA,B問題しか解けず悔しい思いをしています。

そんな時にQuizknockの動画で鶴崎さんがプログラムでパズル王ふくらpに挑戦するのを拝見しました。
>[【大決戦】コンピュータを使ってでもパズル王に勝ちたい！！](https://www.youtube.com/watch?v=4mh9qsH0Zhs)

そのプログラムが練習に良さそうだったので実装してみました。
問題を紹介すると以下の数字パズルです

## 問題
[n1, n2, ... , n_k]のk個の数字に「＋、ー、×、÷」を適用して目的の数Tを作る。
その数式を文字列として出力せよ

## 問題例[^1]
[^1]: テストケースを含めて3例を動画より引用しており、Quizknock作問です。

[2, 5, 5, 9]を使って13を作る

## 答えの１例（答えが複数個存在する可能性あり）

(9 - 5) × 2 + 5



## プログラム
さっそくプログラムを見せます。

プログラムではExpressionという名前で答えの式の計算結果と文字列を管理していて、再帰関数で答えのExpressionを求めています。
また数値計算は計算誤差が無いようにすべてfractionsの有理数演算に任せました。


``` Python
from dataclasses import dataclass
from typing import List

from itertools import combinations
from fractions import Fraction
import copy

@dataclass
class Expression():
    v: Fraction  # valueだけど計算する時、プログラムを書くのが楽になるように一文字にした。
    c: str  # character

# target = 25
# nums = [1,2,2,3,6,9]
        
target = 13
nums = [1,2,3,3,3,9]

e_list = [Expression(v = Fraction(n), c = str(n)) for n in nums]

def get_ans_expression(e_list: List[Expression]) -> Expression:
    length = len(e_list)
    if length == 1:
        return e_list[0]
    indices = range(length)

    # インデックス一覧のindicesから二つ選ぶ
    for i0, i1 in combinations(indices,2):
        e_list_copy = copy.deepcopy(e_list)
        e1 = e_list_copy.pop(i1)
        e0 = e_list_copy.pop(i0)

        # 選んだ二つから新しいExpressionを計算する。
        new_values = [e0.v + e1.v,
                      e0.v - e1.v,
                      e1.v - e0.v,
                      e0.v * e1.v]
        
        new_chars = ["(" + e0.c + "+" + e1.c + ")",
                     "(" + e0.c + "-" + e1.c + ")",
                     "(" + e1.c + "-" + e0.c + ")",
                     "(" + e0.c + "*" + e1.c + ")"]
        
        if e1.v != 0:
            new_values.append(e0.v / e1.v)
            new_chars.append("(" + e0.c + "/" + e1.c + ")")
        if e0.v != 0:
            new_values.append(e1.v / e0.v)
            new_chars.append("(" + e1.c + "/" + e0.c + ")")

        for new_value, new_char in zip(new_values, new_chars):
            # 2重のforループで、
            # 6通りの演算とn個の中から2個選ぶすべての組み合わせに対して再帰呼び出しをする。
            # 再帰呼び出し先ではn-1個のExpressionで同じことする。
            new_expression = Expression(new_value, new_char)
            r = get_ans_expression(e_list_copy + [new_expression])
            
            # 得られたExpressionが目標と一致していたら、
            # すべての再帰呼び出しを一つずつreturnで抜け出す。
            if r.v == target:
                return r
    
    # 見つからなかった場合
    return Expression(target-Fraction(1),"0")

print(get_ans_expression(e_list))
# -> Expression(v=Fraction(13, 1), c='((3*3)+((3+9)/(1+2)))')
```


## 上手く動いてる？
３例確認した範囲ではあっていそうです！

エッジケースなどで間違いがないか少し心配です。
Atcoderと違って、ACのチェックも自分で頑張らないといけませんね。

間違いや改善点などあったら助かります(^^)/
Kotlinで可変長のリストを作成する方法

Kotlinでは、可変長のリストを作成するために、ArrayListとmutableListOfという2つのクラスが用意されています。どちらもリストの要素を追加や削除したり、インデックスでアクセスしたりすることができますが、内部的な実装や機能に違いがあります。この記事では、それぞれの特徴や使い方について解説します。

## ArrayList

ArrayListはJavaのjava.util.ArrayListクラスを継承したクラスです。そのため、Javaとの相互運用性が高く、Javaのメソッドやライブラリを呼び出す際に便利です。また、コンストラクタで初期容量を指定できるため、メモリ効率が高いです。しかし、要素の型を明示的に指定しなければならないため、コードが冗長になる可能性があります。

### 使い方

ArrayListを使うには、以下のように書きます。

```kotlin
// ArrayListを宣言
val list = ArrayList<Int>() // 要素の型を指定

// 要素を追加
list.add(1)
list.add(2)
list.add(3)

// 要素を削除
list.remove(2)

// 要素にアクセス
println(list[0]) // 1
println(list[1]) // 3
```

## mutableListOf

mutableListOfはKotlinのkotlin.collections.MutableListインターフェースを実装したクラスです。そのため、Kotlin独自の機能を利用できます。また、型推論によって要素の型を指定できるため、コードが簡潔になります。しかし、初期容量を指定できないため、メモリ効率が低い可能性があります。また、Javaとの相互運用性が低く、ボクシングやアンボクシングが必要になる場合があります。

### 使い方

mutableListOfを使うには、以下のように書きます。

```kotlin
// mutableListOfを宣言
val list = mutableListOf(1, 2, 3) // 要素の型を推論

// 要素を追加
list.add(4)
list.add(5)
list.add(6)

// 要素を削除
list.remove(4)

// 要素にアクセス
println(list[0]) // 1
println(list[1]) // 2
```

## まとめ

Kotlinでは、ArrayListとmutableListOfという2つのクラスで可変長のリストを作成できます。どちらも利点と欠点がありますので、問題や目的に応じて選択する必要があります。ArrayListはメモリ効率やJavaとの相互運用性が高いですが、コードが冗長になる可能性があります。mutableListOfはコードが簡潔でKotlin独自の機能を利用できますが、メモリ効率やJavaとの相互運用性が低い可能性があります。

## 参考文献
OpenAI. (2023). BingAI (2023年4月5日版) [Large language model]. https://www.bing.com/ai
stablediffusionで写真を高画質化

小さい解像度の画像をでっかくしたい。

ぱくたそ様より引用

![0I9A5582ISUMI_TP_V4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/a6c422a2-c6cf-2cc0-a515-0e777c7912e6.jpeg)

この画像をstablediffusionででっかくする。

![00034.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/58494f95-1455-0e80-07e4-abf7d97890ad.png)

見た目はあんまり変わりませんがね。

# やり方
stablediffuonの extras タブを開き、写真をアップ。
upscalerを4x-ultrasharp を選びGenerateするだけ。
upscalerをR-ESRGAN4x+にした方が自然になる

以上
PrivacySandboxについて

# PrivacySandboxとは
## 3rdPartyCookieを使わないウェブマーケ
3rdPartyCookieが規制されることにより以下のようなウェブマーケティング手法が使われるようになった。
- ファーストパーティデータの利用
自社内でしか使えない

- プラットフォームの利用　
Google,Amazon・・・などプラットフォーム内でしか使えない

- コンテキストマッチの利用
見ているページから、興味・関心や意図といったコンテキストを抽出し、最適な広告配信する方法
サイト内コンテキストはっきりしないと使えない

- 他の識別子を利用する
メールアドレス、フィンガープリントなどを利用する。ユーザーの同意が必要

GoogleからはPrivacySandboxが発表されている。
狙いは、ユーザーのオンラインでのプライバシーを保護しながら、
デジタルビジネスの成功につながるツールを企業や開発者に提供すること


## PrivacySandboxの経緯
- 2019年8月22日
Cookieが当初の設計を超えて利用されているが、Cookieをブロックしてしまうと代替手段としてよりフィンガープリントのようなより邪悪な方法が利用されてしまう。
広告エコシステムを守りながらプライバシーを向上させたい。

- 2020年1月14日
PrivacySandboxでは、ユーザー、パブリッシャー、広告主のニーズに対応しつつ、
回避策となるツールを開発次第、Chromeの3rdPartyCookieサポートを段階的に廃止する。

PrivacySandboxは2023年のQ4（10月）から段階的に適用し、
2024年9月に3rdPartyCookieを全面廃止**予定**。

### 3PCとPrivacySandboxの違い
#### 3PC
広告配信事業者にCookieを送信することで、**サーバ側でデータ処理・分析する**
### PrivacySandbox
ブラウザ側でデータ処理・分析して、**ブラウザが結果を広告配信事業者に送信する**

# PrivacySandboxの主な機能について

## TopicsAPI
ブラウザが行動履歴を分析し、ブラウザに興味関心（Topic）を割り当てる。
広告事業者にブラウザからTopicを送信し、広告事業者はTopicをもとに広告配信する。
※デモグラフィック（属性）系のTopicは存在しない。
※W3Cで仕様策定中（ブラウザの標準になるかどうか検討中）。

#### Topic利用の流れ
1. ブラウザベンダーが分類モデルを作成
モデルでは、以下を分類する。
　・ドメインをどのTopicに分類するか
　・ブラウザをどのTopicに分類するか
2. ブラウザベンダーがブラウザ（ユーザー）に分類モデルを送信
3. 過去1週間の訪問履歴（ドメインのみ）を用いて、分類モデルが毎週5つのTopicIDを割り当て

※個人を特定できてしまう可能性があるため、母数の少ないTopicは割り当てない、としているらしいが詳細は不明。


### TopicsAPIを利用した広告配信
1. ユーザがサイトにアクセス
2. サイトで広告タグ（TopicsAPIを利用してTopicID送信するJS）が発火
3. 広告配信事業者にTopicID送信
4. 広告配信事業者はTopicIDに合わせた広告選択し、広告配信

TopicsAPIでは、ユーザーを特定できてしまうので
- 最大3つのTopicIDを返す
- 5％nの確率でランダムにTopicを返す
※すべての広告配信事業者がブラウザに割り当てられたすべてのTopicIDを取得できるわけではない

ユーザー側でTopicのブロック、Topic送信のオフができる
ドメインのTopicも確認できる


## ProtectedAudienceAPI
リタゲ広告の代替となる
ブラウザにInterestGroup名と広告情報を保存


1. ユーザーがアクセス
2. 広告タグ（配信事業者へURLなどを送信）発火
3. 広告配信事業者DSPがInterestGroupを選択
4. ブラウザにInterestGroupが保存される
5. ユーザーがサイトにアクセス
6. InterestGroupをもとに広告配信
リアルタイムな問い合わせはKey/Value serviceと呼ばれるトラッキングをしないと信頼のあるサーバに行う


# 今後必要なPrivacySandboxへの準備
- 広告主
自社サイトで誰がどのようにInterestGroupの作成・運用しているか確認。
- メディア
自社サイトがどのTopicになるか確認。
現在は間違っていても修正はできない。今後議論されそう。
- 共通
PrivacySandboxで発生する外部送信は、
電気通信事業法の外部送信に当てはまるため対応は必要。
ユーザに対する、Topic、InterestGroupの許諾も必要になってくる。
lxdcliを用いてLXD上でcontainerlab環境を構築

## 目的
containerlab自体の構築に時間がかかってしまっては元も子もない。今回はこの環境の構築を爆速で行う

## 構築

lxdfile
```dockerfile
CONTAINERNAME ubuntu-clab
FROM ubuntu/23.04


RUN export DEBIAN_FRONTEND=noninteractive
RUN timedatectl set-timezone Asia/Tokyo && hostnamectl set-hostname ubuntu-clab
RUN apt-get -y update

RUN dpkg --configure -a
RUN echo "\n\n\n" | apt-get -y install openssh-server
RUN apt-get -y install docker docker.io docker-compose nano curl

RUN echo -e "root:password" | chpasswd
RUN echo -e 'PermitRootLogin  yes' >> /etc/ssh/sshd_config


RUN systemctl enable ssh
RUN systemctl restart ssh
RUN systemctl start ssh


RUN wget https://github.com/srl-labs/containerlab/releases/download/v0.44.3/containerlab_0.44.3_Linux_arm64.tar.gz
RUN tar -zxvf containerlab_0.44.3_Linux_arm64.tar.gz
RUN install containerlab /usr/local/sbin/
RUN containerlab
```

起動
```bash
lxdcli build lxdfile
```

確認
```bash
>>>>>>>> lxc exec ubuntu-clab -- bash -c "containerlab"


deploy container based lab environments with a user-defined interconnections

Usage:
  containerlab [command]

Available Commands:
  completion  generate completion script
  config      configure a lab
  deploy      deploy a lab
  destroy     destroy a lab
  exec        execute a command on one or multiple containers
  generate    generate a Clos topology file, based on provided flags
  graph       generate a topology graph
  help        Help about any command
  inspect     inspect lab details
  save        save containers configuration
  tools       various tools your lab might need
  version     show containerlab version or upgrade

Flags:
  -d, --debug count        enable debug mode
  -h, --help               help for containerlab
      --log-level string   logging level; one of [trace, debug, info, warning, error, fatal] (default "info")
      --name string        lab name
  -r, --runtime string     container runtime
      --timeout duration   timeout for external API requests (e.g. container runtimes), e.g: 30s, 1m, 2m30s (default 2m0s)
  -t, --topo string        path to the topology file
      --vars string        path to the topology template variables file

Use "containerlab [command] --help" for more information about a command.
```
AWS インスタンスタイプ覚え書き

## EC2インスタンスのネーミングポリシー

 - インスタンスファミリーは種類を表す
 - インスタンスサイズは性能を表す
 - インスタンス世代はバージョンを表す

下記の記事が分かりやすい。
https://qiita.com/cloud-solution/items/c8dd9ed491abd3360516

## 覚えておきたいインスタンスタイプ
### 汎用のT系・M系
 - T系 : バースト可能なインスタンス。CPU負荷が少ない時にCPUクレジットをためておき、負荷が上がった際にクレジットを使ってバーストする。ステージング環境で利用されがち。
 - M系 : バランス型で様々な場面で利用が可能。本番環境で利用されがち。

### なぜ本番環境はT系ではなくM系なのか？
Amazon EC2でT系インスタンスを使用しようとした場合、他のインスタンスタイプとは違い、ベースラインと呼ばれるあらかじめ決められたCPU使用率が定義されている。その上で、ベースラインを超えたCPU使用率が使用できる状況がバースト機能であり、CPUクレジットを消化する。
また、CPUクレジットの残高が0になるとベースライン以下の性能しか出なくなるか、追加の課金が必要になる。
 つまりCPU利用率の高い環境でT系のインスタンスを使用した場合、CPU負荷が高まると性能が著しく低下する可能性や追加課金の可能性が出てくるということ。そのため、ワークロードの特徴が不明な場合は、本番環境ではM系のインスタンスが推奨されている。
スクラム開発初心者が約1年経験して学んだ、大切にしたいこと5選

## はじめに
スクラム初心者の私がスクラムを一年ほど経験して、大事にしたいなと思ったことをまとめさせていただきました。
よければいいねをよろしくお願いいたします！

## アジャイル開発、スクラムとは
多くの方が様々な形でまとめていらっしゃいますので、こちらでは簡潔に紹介します。

まず、アジャイル開発とは、短い期間で実装とテストを繰り返して開発する方法です。ウォーターフォール型開発とよく比較される開発スタイルです。

スクラムとは、アジャイル開発の一つのフレームワークです。スプリントという期間の中でゴールを定めて、小さくかつ素早く開発を繰り返します。スクラムを行うチームは、この後説明する3つの役割を持つ、6〜8名程度で構成されることが一般的です。
スクラムには、具体的なプロセスや手順があるわけではありません。次のルールのみ定められています。

* 3つの役割
* 5つのイベント
* 3つの成果物

### 3つの役割
* プロダクトオーナー（PO）
プロダクトのゴールを明確にし、プロダクトの価値を最大化させる
プロダクトバックログの所有者
* 開発者
実際に作業を進め、価値提供をする
スプリントバックログの所有者
* スクラムマスター（SM）
スクラムの各イベントを円滑に進める

### 5つのイベント
* スプリント
開発期間の単位です。期間は、週単位で1週間〜4週間のいずれかです。
* スプリントプランニング
スプリントの中で何ができるかを決め、どうやって達成していくかを話し合います。決まったスプリント期間に対し、適切な時間が設けられます。例えば1週間のスプリントの場合、このイベントは1〜2時間を要します。
* デイリースクラム
作業開始時に15分ほど使って、進捗や問題の共有、その日のゴール設定を行います。「朝会」として実施することがあります。
* スプリントレビュー
インクリメント（成果物）の確認をチーム全体で行い、フィードバックを得ます。POのOKがでたら、成果物の価値が十分ということになります。
* レトロスペクティブ
チームがスプリント内の動き方を見直し、改善するためにトライすることを決めます。スプリントプランニング同様、例えば1週間のスプリントの場合、このイベントは30分〜1時間を要します。

### 3つの成果物
* プロダクトバックログ
これから進めていく開発（プロダクト）が優先順位で並べられたもの
* スプリントバックログ
開発者がスプリントの範囲内で開発を完了させるための計画
* インクリメント（成果物）
スプリントで完了したもの、つまり開発やテストが終わり価値提供できるもの

つまりスクラムでは、3つの役割のいずれかを担う、6〜8人程度のチームで行う開発スタイルで、3つの成果物を作成・管理し、5つのイベントに沿って開発を進めていく、ということになります。

## 大事なこと
それでは本題です。
自分がスクラムを約1年間経験して学んだ、大切にしたいなと思っていることを紹介します。

### 1. 開発者は全部やる
開発者の中には、フロントが得意だけどサーバサイドはさっぱりという人や、インフラが強い人と、何かに特化しているということが多いと思います。ただ、スクラムという開発においては機能横断的になんでも考えていくことが重要になります。
短期間で開発しプロダクトを提供するためには、特定のスキルだけでなく様々な角度から物事を考え素早く実践していくことが必要です。チーム全体で、価値提供のために必要なスキルを全て持っていれば最低限良いですが、スクラムチームの一員になる際は、個人でも色々な角度から考え開発を進められるようになるとより良いと思います。
そのために、自分はまず主体的になってタスクをこなすようにしています。

### 2. 透明性を持たせる
チームで担当を持って開発を進めるので、他の人の作業やプロダクト全体の進捗は細かく把握していくことが大事です。
進捗が見えないと、気づかないうちにバグが発生し、遅れる原因になるかもしれません。実際自分が経験した中で、進捗が悪くずるずる開発してしまったり、黙々と開発してしまったりした際に遅れる傾向にありました。これまでに、早く共有して課題解決するように動けば良かったと後悔したことは割とあります。

### 3. コミュニケーション
チームで開発する上で、コミュニケーションを取ることは必須になります。作業の進捗や成果を共有する時、問題があった時に他のメンバーに助けを求める時、POにインクリメントをレビューいただく時、などコミュニケーションを取る機会は多くあります。
また、自分が何を考えて作業をしているかを共有することで、開発が効率的に進むことにつながります。これは先述の透明性を持たせることにもつながると思います。
正直、スクラム開発で大切なことを聞かれたら、私は即座に「コミュニケーション」と答えます。コミュニケーションが上手くとれないと、進捗や開発環境などで様々な障害が発生し、スクラムは機能しないと思うからです。

### 4. 守破離
ビジネスの現場で聞くことがある言葉です。元々は千利休の詠んだ句から来ています。
まずは『守』として、徹底してスクラムのフレームワークの言っていることを守りましょう。例えば、「POとSMの役割を兼任する」、「リリースを優先するため、振り返りは次回まとめて実施する」は、スクラムの守に反します。役割は一人ひとつにし、必要なイベントを確実に実施し、成果物を毎回のスプリントで必ず出すことが、まずは大事です。
スクラムのフレームワークに則ってチームが軌道に乗ってきたら、フレームワークの範囲内でチームがより効率的に作業できるように『破』ったり『離』れたりすることは問題ないと思います。

### 5. 心理的安全性
ここまで色々紹介してきましたが、これらはチームが穏やかな雰囲気でのびのびと開発ができる環境でないと難しいと思います。スクラムをやっていて自分の思いがフランクに話せないと感じる場合は、SMに相談したり他愛のない話をしたりして、話しやすい環境を作ることが良いと思います。
私はたまにプライベートの話を業務中に差し込んで、話しやすい環境を作るようにしています。

## おわりに
スクラムというフレームワークは、個人的には好きです。スピーディに価値提供ができるし、どんどんでき上がっているということを継続的に実感できるからです。また、スクラムはシンプルである故に、エンジニアのチームだけでなく、営業などにも活用できます。

仕事の進め方の一つとして、ぜひスクラムというフレームワークを選択肢にしてみることはいかがでしょうか？
また、興味を持ってくださった方は、ぜひ[スクラムガイド](https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf)（日本語版）を読んで理解を深めることをオススメいたします。

最後まで読んでいただき、ありがとうございました！！

## 参考
* [SCRUM BOOT CAMP THE BOOK【増補改訂版】 スクラムチームではじめるアジャイル開発](https://www.shoeisha.co.jp/book/detail/9784798167282)
* [スクラム入門](https://qiita.com/wMETAw/items/25972e4708311ed4f779) by @wMETAw 様
MotionBoardのお気に入り機能＞データポイントアクション

# データポイントアクションについて
MotionBoardにはデータポイントアクションという機能があり、ボード上でクリックしたときに特別な動作・処理を仕込むことが可能です。
データポイントアクションで設定可能な処理は大きく下記の３つです。
・　指定した値をシステム変数に格納する
・　指定したボードを開く
・　指定したボタンアクションを実行する

個人的には、データポイントアクションで「指定した値をシステム変数に格納する」のが使い勝手が良くて気に入っています。
例えば、
・　MotionBoard上で更新可能な明細表を用意しておいて、クリックしたレコードの組織CDを変数にセットして、ログインユーザーの所属グループIDと突合して一致しない場合は更新不可のバリデーションを設定する
・　MotionBoard上でグラフを用意しておき、グラフ上でクリックしたレコードの商品CDを変数にセットして、変数で取得した値をURLパラメータにして別のボードに遷移させる
といった機能を実装することができます。

:::note info
補足
本記事の内容・キャプチャ等はMotionBoard Ver.6.3のものです。
設定方法など詳細は[MotionBoard Ver.6.3公式マニュアル](https://cs.wingarc.com/manual/mb/6.3/ja/UUID-d8647e77-edc3-4848-74b0-cc0590616119.html#UUID-c0a18af8-ed1b-a30a-abfc-6e1183736092)を参照してください。
:::

# データポイントアクション（システム変数に格納）の設定

ここではデータポイントアクションで選択したレコードの指定項目値をシステム変数に格納する場合の設定方法を紹介します。

まず、格納先となるシステム変数を作ります。
MotionBoardの画面上部のメニューから「管理＞システム変数の編集」をクリックしてシステム変数設定画面で下記項目を入力してします。
入力が終わったら「追加」をクリックして追加登録します。

・　カテゴリ：後で変数を管理・検索しやすくするためのもの。分かりやすければ何でもOK。
・　変数名：ボード上で使用する変数名。重複不可。分かりやすい名称にする。和名でも英名でもOK。
・　値：空のままにする（ここに入力すると変数は固定値になる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/7cfbf724-5c0e-308b-b5d5-7586b12e7ddb.png)

ボード上に配置した明細表のアイテムプロパティを開き、「その他」タブをクリックします。
「左クリックに割り当てる機能」から「データポイントアクション」を選択すると、左クリック時の動作を設定できます。（デフォルトは「機能を割り当てない」になっています。この状態で以降のデータポイントアクションを設定した場合は、右クリックした際の処理となります）
「データポイントアクション」の右にある歯車マークをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/1e601219-c8ad-c263-0a18-e1728a197403.png)
データポイントアクション設定画面で、「変数に格納のみ」を選択して「反映するシステム変数」の右下にある追加ボタンをクリックして下記を入力します。

・　項目名：クリックしたレコードの取得元となる項目の項目名
・　システム変数名：取得した値をセットする変数名
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/85480270-6b42-fb1f-5e3d-2b11e36228e7.png)

設定は以上です。
ボードを保存して、設定した明細表からレコードをクリックすると、指定した変数に指定した項目の値がセットされるようになります。

例えば、明細表で下図赤枠のデータをクリックすると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/306c2fd6-0c48-553d-62b1-9d89f0cd5a1c.png)

画面上部のメニューから「管理＞システム設定＞全般＞変数」を開き、追加したシステム変数を選択すると「実行結果」に選択したレコードの指定項目の値がセットされていることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/7b9d92e2-cb83-6e4d-f298-6922a053f9c3.png)

変数にセットした後は、用途に応じて変数を利用してください。
例えば入力バリデーションで使用する場合は「[MotionBoard Ver.6.3公式マニュアル　項目値のチェック条件（バリデーション）を指定する](https://cs.wingarc.com/manual/mb/6.3/ja/UUID-e6daf5c1-e29f-2e35-a9ae-883b0377dc26.html#UUID-c1f8539c-6feb-2441-f2f4-21e38d661ced)」を参照してください。
機会があればそちらの実装方法ももう少し詳細に紹介したいと思います。
Javaで「スーパークラスの変数を使う」の動作を確認してみた

# 概要
Javaで「スーパークラスの変数を使う」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/extends/index6.html

# 実装
以下のファイルを作成しました。
```CTest19.java
class CTest19{
  public static void main(String args[]){
    superClass obj[] = new superClass[3];

    obj[0] = new subClassA();
    obj[1] = new subClassB();
    obj[2] = new subClassC();

    for (int i = 0 ; i < 3 ; i++){
      obj[i].dispName();
    }
  }
}

class superClass{
  public void dispName(){
    System.out.println("未定義です");
  }
}

class subClassA extends superClass{
  public void dispName(){
    System.out.println("製品名はXXXです");
  }
}

class subClassB extends superClass{
  public void dispName(){
    System.out.println("製品名はYYYです");
  }
}

class subClassC extends superClass{
  public void dispName(){
    System.out.println("製品名はZZZです");
  }
}
```
以下のコマンドを実行しました。
```
$ javac CTest19.java 
$ java CTest19 
製品名はXXXです
製品名はYYYです
製品名はZZZです
```

# まとめ
何かの役に立てばと。
Rails: send_file後にファイルを削除したい

# 背景
- 大きめのサイズのファイルをクライアント側にダウンロードさせたい
- `send_data`を使ってしまうと一度に全てをメモリに読み込んでしまうので、`send_file`の方を使いたい
- `send_file`を使用すると、後続処理で`file.unlink`とかするとダウンロード完了前にファイルが削除されてしまう
- Tempfileで作ればいつかGCで消してくれるけど、できればその場で消したい

# バージョン
```
rails 6.1.5
ruby 2.7.5
```

# 解決法
解決法1. `Rack::BodyProxy`を使用する
なんやねんそれ：https://www.rubydoc.info/gems/rack/Rack/BodyProxy
```rb
 def export
    CsvModule::CustomModule.new().execute do |file|
      response = send_file file.path, type: Mime[:csv]
      wrapped_response = Rack::BodyProxy.new(response) do
        file&.unlink
      end
      self.response_body = wrapped_response
    end
  end
```

解決法2. send_fileのclose処理を追加する
参考：https://qiita.com/goosys/items/c8f7cbbd972bebfd8fc0

https://github.com/rails/rails/blob/6-1-stable/actionpack/lib/action_dispatch/http/response.rb#L379-L381
send_fileでstreamの送信が全て終わったあとにcloseメソッドがあればそれを使用してくれるっぽい。
```github.com/rails/rails/blob/6-1-stable/actionpack/lib/action_dispatch/http/response.rb
    def close
      stream.close if stream.respond_to?(:close)
    end
```

なので、closeメソッドにファイル削除処理を含む`FileBody`をこっちが作ってあげればよい。
自前の環境はrails6系なので`ActionDispatch::Response::FileBody`を使用する
```rb
  def export
    CsvModule::CustomModule.new().execute do |file|
      temp_file_body = Class.new(ActionDispatch::Response::FileBody) do
        attr_reader :path
        def initialize(file)
          @file = file
          @path = @file.path
        end

        def close
          @file&.unlink
        end
      end.new(file)
      send_file temp_file_body.path, type: Mime[:csv]
    end
  end
```
Androidアプリ「Clask」をリリースしました【個人開発】

## はじめに

個人開発したAndroidアプリ「Clask」をリリースしました！

この記事では、私がAndroidアプリ開発を始めた経緯や開発していて感じたこと、アプリの紹介などを自分のための記録も兼ねてまとめていきます。

## 目次
1. リリースしたアプリ「Clask」について
2. 制作した経緯
3. 使用した言語・データベース
4. 制作していて楽しかったこと・良かったこと
5. 大変だったこと
6. おわりに

## リリースしたアプリ「Clask」について
#### リリースしたアプリ

* <a href='https://play.google.com/store/apps/details?id=com.ruriboshi.clask_app&pcampaignid=pcampaignidMKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'>Clask:リストで分類してタスク管理</a>

#### アプリの概要

タスクをリストで分類して管理するタスク管理アプリです。完了済みのタスクは青、今日は期限のタスクがオレンジ、期限を過ぎたタスクは赤になるので直感的にタスクの完了状況や期限が分かるようになっています。

<p>
<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354509/e9a693e9-c73c-e366-18fc-4bb582ed0e44.jpeg">

<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354509/fbad0412-a035-1053-28cd-8267c14543ff.jpeg">

<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354509/fbbb586c-7443-10b5-bb46-65743e121906.jpeg">


</p>


## 制作した経緯

アプリ開発には以前から興味を持っており、自分が作ったアプリを自分以外の人にも使ってもらえることに魅力を感じたので挑戦しました。タスク管理アプリを作ろうと思った理由は、初心者でも比較的簡単に作れそうだったのと、自分もよく使うので開発のモチベーションを維持できると思ったからです。

## 使用した言語・データベース

* Kotlin
Javaと迷いましたが、Javaよりも簡潔に記述することができることに魅力を感じ、新しい言語にも挑戦してみたかったのでKotlinを選びました。
* Realm
Firebaseを使うことも考えましたが、Realmはデータを端末に保存することに適しているのでタスク管理アプリに向いていて、学習コストもFirebaseに比べて低いので今回はRealmを使うことにしました。

## 制作していて楽しかったこと・良かったこと

#### Kotlinでの実装
Kotlinはあまり躓くことなく楽しんで勉強できました。個人的には初めてでも理解しやすい文法だと思いました。

#### 自分のスマホでアプリが使えること
アプリ開発は初めてだったので、自分の作ったアプリが自分のスマホで動かせることに感動しました（笑）普段から自分でも使えるということがアプリ開発のモチベーションにもつながりました。

## 苦労したこと

#### 他のアプリとの差別化が難しい
シンプルな内容のアプリなので、他のアプリとの差別化が難しかったです。色でタスクの完了状況や期限が分かるようにしたり、タスクをリストに分類して管理することを前提としたアプリにすることで他のアプリと差別化できるようにしました。

#### AdMobの導入に苦戦した
テスト広告の実装からうまくいかず、実装できるまで少し時間がかかりました。

#### アプリのリリース準備が大変だった
リリース準備が思っていたよりも大変でした。デベロッパー登録やaabファイルの作成、スクリーンショットの作成など、やることが多くて初めてのことばかりだったのでかなり苦戦しました。

#### 目指していたクオリティに達しなかった
アプリが自分が目指していたクオリティに達しなかったのが悔しいです。機能面だけでなくデザイン面でも改善の余地があると思うので、これからも勉強を続けてアップデートしていきたいと思います。

# おわりに

初めてのアプリ開発は大変なことも沢山ありましたが、いい経験ができました。これからもアプリをアップデートをしてより使いやすいアプリにできるように頑張ります。
今回はAndroidアプリのみ制作しましたが、今度はIOSアプリにも挑戦したいと思います。
今回の制作で学んだことを生かしてまた新しいアプリを作りたいです。

↓もし興味があればアプリをダウンロードしていただけると嬉しいです。

<a href='https://play.google.com/store/apps/details?id=com.ruriboshi.clask_app&pcampaignid=pcampaignidMKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1'>Clask:リストで分類してタスク管理</a>

最後までお読みいただきありがとうございました。
windows11でファイル名（拡張子）を一括置換する

追記

https://forest.watch.impress.co.jp/library/software/allrename/

のが便利

ついでに、似たような画像を探すのは
https://freesoft-100.com/download/dupfileeliminator/

が便利。

以下、古い情報

windows11でファイル名を一括置換する方法



・好きなフォルダへ移動

右クリックし、powerrenameを開く

検索対象に $ を入力
正規表現を使用にチェック

置換の候補に .png と入力

これで適用

をクリックすれば、フォルダ内のファイルにすべて.pngという拡張子がつく
【メモ】WSLでUbuntu環境を作り、Node.js開発環境を作る

## 記事を書くことになった理由

現在(2023/9/12)、株式会社エイチームの5daysインターンに来ていますが、最初に選択を間違えていた。それはなにかと言うと、インターン中のPCの選択を**Windows or Mac**で**Windows**にしてしまったことだ。

今までは友人をWindows環境だったり、2人で基本的にはハッカソンに参加していていつでもコミュニケーションが取れる状態だったので、共同開発をしたりしてGit Cloneをしておとしてきて、いざローカルサーバを開いたらエラーの嵐になるとは思ってもいなかった。

まぁ少し考えれば**CRLF**と**LF**の問題がでるのは当たり前だった。

**実際のエラーの一部**
```
Delete `␍` eslint(prettier/prettier)
```

個人開発であれば、package.jsonをいじったりできるが、企業さんのものなので、基本的にはいじることができないので**WSL**を使うことになった。

本当に、Macほとんど触ったことないからって逃げるんじゃなかった(笑)

## 実際に実行したこと

https://zenn.dev/claustra01/articles/d5b31d0ffa0eb2

※　WSL2にはアップデートしてません。

https://note.kiriukun.com/entry/20200405-installing-nodejs-using-anyenv-on-wsl-ubuntu

## 終わり

やり方が変わってなくて、ありがたかったがまだ、prettierの別のエラーが出ているので、それが改善したらまた記述しようと思う。

とりあえず、これでUbuntu環境から`git clone`して`code .`すればissueを進めることができたのでOK

会社の雰囲気や、働く上で何が必要なのかを知り身につけながら、技術やエラー対処も身につけたいと思う。
Web技術について

未経験からエンジニアになるまでの勉強の記録。

現在はProgateにてRails,Python,react,HTML5,css3,javascript,
Git,GitHub,SQLあたりを勉強したが、
実際にRailsでWebアプリを作るとなると、
そもそもWebの基礎知識が無いことに気が付いたので、

一度アプリ作成は中断し、「Web技術の基本」という本を１冊読んでみようと思う。
今回はその本の第一章のまとめ。

-----------

Web上の文章はハイパーテキストで構成されていて流れは下記の通り。
01. WebブラウザからWebサーバーにハイパーテキストの情報を送信
02. その情報をWebサーバーが受け取り、Webブラウザにコンテンツを返す
こうしてWebページが表示されているが、このやりとりは世界共通で、決められており、
**HTTP**という。さらにセキュリティを高めたやり取りを**HTTPS**という。

WebサイトにはHPなどの静的ページと、検索サイトやSNSなどの動的ページの２種類がある。
さらに、動的ページにはサーバーサイド・スクリプトとクライアントサイド・スクリプトの２種類がある。
**サーバーサイド・スクリプト**には、スクリプト言語が利用される（Perl,Ruby,Python,PHP,JavaScriptなど）
サーバーサイド・スクリプトの流れ
01. WebブラウザからWebサーバー（**CGI**）に要求
02. Webサーバーからサーバーサイド・スクリプトへプログラムの起動が指示される
03. 処理用プログラムがWebサーバー内のデータを使ってHTMLファイルを作成(ゴニョゴニョする) 
04. サーバーサイド・スクリプトから作成したHTMLの連携がWebサーバーに
05. Webブラウザへ作成したHTMLが送信

クライアントサイド・スクリプトの流れ（主にJavaScript）
01. WebブラウザからWebサーバーに要求
02. Webブラウザ側へクライアントサイド・スクリプトがすでに埋め込まれたHTMLを返す
.NET：ClosedXMLを利用し、Excelファイルを読み取り専用でデータをインポート

```c#
using ClosedXML.Excel;

namespace Service
{
    internal class ImportExcel
    {
        public void ImportMyExcel(string filename)
        {
            try
            {
                // 読み込み専用で開く
                FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                XLWorkbook workbook = new XLWorkbook(fs);
                IXLWorksheet worksheet = workbook.Worksheet(1);
                IXLCell cell;

                int i = 1;
                while (true)
                {
                    cell = worksheet.Cell(i, 1);
                    if (String.IsNullOrEmpty(cell.Value.ToString())) break;
                    // TODO:業務ロジック
                    i++;
                }
            }
            catch
            {
                throw (new AppBaseException("Error:Read excel file. : " + filename));
            }
        }
    }
}

```
Google マップのような評価の星をSwiftUIで実装してみる

Google マップには、ユーザーがお店や施設を星1から5の5段階で評価し、その平均を表示する機能があります。

![S__11517955.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1606414/e14f780d-5258-d378-a4c3-7244f1170011.jpeg)

そこでよく目にする左側が黄色で右側がグレーの星。

これをSwiftUIでどのように実装するかを考えました。

---

まず、黄色い星はSwiftUIでは以下のように実装できます。

```swift
Image(systemName: "star.fill")
	.resizable()
    .foregroundColor(.yellow)
    .frame(width: 300, height: 300)
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1606414/aeafc9ff-4acd-6728-6c5b-88d27fb9c1ce.png" width=300px/>

---

次に左半分が黄色で、右半分がグレーの星を実装してみます。

`foregroundColor`のModifierで部分的に色をつけられればよいのですが、そのような方法は（おそらく）なさそうなので、発想を変えて、「黄色とグレーの長方形を並べ、星型で切り抜く」方針をとります。

```swift
struct HalfStarView: View {
    var body: some View {
        HStack(spacing: 0) {
            Color.yellow
                .frame(width: 150, height: 300)
            Color.gray
                .frame(width: 150, height: 300)
        }
        .mask {
            Image(systemName: "star.fill")
                .resizable()
                .frame(width: 300, height: 300)
        }
    }
}
```

縦300、横150の黄色とグレーの長方形を用意して`HStack`を使って水平方向に横並びにし、、`.mask`Modifierを使って縦横300の星で`HStack`を切り抜いています。

<img src="
https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1606414/dc2880ce-6b6b-7871-d459-31fe2a956f34.png" width=300px/>

---

次に、星の黄色い部分の割合が0以上1以下の場合を考えます。

星を明るくする部分の割合をratioのr、星の縦横幅をそれぞれ300とすると、黄色い部分の横幅は300r、グレー部分の横幅は300(1-r)と表せます。

中学校の数学でやりましたね。

これらの横幅をそれぞれ`Color.yellow`と`Color.gray`の横幅に決めて星型で切り抜いて上げると、`ratio`が変わったときに星の黄色とグレー部分の横幅が変わります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1606414/174a233b-74d1-6d82-225b-a2fa8e8bb231.png" width=300px/>

```swift
struct StarView: View {
    let ratio: CGFloat = 0.9
    let starLength: CGFloat = 300
    var body: some View {
        HStack(spacing: 0) {
            Color.yellow
                .frame(width: 300 * ratio, height: 300)
            Color.gray
                .frame(width: 300 * (1 - ratio), height: 300)
        }
        .mask {
            Image(systemName: "star.fill")
                .resizable()
                .frame(width: 300, height: 300)
        }
    }
}
```

ratioが0.9のとき
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1606414/74dc135d-5d5d-465c-7900-d43434534c6a.png" width=300px/>


ratioが0.3のとき

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1606414/b1b3b61c-6d83-00c7-a84f-f74ef8e22f9f.png" width=300px/>


---
最後に、星の縦横幅と割合をViewの外部から決められるようにして完成です。

```swift
struct StarView: View {
    let ratio: CGFloat
    let starLength: CGFloat

    var body: some View {
        HStack(spacing: 0) {
            Color.yellow
                .frame(width: starLength * ratio, height: starLength)
            Color.gray
                .frame(width: starLength * (1 - ratio), height: starLength)
        }
        .mask {
            Image(systemName: "star.fill")
                .resizable()
                .frame(width: starLength, height: starLength)
        }
    }
}

// 呼び出し側
StarView(ratio: 0.8, starLength: 300)
```
VanJSで無限スクロールの作成に挑戦してみた

## はじめに

ReactやVueで無限スクロールを実現する時は既存のパッケージに頼ってた私ですが、VanJSではそのようなパッケージは無く、誰も作ってなかったので挑戦してみました。結論から言うと簡単にできました。

## 無限スクロールとは

ユーザーが画面下部までスクロールすると、クリックやタップなどのページ遷移操作をしなくても、自動的に新しいコンテンツを表示させることです。有名な例では、Googleの画像検索が無限スクロールを取り入れており、下までスクロールすると新たな画像が次々と表示されます。

## デモ

https://vanjs-infinite-scroll.vercel.app/

## リポジトリ

https://github.com/mori-goq/vanjs-infinite-scroll

## 無限スクロールの作り方

無限スクロールを実現する重要な部分だけ説明します。

無限スクロールの大まかな処理の流れは以下の通りです。

```mermaid
flowchart TD
  A[開始] --> B{ローディングが画面内に\n表示されているか}
  B -->|表示されている| C[データを取得してDOMに表示]
  C --> D{すべてのデータを\n取得したか}
  D -->|はい| E[終了]
  D -->|いいえ| B
```

ここで重要なのは**ローディングが画面内に表示されているかどうか**ですが、実はIntersection Observer APIを利用すれば簡単に実装できます。このAPIは**ターゲットの要素が画面に表示されているか監視**するAPIであり、ブラウザの標準APIとして備わってます。

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

以下のコードでは`target`要素がブラウザで表示する画面内に**出入りする度**に`callback`関数が実行されます。その関数で

- `target`要素が画面内に入ったらデータを取得して要素を追加する
- `target`要素が外面外であれば何もしない

ようにすれば無限スクロールが作れます。

```javascript
const observer = new IntersectionObserver(callback, options)

observer.observe(target)
```

ただし１つ注意があり、`target`要素が画面内ずっとに表示されている場合は`callback`関数は実行されません。無限スクロールを実現するためには`target`要素が画面内ずっとに表示されていても次のデータを取得する必要があるため、リポジトリのコードでは一度`target`要素の監視を終了し、次もデータを取得する場合は`target`要素の監視を再開するようにしています。

## まとめ

今回はVanJSで無限スクロールの作成に挑戦してみました。作る前は、どうやってローディングが画面内に表示されているか判断しようかと悩みましたが、まさかブラウザの標準APIに便利なものがあるとは思いませんでした。今までReactやVueでは既存のパッケージを使っていましたが、この程度のコード量で作れるのであれば自作しても良いかなと思いました。

## 最後に

### GoQSystemでは一緒に働いてくれる仲間を募集中です！

ご興味がある方は以下リンクよりご確認ください。

https://goqsystem.recruit.site?qiita=babe0066f8c5c67657b9
[macOS Ventura] csrutil enableに失敗する

# 環境
MacBook Air (M1, 2020)
macOS 13.5.2（22G91）

# 発生した問題と経緯
playcoverを用いてiPhone/iPad用のアプリをMacにインストールしようとした際に、ログイン認証時に発生する問題を回避するために、[公式ドキュメントページ](https://docs.playcover.io/getting_started/troubleshoot_login "Qiita Home")の手順に従って下記を実施したが、４の「SIP再有効化」で失敗した。
1. SIP (System Integrity Protection)無効化
1. nvram boot-args修正
1. アプリにログイン
1. SIP再有効化


具体的には、Recoveryモードのターミナルから、```csrutil enable```を実行した時に、```csrutil: failed to update security configuration for Macintosh HD: The signing server declined the personalization request.```というエラーが出力されて、有効化に失敗する。

# 解決方法
1. Recoveryモードのまま、上のメニューバーの「Utilities」から「Startup Security Utility」を選択
1. ディスクが暗号化されている場合は、下の「Unlock」をクリックしてパスワードを入力
1. Security Policyをクリックして、「Full Security」を選択してパスワードを入力
1. 左上の🍎から再起動
1. 再起動したら通常のユーザでログイン、```csrutil status```を実行して```
System Integrity Protection status: enabled.```と表示されればOK


### 参考
https://support.apple.com/en-ca/guide/mac-help/mchl768f7291/mac
iptablesのフィルタリングの動作検証してみた


ブラウザだとどう見えるのかあまり資料がなかったのでとりま実験した感じです。

初期状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/80ea2dbf-b8ba-69a1-3c2d-c5e6ee03114a.png)

検証するやつ全適用
```
iptables -t filter -A INPUT  -p tcp --dport 80  -j REJECT --reject-with icmp-net-unreachable
iptables -t filter -A INPUT  -p tcp --dport 80  -j REJECT --reject-with  icmp-host-unreachable
iptables -t filter -A INPUT  -p tcp --dport 80  -j REJECT --reject-with icmp-port-unreachable
iptables -t filter -A INPUT  -p tcp --dport 80  -j REJECT --reject-with  icmp-proto-unreachable
iptables -t filter -A INPUT  -p tcp --dport 80  -j REJECT --reject-with  icmp-net-prohibited
iptables -t filter -A INPUT  -p tcp --dport 80  -j REJECT --reject-with icmp-host-prohibited
```

icmp-net-unreachableが適用されているブラウザ画面（brave）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/9a078867-a715-d100-f366-952b7077e67f.png)

上から削除して行く※ルールが上のものから（番号が小さいものから）適用される
```
iptables -t filter -D INPUT  -p tcp --dport 80  -j REJECT --reject-with icmp-net-unreachable
```

icmp-host-unreachable
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/294ef51e-1035-591d-1b63-24885583effc.png)



```
iptables -t filter -D INPUT  -p tcp --dport 80  -j REJECT --reject-with  icmp-host-unreachable
```

icmp-port-unreachable
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/643014ef-b525-0ada-9f7e-7efdb4fbde1d.png)


```
iptables -t filter -D INPUT  -p tcp --dport 80  -j REJECT --reject-with icmp-port-unreachable
```
icmp-proto-unreachable
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/d833ab3e-5f1b-33c2-2b9d-e941d29dacac.png)


```
iptables -t filter -D INPUT  -p tcp --dport 80  -j REJECT --reject-with  icmp-proto-unreachable
```

icmp-net-prohibited
iptables -t filter -D INPUT  -p tcp --dport 80  -j REJECT --reject-with  icmp-proto-unreachable

```
iptables -t filter -D INPUT  -p tcp --dport 80  -j REJECT --reject-with  icmp-net-prohibited
```


icmp-host-prohibited
iptables -t filter -D INPUT  -p tcp --dport 80  -j REJECT --reject-with  icmp-net-prohibited

後片付け
```
iptables -t filter -D INPUT  -p tcp --dport 80  -j REJECT --reject-with icmp-host-prohibited
```

おかえりー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969819/b6bfde60-f49b-a567-1563-f33d8e8e7be6.png)
JavaScriptにおけるスコープ

JavaScriptにおける`var`、`let`、`const`は、変数を宣言するためのキーワードですが、それぞれにはいくつかの重要な違いがあります。

### `var`

- **関数スコープ**: `var`で宣言された変数は、関数スコープ（またはグローバルスコープ）を持ちます。
- **巻き上げ（Hoisting）**: `var`で宣言された変数は、コード内のどこで宣言されていても関数の先頭に巻き上げられます。
- **再宣言可能**: 同じスコープ内で同じ名前の変数を再宣言できます。

```javascript
function exampleVar() {
  console.log(a); // undefined
  var a = 5;
  console.log(a); // 5
}
```

### `let`

- **ブロックスコープ**: `let`で宣言された変数は、ブロックスコープ（`{}`で囲まれた範囲）を持ちます。
- **巻き上げなし**: `let`で宣言された変数は巻き上げられません。
- **再宣言不可**: 同じスコープ内で同じ名前の変数を再宣言することはできません。

```javascript
function exampleLet() {
  // console.log(b); // ReferenceError
  let b = 10;
  console.log(b); // 10
}
```

### `const`

- **ブロックスコープ**: `const`も`let`と同様にブロックスコープを持ちます。
- **巻き上げなし**: `const`で宣言された変数も巻き上げられません。
- **再宣言・再代入不可**: `const`で宣言された変数は、再宣言や再代入ができません。
- **初期値必須**: `const`で変数を宣言する際には、初期値が必須です。

```javascript
function exampleConst() {
  // console.log(c); // ReferenceError
  const c = 15;
  console.log(c); // 15
  // c = 20; // TypeError
}
```

### まとめ

- `var`は古いコードや特定のケースを除き、現代のJavaScript開発ではあまり推奨されません。
- `let`は再代入が必要な場合に使用します。
- `const`は再代入が不要な場合、つまり値が不変であるべき場合に使用します。

これらの違いを理解することで、変数のスコープや可変性に関するバグを防ぐことができます。
レスポンシブデザインでのクリッカブルマップの問題を『image-map-resizer』と『HTML Imagemap Generator』で解決！

ウェブデザイナーや開発者の皆さん、レスポンシブデザインでのクリッカブルマップの位置ずれに悩んでいませんか？この記事では、その問題を簡単に解決するツール『image-map-resizer』と『HTML Imagemap Generator』の導入方法を紹介します。

# 1. クリッカブルマップとは？

クリッカブルマップは、画像の特定の部分にリンクを設定する技術です。例えば、地図の画像で都道府県ごとに異なるリンクを設定する場合などに使用されます。HTMLの`<map>`タグと`<area>`タグを使用して、画像の特定の領域にリンクを設定します。

# 2. なぜ『image-map-resizer』と『HTML Imagemap Generator』が必要なのか？

- **位置ずれの問題:** レスポンシブデザインでは、クリッカブルマップの設定したエリアがずれることがあります。
- **簡単な解決策:** 『image-map-resizer』は、この問題を簡単に解決するJavaScriptツールです。
- **HTMLの生成:** 『HTML Imagemap Generator』は、クリッカブルマップのHTMLを簡単に生成できるツールです。[こちら](https://labs.d-s-b.jp/ImagemapGenerator/)からアクセスできます。

# 3.『image-map-resizer』と『HTML Imagemap Generator』の導入手順

1. **画像とHTMLの準備:** クリッカブルマップに使用する画像を用意し、『HTML Imagemap Generator』を使用してHTMLを生成します。
2. **スクリプトの追加:** 以下のスクリプトをウェブページに追加します。

```html
<script src="https://unpkg.com/image-map-resizer@1.0.10/js/imageMapResizer.min.js"></script>
<script>imageMapResize();</script>
```

# 4. 実際のコード

```html
<img src="sample.jpg" usemap="#ImageMap" alt="" />
<map name="ImageMap">
  <area shape="circle" coords="154,202,92" href="#" alt="" />
  <area shape="poly" coords="365,120,281,279,450,279" href="#" alt="" />
  <area shape="rect" coords="500,120,662,281" href="#" alt="" />
</map>
```

# 5. まとめ

『image-map-resizer』と『HTML Imagemap Generator』を使用することで、レスポンシブデザインのクリッカブルマップの位置ずれの問題を簡単に解決できます。これらのツールの導入は非常に簡単なので、必要に応じてぜひ利用してみてください。
情報システム（情シス）について

# 情報システム（情シス）とは
  情シスとは「情報システム / 英:Information system」の略であり、ネットワークやパソコンまたはその周辺機器を運用管理するための仕組みです。

  情報システム部とは企業が業務で使用するネットワークそのものや、ルータやPCなどのIT機器、業務システムなどを構築、運用する部署です。
  社内におけるITの専門家として、ITを使った経営課題の解決や新たなサービスを生み出す仕事を行っています。

# 一人情シスとは
「一人情シス」とは、1人で社内のIT関連業務をすべてを請け負わざるを得ない状況、担当者のことを言います。 

# 情報システムの分類
　情報システムを大きく分類すると「基幹システム」と「情報系システム」の2種類に区分できます。


<table>
  <thead>
    <tr>
      <th colspan="3">情報システムの分類</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>分類</th>
      <td>基幹システム</td>
      <td>情報系システム</td>
    </tr>
    <tr>
      <th>言葉の意味</th>
      <td>企業の経済活動の根本を支える業務を管理するシステムの総称<br>
        企業の経営資源である「ヒト・モノ・カネ・情報」を管理するシステムとも言えるでしょう</td>
      <td>業務効率化や社内コミュニケーションやバックオフィス業務の効率化などに利用されているシステム</td>
    </tr>
    <tr>
      <th>主なシステム例</th>
      <td>・販売管理<br>・財務管理<br>・在庫<br>・生産<br>・会計<br>・人事など</td>
      <td>・メールシステム<br>
          ・グループウェア<br>
          ・スケジュール管理ツール<br>
          ・社内SNS<br>
          ・インフラストラクチャー<br>
          ・顧客管理システムなど</td>
    </tr>
    <tr>
      <th>ひとまとめ</th>
      <td> 基幹システムの機能をひとまとめにしたシステムは、ERPと呼ばれます</td>
      <td></td>
    </tr>
  </tbody>
</table>

# 情報システムの仕組み
アプリケーション、プラットフォーム、インフラストラクチャーにて構成されています。

・アプリケーションとは、OSに対応するソフトウェアやプログラムのことです。

<table>
  <thead>
    <tr>
      <th colspan="3">例：</th>
    </tr>
  </thead>
  <thead>
    <tr>
      <th>名前</th> <th>説明</th>
    </tr>
  </thead>
  <tr>
    <td> 業務上で使用 </td> 
    <td>ワードやエクセルなどOffice365や基幹システム内の各項目、出張費を生産する経費精算システムなど</td>
  </tr>
  <tr>
    <td> 個人の生活 </td> 
    <td>各種スマートフォンで利用可能なゲームや乗換案内、コミュニケーションツールなど</td>
  </tr>
</table>

# プラットフォーム
アプリケーションを動かすための環境を指し、OSやミドルウェアなどが該当します。

・ミドルウェアに該当するのはアプリケーションサーバーやWebサーバー、データベース管理サーバーなどが該当します。機能としては、ユーザーからのアクセスに応じてWebページへの送信やデータベース上の顧客データの検索などといった機能が挙げられます。

# インフラストラクチャー
インフラストラクチャーは、ITインフラとも呼ばれるIT技術を活用するためのハードウェアとソフトウェアの両方を指します。ハードウェアはPCやサーバー、ストレージなどのネットワーク機器に加え、LANケーブルなどの通信回線、電源装置なども含まれます。一方、ソフトウェアに関してはPCを稼働させるためのOSやソフトウェアなどが該当します。
PowerAppsでいい感じにオリジナルのエラーメッセージを出そう

## この記事で伝えたいこと
::: note info
Notify関数を使おう！
エラー、ワーニング、成功、インフォの形で通知が出せるよ！
:::
::: note warn
通知の大きさは変えられないよ
昔はhtmlを使えばいけたみたいだけど、今は変える方法はないっぽいよ
:::

## 概要
皆さん、いい感じにオリジナルのエラーメッセージ出したいことって有りませんか？
そういうとき、こんな感じでやってませんか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676003/aba78434-d011-4c2a-d1a4-588efdbf53e3.png)
これでもいいんですが・・・
これだと、正しく入力できている時に無駄に**空白**ができちゃいますし、なんだかのっぺりしますよね？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676003/6bb0f03b-9d32-0586-08c3-f1ce484b4c5c.png)

## 本題
そんなときは**Notify関数**を使いましょう。
そうするとすでにある要素の更に上から被さる形で通知を送ることができ、時間経過で消えてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676003/1adc33ba-fa0d-228d-8917-699e86c085fc.png)
```PowerApps
Notify(通知で出したい文字,形式,何秒表示するか)
```
これで呼び出すことができます。

ちなみに上記の例でいうと、OnChangeの項目に以下のように設定すると呼び出せます。
この場合、文字を入力してから空欄にするとOnChangeが発火し、通知が送信されます。

```
If(IsBlank(AgeInput.Text),Notify("ねんれいをにゅうりょくしてください",NotificationType.Error))
```
::: note warn
「ねんれい」の隣にある入力欄を「AgeInput」としています。
また、空欄→(入力→確定せずそのまま文字を消して)→空欄とした場合に反応しないので**このコード自体は必須チェックとしては**適していないです。
:::
## ほかの使用例

もちろんボタン等にも設定できます。
ボタンを作り、そのボタンに以下のように設定してみてください。
```
If(Value(AgeInput.Text)>200,Notify("ふざけないでね（0~200のあいだでにゅうりょくしてね）",NotificationType.Warning))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676003/e40aba1d-0297-8b36-278c-6ca4439aef2a.png)
If関数を使えば色々な場所に使えますね。

## オプションとか
まず、通知の形式ですが以下の4種類があります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676003/9eaeefb7-d96a-eb0f-5dfe-4e67dd17a2a1.png)
冒頭に書いたように、**エラー、ワーニング、成功、インフォメーション**ですね。
既定値は、**インフォメーション**になります。

また、3つ目の引数に数字を指定することで**nミリ秒**(既定値は**10秒=10000ミリ秒**)で消える、といった指定ができます。
ちなみに、0を指定するともう一度Notify関数が実行されるか、ユーザーが消すまで表示されます。
## 余談
ちなみに、気づいた方もいらっしゃるかもしれませんが実はNotifycationType~~~~は**数値**を返しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676003/08026167-18a6-86c6-bf44-4e58e93840e5.png)
なので、0～3の数字を指定してあげても普通に**動いてくれます**。(4以降を指定するとエラーになります。)
もっというとこんな無茶苦茶な書き方でも動きます。
```
Notify("この場合はSuccessと同じ扱い",NotificationType.Warning+NotificationType.Warning)
```
**NotificationType.Warning+NotificationType.Warning**
とすることで、数値の扱いとしては「2」となり、**NotificationType.Success**と同じ扱いになります。

見づらい＆正規の方法ではないのでおすすめはしませんが・・・もしかしたら画面の数字とうまく連動させて、とかできるかもしれませんね。
**~~やらないでほしい。~~**
## 終わりに
いかがでしたでしょうか。
うまく書けば入力チェック等、色んなところで活躍してくれます。
ただ、通知がちょっと小さいのがネックでしょうか。
昔はhtmlを使えばいけたようですが、今は不可能なみたいです。
## 参考
https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-showerror

https://powerusers.microsoft.com/t5/Building-Power-Apps/How-do-I-make-the-text-bigger-when-using-Notify-function/td-p/321430
WordPress 固定ページにPHPファイルを反映させる方法

テーマのfunctions.phpに追加

```php
// phpfile ショートコードで PHP ファイルを読み込む
function include_php_file($atts) {
    $atts = shortcode_atts(array(
        'file' => '', // ファイル名を指定
    ), $atts);

    if (empty($atts['file'])) {
        return ''; // ファイル名が指定されていない場合は何も表示しない
    }

    ob_start();
    include(get_template_directory() . '/' . $atts['file']);
    return ob_get_clean();
}
add_shortcode('phpfile', 'include_php_file');
```

テーマのfunctions.phpと同じ階層に
追加したいPHPファイルを追加(tuika.php)

固定ページにて
[phpfile file="tuika.php"]
と記載すると反映される

複数のPHPファイルを追加したい場合は、PHPファイル(tuika2.php)を同様に作成後違う固定ページにて
[phpfile file="tuika2.php"]
を記載すると反映される
直円錐の体積の公式「2018 奈良教育大学前期【4】」をChatGPTとWolframAlphaとsympyでやってみたい。

(旧タイトル)直円錐の公式「2018 奈良教育大学前期【4】」をChatGPTとWolframAlphaとsympyでやってみたい。
いつもお楽しみ？の「FreeCADの作図」は、今回省略です。

オリジナル 

https://kamelink.com/blog/2023/09/22/15-6-18narakyodai%e3%83%bb4/

https://mathmathmass.exblog.jp/33432444/

上と同じです。大学入試数学問題集成 様＞【４】テキスト

https://mathexamtest.web.fc2.com/2018/201810621/2018106210100mj.html#top-0104

# ChatGPT-3.5先生へ(できました。) ありがとうございました。
入力文
```
底面の半径r，高さがhである円錐の体積Vは
1/3πr2h
となることを，積分を用いて証明せよ．
```
＞V = (1/3)πr^2h
＞これで積分を用いて円錐の体積を証明しました。

# ChatGPT-3.5先生へ(sympyのソース)ありがとうございました。
入力文(1行づつです。)　返信は、抜粋です。
```
円錐の体積の計算式を教えて下さい。
```
```
積分で
```
```
sympyで
```
私は、本ページ後半でpycharmで実行して確認しました。
私は、さらに、調子に乗って
```
実行して下さい。
```
＞残念ながら、現在の環境ではPythonコードの実行がサポートされていない...

```
GPTのインタプリタならできますか
```
＞GPT-3やGPT-4はテキストベースの情報提供に優れていますが、プログラムの実行は行えません。

# WolframAlphaで

https://ja.wolframalpha.com/input?i=integrate%28pi+*+%28r+%2F+h+*+x%29**2%2C+%28x%2C+0%2C+h%29%29

https://ja.wolframalpha.com/input?i=%E5%86%86%E9%8C%90%E3%81%AE%E4%BD%93%E7%A9%8D

？？？

https://ja.wolframalpha.com/input?i=%E7%9B%B4%E5%86%86%E9%8C%90%E3%81%AE%E4%BD%93%E7%A9%8D

# sympyで(ChatGPT-3.5先生に教えてもらったソースコードで)
もちろん以下の　SymPy Live　Shell　で実行できました。
```python
import sympy as sp

# 変数を定義
x, h, r = sp.symbols('x h r')

# 積分式を定義
integral_expr = sp.pi * (r / h * x)**2

# 積分を実行
volume = sp.integrate(integral_expr, (x, 0, h))

# 結果を表示
print("円錐の体積:", volume)
```
結果
```
円錐の体積: pi*h*r**2/3
```

# sympyで(T氏の数学日記 様の方法を参考に)
```python
from sympy import *
var('x,h,r',real=True)
y=r/h*x
V=pi*integrate(y**2,(x,0,h))
print("# 円錐の体積:",V)
# 円錐の体積: pi*h*r**2/3
```

# sympyで(いつものスタイルで)
積分関数を思い出す、DOCを調べる必要がなくてイイですね。
ChatGPTで-3.5先生。ありがとうございます。
```python
from sympy import *
var('x,h,r',real=True)
print("# 円錐の体積:",integrate(pi * (r / h * x)**2, (x, 0, h)))
# 円錐の体積: pi*h*r**2/3
```
# sympyの実行環境
①私の環境は,pycharmです。
②よく聞くのは、Jupyterです。
③web上で、上記のソースを「SymPy Live shell」に、コピー貼り付けでもできました。
黒背景の右上に、マウスを移動すると、コピーマークが発生します。
???　タブレット環境で、コピー貼り付けが実行できませんでした。???

https://live.sympy.org/

# 参考

以下、いつもの?おすすめです。

https://qiita.com/mrrclb48z/items/75904cdc6e84ecef4d03#%E5%8F%82%E8%80%83wolframalpha-%E9%96%8B%E7%99%BA%E7%89%A9%E8%AA%9E
OpsRamp ワークフローのScript Outputについて

本記事では、OpsRamp ワークフローのScript Outputについて説明します。

# 概要
OpsRamp ワークフローのScript Taskで実行された結果は、「output」という変数に格納されます。
この変数を使用することにより、実行結果の内容をもとにしたワークフローの条件分岐や実行結果の内容をほかのシステムへ通知するといったことが可能です。

# Script Outputについて
Scriptからの標準出力が実行結果として「output」に格納されます。
- Script
![script.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/b0bda310-77ca-f3dc-9762-45efecb9e591.png)
- ワークフロー Activity
![wf-activity.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/7ac7c8f0-64f1-2e10-467c-eac5292178d2.png)

\<Scriptタスク名\>.outputを指定することでGatewayの条件やServiceタスクで使用することができます。
![wf.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/cc504bab-b7aa-93a0-26af-7697703e64df.png)

- Gateway
![wf-gateway.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/cfe739d7-65c9-9833-1a83-f24616b93fcd.png)

- Serviceタスク (Rest Web Service)
![wf-servicetask.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/5fd06fc6-88ae-da37-d495-549631790e4a.png)
![api-payload.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/eac25204-0660-0dfd-0ac9-b8228c115f4b.png)
※ ServiceタスクのRest Web Serviceでは、ServiceタスクにScriptタスクの変数を渡し、Custom Integrationで\$outputを指定します。


---------------------------------------
[<img width = 250 height = 200 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/111de30a-4d33-aa33-5c7d-83d9015093e6.png">](https://www.vistanet.jp/knowledge-base/)
iRICのソルバーをコマンドラインから実行する方法

iRICのソルバーは通常はiRICのGUIの中で「Similation」「Run」を選ぶか、プレイボタンを押すことにより実行されます。
ただし、何等かの理由でコマンドラインから直接実行したい場合もあると思います。例えば、バッチ処理で複数のケースを連続して実行したい場合や、デバック時に詳しいエラーメッセージを見たい場合などがこれに相当します。
この場合、まずコマンドプロンプトで、
set　PATH=[iRICインストールフォルダのフルパス名]\guis\prepost;%PATH%"
を実行しその後で、
<フルパス>/ソルバー.exe  <フルパス>/Case1.cgn 
を実行するとコマンドプロンプト上でiRICのソルバーを実行できます。
Astroで環境構築してみた

## 概要
AstroでWEBサイトを作成したので手順をメモしました。

### 環境
node.js: v18.5.0

## 手順
[公式サイト](https://docs.astro.build/ja/install/auto/)にある手順通りに進める。
- ターミナルで以下のコマンドを実行し、質問に答えていく。
```
# npm
npm create astro@latest

# yarn
yarn create astro
```

- 開発サーバ起動
```
# npm
npm run dev

# yarn
yarn run dev
```

- コマンド実行すると、プロジェクトの開発サーバーが起動します。
- http://localhost:3000 にアクセスすると画面が表示されます。
Dockerでコンテナを起動しているのに「Apache2 Default Page」「It works!」のページしか表示されない

Ubuntuの場合、
・「/etc/apache2/ports.conf」をvimなどで開く
・「Listen 80」が書かれていたらコメントアウト
・保存
・Ubuntuの再起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556711/939d4c98-0d93-b4d6-291f-ff62643961a3.png)
OmronのSysmac Studioを使ってみた

今回はお客様のご依頼により、Omronの開発環境「Sysmac Studio」を使用して、
Omron製のPLC「NXシリーズのNX1P2」にラダー＆ST言語のプログラムを
インストールすることになりました。

オムロンのNXシリーズでは、ラダーとST言語どちらも使用することができ、
ラダーが苦手とする四則演算を比較的簡単に作成することができます。

## インストール
まずはSysmac Studioのインストール方法です。
Sysmac Studioは、無料のソフトウェアではありません。
オムロンからインストールDVDを購入し、
別途ライセンス購入も必要となります。

インストールDVDを購入しインストール完了すれば、
デスクトップに以下のアイコンが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/9dd05f07-e221-3e75-c16a-357b18c966a8.png)

## 起動
起動すると以下の画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/ed7f46e2-efa7-7fc4-35c8-4bd01c3d43ae.png)

新規プロジェクトをクリックします。

プロジェクト名、作成者を設定し、種類は「スタンダードプロジェクト」で問題ありません。
デバイスは、使用するものを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/2542ed53-03ca-082b-d09d-3705de287971.png)

すると以下の起動画面が表示されここから開発を行っていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1339052/010a5dc4-b3a9-a327-ea7b-5af643dc7785.png)

正直開発内容はめちゃくちゃ奥が深いため、ここでは記載できる内容ではございません。
マニュアルがありますのでそちらを参考にしてみてください。


オムロンのSysmacStudioの開発でお困りの方は、お気軽にご相談ください。