OmniAICreator/Qiita-1.07M huggingface dataset:
2022/4/4主にITとかセキュリティの記事

GoogleのCEOがやってる、スマホを使わない「月曜朝の習慣」(4/4)
https://www.google.com/amp/s/www.lifehacker.jp/amp/2204googles-ceo-sundar-pichai-has-a-remarkably-simple-monday-morning-rule-that-explains-why-hes-so-productive/

防衛省 契約企業により厳しいセキュリティー基準を義務づけ(4/1)
https://www3.nhk.or.jp/news/html/20220401/k10013562841000.html

ポルノサイト訪れた日本人を標的とした詐欺を確認、要注意(4/1)
https://news.mynavi.jp/techplus/article/20220401-2309311/

米Verizonのユーザー、自分の携帯電話番号からスパムSMSが届く(4/2)
https://www.zaikei.co.jp/article/20220402/666873.html

Google Playの「お支払いプロファイル」が機械的にブロックされたとの報告、SNSや掲示板を通じたGoogleへの異議申し立ても増加(3/31)
https://gigazine.net/news/20220331-google-play-blocked-1m-users-app/

サイバー「専守防衛」の穴　ウクライナ侵攻が映す脅威(4/2)
https://www.nikkei.com/article/DGXZQODE2810T0Y2A320C2000000/

Clubhouseで「保護されたプロフィール」設定が利用できるように(3/31)
https://jp.techcrunch.com/2022/03/31/2022-03-30-clubhouse-adds-new-protected-profile-setting-option-for-all-users/

外国製ソフト、使用禁止に　政府機関やインフラ対象―ロシア(3/31)
https://www.jiji.com/sp/article?k=2022033100812&g=int

サイバー警察局発足　「深刻化するサイバー犯罪」に重点、対処業務を追加(4/1)
https://www.itmedia.co.jp/news/spv/2204/01/news093.html

Googleが新しい追跡技術「トピック」をChromeに導入(4/1)
https://gigazine.net/news/20220401-google-chrome-privacy-sandbox-testing-topics/

Facebookのニュースフィードのバグにより「誤情報やロシアメディアのコンテンツ」の閲覧数が増加したことが判明(4/1)
https://gigazine.net/news/20220401-facebook-news-feed-bug/

2月はメルカリかたるフィッシング詐欺が倍増、6ヵ月連続で過去最多(4/1)
https://www.tsuhannews.jp/shopblogs/detail/68654

米国と EU 間でのデータ移転の新たな枠組みに関する発表を踏まえた EU 域内のビジネスに対する Google Cloud の取り組みの最新情報(4/1)
https://cloud.google.com/blog/ja/products/identity-security/how-google-cloud-helps-eu-companies-under-new-data-transfer-rules

アバランチは金融界を取り込めるか？：バルセロナ密着(4/2)
https://www.coindeskjapan.com/145154/

Rust Foundation、Rustコミュニティーの成長支える助成プログラム開始(4/1)
https://japan.zdnet.com/article/35185725/

「LastPass」と「1Password」を比較--自分に適したパスワードマネージャーはどちらか(4/2)
https://japan.zdnet.com/article/35185709/

日本のITは「江戸末期」 まずは試行錯誤認める環境づくりを(3/31)
https://business.nikkei.com/atcl/gen/19/00371/032800053/

ActiveStorageで管理するファイルをCloudFront署名付きCookieで限定配信(4/1)
https://qiita.com/zagvym/items/5bfabf1d8a261d143b48

【特殊詐欺情報】お客様サポートセンターと名乗りSMS「本日中にお電話ください」　福井県で4月1日確認(4/1)
https://www.fukuishimbun.co.jp/articles/-/1523697

チリーズ、新しいレイヤー1ブロックチェーンのテストネットを開始(4/1)
https://jp.cointelegraph.com/news/chiliz-launches-public-testnet-for-its-new-layer-1-blockchain

米国の州検事総長がTikTokとSnapに対して他社製ペアレンタルコントロールアプリに対応するよう要望(3/31)
https://jp.techcrunch.com/2022/03/31/2022-03-30-tiktok-snapchat-parental-controls-attorneys-general/
[clap-rs/clap]勝手に追加されるhelpサブコマンドを消す

## 概要
サブコマンドを有効化すると出てくる `help` の消し方がわからなかったので調べた。

``` sh
$ cli --help
cli 1.0

USAGE:
    cli <SUBCOMMAND>

OPTIONS:
    -h, --help       Print help information
    -V, --version    Print version information

SUBCOMMANDS:
    help     Print this message or the help of the given subcommand(s) ←こいつ！！
    sub-a    サブコマンドA
```

``` rs:main.rs
use clap::{Parser, Subcommand};

#[derive(Parser, Debug)]
#[clap(version = "1.0")]
struct Args {
    #[clap(subcommand)]
    action: Action,
}

#[derive(Subcommand, Debug)]
enum Action {
    /// サブコマンドA
    SubA
}

fn main() {
    Args::parse();
}
```

## 消し方
メソッドチェーンで定義してる場合は↓の指定を追加してやれば消えてくれる[^1]らしい。 (未検証)
``` rs
rootCmd.SetHelpCommand(&cobra.Command{Hidden: true})
```

[^1]: https://github.com/spf13/cobra/issues/587#issuecomment-810159087

### Deriveして使ってる場合
これが知りたかったのに直接それっぽい情報が見つからなかった..
clap の [Derive Reference](https://github.com/clap-rs/clap/blob/v3.1.8/examples/derive_ref/README.md) を調べてみると、引数でいろいろ指定できるらしいことが判明。
> Raw attributes: Any [Command method](https://docs.rs/clap/latest/clap/type.Command.html) can also be used as an attribute, see Terminology for syntax.
>
> e.g. #[clap(arg_required_else_help(true))] would translate to cmd.arg_required_else_help(true)

ざっと探してそれっぽいものを発見。
[`disable_help_subcommand(self, yes: bool)`](https://docs.rs/clap/latest/clap/struct.App.html#method.disable_help_subcommand)

追加して実行してみる。

``` diff:main.rs
#[derive(Parser, Debug)]
- #[clap(version = "1.0")]
+ #[clap(version = "1.0", disable_help_subcommand(true))]
struct Args {
```

``` sh
$ cli --help
cli 1.0

USAGE:
    cli <SUBCOMMAND>

OPTIONS:
    -h, --help       Print help information
    -V, --version    Print version information

SUBCOMMANDS:
    sub-a    サブコマンドA
```

消えてくれた！ めでたし🎉

## まとめ
Deriveだと細かい設定出来ないのかと思ってたけど、そんなことなさそうで良かった。
React 基本のstyleちょこっと

React Native
```
flex: 1
```
指定されているスペースと同じ、つまりその場いっぱいに適用される
```
flexDirection: "colum"
flexDirection: "row"
```
columはその中にある要素（ちなみにこれが子って言われるやつ）が縦に並ぶ
何も指定しなかったら勝手にcolumになる。
rowは要素が横に並ぶ

```
alignItems: "center"
alignItems: "flex-start"
alignItems: "flex-end"
```
予想つくかもやけど
上から中央揃え、左揃え、右揃え

```
justifyContent: "center"
justifyContent: "flex-start"
justifyContent: "flex-end"
```
これはflexDirectionの軸に対してどうやって寄せるか。。。？は？
つまりーーー箱が３つあってflexDirectionがcolumでflexDirectionがcenterだったら真ん中に箱が３つ縦に”画面のど真ん中で”並ぶ
flexDirectionがrowでflexDirectionがcenterだったら画面の真ん中で横に３つ並ぶってことやな

まあわからんかったら色んな組み合わせでやってる！！
ナップサック問題の解法 for Python

## ナップサック問題
ナップサック問題をPythonで解いてみた。

ナップサック問題はよくある問題で以下の通り。
>$N$個の荷物があり、荷物$i$は重さ$w[i]$、価値$v[i]$とする。許容重量が$W$で、許容重量を超えず、かつ価値が最大になるような荷物の選択をする。

## DPのメリット(フィボナッチ数列)
このナップサック問題の解法のポイントは、全てのパターンを計算せず前回の計算結果を使いまわそうということだ。これは、ナップサック問題だけの話ではなく、動的計画法（DP）で共通しており前回までの結果を使いまわして計算をしている。前回の計算結果を使い回し？当たり前じゃんと思うがこれが案外難しい。フィボナッチ数列を例に見ていく。


まずフィボナッチ数列は以下のようになっている。
```math
1, 1, 2, 3, 5, 8, 13, 21 …
```

```math
a_1 = a_2 = 1
```

```math
a_{n+2} = a_{n+1} + a_n (a \geqq 1)
```


フィボナッチ数列の$a_8$を計算する場合、DPを使わなかった場合だとこんな感じ。

$a_8 = a_7 + a_6$

$a_7$を求める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516848/af5d924c-1b8b-066a-b97c-533c3508f250.png)


$a_6$を求める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516848/314162ab-d1b5-be44-9896-bb29e47101a2.png)


これをもとの式に代入する。
$a_8 = a_7 + a_6$

この$a_7$を求めるときに$a_6$以下を再度計算しているが、この処理は重複しているので無駄。$a_6$の計算結果を$a_7$の$a_6$に代入したら、計算式はだいぶ楽になりますよね？ただ、$a_6$を使い回すのは簡単そうに見えるが、$a_5$、$a_4$、、、と使い回しをしないといけない。
DPを使用すると、この$a_7$を計算するときに$a_6$の結果を再利用できるので、その分計算処理が省け、レスポンスだったりメモリ消費を抑えることができるみたいなメリットがある。（他にも漸化式に近い形でプログラムが組めるので分かりやすい）



話をナップサック問題に戻して、とりあえず漸化式を見てみよう。

## 漸化式
$$
dp[i+1][j] = max(dp[i][j],dp[i][j-w[i]]+v[i])
$$

$dp[i+1][j]$では先行して$i$+1に記録している。そのため、$dp[i][j]$は$w_i$で前回記録された結果が参照される。dp[i][j-w[i]]+v[i]は今回の荷物の価値とそれ以外に入っている荷物の価値の合計である。


## 実装
```python
N = 3  # 荷物の数
W = 10  # ナップサックの許容量
w = [9, 6, 4] # 荷物それぞれの重さの配列
v = [15, 10, 6] # 荷物それぞれの価値の配列

# 次使用する配列に今回の結果を残すので+1している
dp = [[0]*(W+1) for i in range(N+1)] # DPの配列作成

for i in range(N):
    for j in range(W+1):
        if j < w[i]: # この時点では許容量を超えていないので選択しない
            dp[i+1][j] = dp[i][j] # ただ選択はしていないが、今回の情報をそのままi+1の方へ移す
        else:
            dp[i+1][j] = max(dp[i][j], dp[i][j-w[i]]+v[i])

print(dp[N][W])
```

出力結果として16が出力されたら成功。
つまり、重さが6+4=10になり、価値が10+6=16となる。
シェル芸本 問題3の別解1を解読する

[1日1問、半年以内に習得 シェル・ワンライナー160本ノック](https://gihyo.jp/book/2021/978-4-297-12267-6)を頑張ってほぼ毎日取り組む実践中。

問題3の別解1について、数字を小さくして理解に努める。

# 達成したいこと
1～10のファイルを作成する。
作成したファイル名の先頭に0をつけて、ファイル名を7桁にそろえる。

# 理解していく

1～10のファイルを作成する。
```shell
$ seq 10 | xargs -P$(nproc) touch
$ find
.
./4
./7
./9
./5
./8
./2
./10
./1
./6
./3
$
```

 - `find . | sed 's;^\./;;'`
⇒行の先頭(^)の「./」を置換して消す。
正規表現でスラッシュ（/）を使うため、今回は区切り文字としてs///ではなくs;;;（セミコロン）を使っている。@や_でもよい。
```shell
$ find . | sed 's;^\./;;'
.
4
7
9
5
8
2
10
1
6
3
$
```

 - `grep -v ^\\.$`
⇒行の先頭(^)が「\」で始まり、行の最後($)が「.」のやつ、以外を出力する。
（`-v`:あてはまらないものを出力するオプション）
```shell
$ find . | sed 's;^\./;;' | grep -v ^\\.$
4
7
9
5
8
2
10
1
6
3
$
```

 - `grep -v ^0`
⇒先頭が0でないものを表示する
```shell
$ find . | sed 's;^\./;;' | grep -v ^\\.$ | grep -v ^0
4
7
9
5
8
2
10
1
6
3
$
```

 - `awk '{print $1,sprintf("%07d",$1)}'`
`print $1`⇒ファイル名をそのまま出力
`sprintf("%07d",$1)`⇒先頭に0を足して全部で7文字になるようにしてファイル名を最後尾につけているっぽい？
`sprintf`は、 文字列をフォーマットして返す関数
```shell
$ find . | sed 's;^\./;;' | grep -v ^\\.$ | grep -v ^0 | awk '{print $1,sprintf("%07d",$1)}'
4 0000004
7 0000007
9 0000009
5 0000005
8 0000008
2 0000002
10 0000010
1 0000001
6 0000006
3 0000003
$
```

 - `xargs -n2 -P2 mv`
引数を2つずつ渡す。
`mv 引数1 引数2`
`mv 引数3 引数4`
:
となる。
```shell
$ find . | sed 's;^\./;;' | grep -v ^\\.$ | grep -v ^0 | awk '{print $1,sprintf("%07d",$1)}' | xargs -n2 -P2 mv
$ ll
合計 33660
drwxr-xr-x  2 emi emi 34459648  4月  4 01:53 ./
drwxr-xr-x 10 emi emi     4096  4月  4 00:39 ../
-rw-r--r--  1 emi emi        0  4月  4 01:27 0000001
-rw-r--r--  1 emi emi        0  4月  4 01:27 0000002
-rw-r--r--  1 emi emi        0  4月  4 01:27 0000003
-rw-r--r--  1 emi emi        0  4月  4 01:27 0000004
-rw-r--r--  1 emi emi        0  4月  4 01:27 0000005
-rw-r--r--  1 emi emi        0  4月  4 01:27 0000006
-rw-r--r--  1 emi emi        0  4月  4 01:27 0000007
-rw-r--r--  1 emi emi        0  4月  4 01:27 0000008
-rw-r--r--  1 emi emi        0  4月  4 01:27 0000009
-rw-r--r--  1 emi emi        0  4月  4 01:27 0000010
$
```

## 数を数える
 - `find | wc-l`
wcコマンドで、findの出力の行数をカウント
```shell
$ find | wc -l
11
$
```
※ファイル1～10と、カレントディレクトリで11

# 削除
`-U`：ソートしない。ディレクトリに含まれる順で表示する。
lsをそのまま実行するとソートされるため、処理を早くする目的で使う。
```shell
$ ls -U | xargs -P$(nproc) rm
$
```


# 参考

https://gihyo.jp/book/2021/978-4-297-12267-6

https://github.com/shellgei/shellgei160

https://userweb.mnet.ne.jp/nakama/
AWS認定SAPに合格したので教材・学習方法・感想などを書く

# 前提
* 2年前に<a href="https://www.udemy.com/course/aws-associate/">UdemyのSAA講座</a>と<a href="https://www.udemy.com/course/aws-knan/">SAA問題集</a>で学習し、AWS認定SAAを取得
*  1年半ほどのAWS業務経験

# 学習期間
５か月ほど（実際は毎日コツコツを１～２か月＋受験日１週間前の追い込み）（サボり期間あり）

# 学習教材・内容
・<a href="https://www.udemy.com/course/aws-53225/">UdemyのSAP問題集</a>の１～３回目をコツコツ、解説をよく読みながら２周
・<a href="https://aws.koiwaclub.com/exam/sap/">WEB問題集で学習しよう</a>の#1～#40、#55～#60を解説をよく読みながら１周、#41～#54、#61～#65を解答だけ先に見て気になる問題の解説をチェック

途中まではUdemyのSAAでお世話になった同じ講師の方が出しているSAPの問題集だけでなんとかしようと思っていました（Udemyはセールなら安いし買い切りタイプで講師によっては無料アップデートもあるのがいい）が、ふとレビューを見るとけっこうネガティブな意見も目立って受験日１週間前になって急に不安に。現状SAPの日本語教材が限られてるので、どれを選ぶかけっこう慎重にならざるを得ない。
調べると、WEB問題集で学習しようという月額課金の問題集サイトがけっこういいという合格体験記を見つけたので、受験日まで１週間前だったが急遽そっちに切り替えることに。こちらはAWS認定専用の学習サイトで、SAPの問題集が含まれるプロフェッショナルのプランだと、３か月単位で税込み約6,000円。他のプロフェッショナルや専門のAWS認定の問題も含まれていて、月々に換算すると約2,000円と考えると、それなりに良心的ではあるが、私のように追い込みでやるぶんにはもったいないだろう。やるなら計画的に利用したいところ。
ともかく、この問題集で１週間前から追い込みをかけた。実質的なインプットは過去のSAAの学習、業務経験、やりかけのUdemy問題集で、WEB問題集で学習しようでひたすらアウトプットと、少しのインプットをしていったという感じだ。WEB問題集のほうも中途半端な完了具合なのは、結局これをじっくりやりきる時間もなかったからだ。

# これから受験予定の方へ
## 教材について
じゃあ結局Udemyの問題集はよくなかったのかというと、途中で投げ出してしまった私には断定はできない。ただ、やりかけの状態でもWEB問題集を解く足がかりにはなっていたので、Udemy問題集だけでも対応できた気もする。ただ、前述の通りSAPの日本語教材がそもそも少なく、インプットが多いに越したことはないという理由でWEB問題集にも手を出すことになった。問題の量ではWEB問題集が勝るし、サイト内で合格体験記もあって実績がある安心感もあるので、これから受験予定の方へはWEB問題集をコツコツやるコースをおすすめしたい。気持ちUdemyのほうが問題の解説が親切だった気もするが、どちらの問題集もAWSのドキュメントや業務経験がないとなかなか理解しづらい部分はある。
## 学習の進め方について
とはいえ、プロフェッショナルレベルを受験する方はそこはクリアしている方が多いのではないだろうか。大変なのは触ったことがない、知らないサービスやアーキテクチャについてだ。まずはSAAや業務で触ったサービスの構築経験やAWSの特徴を思い出して、正解や誤った選択肢を見つけていくことが大事だ。あとはよくあるアーキテクチャやソリューションのパターン、個々のサービスをひたすら覚えてけば一応なんとかなります。急がば回れでちゃんとAWSドキュメント等も参照したほうが、応用も効くし業務でも役立つのは間違いないでしょうが、ともかく合格することが大事、という方はひたすら問題を解いてパターンを覚える、でも対応できます。
## 実際の試験について
WEB問題集がけっこういいと思われる理由の一つに、実際の試験にWEB問題集で解いた類題が出るというものがあります。サイト内の合格体験記を見ると何割くらい同じような問題が出ましたというような書き込みがありますが、人によってけっこうばらつきがあります。私に関して言えば見覚えがあったと感じたのは１割くらいあったかなという感じでした。なので脳死で問題を暗記して楽して合格、とはいかないです。いかないですが、部分的に見れば同じような問題、というケースがほとんどです。なのであとは集中力と読解力ですね。いかに問題をよく読んで、AWSサービスの使い方に結び付けられるか。正解がわからなくてもある程度選択肢を絞ることができるケースがほとんどなので、そういう練習をする意識でWEB問題集のほうも解いていけば、本番で初めて見るアーキテクチャがあったとしても、冷静に対処できると思います。
[Python]キーを入力するたびに音を鳴らすやつ（初投稿）

# キーを入力するたびに音が鳴るやつ作りてぇ

初投稿です。
ある日、youtubeを見てたらクールなキーボードを投稿している人がいたので自分も簡易的に作ってみました。
簡単ですので是非作ってみてください

うわさのキーボード
https://www.youtube.com/watch?v=mE548N0yfvg

# 環境

OS: Win11
python 3.8.3
使用するモジュール
- pygame
- keyboard

音声出力してくれるやつとキー入力を監視してくれる便利なモジュールです。
これpipしてあげたらもうほぼ完成です。

 # コード

以下のコードをメモ帳かなんかに貼って実行してみてください。

```Python
# キー入力を監視するモジュール
import keyboard
# 音声を出してくれる便利なモジュール
from pygame import mixer
import random

# 音声の入ってるパスをsound_listに格納してください。
sound_list = []

# パス入れてあげると音声がなる関数
def sound(path):
    mixer.init()
    mixer.music.load(path)
    mixer.music.play()

while True:
    # キーが押されたのか確認
    if keyboard.read_key():
        # ランダムにsound_listの添え字部分を選択
        rand = random.randint(0, len(sound_list))
        sound(sound_list[rand])
    else:
        continue
```

# 最後に
　どうだったでしょうか？
　くだらなかったでしょう。マークダウン記述も初めてだったのですごく雑な感じになってしまいましたが一回は投稿してみたいと思っていたためよかったです。次はもっと勉強していい記事を書こうと思うのでよろしくお願いしますぅ。。
世界最高の翻訳サービスを個人で開発した話【meta翻訳】

# はじめに
この度は個人で[meta翻訳](https://meta-school.web.app/)という翻訳サービスを開発しました。
![スクリーンショット 2022-04-03 23.47.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434805/b60e9b04-e63c-f707-8004-1afbc6cb8e40.png)
現在Google翻訳を筆頭に、機械翻訳サービスは乱立していて、業界としてレッドオーシャンだと思いますが、meta翻訳は複数ある翻訳サービスの中でも日本語⇄英語の翻訳では最高精度だと自負しております。

なので、個人でも頑張ればレッドオーシャンに突っ込めるくらいの機械学習サービスを開発できるというお話しをしたいと思います。

※個人開発とは思えないくらい高精度なので是非一度使ってみてください。


# meta翻訳の精度
まず初めにmeta翻訳の精度を簡潔に紹介したいと思います。
### 専門的な文章を翻訳する場合
![スクリーンショット 2022-04-03 22.53.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434805/d141bbab-80b7-06af-09f8-cb326a45cc15.png)

「storm surge」など、専門的な単語にきちんと対応できています。
また、「power」が「電力」と訳されているように、専門的な文脈も識別して翻訳します。

### 口語的な文章を翻訳する場合
実は専門的な文章よりも口語的な文章の方が機械翻訳では難しかったりします。
下の表のように超細かいネイティブのニュアンスを再現して翻訳します。
![スクリーンショット 2022-04-03 22.51.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434805/a1b91754-efc3-31e9-d290-43cb142b2aa0.png)

「やっぱ(男子より)女子がいいわ」という文に対して「prefer」という比較のニュアンスを持った単語をチョイスしていたり、「way to go」などの表現が出てきていたり、開発者の想像を超えた精度です。
私の調査の範囲ではこれ程の翻訳を出来ているサービスは他にありませんでした。



# 個人で開発するにあたって
meta翻訳開発にあたって、大まかに3つの部分を開発する必要があります。
- フロントエンド
- バックエンド
- 機械学習モジュール

個人開発では労力の配分が本当に重要で、これらに対する労力の配分はおよそ**1:1:98**です。
機械学習サービスである以上、機械学習モデルの精度があくまで最重要です。

つまり、フロントエンドとバックエンドの開発でいかに楽をするのかが肝要と考えます。

## フロントエンド、バックエンドの開発
機械学習モジュールはPythonで開発されるケースが大半なので、翻訳APIにはPythonを使用し、その他の部分にはJavaScript(React)、Firebaseを使用して開発しました。

機械学習サービスを個人開発する場合、この組み合わせは強く推奨します。
(細かいフレームワークは自分が開発しやすいものを採用すれば良いと思います)

中でも、Firebaseは個人開発のデファクトスタンダードだと思います。
個人的には以下の理由から推しています。

- データベースをいちいち作成しなくて良い
- デプロイが簡単(インフラの知識がなくてもコマンド一発)

その他にもFirebaseが神たる所以は山ほどありますが、素晴らしい記事が大量にあるので、本記事では割愛します。


## 機械学習モジュールの開発
### 知識のインプットと実証の重要性
meta翻訳開発に際してキーになったと考えるプロセスは
*「論文を読んで実装・実験するサイクルを回す」*
ことです。
このサイクルの高速化と実験管理も当然肝要です。

私自身、meta翻訳開発にあたって数百本論文を読みました。
しかし、これら全てを実装するわけにもいきません。
実装する前には、「実装の手間」と「精度の改善幅の予想」を念入りに天秤にかけていました。

### モデルの評価の重要性
論文を読んだりしていると、機械学習っぽい感じがしますが、モデルの評価はより重要です。
学習したモデルのエラーを分析し、改善の為のアルゴリズムを随時実装します。


# 最後に
翻訳業界でも海外サービスが猛威を奮っており、「日本語くらい日本発のサービスで」という心意気で開発を始めました。
とはいえ、開発当初は、海外サービスに対抗したり、上回ったりできるサービスを開発できるのか自分でも疑問に思うことは多々ありました。

おそらく、同じ気持ちで開発を断念されたサービスは水面下に無数にあると思います。
このような疑念で開発の手を止める人が多くいると思い、今回この記事を書くに至りました。

この記事を読んでいただき、少しでも多くの方の開発の手が進み、良いサービスが生まれる一助となれば幸いです。

[twitter](https://twitter.com/goto_yuta_)や[meta翻訳の技術記事](https://meta-school.web.app/articles)では、具体的にmeta翻訳のアーキテクチャに採用した論文の話や、機械学習のトレンドなどについても触れていこうと思っておりますので、よければご覧になってください。
PulsarとWebSocketを使って緊急地震速報配信サーバを構築

# はじめに
あくまで今回構築したシステムは趣味＆学術研究のためであり、商用利用などは想定していないのでご承知おき下さい。

# 今回作ったシステムを使うには
https://github.com/mizofumi/Namazu
上記のページにてAPI等を公開しているのでお試し下さい。

# 防災科研のデータについて
```
http://www.kmoni.bosai.go.jp/webservice/hypo/eew/yyyyMMddHHmmss.json
```
ここにリクエストをすると、緊急地震速報に関する電文が取得出来ます。

# 問題点
上記のURLを直接呼び出すとなるとクライアントの台数に比例して防災科研側のサーバに負荷を掛けてしまいます。  

# 対応
防災科研のデータを叩く代表サーバを用意し、WebSocket等で配信する方法を取れば負荷をなるべく掛けずに利用する事ができます。

# 構築したシステム
![namazu-detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55941/dfced04c-37e2-562a-9595-7b5c22a0f711.png)

# システムの特徴
- [Pulsar](https://pulsar.apache.org/)
    - もともとYahoo.Incで開発されたメッセージングPFで現在はApache Software Foundationに移管され管理されているPFです。
    - 特徴
        - 順番が保証されている
        - 1対多数の配信に向いている
        - スケーラブルである
        - 簡単（個人的感想）
 
防災科研のデータを取りに行き、そのままメッセージング配信しています。 そうする事でWebSocketサーバの負荷が高まりスケールアップが必要となった場合でもPulsarとの繋ぎ込みに関しては設定など特に必要はなくボタン一つで対応可能になっています。

```kotlin: 配信側
val client = PulsarClient.builder()
    .serviceUrl("pulsar://pulsar.hoge.net:6650")
    .build()
var stringProducer = client.newProducer<String>(Schema.STRING)
    .topic("eew")
    .create()
while (true) {
    try {
        stringProducer.send("配信データ")
    } catch (e: InterruptedException) {
        e.printStackTrace()
    }
}
```


```kotlin: 受信側 
val client = PulsarClient.builder()
    .serviceUrl("pulsar://pulsar.hoge.net:6650")
    .build()
val consumer: Consumer<*> = client.newConsumer()
    .topic("eew")
    .subscriptionName(UUID.randomUUID().toString())
    .subscribe()
while (true) {
    val message = consumer.receive()
    println(message)
}
```
コード見てもお分かり頂けるかと思います。特に配信側はPulsarへ送信するコードのみで、WebSocketのサーバを指定せずとも送信出来ています。
AVAssetExportSession#shouldOptimizeForNetworkUseは何をしているのか

# はじめに

iOSには動画ファイルを簡単にエンコードするための[AVAssetExportSession](https://developer.apple.com/documentation/avfoundation/avassetexportsession)クラスがあります。このクラスを利用して動画をエンコードするにあたり設定する項目に[shouldOptimizeForNetworkUse](https://developer.apple.com/documentation/avfoundation/avassetexportsession/1390593-shouldoptimizefornetworkuse)というものがあります。まずはドキュメントを読んでみましょう。
`ムービーをネットワーク用に最適化するかどうかを示すブール値`
この説明を読むと、ローカルではなくネットワーク上に配置した動画ファイルの再生に一役買ってくれそうなものだと考えられます。

# 考察

動画の配信方法には、大きく2つの方法「プログレッシブダウンロード」と「ストリーミング配信」があります。
プログレッシブダウンロードは、再生するクライアントに動画ファイルをまるまるダウンロードして再生する方法で、ストリーミング配信は、細切れの映像を受信し再生する方法となります。
AVAssetExportSessionでは1つの動画ファイルが出力されるため、前者のプログレッシブダウンロード用の設定となります。

プログレッシブダウンロードは、再生するために動画ファイルそのものをダウンロードする必要があり、動画ファイルのデータサイズが大きいと、再生するまでに時間がかかる欠点があります。
その欠点を補うものとして、Fast Startなるものがあります。
動画ファイルの中身は、ftyp・mdat・moovといったもので構成されており、mdatが映像や音声、moovは動画のサイズや再生時間などの情報が入っています。
プログレッシブダウンロードは、動画の先頭データから順次ダウンロードするため、moov情報が読み込めるまでは動画の再生ができません。
そのmoov情報を早めに読めるようにしようというのが、Fast Startです。
通常は、mdatの後にmoovといった順番ですが、moovの後にmdatという順番にすることで、動画情報を先に読み込み、データが読み込めたところから順次動画を再生することが可能となります。

# 確認

では、実際に`shouldOptimizeForNetworkUse`でmdatとmoovの順番が入れ替わっているかテストしました。
mp4ファイルの解析は、[こちら](https://github.com/ThePalaceProject/ios-audiobooktoolkit/blob/main/NYPLAudiobookToolkit/Utils/MediaProcessor.swift)をお借りして、下記サンプルファイルで`shouldOptimizeForNetworkUse`を書き換えてテストしてみた結果、`true`のときに`moov`が先になっていることを確認できました。

```
guard let session = AVAssetExportSession(asset: asset, presetName: AVAssetExportPreset1280x720) else {
    return
}
            
let outputUrl = URL(fileURLWithPath: NSTemporaryDirectory())
   .appendingPathComponent(UUID().uuidString)
   .appendingPathExtension("mp4")

session.shouldOptimizeForNetworkUse = true
session.outputFileType = .mp4
session.outputURL = outputUrl

session.exportAsynchronously {
    switch session.status {
        case .completed:
        let result = MediaProcessor.fileNeedsOptimization(url: outputUrl)
        NSLog("\(result ? "true" : "false")")        
    default:
       break
    }
}
```

# 参考文献
- https://video-knowledge.com/moov_atom
- https://qiita.com/satken2/items/d14b4113fe3fb5f5597b
- https://github.com/ThePalaceProject/ios-audiobooktoolkit
SQLiteでデータベースを作成してみた

SQLiteを使ってみた。
SQLiteはSQL文を記述しなくてもデータベースが作成できるので、
初心者にもピッタリだ。
この形式をGUI（Graphical User Interface）というらしい。

非エンジニアの人が操作するには直感的な操作でないと躓く可能性が高いので、
自分達が開発するサービスもこの思想を忘れないようにしようと思う。
Vueでモデルを図に描きたい

# Vueでクラス図を描きたい
Vueで作成しているアプリケーション上に、メタ情報をもとにモデルの関連などをクラス図のように描画してみたいと考えて、なにか楽に描く方法が無いか探してみた。

## クラス図みたいなものが描けそうなライブラリ
探すといろいろあるが、ぱっと使えそうなのを2つほど簡単に紹介する。
### [mermaid](https://mermaid-js.github.io/mermaid/#/)
- 簡単なテキスト構文でいろいろ図を描けるライブラリ
- オンラインでいろいろと試せるサイトもある。[Live Editor](https://mermaid-js.github.io/mermaid-live-editor/edit)

- [vue-mermaid](https://github.com/robin1liu/vue-mermaid)というVueのコンポーネントも発見
        - 最近は更新されていない？新しい機能は動かないかも？

### [nomnoml](https://nomnoml.com/)
- 簡単なテキスト構文でUML Diagramsを描けるライブラリ
- [nomnoml](https://nomnoml.com/)こちらもサイト上でいろいろと試せる。
- 構文をざっと見たところ、フォントサイズやらパディング、色などの調整もできそう。
- Vueのコンポーネントは見つからなかった。
    - Vueコンポーネントを作って、試している方のサイトは見つかった。
        - [UML描画ライブラリnomnomlでテーブルのER図を作成](https://johobase.com/nomnoml-table-er-diagram/)
- SVGか、canvasに描画する機能がある。

## とりあえず必要そうな機能
手始めに下記くらいがあると、メタ情報から図を描けそう。
- 関連線として下記があると良い
    - association
    - generalization
    - implementation
- 多重度として、関連先がOneかManyくらいは描けるとよい
- モデルの属性は描けたほうが良い
- メソッドは描けなくてもよい
- ステレオタイプ

### 比較
|比較項目| mermaid | nomnoml |
|:-:|:-:|:-:|
|association| 〇 | 〇 |
|generalization| 〇 | 〇 |
|implementaton| 〇 | 〇 |
|cardinality| 〇 | 〇 |
|attributes| 〇 | 〇 |
|methods| 〇 | 〇 |
|stereotype|〇|×|

## ライブラリの決定
nomnomlは使ったことが無かったので、これを機会に使ってみようかと思ったのだが、ステレオタイプのつけ方がわからなかったのと、mermaidのほうはコンポーネントをそのまま使うとちょっと楽ができそうなので、今回は、vue-mermaidを使って図を描いてみることにした。

## vue-mermaidのインストール
```console
$ yarn add vue-mermaid
```
インストールしてから気づいたが、（選定時にちゃんと見ていなかった・・・）vue-mermaidのバージョンは0.0.15。ちょっとだけ不安になる。

## vue-mermaidではクラス図は描けなかった
- flowchart用のライブラリだったorz
- サイトにもそう書いてあったし、サンプルもフローチャートしか載ってなかった。
- 楽しようとしたら、ちゃんと見ていなかったせいで、無駄な回り道になってしまった。

## 方向転換して、nomnomlを使ってみる。
### nomnomlのインストール
```console
$ yarn add nomnoml
```

### canvasにサンプルを描いてみる
参照できるようにrefをつけておく。
```javascript
<template>
  <div>
    <canvas ref="nomnomlCanvae" />
  </div>
</template>
```

```typescript
getCanvas (): HTMLCanvasElement {
  return this.$refs.nomnomlCanvas as HTMLCanvasElement
}
```

下記みたいな感じで、canvasを指定してdrawを呼び出せば描画される模様。
```typescript
import nomnoml from 'nomnoml'

drawDiagram (source: string): void {
  const canvas = this.getCanvas()
  nomnoml.draw(canvas, source)
}
```
nomnomlのページに載っているサンプルの一部を描画してみる。
下記の文字列をsourceに指定（改行は'\n'で）して、drawしてみる。
```
[Pirate|eyeCount: Int|raid();pillage()|
  [beard]--[parrot]
  [beard]-:>[foul mouth]
]
```
![nomnomlSample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1563969/662139c3-9ab8-1197-255c-c0db2092893f.png)

# まとめ
nomnomlを使って、図を描くことはできた。ステレオタイプは描き方がわからないが、それ以外は特に問題はなく使えそうである。
mermaidは初めに調べたコンポーネントはクラス図を描くのには使えなかったが、
後で調べたところ、vue-mermaid-stringというコンポーネントでやりたいことができそうであった。
次の機会に、mermaidそのまま使ってみたり、vue-mermaid-stringを使ってみたりしようと思う。
Java SEアプリケーションにHTTP Server機能を組み込みたい(Grizzly編)

この度、個人ブログを閉鎖することなり、一定のアクセスがあった記事を記録として遺すことにしました。
以下は、2020年4月14日に投稿した記事の写しです。この記事がこの世の誰かの助けとなることを願います。

JavaでWebというと、warファイルをAPサーバに搭載してみたいな運用が多いと思いますが、
Java SEアプリケーションにHTTP Serverとしての機能を組み込みたい、といった要件を提示されることも多々あります。

GrizzlyはJava EEアプリサーバのGlassFishで採用されているHTTPサーバの実装ライブラリで、Java SEアプリケーションに単体で組み込むこともできます。

公式サイト
https://javaee.github.io/grizzly/

公式のサンプルほぼそのままですが、Mavenプロジェクトでの実装例を記載します。

まずは、pom.xmlに以下の通り追記して保存します。
```xml
<dependencies>
	<dependency>
		<groupId>org.glassfish.grizzly</groupId>
		<artifactId>grizzly-http-server</artifactId>
		<version>2.4.4</version>
	</dependency>
</dependencies>
```
Grizzlyを使用するために必要なライブラリが自動的ダウンロードされプロジェクトに取り込まれます。
うまくいかない場合は、おおよそWebプロキシが原因なのでsettings.xmlに然るべき設定をしてリトライしましょう。

次に新規クラスを作成してmainメソッドを以下の通り記載します。
```java
package net.xamarinian.examples;

import java.nio.charset.StandardCharsets;

import org.glassfish.grizzly.http.server.HttpHandler;
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.grizzly.http.server.Request;
import org.glassfish.grizzly.http.server.Response;
import org.glassfish.grizzly.http.util.ContentType;

public class GrizzlyMain {

	/**
	 * Java SEアプリケーションにHTTP Serverを組み込むサンプル(Grizzly版)
	 * @param args
	 */
	public static void main(String[] args) {
		// リッスンポート8080でサーバインスタンスを生成
		final HttpServer server = HttpServer.createSimpleServer();
		// サーバにハンドラを登録
		server.getServerConfiguration().addHttpHandler(
				new HttpHandler() {
					@Override
					public void service(Request request, Response response) throws Exception {
						String data = "Hello Grizzly!!";
						response.setContentType(ContentType.newContentType("text/plain", "UTF-8"));
						response.setContentLength(data.getBytes(StandardCharsets.UTF_8).length);
						response.getWriter().write(data);
					}
				}, "/grizzly");

		try {
			// HTTP Server開始
			server.start();
			System.out.println("Press any key to stop the server...");
			System.in.read();

		} catch (Exception e) {
			e.printStackTrace();

		} finally {
			server.shutdownNow();
		}
	}
}
```

mainメソッドの実装が終わったらさっそくアプリケーションを実行してみます。
サンプルのHttpServerへはhttp://localhost:8080/grizzly からアクセスすることが可能です。
Webブラウザからも当然アクセス可能ですが、PowerShellのInvoke-WebRequestコマンドレット(curl)を使うとヘッダ情報まで確認できて便利です。

```powershell
PS C:\Windows\system32> curl http://localhost:8080/grizzly


StatusCode        : 200
StatusDescription : OK
Content           : Hello Grizzly!!
RawContent        : HTTP/1.1 200 OK
                    Content-Length: 15
                    Content-Type: text/plain;charset=UTF-8

                    Hello Grizzly!!
Forms             : {}
Headers           : {[Content-Length, 15], [Content-Type, text/plain;charset=UTF-8]}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 15
```
TextCellをカスタマイズしたい。


この度、個人ブログを閉鎖することなり、一定のアクセスがあった記事を記録として遺すことにしました。
以下は、2018年5月23日に投稿した記事の写しです。この記事がこの世の誰かの助けとなることを願います。

TableViewなどで使用するTextCellをiPhoneの設定アプリっぽくカスタマイズしました。
当初、Cellに「>」をつけるのにも画像とか用意しないといけないのかなーとか思ってましたがそんなことはありませんでした。なお、本記事の内容はiOS向けの内容となっています。
![20180523084554.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243237/9a64f23a-a9ab-7924-8b59-098c1482bf18.png)

### TextCellのサブクラスを作成
TextCellを直接カスタマイズすることも可能ですが、組み込みのクラスを直接いじるのは気が引けるので今回はカスタマイズ用のサブクラスを作成することにします。といっても、TextCellを継承するだけで特に何を設定する必要もありません。

```cs
usisng Xamarin.Forms;

namespace TableViewSample
{
    public class MyTextCell: TextCell
    {
    }
}
```

### カスタムレンダラーの作成
次にMyTextCellのカスタムレンダラーをiOSプロジェクトの中に作成します。TextCellのカスタムに使用するカスタムレンダラーは、TextCellRendererとなっています。
https://docs.microsoft.com/ja-jp/xamarin/xamarin-forms/app-fundamentals/custom-renderer/renderers

```cs
using TableViewSample;
using TableViewSample.iOS;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(MyTextCell), typeof(MyTextCellRenderer))]
namespace TableViewSample.iOS
{
    class MyTextCellRenderer : TextCellRenderer
    {
        public override UITableViewCell GetCell(Cell item, UITableViewCell reusableCell, UITableView tv)
        {
            return base.GetCell(item, reusableCell, tv);
        }
    }
}
```
ここまでは、Visual Studioのクイックアクションでほぼ全自動で作成することができます。

### TextとDetailを横並びにする
TextとDetailを横並びのレイアウトにカスタマイズするには、カスタムレンダラーのGetCellメソッドに以下の様に書き換えます。
```cs
public override UITableViewCell GetCell(Cell item, UITableViewCell reusableCell, UITableView tv)
{
    var tvc = reusableCell as CellTableViewCell;
    if(tvc == null)
    {
        tvc = new CellTableViewCell(UITableViewCellStyle.Value1, item.GetType().FullName);
        tvc.Cell = item;
    }
    return base.GetCell(item, tvc, tv);
}
```
ここで一番重要なのは、UITableViewCellStyle.Value1の部分、ここがTextとDetailを横並びにするという指定になっています。なお、TextCellの既定値はUITableViewCellStyle.Subtitleです。UITableViewCellStyleの詳細については、以下の記事が大変参考になりました。
http://mikamiz.jp/dev/iphone/a0012.html

### アクセサリーをつける
次にTextCellの右側の「>」マークを付けます。DisclosureIndicatorと言うらしいです。
```cs
public override UITableViewCell GetCell(Cell item, UITableViewCell reusableCell, UITableView tv)
{
    var nativeCell =  base.GetCell(item, reusableCell, tv);
    nativeCell.Accessory = UITableViewCellAccessory.DisclosureIndicator;
    return nativeCell;
}
```
アクセサリーには、ほかにもチェックマークとかも設定できます。

### 設置する
TableViewのIntentプロパティにSettingsを設定すると、よりiPhoneの設定アプリっぽくなります。
```xml
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:TableViewSample"
             x:Class="TableViewSample.MainPage"
             Title="設定">

    <TableView Intent="Settings">
        <TableSection Title="基本設定">
            <local:MyTextCell Text="始業時刻" Detail="9:00" />
            <local:MyTextCell Text="終業時刻" Detail="18:00" />
            <local:MyTextCell Text="休憩時間" Detail="1:00" />
        </TableSection>
    </TableView>

</ContentPage>
```
Googleフォームの「事前入力したURL」を動的に生成する

# tl;dr

1. GoogleフォームAPIの [GET https://forms.googleapis.com/v1/forms/{formId}
](https://developers.google.com/forms/api/reference/rest/v1/forms/get) を使う
2. 1のレスポンスデータを元に、以下の要領でURLを組み立てる

```text
<responderUriの値>?usp=pp_url&entry.<questionIdを10進数に変換した値>=<設定したい値をURLエンコードした値>
```

# 背景：Googleフォームの「事前入力したURL」を動的に生成したい

Googleフォームには入力欄にあらかじめ値を設定した状態でフォーム画面を表示させる機能がある。
これはGoogleフォームのUIの「事前入力したURLを取得」という機能から作ることができる。

この機能は便利なのだが公式提供はUIでの操作のみで、APIは提供されていない。
そのためプログラムで動的に作成することが面倒くさく、実現するにはページのhtmlを解析して必要なパラメーターを見つけ出さなければならなかった。

さて、最近[GoogleフォームのAPIが一般公開](https://workspaceupdates.googleblog.com/2022/03/google-forms-api-generally-available.html)となった。
GoogleフォームのパラメーターがAPI経由で取得することができるようになったのだから「事前入力したURL」も従来より楽に作れるだろうなと思いやってみた。
結果少し癖がある箇所はあったが、思ったとおり簡単に作れたのでその記録をしためておく。

# やり方

今回は作成したGoogleフォームの `申し込みチケットID` という回答欄にチケットのIDを事前入力する例を考える。事前入力するチケットのIDは `イ 49-1番` とする。

すでにGoogleフォームの項目は作成済みで、formIdはわかっているものとする。

はじめに [GET https://forms.googleapis.com/v1/forms/{formId}
](https://developers.google.com/forms/api/reference/rest/v1/forms/get) を叩いてGoogleフォームのパラメーターを取得する。
取得に成功すると以下のようなJSONがレスポンスとして返ってくる（値は少し変えてある。）

```json
{
  "formId": "...",
  "info": {
    ...
  },
  "settings": {
    ...
  },
  "revisionId": "...",
  "responderUri": "https://docs.google.com/forms/d/e/1FAIAQNCdz3HwapvTAuZY3qHHjgwMT2vUdaEugk991xPvxxb6sijnBLQ/viewform",
  "items": [
    {
      "itemId": "...",
      "title": "申し込みチケットID",
      "questionItem": {
        "question": {
          "questionId": "7c6cb33e",
          "textQuestion": {}
        }
      }
    },
    {
        ...
    }
  ]
}
```

1. レスポンスからベースとなるURL `responderUri` を探す。今回は `https://docs.google.com/forms/d/e/1FAIAQNCdz3HwapvTAuZY3qHHjgwMT2vUdaEugk991xPvxxb6sijnBLQ/viewform` である
1. URLの末尾に固定値 `?usp=pp_url` を足す
1. レスポンスから "申し込みチケットID" の回答欄の質問ID `questionId` を探す。今回は `7c6cb33e` である。なお、 `itemId` はまた違う値なので取り違えないように注意する。
1. `questionId` の値を16進数とみなし、16進数 -> 10進数変換を行う。今回は `7c6cb33e` -> `2087498558` となる。
   なお、 `questionId` は「16進数8桁」の書式のようなので、値の頭が0から始まることもある。進数変換ロジックによっては注意が必要。
1. URLの末尾に、 `&entry.<questionIdを10進数に変換した値>=` を足す。 今回は`&entry.2087498558=` を足す
1. URLの末尾に、「"申し込みチケットID"に設定したい値をURLエンコードした値」 を足す。今回は `イ 49-1番` -> `%E3%82%A4%2049-1%E7%95%AA` を足す

-> **最終的に以下のURLを得る**

`https://docs.google.com/forms/d/e/1FAIAQNCdz3HwapvTAuZY3qHHjgwMT2vUdaEugk991xPvxxb6sijnBLQ/viewform?usp=pp_url&entry.2087498558=%E3%82%A4%2049-1%E7%95%AA`

# おわりに

16進数 -> 10進数に変換しないといけないものの、おおむね簡単に作成することができた。
基本情報技術者試験対策　23日目

基本情報技術者試験勉強　23日目
-
この記事の目的
-
今年の5月に基本情報技術者試験を合格するために、過去問で間違えた箇所をただまとめる自分のための記事

プロフィール
-
・文系大学の３年生
・ITパスポートは保有
・ウェブアプリやサイト作成を個人で行ったことがある程度
・猫好き

今日の目標
-
テクノロジ系とマネジメント系を取り組み、7割取る。

間違った箇所
-
1、3層クライアントサーバシステム
プレゼンテーション層　→ WEBブラウザ
ファンクション層　→ WEBサーバ
データ層　→ DBMSとデータベース

2、SMP(Symmetric Multiple Processor)型マルチプロセッサ
命令が実行される段階で、どの演算機を使うかをどう的に決めながら、複数の命令を同時に実行する

3、クロック周波数
秒間に何回のクロックが発振されるかを表す数値でプロセッサの性能指標
クロック周波数によってCPUの命令実行タイミングが変化する。クロック周波数が高くなるほど命令実行速度が上がる。

4、COCOMO(Constructive Cost Model)
ソフトウェアを見積もりで、予想されるプログラム行数にエンジニアの能力や要求の信頼性などのの整形数を掛け合わせて開発工数や期間、余韻、生産性を見積もる手法

5、ACID特性
Atomicity（原子性）
トランザクション内の処理が全て実行されるか、または全く実行されないことを保証する

Consistency（一貫性）
トランザクションによりデータの矛盾が生じない

Isolation（独立性）
複数のトランザクションを同時に実行した場合と、順番に実行した場合の結果が等しくなることを保証

Durability（永続性）
一旦正常終了したトランザクションの結果は、以後システムに障害が発生しても失われないことを保証する

6、アクチュエータ
エネルギー発生源からの¥パワーを制御信号に基づき、回転、並進などの動きに変換する

7、動的解析
検体をサンドボックス上で実行し、その動作や外部との通信を観測する

8、モノリシックカーネル
OSの中核部分であるカーネルに様々な機能を持たせる設計手法

振り返り
-
テクノロジ系とマネジメント系の問題を30問解いた。じっくり読めば理解できたが、それでは時間が足りないため、何回も解く必要がある。
次回も引き続き、テクノロジ系とマネジメント系の問題を解く。あとは、午後の問題にも少しずつ取り組む。


>引用
基本情報技術者試験ドットコム
https://www.fe-siken.com
TableViewの下のViewの高さが確保できない場合の対処

この度、個人ブログを閉鎖することなり、一定のアクセスがあった記事を記録として遺すことにしました。
以下は、2018年7月15日に投稿した記事の写しです。この記事がこの世の誰かの助けとなることを願います。

iOSでTableViewとかListViewの様なスクロールできるViewの下にContentViewを設置するとHeigthRequestで指定した高さを確保できない場合があります。

例えば、TableViewの下に高さ50のContentVIewを設置する以下の様なXAMLを書いてみます。

```xml
<StackLayout Spacing="0">
    <TableView Intent="Settings">
        <TableSection Title="TableSection">
            <TextCell BindingContext="{x:Reference bottom}" Text="HeightRequest" Detail="{Binding HeightRequest}"/>
            <TextCell BindingContext="{x:Reference bottom}" Text="Height" Detail="{Binding Height}"/>
        </TableSection>
    </TableView>
    <ContentView x:Name="bottom" HeightRequest="50" BackgroundColor="Lime" />
</StackLayout>
```
実行結果は以下の通りです。
![20180715172757.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243237/7d3192a3-4022-17b6-74af-b0a8b674c120.png)
出典元は忘れてしまったので、なぜこうすべきかなどの説明はできませんが
TableView要素にRowHeight="-1" HeightRequest="-2"を追記することで解決します。
```xml
<StackLayout Spacing="0">
    <TableView Intent="Settings" RowHeight="-1" HeightRequest="-2">
        <TableSection Title="TableSection">
            <TextCell BindingContext="{x:Reference bottom}" Text="HeightRequest" Detail="{Binding HeightRequest}"/>
            <TextCell BindingContext="{x:Reference bottom}" Text="Height" Detail="{Binding Height}"/>
        </TableSection>
    </TableView>
    <ContentView x:Name="bottom" HeightRequest="50" BackgroundColor="Lime" />
</StackLayout>
```
![20180715173338.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243237/4c558d5e-22d7-4ad8-f890-a2d6e5afabe7.png)
正直、一見しても良くわからないくらいの差なのですが、画面下にAdmobのバナーを設置したい場合などは、広告のフォーマットが変わったりするので注意が必要かと思います。
![20180715174059.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243237/5e5bdfc6-010e-97d5-e3b4-0caf1f2544ae.png) ![20180715174102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243237/0b23caa1-7679-1b0e-4c9c-3577ed317dbb.png)
（メモ）Google Cloud Storageのストレージクラスについてまとめてみた

Google Cloud Storageのストレージクラスについてまとめてみました。
仕事では Multi-Regional (Standard Storage) しか使ったことがないので知っておく意味も込めて。
- https://cloud.google.com/products/storage/
- https://cloud.google.com/storage/docs/storage-classes

## ストレージクラス
バケットを作る際に指定することができる。それぞれで課金方法やSLAが異なる。
以下の内容は、すべてのストレージクラスに適用される。
- 最小オブジェクト サイズのない無制限ストレージ。
- 世界中のユーザー補助と世界中のストレージの場所。
- 低レイテンシ（最初のバイトの転送時間は一般的に数十ミリ秒）。
- 高い耐久性（99.999999999% の年間耐久性）。
- データがマルチリージョンまたはデュアルリージョンに格納されている場合は、地域的な冗長性。
- Cloud Storage の機能、セキュリティ、ツール、API による一貫したエクスペリエンス。

## 価格
保存する容量と、アクセス回数で課金されます。
- https://cloud.google.com/storage/pricing

## 使い分け
基本的には Standardクラスを使っていればOK。
アーカイブや、決まった時期（ex:定期的）に必要になるデータ（監査データ等）についてはNearline、Cold Storage、Archive Storageを考慮する。

## Standard Storage
_（説明）ウェブサイト、ストリーミング動画、モバイルアプリなど、アクセス頻度が高い「ホット」データに適しています。_
最小保存期間: なし

基本的にはこれを選んでおけばOK。
最小保存期間がないので、一時的にアップロードするファイル等にも利用できる。
SLAはリージョンだとSLAが99.9%、マルチリージョンだと99.99%。

## Nearline Storage
_（説明）低料金。データのバックアップやロングテールのマルチメディア コンテンツなど、少なくとも 30 日間保存できるデータに適しています。_
最小保存期間: 30日

1ヶ月に1回くらいアクセスされるデータに向いている。
例えば、月1回のレポートを作る時だけ参照されるデータ等。
SLAはリージョンで99.95%、マルチリージョンでは99.9%になります。

## Cold Storage
_（説明）非常に低料金。障害復旧など、少なくとも 90 日間保存できるデータに適しています。_
最小保存期間: 90日

Nearlineよりも低頻度でアクセスされるデータに向いている。
4半期ごとに作るレポートなどに使えそう。
SLAはNearlineと同じ。

## Archive Storage
_（説明）最低料金。規制に伴うアーカイブなど、少なくとも 365 日間保存できるデータに適しています。_
最小保存期間: 365日

基本的に集計されないログ（リーガル案件等）などに適用するのが良い。
SLAはNearlineと同じ。

# おまけ
オンプレや他のクラウドサービスからGoogle Cloud Storageに向けてデータを転送するための方法があります。

## Storage Transfer Service
_（説明）Cloud Storage への高性能なオンライン データ転送経路を提供するもので、データ転送プロセスを簡略化するために必要なスケーラビリティと速度を備えています。_

例えばS3に置かれているデータをGCSに転送したい、だけど容量が100TBあります、といった場合に向いている。（1Gbpsでも数日かかる）
ドキュメントによると、10TB〜に向いている、とある。
- https://cloud.google.com/storage-transfer/docs/overview?hl=ja

## Transfer Appliance
_（説明）オフラインでのデータ転送の場合、Transfer Appliance は、データセンターにある配達可能なストレージ サーバーとなり、取り込み拠点に配達された後、データが Cloud Storage にアップロードされます。_

1PBなどStorage Transfer Serviceでも対応しきれないデータに使う。
オンプレ（ex: 自社のデータセンターのHDFS上のデータなど）に適用できる。
10〜30日程度かかる。
- https://cloud.google.com/transfer-appliance/docs/4.0/overview?hl=ja
デプロイ時に「No space left on device」が出た時の対処法

# 前提条件
Rails 6.1.3
Ruby 2.6.5
# エラーメッセージ
```
DEBUG [c2dc48df] 	不能: No space left on device
tar: vendor/bundle/ruby/2.6.0/gems: mkdir 不能: No space left on device
```

# 結論
このコマンドを打てばいいです。

```サーバー環境
$ sudo rm -rf /var/www
```
```
$ sudo mkdir -p /var/www/$APP_NAME
```

```
$ sudo chown `whoami`:`whoami` /var/www/$APP_NAME
```

# 補足

```
$ df -i
ファイルシス   Iノード  I使用   I残り I使用% マウント位置
devtmpfs        121336    292  121044     1% /dev
tmpfs           123584      2  123582     1% /dev/shm
tmpfs           123584    366  123218     1% /run
tmpfs           123584     16  123568     1% /sys/fs/cgroup
/dev/xvda1     4193216 344034 3849182     9% /
tmpfs           123584      1  123583     1% /run/user/1001
```
残りのinodeの使用率を確認できます。
```
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         474M     0  474M    0% /dev
tmpfs            483M     0  483M    0% /dev/shm
tmpfs            483M   25M  459M    6% /run
tmpfs            483M     0  483M    0% /sys/fs/cgroup
/dev/xvda1       8.0G  5.7G  2.4G   71% /
tmpfs             97M     0   97M    0% /run/user/1001
```
df -hでディスク容量の使用率を確認できます。
# 参考記事
[no space left on deviceとなった時の対応方法](https://qiita.com/ponsuke0531/items/edf2eee638202aa7f61f)
[デプロイ先ディレクトリの設定](https://qiita.com/take18k_tech/items/5710ad9d00ea4c13ce36#56-%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E5%85%88%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AE%E8%A8%AD%E5%AE%9A)
[]()
[]()
[]()
[]()
[]()
[]()
[]()
[]()
[]()
[]()
[]()
[]()
[]()
Goのコンパイラバージョンアップ手順

`Go`のコンパイラをバージョンアップする際の変更点やコマンドのメモです

# バージョンアップ
## `go.mod`ファイル

`go.mod`でmodule管理している場合は`go mod edit`コマンドで`go.mod`ファイルでの`Go`のバージョンを変更します。

以下のように`1.17`が指定されていたとして`1.18`に更新する場合は、
```go:go.mod
module sample-app

go 1.17
```

次のコマンドを実行します。

```bash
$ go mod edit -go=1.18
```

再び`go.mod`ファイルを確認すると`1.18`になっていることが確認できます

```go:go.mod
module sample-app

go 1.18
```

## `Dockerfile`

`Dockerfile`は手で書き換えます。

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

```diff:Dockerfile
- FROM golang:1.17.8-buster
+ FROM golang:1.18.0-buster
```

## CI

`circleci` / `github actions`の設定ファイルも手で書き換えます。

```diff:.circleci/config.yml
docker:
-  - image: golang:1.17.8-buster
+  - image: golang:1.18.0-buster
```

```diff:.github/workflows/go.yml
with:
-  go-version: 1.17
+  go-version: 1.18
```

# 動作確認

```bash
$ go version
go version go1.18 linux/arm64
```

`docker-compose`で開発している場合コンテナを削除して新しく作らないと古いコンテナを参照してしまいバージョンが更新されないケースがあるので注意してください。

```bash
$ docker-compose stop
$ docker-compose down
```
外部ディスプレイが認識されない!(そういえば、最近windows11に更新したな...)

# 起こったこと
windowsのノートパソコンが、HDMI接続の外部ディスプレイを認識しなくなった。
* DELL G3(intel COREi5 10TH GEN, メモリ16GB, NVIDIA GeForce GTX 1650)
* BENQ GW2280-T

# 流れ
ある日突然、外部ディスプレイが認識されなくなりました。
再起動、ドライバの更新などを試みてみましたが、特に何も起こらず。
そのうち、windows11にアップグレードしたことが原因だと気づきました。

# 対処
結局、windows10にダウングレードすることによってこの問題は解決しました。

具体的な手順としては、[こちらのサイト](https://pc-karuma.net/downgrade-from-windows-11-to-windows-10/)にある手順でやってもらえれば問題ないと思います。

設定→システム→回復→復元　とするだけだったので、簡単でした。
【Unity】PUN2でローカルオブジェクトをネットワークオブジェクトに切り替える

# はじめに
Photonを利用する際にネットワークオブジェクトを生成する場合、``PhotonNetwork.Instantiate``を利用する方法が一般的に知られていますが、この方法では既存オブジェクトのネットワークオブジェクト化ができないので、公式の手動インスタンス化のソースコードを少し修正してできるようにしてみました。

# 事前準備
+ Photonサーバーへ``OnJoinRoom``イベント発生まで接続できるようにしておく。
+ ネットワークオブジェクト化したいGameObejectに``PhotonView``と``PhotonTransFormView``コンポーネントをアタッチしておく。
+ ``PhotonTransFormView``のプロパティの``UseLocel``をFalseに設定しておく。
![screenshot.310.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/989fee4f-ed2c-500b-bc38-bd247ec6ae2b.png)


# ソースコード
以下のスクリプトを対象のオブジェクトにアタッチし、OnJoinedRoom以降のタイミングで``SpawnGameObject()``を呼び出す。
```c#:Local2NetworkObject.cs
   /// <summary>
    /// 既存オブジェクトのネットワークオブジェクト化
    /// </summary>
    public void SpawnGameObject()
    {
        PhotonView photonView = GetComponent<PhotonView>();
        photonView.ViewID = 0; // 0はID未設定として扱われる。InspectorViewでは0に設定できないのでここで設定しておく。この行がないと次の行でエラーになる。
        PhotonNetwork.AllocateViewID(photonView); // ViewIDを割り当てする。
        if (photonView.ViewID != 0)
        {
            // ViewID割り当て成功
            object[] data = new object[]
            {
            transform.position, transform.rotation, photonView.ViewID
            };

            RaiseEventOptions raiseEventOptions = new RaiseEventOptions
            {
                Receivers = ReceiverGroup.Others, // 自分以外に送信
                CachingOption = EventCaching.AddToRoomCache // ルームキャッシュにオブジェクト生成イベントを登録
            };

            SendOptions sendOptions = new SendOptions
            {
                Reliability = true // 到達保障有効
            };

            // 他プレイヤーに対してゲームオブジェクト生成イベントを発行する
            PhotonNetwork.RaiseEvent(SpawnGameObjectEventCode, data, raiseEventOptions, sendOptions); // SpawnGameObjectEventCodeには任意のbyte値を設定しておく。
        }
        else
        {
            Debug.LogError("ViewID割り当て失敗");
        }
    }

    /// <summary>
    /// 既存オブジェクトのネットワークオブジェクト化イベントの受信
    /// 発信者以外はこちらの処理のみ実行される
    /// </summary>
    public void OnEvent(EventData photonEvent)
    {
        // イベントの種類を判定
        if (photonEvent.Code == SpawnGameObjectEventCode)
        {
            object[] data = (object[])photonEvent.CustomData;

            Debug.Log((Vector3)data[0]); // 座標
            Debug.Log((Quaternion)data[1]); // 回転
            Debug.Log((int)data[2]); // ViewID

            // 他プレイヤーの元ローカルオブジェクトのインスタンス化
            GameObject player = Instantiate(prefab, (Vector3)data[0], (Quaternion)data[1]);

            // 元ローカルオブジェクトの同期設定
            PhotonView photonView = player.GetComponent<PhotonView>();
            photonView.ViewID = (int)data[2];
        }
    }
```
kotlin booleam型 で使われる【&&】【||】論理演算子についてのメモ

# 初めに
論理演算子についてメモがわりに記事を残します
論理演算子という単語自体やその意味などを忘れた時のために残します

# 論理演算子について
論理演算子はそれを挟む二つのものを比較するもので、trueもしくは、falseで返されます


# 説明
&&　は　両方がtrue であれば　trueを返します
〜〜__かつ__　〜〜　であれば　true

例：
```
if(0 < 10 && 5 < 20)
```
結果は　true
***

||　は　どちらかがtrue であれば　trueを返します
〜〜__または__　〜〜　どちらかがtrueなら　true

例：
```
if(10 < 0 || 5 < 20)
```
結果は　true


# 最後に
簡単にではありましたが、自分用のメモとして記事を残しました
論理演算子は、論理演算子の使われた式が何をしたい式なのかを明確にするために必ず覚えておきたい
基礎的な知識ですのでこの記事を見ることがなくなるようにさらに理解を深め自分のものにしたいですね
化石エンジニアの野良リカレント教育～マイナスからKaggleを始める～

# 前提
数学力・統計力・技術力がほぼすべて「ゼロより低い、マイナス」の化石エンジニア・アンモナイトがエンジニアとしての生き残りを目指して~~賞金が欲しくて~~ 、Kaggleに挑戦する。
たぶん、Kaggleに挑戦する記事の中で、もっともレベルが低いと思う。
そもそも、なんでKaggleに挑戦するのかとゆーと、下記のよーなリカレント教育（大人の再教育）プランを考えているからです。

アンモナイトが考えた化石エンジニアの進化論：

ふりだし：「アンモナイト＝太古の海中でたゆたってる化石エンジニア・Lv3」
　→アジャイル開始：Done!
　　→社外コミュニティ参加：Done!
　　　→スクラム経験：Done!
　　　　→CSM取得：Done!
　　　　　→常識（他社研修視聴）：Done!
　　　　　　→知識の深堀り＝Kaggle：in progress
　　　　　　　→知識の深堀り＝アプリ作成：To do
　　　　　　　　→あがり：陸上（肺呼吸）：人権を得る

あれ、こうやってフェーズ分けすると、意外と「あがり」が近いな？
そう思った方へ、下記をご参考までご確認ください。
　・双六の怖ろしいところは「ふりだしに戻る」がトラップとして散在しているところです。
　・将棋がチェスよりも複雑と言われるのは、将棋は駒を相手に取られて自駒にされてしまうからです。

つまり、人生、実力がつかなきゃ（実力があっても）いつでもふりだしに戻る可能性があり、かつ、身につけた・完全に理解したと思った知識・実力があっという間に陳腐化する可能性がある。
そして簡単に一行でまとめられている「Kaggle」と「アプリ作成」はタスクレベルに細分化すればとてつもねえ数のステップと時間と労力がかかるとやがて判明するハズ。
うん、これから先に待ち受けるリスクを完全に理解した。←自分が数分前に考えた教訓すら活かせないタイプの人生

# 1：現在の状況
で、課題になってるKaggleだが、ありがたい御本のおかげで以前、チュートリアルコンペの『タイタニック号』はクリア済である。
もっとも、写経以前の作業しかしていないため、なんでうまくいったのか、全く理解できていない。
つまり、Pythonでの機械学習の実践知はKaggleのアカウントを作った時と全く同じ、「ゼロ」である。
今回から、『タイタニック号』のコードの詳細を本格的に検討し、理解を試みる。
ナビゲーターとなってくださる御本は下記。いつもありがとうございます。

『PythonではじめるKaggleスタートブック』
https://www.amazon.co.jp/dp/4065190061
![PythonではじめるKaggleスタートブック_書影.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1668633/df4cbca8-1765-868e-8301-0a21defd4c48.jpeg)
（書影は版元ドットコム様）

# 2：本日のお題
ズバリ、『タイタニック号』の理解。これに尽きる。
ていうか、サブミットしておいて、まだ理解がゼロってどういうことなの？　あの熱狂の夜を忘れたっていうの？　無責任よ！

いや、一応、御本をサブミット部分までは読み、「なるほどなー」と感心し、サブミット＆自分の順位を確認するところまではやった。
やったけど、コードの内容は理解してない。御本通りにサブミットしただけだから。
あと、ここ一年くらい記憶力がマジでヤバくて、ごめん、あの夜のことはほぼ覚えていない。

そもそもアンモナイトは『タイタニック号』の内容を激しく勘違いしてて、課題を「タイタニック号をどのように事故から救うか・事故を防ぐか」だと思ってたくらいの認識能力しかない。これはPythonだのKaggleだの以前の問題で、早とちりというか、自分が「こうだったらいいな！」と思った妄想を事実だと信じ込んでしまう残念な理解力というか、物事にあまり疑問を抱かない性格というか、まぁ、こんなんだから、社畜になったり、化石になったりするのである。

では、初めての遠足のよーにフレッシュな気持ちで元気良く、Kaggleログインからいってみよー！

# 3：気づきと学び

気づき：
……Pythonのコードではなく、御本の日本語が理解できない。いや、コードもふんわりとしかわからんが。
ひたすら御本の解説とコードの間を行ったり来たりして、読解と理解に努めたが、特徴量を求めるための探索的データ分析というワードが、もうわからん。わからんというか、なんだろう、実体験として現実味が持てない。
以前、これと同じ感覚を味わったことがある。そう、初めてKaggleに挑戦し、挫折した時だ。
　（→で、足りない知識を補おうと、他社研修を視聴することにした）
つまり、まだ機械学習についてのインプットが足りないのだ。
機械学習というより、統計の知識かもしれない。

逆に手前の、データ確認してデータを整備するところはすんなりわかった。DB周りではよくやってたし、0と1しか持てないなら、列を増やすしかないとかはまったく疑問なし。
データを確認するの、本当に大事。●年前、スパゲティコードを引き継いだ時、動かないSQLが何本も入ってて、「サーバー上で全然SQLの結果を見ていないと何が起きるか」を身を削って学習したので、データ処理系の作業は絶対にデータを確認するようにしていた。当時は自己流で手探りだったので、すべての列でソートして欠陥・欠落・異常値を確認、最大値・最小値の確認、列数・行数を確認、目視結果とSQLの結果が一致することを確認、なんかをやってた。
本当に結果を確認しないで机上だけでSQL書くのはやめてほしい。ダメ、絶対。呪いと恨みの連鎖にしかならん。

学び：
とりあえず今日、理解したKaggleのコンペの取り組み方の流れは下記。正しい理解かどうか、怪しいが。

　提供データの概要を確認する（Pandas Profiling）
　　→データ確認＆データの整備
　　　→特徴（特徴量）を洗い出すために探索的データ分析を行う（項目ごとに生存率との関連を調べる）
　　　　→仮説探し（EDA)
　　　　　→仮説立てる
　　　　　　→仮説検証する（データ作ってみる）
　　　　　　　→回答のサンプルデータと突き合わせて正誤判断？
　　　　　　　　→サブミット？

そもそもこの流れでええんかい？？
自慢じゃないが、アンモナイトはタイタニック号を救う課題だと思ってたくらい思い込みが激しい頭脳の持ち主である。
上記の流れも「激しい思い込み」の可能性が高い。（でもSQLは確認する。マジで寿命が削られるから）

「今日のところはこれくらいにしてやんよ！」と完璧な負け犬のセリフとともに、御本を閉じ、ログアウト。
今回はいまのITの常識的なところというより、Kaggleの取り組み方で理解ができない箇所なので、つまづいたところを調べて深堀りするより、まずは御本を1周することで全体像をつかんだほうがいいと思った。

本日は以上で終わりです。お付き合いいただき、ありがとうございました！
Eclipseを利用時の小ネタ

# はじめに
こんばんわ、きりです。
本記事はEclipseを利用する上での小ネタを備忘録としてまとめたものとなります。

徐々に増やしていくことを想定した記事となります。

# ヒープメモリのサイズ変更
eclipse.iniの以下の値を追加または変更する
```
#2GBの場合
-Xmx2048m
```
Twitterクローンを作ります #0 はじめに

# はじめに

こんにちは。あぽろです。
Twitterのクローンを作っていきます。
GitHubのリポジトリは[こちら](https://github.com/apollo-devel/toitta)
一応[こちら](https://toitta-dev.web.app/)で動作の確認ができますが、書き溜めている記事がたくさんあるので記事にない機能がいろいろ実装されています。
また、バグが残っていたり急にサービスがとまったりデータを消したりする可能性が多分にあります。

# 予定
[udemyの講座](https://www.udemy.com/course/create-a-twitter-clone-with-nodejs-socketio-and-mongodb/)(Create a Twitter Clone with Node.js, Socket.IO and MongoDB) をベースに、利用技術などを自分なりにアレンジして作って行こうと思います。
今の所、下記のような感じで考えています。

- フロントエンドはVue 3
- UIはUIkitを利用 (Twitterと同じ見た目にはしない)
- apiはflask
- DBはMongoDB
- 実行環境はCloud Run + Firebase Hosting

チュートリアル的な感じで書いていこうかなと思っていましたが、膨大すぎてただの開発日記になっちゃいました。

# 各記事へのリンク
ここに各回のリンクが追加されていく予定です。

[Twitterクローンを作ります #1 プロジェクト作成](https://qiita.com/apollo-devel/items/def109a697b768903494)
[Twitterクローンを作ります #2 ユーザー登録機能 (1)](https://qiita.com/apollo-devel/items/104c5d86f6cddc0f4a33)
MAMP(ポートが原因)でバーチャルホストが動作しない場合の解決方法

MAMP(ポートが原因)でバーチャルホストが動作しないとき

/etc/hosts
はポートの設定まで出来ないため
MAMPは80ポートを接続する設定にしておく

MAMPでポート80に変更して起動するとき
既に80ポートを使われていると起動エラーとなる
使われていると80ポートを表示させkillする

80ポートを使ってるプロセス数を表示させるコマンド
lsof -i :80

切断コマンド
kill -9 プロセス数

MAMPを起動させる。
/etc/hosts
が正常に動作しバーチャルホストで表示される

参考URL
https://qiita.com/xiaoxiao/items/9e5686a4b02b34929c8b
NewSQL output

## はじめに
データベースとは、アプリケーションのデータを保存・蓄積するためのひとつの手段です。
大量のデータを蓄積しておいて、そこから必要なデータを抜き出したり、更新したりすることが柔軟に行われるため、多くのデータを必要とするアプリケーションで欠かすことはできません。

今回はそのデータベース機能を、アプリケーションから簡単に扱えるようにした「データベース管理システム(DBMS)」(データベースの検索や整理を行う専門のソフトウェア)のoutputをしていきたいと思います。

## NewSQLとは

NewSQLとは、RDBMSとNoSQLの両方の強みを取り入れたデータベースです。

そのためRDBMSの強みをもっているNewSQLは、MySQLやOracle、PostgreSQLのようにクエリーも使えて運用できるため外部結合もでき、複雑なテーブルのデータを連携し出力が可能です。

また、NoSQLの強みも取り入れているため１つのDBで複数台のサーバー同士を連携しスケールさせて大規模な情報を処理することも可能になってきます。

NoSQLは、RDBMSが対応できない部分を改善するために生み出されたため、NoSQLとRDBMSには処理速度やデータの分散化といた分野で得意不得意が有りました。
その両者の悪い部分をなくすためのNewSQLが誕生しました。

RDBMSとNoSQLにどのような特徴があるか見ていくことでその両者の強みを持ったNewSQLの理解が深まりやすいと思うので
RDBMSとNoSQLの紹介をしていきたいと思います。

## RDBMSとは

RDBMSは(Relational Database Management System)の略で、関連性のあるデータを表形式で紐づけて管理するデータマネジメントシステムです。データベースのやりとりには、MySQLyやOracle、PostgreSQLのようにSQLという言語が使用されます。

RDBMSでは表形式のデータのまとまりをテーブル、項目をカラムと呼び、商品についてのデータをまとめている場合、商品テーブルを作り、その中に商品番号・商品名・商品IDというカラムを作成し、データを格納するという感じです。

各カラムは別のテーブルと紐づける事が可能で、上の例を使うと商品IDと商品の販売店舗テーブルを紐づける形です。

このようにテーブル同士を関係づけて複雑なデータ構成にも対応する事ができます。

メリットとしては、データ処理の一貫性が保証されている・処理コストを低減させる事が可能・複雑なデータ構成での検索や集計を正確に引き出すことができる、というメリットがあります。

## NoSQLとは
NoSQLはNot only SQLの略で、RDBMS以外のデータベースシステムを表す際に使用されます。RDBMSが対応しきれなかったような所を改善するために開発されており、SQL言語を使用しなくてもデータベースを使用する事が出来ます。

 

一般的にNoSQLはキー・バリュー型のデータベースを指して使用される事が多いです。キー・バジュー型はその名の通りキーに値が付いたシンプルなデータベース構造で、商品１＝りんご、商品２＝みかん、といった感じです。

他にもXMLやJSONといったデータ構造を容易に変更することができるドキュメント型のものなど、様々なサービスが有ります。

メリットとしては、データの処理速度が早い・拡張がしやすい、というメリットがあります。
【TidalCycles】State Valuesの値によってエフェクトを変える

# はじめに
TidalCyclesのバージョン1.7.2からState Valuesが使えるようになりました。

http://tidalcycles.org/docs/patternlib/tutorials/state_values/

これによってリズムパターンとは独立にn, pan, gainなどの値をコントロールできるようになりました。詳しくは上のドキュメントを見てください。

# どんなときにState Valuesを使うといいか

たとえば以下のコードを実行すると、"newnotes"が再生されるごとにState Values "harold"が1ずつ増えていきます。

```haskell
d1 $ s "newnotes(5,8)" # nCount "harold" # gain 1
```

この"harold"は参照することができ、例えば次のようにするとharoldの値が使えます

```haskell
d2 $ s "newnotes*16" # n "^harold" # gain 0.6
```

このd1とd2を合わせたサウンドは、State Valuesを用いないで実現しようと思うと難しいと思います。このState Valuesの更新と参照を行うことでアイデアの幅が広がります。

# State Valuesの値を元にエフェクト変えたりできないか

上の例では、State Values "harold"の値を直接そのまま利用しただけでした。

ただ、「"harold"が10以上になったらこのエフェクトをかけたい」みたいな欲望がでてくると思います。

これは以下のようなコードで実現できます。

```haskell
capply func condpat effectpat = every
    (fmap func (segment 1 condpat)) (effectpat)

do
  d1 $ s "newnotes(5,8)" # nCount "harold" # gain 1
  d2
    $ capply (\x -> if x >= 10 then 1 else 0) (cF 0 "harold") (# room 0.4)
    $ s "hc*4"

```

"harold"の値が10以上になったときに、"hc"に対してroomリバーブがかかるようになります。

ちなみに現在のharoldの値を見たいときは

```haskell
getState $ "harold"
```

で確認できます。