OmniAICreator/Qiita-1.07M huggingface dataset:
Dvorak 配列でも快適に使えるように Emacs のキーバインドを魔改造する

# なぜ魔改造する必要があるのか？
このアホみたいなタイトルを見て「ちょっと読んでみようか」と思う連中には、Dvorak 配列のことも Emacs のことも説明不要に違いない。

分からない人は、そもそもこの記事を読む必要はない。
それでも読みたい人は、適当にググってほしい。

さて、なぜキーバインドを魔改造する必要があるかというと、**Emacs のキーバインドは QWERTY 配列に最適化されており、Dvorak 配列だと使いにくくて仕方ないから**である。
![pose_kuyashii_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667942/a131047d-02ae-3035-5ad1-40f740ae5577.png)
では、なぜそこまで使いにくいかというと、理由は２つある。

1. Emacs 固有の打鍵動作が QWERTY 配列のまま身体の OS レベルまで深く組み込まれており、**生まれ変わる以外にこれをリセットする方法がない**から
2. **変態キーボード KINESIS** を使っているから

## 打鍵動作が身体にインストールされている
まず、Emacs のヘビーユーザーなら前者に異論はないだろう。
QWERTY 配列で身体にインストールされた打鍵動作は、Dvorak 配列に変えたからといって、それに合わせて再インストールできるようなチープな代物ではない。

驚いた時に思わず「あっ！」と声をあげたり、コーラを飲むとゲップが出たりするように、それはほとんど身体の生理的な反射になっているのだ。最初から Dvorak 配列で Emacs を使い始めたなら話は違うかもしれないが、さすがにその順序で異世界に足を踏み入れた人は珍しいと思われる。

だから、**Dvorak＋Emacs に至る最初にして最大の難所がここにある**のだ。

## KINESIS キーボードという闇
次に、変態キーボード KINESIS を使っている人は、実はそれほど珍しくない。
知る人ぞ知るハッカー的アイテムとして細々と流通している。

![51WAeP0BFFL._AC_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667942/008688a8-80dc-9101-609c-52403b9304d7.jpeg)

私が最初に買った時（2005年くらい）は、メーカーのアメリカ本社から個人輸入する以外になかったが、なんと、いまは [Amazon で買える](https://www.amazon.co.jp/dp/B01LYRI3Z8/)。大出世である。ニッチな分野で根強い支持が長く続いている証拠と言えよう。
※注：QWERTY と Dvorak とをスイッチング可能な「QD」タイプは、Amazon では買えない点に注意

しかし、Dvorak＋Emacs に加えて、この変態キーボードを使うというトリプルコンボをキメたアホは、私を含めて日本には５人くらいしかいないのではなかろうか。

なぜアホなのか？

それは、 KINESIS が「親指で Ctrl, Alt を押す」という特殊仕様のため、**Emacs の QWERTY 最適なキーバインドと最高に相性が悪いから**である。つまり、本来なら鼎立しない３つの要素を欲張った結果ゲロまみれになった格好で、どう考えてもアホとしか言いようがない。

…というわけで、この理不尽な問題を克服しようと思えば、**「Dvorak 配列のまま QWERTY 配列の打鍵動作を実現するために、キーバインドを魔改造する」**という本末転倒なソリューションに至るわけだ。

だから、この記事のタイトルは正確ではない。**「Dvorak 配列＋KINESIS の闇に堕ちたアホでも快適に使えるように Emacs のキーバインドを魔改造する」**が正しい。

要するに、この記事は、**たった５人のアホ（うち１人は私）のための記事**なのだ。

もう書いてるだけで胃液が増えそうな感じがする。

# 具体的にどうするのか
まず、Emacs のすべての起点となる` C-x` を` C-q` に変更する。QWERTY 配列の x キーが、Dvorak 配列の q キーに対応するからだ。同様に、` C-c` を` C-j` に変更する。

```emacs-lisp:.emacs
(global-set-key "\C-q" 'Control-X-prefix)
(global-set-key "\C-j" 'mode-specific-command-prefix)
```
もうこの時点で何かがおかしい気がするが、愚民的発想はすでにかなぐり捨てているので無問題。

ここを設定しておけば、あとは好きなようにキーバインドを割り当てていけばいい。例えば、こんな感じに。

```emacs-lisp:.emacs
(global-set-key "\C-q\C-o" 'save-buffer)
(global-set-key "\C-q\C-j" 'save-buffers-kill-emacs)
(global-set-key "\C-q\C-a" 'write-file)
(global-set-key "\C-l" 'set-mark-command)
(global-set-key "\C-t" 'kill-line)
(global-set-key "\C-z" 'kill-region)
(global-set-key "\C-u" 'forward-char)
(global-set-key "\C-x" 'backward-char)
(global-set-key "\C-qx" 'switch-to-buffer)
(global-set-key "\C-q\C-u" 'find-file)
```
そう、Dvorak 使いなら分かると思うが、すべて QWERTY 配列の打鍵動作をエミュレートするキーバインドだ。笑うな、うるさい、お前ら静かにしろ。

# .emacs を晒す

というわけで、５人のアホ（うち１人は私）のために、気の狂った .emacs を GitHub で公開している。
https://github.com/hajime-f/dot_emacs

ツッコミどころが多いと思うので、アホみたいなプルリクを正座して待っている。
ExcelVBAで外字を扱う

#概要
　Excelの文字コードはUnicodeですが，VBAの文字コードはShift_Jisです。
　なので，外字の判定をどうするかという問題が生じます。
　私はWorksheetFunction.UnicharとWorksheetFunction.Unicodeを使って，コード番号で外字を扱っています。
#使いたい外字の文字コードを確認する
　vbaに以下のサブプロシージャを作成します。

```vb:vba
Sub printUnicode()
    Debug.Print WorksheetFunction.Unicode(ActiveCell)
End Sub
```
　そして，任意のセルに外字１文字を入力したら，先ほどのマクロを動かします。
![2020-09-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622636/050081b7-fc41-782f-4cb2-9b539b087410.png)
![2020-09-02 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622636/da50feec-2794-1cf9-da4b-93cf2a5ffce7.png)

　イミディエイトウインドウが表示されていないときは，「表示」「イミディエイトウインドウ」を選択します。
　ここに入力されている数字が，その外字の文字コード番号です。

#文字コードから外字を扱う
　文字コードが分かったら，外字をWorksheetFunction.Unichar(文字コード番号)で扱えるようになります。

　これで入力もできますし

```vb:外字入力
Sub inputUnicode()
    Cells(1, 2) = WorksheetFunction.Unichar(10102)
End Sub
```
![2020-09-02 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622636/c285cfa2-96e6-735e-dc54-311de0b07c06.png)

　文字判定もできます。

```vb:外字判定
Sub checkUnicode()
    Dim blackCircle1 As String
    blackCircle1 = WorksheetFunction.Unichar(10102)
        Dim i As Integer
        For i = 1 To 3
            If InStr(Cells(i, 1), blackCircle1) > 0 Then
                Cells(i, 2) = True
            Else
                Cells(i, 2) = False
            End If
         Next i
End Sub
```
![2020-09-02 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622636/8f70a940-b19d-48cd-065a-11d50ebb4da6.png)
WordPressで特定の画像に右クリック禁止を設定する

#やりたいこと
・WordPressで特定の画像に右クリック禁止を設定したい

#CSSで設定する
```style.css
.copy-guard {
	pointer-events: none;
}
```

`class="copy-guard"`を指定した画像を選択できなくなるのでお手軽ですが、右クリックは出来ます。
コンテキストメニューに「画像を保存」が表示されなくなるので、簡単に対応するならコレ。

#JavaScriptで設定する

```index.html
<script type="text/javascript">
document.querySelector('.copy-guard').getElementsByTagName('img')[0].oncontextmenu = function () {return false;} //コンテキストメニューを表示しない
document.querySelector('.copy-guard').getElementsByTagName('img')[0].ondragstart = function () {return false;} //ドラッグさせない
</script>
```

ブロックエディタの場合、クラスを設定するとHTML上では↓のようになるので、`querySelector('.copy-guard')`の中の`img`を指定するようにします。

```index.html
<div class="wp-block-image copy-guard">
<figure class="size-large is-resized">
<img loading="lazy" src="（ファイルURL）" alt="" class="wp-image-275" width="300" height="225" />
</figure>
</div>
```

#余談その１

CSSで`pointer-events: none;`を指定している画像に、JavaScriptで`oncontextmenu = function () {return false;}`を指定すると、**コンテキストメニューが表示されます。**

どっちかだけにしたほうがいいです。

#余談その２

JavaScriptを追加するのも面倒だったので、WordPressのブロックエディタ上の「HTMLで編集」機能を使って`oncontextmenu="return false;"`をimgタグに仕込もうとしたら、**ブロックが壊れました。**

なので、WordPressで仕込む場合は、CSSかJavaScriptでやったほうがいいです。
クラシックエディタは大丈夫だと思う。

#以下、愚痴

「写真を絶対にコピーできないようにインターネットに載せたい」という要望があり、最終的に対応した結果が右クリック禁止なんですけど、もうインターネットに載せるのやめてもらっていいですかって言いたくなっちゃったよね(´・ω・`)ｿﾝﾅﾉﾑﾘﾀﾞﾖ
Progate学習後に、ローカル環境でRailsを使ったSNSアプリを作ってみた


<h2>概要</h2>

ProgateのRailsコースを学習し終わったので、自分のPC(ローカル環境)でも同じものが作れるかな？と思い、復習&アウトプットも兼ねてSNSアプリを作ってみた。

<h2>開発環境</h2>

macOS catalina バージョン10.15.6

Rails 6.0.3.2

ローカル開発環境　→　herokuにデプロイ(みんなが見れる状態にする)


<h2>完成したもの</h2>
「ほのぼのちゃっと」
https://honobonochat.herokuapp.com/
名前を変えていますが、中身はほぼProgateのTweetappです（笑）

<h2>苦労した&引っかかったポイント</h2>
<h3>・zsh: command not foundばかり出てどのコマンドも受け付けない</h3>

【問題】

ターミナルでデータベースをいじくるためにrailsのコマンドをいろいろ入力するが、zsh: command not foundばかり出てくる現象に遭遇

【解決方法】

`rails console` を打ち忘れていただけだった・・・　

あと、rails console中はrails s を打てないから、一旦「exit」でrails consoleを閉じる必要があるんですね・・・

ターミナルを操作するために、毎回サーバーを閉じる必要があることを知らなかったです。

（Progateでは、`rails s` でサーバーを開いたまま、普通にrails consoleの操作とかしてた）



<h3>お決まりのフレーズ打ち忘れ</h3>

【問題】

herokuへのデプロイ時やGemの変更時にエラーが発生する。

【解決方法】

`rails db:migrate`の打ち忘れだったり、`bundle install`の打ち忘れだったりした。

→　MVC構造に気を取られてデータベースとテーブルの役割を忘れてしまった場面があり、migrationのエラーが発生しちゃった感じ。

<h3>画像を投稿したのに消える</h3>

【問題】

画像を投稿しても、なぜか一定時間が経つと消えてしまうという現象に遭遇

【原因】

herokuの無料版では、画像が一定時間を過ぎると自動的に削除されてしまう仕様だと判明。これは仕方がない。



<h2>感想</h2>
「Progateでやってたことが、自分のPCでもできるんだ！」ということに感動しました。


ローカルとはいえ環境構築を１から始める必要があり、いい経験になったと思います。

やったことはほぼ写経でしたが、Progateでは起こり得なかったようなエラーが連発して、完成までに思ったより時間がかかりました。

「エンジニアはコードを書く時間よりもググっている時間のほうが長い」という話を色んなところで耳にしますが、本当にそうなんだなぁと実感できました。

「詰まったらググる、絶対同じことで困っていた先人がいるはずだ」という思いでググりまくりました。






<h2>参考にしたページ</h2>
以下の記事を参考にしました。

・ローカル環境からherokuにデプロイしようとしたとき
https://qiita.com/Kohei_Kishimoto0214/items/d4a4ca13d4a8ab11b3f8
Boost.Spiritについて少しメモした 

C++ Boost(またはテンプレートプログラミング）の最大のアプリケーションは何か？

→　諸説あるが、Template ExpressionかSpiritのどちらかだらうという人は結構多い。

スクリプトエンジンプログラミングという名著がある。
https://www.sbcr.jp/product/4797347623/
私は、ここから、Boost.Spiritに入った。

Flex/Bisonとはまた違う世界である。

     1#include <iostream>
     2#include <string>
     3#include <boost/spirit.hpp>
     4using namespace std;
     5using namespace boost::spirit;
     6
     7struct Watashino_Grammar : grammar<Watashino_Grammar>
     8{
     9    template<typename ScannerT>
    10      struct definition
    11      {
    12          typedef rule<ScannerT> rule_t;
    13          rule_t r;
    14
    15          definition( const Watashino_Grammar& )
    16          {
    17              r = ch_p('b') >> *ch_p('a') >> ch_p('c');
    18          }
    19          const rule_t& start() const { return r; }
    20      };
    21};
    22
    23#include <typeinfo>
    24int main()
    25{
    26    Watashino_Grammar parser;
    27
    28    string line;
    29    while( cout<<"# ", getline(cin, line) )
    30    {
    31        parse_info<string::const_iterator> info =
    32            parse( line.begin(), line.end(), parser );
    33        cout << (info.full ? "OK" : "fail") << endl;
    34    }
    35    return 0;
    36}
https://github.com/RuoAndo/qiita/blob/master/bac.cpp

7-21行目のScannerTとか、rule_tとかは、超絶技巧が使われているので、ここではあまり立ち入らない。（逃げる）
まず、どこを注意すればいいのかという話になりそうだが、これは15-18行目の部分である。

    15          definition( const Watashino_Grammar& )
    16          {
    17              r = ch_p('b') >> *ch_p('a') >> ch_p('c');
    18          }

次に、\*ch_p('a')を見てみると、*が付いているが、これは任意の文字の繰り返し（0回も含む）という意味である。

実行してみる。。。

<pre>
# g++ bac.cpp -lboost_system
In file included from bac.cpp:3:0:
/usr/include/boost/spirit.hpp:18:4: warning: #warning "This header is deprecated. Please use: boost/spirit/include/classic.hpp" [-Wcpp]
 #  warning "This header is deprecated. Please use: boost/spirit/include/classic.hpp"
# ./a.out 
# bac
OK
# baaac
OK
# bc
OK
# ba
fail
#  
</pre>

https://www.sbcr.jp/product/4797347623/
↑を参考にしたBoostの特徴

■ Bison/Flexより小回りが利く。（ファイルを分けなくて良い等）
■ Bison/FlexはLALR(1)だが、Boostは再帰下降パーサ。（｀ー´）b
Microsoft Remote Desktopを使ってMacからWindowsにディレクトリ共有・ファイル転送する方法


#1. RedirectionでEnable folder redirectionにチェックを入れて、プラスボタンを押下
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/fd72318d-3308-75b5-bd42-86196ab72952.png" width=50%>


#2. PathでBrowseを選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/a719def5-05d7-8fb9-45fc-4cc5cadfc65d.png" width=50%>

#3. 共有したいディレクトリを選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/9abb7d86-8fd6-743b-b8ec-9a60c8b43f6e.png" width=50%>


#4. そのままOK
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/f2ad9ddb-276e-d734-e4a8-1ca63da4d7c9.png" width=50%>

#5. この状態で対象Windowsサーバーにアクセスする

#6. 以下のような画面がでるので、Connectを選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/7d85368f-bbb8-26a9-b488-b5597eb1d0a9.png" width=50%>

#7. Macで指定したディレクトリが参照できるようになった！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/db5b576a-5691-0670-7d36-a3951d6b47af.png" width=50%>
LinuxでAirDropする

YouTubeを見ていると, 「MacはAirdropでiPhoneとファイル共有できるから便利」「それが理由でMacを買う人もいる」という話を聞いた.

本当にそうだろうか？
自分もMacユーザだが,「Airdropでファイル共有ができるから」ということだけではMacを買う理由にはならないのではないか？と, ふと思った.

Mac以外でもiPhoneとAirdropできる方法を発見したため, 備忘録がてら書いてみる.

# 環境
- Ubuntu 20.04 LTS
- 無線LANデバイス名: `wlp2s0`（`iwconfig`で確認可）

# インストール
1. 必要なライブラリのインストール

~~~sh
sudo apt install build-essential python3-dev python3-pip net-tools
sudo apt install libgmp3-dev gawk qpdf bison flex make
sudo apt install libpcap-dev libev-dev libnl-3-dev libnl-genl-3-dev libnl-route-3-dev
~~~

2.owlのインストール

~~~sh
git clone https://github.com/seemoo-lab/owl.git
cd owl
git submodule update --init
mkdir build
cd build
cmake ..
make
sudo make install
~~~

3.opendropのインストール

~~~sh
git clone https://github.com/seemoo-lab/opendrop.git
sudo pip3 install ./opendrop
~~~

# iPhoneとAirdropでファイル共有
１つの端末でwifiをモニターモードに

~~~sh:terminal1
sudo ifconfig wlp2s0 down
sudo iwconfig wlp2s0 mode monitor
sudo ifconfig wlp2s0 up
sudo owl -i wlp2s0 -N
~~~

待機中になるのでもう1つの端末でopendropを実行.

~~~sh:terminal2
opendrop find
~~~

iPhoneが表示されれば成功.
idが0なら

~~~sh:ファイル送信
opendrop send -r 0 -f hoge.jpg
~~~

~~~sh:ファイル受信
opendrop receive
~~~

wifiを通常モードに戻すには

~~~sh
sudo ifconfig wlp2s0 down
sudo iwconfig wlp2s0 mode manage
sudo ifconfig wlp2s0 up
~~~

# 参考
https://github.com/seemoo-lab/opendrop
SwiftUI独学してiosアプリをリリースした話

# まとめると

WebエンジニアがSwiftUIを独学してアプリを作ってリリースしましたという話です。
これからアプリ作ってみたいと思ってる人の参考になればと思って筆をとりました。

# 経緯と自らについて
今年（2020年）の８月の頭くらいに、アプリ作ってみようと思って重い腰を上げたWebエンジニアです。
普段は、レイルズとかジャバスクリプトとかで開発してます。（レイルズって書くとテイルズみたいですね）

# SwiftとSwiftUIの勉強方法
Xcodeて何？？みたいな顔して、まずは、手始めにノリに乗ってるswiftUIとかいうものに手を出してみた。
するとどうでしょう、swiftて何？みたいになって、初めたのは下記。

・Swift Playgrounds
https://www.apple.com/jp/swift/playgrounds/
その中でも下記を全部やってみました。
・コードを学ぼう１
・コードを学ぼう２
・Bluの冒険（ほとんど真面目にといてない。さらっとふれた。）

感想としては、楽しい〜〜。
パズルでプログラミング学べるの最高か！？て思いました。
このパズルをもっともスマートに解ける方法はこれだ！みたいに１ステージに何時間かけてんだみたいな状況が続きました。
しかし、よく考えたら、私はもうプログラミングちょっとわかる状態だったので、今思えば、別にやらなくて良かったなって思ってます。

ひとまずswift完全に理解した状態になったので、
次に下記本を買ってコードを実際に写生していきました。

・書籍「SwiftUIではじめるiPhoneアプリプログラミング入門」

ざっくりSwiftUI知りたいならこの本はかなりおすすめ。（まだ全部読んでない）

# はじめて開発したアプリ

アプリなんて作ってなんぼ！と思って、とにかく簡単でもいいからリリースすることを目標にしました。

上記に挙げた本にあった、くじ引きアプリを参考にして
オリジナルなくじ引きアプリを作ってみました。

実際の画面
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105366/d60ad362-6ac0-3d32-d38e-ce13eebf0c79.png" width="30%"></img>

これは、「おみくじをひく」を押すと、タップティックが振動して、音がなって、ランダムで形容詞（世界一）と大凶とかの組み合わせとラッキーアイテムが表示されるだけのアプリです。


# はじめてのアプリ申請

上記のおみくじアプリを作り上げて、意気揚々とapp申請しました。（現在apple developerに登録するには1万2千円くらいかかります。）
app申請の感想としては、アプリ申請ゲキムズ！！えなにこれ！！初見にはややこしいすぎませんか！？
アプリのスクショとかなんでこんなサイズ決まってたんだめんどくせええって感じです。

app申請して２日後、くじ引きアプリは、リジェクト（拒否）されました。
appleさんマジ？ってなって引きました。
リジェクト理由は、「Guideline 4.3 - Design - Spam」でした。
占いアプリって飽和状態だから、あまり承認されないのかな〜って思いました。
初めて作ったアプリにしては結構いい感じなんだけどなあ〜無慈悲。

# 次に作ったアプリ

単にディスプレイ上にテキストを大きく表示するアプリです。

実際の画面
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105366/dd215cf2-06c3-f942-ce24-521746e18718.png" width="30%"></img>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105366/82122cf6-e424-db6b-cc56-4af6c7733653.png" width="30%"></img>

どうでしょうか。なんてシンプルなアプリでしょうか。画面いっぱいに「あ」って表示されるとか今までにない体験ではないでしょうか。
自分の好きな文字をずっと眺めていたいそんなときってありますよね？ない？

これを開発しているときに遭遇した問題を解決した記事はこちら
https://qiita.com/KazuhiroIto0127/items/cff0685f9836c49a0dbf

# ２回目のアプリ申請

上記のテキストを大画面表示するアプリを申請しました。
あーもうこれ絶対spam扱いですよね。わかってます。と思いながら２日ほど待つ。
結果。申請通りました。。
あれ、appleさん最高か？
こうして、初めてapp storeに自分が作ったアプリが公開されました。やったね！

https://apps.apple.com/us/app/id1529832259

# おわりに

swiftUIは世にでてから、まだ１年も経ってない新しい技術です。
そのため、ぐぐってもなかなか日本語で問題を解決する方法がでてこないです。
でも、英語翻訳すればなんか解決します。
もうすぐでるios14ではさらに機能が充実してくるし、今学ぶのはいい時期かもしれない。そうではないかもしれない。
これからもアプリ作ってだしていきたいかもしれないし、そうではないかもしれない。
Power Automate で四捨五入

Power AutomateにはExcelでもお馴染みのRound, RoundDown/Up, Ceil/Floorなどの関数はありません。

でも比較的簡単に関数を組み合わせて作れるので、ご紹介します。

# 考え方

今回使うのは [formatNumber](https://docs.microsoft.com/en-us/azure/logic-apps/workflow-definition-language-functions-reference#formatNumber)関数 と [int](https://docs.microsoft.com/en-us/azure/logic-apps/workflow-definition-language-functions-reference#int)関数 または [float](https://docs.microsoft.com/en-us/azure/logic-apps/workflow-definition-language-functions-reference#float)関数です。

最終的に使う数式は以下のような形式です。

```整数をにする.
 int(formatNumber(123.4567,'F0'))

※この結果は 123
```
```小数点以下2桁を残すとき.
 float(formatNumber(123.4567,'F2'))

※3桁残すならこの結果は float(formatNumber(123.4567,'F3')) --> 123.457
```


最も重要な関数は**formatNumber**です。四捨五入自体はこの関数だけで完結していて float や int関数は後続処理で数値として扱いたい場合にのみ挿入してください。

## 関数解説

解説というほどでもありませんが。基本はformatNumber関数の使用例どおりです。

F0やF3は小数点以下0桁、3桁までは必ず残す、それ以下は丸めるというフォーマットです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/ad3de2ff-82ee-bf64-dd46-2758f136699f.png)

F0で小数点以下は0桁、つまり整数になるので、これを最後に```int(...)```でくくれば整数になりますし、```float(...)```でくくれば浮動小数点数が作られます。

※formatNumberだけだと、返す値は文字列です。

# おわり
もう少し色々面倒な操作が必要かと思っていたらformatNumberが優秀でした。
Round、ceil、floorなどが Power Automate では用意されていないので、四捨五入したい場合にはこの組み合わせで使ってみて下さい。
AWS認定DeveloperAssociate受験記

<h1>はじめに</h1>
クラウド案件をやりたいので、情報収集も兼ねて資格取得しようと思いました。
また、会社の資格取得報奨金で少しお小遣い稼ぎしよう、とも考えていました。

本音は、転職に備えて少しでも武器を備えておきたいのです。

<h1>結果</h1>
2020.09.02に受験。結果、
<b>「合格」</b>
の2文字が僕の目に移りました。
一安心です。

受験してみて感じたことは、
・AWS-SAA(ソリューションアーキテクト)と被る範囲が2～3割あると感じた
・結局、「開発に向けたツールの使い方」なので、開発経験がなくとも取得は可能。
　現に僕は開発未経験です。
・模擬問題をひたすら勉強していましたが、実感として半分くらい類似問題があったような気がした。
使用したのは<a href=https://www.udemy.com/>Udemyの「AWS 認定デベロッパー アソシエイト模擬試験問題集（5回分325問）」</a>です
・結局、AWS-SAAを受験しといて正解。それどころか、AWS-SAAのおかげで合格しました。


スコアです。
![aws-dva.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639874/dfe3d1d7-dc13-b8c0-f0b0-360497f93c8d.png)


そうなんです。
めちゃくちゃギリギリ。
まぐれもいいところです。

<h1>今後</h1>
並行して取り組んでいた転職活動も無事終わりましたので、とりあえず小休止します。
そのあとは、エンジニアにとって普通免許と同じくらい持っていて当たり前の<b>「基本情報技術者試験」</b>に向けて準備を進めていきます。
ちょこっと StackView のパフォーマンスを気にしてあげる

今回は StackView で限定された数のリストを繰り返し更新して表示する際に、ちょこっとパフォーマンスが良くなる方法を紹介したいと思います。

UITableViewCell に StackView を持っている時の実装を行っていきます。

```swift
    @IBOutlet private weak var stackView: UIStackView!

    private let displayLimit = 3

    override func awakeFromNib() {
        super.awakeFromNib()
        for _ in 1...displayLimit { stackView.addArrangedSubview(CustomeView()) }
    }
```

これで、初期化時に StackView に `CustomeView()` が３つ追加されるようになります。
次に Cell を更新するためのメソッドを書いていきます。

```swift
    @IBOutlet private weak var stackView: UIStackView!

    private let displayLimit = 3

    override func awakeFromNib() {
        super.awakeFromNib()
        for _ in 1...displayLimit { stackView.addArrangedSubview(CustomeView()) }
    }

    func set(list: [CustomeViewData]) {
        for (index, subview) in stackView.subviews.enumerated() {
            if let customeView = subview as? CustomeView, let data = list[safe: index] {
                subview.isHidden = false
                customeView.iconImage = data.iconImage
                customeView.name = data.name
            } else {
                subview.isHidden = true
            }
        }
    }
```

これで、List に含まれるデータに応じて StackView を可変に変更できるようになりました🎉 

更新頻度が極めて少ない View などで使用する場合や StackView の階層が１つの場合は、その都度 StackView をリセットし、`addArrangedSubview` をしてもほとんど問題はありませんが、更新頻度が高い場合などは今回のように中身だけ更新できるようにすることで、StackView の AutoLayout による遅延が最小ですむのでパフォーマンスコストを削減できそうですね。また、今回はリミットを3件のみに限定しているため SubView を全て更新していますが、差分のみを更新できるようにするとさらに良さそうです。


### 参考

- https://nshipster.com/uistackview/#laddition-sil-vous-plait

- https://developer.apple.com/forums/thread/26459
体重や体脂肪率が毎日Google Spreadsheetに更新されるようになった

# いらん前書き
　オッサンになるって怖いです。いきなり家の中から4年も前にサービス終了したデバイスが見つかったりします。4年なんて言ったら、大学1年生にしてみたら高校どころか中学まで遡ってしまう、過去も過去、もはや黒歴史の時代ですよね。
　オッサンになるって怖いです。学生のころはあれだけ運動していたのに、仕事や家庭にかまけていたら、そういえば半年くらい運動していない・・・ということがすぐに起こります。そして、その生活を変えようとすると凄い努力が必要になってしまう。。

# 本編
　家の中から[スマート体組成計（301SI）](https://www.softbank.jp/mobile/support/product/301si/)が発掘されました。一年に一度しか体重計に乗らない（健康診断）生活を改める良い契機なんじゃないかと思い、とりあえずハックしました。

## 処理の流れ
1. https://healthcare.mb.softbank.jp/v3/web_login にSIMの電話番号とユーザーIDとパスワードをpostして、cookieにセッションIDをいただき、
2. 1でもらったセッションIDをcookieにセットして https://healthcare.mb.softbank.jp/v3/web_api_get_home_summary に日付をつけてgetすると色々な身体のデータが取れる。

## 実装（Python）
　requestを使ってpostとgetする。requestがセッションを張ってcookie等をよしなにしてくれるので、とても楽。一部を抜粋するとこんなかんじ。

~~~python
session = requests.session()

login_url = 'https://healthcare.mb.softbank.jp/v3/web_login'
inputs = {"telno": "08012345678", "user_id": "1", "passwd": "0401",}

r = session.post(login_url, data=inputs)
  if r.status_code == requests.codes.ok:
    print(r.text)
~~~


　実際のコードは[こちら](https://github.com/yoneken/sb_healthcare/blob/master/sb_healthcare.py)。

## 実装（Javascript）
　Google Spreadsheetにスクリプトを仕込んで自動更新させるのに、一番相性が良いのはやっぱりjsでしょう。
　UrlFetchApp.fetchを使うんだけど、Pythonのrequestみたいによしなにやってくれないので、けっこう気を遣うことになる。セッションをつなげるために、cookieを手動でセットする。getAllHeaders()['Set-Cookie']で取得した値には、Expired dateが入っているせいで、そのまま次のセッションのCookieに転用することができないので、[丁寧に削ってあげる必要があった](https://github.com/yoneken/sb_healthcare/blob/master/main.gs#L13-L19)。あと、UrlFetchApp.fetchのオプションにヘッダを載せるときのハッシュラベルが"header"じゃなくて"header<b>s</b>"なことになかなか気づけなくて、しばらく時間を無駄にした。

　なにはともあれ、できたスクリプトを↓みたいに一行目に項目名を記述したspreadsheetに張り付けて、深夜に回すように時間指定トリガーをかけたら[完成](https://github.com/yoneken/sb_healthcare)。
![health.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35648/b08d569d-b2c6-adfe-6f21-4044d8609c4a.png)

　健康になれますように。
emacs で markdown のプレビューを


# これは何？

これまで、markdown の編集には [impatient-mode](https://github.com/skeeto/impatient-mode) を使ってきました。ブラウザ上でリアルタイムにプレビューしてくれるのはたいへん心地良いものです。

先日ふと、「もしかして、ブラウザとして xwidget-webkit が使えるんじゃね？」と思いつき、markdown の編集に特化するよう impatient-mode を改変してみました。

その結果、markdown の編集とプレビューは emacs で完結でき、統一したキー操作で書き物ができるようになり（特に <kbd>C-l</kbd> が気に入ってます）、自分としては満足しています。


# 特徴

  - emacs でのキー操作に連動して、firefox などのブラウザでリアルタイムにプレビューします。

  - <kbd>M-<</kbd> で文書の先頭へ、 <kbd>M-></kbd> で文書の最後へポインタが移動しますが、ブラウザも追従（自動でスクロール）します。

  - <kbd>C-l</kbd> でポインタ位置が画面中央にくるよう再描画しますが、ブラウザも追従（自動でスクロール）します（完全ではありません）。

  - xwidget-webkit が有効な emacs であれば、emacs で完結できます。これは、ブラウザへ切り替えるキー操作、ブラウザを操作するキー操作を省略でき、emacs での書き物に集中できます。

    [<img src="https://raw.githubusercontent.com/tkita/impatient-mode/screenshots/xwidget.jpg" width="50%">](https://raw.githubusercontent.com/tkita/impatient-mode/screenshots/xwidget.jpg)

  - Emacs Lisp と Javascript （と HTML とCSS ）だけで構成しています。外部コマンドを一切使っていませんので、Microsoft Windows の上でも問題なく動きます。

  - 外部サービスも使っていませんので、オフラインでも問題なく動きます。

# インストール

オリジナルの impatient-mode は、markdown 文書をプレビューできるようにするには少しばかり設定する必要がありました（もちろん、作者さんとメンテナさんには感謝です！）。

私の版は、markdown の編集に特化するよう改変したため、他のプロダクト（marked.js など）を同じフォルダに置くだけで動きます（同梱してもいいのかな）。

```shell
$ ll
Makefile
NEWS.md
README.md
github-markdown.css   # marked.min.js 用の css
github.css            # highlight.pack.js 用の css
highlight.pack.js     # コードの色付け
impatient-mode.el
impatient-mode.js
index.css
index.html
marked.min.js         # markdown から html への変換
mermaid.min.js        # mermaid 書式から svg への変換
mermaid.min.js.map    # mermaid 用
simple-httpd.el       # Emacs Lisp による http サーバ
```

もちろん `init.el` で `(require 'impatient-mode)` は必要です。


# 入手先

github から取得してください。

こうして公表することで、日常的に emacs で markdown 形式でドキュメントを編集しているプログラマの皆さんに（ほんの少しでも）喜んでいただければと思いましたので、こうして投稿させていただきました。

それでは、以下の url からどうぞ。

https://github.com/tkita/impatient-mode
Django Webアプリ作成

#プロジェクトを作成し、開発用サーバーを立ち上げるまで
Django勉強の備忘録
前提：python,Djangoインストール済み

##Djangoがインストールされているか確認する
Djangoのバージョンがわかります
存在しなければ**"No module named django"**と表示されます

```
$ python -m django --version
3.1.1
```

##プロジェクトを作成する

```
$ django-admin startproject myproject
```
myprojectディレクトリ配下に以下のディレクトリとファイルが作成される

```
myproject/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
```


##開発用サーバーを起動する
```
$ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
September 02, 2020 - 22:38:08
Django version 3.1.1, using settings 'myproject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
```
サーバーが起動されていることを確認します
http://127.0.0.1:8000/
ブラウザでアクセスします
下のようなページが表示されれば成功です
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702536/6f9e1003-6aa2-aff0-b41a-f715f63c27b4.png)
IEで自動ログインする際の注意点(新しい窓を追いかける)

#最初のログインページが空窓になり捨てられる
　IEを動かせると知って、最初にやりたいと思うのが社内システムの自動ログインではないでしょうか。個人ではあまりIE使わないでしょうし。
　ただ、これがなかなか難しい。うまくいかない最大の要因は、ログインのURLを踏むと、その窓は空窓になり、新しい窓にログイン画面が表示されるというページ移動にあります。
　IEを動かしてURLに飛んでも、その窓が空窓として捨てられてしまい、動かせなくなるというわけです。
　なので、窓を追いかけることについて書こうと思います。
#追いかける方法
- shell.applicationで開かれているウインドウの中からログインページをIEオブジェクトとして捕捉し直す
- WScript.ShellのAppActivateでログインページをアクティブにし，SendKeysによってID，パスワードを入力する

　SendKeysメソッドは誤作動が多いですし，最後の手段的なものなので，おすすめは前者です。

#スクリプト
```vb:VBScript
    'ID,PWを設定
    Const id = "user"
    Const password = "pass"
    
    Dim ie
    Set ie = CreateObject("InternetExplorer.Application")
    ie.Navigate ("ログイン画面を開くURL")
    Wscript.Sleep 3000
    Dim win
    Dim shellApp
    Set shellApp = CreateObject("Shell.Application")
        For Each win In shellApp.Windows
            If win.Name = "Internet Explorer" And win.LocationURL = "ログイン画面のURL" Then
                Set ie = win
                Exit for
            End If
        Next
    Dim htmldoc
    Set htmldoc = ie.document
    htmldoc.getElementsByTagName("INPUT")(1).Value = id
    htmldoc.getElementsByTagName("INPUT")(2).Value = password
    'だいたい3か4辺りにあるログインボタンを押す
    htmldoc.getElementsByTagName("INPUT")(4).Click
```


```vb:新しい窓を補足する
    Dim win
    Dim shellApp
    Set shellApp = CreateObject("Shell.Application")
        For Each win In shellApp.Windows
            If win.Name = "Internet Explorer" And win.LocationURL = "ログイン画面のURL" Then
                Set ie = win
                exit for
            End If
        Next
```
　新しい窓は，LocationURLもしくはLocationNameで見つけます。いずれにせよ，捨てられた窓を間違って拾わない方法で補足する必要があります。
　補足したら，後はHTMLを確認してID，パスワード，ログインボタン名を特定して入力，クリックするだけです。

　このあたりは，PowerShellを併用して確認すると早いですよ。

https://qiita.com/harryyuni/items/f375b5575b3c13c79378
映画TENET風に逆さ文字を元に戻すようなCSSが作ってみたい

# 今回やりたいこと
映画TENETの予告編を見てたらやたら逆さ文字が使われてたので
ちょっとしたTENET風テロップアニメーションを作ってみたくなりました。
# 情報収集
CSSはよく使っているが、業務アプリにあまりanimationは使わなかったので調査
[CSS3リファレンス transform:rotate()](http://www.htmq.com/css3/transform_rotate.shtml)
[【CSS3】@keyframes と animation 関連のまとめ](https://qiita.com/7968/items/1d999354e00db53bcbd8)
[CSS 要素を回転させる方法](https://hirashimatakumi.com/blog/4816.html)
[Animating with Clip-Path](https://css-tricks.com/animating-with-clip-path/)
なるほど、切り抜きの作業をアニメ化していくのね。
# そして
codepen使ってちまちま作ってできたのがこちら

<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="css,result" data-user="3S-Laboo" data-slug-hash="BaKwRrx" 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="TENET  -Reverse the reverse character-">
  <span>See the Pen <a href="https://codepen.io/3S-Laboo/pen/BaKwRrx">
  TENET  -Reverse the reverse character-</a> by Kei Saito (<a href="https://codepen.io/3S-Laboo">@3S-Laboo</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
## 軽く説明すると
逆さ文字は

```
/* 逆さTENETの表示 + アニメーション */
.tenet-reverse { 
  animation:5s close infinite; 
  animation-delay:.1s;
  transform: rotate(180deg); ←これ
}
```
transform:rotate()はタグ内の値を回転させるCSSスタイルです。
180degにより180度回転します。
アニメーションの処理は

```
/* 文字を非表示にするアニメーション */
@keyframes close {
  0%   {clip-path: inset(0); }←開始時は表示状態
  100% {clip-path: inset(0% 100% 0% 100%); }←終了時は右と左の長さが0
}
/* 文字を表示するアニメーション */
@keyframes open {
  0%   {clip-path: inset(0% 100% 0% 100%);}←開始時は右と左の長さが0
  100% {clip-path: inset(0);}←終了時は表示状態
}
```
こうすることで表示するときは中央から表示されるアニメーション、隠すときは端から隠れていくアニメーションが出来ました。
あとはこれを動かしたい要素に付与します。

```
/* 逆さ文字の表示 + アニメーション */
.tenet-reverse { 
  animation:5s close infinite; ←5秒間でcloseアニメーションの実行（infiniteで繰り返し実行）
  animation-delay:.1s; ←左記は開始時間を少し遅らせる
  transform: rotate(180deg);
}
/* 通常文字の表示 + アニメーション */
.tenet-nonreverse { 
  animation: 5s open infinite; ←5秒間でopenアニメーションの実行（infiniteで繰り返し実行）
  padding-top:2px;
}
```

途中、微調整にpaddingなんかを使っちゃったのでかなり適当になっちゃった。

今回はここまで。
ありがとうございました。
VScode環境構築(Macで）&Pythonでグラフ表示（@ブラウザ）

参考URL：https://qiita.com/YoshitakaOkada/items/6dfad94ab917053fcef7

PC歴１０年以上のアラサーが今更プログラミングに挑戦してみた。


が初っ端から躓く!

＞今回は「basic_js_graph」というフォルダを作って練習する。
→どこに？ｗ
→ググって　こんな記事を見つける（https://homepagenopro.com/free/vsc.html）
![スクリーンショット 2020-09-01 23.03.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697117/1ee27864-3104-3af7-25f5-b554e0807f3e.png)
→デスクトップに「basic_js_graph」というフォルダを作る。

→フォルダーの追加ボタンなんか無いんだけど。。ｗ「フォルダーを開く」はあるけど。
ってことで１０分悩む。ダメ元でドラッグアンドドロップでフォルダーの登録を完了。
これでいいのか？？　よ−分からん。

→とりあえず前にすすめる。
＞・index.html を新規作成

・・だからどこに？ｗ

これは案外すぐ解決した。
![スクリーンショット 2020-09-01 23.15.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697117/68c7c514-db9a-a1c9-62fe-b8c42b4cc83d.png)

ここをクリックして"index.html"と入力すればおｋ。

＞まだ空っぽのhtmlファイル上で「!」を押すと、VSCodeがhtmlテンプレートを作ってくれる。すご！
押してもなにも起こらない。
→！＋tabキーということが判明。
できると感動。

STEP２に移行
＞VSCodeのターミナルで「basic_js_graph」に移動して「python simpleserver-startup.py」と打ち込んで実行

ここでまた躓く。
何度やってもローカルサーバーが立ち上がらない。
![スクリーンショット 2020-09-02 8.02.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697117/b3c40f73-da0a-53ff-4a2f-15856af4f935.png)

試行錯誤してもダメでググってこんなページを見つけ
https://glodia.jp/pythonm

python -m SimpleHTTPServer

と打ち込んで見るとサーバーの立ち上げは出来たが真っ白ページが表示されるだけ。

![スクリーンショット 2020-09-02 21.26.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697117/af62e24d-b9eb-38ca-e1d3-1b30ed10d34d.png)


ターミナルを見るとつながってはいるっぽい？

ウンウン唸ること十数分　Slackで質問してみると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697117/dd88107c-4352-a655-fd6a-ed5728be3ae9.png)

未保存であることをご指摘いただき、、

保存して読み直してみると。。

![スクリーンショット 2020-09-02 22.14.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697117/b36d486b-ba73-f9e7-080f-991d21148fe9.png)

出来た−！

思わず画面の前でガッツポーズ！ｗ
tf.kerasでFReLUを実装 


#概要
FReLUという新たな活性化関数のkerasでの実装を紹介します。

FReLUについての詳細+pytorchでの実装は以下の記事を読んでみてください。
非常に丁寧に解説されています。
参考:[新たな活性化関数「FReLU」誕生&解説！](https://qiita.com/omiita/items/bfbba775597624056987)

本記事はtf.kerasでのFReLUの実装をしようという内容です。
DepthwiseConv2Dとtfのmaximumを使えばサクッと実装できてしまいます。

##変更・追記（2020/9/30）
・Lambda関数が必要ありませんでしたので削除したコードに変更しました
・Layer版の実装を載せました
参考:[カスタムレイヤー](https://www.tensorflow.org/tutorials/customization/custom_layers)

#定義
```math
y= \max(x,\mathbb{T}(x))
```
$\mathbb{T}(\cdot)$はDepthwiseConv2Dです。

#前提
`tensorflow 2.3.0`

#実装:１つ１つレイヤーとして定義
```python:FReLU.py
from tensorflow.keras.layers import DepthwiseConv2D,BatchNormalization
import tensorflow as tf
from tensorflow.keras.layers import Lambda
from tensorflow.keras import backend as K

def FReLU(inputs, kernel_size = 3):
    #T(x)の部分
    x = DepthwiseConv2D(kernel_size, strides=(1, 1), padding='same')(inputs)
    x = BatchNormalization()(x)
    #max(x, T(x))の部分
    x = tf.maximum(inputs, x)
    return x
```

#実装:１つのLayerとして定義
```python:FReLU.py
class FReLU(tf.keras.Model):
    def __init__(self, kernel_size=3):
        super(FReLU, self).__init__(name='')

        self.depconv = DepthwiseConv2D(kernel_size, strides=(1, 1), padding='same')
        self.bn = BatchNormalization()

    def call(self, input_tensor, training=False):
        x = self.depconv(input_tensor)
        x = self.bn(x, training=training)
        out = tf.maximum(input_tensor, x)
        return out
```

#終わりに
実装自体は簡単ですね。
不明点、おかしい点ありましたらコメントよろしくお願いします。
Gnu-COBOL ACCPETで入力受付

# ACCEPT

```
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
  WORKING-STORAGE SECTION.
    01 NAME PIC X(10).
PROCEDURE DIVISION.
  MAIN SECTION.
    DISPLAY "what's your name?".
    ACCEPT NAME.            *> 「ACCEPT」 -> 入力を「NAME」へ代入
    DISPLAY "hello! " NAME. *> スペースで文字列連結
    STOP RUN.

```

**実行**

```
USER-no-MacBook-Air:COBOL user$ ./hello
what's your name?
ueda *> 入力
hello! ueda      
```
Java 例外処理

#【Java 例外処理】

業務内で使用する Javaの例外処理のメモです。
開発時に使用しているのでまとめました。

##Javaには例外処理という便利な機能がある

例外は、Javaプログラム実行時に通常ではない特別の状態のときに発生する。
例外発生時に実行されるのが例外処理である。

余談ですが、例外処理のプログラム構造は、if文のような感じで視覚的にわかりやすいなと思いました。

###try - catch - finally構文

```java
//例外処理の構文

try{
  //例外が発生する可能性のある処理;
} catch (例外クラス 変数名){
  //例外が発生したときに実行する処理(例外が発生しなければ行われない処理);
} finally {
  //例外の有無に関わらず、最後に必ず実行する処理
}
```

通常実行は、tryブロックのみ。
例外が発生した場合、処理は直ちにcatchブロックに移行する。

※スタックトレースとは、JVMがプログラムのメソッドをどのような順序で呼び出して、どこで例外が発生したかの経緯が記録された情報である。

##余談

SEの業務は、Excelでの仕様書作成やメール対応が多いのが現状です。。

そのような中で、Javaの開発に携われていることに感謝しつつ、頑張っています。
Bean登録アノテーションについてを調べよう！

# Bean登録アノテーション
- Component
  - Spring MVCに限らず、SpringのDIコンテナにbeanとして登録したいクラスへ付与する。
  - <bean>タグと同じ役割
- Repository
  - パーシステンスレイヤー、永続性を持つ属性(ファイル、データベース)を持つクラス
  - Spring MVCでデータ層のクラス（DAO等のDBアクセスを行うクラス）に付与する
- Service
  - Sping MVCでサービス層のクラス（ビジネスロジック等）に付与する
  - Service は業務処理を提供する
  - サービスレイヤー、ビジネスロジックを持つクラス
- Controller
  - Spring MVCでコントローラー層のクラスに付与する。
  - プレゼンテーションレイヤー、フェブアプリケーションでフェブリクエストとレスポンスの処理を行うクラス

# Bean依存関係の挿入アノテーション
- Autowired
  - 精密な依存関係の挿入が必要な場合有用
  - Autowiredはプロパティ、setterメソッド、コンストラクタ、一般メソッドに適用可能
  - 依存しているオブジェクトを挿入するときに主に**Type**を利用
  - @Autowiredは「property、contructor-arg」タグと同じ役割 
- Resource
  - アプリケーションで必要つする資源を自動連動するとき利用
  - Resourceはプロパティ、setterメソッドに適用可能
  - 依存しているオブジェクトを挿入するときは主に**Name**を利用
- Value
  - 単純に値を挿入するときに使用
  - ＠Value("Spring")は「property .. value="Spring" /」と同じ役割
- Qualifier
  - Qualifierは@Autowiredと一緒に使う
  - Autowiredはタイプでスキャンして挿入するため、同じタイプのBeanオブジェクトがいくつか存在している場合、特定のBeanをスキャンするため使用
Kali Linux がログイン後真っ黒な画面のままの時

MacのVirtualBoxでKali Linuxを入れたのですが、画面を閉じてスリープモードにしたまま(?)放置していたらKaliの画面が真っ黒のままになってしまいました。

解決した方法メモしておきます。

まず仮想コンソールに入ります。
Macでalt+control+fn+F1で入れます。Windowsでは確認はしていませんがalt+Ctrl+F1だそうです。
仮想コンソールにて、

```console
>reboot
```
するだけで直りました。なんでだ?
heroku時にlat, lngが空になった話

オリジナルアプリにgooglemapを導入しました。

データベースで保存している住所を詳細ページに表示したいため`geocoder api`を使用し多方法をまとめてheroku時のエラー解決方法をまとめたいと思います。


※ここではapiの取得設定などの説明は省かせていただきます。




まずは下記gemを追加bundle installしてgeocoderをrailsで使用できるようにします。


```
gem 'geocoder'

```

次に詳細ページを表示するためには**latitude**と**longitude**が必要なので住所の情報が登録された時に自動で保存されるように設定します。


まずはカラムを追加しましょう！！

```ruby


class AddColumnsToRestaurants < ActiveRecord::Migration[6.0]
  def change
    add_column :restaurants, :latitude, :float
    add_column :restaurants, :longitude, :float
  end
end
```

latとlngにはえげつない小数点がでるのでカラムの型はfloatとしましょう。




モデルに下記記述でaddressカラムを追加した時に自動的にその住所の緯度経度を取得してくれます。



```ruby:restaurant.rb

geocoded_by :address
  after_validation :geocode
```

ここで注意しなければならないのが`geocoder gem`では詳細な住所の場所まではわからないよ！！と言われ、latとlngが保存されないので最強のgoogleのgeocodingサービスを使っちゃいましょう。





```ruby:congig/initialize/geocoder.rb
Geocoder.configure(
  # Geocoding options
  # timeout: 3,                 # geocoding service timeout (secs)
  lookup: :google,         # name of geocoding service (symbol)
  # ip_lookup: :ipinfo_io,      # name of IP address geocoding service (symbol)
  # language: :en,              # ISO-639 language code
  use_https: true,           # use HTTPS for lookup requests? (if supported)
  # http_proxy: nil,            # HTTP proxy server (user:pass@host:port)
  # https_proxy: nil,           # HTTPS proxy server (user:pass@host:port)
  api_key: あなたのAPI,               # API key for geocoding service
  # cache: nil,                 # cache object (must respond to #[], #[]=, and #del)
  # cache_prefix: 'geocoder:',  # prefix (string) to use for all cache keys

  # Exceptions that should not be rescued by default
  # (if you want to implement custom error handling);
  # supports SocketError and Timeout::Error
  # always_raise: [],

  # Calculation options
  # units: :mi,                 # :km for kilometers or :mi for miles
  # distances: :linear          # :spherical or :linear
)


```

これで詳細な住所を登録した際latとlngも保存されちゃいます。


詳細ページでレコードを取得して。。。

```ruby:restaurants_controller.rb
def show
  @restaurant = Restaurant.find(params[:id])
end

```

```ruby:show.html.erb
let test ={lat: <%= @restaurant.latitude %>, lng: <%= @restaurant.longitude %>};

```

これで変数testに店の情報が入りました。あとはcallback関数の中でマップを書く記述をすればオッケー！！markerの設定をしたりaddListnerでアニメーションをつけるのも良いでしょう。



開発環境ではこれでも問題なかったのですがデプロイしたらこんなエラーが。。。

```
Uncaught token ...
```

sourceを見てみると


```
let test ={lat: , lng: };
```

なぜか取得できてない！！！調べていくうちにアセットパイプラインがうまく行ってない可能性があるとの事だったので

アセットパイプラインの処理を自動化して解決しました。

```ruby:config/enviroments/production.rb

config.assets.compile = true
```

原因はアセットパイプラインが無効になっていたのでjsがうまく圧縮してなかったという事でしょうか。。
The Elm Architecture を自分流に理解してみた。

The Elm Architecture を自分流に理解してみた。

![tea.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611952/f86004a3-dbf0-0075-be22-71190531b028.png)
引用: [図解 The Elm Architecture の流れ - Qiita](https://qiita.com/kazurego7/items/27a2b6f8b4a1bfac4bd3)

## Elmの枠内
Elmの枠内は、次の3つの要素で構成。

1. init(モデルの初期値をつくる)
2. view(モデルを表示する)
3. update(モデルを更新する)

そして表示->更新->表示->更新をぐるぐる回すだけのとてもコンパクトな要素だけになっている。
Elm枠外のRuntime Systemは、ユーザーとのやり取りしているという点でみると、MVCアーキテクチャにおけるControllerに近い。

でもTEAのRuntime Systemは、Controllerより、ユーザーのやり取りだけでなく、とても明確な役割がある。
この純粋関数型特有のコンパクトで理想系な形にできているのは、Runtime Systemのおかげなのだ！
Runtime Systemは、Elm枠内を純粋関数だけの世界にするための **縁の下の力持ち** なのである。

### 純粋関数
入力と出力だけ。Elmは純粋関数型プログラミング言語だから、数学の恩恵をいっぱい得てるとか！(詳しいことは知らない)

### 非純粋関数(よくあるプログラミング言語の関数)
入力と出力だけじゃなくて、副作用もある。
この副作用のせいで、出力がわかりにくくなる。
どこか気づきもしない変数の値をかえてしまうことがよくある。
【Node.js】LTSバージョンのコードネームの意味

## LTSバージョンのコードネーム

```nvm alias```で確認すると
**<font color="LimeGreen">lts/<コードネーム> -> <バージョン></font>**
とそれぞれNode.jsのLTS(長期サポート）バージョンにはコードネームが割り振られています。アルゴン、カーボン、、うすうす規則性は見えてきますが気になったので調べました。

![nodecodename.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692347/e354890b-c49e-80a0-d1fe-7255405eece6.jpeg)



>* v4.9.1 → argon（アルゴン:原子番号18、元素記号はAr。）
* v6.17.1 → boron（ホウ素:原子番号5、元素記号はB。）
* v8.17.0 → carbon（炭素:原子番号6、元素記号はC。）
* v10.22.0 → dubnium（ドブニウム:原子番号105の元素、元素記号はDb。）
* v12.18.3 → erbium（エルビウム:原子番号68、元素記号はEr。）

今のところアルファベット順になっているので近々リリースされるv14の候補は

* fluorine（フッ素:原子番号9、元素記号はF。）
* ferrum（鉄:原子番号26、元素記号はFe。）
* flerovium（フレロビウム:原子番号114、元素記号はFl。）
* fermium（フェルミウム:原子番号100、元素記号はFm。）
* francium（フランシウム:原子番号87、元素記号はFr。）

あたりですかね。

このコードネームをコマンドで指定するとインストールやバージョンの切替えができる。

```
% nvm use lts/dubnium
Now using node v10.22.0 (npm v6.14.6)
```
[*『nvmを使ったnode.jsのバージョン管理』*](https://qiita.com/haaaru22/items/fc946a299a60beea0003)
＜1画面分スクロールさせるボタン＞を追加するブックマークレット

```js
javascript:(()=>{const e=document.createElement("div");e.setAttribute("class","🔘"),e.textContent="▼",document.body.appendChild(e);const t=document.createElement("div");t.setAttribute("class","🔘"),t.textContent="▲",document.body.appendChild(t);let o=document.getElementsByClassName("🔘");o=[].slice.call(o);const n=.8*window.innerHeight,s=()=>{const e=o.indexOf(event.target);window.scrollBy({left:0,top:n*(1-2*e),behavior:"smooth"})};document.documentElement.style.cssText="scroll-behavior:smooth;";for(let e=0;e<2;e++)o[e].style.cssText="z-index:99999;position:fixed;"+`bottom:${60*e+100}px;`+"right:20px;color:#222;font-size:10pt;height:50px;width:50px;text-align:center;line-height:50px;border-radius:50px;border:1px solid #aaa;background:#eee;opacity:.5;user-select:none;-webkit-user-select:none;",o[e].addEventListener("click",s)})();
```

#これは何？
実行すると右下にボタンが現れ、押すと1画面分スクロールします。
縦に長いサイトをスマホでみる時に使うと重宝するやつです。
フッタに広告やメニューなどが固定されている場合を考慮して、スクロール量と表示位置を調整するといいでしょう。

#説明
次のようなことをやっています。

+ divを2つ用意。これをボタンとして使う。
+ スクロール量を、画面の高さの80%に指定しとく。
+ タップされたボタンのindexによって符号を決定しスクロールさせる、という関数をつくる。
+ ボタンにスタイルとイベントリスナーを指定する。

```scrollButton.js
(() => {
// ------------------------------------------------------------------

// BTN_0
const btn_0 = document.createElement('div');
btn_0.setAttribute('class', '🔘');
btn_0.textContent = '▼';
document.body.appendChild(btn_0);
// BTN_1
const btn_1 = document.createElement('div');
btn_1.setAttribute('class', '🔘');
btn_1.textContent = '▲';
document.body.appendChild(btn_1);
// BTNs
let BTNs = document.getElementsByClassName('🔘');// HTMLCollection
BTNs = [].slice.call(BTNs);// => array

// px to scrollBy: スクロール量
const Y = window.innerHeight * 0.8;
// scroll
const scrolll = () => {
    const idx = BTNs.indexOf(event.target);
    // 🔘[0] => scroll_down
    // 🔘[1] => scroll_up
    window.scrollBy({
        left: 0,
        top: Y * (1 - 2 * idx),
        behavior: 'smooth'
    });
}
// smooth scroll
document.documentElement.style.cssText = 'scroll-behavior:smooth;';

// BTNs: style and EventListener
for(let i=0; i<2; i++){
    BTNs[i].style.cssText = 
        'z-index:99999;' +
        'position:fixed;' + 
        `bottom:${i * 60 + 100}px;` +
        'right:20px;' + 
        'color:#222;' + 
        'font-size:10pt;' + 
        'height:50px;' +
        'width:50px;' + 
        'text-align:center;' +
        'line-height:50px;' + 
        'border-radius:50px;' +
        'border:1px solid #aaa;' +
        'background:#eee;' +
        'opacity:.5;' + 
        'user-select:none;' + 
        '-webkit-user-select:none;';
    BTNs[i].addEventListener('click', scrolll);
}

// ------------------------------------------------------------------
})();
```

#まとめ

+ 青空文庫のXHTML版で使うといいかも、と今ふと思いました。
+ Safari などブラウザによっては、するするとスムーズにスクロールしないことがあります。

最後までお読みいただき有り難うございます。お疲れ様でした。
Gnu-COBOL 四則演算

# 演算

## 加算 / 減算

```
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
  WORKING-STORAGE SECTION.
    01 NUM-DATA.
      03 NUM1 PIC 9(5) VALUE 0.
      03 NUM2 PIC 9(5) VALUE 0.
      03 NUM3 PIC 9(5) VALUE 0.
      03 NUM4 PIC 9(5) VALUE 0.
PROCEDURE DIVISION.
  MAIN SECTION.
    ADD 5 TO NUM1 NUM2 NUM3 NUM4. *> 各変数に5を加算
    ADD 5 TO NUM1 NUM2 NUM3 NUM4. *> 「ADD TO」 -> 加算
    SUBTRACT 2 FROM NUM1 NUM2     *> 「SUBTRACT TO」 -> 減算
    DISPLAY NUM-DATA.
    STOP RUN.

```

**実行**

```
USER-no-MacBook-Air:COBOL user$ ./hello
00008000080001000010
```

---

## 乗算

```
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
  WORKING-STORAGE SECTION.
    01 NUM-DATA.
      03 NUM1 PIC 9(5) VALUE 0.
      03 NUM2 PIC 9(5) VALUE 0.
      03 NUM3 PIC 9(5) VALUE 0.
PROCEDURE DIVISION.
  MAIN SECTION.
    MOVE 11 TO NUM1.
    MOVE 3 TO NUM2.
    MULTIPLY NUM1 BY NUM2 GIVING NUM3 *> 「MULTIPLY BY」 -> 乗算
    DISPLAY NUM-DATA.                 *> 「GIVING」      -> 結果を代入
    STOP RUN.                         *> 11 * 3 = 33

```

**実行**


```
USER-no-MacBook-Air:COBOL user$ ./hello
000110000300033
```

---

## 除算

```
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
  WORKING-STORAGE SECTION.
    01 NUM-DATA.
      03 NUM1 PIC 9(5) VALUE 0.
      03 NUM2 PIC 9(5) VALUE 0.
      03 NUM3 PIC 9(5) VALUE 0.
      03 NUM4 PIC 9(5) VALUE 0.
PROCEDURE DIVISION.
  MAIN SECTION.
    MOVE 11 TO NUM1.
    MOVE 3 TO NUM2.
    DIVIDE NUM1 BY NUM2 GIVING NUM3 REMAINDER NUM4. *> 「DIVDE BY」  -> 除算
    DISPLAY NUM-DATA.                               *> 「GIVING」    -> 「DIVIDE BY」の結果を代入
    STOP RUN.                                       *> 「REMAINDER」 -> 余りを代入 *> 11 / 3 = 3 余り 2

```

**実行**

```
USER-no-MacBook-Air:COBOL user$ ./hello
00011000030000300002
```

## COMPUTE を使う

```
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
  WORKING-STORAGE SECTION.
    01 NUM-DATA.
      03 NUM1 PIC 9(5) VALUE 11.
      03 NUM2 PIC 9(5) VALUE 2.
      03 NUM3 PIC 9(5) VALUE 1.
PROCEDURE DIVISION.
  MAIN SECTION.                  *> 「COMPUTE」 -> 四則演算が可能
    COMPUTE NUM3 = NUM1 + NUM2.  *> 加算
    DISPLAY NUM-DATA.
    COMPUTE NUM3 = NUM1 - NUM2.  *> 減算
    DISPLAY NUM-DATA.
    COMPUTE NUM3 = NUM1 / NUM2.  *> 除算
    DISPLAY NUM-DATA.
    COMPUTE NUM3 = NUM1 * NUM2.  *> 乗算
    DISPLAY NUM-DATA.
    COMPUTE NUM3 = NUM1 ** NUM2. *> べき乗
    DISPLAY NUM-DATA.
    STOP RUN.

```

**実行**

```
USER-no-MacBook-Air:COBOL user$ ./hello
000110000200014
000110000200009
000110000200005
000110000200022
000110000200121
```
APIとは一体どんなもの？

```
前提
プログラミング初学者（１〜２ヶ月）の私が学習内容をまとめたものです。
実際の現場では通用しないことや、間違いなど含まれている可能性があります。
お気づきの際はコメントにて指摘していただければ幸いです。
```
今回はAPIという初めて聞くワードについて私が学習した範囲でまとめました。

#APIとはなにか
Application Programming Interfaceの略
アプリケーション同士がデータをやりとりする場合に使用する一定のルール、仕組みのことです。
APIは抽象的で広い解釈を持っており、以下２つのような意味でも使われることがあります。
１つ目、「このようにリクエストが来たらこのようにデータを返す」という仕様全体を表す意味
２つ目、「呼び出したら実行されるメソッド」そのものを表す意味
link_toやrenderなどRailsが独自に定義し、用意してくれているメソッドはRailsのAPIなどと呼びます。

実際に使う時で言うと、わざわざプログラムを１から作らずとも、先人が作ったプログラムがAPIとしてあれば、それを借りてきて自分が開発するwebサービスの一部に利用し、効率的に開発を進めるために使われているようです。
具体例でいうと、レストランのwebページのアクセス方法にgoogle mapsが使われているような感じです。

##よく使われるAPI

###webAPI
HTTP/HTTPS通信を使用して利用するAPIのことを指します。
例えば、Google Mapsという地図のwebサービスが別のwebサービスに組み込まれているといったことです。
これはGoogleが提供している「Google Maps Platform」というWebAPIを利用して実現されています。
Google Maps Platformは位置情報や経路などの情報をやり取りすることができ、これを使えば、Map部分をゼロから開発する必要がなくなります。

さらにAPIにはオープンAPIと内部APIが存在しています。
２つの違いは単純に公開範囲の違いで公開されているAPIか非公開で使っているAPIかという違いで、概念・内容は同じようなものです。
####オープンAPI
外部に公開されているAPIのことをオープンAPI(公開API)という。
先程出てきたGoogle Maps Platformがまさにこれにあたります。
####内部API
自社や個人が開発したアプリケーションの内部で取り扱うAPIのこと。
自社内のアプリのみに使っていて公開していないAPIです。
＃サーバーサイドとフロントエンドの分離
API作成時には常にデータを返却しますが、ビューファイルがないと閲覧しやすい画面を届けることはできません。
そこで、APIとは別にフロントエンド専用のアプリケーションを作成する必要があります。
このようにしてサーバーサイドとフロントエンドでの作業の役割を分離して開発が行われているようです。
##分離のメリット
・チームなどの担当を分けやすい
・扱う言語が異なるため、効率的に作業ができる
フロント：HTMLなどのマークアップスキルとJavaScriptなどのイベント駆動を扱うスキル
サーバー：計算処理などのパフォーマンス改善を扱うスキル
・データ形式を統一しておけば、使用言語の変更があっても片方だけの変更でOK
#ネイティブアプリケーションへの展開
##ネイティブアプリケーション
スマホ、タブレットをしようしてApp StoreやGoogle Play Storeでダウンロードできるアプリのこと。
基本的にはiOSとandroidでは開発言語が異なります。
iOS:Objective-C,Swift
android:Java,Kotlin
##クラスプラットフォーム
iOSやandroidのどちらにも互換性のある開発フレームワーク
開発言語には、FlutterやReact Nativeが有名のようです。
##ネイティブアプリケーション開発におけるAPIのメリット
ネイティブアプリケーションにAPIの利用は最適です。
その理由は、例えば
webアプリケーション、iOSのネイティブアプリケーション、androidのネイティブアプリケーションの３つを作るとした時
サーバーサイドのAPIアプリケーションは１つ作ればOKになります。
それぞれのアプリに適切なデータ返却し（API)、それに対する処理をフロントエンド（iOSとandroid)で実装すれば完成となり、サーバーサイドの開発が１つで済むことが大きなメリットです。
#まとめ
APIはアプリケーション同士がデータをやりとする場合に使用するルールや仕組みのこと
APIはサーバーサイドのデータのやりとりをするプログラム
APIを使うことで開発がすごく楽になる
APIでサーバーサイドを作ってしまえばiOSとandroidの２つどちらにも適用できる
WSL2に更新する際に注意する点

#今回の目的
もともと使っていたWSL1をWSL2に更新する

#更新の流れ
MS社が公式ドキュメントを出している、google先生に聞けば記事もたくさんあるので基本的にはそれに沿って行けば問題はない。が一点だけ自分の環境と合わなかったことがあった。
>https://docs.microsoft.com/ja-jp/windows/wsl/install-win10

>wsl --set-default-version の結果が無効なコマンドである場合は、「wsl --help」と入力してください。 --set-default-version が表示されない場合は、お使いの OS によってサポートされていないことを意味しているため、バージョン 1903、ビルド 18362 以上に更新する必要があります。

単純に、`バージョン 1903、ビルド 18362 `とあるが、このバージョンでは上記症状は改善されず、`バージョン 1909、ビルド 18363.1049`まで更新すると`--set-default-version`は表示された。
原因はわからないかつ1台のみの検証なので何とも言えないが、同症状が出ている方はビルドバージョンを最新に更新してみてもよいかもしれません。
Gnu-COBOL 配列

## 配列

- 同じ種類のデータをまとめて管理する

```
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.

DATA DIVISION.
  WORKING-STORAGE SECTION.
    01 COLORS.
     03 ONE-COLOR OCCURS 3 PIC X(10). *> 「OCCURS」 -> 要素数を指定する
PROCEDURE DIVISION.
  MAIN SECTION.
    MOVE "RED" TO ONE-COLOR(1).
    MOVE "BLUE" TO ONE-COLOR(2).
    MOVE "YELLOW" TO ONE-COLOR(3).
    DISPLAY COLORS.
    DISPLAY ONE-COLOR(2).
    STOP RUN.

```

## コンパイル/実行

**コンパイル**

```
cobc -x --free hello.cob
```

**実行**

```
USER-no-MacBook-Air:COBOL user$ ./hello
RED       BLUE      YELLOW    
BLUE 
```
自分的MTAの資格習得メモ

初めまして、IT業界1年生の、私です。

初めは業界未経験！ITのことわからない！OSって何？おいしいの？状態だった私が、
最近MTA98-349、MTA98-366を取得しました。（天才では、、、？）


初めての投稿となりますが、こちらの資格を取る際に「最近の記事が少ない・・・」と
絶望した経験から、今回は「MTA98-349」の資格習得時に役立った参考書や勉強方法などを記載してみようと思います。

ちなみに、、、、今回書くことは当たり前だと思われることばかりなので、

・自分の勉強方法を確立している
・１度見れば暗記できる
・ほかのサイトやらで効率のいい勉強方法を見た

などの方は記事を閉じるか、私にもっと良い勉強方法を教えてくださいお願いしますお願いします。



きっとここまでの間に優しい方は自分の勉強方法を教えてくれるのだろうな、、、





ということを期待しながら、本編に移りたいと思います。

MTA98-349!!!!!!

こちらは「Windows　オペレーティングシステムに関する基本事項」の試験です。

詳しい試験内容はこちら↓
https://mta.odyssey-com.co.jp/outline/98-349.html

こちらの試験、、、、黒本だけで対策できるかと思いきや、「※試験問題は、Windows10をベースに開発されています。」なんて記載が、、、（黒本はWindows7がベース）（知らないで1週間くらい勉強してた）


今まで黒本に頼り切りの黒本信者だった私はここで心が１回、、２回折れました。

![負け.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702316/0aa0f0bf-938d-9631-d9cd-fe32d8b2a440.png)


折れましたが！

黒本の問題をいちいちWindows10で同じように使えるか調べながらノートに”殴り書き”する勉強方法を始めました。
（業務後に1～2時間勉強を約1か月間）

なぜ殴り書きなのか、というと
私はきれいにノートをまとめることに集中してしまうからです！！！！（ここ重要）

とはいえ、手は動かしつつのほうが記憶の定着が良いような気がする、、、


つまり、、、殴り書きですよ！
手を動かしつつ、書くことに集中しすぎない！なぜなら殴り書きだから！
ということで、私と同じように「ノートはまとめるのに集中しちゃう、ぴえん:cry:」という方は
今すぐ殴り書きにシフトしましょう！


また、黒本ですが、買えるなら買っておいたほうが良いです！
本に出てくる単語の意味を知っているか否か、という点も試験合格には重要です！

調べながら勉強する分、付属した知識も増えてよきです、、、合格した後のケーキおいしい、、、
（筆者は勉強嫌いof嫌いのため、試験ごとにご褒美を用意する。今回はケーキ）

私的に、試験合格後に自分へのご褒美があるか否かも試験勉強の大きなモチベーションにつながります。


![ご褒美ケーキ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702316/5824c5b4-d0ff-2e11-d32b-f8f1495250ad.png)


「ご褒美がなくてもできるわい！」というお方、、、


ご褒美がなくてもできるなら、ご褒美があればもっと勉強できるのでは？？？？？？？:thinking:

やったことがない方はぜひ！やったことある方は同志！！


ご褒美あり勉強を行いましょう！！！！！！！！！！！！！！（なんの記事だこれ）



随分と話が脱線しましたが、
まとめると下記のようになります。



１、黒本を購入し、Windows10に置き換えながら勉強してみる（ノートに殴り書き）
２、黒本に出てくる単語の意味が分かるようになる
３、合格後に褒美を用意する

上記のことを行って、私は約1か月間で資格取得ができたので、
これからこの資格を取っていくぜ・・・！という方は少しでも参考にしてみてください。

ここまでご覧いただきありがとうございました。
EXPOフォトフレーム -人類の進歩とロゴとの調和-


# はじめにから、おわりにの一歩手前まで...


> 逃げない、はればれと立ち向かう、それがぼくのモットーだ

...どうも僕です。


最近の注目のニュースといえば大阪・関西万博ロゴマークの決定ですね。
そう!あの「いのちの輝きくん」です。

![logo_expo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218189/56746f51-b25d-332d-c977-6bfebf1b876c.png)
> 引用元： [公益社団法人2025年日本国際博覧会協会](https://www.expo2025.or.jp/)

皆さんはどんな印象でしたでしょうか？
twitterでも話題になったようですが賛否両論あるみたいですね。

そして、最近はこんなニュースも出ていました。

[つかみはOK、大阪万博ロゴ　賛否両論も……創作意欲かき立てる？](https://www.itmedia.co.jp/news/articles/2008/31/news036.html)

ロゴをモチーフにして、パンやサラダなどが創作されているようです。

そう**創作意欲かき立てる!**

...

...

そう**創作しよう!**

...

...

で久しぶりの休みを利用して創作してしまいました。

その名も**「EXPOフォトフレーム」**
![スクリーンショット 2020-09-02 21.20.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218189/b411d726-03c8-e5b3-8c8e-9bb8a307316f.png)

お気に入りの画像をフォームから選択またはドラッグすると...

![スクリーンショット 2020-09-02 21.24.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218189/bb76347a-79ee-b61c-da6a-ce23f5682f3d.png)

あのロゴと一体になれますw

皆様も是非、以下のリンクから大阪・関西万博ロゴマークと一体となってみてください！
* 画像サイズが大きいとエラーになっちゃうので注意

[EXPOフォトフレーム](https://expo-photo-frame.web.app/)

きっと大阪・関西万博がより身近なものとなるでしょう!

> 芸術は爆発だ！

おわり

# おわりに

著作権等の問題があるようであればひっそりとサイトを閉じようと思いますw