OmniAICreator/Qiita-1.07M huggingface dataset:
ASP.NET: DropDownListのスタイル変更

##SAMPLE 
未選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51324/bc8e107a-5697-9452-bd2d-4cf4f4738456.png)

選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51324/538a354b-4b18-06c3-12cb-327c9805008a.png)

## REFERENCE
出典不明

## html 
```html
<div>
    <asp:DropDownList ID="List1" runat="server" Width="200px" Height="100px" BackColor="#080808" ForeColor="#ffffff" Font-Names="Andalus" CssClass="ddl" Font-Size="30px" AutoPostBack="True" >
    <asp:ListItem Value="">MENU1</asp:ListItem>
    <asp:ListItem Text="ITEM1"></asp:ListItem>
    <asp:ListItem Text="ITEM2"></asp:ListItem>
    <asp:ListItem Text="ITEM3"></asp:ListItem>
    </asp:DropDownList>
    <asp:DropDownList ID="List2" runat="server" Width="200px" Height="100px" BackColor="#080808" ForeColor="#ffffff" Font-Names="Andalus" CssClass="ddl" Font-Size="30px" AutoPostBack="True" >
    <asp:ListItem Value="">MENU2 </asp:ListItem>
    <asp:ListItem Text="ITEM1"></asp:ListItem>
    <asp:ListItem Text="ITEM2"></asp:ListItem>
    <asp:ListItem Text="ITEM3"></asp:ListItem>
    </asp:DropDownList>
    <asp:DropDownList ID="List3" runat="server" Width="200px" Height="100px" BackColor="#080808" ForeColor="#ffffff" Font-Names="Andalus" CssClass="ddl" Font-Size="30px" AutoPostBack="True" >
    <asp:ListItem Value="">MENU3 </asp:ListItem>
    <asp:ListItem Text="ITEM1"></asp:ListItem>
    <asp:ListItem Text="ITEM2"></asp:ListItem>
    <asp:ListItem Text="ITEM3"></asp:ListItem>
    </asp:DropDownList>
</div>
```

## css
```css
.ddl
{
    text-align: center;
    border:2px solid #7d6754;
    border-radius:5px;
    padding:10px;
    -webkit-appearance: none; 
/*    background-image:url('Images/任意のファイル');*/
    background-position:88px;
    background-repeat:no-repeat;
    text-indent: 0.01px;
    text-overflow: '';
}
```
iOS13でモーダルを重ねたときのナビゲーションバーの高さがおかしい問題

仕事で作っている多店舗チェーン店のコミュニケーションを解決するアプリ「[売場ノート](https://apps.apple.com/jp/app/売場ノート/id854461811)」をiOS13に対応しました。

ご存知のとおり、iOS13になるとモーダル表示する画面はiPhoneの全画面にモーダル表示されるのではなく、下の画面の上に若干小さくなって重なる表示になります。

この挙動は、Segue のPresentation のデフォルト値が FullScreen から Automatic に変わったためなので、iOS12以前と同じ表示にしたければこれを FullScreen にすればいいのですが、下へのスワイプで画面を閉じるジェスチャーがあまりにも便利なので Automatic に対応することにしました。

### モーダルを重ねるとナビゲーションバーの高さが変になる

作ってみると、モーダルからさらにモーダルを開くシーンで、２枚目のモーダルの UINavigationBar の高さが以下のように小さく表示されてしまいます。

![capture.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131496/a862baf7-4e42-cf7d-a716-21a2a2fca2b5.gif)

### 解決方法

モーダルで表示される側のビューの、```viewWillAppear(_ animated: Bool)``` において、ナビゲーションバーを非表示にしてすぐに表示すると直ります。

```swift
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
        
    // [HACK]
    // iOS13 iPhone でふたつめのモーダルとして重なると
    // UINavigationBar のサイズ計算がおかしく、バーの下に隙間が空いて描画される。
    // このタイミングで非表示・表示を繰り返すと直せるのでこの処理を追加。
    if #available(iOS 13.0, *) {
        self.navigationController?.isNavigationBarHidden = true
        DispatchQueue.main.async {
            [weak self] in
            if let wself = self {
                wself.navigationController?.isNavigationBarHidden = false
            }
        }
    }
}
```

他にも、ダークモードにも対応したり、iPadOS の Safari の User-Agent 文字列が macOS の Safari とまったく同じになったりと今回のアップデートはいろいろと勉強させてもらいました。

Happy hacking life!
とりたい資格とその目的





どれも各分野の入り口として学習し
今後の方針を定めるための情報収集します

戦略として、１年目はとにかくインプットを増やすことが
その後のキャリア形成にも良いと思われるので。
今はわからないことが多すぎて何も判断できません、、、

おすすめの資格があったら教えてください



##基本情報技術者試験

◆日々の業務の理解を深める
◆広く浅い知識を身に着ける

※2019年10月20日試験に申込済


##UMTP
L1からチャレンジします
https://umtp-japan.org/

◆システム設計の際に役立つ合理的な思考方法の獲得（モデルベース思考法）
　思考の枠組みの一つとして仕入れておきたい
◆現在参加中のプロジェクトがスムーズではないと感じられるため
　どうすればスムーズになるかわかったらいいなという希望もある

取得目標：2019年11月末まで


▽参考になりそう
>UMTP L3に合格しました。
https://takachan.hatenablog.com/entry/2015/04/08/234354


##AWS 認定ソリューションアーキテクト

アソシエイト
https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/

◆インフラの知識を深める　
　システム開発にインフラ知識は必須なので……

取得目標：2019年12月末まで


▽参考になりそう
>AWS認定ソリューションアーキテクト・アソシエイトを1週間で合格した必勝法【2019年最新】
https://takulog.info/how-to-get-aws-solution-architect-associate/

>インフラ知識ゼロの２年目プログラマーがAWS SAAに１ヶ月で合格した方法
https://qiita.com/MayForBlue/items/b8dbc86780f202f02407

 
>AWS 認定試験に備える（公式）
https://aws.amazon.com/jp/certification/certification-prep/
HTML & CSS (Flexbox編)

#Flexboxとは
・縦、横並びができる。
・折り返しを付けられる。

##横並び
###display:flex
　指定した要素の子要素を横並びにする。
　↓
　**親要素(ul)**に`display:flex`をかける。
　子要素(li)が横並びになる

```css
ul {
 display:flex;
}
```

###flex:auto
　要素の幅を親要素に合わせて伸縮させることができる。
　↓
　**子要素(li)**に`flex:auto`をかける。

```css
ul {
 display:flex;
}
li {
 flex:auto;
}
```
###flex-wrap:wrap
　子要素のサイズ(width)に応じて**折り返す**。
　↓
　**親要素**に`flex-wrap:wrap`
　**子要素**に`width`を設定する。(%で)

例えば、2列にしたいときは、子要素に`width:50%;`を付ける。

##縦並び
###flex-direction:column
　子要素を**上から下へ**並べる。
　↓
　**親要素**に`flex-direction:column`を付ける。
　子要素に`margin:0 auto`、`width`を設定すると**中央寄せ**できる。
特定のポート番号を使用するプロセスを一括killするワンライナー

ゾンビプロセスを駆逐するワンライナー。

## 特定のポートを使用しているプロセスを調べる。

~~~bash
$ lsof -i:ポート番号
COMMAND   PID USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
ruby    37922 xxxx    xx  IPv4 xxxxxxx      xxx  TCP xxxxx:xxxxxx (ESTABLISHED)
~~~

## PIDだけ出力する。

~~~bash
$ lsof -ti:ポート番号
37922
~~~

## 一括kill

~~~bash
$ lsof -ti:ポート番号 | xargs kill -9
~~~

### 参考にしたサイト

- [How to write a shscript to kill -9 a pid which is found via lsof -i](https://askubuntu.com/questions/346394/how-to-write-a-shscript-to-kill-9-a-pid-which-is-found-via-lsof-i)
rails new してから git commit -m 'first commit' までの手順まとめ

## はじめに
技術検証とかで新たに rails プロジェクトを作成する際に、毎回同じようなコマンドを叩いていたのでまとめてみました。
こんなことやらずに docker を使えって言われたらそれはそうなんですが、それはそれ。

## 試したバージョン情報
- rbenv: 1.1.2
- Ruby: 2.6.4
- Rails: 6.0.0

## 実行すること
### プロジェクトファイルの作成

```shell
$ mkdir new_project
$ cd new_project
```

### ruby最新化

```shell
$ brew update && brew upgrade ruby-build 

# 0.0.0 には latest version を入れる(latest versionはググる)
$ rbenv install 0.0.0

# 0.0.0 には latest version を入れる
$ rbenv local 0.0.0

```

### rails のセットアップ

```shell
$ bundle init

# 0.0.0 には latest version を入れる
$ echo 'gem "rails", ">=0.0.0(latest version)"' >> Gemfile

$ bundle config set --local path 'vendor/bundle'
$ bundle install

# optionとして ` --api  --skip-test --skip-turbolinks --skip-coffee` などを指定。
# ここでは `--skip-turbolinks` を例で使用していますが turbolinks が憎いわけではありません。
# その他の option は、 `rails new -h` で確認。
$ bundle exec rails new . --skip-turbolinks

```
### git の設定

```shell
$ git init

# gitignore は次のものををそのままコピペ `https://github.com/github/gitignore/blob/master/Rails.gitignore`
$ vim .gitignore

$ git add .

$ git commit -m 'first commit'
```

終わり
自己紹介

#1 中の人
職業：データアナリスト（機械学習はド素人のためサイエンティストとは名乗れない）
前職：R&D（自動車部品の要素開発：データ分析との出会い）
前々職：臨床工学技士（いわゆるMEとかCEとか呼ばれてる奴。最近はECMOで知名度が上がる）
将来：まずはジュニアレベルのデータサイエンティストになりたい（願望）。

大学時の専攻：臨床工学｛（医学部＋工学部）/2 ｝みたいな感じの学部
　　　　　　　何故かC++の初歩もB1でやってた。
大学院の専攻：先端医療機器開発　→　（教授と喧嘩しM2時中退（笑））

現状学んでる学問：統計学、工学（流体、粉体、円運動、波動、材料、信頼性、熱力学）
　　　　　　　　　進化医学、認知行動療法、生理学、経済学、投資、数学
学んでる言語：R, Python, Stan, SQL（Juliaにも手を出そうとしたが混乱しそうなので・・・）
やってた言語：C++
　　　　　　（卒業研究以来触っていない。生理学のイオンチャネルシミュレータの研究でしたね）

趣味：何かを学ぶこと、人の行動を観察すること、論文を読むこと（主に海外）、アニメ鑑賞、
　　　アニメ聖地巡礼、コミケ参加（一般、サークル、スタッフ経験あり）、筋トレ、瞑想

性格：協調性無し（個人主義）、新しいもの好き、合理的主義

#2 Qiitaをどのように使っていくか
1.学んだことの忘備録（かつそれを分かりやすく説明）
　頭の中に入れるにはOutputが重要かつ人に分かりやすく説明することがより良い方法。

2.エンジニアとして働いていくとは何かを考えていく（科学的に、心理学的に）
　割とこの世は統計的。

3.技術論文・本の紹介
　おもしろそうな論文・本をPickupして紹介


こんな人間です。よろしくお願いしまーす。
NVIDIA GeForce 6150SE nForce 430 はLinuxでは使えません

#はじめに
このGPU＆チップセットを使った古いPCも、HDDをSSDに交換したら思いのほか快適につかえたが、OSがWindows7のため寿命もわずか。
そこでOS更新を決行。
このチップセットがWindows10に非対応でアップグレードできず（インストール後に旧OSのドライバに入れ替えれば使えるかもしれないらしいけどそのためにWin10買うの怖い）。
ということでLinuxにしてみました。

#症状
しばらく(5分ぐらい?)すると画面が崩れて(横100pxぐらいのいろんな色の線で画面が埋め尽くされる感じ)フリーズする

#いろいろ試してみました
最初はなにが原因かわからなくていろいろ試してみましたが全滅。
・Distributionの入れ替え
　MintとかUbuntuとか他のマイナーなやつとか
・グラフィックドライバの変更
　nouveauとかNVIDIAのとか

#ぐぐってみると...
各ディストリのコミュニティーサイト(英語)で同様の質問があがっている
GRUBの設定変更などいろいろ試せと言っているので、自分もやってみたがだめ。
質問者もダメだったようだ。

最後に解決しましたと言っている方々はすべて、グラボを刺した人。

#解決
グラボを刺して解決しました(笑)。
このチップセット積んでいるPCはおそらくコンパクトタイプのため、電源がしょぼいのとエアフローが悪いと思うので、低消費電力でかつ空冷ファン付きのものを選びましょう。
以下試してしばらく運用していますが問題ありません。
NVIDIA GeForce GT1030(空冷ファン付き)
NVIDIA GeForce GT710(空冷ファン付き)
※ドライバはNVIDIAが提供するものを使ってます。

#その後
UBUNTU 18.04LTS Desktopを入れていますが、Windows7当時程度には快適に使えます。グラボがGT1030の時は、それ以上の快適さ。
R-Studioとか勉強用として入れてますが特に不満はありません。
GT710でgpu対応tensorflow dockerを導入してみましたが、tensorflowをインポートしようとするだけでコンテナが落ちます。原因不明。
ググると、ざっくりと「古いPCはダメっぽい」と書いてある。。。
OpenMx(NPSOL)の読み込みができない問題の解決法

#インストール

CRANからインストールするのではなく、以下のコマンドを打ち込むとNPSOLのものがインストールできる

```ruby:qiita.rb
source('https://openmx.ssri.psu.edu/software/getOpenMx.R')
```

参照（https://openmx.ssri.psu.edu/installing-openmx）


#読み込み
インストールに成功し、いざ読み込もうとするとエラーが出る。

```r
> library(OpenMx)
 エラー: package or namespace load failed for ‘OpenMx’ in dyn.load(file, DLLpath = DLLpath, ...):
  共有ライブラリ '/Library/Frameworks/R.framework/Versions/3.6/Resources/library/OpenMx/libs/OpenMx.so' を読み込めません: 
  dlopen(/Library/Frameworks/R.framework/Versions/3.6/Resources/library/OpenMx/libs/OpenMx.so, 6): Library not loaded: /usr/local/lib/libgomp.1.dylib
  Referenced from: /Library/Frameworks/R.framework/Versions/3.6/Resources/library/OpenMx/libs/OpenMx.so
  Reason: image not found 
```

#エラーは何を伝えているの
四苦八苦しながら読み解くと、どうやら

OpenMx.soの読み込みにlibgomp.1.dylibが必要だが、/usr/local/libに見つからないということらしい。

ターミナルから色々いじってみようとしたのだが、一つ解決しても次から次へと必要なものが/usr/local/libにないと言われる。

#解決法

必要と言われるファイルを全てファインダーより、/usr/local/lib下にコピーしました。

まずはlibgomp.1.dylibら一連のファイルがあるらしい場所を探しに行きます。
エラーコードより
/Library/Frameworks/R.framework/Versions/3.6/Resources/library/OpenMx/libs
に探しに行きました。

私のMacではlibraryを隠す設定にしていたのでターミナルから

```
$ open /Library
```
でライブラリを開き、libsまで降りていくと目的のファイルたちがあったのでコピーしました。

そして

```
$ open /usr
```
/usr/local/libを開き、そこにコピーしたファイルをペースとしました。

そしたらOpenMxの読み込みが完了しました。


初めは、シンボリックリンクを作成したりしていたのですがなぜかうまくいかなかったので諦めました。
参照（http://mosina.hatenablog.jp/entry/2014/10/27/231402）


主に参考にしたのは
参照（https://openmx.ssri.psu.edu//node/316）
プログラミング不要でGoogleHomeからGoogleFitに体重を記録する(Fitbit経由)

# はじめに
「Ok Google, 体重は〇〇kgと記録して」
をやりたくて仕組みを考えました。

本来であればGoogleFitのREST APIを使って
直接記録するのがいいのだと思いますが、
調べていくうちに面倒になってしまったので
プログラミングせずにアプリを使うことにしました。

# フロー
Google Assistant
　↓(IFTTT)
Fitbit
　↓(FitToFit)
GoogleFit

IFTTTからGoogleFitには直接記録出来ないのですが
Fitbitへは直接記録出来るレシピが用意されているため
まずFitbitに記録してそれをFitToFitというアプリで
GoogleFitに同期します。
GoogleFitへは即時の反映とはなりませんが
FitToFitでは30分〜24時間毎に自動同期が出来るので
実用的な範囲かと思います。

体脂肪率を記録するのも可能ですが
もう少し厄介です。

FitToFit
https://play.google.com/store/apps/details?id=fitapp.fittofit

# おわりに
やり方を詳しく書こうと思ったのですが
普通にIFTTTとFitToFitを使うだけなので
不要かと思いやめました。
もし要望があれば書こうと思います。

WithingsやS Healthなども検討して
Fitbit経由が良さそうだという経験と
FitToFitという便利なアプリの紹介でした。
Linux基本コマンド備忘録


仕様頻度の低いコマンドを覚えられず毎回調べてしまうのでここにまとめます。
自分用です。随時更新します。



##アクセス権を変更したいとき

```
$ chmod アクセス権限 ファイル名
```

```
$ chmod 777 virtual.cnf
```





##ファイル名を変更したいとき

```
$ mv ファイル名　 変更後のファイル名
```


##ファイルの配置場所を移動させたいとき

```
$ mv ファイル名　ディレクトリ名
```

複数ファイルをまとめて移動することも可能

```
$ mv  file1 file2 file3 Document/
```
phpのvar_dumpとvar_exportの違いをよく聞かれるので説明してみる

```php

<?php
$hoge = [
  'aaa' => 'hoge',
  'bbb' => 'foo',
  'ccc' => 'bar',
];

var_dump($hoge);
var_export($hoge);

```

```php

/////var_dump/////
array(3) {
  ["aaa"]=>
  string(4) "hoge"
  ["bbb"]=>
  string(3) "foo"
  ["ccc"]=>
  string(3) "bar"
}

/////var_export/////
array (
  'aaa' => 'hoge',
  'bbb' => 'foo',
  'ccc' => 'bar',
)
```

基本的には標準出力する分には同じです。
出力される構造としては上記のような違いになります。

> var_export関数は var_dump() に似ていますが、 返される表現が有効な PHP コードであるところが異なります。

公式の言い方をするとvar_exportは、このような「有効なPHPコード」という形式になります。

ちなみに有効なPHPコードとは？という疑問もあると思います。
var_exportの第二引数にtrueを指定すると変数を出力せずに変数の値を返します。

なので、使用用途としてはログ出力時などに変数情報を文字列として出力するには
var_export()が適しています。

```
ex)

\Log::debug(var_export($hoge, true));
```

var_dumpは配列の要素数や型も表示されるので用途別で使い分けましょう。
[メモ]crontabで起動時に自動的にトンネルを掘る

# crontab
crontabは自動的にスクリプトを実行できるツール
`echo '@reboot /path/to/script' | crontab`
にスクリプトのパスを書くことで起動時に自動実行してもらえる。
設定は
`crontab - l`で確認可能で編集したいなら`crontab -e `で編集できる


# 実行するスクリプトたち
sshは以下のような感じ

```bash
#!/bin/bash
autossh -f -N  hostname
```
chmodで実行権限を与えておくことを忘れない。

-f -N はバックグラウンドで実行/接続先で何も実行しないというオプション。
起動しているか確認したいときは
`ps aux | grep ssh`で確認するのが手っ取り早い。
C#で簡単にSNMP getする方法

# .netのクラスライブラリになかったのね

　極々簡単な(GETしかしない)SNMPマネージャの作成を検討してて、最初はWMIのSNMP機能で出来るやろ？と思っていたんですが、WMIは対Windowsしか接続出来ないようにみえました…（出来るのかわからなかった）
　他の手段を探していくつか見つけたのでメモしておきます。

## UDP使ってGet部分だけでも実装する

[C#でASN.1のObject Identifierのエンコードを行う](https://qiita.com/sukkyxp/items/69e142d07aa92aaa09c2)

この方のこの一連のシリーズの投稿を参考にGet出来るまで自力コーディングする方法。
学習にはなるけどそこまでではない（ない）

## nugetからLextm.SharpSnmpLibをDLして使う

[Lextm.SharpSnmpLib](https://www.nuget.org/packages/Lextm.SharpSnmpLib/)

nuget探すといくつか出てくるんですが、これはMITライセンスで使えます。簡単なサンプルはgithubにあるのでそれ見るとすぐ出来ました。
SNMP周りをガッツリやるならコレはめっちゃ便利そうです。

## OLEPRNLib

　COMコンポーネントを使う方法。GETするだけだったので今回はこれを採用しました。

最初に見かけたのが[Windows標準機能だけでsnmpgetする（PowerShell）](https://qiita.com/webdevjp/items/4cd341ffc0be65bce699)
でpowershellだったのですが、COMコンポーネントなら使えるのでは？というのがきっかけ。

参照設定でoleprn 1.0 Type Libraryを追加します

![コメント 2019-10-01 102413.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149049/67b10718-efda-775e-88f9-18b293349ba6.png)

以下のように使います。

```c#

var snmp = new OLEPRNLib.SNMP();
snmp.Open("127.0.0.1", "public", 3, 10000);
var result = snmp.GetAsByte("1.3.6.1.2.1.1.5");

```
Hello GNS3



#１．インストール方法


[Install GNS3 on a remote server](https://docs.gns3.com/1c2Iyiczy6efnv-TS_4Hc7p11gn03-ytz9ukgwFfckDk/index.html)をもとに、Githubに公開されているシェルスクリプトを使用することで、容易に構築することができる（但し、Ubuntu OS限定）。


```
cd /tmp
curl https://raw.githubusercontent.com/GNS3/gns3-server/master/scripts/remote-install.sh > gns3-remote-install.sh
bash gns3-remote-install.sh --with-iou --with-i386-repository
```

以上
git switch を使うためにHomebrewでGitをインストールした備忘録

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">未だに𝗴𝗶𝘁 𝗰𝗵𝗲𝗰𝗸𝗼𝘂𝘁を使って諸々の操作を行なっていたらCTOに「わかいのにかわいそう...」と、老害扱いを受けました。<br><br>先月追加された新しいオプション(𝗴𝗶𝘁 𝘀𝘄𝗶𝘁𝗰𝗵と𝗴𝗶𝘁 𝗿𝗲𝘀𝘁𝗼𝗿𝗲)を使い分けていない、そこのあなたも老害の恐れがあります。</p>&mdash; binaryta@U+1F35C (@binaryta) <a href="https://twitter.com/binaryta/status/1178668744777691136?ref_src=twsrc%5Etfw">September 30, 2019</a></blockquote>

こちらのツイートを見て、
「やばいやばい、老害になる前に俺も早速 `git switch` 使うぞ〜^^」
とコマンドを叩くも、そんなコマンド存在しないぞ？と怒られました

もしかして、俺のGitバージョン低すぎ？

```
git --version
```
で現在使用しているGitのバージョンを確認できます。

```
git version 2.20.1 (Apple Git-117)
```
git switch等はv.2.23.0以降のようなのでバージョンが低いことが分かりました。

GitのWebサイトからダウンロードする方法もりますが、今回はHomebrewを使います。
まだHomebrewを導入していない方はこちらからインストールしましょう→[Homebewa](https://brew.sh/)

```
brew update
```
念の為、Homebrewを最新にしておきます。

```
brew install git
```
HomebrewでGitをインストールします。

```
git --version
```
インストールが無事に終わったらバージョンを確認します。
あれ？バージョンが変わっていませんでした。
パスの向き先は正常なようです。

あ、Terminalを再起動するの忘れてた！

```
git version 2.23.0
```

無事にアップデートでき、 `git switch` 等のコマンドを叩くことができるようになりました！
AWS案件(未経験から)を獲得した時めちゃ役にたった本を紹介

はじめに
---------------------------------------
近年AWSが注目されています。
以前案件の商談の際にAWS案件未経験の僕がAWS案件を獲得することができました。

事前に必須のスキル項目としてAWSを挙げられたのですが先方にオファーの理由をお伺いすると商談の印象が良かった為とのことです。

個人的な振り返りとして商談に臨む前に事前知識として本を買いあさり、その知識を商談で話せたことがとても大きいと思っています。

今回はその商談で爆発的に役立った本を紹介いたします。

AWSとは
---------------------------------------
AWS（Amazon Web Services）とはAmazon.com社が提供しているクラウドサービスのこと
特徴
・自らインフラ環境を構築せずに質の高いリソースにアクセス可能
・サーバーやデータベースなどのインフラ環境を自ら管理・運営していなくても、インターネットを介してそれらのリソースにアクセスすることが可能
・従量課金制。利用した料金を支払うことでリソースにアクセス可能
⇒Googleやマイクロソフトなどもクラウドサービスを提供していますが、AWSの方が初期費用の安さやセキュリティ面が充実

AWS案件を携わるメリット
---------------------------------------
・インフラエンジニアとネットワークエンジニアを兼務することが多く、エンジニアとしての経験を爆速に積むことができる。

・ローバルナレッジ社によるとエンジニア単価について
　■AWS認定ソリューションアーキテクト・アソシエイト⇒２位で１２万１２９２米ドル
　■AWS認定デベロッパー・アソシエイト⇒４位で１１万４１４８米ドル
　AWSの資格が２つもランクインしています。つまり単価が高いということ。
　※doda（デューダ）やレバテック求人単価相場が実際に高いようです。

・AWSへシステムを移行する企業が多くなっており、案件の数が多い

AWS将来性
---------------------------------------
・ビッグデータによりデータの収集、保存、加工、分析などがさらに進んでいくと考えられ、AWSはビッグデータの活用も促進している。AWSサービスを利用することで、負荷の高いビッグデータにも瞬時にデプロイ（利用可能に）することができるなどの利点もあり、ビッグデータの利用が高まると同時にAWSの需要も高まる。
・AWSでは人工知能サービスも提供している。アマゾンが手がけた学習済みAIを活用することで、すぐに人工知能サービスの開発を開始させることができるなどのメリットがある。

爆おすすめ本
---------------------------------------
[Amazon Web Services 基礎からのネットワーク＆サーバー構築](https://www.amazon.co.jp/dp/B06Y5ZSYY4/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1 "Amazon Web Services 基礎からのネットワーク＆サーバー構築")

良い点
・技術本って読みにくくて最後まで読みきれない本もたくさんあるかと思いますがAWS未経験の自分でも最後まで飽きずに読むことができる。
・一番頭に入りやすい手を使って実際に操作できる。
・仮想の話のみだとわかりにくいが実施に「オンプレミスのサーバだとこういう意味」みたいなイメージ記載が秀逸。

---------------------------------------
[Amazon Web Servicesネットワーク入門 impress top gearシリーズ](https://www.amazon.co.jp/dp/B01M2BMB0V/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1 "Amazon Web Servicesネットワーク入門 impress top gearシリーズ")

良い点
・ネットワーク経験がない人向け。近年オンプレミスからAWS環境への移行が多い中ネットワーク技術をわかりやすく解説。
・想定としてオンプレミスからAWS環境への用語から詳しく書いてある。
・インスタンスの設置だけでなくセキュリティやNAT、ルーティングに関するAWSで最低限考慮すべき項目も載っている。

終わりに
---------------------------------------
エンジニアの本は自分の経験値によって読むべき本はおのおの変わってくると思います。
是非自分と同じ境遇の人は本を手にとり商談に臨んでみてください。
※初めて構築する人にもお薦めです！
アプリのダウンロード数統計

初めまして。

早速ですが、最近調べた結果、日本人のアプリ平均ダウンロード数は100、日本の全アプリ数はざっくりオーダーで100万だそうです。

日本人の人数を、またまたざっくりですが1億とすると、1アプリ当たり平均10000回くらいダウンロードされていることになります。

この分布を調べたいと思ってググったのですが、意外と見つかりません。

横軸にアプリのダウンロード回数、縦軸にその回数ダウンロードされたアプリ数をとってヒストグラム（グラフ）化したものが、私の欲しいものなのですが、なかなか無いようです。

App Store APIとやらが公開されているみたいなので、それを使えば作れそうな気がするんですけどね。需要もありそうな気がします。
【Laravel】DBのテストを実行しようとしたらBadMethodCallException 

```
Mockery\Exception\BadMethodCallException : Received Mockery_1_Illuminate_Console_OutputStyle::askQuestion(), but no expectations were specified
```


キャッシュをクリアしたら動いてくれた。

```
php artisan config:clear
```



https://readouble.com/laravel/5.8/ja/testing.html
>テスト実行前には、config:clear Artisanコマンドを実行し、設定キャッシュをクリアするのを忘れないでください。
HomebrewでPHP7.2のインストール(Mac)

# install php for mac
mac OS version : 10.14.4
Homebrew : 2.1.9

参考1 : https://qiita.com/saken649/items/b5830de62211b600f7ee
参考2 : https://qiita.com/nemui_/items/cbf876db509e6a427541

homebrewはインストールしてあることが前提

phpのデフォルトバージョン確認

```
$ php -v
PHP 7.1.23 (cli) (built: Feb 22 2019 22:08:13) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
```

```
$ brew search php72
==> Formulae
php@7.2

$ brew install php@7.2
(前略)
If you need to have php@7.2 first in your PATH run:
  echo 'set -g fish_user_paths "/usr/local/opt/php@7.2/bin" $fish_user_paths' >> ~/.config/fish/config.fish
  echo 'set -g fish_user_paths "/usr/local/opt/php@7.2/sbin" $fish_user_paths' >> ~/.config/fish/config.fish
（後略）
```

pathを通す(おらのシェルはfishなので，bashとは少しコマンドが違う)

```
$ echo 'set -g fish_user_paths "/usr/local/opt/php@7.2/bin" $fish_user_paths' >> ~/.config/fish/config.fish
$ echo 'set -g fish_user_paths "/usr/local/opt/php@7.2/sbin" $fish_user_paths' >> ~/.config/fish/config.fish
```

再読み込みして通るか確認

```
$ source ~/.config/fish/config.fish
```

```
$ which php
/usr/local/opt/php@7.2/bin/php

$ php -v
PHP 7.2.22 (cli) (built: Sep 14 2019 18:36:32) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.22, Copyright (c) 1999-2018, by Zend Technologies
```
インストール完了．
rbenvみたいにversion切り替えできるようにしたいなぁ．．．
【visual studio】古いソリューションをアップデートして開くとプロジェクトが読み込めない


# visual studioのバージョンを変える

昔々に作られたシステムを動かそうとソリューションを起動してみた。
作成したバージョンは「2005」
起動したのは「2012」

vs2005　→　vs2012

アップデートしてみた。

ソリューションは開けます。
しかし、プロジェクトを一つも開けない。。。。
（ソリューションエクスプローラーにプロジェクト名は表示されていますが、中身が見れない状態です。）

ググってみると、掲示板やらブログやらで
「ごにょごにょ変換してー・・・」
「プロジェクトを削除してもう一度読み込んでー・・・」
と、難しく書いてるなあ、、、なんのこっちゃ、、、
となって読むのをやめました()


# 簡単に解決した

ソリューションエクスプローラーに表示されている
プロジェクト名を右クリックすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388547/f5462472-c16e-3254-7538-46464a244de4.png)

「再読み込み・・・・？」

選択してみる。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388547/ae7d12f8-c01d-6637-f9a1-141704d4aeae.png)


「ＯＫ」してみたらプロジェクトも読み込みました。
無事にソースも見れています。

めちゃ簡単やん・・・・・。
Railsのblank?が優秀だった

## 背景

Railsでアプリケーションを作っていて、空文字判定の実装をしました。
当然 `blank?` を使用したわけですが、思ったより優秀で驚いた話です。

## String.blank? の動作

### 空文字

一番ベーシックなタイプです。これは当然true。

```
irb(main):001:0> ''.blank?
=> true
```

### 半角スペース

これも可能なら対応してもらいたいところだが... → true

```
irb(main):002:0> ' '.blank?
=> true
```

### 半角スペース（複数）

これはブランクと言えるのか...? → true

```
irb(main):003:0> '              '.blank?
=> true
```

### 全角スペース

これは流石に... → true

```
irb(main):004:0> "\u3000".blank?       
=> true
```

### 全角スペース(複数)

もうわかってきた。これはtrue！ → true

```
irb(main):005:0> "\u3000\u3000\u3000\u3000".blank?
=> true
```

### 改行

まさかこれも...?  → true

```
irb(main):014:0> '              
irb(main):015:0' '.blank?
=> true
```

### 全角スペース + 改行

falseにしたい...! → true

```
irb(main):022:0> "
irb(main):023:0' \u3000
irb(main):024:0' 
irb(main):025:0' ".blank?
=> true
```

### 文字列「aaa」

少し心配になってきたので、念のため... → false

```
irb(main):006:0> 'aaa'.blank?
=> false
```

## Rubyのメソッドではなくて、Railsで実装されている

これはrailsで実装されているのであって、Rubyでは使えません。

```
irb(main):001:0> ''.blank?
Traceback (most recent call last):
        2: from /Users/yoshinori/.rbenv/versions/2.5.3/bin/irb:11:in `<main>'
        1: from (irb):1
NoMethodError (undefined method `blank?' for "":String)
```

## 終わりに

文字列か有効かどうか判断するのに 'blank?' が優秀なことがわかりました。
'present?' は 'blank?' の真逆になります。
すごく便利。
TypeScript: ジェネリック関数の型パラメータを書く位置は、引数カッコの直前

本稿ではTypeScriptで、ジェネリック関数を定義するときに、型パラメータはどこに書いたら良いかを説明する。

## 要約

結論としては、どんな関数の書き方であっても、型パラメータ`<T>`は、仮引数のカッコの前に書けば良い。

```ts
<T> (value: T) => {} // アロー関数

function f<T>(value: T) {} // 関数

function <T>(value: T) {} // 匿名関数

{
  f<T>(value: T) {} // メソッド
}
```

## アロー関数と型パラメータ

ジェネリクスの型パラメータをアロー関数で使う場合は、仮引数のカッコの前に書く。

```ts
const f = <T> (value: T) => {}
//        ^^^ ここに型パラメータを書く

f<string>('string')
f<number>('string') // 🚫コンパイルエラー
```

## 関数と型パラメータ

関数に型パラメータを使う場合は、関数名の後、仮引数のカッコの前に書く。

```ts
function f<T>(value: T) {}
//        ^^^ ここに型パラメータを書く

f<string>('string')
f<number>('string') // 🚫コンパイルエラー
```

匿名関数の場合は、仮引数のカッコの前に書く。

```ts
const f = function <T>(value: T) {}
//                 ^^^ ここに型パラメータを書く
```

## メソッドと型パラメータ

メソッドに型パラメータを用いる場合は、メソッド名の後、仮引数のカッコの前に書く。

```ts
const obj = {
  f<T>(value: T) {}
// ^^^ ここに型パラメータを書く
}

obj.f<string>("string");
obj.f<number>("string"); // 🚫コンパイルエラー
```
vue.js サイドバーを作る

# サイドバーを作る

参考にしました。
stackoverflow
https://stackoverflow.com/questions/48905654/css-fixed-sidebar-in-vue-js

Vue.jsで使えるテンプレ一覧
https://sounansa.net/archives/2360

↑の一つ
https://www.creative-tim.com/product/vue-light-bootstrap-dashboard#

Vue Plugin Component
https://gist.github.com/davewoodall/c8bc710fc258268c29617473be47d2c0

1.
サイドバーのコンポーネントを作る

ファイル名は、 **sidebar.vue**

パスは **app/javascript/packs/components/layouts/sidebar.vue** とする

2.
土台のコンポーネント(scafold.vueとする)を作り、1をimportする

```js:scafold.vue

<script>
import Top from './top.vue' // ヘッダー
import Bottom from './bottom.vue' // フッター
import Welcome from '../welcome.vue' // トップページのコンテンツ
import Sidebar from './sidebar.vue' // サイドバー

export default {
  components: {
    Top,
    Bottom,
    Welcome,
    Sidebar
  },
}
</script>
```

3.
2のtemplate内で1を使用

ポイントは、
**サイドバーのコンポーネント**と、**メインコンテンツ(router-view)のコンポーネント**を、**別々の要素**として配置させること。

```js:scafold.vue

<template>
  <div>
    <top></top>
    <sidebar class="sidebar-area"></sidebar>
    <div class="scafold-wrapper text-center">
      <router-view/>
    </div>
    <bottom class="footer-area"></bottom>
  </div>
</template>
```

4.
2にcssを適用

```js:scafold.vue

<style scoped>
.sidebar-area {
  /* 左側に固定 */
  float: left;
}

.footer-area {
  margin-top: 40px;
}

.scafold-wrapper {
  /* display: flex; 要素を横並びにする */
  flex-direction: column; /* 要素の並び順の主軸を指定 上 => 下 */
  min-height: 100vh; /* 要素の高さの最小値を指定 vhはviewport(表示領域) heightの略 */

  /* サイドバーのwidth分だけ範囲を削除 */
  width: calc(100% - 200px);

  /* サイドバーで隠れるので右に寄せる */
  margin: 0 0 0 180px;
}
</style>
```

5.
1のサイドバーのコンポーネントを実装

```js:sidebar.vue

<template>
  <div class="sidebar">
    <div class="sidebar-wrapper">
      <div class="sidebar-link-area">
        <!-- サイドバーメニュー -->
        <p><router-link to="/counselings" class="sidebar-link">カウンセリング</router-link></p>
        <p><router-link to="/expenses" class="sidebar-link">経費</router-link></p>
        <p><router-link to="/problems" class="sidebar-link">悩み</router-link></p>
        <p><router-link to="/calendars" class="sidebar-link">カレンダー</router-link></p>
        <p><router-link to="/admins" class="sidebar-link">管理者</router-link></p>
        <p><router-link to="/users" class="sidebar-link">生徒一覧</router-link></p>
        <p><router-link to="/tasks" class="sidebar-link">イベント一覧</router-link></p>
      </div>
    </div>
  </div>
</template>

<style>
.sidebar {
  background-color: #191970;
  height: 100%; /* サイドバーの高さ */
  width: 200px; /* サイドバーのwidthを指定 */
  max-width: 200px; /* widthの最大値 */
  opacity: 0.9.5; /* 透過する 0に近くほど透過する */
  position: fixed; /* 左上に要素を固定する(スクロールしても位置は固定される) */
  overflow-x: hidden; /* 横軸ではみ出た要素を非表示にする */
  box-sizing: border-box; /* paddingとborderを、widthとheightに含める */
  padding-left: 40px; /* サイドバー内のリンクの位置を右にずらす */
}

.sidebar-link-area {
  padding-top: 20px; /* サイドバーリンクの上部に空白を作る */
}

.sidebar-link {
  color: #ffffff; /* リンクの文字色を白に */
}

.sidebar-link:hover {
  color: #ffffff /* マウスがリンクに乗った時も文字色を白に */
}
</style>

```
日経SYSTEMSが休刊したので、次の購読雑誌を軽く調べてみた。

# ０．はじめに…

結構長い期間 [日経SYSTEMS](https://www.fujisan.co.jp/product/1281681603/) を会社で定期購読していたんですが…。

この度、休刊になるとのこと。

* [「日経SYSTEMS」休刊のお知らせ \| 日経 xTECH（クロステック）](https://tech.nikkeibp.co.jp/atcl/nxt/mag/sys/18/032700026/091000020/)
* [「日経 SYSTEMS」休刊のお知らせ - 日経BP](https://www.nikkeibp.co.jp/images/houjin/ad/upload/nos_notice.pdf)

[日経SYSTEMS](https://www.fujisan.co.jp/product/1281681603/) の皆様、どうも長い間お世話になりました。

🙇‍♂️🙇‍♂️🙇‍♂️


# １．ということで…

表題にある様、次の定期購読する雑誌を軽く調べてみました。

こちらの記事など参考にしたりしながら、以下の雑誌が候補として如何かと。

* [エンジニアの情報収集法まとめ \- Qiita](https://qiita.com/nesheep5/items/e7196ba496e59bb2aa28)
* [パソコン・PC 雑誌のランキング \| Fujisan\.co\.jpの雑誌・定期購読](https://www.fujisan.co.jp/cat800/ranking/?link=header)

## ■ [日経コンピュータ](https://www.fujisan.co.jp/product/1281679714/?link=ranking)

* IT系ランキング１位
* 隔週木曜 ¥958 ( ¥24,900 / 年 ) ※約90P
* よりビジネス向け、その分技術情報なは少なめ。場合によっては、他の部門の方々が読んでも良い気がする。

## ■ [Software Design (ソフトウェアデザイン)](https://www.fujisan.co.jp/product/1535/?link=ranking)

* IT系ランキング３位
* 毎月18日 ¥1,275 ( ¥15,138 / 年 ) ※約130P
* IT エンジニア向け。雑多な感じで、技術情報も結構ある。逆にビジネス向けの情報はちょっと少ないのかな？

## ■ [日経NETWORK(日経ネットワーク)](https://www.fujisan.co.jp/product/1281679738/?link=ranking)

* IT系ランキング５位
* 毎月28日 ¥1,542 ( ¥18,500 / 年 ) ※約70-80P
* ネットワーク・セキュリティ関連が非常に多い。ハードも結構。濃い感じ。スキルによっては、辛いかも…。

## <font color="red">※ 以降は、2019.11.07 に追加<font>

## ■ [Interface（インターフェース）](https://www.fujisan.co.jp/product/151/?link=ranking)

* IT系ランキング４位
* 毎月25日 ¥1,020 ( ¥9,768 / 年 ) ※約90P
* IoT・マイコン を中心にそれに関わる IT のトレンドを押さえてる感じ？結構、ギークでハード寄り？

## ■ [WEB\+DB PRESS （ウェブDBプレス）](https://www.fujisan.co.jp/product/1281680264/)

* IT系ランキング９位
* 隔月24日 ¥1,628 ( ¥12,960 / 年 ) ※約160P
* Web を中心に幅広く網羅されながらも、技術的で具体的な内容が多く、より IT エンジニア向けでギークな感じ。その分、ビジネス向けの情報はほぼ無し。隔月でボリューミーなので、ちょっと重め。

# ９９．ハマりポイント

* ※ 特に無し。

# ＸＸ．まとめ

このネット社会に IT 系の雑誌なんて。
っていう感じは確かにあるんですが…。

参考になれば♪
jsPDFでモバイルに対応するよ

[jsPDF](https://github.com/MrRio/jsPDF)はフロントエンドでPDFを生成できるとっても便利なライブラリー。早速試してみましょう。

```javascript
const doc = new jsPDF({
  orientation: 'p',
  unit: 'px',
  format: 'a4',
  putOnlyUsedFonts: true
})
const fileName = 'hoge.pdf'
doc.setFontSize(10).text('Hoge', 10, 10)
doc.save(fileName)
```

とっても簡単ですね。でも、あれ？ iOS SafariだとPDF出力できませんね。どうやらiOSはFileSystemがないので、直接PDFダウンロードができないようです。
というわけで、モバイルの時はダウンロードしないで、新しいタブにPDFを直接表示してみましょう。

```javascript
if (/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(navigator.userAgent.toLowerCase())) {
  window.open(doc.output('bloburl', { filename: fileName }))
} else {
  doc.save(fileName)
}
```

これでモバイルでは新しいタブにPDFが表示されました。
ユーザーはブラウザのシェア機能を使って、PDFを保存したりメールで送ったりできるようになりましたとさ。
CSSもスタート

あれですね

最初にトマトとかナスとかきのことか食べた人すごいとか思ってたけど、、、

初めてコードを書いた人はヤバイ
それをルールとして作った人もヤバイ
それを使いこなしてる人達って、、、
なんでも無いです。

完璧な答えはないのに成り立つ不思議な世界
macでdocker-composeを使ってPHPとnginxをすぐに使えるようにする方法

PHPの勉強用に「折角だからnginxをdockerで立てて使おう〜」と軽い気持ちでコンテナ立てて実行しようとしたところ「コンテナのnginxのドキュメントルートにどうやってファイル置くんだろ。」とか「もしかしてコンテナ入って置かないとダメ？」とか前知識が無くて全然うまく行かず。。


# docker-composeを使って速攻で準備
出来ねぇ出来ねぇボヤいてたらwebエンジニアにdocker-composeを使って速攻でその辺の環境を作る方法を教えてもらいました。
コンテナを立てたい場所に下記の`docker-compose.yml`ファイルを作成します。

```yaml

[docker-compose.yml]

### nginxでphpをブラウザ上に表記するのに必要なコンテナ一式。
version: '3'
services:
  app:
    image: laradock/php-fpm:2.2-7.2
    # ローカルのカレントディレクトリに格納したファイルをコンテナの/var/phpappにマウントする
    volumes:
      - ./:/var/phpapp/

  nginx:
    image: nginx:latest
    # 8080ポートから来た接続をコンテナの80番ポートに連携する
    ports:
      - "8080:80"
    volumes:
      # ローカルの./docker/nginx/nginx.confのをnginxコンテナの/etc/nginx/conf.d/default.confにマウントする
      - ./docker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      # ローカルカレントディレクトリをコンテナの/var/phpappにマウント
      - ./:/var/phpapp/

  mysql:
    image: mysql:5.7
    # 33306ポートから来た接続をコンテナの3306番ポートに連携する
    ports:
      - 33306:3306
    volumes:
      - ./testdata/:/data
    environment:
        MYSQL_DATABASE: app
        MYSQL_ROOT_PASSWORD: root
```

あとnginx.confの内容を下記にします。
これはローカルの`.docker/nginx/nginx.conf`に作成してください。

```yaml

[nginx.conf]

server {
  listen 80;
  server_name localhost;
  root  /var/phpapp/web;
  index index.php index.html;
  location / {
    try_files $uri $uri/ /index.php$is_args$args;
  }

  location ~ \.php$ {
    fastcgi_pass   app:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
  }
}
```

nginx.confの方は深く説明しませんが、この設定にしておけばローカルのカレントディレクトリの`web`フォルダに格納したPHPファイルはちゃんと処理されてブラウザ上で表示されます。

あとはdocker-composeファイルを起動させれば準備完了します！

`$ docker-compose up -d`

出来たものはこちらです。

```

$ docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                                NAMES
04e0f98cc4ef        mysql:5.7                  "docker-entrypoint.s…"   7 hours ago         Up 7 hours          33060/tcp, 0.0.0.0:33306->3306/tcp   memo_keizi_mysql_1
8c0639887fb3        laradock/php-fpm:2.2-7.2   "docker-php-entrypoi…"   23 hours ago        Up 23 hours         9000/tcp                             memo_keizi_app_1
c3574c4c67b9        nginx:latest               "nginx -g 'daemon of…"   34 hours ago        Up 33 hours         0.0.0.0:8080->80/tcp                 memo_keizi_nginx_1
```

`IMAGE`のところがdocker-composeの`image`で記述したものになっています。

## PHPをブラウザで表示させるところまで確認する

折角なので格納したPHPファイルがブラウザ上で表示されるところまで確認します。
※今回MySQLは使用しません。

nginx.confで設定した`root  /var/phpapp/web;`によりwebフォルダがドキュメントルートになります。
カレントディレクトリにwebフォルダを作成し、PHPファイルを格納します。

```
$ ls web/
index.php
```

ファイルの内容はありきたりですが、Hello World出力で。。

```
[index.php]
<html>
 <head>
  <title>PHP Test</title>
 </head>
 <body>
 <?php echo '<p>Hello World</p>'; ?> 
 </body>
</html>
```

`http://localhost:8080/`でアクセスすると、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321507/318bd9a1-9e15-6498-6144-75256f2bac8c.png)

問題なく出力されました。
このwebフォルダにPHPのファイルを入れてパス指定すれば問題なく起動します。

### 終わりに
半端な知識で「nginxはコンテナで！PHPはローカルに入ってるからそれで勝手に処理してくれるでしょ！」くらいの軽い気持ちでやったら泥沼でした。。
PC近代化改修計画とサブマシン新造（2.IYH編＆組み立て編）

いつの間にか作ってから1ヶ月以上経ってしまった・・・ので完成まで。

# 計画編
[計画編](https://qiita.com/y_uehara1011/items/89e6b3f13e2685b65079)

# 買い出し
簡易水冷クーラーのみ事前にAmazonで購入。残りは会社帰りに秋葉原へGo！
ケースはとりあえず検証用まな板を追加購入、Windows10は今後を考えてDL版をチョイス。

|Category|Parts|Shop|Price|
|---|---|---|---|
|CPU|AMD Ryzen 5 3400G|ドスパラ|20,304|
|M/B|GIGABYTE X570 I AORUS PRO WIFI|ドスパラ|32,184|
|RAM|Corsair DDR4-2666 16GBx2|ドスパラ|18,980|
|SSD|Corsair MP600 1TB M.2/PCIe4.0|ドスパラ|29,970|
|Cooler|NZXT 簡易水冷 Kraken X42|Amazon.co.jp|13,457|
|電源|Corsair 650W|ドスパラ|7,500|
|まな板|Project-M PM-TESTBOARD|Amazon.co.jp|9,527|
|OS|Windows10 Pro ライセンスコード|Amazon.co.jp|25,325|
|値引き||ドスパラ|-3000|
|合計|||154,247|

結局15万を超えてしまった・・・

狙っていたB450のmini-ITXマザーがほとんど在庫払底していて、
X570のゲーミング用ハイスペックマザーに変えたこと、SSDを奮発したのが主な原因。

# 組み立て編

とりあえず買ってきたもの
![2019-08-16 21.51.22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262640/eaf15cfa-ed09-a39d-4e33-97120e95d675.jpeg)

マザーボード
![2019-08-16 21.54.01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262640/ef031a63-123b-dcb8-9528-7a12cec469a2.jpeg)

CPUを組み付け
![2019-08-16 22.12.30.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262640/38f0d36c-b022-2181-3e16-19188fe4049d.jpeg)

水冷ヘッドを設置する
![2019-08-16 22.32.10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262640/5736eda8-8080-0d7e-8d64-d32f2a213280.jpeg)

ラジエータと接続
![2019-08-16 22.39.02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262640/55381db9-06ef-f504-a624-5eb26f4b2fe0.jpeg)

電源と接続して通電＆水流試験
![2019-08-16 23.18.02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262640/9e0831bb-cafd-4561-ef21-f8461d7b4697.jpeg)

このあたりで動作確認してOSのインストールまで完了させておく。

別送で買っておいたまな板に
![2019-09-01 00.20.05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262640/0c161222-8c13-7e57-dc73-feb0b15d51ba.jpeg)

パーツを組み込んで完成。
![2019-09-01 00.44.25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262640/e6926258-17b4-3aaa-311c-3906abb20459.jpeg)

組み立てに特に難しいところはなかったが、AORUS X570はチップセットと一緒にSSDを冷却するためのヒートシンクを搭載しているため、そもそもヒートシンクつきのMP60はそのままでは組み込めない。（せっかく着いているヒートシンクを剥がす必要あり）
が、よく見たらマザーの裏面に2スロット目のM.2があったので今回はそちらを使用することにした。
特に最近のチップセット＆SSDは高発熱なので、マザーに元から装備されている冷却機構とのマッチングも考えないとイケナイかもしれない。

# 運用

全く問題なくWin10で運用できています。
最近のAPUは速いのね・・・
このマシンが安定したら旧メインマシンを大幅改修しようと思っていたけど、
このままRyzenGをメインに据えても全く問題ないかもしれない。

特に面白くない結論だった。

# おまけ

ドスパラのキャンペーンで、Ryzen買ったらこんなのがついてきたけどどういうことなの・・・
![2019-08-31 21.45.19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262640/9a4f09be-8f95-07c3-5d5d-79c308aca415.jpeg)
ネットワークスペシャリスト午後Ⅰ過去問まとめ

#目的
ネスぺ午後Ⅰの過去6年分の出題の要点をまとめる。午後Ⅱは長くなりそうなので次回。

#年度別出題テーマとキーワード

|   年度  　 |    出題   　 |テーマ　　  |キーワード         |
|:---------- |:------------|:----------|:------------|
| H25    |問1 |リモート接続ネットワークの検討|SSL-VPN（ポートフォワーディング方式）、ループバックアドレス、FWポリシー |
|        |問2 |端末の管理強化  |DHCPスヌーピング、DHCPリレーエージェント、ミラーリング    |
|        |問3 | ネットワークの再構築 |IEEE802.1Qトンネリング、STP、リンクアグリゲーション、スタック、FW仮想化    |
| H26    |問1 |ネットワーク構成の見直し  | VRRP、OSPF、帯域制御（DffiServ）、WAS、ラウンドトリップ時間   |
|        |問2 | ファイアウォールの障害対応 | NAPT、ステートフルインスペクション、GARP、TCP再送機能、FW仮想化   |
|        |問3 |ネットワークのセキュリティ対策  |分散型DoS攻撃、SYNフラッド攻撃、DNSリフレクタ攻撃、DNSキャッシュポイズニング攻撃、ペネトレーションテスト、ゾーン転送、FWによる出口対策 |
| H27    |問1 | シングルサインオンの導入 |SSO（リレーエージェント方式/リバースプロキシ方式）、Set-Cookieヘッダ、Domain属性、Secure属性、負荷分散（DSR方式）、ループバックインターフェース、GARP |
|        |問2 |ファイアウォールの負荷分散  | FW冗長化（Active-Active）、負荷分散（透過モード）、セッション維持、ヘルスチェック、RSTパケット  |
|        |問3 |侵入検知・防御システムの導入  |IDS、IPS、シグネチャ型、アノマリ型、ミラーポート、プロミスキャスモード、ICMP port unreachable、ゼロデイ攻撃    |
| H28    |問1 |電子メールシステム  |MXレコード、SMTP-AUTH、OP25B、STARTTSL、SPF 、FWポリシー   |
|        |問2 |モバイルネットワークの検討 |ステルス機能、MACアドレスフィルタリング、WPA2、PSK、APN、NAPT、CONNECTメソッド、プロキシ認証    |
|        |問3 |メールサーバの更改  |SMTP、ゾーン転送、DNSラウンドロビン、VRRP、FWポリシー  |
| H29    |問1 |SSL-VPNの導入  |SSL-VPN（リバースプロキシ方式/L2フォワーティング方式）、SHA-2、TSL1.2、Client Helloメッセージ、Server Helloメッセージ、サーバ認証、鍵交換、メッセージ認証、ファイアウォールポリシー    |
|        |問2 |仮想デスクトップ基盤の導入  |バーストトラフィック、送出制御（シェーピング）、C&Cサーバ |
|        |問3 | 社内ネットワークとクラウドサービスとのネットワーク接続 |IP in IP、PSK、トランスポートモード、MTU、MSS、フラグメント、リアセンブル、NAPT、BGP、AS、OSPF、Helloパケット、経路再配布、ICMP echo reply |
| H30    |問1 |SaaSの導入  |フォワードプロキシ、リバースプロキシ、プロキシ認証、CONNECTメソッド、SDN、コントロールプレーン、データプレーン    |
|        |問2 |ネットワーク監視の改善  |VRRPアドバタイズメント、IEEE802.1Q、STP、BPDU、ルートブリッジ、ICMP、SYSLOG、コミュニティ、ポーリング、トラップ、SNMPインフォーム    |
|        |問3 |企業内ネットワーク再構築  |インターネットVPN、IP-VPN、ラベル 、PEルータ、CEルータ、MPLS、GRE over IPsec、NHRP、ハブ拠点、スポーク拠点、BGP4、OSPF代表ルータ、OSPFプライオリティ|

#記述対策
上記で疲れたので続きはまた今度。
Alfredで複数クエリのカスタムサーチを作る

**有料の[Powerpack](https://www.alfredapp.com/powerpack/)が必要になります。**

複数クエリのカスタムサーチの作り方についてです。

例として、[Yahoo路線情報](https://transit.yahoo.co.jp/)を使います。
最低限必要なパラメーターは、`from`と`to`です。
乗換案内に必要なURLは、以下のようになります。

```
https://transit.yahoo.co.jp/search/result?from=東京&to=横浜
```

## 1. ワークフローを追加する
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33779/1dad5f8d-f24d-5cfc-f8dd-d5030d02c831.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33779/a3a390fe-834a-eb52-874c-a253e57b50e2.png)

1-1. AlfredのPreferencesを立ち上げる
1-2. サイドバー下部の`+`ボタンをクリック
1-3. `Blank Workflow`を選ぶ
1-4. `Name`をつける(ワークフローの名前)

## 2. `keyword`を追加する
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33779/7f229fab-a78e-7db0-c6f7-77427e68c108.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33779/437bd53b-9d59-a792-52c5-408bdad6a76f.png)

2-1. 右ペイン上で右クリックし、`inputs > keyword`をクリック
2-2. `Keyword`を適当に入力(呼び出す際のキーワードになります。ここでは`transit`にします)
2-3. `Title`を適当に入力
2-4. 保存

## 3. スクリプトを追加する
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33779/380b3375-25c4-3274-a23b-e06b74e1dd35.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33779/17ec9f47-1977-03e4-8cf9-622e8cf5883d.png)

3-1. 右ペイン上で右クリックし、`Actions > Run Script`をクリック
3-2. 上部セレクトメニューを変更
3-2-1. `/usr/bin/bash`を`/usr/bin/osascript(JS)`にする(JavaScriptで書きたいので)
3-2-2. `with input as argv`を`with input as {query}`にする
3-3. スクリプトを入力
3-4. 保存

挿入されているテンプレートを参考に編集します。
`transit 東京 横浜`のように入力したいので、
クエリをスペース区切りの文字列で受け取るようにします。

`\s`で分割、`from`と`to`に代入します。
`encodeURIComponent`で日本語をエンコードします。

```javascript
((encode) => {
  const query = '{query}';
  const [from, to] = query.split(/\s/);
  return `https://transit.yahoo.co.jp/search/result?from=${encode(from)}&to=${encode(to)}`;
})(encodeURIComponent);
```

## 4. ブラウザで開けるようにする
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33779/c4ccc62c-ffae-4d73-c73d-ec73e5498780.png)
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33779/2b119a86-4f93-4a5b-4cdd-3b97cd2008c8.png)

4-1. 右ペイン上で右クリックし、`Actions > Open URL`をクリック
4-2. 保存

## 5. 仕上げ
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33779/fd03c8f0-3e4d-1bf7-fcf0-176b4a59ad1d.png)

各セグメントを繋ぎ合わせます。
セグメントをクリックすると、緑色のボーダーが付きます。
右側に突起があるので、それを隣のセグメントまでドラッグして伸ばします。

## 使ってみる
Alfredを起動して以下のように入力します。
キーワードは、`2-1. Keywordを適当に入力`で入力したものになります。(ここではtransit)

```
transit 東京 横浜
```

## まとめ
複数クエリのカスタムサーチの作り方でした。
もっと簡単に作れる方法をご存知の方がいましたら、ぜひコメントで教えてください。
システム開発　要件定義をやってみた

仕事でやっているシステム開発。要件定義をやってみた。
対象業務はシステム開発そのものとしています。

##1 前提
・Angular + Web APIのwebシステム開発→モデルに値を入れてやりとりする
・Web API は C#で作成
・EntityFrameworkを採用
・EntityFrameworkはDBファースト

↑改善対象となる業務はなんなのかを明確にする。


##2 課題
・コーディングが定形になっているので、プログラマに単純作業をさせてしまうことなる
・慣れてない人が書くとコードにバラつきが発生する
・設計書からコードを起こすときに、間違いが発生する
・モデルファーストを採用していないので、定義書からテーブル作成クエリを作る必要がある。

↑前提で問題になっている部分はなんなのかを明確にする。


##3 対策
・設計項目をシステムに登録し、登録されている値をもとにコードと設計書を生成する。対象成果物は以下のとおり。
・モデルの設計書、C#のコード、タイプスクリプトのコード
・APIの設計書、C#のスケルトンコード、タイプスクリプトのコード
・DB定義書と生成クエリ

↑課題を解消するための対策。無駄なことをやっていないか、業務の見直しを考えるのが先。システム解決はあくまで手段のひとつ。
とはいえ、ユーザーから頼まれるときは、システム解決しかないと結論づけているケースが多い。そこをあえて踏み込むか、踏み込まないかはエンジニアの判断。

##4 アクターの抽出
・システム管理者:システムを管理する人
・プロジェクトマネージャー:成果物を確認する人
・開発者:開発する人。設計者、プログラマ、外注含む

↑業務にかかわる人を抽出する。システムが決まっているなら、システムを使う人を抽出する。

##5　ユースケース
・モデル、APIの値を登録する - 開発者
・出力したコードをソースに反映する -　開発者
・設計書を出力する -　開発者、プロジェクトマネージャー
・プロジェクト領域を作成する　- システム管理者

↑アクターが何をするかを書く。上記例は箇条書きだが、ユースケース図を使ったほうがベター。
こんな単純なこと書かなくてもわかるだろうと思うかもしれないが、こんな単純なことでもユーザー、プロマネ、開発者間で認識がずれていることがある。

##6システムフロー
・モデル、APIの値の値を登録する
1.プロジェクトを選択する -　開発者
2.画面設計書をもとに項目を登録する - 開発者
3.画面設計書のイベントから呼び出すAPIを定義する - 開発者
4.モデルをもとにDB項目を定義する -開発者
5.内容をレビューする　-プロジェクトマネージャー

・出力したコードをソースに反映する
1.画面に表示されたコードをコピーする - 開発者
2.ソースにペーストする - 開発者
3.テーブルの場合はコピーしたスクリプトを実行する。 - 開発者


・設計書を出力する -　開発者、プロジェクトマネージャー
1.設計書を出力する -　開発者、プロジェクトマネージャー
2.納品物件としておさめる　- プロジェクトマネージャー

・プロジェクト領域を作成する　- システム管理者
1.プロジェクトの作成依頼をする - プロジェクトマネージャー
2.プロジェクト領域を作成する - システム管理者
3.ユーザーを追加する -　システム管理者
4.プロジェクト情報を登録する - プロジェクトマネージャー　


↑ユースケースごとにシステムフローを作成する。箇条書きではなく、システムフロー図を作成する。だれが何をするかと、画面を抽出する

##7 画面機能一覧
・モデル登録画面・・・モデルの登録とコード出力
・API登録画面・・・APIの登録とコード出力
・DB項目登録画面・・・DBの登録とコード出力
・モデル一覧画面　・・・モデルの一覧と設計書の一括出力
・API一覧画面・・・APIの一覧と設計書の一括出力
・テーブル一覧画面 ・・・テーブルの一覧と設計書の一括出力
・プロジェクト選択画面 ・・・プロジェクトの選択とログインユーザー情報の入力
・ホーム画面　・・・選択後のTOP画面。プロジェクトの説明とメニューを表示

↑システムフローで抽出した画面の一覧。どの画面にどの機能を持たせるかはエンジニアのセンス。画面を抽出したら具体的なイメージを作成する。

##8 システム方式
・開発者に「外注」が含まれているので、Webシステムとする
・Azure PaaS(web Apps + SQL Database)
・開発言語:Angular + Web API (C#)

↑どういった構成でシステムを組むのか。開発言語まで指定しないと外注手配できない。

今回の「要件定義やってみた」はシステムを使った特定の業務の改善になります。プロジェクトの特性や規模によっては現状運用フロー、新運用フロー、費用対効果、開発計画、要員計画、セキュリティ要件などが必要になってきます。
Go言語版 競技プログラミング用標準入力関数を書いてみた

# 概要

`fmt.scan`では、大量入力時に動作が遅いという事なので、入力数$10^5$に対応する関数を書いてみました。

|　　　　　   |バージョン|備考                            |
|------------|--------|----------------------------------|
|対応バージョン|1.6以上 |`Scanner.Buffer`関数の対応バージョン|
|AtCoder     |1.6     |2019年10月01日現在                 |
|Codeforces  |1.12.6  |2019年10月01日現在                 |

基本的には、
[Go 言語で標準入力から読み込む競技プログラミングのアレ --- 改訂第二版](https://qiita.com/tnoda_/items/b503a72eac82862d30c6)
の「`bufio` の `Scanner` を使う (2) スペース区切りで読み込む」と同じですが、改良して長大文字列を`Scanner`で読めるようにします。

## `MaxScanTokenSize`の限界を突破する

デフォルトの`Scanner`では`MaxScanTokenSize=65536`文字を超える文字列は読み込めなかったのですが、バージョン1.6で`Scanner.Buffer`関数が追加されました。この関数で使用するバッファと最大読み込み文字数を変更することができます。

# 作成コード
```go
import (
   "os"
   "bufio"
   "strconv"
)

const MaxBuf = 200100
var buf []byte = make([]byte,MaxBuf)
var sc = bufio.NewScanner(os.Stdin)

func init() {
    sc.Split(bufio.ScanWords)
    sc.Buffer(buf,MaxBuf)
}

func readString() string {
   sc.Scan()
   return sc.Text()
}

func readInt() int {
	sc.Scan()
	r,_ := strconv.Atoi(sc.Text())
	return r
}

func readInt64() int64 {
   sc.Scan()
   r,_ := strconv.ParseInt(sc.Text(),10,64)
   return r
}

func readFloat64() float64 {
	sc.Scan()
	r,_ := strconv.ParseFloat(sc.Text(),64)
	return r
}
```
`func init()`は、`func main()`の前に実行され、パッケージ変数で初期化できなかった処理を行います。

- `sc.Split(bufio.ScanWords)`
    - 空白文字区切りで文字列を読み込むよう設定します。
- `sc.Buffer(buf,MaxBuf)`
    - 前述の通り、読み込みバッファと最大サイズを変更します。

## `string`型の読み込み

`sc.Scan()`で読み込んだ結果をそのまま返します。

## `int`型の読み込み

`n := 1`と書くと、`n`は`int`型と型推論されます。`int`型と`int64`型の比較をしようとするとコンパイルエラーとなるため、整数は特に理由がない限り`int`型として読み込みたいです。`strconv.Atoi`関数を使用して文字列を`int`型に変換します。競技プログラミングでは入力が欠落することがないため、エラー処理は行いません。

## `int64`型の読み込み

`int`型のビット数は実装によって違うことがあるため、64ビット整数であることを保証する`int64`型で読み込みたいことがあります。`strconv.ParseInt`関数を使用します。

## `float64`型の読み込み
`f := 3.14`と書くと、`f`は`float64`型と型推論されます。`float32`型を使う理由は特にないため、`float64`型の読み込み関数のみ用意します。`strconv.ParseFloat`関数を使用します。
東京都主催自動運転試乗会があるので、ついでに調べてみました

東京都主催自動運転試乗会について募集が始まっていました。
https://jidouunten-self.tokyo/
開催日：2019年10月25日（金）、26日（土）
参加費：無料
会場：MEGA WEB ライドワン（江東区青海）
併催イベント：東京モーターショー2019

「ハンドルやアクセルペダル等の無い自動運転車両として日本で初めてナンバープレートを取得した車両」ということなので、自動運転レベル４に相当する車両なのだと思われます。

ついでに、技術面で参考になりそうなサイトを探してみました。

東京都の自動運転政策の意図が読み取れます
https://response.jp/article/2019/05/21/322527.html

国がまとめた資料としてはこれが最新と思われます。
官民ITS構想・ロードマップ2019
https://www.kantei.go.jp/jp/singi/keizaisaisei/jidousoukou/dai9/sankou1.pdf

警察庁：技術開発の方向性に即した自動運転の段階的実現に向けた調査研究
報告書（概要）
https://www.npa.go.jp/bureau/traffic/council/jidounten/2017houkokusyogaiyou.pdf

自動走行タクシーの実現を目指す株式会社ZMP
https://www.zmp.co.jp/knowledge

自動運転の実現を支えるSoC（System on Chip）のサプライヤーNVIDIA
https://jidounten-lab.com/y_nvidia-autonomous-cars-matome
https://jidounten-lab.com/u_nvidia-autonomous-tech-matome#NVIDIA

最後に、トロッコ問題は机上の議論ではなくて、いよいよ現実の問題になってきているようですね。
https://jidounten-lab.com/w_trolley-problem-ai
Redmine Java API で取得可能なタスク管理用項目（Issue、Journal/JournalDetail、TimeEntry）

## この記事について

Redmineでタスク管理しており、状況を可視化するためREST APIによる情報収集を検討しました。

可視化だけなら既存の便利なツールを使えば良いのですが、
勉強がてらJavaのライブラリであるRedmine Java APIを使ってみることにしました。
タスク管理に使えそうな項目の取得方法をメモ書きします。

## Redmine API

チケット等、Redmineの各種情報はREST APIで取得することができ、
取得可能な項目、取得方法は redmine.org にまとめられています。
http://www.redmine.org/projects/redmine/wiki/Rest_api

wikiにはDatabaseModelも掲載されており、
「ライブラリで取得できるが、用途不明な項目」について調査する場合の参考情報となります。
https://www.redmine.org/projects/redmine/wiki/DatabaseModel

## Redmine Java API
Redmine APIをJavaで扱うためのライブラリです。利用方法はgithubで確認出来ます。
https://github.com/taskadapter/redmine-java-api

以下、チケット情報（Issue）、更新履歴情報（Journal/JournalDetail）、作業工数（TimeEntry）について取得方法と取得可能な項目を記載します。

## Issue

#### 取得方法
IssueManager を使用すると、チケット情報を取得することが出来ます。

    // 【URI】"http://ホスト名/redmine"
    // 【ApiAccessKey】右記参照 http://redmine.jp/glossary/r/rest-api/
    RedmineManager manager = RedmineManagerFactory.createWithApiKey("URI", "ApiAccessKey");
    IssueManager issueManager = manager.getIssueManager();
    Issue issue = issueManager.getIssueById(1);

#### 取得可能な項目
利用しそうな項目に絞ります。

|項目|内容|
|:---:|:---:|
|ProjectName|プロジェクト|
|Tracker|トラッカー|
|Id|チケットNo|
|StatusName|ステータス|
|Subject|題名|
|DueDate|期日|
|CreatedOn|作成日|
|UpdatedOn|更新日|
|AuthorName|作成者|
|AssigneeName|担当者|
|EstimatedHours|予定時間|

## Journal/JournalDetail

#### 取得方法
更新履歴情報はIssueから取得可能です。
Issueを取得する際、Include.journalsをパラメータに含める必要があります。
※IssueManager#getIssuesで複数件取得する場合、Include.journalsを指定してもJournalは取得できませんでした。。

    // Includeを指定して、更新履歴を含むチケット情報を取得
    Issue issue = issueManager.getIssueById(1, Include.journals);

    // チケットは更新回数分、Journalを持つ
    for (Journal journal : issue.getJournals()) {
        Integer issueId = journal.getId();
        String userName = journal.getUser().getFullName();
        Date createdOn = journal.getCreatedOn();

        // チケットは複数項目を同時に更新できるため、1つのJournalは複数のJournalDetailを持つ
        for (JournalDetail detail : journal.getDetails()) {
            String name = detail.getName();
            String oldValue = detail.getOldValue();
            String newValue = detail.getNewValue();


#### 取得可能な項目
利用しそうな項目に絞ります。

|項目|内容|
|:---:|:---:|
|Id|更新対象のチケットNo|
|User|更新ユーザ情報|
|Name|更新対象の項目名|
|OldValue|更新前の値|
|NewValue|更新後の値|


## TimeEntry

#### 取得方法

Redmineには工数管理機能があり、活動内容毎に作業工数を記録することが出来ます。
http://blog.redmine.jp/articles/time-tracking/

作業工数を取得する場合はTimeEntryManager を使用します。

    RedmineManager manager = RedmineManagerFactory.createWithApiKey("URI", "ApiAccessKey");
    TimeEntryManager timeEntryManager = manager.getTimeEntryManager();
    Issue issue = timeEntryManager.getTimeEntriesForIssue(1);


#### 取得可能な項目
利用しそうな項目に絞ります。

|項目|内容|
|:---:|:---:|
|UserName|作業者|
|ActivityName|作業内容|
|Hours|作業時間|
|CreatedOn|登録日|

## 出来そうなこと

以下の記事にあるように、様々な計測・分析を行うことが出来そうです。
https://qiita.com/kawahira/items/0196c315642f4a72458f

また、日毎に作業工数を集計することで実績の付け漏れを検知しやすくしたり、
予定工数合計に閾値を設け、メール等でアラートを送るのも良さそうだなと思いました。
Xcode 11でReact Nativeアプリが起動しなくなった場合の対処法

Xcode 11に更新後、既存のReact Nativeアプリが実行時エラーで起動しなくなりましたが、以下の方法で対処して起動できました。

# Xcodeから実行して、実行時エラーが出た場合 (1)

以下の実行時エラーが出た場合の対応を記します。

```
Synchronous remote object proxy returned error: Error Domain=NSCocoaErrorDomain Code=4099 "The connection to service on pid 0 named com.apple.commcenter.coretelephony.xpc was invalidated."
```

以下のコマンドで、シミュレータの設定をしてください。

```
xcrun simctl spawn booted log config --mode "level:off"  --subsystem com.apple.CoreTelephony
```

[情報源はこちら。](https://stackoverflow.com/questions/52455652/xcode-10-seems-to-break-com-apple-commcenter-coretelephony-xpc)

# Xcodeから実行して、実行時エラーが出た場合 (2)

以下の実行時エラーが出た場合の対応を記します。

```
[error][tid:main][RCTModuleMethod.mm:375] Unknown argument type '__attribute__' in method -[RCTAppState getCurrentAppState:error:]. Extend RCTConvert to support this type.
```

react-nativeを0.59.9以上に更新してください。

react-nativeを更新したくない場合は、`node_modules/react-native/React/Base/RCTModuleMethod.mm`を直接書き換えてください。（[公式リポジトリでの修正はこちら](https://github.com/facebook/react-native/pull/25146/files#diff-263fc157dfce55895cdc16495b55d190)）

```c
static BOOL RCTParseUnused(const char **input)
{
  return RCTReadString(input, "__attribute__((unused))") ||
         RCTReadString(input, "__attribute__((__unused__))") || // この行を追加
         RCTReadString(input, "__unused");
}
```

[情報源はこちら。](https://github.com/facebook/react-native/pull/25146)

# react-native コマンドからシミュレータを起動できない場合

例えば以下のように、シミュレータを起動できなかった場合の対応を記します。

```bash
$ react-native run-ios --simulator "iPad (5th generation)"
Found Xcode project YourProject.xcodeproj
CoreData: annotation:  Failed to load optimized model at path '/Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/Frameworks/InstrumentsPackaging.framework/Versions/A/Resources/XRPackageModel.momd/XRPackageModel 9.0.omo'

Could not find iPad (5th generation) simulator

Error: Could not find iPad (5th generation) simulator
    at resolve (/Users/YourName/Documents/YourProject/node_modules/react-native/local-cli/runIOS/runIOS.js:149:13)
    at new Promise (<anonymous>)
    at runOnSimulator (/Users/YourName/Documents/YourProject/node_modules/react-native/local-cli/runIOS/runIOS.js:134:10)
    at Object.runIOS [as func] (/Users/YourName/Documents/YourProject/node_modules/react-native/local-cli/runIOS/runIOS.js:106:12)
    at Promise.resolve.then (/Users/YourName/Documents/YourProject/node_modules/react-native/local-cli/cliEntry.js:117:22)
```

`node_modules/react-native/local-cli/runIOS/findMatchingSimulator.js`の`function findMatchingSimulator(simulators, simulatorString)`内を、以下のように修正してください。

```javascript
    if (!version.startsWith('com.apple.CoreSimulator.SimRuntime.iOS') && !version.startsWith('com.apple.CoreSimulator.SimRuntime.tvOS')) {
//  if (!version.startsWith('iOS') && !version.startsWith('tvOS')) { この行を修正
```

[情報源はこちら](https://stackoverflow.com/questions/54504076/react-native-run-ios-returns-error-could-not-find-iphone-x-simulator)

```javascript
        simulator.isAvailable !== true
//      simulator.isAvailable !== 'YES' この行を修正
```

[情報源はこちら](https://stackoverflow.com/questions/58054691/unable-to-build-react-native-project-after-updating-to-xcode-11-0)