Lenovo X250でMacを動かす

Lenovo X250でMacを動かす

準備するもの

USBメモリ 16GB以上
USBメモリをフォーマット、ファイルコピーできるMAC
 私はMacを持っていないのでVMware Player で動くMacでフォーマットやファイル転送しました。

以下のファイルを探して解凍してインストールします。

  ・VMware-player-full-16.2.5-20904516.exe
  ・MK-unlocker.zip
  ・macOS Catalina Final by Geekrar.rar
  MK-unlocker.zipは VMware-playerをMac対応にするパッチ

・フォーマットしてかまわないX250

必要なファイル
1)Catalina のOSイメージ dmg または Big SurのOSイメージ dmg
2)OpenCore-0.8.6-RELEASE.zip
3)X250用のOpenCoreファイル

1)はググって探してダウンロードしておきます。

2)は以下のサイト、zipダウンロードしておきます。 https://github.com/acidanthera/OpenCorePkg/releases/

OpenCore-0.8.6-RELEASE.zip

ディレクトリは以下の構造になっています。

OpenCore-0.8.6-RELEASE.zip

Boot--+
           +-BOOTx64.efi
OC---+
          +-ACPI------+
           |           
          +-Bootstrap-+
           |             
          +-Drivers---+
           |           
          +-Kexts-----+
           |            
          +-Resources-+
           |           
          +-Tools-----+
           |           
          +-OpenCore.efi
           |            
          +-config.plist

EFIパーティションEFIフォルダの下にこの形で置くようです。

3)は以下のサイト、zipダウンロードしておきます。

https://github.com/dimka4996/Thinkpad-x250-Catalina-Big-sur-opencore/

Thinkpad-x250-Catalina-Big-sur-opencore.zip

このzipの中にALCPlugFix.zipがあります。
Audioに問題があって解凍して中のファイルを実行してパッチを当てるようです。

それ以外にも、Big Sur用のOpenCoreファイルをまとめている人がいるのですが、とりあえず上記のファイルで構築します。 https://github.com/zamprjkt/Lenovo-Thinkpad-X250-Hackintosh-Opencore

手順1)X250のBIOSの設定

Security -> Security Chip: Disabled
Memory Protection -> Execution Prevention: Enabled
Virtualization -> Intel Virtualization Technology: Enabled
Internal Device Access -> Bottom Cover Tamper Detection: must be Disabled
Anti-Theft -> Current Setting: Disabled
Anti-Theft -> Computrace -> Current Setting: Disabled
Secure Boot -> Secure Boot: Disabled
UEFI/Legacy Boot: UEFI Only
CSM Support: Yes

手順2)MacUSBメモリmacOSで使える形でフォーマットする

名前はなんでもいい、ここではMyVolumeにする

フォーマット、形式は以下の値にする

・MacOS拡張(ジャーナリング)
・GUIDパーティションマップ

するとUSBメモリには2つのパーティションができる。
1つはEFIというパーティション、これは自動でマウントしない隠しのパーティション

2)MacでOSイメージをUSBメモリへ転送する

Catalinaの場合

$ sudo /Applications/Install\ macOS\ Catalina.app/Contents/Resources/createinstallmedia --volume /Volumes/MyVolume

Big Surの場合

$ sudo /Applications/Install\ macOS\ Big\ Sur.app/Contents/Resources/createinstallmedia --volume /Volumes/MyVolume

MyVolumeはフォーマット時の設定したボリューム名
時間がかかる
完了したらUSBのボリュームがInstall macOS Catalina」「Install macOS Big Sur」という名前に変更されている

手順3)OpenCore.zipのファイル、X250用のファイルをUSBメモリEFIパーティションに転送する

    EFIパーティションは初期状態では何も入っていません。

作業はVMwareWorkstatinPlayerの仮想VM上のMac(Catalina)で作業です。

$ sudo disktutil list

/dev/disk3 (external, physical):
 #:   TYPE                  NAME                   SIZE      IDENTIFIER
 0:   FDisk_partition_schme                        *32.0 GB  disk3
 1:   EFI                   EFI                    209.7 MB  disk3s1
 2:   Apple_HFS             Install macOS Catalina  31.7 GB  disk3s2

EFIをmountする

$ sudo diskutil mount /dev/disk3s1

EFIフォルダがマウントできたらOK

停止する

$ sudo shutdown -h now

VM Ware Workstation Playerの対象仮想OSを選び 仮想マシン設定のオプション:共有フォルダを 「常に有効」にしてフォルダ指定する。

Macを起動する

Vmware-toolsをインストールする

環境設定でセキュリティ設定を変更しておく、インストールが有効になるように

設定した共有フォルダを開く

Catalina.dmgをクリックしてローカルHDにインストールする

USBメモリを指して以下を実行

sudo /Applications/Install\ macOS\ Catalina.app/Contents/Resources/createinstallmedia --volume /Volumes/USB

1時間ぐらいかかる

/dev/diskの番号が変わるので要注意

EFIをマウントする

$ sudo diskutil mount /dev/disk3s1

EFIの下は以下の構造にする

+-Boot-+
|      +-BOOTx64.efi
|
+-OC---+
       +-ACPI------+
       |           
       +-Bootstrap-+
       |           
       +-Drivers---+
       |           
       +-Kexts-----+
       |           
       +-Resources-+
       |           
       +-Tools-----+
       |           
       +-OpenCore.efi
       +-config.plist
$ cp -r $HOME/Opencore-0.8.6/X64/EFI /Volume/EFI/

/Volume/EFI/の下にEFIフォルダがある形になる。

/Volume/EFI
         |
         +-EFI
            |
            +-Boot-+
            |
        +-OC---+
               +-ACPI------+
               |           
               +-Bootstrap-+
               |           
               +-Drivers---+
               |           
               +-Kexts-----+
               |           
               +-Resources-+
               |           
               +-Tools-----+

X250用のOpenCoreファイルをOC(OpenCore)フォルダの下へコピーする

$ cp -r $HOME/Thinkpad-x250-Catalina-Big-sur-opencore/* /Volume/EFI/EFI/OC/

OpenCoreはロシア人が作ったため、デフォルトがロシア語になっている。

そのためインストーラがロシア語になっている。

OCフォルダにあるconfig.plistを修正する

修正する箇所は以下のところdataが言語+キーボードレイアウトのデータ

config.plist

  <key>prev-lang:kbd</key>
    <data>cnUtUlU6MjUy</data>

ロシア語にデフォルトになっている

% echo “ru-RU:252” | tr -d ‘\n’| base64
cnUtUnU6MjUy

英語、USキーボードの場合は

  <key>prev-lang:kbd</key>
    <data>ZW4tVVM6MA==</data>

日本語(US配列)の場合は、

% echo ja-JP:0 |tr -d ‘\n’|base64
amEtSlA6MA==
  <key>prev-lang:kbd</key>
    <data>amEtSlA6MA==</data>

まとめると以下のドキュメントを参考

[Docs/Sample.plist]

                    <key>csr-active-config</key>                                         
                    <data>AAAAAA==</data>                                                
                    <key>prev-lang:kbd</key>                                             
  +                 <!-- For Russian locale and ABC keyboard -->                         
                    <data>cnUtUlU6MjUy</data>                                            
  +                 <!-- For English locale and US keyboard -->                           
  +                 <!--                                                                 
  +                 <data>ZW4tVVM6MA==</data>                                            
  +                 -->                                                                  
  +                 <!-- For Japanese locale and US keyboard -->                          
  +                 <!--                                                                 
  +                 <data>amEtSIA6MA==</data>                                            
  +                 -->                                                                  
  +                 <!-- For Japanese locale and KANA keyboard -->                        
  +                 <!--                                                                 
  +                 <data>amEtSlA6MTYzODQ=</data>                                        
  +                 -->                                                                  
                    <key>run-efi-updater</key>                                           
                    <string>No</string>                                                  
                </dict>                                                                  

USBブートメニューで

3) Reset NVRAM

を選ぶ、どうやらconfig.plistの内容が本体に反映される。

次に

2)Install

を選ぶ。 後はMacインストーラの画面が出るので適当に。 なおディスクフォーマットはAPFSにしないとインストール対象にならないらしい。

インストール中何回かリブートするが、USBメモリはそのままで、F12(Select Boot device)を押す必要もなく見守るだけ。

課題)3.5のイヤフォン時ホワイトノイズが発生する。

対策)Macインストール後、ALCPlugFix.zipを解凍して、install.shを実行する

参考) OpenCoreインストールガイド https://dortania.github.io/OpenCore-Install-Guide/

OpenCore対応のUSBメモリインストーラを作る。 https://gaddet.com/opencoreusb/

GitHubへソースをアップロードする操作メモ

準備)

Windows版gitをダウンロードしてインストールしておく

https://git-for-windows.github.io/

1)GitHubで使っているアカウントを設定する

$ git  config  --global  user.name  hogehoge

2)メールアドレスを設定する

$ git  config  --global  user.email  hogehoge@yahoo.co.jp

3)WebのGitHubからSettings->Developer Settings->Personal access tokens->Tokens(classic)で新しいTokenを発行し設定する

コマンドの形式

$ git config --global url.https://ユーザーネーム:入手したトークン@github.com/.insteadOf https://github.com/

トークンがghp_abcabcabc123の場合は以下のようになる

$ git  config  --global url.https://hogehoge:ghp_abcabcabc123@github.com/.insteadOf  https://github.com/

4)このまま作業すると以下の警告が出るので設定する(改行のCRLFとLFの変換問題)

warning: in the working copy of '***.***', LF will be replaced by CRLF the next time Git touches it
$ git  config  --global  core.autoCRLF  false

5)ダウンロード、アップロードテストのフォルダを作る

$ mkdir temp

6)gitHub上に作っていたレポジトリをクローン(ローカルにコピーする)

$ git  clone  https://github.com/hogehoge/MyApp

7)クローンしたフォルダへ移動

$ cd MyApp

8)ソースファイルをいろいろ置いてみる

$ cp -r  xxxxx . 

.gitignoreがあることを確認する、もちろん中身も確認する(アップロード対象外にするファイル)

9)変更をaddする

$ git  add  --all  *

以下のような警告が出るがこれは無視する(以下のファイルは無視しますよーーという警告)

hint: "git config advice.addIgnoredFile false"

10)変更をcommitする

$ git  commit  -am  "first release"

11)アップロードする

$ git  push

これで完了

T460s/T470s のメモ

T460s 第6世代CPU、T470s 第7世代CPU

それ以外はほとんど変わらない

・液晶
 解像度 FHD(1,920×1,080) IPS、上の解像度(WQHD, 2560x1440)もあるらしい

・ディスク
2.5インチハードディスク搭載不可
M.2 SATA SSD か、NVMe SSD サイズ=2280

・重量
1.3kg

・メモリ
DDR4、PC4-17000
交換できないオンボードで4GBまたは8GB
プラス 空きスロット1枚
Corei5の場合オンボードのメモリが4GBになる模様
Corei7ならオンボードメモリが8GBのケースあり

・ACアダプタ
X250,X260などと同じ平型四角のACアダプタ
USB-Cでの充電も可能

PageViewer2の基本

環境 AndroidStudio =キリンさん 2022.03.1

動かすイメージ

スワイプすると画面が切り替わる

1)build.gradleのdependenciesに1行、追加する

    implementation 'androidx.viewpager2:viewpager2:1.0.0'

こんな感じ

dependencies {

    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'com.google.android.material:material:1.9.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    implementation 'androidx.viewpager2:viewpager2:1.0.0'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}

2)レイアウトソース

res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewpager2"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_width="0dp"
        android:layout_height="0dp"/>
</androidx.constraintlayout.widget.ConstraintLayout>

res/layout/item_page.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    android:id="@+id/container"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.appcompat.widget.AppCompatTextView
        android:id="@+id/text_view"
        tools:text="item"
        android:layout_centerInParent="true"
        android:textColor="@android:color/white"
        android:textSize="32dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

3)javaソース

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ViewPager2 viewPager2 = findViewById(R.id.viewpager2);
        ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter();
        viewPager2.setAdapter(viewPagerAdapter);
    }
}

ViewPagerAdapter.java

public class ViewPagerAdapter extends RecyclerView.Adapter<ViewPagerAdapter.ViewPagerViewHolder> {

    class ViewPagerViewHolder extends RecyclerView.ViewHolder {
        TextView mTextView;
        RelativeLayout mContainterLayout;
        public ViewPagerViewHolder (View itemView) {
            super(itemView);
            // 生成時にviewをセットする
            mContainterLayout = itemView.findViewById(R.id.container);
            mTextView = itemView.findViewById(R.id.text_view);
        }
    }

    @Override
    public int getItemCount() {
        // 何ページあるかを返す、実際にはListを用いてそのsizeを返した方がきれいになる。
        // return xxxList.size();
        return 4;
    }

    @Override
    public ViewPagerViewHolder onCreateViewHolder( ViewGroup parent, int viewType) {
        // layoutをセットする
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.item_page, parent, false);
        return new ViewPagerViewHolder(view);

    }


    @Override
    public  void onBindViewHolder( ViewPagerViewHolder holder, int position) {

        // ページ(position)毎に表示する内容を変更する

        holder.mTextView.setText("page:" + position);

        if (position == 0) {
            holder.mContainterLayout.setBackgroundResource(android.R.color.holo_green_light);
        }
        if (position == 1) {
            holder.mContainterLayout.setBackgroundResource(android.R.color.holo_blue_light);
        }
        if (position == 2) {
            holder.mContainterLayout.setBackgroundResource(android.R.color.black);
        }
        if (position == 3) {
            holder.mContainterLayout.setBackgroundResource(android.R.color.holo_orange_light);
        }
    }

}