OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonを使い始めるための3つの学習オプション


他のプログラミング言語と同様に、Pythonを学ぶにはさまざまな方法があります。これらのオプションには、ブートキャンプ、従来の学位、および自己誘導学習が含まれます。それぞれの経路には独自の利点があります。すべての意欲的なコーダーが独自のニーズ、関心、制約を持っているのと同じです。あなたのキャリアの目標は、Pythonを学ぶ方法を決定する上で重要な要素になります。特にPythonに焦点を当てる方法もあれば、Pythonと連携して他のプログラミング言語やスキルを学ぶ機会を提供する方法もあります。

1.データ分析ブートキャンプ
ブートキャンプは、さまざまなプログラミング言語とスキルを教える集中的なプログラムであり、通常、完了するまでに3〜6か月かかります。彼らはまた、仕事や他の責任を維持する必要があるが、プログラマーになるためのスキルを習得したい学生のために柔軟なスケジュールを提供する傾向があります。データ分析ブートキャンプは、複雑なデータ問題を解決および分析するために必要なスキルを教えることに重点を置いています。学生は、ピボットテーブルやVBAスクリプトなどのExcel関数から、HTMLやJavaScriptチャートなどのフロントエンドWeb視覚化ツールまで、データ分析の基礎を学びます。

TexasMcCombsのDataAnalysisand Visualization Boot Campでは、学生はPythonでの作業の基本と、NumPyやPandasなどのデータに焦点を合わせたPythonライブラリの使用方法を学びます。ブートキャンプのカリキュラムは、膨大な量のデータを意味のある洞察に変換する方法を学生に教えます。この洞察に基づいて、自分自身や組織の戦略的優位性を獲得することができます。さらに、データ分析ブートキャンプでPythonの学習を検討する必要があるのはなぜですか？
データ分析とデータサイエンスの分野で仕事を追求したい人にとって、Pythonに焦点を当てたデータ分析ブートキャンプは優れたタイムリーな選択です。 Pythonはデータサイエンスの世界で広く使用されており、その人気が高まっているだけなので、データサイエンスを始める人にとって重要なツールです。

幅広いデータ分析スキルセットの一部としてPythonを学ぶことは、データアナリストが幅広いスキルを持っていることが期待されるため、より強力な候補者になります。複雑なデータセットを収集、並べ替え、分析する方法を知っている必要があります。また、傾向を理解して予測し、洞察を伝え、社内の他のチームと協力する必要があります。ただし、これらのプログラムの卒業生が利用できるのはデータアナリストの仕事だけではありません。たとえば、データサイエンティスト、ビジネスアナリスト、ソフトウェア開発者などの仕事も受けることができます。

2.伝統的な学位
高度なデータサイエンスまたはコンピュータサイエンスでの仕事の機会を求めている人にとって、伝統的な大学の学位は有望な教育オプションになる可能性があります。

たとえば、ソフトウェア開発を始めようとしている多くの人々は、コーディングブートキャンプとコンピュータサイエンスの学位のどちらかを決定しなければならない場合があります。従来の学位は時間とお金のはるかに大きな投資を必要としますが、学生は集中トピックをより深く研究することができ、興味はあるが専攻には関係のないコースを受講することができます。コンピュータサイエンスは、コーディングに関心のある人に最も人気のある学位であり、Pythonやその他のプログラミング言語のコースが含まれます。

伝統的な大学の学位の詳細については、UTオースティンのWebサイトにアクセスして、学習コースに関する情報を入手してください。

学位を取得したい方は、UTオースティンのコーディングブートキャンプのような継<a href="https://hkbppc.com/">脊醫</a>続コースを受講できます。この特定のブートキャンプでは、登録済みの学生に追加費用なしで、PythonやAWSなどのプログラミング言語で補足的な学習オプションを提供することでエンプロイアビリティを向上させることができます。

3.独立した学習
自己学習に関心のある人にとっては、無料のコースやコーディングに関する教育アプリ（特にPython）などの独立した学習オプションが最適なルートです。たとえば、edXには、潜在的なコーダーが自分で言語を教えるために使用できるPythonに関するコースの強力な選択肢があります。 Pythonは、それが誇る強力なオンラインコミュニティのために、独立した学習オプションを特に価値のあるものにします。自分で言語を教えたいと思っている人は誰でも、知識とリソースをオンラインで提供することをいとわないプログラマーから利益を得ることができます。
cssのanimationのstepで少し躓いたのでまとめておく

意外と複雑な仕組みだったので備忘録

```
.active {
    animation: blink 1.0s steps(2) infinite
}
@keyframes blink {
    0% {background: white;}
    100% {background: black;} 
}
```

例えばこのようなものを考えると，背景は黒にはならない。
ここでのstepsの2は2分割を表しているが，この2分割は0%-50%と50%-100%の区間で分割することを表している。
そして，この区間はそれぞれ0%,50%の値を用いる。
これはstepsの第二引数のデフォルトがendだからである。
(すなわち第二引数をstartにすると50%と100%の値を用いることになる)

話がずれたがどうすれば良いかというと，50%を用いるならここにblackを持ってくれば良い。
```
.active {
    animation: blink 1.0s steps(2) infinite
}
@keyframes blink {
    0% {background: white;}
    50% {background: black;} 
}
```
しかしこれは動かない。正確には動くけどちょっと違う。コマ送りが多い。
なぜこんなことになるかというと，どうやらキーフレームを置く場所で分割しようとするみたいだ。
すなわち50%に置いたことで0-50，50-100をそれぞれ2分割しようとする。つまり
0,25,50,75の値が繰り返されることになる。これは望んだ動作ではない。
2分割しなければ良いので，stepsを1に変えれば良い。すなわち
```
.active {
    animation: blink 1.0s steps(1) infinite
}
@keyframes blink {
    0% {background: white;}
    50% {background: black;} 
}
```
で良いことになる。

(ドキュメントにstepsの初期値が書いていないのはなぜ)

https://developer.mozilla.org/ja/docs/Web/CSS/animation-timing-function
MySQL 日本語が？で表示され文字化けする問題の解消

# 概要

- MySQLで日本語が`?`で表示されて文字化けする問題の解消方法を教えていただいたので忘れないようにメモしておく。

# 解消方法

- 下記SQL句をMySQLにログインして実行することで解消される。

    ```sql
    SET NAMES utf8;
    ```

# 独り言

- 実はMySQLのconfを設定して再起動することで文字化けを直すことができる。
- 今回の方法は再起動が難しいMySQLなどでとても有効であると感じた。
pythonでシリアルコードでポイントが付与されるプログラム

某キャンペーンサイトで英語の大文字でポイントを付与されるプログラムを見て、自分でも作ることは出来ないかと作ってみました、少しずつでも改善とコメントを追加していきます。


実行環境はpython ver3.8.3です。

```python
from cProfile import label
from cgitb import text
from distutils.cmd import Command
import tkinter as tk
import string
import random

baseGround = tk.Tk()
# メインウィンドウ作成
baseGround.title("ポイントサイト")
# ウィンドウタイトル設定
baseGround.geometry("300x300")
# ウィンドウサイズ設定

all_point = 0 

point_deta = ["".join([random.choice(string.ascii_uppercase) for _ in range(3)])for _ in range(20)]

print(point_deta)

def btn_click():
    global all_point
    point_up = input_text.get().upper()
    label1["text"] = point_up
    if point_up in point_deta:
        all_point = all_point + 1
        
        label3["text"] = all_point
    else:
        label3["text"] = all_point
    label3["text"] = all_point
input_text = tk.Entry()
input_text.pack()

btn = tk.Button(baseGround, text = "入力", command = btn_click)
btn.pack()
label1 = tk.Label()
label1.pack()
label2 = tk.Label(text = "総ポイント数")
label2.pack()
label3 = tk.Label(text= all_point)
label3.pack()
     
baseGround.mainloop()
```
スーパーコピー バッグ 優良店チェストベルトが装備


<p><a href="https://zeitakuhin.com/product/dioru-supako-piryukku-so-gara-nisemono.html">ディオール スーパーコピーリュック総柄偽物 大容量 流行 激安通販</a></p>
<p><a href="https://zeitakuhin.com/product/dioru-supako-piryukku-so-gara-nisemono.html"><img src="https://zeitakuhin.com/images/goods/000003/goods_image.jpg" alt="ディオール スーパーコピーリュック総柄偽物 大容量 流行 激安通販" width="296" height="288"/></a></p>
<p>【大容量設計】スクエア型＋幅広マチで収納力抜群、30リットル大容量 最大17インチPC、Pad、 A4サイズの書類や着替え、サングラス、帽子など必要なアイテムを、まとめて収納できます！<br />
  【ハニカム型綿クッション素材】 優しい背負い心地！しっかり衝撃吸収！背面クッション&amp;ショルダーベルト 蒸し熱い背面やショルダー部分には、 通気性に優れたメッシュ生地を採用する事で快適に使用することができます。 重い荷物でも肩の負担を減少しクッション性のあるショルダーで長時間の持ち運びも疲れることがない、 つかれにくい仕様で設けております。 <a href="https://zeitakuhin.com/category/baggu.html">スーパーコピー バッグ 優良店</a>チェストベルトが装備されており、より身体にフィットする安心設計です。背面部分はスーツケースとセットアップができるベルトもついており、持ち歩き便利です</p>
<p><a href="https://zeitakuhin.com/product/long-wallet-logo-print-black-men.html">グッチ スーパーコピーリュック偽物 大容量 流行 激安通販</a></p>
<p><a href="https://zeitakuhin.com/product/long-wallet-logo-print-black-men.html"><img src="https://zeitakuhin.com/images/goods/000107/goods_image.jpg" alt="高品質 プラダ スーパーコピー 長財布 レザー 三角ロゴ ブラック" width="276" height="271"/></a></p>
<p>●ブランドネームが程よいアクセントになった、スクエアフォルムのリュック。<br />
  ●背面上部のファスナー内にショルダーを収納して、トートとしても使える2WAY仕様です。<br />
  ●背面と肩ひもにクッション性があるのも◎。<br />
  ●サイドのファスナーからも荷物の出し入れができて便利です。<br />
  ●内外にポケットが充実しているので、収納力バツグン。</p>
<p>高品質 プラダ スーパーコピー 長財布 レザー 三角ロゴ ブラック</p>
<p>【高級感のあるレザー】財布 メンズ 長財布は高品質のアンティークガラスレザーを使用しています。 高級感のある輝きで どんなシーンでも、エレガントさを失わずに着こなす。 また、この革は耐水性、耐久性に優れています。 長く使うことができるようになります。<br />
  【使い勝手の良さ】長財布の開口部は60度。 取り外しがとても簡単です。 <a href="https://zeitakuhin.com/">スーパー コピー 優良 サイト</a>高品質なYKKジッパーを採用。 小さな財布も引っかかることなくスムーズに開けられます。 買い物、車での移動、自動販売機を利用するとき。 お金やカードを素早く取り出せる。<br />
  【十分な容量があること】カード入れ×12、小銭入れ×1、お札入れ×2、フリーポケット×２。銀行カード、交通系カード、健康保険証、ポイントカード、買い物時の小銭などを簡単に収納できる 長財布 メンズです。 デイリーユースに最適です。</p>
<p><a href="https://zeitakuhin.com/product/nisemono-kuotsu-udedokei-redisu.html">ブランド シャネル偽物スーパーコピーウォッチ クォーツ腕時計 オシャレ レディース向け</a></p>
<p><a href="https://zeitakuhin.com/product/nisemono-kuotsu-udedokei-redisu.html"><img src="https://zeitakuhin.com/images/goods/000006/goods_image.jpg" alt="ブランド シャネル偽物スーパーコピーウォッチ クォーツ腕時計 オシャレ レディース向け" width="249" height="223"/></a></p>
<p>米国を中心にバッグやアパレル、腕時計他幅広い商品展開を行っており、世界各国でトータルファッションブランドとして不動の地位を築き上げている。<br />
ペアでもおすすめのカジュアルなデザインが魅力のアイテムです。<a href="https://zeitakuhin.com/category/tokei.html">スーパー コピー 時計販売店</a>レザーベルトのサイドには別カラーを使用し、アクセントになっています。</p>
<p>line：heisou888</p>
<p><img src="LINE_P202262_110003.jpg" width="392" height="393" alt="line" /></p>
pythonの__init__.py で PEP8のF401が出てしまう対応

# 課題
packageのために、 `app/__init__.py` に 以下のようなコードを書くと PEP8 の F401に引っかかる

```
from .hoge import Hoge
``` 

# 対策

以下のように `__all__` を使った記述をするとF401とならない

```py
from .hoge import Hoge

__all__ = ('Hoge',)
```

## `__all__` って何?

>  __all__ という名前のリストが定義されていれば、 from package import * が現れたときに import すべきモジュール名のリストとして使う、というものです。

https://docs.python.org/ja/3/tutorial/modules.html?highlight=import#importing-from-a-package

# 参照
https://www.youtube.com/watch?v=OAqvLDRZqFc

https://docs.python.org/ja/3/tutorial/modules.html#importing-from-a-package

https://docs.python.org/ja/3/reference/import.html
Webブラウザで「戻る」があるのがどれだけありがたいか ( ゲームセンターの「ギタドラ」に思う)

# ギタドラの難易度選択ガチャ

僕は最近よく、ゲームセンターで音ゲーの「ギタドラ」をやるのだが、曲を選んで、難易度選択画面まで進むと、信じられないことに、もう戻れないのだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/a5d325f3-a4c4-50d8-a992-3ee44da15d9d.png)

それぞれの難易度にはかなり開きがあり、初心者がADVANCEDでも選ぼうものなら、一瞬でゲームが終わる。

なぜこんな設計にしたのかが分からないが、少なくともKONAMIの開発者は「戻る」の重要性について認知していないようだ。

しかもプレイヤーは大事なクレジットを使っての有限なプレイである。自分に合った難易度選択をしないとすぐに死んだり、退屈過ぎるゲームになるこの「ギタドラ」で、最重要とさえ言える「難易度のラインナップ」が事前に分からない。

そんなに「戻る」の仕様が難しかったのだろうか。それともあえて、プレイヤーの選択肢を奪って、選びすぎないようにしたのだろうか。

ちなみに関係ないが、この難易度もわりとアテにならなくて、同じ難易度表記でもかなり曲の難しさは違う。何を基準に決めているかは全く不明だ。

全体のUIはとても良いのだが、根本的に何かが間違っている気がした。

# 電子マネーのチャージ

また別の話だが、KONAMIのゲームマネーのチャージ機を見てみよう。
まず入金だけなのに何故かパスワード入力をさせるのも謎だが、パスワードのボタンも暗く表示されているため、押せない状態なのかという誤認を招く。

そしてなんと、こちらも謎の深い「文字を明るく」するボタンがあり、これを押すとみやすい文字になるのである。

![817A5851-922C-42B8-B9A6-93B9FBC1120D_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/261105f0-528f-4790-6ad1-e61707f2e0c6.jpeg)

![5986E87F-F7B4-4DBA-A0FD-ED3F65F27274_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/7b2de5ae-7d24-2233-4dca-55fea09752d9.jpeg)

一体どうした？

# まとめ

KONAMIの開発者はWeb開発を参考にしたほうが良い。

<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Flatpickrで現在時刻をセットするボタンを実装する（TypeScript対応）

## 現在時刻をセットするボタンを実装したい

### まずは日付フォーマットで楽するためにdayjsをinstall
```cmd
yarn add dayjs
```
https://www.npmjs.com/package/dayjs
日付フォーマット系の中でも軽量らしく、今回はフォーマットしかしないのでdayjsを選択。

### 実装
```javascript
import flatpickr from 'flatpickr';
import { Japanese } from 'flatpickr/dist/l10n/ja';
import dayjs from 'dayjs';

const myElement = document.querySelector('.myElement');
if(myElement) {
  const fp = flatpickr(myElement, {
    enableTime: true,
    dateFormat: 'Y/m/d H:i',
    minDate: 'today',
    time_24hr: true,
    locale: Japanese,
    defaultHour: new Date().getHours(),
    defaultMinute: new Date().getMinutes()
  });

  // 現在時刻セットボタン
  const myButton = document.querySelector('.myButton');
  if(myButton) {
    myButton.addEventListener('click', () => {
      const date = dayjs().format('YYYY/MM/DD HH:mm');
      fp.setDate(date, true);
    });
  }
}
```
configはlocaleで日本語対応と、カレンダーを開いた際に現在の時分をdefaultHourとdefaultMinuteでセットするという記述もありますので参考までに。

ifでdocument.querySelectorの結果がnullではないことを伝えることで、TypeScriptでも怒られないようになります。

型定義は最新のFlatpickrにはすでに入っているので、@typesを使う必要はありません。
5.13 (標準) 順序統計量2 

## 方針

順序統計量は式が複雑になりやすいので，導出をしっかり頭に入れておく．

![知ったこと-57.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/d9f2952e-b47f-b1fb-1fc8-21a220bea170.jpeg)
![知ったこと-78.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/9658f77e-5998-166b-4482-1af63246b292.jpeg)


## 答案

![5.-23.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/3d510fb4-895f-bfdb-5c02-cb375cfc2886.jpeg)


## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
Pythonプログラミングを学ぶための初心者向けのヒント

ヒント1：毎日コーディングする
新しい言語を学ぶとき、一貫性は非常に重要です。毎日コーディングすることをお勧めします。信じがたいかもしれませんが、プログラミングでは筋肉の記憶が大きな役割を果たします。毎日コーディングに取り組むことは、その筋肉の記憶を発達させるのに本当に役立ちます。最初は気が遠くなるように思えるかもしれませんが、毎日25分から始めて、そこから上に向かって進んでいくことを検討してください。

セットアップと開始するための演習については、Pythonガイドの最初のステップを確認してください。

ヒント2：書き出す
新しいプログラマーとしての旅を進めるにつれ、メモを取るべきかどうか疑問に思うかもしれません。はい、そうすべきです！実際、研究によれば、手でメモを取ることが長期保存に最も有益であることが示唆されています。多くのインタビューではホワイトボードにコードを書く必要があるため、これはフルタイムの開発者になるという目標に向かって取り組んでいる人にとって特に有益です。

小さなプロジェクトやプログラムで作業を開始したら、手で書くことも、コンピューターに移動する前にコードを計画するのに役立ちます。必要な関数とクラス、およびそれらがどのように相互作用するかを書き留めておけば、多くの時間を節約できます。

ヒント3：インタラクティブに！
基本的なPythonデータ構造（文字列、リスト、辞書など）を初めて学習する場合でも、アプリケーションをデバッグする場合でも、インタラクティブなPythonシェルは最高の学習ツールの1つになります。このサイトでもよく使っています！

インタラクティブなPythonシェル（「PythonREPL」とも呼ばれる）を使用するには、最初にPythonがコンピューターにインストールされていることを確認します。そのためのステップバイステップのチュートリアルがあります。インタラクテ<a href="https://experteducation.hk/%e6%be%b3%e6%b4%b2%e5%8d%87%e5%ad%b8/">澳洲升學顧問</a>ィブなPythonシェルをアクティブにするには、ターミナルを開いて、インストールに応じてpythonまたはpython3を実行します。
FlatpickrのmethodをTypeScriptで使用する



## Flatpickrの公式ドキュメントのコードを貼り付けたが、TSで怒らるし意味不明という方へ

例えば公式のこんなコード
https://flatpickr.js.org/instance-methods-properties-elements/#methods
```javascript
let calendar = flatpickr(yourElement, config);
calendar.changeMonth(1); // go a month ahead
```
これを貼り付けてもTypeScriptの設定によっては、
**プロパティ 'changeMonth' は型 'Instance | Instance[]' に存在しません。**
と怒られます。他のmethodsでも同様にキレられますよね。

### こんなコードに変更すると解決できるかもしれません。
```javascript
const myCalendar = document.querySelector('.yourElement');
if(myCalendar) {
  const fp = flatpickr(myCalendar, config);
  fp.changeMonth(1);
}
```
if文を使い、取得したElementがnullでないことを伝えてあげてからだとうまくmethodにアクセスできると思います。

私自身TypeScript使い始めですが、TSはとにかく存在を確約してあげないと「そんな要素無いかもしれないだろ！つまりここも無い可能性！」と怒ってきますね。
[LaTeX3] Mismatched LaTeX support files detected.

`LaTeX3: Mismatched LaTeX support files detected.` というエラーメッセージが出たときの覚書とリンク

**リンク**
[! LaTeX3 Error: Mismatched LaTeX support files detected. (LaTeX3) Loading 'expl3.sty' aborted! (LaTeX3)](https://stackoverflow.com/questions/69076268/latex3-error-mismatched-latex-support-files-detected-latex3-loading-expl3)

どうやらフォーマットファイルが何らかの理由でぶっ壊れていると起こるらしいです。(伝聞
なので以下の2コマンドを叩いてみるのがよいみたいです。(曖昧

```console
> fmtutil-sys --all
> fmtutil-user --all
```
with Android チームが採用している Issue 管理術

## はじめに

with で Android エンジニアをしている 石田 です。with の Android チーム(以下 with-android)では GitHub の Issue の管理について約半年間見直してきました。というのも従来の Issue 管理には課題がある状況でした。それは例えば以下のようなものです。


* **Issue の数がなんとなく多い気がする**
* **数年前に作成された Issue が未だに存在している**
* 作業の手が空いた時にどの Issue の対応を行うべきなのかパっと分からない
* Issue 対応へのモチベーションが湧かない

これらの課題に対応するため少しずつ Issue 管理を改善し、最近になってそこそこ洗練されてきたなと思えるようになりました。本記事では半年間で培った Issue 管理術を紹介します。

## Issue のライフサイクル

Issue 管理の見直しによって最も大きな変化があった **Issue のライフサイクル** について説明します。

### 従来の Issue のライフサイクル

従来の with-android での Issue のライフサイクルは下図のようなものでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56635/4afdb51a-339e-bd93-f8fd-ccdb1cb526d0.png)

驚くほどシンプルですが、Issue が作成されたら朝会でカテゴリ分け(重要度と緊急度)を決定します。これで終わりです。「重要かつ緊急」にカテゴライズされたものは確実に実装がなされていましたが、それ以外にカテゴライズされたものは実装されることなく **放置される可能性が非常に高い状態** でした。


### 現在の Issue のライフサイクル

現在の Issue のライフサイクルは下図のようになっています。ライフサイクルを **3つの期** に分けて説明します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56635/30f4352d-ff91-abbf-1cdf-ab2f388161dd.png)


#### 誕生期

Issue が作成されたら朝会の中でメンバーで議論し、その内容が有用であると判断された場合は、アサインとマイルストーンを決定します。当たり前のようですがこれがすごく重要で、**「だれ」が「いつ」やるかを明確にする** ことで Issue の放置を防いでいます。一方、有用でないと判断された場合は、「低優先度」ラベルを付与します。アサインとマイルストーンは設定しません。

#### 再生期

誕生期で「低優先度」ラベルが付与された Issue はどうなるかというと、期初のタイミングで 年2回 行っている棚卸し会で再度議論されます。やっぱりこの Issue は有用であると判断された場合は、アサインとマイルストーンを決定します。

一方、再び有用でないと判断された場合は思い切ってクローズします。また、Issue としての内容はよくても対応したいエンジニアがいなければ結局放置されるという結果が目に見えるので、そのような場合もクローズします。それでも判断に迷う場合はそっとしておきます。

#### お別れ期

誕生期でも再生期でも処理されず、放置され続けた Issue についに寿命が訪れます。365日以上 アクティビティのない Issue をクローズするように設定した [Stale](https://github.com/actions/stale) が自動的に Issue をクローズします。これにより数年に渡って Issue が放置されるという可能性はなくなります。

## Cycle の導入

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56635/a79fc717-f29c-8e63-c37d-fc1945cdca6b.png)

**Cycle の導入** も Issue 管理が上手くいった理由の一つです。

Issue のライフサイクルの説明の中で、対応することが決まった Issue にはマイルストーンを設定すると述べましたが、with-android ではマイルストーンをアプリのバージョンと関連付けています。そのため どのバージョンで入るか明確に決められない Issue はどうするのかという問題が発生します。

そのような場合にはマイルストーンの代わりに [GitHub Projects(Beta) の Iteration](https://docs.github.com/en/issues/trying-out-the-new-projects-experience/managing-iterations) を設定することで「いつやるか」の計画を立てています。with-android では Iteration を Cycle と呼び、1か月を単位として運用しています。**月初にはその月の Cycle で取り組む Issue をリストアップし、メンバー間で合意を取る**ことで計画性を担保しています。

Iteration についてはこちらのドキュメントを参照してください。

https://docs.github.com/en/issues/trying-out-the-new-projects-experience/managing-iterations


## ラベルの細分化

従来のラベルは以下のものを使用していました。

* `リファクタリング`
* `タスク`
* `バグ修正`

現在はこれらのラベルを細分化し、以下のものを使用しています。

* `リファクタリング: Compose化`
* `リファクタリング: モジュール分割`
* `リファクタリング: モダナイズ`
* `リファクタリング: 負債返却`
* `タスク`
* `タスク: 定期`
* `バグ修正`
* `バグ修正: クラッシュ`


このようにラベルを細分化した理由は、単純にもう少しラベルに具体性を持たせたかったというのもありますが、それ以上に**メンバーがどんな Issue の対応に多く貢献したかをひと目でわかるようにする**ためです。リファクタリングのような地味とも言える作業は評価に繋がりにくいということがしばしばありますが、このようにしておけば定量的な評価材料になるので、Issue 対応のモチベーション向上になるのではないかと考えています。


## まとめ

本記事で紹介した Issue 管理を行うことで、with-android では Issue が放置される隙が全くなくなりました。よくわからないけど未対応の Issue がたくさんあるな...という状態を脱却し、Issue を完全にコントロールしている状態に変わりました。 **例え Issue の数が同じでもそれらがコントロールされているのか、それともされていないのかでは大きな違いです。**

Issue 管理について課題感を感じているチームはぜひ本記事を参考にしてみてください :)
Raspberry Pi Pico Wi-Fi Controlled Model railroad

Raspberry Pi Pico Wi-Fi Controlled Model railroad

iPadからWi-Fiで RasPi Pico Nゲージを制御するハードとソフトの覚書
General View(1)
回路図、ソフトウェアは後日アップする

![pico_modeltrain.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531059/afbf05d7-3bbb-60ff-7655-49caea6b3158.jpeg)




[Spec]
a)Nゲージ鉄道模型(Model Railroad)をRaspberryPi Picoで制御(Controll)
b)Wi-Fi Packet通信で iPad Server から Pico Clientを制御(Controll)
c)Pico Server Softwear は MicroPython
d)iPad Client Softwear は Pythonista 3


![IMG_0138.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531059/7eee7899-da40-24ab-257e-b97be915789b.jpeg)




@Controller_Hardwear
  1.Raspberry Pi Pico : Model Railroad Controller :2022/5/30 ¥890
  2.ESP-WROOM-2 : UART, Wi-Fi Flash Boot Mode(AT+Command):2022/6/4 ¥926
  3.AE-TB6612(1) : PWM, The track voltage to controll the speed ¥420
  4.AE-TB6612(2) : PWM, Train track point driver ¥420
  5.AQM0802A-FLW-GBW : I2C, 8-Character x 2 LCD ¥320
  6.Photo diode sensor x 2
  7.USB-Serial FTDI : UART, Optional UART interface ¥1,100

 
@ControlledSpecifications
  1.Wi-Fi Socket Communication
  2.Train Motor speed(PWM 0-100%) :2ch
  3.Train Direction(forward/revers) :2ch
  4.Train Track Point(right/left) :2ch
  5.8-Character x2 LCD display
  6.Photo diode sensor(AD0,AD1) :2ch
  7.board temperature (ADC4)
  8.optional UART


@RaspberryPi_Pico_PinConnection
 1.GP0 UART0 Tx - USB-Serial FTDI(2):Rx
 2.GP1 UART0 Rx - USB-Serial FTDI(3):Tx
 3.GND
 4.GP2 - AE-TB6612-1(1):PWMA
 5.GP3 - AE-TB6612-1(2):AIN2
 6.GP4 - AE-TB6612-1(3):AIN1
 7.GP5 - AE-TB6612-1(7):BIN1
 8.GND
 9.GP6 I2C1 SDA - AQM0802A(2):SDA1 - DRV8830(2):SDA
10.GP7 I2C2 SCL - AQM0802A(3):SCL1 - DRV8830(1):SCL
11.GP8 - AE-TB6612-1(8):BIN2
12.GP9 - AE-TB6612-1(9):PWMB
13.GND
14.GP10 - AE-TB6612-2(1):PWMA
15.GP11 - AE-TB6612-2(2):AIN2
16.GP12 - AE-TB6612-2(3):AIN1
17.GP13 - AE-TB6612-2(7):BIN1
18.GND
19.GP14 - AE-TB6612-2(8):BIN2
20.GP15 - AE-TB6612-2(9):PWMB
21.GP16 UART0 Tx - ESP-WRoom-02(12):Rx
22.GP17 UART0 Rx - ESP-WRoom-02(11):Tx
23.GND
24.GP18 - DipSw(4)
25.GP19 - DipSw(3)
26.GP20 - DipSw(2)
27.GP21 - DipSw(1)
28.GND
29.GP22 - TactSW
30.RUN NC
31.GP26 ADC0 - Photo diode sensor 1
32.GP27 ADC1 - Photo diode sensor 2
33.GND AGND NC
34.GP28 ADC2 NC
35.ADC VREF NC
36.3V3(OUT) NC
37.3V3 EN NC
38 GND
39 VSYS NC
40 VBUS NC

![Pico配線図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531059/494c7a2d-dd6f-c8c2-756a-b74b80228b5d.jpeg)





@iPad_DisplaySpecifications
 Model : iPad
 Softwear : Pysonista 3
 Raspberry Pi Pico Controlled Railroad Client
![IMG_0131.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531059/9d1482d4-24d1-4c18-a6e2-fc0cd3763228.jpeg)
laravel 8.x アセットのデプロイ・・・じゃない配置？

# Nodeのインストール
laravel が入っていれば sail が動くと思うので、コマンド1発。
#./sail node -v
#./sail npm -v

# Laravel Mixのインストール
#npm install

# アセットの変更を監視
#npm run watch
(watch-pollじゃないとだめな環境もあるらしい)

らくしょーだね。
Raspberry Pi用1.3インチLCDでオールドカメラをデジカメ化（２）

Raspberry Pi用1.3インチLCDでOLDカメラをデジカメ化（１）では1.3inch LCDの設定とAnalog mouseの起動設定まで行いました。
今回はRaspberry Piでのプログラミングについてです。
Raspberry Piには無料で読める雑誌Magpiというのがあり、そこが出している[Camera Guide](https://magpi.raspberrypi.com/books/camera-guide)という本が参考になります。
今回こちらの雑誌にあるサンプルコードを利用します。
P28からPythonでの使用方法が記載してあります。まずTerminalを開いて以下のコマンドを入力しPythonでカメラを使えるようにします。

```
sudo apt-get update
sudo apt-get install pythin-pycamera python3-picamera
```
次にチャプター6 「Stop-motion and selfies」のサンプルコード[ch7listing.py](https://github.com/themagpimag/cameraguide/tree/master/Chapter%2006%20-%20Stop-motion%20and%20selfies)をP37のリンクからダウンロードします。
このサンプルコードではGPIO 14、15(GND)にボタンスイッチを接続し、スイッチを押すとシャッターが切れ、「pic+タイムスタンプ.jpg」というファイル名で保存するものです。
今回使用1.3inch LCDは以下のようにボタンやジョイスティックが割り振られています。

P21：KEY1
P20：KEY2
P16：KEY3
P6：Joystick UP
P19：Joystick Down
P5：Joystick Left
P26：Joystick Right
P13：Joystick Press
P11：SCLK
P10：MOSI
P8：CS
P25：DC
P27：RST
P24：BL

アナログマウスを起動しているため、KEY1は左クリックとして使用しますので、今回はKEY2のP20をシャッターとして使用します。解像度は「pc.resolution=(1024,768)」となっていますが、HQカメラを使用しているので、せっかくなので「pc.resolution = (2592, 1944)」に変更しておきます。サンプルコードではプレビューの画面が大きいので、「pc.start_preview(fullscreen=False,window=(50,20,500,500))」としておきます。このくらいだとウィンドウの閉じるボタンをなんとかマウスで押せます。解像度設定の直後に「pc.awb_mode = 'incandescent'」と入れておきます。今回私はHQカメラのCCD部分のみを使用しているため、マウントに付属されているローパスフィルターを外しています。その場合「pc.awb_mode = 'auto'」としておくと色がピンクっぽくなってしまうので、それを防ぐために変更しています。感度を自動設定とするため「pc.iso=0」としてあります。保存するファイル名に日付を付与したいので、「pc.capture('pic'+str(datetime.now())+'jpg')」としておきます。

```python:camera.py
#importing the necessary modules
from datetime import datetime
from gpiozero import Button
import picamera
import time

#Button MAP 1.3LCD
b=Button(20) #KEY2
#b=Button(21) #KEY1
#b=Button(20) #KEY2
#b=Button(16) #KEY3
#b=Button(6)  #Stick UP
#b=Button(19) #Stick DOWN
#b=Button(26) #Stick RIGHT
#b=Button(5)  #Stick LEFT
#b=Button(13) #Stick PRESS

pc=picamera.PiCamera()
running = True
pc.resolution = (2592, 1944)
pc.awb_mode = 'incandescent'
pc.iso=0


def picture():
    pc.capture('pic'+str(datetime.now())+'.jpg') #taking the picture

pc.start_preview(fullscreen=False,window=(50,20,500,500)) #running the preview

try:
    while running:
        print('Active') #displaying 'active' to the shell
        b.when_pressed=picture
        time.sleep(1)

#we detect Ctrl-C then quit the program
except KeyboardInterrupt:
    pc.stop_preview()
    running = False
    
```

私はこのファイルをデスクトップのcameraというフォルダにいれ、マウスでThonny Python IDEを起動し、実行ボタンを押すことで使用していますが、このプログラムはキーボードからCTLR＋Cで停止するまでずっと起動したままです。今回キーボードを接続していないので、プログラムを停止させるためにウィンドウサイズを500×500にしています。
Raspberry Pi用1.3インチLCDでオールドカメラをデジカメ化（１）

先日秋葉原に行く機会があったので、千石通商に立ち寄り、RaspberryPi用の[waveshare製1.3inch LCD HAT](https://www.waveshare.com/1.3inch-lcd-hat.htm)を購入してきました。
こちらはRaspberryPi Zeroと同じサイズで、左側がコントローラ、右側にボタンが３つついているものです。
Amazon等ではもっとボタン数が多くLCDサイズが1.54inchの物が販売されており、こちらも以前購入したことがありますが、ミニゲーム機用としてRetroPi用のイメージファイルもあるのですが、今回こちらを使った理由は「厚さが薄い！」の一言です。
製品のページには以下のような仕様が書かれています。

Operating voltage: 3.3V/5V
Interface: SPI
LCD type: IPS
Controller: ST7789VM
Resolution: 240(H)RGB x 240(V)
Display size: 23.4（H）x 23.4（V）mm
Pixel size: 0.0975（H）x 0.0975（V）mm
Dimension: 65 x 30.2(mm)

厚さに関する記載がないのですが、ついているコネクタが薄いので、実測値で1.5inchの物が25mm程に対しこちらは7mmしかありません。
上が1.54inch、下が今回購入した1.3inchです。
![IMG_4880.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1108028/dd67d5d0-bed9-50ec-20a0-4bd7d9b8ff9d.jpeg)
RaspberryPi Zeroのケースに取り付けても隙間が殆どありません。
![IMG_4881.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1108028/614cf7e2-8b38-6515-15b8-4a76972e624c.jpeg)

実はこのLCD、RaspberryPiのHQカメラを利用して、オールドカメラをデジカメ化するために購入したものです。
裏蓋にはHQカメラを取り付けられるように穴を開け、ちょうどフィルム面にCCDが来るように取り付けてあります。
1.54inch LCDでは厚さがあってかなり出っ張ります。
![IMG_4882.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1108028/061566d9-3f54-37a2-5eee-cebc68034a23.jpeg)
今回購入した1.3inch LCDではかなりスッキリします。
![IMG_4884.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1108028/32b34014-bcfe-0698-ce34-db7a2a512b0e.jpeg)
セッティングは意外と楽で、[こちらのページ](https://www.waveshare.com/wiki/1.3inch_LCD_HAT)でGuides for Piのタブを選択してディスプレイの設定、Analog Mouseのライブラリとmouse.pyを入手しておきます。
config.txtにはデバック用に「hdmi_safe=1」を設定しておくとLCDと外付けディスプレイに表示されるので合わせてやっておきましょう。
以下のコマンドを入力してmouse.pyを自動で起動するようにしておきます。

```
cd .config/
mkdir autostart
cd autostart/
sudo nano local.desktop
```
```
[Desktop Entry]
Type=Application
Exec=python /home/pi/mouse.py
```
再起動すればアナログマウスとして使用できます。ちなみに左クリックはKEY1になります。
Windows PCでLinuxを使ってクライオ電子線トモグラフィー関連のプログラムを動かす（3)UCSF-Chimera, EMAN2

EMAN2はクライオ電顕の解析ソフトの1つであるが、クライオ電子線トモグラフィーにおいてCNN (Convolutional neural network)によるセグメンテーション機能を有している。
本家HP：https://blake.bcm.edu/emanwiki/EMAN2
CNNによるsegmentation：https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5623144/

また、UCSF Chimeraは分子描画プログラムの1つであるが、EMAN2の結果を描画するために使うため、同時にインストールする。
本家HP:https://www.cgl.ucsf.edu/chimera/

*UCSF Chimeraの無料版は非商用利用に限られる。企業での利用には有償ライセンスが必要なことに注意していただきたい

自分の実行環境
```
Windows11 Home
Ubuntu20.04.4 LTS
Nvidia GeForforce 1070Ti
```

# UCSF-Chimeraのインストール
（参考）　https://www.youtube.com/watch?v=v3fIS_6BU44

https://www.cgl.ucsf.edu/chimera/download.html からLinux用のインストラーをダウンロードする。（下ではchimera-1.16-linux_x86_64.bin）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606601/f5e3269d-bcac-02eb-12f7-9d00fe719a0f.png)


Windowsでダウンロードした場合はインストーラーファイルをlinuxの/home/＜ユーザー名＞などに移動する

```shell
chmod +x CHIMERA-INSTALLER.bin
sudo ./CHIMERA-INSTALLER.bin

* CHIMERA-INSTALLERは上記の場合、chimera-1.16-linux_x86_64が入ります
```
インストール先を聞かれる。　どこでもよいと思うのだが、Youtubeを参考に
```shell
/opt/UCSF-Chimera64-1.16
```
とかにしておきますか。

途中でデスクトップにアイコンを作るか？などと聞かれるが、WSLではデスクトップもクソもないので、Noでよいはず。
さらにSymobolic linkを作るか聞かれる。ここではデフォルトが0(no link)となっているが、作っておいたほうが良さげ。Youtubeに倣って/usr/sbinを選んでおく。

（注）UCSF-Chimeraはすでに次世代のUCSF-ChimeraXが公開されている。ChimeraXがEMAN2とリンクできるかについて検討する必要があるが、一旦ペンディング

# EMAN2のインストール
https://blake.bcm.edu/emanwiki/EMAN2/Install/BinaryInstallAnaconda/2.91

EMANでもGPUを使う箇所があるため、CUDA toolkitがインストールされていない場合は(2)の記事を参照し、インストールしておく
https://qiita.com/bonnginn/items/0fe011afab58ecfdd852

下記からLinux版をダウンロードする。本来、上のファイルで大丈夫なはずだが、回線が貧弱なためか、インストールに失敗したので、"huge"と書かれているファイル（eman2.91_sphire1.4_sparx_huge.linux64.sh)をダウンロードした。
https://cryoem.bcm.edu/cryoem/downloads/view_eman2_version/32

先ほどと同様に
Windowsでダウンロードした場合はインストーラーファイルをlinuxの/home/＜ユーザー名＞などに移動する

インストールは下記のページに従い
https://blake.bcm.edu/emanwiki/EMAN2/Install/BinaryInstallAnaconda/2.91

```shell
bash <path-to-EMAN2-installer>
例： bash eman2.91_sphire1.4_sparx_huge.linux64.sh
```
インストール後Ubuntuを再起動
試しに
```shell
e2version.py
```
と打って
Emanのバージョン（ここでは2.9.1)が表示されればOK

実際に解析に使う場合には、解析用のフォルダを作製し、そこにdirectoryを変更してから
e2projectmanager.py
を実行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606601/2e118774-7f96-c129-1864-4289c1dc9ada.png)
FlutterからWiFiアクセスポイントに接続する方法

### 前提条件(iOSの場合)
https://help.apple.com/developer-account/#/dev21218dfd6
`Hotspot Configuration`という機能を利用しますが、上記リンクに記載されている通り、`ADP`又は`Enterprise`を利用します。そのため~~Appleに毎年約１万円という学生の方（私）にとってとても痛い~~契約をしていない方は利用できませんのでご注意ください。

### 検証環境
```
[✓] Flutter (Channel stable, 3.0.1, on macOS 12.4 21F79 darwin-arm, locale ja-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[✓] Xcode - develop for iOS and macOS (Xcode 13.4)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2021.1)
[✓] IntelliJ IDEA Ultimate Edition (version 2022.1)
[✓] IntelliJ IDEA Ultimate Edition (version 2022.1)
[✓] VS Code (version 1.67.2)
[✓] HTTP Host Availability
```
### 利用パッケージ
次のパッケージを利用します。（随筆時点はv0.3.16)

https://pub.dev/packages/wifi_iot

### iOSの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362835/2f2fc740-f47b-8178-f3a7-568c99ad97b9.png)
XCodeでプロジェクトを開き、
`Runner` > `Signing & Capabilities` > Allの隣の`+`
を選択し、`HotSpot Configuration`を選択して有効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362835/af65fbad-1bf5-9a64-8da7-32e558698082.png)

### コード
```dart
WiFiForIoTPlugin.connect(/*SSID*/,
    password: /*password*/,
    security: /*NetworkSecurity型のセキュリティ*/,
    joinOnce: /*1度きりの接続かどうか*/);
```

詳しいドキュメントはこちらからどうぞ。
https://pub.dev/documentation/wifi_iot/latest/wifi_iot/WiFiForIoTPlugin-class.html
ヨーダ記法で書いたら、「君はプログラムを読めない」といわれた話。

## 前提
Java11
2020年ごろ
コーディング規約はない

<hr>

## 問題になったところ

``` Java
if(a.equals("AAA")){
```

## NullPointExcepitonで落ちるのめんどくさいなぁ・・・


``` Java
if(a!=null && a.equals("AAA")){
```
でもこのように書くのもなぁ・・・なんか長いしなぁ・・・

## そうだ！！！ヨーダ記法だ！！

``` Java
if("AAA".equals(a)){
```
これならa=nullでもfalseになるので問題ない。


## 君はプログラムが読めない
そもそも、左辺と右辺には意味がある。
そういうところがあるからプログラムを書けないと判断せざる負えない。
変数の意味を考えろ


とてもありがたい話をいただいたので

## Object.equals　を使おう

``` Java
if(Object.equals(a,"AAA")){
```

これで全て解決だ。
nullも気にしなくてよい。
Raspberry pi ubuntu ip固定をする

# ubuntuOSのRaspberry piでIpを固定するには？
ipアドレスの固定にかなり手間取ってしまったので、記録しておきます。
あっているかどうか怪しいので、他のページや参考文献も参考にしてみてください。
この記事が原因のトラブルに関して力になることはできても、責任はとれないので悪しからず。
## 環境
computer : Raspberry pi4 4GB
os : ubuntu21.10
## 参考文献
https://netplan.io/examples/

↑公式ドキュメント。

https://www.komee.org/entry/2018/06/12/181400

↑公式ドキュメントの和訳
この二つをそのまま見てしまったほうが、分かりやすいかもしれない。
## 設定方法
ラズベリーパイのネットワーク設定を変更するためには/etc/netplan/50-cloud-init.yamlを編集します。

```yaml:50-cloud-init.yaml
# This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot.  To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        enp3s0:
          dhcp4: true
          dhcp6: true
          addresses:
             - 固定ip
          optional: true
    wifis:
      wlan0:
        dhcp4: false
        dhcp6: true
        addresses:
          - 固定ip
        optional: true
        access-points:
          "SSID":
            password: "パスワード"
        nameservers:
          search: []
          addresses: [DNSサーバーip]
        routes:
          - to: default
            via: ルーターip
    version: 2
```
### 解説
部分ごとに解説していきます。
ルーター、DNSサーバーのipアドレス（後述）の調べ方は、ご自身でgoogle等で検索してみてください。
* #### Wi-Fi設定
access-points:の部分が該当します。
SSIDにWi-FiのSSIDを、パスワードにWi-Fiのパスワードを指定してください。
* #### ip固定
dhcp: falseとすることでルーターから自動でipアドレスを割り振る「dhcp」機能をオフにすることができます。
そうしたら、addresses:の後の固定ipに設定したいipアドレスを指定してください。
指定するときには、000.000.000.xxx/24のようにサブネットマスクを指定する必要があります。
000・・・の部分がネットワークを示し、xxxの数値で機器を特定します。ipアドレスは8byteの二進数で構成されていて、それを1byteごとに「.」で区切って表記します。1byteで0～255を表せるので、「.」で区切られた区間の中は最大で三桁の数字になるわけです。/24は前から24bit、つまり、3byte分がネットワークを示すよということを示す「サブネットマスク」になります。そこより後ろは、機器を特定する部分になるので、基本的には好きに指定することができます。しかし、他の機器が使っていたりするとネットワークにうまく接続できないので、ipアドレスを固定する前の値をそのまま使用するのも手です。
* #### DNSサーバー
DNSサーバーとは、webブラウザなどからgoogleなどのサーバーに接続する際、「google.co.jp」のようなURLをipアドレスへと変換してくれるサーバーです。
nameservers:の部分が該当します。
DNSサーバーipにDNSサーバーのipアドレスを指定してください。

* #### route
ネットにつなげるときの通り道を示します。
routes:の部分が該当します。
ルーターipにルーターのipアドレスを指定してください。

### 設定の適用
一通り設定できたら、コマンドプロンプトでsudo netplan applyとコマンドを打って設定を適用します。
自分の場合、Cannot find unique matching interface for eth0: {'driver': 'bcmgenet smsc95xx lan78xx'}と表示されましたが、無視して問題なさそうです。
## トラブルシューティング
ipアドレスを固定しようとしたらネットにつながらなくなった！というときは、焦らずに原因を究明しましょう。
### pingコマンド
ping　相手のip/URL
例 : ping 8.8.8.8
とコマンドプロンプトに打ち込むことで、相手と接続できるか確かめることができます。
放っておくと永遠とpingを打ち続けるので、接続できたようであればctrl+cで止めます。

:::note info
補足
pingは接続を確認するだけでなく、通信の速度を調べたり繰り返し打つことで相手と自分との接続の確実性を検証したりすることができます。
:::
1. 自分自身にping
Raspberry piに設定したipアドレスにpingを打ちます。
これがうまくいかないときは、ip固定がうまくいっていない可能性が高いです。
2. ルーターにping
これがうまくいかないときは、ルーターのアドレスを間違えていたり、Wi-Fiの設定をミスしていたりしていないか確かめてください。
3. 8.8.8.8にping
これがうまくいかないときは、ルーターがインターネットに正しく接続されているか確かめてみてください。
4. 何かしらのURLにping
例えば、google.co.jpに対してpingを打ってみてください。
これがうまくいかないときには、DNSサーバーのipアドレスを間違えていないか確かめてみてください。

以上の4つで、どこに問題があるのかを確かめてみてください。
トラブルが起きた時こそ、焦らず落ち着いて対応しましょう。
## あとがき
分からないこと、ご指摘等ありましたら、コメントしてみてください。対応できるかどうかわかりませんが、、、
楽しいプログラミングも準備段階でつまづくと辛いので、抱え込まずに誰かに質問してみてください。
JAVA 文法勉強2

相続(Incheritance)の定義
相続は、クラス間の上下関係で抽象的なスーパークラス(SuperClass)または親クラスからサブクラス(SubClass)または子クラスを作ることで、相続という関係を通じて階層構造を形成

相続特徴
１．スーパークラスで定義されたフィールドとメソッドを引き継ぐ
２．新しいフィールドやメソッドを追加できる
３．スーパークラスから受け継いだメソッドを修正できる　= Overriding
４．同一スーパークラスを相続するすべてのサブクラスはタイプ互換性がある
５．2つ以上のクラスを同時に相続する多重相続はサポートされません


オーバーライディング(Overriding)
定義：スーパークラスから相続したメソッドを再定義すること
メソッドの名前とリターンタイプ、印字などがすべて同一でなければならず、異なる場合は新しいメソッドが追加される形式

オーバーライディングによりオブジェクト指向の特徴の一つである多形成の実現が可能

例えばフルーツクラスがあっておいしい（）というメソッドがあるとしたら、フルーツクラスを引き継ぐイチゴとブドウがクラスを作る場合、おいしい（）メソッドのオーバーライディングによって異なる動作を可能にすることができます。

class Fruits {
void Delicious() {
System.out.println("何でも");
}
}

class Strawberry extends Fruits {
void delicious() {
System.out.println("何でも2");
}
}

class Grape extends Fruits {
void delicious() {
System.out.println("何でも3");
}
}
次のようにフルーツクラスタイプでイチゴクラスのインスタンスを生成しておいしい（）メソッドを呼び出すと何でも2が出力されます。

Fruit fruit = new Strawberry();
fruit.delicious();//何でも2
イチゴの代わりにフォードインスタンスを生成すると、同一コードで何でも3が出力され、同じ構造で他の動作を実現できるようになります。

抽象クラス(AbstractClass)の定義

抽象メソッド（abstractmethodを含むクラス
具体的でない内容を定義したメソッドのこと

特徴
1.抽象メソッドと定義されたメソッドは、サブクラスで必ずオーバーライディングして実装しなければなりません。
2.抽象クラス自体はnewを通じてインスタンスにすることはできず、必ず相続して具体的なクラスを作って使用しなければなりません。
3.抽象クラスは抽象メソッド以外に他のメソッドを含めることができれば、メンバーフィールドも持つことができます。

abstract class Fruit {
abstract void Delicious(){};
}
参考までにメソッドのabstactと{}は省略可能

インターフェース(Interface)の定義
何かをつなぐためのつながり
定数と抽象メソッドのみで構成された形態
抽象メソッドのみで構成されるため、それ自体は何の機能もしませんが、まるで設計図のように今後具現されるクラスを連結して使用できる基盤構造を提供しています。

メンバーフィールドはすべてpublicstaticfinalのみ可能で、制御者は省略可能。
すべてのメソッドはpublicabstractのみで、制御者は省略可能。
Flutter のメリット・デメリットについて

こんにちは、 NEXTSCAPE アプリチームの鈴木です。

今回はアプリチームで採用している、Flutter というマルチプラットフォームフレームワークについてご紹介します。主にアプリ開発の発注者(クライアント)向けに執筆していますので、よろしくお願いいたします。

# そもそも Flutter とは
Flutter とは、Googleが開発している主にモバイルアプリ向けのオープンソースフレームワークです。[^1]
したがって、「_Android 、iOS 以外の第3のスマホが出た！_」という訳ではなく、Android や iOS アプリを Flutter という仕組みで制作しているとご想像ください。2018年にリリースされた新しいフレームワークですが、後述する様々なメリットがあるため、弊社を含めて色々なアプリ開発会社が採用しています。
(もしかすると、普段皆様がお使いになっているアプリも Flutter 製かもしれません！)

[^1]: アプリを円滑に開発するための全体的な骨組み。

## メリット
アプリチームでは元々 Android と iPhone アプリを個別に制作しておりましたが、ここ2年ほどで積極的に Flutter を採用し始め、今後も基本的に Flutter を採用する方針です。それには下記のような理由があるためです。

#### 1つのプロジェクトで Android と iPhone をそれぞれ作れる
　アプリ開発会社、クライアント双方にとって一番大きいメリットだと思います。従来の方式では Android と iPhone アプリをそれぞれ開発やメンテナンスする必要があり、その分開発工数が増大していました。Flutter を採用した場合、Android と iPhone アプリを一元的に制作できるため、品質を落とさずに開発工数を削減できます。
以下に弊社での開発体制を掲載します。従来の方式よりコンパクトな体制になっていることが分かります。
![スクリーンショット 2022-06-07 11.22.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704199/30e0bc84-f9a8-a0ec-f804-37c91680cfbd.png)


#### Android と iPhone のリリースタイミングを合わせやすい
　大きな機能のリリースなどで、Android と iPhone でリリースタイミングを合わせたいケースがあるかと思います。従来の方式ではそれぞれ開発しているため「_Android は順調なのですが、iPhone が・・・_」という事態が発生し、全体のリリース時期が遅れる可能性がありました。
Flutter を採用している場合、通常はリリース時期を同タイミングにしやすく、差異を最小限にできます。

## デメリット
「_メリットばかり強調されても・・・_」と思われるかもしれません。ご懸念の通り、Flutter を採用する場合のデメリットも存在します。弊社ではそれを加味し、最終的には従来通りの開発手法を採用しますので、デメリットの影響が出ないようにいたします。
#### OS独自の機能は別途実装する必要がある
　Flutter を採用した場合でも、全ての機能を一元的に制作することはできず、Bluetooth やカメラなどは従来通りの方法で作成する必要があります。それがプロダクトのメイン機能だった場合、従来よりも開発コストが増大してしまい、Flutter を採用する意味が薄れてきます。アプリチームでは事前にクライアントにヒアリングし、最終的に Flutter を採用するべきか判断します。
#### Flutter できる人を確保しにくい
　こちらはアプリ開発側の都合ですが、Flutter が世に誕生して日が浅いため、通常のスマホエンジニアよりも採用しにくい傾向があります。また、チーム内で Flutter エンジニアが1人しか居ない場合、場合によっては開発がストップしてしまう恐れがあります。そのため、メリットは分かっているが中々採用できない場合もあります。
　アプリチームではチームに熟練の Flutter エンジニアが複数名在籍していますので、組織的に安定して開発体制を維持することができますのでご安心ください。
#### STB[^2] ではスマホと操作感の差異があるため、利用しにくい
　弊社では様々な STB アプリを開発していますが、全て従来の方式で開発しています。スマホアプリや Webアプリを作成できる Flutter ですが、STB アプリは対応していないケースや対応している or 採用するメリットが少ないためです。

[^2]: セットトップボックスの略。AppleTV や Fire TV Stick が挙げられる。


# おわりに
今回はアプリチームで積極的に採用している Flutter についてご紹介しました。
次回以降も Flutter やその他役立つ情報を提供できればと思いますので、今後ともよろしくお願いいたします。
【Rails】ActionCableの実装〜mapメソッドについて〜

## はじめに
実装の流れは長くなるので省略させていただきます。
自分が疑問に思ってノートに記録した物を記事にしていきます。

## 前提条件
Ruby 2.6.3
Rails 6.1.5

## 外部キー制約
references型の特徴
**・外部キー制約がつかない。そのため、foreign_key: trueをつける。
・_idが省略される**

中間テーブルに使用です。

```php:migrate
# 外部キー制約：外部にその値を主キーとして持つ他のテーブルがあること
t.references :chat_room, null: false, foreign_key: true
```


## mapメソッド
中間テーブルのChatRoomUserから、条件を書いて配列を作ることで、
createする際の条件分岐に使用。

ログインユーザーが存在しているチャットルームデータを取得

```php:chat_rooms_controller.rb
 ChatRoomUser.where(user_id: current_user.id).map(&:chat_room)
```

## mapメソッドの省略形
省略する前
```
#map.{|変数名（ブロック引数）|具体的な処理（メソッド）}
 map{|x|x.chat_room}
```
↓
省略形
```
map(&:chat_room)
```

省略するには３つ条件があります。
**・ブロックの引数が１つである**
　　|x|←xの１つのみなので◯
**・ブロックの中で呼び出すメソッドには引数がない**
　　x.chat_roomのうしろに()で引数がないため◯
**・ブロックの中では、ブロック引数に対してメソッドを１個呼び出す以外の処理がない**
 x.chat_roomのメソッド１つのみなので◯



そこから得られる配列のイメージ・・・（間違っていたらすみません）
chat_room_idと書かないのはreferences型のため。
```php:chat_rooms_controller.rb
 ChatRoomUser.where(user_id: current_user.id).map(&:chat_room)

=>[1,4,5,6,7]　#ログインユーザーが存在しているチャットルームid
```

## まとめ
mapメソッドを使用し、配列を組み合わせることで、いろんな条件分岐ができることが分かりました。
git-filter-repoでフォルダー移動をするという歴史改竄をする

# 元ネタ

https://stackoverflow.com/a/72142795/6277384

git-filter-repoというのを知らなかったので、使ってみます。

git-filter-repoとは`git filter-branch`の代替ツールで高速に安全に操作できます。

# やってみた

## 移動するときに同名のファイルが有って衝突するケース

:::note alert
以下簡単のために、`git filter-repo --force`していますが実際には`--force`せずに新たにcloneして実施してください。
:::

```bash
$ cd filter_test/
$ git init
$ echo "aaa" > a.txt
$ ls
$ mkdir foo
$ echo "aaaa" > foo/a.txt
$ echo "aaa" > foo/b.txt
$ echo "aaa" > foo/c.txt
$ ls
$ ls foo/
$ git add a.txt
$ git status
$ git commit -m "init"
$ git add foo/
$ git commit -m "1"
$ echo "bbb" >> foo/b.txt
$ echo "bbb" >> foo/c.txt
$ git status
$ git add foo/
$ git commit -m "2"
$ echo "ccc" >> foo/d.txt
$ echo "ccc" >> foo/c.txt
$ git status
$ git add foo//
$ git status
$ git commit -m "3"
$ echo "ddd" >> foo/d.txt
$ git status
$ git add foo/
$ git commit -m "4"
$ git log --oneline --graph --all
* b26d203 (HEAD -> main, tmp) 4
* ba31090 3
* f44398b 2
* c248b60 1
* 56f1c22 (tmp2) init
$ ls
a.txt  foo/
$ ls foo/
a.txt  b.txt  c.txt  d.txt
$ git filter-repo --force --path-rename foo/:
Parsed 5 commits
New history written in 0.46 seconds; now repacking/cleaning...
Repacking your repo and cleaning out old unneeded objects
HEAD is now at 4196cda 4
Enumerating objects: 16, done.
Counting objects: 100% (16/16), done.
Delta compression using up to 12 threads
Compressing objects: 100% (7/7), done.
Writing objects: 100% (16/16), done.
Total 16 (delta 3), reused 11 (delta 2), pack-reused 0
Completely finished after 1.32 seconds.
$ ls
a.txt  b.txt  c.txt  d.txt
$ cat a.txt
aaaa
$ git log --oneline --graph --remotes --all
* 4196cda (HEAD -> main) 4
* 84e7d81 3
* b793236 2
* 4684caf 1
* 9e1d3cf init
```

```bash
$ echo "aaa" > a.txt
$ echo "aaaa" > foo/a.txt
```

していて、結果が

```bash
$ cat a.txt
aaaa
```

ですから、移動によって上書きされるようです。なので上書きされたくない場合は予め

```bash
$git filter-repo --force --path foo/a.txt --invert-paths
Parsed 5 commits
New history written in 0.34 seconds; now repacking/cleaning...
Repacking your repo and cleaning out old unneeded objects
HEAD is now at f075883 4
Enumerating objects: 19, done.
Counting objects: 100% (19/19), done.
Delta compression using up to 12 threads
Compressing objects: 100% (13/13), done.
Writing objects: 100% (19/19), done.
Total 19 (delta 2), reused 0 (delta 0), pack-reused 0
Completely finished after 1.30 seconds.
```

とかしておくと良いでしょう。
SOQLのサンプル


文字列変数を使う　ポイントは :

```
String kyoten ='006';
List<KojiDaicyo2__c> KojiDaicyo2List = [select Id,Name,KaishiDate__c, from KojiDaicyo2__c where KaishiDate__c <= YESTERDAY AND Eigyousyo__c Like :kyoten + '%'  ];
system.debug(KojiDaicyo2List);     
```

このパターンでは相対日付は使えないと思っていましたが、大丈夫でした。ただの文字列として認識されている感じです。
```
String mySOQL2 = mySOQL + ' KaishiDate__c <= YESTERDAY AND Eigyousyo__c Like \'006%\' order by Tantousya__r.Name';
List<KojiDaicyo2__c> KojiDaicyo2List = Database.query(mySOQL2);
```


# 参考資料

[日付形式と日付リテラル](https://developer.salesforce.com/docs/atlas.ja-jp.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_dateformats.htm)
jetpack composeでdrawableEndCompatを実装したい

# 初めに
今回は、`jetpack compose`でまだサポートしてない`drawableEndCompat`を実装していきたいと思います。

### 実装
まず、初めにお話ししたように`jetpack compose`ではまだ`drawableEndCompat`の実装をサポートしてません(そもそもするようになるのかは不安ですが...)
なので自作していこうと思います。
`compose`に少し触れてる人ならこれかなぁと予想はついてると思います。
では早速書いていきます

```kotlin
ConstraintLayout() {
    val (content, image) = createRefs()
    Box(
        Modifier.constrainAs(content) {
            end.linkTo(image.start)
        }
    ) {
        Text(
            text = "Text",
            modifier = Modifier
                .width(IntrinsicSize.Max)
                .wrapContentHeight(),
        )
    }
    Image(
        painter = painterResource(id = R.drawable.image_resource),
        contentDescription = null,
        Modifier
            .constrainAs(image) {
                top.linkTo(content.top)
                bottom.linkTo(content.bottom)
                start.linkTo(content.end)
            }
    )
}
```
上記だけで実装できます。
付けたい場所によって下記の中身を変えてあげるだけで大丈夫です。
```kotlin
Modifier
    .constrainAs(image) {
        top.linkTo(content.top)
        bottom.linkTo(content.bottom)
        start.linkTo(content.end)
    }
```
また、共通化しておくことで、画像やつける対象、つける場所を選択できるようになるので便利かもしれませんね

### 最後に
自分が`jetpack compose`に本格的に触り始めて実装も進めているので、備忘録兼誰かのお役に立てればと思います。
まだまだ新しい技術なので需要はあると思うので、今後`jetpack compose`に関する記事が増やしていこうかなと思っています。
[UE5] City Sampleのライティングをエディタ上で昼から夜に変える方法

City Sampleの夜景を見たい場合、プレイインしてUIからNight Modeに変更するのが主なワークフローとなりますが、細かく検証する際はいちいちプレイインせずにそのままエディタ上で見れる方が便利かと思います。本記事にて、エディタ上でNight Modeに変更する方法をシェアさせて頂きます。 
**※本件はUE5をお使い頂いている開発者の方から教えて頂き、情報のシェアを快諾して頂きました。この場を借りてお礼も申し上げます！！ありがとうございます！！**


**BP_nightmodeをアウトライナから選択**
このBPに *Is Night*という変数があるのでそちらをONにした際にエディタ上でもNight Modeに切り替えるように、また元に戻せるように設定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/f5e20b3b-ecb0-2ed8-a51b-e1e82cef0bf0.png)

**コンストラクションスクリプトを以下のように作成**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/41b43fd8-9f9c-095d-246b-c68375f93932.png)

これだけで終わりなんですが、ここからDay Modeに切り替える際のいくつか初期値の設定が抜けているので、そちらを追記します。
***Skylight Intensity Init* の値を50.0に**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/6618b4b7-5708-ca35-cf26-52f06f915629.png)

 ***Fog Color Init* の値を23.0, 26.9, 40.0に**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/28e8794f-86cb-51b3-a12c-11ac4415d5f2.png)

***Direction Lighting Intensity Init* を2000に**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/cc4ad107-dc37-4622-4e23-0a3bd347fd3d.png)


**これで準備OKなので、あとはIs NightをONにするだけです**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/bb52ff97-8e24-51ae-afa6-8d6435caa99d.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/c353ef75-5251-51ac-8828-34670ee997dc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/47faf00d-534f-ba47-aee7-cb8a895bd2ad.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/abe89cf7-1c7a-5f8f-d816-eb2fd9342e49.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/57002471-3f57-327a-11de-6c5f50353b42.png)

これでEditor上でNight Modeの切り替えができます。ただし、**シミュレーションをNight Modeのまま開始しようとすると見た目がおかしくなってしまうので、その場合は、Is Night を二回クリックして一度Day Modeに戻してからNight Modeに切り替えると修正されます**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/2561df97-e942-edbd-a113-54252b07e3d0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/2f4d4461-e438-f6c3-de2b-e6b5c672c31a.png)

簡単にですがシェアさせて頂きました。ご参考になれば幸いです！
HTMLタグを超えてキーワードをハイライトするアルゴリズム

## はじめに

HTMLタグを超えてウェブページのキーワードをハイライトさせるアルゴリズムを考えました。
:cherry_blossom:
よくあるのはHTMLタグの内側に限定してキーワードをハイライトさせる方法ですが、HTMLタグを超えてキーワードをハイライトさせるには少し工夫が必要です。:thinking:

## アルゴリズム

簡単な例とともにアルゴリズムを示します。

```html:HTML
<p>
	<span>今日は</span><span>晴れ。</span>
</p>
<p>明日は？</p>
```

HTMLタグを超えてキーワード「今日は晴」をハイライトさせたいとします。

```mermaid
graph TD
    A((A)) --> B((B))
    B --> C((C))
    B --> D((D))
    A --> E((E))
    C -.- CT["今日は"]
    D -.- DT["晴れ。"]
    E -.- ET["明日は？"]
    style CT fill:transparent
    style DT fill:transparent
    style ET fill:transparent
```

ノードの木構造から深さ優先探索でテキストノードの配列`p`を得ます。

```javascript:JavaScript
var p = [{text: '今日は', node: C},
         {text: '晴れ。', node: D},
         {text: '明日は？', node: E}];
```

配列`p`からプロパティ`text`を取り出して結合した文字列`q`を得ます。

```javascript:JavaScript
var q = '今日は晴れ。明日は？'
```

文字列`q`のなかでキーワードが出現するハイライト位置を調べます。

キーワードが「今日は晴」ですので、文字列`q`の位置0から4文字がハイライト位置です。[^1]

配列`p`の値を順番に調べることでハイライト位置をノード上の位置`r`に変換できます。

```javascript:JavaScript
var r = [{node: C, start: 0, end: 3},
         {node: D, start: 0, end: 1}]
```

大切な点は、**文字列`q`とテキストノード上の位置が相互変換できる**ことです。

## ブックマークレットと拡張機能

作ったものはこちらです。

https://raw.githubusercontent.com/querykuma/HighlightSelection/main/highlight_selection_bookmark.js
https://github.com/querykuma/HighlightSelection

上のブックマークレットとしても下のChrome拡張機能[^2]としても使えます。

## （参考）autoHighlighter

[自動でキーワード強調表示させるブックマークレット(autoHighlighter)](https://github.com/querykuma/autoHighlighter)を使用していたのですが、望んでいないキーワードもハイライトされるという悩みがありました。

今回のプログラムは、ハイライトするキーワードを自分で選択できるように改善しました。:heart_eyes:

## さいごに

HTMLタグを超えてウェブページのキーワードをハイライトさせるアルゴリズムを解説し、プログラムを公開しました。

このプログラムが多くの方に使われたら嬉しいです。:airplane:



[^1]: 実際にはキーワードが出現する複数のハイライト位置を得ます。
[^2]: Chrome拡張機能からブックマークレット(JavaScript)を呼び出す形です。
Windows10において、Windows Defenderが起動しなくなった場合の処方箋

# Windows10において、Windows Defenderが起動しなくなった場合の処方箋

ハマったので備忘録がてらに書いておきます。

## 問題の現象

Windows セキュリティ画面を開くと、
「このWindows Defenderリンクを開くには新しいアプリが必要です」
と表示され、以降の操作を受け付けない。

~~そもそもの原因はgeekUninstaller か CCleanderのレジストリクリーニングが原因なので、ハマる人は少ないと思うけど~~
![WindowsDefenderScan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74258/a152169d-3539-5a41-e9c6-4ee0f2bf7dcb.png)

## まずは試してほしいこと
- Windows10環境
Windows Power Shellを管理者権限にて起動して、以下のコマンドを実施
``` 
Add-AppxPackage -Register -DisableDevelopmentMode "C:\Windows\SystemApps\Microsoft.Windows.SecHealthUI_cw5n1h2txyewy\AppxManifest.xml"
```

- Windows 11の場合
``` 
Get-AppxPackage Microsoft.SecHealthUI -AllUsers | Reset-AppxPackage を
```

結果からの憶測だけど、AppManifest.xml内の内容で再度レジスタ値を書き直す処理を実施してる模様j。
デフォルトのフォルダ名であると思われるので、おま環はないとおもうけど、パスエラーとか出てきたら、上記フォルダに
ファイルがあるかをチェックしてください。

## 試したけど無関係だったこと
- PCの再起動

- regeditにてWindows Defenderの無効化設定がされてないかを確認
コンピューター\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender
DisableAntiSpyware がキーとして登録されて居ないことを確認

- PowerShellにて、Windows10から追加された 修復コマンドの実施
``` 
DISM.exe /Online /Cleanup-image /Restorehealth
sfc /scannow
``` 


~~愚痴
こちらのサイト様が中途半端に機械翻訳カマしてるいる所為で、"\"を変な英語に変換しやがったばかりに、
めちゃくちゃなディレクトリを指してしまい、
コマンドは正しいがパスは間違ってるみたいな現象になってて無駄に苦労した~~
https://jp.minitool.com/news/you-need-new-app-to-open-windowsdefender.html

以上、おわり
すべてのデザイナーが参考にするべき構成に関する10のルール

01. 注目するべき点を抑える
02. リード線で直接目線を誘導する
03. 大きさを変え、ヒエラルキーを意識する
04. 要素のバランスを取る
05. 互いに補完する要素を用いる
06. コントラストを操る
07. ある要素を繰り返す
08. 空白部分を活用する
09. 要素の位置を揃える
10. 三分割法を試す

参考
https://www.canva.com/ja_jp/learn/visual-design-composition/
🔰【自分用】Webアプリケーションの基礎を振り返る。

# はじめに
今まで学習したwebアプリケーションの基礎部分を振り返る。
今回も完全に自分用。

# Webアプリケーションとは？
Webアプリケーションとは、名前の通り「Web」で使用される「アプリケーション」のこと。
代表的なwebアプリケーションとしてFacebookやメルカリなどが挙げられる。

### 動的サイト
Twitterのようにユーザーの投稿で表示されるデータが更新されるサイト
Webアプリケーションは、動的コンテンツであることがほとんど。

### 静的サイト
表示されるデータが更新されないサイト。（サイト制作者が更新した場合を除く）

# webアプリケーションを表示する仕組み

### HTTP通信
クライアントとサーバー(webアプリケーションなど)の間に入るインターネットの通信。
クライアント⇄インターネット（HTTP通信）⇄サーバー側（webアプリケーションなど）。

### URL（Uniform Resource Locator）
インターネットのサービスの場所を表す。インターネット上の住所。

イメージとして、HTTP通信は手紙の種類（書留、速達など）、URLは送り先の住所。

### リクエスト
クライアントからデータや情報を要求すること。
例【リクエスト】欲しい情報を要求する。「○○のページを見せてほしい」
クライアント→サーバー

### レスポンス
リクエストに対応するデータや情報を返却すること。
例【レスポンス】欲しい情報を要求する。「○○のページ情報を返す」
クライアント←サーバー

### クライアント
Webアプリケーションなどのサービスを利用する側。使用する人々。

### クライアントサイド
webアプリケーションを利用する側。
クライアントが利用する領域。webアプリケーションの見た目や表示するブラウザを指す。
使い勝手を考えることを専門とするエンジニアをクライアントサイドエンジニア又はフロントエンドエンジニアと呼ぶ。

### サーバー
画面の無いPC。
世界中のどこかに置いてあるサーバーの中に情報が保存されていて、そこに対してインターネットを介して通信することで、サービスが利用できる。

### サーバーサイド
webアプリケーションが存在する側。
実際にWebアプリケーションが存在する領域のこと。データなどもサーバーサイドに保存される。
サーバーサイドにあるWebアプリケーションの仕組みを専門とするエンジニアは、サーバーサイドエンジニアと呼ばれる。

#　サーバーの種類
サーバーサイドの中身は３つに分けられる。
| サーバー名 | 役割 |
|:-|:-|
| アプリケーション・サーバー  | Webサーバーを通して受け取ったリクエストを処理し、HTMLなどをウェブサーバーへ返却する |
| ウェブサーバー  | リクエストを処理し、レスポンスを返却する  |
| データベース・サーバー  | アプリケーションで使用するデータを管理する  |

### データベース
情報の集合体。データの集まり。
そのデータ自体の保存や検索を可能にし、それらを迅速に実行する役割がある。
動的コンテンツは常にデータが蓄積され、そのデータを表示することで成り立つコンテンツ。
データが集積しているデータベースが必要不可欠。

# 終わりに
簡単だが、webアプリケーションの基礎部分を自分なりにまとめた。
良い振り返りになった。
nuxt/contentを使ってブログを作ったときのsitemap.xmlの作り方

## nuxt/contentモジュールを使って静的なブログを作った時の、sitemap.xmlの作り方。

### 1. @nuxtjs/sitemapを入れる

```
yarn add @nuxtjs/sitemap
```

### 2. nuxt.config.jsへ追記

頭に追記
```nuxt.config.js
import getRoutes from "./utils/getRoutes";
```

お尻に追記
```nuxt.config.js
export default {
  ...(略)
  sitemap: {
    hostname: process.env.BASE_URL || 'https://example.com/',
    routes() {
      return getRoutes();
    },
  },
}
```

### 3. utils/getRoutes.jsを追加

```getRoutes.js
export default async () => {
  const { $content } = require("@nuxt/content");
  const files = await $content({ deep: true }).only(["path"]).fetch();

  return files.map((file) => (file.path === "/index" ? "/" : file.path));
};
```

### 完了

これで、yarn generateしたときにcontent/ 以下にあるブログ記事が自動的にsitemap.xmlへ追加されます。かんたんですね。

## 参考

https://redfern.dev/articles/adding-a-sitemap-using-nuxt-content/