OmniAICreator/Qiita-1.07M huggingface dataset:
Genericsパラメータを持つUIViewController/UIViewのStoryboardName/nibNameをいい感じに取得する

# 背景
StoryboardやXibをコードから呼び出す場合、その名前を文字列で指定する必要があります
文字列をベタ書きで指定するのは以下のデメリットがあります

* タイポする可能性が高まる
  * タイポに気づけなければ無駄に時間を使ってしまう
* クラス名の更新時に呼び出しの文字列を変更し忘れて、StoryboardやXibが読み込めなくなる
  * 読み込めなくなっていることをコンパイル時に気づけないので最悪そのままリリースしてバグになる

その対策として以下のようなExtensionを活用している方も多いと思います(私もその一人です)

```swift
extension NSObject {
    static var className: String {
        String(describing: self)
    }
    
    var className: String {
        Self.className
    }
}
```

参考: https://qiita.com/tattn/items/bdce2a589912b489cceb

# この解決方法の課題
XibやStoryboardが紐付いているUIViewController/UIViewにGenericsパラメータがついている場合、正しく読み込めません
理由は、Genericsパラメータまでが `className` に含まれてしまうため、StoryboardNameやnibNameとずれてしまうからです

```swift
class HogeViewController<T>: UIViewController {}

print(HogeViewController<String>.className)
// HogeViewController<String>
// 本当は HogeViewController の部分だけがほしい
```

# 解決方法
Genericsパラメータの手前までをnibNameとして切り出します
※サンプルはUIViewControllerだけですが、UIViewも同様のExtensionを生やせばOKです

```swift
extension UIViewController {
    static var nibName: String {
        let startIndex = className.startIndex
        let endIndex = className.firstIndex(of: "<") ?? className.endIndex
        return String(className[startIndex ..< endIndex])
    }
}
```

上記ロジックはクラス名に `<` が含まれていると意図しないところでnibName切れてしまいますが
私が試行錯誤した限りは `<` をGenericsパラメータ以外の中途半端な位置に入れるとコンパイルエラーがでるので大丈夫だと思います
もし、抜け穴がありましたらコメントください

## 結果
### Genericsパラメータがある場合

```swift
class HogeViewController<T>: UIViewController {}

print(HogeViewController<String>.className)
// HogeViewController<String>
print(HogeViewController<String>.nibName)
// HogeViewController
```

### Genericsパラメータがない場合

```swift
class FugaViewController: UIViewController {}

print(FugaViewController.className)
// FugaViewController
print(FugaViewController.nibName)
// FugaViewController
```
GIS データ（ストリーム対応型）をLeaflet地図上に表示

こんにちは。
ストリーム対応型の GIS データ形式（下記の2種類）をLeaflet地図上に表示しました。

* [flatgeobuf](https://github.com/flatgeobuf/flatgeobuf) 　← なおここから今回のデータファイルおよび[サンプルソース](https://flatgeobuf.org/examples/leaflet/)を入手
* [geojson stream](https://github.com/node-geojson/geojson-stream) (newline delimited GeoJSON; GeoJSONL)

入手したソースを書き換え、ローカルファイル（gzip圧縮にも対応）読み込みとしました。内部では表示に至る各段階をストリーム型（逐次型）で処理します[^1]。

[^1]: 表示も iteration ループのストリーム型で処理し、その内では都度都度、更新を行なわせています。その反面、全ての表示を完了するまでの処理時間は顕著に増大します。

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54617/bc2e29c5-3693-b178-5966-b70be1944c17.gif)


ソースおよびデモ動作はこちら：

* [Leaflet map: read GeoJSONL/flatgeobuf files by dropping-on]( https://bl.ocks.org/kkdd/d18eb75331b2271ca9ab0b0e13be20d6) (bl.ocks.org)


#### データファイルサイズ比較

ファイルサイズ比較[^2]

```console

$ ogr2ogr -f GeoJSONSeq /vsistdout/ UScounties.fgb | gzip > UScounties.jsonl.gz
$ ls -lh 
   13M   UScounties.fgb
  7.6M   UScounties.fgb.gz
   20M   UScounties.jsonl
  5.8M   UScounties.jsonl.gz
```

[^2]: 参考："[Parquet on the Web](https://observablehq.com/@kylebarron/geoparquet-on-the-web)" (observablehq.com)
[ruby] find, find_by, whereの違いについて

# find, find_by, whereの違いについて
初めまして！今回にそれぞれの違いの理解が浅かったので纏めてみました。

# find
①「findメソッド」は主キーと呼ばれるidを指定した検索の仕方。

```
List.find(params[:id])
```

id以外のカラムを指定してデータを取得したい場合もあります。
　そのような場合には「findメソッド」では解決できないので、別の「find_byメソッド」を使ってデータを取得しなければいけません。

# find_by

主なイメージは、「主キー(id)以外のカラムを指定しても、見つかった1レコードを返せる」。

```
List.find_by(title: "ruby",body: "rails")
```
１.find_by()の()内に記述できるのは、数値（id）だけでなく、文字（id以外のカラム）も可能
2.id以外のカラムも指定できるので、複数のレコードが見つかる場合もありますが、その時は、一番最初に見つかったレコード1件を取得
3.検索に該当するデータがなかった場合、nilを返す

# where

主なイメージは、「主キー(id)以外のカラムも指定できる、且つ、複数のレコードも返せる」

```
List.where(title: "ruby",body: "rails")
```
1.where()の()内に記述できるのは、数値（id）だけでなく、文字（id以外のカラム）も可能
2.該当する複数のレコードを取得
3.検索に該当するデータがなかった場合、空の配列を返す

***

以上、find, find_by, whereの違いについてでした
マイグレーションの実行

#マイグレーションの作成
```
$php artisan make:migration create_posts_table   
```
でcreate_posts_tableを作成

```
public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('name',20);
            $table->integer('member');
            $table->string('title')->nullable();
            $table->text('message')->nullable();
            $table->string('grade')->nullable();
            $table->string('comment')->nullable();
            $table->timestamps();
        });
    }

```
上記を記載
投稿画面を作りたかったので 'title'と'message'は必須！！
投稿画面に募集人数の項目も作りたかったので

```
 $table->integer('member');
```
を追記。これで正しいのかわからないけど....。

あとはマイグレーションを実行するだけ！

```
$php artisan migrate 
```

今日はここまで！
明日は投稿機能を作っていく！！
テスト38

```vb

'標準モジュール(Module5)

Sub クラスモジュール練習()

Dim コード取得 As New Data_syori
Dim ans As String
Dim myRange As Range
Dim mySheet As Worksheet

Set コード取得 = New Data_syori

With ThisWorkbook
    
    Set mySheet = .Sheets("一覧表")
    Set myRange = .Sheets("一覧表").Range("D2")
    
    'GetプロシージャはFunctionプロシージャのイメージ
    ans = コード取得.管理コード(mySheet, myRange)

    MsgBox ans
    
    'Letプロシージャはデータを格納するだけのSubプロシージャのイメージ
    コード取得.tmp_test = .Sheets("一覧表").Range("B22").Value
    
    '「クラスモジュールの中の変数」として指定しないとクラスモジュールの中の変数は取得できない
    MsgBox コード取得.tmp

End With


End Sub

'----------------------------------
クラスモジュール(Data_syori)

Public tmp As Variant

Property Get 管理コード(ByVal wb As Worksheet, ByVal S_code As Range) As Variant
'Functionプロシージャのイメージ
With wb

    管理コード = .Range(S_code.Address).Offset(0, -2).Value
    
End With

End Property

Property Let tmp_test(ByVal atai As Variant)
'値を格納するSubプロシージャのイメージ
    tmp = atai
    
End Property
Laravel・テンプレートエンジンとは

# Laravelテンプレートエンジンとは

<font color="Red">任意の名前</font>.blade.php

## bladeとは【Laravel】で利用されているテンプレートエンジンの事

## テンプレートエンジンとは、 

HTMLの一部に変数や条件分岐、繰り返し等の各種処理を埋め込める仕組み

## {{<font color="blue">$sample</font>}}とは

{{ }}に囲んだ形で変数名を指定すると、自動的に変数内の文字列が出力(echoと同じ）される。

## {!! <font color="blue">$sample</font> !!}とは

{!!$title !!}に囲んだ形で変数名を指定すると、エスケープを防止して出力する。

## {{--  <font color="blue">$sample</font> --}} とは

Laravelのコメント行

## ディレクティブとは

@から始まる文字列の事

### @extends   (エクステンドズ)

レイアウトの呼び出し

@extends('<font color="Red">.blade.phpのファイル名</font>')

### @section     (セクション)

レイアウトファイルの(@yield)に変数を穴埋め

@section('埋め込むyieldの場所', 埋め込む変数)

※複数行になる場合は、@endsectionで閉じる

### @yield     (イールド)

@yield（'ここに埋め込む宣言'）


- @if()
- @elseif()
- @else
- @endif
- @foreach($samples as $sample)
- @endforeach
さて始めるか

WPFやMVVMを検索すると必ず出てくるQiita。
俺もやってみよう。
誰に見せるでもなく、自身の開発ログとして。
コードを貼りながらメモができるのはありがたい。過去に何を考えて書いたかを確認できる。

…と思ったが、
規約に「他人が見て役に立つ」内容を心がけるべしとある。
なるほど。そりゃそうだ。
よろしい、
では俺は初心者が初心者なりになんとかクリアした問題点を書いていこう。
趣味でごそごそやってる同志に向けて。
開発思想のまとめはnoteに書くよ:sunglasses:
壊れていたRailsが直ったから、メモを書く

DockerでRailsの環境構築をしようとして、色々環境をいじったらRails s が動かなくなった。

それから３日間こねくり回して、ようやく解決した。


nokogiriエラー、
msgpackのエラー、

色々とあったが、Gemfileを壊してしまった。
要はバージョンエラー。


railsのバージョン、ruby、環境変数、パスなどのバランスが崩れた。
確か、rbenvを追加したところで、おかしくなった。


railsもrubyもアンインストールをして、環境パスも消して、
それで全部、インストールをして再構築できた。

dockerにはまた挑戦したい!
ローカル変数の型推論

# ローカル変数の型推論

## varによる変数宣言
JDK10より、Local-Variable Type Inference(ローカル変数型推論)が使用できるようになりました。
これにより、**ローカル変数の宣言時**に特定のデータ型を記述するのではなく,varを利用することができます。

```
int num = 10; //従来の書き方
var num = 10; //ローカル変数型推論の利用

```

ローカル変数型推論を利用した場合、変数のデータ型が不明無ように見えますが、初期化時に代入されている
右辺の値(上記の例であれば10)によりnum変数はint型と推論できます。

## varが利用できる箇所

varが利用できる箇所は以下のとおりです。

・ローカル変数の初期化時
・拡張for文内のインデックス
・通常for文内で宣言されたローカル変数

## varが使用できない箇所

varには使用できない箇所があります。以下の場面で使用できない流れです。

・メソッドの引数
・コンストラクタの引数

以上では、使用ができません。

## まとめ
・ローカル変数は変数の型を予測してくれる。
・for文内でローカル変数は使用できない。
・メソッドの引数、コンストラクタの引数では使用できない。
急にvsCodeでFlutterアプリがデバックできなくなった

急にvsCodeでFlutterアプリがデバックできなくなった

#原因
launch.jsonがおかしかったことが原因
なぜかファイル指定が消えていた

``` launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "weight_management_app",
            "request": "launch",
            "type": "dart"
            
        },
        {
            "name": "weight_management_app (profile mode)",
            "request": "launch",
            "type": "dart",
            "flutterMode": "profile"
        }
    ]
}
```

#修正後
``` launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "weight_management_app",
            "request": "launch",
            "type": "dart",
            "args": [
                "-t",
                "./lib/main.dart"
            ]
        }
    ]
}
```
GitHub Actionsでelectronアプリの署名・公証を自動化する

# 前提
ローカルの開発マシンでは `npm run build` あたりのコマンドで署名・交渉できる状態を想定しています。

# action
重要どころにコメントつけています。
結局キーチェーンの証明書を、GUIのダイアログなしで使えるようにするのが大事です。
GUIのダイアログが出てしまうとjobは先にすすまず、タイムアウトまでフリーズしてしまいます。
macは10倍のお値段なのであまり時間無駄にしないためにジョブにタイムアウトを設定しておいたほうがよいです。

```
jobs:
  build-mac:
    name: build
    runs-on: macos-latest
    env:
      GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    # キーチェーン周りのシステムダイアログが出た場合など、ジョブが進まずデフォルトタイムアウト(6時間)まで時間を使ってしまうので、それを回避
    timeout-minutes: 30
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Use Node.js
        uses: actions/setup-node@v1
        with:
          node-version: 12.18.1
      # 自由に使える my.keychainを作成
      - run: security create-keychain -p password my.keychain
      # my.keychainをデフォルトキーチェーンにする
      - run: security default-keychain -s my.keychain
      # p12をインポートできるようにロック解除
      - run: security unlock-keychain -p password my.keychain
      # キーチェーンのタイムアウトでのロックなどかけないようにする
      - run: security set-keychain-settings my.keychain
      # 必要な証明書などインポート
      # -Aオプションはどのプログラムからも利用できるようにするオプション
      # p12は本当は外部から取得している。(わかりやすくローカルにある風に記載)
      - run: security import ./certs/macDeveloperIDApplication.p12 -k my.keychain -A -P ${{ secrets.P12PASS }}
      - run: security import ./certs/macDeveloperIDInstaller.p12 -k my.keychain -A -P ${{ secrets.P12PASS }}
      - run: security import ./certs/developerIdApplication.p12 -k my.keychain -A -P ${{ secrets.P12PASS }}
      - run: security import ./certs/developerIDInstaller.p12 -k my.keychain -A -P ${{ secrets.P12PASS }}
      # codesignからmy.keychainへのアクセスを許可しておく
      - run: "security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k password my.keychain"
      # これをしないとインポートしたidentityが認識されない
      - run: security list-keychains -s my.keychain
      # identityが認識されているか確認
      - run: security find-identity -v
      - run: npm ci
      - name: Build App
        timeout-minutes: 15
        run: npm run build
      # この後はartifactに保存したりリリースしたり好きにしてください
      - run: echo DONE!

```
Jenkinsでビルド時にブランチを指定して実行する

# ターゲット

- ビルド時にブランチを指定して実行させたい人

# 設定手順

## Jenkins

### Plugin Install

- プラグインの管理画面（Jenkinsの管理 > プラグインの管理）で「Git Parameter」を検索・チェックし、Install without restart

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/3fdef764-cea8-cee6-92c9-346d6def4c20.png)

refs https://plugins.jenkins.io/git-parameter/

### Create Credentials

- Credentials画面（Jenkinsの管理 > Manage Credentiaals）で、Gitの認証情報を設定します。
  - 種類: ユーザー名とパスワード
  - スコープ: （任意）
  - ユーザー名: Githubユーザ
  - パスワード: Githubユーザのパスワード
  - ID: （任意:ビルド時に設定するID）
  - 説明: （任意）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/44ec8620-7606-539f-7b23-38dfaabbc331.png)

# ジョブ作成

- 新規ジョブ作成 > パイプライン から新しいジョブを作成します。

## General

- ビルドのパラメータ化で「Git Parameter」を選択する。
    - Name: BRANCH（ビルドするブランチの環境変数）
    - Description: （任意）
    - Parameter Type: 今回はブランチを指定するので「Branch」を指定
    - Default Value: origin/master（任意のデフォルトブランチを指定）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/909f3ace-534c-f10a-7a91-8d8ef9ae06c6.png)

## パイプライン

- 定義で「Pipeline script from SCM」を選択
    - SCM: Git
        - リポジトリ
            - リポジトリURL: ビルドしたいリポジトリURL（下記に指定するScript Pathが含まれている必要があります。イメージで指定された https://github.com/ot-nemoto/jenkins-git-parameter-example.git は検証用Jenkinsfileが含まれるだけのリポジトリです。）
            - 認証情報: Create Credentialsで作成した認証情報
        - ビルドするブランチ
            - ブランチ指定子: ${BRANCH}（ビルドのパラメータ化で指定したName）
        - リポジトリ・ブラウザ
            - 自動（*default*）
    - Script Path: Jenkinsfile（*default*）
    - Lightweight checkout: チェックを外す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/75fc089b-501d-7ed1-e442-5fa75aa61da7.png)

# Jenkinsfileを準備

- サンプルで指定している[リポジトリ](https://github.com/ot-nemoto/jenkins-git-parameter-example.git)のJenkinsファイルは以下のようにechoするだけの簡単なものです。

```
pipeline {
  agent any
  stages {
    stage("source") {
      steps {
        sh'''
        echo 'This branch is master.'
        '''
      }
    }
  }
}
```

# ジョブを実行

- ジョブを「パラメータ付きビルド」でBRABCHを指定して実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297616/d3792ec4-05df-1658-9db7-08af6f53fb72.png)

- 実行したジョブの「Console Output」で指定したブランチを取得しているログが確認できれば成功です。

# 関連記事

- [JenkinsにG-Suiteアカウントでログインする](https://qiita.com/ot-nemoto/items/1d9d2b38c6eba70ee708)
- [Jenkinsでaws-cliをつかう](https://qiita.com/ot-nemoto/items/502080184f9705d1f3ba)
- [JenkinsからSlackへ通知する](https://qiita.com/ot-nemoto/items/5a55c4843e4f65426276)
自分だけのCookbookを作ろう

# プログラミングの上達にはアウトプットが大事

プログラミングの上達はとにかくアウトプットです。

私自身も、常に、
「実現したい機能がある→Googleで調べる→実装する（エラー出るのでトライアルアンドエラー）→やっと実現できる→忘れないようにブログにメモ」
という流れ。

自身の備忘録を目的に書いていますが、それがプログラミング技術の向上につながってるなぁと常々実感しています。
そして積み上がった記事は自分だけのCookbookになりました。
アウトプットって大事。

https://qiita.com/HiromuMasuda0228/items/a71dea7ef4d77a30b118

記事を残しておけば、自分のためにもなるし、他の人のためにもなるし、誰も損しません。
まぁ、Qiitaの目指してるところと同じです。

https://help.qiita.com/ja/articles/qiita-community-guideline

# 初心者こそアウトプットが大事

当然初心者こそプログラミングの上達をしたいでしょうから、なおのことアウトプットが大事です。
その日に学習したものをどんどんアウトプットしましょう。

```js
Console.log('Hello, World!');
```

# Qiitaだとクソ記事増やすなと怒られる

といっても、上記のような「JavascriptでHello World!を出力する方法」なんて記事をQiitaに書いたら、「クソ記事増やすな」とか怒られます。公式に怒られるわけじゃないと思います。怒る人もいるというだけだと思いますが。

とはいえ、公式ガイドラインも「エンジニアにとって再利用性・汎用性の高い記事を書こう」、「エンジニアに有益な情報をもたらす記事を投稿しましょう」と謳っているので、初心者が今日学習したHello, Worldを記事にするということをQiitaが望んでないと思うことは間違ってなさそうです。

# フリーのブログはプログラミング記事を書きにくい

となると、自分でレンタルサーバーとかでWordpress使ってブログ立ち上げるか、フリーのブログサービス使うかっていう2択になるんですが、初心者がいきなりWordpressはハードル高いしお金もかかる。

じゃぁ、フリーのブログ一択になりますが、フリーのブログでプログラミング記事書きたいとは思いませんしおすすめしません。コード部分と文章部分を見やすく分けられないし、激しく読みにくいし、あとで「あの記事どこだっけ？」って探すのが非常に探しにくいし。

# ってことで、自分のために記事を書くためのサイトを立ち上げました。

Qiitaの崇高な理念は激しく賛同しますし、Qiitaにこれまでなんども助けてもらいました。

ただ、Qiitaでは「他の人のために記事を書こう」ってことになっているので、クソ記事増やすなとか怒られたりするわけです。

つまり100%自分のために記事を書いていいサービスなら怒られないわけです。そして、結果的にそれが誰かのためになることがあるのならハッピーです。

そんな思いから新しいWEBアプリをたちあげました。

名前は**ownCookbook**です。

https://owncookbook.tech

![スクリーンショット 2021-05-08 2.10.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/925085/222d9b06-26c0-2f83-0e9d-3c1203736bd3.png)

コンセプトは、**あなたの　あなたによる　あなたのための　Cookbookを作ろう**です。

私もこれまで色んなCookbookにお世話になってきました。初めて買ったCookbookは、「Rubyレシピブック　268の技」です。他にもBashやらC#やらPythonやら、色々本棚に並んでいてお世話になっています。Cookbookは偉大です。

そんなCookbookをあなた自身で作り上げればいいんです。プログラミングの学習をしながら、あなた自身のCookbookを作り上げましょう。

プログラミング技術も向上できるし、将来忘れたときにすぐ見返せるし、もしかしたら誰かの役に立つかもしれないし、もしかしたら将来書籍にまとめられるかもしれないし。一石四鳥くらいあります。

# ownCookbookのいいところ

## Qiitaだととっちらかる記事がBookごとにまとめられる

Qiitaでも記事を書きまくってると、「あの記事どこだっけ？」と、特定の記事を探したいときに、中々すぐに目的の記事にたどり着けません。

Pythonごととか、PHPごととか、今作ってるアプリごととか、色んな本を作ってそこに記事を綴っていけます。

![Untitled-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/925085/3ebbe487-b7f6-7b67-80da-332f0340f07b.jpeg)


## Markdownで記事を書ける

Markdownエディタを採用しています。レイアウトもQiitaを参考にしているのでQiita使ってる人はとっつきやすいと思います。

![owncookbook_editor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/925085/f7b596af-6256-ef33-71a1-a5bea794f9bd.png)

## 記事の順番を簡単に入れ替えられる

Book内の記事の順番は後でドラッグアンドドロップで簡単に入れ替えることができます。なので、順番を気にせずに思いついたことから記事を書いていけます。

## シェアが簡単

自分のためのCookbookとはいえ、知ってもらうことも大事。TwitterやFacebookなどに簡単に記事を共有することができます。

## 完全フリー

完全無料です。いつでも退会できます。

# Let's try!

ということで、使って損することはないので是非試してみて下さい。
フィードバックお待ちしております。

https://owncookbook.tech
macにVirtualBoxでUbuntu動か

#そうとしてホストオンリーアダプターが追加できない。
を解消する記事です。
VirtualBoxやUbuntuのインストールは済んだとこからの話です。

##環境
macOS Big Sur 11.2
VirtualBox    6.1.22
Ubuntu        20.04.2.0

[この記事](https://qiita.com/kkino1985/items/22f9e799d6bdc51fa85b)の**発生事象**のと全く同じエラーでホストオンリーアダプターの作成に失敗します。

##やる事
- すべてのアプリケーションの実行を許可する
- 環境設定のセキュリティとプライバシーから、何がしかの何某かを許可する（設定後表示されなくなりましたごめんなさい）

##すべてのアプリケーションの実行を許可する
ここまでは[さっきの記事](https://qiita.com/kkino1985/items/22f9e799d6bdc51fa85b)の通りです。

##環境設定のセキュリティとプライバシーから、何がしかの何某かを許可する
上の工程を終えると下の画像の印のとこにボタンが現れます。
クリックするとチェックボックスが2つあり、片方は空欄です。
それにチェック入れましょう。
画像左下の鍵を解除するのを忘れないように。
![Security___Privacy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255984/83b26908-13be-e77d-230b-3954fd093e6d.png)

するとPC再起動を促されるのでその通りに、
再起動後はホストオンリーアダプター追加できないで調べていっぱい出てきた記事の通りに追加できます。

##参考にした記事
[MacのVirtualbBoxでホストアダプターが作成できない問題](https://qiita.com/kkino1985/items/22f9e799d6bdc51fa85b)
子供が安全に使えるChromeOSを用意しよう(CloudReady版)


## こんな人向け
* 子供が学校でChromeBookを使っているらしい。
* 使ってない古いPCがあるのでChromeOSをインストールして子供に渡したい。 **CloudReadyインストールしてみようか**
* CloudReadyって、Google FamilyLinkアカウントは使えないじゃない？ **ゲストアカウントで使わせるしかないよね**
* かといってゲストアカウントで使わせるとノーガードWeb見放題。***これじゃ渡せないよ***
* できればyoutubeは見せたくないんだけど。

というわけで古いPCにCloudReadyをインストールしてゲストモードでも安全に使えるようにしてみよう！

## CloudReady ゲストモードの残念な制約

この記事を書いた後に分かったことなんですが、CloudReadyのゲストモードには残念な制約があります。
**ゲストモードでは日本語入力が使えません。**  [^1]
Googleアカウントでの使用であれば、日本語入力モードは問題なく利用できます。

日本語キーボードの追加はできるんですが、入力しても無反応。
スクリーンキーボードを使っても入力不可。
なんで、こんな制約がるのか意味不明ですネ。

google検索は賢いので、英字入力onlyでもローマ字で入力すれば大体の目的は達せられると思いますが、子供が初めて使うPCの操作体験としてはイマイチこの上なし。
残念ですが、日本語環境でChromeOSを正しく体験したいのならfamilyLink管理外のGoogleアカウントを用意するか、正規のChromeBookを購入する。というのが今のところの最適解かと思われます。残念です。

それでもいいよ。って方のために以下の手順を残しておきます。

# やってみよう

### Cloud Readyのインストール

こちらからインストールに必要なソフトをダウンロードして対象のPCにインストール。
手順等は、巷にあふれているので、ここでは割愛します。

[CloudReady](https://www.neverware.com/freedownload#intro-text "CloudReady")


# ここからが本番

### 安全なWeb検索とyoutubeへのアクセスを禁止する。

**それhostsファイルでなんとかします**

#### 手順

* RootFS Verificationの無効化

CloudReadyに管理者アカウントでログインして、CTRL+ALT+TでCroshを起動します。
Croshからshellにはいってsuへスイッチ.まずはRootFS Verificationを無効化します。
**この操作はもとに戻せません.後悔しそうなら止めておきましょう**

```
#shell
#sudo bash
#disable_verity
#reboot
```

* ルートパーテーションを書き込み可能にする

PCを再起動したら再び管理者アカウントでログインして、CTRL+ALT+T Croshを起動します。
Croshからshellにはいってsuへスイッチ.ルートパーテーションを書き込み可能にします。

```
#shell
#sudo bash
#mount -o remount,rw /
```

* hostsファイルをコピーしてシンボリックリンクを張りなおします

```
#cp /etc/hosts /etc/hosts.custom
#ln -sf /etc/hosts.custom /etc/hosts
#ls -al /etc/hosts
```

* hostsファイルを編集する

```
#nano /etc/hosts
```

* 禁止したいホストをhostsファイルに設定

例えばyoutubeを禁止したい場合、下記のようにhostsファイルに追記する。

```
127.0.0.1 localhost
::1       localhost
127.0.0.1  www.youtube.com    ←これを追加
```

* Google Safesearch

怪しいサイトをGoogleの検索結果から除外する
通常のGoogle検索をGoogle Safesearch[^2]に変更します。

再びhostsファイルに下記を加えます。
`www.google.com`のIPアドレスをGoogle SafesearchのIPアドレスに変更します。

```
216.239.38.120 www.google.com
```

* 再起動します。

念のため、ルートパーテーションを読み取り専用に戻して再起動しましょう。

```
#mount -o remount,ro /
#reboot
```

## ゲストとしてログインして確認

ログイン画面でゲストとしてログインするを選択。

### youtubeを見てみよう

ブラウザを起動して youtubeを検索。
youtubeのリンクをクリック。

"このサイトにアクセスできません" ⇒ 大成功!。


### 怪しいキーワードで検索してみよう

ブラウザを起動して なんか怪しいワードで検索。
検索結果に危険なものがない！。　⇒　大成功!。

Enjoy Cloud Ready!!


# 参考記事

ありがとうございました。

[ChromeOSの/etcを弄る](https://qiita.com/yas99en/items/9e21137b45ca5528f34b)


[^1]: [issue 6909. Non-US input methods don't work in Guest Mode](https://guide.neverware.com/known-issues/)

[^2]: [Google Safesearch公式](https://support.google.com/websearch/answer/510?co=GENIE.Platform%3DDesktop&hl=ja&oco=0)
[AWS Athena] 入門 ローカルのCSVをS3にアップロードしAthenaでクエリ叩くまで

本日、初めてAtehnaを使い、様々なエラーやマニュアル・他人の記事の睨めっこの格闘の末に、
ようやくローカルに保存していたCSVファイルをSQLで読み込むことができたので入門者向けにその手法を解説します。

今回はローカルにこちらのようなCSVファイルを用意しました。
スマートフォンの機種とメーカー、発売日がリストになったCSVです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658983/dff71f9d-22a8-dbbd-e8e5-b4863cfd8ae6.png)

AtenaはS3に保存されているファイルをデータソースにして、SQLでデータの読込が出来るサービスなので、
まずはS3にアップロードするところから始まります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658983/3f155031-2cb5-28b6-ee1a-4c612b57cd58.png)

アップロードが完了したら、Atenaのコンソール画面に遷移し、CREATE TABLE ステートメントでデータベースを作成します。

次のようなステートメントを入力し、[Run Query (クエリの実行)] を選択するか、Ctrl+ENTER を押します。

```sql
CREATE EXTERNAL TABLE IF NOT EXISTS smartphone (
  id string,
  name string,
  maker string,
  relese_date string
)
ROW FORMAT SerDe 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
WITH SerDeProperties ("field.delim" = ",", "escapeChar"="\\",  "quoteChar"="\"")
STORED AS TEXTFILE
LOCATION 's3://aws-athena-trial/test/' 
TBLPROPERTIES ('has_encrypted_data'='false',  'skip.header.line.count'='1');

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658983/f36bb524-ab1b-5681-ae09-e108c631c4b0.png)

* EXTERNALはテーブルがS3に存在するファイルをデータソースにすることを意味する
* IF NOT EXISTSはテーブルがすでに存在する場合にエラーを出す
* CSVがデータソースの場合は、`ROW FORMAT SerDe org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe `を指定すると良い。データが引用符””で囲まれている場合は `ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'`をつかう。
* LOCATION句はテーブルを作成するときに、基となるデータの Amazon S3 バケットの場所を指定する

CREATE TABLE ステートメントの完了後、下記のクエリを実行すると無事結果セットが得られる。

```sql
select *
from smartphone
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658983/74ab8b1a-5535-c304-24e0-5cc30158e6ed.png)

SQLさえ実行できれば、Atena上でデータ加工・変換も出来るし、加工後のデータをS3に保存することも可能。同じAWSサービスのQuick SightというBIとも連携できるので今後重宝しそう。
OneDrive 制作ファイル　共有　検証

OneDriveでファイル共有
サブアカウントからアクセス・ダウンロードできるかの検証
サブアカウントからファイル内容を改変されるかの検証

https://1drv.ms/t/s!AlWul6DLZpV-aucN3q_FnhAYVWY?e=m7n90g


Microsoftにサインインしていない状態で上のリンクをクリック
→編集不可だがダウンロードは可能
Microsoftアカウントを所持していなくとも共有ファイルへのアクセスはできる
C言語:備忘 unsigned char型の変数を(参照ではなくて)valueコピーする

# モチベーション
C言語を久々に触ったら、すっかり忘れていたので...初歩的ながらも備忘するもの。

# 成果物:GitHub
https://github.com/kyosuke-yamagata/test-value-copy

# 解説

unsigned char型の配列を、バイト数を決め打ちで定義。

```c:main.c
unsigned char textSrc[16] = "abcdefg";
unsigned char textDest[16] = "test";
```

コピー関数を利用。

```c:main.c
strcpy(textDest, textSrc);
```

結果は以下。

```c:main.c
textSrc abcdefg
textDest abcdefg
```

なお更に、それぞれの変数を、異なるValueで上書きすると以下。
（参照が独立していること＋文字数が少ない場合にも、文字が変に上書きされないこと確認）

```c:main.c
strcpy(textSrc, "test1");
strcpy(textDest, "test2");
```

```c:main.c
textSrc test1
textDest test2
```
MacのターミナルとVSCodeのターミナルで動作が違っている現象を解決する

#開発環境
macOS Catalina
Rails 6.1.3.2
Ruby 2.6.7

#VSCodeのターミナルがうまく動作しない
一から調べてRailsの環境構築を終えて、Macのターミナルからrails sを実行すると成功。
開発していく上で、VSCodeのターミナル(Cmd+Jで起動)を使った方が便利と思い、そちらでrails s。
すると...


```
% rails s
Rails is not currently installed on this system. To get the latest version, simply type:

          $sudo gem install rails

You can then rerun your "rails" command.
```

Macのターミナルだとちゃんと動いているのに、VSCodeのターミナルからだと動かない...


#解決するためにやったこと１
**VSCodeの設定を変える**
VSCodeの設定を開き、設定の検索欄に「terminal.integrated.inheritEnv」と入力し表示されたチェックボックスのチェックを外す。
![スクリーンショット 2021-06-04 20.57.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101177/c8710f95-3f5a-2e40-c4fb-5c982640c5e6.png)


VSCodeを再起動する。

#解決するためにやったこと2
**パスの記述ファイルを変更する**

VSCodeのターミナル上でwhich rubyを実行すると/usr/bin/rubyとなり、環境構築で行ってきた.rbenv下ではなくなっている。（Macのターミナルからは元々.rbenv下となっていたが、PCの再起動などをしているうちにいつの間にかこちらも/usr/bin/rubyとなっていた...）
パス通したはずなのにおかしいなと思いながら調べていると、macOS Catalinaからは標準のシェルがzshになったそう。（参考にした記事は[こちら](https://qiita.com/tkooler_lufar/items/66e8fa451185e812a33a#fn1))
環境構築で参考にしていた記事では、.bash_profileにパスを記述しており同じくそうしていました...

そこで

 ```
% vi ~/.zprofile

export PATH=~/.rbenv/bin:$PATH
eval "$(rbenv init -)"
PATH=/usr/local/bin/git:$PATH
export PATH
```

とパスを.zprofileに記述。(下2行はGitのパスです。）
.bash_profileに記述していたものは全て消しました。
そして変更を反映。

```
% source ~/.bash_profile
% source ~/.zprofile
```

再度、VSCodeからrails sを実行...
![スクリーンショット 2021-06-04 21.32.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101177/5b37f528-9074-a256-fb3b-b42aaafc8db1.png)

できた！！！安心するいつもの画面！
(RailsにMySQLを使用しており、rails sした時にMySQLを起動できないよ！と言われて解決するまでに参考にさせていただいた記事を下記に貼っておきます。こちらで無事に起動することができました。）

[mysqlが起動できない（Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)）](https://qiita.com/carotene4035/items/e00076fe3990b9178cc0)
[mysql 起動時のThe server quit without updating PID file エラーの回避法]
(https://qiita.com/jonakp/items/477a18d4a94c01a31583)

#まとめ
しかるべきファイルにパスを通せていなかったことが原因でした。
開発環境をしっかりとチェックして、記事を参考にすることが大事だなと改めて感じました！
ちょ、待てよ、、営業でも簡単にインスタンス立つじゃん

#はじめに
[ちょ、待てよ、、営業でも簡単にGCP使えるじゃん](https://qiita.com/chomateyo/items/4bf866c090b08aa09dff)にてサービス登録を終える。
普段目にすることのない新しい景色とサービスクレジット３００ドル付いているという特典に目を輝かせたのであった。

#インスタンスを立てるというのはどういうことなのか
私（５年前）：「普段どんな業務をされているんですか？」
お客さん：「社内サービスの仮想化業務がメインですね〜」
私（５年前）「・・・今主流ですもんね〜」（仮想化ってなんやねん）

当時何もわからなかった私はGoogle先生に聞くことしかできなかった。
>仮想化（かそうか、英語: virtualization）とは、コンピュータのリソースを抽象化することであり、ソフトウェアと物理的なハードウェアの間に抽象化されたレイヤーを提供することで、コンピュータリソースを管理するための様々な技術である。仮想化ソフトウェアを実行しているマシンは、さまざまなオペレーティングシステム(OS)で実行されているアプリケーションを管理できる。サーバー、ストレージデバイス、ネットワークリソースなどのハードウェアプラットフォームをソフトウェアで効果的にエミュレートまたはシミュレートする。つまり、OS内で別のOSを使用する。
出典：Wikipedia

なるほど。
仮想化技術を利用することで、イメージとしてはOSの中でOSを動かし、詰められるだけ詰めてハードウェアのリソースを有効活用しようってやつか！
**ちょ、待てよ、、**GCPサービスを利用するということは、Googleが保持している環境に仮想技術を使って利用、そのおかげで多くのユーザーがサーバーを使ったり使わなかったり、作ったり消したりができるのか！ぬおおおおお

#インスタンスを立ててみる
昔、仲良くしてもらっていたエンジニアの兄貴に言われたことを思い出す。
「わからんことがあればドキュメントを読め。ドキュメントに全部書いてあるから。」
まず一歩目としてGCPの[ドキュメントポータル](https://cloud.google.com/docs?hl=ja)にアクセス。
**GCP：「コードの確認、知識の共有、全体像の把握が可能です。」**
**私：「・・・これエンジニアの兄貴が言ってたことやん・・・」**

ドキュメントポータルにたどり着いたら以下の順で作業を開始する。
①VMインスタンス作成方法が記載されているドキュメントを読む
②まねる
③わからなければドキュメントをもう一度読む
④まねる
（エンジニアの兄貴の影響）

そして具体的な作成シーンはこちら。
![スクリーンショット 2021-06-04 21.15.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578917/05e9ecd5-93f0-5efd-e93b-f41e6ada8a33.png)

![スクリーンショット 2021-06-04 21.20.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578917/598bff7b-c3a4-a2f2-1a4c-e8546dcc6750.png)

![スクリーンショット 2021-06-04 21.23.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578917/6b2c06b9-72b7-400b-22b2-6acdc4243022.png)


![スクリーンショット 2021-06-04 21.25.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578917/1590e372-31c4-dbb6-402c-05ddf23e977d.png)

**マシン環境**
シリーズ：E2
マシンタイプ：e2-micro(2vCPU/1GBメモリ)
ブートディスクイメージ：Ubuntu　16.04 LTS
アクセススコープ：デフォルトのアクセス権を許可
ファイアーウォール：HTTP許可

![スクリーンショット 2021-06-04 21.35.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578917/2b776a98-57ce-6583-2d8c-e99302086786.png)

**ちょ、待てよ、、**立った！！インスタンスが立った！見えますか、緑のマークが！！

#次回
インスタンスの中身（Ubuntu）ってどうなってるか見てみた（見ないで//）
Seabornでグラフを描画したときにxlabelにすべての要素が入ってしまうときに確認すること

# はじめに

データ分析でEDAをするとMatplotlibやSeabornは欠かせないです。
可視化をするときには必須のライブラリですが、思い通りにいかないことが多々あります。

今回は、箱ひげ図やSwarmなどのグラフを描画したときにxlabelが変になっていたので、その解決方法について説明します。

# 問題

以下のデータフレームがあります。

![bandicam 2021-06-04 21-33-02-076.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/05507318-2f84-1f69-b02a-3f5772267f11.jpeg)


このデータフレームの都道府県が`北海道`の行をすべて抽出して、x=`都道府県名`、y=`取引価格（総額）_log`、hue=`改装`の項目(改装済、未改装)に対して行います。

箱ひげ図やswarmplotなどで描画をすると以下のようになります。

```boxplot.py
# 抽出
df = df[df["都道府県名"]=="北海道"]

# 箱ひげ図
import seaborn as sns
sns.boxplot(x='都道府県名', y='取引価格（総額）_log', hue="改装", data=df[:100])
plt.show()
```

![bandicam 2021-06-04 21-34-09-732.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/a9e3ee83-853b-9301-2c1d-8c40f79f3f60.jpeg)


```swarmplot.py
# 抽出
df = df[df["都道府県名"]=="北海道"]

# swarmplot
import seaborn as sns
sns.boxplot(x='都道府県名', y='取引価格（総額）_log', hue="改装", data=df[:100])
plt.show()
```
![bandicam 2021-06-04 17-10-53-283.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/c02f09d4-bb91-3a3d-a241-6286015c533c.jpeg)

データ数が多いため100行だけ可視化しています。

するとxlabelが北海道のはずだけのはずが、全都道府県表示されていました。

# 解決方法

原因は`都道府県名`のカラム型が`category型`であることでした。

LightGBMの前処理の最後にカテゴリ型にしていました。

![bandicam 2021-06-04 21-14-50-770.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/5c2e3071-1640-39f3-3ec2-34c31df4c190.jpeg)

ですので、この処理をなくして`object形`にするとうまく表示されます。

![bandicam 2021-06-04 21-41-39-545.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/28383e83-5534-1371-2a09-494abb5971ce.jpeg)

![bandicam 2021-06-04 21-42-07-121.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/2c6fc546-5cbb-8ad1-262f-73a8856350cb.jpeg)

# おわりに

まさかのところに原因が潜んでいました。
同じところで悩まされる人が早くこの記事で解決できることを願っています。

# 参考記事
[Pandasのgroupbyがうまく機能していないので教えていただきたいです。](https://ja.stackoverflow.com/questions/77334/pandas%e3%81%aegroupby%e3%81%8c%e3%81%86%e3%81%be%e3%81%8f%e6%a9%9f%e8%83%bd%e3%81%97%e3%81%a6%e3%81%84%e3%81%aa%e3%81%84%e3%81%ae%e3%81%a7%e6%95%99%e3%81%88%e3%81%a6%e3%81%84%e3%81%9f%e3%81%a0%e3%81%8d%e3%81%9f%e3%81%84%e3%81%a7%e3%81%99)
【Vagrant】vagrantをコピーして2つ同時に立ち上げたい

### 環境

MacOS
VirtualBox
Vagrant

## Problem

vagrantの環境を作成したプロジェクトファイル丸ごとコピーして同時に立ち上げたい！
という場面がどれだけあるのか分かりませんが、私は今回その場面に直面しましたので残しておきます。
具体的にはRailsのプロジェクトをコピーして、片方をアプリケーション用。片方をRDS用として相互通信させたかった。
プロジェクトフォルダをコピーして「vagrant up」するとオリジナルと同じVMで立ち上がってしまいます。
これでは共存(同時に立ち上げ)出来ません。

## Solve

同一人物とされているのならコピー先をユニークにしてあげましょう。

```Vagrantfile
PRIVATE_IP = '192.168.33.10'  # オリジナルとは別のIPにしましょう
Vagrant.configure(2) do |config|
  config.vm.define "I_am_copy"  # 名前を定義してあげることでユニークとなる
end
```

あとはそれぞれ立ち上げてあげると同時に2つのvmが立ち上がると思います。

```sh
vagrant up
```

![Oracle_VM_VirtualBox_Manager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189781/8cde3e5f-ca95-44ec-7084-dbbd4d583045.png)

## まとめ
やりたいことによって様々な最適解があると思います。(オリジナルにdefine2つ書いて立ち上げるとか)
ぶっちゃけRDS用はオリジナルをパッケージ化して新たにinitしたほうがスッキリした気がする。
どうせVagrantfileとかコピーするし、手間は少ないからまぁいいかな。。
サクッと同時に立ち上げたいときはオススメです。
【初心者でもわかる】空中に浮いてる感を出すCSS

#どうも7noteです。空中にふわふわ浮いてるような感じを出すCSS

まるで浮いてるような風に見せるCSSです。
画面内にアニメーションを入れることで、視線を誘導しやすくなります。

![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/ac98faaf-8018-d752-fff1-464867274b12.gif)


## ソース

```index.html
<div class="floating"><img src="heart.png" alt=""></div>
```

```style.css
.floating {
  display: inline-block; /* 影をつけるためにinline-block要素にする */
  position: relative;    /* 基準位置とする */
}
.floating::before {
  content: '';                   /* 疑似要素に必須 */
  background: rgba(0, 0, 0, .3); /* 半透明の黒を指定 */
  border-radius: 50%;            /* 円形にする */
  display: inline-block;         /* インラインブロック要素にする */
  position: absolute;            /* 相対位置にする */
  bottom: -35%;                  /* 下に35%の位置に設置 */
  left: 50%;                     /* 左から50%の位置に設置 */
  transform: translateX(-50%);   /* 左右中央にするために要素の半分ぶんだけ左に戻す */
  animation: move-y-shadow .5s infinite alternate ease-in-out;  /* アニメーション「move-y-shadow」 */
}
.floating img {
  animation: move-y .5s infinite alternate ease-in-out;  /* アニメーション「move-y」 */
}

/* 上下を繰り返すアニメーション */
@keyframes move-y {
  from {
    transform: translateY(0);
  }
  to {
    transform: translateY(10px);
  }
}

/* 影の大きさをかえるアニメーション */
@keyframes move-y-shadow {
  from {
    width: 57%;
    height: 25%;
  }
  to {
    width: 50%;
    height: 20%;
  }
}
```


## 解説

まずはふわふわと上下に動かすためにアニメーションで上下移動を作ります。

その後、横長の円形の陰を作り、これも上下のアニメーションと動きを連動させて大きさを少し変えることで、実際に上下している感じを再現できます。

## まとめ

ボタンなど、クリックが必要な場所だと押しにくいので、動いていても問題ない要素を浮かせましょう！
WEBは2D（平面）で表現されるので、3D(立体)っぽく見せる表現は良い違和感が出せるのでポイントポイントで使えるといいかなと思います。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
Laravel・ルーティングだけでHTML を出力

```PHP
<?php
Route::get('/non_view_sample', function () {
    return '
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>ルーティングのみでHTMLを出力</title>
</head>
<body>
    <h1>ルーティングのみでHTMLを出力</h1>
    <p>ルーティングのファイルのみで、HTML全体を返すと長くなります。</p>
</body>
</html>
';
});
```
InDesign スクリプト 要素名に（構造の選択された属性の値を）

構造の選択された属性の値を要素名にするスクリプトは、これで良いのかな・・・？

~~~JavaScript
/*
構造の選択された属性の値を要素名にする
更新 2021/6/4
*/

// アプリ指定
#target "indesign";

// スクリプト名
var scriptName = "要素名に（構造の選択された属性の値を）";

//スクリプト動作指定（一つのアンドゥ履歴にする及びアンドゥ名の指定）
app.doScript(function () {

    // 選択されているオブジェクト
    selectObjects = app.activeDocument.selection;
    
    // 変更された要素名数
    var changeElementNameNumber = 0;
    
    // 選択されているオブジェクトの数だけ繰り返す
    for(var i = 0; i < selectObjects.length; i++){
        
        // 選択がＸｍｌ属性の場合
        if(selectObjects[i].constructor.name == "XMLAttribute"){
        
            // 選択の親のＸｍｌ要素のタグ名と属性の値が違う場合
            if(selectObjects[i].parent.markupTag.name != selectObjects[i].value){
                
                // 属性の値のＸｍｌタグ名が存在しない場合
                if(app.activeDocument.xmlTags.itemByName(selectObjects[i].value).isValid == false){
                    
                    // エラー対策
                    try{
                        
                        // 属性の値の名前のＸｍｌタグを追加
                        app.activeDocument.xmlTags.add(selectObjects[i].value);
                        
                    // エラーの場合
                    }catch(e){
                        
                        // 次の繰り返しへ
                        continue;
                    }
                }
                
                // Ｘｍｌ要素のタグに属性の値の名前のＸｍｌタグを入れる
                selectObjects[i].parent.markupTag = app.activeDocument.xmlTags.itemByName(selectObjects[i].value);
                
                // 変更された要素名数を追加
                changeElementNameNumber++;
            }
        }
    }

    // 結果表示
    alert("変更数 " + changeElementNameNumber, scriptName);

//スクリプト動作指定（一つのアンドゥ履歴にする及びアンドゥ名の指定）の続き
}, ScriptLanguage.JAVASCRIPT, [scriptName], UndoModes.ENTIRE_SCRIPT, scriptName);
~~~
Tips: Vimで複数ファイルの文字列置換を一気に行う

Vimで複数ファイルの文字列置換を行う際のコマンドを紹介します

## 1. `argadd`コマンドで置換を行うファイルを指定する
以下のようなコマンドで、置換を行うファイルを指定します。
ファイル内に実際に文字列がない場合でも問題ないです。
置換を行いたいディレクトリの配下にあるファイルを一気に指定しましょう。

```vim:例SQLファイルの置換を行う
:argadd path/to/files/**/*.sql
```

`args`コマンドで指定したファイルの一覧を見ることができます。

```vim
:args
```

## 2. `argdo`コマンドで指定したファイルに置換を実行する

```vim
:argdo %s/置換対象の文字列/置換後の文字列/ge | update
```

ここで僕は置換時に、`g`ではなく`ge`を指定することにしています。
`ge`にすることで、`argadd`で指定したファイル内に置換対象の文字列がなかったとしても、エラーになっていちいち止まらずに全てのファイルに対して置換を実行してくれます。
保存はしないで一個ずつ正しく置換できているか確かめたいときは、最後の`update`を外してください。`update`を行わないことで置換後に保存がされないので、置換したファイルを一つずつチェックして保存を実行していくことができます。

```vim:保存をしない場合
:argdo %s/置換対象の文字列/置換後の文字列/ge
```


## この記事について

この記事は

https://qiita.com/official-events/d523df99d6479293ffa7

の参加記事です。
AWS EC2 Linux2 アクセスログを確認してみた

# /var/log/secure を確認

```
$ sudo cat /var/log/secure
```

### Accepted publickey
公開鍵でログインした形跡が見つかりました。自分のグローバルIPアドレスが表示されています。

```
Jun  4 10:40:10 ip-172-31-46-216 sshd[3312]: Accepted publickey for ec2-user from xxx.xxx.xxx.xxx port 60615 ssh2: RSA SHA256:xxxxxxxxxxxxxxxx
```

### Invalid user
登録されていないユーザー名でログインしようとしてわざと失敗してみます。アクセスログは残るのでしょうか！？残りました！！

```
Jun  4 11:40:04 ip-172-31-46-216 sshd[32506]: Invalid user test-user from xxx.xxx.xxx.xxx port 55569
```

### error: AuthorizedKeysCommand
インスタンス起動時に指定した公開鍵とは異なる鍵でログインを試みた結果がこちら。

```
Jun  4 11:53:22 ip-172-31-46-216 sshd[32599]: error: AuthorizedKeysCommand /opt/aws/bin/eic_run_authorized_keys ec2-user SHA256:yyyyyyyyyyyyyyyyyyyyy failed, status 22
```

# /var/log/audit/audit.log を確認

```
$ sudo cat /var/log/audit/audit.log
```

### type=USER_LOGIN
ログイン履歴が見つかりました。こちらは`hostname`もしっかり記載されています。

```
type=USER_LOGIN msg=audit(1622803210.258:97): pid=3312 uid=0 auid=1000 ses=2 msg='op=login id=1000 exe="/usr/sbin/sshd" hostname=xxx.yyy.net addr=xxx.xxx.xxx.xxx terminal=/dev/pts/0 res=success'
```

登録されていないユーザー名でログインを試みました。失敗ログが残っています。

```
type=USER_LOGIN msg=audit(1622807835.252:451): pid=32668 uid=0 auid=4294967295 ses=4294967295 msg='op=login acct="ec2-user" exe="/usr/sbin/sshd" hostname=? addr=xxx.xxx.xxx.xxx terminal=ssh res=failed'
```

### type=USER_AUTH
`op=pubkey_auth`は鍵認証が成功したログが残っています。`hostname`が記載されていませんが、グローバルIPが見えます。

```
type=USER_AUTH msg=audit(1622803210.014:85): pid=3312 uid=0 auid=4294967295 ses=4294967295 msg='op=pubkey_auth rport=60615 acct="ec2-user" exe="/usr/sbin/sshd" hostname=? addr=xxx.xxx.xxx.xxx terminal=? res=success'
```

こちらは間違った公開鍵でログインを試みました。失敗ログがちゃんと残っています！

```
type=USER_AUTH msg=audit(1622809194.934:525): pid=336 uid=0 auid=4294967295 ses=4294967295 msg='op=pubkey acct="ec2-user" exe="/usr/sbin/sshd" hostname=? addr=xxx.xxx.xxx.xxx terminal=ssh res=failed'
```

# コマンド last を実行

```
$ last
```

現在ログインしているユーザーが見えています。`XXXXXXX`にはホスト名が表示されています。

```
$ last
ec2-user pts/1        XXXXXXX Fri Jun  4 11:22   still logged in
ec2-user pts/0        XXXXXXX Fri Jun  4 10:40   still logged in
```

`-i`でグローバルIPに変換できました。

```
$ last -i
ec2-user pts/1        xxx.xxx.xxx.xxx     Fri Jun  4 11:22   still logged in
ec2-user pts/0        xxx.xxx.xxx.xxx     Fri Jun  4 10:40   still logged in
```

ログアウトした後に再度`last`コマンドを実行してみます。
ログアウト時間が表示されています。このユーザーは7分ログインしていたことがわかりました！

```
$ last
ec2-user pts/1        XXXXXXX Fri Jun  4 11:22 - 11:29  (00:07)
```

以上です！
中二心をくすぐられますね！(≧▽≦)

# 参考記事

https://mycodingjp.blogspot.com/2018/12/linux-centos.html

https://www.atmarkit.co.jp/ait/articles/1903/22/news031.html
Laravelのルーティングで1から10までを加算し、その結果を戻り値とする無名関数を作成

ルーティングで利用されている無名関数の中ではPHPの任意の処理を書ける


```PHP
<?php

Route::get('/sum', function () {
     $sum = 0;
    for ($i = 0; $i <= 10; $i++) {
     $sum = $sum + $i;
    }
    return '1から10までの合計は'.$sum;
});

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/2828aa2c-904e-f36e-2ded-a3d654cc1dca.png)
Pandasのgroupbyでないはずの要素もまとまられてしまいNaNになってしまう

# はじめに

Pandasのgroupbyはとても難しく初心者の壁だと思っています。
私も本格的にさわり初めて日が浅く、どこが原因なのかよくわからない or どうやってアルゴリズムを組めば効率的に実現できるのかと模索する日々です。
時間がかかったものに関してはQiitaに記事としてまとめていますのでご覧ください。

今回は、groupbyで想定していない動きになり困っていたのですが、質問サイトに投稿したところデバックをしていくうちに真相にたどり着いたのでまとめたいと思います。デバックしていなかったら解決に至っていなかった危害します。(よかった)

私と同じようなことになった方がすぐに解決できればと思います。

# 問題

以下のようなDataFrameがあります。

![bandicam 2021-06-04 16-42-39-087.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/0ff09cfb-c792-001e-4d7d-449e16e4d0f5.jpeg)

このデータフレームに対して、
「都道府県名が北海道の行だけを抽出して、市区町村名でgroupbyして、市区町村ごとの面積の平均値をだす」という操作を行いました。

```python
df[df["都道府県名"]=="北海道"].groupby('市区町村名').mean()
```

すると、以下の結果が返ってきました。

![bandicam 2021-06-04 16-42-50-223.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/c8d272cf-fd9c-26b4-576d-7805d2c95df4.jpeg)

北海道にはあきる市や鹿児島市などはもちろんありません。

また、元のデータフレームは47都道府県、618種類の市区町村があります。
うまく抽出ができていないのかと確認したところすべて北海道、市区町村の数は18個になっていました。

![bandicam 2021-06-04 17-48-35-276.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/fc8c8e09-b333-e973-97fa-1a6074082eac.jpeg)

ここでデバックしていて、`Categories`になぜかすべての市区町村名が入っています。おそらくこれが原因なのですが、よくわからずという状態でした。 

しかし、このデバックが解決への道となるのでした。

# 解決方法

原因はこの市区町村名のデータ型が`category型`だったことでした。

実は、LightGBMを動かしており、以下のような処理を前処理として行っていました。

![bandicam 2021-06-04 21-14-50-770.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/d12eeff7-3213-493d-851e-1b3f4016fd88.jpeg)

この処理が原因となっていました。
ですので、この処理をしないことで無事、groupbyが成功しました。

![bandicam 2021-06-04 21-15-58-832.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/c740ba6c-8b27-d511-72a3-8c9f2ef10511.jpeg)

また、どうしても`Category型`で行いたい場合はこのような方法で実現できます。

```
data.groupby(['都道府県名', '市区町村名'], observed=True).mean()
```

`observed=True`で実現可能です。

# おわりに

DataFrame関係はわからないことばかりですが、同じような問題を例題として用意し、`teratail`や`stack over flow`などで質問してみるとスマートな回答が返ってくることが多いです。

サービスはどんどん活用していくべきだと思います。

# 参考サイト
[Pandasのgroupbyがうまく機能していないので教えていただきたいです。
](https://ja.stackoverflow.com/questions/77334/pandas%e3%81%aegroupby%e3%81%8c%e3%81%86%e3%81%be%e3%81%8f%e6%a9%9f%e8%83%bd%e3%81%97%e3%81%a6%e3%81%84%e3%81%aa%e3%81%84%e3%81%ae%e3%81%a7%e6%95%99%e3%81%88%e3%81%a6%e3%81%84%e3%81%9f%e3%81%a0%e3%81%8d%e3%81%9f%e3%81%84%e3%81%a7%e3%81%99)
[Pandas groupby with categories with redundant nan](https://stackoverflow.com/questions/48471648/pandas-groupby-with-categories-with-redundant-nan)
Tips: Prestoで中央値を計算する

SQLでは一般的に中央値をとる場合、`MEDIAN`関数を用いると思います。
しかし、Prestoには`MEDIAN`関数が存在しません。
そのため、Prestoでは代わりに`APPROX_PERCENTILE`関数を用いて以下のように中央値を計算します。

```sql
SELECT APPROX_PERCENTILE(column, 0.5) AS median
```

この関数を用いることで四分位数なども計算することができます。


## 最後に

この記事は

https://qiita.com/official-events/d523df99d6479293ffa7

の参加記事です。
Laravelのルーティングでパスを取得


URLを取得できるコマンド

```PHP
$uri = \Route::current()->uri();
```

```PHP

<?php

Route::get('/practice', function () {
    return '現在のURL:'.$uri = \Route::current()->uri();
});

```



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/3bf61853-d309-d0f8-0b31-7a8dc8563e76.png)





# コマンド

## cd laravel_bbs

## php artisan serve --port=$PORT

## preview ボタンを押下

## preview ボタンを押下

## https://ドメイン名/<font color="Red">practice</font>で検索
AWSコンソールの画面操作を録画してCloudFormation定義を生成する(Console Recorder for AWS)

# 1. はじめに
以前書いた[記事](https://qiita.com/ka2taka/items/787422050f0b5381d756)でとりあげたformer2の作者が開発した「Console Recorder for AWS」というものを試しました。


# 2. 「Console Recorder for AWS」とは
簡単に言うと、AWSコンソールの画面操作を記録して、画面から設定した内容をCloudFormation定義等に変換してくれるものです。
変換対象の形式は次の通りのようです。
- Boto3
- CloudFormation
- Terraform
- Troposphere
- CDK
- AWS CLI
- IAM
- JavaScript
- Go SDK
- Settings

公式サイトは以下のようです。
[GitHub Page](https://github.com/iann0036/AWSConsoleRecorder)
[使い方](https://github.com/iann0036/AWSConsoleRecorder/blob/master/README.md)

開発者はAWSのコミュニティヒーローに認定されてるようです。
[最新の AWS ヒーローの発表 – 2020 年 8 月](https://aws.amazon.com/jp/blogs/news/announcing-the-newest-aws-heroes-august-2020/)

# 3. 本編（使ってみた）
## 3-1 「Console Recorder for AWS」の導入
WEBブラウザにプラグインを入れるだけです。対応するブラウザは次の通り。
- Firefox
- Chrome

今回はChromeで試します。

### (1)プラグインの導入
- [Chrome WEb Storeへ](https://chrome.google.com/webstore/detail/console-recorder-for-aws/ganlhgooidfbijjidcpkeaohjnkeicba)
- [Chromeに追加]を選択。
- [拡張機能を追加]を選択。

### (2)プラグインをツールバーに表示させる
「Console Recorder for AWS」アイコンが常に表示されたほうが便利なので「固定する」を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324770/015cb01b-3fe4-e570-0aae-ad9200613ebc.png)


## 3-2 AWSのコンソールに入る
普通にAWSコンソールに入りましょう。
今回はIAMuserの追加で試すのでIAMへ移動します。

## 3-3 録画を開始してIAMuserを追加する
### (1) 録画を開始
[Start Recording]を押しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324770/8d2096db-17ce-acef-ef8a-3faf6a55715c.png)


### (2) ユーザを追加
操作の途中は割愛しますが以下のようにユーザ作成が完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324770/f0996a75-af9f-9372-eb22-3c31d813ba64.png)


### (3) 録画を停止
[Stop Recording]を押しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324770/63152e4b-899e-8481-a0b2-2083a486fd1b.png)


## 3-4 作成されたCloudFormation定義を見る
良い感じに定義が生成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324770/fc0e5fcf-6ea8-1214-9f15-f71cd495d2e1.png)



# 4. 最後に
生成されたCloudFormationをブラッシュアップすれば、生産性高くCloudFormationの開発が可能になります。
また、このツールはAWS用のツールを開発する人にとっても凄い役に立ちそうです。
AWSから発行されたAPIをトレースしているようなので、AWSの操作するためのAPIを確認する事もできます。

たとえばIAMの画面を操作すると以下のようなpythonコードが生成されてます。

```
import boto3

iam_client = boto3.client('iam', region_name='us-east-1')

response = iam_client.list_policies()
response = iam_client.list_groups()
response = iam_client.create_user(
    UserName='ops-user',
    Path='/'
)
response = iam_client.list_users()
```

この通り、user一覧の取得方法が簡単に確認する事ができます。
[Console Recorder for AWS]の開発者は天才ですね。
【論文紹介】メタクッキー(感覚間相互を用いた味覚ディスプレイの検討) 

#論文紹介
論文：メタクッキー--感覚間相互作用を用いた味覚ディスプレイの検討
著者：鳴海 拓志, 谷川 智洋, 梶波 崇 他
https://www.jstage.jst.go.jp/article/tvrsj/15/4/15_KJ00007408751/_pdf

#どんなもの
　視覚・嗅覚・味覚の間の感覚相互作用を使ってクッキーの風味を様々に変化させるシステム(メタクッキー)
→プレーンクッキーの見た目と匂いを変えることで、プレーンクッキーとは異なる食味を認識させることができた。具体的には、システムによって味が変化したと答えた人は79.3%、味が選択したものに変化した人は7割だった。ただ、クッキーとしてなじみのないキノコ味においては、キノコ味と感じた人は4割にとどまった。
→風味を認識するための要素として記憶や経験も重要な役割をはたしている可能性を示した。

#先行研究と比較してすごいところ
　これまでの情報提示技術は視覚と聴覚を対象にしたものが多いが、この論文では味覚ディスプレイを用いている。化学物質の合成で味を提示するシステムは存在するが、「味」は化学物質の反応だけではない。実際には「味」は味覚以外の感覚(嗅覚・視覚・触覚・聴覚)を含んだものとして知覚する。この論文では、化学情報を変化しなくても他の情報(視覚と嗅覚)を変えることで味を変化させた。


#技術や手法のキモ
　味覚情報を提示するときに味覚以外の感覚を付随して味覚の元となる化学信号を変えずに、付随の情報(見た目と匂い)だけを変化させることで、味の認識だけを変化させる手法。
　カメラによって認識可能なARマーカのついたクッキーを作成した。クッキーを食べるときに、クッキー認識部のカメラがマーカー付きクッキーを認識し、クッキーと被験者の鼻や口との間の距離を計算する。これによって、クッキーと被験者の距離に応じた強さのにおいを提供する。<font color="gray">(クッキーを食べている最中には強い匂いを提示する)</font>
　2台のカメラを使ってクッキーを認識して、マーカ付きクッキーの上に重ねて実写のクッキーを表示させる。<font color="gray">これによって、被験者はマーカ付きクッキーを手にしてるのにも関わらず、選択した味のクッキーを手にしているかのような感覚になる。</font>

#検証方法
　<font color="gray">被験者はHMDに2つのカメラと嗅覚ディスプレイが取り付けられた装置を装着して、マーカー付きのクッキーを食べてもらう。
　被験者に食べたい味を選択して、メタクッキーシステムでその味を選択する。１枚のクッキーを手に取ってテクスチャと匂いをつけて見てもらってから食べてもらう。その後プレーンクッキーも食べてもらう。</font>
　被験者に味の評価を質問紙に記入してもらう。(システムによって作られた質感と匂いがあったときに感じた味がプレーンクッキーと同じだったか、違った場合何味と感じたか回答してもらう)
　
#議論
　プレーンクッキーにマーカを焼き付けることで、味は常識的な味の範囲であり感覚間相互作用の効果に影響がないのは本当なのか。(香ばしさが増すということは影響しているのでは？)　
　食感を同じにすることはできないのか？(結果の自由回答に「食感を気にしなければほとんど選択したクッキーの味だった」とあった)

#気になった論文
　食品の味がする印刷物を作るシステム
SwiftUI で 電子コンパスの値を取得

##概要
iOSアプリで電子コンパスを使いたいので
SwiftUIでコンパス情報取得して地図を回すだけの単純なサンプルを作成してみた。


##CoreLocationサービスを使うための準備
アプリの info.plist の
`Information Property List` に
`Privacy - Location When In Use Usage Description`
を追加し、
「地図、電子コンパス情報を取得するために使います」
といった適当な文字列を設定する。


##ソースコード

`LocationManager.swift`ファイルを追加して北方向への角度情報(heading)を `@Published` で発行する
`ContentView.swift` 内でMap(...) を使って地図を表示し、角度情報(heading)を受け取って地図を回転させます。


``` swift:LocationManager.swift
import MapKit

class LocationManager: NSObject, ObservableObject, CLLocationManagerDelegate {

    @Published var heading:CLLocationDirection = 0.0
    let manager = CLLocationManager()

    override init() {
        super.init()
        
        manager.delegate = self
        manager.requestWhenInUseAuthorization()
        
        //電子コンパス設定
        manager.headingFilter      = kCLHeadingFilterNone
        manager.headingOrientation = .portrait
        manager.startUpdatingHeading()
    }
    
    //電子コンパス値取得
    func locationManager(_ manager: CLLocationManager, didUpdateHeading newHeading: CLHeading) {
        self.heading = newHeading.magneticHeading
    }
    
}

```

LocationManagerクラスが発行した regionを取り出してMapで地図を表示し、headingを取り出して rotationEffect()で地図を回転させる。

```swift:ContentView.swift
import SwiftUI
import MapKit

struct ContentView: View {
    
    @ObservedObject var manager = LocationManager()
    @State var region = MKCoordinateRegion()
    @State var trackingMode = MapUserTrackingMode.follow
    
    var body: some View {
        let heading   = $manager.heading.wrappedValue
        let latitude  = $region.center.latitude.wrappedValue
        let longitude = $region.center.longitude.wrappedValue

        VStack{
            Text("緯度：\(latitude) 経度： \(longitude)")
            Text("北方向: \(heading)")

            Map(coordinateRegion: $region,
                showsUserLocation: true,
                userTrackingMode: $trackingMode)
                .clipShape(Circle())
                .overlay(Circle().stroke(Color.white, lineWidth: 4))
                .shadow(radius: 10)
                .padding(40)
                .edgesIgnoringSafeArea(.bottom)
                .rotationEffect(Angle(degrees: -heading))
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
```

##画面表示
上部に緯度経度、北方向を表示し、中心に丸く切り取った地図を表示します。
iPhoneを動かすことで地図が回転します。

![IMG_2D8923F29832-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481708/1f1b6c7e-7718-78d2-265b-333d3868114a.jpeg)



##感想
### R03/06/04
想像以上に簡単にできた

### R03/06/10
ソースを簡略化
学生の就活について思ったこと

#はじめに
就活が終わって（数ヶ月経ちましたが...）区切りが良いと感じたので初投稿してみました。
専門外の分野からエンジニアを目指してみて感じたことをメモ程度に残しておこうと思います。
エンジニアを目指す学生向けの記事です。

#自己紹介
はじめまして、Mirouと言います。
現在、大学生で専門は化学です。
2020年の夏頃からプログラミングを学んで、2021年に都内の自社開発企業に内定をいただきました。
趣味は筋トレ、アニメ、読書、プログラミングなどです。

#最初に学ぶプログラミング言語について
僕はバックエンドの言語としてRubyを勉強しましたが、正直なんでもいいと思ってます。
Webアプリとかスマホアプリとか自分が作りたいものに合わせて言語は選べば良いと思いますが、いきなり機械学習やAIからやるのはかなり難しいと思います。（スマホアプリがどのくらいの難易度なのかわかりませんが...）
初心者の段階であれば自分がバックエンドをやりたいのか、フロントエンドをやりたいのか分からないと思うのでどちらも経験しておくことをオススメします。
ちなみにRubyの文法は難しくないですし、日本語のドキュメントが多くて勉強しやすいです。
C#に関して検索した時は日本語の情報が少ないと感じたこともあります。


#学生がプログラミングスクールに通うことについて
正直に言うと、学生が何十万も払ってプログラミングスクールに通う必要はないと思っています。
学生であればProgateやUdemyなどのお金のかからないものを利用しつつ、プログラミングでつまづいたところを教えてくれるようなコミュニティやメンターを見つけることをオススメします。
とりあえずポートフォリオを作ることをゴールに勉強して、ポートフォリオが完成したら学生バイトやインターンに参加したほうが良いです。未経験でも参加可能なインターンもあるのでそれでも良いと思います。　＊業務内容は要チェック！！
そのほうがお金もかかりませんし、実務を経験することでかなりスキルアップすると思います。
人気の高い企業とかになってくるとインターンやハッカソンなどでのチーム開発経験を聞いてくるところもあります。

#コーディングテストについて
人気の高い企業になってくるとほぼコーディングテストがあり、一部の規模の小さい企業でもコーディングテストがありました。
書類選考ではポートフォリオがかなり重要になってきますが、コーディングテストができなければそもそも書類選考や面接の段階にも行けません。
なのでコーディングテストに関してはアルゴリズムを勉強した方が良いと思います。
具体的にはPaizaやAtcoderなどの競プロをやってみると良いかもしれません。

#成果物について
成果物は必須です。
とある就活イベントに参加した時に聞いたのですが、成果物を作っている学生は全体の２０％くらいしかいないそうです。
非情報系の学生でエンジニアを目指している人は、学校でプログラミングを学んでいないけど選考に進めるか心配するより何も考えずにまずはプログラミングを勉強しましょう！！
面接のフィードバックをいただいたときに、成果物に関して行動力があると評価された時もありました。
ただ、成果物があれば有利というわけではなく、書類が通ってしまえばあとは面接などで評価されるので、成果物を作ってようやくスタートラインに立てると考えた方が良いかもしれません。
※あくまで自社開発企業の話です。SIerなどは受けていないので分かりません。

#情報収集について（メッチャ大事！！）
非情報系の学生であれば（情報系の学生に関してはわかりませんが...）情報収集に関しては非常に重要だと思います。
エンジニアになるためにやるべきことを調べたとしても、ほとんどが知らない単語ばかりで検索してはまた検索するような感じでした。
僕の場合はとにかく情報収集をして知識をつけていくことで解決していきましたが、分からないことが分かるようになったのも束の間、また分からないことが発生するというような地獄のループでした。（今はこの経験のおかげでかなり成長したと思いますが、かなりしんどかったです笑）
僕のこんな経験からもSNSやオンラインコミュニティなどを活用して、エラーや就活に関してのアドバイスをくれる環境を作るということをオススメします。
参加するコミュニティなどによってはプログラミング関連の質問以外の質問もできるところもあるので色々と試してみると良いかもしれません。
月1000円かかってしまいますがリベシティがオススメです。
副業やプログラミング、投資に関して詳しい方がアドバイスしてくれます。最初の１ヶ月間は無料なのでお試しにやってみるのも良いと思います。

#最後に
僕がキャリアアドバイザーの方に自社開発企業に行きたいと言った時は「かなり厳しいよ」とばかり言われましたが、結果で言うと15社応募/4社書類落ち/6社面接落ち/3社辞退/2社内定という結果でした。全て自社開発企業です。
好奇心旺盛だったところや、専門外の分野でもプログラミングを学んで成果物を作っている行動力などが評価されていました。

まとめると
①成果物はほぼ必須！！
②人気の企業に行きたい場合はコーディングテスト対策もする！！（企業による）
③質問できる環境を作る！！
個人的にまずは以上の3つが大切だと思います！！
就活は終了しましたが、僕もいつでも転職ができるようにまだまだやらなければいけないことがたくさんあります！！
納得のいく人生を送るためにも一緒に頑張りましょう！！
***
初登校なので構成を編集したり、就活に関して新たに投稿すると思います。
ご参考になれば幸いです。