OmniAICreator/Qiita-1.07M huggingface dataset:
【Git】Qiita 週間いいね数ランキング【自動更新】

# タグ別

[`Android`](https://qiita.com/items/8b3af051428d746f26c5) [`AWS`](https://qiita.com/items/e24b6279326a462d456c) [`初心者`](https://qiita.com/items/402899ec543aff109505) [`Docker`](https://qiita.com/items/ae11fca7d2eba445b037) [`Git`](https://qiita.com/items/74eacdbf363e260981c3) [`Go`](https://qiita.com/items/49d4537d95f878b3e91a) [`iOS`](https://qiita.com/items/e61a29a383d0403e92fc) [`Java`](https://qiita.com/items/4c3f84836bfdbb137226) [`JavaScript`](https://qiita.com/items/eaa7ac5b62a0a723edbb) [`Linux`](https://qiita.com/items/362e81e53c3f9dee22f1) [`Node.js`](https://qiita.com/items/66ed7ad8f7c9673e9d50) [`PHP`](https://qiita.com/items/3318cbdbc45c6ebd4014) [`Python`](https://qiita.com/items/9d7f2ffeafb36cf59a77) [`Rails`](https://qiita.com/items/93b9e7f7d143e9ce650e) [`React`](https://qiita.com/items/f9712f8acace22815b99) [`Ruby`](https://qiita.com/items/72c3d2e896bdc3e1a6b3) [`Swift`](https://qiita.com/items/e2b6f0645e29f0e2b761) [`TypeScript`](https://qiita.com/items/25b7c0870afa6d41d19b) [`Vim`](https://qiita.com/items/f5361177baef95e447d1) [`Vue.js`](https://qiita.com/items/2774e02c6eea5c830d99) 

# 集計について

- 集計期間: 2025-06-16 ~ 2025-06-23
- 条件: ストック数が **2** 以上の記事


# GitHub

https://github.com/koki-develop/qiita-ranking

スターをもらえるととっても励みになります :bow:

# いいね数ランキング

## 1 位: [#意識低いAICodingチュートリアル #02 ネット老人会サイトをバージョン管理してもらおう [GitHub Copilot Agent mode 版]](https://qiita.com/chomado/items/ef5e645f90b55b803fc3)

[`Git`](https://qiita.com/tags/Git) [`githubcopilot`](https://qiita.com/tags/githubcopilot) [`AIエージェント`](https://qiita.com/tags/AIエージェント) 
**34** いいね　**23** ストック
[@chomado](https://qiita.com/chomado) さん ( 2025-06-17 13:57 に投稿 )

## 2 位: [README.md に書くべき項目まとめ](https://qiita.com/Ogimatsu/items/78aa56f386847ff954dc)

[`Python`](https://qiita.com/tags/Python) [`Django`](https://qiita.com/tags/Django) [`Git`](https://qiita.com/tags/Git) [`Readme`](https://qiita.com/tags/Readme) 
**14** いいね　**8** ストック
[@Ogimatsu](https://qiita.com/Ogimatsu) さん ( 2025-06-18 00:22 に投稿 )

## 3 位: [🔐 プライベートリポジトリでも.envファイルはGitにコミットNG！セキュリティ事故を防ぐ環境変数管理術](https://qiita.com/YushiYamamoto/items/2fa1709674e683beb1bd)

[`Git`](https://qiita.com/tags/Git) [`Security`](https://qiita.com/tags/Security) [`初心者向け`](https://qiita.com/tags/初心者向け) [`環境変数`](https://qiita.com/tags/環境変数) [`ベストプラクティス`](https://qiita.com/tags/ベストプラクティス) 
**1** いいね　**2** ストック
[@YushiYamamoto](https://qiita.com/YushiYamamoto) さん ( 2025-06-21 22:02 に投稿 )

## 4 位: [🚀GitLab CI/CD × GKEではじめるKubernetes自動デプロイ入門](https://qiita.com/Elie1729/items/ad527d8617ac95bab751)

[`Git`](https://qiita.com/tags/Git) [`GitLab`](https://qiita.com/tags/GitLab) [`kubernetes`](https://qiita.com/tags/kubernetes) [`GKE`](https://qiita.com/tags/GKE) [`CICD`](https://qiita.com/tags/CICD) 
**1** いいね　**2** ストック
[@Elie1729](https://qiita.com/Elie1729) さん ( 2025-06-20 16:43 に投稿 )

## 5 位: [Gitって何？バージョン管理って必要なの？小学生でもわかるように説明してみた](https://qiita.com/mergelog/items/abcbeca65a8c27bf10be)

[`Git`](https://qiita.com/tags/Git) [`初心者`](https://qiita.com/tags/初心者) 
**1** いいね　**2** ストック
[@mergelog](https://qiita.com/mergelog) さん ( 2025-06-17 22:19 に投稿 )
【Gulp4】gulpタスクをループで作成、まとめて実行する。

# やりたかったこと
開発ディレクトリ内のJavaScriptファイルをディレクトリに振り分けてコピーしたい。

開発ディレクトリ`dev`内にJSファイルを配置。

```
dev
└── js
    ├── hoge.js
    ├── fuga.js
    └── piyo.js
```

出力時は`a`、`b`、`c`のディレクトリに必要なJSファイルをコピーする。

```
htdocs
├── a
│   └── js
│       ├── hoge.js
│       └── fuga.js
├── b
│   └── js
│       ├── hoge.js
│       └── piyo.js
└── c
    └── js
        └── fuga.js
```

# モジュールを使用しない方法

```js:gulpfile.js
// 各ディレクトリに振り分けたいファイルリスト
const fileList = {
  a: ['hoge', 'fuga'],
  b: ['hoge', 'piyo'],
  c: ['fuga']
}

const scriptTasks = {}
Object.keys(fileList).forEach(dirName => {
  // ファイル名にパスを付けて配列にする
  const files = fileList[dirName].map(fileName => { return './dev/js/' + fileName + '.js' } )
  // gulpタスクを作成
  scriptTasks[dirName] = () => {
    return src(files)
    .pipe(dest('./htdocs/' + dirName + '/js/'))
  }
})

// scriptTasksに入れたタスク全てを並列実行
exports.script = parallel(Object.keys(scriptTasks).map( key => { return scriptTasks[key] }))
```
# モジュール`event-stream`を使う方法

[event-stream](https://www.npmjs.com/package/event-stream)でストリームをマージするやり方。
マージされたタスクができるので、実行時の余分な記述が必要なくなる。

```js:gulpfile.js
const eventStream = require('event-stream')

const scriptMergeTask = done => {
  eventStream.merge(
    Object.keys(fileList).map(dirName => {
      const files = fileList[dirName].map(fileName => { return './dev/js/' + fileName + '.js' } )
      return src(files)
      .pipe(dest('./htdocs/' + dirName + '/js/'))
    })
  )
  done()
}
exports.script = scriptMergeTask
```

# 参考
[ループを使用してタスクを作成する[gulp]](https://www.it-swarm-ja.tech/ja/javascript/%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8Bgulp/1046161896/)
[gulp.js:forEachループに基づくタスク](https://www.366service.com/jp/qa/b1c453443fccd93b07cf690b115a6d30)
セルの再利用がちょっと分かった気がするが全然わからん

##まとめ
　誰か正確な内容を教えてください……（他力本願）

##前提
　tableViewのセルを、インスタンスを毎回生成する方法で作ろうとすると、セルが増えるごとにどんどん重くなって大変。なので、セルを「再利用」しましょう、という話だったと思う。

##今回起きた大問題
　SpreadsheetViewという大変便利なライブラリを使って、スクロールする表を実装していた。実装する表はいくつか空きマスがあるタイプのもの（時間割表みたいなやつ）。
　スクロールしたら、なんと空きマスがどんどん埋まっていってしまう！スクロールするたびにどんどん埋まっていって、しまいにはほとんど空きがないような有様に……。

##解決法
　セルを呼び出した後に、空きマスのところにも空のデータを入れる。

##なぜこれで解決するのか
　ここからはきちんと検証したわけでも勉強したわけでもないので推測になりますが……。
①セルを「再利用」するというのは、プロパティも含めて使い回すことを指す。（新しいインスタンスを作るわけではないので、初期化処理を書かない限りプロパティは初期化されない）
②スクロールするたびにcellForRowAtメソッドが呼び出されていた（これは確認済み）。おそらく、スクロール前に消えていた部分が現れるタイミングで、現れるセルについてcellForRowAtが呼ばれているものと思われる。
③「再利用」されているので、空きマスを描画する際に再利用時のプロパティが適用されてしまう→空きマスがどんどん埋まる？？

したがって、再利用時のプロパティを空のデータで置き換えることによって、再描画されても無事空きのまま保たれる、と……。

##結局
　誰か正確な内容を教えてください……（自分でも後で勉強してみますm(_ _)m）
Swiftでフォント情報を日本語で表示 : macOS

##実行環境
 - swift5
 - MacOS: BigSur
 - Xcode: 12.2

##概要

 - フォントファミリーを取得して**日本語**にする
 - 使用可能なフォントのスタイル一覧を表示
 - フォント名を日本語で出力する

##コード
##使用可能なフォントファミリーを取得する

 - `fontFamilies` 　使用可能なフォントファミリー一覧
 - `localizedFamilyName` 　フォントをローカライズする(今回は日本語)


```swift
let fontFamilies = NSFontManager.shared.availableFontFamilies
for family in fontFamilies {
    print(family)//フォントファミリー名
    let localizedFamilyName = NSFontManager.shared.localizedName(forFamily: family, face: nil)
    print(localizedFamilyName)//フォントファミリー名(ローカライズ後)
}
```
###説明

####`NSFontManager.shared.availableFontFamilies`
 - 使用可能なフォントファミリーを取得。

####`localizedName(forFamily:face:)`
 - フォントファミリー名をユーザの使う言語にローカライズする
 
>localizedName(forFamily:face:)
Returns a localized string with the name of the specified font family and face, if one exists.

>Return Value
A localized string with the name of the specified font family and face, or, if face is nil, the font family only.

[AppleDocumentation / NSFontmanager](https://developer.apple.com/documentation/appkit/nsfontmanager)より　

引数`face:`にnilを渡すとローカライズされたフォントファミリーだけが取得できます。

##使用可能なフォントのスタイルを表示
 - `availableMembers(ofFontFamily:)`　フォントファミリーから使用可能なメンバを取得
 - `displayName`　 `NSFont`のインスタンスからローカライズされた名前を取得

#####フォントファミリーからさらに使用可能なメンバを表示するサンプル
```swift
let fontFamilies = NSFontManager.shared.availableFontFamilies
for family in fontFamilies {
    let localizedFamilyName = NSFontManager.shared.localizedName(forFamily: family, face: nil)
    print(localizedFamilyName)//フォントファミリー名
    
    //フォントファミリー名から使用可能なメンバを取得
    let FontMembers = NSFontManager.shared.availableMembers(ofFontFamily: family)
    for i in 0 ..< FontMembers!.count{
        let Font = FontMembers![i][0] as! String//ここで使用可能なメンバを取得
        let FontName = NSFont(name: Font, size: NSFont.systemFontSize)//NSFontのインスタンスを作成
        print(FontName?.displayName)
    }
}
```
###説明

####`availableMembers(ofFontFamily:)`
- フォントファミリーを指定して、使用可能なフォントのメンバを取得する

>For example, if you call availableMembersOfFontFamily:@"Times", it might return an array like this:
(("Times-Roman", "Roman", 5, 4),
 ("Times-Italic", "Italic", 6, 5),
 ("Times-Bold", "Bold", 9, 2),
 ("Times-BoldItalic", "Bold Italic", 9, 3)
)

[AppleDocumentation / availablemembers](https://developer.apple.com/documentation/appkit/nsfontmanager/1462316-availablemembers)より

####`.displayName`
- `NSFont`のインスタンスからローカライズされたフォント名を取得する

##備考
全てのフォントファイルが完全であるとは限らないので本当は、エラー処理をする必要があるかも知れません。

何か間違っているところがあったら指摘願います。

##参考

https://developer.apple.com/documentation/appkit/nsfontmanager
https://developer.apple.com/documentation/appkit/nsfont

https://stackoverflow.com/questions/2977915/how-can-i-get-a-list-of-the-available-nsfont-families
【Android】FrameLayoutの使い方

#プログラミング勉強日記
2020年12月24日
Androidアプリを開発するときにFrameLayoutの存在を知ったので、FrameLayoutについて簡単にまとめる。

#FrameLayoutとは
　パーツを一つだけ配置して使用するレイアウトである。位置の指定はできず、FrameLayoutに配置したパーツは左上に表示される。FrameLayoutに複数のパーツを配置した場合、パーツが重なって表示される。

#FrameLayoutの使い方
　レイアウトエディタのレイアウトから配置することができる。パレット内のFrameLayoutをプレビュー画面までドラッグすることで配置できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/19eea233-dedd-c857-c8a6-550c5c51a393.png)

　FrameLayoutに配置したいパーツをレイアウトエディタのパレットからプレビュー画面へドラッグする。配置したパーツの位置を指定することはできず、画面の左上に表示される。
　2つパーツを配置すると、最初に配置したパーツの上に重なって表示される。
　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/ff736cd2-b357-98eb-6608-16f2afb2881e.png)


#参考文献
[レイアウト（７）-FrameLayout ウィジェットを重ね合わせて配置する。](http://ichitcltk.hustle.ne.jp/gudon2/index.php?pageType=file&id=Android058_FrameLayout)
[Androidアプリ開発のFrameLayoutの使い方【初心者向け】](https://techacademy.jp/magazine/4448)
API Gatewayでモックにレスポンスヘッダを設定する

## やりたいこと

API Gateway (REST API)のMock統合で、任意のレスポンスヘッダを返すようにしたい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79394/9396f0f7-1fcd-86bc-bf40-219c8936f4d4.png)


## やりかた

```
Moge: Fuga
```
というレスポンスヘッダを返すようにする。

まず**メソッドレスポンス**でヘッダー追加を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79394/7b82823c-f13b-3dc9-3e86-f1b840f3549d.png)

次に**統合レスポンス**でヘッダ追加を行う。
**マッピングの値**は`'Fuga'`とシングルクォートで囲む必要があることに注意。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79394/30f87a98-a1bf-5de2-17c0-e09ccaa4d7c1.png)

まったくAPI Gatewayは分かりづらい。
【Node.js】Qiita 週間いいね数ランキング【自動更新】

# タグ別

[`Android`](https://qiita.com/items/8b3af051428d746f26c5) [`AWS`](https://qiita.com/items/e24b6279326a462d456c) [`初心者`](https://qiita.com/items/402899ec543aff109505) [`Docker`](https://qiita.com/items/ae11fca7d2eba445b037) [`Git`](https://qiita.com/items/74eacdbf363e260981c3) [`Go`](https://qiita.com/items/49d4537d95f878b3e91a) [`iOS`](https://qiita.com/items/e61a29a383d0403e92fc) [`Java`](https://qiita.com/items/4c3f84836bfdbb137226) [`JavaScript`](https://qiita.com/items/eaa7ac5b62a0a723edbb) [`Linux`](https://qiita.com/items/362e81e53c3f9dee22f1) [`Node.js`](https://qiita.com/items/66ed7ad8f7c9673e9d50) [`PHP`](https://qiita.com/items/3318cbdbc45c6ebd4014) [`Python`](https://qiita.com/items/9d7f2ffeafb36cf59a77) [`Rails`](https://qiita.com/items/93b9e7f7d143e9ce650e) [`React`](https://qiita.com/items/f9712f8acace22815b99) [`Ruby`](https://qiita.com/items/72c3d2e896bdc3e1a6b3) [`Swift`](https://qiita.com/items/e2b6f0645e29f0e2b761) [`TypeScript`](https://qiita.com/items/25b7c0870afa6d41d19b) [`Vim`](https://qiita.com/items/f5361177baef95e447d1) [`Vue.js`](https://qiita.com/items/2774e02c6eea5c830d99) 

# 集計について

- 集計期間: 2025-06-16 ~ 2025-06-23
- 条件: ストック数が **2** 以上の記事


# GitHub

https://github.com/koki-develop/qiita-ranking

スターをもらえるととっても励みになります :bow:

# いいね数ランキング

## 1 位: [MySQLことはじめ](https://qiita.com/Kimuryo/items/5f519c824a5be4afa841)

[`Node.js`](https://qiita.com/tags/Node.js) [`MySQL`](https://qiita.com/tags/MySQL) [`Database`](https://qiita.com/tags/Database) 
**7** いいね　**4** ストック
[@Kimuryo](https://qiita.com/Kimuryo) さん ( 2025-06-19 22:50 に投稿 )
レコメンドシステムの種類

# レコメンドシステムとは
レコメンドシステムとは、**複数の選択肢の中でユーザーにとって価値のあるものを選び出し、意思決定を支援する仕組み**です。<br>
例えば、AmazonのWebサイトで買い物をしていると、「この商品に関連する商品」や「この商品をチェックした人はこんな商品もチェックしています」という風に、**ユーザーに合いそうな他の商品を推薦**してくれます。Amazon以外にもNetflix（映画の推薦）やTwitter（ユーザーや投稿の推薦）等、多くのサービスでレコメンドシステムが使われています。


# パーソナライズ
レコメンドシステムの分類として、まずざっくりパーソナライズされているかどうかという違いがあります。
<br>

1. **非個人化（non-personalized）**<br>
     全てのユーザーに一律に行う推薦（例：人気商品ランキング）
2. **一時的個人化（ephemeral personalization）**<br>
     利用者の入力に基づいた推薦（例：類似商品の提示）
3. **永続的個人化（persistent personalization）**<br>
利用者の過去の行動に基づいた推薦→その時に同じ入力をしても、過去のデータによって異なる結果を提示

# レコメンドシステムの種類

- ルールベース
- コンテンツ(内容)ベースフィルタリング
- 協調フィルタリング
- 知識ベースフィルタリング
- ハイブリッドフィルタリング



## ルールベース
サイト側に一定のルールを定めることでコンテンツを提示するものです。
例えば、**新着情報**や**セール商品**を提示したり、**この行動をとった人にはこの商品を推薦する**というものがあります。これはパーソナライズされていないレコメンドシステムです。


## コンテンツ（内容）ベースフィルタリング
コンテンツの属性（変数）をもとに類似性の高いコンテンツを提示するものです。
例えば同じジャンルの映画を推薦したり、同じ作家の本を推薦するというものがあります。


## 協調フィルタリング
ユーザーの閲覧履歴や行動履歴をもとに推薦するもので、コンテンツベースよりパーソナライズされる手法です。
協調フィルタリングにはアイテムベースとユーザーベースの2つがあります。

- アイテムベース<br>
行動履歴をもとに商品ベースで推薦する手法です。<br>
例えばAさんが商品Aを購入した時、商品Aを購入した他の人は商品Bも購入しているから、Aさんにも商品Bを推薦するというものです。
- ユーザーベース<br>
行動履歴をもとにユーザーベースで推薦する手法です。<br>
ユーザー同士の類似度（購入履歴が似ている等）を算出し、類似度の近いユーザーの購入した商品をレコメンドするものです。


## 知識ベースフィルタリング
ユーザーに好みを示してもらうことで、「今どうして欲しいか」というユーザーの希望を反映させる推薦方法です。<br>
検索との違いは、**あくまで推薦という形で、より狭い範囲で提示する**ということです。一般的な検索だとその条件に当てはまるものが数百件でも数千件でもヒットしますが、知識ベースフィルタリングでは状況に応じて提案を行います。


## ハイブリッドフィルタリング
コンテンツベースフィルタリングと協調フィルタリングを組み合わせた手法で、データが多い場合により効果的です。
例えばAさんとBさんの嗜好が似ていて、かつ商品Aと商品Bの属性が似ているとします。この時Aさんが商品Aと商品Bを購入し、Bさんが商品Aを購入していると、Bさんが商品Bを気に入って購入する可能性が高いと考えられます。
これはコンテンツを軸にしても、ユーザーを軸にしても類似度が高いハイブリッド型の推薦と言えます。


# レコメンドシステムの選択
それぞれメリット・デメリットがあるため、求める効果やコストによってシステムを選択する必要があります。<br>

例えば、コンテンツベースだと新規ユーザーにも対応できるというメリットがありますが、似たようなものばかり推薦してしまい新鮮さがないです。
また、協調フィルタリングだと思いがけない商品の推薦でユーザーの満足度が上がりやすい一方、新商品や新規ユーザーへのレコメンドが上手く行えないというデメリットがあります（コールドスタート）。
知識ベースのフィルタリングではよりユーザーのニーズを反映させられる一方、顕在的なニーズのないユーザーには利用してもえらえません。


# バッチ処理 vs リアルタイム
上記のアルゴリズムによる分類とは別の角度で、バッチ処理かリアルタイムで推薦しているかという違いもあります。

1. **バッチ処理**<br>
バッチ処理は、ユーザの行動やアイテムの特徴データから事前に推薦リストを作成しておくものです。例えば、Amazonのメーリスであなたにおすすめの商品が届くのは、バッチ処理によるものです。
2. **リアルタイム**<br>
ユーザーの行動からリアルタイムで推薦リストを作成していくものです。NetflixやAmazonでアイテムを閲覧している際に、画面上に出てくる**あなたへのおすすめアイテム**が変更されるのは、リアルタイムで閲覧履歴が反映されているからです。

# 最後に
神嶌先生の<a href="http://www.kamishima.net/archive/recsysdoc.pdf#page=135&zoom=100,113,516">解説資料</a>が、レコメンドを様々な角度から解説してくださっていて分かりやすかったです！
material-uiの初期設定

# material-ui のインストール

`npm install --save @material-ui/core @material-ui/icons @material-ui/system`

# mateirl-ui のフォントと Icon のリンクを追加する

## Roboto Font

```
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" />
```

## Font Icons

```
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons" />
```
【Linux】Qiita 週間いいね数ランキング【自動更新】

# タグ別

[`Android`](https://qiita.com/items/8b3af051428d746f26c5) [`AWS`](https://qiita.com/items/e24b6279326a462d456c) [`初心者`](https://qiita.com/items/402899ec543aff109505) [`Docker`](https://qiita.com/items/ae11fca7d2eba445b037) [`Git`](https://qiita.com/items/74eacdbf363e260981c3) [`Go`](https://qiita.com/items/49d4537d95f878b3e91a) [`iOS`](https://qiita.com/items/e61a29a383d0403e92fc) [`Java`](https://qiita.com/items/4c3f84836bfdbb137226) [`JavaScript`](https://qiita.com/items/eaa7ac5b62a0a723edbb) [`Linux`](https://qiita.com/items/362e81e53c3f9dee22f1) [`Node.js`](https://qiita.com/items/66ed7ad8f7c9673e9d50) [`PHP`](https://qiita.com/items/3318cbdbc45c6ebd4014) [`Python`](https://qiita.com/items/9d7f2ffeafb36cf59a77) [`Rails`](https://qiita.com/items/93b9e7f7d143e9ce650e) [`React`](https://qiita.com/items/f9712f8acace22815b99) [`Ruby`](https://qiita.com/items/72c3d2e896bdc3e1a6b3) [`Swift`](https://qiita.com/items/e2b6f0645e29f0e2b761) [`TypeScript`](https://qiita.com/items/25b7c0870afa6d41d19b) [`Vim`](https://qiita.com/items/f5361177baef95e447d1) [`Vue.js`](https://qiita.com/items/2774e02c6eea5c830d99) 

# 集計について

- 集計期間: 2025-06-16 ~ 2025-06-23
- 条件: ストック数が **2** 以上の記事


# GitHub

https://github.com/koki-develop/qiita-ranking

スターをもらえるととっても励みになります :bow:

# いいね数ランキング

## 1 位: [生のターミナルから卒業しませんか？【oh-my-zsh】](https://qiita.com/flowernotfound/items/480f1aea319762aaf842)

[`Zsh`](https://qiita.com/tags/Zsh) [`Mac`](https://qiita.com/tags/Mac) [`Linux`](https://qiita.com/tags/Linux) [`Terminal`](https://qiita.com/tags/Terminal) [`初心者`](https://qiita.com/tags/初心者) 
**75** いいね　**42** ストック
[@flowernotfound](https://qiita.com/flowernotfound) さん ( 2025-06-18 12:49 に投稿 )

## 2 位: [【資格試験】未経験からLinuC303/304まで3か月で駆け抜けた勉強術](https://qiita.com/Elie1729/items/9fdc40393b74828410da)

[`Linux`](https://qiita.com/tags/Linux) [`Security`](https://qiita.com/tags/Security) [`lpic`](https://qiita.com/tags/lpic) [`資格`](https://qiita.com/tags/資格) [`linuc`](https://qiita.com/tags/linuc) 
**6** いいね　**4** ストック
[@Elie1729](https://qiita.com/Elie1729) さん ( 2025-06-22 01:39 に投稿 )

## 3 位: [DockerfileのCOPYの--excludeオプションを使うために（RHEL・Amazon Linux・Ubuntu・MacOsシステム別 / Docker・Podman）](https://qiita.com/Surlive/items/28935d21a2f64b42c566)

[`Mac`](https://qiita.com/tags/Mac) [`Linux`](https://qiita.com/tags/Linux) [`Docker`](https://qiita.com/tags/Docker) [`container`](https://qiita.com/tags/container) [`Podman`](https://qiita.com/tags/Podman) 
**2** いいね　**2** ストック
[@Surlive](https://qiita.com/Surlive) さん ( 2025-06-17 16:52 に投稿 )
ARKit 4でのFace Trackingの改善

ARKit 4では、TrueDepthカメラを搭載していないデバイスでもFace Tracking（フェイストラッキング）が利用可能になった。つまり、**今まではiPhone X系、iPad Pro系のフラッグシップモデル（わかりやすく言うと、「ホームボタンのないモデル」）でしか利用できなかった同機能が、より幅広いiOSデバイスで利用できるようになった**。

![picture_pc_29069b334e00e11dc0184dd785bab291.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3180/2e1fabd1-9f16-3041-2746-c255c1f6476c.png)

## なぜ嬉しいのか

Face Trackingは**なかなか実用途が見えづらいスマホARの中でも「顔に合わせてアバターを動かす」というわかりやすい用途**があり、

![picture_pc_2441254802dfde109d7795232c69a095.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3180/da024e27-0068-3685-38ee-48b8819c5ce3.png)

昨今の諸事情による**リモートワーク／テレワークの急速な普及、VRChatの流行**といった状況を鑑みると、地味ながらもかなり意味のある改善だと思う。


## デバイスの制限

しかし、ARKitが利用可能なすべてのデバイスでFace Trackingが利用可能になったかというとそういうわけではなく、

**A12 bionicプロセッサ以降を搭載**

というわりと厳しい条件がある。bionicが初搭載されたiPhone 8を持っていたのでこれをiOS 14にアップデートしてFace Trackingを試そう、と思って充電はしたものの、よく考えたらiPhone 8はA11で、つまり手持ちの端末で試せるものがなかった...

- iPhone SE（第2世代）
- iPad mini（第5世代）
- iPad Air （第3世代）

ぐらいしか今のところ（2020年6月現在）はなさそう。まぁ、iPhone SE（第2世代）ユーザーが目下の本機能のターゲットユーザーだと思われる。

## TrueDepthカメラ搭載端末との違いはあるのか

顔のジオメトリの頂点数が少ない、みたいな差異があるのかと思ったが、WWDC 2020のセッションによると、**「デプスがとれない」以外の差異はない**ようだ。

![picture_pc_75e130331a51abb8ebb4455b9415d4ca.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3180/44e2f8de-2cf1-4200-aac7-27ad92c10381.png)

ちなみにここでいうデプスはARFrameのcapturedDepthDataプロパティから取得できるデプス。ARKitで取得可能なデプスについては以下の記事で比較している。

[ARKit 4のLiDAR Depth API - Qiita](https://qiita.com/shu223/items/722077b4bbe868f58ddc)

## アドベントカレンダー

本記事は[iOSアドベントカレンダー](https://qiita.com/advent-calendar/2020/ios)21日目の記事です。2020年12月24日現在、エントリーされていた方が記事をアップされていなかったので、代理投稿させていただきました。

## 関連

ARKitの本、iOSデプスの本を書いています。

[実践ARKit - BOOTH](https://shu223.booth.pm/items/1038241)
[Depth in Depth - iOSデプス詳解 - BOOTH](https://shu223.booth.pm/items/1313752)
LaTeX レポート作成のおすすめパッケージ


この記事は [ISer Advent Calendar 2020](https://adventar.org/calendars/4946) の 18 日目として書かれました．
なお今日はクリスマス・イブです．あれ？

ここでは，LaTeX でレポートを作成する際に自分がよく使うものをまとめてみました．
皆さんのレポート作成の手助けとなれば幸いです．

## bm パッケージ
ベクトルを太字+斜体で書きたいときなどに使えるパッケージです．
文字列を `\bm{}` で囲むと太字+斜体に変換してくれます．

```latex
\[
    A\bm{x} = \bm{b}
\]
```

```math 
A\boldsymbol{x}= \boldsymbol{b}
```

## physics パッケージ
行列や微分をはじめとする数式を簡単に書けるパッケージです．
このドキュメントにすべての機能が載っていますが，少しだけ紹介します．
https://www.ctan.org/pkg/physics

#### 行列
わざわざ `\begin{matrix}` などと入力しなくても行列を書くことができます．

```latex
\[
    \mqty( 1 & 2 \\ 3 & 4 )
\]
```

```math 
\begin{pmatrix}
    1 & 2 \\
    3 & 4
\end{pmatrix}
```

#### 微分
${\mathrm{d}y}/{\mathrm{d}x}$ の形の微分形を簡単に書くことができます．

```latex
\[
    \dv[2]{y}{x} + p\dv{y}{x} + qy = f(x)
\]
```

```math 
\frac{\mathrm{d}^2y}{\mathrm{d}x^2} + p\frac{\mathrm{d}y}{\mathrm{d}x} + qy = f(x)
```

## listings パッケージ
ソースコードを挿入するときに使えるパッケージです．
オプションでフォントを変更したり，行番号を挿入できたりします．

```latex
\lstinputlisting[
    basicstyle=\ttfamily\footnotesize,
    frame=single,
    numbers=left
]{code.py}
```

```code.py
def fact(n):
    if n <= 1: 
        return 1
    else:
        return n * fact(n - 1)
```

![img02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533051/e87d5459-8f6c-277f-ec62-b664c240d51b.png)
中身に日本語が含まれる場合，追加で jlisting パッケージをインクルードする必要があります．



## bussproofs パッケージ
論理式の証明図を書きたい(描きたい)ときに使えます．
ドキュメントはこちら
https://www.ctan.org/pkg/bussproofs

```latex
\begin{prooftree}
        \AxiomC{$(A\land C)\lor (B\land C)$}
                    \AxiomC{$[A\land C]_1$}
                \UnaryInfC{$A$}
            \UnaryInfC{$A\lor B$}
                \AxiomC{$[A\land C]_1$}
            \UnaryInfC{$C$}
        \BinaryInfC{$(A\lor B)\land C$}
                    \AxiomC{$[B\land C]_1$}
                \UnaryInfC{$B$}
            \UnaryInfC{$A\lor B$}
                \AxiomC{$[B\land C]_1$}
            \UnaryInfC{$C$}
        \BinaryInfC{$(A\lor B)\land C$}
        \RightLabel{\small 1}
    \TrinaryInfC{$(A\lor B)\land C$}
\end{prooftree}
```

![img01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533051/cf3365ba-b08e-1999-558e-7631562691c1.png)


## ユーザスニペット
LaTeX 限定の機能ではないですが，とても使い勝手がいいので書きます．

左下の歯車マークから "User Snippets" を選択し，`latex.json` を選択すると登録できます．

たとえば，`latex.json` に次のように書いておくと，tex ファイル上で `code` と入力するだけでここで登録したスニペットが挿入されます．

```json
{
	"code": {
		"prefix": "code",
		"body": [
			"\\lstinputlisting[",
			"\tbasicstyle=\\ttfamily\\footnotesize,",
			"\tframe=single,",
			"\tnumbers=left",
			"]{}"
		],
		"description": "ソースコード用テンプレート"
	}
}
```

```latex
\lstinputlisting[
	basicstyle=\ttfamily\footnotesize,
	frame=single,
	numbers=left
]{}
```

## おわりに
他にもまだまだありそうな気がしますが，とりあえずここまでで．
目を通してくださってありがとうございました．
【Android】Qiita 週間いいね数ランキング【自動更新】

# タグ別

[`Android`](https://qiita.com/items/8b3af051428d746f26c5) [`AWS`](https://qiita.com/items/e24b6279326a462d456c) [`初心者`](https://qiita.com/items/402899ec543aff109505) [`Docker`](https://qiita.com/items/ae11fca7d2eba445b037) [`Git`](https://qiita.com/items/74eacdbf363e260981c3) [`Go`](https://qiita.com/items/49d4537d95f878b3e91a) [`iOS`](https://qiita.com/items/e61a29a383d0403e92fc) [`Java`](https://qiita.com/items/4c3f84836bfdbb137226) [`JavaScript`](https://qiita.com/items/eaa7ac5b62a0a723edbb) [`Linux`](https://qiita.com/items/362e81e53c3f9dee22f1) [`Node.js`](https://qiita.com/items/66ed7ad8f7c9673e9d50) [`PHP`](https://qiita.com/items/3318cbdbc45c6ebd4014) [`Python`](https://qiita.com/items/9d7f2ffeafb36cf59a77) [`Rails`](https://qiita.com/items/93b9e7f7d143e9ce650e) [`React`](https://qiita.com/items/f9712f8acace22815b99) [`Ruby`](https://qiita.com/items/72c3d2e896bdc3e1a6b3) [`Swift`](https://qiita.com/items/e2b6f0645e29f0e2b761) [`TypeScript`](https://qiita.com/items/25b7c0870afa6d41d19b) [`Vim`](https://qiita.com/items/f5361177baef95e447d1) [`Vue.js`](https://qiita.com/items/2774e02c6eea5c830d99) 

# 集計について

- 集計期間: 2025-06-16 ~ 2025-06-23
- 条件: ストック数が **2** 以上の記事


# GitHub

https://github.com/koki-develop/qiita-ranking

スターをもらえるととっても励みになります :bow:

# いいね数ランキング

ランキングに入る記事が見つかりませんでした。
CakePHP デバッグの方法一覧

CakePHPを扱うにあたって色々な手段でデバッグを行ったのでまとめました。

PHP基本のデバッグ
-

**degug**
基本中の基本、引数に変数やマジックメソッドを使う等使い方は無限。

**exit**
処理を抜ける。
画面がリダイレクトする処理等のデバッグをする際に、debug()と組み合わせて使う事が多い。

**stacktrace**
スタックトレースの出力、下記のようにすると見やすい。

```
echo '<pre>';
stackTrace();
echo '</pre>';
```


ORM関連
-
参考：
https://book.cakephp.org/3/ja/orm/retrieving-data-and-resultsets.html#table-find-list

>debug($query) SQL とバインドパラメーターが表示されます。結果は表示されません。

>sql($query) DebugKit がインストールされている場合に限り、最後に描画された SQL を表示します。

>debug($query->all()) ResultSet のプロパティー (結果ではなく) が表示されます。

>debug($query->toList()) 結果を個々に見る簡単な方法です。

>debug(iterator_to_array($query)) クエリー結果を配列形式で表示します。

>debug(json_encode($query, JSON_PRETTY_PRINT)) 人に読みやすい形で結果を表示します。

>debug($query->first()) 単一のエンティティーのプロパティーを表示します。

>debug((string)$query->first()) 単一のエンティティーのプロパティーを JSON として表示します。
CakePHP データ取得の方法（get・find)

CakePHPのデータ取得の方法についてまとめました。

そもそもTable/Entityとは
-
こちらが参考になりました。
https://qiita.com/tatsuo-iriyama/items/87097069013ac9df1ed9

**テーブル**
データのコレクションにアクセスして、レコードの追加・更新・削除やリレーションの定義のためのオブジェクト

**エンティティ**
個々のレコードを指す、レコードの振る舞いや機能を定義する
カラムに対しても処理可能

上記を踏まえてCakePHPのデータ取得とは
-
エンティティを検索したりロードしたりする事を指している。
（データ取得の手段として挙げるメソッドでコレクションとエンティティを返している）

メソッド一覧
-
参考：
https://book.cakephp.org/3/ja/orm/retrieving-data-and-resultsets.html

**get**
単一のエンティティーを取得する
データが見つからなければ404エラーを返す
この中でカスタムファインダーを使用することも可能

```
$article = $articles->get($id, [
    'finder' => 'translations',
]);
```

**find**
ファインダーをロードする
戻り値は常にQueryオブジェクト
実際にクエリが走るのはfind()の実行時ではなく、これの戻り値であるQueryオブジェクトから更に別のメソッドを呼び出す時になる

```
//クエリは走らない
$query = $articles->find('all'); 

//クエリが走る
$query = $articles->find('all')
    ->where(['Articles.created >' => new DateTime('-10 days')])
    ->contain(['Comments', 'Authors'])
    ->limit(10);

```

クエリが走る＝クエリービルダーインターフェイスを使用する事ができる
これでより複雑なクエリを構築できる。
クエリービルダーインターフェイスを呼び出した後の戻り値はエンティティーになる。

オプション一覧
>conditions クエリーの WHERE 句に使う条件を提供します。

>limit 欲しい行数をセットします。

>offset 欲しいページオフセットをセットします。 page をあわせて使うことで計算を簡単にできます。

>contain 関連をイーガーロード (eager load) するように定義します。

>fields エンティティーへとロードされる列を制限します。いくつかの列だけがロードされることになるので エンティティーが正しく動かないこともありえます。

>group クエリーに GROUP BY 句を加えます。集約関数を使う際に便利です。

>having クエリーに HAVING 句を加えます。

>join カスタム JOIN を追加で定義します。

>order 結果セットに並び順を設定します。

ここに無いオプションを使用した場合、beforeFind リスナに渡されオブジェクトの変更が行われる。
また、クエリーオブジェクトの getOptions()で、利用中のオプションを取得する事ができる。らしい
（利用中のオプション、という記載が公式にあったけど利用中が何を指すのかわからない、、）

クエリーオブジェクトをコントローラーに渡すより、カスタムファインダーメソッドを使用する事がおすすめと公式より。

カスタムファインダーメソッドについては別の記事にした方が良さそうだけど、クエリービルダーインターフェイスのメソッドは下記など、、

```
first()
count()
list()
setDisplayField()
```

他多数


まとめ
-
以上、データ取得のための方法はget・findが主ですが、特にfindは戻り値のクエリーオブジェクトの方でかなりたくさんのメソッドが存在するようなので、実際に使うにはそちらも整理しないとと感じました。
私的よく使うgitコマンド【備忘録】

# 私的よく使うgitコマンド【備忘録】
私がいつも使うんだけど、毎回調べてしまってるコマンドをまとめる！！

## コミット履歴を参照

```
git log --oneline
```

## 複数のコミットをまとめる

```
git rebase -i HEAD~3
# これだと直近3つのコミットを1つにまとめる

もし直近2つのコミットをまとめたかったら
git rebase -i HEAD~2
```

## まとめる時の重要コマンド
``git rebase -i HEAD~3``を実行すると以下のようなターミナルになる

```
pick 5gg35g commit 1
pick 4532trt commit 2
pick 2154ffre commit 3

ここで、まとめる先のコミットについては、pickのままにし、
このコミットに取り込みたいコミットについては、fixupにする！
```
``fixup``はそのコミットを 1 つ前のコミットに統合し、その際コミットメッセージを破棄します。

## 直前のコミットメッセージを変更する

```
git commit --amend
```

## addしてしまったものを取り消す時
addしてしまったやつが、index.htmlだとすると

```
git reset HEAD index.html
```

## 直前のコミットを取り消す
### コミット自体は取り消すけど、変更した分は残す

```
git reset --soft HEAD~
```

### 取り消すし、変更した差分もぶっ飛ばす。消す時

```
git reset --hard HEAD~
```

## mainブランチ以外の全てのローカルブランチを削除する

```
git branch | awk '{ if ($1 != "*") print $1; }' | xargs git branch -D
```
[Rails]deviseを導入した（つもり）後、コマンドが効かなくなった



Ruby on Railsでアプリケーションを作成中、deviseを導入しました。インストール後に`rails db:create`でデータベースの作成を行おうとしたところ、

```
undefined method `devise' for Install (call 'Install.connection' to establish a connection):Class (NoMethodError)
```

というエラーが出ました。
`rails s`のコマンドも効きません。


# 原因

`history`コマンドで直近の入力履歴を探ってみると、

```
bundle install
rails g devise install
rails db:create
rails s
```

`rails g devise:install` と入力すべきところが `rails g devise install`と入力されていました。
`:`の書き忘れです。
deviseがそもそもインストールされていなかったようです。

#対策
install.rb というモデルが作成されてしまっている状態なので、削除します。

config/route.rb内のルーティング

 ``` config/route.rb
devise_for :installs
```
の記述をまず削除。

```
Rails d devise install
```
のコマンドを入力。

```
Rails g devise:install
```
を再度実行でOKです。

# 参考記事
https://qiita.com/ryouzi/items/9c5324ba567109ab2a22
モバイルセキュリティ診断

# 概要
libil2cpp使用のモバイルセキュリティ診断時、よく使えるFRIDA用スクリプト
メソッドのoffset（今回は0x000068）把握後、でReturnの値を0にする。

# コード
arm64-v8a

```javascript:change64.js
Java.perform(function() {
    console.log("hooking start");
    var maxPatchSize = 4;                   
    var targetAddr = Module.findBaseAddress('libil2cpp.so').add(0x000068)  
    var patchHex = 0x000080D2              // opcode: mov x0,#0x0

    Memory.patchCode(targetAddr, maxPatchSize, function(code) {
        var cw = new Arm64Writer(code, { pc: targetAddr });
        cw.putInstruction(patchHex);
        cw.flush();
    });

    var targetAddr2 = Module.findBaseAddress('libil2cpp.so').add(0x00006C)
    var patchHex2 = 0xc0035fd6              // opcode: ret

    Memory.patchCode(targetAddr2, maxPatchSize, function(code) {
        var cw2 = new Arm64Writer(code, { pc: targetAddr2 });
        cw2.putInstruction(patchHex2);
        cw2.flush();
    });
}); 
```

armeabi-v7a

```javascript:change32.js
Java.perform(function() {
    console.log("hooking start");

    var maxPatchSize = 4;                  
    var targetAddr = Module.findBaseAddress('libil2cpp.so').add(0x000068)  
    var patchHex = 0x0000A0E3              // opcode: mov r0,#0x0
    Memory.patchCode(targetAddr, maxPatchSize, function(code) {
        var cw = new ArmWriter(code, { pc: targetAddr });
        cw.putInstruction(patchHex);
        cw.flush();
    });

    var targetAddr2 = Module.findBaseAddress('libil2cpp.so').add(0x00006C)  
    var patchHex2 = 0x1EFF2FE1              // opcode: bx lr
    Memory.patchCode(targetAddr2, maxPatchSize, function(code) {
        var cw2 = new ArmWriter(code, { pc: targetAddr2 });
        cw2.putInstruction(patchHex2);
        cw2.flush();
    });

});
```
Web系企業に就職してみて感じた大学時代にやっておけば良かったこと3選

# この記事について
琉球大学アドベントカレンダー2日目の記事です。
https://adventar.org/calendars/5231

当初はスクラムに関する記事を書いていましたが
せっかくの琉球大学アドベントカレンダーなので
自分が大学時代にやっておけば良かったなと思う内容についてまとめることにしました。

(投稿遅れました、ごめんなさいm(_ _)m)
## 対象読者
大学で情報工学を学んでいる人たち

# 始めに
自分は19卒で大学院を卒業して、もうすぐで3年目を迎えるWebエンジニアです。
大学時代はIoTやら機械学習周りをメインに活動していました。
この記事は、大学時代にやっておけば良かったと感じている内容を
後輩たち向けにまとめたものになります。

## アジェンダ
1. 授業内容をちゃんと理解する
2. 開発系のアルバイトを始める
3. 積極的にプレゼンしてみる

# 1. 授業内容をちゃんと理解する
1つ目は**授業内容をちゃんと理解**することです。
それって当たり前じゃん！って感じるかもしれませんが、実際には何となくわかった気がする状態で卒業することが多いと思います。
大学における情報工学系の講義は全ての技術の基礎となります。
イメージしやすく表現すると、情報工学の知識は人の体で言う骨の部分に相当します。
![pet_xray_dog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160148/15b5b4b5-1651-e51d-33ac-c2350fd24064.png)
エンジニアとして就職する場合、
組み込み、機械学習、IoT、Web系など様々な選択肢がありますが
それらはあくまでも骨の上に位置する肉の部分であり
骨格部分の知識がしっかりしている状態を作ることが出来れば
技術をより正確に扱うことが出来ます。
特に**低レイヤーの技術は非常に大事**です。
自分が覚えている部分で授業の範囲を出すと

- OS
- ネットワーク
- Unix
- データベース
- アルゴリズム
- コンピュータシステム

などがあります。
上記の知識は仕事を進めていく中でかなり重要です。
情報工学は学習範囲がかなり広いため大変ですが
就職後でも、これらの基礎知識があれば仕事を進める上で問題となることはほぼ無いので
未来の自分に対する投資と思って、諦めずに学び続けてみてください。
(筆者はネットワークやデータベース系の知識がボロボロの状態で卒業しているので、就職後にコツコツ学んでいます。一緒に頑張りましょうorz)

PS.
人間には得意、不得意があり全ての授業を一人で理解するのはかなり厳しいと思います。
そんな時は周りに頼りましょう。
エンジニア界隈は非常に優しい方が多いです。
友達、先生、コミュニティなど、上手く頼りながら勉強を進めていくと良いかもしれません。

# 2. 開発系のアルバイトを始める
![computer_mob_programming.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160148/44753c9c-70e2-0615-8f3a-7d0010c37878.png)

アルバイトをやるなら開発系のアルバイトがオススメです。
筆者は学部時代の4年間を家庭教師として過ごし、大学院時代の1年間でWeb系のアルバイトを行っていました。
家庭教師のアルバイト自体は非常に楽しくやりがいもありましたが
せっかく情報系の大学に進んでいるなら、開発周りのアルバイトをやっていれば良かったと後悔しています。

理由としては、以下があります。

- サービス開発を通しての学びが多い
- 作業時間がそのまま勉強時間となる

## サービス開発を通しての学びが多い
サービスとしてシステムを開発する場合は
サービスの拡張性、複数人での開発、設計、テストなど
大学の授業では学びにくい部分が必要になってきます。
これらの知識は骨の上に位置する肉の部分に相当しますが
せっかくアルバイトをするなら、大学生のうちに学んでおいて損はありません。
アルバイトではなく、インターンなどでも良いです。
実務を通して得られることはかなり多いため非常にオススメです。

## 作業時間がそのまま勉強時間となる
これは書いている通りです。
将来的にエンジニアとして就職するなら勉強時間は多ければ多いほど良いです。
世間の傾向的に、デジタル庁の開設やコロナ下における環境の変化により
エンジニアの需要が高くなっている傾向にあります。
実際に巷ではプログラミングスクールが流行っており
初めての方でも月数万の投資で
Web開発を学びたいモチベーションがある方が多い傾向にあります。
情報系の大学生の特権として
開発系のアルバイトやインターンなどを比較的に始めやすい立場にあります。
バイト先の求めている人材と自分のスキルがマッチすることがあれば
**開発系のアルバイトをやってみると、得るものが多いと思います。**

# 3. 積極的にプレゼンしてみる
![presentation_setsumei_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160148/a9bab929-3d36-b6d5-f865-ed0cf9a058c0.png)

実務では、周りとのコミュニケーションが必ずと言っていいほど発生します。
自分が伝えたいこと、チームとして伝えたいこと、事業部として伝えたいことなど
相手に伝えたい内容を整理し、しっかり伝えるスキルが必要となってきます。
大学生で一番このスキルが欲しい！となるタイミングは
就職活動や卒論発表などのタイミングだと思います。
学部の始めの頃に主体的にプレゼンの内容を整理したり発表などを行っておくと
後の自分の財産になるため非常にオススメです。

# まとめ
この記事では、就職してみて感じた大学時代にやっておけば良かったことを紹介しました。
どれも就職してからでも出来ることではありますが
大学時代は比較的に時間に余裕があると思うので
もし参考になる部分があれば是非試してみてください。
少しでも参考になれば幸いです。
Vue3を用いたレンタルサーバ上でのSPA構築

## 概要

SPAサイトの構築に際して、普段ならGitホスティングサービス(Github/Bitbucket)にpushした任意のbranchをNetlifyやAWS等にdeployするが、クライアント側のコンプラにより外部サービスが使用できず、レンタルサーバ等にdeployする必要が発生する場合が稀にある。あまり遭遇しないケースだったため30分くらいハマった...ので簡潔にメモ。意外と方策を明確に言語化してる記事が少なかった。

## 環境

今回はVue-CLI v4.5.0以上を用いる。routerを用いない単一ページの場合はWebpack5×Vue3の最小構成を組むが、Vue-router4やVuex4を用いる場合はCLIがやはり手軽。
それぞれVue3リリースに伴うバージョンアップにより記法も多少変わったので、そろそろ慣れたい。

```bash
# バージョン確認
node -v
v15.4.0
vue -V
@vue/cli 4.5.9 

# sampleプロジェクトを作成
vue create sample

# 各種設定。(Routerだけ忘れずに入れましょう。)
Vue CLI v4.5.9
? Please pick a preset: Manually select features
? Check the features needed for your project: 
 ◉ Choose Vue version
 ◉ Babel
 ◯ TypeScript
 ◯ Progressive Web App (PWA) Support
 ◉ Router
 ◯ Vuex
 ◉ CSS Pre-processors
❯◯ Linter / Formatter
 ◯ Unit Testing
 ◯ E2E Testing

~中略~

cd sample

# Compiles and hot-reloads for development
yarn serve

# Compiles and minifies for production
yarn build

```

yarn serveすると http://localhost:8080/ には下記のような画面が表示される。
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507577/9fda4649-cbb2-9185-69e7-dea10cd5d5f2.png)
ナビのHome/AboutがVue-routerで実装されており、ページ遷移が可能。

## 本題

さて、上記のようなSPAサイトを、レンタルサーバ上の任意のディレクトリで動作するようにしていく。
まず、`yarn build`で生成されたdistフォルダを、レンタルサーバ上にFTP等を用いて格納してみる。
配置したdistフォルダを「sample2」にリネームし下記にアクセス。
https://your-domain-name.com/sample2

現時点だと、sample2フォルダ内の各種CSS/JSファイルへのパスが通らず、ConsoleErrorにより何も表示されない。まずはこれを修正していく。

### BaseURLの調整
sampleフォルダ内のルートディレクトリに下記のvue.config.jsを追加。

```javascript:vue.config.js
module.exports = {
  publicPath: process.env.NODE_ENV === "production" ? "/sample2/" : "/",
};
```

Vue-CLIではアプリケーションのBase URLを調整する際に、所謂webpackのoutput.publicPathを修正する代わりの作業として、vue.config.jsを作成し、publicPath項目を上記のように修正することが求められる。
[Vue CLI - publicPath](https://cli.vuejs.org/config/#publicpath)

上記修正により本番ビルドの際にパスが問題なく解決されるようになる。
再度`yarn build`し、生成されたdistをsample2にリネームしサーバ上に格納すると、無事表示されるようになる。
この時点でVue-routerも機能し、SPAサイトとして最低限の機能は満たしたように見えるが、課題がもう一つ残っている。

### 404NotFound対応

Vue-routerで遷移した先のsample2/about ページにてリロードを実行すると、`404NotFound`になってしまう。
上記に関しては、下記のVue-router公式ドキュメントが詳しい。使用しているサーバの種類に応じて処理を追加する。
https://router.vuejs.org/ja/guide/essentials/history-mode.html

今回使用しているサーバはApacheなので、下記 `.htaccess`ファイルをsample2フォルダのルートディレクトリ直下に配置。

```apache:.htaccess

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /sample2/index.html [L]
</IfModule>
```

以上により、下記のようなURL直打ちアクセスや、リロードにも対応したSPAサイトが完成。
https://your-domain-name.com/sample2/about

まだ実運用は始めていないので、今後の運用の中で課題が生じたら改善していく。
【PHP】データの暗号化・復号化

PHPで動作するデータの暗号化・復号化のメモです。
通信時やDBのアクセス時などで使用します。

# 動作環境
PHP 7.3.11

# プロトコル
AES-256-CBCを使用します。

#暗号化
```php

    const AES_KEY = 'tekitou_key';
    const AES_IV= 'tekitou_iv';
    
    /**
     * 暗号化
     * @param string $data
     * @return string
     */
    function encrypt($data)
    {
        return $data === null ? null :
            openssl_encrypt($data, 'AES-256-CBC', AES_KEY, 0, AES_IV);
    }
```

#復号化
```php

    const AES_KEY = 'tekitou_key';
    const AES_IV= 'tekitou_iv';

    /**
     * 復号化
     * @param string $data
     * @return string
     */
    function decrypt($data)
    {
        return $data === null ? null :
            openssl_decrypt($data, 'AES-256-CBC', AES_KEY, 0, AES_IV);
    }
```

#全体

```php


<?php

    const AES_KEY = 'tekitou_key';
    const AES_IV= 'tekitou_iv';
        
    /**
     * 暗号化
     * @param string $data
     * @return string
     */
    function encrypt($data)
    {
        return $data === null ? null :
            openssl_encrypt($data, 'AES-256-CBC', AES_KEY, 0, AES_IV);
    }

    /**
     * 復号化
     * @param string $data
     * @return string
     */
    function decrypt($data)
    {
        return $data === null ? null :
            openssl_decrypt($data, 'AES-256-CBC', AES_KEY, 0, AES_IV);
    }

    //何かしらのデータ
    $value = 'nanikano_data';
    echo $value;

    //暗号化
    $encrypt_value = encrypt($value);
    echo $encrypt_value;

    //復号化
    $decrypt_value = decrypt($encrypt_value);
    echo $decrypt_value;
?>
```
#最後に
keyやivの情報はベタ書きせず、生成するメソッドや隠匿するメソッドを経由したほうが良いと思います。
LINEログインAPI v2.1IDトークン検証でのリクエストヘッダーにはx-www-form-urlencodedが必要

https://developers.line.biz/ja/reference/line-login/#revoke-access-token には記載がないが、他と同じようにContent-Type application/x-www-form-urlencodedが必要。

一応問い合わせ送ったのでそのうち改修されるはず。

```python
from urllib import request, parse

req = request.Request(
    'https://api.line.me/oauth2/v2.1/verify',
    method='POST',
    data=parse.urlencode({
        'id_token': 'IDトークン',
        'client_id': 'チャネルID',
    }).encode(),
    headers={'Content-Type': 'application/x-www-form-urlencoded'},
)

with request.urlopen(req) as res:
    # ...
```
Google検索結果の一覧をCSVでダウンロードしたい！

# はじめに
Googleの検索よく使いますよね。

検索結果の一覧をCSVでダウンロードしたい。

なので結果をCSVでダウンロードできるブックマークレットを作りました！

# 経緯
検索結果の一覧をCSVでダウンロードしたい。

サクッと検索して実現できる拡張機能は見つからず...。

DevTools開いてconsoleから取り出すのもな...。

[先駆者の方](https://qiita.com/kulikala/items/39536872e0f1c492b358)[^1]がいらっしゃいましたが、[既に動かなくなっていた模様](https://qiita.com/kulikala/items/39536872e0f1c492b358#comment-ea60d7e56264e4a96106)。

では、ブックマークレットを作ろう！

# ブックマークレットとは


> **ブックマークレット (Bookmarklet)** とは、ユーザーがウェブブラウザのブックマークなどから起動し、ウェブブラウザで簡単な処理を行う簡易的なプログラムのことである [注釈 1]。 携帯電話のウェブブラウザで足りない機能を補ったり、ウェブアプリケーションの処理を起動する為に使われることが多い。
> [ブックマークレット - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%83%E3%82%AF%E3%83%9E%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88)



# 完成したブックマークレット
```javascript
javascript:(()=>{const e=new Uint8Array([239,187,191]),t=[...document.querySelectorAll`div.yuRUbf`].map(e=>`${e.querySelector`a`.href}, ${e.querySelector`h3`.innerText}`).join`\n`,r=document.createElement`a`;r.download="urls.csv",r.href=URL.createObjectURL(new Blob([e,t],{type:"text/csv"})),r.dataset.downloadurl=["text/csv",r.download,r.href].join`:`,r.click()})()
```

# 使い方
ブラウザで新しいブックマークを作り、上記をURL欄に貼り付けます。
ブックマークの名前は、`Google検索結果CSVダウンロード`などで良いでしょう。
Googleの検索結果画面で、登録したブックマークをクリックすると動作します。

[こちら](https://qiita.com/kulikala/items/39536872e0f1c492b358)[^1]の記事を参考にしております。合わせて参照いただけると幸いです。

また、[こちら](https://qiita.com/naozo-se/items/a763038b02d5335ef4e0)[^2]の記事を参考にしてcsvのダウンロードの部分を書いています。

とても参考になりました。ありがとうございます。

# ソースコード
```javascript
(() => {
  const bom = new Uint8Array([0xEF, 0xBB, 0xBF])
  const data = [...document.querySelectorAll`div.yuRUbf`].map(e => `${e.querySelector`a`.href}, ${e.querySelector`h3`.innerText}`).join`\n`
  const downloadLink = document.createElement`a`
  downloadLink.download = 'urls.csv'
  downloadLink.href = URL.createObjectURL(new Blob([bom, data], { type: 'text/csv' }));
  downloadLink.dataset.downloadurl = ['text/csv', downloadLink.download, downloadLink.href].join`:`
  downloadLink.click()
})()
```

# おわりに
これでボタンポチッで検索結果一覧をCSVでダウンロードできますね！

[^1]: [Google検索結果の一覧をCSVでダウンロードするブックマークレット](https://qiita.com/kulikala/items/39536872e0f1c492b358)
[^2]: [JavaScriptでＣＳＶダウンロードを実現する](https://qiita.com/naozo-se/items/a763038b02d5335ef4e0)
改訂版 FileMakerで郵便番号検索APIを使用して住所を入力する


以前に書いた郵便番号検索APIを使用した記事で利用していたサイトが利用できなくなっており、FileMakerのサンプルファイルが機能しなくなっていましたので、別サービスでのサンプルを掲載しておきます。

今回利用させていただいたサイトこちらです。
[郵便番号データ配信サービス zipcloud](http://zipcloud.ibsnet.co.jp/)


GETリクエストで郵便番号を渡すと、JSON形式で住所データを返して来てくれます。
以前まではFileMaker内に郵便番号データをインポートして検索するしか方法がなく、データの定期更新を行わないといけませんでしたが、オンラインサービスを利用すると更新作業が不要となることがメリットです。
逆にデメリットとしては、ネットの利用が制限されていたり、不安定な場所では機能しない。利用しているオンラインサービスが終了した時点で、機能しなくなることでしょうか。


今回のサンプルファイルをダウンロード後、解凍して実行すると以下のような画面が表示されますので、郵便番号を入力して検索ボタンを押すと住所が補完されます。
![zip_search.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68589/0723c223-7080-58a5-a35b-b9d071b1525d.png)

郵便番号はハイフン有りでも無しでも検索可能です。
作成した処理は検索ボタンをクリック時のスクリプトのみです。
![zip_search_script.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68589/d83da9fc-c4fb-b9a7-24d9-8793b568c302.png)

サンプルファイルを以下の場所に置きましたので、ご興味がありましたら参考にしてみてください。
[郵便番号ネット検索サンプルファイル](https://1drv.ms/u/s!AntDEOnhZ3NOgpoDqASUNry6jcmlnw?e=J4G4ea)
※要 FileMaker pro 16以上

【過去の記事はこちら】
[[郵便番号API] FileMaker16でJSONデータを取り扱う](https://qiita.com/hajisan/items/40a5ffaf93aca7a95272)
JavaScriptイベント処理

昔にjsを学んでいた事があったのですが、その時は何をしているかわからず書いており、少し触ってみたら理解しやすかったので少しアウトプットしてみました。

#jsのイベント処理とは
何か特定のアクションが行われた場合にあらかじめ登録しておいた処理を実行させることができる

例として用意

```html
<div id="web">
  <h1 id="title">学習</h1>
  <p class="content">現在JavaScript学習中、就活中</p>
  <button id="button" class="btn">クリック</button>
</div>
```
####HTMLだけのブラウザ上での表示
![スクリーンショット (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460518/fb51ee30-81c9-4aaa-d5e5-4504a76d9296.png)



###ブラウザが読み込まれた時イベント処理

```javascript

window.onload = function() {
    document.getElementById('title').innerText = '学習中' 
}
```

###実行結果
![スクリーンショット (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460518/8a2aa532-1121-2a67-60d9-18b19a1ab918.png)
window.onloadでブラウザが読み込まれた時にfunction内の処理を実行する。
ドキュメント内のid titleを取得したタグ内のテキストを設定する。

###ボタンがクリックされた時イベント処理

```javascript
document.getElementById("button").addEventListener('click', function()
 {document.getElementById('content').innerText = '現在JavaScript学習中、就活中、ポートフォリオ作成中'})
}

```
###実行結果
![スクリーンショット (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460518/38b1f46b-f621-2c00-7328-d3ff271d7fa2.png)
addEventListenerで取得してきているid buttonのタグがクリックされた時、function内を実行する。
ドキュメント内のid contentのタグを取得しテキストをポートフォリオ作成中を追加した。
授業9回目：assert_equal



# 参考サイト

[チャート式ruby-IV(assert\_equal)](https://qiita.com/daddygongon/items/f6cea87314ee26e130ea)


# お題：assert\_equal を作ろう

2つの変数が等価(equal)かどうかを確かめる関数　assert\_equal を作ろう


# 実装例

単純に実装するとこんな感じ

```ruby
require 'colorize'

def assert_equal(expected, result)
  p ['expected',expected]
  p ['result',result]
  if expected == result
    puts 'true'.green
  else
    puts 'false'.red
  end
end

if $PROGRAM_NAME == __FILE__
  assert_equal(1, 1)
  assert_equal(1, 2)
end
```

出力結果はこんな感じ

```ruby
["expected", 1]
["result", 1]
true
["expected", 1]
["result", 2]
false
```

colorize で文字色を変更することができる 
このページの出力結果はターミナルからコピペしただけなので 
色が反映されていないが、ターミナルでの出力結果は文字色が 
true が緑色、false が赤色になっている 

colorize なんて無ぇぞ、と怒られてしまったらインストールする

```ruby
> gem install colorize
```


# EX

assert\_equal とは逆の結果を返す assert\_not\_equal の追加

```ruby

require 'colorize'

def puts_vals(expected, result)
  puts "expected : #{expected}"
  puts "result : #{result}"
end

def assert_equal(expected, result)
  puts_vals(expected, result)
  if expected == result
    puts "succeeded in #{__method__}.".green
  else
    puts "failed in #{__method__}.".red
  end
end

def assert_not_equal(expected, result)
  puts_vals(expected, result)
  if expected != result
    puts "succeeded in #{__method__}.".green
  else
    puts "failed in #{__method__}.".red
  end
end

if $PROGRAM_NAME == __FILE__
  assert_equal(1, 1)
  assert_equal(1, 2)
  assert_not_equal(1, 2)
  assert_not_equal(1, 1)
end

```

実行結果は以下の通り

```ruby
expected : 1
result : 1
succeeded in assert_equal.
expected : 1
result : 2
failed in assert_equal.
expected : 1
result : 2
succeeded in assert_not_equal.
expected : 1
result : 1
failed in assert_not_equal.
```


# note

・assert\_equalは今後繰り返し使うことになる 
　テスト部分に if $PROGRAM\_NAME == \_\_FILE\_\_　を記述すれば、この部分に囲われた動作は 
　外部ファイルから呼び出されたときに実行しなくなる 
　呼び出し方法については今度使うときに 



------
 - **source** ~/grad_members_20f/members/batamon-427/task9.org
Excel 2019 for Mac での Dir関数

#Excel 2019 for Mac での Dir関数
Dir関数と言えば、Mac版の VBA では必ず問題になる関数ですがExcel 2019では大きな改善が見られました。Mac版での Dir関数の挙動について説明していきます。

##Dir関数
Dir関数は指定されたパスが存在したら、ファイル名またはフォルダ名(オプション)を返す関数です。パスが存在しない場合は”“(空?)が帰ってきます。ワイルドカードを使う事により、指定されたパスを連続してファイル名を返してくれます。体感では利用者が多いと思われる関数です。

Mac版ではExcel 2016まではワイルドカード付きのDir関数は使用できませんでした。

~~~
ファイル、フォルダ確認
Sub dirTest()

Dim path As String

path = ThisWorkbook.Worksheets(2).Range("B3").value

ThisWorkbook.Worksheets(2).Range("B6").value = dir(path)

End Sub

~~~

~~~

ワイルドカード
Sub dirTest2()

Dim buf As String, i As Integer

buf = dir(Range("B3") & Application.PathSeparator & "*.csv")

i = 10

Do While buf <> ""
        Cells(i, 2).value = buf
        buf = dir()
        i = i + 1
    Loop

End Sub
~~~

##Windows10での挙動

当たり前ですが普通に動きます。見づらいですが結果を画像として貼っていきます。

ファイル、フォルダ確認
![windir.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965663/561f6bd6-1b58-b207-a061-f7a91d106b3e.png)

ワイルドカード
![windir0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965663/b476f0a6-7eb9-3dfe-1619-5077b8152597.png)

##MacOS catalinaでの挙動

Excel 2019から使用可能になりました。Windows版と同じ挙動をしています。ただし、初めてアクセスするフォルダではアクセス権の付与が必要です。

ファイル、フォルダ確認
![macdir.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965663/01e0d31a-6e9f-42bf-ef0e-fa7b5d8431d1.png)

ワイルドカード
![macdir0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965663/37b48bb9-b0fb-be63-48bc-507568bace99.png)

長年、Excel for Macを使ってきてDir関数が使える日が来るとは思っていませんでした。尚、[ブログ](https://www.the-forme.net/note/spreadsheet/dirtest/)でも書いています。
Google Apps Script でCSVをGoogle Spread sheetに取り込みソートする

CSVからスプシ（Google Spread Sheet)に取り込むにはGASを使えばよいです。

# 起動経路

取り込みたいスプシの「ツールバー > ツール > スクリプトエディタ」


# コード
コードは以下

## CSV取込
```
//取り込みたいCSVを指定（Google driveで一意ならファイル名だけでOKと思われる。おしえて。）
var file = DriveApp.getFilesByName("test.csv").next();
var csvData = Utilities.parseCsv(file.getBlob().getDataAsString());
var spreadSheet = SpreadsheetApp.getActiveSpreadsheet()
//シートを指定
var sheet = spreadSheet.getSheetByName("CSV");

function importFormCSVFromGoogleDrive() {

    try {
        //ループさせて1列目から順に書き込む
        for (var i = 1; i < csvData.length; i++) {
            // 1行目、3列目以降にコピペ
            sheet.getRange(1, 3, csvData.length, csvData[i].length).setValues(csvData);
        }
　　　　sort();
    } catch (e) {
        //失敗したらログをメールで送りつける
        MailApp.sendEmail("hhogehoge@huga.co.jp", "csvインポート失敗しました。", e.message);
    }

}
```
ソートを使う場合は以下のように書いて↑のように呼べば取込後にソートできます。


```
function sort() {
    var rng = sheet.getRange("A2:R500");//sort範囲を指定
    //2列目を降順に
    rng.sort([{ column: 2, ascending: true }]);

}
```

あとはプロジェクトのトリガーを使えば定期的に取り込んだり、
開いたときに取り込んだりできます。
私が頑なに自分のことを「エンジニア」と名乗らない理由

# はじめに

この記事はなにも技術的なことには触れません
私個人が常に「自分の就いている職の呼び名」について、日々悶々と思っていることを吐き出す内容であることをご留意の上ご覧ください

数え切れないくらいいるQiitaユーザーの方の中に、私と同じような気持ちを持っていたり、共感してくださる方がいれば、とっても嬉しいです

~~ちなみに病んでませんよ🥳~~

# 私は
会社の中では「フロントエンドエンジニア」という肩書きをもらっていて、webフロント周りをやらせてもらっています
大変ありがたいことですね

ですが私は自分の職について聞かれたり、自己紹介で就いている仕事を名乗るときは、
「**webやる人です**」や「**フロントやる人です**」と言っています

つまり会社からは「エンジニア」としての肩書きをもらっているのに、自分では「〇〇やる人」とわざわざ名乗っているのです

# 「エンジニア」と名乗らなくなった経緯

みなさんは、なにがどうなったら「エンジニア」と名乗って良いと思いますか？
ちなみに[Wikipedia](https://ja.wikipedia.org/wiki/%E6%8A%80%E8%A1%93%E8%80%85)にはこう書いてありました（一部抜粋）

> 技術者（ぎじゅつしゃ）とは、工学に関する専門的な才能や技術を持った実践者のことである。なお日本においては、名称独占資格である「技術士」および「技能士」と違って、名称独占資格ではなく明確な定義のない呼称でもある。実際的には、スキルを持つものの呼び名として工学以外の分野も含め広く用いられている[1]。
技術者に対応する英語として、または同じ意味合いの外来語として、エンジニア (engineer) の呼称も用いられる[1][2]。
コンピュータの分野では、総称してコンピュータエンジニア、コンピュータ技術者、ITエンジニアなどと呼ばれる。職種によりインフラエンジニア、システムエンジニア、組込みエンジニア（組み込みシステムエンジニア）、ネットワークエンジニア、ウェブ・エンジニア、データベースエンジニア、カスタマーエンジニアなどもある。

もちろん正解はないと私は思っています
だからこそ、その「エンジニア」像は十人十色なのです

ある人に聞けば、**「要件定義から設計から実装からテスト項目定義までできないとエンジニアではない」**
別のある人に聞けば、**「クライアントの要求に応えられていれば立派なエンジニアなんじゃないかな」**
そのまた別のある人に聞けば、**「動いてるものが作れればエンジニアだよ〜」**

どれも間違っていないと思います
しかし、ここで十人十色のよくない部分が見えてきます

**自分が思っている「エンジニア」像にそぐわないエンジニアがいると、石を投げるのです**
ちなみにかくいう私の「エンジニア」像は、特にありません
名乗りたい人が自由に名乗ったらよいと思っています

石を投げると言っても本当に石ころをぶつけるわけではないですw
裏口を叩くようになるのです

**「このチームには実装者はいるけどエンジニアはいないよな」**
**「こんなこともまともにできないのにエンジニアって名乗らないでほしい」**
**「それってエンジニアとしてどうなの？」**

これらすべて私にとっては日常生活のノイズでしかありませんでした
「エンジニア」をしている私もそう思われて、そう言われているのではないかと考えると、ものすごくストレスでした

自分の職の名乗り方という、こんなにも小さな事柄なのに

なので、

# 逃げてみた
「エンジニア」という肩書きはあれど、「webやる人」「フロントやる人」と名乗ってみることにしました
「エンジニア」という言葉から逃げてみたのです

「やる人」って言葉はとても気楽で、とりあえずそれに触っていれば「やる人」と名乗れる気がするのです
もうこれで十人十色の「エンジニア」像論争に巻き込まれたり、悩まされたりしなくて良くなりました

あと、意外とこの名乗り方はみんなに受け入れてもらえています
そんなに耳触りに違和感ないのでしょう

# これからも
この仕事をしていると、なんらかの技術的壁にあたるのは日常茶飯事です
なのでおそらく嫌でも毎日なんらかの成長はしているのでしょう

それを日々繰り返していくうちに、十人十色の「エンジニア」像のどれか一つにでも当てはまる領域になっているかもしれません
しかし私はずっとこれからも**「〇〇やる人」**と名乗り続けていくのだろうと思います

もう私は自分のことを「エンジニア」とは言いません
これからも「エンジニア」という言葉から逃げ続けます、逃げ続けながら自分がやってて楽しい実装や制作をしていきます

---

逃げるが勝ちを体現した記念カキコ✍️
<br>