OmniAICreator/Qiita-1.07M huggingface dataset:
/root配下にあるanaconda-ks.cfg ってなに？

## いつも/root配下に`anaconda-ks.cfg`というファイルがいる

```bash
[root@localhost ~]# ls
anaconda-ks.cfg
```

## キックスタートファイルと言われるものらしい...

[こちら](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/performing_an_advanced_rhel_installation/creating-a-kickstart-file-by-performing-a-manual-installation_creating-kickstart-files)を見ると、
`anaconda-ks.cfg`はキックスタートファイルというものらしい。
キックスタートファイルを使えば同じ方法でのOSインストールが行えるようになる。

## 中身を見てみる(抜粋)

```bash
### 最初のインストール時の設定。言語とかキーボードレイアウトとか
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
cdrom
# Use graphical install
graphical
# Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=jp --xlayouts='jp'
# System language
lang ja_JP.UTF-8
```

```bash
### インストール時のネットワークの設定
# Network information
network  --bootproto=dhcp --device=enp0s3 --ipv6=auto --activate
network  --bootproto=static --device=enp0s8 --ip=xxx.xxx.xxx.xxx --netmask=255.255.0.0 --onboot=off --ipv6=auto --activate
```

```bash
### ルートのパスワードとかタイムゾーンとか
# Root password
rootpw --iscrypted xxxxxxxxxxxxxxxxxx
# System services
services --enabled="chronyd"
# System timezone
timezone Asia/Tokyo --isUtc
# System bootloader configuration
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
autopart --type=lvm
# Partition clearing information
clearpart --none --initlabel
```

```bash
### インストールするパッケージ
%packages
@^minimal
@core
chrony
kexec-tools

%end
```

## 新しくインストールするときはどうするの？

インストール時の以下の画面で`tabキー`を押すと入力画面になるので、以下を記載

- httpの時 : `inst.ks=http://IPアドレス/ks.cfg`
- DVDの例 : `inst.ks=cdrom:/ks.cfg`


![redhat [実行中] - Oracle VM VirtualBox 2020-09-29 22..png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/8292a53e-fdcb-d6db-57e7-2abbfb5d3864.png)




## 参考

- [質問です。/root配下にanaconda-ks.cfg...](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13173740758)
- [KickStartその1(KickStartによるLinux自動インストール概要)](https://nopipi.hatenablog.com/entry/2016/07/23/171148)
Vue勉強 2020/10/04

参考サイト
　Windows
　https://wing-degital.hatenablog.com/entry/2019/05/13/223342

　Ubunt
　https://good-arrow.hatenablog.com/entry/2019/06/25/044302

　公開
　
VSCodeインストール
　https://visualstudio.microsoft.com/ja/
　https://www.kkaneko.jp/tools/win/vscode.html#S1

node.jsインストール
 https://nodejs.org/en/

Yarnインストール
　https://classic.yarnpkg.com/ja/docs/install#windows-stable

Yarn確認
　コマンドプロンプトでyarn --versionを実行

Vue.jsインストール
　コマンドプロンプトでyarn global add @vue/cliを実行

Vue確認
 コマンドプロンプトでvue --versionを実行

vueプロジェクト作成
　コマンドプロンプトでvue create sample-app

ビルド実行
　コマンドプロンプトでsample-appに移動
　コマンドプロンプトでyarn serveを実行

アプリ起動
　http://localhost:8080/#/
Compass CSSフレームワーク

## 環境
ruby 環境　を構築
http://rubyinstaller.org/
sassのインストール (gem install sass コマンド)

## compass ダウンロード
http://compass-style.org/
リファレンスが一番の解説。mixin 等も利用できるのが多数ある。

## コマンド
compass create:プロジェクトを作成する。
compass watch: 新規・更新の.scss ファイルを更新する。
詳細は下記
https://dev.classmethod.jp/articles/web-desiner-corder-scss-compass/

## 各種プラグイン
susy http://susy.oddbird.net/

```
sudo gem install compass-susy-plugin
```

blueprint http://compass-blueprint.org/

```
gem install compass-blueprint
```

##その他
DEBUG実行時には

```
@debug($hogehoge)
```

と記載

## その他のcssフレームワーク
https://design-spice.com/2013/05/19/rwd-frameworks-gridsystems/
MacのターミナルでJavaを実行してみた

ProgateでJava勉強してるので、自分で作って実行したいなと思ったのでなんとなくやってみました
参考にしたのは次の記事

https://qiita.com/stupid_student2/items/3e8ffeb33a73ef065a40

macOS Mojave　使用
ファイルはAtomで作りました

<hr>
<ol>
<li>Atomで「Main.java」ファイルを作る<br>
ファイルはデスクトップに「java」というフォルダを作ってそこに保存しました</li>

```java:Main.java
public class Main{
  public static void main( String[] args ){
    System.out.println( "Hello World!" );
  }
}
```
<li>ターミナルで実行</li>

```
cd desktop/java
```

```
javac Main.java
```

→「Main.Class」が生成される

```
java Main
```

→「Hello World!」が出てきた！
</ol>
<br>
なんかいけたからよし！


<hr>
10/8　修正
compass を利用した css スプライト

CSSスプライトは、一つの画像を利用してCSSで表示画像を指定することで、データ通信を一つの画像の読み込みとして、読み込み負荷を削減することができる。
compass では複数の画像を指定して画像を読み込むことで、コンパイルされたCSSと画像を作成することができる。

1.css_icon フォルダを作成する。

```
@import "css_icon/*.png";
@include all-icons-sprites;
```

実行するとCSS スプライト用の大本の画像が作成される。

```
<div class="画像名"></div>
```
で画像が表示される。
【Javascript】breakとreturnのちがいについて

繰り返し処理で使うbreakとreturnの違いが今いちよく分からなかったため調べてみました。

break：
「繰り返し処理からの脱出」
使いどころは、ループ文、switch文

return：
「繰り返し処理のみならず関数そのものからの脱出」
使いどころは、関数

###breakを使った場合：
```Javascript
function numCheck(num){ //一番最初の偶数を見つける関数
for(i = 0; i < num.length; i++){
  if(num[i] % 2 === 0){ 　//配列のi番目の数値が偶数かどうか
    console.log("EVEN");
    break;                         //for文からの脱出
  } else {
    console.log("ODD");
  }
}
    console.log("BREAK!") //for文の外なので出力される。
}

let numbers = [1, 2, 3, 4];
numCheck(numbers);
//=>”ODD" "EVEN" "BREAK!"
```

###returnを使った場合
```Javascript
function numCheck(num){ //一番最初の偶数を見つける関数
for(i = 0; i < num.length; i++){
  if(num[i] % 2 === 0){ 　//配列のi番目の数値が偶数かどうか
    console.log("EVEN");
    return;                         //関数そのものからの脱出
  } else {
    console.log("ODD");
  }
}
    console.log("BREAK!") //for文の外であっても関数の内なので出力されない。
}

let numbers = [1, 2, 3, 4];
numCheck(numbers);
//=>”ODD" "EVEN"
```

いずれも、**ジャンプ文**というもので、他に類似するものとして**continue**を見つけました。

continue:
「次の繰り返しからループを再開する」
使いどころは、ループ文

【公式リファレンス】
　https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/continue
Jest用のテストをそのままMochaで利用してみる

## はじめに

Jestで大量のテストを処理した時に、メモリリークの蓄積がひどいことになってしまいました。

そこで [`mocha-ui-jest`](https://www.npmjs.com/package/mocha-ui-jest) を使って、テストはそのままにMochaへ移行してみることにしました。

テストはTypescriptで書かれてるものとします。

## mocha-ui-jest とは
Mochaは、TDD(describe/it/before/beforeEach)や、BDD(suite/test/suiteSetup/setup) などの書き方を切り替えられるようになっています。

`mocha-ui-jest`はそれをJestのスタイルに合わせてくれて、Jestで使ってる`expect`を使えるようにしてくれます。

要するに`expect`を使ってる程度の簡単なテストなら、Mochaでも使えるようにしてくれます。

`jest`オブジェクトはありませんが、`jest.setTimeout()`や`jest.retryTimes()`くらいなら、Jest用の[setupファイル](https://jestjs.io/docs/ja/configuration#setupfilesafterenv-array)に追い出して対応できるかと思います。

## 手順

### インストール

まずは必要なモジュールをインストールします。

```
npm i -D mocha mocha-ui-jest ts-node tsconfig-paths cross-env
```

### tsconfig.jsonの書き換え
`types`に`mocha-ui-jest`などを追加します。

```
"types": ["mocha-ui-jest", "node"],
```
一部のテストのみでMochaを使いたい場合などは、Mocha用のtsconfigを用意してもいいでしょう。

```json:tsconfig.mocha.json
{
  "extends": "./tsconfig",
  "compilerOptions": {
    "types": ["mocha-ui-jest", "node"]
  }
}
```

### Mochaの設定ファイルを作る `.mocharc.json`
`require`で`mocha-ui-jest`を読み込んで、`ui`で`jest`を指定します。
`tsconfig.json`の`paths`を利用してる場合は、`tsconfig-paths/register`も`require`に追加してください。
それ以外の設定は各自のお好みでどうぞ。([mocha オプション](https://mochajs.org/#command-line-usage))

```json:.mocharc.json
{
  "require": ["mocha-ui-jest", "ts-node/register"],
  "ui": "jest",
  "reporter": "list",
  "parallel": true,
  "retries": 3,
  "timeout": 30000
}
```

### タスクを追加
`package.json`の`script`にタスクを追加します。
必要に応じて環境変数でts-nodeの設定をしてください。([ts-node オプション](https://github.com/TypeStrong/ts-node#cli-and-programmatic-options))
**TS_NODE_FILES**　―　d.tsファイルを読み込ませる時に必要
**TS_NODE_PROJECT**　―　tsconfig.jsonを指定する時に使う

```
  "mocha": "cross-env TS_NODE_FILES=true TS_NODE_PROJECT=tsconfig.mocha.json mocha \"test/**/*.test.ts\"",
```

### 実行
あとは実行するだけです。

```
npm run mocha
```

## カバレッジをとる場合
少し試してみましたが、Mochaの`parallel`を無効化しないとダメでした。

### nyc をインストール
```
npm i -D nyc
```

### nycの設定
`nyc.config.js`を作成します。

```js:nyc.config.js
module.exports = {
  all: true,
  include: ['src/**/*.ts'],
  exclude: ['**/*.d.ts'],
  reporter: ['lcov', 'html', 'text'],
}
```

### タスクを追加
`package.json`の`script`にタスクを追加します。
`parallel`を無効化するために、`--no-parallel`を渡します。

```
  "mocha:coverage": "nyc npm run mocha -- --no-parallel",
```

### 実行

```
npm run mocha:coverage
```

## まとめ
Jestで`expect`を使ってる程度のテストなら、Mochaでもそのまま利用できることがわかりました。

Jestのテスト環境はなかなか特殊で、ある時突然地雷を踏んでしまうこともあるので、Mochaでもテストできる用意をしておくのはアリかもしれない。

## リンク
**mocha-ui-jest**　―　https://www.npmjs.com/package/mocha-ui-jest
**mocha オプション**　―　https://mochajs.org/#command-line-usage
**ts-node オプション**　―　https://github.com/TypeStrong/ts-node#cli-and-programmatic-options
[Flutter]Timer.periodicで現在時刻を表示したらエラーが出続けた

#Timer.periodicでエラー
Flutter開発の勉強中、現在時刻の表示を行った後に画面遷移をしたら、エラーが出力され続ける現象に遭遇しました。
なかなか困ってしまったので、忘れないように対処法のメモ書きを残します。
dispose内でちゃんとキャンセルを書かないと停止されず、裏で動き続けちゃう様です。

```dart:timer.dart
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'dart:async';

class TimerPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _TimerState();
  }
}

class _TimerState extends State<TimerPage> {
  String _nowtime = '';
  var formatter = DateFormat('yyyy/MM/dd HH:mm:ss');
  var _timer;

  @override
  void initState() {
    super.initState();
    _timer = Timer.periodic(
      // 定期実行する間隔の設定.
      Duration(milliseconds: 100),
      // 定期実行関数.
      _onTimer,
    );
  }

  @override
  void dispose(){
    // 破棄される時に停止する.
    _timer.cancel();
    super.dispose();
  }

  void _onTimer(Timer timer) {
    var now = DateTime.now();
    var formatterTime = formatter.format(now);
    setState(() {
      _nowtime = formatterTime;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('TimerPage')),
      body: Container(
        padding: EdgeInsets.all(20),
        child: ListView(
          children: <Widget>[
            Container(
              child: Text('現在時刻：\n' + _nowtime),
            ),
          ],
        ),
      ),
    );
  }
}
```

#プレビュー
画面遷移後もエラーが出る事は無くなりました。
![timer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703546/4e6f8a31-e87e-cfc1-b093-dcdd3993ae45.png)

#参考
+ [Timer の使い方 - Flutter によるアプリケーション開発 - Flutter 入門](https://flutter.keicode.com/basics/timer.php)
Ruby 配列内での掛け算

# 配列内での掛け算(標準入力)

3 つの整数がスペース区切りで与えられます。
3 つの整数を掛け算した数値を出力して下さい。

例えば

```
4 10 5
```
この場合 4 × 10 × 5 で

```
200
```
と出力して下さい。

## やり方.1
```:ruby.rb
numbers = gets.split(' ').map(&:to_i)
a = 1
numbers.each do |number|
    a = a * number
end
puts a
```

### 解説
```
numbers = gets.split(' ').map(&:to_i)
```
・　getメソッドで入力要素を呼び出す
・　splitメソッドで文字列をカンマ区切りで分割する
・　mapメソッドで要素を１つづつ取り出し`to_i`で整数に変換する

```
a = 1
numbers.each do |number|
    a = a * number
end
```

・　`a=1`でaに１を代入する(初期値)
・　numbersの要素をnumber変数に代入して下の処理を繰り返す

## やり方.2
### injectメソッドのやり方
```
numbers = gets.split(' ').map(&:to_i).inject(:*)

puts numbers
```


## injectメソッド(配列の合計を算出するメソッド)
injectはeachやmapと同じように繰り返しを行うメソッドです。

ブロックを使って繰り返し計算を行うことが特徴で、

```
配列オブジェクト.inject {|初期値, 要素| ブロック処理 }
```
のように記述します。

繰り返し順にブロックの要素が配列分加算されていき、ブロックの処理にて計算を行っていきます。


###injectにシンボルを使って演算子を指定する
injectに演算子をシンボルで渡すことで、よりスタイリッシュにinjectを書くことができます。

例えば、

* 配列の中身の合計を算出したい

* 全部掛け合わせた値を計算したい

* 配列の中身を使って順番に引き算をしたい

* などさまざまな場面で使用可能です。

```
array = 1..6
p array.inject(:+) #配列の要素をすべて足す
p array.inject(3,:+) #初期値3に対して、配列の要素をすべて足す
p array.inject(:*) #配列の要素をすべて掛ける
p array.inject(3,:*) #初期値3に対して、配列の要素をすべて掛ける
p array.inject(100,:-) #100からarrayの合計値を引く
```
[実行結果]

```
21
24
720
2160
79
```

## やり方.3
```
nums = gets.split(' ')
puts nums[0].to_i * nums[1].to_i * nums[2].to_i
```

# まとめ
コメントでご指摘してくださったinjectメソッドを用いたやり方の方がスマートで簡単に計算ができますね！
コメントありがとうございました。
ジョンソン法(python)

##ジョンソン法
各製品がそれぞれ2つの工程を経て完成されるときに、作業期間が最適になるスケジュールを求める手法のこと。
![スクリーンショット 2020-10-04 19-50-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417037/e5b045b9-eccf-7369-2da7-836d5ae3379c.png)

上の画像の例であれば、麺を茹でる順をどのようにすれば最適かを求める。
[参考](https://life-is-yuyu.com/consultant/operational-management/johnson-rule-process/)


##かいてみる

```test.py

# -*- coding: utf-8 -*-
#ジョンソン法

def johnsonMethod(job_pair):
    
    front = []
    back = []
    process_1 = []
    process_2 = []
    sum_time = 0
    
    while True:
        
        min_jobs = [min(jobs) for jobs in job_pair]
        min_job = min(min_jobs)
    
        if min_job == 9999:
            sum_time += process_1[0] #一番最初の前工程を足して終了
            break
    
        job_pair_index = min_jobs.index(min_job)
        job_index = job_pair[job_pair_index].index(min_job)
        
        if job_index == 0:
            front.append(job_pair_index)
        else:
            back.append(job_pair_index)
            
        process_1.append(job_pair[job_pair_index][0])
        process_2.append(job_pair[job_pair_index][1])
        
        if sum(process_1) > sum(process_2):
            sum_time += job_pair[job_pair_index][0]
        else:
            sum_time += job_pair[job_pair_index][1]
            
        job_pair[job_pair_index] = [9999, 9999]
    
    front.extend(list(reversed(back)))
    order = ["J" + str(x + 1) for x in front]
    print(order)
    print("所要時間 : " + str(sum_time))
        
#"https://studying.jp/shindanshi/past-exam/exam20unei.html 第18問"
johnsonMethod([[5,5],[6,4],[4,3],[2,8],[5,7]])
```
VirtualBox で ssh が繋がらないときにとりあえず設定して欲しいたった1つのこと

# 概要
ssh した際に Connection refused が出た場合、
sshd サービスがサーバ側で立ち上がっていないとかポートが開いていないとかはよくある話ですが、
そういう設定は全部してるはずだよなぁって時にとりあえず設定してみてほしいです。

# 環境
* Windows10
* VirtualBox 6.1.14 (2020.10.04 現在)

# 設定
設定 > ネットワーク > NAT > 高度 > ポートフォワーディング
を開きます。
![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534222/47730310-17fb-5ee9-cced-e6741203310d.png)

ローカルとリモートのポートフォワードを設定します。
![image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534222/3b132942-52e2-4cdf-e514-6f40474f890f.png)

# 終わりに
ちょっと前まで(とは言っても1年以上前だけど)はこんな設定あったかな？
って感じなのですが、最近の VirtualBox は必要なんですかね。
理屈は分かるけど、個人的にはデフォルトでは同じフォワーディングにして欲しいです…

Windows10 と VirtualBox の組み合わせでしか確認出来ていないので
そこはご容赦ください。
【Java Silver】switch文について気を付けるべきこと

#switch文の文法構造

```java
switch(変数){
　　　case 条件: //処理;
               break;
     case 条件: //処理;
               break;
     default:  //処理;
               break;
}

```
・defaultラベルは慣習的に一番最後に記述しているが、
**一番最後以外に記述しても問題無い**

・**break文を書き忘れる**と、**次の条件の処理に進んでしまう**（フォールスルー）
 

##case値に書けるもの
※case値とは：分岐するために使う値・条件のこと

**・定数**
**・条件式に記述されている変数の型と同じ型か互換性のある型**
・byte型
・char型
・short型
・int型
(※つまりlong以外の整数型)

・enum型
・String型

##case値に書けないもの
**・変数**
**・条件式に記述されている変数の型と互換性の無い型**
**・null**
**・long型**
**・boolean型**
#26 CocoaPodsとPodsライブラリの更新の1例

#はじめに
私の備忘録程度の出来です．
ご了承くださいませ．


#環境
Xcode：12.0.1
Swift：5.3
2020/10



##part1
**以降の操作は全てターミナルで行う．**

現在のバージョンの確認

```
pod --version
```



##part2
cocoaPodsの更新

```
sudo gem update cocoapods
```

※うまくcocoaPodsの更新できない場合，一度アンインストールし，再度インストール．

```
sudo gem uninstall cocoapods
```

```
sudo gem install cocoapods -n /usr/local/bin
```



##part3
cocoaPodsの更新が終わったら，以下のコマンドを入力．

```
pod setup
```

※古いバージョンのcocoaPodsが壊れている場合，古いバージョンのcocoaPodsを削除．

```
sudo gem clean cocoapods
```



##part4
**以降の操作はpodファイルのあるディレクトリで行う．**

cocoaPodsでインストールしたライブラリのバージョンの確認方法．
インストールしたライブラリが現在どのバージョンなのか，また新しいバージョンが出ているのかを調べる時に便利です．

```
pod outdated
```
コマンドを打った時の見方．

```
インストールされているライブラリのバージョン > 現設定でインストールが可能なバージョン (ライブラリの最新バージョン)
```

`赤：アップデートできないライブラリ`
`黄：現状使われていないライブラリ`
`緑：アップデート可能ライブラリ`



##part4
Podsを更新

```
 pod update
```

※Podsディレクトリを削除する場合．

```
sudo rm -fr Pods/
```
Flutter 未経験から 2 ヶ月でバリバリ活躍できるようになるまでに実践したことと、そこから得られた教訓をまとめた

# 背景

とある現場で Android(Kotlin) 案件をこなしていたのですが、別プロジェクトで Flutter を使った Android アプリ開発案件が同時並行で進んでいました。
未経験ではありましたが元々興味があり、Flutter 案件の方もやりたいと希望を出したところ、無事希望が通りました。
そんなこんなで Flutter 未経験から 2 ヶ月でバリバリ活躍できるようになるまでに実践したこと、それらの実践から得られた教訓をまとめます。

# 当時の私のスキル

- Android(Java)の経験が 3 年くらい、Kotlin も同時並行で勉強中
- アーキテクチャという概念を最近知った
- リアクティブプログラミング未経験、概念よくわからない

# まずは簡単な UI 修正から

まずは簡単な UI 修正から入りました。
アーキテクチャは BLoC パターンでそれ自体は初めて聞いたものの、UI とロジックがきれいに分割されており、該当の箇所を見つけ出すのもさほど難しくはありませんでした。　
Dart という未知の言語で書かれてはいるものの、書き方は Java に近い感じで割と読めました。
とはいえ、レイアウトの組み方は独自だったので、そこは英文を読みながら辞書を引く感覚で適宜調べました。
具体的には Row だったり Column だったりのレイアウト、テキストやボタン、入力ボックスなど、対応するウィジェットはどれかといった内容です。
とりあえず頭で「こう組めばいけるんじゃないか」というイメージを浮かべながら、実際にネットのサンプルを見様見真似で打ち込み、表示させてイメージとの差分を明らかにしました。
イメージと実際の表示が一致すれば OK、一致しなければ何がダメだったかを考えてまた別の手を試してみる。そして一致するまで繰り返す。
このトライアンドエラーを黙々と繰り返す中で、徐々にノウハウが構築されていきました。

# 期間内にきちんと結果を出す

未経験とはいえ仕事なので、結果を出さなければいけません。
自分が心がけていたのは、「1 日の仕事の中で何か 1 つ成果を出す」ことです。
成果を出すことで、「今日はここまで理解が進んだ」とポジティブな気持ちが生まれ、明日も頑張ろうというモチベーションが生まれます。
わからないと立ち止まるのではなく、とにかくトライアンドエラーを繰り返しまくり、何としても成果を出すようにしました。
もちろん 1 人で悶々とすることもあるので、そこは悩む時間を決めて、一定時間悩んでわからなかったらチームの方に相談しました。

# レビューを受ける

レビューは自分が気づかなかったプログラムの穴を気づかせてくれます。特に初心者のうちは経験者のフィードバックがもらえるというのは素晴らしい機会でした。ガンガン活用し、さらに力をつけました。

# 徐々にステップアップしていく

ある程度 UI 修正をこなしたのち、新規画面の作成やロジックの修正、新規追加も担当することになりました。
ロジックを修正するにあたってどうすればいいかわからなかったので、まずは今まで何となくで放置していた BLoC パターンの理解を進めることにしました。
BLoC パターン、Stream と Sink、リアクティブプログラミング、Observer パターン、といった具合で気になったキーワードも全部調べました。
ただ、あまり深追いはせずに「こういうものなんだ」という数割程度の理解で止めてから、他のロジック処理を見様見真似で実装しました。
ここでも UI 修正と同様、イメージを浮かべながら実際に試して、ダメだったらまた別の手を試すといった具合でトライアンドエラーを繰り返しました。
結果、少しずつロジックの修正や追加も難なくできるようになっていきました。

# 壁にぶつかりながら理解していく

ベテランエンジニアでも一度も壁にぶつかることなく順調に実装が進むことはありません。予想し得ない何かが起こり、壁にぶつかることもあります。何度も書いていますが、トライアンドエラーを泥臭く繰り返しました。
初心者とベテランの大きな違いは壁にぶつかった時の対処の仕方にあると思っています。
初心者は得体の知れない壁に恐怖して慌てふためきますが、ベテランは冷静に状況を分析し、原因をきちんと調べて論理的に解決します。
どうして冷静に対処できるのかというと、個人的には「壁というのは往々にして現れるもので、壁にぶつかることで理解も深まる」とポジティブに考えているからだと思っています。

# 新しいことを学ぶことを楽しむ

壁にぶつかる、ひたすらトライアンドエラーを繰り返す。
こう聞くと気が滅入りそうですが、Flutter という最新の未知なる技術に触れている。これを使えばクロスプラットフォーム開発ができる。より未来の選択肢が広がる。と考えれば、ワクワクしてこないでしょうか。新しいことを学ぶことにはいろいろなメリットがあります。ポジティブに考え、新しいことを学ぶことを楽しみましょう。

# まとめ

ここまでの実践を踏まえて得られた教訓をまとめます。

## 全部わかってから始めるのでは何もできないし、始まることすらない

ここまで読んだ方には察しがつくかと思われますが、理解するためにはやってみて壁にぶつかるという過程が必須です。全部わかってから始めるのでは何もできないし、始まることすらないでしょう。

## 全てを理解しなくても開発はできる

上述の話と少し被りますが、どんな言語を学ぶにせよ文法だけでなくパフォーマンスやどう動くかの仕組みなど、学び出せばどこまでも学ぶことができます。非常に奥が深いです。
要するに、最初から完璧を目指すとあまりの奥の深さに間違いなく挫折します。
私も Flutter の全てを理解しているわけではありません。
全てを理解しなくても開発はできます。
だからといって学び続けるのを止めてはダメですが。

## 自走力をつける

上述の話を念頭に置いた上で、ぜひ何かアプリなりサービスなりを独学で作ってみてください。
自走力というのは何かを 1 人で成し遂げるという経験を積むことで身についていくものだと私は考えています。
その中で達成感や学びを得ることで、徐々についていくはずです。
Swift Xcode 12、New Project、App、Use Core Dataのコードがいけていない？

# デフォルトのコード

```swift
:
:
:
struct ContentView: View {
    @Environment(\.managedObjectContext) private var viewContext

    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)],
        animation: .default)
    private var items: FetchedResults<Item>

    var body: some View {
        List {
            ForEach(items) { item in
                Text("Item at \(item.timestamp!, formatter: itemFormatter)")
            }
            .onDelete(perform: deleteItems)
        }
        .toolbar {
            #if os(iOS)
            EditButton()
            #endif

            Button(action: addItem) {
                Label("Add Item", systemImage: "plus")
            }
        }
    }
:
:
:
```

リストは表示されるが、「.toolbar」は？
NavigationViewが必要では？

![](http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2020/10/new_project_app_doredata_1-511x1024.png)

# NavigationView追加

```swift
:
:
:
struct ContentView: View {
    @Environment(\.managedObjectContext) private var viewContext

    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)],
        animation: .default)
    private var items: FetchedResults<Item>

    var body: some View {
        NavigationView {
            List {
                ForEach(items) { item in
                    Text("Item at \(item.timestamp!, formatter: itemFormatter)")
                }
                .onDelete(perform: deleteItems)
            }
            .toolbar {
                #if os(iOS)
                EditButton()
                #endif

                Button(action: addItem) {
                    Label("Add Item", systemImage: "plus")
                }
            }
        }
    }
:
:
:
```

![](http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2020/10/new_project_app_doredata_2-507x1024.png)

AddItemはまだ表示されないか。。。

# toolbar内をHStackにする

```swift
:
:
:
struct ContentView: View {
    @Environment(\.managedObjectContext) private var viewContext

    @FetchRequest(
        sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)],
        animation: .default)
    private var items: FetchedResults<Item>

    var body: some View {
        NavigationView {
            List {
                ForEach(items) { item in
                    Text("Item at \(item.timestamp!, formatter: itemFormatter)")
                }
                .onDelete(perform: deleteItems)
            }
            .toolbar {
                HStack {
                    #if os(iOS)
                    EditButton()
                    #endif

                    Button(action: addItem) {
                        Label("Add Item", systemImage: "plus")
                    }
                }
            }
        }
    }
:
:
:
```

![](http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2020/10/new_project_app_doredata_3-528x1024.png)
mysqlのrpmパッケージの{version-number}の意味

## mysqlのサイト

https://dev.mysql.com/doc/refman/5.6/ja/linux-installation-yum-repo.html

```
shell> sudo yum localinstall mysql-community-release-el7-{version-number}.noarch.rpm
```

## `{version-number}` の意味
- パッケージ自体のバージョン
- CentOS7.x の x部分のOSのマイナーバージョンのことではない
- yumで取得するパッケージでは、version3まで出ている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/1d3237da-7232-eece-6a41-0994ed995b3b.png)

https://pkgs.org/download/mysql80-community-release
SQL文を使って特定のレコードを表示する

### アプリ実装を通して発見したことを自分の備忘録として書いていく記事。


## 今回詰まったこと
###テーブルの中の特定のカラムが空のものだけ表示したい
一覧に特定のカラムがからのものだけを表示したいと思い、まずはSQL 文でそのレコードを取るためと記述をググる。すると

```
SELECT * FROM テーブル名 WHERE カラム名 IS NULL;
```
を発見！確認したところこの記述で狙ったレコードは取得できている様子。

## がしかし、これをアプリ実装に使うことができない
今の場合タスクが一覧にズラーっと並んでいる状態。これを tasksテーブルのPointカラムが空なタスクだけを表示するにはどうしたらいいか。まずはindexを確認しにいく

```erb

 <% if user_signed_in? %>
    <%= @tasks.each do |task| %>
       <%= link_to edit_task_path(task.id) do %>
           <div class="task" >
           <span class='task-btn'><%= task.content %></span>
           </div>
       <% end%>   
     <% end %>
 <% end %>  
```
これは一覧にズラーっと並べる記述。この@tasksはコントローラーで定義しているのでコントローラーを見にいく

```
def index
      if user_signed_in?
      @tasks = Task.all
      end
  end
```
この@taskの中に代入する記述を変える必要があると思い2時間くらい悩む。結論

```
def index 
      if user_signed_in? 
      @tasks = current_user.tasks.where(point: nil)
      end
  end
```
の記述で画面上にPointが空のレコードを表示することができた。
前に違う件でuser.tasks.where(条件)でtasksテーブルから条件を指定して表示するやり方を教えてもらったことがあるのでそこからヒントを得ることによって解決できた
【Java Silver】equalsメソッドについて

Java Silverを勉強するにあたって、覚えておくべきequalsメソッドにまつわる内容をまとめます。
##equalsメソッドとは

<公式ドキュメント> [equalsメソッド](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Object.html#equals-java.lang.Object-)

equalsメソッドは**java.lang.Objectクラス**に定義されているメソッドである。

##通常の挙動
```java
a.equals(b);
```
変数aに格納されているインスタンスと変数bに格納されているインスタンスが**同じ値**を持っているか確認する**(同値性)**


※インスタンスの**同一性（同じ参照を持っているか）**を確認するには**==演算子**を利用する
**internメソッド**を使って、同値だが同一ではないインスタンスを==演算子で比較すると、trueを返す

```java
String a = "abc";
String b = new String("abc");

System.out.println(a == b); //falseが返る
System.out.println(a.intern() == b.intern()); //trueが返る
```
これは、internメソッドが、コンスタントプールを含む、メモリ内の文字列を探して再利用するためのメソッドであるため。
コンスタントプール とは、**文字リテラル**がプログラム内に再び登場すると、**過去に作成した同じ文字列インスタンスへの参照が使い回しされる**こと




##Objectクラスのequalsメソッド
equalsメソッドはObjectクラスに定義されているので、全てのクラスが持っている。しかし、**Objectクラス**のequalsメソッドだけは、同値性ではなく**同一性**を判定するよう定義されている。定義は次の通り。

```java
public boolean equals(Object obj){
   return (this == obj);
}
```

**同値性の確認方法**は各クラスによって異なるため、equalsメソッドは**オーバーライドして使う**ことを前提としている。

**オーバーライドしなかった場合、同値性ではなく同一性を検証する！！！**

##java.lang.Objectクラスに定義されているメソッドであるということ

**java.lang.Objectクラス**に定義されているメソッドを**インターフェース**で**デフォルトメソッド**としてオーバーライド
→**コンパイルエラー**となる

故に、equalsメソッドをオーバーライドする際は、**クラス**でオーバーライドする必要がある。



**※java.lang.Objectクラスに定義されているメソッド一覧**
![スクリーンショット 2020-10-04 18.36.43 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595580/d8e1d50d-b0ef-b1f8-069b-7efbb99ca46a.png)



##nullを引数にとってもNullPointerExceptionは発生しない
equalsメソッドにnullを渡しても、NullPointerExceptionは発生しない

＜公式ドキュメント＞
> x.equals(null)はfalseを返します。

＜[Java equalsでnullまたは空文字を比較するサンプル](https://itsakura.com/equals_null)＞より
> a.equals(b)のとき、aがnullの場合は、NullPointerExceptionが発生します。
a.equals(b)のとき、aがnullではなくbがnullの場合は、falseを返します。
Java7で追加されたObjects.equals(a,b)は、a,bがnullでもNullPointerExceptionは発生しません。

#参考

[Java equalsでnullまたは空文字を比較するサンプル](https://itsakura.com/equals_null)
【AWS SOA】EC2のプレイスメントグループの備忘録

#はじめに
プレイスメントグループを使用することで、ネットワークパフォーマンスが向上したり相互関係のあるエラーを軽減できる。
SOAの勉強に当たってEC2のプレイスメントグループの理解が求められるため、本稿で簡単にまとめたい。

#プレイスメントグループ戦略
・クラスター
シングルAZでインスタンスを論理的にグループ化。
低いネットワークレイテンシー、高いネットワークスループットが特徴。
![スクリーンショット 2020-10-04 18.04.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/451e5398-8d9e-7dcf-077a-15b6e050895d.png)

・分散
物理ラックの単位でインスタンスを配置。
グループのAZ毎に、最大7つの実行中のインスタンスを持つことができ、同時障害のリスクが軽減されるため、重要なアプリケーション向け。
![スクリーンショット 2020-10-04 18.11.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/ec3a15c0-ff7d-376a-7059-c1f30be56340.png)

・パーティション
シングルAZ内で各パーティションに複数のインスタンスが構成されている。
HDFS、HBase、Cassandraなどの大規模な分散向け。
![スクリーンショット 2020-10-04 18.13.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/f013c152-842b-3846-0e36-37ed5db3f28b.png)

#作成方法
EC2>プレイスメントグループを作成を選択。
![スクリーンショット 2020-10-04 18.45.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/7f5f95a0-04db-46bb-28f3-a1edbbdc2061.png)
名前を入力し、クラスター・スプレッド・パーティションを適時選択する。必要に応じタグを追加した上で、グループを作成を選択する。
![スクリーンショット 2020-10-04 18.46.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/3e675906-8b87-f970-bb2e-ed7ad2f4011e.png)
パーティションの場合、パーティション数を選択して作成する。
![スクリーンショット 2020-10-04 18.49.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/4583acb2-e256-c96f-34d6-f809a3e6d6b4.png)
プレイスメントグループの作成し、インスタンスの詳細の設定で配置グループにおいて「インスタンスをプレイスメントグループに追加します。」にチェックを入れるとプレイスメントグループを選択できる。
![スクリーンショット 2020-10-04 18.51.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/d0222fbf-7a4c-7124-20e9-665d590f933b.png)

参考
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/placement-groups.html
https://dev.classmethod.jp/articles/ec2-placement-group-strategy/
pythonで画風変換 git cloneでお手軽に 備忘録 [中級者向け]

AIで画風を学習し、実際に撮った写真を変換する画風変換があります。最近ではアプリケーションにもなっているのですが今回は実際にpythonを実行し変換を行っていきます。
...とは言っても自分で作るのことはできないので、先人の皆様のgitからソースを取得していきます。

今回は[fast-neural-style-keras](https://github.com/misgod/fast-neural-style-keras)の画風変換を実行していきます。
こちらのfast-neural-style-kerasの使い方はhow to useに記載されているコマンドを実行すればできるのですが、現在(2020年)だとライブラリのバージョン更新の関係でうまく動作しません。こちらのコードはなんと2017年にgitに投稿されています。時代とライブラリの進み具合は早いですね笑


調べていくと[画風変換を動かすまでに出てきたバグ](https://medium.com/lsc-psd/ai%E3%81%8C%E4%BA%BA%E3%82%92%E3%82%A4%E3%82%B1%E3%83%A1%E3%83%B3%E3%81%AB%E3%81%99%E3%82%8B%E6%99%82%E4%BB%A3-3313e033af83)で修正点がまとめられていたので、こちらの記事通りの修正をしたのですが、一部ライブラリがさらに更新されたようなのでその個所のコード修正と使用したライブラリのバージョンを備忘録として以下にまとめます。

# 実行環境
python 3.7.9
tensorflow           1.13.1
Keras                2.2.3
imageio              2.9.0
scipy                1.2.0

# コード修正
git clone等の方法については
[画風変換を動かすまでに出てきたバグ](https://medium.com/lsc-psd/ai%E3%81%8C%E4%BA%BA%E3%82%92%E3%82%A4%E3%82%B1%E3%83%A1%E3%83%B3%E3%81%AB%E3%81%99%E3%82%8B%E6%99%82%E4%BB%A3-3313e033af83)を確認してください。私の記事では最低限のコード修正箇所のみ書きます。

```VGG16.py
# 修正前
from keras.applications.imagenet_utils import decode_predictions, preprocess_input, _obtain_input_shape
# 修正後
from keras_applications.imagenet_utils import decode_predictions, preprocess_input, _obtain_input_shape

# 87行目
# 修正前
include_top=include_top
# 修正後
require_flatten=include_top
```

```transform.py
# import追加
import imageio

# 107行目
# 修正前
imsave('%s_output.png' % output_file, y)
# 修正後
imageio.imwrite(output_file+'/'+style+'img_saved.jpg', y.astype(np.uint8))
```

# いざ画風変換

fast-neural-style-keras\imagesフォルダ直下に変換したい画像ファイル[test.jpg]を配置します。
fast-neural-style-keras\直下に結果出力用フォルダ[output]を作成します。
下記コマンドを実行します。今回は富嶽三十六景(stayle wave_crop)を選択しています。

```
python transform.py -i images/test.jpg -s wave_crop -b 0.1 -o output
```

# 入力画像
![test.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135147/406b02c5-93c8-36a6-c4dd-b00707562530.jpeg)

# 画風変換結果
![wave_cropimg_saved.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135147/1ad07dbe-b19b-f2b6-e73f-6e42a43caa61.jpeg)

フリー素材の猫の画像を変換しました。
皆さんもぜひ試してみてください。
動作しないなど問題があれば聞いてください。可能な限りで対応します。
無事、変換出来たらLGTMください笑
Windows10でVSCode+JUnit5を使えるようにしたメモ

所用にて掲題の環境を準備する必要があったので、動くようになるまでをメモしてみました。
あまりこの辺りに詳しくないので不備もあるかもしれませんが、お役に立てば幸いです。

# OpenJDKのダウンロード
JDKにはいくつか種類があるが、ここではOpenJDKを使うことにする。
https://openjdk.java.net/
2020年10月現在、最新はJDK15だったのでこれのWindows向けをダウンロード。
Windows向けをダウンロードして解凍し、出てきた「jdk-15」を任意のフォルダに配置する。

# Java Extension Packのインストール
VSCodeの拡張機能からJava Extension Packをインストールする。
インストールしたら、`Ctrl+,`で設定を表示し「Java:Home」で検索、「settings.jsonで編集」をクリックして上記で配置した「jdk-15」のフォルダを指定する。
この際、以下のようにしてバックスラッシュを2つ重ねる必要がある。

```
"java.home": "C:\\hoge\\hoge\\jdk-15"
```

# Javaプロジェクトの作成
* `Ctrl+Shift+P`で「Java: Create Java Project ...」を選択
* 「Select the project type」でMavenを選択
* 「Select an archetype ...」で「maven-archetype-quickstart」を選択
* 「Select a version ...」で1.4を選択

フォルダを選択してJavaプロジェクトを作成しようとすると、環境変数`JAVA_HOME`が設定されていないとのエラー。

```
Error: JAVA_HOME not found in your environment. 
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation.
```

PowerShellを管理者権限で起動して、以下のコマンドでシステム環境変数`JAVA_HOME`にJavaの格納パスを設定。
`[System.Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\hoge\hoge\jdk-15", "Machine")`
その後VSCodeを再起動。(再起動しないと上記のエラーが解消されなかった。)

再度Javaプロジェクトを生成して、各種IDを設定。

```
Define value for property 'groupId': (パッケージ名にしたいものを指定)
Define value for property 'artifactId': (jar名にしたいものを指定)
Define value for property 'version' 1.0-SNAPSHOT: : (入力せずデフォルト値のまま)
Define value for property 'package' (groupIdに入力したもの): : (入力せずデフォルト値のまま)
```

生成したJavaプロジェクトのフォルダをVSCodeで開いたら、プロジェクトの作成は完了。

# ビルドの実行
VSCodeのエクスプローラーペインにて、srcフォルダの配下にあるApp.javaを右クリック、「Run」を実行するとビルドされ、ターミナルに「Hello World!」が出力される。

# JUnit4→5への変更
Javaプロジェクトを作成したそのままだと、JUnit4が使用されていたので、JUnit5に変更する。
JUnit5のサンプルプロジェクトがあるので、そのpom.xmlを参考に、作成したプロジェクトのpom.xmlを変更する。
https://raw.githubusercontent.com/junit-team/junit5-samples/r5.7.0/junit5-jupiter-starter-maven/pom.xml

今回はこのように変更した。

```diff
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.junit</groupId>
+        <artifactId>junit-bom</artifactId>
+        <version>5.7.0</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
   <dependencies>
     <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <version>4.11</version>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter</artifactId>
       <scope>test</scope>
     </dependency>
   </dependencies>
```

pom.xmlを保存すると、同期をするか確認するダイアログが表示されるので「Now」をクリックして同期をする。
これでJUnit5が使用できるようになる。
【GCP】DataFlowを利用してDataStoreにデータを登録(ユーザー定義関数)

# はじめに
GCPのデータパイプラインを構築するプロダクトである、Dataflowを利用して
DataStoreにデータを登録する時のユーザー定義関数について共有します。

初めての方は、以下記事を前提にしておりますので、参照をお願いします。
https://qiita.com/sasuke9097/items/c3538933060f18b4c199

# 前提
* Dataflowを利用してDataStoreにデータが登録できること
* 簡単なJavaScriptを記述できること

# できるようになること
* DataFlowのUDFを利用したデータの加工処理ができるようになる

## ユーザー定義関数の概要
GoogleではUDF(User Define Function)と呼びます。
入力から出力の間に加工を施したり、登録するデータにフィルターを
かけることができます。

## ユーザー定義関数実行までの流れ
ユーザー定義関数実行には、以下の手順を踏みます。

1. ユーザー定義関数の作成
1. 作成したユーザー定義関数をGCSに配置
1. JOB実行時のパラメータに配置したユーザー定義関数を指定

### ユーザー定義関数の作成
ユーザー定義関数を作成します。
ルールは、JOBから呼び出すときの関数を作成すること。
名前は任意です。今回は「transform」です。
プロパティを追加、変更、削除しています。
DataStoreの型によって、StringValueの部分は変わります。

``` my_function.js
function transform(inJson){
    // JSON文字列をオブジェクトに変換
    var json = JSON.parse(inJson);

    // プロパティ値を変更
    json.properties.s.stringValue = 'transform';

    // プロパティを追加
    json.properties.w = addStringValue('new prop');

    // プロパティを削除
    delete json.properties.t;

    // オブジェクトをJSON文字列に変換
    return JSON.stringify(json);
}

function addStringValue(value){
    newprop = new Object();
    newprop.stringValue = value;
    return newprop;
}
```

### 作成したユーザー定義関数をGCSに配置
作成したユーザー定義関数はGCSの任意のフォルダにアップロードしてください。

### JOB実行時のパラメータに配置したユーザー定義関数を指定
JOB実行時に、パラメータで実行するユーザー定義関数を指定してください。
指定するのは、以下の二つです。
1. ユーザー定義関数ファイルのパス(javascriptTextTransformGcsPath)
2. ユーザー定義関数名(javascriptTextTransformFunctionName)

```
gcloud dataflow jobs run testText2Datastore
--gcs-location gs://dataflow-templates-asia-northeast1/latest/GCS_Text_to_Datastore
--region asia-northeast1
--staging-location gs://test-20201003/temp/
--parameters 
textReadPattern=gs://test-20201003/out-00000-of-00001.json,
datastoreWriteProjectId=ace-charter-291406,
errorWritePath=gs://test-20201003/error/failure.txt,
javascriptTextTransformGcsPath=gs://test-20201003/my_function.js,
javascriptTextTransformFunctionName=transform
```
### コマンドの実行
あとは、今まで通り実行してください。

### 実行結果
指定したプロパティが、追加、変更、削除されています。

## 最後に
今回は、追加、変更、削除をしました。
プロパティの削除はなかなか無いとは思います。
プロパティの変更は、よくあると思います。
プロパティの追加は、例えば処理済みフラグや、実行時刻の追加等に使えるのでは
と思いました。
次回は、ユーザー定義関数を利用したフィルターについてお伝えしようと思います。
スケジューリング方式ーノンプリエンプティブ（non preemptive）、プリエンプティブ（ preemptive）

応用情報技術者平成28年春期 午前19

ノンプリエンプティブだけのスケジューリング方式はどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/68fa2c2b-9df2-3ca1-5785-eb7a7a9237cd.png)


１、ノンプリエンプティブとは、non preemptive
マルチタスクOS上で実行されているタスクの切替をプログラム自身に任せ、プログラムがCPUを自発的に開放したタイミングで他のタスクへの切り替えを行うマルチタスク制御方式のことをいいます。OSがCPUを管理しないので、1つのプログラムを実行中は、その他のプログラムの実行は制限されます。

プリエンプティブ　preemptive
ノンプリエンプティブとは逆に、OSがCPU割り当てを管理し、状況の変化に応じてタスクの切り替えを行う考え方は「プリエンプティブなタスクスケジューリング」といいます。


※preemptive　先買の，先取権のある.

２、
・残余処理時間順は、残りの処理時間が短いと推定されるタスクから優先的に処理していく方式です。実行中のタスクよりも残り処理時間が短いタスクが実行可能状態になった場合、OSによりタスクの切替えが行われます。

・到着順方式は、
実行中のタスクが終了するまでタスクの切替えが行われないという特徴があるため、ノンプリエンプション方式に分類されます。

・優先度順方式では、
実行中のタスクよりも優先度の高いタスクが実行可能状態になった場合、OSによりタスクの切替えが行われます。

・ラウンドロビン方式は、
実行可能状態となった順に従ってタスクに一定のCPU時間(タイムクウォンタム)を与えていくタスクスケジューリング方式です。一定時間内に処理が終わらなかったタスクは、OSにより実行可能状態の待ち行列の最後尾に移されます。

参照：
https://www.ap-siken.com/kakomon/28_haru/q19.html
【GitHub Tips】プルリクエストをcheckoutする

# はじめに
みなさん、GitHubでプルリクエストのコミット内容をcheckoutするとき、どのような方法でされていますか？
特にforkを多用する文化でブランチをcheckoutしようと思うと、ブランチはfork先のリポジトリにしか上がっていないため、remoteとしてfork先を登録してからcheckoutする必要があり面倒くさいですよね。
そこで、お使いの方も多いと思いますが、fork先を気にせずプルリクエストの内容をcheckoutする方法をまとめておきたいと思います。

# プルリクエストをcheckoutする方法
## 方法1
この場合、チェックアウトをした後に`detached HEAD`状態になります。
つまり、HEADがブランチ以外のコミットオブジェクト(ポインタ)を指している状態になります。
この方法ではブランチが新規に作成されないので、`git log`で差分を確認したりするだけの場合、非常に有用です。

```bash
git fetch origin pull/<IssueID>/head
git checkout FETCH_HEAD
```
## 方法1’
方法1の後にコミットをする必要がありブランチを切らなければならない場合、`git switch`を使用してブランチを作成できます。

```bash
git fetch origin pull/<IssueID>/head
git checkout FETCH_HEAD
git switch -c new_branch
```
## 方法2
最初からブランチを切ることを決めている場合、この方法が有用です。
fetchの際に、方法1の内容に続けて`:ブランチ名`と打つだけです。
こうすることによって、fetchのタイミングで(fetchしてきたコミットオブジェクトを参照する)ブランチが作成されます。

```bash
git fetch origin pull/<IssueID>/head:new_brach
git checkout new_branch
```

# おまけ
以上の内容をテストするためだけのリポジトリをGitHubに上げていますので、試しに使ってみてください。

```bash
git clone https://github.com/ttksm/qiita-checkout-git-pr.git
cd qiita-checkout-git-pr
git fetch origin pull/1/head
...
```

# さいごに
そういえばGitHubのデフォルトブランチの名前がmasterからmainに変更されましたね。
ブランチのプロテクションルールを追加する際に、ブランチ名指定をお間違えのないようご注意ください。
UbuntuにJuliaをいれてHello,world!するまで


UbuntuにJulia-1.5.2を入れたときのメモです。
すでに多くの方が書いているだろうけど、一応残しておきます。

### 実行環境

```terminal
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.5 LTS
Release:	18.04
Codename:	bionic
```

## Juliaをダウンロード＆インストールする

1.[Juliaのダウンロードページ( julialang.org/downloads )](https://julialang.org/downloads/)から`julia-1.5.2-linux-x86_64.tar.gz`をダウンロードします。ダウンロード先は`/ダウンロード/`とします。


![Screenshot_2020-10-04 Download Julia.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253018/083ce47e-3ea6-afcd-af49-7f065a7a6b2c.png)

別解：ターミナルから`wget`コマンドでダウンロードしてもよいです。

```terminal
$ cd ダウンロード
$ wget https://julialang-s3.julialang.org/bin/linux/x64/1.5/julia-1.5.2-linux-x86_64.tar.gz
```

2.`julia-1.5.2-linux-x86_64.tar.gz`を展開して、中にある`julia-1.5.2`というフォルダを`ダウンロード`におきます。

![Screenshot from 2020-10-04 17-17-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253018/db440cba-4418-0947-a252-262fe0924c0f.png)

3.`~/ダウンロード/`に存在する`julia-1.5.2`を`/opt/`に移動させます。

```terminal
sudo mv ~/ダウンロード/julia-1.5.2 /opt/
```


4.移動させた`julia-1.5.2`の中にある`julia`実行ファイルのシンボリックリンクを`/usr/local/bin/julia`に作成します。これでjuliaコマンドが使えるようになります。

```terminal
sudo ln -s /opt/julia-1.5.2/bin/julia /usr/local/bin/julia
```

もし`ln: シンボリックリンク '/usr/local/bin/julia' の作成に失敗しました: ファイルが存在します`と表示された場合は

```terminal
sudo unlink /usr/local/bin/julia
```
と入力して一度シンボリックリンクを消してから、もう一度実行します。

5.`julia`と入力します。Juliaの対話的実行環境が起動します。（この対話的実行環境は、入力されたコードを読み取って(Read)、評価して(Evaluate)、出力する（Print）ことを繰り返す（Loop）ので、頭文字を取ってREPLと呼ばれます。）

6.`println("Hello,world!")`と入力します。
![Screenshot from 2020-10-04 17-44-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253018/923384b2-43d5-8e4e-e68a-3de04aec3c4f.png)

7.REPLを抜けるときは`exit()`と入力します。

### 既存のAnaconda環境を利用してJupyter NotebookでHello, World!する

1. ターミナルで`conda env list`を入力し、Conda環境の場所を見ておきます。
2. `julia`を入力し、REPLに移ります。
1. `ENV["CONDA_JL_HOME"]= "（使いたいConda環境の場所）"`を入力します。
2. `]`を押してパッケージモードに切り替えます。青字になります。
3. `add Conda`を入力し、Conda.jlをインストールします。
4. `add IJulia`を入力し、IJulia.jlをインストールします。
5. バックスペースを押してパッケージモードから抜けます。
6. `using IJulia`を入力し、IJuliaを呼び出します。
7. `notebook()`と入力するとJupyter notebookが起動します。
8. ノートブックを作成したいディレクトリまで移動し、"New”からJulia 1.5.2を選択します。

![Screenshot from 2020-10-04 20-04-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253018/2fabab35-5f27-3358-0efd-a6b637b26115.png)

11.`println("Hello,world!")`を入力し、Ctrl+Enterで実行します。

![Screenshot from 2020-10-04 20-07-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253018/0929d0bb-bba7-a908-55fc-70564a49f979.png)

### 既存のJupyterやAnaconda環境がない場合
上記の「既存のAnaconda環境を利用する」の2から11までを行います（3は飛ばします）。

### 参考文献
* BotamochiRice, 今噂のJuliaをUbuntuにインストールしてJupyter Notebookで使おう！
https://qiita.com/BotamochiRice/items/4401bb6a8249916f1302

* 佐藤健太, ”第1章　Juliaをはじめよう”, WEB+DB PRESS Vol.111, 技術評論社, 2019.
* 村田賢太,　”第3章　Juliaによるデータ解析", WEB+DB PRESS Vol.111, 技術評論社, 2019.
VScodeでvue.jsのハイライトをしたい

#VScodeでVScodeでvue.jsのハイライトをしたい

初心者プログラマーによる備忘録的な感じなので読ませるための記事ではないです。
あとQiitaの記事投稿の練習として書いてます。

今回はVisualStudioCode(以下vsc)でvue.jsを書こうとしたら拡張機能を入れないとハイライト（色付け）されないことを知ったので導入しました。それを紹介します。
ですがまずは日本語化からやります。

##Japanese Language Pack for Visual Studio Code
これはvscの表示を日本語化してくれる拡張機能です。

[Japanese Language Pack for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja )

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763867/1cfeb063-14d8-ad93-8659-d2670deee03e.png)

##Vetur

これが今回の目玉であるVeturです。
これがないとシンタックスハイライトや、HTMLやJSなど文脈に合わせたコード補間などが効かないので黙って入れることになります。

なんかいろいろできるらしいですがまだ入れたばかりなのでこれから試していきたいと思います。今回は紹介までで。

[Vetur](https://marketplace.visualstudio.com/items?itemName=octref.vetur)

公式ドキュメント(英語のみ)

[Veturドキュメント](https://vuejs.github.io/vetur/)

##今回はここまで
短いですがここまでで、またいろいろ試してみたら書いていこうと思います。
Rustで設定ファイルの内容をグローバル変数に保存する

# Rustで設定ファイルの内容をグローバル変数に保存する

設定ファイル `.env` を読み込んでグローバルな変数に保持する。

.env

```text
ADDRESS=localhost
PORT=6379
```

# 環境

* Ubuntu 20.04
* Rust 1.46.0

# 使用するcrate

```toml
[dependencies]
#.envファイルの内容を環境変数として読み込む
dotenv = "0.15.0"
# .envの内容をConfigに保存するcrate
config = "0.10.1"
# 実行時にstatic変数を初期化するcrate
lazy_static = "1.4.0"
serde = {version = "1.0.116", features = ["derive"]}
```
# コード

```rust
extern crate lazy_static;

use config::ConfigError;
use dotenv::dotenv;
use lazy_static::lazy_static;
use serde::Deserialize;

/// .envの内容を保存するstruct
#[derive(Deserialize, Debug)]
pub struct Config {
    pub address: String,
    pub port: i32,
}

impl Config {
    /// 環境変数からデータを読み込む
    pub fn from_env() -> Result<Self, ConfigError> {
        let mut cfg = config::Config::new();
        cfg.merge(config::Environment::new())?;
        cfg.try_into()
    }
}

/// static変数の初期化
lazy_static! {
    static ref CONFIG: Config = {
        dotenv().ok();
        Config::from_env().unwrap()
    };
}

fn main() {
    println!("address: {}", CONFIG.address);
    println!("port: {}", CONFIG.port);
}
```
3層クライアントサーバシステム

応用情報技術者平成28年春期 午前12

クライアントサーバシステムの3層アーキテクチャを説明したものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/eebe0aac-7f78-63f1-c853-5df943817fc6.png)

１、クライアントサーバシステム(C/S)は、
サービスを要求する側であるクライアントと、
サービスを提供するサーバにアプリケーションの機能を分離した垂直分散システムの一形態です。

この設問で問われている3層クライアントサーバシステムは、
　・ユーザの入出力を担当するプレゼンテーション層，
　・業務処理に依存するデータ加工を行うファンクション層，
　・データベース処理を行うデータ層の

3層に機能を分離したシステムモデルであります。

参照：
https://www.ap-siken.com/kakomon/28_haru/q12.html
液晶ディスプレイ(LCD)の特徴

応用情報技術者平成28年春期 午前11

液晶ディスプレイ(LCD)の特徴として，適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/5431a944-2e65-2588-cb58-757fd7280b0d.png)


１、液晶ディスプレイ(LCD:Liquid Crystal Display)は、
外光や、フロントライト、バックライト等の光源により発せられた光を部分的に遮ったり透過させたりすることによって表示を行なうディスプレイです。

カラーフィルタは色素の吸収を利用して各サブ画素の通過光をR、G、Bの3つの基本色にして、加法混合方式で混色を作り出すことで中間色を含むカラー表示を実現します。

２、
・電圧を加えると発光する有機化合物を用いる。
　→×。有機ELディスプレイの説明です。

・電子銃から発射された電子ビームが蛍光体に当たって発光する。
　→×。CRT(ブラウン管)ディスプレイの説明です。

・光の透過を画素ごとに制御し，カラーフィルタを用いて色を表現する。
　→○。液晶ディスプレイの説明です。

・放電によって発生する紫外線と蛍光体を利用する。
　→×。PDP(プラズマディスプレイパネル)の説明です。

参照：
https://www.ap-siken.com/kakomon/28_haru/q11.html
USB3.0の特徴

応用情報技術者平成28年春期 午前10

USB3.0の特徴はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/409b5d5c-42eb-a210-5e36-33cf4e393c0d.png)

１、USB(Universal Serial Bus)は、
現在、最も普及している周辺機器接続のためのインターフェイスです。シリアルバス規格のひとつであり、主な特徴として、
　・ハブを使うことで最大127台まで接続可能、
　・ホットプラグ・プラグアンドプレイに対応、
　・バスパワー方式によってコードを介して電源供給が可能であること
などが挙げられます。

スーパースピードモードは、
　・USM3.0(2008年11月17日策定)で追加された転送スピードで、USB2.0のハイスピードモード(480Mbps)の10倍以上となる
　**5Gbps**での転送が可能になっています。
　また、USBでは接続する機器の動作によって以下の4つの転送モードを使い分けます。
    ・アイソクロナス転送
　　　連続的周期的なデータを転送を行う（音声や映像などのデータ転送に適している）

    ・バルク転送
　　　まとまったデータを非周期的に転送する(補助記憶装置やスキャナなどに用いられている)

    ・インタラプト転送
　　　一定間隔でデータを転送する（マウスやキーボードに用いられている）

    ・コントロール転送
　　　デバイスの設定・制御に使われる

ちなみに3.0の次世代規格となるUSB3.1が2013年8月に策定されています。最大転送速度は、さらに増して10Gbpsとなっています。


２、
・PCなどの小型コンピュータと，磁気ディスク，レーザプリンタなどの周辺機器とを接続するパラレルインタフェースである。
　→×。USBはシリアルインターフェースです。

・音声，映像など，リアルタイム性が必要なデータの転送に適した高速な転送方式を採用したシリアルインタフェースであり，FireWireとも呼ばれている。
　→×。IEEE 1394の特徴です。

・モデム接続の規格であったが，PCと周辺機器とを接続するようになったシリアルインタフェースである。
　→×。RS-232Cの特徴です。

・四つの転送スピードをもつシリアルインタフェースであり，スーパースピードモードは，PCと外付け磁気ディスクとの接続などに使用される。
　→○。


参照：
https://www.ap-siken.com/kakomon/28_haru/q10.html
Rails CSV基本

## csv出力

- view

```html
<%= link_to "CSV", products_path(format: :csv) %>
```

- controller

```ruby
  def index
    respond_to do |format|
      format.html do
        @search = Product.ransack(params[:q])
        @products = @search.result    
      end

      format.csv do
        @products = Product.all
        data= CSV.generate do |csv|
          column_names = %w[id title product_price_id]
          csv << column_names
          @products.each do |product|
            row = [product.id, product.title, product.product_price_id]
            csv << row
          end
        end

        send_data(data, filename: 'produsts.csv')
      end
    end
  end
```

## csv アップロード

- gem

```ruby
gem 'roo'
```

- routes 

```ruby
  resources :products do 
    collection do 
      post :import
    end
  end
```

- controller


```ruby
  def import
    Product.import(params[:csv_file])
    redirect_to root_path
  end
```

- model

```ruby
class Product < ApplicationRecord
  belongs_to :product_price


  def self.import(file)
    CSV.foreach(file.path, headers: true) do |row|
      product = Product.new
      product.attributes = row.to_hash.slice(*updatable_attributes)
      product.save
    end
  end

  def self.updatable_attributes
    ["title","product_price_id"]
  end
```

- spec

```ruby
require 'rails_helper'

RSpec.describe ProductsController, type: :controller do

  describe '#index' do
    before do
      price = ProductPrice.create(price: 2000)
      Product.create(title: "Product1", product_price_id: price.id)
    end

    it 'csv出力する' do
     get :index, format: :csv
     expect(response.body).to include "Product1"
    end

    context 'アップロード' do
      before do
        ProductPrice.create(id:1, price: 2000)
        ProductPrice.create(id:2, price: 2000)
      end
      let(:csv_file) {'test.csv'}

      subject do
        post :import, params: {
          csv_file: fixture_file_upload(csv_file, 'text/csv')
        }  
      end

      it 'aa' do
        expect{subject}.to change(Product,:count).by(2)
      end
    end
  end
end
```
Rails Logger基本

## 実装方法

出力させる方法

```ruby
## 出力させる方法
Logger.new("出力先", '出力内容')

ex） Logger.new('/log/development', "出力内容")

## こんな書き方もある様子

logger = Logger.new('/log/development')
logger.debug '出力させたい内容'
```

出力させるメソッドによってログに出された時の、
ラベル？が異なる。

このラベルを変化させる事によって、検知ツールの設定を変更する気がする（インフラ環境はよくわからない）

```ruby
## logger.debug '出力させたい内容'の場合

D, [2020-10-04T08:41:46.184230 #6] DEBUG -- : 出力されるかな

##logger.info '出力させたい内容'

I, [2020-10-04T08:43:51.453817 #6]  INFO -- : 出力されるかな
```


## 出力先

logディレクトリ配下

Loggerの第一引数の場所が、存在しない場合は新規で作成される

```
Logger.new('/log/hello.log', "hello")
```
Ubuntuでhttps接続時に「dh key too small」と出る

#概要
dockerにインストールしたUbuntuでhttps接続しようとしたら、「dh key too small」エラーが出て、接続できない。

#原因
サーバーのセキュリティバージョンが古いため、サーバー側でセキュリティレベルを上げるか、クライアント側で下げる。

#解決法
クライアント側しか触れないため、以下を修正（セキュリティレベルを下げる）。

```/usr/lib/ssl/openssl.cnf
# 1行目に追加
openssl_conf = default_conf

...
...
...

# 最終行に追加
[ default_conf ]
ssl_conf = ssl_sect

[ssl_sect]
system_default = system_default_sect

[system_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT:@SECLEVEL=1
```

特に再読み込みなしで利用可。
postgresqlの起動方法

# 結論
基礎的なことだけど二回もここで詰まったのでメモ
`service postgresql start`

# 経緯
```shell

$ createdb mydb
```

```shell

createdb: could not connect to database template1: could not connect to server:
No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
```
[公式](https://www.postgresql.jp/document/8.0/html/tutorial-createdb.html)には
>こちらも、インストール手順を点検するか管理者に相談してください。

と書いてありインストールに問題があるかと思ったが起動されていないだけだった。。。
インストールからDB作成までのチュートリアルや解説記事ではstartをしていないので環境によっては自動でstartするのかな??

間違い等ありましたら指摘お願いします。
スタックポインタ

応用情報技術者平成28年春期 午前8

CPUのスタックポインタが示すものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/6ee9959e-f31a-69f7-1b7c-bc2541e858a3.png)

１、スタックポインタは、
スタックの最上段のアドレスを保持するレジスタで、スタック内で最後に参照されたアドレスを保持しています。
メインルーチンからサブルーチンを呼び出すとき、次のようにサブルーチン終了後の復帰先などをスタックに格納してからサブルーチンを実行しています。

２、
・次に読み出す機械語命令が格納されているアドレス
　→×。プログラムカウンタの説明です。

・メモリから読み出された機械語命令
　→×。命令レジスタの説明です。

・割込みの許可状態，及び条件分岐の判断に必要な演算結果の状態
　→×。ステータスレジスタの説明です。

参照：
https://www.ap-siken.com/kakomon/28_haru/q8.html

CPUのプログラムレジスタープログラムカウンタの役割
https://qiita.com/lymansouka2017/items/e2a70b5728ba9c1dc7ca
Nuxt.JSにGtagを設置する方法（@nuxtjs/google-gtagは使わない）

## 「@nuxtjs/google-gtag」の出力するコードが微妙…

Nuxt.JSを利用してネットショップを構築した際に、Googleアナリティクスの設置に「@nuxtjs/google-gtag」を使ってみたところ、以下の点が気になりました。

- 複数のIDを埋め込むと、Gtagのスクリプトのリンクが複数埋め込まれてしまう（ひとつでOKのはず）

↓このタグがトラッキングID数だけ追加されてしまう。

``` javascript
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-xxxxxx-x"></script>
```

「@nuxtjs/google-gtag」は現在のバージョン(1.0.4）が公開されてから、すでに2年以上メンテナンスされていませんので、このモジュールの使用は中止して、自前でコードを書くことにしました。

## Gtag用のPluginを作る

以下のコードを、nuxtのpluginsディレクトリに「gtag.js」という名称で保存します。

``` javascript:gtag.js
export default ({ app }, inject) => {
  window.dataLayer = window.dataLayer || []
  function gtag() {
    // eslint-disable-next-line no-undef
    dataLayer.push(arguments)
  }
  gtag('js', new Date())

  // 今回は二つのトラッキングIDを設定します。環境変数などを利用するなり適宜設定してください。
  gtag('config', process.env.GA_TRACKING_ID)
  gtag('config', process.env.AW_TRACKING_ID)

  // routeが切り替わるたびにgtagを呼び出す
  app.router.afterEach((to) => {
    // ページの構築が終わるまで少し待つ
    setTimeout(() => {
      gtag('event', 'page_view', {
        location_path: `${window.location.origin}${to.fullPath}`,
        page_path: to.fullPath,
        page_title: document.title,
      })
    }, 100)
  })

  // gtagをinjectして、他のコンポーネントから this.$gtag で呼び出せるようにする。
  inject('gtag', gtag)
}
```

そして、nuxt.config.jsで、このプラグインを読み込むよう設定します。

``` javascript:nuxt.config.js
export default {

  plugins: [
    { src: '~/plugins/gtag.js', mode: 'client' },
  ],

}
```

今回はSSRするので、 { mode: client }を加えています。

## 毎回タイトルも一緒に送信する必要あり

app.router.afterEach イベントを使って、ルートが変化するたびにgtag関数をコールするのですが、Analyticsの管理画面をながめていると、タイトルとURLが一致していないことに気づきました。

どうもタイトルが書き換わる前に、Google Analyticsに渡ってしまうことがあるようです。
nuxtTickを使ってみましたが、残念ながらうまくいきませんでした。
そこでsetTimeoutでテストしてみたところ、きちんとしたタイトルが渡るようになりました。

今のところ、100ミリ秒程度遅延させるだけで、うまく動いているように見えます。
環境によっては、もう少し遅らせる必要があるかも知れませんので、しばらく様子をみたいと思います。