OmniAICreator/Qiita-1.07M huggingface dataset:
Vimで画像をツイートする

ども、連休が終わったのを未だに信じられないゴリラです

先日 [code2img.vim](https://github.com/skanehira/code2img.vim) というプラグインをつくったんですが、
基本ソースコードを画像にして共有するのはTwitterなので、それらをまとめてVimで出来たら良いなと思って、簡単なスクリプトを書きました。

![tweet_with_image.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/99185e3a-90d5-9f73-ea7d-c8d52a266c63.gif)

コードの本体は[ここ](https://gist.github.com/skanehira/7dd6ed0dc8da8c6e87a11ab70ea83b53)に置いてあります。

## 必要なもの
- [code2img](https://github.com/skanehira/code2img)
- [twty](https://github.com/mattn/twty)

## 使い方
コードをvimrcに記述すれば`TweetWithImg`コマンドが使えるようになります。

- 選択した範囲のテキストが画像として出力される
- コマンドの引数はツイート本文として送信される

ので、`TweetWithImg 私はゴリラです`というふう実行すれば`私はゴリラです`と画像つきのツイートがつぶやけます。

仕組みはシンプルで、`code2img`でソースコードを画像ファイルに出力して、`twty`で画像ファイルと本文をツイートするだけです。
`job_start`なので非同期で動くのでVimが固まることがないです(これ重要)

## さいごに
やはりコードを画像化してさくっとTwtterで共有できるのは良い体験
【初心者でもわかる】CSSで背景画像やグラデーションを2重や3重につける方法

# どうも7noteです。背景画像やグラデーションを指定するときに使う`background`プロパティは、
複数指定することができます。

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/overlap-background/
HTMLを始めるには

#この記事の対象者
・webプログラムを始めて見たい人
・デフォルトのテキストエディタでコードを書いている人
#web開発には何が必要？
ウェブ開発には主に二つのアプリケーションが必要で、**ブラウザ**と**テイストエディター**です。
※あくまで僕の場合ですが
ウェブサイト制作は始めにイメージを固める為にデザインの大枠を紙に書いてから、**html**や**css**ファイルを作りコードを書いて、必要に応じてJavaScriptやphpを追加して行く感じです。
パソコンに入っているmacならテキストエディターwindowsならメモ帳を使う事でプログラムを書く事が出来ますが、それらのアプリはプログラムに**特化していない**為自動補完機能などが搭載されていません。そこでwebプログラミングに特化したテキストエディターを使う事でより快適に開発をする事が出来ます。（ブラウザは多くの人が使っている[GoogleChrome](https://www.google.com/chrome/)がおすすめです。）
#おすすめのテキストエディターは？
プログラムに特化したテキストエディターならVisual Studio Codeやサブライムテキストなどもあります。その中でもbracketsは**シンプル**で尚且つ**拡張性**が高いのでおすすめです([Atom](https://atom.io/)もおすすめです)。今回はbracketsのセットアップについて解説します。
#Bracketsをインストール
まずは[公式サイト](http://brackets.io/)からインストーラをダウンロードします。ダウンロード出来たらインストーラを開いて待つだけです。![スクリーンショット 2020-08-17 22.18.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/a53d4522-6ce9-7777-6cc4-5bbe36afb4c8.png)
処理が終わると上の写真の様になるのでbracketsをフォルダーに追加してから起動してくだいさい。![スクリーンショット 2020-08-17 22.25.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/72289c07-d98f-1861-6f9c-8683262a3ee4.png)
上の様なウィンドウが表示されたら成功です。
#Bracketsをカスタマイズ
次はいよいよ拡張機能を追加して行きます。この記事で追加するのは**Emmet**と**Beautify**で、コードの補完の補完機能とコードのインデントを自動で綺麗にしてくれる機能です。追加方法は簡単で、右上から２番目にあるブロックマークを押して**emmet**と検索してください。![スクリーンショット 2020-08-17 22.37.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/ea2dc48b-474b-2296-909d-0c6c5629767d.png)そうすると上画像の様になると思うので黄色い枠で囲った方をインストールして下さい。次は**beautify**と検索して下さい。![スクリーンショット 2020-08-17 22.43.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581846/54ee4d4e-4634-d470-d493-7b028c3081b7.png)
こちらも、先ほどと同じ様に黄色の枠で囲った物をインストールしてくだいさい。もしインストールが成功している場合は右上から３番目にステッキの様なアイコンが見えます。もしアイコンがなかったらアプリを再起動するなり再度インストールをし直したりして見て下さい。
#Bracketsを使って見る
拡張機能もインストールした所で実際に少しだけコードを書いて見ましょう。
始めにfinderで書類のフォルダーの中に新規のフォルダーを作り、MyWEBとでも名前を付けましょう。次にbracketsでcommand+Nで新規ファイルを作りcommand+Sでindex.htmlと名前を変えて先ほど作ったフォルダーに入れて保存すれば準備はバンタンです。それでは始めに!を入力した後にtobキーを押して見て下さい。

```html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
```
上のようなコードが出現するはずです。これが補完機能と言うヤツです。この機能はtobを押す事で実現出来ます。もう少し使って見ましょう。headのでカーソルをクリックして**link**と入力してtobキーを押して見ましょう。

```html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="">
    <title>Document</title>
</head>
<body>

</body>
</html>
```
このlinkはhtmlとcssの関連付けに使う物でhrefの中にcssファイルの名前を入れる事によって関連付けをしてしています。次に実際ブラウザでhtmlファイルを開いて見ましょう右上の稲妻ののようなアイコンをクリックするとページが開けるのが分かると思います。今回は使いませんでしたが、自分でコードをが見づらくなってしまう事があります。なのでその時は綺麗にしたいファイルを選択してからステッキのアイコンをクリックして見てくだいさい。劇的に見やすくなるはずです。
#最後に
最後まで記事を読んでくれてありがとうございました。久しぶりに記事を書いたので、間違っている所があるかもしてませんがその時はコメントで教えてくれると嬉しいです。
ファイルの書き込み読み込み

ファイルの読み込みと書き込みを同時に行いたい場合
##w+を使う場合
"w+"は読み込みと書き込みが可能
sの内容をファイルに書き込み
seekで先頭に戻り、読み込んでいる
ここでseekを用いないとエラーが発生する

```python:qiita.py
s="""\
AAA
BBB
CCC
DDD
"""

with open("test.text", "w+") as f:
    f.write(s)
    f.seek(0)
    print(f.read())
```

実行結果

```
AAA
BBB
CCC
DDD

```

###注意点
"w+"で書き込み、読み込みはできるが
実行した時点でファイルの中身が消えてしまう
次のように読み込みのみしようとすると

```python:qiita.py
s="""\
AAA
BBB
CCC
DDD
"""

with open("test.text", "w+") as f:
    # f.write(s)
    # f.seek(0)
    print(f.read())
```

実行結果

```

```

##r+を使う場合
wのときとは違い読み込むファイルがないとエラーになるので注意

```python:qiita.py
s="""\
AAA
BBB
CCC
DDD
"""

with open("test.text", "r+") as f:
    print(f.read())
    f.seek(0)
    f.write(s)
```
2020年Arduino・Raspberry Pi/Python・マイコンのC言語を学ぶなら~お勧めの本～

私が独断でお勧めの本を紹介します。
##Pythonでハードウェア（Raspberry Pi）を触る
####ラズパイ4対応 カラー図解 最新 Raspberry Piで学ぶ電子工作 作る、動かす、しくみがわかる! 
https://www.amazon.co.jp/dp/4065193397
Pythonでハードウェア（RaspberryPi）を触るならこの一冊です。
難点は、本のサイズが小さい事
読みながらコードを打つのには向いていません・・・

##ESP32とArduinoを学ぶなら
###ESP32＆Arduino 電子工作 プログラミング入門
https://www.amazon.co.jp/dp/4297112051/
ここ数年の中で一番のArduino本でありながら、ESP32の詳細本でもあります。
Arduino本は、あれどESP32をキチンと取り扱っている本が少ないですが
本書は、ESP32とネイティブなArduinoを比較しながら解説しています。
初心者でプログラムを触りたい人にも満足できると思います。
もっと、深く書いても良いと思いますが、贅沢な悩みな気がします。

##C言語でマイコンを深く触ろう
###基板付きキット 絵解き マイコンCプログラミング教科書
https://www.amazon.co.jp/dp/4789845273/
マイコンボードをとりあえず触りたい、C言語って難しそう
と言う方や初心者の方には、上のESP32＆Arduino 電子工作 プログラミング入門をお勧めします。
Arduinoを触ったことがあるがもっとマイコンを触りたい、C言語を学びたいと言う人には、本書をお勧めします。
基板もついており、本書だけでC言語を学ぶ事が可能です。
私が経営者ならば、本書を使って新人教育をします。

2020年にはベストなArm本、ROSの本がまだ出ていないのが残念です。
GCP Professional Data Engineer勉強記

こんにちは、えいりんぐーです

2年に1度のイベントがやってきましたね、そうGCP資格の更新です。
私はこれまで

- 2020年10月
- 2022年10月

とProfessional Data Engineer試験に合格しました。
それから2年たち、アップデートされているので、勉強しつつ記録を残したいと思います。

とりあえず今回は、試験のおさらいと、勉強方法、サービスの種類などをまとめます。

# Professional Data Engineer とは

[公式のページ](https://cloud.google.com/certification/data-engineer?hl=ja)に書いてある通り、GCPを使って、セキュリティやコストを考慮しつつ、データ基盤の構築やデータ処理と分析の業務を行える能力を表す資格です。

# 勉強するべきことと方法

基本的な内容と方法は以下の通りです。

思い切って、模擬試験を最初に受けるのがいいと思います。
無料だし。
レベル感分かるし。

- 内容
    - GCPのサービス
    - セキュリティ
    - コスト
- 方法
    - ドキュメント
    - [Cloud Skills Boost](https://www.cloudskillsboost.google/catalog)
    - [Codelabs](https://codelabs.developers.google.com/)
    - [模擬試験](https://cloud.google.com/certification/practice-exam/data-engineer?hl=ja)
    - [Coursera](https://ja.coursera.org/professional-certificates/gcp-data-engineering)

Skills BoostやCodelabsは手を動かせるのはうれしいけど、時間的コスパがちょっとって感じです。

手前味噌ですが、以前に受験した時の[ブログ](https://blog.brainpad.co.jp/entry/2018/11/28/112907)もありますので、参考までにどうぞ。(^^;

# GCPのサービス TBU

データ周りはITの基盤でもありますので、数多くのサービスがありますね。

- BigQuery: いわずと知れたDWH
- Bigtable: 代表的なKVS
- GCS: オブジェクトストレージ
- Cloud SQL: RDB
- Spanner: 水平分散可能なRDB、やべーやつ 
- Firestore: 旧Datastore
- Dataproc: Hadoop/Spark環境
- Dataprep: データ処理や可視化のツール
- Cloud Run: AWSでいうFargate、コンテナー動かすやつ
- Memorystore: Redisを使ったメモリストレージ
- Data Migration Service: SQLへの移行サービス
- BigQuery Data Transfer Service: 名前の通り
- Transfer Appliance: データ転送サービスその3
- Storage Transfer Service: データ転送サービスその4
- Logging: AWSでいうCloudWatch、ロギングサービス
- Cloud Scheduler: cron
- Composer : Airflow
- Pub/Sub: Kafka
- Dataflow: Apache Beam
- Data Fusion: ETL / ELT パイプラインツール
- CDN: 小さめだが頻繁にアクセスするデータをエッジにキャッシュしておくサービス
- Vertex AI: ML開発プラットフォーム
- Looker: BIツールでイイ感じの可視化ができる、買収で話題になった

セキュリティ系や管理系、コンピューティングやコンテナー系を入れていなくてこの量です。やべー。

# 先人のブログ TBU

巨人の肩に乗るのが手っ取り早いところでもあります。

中には2週間で資格とった方もいますね。あまりそういう詰込み得意でないので、うらやましいです...

- [GCP Professional Data Engineerに2週間で合格したので勉強方法を共有](https://qiita.com/endw0901/items/5ebc530de3e9ffee4416)
- [Google Cloud Certified Professional Data Engineer の勉強法](https://techblog.nhn-techorus.com/archives/17559)
- [アクセンチュア](https://www.accenture.com/jp-ja/blogs/cloud-diaries/google-cloud-exam)
- [[Google 認定資格] GCP Professional Data Engineer の勉強方法と対策](https://trainz.jp/media/learningtoai/1545/)
- [Google Cloud Professional Data Engineer 合格体験記 ](https://note.com/momota10/n/n48ffead37408)
- [Google Cloud Professional Data Engineer認定資格取得のための対策を紹介！](https://blog.brainpad.co.jp/entry/2022/07/22/151334)
kotlinとjavaでリストを作りたい！

# はじめに…

この記事は[2個前の記事](https://qiita.com/sato-na/items/cc23f9b1db9c948dc00e)で書いた、

**7日間毎日記事投稿の3日目**

になってます

使うコードは下に貼りますが、このアプリの詳しい機能はその2個前の記事をご覧ください！

- java版 : https://github.com/sato-na/guruwake_java

- kotlin版 : https://github.com/sato-na/guruwake_kotlin

↓ここからが今回の記事の本題です↓

# それぞれの言語でリストを扱うには…

-- 目次 --

1. Arraylistの作り方

2. 要素を追加・削除する方法

3. 要素数を取得する方法

4. リストの中身を逆順・シャッフルする方法

5. 中身を違うリストにコピーする方法

## ArrayListの作り方

- javaの場合

```java
ArrayList<要素の型>変数名 = new ArrayList<>();
```

例)

```java:WhoActivity.java
ArrayList<String>memberL = new ArrayList<>();  // 20行目
```

変数定義と大きく異なっている

- kotlinの場合

```kotlin
val/var 変数名:ArrayList<要素の型> = arrayListOf()
```

例)

```kotlin:WhoActivity.kt
var memberL:ArrayList<String> = arrayListOf()  // 13行目
```

リストの中身の指定方法以外は変数定義とよく似ている

要素の型を指定する方法は両者ともよく似ている

## 要素を追加・削除する方法

- javaの場合

```java
// 追加
リスト名.add(要素);
// 削除
リスト名.remove(要素の場所);
```

例)

```java:WhoActivity.java
//追加
memberL.add(memberET.getText().toString());  // 82行目
```

```java:ResultActivity.java
// 削除
memberL.remove(0);  // 46行目
```

- kotlinの場合

```kotlin
// 追加
リスト名.add(要素)
// 削除
リスト名.remove(要素)
```

例)

```kotlin:WhoActivity.kt
// 追加
memberL.add(member_et.text.toString())  // 54行目
```

```kotlin:ResultActivity.kt
// 削除
memberL.remove(memberL[0])  // 37行目
```

追加の仕方は同じだが、削除するときは対象の要素を指定するために使用する物が違う

## 要素数を取得する方法

- javaの場合

```java
リスト名.size();
```

例)

```java:resultActivity.java
int memberNum = memberL.size();  // 33行目
```

- kotlinの場合

```kotlin
リスト名.size
```

例)

```kotlin:ResultActivity.kt
val memberNum = memberL.size  // 24行目
```

javaは.size()、kotlinは.sizeとよく似ている

## リストの中身を逆順・シャッフルする方法

- javaの場合

```java
// 逆順
Collections.reverse(リスト名);
// シャッフル
Collections.shuffle(リスト名);
```

例)

```java:WhoActivity.java
// 逆順
ArrayList<String> memberLR = (ArrayList<String>) memberL.clone();  //84行目
Collections.reverse(memberLR);
```

※ 1行目の処理内容は「中身を違うリストにコピーする方法」参照

```java:resultActivity.java
// シャッフル
Collections.shuffle(memberL);  // 34行目
```

- kotlinの場合

```kotlin
// 逆順
リスト名.reverse()
// シャッフル
リスト名.shuffle(Random())
```

例)

```kotlin:WhoActivity.kt
// 逆順
var memverLR = ArrayList<String>(memberL)  // 56行目
memverLR.reverse()
```

※ 1行目の処理内容は「中身を違うリストにコピーする方法」参照

```kotlin:ResultActivity.kt
// シャッフル
memberL.shuffle(Random())  // 25行目
```

書き方は大きく違うがどちらも
逆順の場合は「reverse」、シャッフルの場合は「shuffle」というのがキーワードとなっている

## 中身を違うリストにコピーする方法

- javaの場合

```java
ArrayList<要素の型> 変数名 = (ArrayList<要素の型>) コピーするリスト名.clone();
```

例)

```java:WhoActivity.java
ArrayList<String> memberLR = (ArrayList<String>) memberL.clone();  // 84行目
```

- kotlinの場合

```kotlin
val/var 変数名 = ArrayList<要素の型>(コピーするリスト名)
```

例)

```kotlin:WhoActivity.kt
var memverLR = ArrayList<String>(memberL)  // 56行目
```

javaは.clone()を使用し、kotlinはリスト定義の方法と少し書き方が変わる

# 最後に…

今回はjavaとkotlinでリストの定義をしました。
まだまだたくさんの機能があると思うので、またほかのコードで出てきた際に記事にできたらなと思います。

また、1日目に記載した予定から今日以降の予定を少し変更しました。
その記事の予定も変更しておくので、あまり関係ないですが
一応自分のメモ用としてもここに記載しておきます。

明日も記事を投稿するので、引き続き温かく見守ってください。
Docker for Windows で webpack dev server のオートリロード（ファイル監視）が動作しない場合の解決策

## 結論

うまく動かなかったら `watchOptions.poll` を試してね、とのこと。

> If watching does not work for you, try out this option. Watching does not work with NFS and machines in VirtualBox.

[webpack 公式ドキュメント](https://webpack.js.org/configuration/watch/) より。

## 設定例

`http://localhost:8080` で動作する最小限の記述になります。

本件以外では `webpack.config.js` の `host` 、`docker-compose.yml` の `working_dir` と `ports` あたりがハマりポイントになるかと思います。

```webpack.config.js
const path = require('path');

module.exports = {
    mode: 'development',
    entry: path.join(__dirname, 'src', 'index.js'),
    output: {
        path: path.join(__dirname, 'dist'),
        filename: 'bundle.js',
    },
    devServer: {
        contentBase: path.join(__dirname, 'dist'),
        host: '0.0.0.0',
        port: 8080, // default
    },
    watchOptions: {
        poll: 1000
    }
};
```

```docker-compose.yml
version: '3'
services:
  app:
    image: node:12
    working_dir: /app
    volumes:
      - .:/app
    ports:
      - 8080:8080 # port は devServer と揃える必要がある
    command: npm start
```

```package.json
{
  "name": "app",
  "version": "1.0.0",
  "private": true,
  "scripts": {
    "build": "webpack",
    "start": "webpack-dev-server"
  },
  "devDependencies": {
    "webpack": "^4.44.1",
    "webpack-cli": "^3.3.12",
    "webpack-dev-server": "^3.11.0"
  }
}
```

以上です。
【PHP】Herokuへデプロイしたアプリの投稿機能で500エラー

アカウント登録からデプロイまでとても簡単なHerokuでしたが、
作成したアプリケーションの記事投稿機能でPOSTする時に500エラーを出してしまったので、
対処する時に行った事を備忘録として残しておく。

## 環境
PHP 7.3.8
Laravel 6.18.35
DBはPostgreSQL
Heroku CLI導入済み

## ①ログを確認する
`heroku logs`コマンドでログを確認してみる
or
Herokuダッシュボードの`More`→`View logs`からでもログが確認可能です。
![スクリーンショット 2020-08-17 22.32.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531606/cf41e086-e3ee-6bcf-db19-e3f040bcadc4.png)
ただこの時点では`status=500`が発生した事以上の情報が得られないので、
詳細な情報を出力する為にHerokuの環境変数に`LOG_CHANNEL=errorlog`を設定します。

ここでエラーが発見出来れば良いのですが、今回はエラーが検知出来なかったので、
次の手を考えます。

## ②デバッグモードにしてみる

デバッグモードを`true`にしてプッシュ

```app.php
    /*
    |--------------------------------------------------------------------------
    | Application Debug Mode
    |--------------------------------------------------------------------------
    |
    | When your application is in debug mode, detailed error messages with
    | stack traces will be shown on every error that occurs within your
    | application. If disabled, a simple generic error page is shown.
    |
    */

    'debug' => env('APP_DEBUG', true),
```

↓それっぽいのが出てきましたね
![スクリーンショット 2020-08-17 22.49.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531606/cf228f59-3031-d8dd-bdea-4b9ac36315b3.png)

## ③調査結果から
結論、`GD`または`ImageMagick`の導入が必要ということが分かった。


```composer.json
    "require": {
        省略
        "ext-gd": "*"
    },
```
無事にHeroku環境で投稿機能が動作するようになりましたとさ。
【VB.NET】Nullable型をワンライナーのIfで書いた時の挙動

# 左辺にNullable型、右辺にワンライナーのIfでNothingを返す
こんなソース
例なのでtextはNothingのまま、Nothingじゃなかった時の戻り値は適当に100としています。

```vb:NullableIfSample.vb
' 分かりやすさのために明示的に初期化します。
Dim text As String = Nothing
Dim value As Integer? = If(text Is Nothing, Nothing, 100)
```

戻り値としてはNothingまたは他の値(上の例の場合は100)にしたいってことですね。
まあ滅多にありませんがたまーにこういうことがしたいケースがあります。

おとなしくIf-Elseで書けばいいんですが、無駄に行数食って見栄えが良くないのでついついワンライナーで書きたくなります。

## どうなるか
Nothingじゃない時はいいとして、**Nothingの場合は0**が返ります。
なぜなのか、C#で同じコードを書くと分かります。

```c#:NullableIfSample.cs
string text = null;
int? value = text == null ? default(int) : 100;
// こうは書けません。
// int? value = text == null ? null : 100;
```

NothingはC#でいうところのdefault<T>の機能を持つので、Integerの初期値である0になっちゃうということです。
C#の場合はVB.NETのようにnullの時にnullを返す、と書けないので発生しない問題ですが、覚えておくと良いかもしれません。

## どう書けば良いのか
ワンライナーで書くことを諦めるしかありません。

```vb:NullableIfSample.vb
Dim value As Integer?

If text Is Nothing Then
    value = Nothing
Else
    value = 100
End If
```

うーん、行数増えて見栄えが良くない。。。

ちなみにワンライナーで書いているコードは型推論せず明示的に型指定をしていますが、型推論させようとすると通常のint型になるので注意が必要です。

## あとがき
前々からなんか書こうと思ってたのと、別件でQiita使ってレポート提出することがあるのでちょっとした小ネタを書いて慣れていければと思います…
(そんな大仰な技術力はないので…)
AtCorderテクニック備忘録

#概要
競プロ初心者の備忘録です。
何か間違いなどありましたらご教授願います。
随時更新していきます。
#文字列
###文字列から数値に変換（１文字ver）<2020/08/17>
**char型**から**int型**への変換

```C++:char_int
#include <iostream>
using namespace std;

int main(void){
    char a;
    int num = a - '0';
    //aはstring型だとエラーになるので注意、必ずchar型であることを確認すること
    return 0;
}
```

#整数
###切り上げ<2020/08/19>
```C++:
#include<bits/stdc++.h>
using namespace std;

int main(){
  int a, b; cin >> a >> b;
  int x = ((a + b) + 2 - 1) / 2;  //切り上げ処理
  //公式：((割られる数)　＋　(割る数) ー　１)　/　(割る数)  
  cout << x << endl;
}  
```
ファイルの読み込み、seekを使った移動

##ファイルをまとめて読み込み


```python:qiita.py
with open("test.text", "r") as f:
    print(f.read())
```

##一行ずつ読み込む
1行ずつ読み込みたい時はreadlineを使う
print関数でend=""とする理由としてはprint関数で改行が行われてしまうから

```python:qiita.py
with open("test.text", "r") as f:
    while True:
        line = f.readline()
        print(line,end="")
        if not line:
            break
```

実行結果

```
AAA
BBB
CCC
DDD
```

end=""を使わないと

```python:qiita.py
with open("test.text", "r") as f:
    while True:
        line = f.readline()
        print(line)
        if not line:
            break
```

実行結果

```
AAA

BBB

CCC

DDD
```

##特定の文字数ごと読み込む
chunkを設定する
ネットワークの読み込みに使われる事も

```python:qiita.py
with open("test.text", "r") as f:
    while True:
        chunk = 2
        line = f.read(chunk)
        print(line)
        if not line:
            break
```

実行結果

```
AA
A

BB
B

CC
C

DD
D
```

##seekを使った移動
teil　現在の位置を返す
seek　任意の位置に移動することができる

```python:qiita.py
with open("test.text", "r") as f:
    print(f.tell())
    #0
    print(f.read(1))
    #A
    f.seek(5)
    print(f.read(1))
    #B
    f.seek(14)
    print(f.read(1))
    #D
```
Pythonで画像のコントラストを調整する方法

　学習メモです。

#やったこと
　画像のコントラストを調整するPythonスクリプトを書きました。

#コード

```python
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('画像.jpg')

#コントラスト
contrast = 128

#コントラスト調整ファクター
factor = (259 *(contrast + 255)) / (255 *(259 - contrast))

#float型に変換
newImage = np.array(img, dtype = 'float64')

#コントラスト調整。（0以下 or 255以上）はクリッピング
newImage = np.clip((newImage[:,:,:] - 128) * factor + 128, 0, 255)

#int型に戻す
newImage = np.array(newImage, dtype = 'uint8')

#出力
cv2.imwrite('out.png', newImage)
```

#結果
　レナさんの画像で試してみます。

![lena.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537831/44e1193a-6310-2173-6c20-2b6406365003.png)
オリジナル画像

![out.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537831/ae7fac19-ea45-aa8f-aa18-017c026b2418.png)
コントラスト+128で調整後

　

#参考URL
[IMAGE PROCESSING ALGORITHMS PART 5: CONTRAST ADJUSTMENT](https://www.dfstudios.co.uk/articles/programming/image-programming-algorithms/image-processing-algorithms-part-5-contrast-adjustment/)
[Algorithms for Adjusting Brightness and Contrast of an Image](https://ie.nitk.ac.in/blog/2020/01/19/algorithms-for-adjusting-brightness-and-contrast-of-an-image/#:~:text=To%20increase%20the%20brightness%20we,every%20pixel%20of%20the%20image.&text=Truncate%20is%20used%20to%20keep,range%20i.e.%200%20to%20%2B255.)
ITILファンデーション(ITIL4エディション)の資格の勉強を始めた3

# ITILの7つの従うべき原則
### 価値に着目する
- 組織が実施するすべての活動が組織とその顧客およびその他の利害関係者にとっての価値に、直接的または間接的にリンクしている必要がある。

### 現状からはじめる
- うまく機能していない古い手法やサービスを廃止して、もっと良いものを構築しようとする過程で過去の遺物を全て取り除き、まったく新しいものを構築したいという誘惑に強く駆られることがある。
そのようなことが必要になることはほとんどなく賢明な判断でもありません。改善の取り組みに大きな価値をもたらす既存のサービス、プロセス、人材。ツールなども無駄にする可能性がある。まず、既にある活用可能なものを検討してみる。

### フィードバックをもとに反復して進化する
- すべてのことを一度に実施したいという気持ちは抑えること。大規模な取り組みであっても、反復的な活動によって達成する必要がある。作業をより小さく扱いやすいセクションに分割し、実行と仕上げをタイミングよく行えるようにすることで、各取り組みの焦点が明確になり維持しやすくなる。

### 協調し、可視性を高める
- 取り組みに適切な人材が適切な方法で関与していると、より多くの賛同を得ることができ、関連性が高まり長期的な成功を導きやすくなる。

### 包括的に考え、取り組む
- サービス、プラクティス、プロセス、部署またはサプライヤは、単独では成り立たない。活動を個別的ではなく全体として統合的に対応する組織でなければ、組織自身、顧客およびその他の利害関係者が得られるアウトプットは悪化する。すべての組織の活動は価値の提供に重きを置くべき。

### シンプルにし、実践的にする
- 目標を達成するためのステップの数は常に最小限にとどめる。価値を一切もたらさない、あるいは有用な成果を生み出さないプロセス、サービス、活動、測定基準は廃止すること。

### 最適化し、自動化する
- 技術は組織の拡張に役立ち、頻度の高い反復タスクを処理できるため、人的リソースをより複雑な意思決定に振り向けることができる。
C++のtemplateとdefine, constexprの使い分け

UE4のエンジンを眺めていると、templateとdefine, constexprの全てが使われていて、混乱していたので整理がてらまとめてみる。
間違っているのでツッコミ大歓迎！

**全てコンパイル時実行　かつ　templateが型安全　なのに何故defineを使うのか？？？**
って思った方の手助けになればと思います。


## 各種機能概要

###template

テンプレート引数を受け取り、引数の情報に従って関数やクラスを生成する機能。
使いこなすことができると悪いことも色々できる。
他２つの機能より抜きんでているイメージ。

``` c++:sampleTemplate.cpp
// define template.
template <typename T>
void Func(T arg)
{
    // do something.
}

// instance template.
Func<int>(5);
Func<double>(1.5);
```

####メリット
* 型に対して安全。
* 特殊化によって特定にテンプレート引数の時に挙動を変えられる。
* type_traitsが使える。(C++11)

#### デメリット
* 特になし。

他にもデフォルトテンプレート引数とかエイリアステンプレートとかの使い方があるけど、今回は関係ないので割愛する。

###define

プリプロセッサ命令
マクロを定義したり、シンボルを定義したりして、コンパイル時の制御をすることができる。
昔ながらの機能ってイメージ

``` c++:sampleDefine.cpp
// This is symbol.
#ifndef DEBUG
    #define DEBUG
#endif
#undef DEBUG

// This is macro.
#define FUNC(x) (x)*(x)
```

####メリット
* 関数の生成と定数の定義のどちらでも使える。
* シンボルの再定義ができる。

####デメリット
* 文字列として扱われるため、型の情報を無視する。
* マクロ展開時に関数の副作用が複数回発生することがある。

####constexpr

c++11で追加された定数、関数をコンパイル時に計算する機能。
とりあえず定数定義ならこれ使っておけって印象。

``` c++:sampleConstexpr.cpp
constexpr int KB = 1024;
constexpr int POW(int x) { return x * x; }
constexpr int SIZE = POW(KB);
int hogeArray[SIZE];
```

####メリット
* 記述が容易。
* constexpr関数はコンパイル時でも実行時でも使える。

##ここで疑問

###Question

**templateが型安全なのに、なぜ今だにdefineを使うのか？**

###Answer

**defineでしかできないことがある。**

##defineにしかできないこと

###①シンボル定義
変数名を変えることができる。
``##``がキモ

###②他プリプロセッサ命令に文字列を与えることができる。

defineはプリプロセッサだからできること。
例としてincludeにマクロ展開したファイル名を与える。

```c++:changeIncludeFile.cpp
// each macro needs "_INNER" macro, because it expands args macros at first.
#define TO_STR(x) TO_STR_INNER(x)
#define TO_STR_INNER(x) #x
#define SAMPLE_FILE(suffix, file) SAMPLE_FILE_INNER(suffix, file)
#define SAMPLE_FILE_INNER(suffix, file) suffix##file

#include TO_STR(SAMPLE_FILE(sample, Define.h)) // #include "sampleDefine.h"
```

##結論
基本的にはtemplateやconstexprが型安全なのでガンガン使ってよさそう。
定数定義やマクロくらいの関数といった簡単なこと→constexpr
型分岐やコンテナ実装等のちょっとリッチなことをする→template
defineでしかできない→define
Railsでワクワク個人開発 　第3回:データの関連付け/ seedデータ投入

# 関連付けとモデル

　日々の記憶がおぼろげだが、ここに記しておこう。関連づけられたデータを作成してみることにした。DB設計の段階から、ユーザーと彼らがもつ植物は関連付けようと考えていた。一人のUserは複数のPlantを所持する。共有することはしない。

　Userモデルはさきの記事でmigrateした。今回はPlantモデルをつくる。
`rails g model plant ` をターミナルに打ち込むとplantができる。便利だ。 `db/migrate`フォルダから対応するファイルを開く。こんな感じで書く。

```ruby
class CreatePlants < ActiveRecord::Migration[6.0]
  def change
    create_table :plants do |t|
      t.integer :user_id, null: false
      t.string :plant_name, null: false
      t.string :img
      t.timestamps
    end
  end
end
```

　このときにDB設計が生きてくる。場当たり的にこれらを設定するのはうまくいかない。
終了したらmigrateをしよう。


# モデルクラスの修正
　関連付けのお約束。モデルクラスの修正をした。

`app/model/plant.rb`

```ruby
class Plant < ApplicationRecord
  belongs_to :user
end
```

`app/model/user.rb`

```ruby
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  has_many :plants
end
```

 plantはuserに属している、userは多くのplantを持っている。ということを書いた。

# seedデータ投入
　ここで、タネを入れる。seedとかいうサンプルデータをあらかじめ入れておく。

`db/seed.rb`

```ruby
User.create(email: 'test@example.com', password: 'password')
User.create(email: 'test2@example.com', password: 'password')
Plant.create(user_id:1, plant_name: "flower", img: "flower_img") 
Plant.create(user_id:1, plant_name: "sun_flower", img: "sun_flower_img") 
Plant.create(user_id:2, plant_name: "dia", img: "dia_img") 
Plant.create(user_id:3, plant_name: "rose", img: "rose_img") 
```

 ターミナルで `rails db:seed`　と打つ。これでOK。　終了したらrailsのコンソールからデータを確認しよう。　`rails c`でできる。

　`User.all`と打ち込んだらいいぐあいに表示されるだろうか。よし。


# 次回予告
　いよいよネストされたリソースを使ってCRUD処理を書く。このあたり、途中経過がよくわからなくなっているので、結果だけ書いていく。
ファイルの作成、withステートメント

次のように書くとtest.textというファイルが作成されその中にtestと書き込まれる

```python:qiita.py
f = open("test.text", "w")
f.write("test")
f.close()
```
追加で書き込む際は'w'を'a'と書き換える必要がある
'w'のままにしておくと上書きされてしまう


```python:qiita.py
f = open("test.text", "a")
f.write("test2")
f.close()
```
ファイルの状態

```
testtest2
```

##print関数

print関数を使ってもファイルに書き込むことが可能

```python:qiita.py
f = open("test.text", "w")
f.write("test\n")
print("print関数での書き込み", file=f)
f.close()
```
ファイルの状態

```
test
print関数での書き込み
```
,で区切って書くとスペース開けて書き込まれる

```python:qiita.py
f = open("test.text", "w")
f.write("test\n")
print('print','関数','での','書き込み', file=f)
f.close()
```

ファイルの状態

```
test
print 関数 での 書き込み
```

sep,endも使うことが可能

```python:qiita.py
f = open("test.text", "w")
f.write("test\n")
print('print','関数','での','書き込み',sep="#",end="@", file=f)
f.close()
```


ファイルの状態

```
test
print#関数#での#書き込み@
```

#withステートメント

ファイルをf.closeを忘れるとメモリが消費されてしまう
withステートメントを使用することでcloseを使わずに済む


```python:qiita.py
with open("test.text", "w") as f:
    f.write("test\n")
    print('print','関数','での','書き込み',sep="#",end="@", file=f)
```
ITILファンデーション(ITIL4エディション)の資格の勉強を始めた2

「サービスマネジメントの4つの側面」と「6つのバリューチェーン活動」についてメモ。
# サービスマネジメントの4つの側面
- 組織と人材
- 情報と技術
- パートナとサプライヤ
- バリューストリームとプロセス

### 組織と人材
- 組織の構造化や管理の仕組みに加え、組織の役割、実行責任、権限やコミュニケーションのシステムが適切に定義され、戦略および運用モデル全体を支えている状態を実現することが重要

### 情報と技術
- サービスを管理するために必要な情報、知識、要求される技術が含まれる。

### パートナとサプライヤ
- 組織のサービスの設計開発展開提供サポート継続的改善に伴う他の組織との関係が含まれる。契約その他合意もふくまれる。

### バリューストリームとプロセス
- バリューストリームとは、製品やサービスを創出しサービス消費者に提供するために組織が使用する一連のステップ。
- プロセスとは、インプットをアウトプットに変換する一連の活動。

# 6つのバリューチェーン活動
- 計画
- 改善
- エンゲージ
- 設計および移行
- 取得/構築
- 提供およびサポート

###　ポイント
- バリューチェーン外部の関係者とのやり取りは全てエンゲージを通じておこなわれる
- 新しいリソースは全て取得構築を通じて獲得される
- あらゆるレベルの計画立案は計画を通じて実行される
- あらゆるレベルの改善は改善を通じて開始され管理される


### 計画
- 計画の目的は、ビション、現状、改善指示に関する理解を組織全体で確実に共有すること

### 改善
- 改善の目的は、製品、サービス、プラクティスを継続的に改善すること

### エンゲージ
- エンゲージの目的は、全ての利害関係者との関係を良好にすること

### 設計および移行
- 設計および移行の目的は、製品、サービスが品質、コスト、市場投入までの期間について利害関係者からの期待に継続的に応えられるようにすること

### 取得/構築
- 取得構築の目的は、サービスコンポーネントが合意された仕様を満たし、必要なときに必要な場所で利用できるようにすること

### 提供およびサポート
- 提供およびサポートの目的は、合意された仕様に従ってサービスの提供およびサポートを実施すること。
Azure KinectをJetson Xavier NXで試す

## Azure KinectをJetson Xavier NXで試す

Azure KinectをJetson NanoやXavier NXシリーズで動かすまでのメモ

どうやらAzure Kinectを使用するためのSDKが
いままではARM64には対応していなかったが最近対応したらしい

![IMG_5383.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187470/01985855-bce8-94e8-1087-aecf2c089dba.jpeg)

Azure Kinectの配線はこんな感じです。
左側は充電コードでコンセントに挿して使用します。
右側のコードをXavier NXに繋げます。

充電コードの先はusbタイプですがNXにつなげると電力不足になってしまうので注意(電力不足の時はLEDが黄色で点滅します)


Azure Kinectを使用するためのSDKのインストール

参考:https://github.com/microsoft/Azure-Kinect-Sensor-SDK/blob/develop/docs/usage.md

```

curl -sSL https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -

#レポジトリの追加
# ARMアーキテクチャに対応したものをDL
sudo apt-add-repository https://packages.microsoft.com/ubuntu/18.04/multiarch/prod


sudo apt-get update

```
次にlibk4a-devをインストールする
デモを動かす時には必要らしい。

インストールしたSDKとバージョンを合わせる必要があるらしく
今回はSDK1.4.1をインストールしたため
 libk4a1.4-devをインストールしています。

命名規則はこんな感じになっているので自分のバージョンを合わせる必要があります
libk4a(major).(minor)-dev 

(major)と(minor)にバージョンの数字をいれるような感じになっています。



```
 sudo apt install libk4a1.4-dev
```

```
cd /usr/bin/
sudo ./k4aviewer 
```
こんな感じでできたら成功です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187470/13711f64-5960-d4fd-6798-1495509cc3e3.png)

##今後
トラッキングのデモとかもあるらしいので試していこうと思います
Next.jsの共通コンポーネントのPropsに型をつける方法

## コンポーネントのPropsに型がつけられない

レイアウトなどを共通コンポーネントを作成し、各コンポーネントで利用しようとすると、下記のようになるかと思います。

```tsx:layout.tsx
const Layout = ({ children }) => {
  return (
    <>{children}</>
  );
};
export default Layout;
```

そうしますと、eslintや使っているIDE（vscodeなど）の設定によっては、childrenがanyであるという警告が出てしまうことがあります。

## こう修正します

なるべく警告は消しておきたいので、型定義を行いたいと思います。
`react`の`ReactNode`が実体ですので、それを定義してあげる形となります。

```tsx:layout.tsx
import { ReactNode } from "react";

interface Props {
  children: ReactNode;
}

const Layout = ({ children }: Props) => {
  return (
    <>{children}</>
  );
};
export default Layout;
```
【PHPでECサイト】

## はじめに
これまでに独学してきた知識の整理のために、ECサイトを作成します。

### バージョン
PHP：7.4.5
phpMyAdmin：5.0.2
MySQL：5.7.30

## 実装する機能
- [CRUD機能](https://qiita.com/taqmi/items/932a44b94b3a8c644370)
- [ログイン機能](https://qiita.com/taqmi/items/24520d00bb19d9b701b6)
- [カート機能](https://qiita.com/taqmi/items/5ab83a0093748c307f6f)
- [購入履歴・購入明細](https://qiita.com/taqmi/items/f2167a199e3f3befd93f)
Sublime Text でおすすめのプラグインと導入方法

![スクリーンショット 2020-08-17 21.33.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654387/0f6cee03-3806-c913-2a45-a2793029315b.png)
プログラミングで利用できるテキストエディタは様々ありますが、そのなかでも、Sublime Textのおすすめプラグインをご紹介いたします。

# プラグインのインストール手順

### 1. Sublime Textを開きます
### 2. command + shift + P を押します
### 3. 入力バーが表示されるので、 install package と入力し、Enterを押します
![スクリーンショット 2020-08-17 14.26.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654387/6a99e850-85f1-30fd-54d3-8006805c05ef.png)

### 4. プラグイン名を入力し、Enterでインストールします。
![スクリーンショット 2020-08-17 14.32.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654387/a005603f-a7d4-1206-8f1e-73259b6c67fe.png)


以降、2〜4を繰り返します。

# おすすめのプラグイン

- <b>Japanize</b> ・・・ 日本語化
- <b>HTML5</b> ・・・ HTMLのコード補完を強化
- <b>SCSS</b> ・・・ SCSSを使用可能にする
- <b>CSS Snippets</b> ・・・ CSSの入力補完を強化
- <b>ERB Snippets</b> ・・・ ERBタグの入力補完を強化
- <b>Ruby Debugger</b> ・・・ Rubyの構文をチェック
- <b>TrailingSpaces</b> ・・・ 不要な半角スペースや、全角スペースをハイライトで表示

# インストールしたプラグインを確認したい場合

<b>command + shift + P</b> を押して、入力バーに <b>list</b> と入力し Enter でリストを表示します。
![スクリーンショット 2020-08-17 21.21.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654387/4964d87c-fb5c-023b-099d-abb6b4d9be88.png)
![スクリーンショット 2020-08-17 21.38.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654387/9c0b7d86-ec91-0bba-19f9-e4b31dca0fc0.png)


# プラグインを削除したい場合

<b>command + shift + P</b> を押して、入力バーに <b>remove</b> と入力し、<b>package Control: Remove Package</b> を方向キーで選択し、Enter を押します。
![スクリーンショット 2020-08-17 21.33.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654387/f5a03b2c-2a1e-46f9-1e8c-5d8b8cd3e950.png)

インストールされているプラグインのリストが表示されるので、アンインストールするプラグインを選択し、Enter でアンインストールします。
![スクリーンショット 2020-08-17 21.38.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654387/fef6c217-d6f7-3933-f8d1-3107fd345481.png)
あなたのビジネスのためのロゴの重要性。 なぜ必要なのですか？


ロゴは、視覚的なイメージとテキストの組織的な組み合わせとして定義することができます。このイメージは、会社の名前について人々に伝えることの目的を果たし、また、あなたのビジネスを表すユニークなシンボルを生成します。これらのロゴのいくつかは、人々の記憶に接続されている強力な象徴的な関連付けを持っています。例えば、マクドナルドのロゴである黄金のアーチは、もはやそれがマクドナルドを表していることを認識するために会社名を必要としないほど身近なものになっています。
![photo-1515225369639-13e9812d379e.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689748/fcf2bb5f-57c1-67ed-f648-5a05a1330448.jpeg)


##ロゴはなぜ必要なのか？

よくデザインされたプロフェッショナルなロゴは信頼を構築するのに役立ちます。丁寧にデザインされたロゴがあれば、あなたのウェブサイトの訪問者が興味を示すチャンスが上がります。同様に、あなたのロゴがワードでデザインされているようであれば、あなたのコアビジネスサービス/製品を提供する能力が疑われでしょう。

##良い中小企業ロゴには何が必要か？

多くの中小企業会社が、自分たちのブランドが次のマクドナルドやコカ・コーラになると思っています。そのため、ロゴは最初の一歩から、会社名テキストが明確であり、遠くから読みやすいことを確認することが非常に重要です。なぜなら、車両や建物の看板、ポスター、及びその他の場所に遠隔で表示される可能性があるからです。

##使用方法が一貫であることに注意しましょう

世界的に有名なブランドは、ロゴを作成する際に、何十ページにも及ぶブランド基準の文書を準備することがよくあります。これらの文書には、次のようなものが含まれています。
ロゴのさまざまなバリエーションのどこに使用すべきかについての指示。
ロゴの変更に関する情報。
ロゴの近くで見られるべきではない物の例。
異なるシナリオでのロゴに期待される外観。
中小企業にとって、これはやりすぎですが、大企業やブランドは、さまざまな状況でのロゴの一貫性のない外観が信頼に有害であることを理解しています。ロゴの使用に一貫性は大切です。

##シンプルな色を使う-すべての使用状況を考えてみましょう

あなたのロゴは、レターヘッド、バナー、スクリーン、名刺、新聞広告などに表示されます。いくつかの細かいディテールや色のグラデーション、絵柄の内容が含まれているロゴは、印刷技術が異なるため、様々な場面で異なる可能性が高いです。そのため、それらの色を揃えることは困難です。そのため、強力なブランドでは、3色以下のシンプルなパレットや、グラデーションではなく無地の色を使用しています。
![pencil-typography-black-design.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689748/c3b7614f-7647-b398-00c0-18ab52f72fec.jpeg)


##視覚的・記憶的なものを活用する

次のペプシやアディダスになるまでに何年もかかるかもしれませんが、自分のロゴに何かユニークで重要なものを持つことは素晴らしいアイデアです。これは、標準フォントを使用するだけでなく、特殊なテキストを使用したり、ロゴ内のテキストを変更したりして出来ます。他のブランドでは、ロゴのテキスト部分にイラスト付きのアイコンを使用しています。アイコンの利点は、状況によっては単独で使用できることです。たとえば、Nikeマークは、テキスト 「Nike」 の有無にかかわらず表示されます。最初は何も意味がなかったものが、視覚的記憶に発達しました。

##ロゴはどうやって作れますか？

専門家にデザインされたロゴが最良の方法です。私たちの経験によると、最良の選択肢の中には、小さな地元のグラフィックデザインや印刷代理店だけでなく、オンラインツールも含まれています。デザインや印刷店、またはフリーランスのデザイナーを利用することによって、あなたは広告代理店に数千を支払うことを避けることになります。しかし、まだ、個人的なサービスと低品質のロゴを受け取る可能性があります。小さなデザインビジネスは、印刷物や名刺のデザインにも非常に優れています。一度にあなたの文房具、ロゴ、および名刺に取り組んで、しばしば良い経験を得ることができます。別の方法は、[Logaster](https://www.777logos.com/logo/#first)としてロゴメーカーを使用することです。これを使うと、数分のうちに綺麗なロゴを取得するのに役立ちます。

![doctype-hi-res.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689748/445b9715-2419-4dfe-46d9-735e7a93c218.jpeg)


##良いデザイナーを選ぶためのコツと、最良の結果を得るためのコツ

彼らの以前の作品のサンプルを必ずチェックしてください。ポートフォリオに非常に見栄えの良いサンプルがあれば、彼らはあなたのために素晴らしい見栄えのロゴをデザインすることができることを確信することができます。優れたロゴを持つ他の中小企業と連絡を取り、その企業のデザイナーに問い合わせ、その企業のデザイナーをあなたに推薦してもらえるかどうかを尋ねる。あなたのビジネスがスタートアップであれば、あなたのロゴをデザインするために何千ドルも支払う必要はありませんので、見積もり価格が高すぎる場合、あなたは周りに何を支払ったかを確認するために尋ねることができます。最高のデザイナーであっても、顧客が何を必要としているかを明確に説明されたときにしか顧客を喜ばせないので、デザイナーに適切な説明をすることも不可欠である。クライアントが曖昧な説明をしてしまうと、デザインの始め方が難しくなります。
【SQL入門】COUNT(*) と COUNT(カラム名) の違い

## COUNT関数

SQLにおける集計関数のひとつ。
該当した行数を取得する関数。

```sql
-- genre が 'アクション' である行数を数える
SELECT COUNT(*) FROM movie WHERE genre = 'アクション';
```

## COUNT(*) と COUNT(カラム名) の違い

- `COUNT(*)`は、単純に行数をカウントする( **NULL の行も含める**)。
- `COUNT(カラム名)` は、指定カラムの値が **NULL である行を無視して**カウントする。

参考図書：[スッキリわかるSQL入門 第2版](https://www.amazon.co.jp/dp/4295005096/ref=cm_sw_em_r_mt_dp_IGtnFbPQ9MTVT)
[Ruby]2重ハッシュの中身の取り出し方

#概要
2重ハッシュの取り出し方について、備忘録としてまとめます。

#環境
Ruby 2.6.5

#内容
例えば、配列の内部に複数のハッシュをもつ変数user_dateがあるとします。

```ruby
user_data = [
  {
    user: {
      profile: {
        name: 'Taro'
      }
    }
  },
  {
    user: {
      profile: {
        name: 'Jiro'
      }
    }
  },
  {
    user: {
      profile: {
        name: 'Saburo'
      }
    }
  }
]
```

ハッシュの持っている値の取得には、その値に対応するキーを指定します。

```
ハッシュ[取得する値のキー]
```

また、二重ハッシュから特定のデータを取得する場合は、[取得する値のキー]を取得するデータまで連続して指定します。
したがって。全てのユーザーの名前だけを出力しようとすると以下の記述になります。

```ruby
user_data.each do |user|
  puts user[:user][:profile][:name]
end
```

以上
【MySQL5.7】MySQLが、思うように立ち上がらない。。。


#環境

```shell
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.29, for osx10.15 (x86_64) using  EditLine wrapper
```

#PIDファイルに関してのエラー

```shell
$ mysql.server start

ERROR! The server quit without updating PID file (/usr/local/var/mysql/hogehogenoMacBook-Pro.local.pid).
```

###マシンのホスト名を確認

```shell
$ uname -n
hogehogenoMacBook-Pro.local
```

###pidファイルを作成し、アクセス権限を付与


```shell
$ sudo touch /usr/local/var/mysql/hogehogenoMacBook-Pro.local.pid

# /usr/local/var/mysql/配下のファイルにアクセス権限を付与する
$ sudo chown -R _mysql:_mysql /usr/local/var/mysql/
```

###もう一度、MySQLを起動する

```shell
$ mysql.server start

Starting MySQL
. SUCCESS! 
```

#それでも、エラーになる場合

```shell
ERROR! The server quit without updating PID file (/usr/local/var/mysql/hogehogenoMacBook-Pro.local.pid).
```

##プロセス関連のエラー

###mysqldのプロセスが既に起動していたら、プロセスIDを指定してkillする

```shell
$ ps -ef | grep mysql

    0  1435     1   0  3:46PM ??         0:00.02 /bin/sh/usr/local/Cellar/mysql@5.7/5.7.29/bin/mysqld_safe

   74  1531     1   0  3:46PM ??         0:08.23 /usr/local/Cellar/mysql@5.7/5.7.29/bin/mysqld

$ sudo kill -9 1435
$ sudo kill -9 1531
```


###もう一度、pidファイルを作成し権限を与え、起動する

```shell
$ sudo touch /usr/local/var/mysql/hogehogenoMacBook-Pro.local.pid
$ sudo chown -R _mysql:_mysql /usr/local/var/mysql/

$ mysql.server start
Starting MySQL
. SUCCESS! 
```
【パス指定】ネストしたリソースのパス指定

# 概要
ネストしたリソースのパス指定方法について、一瞬戸惑ってしまったので備忘録として記録します。

# 環境
・ruby '2.5.7'
・rails '5.2.3'
・rspec-rails '4.0.0.beta2'

# 指定方法

 **結論：** `rails routes`してルーティングを一覧表示して確認する！

####(例) Rspecのリクエストテストでパス指定をする
次のような、ルーティングを宣言していたとします。

```routes.rb
  resources :datespots do
    resources :comments, only: [:create, :destroy]
  end
``` 

ターミナルで`rails routes`すると、ルーティングが一覧表示される。

```
                   Prefix Verb   URI Pattern                                                                              Controller#Action
（省略）
        datespot_comments POST   /datespots/:datespot_id/comments(.:format)                                               comments#create
         datespot_comment DELETE /datespots/:datespot_id/comments/:id(.:format)                                           comments#destroy
（省略）
``` 

これを元に、パス指定すればOK！

```comments_spec.rb
（省略）
    it "有効な内容のコメントが登録できること" do
      expect {
        post "/datespots/#{datespot.id}/comments", params: {
          datespot_id: datespot.id,
          comment: { content: "オシャレですね！" }
        }
      }.to change(datespot.comments, :count).by(1)
    end
（省略）
``` 

# 参考
[Rails ガイド　2.7 ネストしたリソース](https://railsguides.jp/routing.html#%E3%83%8D%E3%82%B9%E3%83%88%E3%81%97%E3%81%9F%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9 "Rails ガイド　2.7 ネストしたリソース")
クラス変数、クラスメソッドとスタティスティックメソッド

```python:qiita.py
class Person(object):

    kind = 'human'

    def __init__(self,name):
        self.name = name

    def who_are_you(self):
        print(self.name,self.kind)

a = Person('A')
a.who_are_you()
#A human

b = Person('B')
b.who_are_you()
#B human
```

##注意点
クラス変数は全てのオブジェクトで共有される

```python:qiita.py
class T(object):

    words = []

    def add_word(self,word):
        self.words.append(word)
c = T()
c.add_word('add1')
c.add_word('add2')

d = T()
d.add_word('add3')
d.add_word('add4')
print(c.words)
#['add1', 'add2', 'add3', 'add4']
```

このように書き換える必要がある
initで初期化する

```python:qiita.py
class T(object):
    def __init__(self):
        self.words = []

    def add_word(self,word):
        self.words.append(word)
c = T()
c.add_word('add1')
c.add_word('add2')
print(c.words)
#['add1', 'add2']

d = T()
d.add_word('add3')
d.add_word('add4')
print(d.words)
#['add3', 'add4']
```

#クラスメソッド

```python:qiita.py
class Person(object):

    kind = 'human'

    def __init__(self):
        self.x = 100

a = Person()
print(a)
b = Person
print(b)
```

実行すると
aでは『オブジェクトだと表示』され、
bでは『クラスのみを示し、オブジェクト化されていない』と表示される。

```
<__main__.Person object at 0x7fc0558d6210>
<class '__main__.Person'>
```

self.xにアクセスしようとすると
aでは100と表示されるが
bではinitが実行されていない為エラーが発生する

```python:qiita.py
class Person(object):

    kind = 'human'

    def __init__(self):
        self.x = 100

a = Person()
print(a.x)
b = Person
print(b.x)
```


```
100
Traceback (most recent call last):
  File "/Users/kirinboy96/PycharmProjects/untitled1/lesson_package/NEW1.py", line 11, in <module>
    print(b.x)
AttributeError: type object 'Person'
```

ただ、この場合でもkindには$\color{red}{\rm アクセス可能}$


```python:qiita.py
class Person(object):

    kind = 'human'

    def __init__(self):
        self.x = 100

a = Person()
print(a.kind)
# 実行結果：human
b = Person
print(b.kind)
# 実行結果：human
```

#クラスメソッド
オブジェクト化されていなくても、アクセスする方法としてクラスメソッドが存在する


```python:qiita.py
class Person(object):

    kind = 'human'

    def __init__(self):
        self.x = 100
        
    @classmethod
    def what_is_your_kind(cls):
        return cls.kind

a = Person()
print(a.what_is_your_kind())
# 実行結果：human
b = Person
print(b.what_is_your_kind())
# 実行結果：human
```

#スタティックメソッド
スタティックメソッドにはcls,selfなど使わなくてもOK

```python:qiita.py
class Person(object):

    kind = 'human'

    def __init__(self):
        self.x = 100

    @classmethod
    def what_is_your_kind(cls):
        return cls.kind

    @staticmethod
    def about():
        print("about human")

print(Person.about())
# 実行結果：about human
```

引数をとる事もできる

```python:qiita.py
class Person(object):

    kind = 'human'

    def __init__(self):
        self.x = 100

    @classmethod
    def what_is_your_kind(cls):
        return cls.kind

    @staticmethod
    def about(year):
        print("about human {}".format(year))

print(Person.about(2020))
# 実行結果：about human 2020
```
php artisan serveをしたらエラーになった

laravelで作成したプロジェクトでサーバを起動しようとしたところこのようなエラーがでた

Version
・PHP 7.4.9
・Composer 2.0.0-alpha3
・Laravel Installer 3.2.0

```
$php artisan serve

Laravel development server started: http://127.0.0.1:8000
Sun Aug 16 19:18:09 2020 (10355): Fatal Error Unable to create lock file: Bad file descriptor (9)
Laravel development server started: http://127.0.0.1:8001
Sun Aug 16 19:18:09 2020 (10356): Fatal Error Unable to create lock file: Bad file descriptor (9)
Laravel development server started: http://127.0.0.1:8002
Sun Aug 16 19:18:09 2020 (10357): Fatal Error Unable to create lock file: Bad file descriptor (9)
Laravel development server started: http://127.0.0.1:8003
Sun Aug 16 19:18:09 2020 (10358): Fatal Error Unable to create lock file: Bad file descriptor (9)
Laravel development server started: http://127.0.0.1:8004
Sun Aug 16 19:18:09 2020 (10359): Fatal Error Unable to create lock file: Bad file descriptor (9)
Laravel development server started: http://127.0.0.1:8005
Sun Aug 16 19:18:09 2020 (10360): Fatal Error Unable to create lock file: Bad file descriptor (9)
Laravel development server started: http://127.0.0.1:8006
Sun Aug 16 19:18:09 2020 (10361): Fatal Error Unable to create lock file: Bad file descriptor (9)
Laravel development server started: http://127.0.0.1:8007
Sun Aug 16 19:18:09 2020 (10362): Fatal Error Unable to create lock file: Bad file descriptor (9)
Laravel development server started: http://127.0.0.1:8008
Sun Aug 16 19:18:09 2020 (10363): Fatal Error Unable to create lock file: Bad file descriptor (9)
Laravel development server started: http://127.0.0.1:8009
Sun Aug 16 19:18:09 2020 (10364): Fatal Error Unable to create lock file: Bad file descriptor (9)
Laravel development server started: http://127.0.0.1:8010
Sun Aug 16 19:18:09 2020 (10365): Fatal Error Unable to create lock file: Bad file descriptor (9)
```
ロックファイルが作成できないらしい。

↓この人と同じ現象だったので、ルートのtmpディレクトリに書き込みの権限を与えたところ解決した。
https://stackoverflow.com/questions/39098717/fatal-error-unable-to-create-lock-file-bad-file-descriptor-9-while-running
引数の記法

# 引数のデフォルト値

```php:cal1.php
function sum(float $a = 5, float $b = 2) : float {
      return $a + $b;
}

print sum(); // 7
print sum(1); // 3 $aに1が入る
print sum(1,5); // 6 $aに1,$bに5が入る
```

省略できるのは後ろの引数のみなので、要注意
引数にデフォルト値を設定できるのは、後方にデフォルト値のない引数がない場合のみ

```php:cal2.php
function sum(float $a = 5, float $b) : float {
      return $a + $b;
}

print sum(5); // Error
```

# 可変長引数の関数

可変長引数の関数　＝　引数の個数があらかじめ決まっていない関数

引数の前に「...」をつける

```php:cal3.php
function sum(float ...$a) : float {
      $result = 0;
      foreach($a as $val){
          $result += $val;
      }
      return $result;
}

print sum(5,3,1); // 9
print sum(5,3,1,2); // 11
```

可変長引数は通常の引数と混合して使うことが可能。
この場合、可変長引数は引数リストの末尾に置かなければならない

# 参考文献

[独習PHP第3版](https://www.amazon.co.jp/%E7%8B%AC%E7%BF%92PHP-%E7%AC%AC3%E7%89%88-%E5%B1%B1%E7%94%B0%E7%A5%A5%E5%AF%9B-ebook/dp/B01FH3KVNU/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E7%8B%AC%E7%BF%92php&qid=1597667711&sr=8-1)
Boost LambdaとCUDA/GPUについての雑感

ラムダ式は無名関数を提供する機能。
→ 個人的には、「いかにforループ式を書かないか」というコンセプトの１つ。

思えば、CUDA/GPU/Thrustも、いかに「C/C++的なforループを書かないか」という設計になっているとも言える。

例えば、CUDAのコードを見てみる。。

<pre>
     1 void sumOnCPU(float *A, float *B, float *C, const int N)
     2 {
     3    for (int idx = 0; idx < N; idx++)
     4    {
     5        C[idx] = A[idx] + B[idx];
     6    }
     7 }
     8 __global__ void sumOnGPU(float *A, float *B, float *C, const int N)
     9 {
    10    int i = blockIdx.x * blockDim.x + threadIdx.x;
    11
    12    if (i < N) C[i] = A[i] + B[i];
    13 } 
</pre>

行列Aと行列Bの和を取る、という処理は同じだが、12行目でforループが無くなっている。。

Thrustのコードの切れはしを見てみる。。。

<pre>
     1  // 32Mの乱数をCPUで生成
     2  thrust::host_vector<int> h_vec(1024 << 20);
     3  std::generate(h_vec.begin(), h_vec.end(), rand);
     4
     5  // CPU(h_vec)からGPU(d_vec)へデータを転送
     6  thrust::device_vector<int> d_vec = h_vec;
     7
     8  // GPUでソートする
     9  thrust::sort(d_vec.begin(), d_vec.end());
    10
    11  // ソートしたデータをCPU(h_vec)へ転送
    12  thrust::copy(d_vec.begin(), d_vec.end(), h_vec.begin());
</pre>

forループが無い。。繰り返しの表現にはループの他に、リスト（ここではvector)を使う方法がある。

ここからが本題のBoost Lambda。

<pre>
　   1#include <iostream>
     2#include <vector>
     3#include <algorithm>
     4#include <boost/lambda/lambda.hpp>
     5using namespace std;
     6using namespace boost;
     7
     8int main()
     9{
    10    using namespace boost::lambda;
    11
    12    int init_v[] = {-25,-15,0,25,15};
    13    vector<int> v( init_v, init_v+5 );
    14
    15
    16    for_each( v.begin(), v.end(), (cout << _1 << ',') );
    17    cout << endl;
    18
    19    for_each( v.begin(), v.end(), (_1 += 13) );
    20
    21    for_each( v.begin(), v.end(), (cout << _1 << ',') );
    22    cout << endl;
    23
    24    vector<int>::iterator it =
    25        adjacent_find( v.begin(), v.end(), (_1 > _2) );
    26    cout << *it << " is more than " << *(it+1) << endl;
    27
    28    replace_if( v.begin(), v.end(), (_1 < 0 || 20 < _1), 0 );
    29
    30    for_each( v.begin(), v.end(), (cout << _1 << ' ') );
    31    cout << endl;
    32
    33    return 0;
    34}
</pre>

16-17行目で全要素を表示
19行で全要素に13を足す
21-22行目で全要素（結果）を表示

    16    for_each( v.begin(), v.end(), (cout << _1 << ',') );
    17    cout << endl;
    18
    19    for_each( v.begin(), v.end(), (_1 += 13) );
    20
    21    for_each( v.begin(), v.end(), (cout << _1 << ',') );
    22    cout << endl;

28行目で1以上20以下の要素は0にする

    28    replace_if( v.begin(), v.end(), (_1 < 0 || 20 < _1), 0 );

<pre>
$ ./a.out 
-25,-15,0,25,15,
-12,-2,13,38,28,
38 is more than 28
0 0 13 0 0 
</pre>

# ラムダ式の利点

■ 多くの小さな関数オブジェクトを生成しなくともすむ。
■ コード中に関数オブジェクトが散乱するのを防ぐ
■ コード量が減る。可読性が増す。
■ なんか響きがいい　（｀ー´）b
Jira におけるバージョン、エピック、タスク、スプリントの使い分けについて


## はじめに

Jira とは Atlassian 社が開発するソフトウェアです。
パブリックオープンソースプロジェクトで広く使用されています。
アジャイルおよびソフトウェア開発プロジェクトの計画、追跡、管理を行うことができます。
Jira を使用する上で使用することになる`バージョン、エピック、タスク、スプリント`がどのような役割を担っているのかを説明します。

## それぞれの役割

ここでは Jira におけるタスク、エピック、バージョン、スプリントそれぞれについ例を挙げて説明していきます。
保守開発案件でユーザ管理機能を追加して欲しいという要望を貰った場合を例とします。

### バージョン

リリースに含まれる機能・要望でグルーピングしたものです。

> 例）  
> 今回の前提条件だとユーザ管理機能がバージョンになります。

### エピック

エピックとは、タスクを一定のジャンルでグルーピングしたものです。

> 例）  
> ユーザ管理機能は複数の機能で成り立つものとし、以下に挙げる機能がそれぞれエピックになります。
>
> - 一覧機能
> - 登録・更新機能
> - 削除機能
> - 結合テスト
> - システムテスト
> - リリースリハーサル
> - リリース

### タスク

各、エピックに必要な個別の作業一つ一つを指します。

> 例）
>
> - 基本設計
> - 詳細設計
> - 開発
> - テスト仕様書作成
> - テストデータ作成
> - テスト実施
> - レビュー

### スプリント

スプリントは、チームがバックログの一定数の課題にコミットするための、固定された期間です。  
進捗状況を確認する単位であり、割り振られた課題をコミットする目標期間でもあります。

## 概念図

今まで説明した項目を概念的に表すと以下の図のようにななります。

![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472784/f95c6ecf-49ef-e6bd-632d-7d142267b4b0.png)



## おまけ、ロードマップ

おまけとして、バージョン、エピック、タスク、スプリントをガントチャートなどを使用して進捗状況をよりみやすくしたものがロードマップという機能になります。
おまけなので詳細は説明しませんが、イメージは以下のようになります。

![スクリーンショット 2020-08-17 14.19.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472784/a5cd58d4-0c69-dc3c-9d8e-cc0a95048629.png)


## 終わりに

このように、Jira を使用することでアジャイルおよびソフトウェアプロジェクトの計画、追跡、管理を円滑に行うことが出来るようになります。  
例に挙げた内容だとリリースのサイクルとしては長いイメージで、アジャイルなどではもっと短いサイクルでリリースを繰り返していくことになります。
JETSON NANOにArcher T2U Plusの無線LAN子機を使う方法

こんにちは。
コロナ禍の夏、皆さまはいかがお過ごしでしょうか？

個人的に毎年恒例にしている自由研究で「JETSON NANOを使って何かやる」をテーマにしていたので、
環境構築を進めていたのですが準備段階で想定していない部分であれこれつまったので備忘としてまとめていきます。

# 環境
JETSON NANO(詳しい情報は[公式サイト](https://www.nvidia.com/ja-jp/autonomous-machines/embedded-systems/jetson-nano/)を参照)

[作業用]
Ubuntu 20.04.01 Desktop版

# 発生したこと
tp-linkのArcher T2U Pulusという無線LAN子機をJETSON NANOに接続したらデバイスが認識されなかった。
この無線LAN子機の製品を利用するにはドライバーのインストールが必要なのでインストールすると解決できそう。
ただ、WindowsやMacのドライバーのインストール手順は説明書に記載されているが、Ubuntu向けは記載されていなかった。
あれこれ調べているとLinux向けのドライバーも存在しているみたいなので、Wi-Fiが接続できるようになるまでの手順を以降でまとめていきます。

# 手順

### JETSON NANOにGitとdkmsをインストールする
必要なパッケージをインストールします。
dkmsは、カーネルモジュールを作成するためのフレームワークで、今回利用するドライバーツールのインストーラーで利用しているみたいなので、これも一緒にインストールします。
[archlinux｜Dynamic Kernel Module Support](https://wiki.archlinux.jp/index.php/Dynamic_Kernel_Module_Support)

```bash
sudo apt-get install git dkms
```

### ドライバを取得してインストール

パッケージのストールが完了したら、GitHubからドライバを取得して`dkms-install.sh`を実行します。

```bash
git clone https://github.com/aircrack-ng/rtl8812au.git
cd rtl8812au
sudo ./dkms-install.sh
```

インストールが完了したら、デバイスを再起動してWi-Fiが認識されていたら完了です。

# おまけ(有線LANの環境がない人向け)

### debファイルを取得
ブラウザを開いてこちらの[サイト](http://jp.archive.ubuntu.com/ubuntu/pool/main/d/dkms/)からdebファイルを取得してください。
今回は、`dkms_2.8.1-5ubuntu1_all.deb`のバージョンファイルを使用しています。

### JETSON NANOにファイルをコピー
取得したファイルと手順に記載しているGitHubからクローンしたコードの2つをUSBメモリなどにコピーしてください。
コピーが完了したらJETSON NANOにUSBメモリを接続して、USBメモリに格納しているファイルをコピーします。

### パッケージをインストール
パッケージファイルからインストールする際は、下記のコマンドでdebファイルのパスを指定してインストールします。
事前にdebファイルがあるディレクトリに移動して下さい。

```bash
sudo apt-get install ./dkms_2.8.1-5ubuntu1_all.deb
```

インストールが完了したら手順の「GitHubから取得したシェルを実行」の手順を実施して下さい。

# おわり
不適切な表現などありましたら、フィードバック頂けると幸いです。
Djangoでセッションを使った情報記録メモ

<h2>セッションから記録情報を引き出す方法</h2>
<p>下記のように取得し、定義などは考える必要なし
(空の場合は以降の処理で場合分けを行う)。</p>
```
変数 = request.session.get('セッション記憶情報変数名')
```
```
ex) cart = request.session.get('cart')
```

<h2>セッションの情報を追加する方法</h2>
<p>下記のように追加情報を変数に追加してからセッションを上書きする。</p>
```
変数.append(追加情報)
request.session['セッション記憶情報変数名'] = 変数
```
```
ex) cart.append(product_id)
    request.session['cart'] = cart
```

<h2>セッションの情報を削除する方法</h2>
<p>下記のように削除情報を持たない仮変数を作ってからセッションを上書きする。</p>
```
for 仮数(何でも良い) in 変数:
    if 仮数 != 削除情報:
        仮変数.append(仮数)
request.session['セッション記憶情報変数名'] = 仮変数
```
```
ex) for p in cart:
        if p != product_id:
            filtered.append(p)
    request.session['cart'] = filtered
```