OmniAICreator/Qiita-1.07M huggingface dataset:
【PHP】文字列関数まとめ

mb_strlen()やstrupper()は業務でも使っていましたが、その他の文字列関数についても調べてみたので、この機会にまとめてみました。

## mb_strlen()
* 文字列の長さを取得する。
* マルチバイト文字(日本語)も１文字としてカウントされる。
* バイト数の長さを取得したい場合は、後述のstrlen()を使用する。

```php
$cnt = mb_strlen('test');
print $cnt; //4が出力される。
```

## strlen()
* 文字列の長さをバイト数で返す。
* 日本語は文字エンコーディングによって1文字の長さが異なるので注意が必要。
* UTF-8だと日本語1文字は3バイト。

```php
$cnt = strlen('㈱simple-way');
print $cnt; //13が出力される。(日本語1文字で3バイト、半角文字10文字で10バイト)
```

## mb_convert_kana() 
* 半角⇔全角の変換を行う。
* 第2引数に下記オプションを渡すことで変換方法を指定。

|  オプション  |  内容  |
| ---- | ---- |
| r	 | 全角英字を半角に変換する。|
| R	 | 半角英字を全角に変換する。|
| n	 | 全角数字を半角に変換する。|
| N	 | 半角数字を全角に変換する。|
| a	 | 全角英数字を半角に変換する。|
| A	 | 半角英数字を全角に変換する。|
| s	 | 全角スペースを半角に変換する。|
| S	 | 半角スペースを全角に変換する。|
| k	 | 全角カタカナを半角カタカナに変換する。|
| K	 | 半角カタカナを全角カタカナに変換する。|
| h	 | 全角ひらがなを半角カタカナに変換する。|
| H	 | 半角カタカナを全角ひらがなに変換する。|
| c	 | 全角カタカナを全角ひらがなに変換する。|
| C	 | 全角ひらがなを全角カタカナに変換する。|
| V	 | 濁点付きの文字を一文字に変換する。|


```php
$str = '０ １ ２ Ａ Ｂ Ｃア イ う'."\n";
print mb_convert_kana($str,'r'); //０ １ ２ A B Cア イ う
print mb_convert_kana($str,'n'); //0 1 2 Ａ Ｂ Ｃア イ う
print mb_convert_kana($str,'a'); //0 1 2 A B Cア イ う
print mb_convert_kana($str,'akh'); //0 1 2 A B Cｱ ｲ ｳ

$str = '0 1 2 A B Cｶﾞｷﾞｸﾞ'."\n";
print mb_convert_kana($str,'R'); //0 1 2 Ａ Ｂ Ｃｶﾞｷﾞｸﾞ
print mb_convert_kana($str,'N'); //０ １ ２ A B Cｶﾞｷﾞｸﾞ
print mb_convert_kana($str,'A'); //０ １ ２ Ａ Ｂ Ｃｶﾞｷﾞｸﾞ
print mb_convert_kana($str,'AHV'); //０ １ ２ Ａ Ｂ Ｃがぎぐ
```

## strtolower()/strtoupper()
* 文字列を大文字⇔小文字に変換します。
* マルチバイト文字も変換したい場合は、後述のmb_strtolower()/mb_strtoupper()を使用する。

```php
$str = 'ABCDＡ Ｂ Ｃ Ｄ';
print strtolower($str); //abcdＡ Ｂ Ｃ Ｄ

$str = 'abcａ ｂ ｃ ';
print strtoupper($str); //ABCａ ｂ ｃ 
```

## mb_strtolower()/mb_strtoupper()
マルチバイトを含む文字列を大文字⇔小文字に変換します。

```php
$str = 'ABCDＡ Ｂ Ｃ Ｄ';
print mb_strtolower($str); //abcdａ ｂ ｃ ｄ

$str = 'abcａ ｂ ｃ ';
print mb_strtoupper($str); //ABCＡ Ｂ Ｃ 
```

## ucfirst()/lcfirst()
先頭の文字を大文字/小文字に変換する。

```php
$str = 'abc';
print ucfirst($str); //Abc

$str = 'ABC';
print lcfirst($str); //aBC
```

## 参考にしたもの
[公式リファレンス](https://www.php.net/)
Ruby on Rails【プロジェクトを開始する】

#環境
Rails version: 6.0.3
Ruby version: ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
AWSのCloud9というIDEを使用しています。

ここでは環境構築については割愛します。
なお、環境構築についてこちらを参考にしました。
https://railstutorial.jp/chapters/beginning?version=6.0#code-gemrc

#アプリの開始
作成したいディレクトリに移動して以下のコマンドを実行してください。

```
$rails _6.0.3_ new app_name
```
バージョンの指定は任意で、ここでは明示的に6.0.3にしています。app_nameは作りたいアプリケーションの名前です。
このコマンドだけでひとまずアプリを作ることができました。

#ローカルサーバの起動
```
$rails server
```
このコマンドを実行するだけです。
Cloud9を使用していないときは
http://localhost:3000/
にアクセスするとサーバーに接続することができます。

システムによってはローカルWebサーバへのアクセスがブロックされることがありますが、そのときは`config/environments/development.rb`ファイルに以下のコードを追加してください。

```
config.hosts.clear
```
中間結果を保持するだけの変数を使わない

#リーダブルコードを読んで
作成したポートフォリオはまだまだ正しいコードの書き方ができていない部分が多くあります。
そこで、リーダブルコードを読んで少しずつ改良していきます。

#修正部分
以下は、閲覧数を受け取り数字が入っていればそのまま返し、nullであれば０を返す関数です。
修正前では、`count`変数を設定し、その中に戻り値を設定しています。

```javascript:修正前
    questionViewsCount: function (view) {
      let count;
      if (view > 0) {
        count = view;
      } else {
        count = 0;
      }
      return count;
    }
```

しかしながら、この`count`は使わなくても、関数を作ることはできます。
コードを「短く」「読みやすく」するために変数なしで修正しました。
また、引数も一目でページ閲覧数だとわかるように修正しました。

```javascript:修正後
questionViewsCount: function (viewsCount) {
      if (viewsCount > 0) {
        return viewsCount;
      } else {
        return 0;
      }
    }
```

コードがすっきりしたことで読みやすくなりました。
また、変数名も何を表しているのかすぐにわかるようになりました。

#まとめ
・中間結果を保持するだけの変数は使わない
・一目見て理解のしやすい変数名を使う

#参考文献
[リーダブルコード](https://www.oreilly.co.jp/books/9784873115658/)
[WIP: 個数を表す変数名をどうするか問題 - count ? num ? 複数形のs ?](https://scrapbox.io/nwtgck/WIP:_%E5%80%8B%E6%95%B0%E3%82%92%E8%A1%A8%E3%81%99%E5%A4%89%E6%95%B0%E5%90%8D%E3%82%92%E3%81%A9%E3%81%86%E3%81%99%E3%82%8B%E3%81%8B%E5%95%8F%E9%A1%8C_-_count_%3F_num_%3F_%E8%A4%87%E6%95%B0%E5%BD%A2%E3%81%AEs_%3F)
【Rails × Vue】ルーティングエラー404の際に専用のコンポーネントを表示する

#実現したいこと

routes.rbで設定したパス以外のURLにアクセスがあった際（エラーステータス404)にVueで’ページが見つかりません’のようなメッセージを表示するコンポーネントを描出する。

#Rails側の設定

```routes.rb
Rails.application.routes.draw do

.
.
.
match '*path', :to => 'application#error404', :via => :all
#設定外のパスにアクセスがあった際にapplication_controllerの[error404]というアクションを実行する。

end

```

```application_controller.rb

class ApplicationController < ActionController::Base

  rescue_from Exception, with: :error404
  rescue_from ActiveRecord::RecordNotFound,
  ActionController::RoutingError, with: :error404

  def error404(e)
    render "error404", status: 404 
  end

end


```

#Vue側の設定

```Error.vue

<template>
 <h1>指定のページが見つかりません。</h1>
</template>

<script>
export default {
  name: 'Error'
}
</script>

```

```router.js

import Error from './任意のディレクトリ/Error.vue'

export const router = createRouter({
  history: createWebHistory(),
  routes: [
    {
      path: '/404NotFound',
      name: 'Error',
      component: Error
    }

```

```App.vue

<template>
  <main>
    <Header> //今回はHeader componentでエラー404をキャッチするメソッドを実装する
    <div>
      <router-view />
    </div>
    <Footer/>
  </main>
</template>

```

```Header.vue
<template>
省略
</template>

<script>

 export default {
 name: 'Header',
 mounted() {
  this.notFoundPage();
 },
 methods: {
  notFoundPage: function() {
        axios.get(location.pathname) //location.pathnameは現在滞在しているURLを表す。
        .catch(error => {
          if(error.response.status === 404) {
            this.$router.push({name: 'Error'})
          }
        })
      }
    }
  }
  
</script>
```
TailwindCSSで90年代Webデザインのお勉強

普段はRailsエンジニアとして働いていますが、最近デザインの勉強をちょっとしています。

今回は、古典に学ぼうということで90年代インターネット黎明期のデザインを勉強してみました。
個人的に好きなCSSフレームワークのTailwindCSSのversion3.0が昨日リリースされたこともあり、TailwindCSSを使って90年代ホームページのデモサイトを作成しました。

TailwindCSS3.0のサイトはこちら。

https://tailwindcss.com/blog/tailwindcss-v3

# 要件定義
まずはじめに、90年代のウェブサイトについて調べて以下の特徴的な要件を抽出しました。デザインと呼べるもの呼べないものありますがとりあえず。

- レインボーなタイトルが動く
- ゆっくりしていってねの文字
- アクセスカウンター(あなたは〇〇番目のお客様です)
- 左フレーム(Tailwind Playではframe使えないのでflexboxで見た目だけ再現)
- メインカラムは中央揃え
- 配色は彩度と明度が高いものを使用する
- 出来るだけ多くの色を使う
- リンク文字は青文字の下線つきのやつ
- 斜め文字(イタリック文字)を多用する
- 背景画像はそれっぽいやつをリピート使用
- 立体感のあるボタンに補色の文字
- Sorry, This site is Japanese Only!
- ★や☆を多用する
- キリ番踏んだらカキコ 踏み逃げ厳禁
- 右クリック禁止

# 出来たもの
これらの要件を取り込んでTailwind Playというサービス上でデモを作成しました。出来上がったものがこちら。背景画像以外は全部TailwindCSSで出来てます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555569/deec2dcc-384a-8372-82a7-1bd5bd22f3d6.png)

こちらから誰でも参照可能です。

https://play.tailwindcss.com/o2KqVQ1zhh?layout=preview

# 学んだこと

### marquee要素

https://developer.mozilla.org/ja/docs/Web/HTML/Element/marquee

初めて知りましたこのHTML要素。
すでに廃止されていますがほとんどのブラウザでまだ使用可能です。任意の幅で、要素を動かすことが出来ます。折り返したり、同じ方向にずっとスクロールさせたりと、オプションを設定していろいろ操作できます。
上記の通り廃止されているので自分のプロジェクトで使うことはなさそうですが、こんな要素もあったんだなーと思いました。

### レインボータイトル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555569/a1b1868a-dc13-5aa2-36b4-0baa27943a37.png)

TailwindCSSでは以下のようにclassを指定するとカラフルなタイトルを作ることが出来ます。
gradientに対してさらにfrom, via, toの3色を指定しています。

```
text-transparent bg-clip-text bg-gradient-to-r from-green-600 via-yellow-400 to-pink-600
```

### Arbitrary values
Tailswind CSSのv2.1から使用できる機能ですが、htmlのclassに以下のように[]を使用することで任意のサイズや色、値を指定できる「Arbitrary values」というものがあります。これを使うことでReactやVueのコンポーネントで外から値を注入できたりします。

```
<button class="text-[#0000E4] p-[3px]">テスト文字列</button>
```

ただ、個人的にTailwindCSSの一つのメリットは、<strong>あえて制限された選択肢の中からデザインすることで高速に80点のサービスを作成する</strong>という考えを持っていたので、Arbitrary valuesは使わないと思っていました。

今回、スタイルを当てていく中でどうしても制限されたユーティリティクラスではパッと実装できない部分が出てきて(特に色系)、もちろんちゃんとした開発であればconfigに定義していくのですが、簡単なデモサイトでさっと作りたいときはArbitrary valueすごい便利でした。

今後もデモサイトとかちょっとしたモックを高速に作りたいときには重宝しそうだと思いました。

### Tailwind Play早くなった？
Just-in-Time engineが刷新されたおかげなのか、ビルドまでの時間がすごく早くなっているような気がします。

# 最後に
90年代のwebデザインをググっていろいろ見て回るの楽しかったです。
特に配色などは現代ではアンチパターンとなっているものが多く、参考？になりました。

以上です。
Githubで豊かな草を生やし、地球環境に貢献したい

#この地球を草で美しく
**注意！！！この記事はネタ記事です**

この記事は

https://qiita.com/advent-calendar/2021/snct

鈴鹿高専アドベントカレンダーの15日目の記事です。

Githubに今日の進捗をプッシュしたり、新しくプロジェクトを作ったりすることを「草を生やす」と言うそうですね。

現在の私の草原を少しのぞいてみましょう...
![スクリーンショット (177).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1500513/b2a3ca78-b69f-73a0-973a-7f99d0806052.png)
荒れ地になっております。しかしながら、ところどころ豊かな緑が芽吹いております。この美しい緑はどこから来たのでしょうか...

#nekoshark02の美しい草セレクション

##始まりの美しい草、beginnerレポジトリ
![スクリーンショット (183).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1500513/5783e7b8-caf5-0e6f-58c0-62cb0ca9695e.png)
一番初めの美しい緑です。このころはひたすらプログラムがうまくなりたかった頃ですね...でも、プログラミングが何もわからずに死んだプロジェクトも多く生まれました。biginnerレポジトリではC++の基本的なところ（関数、アドレス、クラスなどなど）をたくさん練習しておりました。初めての美しい緑、大切にしたいですね

##第二の草、AtCoder
![スクリーンショット (179).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1500513/9af83ecc-9593-4935-3436-88c1bae546b7.png)
このころにAtCoderに出会い、C++をひたすらに勉強しておりました。しかし、競プロのプログラムがよく分からず（特に、自分のプログラムがなぜWAになるのかというところとか）、だんだんやらなくなっていきました...現在は忙しいのもあってほぼやってないです。また余裕が出来たら改めて挑戦してみたいですね

##第三の草、login
![スクリーンショット (180).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1500513/723232bb-a878-a3c7-3bab-5a23d7a2629b.png)
このころから、何かしらのアプリケーションを作ってみたいと思い、loginレポジトリを作り、コツコツとその緑を育てていきました。一回目は確か失敗した覚えがありますが、Flask-loginというものに出会ってからは、らくらくにログイン画面を作れるようになりました。ちなみにdbについてを勉強したのもこのころですね。Flaskはほんまに楽しかった。楽に作れるし

##第四の草、nekoshark02
![スクリーンショット (181).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1500513/4338709c-b2aa-9c7f-a3fd-df2f64689f68.png)
nekoshark02レポジトリはわたくしのプロフィールでございます。このころ、プロフィールをいじいじするのにハマってました。また、Webアプリケーションを作るのにも多少慣れてきて、ちょっとしたものをつくるようになりました。自分は突発的にプロジェクトを作って、飽きたらすぐ辞めちゃう性格なので、ここらへんで死んだプロジェクトは山ほどありますね...今はあまりWebアプリケーションは作っておらず、ロボコンでのマイコン開発や様々な制御を主にやっています。後にクラウドプラットフォームサービスであるAzureに出会い、衝撃的な~~全然デプロイできないんやが...なんで...~~体験をしました。（注　自分がAzureでのデプロイに成功したのは一回のみです）

##第五の草、flask_tutorial
![スクリーンショット (182).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1500513/cb4fe3eb-a9b7-eeed-910b-1c3456fe7098.png)
この緑は、昔に作ったFlask公式のチュートリアルのプログラムを直しまくったときにできた、フラストレーションの化身、疲労の結晶です。前まで動いていたSQLiteのところらへんからエラーが出て、涙が出ました。そして例によってAzureにデプロイできませんでした。デプロイは悲しみの作業です。しかし私の涙は、新たな命をはぐくみ、インターネットという砂漠に後にオアシスとなる瑞々しい若葉を生やしました。

#今の地球
今の地球はどうでしょうか...
現在地球温暖化が進んでおります...また森林伐採も進んでおります。年々地球から緑が減っています。これは危機的状況です。森林にすむ動物の生態系も崩れ、大規模災害は起こり、地球の表面温度は年々上昇し続けています。

われらが母なる大地、**地球、Earth**

Githubで草を生やすことで...つまり開発をすること、プログラムを書くことで、美しい草をこの地球上に生やしたい。そうすれば、みんな幸せ。地球は救われる...~~かもしれない~~

#ちゃんと地球環境はだいじにしよう！！！！！！！
MPN(Microsoft Partner Network) を活用しよう！

# はじめに
MPN (Microsoft Partner Network) 、みなさん活用してますか？
Microsoft製品を利用する会社であればぜひ活用したい MPN ですが、調べてみてもあまり情報がない気がしています。

今回はそんな MPN についてまとめてみたいと思います。

:::note
本記事の内容はこれまでの経験に基づく個人的解釈となっております。
Microsoft社の正式見解とは齟齬がある可能性がありますので予めご了承ください。
:::

# MPN とは
[MPN (Microsoft Partner Network)](https://partner.microsoft.com/ja-jp/) 
一言でいえば、MS と協業して Win-Win の関係を築いていくためのプログラム。という感じです。

### 対象者
Microsoft のプロダクトを使ってビジネスする会社、個人事業主

例）
- Azure や Microsoft365 などのソフトウェアの販売代理店
- Surface などのハードウェアの販売代理店
- Azure 上にサービスを構築しているアプリケーションベンダー
- Windows for IoT などの組み込み製品を製造しているベンダー
・・・などなど。

### 実現したいこと
* Microsoft とパートナー企業のネットワーク構築と相互成長
* パートナー企業同士のコミュニティ形成
* パートナー企業プロダクトの販売促進

## MPN を利用するメリット/デメリット
### メリット
* Azureクレジットや Microsoft365 ライセンスなどの特典が利用できる
* MPN の管理画面から各種情報を管理できる
* [パートナー企業のDB](https://appsource.microsoft.com/ja/marketplace/partner-dir?filter=sort%3D0%3BpageSize%3D18%3BonlyThisCountry%3Dtrue%3Bcountry%3DJP%3Blocname%3DJapan)に登録し、セールスの窓口として利用できる
* [Azure Marketplace](https://azuremarketplace.microsoft.com/) への自社プロダクト掲載
* 資格取得の促進として、[mstep](https://partner.microsoft.com/ja-jp/Training/mstep-online) というサービスを無償で利用できる
* サービスの成長のためのサポートを受けられる（Azureエンジニアによる構成相談など）
* 上記を選任の営業担当がまるっとサポートしてくれる

こんな感じでしょうか。
セールスやデベロップなど多方面でのサポートプログラムを紹介してくれるという感じです。
さらにこのプログラムが進展していくと、よりMSとの協業体制が強くなっていくようです。

#### 特にオススメしたいメリット
Microsoft365 E3 ライセンスや Azureクレジットといった特典はそのまま費用削減につながるため、情シス的な立ち位置の人は成果に結びつけやすくて美味しいポイントなんじゃないでしょうか。

コンピテンシーのランクなどによって特典も変わってきます。以下は Microsoft365 E3 の場合の比較です。
* ActionPack：5ライセンス
* Silver：25ライセンス
* Gold：100ライセンス

以下から特典内容が掲載されたPDFをダウンロードできます。
[ActionPackのライセンス表](https://assetsprod.microsoft.com/ja-jp/microsoft-action-pack-license-table.pdf)
[Silver & Gold 特典の一覧](https://assetsprod.microsoft.com/ja-jp/mpn-maps-software-iur-competency-license-table.docx)

※獲得するコンピテンシーによっても特典内容が変わりますのでご注意ください

### デメリット
* 黙っていればやってくれる・・・というわけではなく、「サポートプログラム紹介してくれる」という感じなので、こちらも手を動かす & 社内を動かす必要がある
* 継続的な運用も必要になってくる
* プログラムの範囲が多岐にわたるため、サポートも「特典のことは分かるけど、サブスクリプションはサポートできない」など融通が利かずヤキモキすることが多い（Microsoftあるある）

## 登録方法
@dms さんの 「[とりあえず、Microsoft Partner Network に登録してみる！これだけなら無料なので](https://qiita.com/dms/items/c0d4b6a45b18abba5391) 」　にまとまっていますのでご参考ください。

サポートに問い合わせて、「MPN に登録したいんだけど詳しく話聞きたい」という方が早いかもしれません。

# まとめ
- Azure など Microsoft製品を利用している企業は MPN をぜひ検討しよう！！
- たくさん特典があるのが魅力
（初心者むけ）Log4jのゼロデイ脆弱性って何がヤバいの？

##2021/12/13追記

IPA（独立行政法人 情報処理推進機構）のサイトで本件の詳細が記載されました。
日本での、そして、日本語での、信頼性のおける団体の情報だと考えます。
サイトによると追記すべき事項は更新されるとのことで、最新状況はコチラをチェックいただければ。


https://www.ipa.go.jp/security/ciadr/vul/alert20211213.html

#前書き

さて、今日はアドベントカレンダーの枠が空いてるな。もったいない。何を書こうか？とネタを考えていた矢先、なにやら周りが騒がしい。
原因は、このニュース。
良く分からないから調べてみた＆初心者でもわかるように書いてみようと思った話です。

https://www.itmedia.co.jp/news/articles/2112/10/news157.html

#Log4jとは？

前書きの記事には「Javaで使われるログ出力ライブラリ」と書いてある。
簡単にいうと、 **アプリケーションにログ機能を組み込む際に使うOSSのツール** かな？
OSSのツールで、世界中のWebサイトで使われているというから影響範囲が広いということか。

Wikiも貼っておこう。最新の状況が追記されるかもしれない。

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

#何がヤバいの？　どれくらいヤバいの？

この方のカイセツが一番分かりやすかった。あ、前書きの記事にもこの方が出ていた。

https://twitter.com/tkihira/status/1469176450045849601?s=20

つまり、Webサイトなどで稼働するWebアプリの、ログを取るためのツールが、外部のユーザーからのデータ入力をトリガーにして、Webアプリの内部のサーバー上で不正なプログラムを実行されてサーバーが死亡するってことですかね。

**もっと簡単にいうと、公開しているWebサーバーのサイトで、ユーザーが悪意のあるデータを入力すると、そのサーバーが死亡する（＝不能になる）ということ。
そして、ゼロデイ脆弱性ってことは、今、その脆弱性に対する対策パッチなどがまだ出来ていないっていうこと。**

**お、恐ろしい！！！　調べてみて、書いてみて、その恐ろしさが理解できました。**


https://www.nri-secure.co.jp/glossary/zero-day-vulnerability

#どれくらいヤバいの？

Red Hat社のサイトで

**Critical impact**
**CVSS Score 9.8**

だそうです。よくわからないですが、うん、**「やばすぎる」**ってことですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656547/906d1d23-7c3f-06b4-620f-e2a87cf6c780.png)


https://access.redhat.com/security/cve/cve-2021-44228


#後書き
このニュースが金曜に出てくるのもなんかやらしいですね。各国の経営者・IT関係者たちはてんやわんやですね。早々の終息が望まれます。

もし今日から来週とかにかけて、あなたの会社の先輩や上司、もしくはIT関係の友人たちがカリカリしているのはこのせいかもしれません。

もしあなたが、私のように何もできない人であるならば、せめて、何が起きたのか理解して、そして対応に追われているひとたちが、早く問題解決できるように、邪魔をせず、そして、他の人にも邪魔をさせないように、あなたにできることをやりましょう。
たまにはネットから離れてアナログな生活を過ごすのも良いかもしれません。

以上、最後までお読みいただきありがとうございました。
余計なお世話かもしれない記事になってしまいました。不快な気持ちにさせてしまった方には申し訳ございません。

2021/12/12追記

@shun-g 　さんが、より具体的に書いてくれているのを見つけました。うむ、分かりやすい。

https://qiita.com/shun-g/items/93d05d9ce9681e50c18a
Docker環境のNuxtでaxiosエラーが出た時の対処法

dockerコンテナでNuxtとGoのコンテナを作り、axiosでurlを指定してpostしたところCORSエラーで2時間ハマった。

#環境
- windows10 on wsl2
- Docker
  - Nuxt 2.15.7
        - @nuxtjs/axios 5.13.6
  - Go 1.17.4
  - MySQL 8.0.27

#やったこと
まず初めに、Docker間で通信が行えるように`docker-compose.yml`にネットワークを追加した。
**+**が追加箇所

```yml
version: "3"
services:
  client:
    container_name: client
    build:
      context: ./client
      dockerfile: DockerFile
    volumes:
      - ./client/app:/app
    ports:
      - 3000:3000
    tty: true
    stdin_open: true
+   networks:
      - external-api

  api:
    container_name: api
    build:
      context: ./api
      dockerfile: DockerFile
    # command: /bin/sh -c "go run main.go"
    stdin_open: true
    tty: true
    depends_on:
      - "db"
    volumes:
      - ./api/app:/app
    ports:
      - 8080:8080
    working_dir: /app
+   networks:
+     - external-api

  db:
    container_name: db
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: go_database
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      TZ: "Asia/Tokyo"
    volumes:
      - ./db/data:/var/lib/mysql
      - ./db/my.cnf:/etc/mysql/conf.d/my.cnf
    ports:
      - 3306:3306
+   networks:
+     - external-api

+ networks:
+  external-api:
+    external: true
```

externalなネットワークは`docker-compose up`で起動してくれないらしいので手動で作ってあげる。

```
$ docker network create external-api
$ docker network ls
```

正直関係あるかの検証はしていない。

次に、`nuxt.config.js`にproxyを追加した。
`http://api:8080`のapiのところはコンテナ名が入る。
localhost:8080でやっているサイトが多く見られたが自分の環境ではコンテナ名じゃないとアクセスできなかった。

```js:nuxt.config.js
  axios: {
    proxy: true,
    baseURL: "http://api:8080",
  },

  proxy: {
    "/api/": {
      target: "http://api:8080",
    },
  },
```

vueファイルにエンドポイントを指定してpostするとうまく送信できた。

```js:index.vue
  data() {
    return {
      user: {
        name: "Taro",
        email: "hogehoge@sample.com",
        age: 24,
      },
    };
  },

  methods: {
    async postUsers() {
      await this.$axios
        .post("/api/new", this.user)
        .then((res) => {
          console.log(res.data);
        })
        .catch((err) => {
          console.log(err);
        });
    },
  },
```
#参考
https://from-age35.com/1985.html

https://nishinatoshiharu.com/external-docker-network/
【SwiftUI】オブジェクトの同比率でのレスポンシブ対応

# オブジェクトのレスポンシブでのframe指定
以下の方法で指定のオブジェクトが画面サイズに合わせて、下限が0から上限100までの間でサイズが変化します。
ですが下記の方法ではwidthとheightの比率が画面サイズによっては保たれません。

```swift
Rectangle()
   .frame(minWidth: 0, maxWidth: 100, minHeight: 0, maxHeight: 100, alignment: .center)
```

## 同比率でのレスポンシブ対応
下記のようにアスペクト比をfitに指定することで、比率を保ったままサイズが変動するように実装できます。

```swift
Rectangle()
   .frame(minWidth: 0, maxWidth: 100, minHeight: 0, maxHeight: 100, alignment: .center)
   .aspectRatio(contentMode: .fit)
```

# 参考
https://sarunw.com/posts/how-to-resize-swiftui-image-and-keep-aspect-ratio/
VPCで意図した通信ができないときは VPC Reachability Analyzer で原因をしらべたらいい

この記事は [YUMEMI Advent Calendar 2021](https://qiita.com/advent-calendar/2021/yumemi) 10 日目の記事です。

AWSには仮想ネットワーク(VPC)があり、EC2インスタンスやAurora Database、Elasticacheなどのサーバ間通信はVPCを経由します。EC2と Aurora Databaseといったサーバの間で通信が可能なのは、同じVPC内ならセキュリティグループ、ルートテーブル、ネットワークACLを「適切」に設定しなければなりません。構成する要素が増えると、VPCピアリンクやトランジットゲートウェイ、Direct Connectが加わり設定箇所が増えていきます。

サーバの間で通信が行えない場合はパケットの気持ちになって各種設定を見直すのですが、設定の誤りに気づくまでに時間がかかることがあります。設定の誤りを調べるに [VPC Reachability Analyzer](https://docs.aws.amazon.com/ja_jp/vpc/latest/reachability/what-is-reachability-analyzer.html) を利用します。

## VPC Reachability Analyzer (リーチャビリティアナライザー)

AWSコンソールの VPCに「NETWORK ANALYSIS」-> 「Reachability Analyzer」があります。
![AWSコンソールのメニュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145742/2596baca-f115-0a9b-8d65-18ce5e476140.png)


## Reachability Analyzer で分析
通信の両端を指定して、通信経路を分析します。

![通信の両端.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145742/49ad1051-d967-7d8b-5ea9-1f443b99b847.png)

調べられる 装置は EC2インスタンス以外にこれらを指定できます。
![終端.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145742/4aca07c8-4124-6ccd-ac74-f6980a6224b0.png)


## 結果

分析が終わり、送信元から送信先に到達できない場合には、到達できない理由が分かります。
![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145742/90be9071-a65a-c5a8-7ebe-81bd59c8f3d4.png)


登場する機器だけを使った構成図は下の通りです。
![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145742/4a09c90b-7a9b-4c31-566d-5c03e7b08bf5.png)

送信元は左側のEC2(i-0dd14c652d4c386eb)、送信先は右側のEC2(i-07bc69bf22c105df7)の8082番ポートで、VPCピアリンク(pcx-0b2490dc7e6ded573)を介して接続しています。


分析結果の *Explanations* には下のメッセージがあります。
> パケットの送信先アドレスが 10.1.0.0/23 に一致しないため、ルートテーブル rtb-093d0a20dca9e0f6d の 10.1.0.0/23 から vpcPeeringConnectionId へのルートはパケットを転送できません。rtb-093d0a20dca9e0f6d を参照してください。


このメッセージから、左側のルートテーブル `rtb-093d0a20dca9e0f6d` に誤りがありました。 ピアリンクに設定されたCIDRは `10.1.0.0/16` と　`10.2.0.0/16` でした。左側のルートテーブルでは送信先が`10.1.0.0/23` 、ターゲット `pcx-0b2490dc7e6ded573` になっていました。

ルートテーブルの正しい設定は送信先が `10.1.0.0/16` でした。


設定の誤りに気づけない時は時間をかけても気づけないので、ツールでサクッとわかるのは楽です。
bundle instal で起きたエラー (Check the mkmf.log file for more details.  You have to install development tools first.)

# 概要
macOSをアップデートしたばかりだと、bundle install した際に下記のエラーが出ることがある。

![スクリーンショット 2021-12-10 22.00.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461885/ec51c97e-c92f-2b21-bf51-053a06ab7c0f.png)

エラーにある通り

```
/Users/ryotaro/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/extensions/x86_64-darwin-19/2.7.0/racc-1.6.0/mkmf.log
```

の中身を見てみると

![スクリーンショット 2021-12-10 22.05.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1461885/a7dab4a2-ae41-9230-96eb-df4eeddf22f3.png)

これより、xcodeをインストールすれば良いとわかる

下記実行

```
xcode-select --install
```
エンジニアを目指す学生へのポエム

# はじめに

初のアドベントカレンダー参加です。
自分自身が長期インターンを行って感じたこと・学んだことを中心に、これからエンジニアの長期インターンを始めたい学生に向けて参考になる記事になるかと思います。

# 自分について
現在、大学院修士2年の学生です。
（大学の授業でJavaを勉強したこともありますが）本格的にプログラミングを勉強し始めたのは、大学3年時になるので、現在3～4年目といった感じです。
長期インターンを始める前までに、pythonを独学で学び、データ分析やwebアプリケーション開発等を行っていました。

（データ分析は研究で行い、Webアプリケーション開発は個人開発や知り合いから案件を頂いたりしていました。）

# 長期インターン参加のきっかけ
就職活動では、エンジニアとして内定をもらうことができ、実務経験を積むため、その後の修士2年になる4月から長期インターンができる企業を探し始めました。
長期インターンを探すにあたり、[JobPacker](https://jobpacker.app/)を使用しました。
名古屋の学生には、おすすめです！（ステマではありませんw）

JobPacker経由で申し込み、面談後、採用の可否について連絡をいただきます。
（自分は、2社目で採用のご連絡をいただきました。）

長期インターンでは普通の居酒屋アルバイトとは異なり、普通に落ちますw
自分のできること、なぜその企業でやりたいのか等予め明確に持つことをおススメします。

# 仕事について
Webアプリケーションの開発を行っています。
コロナ禍での採用いただいたということもあり、基本的に完全リモートです。
新規のWebサービスの開発に従事しており、チームとしては3人で開発を担当しています。
技術選定や要件定義、実装までフロント・バックエンド関わらず担当しております。

基本的な技術構成としては

- フロント：HTML, CSS, JavaScript
- バックエンド：Django(Python), DRF(Django Rest Framework)
- インフラ：AWS

といった感じです。

# 実務で学んだこと
- コミュニケーション超大事

当たり前ですが、コミュニケーションはすごく大事だと感じました。リモート勤務なので、自然とコミュニケーションは取りづらいですが、勤務終了時は、その日自分のやったことを言語化し共有することで、今何ができて・何ができていないのか、またどういう状態なのかなどをチームの方と共有し認識の齟齬を失くすように取り組んでいました。

また、本インターンではないのですが、就活の際に東京の某一部上場のIT企業で２週間ほどインターンさせていただいた際は、「新入社員の中には、"分かりません"と言って丸投げする人もいるのが、〇〇君は、相談する際に何に困っていて、解決のために何に取り組んだのかを明瞭にした上で、相談してくれるのでとても助かる。」とお褒めの言葉をいただいた際のことを改めて意識するようになりました。

以上、当たり前といえば当たり前なのですが、「周りの学生よりもプログラミングができるから」と威張るのではなく、素直に誠実に真面目に取り組むことが長期インターンや社会人なりたてのうちは、特に重要なことではないかなと考えています。

- ユーザー視点を持つ

僕が開発に携わっているサービスは、正式なローンチ前なので直接ユーザーからのフィードバックをもらえるわけではないのですが、エンジニアは常にユーザー視点を持つことが大事だと感じました。エンジニアであれば、あれもこれも作りたくなるのですが、このサービスのコアコンピタンスは何なのか。ユーザーのペルソナを具体的に想像し、追加する機能を通じてどのようなメリットを届けることができるのか。などの視点が重要でありその視点をチームで共有する事が大事だと感じました。

- 技術力

ここでいう技術力とは、単にプログラミングができるというのは勿論の事、綺麗な（＝保守性の高い）コードを書くことが重要だと感じています。サービスは開発だけではなく、その後継続的にブラッシュアップしていくのですが、長期インターンであると、最初から最後までサービスには携われません（チーム開発であれば尚更）。そのため、ただ書くだけではなく、変数名やクラス設計など他人が書いても英語のようにスラスラ読めるコードであるべきと考えています。そのため、個人的には最も得意な言語であるpythonでもより良いコードを書くためにUdemyで講座を受講し更なる研鑽を積んでいます。


# これからエンジニアを目指す学生に向けて
これからソフトウェアエンジニアを目指す学生の多くは、高校卒業以降にプログラミングに触れる場合が多いと思いますが、個人的には**とにかく一つの言語を極めることをおススメします**。

というのも、一つの言語ができるとそれをメタ的な思考・認知で他言語に応用できるため、２つ目以降の言語習得が容易になります。

とはいっても、

> どの言語を勉強を勉強すればいいの～

とよく聞かれますが、端的にいえば「作りたいもの次第」なので、一概には言えません。

ただし、一般的な候補としては、webサービスなどであれば、

- ruby
- python
- JavaScript
- php

スマホアプリであれば、

- swift
- kotlin

といった所かと思います（その他にもたくさんありますが、割愛します）。

プログラミングスクール等々、手段はたくさんありますが、とにかく

- 楽しむこと
- 何か自分の力でアプリなど作ること

が、上達の近道だと思っていますので、ぜひ頑張ってください！
【Rails】scopeメソッドについて【初学者の疑問点を簡潔に解説】

## はじめに
　本記事は、プログラミングの学習を始めて1ヶ月の初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## 今回の疑問点
　今回の疑問点は、

　　_scopeメソッドについて_
　
　です。　

 　以前、1週間分の投稿を表示させる機能を実装している際に上記について疑問を持ちました。

## 疑問点についての解説

###結論
　scopetメソッドは、Railsのスコープ機能を使用するためのメソッドで、スコープ機能を使用することで、クエリを定義し、同じクエリを複数回使う場合でのメンテナンス性を上げることができる。

###scopeメソッドの使い方
記述方法は以下の通り。
モデルに記述します。

```app/models/sample.rb
  scope: スコープ名, ラムダ式
```
```app/models/sample.rb
  scope :active, -> { where(deleted: false) }
```
モデルで定義したら以下のようにコントローラで呼び出します。

```app/controllers/samples_controller.rb
 定義したモデル名.スコープ名
```
```app/controllers/samples_controller.rb
 Sample.active
```

スコープ機能を利用することで記述量が減り、メンテナンス性が高くなります。
また、複数回同じクエリを記述することがなくなり、Railsの基本理念の一つである、`Don’t Repeat Yourself: DRY`を実現することができます。



余談ですが、scopeメソッドを使用しなくても以下のように記述することで同様のことを実現することができます。

```app/models/sample.rb
  def self.スコープ名(引数)
   処理
  end
```
引数は、不要であれば省略可能です。


## まとめ
最後にポイントをまとめます。

- scopetメソッドを使用することで、同じクエリを複数回使う場合でのメンテナンス性を上げることができる。
- モデルに`scope: スコープ名, ラムダ式`と記述することで定義することができる
- コントローラに`定義したモデル名.スコープ名`と記述することで呼び出すことができる
リーダブルコード 個人的読書メモ

リーダブルコード
<br>――より良いコードを書くためのシンプルで実践的なテクニック

https://www.oreilly.co.jp/books/9784873115658/

3年ほど前に購入した時に一読したのですが、あらためて読みました。
前半は読みやすく、後半からコードを追うのが難しい箇所があり、時間がかかりました。
読書したときのメモや感想をまとめました。

#### 理解しやすいコードを書く
- コードは短いほうがいい
- ただし、理解しやすいコードのほうが大事
- コードは理解しやすい前提で短い方がよい

#### 名前は重要
- いい名前をクラス、メソッド、関数、変数につける
- たとえば、単にgetではなくてget以外の何をgetするのかがわかる単語に変えたほうがよい
- もしくはget+動詞とか
- 基本的には、名前に一時的以外の情報がないtmpは避ける。tmpを変数や返り値の変数に使うと何を返すかわからないので意味のある名前がよい
- ただ、変数のスコープが狭く(3行とか)、用途が明確な場合には使ってもいい
- for文など繰り返し処理内でiなどの変数を使うのがいいが、複数同じ用途の変数がある場合は、iではなくitems_iなど他のものと区別できるものがいい
- 意味がわからない省略した名前を使ってはいけない
- スコープがせまくて、使用する箇所が近くにあって用途がわかる場合であればよい
- 短くしても意味がわかるものは、短くする (例)convertToInteger() を toInt()

#### 見た目の美しさ
- インデント重要
- 複数連続で定義する変数や配列の中身の定義だと縦に揃えるととても見やすい
- 並び順に意味をもたせる。並び順には理由があるとよい
- どんな理由でもよいが、できれば、他と統一性があるとよい

#### コメント
- コードを読んですぐにわかるものにはコメントを書かない
- 読んですぐにわからなそうなコードにはコメントを書く
- そのほうが早く処理を追うことができる     
- 短い簡潔な文章であっても全体像がおぼろげでもわかるコメントがあるとよい
- 新しくプロジェクトに入り、全体像がわからないとつらい
- ソースをがんばって読むよりも処理の要約がコメントされていたほうが時間がかからない
- コメント中にそれやこれといった代名詞が何を指していないかわからない場合に代名詞を使わない
- 代名詞がひとつしか刺さない場合は使ってもよい
- メソッドの引数と返り値の例を示すと分かりやすい場合がある

#### if文について
- if の左側に変化する。右側に変化しない値を持ってくると読みやすくなる

```
# コード例
if (length > 0) {
  // なんらかの処理
}
```

- ifは基本、肯定が先、否定があと
- 否定が主な場合は、否定が先

##### 三項演算子
- 条件が単純で1行で読みやすくかける場合は、三項演算子を使う
- ガード節や変数への代入で使うと便利
- ネストが2重以上で、複雑で分かりづらい場合は、if/ elseのほうがよい
- 三項演算子のデメリットはデバッガーでデバックしずらいこと

##### ガード節
- 早く返すと読みやすくなる場合は、ガード節を使う

```
# コード例
def hoge(params)
  return false if params.nil?

  # 以下、なんらかの処理

end
```

#### ネスト
- true/falseを返す関数では、ifの中にifを書くようなネストの深いコードを書くよりif文の中で早めに都度returnさせたほうがネストが浅くなって読みやすい
- ifの中にifを書くよりも、ifをふたつ書いた方がよい

#### 変数のスコープ
- 変数のスコープは小さくしたい。変数を変更する際に、影響範囲が小さくなって読みやすくなる

#### メソッドの分割
- そのメソッドの上位の目的ではないものは、関数を分けて抽出する
- 読みやすくなるし、再利用できるかもしれない
- メソッドにひとつのことをさせると単純に読みやすい
- 覚えることが少なくてすむ

#### コードを書く前に
- 人に説明するつもりでやりたいロジックをシンプルに整理する　

#### コードを書かない
- 要件を確認して、簡単な実装にできないかを考える
- コードを書かないのが一番バグがない
- ライブラリがあれば自分で書かないで、それを使ったほうがよい

#### テストを書きやすくする
- クラスを小さく
- クラス、メソッドがひとつのことをしている
- クラス同士が依存が少ない

#### 全体的な感想
原文もそうだと思うのですが、文章が優しく、翻訳も優しくて、読みやすいです。
15章「分／時間カウンタ」を設計・実装するぐらいから僕は急に読むのが難しくなった印象があります。

サンプルコードも多くの言語で書かれていて、自分の好きな言語、得意な言語が出てくるとうれしいですね。

随分前に一回読み、内容を忘れていたのですが、確かに自分の中に無意識にやっていたことがありました。
コードを綺麗に読みやすく書くのは、自分の中で優先順位が高いのでネットの記事や他の書籍等でも読んでいるので、そこで重複してるかもしれませんが。
アジャイル開発とウォーターフォール開発の決定的な違い

# ウォーターフォールと比較したアジャイルの特徴

### 学習型予測
■アジャイル
　開発の工程をイテレーション（繰り返）しながら誤差計測と誤差の原因を学習（反省）しながら次のイテレーションへ反映する
■ウォーターフォール
　一発勝負で、かなり先の未来まで予測しなければならない

### 属人化の防止
■アジャイル
　二つのタスクを二人で実施することで、どちらかがダウンしても「100％停止する」ということはない
■ウォーターフォール
　各工程ごと専門家が受け持つので、使いまわしができない

### 分割統治法
■アジャイル
　問題の範囲を限定することで、問題をシンプル化する
　シンプル化で管理工数を削減できる
■ウォーターフォール
　全体にわたって影響を把握しなければならず複雑化する

### １イテレーションの規模は一定
■アジャイル
　QCDのうち可変できるのは成果物の量
　・品質：一定
　・コスト：人数・期間＝一定
　・納品：納品規模＝可変
■ウォーターフォール
　工程ごとに必要な人数、必要な人材がばらつく

### ドキュメントの最小化
■アジャイル
　内情が知れた中では、工程間で引継ぎは最小限で済む
　引継ぎ用のドキュメントが簡略化できる
■ウォーターフォール
　次工程の作業者が変わり、かつ視点の変換が生じるので、そこで齟齬やバグが混在する

## 定番
##### アジャイルソフトウェア開発宣言

私たちは、ソフトウェア開発の実践
あるいは実践を手助けをする活動を通じて、
よりよい開発方法を見つけだそうとしている。
この活動を通して、私たちは以下の価値に至った。

プロセスやツールよりも個人と対話を、
包括的なドキュメントよりも動くソフトウェアを、
契約交渉よりも顧客との協調を、
計画に従うことよりも変化への対応を、

価値とする。すなわち、左記のことがらに価値があることを
認めながらも、私たちは右記のことがらにより価値をおく。


##### アジャイル宣言の背後にある原則

私たちは以下の原則に従う:
顧客満足を最優先し、
価値のあるソフトウェアを早く継続的に提供します。

要求の変更はたとえ開発の後期であっても歓迎します。
変化を味方につけることによって、お客様の競争力を引き上げます。

動くソフトウェアを、2-3週間から2-3ヶ月という
できるだけ短い時間間隔でリリースします。

ビジネス側の人と開発者は、プロジェクトを通して
日々一緒に働かなければなりません。

意欲に満ちた人々を集めてプロジェクトを構成します。
環境と支援を与え仕事が無事終わるまで彼らを信頼します。

情報を伝えるもっとも効率的で効果的な方法は
フェイス・トゥ・フェイスで話をすることです。

動くソフトウェアこそが進捗の最も重要な尺度です。

アジャイル･プロセスは持続可能な開発を促進します。
一定のペースを継続的に維持できるようにしなければなりません。

技術的卓越性と優れた設計に対する
不断の注意が機敏さを高めます。

シンプルさ（ムダなく作れる量を最大限にすること）が本質です。

最良のアーキテクチャ・要求・設計は、
自己組織的なチームから生み出されます。

チームがもっと効率を高めることができるかを定期的に振り返り、
それに基づいて自分たちのやり方を最適に調整します。
laravel vue　Vue.jsのaxiosでError in mounted hook:ReferenceError: axios is not definedの解決方法

##解決方法
```javascript:resources/js/app.js
require('./bootstrap');
```
bootstrap.jsをモジュールとして呼び込んで、axiosを使えるようにしています。

bootstrap.jsの中身は以下のようになっています。

```javascript:resources/js/bootstrap.js
#略

window.axios = require('axios');

window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

```
【Tableau】今年知って便利だったTips③〜Serverバージョン確認〜

この記事は[Advent Calendar 2021 Tableau](https://qiita.com/advent-calendar/2021/tableau2021)の10日目の記事となります。

本日は**Serverのバージョン確認方法**をご紹介します。

私の現場では、Tableau Serverが複数あり、それぞれバージョンが異なります。
今はどのServerが、何のバージョンが把握することができましたが、昔はServerに合わせたTableau Desktopを立ち上げる時に「どれがどれだっけ・・・」と迷うことが多く、Server上で確認できる事を知った後はとても楽になりました。

■Serverにログインした後、TOP画面の右上の「？（ヘルプ）」をクリックします
![スクリーンショット 2021-12-10 21.32.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1537142/daf783e7-e81c-a06b-9cf2-1a6807a0bb30.png)


■Tableau Serverについて　を選択します
![スクリーンショット 2021-12-10 21.34.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1537142/67259066-ec64-d7b2-0c54-3aa2b926b1e7.png)


■ここでServerのバージョンが確認できるので、Desktopを利用する場合には、これと同じバージョンを使えば問題ありません。
![スクリーンショット 2021-12-10 21.36.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1537142/efe4cf3d-f3f5-905d-fb48-9a6efbda7236.png)
PythonのSelenuimを用いてアカウントログイン

#はじめに
この記事ではPythonのSeleniumを使用してQiitaのアカウントにログインしようと思います。
##開発環境
macOS BigSur Ver11.6
Python2.7.18
VisualStudioCode 1.58.2
##事前準備
まずSeleniumが必要なためpipを使用しインストールしてください。

```terminal:terminal
pip3 install selenium
```
次に[ChromeDriver](https://chromedriver.chromium.org/downloads)をインストールします。これはスクレイピングの際に使用するものです。Chromeの種のような感じです。

#開発
まずQiitaのログインは https://qiita.com/login?redirect_to=%2F から行うことができます。以下の手順となります。
1,メールアドレスを入力
2,パスワードを入力
3,ログインを押す
これをseleniumを使用し再現します。
 
```python:login.py
from selenium import webdriver

driver = webdriver.Chrome('絶対パス')
driver.get('https://qiita.com/login?redirect_to=%2F')
```

絶対パスにはChromeDriverの絶対パスを入力します。これで実行するとログインフォームが開くはずです。
次にログインフォームのメール欄・パスワード欄・ボタンのhtmlをみましょう。

```html:mail
<input type="text" name="identity" id="identity" placeholder="ユーザー名 または メールアドレス" autofocus="autofocus" class="form-control">
```
```html:password
<input type="password" name="password" id="password" placeholder="パスワード" class="form-control">
```
```html:button
<input type="submit" name="commit" value="Qiita にログイン" class="btn btn-primary btn-block btn-lg loginSessionsForm_submit" data-disable-with="ログイン">
```

注目するのはそれぞれのname=''です。それぞれidentity,password,commitになってるのが確認できると思います。その要素を作成し、入力・クリックをします。

```python:login.py
from selenium import webdriver

driver = webdriver.Chrome('絶対パス')
driver.get('https://qiita.com/login?redirect_to=%2F')

time.sleep(1)

mail = driver.find_element_by_name('identity')
password = driver.find_element_by_name('password')
button = driver.find_element_by_name('commit')

mail.send_keys('mail')
password.send_keys('password')
button.click()
```

mail,passwordにはQittaのメールアドレス、パスワードをそれぞれ入れれください。
##コードの解説
```python:code1.py
mail = driver.find_element_by_name('identity')
password = driver.find_element_by_name('password')
button = driver.find_element_by_name('commit')
```
ここではそれぞれの要素をnameで作成します。

```python:code2.py
mail.send_keys('mail')
password.send_keys('password')
button.click()
```
順に、メールを打つ、パスワードを打つ、ログインボタンをクリックするです。

#おわりに
いかがだったでしょうか?スクレイピングは初めてでした。これを応用すればいろいろなことに使えますね。他のスクレイピングも紹介できたらと思います!

by Py_r
円グラフを描く

　先日，プロデルに「チャート」ライブラリが追加された。これを使いたい。円グラフが描けるようにしたい。[ドキュメント](https://docs.utopiat.net/rdr/manual/plugins/chart/index.htm)に使い方が書かれているが，1つグラフを表示するためにこれだけ書くのは面倒である。そこで手抜き用に種類を作った。

```プロデル
「チャート.rdr」を参照する

グラフウィンドウとは
	ウィンドウを継承する
	はじめの手順
		初期化する
	終わり
	初期化する手順
		この実質大きさを｛300，200｝に変える。
		この内容を「」に変える。
		初期化開始する。
		初期化終了する。
	終わり
終わり

グラフとは
	はじめの手順
		窓というグラフウィンドウを作る
		グラフ1というチャートを作る
		グラフ1をクリアする
		エリア1というチャートエリアを作る
		グラフ1に凡例を作る
		グラフ1にエリア1を加える
		グラフ1のSizeは，｛300，200｝
		グラフ1のDockは，「全体」
		グラフ1を窓へ貼る
	終わり
	自分を表示する手順
		窓を表示
	終わり
終わり

円グラフとは
	グラフを継承する。
	はじめ（データ，ラベル，タイトル）の手順
		窓の内容をタイトルに変える。
		グラフ1に円グラフを作ってシリーズ1とする
		データすべてをデータの合計で割ったものをデータとする
		［データの個数］回【添字】へ1から繰り返す
			データムは，データポイント（0，データ（添字））を作ったもの
			データムのLegendTextは，ラベル（添字）
			シリーズ1へデータムを加える
		繰り返し終わり
	終わり
終わり
```

これによって，

```プロデル
円グラフ（｛数値，...，数値｝，｛ラベル，...，ラベル｝，「グラフタイトル」）を作ったものを表示
```

の1行で円グラフが表示される。

　[先日](https://qiita.com/nipo/items/a99dbee157a6163b340a)取得してきた「Ｑ２－４付問．ポストドクターを採用しない理由。」のデータを円グラフで可視化したい。このファイルはここではa.xlsに保存されているとする。

```プロデル
エクセルを起動する。
エクセルで「a.xls」を開いて，その選択シートの一覧を，データへ代入する。
エクセルを終了。
ラベルは，データ（5）の4番目から6個切り出したもの。
行番号を6から2ずつ増やしながら［データの個数］まで繰り返す
	タイトルは，データ（行番号）（2）。
	数値データは，データ（行番号）の4番目から6個切り出したものすべてからスペースを消したもの。
	［数値データの個数］回【添字】に1から繰り返せ
		もし数値データ（添字）が「「-{0,1}[0-9\.]+」」という正規表現に合致しないなら
			数値データ（添字）は，0。
		もし終わり
	繰り返し終わり
	円グラフ（数値データ，ラベル，タイトル）を作ったものを表示。
繰り返し終わり

待機する。
```

実行すると・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150160/dcac82f9-6033-b558-9d1c-2c7e93315765.png)

おー良い感じ！

ちなみにウィンドウサイズを変えるとグラフと凡例も勝手に大きさが変わる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150160/d599b320-83e7-296a-ebca-1006929aba45.png)
リモートワークってなんだろうなぁって話

# はじめに
今年の年末は笑ってはいけないシリーズが無いので、
「上島竜兵（さん）と出川（さん）の戦いをテレビで流し、それを一切見ないで、スマホゲーのイベントを回る。」という例年とは別の年越しになりそうだと思っています。
福森です。

今日はリモートワークってなんだろうなぁって話です。
※結論なしの取り留めのない話です。


# 目次

1. リモートワーク
1. で、最近リモートワークをやめました。
1. 出勤 > リモートワーク > 有休
1. リモートワーク作業日 = 自分のペースを貫く日
1. 結局、こうすれば？って思ってること



<!-- 各チャプター -->
## リモートワーク

コロナ禍になって、急に進んだ日本のIT化。
それに伴って、リモートワークってものが、急激に市民権を得たなぁって思いました。

ご多分に漏れず、我が社でもリモートワークを取り入れてみました。
ご存知の通り、リモートワークは、メリットとデメリットがありますが、それについては、割愛します。
ググったで良い記事を見つける方が建設的です。そちらの方がまとまっておりますので。
<a id="#reference">googleさんは、こちら</a>

要するに、急に一般用語になったなと思います。

コロナ禍では、
<font color="DeepPink">出社＝悪</font>
<font color="DeepPink">リモートワーク＝正義</font>
みたいな　文化が染み付いたように感じています。

「うちの会社、いまだに出社だよ」なんて言った日には
「え、まじ？」みたいに言われるのが多いなって感じてます。
※年齢は、20代の人をイメージ

##で、最近リモートワークをやめました。
居酒屋が20時で閉まらなくなった時から、リモートワークをやめました。
「<font color="DeepPink">リモートワークをやめた</font>」といいつつ、リモートワークしてる社員がたくさんいます。
基本的に、出社する方が、うちには合っているのでは？と考えたので、リモートワークをやめるって宣言をしました。

ただ、リモートワークが市民権を得てしまっていますし、禁止もしていないので
「今日は、リモートワークにしようかな？」
という選択肢が、脳裏をよぎるタイミングが増えたと思っており、これが厄介だなって思っています。


## 出勤 > リモートワーク > 有休
体調不良で、休もうか仕事しようか迷っている時ありますよね。
そんな時の選択肢が増えたように感じてます。

過去）
「体調不良なので休みます」

現在）
「体調不良なので休みます」 or 「<font color="DeepPink">リモートワークします</font>」

こんなイメージです。

体調不良で、休みが欲しいんだけど、罪悪感あるしリモートワークって言っとけば良いんじゃね？
みたいなノリがありそうです。

「リモートワークします」って言葉の口当たりが良くて、ついつい使いたくなっちゃう感じ。
私は、月曜日の朝とか、言いたくなります。


ただ、仕事を振っている立場としては、リモートワーク作業者を穿った眼で見てしまう部分もあって
（いやいや、リモートワークって言って、YouTubeでもみてるじゃね？）
と思ってしまう時もあります。

で、この「ちょっと落ち着いているコロナ禍でのリモートワークでのあり方って、どうなるのがいいんだろう。」
って考えてます。

## リモートワーク作業日 = 自分のペースを貫く日

色んな人に期待をして、期待したことを覚えている自分の器が小さいと悩んでいる私ですが、
まず、リモートワークは自分ペースの仕事を貫く日って、私、思ってます。

<font color="DeepPink">仕事はしたいんだけど、今日は自分のペースを守らせてほしい！
ちょっとリラックスして仕事させてほしい！</font>

を、リモートワークの日にすればいいんじゃないかなと。


## 結局、こうすれば？って思ってること
毎年、有休が付与されるのと同じように。
リモートワーク日を付与すれば？って思います。

向き不向きがあって、まじでサボっちゃう人がいるのもわかってるので、
その人は、リモートワーク日の付与日数を少なくするイメージ。

この人は、リモートワーク向いてるなぁって人は、付与日数を多くするイメージ。

出勤と有給の間に、「リモートワーク」って単語を入れてあげて
大義名分を持たせてあげるのがいいんじゃないかなぁ・・・って思います。

そんな制度を会社に作るのを来年の目標にして、スマホゲーのイベントハムに戻りますね。

----

こんなところで、私のAdvent Calendar ターンはおしまいで、次の方にお渡しします ノシ
【雑談】サポーターズミートアップイベントに行ってきた！

にいまるです！

ミートアップに参加したときの記事ですが、ただの雑談なので役に立つかどうかは知りません！

でもエンジニアとしてリアルの場に出ることは初めてだったのですが、オンラインでは体験できないことだらけでした！！！

## 参加したイベント
参加したのは[こちら](https://talent.supporterz.jp/events/593e54fd-81db-436c-8c58-eaa7252f4c74/)のイベントです！
エンジニア1on1イベントに参加した学生だけが招待される的なやつで、起業さんとカジュアルに直接お話できるイベントです。
オフラインイベントが初めてで楽しそうということはあるのですが、僕は大きい建物や高いところが好きなので、渋谷ソラスタのvoyageさん本社に行けるというのもめちゃめちゃ楽しみでした（笑）

## 当日の流れ

11:00 サポーターズさん側からイベント説明
↓
学生と企業さんの自己紹介
↓
20分×6タームの座談会
↓
18:00 おしまい

## 楽しかったこと

### 志望度の高い企業さんとめちゃめちゃ近い距離で話せた
とある企業さんがめちゃめちゃ志望度高かったので、社内の雰囲気だとか技術面のお話だとか、あとプロジェクトがどうやって生まれるのか、みたいなことを聞いて、イメージが付きました！
あとオフラインだったので個人的にはとても喋りやすかったです。相手の背が分かるのも新鮮でした。スタッフの方意外と背がちっちゃい！（笑）

### オフィスめちゃめちゃきれいでした
将来もこんなところで働きたいです。ハンモックとかもあって写真撮りまくってました。

### ペルソナ３，４，５のBGMが流れていた
イベント説明のときに流れていたのですが、心のなかでノリノリでした。だれが選曲したんだろう。

### ゴンチャ大量にあった
タピオカマシマシのゴンチャが大量にあってマジでテンション上がりました。

### 選考と関係ないので、単純に興味のある質問ができた。
データの収集どんなライブラリ使ってますかだとか、エンジニアからプロジェクト立つことあるんですか、あなたと社長の年収いくらですかみたいな、興味本位100の質問がいくらでもできたので最高でしたね。選考ではできないかなりズバッとした質問もできたのでクソ楽しかったです

### お金は大事
自分は就活においてお金の面はあまり考えていなかったのですが、「給料はぶっちゃけエンジニアとしての価値を測るものだし、自分もお金大好き。自分の将来なっていたい状態から年収モデルを逆算するといいよ！」と言われました。初任給や制度はぶっちゃけ釣りが多いらしいので、上がり幅とかちゃんと聞こうと思います！！あと年収を2000で割るとおおまかな時給が出るらしいです

### マインド面参考になった
素でいてOKなんだなと再認識して安心しました。自分で考えを持っていてかつ素直で、プラスαで相手の求めていることを把握して、それに合わせられる人はエグいっていう話にめちゃめちゃ共感しました。

## イベント終わった後の雑談
なんか残っていい雰囲気あったので、仲良くなった人やサポーターズの方と、voyageオフィスで４，５時間くらい雑談してました。雑談大好きなのでむしろこっちがメインイベントでした。

### 自分が一人で考え続けてきたものを共有できた
恥ずかしいので詳細は言いませんが、自分が自粛期間に考えいて誰にも共有してこなかった考えを初めて共有してとても共感されたので、心が温まりました

### 23卒は誇っていい、、
自粛期間の中一人でちゃんとモチベ保って勉強してきたのはすごいらしいです。。今後義務教育でプログラミングに興味持つ人が増えそうですが、23卒は義務教育がなく自主的にやっていてかつ自分で考えて勉強しているので、なんか誇らしい気分になりました（笑）

### サポーターズさんの裏話いろいろ（笑）
ビジネスモデルとかなぜvoyageに入社したのかみたいなことを聞いて面白くて、自分にも役立てることができるものが多かったです。
改めてサポーターズってマジで良いサービスだなと思いました。。。。

### めちゃめちゃ気が合うエンジニア仲間ができた
自分と似ている性格の人が多く、ほとんど大学の友達と同じように接していました。「エンジニア仲間」みたいな人が僕には全然いなかったので、ついにできたぜ！みたいな気持ちでした。いざ話してみると優秀な人が多くて、話が盛り上がって無限に話していました。


## さいごに
サポーターズさん、僕はゲロ楽しかったのでマジでまた開催してほしいです！
エンジニア就活生としても需要のあるイベントだと思っています！待ってます！
Windows Subsystem for Android で Google Play Store を使う

やってることは、WSAGAScript に書いてある通りですが、Qiita には無さそうだったので書きました。

## 使うもの
- Windows 11 x64 （WSL2 Ubuntu インストール済み）
- [WsaPackage](https://store.rg-adguard.net/)
- [WSAGAScript](https://github.com/WSA-Community/WSAGAScript)
- [OpenGApps](https://opengapps.org/) （x86_64 / Android 11.0 / pico）



## 文中で登場するフォルダについて
これらが含まれるコードを実行する場合は、自分の環境のパスに書き換えてから実行してください。

- ***{Temp_Folder}*** → ダウンロードや作業時に利用するフォルダ (e.g. `C:\Temp`)
- ***{WSA_Folder}*** → カスタムした WsaPackage のフォルダ (e.g. `%LocalAppData%\Microsoft\Windows Subsystem for Android`)



## WsaPackage のダウンロード
1. [ここ](https://store.rg-adguard.net/)にアクセスする
1. 左のプルダウンを `ProductId` に変更 
1. 検索ボックスに `9P3395VX91NR` を入力
1. 右のプルダウンを `Slow` に変更
1. 検索結果から末尾が __.msxibundle__ となっているものを探す （恐らく検索結果の一番下にあると思う）
1. ファイル名を右クリックして『名前をつけて保存』で ***{Temp_Folder}*** へ保存する



## WsaPackage の改変
2. ダウンロードした WsaPackage を 7-zip などのソフトで展開する
2. 展開した中にある `WsaPackage_X.X.XXXX.X_x64_Release-Nightly.msix` を任意の場所に展開する （展開先が ***{WSA_Folder}*** となる）
2. ***{WSA_Folder}*** の中にある `AppxBlockMap.xml` と `AppxSignature.p7x` と `[Content_Types].xml` の計3つのファイルを削除
2. ***{WSA_Folder}*** の中にある `AppxMetadata` フォルダを削除



## WSAGAScript での作業
3. WSL2 を開き、`sudo apt install unzip lzip` を実行
3. `cd /mnt/{Temp_Folder}`を実行
3. `git clone https://github.com/WSA-Community/WSAGAScript`を実行
3. `cd WSAGAScript` を実行
3. `explorer.exe .`を実行して、エクスプローラーを開く
3. ダウンロードした OpenGApps を `.zip` ファイルのまま ***#GAPPS*** フォルダの中に入れる
3. ***{WSA_Folder}*** の中に4つの `.img` ファイルがあるので、これらを ***#IMAGES*** フォルダの中に移動させる
3. WSL2 にて以下のコマンドを1行ずつ実行する

```batch
chmod +x *.sh
./extract_gapps_pico.sh
sudo ./extend_and_mount_images.sh
sudo ./apply.sh
sudo ./unmount_images.sh
```

&nbsp;9. これでイメージのカスタムができたので、***#IMAGES*** の中に入れた `.img` を ***{WSA_Folder}*** へ戻す


## カスタマイズした WsaPackage を登録する
4. 設定で __開発者モード__ を有効にする
4. Windows PowerShell を __管理者__ で起動する
4. `Add-AppxPackage -Register {WSA_Folder}\AppxManifest.xml` を実行する
4. スタートメニューに Windows Subsystem for Android™ Settings と Play ストア があることを確認する
4. Play ストア を実行して、Google アカウントにログインできれば完成！

<details><summary>**Google アカウントにサインインできない場合は・・・**</summary><div>
Kernel を変更して、root化済みの状態にすればログインできるようです。
（多分）ログイン後に Kernel を元に戻せば root 解除もできると思います。

5. エクスプローラーで ***{Temp_Folder}*** の ***WSAGAScript*** フォルダの中にある ***misc*** フォルダを開く
5. フォルダ内にある `kernel-x86_64` ファイルをコピー
5. ***{WSA_Folder}*** の ***Tools*** フォルダに `kernel-x86_64` を貼り付け
5. `kernel` ファイルを削除するか、バックアップしておく
5. `kernel-x86_64` を `kernel` に名前を変更する

  </div>
</details>

## アップデートについて
この方法で Windows Subsystem for Android をインストールすると、Microsoft Store からアップデートは受けられません。
そのため、手動でパッケージを更新してアップデートする必要があります。
この時、上記全ての作業を再度行う必要はないので、必要な手順をここにまとめておきます。

:::note warn
私自身まだ試していないので、うまく動作しないかもしれません。
下記通りに実行をした方がいましたら、コメントにてお知らせ頂ければ幸いです。
:::

6. スタートメニューから Windows Subsystem for Android™ Settings をアンインストールする
6. エクスプローラーにて ***{WSA_Folder}*** を開き、4つの `.img` ファイルをバックアップする
6. 既存の ***{WSA_Folder}*** を削除する
6. 前述の **WsaPackage のダウンロード** と **WsaPackage の改変** を行う
6. バックアップしていた4つの `.img` ファイルを ***{WSA_Folder}*** へ上書きする
6. 前述の **カスタマイズした WsaPackage を登録する** を行う

## 終わりに
初めて書いた記事なので、わかりにくい箇所や、拙い部分もあると思いますが、参考になれば幸いです。
何かわからないことがあればお気軽にコメントしてください。
chart.jsを使用して、3ステップで簡単にグラフを描く【Rails】

# 1. chart.jsを使用する準備
CDN（Content Delivery Network）を利用するとファイルをダウンロードする必要が無いのでとっても簡単です。
headタグ内に以下の記述を追記するだけで完了です。

```application.html.erb
<head>
...
<script src="https://cdn.jsdelivr.net/npm/chart.js@2.8.0/dist/Chart.min.js"></script>
...
</head>
```



# 2. グラフをhtml.erbファイルに配置

`canvas`タグを目的のhtml.erbファイルに配置。ここにchart.jsのグラフが挿入されます。
`javascript_pack_tag`は、webpackerがJavaScriptをブラウザに適したファイルにコンパイルする役割を持ちます。

```index.html.erb
<canvas id="[aaa(任意の名前)]"></canvas>
<%= javascript_pack_tag '[bbb(任意の名前)]' %>
```



# 3. chart.jsの中身

`app/javascript/packs`配下にbbb.jsというファイルを作成します。

```app/javascript/packs/bbb.js
var ctx = document.getElementById("aaa");
var myChart = new Chart(ctx, {
  type: 'bar',
  data: {
    labels: ["月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日", "日曜日"],
    datasets: 
    [
      {
      label: 'ランニング走行距離',
      backgroundColor: 'rgba(102,255,129,0.2)',
      borderColor: 'rgba(122,255,129,0.2)',
      data: [4, 2, 3, 6, 3, 5, 7] /* データは任意の数値 */
      }
    ]
  },
  options: {
    scales: {
      yAxes: [{
        ticks: {
          suggestedMin: 0
        }
      }]
    }
  }
});
```

`rails s`して確認してみましょう！以下のようにグラフが描画されていたら成功です。

![スクリーンショット 2021-12-11 0.04.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1293293/140b41ca-dacb-9b46-c01a-49a090a60873.png)



# 終わりに
お疲れ様でした。複雑そうに見えて簡単にグラフを描画することができたかと思います。
ここで紹介しているのはchart.jsのグラフをアプリで正常に表示させることだけを意識しているので、余計な設定は削り、シンプルなコードにしています。
chart.jsはオプションでラベルの表示や、変数の使用ができるのでいろいろ調べてみるとchart.jsの表現の幅が広がると思います。
実際に変数を使ってグラフを描画した少し発展verの記事もあるので良ければどうぞ。
[chart.js × gon → 変数を用いた動的なグラフが描ける！【Rails】](https://qiita.com/i-f/items/ba8804f35eb8593cc045)

# 参考
[Chart.jsでグラフを描画してみた](https://qiita.com/Haruka-Ogawa/items/59facd24f2a8bdb6d369)
[【Rails Chart グラフ】Railsで、投稿に連動した美しいグラフを作ってみよう](https://zenn.dev/be_the_light/articles/1c0933fcc0f8bc)
色読み脳トレをなでしこで作ろう！

高齢者の脳活性化のために「脳トレ」が推奨されていますね。なでしこで脳トレのためのプログラムを作るのも一つの「脳トレ」かと思います。ここで作りたいのは、「色読み脳トレ」です。

例えば、以下のような色と漢字がバラバラで配置されます。これを何秒で読み上げできるかを競うゲームです。


![スクリーンショット 2021-12-10 21.05.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33180/3b31bede-2a44-0f74-9f4a-7cfd715b8971.png)

色と漢字がちぐはぐなので、気をつけないと間違えてしまいます。
いろいろな自治体がサンプルデータを配布しています。例えば、[こちら](https://www.city.anan.tokushima.jp/docs/2020041900020/)です。

これをなでしこで作成しましょう！

# 色と漢字をどのように持たせるか

ゲームを作る時、もっとも大切なのが、**ゲーム内のデータをどのようにプログラム内で扱うか**という点です。

今回のゲームでは、利用する漢字のデータと、表示したい色のデータを配列変数に入れて利用すると便利ですね。

```ゲームデータ.nako3
# 定数を指定
漢字群＝["赤","青","緑","橙","黒"]
色番号＝["red","blue","green","orange","black"]

# 空の器を用意
漢字群器＝[]
色番号器＝[]
```

そして、変数「漢字群器」が空だったとき（初期状態のとき）、変数「漢字群」を複製して、シャッフルして利用するようにします。以下のような関数を作ると良いでしょう。

```シャッフル.nako3
●シャッフル取得とは
　　もし(漢字群器の要素数)＝0ならば
　　    漢字群器＝漢字群を配列複製。
　　    色番号器＝色番号を配列複製。
　　    漢字群器を配列シャッフル。
　　    色番号器を配列シャッフル。
　　ここまで。
　　[(漢字群器から配列ポップ), (色番号器から配列ポップ)]を戻す。
ここまで。
```


さらに、「繰り返し」文を使って、繰り返し上記で定義した「シャッフル取得」関数を呼び描画すべき文字と色を取得して、キャンバスへ描画します。

```文字を繰り返し描画
●色読み脳トレ描画とは
　　全描画クリア。
　　Yを0から(Y文字数-1)まで繰り返す
　　    YY=(1+Y)*YW
    　　Xを0から(X文字数-1)まで繰り返す
        　　XX=(1+X)*XW
        　　色々＝シャッフル取得。
        　　色々[1]に塗色設定。 # 漢字の色を設定
        　　[XX,YY]に色々[0]を文字描画。 #　漢字を描画
        ここまで。
    ここまで。
ここまで。
```

一つずつ、何をしたら目的の動作が得られるかを考えていくとプログラムを組み立てることができます。

# まとめ

上記で作った脳トレは、以下で実際に遊ぶことができます。

- [色読み脳トレ(n3s.nadesi.com)](https://n3s.nadesi.com/index.php?page=867&action=show)

![スクリーンショット 2021-12-10 20.53.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33180/75c36d08-6116-35e1-c070-078c0ddf3532.png)


ゲーム作成の参考にしてみてください！
Azureハッカソンリーグ2021 Vol.01に参加して最優秀賞をもらった話


# はじめに
> 2021年の12/04・12/05の2日間でMicrosoft Azureをひたすら使い倒すAzureハッカソンリーグ2021に参加してきたので、記録として残そうと思います。


# 概要

- 日程: 2021/12/04・2021.12/05(2日間)
- 場所: オンライン（zoom/slack）
- 主催: 一般社団法人MA
- 協賛: 日本マイクロソフト株式会社
- 協力: 各コミュニティ


# チーム分け
チーム分けをして開発を行っていくんですが、その前に参加者同士で**アイディア発散**というものがありました。
参加者全員でアイディア発散した後、1人1つどれを開発したいか決めて投票を行い上位数アイディアの中から開発やってみたいものを決めてそこで集まった人がチームになるという方法でした。

僕は、**チームE BUREIKOU**というチームに参加しました。


# チーム BUREIKOU

チャットで打ったフランクな文章を相手（上司や部長）の立場に応じて敬語に変換するアプリの開発を行いました。


### チームメンバー
BUREIKOUは、5人で行いました。

- Fujisawa(@naoya0614)
- enokida([zennアカウント](https://zenn.dev/takoeno))
- Iさん
- Kさん

# システム構成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533263/2f72b915-af8e-b579-6067-e1176359e74e.png)

# 役割分担

チーム結成後、それぞれどんな技術をもっているか書き出しました。
そして、決まった役割分担がこちら。

| 氏名 | 役割 |
|:-:|:-:|
| Fujisawa | リーダ  |
| Enokida  | インフラ・サーバー  |
| Kさん | インフラ  |
| Iさん  |  サーバー |
| Araki  | フロント  |

# 成果

<iframe width="1014" height="555" src="https://www.youtube.com/embed/ncJ6LevjYac" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>




# まとめ
初めてハッカソンに参加させて頂いて「どんな感じだろう」とかなり緊張していましたが、まさか最優秀賞とれるなんて思ってもみませんでした。
チーム内での年齢が近くて雑談等で話が弾んだりと良い雰囲気が作れたこともあり誰かが分からない所や
詰まった所は、チーム全員でサポートするといった流れができていたので良い結果になったんじゃないかなと思います。
凄く良い経験になりました。ありがとうございました。

今回は、個人で参加したので次はチームで参加してみたいなーなんて思ったりしてます！！笑
無限ループはめっちゃでかい有限ループにしておけ

# 何があったのか

処理対象がなくなるまでループ処理することってありますよね。
そんなときついつい無限ループ＋終了時に`break`ってやってしまいがちですが。

```example.rb
i = 0
while true do
    break unless calcurate_function(i) #処理対象がなかったらfalseを返す
    i += 1
end
```

何らかの不具合で、`calcurate_function`が処理対象がなくなっても`true`を返し続けたら・・・。無限ループの完成です。
手動で動かしたバッチならしばらく経ってから異変に気付いてプロセスを`kill`したりもできますが、これが深夜に自動で動いているバッチ処理だったとしたら・・・。

**私はこれで本番サーバをフリーズさせて、IDCまで電源をいれに行ったことがあります。**

# どうすればよかったのか

それ以来無限ループ恐怖症になり、必ず有限ループにしています。

```example.rb
# 仕様上そんなにループすることのないはずのめっちゃでかい数字
MAX_LOOP = 999_999_999

i = 0
while i < MAX_LOOP do
    break unless calcurate_function(i) #処理対象がなかったらfalseを返す
    i += 1
end
```

これはこれで、**いつかMAX_LOOPを超える回数ループする必要が出た時にどうするんだ**という話もありますが、未来の自分のことまで考えるなら、終了時にやり残しがないかチェックをすることくらいでしょうか。

一番良いのはジョブスケジューリングツールでバッチプロセスを監視して、異常に長い時間動いているプロセスがあったら通知してくれたりすることなんですけどね。
BacklogとGASでかんたん開発生産性自動計測

最近、開発チームの生産性向上を目的として、
開発状況の可視化に携わる機会がありました。

開発の生産性を測る指標は様々ありますが、目的により好きなものを選べばいいと思います。
ただし、それを測ること自体に工数やランニングコストがかかっていては本末転倒ですよね。

今回は、自分で勝手に決めた以下の要件を念頭に、
BacklogとGASで開発生産性の計測を自動化した話を書きます。

1. 工数低い
1. 汎用性高い
1. 無料
1. かんたん

#Backlog APIを使えるようにする
Backlogのアカウント無い方は登録してください。
30日無料ですし、無料期間過ぎてもフリープランがありますよ。
[Backlog フリープラン](https://support-ja.backlog.com/hc/ja/articles/360035645834-%E3%83%95%E3%83%AA%E3%83%BC%E3%83%97%E3%83%A9%E3%83%B3%E3%81%A7%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E3%81%8A%E3%81%97%E3%81%88%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84)

「個人設定」→「API」で新しいAPIキーを発行
「プロジェクト設定」を開き、URL末尾のプロジェクトIDをメモ（あとで使います）

#GASからAPIを叩いて課題一覧を取得する
1. スプレッドシートを新規作成
1. 「拡張機能」→「Apps Script」をクリック
1. 下記コードのAPI Key、スペースID、さきほどメモしたプロジェクトIDを書き換えてコピペ
1. 「実行」クリック

```
const api_key = "【BacklogのAPI Key】"
const space_id = "【スペースID】"
const project_id = "【プロジェクトID】"

function myFunction() {
  let spreadsheet = SpreadsheetApp.getActiveSpreadsheet()
  let sheet = spreadsheet.getActiveSheet()
  let offset = 1
  while(-1){
    let api_url = "https://" + space_id + ".backlog.jp/api/v2/issues?apiKey=" + api_key + "&projectId%5B%5D=" + project_id + "&sort=status&order=&count=100&offset=" + offset
    let response = UrlFetchApp.fetch(api_url)
    let issue = JSON.parse(response.getContentText())
    let r = 1 + offset
    let obj_length = Object.keys(issue).length

    for (let i = 0; i < obj_length; i++) {
      let j = 1
      sheet.getRange(i+r, j++).setValue(issue[i].issueType.name)
      sheet.getRange(i+r, j++).setValue(issue[i].status.name)
      sheet.getRange(i+r, j++).setValue(issue[i].summary)
      sheet.getRange(i+r, j++).setValue(issue[i].assignee ? issue[i].assignee.name : "未設定")
      sheet.getRange(i+r, j++).setValue(issue[i].category[0] ? issue[i].category[0].name : "未設定")
      sheet.getRange(i+r, j++).setValue(issue[i].issueKey)
      sheet.getRange(i+r, j++).setValue(issue[i].priority.name)
      sheet.getRange(i+r, j++).setValue(issue[i].milestone[0] ? issue[i].milestone[0].name : "未設定")
      sheet.getRange(i+r, j++).setValue("https://" + space_id + ".backlog.jp/view/" + issue[i].issueKey)
    }

    if (obj_length < 100) break
    offset += 100
    Utilities.sleep(1000)
  }
}
```

#自動計測する
トリガーで定期実行を設定（毎日、週１回などお好みで）

#まとめ
Backlogから課題一覧を定期的にスプレッドシートで自動取得できるようになれば完成です。
あとは計測したい開発生産性の指標に合わせ、QUERYで集計するだけです。
グラフも作ってわかりやすく可視化しちゃいましょう。
スプレッドシート側の話などはまた機会があれば書きたいと思います。