OmniAICreator/Qiita-1.07M huggingface dataset:
Font Awesome 5以降のバージョンでWebフォントを使用する方法

## 概要
Font Awesomeを`<i class="fa fa-hoge"><i>`のようなクラス指定以外での方法で使用する方法について調べたので、
備忘録としてこちらにまとめます。

クラス指定以外での使用方法では、CSS3（またはSCSS）の擬似要素`::after`または`before`を用います。

## 擬似要素を用いてFont Awesomeを使う
#### まず、Webページ上でFont AwesomeのCSSを読み込ませます。
*Rails等でFontAwesomeのGemを導入する手順を実行済みの場合は下記の手順は不要です*

```HTML:FontAwesomeを使用したページのhead内に記述する
<head>
  <title>FontAwesome5の使い方</title>
  <!-- 使用するFontAwesomeのバージョンに合わせ、"release/v5.○.○"/cssの数値を変えてください -->
  <link href="https://use.fontawesome.com/releases/v5.0.6/css/all.css" rel="stylesheet">
  <!-- 以下省略 -->
</head>
```

これでFont Awesomeが使えるようになりましたので、
#### サンプルとして、下記のHTMLに擬似クラスでFontAwesomeを使用してみましょう。

```HTML:サンプルのHTML
<body>
  <p class="sample">サンプルテキスト</p>
</body>
```

```CSS:適当なCSSファイル内に記述。sampleクラスのpタグ内に、擬似クラスでFontAwesomeのアイコンを表示させる
p.sample::after {
  content: "\f304"
  font-family: "Font Awesome 5 Free";
  font-weight: 900;
}
```

これで、サンプルテキストの文字列直後にペンのFontAwesomeアイコンが表示されるようになるはずです。

####その際のポイントは下記の通り。

- `::after（またはbefore)`で対象の要素内を指定する
- `content: "\f○○○"`で使いたいアイコンを指定する（アイコンコードは[FontAwesome公式サイト](https://fontawesome.com/icons?d=gallery)参照
    - その際、**"\（バックスラッシュ）"をコードの先頭につけること**
- font-familyで`"Font Awesome 5 Free"`（有料版はFreeではなくPro、BrandsならBrands）と記述
    - _※FontAwesomeのバージョンが５になる以前は`font-family: FontAwesome;`の指定だけでOKでした_
- font-weightでアイコンの種類（solidかregularなど）を指定

#### また、font-weightで指定するアイコンの種類の数値はこちら
- font-weight: 900; <= Solid
- font-weight: 400; <= Regular
- font-weight: 400; <= Brands
- font-weight: 300; <= Light (Pro)

#### アイコンではなく四角い枠が表示されてしまう場合
FontAwesomeのCSSかfont-familyまたはアイコンコードの指定が間違っている可能性が考えられます。


*記事の内容に間違いがございましたら、コメントの方にてご報告いただけると幸いです*
Ruby on Railsでの頻出単語(まとめ)

Ruby on Rails似て、よく出てくる単語の意味をまとめたものです。
辞書的に使っていただけると幸いです。


[データベース関係]

rails g model テーブル名(はじめ大文字) カラム名:データ型
新しくテーブルとカラムを作るときに、ターミナルで使う

rails g migration ファイル名
テーブルに新しくカラムを追加するときに、ターミナルで使う

add_column :テーブル名, :カラム名, :データ型
マイグレーションファイルに、新しいカラム名を追加するときに使う

rails db:migrate
データベースに変更を加えるときに、ターミナルで使う



[コントローラー関係]

session
ページを移動してもユーザー情報を保持し続けるための変数
ログイン機能で使われることが多い

session[:キー名] = 値

ログアウトでは = nilとすることで保持を辞めることができる


[メソッド]

whereメソッド
ある条件に合致する「複数の」データを取得する

countメソッド
配列の要素数を取得するメソッド


[その他キーワード]
gem
RubyやRailsでプログラミングをする際に「よく使う機能」をパッケージ化したもの。「検索機能を作るgem」や「暗号化するためのgem」など様々なgemが存在し、Railsにインストールすることで使用することができる
macOSで外部IPをクリップボードにコピーするコマンド

これだけ。 httpbin.org の出力を jq でパースしておしまい。 

```
$ curl -s https://httpbin.org/ip | jq .origin | pbcopy
```

`"` を外す場合は `jq -r .origin` と指定する。

```
$ curl -s https://httpbin.org/ip | jq -r .origin | pbcopy
```
[iOS]XcodeのInfo.plist

## 概要
iOSアプリの開発したことない状態で、iOSアプリの検証してて、「Info.plistでどうたらすればいいんじゃね？」
みたいなこと言われて、よくわかんなかったので調べて自分の理解を自分の言葉でまとめたもの。

そもそも漠然としていだいていた疑問として以下があった。

- Build Settingsとかとどんな位置づけの違いがあんねん・・・。
- ユーザー自身が定義する定数を記載できるらしい？User-Definedとかいうのも聞いたことあんぞ・・・
- っていうかInfo.plistとかいうファイル、今の案件のプロジェクト内に見当たらないんだが・・・

## Info.plistとは？

ざっくりいうと以下の設定を行うというファイルらしい。

- **実行ファイルを実行するシステムにあらかじめ知らせておくべき情報**
- **ビルド時のユーザー定義定数**(ただし、Configure毎に分けたい場合は、その値はBuild SettingsのUser-Definedに記述)

**Build Settingsとの位置づけの違い**

Build Settingsは、その名の通りビルド(=ソースコードをコンパイル)して実行ファイルを作る際の設定だが、
Info(Info.plist)は、

**実行ファイルを実行するシステムが、実行ファイルを読むときにあらかじめ知っておく必要のある設定**

が主な位置づけみたい。

https://developer.apple.com/documentation/bundleresources/information_property_list

を見た感じだと。

**User-Definedとの関係**

Build SettingsのUser-Definedでソース内で利用する定数をConfigure(デフォルトでDebug, Releaseが用意されているアレ)毎に設定でき、その定数を読み込むためにはInfo.plist経由で読む必要があって、Info.plistにもUser-Definedで定義した定数について記述してやらないとダメ、ってことらしい。

https://medium.com/@abhishek1nacc/user-defined-build-setting-f4bba59a5d6c

を見た感じだと。

加えて、Configureによらない定数は、Info.plistに直接書いてもいいみたい。

## Info.plistに設定する項目
わかりやすいものとしては、以下のようなものがあるみたい。

- Bundle display name: 実機でアプリアイコンの下に表示されるアプリ表示名
- Icon file: アプリアイコン画像ファイル
- Bundle identifier: アプリのユニークキー。Apple Developer Programでも設定が必要だったような。



## Info.plistのパス設定
Target > Build Settings > Packaging - Info.plist Fileで設定する。
「Info.plist」というファイル名である必要はない模様。


## 参考
[Information Property List](https://developer.apple.com/documentation/bundleresources/information_property_list)
[Info.plist - iPhoneアプリ開発の虎の巻](https://iphone-tora.sakura.ne.jp/iphone_infoplist.html)
[User Defined Build Setting](https://medium.com/@abhishek1nacc/user-defined-build-setting-f4bba59a5d6c)
[備忘録]anaconda&VScodeでpythonのimportエラーに手こずった話

<h2>はじめに</h2>
ターミナルでpythonを実行するとモジュールのインポートでエラーが出てしまいました。今回はその備忘録です。
<h2>環境</h2>
mac：Big Sur
エディタ：VScode
Python：3.8
<h2>トラブル内容</h2>
VScodeで書いたpythonファイルをターミナルで実行するとそんなモジュールねぇよって怒られる。
でもインポートしてるのnumpyだし、ないわけないじゃん！！てことでひたすらググったら
どうやらターミナルから使用するpythonとVScodeで設定したpythonが異なるとインポートエラーが起こる模様

<h2>解決方法</h2>
ターミナルで

```
pip show numpy
```

と入力してLocationのところを見る。自分の場合は

```
anaconda3/lib/python3.8/site-packages
```
となっていてanaconda3の中のpythonを使用していた。なのにVScodeで/usr/bin/python3を指定
していたのでエラーが出てしまった。わかれば簡単なことだったなぁ。


<h2>後日談</h2>
このトラブルを解決した数日後にまたしても同じエラーが起きた。今回は使用するpythonも一致しているのにどしてと思ってまたひたすらググる。結果としては、モジュールのバージョンが古かったらしい。
なので

```
pip install -U numpy
```
とすることで解決。numpyのところをエラーの出ているモジュール名に変えれば汎用できます。
ちなみに

```
pip list -o
```
とするとバージョンの古いやつが一覧で表示されます。
統計検定2級：１ヶ月合格記事まとめ

以下の記事を参考にした自分の学習計画11/24~ 12/25 12/26受験
（最小限しかやらない方向で・・・）
11/24~11/30 統計web １周流し読み
12/1〜　過去問６年分　2014~2019 （１２回分）を２周する　２０１５年以前がCBTに近いということを加味。
平日1日１回分、休みは２回分とし、一週間のうち２平日は何もできないと想定。
これだと２４回やるところ２１回しかできない・・・・最後の後半の追い込みに期待。残業発生しないでくれ・・・

ほかにもわからないときに統計webに戻ったり、すでに購入済みのマンガでわかる統計学を読んだりしたい。
そこは自由時間を削っていこう。がんばれ俺。




社会人が1ヶ月半で統計検定２級に合格した勉強法https://qiita.com/shiroino11111/items/a2ffa92b7be4d926a75e
・学習時間　平日・土日ともに１〜２時間
・使用したもの　統計web、公式過去問
・CBT方式
６回分ほぼ全てを他人に説明できるレベルまでいけば合格は間違いない。


知識ゼロから１ヶ月半で統計検定２級合格した方法 - まとめノートのpdfつき -
https://note.com/idsts0118/n/n6ca7d3a582b9
・学習時間　合計１５０時間　
　統計WEB：20時間
　ノートまとめ：15時間
　過去問：110時間
　その他：5時間
使用したもの：「統計WEB」・「ノートまとめ」・「統計検定２級公式問題集（過去問）」・「YouTubeチャンネル「Yuya.K_ASN」」・「統計学演習」
・CBTは2015年より前の問題に傾向が似ている。

統計検定2級に合格したときの勉強法を公開【2019年11月最新】
https://tech-diary.net/toukei-kentei-2grade/
平日 : 1〜2時間
休日 : 6〜8時間　合計５０〜７０時間
STEP① : 統計WEBを、ひと通り読む
STEP② : 過去問を、1回分解いてみる
STEP③ : 統計WEBを、読みなおす
STEP④ : 過去6年分の試験問題を解く　できれば２周
紙方式か　優秀賞で合格　２９/35


【AIをやる前に統計学を！】統計検定2級に合格した話
https://data.nifcloud.com/blog/statistics-before-ai/
①統計WEB：統計学の時間
具体的な勉強の進め方
“STEP1.基礎編”を練習問題含め1周する
毎日2~5章ペースで（11章くらいから挫折しそうになるけど、自分のペースで毎日コツコツ）
5章ペースでやるとだいたい1週間で終わるが余裕を持って2週間のスケジュールを立てる
練習問題で間違えたところは一周したあと一気に見直す
②過去問：10年分
具体的な勉強の進め方
1日1年分、時間を計って実施
解説までその日に読み込み、間違えたところはチェック
10年やると、10日間で終了。余裕を持って2週間のスケジュールを立てる
全部終わったら、間違えたところだけを復習する
解説を見てもよくわからないところは、統計WEBのブログに詳細な解説があるのでチェック
それでもわからない場合は、以下のサイトも参考になる
AVILEN AI Trend 、 主にt検定
私がやったのは上記だけです。集中すれば、1ヶ月もあれば合格できます。大事なのは毎日1時間でもちょっとずつやることです。無理せず計画的に勉強しましょう！


知識0から統計検定2級取得を目指した話
https://qiita.com/akiyoshi_sasaki/items/8e4d7895f2647e22b5f9

今回は統計WEBを読み切るのに3週間弱くらいかけてしまったがそれを もっと流し読みにして1週間で読む
その状態でいくつか過去問を解いて理解し難い場所を知る
難しい問題が把握できた時点で、どうにかして先生をつける、過去問やってわからないところを聞く

過去6回分の問題から見ると以下のような問題が毎年必ず出題されています

母集団の推定: 標本のデータから、母集団がどんなものかを推定する
検定 (それが正しいか、正しくないかの判断): それが起こる確率、何が何個以上あればその発生は防げるか、など
確率の問題の応用: 高校数学までの確率ではなく、実際にありそうなケースからその確率を求める問題が出されるので考え方が問われる
標本の集め方の正誤問題: 標本の集め方は5~7種類くらい2級の範囲になっているが、それぞれを正しく説明できるか
回帰分析の出力結果の読み取り(毎年でてる): Rやexcelなどを使って出力した結果がそのまま問題に掲載され、それを読み取る問題

統計検定２級のためのチートシート
https://qiita.com/akiyoshi_sasaki/items/c81032c1683f69ff9d11


たったこれだけ！最短で統計検定2級に合格する方法
https://qiita.com/yuu_uu/items/751a12b235146ac6f5bf
勉強時間１〜２ヶ月
CBT　７３点
✓統計検定2級ためのチートシート
✓統計学の図鑑 (まなびのずかん)
✓統計web
✓過去問
1. kindle unlimitedで購入できる過去問
2. 統計検定HPで過去問演習
✓youtube予備校のノリで学ぶ「大学の数学・物理」
gRPC入門で読んだ記事やツールまとめ

## gRPCって何？を理解するのにおすすめのサイト

-[gRPCって何？](https://qiita.com/oohira/items/63b5ccb2bf1a913659d6)
- [サービス間通信のための新技術「gRPC」入門](https://knowledge.sakura.ad.jp/24059/)
- [マイクロサービスバックエンドAPIのためのRESTとgRPC](https://www.slideshare.net/disc99_/apirestgrpc)
- [gRPCによるKotlin & Ruby & Reactという構成でのWeb運用](https://blog.engineer.adways.net/entry/2018/03/23/190820)

## 公式ドキュメント

https://cloud.google.com/apis/design/naming_convention
https://developers.google.com/protocol-buffers/docs/proto3

## gRPCのCUIクライアントツール

### evans

https://github.com/ktr0731/evans/blob/master/README.md

導入している企業の記事
- [gRPC と gRPC クライアントツール Evans](https://engineering.mercari.com/blog/entry/grpc_and_evans/)
- [gRPCのデバッグにはevansを使うと便利](https://narinymous.hatenablog.com/entry/2018/04/14/043908)

evans 0.9.1 時点では、文字列のオプショナルのパラメータをスキップさせるために未設定でリクエストすると、勝手に空文字が設定されてしまうというケースが確認された。挙動に注意。

### その他のツール

- [gRPC の CUI のクライアントツールを調べてまとめてみた](https://www.techscore.com/blog/2019/09/26/grpc-cui-client-tools/)
- POSTMANを拡張して動作確認をする方法もある模様。https://github.com/jnewmano/grpc-json-proxy





最後まで読んでくださりありがとうございました。
他にもあれば是非教えてください。
Refileの使い方

## ImageMagickをインストール
本番サーバーとか開発環境に`image-magick`がないと動かないのでインストールしておく。

```zsh:インストールされてるか確認
$ convert -version #以下のようにVersion: ImageMagick バージョン名が表示されていればOK
Version: ImageMagick 7.0.10-38 Q16 x86_64 2020-11-16 https://imagemagick.org
Copyright: © 1999-2020 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI 
Delegates (built-in): jng jpeg png tiff zlib
```
```zsh:インストール方法(Cloud9の場合)
$ sudo yum -y install libpng-devel libjpeg-devel libtiff-devel gcc
$ cd ~
$ wget http://www.imagemagick.org/download/ImageMagick.tar.gz
$ tar -vxf ImageMagick.tar.gz
$ ls
$ cd ImageMagick-x.x.x-xx
$ ./configure
$ make
$ sudo make install
```

## Gemをインストール
```rb:Gemfile
gem "refile", require: "refile/rails", github: 'manfe/refile'
gem "refile-mini_magick"
```
```zsh
$ bundle install
```

## 画像データを保存するカラムを追加
Userモデルに`thumbnail`というカラム(サムネイル画像名を保存するカラム)を追加します。

```zsh
$ rails g migration AddThumbnailToUser thumbnail_id:string
```
```rb
class AddThumbnailToUser < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :thumbnail_id, :string
  end
end
```
```
$ rails db:migrate
```

## modelを修正
追加したカラム名から`_id`を抜いた部分をattachmentとして設定

```app/models/user.rb
class User < ApplicationRecord
  attachment :thumbnail # 追加
end
```

## ファイルアップロードのform
`<%= f.attachment_field :thumbnail %>`でフォームの画像アップロード部分を設置

```erb
<%= form_with model: @user, local: true do |f| %>
  <div>
    <%= f.label :name %>
    <%= f.text_field :name, class: 'form-control' %>
  </div>
  <div>
    <%= f.attachment_field :thumbnail %> <!-- 追加 -->
  </div>
  <%= f.submit class: 'btn btn-success' %>
<% end %>
```

## strong_parametersを修正
```app/views/controllers/users_controller.rb
class UsersController < ApplicationController
  
  private
  def user_params
    params.require(:user).permit(:name, :thumbnail) # thumbnail_idではないので注意
  end
end
```

## 画像を出力
```erb
<%= image_tag attachment_url(@user, :thumbnail, :fill, 100, 100) %>
```

## Runtime Errorが表示された場合
```bash:.env
REFILE_SECRET_KEY=hogehoge #エラーメッセージ内Refile.secret_keyの値
```
```zsh
$ touch config/initializers/refile.rb
```
```config/initializers/refile.rb
Refile.secret_key = ENV['REFILE_SECRET_KEY']
```
最後にサーバーを再起動して環境変数を読み込む
(Intel) Big Sur でErlangをビルドする方法(kerl/asdf編)

**追記: Erlang/OTP 23.2.1 では特に設定することなく Intel Big Sur でビルドできました。この記事も過去のものになったようです。ただし M1 Big Sur では別の原因でエラーになりますのでご注意ください**

Apple Silicon M1チップ搭載の Mac が話題です。私も予算を調整してMac miniを発注しました。2020年12月3日に届くそうです。楽しみ！

今日はIntel MacのiMac ProをBig Sur 11.0.1にアップグレードしました。Catalina 10.15.7のSSDの内容を引き継いでのアップデートだったので，**元からインストールされていたElixirやErlangは問題なく動作しました。**これについては想定内だったのですが，言及している記事があまりなかったので，明記しておきます。

さて問題はBig SurでErlangをビルドすることができるか？です。結論から言うと，スルッとは入らず，少し手間がかかります。

# 前提条件

前提ライブラリを全て HomeBrew などでインストールした後だと仮定します。

# asdfの場合の手順

出典: https://github.com/asdf-vm/asdf-erlang/issues/161

私の環境では未検証ですが，おそらく動くと思います。どなたか確かめてください。

1. たとえば 23.1.4 をビルドするとします。
2. `asdf install erlang 23.1.4` を実行します。ここで一旦エラーが出て終了します。
3. `cd ~/.asdf/plugins/erlang/kerl-home/archives`とします。
4. `tar zxvf OTP-23.1.4.tar.gz` を実行します。
5. エディタで `~/.asdf/plugins/erlang/kerl-home/archives/otp-OTP-23.1.4/make/configure.in` を編集します。
6. `tar cfz OTP-23.1.4.tar.gz otp-OTP-23.1.4` を実行します。
7. `rm -rf otp-OTP-23.1.4` とします。
8. もう一度 `asdf install erlang 23.1.4` を実行します。するとビルドできます！

2で出るエラーは次のようなものです。

```
configure: error: 

  You are natively building Erlang/OTP for a later version of MacOSX
  than current version (11.0.1). You either need to
  cross-build Erlang/OTP, or set the environment variable
  MACOSX_DEPLOYMENT_TARGET to 11.0.1 (or a lower version).
```

5では415行目の次の記述を

```config
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > $int_macosx_version
```

次のように編集します。

```config
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > $int_macosx_version && false
```

# kerlの場合の手順

2020/12/11追記: kerlのHEADで，OTP23.1.5だとうまくいくようです。

1. `kerl`をHomebrewですでにインストールしていたら，`brew unlink kerl`とします。
2. `brew install kerl --HEAD`とします。
3. たとえば 23.1.5 をビルドするとします。
4. HomeBrewでOpenSSL 1.1をインストールしている場合は，`export KERL_CONFIGURE_OPTIONS="--with-ssl=/usr/local/opt/openssl@1.1"`のようにSSLのライブラリを指定します。 
5. `kerl update releases`として，最新版を取り寄せます。
6. `kerl build 23.1.5 23.1.5` とします。
7. `kerl install 23.1.5 ~/kerl/23.1.5` とします。

# 将来展望

たぶん，近いうちに不具合修正して，通常のインストールフローでビルドできるようになると思います。それまでの暫定的な記事としてください。
Ruby初心者の学習過程まとめ記事#1

#はじめに

こんにちは。初投稿です。
この記事はRuby初心者の私がRubyを学習した過程をまとめた記事です。
目的は学習した内容を自分の手でまとめることで知識の定着をさせることです。
また、公開する事でたくさんの人の意見を聞くことが出来れば幸いです。
恐縮ではありますが、間違っている箇所や改善点があればご教示願います。

#学習環境

環境：AWS Cloud9
バージョン：Ruby２.５.1
教材：Udemy "はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう"

#Rubyとは

まつもとゆきひろ氏を中心に開発されている**オープンソース**の**プログラミング言語**のことです。
特徴として
・オブジェクト指向
・シンプルな文法
・強力な標準ライブラリ
・国際標準として規格化されている
が挙げられます。
私的にはチーム開発をする時など複数人で作業をするときに利用しやすいプログラミング言語って感じで認識しています。（他の言語に触れたことが少ないので断言出来ませんが、、、）

#Rubyを実行する方法

・irbを利用する
・.rbファイルを作成して、そのファイルのプログラムを実行する

複雑なプログラムを実行する際にはファイルを作成した方が良いが、簡単なプログラムの確認をする際にはirbを利用した方が手軽で便利です。

#irbの使い方

irbの起動：'irb'と入力してEnterキーを押す
irbの終了：'exit'と入力してEnterキーを押す
コードのクリア：controllキー+Lキーを押す

```
Cloud9User:~/environment $ irb
2.5.1 :001 > puts 1+1
2
 => nil 
2.5.1 :002 > exit
Cloud9User:~/environment $ 
```
解説：irbで1+1の計算結果が出力されることを確認

#Linuxコマンド（ターミナルで使うコマンド）

・フォルダを作成する：　mkdir フォルダ名

```
Cloud9User:~/environment $ mkdir qiita
```
解説：**qiita**という名前のフォルダが作成される

・現在のフォルダ内にあるファイルやフォルダの確認：　ls

```
Cloud9User:~/environment $ ls
qiita  README.md  ruby_projects
```
解説：**qiita**フォルダと**README.md**ファイルと**ruby_projects**というファイルがあることを確認

・フォルダの移動：　cd 移動したいフォルダ名

```
Cloud9User:~/environment $ cd qiita/
Cloud9User:~/environment/qiita $ 
```
解説：**qiita**フォルダに移動

・空のファイルの作成：　touch ファイル名

```
Cloud9User:~/environment/qiita $ touch qiita.rb
```
解説：**qiita.rb**というファイルを作成

・プログラムの実行：　ruby ファイル名

```
Cloud9User:~/environment/qiita $ ruby qiita.rb 
Hello,Qiita!
```
解説：**qiita.rb**のファイルが実行され、ファイル内のプログラム内容が出力されている

・現在の階層を表示：　pwd

```
Cloud9User:~/environment/qiita $ pwd
/home/ec2-user/environment/qiita
```
解説：一番右に記載されている**qiita**フォルダが現在の階層　左側は親のフォルダ

・一つ上の階層に移動する：　cd ..

```
Cloud9User:~/environment/qiita $ cd ..
Cloud9User:~/environment $ 
```
解説：**qiita**フォルダの一つ上の階層に移動

#最後に

今回は**Rubyとは**、**Rubyを実行する方法**、**irbの使い方**、**Linuxコマンド**についてまとめました。
次回はrbファイルにプログラミングしていく内容をまとめます。
クイックフォーマット後に失われたデータを復元する方法は

　「昨日、ユーザーはYahoo知惠袋で質問しました：クイックフォーマット後にお気に入りの音楽を復元する方法は？ お気に入りの音楽をすべて失ってしまいました。 それを取り戻すのを手伝ってください。 どうもありがとうございました。」


　心配しないでください。この記事ではフォーマットとは何かを紹介し、<A HREF="https://jp.bitwar.net/course/format/384.html">クイックフォーマット 復旧</A>するのに役立ちます。

 
<B>フォーマットとは何ですか？</B>


　フォーマットすると、データを管理する機能を持つハードディスク上の「ファイルシステム」をリセットし、データの削除を行います。 


　フォーマットをする意味は、データを削除することが目的では無く、新たにファイルシステムを構築することが目的になります。


　フォーマットをすると、ファイルの管理をする領域を削除(インデックスを削除)するので、ファイルが何処にあるかわからなくなってしまいます。


　ただし、先述した通りフォーマットはファイルを削除するのではなく、ファイルシステムを初期化し構築し直すので、インデックス上からは見えなくなりますが、ファイル自体は消えておりません。ファイルそのものは残っていますが、パソコンからは確認できなくなるという事です。


<B>フォーマットとクイックフォーマットの違いについて</B>


　コンピュータのフォーマットには、フルフォーマットとクイックフォーマットの2種類があります。


　「フルフォーマット」と「クイックフォーマット」の違いは、フルフォーマットは時間がかかりますが、不良セクター(書き込みや読み込みが出来ない領域)をチェックして自動的に修復してくれます。また、フルフォーマットはハードドライブを完全にワイプします。つまり、フルフォーマットすると、パーティション内のすべてのデータが破壊され、後で復元することはできません。これはデータの運命です。


　クイックフォーマットは時間が短縮され便利ですが、不良セクターをチェックせず、自動的に修復します。 したがって、データが完全に削除されるわけではありません。

　重要なデータを誤ってフォーマットした場合でも、クイックフォーマットを実行している限り、データ復元ソフトウェアを使用してデータを復元できます。

   詳しくは、「<A HREF="https://jp.bitwar.net/course/format/384.html">クイックフォーマット後に失われたデータを復元する方法は?</A>」をご参照ください。
[iOS]XcodeのSchemeとTargetとConfiguration

## Scheme, Target, Configuration

ビルド時の目的に応じて、設定値や処理を分けたいときに使える機能。

- iOSアプリが通信するバックエンドシステムのURLが環境毎に異なる
- アプリのログ出力を開発フェーズ毎に分けたい(開発時、テスト時、本番リリース時)

それぞれの概念がよくわかっていないので調べて、自分がしっくりくる言葉に落とし込んでみる。

## それぞれの関係を表したイメージ図

![IMG_7188.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/220d9549-5f9f-0c02-d4d0-e92aee9b5566.jpeg)


##  Schemeとは？
ざっくりいうと、

**ビルドを伴う5つの処理(Run, Test, Profile, Analyze Archive)それぞれにおいて、採用する「Target」とTarget内の「Configuration」を紐付けてまとめてラベル付けしたもの**

Xcode4から登場した機能である。
Xcode3までは、ビルド・実行に関する大量の設定項目をビルドの目的に応じて設定、切り替えて実施していたが、
目的に応じた設定が異なる箇所は少ない(=ほとんどの部分は共通化できる)じゃんということで生まれた機能らしい。

スキームの設定画面(Product > Scheme > Edit Scheme...)では

「Build」「Run」「Test」「Profile」「Analyze」「Archive」

と並んでいるが、これらは別に上から順に実行されるわけではない。

![スクリーンショット 2020-11-24 18.00.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/52edaf40-efed-4949-6f8e-d8fcb35ea9b7.png)


実際には、ユーザーがどれを実行したいかを選択する(Product > Run/Test/Profile/Analyze/Archive)ことになる。

![スクリーンショット 2020-11-24 18.01.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/8ed6fa85-2e52-e048-d08d-817a6a771341.png)

意味合いは以下の通り。

- **Build**: ビルド(=ソースコードのコンパイル)。
- **Run**: Schemeで指定しているTargetをConfigrationの値でビルドし、選択した端末orシミュレータで実行する
- **Test**: Schemeで指定しているTargetをConfigrationの値でビルドし、ユニットテストを実行する
- **Profile**: Schemeで指定しているTargetをConfigrationの値でビルドしInstrumentsを使いつつ選択した端末orシミュレータで実行する
- **Analyze**: Schemeで指定しているTargetをConfigrationの値でビルドし、静的解析を行う
- **Archive**: Schemeで指定しているTargetをConfigrationの値でビルドし、配布可能な形式のファイル(.ipa)を生成する。


## Target

ビルド時の設定リスト。
「Signing & Capabilities」, 「Build Settings」の各設定項目については、デフォルトで「Debug」, 「Release」というConfigurationが用意されており、それぞれの値を設定できる模様。

**Signing & Capabilities**
![スクリーンショット 2020-11-24 15.53.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/bf810f38-c120-e85f-08a9-3f13599f5ae4.png)

**Build Settings**
![スクリーンショット 2020-11-24 15.49.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59542/fa338028-5e9b-b5e5-d3e4-1efe6ab64348.png)

Targetの単位は、「アプリ自体」「ユニットテスト用アプリ」「UIテスト用アプリ」というふうに大きく設定が異なる場合にTargetを分けるといいらしい。

## Configuration

デフォルトではDebugとReleaseが用意されており、同一Target内での設定値の出し分けに使う。





# 参考
[What are “analyze”, “test” and other checkboxes in “Build” part of scheme in Xcode?](https://stackoverflow.com/questions/32104847/what-are-analyze-test-and-other-checkboxes-in-build-part-of-scheme-in-xco)
[All About Schemes](https://pilky.me/all-about-schemes/)
[Xcode Profile vs Analyze](https://stackoverflow.com/questions/32767645/xcode-profile-vs-analyze)
[What is difference between build and archive in Xcode](https://stackoverflow.com/questions/23240651/what-is-difference-between-build-and-archive-in-xcode)
自動化プログラムを作りたい!

# 始め
彡(ﾟ)(ﾟ)「学外からアクセスする以外の方法で、Gaussianを利用したいなぁ」

彡(ﾟ)(ﾟ)「せや、計算機の所定のフォルダーにファイルを放り込んだら自動でかけさせたらええんや!」

彡(ﾟ)(ﾟ)「それならわいでもできるやろ()」

# 利用した物
CentOSにあるcron

python3およびそのライブラリー

# 実物
```auto.py
import os
import subprocess

path = '******'
A=os.listdir(path)
C=[i for i in A if '.com' in i] #計算したいファイルのリストを作成
L=[i.replace('.log', '.com') for i in A if '.log' in i] #計算の終了したファイルのリストの作成
G=[i for i in C if i not in L] #計算していないファイルを抽出
command1 = 'ps ax |grep g09 | grep -v grep | wc -l'
command2 = 'cd ****** | g09 '
res = subprocess.check_output(command1, shell=True)
try:
    if res==b'0\n':
        print("計算可能です")
        subprocess.Popen(command2 + G[0] + '&', shell=True)
        print("計算を実行しました")
    
    else:
        print("計算中です")

except IndexError:
    print("計算するファイルがありません")
```

```cron
*/30 * * * * /usr/bin/tcsh ./autopy.sh >>&  /*******/analog-err.log
```
色々とあって直でpythonのプログラムを動かせなかったので、迂遠な方法を利用しています

# 詰まった所
gaussian等々のPathがcronでは通ってなかった事に気づくのに結構な時間を使った件について

一個一個Pathを設定するのが面倒だったので、

cronに`printenv`の結果を張り付けるとかいう力技を行っています

だから、実際のcronの中身はもっと長いです

あと、pythonの`ps ax |grep g09 | grep -v grep | wc -l`は自力で思いついたわけじゃないです

ネットでジョブの実行状況を知るにはどうしたらいいか、

的なので検索して引っかかった物を自分なりに弄っただけです

このプログラムにおける一番の難題はこの部分でしたね…

# 終わりに
私の環境ではこれで元気に動いています

ここをこうすればもっとスマートにいくのでは?みたいなのがあったら教えてください(乞食)

ただし、python使う意味ある?全部コマンドで良くね?みたいなことに気付いた勘の良いガキは嫌いだよ

<br>
どうして私の研究室にはジョブマネージャーが無いんですか(血涙)

次の目標として、ファイルの送信・転送について自動化できればいいなぁと思っています

転送は出来てるんですけど、送信がね……

最終的にはGUIを作成したいなぁと思っていたり…

それこそGo言語で何とかできないかなぁ

おしまい
Outlookでメッセージを開封済みまたは未読にする 　＞Ctrl + Q キーを押すとメッセージが既読になり、Ctrl + U キーを押すと未読になります。

を何かマウス右クリックで
```
未読にする（（アンダーバー）N）
```
と表示があるので”Alt+n”でやっていたけど未読に出来ないです……

[ググる](https://www.google.com/search?q=%E9%96%8B%E5%B0%81%E6%B8%88%E3%81%BF%E3%81%AB%E3%81%99%E3%82%8B+%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88&rlz=1C1ROFJ_jaJP718JP718&oq=%E9%96%8B%E5%B0%81%E6%B8%88%E3%81%BF%E3%81%AB%E3%81%99%E3%82%8B%E3%80%80&aqs=chrome.2.69i57j0j0i30l6.5944j0j7&sourceid=chrome&ie=UTF-8)
と

```'google'
Ctrl + Q キーを押すとメッセージが既読になり、Ctrl + U キーを押すと未読になります。
```

と見つかりそのような働きなんですが
それだったら　マウスを右クリックして出てくる

```
開封済みにする((アンダーバー)K)
や
未読にする（（アンダーバー）N）
```
は何なのかご存知な方は調査方法をお教えいただけないでしょうか？

本件に関しては切羽詰まっていないのですが気になったので書き込み失礼致します。
Java バージョンアップによる Jenkins 起動不全

Ubuntu をアップデート後、Jenkins が起動しなくなってしまった。


## Jenkins 起動不全

```
$ systemctl status jenkins.service
● jenkins.service - LSB: Start Jenkins at boot time
   Loaded: loaded (/etc/init.d/jenkins; generated)
   Active: failed (Result: exit-code) since Sun 2020-11-15 14:20:39 UTC; 19s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1591 ExecStart=/etc/init.d/jenkins start (code=exited, status=1/FAILURE)
Nov 15 14:20:39 ip-172-31-83-123 systemd[1]: Starting LSB: Start Jenkins at boot time...
Nov 15 14:20:39 ip-172-31-83-123 jenkins[1591]: Found an incorrect Java version
Nov 15 14:20:39 ip-172-31-83-123 jenkins[1591]: Java version found:
Nov 15 14:20:39 ip-172-31-83-123 jenkins[1591]: openjdk version "11.0.9.1" 2020-11-04
Nov 15 14:20:39 ip-172-31-83-123 jenkins[1591]: OpenJDK Runtime Environment (build 11.0.9.1+1-Ubuntu-0ubuntu1.18.04)
Nov 15 14:20:39 ip-172-31-83-123 jenkins[1591]: OpenJDK 64-Bit Server VM (build 11.0.9.1+1-Ubuntu-0ubuntu1.18.04, mixed mode, sharing)
Nov 15 14:20:39 ip-172-31-83-123 jenkins[1591]: Aborting
Nov 15 14:20:39 ip-172-31-83-123 systemd[1]: jenkins.service: Control process exited, code=exited status=1
Nov 15 14:20:39 ip-172-31-83-123 systemd[1]: jenkins.service: Failed with result 'exit-code'.
Nov 15 14:20:39 ip-172-31-83-123 systemd[1]: Failed to start LSB: Start Jenkins at boot time.
```

## 解消方法

`/etc/init.d/jenkins` を以下のように編集

【Before】

```
# Which Java versions can be used to run Jenkins
JAVA_ALLOWED_VERSIONS=( "18" "110" )
```

【After】

```
# Which Java versions can be used to run Jenkins
JAVA_ALLOWED_VERSIONS=( "18" "110" "11.09" )
```

Jenkins 再起動

```
$ sudo systemctl restart jenkins
Warning: The unit file, source configuration file or drop-ins of jenkins.service changed on disk. Run 'systemctl daemon-reload' to reload units.
```

## 原因

以下のコマンドで Ubuntu をアップデートした際、Java のバージョンが上がってしまった模様

```
$ sudo apt update
$ sudo apt dist-upgrade
$ sudo apt autoremove
```

## 参考記事


[jenkins — 「サービス開始ジェンキン」を実行するとジェンキンが失敗する](https://www.it-swarm-ja.tech/ja/jenkins/%E3%80%8C%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E9%96%8B%E5%A7%8B%E3%82%B8%E3%82%A7%E3%83%B3%E3%82%AD%E3%83%B3%E3%80%8D%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B%E3%81%A8%E3%82%B8%E3%82%A7%E3%83%B3%E3%82%AD%E3%83%B3%E3%81%8C%E5%A4%B1%E6%95%97%E3%81%99%E3%82%8B/828460959/)
このプログラムの考え方が知りたい...[Ruby]

#ひな祭り
##問題
#あなたが持っている 10 体の人形を "A", "B", "C", "D", "E", "F", "G", "H", "I", "J" で表します。ひな壇の各段 (計 3 段) に並べる人形の数が与えられるので、各段にならべる人形の記号を改行区切りで出力してください。人形は必ずもとの A, B, C, ... の順番で並べます。

例)

各段にならべる人形の数: 2, 3, 5

→ 人形の並べ方:

AB
CDE
FGHIJ
#入力される値
入力は以下のフォーマットで与えられます。

h_1 h_2 h_3
ひな壇の 1 段目、2 段目、3 段目に並べる人形の数を表す整数 h_1, h_2, h_3 がこの順に半角スペース区切りで与えられます。入力は 1 行となり、末尾に改行が 1 つ入ります。
#期待する出力
ひな壇への人形の並べ方を以下の形式で出力してください。

s_1
s_2
s_3
ひな壇の 1 段目、2 段目、3 段目に並べる人形を表す文字列 s_1, s_2, s_3 をこの順に改行区切りで出力してください。

s_i (1 ≦ i ≦ 3) は i 段目に並べる人形の記号をアルファベット順に結合した文字列です。
#入力例1
2 3 5
#出力例1
AB
CDE
FGHIJ
#入力例2
1 1 8
#出力例2
A
B
CDEFGHIJ
#私の考え方
与えられる数値を

```java:
a = gets.split(" ").map(&:to_i)
```
で 2 3 5 というように切り離す。
次に

```java:
array = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J" }
```
としてsliceメソッド等で抜き出すのかなと思ったがそもそもこの時点で

```java:
Main.rb:3: syntax error, unexpected ',', expecting =>
array = {"A", "B", "C", "D", "E", "F", "G"...
            ^
Main.rb:3: syntax error, unexpected ',', expecting end-of-input
array = {"A", "B", "C", "D", "E", "F", "G", "H"...
                 ^
```
というエラーが出る。
繰り返し文でputsするのかなとも思ったが、「AB」ときて「CDE」というように続きから出力する方法がわからない。
この問題はいろんなパターンがあると思うが、そもそもプログラミング脳になっていないので解けなかった。悔しい。
どなたか分かる方いらっしゃいましたらアドバイスください。。。
#以上！
microSDが読み取れない場合は64kbのクラスタサイズでフォーマットがよい。

## きっかけ

古いmicroSDカードリーダーや機器でmicroSDが読み取れないことがあった。
今回は`400GB`のmicrosdで発生しました。

## 対応

大容量のmicroSDが認識しない場合は
フォーマットをクラスタサイズ`64KB`で行ったら認識した。
Red Hat OpenShift on IBM Cloudのバージョンアップ

# はじめに
Kubernetesのバージョンアップは頻繁に実施され、約3ヶ月に1回の頻度で実施されます。また、[Kubernetesのサポート期間は(バージョン1.19から)1年間](https://kubernetes.io/blog/2020/08/26/kubernetes-release-1.19-accentuate-the-paw-sitive/)になります。以前は約9ヶ月でしたので少し延びましたが、それでもそれほど長い期間ではないため、Kubernetesを導入する時点からバージョンアップの方針を定めておく必要があります。

一方、Red Hatが提供するOpenShiftはKubernetesをベースにしていますが、[標準のサポートは約9ヶ月、有償の延長サポートは約18ヶ月提供されます](https://access.redhat.com/ja/support/policy/updates/openshift)。

IBM Cloud上のマネージドなOpenShiftである「Red Hat OpenShift on IBM Cloud」では、[例えばバージョン4.4、4.3では約1年間のサポートが提供されます](https://cloud.ibm.com/docs/openshift?topic=openshift-openshift_versions)。

オンプレであれマネージドであれ、商用製品のOpenShiftであっても割と頻繁にバージョンアップを実施する必要がありそうです。

ただ、OpenShiftではOTA(Over-The-Air)アップデート機能により、1クリックでバージョンアップができるようになっています。また、Red Hat OpenShift on IBM Cloudでも、同様に非常に簡単な操作でバージョンアップができます。

この記事では、**Red Hat OpenShift on IBM Cloudのバージョンアップ手順**を紹介したいと思います。


# Masterノードのバージョンアップ
OpenShiftを構成するMasterノード、Workerノードのうち、まず最初にMasterノードのバージョンアップを実行します。

IBM Cloudの[OpenShiftクラスタ一覧のページ](https://cloud.ibm.com/kubernetes/clusters?platformType=openshift)にアクセスし、バージョンアップ対象のクラスタを選択します。

「アクション」→「バージョンの更新」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/f3118ed8-7e5d-cf75-9a31-3aec557b893a.png)


バージョンアップ対象のバージョンを確認し、「更新」ボタンをクリックします。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/bdd58111-45f8-49ea-d925-acb3f1bab374.png">


以下のようなダイアログが表示されます。バージョンアップには1時間ほどかかるようですのでしばらく待ちます。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/13ef8b1a-846e-1eab-528c-b42fff6b6b0a.png">


バージョンアップ後の状態は以下になります。ダイアログで指定した4.5.18にバージョンアップされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/b3c019ae-99ce-8480-2a52-80e6d55b858f.png)


# Workerノードのバージョンアップ
次にWorkerノードをバージョンアップします（MasterノードをバージョンアップしなければWorkerノードのバージョンアップは実行できません）。

対象クラスタの画面で「ワーカー・ノード」を選択し、バージョンアップするWorkerノードを選択します。バージョンアップ処理では、現在のWorkerノードが破棄され、バージョンアップ対象のバージョンのノードが新規にプロビジョニングされます。そのため、サービスを継続しながらバージョンアップしたい場合、全てのノードをまとめて実施するとサービス停止になります。また、2つのゾーンからなるマルチゾーンクラスタを構成している場合、ある1つのゾーン上の全ノードをまとめてバージョンアップすると、その期間ゾーン障害に対応できなくなります。そのため、バージョンアップするノードはこれらを考慮して選択する必要があります（ここでは説明簡略化のために全てのWorkerノードをまとめて選択しています）。

ノード選択後、「更新」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/ac0d6558-b04c-7ba2-73d8-1484471e351c.png)

以下のダイアログが表示されますので、「更新」ボタンをクリックします。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/25d8283d-2061-3832-a6c3-600ac632ce15.png">

しばらくするとWorkerノードのバージョンアップが完了し、以下のように更新後のバージョンで表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386149/7181ff35-1d4b-48cd-45d7-4d5eb7ed69d5.png)


以上のように、Red Hat OpenShift on IBM Cloudのバージョンアップは非常に簡単に実施できるようになっています。ただ、バージョンアップに伴って不具合が発生する可能性はゼロではなく、また、バージョンダウンはできない（ロールバックできない）ようになっていますので、実施にあたっては事前にきちんとテストを実施する、Blue/Greenを適用するといった対応が必要です。
続・「シューティングゲームの当たり判定をQRコード読み取りでやってみた」やつをスマホで使えるようにした。

#スマホでシューティングゲーム

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">スマホで使えるようになった！！<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a> <a href="https://t.co/XojNglWjiI">pic.twitter.com/XojNglWjiI</a></p>&mdash; sawa (@sawakoshi_yy) <a href="https://twitter.com/sawakoshi_yy/status/1331133727007592450?ref_src=twsrc%5Etfw">November 24, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#まずは前回の記事を参照してください。

[シューティングゲームの当たり判定をQRコード読み取りでやってみた]
(https://qiita.com/sawakoshi_yy/items/eafd0f2cfd17442e0932)

#構成（前回との変更点）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/737363/69d565cf-0017-7fde-c953-c240374f6c72.png)

射撃：Webアプリ内のボタン押下　→　obnizのボタン押下
カメラ：フロントカメラ　→　リアカメラ（背面カメラ）

#動かしてみたいかたは↓のURLをクリック
https://nervous-ardinghelli-c10e69.netlify.app
※リアカメラがない端末では動きません
※スマホの場合は横向きにしてください
※ご自身のobnizをご用意ください

■obnizについては↓を参照
https://obniz.com/ja/products/obnizboard

#コード

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="sawakoshi_yy" data-slug-hash="BazejLe" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="QRコードで当たり判定。トリガーはobniz">
  <span>See the Pen <a href="https://codepen.io/sawakoshi_yy/pen/BazejLe">
  QRコードで当たり判定。トリガーはobniz</a> by sawa (<a href="https://codepen.io/sawakoshi_yy">@sawakoshi_yy</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


#課題

・スマホでフルスクリーンにできない

```html
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
```

上のタグを入れてもブラウザのヘッダー・フッターが消えない
　→Webアプリに接続したら、フルスクリーンでカメラを表示させたい



・射撃時に音がでない。

```javascript
var audio = new Audio('https://soundeffect-lab.info/sound/battle/mp3/beamgun1.mp3');
audio.play();
```
上を追加しても音がでない。


・射撃時にヒットしたら、LINEnotifyで通知をしたいがCORSのエラーを解消できない
↓記事参照
[CORSのエラーが出たけど解消できなかったときのメモ]
(https://qiita.com/sawakoshi_yy/items/ba548d2ab9837c145a23)
【Unity＆Spine】Bounding Box Followerの情報がリセットされた時の対処法

過去に仕事でUnityでSpineを使用し当たり判定を付けたことがあったので思い出しながら実装していたが、なんかうまくいかなかったので備忘録として残しておこうと思いましたまる

UnityにSpineを使えるようにする説明をしたいところだが、文章量が多くなってしまうので割愛
[参考リンク①](https://qiita.com/harayoki/items/f595c9d8d433b1d0ad71)
[参考リンク②](https://qiita.com/4_mio_11/items/b8c920db45f0560f00f1)
Spineに当たり判定を付ける（[公式](http://ja.esotericsoftware.com/blog/Unity-colliders)）

#ここから本命
Unity上でSpineデータに子オブジェクトを追加し、Bounding Box Follower、Bone Followerを追加してゲームを実行してみるとなぜか当たり判定が表示されている画像と大きくずれている。というか座標がリセットされている。
調べてみると設定していたはずのプレハブのBounding Box Followerがリセットされている。

**やってみたこと**
・ボタンを押してBone Followerを追加しなおしてもなぜかゲームを始めるとリセットされる。
・数回子オブジェクトを削除して追加するという方法もやってみた。（ダメ）
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501431/798dbe84-7dae-2956-ecd0-83cb634e2477.png)

#対処法
結果としていうと予測の範囲でしかないが、シーンを保存していなかったからだと思う。
シーンをリロードしてゲームを始め直すとプレハブの当たり判定が正しくセットされていた。
プレハブが原因というのもあるかもしれないがよくわからなかった。
また再現などしたら調べて追記したいと思う。
CloudFrontでアクセスログを有効にするとS3のACLに見慣れない外部アカウントの権限がつくのでビビった話

長いですが題の通りです。


# 起きた事

AWSの設定を見ていたら、S3のACL（権限周りの設定ね）に見慣れない外部アカウントに対して権限がついている！これはセキュリティにやばいのでは(ﾟＡﾟ;)ｺﾞｸﾘ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32169/0d46d7f6-1fa7-004d-0129-ed558f629fb5.png)

# 種明かし

CloudFrontでLogの出力先をS3にすると、自動でこうなります。なので安全です。大丈夫です。

CloudFrontのログは`awslogsdelivery` という**AWSアカウント（!）**を経由して出力される仕組みになっています。で、この`awslogsdelivery`のアカウントIDが `c4c1ede66af53448b93c283ce9448c4ba468c9432aa01d700d3878632f77d2d0` なのです。

[AWSのdocの該当部分](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html#AccessLogsBucketAndFileOwnership
)

> ディストリビューションを作成または更新してロギングを有効にすると、CloudFront はこれらのアクセス許可を使用してバケットの ACL を更新し、awslogsdelivery アカウントに FULL_CONTROL のアクセス許可を付与します。awslogsdelivery アカウントはログファイルをバケットに書き込みます。


やっかいなのが、この設定をCloudFrontでLogの設定をした時に自動でやってくれるため、S3の設定としては意識されない事です。よって、知らないうちに変なIDが追加されてる！という状況が発生します。怖いですね。

`c4c1ede66af53448b93c283ce9448c4ba468c9432aa01d700d3878632f77d2d0` というIDを見たら、
🤔「あ、これは `awslogsdelivery` のアカウントIDだな」
と思い出してくださいね（無理でしょ）

# 参考

[classmethodさんの記事](https://dev.classmethod.jp/articles/cloudfront-log-settings-check/#toc-4)
[AWSのdoc](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html)
prettierの使い方とコーディングルールの登録

# prettier

コードの整形ができるツール。ESLintと併用でき、ESLintよりも整形力にすぐれている。

## install

```
npm i prettier
// ESLintと併用 + Googleのcoding rule
npm i prettier-eslint prettier-eslint-cli eslint-config-google
```

## setting

登録したいルールを下記のように記述する。

```js
// .prettierrc.js ( new file )

module.exports = {
  singleQuote: true,
  semi: false,
}
```

packageも書き加える。

```js
// package.json

"scripts": {
  "format": "prettier --write 'src/**/*.{js,json,md,html,ts}'" // +
}
```

また、ESLintの設定もできる。

```js
// eslintrc.json ( new file )

{
  "env": {
    "browser": true,
    "es6": true
  },
  "extends": ["eslint:recommended", "plugin:prettier/recommended"],
  "rules": {
    "prettier/prettier": [
      "error",
      {
        "singleQuote": true,
        "trailingComma": "es5"
      }
    ]
  }
}
```

## run

```
npm run format
```
JavaScriptの変数宣言 let,ver,const

何度調べても覚えられないのでざっくりまとめ

## 結論
### const
定数
一度入力した値は変更されない

### let
ローカル変数
一度入力した値を変更できる

### var
グローバル変数
いつでもどこでも変更可能
なるべく使わない

## 使い方
上に書いたやつ優先で使う
constが最優先で、次点がlet


## 使用例
雰囲気で感じろ

```javascript:Sample.js
if(true){
    const hogeConst = "hoge1";
    let hogeLet     = "hoge2";
    var hogeVar     = "hoge3";

    console.log(hogeConst); // hoge1
    console.log(hogeLet);   // hoge2
    console.log(hogeVar);   // hoge3

    hogeConst = "hoge4" // エラー
    hogeLet   = "hoge5" // hoge5
    hogeVar   = "hoge6" // hoge6

    console.log(hogeLet); // hoge5
    console.log(hogeVar); // hoge6
}

console.log(hogeConst); // エラー
console.log(hogeLet);   // エラー
console.log(hogeVar);   // hoge6
```

## まとめ
|       | 値の変更 | スコープ外からの参照 |
|------:|--------:|-------------:|
| const | 不可    | 不可          |
| let   | 可      | 不可          |
| var   | 可      | 可            |

スコープのところは、上の例で言うと、ifの中で書いたらifの中でしか使えないよってこと

## 参考文献
ここ見たら全部わかるよ
"巻き上げ"のところは上に書いてないから読んでおいた方がいいかも
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Grammar_and_Types
「Alexa、Lambdaと連携する方法を教えて」と聞いても、答えがよく分からなかったので自分でやったことメモ

### Alexaに聞いてもよく分からなかったので自分で調べた
AmazonEchoを初めて買ったので遊び半分で「Alexa、Lambdaと連携する方法を教えて」と聞いてみた。そしたら、なんと、答えてくれました。
ただ、**初心者の僕には言葉だけでは全く分からない。**（私が持っているのはAmazonEchoDotなので、音声のみで回答。）
結局、自分で調べたので、そのときのメモを残します！


### （Step0）アカウントを作る
■Amazon Developerアカウント（Alexa用）
Amazon Developerアカウントの作成
https://developer.amazon.com/alexa/console/ask

■AWSアカウント（Lambda用）
AWSアカウントの作成
https://aws.amazon.com/jp/console/
右上の「コンソールにサインイン」でログイン


### （Step1）Lambda連携せず、Alexaのみで完結させる
手順は公式のものが分かりやすかったので、下記を参照。
https://developer.amazon.com/ja/blogs/alexa/post/31c9fd71-f34f-49fc-901f-d74f4f20e28d/alexatraining-firstskill

上記の手順まで実施することで、Lambda連携をせず、Alexaのみで下記の動きが可能。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Alexa開発の第一歩。HelloWorldをしゃべってもらった。<a href="https://twitter.com/hashtag/alexa?src=hash&amp;ref_src=twsrc%5Etfw">#alexa</a> <a href="https://t.co/PzRnNwkda0">pic.twitter.com/PzRnNwkda0</a></p>&mdash; heihei (@heihei15408697) <a href="https://twitter.com/heihei15408697/status/1331093707857137664?ref_src=twsrc%5Etfw">November 24, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


### （Step2）AlexaからLambdaへの連携を実施する
手順は下記のQiita記事を参照。
https://qiita.com/zono_0/items/57247bed70dbe2b3ce28

**上記の手順とは異なった部分をメモ**
○5. Lambda関数の作成について
　　ServerlessApplicationRepositoryの参照　を選択
　　alexa-skills-kit-nodejs-factskill　を検索
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/726018/3f277cf8-97cb-3335-cac7-a8d38f11fc28.png)

○日本語版 ZIPファイルのアップロードからindex.jsの書き換えは不要
　　alexa-skills-kit-nodejs-factskillを指定することで対応済

上記の手順を実施することで、AlexaからLambdaへの連携を実施し、下記の動きが可能。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">AlexaとLambdaの連携の第一歩。Alexaへ命令して、Lambdaでランダムに返答内容を決めるものを作りました。<a href="https://twitter.com/hashtag/Alexa?src=hash&amp;ref_src=twsrc%5Etfw">#Alexa</a> <a href="https://twitter.com/hashtag/lamda?src=hash&amp;ref_src=twsrc%5Etfw">#lamda</a> <a href="https://t.co/GvtlSihmB2">pic.twitter.com/GvtlSihmB2</a></p>&mdash; heihei (@heihei15408697) <a href="https://twitter.com/heihei15408697/status/1331112479988932614?ref_src=twsrc%5Etfw">November 24, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【Node.js csvファイルを一行ずつストリーミング】

Streamの使い方を試すためにcsvファイルを一行ずつストリーミングして表示するものを作ってみることにした。

今回はconsoleに表示するだけなので、読み込みstreamだけ使う。

readlineモジュールと読み込みStreamを組み合わせる。

```jsx
const fs = require('fs');
const readline = require('readline');

//index.csvは50行あることにする
var fileName = 'index.csv';

const rs = fs.createReadStream(fileName, {encoding: "utf8"});
const rl = readline.createInterface({ input: rs });

let count = 0;
rl.on('line', (army) => {
    count++;
    console.log(army + '\n');
  });
rl.on('close', () => {
    console.log(count); // index.csvは50行なので50が表示される
});
```

外部ファイルに書き込みたい場合は書き込みstreamも組み合わせる。

以下の記事を参考にさせていただきました。

[https://qiita.com/tarotaro1129/items/93521afd693796eb2cfa](https://qiita.com/tarotaro1129/items/93521afd693796eb2cfa)
【Spring】ビルドツールをGradleからMavenに変更（変換）する方法

GradleからMavenに変更する手順

gradleファイル

```gradle:build.gradle
dependencies {
    .
    .
    compile("org.springframework.boot:spring-boot-starter-data-redis")
    compile("org.springframework.session:spring-session-data-redis")
}
```

https://mvnrepository.com/ を開く

「spring-boot-starter-data-redis」を検索
※ compile("org.springframework.boot:spring-boot-starter-data-redis")の中の文字

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3235343635322f38663961626238322d346134382d643266352d623437662d6533393165646438623063362e706e67-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254652/3a8ddb81-b923-7053-a41f-dd9ce7297d25.png)


![スクリーンショット_2020-11-24_17_31_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254652/3c074d47-5772-90e4-71e6-b081a2737c04.png)
![スクリーンショット_2020-11-24_17_32_06-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254652/80ace003-2559-383e-d5c0-a73487b81d4c.png)

pom.xmlを開いて貼り付ける

![スクリーンショット_2020-11-24_17_34_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254652/46d2ee52-698f-a1a8-96f3-ff35a1a74ccc.png)

「spring-session-data-redis」を検索して上記を繰り返す
pgroongaで文字列がどのように分解されるか確認する

# 概要

[pgroonga](https://pgroonga.github.io/ja/)を使っていて、[MeCab](https://taku910.github.io/mecab/)の辞書が正しく動作しているのか含めTokenizerでどのように文字列が捌かれているか確認したかった。


# やり方

`pgroonga_tokenize` 関数をSELECTする。[リファレンス](https://pgroonga.github.io/ja/reference/functions/pgroonga-tokenize.html) にあるように、関数名はtokenizeだが、ノーマライザーの挙動も確認できる。
（以下スクリーンショットではSQL用コンソールとして[DataGrip](https://www.jetbrains.com/ja-jp/datagrip/)を使用している）


# 例

[neologd辞書](https://github.com/neologd/mecab-ipadic-neologd)を読み込んだpgroongaでMeCabの確認をする場合：

```sql
select pgroonga_tokenize('特急はくたか車内ではく', 'tokenizer', 'TokenMecab')
```

結果:

```json
{"{\"value\":\"特急\",\"position\":0,\"force_prefix_search\":false}","{\"value\":\"はくたか\",\"position\":1,\"force_prefix_search\":true}","{\"value\":\"車内\",\"position\":2,\"force_prefix_search\":true}","{\"value\":\"で\",\"position\":3,\"force_prefix_search\":true}","{\"value\":\"はく\",\"position\":4,\"force_prefix_search\":true}"}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23242/21126a82-a837-ca9d-4b34-f51bae111466.png)


TokenBigramだと次のようになる:

```sql
select pgroonga_tokenize('特急はくたか車内ではく', 'tokenizer', 'TokenBigram')
```

バイ-グラムのときの結果:

```json
{"{\"value\":\"特急\",\"position\":0,\"force_prefix_search\":false}","{\"value\":\"急は\",\"position\":1,\"force_prefix_search\":true}","{\"value\":\"はく\",\"position\":2,\"force_prefix_search\":true}","{\"value\":\"くた\",\"position\":3,\"force_prefix_search\":true}","{\"value\":\"たか\",\"position\":4,\"force_prefix_search\":true}","{\"value\":\"か車\",\"position\":5,\"force_prefix_search\":true}","{\"value\":\"車内\",\"position\":6,\"force_prefix_search\":true}","{\"value\":\"内で\",\"position\":7,\"force_prefix_search\":true}","{\"value\":\"では\",\"position\":8,\"force_prefix_search\":true}","{\"value\":\"はく\",\"position\":9,\"force_prefix_search\":true}","{\"value\":\"く\",\"position\":10,\"force_prefix_search\":true}"}
```
redmineをherokuにpushしようとしたときにエラーが出る

こんにちは。

redmine運用してしばらく経過し、Raspberry Piを通さずにredmineを見れないかということになりました。
git cloneして設定ファイルを参考に編集してgit addしてgit commitしました。
あとはpushするだけだなぁと思ってpushしたら残念なことにエラーが出てしまいました。

正しいやり方かどうかは、まだわかっておりませんが
できたため取り急ぎメモです。
駄文です。

以下出たエラー

```
(LanguagePack::Helpers::RakeRunner::CannotLoadRakefileError)
ensure you can run `$ bundle exec rake -P` against your app
and using the production group of your Gemfile.
rake aborted!
NoMethodError: undefined method `assets' for #<Rails::Application::Configuration
```

bundle exec rakeが失敗しており、assetsメソッドが読み込めてないようです。

調べて解決しました。

```config/application.rb
require 'sprockets/railtie'
```

上記のところがコメント(#つき）になっているため外します。

commitしてpushしようとするとまたもエラーが出ます。

```
Expected to find a manifest file in `app/assets/config/manifest.js
```

manifest.jsがないと出ます。
railtieを使うようにしたため必要なもののようです。

manifest.jsでは以下のように書くようにとあるのですが、試してもできませんでした。

```app/assets/config/manifest.js
//= link_tree ../images
//= link_directory ../javascripts .js
//= link_directory ../stylesheets .css
```

フォルダ階層を見直すとpublicの下にあるので以下のように変更します。

```app/assets/config/manifest.js
//= link_tree ../../../public/images
//= link_directory ../../../public/javascripts .js
//= link_directory ../../../public/stylesheets .css
```

commitしてpushした結果とおりました。

あとはセットアップして再起動させます。

```
heroku run rake db:migrate RAILS_ENV=production
heroku run rake redmine:load_default_data RAILS_ENV=production
heroku restart
```

追い求めたredmineのページが映し出されて感動しました!

皆さまの助けになれば幸いです。
駄文ですが、最後まで見ていただきありがとうございました。
RedisはなぜTHP(Transparent Huge Page)を無効化しないといけないのか

## 前書き 
この記事は、MicroAd Advent Calendar 2020の8日目の記事です。
redisのthpに関して色々調べて、情報が連続した資料ないなと思ったので適当に残します。
ふんわりとした認識の部分も多いのでマサカリ大歓迎です()

##分かる人向け
redisがスナップショット取るのにfork命令叩くからページサイズが大きいと[Copy On Write(CoW)](https://cstmize.hatenablog.jp/entry/2019/08/12/Linux_Kernel%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8BCopy_On_Write(CoW)%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF(%E6%A6%82%E8%A6%81%E7%B7%A8))の関係でメモリがwriteで死ぬ
## 問題
redisをインストールしたことのある方なら分かると思うのですが、 
`"WARNING you have Transparent Huge Pages (THP) support enabled in your kernel"` 
という警告を見たことはありませんか？ 
これ自体はTHPを無効化するように`/sys/kernel`に書き込んであげると解決します。[公式ドキュメント(latency)](https://redis.io/topics/latency)にも概要は書いているのですが、少し踏み込みたいと思います。

## そもそもTHPとは
THPはTransparent Huge Pagesの略で、Transparent(透過)なHuge(巨大)なPageのことです。 
ってなると(Huge)Pageとはとなるのが筋かなと思います

### (Huge)Pageとは
linuxでは物理メモリ空間を4kbごとのページに区切ってページテーブル(メモリの割当管理テーブル)を作成し、管理しています。　
プログラムがメモリへアクセスするときははメモリを直接参照しに行くのではなく、一度プログラムが持っているポインタ(論理アドレス)とページテーブルを比較し、対応する物理アドレスを入手しに行くという工程を踏んでからアクセスしています。取得してきたらTLBというキャッシュに突っ込みます。
 
しかし最近の大容量メモリが普通となった環境では4kb単位でメモリ管理をするのは細かすぎて非効率な問題があります。(キャッシュ効率・ヒット率の低下、そもそもページテーブルが大きくなるなど) 
そこで登場したのがページサイズを大きくしてより効率的に扱えるようにするHugePageということです。 
しかしこのhugepage、利用するためにはプログラムの変更やJVMに`-XX：+ UseLargePages`の指定が必要です
[詳しく](https://gist.github.com/shino/5d9aac68e7ebf03d4962a4c07c503f7d)は[この辺り](https://linuxjm.osdn.jp/html/LDP_man-pages/man2/mmap.2.html)を読んでください

#### 改めてTHPとは
そこで現れるのがTHPなのですが、超雑に言うとプログラムを書き直さず`malloc`しただけでhugepageをいい感じに使ってくれます。
[巨大メモリへのランダムアクセスが多いサービスを利用しているときは](https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/)無効化したほうが良さそうです。
[/defragを除き](https://qiita.com/Morihaya/items/d09f6f41ba3c374b8cc2)基本的に有効で問題なさそうです。

使っている`malloc`や`madvise()`の要求が設定次第で関係あるようですが、kernel分からんの人間なので詳しい方にお任せします

## なぜTHPを無効化するの？
じゃあredisなんてメモリめっちゃ使うんだから有効化したほうが早いでしょなんで？？となると思うのですが、原因はredisがforkするからです。 
redisはスナップショットを取るときにメモリの状態を保持するためにfork(プロセスをコピー)します。なので基本使用メモリは実メモリの半分推奨だったりします。
でも実はforkしても[Copy On Write(CoW)](https://cstmize.hatenablog.jp/entry/2019/08/12/Linux_Kernel%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8BCopy_On_Write(CoW)%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF(%E6%A6%82%E8%A6%81%E7%B7%A8))という機能があってfork直後は同じページを参照しています、実際にコピーされるのはデータが書き込まれたときだけです。CoWがあるおかげでredisのメモリ全コピーを避けれてる非常に恩恵の大きい機能です。
　
しかし、メモリの書き込み領域の判定はページテーブルを参照してページサイズ単位で判断しています。そしてhugepageが利用されているとページサイズが大きくなっているのでその分だけメモリ変更があったと判断されやすくなり、更にコピーするサイズのメモリ量が増大するので、サーバーにもよりますが**メモリ全コピー**が発生する可能性があります:party_parrot:。　
なのでthpを無効化しようね、ということらしいです。

## あとがき
実はこれ書いたときは[Redis Administration](https://redis.io/topics/admin)の記事しか読んでおらず、latencyの項目に書いてある詳細な説明に気づいておりませんでした......。とはいえカーネルのメモリ管理からredisまで一貫した説明のあるドキュメントはあまり無いと思うので取っ掛かりになれば嬉しいです。

また、この記事を書くに当たり
[Redisのセットアップについて考えてみる ~ Transparent Huge Pages ~ - レガシーガジェット研究所](https://k-onishi.hatenablog.jp/entry/2019/06/29/155559)
[\[postgres\]大容量メモリかつOSがRHEL(CentOS)6系をお使いの方、THPのdefragは止めた方が良いですよ - Qiita](https://qiita.com/Morihaya/items/d09f6f41ba3c374b8cc2)
[革命の日々！ transparent hugepage considered harmful](http://mkosaki.blog46.fc2.com/blog-entry-1291.html)
の記事は特に参考にさせていただきました、ありがとうございます。
【Java】ディレクトリ内のファイルのコンパイル・実行

個人用メモ．なので一部表現があいまいです

# javaファイルとclassファイルを別々のディレクトリにまとめたい

カレントディレクトリにて

``` 
javac -d <class directory> <src directory>/<java file>
```


**class directory** : classファイルを置きたいディレクトリ
**src directory** : コンパイルしたいファイルがあるディレクトリ
**java file** : コンパイルしたいファイル

【補足】
・クラスファイルの出力先ディレクトリを設定
・そのディレクトリはすでに存在している必要がある


【例】
例えば，カレントディレクトリに**src**，**class**のディレクトリがあり，**src**内に
**Foo.java**, **Bazz.java**があるとき，src内のjavaファイルをコンパイルしたい

```
javac -d class src/Foo.java src/Bazz.java
```

もしくは

```
javac -d class src/*.java
```

によって **class** に **Foo.class**, **Bazz.class** ができる


# ディレクトリ内のファイルの実行

カレントディレクトリにて

```
java -cp <class directory>/<class file>
```

**class directory** : コンパイルされたファイルがあるディレクトリ
**java file** : コンパイルされたファイル

【補足】
・クラスファイルを検索するディレクトリのリストを指定
・cpは，classpathの略　

【例】
カレントディレクトリに**class**ディレクトリがあり，そこに**Foo.class**がある場合


```
java -cp class Foo
```

拡張子はもちろん要りません．
C#でタイムアウト付きの File.Exists および Directory.Exists を実装する

## 目的
Windows共有フォルダ上のファイルやディレクトリの有無を確認するときに、System.IO.File.ExistsやSystem.IO.Directory.Existsを使うと、対象のサーバーに繋がらない際に数秒から数十秒、長い場合数分待たされる場合があります。
今回は指定した秒数以内に接続できない場合 false を返すようなタイムアウト付きの有無確認を実装します。

## 条件
- Windowsファイル共有 (SMB/CIFS)
- .NET 5.0（.NET Framework 4.6以上でもおそらく動作）

## 対象
- 共有フォルダを持つサーバーの死活を手っ取り早く確認したい人（PINGが使えないケースなど）
- 死活がわからない共有フォルダ上のファイルの有無を手っ取り早く確認したい人
- とりあえず当該動作を探していた面倒くさがりの初心者

## 実装
細かな例外処理等は省略。コードの美しさも省略。

```csharp
using System.Threading;
using System.Threading.Tasks;
using System.IO;

public class TimeoutIOUtils
{
  //タイムアウト秒
  public static int TimeoutSeconds{ get; set; } = 3;

  //ファイル有無
  public static bool FileExists(string path)
  {
    return TimeoutCore(() => File.Exists(path));
  }

  //ディレクトリ有無
  public static bool DirectoryExists(string path)
  {
    return TimeoutCore(() => Directory.Exists(path));
  }

  //タイムアウト処理部分
  private static bool TimeoutCore(Func<bool> existFunction)
  {
    try
    {
      var source = new CancellationTokenSource();
      source.CancelAfter(TimeoutSeconds * 1000);
      var task = Task.Factory.StartNew(() => existFunction(), source.Token);
      task.Wait(source.Token);
      return task.Result;
    }
    catch (OperationCanceledException ex)
    {
      return false;
    }
    catch (Exception ex)
    {
      throw;
    }
  }
}

```

#### 追記: @albireo さんのコメントより改良案取り込み版
```csharp
  //タイムアウト処理部分
  private static bool TimeoutCore(Func<bool> existFunction)
  {
    var task = Task.Factory.StartNew(() => existFunction());
    return task.Wait(TimeoutSeconds * 1000) && task.Result;
  }
```


## 使い方

```csharp
private void Sample()
{
  TimeoutIOUtils.TimeoutSeconds = 2; //タイムアウトを2秒に設定

  var dir = @"\\192.168.0.XXX\example";
  var file = @"\\192.168.0.XXX\example\example.txt";

  //ディレクトリの有無確認
  if(TimeoutIOUtils.DirectoryExists(dir))
  {
    Console.WriteLine("ディレクトリあります");
  }
  else
  {
    Console.WriteLine("ディレクトリないです");
  }

  //ファイルの有無確認
  if(TimeoutIOUtils.FileExists(file))
  {
    Console.WriteLine("ファイルあります");
  }
  else
  {
    Console.WriteLine("ファイルないです");    
  }
}
```

## 補足
通常のFile.Existsなどと比べ若干のオーバーヘッド増加はあるはず。

Taskの使えない.NET Framework4.0とかだとThreadで似たようなことができます。

上記でとりあえず期待通り動作はしますが、Taskの扱いは筆者も初心者なので後処理含め正しくはないかもしれません。
各々調べて適当に改良してご利用下さい。
initializeメソッドにて行う最もベーシックな初期化

まずinitializeメソッドとは、Rubyで`クラス名.new`でインスタンスを生成したときに呼び出されるメソッドで、インスタンスの生成と同時に実行したい処理を記述します。
このとき、使用するインスタンス変数は全てこちらで初期化が必要です。

### initializeメソッドの書き方
例えば、このように`初期化の時点で代入してしまう`ものに関しては分かりやすいと思います。

```ruby
class ClassName
  def initialize
    @colors = ["black", "white", "gray", "red", "blue"] # 初期化の時点で値を代入している
  end

  def choose_color
    @colors.sample
  end
end
```

ただ、このように`後から代入することが決まっていて、初期化時点では空`の値の場合はどうしたら良いのか↓

```ruby
class ClassName
  def initialize
    # どう書けば良い？
  end

  def write_review
    puts "タイトルを入力してください"
    @title = gets.chomp  # 初期化の時点では空、write_reviewメソッドを呼び出してから値を代入する
  end
end
```

こうします↓

```ruby
class ClassName
  def initialize
    @title = "" 
  end

  def write_review
    puts "タイトルを入力してください"
    @title = gets.chomp
  end
end
```

ここから言えることは**インスタンスを生成した際に代入できるのであればそうでよいが、実行後に値が代入されるのであれば、もっともベーシックな [リテラル](https://wa3.i-3-i.info/word15346.html "リテラル")で初期化をする必要がある**ということです。
基本形は以下です。

```ruby
class ClassName
  def initialize
    @string = ''
    @integer = 0 # or nil
  end
end
```