OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon Workspacesで作業するためのちょっとした設定


Amazon WorkspacesはAWSで提供されているリモートデスクトップ。

参画しているプロジェクトではセキュリティの観点から

- ローカルにファイルを保存することができない
- ローカルからBacklogやJIRAなどに接続してはいけない

という制限がある。

でも、もともと用意されている社内のOA端末でリモート接続すると、重すぎて作業にならない。

そこで、Amazon Workspacesを契約してもらって作業することになった。

私は開発の担当ではなく要件定義や外部設計の担当なので、作業は主に

- Web会議をする
- Microsoft OfficeのPowerPointまたはExcelを使ってドキュメントを書く
- 作成した資料をファイル共有用のWebサービスにアップロードする
- システムに関する資料をダウンロードする
- システムに関する資料を読む
- チャットツールでコミュニケーションを取る
- Backlogを書いたりやJIRAを見たりする

という感じ。

## 必要だった設定

### 英語キーボードになっているので、日本語キーボードにする。
Amazon Workspacesの設定で変更する。

英語キーボードとして認識されていると記号の一部が入力できない。
職場ではみんな、ファイル名やタイトルで_（アンダーバー）で文字を区切って命名するのが（分類などを盛り込めるので便利で）好きだけど、_（アンダーバー）も打てなくて、とても不便。

だから真っ先に設定した。

### マイクが使用不可になっているので、ONにする。
これはWeb会議をするため。
画面共有して投影する資料がAmazon Workspacesに保存されているので、
Amazon Workspaces上からWeb会議につなげることが必須だ。

## ~~まだ解決できていない不便なこと~~
## 解決できたみたい？な不便だったこと
### 液タブへの入力がなめらかじゃない

液タブを接続しているのでWeb会議のときにホワイトボードやパワーポイントに描画でマークをつけたり修正箇所の赤入れをしたりしたい。
でも、ローカルとAmazon Workspacesとの間の通信頻度の問題だと思うけれど、線がローカルで操作しているときに比べてギザギザで、使用感もいまひとつ。

全然使えないってほどじゃないから、使って行こうと思うけど、このすっきりしない感覚だったら液タブでなくマウス操作で丸印つけたりする程度でいいんじゃないかな？と思う。

もっとこまめにバッファリングできるように設定変えられないのかな？
とググれども、情報は入手できず。

~~残念だけど液タブはそこまで使えなさそう。~~

と思ってたんだけれど、液タブの設定で筆圧の互換性オプションをチェックしたら、書きやすくなりました。

![WACOM設定１.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1018028/78f0f465-0715-7e82-1087-c579bbfa8d47.jpeg)
![WACOM設定2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1018028/33193f5b-1db6-a48c-4f4c-4a77f4ecd47a.jpeg)


作ったものは前後で変わりないんだけれど、
ペンで書いてから、描画までの時間が速くなったので、もどかしい感じがなくなって、ストレスがなくなりました。

これで、Ｗｅｂ会議の時にも使えそうです。良かった良かった。
【分野別　初中級者が解くべき過去問精選 100 問】を初級者がC++で解く【全探索：順列全探索】

[レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編：目指せ水色コーダー！】](https://qiita.com/e869120/items/eb50fdaece12be418faa)の`2-3. 分野別　初中級者が解くべき過去問精選 100 問`を初級者がC++で解いていきます。

# 全探索：順列全探索

## [15　AtCoder Beginner Contest 145 C - Average Length](https://atcoder.jp/contests/abc145/tasks/abc145_c)
町を訪れる順番を順列で表現する。距離は計算するだけ。
判定時の誤差を最小化するためにsetprecision()を使った。
C++って階乗を返す標準関数はないのでしょうか。
```c++
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using ll = long long;
const ll inf = 1LL << 60;
#define rep(i, a, b) for (ll i = a; i < b; i++)
#define repeq(i, a, b) for (ll i = a; i <= b; i++)
#define rrep(i, b, a) for (ll i = b; i >= a; i--)
#define repb(i, n) for (ll i = 0; i < (1 << n); i++)
#define fore(i, n) for (auto &i : n)
#define all(x) x.begin(), x.end()
template<class T>bool chmax(T &a, const T &b) {if (a < b) {a = b; return 1;} return 0;}
template<class T>bool chmin(T &a, const T &b) {if (a > b) {a = b; return 1;} return 0;}

ll factorial(ll n) {
  if (n == 1) return 1;
  ll tmp = factorial(n - 1);
  return n * tmp;
}

int main() {
  ll N;
  cin >> N;
  
  vector<ll>x(N), y(N), g(N);
  rep(i, 0, N) {
    cin >> x.at(i) >> y.at(i);
    g.at(i) = i;
  }
  
  double ans = 0;
  do {
    double tmp2 = 0;
    rep(i, 0, N - 1) {
      double tmp1 = sqrt(pow(x.at(g.at(i)) - x.at(g.at(i + 1)), 2) + pow(y.at(g.at(i)) - y.at(g.at(i + 1)), 2));
      tmp2 += tmp1;
    }
    ans += tmp2;
  }while(next_permutation(all(g)));
  
  ll tmp3 = factorial(N);
  
  cout << fixed << setprecision(10);
  cout << ans / tmp3<< endl;
}

```
https://atcoder.jp/contests/abc145/submissions/37971341

## [16　AtCoder Beginner Contest 150 C - Count Order](https://atcoder.jp/contests/abc150/tasks/abc150_c)
do-whileとnext_permutation()を使ってPとQがそれぞれ辞書順で何番目かを探して、差をとる。
```c++
#include <bits/stdc++.h>
#define rep(i, a, b) for(int i = a; i < b; i++)
#define fore(i, n) for(auto &i:n)
#define all(x) x.begin(), x.end()
using namespace std;

int main(){
  int N;
  cin >> N;
  vector<int> P(N), Q(N), R(N);
  rep(i, 0, N) cin >> P.at(i);
  rep(i, 0, N) cin >> Q.at(i);
  
  rep(i, 0, N) R.at(i) = P.at(i);
  sort(all(R));
  int n = 1;
  int num_p = 0, num_q = 0;
  do {
    bool is_p = true, is_q = true;
    rep(i, 0, N) {
      if (R.at(i) != P.at(i)) is_p = false;
      if (R.at(i) != Q.at(i)) is_q = false;
    }
    if (is_p) num_p = n;
    if (is_q) num_q = n;
    n++;
  }
  while(next_permutation(all(R)));

  cout << abs(num_p - num_q) << endl;
}
```
https://atcoder.jp/contests/abc150/submissions/36548525

## [17　ALDS_13_A - 8 クイーン問題](https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_13_A&lang=ja)
AIZU ONLINE JUDGE に登録していないので、後回し。
Socket.io学習①　簡単なチャットアプリの構築１

マルチプレイのオンラインゲーム開発に向けてsocket.ioの勉強をしている。
その中で見つけた良い参考動画がこちら

https://www.youtube.com/watch?v=dSllP4TRJls

これを参考にして簡単なチャットアプリを構築しつつ、socket.ioとnode.jsの勉強をしていこうと思った。

まず、ネックになるのはそもそもnpmが何なのかである。
node.jsなどを始める際に必要になるパッケージ管理システムであるがそのインストール方法は複雑に見えた。
さらにMacについての説明は多く見られたがWindows用を探すのにも一苦労した。

結局こちらのサイト

https://zenn.dev/antez/articles/a9d9d12178b7b2

を参考にしてインストールした。割と簡単で

https://github.com/coreybutler/nvm-windows/releases


こちらのサイトからインストーラー(nvm-setup.zip)をダウンロードして実行すれば良い。

そうすれば最低限の動作はするようになった。

そして、socket.ioについていよいよやっていくことになる。

公式のドキュメントと先ほど例に示した動画を用いれば難なく実行することができると思うが少々手こずった部分だけ解説していく。

https://socket.io/get-started/chat

まず、clientディレクトリ上にnext.jsの新しいApp（プロジェクト）を作成する。

その際、

```
npx create-next-app@latest ./
```

最後の./を追加することで新しいプロジェクトの雛形をclientのディレクトリの直下に作成することが出来る。
私はこれを入力せず、一つ下の階層にプロジェクトを作成したため途中少々つまずいた。


```
npm i express nodemon socket.io
```
そして、この部分は最初呪文かと思ったが、必要になるパッケージがexpressとnodemonとsocket.ioであるため同時にインストールしているだけであった。

さらに、serverディレクトリ内のpackage.jsonファイル内の"scripts"の部分に"start":"nodemon index.js"と書き加えるのは、データに更新があった時自動でサーバーを再起動させるためである。

少々時間が無いので続きは明日書く。
AnimateCC シンボルに外部のプログラムをリンケージしたい

# プログラムを紐付ける
AnimateCC（ターゲットcanvas）で、
ライブラリ内のシンボルに、旧Flashの様にプログラムをリンケージして使いたい
と思ってライブラリ内のシンボルの「シンボルプロパティ」を見ても、グレーアウトされてて使えないm(__)m
なので、強引?にプログラムを紐付けたいなと思って、試行錯誤

んで、これでいいのかな

各シンボルの先頭フレームのアクションに、
例えばルートの先頭フレームに、
```Javascript
let myobj = new Main(this, lib);
```

```Main```クラスは予め html でインポートしている jsファイルになります
（記述は TypeScript を使っています）
```Javascript
class Main{
	private _myDisp:createjs.MovieClip = null;
	private _lib:any = null;

	constructor(current:createjs.MovieClip, lib:any){
		this._myDisp = current;
		this._lib = lib;
		this._myDisp.stop();
		console.log("this._myDisp:"+this._myDisp);
	}
}
```

これで、シンボルにクラスを紐付けることができました

コンストラクタの
第一引数に、シンボル自身
第二引数に、グローバル変数の lib を渡しています

実行すると、コンソールに
```this._myDisp:[MovieClip (name=null)]```
が表示されます

# newしてみる
上記はステージに配置している（またはルート）場合でしたが、
動的にシンボルを生成することも可能です
例えば、シンボルItemを用意して
Itemシンボル内には Animate上で、適当に図形を書いといて、
先頭フレームのアクションに、
```Javascript
let myobj = new Item(this, lib);
```
を記述
クラスファイルは（これも htmlでインポートしておきます）、

```Javascript
class Item{
	private _myDisp:createjs.MovieClip = null;
	private _lib:any = null;

	constructor(current:createjs.MovieClip, lib:any){
		this._myDisp = current;
		this._lib = lib;
		this._myDisp.stop();
		this._myDisp.alpha = 0;
		this._myDisp.scale = 0;

		this._init();
	}

	private _init():void{
		createjs.Tween.get(this._myDisp).wait(300 * Math.random()).to({scale:1, alpha:1}, 1000, createjs.Ease.circOut);
	}
}
```
これを Main から生成してみます。
Mainクラスに以下のメソッドを追加、
```Javascript
class Main{
// ... 略
	constructor(current:createjs.MovieClip, lib:any){
// ... 略
		this._randomDisp();
	}

	private _randomDisp():void{
		let i:number;
		for(i = 0; i < 5; i++){
			let item:Item = new this._lib.Item();
			item.x = 100 + 600 * Math.random();
			item.y = 100 + 500 * Math.random();
			this._myDisp.addChild(item);
		}
	}
}
```

注意点として、動的に生成するシンボルは以下の設定が必要となります
・クラス名とシンボル名は同一にしておく
・ステージに1つ配置しておく
なんかステージに配置されてないと生成できないみたいなので
ステージの見えないところに1つダミーとして配置しておきます

実行すると、Itemを5つ表示して、Item自体はフェードインしながらだんだん大きくなります

# 共通項をクラス分け
Mainクラス と Itemクラスと、コンストラクタ内の3行は共通項なので、
AbstractDispクラスとして、
```Javascript
class AbstractDisp{
	protected _myDisp:createjs.MovieClip = null;
	protected _lib:any = null;

	constructor(current:createjs.MovieClip, lib:any){
		this._myDisp = current;
		this._lib = lib;
		this._myDisp.stop();
	}
}
```
Mainクラス修正
```Javascript
class Main extends AbstractDisp{
	constructor(current:createjs.MovieClip, lib:any){
		super(current, lib);
// ... 略
```
Itemクラス修正
```Javascript
class Item extends AbstractDisp{
	constructor(current:createjs.MovieClip, lib:any){
		super(current, lib);
// ... 略
```
ちょっとだけ楽になる

# まとめ
これで、Animate上でのレイアウト・アニメーション作業と、プログラミング作業と、切り分けて進めることができます
プログラムを外部にだすメリットとして、分担作業もあるけど、Animate内部にプログラムを書いちゃうといちいちパブリッシュしないといけないけど、
これだと、ブラウザをリロードするだけで確認できます
ブラウザによってはキャッシュを毎回クリアしないといけないかもだけど、それでも、圧倒的に時間の短縮になります
ラズパイとShinobiでスタンドアロンな監視カメラ構築

[Shinobi](https://shinobi.video/)をラズパイにインストールしてWebカメラ挿したら監視カメラシステムが完成してしまいました。お手軽すぎる。

•構成
Webカメラ-ラズパイ-電源,無線LAN

•参考
https://hub.shinobi.video/articles/view/dRqw1Cqnty81Aii

•注意ポイント
インストールスクリプト走らせてから、Webカメラを挿す。
Webカメラ挿したままインストールスクリプト走らせると、いい感じにしてくれようとした結果、カメラ周りのエラー吐き続けてサーバー起動してくれない事象が発生したので。

•課題
pc, iphoneからはローカルネットワーク越しにコンパネ触れてカメラのストリーム見れるが、
pixel 4aだとコンパネは触れるがカメラのストリームが見れないがまだ理由は分からない。
DatabricksのPower BIコネクターがネイティブクエリーをサポートしました

[Databricks Power BI Connector Now Supports Native Query \- The Databricks Blog](https://www.databricks.com/blog/2023/01/12/databricks-power-bi-connector-now-supports-native-query.html)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

> これは、DatabricksとMicrosoftの共著です。Mahesh Prakriya (Director in Intelligence Platform, Microsoft)とBob Zhang (Sr. Technical Program Manager, Microsoft)に感謝の意を表します。

[最新のPower BIリリース](https://powerbi.microsoft.com/en-us/blog/power-bi-december-2022-feature-summary/#post-21693-_Toc121395734)におけるDatabricks Power BIコネクターでネイティブクエリーを利用できるようになったことを発表できて嬉しく思っています！ネイティブクエリーのサポートは、ローンチ以降にもっとも頻繁にリクエストされてきた機能の一つです。この新機能によって、お客様はさらなる柔軟性と生産性を持って、Databricks SQLのデータにアクセスし、データモデルを構築できるようになります。お客さmはデータソースのセットアップの過程でネイティブSQLクエリーを指定できるようになります。そして、ここで指定されたクエリーは、Power BIでのさらなるステップを行う前に、Databricks SQLに対してネイティブに実行されます。

# なぜネイティブSQL？

## 複雑な変換処理による柔軟性

ネイティブSQLはユーザーに対して、特定の変換に対して理想的なツールを選択する柔軟性を提供します。DAXは表現豊富でパワフルですが、より複雑なSQLクエリーやミサポートのオペレーションに対しては、ネイティブなSQLクエリーによってよりシンプルなワークフローを実現することができます。また、これはカスタムカラム定義を折りたたんだり、プッシュダウンでいないケースにおいては、単にネイティブSQLを構築することで大きなメリットを得ることができます。

## Databricks SQLの計算資源のさらなる活用

ネイティブSQLのサポートによって、お客様はデータソースをセットアップする過程で、直接Databricks SQLのウェアハウスに対して大規模なオペレーションや計算資源を大量に必要とするデータ準備クエリーを実行することができます。特により複雑な変換処理においては、これは膨大な時間を節約することができます。また、アナリストはよりシンプルなワークフローを実現するためにビューや他の仕組みを作成することなしにセルフサービスすることができます。

## 他のPower Queryソースからの移行をシンプルに

Power BIで他のデータソースとカスタム/ネイティブSQLを使用しているお客様においては、Databricks SQLへの移行は面倒なものでした。これまでのソリューションは、これをDatabricksのビューやDAXのロジックにマッピングしようとしていました。今では、これはDatabricks Power BIコネクターで適切なネイティブSQLを指定するだけで済むシンプルなものとなっています。

# どうやって使い始める？

使い始めるには以下のものが必要となります。

- Power BIの[2022年12月リリース](https://powerbi.microsoft.com/en-us/blog/power-bi-december-2022-feature-summary/#post-21693-_Toc121395734) (v2.112.603.0以降)
- Databricksアカウント(アカウントをお持ちでない場合には、[こちら](https://www.databricks.com/jp/try-databricks)からサインアップできます)

Power BIデスクトップを開き、以下の手順に従います。

1. Power BIの**Get Data**メニューから**Azure Databricks**か**Databricks**を探します。
![](https://cms.databricks.com/sites/default/files/inline-images/db-469-blog-img-1.png)
1. 接続ダイアログでサーバーとカタログ詳細を入力します。
1. 送信したいネイティブSQLクエリーを入力します。この場合は:

    ```sql:SQL
    SELECT * FROM tpch.region r where r.r_regionkey = 0
    ```

    ネイティブクエリー機能を使うためには、カタログのフィールドが必要であり指定しなくてはならず、指定されたカタログに相対になるようにネイティブクエリーを記述しなくてはならないことに注意してください。
![](https://cms.databricks.com/sites/default/files/inline-images/db-469-blog-img-2.png)

1. 認証を行ったら、クエリーを行う準備ができました！ダイレクトクエリーやインポートモードがサポートされています。
1. (オプション)Power BIアドバンスドクエリーエディターを開くことで、ネイティブクエリーを確認することができ、ここから必要に応じて修正を行い保存します。
![](https://cms.databricks.com/sites/default/files/inline-images/db-469-blog-img-3.png)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
SQLite3のデータをWeb APIから操作してみる

# はじめに

以前は.NET Core 3.0を使ってSQLiteのデータをWeb APIから操作してみましたが、今回は.NET 6で操作してみます。
https://qiita.com/namikitakeo/items/d98e46c2aa2cd50ee1b1

# 実行環境
下記バージョンで動作確認しています。
- Ubuntu 22.04
- .NET 6.0

<pre>
$ dotnet --version
6.0.113

$ uname -a
Linux desktop 5.15.0-1022-raspi #24-Ubuntu SMP PREEMPT Mon Dec 5 09:58:33 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux
</pre>

# 学習方針
コマンドプロンプトから実行する事で、Mac、Windowsにおいてもそのままできると思います。
https://learn.microsoft.com/ja-jp/training/modules/build-web-api-minimal-database/

チュートリアルにしたがって以下のコードを実装します。

```C#:Models/Pizza.cs
using Microsoft.EntityFrameworkCore;

namespace PizzaStore.Models
{
    public class Pizza
    {
          public int Id { get; set; }
          public string? Name { get; set; }
          public string? Description { get; set; }
    }
    class PizzaDb : DbContext
    {
        public PizzaDb(DbContextOptions options) : base(options) { }
        public DbSet<Pizza> Pizzas { get; set; } = null!;
    }
}
```

```C#:Program.cs
app.MapGet("/", () => "Hello World!");

app.Run(); */

using PizzaStore.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.OpenApi.Models;

var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("Pizzas") ?? "Data Source=Pizzas.db";

builder.Services.AddEndpointsApiExplorer();
//builder.Services.AddDbContext<PizzaDb>(options => options.UseInMemoryDatabase("items"));
builder.Services.AddSqlite<PizzaDb>(connectionString);
builder.Services.AddSwaggerGen(c =>
{
     c.SwaggerDoc("v1", new OpenApiInfo {
         Title = "PizzaStore API",
         Description = "Making the Pizzas you love",
         Version = "v1" });
});

var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI(c =>
{
   c.SwaggerEndpoint("/swagger/v1/swagger.json", "PizzaStore API V1");
});

app.MapGet("/", () => "Hello World!");
app.MapPost("/pizza", async (PizzaDb db, Pizza pizza) =>
{
    await db.Pizzas.AddAsync(pizza);
    await db.SaveChangesAsync();
    return Results.Created($"/pizza/{pizza.Id}", pizza);
});
app.MapGet("/pizza/{id}", async (PizzaDb db, int id) => await db.Pizzas.FindAsync(id));
app.MapPut("/pizza/{id}", async (PizzaDb db, Pizza updatepizza, int id) =>
{
      var pizza = await db.Pizzas.FindAsync(id);
      if (pizza is null) return Results.NotFound();
      pizza.Name = updatepizza.Name;
      pizza.Description = updatepizza.Description;
      await db.SaveChangesAsync();
      return Results.NoContent();
});
app.MapDelete("/pizza/{id}", async (PizzaDb db, int id) =>
{
   var pizza = await db.Pizzas.FindAsync(id);
   if (pizza is null)
   {
      return Results.NotFound();
   }
   db.Pizzas.Remove(pizza);
   await db.SaveChangesAsync();
   return Results.Ok();
});
app.MapGet("/pizzas", async (PizzaDb db) => await db.Pizzas.ToListAsync());
app.Run();
```
Install Google Chrome to Ubuntu 16.04

# Dowload old vesion chrome deb file
1. Download Chrome 80 from [Google chrome of old version](https://www.slimjet.com/chrome/google-chrome-old-version.php).
2. Select version <font color="red">80.0.3987.149</font> form Google Chrome Linux Version/64-bit deb for Ubuntu/Debian.
Then, you can download google-chrome-stable_current_amd64.deb file in Downloads folder.

# Install to Ubuntu
```
cd ~/Downloads
sudo apt install -y ./google-chrome-stable_current_amd64.deb
```

If you get the following error,
```
You might want to run 'apt-get -f install' to correct these.
E: Unmet dependencies. Try using -f.
```
run the following command.
```
cd ~/Downloads
sudo apt-get -f install ./google-chrome-stable_current_amd64.deb
```
Above command solved the following error.
```
 google-chrome-stable : Depends: libu2f-udev but it is not installable
                        Depends: libvulkan1 but it is not installed
```

If you need other dependencies `libappindicator1` 
 and `libindicator7`, run following command.
```
sudo apt-get install libappindicator1 libindicator7
```
# References

https://www.slimjet.com/chrome/google-chrome-old-version.php

https://qiita.com/ekzemplaro/items/11539f5bd9b80a6c7dca

---
<font color="yellowgreen">**QiitaLink**</font>
<font color="black">**Designed by RENOX**</font>
LPC812MAXとSSD1306で「アイテム」を表示(8x8)(Keil Studio)



x ライブラリの追加が出来る人

x なぜかMBEDオンラインコンパイラが終わってしまったのでkeilに移行

x 過去ログをみよ





![o_cop337.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/3c5097c5-9de6-c6ac-1c4e-757187ede4b9.jpeg)


![o_cop338.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/31e7cd93-136c-4473-203b-8d33a06654af.jpeg)


![o_cop339.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b853705d-0874-409a-73ce-c5c884c4a9d1.jpeg)


![o_cop340.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/bbc75452-19c3-da11-995b-e6fadfa9d0a2.jpeg)






```c++


//oled_test2_16x24_812_1

#include "mbed.h"
#include "SSD1308.h"

//i2c initialization
//       SDA    SCL
I2C i2c(P0_10, P0_11); //812

// ビットマップデータ
char databytes1[8] = 

{

0b01100110,
0b10101111,
0b10111111,
0b11011111,

0b01111110,
0b01111110,
0b00111100,
0b00011000

};


int gop[8][8] = {
    {0,0,0,0,  0,0,0,0}, 
    {0,0,0,0,  0,0,0,0},
    {0,0,0,0,  0,0,0,0}, 
    {0,0,0,0,  0,0,0,0}, 

    {0,0,0,0,  0,0,0,0},
    {0,0,0,0,  0,0,0,0}, 
    {0,0,0,0,  0,0,0,0}, 
    {0,0,0,0,  0,0,0,0}
};


  unsigned char bbh[]
// 1122 
 ={0,0,
   0,0,
   0,0,
   0,0}; 


void p_m270(char ttt[]) {
    
   char cc;
    
  for(int ii=0;ii<8;ii++)   { 
    
  cc = ttt[ii];

  gop[ii][7] = cc & 0x1; cc = cc >> 1;
  gop[ii][6] = cc & 0x1; cc = cc >> 1;
  gop[ii][5] = cc & 0x1; cc = cc >> 1;
  gop[ii][4] = cc & 0x1; cc = cc >> 1;

  gop[ii][3] = cc & 0x1; cc = cc >> 1;
  gop[ii][2] = cc & 0x1; cc = cc >> 1;
  gop[ii][1] = cc & 0x1; cc = cc >> 1;
  gop[ii][0] = cc & 0x1;

  }//for
    
}//p_0


void p_out(unsigned char ttt[]) {
    
  char cc;
    
  for(int ii=0;ii<8;ii++)   { 
    
  cc = 0;

  cc = cc + (gop[0][ii] * 1   );
  cc = cc + (gop[1][ii] * 2   );
  cc = cc + (gop[2][ii] * 4   );
  cc = cc + (gop[3][ii] * 8   );

  cc = cc + (gop[4][ii] * 16  );
  cc = cc + (gop[5][ii] * 32  );
  cc = cc + (gop[6][ii] * 64  );
  cc = cc + (gop[7][ii] * 128 );

  ttt[ii] = cc;


  }//for
    
}//p_out


//メイン関数
int main()
{

    wait_ms(500); //0.5秒の待ち

    // Instantiate OLED
    SSD1308 oled = SSD1308( &i2c , SSD1308_SA0);


int o_row=0;
int o_col=0;


  p_m270(databytes1); 
  p_out(bbh);


    oled.writeBitmap( (uint8_t *)bbh,
                o_row, (o_row + 1 - 1),
                o_col, (o_col + 8 - 1));



    while(1) {}

}//main




```
GitのローカルリポジトリとローカルのJenkinsの連携

# 概要
色々な事情でリポジトリの設定をいじることができない時に
Gitのpost-commitを使いローカルのJenkinsで自動テストする方法。

# ローカルでJenkinsを起動する
Dockerを使うと楽に構築できる。
Jenkinsの設定方法など一般的なことに関しては別のページ参照。

# ローカル用Jenkinsのdocker-compose
ポイントは2つ。
- ローカルのGitフォルダからcloneを許可するために、JAVA_OPTSを設定すること
- ローカルファイルを見えるようにするためvolumesでマウントすること
　ここでは`/local/gitrepo/`にあると仮定してコンテナの`/home/repo`にマウントしている。

```docker-compose.yml
version: "3"
services:
  jenkins:
    container_name: jenkins
    image: jenkins/jenkins:latest
    environment:
      JAVA_OPTS: -Dhudson.plugins.git.GitSCM.ALLOW_LOCAL_CHECKOUT=true
    ports:
      - 8888:8080
    volumes:
      - ./jenkins_home:/var/jenkins_home
      - /local/gitrepo/:/home/repo
```

# Jenkinsの設定
- リポジトリのURLにはパスを書けばOK
- 認証トークンを設定しておく

![Screenshot_1245.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217092/12c6a177-0a19-9d87-a34d-8247d3070426.png)

![Screenshot_1246.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217092/8d28633e-2ab4-39ab-aafb-102faf3f16be.png)

# post-commitに仕込む
- ポート番号はdocker-composeで設定したもの
- token=の後ろは上記で設定した認証トークン

```post-commit
#!/bin/sh

wget -O - http://localhost:8888/job/Test/build?token=abcde

```

# 参考
https://hidari-lab.hatenablog.com/entry/git_post-commit-hook_with_jenkins

https://hub.docker.com/_/jenkins

https://qiita.com/moukuto/items/141b447505e5bdf1d4c3
MacOS の Terminal でユーザー名と PC 名を非表示にする

## シンプルなターミナル画面

> Macbook に標準で付属している UNIX 端末エミュレータ「ターミナル」は便利で、エンジンニアにとって、多分一番よく見る画面です。ターミナル自体のデザインはシンプルでとても素敵と思っていますが、ユーザー名とPC名が毎回表示されるのは不便と思っています。

![スクリーンショット 2023-01-13 18.59.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3076318/b1f17c3e-2474-b3db-8a9f-83be1bedcd67.png)

- ユーザー名とPC名が表示されている状態です。

![元の画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3076318/95faa8bc-8361-625b-108c-39d764a25d28.png)

- ユーザー名と PC 名を隠して見やすくなりました。

![image-20230113201810249.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3076318/f8f75f67-427a-8dec-97bf-9b185246a88e.png)


## 設定方法

- まずは下記コマンドを入力して、今使用している Shell を確認します。筆者の Macbook は Ventura 13.1 を使っていますので、zsh です。

```shell
echo $SHELL
```

![image-20230113192033159.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3076318/c114bea1-2ddc-04d9-8ed4-37861cb318da.png)

- zsh の設定ファイルをVimで開きます。

```shell
vim /etc/zshrc
```

![image-20230113193237987.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3076318/7de4e174-c0fe-eb3d-eea3-e2a01ed0adf2.png)

- 実行したら下記の zshrc ファイルの中身が表示されます。

![image-20230113193351193.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3076318/ab82a4ba-3ded-92a3-b9a3-0162f27bf986.png)

- 下まで移動すると、`# Default prompt`と言う項目が出てきます。

![image-20230113193534128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3076318/7803c07b-4b67-6ddf-0ff5-bfa3d140c266.png)

- ユーザー名とPC名を隠すには、ここの`nとm`を削除します。

```shell
PS1 : 表示するスタイル
n   : ユーザー名
m   : PC名
```

- 「i」を押して挿入モードに入ります。元の設定をコメントアウトして下記の一行を追加します。

```
PS1="%1~ %# "
```

> 設定ファイルは readonly ですので、一度警告が出ますが無視して編集を続きます。

![image-20230113195806281.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3076318/fd9ce999-c682-d1d7-bd1d-9b81faa2d5fa.png)

- 「esc」を押して挿入モードからノーマルモードへ切り替えます。sudu 命令で変更を保存します。

> 一度パソコンのパスワードが要求されます。自分のパスワードを入力してください。

![スクリーンショット 2023-01-13 20.06.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3076318/661a4f68-5ca5-d065-5f81-087851a475df.png)

- 緑色の警告を無視して、続いて下記コマンドを入力して強制的Vimを閉じます。こうやって上書きができました。

```shell
:q!
```

![image-20230113200934129.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3076318/8007ba3b-44f0-b5ba-cd38-90f65d3882f3.png)


- ターミナルを再起動して、ユーザー名とPC名がなくなりました。

![image-20230113201810249.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3076318/fc4d42b2-bc1f-ac2d-ec11-0f8ed54961f2.png)

## 最後

:smiley:ターミナルがすっきりになる事で気持ちいいだけではなく、色んな作業の効率向上にも繋がります。この記事を参考して皆さんが楽しみにしていただければと思っています。
【EC-CUBE】 プロジェクトをpublic_html配下にインストールする方法

# 初めに
どうも、フランスでプログラマーとして働き始めて１週間ほどの新人エンジニアです。

今回、案件でEC-CUBEのインストールからやらせてもらった時に、詰まったところを

備忘録として残します。

## 状況
EC-CUBEの4.2をインストールしたかったので下記を参考にした。
https://doc4.ec-cube.net/quickstart/command_install
上記の公式ドキュメントでコマンドからインストールする手引きでインストールを行うと、
`public_html/ec-cube/`配下にインストールされてしまう。

サーバー:Xserver
OS: Linux

### やりたいこと
ドキュメント直下に配置したい。

## 解決方法
一度`public_html/ec-cube/`配下にインストールする
↓
その後中身の階層を一階層上げる

## やり方
①まずはpublic_htmlにcomposer.pharをインストールする

②ec-cubeをインストールするコマンドを打つ（この時にec-cubeディレクトリが作成される）
```
php composer.phar create-project ec-cube/ec-cube ec-cube "4.2.x-dev" --keep-vcs
```
※私の場合EC-CUBEの4.2系をインストールしたかったので、`"4.2.x-dev"`に変えました。
※この時点でec-cubeディレクトリを作らずにインストールコマンドも一様あるが、中身がからじゃないとインストールできず、公式ドキュメントのやり方だとcomposer.pharが絶対に入っているので断念。一様そのコマンド↓
```
php composer.phar create-project ec-cube/ec-cube . "4.2.x-dev" --keep-vcs
```

③インストールが完了したら、`cd ec-cube`でディレクトリを変更した後、
```
mv * ../
```
これで全てのファイルが一階層上に移動します。
しかしこれだと隠しファイルが残ったままなので、
```
mv * .[^\.]* ../
```
このようにやると隠しファイルの一階層上に移動することができます。

その後、`cd ../`で`rmdir ec-cube`やれば余計なディレクトリも削除できて完了です！

## まとめ
FTPを使ってやったらめっちゃ時間かかったのでコマンドラインでやったのですが、今更git cloneでやったらもっと楽にできたかも？と思ってます。
テスト用のサーバーで一度テストしてみます。

もっといい方法などあれば是非コメントください
Nuxt3 / Vue3 + vee-alidate4 - 入力エリアでエンターを押してもsubmitで送信しない

# コード例

- `<Form>` や `<Field>` を使わずにやってみる
- `<form>` も使わずにやってみる。formではないのでエンターでそもそも送信処理は起こらない。

```vue
<template>
  <div>
    <input v-model="emailValue" type="text" />

    <button @click="submit">Submit</button>
    <p v-if="errorMessageEmail">{{ errorMessageEmail }}</p>
  </div>
</template>

<script setup>
import { useField } from 'vee-validate';

const { meta: emailValidateMeta, value: emailValue, errorMessage: errorMessageEmail } = useField("email", "required|email");

function submit(event) {
  console.log("validate check");

  if (!emailValidateMeta.valid) { return; }

  console.log(emailValue.value)
  console.log("submit");
}
</script>
```

# 動作例

![image](https://user-images.githubusercontent.com/13635059/212304060-62da40d5-0495-4a5e-a043-3f320068c6fc.png)
![image](https://user-images.githubusercontent.com/13635059/212304079-5f069d4d-97b2-487d-aa06-66d113050548.png)

# 環境

- nuxt@3.0.0
- vee-validate@4.7.3

# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura
Nuxt3 / Vue3 + vee-validate4 – バリデーションチェックをして不正であれば submitさせない

# コード例

- useField で meta / value  / errorMessage などを定義できるので、それを利用する
- submitの時に valid でなければ処理を実行せず戻るようにしておく

```vue

<template>
  <form @submit="submit">
    <p>Name <input v-model="nameValue" type="text" /></p>
    <p>Email<input v-model="emailValue" type="text" /></p>

    <button>Submit</button>
    <p v-if="errorMessageName">{{ errorMessageName }}</p>
    <p v-if="errorMessageEmail">{{ errorMessageEmail }}</p>
</form>
</template>

<script setup>
import { useField } from 'vee-validate';

const { meta: nameValidateMeta, value: nameValue, errorMessage: errorMessageName } = useField("name", "required");
const { meta: emailValidateMeta, value: emailValue, errorMessage: errorMessageEmail } = useField("email", "required|email");

function submit(event) {
  event.preventDefault();

  console.log("validate check");

  if(!nameValidateMeta.valid) {
    console.log("name is invalid")
    return;
  }
  if(!emailValidateMeta.valid) {
    console.log("email is invalid")
    return;
  }

  console.log("submit");
  console.log(nameValue.value)
  console.log(emailValue.value)
}
</script>

```
# 動作例

<img width="586" alt="image" src="https://user-images.githubusercontent.com/13635059/212309217-f1470e25-e2e9-49b0-b50d-fffd5077fc0b.png">


# 参考

https://vee-validate.logaretm.com/v4/guide/composition-api/validation/ 


# 環境

nuxt 3.0.0

# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura
Twitter API V2 BearerTokenの取得

# BearerTokenの取得
## アクセスキーとシークレットアクセスキーで照会
* ターミナルを開く
```
curl -u "APIキー:APIシークレット" \
  --data 'grant_type=client_credentials' \
  'https://api.twitter.com/oauth2/token'
```
* 返ってきたものがこちら
```
{"token_type":"bearer","access_token":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}
```
[初学者向け] C言語　コーディング → コンパイル → プログラム実行　のざっくりした流れ

## 1. はじめに

マックではじめてC言語プログラミングする人のために, 簡単なコーディング, コンパイル, 実行の手順を書いてみます.

コーディング自体が初めてでマックユーザーの方は, まず

    「アプリケーション」->「ユーティリティ」->「ターミナル」

を開いてみてください.

VSコードはこちら

https://www602.math.ryukoku.ac.jp/Prog1/vscode-mac.html

よかったらこちらもご参照ください.

https://qiita.com/uzo/items/a0baabfc612a79ff5c4f

## 2. 準備 & ファイル作成

まずは, "pwd"(print working directory=現在作業中のディレクトリ(フォルダ)を表示)コマンドで現在地を確認. '%' の前の"user"はあなたの使っているコンピューターのユーザー名です. 

```: コマンドライン
 user % pwd
```

"pwd"とコマンドラインに入力すると、例えば下記のように表示されるはずです。
```:ターミナル
    /Users/ログイン名
```

ログイン名はあなたの使っているコンピューターのユーザー名です. デスクトップや書類など, 好きな場所に"cd"(change directory=作業するディレクトリの変更)コマンドで移動します.
("user %"のあとの文字をコマンドラインに入力します. "書類", ”デスクトップ”など目当てのディレクトリがすでにあれば, そのフォルダをターミナルにドラッグ&ドロップすることで楽に入力することもできます)

    user % cd /Users/ユーザー名/Desktop

↑今回はデスクトップにファイルを入れるディレクトリ（フォルダ）作成します.


次にターミナルを開き, ディレクトリを"mkdir"(make directory)コマンドで作成.


    user % mkdir exercise

↑今回はディレクトリ名を"exercise"とします.

ディレクトリが無事作成されたら, そこに"cd"コマンドで移動

    user % cd exercise

コードを作成するためのファイルを"touch"コマンドで作成.
今回ファイル名は"print_hello.c"とします.

    user % touch print_hello.c

## 3. コーディング

 "print_hello.c"ファイルを開いたら, 以下のコードを書類の中に書いてみましょう.
(基本的に慣れるためには自分で書くことが重要だと思いますが, もし初めてでしんどければコピペでも大丈夫です) 

```c: エディタ
#include <stdio.h>// printf()を使うために必要

int main(void)
{
    printf("Hello, World!");
    return (0);
}
```
## 4. コンパイル

書けたらコンパイルしてみましょう. 
コマンドラインに戻り, コンパイルコマンド(gcc)の後にファイル名を入力することでコンパイルします.

    user % gcc print_hello.c


gcc(GNU Compiler Collection)はコンパイラー名, コンパイルコマンド名です.　このようにコンパイルコマンド名の後にファイル名を置くことでコンパイルされます.

コンパイラは他に"cc", "clang", "tcc"など色々あるようです. 

    user % clang print_hello.c

## 5. プログラム実行

コンパイルが成功したら, 同じディレクトリ内に"a.out"というファイルができてるはずです.
同じディレクトリ内に"a.out"があることを確認したら, ターミナルでプログラム実行の命令を出します.

    user % ./a.out

最初に書いたコードをコピペしてコンパイルし, プログラム実行をすると, 以下のようにターミナルに出力されるはずです.

    Hello, World!

## 6. 便利なオプション

また, より安全なコンパイルのために, 下記のようにコマンドを入力することをオススメします.

    user % gcc -Wall -Wextra -Werror print_hello.c

"-Wall" "-Wextra" "-Werror"はそれぞれコンパイル用のフラグです.

例えば"-Werror"は通常"warning（ウォーニング: 警告）"として表示されるものを"error（エラー）"として扱います.
（ウォーニングの場合はコンパイルできますが, エラーとして扱われるとコンパイルできません. これにより危ないコードをそのままにせず, より安全なコンパイルができるようになります.

ちなみに, 下記のようにコマンド実行すると、コンパイルとプログラム実行が一度にできます。

    user % gcc -Wall -Wextra -Werror print_hello.c ; ./a.out

または

    user % gcc -Wall -Wextra -Werror print_hello.c && ./a.out
パッケージ開発でCommonJSとES Modulesの両方に対応する💪 - デュアルパッケージ

# やりたいこと

パッケージの開発を行うにあたり、CommonJSとES Modulesの両方に対応したい😃

# 対応方法

CommonJS用とES Modules用の2つのJavaScriptを出力します。
出力するmoduleの分だけtsconfig.jsonを用意します。

以下の4つのファイルを用意します。

```
./
├── tsconfig.base.json
├── tsconfig.cjs.json
├── tsconfig.esm.json
└── tsconfig.json
```


```tsconfig.json
{
  "extends": "./tsconfig.base.json"
}
```

```tsconfig.base.json
{
  "compilerOptions": {
    "target": "es5",
    "module": "esnext",
    "outDir": "./dist/",
    // ...
  },
  // ...
}
```

```tsconfig.cjs.json
{
  "extends": "./tsconfig.base.json",
  "compilerOptions": {
    "module": "commonjs",
    "outDir": "./dist/"
  }
}
```

```tsconfig.esm.json
{
  "extends": "./tsconfig.base.json",
  "compilerOptions": {
    "module": "esnext",
    "outDir": "./dist/esm"
  }
}
```

package.jsonに以下の設定を追加します。

```package.json
{
  "main": "dist/index.js",
  "module": "dist/esm/index.js",
  "types": "dist/esm/index.d.ts",
  "scripts": {
    "build": "yarn build:cjs && yarn build:esm",
    "build:cjs": "tsc -p tsconfig.cjs.json",
    "build:esm": "tsc -p tsconfig.esm.json",
  }
}
```

- main： commonjsのエントリーポイントとなるjsファイルを設定します。
- module： esmoduleのエントリーポイントとなるjsファイルを設定します。
- types： 型定義ファイルのエントリーポイントとなるtsファイルを設定します。

これで完成です🤗

# 参考

https://typescriptbook.jp/reference/advanced-topics/tsconfig-for-dual-package-developers
クラウドサービス（AWS）周りの用語について簡潔にまとめてみた

#### 本記事について
この記事は、AWS関連の公式資料を読んでもすぐに理解できない初心者向けの記事です。
インターネットで検索しても簡潔にまとめているサイトが見つからなかったのでそういう方の助けになればと思いまとめました

**本記事で扱う用語は以下**
・オンプレミス
・クラウドサービス
・リージョン
・AZ(アベイラビリティゾーン）
・Route 53
・IAM（ユーザ、グループ、ロール）
・EC2（Elastic Compute Cloud）
・S3 （Simple Storage Service）
・セキュリティグループ
・ネットワークアクセスリスト
・CloudWatch
・マネージドサービス



#### オンプレミス
サーバー機器やネットワーク機器などを使用者の管理する施設内に設置して運用する形態
データセンターなどに自前でサーバ機器を用意し設定もする環境

#### クラウドサービス
オンライン上のサーバーで提供されているシステムをサービスとして利用者に提供する形態
主にコスト面でオンプレミスより優れている。機器導入やデータセンターの契約など不要

#### リージョン
クラウドサービス上でのデータセンターの所在地（バージニア北部、香港、東京など）

#### AZ(アベイラビリティゾーン）
1つ以上のデータセンターがネットワークでつながっているデータセンタ群

#### Route 53
AWSが提供するDNSサービス

#### IAM系
IAMは、「認証」と「認可」の設定を行うことができるサービス
ポリシーをユーザ（グループ、ロール、アプリケーション）にアタッチ（適用）する事でアクセス権の付与等を行える

IAM ポリシー：ルール
IAM ユーザ：個人に対しての設定
IAM グループ：グループに対しての設定
IAM ロール：一時的に権限を付与したい時に設定

#### EC2（Elastic Compute Cloud）
AWSが提供する仮想マシンサービス

#### S3 （Simple Storage Service）
AWSで使われるオブジェクトストレージサービス
VPC外であり設定次第ではインターネットから直接アクセスできる

VPC：AWSアカウント内に構築できる仮想ネットワーク


#### セキュリティグループ
EC2やRDSなどのインスタンスに対して適用するファイアウォール

インスタンス：AWS クラウド内の仮想サーバー

#### ネットワークアクセスリスト
サブネットに適用するファイアウォール

#### CloudWatch
AWSで提供しているリソースの監視を行う機能


#### マネージドサービス
本来のサービスに付随して発生する業務をまとめて請け負うサービス
サーバの例：セキュリティ対応・障害復旧などのサービスが付随している

フルマネージドサービス：マネージドサービスより手厚いサービスとなっている（24h監視等）
アンマネージドサービス：上記のマネージドサービス以外のサービス全て


#### まとめ
いかがでしたでしょうか。
本記事でイメージを持っていただければ、AWS公式ページの内容も
大分、分かりやすくなるのではないでしょうか
お役に立てたら幸いです
ゼロバンク・デザインファクトリーが生み出す「みんなの銀行」

![ID-KV02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004607/2262c4a8-e177-0ed8-0d3e-4e9e8c69e04d.jpeg)

## はじめに
はじめまして。ゼロバンク・デザインファクトリー株式会社（以下ZDF）の川原です。
今後ZDFではメンバー各人による様々な記事を発信していく予定なのですが、その第一弾として「ゼロバンク・デザインファクトリーってどんな会社なのか？」ということについて、簡単にご紹介したいと思います。

## ゼロバンク・デザインファクトリーとみんなの銀行
ZDFはふくおかフィナンシャルグループ（以下FFG）傘下のシステム開発会社であり、その大きなミッションは、同じくFFG傘下のデジタルバンクである「みんなの銀行」の基幹システムの開発・運営です。

ZDFとみんなの銀行の関係性についてよくご質問をいただきますが、両社はSIerのような受発注の関係ではなく、パートナー関係を更に超えた「二社一体」となってプロジェクト（みんなの銀行プロジェクト）に取り組んでおり、両社を兼務するメンバーも多くいます（私もその一人です）。


**■ サービスでのつながり**
ゼロバンク・デザインファクトリーはバンキングシステムをみんなの銀行に提供し、みんなの銀行はお客さまへ金融サービスを、パートナー企業さまへ金融機能の提供を行っています。
このバンキングシステムは、銀行ビジネスへの新規参入を目指す企業さまにもご提供します。

![SERVISE](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004607/527bc520-ad34-0bd3-f9ad-02201e2facdc.png)

**■ バンキングシステムの外販も視野に**
ゼロバンク・デザインファクトリーが開発するバンキングシステムは、勘定系コアシステムに限らず、優れたUI/UXのモバイルアプリも含みます。 Google Cloud 上に構築したクラウドネイティブなバンキングシステムは十分なセキュリティテストを行い、可用性・信頼性の高いものとなっています。
ゼロバンク・デザインファクトリーはみんなの銀行のシステムのみの開発にとどまらず、バンキングシステムをはじめとしてソリューションの外販も視野に入れています。
![BaaS](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004607/056a6be9-ee8c-d8c9-f439-729456c94207.png)


## みんなの銀行が目指す世界観

■ Concept:bulb:
**お金のあれこれ、スマホで完結**
銀行をもっと**シンプル**に**ミニマル**に。
友達にお金を送ったり、カードレスでATMから現金をおろしたり、
預けたお金をスマホの中で管理したり、全財産の収支の流れをおいかけてみたり、
みんなの銀行はいろんなお金のアクションが、ひとつのアプリで完結します。
お財布いらずの銀行です。


■ Target:round_pushpin:
**デジタルネイティブ世代の求める　新しい銀行のカタチを目指して**
デジタル銀行（デジタルバンク）とは、デジタルネイティブ世代をメインターゲットとし、
デジタル起点なアプローチでつくる銀行のことです。
**従来の枠組みに捉われることなく「ゼロベース」から設計**することで、
デジタル時代に即した「全く新しい」銀行を目指しています。
お客さまがミニマルで質の高い人生を送るための、「価値あるつながり」を提供します。


■ Design:pencil2:
**銀行をもっとシンプルに**
銀行を「ゼロベース」から設計したからこそ実現したシンプルでミニマルなUI/UX。
**直感的な操作性**とこれまでの銀行にはない**デザイン性**はデジタルネイティブ世代から多くの支持をいただいています。

![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004607/ea54a0e4-90a5-6f43-668a-2a737a4de5f4.png)


## ZDF・みんなの銀行をカタチづくるもの
2022年12月現在、ZDF・みんなの銀行では計200名を超えるメンバーが働いており、新たなメンバーも毎月続々と参画しています。

このメンバーに関しても、本プロジェクトの特徴が現れています。

現在200名を超えるメンバーの内、FFGグループ内からの異動者は4割弱にとどまり、残りの6割強はキャリア採用者で構成されています。
銀行・金融にこれまで関わりがなかったメンバーも含め、「金融の新しい未来を創る」というビジョンに共感し、職種・企業の垣根を超えて各々がそれぞれ有する強みをチームとして発揮することで新たな価値を生み出す。
この多様性・関係性こそが私たちの強みであり、そこから生まれる健全なディスカッション等によって、金融業界にイノベーションを起こすチャレンジをしています。

この多種多様なメンバーの指針となっているのが、**「MISSION・VISION・VALUE」** です。

共感する想い、大事にしたい考え、このビジネスの根底になる部分で繋がっているからこそ、ZDF・みんなの銀行という組織の輪が広がっています。
![MVV.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004607/b06e769d-70df-0198-44c5-a27e2cf1de7a.png)
それでは、これからはじまるゼロバンク・デザインファクトリーの情報発信がはじまります！
次世代デジタルバンクを是非体感してください！


:mag: **ゼロバンク・デザインファクトリーでは新しい仲間を大募集！**
▼ 採用情報はこちら
ZDF・みんなの銀行の拠点は福岡と東京にあり、リモートワークも活用しながらフレキシブルな環境で働いています。

https://corporate.minna-no-ginko.com/careers/
ワードプレスのフォームの生年月日を楽に実装する

ワードプレスのフォームの入力欄で`option`の誕生日などの年を全て打たなくてもいいようにphpを組み合わせて楽に実装できたらいいですね。実装方法を調べてみると良い記事を見つけたので紹介します。

~~~php
add_filter('mwform_choices_mw-wp-form-xxx', 'mwform_add_birthday_options', 10, 2);
function mwform_add_birthday_options($children, $atts) {
  if ($atts['name'] === 'birthday_year') {
    $children[''] = '西暦';
    $current_year = date('Y');
    $start_year = $current_year - 70;
    for ($i = $start_year; $i <= $current_year; $i++) {
      $children[$i] = $i;
    }
  } 
  if ($atts['name'] === 'birthday_month') {
    $children[''] = '月';
    for ($i = 1; $i <= 12; $i++) {
      $children[$i] = $i;
    }
  }
  if ($atts['name'] === 'birthday_day') {
    $children[''] = '日';
    for ($i = 1; $i <= 31; $i++) {
      $children[$i] = $i;
    }
  }
  return $children;
}
~~~
基本は下の参考記事のままで、変えたぶぶんだけ載せます。月と日は固定で1〜12月、1〜31日まで出ます。年は今年から70年前まで遡って`option`タグが生成されます。これだとコードを更新する必要がないので楽です。

さらに私は初期値の色を変えたかったので、もう一工夫しました。
~~~js
jQuery(function () {
  const Select = jQuery('.rec-select-birthday');
  Select.attr('required', true);
});
~~~
~~~scss
.rec-select-birthday {
  width: 100%;
  &:invalid {
    color: #b2b2b2;
  }
~~~
`rec-select-birthday`はセレクトタグにつけます。jQueryでrequired属性をつけて、上記のCSSを当てることで、最初の文字をうす灰色にできました。
いろいろ試行錯誤して上記のコードになりました。探せばもっとよい方法があるかもです。
#### 参考
https://www.nxworld.net/wp-mwform-choices-output-date-of-birth.html

https://www.nishishi.com/css/select-placeholder-color.html
Android/iOSアプリの提出に必要なアプリ以外の準備

* Android/iOS 共通
プライバシーポリシーのサイト
以下で簡単に作成できるので、つくってGoogle Sitesかなにかで公開し、提出時にリンク先に設定する
https://app-privacy-policy-generator.firebaseapp.com/

* Android固有 (PlayStoreへの提出)
(1)スクリーンショット
JPEG、あるいは24 ビットのPNGであること
最小サイズ：320px ～ 最大サイズ：3840px
スクリーンショットの最大サイズは、最小サイズの2倍以上にできないという制約がある
(2)フィーチャーグラフィック
JPEG、またはアルファチャンネルなしの24ビットPNG形式
サイズは1024×500px
最大ファイルサイズ 1024 KB

* iOS固有 (App Connectへの提出)
(1)スクリーンショット ... シミュレータを以下それぞれ起動してスクショ
iPhone 6.5インチ ... iPhone 13 Pro Max　※必須
iPhone 5.5インチ ... iPhone 8 Plus　※必須
iPad Pro 6th Generation (12.9インチ) ※iPadをリリース対象に含める場合必須
iPad Pro 2nd Generation (12.9インチ) ※iPadをリリース対象に含める場合必須
孫のOnDisableはDestroy直後に呼ばれない

ちょっと意外な挙動だったのでメモ。
次のようなGameObjectがあったとして…
![Screenshot 2023-01-13 at 19.11.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20094/f6413ab3-eff9-313f-8692-32227582ddc9.png)
親である`GameObject (0)`をDestroyすれば5つ全てのGameObjectで`OnDisable()`が呼ばれるが、`GameObject (0)`と`GameObject (1)`はDestroy直後に呼ばれるのに対し、`GameObject (2)`以下ではちょっと後になってから呼ばれる。

![Screenshot 2023-01-13 at 19.27.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20094/477c6b12-dc92-d37e-1334-ca13e511bc67.png)

```csharp
public class Main : MonoBehaviour
{
    public GameObject go;

    void Start()
    {
        Debug.Log($"{Time.realtimeSinceStartup}: ---- Before Destroy ----");
        Destroy(go);
        Debug.Log($"{Time.realtimeSinceStartup}: ---- After Destroy ----");
    }
}

public class OnDisableLogger : MonoBehaviour
{
    void OnDisable()
    {
        Debug.Log($"{Time.realtimeSinceStartup}: {name}.OnDisable");
    }
}
```

##### 環境
Unity 2021.3.16 LTS
Unity 2020.3.43 LTS
SonarLintからRSPEC-3305のご指摘受けたのですぐ対応しちゃいましょう

# SonarLintのエラー
業務でコーディングしていたら、SonarLintが下記のご指摘をしてくれました。
`Inject this field value directly into "sqlSessionFactory", the only method that uses it`

# エラー発生時のコード

一部抜粋です。

```java
@Autowired
private ApplicationContext context;

@Bean(name = "sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(
    @Qualifier("datasource") DataSource dataSource) throws Exception {
  SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
  sqlSessionFactoryBean.setDataSource(dataSource);
  sqlSessionFactoryBean.setMapperLocations(
    new PathMatchingResourcePatternResolver().getResources("./*.xml")
  );
  sqlSessionFactoryBean.setConfigLocation(
    context.getResource(
      Optional.ofNullable(
        context.getEnvironment().getProperty("mybatis.config-location")
      ).orElse(StringUtils.EMPTY)
    )
  );
  return sqlSessionFactoryBean.getObject();
}
```
# そもそもSonarLintとは？
SonarLintはSonarSource社が開発・運営する統合開発環境（IDE）向けの静的コード解析ツールです。
https://www.sonarsource.com/products/sonarqube/

SonerQubeを利用することで、おおよそ下記の観点でご自身のソースコード内を解析してくれて指摘してくれます。
- バグがないか
- 脆弱性を含むコードになっていないか
- 保守性を下げていないか
- 冗長でないか

# エラー発生の原因
これはSonarの下記ルールに抵触しているためでした。
https://rules.sonarsource.com/java/tag/spring/RSPEC-3305

>When @Autowired is used, dependencies need to be resolved when the class is instantiated, which may cause early initialization of beans or lead the context to look in places it shouldn’t to find the bean. To avoid this tricky issue and optimize the way the context loads, dependencies should be requested as late as possible. That means using parameter injection instead of field injection for dependencies that are only used in a single @Bean method.

直接原因は、**`@Autowired`でフィールド注入したクラスが、単一メソッド（今回だとsqlSessionFactory）でしか使われていない** ためです。

それが好ましくないのは以下の理由からです。
- `@Autowired`を使用すると、クラスのインスタンス化時に依存関係を解決する必要がある。
- Beanの早期初期化を引き起こしたり、Beanを見つけるためにコンテキストが本来探すべきでない場所まで探したりする可能性がある。
- コンテキストのロード方法を最適化するためには、依存関係はできるだけ遅く要求されるべき。

# 修正後のコード
あるフィールド注入したクラスが単一メソッドでしか利用されていない場合は、コンテキストのロード方法の最適化のために、`@Autowired`でフィールド注入するのではなく、メソッドの引数に設定するのが好ましいということですので、そのように修正しました。

```java
@Bean(name = "sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(
    @Qualifier("datasource") DataSource dataSource, ApplicationContext context) throws Exception {
    /** 以降は修正前と同一コードのため省略 */
}
```

以上です！
J2EE:160149 unresolved application library references defined in weblogic-application.xml: エラー

<h2>始めに</h2>

weblogic consoldeで、javaアプリケーションをリリースした際に以下のエラーが発生してインストールに失敗してしまった。
J2EE:160149・・・unresolved application library references defined in weblogic-application.xml:[Extension-Name: adf.oracle.domain, exact-match: false]

<h2>エラーへの考え方</h2>

エラー内容から見るとjavaアプリケーションのweblogic-application.xmlに定義されているライブラリとweblogic default ライブラリと合致しないと思い、以下のプロセスでアクセスした。
①アプリのweblogic-application.xmlにadf.oracle.domainが定義されているのか
　⇨OK
②weblogic consoleのデプロイメントでadf.oracle.domainライブラリがインストールされているのか
　⇨OK
③javaアプリケーションをインストールするターゲットサーバとadf.oracle.domainライブラリのターゲットサーバが一致するのか
　⇨流石にこっちがダメだったので、ターゲットサーバを一致させて再インストールしたら無事に成功した！
アウトプットにかけた時間＝経験値として、計測の準備をする

# 概要
アウトプット、インプットにかかった時間を測っておきませんか？という記事です。

- 形にならなくても、取り組んだ分は成長してると思うので、経験値と考えたい
- かけた時間＝経験値としてデータをとりたい
- タイムトラッキングツール「Toggle Track」を使うよ


# はじめに
昨年Webサイトを作ろうとして挫折しました。未完です。

得たものはたくさんありました。
WordPressについての知識とか、AWS LightSailを動かした経験とか。

なので、こう考えたい。
**時間を浪費したのではない、経験値が上がったんだ！**


そこで今年は、学習や個人的な開発にかけた時間＝「**経験値**」として扱い、
１年分のデータを蓄積しようと思います。


# 方法


## １．使用ツール

Toggle Track というアプリを使います。ストップウォッチみたいなものです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641841/49e67c6a-9701-e22a-3181-6da97cc28f49.png" width="50%">

・計測する項目を階層に分けられること
・日を跨いでもデータを保持できること
・レポート化してくれる

というメリットでこれを選びました。
スマホとPCにインストールし、作業時にポチっとします。


### 参考記事
「サボり」を見える化できる時間管理ツール「Toggl Track（旧Toggl）」の使い方
https://tcd-theme.com/2020/10/about-toggl.html


### 余談
アプリケーションごとに使用時間を計測できるものもありますよね。
検討しましたが、複数の目的で使ってることが多く、内訳を取りにくいので諦めています。

例）AWSの開発、Qiitaの記事執筆、調べ物にChromeを使うので、Chromeの使用時間だけあっても何に使った時間か判断できない





## ２．項目の準備
年末に「目標ごと」、「インプット/アウトプット」という軸で分析したいので、
それに沿って項目を整理します。

### 目標の洗い出し

まずは今年の目標を洗い出します。ついでに項目名も考えておきます。

|目標|項目名|
|:--:|:--:|
|Webサイトを作る|Webサイト制作|
|自分の歩数と気温の関係をBIで分析する|分析|
|SIGNATEのコンペに参加する|SIGNATE|
|Qiitaいっぱい書く|Qiita関連|

### 項目を立てる
それぞれをプロジェクトとして設定します。
その下に、アウトプット、インプットという項目を立てます。

こんな感じ。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641841/9fd52f04-4677-dbec-967a-2d2f06b0ba62.png" width="80%">

インプットには『インプット』、アウトプットには『アウトプット』のタグをつけました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641841/d951eb14-f38c-7045-df46-d0773223df61.png" width="80%">

こうしておけば、プロジェクトをまたいで「インプット」「アウトプット」にかけた時間を集計できる気がする（うまくいくかは不明）

もっと細かく分けてもいいですが、使い分けが面倒くさそうだったので、ざっくりにしました。


### インプットとアウトプットを分ける理由
わざわざインプットとアウトプットを分けたのは、
「モノは完成しなかったけど手を動かした時間」と、
「知識習得にかかった時間」を分けて理解したいからです。

どちらも大事だけど、どちらかに偏りたくないので、分けることにしました。


## ３．インプットとアウトプットの定義
ここで、ざっくりとインプットとアウトプットを定義しておきます。
これがブレると何を測っているか分からなくなるので。


#### インプット：情報を「入れる」こと
→読書、検索、技術記事などWebサイト閲覧、動画視聴

#### アウトプット：考えや情報を「出す」こと
→記事の下書き、コンソールやアプリケーションの操作、サイト構成の検討

#### 微妙なラインのもの
- **サイト構成の検討**
微妙ですが、アウトプットに付随する作業として、今回はアウトプットに含めます。

- **ぼやっと考えること**
あの機能をこうしようとか、お風呂でぼやっと考えることがあります。
どちらかと言うと「夢を膨らませる」に近いので、こちらは除外とします。


## 現在の状況
<img src="
https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641841/118c6d6e-c7c4-d7d2-efb5-a4bd7bf5e4f4.png" width="80%">

この記事に使った時間のみ！まだまだこれからですね。


# 副次的な効果
- やってない目標の存在を思い出します。そっと放たれるプレッシャー。
- ちゃんとしたもの作ろうと思うと、尻込みしてやらないです。が、経験値増えると思うと少しやる気が出ます。


# おわりに
うまくいかなくても、やった分だけ前に進むと信じたいです。
よければ一緒に、経験値ためていきましょう！
mysqlclientのimportエラー(import MySQLdb, ImportError)

mysqlclientで以下のエラーが発生しました。


（開発環境）
macOS Big Sur (M1)
python 3.8.5
mysqlclient 2.1.1

```python:main.py
import MySQLdb
```
```terminal
Traceback (most recent call last):
  File "main.py", line 12, in <module>
    import MySQLdb 
  File "/Users/foo/opt/anaconda3/lib/python3.8/site-packages/MySQLdb/__init__.py", line 18, in <module>
    from . import _mysql
ImportError: dlopen(/Users/foo/opt/anaconda3/lib/python3.8/site-packages/MySQLdb/_mysql.cpython-38-darwin.so, 2): Symbol not found: _mysql_affected_rows
  Referenced from: /Users/foo/opt/anaconda3/lib/python3.8/site-packages/MySQLdb/_mysql.cpython-38-darwin.so
  Expected in: flat namespace
 in /Users/foo/opt/anaconda3/lib/python3.8/site-packages/MySQLdb/_mysql.cpython-38-darwin.so
```

・解決法
pythonのバージョンを3.8⇨3.10に上げたところ、エラーが解消しました。
下のGithubのイシューでも議論されていましたので参考にしてください。
https://github.com/PyMySQL/mysqlclient/issues/496
SQL ServerとSynapase Analytics 専用SQLプールのIDENTITY列の比較

# 概要
IDENTITYは自動で連番を採番し、レコードを管理する場合などで利用するカラム属性です。
設定した値に応じて、データがInsertされると番号が自動採番されます。
データウェアハウスシステムではサロゲートキーとして、テーブル内の行を一意に識別するために重複の無い識別子が必要となる場合が多く、このサロゲートキーとしてIDENTITYを使うことが多いです。

# 構文
**IDENTITY(<最初の値>,<増分値>)**

具体的には以下のような形で`CREATE TABLE`の際に指定します。

```SQL:専用SQLプールでの作成例
CREATE TABLE dbo.T1
(    C1 INT IDENTITY(1,1) NOT NULL
,    C2 INT NULL
)
WITH
(   DISTRIBUTION = HASH(C2)
,   CLUSTERED COLUMNSTORE INDEX
)
;
```

# SQL Serverと専用SQLプールのIDENTITY列の違い
SQL ServerとAzure Syanaps Analytics 専用SQLプールのIDENTITY列の主な違いは以下の通りです。
| 項目 | SQL Server | 専用SQLプール |
| :-- | :-: | :-: |
| 一意な行の為の識別子としての利用 | 〇 | 〇 |
| 値の並び順 | シーケンシャル | ランダム※1 |
| サポートされるデータ型 | Decimal, Int, Numeric,<br>Smallint, Bigint, Tinyint | Int, BigInt |
| テーブル毎のIDENTITY列の最大数 | 1 | 1 |
| `@@IDENTITY`システム関数のサポート※2 | はい | いいえ |

上記の通りIDENTITY列はSQL ServerとAzure Syanaps Analytics 専用SQLプールの間で違いが存在しています。

## ※1 専用SQLプールでは採番の順序がランダム？
実際にはランダムではありません。Azure Syanaps Analytics 専用プールには60のディスク（ディストリビューション）が存在していますので、それぞれのディストリビューションにおいて値の重複が無いように値が採番されます。

例えば以下のテーブルとSQLを実行します。
```SQL
CREATE TABLE dbo.T1
(   
    C1 INT IDENTITY(1,1)    NOT NULL,
    C2 VARCHAR(30)              NULL
)
WITH
(   DISTRIBUTION = HASH(C2),
    CLUSTERED COLUMNSTORE INDEX
);
INSERT INTO dbo.T1 VALUES (NULL);
INSERT INTO dbo.T1 VALUES (NULL);
```
上記の場合にはC1には`1`と`61`と言うデータがInsertされているのが確認できると思います。一見、増分値を`1`で指定しているので不具合のようにも見えますが、これは仕様です。この仕様の為にあたかも値がランダムで採番されているように錯覚しますが厳密にはランダムではありません。

## ※2`@@IDENTITY`システム関数のサポート
`@@IDENTITY`は現在のセッションで最後に挿入されたIDENTITY列の値を返すシステム関数ですが、これはSynapase Analytics 専用SQLプールでは利用することが出来ません。

その他にもIDENTITY列に関する以下の関数が専用SQLプールではサポートされていません。

`IDENTITY()`
`@@IDENTITY`
`SCOPE_IDENTITY`
`IDENT_CURRENT`
`IDENT_INCR`
`IDENT_SEED`

## その他制限事項
その他にも専用SQLプールでは以下のIDENTITYの利用に以下の制限事項があります。
* IDENTITY列はディストリビューションキーには使えない。
* テーブルが外部テーブルである場合は使えない。
コマンドライン引数とは

### 目次
[1. はじめに](https://qiita.com/uzo/items/a0baabfc612a79ff5c4f#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB "1. はじめに")
[2. 用語解説](https://qiita.com/uzo/items/a0baabfc612a79ff5c4f#%E7%94%A8%E8%AA%9E%E8%A7%A3%E8%AA%AC "2. 用語解説")
[3. おまけ](https://qiita.com/uzo/items/a0baabfc612a79ff5c4f#%E3%81%8A%E3%81%BE%E3%81%91 "3. おまけ")

## 1. はじめに

僕と同じC言語初学者で「コマンドライン引数」という言葉をはじめて見た/聞いたという人のために, コマンドライン, 引数, コマンドライン引数とは何か, 今の自分の理解を書いてみます. 

僕の作業環境はMacでVSコードをメインに使っています. 
たまに書いたコードのチェックなどでTerminalかiTermを使います.

コーディングが初めてでマックユーザーの方は, まず

    「アプリケーション」->「ユーティリティ」->「ターミナル」

を開いてみてください.
VSコードはこちら

https://www602.math.ryukoku.ac.jp/Prog1/vscode-mac.html

## 2. 用語解説

#### 2.1. [引数 ひきすう (argument: アーギュメント)]
関数に渡して, プログラムの結果に影響を及ぼすように作用する数 (文字列も含む. 人間が画面を見た時に'A''+'などの文字として表示されているものも, コンピューターにとってはすべて数). 例えば 
```
  y = F(x, z) 
```
という関数があるとき, xとzが関数F()にとっての引数. 
yは関数処理の結果の値. 

「__イチゴ (x)__ と __バナナ (z)__ を __ミキサー (F)__ にかけて __いちごバナナスムージー (y)__ を作る」

みたいな感じです。

https://www.designlearn.co.jp/smoothie/smoothie-article05/

以下のwrite()関数のばあい, '1', "12345", '5'の３つが引数です.

```c
    write(1, "12345", 5);
```

#### 2.2. [コマンドライン (command line)]

ターミナル(Terminal)上でコマンドを入力できる行. 
MacでVSコードやTerminalなどを使っている場合は, "ユーザー名 + %"と表示されている後になんらかの文字を入力します↓
```
 user %
```
#### 2.3. [コマンドライン引数 (command line argument)]

コマンドラインに入力された引数 (argument). "gcc"や"touch", "ls"などのコマンド, それに付け加えられたフラグやオプション（"-Wall", "-r", "-l"ほか）や操作するファイル名, ディレクトリ名など, コマンドラインに入力したすべての値を指すようです.

```
    user % gcc test.c -o test
```
↑ '%' の後にあるものすべてコマンドライン引数

### 3. おまけ

C言語のメイン関数へのコマンドライン引数 argc, argv について興味ある方はよかったらこちらをご覧ください。

https://qiita.com/uzo/items/c26d1f82635329db4ade