OmniAICreator/Qiita-1.07M huggingface dataset:
【MySQL】dumpコマンドでデータベースのバックアップを作成して復旧までしてみる

本番環境や開発環境のDBに対して何か作業をするときは必ずバックアップを取って作業するのが基本(というか絶対)だと思いますが、その時に用いるdumpコマンドについて簡単に紹介します。
## やること
① MySQLのDBサーバーにあるテーブルのバックアップを作成する(dumpする)
② バックアップをテーブルに反映させる(restoreする)

## 実際にやってみる
### ①テーブルのバックアップを作成する(dumpする)
```
$ mysqldump -h ホスト名 -u ユーザー名 -p データベース名 > xxx.sql
```
これで`xxx.sql`というバックアップファイルが現在のディレクトリに保存されます。
(`-p`はパスワードを指定して認証するという意味です)

なお上記のコマンドの場合はデータベース全体がバックアップされます。

一方でテーブルを指定する場合は、

```
$ mysqldump -h ホスト名 -u ユーザー名 -p データベース名 テーブル名1 テーブル名2 > xxx.sql
```
とすれば指定したテーブルのみバックアップを作成することができます。

その他、オプションはたくさんあるのでデータが大きい時などは必要に応じて参照されたく思います。

https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html

### ②バックアップをテーブルに反映させる(restoreする)
dumpしたsqlファイルをデータベースに反映させるときは、

```
$ mysql -h ホスト名 -u ユーザー名 -p データベース名 < xxx.sql
```
とすることで先ほどの`xxx.sql`というバックアップファイルがデータベースに反映されます。
これにより、「テーブルやカラムを誤って削除してしまった..」というときに、バックアップ時の状態に復旧することができます。


が、テーブル同士で外部キー制約が設定されている場合、export時の順番や各テーブルを構築する順番によっては「そんなテーブルのカラムはないよ」といったエラーが発生する場合があるかと思います。

### ※外部キー制約を一時的に無効にしておく
この外部キー制約によるエラーを解消するには、バックアップしたsqlファイルを編集しても良いですが..外部キー制約の設定を一時的に無効にすると楽です。

データベースにアクセスした状態で、

```
mysql> SET FOREIGN_KEY_CHECKS=0;
```

で外部キー制約をいったん無効にして、この状態で先ほどのrestoreの作業を行うとエラーにならずに実行することができるはずです。

作業が完了したら、

```
mysql> SET FOREIGN_KEY_CHECKS=1;
```

で戻すことも忘れずに。

繰り返しになってしまいますがdump, restoreコマンドの各種オプションなどは種類が多いのと、本番環境やステージ環境のDBに対する操作の場合は特に、公式マニュアルを参照されたく思います。

https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html

以上、最後までお読みいただきありがとうございました〜。
PHPの変数をJavaScriptに渡す方法(Laravel)

プログラミング初心者です

同じblade上でPHPとJavaScriptを使いたい状況です
##①PHPを定義

```blade.php
<?php
 $a = 'あいうえお';
?>
```
@php使ってもいいみたいなんですが、私は反応しませんでした
##②scriptタグの中で

```blade.php
<script>
  a_js: '{{ $a }}'
 
 or

  a_js: @json($a) 
</script>
```
どちらかを使います
@json()は配列や連想配列の時に使うと書いてありましたが、配列じゃなくても私は使えました

＊JSはまだよくわかってなくて文法間違っていたらすみません
【オブジェクト指向 / ざっくり】カプセル化とは？

##どんな記事？
* 新人エンジニアのサクッとアウトプット記事
* 具体的な内容(コード)というよりは"ざっくり"理解するのが目的

##オブジェクト指向とは
閲覧されている方は既知の内容だとは思いますが一応おさらい

* プログラミングにオブジェクトという概念を持ち込んだ考え方。
* オブジェクトは一般的にクラスで定義。
* クラス内でそのオブジェクト関する変数やメソッドを定義する。
* オブジェクト同士の相互作用でシステムが成り立っているという考え方

## カプセル化とは
* オブジェクトの具体的なデータ構造や機能などを隠蔽すること
* オブジェクト内のフィールドとメソッドはクラス外から干渉されないように保護したい
* privateやprotectedアクセス修飾子を用いて不要な情報にアクセスできなくする

### アクセス修飾子
```php
class Sample{
  public $pub;
  private $pri;
  protected $pro;
}
```
* その変数・メソッドがどこからアクセスできるかを記述する修飾子
* 変数やメソッド定義時に記述するとアクセス権を付けることができる
* public private protectedの3種類あり、それぞれ以下からアクセスできる

|  アクセス修飾子  |  アクセスできる範囲  |
| ---- | ---- |
|  public  | クラス内外構わずアクセス可能  |
|  private  |  クラス内ならアクセス可能  |
|  protected  |  クラス内と継承先の子クラスからアクセス可能  |

###使い道...Getter Setter
* カプセル化の概念(内部のデータは隠蔽したい)
* クラス外からアクセスできないようにしたい→privateを使う
* インスタンスに値を入れたり取得したりする→getterとsetterで間接的に取得

```php
Class Sample{
 private $name;

 public getName(){
  return $this->name;
 }
 public setName($inputName){
  $this->name = $inputName;
 }
}
```
WordPressのカスタム投稿タイプの2ページ目が404になる

# はじめに
なんかWordPressで2ページ目が404になる現象ってよくあって、検索すれば大量に記事が出てきますね。
しかしどれもピンとこず、しかも解決できない...
と思っていたところに、いい解決策に出会ったので、ご紹介します。でも元記事は忘れましたごめんなさい。

今回は、カスタム投稿を取得するときに`posts_per_page`を指定してハマったんですよね。
この対応方法は、標準の投稿も使うし、カスタム投稿タイプも複数使うし、かつ、それぞれ1ページに表示する件数が違うという場合に使えます！
というか、そういう場合にハマります！
（1ページに表示する件数とは、管理画面 > 設定 > 表示設定 > 1ページに表示する最大投稿数のことです）

簡単にいうと、`pre_get_posts`を使います。
ではさっそく見ていきましょう！
（なお、プログラムは記事用に書き換えて動作確認してませんので...）

# プログラムです！
## functions.php

```php
<?php
//カスタム投稿タイプのページネーションの件数を設定する（定数にしておくことをおすすめします）
const CUSTOM_POSTS_PER_PAGE = 8;

function change_posts_per_page($query) {
    if ( is_admin() || !$query->is_main_query() ) {
        return;
    }

    //カスタム投稿タイプの一覧、カスタムタクソノミーなどposts_per_pageを書き換える条件を書きます
    if ( $query->is_archive( 'works' ) || is_tax('works_category') || is_tax('works_tag')) {
        $query->set( 'posts_per_page', CUSTOM_POSTS_PER_PAGE );
    }
}
add_action( 'pre_get_posts', 'change_posts_per_page' );

```
## archive-works.php
アーカイブページなので、本来であれば、`while ( have_posts() ) : the_post();`な感じで取得できるのですが、今回は他に検索条件を追加するという要件があったので、`new WP_Query()`を使用しております。


```php
//現在のページ番号を取得
$paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;

$args = [
    'post_type' => 'works',
    'posts_per_page' => CUSTOM_POSTS_PER_PAGE,
    'paged' => $paged,
];

$the_query = new WP_Query( $args );

while($the_query->have_posts() ): $the_query->the_post();
    //ループの中身
endwhile; wp_reset_postdata();

//ページネーション
$pagenateArgs = [
    'total' => $the_query->max_num_pages,
];
echo paginate_links($pagenateArgs);

```

# 最後に
WordPress歴も長くなってくると、ページャーも余裕だわと思っていたら、ハマるときもありますね。
プラグインなんか使わなくても...と思いますが、プログラムに詳しい人がいないと使わざるを得ないときもあるんかな...

[関数リファレンス/paginate links](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/paginate_links)
Macでコマンド実行が終わったら教えてほしい時、あるいはCLI上でリマインドをセットしたい時のTips

# このTipsの利用シーン
※Mac前提です

- CLIでビルドしているがビルド時間が数十分かかって待ち時間がムダ。ただ、ビルドが終わったらすぐに気付きたい
- CLI上で3分、10分とかのリマインドをしたい

# 動作環境

macOS Big Sur(11.2.3)

# AppleScriptを使えば通知できます

AppleScriptを使えばMac上で通知を表示させることができます。
また、AppleScriptを呼び出すためのosascriptが用意されているので、そちらを使えばCLI上から通知を表示させることができます。

# やり方

## 通知用の関数を用意する

`.bashrc` や `.zshrc` に関数を追加します。
(ここでは.bashrcのケースで記載しています)

.bashrcを開いて、

```bash
vi ~/.bashrc
```

↓の関数を追記して、

```bash:~/.bashrc
function remind() { # 関数名は好きにいじってください
  description="通知です" # デフォルトの文字は好きにいじってください
  if [ $# != 0 ]; then
    description=$1
  fi
  command /usr/bin/osascript -e "display notification \"$description\" with title \"Remind🔥\"" # タイトルも好きにいじってください
}
```

反映する

```bash
source ~/.bashrc
```

### 2022/11/11追記

[こちら](http://tonbi.jp/AppleScript/Dictionary/OSAX/Command/displayNotification.html)にある通りsound nameを設定することで通知音も付け加えることができます。

```:例
command /usr/bin/osascript -e "display notification \"$description\" with title \"Remind🔥\" sound name \"Blow\""
```

## あとは呼び出すだけ

作成した関数を呼び出すだけです。
※関数名を変更した場合はこちらも適宜読み替えてください

```bash
# デフォルト通知
remind
# 任意のメッセージを表示
remind 任意のメッセージ
```

無事通知されましたね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173370/34eb04f2-e713-7b6a-7575-a91534d11a9a.png)

## 利用シーン

### 実行時間の長いシェルの完了を通知させたい時

shellの後にremindをつけるだけ

```bash
sh 実行時間の長いシェル.sh; remind Shellの実行が完了しました
```

### カップラーメンを待ちたい時

sleepの後にremindをつけるだけ

```bash
sleep 180; remind 時間だよ
```

# 参考にさせて頂いた記事

ムダな時間を減らして頂きありがとうございます:bow:

https://qiita.com/uqichi/items/180d9a5ad661268e0007

https://pando.life/qwintet/article/879
VScode ターミナルの上下幅を変更するショートカット 個人メモ 

# 目的

- VScodeのターミナルの上下の幅を変更するショートカットをメモ的にまとめる

# 情報

- 筆者のPCはMacである。Windowsとはキーボードのキーやショートカットが異なる。

# 方法

- `command` + `control` + `↑` or `↓`
「CUI」と「GUI」 の違い

・CUI （Character based User Interface）(キャラクタユーザインターフェース)
コンピュータやソフトウェアが利用者に情報を提示したり操作を受け付けたりする方法。
すべてのやり取りを文字によって行う方式。

CUIの例
・コマンドプロンプト(Windows)
・ターミナル(MAC)
など、コマンド(文字)を入力してコンピュータを動かす。



・GUI（Graphical User Interface）(グラフィカル・ユーザ・インターフェース)
グラフィックベースの操作体系を持つUI（User Interface）のこと。情報の表示にグラフィックを多用しており、命令文を入力して実行する方式(CUI)に比べ、直感的に操作することが可能です。
GUIの例
・マウス
・キーボード
など、人が直感的に使用することができる。



・UI（User Interface）(ユーザ・インターフェース)
ユーザー(人)と製品やサービス(pc)とのインターフェース（接点）のことを意味する。
マルチディスプレイの表示方法を変更する

##やりたいこと
サブモニタの電源を入れたり切ったりしたい。
接続されているモニタをすべて入れたり切ったりすることはできたけど
片方だけを入れたり切ったりすることができなかった。

##解決方法
マルチディスプレイの表示方法で「1のみに表示する」と設定することでサブモニタを真っ暗にすることができた。やりたかったことは叶ったのでこれで。

##コーディング

```:C#
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern UInt32 SetDisplayConfig(
    UInt32 numPathArrayElements, 
    IntPtr pathArray, 
    UInt32 numModeInfoArrayElements, 
    IntPtr modeInfoArray, 
    UInt32 flags
);

/// <summary>
/// サブモニタを非表示にする。
/// </summary>
public void SetDisplayModeToInternal()
{
    SetDisplayConfig(0, IntPtr.Zero, 0, IntPtr.Zero, 0x00000001 | 0x00000080);
}

/// <summary>
/// サブモニタにメインモニタと同じ内容を表示する。
/// </summary>
public void SetDisplayModeToClone()
{
    SetDisplayConfig(0, IntPtr.Zero, 0, IntPtr.Zero, 0x00000002 | 0x00000080);
}
```

引数はこの辺り参考に
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setdisplayconfig
【HTML＆CSS】擬似クラス::after ::beforeについてまとめてみた

#対象者

・CSSで擬似クラスを使ってｈｔｍｌを整えようとしている方

#手順目次
1.擬似クラスとは

2.：：afterの実例



#実際の手順と実例
###1.擬似クラスとは

擬似クラスとは、セレクタの後に付け加えて、指定するスタイルを適用する状態を決めるものです。
今回はその中でも::afterに関して触れています。

###2.：：afterの実例

* 後ろの文章のCSSを変える！
* 文を記号ではさむ
  
たとえば、class="example"の要素の前後にカゴカッコ『』をつけるように指定してみましょう。

HTML

  `````  
    <p class="example">これは例文です</p>
    .example:before{
      content: '『';
      color: skyblue;/*色を変える*/
    }
  ```````

CSS

`````
    .example:after{
      content: '』';   /*変更したいCSSをシングルクォーテーション内に入力*/
      color: skyblue;/*色を変える*/
    }
 ```````   
    
完成！

![bdrda-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1681213/74d3e64c-24b9-dc35-ae67-a6411bfdd3e3.png)

記号とかのCSS整えるときに活躍します！
[JavaScript+ひらがな変換API]おいんえんあんい 母音変換機

[本記事は、自分サイトのこの記事と同一内容です。](https://hagiayato.github.io/my-site/jekyll/update/2021/07/01/VowelJP.html)
# はじめに
[実行環境・動作確認はこちら](https://hagiayato.github.io/VowelJP/)
このwebアプリケーションは、日本語の単語・文から母音のみを抜き出す母音変換を行うものです。
単語・文の母音を確認したいとき、母音法による発声練習、クイズなど色々な用途で使用できます。

## 母音について
言葉の発音にある、長く音を発する部分。
"か"であれば、"か"の発音の後半は"あ"となるので"あ"が母音となる。
日本語においては、ローマ字としたときの最後のアルファベットで判別可能。
例："か"⇒"ka"⇒"a"⇒母音は"あ"

## 母音法について
日本にある某大規模劇団で行われている発声方法。
台詞・歌詞を母音のみ抜き出した状態で発声練習を行うことで、相手が聞き取りやすいはっきりとした発音を習得できる。
あなたも母音法を行えば、相手が聞き取りやすい発音を手に入れられるかも?

# 説明
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655112/0dfd1470-903e-1197-734e-6dc656558fdb.png)

[実行環境・動作確認はこちら](https://hagiayato.github.io/VowelJP/)

- 好きな言葉を入力して、"母音変換"ボタンを押すと母音だけに変換されるよ!
- ひらがな・カタカナ以外の文字の母音読み仮名変換にも対応したよ!
- 母音から元の単語・文への逆変換は、母音の性質上できないよ

# 動作原理
このwebアプリケーションは、下記の流れで母音変換を行います。

1. 元の単語・文を平仮名に変換　※ひらがな化API(goo)を使用
1. 平仮名を母音に変換

このため、ひらがな化API(goo)で平仮名にできる単語・文は全部母音変換が可能です。
※詳細は、リンクの実装参考を参照

# リンク
### 実装参考
- [カタカナから母音のカナに変換する【python】](https://qiita.com/shimajiroxyz/items/6755b211a42b519eb224)
- [ひらがな化API(goo)](https://labs.goo.ne.jp/api/jp/hiragana-translation/)

### えいあうああんえい-製作者関係
- [製作者のサイト "HA Works"](https://hagiayato.github.io/my-site/)
- [このwebアプリのソースコード(github)](https://github.com/HagiAyato/HagiAyato.github.io/tree/master/MySearch)

# 以下、この記事を母音変換したもの

# あいえい
[いっおうあんおう・おうああういんあおいあ](https://hagiayato.github.io/VowelJP/)
おおうえうあういええおんあ、いおんおおあんお・うんああおいんおいおういあうおいんえんあんおおおあう おおえう。
あんお・うんおおいんおあういんいあいおい、おいんおういおうあっえいえんうう、ういうあおいおいおあおうおえいおうえいあう。

## おいんいういえ
おおあおあうおんいあう、ああうおおおあっううううん。
"あ"えあえあ、"あ"おあうおんおおうあんあ"あ"お あうおえ"あ"あおいんおあう。
いおんおいおいえあ、おおあいおいあおいおあいおおあううあえっおえあんえうあおう。
えい："あ"⇒"あ"⇒"ええ"⇒おいんあ"あ"

## おいんおういういえ
いおんいあうおうあいいおえいあんえおおああええいうあっえいおうおう。
えいう・あいおおいんおいういあいあおうあいえあっえいえんううお おおあうおおえ、あいえあいいおいあうい あっいいおいああうおんおううおうえいう。
あああおおいんおうおおおあえあ、あいえあいいおいあういあうおんおえいあいえあえうあお?

# えうえい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655112/0dfd1470-903e-1197-734e-6dc656558fdb.png)

[いっおうあんおう・おうああういんあおいあ](https://hagiayato.github.io/VowelJP/)

- ういあおおあおいういういえ、"おいんえんあん"おあんおおうおおいんあえいえんあんあえうお!
- 【おいあえ】いあああ・ああああいあいおおいおおいんおいああえんあんいお あいおういあお!
- おいんああおおおあんお・うんえお あうえんあんあ、おいんおえいいうおうえいあいお

# おうあえんい
おお うえうあういええおんあ、あいおああええおいんえんあんおおおあいあう。

1. おおおあんお・うんおいあああいえんあん  ※いああああええいいあい(うう)おいおう
1. いあああおおいんいえんあん

おお あえ、いああああええいいあい (うう)えいあああいえいうあんお・うんあえんうおいんえんあんああおうえう。
※おうあいあ、いんうおいっおうあんおうおあんおう

# いんう
### いっおうあんおう
- [ああああああおいんおああいえんあんうう【あいおん】](https://qiita.com/shimajiroxyz/items/6755b211a42b519eb224)
- [いああああええいいあい (うう)](https://labs.goo.ne.jp/api/jp/hiragana-translation/)

### えいあうああんえい
- [えいあうあおあいお "えいいええああうう"](https://hagiayato.github.io/my-site/)
- [おおうえうあういおおおうおおお(いっおあう)](https://github.com/HagiAyato/HagiAyato.github.io/tree/master/MySearch)
ダイジェスト認証　 #1 Apache設定～動作確認

「CTFの練習問題」的な文脈で「ダイジェスト認証」に触れる機会がありました。復習兼ね関連する要素（Webサーバ側設定／サーバ・クライアント挙動／ローカルプロキシツール・・・）について確認・検証をしたいと思います。

# Apacheでの設定
Docker、わかっているかわかっていないかでいえば、わかっていないですがとりあえずイメージを落として起動してみたところ、2.4.46というバージョンでした。

## httpd.conf
「auth_digest_module」というものが必要とのこと、デフォルトコメントですのでコメント外して有効化しました。
また、この後.htaccessでディレクトリに対してダイジェスト認証設定をするため、ドキュメントルートは以下を「AllowOverride All」としています。

## htdigest
ダイジェスト認証用のユーザを作成するコマンドです。

```
# htdigest
Usage: htdigest [-c] passwordfile realm username
The -c flag create a new file.
```

とのことですので

```
# htdigest -c ../conf/passwords digest digest_user
Adding password for digest_user in realm digest.
New password:
Re-type new password:
```

ここでパスワードを「password」とした場合、生成されるpasswordsファイルには以下の1行が登録されます。

```
digest_user:digest:46328f2142603a1d167a1a19de5210bf
```

「:」区切りの3つ目の要素が後述のHA1となりますが、これは以下のコマンドで取得できるハッシュ値と一致します。

```
$ echo -n "digest_user:digest:password" | md5sum
46328f2142603a1d167a1a19de5210bf
```

## ダイジェスト認証を要求するディレクトリの設定
htdocs/digest ディレクトリをダイジェスト認証必要と位置付け、.htaccessでダイジェスト認証の設定を行いました。

```
AuthType Digest
AuthName "digest"
AuthUserFile /path_to_passwords_file/passwords
Require valid-user
```

# 動作確認
当該パスをリクエストすると、以下がレスポンスされ
![digest01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168717/36e3daf3-5c7d-42c7-2d98-a4efa34fef2a.jpeg)
ブラウザ側では例のユーザ・パスワードを求めるダイアログが表示されます。
![digest02.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168717/30a47224-c7bb-cad3-c9b9-fe2e9b957491.jpeg)
上記で登録したユーザ・パスワードを入力して「ログイン」を押下すると、以下がリクエストされ、接続許可（200 OK）されました。
![digest03.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168717/8c86a105-8b95-94fa-a7b1-c18f73257af7.jpeg)
response="XXX" の部分がサーバ側から与えられたnonce等の値と、ブラウザでユーザにより入力されたユーザ、パスワード等から生成された値であり、サーバ側でも同じ情報・アルゴリズムで生成して値を比較、認証OK/NGを返すという流れと理解。

[続編](https://qiita.com/sgtrducky/items/38cd5aa47dec743b2358)にてこのresponse="XXX"の算出手順を検証・確認します。

2021年06月30日　初版
WindowsでBluetoothのオンオフをショートカットする（AutoHotkey）

アクションセンターを開き、下のタイルで 右クリック > 編集
Bluetoothを左上に配置する。
AutoHotkeyファイルで次の関数を適当なホットキーに割り当てる。
（タスクバーにBluetoothアイコンをおいておくとオンオフの状態がわかる）

```ahk
switchBluetooth(){
    Send, #a
    Sleep, 300
    Send, +{tab}
    Sleep, 100
    Send, {space}
    Sleep, 100
    Send, #a
}

#b::switchBluetooth()
```
Railsコンソール上からクリップボードにコピーしたい

`IO.popen('pbcopy', 'w')` で出来ます。

以下、usersテーブルへのSQLをサクッとコピーする例。

```rb
pry(main)> IO.popen('pbcopy', 'w') { |f| f << User.where(name: ['hoge', 'fuga']).to_sql }
```

これで↓をコピーできてる。

```sql
SELECT `users`.* FROM `users` WHERE `users`.`name` IN ('hoge', 'fuga')
```

## 参考

https://docs.ruby-lang.org/ja/latest/method/IO/s/popen.html
Juniper機器の実務でよく使うコマンド

確認コンフィグ
show configuration | display set | no-more
show system uptime | no-more
show version | no-more
show chassis hardware | no-more
show configuration | no-more
show interfaces | no-more
show interfaces terse | no-more
show arp | no-more
show ospf neighbor | no-more
show bgp neighbor | no-more
show route protocol ospf | no-more
show route protocol static | no-more
show bgp summary | no-more
show system alarms | no-more
show system boot-messages | no-more
show log messages | no-more
show ntp status | no-more
show chassis routing-engine | no-more



疎通を確認する。
ping xxx.xxx.xxx.xxx rapid count 100


作業の流れ

コンフィグモードに入る
config

現在のコンフィグと比較
show | compare

コンフィグの流し込み
load set terminal

設定投入

保存確認
commit check

保存
commit

現在のコンフィグと比較
show | compare

設定復旧
rollback 0
All About ACS: DnD で IME が動作しなくなる Java のバグ

# DnD で IME が動作しなくなる Java のバグ

以前「[Java 8u281/282 の場合エクスプローラーからのドラッグで ACS がハング (たぶん 11.0.10, 15.0.2, 16 でも)](https://qiita.com/6onoda/items/9e8d1c3c3e2bd0c8707a)」という Java のバグを紹介しましたが、それ以外にも「DnD 操作で IME が動作しなくなる」バグがJavaで報告されています。

* [Windows IME was disabled after DnD operation](https://bugs.openjdk.java.net/browse/JDK-8261231) 

ACS を使っていて IME が動作しなくなるようなことがあれば、Java を変えてみてください。

## 対象/修正バージョン
この記事によれば、対象を修正バージョンは、このようになっています。

**影響を受けるバージョン**

* 8u281
* 11.0.10
* 11.0.10-oracle
* 15.0.2
* 16
* 17

**修正されたバージョン**

* JDK-8262243	16.0.2ｰb01
* JDK-8264724	15.0.4-b01
* JDK-8262112	11.0.11-b04
* JDK-8262325	openjdk8u292-b05

Java のバグは Java の提供元に、ご相談してください。

***

2021-06-30 作成

***
「All About ACS」では IBM i に対する新しいクライアント「IBM i Access Client Solutions」の情報をいろいろ提供していきます。
[記事一覧はこちら](http://qiita.com/6onoda/items/2dc925586d8d3b8644f2)で確認いたけます。

許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。
***
AWSのEC2をGUIで操作できるようにする

#はじめに
大学の講義や個人の開発でAWSを交えて開発を行なったりと、これからAWSを用いて開発を行なっていきたいとなったとき、CUIもそれなりに使えるがやはりGUIに慣れている人の方が多いし、自分も割とGUIを使いたいときがちょくちょく出てくるので、EC2でGUIを使えるようにしたいと思った。

#導入
## まずEC2の設定から
SSHを利用してコマンドプロンプト,ターミナル等からEC2に接続する。
### MATEデスクトップ環境を入れる、設定
```
sudo amazon-linux-extras install mate-desktop1.x
```
途中でyes or no　を聞かれるのでyesで。そしたらmateが入る。
次にデスクトップにMATEを設定する。

```
sudo bash -c 'echo PREFERRED=/usr/bin/mate-session > /etc/sysconfig/desktop'　#全てのユーザへの適用
```

```
echo "/usr/bin/mate-session" > ~/.Xclients && chmod +x ~/.Xclients #現在のユーザのみの設定
```

### TigerVNCの導入、設定
```
sudo yum install tigervnc-server
```
これでtigervncを導入できる。
次にvncのパスワードを設定する必要がある。

```
vncpasswd
```
ここで自分の好みのパスワードを設定する。途中で表示専用のパスワードを入力するかどうかを確認するメッセージが表示されたら、「n」で。

```
vncserver :1
```
上のコマンドで１回のみの起動。再起動が入った場合はvncserverが立たないので、また立てる必要がある。
僕の場合は何回も使いたいと考えていてわざわざ起動するのが面倒なので毎回起動されるように設定する。

新しいsystemdユニットの作成を行う。

```
sudo cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@.service
```
sedコマンドで新しいユニットのすべての USER を ec2-user に置き換える。

```
sudo sed -i 's/<USER>/ec2-user/' /etc/systemd/system/vncserver@.service
```
systemdマネージャの設定を再ロードする。

```
sudo systemctl daemon-reload
```
サービスを有効にする

```
sudo systemctl enable vncserver@:1
```
サービスを起動する

```
sudo systemctl start vncserver@:1
```
これで一旦EC2の設定完了。

## ローカルコンピュータの設定
ローカルコンピュータにTigerVNC ソフトウェアをインストールする。[TigerVNC](https://tigervnc.org/)はlinux,macOS,Windowsで利用することが可能。

### for mac
macの場合はTigerVNCを入れなくてもできました。
pemがあるディレクトリに移動して、以下のコマンドを実行。

```
ssh -L 5901:localhost:5901 -i "PEM_FILE" ec2-user@INSTANCE_IP
```
"PEM_FILE"を"example.pem"のように置き換えて、INSTANCE_IPは最初にssh接続したときのIPアドレスを入れる感じです。
成功すると。。。

```
[ec2-user@ip-000-00-00-000 ~]$ 
```
のようになります。000のところは個人によって違う数字になります。

そしたら、macのfinderで上のタブの[移動]から[サーバへ接続]を押すとアドレスの入力が求められる。そこには```
vnc://localhost:5901
```を入力するとおそらくデスクトップ画面が表示される。
ちなみに、[環境設定]から[共有]へ移動して、画面共有を許可にしておかないとできないっぽいです。成功すると。。。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256914/7339ae32-59c3-4aa7-a3d2-f82dd245537c.png)


### for windows (準備中)

#参考サイト
AWS:https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-linux-2-install-gui/
Simple Membershipのカスタマイズ

# プラグインファイルで文字を変更する

##「Username or Email」を日本語にする

/wp-content/languages/plugins/simple-membership-ja.poに下記追記。

```
#: views/login.php:11
msgid "Username or Email"
msgstr "ユーザー名またはメールアドレス"
```

##「ユーザー名またはメールアドレス」→「メールアドレス」に変更したい

そもそもviews/login.php:11の訳は「メールアドレス」にしたかったので
views/login.php:11の原文を変えたい。


```
#: classes/admin-includes/class.swpm-payments-list-table.php:84
#: views/forgot_password.php:5
#: views/payments/admin_add_edit_transaction_manually.php:75
msgid "Email Address"
msgstr "メールアドレス"
```

を用いて、views/login.php:11の

```
$swpm_username_label = apply_filters('swpm_login_form_set_username_label', 'Username or Email Address');
```
を

```
$swpm_username_label = apply_filters('swpm_login_form_set_username_label', 'Email Address');
```
に変更。


#登録時　同意の注意書き

###Simple Membership Form Builderで修正する

description欄にHTMLを記載すると、inputの後ろの表示されるので
パスワードのdescriptionに以下追加

```
<p class="swmp-check-agreement">パスワードには、数字、英字の大文字・小文字をそれぞれ最低1文字使用してください。</p>

<p class="note-input swmp-password">ユーザー登録には、<a href="https://oh-doctor.com/terms-treatment" target="_blank">利用規約（オンライン診察）</a>または<a href="https://oh-doctor.com/terms-consultation" target="_blank">利用規約(オンライン医療相談)</a>、および<a href="https://oh-doctor.com/privacypolicy" target="_blank">プライバシーポリシー</a>への同意が必要です。</p>
```


##バリデーションを日本語に

###状況
バリデーションの日本語ファイル（/wp-content/plugins/swpm-form-builder/js/i18n/validate/messages-ja_JP.js）があり、

/wp-content/plugins/swpm-form-builder/classes/class.swpm-form-builder.php
にlocaleに合わせて各言語のファイルを読み込むと書かれているのに、表示が英語のまま。

###対応
messages-ja_JP.js のファイル名を messages-ja.js　に変更し
/wp-content/plugins/swpm-form-builder/classes/class.swpm-form-builder.phpの734行目を修正して反映された。

```
'ja', // Japanese 'ja_JP → jaに変更'
```

また、未翻訳の箇所を修正
```
strongPassReq: '数字(0-9)、英字の大文字(A-Z)・小文字(a-z)をそれぞれ最低1文字使用してください。.'
```
【メモ】OracleDBを実務で使って勉強になった事

##この記事について
この記事は、私がこれまで出会ったOracleDBに関することについて備忘録的にダラダラと書いていきます（＾＾）。。。

##　目次
- 今まで出会ったORA-xxxxxxのエラーコードについて
- AWRレポートについて
- その他便利なSQL

## 1.今まで出会ったORA-xxxxxのエラーコードについて
- 1-1. ORA-01555

    undo領域不足によるエラー

    結果の件数が大きい(数億件とか)のデータをSELECT中にデータの更新があった場合に、データの整合性を保つためにロールバック・セグメント(undo領域)から取り出す必要があるがそのロールバック・セグメントが足りませんでしたのでSELECTが中断されてしまうこと。

- 1-2.ORA-00942

    指定のテーブルもしくはビューがないエラー
    存在しないテーブルもしくはビューをしていることがほとんど

- 1-3.ORA-03135
    接続が失われましたエラー

    解決がむずいORAエラートップ10 \(^^)/
    アプリ　or ミドル　or　os　or　ネットワーク？？？？？？

- 1-4.ORA-08103
    SELECT中にINSERTなどでデータの中身が変わってしまうことにより
    SELECTで取得したデータの中身の整合性が取れなくなってしまうエラー

- 1-5.ORA-12514
    リスナー未起動エラー
    簡単言うと、接続する相手先が受け付けてません！！！

- 1-6.ORA-00923
    FROM句がありません。

    SELECT * WHERE user_id = '00000001';
    とかでクエリを投げてしまったとか？？？？

- 1-7.ORA-00926
    VALUES句が間違っている

    INSERT時とかでVALUE句に設定する個数が違っていたとか

- 1-8.ORA-00955
    指定された名前のオブジェクトは既に使われています

- 1-9.ORA-01408
    同じ列に対して索引を複数作成しようとした

- 1-10.ORA-03114
    oracleに接続されていません
    ネットワークエラー

    ORA-03135とほぼ同等の認識ですが違いがわかりません。。。。
    勉強します。。。。


- 1-11.ORA-12152
    ブレークメッセージが送信されなかった
    ネットワークエラー

- 1-12.ORA-00001
   一意性制約違反
   ユニークでなければいけないところに同じ値がセットされようとした

## AWRの読み方

   とは言いつつ、私自身勉強中なので随時更新していく
   メモ・備忘録として残しておく。

## その他便利なSQL/覚えておくと便利なヤツ

- spool
    
    始め方例) 

         spool /tmp/xxxxx.csv [オプション]


    終わり方例) 
         
         spool off



| オプション | 意味|
|:-:|:-:|
|  CREATE |  spool結果ファイルを新規作成 |
| REPLACE  | spool結果ファイルを指定した同名のファイルを上書き  |
|  APPEND |  spool結果ファイルを指定した同名のファイルに追記 |



- set linesize / set pagesize
    
| 命令| 意味 |
|:-:|:-:|
|  linesize | １行に表示する行のサイズ  |
| pagesize  |  区切るページサイズ |


使い方例) 

     set linesize 1000 pagesize 100


- 結果を可変長で出力する
    || で囲む


使い方例)

    SELECT hoge1||','|| hoge2 FROM schema; 

- いらない空白を削除

    - trimspool
    
    使い方)
  
        trimspool on

- ヘッダー(カラム名)を出力しない

    - head

    使い方)

         head off

- フィードバック(〜行が選択されました)を出力しない

    - feedback

    使い方)

         feedback off



## Oracleで困ったら見るページ
- Shift the Oracle
- Oracle 公式ページ

[参考：Shift the Oracle]https://www.shift-the-oracle.com/

[参考：Shift the Oracle]https://www.oracle.com/jp/index.html
[Linux][C言語]ファイルディスクリプタとハードリンクの関係について

C言語でファイルの読み書きをするときにはファイルを指し示すファイルディスクリプタという整数値を使います。プロセスがファイルを開いているときに、ハードリンクの変更、削除を試してみたのですが、プロセスは影響を受けませんでした。この事から、ファイルディスクリプタはハードリンクに紐づくものではなく、ファイルの実体と紐付いていると考えられます。イメージはこんな感じになります。

![ファイルディスクリプタ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115251/4a1a76c1-52d1-bc68-dda7-60548a0cbce5.jpeg)

検証内容は以下です。


# 検証環境

コンパイラ：gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
OS：Ubuntu 20.04.2 LTS (Focal Fossa)


# ハードリンクの変更

ファイルディスクリプタが実体と紐づくなら、ハードリンクを変更してもプログラムは影響を受けないはずです。作成したプログラムを次に示します。

``` c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define FILE_PATH "A.txt"

int
main(void)
{
  int f = open(FILE_PATH, O_WRONLY);
  if (f < 0) {
    perror("");
    exit(EXIT_FAILURE);
  }
  fprintf(stderr, "open file %s\n", FILE_PATH);

  sleep(10);

  char *buf = "HELLO!";
  if (write(f, buf, sizeof buf) < 0) {
    perror("");
    exit(EXIT_FAILURE);
  }
  fprintf(stderr, "write file %s\n", FILE_PATH);

  if (close(f) < 0) {
    perror("");
    exit(EXIT_FAILURE);
  }
  fprintf(stderr, "close file %s\n", FILE_PATH);

  exit(EXIT_SUCCESS);
}
```

このプログラムはファイルを開いたあと、10秒待機し、`HELLO!` と書き込んでからファイルを閉じます。その間に `mv` コマンドでファイルのハードリンクを変更してみます。分かりやすくするために、シェルの操作は行頭に `$` をつけました。

``` sh
$ ./open_close &
[1] 30887
open file A.txt
$ mv A.txt B.txt
write file A.txt
close file A.txt
```

`mv` コマンドでハードリンクを `B.txt` 変更しましたが、変更後のファイルに正しく書き込まれています。

``` sh
$ cat B.txt
HELLO!
```

この結果から、単にハードリンクが変更されただけで、プログラムが使っているファイルディスクリプタは影響を受けていないことがわかります。


# ハードリンクの削除

続いて、ハードリングを削除してみます。ファイルディスクリプタが実体と紐づくなら、ハードリンクを削除しても影響を受けないはずです。

先程と同じプログラムを使い、ファイルが開かれている間に `rm` コマンドでハードリンクを削除してみます。

``` sh
$ ./open_close &
[1] 30949
open file A.txt
$ rm A.txt
write file A.txt
close file A.txt
```

ファイルは削除してしまったので、プログラム終了後も存在しません。

``` sh
$ ls A.txt
ls: 'A.txt' にアクセスできません: そのようなファイルやディレクトリはありません
```

この結果からも、ハードリンクが削除されただけなので、実体を指し示していたファイルディスクリプタは影響を受けていません。


# 参考文献

書籍：　ふつうのLinuxプログラミング第２版　青木 峰郎著
Go 1.16でSQLite3

Goの環境構築ができたので、軽量DBとしてSQLite3を使ってみようと思った。
GoもMacも初心者である。

# 環境

- MacBook Air (M1, 2020)
- macOS Big Sur 11.3.1
 - SQLite3 3.32.3
- Go 1.16.5
 - SQLite3 Driver github.com/mattn/go-sqlite3 v1.14.7

# 予備知識

GOでSQLite3を扱うためには、Driverと呼ばれるライブラリが必要らしい。
[こちらのサイト](https://astaxie.gitbooks.io/build-web-application-with-golang/content/ja/05.3.html)を見ると、database/sqlインターフェースをサポートしている[mattn/go-sqlite3](https://github.com/mattn/go-sqlite3)というものが良さそうなので、これを使用する方針とした。

ググったらmattn/go-sqlite3を使う方法はたくさん出てきたが、そこに書かれた手順通りにやっても、"go install: package github.com/mattn/go-sqlite3 is not a main package"というようなエラーになってうまくいかなかった。
これはmattn/go-sqlite3の問題ではなく、Go 1.16ではデフォルトとなったらしい「モジュール対応モード（module-aware mode）」に適した方法でモジュールをインストールしないといけなかったためだった。

Go初心者に対するハメ技的な事象だったので、手順をメモに残す。

# SQLite3のインストール

MacにはSQLite3が標準でインストールされているらしい。

```
% sqlite3 -vesrion
3.32.3 2020-06-18 14:16:19 02c344aceaea0d177dd42e62c8541e3cab4a26c757ba33b3a31a43ccc7d4aapl
```
brew install sqlite3 を実行した気もするが、気のせいか。

go-sqlite3はCGOパッケージというものらしい。go-sqlite3を使ったGoアプリをビルドするときには、GCCが必要だとのこと。
Macの場合は、Xcodeをインストールした後、下記コマンドでgccがインストールされるらしい。

```
xcode-select --install
```

# 本題

本家の[ドキュメント](https://github.com/mattn/go-sqlite3#installation)でも、"go getすればパッケージがインストールされる"と書いてある気がするが、Go 1.16（というかmodule-aware modeの場合）だと、もう少し手順が必要。

まず、適当なフォルダを作成(sqlite3-testとする)し、そのフォルダ内にメインのソースコード(main.goとする)を作成する。

```go:sqlite3-test/main.go
package main

import (
	"database/sql"

	_ "github.com/mattn/go-sqlite3"
)

func main() {
	hogehoge
}
```

sqlite3-testフォルダで、go mod initを実行する。
すると、go.modファイルが生成される。

```
% go mod init sqlite-test
% cat go.mod 
module sqlite-test

go 1.16
```

この状態でgo getを行うと、matt/go-sqlite3パッケージがインストールされる。

```
% go get github.com/mattn/go-sqlite3
go: downloading github.com/mattn/go-sqlite3 v1.14.7
go get: added github.com/mattn/go-sqlite3 v1.14.7

% cat go.mod 
module sqlite-test

go 1.16

require github.com/mattn/go-sqlite3 v1.14.7 // indirect
```

あとは、go runで実行すれば良い。

```
% go run main.go
```

# 感想

最初はエラーの意味が分からず、パッケージ側の問題かと思っていたが、Goのモジュール管理の方法が変わったことによる手順の違いだった。
（もしかしたら、Go熟練者にとってはgo.modが必要なことは常識過ぎて、記事に書いてなかっただけかもしれない。）
新しい環境になれるのには、なにかと時間がかかる。

# 参考になったページ

[GOPATH モードからモジュール対応モードへ移行せよ](https://qiita.com/spiegel-im-spiegel/items/5cb1587cb55d6f6a34d7)
[Go のモジュール管理【バージョン 1.16 改訂版】](https://zenn.dev/spiegel/articles/20210223-go-module-aware-mode)
JavaScriptでinputの入力欄にスペース、空白を入力させないようにする方法

JavaScriptでinputの入力欄にスペース、空白を入力させないようにするに方法なります。
フォームなどの入力欄作成時に使えるかと思います。

## JavaScriptのreplace()メソッドを使う

```html
<input id="input" type="text" value="" />

<script>
  const input = document.getElementById('input')
  input.addEventListener('input', () => {
    const inputCheck = /\s+/g // 空白の正規表現
    const value = input.value
    input.value = value.replace(inputCheck, '')
  })
</script>
```
JavaScriptの`replace()`を使い、空白やスペースを除いてinputのvalueにセットし直してます。
空白があるかを判別したい時は、`test()`が使えます。

```js
const inputCheck = /\s+/g;
const value = "abcdefg";
if (inputCheck.test(value)) {
  console.log('空白があります')
}
```


## Vue.js(Nuxt.js)の場合

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

<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
  data() {
    return {
      inputForm: ''
    }
  },
  watch: {
    inputForm(inputForm) {
      const inputCheck = /\s+/g // 空白の正規表現
      this.inputForm = inputForm.replace(inputCheck, '')
    }
  }
})
</script>
```

Vue.js(Nuxt.js)の場合は、`watch`で入力を監視することで実装できます。

## 参考

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace

https://qiita.com/iLLviA/items/b6bf680cd2408edd050f
herokuへデプロイする際のエラー

#1.はじめに
railsチュートリアル1章のherokuへのデプロイの際に起きたエラーの解決方法です。

#2.エラーの内容
heroku createを実行した際に以下のようなエラーが発生しました。

```
Creating app... !
 ▸    You've reached the app limit of 5 apps for unverified accounts. Delete some apps or add a credit
 ▸    card to verify your account.
```

このエラーはherokuは１つのアカウントにつき５個までしかアプリを保有できないというものです。
なので既存のアプリを１つ削除すればheroku createを実行することができます。

#3.削除方法

```
$ heroku apps
```

まずは上記コマンドでheroku内に存在するアプリ一覧を表示します。

```
glacial-meadow-73176
immense-chamber-70279
powerful-chamber-32609
quiet-ridge-48265
shielded-bastion-18285
```

するとこのようにheroku内のアプリ一覧が表示されます。
この場合すでにheroku内にアプリが5つある状態なのでheroku createは行えません。
ではこの内の１つを削除してみましょう。

```
$ heroku destroy --app glacial-meadow-73176(アプリ名)
```

このコマンドで指定したアプリを削除することができます。

```
 WARNING: This will delete ⬢ glacial-meadow-73176 including all add-ons.
 ▸    To proceed, type glacial-meadow-73176 or re-run this command with
 ▸    --confirm glacial-meadow-73176
```

次に確認画面が出てくるので再度アプリ名を入力（この場合は”glacial-meadow-73176”）すれば削除完了です。
削除できたかは先ほど入力した"heroku apps"でアプリ一覧を表示させて確認します。

#4.heroku create

アプリの枠が空いたので再度heroke createを実行します。

```
heroku create
```

無事にデプロイが完了しました。

```
Creating app... done
```

#5.まとめ
今回のエラーはrailsチュートリアルをやる以前にherokuでアプリをデプロイしたことがある人に起こりうるエラーとなっています。

#引用
>https://qiita.com/megn342/items/0f38274a97b43803b51c
【React Native】 Mac M1でpod install が失敗する

# はじめに

Mac M1チップで、pod install が失敗する。

```
LoadError - dlsym(0x7f8926035eb0, Init_ffi_c): symbol not found - /Library/Ruby/Gems/2.6.0/gems/ffi-1.13.1/lib/ffi_c.bundle

etc
```

とか

```
LoadError - dlopen(/Library/Ruby/Gems/2.6.0/gems/ffi-1.15.3/lib/ffi_c.bundle, 0x0009): missing compatible arch in /Library/Ruby/Gems/2.6.0/gems/ffi-1.15.3/lib/ffi_c.bundle

etc
```

が出てpod installができないときに以下の記事で解消。

https://stackoverflow.com/questions/64901180/running-cocoapods-on-apple-silicon-m1/65334677#65334677

# 解決

```
1. Right-click on Terminal in Finder
2. Get Info
3. Open with Rosetta

I installed a gem that seems to be related to the symbol not found in the error:

sudo gem install ffi

```

とあるので、Rosettaでターミナル開いて、ffiをgemでinstallで解消。
【Ruby】小数の計算での丸め誤差について

# 丸め誤差
Rubyでは以下のように小数の計算で期待しない結果になることがある。（他の言語でもよく発生する）

```ruby
0.1 * 6.0
#=> 0.6000000000000001
```


そのため以下のような現象が起こる。

```ruby
0.1 * 6.0 == 0.6
#=> false

0.1 * 6.0 <= 0.6
#=> false
```

# 対処法
Rational（有理数）クラスを使うことで期待した結果が得られる。
以下のように数値の後ろにrを付けるとRationalクラスの数値になる。

```ruby
0.1r * 6.0r
#=> (3/5)

0.1r * 6.0r == 0.6
#=> true
```

値が変数に入っている場合はrationalizeメソッドを呼び出して、Rationalクラスの数値に変換できる。

```ruby
x = 0.1
y = 6.0
x.rationalize * y.rationalize
#=> (3/5)
```

小数に戻したい場合はto_fメソッドを呼ぶ。

```ruby
(0.1r * 6.0r).to_f
#=> 0.6

x = 0.1
y = 6.0
(x.rationalize * y.rationalize).to_f
#=> 0.6
```

# 参考文献
伊藤 淳一 「プロを目指す人のためのRuby入門」, 技術評論社, 2017

https://docs.ruby-lang.org/ja/latest/class/Rational.html
if文の書き方っていくつかあるみたいね

プログラミングでよく使うif文。
それのブロックの書き方は3パターンほどあると知ったので書き方まとめ的な感じ。

##一番使うであろう書き方

```java:sample1.java
if (num == 1) {
    ・・・何か処理
}
```

おそらくこれが一番書かれている書き方だと思う。
処理を複数行書く場合はこれになる。ただ処理が一行であった場合に対して三行書くのは煩わしい気もする・・・。

##中括弧を無くした書き方

```java:sample2.java
if (num == 1)
    ・・・何か処理
```

中括弧を無くしても動作する。
そもそもif文は条件式の後の一行の実行を制御する構文のよう。
変数numが1であったら処理の最初の一行を実行する。二行、三行ある場合は条件に関わらず、常に実行されるので注意。


##一行にまとめた書き方

```java:sample3.java
if (num == 1) ・・・何か処理
```

中括弧も改行も無くした書き方。
個人的に一番好きな書き方。一行でコンパクトにできるしfor文中なら無駄にネストしなくて済む。
当然ではあるが、知ってないと読みづらさはあるのでチームで使う場合は注意が必要と思う。
デバッグもしずらくなるので処理が確定した際に書くと良いと思う。



###おしまい
短く書けるっていいね笑
ご指摘あればください。
web開発における双方向通信プロトコルまとめ

# はじめに
IoTに関する業務を始めるにあたり、通信プロトコルについてよく分かっていなかったのでざっくり整理した。

# 双方向通信とは
チャットアプリが分かりやすいが、自分が何もしなくても（自分からリクエストを送らなくても）リアルタイムにメッセージが届く。これはサーバから任意のタイミングでクライアントへ通信が行われていることがわかる。

# HTTPでは双方向通信できない
HTTPプロトコルはクライアント→サーバへの一方通行。
![双方向通信-Page-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/bfd4884c-e10f-4234-64a2-331ff978677c.png)
サーバ側からすると、任意のタイミングでクライアントに通信を行うことができない。
サーバ→クライアントへ好きなタイミングで通信するためには、短時間間隔でクライアント→サーバにリクエストを送ったり、リクエストを送ったままサーバの返事を待ち続けるなど、ポーリング処理が必要。リアルタイム性に欠ける上、データのムダが多い。


# 双方向通信をするには
双方向通信をするためのプロトコルはいくつかあり、かつ以下の方法では同時接続も可能となる。
![双方向通信-Page-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/872af70b-85b8-99ea-6ca6-effcf1683cab.png)

## TCP
![双方向通信-Page-4 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/8e14f6f7-7a28-220f-13b7-251dd10f5627.png)
アプリケーションレイヤを使わず素のTCPプロトコルで双方向通信する。
アプリケーションヘッダが必要ないので軽量。低レイヤ通信でモノ同士をつなぐときの選択肢。
HTTPではないので、ブラウザでは動かない。
![双方向通信-Page-4 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/1127dde5-421c-4b21-b615-cafa90270924.png)


## MQTT
![双方向通信-Page-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/8c08b1d7-4071-bc11-1fbc-bd449ec4c3f9.png)
ヘッダ情報が少なく軽量。少量のjsonデータのやり取りに最適。軽量ゆえ多数の同時接続時も安定している。モノ同士をつなぐときの選択肢。IoTの文脈でよく使われる。
HTTPではないので、ブラウザでは動かない。
![双方向通信-Page-4 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/fac8833d-b865-dc39-7486-b8cf5c13ad66.png)

## WebSocket
![双方向通信-Page-4 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/c4726d4a-fb77-2b69-58d0-92053e1fdf8c.png)
HTTPプロトコルをアップグレードして、双方向通信を可能に。基本はHTTPなのでブラウザでも動く。ユーザー同士でリアルタイムにやり取りするアプリに使われる。IoTの文脈ではあまり使われない。
![双方向通信-Page-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/22f5bb93-a26f-8bdb-cf18-e433fdb2d999.png)


## MQTT over WebSocket
![双方向通信-Page-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/b0c315a7-915a-6436-7b0f-1742f68de798.png)
WebSocketでコネクションを確立した後、さらにその上でMQTTプロトコルでやりとりする。
HTTP→WebSocket→MQTTとなるのでコネクション確立には要するデータ量は多いが、コネクションを確立したあとはMQTTでの軽量なやりとりが可能となる。
基本はHTTPなのでブラウザでも動く。ユーザとモノをリアルタイムにつなぐときの選択肢。UIとIoTを連携させるアプリに最適。
![双方向通信-Page-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/872af70b-85b8-99ea-6ca6-effcf1683cab.png)


#参考にさせていただいたもの

* [MQTTの通信は本当に軽いのか？](https://www.ydc.co.jp/column/0002/20170630.html)
* [IoTアーキテクチャ入門：プロトコルの選択肢と検討ポイント](https://www.hulft.com/special-column/iot-architecture_01/iot-architecture_05)
* [IoTで用いるのはMQTTとWebSocketどっち？](https://teratail.com/questions/122867)
* [obnizから使いやすいMQTTブローカーとライブラリ](https://iot-gym.com/mqtt-brokers-and-libraries-suitable-for-obniz/)
あなたの知らない .new の世界

# doc.new って知っていますか？
ブラウザのURL入力欄に `doc.new` と入力するとGoogle ドキュメントの新規作成画面が開くんです！
`docs.new` でもいけます！ 
`document.new` でもいけます！
`documents.new` でもいけます！
Chromeだけではなく、Safari でも Edge でも IE でも Firefox でも開けます！スマホのブラウザでも！

# 他もいけるよ
同じように他の Google アプリも開くことができます。

#### Google スプレッドシート
`sheet.new` (もしくは `sheets.new`、`spreadsheet.new`、`spreadsheets.new`)

#### Google スライド
`slide.new` (もしくは `slides.new` 、`deck.new`、'presentation.new')

#### Google フォーム
`form.new` (もしくは `forms.new`)

#### Google 図形描画
`drawing.new` (もしくは `drawings.new`)

#### Google サイト
`site.new` (もしくは `sites.new`、`website.new`)

#### Google Apps Script
`script.new`

### Google Jamboard
`jam.new`

#### Google カレンダー
`cal.new` (もしくは `meeting.new`)

#### Google Keep
`keep.new` (もしくは `note.new` 、`notes.new`)

#### Google meet
`meet.new`

# Google 以外は？
他にもないかなと調べてみると、どうやら `.new` は Google 専用というわけではないようで。

#### Microsoft 365 の Word で新規ファイル作成
`word.new` (もしくは `docx.new`)

#### Microsoft 365 の Excel で新規ファイル作成
`excel.new`

#### Microsoft 365 の PowerPoint で新規ファイル作成
`powerpoint.new` (もしくは `ppt.new`、`pptx.new`)

#### Spotify でプレイリストを作成
`playlist.new`

#### GitHub で新規リポジトリを作成
`repo.new` (もしくは `github.new`)

#### Medium で新規投稿を作成
`story.new` (もしくは `medium.new`)

#### Discord でサーバーを作成
`discord.new`

#### MindMeister で新しいマップを作成
`mindmap.new`

#### Miro で新しい workshop を作成
`workshop.new`

#### wordpress.com で新規投稿を作成
`blog.new`

#### StackBlitz で Node.js の新規環境を作成
`node.new`

#### StackBlitz で Next.js の新規環境を作成
`next.new`

#### CodePen で新規環境を作成
`pen.new`

とたくさんありました :relaxed:
詳しくは、[.new - Google Registry](https://whats.new/shortcuts/) に色々載っています。
よく使うサービスは覚えておくと便利かもしれないですね。
`qiita.new` は残念ながらないようです :frowning2:

<br>
# We are recruiting !
株式会社GENZではキャリア採用を行っております。
ご興味がある方は以下をご確認ください！
[株式会社GENZ - 採用情報]
 (https://www.genz.jp/recruit/?qirecruit=20210630)

## 参考サイト
[newドメイン登録 （gTLD） | 世界のドメイン取得、コンサルティングならGonbei Domain（ゴンベエドメイン）](https://www.gonbei.jp/reg/domain_detail.cgi?p1=new)
[意外と知らない便利サービス〜Google .new ショートカットの使い方 | 株式会社キャパ CAPA,Inc. コーポレートサイト](https://www.capa.co.jp/archives/32700)
[.new - Google Registry](https://whats.new/shortcuts/)
苦手なハンダ付けを克服！

![](https://tech.zms.co.jp/wp-content/uploads/2020/11/solder-with-title.jpg)
2020年11月27日 自社ブログ投稿分より

こんにちは。ZMSのhimeshimaです。
「皆さん、ハンダ付けやってますか？」
ソフトウェア寄りの開発者でやっている人は少ないかもしれませんね。しかし組み込み開発では必要となることが結構あります。というわけで今回は、私にとっての ”ハンダ付けとの関わり” について書きたいと思います。

## 苦手意識が生まれるまで

私は組み込みソフト開発を長年やってきました。制御屋(組み込みソフト開発者)ということで、SWDからのファームウェアの書き込みや、UART・I2C・SPIといった通信ラインを使用＆デバッグすることがあり、線出し(ハンダ付け)が必要となります。最初からアクセスできるようになっている状態で開発ボードを受け取る場合もありますが、私の経験してきた現場ではそうでないケースも多かったです。開発人員が潤沢にいる大手メーカーでは電気屋(ハードウェア開発者）にお願いしてやってもらえることもありましたが、お願いできる人がいない場合もあります。ブレッドボードを活用することでハンダ付けが必要なケースを減らすことはできますが、それでも自分でやれる方が役に立つことが多いのではないでしょうか。

私は7年以上ハンダ付け作業を経験していますが、残念ながらあまり得意ではありません。業務で行うハンダ付け作業は私にとって難易度高めのものが多く、ハンダ付け失敗から開発ボードをダメにした苦い経験が何度かあります。そのためなかなか上達できずに、”ハンダ付け ⇒ 苦手 ⇒ あまりやりたくない” というマイナス印象をこれまで持ち続けてきました。









## 私のハンダ付けレベル

- **ステップ1：標準ピッチ(2.54mm)**
![](https://tech.zms.co.jp/wp-content/uploads/2020/11/2.54mm-pitch.jpg)
標準的なブレッドボードのピン間隔であり、肉眼での確認のみで成功します。このレベルで失敗することはまずないです。

- **ステップ2：ハーフピッチ(1.27mm)**
![](https://tech.zms.co.jp/wp-content/uploads/2020/11/1.27mm-pitch.jpg)
名前の通り、標準ピッチの半分しか間隔がありません。私にとっては実体顕微鏡を使ってなんとかやれるといった感触です。これ以下の狭いピッチ(1mm未満)等のハンダ付けが困難な条件になると、私の手には負えないと認識しています。上級者になると髪の毛1本ほどのエナメル線を使ってチップの足から線出ししてたりしますが、、、。

今回、ほぼハーフピッチ(1.25mm)のハンダ付けが必要となり、対処方法を考えました。
方法１．ハンダ付けが得意な人にお願いする
方法２．自分でなんとかする

私は「方法２」を選びました。苦手なハンダ付け作業を克服することが今後のためにも必要だと考えたからです。と言っても対象が高価なボードや入手が難しい(or 入手に時間がかかる)ものだった場合には失敗するわけにいかないので「方法１」を選びます。状況に応じて判断することが必要なのは明らかですね。では具体的な対処をどうするのか。今回は自宅での作業になり、はんだごて以外に使えそうな機材はありません。しかしこれまでの経験上、私のスキルでは肉眼に頼るだけでやるのは無謀。そう判断し、デジタル顕微鏡を購入することにしました。

## ハンダ付けでよく使われる2つの顕微鏡

- **実体顕微鏡 (stereo microscope)**

光学顕微鏡の一種で、低倍～中倍率(2～30倍程度)の観察に用いられます。双眼鏡と同じく接眼レンズを覗いて観察します。
![](https://tech.zms.co.jp/wp-content/uploads/2020/11/pnghut_stereo-microscope-optical-optics-engineering_aVesBwyGek.png)
- **デジタル顕微鏡 (digital microscope)**

デジタルカメラを搭載した顕微鏡で、モニターに出力して観察します。実物は ↓ の写真をご覧ください。

## デジタル顕微鏡の使用

私が購入したものは、[Andonstar AD207](https://www.amazon.co.jp/gp/product/B07YTV3J59) というもので、1.4万円でした。
![](https://tech.zms.co.jp/wp-content/uploads/2020/11/Andonstar-AD207.jpg)
もっと安いものもありましたが比較検討した結果、以下のポイントに価値を見出し決めた次第です。
・7インチモニター
・明るさ調整とフレキシブルな向き調整が可能な補助LED照明つき
・カメラの高さと角度(カメラ&モニター)の調整が可能
・世界中に購入者がいて、低い評価のものが少ない

作りのあまい点(日時設定後、1度本体ボタンから電源オフしないと日時保持されない)があるものの、効果は絶大でした。これまで実体顕微鏡を使った経験はありますが、接眼レンズを覗きながらのハンダ付け作業には窮屈でやりにくさを感じていました(※あくまでも個人的な印象です)。ところがデジタル顕微鏡ではその窮屈さがなくなり、対象物をはっきりと十分に拡大されたサイズで見ることができます。ハンダ付け時にはモニターを見たまま手元を動かします。ハンダ付け対象物と線材、ハンダごての位置確認のためモニターではなく物体を直接見ることがありますが、モニターが近くにあるため目線の移動は負担になりません。ハンダ付けの成功・失敗がモニター映像を通してわかることが多く、テスターを使った導通確認は最小限で済みます。この時、私の中で ”苦手なハンダ付け作業” が辛いものではなくなったことに気づきました。

今回、”物体を正確に見ることができれば、手元の操作は精度を高められる” ことを実感したことで、ハンダ付け作業を前向きに行うことができました。上級者への道のりはまだまだ遠いですが、これからは恐れることなくハンダ付け作業に取り組み、スキルを高めていこうと思います。
LambdaとS3の連携

##　はじめに
　今回はLambdaとS3の連携を構築してみたので、それをメモがてらこちらにアウトプットしようと思います。
　AWSの資格の勉強ばかりで飽きてきた部分もあったので息抜きがてらやりました。
　
　よろしくお願いします(｡･ω･)ﾉﾞ
##　構成内容
今回構成するのはこんな感じです。
S3に画像がアップロードされたらLambdaへイベント通知がされテストコードが実行されるよう構築していきます。
![lambada.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993659/0f230370-91e4-ba18-3217-7e0c9156fe14.jpeg)

##　Lambdaの構築
コンソール画面からLambdaの構築画面に遷移し作成していきます。

　　・関数名は適当で大丈夫です
　　・今回ランタイムのほうはPython３．７の方を使用していきます
　　・実行ロールにある「基本的なLambdaアクセス権限で新しいロールを作成」にチェックが入ってることを確認してから作成していきます
![スクリーンショット 2021-06-30 151728.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993659/bdfba5b6-946c-f144-6e60-b8b62c31a95d.png)
　今のままだとステータスコード200が返ってくるようになっているので、printでイベントの内容を表示させるように書き換える。

```
import json

def lambda_handler(event, context):
    # TODO implement
    print(event) ←ここに記入
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

```
##　S3の作成
　◆バケットの作成

　　・バケット名は一意である必要があります
　　・リージョンはLambdaを構築した同じリージョンである必要がある
　　・今回はパブリックにアクセスさせる要件はないのでブロックのままでおｋ
　　・あとの項目はデフォルトで作成
![スクリーンショット 2021-06-30 144427.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993659/17f73b5f-957b-dc17-0c39-388a5c5d648d.png)

　◆**S3のイベント通知の設定**
　　S3のプロパティの中にあるイベント通知を設定していきます
　
　　　・イベント名は任意
　　　・プレフィックスとサフィックスがあるが今回はサフィックスのオプションで通知させます
　　　・「.jpg」で終わる画像がアップロードされた場合のみイベント通知が発動します
　　　・イベントタイプはファイルがアップロードされたらLambdaをキックしたいので**すべてのオブジェクト作成イベント**にチェックをいれます
![スクリーンショット 2021-06-30 144617.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993659/334ae173-3b28-0027-561a-482cb7a23e46.png)
![スクリーンショット 2021-06-30 144648.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993659/2936aaa3-4353-987d-38a6-078f99881a08.png)
　
　　◆**送信先**
　　S3がLambdaにキックできるような設定しなければなりません。先ほど構築したLambdaを選択します
　　これでひとまずS3に画像をアップロードするとLambdaが起動するようになりました。
　![スクリーンショット 2021-06-30 144723.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993659/5da917f6-3bd4-f3b2-6b19-931f258b3f9d.png)

##　アクセス権限・トリガー
　Lambda関数の設定を覗いてみるとトリガーのところに上記で作成したS3があると思います。
　アクセス権限の方をみると、CloudWacth logs以外にもリソースベースのポリシーの欄に新しく**S3にLambdaを呼び出すアクションが許可されてる**と思います。
　このリソースベースのポリシーには「**このS3バケットからだったら操作してもいいよ！**」ということが書かれています。

##　おわりに
　S３から画像をアップロードすると、イベント通知がLambdaにキックされログを見てみるとLambdaに渡されたイベントのほうが確認できるようになりました。
　実際に手を動かしてやってみたほうがやっぱり面白いですね！！！！また機会があれば他のこともチャレンジしてみようと思います！

　(｡･ω･)ﾉﾞバイバイ
プログラミング初心者向けC言語入門＃1　関数１

## 前回やったこと
[前回](https://qiita.com/legohasiri/items/27cd5f4c70e7037ecbd8)では
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286973/e23abe60-e940-6241-da14-92aa29dabfa6.png)
こんなの打ち込んで･･･

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286973/6bc18a3e-5b6a-ec2d-1fa7-a2169329c08f.png)
こうなった。

## 何が起こってるの？
C言語は、`main関数`を実行します。ところで`main関数`ってなんだ？そもそも`関数`ってなんじゃらほいっていう人もいるかと。

# 関数
### 数学における関数
中学数学に戻ります。こんなものを習いましたよね？
$$y=ax$$
こんなやつです。$x$が決まると$y$も決まるっていうものでした。例えば、$a=3$とすると、関数はこうなります。
$$y=3x$$
ここで、$x=5$としてやると、$y=3×5$となり$y=15$となるわけです。
もう少し拡張してみましょう。高校数学に入って、$y=ax+b$というものを考えましょう。$a,b$は定数です。これを**一次関数**というわけでした。つまり関数ですね。やはり$x$が決まれば$y$が決定されるのです。ちょっと書き方を変えてみましょう。

```math
f(x)=ax+b\\
y=f(x)
```
書いていることは同じですが、関数が$f(x)$として定義されました。次の関数について考えましょう。
$$f(x)=-2x+9$$
では、$x=3$の時どうなるでしょう。
$$f(3)=-2×3+9=3$$
$x$に3を代入し、関数$f(x)$から計算結果の3が返ってきました。つまり関数は`ある入力に対し、その数に対してなんらかの処理をしその結果を返すもの`として考えられるのです。

### プログラミングにおける関数
プログラミングにおいても、数学の関数とほとんど変わりません。英語では関数のことを$function$といいます。"機能、作用"といった意味の単語です。プログラミングではこの意味通り、`入力などを基に、なんらかの機能を果たすモノ`という風に考えます。

### main関数
ところで、C言語では`main関数`を実行すると書きました。また、関数とは何らかの働きをするモノでした。つまり、C言語(に限らず様々な言語)では、main関数という役割が書かれたモノを動かしているわけです。
前回のプログラムのmain関数を見てみましょう。

```C
int main(void){
    printf("Hello Woirld!");

    return 0;
}
```
これがmain関数です。この関数は、`printf("Hello World!")`を実行し、最後は0を返すということをしているわけです。
ところでこの`printf`もまた関数です。どんな関数でしょうか。また0を返すとは何でしょうか。

### printf
printf関数は、入力されたものを画面に表示する関数です。今回の入力は`Hello World!`でしたので、これが表示されたわけです。

### return 0
このmain関数は最後に0を返します。
`return`という処理を実行すると関数は終了します。また、main関数における0というのは実行結果であり、*成功*を示しています。main関数は、プログラムの実行時、OSが呼び出して実行しているのですが、0を返すというのはOSに対して`実行に成功したよ`と返してあげているわけです。

## 関数の実装
関数ですが、どういう機能のものなのかというのをちゃんと実装(定義)してあげなければいけません。さっきあなたも関数の実装をしていましたよね？
そうです。main関数です。C言語プログラミングとは、超ざっくり言っちゃうと`main関数の実装`をしているだけなのです。main関数からほかの関数を呼び出したりしているわけなのです。
また、printfの実装も当然しなければいけないのです。ですがした覚えないですよね？そうです。あなたはしていないのです。実はすでにどこかでされているのです。どこでしょうか？
実は`stdio.h`というファイルですでに実装されているのです。私たちはすでに実装されている関数を利用していたというわけですね。

# 次回
割と長くなったので分割します。次回は自分で関数を作るということをします。
iOSアプリのプレビュー動画をまとめて作る方法

Androidアプリストアのプレビュー動画は、Youtube動画を１つ作成すればよいのですが、iOS アプリの場合は、以下のように[たくさんの動画を作る必要](https://help.apple.com/app-store-connect/?lang=en/#/dev4e413fcb8)があります。これらの動画を、[フリーソフト9VAeきゅうべえ](https://qiita.com/danjiro/items/253e5a33a38599098274)を使って作成する方法を説明します。

# App Store プレビュー動画の仕様

||iPhone 6.5インチ|iPhone 5.5インチ|iPad|
|:--:|:--:|:--:|:--:|
|サイズ (ピクセル)|886x1920  1920x886 |1080x1920 1920x1080|1200x1600 1600x1200|
|フレームレート (FPS)|最大30|最大30|最大30|
|時間|最大30秒|最大30秒|最大30秒|

- 無音再生を考えるとテロップが重要
- 複数言語作る必要あり
- 音声トラックがないとアップできない（44.1kHz または 48kHz）
- ３０秒動画を３個まで登録できる


# 9VAeきゅうべえを使った動画作成

プレビュー動画を作るには、iPhone上の操作を動画キャプチャーする方法が最初に思いつきますが、（１）要点を伝えるにはテロップが必要。（２）動画編集はかなり手間がかかる。
そのため、静止画キャプチャの上に文字や矢印をいれ、必要な部分だけアニメーションを追加するほうが簡単で、後から修正もしやすいです。


9VAeきゅうべえは９ページのキーフレームを作成できますが、それで１０秒程度のカットがつくれます。これを３つ読み込んで３０秒の動画が作れます。9VAeでいったん動画を作成すると、連番画像を差し替えるだけで、別のアプリのプレビュー動画が作れます。


## iPhone5.5インチ用動画

- iPhone画面をキャプチャ（iPhone5.5インチ）連番画像を作成
- 9VAeきゅうべえMac版で、ページサイズを1080x1920 に設定。各ページにテロップを挿入し、iPhone5.5インチ用プレビュー動画を作成。

![dangla-jp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67734/57f697d5-8344-ecb0-09c0-4a2a0edeb073.gif)




## iPhone6.5インチ用動画

- iPhone 6.5インチ用プレビュー用に、ページサイズを 886x1920に設定した9VAeアニメを作成。ここに 5.5インチ用プレビュー動画をアニメキャストとして読み込みます。兄めキャストの幅を 886 に縮小します。
- アニメキャストの中を開き、キャプチャ画像を縦に伸ばす修正を追加して、6.5インチ用画像を作成します。

![dan886-jp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67734/0689d1e4-771e-174e-81e9-c986ab249601.gif)


## iPad用動画

- iPad画面で同じ場面をキャプチャ。同じ番号の連番画像を作成。
- iPadプレビュー用に、ページサイズを 1200x1600 または 1600x1200 に設定した9VAeアニメを作成。ここに 5.5インチ用プレビュー動画を読み込みます。
- キャプチャ画像をiPadのものに差し替えます。それにあわせて、文字や矢印の場所を変更します。

![danpad-jp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67734/de154b74-baed-7fec-082f-f9a85e96d13c.gif)


# 英語版動画の作成

- テロップの文字を英語に翻訳します。調整メニューの「文字をまとめて変更」をつかえば、アニメ（アニメキャスト）の中の文字を一度に修正できます。
- キャプチャ画像に日本語がある場合、9VAeで英語の文字を入力し、上に重ねます。入力直後の文字背景は透明ですが、塗り色を設定すれば背後に不透明の文字枠がつき、日本語を隠すことができます。
- 文字枠の色は、塗り色のパレットから「画面から色を選ぶ」をタッチし、キャプチャ画像から選びます。
- 文字タブ（パレット２）の文字配置のアイコンのメニューで文字枠のサイズを広げたりせまくしたりできます。
- さらに多国語化する場合、文字の先頭に#を挿入し、[差し替えリストを作成します](https://qiita.com/danjiro/items/8f1c1e8f8ae7ecdf10e6)。
- 英語版をひとつ作成すれば、サイズが異なる動画は、文字のコピーペーストで英語版にできます。

![dangla-en.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67734/1832afbc-66c9-fcba-1d93-3c6930fd6d84.gif)


# 動画作成

- Mac版 9VAeでは、ファイルメニュー＞動画出力 で、MP4動画を出力できます。仕様にそったサイズの動画を出力します。
- また、同じデータから、任意のサイズのGIFアニメも出力できます。この記事のGIFアニメは、それで作成しました。

9VAeをつかうと、複数の異なるフォーマットの解説動画をまとめて作ることができました。
在宅勤務カイテキ化計画

![](https://tech.zms.co.jp/wp-content/uploads/2020/09/在宅勤務カイテキ化計画.png)
2020年9月4日 自社ブログ投稿分より

こんにちは、ジーマックスメディアソリューション（以下、ZMS）のhimeshimaです。

ZMSの開発メンバーは在宅中心で業務にあたっています。
コロナ禍にあって、私は前職から在宅勤務を経験済ですが、転職を機に環境を見直すことにしました。

今回はそのことについて書きたいと思います。

あくまでも私個人にとって「カイテキ」となる構成を選んだものではありますが、他の方の参考になれば幸いです。 自宅で仕事を行うデスクスペースには、私用デスクトップPC(机下) ＋ モニター1台がある状態です。

ZMS入社後、会社からは社用ノートPCが支給されました。

## 実現したいこと

・デュアル・モニター(1台はFull HD超の解像度)
・私用PCと社用PCのマウス・キーボードを共用化
・できるだけ机上のスペースを広く

## デュアル・モニター

#### モニターの選定

幸いノートPC搭載のグラフィックボードは外部に2出力可能なものだったため、外部モニター2台を使うことにしました。

ノートPCを[スタンド](https://www.amazon.co.jp/gp/product/B07R5J85D7)に立ててデスクトップPCとして使い、ノートPCの画面はオフ設定にします。

モニターは2台同じもので揃えた方が見栄えがよいのですが、予算の都合でひとまず1台追加するのみとしました。

選んだものは[DELL P2421DC](https://www.dell.com/ja-jp/shop/dell-%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-p2421dc-238%E3%82%A4%E3%83%B3%E3%83%81%E3%83%AF%E3%82%A4%E3%83%89-usb-c-%E3%83%A2%E3%83%8B%E3%82%BF/apd/210-avrq/%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC-%E3%83%A2%E3%83%8B%E3%82%BF%E3%83%BC%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B5%E3%83%AA%E3%83%BC)で、解像度がQHD (2560x1440) となり、24インチでは文字が小さすぎるかもと心配でしたが、モニターまでの距離が50～60cmしかない私の環境では100％表示でも問題ありませんでした。

#### モニターの固定方法

モニター位置はあまり動かさないだろうと見越して、モニター2台対応の安価なモニターアーム([グリーンハウス GH-AMDB2H](https://www.green-house.co.jp/products/gh-amdb2h/))を買いました。

強度に問題はありません。

1本の柱でモニター2台を固定する関係上、モニターの角度次第で後方への出っ張り具合が変わる点には注意が必要です。 本当は壁掛けにしたかったのですが、手間と時間がかかるため今回は断念しました。

モニター裏の壁はコンクリート壁であり、分譲マンションの規約上、穴を開けるわけにはいきません。

壁の前に[LABRICO](https://labrico.jp/series/2x4-adjuster-powerful/)等を使って柱を立てることで壁掛けは可能です。 ↓ の写真は以前LABRICOを使って制作した55インチテレビの壁掛けです。

LABRICOと柱を4本、ベニヤ板、壁紙を使いコンクリート壁の前に自作壁を作りました。
LEDの点灯はテレビの電源と連動させています。

実際にはスマホでの写真ほど眩しく光っていません。

![](https://tech.zms.co.jp/wp-content/uploads/2020/09/kabekake_tv-1024x661.jpg)
## 私用PCと社用PCのマウス・キーボードを共用化

#### マウス

[logicool MX MASTER 2S](https://www.logicool.co.jp/ja-jp/press/press-releases/12893#) を以前から所有しており、マルチペアリング対応のため問題なしです。

マウス裏のボタンを使って操作対象のPCを簡単に切り替えできます。

#### キーボード

US配列が好みですが、所有するものがマルチペアリング非対応のため、
[logicool K780](https://www.logicool.co.jp/ja-jp/products/keyboards/k780-multi-device-wireless-keyboard.920-008033.html?crid=1762) のUS配列版を海外から手配中です。

※日本で売っているものはJIS配列版しかないようです。

## 現状

![](https://tech.zms.co.jp/wp-content/uploads/2020/09/after-1024x577.jpg)
新しいキーボードはまだ届いていませんが、なかなか快適になりました。

組み込み開発では機材を使うことが多く、机上のスペースは広い方がよいです。

長時間、画面を見る上でノートPCの画面を使わない選択は、私にとっては正解でした。
姿勢に影響し、疲れ具合が変わるのだと思います。

#### TODO案件

・PCの「休止状態」を使う運用を行う場合、外部のマウスやキーボードから「再開」できると便利です。 今回のようにノートPCを畳んだまま使う場合は必須とも言えます。

私用PCの方では問題なくできるのですが、社用PCではできていません。

メーカーに問い合わせたところ、残念ながら未対応との回答でした。 こうして私はZMSでの仕事をスタートしました。

今後は得意分野？である中国・組み込み・カメラに関するものや、ZMSの業務で取り組んでいることなどを書いていく予定です。

よろしくお願いします。
2つのフィールドのうち入力されているのが１つだとエラーにする入力規則

ちょっと、カンマとか抜けて解決までに時間が掛かりました。

IFを使ってカウントさせます。

```
OR(
IF(IF(ISBLANK(Invoice_Amount__c),0,1) + IF(ISBLANK(Invoice_Number__c),0,1)=1,True,False),
IF(IF(ISBLANK(Quote_Amount__c),0,1) + IF(ISBLANK(Quote_Number__c),0,1)=1,True,False)
)
```


https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000Bd5CRSAZ
30分単位の切り上げ処理の数式

質問を見て考えていたけど、Apexなら書けそう。
数式では分からん。

でも、回答者が現れるんですねぇ。すごい。

```
TIMEVALUE(

TEXT(HOUR(TIMEVALUE(CreatedDate))+IF(MINUTE(TIMEVALUE(CreatedDate))>=45,1,0)


)&":"&
IF(AND(MINUTE(TIMEVALUE(CreatedDate))>15, MINUTE(TIMEVALUE(CreatedDate))<45),"30","00")&":00.000")
```

https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000BcwxO

#15単位の切り上げ処理

```
ROUND((( Minutes_Field / 60) * 4), 0 ) / 4
```
これを見ると、上記は下記直せないかな？

https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000C3iWJSAZ