OmniAICreator/Qiita-1.07M huggingface dataset:
別画面に値を渡す方法について

# 画面遷移時に値を渡す

画面遷移時に遷移先の変数varに値を渡すことで、別の画面に値を渡すことができます。

``` Swift:ViewController
let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "second") as! secondViewController
secondViewController. value = "value"
self.present(secondViewController, animated: true, completion: nil)
```

``` Swift:secondViewController
class secondViewController: UIViewController {

    var value = String()

     override func viewDidLoad() {
          super.viewDidLoad()
     }
}
```

# 画面遷移時以外で値を渡す

tabBarControllerは、最初にタブを切り替えた時に画面が生成され、削除されないため
画面遷移時以外に値を渡す方法が必要になります。

プロトコルを使用して、特定の処理後に実行させることで、別の画面に値を渡したり処理を行うことができます。

``` Swift:ViewController
var process: anotherScreenProcess!

class ViewController: UIViewController {

     override func viewDidLoad() {
          super.viewDidLoad()

          self.process = secondViewController() as anotherScreenProcess
          self.process.sendValue()
     }
}
```

``` Swift:secondViewController

protocol anotherScreenProcess {
    func sendValue()
}

class secondViewController: UIViewController, anotherScreenProcess {
     override func viewDidLoad() {
          super.viewDidLoad()
     }

     // 別画面からの処理
     func sendValue() {

     }
}
```



# tabBarControllerについて

tabBarControllerは最初の画面遷移時のみ画面が作成され、削除されません。
そのため、プロトコルの使用以外に作成したtabBarControllerを削除することで、
画面自体の再作成を行うことができます。

``` Swift:
self.tabBarController!.viewControllers![1].dismiss(animated: true, completion: nil)
```
UnityAndroidプラグインのIFメモ



Java

```
package com.android.gl2jni;

// Wrapper for native library
public class GL2JNILib {

     static {
         System.loadLibrary("gl2jni");
     }

    /**
     * @param width the current view width
     * @param height the current view height
     */
     public static native void init(int width, int height);
     public static native void step();
}

```

C++

```
extern "C" {
    JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_init(JNIEnv * env, jobject obj,  jint width, jint height);
    JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_step(JNIEnv * env, jobject obj);
};

JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_init(JNIEnv * env, jobject obj,  jint width, jint height)
{
    setupGraphics(width, height);
}

JNIEXPORT void JNICALL Java_com_android_gl2jni_GL2JNILib_step(JNIEnv * env, jobject obj)
{
    renderFrame();
}

```

c# 


```
using System.Runtime.InteropServices; // for dll import
String PluginPackage = "com.ex.test1";
AndroidJavaObject mImageLoader = null;

[DllImport("PluginName")]
protected static extern int InitNativeLib();

public void init_lib() 
{
	mImageLoader = new AndroidJavaObject(PluginPackage + "ClasName");
	tex_sizeX = mImageLoader.CallStatic<Int32>("getX");

	InitNativeLib()
}

```
[Swift] UInt64型の整数を[UInt8]に変換する

ググると二つの方法が出てきます。

```swift
extension UInt64{
    var uint8Array:[UInt8]{
        var x = self.bigEndian
        let data = Data(bytes: &x, count: MemoryLayout<UInt64>.size)
        return data.map{$0}
    }
    
    var uint8Array2:[UInt8]{
        var bigEndian:UInt64 = self.bigEndian
        let count = MemoryLayout<UInt64>.size
        let bytePtr = withUnsafePointer(to: &bigEndian) {
            $0.withMemoryRebound(to: UInt8.self, capacity: count) {
                UnsafeBufferPointer(start: $0, count: count)
            }
        }
        return Array(bytePtr)
    }
}
```
どっちでも同じ結果が得られます。折角なので速度も比較してみました。


```swift
func testPerformanceUInt64ToUInt8() throws{
    let data = (0..<1000000).map{_ in UInt64.random(in: 0..<UInt64.max)}
    self.measure {
        let uint8s = data.map{$0.uint8Array}
        print(uint8s.count)
    }
}

func testPerformanceUInt64ToUInt8_2() throws{
    let data = (0..<1000000).map{_ in UInt64.random(in: 0..<UInt64.max)}
    self.measure {
        let uint8s = data.map{$0.uint8Array2}
        print(uint8s.count)
    }
}
```

```
Test Case '[testPerformanceUInt64ToUInt8]' 
measured [Time, seconds] 
average: 0.176, 
relative standard deviation: 9.656%, 
values: [0.227525, 0.172769, 0.170525, 0.170571, 0.170574, 0.170578, 0.170615, 0.170248, 0.170302, 0.170817]

Test Case '[testPerformanceUInt64ToUInt8_2]' 
measured [Time, seconds] 
average: 0.101, 
relative standard deviation: 8.491%, 
values: [0.126460, 0.098508, 0.098236, 0.097850, 0.097855, 0.097873, 0.097932, 0.097878, 0.097662, 0.097690]
```
二つ目の方が速度は速そうです。一つ目の書き方の方が分かりやすいと感じますが、パフォーマンスが必要な場面では二つ目を使った方がいいでしょう。
## 参考
 - https://stackoverflow.com/questions/29970204/split-uint32-into-uint8-in-swift
PHP date UNIXタイムスタンプ

# date
構文
date(フォーマット, UNIXタイムスタンプ)
[例]
date('Y-m-d', time()); &emsp; 2020-09-28
Yは、年を４桁で表します。
mは、月を２桁で表します。
dは、日を２桁で表します。

[例２]
date('H:i:s',time(); &emsp; 21:51:30 
Hは、時を２桁で表します。
iは、分を２桁で表します。
sは、秒を２桁で表します。

[例３]
date('l', time()); &emsp;  Monday
lは、曜日をを表します。

[例４]
date('W', time()); &emsp; 20
一年に内の何週目かを表します。

[例５]
echo date('Y-m-d l') . PHP_EOL;
現在日時を表示したい場合は、time()を省略する事が可能です。

その他も沢山あるみたいなので、必要な時に調べて使いましょう。
Shopify初心者が読むべきオススメ記事３選

#はじめに
今回はShopifyでストアを開設しようと考えた人が読むべきオススメ記事を３つに絞って解説します。

それでは見ていきましょう。

#①【初心者向け】Shopifyについて解説 ~初めてのECサイトにおすすめ！~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/752045/b90dd9ed-e027-69bf-0305-37475b63d2cf.png)

[【初心者向け】Shopifyについて解説 ~初めてのECサイトにおすすめ！~](https://unreact.jp/blog/shopify-beginne)

ShopifyでECサイトの勉強を初めようと思った人が最初に読むべき記事はこちらです。

Shopifyとはそもそも何なのかというところから、Shopifyのメリットやデメリット、料金なども網羅的にまとまっています。

少々長いですが、こちらの記事を読めばShopifyの何が優れていて何が劣っているのかという点がよく分かります。

#②初めての方のShopifyの使い方マニュアル！立ち上げから販売まで丁寧に解説
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/752045/dee36075-5fef-3b4f-da63-799a24650ee1.png)
[初めての方のShopifyの使い方マニュアル！立ち上げから販売まで丁寧に解説](https://web-kanji.com/posts/Shopify-manual)

こちらはどちらかというと実際のShopifyの立ち上げの部分が重点的に説明された記事です。

実際に手を動かしてShopifyのストアを構築するという方にオススメの記事です。

# Shopify(ショッピファイ)はWEB初心者でも初期構築・運営ができるのか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/752045/3dcebeae-c2d6-25d8-8b0d-f38073d3c750.png)
[Shopify(ショッピファイ)はWEB初心者でも初期構築・運営ができるのか？](https://ec.frontier-trade.jp/basic/shopify-basic/beginner-start/)

こちらは、Shopifyで自社ECサイトを構築したい人が「自社で対応するのか外部パートナーに委託するのか」という判断をする際にオススメの記事です。

これからゴリゴリShopifyを勉強して稼げるようになろうという方には向かない記事かもしれません。どちらかというと、自社ECを立ち上げる会社がどのようなことを判断材料にするべきかを学ぶための記事と言えるでしょう。

#終わりに
今回はShopify初心者がShopifyについて勉強するためにオススメの記事を３つ紹介しました。

少しでもShopifyの勉強の役に立てれば幸いです。
画面でエフェクトの実現の(三)　--日付ダイアログ

一般的に、画面なかに日付の入力ボックスがあり、日付ダイアログを使って、いい効果が表現できます。
日付ダイアログの効果は以下のサイトを参照してください。
https://xdsoft.net/jqplugins/datetimepicker/
##実装要点##
・datetimeのプラグインを含める
・日付入力ボックスにスタイルを設定する
・datetimeのメソッドを付く
##コードサンプル##
```
// datetimeのプラグインを含める
<link rel="stylesheet" type="text/css" href="/jquery.datetimepicker.css"/ >
<script src="/jquery.js"></script>
<script src="/jquery.datetimepicker.js"></script>
```
```
// 日付入力ボックスにスタイルを設定する
<input id="date" class="icon-calendar" />
```
```
// datetimeのメソッドを付く
$("#date").datetimepicker({
timepicker:false,
format:'d.m.Y',
xxx:xxx,
xxx:xxx,
...
})
```
画面でエフェクトの実現の(二)　--関連項目の自動入力

前の入力ボックスを入力すると、後の入力ボックスが自動入力された。例えば、楽天ショッピング上で、住所を入力するとき、郵便番号を入力すると、後ろの住所が自動的に入力された。
##実装要点##
これはAjaxの典型的な使用だと思います。
・ボタンの上でonblurのイベント処理プログラムを設置
・入力する項目の項目名を渡す
・サーバ側から値をもらう
・戻り値を後ろの項目に設置
##コードサンプル##
```
//ボタンの上でonblurのイベント処理プログラムを設置
<input id="postNo" onblur="blurA(postNo,xxx);" />
```
```
// 入力する項目の項目名を渡す
function blurA(inputString){
//パラメータリストにより、画面の入力した項目の内容を取得
$.each(keyList,function(index, key){
// 入力値を取得
value = $("#" + key).val();
inputKey=$("[name='"+name+"'");
inputKey.val(value);
})
}
```
```
//サーバ側から値をもらう
$.ajax( contextPath + "url",
data:$("#" +formname).serialize(),
).done(function(json)){
  if(json[formname] != null){
　  // 戻り値を後ろの項目に設置
    each { 
      $("#"+name).val(json[formname][value]); 
    }
  }
}
```
Excelize 2.3.1 がリリース–スプレッドシート（Excel）ファイル用の Go ライブラリ、パスワードで保護されたスプレッドシートの読み取りをサポート


<p align="center"><img src="https://xuri.me/excelize/images/excelize.svg" width="440" alt="github.com/360EntSecGroup-Skylar/excelize" /></p>

[Excelize](https://github.com/xuri/excelize) は、ECMA-376 Office OpenXML 標準に基づいて Office Excel ドキュメントを操作するための Go 言語で書かれたクラスライブラリです。 XLSX ファイルの読み書きに使用できます。Excelize は、他のオープンソースライブラリと比較して、イメージ（テーブル）付きのドキュメントの作成、Excel へのイメージの挿入、および保存後のチャートスタイルの保存をサポートしており、さまざまなレポートシステムに適用できます。

場合によっては、既存の Excel ドキュメントコンテンツの読み込み、新しい Excel ドキュメントの作成、既存のドキュメント（テンプレート）に基づく新しい Excel ドキュメントの生成、Excel ドキュメントへのイメージの挿入、チャートなどの Excel ドキュメントをプログラムで操作する必要があります。 テーブルなどの要素。プラットフォーム間でこれらの操作を実装する必要がある場合があります。Excelize はこれらのニーズを容易に満たすことができます。

#### オープンソース

**GitHub:** [github.com/xuri/excelize](https://github.com/xuri/excelize)

**Doc:** [xuri.me/excelize/ja](https://xuri.me/excelize/ja/)

### リリースノート

このリリースで最も注目すべき変更は次のとおりです。

#### 注目すべき機能

* ECMA-376 ドキュメント標準暗号化によるパスワード保護付きのオープンスプレッドシートをサポートし、問題 ＃199 を関連付けます
* ワークシートのチェックと制限を追加します
* ピボットテーブル機能の拡張：ピボットテーブルのヘッダー、スタイル、およびテーブルオプションの設定をサポート
* セキュリティの脆弱性とパッチ

#### 互換性を向上させる

* Go 1.15 と互換性があり、Windows でユニットテストが失敗し、潜在的な競合状態が発生します。問題＃689を関連付けてください。
* Apache Open Office および Kingsoft WPS&trade; とのデフォルトの行の高さの互換性
* ふりがなのヒントとシートのタブの色の互換性を改善

#### バグの修正

* 範囲外の `RemoveRow` スライスの境界を修正すると、場合によってはパニックが発生します。＃686を解決してください。
* ストリームライターが生成した破損したファイルの問題を修正する
* 画像の追加が機能しないようにスケールを修正し、＃691を解決します

#### 雑多

* エラー処理の改善と無効なスプレッドシートファイルを開いたときのクラッシュの修正 
* 多言語対応のドキュメント Web サイト：英語、フランス語、ロシア語、中国語、日本語、韓国語。更新されました。
* [Slack](https://join.slack.com/t/xuri/shared_invite/zt-eriqdkeo-wV04zcCdBiiZveFgY86Wzw) チャンネルに参加して、コミュニティの他のメンバーに会いにようこそ
【初心者でもわかる】簡単！ラベルデザインの作り方

# どうも7noteです。画像に「SALE」とか「カテゴリー」などのラベルを付ける方法を解説。

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

https://naruweb.com/coding/label/
AWS Certified Database – Specialty試験に合格しました

本日(2020/9/28)試験を受けてきました。
スコアは847点でした。
試験を受ける上でまだまだ情報が少ないので、これから試験を受ける方の参考になればと思います。（ただし英語で試験を受けてます）

母国語でないので、ESL +30 MINUTESの特別措置を使用して、試験時間が３０分延長され、合計２１０分の試験となります。

# 試験の感想

全体的な印象としては、予想していたよりは短文でシンプルな問題が多かったように思います。（前回受けたDevOpsの試験と比べてですが）
試験時間ギリギリになることを覚悟してましたが、７０分近く余りました。
他のかたのブログでかかれているように、

- RDS
- Aurora
- DynamoDB
- DMS/SCT

あたりで７、８割は占めていたかと思います。

参考
https://devopspages.io/aws-certified-database-specialty-exam-guide/
https://awsmaniac.com/the-unofficial-guide-to-aws-certified-database-specialty-exam/
https://medium.com/@john19880601/aws-certified-database-specialty-dbs-c01-exam-guide-in-2020-8b7ae0aefb2f

# 勉強したこと

## AWSサービス別資料(AWS Black Belt)
https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/

RDS, Aurora, DynamoDBは何度も読み直しました
時間があったらYouTubeもみました。PDFを見てるだけより頭に入ってくる感じがします。
日本語で勉強できるすばらしい教材があるのでそれらを使わない手はありません。
ある程度わかってきたなってなったら、

## 公式のサンプル問題
https://d1.awsstatic.com/training-and-certification/docs-database-specialty/AWS-Certified-Database-Specialty_Sample-Questions.pdf

結構シンプルで簡単だったように思います。

## Exam Readiness: AWS Certified Database - Specialty
https://www.aws.training/Details/eLearning?id=47245

一通り全部目をとおして、
章末のquestionとPractice Quizをやります。
このPractice Quizが難しく、本番試験よりも難しかった印象です。
答えを見ても未だに理解できてない問題もあります。。。

## Udemy
Ultimate AWS Certified Database Specialty - 2020
https://www.udemy.com/course/aws-certified-database-specialty-dbs/?couponCode=SEP_20_GET_STARTED
Practice Exam | AWS Certified Database Specialty(65 x 1)
https://www.udemy.com/course/practice-exams-aws-certified-database-specialty/?couponCode=SEP_20_GET_STARTED

今回の試験勉強のメイン教材でした。
付属のPDFがかなり試験範囲を網羅していると思います。
動画を全部みるとなるとかなり時間がかかるので（PDFを読んでるだけっぽい）
hands-onと小テストだけやりました。
PDFは１回全部読んだあとは、他の問題集でまちがえたところの内容の確認に使いました。
RDS, Aurora, DynamoDB, DMS, Cloudformation, KMSのところを何度も繰り返し読みました。
Practice Examも内容の確認に使えたので良かったです。
※Udemyでコースを購入するタイミングには気をつけてください。セールを待って購入するようにしましょう。

## Tutorials Dojo
AWS Certified Database – Specialty Practice Exams 2020(65 x 2)
https://portal.tutorialsdojo.com/courses/aws-certified-database-specialty-practice-exams/

個人的にいきなり最初から６５問の模試で勉強するのは途中でめげてしまいそうになるので、
こちらの教材で、セクションごとの問題（１５問くらい）や３０問のランダムの問題集をやりました。
ただ、サイトがちょっと使いにくい（操作ミスで問題が途中で無効になったのが２回ありました。あと、解説が見にくいのが難点）
勉強し始めたころに効果的

## Whizlabs
AWS Certified Database - Specialty(65 x 2)
https://www.whizlabs.com/aws-certified-database-specialty/

定番のWhizlabsですが、問題や解説の見やすさ、使い勝手はいいのですが、間違いが結構あります。
でも、設問ごとに間違えを指摘している人がいて、それらをみると、自分と同じこと言ってるなと確認ができるので、そこまで致命的ではなかったです。
自分はもう少し問題を解きたかったので利用しました。結果的に弱点が把握できて良かったと思います。

## 模試
試験を受ける１週間前に受けましたが、非常に難しかったです。
７５％でギリギリでした。
長文が多く、明確に答えが出せない問題が結構ありました。
あとで本試験と比べてみても、やはり難しかった印象があります。

上にあげた、Udemy、Tutorials Dojo, Whizlabsの３つで合計、65x5(=325問)くらいの問題を一通りやって、PDFで復習してという感じで勉強しました。

# 終わりに

ここ数ヶ月は実際の仕事でもRDSばかり触っていました。RDSのテーブルが突然壊れて、復旧できず、データは全部で150GBほどあるなか、できるだけダウンタイムを最小にしたかったので、一旦、MySQL on EC2にレプリケーションしてレプリケーションフィルタで破損テーブルを除外して、再度、新RDSにレプリケーションするという２段のレプリケーションをしました。
これが正解だったのかは今もよくわかりませんが、こういうのは実際に経験してみないとわからないことも多いと思います。
試験勉強ではいろいろなデータマイグレーションのパターンを勉強しましたが、頭の中で考えるのと実際にやってみるのとではやはり全然違うものだと思います。

合格はあくまで通過点
わからないこともまだまだあるし、ここで学んだ知識を実際にこれから生かしていければと思います。
【rails】スクレイピングの実装方法

スクレイピングの実装の方法を学習しましたので、学習のアウトプットとして書かせていただきます。



この記事を読むと、スクレイピングとは何か？
その実装方法はどうすればいいのか？を理解できます。



スクレイピングとは？
ウェブサイトから情報を習得し、加工して新たな情報を生成すること。
例えば、様々な飲食店のサイトを巡回し、価格表を作成するなど。

より詳しい内容を知りたい！と思われた方は、Googleで検索してみてください。

では早速スクレイピングの実装方法を書いていきます。

#スクレイピングの実装方法
１　gemfile　「mechanize」をインストールする

```
gem 'mechanize'
```

その後にターミナルでbundle installを打ち込む



２　Mechanizeクラスのインスタンスを生成

```
agent = Mechanize.new # Mechanizeクラスのインスタンスを生成し、変数agentに代入
```



3 ウェブサイトのHTML情報を取得
Mechanizeクラスのインスタンスメソッド「get」を利用し、スクレイピングしたいWEBサイトのHTMLを取得する

```例
page = agent.get("https://www.google.com/?hl=ja")
```


4 searchメソッドを使い、HTML要素を検索する
searchメソッドは、getメソッドで取得したページの情報が入ったオブジェクトに対して使います。これによって取得したウェブサイトのHTML情報の中から指定したHTML要素の内容を検索できる。
該当するHTMLのタグ要素が1つでも、返り値は配列の形式で返ってくる。

```例
 agent = Mechanize.new
  page = agent.get("https://www.google.com/?hl=ja")
  elements = page.search('h1')
```

↑https://www.google.com/?hl=jaの中にある、h1要素の情報を取得している。


５ inner_textメソッド
searchメソッドで得られたHTML情報のテキストを取得したい場合、inner_textメソッドを使う

```
agent = Mechanize.new
page = agent.get("スクレイピングしたいウェブサイトのURL")
elements = page.search('h2 a') # h2要素の下のa要素を検索

elements.each do |ele|
  puts ele.inner_text
end
```



6 get_attributeメソッド
HTMLの属性の値を取得したい場合、get_attributeメソッドを使う。
例えば、aタグ要素のHTMLはリンク先のURLを値とする属性「href」を持っている。
get_attribute(属性）を書くことで引数で指定した属性の値を取得できる。

```
agent = Mechanize.new
page = agent.get("スクレイピングしたいウェブサイトのURL")
elements = page.search('h2 a') # h2要素の下のa要素を検索

elements.each do |ele|
  puts ele.get_attribute('href') # puts ele[:href]としても良い
end
```


#スクレイピングのまとめ
● Mechanizeクラスのインスタンスを生成する
●　Mechanizeクラスのインスタンスメソッド.get（情報を取得したいウェブサイトのURL）でウェブサイトのHTML情報を取得
●　欲しいデータのあるタグ要素をsearchメソッドで指定して習得
●　取得したタグ要素のHTML情報に対してinner_textやget_attributeメソッドを使って欲しい情報を習得する
SlackのIncoming WebhooksでWebhook URLを取得する方法


__スプレッドシートなどからデータを読み取り、Slackに通知させるようにしたい！__
その前提として、SlackのWebhook URLを取得する方法をまとめます！

#incoming Webhooksを追加する

__https://（Slackドメイン名）.slack.com/apps__　にアクセスすると、以下のページが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670338/40883532-c7e6-ecf0-9919-437cabd6c088.png)

検索ボックスで__「Incoming Webhooks」__と検索
[![Image from Gyazo](https://i.gyazo.com/79dcedc39e2a70c5f94b6a90301381d2.png)](https://gyazo.com/79dcedc39e2a70c5f94b6a90301381d2)

__Slackに追加__ボタンを押します！
[![Image from Gyazo](https://i.gyazo.com/07daea2ccceedb450ce40457dd965527.png)](https://gyazo.com/07daea2ccceedb450ce40457dd965527)

#通知を送りたいチャンネルを設定する
チャンネルへの投稿というところで、チャンネルを選択、あるいは新しいチャンネルを作成し、
通知を送りたいチャンネルを設定する！
[![Image from Gyazo](https://i.gyazo.com/8b27afff49a6b0829b4a2e1b4723ead9.png)](https://gyazo.com/8b27afff49a6b0829b4a2e1b4723ead9)

__「Incoming Webhookインテグレーションの追加」__ボタンを押すと、
あっという間にWebhook URLが発行されます～！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670338/a4b12a45-668a-f4b7-4e5d-b7081d760eb3.png)


あとは、このURLをGASやIFTTTなどを使って連携すればOKです。
コードを読み解いて学ぶFortran

既存のFortranコードを読み解いて、理解を深めていく。(追記中)

# 変数宣言の上にある`use`

```fortran:main1.f90
Program Main
  Use parameters
  Implicit none
  Real(8) :: a, b, c

  ...
  array(1) = a
  array(2) = b
  array(3) = c


End Program Main 
```
のように、変数宣言の前にある`use`文。これはmoduleという別に書いたコードで作った変数群、subroutine群、関数群をMainプログラムに呼び込むための文。例えば以下のようなモジュールを記載したコードを作っておいて、分割コンパイルすることが多い。(同じファイルの中にあっても、もちろん問題はない。)

```fortran:parameters.f90
Module parameters
  Implicit none
  Real(8), parameter :: Ha = 27.21 !eV
  Real(8) :: array(1:3)

End Module parameter 
```

他のコードから呼ぶとき`use parameters`と書くと、parametersモジュールで宣言したすべての変数/subroutine/関数が呼び込まれる。
ちなみに、変数宣言の個所で`parameter`を付けると、定数となりその変数は書き換え不可能になる。数学定数や物理定数などをまとめておくのにも、モジュールはよく使われる。

有用な解説: [9. モジュールと構造型 &#8212; Fortran演習(地球惑星物理学演習)](https://amanotk.github.io/fortran-resume-public/chap09.html)

## `use module, only:`で読み込んだモジュールから必要な変数のみを読み込む

```fortran:main2.f90
Program Main
  Use parameters, only: array
  Implicit none
  Real(8) :: a, b, c

  ...
  array(1) = a
  array(2) = b
  array(3) = c


End Program Main 
```
のように、`only`をつけることで、モジュールから、特定の変数、関数、サブルーチンのみを呼び出すことができる。
コードが巨大になり、複数人数が開発に携わるようになると、どのコードでどの変数、関数、サブルーチンが呼ばれているのかを把握することが困難になる。特に変数は、想定外の個所で値を変更してしまうと、思いもよらないところでトラブルを起こす。こういった問題を避けやすくするために、`only`をつけて読み込む変数を限定することができる。さらに、これはコードから様々な変数、機能がどこで使われているのかを把握しやすくすることができる。

## `use module, only: a => b`で読み込んだ変数の名前をコード内でのみ変更する

```fortran:main3.f90
Program Main
  Use parameters, only: array => vector
  Implicit none
  Real(8) :: a, b, c

  ...
  vector(1) = a
  vector(2) = b
  vector(3) = c


End Program Main 
```
のように、`=>`を使うことで、元のモジュールで使われていた変数、関数、サブルーチンの名前を、該当コード内では異なる名前として使うことができる。
ローカルな変数は、たとえ同じ名前が他の関数、サブルーチンで使われている変数と同じであっても、それらが混ざることはない。つまりローカルな変数はお互いに干渉せず、値の変更はお互いに反映されないし、そもそも型や配列の形、そもそも変数と関数という異なる対象のものであっても、問題はない。一方で、モジュールを読み込んだ場合は、デフォルトではモジュールで宣言されている変数の名前を使う必要がある。これが様々な理由で都合が悪い場合は、`=>`を使うことで、その関数、サブルーチンの中では異なる名前として参照することができる。例えば物理定数モジュールに光速度としてcがあり、対象のコードではa,bに引き続く変数としてcを用いたい場合`Use phys_constants, only c => light_speed`のように異なる変数名に変えることで、対象コード内のローカル変数としてcを使うことができる。

# 変数宣言の個所にある`allocatable`
Fortranでは配列を宣言する方法が大きく分けて二通りある。一つは変数を宣言する際に形とサイズを指定するもの、もう一つは変数宣言時には形だけを指定して、具体的なサイズは実行時に指定する方法である。具体的なコードを以下に示す。

## 形とサイズを変数宣言時に指定する配列

```fortran:main4.f90
Program Main
  Implicit none
  Real(8) :: array1(1:3), array2(1:2, 2:4)

End Program Main 
```
上のコードで`array1(1), array1(2), array1(3)`, `array2(1, 2), array2(2, 2), array2(1, 3), array2(2, 3), array2(1, 4), array2(2, 4)`を要素とする配列が定義できる。

## 形を変数宣言時に指定してサイズは実行時に決める配列

```fortran:main5.f90
Program Main
  Implicit none
  Real(8), allocatable :: array3(:), array4(:,:)

  Allocate(array3(1:3))
  Allocate(array4(1:2, 2:4))

End Program Main 
```
上のコードで`array3(1), array3(2), array3(3)`, `array4(1, 2), array4(2, 2), array4(1, 3), array4(2, 3), array4(1, 4), array4(2, 4)`を要素とする配列が定義できる。
このように、実行途中で配列のサイズを指定するのは、コンパイル時点でサイズのわからない配列についての計算コードを書くためである。例えば、`allocate`文よりも前のどこかで、配列の大きさを指定するパラメーターを読み込み、それに応じて配列を確保する際に、使われる。

# Module, subroutineの中にある`contains`
(書きかけ)
微分フィルタをかけてみた

微分フィルタをかけてみた

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

filename = '/content/lenna.png'
img = cv2.imread(filename)
kernel = np.array([[0,0,0],
                   [-255,0,255],
                   [0,0,0]])
img = cv2.filter2D(img, -1, kernel)
#img = cv2.GaussianBlur(img, (15, 15), 3)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
#plt.colorbar()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396969/b6be93bd-91a6-0be2-6a29-6d684b326a90.png)



参考
https://techacademy.jp/magazine/24017
[rails6.0.0]ウィザード形式でActiveStorageを使用して画像を保存する方法

## 概要
ユーザー登録とプロフィールをさせる時に、ウィザード形式でフォームを作成。
プロフィールに画像を保存したかったが上手くいかなかったため備忘録として記載。
※検索しても同じ状況の方がいなかったので役に立てばと思います。

ウィザード形式とは何か？という方は[こちらを参考にしてください](https://qiita.com/ATORA1992/items/40fc543742a6df5a17c1)

## 内容
##### 開発環境
MacOS Catalina 10.15.6
Rails 6.0.0
Ruby 2.6.5

#### テーブル構成

deviseを使ってユーザー登録をさせようとしています。
userテーブルはnicknameのみ追加。
profileテーブルにはtwitterのリンクなど記載。
profileテーブルにactive_strageで画像を保存したい。

### ウィザード形式を実装
ここらへんの機能の実装に関しては
[こちらの記事](https://qiita.com/Tatsu88/items/7447a669b788b011e96b)がかなり近いので参考にしました。

#### 問題点
ウィザード形式で、画像以外はしっかり保存できたけど、画像は保存されない。


```ruby:registrations_controller
class Users::RegistrationsController < Devise::RegistrationsController

  def create
    @user = User.new(sign_up_params)
    unless @user.valid?
      render :new and return
    end
    session["devise.regist_data"] = {user: @user.attributes}
    session["devise.regist_data"][:user]["password"] = params[:user][:password]
    @profile = @user.build_profile
    render :new_profile
  end

  def create_profile
    @user = User.new(session["devise.regist_data"]["user"])
    @profile = Profile.new(profile_params)
    unless @profile.valid?
      render :new_profile
    end
    @user.build_profile(@profile.attributes)
    @user.save
    session["devise.regist_data"]["user"].clear
    sign_in(:user, @user)
    redirect_to root_path
  end

  private

  def profile_params
    params.require(:profile).permit(:avatar, :favorite_beer, :twitter_link, :info)
  end

```
この中の以下の記述が悪さをしていた様子。

```ruby:registrations_controller
@user.build_profile(@profile.attributes)
@user.save
```
ここでは、@userと@profileをbuildで関連付けさせて@user.saveでまとめて保存をしているのですが、ここでの保存が原因で上手く行ってない様子。
[この記事](https://note.com/marikooota/n/nc4ad1aa0ee19)を見つけて
>原因
>ActiveStorageに実際にファイルが保存されるタイミングはmodelをsaveして処理がコミットされた時なので、保存される前のmodelから画像をattachしてもファイルが未完成の状態になるっぽいです。

どうもActiveStrageはモデルをちゃんとsaveしないと行けなさそうなので以下のように記述を変更したら解決しました。

```ruby:registrations_controller
# それぞれのモデルで保存させた    
# @user.build_profile(@profile.attributes)
@user.save
@profile.user_id = @user.id
@profile.save
```

### まとめ
正直buildを使っての保存の仕組みがよくわかってなかったのに使用してしまったのがエラーの原因かもしれないです。
少しでも参考になれば幸いです。
Qiita Job 求人を分析してみた件

## 目次

- 背景
- データ取得
- データを見てみた
- 所感と今後の予定

## 背景

転職活動をしている中、「転職お祝い金30万円プレゼントキャンペーン」という言葉に引っかかり、Qiita Jobsに登録しましたが、いざ使ってみたら、機能が少し足りないと思いました。

勤務地の絞り込みできなかったり、ページ数を分からなかったりなどがありました。

幸いのことで、求人の一覧のところで必要が情報が大体揃えているし、全ページ数が20ほどしかないし（手作業で取得）、Pythonで取得することにしました。


## データの取得

大体の流れはこうです。

- Pythonで求人一覧のURLで内容をHTMLとして取得します
- 取得したHTMLで、beautiful soupを作り、タグなどを解析して必要な部分を切り取ります。
- 切り取った部分をJSONにして、Firebase cloud firestore に格納。
- 一方で、引継ぎの解析のためにローカルでcsvファイルとして保存。



合わせて294件の求人を取得しました。（これはおそらく全部？）



## データを見てみた

利用したツールは、Pandas、Tableauです。

1点だけ先に言いたいのは、これからの内容はあくまでもQiita jobsの求人内容に基づき作成したものなので、IT業界全体の求人の反映は到底至りませんが、**ご参考まで**。



まず一番気になったのは、勤務地別の求人数です。

![work_place_num2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457921/b03fedd5-2a0a-e9bd-6a08-ebb51a121217.jpeg)


なるほど、東京都の求人数が圧勝したね。それで勤務地の絞り込みが必要ないわけかな？けど、U・Iターンやの地方求職する者たちには少し不便のような感じはあります。


次に、職種別の求人を見てみましょう。
![職種別求人数.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457921/7a023764-ee92-1a78-51ba-4e1ddb45ebfe.jpeg)

TOP5には、Webアプリケーション、その他エンジニア、バックエンド、フロントエンド、インフラエンジニアでありました。Web系の仕事量がスマホ開発の仕事より人の需要が多く感じられます。

また、その他エンジニアとは何を求められているのかを見るために、その他エンジニア向けの求人にあるタッグと求人数の近いバックエンドエンジニアとフロントエンドエンジニアと比べてみました。

![other engineer.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457921/188a0dda-ee49-f7a4-8620-587b653cd348.jpeg)

その結果、その他エンジニアにとって、JAVA、C++、C#、ゲーム、アニメーションなど技術タグ量が多いで、おそらく組み込み系、ゲーム開発などでしょうね。


ついでに、全求人の利用技術をまとめたところ、以下のようなヒットマップが得られます。

![tagCount_heatMap.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457921/ba1f4495-bb77-b4b6-c9fa-58bd07bc620b.jpeg)


最後に、職種別の年収平均を確認していきますが、ここで注意したいのは、「年収平均」というのは単に年収上限と年収下限を平均で取ったものとします。

![職種別年収平均.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457921/de2295cd-1ff3-610e-ff87-c59d8f1802b8.jpeg)


こちらの図で見ると、Webアプリケーションエンジニアの給料の範囲が大きいのが分かります。

また、フロントエンドとバックエンドと比べるとバックエンドエンジニアの方が年収平均が高いことが分かります。



## 所感と今後の予定

今回は初めてTableauを使用したことで、まだまだ可視化の図の作成に慣れないところが多いかもしれませんが、また機会がありましたら使いたいと思います。

Qiita Jobsから取得したデータでできることはまだまだあると確信しています。今日のところはデータの中身を探っただけだが、将来は

1. AWS サービスを使用し、指定した職種に新しい求人が来ているかを見てくれるものを作ってみたいです。
2. 今回は一覧で得られる情報しか使っていませんが、それぞれお求人詳細には必須スキルや、労働条件など、更なる情報がたくさんあるので、機械学習にも使えると思います。



また、今回の図面は以下のURLにて確認できます。
[Tableau Public](https://public.tableau.com/views/Qiitajobscollection2/sheet0?:language=en&:display_count=y&publish=yes&:toolbar=n&:origin=viz_share_link)


最後までご覧いただきありがとうございました。
ラズパイはじめました！

ラズパイはじめました！


以下の構成です。
【本体】[ラズベリーパイ 4 コンピューターモデルB 2GB](https://www.amazon.co.jp/gp/product/B083R5SLH7/)
※別にケチったわけではないのですが、2GBでどの程度動くのかを見ておこうと思いまずはこれにしました。
【ケース】[Miuzei 最新Raspberry Pi 4 ケース](https://www.amazon.co.jp/gp/product/B07VB24K9W/)
【SDカード】[サンディスク microSD 32GB](https://www.amazon.co.jp/gp/product/B07YLT539N/)
【HDMIケーブル】[UGREEN Micro HDMI ケーブル](https://www.amazon.co.jp/gp/product/B07P811MPV/)
【カメラ】[Module V2 カメラモジュール ソニーIMX219PQ CMOS画像センサ 8メガ](https://www.amazon.co.jp/gp/product/B07W6NK7TW/)
【キーボード】[サンワサプライ コンパクトキーボード](https://www.amazon.co.jp/gp/product/B016U0VM5A/)
【モニター】元々持っていた余っているやつ使います。
【電源】Android携帯用のC-Type充電ケーブルが使えました。
【スピーカー】とりあえず、カメラを動作させたかったので、無しで。

モニターとスピーカーは、後で持ち運べるやつ買おうと思います。


#OSのインストール。
「Raspberry Pi Imager」で実施。
以下を参考にしました。
> 「楽にRaspberry Pi OSを作成する!Raspberry Pi Imager」
> https://pcmanabu.com/create-media-raspberry-pi-4/

多少時間が掛かりましたが、割と簡単にできました。

![29BFFF4C-459F-4D5E-83D1-24D9C88185A7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448092/62d15033-be4b-ac5e-fe37-024344d0c3fa.jpeg)

#カメラモジュールの設置

以下が参考になります。
> Raspberry Piとカメラモジュールを接続する
> https://www.pc-koubou.jp/magazine/17276

接続部分の持ち上げは手だと難しかったので、ピンセットを使って持ち上げました。
![ADBB4A5E-6097-4549-9617-9E3DE4A8E1C6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448092/93b45e6a-fa5d-93a2-fbcb-fc3701dc745e.jpeg)

カメラモジュールを押し込んで設置し、接続部をピンセットで押し込みます。![FFAD7245-99F3-4090-AC8A-682727E172C3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448092/640f1b77-71a0-7bf7-7135-9f2546a04dd0.jpeg)

これで設置完了。
![97688480-D272-4C58-A1F9-373954AC102C.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448092/e3f016ed-28ae-b858-c1eb-2a952deeec8b.jpeg)

上の参考ページに載ってたコマンドを発行してみると、

```
sudo raspistill -o image.jpg
```

写真が撮れましたーｗなんかカンドーｗｗ
![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448092/1c2b1103-7e17-973a-6a0c-fd1c282c339e.jpeg)



#3．まとめ

ここまで順調、さって、ここから何か作ってみます！
まずは顔認識からかな！
【PHP】【エラー】Notice: Array to string conversion in～

PHPについて学習内容を備忘録としてまとめます。
実装中に起きたエラーについて解決法まで記載します。

下記のようなマイページでユーザーの投稿数を表示させる際にエラーが発生しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/119f244e-d121-2516-1aca-87535e87ee5f.png)
#起きた問題
ユーザーの投稿数を取得し表示したら下記のようなエラーが発生しました。

```
Notice: Array to string conversion in C:\xampp3\htdocs\user\user_mypage.php on line 22
Array
```
投稿数を表示させる箇所に`Array`と表示されおり、投稿数は表示されていませんでした。
該当のコードはこちらになります。

```php
<?php
print'<p>投稿数：'.get_user_count('post',$current_user['id']).'</p>';
?>
```
`get_user_count`は引数の値によって投稿数を取得しています。

#原因
`Array to string conversion`とは`配列が文字列に変換`されてしまうというエラーメッセージです。
なので今回の場合は`get_user_count`で取得した配列が文字列に変換されているためにエラーが発生したと思われます。

#解決法
配列の中の要素を返すようにすれば良いので、`current`を使用します。
`current`は配列の現在参照している要素を返します。

```
<?php
$a[] = 1;
$a[] = 2;
$a[] = 3;
print current( $a ); // 結果：1
?>
```
`current`を先ほどのコードに追記してみます。

```php
<?php
print'<p>投稿数：'.current(get_user_count('post',$current_user['id'])).'</p>';
?>
```
正常に動きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/597913/2ef39a5d-4f50-eb38-2a96-23d0198173f4.png)
#参考URL
https://php-beginner.com/function/array/current.html
https://marycore.jp/prog/php/notice-array-to-string-conversion/
[Ruby]sprintfで四桁のランダムな番号生成

##目的
PINコードを生成したかったのでsprintfとrandメソッドを使った。

## コード
```
sprintf('%04d', rand(10000)) //四桁に対して、余ったところを0で埋める 
=>"1184"
```
※ dは数字を意味する。（sならstring)

##その他

```
sprintf('%10d', rand(10000)) //幅10の右づめ
sprintf('%-10d', rand(10000)) //幅10の左づめ
=> "      7179"
sprintf('%04d年 %02d月 %02d日', 1990, 1, 23);
```
【超初歩】AnacondaにGDALをインストールしてみた

#GDALとは？

Metashape（旧Photoscan）で作成したモザイク画像（Geotiff画像）を読み込んで、Pythonで画像処理したいと思ったので、
**GDAL**というラスターとベクターをいじれるライブラリのインストールに挑戦しました。
インストールに苦労して今日一日かかってしまったので、備忘録も兼ねて書き残しておきます。

参考：https://gdal.org/
「GDAL documentation」

#インストールエラーが発生

「GDAL　Python　インストール」などで調べると、anaconda promptで以下のコマンドを打つことでインストールできるようです。

参考：https://anaconda.org/conda-forge/gdal
「conda-forge/packages/gdal」

```
conda install -c conda-forge gdal
```

しかし、このコマンドを実行すると、Solving Environment...で止まってしまうエラーが発生します。

参考：https://teratail.com/questions/262267
「AnacondaでGdalをインストールしたい」

#エラー解決方法

まず、以下のサイトを参考にして**GDALのバージョンが違うのではないか？**と思いました。

参考：https://sites.google.com/view/takagilab/manual/program-%E7%92%B0%E5%A2%83%E3%81%AE%E6%A7%8B%E7%AF%89
「国土情報処理工学研究室　Program 環境の構築」

バージョンの確認は以下のコマンドで可能です。

```
conda search gdal
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571675/9b4ea03f-c5ff-4e2a-2ae7-258d087521b2.png)

バージョン検索の結果、conda install conda-forge gdalだと**ver3.1.2**になってしまう一方で、**ver3.0.2**が最新？適切？になることが分かりました。

バージョンを指定して以下のようにコマンドを実行します。

```
conda install gdal==3.0.2
```
これを実行すると先ほどの**Solving Environmentエラー**は解消された一方で、今度は**Conflictエラー**が生じてしまいました。

参考：https://teratail.com/questions/262267
「AnacondaでGdalをインストールしたい」

このConflictエラーは見た感じ、永遠に続きそうなので一旦インストールは終了して、ライブラリのバージョンをアップデートすることにしました。

```
conda update --all
```
これでconda内の全てのライブラリを最新バージョンにアップデートすることができました。
最後にもう一度バージョン指定したGDALをインストールします。

```
conda install gdal==3.0.2
```
インストール成功！なぜ、ライブラリをアップデートするとGDALもインストールできるのか不明ですが、良しとしましょう。

#動作確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571675/f8e1dcce-bacf-a7bf-cb19-0b7105e76686.png)

しっかりimportされました！根本的な解決にはなっていないかもですが、一件落着ですね～
このライブラリを使って、以下の記事を参考にしながらGeotiffの読み込み+画像処理をしていきます。

https://qiita.com/HidKamiya/items/d5e69fda61703abe1a58
「PythonによるGeoTiff画像の読み込みと書き出し」

参考になったら、**LGTM**してください！
Markdown記法について

今回がQiita初投稿になります。よろしくおねがいします。

####「プログラミング知識をMarkdown記法で書いて共有しよう」

と、Qiitaの投稿画面の一番初めにもデフォルトである通りQiitaにしろREADMEにしろGitHubのプルリクエストにしろプログラミング業界ではMarkdown記法というのがちょいちょい出てくるんですね。
自分も初めの頃は参考のサイトを見て少しやろうと思いましたが、~~案外やり方が多くて面倒になり~~別にまだ覚えなくてもいいかと思っていたのですが最近になり少しずつやり方が分かってきたので備忘録的な意味と自分の練習もかねて投稿しようと思いました。

まず初めにMarkdownについてですが

##Markdownとは
Markdown(マークダウン)は文章を記述するための記法(マークアップ言語)の1つです。
Markdownとは、メールを記述する時のように書きやすくて読みやすいプレーンテキストをある程度見栄えのするHTML文書へ変換出来るフォーマットとしてジョン・グルーバーによって開発されました。
以下の特徴があります。

- 簡単で覚えやすい記述
- 文章の構造を明示出来る
- Markdownそのままでも理解出来る
- 対応アプリを使うことでより快適に読み書き出来る
- 拡張子は「.md」

とのことです。

例として以下にRailsのアプリケーションのREADMEの一例を載せます。

## README
## users テーブル

| Column          | Type   | Options     |
| --------------- | ------ | ----------- |
| user_name       | string | null: false |
| email           | string | null: false |
| password        | string | null: false |

### Association

- has_many :friends
- has_many :comments
 
------


というようにアプリケーションにはREADMEが必須でありその中の記述はMarkdown記法のためMarkdown記法を最低限は覚える必要があるということですね。


では自分がよく使うものを抜粋して紹介します。

- 「＃」を先頭に入れて半角スペース1つ分空けると見出しの意味になり大文字になり強調されます。(h1タグと同じ意味)
「＃」が一番大きくて以下1つずつ増やすごとに大文字がだんだんと小さくなり「＃＃＃＃＃＃」最大6つまで連続で記述出来ます。

- 「-」を先頭に入れて半角スペース1つ分空けると「・」が付与されます。

- 「---」と「-」を3つ以上連続で入れると水平線が出来ます。

と上記が自分がよく使用している記述でした。上記の記述方法は本当にほんの一部なので興味のある人はちゃんとしたサイトから学習頂ければと思います。(笑)
と言ってもQiitaにいる人達はみんなMarkdown記法で記事を投稿しているのだから恐らくQiitaに投稿した人の中で自分が一番Markdown記法を知らない(使いこなしていない)と思いますのでこれから精進して参りたいと思います。ここまでお付き合い頂きありがとうございました。


注：Markdown記法の「#」や「-」などは全て半角で記述しないと正しく反映されません。さらには半角スペースも1つ分空けてください。全角では反映されませんので注意！


# 今回参考にさせて頂いたサイト
[株式会社アーティス　ビジネスとIT活用に役立つブログ](https://www.asobou.co.jp/blog/bussiness/markdown#:~:text=Markdown%EF%BC%88%E3%83%9E%E3%83%BC%E3%82%AF%E3%83%80%E3%82%A6%E3%83%B3%EF%BC%89%E3%81%A8%E3%81%AF,%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E9%96%8B%E7%99%BA%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82)
統計検定2級に最速で合格するお話　　　　　　　PBTとCBTの違い

# 統計検定2級に合格した話
最近,CBT方式の試験で統計検定2級に合格することが出来たのでその体験記を書こうと思いました.
自分の体験が誰か何かの為になれば嬉しいです.:v:
![IMG_8188.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547761/3005e3b5-df69-ce96-492e-0756d64dcbd6.jpeg)

## 受験理由
自分は大学生なのですが,今年の夏休みは世間の風潮もあり外出を控え,あまりに暇なのでYouTubeでヨビノリのたくみさんの動画を見ていたところ統計学を面白そうに話すので何となく勉強してみたくなったからです.
(追記)
最近以下のようなマスメディアのクソグラフがあるのでこのような情報に踊らされたくなかったことも一つの理由でした.
![IMG_8189.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547761/9a0efcd2-6ee5-e8bb-58c9-f7f15ddc559b.jpeg)

## 勉強前の知識
・データの分析がセンター数学IAの範囲だった.
・理系の大学生で大学受験レベルの確率,微分積分は理解出来ている.
・大学の講義で数理統計学の受けていた.(テスト前に何となく詰め込んで内容はほとんど覚えていない)
## 勉強期間
約3週間.理系大学生ならば1ヶ月あれば十分合格できると思います.
0からのスタートでも一生懸命勉強すれば誰でも合格できるとレベルだと個人的には思います.
## 勉強内容
・[予備校のノリで学ぶ大学の「大学の数学・物理」　確率統計(推定・検定入門　全9講)+α(チェビシェフの不等式etc)](https://www.youtube.com/watch?v=Bj8fkq533Dc&list=PLDJfzGjtVLHmx7qMP410-9gx0weC9d90X)
・[統計WEB](https://bellcurve.jp/statistics/course/)
・PBT方式の過去問(直近4回分)
## PBT試験とCBT試験の違い
### 問題の難易度差
問題の詳しい内容は公開してはいけないルールなのでお伝え出来ませんが,PBT方式とは異なり,CBT方式の試験は一問一答形式でした(自動車学校の効果測定のような感じです).
PBT方式と同様比較的難しめの問題が2割ほど出ました.
大きな難易度差は感じませんでしたが問題の毛色が違うと感じる方もいるかも知れません.
### 受験まで
[Odyssey CBTコミュニケーションズ](https://cbt.odyssey-com.co.jp/)で受験会場を探します.
ホームページに案内がない場合は電話かメールで問い合わせをすれば対応してくださると思います.
### 受験環境
受験会場では水性ペンと計算用紙が2枚配布されます.
個人的にはこのペンが習字ペンみたいでストレスが溜まりました(書きにくい上に手に付く).
自分が受験した会場は小さなパソコン教室だったのですが,人の出入りがあり,話し声も聞こえてきたので気になる方は大きめの会場を選択した方が良いかも知れません.
### 受験終了
試験が終わるとすぐに結果を知ることが出来ます.結果が出るまでモヤモヤしなくて良いのは精神的に良かったです.
## 最後に
今回2級を取得することが出来ましたが,準1級にも挑戦したいと思っているので,合格した方勉強方法など教えていただけると幸いです.
#### 参考記事
[統計検定2級チートシート](https://qiita.com/moriokumura/items/ed246efe11fc5d3fc760)
[有意に無意味な話](https://starpentagon.net/analytics/)
FreeBSD 12.0-RELEASEをRaspberry Pi2でリモートインストールする

[普通のインストールについてはこちら](https://qiita.com/nanakochi123456/items/fd33323ed9add1f96734
)

##FreeBSDをRaspbery Pi のためにリモートインストールするメリット
- 余計にディスプレイやキーボードを接続しなくてもいい
- ちょっと重い作業さえすれば後は完全リモート

##リモートインストールに必要なソフト　(Windowsのみ)
[FavBinEdit](https://www.wabiapp.com/FavBinEdit/)

要は巨大ファイルをバイナリエディットできるソフトであればなんでも構いません。

##リモートインストールの方法
- SDカードイメージをダウンロードする
- SDカードイメージを解凍する
- FavBinEdit で解凍したイメージファイルを開く
- 「PermitRootLogin」というキーワードを探し（２回検索必要）
以下のように変更する

<code>#PermitRootLogin no</code>

↓

<code>PermitRootLogin yes</code>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149448/785a69a7-4d24-64f7-54be-44320fab92e5.png)

このような感じに１文字ずつ # を消す形で、16進数を1ずつずらして変更するとよいでしょう。

参考までに yes の16進コードは 79 65 73 です。

- MicroSDに書き込む
- MicroSDをRaspberry Pi に入れる
- LANを接続し、電源を入れる
- DHCPサーバーの払い出しログを見る、もしくは、起動してしばらくしたら arp -a をする

Raspberry財団のMacアドレスは先頭が b8:27:eb あたりだと思いますが、
それ以外もあるため、[MACアドレス検索](https://uic.jp/mac/)で確認し、DHCPから払い出されたIPを確認する

##最後に

ssh root@払い出されたIPアドレス

で、パスワード root でログイン完了♪
【iOS】iOS14でcanOpenURLがfalseになる

## 検証環境

Xcode: 12.0.1
iOS: 14.0
Swift: 5

## 事象

下記のコードでブラウザを外部起動しようとしたら、canOpenURLメソッドがfalseになり、外部起動されなかった。

``` swift
guard let url: URL = URL(string: "https://www.yahoo.co.jp/") else { return }
if UIApplication.shared.canOpenURL(url) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
```

コンソールを見ると下記のようなエラーメッセージが表示された。
httpsのURLスキームは許可されていないとのこと。

```
-canOpenURL: failed for URL: "https://www.yahoo.co.jp/" - error: "This app is not allowed to query for scheme https"
```

## 対処法
エラーメッセージに書いてある通り、httpsは許可されていないので許可してあげれば良い。

[canOpenUrlの公式ドキュメント](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl)を確認すると、info.plistにLSApplicationQueriesSchemesを追加して、そこに許可するスキームを定義してあげれば良さそう。
(下記引用)

>If your app is linked on or after iOS 9.0, you must declare the URL schemes you pass to this method by adding the LSApplicationQueriesSchemes key to your app's Info.plist file. This method always returns false for undeclared schemes, whether or not an appropriate app is installed. To learn more about the key, see LSApplicationQueriesSchemes.

[LSApplicationQueriesSchemesのドキュメント](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/LaunchServicesKeys.html#//apple_ref/doc/plist/info/LSApplicationQueriesSchemes)にもアプリがcanOpenURL:メソッドを使用してテストできるURLスキームを指定すると書いてある。

### 実装
下記のように、LSApplicationQueriesSchemesにhttpsのスキームを定義する。
![スクリーンショット_2020-09-28_17_33_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263659/138d2ef4-b55b-5903-f119-c27ee3163bc4.png)

この状態で実行すると、無事canOpenURLにtrueが返される。
以上。
PHP キー､値で配列をソートしよう


# sort　rsort
## sort
配列の値を小さい順に並び変えてくれます。
## rsort
配列の値を多い順に並び変えてくれます。

※キーがある場合は消されて連番になってしまいます。

そこで！↓
# asort　arsort
asort　arsortはキーを保持したまま、並び替えてくれます。

# ksort　krsort
ksort　krsortはキーの方を並び変えてくれます

# array_column
引数に渡した配列の中から、単一のカラムを取り出すための関数です。
[例]
array_colimn($配列, $カラム)
![スクリーンショット 2020-09-28 18.40.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/1a795f69-0de0-3ab4-8b1f-81206cfd44af.png)
![スクリーンショット 2020-09-28 18.40.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/44307f43-ec25-b6a0-c22e-8f5416297ab1.png)

# array_multisort
[例]
array_multisort($scores, $names)
配列の中をデフォルトで、小さい順にしてくれます。
アルファベットの場合は、a~z順に並び替えてくれます。
【Folio LSP】Folioプロジェクトをざっくり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342082/398067e3-c457-e125-d3bb-7ed462cbf9eb.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342082/75cc04d9-24ff-dfe9-9afb-2fca4aba5b83.png)


from Goldenrod release
CKA 2020 September

今月(2020年9月)にCKA(Certified Kubernetes Administrator)を受けて、無事に受かっていたので、その経験と感想を書いておきたいと思います。

CKAはLinux foundationが中心に提供している認定試験で、主に管理者向けの技能試験で、ハンズオン形式のテストになります。K8sの基本的な構成を理解している、各種設定を行える、トラブルシューティングが出来る、といった能力を測るものだと思います。開発者向けのCKADは受けてません。
https://www.cncf.io/certification/cka/

ちなみにこの9月から少し内容が変更されてるので注意が必要です。
https://training.linuxfoundation.org/cka-program-changes-2020/

**試験の内容**
・制限時間は2時間
・問題数は17問(2、3問くらい毎回増減するらしい)
・言語は基本的に英語だけど、日本語とか中国語とかも選択できる。試験を受けてる途中での切り替えも可能。
・合格ラインは66％
・問題ごとに重みづけがされている。覚えている限りでは4~13%くらいまで幅があったとおもう。
・試験中は、公式ドキュメントしか見られないので、どの情報がどのあたりに載ってるかをよく把握しておく必要がある。（下のリンクと、あとk8sのGithubもいいらしいけど、特に見る必要はなかった。）
https://kubernetes.io/docs/home/
・tmuxが使用可能
・試験中に休憩させてもらえるので、トイレとか行けるっぽいが、当然試験時間は経過する。
・試験前に机の上、周りの四方の壁、机の下までチェックされる。（このチェックに30分くらいかかった）
・開始時間の15分前からログイン可能
・一応試験監督がいるが、向こうの顔は見えず、コミュニケーションは全てチャット。
・手首にスマートウォッチとかつけてるのもダメ
・透明なコップに水なら机の上に置いて、試験中に飲んでてOK
・途中2回くらい、手首を30秒間見せなさい、みたいな時間があった。不正防止のためらしい。
・費用は300USD。ただし準備用のサイトとかで割引コードがもらえることが多い。
・試験を受けるときは数日前に予約をしておかないといけない。僕のときは1ヶ月くらい先まで予約出来なかったので、少し早めに受験可能日を確認しておくとよいかも。
・試験結果は36時間以内にメールで届く。僕はきっかり36時間待たされた。
・結果は得点のみ通知、詳細はもらえない（今後改善すると言っているらしい）
・受かってると、Linkedinとかで見かける認定証のPDFがもらえる。LFのMy portalでも見られる。
・Degital badgeがもらえて、Linkedinとかで自慢できる。

ざっとこんな感じだったかなと思います。疑問点あればコメントいただければできる限り追記したいと思います。

**準備**
そもそも僕のバックグラウンドですが、今はSaaSサービスの会社で顧客向けの技術サポートをしています。開発経験などもありますが、少し前まで金融系のクラシカルな環境だったので、Kubernetesはおろかコンテナもほぼ触ったことはなかったです。知識として知っている程度でした。

準備期間としては4ヶ月くらいかけました。前述の通り、ほぼゼロからスタートだったので、基礎を3ヶ月くらいじっくりやって、あとの1ヶ月は復習と試験の練習を繰り返した感じです。

オライリーの本とか買ってみたりしましたが、役に立ったなとおもうのは以下の2つでした。

・UdemyのMumshad Mannambethさんのコース
https://www.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/

これは超有名ですね。CKA受けてる人はほぼみんなこれやってる気がします。
ほぼ全てのトピックが網羅されていて、初心者にもわかりやすいです。各パートにハンズオンの練習問題がついていて、それを繰り返しやることで試験の練習にもなってよかったです。
インド系らしいですが、発音も癖がなく、かなりゆっくり話してくれるので、英語が苦手でもとても聞き取りやすいと思います。英語に慣れてる人は早送りでも十分聞き取れるくらいだと思います。

ただし、練習問題は割とベーシックなので試験用に少し難しい問題で練習したいという場合には少し物足りなくなるかもしれません。
また、9月にCKAが改定されたためか、カバーされていないトピックがいくつかありました。(Service accountやStateful setなど)
それらはCKADコースでカバーされていますが、割とお高いのでセールのときに買うか、自分で勉強するかという感じでしょうか。
僕は幸運なことに、会社でUdemyに入っていて全部タダなので、遠慮なくCKADコースを受けました。

・Killer.sh
https://killer.sh/

これは会社の同僚に教えてもらったもので、レクチャーは無く、練習問題だけのサイトです。
費用は30ユーロで、問題は無限に繰り返せるわけではなく、1つのセッションは36時間しかアクセス出来ません。その時間内であれば、問題も繰り返し解けて、復習もできると言う感じなので週末に集中してやるといいと思います。
難易度はMumshadさんのやつよりかなり難しく、実際の試験のHardレベルに合わせて作っているらしいので練習にはちょうどいいと思います。
僕は2時間で半分くらいしか得点出来てなかったと思います。ちなみに実際のテストも割とギリギリでしたが、これをやってなかったら受かってなかったと思います。
Tipsみたいなのも結構載っていて役にたったなと思います。

他にも練習サイトなどあると思いますが、上記2つしか使ってません。

**その他**
・tmuxをおすすめしている人が多いですが、僕はほぼ使わず、必要性もあまり感じませんでした。”クラスタをアップグレードせよ”系の設問ではkubeletとかインストールする必要があるので、その時に使ったくらいですかね。
・aliasやexportなどは有効に使いましょう。
・kubectlのAuto completionは便利でした。人によっては、ブラウザが重くなって操作しづらくなるとのコメントもありますが、僕は特に気にならなかったです。在宅勤務できるくらいの通信速度があれば問題ない気がします。
・2時間ありますが、きちんと練習しておけば時間は結構あまると思います。僕は30分くらいあまりました。
・同僚は1ヶ月くらいの準備で大丈夫だったらしいです。経験がある人なら1ヶ月くらい、僕のように初心者であれば3ヶ月くらいの準備期間を目安にするといいかもしれないです。

ぱっと思いつくのはこれくらいです。
誰かの参考になればいいな。
Djangoを使ったWEBアプリケーションの開発【モデル定義編】

[テンプレート追加編の続き](https://qiita.com/tesla1017/items/8fbc72f0312f9d445c2c)

モデルの定義
-
現在作成しているpostsという機能は、ブログなどの記事を入力するための機能をイメージしているため、タイトル・記事・日時・画像を格納するデータベースが必要になります。
これをmodels.pyに追記していきます。

```models.py
from django.db import models

#Postというクラスとして定義していきます。
class Post(models.Model): 

    #タイトルについての定義、文字列型のためCharFieldを使用
    #max_lengthで文字数制限をすることが可能
    title = models.CharField(max_length=100)

    #日時についての定義、日付データのためDateTimeFieldを使用
    published = models.DateTimeField() 

    #画像データについての定義、画像データのためImageFieldを使用
    #引数として画像データの保存先を指定できる（今回は、mediaフォルダを指定）
    image = models.ImageField(upload_to='media/') 

    #文章についての定義、テキスト型のためTextFieldを使用
    #長い文章のときに使用
    body = models.TextField()
```

次に、models.pyを基にデータベースのテーブルを作成するコマンドを実行する。

```
$ python3.6 manage.py makemigrations

Migrations for 'posts':
  posts/migrations/0001_initial.py
    - Create model Post
```
新しい定義ファイルが有った場合、データベースに投入するためのファイルを作成してくれる。

続いて新しくできたファイルを読み込みテーブルを作成する。

```
$ python3.6 manage.py migrate

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, posts, sessions
Running migrations:
  Applying posts.0001_initial... OK
```
データベースにアクセスしてテーブルが存在するかを確認する。

```
$ sqlite3 db.sqlite3

SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
sqlite> .tables
auth_group                  django_admin_log          
auth_group_permissions      django_content_type       
auth_permission             django_migrations         
auth_user                   django_session            
auth_user_groups            posts_post #新しく作成されたテーブル                
auth_user_user_permissions
```
「posts_post」というテーブルが作成されたことがわかる。
【Java】ループ処理と九九の表

#forループで九九の表を作る

```java
public class Enshu0112 {

	public static void main(String[] args) {
		System.out.println("九九の表");
		System.out.println("\t|  1  2  3  4  5  6  7  8  9"); // 最初の見出しの行
		System.out.println("----+------------------------------------");
		for (int i = 1; i < 10; i++) { // 縦のループ
			System.out.printf("%3d |", i);
			for (int j = 1; j < 10; j++) { // 横のループ
				System.out.printf("%3d", (j*i)); // 表示桁を合わせて縦が揃うようにする
			}
			System.out.println(); // 改行を挿入
		}
	}
}
```

#\tで縦を合わせようとしたら左寄せでになってしまった
見出しの行に\t1\t\2...という形で縦を揃えようとしたら左寄せになったので、半角スペースで調整することにしました。

なんにせよループ処理の練習で九九は基本ですね。
ラズパイOS64bitでVScodeのインテリセンスが動かない!(Python)

初めまして。この記事が初投稿になります。
今回はpylintがうざくて、とあるサイトを見て設定したらラズパイでVScodeのインテリセンスが効かなくなってしまったので、原因と対処法、根本的なエラーの対処法を書いていこうと思います。

# 環境
- ラズパイ4
- ラズパイOS 64bit
- code-oss
- Pythonプラグイン
- pylint

#ディレクトリ構成
```
workspace/
    ┣ utils/
        ┣ __init__.py
        ┣ sub.py
    ┣ __init__.py
    ┣ main.py
```
とりあえずこんな感じかな
`main.py`に

```py
from utils import sub
```
と記入したところ、
`Unable to import utils pylint(import-error)`
と表示される。
なにこれ！うざい！出てくんな！
といくら言っても意味がないので、調べてみた。
そしたら`pylintrc`を作成して
`init-hook="./utils"`
と記入しろとのことだった。やってみた。でなくなった！やった！と思ったのもつかの間。
再起動してみたら、インテリセンスが効いてない。今だったら`pylintrc`を作成したからと思うのだが、このときの私は全くその頭はなかった。
code-ossを再インストールしても変わらなかったので、`gitにpylintrcをpush`して仕方なくOSを入れ直した。
そして、cloneして再起動したら、また効かなくなってる。
why?なぜ？
いろいろ調べたら、`pylintrc`が原因だと分かった。速攻消した。(どのサイトだったかは忘れた)
そして、根本の`Unable to import utils pylint(import-error)`が再登場。
再び色々調べてみたら、`__init__.py`を置くと直ると書いてた。
しかし私はおいてる。
もしかしてと思い、`main.py`と同じ層にある`__init__.py`を消してみた。エラーでなくなった。解決。

# 結論
- pylintrcを消す
- __init__.pyを無駄に置かない。

以上！！
書き慣れてないので、ここをこうした方が良いなど編集リクエストやコメントで頂けると嬉しいです！
PHP 変数の後ろに[]をつける場合と付けない場合の違い

変数の後ろに[]をつける挙動を知らなかったのでメモ

```php
// index.php
$errors = [];

$erros = 3;
var_dump($errors);
// int(3)
```
これだと配列が上書きされ、$errorsが文字列になってしまう。

```php
// index2.php
$errors[] = 3; 
$errors[] = 2;
$errors[] = 'a';
var_dump($errors);

array(3) {
  [0]=>
  int(3)
  [1]=>
  int(2)
  [2]=>
  string(1) "a"
}
```

変数の後ろに[]をつけることで、配列の中身に値を代入できる。

```php
// index3.php
$errors = [];
$errors['hoge'] = 3;
var_dump($errors);
// array(1) {
//  ["hoge"]=>
//  int(3)
// }
```
hogeがキーに3がvalueになる。
シェルスクリプトで相対パスと絶対パスを相互に変換する関数

こちら（[シェルスクリプトで相対パスを絶対パスに変換する正しい方法](https://qiita.com/ko1nksm/items/f7e9becee2e651004e14)）の記事の続きです。

**相対パスを絶対パスに変換する方法**

```sh
# set -e していれば 下記の || exit $? は不要
dirname="$(cd -- "$(dirname -- "$1")" && pwd)" || exit $?
abspath="${dirname%/}/$(basename -- "$1")"
```

簡易な（行数が少ない）コードを求めているのであれば上記のコードで良いのですがシェルスクリプトにするのであれば行数を気にする必要はないと思うのでシェル関数にしました。この方法のメリットは外部コマンドを使っておらずファイルやディレクトリが存在していなくても動作するので速いという点です。改行で終わるパスにも対応しています。POSIX 準拠で bash 以外にも対応しており（ローカル）変数の代わりに位置パラメータを使うことで、グローバル変数を汚染しないようにしています。

```sh
abspath() {
  case $2 in
    /*) set -- "$1" "$2/" "" ;;
    *) set -- "$1" "${3:-$PWD}/$2/" ""
  esac

  while [ "$2" ]; do
    case ${2%%/*} in
      "" | .) set -- "$1" "${2#*/}" "$3" ;;
      ..) set -- "$1" "${2#*/}" "${3%/*}" ;;
      *) set -- "$1" "${2#*/}" "$3/${2%%/*}"
    esac
  done
  eval "$1=\"/\${3#/}\""
}

relpath() {
  set -- "$1" "$2" "${3:-$PWD}"
  abspath "$@"
  eval "set -- \"\$1\" \"\${$1}\" \"\$3\""
  abspath "$1" "$3"
  eval "set -- \"\$1\" \"\$2\" \"\${$1}\" \"\""

  [ _"$2" = _"$3" ] && eval "$1=./" && return 0

  while [ "$3" ]; do
    eval "$1=\$3 && [ ! \"\$2\" = \"\${2#\"\${$1}\"}\" ]" && break
    set -- "$1" "$2" "${3%/*}" "../$4"
  done

  eval "$1=\$3/ && $1=\$4\${2#\"\${$1}\"}"
}
```

変換済みのパスは標準出力に出力されるのではなく第一引数に指定した変数名に返します。`read` 関数と同じような仕様です。これにより改行で終わるパスにも対応できます。第三引数を指定するとカレントディレクトリではなく指定したディレクトリを基準として変換します。

```sh
abspath ret "$1"
printf '[%s]\n' "$ret"

relpath ret "$1"
printf '[%s]\n' "$ret"
```

一応ローカルでテストはしてるのですが、過去の bash 用に作ったコードを関数のインターフェースを変更して POSIX 準拠に書き換えており使用実績もあまりないので利用する際は注意してください。

このコードのライセンスは CC0 とします。近いうちにこれらを含め私が作った or 作る予定のシェルスクリプト用関数を集めたリポジトリを作る予定です。

また関連記事としてこちらもどうぞ

- [POSIX準拠でもreadlink -f （完全互換版）](https://qiita.com/ko1nksm/items/873cfb9c6ceb6ef32ec9)

## 更新履歴

- 2021-09-07
  - `abspath()` 関数の未使用の位置パラメータを削除しました
  - コードのライセンスを MIT ライセンスから CC0 に変更しました
Qiita初心者がまずタグ付けしたらよい言葉とは？

#目的
　どのタグ（ほぼ言語）が最初にフォローされやすいのかを確認する。
　先に登録するものが、Qiitaを使いたいというきっかけになるものなので、
　本当に興味があることではないかという推測に基づく。

#方法
　あるグループのユーザリストを取得（プログラム外）し、
　APIを使って新しい順にユーザ別にタグを取得。
　認証情報がないとAPIをたたける数が少ない。
　新しいものの番号を古い順に変換し、登録5つ目までのタグをランキング化（プログラム外）

#コード

```js:get_qiita_data_tags.js
//package require
const axios = require("axios");
const fs = require("fs");
const csvStr = require("csv-stringify/lib/sync");
const csvParse = require('csv-parse/lib/sync');

//認証情報の取得　外から渡してる
const token = process.argv[2];

//QiitaAPIでデータ取得・csvに出力
async function getArticle(query) {
  //ユーザリストを取得
  const file = './data/input_user_list.csv';
  let inputData = fs.readFileSync(file);
  let user_list = csvParse(inputData);
  console.log(user_list);

  //csvに変換する用list
  let outcsv = [];

  //csvのヘッダー設定
  let columns = ["ユーザ番号","ユーザID","タグ登録順","タグ"];
  outcsv.push(columns);

  //あるリストに存在するユーザ数
  var user_num = user_list.length;
  
  //検索用パラメータ
  var PAGE_MAX = 4;
  var PER_PAGE = 100;   
      
  for (i = 0;i<user_num;i++){
    //あるユーザがフォローをしているタグを取得
    var user_id = user_list[i][0];
    console.log(user_id);

    for (page = 1;page<=PAGE_MAX;page++){
        //URLを作っておく
        var url = "https://qiita.com/api/v2/users/"+user_id+"/following_tags?page=" + page + "&per_page=" + PER_PAGE;
        let response
        //リクエストが失敗した時の処理
        response = await axios.get(url
          , {
            headers: {
              Authorization: `Bearer ${token}`,
            }
          }
          
          ).catch(err => {
            return err.response
        });
        if (response.status != 200) {
          console.log("たぶんAPIエラー")
        }

        var tags_num = response.data.length;
        var sort_num_desc;
        console.log(tags_num);
        for (j =0 ; j<tags_num ; j++) {
          //一レコードの情報格納list
          let record = [];
          //欲しい要素
          var tag_id = response.data[j].id;
          sort_num_desc = (page - 1) * PER_PAGE + (j+1);
          console.log("row: " + sort_num_desc +",user_n: " + i + ",user_id: " + user_id + ",tag_id: " + tag_id);

          //listに格納
          record.push(i,user_id,sort_num_desc,tag_id); 
          outcsv.push(record);
        }
    }
  }
//   csvとして出力
  fs.writeFileSync("./data/following_tag_list.csv", csvStr(outcsv));
}

//情報の取得
var query = "node.js";
getArticle(query);

```


#結果
　そもそもあるグループの前提になっている授業に含まれている言語が多い。
　フロント側の技術や、必須になるソースの管理に関しても見る人が多い。
　あんまりユーザ数が約40人のグループにしては必須の技術のタグ付け数が少ない。
　タグ付けしないのだろうか。

|順位|タグ|ユーザ数|
|:-:|:---------|-----:|
|1|JavaScript|16|
|2|Node.js|12|
|3|Python|8|
|4|GitHub|6|
|5|Android|5|
|6|Chrome|4|
|7|CSS|4|
|8|HTML|4|
|9|HTML5|4|
|10|Git|3|