OmniAICreator/Qiita-1.07M huggingface dataset:
M1MacにAnacondaをインストールする方法

# 概略
M1チップのMacにAnacondaをインストールする方法をまとめた

# 手順1
下記サイトを開きます
https://www.anaconda.com/

https://www.anaconda.com/

「Get Started」をクリックします
![スクリーンショット 2022-02-12 16.03.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/edfad937-7683-f7b5-42ce-e4be19d046fe.png)

「Download Anaconda installers」をクリックします
![スクリーンショット 2022-02-12 16.04.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/0c76a17f-6c1b-f0d5-6fdd-6936c82ffec8.png)

少し待つと、このような画面が開くので、下にスクロールします
![スクリーンショット 2022-02-12 16.06.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/5e8028d6-13e2-e43d-8184-0e1c310b9981.png)

「Download」をクリックします
![スクリーンショット 2022-02-12 16.07.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/81886fd1-90d9-6e93-9834-50a6e923d157.png)

ローカルのダウンロードフォルダに「Anaconda3-2021.11-MacOSX-x86_64.pkg」がダウンロードされます

# 手順2
ダウンロードされた.pkgファイルを開きます

「続ける」をクリックします
![スクリーンショット 2022-02-12 16.26.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/ab3e2f24-bfc0-b626-f92e-75aef3e0487b.png)

「続ける」をクリックします
![スクリーンショット 2022-02-12 16.27.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/3e5032f7-1094-0892-cd34-f9331d30a1ce.png)

「続ける」をクリックします
![スクリーンショット 2022-02-12 16.28.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/63bd7ff8-230e-21ff-2f8e-066f31826574.png)

「同意する」をクリックします
![スクリーンショット 2022-02-12 16.28.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/490ae997-bf4d-0a10-6ab5-1f6e5495fafa.png)

「インストール」をクリックします
![スクリーンショット 2022-02-12 16.28.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/9176eaf3-9d74-1e4e-af8e-af8157cdc9a0.png)

Anacondaのインストールが始まります
![スクリーンショット 2022-02-12 16.28.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/7d38d009-e00b-4ce4-0352-3bcb0b6ccd0f.png)

「Ok」をクリックします
![スクリーンショット 2022-02-12 16.30.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/fea76a57-6a39-6bed-b649-2e68321b366b.png)

「続ける」をクリックします
![スクリーンショット 2022-02-12 16.34.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/7842f093-903b-927a-f4de-f56f0644defe.png)

「閉じる」をクリックします
![スクリーンショット 2022-02-12 16.34.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/f2948556-6690-b0b7-686b-08db29c47e20.png)

ターミナルを開き、Anacondaがインストールされていることを確認します

```
conda --version
```

下記のように表示されればOKです

```
conda 4.10.3
```

以上です
[メタプログラミングRuby] アトリビュート生成時にバリデーションを実行するクラスマクロを実装してみました

## 実装したいこと
- メタプログラミングRubyのP145〜146あたりの問題を実装してみました
- ざっくりとした用件は以下になります
  - attr_accessor のようなアトリビュートのセッター/ゲッターを提供するメソッドに、妥当性を検査する処理を記述した任意のブロックを渡せるようにする。
  - 影響範囲を限定するため、モジュールに実装してincludeしたクラスのみに適用するようにする

## モジュールの実装
```ruby
module CheckedAttributes
    # モジュールをincludeしたクラスに、attr_checkedをクラスメソッドとして定義する
    def self.included(klass)
        klass.extend(SingletonMethods)
    end
    
    module SingletonMethods
        def attr_checked(name, &blk)
            define_method "#{name}" do
                instance_variable_get("@#{name}")
            end
            define_method "#{name}=" do |val|
                # この辺りはもう少しシュッと出来そう
                if block_given? && !blk.call(val)
                    raise "validation error"
                end
                instance_variable_set("@#{name}", val)
            end            
        end
    end
end
```

## includeして利用する側
```ruby
class Sample
    include CheckedAttributes
    attr_checked :age do |val|
        val > 30
    end
end

#　確認するコード
obj = Sample.new
puts obj.age=(31)
=> 31
puts obj.inspect
=> #<Sample:0x0000000001c50480 @age=31>

puts obj.age=(30)
# paiza.io のMain.rbで実行しています
=> Main.rb:15:in `block in attr_checked': validation error (RuntimeError)
	from Main.rb:44:in `<main>'
```

## まとめ的なもの
- クラスマクロの中で、`define_method` を使った方法で実装してみました
  - 前章までに登場していた、`instance_variable_XXX`や`define_method`などの理解度を確認できるいい感じの問題だなぁと感じました
- 業務でクラスマクロを作るシーンが今のところあまり思いついていないですが、Railsのコードを理解するのに役に立ちそうな予感がしています
- 本では `class_eval` を使って実装している方法など別の方法もいくつか掲載されていたようで、キャッチアップしていこうと
思います
Android12でFLAG_IMMUTABLEでクラッシュする件の対応

###自作Androidアプリで謎のクラッシュが発生

あまり今までアプリのクラッシュは発生していなかったのですが、
急に同じエラーが発生し始めたので調べてみました。
対象機種はすべてAndroid12です。

```
exception.class.missing._Unknown_: Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
  at android.app.PendingIntent.checkFlags (PendingIntent.java:375)
  at android.app.PendingIntent.getBroadcastAsUser (PendingIntent.java:645)
  at android.app.PendingIntent.getBroadcast (PendingIntent.java:632)
  at androidx.work.impl.utils.ForceStopRunnable.getPendingIntent (ForceStopRunnable.java:5)
  at androidx.work.impl.utils.ForceStopRunnable.isForceStopped (ForceStopRunnable.java:4)
  at androidx.work.impl.utils.ForceStopRunnable.run (ForceStopRunnable.java:50)
  at androidx.work.impl.utils.SerialExecutor$Task.run (SerialExecutor.java:2)
  at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1167)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:641)
  at java.lang.Thread.run (Thread.java:920)
```

###原因

どうやらtargetSdkVersionを31(Android12)に変更してからの事象っぽい。
しかし現在の開発環境はchromebook。Androidは9のまま。
所持しているスマホ実機は8.0と11で、12は確認できず。
Android12で起動時に即落ちしているらしい。

仕方ないので、旧開発環境のWindowsマシンを急遽復活させて
Android12エミュレータをインストールしてみました。

###まずいところはどこだ？

対応方法として２点でてきました。

１．google_mobile_ads
　Google公式の広告パッケージです。
　こいつがどうも悪いらしい。
　広告非表示版となる有料版もパッケージはそのまま残していたのでクラッシュしていたのですが、
　削除したら大丈夫になりました。

２．スプラッシュ画面
　Android12からスプラッシュ画面の機能が入ったということを知らず、何も対応していませんでした。

###対応方法

１．build.gradleに以下を追加

最新版にしてもダメなので、色々検索した結果以下を入れてみたところOKになりました。
これでなぜ良くなったのか不明なのですが。
あと、バージョンは最新ではなく0.13.6にしています。

```
dependencies {
    implementation 'androidx.work:work-runtime-ktx:2.7.0'
}
```

https://pub.dev/packages/google_mobile_ads


２．パッケージのバージョンアップ

flutter_native_splashを使用していますが、古いままでしたのでバージョンアップしました。
こちらも最新ではなく1.3.3で現状は動かしています。
１の対応もあったので、今なら最新にしても大丈夫なのかもしれませんが。
あと、Dartが2.15.1を要求されてしまったため、Flutterもバージョンを上げる必要が出てきました。
Flutterを2.8.1へ。2.10にいきなりするのはちょっと怖かったので。
あと、kotlinのバージョンが古いってことで1.6.10へ。（これは１の対応でだったか忘れましたが）

https://pub.dev/packages/flutter_native_splash

###その後

ということでエミュレータでの動作確認がOKになったので、
同じ対応を主開発環境であるchromebook側で入れて対応完了。
実機で確認できていないのでまだ不安はありますが。
早く実機スマホもAndroid12になってくれればいいのですが、いつになるのやら。

chromebookでもAndroid12Lのエミュレータが動かせるらしいので、とりあえずそれを試してみるのが良さそうではあるのですが。
HiveのopenBoxが成功しない。

### エラー内容

main.dartで　 `await Hive.openBox<HabitsManage>('habitsManage');` をしていると下記のようなエラーが必ず出るようになっていた。


```

E/flutter (10625): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: type 'bool' is not a subtype of type 'String' in type cast

```

### 考察

Adapter もちゃんと定義しているし bool 型がここに入ってくるようにはならないようにしているのに何故かエラーが出る。もしかしたらデバッグの途中で bool 型の値がアプリ内のストレージに保存されてしまい、それで型のエラーが出ているのではないかと推察。

```

import 'package:hive/hive.dart';
part 'habits_manage.g.dart'; // ファイル名

@HiveType(typeId: 1)
class HabitsManage {
  HabitsManage(this.title, this.description, this.type, this.image_1);

  @HiveField(0)
  final String title;

  @HiveField(1)
  final String? description;

  @HiveField(2)
  final String type;

  @HiveField(3)
  final String image_1;
}


```

### 解決策

一旦デバッグに使っている端末のアプリに入っているアンインストール。そうするとAndroidではアプリ内ストレージが削除されるので不正なデータが消えて、解決した。
[シンプルで簡単] shopifyにjqueryを追加する方法

ストア構築時、クライアントの要件を聞くといつもjqueryが必要になってしまう...。使う頻度が高いので手順を記事として残しておこうと思いました。なお、この記事の解説で使用しているshopifyテーマは<font color="Red">**「Dawn」**</font>ですが、基本的にどのテーマでもやり方は同じです。
<br>


#手順#
1.shopify管理画面からtheme.liquidを開く
2.jqueryのCDNをtheme.liquidにコピペする
<br>


#1.shopify管理画面からtheme.liquidを開く

shopifyのストア管理画面のホームで「コードを編集」をクリック。
![ホーム画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283820/448170c1-743d-0292-1a43-af93193a71ca.png)
切り替わった画面で「theme.liquid」ファイルを検索して開く。（Layoutフォルダの中にある）
![2.themeliquidファイル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283820/56bb01b8-fe49-bc3e-207e-d060295300aa.png)

<br>





#2.jqueryのCDNをtheme.liquidへコピペする
[jqueryの公式サイト](https://releases.jquery.com/)でjqueryのCDNをコピーしてtheme.liquidへ貼り付ける。自分が使った時は以下のコードが最新だった。

```
<script src="https://code.jquery.com/jquery-3.6.0.js" integrity="sha256H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk=" crossorigin="anonymous"></script>
```

貼り付ける位置はheadの閉じタグ(/head)のすぐ上です。Dawnテーマの場合は210行目くらいに閉じタグの記載がありました。
![3.貼り付け位置.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283820/de3b3ef3-7eed-dc01-7b7c-b28145f0b0de.png)

これでファイルを上書き保存すれば準備完了。jqueryが使えるようになります。
CSS float


CSS floatを使用したのに要素が横並びにならなかった。
![スクリーンショット 2022-02-12 15.09.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524167/6136c3a6-f2a0-ef6f-4fcd-b154f20e4c5e.png)
原因：親要素であるbodyタグの幅が500pxの一方で、子要素の幅が200px x3 = 600pxとなっていたため。

```HTML
<body>
   <div class="box1">
      box1
   </div>
   <div class="box2">
      box2
   </div>
   <div class="box3">
      box3
   </div>
</body>
```

```CSS

body{
    font-family: 'Times New Roman', Times, serif;
    width: 500px;
}
.box1{
    background-color: bisque;
    width: 200px;
    height: 150px;
    color: #ffffff;
    text-align: center;
    line-height: 150px;
    border: solid 0px black;
    float: left;
}
.box2{
    background-color: rgb(29, 189, 29);
    width: 200px;
    height: 150px;
    color: #ffffff;
    text-align: center;
    line-height: 150px;
    border: solid 0px black;
    float: left;
    
}
.box3{
    background-color: rgb(91, 152, 231);
    width: 200px;
    height: 150px;
    color: #ffffff;
    text-align: center;
    line-height: 150px;
    border: solid 0px black;
    float: left;
}
```
対策：bodyの幅を600px以上に変更　若しくは下記のように子要素であるbox1 box2 box3を幅600px以上<div>タグの子要素とする。

```HTML
<body>
   <div>
      <div class="box1">
          box1
      </div>
      <div class="box2">
          box2
      </div>
      <div class="box3">
          box3
      </div>
  </div>
</body>
```

```CSS
body{
    font-family: 'Times New Roman', Times, serif;
    width: 500px;
}
div{
    width: 900px;
    height: 300px;
    background-color: aqua;
    position: relative;
    
}
/*.box1,2,3は省略*/
Flutter webでfooterを実装する方法

```dart
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('CustomScrollView'),
      ),
      body: CustomScrollView( // ⇦ ここ
        slivers: [
          SliverToBoxAdapter(
            child: Column(
              children: [
                Container(
                  height: 200,
                  color: Colors.blue,
                ),
                Container(height: 100, color: Colors.cyan)
              ],
            ),
          ),
          SliverFillRemaining( // ⇦ ここ
            hasScrollBody: false, // ⇦ ここ
            child: Column(
              children: [
                const Spacer(), // ⇦ ここ
                Container(
                  width: double.infinity,
                  child: const Center(child: Text("This is Footer")),
                  decoration: BoxDecoration(
                    border: Border.all(color: Colors.black26, width: 1),
                  ),
                )
              ],
            ),
          )
        ],
      ),
    );
  }
}
```

![Feb-12-2022 15-53-45.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114912/4640d72d-f8b8-120d-0107-3aac7b12df3c.gif)
REST APIを呼び出した際の「HTTP504」ステータスコードについて

##はじめに
Amazon API Gatewayを使用してREST APIを呼び出した際の「HTTP504」ステータスコードについて調べる機会があったので備忘として残します。

---


##調査
・リクエストがAPI Gateway REST APIの最大統合タイムアウトパラメータよりも長くかかる場合、API Gatewayは「HTTP 504」ステータスコードを返す。
・最大統合タイムアウト（REST APIの設定と実行時）は、すべての統合タイプで50ミリ秒〜29秒で設定可
・最大統合タイムアウト（HTTP APIの設定と実行時）は、最大30秒（デフォルト）

---


##トラブルシューティングの方法
・Amazon CloudWatch 実行ログでエラーの原因を特定
・統合リクエストの実行時間を減らしてタイムアウトしないようにする
---

##トラブルシューティング手順
1.    504 エラーを返す API の API Gateway のログ記録を設定

2.    504 エラーを手動で再現

3.    CloudWatchコンソールで、エラーを受け取った統合の API Gateway実行ログを表示

4.    CloudWatch Logsでリクエスト IDを追跡します。統合でタイムアウトがある場合、「変換後のエンドポイントリクエスト本文:」行の後にタイムアウトエラーメッセージが原因。

5.    次の手順で、エラーの原因を特定
関連付けられた統合エンドポイントが呼び出されたことを確認
統合ロジックが完了し、API Gateway に応答するのにかかった時間を確認

6.    統合が呼び出されなかった場合は、リクエストを再試(API Gatewayサービスの一時的なネットワーク障害が原因で発生する可能性も有)。



##参考
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/limits.html
pythonコードからjuliaへの移植-classとstructに着目して-

# pythonコードをjuliaへ移植したい
本記事は、julia初学者の視点で、既存のpythonコードをjuliaに書き写す方法について書きました。
特に、プログラミング初学者にとって、juliaにはpythonのようなclassがなく、どのようにしたらpythonコードをjuliaに移植できるのか、と悩む人が多いかと思ったので、その方法について書きました。

## structのメリット
本題に入る前に、基礎事項であるstructの使い方を簡単に紹介します。
structは、オリジナルの型のことであり、そのメリットは、自ら定義した型に対して、演算が実行できることにある。

例えば自分で定義したオリジナルの型に対してベクトルの加法をしたい場合

```julia
struct Point
    x::Float64　#x, yをfieldと呼ぶらしい。
    y::Float64
end

function Base.:+(p::Point, q::Point)
    return Point(p.x + q.x, p.y + q.y)
end
```

実行

```julia
p = Point(1.0, 1.0)
q = Point(2.0, 3.0)

Base.:+(p, q) # Point(3.0, 4.0)
#以下と同じ
+(p, q) # Point(3.0, 4.0)
```

上記の例では、自分が決めたオリジナルの型(x,yというFloat64の型を持つデータ構造)に対して、ベクトルの加法を実行した。

## 例１:
以下pythonコードとjuliaコードを比較しながら、pythonコードをjuliaに移植する時のチップスをまとめる。

### python

```python
import random

class Mouse:
    def __init__(self, cry):
        self.cry = cry
    def greet(self):
        return self.cry
    def encode(self, msg):
        print(self.greet())
        ret = ""
        for m in msg:
            ret += random.choice(["chu", "kyu"])
        return ret
```

実行

```python
h = Mouse("cyu-")
h.greet()

h.encode("おはようございます")
```

### julia

- juliaの構造体(struct)にはデータしか入らないため、pythonでいうclassのメソッドはない。

- juliaでは、pythonのメソッド的なものを定義するために、juliaの関数の第一引数に構造体を入れることでメソッドに対応するものを作り出す

- この第一引数に入れた構造体こそが、pythonのメソッドの第一引数に入るselfに対応

```julia
struct Mouse
    cry
end

function greet(self::Mouse) #functionの引数に構造体を代入する。
    return self.cry
end

function encode(self::Mouse, msg) #第一引数がselfに対応
    println(greet(self))
    ret = ""
    for m in msg
        ret *= rand(["chu", "kyu"])
    end
    return ret
end
```

実行

```julia
m = Mouse("chu-")
greet(m)
encode(m, "oha")

```


## 例２：モンテカルロ
もう１つ例を見る。

### python

```python
import numpy as np
class Monte:
    def __init__(self, n):
        self.n = n
    def calc_pi(self):
        c = 0
        for _ in range(self.n):
            x = np.random.random()
            y = np.random.random()
            if x * x + y * y <=1:
                c += 1
        return 4*c/self.n
 

m = Monte(100)
print(m.calc_pi())
# or
m = Monte(n=1000) 
m.n
print(m.calc_pi())
```


### Julia

```julia
struct Monte
    n::Int # field
end

function calc_pi(m::Monte)
    c = 0
    for _ in 1:m.n
        x = rand()
        y = rand()
        if x^2 + y^2 <= 1
            c += 1
        end
    end
    return 4c / m.n
end

m = Monte(1000)
m.n # 1000
pi_approx = calc_pi(m)
@show pi_approx 
```

両者のコードを比べると、

- 関数の引数に入るデータは、pythonでは`__init__`で定義されるが、juliaでは、structで定義されている。

- pythonのclassで定義されているメソッドcalc_pi(self)が、juliaではcalc_pi関数に対応する。

- calc_pi関数の引数には、structで定義されたデータ構造が代入されており、これがselfになっている。



## まとめ
classとstructの両者の違いを具体的な例を通して確認しつつ、pythonコードからjuliaコードに移植する知見を得た。

まとめると、
まず、pythonコードを見比べて、classの`__init__`で定義されたデータをstructで定義する。次に、juliaではメソッドに対応するものとして関数を定義し、その第一引数にstructを代入することで、メソッドのようなものを作ることができる。


## 参考
pythonからjuliaに移行する際の心理的障壁をなくすための有益な知見が以下にまとめてある。
[OOPMacro.jlの話](https://gist.github.com/terasakisatoshi/4a7d5339c6a3ca015a82fa03f390afb3)
役立ったターミナル操作〜備忘録〜　

# 何をまとめてるの？
ターミナル上でのテキスト操作で役立ったものを備忘録としてまとめます。
随時更新していく予定です。

# sedで複数単語置換(22/02/12更新)
#### やった事
テキスト中の複数の単語を対応する単語へ**同時に**変換します。オプション`-f`を用います。
#### 例
目標: `Windows is good`を`Mac is god`に変換　
方法:
```
#sed.txt
s/Windows/Mac/g
s/good/god/g

#以下コマンドで置換
echo "Windows is good" | sed -f sed.txt 

#出力
Mac is god
```

# 行列変換(22/02/18)
#### やった事
行列的に記述されたテキストファイルの、行と列を入れ替えます
#### 例
目標:`tateyoko.txt`の行と列を入れ替えます。
方法:

```
#tateyoko.txt
1 2 3
4 5 6
7 8 9
```
```
#コマンド
cat tateyoko.txt | python -c "import sys; print('\n'.join(' '.join(c) for c in zip(*(l.split() for l in sys.stdin.readlines() if l.strip()))))"
```
```
#出力
1 4 7
2 5 8
3 6 9
```

# 複数ファイル移動orコピー（22/0727）
#### やった事
複数のファイルを一気に一つのディレクトリへ移動orコピーさせます
#### 例
```
mv file1 file2 file3 DIRECTORY/
cp file1 file2 file3 DIRECTORY/
```
【初学者向け】関数の中でグローバル変数を書き換える時の典型的な間違い

# 典型的なグローバル変数とローカル変数の間違いの例の紹介
プログラミング初学者向けに、グローバル変数に関する典型的な間違いの例を共有させていただきます。

具体的にはグローバル変数を関数の中で書き換える際の典型的な間違いについてです。



## 関数の中でグローバル変数を書き換える際のエラー

- 関数の中でグローバル変数を書き換えるときは、関数の中でglobal変数であることを明示しないとエラーになる。

以下の例は、エラーとなる。

```julia
# global変数
c = 0

function dosomething(N::Integer)
    c += N
end
```


以下は正しく動く例

```julia
# global変数
c = 0

function dosomething(N::Integer)
    global c #関数の中から外で定義された変数を見えるようにする。
    c += N
end

dosomething(3)
@show c
dosomething(5)
@show c
```

しかし、この場合グローバル変数の値が書き変わってしまうのでcを今後使う際は、注意が必要である。

## 関数の中でグローバル変数を単に参照するコードの場合
ただ単にグローバル変数を参照しているだけの場合は、グローバル変数を書き換えないため動く。

```julia
# OK
d = 1
function incremet(N::Integer)
    return N + d
end
```

しかしながら、グローバル変数はなるべく使わない方が良いとされる。もし使うとしてもconstをつけると良いだろう。なぜならコンストつけると絶対値は変わらないからである。それによって意図せず参照している値が変わっていることによる間違いを防ぐことができる。

コンストを使う場合、

```julia
const d = 1
function incremet(N::Integer)
    return N + d
end
```

次にグローバル変数sの値を変える場合を考える。 関数の中でconstを使ったグローバル変数の値を変えると怒られるから、一旦別の変数にコピーをする。その場合、元々のグローバル変数はずっと変わらない。

```julia
const s = 0
function dosomething(N::Integer)
    q = s
    for i in 1:N
        q += incremet(i)
    end
    return q
end
```

本記事の紹介はここまでです。
最後に、そもそもグローバル変数を使わない場合のコードは、

```julia
function dosomething(M)
    s = 0
    for i in 1:M
        s += incremet(i)
    end
    return s
end
```

# まとめ

プログラミング初学者向けに、グローバル変数に関する典型的な間違いを共有しました。
ModuleNotFoundError: No module named 'Crypto'

# お急ぎの方

下記実行で解決します。

```
pip uninstall Crypto
pip uninstall pycrypto
pip install pycryptodome
```

# 概要
テキストの暗号化を調べながら実装しているときに、これらのエラーに出くわしました。

- ModuleNotFoundError: No module named 'Crypto'
- AttributeError: module 'time' has no attribute 'clock'

それぞれ、python3.8以降では対応するモジュールが非推奨になっていることが原因で発生したエラーでした。また、time.clock()はすでに死んだ使い方らしいので、

- time.perf_counter()
- time.process_time() 

これらを使わないといけないらしいです。

(参考)

https://github.com/pycrypto/pycrypto/issues/173
use-package custom-face 反映しない

# use-package custom-face 反映しない

うちの環境悪いだけかな・・・
その辺よくわかんないけど、フックを使って解決しました。
解決したコードだけ貼っていきますね。

```emacs-lisp:~/.emacs.d/inits/555-org-mode.el
(use-package org
  :ensure t
  :defer t
  :mode ("\\.org\\'" . org-mode)
  :interpreter ("org" . org-mode)

  :hook
  (org-mode
   . (lambda ()
       (progn
         ;; /usr/local/Cellar/emacs-mac/emacs-27.2-mac-8.3/share/emacs/27.2/lisp/org/org.el.gz
         ;; /usr/local/Cellar/emacs-mac/emacs-27.2-mac-8.3/share/emacs/27.2/lisp/org/org-faces.el.gz
         (set-face-attribute 'org-tag        nil :background "gray97" :foreground "gray50" :box '(:line-width 1 :color "black") :weight 'regular)
         (set-face-attribute 'org-warning    nil :foreground "black")
         (set-face-attribute 'org-level-1    nil :foreground "#cb4b16" :weight 'bold :height 1.75)
         (set-face-attribute 'org-level-2    nil :foreground "#859900" :weight 'bold :height 1.5)
         (set-face-attribute 'org-level-3    nil :foreground "#268bd2" :weight 'bold :height 1.25)
         (set-face-attribute 'org-level-4    nil :foreground "#b58900" :weight 'bold :height 1.1)
         (set-face-attribute 'org-level-5    nil :foreground "#2aa198" :weight 'normal :height 1)
         (set-face-attribute 'org-level-6    nil :foreground "#6c71c4" :weight 'normal :height 1)
         (set-face-attribute 'org-level-7    nil :foreground "#d33682" :weight 'normal :height 1)
         (set-face-attribute 'org-level-8    nil :foreground "#dc322f" :weight 'normal :height 1)
         )))
  )

```

## おまけ

```emacs-lisp
(use-package org-bullets
  :ensure t
  :commands (org-bullets-mode)
  :init (add-hook 'org-mode-hook (lambda () (org-bullets-mode 1)))
  ;;:custom (org-bullets-bullet-list '("" "" "" "" "" "" "" "" "" ""))
  :custom (org-bullets-bullet-list '("" "" "" "" "" "" "" "" "" "" ""))
  :hook (org-mode . org-bullets-mode))
```

アイコンフォントが使えるエディタで見ると、上の文字化け見れると思う。

あと、大変お世話になったサイト様
Unicode一覧表 http://www.shurey.com/js/works/unicode.html

ローカルに保存して、フォント記述を埋め込んで使っています。

```html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<!-- saved from url=(0043)http://www.shurey.com/js/works/unicode.html -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<meta name="keywords" content="Unicode,UTF-8,コード一覧,コード閲覧,入力補助">
<title>Unicode一覧表</title>
<link href="./Unicode一覧表_files/basic.css" rel="stylesheet" type="text/css">
<link rel="shortcut icon" href="http://www.shurey.com/labyrinthenoir.ico">
<style type="text/css">
html,body {
	height: 100%;
    font-family: "MeiryoKeCoNerdSymbols" ;
}
```
内容の異なるメールを一括作成＆下書き保存 (Gmail/Google App Script使用)

## はじめに

**複数人に対して微妙に内容の異なるメールを送信する**、という定期タスクがあるという方、結構いらっしゃるのではないでしょうか。私もその一人です。

メーラーのテンプレート機能を使ってコピペなどの手作業の回数を減らすことができました。が、更なる省力化の方法はないか探していたところ、**以下のブログにあるサンプルコード** を見つけました。

https://dippeople.dip-net.jp/8573/

こちらのサンプルコードを参考にして自動化の仕組みを作成したところ、**情報を更新する場所が一か所に減り、クリック数も数回に減り、メール作成作業をかなり簡略化できました！**

本記事では、コーディング全般初心者であり、更にGoogle App Script (以下、GAS) を扱うのも初めてだった筆者が、こちらのサンプルコードを修正・アレンジしようとした際に少し悩んだ箇所を中心にまとめます。

公式ドキュメントは難しくて読みこなせないけどGASに挑戦してみたいと思った（私のような）方の参考になれば幸いです。

※体系的に学習をしていないまま本記事を書いているため、不正確な記述がありましたらコメント欄にてご指摘いただけますと嬉しいです。

## 前提条件

- Gmailのアカウントを持っていること
- Javascriptを読んだり書いたりできること（超初歩でOK）

## GASでやりたかったこと

- 月例のZoom集会の案内メール文作成の簡略化
    - 開催日をメールタイトルに入れたい
    - Zoomの接続先情報(毎月変更)をメール本文に入れたい

### メールイメージ

**タイトル**
> 2月集会 19日11:00からです
 
**本文**
> 〇〇さん
> 
> こんにちは。
> 今月の集会のZoomのアドレスをお送りします。
> よろしければご参加ください。
>
> \---------
> Zoomミーティングに参加する
> https://.....
> 
> ミーティングID: xxx xxxx xxxx
> パスコード: xxxxxx
> \---------


## ブログのサンプルコードからの主な変更点

GASの自動化の仕組みは以下2つのパーツから構成されます。

1. メールタイトル・本文のひな型と、そこに流し込みたい情報のリストが書かれたスプレッドシート　👉ブログの[【● Googleスプレッドシートを作成する】](https://dippeople.dip-net.jp/8573/#%E2%97%8F_Google%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)参照
1. Google App Script　👉ブログの[【● GASを編集する】](https://dippeople.dip-net.jp/8573/#%E2%97%8F_GAS%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%99%E3%82%8B)参照

初心者の筆者が時間かかってしまったポイントをそれぞれのパーツごとに紹介します。

### 1. スプレッドシート側

#### 変数の定義（追加）

-  開催月
-  開催日
-  Zoomの接続先情報

#### シート名の変更

-  （デフォルトの「Sheet1」から）"下書き作成ツール"に変更
    -  (GAS内のシート名に合わせる形。ここに気づくことができず少々ハマりました。。)

### 2. GAS側

#### getRangeで指定しているセルを修正

ブログのサンプルでは、

- C2セルにメールの件名
- C3セルにメール本文のフォーマット
- B列に名前、C列にメールアドレス、D～E列にメールに流し込む文章のリスト

が配置されている前提でコードが書かれているため、アレンジした場合getRange関数の引数の修正が必要です。

getRange(row, column)のrowが行を表し、columnが列を表します。getRange(2,1)はA2セルを指します。詳細はこちらをご覧ください。

https://developers.google.com/apps-script/reference/spreadsheet/sheet#getRange(Integer,Integer)

#### CCに関する箇所を削除

CCに入れて発信する必要がない場合においては、以下2箇所を削除(修正)します。

```python
//CC用のメールアドレスを設定
//複数設定したい場合は、カンマ区切りで指定してください
const CC = "****@****.co.jp";
```

以下は第3引数(オプション)を削除。

```python
//取得した内容をGmailで下書き作成
GmailApp.createDraft(to, subject, message, {cc: CC});
```

#### 追加した変数の取得

スプレッドシートのF2セル(2行目, 6列目)に集会の開催月を記入した場合、以下を追記。

```python
//「開催月」を取得
const month = sheet.getRange(2, 6).getValue();
```
開催日、Zoomの接続先情報も同様に取得します。

#### メールタイトルの変更

スプレッドシートのF5セル(5行目, 6列目)にメールタイトルのフォーマット（ここでは「{開催月}月集会 {開催日}日11:00からです」）を記入した場合、以下のコードで置換。

```python
const subject = sheet.getRange(5, 6).getValue()
.replace('{開催月}',month)
.replace('{開催日}',day);
```

1行目と2行目の行末にセミコロンを**つけない**ことに注意。
(ここにエラーが出たときにセミコロンをすべての行末につけてしまっていることが原因だとなかなか気づけませんでした。。)

## 終わりに

このブログのGASサンプルコードの良い点は、「下書き保存」までで終わるところだと思います。バグの入ったメールが飛んでしまい慌ててしまうということもないので、GASを試してみたいという方には最適だと思います。

再度、ブログへのリンクを記載します。注意点もご覧になってください。

https://dippeople.dip-net.jp/8573/

ブログ執筆者の[@mi_na_to_8](https://twitter.com/mi_na_to_8?s=20&t=gN54onWXHtmw583TXcM9FQ)さま、参考になるサンプルコードを公開いただきありがとうございました！
Docker Desktop for Windows をWSL2設定前にインストールしたら起動しなくなった

# 状況
Docker DesktopをWSL2をインストールする前にインストールしてしまった。

* WSL2設定後にDockerDesktopを起動してもStopping...が表示されたまま起動しない。
* 設定画面もロード中のまま動かない。
* フォルダの削除や再インストールしても変わらない。

# 解決策
WSLを使用する設定がfalseになっているのでtrueにする。

1. C:\Users\\{ユーザー名}\AppData\Roaming\Docker\settings.json　を開く

2. wslEngineEnabledをtrueに変更

```json:setting.json
{
...
"wslEngineEnabled": true // false → trueに変更
}
```

Docker Desktopを再起動する。
NeoVim の設定を Vim の設定と共通化すると ShaDa エラーが出た

neovim の終了時の状態は viminfo ファイルの代わりに shada ファイル（main.shada）に記録される。
だから neovim に `.vimrc` を読ませたとき、vimrc 内で viminfo を読ませるような設定をしていると、`E576: Error while reading ShaDa file:` のようなエラーが発生する。

neovim 内で 'viminfo' や 'viminfofile' オプションは、'shada' 'shadafile' のエイリアスである。
だから例えば、'viminfo' オプションの、`n` フラグで viminfo ファイルの場所を指定しているのなら、nvim もそれを読みに行こうとしてエラーが出るから `has('nvim')` でガードしておくのがよい。


余談だが、neovim は Windows 環境では、設定ファイルやキャッシュファイル、データファイルはユーザホームフォルダ下の `AppData/Local` を使ってくる。
これをやめさせるには環境変数 `XDG_CACHE_HOME` `XDG_CONFIG_HOME` `XDG_DATA_HOME` をそれぞれ設定するとよい。

```bash:.bashrc
export XDG_CACHE_HOME=$HOME/.cache
export XDG_CONFIG_HOME=$HOME/.config
export XDG_DATA_HOME=$HOME/.local/share
```
Google Cloud Associate Cloud Engineer 試験勉強対策サイト

## はじめに

本記事では、Google Cloud Associate Cloud Engineerを受験された方の体験談を元に模擬試験など試験対策に利用できる学習サイト
をまとめました。

---

## 学習コンテンツ

### 公式学習コンテンツ

Googleが公開している公式のコンテンツとして以下のものがあります。

* Google Cloudドキュメント

https://cloud.google.com/docs

* 模擬試験

https://cloud.google.com/certification/sample-questions/cloud-engineer

* Google Cloud Skills Boost (旧Qwiklabs)

https://www.cloudskillsboost.google

* 公式ガイド

https://www.wiley.com/en-us/Official+Google+Cloud+Certified+Associate+Cloud+Engineer+Study+Guide-p-9781119564416

* Google Cloud Japan Youtubeチャンネル

https://www.youtube.com/playlist?list=PLmoHjhhs3ySFydFS9XnZ2SDZWny-RkgkE

### サードパーティの学習コンテンツ

サードパーティの学習コンテンツは多数がありますが、
代表的なものとして以下のサイトようなサイトがあります。

* Whizlabs

https://www.whizlabs.com
https://ohina.work/post/whizlabs/

* O’Reilly online learning

https://www.oreilly.com/

* pluralsight

https://app.pluralsight.com/roleiq/roles/2dff9be4-04ef-454f-9a4c-0279aff97b4e?aid=7010a000001xDURAA2

* Udemy

https://www.udemy.com/ja/

* Linkedin

https://www.linkedin.com/learning

### その他の学習コンテンツ

個人ブログなどの学習の参考になるサイトとして、以下のサイトがあります。

https://zenn.dev/ohina/books/gcp00000000000000001

https://www.topgate.co.jp/category/gcI

https://www.ether-zone.com/google-cloud-associate-cloud-engineer-study-note/

https://blog.framinal.life/entry/2019/10/31/131348

https://blog.devgenius.io/a-developers-guide-for-passing-google-cloud-associate-cloud-engineer-exam-8a95adb44721

https://blog.cloudthat.com/preparing-for-gcp-associate-cloud-engineer-certification-examI

https://www.testpreptraining.com/blog/google-associate-cloud-engineer-cheat-sheet

https://qiita.com/kyo2bay/items/b9d1e5f2511c90b94c92

https://qiita.com/Takao_/items/e09dde47461757e7ef7d
【Laravel】old関数の使い方（メモ）

https://kaiblo.com/%e3%80%90laravel%e3%80%91old%e9%96%a2%e6%95%b0%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9%ef%bc%88%e3%83%a1%e3%83%a2%ef%bc%89/

こちらに移動しました。
Mac版ApacheのPerlでPERL5LIBへパスを通す


# Mac版ApacheのPerlでPERL5LIBへパスを通す
Apache CGI 実行環境を整える

Perl wiki　エンジンを試そうとMacで動かして出たエラーが意味不明で苛ついたわたしです。
だんだんやさぐが酷くなり、Apachログを見るコマンドなんてどんどん雑になっていきます。
次のコマンドを打ち込んで Alt+k ですよ。効率的で大変よろしいかと思います。

```bash
FireZone ~$ tail -f /var/log/apache2/*


FireZone ~$ perl -Mmod_perl -E 'say $mod_perl::VERSION'
Can't locate mod_perl.pm in @INC (you may need to install the mod_perl module) (@INC contains: /Users/lucky/perl5/lib/perl5/darwin-2level /Users/lucky/perl5/lib/perl5 /Users/lucky/.plenv/versions/5.34.0/lib/perl5/site_perl/5.34.0/darwin-2level /Users/lucky/.plenv/versions/5.34.0/lib/perl5/site_perl/5.34.0 /Users/lucky/.plenv/versions/5.34.0/lib/perl5/5.34.0/darwin-2level /Users/lucky/.plenv/versions/5.34.0/lib/perl5/5.34.0).
BEGIN failed--compilation aborted.
FireZone ~$
```

で、です。
動かした時に、上記のような（それっぽく適当なコマンドを実行しました）エラーが出るんですよ。
試行錯誤し、なんとかバージョン5 perlが動くようになった時でしたか。

こちらもご覧くださし ＞ [mod_perlを有効にするとperlバージョンて固定されるのね知らなかったよ。](https://qiita.com/TanukiTam/items/4bb4275c2109afd8711b "mod_perlを有効にするとperlバージョンて固定されるのね知らなかったよ。")

## httpd.conf に環境変数埋め込んでやればいけます

```conf:/etc/apache2/httpd.conf 287行目ぐらい 作業用ディレクトリのディレクティブ
DocumentRoot "/var/www"
<Directory "/var/www">
    SetEnv PATH "/Users/lucky/perl5/bin:$PATH"
    SetEnv PERL_CPANM_OPT "--local-lib=/Users/lucky/perl5"
    SetEnv PERL5LIB "/Users/lucky/perl5/lib/perl5:$PERL5LIB"

    Options Indexes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    MultiviewsMatch Any
    AddHandler cgi-script .cgi .pl
    #AddType text/html .shtml
    #AddOutputFilter INCLUDES .shtml
    AllowOverride all
    Require all granted
</Directory>
```

Apache 再起動でたぶん行ける

## でもでも

Docker で Perl 使えば良かったと反省している
docker composeのバージョンアップ手順書｜macOS

# エラーメッセージ
新規プロジェクトを作成しようとしたところ
以下のエラーメッセージが出た。

```error.sh

ERROR: Version in "./docker-compose.yml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a supported version (e.g "2.2" or "3.3") and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1.
For more on the Compose file format versions, see https://docs.docker.com/compose/compose-file/

```

# 手順
１.現在のバージョンを確認する。
２.現在バージョンを削除する。
３.バイナリファイルをダウンロードする。
４.ダウンロードしたバイナリに実行権限を与える。
５.バージョンの確認をする。

## 現在のバージョンを確認する
現在のバージョンを確認します。
私の場合既存のプロジェクトもあったので最悪の場合戻すことも考慮していました。

```confirmvr.sh

$docker-compose -v
docker-compose version 1.25.5, build unknown

```

## 現在のバージョンを削除する
現在のバージョンがインストールされている場所を確認します。

```which.sh

$ which docker-compose

```

通常Macであれば以下の場所にインストールされているようです。
自分の場合は以下のようにシンボリックリンクが貼られていました。

```confirmplace.sh

$ ls -l /usr/local/bin/docker-compose
/usr/local/bin/docker-compose -> /Applications/Docker.app/Contents/Resources/bin/docker-compose

```

場所が確認できたら以下のコマンドで削除します。

```remove.sh

$ sudo rm -rf /usr/local/bin/docker-compose

```

### ※余談｜docker composeが複数入っていた場合
自分の場合ですが色々インストールしていたため複数のdocker composeが入っていました。

```which.sh

$which docker-compose
/Users/xxxxxx/Library/Python/3.8/bin/docker-compose

```

こういった場合次のように確認をします。

```cat.sh

echo $SHELL
$ cat ~/.bash_profile
$ cat ~/.bashrc

```

そして自分の場合は以下の行をコメントアウトすることで
読み込み先を変えることができました。

```path.sh

#export PATH=/Users/xxxxxx/Library/Python/3.8/bin:$PATH

```

色々勉強用にも使っているPCだとありがちな状況だと思いますが
適宜自分の状況を確認しないと意外とハマりポイントになると思います。

## バイナリファイルをダウンロードする
新しいバージョンのdocker composeバイナリファイルをダウンロードします。
新しいバージョンを以下のアドレスで確認します。
https://github.com/docker/compose/releases/

バージョンを確認できたら以下のURLのバージョンのところ（2.2.3）を最新の数字に適宜修正して実行します。

```download.sh

$ sudo curl -L "https://github.com/docker/compose/releases/download/2.2.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

```

## ダウンロードしたファイルに実行権限を与える
以下のコマンドでファイルに実行権限を与えます。

```chmod.sh

$ sudo chmod +x /usr/local/bin/docker-compose

```

これをしないとコマンドを叩いてもエラーになります。



## バージョンを確認する
最後にバージョンが上がっているかを確認します。

```version.sh

$ docker-compose -v

```

バージョンが上がっていたら完成です。

# 参考サイト
[Docker公式サイト](https://docs.docker.jp/compose/install.html#linux-compose)
[【Docker】docker-compose を最新版にアップグレードする](https://qiita.com/kottyan/items/c892b525b14f293ab7b3)
【Git】TortoiseGitでフォルダ名を変更する方法

# 結論
1. 名前を変更したいフォルダを右クリック
1. `TortoiseGit`を左クリック
1. `名前を変更(N)`を左クリック
1. `新しい名前`テキストボックスに`変更後フォルダ名`を入力
1. `OK`を左クリック

# 環境
- TortoiseGit 2.13.0.1
- Windows11

# 詳細

- 名前を変更したいフォルダを右クリック

フォルダ名を変更したいフォルダを右クリックします。
(例として`PostgreSQLを使いたいなー`フォルダの名前を変更します。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519245/90255c7b-461a-2266-d731-eef5517df61a.png)

- `TortoiseGit`を左クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519245/16506f9a-a0fa-0a40-8988-40f16af3330b.png)

- `名前を変更(N)`を左クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519245/5fec5076-be4c-b605-4b43-fd01eca11ebc.png)

- `新しい名前`テキストボックスに`変更後フォルダ名`を入力
(今回は`UsePostgreSQL`というフォルダ名に変更します。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519245/1e17742f-7852-55da-ed7b-aa83c8480127.png)

- `OK`を左クリック
OKをクリックするとフォルダ名が変更されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519245/5e159043-b260-3641-2c2a-33f514d61473.png)

# その他
`TortoiseGit`の内部で`git mv`コマンドを実行してくれているんだと思います。`SorceTree`で確認すると`改名`として認識されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519245/6ac61c56-f32c-66d4-d069-a89e23f3f0b0.png)

以上です。
HC-05/HC-06 で Raspberry Pi と Bluetooth 接続する

HC-05/HC-06 を Raspberry Pi に接続し Raspbery Pi とBluetooth で通信できるようにします。Raspberry Pi は元々 Bluetooth がついていますが Raspberry Pi から見ると UART でシリアル接続しているだけなので Pico にも簡単に繋げられそうです。

HC-05 は Bluetooth の Master と Slave になれます。HC-06 は Slave のみです。Raspberry Pi (あるいは Pico) から Master になることはあまり無い気がしますが同じ値段なら HC-06 で良いかも知れません。

|HC-05/HC-06  |Raspberry Pi  |
|---|---|
|RXD  |GPIO 14 (TXD) |
|TXD  |GPIO 15 (RXD) |
|GND  |GND |
|VCC  |5V (注)  |

(注) VCC については 3V と書いてある文章もありますが手元の HC-06 の基盤には 3.6V - 6V と書いてあるので 5V でも問題ないと思います。

前準備としてRaspberry Pi ではデフォルトの設定でコンソールをシリアルに出力するよう設定してください。[ここ](https://toki-blog.com/pi-serial/) などが参考になると思います。とりあえずはシリアルとシリアルコンソールを両方有効にしてみてください。

VCC と GND を繋ぐと Windows などの PC や Android などから Bluetooth デバイスとして見えます。iPhone では何故か動かないようです。HC-05 では HC-05、HC-06 なら HC-06 として見えるはずです。PIN はデフォルトでは 1234 です。(多分[ここ](http://www.dsdtech-global.com/)ら辺ので変えられるようですがまだテストしていません。)

![000.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360970/7c907977-802e-4d7a-135d-6bb7cab6142e.jpeg)

Bluetooth を認識すると Windows なら COM5, COM6 として見えます。試した限りでは COM5 のみ使うようです。

![001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360970/91ac117f-a3f2-d98c-729b-d2ea9399d9ae.jpeg)

Windows を使っている場合は COM5 にシリアル接続するには [Tera Term](https://ttssh2.osdn.jp/index.html.ja) を使うのが簡単だと思います。macOS だと cu コマンドをなど使うと簡単かもしれません。

![003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360970/71ec618c-ef46-659d-5e46-e33ca20bc681.jpeg)

デフォルトの設定ですが Setup > Serial Port... から Speed が 9600 となっていることを確認します。残りもデフォルトの設定でかまいません。

![002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360970/83139b4a-31b5-5bc0-6008-000368ec6f11.jpeg)

最初の接続が何度かやらないとうまく行かないのですが Control > Send break を何度か実行して Enter を連打してみてください。login プロンプトが出てくれば成功です。(Raspberry Pi のシリアル接続の速度は 115200 らしいのですが自動で速度を調整してくれるようです。[ここ](https://wiki.debian.org/RaspberryPi4) によるとconsole=ttyS0,9600 ででデフォルトで 9600 bps となる気がしますがテストはしていません。。)

![00011.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360970/75165bc7-fa15-b230-2f53-0069de042bbd.jpeg)

9600 bps なので遅いですがここからログインをしたりコマンドを実行したりできます。

次にシリアルコンソールを無効にして Rapsberry Pi を起動し同様の方法で Windows などからシリアル接続してみてください。Raspberry Pi で次のようなコマンドを実行します。Raspberry Pi にログインして cu コマンドを実行して Connected と表示されたらなにか文字を入力してみてください。

```
pi@c4labs:~ $ cu -l /dev/serial0
Connected.
```

すると Winodws の Tera Term 側で同じ文字が表示されるはずです。

![005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360970/9619fee5-1984-4dd2-fde4-28fdd797869a.jpeg)

逆に Tera Term 側でなにか文字を打つと Raspberry Pi 側に表示されます。(改行コードは認識されないようでなにか対策が必要なようです。)

ということで Raspberry Pi 側から見ると単なるシリアルデバイスとして見えており Bluetooth 接続についてはなにも気にする必要がありません。Pico のデータの出力先などに使えないかなと画策中です。。
Unityで神になれる最強おすすめアセット集 Ver2.0

制作途中だったんですが，載せます。

前回

Unityで神になれる最強おすすめアセット集
https://qiita.com/UbiquitousD/items/54a04a0886b308555152


# 無料アセット


## Lean Localization

https://assetstore.unity.com/packages/tools/localization/lean-localization-28504

自作のゲームを簡単に多言語対応させることができます。


## Placr

https://assetstore.unity.com/packages/tools/level-design/placr-202664

Prefabの高速配置ができるようになるので，設置するものが多い3Dゲームだと開発のスピードをあげられると思います。


## Behavior Bricks

https://assetstore.unity.com/packages/tools/visual-scripting/behavior-bricks-74816

ノードを繋ぐだけでAIを作成できるようになるツールです。
後述する**Behavior Designer**や**NodeCanvas**の無料版といった感じです。


## NaughtyAttributes

https://assetstore.unity.com/packages/tools/utilities/naughtyattributes-129996

前回の記事で紹介した**Odin**というアセットの無料版です。
インスペクター上での操作が劇的に使いやすくなります。


## Fantasy Tombs & Necropoly Lite

https://assetstore.unity.com/packages/3d/environments/fantasy/fantasy-tombs-necropoly-lite-205971

時期は過ぎましたがハロウィンです。
本当にこれ無料でいいのかってくらいの綺麗なローポリモデルなので，
それっぽいゲームを作るならおすすめの１作です。


## Cartoon FX Free

https://assetstore.unity.com/packages/vfx/particles/cartoon-fx-free-109565

貴方が現在2Dゲームを作成していて，尚且つゲームで使用するエフェクトに困っているのであればこのアセットを使用するとよいでしょう。

# 有料アセット


## Asset Hunter for Unity

https://assetstore.unity.com/packages/tools/utilities/asset-hunter-pro-135296

使われていないアセットを一括削除することができるアセットですマジ神。


## Text Animator for Unity

https://assetstore.unity.com/packages/tools/gui/text-animator-for-unity-158707

このアセット１つを所持してれば，今後貴方はテキストに苦労することはなくなります。
１文字ずつテキストを表示するといったことは勿論，
強調したい部分の色を変更しアニメーションを付ける等，何でもありです。

気になった方は，リンク先にあるPVをご覧ください。
１分程度でアセットの内容が紹介されています。


## Behavior Designer

https://assetstore.unity.com/packages/tools/visual-scripting/behavior-designer-behavior-trees-for-everyone-15277

Unityで最も有名なAI制作アセットです。
ノードを簡単に繋げていくだけで複雑な敵を再現することができます。

また類似するアセットに下記のものがあります。

https://assetstore.unity.com/packages/tools/visual-scripting/nodecanvas-14914

しかしこの２つに大きな違いはありません。
あえて違いを挙げるなら下記のような感じでしょうか。

**Behavior Designer**

- 最も有名なアセットというだけあって，コミュニティの幅がNodeCanvasより僅かに広い。

**NodeCanvas**

- デザインはこちらの方が優れているので，使ってて若干楽しい。

といったところです。大きな違いはありません。


## Layer Manager Yae

https://assetstore.unity.com/packages/tools/utilities/layer-manager-yae-35302

Unityのレイヤー機能が大幅に使いやすくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954115/e2479900-5e98-656d-ee71-1d7fd7fa959c.png)

現在のレイヤー状況が分かり易く表示されるのは凄いありがたいですね。
お求めやすい料金設定となっているので，購入を検討してみてはいかがでしょうか。


## Master Audio: AAA Sound Solution

https://assetstore.unity.com/packages/tools/audio/master-audio-aaa-sound-5607

オーディオに関する手間が圧倒的に減るアセットです。
これを使用するともうUnity標準の音量調整機能は使いたくなくなります。

以下のような例があります。

- シーンを移動しても音楽が途切れなくなる
- 特定のコライダーやレイヤーに接触した場合にのみ効果音を再生することができる
- 同時に再生される効果音の最大量を調整することができる
- 同一の場所でオーディオを管理するので，設定を一括変更することができる


# パブリッシャー

## Jean Moreno

https://assetstore.unity.com/publishers/1669

2Dのエフェクトを多数リリースされている方です。
無料アセットで紹介した**Cartoon FX Free**というのもこの人がリリースしたものです。
【Laravel】session保存方法（メモ）

https://kaiblo.com/%e3%80%90laravel%e3%80%91session%e4%bf%9d%e5%ad%98%e6%96%b9%e6%b3%95%ef%bc%88%e3%83%a1%e3%83%a2%ef%bc%89/

こちらに移動しました。
【Laravel環境構築】macでlaravelを使えるようにする。

# Laravel環境構築
## 前提条件

- homebrewインストール済
- phpインストール済

## 環境

- M1 Mac Monterey 12.1
- Homebrew 3.3.14
- php 7.4.27

## composerインストール

composerがインストールできるか確認しインストール

```
$ brew search composer
$ brew install composer
```

インストールできたか確認

```
$ composer
```

## Laravelインストール

Laravelをインストールする任意のディレクトリで下記コマンドを実行

- 今回インストールするバージョンは6.*
- 今回「first_project」という名前のディレクトリ名で作成（もしくはプロジェクト名？）名前は自由に付けてもらってOK

```
$ composer create-project "laravel/laravel=6.*" first_project
```

```
$ cd first_project
```

サーバーを起動する

```
$ php artisan serve
```
ブラウザで「localhost:8000」にアクセスし、下記のように表示されれば環境構築完了！！!

<img width="100%" alt="laravel　トップページ画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1138611/b8319cad-bd0d-1911-56d4-e3f1553260ec.png">

## おまけ

**毎回「php artisan コマンド」と打つのめんどいので「pa コマンド」できるようにalias設定する**

Laravelで開発をしていくとよくキャッシュクリアとかマイグレーションとかシードとかで「php artisan」をいっぱい使うので短縮コマンドにする

```
$ vim ~/.zshrc
```

下記を.zshrcに書き込んで「:wq」で保存し、ターミナルを再起動する。

```
alias pa="php artisan"
```

php artisan→paにできたことを確認


```
$ pa serve
```

キャッシュクリアなら「pa cache:clear」
【Project Euler】Problem 84: モノポリーの確率

* 本記事は[ProjectEuler](https://projecteuler.net/about)の「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。

### 問題 84.モノポリーの確率

原文 [Problem 84: Monopoly odds](https://projecteuler.net/problem=84)

**問題の要約：モノポリーのボード上で一人で4面サイコロを2個振って移動したときに停まるマスの確率を高い順3つ並べて6桁の数字にせよ**

あまりにも文章が長くて読むだけでも大変な問題。要点は、

* Community Chest(CC)とChance(CH)のマスに停まったらそれぞれ16枚のカードを引いて移動に関係ある場合だけその指示に従う。
* ゾロ目が出たら、もう一度サイコロを振れるが一人なのであまり関係がない。ただしゾロ目が3連続で出た場合だけは、Jailに移動する。
* 6面サイコロの場合は上位3マスが、JAIL (6.24%)=#10, E3 (3.18%)=#24, and GO (3.09%)=#00なので答えは102400

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/2b7dbc13-a978-7106-6c03-3db34fc2aeb6.png)

モンテカルロ法で解きます。乱数を使ってサイコロをたくさん振って各マスに停まった数を数えます。

まず全体の流れを見るためにメイン・プログラムから。

かなりシンプルです。サイコロを振ってChanceとCommunity ChestとGo to Jailの判定をして移動したマスのカウンター(**board[bPos]**)をカウントアップします。

```python 
#--------- main ------------
import numpy as np

bPos = 0                     # current position of square
board = np.array([0] * 40)   # square visiting count
for i in range(100000):
  bPos = rollDice(bPos)      # roll the dices  
  bPos = handleChance(bPos)  # Handle chance
  bPos = handleCC(bPos)      # Handle CC
  if (bPos == 30): bPos = 10 # Go to Jail 
  board[bPos] += 1           # increase the square visiting count
```
つぎにサイコロを振る**rollDice**.ゾロ目の連続回数を**dcount**で数えます。

```python 
from random import randint
# Dice handling including doubles
dmax = 4    # max number of a dice
dcount = 0  # double continuous count
def rollDice(bPos):
  global dcount
  d1, d2 = randint(1,dmax), randint(1,dmax)
  dsum = d1+d2  
  if d1==d2: # if doubles
    dcount += 1
    if dcount > 2:  bPos, dsum, dcount = 10, 0, 0 # Go to jail
    else: dcount = 0
  bPos = (bPos + dsum) % 40    # Move the square
  return bPos
```
あとはCommunity Chest(**handleCC**)とChance(**handleCC**)の処理. 

各々のカードは最初にシャッフルすべきでしょうが、施行回数が多いので影響ないかなと思ってやっていません。

```python 
# Chance handling
CCSquare = [2, 17, 33]       # Community Chest Squares positions
cc = [0, 10]
ccPos = 0
def handleCC(bPos):  # Community Chest
    global ccPos
    if  bPos not in CCSquare: return(bPos)
    ccPos = (ccPos+1) % 16
    if ccPos < 2: bPos = cc[ccPos]
    return(bPos)

# Chance handling
ChSquare= [7, 22, 36]   # Chance Squares
chance = [0, 10, 11, 24, 39, 5] # chance card 1-6
chPos = 0
def handleChance(bPos):
    global chPos
    if  bPos not in ChSquare: return(bPos)
    chPos = (chPos+1) % 16
    if chPos < 6: bPos = chance[chPos]
    if chPos == 6 or chPos == 7:  # Railway company
      if (bPos == 7): bPos = 15
      if (bPos == 22): bPos = 25
      if (bPos == 36): bPos = 5
    if (chPos == 8 ): # Utility company
      bPos = 8 if (bPos == 22) else 12
    if (chPos == 9): bPos -= 3
    return bPos
```

最後にマスのカウントデータから上位3つを取り出して、答えの6桁にします。

```python 
# Determine top 3 to make six-digit modal string.
ans = ""
for i in range(3):
  mpos = np.argmax(board)
  ans += str(mpos)
  board[mpos] = 0 # clear the value to find next max
print(f"Answer: {ans}")
```
（開発環境：Google Colab）
VBA ／ Dictionaryの（Keyではなく）Item値でソートする


VBA ／ Dictionaryの（Keyではなく）Item値でソートする

・やや力技だが、Item値でソートする例
・DictionaryのKeyとItemを、順序を入れ替えて、ArrayListに格納している
・KeyとItemは適当なデリミタ（ここではΩ）で区切っている
・ArrayListのSort機能で並び替えている。
・Item値がきれいに並ぶようにFormatで形を揃ている点注意
・並び替えた後、デリミタでSplitして、別のDictionaryに戻している


```vb:sample.xlsm
Option Explicit

Sub sample_dictionary_sort_by_items()

'参照設定：Microsoft Scripting Runtime
Dim dict As Scripting.Dictionary
'Set dict = CreateObject("Scripting.Dictionary")
Set dict = New Scripting.Dictionary

dict.Add "a", Rnd()
dict.Add "b", Rnd()
dict.Add "c", Rnd()
dict.Add "d", Rnd()
dict.Add "e", Rnd()

Dim arr
Set arr = CreateObject("System.Collections.ArrayList")

Dim ky
For Each ky In dict.Keys
    arr.Add Format(dict.Item(ky), "0.00000") & "Ω" & ky
Next
arr.Sort
'arr.Reverse

Dim a1
For Each a1 In arr
    Debug.Print a1
Next

Dim dict2 As Scripting.Dictionary
Set dict2 = New Scripting.Dictionary

Dim o() As String

Dim a2
For Each a2 In arr
    o = Split(a2, "Ω")
    dict2.Add o(1), CDbl(o(0))
Next

For Each ky In dict2.Keys
    Debug.Print ky & "_" & dict2.Item(ky)
Next

End Sub

```
デスクトップアプリのHTTP/HTTPS通信をキャプチャする方法with Burp

## 概要

今回はWindowsのデスクトップアプリケーションのHTTP/HTTPS通信をBurpでキャプチャする方法をお伝えします。
Burpを使ってWebブラウザのHTTP通信をキャプチャしたことはあるけれど、デスクトップアプリでのやり方がわからない方向けの記事です。

## 環境

僕が使用した環境を参考までにお伝えします。僕はBurpのプロフェッショナル（有料版）を使用していますが、コミュニティバージョン（無料版）でも全く問題ありません。

OS：Windows 10 x64
Burp: Professional v2022.1.1

## セットアップ

#### Burp

まず"CA Certificate"をエクスポートします。

![first.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183674/cbfeddc6-0f78-18d2-b2e2-30562e73d51d.png)

"Import / export CA Certificate"をクリックします。

![second.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183674/b545fd45-efec-ab03-48ac-d8f2b1e74088.png)

Exportの"Certificate in DER format"を選択し、ダウンロードしましょう。

そしてファイルエクスプローラーを開き、先程ダウンロードしたCertificate（僕はcacert.derと名前を付けました）をダブルクリックします。

![third.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183674/c21d0360-49d2-3d13-8b79-4b5b4898c22d.png)

そうするとこのようなウィザードが出てくるので、「証明書のインストール」をクリックします。

![forth.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183674/1e69c992-2831-c7d2-fd1e-90b4784187a8.png)

「次へ」を押します。

![five.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183674/0ad9e956-ec29-ab7c-68c3-f5d372f329a3.png)

「証明書をすべて次のストアへ配置する」を選択し、参照をクリックします。そして「信頼されたルート証明機関」を選択します。

これでCertificateの準備完了です。

#### Proxy

Proxyを設定します。

![proxy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183674/dd940347-3095-88d9-1430-9573babce164.png)

プロキシの設定を選択してください。

![manual.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183674/eb4623f0-a09d-6870-f3f7-699896d56b95.png)

そして手動プロキシセットアップを上のスクリーンショットのように設定します。

これでセットアップ終了です。
「プロキシサーバを使う」のオンオフを切り替えることで、通信のキャプチャをしている状態を変えることが出来ます。

## デモンストレーション

今回は、デスクトップアプリ版のDiscordの通信をキャプチャします。

![discord.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183674/e26d2636-8699-17f1-6954-161d262cd9a6.png)

"Hello!"というメッセージを送ってみました。
Burpのhistoryを見てみましょう。

![capture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183674/4341d27c-cb46-e4b9-a99a-045655c6b702.png)

セキュリティ上の理由で一部のみお見せしますが、Webブラウザを使っているのと同じようにHTTP通信をキャプチャできます。

## 最後に

この記事が皆さんのお役に立てれば嬉しいです。最後まで読んでくださってありがとうございました。

質問がある方は是非コメントしてください😃
GoogleAppsScriptでGoogle Drive内の複数csvファイルをスプレッドシートにコピーする

#はじめに

Qiitaで質問に答えたところ、記事にしてもいいのではないかと思い、書くことにしました。

https://qiita.com/gray/questions/6a330704921fa08069ca


このプログラムは、タイトルの通り、GoogleAppsScriptを使用してGoogle Drive内の複数csvファイルの内容をシートごとにスプレッドシートにコピーするプログラムです。
csvファイルのファイル名をシート名に自動でします。


#プログラム

最初の`test`となっているところは、googledrive内のcsvファイルが格納されているフォルダ名に変えてください。
今回は、`test`フォルダ内のすべてのファイルをコピーします。

```.js
function myFunction() {
  var mySheet = SpreadsheetApp.getActiveSpreadsheet();
  var folder = DriveApp.getFoldersByName('test').next();
  Logger.log(folder.getName())
  var files = folder.getFiles();

  while (files.hasNext()) {
    var file = files.next();
    var currentFileName = file.getName();
    Logger.log(currentFileName)
    var csvData = Utilities.parseCsv(file.getBlob().getDataAsString());
    Logger.log(csvData)

    let newSheet = mySheet.insertSheet();
    newSheet.setName(currentFileName.split(".")[0]);
    newSheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);

  }
}
```



#参考

https://liginc.co.jp/532152

https://qiita.com/tanaike/items/94c263d3906ee23ad522

https://developers.google.com/apps-script/reference/drive/drive-app

https://auto-worker.com/blog/?p=3209

https://auto-worker.com/blog/?p=898
M1 MacPro にPHPをインストールする【homebrew】

# brewでPHPをインストールする
## 環境
- M1 macOS Monterey 12.1
- zsh

## 前提条件
brewは既にインストール済

## PHPをインストール
まずhomebrewでインストールできるphpのバージョンを探します。


 
```
$ brew search php
```
現在インストールできるphp一覧が表示されるので、今回はphp@7.4をインストールします。

```
$ brew install php@7.4
```
## PATHを通す
phpのパスを調べます。

```
$ brew --prefix php@7.4
```
わたしの場合/opt/homebrew/opt/php@7.4にインストールされてやした。

```
$ vim .zshrc
#下記のように書き込む（PATH={brew --prefix php@7.4で返ってくるパス}/bin:$PATH）
export PATH=/opt/homebrew/opt/php@7.4/bin:$PATH
```

.zshrcを読み込む


```
$ source .zshrc
```

## 確認

```
$ php -v
```
> PHP 7.4.27 (cli) (built: Dec 16 2021 18:02:37) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.27, Copyright (c), by Zend Technologies
転職活動に向けてポートフォリオの要件を考える

## 自己PRしたい内容・知識

### 必須
* サーバーサイドのコーディングスキル
* Web APIの設計
* ユニットテスト
* DB
* 認証・認可
* Docker
* AWSやGitHubを用いたデプロイ

### できれば
* リバースプロキシ(Nginx)
* ドメイン駆動設計
* マイクロサービスアーキテクチャ
* セキュリティ
* WebSocket
* 複数言語(Python, C#, Node.js)

## ポートフォリオアーキテクチャの構想

### フロントエンド 

* Reactを用いたSPA (工数的余裕があればTypeScript, Next.js)
* UIライブラリとしてMaterialUIを使用
* HTTPS化

### バックエンド

* Python(Flask)を用いたWeb API
* 自己PRしたい項目を優先順位を考えながら実装する

### インフラ

* Docker(docker-compose)
* AWSのEC2またはFargateを用いてデプロイする

### その他

* Web APIリファレンスを作成する
* ドメインを取得する

## 今後

* ポートフォリオアプリの内容を考える
* 画面デザイン作成
* 機能検討
* 開発
Hiveで自動生成したAdapterが見つからない

part で宣言している部分をファイル名に揃えて `flutter pub run build_runner build` を実行する。クラス名に揃えてパスカルケースで part を宣言していたのでうまく生成されていなかった。

![スクリーンショット 2022-02-12 13.28.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274030/1ef102fb-a7da-19f1-fdfe-23e4964e27ad.png)