OmniAICreator/Qiita-1.07M huggingface dataset:
vbsの作法 その44

# 概要

vbsの作法調べてみた。
winsock使ってみる。
生httpを見たかった。

# 写真

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1ddb6e68-2cd5-539a-9bb1-d0effaa8cc0a.png)

# 環境

windows7 64bit


# サンプルコード

```
Dim oWin
Dim sURL
Dim sPage
Dim sServer
Dim nPort
Dim sBuffer
Dim sSource
Dim bClose
Dim App6
Dim Appflg

Sub App6_exit()
	Appflg = 2
End Sub

Sub App6_ok()
	sServer = "www.ostrosoft.com"
	sPage = "/"
	Set oWin = CreateObject("OSWINSCK.Winsock")
	WScript.ConnectObject oWin, "soc_"
	oWin.Connect CStr(sServer), CLng(nPort)
	While Not bClose
		WScript.Sleep 100
	Wend
End Sub

Sub soc_OnClose()
	oWin.CloseWinsock
	App6.text = sSource
	bClose = True
	Set oWin = Nothing
End Sub

Sub soc_OnConnect()
	oWin.SendData "GET " & sPage & " HTTP/1.0" & vbCrLf & vbCrLf
End Sub

Sub soc_OnDataArrival(ByVal bytesTotal)
	oWin.GetData sBuffer
	sSource = sSource & sBuffer
End Sub

Sub soc_OnError(ByVal Number, Description, ByVal Scode, ByVal Source, ByVal HelpFile, ByVal HelpContext, CancelDisplay)
	Msgbox Number & ": " & Description
	oWin.CloseWinsock
End Sub

Set App6 = Createobject("OHIcompo6.srv")
WScript.ConnectObject App6, "App6_"
App6.text = ""
sURL = ""
sPage = ""
sServer = ""
nPort = 80
sBuffer = ""
sSource = ""
bClose = False
sProxy = ""
Do
	WScript.Sleep(100)
	App6.ping
Loop until Appflg = 2
Set App6 = Nothing



```


以上。
AAAのサービス構築

#はじめに
AAAとは
・Authentication： 認証(信頼できるかどうか。本人であるかを確かめる。)
・Authorization：　認可(サービス利用の権限を持っているか。ユーザごとに制限する。)
・Accounting：　課金(ユーザ情報を収集する。ログに記録する。)

セキュリティ上に考慮するものが多く、特にアカウントの安全管理は大事です。

モダンなシステムでは単一のログイン方式はあまりないと思います。ソーシャルIDでログインできるのは多いです。
AAAを考慮したサービス独自で対応するのは面倒なので、いくつかのサービスを使って構築でよいかと思います。

#Google Firebaseサービスを利用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/89ec079b-9ccf-e21f-986d-af7ac83cbe85.png)

主流SNSなどは対応しており、便利ですね。
ただし、日本のLineなどを使いたい場合は別途対応する必要があります。

##ほかのサービスと簡単に連携できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/5dcbeac3-43d7-2608-ef0a-f29207dfcc1f.png)

Slack、Jiraなど

#Amazon Cognito
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/bf636977-5901-f692-49ac-0f2d99423a9f.png)

Firebaseと同じく主流のプロバイダーが対応しております。
SAML、OpenIDも対応していますので、もっと利用できるサービスは多いですね。

#認証サーバ自ら作成
SSOの実装に、OpenAMなどは有名ですが、比較的に新しいKeyCloakはよいですね
KeyCloak： https://www.keycloak.org/
KeyCloakとは
>Open Source Identity and Access ManagementFor Modern Applications and Services
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/bf49e136-bb04-ab32-3068-e108fda22c9d.png)

できるものは多いです。

プロバイダーも幅広いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/44b8e18b-33e5-8f19-2a27-8ebc6402ab85.png)

ニーズに応じて適切なサービスを選択する必要があります。

以上
インクリメンタルサーチについての復習

##インクリメンタルサーチの復習
Ajaxの非同期通信を学習中で、[前回](https://qiita.com/iiyama_makoto/items/9845b094f72e4e4c1ea7)はコメントの投稿をページの再読み込みなしで表示させました。
今回は文字を入力して検索する際、検索ボタンを押して再読み込みをさせずに非同期で検索結果を表示させるようにします。

###インクリメンタルサーチとは
そもそもインクリメンタルサーチとは、
***Incremental Search***
*Incremental* : 増加、増大する、追加する
*Search* : 検索
と単語の意味で考えると正直分かりませんが、IT用語で**「文字入力するたびに自動的に検索が行われる検索方法」**を指します。

###インクリメンタルサーチの実装
インクリメンタルサーチ実装の流れを復習していきます。
あくまでAjax、JavaScriptの流れを把握することが目的なので、HTMLなどの表記はある程度省略していきます。

```javascript:search.js
$(function() {
  $(".search__form").on("keyup", function(){

    var input = $(".search__form").val();

    $.ajax({
      type: 'GET',
      url: '/products/search',
      data: { keyword: input },
      dataType: 'json'
    })

    .done(function(products) {
      $(".検索結果表示クラス").empty();
      if (products.length !==0) {
        $(".検索結果表示クラス").append("インクリメンタルサーチの結果を表示させる記述");
      }
      else {
        $(".検索結果表示クラス").append("検索結果がない旨を表示させる記述"）;
      }
    })
    .fail(function(){
      alert('映画検索に失敗しました');
    })
```
全体的な記述は上記のようになると思います。
細かい内容をおさらいしていきます。

```js
$(".search__form").on("keyup", function(){
```
keyupイベントはキーボードのキーが上がった時に発火します。文字入力でキーを離したタイミングですね。
イベントの発火を検知する場所は、ここでは"search__form"クラスを持つ検索フォームが指定されています。

```js
    var input = $(".search__form").val();
```
検索フォームに入力されている値をinputに代入します。

```js
    $.ajax({
      type: 'GET',
      url: '/products/search',
      data: { keyword: input },
      dataType: 'json'
    })
```
Ajaxで非同期通信を行う際に指定する内容を記述します。
URL、data内のkey名（keyword）はルーティングやインスタンス変数の定義により変わるので一例です。
今回の記述では、{ keyword: input }データを/products/searchパスにGETメソッドで送り、結果をJSON形式で返してもらいます。

```js
    .done(function(products) {
      $(".検索結果表示クラス").empty();
      if (products.length !==0) {
        $(".検索結果表示クラス").append("インクリメンタルサーチの結果を表示させる記述");
      }
      else {
        "検索結果がない旨を表示させる記述";
      }
    })
    .fail(function(){
      alert('映画検索に失敗しました');
    })
```
`.done`メソッドと`.fail`メソッドは対で記述しておきましょう。そして`.fail`メソッドは`alert`で「エラーが発生しました」と表示される程度でいいかと思います。

今回の`.done`メソッドでは、まず検索結果をproductsに代入します。
現在表示されている検索結果を`empty`メソッドで消去します。
`empty`メソッドは、その要素そのものではなく子要素を削除します。これで検索結果を表示させる箱は残しながら、中身を全て消してリセットしてしまいます。その後検索結果をリセットされた中身に追加して表示させるようにします。

ifを使って場合分けを行います。検索結果の個数が0でなければその結果を表示させ、検索結果の個数が0の場合は検索結果がない旨の記述が適用されます。

####結果
検索フォームに文字入力をすると、キーから指を離すたびにフォーム内の文字列が拾われて都度その文字列で検索をかけられます。
文字を入力する度に検索が実行されているわけですから、PC本体やネット回線のスペックがそれなりにないと負荷がすごいことになりそうですね。
ブロードバンドが普及する前にインクリメンタルサーチが使われていたら、どうなっていたのでしょうか？

JavaScript(jQuery)の書き方にはまだ慣れませんが、書いている中身はなんとなく分かってきた気がします。一気に書くとさっぱり分かりませんが、一つ一つ読み解きながら進めていくとどうにか分かるようになってきました。
[iOS] App ID Prefixの変更可否

# 概要

アプリのApp ID Prefixを変更したい場面が出てきて色々調査したため、その内容を整理しておきます。以下の内容が不明な方向けです。

 - App ID PrefixとTeam ID、Bundle IDの関係性
 - 新規アプリ作成時にApp ID Prefixが複数存在する場合、どれを選ぶべきか
 - App ID Prefixは変更可能か

※本記事の情報は個人で確認したものであり、情報の正確性を保証するものではありません。App IDの仕様についても今後変更される可能性があります。

# App IDの構成

App IDは**App ID Prefixと呼ばれる、大文字英数10桁の識別子**と**Bundle ID（Bundle Identifier, App ID Suffix）と呼ばれる識別子**で構成されています。

```Swift
<App ID Prefix>.<Bundle ID>
````

例） ABCDE12345.jp.hogehoge.hogeapp

App IDは開発者を識別するためのものであり、他の開発者とは別のものが割り当てられます。基本的には**Team ID**と呼ばれるデフォルトのApp ID Prefixのみですが、過去にApp ID Prefixを開発者が発行できた経緯があり、開発者によっては**複数のApp ID Prefixが存在**します。

Bundle IDはアプリをユニークに識別するためのもので、このIDが異なる場合は別アプリとして認識されます。

新規にアプリを作成し、App IDを発行する際には、Team IDを含めたこれらApp ID Prefixから選択することとなります。

# App ID PrefixはKeychainでのデータ共有機能に影響する

App ID Prefixを共有するアプリ間ではKeychainを介してデータの共有が可能です。逆を言えば、App ID Prefixを変更すると、もとのKeychainデータにアクセスすることはできなくなりますので注意が必要です。
他にも、App ID Prefixを共有していないアプリ間ではKeychainを介してデータの共有ができないため、新規アプリ作成時には、App ID PrefixをデフォルトのTeam IDに揃えておく、などの考慮が必要です。

# App ID Prefixは変更できるか　

 - Bundle IDがワイルドカードを利用している場合、App ID Prefixのみを変更した同じ形式のBundle IDを作成することで、新しいApp ID Prefixのものへ**移行可**
 - Bundle IDがワイルドカードを利用していない場合（explicit）
   - アプリのバイナリをAppStoreConnectへアップロードする前であれば、該当のApp IDを削除し、新しいApp ID Prefixを指定し、再度作成することで**移行可**
   - アプリのバイナリをAppStoreConnectへアップロードした後であれば、以下のエラーがでてApp IDが削除できないため、**移行不可**

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113553/cbe61bb9-fd39-6eb8-5130-048b39d5f4ae.png" width="400px">
> There is a problem with the request entity
The App ID '削除しようとしたAppID' appears to be in use by the App Store, so it can not be removed at this time.

なお、アプリの配信先の国をすべて削除する、開発者アカウントのAdmin権限でAppStoreConnect上でアプリを削除するなどを行なっても上記のエラーは解消できませんでした。

# ただし、Appleに依頼すれば変更できる可能性も

Appleの開発者サポートに確認したところ、デベロッパーアカウントのアカウントホルダーからの依頼があれば、Appleの内部チームがその内容を審査し、受け付けてくれれば変更を実施してくれることもあるようです。（リードタイムは明確になってはおりませんが、少なくとも数日は要するようです）



# 参考

 - [Apple - Sharing Access to Keychain Items Among a Collection of Apps](https://developer.apple.com/documentation/security/keychain_services/keychain_items/sharing_access_to_keychain_items_among_a_collection_of_apps)
 - [複数の App ID Prefixとキーチェーンについて](https://www.toyship.org/archives/1680)
 - [Team IDとは違ったApp ID Prefixを指定する方法](https://qiita.com/kagerou_ts/items/f9073b68087a19dbd189)
 - [iOS の App ID の Prefix を Team ID Prefix に変更する](https://qiita.com/magickworx/items/e58571525610e7acf3a5)
Rails初学者必見！クラスの作り方分かってないと色々やばい！

# なぜ書こうと思ったか

Rails系プログラミングスクール卒業生に
クラスの定義に関して簡単な問題を出したところ、
絶望的にできなかった。

# その問題というのはこちら

**「User.new(first_name: '太郎').first_name」で「太郎」を取得できるよう、クラス「User」を作成してください。**

**また、「User.new(first_name: '太郎', last_name: '田中').full_name」で「田中太郎」が取得できるよう、インスタンスメソッド「full_name」を定義してください。**

# 答え書いた方がいいですか？

答え書いちゃうと巷のプログラミングスクールとおんなじのマニュアルお化けになっちゃうので、書きたくないです。
書き方は一つじゃないですし・・・。
**頑張って調べて挑戦してみてください。**

# 終わりに

知ってたら５分かからないくらいで書けちゃうコードなんですよね。
Rails系のプログラミングスクールを卒業しても、戦力になっていない人が多いのは、
単純に、Rubyの最低限の基礎知識もわかってないからなんだろうなと、切に思います。
もし、あなたがプログラミングスクールを卒業しても、
この問題を５分足らずで書けないなら、Rubyの基礎をしっかり固める時期だと認識しましょう。
新しく作ったユーザでタブ補完やコマンドの履歴が使えない場合

#はじめに
これは、Linux初心者の私が、少し悩んでしまったことをメモとして記録したものですので、寛大な心でお読みください。
#症状
・Ubuntu19.04にて、新しく作ったユーザで
　　・タブキーでコマンドの補完ができない
　　・矢印キーでコマンドの履歴を見れない
　　・シェルがモノクロ
　などの症状がでる。
#原因
・それはbashではなく、shのシェルです。
#解決策
・ようは、使用するシェルを変更すれば良いため、
　　・chshコマンドで使用するシェルを変更
　　・/etc/passwdのファイルから、変更するユーザの行のシェルを書き換える
　などの方法がある。お好みで。

※chshコマンドでbashに変更した場合

```sh
$ chsh
パスワード: 
Changing the login shell for 〇〇〇（ユーザ名）
Enter the new value, or press ENTER for the default
        Login Shell [/bin/sh]: /bin/bash （← 入力）
```

そして、再接続か、bashコマンドでbashが起動する。
もし、bash以外を使用している方はbashのところを変更してください。
iosアプリのアプリ内課金テスト(sandbox )で経験したおかしなこと

iOSの課金テスト、特に定期購読サービスのテストは結構不便なところがあります。

その上に、sandboxの課金環境はとても不安定で、テストのときによく躓くことがありました。

何個か書いてみたいと思います。

### sandboxユーザーを切り替えることが出来ない

`ios13` の問題ですが、iosは２つのアカウントでログインすることが出来ます。

普通にApp storeで利用しているアカウントでログインすることが出来ますが、

課金のテスト用で利用出来るsandboxのアカウントでもログインすることが出来ます。

sandboxのアカウントに一度ログインしてしまうと、二度とログアウトすることが出来ないのです・・・。_

これが結構テストのときに不便で、ログアウトする方法は iOS13.1にアップデートするか、端末の設定のところから端末をリセットする事です。

### 課金すると、端末には課金成功と表示されるが、実際のレスポンスはエラーが返却される・・・

これは結構厄介です。

テスターから、appleの課金は成功したのに、課金に失敗したと表示されますと報告が・・・。

ケーブルをつないでdebugしてみると、レスポンスがエラーが返却されるのに、エラーメッセージは `完了しました` という文言が返却されました。

https://forums.developer.apple.com/thread/121096

これは他にも同じ症状の人がいたので、それからは調べることをやめました。

### App Storeにアクセスできない・・・

これもどうしようか迷った、結構厄介な問題でした。

ストアからダウンロードしたものは何も問題ないのに、testflightからダウンロードしたものは課金アイテムの情報の取得も、購入も出来ませんでした。

エラーはこんな感じでした。

```
Error Domain=AMSErrorDomain Code=301 "Invalid Status Code" UserInfo={AMSStatusCode=503, 
NSLocalizedDescription=Invalid Status Code, 
NSLocalizedFailureReason=The response has an invalid status code}
```

301だったり、503だったりしたのでサーバーの問題か・・・？

でもappleのsystem statusをみても今は問題ないと表示されている

こちらですが、 DNS設定に 8.8.8.8と8.8.4.4 を追加したら課金周りのテストができるようになりました。

https://stackoverflow.com/questions/58443064/how-to-handle-skproductsrequest-301-invalid-status-code

こちらのstackoverflowに助けられました・・・。

### 単純に課金ができない

上記の理由でなくても、単純にsandbox環境は課金ができなくなるときがあります。

これは時間がすぎれば症状がなおるので、少し時間を空けてからテストすることにしましょう・・・。


----

他にもsandboxの問題を経験した方がいらっしゃれば、ぜひコメントお願いします！
自分のポートフォリオを作ってみた。

###ついに！中野のポートフォリオが完成しました！
こんにちは。ポートフォリオの秋がやってきた気がしたので、
自分のポートフォリオを作りました。

[Nakano's portfolio](https://nakano1120.github.io/portfolio/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515312/8d1ce615-2af4-9d63-13f6-df8fc36857ca.png)

我ながらかっこよくできたと思います。（自画自賛）

というわけで、コード紹介です。

##コード紹介

```css:こだわったところ
a.toplink{
    padding: 0 5vw;
    text-decoration: none;
    color:#ddddff;
    transition: all .3s;
}
```
今回これを作るのに当たって、気をつけたのは、余白設定です。
今までサイトを作るときは、ほとんど余白の「padding」「margin」を使っておらず、
どうしても子供っぽい殺風景なデザインになってしまいました。
なので、ここには格段と気を使いました。

他にも、使ったことのなかった「header」や「footer」も使えたので、とてもいい経験になりました。

##今後の展望
- もっと色々作って欄を増やす
- 情報を濃くする
FirebaseのRoboTestのroboscriptで多言語対応を使えるようにしたった

# はじめに

RoboTestだと多言語対応が楽そうな印象があったのでちょっとだけ頑張った話です。
一個一個キャプチャ取るのとかやですよね。
<img width="411" alt="スクリーンショット 2019-10-20 20.56.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/7173cb88-d480-c5cb-fd9c-e1cb149fcadf.png">
インターフェース的にもできそうじゃないですか。
絶対できるんですが、そのままじゃできなかった。
スタンダードな手法で作ったroboscriptだと多言語対応できません。

# 問い合わせた

<img width="339" alt="スクリーンショット 2019-10-20 21.15.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/fdd30f3a-493a-c178-1ce2-0a2d5a956557.png">

https://firebase.google.com/support?authuser=0

## こんなメールが帰ってくる
<img width="1287" alt="スクリーンショット 2019-10-20 21.16.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/d56e0b69-f29a-14a7-d6ab-ce91b272e55e.png">

## 結果

メールでのやり取りで解決しませんでした。

- roboscript
- apk

これらを送るように言われたのですが、apkを送るためにgoogleDriveを使うよう指示があったところで
会社のGSuiteを使った状態では共有が難しかったため、代替案を提供することも含めて
メール一往復で一日くらいかかることで、解決まで時間がかかりすぎ打ち切りました。
(最初に問い合わせてから4日たっていた)

# roboscriptが実行されていないことを確認

RoboTestを実行するデバイスとroboscriptを取得するデバイスを合わせたりしたんですがどうにもいかず、実行されたのは
モンキーテスト的な動きだけ。

roboscriptでうまくいかない場合、RoboTestで実行した動画をみると

> Robo Script
<実行するアクションの数> actions to perform

と表示した後に

> Robo Script
<実行できたアクションの数> of <実行するアクションの数> actions successfull

と表示され、その後にRoboTestが判断したアクションが自動で実行されます

> Robo Script
0 of <実行するアクションの数> actions successfull

Android Studioから書き出し、実行がうまくいっていないroboscriptをよく見てみることにしました。

## roboscript
クリックするだけなのに、replacementTextはいるのかと
<img width="668" alt="スクリーンショット 2019-10-20 21.01.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12362/2b08eafd-c84e-685f-1d82-bb24f549aedd.png">

 - replacementTextに`""`を設定
 - textの部分はそのまま

多言語で複数ロケールを指定して実行してみました。
端末設定の言語が異なる状態で

> Robo Script
<実行できたアクションの数> of <実行するアクションの数> actions successfull

となりました。

# さいごに

Firebaseの問い合わせ時に、"日本語"で記載して問い合わせました。

Firebase担当者からの問い合わせの回答には文字化けしたメールが引用についていました。
どういう質問の仕方をしたのか、後から見てわからなくなってしまったのもあって
よくよく考えるとroboscriptでうまくいかないことだけを伝えた質問になったことで、メールでのやり取りを長引かせた可能性がありました。

やり取りはgoogle翻訳を使いやすいように、というFirebaseの担当者の理由で英語でリターンされるので、こちらもgoogle翻訳で訳した英語で返信するようにしました。


- 質問は英語で
- 多言語で正しく動作しないroboscriptからは、使用した端末の言語に限定した情報を抜いてみる

もうちょっと検証は必要かと思います。公式の情報があまり充実していません。
roboscriptは構造上そんなに難しくないので、色々いじって効率の良い方法を見つけていただけると助かります。
WSLでJupyter Notebook / Jupyter Labの環境を整える

# Jupyter Notebookの場合
## jupyter notebookをインストール
pipでインストールするだけです．

```
$ pip install jupyter
```
起動は下記コマンド．

```
$ jupyter notebook
```

ここで僕がはまったのが，`/mnt/c/Users/ユーザー名/`直下や`Documents`内でこのコマンドをたたくとサーバーエラーか何かでjupyter notebookが起動できなかったことです．Ubuntu環境とWindows環境の共有用に自分で作った`/mnt/c/Users/ユーザー名/MyHome/`以下でたたくと問題なく開けました．
（このあたり知識不足なので，もし原因がわかる方がいれば教えていただけると助かります．）

#### 追記（2019年11月27日）
MyHome以外のフォルダ（例えばGoogle Driveなど）でも動作することを確認しました．ユーザー名直下やDocuments内に入っているファイルのpermissionの関係でアクセスできないのだと思われます．

## jupyter-themesをインストール

[dunovank/jupyter\-themes: Custom Jupyter Notebook Themes](https://github.com/dunovank/jupyter-themes)
公式のドキュメントにすべて載っています．ここから自分が設定したものを載せます．

```
$ jt -t onedork -f source -T -N -kl 
```


-tでテーマの変更をします．カラースキームはonedorkにしました．

-fでコード部分のフォントを変更します．Source Code Proにしています．
コード部分以外のフォントも変更できますが，僕は気にならなかったのでそのままにしています．変えたい人は下記記事が参考になると思います．

* [jupyter\-themes の fontについて \- Qiita](https://qiita.com/koikoi_jam/items/29d9ef4e16a42038325c)

-T, -N, -klはそれぞれツールバー，ノートブックの名前，カーネルロゴを表示するオプションです．つけておいた方が便利．


## 補完を有効にする
そのままのjupyter notebookは補完機能がないため，IDEと比較して不便です．以下の手順で補完を有効にします．

```
# Nbextentionsをinstall
pip install jupyter-contrib-nbextensions
pip install jupyter-nbextensions-configurator

# Nbextentionsを有効化
jupyter contrib nbextension install --user
jupyter nbextensions_configurator enable --user
```

jupyterを再起動すると，Nbextentionsというタブが新たに表示されているので，`Hinterland`を有効化するとTab補完が効くようになります．



# Jupyter Labの場合
## インストール

```
$ pip install jupyterlab
```
# 起動

```
$ jupyter lab
```

基本はこれですが，WSLの場合エラーが出るはずなので以下の設定をbashrcかzshrcにします．

```
alias jupyter-lab="~/.local/bin/jupyter-lab --no-browser"
alias jl="jupyter-lab" 　#こっちはオプションです．お好みで．
```

あとは表示されるURLをコピペしてブラウザで開けばOK．
基本情報1週目(10/21週)

# 目標と結果
### 目標
- 4項目まで参考書の演習問題を正解する。
- できない部分を見つけ、そのままにしない。

### 項目

独習ゼミの項目で言うとFE17まで
1．基礎理論
(離散数学・応用数学・情報理論・通信理論・計測制御理論)
2．アルゴリズムとプログラミング
(データ構造・アルゴリズム・プログラミング・プログラム言語・マークアップ言語など)
3．コンピュータ構成要素
(プロセッサ・メモリ・バス・入出力デバイス・入出力装置)
4．システム構成要素
(システムの構成・システム評価指標)

### 結果
- コンピュータ構成要素・システム構成要素の通常テストをクリアできた。
- システム開発技術の通常テストはITパスポートで憶えていた内容が偶然多めに出たのでクリアできた。
- 基礎理論とアルゴリズムはクリアできなかった。
- FE17まで勉強した。

# 振り返り
### Keep
- 独習ゼミの時間登録を忘れずにやる。

### Problem
- 基礎理論とアルゴリズムがすごく難しい。
- 特に配列が苦手だと感じた。計算式が出ると確実に間違えている。
- 参考書では簡単そうに見えるが実際の問題文はパズルみたいになっている。

### Try
- [基本情報技術者試験ドットコム](https://www.fe-siken.com/)を使う。
- 基礎理論とアルゴリズムはこれからも重点的に勉強を続ける。
- 午前免除試験対策講座に応募した。
CSSによるSVGアニメーション

今回はSVG独自のプロパティのみを扱うので、CSSアニメーション自体は下記の記事を参照してください。
[CSSによるアニメーション(CSS Transition、CSS Animation)](https://qiita.com/takeshisakuma/items/e178e545089bce4efdad)

CSS以外の方法でのSVGアニメーションはこちらをご参照ください。
[SVGのアニメーション方法の比較](https://qiita.com/takeshisakuma/items/270bc3b7ace61f50ce48)

## 読み込み方
SVGの読み込み方によってCSSが効くかどうかが決まります。

|読み込み方|反映|
|---|---|
|objectタグで読み込んだ場合|CSSでスタイルを書いても反映されない|
|インラインSVG|CSSで書いたスタイルは反映される|



## 準備
SVGをHTML内に配置し、classを指定します。
全てのパーツを別々に動かしたい場合は別のクラス名をつけます。
一緒に動かすパーツは同一のクラス名でよいです。

## 線

|プロパティ|内容|
|---|---|
|stroke|線の色を指定する|
|stroke-width|線の太さを指定(pxは不要、小数点も使用可能)|
|stroke-dasharray|線の間隔を指定|
|stroke-dashoffset|線の位置を指定する(書き順アニメーション)線の開始位置をずらす|
|stroke-opacity|線の透明度|

```:svg
<svg width="200" height="100" viewBox="0, 0, 200, 100" xmlns="http://www.w3.org/2000/svg">
 
  <path d="M10,10 l0,0 180,0" stroke="#333333" fill="none" stroke-width="10" class="anime1"></path>
 
  <path d="M10,30 l0,0 180,0" stroke="#333333" fill="none" stroke-width="10" class="anime2"></path>
    
  <path d="M10,50 l0,0 180,0" stroke="#333333" fill="none" stroke-width="10" class="anime3"></path>
 
  <path d="M10,70 l0,0 180,0" stroke="#333333" fill="none" stroke-width="10" class="anime4" stroke-dasharray="2 4"></path>
 
  <path d="M10,90 l0,0 180,0" stroke="#333333" fill="none" stroke-width="10" class="anime5"></path>
</svg>
``` 


```:css
.anime1{
  animation: strokeAnimation1 ease-in-out 3s;
}
 
@keyframes strokeAnimation1{
  from{
    stroke:#333333;
  }
    to{
      stroke:#e74c3c;
    }
}
 
.anime2{
  animation: strokeAnimation2 ease-in-out 3s;
}
 
@keyframes strokeAnimation2{
  from{
    stroke-width:10; 
  }
    to{
      stroke-width:1;
    }
}
    
.anime3{
  animation: strokeAnimation3 ease-in-out 3s;
}
 
@keyframes strokeAnimation3{
  from{
    stroke-dasharray:2 4;
  }
  to{
    stroke-dasharray:2 2;
  }
}
 
.anime4{
  animation: strokeAnimation4 ease-in-out 3s;
}
 
@keyframes strokeAnimation4{
  from{
    stroke-dashoffset:1;
  }
  to{
    stroke-dashoffset:100;
  }
}
     
.anime5{
  animation: strokeAnimation5 ease-in-out 3s;
}
 
@keyframes strokeAnimation5{
  from{
    stroke-opacity:1; 
  }
  to{
    stroke-opacity:0;
  }
}
```
※hoverをきっかけにするときはanimationではなくtransitionを使うこともできます。

## 塗り

|プロパティ|内容|
|---|---|
|fill|塗りつぶし(transparentも可)|
|fill-opacity|透明度(0〜1)|

### fill:none;
塗りつぶし色を透明にできますが、イベントも無効になります。
SVGをツールで書きだした時には、意図しないnoneが付いていないか確認が必要です。

#### none回避方法
pointer-eventsを設定します。
noneではなくrgbaのalpha0で色を透明にします。

```:svg
<svg width="130" height="230" viewBox="0, 0, 130, 230" xmlns="http://www.w3.org/2000/svg">
       
  <rect x="10" y="10" width="100" height="100" fill="#333333" class="anime1"/>
  
  <rect x="10" y="120" width="100" height="100" fill="#333333" class="anime2"/>
 
</svg>
```     

```:css
.anime1{
  animation: fillAnimation1 ease-in-out 3s;
}
 
@keyframes fillAnimation1{
  from{
    fill:#333333;
  }
    to{
      fill:#e74c3c;
    }
}
      
.anime2{
   animation: fillAnimation2 ease-in-out 3s;
}
 
@keyframes fillAnimation2{
  from{
    fill-opacity:1; 
  }
  to{
    fill-opacity:0; 
  }
}
```
基本情報10月の勉強計画

# 目標と結果
### 目標
- 8項目までの演習をクリアする。
- 学習時間のボタンを忘れずに押す。
- qiitaに慣れる。

### 項目
1．基礎理論
(離散数学・応用数学・情報理論・通信理論・計測制御理論)
2．アルゴリズムとプログラミング
(データ構造・アルゴリズム・プログラミング・プログラム言語・マークアップ言語など)
3．コンピュータ構成要素
(プロセッサ・メモリ・バス・入出力デバイス・入出力装置)
4．システム構成要素
(システムの構成・システム評価指標)
5．ソフトウェア
(オペレーティングシステム・ミドルウェア・ファイルシステム・開発ツール・オープンソースソフトウェア)
6．ハードウェア
(ハードウェア全般)
7．ヒューマンインターフェイス
(ヒューマンインターフェイス技術・インターフェイス設計)
8．マルチメディア
(マルチメディア技術・マルチメディア応用)

### 結果

- 8項目までのテスト項目はクリアできた。
- 学習時間の記録はできている。
- マークダウンの使い方には慣れることができた。

# 振り返り
### keep

- 学習の習慣はできていると思う。
- 学習時間の登録は忘れずにやる。

### Problem

- 卒業論文と運転免許の取得に忙しく基本情報の勉強をしても集中できていない気がする。
- 特に卒論の作業に圧迫され、12月に受けるテストに不安感。
- アルゴリズムと基礎理論が苦手科目としてある。

### Try

- 優先順位をつける(免許取得は先延ばしできる。)

# 週次計画
### [1週目(10/21週目)](https://qiita.com/Yuya_nakano/private/0fb3a87e2e4954ebaf29)
### [2週目(10/28週目)](https://qiita.com/Yuya_nakano/private/4a2757344d6ba0d6b97f)
【Swift】アクセスコントロール

#アクセスコントロール
アクセスコントロールとは、モジュール内の型や型の要素に対する外部からのアクセスを制限することを指します。

##アクセスレベル
アクセスコントロールをどの範囲で制限するかを下記のキーワードで決定できます。

**open**
モジュール内外の全てに対してアクセス許可を出す。

**public**
基本的にはopenと同じだが、モジュール外で継承したりオーバーライドはできない。

**internal**
同一モジュール内のアクセスに限りアクセス許可を出す。

**fileprivate**
同一のソースファイル内のアクセスのみを許可を出す。

**private**
対象の要素が属しているスコープに限りアクセス許可を出す。

##デフォルトのアクセスレベル
型全体のデフォルトのアクセルレベル → **internal**

型全体のアクセスレベルがprivate、fileprivateに指定されている場合の型内部の要素　→　**型のアクセスレベルと同一**

型全体のアクセスレベルがopen、public、internalに指定されている場合の型内部の要素　→　**internal**
Javascript で diff (内部仕様についての補足)

  前回 2019/10/14 に投稿した「[Javascript で diff (通信なし、ローカルで完結)](https://qiita.com/stonee/items/e2d88f07d08171b2816f)」の内部仕様についての補足です。(2019/12/01 加筆)

# 基本アルゴリズム

基本アルゴリズムは、ほぼMyersのアルゴリズムのままです。

- ファイル１とファイル２から、内容が合致する行を探してペアを生成する。
- ペアが作れない行があったら、それは差分である。

diff_orzでは、各行に対してハッシュ値を生成しておき、ハッシュ値を比較するようにしています。
文字列からハッシュ値を生成する方法として、Murmur Hash が有名ですが、ここでは全体行数の短縮を優先で実装しています。
(ハッシュ値の生成のためだけに600行以上増えるのはうれしくないので)

- 半角空白、半角タブは除外してハッシュ値を生成する。
- ハッシュ値が異なる文字列は、異なる文字列である。
- ハッシュ値が同じ文字列どうしを発見した場合は、文字列の比較を行って本当に同じ文字列か確かめる。

```js
const hash = (s_org, bIgnoreCase) => {
	let s = s_org.trim().replace(this.BLANK_PATTERN, ""), len = s.length;
	if (len == 0) { return 0; }
	if (bIgnoreCase) { s = s.toLowerCase(); }
	return [...s].reduce((v, c) => { return (c.codePointAt(0) ^ (v << 2)); }, len);
}
```

# 類似行の判別

変更行どうしで差分をとるにあたって、似ている行であれば差分を表示したいが、「どうみても別物の行」は行の削除＋行の追加として扱いたいわけです。
よく見かける実装では、

- 内容が一致する行どうしを検出する
- 内容が一致していない行のかたまり(hunk)どうしでword単位の差分を生成する

という手順ですが、これだと似ている行と似ていない行の処理が振り分けられません。

そこで、不一致な行どうしで文字列の類似度をはかっておき、似ていれば差分を表示、似ていなければ行の削除＋行の追加とします。
類似度の指標はいろいろな人がいろいろなものを考案されていますが、今回はレーベンシュタイン距離を文字列の長さ(2つの文字列のうち、長いほうの長さ)で割ったものを採用します。
半角スペースと半角タブを除いた状態で50%以上合致していれば、類似していると判定することにします。
DiffEngine.CalcScore() 関数のあたりが該当部分です。


![類似行マッチング.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513949/2f9db17b-5104-198c-1444-caf9129f0bbf.png)

# 左右の入れ替え

ファイル１とファイル２を入れ替えて差分をとる場合、「ファイル１のN1行目を削除」「ファイル２のN1行目に新しい内容の行を追加」をそのまま反転すると行の追加→行の削除の順に表示されてしまいます。
行の削除→行の追加 の順で表示しないと不自然なので、差分を検出し、さらに差分の境界位置を調整した後に並べ替えを行っています。
なので、[swap panes] ボタンで左右を入れ替えた場合、完全には左右対称になっていません。

# diff_orzで採用しなかったアルゴリズムの話

行どうしの差分をとるにあたり、ペアを確定するにあたって

- 先頭から順にペアを確定していく (diff_orzで採用)
- LCS (Longest Common Subsequence) をベースにペアを決定する

の二つのやり方があります。
LCSベースでペアを生成するには、

1. 行どうしのペアが最も長く連続で一致する部分 (= Longest Common Subsequence)を探す
2. ファイル１とファイル２のそれぞれを「LCSの前」「LCS」「LCSの後ろ」に３分割する
3. 「LCSの前」「LCSの後ろ」のそれぞれについて１、２を繰り返す
4. それ以上分割ができなくなったら終了

解説サイトなどでは、LCSベースのほうが自然な差分がとれると説明されているようですが、個人的には「先頭から順にマッチングを行ってから差分の境界を調整する」のでもそんなに効果は変わらないように思います。（あくまで主観）
diff_orzでは不一致行どうしの類似度も判定しているので、LCSベースのアルゴリズムとうまく両立させる方法を思いつかなかったというのもあり、先頭から順にペアを確定することにしました。
UNIXコマンドで見たエラー

UNIXコマンドで見たエラーをメモしておく(随時更新予定)

##cp: omitting directory
以下のように入力したら出現した

```
[vagrant@localhost unix_lessons]$ cp myapp myapp2
cp: omitting directory `myapp'
```
omittingは「省く、 省略する」の意

やりたいことは、【myapp】ディレクトリをコピーして【myapp2】ディレクトリを作成

###エラーの原因
ディレクトリをコピーする場合、「-r」オプションが必要だが無かったため
**-r＝recursive(リカーシブ、再帰的)**という事らしい：http://e-words.jp/w/%E5%86%8D%E5%B8%B0.html

###正しい記述

```
[vagrant@localhost unix_lessons]$ cp -r myapp myapp2
[vagrant@localhost unix_lessons]$
```
エラーは出ずに【myapp2】ディレクトリが作成された




##mkdir: ディレクトリ `myapp3/config' を作成できません
以下のように入力したら出現した

```
[vagrant@localhost unix_lessons]$ mkdir myapp3/config
mkdir: ディレクトリ `myapp3/config' を作成できません: そのようなファイルやディレクトリはありません
```
やりたいことは、【myapp3】ディレクトリを作成してその中に【config】ディレクトリを作成

###エラーの原因
親ディレクトリである【myapp3】が存在していないので、子ディレクトリを作成することができないため

###正しい記述

```
[vagrant@localhost unix_lessons]$ mkdir -p myapp3/comfig
[vagrant@localhost unix_lessons]$
```

**-pオプション(--parentsオプション,エラーを表示せず記述したディレクトリが存在しなければ作成する)**を
追加したので、エラーは出ずに【myapp3】ディレクトリが作成されその中に【config】ディレクトリも作成された




##rmdir: failed to remove `myapp2'
以下のように入力したら出現した

```
[vagrant@localhost unix_lessons]$ rmdir myapp2
rmdir: failed to remove `myapp2': ディレクトリは空ではありません
```
やりたいことは、【myapp2】ディレクトリの削除

###エラーの原因
【myapp2】ディレクトリの中に【myapp3】ディレクトリが存在しているため
**rmdir(remove directory)は空のディレクトリにしか使えない**のでエラーが出た

###正しい記述

```
[vagrant@localhost unix_lessons]$ rm -r myapp2
[vagrant@localhost unix_lessons]$
```
エラーは出ずに【myapp2】ディレクトリが削除された

ちなみに下のように入力するとエラーになる

```
[vagrant@localhost unix_lessons]$ rmdir -r myapp2
rmdir: オプションが違います -- 'r'
詳しくは `rmdir --help' を実行して下さい.
```
「rm -r」はOKで「rmdir -r」はNGなのね…
未経験がマッチングアプリを作ってみた話【Rails】

## はじめに
未経験からのWeb系企業転職をするためのポートフォリオを作成しました。
マッチング機能を用いてエンジニアをつなぐサービスです。
８月から勉強をはじめ、10月から着手し完成まで至りました。（改修は随時行なっていきます。）

## なぜ作った？
私は現在地方で働いています。
だいぶ田舎にいるため、東京都比べてしまうとコミュニティが少ないです。というかありません。
このような壁があり、エンジニアとの繋がりが少ないのです。

そこで、エンジニア向けのマッチングアプリがあればこの問題は解決できるのでは？というのが始まりです。
Twitterでよくない？という声が聞こえてきますが、Twitterではその人の得意な技術や好きな分野を調べなくてはなりません。
このサービスでは、「タグ機能」があり、その人の好きな分野をすぐに知ることができます。

##　サービス紹介

![スクリーンショット 2019-10-20 21.15.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481205/bc53e26d-f506-c8d6-11df-35cf2d42aaf0.png)

【リンク】
https://engineer-link.herokuapp.com

【Github】
https://github.com/kotaro-saitou/engineer-link-app

Engineer Linkは、エンジニアとエンジニアが気軽にメッセージを送りあえるサービスです。

### 主な機能
・画像付きユーザー登録機能
・（ログイン時）フォロー/アンフォロー機能
・記事の投稿機能
・タグ（Ruby、Pythonなどの自分の好きな技術など）の画像付き投稿機能
・相互フォローのみリアルタイムメッセージ機能
・記事、タグ、ユーザー一覧でのページネーション機能

### 技術
・Rails5.2.2
・Ruby2.5.4
・CircleCI
・Rspec
・Heroku
・AmazonS3（プロフィール画像、タグの画像）
・ActionCable（リアルタイムチャット)

### 工夫
・CircleCIを用いて自動デプロイを実装
・Githubでissue管理を行なった

## 参考にしたサイト
### 【Rails】Herokuで画像を投稿できるようにする方法（ActiveStorage + Amazon S3）
https://qiita.com/hmmrjn/items/479c9e9ce82771f1b6d7

### Rails5.2から導入されたcredentials.yml.encを極める
https://qiita.com/yuuuking/items/53a37a2e998972be32b8

### Rails 5 + ActionCableで作る！シンプルなチャットアプリ（DHH氏のデモ動画より）
https://qiita.com/jnchito/items/aec75fab42804287d71b

### 未経験がWeb系転職成功したいならgithubでissue管理して開発しよう
https://qiita.com/fukubaka0825/items/c7710b4e87d478c8ba3b

全てとても参考になりました！！
ありがとうございます！！！

## 思ったこと
このサービスを開発するにあたり、以下の技術は勉強しながら実装しました。

・Rspec
・ActionCable
・CircleCI

この辺りのことを実装するにあたり、「手を動かしながら学ぶことの重要性」を感じました。（特にRspec）

Rspecの勉強はEveryday Railsが本当におすすめです！！
https://leanpub.com/everydayrailsrspec-jp
翻訳してくださっている方々に深く感謝しながら勉強しましょう。

CircleCIに関しては、調べながらやっていけば比較的簡単に導入できます。

## ポートフォリオを作成できていない未経験の方へ
Progateなどで基礎を勉強することは楽しいですし、素晴らしいことです。
しかし、勉強したことを元に物を作るのはもっと楽しいです！

なんでもいいので、物を作り、そこに自分にとって未知の技術を取り入れることは、
勉強にもなり非常に楽しいです。

## 最後に
これからは、この二ヶ月はサーバーサイドに偏りすぎていたので、フロントの勉強に力を入れつつ
引き続き頑張ります！
Julia関数のデフォルト引数

Juliaの関数は引数を省略したときのデフォルト値を指定できる。

``` julia
julia> function f(a, b=0)
           print("$a $b")
       end
f (generic function with 2 methods)

julia> f(1, 2)
1 2
julia> f(1)
1 0
```

まあ、これはこの手の言語としてはわりに普通の機能だ。でも、Juliaの場合、ちょっと面白いことに、このデフォルト値の部分に他の引数を参照した式がかける。

``` julia
julia> function g(a::Vector{Int64}, b=length(a))
           print("$a $b")
       end
g (generic function with 2 methods)

julia> g([1,2,3])
[1, 2, 3] 3
julia> g([1,2,3], 10)
[1, 2, 3] 10
```
これは地味に便利。

ちなみにPythonでは書けない。

``` Python
In [1]: def g(a, b=len(a)):
   ...:     print(a, b)
   ...:     
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-1-e17b8e13041f> in <module>()
----> 1 def g(a, b=len(a)):
      2     print(a, b)
      3 

NameError: name 'a' is not defined
```
こんな感じでエラーがでる。外部変数を参照して宣言することはできるが、宣言の際に評価されるだけなので挙動は全然違う

``` python
In [5]: x = [1,2]

In [6]: def g(a, b=len(x)):
   ...:     print(a,b)
```
eachで回す時の<% %>と<%= %>の違い

eachで回していて、
なぜか、以下の画像のように出力されました。
<img width="991" alt="スクリーンショット 2019-10-20 21.12.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436942/da30b1d3-d66e-b0f1-c42f-ce46d63e917f.png">

```
[#<User id: 1, name: "aaaa", email: "aaaaa", created_at: "2019-10-19 12:10:03", updated_at: "2019-10-19 12:10:03">,
 #<User id: 2, name: "bbb", email: "bbbb", created_at: "2019-10-19 12:10:35", updated_at: "2019-10-19 12:10:35">]
```

この部分いらないな。てか、なんで出てきたんだろう。今までこんな事なかったのに、、、
と思っていたところ、問題は、viewでした。

```index.html.erb
<h1>Users#index</h1>
<p>Find me in app/views/users/index.html.erb</p
<div>
  <%= @user.each do |user| %>
    <p>
      <%= user.name %>
      <%= user.email %>
    </p>
  <% end %>
</div>
```

 <%= @user.each do |user| %>の＝が問題でした。
 <% @user.each do |user| %>とすると、いらない部分は消えました。
＝をつけると、データ側も出力されるという新しい発見でした笑
【WordPress、PHP、SQL】サーバサイドの基本まとめ！

HTML、CSS、JSなど静的ページを作り慣れているWebデザイナーがサーバサイドはどんなことができるのか？についてWordPressを通じて体験してみよう！という記事を書きました。下記にまとめます。

# サーバサイドの中でのWordPressの位置付け

まずは大枠から、サーバサイドを構成するプログラミング言語とデータベース言語。そしてサーバサイドの中でのWordPressの位置付けを解説。

※参考：[サーバサイドの中でのWordPressの位置付け](https://www.i-ryo.com/entry/2018/01/01/025230)

# PHPの基本を理解するためにJSと比較する

WordPressのコードはPHPで書かれているので、PHPを読み書きする必要がある。JSの書式と比較しながら理解する。

※参考：[PHPの基本を理解するためにJSと比較する](https://www.i-ryo.com/entry/2018/01/08/132643)

# ざっくりWordPress：PHP書式とテンプレートタグの識別-前編

WordPressサイトからダウンロードできるファイル一式の構成。index.phpのコード、WordPressのテンプレートタグ、インクルードタグ、そしてWordPressループについて解説。

※参考：[ざっくりWordPress：PHP書式とテンプレートタグの識別-前編](https://www.i-ryo.com/entry/2018/01/10/222838)

# ざっくりWordPress：PHP書式とテンプレートタグの識別-後編

content.phpのコード、投稿のテンプレートタグ、header.php、footer.phpの必須タグ、functions.phpのテーマ独自タグ、プラグインのメソッドについて解説。

※参考：[ざっくりWordPress：PHP書式とテンプレートタグの識別-後編](https://www.i-ryo.com/entry/2018/01/13/005356)

# SQL文はLocal by FlywheelのAdminerから慣れよう（WordPressのDB操作：その1）

WordPressとMySQLの関係、WordPressのローカル環境「Local by Flywheel」、DBにアクセスするAdminer、WordPressのDBのダンプ（sql）ファイル、そしてSQL文の三種類（DDL、DML、DCL）について解説。

※参考：[SQL文はLocal by FlywheelのAdminerから慣れよう（WordPressのDB操作：その1）](https://www.i-ryo.com/entry/2018/10/23/233644)

# AdminerからSQL文で「我輩は猫である」を「犬」にしてみる（WordPressのDB操作：その2）

Adminerの4つのメニュー、SQL command：SQL文入力、Import：ダンプファイルインポートとExport：ダンプファイルエクスポート、Create table：新規テーブル追加、WordPressのテーブル構成、「wp_posts」は投稿データのテーブルを解説。

「我輩は猫である」を投稿すして、SQL文で「我輩」を「犬」にする！

SQL文（DDL、DML、DCL）、DMLの基本命令（SELECT文、INSERT文、UPDATE文、DELETE文）の解説。

「SELECT文」で「猫」を検索、「UPDATE文」で「猫」を犬にする、「INSERT文」と「DELETE文」は投稿自体の追加、削除。

※参考：[AdminerからSQL文で「我輩は猫である」を「犬」にしてみる（WordPressのDB操作：その2）](https://www.i-ryo.com/entry/2018/10/25/072958)
【 駆け出しWEBエンジニアのためのメモ】駆け出し時に使用頻度の高いショートカットキー(Mac用)

こんばんわ！

TECH:EXPERTで学び始めて2日目、
HTML/CSSのコードをひたすらに書いてます！

いくつか例をこなす中で気付くこと
「同じ文、同じ作業の繰り返し多いなっ！！！」

そんな面倒臭い状況を打破する為の強い味方の1つが
「ショートカットキー」

全部覚えようと思ったらこれだけあります（リンク参照）
https://support.apple.com/ja-jp/HT201236

数多くないですか？
パソコン投げたくなる、、、

というわけで
私が今よく使ってるショートカットキーを
備忘もかねて下にメモしておきます♪
よければ、使ってみてください(^^)


↓↓↓


command + C　：　コピー
command + V　：　ペースト
command + X　：　切り取り
command + R　：　Safari、GoogleChromeなどのAppではリロード（画面更新）
option + クリック　：　複数選択（コードを複数箇所に同時記入できる）
option + ¥　：　「\」（今後Rubyなどでプログラムを書くときによく使う予定）
私が業務で使っているリナックスコマンド（随時更新）

GUI大好きで黒い画面恐怖症だった私ですが、、、、
覚えたLinuxコマンドをココに記録していきます。
（リーナス トーバルズに捧ぐ。。。）

##移動
覚え方 : チェンジディレクトリ

```:コマンド
$ cd [半角][ディレクトリの場所]
```

## 私は今どこにいますか？
覚え方：何かいいおぼい覚え方ありませんか？？(Print Working　Directoryの略です。)

```:コマンド
$ pwd [半角][ディレクトリの場所]
```

## ディレクトリの内容、ファイルの内容を表示する
覚え方：リスト セグメント

```:コマンド
$ lｓ [半角][ディレクトリの場所/ファイル名]
```

よく使うオプション
- a => "."を含むファイルを含めて表示する。

## ディレクトリの内容、ファイルの内容を詳しく表示する
覚え方：L.L. COOL J太郎

```:コマンド
$ ll [半角][ディレクトリの場所/ファイル名]
```
```ls -l``` と同じ意味との事。私の大好きなコマンド。J太郎先生！

## 階層のあるディレクトリを作る
pオプションを付けると階層のあるディレクトリを作ることが出来ます！便利！

```:コマンド
mkdir [半角][-p][ディレクトリ名/ディレクトリ名/ディレクトリ名/]
```

## コピーを作る

```:コマンド
cp [半角] コピー元ファイル コピーするファイル名
cp [半角] ファイル名 コピーするファイル名
```
例： aaa.txtをコピーしてbbb.txtとしてコピーを作る

```
cp aaa.txt bbb.txt
```

## 探す

```:コマンド
which locate
```
例： locateを探す

```:結果
/usr/bin/locate
```

つづく。。。
Tableau ServerのWeb編集でテキスト表のディメンションの幅が調整できない場合の原因と対処

# 前提
Tableau Server 2019.3
Tableau Publicでも再現
（本記事中のキャプチャはTableau Publicのもの）

# 事象
Tableau Desktopで作成したテキスト表をTableau Serverにパブリッシュして、その後、Web編集でテキスト表のディメンションの幅を調整しようとしたところ、カーソルが変わらず幅調整できませんでした。
ちなみに、Tableau Desktopでは普通に幅調整できるのと、メジャーについてはTableau Desktop、Tableau Serverに関わらず幅調整可能でした。

## OKパターン
<img width="195" alt="ok.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184997/55cd315a-48e3-4080-db7e-cca3f1df0b1b.png">

## NGパターン
<img width="137" alt="ng.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184997/3d4890ba-836d-3f33-6a9b-5ee613d31759.png">

# 原因と対策
はっきり分かったわけではないですが、ヘッダーの表示のチェックが外れているディメンションがあるとこの事象になるようです。チェックを入れると幅調整でき、外すとまた出来なくなります。

<img width="361" alt="cause.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184997/1c280b39-3784-3850-db95-ade87bd61c0e.png">

というわけで、
1. ヘッダーの表示チェックON
2. ディメンションの幅調整
3. 再びヘッダーの表示チェックOFF
とすることで回避できます。

# Tableau ServerがTableau Desktopに近づいている？
コンテンツの Web 編集、保存、およびダウンロード アクセスを設定する - Tableau
https://help.tableau.com/current/server/ja-jp/web_author_who.htm
> アナリストにとって、Web 編集は Tableau Desktop と同程度には機能が豊富ではない (同程度に近づきつつはあります)。

特にパフォーマンスにおいて、また、今回のような機能面においても、正直まだまだだなという印象です。ただ、Webで出来るメリットも大きいと思うので、Tableau社にはこの方面もがんばってほしいです。
心を健康に保つための怒り方を考えてみた

# 結論
心に怒りを感じたとき、それを燻ぶらせると負の感情が増大して自分も他人も傷つける。怒りを感じたら行動を起こすときだと捉え、建設的に対応することで気が楽になる。

# 経緯
リリースまで完成した機能が丸ごと不要になった事件が起きた。原因を分析していくと、機能担当の人間（自分）と、ビジネス担当の人間の仲介がうまく機能しておらず、仕様が曖昧なままリリースさせてしまったことが分かった。

伝言ゲームをやめたいので、担当者同士で直接やりとりしたいと仲介担当に申し入れたが、契約の関係で仲介者を通さない情報伝達は禁止されていることを知った。理不尽さを感じた。

怒りが収まらないので、理不尽さを解消するために頭に負荷を掛けて改善提案を考えることにした。考えた提案を持って仲介担当と１対１で話し、結果として状況は改善しなかったものの、自分が感じた怒りは収束させることができた。

ポイントは、「**自分が問題だと感じている状況を周りに知ってもらうための情報共有、および問題提起行動であり、性急な問題解決を目的にしないこと**」だ。解決まで主導しようとすると誰かしら反発する人が出る。あくまで、自己主張の域を出ない意見であることを認識すると良いと思う。
Ruby の shoryuken gem のコマンドオプションを何度も忘れる気がするのでメモしておく

もう -R とか -C とかいうショートオプションはやめて世界から廃絶したい。

```
      method_option :concurrency, aliases: '-c', type: :numeric, desc: 'Processor threads to use'
      method_option :daemon,      aliases: '-d', type: :boolean, desc: 'Daemonize process'
      method_option :queues,      aliases: '-q', type: :array,   desc: 'Queues to process with optional weights'
      method_option :require,     aliases: '-r', type: :string,  desc: 'Dir or path of the workers'
      method_option :timeout,     aliases: '-t', type: :numeric, desc: 'Hard shutdown timeout'
      method_option :config,      aliases: '-C', type: :string,  desc: 'Path to config file'
      method_option :config_file,                type: :string,  desc: 'Path to config file (backwards compatibility)'
      method_option :rails,       aliases: '-R', type: :boolean, desc: 'Load Rails'
      method_option :logfile,     aliases: '-L', type: :string,  desc: 'Path to logfile'
      method_option :pidfile,     aliases: '-P', type: :string,  desc: 'Path to pidfile'
      method_option :verbose,     aliases: '-v', type: :boolean, desc: 'Print more verbose output'
      method_option :delay,       aliases: '-D', type: :numeric, desc: 'Number of seconds to pause fetching from an empty queue'
   
```

[shoryuken/shoryuken at master · phstc/shoryuken](https://github.com/phstc/shoryuken/blob/master/bin/shoryuken)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2615








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ネットワークスペシャリスト 午後Ⅰ 解答【令和元年度・2019年度】

# ネスぺ 午後Ⅰ 解答  (2019/10/20 20:30)
本日受験したNWの午後Ⅰ。
問1、問2を選択したので、問3の解答はなし。
とりあえず自分の解答。

## 問1 ネットワークの増強
自己採点：30~40/50点

簡単そうだったので選択したが、意外とぱっとしなかった。
設問1-(4)は、絶対間違っていると分かりながら書いた。
LACPのメリットマルチベンダ以外出なかった、バグがだるいとかデメリットなら浮かんだけど…。
設問2-(3)あたりも怪しい。

### 設問1
(1)↓
a：BGP
b：バックボーン
c：GARP

(2)~~エ、オ、~~ キ、ク、ケ、コ、サ、シ、ス

(3)キ、ク、ケ、コ、サ、シ、ス

(4)~~異なるベンダの機器間でLAGを構成でき、機器交換などにも柔軟に対応できる~~
リンク断以外の障害が発生した場合にも障害を検知し、自動的にポートを閉塞することが可能となる

(5)L3SW3とL2SW1間でパケットが輻輳する

(6)宛先MACアドレス、送信元MACアドレスがコアルータやL3SWとなり、負荷分散に偏りが生じる

### 設問2
(1)↓
d：ICMP
e：トラップ
f：MIB

(2)ⅲ

(3)コアルータからL3SW

## 問2 Webシステムの構成変更
自己採点：38~47/50点

最近クラウドサービスとか実務でもよく使うし、XFFヘッダとかも馴染みあるので選択。
設問2-(1)の(ア)は「交互」と迷った結果「均等」にしたけどどうだろう。
ちなみに(エ)と(オ)はどっちがSet-CookieでどっちがCookieか確信持てなかったから、両方Set-Cookieにして確実に1問取りにいった(笑)
設問3-(3)は自分だったらこうするってやり方をなんとなく書いた。

###設問1
IP-w1の変更時に、DNSサーバの資源レコードの変更作業が不要となる

###設問2
(1)↓
ア：均等
イ：80
ウ：200
エ：Set-Cookie
オ：~~Set-Cookie~~←Cookie

(2)負荷分散されない

(3)セッションIDに基づくセッション維持

###設問3
(1)↓
カ：FW
変更内容：WebシステムへのHTTPS通信を、すべての送信元から許可する

(2)shop IN A 199.α.β.2

(3)XFFヘッダに情報がなければ送信元IPアドレスを挿入する
Androidでダークモード対応のアプリを作ってみる

# はじめに
- このスライドは最近流行っている？ダークテーマに
ついてまとめてみたので情報整理として記録したものです。
- 参考ソース：[ダークテーマ｜Android Developers](https://developer.android.com/preview/features/darktheme?hl=ja)
 
---

# ダークテーマとは

- Android Qから登場した黒を基調としたUI
- iOSでも13から対応
- アプリ以外ではすでに取り入れられているサービスもある
    - Android StudioとかmacOS、Windowsとか
    
---

# ダークモードのメリット(個人的に)
- 目に優しい
    - ディスプレイの明るさと画面の白さを組み合わせたらあかん
- コーディングの際文字が見やすい
    - 黒板に文字を書いているイメージ
- バッテリーの消費量を抑えれる(条件あり)

---

# Androidの場合
- 通常モードとダークテーマでは以下のように変わる  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115925/01792214-2b57-c291-aa5c-91a2c4e7f8bc.png" width="300">

---

# Androidの場合
- 通常モードとダークテーマでは以下のように変わる  
    - 色設定をしていない部分が切り替わる？
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115925/86bbf1f9-c7eb-30c8-98c2-69dfce0d9acd.png" width="300">

---
# 設定方法(開発側)
```
<!-- 通常のダークテーマ-->
<style name="AppTheme" parent="Theme.AppCompat.DayNight">

<!-- MaterialComponentsのダークテーマ-->
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
```

- Android Manifestに上記を記述
    - アプリのテーマとして設定をする
- 最低SDKバージョン(minSDK)についての記載は確認できず
    - 筆者は17で動作確認しましたが特にエラーはなかったです
    

---
# 設定方法(ユーザ側)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115925/0dd6f3d3-6b87-f431-d35d-7a9c4653085c.png" width="200">

- Android Qを載せた端末で設定 -> ディスプレイ -> ダークテーマをON

---
# 未対応OSとの混合について
- OSがダークテーマ未対応の場合、
通常のレイアウトとして表示される。
    - 現段階では影響なしと筆者は判断

---
# 使用する際の注意点
- アプリ起動時にダークテーマの切り替えを行うと
**アクティビティが再生成される**
    - ライフサイクルには注意
- 切り替え時のタイミングで処理をしたい時は別途設定が必要

---
# 切り替わりのタイミングをハンドリングする

```
<activity android:name=".MainActivity"
    android:configChanges="uiMode">
```
- AndroidManifestでハンドリングを行いたいActivityで上記を記述

---
# 切り替わりのタイミングをハンドリングする
```kotlin
override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)

    // ダークテーマがOS側で設定されているか調べる
    val isDarkTheme = newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK
    when (isDarkTheme) {
        Configuration.UI_MODE_NIGHT_NO -> Log.d("msg", "通常モード")
        Configuration.UI_MODE_NIGHT_YES -> Log.d("msg", "ダークテーマ")
    }
}
```

- onConfigurationChangedメソッドを宣言し、適宜処理を行う。
    - 画面の縦横切り替えなどのハンドリングを行うメソッド
    - 参考資料：[構成の変更を処理する](https://developer.android.com/guide/topics/resources/runtime-changes?hl=ja)

---
# まとめ
- いくつかの項目さえ気を付ければ、ダークテーマの導入は簡単
    - ライフサイクル、色の相性など
- ただQ自身がまだシェアは低そうなので急いで対応する必要はなさそう
    - [wikipedia](https://ja.wikipedia.org/wiki/Android%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E5%B1%A5%E6%AD%B4)によると0.4%
- 黒いテーマがもっと普及するといいね！
Raspberry Pi でPWM信号使ってLEDの明るさを変更する

# Raspberry Pi でPWM信号使ってLEDの明るさを変更する

# PWM信号
周期的にオンとオフが切り替わる信号で、1波長の中でのオンの時間とオフの時間の割合を調整するで、
一連の流れの中での出力を変更できる信号

![PWM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515629/412d9b0f-ddf0-c77f-a6aa-d4c0e5ef64a2.png)![PWM2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515629/0c17f222-dd22-2288-d732-278e6218d705.png)

# Raspberry Pi とLEDを接続する
今回はたまたま家にあった赤色LEDをつかった。
電圧は Raspberry Pi からのPWMの3.3Vで足りるため、アノードにそのまま接続。
( 今回は18番のPINを使用 )
![pi_GPIO_PWM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515629/57722dd3-edf5-28f9-d059-0f224f09b4f3.png)
![PWM_LED.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515629/6ae06bed-9f85-2132-272a-656270a4c8c4.png)


# PWMを出力するコードを書く
- 以下のコードでは、10%の出力と100%の出力を約3秒ごとに2回繰り返す

```python
import RPi.GPIO as GPIO
import time


def main():
    frequency = 200
    repeat_count = 600
    gpio_pin = 18

    GPIO.setmode(GPIO.BCM)
    GPIO.setup(gpio_pin, GPIO.OUT)

    for i in [10, 100, 10, 100]:
        if 0 == i:
            on_time = 0
            off_time = (1 / frequency)
        else:
            on_time = (1 / frequency) * (i / 100)
            off_time = (1 / frequency) * (1 - (i / 100))

        for rc in range(repeat_count):
            GPIO.output(gpio_pin, True)
            time.sleep(on_time)
            GPIO.output(gpio_pin, False)
            time.sleep(off_time)

    GPIO.cleanup()


if __name__ == '__main__':
    main()
```
iOS13のモーダルはFullscreenもいいけどCurrentContextも検討してみて

iOS13からモーダルを表示するときはセミモーダルがデフォルトの挙動となりました。
![スクリーンショット 2019-10-20 20.02.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/4a6813a5-6b65-2421-3078-97219568b70e.png)
完全なフルスクリーンではなく後ろのViewが少し見えるようなデザインで、下にスワイプで元のViewに戻ることができます。

これをされると困るデザインがあります。例えばログイン後に表示されるViewはセミモーダルではなくフルスクリーンで表示したいでしょう。

StoryboardからPresentationを`Fullscreen`にすることで次のモーダルを完全なフルスクリーン状態で遷移できます。
![スクリーンショット 2019-10-20 20.06.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/aeaa33c0-086f-533c-6c93-3783eda6813d.png)

Swiftの場合はこうします。

```swift
let vc = ViewController()
vc.modalPresentationStyle = .fullScreen
present(vc, animated: true)
```

![スクリーンショット 2019-10-20 20.09.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/07996c63-b4b2-47ae-94fa-f41a9e613e67.png)
この状態であればスワイプで戻ることもできません。
ここまでであればあまり問題はなさそうに見えます。

# さらにModalで遷移したいとき
ここからさらにモーダルを表示したいとします。このときはセミモーダルのほうが利便性があがるので普通の遷移にします。
するとどうでしょう。

![スクリーンショット 2019-10-20 20.12.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/884580b0-f4b7-40e8-d958-aa52345d4769.png)
なんと**後ろのViewが下がらないまま**セミモーダルが出てしまいました。

iOS13においてfullscrrenでモーダル表示したものはずっとfullscreenの状態を維持するのでこのような動きになるようです。
でもこれじゃかっこよくない！下がってほしい！というときは`Current Context`を使ってみます。

先ほどのFullscrrenからCurrent Contextに変更します。するとStoryboard上では灰色はフルスクリーンで、その次のモーダルでは灰色Viewが下にずれているのが確認できます。
(よく見ると上のStoryboardでもFullscreen選択時のモーダルの見え方はシミュレートされていましたね)
![スクリーンショット 2019-10-20 20.15.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/45bb70ec-afe4-c3e3-6c80-deb2b08049d6.png)

ではこれで解決！かと思いきや実際実行してみると・・・

![スクリーンショット 2019-10-20 20.17.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/4a2c33e1-64ef-f6bf-a5b0-32d4c49346b0.png)
なんと今度はステータスバーが全く見えなくなってしまいました。

# CurrentContext時にStatusBarを見えるようにする
これは推測ですが、CurrentContextによって諸々の状態を参照する先が灰色のViewになっているのだと思われます。灰色Viewの時点ではステータスバーは黒色テキストなので、モーダル遷移後も灰色Viewからステータスバーの情報を取得していると考えると、黒の背景に黒のテキストとなってしまい見えなくなってしまったものと考えられます。

これを回避するにはViewController毎にステータスバーの色は何色にすべきかという情報を設定します。

灰色のViewControllerに`preferredStatusBarStyle`プロパティをオーバーライドします。

```swift
class ViewController: UIViewController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        if presentedViewController != nil {
            return .lightContent
        } else {
            return super.preferredStatusBarStyle
        }
    }
}
```

`presentedViewController`は現在のViewController(灰色)からみてさらにモーダル表示しているViewControllerがあればそのViewControllerが、なければnilが返ってきます。
つまりpresentedViewControllerがnilでないなら何かしらモーダルを表示しているということです。
このときはステータスバーを白とし、それ以外はデフォルトの挙動としました。
ここを拡張することでもう少し細かな要望にも応えることができます。例えば次のModalもフルスクリーンだったらデフォルト挙動にするとかですね。

青色のViewControllerのpreferredStatusBarStyleは参照されませんでした。これもCurrentContextが影響していると考えられます。

これでめでたくセミモーダル時にステータスバーが白になりました。
![スクリーンショット 2019-10-20 20.22.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/bfa1123b-b8d7-6e04-3bb8-95c0d0a76eb8.png)
[ゼロから作るDeep Learning]ニューラルネットワークの学習について分かりやすく解説してみた

#はじめに
この記事は**ゼロから作るディープラーニング 5章ニューラルネットワークの学習**を自分なりに理解して分かりやすくアウトプットしたものです。
文系の自分でも理解することが出来たので、気持ちを楽にして読んでいただけたら幸いです。
また、本書を学習する際に参考にしていただけたらもっと嬉しいです。

#ニューラルネットワークの学習とは
前章の記事でも説明した通り、多層パーセプトロンでコンピュータのような複雑な処理を行うためには数万にも及ぶ数のパラメータを設定しないといけません。そして、その設定をデータを学習することで自動的に設定してくれるのがニューラルネットワークです。
つまり、ニューラルネットワークの学習とはデータを学習して複雑な処理ができるような最適パラメータを設定することいです。

では、どのような仕組みで学習して最適なパラメータを見つけ出すのでしょう。ニューラルネットワークの学習で重要となるものは主に二つあります。それは、**損失関数**と**勾配(微分)**です。

#損失関数について
損失関数とはニューラルネットワークの性能の悪さを表してくれる関数で、ニューラルネットワークが自身の現段階の性能を判断するための指標として使われます。
ニューラルネットワークの学習では損失関数の最小化を目標に処理をしていきます。
詳しいことは次の記事で解説します。

#勾配(微分)について
勾配とは各パラメータの最適な値への方向を表すものです。具体的なことを言うと、各パラメータの偏微分を一次元配列にまとめたものを言います。

偏微分は各変数を微小な値増加させた時の全体に及ぼす変化を表します。つまり、各パラメータの偏微分を出すことで各パラメータを微小な値増加させた時の損失関数の変化を出すことができます。
ニューラルネットワークの学習では損失関数の最小化を目指すので、偏微分が正の値ならパラメータの値を小さくすれば最適パラメータに近づき、負の値ならパラメータの値を大きくすれば最適パラメータに近づくことがわかります。
<img width="328" alt="スクリーンショット 2019-10-20 20.21.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510602/beb84075-9f72-077a-3f5c-baac55be929c.png">


こうして勾配を求めることでパラメータを進める方向を求めて最適パラメータを探索していきます。


今回は簡単な内容だけを解説しましたが、次回から詳しい解説や実装を行いたいと思います。
特定フォルダ配下のすべてのlessファイルをcssにコンパイルする

HTMLをUIに使っているアプリケーションをコンパイルするときにたまにあるのが、うっかりLESSファイルをCSSに変換し忘れてしまうということ。

そのようなとき、デプロイ用のスクリプトに「すべてのLESSファイルをCSSにコンパイルする」ようなコードがあると便利です。

```powershell:1
ls .\html\*.less | % { .\node_modules\.bin\lessc ($_.FullName) > ($_.FullName -replace "\.less$", ".css") }
```

# 前提条件
前提条件として、以下の二つがあります。

* lessファイルはすべて`html`フォルダに格納されていること。
* `npm install -save-dev`で`lessc`が既にインストールされていること

# PowerShellのバージョンによる挙動の違い
なお、PowerShell 5.xで実行すると、このスクリプトによって生成されるCSSファイルは強制的に(LESSファイル内部の指定を無視して)UTF16で出力されます。

たとえば以下のようにすると、UTF-16をUTF-8に変換することができますが、BOMつきです(PowerShell 5.xの制限で、BOM無しに変更するにはPowerShellのコマンドが使えません)。

```powershell:2
ls .\html\*.less | % { .\node_modules\.bin\lessc ($_.FullName) > ($_.FullName -replace "\.less$", ".css16") }
Get-ChildItem .\html\*.css16 | % { Get-Content -Encoding Unicode ".\html\$($_.Name)" | Set-Content -Encoding UTF8 ".\html\$($_.BaseName).css" }
Remove-Item .\html\*.css16
```

PowerShell 6.xを入れると、1のコードを実行しただけでUTF-8になりますので、BOM無しUTF-8を使いたい場合はPowerShell 6.xをインストールしてから、そのコンソール上でスクリプトを利用しましょう(逆にPowerShell 6.xにすると、2のコードのような処理を行うと、文字化けしたCSSファイルが出力されます)。

# 参考記事

* [PowerShellでBOM無しUTF8を簡単に扱う、デフォルト設定を簡単に変える方法 \- しばたテックブログ](https://blog.shibata.tech/entry/2016/10/02/154329)
* [PowerShell 6\.0からファイル出力に関わるエンコーディングが変わります \- しばたテックブログ](https://blog.shibata.tech/entry/2017/11/04/215929)
AWS SQS の可視性タイムアウトとは？何故そんなものがあるのだろうか？ を少しだけ考えてみる。( #AWS )

# 可視性タイムアウトがなかったらどうなるか。

- AWS がキューからWorkerにメッセージを渡した瞬間に、メッセージを物理削除してしまったら、ジョブ処理が失敗した時に、復帰できないだろう。なぜなら物理削除されているので。
- AWS がキューからWorkerにメッセージ渡した後mお、メッセージを残したままだと、他のWorkerや他のプロセスが、処理が成功する前、あるいは失敗する前に、同じメッセージを受け取ってしまうかもしれない。これでは重複処理が起こるのではないだろうか。
- つまり、AWSはメッセージを一定時間論理削除して、ロックしておき、他のプロセスからは見えない状態にしておいて、重複処理されないように守っておく必要がある。これが可視性タイムアウトという分かりにくい名前じゃないだろうか。あーもう単にメッセージロックとかでも良いのでは？
- すなわち、たとえば1分かかる処理がある場合、可視性タイムアウトを30秒にしてしまうと、処理が成功する前にロックが外れ、他のプロセスがメッセージを処理してしまう可能性がある。なので可視性タイムアウトの設定は、処理にかかるであろう時間よりも長めに設定しておく必要がある。
- AWS SQSが一定期間、メッセージを論理削除して、まるで物理削除されているかのように扱う振る舞いが可視性タイムアウトの仕組みではないか。
- Workerは処理が成功したタイミングや処理を諦めたタイミングで、AWS SQSにメッセージを送信して、メッセージ自体を削除する必要がある。これにも可視性タイムアウトの仕組みが関係している気がするが、うまく言語化できるまでは至っていない。

# 参考

>引用の通りですが、SQS には可視性タイムアウトという設定値があって、Shoryuken の worker が SQS から>メッセージを受け取ると、SQS 側はメッセージを一定時間、論理削除します。
>worker はジョブが完了すると SQS 側にメッセージの削除要求を投げて、論理削除されていたメッセージを物理削除します。
>もし、 worker 側で処理に失敗、または可視性タイムアウトの設定時間を経過しても処理が終わらなかった場合、SQS 側で論理削除を解除して、次のリクエストでメッセージを再配信します。
>この仕組みがあるため、 Shoryuken 側でリトライを設定していなくとも、失敗した処理は再度実行されるようになります。
>万が一 worker のプロセスが死んでしまっても、 SQS 上でメッセージはちゃんと生きている訳です。

[Shoryuken を導入しようとして諦めた話 - Qiita](https://qiita.com/ryosuke_sato/items/09ba3fe824c0b62c0d1e)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2613








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
正規化から始める人間関係の救いかた

正規化とは、リレーショナルデータベースでテーブル設計を行う際に実施されるテクニックのことで、テーブルに不必要なNULLを減らすように努力することとも言える。テーブルにNULLが生まれるということは、情報の生成タイミングにズレがあるということであり、生成タイミングの異なる情報は別のテーブルに切り出すことで情報の整合性を保つ。

情報の生成タイミングにズレがあるということは、「その時々で必要な情報には差がある」ということになる。NULLを不必要に許容すると情報量が増え、データ操作に矛盾が発生する。

これを、コミュニケーションに置き換えて検討してみよう。よくある、「伝えた、伝わってない問題」の予防から考えてみる。

対応策としては、「最初からぜんぶ言わずに、理解度について合意を取る」ことが肝心だと思う。

新しく仕事場に入った人にオンボーディングを施す場合なら、早く馴れてほしいと思って情報をとても多く提供してしまうときがある。環境構築の方法を教えたいだけなのに、プログラムの構成にまで話が及んでしまうなど、だ。「ちなみに～」と言い始めたら危険信号である。

知識を教える相手に一気に沢山情報を与えることの弊害は、**与えた側は与えたことを良く記憶しているのに対し、与えられた側は理解が追い付かないので記憶から抜け落ちることである**。ここに情報の非対称性が発生する。

よって、情報を与えるときにはアジェンダを作って相手と共有し、「**今回はどこまで情報を与え、その結果どんな状態になっていることを期待しているか**」について相手と合意を取れば良いのではと思っている。