OmniAICreator/Qiita-1.07M huggingface dataset:
Install Kafka in WSL and access from Windows

1. install Kafka in WSL
[quickstart](https://kafka.apache.org/quickstart)
1. Access Kafka with Java from Windows
dependence：org.apache.kafka-clients:3.1.2
```
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.serialization.StringSerializer;

import java.util.Properties;

public class ProducerDemo {

  public static void main(String[] args) {

    String bootstrapServers = "127.0.0.1:9092";

    //create Producer properties
    Properties properties = new Properties();
    properties.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
    properties.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
        StringSerializer.class.getName());
    properties.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
        StringSerializer.class.getName());

    //create the producer
    KafkaProducer<String, String> producer = new KafkaProducer<String, String>(properties);

    //create a producer record
    ProducerRecord<String, String> record =
        new ProducerRecord<String, String>("local.chat", "hallo world!!!!");

    //send data
    producer.send(record);

    //flush + close
    producer.flush();
    producer.close();
  }

}
```
### よくある問題
#### Error1
>2022-12-13 17:41:10.884  WARN 23284 --- [ad | producer-1] org.apache.kafka.clients.NetworkClient   : [Producer clientId=producer-1] Con
nection to node -1 (/172.21.223.255:9092) could not be established. Broker may not be available.
2022-12-13 17:41:10.884  WARN 23284 --- [ad | producer-1] org.apache.kafka.clients.NetworkClient   : [Producer clientId=producer-1] Boo
tstrap broker 172.21.223.255:9092 (id: -1 rack: null) disconnected

解決方法：
(1)
> WSL2 currently has a networking issue that prevents outside programs to connect to Kafka running on WSL2 (for example your Java programs, Conduktor, etc...);
Disable IPv6 on WSL2
`sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1`
`sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1`

(2) `cd {Kafka_Home}`
`vim config/server.properites`
下記のものを追加する
```
advertised.listeners=PLAINTEXT://127.0.0.1:9092
listener.security.protocol.map=PLAINTEXT:PLAINTEXT
listeners=PLAINTEXT://0.0.0.0:9092
```
(3) 再起動

#### Error2
` bin/kafka-server-start.sh config/kraft/server.properties`を実行する時
> [2022-12-13 22:45:29,548] ERROR Exiting Kafka due to fatal exception (kafka.Kafka$)
org.apache.kafka.common.KafkaException: No `meta.properties` found in /tmp/kraft-combined-logs (have you run `kafka-storage.sh` to format the directory?)

解決方法
```
rand=`./bin/kafka-storage.sh random-uuid`
echo $rand
./bin/kafka-storage.sh format -t $rand  -c ./config/kraft/server.properties
```
再起動
`bin/kafka-server-start.sh config/kraft/server.properties`
Djangoで画像が表示されない原因【urls.pyが間違っていた】

無駄にハマったので記しときます。


Next.js　と　Djangoでアプリを作っていて、画像を表示しようと思った時にハマりました。

人によって原因は違うと思いますが、僕は

```python:urls.py
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
```
この記述を間違った`urls.py`に記載していました。

というのも、

・app
　・urls.py
・project
　・url.py ←こっちに記載しないといけなかった。

というだけでした。

なので、最終的に以下のように書いたら画像が表示されました。

```python:urls.py
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('app.urls'))
]

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
```
   

`urls.py`って同じ名前の作らないで欲しいですね。🥺 Django初心者からするとややこしい。笑

終わり。
ワークシートの範囲内のテキストをLINQで検索する

# はじめに
未だにCOMコンポーネントを使いExcelを操作しているみなさんこんにちは。
業務上仕方ないとはいえ、使いにくくてストレスが溜まりますよね。
サクッとシート内の検索をしたいだけなのに、ググったら公式はFindを使えという始末。

https://learn.microsoft.com/ja-jp/visualstudio/vsto/how-to-programmatically-search-for-text-in-worksheet-ranges?view=vs-2022&tabs=csharp

なんだこれ、使いにくい。
パフォーマンスも悪いらしいし。

そんな方への新提案です。

# LINQで検索できるようにすればいいじゃない
いろいろと調べているうちに、どこかのStackOverflowのページ(もうどこだかわからなくなった)でRangeをIEnumerableにキャストしているのを発見しました。

IEnumerableになるということはLINQが使えるということ。
もうこれで煩わしい、Find、FindNextとはおさらばできます。

# 具体例
上記のFindのページの例を借りると以下のようになります。

```vb:VB
Dim Fruits As IEnumerable(Of Excel.Range) = Me.Application.Range("A1", "B2").Cells.Cast(Of Excel.Range)
```

```c#:C#
IEnumerable<Excel.Range> Fruits = Application.get_Range("A1", "B3").Cells.Cast<Excel.Range>();
```

IEnumerableにしてしまえば、後はもうLINQでWhereするなりAnyするなり、Listにするなり好きにしちゃいましょう。

```vb:VB
Dim apples = Fruits.Where(Function(x) x.Value.ToString() = "apples")
```

```c#:C#
var apples = Fruits.Where(x => x.Value.ToString() == "apples");
```

楽チン！！！

# おわりに
最近はいろいろ便利なExcel操作パッケージがある中で、そもそもCOMコンポーネントでExcel操作なんてもうやめようぜ、という話なんですが、
なかなか検索しても情報が少なくなってきているので、新たな発案(知っている人は知っているんだろうけど)として情報を残しておきます。
php　初心者参考サイト

# 参考サイト

https://php-junkie.net/beginner/php-manual/

https://www.php.net/manual/ja/index.php

https://www.javadrive.jp/php/

https://webkaru.net/php/

http://www.standpower.com/



# 動画サイト

https://www.youtube.com/watch?v=bLxQYJV75h4&t=1s

https://www.youtube.com/watch?v=HGbYK0knjhM

https://www.youtube.com/watch?v=J_pASVQXElA&t=3114s

https://www.youtube.com/watch?v=HNHjpmdPFNU&t=1s

https://www.youtube.com/watch?v=3QxtIrakwKk
paiza.ioでelixir その144

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題
物理剛体シミュレーションを実行せよ。

# サンプルコード

```

IO.puts """
<!doctype html>
<html>
  <head>
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/box2dweb@2.1.0-b/box2d.min.js"></script>
  </head>
  <body>
    <canvas id="c"></canvas>
    <script>
var b2Vec2 = Box2D.Common.Math.b2Vec2,
	b2BodyDef = Box2D.Dynamics.b2BodyDef,
	b2Body = Box2D.Dynamics.b2Body,
	b2FixtureDef = Box2D.Dynamics.b2FixtureDef,
	b2Fixture = Box2D.Dynamics.b2Fixture,
	b2DistanceJointDef = Box2D.Dynamics.Joints.b2DistanceJointDef,
	b2RevoluteJointDef = Box2D.Dynamics.Joints.b2RevoluteJointDef,
	b2World = Box2D.Dynamics.b2World,
	b2MassData = Box2D.Collision.Shapes.b2MassData,
	b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape,
	b2CircleShape = Box2D.Collision.Shapes.b2CircleShape,
	b2DebugDraw = Box2D.Dynamics.b2DebugDraw;
var canvas = document.getElementById("c");
canvas.width = 440;
canvas.height = 440;
var world = new b2World(new b2Vec2(0, 10), true);
var debugDraw = new b2DebugDraw();
debugDraw.SetSprite(canvas.getContext("2d"));
debugDraw.SetDrawScale(150);
debugDraw.SetFillAlpha(0.9);
debugDraw.SetLineThickness(1.0);
debugDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit);
world.SetDebugDraw(debugDraw);
function createWall(x, y, w, h) {
	bodyDef.type = b2Body.b2_staticBody;
	bodyDef.position.x = x + w / 2;
	bodyDef.position.y = y + h / 2;
	fixDef.shape = new Box2D.Collision.Shapes.b2PolygonShape;
	fixDef.shape.SetAsBox(w / 2, h / 2);
	world.CreateBody(bodyDef).CreateFixture(fixDef);
}
function loop() {
	world.Step(1 / 60, 10, 10);
	world.DrawDebugData();
	world.ClearForces();
	setTimeout(loop, 15);
}
"""
IO.puts """
var bodyDef = new Box2D.Dynamics.b2BodyDef;
bodyDef.linearDamping = 0.1;
var fixDef = new Box2D.Dynamics.b2FixtureDef;
fixDef.restitution = 1;
createWall(0, 0, 2, 0.1);
createWall(0, 0, 0.1, 2);
createWall(2, 0, 0.1, 2);
createWall(0, 2, 2.1, 0.1);
fixDef.shape = new b2CircleShape(0.1);
fixDef.density = 0.4;
fixDef.friction = 0.9;
fixDef.restitution = 0.9;
bodyDef.type = b2Body.b2_dynamicBody;
bodyDef.position = new b2Vec2(1.5, 1.0);
bodyDef.linearVelocity = new b2Vec2(-5.0, -5.0);
world.CreateBody(bodyDef).CreateFixture(fixDef);
"""
IO.puts """
loop();
    </script>
  </body>
</html>
"""




```

# 成果物

https://paiza.io/projects/GNQCcd6ifnqWvg3rTJ8mTg


以上。
paiza.ioでelixir その143

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題
錬成陣を描け。

# サンプルコード

```

IO.puts """
<!doctype html>
<html>
<head>
  <style>
  * {
  margin: 0;
  padding: 0;
  border: 0;
}
body {
  background: #fdf;
  font: 30px sans-serif;
}
  </style>
</head>
<body>
    <canvas id='canvas' width='460' height='460'></canvas>
    <script>
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
ctx.translate(200, 200);
ctx.scale(0.9, 0.9);
function strokeStyle(s) {
    ctx.strokeStyle = s;
}
function setShadow(s0, s1, s2, s3) {
    ctx.shadowColor = s0;
    ctx.shadowOffsetX = 3;
    ctx.shadowOffsetY = 0;
    ctx.shadowBlur = 5;
}
function beginPath() {
    ctx.beginPath();
}
function lineWidth(s) {
    ctx.lineWidth = s; 
}
function moveTo(s, e) {
    ctx.moveTo(s, e);
}
function lineTo(s, e) {
    ctx.lineTo(s, e);
}
function stroke() {
    ctx.stroke();
}
function strokePolygon(x, y, size, vertex, angle) {
    var cx;
    var cy;
    var nx;
    var ny;
    beginPath();  
    for (var i = 0; i < vertex; i++)
    {
        cx = size * Math.cos(((2 * Math.PI) / vertex) * i - angle / 180);
        cy = size * Math.sin(((2 * Math.PI) / vertex) * i - angle / 180);
        nx = size * Math.cos(((2 * Math.PI) / vertex) * (i + 1) - angle / 180);
        ny = size * Math.sin(((2 * Math.PI) / vertex) * (i + 1) - angle / 180);
        ctx.moveTo(cx + x, cy + y);
	    ctx.lineTo(nx + x, ny + y);
    }
    stroke();
}
function strokeLines(s0, s1, s2, s3, s4, s5) {
    beginPath();
    ctx.moveTo(s0, s1);
    ctx.lineTo(s2, s3);
    ctx.lineTo(s4, s5);
    ctx.lineTo(s0, s1);
    stroke();
}
function strokeRect(s0, s1, s2, s3) {
    beginPath();
    ctx.rect(s0, s1, s2, s3);
    stroke();
}
function strokeCircle(s0, s1, s2) {
    beginPath();
    ctx.arc(s0, s1, s2, 0 * Math.PI / 180, 360 * Math.PI / 180, false);
    stroke();
}
function arc(s0, s1, s2, s3, s4, s5) {
    ctx.arc(s0 , s1, s2, s3, s4, s5);
}
"""
IO.puts """
lineWidth(5);
strokeStyle("white");
setShadow("white", 0, 0, 10);
strokeRect(-150, -150, 300, 300);
strokeLines(-150, 150, 0, -150, 150, 150);
strokeLines(150, -150, 0, 150, -150, -150);
strokeLines(-150, -150, 150, 0, -150, 150);
strokeLines(150, -150, -150, 0, 150, 150);
strokeCircle(-150, -150, 50);
strokeCircle(150, -150, 50);
strokeCircle(-150, 150, 50);
strokeCircle(150, 150, 50);
strokeCircle(0, 0, 212);
"""
IO.puts """
    </script>
</body>
</html>
"""
    
    
```

# 成果物

https://paiza.io/projects/BWSlys2ggIX5ZwbJotzd1Q


以上。
子育て×EDOCODE

これは EDOCODE Advent Calendar 2022 12月14日の記事です。
Advent Calendar 記事一覧は[こちら](https://adventar.org/calendars/7645 "こちら")

# 自己紹介
プロダクトマネージャーの前原と申します。ポイントモールを運営しています。
EDOCODE設立前の親会社Wanoが運営していたときから担当しているため、担当歴は9年くらいになります。
詳しい自己紹介は[こちら](https://www.wantedly.com/companies/edocode/post_articles/377385 "こちら")にも書いていますので、よろしければご覧ください。

私は7歳と4歳の子供を育てながら働いています。
子育てしながら働くことは社会的にも大きな課題となっている中、EDOCODEでは問題なく働けているので、子育てしながらEDOCODEで働く上でのメリットや経験を紹介したいと思います。

# リモートワークで働けるメリット
私のケースだと通勤時間が長いため、子育てしながら働く上で、かなりのメリットがあります。

### 出社する場合とリモートワークのタイムスケジュール

**出社する場合** 

| 時間 | 行動 |
|:-:|:-:|
|8時　～　8時半|保育園に預ける|
|8時半　～　10時|通勤時間 |
|<font color="red">**10時　～　16時**</font>|仕事 |
|16時　～　17時半|通勤時間 |
|17時半　～　18時|学童と保育園の迎え |

**リモートワークの場合** 
|時間| 行動 |
|:-:|:-:|
|8時　～　8時半|保育園に預ける|
|8時半　～　9時|軽い運動と家事 |
|<font color="red">**9時　～　17時**</font>|仕事 |
|17時　～　17時半|学童と保育園の迎え |

働いた分だけお給料が変わるため、毎日2時間変わると結構な差になります。
フルタイムに近い時間働けることで、任される仕事もその分多くなっていると思います。

そのほかにもたくさんのメリットがあります。
* 朝の家事ができる（帰ってきて散らかりまくってるとメンタルがやられる:sob:）
* 軽い運動ができる（子供と寝落ちしてしまうので、夜の運動はできない可能性が高い:sleeping:）
* 通勤で腰がやられない(ずっと立ってるのしんどい:tired_face:)
* 子どもたちに30分早く会える！(一番大事:heart_eyes:)


会社側もリモートワークでもコミュニケーションがとりやすいようなツールの提供やイベントなど、たくさんの工夫をしてくれています。


# 小学1年の壁についての経験
	
一般的に子供が小学校にあがると仕事との両立が厳しくなることが多いと言われています。
よく聞くこの問題について、EDOCODE働く私が経験したことを書きます。

**毎日の宿題について**
子供だけではできないため、親が宿題をみてあげる時間の確保が必要になります。
時間の確保でいうと時短勤務やリモートワークがあることで対応できています。

**学童の預り時間について**
フルタイム勤務に戻ることで、迎えの時間に間に合わないという問題があります。
こちらも時短勤務やリモートワークがあることで対応できています。

**学校行事の参加について**
平日の学校行事が多くお休みが取りづらいことが問題となっています。
EDOCODEでは2時間単位で休暇がとれること、
またメンバー間での情報共有が密にできているため、引継ぎやすく対応できています。
そして、誰も子供関係でのお休みに対して嫌な顔をしないのも助かっています。

**心のケアについて**
子供はもちろんですが、自分も環境が変わり、はじめてのことだらけで心がいっぱいいっぱいになります。
結果的にこれは回避できませんでしたが、数か月のことだったので何とかなりました。
	
ただ、もし耐えられなかったとしても会社に相談すればおそらく休暇や時短など、何かしら考慮してくれていただろうと思える会社です。

# まとめ
リモートワークができ、時短勤務が認められ、子育てを会社として応援してくれていることが、
子育て×EDOCODEの最大のメリットだと思います。
	
また、この先子育てする上で働きづらく感じることがあれば、相談すれば必ず聞いてもらえて、
（たぶん）ある程度、柔軟に対応してくれると思える環境なのがとてもありがたいです。


# 最後に
現在 EDOCODE では、エンジニア・デザイナー・プロダクトマネジャーを募集しています。
ご興味のある方は、[こちら](https://go.edocode.co.jp/jobs "こちら")の採用ページも是非ご覧ください。
Ｇ検定の受験体験記

# G検定を受けてみた！
少し前ですが、 **『G検定』** という試験を受けてみました。
個人的に面白かった試験なので、このページで紹介します！

このページに記載されている内容：
　(1) そもそも『G検定』って何？
　(2) 『G検定』の効率的な試験対策方法は？

# そもそも『G検定』って何？
『Ｇ検定』とは、[JDLA(一般社団法人 日本ディープラーニング協会)](https://www.jdla.org/)が実施する試験の一つです。(他には『E検定』という試験もあります)
 『Ｇ検定』の"Ｇ"はジェネラリスト(Generalist)の頭文字で、「AI(人工知能)」や「ディープラーニング」などに"一定水準の理解があるか"を問われる試験です。

## 『Ｇ検定』をお奨めしたい人
下記に該当する人はぜひ『Ｇ検定』の受験を考えてみてください。
- ***データサイエンティスト*** を目指してみたい人
- 人工知能、機械学習、データ分析などの ***データサイエンス*** に興味がある人
- 上記の知識でビジネスやプロジェクトを推進したい人
- 転職時やキャリアップする際のアピールポイントで使いたい人

## 『Ｇ検定』の概要
ポイントを下記に抜粋しますが、詳細については[JDLAの公表ページ](https://www.jdla.org/certificate/general/)を参照ください。
|項目|説明|
|:--:|:--:|
|受験資格|制限なし|
|実施概要|試験時間：120分<br>知識問題（多肢選択式・220問程度）<br>オンライン実施（自宅受験）|
|出題範囲|[シラバス](https://www.jdla.org/certificate/general/#)より出題|
|受験費用|一般：13,200円（税込）<br> 学生：5,500円（税込）|
|次回試験日|2023年3月3日(金)・2023年3月4日(土) |

## Ｇ検定の特徴
　(1) 受験資格に制限がなく、誰でも受験できます！
　(2) 問題数がとにかく多い！ (**120分で220問**)
　(3) オンライン実施で、自宅のPCから受験可能！

***【注意】***
　「自宅PCから受検」ならば楽勝では........と思いがちですが、 **とにかく問題数が多い** ので、「対策」が必要です！
　「 **120分で220問を回答** 」は言い換えると「 **1問を約30秒で回答** 」となります。回答時間がかなりタイトです。

# 『G検定』の効率的な試験対策方法は？
以下、私が受験した際の試験勉強内容や対策をお知らせしますので、参考にしてください。

### Step 1. まずは1冊テキストを読む
　私は下記のテキストを読みました。
　⇒[深層学習教科書 ディープラーニング G検定(ジェネラリスト)公式テキスト 第2版](https://www.amazon.co.jp/%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92%E6%95%99%E7%A7%91%E6%9B%B8-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-G%E6%A4%9C%E5%AE%9A-%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%AA%E3%82%B9%E3%83%88-%E5%85%AC%E5%BC%8F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88/dp/4798165948/ref=sr_1_1_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=39NS5AZ0UQEMW&keywords=g%E6%A4%9C%E5%AE%9A&qid=1670935312&sprefix=g%E6%A4%9C%E5%AE%9A%2Caps%2C175&sr=8-1-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUExTEpCNzE3RDlSRlhYJmVuY3J5cHRlZElkPUEwNzIzMzA2MTBBQU1KWkhaVEFSRSZlbmNyeXB0ZWRBZElkPUEyUkJTMEtDSVNTRU1KJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ==)

### Step 2. 問題演習
　Kindleで下記の指南書で過去数回分を参照し、問題演習しました。
　⇒[G検定 ～最短合格指南書～ Kindle版](https://www.amazon.co.jp/G%E6%A4%9C%E5%AE%9A-%EF%BD%9E%E6%9C%80%E7%9F%AD%E5%90%88%E6%A0%BC%E6%8C%87%E5%8D%97%E6%9B%B8%EF%BD%9E-yuki-ebook/dp/B07ZN2G8C1/ref=sr_1_11?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2EHPG88Z55FZB&keywords=G%E6%A4%9C%E5%AE%9A&qid=1670927395&sprefix=g%E6%A4%9C%E5%AE%9A%2Caps%2C224&sr=8-11)
　※上記の指南書は「Kindle Unlimited」で ***無料購読*** でき、重宝しました！:-p

### Step 3.　自分のレジュメを作成
　繰り返しとなりますが、**とにかく問題数が多い** です。
　試験中にテキストから探したり、インターネットで検索している時間はほとんどありません。
　"Step 1."や"Step 2."で気になった内容をレジュメのテキストファイルにまとめておき、試験中はそれから検索するのが良いかと思います。

### Step 4. 端末2台持ち
　私は試験時にPCを「２台」準備し、１台は「試験用」、もう１台は「検索用」として使いました。
　「検索用PC」では"Step 3."のレジュメや"Step 2."の文書からキーワード検索してました。
　(慣れの問題かもしれませんが、私は1つのPCで「試験」と「検索(レジュメ・Kindle)」をするには画面が狭かったです)

# まとめ
上記の情報を参考に、『G検定』を受験し、良き「データサイエンティストライフ」を始めてみてください！
更新したHelmが起動しない問題の解決法

## 結論

今後、`(require 'helm-config)`ではなくて`(require 'helm)`でrequireするようにしよう。

## 問題

2022/12/13 packages.el経由でもろもろのプラグインを一括更新したらhelmが起動しなくなった

## エラーメッセージ

以下のメッセージが残っていた。どうもhelm-configがないらしい。
```
Cannot open load file: No such file or directory, helm-config
```

## 環境

- macOS Monterey 12.5.1
- Emacs 27.2 (nix経由でインストールしたもの)
- leaf.elインストール済み

## 原因

たぶん[このコミット](https://github.com/emacs-helm/helm/commit/e81fbbc687705595ab65ae5cd3bdf93c17a90743)で`helm-config.el`が削除されたこと。  
`(require 'helm)`でよくなったらしい。

## 対応

```diff
(leaf helm
  :ensure t
-  :require helm-config
+  :require t
   :config
   (helm-mode 1)
   (global-set-key (kbd "C-x C-a") 'helm-mini)
   (global-set-key (kbd "C-c h") 'helm-command-prefix)
   (global-set-key (kbd "C-c o") 'helm-occur)
   (global-set-key (kbd "C-x C-f") 'helm-find-files)
   (global-set-key (kbd "M-x") 'helm-M-x)
   (global-unset-key (kbd "C-x c"))
   (helm-autoresize-mode t))
```
cv2.VideoWriter で作成した mp4 ファイルを jupyter notebook で見る方法

# 概要
表題の通りです。結論から言うと動画保存時のコーデック `VP90` を指定して `IPython.display.Video` を使うと見れます。

<details>
<summary>実行環境</summary>

- python: `3.7.3`
- jupyter: `1.0.0`
- ipython: `7.34.0`
- opencv-contrib-python-headless: `4.6.0.66`

</details>

# モチベーション
リモートサーバーで動画ファイルを生成した際に `scp` でローカルサーバーに落として確認していたが、サーバー上で作業を完結させたい。

# cv2.VideoWriter で作成した mp4 ファイルを jupyter notebook で見る方法
動画を保存するときのコーデックを `VP90` で指定します。
```python
import cv2

fourcc = cv2.VideoWriter_fourcc(*'VP90')
# save_path, fps, video_size は適当に指定する
writer = cv2.VideoWriter(save_path, fourcc, fps, video_size)
for im in ims:
    writer.write(im)
writer.release()
```

あとは notebook から見るだけです。
```python
from IPython.display import Video

Video(save_path)
```

# 備考
- コーデックを `mp4` にすると `IPython.display.Video` から見れないファイルが生成されます
    - コーデックが `mp4` のファイルは mac のプレビューなどからは普通に見れます
- **コーデックを `VP90` にすると動画を保存する時間が `mp4` に比べて10倍くらいになったので時間効率という意味では正直微妙かもしれないです**
    - そんなに急いでなくてサーバー上 (jupyter notebook) だけで操作を完結したい場合はいいかもしれないです

# 参考
- https://github.com/jupyter-widgets/ipywidgets/issues/2559
    - 本記事はほぼ上記記事の内容を日本語にしただけです
AWS Wickrってなんだ？

# はじめに

2022/7月にプレビュー版として公開されたAWS Wickrですが、
先日re;Inventで一般公開が発表されたので情報の整理をしてみました。

# どんなサービス？
一言でいうと、コミュニケーションサービスです。
1対1やグループでのメッセージやり取り、通話を暗号化し、セキュアにやり取りができます。

# どんな機能がある？
##### メッセージング
1対1またはグループでメッセージの送受信
メッセージとファイルの一定時間後削除
1ファイル最大5GBまでのファイル共有
最長1分間までの音声メッセージ送信

#### 通話
1対1またはグループでの通話
最大500人まで参加可能なプレゼンターモード
画面共有

#### セキュリティ
すべての機能においてAES-256を使用したエンドツーエンド暗号化

#### データ保持
米国の様々なリーガルホールドや監査、コンプライアンスを満たすことができるデータストアでのデータ保持

#### SSO
Active Directory (Okta および OpenID Connect (OIDC)) ベースのSSOサービスと連携し、使用が可能

...etc
メインどころの機能について記載しました。
すべて記載すると長くなるので以下ページご参照ください。

https://aws.amazon.com/jp/wickr/features/?refid=ft_card

# 注意点
作成できるリージョンは米国東部 (バージニア北部) のみ
AWS Organizations サービスの組織のすべてのメンバー アカウントで作成できる Wickr ネットワークは 1 つのみ
管理者もユーザとみなされる(1ユーザあたり料金発生)

# 料金は？
プランが3つありそれぞれで料金が異なります。
課金は一か月単位で、1ユーザ追加する毎に発生します。
プランごとに異なる点について記載します。

||3か月の無料トライアル|スタンダード|プレミアム|
|:--|:--|:--|:--|
月額|無料|5USD|15USD|
最大許容ユーザ数|30人|無制限|無制限
ファイル添付の最大サイズ|1GB|1GB|5GB
ファイルストレージ|制限付き|無制限|無制限
データ有効期限タイマー|最大30日|最大3か月|最大1年
SSO|不可|不可|可
データ保持|不可|付加|可
管理コントロール|ベーシック|強化版|無制限
返金制度付きSLA|なし|あり|あり

# 所感
ZoomやCISCO WebExでは多機能なウェビナープランがありますが、そんなに機能がいらない場合はこちらを使ったほうが安上がりだと思います。(構築する工数は除く)

メッセージの読み終わる時間を想定して、メッセージの最後に「なお、このテープ（またはレコード等）は自動的に消滅する。」みたいなスパイ大作戦のようなこともできるな...というしょうもない想像をしてしまいました。

# 参考
https://aws.amazon.com/jp/wickr/features/?refid=ft_card

https://aws.amazon.com/jp/wickr/pricing/

https://docs.aws.amazon.com/wickr/latest/adminguide/what-is-wickr.html
Salesforceの改行のまとめ

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


# フローでBR関数が使えない

+ [ToDoオブジェクトのコメント項目にフローを利用して改行を入れたい](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JfVmd)

出来たりできなかったり、よく分からん。

+ [Issue with Text Formula in Flow](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JfjZ8SAJ)

Task オブジェクトの標準の [説明] フィールドにデータを入力する場合、それはプレーン テキスト フィールドであるため、マークアップにデータが入力されます。フローを変更して、情報を表示するためにプレーン テキストのテキスト テンプレートを使用する必要があります。 

リッチ テキストで書式設定する場合は、Task オブジェクトにカスタム リッチ テキスト フィールドを作成する必要があります (オブジェクト マネージャーの Activity オブジェクトからこれを行う必要があります)。タスク ページのレイアウト。

# 2024年05ではBR関数は使えそう。

+ [画面フロー上でチェックした項目が何かによって、テキストテンプレートの値が変動するspring24でのアップデート機能を利用しておりますが空白行が出来てしまい、排除したいです。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ajWxN)

# プレーンテキストでの改行

+ [フローで複数レコードのテキストエリア項目を改行を維持した状態で変数に代入したい](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifq9l)

**画面フローでは以下の方法が使える**

テキストテンプレートに<br/>を設定しておきます。

https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A7VLMSA3

ループの中の割り当てで、テキスト変数に追加したい文字、その後に改行が入ったテキストテンプレートを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/85a02172-f248-acba-9f90-171183c8f207.png)

画面フローでは改行されて表示できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d5146deb-994d-7e69-2e2f-554bac64f72b.png)


**フローからのメールでは使えない**

フローのメールはプレーン テキスト メールなので、HTML メール として送ることで回避できるようなことも回答されていますね。

メールアラートのメールテンプレートを使うのかな？
[Google Business Profile APIs] accounts.locations.reportInsights → locations.getDailyMetricsTimeSeries移行時のタイムゾーンを調べる



## サポート終了と代替手段への移行

2022/02/20に、Google マイビジネス v4.9の[accounts.locations.reportInsights](https://developers.google.com/my-business/reference/rest/v4/accounts.locations/reportInsights)と[accounts.locations.localPosts.reportInsights](https://developers.google.com/my-business/reference/rest/v4/accounts.locations.localPosts/reportInsights)は廃止となるため、前者については、[Google Business Profile Performance API v1locations.getDailyMetricsTimeSeries](https://developers.google.com/my-business/reference/performance/rest/v1/locations/getDailyMetricsTimeSeries)で置き換える必要があります（後者は代替手段なし）。

accounts.locations.reportInsightsとaccounts.locations.localPosts.reportInsightsについては、時刻については  **RFC3339 UTC のZulu形式のタイムスタンプ** が用いられていますが、locations.getDailyMetricsTimeSeriesに関しては、公式サイトを見ると以下の記載があります。

> TimeOfDay
> 1 日のうちの時刻を表します。日付とタイムゾーンは意味を持たないか、他の場所で指定されています。

書き方が曖昧すぎて、どこのタイムゾーンを基準にしているのか、わからない。。
困りました。。

## 解決方法

自分は調査に半日強かかってしまいましたが、、

[サポート終了スケジュール | Google Business Profile APIs
](https://developers.google.com/my-business/content/sunset-dates)
を見ればわりと簡単なことで、accounts.locations.reportInsightsとlocations.getDailyMetricsTimeSeriesの対応する項目を任意の期間で取得して、比較すればよいだけのお話でした。

比較対象となるのは、以下3項目です。

|accounts.locations.reportInsights |locations.getDailyMetricsTimeSeries  | 意味 |
|---|---|---|
|ACTIONS_WEBSITE|WEBSITE_CLICKS   |ウェブサイトがクリックされた回数|
|ACTIONS_PHONE   |CALL_CLICKS|通話ボタンがクリックされた回数|
|ACTIONS_DRIVING_DIRECTIONS |BUSINESS_DIRECTION_REQUESTS |受信した予約の数|

accounts.locations.reportInsightsは時分秒まで、locations.getDailyMetricsTimeSeriesについては、日付を指定してAPIを叩き、前者の時刻指定をずらしながら、後者と上記3項目が一致する時刻を探します。

### accounts.locations.reportInsights
`https://mybusiness.googleapis.com/v4/{name=accounts/*}/locations:reportInsights`

#### 送信時に指定する項目（POST）
* locationName, 
* 開始日時、終了日時

### locations.getDailyMetricsTimeSeries

`https://businessprofileperformance.googleapis.com/v1/locations/12345:getDailyMetricsTimeSeries?dailyMetric=WEBSITE_CLICKS&dailyRange.start_date.year=2022&dailyRange.start_date.month=12&dailyRange.start_date.day=1&dailyRange.end_date.year=2022&dailyRange.end_date.month=12&dailyRange.end_date.day=1`

#### 送信時に指定する項目（GET）
* locationName
* dailyMetric
* 開始日、終了日

自分の使用環境の場合は、前者の前日15:00～当日15:00まで（例: 10/12 15:00 ～10/13 15:00）の値が、後者の当日（10/13）の値と一致していたため、タイムゾーンは日本ということになりました。

## 終わりに

Googleさん、書き方わかりにくすぎるやろ。。
せめてどうやったら基準となるタイムゾーンを確認できるか、書いてくれることを切に望みます。
Win11(Bitlocker)+Ubuntu22.04(LVM LUKS)デュアルブート環境構築メモ

　偉大なこちらのノートの内容が全て。あとちょっとだけBitlocker関連でエラーが出ないようにアレンジ。

https://gist.github.com/luispabon/db2c9e5f6cc73bb37812a19a40e137bc

1. RecoveryディスクからWin11をクリーンインストールする
1. Winを起動し、ディスクがBitlocker有効になっていたら無効にしておく
2. WinのディスクマネージャでWinの領域を小さくする
3. Ubuntuをインストールメディア（USB）から起動する
4. Try環境でgpartedを使ってWinのRecovery領域をWin領域の直後に移動する
5. そのままgpartedで空き領域にext4パーティションを2つ作成する（1000MiBと残り全部）
6. Try環境でターミナルを開き、コマンドを叩いて大きなほうの領域をLUKS領域にする 
7. インストールGUIを起動し、パーティションの設定で1000MiBのほうを /boot に 残りを / に割り当てる（タイプはext4）
8. 他は元ドキュメントの5からの記述と一緒
9. インストール完了後にGUIに残って、initramfsの設定をする必要があるのを忘れないように
9. Ubuntu側を起動。grubの設定を修正し、Winが自動で起動するようにする（update-grubを忘れないように）
9. Win側を起動。Bitlockerを再度有効にする

2023.01.09 **追記**
　初出時は/boot領域は550MiBにしていたのですが、これだと容量が足りなくてカーネルアップデートできない場合があったので、1000MiBに拡張しました。

　実際に作ったのがこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35648/a6054b18-4da3-0609-53f1-bf9641e0094d.png)
　/dev/nvme0n1p{1-4}がWindowsによって作成された領域。
　/dev/nvme0n1p4は最初はディスクの一番後ろに配置されていたけど、5の手順で前のほうに移動した。

　7のコマンドは、
```shell
$ sudo cryptsetup luksFormat /dev/nvme0n1p6
$ sudo cryptsetup luksOpen /dev/nvme0n1p6 cryptdrive
$ sudo pvcreate /dev/mapper/cryptdrive
$ sudo vgcreate vglinux /dev/mapper/cryptdrive
$ sudo lvcreate -n root -l 100$FREE vglinux
```

　8のインストールGUI内では、
- /dev/mapper/vglinux-root を ext4 で / に
- /dev/nvme0n1p5 を ext4 で /boot に

　指定する。
　また、 /dev/nvme0n1 を Boot drive として指定する。

　10の手順でインストールGUIが最後まで行っても、そのまま再起動をしてはいけなくて、Try環境に戻ってターミナルを開いて以下のコマンドを叩く必要がある。

　まずは、作成したLUKS領域のUUIDを調べる。
```shell
$ sudo blkid /dev/nvme0n1p6
```

　そして、

```shell
$ sudo mount /dev/mapper/vglinux-root /mnt
$ sudo mount /dev/nvme0n1p5 /mnt/boot
$ sudo mount --bind /dev /mnt/dev
$ sudo chroot /mnt
$ mount -t proc proc /proc
$ mount -t sysfs sys /sys
$ mount -t devpts devpts /dev/pts
```

 これをした上で、

```shell
$ sudo nano /etc/crypttab
```

　で開いたファイルに
```
 cryptdrive UUID=(さっき調べたUUID) none luks,tries=0,discard,loud
```

と記述して、

```shell
$ update-initramfs -k all -c
```

でinitramfsを作成。ここまでできたら再起動。起動時にLUKSのパスワードを聞かれるようになる。

　11でUbuntuに戻ってきたら、何もしてないときはWindowsで起動してきて欲しいのでgrubを修正。

```shell
$ sudo nano /etc/default/grub
```

以下のように、6行目（GRUB_DEFAULT）を2（番目）のWindowsに。8行目（GRUB_TIMEOUT）を2（秒）にして、OS選択画面で2秒間何もしなかったらメニュー2番目のWindowsで自動的に起動されるようにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35648/10d913e3-5d84-2f15-9f6e-5e02360cb0df.png)

記述を保存したら

```shell
$ sudo update-grub
```

これで設定が反映される。

　以上でUbuntu側の設定が終わったら、再起動してWindowsに入り、Bitlockerを再度有効化する。ディスク全体ではなく、使用している領域だけに適用されるようにする。

　これで完成。
レガシーあるある（？）3つ言いたい

# 1.はじめに

[「レガシー」を保守したり、刷新したりするにあたり得られた知見・ノウハウ・苦労話 by Works Human Intelligence Advent Calendar 2022](https://qiita.com/advent-calendar/2022/works-hi-3) に参加しています。
本記事は16日目の記事となります。

「あるあるを言う+自分なりの対策方法」をまとめました。

**「こういう環境のエンジニアがいるんだな～」** と読んでいただけると幸いです。

※タイトルは某芸人さんのネタを参考にしております。


# 2.環境

VBScriptを利用しています。（2005年時点でほとんど使われていないらしいです:sweat_smile:）

▼VBScript

https://ja.wikipedia.org/wiki/VBScript


# 3.レガシーあるある

## (1)検索結果が少ない

入社前はRubyを学習しており、エラーの際は`「Ruby + 〇〇（エラーの内容）」`などで検索をしていました。

検索を行うと該当の記事が大体見つかる印象だったのですが、現在（VBScript）は件数そのものが少ないように感じています。（なので、アウトプットされている記事を見かけるととてもありがたいです。）

2000年前半の記事で、「現在はその技術が使用されていない」ということもあります。

:::note warn
対策
①Microsoftのドキュメントを参考にする
　更新日時も比較的新しく、参考になるので読んでいます。
②検索の仕方を聞く
　先輩や上司にどのように調べているかを聞き、おすすめのサイトやキーワードを聞くようにしています。
:::

▼Microsoftのドキュメント

https://learn.microsoft.com/ja-jp/docs/

▼よく見るサイト（VBScriptやASPを触る方向け）

http://asp.style-mods.net/

## (2)バージョン管理でGitを使用しない

別チームではGitを採用していますが、自分のチームではGitを採用していません。

「TortoiseSVN」を使用しています。（SVN→「SubVersioN」の略です。）

▼TortoiseSVN公式

https://tortoisesvn.net/

▼学習で使用したサイト

https://tracpath.com/bootcamp/learning_tortoisesvn.html

入社前はGitを学習しており、SVNは無知の状態からのスタートでした。公式のドキュメントや上記のサイト、先輩からも教えて頂き現在は一通りの操作ができています。

Gitを学習していて良かったことは、「コンフリクト」「マージ」などのイメージが掴めることです。

バージョン管理の運用を変えるには上層部を説得して云々があるので現状難しそうです…。

個人でのレベルを上げていきたいと思います。

:::note warn
対策
①SVNを使いこなす
②Gitなどの他のバージョン管理についても学習を行う（バージョン管理の理解を深める）
:::

## (3)教材が少ない

書籍やUdemyを探したところ、Udemyは1つ（英語版）、書籍も古いものばかり…といった状態でした。
現在は会社の書籍を借りながら学習しています。古かったり非推奨の技術がある際は、代替や後継の技術に置き換えながら学習をしています。

:::note warn
対策
①実務のコードを教材にする。実装の仕方を学ぶ
②何かを作ってアウトプットする
:::


# 4.これからやっていきたいこと

## (1)リファクタリング

If文の階層が深かったりルールがバラバラになっているコードなど、「リファクタリングが必要そう」なコードを見かけることがあります。

「これからの部分は最小限に、これまでの部分は少しでも見やすく」を意識して行っていきたいと思います。

## (2)ドキュメントの整備

環境構築などの手順書はありますが、現在は行っていないことが記載されていたりと変更点に対応できていないところがあります。
実際に使ってみて気になる箇所もあったため、積極的に整えていきたいと思います。

# 5.最後に

あるあると言いながらも、あるあるになっていなかったかもしれません。
何かありましたら、ご意見やご感想をいただけると幸いです。

読んでいただきありがとうございました。
MATLABで単相全波整流回路をシミュレーションする

始めまして。Blitz1127です。

電力系のシステムは立派な教科書はあるけど、あまりシミュレーションされてないと感じています。今回は、MATLABを用いて単相全波整流回路の動作をシミュレーションします。

# 単相全波整流回路とは

全波整流回路はACからDCに変換する回路です。安価なACアダプタなどでは、このような回路が活用されています。効率や電源品質といったところでは優れた回路というわけではないのですが、安価に製造できるといったところからよく活用されています。

# 単相全波整流回路の電気回路

図1のとおり、単相交流回路に対して、ダイオードが４つ並べられた回路になります。ダイオードを通過した後は、負荷（抵抗にて模擬）が接続されています。図中では、途中にコンデンサが負荷と並列接続されていますが、このコンデンサについては別途説明します。

![single_phase_full_bridge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3035813/a15b0f7b-0a8c-293f-2abb-4f9da7380998.png)
図1　単相全波整流回路構成


# 回路特性
教科書に書いてある特性を以下の表1に示します。

表１　全波整流回路の入出力波形
![single_phase_full_bridge_waveform_table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3035813/19d7bf97-ed22-6b85-498d-0a910b813d0c.png)

入力波形は交流電源となりますので、正弦波となります。
出力波形について、電流の流れ方は以下の２つのモードがあります。（図2参照）
a)モード１　0 < t < T/2　のとき
　図中の左上のダイオードと右下のダイオードが使用されるモードです。入力正弦波の正の値が負荷に出力されます。
b)モード２　T/2 < t < T　のとき
　図中の右上のダイオードと左下のダイオードが使用されるモードです。入力正弦波が反転されます。そのため、入力正弦波の負の値が反転し、負荷に出力されます。

これらのモード1,2を組み合わせると表1左下のような波形になります。
この波形だとあまり美しくないので、コンデンサで電圧が変動しているのを綺麗にします。その結果が表1右下のような波形です。

![single_phase_full_bridge_current.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3035813/1303b6ea-9e1e-d01f-f053-44f3dc017b31.png)
図2　全波整流回路の電流経路

# MATLABでの解析条件
それでは、MATLABで解析してみましょう。解析回路は図3の通りです。コンデンサは容量を変更するようにします。回路パラメータは表2の通りとします。

![single_phase_full_bridge_MATLAB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3035813/d7be523d-b0d7-d429-a403-c0d9ef107288.png)
図3　MATLABでの解析回路

表2　回路パラメータ

|電源|100Vrms |
|-|-|
|ダイオード|オン抵抗 1mΩ <br>電圧降下 0.8V  <br>スナバ抵抗 500Ω <br>スナバコンデンサ 250nF|
|コンデンサ|1mF|
|抵抗|1kΩ|

# MATLABでの解析結果
図4,5にMATLABでの解析結果を示します。
上がコンデンサなしの場合、下がコンデンサ有りの場合です。
コンデンサなしの場合、正弦波の絶対値のような波形が得られています。オン抵抗・電圧降下・スナバの影響などにより、ピーク電圧やモード切替時の電圧などが正弦波の絶対値の値と異なっています。
コンデンサありの場合、正弦波のピークあたりで電圧が推移していることがわかるかと思います。これが、平滑コンデンサの効果になります。

![single_phase_full_bridge_waveform_mat_noC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3035813/34ccf79a-22cd-1b7c-b5bc-bbb4a4be2d89.png)
図4　全波整流回路の出力波形（平滑用コンデンサなし）

![single_phase_full_bridge_waveform_mat_C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3035813/7b7ae0f4-30da-bf2e-c59f-84e084c16dbc.png)
図5　全波整流回路の出力波形（平滑用コンデンサあり）

# まとめ
本記事では、単相全波整流回路の基本とMATLABでの解析を紹介しました。波形の簡単な紹介のみだったので、もう少し詳細な解析も実施していきたいと思います。
RelayStyleページネーションをPrismaで実装する

[Next.js + サーバーサイドTypeScript + 関数フレーバーでクリーンなアプリを作ったので実装意図とか書く Advent Calendar 2022](https://qiita.com/advent-calendar/2022/shwld)
の**14日目**。[株式会社mofmof](https://www.mof-mof.co.jp/)に生息している[shwld](https://twitter.com/shwld)です。

前日は[GraphQLリゾルバのディレクトリの構造](https://qiita.com/shwld/items/e1b2c7c8440c3048269f)について書きました
# RelayStyleページネーションをPrismaで実装する
GraphQLでページネーションを実装する際の選択肢の一つとしてRelay Styleにするというものがあります。
Metaの[RelayというGraphQLクライアントが定めている仕様](https://relay.dev/graphql/connections.htm)で、これに合わせることでRelay Styleに対応したクライアントでページネーションの実装が楽になるので、これを採用しました。

自前で実装するのは大変なのかなと思ったのですが、[graphql-relay](https://www.npmjs.com/package/graphql-relay)の中に便利メソッドが生えていたので、割と簡単に実装できました。

利用するメソッドは以下です。

```ts
import { connectionFromArraySlice, cursorToOffset } from 'graphql-relay';
```

`connectionFromArraySlice`は、スライスされた配列に開始位置と件数を渡すことで、仕様にあったconnectionを作ってくれます。簡単。
ちなみに`connectionFromArray`というメソッドもあり、こちらはスライスされる前の長い配列の中から開始位置、件数で該当の配列を切り出してconnectionを作ってくれるメソッドです。

今回はPrisma側で切り出し（カーソルいちから件数分の抽出）を行うため前者の`connectionFromArraySlice`を使います。
といっても難しいことはなく、以下の流れでできます。

1. 受け取ったカーソル(connectionの`after`引数)をSQLの`offset`に変換する
1. 受け取った件数(connectionの`first`引数)をSQLの`take`に変換する
1. Prismaの`aggregate`で件数を取得する
1. Prismaの`findMany`に`offset`, `take`を渡して結果を取得する
1. 結果と取得件数を、`connectionFromArraySlice`でconnectionに変換する

書いてて気づきましたが、この記事で扱う内容では、firstとafter以外のargumentに対応してないです。

```ts
import { connectionFromArraySlice, cursorToOffset } from 'graphql-relay';
import type { ConnectionArguments } from 'graphql-relay';

args: ConnectionArguments

const take = args.first
const skip = cursorToOffset(args.after)
const accounts = await db.account.findMany({ skip, take })
const totalCount = await db.account.aggregate({ _count: true });

const relayConnection = connectionFromArraySlice(accounts, args, {
  sliceStart: skip,
  arrayLength: totalCount._count,
});
```

できました。

参考コード: [/use-cases/graphql-resolvers/src/shared/helpers/connection-helpers.ts](https://github.com/shwld/uzumaki/blob/advent-calendar/use-cases/graphql-resolvers/src/shared/helpers/connection-helpers.ts)
# 次回予告
明日は[Turborepo使ってみた](https://qiita.com/shwld/items/d48791a4f1305d8b373c)について書きます。
Gemのインストール方法いろいろ

通常とは違うGemの読み込み方法を3つほどまとめました。

1.ブランチ指定してGemを読み込む方法
2.プライベートリポジトリにしているGemの読み込み方法
3.ローカルのGemを読み込む方法

の3つです。

## 1.ブランチ指定してGemを読み込む方法

```ruby
gem 'gem名', git: 'gitのパス', branch: 'ブランチ名'
```

## 2.プライベートリポジトリにしているGemの読み込み方法

### ①GitHubでpersonal access tokenを取得する。
### ②それを環境変数に設定する
.envに記述。もしくはLinuxの環境変数に直接設定。

```ruby
GIT_ACCESS_TOKEN="発行されたトークン"
```
### ③Gemfileのgemのインストール先をプライベートgemにする。

```ruby
gem 'gem名', git: "gemのパス"
```

### ④以下のコマンドでbundle installを実行する。

```bash
BUNDLE_GITHUB__COM=$GIT_ACCESS_TOKEN:x-oauth-basic bundle install
```

## 3.ローカルのGemを読み込む方法

### ①以下のようにGemfileに記述

```ruby
gem 'gem名', path: 'ローカルgemのパス'
```
### ②インストール
```bash
bundle install
```
slickでアルペジエーター作ってみた

slickを使って画像をスライダーとして動かしていた時、ふと思いつきました。画像にあたる部分を音声ファイルに置き換えれば一定の間隔で音が変わってアルペジエーターのようなものが作れるのではないかと。

# 制作過程
まず、単純にスライダー内の画像ファイルの部分にそのままwavファイルを入れてみました。しかし、思い通りにいかなかったため違う方法を考えました。
次の方法として、li要素の属性tabindexの値を監視して、各liの変化に応じて音声のミュートとミュートの解除を行う方法を考えました。現在制作中です。


# おまけ
ついでにスライダーを使ってさいころを作ってみました。
slickでautoplay,infiniteを適用し、autoplaySpeedとspeedの値を上げることで、目視できない速さで画像が切り替わります。
スライダーの要素上にマウスを置くと画像が止まるので簡単に使用できます。何か違うものも作れるかもしれません。

```
$('.slider').slick({
    slidesToShow: 1,
    slidesToScroll: 1,
    infinite: true,
    autoplay: true,
    arrow: false,
    prevArrow: NamedNodeMap,
    nextArrow: NamedNodeMap,
    autoplaySpeed: 1,
    speed: 5,
});
```
ページネーションのサンプル(PHP)

ページネーションのサンプルプログラム(PHP)を実装しました。

```PHP
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>TEST18</title>
</head>
<body>
<?php
  define('MAX',3); // 1ページの表示数
 
  $customers = array( // 表示データの配列
          array('name' => '秋元真夏', 'age' => '29'),
          array('name' => '小川彩', 'age' => '15'),
          array('name' => '小坂菜緒', 'age' => '20'),
          array('name' => '佐藤楓', 'age' => '25'),
          array('name' => '白石麻衣', 'age' => '30'),
          array('name' => '新内眞衣', 'age' => '35'),
          array('name' => '設楽統', 'age' => '40'),
            );
            
  $customers_num = count($customers); // トータルデータ件数
 
  $max_page = ceil($customers_num / MAX); // トータルページ数 ceilは数値を切り上げる関数
  

  // データ表示、ページネーションを実装
  if(!isset($_GET['page_id'])){
    $now = 1;
  } else {
    $now = $_GET['page_id'];
  }

  // 配列の何番目から取得すればよいか
  $start_no = ($now - 1) * MAX;
  

  // array_slice(配列の何番目から何番目までを切り取る関数)
  $disp_data = array_slice($customers,$start_no,MAX,true);

  // データ表示
  foreach($disp_data as $val){
    echo $val['name']. ' '.$val['age'] . '<br />';
  }

  for($j=1;$j <= $max_page;$j++){
    if ($j == $now){
      echo $now . ' ';
    } else {
      echo "<a href='/PHP_learn/work18.php?page_id=$j'" . '>' . $j . '</a>' . ' ';
    }  
  }
  
?>

</body>
</html>

```

意外とすぐにページネーション処理が実装できました。
STM32H743とSSD1306でデモ(Adafruit SSD1306,Adafruit GFX)


x ライブラリのインストール方法は、めんどいので省略
x I2CのIDアドレスは、3Dから3Cに変更した。
x サイズは、約??KB

x OLED096UNO-Aです。
x NUCLEO-H743ZI2

目的
OLEDのテスト

変更箇所


```c++


#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32



```


![o_cop245.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8be30644-a0af-64c9-7761-4f9ec1cee05b.jpeg)



![o_con782.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/909ad373-5dde-54a3-e233-4b9d8b63f1a5.jpeg)
クラスかオブジェクトかそれが問題だ - 良いクラスに関する考察 -

## 概要
オブジェクト指向プログラミングにおいてクラスはオブジェクトを作成するための設計図とよく言われます。
良いクラスは良い設計図ということになりますが、良いクラスはどんなクラスでしょうか？
本記事では例題からクラス図とサンプルコードを作成して、より実践的に良いクラスに関する考察をしていきます。
前回は[クラスに責務を与える](https://qiita.com/masaki_nakada_ari/items/af93dc8a44d06204d8e6)を紹介しました。

今回は「クラスかオブジェクトかそれが問題だ」について考えてみます。
クラスを抽出する時はクラスなのかオブジェクトなのかを判断することはとても重要です。
オブジェクトはクラスをnewした実体です。
本来オブジェクトで良いものまでクラスとして定義すると関連が複雑になってしまったり、
無駄なコードを沢山書くことになります。

# 例題
現在、社内には部と課があります。部には複数の課があります。
社内の部と課を階層構造で管理するためにクラスを抽出してください。

# とりあえずクラスとして抽出する
例題から部と課をそれぞれクラスとして抽出して関連を付けます。

## 概念クラス図
概念クラス図のため、属性やメソッドは省略しています。
何をクラスとして定義していて、関連（矢印）や多重度に注目してください。

``` plantuml
部 -right-> "0..*" 課
```
表現はできていますが、係が追加になった場合...

``` plantuml
部 -right-> "0..*" 課
課 -right-> "0..*" 係
```
表現はできていますが、グループが追加になった場合...

``` plantuml
部 -right-> "0..*" 課
課 -right-> "0..*" 係
係 -right-> "0..*" グループ
```
扱う階層が増える度にクラスを追加しなければなりません。
また部と課の間に階層構造を追加したい場合はクラスの関連を見直す必要があります。

::: note warn
とりあえずクラスとして抽出すると追加や変更があった時の影響度が大きいです。
:::

# クラスとオブジェクトを見極める
部と課をクラスとして抽出すると、あまり良くない結果になることがわかりました。
このような場合、部や課をもう少し汎化したものをクラスにすると上手くいきます。
ここでは部と課をまとめたクラスを「組織階層」と定義します。

## 概念クラス図
概念クラス図は以下になります。

``` plantuml
組織階層 -up-> "0..*" 組織階層
```

::: note info
再帰的なデータ構造にするのがポイントです。
:::

## オブジェクト図
具体的なオブジェクトの関連をオブジェクト図で見てみましょう。

``` plantuml
object "情報システム部 : 組織階層" as 情報システム部
object "開発課 : 組織階層" as 開発課
object "運用課 : 組織階層" as 運用課
object "開発1係 : 組織階層" as 開発1係
object "開発2係 : 組織階層" as 開発2係
object "運用1係 : 組織階層" as 運用1係

情報システム部 -- 開発課
情報システム部 -- 運用課
開発課 -- 開発1係
開発課 -- 開発2係
運用課 -- 運用1係
```

オブジェクト図でも階層構造が表現できていることが確認できます。

::: note info
オブジェクト図を使用することはクラス図が正しく表現できているかを確認するために有効です。
:::

## 実装クラス図
概念クラスをよりサンプルコードに近いクラス図で記述します。

``` plantuml
class OrganizationHierarchy
{
    + Code : string
    + Name : string
    + ParentCode : string
    + ChildList : List<OrganizationHierarchy>
    + IsRoot() : bool
}

OrganizationHierarchy -up-> "0..*" OrganizationHierarchy
```

ChildListとしてOrganizationHierarchyをリスト（配列）で保持できるようにします。

## サンプルコード（C#）
実装クラス図からサンプルコードを作成します。
今回のサンプルコードではクラスの使用例は省略します。

``` OrganizationHierarchy.cs
public class OrganizationHierarchy
{
    public OrganizationHierarchy()
    {
        ChildList = new List<OrganizationHierarchy>();
    }

    public string Code { get; set; }
    public string Name { get; set; }
    public string ParentCode { get; set; }
    public List<OrganizationHierarchy> ClildList { get; set; }

    public bool IsRoot()
    {
        return string.IsNullOrEmpty(ParentCode);
    }
}
```

大きな組織になると数千件のデータになることもあり、数千件のクラスを作成するのは現実的ではありません。
クラスとオブジェクトを見極めることは実装をシンプルにし、ソースコードの削減にもなります。

## まとめ
今回は「クラスかオブジェクトかそれが問題だ」について考えてみました。
同じようなクラス定義を何度も記述しなければならない、クラスのオブジェクトが1つしかない場合は
オブジェクトで良いものをクラス定義しているかもしれません。

::: note warn
クラスを抽出する時はクラスかオブジェクトかをよく考えてみましょう。
それがオブジェクトならわざわざクラス定義する必要はない。
:::

最後まで読んでいただきありがとうございます。
CTO興味ある人へ：CTOの業務についてその５　チームビルディングまとめ

CTOを長年やってるとよく聞かれる質問です。
```
CTOの仕事ってどんな仕事があるんですか？
```
から始まった**CTOの業務について**のその５です。

# チームビルディング
チームビルディングのまとめです。

エンジニアを採用した時から退職に至るまでをCTOが考えるのは当然ながら、一人ひとりをまとめたあげた上で組織にマッチングさせる事がチームビルディングです。そのため、一ヶ月とか半年で成果が出来るものではありません。子供の成長を楽しみにする様に、組織の成長、エンジニア一人ずつの成長を考えます。
今で満足しては駄目です。必ず１，２年後に問題に直面します。
## マネージャー職の配置と育成
コミュニケーションが高い有望なエンジニアが居たら、来期からマネージャーをやってもらう事にします。その時に２，３年後と考えて、そのマネージャーには、次のマネージャー候補、右腕エンジニアを想定してもらいます。
何故なら、組織構成を考えた時に、一人のマネージャーには、５人から１０人のメンバーが適切です。１０人を超えると見きれないためです。ビギナーマネージャーには３人程度が良いかもしれません。
且つ、ベンチャー企業は基本的に拡大を目指しています。エンジニア組織も拡大させていくためには、マネージャーを増やすことがマスト条件になります。このため、現構成からの次のマネージャー候補を常に育成していく事が必要です。これを新人マネージャーにもタスクとして依頼します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/ec790293-49b6-e9fd-9a87-eb95257be69d.png)
もし、これをやってなかったら、あたなのマネージャーに明日からでも依頼しましょう。
そして同時に、育成が間に合わなかったり、違った場合に備えて外部から入ってもらう事も想定しておきます。マネジメント層の採用には、１年くらい掛かります。
## シャッフル人事
優秀なマネージャーなのに、なかなかマネージャー候補を排出出来ないマネージャーがいます。マネージャーが出来すぎるために下が育ってない可能性があります。組織が長く同じメンバー構成の場合は、ノウハウが頭の中に入ってしまってタコツボ化している可能背もあります。こいういう時は、無理やりですが、優秀なマネージャーを外して、小さい若手中心の組織を担当してもらって、その組織から新しいマネージャーに上がってもらいます。パフォーマンスは一時期落ちますが、長い目で見れば総合力は高まります。反対意見も沢山でますが、CTOとしておおなたをふるいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/ec636cf5-4902-b773-94fa-e95a894bad64.png)
## 自分の右腕探し
前述から出てきている通り、長い目でマネジャーを育てるのですが、自分の右腕探しもCTOとして重要なタスクです。内部からアサイン出来れば良いですが、可能性が低いです。何故なら、既に採用した人達は、過去の自分が採用出来た人達です。これから組織をもっと成長させるためには、より優秀な右腕が必要となります。もしかしたら自分よりも優秀な右腕が必要です。この人材が中から出てくる確率は低いです。そして、右腕探しは時間がかかります。探すのも大変だし、口説いて入社してもらうのも時間が掛かるし難しいです。２，３年先を見据えて戦略的な動きが必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/6aaeb5f4-f967-69a0-ca18-0744bfc08c25.png)

# まとめ
チームビルディングでは、２，３年先を見据えて、将来のボトルネックポイントをなくす動きを先手先手で取っていきましょう。大きなプロジェクト管理だと思えば良いと思います。WBSに落として、ボトルネックを解消しながら、時にはクリティカルパスを短縮させながら、業績と業界の速度と調整させる事が必要です。

ひき続き記事を書いていきますので、フォロー、イイねお願いします！

# シリーズ記事まとめ
CTO興味ある人へ：CTOの業務についてその１　会社組織内での話
https://qiita.com/k1morikawa@github/items/5e9022a99a51d9a57576
CTO興味ある人へ：CTOの業務についてその２　チームビルディング/採用
https://qiita.com/k1morikawa@github/items/b2b3fb2246bd0984bab1
CTO興味ある人へ：CTOの業務についてその３　チームビルディング/評価制度
https://qiita.com/k1morikawa@github/items/edb2e3c20ce02a201eec
CTO興味ある人へ：CTOの業務についてその４　チームビルディング/キャリア戦略
https://qiita.com/k1morikawa@github/items/9a6573dbba510c699362
ROSのrosbagファイルをROS2に変換する

# はじめに

ROS1で取得されたrosbagファイル(.bag)をROS2のrosbagファイルに変換したいと思っていたところ、rosbagsというPythonパッケージを教えていただいたので試してみた。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">rosbagsというのを使えばいいらしい <a href="https://t.co/eO8HpPjWCL">https://t.co/eO8HpPjWCL</a></p>&mdash; porizou (@porizou1) <a href="https://twitter.com/porizou1/status/1602266851358420992?ref_src=twsrc%5Etfw">December 12, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


https://github.com/rpng/rosbags


# インストール

```bash
pip install rosbags
```


# 実行

今回テスト用にcartographerの2D backpack demoのrosbagファイルを使用、以下でダウンロード

```bash
wget https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/cartographer_paper_deutsches_museum.bag
```

.bagファイルをROS2のrosbag形式に変換する
　
```bash
rosbags-convert cartographer_paper_deutsches_museum.bag
```

rosbags-convertコマンドがないと言われたら`.bashrc`に以下を追加

```.bashrc
export PATH=$PATH:~/.local/bin
```

変換が終わるまで待つと.bagと同じ名前のディレクトリが作られる。


```bash
cartographer_paper_deutsches_museum
├── cartographer_paper_deutsches_museum.db3
└── metadata.yaml
```

ROS2で再生して見る

```bash
ros2 bag play cartographer_paper_deutsches_museum
```

Topic一覧を見ると変換前のトピックが全てあることが分かる

```bash
$ ros2 topic list
/events/read_split
/horizontal_laser_2d
/imu
/parameter_events
/rosout
/vertical_laser_2d
```

cartographerデモを実行、正常にマップが作成することができた。


![rviz_screenshot_2022_12_12-22_33_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399606/91a75278-da50-dcf2-6804-1392726e01cf.png)

```bash
ros2 launch  cartographer_ros demo_backpack_2d.launch.py bag_filename:=cartographer_paper_deutsches_museum
```





# 参考



https://ternaris.gitlab.io/rosbags/


https://pypi.org/project/rosbags/
【コピペOK】スプレッドシートで作成したグラフをGASでSlackに流す方法

# はじめに
GASを使ってslackに流すことはできても、スプレッドシートで作成したグラフってどうやって流すのってなったことありませんか？？

今回はそういった方に向けて、その実装方法を伝授します！

# グラフのimageを取得する方法
① スプレッドシートで作成したグラフの右上の3点リーダーをクリック→グラフを公開

![スクリーンショット 2022-12-14 6.05.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/d20afc00-ec5e-d357-26d1-ae196a26044b.png)

② 埋め込む→画像を選択
![スクリーンショット 2022-12-14 6.05.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/812109a7-997f-ffec-8a43-5b772971e7fa.png)

③ 画像のリンクを取得！
以下の水色部分をコピーしてください！
![スクリーンショット 2022-12-14 6.06.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/e92ecacc-e745-c743-3370-176923a6c67c.png)



# 実際のコード
```js:
function graph_notifyToSlack() {
 // スプレッドシートの情報を変数に取得
  var ss = SpreadsheetApp.openById("スプレッドシートのid");
  var sheet_charts = ss.getSheetByName("シート名");

  var postUrl = 'slackのwebhook';
var message = `任意のメッセージ`;
  var jsonData =
  {
    "username" : "slackの名前",
    "icon_emoji": ":fire:",
    "text" : message,
    "attachments" : [{
      "fields": [
        {
          "title": "グラフの名前(任意）",
          "value": "graph.png",
        }
      ],
      "image_url":"先ほど取得したグラフの写真リンク" 
    }]
  };

  
  var payload = JSON.stringify(jsonData);

  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };

  UrlFetchApp.fetch(postUrl, options);
}
```

これで完成！

# 最後に
いかがでしたでしょうか？
不明点や誤植などありましたらコメントにて教えていただけますと幸いです
5G登録シーケンス

ローカル5G等で盛り上がりを見せる5Gのデータ通信が始まるまでのシーケンスを調べてみました。

# サマリー
OMNI(Open mobile network infra)という勉強会の記事を見ればOK。
https://omni-jp.github.io/events/002/
free5GCのSignallingをend-to-endで解析してみた
by Muneaki Ogawa資料1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/5e98afef-a1ca-bed1-27be-462359e2a24e.png)


# 以下詳細-------

## まず4Gの振り返り
4Gのシーケンスはauの障害の時に下記にまとめました。黄色に長い棒のEPC Attachの部分がデータ通信を始めるまでの、認証・位置登録・セッション確立のシーケンスです。
https://qiita.com/nekokane/items/1ffe057d3ef342181b54

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/db1f69d4-fd8f-a4da-e752-5934ef4d33c0.png)

## 5Gのアーキテクチャとシーケンス
OMNI(Open mobile network infra)という勉強会でいい発表がありましたので、引用させていただきます。
https://omni-jp.github.io/events/002/
free5GCのSignallingをend-to-endで解析してみた 
by Muneaki Ogawa資料1

Ogawaさんは、AWS上に基地居シミュレータと、5GCを構築したようです。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/0afc8763-15a9-69af-09ea-749f2363bd6e.png)

最大構成だと、5GCは下記になるようです。白塗りの箱が必須のようなので、まずは白塗りの箱から見ておけば良さそう。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/0eab4857-c680-2c91-ce6f-cfef7c406934.png)

4GのAttachは、5Gでは、Registrationに名前が変わったようです。
POST、GET等、HTTP感のあるREST APIになっています。
詳細を知りたければ、TS 29.503を見れば良さそうです。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/217f2a64-3eb8-ca96-cd9e-f3add8ed1c1e.png)

4G(EPS Attach)と5G(Registration)の比較をしてくれているのがありがたい。
UE-MME間の信号が若干変わったようです。
Attach、
Auth、
Sec Mode
位置登録(ULR/ULA)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/5e98afef-a1ca-bed1-27be-462359e2a24e.png)

EPS NASと5GS NASのマッピングありがたや。
しいて言えば、網内のEPC Diameterと、5GC APIのマッピングも欲しい。
（後で自分で作ろう）
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/d8d9c89f-50fa-27cd-7e48-324974b0cf81.png)
2022年登壇イベント振り返り

### ■はじめに
こんにちは。澁谷です。北海道の自動車部品製造会社でRPAツール（WinActor）とAI-OCR（DX Suite）を使用して社内業務の自動化を推進しています。2019年3月国内唯一のRPA資格「WinActorRPA認定技術者エキスパート」を取得。さらに2020年12月第1期「NTTデータ認定 WinActorアンバサダー」、2021年12月には2年連続で第2期の任命を受け精力的に活動中です。

RPA（ロボティック・プロセス・オートメーション） Advent Calendar 2022
に参加しています！
https://qiita.com/advent-calendar/2022/robotic_process_automation

### ■この記事は
2022年の登壇実績をまとめました。
それぞれの意味は以下です。
LT登壇：ライトニングトーク（短いプレゼン）での登壇
主催登壇：イベント主催者として司会及び登壇
講演：セミナー、パネルディスカッションなどの長時間の登壇

2022/12/2　WinActorは止まらない～止まらないシナリオ作りのコツ～　主催登壇
2022/11/10　北海道ビジネスEXPO　講演
2022/10/26　【WinActor】みんなで学ぼう！新たなブラウザ拡張機能　主催登壇
2022/10/17　WinActorのAPI連携を徹底的に学ぶ　主催登壇
2022/10/13～14　Success Story Tour in WinActor Lounge'22　講演
2022/9/9　AI inside Academy LT大会vol.1　LT登壇
2022/8/24　モブ＆ジムからWinActorトップエンジニアへ！～橋本名人の弟子が登壇～　主催登壇
2022/7/29　RPA Partner Conference 2022 講演
2022/7/29　オフラインよりも学べるオンライン教室！～WinActor夏の課外授業～　主催登壇
2022/7/26　WinActor特別編！さようなら Ver.6 こんにちは Ver.7　主催登壇
2022/6/25　Open Source Conference 2022 Online Hokkaido　講演2022/6/24　RPA勉強会WinActor Talk　主催登壇
2022/6/3　RPA勉強会WinActor Talk　主催登壇
2022/5/29　【DX初心者スナック番外編】RPAの次なにやろう？を話そうの会　主催登壇
2022/5/13　WinActor交流イベント Vol.1～WinActor画面レイアウトについて～　主催登壇
2022/4/25　RPA勉強会WinActor Talk　主催登壇
2022/4/25　RPA勉強会WinActor Talk　主催登壇
2022/4/22　日経メッセプレミアムカンファレンス DXを加速させ新しい働き方を実現する「RPA/AI」　講演
2022/4/19　デンソーテン様社内DXイベント　講演
2022/4/15　【初参加 大歓迎】ITネタ交流会 ～ITや自動化の話題でメンバー同士つながって楽しもう！　主催登壇
2022/3/27　RPA4人会　LT登壇
2022/3/2　【デジタルトランスフォーメーション】とはなにか中小企業向けDX導入促進セミナー　講演
2022/2/25　【初参加 大歓迎】RPACommunity交流会 ～ITや自動化の話題でメンバー同士つながり合おう～　主催登壇
2022/2/14　RPA勉強会WinActor Talk　主催登壇
2022/1/28　RPA勉強会WinActor Talk　主催登壇
2022/1/23　RPA4人会　LT登壇

### ■最後に
2022年も皆さまの多大なるご支援・ご協力により、たくさんの経験を積むことができました。
2023年も一つ一つ、前に進んでいきますのでぜひとも応援よろしくお願いいたします。

WinActorアンバサダー公式ページのコラムも要チェック！
https://cobotpia.com/ambassador/allambassador/shibuya/
【超簡単】Excel・スプレッドシート 条件式書式 カスタム数式 〜ある項目を含む行に色をつける〜

# はじめに
社員名簿を男女で色分けしたい！

# 完成形
以下の写真のように、男女別で色分けができていたら成功です！![スクリーンショット 2022-12-13 19.46.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/dbef15ce-f013-8b3f-0fe2-ead629e2927a.png)


※ こちらの名簿は以下のサイトからお借りしました。

http://mw211.com/tekito/tekito01.htm

また実際の完成形スプレッドシートも以下に載せておくのでぜひご確認ください！

https://docs.google.com/spreadsheets/d/1mwXMG8534N31__e-K-ygA28RKHl2Ly3-1li6d75bsx0/edit#gid=1103384671

# 実装方法
① 以下のスプレッドシートをコピーしてください

https://docs.google.com/spreadsheets/d/1mwXMG8534N31__e-K-ygA28RKHl2Ly3-1li6d75bsx0/edit#gid=1103384671

ファイル→コピーを作成 で作成できます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/9214ef90-c443-a90d-18c8-c8dd7b0e0af9.png)

コピーを作成できたら、シートの一番下に以下のシートがあることを確認してください！


② 名簿のセルを全選択→表示形式→条件式書式

 
![スクリーンショット 2022-12-13 19.45.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/65d527cf-b905-ee84-bbeb-d27344ff179e.png)



③ 書式ルール→カスタム数式を選択

![スクリーンショット 2022-12-13 19.45.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/dfea61c2-bff2-f67e-26b9-15faeb8a4f79.png)

④ 名簿から男性に青色をつけよう

カスタム数式に以下の関数を記述しましょう

```
=$D1="男"
```


![スクリーンショット 2022-12-13 19.46.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/f2f55d21-cbdf-51ad-25c9-06a84ba6e827.png)

⑤ 同様に名簿から女性をピンク色にしよう！

```
=$D1="女"
```

![スクリーンショット 2022-12-13 19.46.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/38a6ea98-3c29-3fc2-6ff8-4a5756831a38.png)





以下のようになっていれば成功です！

![スクリーンショット 2022-12-13 19.46.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/5093261b-26fb-7c88-a6e9-13ca0e2ed003.png)




# 最後に
スプレッドシートでできることはほかにもたくさんあります！
関数を勉強してみてたくさん組み合わせて、自分が作りたいものを実装できるようになるまで練習しましょう！