OmniAICreator/Qiita-1.07M huggingface dataset:
teradatamlデータフレームからデータを抽出する

[Teradata® Package for Python Function Reference](https://docs.teradata.com/r/Teradata-Package-for-Python-Function-Reference/April-2022) [リリース番号：17.10　リリース日付：2022/4]の翻訳です。

# はじめに
Pythonでteradatamlデータフレームからデータの抽出方法について説明します。
ライブラリとして[teradataml](https://pypi.org/project/teradataml/)を利用します。

:::note info
**teradataml**はTeradata Vantage用のPythonライブラリです。
:::

# 基本操作
## Vantageに接続する
```python:python code
# 接続用ライブラリの宣言
import teradataml as tdml
# データベース接続
tdml.create_context(host = "IPアドレス",username='ユーザ名',password='パスワード')
```

## テーブルを指定してデータを取得する
```python:python code
# Customerテーブルのデータをteradatamlデータフレームに読み込む
teradataml_iris = tdml.DataFrame.from_table("iris_table")

## データフレームの中身を確認
teradataml_iris
```

<details><summary>結果を表示</summary>

```
     sepallength  sepalwidth  petallength  petalwidth      target
idx                                                              
122          7.7         2.8          6.7         2.0   virginica
116          6.5         3.0          5.5         1.8   virginica
91           6.1         3.0          4.6         1.4  versicolor
143          6.8         3.2          5.9         2.3   virginica
95           5.7         3.0          4.2         1.2  versicolor
11           4.8         3.4          1.6         0.2      setosa
10           5.4         3.7          1.5         0.2      setosa
125          7.2         3.2          6.0         1.8   virginica
35           5.0         3.2          1.2         0.2      setosa
43           5.0         3.5          1.6         0.6      setosa
```
</details>

## (1)インデックスオペレータを使用したデータの取得。
```python:python code
# 条件を指定して結果を取得します。
teradataml_iris[teradataml_iris.idx == 10].select(['idx','target'])
```

<details><summary>結果を表示</summary>

```
     target
idx        
10   setosa
```
</details>

## (2)locオペレータを使用したデータの取得。
```python:python code
# 条件を指定して結果を取得します。
# 条件を指定して結果を取得
teradataml_iris.loc[teradataml_iris['idx'] == 10].select(['idx','target'])
```

<details><summary>結果を表示</summary>

```
     target
idx        
10   setosa
```
</details>



## Vantageから切断する
```python:python code
# データベース切断
tdml.remove_context()
```

# おわりに
:::note warn
警告
この本書は[Teradata Vantageドキュメンテーション](https://docs.teradata.com/)よりトピックに必要な情報を抜粋したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

## Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
LINE広告用の電話番号ハッシュ化をBigQueryで行う

LINE広告では電話番号を使ってオーディエンスを作成できます。
生の電話番号を使うこともできますが、セキュリティを高めるためにハッシュ化された電話番号を使うこともできます。

https://www.linebiz.com/jp/manual/line-ads/tracking_010/

BigQueryに保存されている生の電話番号からLINE広告用のハッシュ値を生成する方法をまとめます。
まず以下のようなハイフン付きかつ国番号なしの電話番号を入力例とします。

`080-1234-5678`

最初にこれを `+818012345678` のようなハイフン無しかつ国番号ありの形式に変換します。

```sql
'+81' || ltrim(replace(tel, '-', ''), '0')
```

これで電話番号がLINE広告の求めているフォーマットになりました。
その後ハッシュ化を行います。
ハッシュ化の方式はSHA-256と指定されているので、sha256関数を使ってハッシュ値を求めます。
最後に、この関数の返り値はBYTE型なので、これを16進数文字列に変換するためにto_hex関数を使います。

ここまでの処理をすべてまとめると、以下のようになります。

```sql
to_hex(sha256('+81' || ltrim(replace(tel, '-', ''), '0')))
```
【WordPress】アップロードファイルの容量上限の増やし方

ローカル環境で構築したWordPressを本番環境に反映させるときや、本番環境をローカル環境で構築する時に「All-in-One WP Migration」でエクスポートしたファイルをインポートしているのですが、ファイル容量上限をオーバーしていてエラーメッセージが表示されアップロードできません。

アップロードファイルの容量上限を変更可能なので、上限を上げてアップロードしていきます。

## 「.htaccess」ファイルを更新する

サーバーがApacheを利用している場合 `.htaccess` ファイルを変更することでアップロードファイルの容量を変更可能です。

WordPressのアップロードに関する挙動は次の3つのPHPディレクティブが制御しています。

- `upload_max_filesize`
- `post_max_size`
- `memory_limit`

`wp-base/wp/.htaccess`ファイル内に以下を追記します。

```php
php_value upload_max_filesize 500M
php_value post_max_size 500M
php_value memory_limit 500M
```

上記の場合、アップロード上限が500MBに変更されます。

主にローカル環境でアップロードファイルの容量上限を変更する場合はこれで対応しています。

## ****「php.ini」ファイルを更新する****

php.iniファイルでは、PHPの初期設定への変更を定義することができます。

```php
upload_max_filesize=500M
post_max_size=500M
memory_limit=500M
```

上記の場合、アップロード上限が500MBに変更されます。

主に本番環境などで管理画面からアップロードファイルの容量上限を変更する場合はこれで対応しています。

管理画面から「php.ini」ファイルを更新する方法は↓

comming soon

## おわりに

ファイルのアップロードサイズ上限はセキュリティと効率のために設定されています。

目的のファイルアップロードが完了したらもとの上限に戻しておくこと！

## 参考

- ****[WordPressサイトのファイルアップロードサイズ上限を引き上げる方法](https://kinsta.com/jp/blog/increase-max-upload-size-wordpress/#htaccess)****
- ****[php.iniを管理画面から編集するWordPressプラグイン](https://wp-customize.net/wordpress/7457.html)****
Azure Administrator(AZ-104)：Azure管理者向けの前提条件「ARMテンプレートスキーマ」

Microsoft Learnを用いたMicrosoft Azure Administrator(AZ-104)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始め、AZ-900取得後の資格としてAZ-104取得を目指している方の参考になれば幸いです。
※AZ-900の内容は本投稿では省略しております。再度復習したい方は下記をご参照ください。
[Azure Fundamentals(AZ-900)：試験合格に向けた学習内容のまとめ](https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8)

## 今回の学習内容
**◆「ARMテンプレートスキーマ」**
◇対応するMicrosoft Learn ラーニングパス
[AZ-104:Azure 管理者向けの前提条件](https://learn.microsoft.com/ja-jp/training/paths/az-104-administrator-prerequisites/)
◇対応するモジュール
[Azure Resource Manager テンプレート スキーマについて詳しく知る](https://learn.microsoft.com/ja-jp/training/modules/configure-resources-arm-templates/3-explore-template-schema)

※前回の投稿は下記から確認できます。
[Azure Administrator(AZ-104)：Azure管理者向けの前提条件「リソースプロバイダーとリソースの移動」](https://qiita.com/fsd-jume/items/a23b7a3cdfb21fbf229d)

## ARMテンプレートスキーマ
### ARMテンプレート
**JSON(JavaScript Object Notification)で記述**
⇒キーと値のペアで構成されている
・各キーは文字列
・値で利用できるデータ型
　-文字列(string)
　-数字(int)
　-ブール式(bool：true/false)
　-値の一覧(array：配列)
　-オブジェクト(object)※JSONデータの中にJSONデータを含む入れ子構造のイメージ

### ARMテンプレートファイル構造
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/875e17d3-a57e-cdf6-f7c9-9ad76add57e3.png)

## 次の学習内容
**◆ARMテンプレートのパラメーター**

https://qiita.com/fsd-jume/items/e05bb275eba9f299a2f5

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

https://qiita.com/fsd-jume/items/6eda24728c9c03c36bc3
udacityのflutterコースが開けない

udacityのHelpに書いてました。
コースが非推奨なので、意図的にカタログページにリダイレクトしているらしい。
> I checked with the relevant team, the course redirects to the catalog page on purpose since this course is deprecated.

https://udacity.zendesk.com/hc/en-us/community/posts/8361007127437-IMPORTANT-flutter-course-page-not-found
二重Y軸グラフを表示する(SPSS Modeler データ加工逆引き10-11)

# 　二重Y軸グラフを表示する（新グラフ）

![スクリーンショット 2022-11-24 13.27.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/77d9bec1-3148-fe89-ed78-6c0aa2b9eee1.png)

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

・ばらつきのあるグループの比較


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

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

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

![スクリーンショット 2022-11-24 13.30.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ed6e6912-cd0b-3608-c365-e78db2da3cf6.png)

入力するデータを確認するため[テーブル]を実行します。
<img width="400" alt="スクリーンショット 2022-01-12 10.02.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e1063356-5b8e-0f69-2425-a9e826acf08b.png">

参考までにIBM SPSS Statisticsで二重Y軸グラフを表示します。Modelerには該当機能が存在していませんでした。
![スクリーンショット 2022-11-24 13.53.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9822fef2-d9da-c9b1-245a-1bf6c5a097ef.png)

<img width="400" alt="スクリーンショット 2022-01-12 10.02.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a4f30220-10fa-133c-e74f-9500ecca6278.png">


[置換]ノードを右クリックして[データの表示]を選択します。
![スクリーンショット 2022-11-11 14.15.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/1ef9f2d0-77cb-20ba-4894-df147b7e4b05.png)

二重Y軸を選択します。
![スクリーンショット 2022-11-24 14.06.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6d45d3c9-1cc0-97f5-85ba-acfde447d1d4.png)

以下の画面左の設定に従いセットします。

![スクリーンショット 2022-11-24 12.49.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6ac77584-585b-3485-a239-119e51e168bc.png)

![スクリーンショット 2022-11-24 12.50.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/40375e72-18a5-3356-7365-2d7d9807aa1d.png)


#### 注意事項

新グラフ機能はバージョン18.1以降で装備されました。

## 4.参考情報

#### 新グラフを解説した記事

https://www.ibm.com/blogs/solutions/jp-ja/learn-modeler-04/

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

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

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

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
DVCインストールエラー対処方法： fatal error: git2.h: No such file or directory

<!--
title: DVCインストールエラー対処方法： fatal error: git2.h: No such file or directory
tags: MLOps, DVC
-->

# はじめに
データセットのバージョン管理で[DVC](https://dvc.org/)を利用しています。先日AWSのEC2インスタンスにインストールしようとしたら想定外のエラーが出て苦慮しました。その時の対応方法をtipsとして残しておきます。

# エラー発生状況
サーバ環境は次の通りです。
- EC2 Ubuntu Server 20.04 LTS
- Python 3.8.10

この環境でpip経由でDVCをインストールを試みた際にエラーが発生しました。
```sh:DVCのインストール
pip install DVC
```
```log:エラーメッセージ
  Building wheel for pygit2 (PEP 517) ... error
  ERROR: Command errored out with exit status 1:
   command: /usr/bin/python3 /tmp/tmpkyfs_98m build_wheel /tmp/tmpmwd9eqhx
       cwd: /tmp/pip-install-j2c4g7kr/pygit2
  Complete output (66 lines):
  ・・・＜中略＞・・・
  In file included from src/blob.c:30:
  src/diff.h:33:10: fatal error: git2.h: No such file or directory
     33 | #include <git2.h>
        |          ^~~~~~~~
  compilation terminated.
  error: command '/usr/bin/x86_64-linux-gnu-gcc' failed with exit code 1
  ----------------------------------------
  ERROR: Failed building wheel for pygit2
```

DVCの依存パッケージであるpygit2のインストールができずにエラーとなっていました。この状態が発生した場合、`pip install pygit2` を実行しても同じエラーメッセージが表示されます。このエラーがなぜ発生するのか、原因までは分かりませんでした。

# エラー回避方法
aptリポジトリからのインストールで回避できました。実は[DVCの公式ドキュメント](https://dvc.org/doc/install/linux#install-from-repository)にも掲載されているのですが、案外読み過ごしちゃいますので、こちらでも記載します。
```sh:aptリポジトリからのインストール
sudo wget https://dvc.org/deb/dvc.list -O /etc/apt/sources.list.d/dvc.list
wget -qO - https://dvc.org/deb/iterative.asc | gpg --dearmor > packages.iterative.gpg
sudo install -o root -g root -m 644 packages.iterative.gpg /etc/apt/trusted.gpg.d/
rm -f packages.iterative.gpg
sudo apt update
sudo apt install dvc
```

インストール完了後に以下のコマンドを入力して、バージョン番号が返ってくればインストール成功です。
```sh
dvc -V
```
Nios V Command Shell を使いやすく変更してみる（Windows Power Shell で起動）

# 概要
インテルの RISC-V ソフトコアプロセッサー（ Nios V ）の開発環境に関する投稿です。
先日リリースされた Quartus Prime 22.1 Standard Edition により、Low Cost の FPGA デバイスでも気軽に Nios V が試せる状況になりました。早速、Windows 版をインストールして試してみましたが、個人的にどうしても使いずらいと感じてしまう点が１つありました。

『 Nios V Command Shell というコマンドターミナルが、Windows のコマンドプロンプト相当の環境になっている。。 』

色々と模索してみた結果、Windows Power Shell 上でも Nios V Command Shell が動作することが判ったので、その方法を紹介します。
コマンドプロンプトが苦手な方は、Power Shell ベースに変えることで劇的に使いやすくなる？かもしれません。

:::note info
今回試したツール環境は下記です。
[Intel® Quartus® Prime Standard Edition Design Software Version 22.1 for Windows](https://www.intel.com/content/www/us/en/software-kit/757236/intel-quartus-prime-standard-edition-design-software-version-22-1-for-windows.html)
:::
:::note warn
この記事で紹介する内容は非公式なので自己責任でお試しください。
（こちらで試した限りでは問題無く動作しています）
:::

# もくじ
* [Nios V Command Shell とは？](#nios-v-command-shell-とは)
* [試した内容：Windows Power Shell で起動するための変更](#試した内容windows-power-shell-で起動するための変更)
* [変更前後の違い：ターミナルの挙動の比較](#変更前後の違いターミナルの挙動の比較)
* [まとめ](#まとめ)

<a id="anchor1"></a>
# Nios V Command Shell とは？
Nios V を使用した開発に使用するコマンドラインツール実行用のターミナル環境です。Nios II 向けの Nios 2 Command Shell や、SoC FPGA 向けの Embedded Command Shell と同じような位置づけの環境です。

Nios V の開発で使用するコマンドラインツール（コマンド）の一覧は以下のドキュメントに記載されていました。
https://www.intel.com/content/www/us/en/docs/programmable/726952/22-1std-1-0-0/intel-fpga-embedded-development-tools.html

<a id="anchor2"></a>
# 試した内容：Windows Power Shell で起動するための変更
さっそくですが、私が試した内容は以下の通りです。

* 編集対象ファイル：
C:\intelFPGA\22.1std\niosv\bin\niosv-shell-files\main.py

* 編集内容：
77行目以降の run_shell という関数の中でコマンドプロンプト（cmd.exe）のパスが記述されています。
この 1 行を以下のように Windows Power Shell のパスに変更するだけです。
```python:編集前
        shell = "C:\Windows\System32\cmd.exe"
```

```python:編集後
        shell = "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe"
```

:::note warn
パスの区切りを２回繰り返し `\\` で記述する点がポイントです。
最初は cmd.exe と同じように `\` で記述しましたが、それでは Power Shell が起動しませんでした。（デバッグしてみると shell 変数（パスの途中）が文字化けした状態となっていました。）
:::

:::note info
編集したソースのコメントに以下の一文がありました。将来のバージョンでは Power Shell が標準になる可能性も期待できそうです。
`     # Notes for using CMD/powershell - currently just CMD.exe.`
:::

<a id="anchor3"></a>
# 変更前後の違い：ターミナルの挙動の比較
参考までに、挙動の違いを画像で紹介します。実際にツールを触ってみると違いが実感できるかと思います。

## 変更前：コマンドプロンプトベースの Nios V Command Shell（標準の環境）
![NiosVShell_CMD.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725222/1fee63a7-3924-7c5f-16cc-f667fb0711cd.gif)
コマンドプロンプトの方は、TAB キーでコマンド名を補完する機能は使えませんでした。添付画像で TAB キーで補完されてみえているのは、カレントディレクトリーにあるファイルやフォルダーの名前のみでした。（画像を作った後に気が付きました..）

## 変更版：Windows Power Shell ベースの Nios V Command Shell  
![NiosVShell_PS.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725222/e9e77579-76ea-5606-5b6b-c8704cfd6f44.gif)
TAB キーでコマンドやファイル名が補完されるようになりました。個人的には使いやすくなって満足です。

<a id="anchor4"></a>
# まとめ
今回紹介した内容は、コマンドプロンプトに慣れた方にとってはどこが使いずらいの？という話だったかもしれません。私と同じくコマンドプロンプトの操作が苦手で、Windows 環境でコマンド操作も多用したい方は参考にしてみてください。

最後に、Linux 版も試してみましたが、そちらは bash 等の Linux ターミナルの操作感なので何のストレスも無く使えました。日頃から慣れ親しんだ環境に近いかどうか、好みの問題も大きいと感じた次第です。
rubyのStringクラスの組み込みメソッドを層別してみた

>どうもaono1234と申します。記事がいいなと思ったらtwitterのフォローもお待ちしております‼
https://twitter.com/takeshi_program

みなさんは組み込みメソッドという存在はご存じでしょうか？
組み込みメソッドとは自分で定義しなくてもデフォルトで使えるようになっているメソッドの集合です。
rubyの場合、stringクラス、arrayクラス、hashクラスなど、各クラスで使える組み込みメソッドが違います（共通のものもあります）

例えばstringクラスだけでも以下↓の数だけあります。
https://docs.ruby-lang.org/ja/latest/class/String.html

使えると便利なのかもしれませんが、覚えるのが大変そうですね…🥺

覚えるための一助となればと思い、stringクラスの一部のメソッドだけではありますが私なりにmiroというアプリで層別してみましたので、
よかったらご覧下さい。



### miro URL
https://miro.com/app/board/uXjVPHfC2SM=/?share_link_id=840118422501

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534058/671290ca-0ad3-844d-4219-982a8e1bd08f.png)
時系列データを３分割(訓練、検証、テスト)する方法

# 読み込み
train = pd.read_csv(os.path.join(Input, "train.csv"))
test = pd.read_csv(os.path.join(Input, "test.csv"))

df_data= pd.concat([train.assign(ind="train"),test.assign(ind="test")], sort=False)
df_data.date_time = pd.to_datetime(df_data.date_time)
df_data=df_data.set_index('date_time')

test, train = df_data[df_data["ind"].eq("test")], df_data[df_data["ind"].eq("train")]
test.drop(['ind'],axis = 1,inplace = True)
train.drop(['ind'],axis = 1,inplace = True)
df_data.reset_index()

CO_features = [feature for feature in train.columns if feature not in ('target_carbon_monoxide')]
benzene_features = [feature for feature in train.columns if feature not in ('target_benzene','target_carbon_monoxide','target_nitrogen_oxides')]
NOx_features = [feature for feature in train.columns if feature not in ('target_benzene','target_carbon_monoxide','target_nitrogen_oxides')]


# 学習データを2010-03-10 18:00:00〜2010-12-31 23:00:00の期間としX_trainに入力する
X1 = train[CO_features].copy()
y1 = train.target_carbon_monoxide.copy()
X2 = train[benzene_features].copy()
y2 = train.target_benzene.copy()
X3 = train[NOx_features].copy()
y3 = train.target_nitrogen_oxides.copy()
X1_train = X1['2010-03-10 18:00:00' : '2010-12-31 23:00:00']
y1_train = y1['2010-03-10 18:00:00' : '2010-12-31 23:00:00']
X2_train = X2['2010-03-10 18:00:00' : '2010-12-31 23:00:00']
y2_train = y2['2010-03-10 18:00:00' : '2010-12-31 23:00:00']
X3_train = X3['2010-03-10 18:00:00' : '2010-12-31 23:00:00']
y3_train = y3['2010-03-10 18:00:00' : '2010-12-31 23:00:00']

# 検証データを2011-01-01 00:00:00としてとしてX_validに入力する
X1_valid = X1['2011-01-01 00:00:00' :]
y1_valid = y1['2011-01-01 00:00:00' :]
X2_valid = X2['2011-01-01 00:00:00' :]
y2_valid = y2['2011-01-01 00:00:00' :]
X3_valid = X3['2011-01-01 00:00:00' :]
y3_valid = y3['2011-01-01 00:00:00' :]

# testデータを2011-01-01 01:00:00以降としてとしてX_testに入力する
X1 = df_data[CO_features].copy()
y1 = df_data.target_carbon_monoxide.copy()
X2 = df_data[benzene_features].copy()
y2 = df_data.target_benzene.copy()
X3 = df_data[NOx_features].copy()
y3 =df_data.target_nitrogen_oxides.copy()

X1_test = X1['2011-01-01 01:00:00' :]
y1_test = y1['2011-01-01 01:00:00' :]
X2_test = X2['2011-01-01 01:00:00' :]
y2_test = y2['2011-01-01 01:00:00' :]
X3_test = X3['2011-01-01 01:00:00' :]
y3_test = y3['2011-01-01 01:00:00' :]
【Swift】手動でSPMをインポートする

# はじめに
この方法に意味があるのか知りませんが、なんか出来たので記録しておきます。

# 使用するライブラリ
今回はこちらのライブラリで試してみます。

https://github.com/SwiftUIX/SwiftUIX

# 方法
SPMに対応しているライブラリをダウンロードします。
もしくは、ローカルにクローンします。
今回はダウンロードしてみました。
![スクリーンショット 2022-11-29 22.01.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/85ffb508-ed97-5bcd-4f50-9d92fd8875e8.png)

ダウンロードした場合はZipを解凍します。
![スクリーンショット 2022-11-29 22.04.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/4996acc2-4e63-ed58-5e2f-694d40403b62.png)

解凍したフォルダをXcodeにドラッグします。
![スクリーンショット 2022-11-29 22.05.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/477e31e1-4a35-231e-a94e-c4f0a4d02997.png)

っぽいのがXcode内に現れました
![スクリーンショット 2022-11-29 22.06.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/cd826e22-3ec4-85fe-b960-197f102620b1.png)

① プロジェクトを選択します
② ターゲットを選択します
③ 「General」を選択します
④ 「Frameworks, Libraries, and Embedded Content」の`+`を押します
![スクリーンショット 2022-11-29 22.07.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/87d92802-230a-e1f5-4af8-77603a0ef608.png)

先ほどXcodeにドラッグしたライブラリを選択して「Add」を押します
![スクリーンショット 2022-11-29 22.11.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/6c18e047-cecb-1808-87b8-5c2b969e2f31.png)

SwiftUIXが使えるようになりました！！
![スクリーンショット 2022-11-29 22.13.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/dfa335b1-c0ce-1172-34a4-1707e4750cd0.png)

# おわり
こんなやり方知りませんでした笑
phpでファイルを一行ずつ読み込む最も簡単な方法<追記>

## はじめに
今年もやってまいりました、qiitaさんのアドベントカレンダー。
といっても初参加ですが…

今回はphpでテキストファイルを一行ずつ読み込みたい時の簡単な関数を紹介しますよう。

## きっかけ
この前、ちょっとしたサーバー上の制約からbatファイルでデータを保存しなければならないことがありました。
その時の副産物でございます。

## 関数
```php
function file_get_contents_line($file_name){
    if(!(isset($file_name))){
        return array('error.');
    }else{
        $file_name_in = file_get_contents($file_name);
        $file_name_in = str_replace(array("\r\n", "\r", "\n"), "\n", $file_name_in);
        return explode("\n", $file_name_in);
    }
}
```

## 使い方
```file_get_contents_line("file_no_namae_wo_nyuuryoku_suru.txt");```
返り値として、一行ごとに分かれた配列が返ってきます。
```テキストファイル
アイウエオ

牡蠣くえこ
```
```返り値
array(3) {
  [0]=>
  string(15) "アイウエオ"
  [1]=>
  string(0) ""
  [2]=>
  string(15) "牡蠣くえこ"
}
```


## 用途
応用すれば、データベースとしてファイルを使用できるかもしれませんね
ただ、sqlのデータベースに比べると同時接続に弱いと言う難点があるので、fileロックをしてから書き込んだ方が良いかもしれません。

## 追記
コメントにて、 @takaram 様にご指摘いただきました。
今回わざわざ関数を作ってしまいましたが、元々phpにはそれができる関数があるとのことでした。
それが```file($file_name, FILE_IGNORE_NEW_LINES);```です。
これをすることで、返り値が改行で区切られて出力されます。
姿勢推定を用いて腕立てを応援してくれるおもちゃを作ってみた！

腕立て伏せを応援してくれるアプリです。
筋トレをしてかっこいい体になりたいのでAIの力を借りようと思います。

# はじめに
腕立て伏せを3回するごとに黄色い声援で応援してくれるアプリを作りました。
![sample_pushup.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952830/e3cfa8fb-25a4-8f85-1795-39ea13c34542.gif)

ソースコードはこちら↓
https://github.com/Kentea-Watanabe/push_up_count

# 使うもの
- MediaPipeのPoseを使用します。
- playsoundで音声を扱えます。
- [効果音ラボ](https://soundeffect-lab.info/sound/voice/people.html)でフリー音源を使わせてもらいました。

# MediaPipe
Poseを使うと全身の33か所を検出してくれます。
公式ページから以下のようにIndexの番号が決まっています。

![pose_tracking_full_body_landmarks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952830/a1eb62e8-d4f0-3877-73e3-f5d85c2caeec.png)


33か所の座標情報はこんな風に格納される。
```python
landmark {
  x: 0.6190348863601685
  y: 0.7434951066970825
  z: -0.7935404181480408
  visibility: 0.9996245503425598
}
landmark {
  x: 0.6465774178504944
  y: 0.6267579197883606
  z: -0.7744203805923462
  visibility: 0.9992997646331787
}
landmark {
  x: 0.6661152243614197
  y: 0.6248564124107361
  z: -0.7743856906890869
  visibility: 0.9992523193359375
}
```

各ランドマークは、以下で構成されるみたい。
- x : ランドマークのX座標（[0.0、1.0]）
- y : ランドマークのY座標（[0.0、1.0]）
- z : ランドマークの深度。腰の中点を原点として、値が小さいほどカメラに近くなる。全身モードでのみ予測される。（[0.0、1.0]）
- visibility : 画像表示（存在し遮られていない）の可能性（[0.0、1.0]）。

# 腕立てをどのように定義するのか

手のひらの位置と肩の位置が近くなったら腕立ての回数を増やすことにします。
Indexで言うと、19と11の距離が短くなったら腕立ての成功としました。

```python
if results.pose_landmarks:
      for idx, landmark in enumerate(results.pose_landmarks.landmark):
        if idx == 11:  # 左肩
            left_shoulder = landmark
        if idx == 19:  # 左手
            left_index = landmark
            # 2点間の距離を求める
            distance = math.sqrt((left_shoulder.x - left_index.x)**2 + (left_shoulder.y - left_index.y)**2)

```

全frameに推論かけるとエグいことになるので...。
```python
fps = cap.get(cv2.CAP_PROP_FPS)
max_inference = fps * 2
push_up_cnt = 0
frame = 0

while cap.isOpened():
    frame +=1
# 省略 ##############################################
    # max_inferenceに到達したら推論をかける
    if frame > max_inference:
        if distance < 0.15:
            push_up_cnt += 1
            # frame数の初期化
            frame = 0
            print('push up success', f'cnt : {push_up_cnt}')

```

# ダイエットのための工夫
playsoundを用いて、腕立てを3回成功するたびに、黄色い声援を送ります。
[効果音ラボ](https://soundeffect-lab.info/sound/voice/people.html)から応援されたいサウンドを取得してきます。

```pushup_app.py
from playsound import playsound

if frame > max_inference:
    if distance < 0.15:
        push_up_cnt += 1
        # 黄色い声援の追加
        if push_up_cnt % 3 ==0:
            playsound("sound\sample_sound.mp3")
```


# 最後に

他にも、音声の種類を増やしたり、スクワットでも同じAIを作ろうと思います。
要件定義の秘訣:ステークホルダーの整理

プロジェクトで失敗する原因の多くは、スコープを見誤っている事にある。
そもそも、スコープを明確化できてない事が多い。
プロジェクトのスコープを洗い出す手法論を持ってない、その手段を知っている人が少ない。
不十分な要件定義も不十分なスコープ定義も同じ様なものだ。

![プロジェクト失敗の原因](https://mmth.pro/wp-content/uploads/2019/07/59c0d632e87339a8b03008d3d3503aa3.png "プロジェクト失敗の原因")

# PMBOK
PMBOKの話で言う所の9つの観点。
１．スコープ(プロジェクトの目的と範囲)
２．時間
３．コスト
４．品質
５．人的資源
６．コミュニケーション
７．リスク
８．調達
９．統合管理
の一番目のスコープの話です。

# スコープ定義のやり方
先ずは、スコープをどう定義するかで言うと、ほとんどの人の間違いは、機能、サービスを切り口にスコープを定義しようとしている。
そうではなくて、利害関係者（**ステークホルダー**)別に目的の洗い出しする事が大事です。
機能やサービスベースでの洗い出し方の悪い点は、
１．利害関係者の目的がはっきりしてないので、後々、仕様変更が発生する可能性が高い
２．利害関係者の目的がはっきりしてないので、利害関係者の協力が得られにくい
というのがあります。
逆に、利害関係者で定義すると
１．最初に利害関係別に目的を明確化するので、利害関係者全てがＷＩＮ－ＷＩＮになるための要件が明確になるため、要件定義がスムーズに行える
２．利害関係者の目的が明確なので、非常に協力的になる

スコープ定義の際に参考にしてみてください

# 最後に
今後も続けていきますので、フォロー、イイね、シェアお願いします。
下記、説明会もご参加下さい。
[エンジニア年収アップ講習(転職サポート付き！)　無料説開会　12月6日　19時開催](https://cto-can-be.hp.peraichi.com/)
z-score normalization (python での実装コードあり)

# z-score normalization とは

下記の式で表現され

$$
\tilde{x} = \dfrac{x-\bar {x}}{\sigma}
$$

$\bar{x}$は平均、$\sigma$は標準偏差を表す。
この標準化方法はそれぞれの値が平均からどれだけ離れているかをばらつき（標準偏差）で補正してあげることで、**単位が異なる数値同士を比較できる**ようになる。

例えば...
体重(kg)と身長(cm)を比較したい時などに **z-score normalization** を使うことで比較が容易になる。

||身長|Z-score(身長)|体重|Z-score(体重)|
|----|----|----|----|----|
|A|170|0|70|-1.225|
|B|160|-1.225|90|1.225|
|C|180|1.225|80|0|

z-score はデータを平均 : 0, 標準偏差 : 1 にスケールするので、そこからわかることは
- A の人は身長が平均ちょうどで、体重が比較的軽い
- B の人は身長が比較的低く、体重が比較的重い
- C の人は身長が比較的高く、体重が平均ちょうど
### 補足 (実装コード)
##### 標準偏差
$$
\sigma = \sqrt{\frac {1}{n} \sum_{i=1}^{n} (X_i - \bar{X})^2}
$$

##### 実装コード

scikit_learnの読み込み　＆ 標準化ライブラリの読み込み
numpy の読み込み

```

import sklearn
from sklearn.preprocessing import StandardScaler
import numpy as np

```
データの用意
```
df_height = np.array([[170], [160], [180]])
df_weight = np.array([[70], [90], [80]])
```
それぞれを z-score normalization 処理 
```
df_height_norm = scaler.fit_transform(df_height)
df_weight_norm = scaler.fit_transform(df_weight)
```
確認
```
print(df_height_norm)
print(df_weight_norm)
```
出力結果
（上から３つが身長のz-score、４つ目からが体重のz-score)
[[ 0.        ]
 [-1.22474487]
 [ 1.22474487]]
[[-1.22474487]
 [ 1.22474487]
 [ 0.        ]]
AAudioを簡単に使う方法

　今年の４月～、Androidスマホアプリのプログラミングに着手し、年明けにGooglePlayにリリースできるところまで漕ぎつけた。この開発を通じて、サウンド系やシューティングゲーム系アプリを、Android系のスマホ（GooglePixelなど）で作る場合、AAudioというAPIが必須となることがわかった。いわずもがな、iOS系のスマホ（iPhone）では不要だ。

　さて、AAudioとは、音の発音遅延を数十m秒レベルに短縮（低レイテンシ化ともいう）するものであり、（遅きに失した感はあるが）Androidバージョン8から導入された。これを使うにあたり、AAudioのテンプレートとでもいうサンプル（oboe）が公開され、これを下敷にすれば、当方のようにアプリ系プログラム初挑戦者でも、低レイテンシのアプリが楽に作れてしまう。

　このコラムでは、これからAndroidに挑戦される方に向けて、AAudioの簡単な使い方をまとめた。基本マニュアルは、やはりGoogle純正のサイトを教科書にした方がよい。ここには、アプリ開発ツールであるAndroidStudioのダウンロードの仕方から始まり、GooglePlayにアプリをアップするまでの、一連の開発プロセスについて説明されている。もちろんAAudioの紹介もある。

　それでは、以下に手順をまとめる。

■AndroidStudioをダウンロード／PC上にprojectフォルダを作成。【要注意】Cドライブ（システム領域）に作ってはダメだ。Dなど空領域の大きいドライブに作るべし！

■gitHubからoboeを取得し、projectフォルダに置く。

■oboe内のLiveEffectサンプルを利用。LiveEffectは、マイク入力→スピーカ出力を行うテンプレートなので、音声系の楽器アプリや、ボイスチェンジャーを開発するために格好のサンプルである。

■AndroidStudioにおいて、ファイル→新規→インポート→oboeのファイル直下のsamples（ドロイドアイコン）を選択すると、自動でLiveEffectが展開される。

■LiveEffect内のcppフォルダ内にある、「FullDuplexPass.h」というクラスファイルの46行目に、//do some arbitrary processingというコメントが記載された行があるが、これが「マイク入力ストリームを音量ダウンし、スピーカ出力ストリームに渡している部分」である。この「音量ダウン」の処理を、「あなたがやりたい変換処理（C言語で記述）」に変更してやればよい。因みに、メイン処理（JAVAで記述）とのやり取りは、jni_bridge.cpp（jniという仕組み）で行う。・・・続く・・・
Google Cloud Platform のインターフェイスが表示されない、崩れている場合の解決方法

# 解決方法
はじめに結論からです。

使用しているブラウザの拡張機能が原因かもしれません。
自分の場合はダークモードにする拡張機能を削除したら
Google Cloud Platform のコンソール画面などのインターフェイスが元のインターフェイスにもどりました。
画面表示に関係する拡張機能を使用している場合は疑ってみてください。

# インターフェイスが崩れる
ダッシュボードなどは問題ないですが、
IAM、お支払いなどを選択しても、表示されない、もしくはインターフェイスが崩れているという問題に遭遇しました。

# 解決例
1. HTML や JavaScript を編集するような拡張機能削除する
2. ダークモード系の拡張機能を削除する
3. 広告ブロックをOFFにしてみる
4. ウイルスソフトでUIに関係するものがないか調べてみる

Google Cloud Platform のインターフェイスが表示されない、崩れているなどの問題に遭遇したら試してみてください。
諦めながらつくっていく個人開発

## 諦め

　とにかく形にしないと個人開発にならない。私が諦めたものは多数ある。振り返りをしたときの共有用文章の生成機能もそれにあたる。

　当時は日々の振り返りをSlackチャンネルに投稿していて、いちいちフォーマットを整えて投稿していた。どうせ日報/振り返りアプリをつくるならば、文章生成もやってしまいたいなあと思った。

## イメージ

　イメージする。

 なにかしら振り返りのフォーマットに記入する。目標が達成できたか出来なかったか、コメントを書く。すると、振り返りのデータができる。

```
 【2022/12/10 ~ 12/16】
　
　目標
　　・毎日ランニング　1km
　　　　→達成!
   ・応用情報試験　参考書 1週
　　　　→未達...

　コメント
　　仕事が忙しくて作業が進まなかった。来週は早起きして勉強する！
```

　こんな感じの文章が生成される。コピーボタンを押せばコピペ完了。Slackに投稿できる。

　良いな。


## コード
　コントローラとモデル部分にメソッドを付け足した。

```ruby:app/controllers/reviews_controller.rb
def create
# ....
    share_content = Review.convert_content_shared(before_plan_state, after_plan_state, review_params, genres_set)
# ...
end
```

```ruby:app/models/review.rb
def self.convert_content_shared(before_plan_state, after_plan_state, review_params, genres_set)
    date = review_params[:reviewed_on]
    content = review_params[:content]
#.....
 date + "\n" + formatted_items + "\n" + content
end
```


## 立ち止まる

　しかし、「もっとこうしたい！」という欲が出てくる。例えば振り返りのフォーマットをユーザー側で変更できるようにしたい、とか。実現しようと思うとちょっといろいろ考えないといけなくなってくる。楽しいけど時間がかかる。

　これは諦めることにした。個人開発は人生のきれはしでやっていることだから、時間はない。うまくサービスが進みだしてから追加でやることにした。

　こんなふうに現実と折り合いをつけながら、日々開発をしている。

https://qiita.com/advent-calendar/2022/tatta-hitori
【エラー集】ERROR: Could not build wheels for pynbody, h5py...

pip install でパッケージをインストールしようとしたら
"ERROR: Could not build wheels for pynbody, h5py..."
というエラーが出た。

pip3 install --upgrade pip
pip3 install h5py
など、色々試しても依然だめ。

正常にpip installできた別のPCとの環境の違いを確認したところ、
どうやらPythonのバージョンが違うらしい。

Python3.11を使っていたのを、代わりにPython3.8でやってみたら上手くいった。
ちなみに3.9以降のバージョンで問題が発生するようだ。
面倒な環境構築にReplitという選択肢

## はじめに

この記事は[長野高専 Advent Calender 2022](https://qiita.com/advent-calendar/2022/nnct)の1日目の記事です。

さて今回は[Replit](https://replit.com)というオンラインIDEを紹介します。高機能で初学者向けの機能が沢山備わっているのでとてもお手軽にプログラミングを始めることが出来ます。もちろん中上級者にも最適なオンラインIDEとなっています。

## Replitとは

[Replit](https://replit.com)はブラウザで完結するオンラインIDEです。自分のPC上に開発環境を構築しなくとも、Webブラウザさえあれば、開発、実行、デバッグが完結するようになっています。対応言語も非常に豊富で、公式やコミュニティのテンプレート、既存のGitHubリポジトリからプロジェクトを作成することが可能です。また、GUIアプリケーションやWebサーバーを作ることもできます。

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628629/eab81978-45f5-2d0f-cc85-847dc82f4721.png)](https://replit.com)

## Replitのいいところ

### 基本無料

Replitの利用料金は基本無料で、有料プランでプライベートプロジェクトの作成やVMの性能をアップさせることができます。また、有料プランならVMを動作させたままにすることも可能なので簡易的なホスティング先としても使用可能です。

#### 無料で出来ること

- 無制限のプロジェクト作成
- 500MBのストレージ
- 500MBのVMメモリ
- 0.2-0.5vCPU
- 他ユーザとの共同編集機能

#### 有料プランで出来ること

- プライベートプロジェクトの作成
- 5プロジェクトまでの4vCPUと4GBの高性能VMの使用
- 5プロジェクトまでのVMのバックグラウンド起動
- 5GBのストレージ
- 1プロジェクトにつき1GBのストレージ
- 2GBのVMメモリ
- 2vCPU

上記の有料プランはHacker Planとして月7ドルのサブスクライブとして提供されていますが、他にも従量課金制のプランもあります。特にバックグラウンド起動は月0.60ドル(現在のレートでも100円以下！)で動作させることが出来るので、ホスティング先として見るのなら非常に安いです。

### 補完機能とフォーマット機能付き

オンラインIDEなので、何も設定しなくとも補完機能やフォーマット機能が付属しています。ローカル環境にIDEやエディタをインストールしなくてもすぐにコーディングを始めることができ、特にフォーマットはボタン一つでできるのでかなり便利です。

![Replitの補完機能](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628629/9aaea7c9-d028-7687-937b-a1e621be1c86.png)

### コミュニティによる豊富なプロジェクトやテンプレート

Replit内で作成したプロジェクトはコミュニティ内で公開することが出来ます。様々な種類のアプリケーションがコミュニティ内に公開されているので、人気のプログラムを実行したり、ソースコードを読んだりして学習に役立てることが出来ます。

![コミュニティ内のトレンドとなっているプロジェクト](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628629/bdee86c3-8756-d07d-441a-376e745a6b37.png)

また、Replit内で作成したプロジェクトはテンプレートとしてコミュニティ内で公開することが出来ます。既にたくさんのテンプレートがコミュニティによって作られていて、更にTwitterやDenoなどの公式から提供されているテンプレートもあるため手軽にフレームワークを動作させることが出来ます。

![公式から提供されているテンプレート一覧](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628629/641291d2-f215-7384-ff98-c842ae420ac1.png)

### GitHubとの連携機能

ReplitはGitHubのリポジトリからプロジェクトを作成することが出来ます。また、作成するだけでなくプロジェクト内で編集したコードをReplit上からコミットしてプッシュすることも出来ます。RevertなどもGUI上から簡単に行えるのでGitの学習にも役立てることが出来ます。

![ReplitのGit機能](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628629/469f0fa1-d11b-67b3-8fa6-32c2368d808a.png)

### その他機能

他にもReplitにはプログラミング初学者に嬉しい機能がたくさんついています。

- 他人との共同編集、チャット機能
    - ソースコードに対してコメントすることも出来るのでコードレビューもReplit上で完結させることが出来ます。
- 組み込みのデバッグ、Unit Test機能
- 環境変数設定機能
- 簡易的なIDaaS、KVS

## 終わりに

私は部活などでプログラミングを教えたりする機会が多いのですが、初学者にはハードルの高い環境構築をせずに本格的なプログラミングを無料で始めることが出来るので非常に便利です。皆さんもプログラミングを教える機会があれば是非Replitを選択肢に入れてください！
飲食店検索サイトの情報をとってきてみよう -GoogleMap編-

## 概要

久々にスクレイピングで情報を取得するスクリプトを組みたくなったので組む

## 言語
- ruby

## 使うライブラリ
- nokogiri
- selenium-webdriver

nokogiriはHTMLをパースする上では欠かせない子です。
GoogleMapはJSゴリゴリに動いていて通信取得が厳しいのでseleniumをつかいます。

## 本題

seleniumの準備に関しては今回はしてあるものとして話をすすめます。

これで準備ができたので実際のrubyのコードを書いてみましょう。

ファイル名は何でもいいのですが、crawler.rbとかにしましょうか

```rb
require 'net/http'
require 'uri'
require 'nokogiri'
require 'kconv'
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :chrome

area = '横浜'
keyword = 'たこ焼き'
driver.navigate.to "https://www.google.co.jp/maps/search/#{area}+#{keyword}/"
html = driver.page_source
driver.quit

doc = Nokogiri::HTML.parse(html.toutf8, nil, 'utf-8')
puts '###ページタイトル取得###'
puts doc.title

puts "\n###お店の名前を取得###"
doc.css('.NrDZNb div').map do |target|
  puts target.text
end

```

細かいコードの解説はこの記事ではしません。
実行結果はこんな感じになるかと思います。

```
###ページタイトル取得###
横浜 たこ焼き - Google マップ

###お店の名前を取得###
 ごっつええ本舗 CIAL横浜
 たこ焼きバル くるり 横浜
 たこやきバル tacobe
 浜のたこ焼きタコリーナ
 元天ねぎ蛸 みなとみらい店
```

「横浜」「たこ焼き」で検索した結果がこんな感じで取得できます。
ただ、スクロールとかさせないと他の取れなかったり、要素的にも不安定な気がするので実際に使う予定があるのであればAPI使うのがいい気がしました...
SwiftUIでSpriteKit

![Xcode-14.1](https://img.shields.io/badge/Xcode-14.1-brightgreen) ![iOS-16.0](https://img.shields.io/badge/iOS-16.0-brightgreen) 

## はじめに
iOS 14 から [SpriteView](https://developer.apple.com/documentation/spritekit/spriteview) を使って SwiftUI でもかんたんに SpriteKit が使えるようになりました:clap:

## 簡易実装
下記のように実装すると `SKScene` を表示できます。

```swift
struct ContentView: View {

    var body: some View {
        GeometryReader {
            SpriteView(scene: FirstScene(size: $0.size))
        }
    }
}

final class FirstScene: SKScene {

    override func didMove(to view: SKView) {
        backgroundColor = .systemRed
        let text = SKLabelNode(text: "First")
        text.position = view.center
        addChild(text)

    }
}
```

こんな感じ。

<img width="300" src="https://user-images.githubusercontent.com/34936885/204613647-1e206795-f0ac-467d-bdd7-e427df56783e.png">


## オプション
`SKView` であった `showsNodeCount` や `showsPhysics` はイニシャライザの `debugOptions` 引数で設定できます。

```swift
SpriteView(scene: FirstScene(size: $0.size),
           debugOptions: [.showsNodeCount, .showsPhysics])
```

オプションは下記があるようです。

[SpriteView.DebugOptions](https://developer.apple.com/documentation/spritekit/spriteview/debugoptions)

```swift
static let showsDrawCount: SpriteView.DebugOptions
static let showsFPS: SpriteView.DebugOptions
static let showsFields: SpriteView.DebugOptions
static let showsNodeCount: SpriteView.DebugOptions
static let showsPhysics: SpriteView.DebugOptions
static let showsQuadCount: SpriteView.DebugOptions
```

`SKView` であった `allowsTransparency` などはイニシャライザの `options` 引数で設定できます。

```swift
SpriteView(scene: FirstScene(size: $0.size),
           options: [.shouldCullNonVisibleNodes, .allowsTransparency])
```

オプションは下記があるようです。

[SpriteView.Options](https://developer.apple.com/documentation/spritekit/spriteview/options)

```swift
static let allowsTransparency: SpriteView.Options
static let ignoresSiblingOrder: SpriteView.Options
static let shouldCullNonVisibleNodes: SpriteView.Options
```

## 遷移処理
`SKScene` の遷移処理は下記のように `SKScene` 側でやればできます。

```swift
final class FirstScene: SKScene {

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        view?.presentScene(SecondScene(size: size), transition: .doorway(withDuration: 2.0))
    }
}
```

こんな感じ。

![transition](https://user-images.githubusercontent.com/34936885/204613786-0b80efde-c3e2-46af-b2b6-2e866bf9e13c.gif)

`SKTransition` には色々あるので下記をご参考ください。

[SKTransitionまとめ（Swift）](https://www.am10.blog/archives/508)

## おわりに
SwiftUI でもこんな感じでかんたんに SpriteKit が使えるようになりました:tada:

![snow](https://user-images.githubusercontent.com/34936885/204617804-d044f132-3d4c-45ef-a3bc-480df4fb4c43.gif)

（クリスマス仕様ファフロッキーズ:frog:）
topsyで現在編集中の関数を見失わない

topsyは多くのLispパッケージを手がけているalphapapa氏が開発しているLispパッケージです。

https://github.com/alphapapa/topsy.el

[MELPAからインストールできます](https://melpa.org/#/topsy)。

これは現在画面に映っている関数の上端が見切れている場合に、関数のヘッダー行をウィンドウのヘッダーラインとして表示するマイナーモードです。

言葉で説明するよりも実際にGIFアニメで見てもらった方が早いでしょう。

![topsy.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4121/5a414a78-1604-ecec-c5bd-49ce5b91794a.gif)

言語ごとの関数ヘッダ行の特定は、 `topsy-mode-functions` でカスタマイズすることもできますが、一般的には `beginning-of-defun-function` で十分なはずです。自作のメジャーモードで期待通りに動かない場合は `beginning-of-defun-function` の設定を検討してみてください。

なお、Emacs組み込みの機能では`which-function-mode`というマイナーモードがあり、これは画面下部のモードラインにつつましく表示します。

https://ayatakesi.github.io/emacs/temp/html/Which-Function.html

![スクリーンショット 2022-11-30 3.13.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4121/c199e0db-95d7-e97b-995e-5d0380cad356.png)

どちらがよいかは個人の好みですが、私はtopsyが馴染んでいます。

メリークリスマス！ :tada:
GitHub CLIでRemote repositoryをコンソールから操作する



## GitHub CLI とは？

GitHubをコンソールから操作することができるようにするGitHub公式のツールです．
Repositoryの作成とか名前でClone，Issue周りとかブラウザを開かずに色々できます．

https://github.com/cli/cli

## 導入

公式RepositoryのReadmeの通りに進めてインストールします．その後，下記コマンドを入力し初期設定を行ってください．

```
gh auth login
```

## 使用例

### Repository作成

GitのRepositoryがあるディレクトリで下記コマンドを入力して作成します．
Repository名や公開設定等を聞かれるので，適当に入力してください．

```
gh repo create
```

作成されたRepositoryを確認するには

```
gh repo list
```

を実行してRepositoryのリストを表示するか

```
gh browse 
```

を実行してウェブブラウザ上で表示します．

### Repository名でClone

下記コマンドでCloneします．URLを入力する手間が省けます．

```
gh repo clone ユーザー名/Repository名
```

## その他コマンド

公式のマニュアルにその他便利なコマンドがまとめられています．

https://cli.github.com/manual/
【SQL】別名がつけられない！？実行順序でつまずいた話

## はじめに
本記事は、私がデータベーススペシャリスト試験にチャレンジする過程で、超苦手なSQLを克服しようと学習していたときにつまずいたポイントとそこからの学びについて書いたものです。

## 別名が使えないのだが。

SQLの学習サイトでこんな感じのSQLを書いていました。

```sql
SELECT member.name AS NAME,member.team AS TEAM FROM member
...
GROUP BY member.team

```
**「あとはmember.teamを降順に並べ替えて……できた！」**
```sql
SELECT member.name AS NAME,member.team AS TEAM FROM member
...
GROUP BY member.team
ORDER BY member.team DESC;
```
無事に正しい結果が出力されましたが、私はあることに気付きました。
模範解答は以下のようになっていました。
```sql
SELECT member.name AS NAME,member.team AS TEAM FROM member
...
GROUP BY member.team
ORDER BY TEAM DESC;
```
「あれ、ORDER BY句は別名使ってる」
`AS`句でカラムや表に別名をつけることができます。そして、ORDER BY句では別名でカラムを指定し、並べ替えていたのです。

**「でも、GROUP BY句では別名使ってないな。問題作った人間違えちゃったのかな？」**

ORDER BY句で別名が使えるなら大丈夫だろう、と思い、私は試しにGROUP BY句を以下のように書き換えました。
```sql
SELECT member.name AS NAME,member.team AS TEAM FROM member
...
GROUP BY TEAM
ORDER BY TEAM DESC;
```
**「あれ、エラー吐いちゃった……」**
ORDER BY句とGROUP BY句で、別名が使えたり使えなかったりと、そんなことがあるのでしょうか。

## SQLの構文には実行順序がある

今回のつまづきポイントは実はAS句ではなく、**クエリの実行順序**です。

たとえば、SQL Serverではクエリの実行順は以下のようになっています。
1. FROM
2. ON
3. JOIN
4. WHERE
5. **GROUP BY**
6. WITH CUBE または WITH ROLLUP
7. HAVING
8. **SELECT**
9. DISTINCT
10. ORDER BY
11. TOP

GROUP BY句よりもSELECT句の方が後で実行されるようになっています。
今回私が書いたクエリは以下。
```sql
SELECT member.name AS NAME,member.team AS TEAM FROM member
...
GROUP BY TEAM
ORDER BY TEAM DESC;
```
AS句による別名の指定をSELECT句で行っています。
つまり、GROUP BY句が実行された時点では別名は指定されていません。
だからエラーが出てしまったんですね。
ORDER BY句で別名が使えるのも同じ理由で、ORDER BY句の実行順はSELECT句よりも後であるため、SELECT句で指定した別名を使うことができるのです。

## 最後に
つまずいたときは本当に訳が分からず、かつSQL勉強始めたて状態だったのでどう調べたら答えが出てくるのかもわからなかったのですが、ふとC#のlinqの遅延実行のことを思い出したことで答え(ググるキーワード)にたどり着けました。
今回実行順について学んだことで、
「GROUP BY句の後で絞り込みたいときにWHEREじゃなくてHAVINGを使うのも、もしかしてWHERE句はGROUP BY句の前に実行されちゃうから？」
などという気づきもありました。

なお、先日データベーススペシャリスト試験受験してまいりましたが、**想像通りのずたぼろでした。** 点数見たくないです。
とはいえ手応えはありましたし、応用情報を受けていた頃は苦手すぎて即捨てていたデータベースの問題を少しでも解けるようになったのは嬉しかったです。
受け続ければ受かるはずなのでこれからも頑張ります。
curlで引数込みのURLを送る時は、URLを括ろう

ダブルクォーテーションで括るか、&をエスケープする。
```
curl "https://xxxxx.com/todo?id=aaa&apikey=bbb"
```
```
curl https://xxxxx.com/todo?id=aaa\&apikey=bbb
```

### 参考サイト
https://dev.classmethod.jp/articles/curl-command-url-tips/
Route53②-ルーティング

# 本記事の内容

この記事では３回目のANS-C01を受けるにあたって勉強した内容を整理するための記事です。
今回はRoute53の**ルーティングの部分、リソースの正常性**の記事となります。

# Route53とは
Route53とはAWSサービスにおける以下の内容を管理するためのサービスです。
今回「２．ドメインのリソースへのトラフィックのルーティング」「３．リソースの正常性のチェック」について書いていきます。
1.  ドメイン登録機能
    - AWSサービス内のドメイン名の管理を行います。
1.  ドメインのリソースへのインターネットトラフィックのルーティング
    - Route53で管理しているドメインに関するDNSクエリのルーティングを行います。
1.  リソースの正常性のチェック
    - ウェブサーバーへの正常性確認を行います。

# Route53のルーティングポリシーについて

Route53のルーティングポリシーは全部で6つある

2. シンプルルーティング
2. 加重ルーティング
2. 位置情報ルーティング
2. レイテンシールーティング
2. フェイルオーバールーティング
2. 複数値回答ルーティング 

### シンプルルーティング
１つのDNSに対して1つのリソース（IPアドレス）を返す。

### 加重ルーティング
1つのDNSに対して複数のリソース（IPアドレス）を返す。
返す値の違いは、返すリソースの割合を設定することで管理できる。

### 位置情報ルーティング
1つのDNSに対して複数のリソース（IPアドレス）を返す。
返す値の違いは、リクエストを送った場所から**地理的に一番近いリソース**の値を返す。

### レイテンシールーティング
1つのDNSに対して複数のリソース（IPアドレス）を返す。
返す値の違いは、リクエストを送った場所から**一番通信遅延の少ない**リソースの値を返す。

### フェイルオーバールーティング
1つのDNSに対して複数のリソース（IPアドレス）を返す。
返す値の違いは、基本的にメインに設定された値を返すが、メインに障害が発生している場合のみサブの値を返す。

### 複数値回答ルーティング
1つのDNSに対して複数のリソース（IPアドレス）を返す。
返す値は、ヘルスチェックが正常である値からランダムに値が返される。


## Route53におけるヘルスチェックについて
上記で紹介したルーティングの中で使用されているヘルスチェックの具体的なチェック方法について記載する。
Route53におけるヘルスチェック方法は大きく分けて４つ

3. エンドポイントのモニタリング
    - 指定された一定の間隔で、自動リクエストをインターネット経由で対象リソースに送信し、そのリソースが到達可能、使用可能、機能中であることを確認する。
3. 他サービスのヘルスチェックモニタリング
    - 他のヘルスチェックのステータスをモニタリングするヘルスチェックをRoute53に作成し、利用できるウェブリソース数が指定するしきい値を下回る場合に通知を行うように設定する。
3. CloudWatchアラームのモニタリング
    - CloudWatch メトリクスのステータスをモニタリングする CloudWatch アラームを作成し、通知先をRoute53に設定
3. Amazon Route 53 Application Recovery Controller
    - ヘルスチェックだけでなく、リソースの監視状況も確認可能となる。（より細かく、迅速なヘルスチェックが可能
MySQL闇歴史　MySQL Utilities

これを書き始めたときにはMySQL Shellに正常進化したので闇感はあんまり無い気がしたのがMySQL Utilities。2010年12月にMySQL Workbenchの一機能として登場した当初は、利用に至るまでの導線が悪くて全然知られていない存在だったり。

知名度：★★★☆☆
闇度　：★★★★☆
未来への種まき度：★★★★☆

Pythonで書かれたスクリプト集のような感じで、運用管理の支援ツールやレプリケーション関連のツールが含まれていた。レプリケーション関連はMySQL 5.6実装されたばかりのGTID前提だったでリリース当初としては新しい取り組みも。

現在MySQL Shellに含まれるデータのインポートやエクスポートのコマンドの前身や、クローンプラグインが作りたくなった一因にもなってそうなコピー機能、InnoDB ReplicaSetの原型となるような機能も。mysqlfailoverを使うとレプリケーション構成を監視してマスターに障害が発生したら自動的にスレーブをマスターに昇格させるというみんなが欲しかったものが実現できる風だったが、mysqlfailoverを監視する仕組みが別途必要だったり実用には至らなかった模様。

ちなみにmysqlrplshowというレプリケーションの親子関係をテキストで図示してくれる機能はMySQL Shellには(まだ)ない模様。っていうかテーブル定義などのメタデータをgrepできるmysqlmetagrep相当とかインデックスの重複をチェックできるmysqlindexcheckとかも無いような。。。書いててだんだん不安になってきた。。。
MySQL闇歴史　Connector/MXJ

MySQLサーバーに接続するアプリケーション側で使う接続部品をMySQLではまとめてConnectorsと呼んでる。Java用のConnector/JやPython用のConnector/Pythonなどがある。このConnectorsで消えていったうちの一つがConnector/MXJである。

知名度：★☆☆☆☆
闇度　：★★☆☆☆
位置づけが不明度：★★★★★

2005年に最初のバージョン5.0.0がリリースされ、なんだかんだでMySQL 5.5にも対応したりしながら2011年7月の5.0.12をもって静かに開発終了となった。っていうかそもそもGAがいつだったのか、それ以前にGA版が出たのかすら定かではない。
https://downloads.mysql.com/archives/c-mxj/

JavaアプリケーションとMySQLサーバーを組み合わせて利用する際に、Javaの世界でMySQLサーバーの起動停止を管理したり、JMX経由でMySQLサーバーを管理できるもの、だったらしい。という時点でConnectorsは本来クライアント側の製品という位置づけから大きく逸脱。

ちなみにあまりにも情報が少ないのでブログを書いてみたこともあるが、日本語情報の前に英語の情報もほとんど無いし、マニュアルすらちゃんとメンテナンスされていなかったらしい。
MySQL闇歴史　memcachedプラグイン

MySQL 5.6で華々しく登場したmemcachedプラグイン。MySQL 8.0のGAリリース当初のキャッチコピーに"SQL + NoSQL = MySQL 8.0"っていうのがあってmemcachedプラグインは無かったことにされたのかと思ったら、しれっと8.0が抜けて"SQL + NoSQL = MySQL"に変わったとか変わってないとか。

知名度：★★★☆☆
闇度　：★★☆☆☆
一つの時代度：★★★★☆

memcachedクライアントからキーバリュー方のAPIでMySQLサーバーのデータを読み書きするという発想が面白かった。MySQL 5.6で実装された当初はニッチだけど結構ニーズもあったと記憶している。


残念ながらMySQL 8.0.22をもってmemcachedプラグインは非推奨となってしまったが、8.0.0で複数の値をgetする機能やキーの範囲検索的な操作ができるようになったのでWhat Is New in MySQL 8.0に新機能と非推奨が両方掲載されることに。
https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html
MySQL闇歴史　Linuxディストリビューションからの排除

この一連のテーマで最も深い闇がこのはなし。オラクルによるサン・マイクロシステムズ買収に前後して複数のLinuxディストリビューションからMySQLが排除され、MySQLという名称であってもデフォルトがMariaDBになった。MySQLという名称で正しくMySQLが利用できるようなるまでには長い年月を要した。ここ最近はMySQLはMySQL, MariaDBはMariaDBという正常な状態にはなってはいるが。

知名度：★☆☆☆☆
闇度　：★★★★★★★★★★★★★★★★★★★★★∞
真相は闇の中度：★★★★★

闇というのは、Linuxディストリビューションから排除されるに至る出来事の原因となった「事案」。日本で正確は報道は一つも見たことが無いし、英語でも「事案」の報道そのものは目にしたけどLinuxの件と結びつけた情報にたどり着けた報道やブログなどは一切無い。というか一連の流れを知る人間は10人いるかいないかだと思われる。たまたまカンファレンスのためにオラクルの本社にいて期せずして流れに巻き込まれた。

ちなみに会社としてのオラクルは少なくともその「事案」には一切関わっておらず、一人の個人に起因することであることだけは明確にしておく。

もう製品名称とのマッピングはおおむね正常化してるし10年以上前の話なので興味のある人もいないとは思うが、ネットの波に漂っているだろう情報を探ればコミュニケーションが途絶えた原因にたどり着けるかもしれない。ただし、一番重要な手がかりは手書きの文字が載る紙のスキャン画像だという・・・おや、誰か来たようだ。
MySQL闇歴史　創業者(のうちの2名)の離脱

MySQLの歴史上の最大の事件と言っても良いできことである。よくある勘違いにオラクルがMySQLを含むサン・マイクロシステムズを買収したから創業者の一人のMontyが辞めたという誤解。実際にはMontyがサンを辞めたのが2009年2月で、オラクルがサンを買収すると発表したのは2009年4月。

知名度：★★☆☆☆
闇度　：★★★★★
裏話盛りだくさん度：★★★★★


ちなみにMySQLの創業者は3名。1名は早い時期に抜けたので創業者は2名だと思われていることもあるみたい。Montyだけが創業者だと思っている人もいたり。またMontyがサンを出たタイミングでMariaDBを作ったというのも誤解で、当初はMySQL-5.1-Mariaというフォークのツリーを作っていただけ。当時はMyISAM++ことMariaストレージエンジンを作ることに注力していた。

サンを辞めた理由についても知らない人が多いようだが、直接的な原因はサンとしてリリースしたメジャーバージョンのMySQL 5.1の品質が悪すぎる状態に開発体制が陥ってたこと。独立した会社の創業者であればリリースを差し止めるような権限もあったのかもしれないが、買収されて大きな企業の一部門となり、さらにMySQL社末期から中枢というよりはフェロー的な位置づけになっていたので発言力に限界があったようで、何を言おうとMySQL 5.1はリリースされてしまった。

その結果MySQLの中の人界隈では極めて有名な、仲間を背後から撃ちまくるブログを書き上げ、製品開発のプロセスの改善を試みたとされるものの、それから少しして去って行った。当時の中の人しか知らないこともまだまだ多々ある話でもある。そしてその直後に大波がやってくることなど誰も予測できないまま。。。
フロントエンドエンジニアが Flutter に入門した話

# はじめに

フロントエンドエンジニアの私が業務で Flutter を使用するまでに学んだことを紹介します。
ご参考になれば幸いです。

# チュートリアル

まず初めに公式サイトのチュートリアルである、 [Write your first Flutter app, part 1](https://docs.flutter.dev/get-started/codelab) を行いました。また、続きの [Write Your First Flutter App, part 2](https://codelabs.developers.google.com/codelabs/first-flutter-app-pt2) も行いました。
これらで StatelessWidget や StatefulWidget 、 Navigator について学べます。
とりあえず動くものを作りたいという方にはおすすめです。

# 文法

次に Dart の文法について学びました。公式ドキュメントの [A tour of the Dart language](https://dart.dev/guides/language/language-tour) を読みました。 Dart はクラスベースの言語ですが、 JavaScript はプロトタイプベースの言語のため、慣れるまでかなり苦戦しました。
また、普段 React を使用していることもあり、関数コンポーネントの記述に慣れてしまっているため、改めてオブジェクト指向についても学び直しました。

# ライフサイクル

[Flutter の描画の仕組みを理解する](https://zenn.dev/seya/articles/f7ebcd8335eee7) や [Flutterアプリのライフサイクル](https://qiita.com/kurun_pan/items/0c6de1313844a8cc1603) 、 [Flutter StatefulWidgetのライフサイクル](https://qiita.com/kurun_pan/items/116288b8ab2c409d2ee5) を読みました。ライフサイクルを理解することでより Flutter のことを知れたと思います。

# Flutter Hooks

[Flutter Hooks](https://pub.dev/packages/flutter_hooks) は Flutter で [React Hooks](https://beta.reactjs.org/apis/react) のように記述できるライブラリになります。導入することで `useState` や `useEffect` 、 `useCallback` などのフックを使用することができます。
Flutter Hooks の詳細に関しては別途記事を記載しようと思います。

# Riverpod

[Riverpod](https://docs-v2.riverpod.dev) は状態管理ライブラリで、 [Recoil](https://recoiljs.org/) とよく似た設計となっています。他にも [provider](https://pub.dev/packages/provider) という状態管理ライブラリも触ってみましたが、 Riverpod の方が個人的にはかなり使いやすかったです。
Riverpod も詳細に関しては別途記事を記載しようと思います。

# API通信

有名なライブラリとして [http](https://pub.dev/packages/http) と [dio](https://pub.dev/packages/dio) があります。 [http vs dio](https://www.reddit.com/r/FlutterDev/comments/mzhmnb/http_vs_dio) を拝見し、 シンプルに書けることから http を触りました。 dio は大規模な開発には向いているとは思いますが個人開発レベルでは不要かなと思います。

# 永続化

データの永続化を行うために [Shared Preferences](https://pub.dev/packages/shared_preferences) を使用しました。その他にも、 SQLite プラグインである [sqflite](https://pub.dev/packages/sqflite) を使用したり、 Firebase を使用する方法もあります。

# その他

その他、イミュータブルなクラスを扱うための [freezed](https://pub.dev/packages/freezed) 、 ルーティングライブラリである [go_router](https://pub.dev/packages/go_router) を学びました。また、それらを自動生成するための [build_runner](https://pub.dev/packages/build_runner) についても学びました。

ライブラリ以外では、 [Flutter Widget of the Week](https://www.youtube.com/playlist?list=PLjxrf2q8roU23XGwz3Km7sQZFTdB996iG) を見たり [WINTICKET が考えたモダンな Flutter アプリ設計を完全解説](https://developers.cyberagent.co.jp/blog/archives/36149/) を読みました。
Flutter Widget of the Week 以外にも公式から動画が出ているので、動画を見ながらの学習も多くなりました。今まで動画で学習する機会が少なかったので新鮮でした。
また、 [roadmap.sh](https://roadmap.sh) に [Flutter Developer](https://roadmap.sh/flutter) 用のロードマップが載っています。今後ひとつずつ調べていくつもりです。

# おわりに

新しい言語を久しぶりに学び、楽しかったです。また、先輩から教えてもらえる環境が整っており、効率よく学ぶことができました。
今後の目標は個人開発でアプリをストアに公開することなので、今後も楽しみながら Flutter での開発を続けたいです。
MySQL闇歴史　MySQL社末期とサン・マイクロシステムズ時代の製品エディション

MySQL混迷の時代を象徴するのがエディションと利用できる機能やライセンスのマッピング。お金を払ってEnterprise版のサブスクリプションを購入したお客様は当然のように商用ライセンス版のMySQLサーバーが手に入ると思いきや提供されるのはGPL版。

知名度：★☆☆☆☆
闇度　：★★★★☆
説明不可度：★★★★☆

商用ライセンス版を入手するにはサブスクリプション購入に加えて追加の覚書が必要、追加費用はいらなかったけど。（覚書が必要なのに購入時に営業が説明しておらずお客様が怒ることも）


最大の問題は営業担当者はおろか社内でほとんど誰もどのエディションにどのバイナリに何が入っているか、何を使っていいかを把握できていなかったこと。当然代理店にも周知されないので代理店での販売時にも混乱が生じた。仕方ないのでダウンロードサイトから全バイナリをかき集めて一覧表を作ったりもした。

- コミュニティ版のMySQLサーバー, MySQL Cluster
- 組み込み版のClassic, Pro, Advanced 
- Enterprise版のPro(GPL), Advanced(GPL), Pro(商用ライセンス), Advanced(商用ライセンス),
- MySQL Clusterの商用版

ClassicはInnoDB利用不可というか同梱されてない、ProはInnoDBは利用可能だがパーティショニングは利用不可、AdvancedはProの機能に加えてパーティショニングも利用可能でライセンス以外はコミュニティ版MySQLサーバーと同等。MySQL Clusterはコミュニティ版ならInnoDBが同梱されるが、商用版に切り替えるとInnoDBが入っていないという。。。

これらあわせて10本の微妙に機能が違っててライセンスの異なるバイナリが各OS向けに用意され、さらに ~~意味不明な~~芸術的なQPSとMRUやさらにコミュニティ版のリリース分離までしていた。サポート対象OSは今よりもはるかに多いのだのから開発、テスト、リリースのチームは大変なことになる。かくして5.0の後、Sunで唯一リリースしたメジャーバージョンの5.1の品質も推して知るべしという状態になった。

https://sakaik.hateblo.jp/entry/20221212/separated_mysql_50 

さすがに後に整理されてBronze, Silver, Gold, Platinumの4段階となり、バイナリの数も削減。サブスクリプションを買えば商用ライセンス版のバイナリをデフォルトで利用可能にはなった。それでもオラクルになってからの方がサービス内容と価格形態は改善したのは意外な結末ではある。

ちなみに今、バイナリとしてはOSごとにMySQLサーバーとMySQL Clusterのそれぞれのコミュニティ版と商用版の計4つ。AIXやHP-UX, PowerPC上のMax OSやLinux, S/390上のLinux, IBM iなどサポート対象となるOSやCPUアーキテクチャを減らし、ビルドやテストの自動化も洗練されたものとなっている。
ASUS TUF Gaming F15 Laptop

Helpful Advice For Finding A Great Laptop

The technology market is flooded these days. It is flooded with all kinds of devices that accomplish a myriad of tasks. How can you decide what to look for when you want to buy a laptop? You can use the laptop tips in the following article to make your final choice an easy one.

Don't buy a laptop solely on price alone. Yes, cheap laptops can keep a lot of your hard earned cash in your wallet, but they also might be susceptible to breaking down. It may end up costing you more in the long run if you decide to go cheap early on.

If you need to get something fixed on your computer, make sure you know how long a repair place will take to do it. You don't want to have to send in a computer you need only for it to take forever to get back. Try finding some place that isn't that busy and does good work in your area.

Consider if your laptop will be your primary computer. If it will, you might want to spend more to get a bigger hard drive, more RAM and an increased number of features. If it will only be a secondary computer, used from time to time when you are on the road, you can get away with something less updated and less expensive.

Consider how much security you need for your <a href="https://hytekjungle.com/laptops-notebooks/">Laptop</a>
computer. How much personal and business information is available on your device? Fingerprint scanners are used to prohibit access to the operating system. Only the person whose fingerprints scan as the owner will be allowed to use the system. However, no security measures are full proof.

Navigating the wild waters of rapidly changing technology can be a big deal. There are so many companies competing for the top sales spot, that you may not know what to do next. Fortunately, you now have the laptop information you need to make a sound purchasing decision that you will not regret.
MySQL闇歴史　サン・マイクロシステムズによる買収

オラクルによるInnobase Oy買収, 創業者離脱、オラクルによるSun買収に並ぶMySQLの歴史上の大事件の一つ。旧MySQL社のイグジットとしてはIPO(上場による株式公開)になるのではないかと噂されていた中で青天の霹靂のような買収劇。

知名度：★★★★☆
闇度　：★★★☆☆
青天の霹靂度：★★★★★

当時のSunはLinuxの急成長に対してSPARC Solarisが守勢に回っていたもののサーバーやストレージなどのハードウェアまだまだ強みがあり、Javaや各種ミドルウェアも揃っていた中で大きく欠けていたピースがデータベースだった。Apache DerbyベースのJava DBでは市場で勝負にならず、PostgreSQLのコミュニティをサポートしていたりもしたが自社製品としてMySQLを所有することを選択。

ちなみにPostgreSQLコアチームメンバーのJosh Berkusが所属していたり、日本のPostgreSQLユーザ会も積極的に支援していたのに、MySQLが自社製品になったことでSunの日本法人の人は針のむしろ状態だったとかなかったとか。

ちなみに買収によるMySQL開発チームの混乱とSunの会社としての方針、さらにはSunが財政的にそこまで調子が良くなかったことによる社内事情からMySQLの歴史の中でも1,2を争う混迷の時代に突入することになる。この話を記憶しているまたは知っているMySQLのユーザーも少なくは無いと思う。

買収された後にSunの役員がMySQLも管轄することになるのはおおむね買収時のセオリー通り。この役員がなかなかに自由気まま方だったのでMySQLの開発方針も自由気ままな感じになってぐっだぐだになっていった。なかなかのカオスになったあと、オラクルによる買収発表直後にSunを辞めるところまではまだ分かるが、転職先がEnterpriseDBだったのを知ったときは「エグいな」という感想だった。と同時にEnterpriseDBさんもしばらく大変だろうなと思ったとか思わなかったとか。ちなみにSunによる買収前からMySQLのプロダクトマネジャーだった人物もほぼ同じタイミングでSunを辞めたあとInfiniDBの開発元のCalpontを9ヶ月で通過してEnterpriseDBに入っていてなるほどってなった。